@projectcor/maia-components 2.29.0 → 2.30.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/CHANGELOG.md +656 -0
- package/lib/App.js +55 -0
- package/lib/components/atoms/ActionableButton.js +60 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +89 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +21 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +9 -0
- package/lib/components/atoms/AgentActivityIndicator/index.js +2 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +209 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +93 -0
- package/lib/components/atoms/ApprovalBox/index.js +2 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.js +218 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +52 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +448 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +58 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +55 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +14 -0
- package/lib/components/atoms/AttachmentCard/index.js +4 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +442 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +119 -0
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +222 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +313 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
- package/lib/components/atoms/AttachmentPreviewModal/index.js +2 -0
- package/lib/components/atoms/Backdrop/Backdrop.js +17 -0
- package/lib/components/atoms/Backdrop/Backdrop.styles.js +9 -0
- package/lib/components/atoms/Backdrop/index.js +2 -0
- package/lib/components/atoms/CardItem.js +7 -0
- package/lib/components/atoms/CardMenu/CardMenu.js +131 -0
- package/lib/components/atoms/CardMenu/index.js +2 -0
- package/lib/components/atoms/CardMenu/styles.js +21 -0
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +77 -0
- package/lib/components/atoms/ChatClientSelector/index.js +2 -0
- package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +9 -0
- package/lib/components/atoms/ChatDisclaimerMessage/index.js +2 -0
- package/lib/components/atoms/ChatDisclaimerMessage/styles.js +6 -0
- package/lib/components/atoms/Checkbox/Checkbox.js +34 -0
- package/lib/components/atoms/Checkbox/index.js +2 -0
- package/lib/components/atoms/Checkbox/styles.js +39 -0
- package/lib/components/atoms/Chip/Chip.js +150 -0
- package/lib/components/atoms/Chip/index.js +2 -0
- package/lib/components/atoms/Chip/styles.js +43 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.js +45 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.style.js +21 -0
- package/lib/components/atoms/ChipLlm/index.js +2 -0
- package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +2 -0
- package/lib/components/atoms/ChipStatus/ChipStatus.js +14 -0
- package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +27 -0
- package/lib/components/atoms/ChipStatus/index.js +2 -0
- package/lib/components/atoms/ClearButton.js +6 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +146 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +15 -0
- package/lib/components/atoms/ClientSelector/index.js +2 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +188 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +445 -0
- package/lib/components/atoms/ContextMentionChip/index.js +4 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +533 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +10 -0
- package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +148 -0
- package/lib/components/atoms/ContextMentionItem/index.js +2 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +290 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +108 -0
- package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
- package/lib/components/atoms/CopyToClipboard.js +70 -0
- package/lib/components/atoms/EditableLabel/EditableLabel.js +110 -0
- package/lib/components/atoms/EditableLabel/index.js +2 -0
- package/lib/components/atoms/EditableLabel/styles.js +7 -0
- package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +22 -0
- package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +18 -0
- package/lib/components/atoms/EmptySearchClients/index.js +2 -0
- package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +19 -0
- package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +15 -0
- package/lib/components/atoms/EmptySearchProjects/index.js +2 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.js +247 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +38 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +67 -0
- package/lib/components/atoms/EntitySelector/index.js +2 -0
- package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +14 -0
- package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +15 -0
- package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +14 -0
- package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +15 -0
- package/lib/components/atoms/ErrorSearchFaqs/index.js +2 -0
- package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +18 -0
- package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +15 -0
- package/lib/components/atoms/ErrorSearchProjects/index.js +2 -0
- package/lib/components/atoms/Expand/Expand.js +32 -0
- package/lib/components/atoms/Expand/index.js +2 -0
- package/lib/components/atoms/Fade/Fade.js +56 -0
- package/lib/components/atoms/Fade/index.js +2 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.js +59 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +14 -0
- package/lib/components/atoms/FeedbackButton/index.js +2 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +138 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +44 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +43 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/index.js +2 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +122 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +43 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +62 -0
- package/lib/components/atoms/FrequentlyUsedActions/index.js +2 -0
- package/lib/components/atoms/GoBackButton.js +24 -0
- package/lib/components/atoms/HelpButton.js +44 -0
- package/lib/components/atoms/IconButton.js +56 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.js +96 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +70 -0
- package/lib/components/atoms/Input/CustomInput.interface.js +2 -0
- package/lib/components/atoms/Input/CustomInput.js +91 -0
- package/lib/components/atoms/Input/CustomInput.styles.js +39 -0
- package/lib/components/atoms/Input/index.js +2 -0
- package/lib/components/atoms/ListMenuOption/ListMenuOption.js +41 -0
- package/lib/components/atoms/ListMenuOption/index.js +2 -0
- package/lib/components/atoms/ListMenuOption/styles.js +9 -0
- package/lib/components/atoms/Loader.js +41 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +11 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +6 -0
- package/lib/components/atoms/LoadingFaqs/index.js +2 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +11 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +6 -0
- package/lib/components/atoms/LoadingSearchClients/index.js +2 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +14 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +10 -0
- package/lib/components/atoms/LoadingSearchProjects/index.js +2 -0
- package/lib/components/atoms/LoadingText/LoadingText.js +18 -0
- package/lib/components/atoms/LoadingText/index.js +2 -0
- package/lib/components/atoms/LoadingText/styles.js +7 -0
- package/lib/components/atoms/MAIAButton/MAIAButton.js +33 -0
- package/lib/components/atoms/MAIAButton/index.js +2 -0
- package/lib/components/atoms/MAIAError/MAIAError.js +15 -0
- package/lib/components/atoms/MAIAError/index.js +2 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +1233 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +266 -0
- package/lib/components/atoms/MAIAInput/index.js +2 -0
- package/lib/components/atoms/MAIAInput/maiaInputLayout.js +25 -0
- package/lib/components/atoms/MAIAInput/styles.js +186 -0
- package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +2 -0
- package/lib/components/atoms/MAIAMessage/MAIAMessage.js +22 -0
- package/lib/components/atoms/MAIAMessage/index.js +2 -0
- package/lib/components/atoms/MAIAMessage/styles.js +7 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +23 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +2 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +51 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +26 -0
- package/lib/components/atoms/MaiaStreamdown/index.js +2 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +18 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +84 -0
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +15 -0
- package/lib/components/atoms/MaiaWrapper/index.js +3 -0
- package/lib/components/atoms/MaiaWrapper/styles.js +21 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +2 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +84 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +53 -0
- package/lib/components/atoms/ModalClientAccess/index.js +2 -0
- package/lib/components/atoms/ModalInfo/ModalInfo.js +52 -0
- package/lib/components/atoms/ModalInfo/ModalInfoContent.js +7 -0
- package/lib/components/atoms/ModalInfo/index.js +3 -0
- package/lib/components/atoms/ModalInfo/styles.js +7 -0
- package/lib/components/atoms/ModalProject/ModalProject.interface.js +2 -0
- package/lib/components/atoms/ModalProject/ModalProject.js +112 -0
- package/lib/components/atoms/ModalProject/ModalProject.style.js +59 -0
- package/lib/components/atoms/ModalProject/index.js +2 -0
- package/lib/components/atoms/NextPageLoader.js +33 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +28 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +180 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +34 -0
- package/lib/components/atoms/OnboardingModalButton/index.js +3 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +131 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +59 -0
- package/lib/components/atoms/OptionAccessibility/index.js +2 -0
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
- package/lib/components/atoms/OptionCorPermission/index.js +2 -0
- package/lib/components/atoms/PrimaryButton.js +31 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.js +77 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +61 -0
- package/lib/components/atoms/ProjectSelector/index.js +2 -0
- package/lib/components/atoms/SecondaryButton.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
- package/lib/components/atoms/Skeleton/Skeleton.js +36 -0
- package/lib/components/atoms/Skeleton/index.js +2 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +208 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +77 -0
- package/lib/components/atoms/SkillsDropdown/index.js +2 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +16 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +24 -0
- package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +18 -0
- package/lib/components/atoms/SlashCommandChip/index.js +4 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +210 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +53 -0
- package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
- package/lib/components/atoms/Switch/Switch.js +27 -0
- package/lib/components/atoms/Switch/Switch.styles.js +22 -0
- package/lib/components/atoms/Switch/index.js +2 -0
- package/lib/components/atoms/TextArea/CustomTextArea.interface.js +2 -0
- package/lib/components/atoms/TextArea/CustomTextArea.js +93 -0
- package/lib/components/atoms/TextArea/CustomTextArea.styles.js +25 -0
- package/lib/components/atoms/TextArea/TextArea.interfaces.js +2 -0
- package/lib/components/atoms/TextArea/TextArea.js +172 -0
- package/lib/components/atoms/TextArea/TextArea.styles.js +16 -0
- package/lib/components/atoms/TextArea/index.js +2 -0
- package/lib/components/atoms/ThirdButton.js +19 -0
- package/lib/components/atoms/VideoModal/VideoModal.js +76 -0
- package/lib/components/atoms/VideoModal/index.js +2 -0
- package/lib/components/atoms/WithAppCfg.js +26 -0
- package/lib/components/atoms/WithFeatureValidation.js +23 -0
- package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +9 -0
- package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +6 -0
- package/lib/components/atoms/WrapperCenterIcon/index.js +2 -0
- package/lib/components/atoms/icons/AIIcon.js +23 -0
- package/lib/components/atoms/icons/AacFile.js +39 -0
- package/lib/components/atoms/icons/AccessibilityIcon.js +42 -0
- package/lib/components/atoms/icons/ActionAssignIcon.js +111 -0
- package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
- package/lib/components/atoms/icons/ActionChargeHoursIcon.js +111 -0
- package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
- package/lib/components/atoms/icons/ActionCreateIcon.js +91 -0
- package/lib/components/atoms/icons/ActionCreateReworkIcon.js +39 -0
- package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +37 -0
- package/lib/components/atoms/icons/ActionEditIcon.js +39 -0
- package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +88 -0
- package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +37 -0
- package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
- package/lib/components/atoms/icons/AgentMaiaIcon.js +31 -0
- package/lib/components/atoms/icons/Brain.js +77 -0
- package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
- package/lib/components/atoms/icons/CorLogo.js +76 -0
- package/lib/components/atoms/icons/CsvFile.js +41 -0
- package/lib/components/atoms/icons/DocFile.js +41 -0
- package/lib/components/atoms/icons/DocxFile.js +41 -0
- package/lib/components/atoms/icons/EmptyClientIllustration.js +67 -0
- package/lib/components/atoms/icons/EmptyHistory.js +46 -0
- package/lib/components/atoms/icons/EmptySearchIllustration.js +37 -0
- package/lib/components/atoms/icons/EmptyState.js +84 -0
- package/lib/components/atoms/icons/EmptyStateAgents.js +58 -0
- package/lib/components/atoms/icons/ErrorIcon.js +14 -0
- package/lib/components/atoms/icons/ErrorSearchIllustration.js +52 -0
- package/lib/components/atoms/icons/ErrorState.js +51 -0
- package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
- package/lib/components/atoms/icons/FaqsIcon.js +51 -0
- package/lib/components/atoms/icons/FlacIcon.js +39 -0
- package/lib/components/atoms/icons/FolderIcon.js +29 -0
- package/lib/components/atoms/icons/HomeIcon.js +30 -0
- package/lib/components/atoms/icons/ImageFile.js +46 -0
- package/lib/components/atoms/icons/M4aFile.js +39 -0
- package/lib/components/atoms/icons/MAIAIcon.js +20 -0
- package/lib/components/atoms/icons/MAIAIsologo.js +65 -0
- package/lib/components/atoms/icons/MDFile.js +41 -0
- package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +41 -0
- package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +41 -0
- package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
- package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +41 -0
- package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
- package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
- package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
- package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
- package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
- package/lib/components/atoms/icons/MaiaSettingsProject.js +111 -0
- package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +193 -0
- package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
- package/lib/components/atoms/icons/MaiaStoreIcon.js +31 -0
- package/lib/components/atoms/icons/Mp3File.js +39 -0
- package/lib/components/atoms/icons/Mp4File.js +39 -0
- package/lib/components/atoms/icons/MyAgentsNavIcon.js +51 -0
- package/lib/components/atoms/icons/NewChat.js +29 -0
- package/lib/components/atoms/icons/NotionIcon.js +36 -0
- package/lib/components/atoms/icons/OgaFile.js +39 -0
- package/lib/components/atoms/icons/OggFile.js +39 -0
- package/lib/components/atoms/icons/PdfFile.js +39 -0
- package/lib/components/atoms/icons/PlusIcon.js +29 -0
- package/lib/components/atoms/icons/PptFile.js +47 -0
- package/lib/components/atoms/icons/PptxFile.js +49 -0
- package/lib/components/atoms/icons/RetryIcon.js +34 -0
- package/lib/components/atoms/icons/SkillCreatedByIcon.js +20 -0
- package/lib/components/atoms/icons/SkillIcon.js +30 -0
- package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +23 -0
- package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +23 -0
- package/lib/components/atoms/icons/SkillsNavIcon.js +24 -0
- package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
- package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
- package/lib/components/atoms/icons/TelescopeIcon.js +60 -0
- package/lib/components/atoms/icons/TemplateGradientIcon.js +42 -0
- package/lib/components/atoms/icons/TextFile.js +41 -0
- package/lib/components/atoms/icons/WavFile.js +39 -0
- package/lib/components/atoms/icons/WebmFile.js +50 -0
- package/lib/components/atoms/icons/XlsFile.js +42 -0
- package/lib/components/atoms/icons/XlsxFile.js +42 -0
- package/lib/components/atoms/icons/index.js +54 -0
- package/lib/components/atoms/index.js +42 -0
- package/lib/components/index.js +11 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +2 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +236 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +53 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +415 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +152 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +374 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +106 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +92 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +57 -0
- package/lib/components/molecules/AbmSection/index.js +4 -0
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +52 -0
- package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +119 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +187 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +6 -0
- package/lib/components/molecules/ChatAIContent/index.js +2 -0
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +241 -0
- package/lib/components/molecules/ChatAIHistory/index.js +2 -0
- package/lib/components/molecules/ChatAIHistory/styles.js +22 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +649 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +115 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +95 -0
- package/lib/components/molecules/ChatAIHome/index.js +2 -0
- package/lib/components/molecules/ChatAIHome/styles.js +335 -0
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +137 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +853 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +47 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +37 -0
- package/lib/components/molecules/ChatAIMessages/README.md +101 -0
- package/lib/components/molecules/ChatAIMessages/index.js +2 -0
- package/lib/components/molecules/ChatAIMessages/newStyles.js +131 -0
- package/lib/components/molecules/ChatAIMessages/styles.js +94 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +1254 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +58 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +127 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +34 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +189 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +453 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +108 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +48 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +38 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/constants.js +40 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
- package/lib/components/molecules/ChatAIModal/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/layout.js +74 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +457 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +218 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +430 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +169 -0
- package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +48 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +49 -0
- package/lib/components/molecules/ChatAIProjectSelector/index.js +2 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +337 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +201 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +51 -0
- package/lib/components/molecules/ChatFooter/index.js +2 -0
- package/lib/components/molecules/ChatFooter/styles.js +23 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +60 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
- package/lib/components/molecules/ContextMentionInput/index.js +2 -0
- package/lib/components/molecules/MessageFeedback/MessageFeedback.js +118 -0
- package/lib/components/molecules/MessageFeedback/index.js +2 -0
- package/lib/components/molecules/MessageFeedback/styles.js +14 -0
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +127 -0
- package/lib/components/molecules/ProjectSummaryChat/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryChat/styles.js +8 -0
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +152 -0
- package/lib/components/molecules/ProjectSummaryConfig/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryConfig/styles.js +86 -0
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +49 -0
- package/lib/components/molecules/ProjectSummaryContent/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +19 -0
- package/lib/components/molecules/ProjectSummaryModal/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryModal/styles.js +2 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +716 -0
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +157 -0
- package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +48 -0
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +75 -0
- package/lib/components/molecules/Sidebar/index.js +2 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +1449 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +93 -0
- package/lib/components/organisms/AbmAgentModal/index.js +2 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +182 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
- package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +585 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +154 -0
- package/lib/components/organisms/AbmSkillModal/index.js +2 -0
- package/lib/components/organisms/ChatAI/ChatAI.js +167 -0
- package/lib/components/organisms/ChatAI/index.js +2 -0
- package/lib/components/organisms/ChatAI/styles.js +7 -0
- package/lib/components/organisms/ClientAIButton/ClientAIButton.js +23 -0
- package/lib/components/organisms/ClientAIButton/index.js +2 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +86 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +39 -0
- package/lib/components/organisms/DeleteAgentModal/index.js +2 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +122 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +47 -0
- package/lib/components/organisms/DeleteQuestionModal/index.js +2 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +138 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +69 -0
- package/lib/components/organisms/EditQuestionModal/index.js +2 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +113 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +54 -0
- package/lib/components/organisms/ModalFileExceeds/index.js +2 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +26 -0
- package/lib/components/organisms/ProjectAIButton/index.js +2 -0
- package/lib/components/organisms/ProjectSummary/ProjectSummary.js +60 -0
- package/lib/components/organisms/ProjectSummary/index.js +2 -0
- package/lib/components/organisms/ProjectSummary/styles.js +7 -0
- package/lib/components/organisms/SnackBar/Snackbar.interface.js +2 -0
- package/lib/components/organisms/SnackBar/Snackbar.js +73 -0
- package/lib/components/organisms/SnackBar/Snackbar.styles.js +9 -0
- package/lib/components/organisms/SnackBar/index.js +2 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.js +18 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +14 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +66 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +27 -0
- package/lib/components/organisms/SourcesInformation/index.js +2 -0
- package/lib/constants/config.js +10 -0
- package/lib/constants/formatExtensions.js +55 -0
- package/lib/constants/gqlClient.js +4 -0
- package/lib/constants/maiaHourAgentAccess.js +15 -0
- package/lib/constants/maiaTaskPanelAccess.js +24 -0
- package/lib/constants/maiaTaskPanelOutsideClick.js +9 -0
- package/lib/constants/maiaTaskPanelZIndex.js +19 -0
- package/lib/constants/permissions/config.js +72 -0
- package/lib/constants/permissions/index.js +3 -0
- package/lib/constants/permissions/types.js +2 -0
- package/lib/constants/permissions/utils.js +18 -0
- package/lib/constants/plannerSyncEvents.js +15 -0
- package/lib/constants/taskLinkIcon.js +15 -0
- package/lib/constants/taskUrls.js +11 -0
- package/lib/context/cor-user.js +31 -0
- package/lib/context/global-context.js +39 -0
- package/lib/dev/DevChatAI.js +101 -0
- package/lib/dev/DevContextMentionInput.js +67 -0
- package/lib/dev/ProjectSummary.js +9 -0
- package/lib/dev/Providers.js +27 -0
- package/lib/exports.js +2 -0
- package/lib/hooks/README.md +192 -0
- package/lib/hooks/index.js +30 -0
- package/lib/hooks/useAccessClient/index.js +2 -0
- package/lib/hooks/useAccessClient/useAccessClient.js +81 -0
- package/lib/hooks/useAgentModel/index.js +2 -0
- package/lib/hooks/useAgentModel/useAgentModel.js +62 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +175 -0
- package/lib/hooks/useAgentModel/useDeleteAgent.js +88 -0
- package/lib/hooks/useAgentModel/useUpdateAgent.js +176 -0
- package/lib/hooks/useAgentSuggestions.js +60 -0
- package/lib/hooks/useCaretPosition.js +65 -0
- package/lib/hooks/useChatManager/index.js +2 -0
- package/lib/hooks/useChatManager/useChatManager.interface.js +2 -0
- package/lib/hooks/useChatManager/useChatManager.js +1782 -0
- package/lib/hooks/useChatMessages/index.js +2 -0
- package/lib/hooks/useChatMessages/useChatMessages.interface.js +2 -0
- package/lib/hooks/useChatMessages/useChatMessages.js +722 -0
- package/lib/hooks/useChats/index.js +2 -0
- package/lib/hooks/useChats/useChats.interfaces.js +2 -0
- package/lib/hooks/useChats/useChats.js +187 -0
- package/lib/hooks/useClientSearch.js +163 -0
- package/lib/hooks/useContextMentions.js +500 -0
- package/lib/hooks/useContextPinPopover.js +228 -0
- package/lib/hooks/useDebounce.js +18 -0
- package/lib/hooks/useEntitySearch.js +1053 -0
- package/lib/hooks/useEvent.js +94 -0
- package/lib/hooks/useFrequentlyAskedQuestions.js +150 -0
- package/lib/hooks/useFrequentlyUsedActions.js +94 -0
- package/lib/hooks/useKnowledge/deleteKnowledge.js +69 -0
- package/lib/hooks/useKnowledge/downloadKnowledge.js +81 -0
- package/lib/hooks/useKnowledge/index.js +4 -0
- package/lib/hooks/useKnowledge/saveKnowledge.js +107 -0
- package/lib/hooks/useKnowledge/useKnowledgeOperations.js +156 -0
- package/lib/hooks/useMaiaTaskPanelZIndex.js +17 -0
- package/lib/hooks/useMentionAllowedTypes.js +120 -0
- package/lib/hooks/useMentionPopover.js +342 -0
- package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
- package/lib/hooks/useModal/index.js +2 -0
- package/lib/hooks/useModal/useModal.interfaces.js +2 -0
- package/lib/hooks/useModal/useModal.js +47 -0
- package/lib/hooks/useOnboardingNavigation.js +20 -0
- package/lib/hooks/useOrchestratorStream/index.js +2 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +2 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +269 -0
- package/lib/hooks/useProjectSearch.js +183 -0
- package/lib/hooks/useProjectSummary.js +101 -0
- package/lib/hooks/useProjectSummaryConfig.js +211 -0
- package/lib/hooks/useProjects.js +46 -0
- package/lib/hooks/useRecentClientsSearch.js +150 -0
- package/lib/hooks/useRecentContexts.js +86 -0
- package/lib/hooks/useResize.js +29 -0
- package/lib/hooks/useSkillsCatalog.js +66 -0
- package/lib/hooks/useSlashCommands.js +84 -0
- package/lib/hooks/useSmoothStreamText/index.js +2 -0
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +197 -0
- package/lib/hooks/useSnackBarManager/useSnackBarManager.js +41 -0
- package/lib/hooks/useStreamResponse.js +112 -0
- package/lib/hooks/useStreamdownStyles.js +13 -0
- package/lib/hooks/useStreamingMessage/index.js +2 -0
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +18 -0
- package/lib/hooks/useT.js +17 -0
- package/lib/hooks/useTabTaskDefault.js +33 -0
- package/lib/hooks/useTaskPanel.js +22 -0
- package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
- package/lib/hooks/useToggle.js +19 -0
- package/lib/hooks/useToggleFavorite/index.js +2 -0
- package/lib/hooks/useToggleFavorite/useToggleFavorite.js +83 -0
- package/lib/index.css +76 -0
- package/lib/index.js +30 -0
- package/lib/lang/br/index.js +793 -0
- package/lib/lang/en/index.js +793 -0
- package/lib/lang/es/index.js +794 -0
- package/lib/lang/fr/index.js +614 -0
- package/lib/lang/index.js +24 -0
- package/lib/lang/utils.js +33 -0
- package/lib/mocks/mockChats.js +395 -0
- package/lib/mocks/mockOrchestrator.js +5 -0
- package/lib/mocks/mockProject.js +11 -0
- package/lib/mocks/mockProjectSummary.js +6 -0
- package/lib/mocks/mockedUser.js +169 -0
- package/lib/services/apolloClient.js +3 -0
- package/lib/services/appcues.js +19 -0
- package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +31 -0
- package/lib/services/corpilot/ProjectSummary/index.js +5 -0
- package/lib/services/corpilot/client.js +27 -0
- package/lib/services/corpilot/index.js +5 -0
- package/lib/services/maia/Access/updateAccess.js +59 -0
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +46 -0
- package/lib/services/maia/Actions/getSlashCommands.js +39 -0
- package/lib/services/maia/Actions/index.js +7 -0
- package/lib/services/maia/Agents/connectors.js +250 -0
- package/lib/services/maia/Agents/createAgent.js +39 -0
- package/lib/services/maia/Agents/deleteAgent.js +38 -0
- package/lib/services/maia/Agents/fetchAgentDetail.js +122 -0
- package/lib/services/maia/Agents/getAgentById.js +162 -0
- package/lib/services/maia/Agents/getAgentModels.js +112 -0
- package/lib/services/maia/Agents/getAgentSuggestions.js +44 -0
- package/lib/services/maia/Agents/getAgents.js +718 -0
- package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
- package/lib/services/maia/Agents/toggleFavorite.js +34 -0
- package/lib/services/maia/Agents/updateAgent.js +39 -0
- package/lib/services/maia/Chats/deleteChat.js +32 -0
- package/lib/services/maia/Chats/getChatMessages.js +144 -0
- package/lib/services/maia/Chats/getChatsByUserId.js +82 -0
- package/lib/services/maia/Chats/index.js +15 -0
- package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
- package/lib/services/maia/Chats/patchChat.js +43 -0
- package/lib/services/maia/Chats/wasHelpfulChat.js +31 -0
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +55 -0
- package/lib/services/maia/Faqs/index.js +5 -0
- package/lib/services/maia/Knowledge/delete.js +41 -0
- package/lib/services/maia/Knowledge/download.js +48 -0
- package/lib/services/maia/Knowledge/index.js +3 -0
- package/lib/services/maia/Knowledge/save.js +43 -0
- package/lib/services/maia/Orchestrator/index.js +7 -0
- package/lib/services/maia/Orchestrator/orchestrator.js +246 -0
- package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
- package/lib/services/maia/RecentClients/index.js +6 -0
- package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
- package/lib/services/maia/RecentContexts/index.js +6 -0
- package/lib/services/maia/RecentProjects/getRecentProjects.js +55 -0
- package/lib/services/maia/RecentProjects/index.js +6 -0
- package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
- package/lib/services/maia/RecentTasks/index.js +6 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
- package/lib/services/maia/RecentUsers/index.js +6 -0
- package/lib/services/maia/Skills/createSkill.js +39 -0
- package/lib/services/maia/Skills/deleteSkill.js +38 -0
- package/lib/services/maia/Skills/generateSkill.js +41 -0
- package/lib/services/maia/Skills/getSkills.js +120 -0
- package/lib/services/maia/Skills/updateSkill.js +39 -0
- package/lib/services/maia/client.js +27 -0
- package/lib/services/maia/index.js +17 -0
- package/lib/services/query/ClientSearchQuery.js +5 -0
- package/lib/services/query/entitySearchQuery.js +18 -0
- package/lib/services/query/index.js +2 -0
- package/lib/services/query/projectSearchByValueQuery.js +5 -0
- package/lib/services/query/taskUserTabQuery.js +8 -0
- package/lib/services/query/usersDirectoryQuery.js +19 -0
- package/lib/services/types.js +6 -0
- package/lib/services/utils/fetchCOR.js +117 -0
- package/lib/services/utils/getCookie.js +10 -0
- package/lib/services/utils/index.js +3 -0
- package/lib/services/utils/mapChatMessages.js +287 -0
- package/lib/services/utils/validateIsMaia.js +4 -0
- package/lib/store/chatsSidebarOptimistic.js +92 -0
- package/lib/store/chatsStore.types.js +2 -0
- package/lib/store/chatsStoreLifecycle.js +8 -0
- package/lib/store/faqsStore.types.js +2 -0
- package/lib/store/index.js +4 -0
- package/lib/store/maiaLastChatPersistence.js +35 -0
- package/lib/store/sessions/activeView.js +22 -0
- package/lib/store/sessions/index.js +9 -0
- package/lib/store/sessions/sessionHitlContext.js +15 -0
- package/lib/store/sessions/sessionNotificationSound.js +57 -0
- package/lib/store/sessions/sessionNotifications.js +110 -0
- package/lib/store/sessions/sessionNotifications.types.js +2 -0
- package/lib/store/sessions/sessionStreamManager.js +715 -0
- package/lib/store/sessions/sessionStreamingText.js +80 -0
- package/lib/store/sessions/sessions.types.js +35 -0
- package/lib/store/sessions/useSessionMeta.js +39 -0
- package/lib/store/sessions/useSessionStreamingText.js +18 -0
- package/lib/store/sessions/useSessionsStore.js +197 -0
- package/lib/store/useChatsStore.js +387 -0
- package/lib/store/useFaqsStore.js +27 -0
- package/lib/streamdownStyles.js +9 -0
- package/lib/styles/StyledCleanContainer.js +7 -0
- package/lib/styles/cascade.js +14 -0
- package/lib/styles/config.js +47 -0
- package/lib/styles/shared/scrollable.js +3 -0
- package/lib/styles/transitions.js +21 -0
- package/lib/types/Action.js +2 -0
- package/lib/types/AgentSuggestion.js +2 -0
- package/lib/types/Chat.js +10 -0
- package/lib/types/Client.js +2 -0
- package/lib/types/FrequentlyAskedQuestion.js +2 -0
- package/lib/types/Project.js +2 -0
- package/lib/types/ProjectSummaryConfigKeys.js +9 -0
- package/lib/types/Task.js +2 -0
- package/lib/types/agent.js +2 -0
- package/lib/types/agentModal.js +2 -0
- package/lib/types/contextMention.js +37 -0
- package/lib/types/global.d.js +2 -0
- package/lib/types/skill.js +2 -0
- package/lib/types/streamActivity.js +2 -0
- package/lib/types/userType.d.js +2 -0
- package/lib/utils/actionCategoryMap.js +37 -0
- package/lib/utils/actionIconMap.js +61 -0
- package/lib/utils/agentDisplayName.js +42 -0
- package/lib/utils/chatInputFiles.js +52 -0
- package/lib/utils/contextMentionIcons.js +134 -0
- package/lib/utils/contextMentionLabel.js +4 -0
- package/lib/utils/contextMentionTriggers.js +51 -0
- package/lib/utils/contextMentionTypeLabel.js +17 -0
- package/lib/utils/corConnectorMentionTypes.js +41 -0
- package/lib/utils/ensureStreamdownStyles.js +21 -0
- package/lib/utils/entityLinkRender.js +135 -0
- package/lib/utils/fileDownloadHelper.js +40 -0
- package/lib/utils/formatQuickActionMessage.js +16 -0
- package/lib/utils/formatUnreadCount.js +6 -0
- package/lib/utils/getUnitFileSize.js +13 -0
- package/lib/utils/hitlAnalytics.js +65 -0
- package/lib/utils/hoursPlannerQuickActionType.js +64 -0
- package/lib/utils/imagePreprocessor.js +108 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/maiaHostOpen.js +19 -0
- package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
- package/lib/utils/mapBackendLang.js +8 -0
- package/lib/utils/normalizeAgentConnectors.js +95 -0
- package/lib/utils/openTaskInCorPanel.js +22 -0
- package/lib/utils/orchestratorSubagents.js +11 -0
- package/lib/utils/renderContextMentions.js +420 -0
- package/lib/utils/retryCompletion.js +85 -0
- package/lib/utils/slashCommandMarker.js +30 -0
- package/lib/utils/sortManagerHoursHomeFuas.js +14 -0
- package/lib/utils/sseStreamContent.js +17 -0
- package/lib/utils/streamActivityMessages.js +359 -0
- package/lib/utils/validateTrimmedFields.js +8 -0
- package/package.json +1 -1
- package/README.md +0 -2
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
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 _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
7
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
10
|
+
/* eslint-disable no-console */
|
|
11
|
+
/* eslint-disable no-continue */
|
|
12
|
+
/* eslint-disable no-await-in-loop */
|
|
13
|
+
/* eslint-disable no-restricted-syntax */
|
|
14
|
+
/* eslint-disable no-constant-condition */
|
|
15
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
16
|
+
import maia from '../../services/maia';
|
|
17
|
+
import { getInitialStreamActivity, getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
|
|
18
|
+
import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
|
|
19
|
+
import { sessionStreamingText } from './sessionStreamingText';
|
|
20
|
+
import { useSessionsStore } from './useSessionsStore';
|
|
21
|
+
import { ensureSessionNotificationsInitialized } from './sessionNotifications';
|
|
22
|
+
import { sessionHitlContext } from './sessionHitlContext';
|
|
23
|
+
|
|
24
|
+
/** Compatible con el `t` de i18next (uso de una sola key). */
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Máximo de sesiones generando en paralelo. Protege red/recursos del cliente.
|
|
28
|
+
* Ajustable a futuro vía flag del host.
|
|
29
|
+
*/
|
|
30
|
+
export var MAX_CONCURRENT_STREAMS = 4;
|
|
31
|
+
var STREAM_THROTTLE_MS = 16;
|
|
32
|
+
var activeStreams = new Map();
|
|
33
|
+
var store = function store() {
|
|
34
|
+
return useSessionsStore.getState();
|
|
35
|
+
};
|
|
36
|
+
var isStreamActive = function isStreamActive(sessionId) {
|
|
37
|
+
return activeStreams.has(sessionId);
|
|
38
|
+
};
|
|
39
|
+
var getActiveStreamCount = function getActiveStreamCount() {
|
|
40
|
+
return activeStreams.size;
|
|
41
|
+
};
|
|
42
|
+
var parseSessionSSE = /*#__PURE__*/function () {
|
|
43
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, active, params) {
|
|
44
|
+
var _params$hitlExecution, _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
|
|
45
|
+
var sessionId, placeholderId, callbacks, t, hitlExecutionContext, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, ensureWritingStarted, applyStreamChunk, applyStreamComplete, _yield$reader$read, done, value, lines, _iterator, _step, line, _line$split, _line$split2, eventLine, dataLine, eventType, dataStr, data, chunk, _chunk, _callbacks$onApproval, isManualApproval, _t, _t2, _t3;
|
|
46
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
47
|
+
while (1) switch (_context.prev = _context.next) {
|
|
48
|
+
case 0:
|
|
49
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, callbacks = params.callbacks, t = params.t;
|
|
50
|
+
hitlExecutionContext = (_params$hitlExecution = params.hitlExecutionContext) !== null && _params$hitlExecution !== void 0 ? _params$hitlExecution : sessionHitlContext.get(sessionId);
|
|
51
|
+
pendingContent = null;
|
|
52
|
+
throttleTimer = null;
|
|
53
|
+
flushToStores = function flushToStores(content) {
|
|
54
|
+
var _callbacks$onStreamUp;
|
|
55
|
+
sessionStreamingText.setText(sessionId, placeholderId, content);
|
|
56
|
+
(_callbacks$onStreamUp = callbacks.onStreamUpdate) === null || _callbacks$onStreamUp === void 0 || _callbacks$onStreamUp.call(callbacks, content);
|
|
57
|
+
};
|
|
58
|
+
emitThrottled = function emitThrottled(content) {
|
|
59
|
+
pendingContent = content;
|
|
60
|
+
if (throttleTimer != null) return;
|
|
61
|
+
throttleTimer = window.setTimeout(function () {
|
|
62
|
+
throttleTimer = null;
|
|
63
|
+
if (pendingContent != null) {
|
|
64
|
+
var toEmit = pendingContent;
|
|
65
|
+
pendingContent = null;
|
|
66
|
+
flushToStores(toEmit);
|
|
67
|
+
}
|
|
68
|
+
}, STREAM_THROTTLE_MS);
|
|
69
|
+
};
|
|
70
|
+
flushPending = function flushPending() {
|
|
71
|
+
if (throttleTimer != null) {
|
|
72
|
+
window.clearTimeout(throttleTimer);
|
|
73
|
+
throttleTimer = null;
|
|
74
|
+
}
|
|
75
|
+
if (pendingContent != null) {
|
|
76
|
+
var toEmit = pendingContent;
|
|
77
|
+
pendingContent = null;
|
|
78
|
+
flushToStores(toEmit);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
|
|
82
|
+
if (reader) {
|
|
83
|
+
_context.next = 1;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
throw new Error('No reader available');
|
|
87
|
+
case 1:
|
|
88
|
+
decoder = new TextDecoder();
|
|
89
|
+
buffer = '';
|
|
90
|
+
accumulatedContent = '';
|
|
91
|
+
hasStartedWriting = false;
|
|
92
|
+
ensureWritingStarted = function ensureWritingStarted() {
|
|
93
|
+
var _callbacks$onStartWri;
|
|
94
|
+
if (hasStartedWriting) return;
|
|
95
|
+
hasStartedWriting = true;
|
|
96
|
+
store().patchMeta(sessionId, {
|
|
97
|
+
isLoading: true,
|
|
98
|
+
isWriting: true
|
|
99
|
+
});
|
|
100
|
+
store().setStatus(sessionId, 'writing');
|
|
101
|
+
store().setActivity(sessionId, getWritingStreamActivity(t));
|
|
102
|
+
(_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
|
|
103
|
+
};
|
|
104
|
+
applyStreamChunk = function applyStreamChunk(chunk) {
|
|
105
|
+
if (!chunk) return;
|
|
106
|
+
accumulatedContent = mergeStreamChunk(accumulatedContent, chunk);
|
|
107
|
+
emitThrottled(accumulatedContent);
|
|
108
|
+
};
|
|
109
|
+
applyStreamComplete = function applyStreamComplete(payload) {
|
|
110
|
+
var _payload$agent_id, _subagentRaw$resolved, _callbacks$onFinishSt;
|
|
111
|
+
var finalContent = payload.content || accumulatedContent;
|
|
112
|
+
var sources = payload.sources || null;
|
|
113
|
+
var memorySessionId = payload.memory_session_id || '';
|
|
114
|
+
var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
|
|
115
|
+
var suggestions = null;
|
|
116
|
+
if (Array.isArray(payload.suggest_reply)) {
|
|
117
|
+
suggestions = payload.suggest_reply;
|
|
118
|
+
} else if (Array.isArray(payload.suggestions)) {
|
|
119
|
+
suggestions = payload.suggestions;
|
|
120
|
+
}
|
|
121
|
+
var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
|
|
122
|
+
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
123
|
+
var subagentRaw = payload.subagent;
|
|
124
|
+
var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
|
|
125
|
+
flushPending();
|
|
126
|
+
sessionStreamingText.clear(sessionId);
|
|
127
|
+
store().patchMeta(sessionId, {
|
|
128
|
+
isLoading: false,
|
|
129
|
+
isWriting: false
|
|
130
|
+
});
|
|
131
|
+
store().setActivity(sessionId, null);
|
|
132
|
+
store().setStatus(sessionId, 'complete');
|
|
133
|
+
var finishPayload = {
|
|
134
|
+
content: finalContent,
|
|
135
|
+
sources: sources,
|
|
136
|
+
memorySessionId: memorySessionId,
|
|
137
|
+
attachments: attachments,
|
|
138
|
+
suggestions: suggestions,
|
|
139
|
+
completedAgentId: completedAgentId,
|
|
140
|
+
resolvedContext: resolvedContext
|
|
141
|
+
};
|
|
142
|
+
(_callbacks$onFinishSt = callbacks.onFinishStream) === null || _callbacks$onFinishSt === void 0 || _callbacks$onFinishSt.call(callbacks, finishPayload);
|
|
143
|
+
};
|
|
144
|
+
_context.prev = 2;
|
|
145
|
+
case 3:
|
|
146
|
+
if (!true) {
|
|
147
|
+
_context.next = 28;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
if (!active.isStopped) {
|
|
151
|
+
_context.next = 4;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
reader.cancel();
|
|
155
|
+
return _context.abrupt("continue", 28);
|
|
156
|
+
case 4:
|
|
157
|
+
_context.next = 5;
|
|
158
|
+
return reader.read();
|
|
159
|
+
case 5:
|
|
160
|
+
_yield$reader$read = _context.sent;
|
|
161
|
+
done = _yield$reader$read.done;
|
|
162
|
+
value = _yield$reader$read.value;
|
|
163
|
+
if (!done) {
|
|
164
|
+
_context.next = 6;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
return _context.abrupt("continue", 28);
|
|
168
|
+
case 6:
|
|
169
|
+
if (!active.isStopped) {
|
|
170
|
+
_context.next = 7;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
reader.cancel();
|
|
174
|
+
return _context.abrupt("continue", 28);
|
|
175
|
+
case 7:
|
|
176
|
+
buffer += decoder.decode(value, {
|
|
177
|
+
stream: true
|
|
178
|
+
});
|
|
179
|
+
lines = buffer.split('\n\n');
|
|
180
|
+
buffer = lines.pop() || '';
|
|
181
|
+
_iterator = _createForOfIteratorHelper(lines);
|
|
182
|
+
_context.prev = 8;
|
|
183
|
+
_iterator.s();
|
|
184
|
+
case 9:
|
|
185
|
+
if ((_step = _iterator.n()).done) {
|
|
186
|
+
_context.next = 24;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
line = _step.value;
|
|
190
|
+
if (!(line.trim() === '')) {
|
|
191
|
+
_context.next = 10;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
return _context.abrupt("continue", 23);
|
|
195
|
+
case 10:
|
|
196
|
+
_line$split = line.split('\n'), _line$split2 = _slicedToArray(_line$split, 2), eventLine = _line$split2[0], dataLine = _line$split2[1];
|
|
197
|
+
if (!(!eventLine || !dataLine)) {
|
|
198
|
+
_context.next = 11;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
return _context.abrupt("continue", 23);
|
|
202
|
+
case 11:
|
|
203
|
+
eventType = eventLine.replace('event: ', '').trim();
|
|
204
|
+
dataStr = dataLine.replace('data: ', '').trim();
|
|
205
|
+
_context.prev = 12;
|
|
206
|
+
data = JSON.parse(dataStr);
|
|
207
|
+
_t = eventType;
|
|
208
|
+
_context.next = _t === 'thinking' ? 13 : _t === 'token' ? 14 : _t === 'content' ? 15 : _t === 'node' ? 16 : _t === 'complete' ? 17 : _t === 'approval_required' ? 18 : _t === 'error' ? 19 : 20;
|
|
209
|
+
break;
|
|
210
|
+
case 13:
|
|
211
|
+
if (!hasStartedWriting) {
|
|
212
|
+
store().patchMeta(sessionId, {
|
|
213
|
+
isLoading: true
|
|
214
|
+
});
|
|
215
|
+
store().setStatus(sessionId, 'thinking');
|
|
216
|
+
store().setActivity(sessionId, {
|
|
217
|
+
phase: 'thinking',
|
|
218
|
+
message: getThinkingLoadingMessage(0, t)
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return _context.abrupt("continue", 21);
|
|
222
|
+
case 14:
|
|
223
|
+
chunk = typeof data.content === 'string' ? data.content : '';
|
|
224
|
+
ensureWritingStarted();
|
|
225
|
+
applyStreamChunk(chunk);
|
|
226
|
+
return _context.abrupt("continue", 21);
|
|
227
|
+
case 15:
|
|
228
|
+
_chunk = typeof data.content === 'string' ? data.content : '';
|
|
229
|
+
ensureWritingStarted();
|
|
230
|
+
applyStreamChunk(_chunk);
|
|
231
|
+
if (isCompleteLikeSsePayload(data)) {
|
|
232
|
+
applyStreamComplete(data);
|
|
233
|
+
}
|
|
234
|
+
return _context.abrupt("continue", 21);
|
|
235
|
+
case 16:
|
|
236
|
+
if (data.node === 'agent_transfer') {
|
|
237
|
+
store().patchMeta(sessionId, {
|
|
238
|
+
isLoading: true
|
|
239
|
+
});
|
|
240
|
+
store().setStatus(sessionId, 'thinking');
|
|
241
|
+
} else if (data.message && typeof data.message === 'string') {
|
|
242
|
+
store().patchMeta(sessionId, {
|
|
243
|
+
isLoading: true
|
|
244
|
+
});
|
|
245
|
+
store().setStatus(sessionId, 'thinking');
|
|
246
|
+
store().setActivity(sessionId, resolveHitlNodeStreamActivity(data.message, t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined, typeof data.thread_id === 'string' ? data.thread_id : undefined));
|
|
247
|
+
}
|
|
248
|
+
return _context.abrupt("continue", 21);
|
|
249
|
+
case 17:
|
|
250
|
+
applyStreamComplete(data);
|
|
251
|
+
return _context.abrupt("continue", 21);
|
|
252
|
+
case 18:
|
|
253
|
+
flushPending();
|
|
254
|
+
isManualApproval = data.manual_approval_detected === true;
|
|
255
|
+
store().patchMeta(sessionId, {
|
|
256
|
+
isWriting: false
|
|
257
|
+
});
|
|
258
|
+
if (!isManualApproval) {
|
|
259
|
+
store().patchMeta(sessionId, {
|
|
260
|
+
isLoading: false
|
|
261
|
+
});
|
|
262
|
+
sessionStreamingText.clear(sessionId);
|
|
263
|
+
store().setActivity(sessionId, null);
|
|
264
|
+
}
|
|
265
|
+
store().setStatus(sessionId, 'awaiting_approval');
|
|
266
|
+
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, data, accumulatedContent);
|
|
267
|
+
if (isManualApproval && Array.isArray(data.pending_actions) && data.pending_actions.length > 0) {
|
|
268
|
+
store().patchMeta(sessionId, {
|
|
269
|
+
isLoading: true
|
|
270
|
+
});
|
|
271
|
+
store().setStatus(sessionId, 'thinking');
|
|
272
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined));
|
|
273
|
+
}
|
|
274
|
+
return _context.abrupt("continue", 21);
|
|
275
|
+
case 19:
|
|
276
|
+
console.error('SSE Error:', data.error);
|
|
277
|
+
flushPending();
|
|
278
|
+
sessionStreamingText.clear(sessionId);
|
|
279
|
+
store().patchMeta(sessionId, {
|
|
280
|
+
isLoading: false,
|
|
281
|
+
isWriting: false
|
|
282
|
+
});
|
|
283
|
+
store().setActivity(sessionId, null);
|
|
284
|
+
store().setError(sessionId, {
|
|
285
|
+
type: (_data$error = data.error) === null || _data$error === void 0 ? void 0 : _data$error.type,
|
|
286
|
+
message: (_data$error2 = data.error) === null || _data$error2 === void 0 ? void 0 : _data$error2.message
|
|
287
|
+
});
|
|
288
|
+
store().setStatus(sessionId, 'error');
|
|
289
|
+
(_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, (_data$error3 = data.error) === null || _data$error3 === void 0 ? void 0 : _data$error3.type, (_data$error4 = data.error) === null || _data$error4 === void 0 ? void 0 : _data$error4.message);
|
|
290
|
+
return _context.abrupt("continue", 21);
|
|
291
|
+
case 20:
|
|
292
|
+
console.warn('Unknown SSE event type:', eventType);
|
|
293
|
+
return _context.abrupt("continue", 21);
|
|
294
|
+
case 21:
|
|
295
|
+
_context.next = 23;
|
|
296
|
+
break;
|
|
297
|
+
case 22:
|
|
298
|
+
_context.prev = 22;
|
|
299
|
+
_t2 = _context["catch"](12);
|
|
300
|
+
console.error('Error parsing SSE data:', _t2, dataStr);
|
|
301
|
+
case 23:
|
|
302
|
+
_context.next = 9;
|
|
303
|
+
break;
|
|
304
|
+
case 24:
|
|
305
|
+
_context.next = 26;
|
|
306
|
+
break;
|
|
307
|
+
case 25:
|
|
308
|
+
_context.prev = 25;
|
|
309
|
+
_t3 = _context["catch"](8);
|
|
310
|
+
_iterator.e(_t3);
|
|
311
|
+
case 26:
|
|
312
|
+
_context.prev = 26;
|
|
313
|
+
_iterator.f();
|
|
314
|
+
return _context.finish(26);
|
|
315
|
+
case 27:
|
|
316
|
+
_context.next = 3;
|
|
317
|
+
break;
|
|
318
|
+
case 28:
|
|
319
|
+
_context.prev = 28;
|
|
320
|
+
flushPending();
|
|
321
|
+
return _context.finish(28);
|
|
322
|
+
case 29:
|
|
323
|
+
case "end":
|
|
324
|
+
return _context.stop();
|
|
325
|
+
}
|
|
326
|
+
}, _callee, null, [[2,, 28, 29], [8, 25, 26, 27], [12, 22]]);
|
|
327
|
+
}));
|
|
328
|
+
return function parseSessionSSE(_x, _x2, _x3) {
|
|
329
|
+
return _ref.apply(this, arguments);
|
|
330
|
+
};
|
|
331
|
+
}();
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Manager singleton (module-level) que corre N streams del orchestrator en
|
|
335
|
+
* paralelo, uno por `sessionId`. Sobrevive a cambios de vista y al cierre del
|
|
336
|
+
* modal: los streams solo se cancelan con stop explícito del usuario o al
|
|
337
|
+
* completar/errorar.
|
|
338
|
+
*/
|
|
339
|
+
export var sessionStreamManager = {
|
|
340
|
+
isActive: isStreamActive,
|
|
341
|
+
getActiveCount: getActiveStreamCount,
|
|
342
|
+
getActiveSessionIds: function getActiveSessionIds() {
|
|
343
|
+
return Array.from(activeStreams.keys());
|
|
344
|
+
},
|
|
345
|
+
startStream: function startStream(params) {
|
|
346
|
+
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
347
|
+
var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, controller, active, response, _callbacks$onError2, _t4;
|
|
348
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
349
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
350
|
+
case 0:
|
|
351
|
+
ensureSessionNotificationsInitialized();
|
|
352
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, request = params.request, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
353
|
+
if (!isStreamActive(sessionId)) {
|
|
354
|
+
_context2.next = 1;
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
return _context2.abrupt("return", {
|
|
358
|
+
started: false,
|
|
359
|
+
reason: 'already_active'
|
|
360
|
+
});
|
|
361
|
+
case 1:
|
|
362
|
+
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
363
|
+
_context2.next = 2;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
return _context2.abrupt("return", {
|
|
367
|
+
started: false,
|
|
368
|
+
reason: 'limit'
|
|
369
|
+
});
|
|
370
|
+
case 2:
|
|
371
|
+
controller = new AbortController();
|
|
372
|
+
active = {
|
|
373
|
+
sessionId: sessionId,
|
|
374
|
+
controller: controller,
|
|
375
|
+
isStopped: false
|
|
376
|
+
};
|
|
377
|
+
activeStreams.set(sessionId, active);
|
|
378
|
+
store().ensureSession(sessionId);
|
|
379
|
+
store().patchMeta(sessionId, _objectSpread(_objectSpread({
|
|
380
|
+
placeholderId: placeholderId,
|
|
381
|
+
error: null,
|
|
382
|
+
isLoading: true,
|
|
383
|
+
isWriting: false
|
|
384
|
+
}, agentId != null ? {
|
|
385
|
+
agentId: agentId
|
|
386
|
+
} : {}), agentName != null ? {
|
|
387
|
+
agentName: agentName
|
|
388
|
+
} : {}));
|
|
389
|
+
store().setStatus(sessionId, 'thinking');
|
|
390
|
+
sessionStreamingText.start(sessionId, placeholderId);
|
|
391
|
+
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
392
|
+
_context2.prev = 3;
|
|
393
|
+
_context2.next = 4;
|
|
394
|
+
return maia.Orchestrator.orchestrator(request, controller.signal);
|
|
395
|
+
case 4:
|
|
396
|
+
response = _context2.sent;
|
|
397
|
+
_context2.next = 5;
|
|
398
|
+
return parseSessionSSE(response, active, params);
|
|
399
|
+
case 5:
|
|
400
|
+
_context2.next = 7;
|
|
401
|
+
break;
|
|
402
|
+
case 6:
|
|
403
|
+
_context2.prev = 6;
|
|
404
|
+
_t4 = _context2["catch"](3);
|
|
405
|
+
if (!active.isStopped) {
|
|
406
|
+
sessionStreamingText.clear(sessionId);
|
|
407
|
+
store().patchMeta(sessionId, {
|
|
408
|
+
isLoading: false,
|
|
409
|
+
isWriting: false
|
|
410
|
+
});
|
|
411
|
+
store().setActivity(sessionId, null);
|
|
412
|
+
store().setStatus(sessionId, 'error');
|
|
413
|
+
(_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 || _callbacks$onError2.call(callbacks);
|
|
414
|
+
}
|
|
415
|
+
case 7:
|
|
416
|
+
_context2.prev = 7;
|
|
417
|
+
activeStreams["delete"](sessionId);
|
|
418
|
+
return _context2.finish(7);
|
|
419
|
+
case 8:
|
|
420
|
+
return _context2.abrupt("return", {
|
|
421
|
+
started: true
|
|
422
|
+
});
|
|
423
|
+
case 9:
|
|
424
|
+
case "end":
|
|
425
|
+
return _context2.stop();
|
|
426
|
+
}
|
|
427
|
+
}, _callee2, null, [[3, 6, 7, 8]]);
|
|
428
|
+
}))();
|
|
429
|
+
},
|
|
430
|
+
/** Resume HITL (`continue-thread`) keyed por sessionId — mismo motor que orchestrator. */startContinueStream: function startContinueStream(params) {
|
|
431
|
+
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
432
|
+
var _ref2;
|
|
433
|
+
var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, controller, active, sseParams, response, _callbacks$onError3, _t5;
|
|
434
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
435
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
436
|
+
case 0:
|
|
437
|
+
ensureSessionNotificationsInitialized();
|
|
438
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, continueRequest = params.continueRequest, callbacks = params.callbacks, t = params.t, hitlExecutionContext = params.hitlExecutionContext, agentId = params.agentId, agentName = params.agentName;
|
|
439
|
+
if (!isStreamActive(sessionId)) {
|
|
440
|
+
_context3.next = 1;
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
return _context3.abrupt("return", {
|
|
444
|
+
started: false,
|
|
445
|
+
reason: 'already_active'
|
|
446
|
+
});
|
|
447
|
+
case 1:
|
|
448
|
+
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
449
|
+
_context3.next = 2;
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
return _context3.abrupt("return", {
|
|
453
|
+
started: false,
|
|
454
|
+
reason: 'limit'
|
|
455
|
+
});
|
|
456
|
+
case 2:
|
|
457
|
+
if (hitlExecutionContext) {
|
|
458
|
+
sessionHitlContext.set(sessionId, hitlExecutionContext);
|
|
459
|
+
}
|
|
460
|
+
controller = new AbortController();
|
|
461
|
+
active = {
|
|
462
|
+
sessionId: sessionId,
|
|
463
|
+
controller: controller,
|
|
464
|
+
isStopped: false
|
|
465
|
+
};
|
|
466
|
+
activeStreams.set(sessionId, active);
|
|
467
|
+
store().ensureSession(sessionId);
|
|
468
|
+
store().patchMeta(sessionId, _objectSpread(_objectSpread({
|
|
469
|
+
placeholderId: placeholderId,
|
|
470
|
+
error: null,
|
|
471
|
+
isLoading: true,
|
|
472
|
+
isWriting: false
|
|
473
|
+
}, agentId != null ? {
|
|
474
|
+
agentId: agentId
|
|
475
|
+
} : {}), agentName != null ? {
|
|
476
|
+
agentName: agentName
|
|
477
|
+
} : {}));
|
|
478
|
+
store().setStatus(sessionId, 'thinking');
|
|
479
|
+
sessionStreamingText.start(sessionId, placeholderId);
|
|
480
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref2 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref2 !== void 0 ? _ref2 : undefined));
|
|
481
|
+
sseParams = {
|
|
482
|
+
sessionId: sessionId,
|
|
483
|
+
placeholderId: placeholderId,
|
|
484
|
+
request: {},
|
|
485
|
+
callbacks: callbacks,
|
|
486
|
+
t: t,
|
|
487
|
+
hitlExecutionContext: hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId),
|
|
488
|
+
agentId: agentId,
|
|
489
|
+
agentName: agentName
|
|
490
|
+
};
|
|
491
|
+
_context3.prev = 3;
|
|
492
|
+
_context3.next = 4;
|
|
493
|
+
return maia.Orchestrator.continueThread(continueRequest, controller.signal);
|
|
494
|
+
case 4:
|
|
495
|
+
response = _context3.sent;
|
|
496
|
+
if (response.ok) {
|
|
497
|
+
_context3.next = 5;
|
|
498
|
+
break;
|
|
499
|
+
}
|
|
500
|
+
throw new Error("continue-thread failed: ".concat(response.status));
|
|
501
|
+
case 5:
|
|
502
|
+
_context3.next = 6;
|
|
503
|
+
return parseSessionSSE(response, active, sseParams);
|
|
504
|
+
case 6:
|
|
505
|
+
_context3.next = 8;
|
|
506
|
+
break;
|
|
507
|
+
case 7:
|
|
508
|
+
_context3.prev = 7;
|
|
509
|
+
_t5 = _context3["catch"](3);
|
|
510
|
+
if (!active.isStopped) {
|
|
511
|
+
sessionStreamingText.clear(sessionId);
|
|
512
|
+
store().patchMeta(sessionId, {
|
|
513
|
+
isLoading: false,
|
|
514
|
+
isWriting: false
|
|
515
|
+
});
|
|
516
|
+
store().setActivity(sessionId, null);
|
|
517
|
+
store().setStatus(sessionId, 'error');
|
|
518
|
+
(_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks);
|
|
519
|
+
}
|
|
520
|
+
case 8:
|
|
521
|
+
_context3.prev = 8;
|
|
522
|
+
activeStreams["delete"](sessionId);
|
|
523
|
+
sessionHitlContext.clear(sessionId);
|
|
524
|
+
return _context3.finish(8);
|
|
525
|
+
case 9:
|
|
526
|
+
return _context3.abrupt("return", {
|
|
527
|
+
started: true
|
|
528
|
+
});
|
|
529
|
+
case 10:
|
|
530
|
+
case "end":
|
|
531
|
+
return _context3.stop();
|
|
532
|
+
}
|
|
533
|
+
}, _callee3, null, [[3, 7, 8, 9]]);
|
|
534
|
+
}))();
|
|
535
|
+
},
|
|
536
|
+
/** Regenera la respuesta de un turno (`retry_completion`) — mismo motor SSE que orchestrator. */startRetryStream: function startRetryStream(params) {
|
|
537
|
+
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
538
|
+
var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
|
|
539
|
+
return _regeneratorRuntime.wrap(function (_context4) {
|
|
540
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
541
|
+
case 0:
|
|
542
|
+
ensureSessionNotificationsInitialized();
|
|
543
|
+
sessionId = params.sessionId, placeholderId = params.placeholderId, retryRequest = params.retryRequest, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
544
|
+
if (!isStreamActive(sessionId)) {
|
|
545
|
+
_context4.next = 1;
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
return _context4.abrupt("return", {
|
|
549
|
+
started: false,
|
|
550
|
+
reason: 'already_active'
|
|
551
|
+
});
|
|
552
|
+
case 1:
|
|
553
|
+
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
554
|
+
_context4.next = 2;
|
|
555
|
+
break;
|
|
556
|
+
}
|
|
557
|
+
return _context4.abrupt("return", {
|
|
558
|
+
started: false,
|
|
559
|
+
reason: 'limit'
|
|
560
|
+
});
|
|
561
|
+
case 2:
|
|
562
|
+
controller = new AbortController();
|
|
563
|
+
active = {
|
|
564
|
+
sessionId: sessionId,
|
|
565
|
+
controller: controller,
|
|
566
|
+
isStopped: false
|
|
567
|
+
};
|
|
568
|
+
activeStreams.set(sessionId, active);
|
|
569
|
+
store().ensureSession(sessionId);
|
|
570
|
+
store().patchMeta(sessionId, _objectSpread(_objectSpread({
|
|
571
|
+
placeholderId: placeholderId,
|
|
572
|
+
error: null,
|
|
573
|
+
isLoading: true,
|
|
574
|
+
isWriting: false
|
|
575
|
+
}, agentId != null ? {
|
|
576
|
+
agentId: agentId
|
|
577
|
+
} : {}), agentName != null ? {
|
|
578
|
+
agentName: agentName
|
|
579
|
+
} : {}));
|
|
580
|
+
store().setStatus(sessionId, 'thinking');
|
|
581
|
+
sessionStreamingText.start(sessionId, placeholderId);
|
|
582
|
+
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
583
|
+
sseParams = {
|
|
584
|
+
sessionId: sessionId,
|
|
585
|
+
placeholderId: placeholderId,
|
|
586
|
+
request: {},
|
|
587
|
+
callbacks: callbacks,
|
|
588
|
+
t: t,
|
|
589
|
+
activityOptions: activityOptions,
|
|
590
|
+
agentId: agentId,
|
|
591
|
+
agentName: agentName
|
|
592
|
+
};
|
|
593
|
+
_context4.prev = 3;
|
|
594
|
+
_context4.next = 4;
|
|
595
|
+
return maia.Orchestrator.retryCompletion(retryRequest, controller.signal);
|
|
596
|
+
case 4:
|
|
597
|
+
response = _context4.sent;
|
|
598
|
+
if (response.ok) {
|
|
599
|
+
_context4.next = 10;
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
602
|
+
if (!(response.status === 404)) {
|
|
603
|
+
_context4.next = 9;
|
|
604
|
+
break;
|
|
605
|
+
}
|
|
606
|
+
_context4.prev = 5;
|
|
607
|
+
_context4.next = 6;
|
|
608
|
+
return response.json();
|
|
609
|
+
case 6:
|
|
610
|
+
data = _context4.sent;
|
|
611
|
+
detail = typeof data.detail === 'string' ? data.detail : undefined;
|
|
612
|
+
_context4.next = 8;
|
|
613
|
+
break;
|
|
614
|
+
case 7:
|
|
615
|
+
_context4.prev = 7;
|
|
616
|
+
_t6 = _context4["catch"](5);
|
|
617
|
+
detail = undefined;
|
|
618
|
+
case 8:
|
|
619
|
+
if (!(detail === 'Turn not found')) {
|
|
620
|
+
_context4.next = 9;
|
|
621
|
+
break;
|
|
622
|
+
}
|
|
623
|
+
sessionStreamingText.clear(sessionId);
|
|
624
|
+
store().patchMeta(sessionId, {
|
|
625
|
+
isLoading: false,
|
|
626
|
+
isWriting: false,
|
|
627
|
+
placeholderId: null
|
|
628
|
+
});
|
|
629
|
+
store().setActivity(sessionId, null);
|
|
630
|
+
store().setStatus(sessionId, 'idle');
|
|
631
|
+
activeStreams["delete"](sessionId);
|
|
632
|
+
return _context4.abrupt("return", {
|
|
633
|
+
started: false,
|
|
634
|
+
reason: 'turn_not_found'
|
|
635
|
+
});
|
|
636
|
+
case 9:
|
|
637
|
+
throw new Error("retry_completion failed: ".concat(response.status));
|
|
638
|
+
case 10:
|
|
639
|
+
_context4.next = 11;
|
|
640
|
+
return parseSessionSSE(response, active, sseParams);
|
|
641
|
+
case 11:
|
|
642
|
+
_context4.next = 13;
|
|
643
|
+
break;
|
|
644
|
+
case 12:
|
|
645
|
+
_context4.prev = 12;
|
|
646
|
+
_t7 = _context4["catch"](3);
|
|
647
|
+
if (!active.isStopped) {
|
|
648
|
+
sessionStreamingText.clear(sessionId);
|
|
649
|
+
store().patchMeta(sessionId, {
|
|
650
|
+
isLoading: false,
|
|
651
|
+
isWriting: false
|
|
652
|
+
});
|
|
653
|
+
store().setActivity(sessionId, null);
|
|
654
|
+
store().setStatus(sessionId, 'error');
|
|
655
|
+
(_callbacks$onError4 = callbacks.onError) === null || _callbacks$onError4 === void 0 || _callbacks$onError4.call(callbacks);
|
|
656
|
+
}
|
|
657
|
+
case 13:
|
|
658
|
+
_context4.prev = 13;
|
|
659
|
+
activeStreams["delete"](sessionId);
|
|
660
|
+
return _context4.finish(13);
|
|
661
|
+
case 14:
|
|
662
|
+
return _context4.abrupt("return", {
|
|
663
|
+
started: true
|
|
664
|
+
});
|
|
665
|
+
case 15:
|
|
666
|
+
case "end":
|
|
667
|
+
return _context4.stop();
|
|
668
|
+
}
|
|
669
|
+
}, _callee4, null, [[3, 12, 13, 14], [5, 7]]);
|
|
670
|
+
}))();
|
|
671
|
+
},
|
|
672
|
+
/** Cancelación explícita del usuario (mensaje "cancelado"). */stopStream: function stopStream(sessionId, callbacks) {
|
|
673
|
+
var _callbacks$onStop;
|
|
674
|
+
var active = activeStreams.get(sessionId);
|
|
675
|
+
if (!active) return;
|
|
676
|
+
active.isStopped = true;
|
|
677
|
+
active.controller.abort();
|
|
678
|
+
activeStreams["delete"](sessionId);
|
|
679
|
+
// El parcial se rescata antes de limpiar: el backend lo persiste, pero si no lo
|
|
680
|
+
// pasamos al callback desaparece de pantalla hasta el próximo fetch de la sesión.
|
|
681
|
+
var partialText = sessionStreamingText.getSnapshot(sessionId).text;
|
|
682
|
+
sessionStreamingText.clear(sessionId);
|
|
683
|
+
store().patchMeta(sessionId, {
|
|
684
|
+
isLoading: false,
|
|
685
|
+
isWriting: false
|
|
686
|
+
});
|
|
687
|
+
store().setActivity(sessionId, null);
|
|
688
|
+
store().setStatus(sessionId, 'cancelled');
|
|
689
|
+
callbacks === null || callbacks === void 0 || (_callbacks$onStop = callbacks.onStop) === null || _callbacks$onStop === void 0 || _callbacks$onStop.call(callbacks, partialText);
|
|
690
|
+
},
|
|
691
|
+
/** Aborta sin marcar "cancelado" (uso interno / limpieza). */abortSilently: function abortSilently(sessionId) {
|
|
692
|
+
var _store$getMeta;
|
|
693
|
+
var active = activeStreams.get(sessionId);
|
|
694
|
+
if (!active) return;
|
|
695
|
+
active.isStopped = true;
|
|
696
|
+
active.controller.abort();
|
|
697
|
+
activeStreams["delete"](sessionId);
|
|
698
|
+
sessionStreamingText.clear(sessionId);
|
|
699
|
+
store().patchMeta(sessionId, {
|
|
700
|
+
isLoading: false,
|
|
701
|
+
isWriting: false
|
|
702
|
+
});
|
|
703
|
+
store().setActivity(sessionId, null);
|
|
704
|
+
if (((_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.status) !== 'complete') {
|
|
705
|
+
store().setStatus(sessionId, 'idle');
|
|
706
|
+
}
|
|
707
|
+
},
|
|
708
|
+
abortAll: function abortAll() {
|
|
709
|
+
var _this = this;
|
|
710
|
+
Array.from(activeStreams.keys()).forEach(function (sessionId) {
|
|
711
|
+
return _this.abortSilently(sessionId);
|
|
712
|
+
});
|
|
713
|
+
}
|
|
714
|
+
};
|
|
715
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQiLCJtZXJnZVN0cmVhbUNodW5rIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJTVFJFQU1fVEhST1RUTEVfTVMiLCJhY3RpdmVTdHJlYW1zIiwiTWFwIiwic3RvcmUiLCJnZXRTdGF0ZSIsImlzU3RyZWFtQWN0aXZlIiwic2Vzc2lvbklkIiwiaGFzIiwiZ2V0QWN0aXZlU3RyZWFtQ291bnQiLCJzaXplIiwicGFyc2VTZXNzaW9uU1NFIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJhY3RpdmUiLCJwYXJhbXMiLCJfcGFyYW1zJGhpdGxFeGVjdXRpb24iLCJfcmVzcG9uc2UkYm9keSIsIl9kYXRhJGVycm9yIiwiX2RhdGEkZXJyb3IyIiwiX2NhbGxiYWNrcyRvbkVycm9yIiwiX2RhdGEkZXJyb3IzIiwiX2RhdGEkZXJyb3I0IiwicGxhY2Vob2xkZXJJZCIsImNhbGxiYWNrcyIsInQiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsInBlbmRpbmdDb250ZW50IiwidGhyb3R0bGVUaW1lciIsImZsdXNoVG9TdG9yZXMiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwicmVhZGVyIiwiZGVjb2RlciIsImJ1ZmZlciIsImFjY3VtdWxhdGVkQ29udGVudCIsImhhc1N0YXJ0ZWRXcml0aW5nIiwiZW5zdXJlV3JpdGluZ1N0YXJ0ZWQiLCJhcHBseVN0cmVhbUNodW5rIiwiYXBwbHlTdHJlYW1Db21wbGV0ZSIsIl95aWVsZCRyZWFkZXIkcmVhZCIsImRvbmUiLCJ2YWx1ZSIsImxpbmVzIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJsaW5lIiwiX2xpbmUkc3BsaXQiLCJfbGluZSRzcGxpdDIiLCJldmVudExpbmUiLCJkYXRhTGluZSIsImV2ZW50VHlwZSIsImRhdGFTdHIiLCJkYXRhIiwiY2h1bmsiLCJfY2h1bmsiLCJfY2FsbGJhY2tzJG9uQXBwcm92YWwiLCJpc01hbnVhbEFwcHJvdmFsIiwiX3QiLCJfdDIiLCJfdDMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImdldCIsImNvbnRlbnQiLCJfY2FsbGJhY2tzJG9uU3RyZWFtVXAiLCJzZXRUZXh0Iiwib25TdHJlYW1VcGRhdGUiLCJjYWxsIiwid2luZG93Iiwic2V0VGltZW91dCIsInRvRW1pdCIsImNsZWFyVGltZW91dCIsImJvZHkiLCJnZXRSZWFkZXIiLCJFcnJvciIsIlRleHREZWNvZGVyIiwiX2NhbGxiYWNrcyRvblN0YXJ0V3JpIiwicGF0Y2hNZXRhIiwiaXNMb2FkaW5nIiwiaXNXcml0aW5nIiwic2V0U3RhdHVzIiwic2V0QWN0aXZpdHkiLCJvblN0YXJ0V3JpdGluZyIsInBheWxvYWQiLCJfcGF5bG9hZCRhZ2VudF9pZCIsIl9zdWJhZ2VudFJhdyRyZXNvbHZlZCIsIl9jYWxsYmFja3Mkb25GaW5pc2hTdCIsImZpbmFsQ29udGVudCIsInNvdXJjZXMiLCJtZW1vcnlTZXNzaW9uSWQiLCJtZW1vcnlfc2Vzc2lvbl9pZCIsImF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5Iiwic3VnZ2VzdGlvbnMiLCJzdWdnZXN0X3JlcGx5IiwiYWdlbnRJZFJhdyIsImFnZW50X2lkIiwiYWdlbnRJZCIsImNvbXBsZXRlZEFnZW50SWQiLCJTdHJpbmciLCJ0cmltIiwic3ViYWdlbnRSYXciLCJzdWJhZ2VudCIsInJlc29sdmVkQ29udGV4dCIsInJlc29sdmVkX2NvbnRleHQiLCJjbGVhciIsImZpbmlzaFBheWxvYWQiLCJvbkZpbmlzaFN0cmVhbSIsImlzU3RvcHBlZCIsImNhbmNlbCIsImFicnVwdCIsInJlYWQiLCJzZW50IiwiZGVjb2RlIiwic3RyZWFtIiwic3BsaXQiLCJwb3AiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInMiLCJuIiwiX3NsaWNlZFRvQXJyYXkiLCJyZXBsYWNlIiwiSlNPTiIsInBhcnNlIiwicGhhc2UiLCJtZXNzYWdlIiwibm9kZSIsInVuZGVmaW5lZCIsInRocmVhZF9pZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsIm9uQXBwcm92YWxSZXF1aXJlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInNldEVycm9yIiwidHlwZSIsIm9uRXJyb3IiLCJ3YXJuIiwiZSIsImYiLCJmaW5pc2giLCJzdG9wIiwiX3giLCJfeDIiLCJfeDMiLCJhcHBseSIsImFyZ3VtZW50cyIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiaXNBY3RpdmUiLCJnZXRBY3RpdmVDb3VudCIsImdldEFjdGl2ZVNlc3Npb25JZHMiLCJmcm9tIiwia2V5cyIsInN0YXJ0U3RyZWFtIiwiX2NhbGxlZTIiLCJyZXF1ZXN0IiwiYWN0aXZpdHlPcHRpb25zIiwiYWdlbnROYW1lIiwiY29udHJvbGxlciIsIl9jYWxsYmFja3Mkb25FcnJvcjIiLCJfdDQiLCJfY29udGV4dDIiLCJzdGFydGVkIiwicmVhc29uIiwiQWJvcnRDb250cm9sbGVyIiwic2V0IiwiZW5zdXJlU2Vzc2lvbiIsIl9vYmplY3RTcHJlYWQiLCJzdGFydCIsIk9yY2hlc3RyYXRvciIsIm9yY2hlc3RyYXRvciIsInNpZ25hbCIsInN0YXJ0Q29udGludWVTdHJlYW0iLCJfY2FsbGVlMyIsIl9yZWYyIiwiY29udGludWVSZXF1ZXN0Iiwic3NlUGFyYW1zIiwiX2NhbGxiYWNrcyRvbkVycm9yMyIsIl90NSIsIl9jb250ZXh0MyIsImNvbnRpbnVlVGhyZWFkIiwib2siLCJjb25jYXQiLCJzdGF0dXMiLCJzdGFydFJldHJ5U3RyZWFtIiwiX2NhbGxlZTQiLCJyZXRyeVJlcXVlc3QiLCJkZXRhaWwiLCJfY2FsbGJhY2tzJG9uRXJyb3I0IiwiX3Q2IiwiX3Q3IiwiX2NvbnRleHQ0IiwicmV0cnlDb21wbGV0aW9uIiwianNvbiIsInN0b3BTdHJlYW0iLCJfY2FsbGJhY2tzJG9uU3RvcCIsImFib3J0IiwicGFydGlhbFRleHQiLCJnZXRTbmFwc2hvdCIsInRleHQiLCJvblN0b3AiLCJhYm9ydFNpbGVudGx5IiwiX3N0b3JlJGdldE1ldGEiLCJnZXRNZXRhIiwiYWJvcnRBbGwiLCJfdGhpcyIsImZvckVhY2giXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29udGludWUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zdGFudC1jb25kaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsUmVxdWVzdCB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQge1xuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxufSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHR5cGUgeyBIaXRsRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQsIG1lcmdlU3RyZWFtQ2h1bmsgfSBmcm9tICcuLi8uLi91dGlscy9zc2VTdHJlYW1Db250ZW50J1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4vdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQgfSBmcm9tICcuL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgc2Vzc2lvbkhpdGxDb250ZXh0IH0gZnJvbSAnLi9zZXNzaW9uSGl0bENvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25GaW5pc2hQYXlsb2FkLCBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzLCBTdGFydFN0cmVhbVJlc3VsdCB9IGZyb20gJy4vc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgT3JjaGVzdHJhdG9yUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcj5bMF1cbnR5cGUgQ29udGludWVUaHJlYWRSZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3IuY29udGludWVUaHJlYWQ+WzBdXG50eXBlIFJldHJ5Q29tcGxldGlvblJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24+WzBdXG5cbi8qKiBDb21wYXRpYmxlIGNvbiBlbCBgdGAgZGUgaTE4bmV4dCAodXNvIGRlIHVuYSBzb2xhIGtleSkuICovXG50eXBlIFRyYW5zbGF0ZUZuID0gKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcblxudHlwZSBTdGFydFN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIHJlcXVlc3Q6IE9yY2hlc3RyYXRvclJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU3RhcnRDb250aW51ZVN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIGNvbnRpbnVlUmVxdWVzdDogQ29udGludWVUaHJlYWRSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXRyeVJlcXVlc3Q6IFJldHJ5Q29tcGxldGlvblJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgQWN0aXZlU3RyZWFtID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgaXNTdG9wcGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTcOheGltbyBkZSBzZXNpb25lcyBnZW5lcmFuZG8gZW4gcGFyYWxlbG8uIFByb3RlZ2UgcmVkL3JlY3Vyc29zIGRlbCBjbGllbnRlLlxuICogQWp1c3RhYmxlIGEgZnV0dXJvIHbDrWEgZmxhZyBkZWwgaG9zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSA0XG5cbmNvbnN0IFNUUkVBTV9USFJPVFRMRV9NUyA9IDE2XG5cbmNvbnN0IGFjdGl2ZVN0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgQWN0aXZlU3RyZWFtPigpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG5cbmNvbnN0IGlzU3RyZWFtQWN0aXZlID0gKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiA9PiBhY3RpdmVTdHJlYW1zLmhhcyhzZXNzaW9uSWQpXG5cbmNvbnN0IGdldEFjdGl2ZVN0cmVhbUNvdW50ID0gKCk6IG51bWJlciA9PiBhY3RpdmVTdHJlYW1zLnNpemVcblxuY29uc3QgcGFyc2VTZXNzaW9uU1NFID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSwgYWN0aXZlOiBBY3RpdmVTdHJlYW0sIHBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNhbGxiYWNrcywgdCB9ID0gcGFyYW1zXG4gIGNvbnN0IGhpdGxFeGVjdXRpb25Db250ZXh0ID0gcGFyYW1zLmhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKVxuXG4gIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IHRocm90dGxlVGltZXI6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3QgZmx1c2hUb1N0b3JlcyA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zZXRUZXh0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGVudClcbiAgICBjYWxsYmFja3Mub25TdHJlYW1VcGRhdGU/Lihjb250ZW50KVxuICB9XG5cbiAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBwZW5kaW5nQ29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSByZXR1cm5cbiAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgIGlmIChwZW5kaW5nQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgICBmbHVzaFRvU3RvcmVzKHRvRW1pdClcbiAgICAgIH1cbiAgICB9LCBTVFJFQU1fVEhST1RUTEVfTVMpXG4gIH1cblxuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKHRocm90dGxlVGltZXIgIT0gbnVsbCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aHJvdHRsZVRpbWVyKVxuICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcigpXG4gIGlmICghcmVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWFkZXIgYXZhaWxhYmxlJylcbiAgfVxuXG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBsZXQgYnVmZmVyID0gJydcbiAgbGV0IGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gIGxldCBoYXNTdGFydGVkV3JpdGluZyA9IGZhbHNlXG5cbiAgY29uc3QgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQgPSAoKSA9PiB7XG4gICAgaWYgKGhhc1N0YXJ0ZWRXcml0aW5nKSByZXR1cm5cbiAgICBoYXNTdGFydGVkV3JpdGluZyA9IHRydWVcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlLCBpc1dyaXRpbmc6IHRydWUgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd3cml0aW5nJylcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIGNhbGxiYWNrcy5vblN0YXJ0V3JpdGluZz8uKClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ2h1bmsgPSAoY2h1bms6IHN0cmluZykgPT4ge1xuICAgIGlmICghY2h1bmspIHJldHVyblxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9IG1lcmdlU3RyZWFtQ2h1bmsoYWNjdW11bGF0ZWRDb250ZW50LCBjaHVuaylcbiAgICBlbWl0VGhyb3R0bGVkKGFjY3VtdWxhdGVkQ29udGVudClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ29tcGxldGUgPSAocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBjb25zdCBmaW5hbENvbnRlbnQgPSAocGF5bG9hZC5jb250ZW50IGFzIHN0cmluZykgfHwgYWNjdW11bGF0ZWRDb250ZW50XG4gICAgY29uc3Qgc291cmNlcyA9IHBheWxvYWQuc291cmNlcyB8fCBudWxsXG4gICAgY29uc3QgbWVtb3J5U2Vzc2lvbklkID0gKHBheWxvYWQubWVtb3J5X3Nlc3Npb25faWQgYXMgc3RyaW5nKSB8fCAnJ1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF0dGFjaG1lbnRzKSA/IHBheWxvYWQuYXR0YWNobWVudHMgOiBudWxsXG4gICAgbGV0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5zdWdnZXN0X3JlcGx5KSkge1xuICAgICAgc3VnZ2VzdGlvbnMgPSBwYXlsb2FkLnN1Z2dlc3RfcmVwbHkgYXMgc3RyaW5nW11cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5zdWdnZXN0aW9ucykpIHtcbiAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0aW9ucyBhcyBzdHJpbmdbXVxuICAgIH1cbiAgICBjb25zdCBhZ2VudElkUmF3ID0gcGF5bG9hZC5hZ2VudF9pZCA/PyBwYXlsb2FkLmFnZW50SWRcbiAgICBjb25zdCBjb21wbGV0ZWRBZ2VudElkID0gYWdlbnRJZFJhdyAhPSBudWxsICYmIFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgIT09ICcnID8gU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSA6IG51bGxcbiAgICBjb25zdCBzdWJhZ2VudFJhdyA9IHBheWxvYWQuc3ViYWdlbnQgYXMgeyByZXNvbHZlZF9jb250ZXh0PzogdW5rbm93biB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IHJlc29sdmVkQ29udGV4dCA9IHN1YmFnZW50UmF3Py5yZXNvbHZlZF9jb250ZXh0ID8/IG51bGxcblxuICAgIGZsdXNoUGVuZGluZygpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY29tcGxldGUnKVxuXG4gICAgY29uc3QgZmluaXNoUGF5bG9hZDogU2Vzc2lvbkZpbmlzaFBheWxvYWQgPSB7XG4gICAgICBjb250ZW50OiBmaW5hbENvbnRlbnQsXG4gICAgICBzb3VyY2VzLFxuICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgYXR0YWNobWVudHMsXG4gICAgICBzdWdnZXN0aW9ucyxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQsXG4gICAgICByZXNvbHZlZENvbnRleHQsXG4gICAgfVxuICAgIGNhbGxiYWNrcy5vbkZpbmlzaFN0cmVhbT8uKGZpbmlzaFBheWxvYWQpXG4gIH1cblxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAoYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICByZWFkZXIuY2FuY2VsKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKVxuICAgICAgaWYgKGRvbmUpIGJyZWFrXG5cbiAgICAgIGlmIChhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXFxuXFxuJylcbiAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnXG5cbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBpZiAobGluZS50cmltKCkgPT09ICcnKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IFtldmVudExpbmUsIGRhdGFMaW5lXSA9IGxpbmUuc3BsaXQoJ1xcbicpXG4gICAgICAgIGlmICghZXZlbnRMaW5lIHx8ICFkYXRhTGluZSkgY29udGludWVcblxuICAgICAgICBjb25zdCBldmVudFR5cGUgPSBldmVudExpbmUucmVwbGFjZSgnZXZlbnQ6ICcsICcnKS50cmltKClcbiAgICAgICAgY29uc3QgZGF0YVN0ciA9IGRhdGFMaW5lLnJlcGxhY2UoJ2RhdGE6ICcsICcnKS50cmltKClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRhdGFTdHIpXG5cbiAgICAgICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAndGhpbmtpbmcnOlxuICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWRXcml0aW5nKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgeyBwaGFzZTogJ3RoaW5raW5nJywgbWVzc2FnZTogZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSgwLCB0KSB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgJ3Rva2VuJzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHR5cGVvZiBkYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZGF0YS5jb250ZW50IDogJydcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdjb250ZW50Jzoge1xuICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHR5cGVvZiBkYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZGF0YS5jb250ZW50IDogJydcbiAgICAgICAgICAgICAgZW5zdXJlV3JpdGluZ1N0YXJ0ZWQoKVxuICAgICAgICAgICAgICBhcHBseVN0cmVhbUNodW5rKGNodW5rKVxuICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Db21wbGV0ZShkYXRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICAgICAgICBpZiAoZGF0YS5ub2RlID09PSAnYWdlbnRfdHJhbnNmZXInKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm1lc3NhZ2UgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eShcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnRocmVhZF9pZCA9PT0gJ3N0cmluZycgPyBkYXRhLnRocmVhZF9pZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgIGNvbnN0IGlzTWFudWFsQXBwcm92YWwgPSBkYXRhLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCA9PT0gdHJ1ZVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBpZiAoIWlzTWFudWFsQXBwcm92YWwpIHtcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdhd2FpdGluZ19hcHByb3ZhbCcpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihkYXRhIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoaXNNYW51YWxBcHByb3ZhbCAmJiBBcnJheS5pc0FycmF5KGRhdGEucGVuZGluZ19hY3Rpb25zKSAmJiBkYXRhLnBlbmRpbmdfYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NTRSBFcnJvcjonLCBkYXRhLmVycm9yKVxuICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEVycm9yKHNlc3Npb25JZCwgeyB0eXBlOiBkYXRhLmVycm9yPy50eXBlLCBtZXNzYWdlOiBkYXRhLmVycm9yPy5tZXNzYWdlIH0pXG4gICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LihkYXRhLmVycm9yPy50eXBlLCBkYXRhLmVycm9yPy5tZXNzYWdlKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gU1NFIGV2ZW50IHR5cGU6JywgZXZlbnRUeXBlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgU1NFIGRhdGE6JywgcGFyc2VFcnJvciwgZGF0YVN0cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmbHVzaFBlbmRpbmcoKVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlciBzaW5nbGV0b24gKG1vZHVsZS1sZXZlbCkgcXVlIGNvcnJlIE4gc3RyZWFtcyBkZWwgb3JjaGVzdHJhdG9yIGVuXG4gKiBwYXJhbGVsbywgdW5vIHBvciBgc2Vzc2lvbklkYC4gU29icmV2aXZlIGEgY2FtYmlvcyBkZSB2aXN0YSB5IGFsIGNpZXJyZSBkZWxcbiAqIG1vZGFsOiBsb3Mgc3RyZWFtcyBzb2xvIHNlIGNhbmNlbGFuIGNvbiBzdG9wIGV4cGzDrWNpdG8gZGVsIHVzdWFyaW8gbyBhbFxuICogY29tcGxldGFyL2Vycm9yYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXNzaW9uU3RyZWFtTWFuYWdlciA9IHtcbiAgaXNBY3RpdmU6IGlzU3RyZWFtQWN0aXZlLFxuICBnZXRBY3RpdmVDb3VudDogZ2V0QWN0aXZlU3RyZWFtQ291bnQsXG4gIGdldEFjdGl2ZVNlc3Npb25JZHM6ICgpOiBzdHJpbmdbXSA9PiBBcnJheS5mcm9tKGFjdGl2ZVN0cmVhbXMua2V5cygpKSxcblxuICBhc3luYyBzdGFydFN0cmVhbShwYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIHJlcXVlc3QsIGNhbGxiYWNrcywgdCwgYWN0aXZpdHlPcHRpb25zLCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcihyZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBwYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlc3VtZSBISVRMIChgY29udGludWUtdGhyZWFkYCkga2V5ZWQgcG9yIHNlc3Npb25JZCDigJQgbWlzbW8gbW90b3IgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRDb250aW51ZVN0cmVhbShwYXJhbXM6IFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGludWVSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGhpdGxFeGVjdXRpb25Db250ZXh0LCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBpZiAoaGl0bEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHNlc3Npb25IaXRsQ29udGV4dC5zZXQoc2Vzc2lvbklkLCBoaXRsRXhlY3V0aW9uQ29udGV4dClcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCkgPz8gdW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IHNzZVBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgcmVxdWVzdDoge30gYXMgT3JjaGVzdHJhdG9yUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIHQsXG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZChjb250aW51ZVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbnRpbnVlLXRocmVhZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgc3NlUGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogUmVnZW5lcmEgbGEgcmVzcHVlc3RhIGRlIHVuIHR1cm5vIChgcmV0cnlfY29tcGxldGlvbmApIOKAlCBtaXNtbyBtb3RvciBTU0UgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRSZXRyeVN0cmVhbShwYXJhbXM6IFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgcmV0cnlSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgYWN0aXZpdHlPcHRpb25zLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24ocmV0cnlSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgbGV0IGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRldGFpbD86IHN0cmluZyB9XG4gICAgICAgICAgICBkZXRhaWwgPSB0eXBlb2YgZGF0YS5kZXRhaWwgPT09ICdzdHJpbmcnID8gZGF0YS5kZXRhaWwgOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGV0YWlsID09PSAnVHVybiBub3QgZm91bmQnKSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSwgcGxhY2Vob2xkZXJJZDogbnVsbCB9KVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICd0dXJuX25vdF9mb3VuZCcgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJldHJ5X2NvbXBsZXRpb24gZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGFyc2VTZXNzaW9uU1NFKHJlc3BvbnNlLCBhY3RpdmUsIHNzZVBhcmFtcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LigpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAvLyBFbCBwYXJjaWFsIHNlIHJlc2NhdGEgYW50ZXMgZGUgbGltcGlhcjogZWwgYmFja2VuZCBsbyBwZXJzaXN0ZSwgcGVybyBzaSBubyBsb1xuICAgIC8vIHBhc2Ftb3MgYWwgY2FsbGJhY2sgZGVzYXBhcmVjZSBkZSBwYW50YWxsYSBoYXN0YSBlbCBwcsOzeGltbyBmZXRjaCBkZSBsYSBzZXNpw7NuLlxuICAgIGNvbnN0IHBhcnRpYWxUZXh0ID0gc2Vzc2lvblN0cmVhbWluZ1RleHQuZ2V0U25hcHNob3Qoc2Vzc2lvbklkKS50ZXh0XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY2FuY2VsbGVkJylcbiAgICBjYWxsYmFja3M/Lm9uU3RvcD8uKHBhcnRpYWxUZXh0KVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICB9XG4gIH0sXG5cbiAgYWJvcnRBbGwoKSB7XG4gICAgQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSkuZm9yRWFjaChzZXNzaW9uSWQgPT4gdGhpcy5hYm9ydFNpbGVudGx5KHNlc3Npb25JZCkpXG4gIH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHdCQUF3QixFQUN4QkMsNkJBQTZCLEVBQzdCQyxnQ0FBZ0MsUUFDM0Isb0NBQW9DO0FBRTNDLFNBQVNDLHdCQUF3QixFQUFFQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDekYsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCOztBQU96RDs7QUFxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQU1DLHNCQUFzQixHQUFHLENBQUM7QUFFdkMsSUFBTUMsa0JBQWtCLEdBQUcsRUFBRTtBQUU3QixJQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBRyxDQUF1QixDQUFDO0FBRXJELElBQU1DLEtBQUssR0FBRyxTQUFSQSxLQUFLQSxDQUFBO0VBQUEsT0FBU1AsZ0JBQWdCLENBQUNRLFFBQVEsQ0FBQyxDQUFDO0FBQUE7QUFFL0MsSUFBTUMsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFJQyxTQUFpQjtFQUFBLE9BQWNMLGFBQWEsQ0FBQ00sR0FBRyxDQUFDRCxTQUFTLENBQUM7QUFBQTtBQUVuRixJQUFNRSxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFBO0VBQUEsT0FBaUJQLGFBQWEsQ0FBQ1EsSUFBSTtBQUFBO0FBRTdELElBQU1DLGVBQWU7RUFBQSxJQUFBQyxJQUFBLEdBQUFDLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBRyxTQUFBQyxRQUFPQyxRQUFrQixFQUFFQyxNQUFvQixFQUFFQyxNQUF5QjtJQUFBLElBQUFDLHFCQUFBLEVBQUFDLGNBQUEsRUFBQUMsV0FBQSxFQUFBQyxZQUFBLEVBQUFDLGtCQUFBLEVBQUFDLFlBQUEsRUFBQUMsWUFBQTtJQUFBLElBQUFuQixTQUFBLEVBQUFvQixhQUFBLEVBQUFDLFNBQUEsRUFBQUMsQ0FBQSxFQUFBQyxvQkFBQSxFQUFBQyxjQUFBLEVBQUFDLGFBQUEsRUFBQUMsYUFBQSxFQUFBQyxhQUFBLEVBQUFDLFlBQUEsRUFBQUMsTUFBQSxFQUFBQyxPQUFBLEVBQUFDLE1BQUEsRUFBQUMsa0JBQUEsRUFBQUMsaUJBQUEsRUFBQUMsb0JBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsbUJBQUEsRUFBQUMsa0JBQUEsRUFBQUMsSUFBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsU0FBQSxFQUFBQyxLQUFBLEVBQUFDLElBQUEsRUFBQUMsV0FBQSxFQUFBQyxZQUFBLEVBQUFDLFNBQUEsRUFBQUMsUUFBQSxFQUFBQyxTQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsRUFBQUMscUJBQUEsRUFBQUMsZ0JBQUEsRUFBQUMsRUFBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUE7SUFBQSxPQUFBbEQsbUJBQUEsQ0FBQW1ELElBQUEsV0FBQUMsUUFBQTtNQUFBLGtCQUFBQSxRQUFBLENBQUFDLElBQUEsR0FBQUQsUUFBQSxDQUFBRSxJQUFBO1FBQUE7VUFDeEY3RCxTQUFTLEdBQWtDWSxNQUFNLENBQWpEWixTQUFTLEVBQUVvQixhQUFhLEdBQW1CUixNQUFNLENBQXRDUSxhQUFhLEVBQUVDLFNBQVMsR0FBUVQsTUFBTSxDQUF2QlMsU0FBUyxFQUFFQyxDQUFDLEdBQUtWLE1BQU0sQ0FBWlUsQ0FBQztVQUN4Q0Msb0JBQW9CLElBQUFWLHFCQUFBLEdBQUdELE1BQU0sQ0FBQ1csb0JBQW9CLGNBQUFWLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUlyQixrQkFBa0IsQ0FBQ3NFLEdBQUcsQ0FBQzlELFNBQVMsQ0FBQztVQUV6RndCLGNBQTZCLEdBQUcsSUFBSTtVQUNwQ0MsYUFBNEIsR0FBRyxJQUFJO1VBRWpDQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUlxQyxPQUFlLEVBQUs7WUFBQSxJQUFBQyxxQkFBQTtZQUN6QzNFLG9CQUFvQixDQUFDNEUsT0FBTyxDQUFDakUsU0FBUyxFQUFFb0IsYUFBYSxFQUFFMkMsT0FBTyxDQUFDO1lBQy9ELENBQUFDLHFCQUFBLEdBQUEzQyxTQUFTLENBQUM2QyxjQUFjLGNBQUFGLHFCQUFBLGVBQXhCQSxxQkFBQSxDQUFBRyxJQUFBLENBQUE5QyxTQUFTLEVBQWtCMEMsT0FBTyxDQUFDO1VBQ3JDLENBQUM7VUFFS3BDLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBSW9DLE9BQWUsRUFBSztZQUN6Q3ZDLGNBQWMsR0FBR3VDLE9BQU87WUFDeEIsSUFBSXRDLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDM0JBLGFBQWEsR0FBRzJDLE1BQU0sQ0FBQ0MsVUFBVSxDQUFDLFlBQU07Y0FDdEM1QyxhQUFhLEdBQUcsSUFBSTtjQUNwQixJQUFJRCxjQUFjLElBQUksSUFBSSxFQUFFO2dCQUMxQixJQUFNOEMsTUFBTSxHQUFHOUMsY0FBYztnQkFDN0JBLGNBQWMsR0FBRyxJQUFJO2dCQUNyQkUsYUFBYSxDQUFDNEMsTUFBTSxDQUFDO2NBQ3ZCO1lBQ0YsQ0FBQyxFQUFFNUUsa0JBQWtCLENBQUM7VUFDeEIsQ0FBQztVQUVLa0MsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUEsRUFBUztZQUN6QixJQUFJSCxhQUFhLElBQUksSUFBSSxFQUFFO2NBQ3pCMkMsTUFBTSxDQUFDRyxZQUFZLENBQUM5QyxhQUFhLENBQUM7Y0FDbENBLGFBQWEsR0FBRyxJQUFJO1lBQ3RCO1lBQ0EsSUFBSUQsY0FBYyxJQUFJLElBQUksRUFBRTtjQUMxQixJQUFNOEMsTUFBTSxHQUFHOUMsY0FBYztjQUM3QkEsY0FBYyxHQUFHLElBQUk7Y0FDckJFLGFBQWEsQ0FBQzRDLE1BQU0sQ0FBQztZQUN2QjtVQUNGLENBQUM7VUFFS3pDLE1BQU0sSUFBQWYsY0FBQSxHQUFHSixRQUFRLENBQUM4RCxJQUFJLGNBQUExRCxjQUFBLHVCQUFiQSxjQUFBLENBQWUyRCxTQUFTLENBQUMsQ0FBQztVQUFBLElBQ3BDNUMsTUFBTTtZQUFBOEIsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE1BQ0gsSUFBSWEsS0FBSyxDQUFDLHFCQUFxQixDQUFDO1FBQUE7VUFHbEM1QyxPQUFPLEdBQUcsSUFBSTZDLFdBQVcsQ0FBQyxDQUFDO1VBQzdCNUMsTUFBTSxHQUFHLEVBQUU7VUFDWEMsa0JBQWtCLEdBQUcsRUFBRTtVQUN2QkMsaUJBQWlCLEdBQUcsS0FBSztVQUV2QkMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FBQSxFQUFTO1lBQUEsSUFBQTBDLHFCQUFBO1lBQ2pDLElBQUkzQyxpQkFBaUIsRUFBRTtZQUN2QkEsaUJBQWlCLEdBQUcsSUFBSTtZQUN4QnBDLEtBQUssQ0FBQyxDQUFDLENBQUNnRixTQUFTLENBQUM3RSxTQUFTLEVBQUU7Y0FBRThFLFNBQVMsRUFBRSxJQUFJO2NBQUVDLFNBQVMsRUFBRTtZQUFLLENBQUMsQ0FBQztZQUNsRWxGLEtBQUssQ0FBQyxDQUFDLENBQUNtRixTQUFTLENBQUNoRixTQUFTLEVBQUUsU0FBUyxDQUFDO1lBQ3ZDSCxLQUFLLENBQUMsQ0FBQyxDQUFDb0YsV0FBVyxDQUFDakYsU0FBUyxFQUFFaEIsd0JBQXdCLENBQUNzQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFBc0QscUJBQUEsR0FBQXZELFNBQVMsQ0FBQzZELGNBQWMsY0FBQU4scUJBQUEsZUFBeEJBLHFCQUFBLENBQUFULElBQUEsQ0FBQTlDLFNBQTJCLENBQUM7VUFDOUIsQ0FBQztVQUVLYyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFJZ0IsS0FBYSxFQUFLO1lBQzFDLElBQUksQ0FBQ0EsS0FBSyxFQUFFO1lBQ1puQixrQkFBa0IsR0FBRzVDLGdCQUFnQixDQUFDNEMsa0JBQWtCLEVBQUVtQixLQUFLLENBQUM7WUFDaEV4QixhQUFhLENBQUNLLGtCQUFrQixDQUFDO1VBQ25DLENBQUM7VUFFS0ksbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBSStDLE9BQWdDLEVBQUs7WUFBQSxJQUFBQyxpQkFBQSxFQUFBQyxxQkFBQSxFQUFBQyxxQkFBQTtZQUNoRSxJQUFNQyxZQUFZLEdBQUlKLE9BQU8sQ0FBQ3BCLE9BQU8sSUFBZS9CLGtCQUFrQjtZQUN0RSxJQUFNd0QsT0FBTyxHQUFHTCxPQUFPLENBQUNLLE9BQU8sSUFBSSxJQUFJO1lBQ3ZDLElBQU1DLGVBQWUsR0FBSU4sT0FBTyxDQUFDTyxpQkFBaUIsSUFBZSxFQUFFO1lBQ25FLElBQU1DLFdBQVcsR0FBR0MsS0FBSyxDQUFDQyxPQUFPLENBQUNWLE9BQU8sQ0FBQ1EsV0FBVyxDQUFDLEdBQUdSLE9BQU8sQ0FBQ1EsV0FBVyxHQUFHLElBQUk7WUFDbkYsSUFBSUcsV0FBNEIsR0FBRyxJQUFJO1lBQ3ZDLElBQUlGLEtBQUssQ0FBQ0MsT0FBTyxDQUFDVixPQUFPLENBQUNZLGFBQWEsQ0FBQyxFQUFFO2NBQ3hDRCxXQUFXLEdBQUdYLE9BQU8sQ0FBQ1ksYUFBeUI7WUFDakQsQ0FBQyxNQUFNLElBQUlILEtBQUssQ0FBQ0MsT0FBTyxDQUFDVixPQUFPLENBQUNXLFdBQVcsQ0FBQyxFQUFFO2NBQzdDQSxXQUFXLEdBQUdYLE9BQU8sQ0FBQ1csV0FBdUI7WUFDL0M7WUFDQSxJQUFNRSxVQUFVLElBQUFaLGlCQUFBLEdBQUdELE9BQU8sQ0FBQ2MsUUFBUSxjQUFBYixpQkFBQSxjQUFBQSxpQkFBQSxHQUFJRCxPQUFPLENBQUNlLE9BQU87WUFDdEQsSUFBTUMsZ0JBQWdCLEdBQUdILFVBQVUsSUFBSSxJQUFJLElBQUlJLE1BQU0sQ0FBQ0osVUFBVSxDQUFDLENBQUNLLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHRCxNQUFNLENBQUNKLFVBQVUsQ0FBQyxDQUFDSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUk7WUFDbEgsSUFBTUMsV0FBVyxHQUFHbkIsT0FBTyxDQUFDb0IsUUFBNkQ7WUFDekYsSUFBTUMsZUFBZSxJQUFBbkIscUJBQUEsR0FBR2lCLFdBQVcsYUFBWEEsV0FBVyx1QkFBWEEsV0FBVyxDQUFFRyxnQkFBZ0IsY0FBQXBCLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksSUFBSTtZQUU3RHpELFlBQVksQ0FBQyxDQUFDO1lBQ2R2QyxvQkFBb0IsQ0FBQ3FILEtBQUssQ0FBQzFHLFNBQVMsQ0FBQztZQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBRTtjQUFFOEUsU0FBUyxFQUFFLEtBQUs7Y0FBRUMsU0FBUyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1lBQ3BFbEYsS0FBSyxDQUFDLENBQUMsQ0FBQ29GLFdBQVcsQ0FBQ2pGLFNBQVMsRUFBRSxJQUFJLENBQUM7WUFDcENILEtBQUssQ0FBQyxDQUFDLENBQUNtRixTQUFTLENBQUNoRixTQUFTLEVBQUUsVUFBVSxDQUFDO1lBRXhDLElBQU0yRyxhQUFtQyxHQUFHO2NBQzFDNUMsT0FBTyxFQUFFd0IsWUFBWTtjQUNyQkMsT0FBTyxFQUFQQSxPQUFPO2NBQ1BDLGVBQWUsRUFBZkEsZUFBZTtjQUNmRSxXQUFXLEVBQVhBLFdBQVc7Y0FDWEcsV0FBVyxFQUFYQSxXQUFXO2NBQ1hLLGdCQUFnQixFQUFoQkEsZ0JBQWdCO2NBQ2hCSyxlQUFlLEVBQWZBO1lBQ0YsQ0FBQztZQUNELENBQUFsQixxQkFBQSxHQUFBakUsU0FBUyxDQUFDdUYsY0FBYyxjQUFBdEIscUJBQUEsZUFBeEJBLHFCQUFBLENBQUFuQixJQUFBLENBQUE5QyxTQUFTLEVBQWtCc0YsYUFBYSxDQUFDO1VBQzNDLENBQUM7VUFBQWhELFFBQUEsQ0FBQUMsSUFBQTtRQUFBO1VBQUEsS0FHUSxJQUFJO1lBQUFELFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxLQUNMbEQsTUFBTSxDQUFDa0csU0FBUztZQUFBbEQsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUNsQmhDLE1BQU0sQ0FBQ2lGLE1BQU0sQ0FBQyxDQUFDO1VBQUEsT0FBQW5ELFFBQUEsQ0FBQW9ELE1BQUE7UUFBQTtVQUFBcEQsUUFBQSxDQUFBRSxJQUFBO1VBQUEsT0FJYWhDLE1BQU0sQ0FBQ21GLElBQUksQ0FBQyxDQUFDO1FBQUE7VUFBQTNFLGtCQUFBLEdBQUFzQixRQUFBLENBQUFzRCxJQUFBO1VBQW5DM0UsSUFBSSxHQUFBRCxrQkFBQSxDQUFKQyxJQUFJO1VBQUVDLEtBQUssR0FBQUYsa0JBQUEsQ0FBTEUsS0FBSztVQUFBLEtBQ2ZELElBQUk7WUFBQXFCLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFvRCxNQUFBO1FBQUE7VUFBQSxLQUVKcEcsTUFBTSxDQUFDa0csU0FBUztZQUFBbEQsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUNsQmhDLE1BQU0sQ0FBQ2lGLE1BQU0sQ0FBQyxDQUFDO1VBQUEsT0FBQW5ELFFBQUEsQ0FBQW9ELE1BQUE7UUFBQTtVQUlqQmhGLE1BQU0sSUFBSUQsT0FBTyxDQUFDb0YsTUFBTSxDQUFDM0UsS0FBSyxFQUFFO1lBQUU0RSxNQUFNLEVBQUU7VUFBSyxDQUFDLENBQUM7VUFDM0MzRSxLQUFLLEdBQUdULE1BQU0sQ0FBQ3FGLEtBQUssQ0FBQyxNQUFNLENBQUM7VUFDbENyRixNQUFNLEdBQUdTLEtBQUssQ0FBQzZFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTtVQUFBNUUsU0FBQSxHQUFBNkUsMEJBQUEsQ0FFUDlFLEtBQUs7VUFBQW1CLFFBQUEsQ0FBQUMsSUFBQTtVQUFBbkIsU0FBQSxDQUFBOEUsQ0FBQTtRQUFBO1VBQUEsS0FBQTdFLEtBQUEsR0FBQUQsU0FBQSxDQUFBK0UsQ0FBQSxJQUFBbEYsSUFBQTtZQUFBcUIsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFibEIsSUFBSSxHQUFBRCxLQUFBLENBQUFILEtBQUE7VUFBQSxNQUNUSSxJQUFJLENBQUMwRCxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFBQTFDLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFvRCxNQUFBO1FBQUE7VUFBQW5FLFdBQUEsR0FFUUQsSUFBSSxDQUFDeUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFBdkUsWUFBQSxHQUFBNEUsY0FBQSxDQUFBN0UsV0FBQSxNQUF2Q0UsU0FBUyxHQUFBRCxZQUFBLEtBQUVFLFFBQVEsR0FBQUYsWUFBQTtVQUFBLE1BQ3RCLENBQUNDLFNBQVMsSUFBSSxDQUFDQyxRQUFRO1lBQUFZLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFvRCxNQUFBO1FBQUE7VUFFckIvRCxTQUFTLEdBQUdGLFNBQVMsQ0FBQzRFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUNyQixJQUFJLENBQUMsQ0FBQztVQUNuRHBELE9BQU8sR0FBR0YsUUFBUSxDQUFDMkUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQ3JCLElBQUksQ0FBQyxDQUFDO1VBQUExQyxRQUFBLENBQUFDLElBQUE7VUFHN0NWLElBQUksR0FBR3lFLElBQUksQ0FBQ0MsS0FBSyxDQUFDM0UsT0FBTyxDQUFDO1VBQUFNLEVBQUEsR0FFeEJQLFNBQVM7VUFBQVcsUUFBQSxDQUFBRSxJQUFBLEdBQUFOLEVBQUEsS0FDVixVQUFVLFFBQUFBLEVBQUEsS0FRVixPQUFPLFFBQUFBLEVBQUEsS0FPUCxTQUFTLFFBQUFBLEVBQUEsS0FVVCxNQUFNLFFBQUFBLEVBQUEsS0FtQk4sVUFBVSxRQUFBQSxFQUFBLEtBSVYsbUJBQW1CLFFBQUFBLEVBQUEsS0FtQm5CLE9BQU87VUFBQTtRQUFBO1VBbEVWLElBQUksQ0FBQ3RCLGlCQUFpQixFQUFFO1lBQ3RCcEMsS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBRTtjQUFFOEUsU0FBUyxFQUFFO1lBQUssQ0FBQyxDQUFDO1lBQ2pEakYsS0FBSyxDQUFDLENBQUMsQ0FBQ21GLFNBQVMsQ0FBQ2hGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeENILEtBQUssQ0FBQyxDQUFDLENBQUNvRixXQUFXLENBQUNqRixTQUFTLEVBQUU7Y0FBRTZILEtBQUssRUFBRSxVQUFVO2NBQUVDLE9BQU8sRUFBRS9JLHlCQUF5QixDQUFDLENBQUMsRUFBRXVDLENBQUM7WUFBRSxDQUFDLENBQUM7VUFDakc7VUFBQyxPQUFBcUMsUUFBQSxDQUFBb0QsTUFBQTtRQUFBO1VBSUs1RCxLQUFLLEdBQUcsT0FBT0QsSUFBSSxDQUFDYSxPQUFPLEtBQUssUUFBUSxHQUFHYixJQUFJLENBQUNhLE9BQU8sR0FBRyxFQUFFO1VBQ2xFN0Isb0JBQW9CLENBQUMsQ0FBQztVQUN0QkMsZ0JBQWdCLENBQUNnQixLQUFLLENBQUM7VUFBQSxPQUFBUSxRQUFBLENBQUFvRCxNQUFBO1FBQUE7VUFLakI1RCxNQUFLLEdBQUcsT0FBT0QsSUFBSSxDQUFDYSxPQUFPLEtBQUssUUFBUSxHQUFHYixJQUFJLENBQUNhLE9BQU8sR0FBRyxFQUFFO1VBQ2xFN0Isb0JBQW9CLENBQUMsQ0FBQztVQUN0QkMsZ0JBQWdCLENBQUNnQixNQUFLLENBQUM7VUFDdkIsSUFBSWhFLHdCQUF3QixDQUFDK0QsSUFBSSxDQUFDLEVBQUU7WUFDbENkLG1CQUFtQixDQUFDYyxJQUFJLENBQUM7VUFDM0I7VUFBQyxPQUFBUyxRQUFBLENBQUFvRCxNQUFBO1FBQUE7VUFLRCxJQUFJN0QsSUFBSSxDQUFDNkUsSUFBSSxLQUFLLGdCQUFnQixFQUFFO1lBQ2xDbEksS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBRTtjQUFFOEUsU0FBUyxFQUFFO1lBQUssQ0FBQyxDQUFDO1lBQ2pEakYsS0FBSyxDQUFDLENBQUMsQ0FBQ21GLFNBQVMsQ0FBQ2hGLFNBQVMsRUFBRSxVQUFVLENBQUM7VUFDMUMsQ0FBQyxNQUFNLElBQUlrRCxJQUFJLENBQUM0RSxPQUFPLElBQUksT0FBTzVFLElBQUksQ0FBQzRFLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDM0RqSSxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO2NBQUU4RSxTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDakRqRixLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQ29GLFdBQVcsQ0FDakJqRixTQUFTLEVBQ1RmLDZCQUE2QixDQUMzQmlFLElBQUksQ0FBQzRFLE9BQU8sRUFDWnhHLENBQUMsRUFDREMsb0JBQW9CLGFBQXBCQSxvQkFBb0IsY0FBcEJBLG9CQUFvQixHQUFJeUcsU0FBUyxFQUNqQyxPQUFPOUUsSUFBSSxDQUFDK0UsU0FBUyxLQUFLLFFBQVEsR0FBRy9FLElBQUksQ0FBQytFLFNBQVMsR0FBR0QsU0FDeEQsQ0FDRixDQUFDO1VBQ0g7VUFBQyxPQUFBckUsUUFBQSxDQUFBb0QsTUFBQTtRQUFBO1VBSUQzRSxtQkFBbUIsQ0FBQ2MsSUFBSSxDQUFDO1VBQUEsT0FBQVMsUUFBQSxDQUFBb0QsTUFBQTtRQUFBO1VBSXpCbkYsWUFBWSxDQUFDLENBQUM7VUFDUjBCLGdCQUFnQixHQUFHSixJQUFJLENBQUNnRix3QkFBd0IsS0FBSyxJQUFJO1VBQy9EckksS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBRTtZQUFFK0UsU0FBUyxFQUFFO1VBQU0sQ0FBQyxDQUFDO1VBQ2xELElBQUksQ0FBQ3pCLGdCQUFnQixFQUFFO1lBQ3JCekQsS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBRTtjQUFFOEUsU0FBUyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1lBQ2xEekYsb0JBQW9CLENBQUNxSCxLQUFLLENBQUMxRyxTQUFTLENBQUM7WUFDckNILEtBQUssQ0FBQyxDQUFDLENBQUNvRixXQUFXLENBQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDO1VBQ3RDO1VBQ0FILEtBQUssQ0FBQyxDQUFDLENBQUNtRixTQUFTLENBQUNoRixTQUFTLEVBQUUsbUJBQW1CLENBQUM7VUFDakQsQ0FBQXFELHFCQUFBLEdBQUFoQyxTQUFTLENBQUM4RyxrQkFBa0IsY0FBQTlFLHFCQUFBLGVBQTVCQSxxQkFBQSxDQUFBYyxJQUFBLENBQUE5QyxTQUFTLEVBQXNCNkIsSUFBSSxFQUFxQmxCLGtCQUFrQixDQUFDO1VBQzNFLElBQUlzQixnQkFBZ0IsSUFBSXNDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDM0MsSUFBSSxDQUFDa0YsZUFBZSxDQUFDLElBQUlsRixJQUFJLENBQUNrRixlQUFlLENBQUNDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUZ4SSxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO2NBQUU4RSxTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDakRqRixLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQ29GLFdBQVcsQ0FBQ2pGLFNBQVMsRUFBRWQsZ0NBQWdDLENBQUNvQyxDQUFDLEVBQUVDLG9CQUFvQixhQUFwQkEsb0JBQW9CLGNBQXBCQSxvQkFBb0IsR0FBSXlHLFNBQVMsQ0FBQyxDQUFDO1VBQ3hHO1VBQUMsT0FBQXJFLFFBQUEsQ0FBQW9ELE1BQUE7UUFBQTtVQUtEdUIsT0FBTyxDQUFDQyxLQUFLLENBQUMsWUFBWSxFQUFFckYsSUFBSSxDQUFDcUYsS0FBSyxDQUFDO1VBQ3ZDM0csWUFBWSxDQUFDLENBQUM7VUFDZHZDLG9CQUFvQixDQUFDcUgsS0FBSyxDQUFDMUcsU0FBUyxDQUFDO1VBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO1lBQUU4RSxTQUFTLEVBQUUsS0FBSztZQUFFQyxTQUFTLEVBQUU7VUFBTSxDQUFDLENBQUM7VUFDcEVsRixLQUFLLENBQUMsQ0FBQyxDQUFDb0YsV0FBVyxDQUFDakYsU0FBUyxFQUFFLElBQUksQ0FBQztVQUNwQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzJJLFFBQVEsQ0FBQ3hJLFNBQVMsRUFBRTtZQUFFeUksSUFBSSxHQUFBMUgsV0FBQSxHQUFFbUMsSUFBSSxDQUFDcUYsS0FBSyxjQUFBeEgsV0FBQSx1QkFBVkEsV0FBQSxDQUFZMEgsSUFBSTtZQUFFWCxPQUFPLEdBQUE5RyxZQUFBLEdBQUVrQyxJQUFJLENBQUNxRixLQUFLLGNBQUF2SCxZQUFBLHVCQUFWQSxZQUFBLENBQVk4RztVQUFRLENBQUMsQ0FBQztVQUNyRmpJLEtBQUssQ0FBQyxDQUFDLENBQUNtRixTQUFTLENBQUNoRixTQUFTLEVBQUUsT0FBTyxDQUFDO1VBQ3JDLENBQUFpQixrQkFBQSxHQUFBSSxTQUFTLENBQUNxSCxPQUFPLGNBQUF6SCxrQkFBQSxlQUFqQkEsa0JBQUEsQ0FBQWtELElBQUEsQ0FBQTlDLFNBQVMsR0FBQUgsWUFBQSxHQUFXZ0MsSUFBSSxDQUFDcUYsS0FBSyxjQUFBckgsWUFBQSx1QkFBVkEsWUFBQSxDQUFZdUgsSUFBSSxHQUFBdEgsWUFBQSxHQUFFK0IsSUFBSSxDQUFDcUYsS0FBSyxjQUFBcEgsWUFBQSx1QkFBVkEsWUFBQSxDQUFZMkcsT0FBTyxDQUFDO1VBQUEsT0FBQW5FLFFBQUEsQ0FBQW9ELE1BQUE7UUFBQTtVQUkxRHVCLE9BQU8sQ0FBQ0ssSUFBSSxDQUFDLHlCQUF5QixFQUFFM0YsU0FBUyxDQUFDO1VBQUEsT0FBQVcsUUFBQSxDQUFBb0QsTUFBQTtRQUFBO1VBQUFwRCxRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUFBSixHQUFBLEdBQUFHLFFBQUE7VUFJdEQyRSxPQUFPLENBQUNDLEtBQUssQ0FBQyx5QkFBeUIsRUFBQS9FLEdBQUEsRUFBY1AsT0FBTyxDQUFDO1FBQUE7VUFBQVUsUUFBQSxDQUFBRSxJQUFBO1VBQUE7UUFBQTtVQUFBRixRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUFBSCxHQUFBLEdBQUFFLFFBQUE7VUFBQWxCLFNBQUEsQ0FBQW1HLENBQUEsQ0FBQW5GLEdBQUE7UUFBQTtVQUFBRSxRQUFBLENBQUFDLElBQUE7VUFBQW5CLFNBQUEsQ0FBQW9HLENBQUE7VUFBQSxPQUFBbEYsUUFBQSxDQUFBbUYsTUFBQTtRQUFBO1VBQUFuRixRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUtuRWhDLFlBQVksQ0FBQyxDQUFDO1VBQUEsT0FBQStCLFFBQUEsQ0FBQW1GLE1BQUE7UUFBQTtRQUFBO1VBQUEsT0FBQW5GLFFBQUEsQ0FBQW9GLElBQUE7TUFBQTtJQUFBLEdBQUF0SSxPQUFBO0VBQUEsQ0FFakI7RUFBQSxnQkExTktMLGVBQWVBLENBQUE0SSxFQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtJQUFBLE9BQUE3SSxJQUFBLENBQUE4SSxLQUFBLE9BQUFDLFNBQUE7RUFBQTtBQUFBLEdBME5wQjs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLElBQU1DLG9CQUFvQixHQUFHO0VBQ2xDQyxRQUFRLEVBQUV2SixjQUFjO0VBQ3hCd0osY0FBYyxFQUFFckosb0JBQW9CO0VBQ3BDc0osbUJBQW1CLEVBQUUsU0FBckJBLG1CQUFtQkEsQ0FBQTtJQUFBLE9BQWtCNUQsS0FBSyxDQUFDNkQsSUFBSSxDQUFDOUosYUFBYSxDQUFDK0osSUFBSSxDQUFDLENBQUMsQ0FBQztFQUFBO0VBRS9EQyxXQUFXLFdBQVhBLFdBQVdBLENBQUMvSSxNQUF5QixFQUE4QjtJQUFBLE9BQUFOLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsVUFBQW9KLFNBQUE7TUFBQSxJQUFBNUosU0FBQSxFQUFBb0IsYUFBQSxFQUFBeUksT0FBQSxFQUFBeEksU0FBQSxFQUFBQyxDQUFBLEVBQUF3SSxlQUFBLEVBQUE1RCxPQUFBLEVBQUE2RCxTQUFBLEVBQUFDLFVBQUEsRUFBQXJKLE1BQUEsRUFBQUQsUUFBQSxFQUFBdUosbUJBQUEsRUFBQUMsR0FBQTtNQUFBLE9BQUEzSixtQkFBQSxDQUFBbUQsSUFBQSxXQUFBeUcsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUF2RyxJQUFBLEdBQUF1RyxTQUFBLENBQUF0RyxJQUFBO1VBQUE7WUFDdkV0RSxxQ0FBcUMsQ0FBQyxDQUFDO1lBRS9CUyxTQUFTLEdBQWdGWSxNQUFNLENBQS9GWixTQUFTLEVBQUVvQixhQUFhLEdBQWlFUixNQUFNLENBQXBGUSxhQUFhLEVBQUV5SSxPQUFPLEdBQXdEakosTUFBTSxDQUFyRWlKLE9BQU8sRUFBRXhJLFNBQVMsR0FBNkNULE1BQU0sQ0FBNURTLFNBQVMsRUFBRUMsQ0FBQyxHQUEwQ1YsTUFBTSxDQUFqRFUsQ0FBQyxFQUFFd0ksZUFBZSxHQUF5QmxKLE1BQU0sQ0FBOUNrSixlQUFlLEVBQUU1RCxPQUFPLEdBQWdCdEYsTUFBTSxDQUE3QnNGLE9BQU8sRUFBRTZELFNBQVMsR0FBS25KLE1BQU0sQ0FBcEJtSixTQUFTO1lBQUEsS0FFeEZoSyxjQUFjLENBQUNDLFNBQVMsQ0FBQztjQUFBbUssU0FBQSxDQUFBdEcsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBc0csU0FBQSxDQUFBcEQsTUFBQSxXQUNwQjtjQUFFcUQsT0FBTyxFQUFFLEtBQUs7Y0FBRUMsTUFBTSxFQUFFO1lBQWlCLENBQUM7VUFBQTtZQUFBLE1BRWpEbkssb0JBQW9CLENBQUMsQ0FBQyxJQUFJVCxzQkFBc0I7Y0FBQTBLLFNBQUEsQ0FBQXRHLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQXNHLFNBQUEsQ0FBQXBELE1BQUEsV0FDM0M7Y0FBRXFELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRTtZQUFRLENBQUM7VUFBQTtZQUd0Q0wsVUFBVSxHQUFHLElBQUlNLGVBQWUsQ0FBQyxDQUFDO1lBQ2xDM0osTUFBb0IsR0FBRztjQUFFWCxTQUFTLEVBQVRBLFNBQVM7Y0FBRWdLLFVBQVUsRUFBVkEsVUFBVTtjQUFFbkQsU0FBUyxFQUFFO1lBQU0sQ0FBQztZQUN4RWxILGFBQWEsQ0FBQzRLLEdBQUcsQ0FBQ3ZLLFNBQVMsRUFBRVcsTUFBTSxDQUFDO1lBRXBDZCxLQUFLLENBQUMsQ0FBQyxDQUFDMkssYUFBYSxDQUFDeEssU0FBUyxDQUFDO1lBQ2hDSCxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFBeUssYUFBQSxDQUFBQSxhQUFBO2NBQ3pCckosYUFBYSxFQUFiQSxhQUFhO2NBQ2JtSCxLQUFLLEVBQUUsSUFBSTtjQUNYekQsU0FBUyxFQUFFLElBQUk7Y0FDZkMsU0FBUyxFQUFFO1lBQUssR0FDWm1CLE9BQU8sSUFBSSxJQUFJLEdBQUc7Y0FBRUEsT0FBTyxFQUFQQTtZQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDbEM2RCxTQUFTLElBQUksSUFBSSxHQUFHO2NBQUVBLFNBQVMsRUFBVEE7WUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQzNDLENBQUM7WUFDRmxLLEtBQUssQ0FBQyxDQUFDLENBQUNtRixTQUFTLENBQUNoRixTQUFTLEVBQUUsVUFBVSxDQUFDO1lBQ3hDWCxvQkFBb0IsQ0FBQ3FMLEtBQUssQ0FBQzFLLFNBQVMsRUFBRW9CLGFBQWEsQ0FBQztZQUNwRHZCLEtBQUssQ0FBQyxDQUFDLENBQUNvRixXQUFXLENBQUNqRixTQUFTLEVBQUVsQix3QkFBd0IsQ0FBQ3dDLENBQUMsRUFBRXdJLGVBQWUsYUFBZkEsZUFBZSxjQUFmQSxlQUFlLEdBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFBSyxTQUFBLENBQUF2RyxJQUFBO1lBQUF1RyxTQUFBLENBQUF0RyxJQUFBO1lBQUEsT0FHekRoRixJQUFJLENBQUM4TCxZQUFZLENBQUNDLFlBQVksQ0FBQ2YsT0FBTyxFQUFFRyxVQUFVLENBQUNhLE1BQU0sQ0FBQztVQUFBO1lBQTNFbkssUUFBUSxHQUFBeUosU0FBQSxDQUFBbEQsSUFBQTtZQUFBa0QsU0FBQSxDQUFBdEcsSUFBQTtZQUFBLE9BQ1J6RCxlQUFlLENBQUNNLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxNQUFNLENBQUM7VUFBQTtZQUFBdUosU0FBQSxDQUFBdEcsSUFBQTtZQUFBO1VBQUE7WUFBQXNHLFNBQUEsQ0FBQXZHLElBQUE7WUFBQXNHLEdBQUEsR0FBQUMsU0FBQTtZQUUvQyxJQUFJLENBQUN4SixNQUFNLENBQUNrRyxTQUFTLEVBQUU7Y0FDckJ4SCxvQkFBb0IsQ0FBQ3FILEtBQUssQ0FBQzFHLFNBQVMsQ0FBQztjQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBRTtnQkFBRThFLFNBQVMsRUFBRSxLQUFLO2dCQUFFQyxTQUFTLEVBQUU7Y0FBTSxDQUFDLENBQUM7Y0FDcEVsRixLQUFLLENBQUMsQ0FBQyxDQUFDb0YsV0FBVyxDQUFDakYsU0FBUyxFQUFFLElBQUksQ0FBQztjQUNwQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQ21GLFNBQVMsQ0FBQ2hGLFNBQVMsRUFBRSxPQUFPLENBQUM7Y0FDckMsQ0FBQWlLLG1CQUFBLEdBQUE1SSxTQUFTLENBQUNxSCxPQUFPLGNBQUF1QixtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBQTlGLElBQUEsQ0FBQTlDLFNBQW9CLENBQUM7WUFDdkI7VUFBQztZQUFBOEksU0FBQSxDQUFBdkcsSUFBQTtZQUVEakUsYUFBYSxVQUFPLENBQUNLLFNBQVMsQ0FBQztZQUFBLE9BQUFtSyxTQUFBLENBQUFyQixNQUFBO1VBQUE7WUFBQSxPQUFBcUIsU0FBQSxDQUFBcEQsTUFBQSxXQUcxQjtjQUFFcUQsT0FBTyxFQUFFO1lBQUssQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBRCxTQUFBLENBQUFwQixJQUFBO1FBQUE7TUFBQSxHQUFBYSxRQUFBO0lBQUE7RUFDMUIsQ0FBQztFQUVELDBGQUNNa0IsbUJBQW1CLFdBQW5CQSxtQkFBbUJBLENBQUNsSyxNQUFpQyxFQUE4QjtJQUFBLE9BQUFOLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsVUFBQXVLLFNBQUE7TUFBQSxJQUFBQyxLQUFBO01BQUEsSUFBQWhMLFNBQUEsRUFBQW9CLGFBQUEsRUFBQTZKLGVBQUEsRUFBQTVKLFNBQUEsRUFBQUMsQ0FBQSxFQUFBQyxvQkFBQSxFQUFBMkUsT0FBQSxFQUFBNkQsU0FBQSxFQUFBQyxVQUFBLEVBQUFySixNQUFBLEVBQUF1SyxTQUFBLEVBQUF4SyxRQUFBLEVBQUF5SyxtQkFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQTdLLG1CQUFBLENBQUFtRCxJQUFBLFdBQUEySCxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQXpILElBQUEsR0FBQXlILFNBQUEsQ0FBQXhILElBQUE7VUFBQTtZQUN2RnRFLHFDQUFxQyxDQUFDLENBQUM7WUFFL0JTLFNBQVMsR0FBNkZZLE1BQU0sQ0FBNUdaLFNBQVMsRUFBRW9CLGFBQWEsR0FBOEVSLE1BQU0sQ0FBakdRLGFBQWEsRUFBRTZKLGVBQWUsR0FBNkRySyxNQUFNLENBQWxGcUssZUFBZSxFQUFFNUosU0FBUyxHQUFrRFQsTUFBTSxDQUFqRVMsU0FBUyxFQUFFQyxDQUFDLEdBQStDVixNQUFNLENBQXREVSxDQUFDLEVBQUVDLG9CQUFvQixHQUF5QlgsTUFBTSxDQUFuRFcsb0JBQW9CLEVBQUUyRSxPQUFPLEdBQWdCdEYsTUFBTSxDQUE3QnNGLE9BQU8sRUFBRTZELFNBQVMsR0FBS25KLE1BQU0sQ0FBcEJtSixTQUFTO1lBQUEsS0FFckdoSyxjQUFjLENBQUNDLFNBQVMsQ0FBQztjQUFBcUwsU0FBQSxDQUFBeEgsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBd0gsU0FBQSxDQUFBdEUsTUFBQSxXQUNwQjtjQUFFcUQsT0FBTyxFQUFFLEtBQUs7Y0FBRUMsTUFBTSxFQUFFO1lBQWlCLENBQUM7VUFBQTtZQUFBLE1BRWpEbkssb0JBQW9CLENBQUMsQ0FBQyxJQUFJVCxzQkFBc0I7Y0FBQTRMLFNBQUEsQ0FBQXhILElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQXdILFNBQUEsQ0FBQXRFLE1BQUEsV0FDM0M7Y0FBRXFELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRTtZQUFRLENBQUM7VUFBQTtZQUc1QyxJQUFJOUksb0JBQW9CLEVBQUU7Y0FDeEIvQixrQkFBa0IsQ0FBQytLLEdBQUcsQ0FBQ3ZLLFNBQVMsRUFBRXVCLG9CQUFvQixDQUFDO1lBQ3pEO1lBRU15SSxVQUFVLEdBQUcsSUFBSU0sZUFBZSxDQUFDLENBQUM7WUFDbEMzSixNQUFvQixHQUFHO2NBQUVYLFNBQVMsRUFBVEEsU0FBUztjQUFFZ0ssVUFBVSxFQUFWQSxVQUFVO2NBQUVuRCxTQUFTLEVBQUU7WUFBTSxDQUFDO1lBQ3hFbEgsYUFBYSxDQUFDNEssR0FBRyxDQUFDdkssU0FBUyxFQUFFVyxNQUFNLENBQUM7WUFFcENkLEtBQUssQ0FBQyxDQUFDLENBQUMySyxhQUFhLENBQUN4SyxTQUFTLENBQUM7WUFDaENILEtBQUssQ0FBQyxDQUFDLENBQUNnRixTQUFTLENBQUM3RSxTQUFTLEVBQUF5SyxhQUFBLENBQUFBLGFBQUE7Y0FDekJySixhQUFhLEVBQWJBLGFBQWE7Y0FDYm1ILEtBQUssRUFBRSxJQUFJO2NBQ1h6RCxTQUFTLEVBQUUsSUFBSTtjQUNmQyxTQUFTLEVBQUU7WUFBSyxHQUNabUIsT0FBTyxJQUFJLElBQUksR0FBRztjQUFFQSxPQUFPLEVBQVBBO1lBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNsQzZELFNBQVMsSUFBSSxJQUFJLEdBQUc7Y0FBRUEsU0FBUyxFQUFUQTtZQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDM0MsQ0FBQztZQUNGbEssS0FBSyxDQUFDLENBQUMsQ0FBQ21GLFNBQVMsQ0FBQ2hGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeENYLG9CQUFvQixDQUFDcUwsS0FBSyxDQUFDMUssU0FBUyxFQUFFb0IsYUFBYSxDQUFDO1lBQ3BEdkIsS0FBSyxDQUFDLENBQUMsQ0FBQ29GLFdBQVcsQ0FDakJqRixTQUFTLEVBQ1RkLGdDQUFnQyxDQUFDb0MsQ0FBQyxHQUFBMEosS0FBQSxHQUFFekosb0JBQW9CLGFBQXBCQSxvQkFBb0IsY0FBcEJBLG9CQUFvQixHQUFJL0Isa0JBQWtCLENBQUNzRSxHQUFHLENBQUM5RCxTQUFTLENBQUMsY0FBQWdMLEtBQUEsY0FBQUEsS0FBQSxHQUFJaEQsU0FBUyxDQUM1RyxDQUFDO1lBRUtrRCxTQUE0QixHQUFHO2NBQ25DbEwsU0FBUyxFQUFUQSxTQUFTO2NBQ1RvQixhQUFhLEVBQWJBLGFBQWE7Y0FDYnlJLE9BQU8sRUFBRSxDQUFDLENBQXdCO2NBQ2xDeEksU0FBUyxFQUFUQSxTQUFTO2NBQ1RDLENBQUMsRUFBREEsQ0FBQztjQUNEQyxvQkFBb0IsRUFBRUEsb0JBQW9CLGFBQXBCQSxvQkFBb0IsY0FBcEJBLG9CQUFvQixHQUFJL0Isa0JBQWtCLENBQUNzRSxHQUFHLENBQUM5RCxTQUFTLENBQUM7Y0FDL0VrRyxPQUFPLEVBQVBBLE9BQU87Y0FDUDZELFNBQVMsRUFBVEE7WUFDRixDQUFDO1lBQUFzQixTQUFBLENBQUF6SCxJQUFBO1lBQUF5SCxTQUFBLENBQUF4SCxJQUFBO1lBQUEsT0FHd0JoRixJQUFJLENBQUM4TCxZQUFZLENBQUNXLGNBQWMsQ0FBQ0wsZUFBZSxFQUFFakIsVUFBVSxDQUFDYSxNQUFNLENBQUM7VUFBQTtZQUFyRm5LLFFBQVEsR0FBQTJLLFNBQUEsQ0FBQXBFLElBQUE7WUFBQSxJQUNUdkcsUUFBUSxDQUFDNkssRUFBRTtjQUFBRixTQUFBLENBQUF4SCxJQUFBO2NBQUE7WUFBQTtZQUFBLE1BQ1IsSUFBSWEsS0FBSyw0QkFBQThHLE1BQUEsQ0FBNEI5SyxRQUFRLENBQUMrSyxNQUFNLENBQUUsQ0FBQztVQUFBO1lBQUFKLFNBQUEsQ0FBQXhILElBQUE7WUFBQSxPQUV6RHpELGVBQWUsQ0FBQ00sUUFBUSxFQUFFQyxNQUFNLEVBQUV1SyxTQUFTLENBQUM7VUFBQTtZQUFBRyxTQUFBLENBQUF4SCxJQUFBO1lBQUE7VUFBQTtZQUFBd0gsU0FBQSxDQUFBekgsSUFBQTtZQUFBd0gsR0FBQSxHQUFBQyxTQUFBO1lBRWxELElBQUksQ0FBQzFLLE1BQU0sQ0FBQ2tHLFNBQVMsRUFBRTtjQUNyQnhILG9CQUFvQixDQUFDcUgsS0FBSyxDQUFDMUcsU0FBUyxDQUFDO2NBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO2dCQUFFOEUsU0FBUyxFQUFFLEtBQUs7Z0JBQUVDLFNBQVMsRUFBRTtjQUFNLENBQUMsQ0FBQztjQUNwRWxGLEtBQUssQ0FBQyxDQUFDLENBQUNvRixXQUFXLENBQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDO2NBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLE9BQU8sQ0FBQztjQUNyQyxDQUFBbUwsbUJBQUEsR0FBQTlKLFNBQVMsQ0FBQ3FILE9BQU8sY0FBQXlDLG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFBaEgsSUFBQSxDQUFBOUMsU0FBb0IsQ0FBQztZQUN2QjtVQUFDO1lBQUFnSyxTQUFBLENBQUF6SCxJQUFBO1lBRURqRSxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQy9CUixrQkFBa0IsQ0FBQ2tILEtBQUssQ0FBQzFHLFNBQVMsQ0FBQztZQUFBLE9BQUFxTCxTQUFBLENBQUF2QyxNQUFBO1VBQUE7WUFBQSxPQUFBdUMsU0FBQSxDQUFBdEUsTUFBQSxXQUc5QjtjQUFFcUQsT0FBTyxFQUFFO1lBQUssQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBaUIsU0FBQSxDQUFBdEMsSUFBQTtRQUFBO01BQUEsR0FBQWdDLFFBQUE7SUFBQTtFQUMxQixDQUFDO0VBRUQsaUdBQ01XLGdCQUFnQixXQUFoQkEsZ0JBQWdCQSxDQUFDOUssTUFBOEIsRUFBOEI7SUFBQSxPQUFBTixpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLFVBQUFtTCxTQUFBO01BQUEsSUFBQTNMLFNBQUEsRUFBQW9CLGFBQUEsRUFBQXdLLFlBQUEsRUFBQXZLLFNBQUEsRUFBQUMsQ0FBQSxFQUFBd0ksZUFBQSxFQUFBNUQsT0FBQSxFQUFBNkQsU0FBQSxFQUFBQyxVQUFBLEVBQUFySixNQUFBLEVBQUF1SyxTQUFBLEVBQUF4SyxRQUFBLEVBQUFtTCxNQUFBLEVBQUEzSSxJQUFBLEVBQUE0SSxtQkFBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUE7TUFBQSxPQUFBekwsbUJBQUEsQ0FBQW1ELElBQUEsV0FBQXVJLFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBckksSUFBQSxHQUFBcUksU0FBQSxDQUFBcEksSUFBQTtVQUFBO1lBQ2pGdEUscUNBQXFDLENBQUMsQ0FBQztZQUUvQlMsU0FBUyxHQUFxRlksTUFBTSxDQUFwR1osU0FBUyxFQUFFb0IsYUFBYSxHQUFzRVIsTUFBTSxDQUF6RlEsYUFBYSxFQUFFd0ssWUFBWSxHQUF3RGhMLE1BQU0sQ0FBMUVnTCxZQUFZLEVBQUV2SyxTQUFTLEdBQTZDVCxNQUFNLENBQTVEUyxTQUFTLEVBQUVDLENBQUMsR0FBMENWLE1BQU0sQ0FBakRVLENBQUMsRUFBRXdJLGVBQWUsR0FBeUJsSixNQUFNLENBQTlDa0osZUFBZSxFQUFFNUQsT0FBTyxHQUFnQnRGLE1BQU0sQ0FBN0JzRixPQUFPLEVBQUU2RCxTQUFTLEdBQUtuSixNQUFNLENBQXBCbUosU0FBUztZQUFBLEtBRTdGaEssY0FBYyxDQUFDQyxTQUFTLENBQUM7Y0FBQWlNLFNBQUEsQ0FBQXBJLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQW9JLFNBQUEsQ0FBQWxGLE1BQUEsV0FDcEI7Y0FBRXFELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRTtZQUFpQixDQUFDO1VBQUE7WUFBQSxNQUVqRG5LLG9CQUFvQixDQUFDLENBQUMsSUFBSVQsc0JBQXNCO2NBQUF3TSxTQUFBLENBQUFwSSxJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUFvSSxTQUFBLENBQUFsRixNQUFBLFdBQzNDO2NBQUVxRCxPQUFPLEVBQUUsS0FBSztjQUFFQyxNQUFNLEVBQUU7WUFBUSxDQUFDO1VBQUE7WUFHdENMLFVBQVUsR0FBRyxJQUFJTSxlQUFlLENBQUMsQ0FBQztZQUNsQzNKLE1BQW9CLEdBQUc7Y0FBRVgsU0FBUyxFQUFUQSxTQUFTO2NBQUVnSyxVQUFVLEVBQVZBLFVBQVU7Y0FBRW5ELFNBQVMsRUFBRTtZQUFNLENBQUM7WUFDeEVsSCxhQUFhLENBQUM0SyxHQUFHLENBQUN2SyxTQUFTLEVBQUVXLE1BQU0sQ0FBQztZQUVwQ2QsS0FBSyxDQUFDLENBQUMsQ0FBQzJLLGFBQWEsQ0FBQ3hLLFNBQVMsQ0FBQztZQUNoQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQ2dGLFNBQVMsQ0FBQzdFLFNBQVMsRUFBQXlLLGFBQUEsQ0FBQUEsYUFBQTtjQUN6QnJKLGFBQWEsRUFBYkEsYUFBYTtjQUNibUgsS0FBSyxFQUFFLElBQUk7Y0FDWHpELFNBQVMsRUFBRSxJQUFJO2NBQ2ZDLFNBQVMsRUFBRTtZQUFLLEdBQ1ptQixPQUFPLElBQUksSUFBSSxHQUFHO2NBQUVBLE9BQU8sRUFBUEE7WUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ2xDNkQsU0FBUyxJQUFJLElBQUksR0FBRztjQUFFQSxTQUFTLEVBQVRBO1lBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUMzQyxDQUFDO1lBQ0ZsSyxLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q1gsb0JBQW9CLENBQUNxTCxLQUFLLENBQUMxSyxTQUFTLEVBQUVvQixhQUFhLENBQUM7WUFDcER2QixLQUFLLENBQUMsQ0FBQyxDQUFDb0YsV0FBVyxDQUFDakYsU0FBUyxFQUFFbEIsd0JBQXdCLENBQUN3QyxDQUFDLEVBQUV3SSxlQUFlLGFBQWZBLGVBQWUsY0FBZkEsZUFBZSxHQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUVvQixTQUE0QixHQUFHO2NBQ25DbEwsU0FBUyxFQUFUQSxTQUFTO2NBQ1RvQixhQUFhLEVBQWJBLGFBQWE7Y0FDYnlJLE9BQU8sRUFBRSxDQUFDLENBQXdCO2NBQ2xDeEksU0FBUyxFQUFUQSxTQUFTO2NBQ1RDLENBQUMsRUFBREEsQ0FBQztjQUNEd0ksZUFBZSxFQUFmQSxlQUFlO2NBQ2Y1RCxPQUFPLEVBQVBBLE9BQU87Y0FDUDZELFNBQVMsRUFBVEE7WUFDRixDQUFDO1lBQUFrQyxTQUFBLENBQUFySSxJQUFBO1lBQUFxSSxTQUFBLENBQUFwSSxJQUFBO1lBQUEsT0FHd0JoRixJQUFJLENBQUM4TCxZQUFZLENBQUN1QixlQUFlLENBQUNOLFlBQVksRUFBRTVCLFVBQVUsQ0FBQ2EsTUFBTSxDQUFDO1VBQUE7WUFBbkZuSyxRQUFRLEdBQUF1TCxTQUFBLENBQUFoRixJQUFBO1lBQUEsSUFDVHZHLFFBQVEsQ0FBQzZLLEVBQUU7Y0FBQVUsU0FBQSxDQUFBcEksSUFBQTtjQUFBO1lBQUE7WUFBQSxNQUNWbkQsUUFBUSxDQUFDK0ssTUFBTSxLQUFLLEdBQUc7Y0FBQVEsU0FBQSxDQUFBcEksSUFBQTtjQUFBO1lBQUE7WUFBQW9JLFNBQUEsQ0FBQXJJLElBQUE7WUFBQXFJLFNBQUEsQ0FBQXBJLElBQUE7WUFBQSxPQUdIbkQsUUFBUSxDQUFDeUwsSUFBSSxDQUFDLENBQUM7VUFBQTtZQUE3QmpKLElBQUksR0FBQStJLFNBQUEsQ0FBQWhGLElBQUE7WUFDVjRFLE1BQU0sR0FBRyxPQUFPM0ksSUFBSSxDQUFDMkksTUFBTSxLQUFLLFFBQVEsR0FBRzNJLElBQUksQ0FBQzJJLE1BQU0sR0FBRzdELFNBQVM7WUFBQWlFLFNBQUEsQ0FBQXBJLElBQUE7WUFBQTtVQUFBO1lBQUFvSSxTQUFBLENBQUFySSxJQUFBO1lBQUFtSSxHQUFBLEdBQUFFLFNBQUE7WUFFbEVKLE1BQU0sR0FBRzdELFNBQVM7VUFBQTtZQUFBLE1BRWhCNkQsTUFBTSxLQUFLLGdCQUFnQjtjQUFBSSxTQUFBLENBQUFwSSxJQUFBO2NBQUE7WUFBQTtZQUM3QnhFLG9CQUFvQixDQUFDcUgsS0FBSyxDQUFDMUcsU0FBUyxDQUFDO1lBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO2NBQUU4RSxTQUFTLEVBQUUsS0FBSztjQUFFQyxTQUFTLEVBQUUsS0FBSztjQUFFM0QsYUFBYSxFQUFFO1lBQUssQ0FBQyxDQUFDO1lBQ3pGdkIsS0FBSyxDQUFDLENBQUMsQ0FBQ29GLFdBQVcsQ0FBQ2pGLFNBQVMsRUFBRSxJQUFJLENBQUM7WUFDcENILEtBQUssQ0FBQyxDQUFDLENBQUNtRixTQUFTLENBQUNoRixTQUFTLEVBQUUsTUFBTSxDQUFDO1lBQ3BDTCxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQUEsT0FBQWlNLFNBQUEsQ0FBQWxGLE1BQUEsV0FDeEI7Y0FBRXFELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRTtZQUFpQixDQUFDO1VBQUE7WUFBQSxNQUdqRCxJQUFJM0YsS0FBSyw2QkFBQThHLE1BQUEsQ0FBNkI5SyxRQUFRLENBQUMrSyxNQUFNLENBQUUsQ0FBQztVQUFBO1lBQUFRLFNBQUEsQ0FBQXBJLElBQUE7WUFBQSxPQUUxRHpELGVBQWUsQ0FBQ00sUUFBUSxFQUFFQyxNQUFNLEVBQUV1SyxTQUFTLENBQUM7VUFBQTtZQUFBZSxTQUFBLENBQUFwSSxJQUFBO1lBQUE7VUFBQTtZQUFBb0ksU0FBQSxDQUFBckksSUFBQTtZQUFBb0ksR0FBQSxHQUFBQyxTQUFBO1lBRWxELElBQUksQ0FBQ3RMLE1BQU0sQ0FBQ2tHLFNBQVMsRUFBRTtjQUNyQnhILG9CQUFvQixDQUFDcUgsS0FBSyxDQUFDMUcsU0FBUyxDQUFDO2NBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO2dCQUFFOEUsU0FBUyxFQUFFLEtBQUs7Z0JBQUVDLFNBQVMsRUFBRTtjQUFNLENBQUMsQ0FBQztjQUNwRWxGLEtBQUssQ0FBQyxDQUFDLENBQUNvRixXQUFXLENBQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDO2NBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLE9BQU8sQ0FBQztjQUNyQyxDQUFBOEwsbUJBQUEsR0FBQXpLLFNBQVMsQ0FBQ3FILE9BQU8sY0FBQW9ELG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFBM0gsSUFBQSxDQUFBOUMsU0FBb0IsQ0FBQztZQUN2QjtVQUFDO1lBQUE0SyxTQUFBLENBQUFySSxJQUFBO1lBRURqRSxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQUEsT0FBQWlNLFNBQUEsQ0FBQW5ELE1BQUE7VUFBQTtZQUFBLE9BQUFtRCxTQUFBLENBQUFsRixNQUFBLFdBRzFCO2NBQUVxRCxPQUFPLEVBQUU7WUFBSyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUE2QixTQUFBLENBQUFsRCxJQUFBO1FBQUE7TUFBQSxHQUFBNEMsUUFBQTtJQUFBO0VBQzFCLENBQUM7RUFFRCwrREFDQVMsVUFBVSxXQUFWQSxVQUFVQSxDQUFDcE0sU0FBaUIsRUFBRXFCLFNBQWtDLEVBQUU7SUFBQSxJQUFBZ0wsaUJBQUE7SUFDaEUsSUFBTTFMLE1BQU0sR0FBR2hCLGFBQWEsQ0FBQ21FLEdBQUcsQ0FBQzlELFNBQVMsQ0FBQztJQUMzQyxJQUFJLENBQUNXLE1BQU0sRUFBRTtJQUNiQSxNQUFNLENBQUNrRyxTQUFTLEdBQUcsSUFBSTtJQUN2QmxHLE1BQU0sQ0FBQ3FKLFVBQVUsQ0FBQ3NDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCM00sYUFBYSxVQUFPLENBQUNLLFNBQVMsQ0FBQztJQUMvQjtJQUNBO0lBQ0EsSUFBTXVNLFdBQVcsR0FBR2xOLG9CQUFvQixDQUFDbU4sV0FBVyxDQUFDeE0sU0FBUyxDQUFDLENBQUN5TSxJQUFJO0lBQ3BFcE4sb0JBQW9CLENBQUNxSCxLQUFLLENBQUMxRyxTQUFTLENBQUM7SUFDckNILEtBQUssQ0FBQyxDQUFDLENBQUNnRixTQUFTLENBQUM3RSxTQUFTLEVBQUU7TUFBRThFLFNBQVMsRUFBRSxLQUFLO01BQUVDLFNBQVMsRUFBRTtJQUFNLENBQUMsQ0FBQztJQUNwRWxGLEtBQUssQ0FBQyxDQUFDLENBQUNvRixXQUFXLENBQUNqRixTQUFTLEVBQUUsSUFBSSxDQUFDO0lBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLFdBQVcsQ0FBQztJQUN6Q3FCLFNBQVMsYUFBVEEsU0FBUyxnQkFBQWdMLGlCQUFBLEdBQVRoTCxTQUFTLENBQUVxTCxNQUFNLGNBQUFMLGlCQUFBLGVBQWpCQSxpQkFBQSxDQUFBbEksSUFBQSxDQUFBOUMsU0FBUyxFQUFXa0wsV0FBVyxDQUFDO0VBQ2xDLENBQUM7RUFFRCw4REFDQUksYUFBYSxXQUFiQSxhQUFhQSxDQUFDM00sU0FBaUIsRUFBRTtJQUFBLElBQUE0TSxjQUFBO0lBQy9CLElBQU1qTSxNQUFNLEdBQUdoQixhQUFhLENBQUNtRSxHQUFHLENBQUM5RCxTQUFTLENBQUM7SUFDM0MsSUFBSSxDQUFDVyxNQUFNLEVBQUU7SUFDYkEsTUFBTSxDQUFDa0csU0FBUyxHQUFHLElBQUk7SUFDdkJsRyxNQUFNLENBQUNxSixVQUFVLENBQUNzQyxLQUFLLENBQUMsQ0FBQztJQUN6QjNNLGFBQWEsVUFBTyxDQUFDSyxTQUFTLENBQUM7SUFDL0JYLG9CQUFvQixDQUFDcUgsS0FBSyxDQUFDMUcsU0FBUyxDQUFDO0lBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDZ0YsU0FBUyxDQUFDN0UsU0FBUyxFQUFFO01BQUU4RSxTQUFTLEVBQUUsS0FBSztNQUFFQyxTQUFTLEVBQUU7SUFBTSxDQUFDLENBQUM7SUFDcEVsRixLQUFLLENBQUMsQ0FBQyxDQUFDb0YsV0FBVyxDQUFDakYsU0FBUyxFQUFFLElBQUksQ0FBQztJQUNwQyxJQUFJLEVBQUE0TSxjQUFBLEdBQUEvTSxLQUFLLENBQUMsQ0FBQyxDQUFDZ04sT0FBTyxDQUFDN00sU0FBUyxDQUFDLGNBQUE0TSxjQUFBLHVCQUExQkEsY0FBQSxDQUE0Qm5CLE1BQU0sTUFBSyxVQUFVLEVBQUU7TUFDckQ1TCxLQUFLLENBQUMsQ0FBQyxDQUFDbUYsU0FBUyxDQUFDaEYsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUN0QztFQUNGLENBQUM7RUFFRDhNLFFBQVEsV0FBUkEsUUFBUUEsQ0FBQSxFQUFHO0lBQUEsSUFBQUMsS0FBQTtJQUNUbkgsS0FBSyxDQUFDNkQsSUFBSSxDQUFDOUosYUFBYSxDQUFDK0osSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDc0QsT0FBTyxDQUFDLFVBQUFoTixTQUFTO01BQUEsT0FBSStNLEtBQUksQ0FBQ0osYUFBYSxDQUFDM00sU0FBUyxDQUFDO0lBQUEsRUFBQztFQUN0RjtBQUNGLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|