@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,1233 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
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; }
|
|
4
|
+
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; }
|
|
5
|
+
/* eslint-disable no-restricted-syntax */
|
|
6
|
+
/* eslint-disable no-continue */
|
|
7
|
+
/* eslint-disable no-void */
|
|
8
|
+
/* eslint-disable react/no-array-index-key */
|
|
9
|
+
/* eslint-disable no-lonely-if */
|
|
10
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
11
|
+
/* eslint-disable prefer-destructuring */
|
|
12
|
+
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
13
|
+
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
14
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
15
|
+
import { createPortal } from 'react-dom';
|
|
16
|
+
import { Popover } from '@mui/material';
|
|
17
|
+
import { Check } from '@projectcor/icons/lib/components/Check';
|
|
18
|
+
import { Cross } from '@projectcor/icons/lib/components/Cross';
|
|
19
|
+
import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
|
|
20
|
+
import { ActiveToolChipIconButton, ActiveToolChipLabel, ActiveToolChipRoot, PlusMenuDivider, PlusMenuInnerColumn, PlusMenuItemButton, PlusMenuItemLabel, PlusMenuPaper, PlusMenuToolsRow, PlusToggleButton, SkillsToggleButton, SCInputChipsRow, SCInputMetaIconButton, SCInputMetaIndicators, SCMIAttachment, SCMIAttachmentDeleteIcon, SCMIAttachmentFileIcon, SCMIAttachmentIcon, SCMIAttachmentName, StyledMAIAInputWrapper, StyledMAIASendButton, StyledMAIAMainToolbarGrid, SCInputEditorCell, SCInputToolbarRow, StyledMAIAPlusToolbarCell, StyledMAIASendToolbarCell, StyledMAIAStopButton, StyledMAIAStopIcon, StyledMAIADropOverlay } from './styles';
|
|
21
|
+
import { getMaiaInputEditorMaxHeight, MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX } from './maiaInputLayout';
|
|
22
|
+
import { useGlobalContext } from '../../../context/global-context';
|
|
23
|
+
import { ModalFileExceeds } from '../../organisms/ModalFileExceeds';
|
|
24
|
+
import { SlashCommandDropdown } from '../SlashCommandDropdown';
|
|
25
|
+
import { SkillsDropdown } from '../SkillsDropdown';
|
|
26
|
+
import { useSlashCommands } from '../../../hooks/useSlashCommands';
|
|
27
|
+
import { useSkillsCatalog } from '../../../hooks/useSkillsCatalog';
|
|
28
|
+
import { canAccessToSkills } from '../../../constants/permissions';
|
|
29
|
+
import { useUser } from '../../../context/cor-user';
|
|
30
|
+
import { resolveQuickActionType } from '../../../utils/hoursPlannerQuickActionType';
|
|
31
|
+
import { useT } from '../../../hooks/useT';
|
|
32
|
+
import { MaiaInputAddIcon } from '../icons/MaiaInputAddIcon';
|
|
33
|
+
import { MaiaInputAttachIcon } from '../icons/MaiaInputAttachIcon';
|
|
34
|
+
import { MaiaInputAttachmentImageIcon } from '../icons/MaiaInputAttachmentImageIcon';
|
|
35
|
+
import { MaiaInputDeepSearchIcon } from '../icons/MaiaInputDeepSearchIcon';
|
|
36
|
+
import { CorAccessIcon } from '../icons/CorAccessIcon';
|
|
37
|
+
import { MaiaInputMentionIcon } from '../icons/MaiaInputMentionIcon';
|
|
38
|
+
import { MaiaInputRobotIcon } from '../icons/MaiaInputRobotIcon';
|
|
39
|
+
import { MaiaInputSendIcon } from '../icons/MaiaInputSendIcon';
|
|
40
|
+
import { MaiaInputSlashIcon } from '../icons/MaiaInputSlashIcon';
|
|
41
|
+
import { SkillIcon } from '../icons/SkillIcon';
|
|
42
|
+
import { MaiaInputWebSearchIcon } from '../icons/MaiaInputWebSearchIcon';
|
|
43
|
+
import { EVENTS, useEvent } from '../../../hooks/useEvent';
|
|
44
|
+
import { getChatToolsMenuAgentType } from '../../../utils/hitlAnalytics';
|
|
45
|
+
import { MAIA_CHAT_INPUT_UI } from '../../../styles/config';
|
|
46
|
+
import { allowedFileTypes, fileTypes, getMaxAttachmentSizeMb, MAX_CHAT_INPUT_ATTACHMENTS } from '../../../constants/formatExtensions';
|
|
47
|
+
import { APPCUES_EVENTS, trackAppcuesEvent } from '../../../services/appcues';
|
|
48
|
+
import { Chip } from '../Chip';
|
|
49
|
+
import { ContextMentionEditor } from '../ContextMentionEditor';
|
|
50
|
+
import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
|
|
51
|
+
// eslint-disable-next-line import/no-cycle
|
|
52
|
+
import { useMentionPopover } from '../../../hooks/useMentionPopover';
|
|
53
|
+
import { useCaretPosition } from '../../../hooks/useCaretPosition';
|
|
54
|
+
import { dataTransferHasFiles, filesFromDataTransfer } from '../../../utils/chatInputFiles';
|
|
55
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
56
|
+
var TOOL_CHIP_EXIT_MS = 220;
|
|
57
|
+
var SLASH_DROPDOWN_WIDTH_PX = 340;
|
|
58
|
+
var SLASH_DROPDOWN_MAX_HEIGHT_PX = 416;
|
|
59
|
+
var SKILLS_DROPDOWN_WIDTH_PX = 339;
|
|
60
|
+
var SLASH_DROPDOWN_GAP_PX = 4;
|
|
61
|
+
var SLASH_DROPDOWN_VIEWPORT_PAD_PX = 8;
|
|
62
|
+
export var MAIAInput = function MAIAInput(_ref) {
|
|
63
|
+
var _agent$entity, _contextChip$items, _contextChip$items2, _agent$connectors, _agent$model_display_, _contextChip$items3;
|
|
64
|
+
var onSendMessage = _ref.onSendMessage,
|
|
65
|
+
className = _ref.className,
|
|
66
|
+
disabled = _ref.disabled,
|
|
67
|
+
isStreaming = _ref.isStreaming,
|
|
68
|
+
isWriting = _ref.isWriting,
|
|
69
|
+
onStopGeneration = _ref.onStopGeneration,
|
|
70
|
+
placeholder = _ref.placeholder,
|
|
71
|
+
onChange = _ref.onChange,
|
|
72
|
+
onFocus = _ref.onFocus,
|
|
73
|
+
_ref$alignButtons = _ref.alignButtons,
|
|
74
|
+
alignButtons = _ref$alignButtons === void 0 ? 'vertical' : _ref$alignButtons,
|
|
75
|
+
onFileAttach = _ref.onFileAttach,
|
|
76
|
+
onDeleteAttachment = _ref.onDeleteAttachment,
|
|
77
|
+
_ref$attachments = _ref.attachments,
|
|
78
|
+
attachments = _ref$attachments === void 0 ? [] : _ref$attachments,
|
|
79
|
+
chatId = _ref.chatId,
|
|
80
|
+
newChatKey = _ref.newChatKey,
|
|
81
|
+
tooltipZIndex = _ref.tooltipZIndex,
|
|
82
|
+
externalPopoverAnchorRef = _ref.popoverAnchorRef,
|
|
83
|
+
layoutMode = _ref.layoutMode,
|
|
84
|
+
contextChip = _ref.contextChip;
|
|
85
|
+
var _useT = useT(),
|
|
86
|
+
t = _useT.t;
|
|
87
|
+
var editorRef = useRef(null);
|
|
88
|
+
var fileInputRef = useRef(null);
|
|
89
|
+
var chipsRowRef = useRef(null);
|
|
90
|
+
var toolbarRowRef = useRef(null);
|
|
91
|
+
var internalWrapperRef = useRef(null);
|
|
92
|
+
var wrapperRef = externalPopoverAnchorRef !== null && externalPopoverAnchorRef !== void 0 ? externalPopoverAnchorRef : internalWrapperRef;
|
|
93
|
+
var _useState = useState(false),
|
|
94
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
95
|
+
hasTypingPresence = _useState2[0],
|
|
96
|
+
setHasTypingPresence = _useState2[1];
|
|
97
|
+
var _useState3 = useState(0),
|
|
98
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
99
|
+
chipsRowHeight = _useState4[0],
|
|
100
|
+
setChipsRowHeight = _useState4[1];
|
|
101
|
+
var _useState5 = useState(MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX),
|
|
102
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
103
|
+
toolbarRowHeight = _useState6[0],
|
|
104
|
+
setToolbarRowHeight = _useState6[1];
|
|
105
|
+
var _useState7 = useState({
|
|
106
|
+
isOpen: false,
|
|
107
|
+
excludedFiles: [],
|
|
108
|
+
exceededFiles: [],
|
|
109
|
+
fileSizes: {}
|
|
110
|
+
}),
|
|
111
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
112
|
+
modalProps = _useState8[0],
|
|
113
|
+
setModalProps = _useState8[1];
|
|
114
|
+
var eventAmplitude = useEvent();
|
|
115
|
+
var _useGlobalContext = useGlobalContext(),
|
|
116
|
+
toggleWebSearch = _useGlobalContext.toggleWebSearch,
|
|
117
|
+
isWebSearchActive = _useGlobalContext.isWebSearchActive,
|
|
118
|
+
toggleDeepSearch = _useGlobalContext.toggleDeepSearch,
|
|
119
|
+
isDeepSearchActive = _useGlobalContext.isDeepSearchActive,
|
|
120
|
+
agent = _useGlobalContext.agent,
|
|
121
|
+
initialDraft = _useGlobalContext.initialDraft,
|
|
122
|
+
deepLinkSendPendingRef = _useGlobalContext.deepLinkSendPendingRef;
|
|
123
|
+
var plusMenuZIndex = useMaiaTaskPanelZIndex(1300, 'overlay');
|
|
124
|
+
var initialDraftAppliedRef = useRef(false);
|
|
125
|
+
var _useMentionPopover = useMentionPopover({
|
|
126
|
+
editorRef: editorRef,
|
|
127
|
+
popoverAnchorRef: wrapperRef
|
|
128
|
+
}),
|
|
129
|
+
popoverOpen = _useMentionPopover.popoverOpen,
|
|
130
|
+
resetMentionOpenTracking = _useMentionPopover.resetMentionOpenTracking,
|
|
131
|
+
handleTrigger = _useMentionPopover.handleTrigger,
|
|
132
|
+
handlePopoverKeyDown = _useMentionPopover.handleKeyDown,
|
|
133
|
+
popoverNode = _useMentionPopover.popoverNode;
|
|
134
|
+
var _useState9 = useState(null),
|
|
135
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
136
|
+
plusMenuAnchor = _useState0[0],
|
|
137
|
+
setPlusMenuAnchor = _useState0[1];
|
|
138
|
+
var _useState1 = useState(false),
|
|
139
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
140
|
+
activeToolChipHovered = _useState10[0],
|
|
141
|
+
setActiveToolChipHovered = _useState10[1];
|
|
142
|
+
var _useState11 = useState(false),
|
|
143
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
144
|
+
toolChipExiting = _useState12[0],
|
|
145
|
+
setToolChipExiting = _useState12[1];
|
|
146
|
+
var _useState13 = useState(false),
|
|
147
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
148
|
+
isFileDragActive = _useState14[0],
|
|
149
|
+
setIsFileDragActive = _useState14[1];
|
|
150
|
+
var toolChipExitTimerRef = useRef(null);
|
|
151
|
+
var fileDragCounterRef = useRef(0);
|
|
152
|
+
var searchModeActiveRef = useRef({
|
|
153
|
+
web: false,
|
|
154
|
+
deep: false
|
|
155
|
+
});
|
|
156
|
+
var plusMenuOpen = Boolean(plusMenuAnchor);
|
|
157
|
+
|
|
158
|
+
// Inicializar las referencias como undefined para detectar el primer cambio correctamente
|
|
159
|
+
var previousAgentIdRef = useRef(undefined);
|
|
160
|
+
var previousChatIdRef = useRef(undefined);
|
|
161
|
+
var previousNewChatKeyRef = useRef(undefined);
|
|
162
|
+
var previousLayoutModeRef = useRef(undefined);
|
|
163
|
+
var analyticsAgentType = getChatToolsMenuAgentType(agent);
|
|
164
|
+
var analyticsCloneEntityPayload = (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' ? {
|
|
165
|
+
entity: (_agent$entity = agent.entity) !== null && _agent$entity !== void 0 ? _agent$entity : null
|
|
166
|
+
} : {};
|
|
167
|
+
|
|
168
|
+
// Slash commands aplican a clones especialistas y al orchestrator global (este agrega los de sus subagentes).
|
|
169
|
+
// Los custom y los clone global/maiaker no los tienen habilitados.
|
|
170
|
+
var _useSlashCommands = useSlashCommands((agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global' || (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' && (agent === null || agent === void 0 ? void 0 : agent.entity) !== 'global' ? agent === null || agent === void 0 ? void 0 : agent.id : undefined),
|
|
171
|
+
slashCommands = _useSlashCommands.commands;
|
|
172
|
+
var _useState15 = useState(false),
|
|
173
|
+
_useState16 = _slicedToArray(_useState15, 2),
|
|
174
|
+
showSlashDropdown = _useState16[0],
|
|
175
|
+
setShowSlashDropdown = _useState16[1];
|
|
176
|
+
var _useState17 = useState(''),
|
|
177
|
+
_useState18 = _slicedToArray(_useState17, 2),
|
|
178
|
+
slashQuery = _useState18[0],
|
|
179
|
+
setSlashQuery = _useState18[1];
|
|
180
|
+
var slashMenuWasOpenRef = useRef(false);
|
|
181
|
+
var slashDropdownZIndex = useMaiaTaskPanelZIndex(1200, 'overlay');
|
|
182
|
+
var getCaretRect = useCaretPosition();
|
|
183
|
+
var _useState19 = useState({
|
|
184
|
+
bottom: 0,
|
|
185
|
+
left: 0,
|
|
186
|
+
maxHeight: SLASH_DROPDOWN_MAX_HEIGHT_PX
|
|
187
|
+
}),
|
|
188
|
+
_useState20 = _slicedToArray(_useState19, 2),
|
|
189
|
+
slashDropdownPos = _useState20[0],
|
|
190
|
+
setSlashDropdownPos = _useState20[1];
|
|
191
|
+
var user = useUser();
|
|
192
|
+
var showSkillsButton = canAccessToSkills(user);
|
|
193
|
+
var skillsButtonRef = useRef(null);
|
|
194
|
+
var skillsMenuWasOpenRef = useRef(false);
|
|
195
|
+
var _useSkillsCatalog = useSkillsCatalog(),
|
|
196
|
+
skills = _useSkillsCatalog.skills,
|
|
197
|
+
skillsLoading = _useSkillsCatalog.loading,
|
|
198
|
+
skillsError = _useSkillsCatalog.error,
|
|
199
|
+
fetchSkills = _useSkillsCatalog.fetchSkills;
|
|
200
|
+
var _useState21 = useState(false),
|
|
201
|
+
_useState22 = _slicedToArray(_useState21, 2),
|
|
202
|
+
showSkillsDropdown = _useState22[0],
|
|
203
|
+
setShowSkillsDropdown = _useState22[1];
|
|
204
|
+
var _useState23 = useState(''),
|
|
205
|
+
_useState24 = _slicedToArray(_useState23, 2),
|
|
206
|
+
skillsQuery = _useState24[0],
|
|
207
|
+
setSkillsQuery = _useState24[1];
|
|
208
|
+
var _useState25 = useState({
|
|
209
|
+
bottom: 0,
|
|
210
|
+
left: 0,
|
|
211
|
+
maxHeight: SLASH_DROPDOWN_MAX_HEIGHT_PX
|
|
212
|
+
}),
|
|
213
|
+
_useState26 = _slicedToArray(_useState25, 2),
|
|
214
|
+
skillsDropdownPos = _useState26[0],
|
|
215
|
+
setSkillsDropdownPos = _useState26[1];
|
|
216
|
+
var positionSlashDropdown = useCallback(function () {
|
|
217
|
+
var _wrapperRef$current, _caret$top, _caret$left;
|
|
218
|
+
var wrapperRect = (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.getBoundingClientRect();
|
|
219
|
+
var caret = getCaretRect('/');
|
|
220
|
+
var topSource = (_caret$top = caret === null || caret === void 0 ? void 0 : caret.top) !== null && _caret$top !== void 0 ? _caret$top : wrapperRect && wrapperRect.width > 0 ? wrapperRect.top : null;
|
|
221
|
+
var leftSource = (_caret$left = caret === null || caret === void 0 ? void 0 : caret.left) !== null && _caret$left !== void 0 ? _caret$left : wrapperRect && wrapperRect.width > 0 ? wrapperRect.left : null;
|
|
222
|
+
if (topSource == null || leftSource == null) return;
|
|
223
|
+
var viewportH = window.innerHeight;
|
|
224
|
+
var viewportW = window.innerWidth;
|
|
225
|
+
var left = Math.max(SLASH_DROPDOWN_VIEWPORT_PAD_PX, Math.min(viewportW - SLASH_DROPDOWN_WIDTH_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX, leftSource));
|
|
226
|
+
var availableHeightPx = topSource - SLASH_DROPDOWN_GAP_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX;
|
|
227
|
+
var maxHeight = Math.min(SLASH_DROPDOWN_MAX_HEIGHT_PX, Math.max(0, availableHeightPx));
|
|
228
|
+
setSlashDropdownPos({
|
|
229
|
+
left: left,
|
|
230
|
+
bottom: viewportH - topSource + SLASH_DROPDOWN_GAP_PX,
|
|
231
|
+
maxHeight: maxHeight
|
|
232
|
+
});
|
|
233
|
+
}, [wrapperRef, getCaretRect]);
|
|
234
|
+
useLayoutEffect(function () {
|
|
235
|
+
if (!showSlashDropdown) return undefined;
|
|
236
|
+
positionSlashDropdown();
|
|
237
|
+
var handler = function handler() {
|
|
238
|
+
return positionSlashDropdown();
|
|
239
|
+
};
|
|
240
|
+
window.addEventListener('scroll', handler, true);
|
|
241
|
+
window.addEventListener('resize', handler);
|
|
242
|
+
return function () {
|
|
243
|
+
window.removeEventListener('scroll', handler, true);
|
|
244
|
+
window.removeEventListener('resize', handler);
|
|
245
|
+
};
|
|
246
|
+
}, [showSlashDropdown, slashQuery, positionSlashDropdown]);
|
|
247
|
+
|
|
248
|
+
/** El popover de skills se ancla al `#` que lo abrió; si no hay caret, al borde del input. */
|
|
249
|
+
var positionSkillsDropdown = useCallback(function () {
|
|
250
|
+
var _wrapperRef$current2, _caret$top2, _caret$left2;
|
|
251
|
+
var wrapperRect = (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.getBoundingClientRect();
|
|
252
|
+
var caret = getCaretRect('#');
|
|
253
|
+
var topSource = (_caret$top2 = caret === null || caret === void 0 ? void 0 : caret.top) !== null && _caret$top2 !== void 0 ? _caret$top2 : wrapperRect && wrapperRect.width > 0 ? wrapperRect.top : null;
|
|
254
|
+
var leftSource = (_caret$left2 = caret === null || caret === void 0 ? void 0 : caret.left) !== null && _caret$left2 !== void 0 ? _caret$left2 : wrapperRect && wrapperRect.width > 0 ? wrapperRect.left : null;
|
|
255
|
+
if (topSource == null || leftSource == null) return;
|
|
256
|
+
var viewportH = window.innerHeight;
|
|
257
|
+
var viewportW = window.innerWidth;
|
|
258
|
+
var left = Math.max(SLASH_DROPDOWN_VIEWPORT_PAD_PX, Math.min(viewportW - SKILLS_DROPDOWN_WIDTH_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX, leftSource));
|
|
259
|
+
var availableHeightPx = topSource - SLASH_DROPDOWN_GAP_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX;
|
|
260
|
+
setSkillsDropdownPos({
|
|
261
|
+
left: left,
|
|
262
|
+
bottom: viewportH - topSource + SLASH_DROPDOWN_GAP_PX,
|
|
263
|
+
maxHeight: Math.min(SLASH_DROPDOWN_MAX_HEIGHT_PX, Math.max(0, availableHeightPx))
|
|
264
|
+
});
|
|
265
|
+
}, [wrapperRef, getCaretRect]);
|
|
266
|
+
useLayoutEffect(function () {
|
|
267
|
+
if (!showSkillsDropdown) return undefined;
|
|
268
|
+
positionSkillsDropdown();
|
|
269
|
+
var handler = function handler() {
|
|
270
|
+
return positionSkillsDropdown();
|
|
271
|
+
};
|
|
272
|
+
window.addEventListener('scroll', handler, true);
|
|
273
|
+
window.addEventListener('resize', handler);
|
|
274
|
+
return function () {
|
|
275
|
+
window.removeEventListener('scroll', handler, true);
|
|
276
|
+
window.removeEventListener('resize', handler);
|
|
277
|
+
};
|
|
278
|
+
}, [showSkillsDropdown, skillsQuery, positionSkillsDropdown]);
|
|
279
|
+
|
|
280
|
+
/** Tras elegir o quitar búsqueda web/profunda: volver al textarea (Popover/menu puede robar foco). */
|
|
281
|
+
var scheduleInputFocusAfterToolAction = function scheduleInputFocusAfterToolAction() {
|
|
282
|
+
if (disabled) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
requestAnimationFrame(function () {
|
|
286
|
+
window.setTimeout(function () {
|
|
287
|
+
var _editorRef$current;
|
|
288
|
+
(_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 || _editorRef$current.focus();
|
|
289
|
+
}, 0);
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
var closePlusMenu = function closePlusMenu() {
|
|
293
|
+
setPlusMenuAnchor(null);
|
|
294
|
+
scheduleInputFocusAfterToolAction();
|
|
295
|
+
};
|
|
296
|
+
var cancelPendingToolChipExit = function cancelPendingToolChipExit() {
|
|
297
|
+
if (toolChipExitTimerRef.current !== null) {
|
|
298
|
+
clearTimeout(toolChipExitTimerRef.current);
|
|
299
|
+
toolChipExitTimerRef.current = null;
|
|
300
|
+
}
|
|
301
|
+
setToolChipExiting(false);
|
|
302
|
+
};
|
|
303
|
+
var handlePlusButtonMouseDown = function handlePlusButtonMouseDown(e) {
|
|
304
|
+
// Evita que el botón robe el foco del input al abrir el menú.
|
|
305
|
+
e.preventDefault();
|
|
306
|
+
};
|
|
307
|
+
var handlePlusButtonClick = function handlePlusButtonClick(e) {
|
|
308
|
+
e.stopPropagation();
|
|
309
|
+
if (plusMenuAnchor) {
|
|
310
|
+
closePlusMenu();
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
setPlusMenuAnchor(e.currentTarget);
|
|
314
|
+
eventAmplitude(EVENTS.aiChatPlusOpen, _objectSpread({
|
|
315
|
+
agent_type: analyticsAgentType
|
|
316
|
+
}, analyticsCloneEntityPayload));
|
|
317
|
+
};
|
|
318
|
+
var handleMentionButtonClick = function handleMentionButtonClick(e) {
|
|
319
|
+
var _editorRef$current2;
|
|
320
|
+
e.stopPropagation();
|
|
321
|
+
if (disabled) return;
|
|
322
|
+
closePlusMenu();
|
|
323
|
+
(_editorRef$current2 = editorRef.current) === null || _editorRef$current2 === void 0 || _editorRef$current2.insertMentionTrigger();
|
|
324
|
+
};
|
|
325
|
+
var handlePlusMenuAttach = function handlePlusMenuAttach() {
|
|
326
|
+
var _fileInputRef$current;
|
|
327
|
+
closePlusMenu();
|
|
328
|
+
eventAmplitude(EVENTS.aiChatTools, _objectSpread({
|
|
329
|
+
agent_type: analyticsAgentType,
|
|
330
|
+
option: 'files'
|
|
331
|
+
}, analyticsCloneEntityPayload));
|
|
332
|
+
if (attachments.length >= MAX_CHAT_INPUT_ATTACHMENTS) return;
|
|
333
|
+
(_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 || _fileInputRef$current.click();
|
|
334
|
+
};
|
|
335
|
+
var beginToolChipExit = function beginToolChipExit() {
|
|
336
|
+
if (toolChipExitTimerRef.current !== null) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
var wasWeb = isWebSearchActive;
|
|
340
|
+
var wasDeep = isDeepSearchActive;
|
|
341
|
+
if (!wasWeb && !wasDeep) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
setToolChipExiting(true);
|
|
345
|
+
toolChipExitTimerRef.current = setTimeout(function () {
|
|
346
|
+
toolChipExitTimerRef.current = null;
|
|
347
|
+
var _searchModeActiveRef$ = searchModeActiveRef.current,
|
|
348
|
+
web = _searchModeActiveRef$.web,
|
|
349
|
+
deep = _searchModeActiveRef$.deep;
|
|
350
|
+
if (wasWeb && web) {
|
|
351
|
+
toggleWebSearch();
|
|
352
|
+
} else if (wasDeep && deep) {
|
|
353
|
+
toggleDeepSearch();
|
|
354
|
+
}
|
|
355
|
+
setToolChipExiting(false);
|
|
356
|
+
scheduleInputFocusAfterToolAction();
|
|
357
|
+
}, TOOL_CHIP_EXIT_MS);
|
|
358
|
+
};
|
|
359
|
+
var handlePlusMenuWebSearch = function handlePlusMenuWebSearch() {
|
|
360
|
+
closePlusMenu();
|
|
361
|
+
if (isWebSearchActive) {
|
|
362
|
+
beginToolChipExit();
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
cancelPendingToolChipExit();
|
|
366
|
+
if (isDeepSearchActive) {
|
|
367
|
+
toggleDeepSearch();
|
|
368
|
+
}
|
|
369
|
+
toggleWebSearch();
|
|
370
|
+
eventAmplitude(EVENTS.aiChatTools, _objectSpread({
|
|
371
|
+
agent_type: analyticsAgentType,
|
|
372
|
+
option: 'search'
|
|
373
|
+
}, analyticsCloneEntityPayload));
|
|
374
|
+
scheduleInputFocusAfterToolAction();
|
|
375
|
+
};
|
|
376
|
+
var handlePlusMenuDeepSearch = function handlePlusMenuDeepSearch() {
|
|
377
|
+
closePlusMenu();
|
|
378
|
+
if (isDeepSearchActive) {
|
|
379
|
+
beginToolChipExit();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
cancelPendingToolChipExit();
|
|
383
|
+
if (isWebSearchActive) {
|
|
384
|
+
toggleWebSearch();
|
|
385
|
+
}
|
|
386
|
+
toggleDeepSearch();
|
|
387
|
+
eventAmplitude(EVENTS.aiChatTools, _objectSpread({
|
|
388
|
+
agent_type: analyticsAgentType,
|
|
389
|
+
option: 'deep_search'
|
|
390
|
+
}, analyticsCloneEntityPayload));
|
|
391
|
+
scheduleInputFocusAfterToolAction();
|
|
392
|
+
};
|
|
393
|
+
var handlePlusMenuQuickActions = function handlePlusMenuQuickActions() {
|
|
394
|
+
var _editorRef$current3;
|
|
395
|
+
setPlusMenuAnchor(null);
|
|
396
|
+
if (disabled) return;
|
|
397
|
+
(_editorRef$current3 = editorRef.current) === null || _editorRef$current3 === void 0 || _editorRef$current3.insertSlashTrigger();
|
|
398
|
+
};
|
|
399
|
+
useEffect(function () {
|
|
400
|
+
if (!disabled) {
|
|
401
|
+
var _editorRef$current4;
|
|
402
|
+
(_editorRef$current4 = editorRef.current) === null || _editorRef$current4 === void 0 || _editorRef$current4.focus();
|
|
403
|
+
}
|
|
404
|
+
}, [disabled]);
|
|
405
|
+
useEffect(function () {
|
|
406
|
+
initialDraftAppliedRef.current = false;
|
|
407
|
+
}, [initialDraft]);
|
|
408
|
+
useEffect(function () {
|
|
409
|
+
var _editorRef$current5;
|
|
410
|
+
var draft = initialDraft === null || initialDraft === void 0 ? void 0 : initialDraft.trim();
|
|
411
|
+
if (!draft || initialDraftAppliedRef.current || disabled) {
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
initialDraftAppliedRef.current = true;
|
|
415
|
+
if (deepLinkSendPendingRef) {
|
|
416
|
+
deepLinkSendPendingRef.current = true;
|
|
417
|
+
}
|
|
418
|
+
(_editorRef$current5 = editorRef.current) === null || _editorRef$current5 === void 0 || _editorRef$current5.setPlainText(draft);
|
|
419
|
+
setHasTypingPresence(true);
|
|
420
|
+
if (!disabled) {
|
|
421
|
+
var _editorRef$current6;
|
|
422
|
+
(_editorRef$current6 = editorRef.current) === null || _editorRef$current6 === void 0 || _editorRef$current6.focus();
|
|
423
|
+
}
|
|
424
|
+
}, [initialDraft, disabled, deepLinkSendPendingRef]);
|
|
425
|
+
var sendDisabled = useMemo(function () {
|
|
426
|
+
return !hasTypingPresence && attachments.length === 0;
|
|
427
|
+
}, [hasTypingPresence, attachments.length]);
|
|
428
|
+
useEffect(function () {
|
|
429
|
+
searchModeActiveRef.current = {
|
|
430
|
+
web: isWebSearchActive,
|
|
431
|
+
deep: isDeepSearchActive
|
|
432
|
+
};
|
|
433
|
+
}, [isWebSearchActive, isDeepSearchActive]);
|
|
434
|
+
useEffect(function () {
|
|
435
|
+
return function () {
|
|
436
|
+
if (toolChipExitTimerRef.current !== null) {
|
|
437
|
+
clearTimeout(toolChipExitTimerRef.current);
|
|
438
|
+
}
|
|
439
|
+
};
|
|
440
|
+
}, []);
|
|
441
|
+
useEffect(function () {
|
|
442
|
+
if (!isWebSearchActive && !isDeepSearchActive) {
|
|
443
|
+
setActiveToolChipHovered(false);
|
|
444
|
+
}
|
|
445
|
+
}, [isWebSearchActive, isDeepSearchActive]);
|
|
446
|
+
|
|
447
|
+
// Auto-focus cuando cambia el agente o la conversación, o al montar el componente
|
|
448
|
+
useEffect(function () {
|
|
449
|
+
var agentChanged = previousAgentIdRef.current !== (agent === null || agent === void 0 ? void 0 : agent.id);
|
|
450
|
+
var previousChatId = previousChatIdRef.current;
|
|
451
|
+
var currentChatId = chatId;
|
|
452
|
+
var chatChanged = previousChatId !== currentChatId;
|
|
453
|
+
var changedFromNewChatToOldChat = (previousChatId === undefined || previousChatId === null) && currentChatId !== undefined && currentChatId !== null;
|
|
454
|
+
var newChatStarted = previousNewChatKeyRef.current !== newChatKey;
|
|
455
|
+
var isInitialMount = previousAgentIdRef.current === undefined && previousChatIdRef.current === undefined;
|
|
456
|
+
if ((agentChanged || chatChanged || changedFromNewChatToOldChat || newChatStarted || isInitialMount) && !disabled) {
|
|
457
|
+
var delay = isInitialMount || changedFromNewChatToOldChat ? 200 : 100;
|
|
458
|
+
setTimeout(function () {
|
|
459
|
+
var _editorRef$current7;
|
|
460
|
+
if (!disabled) (_editorRef$current7 = editorRef.current) === null || _editorRef$current7 === void 0 || _editorRef$current7.focus();
|
|
461
|
+
}, delay);
|
|
462
|
+
}
|
|
463
|
+
previousAgentIdRef.current = agent === null || agent === void 0 ? void 0 : agent.id;
|
|
464
|
+
previousChatIdRef.current = chatId;
|
|
465
|
+
previousNewChatKeyRef.current = newChatKey;
|
|
466
|
+
}, [agent === null || agent === void 0 ? void 0 : agent.id, chatId, newChatKey, disabled]);
|
|
467
|
+
|
|
468
|
+
// Auto-focus cuando cambia la disposición del modal (sidebar / fullscreen / floating)
|
|
469
|
+
useEffect(function () {
|
|
470
|
+
if (!layoutMode) {
|
|
471
|
+
return undefined;
|
|
472
|
+
}
|
|
473
|
+
var previousLayoutMode = previousLayoutModeRef.current;
|
|
474
|
+
previousLayoutModeRef.current = layoutMode;
|
|
475
|
+
if (previousLayoutMode === undefined || previousLayoutMode === layoutMode || disabled) {
|
|
476
|
+
return undefined;
|
|
477
|
+
}
|
|
478
|
+
var timeoutId = window.setTimeout(function () {
|
|
479
|
+
if (!disabled) {
|
|
480
|
+
var _editorRef$current8;
|
|
481
|
+
(_editorRef$current8 = editorRef.current) === null || _editorRef$current8 === void 0 || _editorRef$current8.focus();
|
|
482
|
+
}
|
|
483
|
+
}, 200);
|
|
484
|
+
return function () {
|
|
485
|
+
return window.clearTimeout(timeoutId);
|
|
486
|
+
};
|
|
487
|
+
}, [layoutMode, disabled]);
|
|
488
|
+
|
|
489
|
+
// Appcues: notify that the input is visible for specialist agents (clone + project/client)
|
|
490
|
+
useEffect(function () {
|
|
491
|
+
var isSpecialistAgent = (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client');
|
|
492
|
+
if (!wrapperRef.current || !isSpecialistAgent) return undefined;
|
|
493
|
+
var observer = new IntersectionObserver(function (_ref2) {
|
|
494
|
+
var _ref3 = _slicedToArray(_ref2, 1),
|
|
495
|
+
entry = _ref3[0];
|
|
496
|
+
if (entry.isIntersecting) {
|
|
497
|
+
trackAppcuesEvent(APPCUES_EVENTS.maiaContextMentionInit);
|
|
498
|
+
observer.disconnect();
|
|
499
|
+
}
|
|
500
|
+
}, {
|
|
501
|
+
threshold: 0.1
|
|
502
|
+
});
|
|
503
|
+
observer.observe(wrapperRef.current);
|
|
504
|
+
return function () {
|
|
505
|
+
return observer.disconnect();
|
|
506
|
+
};
|
|
507
|
+
}, [agent === null || agent === void 0 ? void 0 : agent.id, agent === null || agent === void 0 ? void 0 : agent.type, agent === null || agent === void 0 ? void 0 : agent.entity]);
|
|
508
|
+
|
|
509
|
+
// Clear input when session changes (user switches to a different chat)
|
|
510
|
+
useEffect(function () {
|
|
511
|
+
var handleSessionChange = function handleSessionChange() {
|
|
512
|
+
var _editorRef$current9;
|
|
513
|
+
if (deepLinkSendPendingRef) {
|
|
514
|
+
deepLinkSendPendingRef.current = false;
|
|
515
|
+
}
|
|
516
|
+
(_editorRef$current9 = editorRef.current) === null || _editorRef$current9 === void 0 || _editorRef$current9.clear();
|
|
517
|
+
setHasTypingPresence(false);
|
|
518
|
+
setShowSlashDropdown(false);
|
|
519
|
+
setSlashQuery('');
|
|
520
|
+
resetMentionOpenTracking();
|
|
521
|
+
};
|
|
522
|
+
document.addEventListener('chat-session-changed', handleSessionChange);
|
|
523
|
+
return function () {
|
|
524
|
+
return document.removeEventListener('chat-session-changed', handleSessionChange);
|
|
525
|
+
};
|
|
526
|
+
}, [resetMentionOpenTracking, deepLinkSendPendingRef]);
|
|
527
|
+
|
|
528
|
+
// Mantener foco al seleccionar un contexto reciente (el click en el pill lo roba al input).
|
|
529
|
+
useEffect(function () {
|
|
530
|
+
var handleRefocus = function handleRefocus() {
|
|
531
|
+
if (disabled) return;
|
|
532
|
+
requestAnimationFrame(function () {
|
|
533
|
+
var _editorRef$current0;
|
|
534
|
+
(_editorRef$current0 = editorRef.current) === null || _editorRef$current0 === void 0 || _editorRef$current0.focus();
|
|
535
|
+
});
|
|
536
|
+
};
|
|
537
|
+
document.addEventListener('maia-input-refocus', handleRefocus);
|
|
538
|
+
return function () {
|
|
539
|
+
return document.removeEventListener('maia-input-refocus', handleRefocus);
|
|
540
|
+
};
|
|
541
|
+
}, [disabled]);
|
|
542
|
+
useEffect(function () {
|
|
543
|
+
var handleInsertSkillMention = function handleInsertSkillMention(event) {
|
|
544
|
+
var _editorRef$current1, _editorRef$current10;
|
|
545
|
+
var _ref4 = event.detail || {},
|
|
546
|
+
skill = _ref4.skill;
|
|
547
|
+
if (!skill || disabled) return;
|
|
548
|
+
var normalizedName = skill.name.replace(/^(@\/|#)/, '');
|
|
549
|
+
(_editorRef$current1 = editorRef.current) === null || _editorRef$current1 === void 0 || _editorRef$current1.clear();
|
|
550
|
+
(_editorRef$current10 = editorRef.current) === null || _editorRef$current10 === void 0 || _editorRef$current10.appendMentionAtEnd({
|
|
551
|
+
id: skill.id,
|
|
552
|
+
type: 'skill',
|
|
553
|
+
label: "#".concat(normalizedName)
|
|
554
|
+
});
|
|
555
|
+
requestAnimationFrame(function () {
|
|
556
|
+
var _editorRef$current11;
|
|
557
|
+
(_editorRef$current11 = editorRef.current) === null || _editorRef$current11 === void 0 || _editorRef$current11.focus();
|
|
558
|
+
});
|
|
559
|
+
};
|
|
560
|
+
document.addEventListener('maia-insert-skill-mention', handleInsertSkillMention);
|
|
561
|
+
return function () {
|
|
562
|
+
return document.removeEventListener('maia-insert-skill-mention', handleInsertSkillMention);
|
|
563
|
+
};
|
|
564
|
+
}, [disabled]);
|
|
565
|
+
var handleSendMessage = useCallback(function () {
|
|
566
|
+
var _editorRef$current12, _state$text, _state$mentions, _editorRef$current13;
|
|
567
|
+
var state = (_editorRef$current12 = editorRef.current) === null || _editorRef$current12 === void 0 ? void 0 : _editorRef$current12.serialize();
|
|
568
|
+
var text = (_state$text = state === null || state === void 0 ? void 0 : state.text) !== null && _state$text !== void 0 ? _state$text : '';
|
|
569
|
+
if (!text.trim() && !attachments.length) return;
|
|
570
|
+
var mentions = (_state$mentions = state === null || state === void 0 ? void 0 : state.mentions) !== null && _state$mentions !== void 0 ? _state$mentions : [];
|
|
571
|
+
onSendMessage(text, attachments, mentions);
|
|
572
|
+
(_editorRef$current13 = editorRef.current) === null || _editorRef$current13 === void 0 || _editorRef$current13.clear();
|
|
573
|
+
setHasTypingPresence(false);
|
|
574
|
+
setShowSlashDropdown(false);
|
|
575
|
+
setSlashQuery('');
|
|
576
|
+
setShowSkillsDropdown(false);
|
|
577
|
+
setSkillsQuery('');
|
|
578
|
+
skillsMenuWasOpenRef.current = false;
|
|
579
|
+
resetMentionOpenTracking();
|
|
580
|
+
}, [attachments, onSendMessage, resetMentionOpenTracking]);
|
|
581
|
+
var handleSelectSlashCommand = useCallback(function (command) {
|
|
582
|
+
var _editorRef$current14, _state$text2, _editorRef$current16;
|
|
583
|
+
eventAmplitude(EVENTS.aiChatQuickActionSelect, {
|
|
584
|
+
type_quick_action: resolveQuickActionType(command),
|
|
585
|
+
origin_quick_action: 'slash_menu'
|
|
586
|
+
});
|
|
587
|
+
var state = (_editorRef$current14 = editorRef.current) === null || _editorRef$current14 === void 0 ? void 0 : _editorRef$current14.serialize();
|
|
588
|
+
var text = (_state$text2 = state === null || state === void 0 ? void 0 : state.text) !== null && _state$text2 !== void 0 ? _state$text2 : '';
|
|
589
|
+
var triggerPart = "/".concat(slashQuery);
|
|
590
|
+
var beforeTrigger = text.endsWith(triggerPart) ? text.slice(0, -triggerPart.length) : text;
|
|
591
|
+
var isEmptyBeforeTrigger = beforeTrigger.trim() === '';
|
|
592
|
+
if (isEmptyBeforeTrigger) {
|
|
593
|
+
var _editorRef$current15;
|
|
594
|
+
onSendMessage(command.title, attachments, undefined, undefined, undefined, undefined, command.id);
|
|
595
|
+
(_editorRef$current15 = editorRef.current) === null || _editorRef$current15 === void 0 || _editorRef$current15.clear();
|
|
596
|
+
setHasTypingPresence(false);
|
|
597
|
+
setShowSlashDropdown(false);
|
|
598
|
+
setSlashQuery('');
|
|
599
|
+
slashMenuWasOpenRef.current = false;
|
|
600
|
+
resetMentionOpenTracking();
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
(_editorRef$current16 = editorRef.current) === null || _editorRef$current16 === void 0 || _editorRef$current16.insertSlashCommand({
|
|
604
|
+
id: command.id,
|
|
605
|
+
label: command.title
|
|
606
|
+
});
|
|
607
|
+
setShowSlashDropdown(false);
|
|
608
|
+
setSlashQuery('');
|
|
609
|
+
slashMenuWasOpenRef.current = false;
|
|
610
|
+
}, [attachments, onSendMessage, resetMentionOpenTracking, slashQuery, eventAmplitude]);
|
|
611
|
+
var handleCloseSlashDropdown = function handleCloseSlashDropdown() {
|
|
612
|
+
setShowSlashDropdown(false);
|
|
613
|
+
slashMenuWasOpenRef.current = false;
|
|
614
|
+
};
|
|
615
|
+
var handleCloseSkillsDropdown = useCallback(function () {
|
|
616
|
+
setShowSkillsDropdown(false);
|
|
617
|
+
setSkillsQuery('');
|
|
618
|
+
skillsMenuWasOpenRef.current = false;
|
|
619
|
+
}, []);
|
|
620
|
+
|
|
621
|
+
/** Abre el listado desde el botón: inserta `#` en el editor para que el trigger quede activo. */
|
|
622
|
+
var handleSkillsButtonClick = function handleSkillsButtonClick(e) {
|
|
623
|
+
var _editorRef$current17;
|
|
624
|
+
e.stopPropagation();
|
|
625
|
+
if (disabled) return;
|
|
626
|
+
if (showSkillsDropdown) {
|
|
627
|
+
handleCloseSkillsDropdown();
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
closePlusMenu();
|
|
631
|
+
(_editorRef$current17 = editorRef.current) === null || _editorRef$current17 === void 0 || _editorRef$current17.insertSkillTrigger();
|
|
632
|
+
};
|
|
633
|
+
var handleSelectSkill = useCallback(function (skill) {
|
|
634
|
+
var _editorRef$current18;
|
|
635
|
+
(_editorRef$current18 = editorRef.current) === null || _editorRef$current18 === void 0 || _editorRef$current18.insertSkillMention({
|
|
636
|
+
id: skill.id,
|
|
637
|
+
type: 'skill',
|
|
638
|
+
label: "#".concat(skill.name)
|
|
639
|
+
});
|
|
640
|
+
setShowSkillsDropdown(false);
|
|
641
|
+
setSkillsQuery('');
|
|
642
|
+
skillsMenuWasOpenRef.current = false;
|
|
643
|
+
}, []);
|
|
644
|
+
var handleCreateSkill = useCallback(function () {
|
|
645
|
+
setShowSkillsDropdown(false);
|
|
646
|
+
setSkillsQuery('');
|
|
647
|
+
skillsMenuWasOpenRef.current = false;
|
|
648
|
+
document.dispatchEvent(new CustomEvent('abm-skill-modal-set-values', {
|
|
649
|
+
detail: {
|
|
650
|
+
skillValues: {
|
|
651
|
+
values: {
|
|
652
|
+
isEditing: false,
|
|
653
|
+
intent: 'write'
|
|
654
|
+
},
|
|
655
|
+
isOpen: true
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}));
|
|
659
|
+
}, []);
|
|
660
|
+
var handleEditorInput = useCallback(function (_ref5) {
|
|
661
|
+
var text = _ref5.text,
|
|
662
|
+
trigger = _ref5.trigger,
|
|
663
|
+
slashTrigger = _ref5.slashTrigger,
|
|
664
|
+
hashTrigger = _ref5.hashTrigger;
|
|
665
|
+
setHasTypingPresence(text.trim().length > 0);
|
|
666
|
+
onChange === null || onChange === void 0 || onChange();
|
|
667
|
+
handleTrigger(trigger);
|
|
668
|
+
if (slashTrigger !== null && slashTrigger !== void 0 && slashTrigger.active && slashCommands.length > 0) {
|
|
669
|
+
if (!slashMenuWasOpenRef.current) {
|
|
670
|
+
eventAmplitude(EVENTS.aiChatQuickActionOpen);
|
|
671
|
+
slashMenuWasOpenRef.current = true;
|
|
672
|
+
}
|
|
673
|
+
setShowSlashDropdown(true);
|
|
674
|
+
setSlashQuery(slashTrigger.query);
|
|
675
|
+
} else {
|
|
676
|
+
slashMenuWasOpenRef.current = false;
|
|
677
|
+
setShowSlashDropdown(false);
|
|
678
|
+
setSlashQuery('');
|
|
679
|
+
}
|
|
680
|
+
if (hashTrigger !== null && hashTrigger !== void 0 && hashTrigger.active && showSkillsButton) {
|
|
681
|
+
// Fetch on-open: una sola llamada por apertura del listado.
|
|
682
|
+
if (!skillsMenuWasOpenRef.current) {
|
|
683
|
+
skillsMenuWasOpenRef.current = true;
|
|
684
|
+
void fetchSkills();
|
|
685
|
+
}
|
|
686
|
+
setShowSkillsDropdown(true);
|
|
687
|
+
setSkillsQuery(hashTrigger.query);
|
|
688
|
+
} else {
|
|
689
|
+
skillsMenuWasOpenRef.current = false;
|
|
690
|
+
setShowSkillsDropdown(false);
|
|
691
|
+
setSkillsQuery('');
|
|
692
|
+
}
|
|
693
|
+
}, [onChange, handleTrigger, slashCommands, eventAmplitude, showSkillsButton, fetchSkills]);
|
|
694
|
+
var handleKeyDown = useCallback(function (e) {
|
|
695
|
+
if (handlePopoverKeyDown(e)) return;
|
|
696
|
+
if (e.key === 'Enter' && !e.shiftKey && !popoverOpen) {
|
|
697
|
+
e.preventDefault();
|
|
698
|
+
if (!sendDisabled && !disabled) handleSendMessage();
|
|
699
|
+
}
|
|
700
|
+
}, [handlePopoverKeyDown, popoverOpen, sendDisabled, disabled, handleSendMessage]);
|
|
701
|
+
var addFiles = function addFiles(incoming) {
|
|
702
|
+
if (!incoming.length || disabled) return;
|
|
703
|
+
var exceededFiles = [];
|
|
704
|
+
var excludedFiles = [];
|
|
705
|
+
var fileSizes = {};
|
|
706
|
+
var filesInserted = attachments.length;
|
|
707
|
+
var isNewFormat = function isNewFormat(extension) {
|
|
708
|
+
return ['.png', '.jpg', '.jpeg', '.pdf'].includes(extension);
|
|
709
|
+
};
|
|
710
|
+
var isOldFormat = function isOldFormat(extension) {
|
|
711
|
+
return ['.txt', '.md', '.csv', '.doc', '.docx', '.xlsx', '.xls', '.ppt', '.pptx'].includes(extension);
|
|
712
|
+
};
|
|
713
|
+
var isAudioFormat = function isAudioFormat(extension) {
|
|
714
|
+
return ['.flac', '.m4a', '.mp3', '.mp4', '.oga', '.ogg', '.wav', '.webm'].includes(extension);
|
|
715
|
+
};
|
|
716
|
+
var exceedsMaxSize = function exceedsMaxSize(extension, size) {
|
|
717
|
+
return size > getMaxAttachmentSizeMb(extension) * 1024 * 1024;
|
|
718
|
+
};
|
|
719
|
+
incoming.forEach(function (file) {
|
|
720
|
+
var _fileNameParts$pop;
|
|
721
|
+
var excludedFile = false;
|
|
722
|
+
var fileNameParts = file.name.split('.');
|
|
723
|
+
var fileExtension = fileNameParts.length > 1 ? ".".concat((_fileNameParts$pop = fileNameParts.pop()) === null || _fileNameParts$pop === void 0 ? void 0 : _fileNameParts$pop.toLowerCase()) : '';
|
|
724
|
+
if (!(allowedFileTypes !== null && allowedFileTypes !== void 0 && allowedFileTypes.includes(fileExtension))) {
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
fileSizes[file.name] = file.size;
|
|
728
|
+
if (isNewFormat(fileExtension)) {
|
|
729
|
+
if (exceedsMaxSize(fileExtension, file.size)) {
|
|
730
|
+
exceededFiles.push(file.name);
|
|
731
|
+
excludedFile = true;
|
|
732
|
+
}
|
|
733
|
+
if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
|
|
734
|
+
excludedFiles.push(file.name);
|
|
735
|
+
excludedFile = true;
|
|
736
|
+
}
|
|
737
|
+
} else if (isOldFormat(fileExtension)) {
|
|
738
|
+
if (exceedsMaxSize(fileExtension, file.size)) {
|
|
739
|
+
exceededFiles.push(file.name);
|
|
740
|
+
excludedFile = true;
|
|
741
|
+
}
|
|
742
|
+
if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
|
|
743
|
+
excludedFiles.push(file.name);
|
|
744
|
+
excludedFile = true;
|
|
745
|
+
}
|
|
746
|
+
} else if (isAudioFormat(fileExtension)) {
|
|
747
|
+
if (exceedsMaxSize(fileExtension, file.size)) {
|
|
748
|
+
exceededFiles.push(file.name);
|
|
749
|
+
excludedFile = true;
|
|
750
|
+
}
|
|
751
|
+
if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
|
|
752
|
+
excludedFiles.push(file.name);
|
|
753
|
+
excludedFile = true;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
if (!excludedFile) {
|
|
757
|
+
filesInserted += 1;
|
|
758
|
+
var typeFile = file.type || fileTypes[fileExtension];
|
|
759
|
+
var parsedFile = new File([file], file.name, {
|
|
760
|
+
type: typeFile
|
|
761
|
+
});
|
|
762
|
+
onFileAttach === null || onFileAttach === void 0 || onFileAttach(parsedFile);
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
if (excludedFiles.length || exceededFiles.length) {
|
|
766
|
+
setModalProps({
|
|
767
|
+
isOpen: true,
|
|
768
|
+
excludedFiles: excludedFiles,
|
|
769
|
+
exceededFiles: exceededFiles,
|
|
770
|
+
fileSizes: fileSizes
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
};
|
|
774
|
+
var handleFileSelect = function handleFileSelect(e) {
|
|
775
|
+
var files = e.target.files;
|
|
776
|
+
if (files) {
|
|
777
|
+
addFiles(Array.from(files));
|
|
778
|
+
}
|
|
779
|
+
if (fileInputRef.current) {
|
|
780
|
+
fileInputRef.current.value = '';
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
var resetFileDrag = function resetFileDrag() {
|
|
784
|
+
fileDragCounterRef.current = 0;
|
|
785
|
+
setIsFileDragActive(false);
|
|
786
|
+
};
|
|
787
|
+
var handleDragEnter = function handleDragEnter(e) {
|
|
788
|
+
if (!dataTransferHasFiles(e.dataTransfer)) return;
|
|
789
|
+
e.preventDefault();
|
|
790
|
+
e.stopPropagation();
|
|
791
|
+
if (disabled) return;
|
|
792
|
+
fileDragCounterRef.current += 1;
|
|
793
|
+
setIsFileDragActive(true);
|
|
794
|
+
};
|
|
795
|
+
var handleDragLeave = function handleDragLeave(e) {
|
|
796
|
+
if (!isFileDragActive && !dataTransferHasFiles(e.dataTransfer)) return;
|
|
797
|
+
e.preventDefault();
|
|
798
|
+
e.stopPropagation();
|
|
799
|
+
fileDragCounterRef.current = Math.max(0, fileDragCounterRef.current - 1);
|
|
800
|
+
if (fileDragCounterRef.current === 0) {
|
|
801
|
+
setIsFileDragActive(false);
|
|
802
|
+
}
|
|
803
|
+
};
|
|
804
|
+
var handleDragOver = function handleDragOver(e) {
|
|
805
|
+
if (!dataTransferHasFiles(e.dataTransfer)) return;
|
|
806
|
+
e.preventDefault();
|
|
807
|
+
e.stopPropagation();
|
|
808
|
+
if (disabled) return;
|
|
809
|
+
e.dataTransfer.dropEffect = 'copy';
|
|
810
|
+
};
|
|
811
|
+
var handleDrop = function handleDrop(e) {
|
|
812
|
+
if (!dataTransferHasFiles(e.dataTransfer)) {
|
|
813
|
+
resetFileDrag();
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
e.preventDefault();
|
|
817
|
+
e.stopPropagation();
|
|
818
|
+
resetFileDrag();
|
|
819
|
+
if (disabled) return;
|
|
820
|
+
addFiles(filesFromDataTransfer(e.dataTransfer));
|
|
821
|
+
};
|
|
822
|
+
var handlePasteFiles = function handlePasteFiles(files) {
|
|
823
|
+
addFiles(files);
|
|
824
|
+
};
|
|
825
|
+
var handleWrapperPaste = function handleWrapperPaste(e) {
|
|
826
|
+
var _wrapperRef$current3;
|
|
827
|
+
var editorEl = (_wrapperRef$current3 = wrapperRef.current) === null || _wrapperRef$current3 === void 0 ? void 0 : _wrapperRef$current3.querySelector('[contenteditable="true"]');
|
|
828
|
+
if (editorEl && editorEl.contains(e.target)) return;
|
|
829
|
+
var files = filesFromDataTransfer(e.clipboardData);
|
|
830
|
+
if (!files.length) return;
|
|
831
|
+
e.preventDefault();
|
|
832
|
+
addFiles(files);
|
|
833
|
+
};
|
|
834
|
+
var handleDeleteAttachment = function handleDeleteAttachment(fileId) {
|
|
835
|
+
onDeleteAttachment === null || onDeleteAttachment === void 0 || onDeleteAttachment(fileId);
|
|
836
|
+
};
|
|
837
|
+
var handleStopGeneration = function handleStopGeneration() {
|
|
838
|
+
eventAmplitude(EVENTS.aiChatStopResponse);
|
|
839
|
+
onStopGeneration === null || onStopGeneration === void 0 || onStopGeneration();
|
|
840
|
+
};
|
|
841
|
+
var showChipsRow = Boolean((contextChip === null || contextChip === void 0 || (_contextChip$items = contextChip.items) === null || _contextChip$items === void 0 ? void 0 : _contextChip$items.length) || attachments.length);
|
|
842
|
+
useLayoutEffect(function () {
|
|
843
|
+
var chipsEl = chipsRowRef.current;
|
|
844
|
+
var toolbarEl = toolbarRowRef.current;
|
|
845
|
+
var updateHeights = function updateHeights() {
|
|
846
|
+
var nextChips = showChipsRow && chipsEl ? Math.ceil(chipsEl.getBoundingClientRect().height) : 0;
|
|
847
|
+
var nextToolbar = toolbarEl ? Math.ceil(toolbarEl.getBoundingClientRect().height) : MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX;
|
|
848
|
+
setChipsRowHeight(function (prev) {
|
|
849
|
+
return prev === nextChips ? prev : nextChips;
|
|
850
|
+
});
|
|
851
|
+
setToolbarRowHeight(function (prev) {
|
|
852
|
+
return prev === nextToolbar ? prev : nextToolbar;
|
|
853
|
+
});
|
|
854
|
+
};
|
|
855
|
+
updateHeights();
|
|
856
|
+
var observer = new ResizeObserver(updateHeights);
|
|
857
|
+
if (showChipsRow && chipsEl) observer.observe(chipsEl);
|
|
858
|
+
if (toolbarEl) observer.observe(toolbarEl);
|
|
859
|
+
return function () {
|
|
860
|
+
return observer.disconnect();
|
|
861
|
+
};
|
|
862
|
+
}, [showChipsRow, contextChip === null || contextChip === void 0 || (_contextChip$items2 = contextChip.items) === null || _contextChip$items2 === void 0 ? void 0 : _contextChip$items2.length, attachments.length]);
|
|
863
|
+
var editorMaxHeight = useMemo(function () {
|
|
864
|
+
return getMaiaInputEditorMaxHeight({
|
|
865
|
+
chipsRowHeightPx: chipsRowHeight,
|
|
866
|
+
toolbarRowHeightPx: toolbarRowHeight
|
|
867
|
+
});
|
|
868
|
+
}, [chipsRowHeight, toolbarRowHeight]);
|
|
869
|
+
var toolbarIconColor = '#808080';
|
|
870
|
+
var plusMenuIconColor = MAIA_CHAT_INPUT_UI.menuIcon;
|
|
871
|
+
var isCustomAgent = (agent === null || agent === void 0 ? void 0 : agent.type) === 'custom';
|
|
872
|
+
var hasCorAccess = Boolean(isCustomAgent && (agent === null || agent === void 0 || (_agent$connectors = agent.connectors) === null || _agent$connectors === void 0 ? void 0 : _agent$connectors.some(function (connector) {
|
|
873
|
+
return connector.group === 'COR' && connector.slugs.some(function (slug) {
|
|
874
|
+
return typeof slug === 'string' && slug.trim().length > 0;
|
|
875
|
+
});
|
|
876
|
+
})));
|
|
877
|
+
var agentModelName = isCustomAgent ? (agent === null || agent === void 0 || (_agent$model_display_ = agent.model_display_name) === null || _agent$model_display_ === void 0 ? void 0 : _agent$model_display_.trim()) || null : null;
|
|
878
|
+
var showCustomMetaIndicators = hasCorAccess || Boolean(agentModelName);
|
|
879
|
+
var showMentionButton = (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' || hasCorAccess;
|
|
880
|
+
var activeToolChipLeadingIcon;
|
|
881
|
+
if (activeToolChipHovered) {
|
|
882
|
+
activeToolChipLeadingIcon = /*#__PURE__*/_jsx(Cross, {
|
|
883
|
+
color: MAIA_CHAT_INPUT_UI.chipCloseIcon,
|
|
884
|
+
width: 18,
|
|
885
|
+
height: 18
|
|
886
|
+
});
|
|
887
|
+
} else if (isWebSearchActive) {
|
|
888
|
+
activeToolChipLeadingIcon = /*#__PURE__*/_jsx(MaiaInputWebSearchIcon, {
|
|
889
|
+
color: plusMenuIconColor,
|
|
890
|
+
width: 18,
|
|
891
|
+
height: 18
|
|
892
|
+
});
|
|
893
|
+
} else {
|
|
894
|
+
activeToolChipLeadingIcon = /*#__PURE__*/_jsx(MaiaInputDeepSearchIcon, {
|
|
895
|
+
color: plusMenuIconColor,
|
|
896
|
+
width: 18,
|
|
897
|
+
height: 18
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
901
|
+
children: [/*#__PURE__*/_jsxs(StyledMAIAInputWrapper, {
|
|
902
|
+
ref: wrapperRef,
|
|
903
|
+
disabled: false,
|
|
904
|
+
alignButtons: alignButtons,
|
|
905
|
+
hasAttachments: !!attachments.length,
|
|
906
|
+
$fileDragActive: isFileDragActive,
|
|
907
|
+
"data-appcues": "maia_chat_input",
|
|
908
|
+
"data-maia-streaming": isStreaming ? 'true' : 'false',
|
|
909
|
+
onPaste: handleWrapperPaste,
|
|
910
|
+
onDragEnter: handleDragEnter,
|
|
911
|
+
onDragLeave: handleDragLeave,
|
|
912
|
+
onDragOver: handleDragOver,
|
|
913
|
+
onDrop: handleDrop,
|
|
914
|
+
children: [showChipsRow && /*#__PURE__*/_jsxs(SCInputChipsRow, {
|
|
915
|
+
ref: chipsRowRef,
|
|
916
|
+
children: [contextChip !== null && contextChip !== void 0 && (_contextChip$items3 = contextChip.items) !== null && _contextChip$items3 !== void 0 && _contextChip$items3.length ? /*#__PURE__*/_jsx(Chip, {
|
|
917
|
+
items: contextChip.items,
|
|
918
|
+
type: contextChip.type,
|
|
919
|
+
leadingIcon: contextChip.leadingIcon,
|
|
920
|
+
tooltipZIndex: tooltipZIndex
|
|
921
|
+
}) : null, attachments.map(function (attachment, index) {
|
|
922
|
+
var _attachment$type;
|
|
923
|
+
var isImage = ((_attachment$type = attachment.type) === null || _attachment$type === void 0 ? void 0 : _attachment$type.startsWith('image/')) || /\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(attachment.name || '');
|
|
924
|
+
var chipIcon = isImage ? /*#__PURE__*/_jsx(MaiaInputAttachmentImageIcon, {
|
|
925
|
+
color: "#808080",
|
|
926
|
+
width: 12,
|
|
927
|
+
height: 12
|
|
928
|
+
}) : /*#__PURE__*/_jsx(MaiaInputAttachIcon, {
|
|
929
|
+
color: "#808080",
|
|
930
|
+
width: 13,
|
|
931
|
+
height: 13
|
|
932
|
+
});
|
|
933
|
+
return /*#__PURE__*/_jsx(Tooltip, {
|
|
934
|
+
title: attachment.name,
|
|
935
|
+
zIndex: tooltipZIndex,
|
|
936
|
+
children: /*#__PURE__*/_jsxs(SCMIAttachment, {
|
|
937
|
+
children: [/*#__PURE__*/_jsxs(SCMIAttachmentIcon, {
|
|
938
|
+
children: [/*#__PURE__*/_jsx(SCMIAttachmentFileIcon, {
|
|
939
|
+
children: chipIcon
|
|
940
|
+
}), /*#__PURE__*/_jsx(SCMIAttachmentDeleteIcon, {
|
|
941
|
+
type: "button",
|
|
942
|
+
"aria-label": t('chat.removeAttachmentAria', {
|
|
943
|
+
defaultValue: 'Quitar archivo'
|
|
944
|
+
}),
|
|
945
|
+
onClick: function onClick() {
|
|
946
|
+
return handleDeleteAttachment(attachment.id);
|
|
947
|
+
},
|
|
948
|
+
children: /*#__PURE__*/_jsx(Cross, {
|
|
949
|
+
color: "#666666",
|
|
950
|
+
width: 14,
|
|
951
|
+
height: 14
|
|
952
|
+
})
|
|
953
|
+
})]
|
|
954
|
+
}), /*#__PURE__*/_jsx(SCMIAttachmentName, {
|
|
955
|
+
children: attachment.name
|
|
956
|
+
})]
|
|
957
|
+
})
|
|
958
|
+
}, "".concat(attachment.id, "-").concat(index));
|
|
959
|
+
})]
|
|
960
|
+
}), /*#__PURE__*/_jsxs(StyledMAIAMainToolbarGrid, {
|
|
961
|
+
children: [/*#__PURE__*/_jsx(SCInputEditorCell, {
|
|
962
|
+
children: /*#__PURE__*/_jsx(ContextMentionEditor, {
|
|
963
|
+
ref: editorRef,
|
|
964
|
+
disabled: disabled,
|
|
965
|
+
placeholder: placeholder,
|
|
966
|
+
maxHeight: editorMaxHeight,
|
|
967
|
+
onInput: handleEditorInput,
|
|
968
|
+
onKeyDown: handleKeyDown,
|
|
969
|
+
onFocus: onFocus,
|
|
970
|
+
onPasteFiles: handlePasteFiles
|
|
971
|
+
})
|
|
972
|
+
}), /*#__PURE__*/_jsxs(SCInputToolbarRow, {
|
|
973
|
+
ref: toolbarRowRef,
|
|
974
|
+
children: [/*#__PURE__*/_jsx(StyledMAIAPlusToolbarCell, {
|
|
975
|
+
children: /*#__PURE__*/_jsxs(PlusMenuToolsRow, {
|
|
976
|
+
children: [/*#__PURE__*/_jsx(PlusToggleButton, {
|
|
977
|
+
type: "button",
|
|
978
|
+
$menuOpen: plusMenuOpen,
|
|
979
|
+
onMouseDown: handlePlusButtonMouseDown,
|
|
980
|
+
onClick: handlePlusButtonClick,
|
|
981
|
+
"aria-label": t('chat.openPlusMenuAria'),
|
|
982
|
+
"aria-haspopup": "true",
|
|
983
|
+
"aria-expanded": plusMenuOpen,
|
|
984
|
+
children: /*#__PURE__*/_jsx(MaiaInputAddIcon, {
|
|
985
|
+
color: toolbarIconColor,
|
|
986
|
+
width: 18,
|
|
987
|
+
height: 18
|
|
988
|
+
})
|
|
989
|
+
}), showMentionButton && /*#__PURE__*/_jsx(PlusToggleButton, {
|
|
990
|
+
type: "button",
|
|
991
|
+
$menuOpen: false,
|
|
992
|
+
onClick: handleMentionButtonClick,
|
|
993
|
+
disabled: disabled,
|
|
994
|
+
"aria-label": t('chat.openMentionAria'),
|
|
995
|
+
children: /*#__PURE__*/_jsx(MaiaInputMentionIcon, {
|
|
996
|
+
color: toolbarIconColor,
|
|
997
|
+
width: 18,
|
|
998
|
+
height: 18
|
|
999
|
+
})
|
|
1000
|
+
}), showSkillsButton && /*#__PURE__*/_jsxs(SkillsToggleButton, {
|
|
1001
|
+
ref: skillsButtonRef,
|
|
1002
|
+
type: "button",
|
|
1003
|
+
onMouseDown: handlePlusButtonMouseDown,
|
|
1004
|
+
onClick: handleSkillsButtonClick,
|
|
1005
|
+
disabled: disabled,
|
|
1006
|
+
"aria-haspopup": "listbox",
|
|
1007
|
+
"aria-expanded": showSkillsDropdown,
|
|
1008
|
+
children: [/*#__PURE__*/_jsx(SkillIcon, {
|
|
1009
|
+
width: 16,
|
|
1010
|
+
height: 16,
|
|
1011
|
+
color: toolbarIconColor
|
|
1012
|
+
}), t('mySkills.dropdownButton')]
|
|
1013
|
+
}), /*#__PURE__*/_jsx(Popover, {
|
|
1014
|
+
open: plusMenuOpen,
|
|
1015
|
+
anchorEl: plusMenuAnchor,
|
|
1016
|
+
onClose: closePlusMenu,
|
|
1017
|
+
disableAutoFocus: true,
|
|
1018
|
+
disableEnforceFocus: true,
|
|
1019
|
+
disableRestoreFocus: true,
|
|
1020
|
+
anchorOrigin: {
|
|
1021
|
+
vertical: 'top',
|
|
1022
|
+
horizontal: 'left'
|
|
1023
|
+
},
|
|
1024
|
+
transformOrigin: {
|
|
1025
|
+
vertical: 'bottom',
|
|
1026
|
+
horizontal: 'left'
|
|
1027
|
+
},
|
|
1028
|
+
sx: {
|
|
1029
|
+
zIndex: plusMenuZIndex
|
|
1030
|
+
},
|
|
1031
|
+
slotProps: {
|
|
1032
|
+
paper: {
|
|
1033
|
+
elevation: 0,
|
|
1034
|
+
sx: {
|
|
1035
|
+
overflow: 'visible',
|
|
1036
|
+
borderRadius: '4px',
|
|
1037
|
+
boxShadow: 'none',
|
|
1038
|
+
backgroundColor: 'transparent',
|
|
1039
|
+
marginTop: '-4px'
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
},
|
|
1043
|
+
children: /*#__PURE__*/_jsx(PlusMenuPaper, {
|
|
1044
|
+
children: /*#__PURE__*/_jsxs(PlusMenuInnerColumn, {
|
|
1045
|
+
children: [/*#__PURE__*/_jsxs(PlusMenuItemButton, {
|
|
1046
|
+
type: "button",
|
|
1047
|
+
onClick: handlePlusMenuAttach,
|
|
1048
|
+
children: [/*#__PURE__*/_jsx(MaiaInputAttachIcon, {
|
|
1049
|
+
color: plusMenuIconColor,
|
|
1050
|
+
width: 21,
|
|
1051
|
+
height: 20
|
|
1052
|
+
}), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
|
|
1053
|
+
children: t('chat.plusMenuAttach')
|
|
1054
|
+
})]
|
|
1055
|
+
}), /*#__PURE__*/_jsx(PlusMenuDivider, {}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
|
|
1056
|
+
type: "button",
|
|
1057
|
+
onClick: handlePlusMenuWebSearch,
|
|
1058
|
+
children: [/*#__PURE__*/_jsx(MaiaInputWebSearchIcon, {
|
|
1059
|
+
color: plusMenuIconColor,
|
|
1060
|
+
width: 20,
|
|
1061
|
+
height: 20
|
|
1062
|
+
}), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
|
|
1063
|
+
children: t('chat.searchWeb')
|
|
1064
|
+
}), isWebSearchActive ? /*#__PURE__*/_jsx(Check, {
|
|
1065
|
+
color: plusMenuIconColor,
|
|
1066
|
+
width: 16,
|
|
1067
|
+
height: 16
|
|
1068
|
+
}) : null]
|
|
1069
|
+
}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
|
|
1070
|
+
type: "button",
|
|
1071
|
+
onClick: handlePlusMenuDeepSearch,
|
|
1072
|
+
children: [/*#__PURE__*/_jsx(MaiaInputDeepSearchIcon, {
|
|
1073
|
+
color: plusMenuIconColor,
|
|
1074
|
+
width: 20,
|
|
1075
|
+
height: 20
|
|
1076
|
+
}), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
|
|
1077
|
+
children: t('chat.plusMenuDeepInvestigation')
|
|
1078
|
+
}), isDeepSearchActive ? /*#__PURE__*/_jsx(Check, {
|
|
1079
|
+
color: plusMenuIconColor,
|
|
1080
|
+
width: 16,
|
|
1081
|
+
height: 16
|
|
1082
|
+
}) : null]
|
|
1083
|
+
}), /*#__PURE__*/_jsx(PlusMenuDivider, {}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
|
|
1084
|
+
type: "button",
|
|
1085
|
+
onClick: handlePlusMenuQuickActions,
|
|
1086
|
+
children: [/*#__PURE__*/_jsx(MaiaInputSlashIcon, {
|
|
1087
|
+
color: plusMenuIconColor,
|
|
1088
|
+
width: 20,
|
|
1089
|
+
height: 20
|
|
1090
|
+
}), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
|
|
1091
|
+
children: t('chat.plusMenuQuickActions')
|
|
1092
|
+
})]
|
|
1093
|
+
})]
|
|
1094
|
+
})
|
|
1095
|
+
})
|
|
1096
|
+
}), (isWebSearchActive || isDeepSearchActive) && /*#__PURE__*/_jsxs(ActiveToolChipRoot, {
|
|
1097
|
+
$hovered: activeToolChipHovered,
|
|
1098
|
+
$exiting: toolChipExiting,
|
|
1099
|
+
onMouseEnter: function onMouseEnter() {
|
|
1100
|
+
return setActiveToolChipHovered(true);
|
|
1101
|
+
},
|
|
1102
|
+
onMouseLeave: function onMouseLeave() {
|
|
1103
|
+
return setActiveToolChipHovered(false);
|
|
1104
|
+
},
|
|
1105
|
+
children: [/*#__PURE__*/_jsx(ActiveToolChipIconButton, {
|
|
1106
|
+
type: "button",
|
|
1107
|
+
$closeShown: activeToolChipHovered,
|
|
1108
|
+
"aria-label": t('chat.removeActiveToolAria'),
|
|
1109
|
+
onClick: function onClick(e) {
|
|
1110
|
+
e.stopPropagation();
|
|
1111
|
+
beginToolChipExit();
|
|
1112
|
+
},
|
|
1113
|
+
children: activeToolChipLeadingIcon
|
|
1114
|
+
}), /*#__PURE__*/_jsx(ActiveToolChipLabel, {
|
|
1115
|
+
children: isWebSearchActive ? t('chat.searchWeb') : t('chat.plusMenuDeepInvestigation')
|
|
1116
|
+
})]
|
|
1117
|
+
})]
|
|
1118
|
+
})
|
|
1119
|
+
}), /*#__PURE__*/_jsxs(StyledMAIASendToolbarCell, {
|
|
1120
|
+
children: [showCustomMetaIndicators && /*#__PURE__*/_jsxs(SCInputMetaIndicators, {
|
|
1121
|
+
children: [hasCorAccess && /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
|
|
1122
|
+
title: t('chat.footer.corAccessTooltip')
|
|
1123
|
+
}, tooltipZIndex != null ? {
|
|
1124
|
+
zIndex: tooltipZIndex
|
|
1125
|
+
} : {}), {}, {
|
|
1126
|
+
children: /*#__PURE__*/_jsx(SCInputMetaIconButton, {
|
|
1127
|
+
"aria-label": t('chat.footer.corAccessLabel'),
|
|
1128
|
+
children: /*#__PURE__*/_jsx(CorAccessIcon, {
|
|
1129
|
+
width: 15,
|
|
1130
|
+
height: 14,
|
|
1131
|
+
color: toolbarIconColor
|
|
1132
|
+
})
|
|
1133
|
+
})
|
|
1134
|
+
})), agentModelName && /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
|
|
1135
|
+
title: t('chipLlm.tooltip', {
|
|
1136
|
+
model: agentModelName
|
|
1137
|
+
})
|
|
1138
|
+
}, tooltipZIndex != null ? {
|
|
1139
|
+
zIndex: tooltipZIndex
|
|
1140
|
+
} : {}), {}, {
|
|
1141
|
+
children: /*#__PURE__*/_jsx(SCInputMetaIconButton, {
|
|
1142
|
+
"aria-label": agentModelName,
|
|
1143
|
+
children: /*#__PURE__*/_jsx(MaiaInputRobotIcon, {
|
|
1144
|
+
width: 18,
|
|
1145
|
+
height: 18,
|
|
1146
|
+
color: toolbarIconColor
|
|
1147
|
+
})
|
|
1148
|
+
})
|
|
1149
|
+
}))]
|
|
1150
|
+
}), isWriting ? /*#__PURE__*/_jsx(Tooltip, {
|
|
1151
|
+
title: t('chat.stop'),
|
|
1152
|
+
zIndex: tooltipZIndex,
|
|
1153
|
+
children: /*#__PURE__*/_jsx(StyledMAIAStopButton, {
|
|
1154
|
+
disabled: false,
|
|
1155
|
+
onClick: handleStopGeneration,
|
|
1156
|
+
className: className,
|
|
1157
|
+
children: /*#__PURE__*/_jsx(StyledMAIAStopIcon, {})
|
|
1158
|
+
})
|
|
1159
|
+
}) : /*#__PURE__*/_jsx(Tooltip, {
|
|
1160
|
+
title: t('chat.send'),
|
|
1161
|
+
zIndex: tooltipZIndex,
|
|
1162
|
+
children: /*#__PURE__*/_jsx("span", {
|
|
1163
|
+
style: {
|
|
1164
|
+
display: 'inline-flex',
|
|
1165
|
+
alignItems: 'center'
|
|
1166
|
+
},
|
|
1167
|
+
children: /*#__PURE__*/_jsx(StyledMAIASendButton, {
|
|
1168
|
+
onClick: handleSendMessage,
|
|
1169
|
+
className: className,
|
|
1170
|
+
disabled: sendDisabled || disabled,
|
|
1171
|
+
hasValues: hasTypingPresence || attachments.length > 0,
|
|
1172
|
+
children: /*#__PURE__*/_jsx(MaiaInputSendIcon, {
|
|
1173
|
+
color: "#BFBFBF",
|
|
1174
|
+
width: 16,
|
|
1175
|
+
height: 16
|
|
1176
|
+
})
|
|
1177
|
+
})
|
|
1178
|
+
})
|
|
1179
|
+
})]
|
|
1180
|
+
})]
|
|
1181
|
+
})]
|
|
1182
|
+
}), /*#__PURE__*/_jsx("input", {
|
|
1183
|
+
ref: fileInputRef,
|
|
1184
|
+
type: "file",
|
|
1185
|
+
multiple: true,
|
|
1186
|
+
accept: ".txt,.md,.csv,.doc,.docx,.ppt,.pptx,.png,.jpg,.jpeg,.pdf,.xlsx,.xls,.flac,.m4a,.mp3,.mp4,.oga,.ogg,.wav,.webm",
|
|
1187
|
+
onChange: handleFileSelect,
|
|
1188
|
+
style: {
|
|
1189
|
+
display: 'none'
|
|
1190
|
+
}
|
|
1191
|
+
}), isFileDragActive && /*#__PURE__*/_jsx(StyledMAIADropOverlay, {
|
|
1192
|
+
children: t('chat.dropFilesHere')
|
|
1193
|
+
})]
|
|
1194
|
+
}), modalProps.isOpen && /*#__PURE__*/_jsx(ModalFileExceeds, {
|
|
1195
|
+
onClose: function onClose() {
|
|
1196
|
+
return setModalProps({
|
|
1197
|
+
isOpen: false,
|
|
1198
|
+
excludedFiles: [],
|
|
1199
|
+
exceededFiles: [],
|
|
1200
|
+
fileSizes: {}
|
|
1201
|
+
});
|
|
1202
|
+
},
|
|
1203
|
+
excludedFiles: modalProps.excludedFiles,
|
|
1204
|
+
exceededFiles: modalProps.exceededFiles,
|
|
1205
|
+
fileSizes: modalProps.fileSizes
|
|
1206
|
+
}), popoverNode && /*#__PURE__*/createPortal(popoverNode, document.body), showSlashDropdown && /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(SlashCommandDropdown, {
|
|
1207
|
+
commands: slashCommands,
|
|
1208
|
+
query: slashQuery,
|
|
1209
|
+
onSelect: handleSelectSlashCommand,
|
|
1210
|
+
onClose: handleCloseSlashDropdown,
|
|
1211
|
+
bottom: slashDropdownPos.bottom,
|
|
1212
|
+
left: slashDropdownPos.left,
|
|
1213
|
+
maxHeight: slashDropdownPos.maxHeight,
|
|
1214
|
+
zIndex: slashDropdownZIndex,
|
|
1215
|
+
anchorRef: wrapperRef
|
|
1216
|
+
}), document.body), showSkillsDropdown && /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(SkillsDropdown, {
|
|
1217
|
+
skills: skills,
|
|
1218
|
+
query: skillsQuery,
|
|
1219
|
+
loading: skillsLoading,
|
|
1220
|
+
error: skillsError,
|
|
1221
|
+
canCreate: showSkillsButton,
|
|
1222
|
+
onSelect: handleSelectSkill,
|
|
1223
|
+
onCreate: handleCreateSkill,
|
|
1224
|
+
onClose: handleCloseSkillsDropdown,
|
|
1225
|
+
bottom: skillsDropdownPos.bottom,
|
|
1226
|
+
left: skillsDropdownPos.left,
|
|
1227
|
+
maxHeight: skillsDropdownPos.maxHeight,
|
|
1228
|
+
zIndex: slashDropdownZIndex,
|
|
1229
|
+
anchorRef: wrapperRef
|
|
1230
|
+
}), document.body)]
|
|
1231
|
+
});
|
|
1232
|
+
};
|
|
1233
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImNyZWF0ZVBvcnRhbCIsIlBvcG92ZXIiLCJDaGVjayIsIkNyb3NzIiwiVG9vbHRpcCIsIkFjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbiIsIkFjdGl2ZVRvb2xDaGlwTGFiZWwiLCJBY3RpdmVUb29sQ2hpcFJvb3QiLCJQbHVzTWVudURpdmlkZXIiLCJQbHVzTWVudUlubmVyQ29sdW1uIiwiUGx1c01lbnVJdGVtQnV0dG9uIiwiUGx1c01lbnVJdGVtTGFiZWwiLCJQbHVzTWVudVBhcGVyIiwiUGx1c01lbnVUb29sc1JvdyIsIlBsdXNUb2dnbGVCdXR0b24iLCJTa2lsbHNUb2dnbGVCdXR0b24iLCJTQ0lucHV0Q2hpcHNSb3ciLCJTQ0lucHV0TWV0YUljb25CdXR0b24iLCJTQ0lucHV0TWV0YUluZGljYXRvcnMiLCJTQ01JQXR0YWNobWVudCIsIlNDTUlBdHRhY2htZW50RGVsZXRlSWNvbiIsIlNDTUlBdHRhY2htZW50RmlsZUljb24iLCJTQ01JQXR0YWNobWVudEljb24iLCJTQ01JQXR0YWNobWVudE5hbWUiLCJTdHlsZWRNQUlBSW5wdXRXcmFwcGVyIiwiU3R5bGVkTUFJQVNlbmRCdXR0b24iLCJTdHlsZWRNQUlBTWFpblRvb2xiYXJHcmlkIiwiU0NJbnB1dEVkaXRvckNlbGwiLCJTQ0lucHV0VG9vbGJhclJvdyIsIlN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGwiLCJTdHlsZWRNQUlBU2VuZFRvb2xiYXJDZWxsIiwiU3R5bGVkTUFJQVN0b3BCdXR0b24iLCJTdHlsZWRNQUlBU3RvcEljb24iLCJTdHlsZWRNQUlBRHJvcE92ZXJsYXkiLCJnZXRNYWlhSW5wdXRFZGl0b3JNYXhIZWlnaHQiLCJNQUlBX0lOUFVUX1RPT0xCQVJfUk9XX0hFSUdIVF9QWCIsInVzZUdsb2JhbENvbnRleHQiLCJNb2RhbEZpbGVFeGNlZWRzIiwiU2xhc2hDb21tYW5kRHJvcGRvd24iLCJTa2lsbHNEcm9wZG93biIsInVzZVNsYXNoQ29tbWFuZHMiLCJ1c2VTa2lsbHNDYXRhbG9nIiwiY2FuQWNjZXNzVG9Ta2lsbHMiLCJ1c2VVc2VyIiwicmVzb2x2ZVF1aWNrQWN0aW9uVHlwZSIsInVzZVQiLCJNYWlhSW5wdXRBZGRJY29uIiwiTWFpYUlucHV0QXR0YWNoSWNvbiIsIk1haWFJbnB1dEF0dGFjaG1lbnRJbWFnZUljb24iLCJNYWlhSW5wdXREZWVwU2VhcmNoSWNvbiIsIkNvckFjY2Vzc0ljb24iLCJNYWlhSW5wdXRNZW50aW9uSWNvbiIsIk1haWFJbnB1dFJvYm90SWNvbiIsIk1haWFJbnB1dFNlbmRJY29uIiwiTWFpYUlucHV0U2xhc2hJY29uIiwiU2tpbGxJY29uIiwiTWFpYUlucHV0V2ViU2VhcmNoSWNvbiIsIkVWRU5UUyIsInVzZUV2ZW50IiwiZ2V0Q2hhdFRvb2xzTWVudUFnZW50VHlwZSIsIk1BSUFfQ0hBVF9JTlBVVF9VSSIsImFsbG93ZWRGaWxlVHlwZXMiLCJmaWxlVHlwZXMiLCJnZXRNYXhBdHRhY2htZW50U2l6ZU1iIiwiTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMiLCJBUFBDVUVTX0VWRU5UUyIsInRyYWNrQXBwY3Vlc0V2ZW50IiwiQ2hpcCIsIkNvbnRleHRNZW50aW9uRWRpdG9yIiwidXNlTWFpYVRhc2tQYW5lbFpJbmRleCIsInVzZU1lbnRpb25Qb3BvdmVyIiwidXNlQ2FyZXRQb3NpdGlvbiIsImRhdGFUcmFuc2Zlckhhc0ZpbGVzIiwiZmlsZXNGcm9tRGF0YVRyYW5zZmVyIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwiVE9PTF9DSElQX0VYSVRfTVMiLCJTTEFTSF9EUk9QRE9XTl9XSURUSF9QWCIsIlNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFgiLCJTS0lMTFNfRFJPUERPV05fV0lEVEhfUFgiLCJTTEFTSF9EUk9QRE9XTl9HQVBfUFgiLCJTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9QQURfUFgiLCJNQUlBSW5wdXQiLCJfcmVmIiwiX2FnZW50JGVudGl0eSIsIl9jb250ZXh0Q2hpcCRpdGVtcyIsIl9jb250ZXh0Q2hpcCRpdGVtczIiLCJfYWdlbnQkY29ubmVjdG9ycyIsIl9hZ2VudCRtb2RlbF9kaXNwbGF5XyIsIl9jb250ZXh0Q2hpcCRpdGVtczMiLCJvblNlbmRNZXNzYWdlIiwiY2xhc3NOYW1lIiwiZGlzYWJsZWQiLCJpc1N0cmVhbWluZyIsImlzV3JpdGluZyIsIm9uU3RvcEdlbmVyYXRpb24iLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwib25Gb2N1cyIsIl9yZWYkYWxpZ25CdXR0b25zIiwiYWxpZ25CdXR0b25zIiwib25GaWxlQXR0YWNoIiwib25EZWxldGVBdHRhY2htZW50IiwiX3JlZiRhdHRhY2htZW50cyIsImF0dGFjaG1lbnRzIiwiY2hhdElkIiwibmV3Q2hhdEtleSIsInRvb2x0aXBaSW5kZXgiLCJleHRlcm5hbFBvcG92ZXJBbmNob3JSZWYiLCJwb3BvdmVyQW5jaG9yUmVmIiwibGF5b3V0TW9kZSIsImNvbnRleHRDaGlwIiwiX3VzZVQiLCJ0IiwiZWRpdG9yUmVmIiwiZmlsZUlucHV0UmVmIiwiY2hpcHNSb3dSZWYiLCJ0b29sYmFyUm93UmVmIiwiaW50ZXJuYWxXcmFwcGVyUmVmIiwid3JhcHBlclJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImhhc1R5cGluZ1ByZXNlbmNlIiwic2V0SGFzVHlwaW5nUHJlc2VuY2UiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImNoaXBzUm93SGVpZ2h0Iiwic2V0Q2hpcHNSb3dIZWlnaHQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInRvb2xiYXJSb3dIZWlnaHQiLCJzZXRUb29sYmFyUm93SGVpZ2h0IiwiX3VzZVN0YXRlNyIsImlzT3BlbiIsImV4Y2x1ZGVkRmlsZXMiLCJleGNlZWRlZEZpbGVzIiwiZmlsZVNpemVzIiwiX3VzZVN0YXRlOCIsIm1vZGFsUHJvcHMiLCJzZXRNb2RhbFByb3BzIiwiZXZlbnRBbXBsaXR1ZGUiLCJfdXNlR2xvYmFsQ29udGV4dCIsInRvZ2dsZVdlYlNlYXJjaCIsImlzV2ViU2VhcmNoQWN0aXZlIiwidG9nZ2xlRGVlcFNlYXJjaCIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsImFnZW50IiwiaW5pdGlhbERyYWZ0IiwiZGVlcExpbmtTZW5kUGVuZGluZ1JlZiIsInBsdXNNZW51WkluZGV4IiwiaW5pdGlhbERyYWZ0QXBwbGllZFJlZiIsIl91c2VNZW50aW9uUG9wb3ZlciIsInBvcG92ZXJPcGVuIiwicmVzZXRNZW50aW9uT3BlblRyYWNraW5nIiwiaGFuZGxlVHJpZ2dlciIsImhhbmRsZVBvcG92ZXJLZXlEb3duIiwiaGFuZGxlS2V5RG93biIsInBvcG92ZXJOb2RlIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJwbHVzTWVudUFuY2hvciIsInNldFBsdXNNZW51QW5jaG9yIiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwiYWN0aXZlVG9vbENoaXBIb3ZlcmVkIiwic2V0QWN0aXZlVG9vbENoaXBIb3ZlcmVkIiwiX3VzZVN0YXRlMTEiLCJfdXNlU3RhdGUxMiIsInRvb2xDaGlwRXhpdGluZyIsInNldFRvb2xDaGlwRXhpdGluZyIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJpc0ZpbGVEcmFnQWN0aXZlIiwic2V0SXNGaWxlRHJhZ0FjdGl2ZSIsInRvb2xDaGlwRXhpdFRpbWVyUmVmIiwiZmlsZURyYWdDb3VudGVyUmVmIiwic2VhcmNoTW9kZUFjdGl2ZVJlZiIsIndlYiIsImRlZXAiLCJwbHVzTWVudU9wZW4iLCJCb29sZWFuIiwicHJldmlvdXNBZ2VudElkUmVmIiwidW5kZWZpbmVkIiwicHJldmlvdXNDaGF0SWRSZWYiLCJwcmV2aW91c05ld0NoYXRLZXlSZWYiLCJwcmV2aW91c0xheW91dE1vZGVSZWYiLCJhbmFseXRpY3NBZ2VudFR5cGUiLCJhbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQiLCJ0eXBlIiwiZW50aXR5IiwiX3VzZVNsYXNoQ29tbWFuZHMiLCJpZCIsInNsYXNoQ29tbWFuZHMiLCJjb21tYW5kcyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJzaG93U2xhc2hEcm9wZG93biIsInNldFNob3dTbGFzaERyb3Bkb3duIiwiX3VzZVN0YXRlMTciLCJfdXNlU3RhdGUxOCIsInNsYXNoUXVlcnkiLCJzZXRTbGFzaFF1ZXJ5Iiwic2xhc2hNZW51V2FzT3BlblJlZiIsInNsYXNoRHJvcGRvd25aSW5kZXgiLCJnZXRDYXJldFJlY3QiLCJfdXNlU3RhdGUxOSIsImJvdHRvbSIsImxlZnQiLCJtYXhIZWlnaHQiLCJfdXNlU3RhdGUyMCIsInNsYXNoRHJvcGRvd25Qb3MiLCJzZXRTbGFzaERyb3Bkb3duUG9zIiwidXNlciIsInNob3dTa2lsbHNCdXR0b24iLCJza2lsbHNCdXR0b25SZWYiLCJza2lsbHNNZW51V2FzT3BlblJlZiIsIl91c2VTa2lsbHNDYXRhbG9nIiwic2tpbGxzIiwic2tpbGxzTG9hZGluZyIsImxvYWRpbmciLCJza2lsbHNFcnJvciIsImVycm9yIiwiZmV0Y2hTa2lsbHMiLCJfdXNlU3RhdGUyMSIsIl91c2VTdGF0ZTIyIiwic2hvd1NraWxsc0Ryb3Bkb3duIiwic2V0U2hvd1NraWxsc0Ryb3Bkb3duIiwiX3VzZVN0YXRlMjMiLCJfdXNlU3RhdGUyNCIsInNraWxsc1F1ZXJ5Iiwic2V0U2tpbGxzUXVlcnkiLCJfdXNlU3RhdGUyNSIsIl91c2VTdGF0ZTI2Iiwic2tpbGxzRHJvcGRvd25Qb3MiLCJzZXRTa2lsbHNEcm9wZG93blBvcyIsInBvc2l0aW9uU2xhc2hEcm9wZG93biIsIl93cmFwcGVyUmVmJGN1cnJlbnQiLCJfY2FyZXQkdG9wIiwiX2NhcmV0JGxlZnQiLCJ3cmFwcGVyUmVjdCIsImN1cnJlbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjYXJldCIsInRvcFNvdXJjZSIsInRvcCIsIndpZHRoIiwibGVmdFNvdXJjZSIsInZpZXdwb3J0SCIsIndpbmRvdyIsImlubmVySGVpZ2h0Iiwidmlld3BvcnRXIiwiaW5uZXJXaWR0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJhdmFpbGFibGVIZWlnaHRQeCIsImhhbmRsZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBvc2l0aW9uU2tpbGxzRHJvcGRvd24iLCJfd3JhcHBlclJlZiRjdXJyZW50MiIsIl9jYXJldCR0b3AyIiwiX2NhcmV0JGxlZnQyIiwic2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0VGltZW91dCIsIl9lZGl0b3JSZWYkY3VycmVudCIsImZvY3VzIiwiY2xvc2VQbHVzTWVudSIsImNhbmNlbFBlbmRpbmdUb29sQ2hpcEV4aXQiLCJjbGVhclRpbWVvdXQiLCJoYW5kbGVQbHVzQnV0dG9uTW91c2VEb3duIiwiZSIsInByZXZlbnREZWZhdWx0IiwiaGFuZGxlUGx1c0J1dHRvbkNsaWNrIiwic3RvcFByb3BhZ2F0aW9uIiwiY3VycmVudFRhcmdldCIsImFpQ2hhdFBsdXNPcGVuIiwiX29iamVjdFNwcmVhZCIsImFnZW50X3R5cGUiLCJoYW5kbGVNZW50aW9uQnV0dG9uQ2xpY2siLCJfZWRpdG9yUmVmJGN1cnJlbnQyIiwiaW5zZXJ0TWVudGlvblRyaWdnZXIiLCJoYW5kbGVQbHVzTWVudUF0dGFjaCIsIl9maWxlSW5wdXRSZWYkY3VycmVudCIsImFpQ2hhdFRvb2xzIiwib3B0aW9uIiwibGVuZ3RoIiwiY2xpY2siLCJiZWdpblRvb2xDaGlwRXhpdCIsIndhc1dlYiIsIndhc0RlZXAiLCJfc2VhcmNoTW9kZUFjdGl2ZVJlZiQiLCJoYW5kbGVQbHVzTWVudVdlYlNlYXJjaCIsImhhbmRsZVBsdXNNZW51RGVlcFNlYXJjaCIsImhhbmRsZVBsdXNNZW51UXVpY2tBY3Rpb25zIiwiX2VkaXRvclJlZiRjdXJyZW50MyIsImluc2VydFNsYXNoVHJpZ2dlciIsIl9lZGl0b3JSZWYkY3VycmVudDQiLCJfZWRpdG9yUmVmJGN1cnJlbnQ1IiwiZHJhZnQiLCJ0cmltIiwic2V0UGxhaW5UZXh0IiwiX2VkaXRvclJlZiRjdXJyZW50NiIsInNlbmREaXNhYmxlZCIsImFnZW50Q2hhbmdlZCIsInByZXZpb3VzQ2hhdElkIiwiY3VycmVudENoYXRJZCIsImNoYXRDaGFuZ2VkIiwiY2hhbmdlZEZyb21OZXdDaGF0VG9PbGRDaGF0IiwibmV3Q2hhdFN0YXJ0ZWQiLCJpc0luaXRpYWxNb3VudCIsImRlbGF5IiwiX2VkaXRvclJlZiRjdXJyZW50NyIsInByZXZpb3VzTGF5b3V0TW9kZSIsInRpbWVvdXRJZCIsIl9lZGl0b3JSZWYkY3VycmVudDgiLCJpc1NwZWNpYWxpc3RBZ2VudCIsIm9ic2VydmVyIiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJfcmVmMiIsIl9yZWYzIiwiZW50cnkiLCJpc0ludGVyc2VjdGluZyIsIm1haWFDb250ZXh0TWVudGlvbkluaXQiLCJkaXNjb25uZWN0IiwidGhyZXNob2xkIiwib2JzZXJ2ZSIsImhhbmRsZVNlc3Npb25DaGFuZ2UiLCJfZWRpdG9yUmVmJGN1cnJlbnQ5IiwiY2xlYXIiLCJkb2N1bWVudCIsImhhbmRsZVJlZm9jdXMiLCJfZWRpdG9yUmVmJGN1cnJlbnQwIiwiaGFuZGxlSW5zZXJ0U2tpbGxNZW50aW9uIiwiZXZlbnQiLCJfZWRpdG9yUmVmJGN1cnJlbnQxIiwiX2VkaXRvclJlZiRjdXJyZW50MTAiLCJfcmVmNCIsImRldGFpbCIsInNraWxsIiwibm9ybWFsaXplZE5hbWUiLCJuYW1lIiwicmVwbGFjZSIsImFwcGVuZE1lbnRpb25BdEVuZCIsImxhYmVsIiwiY29uY2F0IiwiX2VkaXRvclJlZiRjdXJyZW50MTEiLCJoYW5kbGVTZW5kTWVzc2FnZSIsIl9lZGl0b3JSZWYkY3VycmVudDEyIiwiX3N0YXRlJHRleHQiLCJfc3RhdGUkbWVudGlvbnMiLCJfZWRpdG9yUmVmJGN1cnJlbnQxMyIsInN0YXRlIiwic2VyaWFsaXplIiwidGV4dCIsIm1lbnRpb25zIiwiaGFuZGxlU2VsZWN0U2xhc2hDb21tYW5kIiwiY29tbWFuZCIsIl9lZGl0b3JSZWYkY3VycmVudDE0IiwiX3N0YXRlJHRleHQyIiwiX2VkaXRvclJlZiRjdXJyZW50MTYiLCJhaUNoYXRRdWlja0FjdGlvblNlbGVjdCIsInR5cGVfcXVpY2tfYWN0aW9uIiwib3JpZ2luX3F1aWNrX2FjdGlvbiIsInRyaWdnZXJQYXJ0IiwiYmVmb3JlVHJpZ2dlciIsImVuZHNXaXRoIiwic2xpY2UiLCJpc0VtcHR5QmVmb3JlVHJpZ2dlciIsIl9lZGl0b3JSZWYkY3VycmVudDE1IiwidGl0bGUiLCJpbnNlcnRTbGFzaENvbW1hbmQiLCJoYW5kbGVDbG9zZVNsYXNoRHJvcGRvd24iLCJoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3duIiwiaGFuZGxlU2tpbGxzQnV0dG9uQ2xpY2siLCJfZWRpdG9yUmVmJGN1cnJlbnQxNyIsImluc2VydFNraWxsVHJpZ2dlciIsImhhbmRsZVNlbGVjdFNraWxsIiwiX2VkaXRvclJlZiRjdXJyZW50MTgiLCJpbnNlcnRTa2lsbE1lbnRpb24iLCJoYW5kbGVDcmVhdGVTa2lsbCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInNraWxsVmFsdWVzIiwidmFsdWVzIiwiaXNFZGl0aW5nIiwiaW50ZW50IiwiaGFuZGxlRWRpdG9ySW5wdXQiLCJfcmVmNSIsInRyaWdnZXIiLCJzbGFzaFRyaWdnZXIiLCJoYXNoVHJpZ2dlciIsImFjdGl2ZSIsImFpQ2hhdFF1aWNrQWN0aW9uT3BlbiIsInF1ZXJ5Iiwia2V5Iiwic2hpZnRLZXkiLCJhZGRGaWxlcyIsImluY29taW5nIiwiZmlsZXNJbnNlcnRlZCIsImlzTmV3Rm9ybWF0IiwiZXh0ZW5zaW9uIiwiaW5jbHVkZXMiLCJpc09sZEZvcm1hdCIsImlzQXVkaW9Gb3JtYXQiLCJleGNlZWRzTWF4U2l6ZSIsInNpemUiLCJmb3JFYWNoIiwiZmlsZSIsIl9maWxlTmFtZVBhcnRzJHBvcCIsImV4Y2x1ZGVkRmlsZSIsImZpbGVOYW1lUGFydHMiLCJzcGxpdCIsImZpbGVFeHRlbnNpb24iLCJwb3AiLCJ0b0xvd2VyQ2FzZSIsInB1c2giLCJ0eXBlRmlsZSIsInBhcnNlZEZpbGUiLCJGaWxlIiwiaGFuZGxlRmlsZVNlbGVjdCIsImZpbGVzIiwidGFyZ2V0IiwiQXJyYXkiLCJmcm9tIiwidmFsdWUiLCJyZXNldEZpbGVEcmFnIiwiaGFuZGxlRHJhZ0VudGVyIiwiZGF0YVRyYW5zZmVyIiwiaGFuZGxlRHJhZ0xlYXZlIiwiaGFuZGxlRHJhZ092ZXIiLCJkcm9wRWZmZWN0IiwiaGFuZGxlRHJvcCIsImhhbmRsZVBhc3RlRmlsZXMiLCJoYW5kbGVXcmFwcGVyUGFzdGUiLCJfd3JhcHBlclJlZiRjdXJyZW50MyIsImVkaXRvckVsIiwicXVlcnlTZWxlY3RvciIsImNvbnRhaW5zIiwiY2xpcGJvYXJkRGF0YSIsImhhbmRsZURlbGV0ZUF0dGFjaG1lbnQiLCJmaWxlSWQiLCJoYW5kbGVTdG9wR2VuZXJhdGlvbiIsImFpQ2hhdFN0b3BSZXNwb25zZSIsInNob3dDaGlwc1JvdyIsIml0ZW1zIiwiY2hpcHNFbCIsInRvb2xiYXJFbCIsInVwZGF0ZUhlaWdodHMiLCJuZXh0Q2hpcHMiLCJjZWlsIiwiaGVpZ2h0IiwibmV4dFRvb2xiYXIiLCJwcmV2IiwiUmVzaXplT2JzZXJ2ZXIiLCJlZGl0b3JNYXhIZWlnaHQiLCJjaGlwc1Jvd0hlaWdodFB4IiwidG9vbGJhclJvd0hlaWdodFB4IiwidG9vbGJhckljb25Db2xvciIsInBsdXNNZW51SWNvbkNvbG9yIiwibWVudUljb24iLCJpc0N1c3RvbUFnZW50IiwiaGFzQ29yQWNjZXNzIiwiY29ubmVjdG9ycyIsInNvbWUiLCJjb25uZWN0b3IiLCJncm91cCIsInNsdWdzIiwic2x1ZyIsImFnZW50TW9kZWxOYW1lIiwibW9kZWxfZGlzcGxheV9uYW1lIiwic2hvd0N1c3RvbU1ldGFJbmRpY2F0b3JzIiwic2hvd01lbnRpb25CdXR0b24iLCJhY3RpdmVUb29sQ2hpcExlYWRpbmdJY29uIiwiY29sb3IiLCJjaGlwQ2xvc2VJY29uIiwiY2hpbGRyZW4iLCJyZWYiLCJoYXNBdHRhY2htZW50cyIsIiRmaWxlRHJhZ0FjdGl2ZSIsIm9uUGFzdGUiLCJvbkRyYWdFbnRlciIsIm9uRHJhZ0xlYXZlIiwib25EcmFnT3ZlciIsIm9uRHJvcCIsImxlYWRpbmdJY29uIiwibWFwIiwiYXR0YWNobWVudCIsImluZGV4IiwiX2F0dGFjaG1lbnQkdHlwZSIsImlzSW1hZ2UiLCJzdGFydHNXaXRoIiwidGVzdCIsImNoaXBJY29uIiwiekluZGV4IiwiZGVmYXVsdFZhbHVlIiwib25DbGljayIsIm9uSW5wdXQiLCJvbktleURvd24iLCJvblBhc3RlRmlsZXMiLCIkbWVudU9wZW4iLCJvbk1vdXNlRG93biIsIm9wZW4iLCJhbmNob3JFbCIsIm9uQ2xvc2UiLCJkaXNhYmxlQXV0b0ZvY3VzIiwiZGlzYWJsZUVuZm9yY2VGb2N1cyIsImRpc2FibGVSZXN0b3JlRm9jdXMiLCJhbmNob3JPcmlnaW4iLCJ2ZXJ0aWNhbCIsImhvcml6b250YWwiLCJ0cmFuc2Zvcm1PcmlnaW4iLCJzeCIsInNsb3RQcm9wcyIsInBhcGVyIiwiZWxldmF0aW9uIiwib3ZlcmZsb3ciLCJib3JkZXJSYWRpdXMiLCJib3hTaGFkb3ciLCJiYWNrZ3JvdW5kQ29sb3IiLCJtYXJnaW5Ub3AiLCIkaG92ZXJlZCIsIiRleGl0aW5nIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwiJGNsb3NlU2hvd24iLCJtb2RlbCIsInN0eWxlIiwiZGlzcGxheSIsImFsaWduSXRlbXMiLCJoYXNWYWx1ZXMiLCJtdWx0aXBsZSIsImFjY2VwdCIsImJvZHkiLCJvblNlbGVjdCIsImFuY2hvclJlZiIsImNhbkNyZWF0ZSIsIm9uQ3JlYXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvTUFJQUlucHV0L01BSUFJbnB1dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRpbnVlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12b2lkICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmVseS1pZiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuaW1wb3J0IHtcbiAgQ2hhbmdlRXZlbnQsXG4gIENsaXBib2FyZEV2ZW50LFxuICBEcmFnRXZlbnQsXG4gIEtleWJvYXJkRXZlbnQsXG4gIE1vdXNlRXZlbnQsXG4gIFJlYWN0Tm9kZSxcbiAgTXV0YWJsZVJlZk9iamVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IFBvcG92ZXIgfSBmcm9tICdAbXVpL21hdGVyaWFsJ1xuaW1wb3J0IHsgQ2hlY2sgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9DaGVjaydcbmltcG9ydCB7IENyb3NzIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQ3Jvc3MnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5cbmltcG9ydCB7XG4gIEFjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbixcbiAgQWN0aXZlVG9vbENoaXBMYWJlbCxcbiAgQWN0aXZlVG9vbENoaXBSb290LFxuICBQbHVzTWVudURpdmlkZXIsXG4gIFBsdXNNZW51SW5uZXJDb2x1bW4sXG4gIFBsdXNNZW51SXRlbUJ1dHRvbixcbiAgUGx1c01lbnVJdGVtTGFiZWwsXG4gIFBsdXNNZW51UGFwZXIsXG4gIFBsdXNNZW51VG9vbHNSb3csXG4gIFBsdXNUb2dnbGVCdXR0b24sXG4gIFNraWxsc1RvZ2dsZUJ1dHRvbixcbiAgU0NJbnB1dENoaXBzUm93LFxuICBTQ0lucHV0TWV0YUljb25CdXR0b24sXG4gIFNDSW5wdXRNZXRhSW5kaWNhdG9ycyxcbiAgU0NNSUF0dGFjaG1lbnQsXG4gIFNDTUlBdHRhY2htZW50RGVsZXRlSWNvbixcbiAgU0NNSUF0dGFjaG1lbnRGaWxlSWNvbixcbiAgU0NNSUF0dGFjaG1lbnRJY29uLFxuICBTQ01JQXR0YWNobWVudE5hbWUsXG4gIFN0eWxlZE1BSUFJbnB1dFdyYXBwZXIsXG4gIFN0eWxlZE1BSUFTZW5kQnV0dG9uLFxuICBTdHlsZWRNQUlBTWFpblRvb2xiYXJHcmlkLFxuICBTQ0lucHV0RWRpdG9yQ2VsbCxcbiAgU0NJbnB1dFRvb2xiYXJSb3csXG4gIFN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGwsXG4gIFN0eWxlZE1BSUFTZW5kVG9vbGJhckNlbGwsXG4gIFN0eWxlZE1BSUFTdG9wQnV0dG9uLFxuICBTdHlsZWRNQUlBU3RvcEljb24sXG4gIFN0eWxlZE1BSUFEcm9wT3ZlcmxheSxcbn0gZnJvbSAnLi9zdHlsZXMnXG5pbXBvcnQgeyBnZXRNYWlhSW5wdXRFZGl0b3JNYXhIZWlnaHQsIE1BSUFfSU5QVVRfVE9PTEJBUl9ST1dfSEVJR0hUX1BYIH0gZnJvbSAnLi9tYWlhSW5wdXRMYXlvdXQnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IE1vZGFsRmlsZUV4Y2VlZHMgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvTW9kYWxGaWxlRXhjZWVkcydcbmltcG9ydCB7IFNsYXNoQ29tbWFuZERyb3Bkb3duIH0gZnJvbSAnLi4vU2xhc2hDb21tYW5kRHJvcGRvd24nXG5pbXBvcnQgeyBTa2lsbHNEcm9wZG93biB9IGZyb20gJy4uL1NraWxsc0Ryb3Bkb3duJ1xuaW1wb3J0IHsgdXNlU2xhc2hDb21tYW5kcyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNsYXNoQ29tbWFuZHMnXG5pbXBvcnQgeyB1c2VTa2lsbHNDYXRhbG9nIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU2tpbGxzQ2F0YWxvZydcbmltcG9ydCB7IGNhbkFjY2Vzc1RvU2tpbGxzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3Blcm1pc3Npb25zJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgdHlwZSB7IFNraWxsIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvc2tpbGwnXG5pbXBvcnQgeyByZXNvbHZlUXVpY2tBY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvaG91cnNQbGFubmVyUXVpY2tBY3Rpb25UeXBlJ1xuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9BY3Rpb24nXG5pbXBvcnQgeyB1c2VUIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlVCdcbmltcG9ydCB7IE1haWFJbnB1dEFkZEljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRBZGRJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0QXR0YWNoSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dEF0dGFjaEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRBdHRhY2htZW50SW1hZ2VJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0QXR0YWNobWVudEltYWdlSWNvbidcbmltcG9ydCB7IE1haWFJbnB1dERlZXBTZWFyY2hJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0RGVlcFNlYXJjaEljb24nXG5pbXBvcnQgeyBDb3JBY2Nlc3NJY29uIH0gZnJvbSAnLi4vaWNvbnMvQ29yQWNjZXNzSWNvbidcbmltcG9ydCB7IE1haWFJbnB1dE1lbnRpb25JY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0TWVudGlvbkljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRSb2JvdEljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRSb2JvdEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRTZW5kSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dFNlbmRJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0U2xhc2hJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0U2xhc2hJY29uJ1xuaW1wb3J0IHsgU2tpbGxJY29uIH0gZnJvbSAnLi4vaWNvbnMvU2tpbGxJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0V2ViU2VhcmNoSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dFdlYlNlYXJjaEljb24nXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnXG5pbXBvcnQgeyBnZXRDaGF0VG9vbHNNZW51QWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvaGl0bEFuYWx5dGljcydcbmltcG9ydCB7IE1BSUFfQ0hBVF9JTlBVVF9VSSB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9jb25maWcnXG5pbXBvcnQge1xuICBhbGxvd2VkRmlsZVR5cGVzLFxuICBmaWxlVHlwZXMsXG4gIGdldE1heEF0dGFjaG1lbnRTaXplTWIsXG4gIE1BWF9DSEFUX0lOUFVUX0FUVEFDSE1FTlRTLFxufSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZm9ybWF0RXh0ZW5zaW9ucydcbmltcG9ydCB7IEFQUENVRVNfRVZFTlRTLCB0cmFja0FwcGN1ZXNFdmVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwcGN1ZXMnXG5pbXBvcnQgeyBDaGlwIH0gZnJvbSAnLi4vQ2hpcCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uRWRpdG9yLCBDb250ZXh0TWVudGlvbkVkaXRvckhhbmRsZSB9IGZyb20gJy4uL0NvbnRleHRNZW50aW9uRWRpdG9yJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWN5Y2xlXG5pbXBvcnQgeyB1c2VNZW50aW9uUG9wb3ZlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1lbnRpb25Qb3BvdmVyJ1xuaW1wb3J0IHsgdXNlQ2FyZXRQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNhcmV0UG9zaXRpb24nXG5pbXBvcnQgeyBDb250ZXh0RW50aXR5VHlwZSwgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IGRhdGFUcmFuc2Zlckhhc0ZpbGVzLCBmaWxlc0Zyb21EYXRhVHJhbnNmZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9jaGF0SW5wdXRGaWxlcydcblxuY29uc3QgVE9PTF9DSElQX0VYSVRfTVMgPSAyMjBcbmNvbnN0IFNMQVNIX0RST1BET1dOX1dJRFRIX1BYID0gMzQwXG5jb25zdCBTTEFTSF9EUk9QRE9XTl9NQVhfSEVJR0hUX1BYID0gNDE2XG5jb25zdCBTS0lMTFNfRFJPUERPV05fV0lEVEhfUFggPSAzMzlcbmNvbnN0IFNMQVNIX0RST1BET1dOX0dBUF9QWCA9IDRcbmNvbnN0IFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCA9IDhcblxudHlwZSBBdHRhY2htZW50RmlsZSA9IHtcbiAgZmlsZTogRmlsZVxuICBvcmlnaW5hbEZpbGU/OiBGaWxlXG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHNpemU6IG51bWJlclxuICB0eXBlOiBzdHJpbmdcbiAgaWNvbj86IFJlYWN0Tm9kZVxufVxuXG50eXBlIE1BSUFJbnB1dFByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uU2VuZE1lc3NhZ2U6IChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICBmYXFJZD86IHN0cmluZyxcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICBmdWFJZD86IHN0cmluZyxcbiAgICBzY0lkPzogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBvblN0b3BHZW5lcmF0aW9uPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgaXNXcml0aW5nPzogYm9vbGVhblxuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICBvbkNoYW5nZT86ICgpID0+IHZvaWRcbiAgb25Gb2N1cz86ICgpID0+IHZvaWRcbiAgYWxpZ25CdXR0b25zPzogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1xuICBvbkZpbGVBdHRhY2g/OiAoZmlsZTogRmlsZSkgPT4gdm9pZFxuICBvbkRlbGV0ZUF0dGFjaG1lbnQ/OiAoZmlsZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGNoYXRJZD86IHN0cmluZ1xuICBuZXdDaGF0S2V5PzogbnVtYmVyXG4gIHRvb2x0aXBaSW5kZXg/OiBudW1iZXJcbiAgLyoqIEV4cG9uZSBlbCB3cmFwcGVyIGRlbCBpbnB1dCBwYXJhIGFuY2xhciBwb3BvdmVycyAobWVuY2lvbmVzLCBwaW4gZGUgY29udGV4dG8pLiAqL1xuICBwb3BvdmVyQW5jaG9yUmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+XG4gIGxheW91dE1vZGU/OiAnc2lkZWJhcicgfCAnZnVsbHNjcmVlbicgfCAnZmxvYXRpbmcnXG4gIC8qKiBDaGlwIGRlIGNvbnRleHRvICh0YXJlYS9wcm95ZWN0by9jbGllbnRlL2dsb2JhbCkgbW9zdHJhZG8gZW4gbGEgdG9vbGJhciBkZWwgaW5wdXQuICovXG4gIGNvbnRleHRDaGlwPzoge1xuICAgIGl0ZW1zOiBzdHJpbmdbXVxuICAgIHR5cGU/OiBDb250ZXh0RW50aXR5VHlwZVxuICAgIGxlYWRpbmdJY29uPzogUmVhY3ROb2RlXG4gIH0gfCBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBNQUlBSW5wdXQgPSAoe1xuICBvblNlbmRNZXNzYWdlLFxuICBjbGFzc05hbWUsXG4gIGRpc2FibGVkLFxuICBpc1N0cmVhbWluZyxcbiAgaXNXcml0aW5nLFxuICBvblN0b3BHZW5lcmF0aW9uLFxuICBwbGFjZWhvbGRlcixcbiAgb25DaGFuZ2UsXG4gIG9uRm9jdXMsXG4gIGFsaWduQnV0dG9ucyA9ICd2ZXJ0aWNhbCcsXG4gIG9uRmlsZUF0dGFjaCxcbiAgb25EZWxldGVBdHRhY2htZW50LFxuICBhdHRhY2htZW50cyA9IFtdLFxuICBjaGF0SWQsXG4gIG5ld0NoYXRLZXksXG4gIHRvb2x0aXBaSW5kZXgsXG4gIHBvcG92ZXJBbmNob3JSZWY6IGV4dGVybmFsUG9wb3ZlckFuY2hvclJlZixcbiAgbGF5b3V0TW9kZSxcbiAgY29udGV4dENoaXAsXG59OiBNQUlBSW5wdXRQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8Q29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGU+KG51bGwpXG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICBjb25zdCBjaGlwc1Jvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgdG9vbGJhclJvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgaW50ZXJuYWxXcmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCB3cmFwcGVyUmVmID0gZXh0ZXJuYWxQb3BvdmVyQW5jaG9yUmVmID8/IGludGVybmFsV3JhcHBlclJlZlxuICBjb25zdCBbaGFzVHlwaW5nUHJlc2VuY2UsIHNldEhhc1R5cGluZ1ByZXNlbmNlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY2hpcHNSb3dIZWlnaHQsIHNldENoaXBzUm93SGVpZ2h0XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFt0b29sYmFyUm93SGVpZ2h0LCBzZXRUb29sYmFyUm93SGVpZ2h0XSA9IHVzZVN0YXRlKE1BSUFfSU5QVVRfVE9PTEJBUl9ST1dfSEVJR0hUX1BYKVxuICBjb25zdCBbbW9kYWxQcm9wcywgc2V0TW9kYWxQcm9wc10gPSB1c2VTdGF0ZSh7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBleGNsdWRlZEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICBleGNlZWRlZEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICBmaWxlU2l6ZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gIH0pXG4gIGNvbnN0IGV2ZW50QW1wbGl0dWRlID0gdXNlRXZlbnQoKVxuICBjb25zdCB7XG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZURlZXBTZWFyY2gsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGFnZW50LFxuICAgIGluaXRpYWxEcmFmdCxcbiAgICBkZWVwTGlua1NlbmRQZW5kaW5nUmVmLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IHBsdXNNZW51WkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxMzAwLCAnb3ZlcmxheScpXG4gIGNvbnN0IGluaXRpYWxEcmFmdEFwcGxpZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qge1xuICAgIHBvcG92ZXJPcGVuLFxuICAgIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZyxcbiAgICBoYW5kbGVUcmlnZ2VyLFxuICAgIGhhbmRsZUtleURvd246IGhhbmRsZVBvcG92ZXJLZXlEb3duLFxuICAgIHBvcG92ZXJOb2RlLFxuICB9ID0gdXNlTWVudGlvblBvcG92ZXIoe1xuICAgIGVkaXRvclJlZixcbiAgICBwb3BvdmVyQW5jaG9yUmVmOiB3cmFwcGVyUmVmLFxuICB9KVxuXG4gIGNvbnN0IFtwbHVzTWVudUFuY2hvciwgc2V0UGx1c01lbnVBbmNob3JdID0gdXNlU3RhdGU8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbYWN0aXZlVG9vbENoaXBIb3ZlcmVkLCBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt0b29sQ2hpcEV4aXRpbmcsIHNldFRvb2xDaGlwRXhpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzRmlsZURyYWdBY3RpdmUsIHNldElzRmlsZURyYWdBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHRvb2xDaGlwRXhpdFRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbClcbiAgY29uc3QgZmlsZURyYWdDb3VudGVyUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNlYXJjaE1vZGVBY3RpdmVSZWYgPSB1c2VSZWYoeyB3ZWI6IGZhbHNlLCBkZWVwOiBmYWxzZSB9KVxuICBjb25zdCBwbHVzTWVudU9wZW4gPSBCb29sZWFuKHBsdXNNZW51QW5jaG9yKVxuXG4gIC8vIEluaWNpYWxpemFyIGxhcyByZWZlcmVuY2lhcyBjb21vIHVuZGVmaW5lZCBwYXJhIGRldGVjdGFyIGVsIHByaW1lciBjYW1iaW8gY29ycmVjdGFtZW50ZVxuICBjb25zdCBwcmV2aW91c0FnZW50SWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIGNvbnN0IHByZXZpb3VzQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBjb25zdCBwcmV2aW91c05ld0NoYXRLZXlSZWYgPSB1c2VSZWY8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIGNvbnN0IHByZXZpb3VzTGF5b3V0TW9kZVJlZiA9IHVzZVJlZjxNQUlBSW5wdXRQcm9wc1snbGF5b3V0TW9kZSddPih1bmRlZmluZWQpXG5cbiAgY29uc3QgYW5hbHl0aWNzQWdlbnRUeXBlID0gZ2V0Q2hhdFRvb2xzTWVudUFnZW50VHlwZShhZ2VudClcbiAgY29uc3QgYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkID0gYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgPyB7IGVudGl0eTogYWdlbnQuZW50aXR5ID8/IG51bGwgfSA6IHt9XG5cbiAgLy8gU2xhc2ggY29tbWFuZHMgYXBsaWNhbiBhIGNsb25lcyBlc3BlY2lhbGlzdGFzIHkgYWwgb3JjaGVzdHJhdG9yIGdsb2JhbCAoZXN0ZSBhZ3JlZ2EgbG9zIGRlIHN1cyBzdWJhZ2VudGVzKS5cbiAgLy8gTG9zIGN1c3RvbSB5IGxvcyBjbG9uZSBnbG9iYWwvbWFpYWtlciBubyBsb3MgdGllbmVuIGhhYmlsaXRhZG9zLlxuICBjb25zdCB7IGNvbW1hbmRzOiBzbGFzaENvbW1hbmRzIH0gPSB1c2VTbGFzaENvbW1hbmRzKFxuICAgIChhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCcpIHx8XG4gICAgICAoYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiYgYWdlbnQ/LmVudGl0eSAhPT0gJ2dsb2JhbCcpXG4gICAgICA/IGFnZW50Py5pZFxuICAgICAgOiB1bmRlZmluZWRcbiAgKVxuICBjb25zdCBbc2hvd1NsYXNoRHJvcGRvd24sIHNldFNob3dTbGFzaERyb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2xhc2hRdWVyeSwgc2V0U2xhc2hRdWVyeV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3Qgc2xhc2hNZW51V2FzT3BlblJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2xhc2hEcm9wZG93blpJbmRleCA9IHVzZU1haWFUYXNrUGFuZWxaSW5kZXgoMTIwMCwgJ292ZXJsYXknKVxuICBjb25zdCBnZXRDYXJldFJlY3QgPSB1c2VDYXJldFBvc2l0aW9uKClcbiAgY29uc3QgW3NsYXNoRHJvcGRvd25Qb3MsIHNldFNsYXNoRHJvcGRvd25Qb3NdID0gdXNlU3RhdGUoe1xuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIG1heEhlaWdodDogU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCxcbiAgfSlcblxuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHNob3dTa2lsbHNCdXR0b24gPSBjYW5BY2Nlc3NUb1NraWxscyh1c2VyKVxuICBjb25zdCBza2lsbHNCdXR0b25SZWYgPSB1c2VSZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBza2lsbHNNZW51V2FzT3BlblJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgeyBza2lsbHMsIGxvYWRpbmc6IHNraWxsc0xvYWRpbmcsIGVycm9yOiBza2lsbHNFcnJvciwgZmV0Y2hTa2lsbHMgfSA9IHVzZVNraWxsc0NhdGFsb2coKVxuICBjb25zdCBbc2hvd1NraWxsc0Ryb3Bkb3duLCBzZXRTaG93U2tpbGxzRHJvcGRvd25dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtza2lsbHNRdWVyeSwgc2V0U2tpbGxzUXVlcnldID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtza2lsbHNEcm9wZG93blBvcywgc2V0U2tpbGxzRHJvcGRvd25Qb3NdID0gdXNlU3RhdGUoe1xuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIG1heEhlaWdodDogU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCxcbiAgfSlcblxuICBjb25zdCBwb3NpdGlvblNsYXNoRHJvcGRvd24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlclJlY3QgPSB3cmFwcGVyUmVmLmN1cnJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgY2FyZXQgPSBnZXRDYXJldFJlY3QoJy8nKVxuICAgIGNvbnN0IHRvcFNvdXJjZSA9IGNhcmV0Py50b3AgPz8gKHdyYXBwZXJSZWN0ICYmIHdyYXBwZXJSZWN0LndpZHRoID4gMCA/IHdyYXBwZXJSZWN0LnRvcCA6IG51bGwpXG4gICAgY29uc3QgbGVmdFNvdXJjZSA9IGNhcmV0Py5sZWZ0ID8/ICh3cmFwcGVyUmVjdCAmJiB3cmFwcGVyUmVjdC53aWR0aCA+IDAgPyB3cmFwcGVyUmVjdC5sZWZ0IDogbnVsbClcbiAgICBpZiAodG9wU291cmNlID09IG51bGwgfHwgbGVmdFNvdXJjZSA9PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IHZpZXdwb3J0SCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGNvbnN0IHZpZXdwb3J0VyA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KFxuICAgICAgU0xBU0hfRFJPUERPV05fVklFV1BPUlRfUEFEX1BYLFxuICAgICAgTWF0aC5taW4odmlld3BvcnRXIC0gU0xBU0hfRFJPUERPV05fV0lEVEhfUFggLSBTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9QQURfUFgsIGxlZnRTb3VyY2UpXG4gICAgKVxuICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodFB4ID0gdG9wU291cmNlIC0gU0xBU0hfRFJPUERPV05fR0FQX1BYIC0gU0xBU0hfRFJPUERPV05fVklFV1BPUlRfUEFEX1BYXG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4oU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCwgTWF0aC5tYXgoMCwgYXZhaWxhYmxlSGVpZ2h0UHgpKVxuXG4gICAgc2V0U2xhc2hEcm9wZG93blBvcyh7XG4gICAgICBsZWZ0LFxuICAgICAgYm90dG9tOiB2aWV3cG9ydEggLSB0b3BTb3VyY2UgKyBTTEFTSF9EUk9QRE9XTl9HQVBfUFgsXG4gICAgICBtYXhIZWlnaHQsXG4gICAgfSlcbiAgfSwgW3dyYXBwZXJSZWYsIGdldENhcmV0UmVjdF0pXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3dTbGFzaERyb3Bkb3duKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBwb3NpdGlvblNsYXNoRHJvcGRvd24oKVxuXG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHBvc2l0aW9uU2xhc2hEcm9wZG93bigpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZXIsIHRydWUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZXIpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZXIsIHRydWUpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlcilcbiAgICB9XG4gIH0sIFtzaG93U2xhc2hEcm9wZG93biwgc2xhc2hRdWVyeSwgcG9zaXRpb25TbGFzaERyb3Bkb3duXSlcblxuICAvKiogRWwgcG9wb3ZlciBkZSBza2lsbHMgc2UgYW5jbGEgYWwgYCNgIHF1ZSBsbyBhYnJpw7M7IHNpIG5vIGhheSBjYXJldCwgYWwgYm9yZGUgZGVsIGlucHV0LiAqL1xuICBjb25zdCBwb3NpdGlvblNraWxsc0Ryb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gd3JhcHBlclJlZi5jdXJyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGNhcmV0ID0gZ2V0Q2FyZXRSZWN0KCcjJylcbiAgICBjb25zdCB0b3BTb3VyY2UgPSBjYXJldD8udG9wID8/ICh3cmFwcGVyUmVjdCAmJiB3cmFwcGVyUmVjdC53aWR0aCA+IDAgPyB3cmFwcGVyUmVjdC50b3AgOiBudWxsKVxuICAgIGNvbnN0IGxlZnRTb3VyY2UgPSBjYXJldD8ubGVmdCA/PyAod3JhcHBlclJlY3QgJiYgd3JhcHBlclJlY3Qud2lkdGggPiAwID8gd3JhcHBlclJlY3QubGVmdCA6IG51bGwpXG4gICAgaWYgKHRvcFNvdXJjZSA9PSBudWxsIHx8IGxlZnRTb3VyY2UgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICBjb25zdCB2aWV3cG9ydEggPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICBjb25zdCB2aWV3cG9ydFcgPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heChcbiAgICAgIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCxcbiAgICAgIE1hdGgubWluKHZpZXdwb3J0VyAtIFNLSUxMU19EUk9QRE9XTl9XSURUSF9QWCAtIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCwgbGVmdFNvdXJjZSlcbiAgICApXG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0UHggPSB0b3BTb3VyY2UgLSBTTEFTSF9EUk9QRE9XTl9HQVBfUFggLSBTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9QQURfUFhcblxuICAgIHNldFNraWxsc0Ryb3Bkb3duUG9zKHtcbiAgICAgIGxlZnQsXG4gICAgICBib3R0b206IHZpZXdwb3J0SCAtIHRvcFNvdXJjZSArIFNMQVNIX0RST1BET1dOX0dBUF9QWCxcbiAgICAgIG1heEhlaWdodDogTWF0aC5taW4oU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCwgTWF0aC5tYXgoMCwgYXZhaWxhYmxlSGVpZ2h0UHgpKSxcbiAgICB9KVxuICB9LCBbd3JhcHBlclJlZiwgZ2V0Q2FyZXRSZWN0XSlcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2hvd1NraWxsc0Ryb3Bkb3duKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBwb3NpdGlvblNraWxsc0Ryb3Bkb3duKClcblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiBwb3NpdGlvblNraWxsc0Ryb3Bkb3duKClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlciwgdHJ1ZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlciwgdHJ1ZSlcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVyKVxuICAgIH1cbiAgfSwgW3Nob3dTa2lsbHNEcm9wZG93biwgc2tpbGxzUXVlcnksIHBvc2l0aW9uU2tpbGxzRHJvcGRvd25dKVxuXG4gIC8qKiBUcmFzIGVsZWdpciBvIHF1aXRhciBiw7pzcXVlZGEgd2ViL3Byb2Z1bmRhOiB2b2x2ZXIgYWwgdGV4dGFyZWEgKFBvcG92ZXIvbWVudSBwdWVkZSByb2JhciBmb2NvKS4gKi9cbiAgY29uc3Qgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uID0gKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9LCAwKVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjbG9zZVBsdXNNZW51ID0gKCkgPT4ge1xuICAgIHNldFBsdXNNZW51QW5jaG9yKG51bGwpXG4gICAgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uKClcbiAgfVxuXG4gIGNvbnN0IGNhbmNlbFBlbmRpbmdUb29sQ2hpcEV4aXQgPSAoKSA9PiB7XG4gICAgaWYgKHRvb2xDaGlwRXhpdFRpbWVyUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50KVxuICAgICAgdG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICB9XG4gICAgc2V0VG9vbENoaXBFeGl0aW5nKGZhbHNlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGx1c0J1dHRvbk1vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIC8vIEV2aXRhIHF1ZSBlbCBib3TDs24gcm9iZSBlbCBmb2NvIGRlbCBpbnB1dCBhbCBhYnJpciBlbCBtZW7Dui5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVBsdXNCdXR0b25DbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAocGx1c01lbnVBbmNob3IpIHtcbiAgICAgIGNsb3NlUGx1c01lbnUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFBsdXNNZW51QW5jaG9yKGUuY3VycmVudFRhcmdldClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0UGx1c09wZW4sIHsgYWdlbnRfdHlwZTogYW5hbHl0aWNzQWdlbnRUeXBlLCAuLi5hbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQgfSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU1lbnRpb25CdXR0b25DbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGNsb3NlUGx1c01lbnUoKVxuICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRNZW50aW9uVHJpZ2dlcigpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQbHVzTWVudUF0dGFjaCA9ICgpID0+IHtcbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0VG9vbHMsIHtcbiAgICAgIGFnZW50X3R5cGU6IGFuYWx5dGljc0FnZW50VHlwZSxcbiAgICAgIG9wdGlvbjogJ2ZpbGVzJyxcbiAgICAgIC4uLmFuYWx5dGljc0Nsb25lRW50aXR5UGF5bG9hZCxcbiAgICB9KVxuICAgIGlmIChhdHRhY2htZW50cy5sZW5ndGggPj0gTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMpIHJldHVyblxuICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50Py5jbGljaygpXG4gIH1cblxuICBjb25zdCBiZWdpblRvb2xDaGlwRXhpdCA9ICgpID0+IHtcbiAgICBpZiAodG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHdhc1dlYiA9IGlzV2ViU2VhcmNoQWN0aXZlXG4gICAgY29uc3Qgd2FzRGVlcCA9IGlzRGVlcFNlYXJjaEFjdGl2ZVxuICAgIGlmICghd2FzV2ViICYmICF3YXNEZWVwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0VG9vbENoaXBFeGl0aW5nKHRydWUpXG4gICAgdG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGNvbnN0IHsgd2ViLCBkZWVwIH0gPSBzZWFyY2hNb2RlQWN0aXZlUmVmLmN1cnJlbnRcbiAgICAgIGlmICh3YXNXZWIgJiYgd2ViKSB7XG4gICAgICAgIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgICB9IGVsc2UgaWYgKHdhc0RlZXAgJiYgZGVlcCkge1xuICAgICAgICB0b2dnbGVEZWVwU2VhcmNoKClcbiAgICAgIH1cbiAgICAgIHNldFRvb2xDaGlwRXhpdGluZyhmYWxzZSlcbiAgICAgIHNjaGVkdWxlSW5wdXRGb2N1c0FmdGVyVG9vbEFjdGlvbigpXG4gICAgfSwgVE9PTF9DSElQX0VYSVRfTVMpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQbHVzTWVudVdlYlNlYXJjaCA9ICgpID0+IHtcbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHtcbiAgICAgIGJlZ2luVG9vbENoaXBFeGl0KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYW5jZWxQZW5kaW5nVG9vbENoaXBFeGl0KClcbiAgICBpZiAoaXNEZWVwU2VhcmNoQWN0aXZlKSB7XG4gICAgICB0b2dnbGVEZWVwU2VhcmNoKClcbiAgICB9XG4gICAgdG9nZ2xlV2ViU2VhcmNoKClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0VG9vbHMsIHtcbiAgICAgIGFnZW50X3R5cGU6IGFuYWx5dGljc0FnZW50VHlwZSxcbiAgICAgIG9wdGlvbjogJ3NlYXJjaCcsXG4gICAgICAuLi5hbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQsXG4gICAgfSlcbiAgICBzY2hlZHVsZUlucHV0Rm9jdXNBZnRlclRvb2xBY3Rpb24oKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGx1c01lbnVEZWVwU2VhcmNoID0gKCkgPT4ge1xuICAgIGNsb3NlUGx1c01lbnUoKVxuICAgIGlmIChpc0RlZXBTZWFyY2hBY3RpdmUpIHtcbiAgICAgIGJlZ2luVG9vbENoaXBFeGl0KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYW5jZWxQZW5kaW5nVG9vbENoaXBFeGl0KClcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHtcbiAgICAgIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgfVxuICAgIHRvZ2dsZURlZXBTZWFyY2goKVxuICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRUb29scywge1xuICAgICAgYWdlbnRfdHlwZTogYW5hbHl0aWNzQWdlbnRUeXBlLFxuICAgICAgb3B0aW9uOiAnZGVlcF9zZWFyY2gnLFxuICAgICAgLi4uYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkLFxuICAgIH0pXG4gICAgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVBsdXNNZW51UXVpY2tBY3Rpb25zID0gKCkgPT4ge1xuICAgIHNldFBsdXNNZW51QW5jaG9yKG51bGwpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2xhc2hUcmlnZ2VyKClcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICB9XG4gIH0sIFtkaXNhYmxlZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpbml0aWFsRHJhZnRBcHBsaWVkUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9LCBbaW5pdGlhbERyYWZ0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGRyYWZ0ID0gaW5pdGlhbERyYWZ0Py50cmltKClcbiAgICBpZiAoIWRyYWZ0IHx8IGluaXRpYWxEcmFmdEFwcGxpZWRSZWYuY3VycmVudCB8fCBkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXRpYWxEcmFmdEFwcGxpZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICBpZiAoZGVlcExpbmtTZW5kUGVuZGluZ1JlZikge1xuICAgICAgZGVlcExpbmtTZW5kUGVuZGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBlZGl0b3JSZWYuY3VycmVudD8uc2V0UGxhaW5UZXh0KGRyYWZ0KVxuICAgIHNldEhhc1R5cGluZ1ByZXNlbmNlKHRydWUpXG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICB9XG4gIH0sIFtpbml0aWFsRHJhZnQsIGRpc2FibGVkLCBkZWVwTGlua1NlbmRQZW5kaW5nUmVmXSlcblxuICBjb25zdCBzZW5kRGlzYWJsZWQgPSB1c2VNZW1vKFxuICAgICgpID0+ICFoYXNUeXBpbmdQcmVzZW5jZSAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDAsXG4gICAgW2hhc1R5cGluZ1ByZXNlbmNlLCBhdHRhY2htZW50cy5sZW5ndGhdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNlYXJjaE1vZGVBY3RpdmVSZWYuY3VycmVudCA9IHsgd2ViOiBpc1dlYlNlYXJjaEFjdGl2ZSwgZGVlcDogaXNEZWVwU2VhcmNoQWN0aXZlIH1cbiAgfSwgW2lzV2ViU2VhcmNoQWN0aXZlLCBpc0RlZXBTZWFyY2hBY3RpdmVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50KVxuICAgICAgfVxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzV2ViU2VhcmNoQWN0aXZlICYmICFpc0RlZXBTZWFyY2hBY3RpdmUpIHtcbiAgICAgIHNldEFjdGl2ZVRvb2xDaGlwSG92ZXJlZChmYWxzZSlcbiAgICB9XG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICAvLyBBdXRvLWZvY3VzIGN1YW5kbyBjYW1iaWEgZWwgYWdlbnRlIG8gbGEgY29udmVyc2FjacOzbiwgbyBhbCBtb250YXIgZWwgY29tcG9uZW50ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGFnZW50Q2hhbmdlZCA9IHByZXZpb3VzQWdlbnRJZFJlZi5jdXJyZW50ICE9PSBhZ2VudD8uaWRcbiAgICBjb25zdCBwcmV2aW91c0NoYXRJZCA9IHByZXZpb3VzQ2hhdElkUmVmLmN1cnJlbnRcbiAgICBjb25zdCBjdXJyZW50Q2hhdElkID0gY2hhdElkXG4gICAgY29uc3QgY2hhdENoYW5nZWQgPSBwcmV2aW91c0NoYXRJZCAhPT0gY3VycmVudENoYXRJZFxuICAgIGNvbnN0IGNoYW5nZWRGcm9tTmV3Q2hhdFRvT2xkQ2hhdCA9XG4gICAgICAocHJldmlvdXNDaGF0SWQgPT09IHVuZGVmaW5lZCB8fCBwcmV2aW91c0NoYXRJZCA9PT0gbnVsbCkgJiYgY3VycmVudENoYXRJZCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRDaGF0SWQgIT09IG51bGxcbiAgICBjb25zdCBuZXdDaGF0U3RhcnRlZCA9IHByZXZpb3VzTmV3Q2hhdEtleVJlZi5jdXJyZW50ICE9PSBuZXdDaGF0S2V5XG4gICAgY29uc3QgaXNJbml0aWFsTW91bnQgPSBwcmV2aW91c0FnZW50SWRSZWYuY3VycmVudCA9PT0gdW5kZWZpbmVkICYmIHByZXZpb3VzQ2hhdElkUmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZFxuXG4gICAgaWYgKChhZ2VudENoYW5nZWQgfHwgY2hhdENoYW5nZWQgfHwgY2hhbmdlZEZyb21OZXdDaGF0VG9PbGRDaGF0IHx8IG5ld0NoYXRTdGFydGVkIHx8IGlzSW5pdGlhbE1vdW50KSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRlbGF5ID0gaXNJbml0aWFsTW91bnQgfHwgY2hhbmdlZEZyb21OZXdDaGF0VG9PbGRDaGF0ID8gMjAwIDogMTAwXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFkaXNhYmxlZCkgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIH0sIGRlbGF5KVxuICAgIH1cblxuICAgIHByZXZpb3VzQWdlbnRJZFJlZi5jdXJyZW50ID0gYWdlbnQ/LmlkXG4gICAgcHJldmlvdXNDaGF0SWRSZWYuY3VycmVudCA9IGNoYXRJZFxuICAgIHByZXZpb3VzTmV3Q2hhdEtleVJlZi5jdXJyZW50ID0gbmV3Q2hhdEtleVxuICB9LCBbYWdlbnQ/LmlkLCBjaGF0SWQsIG5ld0NoYXRLZXksIGRpc2FibGVkXSlcblxuICAvLyBBdXRvLWZvY3VzIGN1YW5kbyBjYW1iaWEgbGEgZGlzcG9zaWNpw7NuIGRlbCBtb2RhbCAoc2lkZWJhciAvIGZ1bGxzY3JlZW4gLyBmbG9hdGluZylcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxheW91dE1vZGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c0xheW91dE1vZGUgPSBwcmV2aW91c0xheW91dE1vZGVSZWYuY3VycmVudFxuICAgIHByZXZpb3VzTGF5b3V0TW9kZVJlZi5jdXJyZW50ID0gbGF5b3V0TW9kZVxuXG4gICAgaWYgKHByZXZpb3VzTGF5b3V0TW9kZSA9PT0gdW5kZWZpbmVkIHx8IHByZXZpb3VzTGF5b3V0TW9kZSA9PT0gbGF5b3V0TW9kZSB8fCBkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIH1cbiAgICB9LCAyMDApXG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gIH0sIFtsYXlvdXRNb2RlLCBkaXNhYmxlZF0pXG5cbiAgLy8gQXBwY3Vlczogbm90aWZ5IHRoYXQgdGhlIGlucHV0IGlzIHZpc2libGUgZm9yIHNwZWNpYWxpc3QgYWdlbnRzIChjbG9uZSArIHByb2plY3QvY2xpZW50KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGlzU3BlY2lhbGlzdEFnZW50ID0gYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiYgKGFnZW50Py5lbnRpdHkgPT09ICdwcm9qZWN0JyB8fCBhZ2VudD8uZW50aXR5ID09PSAnY2xpZW50JylcbiAgICBpZiAoIXdyYXBwZXJSZWYuY3VycmVudCB8fCAhaXNTcGVjaWFsaXN0QWdlbnQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgKFtlbnRyeV0pID0+IHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgdHJhY2tBcHBjdWVzRXZlbnQoQVBQQ1VFU19FVkVOVFMubWFpYUNvbnRleHRNZW50aW9uSW5pdClcbiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgdGhyZXNob2xkOiAwLjEgfVxuICAgIClcblxuICAgIG9ic2VydmVyLm9ic2VydmUod3JhcHBlclJlZi5jdXJyZW50KVxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW2FnZW50Py5pZCwgYWdlbnQ/LnR5cGUsIGFnZW50Py5lbnRpdHldKVxuXG4gIC8vIENsZWFyIGlucHV0IHdoZW4gc2Vzc2lvbiBjaGFuZ2VzICh1c2VyIHN3aXRjaGVzIHRvIGEgZGlmZmVyZW50IGNoYXQpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlU2Vzc2lvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmIChkZWVwTGlua1NlbmRQZW5kaW5nUmVmKSB7XG4gICAgICAgIGRlZXBMaW5rU2VuZFBlbmRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uY2xlYXIoKVxuICAgICAgc2V0SGFzVHlwaW5nUHJlc2VuY2UoZmFsc2UpXG4gICAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICAgIHNldFNsYXNoUXVlcnkoJycpXG4gICAgICByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSlcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhdC1zZXNzaW9uLWNoYW5nZWQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKVxuICB9LCBbcmVzZXRNZW50aW9uT3BlblRyYWNraW5nLCBkZWVwTGlua1NlbmRQZW5kaW5nUmVmXSlcblxuICAvLyBNYW50ZW5lciBmb2NvIGFsIHNlbGVjY2lvbmFyIHVuIGNvbnRleHRvIHJlY2llbnRlIChlbCBjbGljayBlbiBlbCBwaWxsIGxvIHJvYmEgYWwgaW5wdXQpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVJlZm9jdXMgPSAoKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgaGFuZGxlUmVmb2N1cylcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgaGFuZGxlUmVmb2N1cylcbiAgfSwgW2Rpc2FibGVkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUluc2VydFNraWxsTWVudGlvbiA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgc2tpbGwgfSA9IChldmVudCBhcyBDdXN0b21FdmVudDx7IHNraWxsOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmICghc2tpbGwgfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHNraWxsLm5hbWUucmVwbGFjZSgvXihAXFwvfCMpLywgJycpXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uY2xlYXIoKVxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmFwcGVuZE1lbnRpb25BdEVuZCh7XG4gICAgICAgIGlkOiBza2lsbC5pZCxcbiAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgbGFiZWw6IGAjJHtub3JtYWxpemVkTmFtZX1gLFxuICAgICAgfSlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBoYW5kbGVJbnNlcnRTa2lsbE1lbnRpb24pXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBoYW5kbGVJbnNlcnRTa2lsbE1lbnRpb24pXG4gIH0sIFtkaXNhYmxlZF0pXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBlZGl0b3JSZWYuY3VycmVudD8uc2VyaWFsaXplKClcbiAgICBjb25zdCB0ZXh0ID0gc3RhdGU/LnRleHQgPz8gJydcbiAgICBpZiAoIXRleHQudHJpbSgpICYmICFhdHRhY2htZW50cy5sZW5ndGgpIHJldHVyblxuICAgIGNvbnN0IG1lbnRpb25zID0gc3RhdGU/Lm1lbnRpb25zID8/IFtdXG4gICAgb25TZW5kTWVzc2FnZSh0ZXh0LCBhdHRhY2htZW50cywgbWVudGlvbnMpXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmNsZWFyKClcbiAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZShmYWxzZSlcbiAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgIHNldFNob3dTa2lsbHNEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTa2lsbHNRdWVyeSgnJylcbiAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcoKVxuICB9LCBbYXR0YWNobWVudHMsIG9uU2VuZE1lc3NhZ2UsIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZ10pXG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0U2xhc2hDb21tYW5kID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbW1hbmQ6IEFjdGlvbikgPT4ge1xuICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFF1aWNrQWN0aW9uU2VsZWN0LCB7XG4gICAgICAgIHR5cGVfcXVpY2tfYWN0aW9uOiByZXNvbHZlUXVpY2tBY3Rpb25UeXBlKGNvbW1hbmQpLFxuICAgICAgICBvcmlnaW5fcXVpY2tfYWN0aW9uOiAnc2xhc2hfbWVudScsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IGVkaXRvclJlZi5jdXJyZW50Py5zZXJpYWxpemUoKVxuICAgICAgY29uc3QgdGV4dCA9IHN0YXRlPy50ZXh0ID8/ICcnXG4gICAgICBjb25zdCB0cmlnZ2VyUGFydCA9IGAvJHtzbGFzaFF1ZXJ5fWBcbiAgICAgIGNvbnN0IGJlZm9yZVRyaWdnZXIgPSB0ZXh0LmVuZHNXaXRoKHRyaWdnZXJQYXJ0KSA/IHRleHQuc2xpY2UoMCwgLXRyaWdnZXJQYXJ0Lmxlbmd0aCkgOiB0ZXh0XG4gICAgICBjb25zdCBpc0VtcHR5QmVmb3JlVHJpZ2dlciA9IGJlZm9yZVRyaWdnZXIudHJpbSgpID09PSAnJ1xuXG4gICAgICBpZiAoaXNFbXB0eUJlZm9yZVRyaWdnZXIpIHtcbiAgICAgICAgb25TZW5kTWVzc2FnZShjb21tYW5kLnRpdGxlLCBhdHRhY2htZW50cywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb21tYW5kLmlkKVxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uY2xlYXIoKVxuICAgICAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZShmYWxzZSlcbiAgICAgICAgc2V0U2hvd1NsYXNoRHJvcGRvd24oZmFsc2UpXG4gICAgICAgIHNldFNsYXNoUXVlcnkoJycpXG4gICAgICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2xhc2hDb21tYW5kKHsgaWQ6IGNvbW1hbmQuaWQsIGxhYmVsOiBjb21tYW5kLnRpdGxlIH0pXG4gICAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICAgIHNldFNsYXNoUXVlcnkoJycpXG4gICAgICBzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIH0sXG4gICAgW2F0dGFjaG1lbnRzLCBvblNlbmRNZXNzYWdlLCByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcsIHNsYXNoUXVlcnksIGV2ZW50QW1wbGl0dWRlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlQ2xvc2VTbGFzaERyb3Bkb3duID0gKCkgPT4ge1xuICAgIHNldFNob3dTbGFzaERyb3Bkb3duKGZhbHNlKVxuICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gIH1cblxuICBjb25zdCBoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFNob3dTa2lsbHNEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTa2lsbHNRdWVyeSgnJylcbiAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfSwgW10pXG5cbiAgLyoqIEFicmUgZWwgbGlzdGFkbyBkZXNkZSBlbCBib3TDs246IGluc2VydGEgYCNgIGVuIGVsIGVkaXRvciBwYXJhIHF1ZSBlbCB0cmlnZ2VyIHF1ZWRlIGFjdGl2by4gKi9cbiAgY29uc3QgaGFuZGxlU2tpbGxzQnV0dG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBpZiAoc2hvd1NraWxsc0Ryb3Bkb3duKSB7XG4gICAgICBoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3duKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2tpbGxUcmlnZ2VyKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFNraWxsID0gdXNlQ2FsbGJhY2soKHNraWxsOiBTa2lsbCkgPT4ge1xuICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRTa2lsbE1lbnRpb24oeyBpZDogc2tpbGwuaWQsIHR5cGU6ICdza2lsbCcsIGxhYmVsOiBgIyR7c2tpbGwubmFtZX1gIH0pXG4gICAgc2V0U2hvd1NraWxsc0Ryb3Bkb3duKGZhbHNlKVxuICAgIHNldFNraWxsc1F1ZXJ5KCcnKVxuICAgIHNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVDcmVhdGVTa2lsbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24oZmFsc2UpXG4gICAgc2V0U2tpbGxzUXVlcnkoJycpXG4gICAgc2tpbGxzTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnYWJtLXNraWxsLW1vZGFsLXNldC12YWx1ZXMnLCB7XG4gICAgICAgIGRldGFpbDogeyBza2lsbFZhbHVlczogeyB2YWx1ZXM6IHsgaXNFZGl0aW5nOiBmYWxzZSwgaW50ZW50OiAnd3JpdGUnIH0sIGlzT3BlbjogdHJ1ZSB9IH0sXG4gICAgICB9KVxuICAgIClcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlRWRpdG9ySW5wdXQgPSB1c2VDYWxsYmFjayhcbiAgICAoe1xuICAgICAgdGV4dCxcbiAgICAgIHRyaWdnZXIsXG4gICAgICBzbGFzaFRyaWdnZXIsXG4gICAgICBoYXNoVHJpZ2dlcixcbiAgICB9OiB7XG4gICAgICB0ZXh0OiBzdHJpbmdcbiAgICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZzsgYXRSdW5MZW5ndGg6IG51bWJlciB9XG4gICAgICBzbGFzaFRyaWdnZXI/OiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZyB9XG4gICAgICBoYXNoVHJpZ2dlcj86IHsgYWN0aXZlOiBib29sZWFuOyBxdWVyeTogc3RyaW5nIH1cbiAgICB9KSA9PiB7XG4gICAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZSh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgb25DaGFuZ2U/LigpXG4gICAgICBoYW5kbGVUcmlnZ2VyKHRyaWdnZXIpXG5cbiAgICAgIGlmIChzbGFzaFRyaWdnZXI/LmFjdGl2ZSAmJiBzbGFzaENvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCFzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0UXVpY2tBY3Rpb25PcGVuKVxuICAgICAgICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBzZXRTaG93U2xhc2hEcm9wZG93bih0cnVlKVxuICAgICAgICBzZXRTbGFzaFF1ZXJ5KHNsYXNoVHJpZ2dlci5xdWVyeSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHNldFNob3dTbGFzaERyb3Bkb3duKGZhbHNlKVxuICAgICAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzaFRyaWdnZXI/LmFjdGl2ZSAmJiBzaG93U2tpbGxzQnV0dG9uKSB7XG4gICAgICAgIC8vIEZldGNoIG9uLW9wZW46IHVuYSBzb2xhIGxsYW1hZGEgcG9yIGFwZXJ0dXJhIGRlbCBsaXN0YWRvLlxuICAgICAgICBpZiAoIXNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIHZvaWQgZmV0Y2hTa2lsbHMoKVxuICAgICAgICB9XG4gICAgICAgIHNldFNob3dTa2lsbHNEcm9wZG93bih0cnVlKVxuICAgICAgICBzZXRTa2lsbHNRdWVyeShoYXNoVHJpZ2dlci5xdWVyeSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24oZmFsc2UpXG4gICAgICAgIHNldFNraWxsc1F1ZXJ5KCcnKVxuICAgICAgfVxuICAgIH0sXG4gICAgW29uQ2hhbmdlLCBoYW5kbGVUcmlnZ2VyLCBzbGFzaENvbW1hbmRzLCBldmVudEFtcGxpdHVkZSwgc2hvd1NraWxsc0J1dHRvbiwgZmV0Y2hTa2lsbHNdXG4gIClcblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoaGFuZGxlUG9wb3ZlcktleURvd24oZSkpIHJldHVyblxuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5ICYmICFwb3BvdmVyT3Blbikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgaWYgKCFzZW5kRGlzYWJsZWQgJiYgIWRpc2FibGVkKSBoYW5kbGVTZW5kTWVzc2FnZSgpXG4gICAgICB9XG4gICAgfSxcbiAgICBbaGFuZGxlUG9wb3ZlcktleURvd24sIHBvcG92ZXJPcGVuLCBzZW5kRGlzYWJsZWQsIGRpc2FibGVkLCBoYW5kbGVTZW5kTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGFkZEZpbGVzID0gKGluY29taW5nOiBGaWxlW10pID0+IHtcbiAgICBpZiAoIWluY29taW5nLmxlbmd0aCB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICBjb25zdCBleGNlZWRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgZXhjbHVkZWRGaWxlczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IGZpbGVTaXplczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9XG4gICAgbGV0IGZpbGVzSW5zZXJ0ZWQgPSBhdHRhY2htZW50cy5sZW5ndGhcblxuICAgIGNvbnN0IGlzTmV3Rm9ybWF0ID0gKGV4dGVuc2lvbjogc3RyaW5nKSA9PiBbJy5wbmcnLCAnLmpwZycsICcuanBlZycsICcucGRmJ10uaW5jbHVkZXMoZXh0ZW5zaW9uKVxuICAgIGNvbnN0IGlzT2xkRm9ybWF0ID0gKGV4dGVuc2lvbjogc3RyaW5nKSA9PlxuICAgICAgWycudHh0JywgJy5tZCcsICcuY3N2JywgJy5kb2MnLCAnLmRvY3gnLCAnLnhsc3gnLCAnLnhscycsICcucHB0JywgJy5wcHR4J10uaW5jbHVkZXMoZXh0ZW5zaW9uKVxuICAgIGNvbnN0IGlzQXVkaW9Gb3JtYXQgPSAoZXh0ZW5zaW9uOiBzdHJpbmcpID0+XG4gICAgICBbJy5mbGFjJywgJy5tNGEnLCAnLm1wMycsICcubXA0JywgJy5vZ2EnLCAnLm9nZycsICcud2F2JywgJy53ZWJtJ10uaW5jbHVkZXMoZXh0ZW5zaW9uKVxuXG4gICAgY29uc3QgZXhjZWVkc01heFNpemUgPSAoZXh0ZW5zaW9uOiBzdHJpbmcsIHNpemU6IG51bWJlcikgPT4gc2l6ZSA+IGdldE1heEF0dGFjaG1lbnRTaXplTWIoZXh0ZW5zaW9uKSAqIDEwMjQgKiAxMDI0XG5cbiAgICBpbmNvbWluZy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGV4Y2x1ZGVkRmlsZSA9IGZhbHNlXG4gICAgICBjb25zdCBmaWxlTmFtZVBhcnRzID0gZmlsZS5uYW1lLnNwbGl0KCcuJylcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZVBhcnRzLmxlbmd0aCA+IDEgPyBgLiR7ZmlsZU5hbWVQYXJ0cy5wb3AoKT8udG9Mb3dlckNhc2UoKX1gIDogJydcblxuICAgICAgaWYgKCFhbGxvd2VkRmlsZVR5cGVzPy5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZmlsZVNpemVzW2ZpbGUubmFtZV0gPSBmaWxlLnNpemVcblxuICAgICAgaWYgKGlzTmV3Rm9ybWF0KGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIGlmIChleGNlZWRzTWF4U2l6ZShmaWxlRXh0ZW5zaW9uLCBmaWxlLnNpemUpKSB7XG4gICAgICAgICAgZXhjZWVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNJbnNlcnRlZCArIDEgPiBNQVhfQ0hBVF9JTlBVVF9BVFRBQ0hNRU5UUykge1xuICAgICAgICAgIGV4Y2x1ZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzT2xkRm9ybWF0KGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIGlmIChleGNlZWRzTWF4U2l6ZShmaWxlRXh0ZW5zaW9uLCBmaWxlLnNpemUpKSB7XG4gICAgICAgICAgZXhjZWVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNJbnNlcnRlZCArIDEgPiBNQVhfQ0hBVF9JTlBVVF9BVFRBQ0hNRU5UUykge1xuICAgICAgICAgIGV4Y2x1ZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQXVkaW9Gb3JtYXQoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgaWYgKGV4Y2VlZHNNYXhTaXplKGZpbGVFeHRlbnNpb24sIGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgICBleGNlZWRlZEZpbGVzLnB1c2goZmlsZS5uYW1lKVxuICAgICAgICAgIGV4Y2x1ZGVkRmlsZSA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc0luc2VydGVkICsgMSA+IE1BWF9DSEFUX0lOUFVUX0FUVEFDSE1FTlRTKSB7XG4gICAgICAgICAgZXhjbHVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGNsdWRlZEZpbGUpIHtcbiAgICAgICAgZmlsZXNJbnNlcnRlZCArPSAxXG4gICAgICAgIGNvbnN0IHR5cGVGaWxlID0gZmlsZS50eXBlIHx8IGZpbGVUeXBlc1tmaWxlRXh0ZW5zaW9uXVxuICAgICAgICBjb25zdCBwYXJzZWRGaWxlID0gbmV3IEZpbGUoW2ZpbGVdLCBmaWxlLm5hbWUsIHsgdHlwZTogdHlwZUZpbGUgfSlcbiAgICAgICAgb25GaWxlQXR0YWNoPy4ocGFyc2VkRmlsZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGV4Y2x1ZGVkRmlsZXMubGVuZ3RoIHx8IGV4Y2VlZGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICBzZXRNb2RhbFByb3BzKHsgaXNPcGVuOiB0cnVlLCBleGNsdWRlZEZpbGVzLCBleGNlZWRlZEZpbGVzLCBmaWxlU2l6ZXMgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVGaWxlU2VsZWN0ID0gKGU6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgZmlsZXMgPSBlLnRhcmdldC5maWxlc1xuICAgIGlmIChmaWxlcykge1xuICAgICAgYWRkRmlsZXMoQXJyYXkuZnJvbShmaWxlcykpXG4gICAgfVxuICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc2V0RmlsZURyYWcgPSAoKSA9PiB7XG4gICAgZmlsZURyYWdDb3VudGVyUmVmLmN1cnJlbnQgPSAwXG4gICAgc2V0SXNGaWxlRHJhZ0FjdGl2ZShmYWxzZSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdFbnRlciA9IChlOiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXJIYXNGaWxlcyhlLmRhdGFUcmFuc2ZlcikpIHJldHVyblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGZpbGVEcmFnQ291bnRlclJlZi5jdXJyZW50ICs9IDFcbiAgICBzZXRJc0ZpbGVEcmFnQWN0aXZlKHRydWUpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEcmFnTGVhdmUgPSAoZTogRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmICghaXNGaWxlRHJhZ0FjdGl2ZSAmJiAhZGF0YVRyYW5zZmVySGFzRmlsZXMoZS5kYXRhVHJhbnNmZXIpKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgZmlsZURyYWdDb3VudGVyUmVmLmN1cnJlbnQgPSBNYXRoLm1heCgwLCBmaWxlRHJhZ0NvdW50ZXJSZWYuY3VycmVudCAtIDEpXG4gICAgaWYgKGZpbGVEcmFnQ291bnRlclJlZi5jdXJyZW50ID09PSAwKSB7XG4gICAgICBzZXRJc0ZpbGVEcmFnQWN0aXZlKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdPdmVyID0gKGU6IERyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBpZiAoIWRhdGFUcmFuc2Zlckhhc0ZpbGVzKGUuZGF0YVRyYW5zZmVyKSkgcmV0dXJuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuXG4gICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5J1xuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJvcCA9IChlOiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXJIYXNGaWxlcyhlLmRhdGFUcmFuc2ZlcikpIHtcbiAgICAgIHJlc2V0RmlsZURyYWcoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICByZXNldEZpbGVEcmFnKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGFkZEZpbGVzKGZpbGVzRnJvbURhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2ZlcikpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQYXN0ZUZpbGVzID0gKGZpbGVzOiBGaWxlW10pID0+IHtcbiAgICBhZGRGaWxlcyhmaWxlcylcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVdyYXBwZXJQYXN0ZSA9IChlOiBDbGlwYm9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBjb25zdCBlZGl0b3JFbCA9IHdyYXBwZXJSZWYuY3VycmVudD8ucXVlcnlTZWxlY3RvcignW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKVxuICAgIGlmIChlZGl0b3JFbCAmJiBlZGl0b3JFbC5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuXG4gICAgY29uc3QgZmlsZXMgPSBmaWxlc0Zyb21EYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKVxuICAgIGlmICghZmlsZXMubGVuZ3RoKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBhZGRGaWxlcyhmaWxlcylcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUF0dGFjaG1lbnQgPSAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICBvbkRlbGV0ZUF0dGFjaG1lbnQ/LihmaWxlSWQpXG4gIH1cblxuICBjb25zdCBoYW5kbGVTdG9wR2VuZXJhdGlvbiA9ICgpID0+IHtcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0U3RvcFJlc3BvbnNlKVxuICAgIG9uU3RvcEdlbmVyYXRpb24/LigpXG4gIH1cblxuICBjb25zdCBzaG93Q2hpcHNSb3cgPSBCb29sZWFuKGNvbnRleHRDaGlwPy5pdGVtcz8ubGVuZ3RoIHx8IGF0dGFjaG1lbnRzLmxlbmd0aClcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNoaXBzRWwgPSBjaGlwc1Jvd1JlZi5jdXJyZW50XG4gICAgY29uc3QgdG9vbGJhckVsID0gdG9vbGJhclJvd1JlZi5jdXJyZW50XG5cbiAgICBjb25zdCB1cGRhdGVIZWlnaHRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dENoaXBzID0gc2hvd0NoaXBzUm93ICYmIGNoaXBzRWwgPyBNYXRoLmNlaWwoY2hpcHNFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIDogMFxuICAgICAgY29uc3QgbmV4dFRvb2xiYXIgPSB0b29sYmFyRWxcbiAgICAgICAgPyBNYXRoLmNlaWwodG9vbGJhckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodClcbiAgICAgICAgOiBNQUlBX0lOUFVUX1RPT0xCQVJfUk9XX0hFSUdIVF9QWFxuXG4gICAgICBzZXRDaGlwc1Jvd0hlaWdodChwcmV2ID0+IChwcmV2ID09PSBuZXh0Q2hpcHMgPyBwcmV2IDogbmV4dENoaXBzKSlcbiAgICAgIHNldFRvb2xiYXJSb3dIZWlnaHQocHJldiA9PiAocHJldiA9PT0gbmV4dFRvb2xiYXIgPyBwcmV2IDogbmV4dFRvb2xiYXIpKVxuICAgIH1cblxuICAgIHVwZGF0ZUhlaWdodHMoKVxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodXBkYXRlSGVpZ2h0cylcbiAgICBpZiAoc2hvd0NoaXBzUm93ICYmIGNoaXBzRWwpIG9ic2VydmVyLm9ic2VydmUoY2hpcHNFbClcbiAgICBpZiAodG9vbGJhckVsKSBvYnNlcnZlci5vYnNlcnZlKHRvb2xiYXJFbClcblxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW3Nob3dDaGlwc1JvdywgY29udGV4dENoaXA/Lml0ZW1zPy5sZW5ndGgsIGF0dGFjaG1lbnRzLmxlbmd0aF0pXG5cbiAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZ2V0TWFpYUlucHV0RWRpdG9yTWF4SGVpZ2h0KHtcbiAgICAgICAgY2hpcHNSb3dIZWlnaHRQeDogY2hpcHNSb3dIZWlnaHQsXG4gICAgICAgIHRvb2xiYXJSb3dIZWlnaHRQeDogdG9vbGJhclJvd0hlaWdodCxcbiAgICAgIH0pLFxuICAgIFtjaGlwc1Jvd0hlaWdodCwgdG9vbGJhclJvd0hlaWdodF1cbiAgKVxuXG4gIGNvbnN0IHRvb2xiYXJJY29uQ29sb3IgPSAnIzgwODA4MCdcbiAgY29uc3QgcGx1c01lbnVJY29uQ29sb3IgPSBNQUlBX0NIQVRfSU5QVVRfVUkubWVudUljb25cbiAgY29uc3QgaXNDdXN0b21BZ2VudCA9IGFnZW50Py50eXBlID09PSAnY3VzdG9tJ1xuICBjb25zdCBoYXNDb3JBY2Nlc3MgPSBCb29sZWFuKFxuICAgIGlzQ3VzdG9tQWdlbnQgJiZcbiAgICBhZ2VudD8uY29ubmVjdG9ycz8uc29tZShcbiAgICAgIGNvbm5lY3RvciA9PlxuICAgICAgICBjb25uZWN0b3IuZ3JvdXAgPT09ICdDT1InICYmIGNvbm5lY3Rvci5zbHVncy5zb21lKHNsdWcgPT4gdHlwZW9mIHNsdWcgPT09ICdzdHJpbmcnICYmIHNsdWcudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgKVxuICApXG4gIGNvbnN0IGFnZW50TW9kZWxOYW1lID0gaXNDdXN0b21BZ2VudCA/IGFnZW50Py5tb2RlbF9kaXNwbGF5X25hbWU/LnRyaW0oKSB8fCBudWxsIDogbnVsbFxuICBjb25zdCBzaG93Q3VzdG9tTWV0YUluZGljYXRvcnMgPSBoYXNDb3JBY2Nlc3MgfHwgQm9vbGVhbihhZ2VudE1vZGVsTmFtZSlcbiAgY29uc3Qgc2hvd01lbnRpb25CdXR0b24gPSBhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgfHwgaGFzQ29yQWNjZXNzXG5cbiAgbGV0IGFjdGl2ZVRvb2xDaGlwTGVhZGluZ0ljb246IFJlYWN0Tm9kZVxuICBpZiAoYWN0aXZlVG9vbENoaXBIb3ZlcmVkKSB7XG4gICAgYWN0aXZlVG9vbENoaXBMZWFkaW5nSWNvbiA9IDxDcm9zcyBjb2xvcj17TUFJQV9DSEFUX0lOUFVUX1VJLmNoaXBDbG9zZUljb259IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgfSBlbHNlIGlmIChpc1dlYlNlYXJjaEFjdGl2ZSkge1xuICAgIGFjdGl2ZVRvb2xDaGlwTGVhZGluZ0ljb24gPSA8TWFpYUlucHV0V2ViU2VhcmNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgfSBlbHNlIHtcbiAgICBhY3RpdmVUb29sQ2hpcExlYWRpbmdJY29uID0gPE1haWFJbnB1dERlZXBTZWFyY2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSAvPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPFN0eWxlZE1BSUFJbnB1dFdyYXBwZXJcbiAgICAgICAgcmVmPXt3cmFwcGVyUmVmfVxuICAgICAgICBkaXNhYmxlZD17ZmFsc2V9XG4gICAgICAgIGFsaWduQnV0dG9ucz17YWxpZ25CdXR0b25zfVxuICAgICAgICBoYXNBdHRhY2htZW50cz17ISFhdHRhY2htZW50cy5sZW5ndGh9XG4gICAgICAgICRmaWxlRHJhZ0FjdGl2ZT17aXNGaWxlRHJhZ0FjdGl2ZX1cbiAgICAgICAgZGF0YS1hcHBjdWVzPVwibWFpYV9jaGF0X2lucHV0XCJcbiAgICAgICAgZGF0YS1tYWlhLXN0cmVhbWluZz17aXNTdHJlYW1pbmcgPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgICBvblBhc3RlPXtoYW5kbGVXcmFwcGVyUGFzdGV9XG4gICAgICAgIG9uRHJhZ0VudGVyPXtoYW5kbGVEcmFnRW50ZXJ9XG4gICAgICAgIG9uRHJhZ0xlYXZlPXtoYW5kbGVEcmFnTGVhdmV9XG4gICAgICAgIG9uRHJhZ092ZXI9e2hhbmRsZURyYWdPdmVyfVxuICAgICAgICBvbkRyb3A9e2hhbmRsZURyb3B9XG4gICAgICA+XG4gICAgICAgIHtzaG93Q2hpcHNSb3cgJiYgKFxuICAgICAgICAgIDxTQ0lucHV0Q2hpcHNSb3cgcmVmPXtjaGlwc1Jvd1JlZn0+XG4gICAgICAgICAgICB7Y29udGV4dENoaXA/Lml0ZW1zPy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgIDxDaGlwXG4gICAgICAgICAgICAgICAgaXRlbXM9e2NvbnRleHRDaGlwLml0ZW1zfVxuICAgICAgICAgICAgICAgIHR5cGU9e2NvbnRleHRDaGlwLnR5cGV9XG4gICAgICAgICAgICAgICAgbGVhZGluZ0ljb249e2NvbnRleHRDaGlwLmxlYWRpbmdJY29ufVxuICAgICAgICAgICAgICAgIHRvb2x0aXBaSW5kZXg9e3Rvb2x0aXBaSW5kZXh9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIHthdHRhY2htZW50cy5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzSW1hZ2UgPVxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQudHlwZT8uc3RhcnRzV2l0aCgnaW1hZ2UvJykgfHwgL1xcLihwbmd8anBlP2d8Z2lmfHdlYnB8Ym1wfHN2ZykkL2kudGVzdChhdHRhY2htZW50Lm5hbWUgfHwgJycpXG4gICAgICAgICAgICAgIGNvbnN0IGNoaXBJY29uID0gaXNJbWFnZSA/IChcbiAgICAgICAgICAgICAgICA8TWFpYUlucHV0QXR0YWNobWVudEltYWdlSWNvbiBjb2xvcj1cIiM4MDgwODBcIiB3aWR0aD17MTJ9IGhlaWdodD17MTJ9IC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPE1haWFJbnB1dEF0dGFjaEljb24gY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9ezEzfSBoZWlnaHQ9ezEzfSAvPlxuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17YXR0YWNobWVudC5uYW1lfSBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7aW5kZXh9YH0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICAgICAgICAgIDxTQ01JQXR0YWNobWVudD5cbiAgICAgICAgICAgICAgICAgICAgPFNDTUlBdHRhY2htZW50SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NNSUF0dGFjaG1lbnRGaWxlSWNvbj57Y2hpcEljb259PC9TQ01JQXR0YWNobWVudEZpbGVJY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ01JQXR0YWNobWVudERlbGV0ZUljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgnY2hhdC5yZW1vdmVBdHRhY2htZW50QXJpYScsIHsgZGVmYXVsdFZhbHVlOiAnUXVpdGFyIGFyY2hpdm8nIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQXR0YWNobWVudChhdHRhY2htZW50LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q3Jvc3MgY29sb3I9XCIjNjY2NjY2XCIgd2lkdGg9ezE0fSBoZWlnaHQ9ezE0fSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NNSUF0dGFjaG1lbnREZWxldGVJY29uPlxuICAgICAgICAgICAgICAgICAgICA8L1NDTUlBdHRhY2htZW50SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNDTUlBdHRhY2htZW50TmFtZT57YXR0YWNobWVudC5uYW1lfTwvU0NNSUF0dGFjaG1lbnROYW1lPlxuICAgICAgICAgICAgICAgICAgPC9TQ01JQXR0YWNobWVudD5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU0NJbnB1dENoaXBzUm93PlxuICAgICAgICApfVxuICAgICAgICA8U3R5bGVkTUFJQU1haW5Ub29sYmFyR3JpZD5cbiAgICAgICAgICA8U0NJbnB1dEVkaXRvckNlbGw+XG4gICAgICAgICAgICA8Q29udGV4dE1lbnRpb25FZGl0b3JcbiAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBtYXhIZWlnaHQ9e2VkaXRvck1heEhlaWdodH1cbiAgICAgICAgICAgICAgb25JbnB1dD17aGFuZGxlRWRpdG9ySW5wdXR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgICAgb25QYXN0ZUZpbGVzPXtoYW5kbGVQYXN0ZUZpbGVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1NDSW5wdXRFZGl0b3JDZWxsPlxuICAgICAgICAgIDxTQ0lucHV0VG9vbGJhclJvdyByZWY9e3Rvb2xiYXJSb3dSZWZ9PlxuICAgICAgICAgICAgPFN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGw+XG4gICAgICAgICAgICAgIDxQbHVzTWVudVRvb2xzUm93PlxuICAgICAgICAgICAgICAgIDxQbHVzVG9nZ2xlQnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICRtZW51T3Blbj17cGx1c01lbnVPcGVufVxuICAgICAgICAgICAgICAgICAgb25Nb3VzZURvd249e2hhbmRsZVBsdXNCdXR0b25Nb3VzZURvd259XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQbHVzQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjaGF0Lm9wZW5QbHVzTWVudUFyaWEnKX1cbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9e3BsdXNNZW51T3Blbn1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8TWFpYUlucHV0QWRkSWNvbiBjb2xvcj17dG9vbGJhckljb25Db2xvcn0gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSAvPlxuICAgICAgICAgICAgICAgIDwvUGx1c1RvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICB7c2hvd01lbnRpb25CdXR0b24gJiYgKFxuICAgICAgICAgICAgICAgICAgPFBsdXNUb2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICRtZW51T3Blbj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbnRpb25CdXR0b25DbGlja31cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjaGF0Lm9wZW5NZW50aW9uQXJpYScpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0TWVudGlvbkljb24gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgICAgICAgICAgICAgICAgIDwvUGx1c1RvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtzaG93U2tpbGxzQnV0dG9uICYmIChcbiAgICAgICAgICAgICAgICAgIDxTa2lsbHNUb2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgcmVmPXtza2lsbHNCdXR0b25SZWZ9XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRG93bj17aGFuZGxlUGx1c0J1dHRvbk1vdXNlRG93bn1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2tpbGxzQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXtzaG93U2tpbGxzRHJvcGRvd259XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxTa2lsbEljb24gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSBjb2xvcj17dG9vbGJhckljb25Db2xvcn0gLz5cbiAgICAgICAgICAgICAgICAgICAge3QoJ215U2tpbGxzLmRyb3Bkb3duQnV0dG9uJyl9XG4gICAgICAgICAgICAgICAgICA8L1NraWxsc1RvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgICAgICBvcGVuPXtwbHVzTWVudU9wZW59XG4gICAgICAgICAgICAgICAgICBhbmNob3JFbD17cGx1c01lbnVBbmNob3J9XG4gICAgICAgICAgICAgICAgICBvbkNsb3NlPXtjbG9zZVBsdXNNZW51fVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZUF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZUVuZm9yY2VGb2N1c1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlc3RvcmVGb2N1c1xuICAgICAgICAgICAgICAgICAgYW5jaG9yT3JpZ2luPXt7IHZlcnRpY2FsOiAndG9wJywgaG9yaXpvbnRhbDogJ2xlZnQnIH19XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW49e3sgdmVydGljYWw6ICdib3R0b20nLCBob3Jpem9udGFsOiAnbGVmdCcgfX1cbiAgICAgICAgICAgICAgICAgIHN4PXt7IHpJbmRleDogcGx1c01lbnVaSW5kZXggfX1cbiAgICAgICAgICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgICAgICAgICBwYXBlcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgICBzeDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3hTaGFkb3c6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJy00cHgnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxQbHVzTWVudVBhcGVyPlxuICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJbm5lckNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudUF0dGFjaH0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0QXR0YWNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsyMX0gaGVpZ2h0PXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1MYWJlbD57dCgnY2hhdC5wbHVzTWVudUF0dGFjaCcpfTwvUGx1c01lbnVJdGVtTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudUl0ZW1CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51RGl2aWRlciAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1CdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZVBsdXNNZW51V2ViU2VhcmNofT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNYWlhSW5wdXRXZWJTZWFyY2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUxhYmVsPnt0KCdjaGF0LnNlYXJjaFdlYicpfTwvUGx1c01lbnVJdGVtTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNXZWJTZWFyY2hBY3RpdmUgPyA8Q2hlY2sgY29sb3I9e3BsdXNNZW51SWNvbkNvbG9yfSB3aWR0aD17MTZ9IGhlaWdodD17MTZ9IC8+IDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1BsdXNNZW51SXRlbUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudURlZXBTZWFyY2h9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dERlZXBTZWFyY2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUxhYmVsPnt0KCdjaGF0LnBsdXNNZW51RGVlcEludmVzdGlnYXRpb24nKX08L1BsdXNNZW51SXRlbUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzRGVlcFNlYXJjaEFjdGl2ZSA/IDxDaGVjayBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsxNn0gaGVpZ2h0PXsxNn0gLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgIDwvUGx1c01lbnVJdGVtQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudURpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudVF1aWNrQWN0aW9uc30+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0U2xhc2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUxhYmVsPnt0KCdjaGF0LnBsdXNNZW51UXVpY2tBY3Rpb25zJyl9PC9QbHVzTWVudUl0ZW1MYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1BsdXNNZW51SXRlbUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudUlubmVyQ29sdW1uPlxuICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudVBhcGVyPlxuICAgICAgICAgICAgICAgIDwvUG9wb3Zlcj5cbiAgICAgICAgICAgICAgICB7KGlzV2ViU2VhcmNoQWN0aXZlIHx8IGlzRGVlcFNlYXJjaEFjdGl2ZSkgJiYgKFxuICAgICAgICAgICAgICAgICAgPEFjdGl2ZVRvb2xDaGlwUm9vdFxuICAgICAgICAgICAgICAgICAgICAkaG92ZXJlZD17YWN0aXZlVG9vbENoaXBIb3ZlcmVkfVxuICAgICAgICAgICAgICAgICAgICAkZXhpdGluZz17dG9vbENoaXBFeGl0aW5nfVxuICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEFjdGl2ZVRvb2xDaGlwSG92ZXJlZCh0cnVlKX1cbiAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWQoZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8QWN0aXZlVG9vbENoaXBJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgJGNsb3NlU2hvd249e2FjdGl2ZVRvb2xDaGlwSG92ZXJlZH1cbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjaGF0LnJlbW92ZUFjdGl2ZVRvb2xBcmlhJyl9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpblRvb2xDaGlwRXhpdCgpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmVUb29sQ2hpcExlYWRpbmdJY29ufVxuICAgICAgICAgICAgICAgICAgICA8L0FjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPEFjdGl2ZVRvb2xDaGlwTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAge2lzV2ViU2VhcmNoQWN0aXZlID8gdCgnY2hhdC5zZWFyY2hXZWInKSA6IHQoJ2NoYXQucGx1c01lbnVEZWVwSW52ZXN0aWdhdGlvbicpfVxuICAgICAgICAgICAgICAgICAgICA8L0FjdGl2ZVRvb2xDaGlwTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L0FjdGl2ZVRvb2xDaGlwUm9vdD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L1BsdXNNZW51VG9vbHNSb3c+XG4gICAgICAgICAgICA8L1N0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGw+XG4gICAgICAgICAgICA8U3R5bGVkTUFJQVNlbmRUb29sYmFyQ2VsbD5cbiAgICAgICAgICAgICAge3Nob3dDdXN0b21NZXRhSW5kaWNhdG9ycyAmJiAoXG4gICAgICAgICAgICAgICAgPFNDSW5wdXRNZXRhSW5kaWNhdG9ycz5cbiAgICAgICAgICAgICAgICAgIHtoYXNDb3JBY2Nlc3MgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KCdjaGF0LmZvb3Rlci5jb3JBY2Nlc3NUb29sdGlwJyl9XG4gICAgICAgICAgICAgICAgICAgICAgey4uLih0b29sdGlwWkluZGV4ICE9IG51bGwgPyB7IHpJbmRleDogdG9vbHRpcFpJbmRleCB9IDoge30pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDSW5wdXRNZXRhSWNvbkJ1dHRvbiBhcmlhLWxhYmVsPXt0KCdjaGF0LmZvb3Rlci5jb3JBY2Nlc3NMYWJlbCcpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDb3JBY2Nlc3NJY29uIHdpZHRoPXsxNX0gaGVpZ2h0PXsxNH0gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0lucHV0TWV0YUljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICB7YWdlbnRNb2RlbE5hbWUgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KCdjaGlwTGxtLnRvb2x0aXAnLCB7IG1vZGVsOiBhZ2VudE1vZGVsTmFtZSB9KX1cbiAgICAgICAgICAgICAgICAgICAgICB7Li4uKHRvb2x0aXBaSW5kZXggIT0gbnVsbCA/IHsgekluZGV4OiB0b29sdGlwWkluZGV4IH0gOiB7fSl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NJbnB1dE1ldGFJY29uQnV0dG9uIGFyaWEtbGFiZWw9e2FnZW50TW9kZWxOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNYWlhSW5wdXRSb2JvdEljb24gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSBjb2xvcj17dG9vbGJhckljb25Db2xvcn0gLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NDSW5wdXRNZXRhSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1NDSW5wdXRNZXRhSW5kaWNhdG9ycz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge2lzV3JpdGluZyA/IChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnY2hhdC5zdG9wJyl9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgICAgICA8U3R5bGVkTUFJQVN0b3BCdXR0b24gZGlzYWJsZWQ9e2ZhbHNlfSBvbkNsaWNrPXtoYW5kbGVTdG9wR2VuZXJhdGlvbn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkTUFJQVN0b3BJY29uIC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZE1BSUFTdG9wQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnY2hhdC5zZW5kJyl9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9fT5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZE1BSUFTZW5kQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2VuZE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3NlbmREaXNhYmxlZCB8fCBkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICBoYXNWYWx1ZXM9e2hhc1R5cGluZ1ByZXNlbmNlIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA+IDB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0U2VuZEljb24gY29sb3I9XCIjQkZCRkJGXCIgd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSAvPlxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZE1BSUFTZW5kQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvU3R5bGVkTUFJQVNlbmRUb29sYmFyQ2VsbD5cbiAgICAgICAgICA8L1NDSW5wdXRUb29sYmFyUm93PlxuICAgICAgICA8L1N0eWxlZE1BSUFNYWluVG9vbGJhckdyaWQ+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgIGFjY2VwdD1cIi50eHQsLm1kLC5jc3YsLmRvYywuZG9jeCwucHB0LC5wcHR4LC5wbmcsLmpwZywuanBlZywucGRmLC54bHN4LC54bHMsLmZsYWMsLm00YSwubXAzLC5tcDQsLm9nYSwub2dnLC53YXYsLndlYm1cIlxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVGaWxlU2VsZWN0fVxuICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6ICdub25lJyB9fVxuICAgICAgICAvPlxuICAgICAgICB7aXNGaWxlRHJhZ0FjdGl2ZSAmJiA8U3R5bGVkTUFJQURyb3BPdmVybGF5Pnt0KCdjaGF0LmRyb3BGaWxlc0hlcmUnKX08L1N0eWxlZE1BSUFEcm9wT3ZlcmxheT59XG4gICAgICA8L1N0eWxlZE1BSUFJbnB1dFdyYXBwZXI+XG4gICAgICB7bW9kYWxQcm9wcy5pc09wZW4gJiYgKFxuICAgICAgICA8TW9kYWxGaWxlRXhjZWVkc1xuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldE1vZGFsUHJvcHMoeyBpc09wZW46IGZhbHNlLCBleGNsdWRlZEZpbGVzOiBbXSwgZXhjZWVkZWRGaWxlczogW10sIGZpbGVTaXplczoge30gfSl9XG4gICAgICAgICAgZXhjbHVkZWRGaWxlcz17bW9kYWxQcm9wcy5leGNsdWRlZEZpbGVzfVxuICAgICAgICAgIGV4Y2VlZGVkRmlsZXM9e21vZGFsUHJvcHMuZXhjZWVkZWRGaWxlc31cbiAgICAgICAgICBmaWxlU2l6ZXM9e21vZGFsUHJvcHMuZmlsZVNpemVzfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHtwb3BvdmVyTm9kZSAmJiBjcmVhdGVQb3J0YWwocG9wb3Zlck5vZGUsIGRvY3VtZW50LmJvZHkpfVxuICAgICAge3Nob3dTbGFzaERyb3Bkb3duICYmXG4gICAgICAgIGNyZWF0ZVBvcnRhbChcbiAgICAgICAgICA8U2xhc2hDb21tYW5kRHJvcGRvd25cbiAgICAgICAgICAgIGNvbW1hbmRzPXtzbGFzaENvbW1hbmRzfVxuICAgICAgICAgICAgcXVlcnk9e3NsYXNoUXVlcnl9XG4gICAgICAgICAgICBvblNlbGVjdD17aGFuZGxlU2VsZWN0U2xhc2hDb21tYW5kfVxuICAgICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2VTbGFzaERyb3Bkb3dufVxuICAgICAgICAgICAgYm90dG9tPXtzbGFzaERyb3Bkb3duUG9zLmJvdHRvbX1cbiAgICAgICAgICAgIGxlZnQ9e3NsYXNoRHJvcGRvd25Qb3MubGVmdH1cbiAgICAgICAgICAgIG1heEhlaWdodD17c2xhc2hEcm9wZG93blBvcy5tYXhIZWlnaHR9XG4gICAgICAgICAgICB6SW5kZXg9e3NsYXNoRHJvcGRvd25aSW5kZXh9XG4gICAgICAgICAgICBhbmNob3JSZWY9e3dyYXBwZXJSZWZ9XG4gICAgICAgICAgLz4sXG4gICAgICAgICAgZG9jdW1lbnQuYm9keVxuICAgICAgICApfVxuICAgICAge3Nob3dTa2lsbHNEcm9wZG93biAmJlxuICAgICAgICBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgPFNraWxsc0Ryb3Bkb3duXG4gICAgICAgICAgICBza2lsbHM9e3NraWxsc31cbiAgICAgICAgICAgIHF1ZXJ5PXtza2lsbHNRdWVyeX1cbiAgICAgICAgICAgIGxvYWRpbmc9e3NraWxsc0xvYWRpbmd9XG4gICAgICAgICAgICBlcnJvcj17c2tpbGxzRXJyb3J9XG4gICAgICAgICAgICBjYW5DcmVhdGU9e3Nob3dTa2lsbHNCdXR0b259XG4gICAgICAgICAgICBvblNlbGVjdD17aGFuZGxlU2VsZWN0U2tpbGx9XG4gICAgICAgICAgICBvbkNyZWF0ZT17aGFuZGxlQ3JlYXRlU2tpbGx9XG4gICAgICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3dufVxuICAgICAgICAgICAgYm90dG9tPXtza2lsbHNEcm9wZG93blBvcy5ib3R0b219XG4gICAgICAgICAgICBsZWZ0PXtza2lsbHNEcm9wZG93blBvcy5sZWZ0fVxuICAgICAgICAgICAgbWF4SGVpZ2h0PXtza2lsbHNEcm9wZG93blBvcy5tYXhIZWlnaHR9XG4gICAgICAgICAgICB6SW5kZXg9e3NsYXNoRHJvcGRvd25aSW5kZXh9XG4gICAgICAgICAgICBhbmNob3JSZWY9e3dyYXBwZXJSZWZ9XG4gICAgICAgICAgLz4sXG4gICAgICAgICAgZG9jdW1lbnQuYm9keVxuICAgICAgICApfVxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQVFFQSxXQUFXLEVBQ1hDLFNBQVMsRUFDVEMsZUFBZSxFQUNmQyxPQUFPLEVBQ1BDLE1BQU0sRUFDTkMsUUFBUSxRQUNILE9BQU87QUFDZCxTQUFTQyxZQUFZLFFBQVEsV0FBVztBQUN4QyxTQUFTQyxPQUFPLFFBQVEsZUFBZTtBQUN2QyxTQUFTQyxLQUFLLFFBQVEsd0NBQXdDO0FBQzlELFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUV0RSxTQUNFQyx3QkFBd0IsRUFDeEJDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxlQUFlLEVBQ2ZDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxpQkFBaUIsRUFDakJDLGFBQWEsRUFDYkMsZ0JBQWdCLEVBQ2hCQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxxQkFBcUIsRUFDckJDLHFCQUFxQixFQUNyQkMsY0FBYyxFQUNkQyx3QkFBd0IsRUFDeEJDLHNCQUFzQixFQUN0QkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLHNCQUFzQixFQUN0QkMsb0JBQW9CLEVBQ3BCQyx5QkFBeUIsRUFDekJDLGlCQUFpQixFQUNqQkMsaUJBQWlCLEVBQ2pCQyx5QkFBeUIsRUFDekJDLHlCQUF5QixFQUN6QkMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsRUFDbEJDLHFCQUFxQixRQUNoQixVQUFVO0FBQ2pCLFNBQVNDLDJCQUEyQixFQUFFQyxnQ0FBZ0MsUUFBUSxtQkFBbUI7QUFDakcsU0FBU0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBQ2xFLFNBQVNDLGdCQUFnQixRQUFRLGtDQUFrQztBQUNuRSxTQUFTQyxvQkFBb0IsUUFBUSx5QkFBeUI7QUFDOUQsU0FBU0MsY0FBYyxRQUFRLG1CQUFtQjtBQUNsRCxTQUFTQyxnQkFBZ0IsUUFBUSxpQ0FBaUM7QUFDbEUsU0FBU0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBQ2xFLFNBQVNDLGlCQUFpQixRQUFRLGdDQUFnQztBQUNsRSxTQUFTQyxPQUFPLFFBQVEsMkJBQTJCO0FBRW5ELFNBQVNDLHNCQUFzQixRQUFRLDRDQUE0QztBQUVuRixTQUFTQyxJQUFJLFFBQVEscUJBQXFCO0FBQzFDLFNBQVNDLGdCQUFnQixRQUFRLDJCQUEyQjtBQUM1RCxTQUFTQyxtQkFBbUIsUUFBUSw4QkFBOEI7QUFDbEUsU0FBU0MsNEJBQTRCLFFBQVEsdUNBQXVDO0FBQ3BGLFNBQVNDLHVCQUF1QixRQUFRLGtDQUFrQztBQUMxRSxTQUFTQyxhQUFhLFFBQVEsd0JBQXdCO0FBQ3RELFNBQVNDLG9CQUFvQixRQUFRLCtCQUErQjtBQUNwRSxTQUFTQyxrQkFBa0IsUUFBUSw2QkFBNkI7QUFDaEUsU0FBU0MsaUJBQWlCLFFBQVEsNEJBQTRCO0FBQzlELFNBQVNDLGtCQUFrQixRQUFRLDZCQUE2QjtBQUNoRSxTQUFTQyxTQUFTLFFBQVEsb0JBQW9CO0FBQzlDLFNBQVNDLHNCQUFzQixRQUFRLGlDQUFpQztBQUN4RSxTQUFTQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSx5QkFBeUI7QUFDMUQsU0FBU0MseUJBQXlCLFFBQVEsOEJBQThCO0FBQ3hFLFNBQVNDLGtCQUFrQixRQUFRLHdCQUF3QjtBQUMzRCxTQUNFQyxnQkFBZ0IsRUFDaEJDLFNBQVMsRUFDVEMsc0JBQXNCLEVBQ3RCQywwQkFBMEIsUUFDckIscUNBQXFDO0FBQzVDLFNBQVNDLGNBQWMsRUFBRUMsaUJBQWlCLFFBQVEsMkJBQTJCO0FBQzdFLFNBQVNDLElBQUksUUFBUSxTQUFTO0FBQzlCLFNBQVNDLG9CQUFvQixRQUFvQyx5QkFBeUI7QUFDMUYsU0FBU0Msc0JBQXNCLFFBQVEsdUNBQXVDO0FBQzlFO0FBQ0EsU0FBU0MsaUJBQWlCLFFBQVEsa0NBQWtDO0FBQ3BFLFNBQVNDLGdCQUFnQixRQUFRLGlDQUFpQztBQUVsRSxTQUFTQyxvQkFBb0IsRUFBRUMscUJBQXFCLFFBQVEsK0JBQStCO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQSxFQUFBQyxRQUFBLElBQUFDLFNBQUE7QUFFM0YsSUFBTUMsaUJBQWlCLEdBQUcsR0FBRztBQUM3QixJQUFNQyx1QkFBdUIsR0FBRyxHQUFHO0FBQ25DLElBQU1DLDRCQUE0QixHQUFHLEdBQUc7QUFDeEMsSUFBTUMsd0JBQXdCLEdBQUcsR0FBRztBQUNwQyxJQUFNQyxxQkFBcUIsR0FBRyxDQUFDO0FBQy9CLElBQU1DLDhCQUE4QixHQUFHLENBQUM7QUFnRHhDLE9BQU8sSUFBTUMsU0FBUyxHQUFHLFNBQVpBLFNBQVNBLENBQUFDLElBQUEsRUFvQkE7RUFBQSxJQUFBQyxhQUFBLEVBQUFDLGtCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLGlCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLG1CQUFBO0VBQUEsSUFuQnBCQyxhQUFhLEdBQUFQLElBQUEsQ0FBYk8sYUFBYTtJQUNiQyxTQUFTLEdBQUFSLElBQUEsQ0FBVFEsU0FBUztJQUNUQyxRQUFRLEdBQUFULElBQUEsQ0FBUlMsUUFBUTtJQUNSQyxXQUFXLEdBQUFWLElBQUEsQ0FBWFUsV0FBVztJQUNYQyxTQUFTLEdBQUFYLElBQUEsQ0FBVFcsU0FBUztJQUNUQyxnQkFBZ0IsR0FBQVosSUFBQSxDQUFoQlksZ0JBQWdCO0lBQ2hCQyxXQUFXLEdBQUFiLElBQUEsQ0FBWGEsV0FBVztJQUNYQyxRQUFRLEdBQUFkLElBQUEsQ0FBUmMsUUFBUTtJQUNSQyxPQUFPLEdBQUFmLElBQUEsQ0FBUGUsT0FBTztJQUFBQyxpQkFBQSxHQUFBaEIsSUFBQSxDQUNQaUIsWUFBWTtJQUFaQSxZQUFZLEdBQUFELGlCQUFBLGNBQUcsVUFBVSxHQUFBQSxpQkFBQTtJQUN6QkUsWUFBWSxHQUFBbEIsSUFBQSxDQUFaa0IsWUFBWTtJQUNaQyxrQkFBa0IsR0FBQW5CLElBQUEsQ0FBbEJtQixrQkFBa0I7SUFBQUMsZ0JBQUEsR0FBQXBCLElBQUEsQ0FDbEJxQixXQUFXO0lBQVhBLFdBQVcsR0FBQUQsZ0JBQUEsY0FBRyxFQUFFLEdBQUFBLGdCQUFBO0lBQ2hCRSxNQUFNLEdBQUF0QixJQUFBLENBQU5zQixNQUFNO0lBQ05DLFVBQVUsR0FBQXZCLElBQUEsQ0FBVnVCLFVBQVU7SUFDVkMsYUFBYSxHQUFBeEIsSUFBQSxDQUFid0IsYUFBYTtJQUNLQyx3QkFBd0IsR0FBQXpCLElBQUEsQ0FBMUMwQixnQkFBZ0I7SUFDaEJDLFVBQVUsR0FBQTNCLElBQUEsQ0FBVjJCLFVBQVU7SUFDVkMsV0FBVyxHQUFBNUIsSUFBQSxDQUFYNEIsV0FBVztFQUVYLElBQUFDLEtBQUEsR0FBY3ZFLElBQUksQ0FBQyxDQUFDO0lBQVp3RSxDQUFDLEdBQUFELEtBQUEsQ0FBREMsQ0FBQztFQUNULElBQU1DLFNBQVMsR0FBR3hILE1BQU0sQ0FBNkIsSUFBSSxDQUFDO0VBQzFELElBQU15SCxZQUFZLEdBQUd6SCxNQUFNLENBQW1CLElBQUksQ0FBQztFQUNuRCxJQUFNMEgsV0FBVyxHQUFHMUgsTUFBTSxDQUFpQixJQUFJLENBQUM7RUFDaEQsSUFBTTJILGFBQWEsR0FBRzNILE1BQU0sQ0FBaUIsSUFBSSxDQUFDO0VBQ2xELElBQU00SCxrQkFBa0IsR0FBRzVILE1BQU0sQ0FBaUIsSUFBSSxDQUFDO0VBQ3ZELElBQU02SCxVQUFVLEdBQUdYLHdCQUF3QixhQUF4QkEsd0JBQXdCLGNBQXhCQSx3QkFBd0IsR0FBSVUsa0JBQWtCO0VBQ2pFLElBQUFFLFNBQUEsR0FBa0Q3SCxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUE4SCxVQUFBLEdBQUFDLGNBQUEsQ0FBQUYsU0FBQTtJQUExREcsaUJBQWlCLEdBQUFGLFVBQUE7SUFBRUcsb0JBQW9CLEdBQUFILFVBQUE7RUFDOUMsSUFBQUksVUFBQSxHQUE0Q2xJLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFBQW1JLFVBQUEsR0FBQUosY0FBQSxDQUFBRyxVQUFBO0lBQWhERSxjQUFjLEdBQUFELFVBQUE7SUFBRUUsaUJBQWlCLEdBQUFGLFVBQUE7RUFDeEMsSUFBQUcsVUFBQSxHQUFnRHRJLFFBQVEsQ0FBQ29DLGdDQUFnQyxDQUFDO0lBQUFtRyxVQUFBLEdBQUFSLGNBQUEsQ0FBQU8sVUFBQTtJQUFuRkUsZ0JBQWdCLEdBQUFELFVBQUE7SUFBRUUsbUJBQW1CLEdBQUFGLFVBQUE7RUFDNUMsSUFBQUcsVUFBQSxHQUFvQzFJLFFBQVEsQ0FBQztNQUMzQzJJLE1BQU0sRUFBRSxLQUFLO01BQ2JDLGFBQWEsRUFBRSxFQUFjO01BQzdCQyxhQUFhLEVBQUUsRUFBYztNQUM3QkMsU0FBUyxFQUFFLENBQUM7SUFDZCxDQUFDLENBQUM7SUFBQUMsVUFBQSxHQUFBaEIsY0FBQSxDQUFBVyxVQUFBO0lBTEtNLFVBQVUsR0FBQUQsVUFBQTtJQUFFRSxhQUFhLEdBQUFGLFVBQUE7RUFNaEMsSUFBTUcsY0FBYyxHQUFHdkYsUUFBUSxDQUFDLENBQUM7RUFDakMsSUFBQXdGLGlCQUFBLEdBUUk5RyxnQkFBZ0IsQ0FBQyxDQUFDO0lBUHBCK0csZUFBZSxHQUFBRCxpQkFBQSxDQUFmQyxlQUFlO0lBQ2ZDLGlCQUFpQixHQUFBRixpQkFBQSxDQUFqQkUsaUJBQWlCO0lBQ2pCQyxnQkFBZ0IsR0FBQUgsaUJBQUEsQ0FBaEJHLGdCQUFnQjtJQUNoQkMsa0JBQWtCLEdBQUFKLGlCQUFBLENBQWxCSSxrQkFBa0I7SUFDbEJDLEtBQUssR0FBQUwsaUJBQUEsQ0FBTEssS0FBSztJQUNMQyxZQUFZLEdBQUFOLGlCQUFBLENBQVpNLFlBQVk7SUFDWkMsc0JBQXNCLEdBQUFQLGlCQUFBLENBQXRCTyxzQkFBc0I7RUFFeEIsSUFBTUMsY0FBYyxHQUFHckYsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztFQUM5RCxJQUFNc0Ysc0JBQXNCLEdBQUc3SixNQUFNLENBQUMsS0FBSyxDQUFDO0VBRTVDLElBQUE4SixrQkFBQSxHQU1JdEYsaUJBQWlCLENBQUM7TUFDcEJnRCxTQUFTLEVBQVRBLFNBQVM7TUFDVEwsZ0JBQWdCLEVBQUVVO0lBQ3BCLENBQUMsQ0FBQztJQVJBa0MsV0FBVyxHQUFBRCxrQkFBQSxDQUFYQyxXQUFXO0lBQ1hDLHdCQUF3QixHQUFBRixrQkFBQSxDQUF4QkUsd0JBQXdCO0lBQ3hCQyxhQUFhLEdBQUFILGtCQUFBLENBQWJHLGFBQWE7SUFDRUMsb0JBQW9CLEdBQUFKLGtCQUFBLENBQW5DSyxhQUFhO0lBQ2JDLFdBQVcsR0FBQU4sa0JBQUEsQ0FBWE0sV0FBVztFQU1iLElBQUFDLFVBQUEsR0FBNENwSyxRQUFRLENBQTJCLElBQUksQ0FBQztJQUFBcUssVUFBQSxHQUFBdEMsY0FBQSxDQUFBcUMsVUFBQTtJQUE3RUUsY0FBYyxHQUFBRCxVQUFBO0lBQUVFLGlCQUFpQixHQUFBRixVQUFBO0VBQ3hDLElBQUFHLFVBQUEsR0FBMER4SyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUF5SyxXQUFBLEdBQUExQyxjQUFBLENBQUF5QyxVQUFBO0lBQWxFRSxxQkFBcUIsR0FBQUQsV0FBQTtJQUFFRSx3QkFBd0IsR0FBQUYsV0FBQTtFQUN0RCxJQUFBRyxXQUFBLEdBQThDNUssUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBNkssV0FBQSxHQUFBOUMsY0FBQSxDQUFBNkMsV0FBQTtJQUF0REUsZUFBZSxHQUFBRCxXQUFBO0lBQUVFLGtCQUFrQixHQUFBRixXQUFBO0VBQzFDLElBQUFHLFdBQUEsR0FBZ0RoTCxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFpTCxXQUFBLEdBQUFsRCxjQUFBLENBQUFpRCxXQUFBO0lBQXhERSxnQkFBZ0IsR0FBQUQsV0FBQTtJQUFFRSxtQkFBbUIsR0FBQUYsV0FBQTtFQUM1QyxJQUFNRyxvQkFBb0IsR0FBR3JMLE1BQU0sQ0FBdUMsSUFBSSxDQUFDO0VBQy9FLElBQU1zTCxrQkFBa0IsR0FBR3RMLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDcEMsSUFBTXVMLG1CQUFtQixHQUFHdkwsTUFBTSxDQUFDO0lBQUV3TCxHQUFHLEVBQUUsS0FBSztJQUFFQyxJQUFJLEVBQUU7RUFBTSxDQUFDLENBQUM7RUFDL0QsSUFBTUMsWUFBWSxHQUFHQyxPQUFPLENBQUNwQixjQUFjLENBQUM7O0VBRTVDO0VBQ0EsSUFBTXFCLGtCQUFrQixHQUFHNUwsTUFBTSxDQUFxQjZMLFNBQVMsQ0FBQztFQUNoRSxJQUFNQyxpQkFBaUIsR0FBRzlMLE1BQU0sQ0FBcUI2TCxTQUFTLENBQUM7RUFDL0QsSUFBTUUscUJBQXFCLEdBQUcvTCxNQUFNLENBQXFCNkwsU0FBUyxDQUFDO0VBQ25FLElBQU1HLHFCQUFxQixHQUFHaE0sTUFBTSxDQUErQjZMLFNBQVMsQ0FBQztFQUU3RSxJQUFNSSxrQkFBa0IsR0FBR3BJLHlCQUF5QixDQUFDNEYsS0FBSyxDQUFDO0VBQzNELElBQU15QywyQkFBMkIsR0FBRyxDQUFBekMsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUwQyxJQUFJLE1BQUssT0FBTyxHQUFHO0lBQUVDLE1BQU0sR0FBQTFHLGFBQUEsR0FBRStELEtBQUssQ0FBQzJDLE1BQU0sY0FBQTFHLGFBQUEsY0FBQUEsYUFBQSxHQUFJO0VBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFbkc7RUFDQTtFQUNBLElBQUEyRyxpQkFBQSxHQUFvQzNKLGdCQUFnQixDQUNqRCxDQUFBK0csS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUwQyxJQUFJLE1BQUssY0FBYyxJQUFJLENBQUExQyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTJDLE1BQU0sTUFBSyxRQUFRLElBQzFELENBQUEzQyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTBDLElBQUksTUFBSyxPQUFPLElBQUksQ0FBQTFDLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFMkMsTUFBTSxNQUFLLFFBQVMsR0FDckQzQyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTZDLEVBQUUsR0FDVFQsU0FDTixDQUFDO0lBTGlCVSxhQUFhLEdBQUFGLGlCQUFBLENBQXZCRyxRQUFRO0VBTWhCLElBQUFDLFdBQUEsR0FBa0R4TSxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUF5TSxXQUFBLEdBQUExRSxjQUFBLENBQUF5RSxXQUFBO0lBQTFERSxpQkFBaUIsR0FBQUQsV0FBQTtJQUFFRSxvQkFBb0IsR0FBQUYsV0FBQTtFQUM5QyxJQUFBRyxXQUFBLEdBQW9DNU0sUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUFBNk0sV0FBQSxHQUFBOUUsY0FBQSxDQUFBNkUsV0FBQTtJQUF6Q0UsVUFBVSxHQUFBRCxXQUFBO0lBQUVFLGFBQWEsR0FBQUYsV0FBQTtFQUNoQyxJQUFNRyxtQkFBbUIsR0FBR2pOLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDekMsSUFBTWtOLG1CQUFtQixHQUFHM0ksc0JBQXNCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztFQUNuRSxJQUFNNEksWUFBWSxHQUFHMUksZ0JBQWdCLENBQUMsQ0FBQztFQUN2QyxJQUFBMkksV0FBQSxHQUFnRG5OLFFBQVEsQ0FBQztNQUN2RG9OLE1BQU0sRUFBRSxDQUFDO01BQ1RDLElBQUksRUFBRSxDQUFDO01BQ1BDLFNBQVMsRUFBRW5JO0lBQ2IsQ0FBQyxDQUFDO0lBQUFvSSxXQUFBLEdBQUF4RixjQUFBLENBQUFvRixXQUFBO0lBSktLLGdCQUFnQixHQUFBRCxXQUFBO0lBQUVFLG1CQUFtQixHQUFBRixXQUFBO0VBTTVDLElBQU1HLElBQUksR0FBRzlLLE9BQU8sQ0FBQyxDQUFDO0VBQ3RCLElBQU0rSyxnQkFBZ0IsR0FBR2hMLGlCQUFpQixDQUFDK0ssSUFBSSxDQUFDO0VBQ2hELElBQU1FLGVBQWUsR0FBRzdOLE1BQU0sQ0FBMkIsSUFBSSxDQUFDO0VBQzlELElBQU04TixvQkFBb0IsR0FBRzlOLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDMUMsSUFBQStOLGlCQUFBLEdBQTRFcEwsZ0JBQWdCLENBQUMsQ0FBQztJQUF0RnFMLE1BQU0sR0FBQUQsaUJBQUEsQ0FBTkMsTUFBTTtJQUFXQyxhQUFhLEdBQUFGLGlCQUFBLENBQXRCRyxPQUFPO0lBQXdCQyxXQUFXLEdBQUFKLGlCQUFBLENBQWxCSyxLQUFLO0lBQWVDLFdBQVcsR0FBQU4saUJBQUEsQ0FBWE0sV0FBVztFQUN2RSxJQUFBQyxXQUFBLEdBQW9Eck8sUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBc08sV0FBQSxHQUFBdkcsY0FBQSxDQUFBc0csV0FBQTtJQUE1REUsa0JBQWtCLEdBQUFELFdBQUE7SUFBRUUscUJBQXFCLEdBQUFGLFdBQUE7RUFDaEQsSUFBQUcsV0FBQSxHQUFzQ3pPLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFBQTBPLFdBQUEsR0FBQTNHLGNBQUEsQ0FBQTBHLFdBQUE7SUFBM0NFLFdBQVcsR0FBQUQsV0FBQTtJQUFFRSxjQUFjLEdBQUFGLFdBQUE7RUFDbEMsSUFBQUcsV0FBQSxHQUFrRDdPLFFBQVEsQ0FBQztNQUN6RG9OLE1BQU0sRUFBRSxDQUFDO01BQ1RDLElBQUksRUFBRSxDQUFDO01BQ1BDLFNBQVMsRUFBRW5JO0lBQ2IsQ0FBQyxDQUFDO0lBQUEySixXQUFBLEdBQUEvRyxjQUFBLENBQUE4RyxXQUFBO0lBSktFLGlCQUFpQixHQUFBRCxXQUFBO0lBQUVFLG9CQUFvQixHQUFBRixXQUFBO0VBTTlDLElBQU1HLHFCQUFxQixHQUFHdFAsV0FBVyxDQUFDLFlBQU07SUFBQSxJQUFBdVAsbUJBQUEsRUFBQUMsVUFBQSxFQUFBQyxXQUFBO0lBQzlDLElBQU1DLFdBQVcsSUFBQUgsbUJBQUEsR0FBR3RILFVBQVUsQ0FBQzBILE9BQU8sY0FBQUosbUJBQUEsdUJBQWxCQSxtQkFBQSxDQUFvQksscUJBQXFCLENBQUMsQ0FBQztJQUMvRCxJQUFNQyxLQUFLLEdBQUd0QyxZQUFZLENBQUMsR0FBRyxDQUFDO0lBQy9CLElBQU11QyxTQUFTLElBQUFOLFVBQUEsR0FBR0ssS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVFLEdBQUcsY0FBQVAsVUFBQSxjQUFBQSxVQUFBLEdBQUtFLFdBQVcsSUFBSUEsV0FBVyxDQUFDTSxLQUFLLEdBQUcsQ0FBQyxHQUFHTixXQUFXLENBQUNLLEdBQUcsR0FBRyxJQUFLO0lBQy9GLElBQU1FLFVBQVUsSUFBQVIsV0FBQSxHQUFHSSxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRW5DLElBQUksY0FBQStCLFdBQUEsY0FBQUEsV0FBQSxHQUFLQyxXQUFXLElBQUlBLFdBQVcsQ0FBQ00sS0FBSyxHQUFHLENBQUMsR0FBR04sV0FBVyxDQUFDaEMsSUFBSSxHQUFHLElBQUs7SUFDbEcsSUFBSW9DLFNBQVMsSUFBSSxJQUFJLElBQUlHLFVBQVUsSUFBSSxJQUFJLEVBQUU7SUFFN0MsSUFBTUMsU0FBUyxHQUFHQyxNQUFNLENBQUNDLFdBQVc7SUFDcEMsSUFBTUMsU0FBUyxHQUFHRixNQUFNLENBQUNHLFVBQVU7SUFDbkMsSUFBTTVDLElBQUksR0FBRzZDLElBQUksQ0FBQ0MsR0FBRyxDQUNuQjdLLDhCQUE4QixFQUM5QjRLLElBQUksQ0FBQ0UsR0FBRyxDQUFDSixTQUFTLEdBQUc5Syx1QkFBdUIsR0FBR0ksOEJBQThCLEVBQUVzSyxVQUFVLENBQzNGLENBQUM7SUFDRCxJQUFNUyxpQkFBaUIsR0FBR1osU0FBUyxHQUFHcEsscUJBQXFCLEdBQUdDLDhCQUE4QjtJQUM1RixJQUFNZ0ksU0FBUyxHQUFHNEMsSUFBSSxDQUFDRSxHQUFHLENBQUNqTCw0QkFBNEIsRUFBRStLLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRUUsaUJBQWlCLENBQUMsQ0FBQztJQUV4RjVDLG1CQUFtQixDQUFDO01BQ2xCSixJQUFJLEVBQUpBLElBQUk7TUFDSkQsTUFBTSxFQUFFeUMsU0FBUyxHQUFHSixTQUFTLEdBQUdwSyxxQkFBcUI7TUFDckRpSSxTQUFTLEVBQVRBO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxFQUFFLENBQUMxRixVQUFVLEVBQUVzRixZQUFZLENBQUMsQ0FBQztFQUU5QnJOLGVBQWUsQ0FBQyxZQUFNO0lBQ3BCLElBQUksQ0FBQzZNLGlCQUFpQixFQUFFLE9BQU9kLFNBQVM7SUFFeENxRCxxQkFBcUIsQ0FBQyxDQUFDO0lBRXZCLElBQU1xQixPQUFPLEdBQUcsU0FBVkEsT0FBT0EsQ0FBQTtNQUFBLE9BQVNyQixxQkFBcUIsQ0FBQyxDQUFDO0lBQUE7SUFDN0NhLE1BQU0sQ0FBQ1MsZ0JBQWdCLENBQUMsUUFBUSxFQUFFRCxPQUFPLEVBQUUsSUFBSSxDQUFDO0lBQ2hEUixNQUFNLENBQUNTLGdCQUFnQixDQUFDLFFBQVEsRUFBRUQsT0FBTyxDQUFDO0lBRTFDLE9BQU8sWUFBTTtNQUNYUixNQUFNLENBQUNVLG1CQUFtQixDQUFDLFFBQVEsRUFBRUYsT0FBTyxFQUFFLElBQUksQ0FBQztNQUNuRFIsTUFBTSxDQUFDVSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUVGLE9BQU8sQ0FBQztJQUMvQyxDQUFDO0VBQ0gsQ0FBQyxFQUFFLENBQUM1RCxpQkFBaUIsRUFBRUksVUFBVSxFQUFFbUMscUJBQXFCLENBQUMsQ0FBQzs7RUFFMUQ7RUFDQSxJQUFNd0Isc0JBQXNCLEdBQUc5USxXQUFXLENBQUMsWUFBTTtJQUFBLElBQUErUSxvQkFBQSxFQUFBQyxXQUFBLEVBQUFDLFlBQUE7SUFDL0MsSUFBTXZCLFdBQVcsSUFBQXFCLG9CQUFBLEdBQUc5SSxVQUFVLENBQUMwSCxPQUFPLGNBQUFvQixvQkFBQSx1QkFBbEJBLG9CQUFBLENBQW9CbkIscUJBQXFCLENBQUMsQ0FBQztJQUMvRCxJQUFNQyxLQUFLLEdBQUd0QyxZQUFZLENBQUMsR0FBRyxDQUFDO0lBQy9CLElBQU11QyxTQUFTLElBQUFrQixXQUFBLEdBQUduQixLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUUsR0FBRyxjQUFBaUIsV0FBQSxjQUFBQSxXQUFBLEdBQUt0QixXQUFXLElBQUlBLFdBQVcsQ0FBQ00sS0FBSyxHQUFHLENBQUMsR0FBR04sV0FBVyxDQUFDSyxHQUFHLEdBQUcsSUFBSztJQUMvRixJQUFNRSxVQUFVLElBQUFnQixZQUFBLEdBQUdwQixLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRW5DLElBQUksY0FBQXVELFlBQUEsY0FBQUEsWUFBQSxHQUFLdkIsV0FBVyxJQUFJQSxXQUFXLENBQUNNLEtBQUssR0FBRyxDQUFDLEdBQUdOLFdBQVcsQ0FBQ2hDLElBQUksR0FBRyxJQUFLO0lBQ2xHLElBQUlvQyxTQUFTLElBQUksSUFBSSxJQUFJRyxVQUFVLElBQUksSUFBSSxFQUFFO0lBRTdDLElBQU1DLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxXQUFXO0lBQ3BDLElBQU1DLFNBQVMsR0FBR0YsTUFBTSxDQUFDRyxVQUFVO0lBQ25DLElBQU01QyxJQUFJLEdBQUc2QyxJQUFJLENBQUNDLEdBQUcsQ0FDbkI3Syw4QkFBOEIsRUFDOUI0SyxJQUFJLENBQUNFLEdBQUcsQ0FBQ0osU0FBUyxHQUFHNUssd0JBQXdCLEdBQUdFLDhCQUE4QixFQUFFc0ssVUFBVSxDQUM1RixDQUFDO0lBQ0QsSUFBTVMsaUJBQWlCLEdBQUdaLFNBQVMsR0FBR3BLLHFCQUFxQixHQUFHQyw4QkFBOEI7SUFFNUYwSixvQkFBb0IsQ0FBQztNQUNuQjNCLElBQUksRUFBSkEsSUFBSTtNQUNKRCxNQUFNLEVBQUV5QyxTQUFTLEdBQUdKLFNBQVMsR0FBR3BLLHFCQUFxQjtNQUNyRGlJLFNBQVMsRUFBRTRDLElBQUksQ0FBQ0UsR0FBRyxDQUFDakwsNEJBQTRCLEVBQUUrSyxJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUVFLGlCQUFpQixDQUFDO0lBQ2xGLENBQUMsQ0FBQztFQUNKLENBQUMsRUFBRSxDQUFDekksVUFBVSxFQUFFc0YsWUFBWSxDQUFDLENBQUM7RUFFOUJyTixlQUFlLENBQUMsWUFBTTtJQUNwQixJQUFJLENBQUMwTyxrQkFBa0IsRUFBRSxPQUFPM0MsU0FBUztJQUV6QzZFLHNCQUFzQixDQUFDLENBQUM7SUFFeEIsSUFBTUgsT0FBTyxHQUFHLFNBQVZBLE9BQU9BLENBQUE7TUFBQSxPQUFTRyxzQkFBc0IsQ0FBQyxDQUFDO0lBQUE7SUFDOUNYLE1BQU0sQ0FBQ1MsZ0JBQWdCLENBQUMsUUFBUSxFQUFFRCxPQUFPLEVBQUUsSUFBSSxDQUFDO0lBQ2hEUixNQUFNLENBQUNTLGdCQUFnQixDQUFDLFFBQVEsRUFBRUQsT0FBTyxDQUFDO0lBRTFDLE9BQU8sWUFBTTtNQUNYUixNQUFNLENBQUNVLG1CQUFtQixDQUFDLFFBQVEsRUFBRUYsT0FBTyxFQUFFLElBQUksQ0FBQztNQUNuRFIsTUFBTSxDQUFDVSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUVGLE9BQU8sQ0FBQztJQUMvQyxDQUFDO0VBQ0gsQ0FBQyxFQUFFLENBQUMvQixrQkFBa0IsRUFBRUksV0FBVyxFQUFFOEIsc0JBQXNCLENBQUMsQ0FBQzs7RUFFN0Q7RUFDQSxJQUFNSSxpQ0FBaUMsR0FBRyxTQUFwQ0EsaUNBQWlDQSxDQUFBLEVBQVM7SUFDOUMsSUFBSTVLLFFBQVEsRUFBRTtNQUNaO0lBQ0Y7SUFDQTZLLHFCQUFxQixDQUFDLFlBQU07TUFDMUJoQixNQUFNLENBQUNpQixVQUFVLENBQUMsWUFBTTtRQUFBLElBQUFDLGtCQUFBO1FBQ3RCLENBQUFBLGtCQUFBLEdBQUF6SixTQUFTLENBQUMrSCxPQUFPLGNBQUEwQixrQkFBQSxlQUFqQkEsa0JBQUEsQ0FBbUJDLEtBQUssQ0FBQyxDQUFDO01BQzVCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7RUFDSixDQUFDO0VBRUQsSUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFBLEVBQVM7SUFDMUIzRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDdkJzRyxpQ0FBaUMsQ0FBQyxDQUFDO0VBQ3JDLENBQUM7RUFFRCxJQUFNTSx5QkFBeUIsR0FBRyxTQUE1QkEseUJBQXlCQSxDQUFBLEVBQVM7SUFDdEMsSUFBSS9GLG9CQUFvQixDQUFDa0UsT0FBTyxLQUFLLElBQUksRUFBRTtNQUN6QzhCLFlBQVksQ0FBQ2hHLG9CQUFvQixDQUFDa0UsT0FBTyxDQUFDO01BQzFDbEUsb0JBQW9CLENBQUNrRSxPQUFPLEdBQUcsSUFBSTtJQUNyQztJQUNBdkUsa0JBQWtCLENBQUMsS0FBSyxDQUFDO0VBQzNCLENBQUM7RUFFRCxJQUFNc0cseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FBSUMsQ0FBZ0MsRUFBSztJQUN0RTtJQUNBQSxDQUFDLENBQUNDLGNBQWMsQ0FBQyxDQUFDO0VBQ3BCLENBQUM7RUFFRCxJQUFNQyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXFCQSxDQUFJRixDQUFnQyxFQUFLO0lBQ2xFQSxDQUFDLENBQUNHLGVBQWUsQ0FBQyxDQUFDO0lBQ25CLElBQUluSCxjQUFjLEVBQUU7TUFDbEI0RyxhQUFhLENBQUMsQ0FBQztNQUNmO0lBQ0Y7SUFDQTNHLGlCQUFpQixDQUFDK0csQ0FBQyxDQUFDSSxhQUFhLENBQUM7SUFDbEN4SSxjQUFjLENBQUN4RixNQUFNLENBQUNpTyxjQUFjLEVBQUFDLGFBQUE7TUFBSUMsVUFBVSxFQUFFN0Y7SUFBa0IsR0FBS0MsMkJBQTJCLENBQUUsQ0FBQztFQUMzRyxDQUFDO0VBRUQsSUFBTTZGLHdCQUF3QixHQUFHLFNBQTNCQSx3QkFBd0JBLENBQUlSLENBQWdDLEVBQUs7SUFBQSxJQUFBUyxtQkFBQTtJQUNyRVQsQ0FBQyxDQUFDRyxlQUFlLENBQUMsQ0FBQztJQUNuQixJQUFJeEwsUUFBUSxFQUFFO0lBQ2RpTCxhQUFhLENBQUMsQ0FBQztJQUNmLENBQUFhLG1CQUFBLEdBQUF4SyxTQUFTLENBQUMrSCxPQUFPLGNBQUF5QyxtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBbUJDLG9CQUFvQixDQUFDLENBQUM7RUFDM0MsQ0FBQztFQUVELElBQU1DLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUEsRUFBUztJQUFBLElBQUFDLHFCQUFBO0lBQ2pDaEIsYUFBYSxDQUFDLENBQUM7SUFDZmhJLGNBQWMsQ0FBQ3hGLE1BQU0sQ0FBQ3lPLFdBQVcsRUFBQVAsYUFBQTtNQUMvQkMsVUFBVSxFQUFFN0Ysa0JBQWtCO01BQzlCb0csTUFBTSxFQUFFO0lBQU8sR0FDWm5HLDJCQUEyQixDQUMvQixDQUFDO0lBQ0YsSUFBSXBGLFdBQVcsQ0FBQ3dMLE1BQU0sSUFBSXBPLDBCQUEwQixFQUFFO0lBQ3RELENBQUFpTyxxQkFBQSxHQUFBMUssWUFBWSxDQUFDOEgsT0FBTyxjQUFBNEMscUJBQUEsZUFBcEJBLHFCQUFBLENBQXNCSSxLQUFLLENBQUMsQ0FBQztFQUMvQixDQUFDO0VBRUQsSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBQSxFQUFTO0lBQzlCLElBQUluSCxvQkFBb0IsQ0FBQ2tFLE9BQU8sS0FBSyxJQUFJLEVBQUU7TUFDekM7SUFDRjtJQUNBLElBQU1rRCxNQUFNLEdBQUduSixpQkFBaUI7SUFDaEMsSUFBTW9KLE9BQU8sR0FBR2xKLGtCQUFrQjtJQUNsQyxJQUFJLENBQUNpSixNQUFNLElBQUksQ0FBQ0MsT0FBTyxFQUFFO01BQ3ZCO0lBQ0Y7SUFDQTFILGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUN4Qkssb0JBQW9CLENBQUNrRSxPQUFPLEdBQUd5QixVQUFVLENBQUMsWUFBTTtNQUM5QzNGLG9CQUFvQixDQUFDa0UsT0FBTyxHQUFHLElBQUk7TUFDbkMsSUFBQW9ELHFCQUFBLEdBQXNCcEgsbUJBQW1CLENBQUNnRSxPQUFPO1FBQXpDL0QsR0FBRyxHQUFBbUgscUJBQUEsQ0FBSG5ILEdBQUc7UUFBRUMsSUFBSSxHQUFBa0gscUJBQUEsQ0FBSmxILElBQUk7TUFDakIsSUFBSWdILE1BQU0sSUFBSWpILEdBQUcsRUFBRTtRQUNqQm5DLGVBQWUsQ0FBQyxDQUFDO01BQ25CLENBQUMsTUFBTSxJQUFJcUosT0FBTyxJQUFJakgsSUFBSSxFQUFFO1FBQzFCbEMsZ0JBQWdCLENBQUMsQ0FBQztNQUNwQjtNQUNBeUIsa0JBQWtCLENBQUMsS0FBSyxDQUFDO01BQ3pCOEYsaUNBQWlDLENBQUMsQ0FBQztJQUNyQyxDQUFDLEVBQUU1TCxpQkFBaUIsQ0FBQztFQUN2QixDQUFDO0VBRUQsSUFBTTBOLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQUEsRUFBUztJQUNwQ3pCLGFBQWEsQ0FBQyxDQUFDO0lBQ2YsSUFBSTdILGlCQUFpQixFQUFFO01BQ3JCa0osaUJBQWlCLENBQUMsQ0FBQztNQUNuQjtJQUNGO0lBQ0FwQix5QkFBeUIsQ0FBQyxDQUFDO0lBQzNCLElBQUk1SCxrQkFBa0IsRUFBRTtNQUN0QkQsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQjtJQUNBRixlQUFlLENBQUMsQ0FBQztJQUNqQkYsY0FBYyxDQUFDeEYsTUFBTSxDQUFDeU8sV0FBVyxFQUFBUCxhQUFBO01BQy9CQyxVQUFVLEVBQUU3RixrQkFBa0I7TUFDOUJvRyxNQUFNLEVBQUU7SUFBUSxHQUNibkcsMkJBQTJCLENBQy9CLENBQUM7SUFDRjRFLGlDQUFpQyxDQUFDLENBQUM7RUFDckMsQ0FBQztFQUVELElBQU0rQix3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFBLEVBQVM7SUFDckMxQixhQUFhLENBQUMsQ0FBQztJQUNmLElBQUkzSCxrQkFBa0IsRUFBRTtNQUN0QmdKLGlCQUFpQixDQUFDLENBQUM7TUFDbkI7SUFDRjtJQUNBcEIseUJBQXlCLENBQUMsQ0FBQztJQUMzQixJQUFJOUgsaUJBQWlCLEVBQUU7TUFDckJELGVBQWUsQ0FBQyxDQUFDO0lBQ25CO0lBQ0FFLGdCQUFnQixDQUFDLENBQUM7SUFDbEJKLGNBQWMsQ0FBQ3hGLE1BQU0sQ0FBQ3lPLFdBQVcsRUFBQVAsYUFBQTtNQUMvQkMsVUFBVSxFQUFFN0Ysa0JBQWtCO01BQzlCb0csTUFBTSxFQUFFO0lBQWEsR0FDbEJuRywyQkFBMkIsQ0FDL0IsQ0FBQztJQUNGNEUsaUNBQWlDLENBQUMsQ0FBQztFQUNyQyxDQUFDO0VBRUQsSUFBTWdDLDBCQUEwQixHQUFHLFNBQTdCQSwwQkFBMEJBLENBQUEsRUFBUztJQUFBLElBQUFDLG1CQUFBO0lBQ3ZDdkksaUJBQWlCLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLElBQUl0RSxRQUFRLEVBQUU7SUFDZCxDQUFBNk0sbUJBQUEsR0FBQXZMLFNBQVMsQ0FBQytILE9BQU8sY0FBQXdELG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFtQkMsa0JBQWtCLENBQUMsQ0FBQztFQUN6QyxDQUFDO0VBRURuVCxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUksQ0FBQ3FHLFFBQVEsRUFBRTtNQUFBLElBQUErTSxtQkFBQTtNQUNiLENBQUFBLG1CQUFBLEdBQUF6TCxTQUFTLENBQUMrSCxPQUFPLGNBQUEwRCxtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBbUIvQixLQUFLLENBQUMsQ0FBQztJQUM1QjtFQUNGLENBQUMsRUFBRSxDQUFDaEwsUUFBUSxDQUFDLENBQUM7RUFFZHJHLFNBQVMsQ0FBQyxZQUFNO0lBQ2RnSyxzQkFBc0IsQ0FBQzBGLE9BQU8sR0FBRyxLQUFLO0VBQ3hDLENBQUMsRUFBRSxDQUFDN0YsWUFBWSxDQUFDLENBQUM7RUFFbEI3SixTQUFTLENBQUMsWUFBTTtJQUFBLElBQUFxVCxtQkFBQTtJQUNkLElBQU1DLEtBQUssR0FBR3pKLFlBQVksYUFBWkEsWUFBWSx1QkFBWkEsWUFBWSxDQUFFMEosSUFBSSxDQUFDLENBQUM7SUFDbEMsSUFBSSxDQUFDRCxLQUFLLElBQUl0SixzQkFBc0IsQ0FBQzBGLE9BQU8sSUFBSXJKLFFBQVEsRUFBRTtNQUN4RDtJQUNGO0lBQ0EyRCxzQkFBc0IsQ0FBQzBGLE9BQU8sR0FBRyxJQUFJO0lBQ3JDLElBQUk1RixzQkFBc0IsRUFBRTtNQUMxQkEsc0JBQXNCLENBQUM0RixPQUFPLEdBQUcsSUFBSTtJQUN2QztJQUNBLENBQUEyRCxtQkFBQSxHQUFBMUwsU0FBUyxDQUFDK0gsT0FBTyxjQUFBMkQsbUJBQUEsZUFBakJBLG1CQUFBLENBQW1CRyxZQUFZLENBQUNGLEtBQUssQ0FBQztJQUN0Q2pMLG9CQUFvQixDQUFDLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUNoQyxRQUFRLEVBQUU7TUFBQSxJQUFBb04sbUJBQUE7TUFDYixDQUFBQSxtQkFBQSxHQUFBOUwsU0FBUyxDQUFDK0gsT0FBTyxjQUFBK0QsbUJBQUEsZUFBakJBLG1CQUFBLENBQW1CcEMsS0FBSyxDQUFDLENBQUM7SUFDNUI7RUFDRixDQUFDLEVBQUUsQ0FBQ3hILFlBQVksRUFBRXhELFFBQVEsRUFBRXlELHNCQUFzQixDQUFDLENBQUM7RUFFcEQsSUFBTTRKLFlBQVksR0FBR3hULE9BQU8sQ0FDMUI7SUFBQSxPQUFNLENBQUNrSSxpQkFBaUIsSUFBSW5CLFdBQVcsQ0FBQ3dMLE1BQU0sS0FBSyxDQUFDO0VBQUEsR0FDcEQsQ0FBQ3JLLGlCQUFpQixFQUFFbkIsV0FBVyxDQUFDd0wsTUFBTSxDQUN4QyxDQUFDO0VBRUR6UyxTQUFTLENBQUMsWUFBTTtJQUNkMEwsbUJBQW1CLENBQUNnRSxPQUFPLEdBQUc7TUFBRS9ELEdBQUcsRUFBRWxDLGlCQUFpQjtNQUFFbUMsSUFBSSxFQUFFakM7SUFBbUIsQ0FBQztFQUNwRixDQUFDLEVBQUUsQ0FBQ0YsaUJBQWlCLEVBQUVFLGtCQUFrQixDQUFDLENBQUM7RUFFM0MzSixTQUFTLENBQUMsWUFBTTtJQUNkLE9BQU8sWUFBTTtNQUNYLElBQUl3TCxvQkFBb0IsQ0FBQ2tFLE9BQU8sS0FBSyxJQUFJLEVBQUU7UUFDekM4QixZQUFZLENBQUNoRyxvQkFBb0IsQ0FBQ2tFLE9BQU8sQ0FBQztNQUM1QztJQUNGLENBQUM7RUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4xUCxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUksQ0FBQ3lKLGlCQUFpQixJQUFJLENBQUNFLGtCQUFrQixFQUFFO01BQzdDb0Isd0JBQXdCLENBQUMsS0FBSyxDQUFDO0lBQ2pDO0VBQ0YsQ0FBQyxFQUFFLENBQUN0QixpQkFBaUIsRUFBRUUsa0JBQWtCLENBQUMsQ0FBQzs7RUFFM0M7RUFDQTNKLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTTJULFlBQVksR0FBRzVILGtCQUFrQixDQUFDMkQsT0FBTyxNQUFLOUYsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUU2QyxFQUFFO0lBQzdELElBQU1tSCxjQUFjLEdBQUczSCxpQkFBaUIsQ0FBQ3lELE9BQU87SUFDaEQsSUFBTW1FLGFBQWEsR0FBRzNNLE1BQU07SUFDNUIsSUFBTTRNLFdBQVcsR0FBR0YsY0FBYyxLQUFLQyxhQUFhO0lBQ3BELElBQU1FLDJCQUEyQixHQUMvQixDQUFDSCxjQUFjLEtBQUs1SCxTQUFTLElBQUk0SCxjQUFjLEtBQUssSUFBSSxLQUFLQyxhQUFhLEtBQUs3SCxTQUFTLElBQUk2SCxhQUFhLEtBQUssSUFBSTtJQUNwSCxJQUFNRyxjQUFjLEdBQUc5SCxxQkFBcUIsQ0FBQ3dELE9BQU8sS0FBS3ZJLFVBQVU7SUFDbkUsSUFBTThNLGNBQWMsR0FBR2xJLGtCQUFrQixDQUFDMkQsT0FBTyxLQUFLMUQsU0FBUyxJQUFJQyxpQkFBaUIsQ0FBQ3lELE9BQU8sS0FBSzFELFNBQVM7SUFFMUcsSUFBSSxDQUFDMkgsWUFBWSxJQUFJRyxXQUFXLElBQUlDLDJCQUEyQixJQUFJQyxjQUFjLElBQUlDLGNBQWMsS0FBSyxDQUFDNU4sUUFBUSxFQUFFO01BQ2pILElBQU02TixLQUFLLEdBQUdELGNBQWMsSUFBSUYsMkJBQTJCLEdBQUcsR0FBRyxHQUFHLEdBQUc7TUFDdkU1QyxVQUFVLENBQUMsWUFBTTtRQUFBLElBQUFnRCxtQkFBQTtRQUNmLElBQUksQ0FBQzlOLFFBQVEsRUFBRSxDQUFBOE4sbUJBQUEsR0FBQXhNLFNBQVMsQ0FBQytILE9BQU8sY0FBQXlFLG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFtQjlDLEtBQUssQ0FBQyxDQUFDO01BQzNDLENBQUMsRUFBRTZDLEtBQUssQ0FBQztJQUNYO0lBRUFuSSxrQkFBa0IsQ0FBQzJELE9BQU8sR0FBRzlGLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFNkMsRUFBRTtJQUN0Q1IsaUJBQWlCLENBQUN5RCxPQUFPLEdBQUd4SSxNQUFNO0lBQ2xDZ0YscUJBQXFCLENBQUN3RCxPQUFPLEdBQUd2SSxVQUFVO0VBQzVDLENBQUMsRUFBRSxDQUFDeUMsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUU2QyxFQUFFLEVBQUV2RixNQUFNLEVBQUVDLFVBQVUsRUFBRWQsUUFBUSxDQUFDLENBQUM7O0VBRTdDO0VBQ0FyRyxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUksQ0FBQ3VILFVBQVUsRUFBRTtNQUNmLE9BQU95RSxTQUFTO0lBQ2xCO0lBRUEsSUFBTW9JLGtCQUFrQixHQUFHakkscUJBQXFCLENBQUN1RCxPQUFPO0lBQ3hEdkQscUJBQXFCLENBQUN1RCxPQUFPLEdBQUduSSxVQUFVO0lBRTFDLElBQUk2TSxrQkFBa0IsS0FBS3BJLFNBQVMsSUFBSW9JLGtCQUFrQixLQUFLN00sVUFBVSxJQUFJbEIsUUFBUSxFQUFFO01BQ3JGLE9BQU8yRixTQUFTO0lBQ2xCO0lBRUEsSUFBTXFJLFNBQVMsR0FBR25FLE1BQU0sQ0FBQ2lCLFVBQVUsQ0FBQyxZQUFNO01BQ3hDLElBQUksQ0FBQzlLLFFBQVEsRUFBRTtRQUFBLElBQUFpTyxtQkFBQTtRQUNiLENBQUFBLG1CQUFBLEdBQUEzTSxTQUFTLENBQUMrSCxPQUFPLGNBQUE0RSxtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBbUJqRCxLQUFLLENBQUMsQ0FBQztNQUM1QjtJQUNGLENBQUMsRUFBRSxHQUFHLENBQUM7SUFFUCxPQUFPO01BQUEsT0FBTW5CLE1BQU0sQ0FBQ3NCLFlBQVksQ0FBQzZDLFNBQVMsQ0FBQztJQUFBO0VBQzdDLENBQUMsRUFBRSxDQUFDOU0sVUFBVSxFQUFFbEIsUUFBUSxDQUFDLENBQUM7O0VBRTFCO0VBQ0FyRyxTQUFTLENBQUMsWUFBTTtJQUNkLElBQU11VSxpQkFBaUIsR0FBRyxDQUFBM0ssS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUwQyxJQUFJLE1BQUssT0FBTyxLQUFLLENBQUExQyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTJDLE1BQU0sTUFBSyxTQUFTLElBQUksQ0FBQTNDLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFMkMsTUFBTSxNQUFLLFFBQVEsQ0FBQztJQUNoSCxJQUFJLENBQUN2RSxVQUFVLENBQUMwSCxPQUFPLElBQUksQ0FBQzZFLGlCQUFpQixFQUFFLE9BQU92SSxTQUFTO0lBRS9ELElBQU13SSxRQUFRLEdBQUcsSUFBSUMsb0JBQW9CLENBQ3ZDLFVBQUFDLEtBQUEsRUFBYTtNQUFBLElBQUFDLEtBQUEsR0FBQXhNLGNBQUEsQ0FBQXVNLEtBQUE7UUFBWEUsS0FBSyxHQUFBRCxLQUFBO01BQ0wsSUFBSUMsS0FBSyxDQUFDQyxjQUFjLEVBQUU7UUFDeEJ0USxpQkFBaUIsQ0FBQ0QsY0FBYyxDQUFDd1Esc0JBQXNCLENBQUM7UUFDeEROLFFBQVEsQ0FBQ08sVUFBVSxDQUFDLENBQUM7TUFDdkI7SUFDRixDQUFDLEVBQ0Q7TUFBRUMsU0FBUyxFQUFFO0lBQUksQ0FDbkIsQ0FBQztJQUVEUixRQUFRLENBQUNTLE9BQU8sQ0FBQ2pOLFVBQVUsQ0FBQzBILE9BQU8sQ0FBQztJQUNwQyxPQUFPO01BQUEsT0FBTThFLFFBQVEsQ0FBQ08sVUFBVSxDQUFDLENBQUM7SUFBQTtFQUNwQyxDQUFDLEVBQUUsQ0FBQ25MLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFNkMsRUFBRSxFQUFFN0MsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUwQyxJQUFJLEVBQUUxQyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTJDLE1BQU0sQ0FBQyxDQUFDOztFQUUzQztFQUNBdk0sU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFNa1YsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBQSxFQUFTO01BQUEsSUFBQUMsbUJBQUE7TUFDaEMsSUFBSXJMLHNCQUFzQixFQUFFO1FBQzFCQSxzQkFBc0IsQ0FBQzRGLE9BQU8sR0FBRyxLQUFLO01BQ3hDO01BQ0EsQ0FBQXlGLG1CQUFBLEdBQUF4TixTQUFTLENBQUMrSCxPQUFPLGNBQUF5RixtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBbUJDLEtBQUssQ0FBQyxDQUFDO01BQzFCL00sb0JBQW9CLENBQUMsS0FBSyxDQUFDO01BQzNCMEUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO01BQzNCSSxhQUFhLENBQUMsRUFBRSxDQUFDO01BQ2pCaEQsd0JBQXdCLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRURrTCxRQUFRLENBQUMxRSxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRXVFLG1CQUFtQixDQUFDO0lBQ3RFLE9BQU87TUFBQSxPQUFNRyxRQUFRLENBQUN6RSxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRXNFLG1CQUFtQixDQUFDO0lBQUE7RUFDeEYsQ0FBQyxFQUFFLENBQUMvSyx3QkFBd0IsRUFBRUwsc0JBQXNCLENBQUMsQ0FBQzs7RUFFdEQ7RUFDQTlKLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTXNWLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBQSxFQUFTO01BQzFCLElBQUlqUCxRQUFRLEVBQUU7TUFDZDZLLHFCQUFxQixDQUFDLFlBQU07UUFBQSxJQUFBcUUsbUJBQUE7UUFDMUIsQ0FBQUEsbUJBQUEsR0FBQTVOLFNBQVMsQ0FBQytILE9BQU8sY0FBQTZGLG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFtQmxFLEtBQUssQ0FBQyxDQUFDO01BQzVCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRGdFLFFBQVEsQ0FBQzFFLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFMkUsYUFBYSxDQUFDO0lBQzlELE9BQU87TUFBQSxPQUFNRCxRQUFRLENBQUN6RSxtQkFBbUIsQ0FBQyxvQkFBb0IsRUFBRTBFLGFBQWEsQ0FBQztJQUFBO0VBQ2hGLENBQUMsRUFBRSxDQUFDalAsUUFBUSxDQUFDLENBQUM7RUFFZHJHLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTXdWLHdCQUF3QixHQUFHLFNBQTNCQSx3QkFBd0JBLENBQUlDLEtBQVksRUFBSztNQUFBLElBQUFDLG1CQUFBLEVBQUFDLG9CQUFBO01BQ2pELElBQUFDLEtBQUEsR0FBbUJILEtBQUssQ0FBMERJLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFBdEZDLEtBQUssR0FBQUYsS0FBQSxDQUFMRSxLQUFLO01BQ2IsSUFBSSxDQUFDQSxLQUFLLElBQUl6UCxRQUFRLEVBQUU7TUFFeEIsSUFBTTBQLGNBQWMsR0FBR0QsS0FBSyxDQUFDRSxJQUFJLENBQUNDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO01BQ3pELENBQUFQLG1CQUFBLEdBQUEvTixTQUFTLENBQUMrSCxPQUFPLGNBQUFnRyxtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBbUJOLEtBQUssQ0FBQyxDQUFDO01BQzFCLENBQUFPLG9CQUFBLEdBQUFoTyxTQUFTLENBQUMrSCxPQUFPLGNBQUFpRyxvQkFBQSxlQUFqQkEsb0JBQUEsQ0FBbUJPLGtCQUFrQixDQUFDO1FBQ3BDekosRUFBRSxFQUFFcUosS0FBSyxDQUFDckosRUFBRTtRQUNaSCxJQUFJLEVBQUUsT0FBTztRQUNiNkosS0FBSyxNQUFBQyxNQUFBLENBQU1MLGNBQWM7TUFDM0IsQ0FBQyxDQUFDO01BQ0Y3RSxxQkFBcUIsQ0FBQyxZQUFNO1FBQUEsSUFBQW1GLG9CQUFBO1FBQzFCLENBQUFBLG9CQUFBLEdBQUExTyxTQUFTLENBQUMrSCxPQUFPLGNBQUEyRyxvQkFBQSxlQUFqQkEsb0JBQUEsQ0FBbUJoRixLQUFLLENBQUMsQ0FBQztNQUM1QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRURnRSxRQUFRLENBQUMxRSxnQkFBZ0IsQ0FBQywyQkFBMkIsRUFBRTZFLHdCQUF3QixDQUFDO0lBQ2hGLE9BQU87TUFBQSxPQUFNSCxRQUFRLENBQUN6RSxtQkFBbUIsQ0FBQywyQkFBMkIsRUFBRTRFLHdCQUF3QixDQUFDO0lBQUE7RUFDbEcsQ0FBQyxFQUFFLENBQUNuUCxRQUFRLENBQUMsQ0FBQztFQUVkLElBQU1pUSxpQkFBaUIsR0FBR3ZXLFdBQVcsQ0FBQyxZQUFNO0lBQUEsSUFBQXdXLG9CQUFBLEVBQUFDLFdBQUEsRUFBQUMsZUFBQSxFQUFBQyxvQkFBQTtJQUMxQyxJQUFNQyxLQUFLLElBQUFKLG9CQUFBLEdBQUc1TyxTQUFTLENBQUMrSCxPQUFPLGNBQUE2RyxvQkFBQSx1QkFBakJBLG9CQUFBLENBQW1CSyxTQUFTLENBQUMsQ0FBQztJQUM1QyxJQUFNQyxJQUFJLElBQUFMLFdBQUEsR0FBR0csS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUVFLElBQUksY0FBQUwsV0FBQSxjQUFBQSxXQUFBLEdBQUksRUFBRTtJQUM5QixJQUFJLENBQUNLLElBQUksQ0FBQ3RELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQ3RNLFdBQVcsQ0FBQ3dMLE1BQU0sRUFBRTtJQUN6QyxJQUFNcUUsUUFBUSxJQUFBTCxlQUFBLEdBQUdFLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFRyxRQUFRLGNBQUFMLGVBQUEsY0FBQUEsZUFBQSxHQUFJLEVBQUU7SUFDdEN0USxhQUFhLENBQUMwUSxJQUFJLEVBQUU1UCxXQUFXLEVBQUU2UCxRQUFRLENBQUM7SUFDMUMsQ0FBQUosb0JBQUEsR0FBQS9PLFNBQVMsQ0FBQytILE9BQU8sY0FBQWdILG9CQUFBLGVBQWpCQSxvQkFBQSxDQUFtQnRCLEtBQUssQ0FBQyxDQUFDO0lBQzFCL00sb0JBQW9CLENBQUMsS0FBSyxDQUFDO0lBQzNCMEUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO0lBQzNCSSxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQ2pCeUIscUJBQXFCLENBQUMsS0FBSyxDQUFDO0lBQzVCSSxjQUFjLENBQUMsRUFBRSxDQUFDO0lBQ2xCZixvQkFBb0IsQ0FBQ3lCLE9BQU8sR0FBRyxLQUFLO0lBQ3BDdkYsd0JBQXdCLENBQUMsQ0FBQztFQUM1QixDQUFDLEVBQUUsQ0FBQ2xELFdBQVcsRUFBRWQsYUFBYSxFQUFFZ0Usd0JBQXdCLENBQUMsQ0FBQztFQUUxRCxJQUFNNE0sd0JBQXdCLEdBQUdoWCxXQUFXLENBQzFDLFVBQUNpWCxPQUFlLEVBQUs7SUFBQSxJQUFBQyxvQkFBQSxFQUFBQyxZQUFBLEVBQUFDLG9CQUFBO0lBQ25CN04sY0FBYyxDQUFDeEYsTUFBTSxDQUFDc1QsdUJBQXVCLEVBQUU7TUFDN0NDLGlCQUFpQixFQUFFcFUsc0JBQXNCLENBQUMrVCxPQUFPLENBQUM7TUFDbERNLG1CQUFtQixFQUFFO0lBQ3ZCLENBQUMsQ0FBQztJQUVGLElBQU1YLEtBQUssSUFBQU0sb0JBQUEsR0FBR3RQLFNBQVMsQ0FBQytILE9BQU8sY0FBQXVILG9CQUFBLHVCQUFqQkEsb0JBQUEsQ0FBbUJMLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLElBQU1DLElBQUksSUFBQUssWUFBQSxHQUFHUCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUUsSUFBSSxjQUFBSyxZQUFBLGNBQUFBLFlBQUEsR0FBSSxFQUFFO0lBQzlCLElBQU1LLFdBQVcsT0FBQW5CLE1BQUEsQ0FBT2xKLFVBQVUsQ0FBRTtJQUNwQyxJQUFNc0ssYUFBYSxHQUFHWCxJQUFJLENBQUNZLFFBQVEsQ0FBQ0YsV0FBVyxDQUFDLEdBQUdWLElBQUksQ0FBQ2EsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDSCxXQUFXLENBQUM5RSxNQUFNLENBQUMsR0FBR29FLElBQUk7SUFDNUYsSUFBTWMsb0JBQW9CLEdBQUdILGFBQWEsQ0FBQ2pFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtJQUV4RCxJQUFJb0Usb0JBQW9CLEVBQUU7TUFBQSxJQUFBQyxvQkFBQTtNQUN4QnpSLGFBQWEsQ0FBQzZRLE9BQU8sQ0FBQ2EsS0FBSyxFQUFFNVEsV0FBVyxFQUFFK0UsU0FBUyxFQUFFQSxTQUFTLEVBQUVBLFNBQVMsRUFBRUEsU0FBUyxFQUFFZ0wsT0FBTyxDQUFDdkssRUFBRSxDQUFDO01BQ2pHLENBQUFtTCxvQkFBQSxHQUFBalEsU0FBUyxDQUFDK0gsT0FBTyxjQUFBa0ksb0JBQUEsZUFBakJBLG9CQUFBLENBQW1CeEMsS0FBSyxDQUFDLENBQUM7TUFDMUIvTSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7TUFDM0IwRSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7TUFDM0JJLGFBQWEsQ0FBQyxFQUFFLENBQUM7TUFDakJDLG1CQUFtQixDQUFDc0MsT0FBTyxHQUFHLEtBQUs7TUFDbkN2Rix3QkFBd0IsQ0FBQyxDQUFDO01BQzFCO0lBQ0Y7SUFFQSxDQUFBZ04sb0JBQUEsR0FBQXhQLFNBQVMsQ0FBQytILE9BQU8sY0FBQXlILG9CQUFBLGVBQWpCQSxvQkFBQSxDQUFtQlcsa0JBQWtCLENBQUM7TUFBRXJMLEVBQUUsRUFBRXVLLE9BQU8sQ0FBQ3ZLLEVBQUU7TUFBRTBKLEtBQUssRUFBRWEsT0FBTyxDQUFDYTtJQUFNLENBQUMsQ0FBQztJQUMvRTlLLG9CQUFvQixDQUFDLEtBQUssQ0FBQztJQUMzQkksYUFBYSxDQUFDLEVBQUUsQ0FBQztJQUNqQkMsbUJBQW1CLENBQUNzQyxPQUFPLEdBQUcsS0FBSztFQUNyQyxDQUFDLEVBQ0QsQ0FBQ3pJLFdBQVcsRUFBRWQsYUFBYSxFQUFFZ0Usd0JBQXdCLEVBQUUrQyxVQUFVLEVBQUU1RCxjQUFjLENBQ25GLENBQUM7RUFFRCxJQUFNeU8sd0JBQXdCLEdBQUcsU0FBM0JBLHdCQUF3QkEsQ0FBQSxFQUFTO0lBQ3JDaEwsb0JBQW9CLENBQUMsS0FBSyxDQUFDO0lBQzNCSyxtQkFBbUIsQ0FBQ3NDLE9BQU8sR0FBRyxLQUFLO0VBQ3JDLENBQUM7RUFFRCxJQUFNc0kseUJBQXlCLEdBQUdqWSxXQUFXLENBQUMsWUFBTTtJQUNsRDZPLHFCQUFxQixDQUFDLEtBQUssQ0FBQztJQUM1QkksY0FBYyxDQUFDLEVBQUUsQ0FBQztJQUNsQmYsb0JBQW9CLENBQUN5QixPQUFPLEdBQUcsS0FBSztFQUN0QyxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVOO0VBQ0EsSUFBTXVJLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQUl2RyxDQUFnQyxFQUFLO0lBQUEsSUFBQXdHLG9CQUFBO0lBQ3BFeEcsQ0FBQyxDQUFDRyxlQUFlLENBQUMsQ0FBQztJQUNuQixJQUFJeEwsUUFBUSxFQUFFO0lBQ2QsSUFBSXNJLGtCQUFrQixFQUFFO01BQ3RCcUoseUJBQXlCLENBQUMsQ0FBQztNQUMzQjtJQUNGO0lBQ0ExRyxhQUFhLENBQUMsQ0FBQztJQUNmLENBQUE0RyxvQkFBQSxHQUFBdlEsU0FBUyxDQUFDK0gsT0FBTyxjQUFBd0ksb0JBQUEsZUFBakJBLG9CQUFBLENBQW1CQyxrQkFBa0IsQ0FBQyxDQUFDO0VBQ3pDLENBQUM7RUFFRCxJQUFNQyxpQkFBaUIsR0FBR3JZLFdBQVcsQ0FBQyxVQUFDK1YsS0FBWSxFQUFLO0lBQUEsSUFBQXVDLG9CQUFBO0lBQ3RELENBQUFBLG9CQUFBLEdBQUExUSxTQUFTLENBQUMrSCxPQUFPLGNBQUEySSxvQkFBQSxlQUFqQkEsb0JBQUEsQ0FBbUJDLGtCQUFrQixDQUFDO01BQUU3TCxFQUFFLEVBQUVxSixLQUFLLENBQUNySixFQUFFO01BQUVILElBQUksRUFBRSxPQUFPO01BQUU2SixLQUFLLE1BQUFDLE1BQUEsQ0FBTU4sS0FBSyxDQUFDRSxJQUFJO0lBQUcsQ0FBQyxDQUFDO0lBQy9GcEgscUJBQXFCLENBQUMsS0FBSyxDQUFDO0lBQzVCSSxjQUFjLENBQUMsRUFBRSxDQUFDO0lBQ2xCZixvQkFBb0IsQ0FBQ3lCLE9BQU8sR0FBRyxLQUFLO0VBQ3RDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFNNkksaUJBQWlCLEdBQUd4WSxXQUFXLENBQUMsWUFBTTtJQUMxQzZPLHFCQUFxQixDQUFDLEtBQUssQ0FBQztJQUM1QkksY0FBYyxDQUFDLEVBQUUsQ0FBQztJQUNsQmYsb0JBQW9CLENBQUN5QixPQUFPLEdBQUcsS0FBSztJQUNwQzJGLFFBQVEsQ0FBQ21ELGFBQWEsQ0FDcEIsSUFBSUMsV0FBVyxDQUFDLDRCQUE0QixFQUFFO01BQzVDNUMsTUFBTSxFQUFFO1FBQUU2QyxXQUFXLEVBQUU7VUFBRUMsTUFBTSxFQUFFO1lBQUVDLFNBQVMsRUFBRSxLQUFLO1lBQUVDLE1BQU0sRUFBRTtVQUFRLENBQUM7VUFBRTlQLE1BQU0sRUFBRTtRQUFLO01BQUU7SUFDekYsQ0FBQyxDQUNILENBQUM7RUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sSUFBTStQLGlCQUFpQixHQUFHL1ksV0FBVyxDQUNuQyxVQUFBZ1osS0FBQSxFQVdNO0lBQUEsSUFWSmxDLElBQUksR0FBQWtDLEtBQUEsQ0FBSmxDLElBQUk7TUFDSm1DLE9BQU8sR0FBQUQsS0FBQSxDQUFQQyxPQUFPO01BQ1BDLFlBQVksR0FBQUYsS0FBQSxDQUFaRSxZQUFZO01BQ1pDLFdBQVcsR0FBQUgsS0FBQSxDQUFYRyxXQUFXO0lBUVg3USxvQkFBb0IsQ0FBQ3dPLElBQUksQ0FBQ3RELElBQUksQ0FBQyxDQUFDLENBQUNkLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUMvTCxRQUFRLGFBQVJBLFFBQVEsZUFBUkEsUUFBUSxDQUFHLENBQUM7SUFDWjBELGFBQWEsQ0FBQzRPLE9BQU8sQ0FBQztJQUV0QixJQUFJQyxZQUFZLGFBQVpBLFlBQVksZUFBWkEsWUFBWSxDQUFFRSxNQUFNLElBQUl6TSxhQUFhLENBQUMrRixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3BELElBQUksQ0FBQ3JGLG1CQUFtQixDQUFDc0MsT0FBTyxFQUFFO1FBQ2hDcEcsY0FBYyxDQUFDeEYsTUFBTSxDQUFDc1YscUJBQXFCLENBQUM7UUFDNUNoTSxtQkFBbUIsQ0FBQ3NDLE9BQU8sR0FBRyxJQUFJO01BQ3BDO01BQ0EzQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7TUFDMUJJLGFBQWEsQ0FBQzhMLFlBQVksQ0FBQ0ksS0FBSyxDQUFDO0lBQ25DLENBQUMsTUFBTTtNQUNMak0sbUJBQW1CLENBQUNzQyxPQUFPLEdBQUcsS0FBSztNQUNuQzNDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztNQUMzQkksYUFBYSxDQUFDLEVBQUUsQ0FBQztJQUNuQjtJQUVBLElBQUkrTCxXQUFXLGFBQVhBLFdBQVcsZUFBWEEsV0FBVyxDQUFFQyxNQUFNLElBQUlwTCxnQkFBZ0IsRUFBRTtNQUMzQztNQUNBLElBQUksQ0FBQ0Usb0JBQW9CLENBQUN5QixPQUFPLEVBQUU7UUFDakN6QixvQkFBb0IsQ0FBQ3lCLE9BQU8sR0FBRyxJQUFJO1FBQ25DLEtBQUtsQixXQUFXLENBQUMsQ0FBQztNQUNwQjtNQUNBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7TUFDM0JJLGNBQWMsQ0FBQ2tLLFdBQVcsQ0FBQ0csS0FBSyxDQUFDO0lBQ25DLENBQUMsTUFBTTtNQUNMcEwsb0JBQW9CLENBQUN5QixPQUFPLEdBQUcsS0FBSztNQUNwQ2QscUJBQXFCLENBQUMsS0FBSyxDQUFDO01BQzVCSSxjQUFjLENBQUMsRUFBRSxDQUFDO0lBQ3BCO0VBQ0YsQ0FBQyxFQUNELENBQUN0SSxRQUFRLEVBQUUwRCxhQUFhLEVBQUVzQyxhQUFhLEVBQUVwRCxjQUFjLEVBQUV5RSxnQkFBZ0IsRUFBRVMsV0FBVyxDQUN4RixDQUFDO0VBRUQsSUFBTWxFLGFBQWEsR0FBR3ZLLFdBQVcsQ0FDL0IsVUFBQzJSLENBQWdDLEVBQUs7SUFDcEMsSUFBSXJILG9CQUFvQixDQUFDcUgsQ0FBQyxDQUFDLEVBQUU7SUFDN0IsSUFBSUEsQ0FBQyxDQUFDNEgsR0FBRyxLQUFLLE9BQU8sSUFBSSxDQUFDNUgsQ0FBQyxDQUFDNkgsUUFBUSxJQUFJLENBQUNyUCxXQUFXLEVBQUU7TUFDcER3SCxDQUFDLENBQUNDLGNBQWMsQ0FBQyxDQUFDO01BQ2xCLElBQUksQ0FBQytCLFlBQVksSUFBSSxDQUFDck4sUUFBUSxFQUFFaVEsaUJBQWlCLENBQUMsQ0FBQztJQUNyRDtFQUNGLENBQUMsRUFDRCxDQUFDak0sb0JBQW9CLEVBQUVILFdBQVcsRUFBRXdKLFlBQVksRUFBRXJOLFFBQVEsRUFBRWlRLGlCQUFpQixDQUMvRSxDQUFDO0VBRUQsSUFBTWtELFFBQVEsR0FBRyxTQUFYQSxRQUFRQSxDQUFJQyxRQUFnQixFQUFLO0lBQ3JDLElBQUksQ0FBQ0EsUUFBUSxDQUFDaEgsTUFBTSxJQUFJcE0sUUFBUSxFQUFFO0lBRWxDLElBQU00QyxhQUF1QixHQUFHLEVBQUU7SUFDbEMsSUFBTUQsYUFBdUIsR0FBRyxFQUFFO0lBQ2xDLElBQU1FLFNBQWlDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLElBQUl3USxhQUFhLEdBQUd6UyxXQUFXLENBQUN3TCxNQUFNO0lBRXRDLElBQU1rSCxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBSUMsU0FBaUI7TUFBQSxPQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUNDLFFBQVEsQ0FBQ0QsU0FBUyxDQUFDO0lBQUE7SUFDaEcsSUFBTUUsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUlGLFNBQWlCO01BQUEsT0FDcEMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDQyxRQUFRLENBQUNELFNBQVMsQ0FBQztJQUFBO0lBQ2hHLElBQU1HLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBSUgsU0FBaUI7TUFBQSxPQUN0QyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQ0MsUUFBUSxDQUFDRCxTQUFTLENBQUM7SUFBQTtJQUV4RixJQUFNSSxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUlKLFNBQWlCLEVBQUVLLElBQVk7TUFBQSxPQUFLQSxJQUFJLEdBQUc3VixzQkFBc0IsQ0FBQ3dWLFNBQVMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJO0lBQUE7SUFFbEhILFFBQVEsQ0FBQ1MsT0FBTyxDQUFDLFVBQUFDLElBQUksRUFBSTtNQUFBLElBQUFDLGtCQUFBO01BQ3ZCLElBQUlDLFlBQVksR0FBRyxLQUFLO01BQ3hCLElBQU1DLGFBQWEsR0FBR0gsSUFBSSxDQUFDbkUsSUFBSSxDQUFDdUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUMxQyxJQUFNQyxhQUFhLEdBQUdGLGFBQWEsQ0FBQzdILE1BQU0sR0FBRyxDQUFDLE9BQUEyRCxNQUFBLEVBQUFnRSxrQkFBQSxHQUFPRSxhQUFhLENBQUNHLEdBQUcsQ0FBQyxDQUFDLGNBQUFMLGtCQUFBLHVCQUFuQkEsa0JBQUEsQ0FBcUJNLFdBQVcsQ0FBQyxDQUFDLElBQUssRUFBRTtNQUU5RixJQUFJLEVBQUN4VyxnQkFBZ0IsYUFBaEJBLGdCQUFnQixlQUFoQkEsZ0JBQWdCLENBQUUyVixRQUFRLENBQUNXLGFBQWEsQ0FBQyxHQUFFO1FBQzlDO01BQ0Y7TUFFQXRSLFNBQVMsQ0FBQ2lSLElBQUksQ0FBQ25FLElBQUksQ0FBQyxHQUFHbUUsSUFBSSxDQUFDRixJQUFJO01BRWhDLElBQUlOLFdBQVcsQ0FBQ2EsYUFBYSxDQUFDLEVBQUU7UUFDOUIsSUFBSVIsY0FBYyxDQUFDUSxhQUFhLEVBQUVMLElBQUksQ0FBQ0YsSUFBSSxDQUFDLEVBQUU7VUFDNUNoUixhQUFhLENBQUMwUixJQUFJLENBQUNSLElBQUksQ0FBQ25FLElBQUksQ0FBQztVQUM3QnFFLFlBQVksR0FBRyxJQUFJO1FBQ3JCO1FBRUEsSUFBSVgsYUFBYSxHQUFHLENBQUMsR0FBR3JWLDBCQUEwQixFQUFFO1VBQ2xEMkUsYUFBYSxDQUFDMlIsSUFBSSxDQUFDUixJQUFJLENBQUNuRSxJQUFJLENBQUM7VUFDN0JxRSxZQUFZLEdBQUcsSUFBSTtRQUNyQjtNQUNGLENBQUMsTUFBTSxJQUFJUCxXQUFXLENBQUNVLGFBQWEsQ0FBQyxFQUFFO1FBQ3JDLElBQUlSLGNBQWMsQ0FBQ1EsYUFBYSxFQUFFTCxJQUFJLENBQUNGLElBQUksQ0FBQyxFQUFFO1VBQzVDaFIsYUFBYSxDQUFDMFIsSUFBSSxDQUFDUixJQUFJLENBQUNuRSxJQUFJLENBQUM7VUFDN0JxRSxZQUFZLEdBQUcsSUFBSTtRQUNyQjtRQUVBLElBQUlYLGFBQWEsR0FBRyxDQUFDLEdBQUdyViwwQkFBMEIsRUFBRTtVQUNsRDJFLGFBQWEsQ0FBQzJSLElBQUksQ0FBQ1IsSUFBSSxDQUFDbkUsSUFBSSxDQUFDO1VBQzdCcUUsWUFBWSxHQUFHLElBQUk7UUFDckI7TUFDRixDQUFDLE1BQU0sSUFBSU4sYUFBYSxDQUFDUyxhQUFhLENBQUMsRUFBRTtRQUN2QyxJQUFJUixjQUFjLENBQUNRLGFBQWEsRUFBRUwsSUFBSSxDQUFDRixJQUFJLENBQUMsRUFBRTtVQUM1Q2hSLGFBQWEsQ0FBQzBSLElBQUksQ0FBQ1IsSUFBSSxDQUFDbkUsSUFBSSxDQUFDO1VBQzdCcUUsWUFBWSxHQUFHLElBQUk7UUFDckI7UUFFQSxJQUFJWCxhQUFhLEdBQUcsQ0FBQyxHQUFHclYsMEJBQTBCLEVBQUU7VUFDbEQyRSxhQUFhLENBQUMyUixJQUFJLENBQUNSLElBQUksQ0FBQ25FLElBQUksQ0FBQztVQUM3QnFFLFlBQVksR0FBRyxJQUFJO1FBQ3JCO01BQ0Y7TUFFQSxJQUFJLENBQUNBLFlBQVksRUFBRTtRQUNqQlgsYUFBYSxJQUFJLENBQUM7UUFDbEIsSUFBTWtCLFFBQVEsR0FBR1QsSUFBSSxDQUFDN04sSUFBSSxJQUFJbkksU0FBUyxDQUFDcVcsYUFBYSxDQUFDO1FBQ3RELElBQU1LLFVBQVUsR0FBRyxJQUFJQyxJQUFJLENBQUMsQ0FBQ1gsSUFBSSxDQUFDLEVBQUVBLElBQUksQ0FBQ25FLElBQUksRUFBRTtVQUFFMUosSUFBSSxFQUFFc087UUFBUyxDQUFDLENBQUM7UUFDbEU5VCxZQUFZLGFBQVpBLFlBQVksZUFBWkEsWUFBWSxDQUFHK1QsVUFBVSxDQUFDO01BQzVCO0lBQ0YsQ0FBQyxDQUFDO0lBRUYsSUFBSTdSLGFBQWEsQ0FBQ3lKLE1BQU0sSUFBSXhKLGFBQWEsQ0FBQ3dKLE1BQU0sRUFBRTtNQUNoRHBKLGFBQWEsQ0FBQztRQUFFTixNQUFNLEVBQUUsSUFBSTtRQUFFQyxhQUFhLEVBQWJBLGFBQWE7UUFBRUMsYUFBYSxFQUFiQSxhQUFhO1FBQUVDLFNBQVMsRUFBVEE7TUFBVSxDQUFDLENBQUM7SUFDMUU7RUFDRixDQUFDO0VBRUQsSUFBTTZSLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQUlySixDQUFnQyxFQUFLO0lBQzdELElBQU1zSixLQUFLLEdBQUd0SixDQUFDLENBQUN1SixNQUFNLENBQUNELEtBQUs7SUFDNUIsSUFBSUEsS0FBSyxFQUFFO01BQ1R4QixRQUFRLENBQUMwQixLQUFLLENBQUNDLElBQUksQ0FBQ0gsS0FBSyxDQUFDLENBQUM7SUFDN0I7SUFDQSxJQUFJcFQsWUFBWSxDQUFDOEgsT0FBTyxFQUFFO01BQ3hCOUgsWUFBWSxDQUFDOEgsT0FBTyxDQUFDMEwsS0FBSyxHQUFHLEVBQUU7SUFDakM7RUFDRixDQUFDO0VBRUQsSUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFBLEVBQVM7SUFDMUI1UCxrQkFBa0IsQ0FBQ2lFLE9BQU8sR0FBRyxDQUFDO0lBQzlCbkUsbUJBQW1CLENBQUMsS0FBSyxDQUFDO0VBQzVCLENBQUM7RUFFRCxJQUFNK1AsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJNUosQ0FBNEIsRUFBSztJQUN4RCxJQUFJLENBQUM3TSxvQkFBb0IsQ0FBQzZNLENBQUMsQ0FBQzZKLFlBQVksQ0FBQyxFQUFFO0lBQzNDN0osQ0FBQyxDQUFDQyxjQUFjLENBQUMsQ0FBQztJQUNsQkQsQ0FBQyxDQUFDRyxlQUFlLENBQUMsQ0FBQztJQUNuQixJQUFJeEwsUUFBUSxFQUFFO0lBQ2RvRixrQkFBa0IsQ0FBQ2lFLE9BQU8sSUFBSSxDQUFDO0lBQy9CbkUsbUJBQW1CLENBQUMsSUFBSSxDQUFDO0VBQzNCLENBQUM7RUFFRCxJQUFNaVEsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJOUosQ0FBNEIsRUFBSztJQUN4RCxJQUFJLENBQUNwRyxnQkFBZ0IsSUFBSSxDQUFDekcsb0JBQW9CLENBQUM2TSxDQUFDLENBQUM2SixZQUFZLENBQUMsRUFBRTtJQUNoRTdKLENBQUMsQ0FBQ0MsY0FBYyxDQUFDLENBQUM7SUFDbEJELENBQUMsQ0FBQ0csZUFBZSxDQUFDLENBQUM7SUFDbkJwRyxrQkFBa0IsQ0FBQ2lFLE9BQU8sR0FBR1ksSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFOUUsa0JBQWtCLENBQUNpRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLElBQUlqRSxrQkFBa0IsQ0FBQ2lFLE9BQU8sS0FBSyxDQUFDLEVBQUU7TUFDcENuRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7SUFDNUI7RUFDRixDQUFDO0VBRUQsSUFBTWtRLGNBQWMsR0FBRyxTQUFqQkEsY0FBY0EsQ0FBSS9KLENBQTRCLEVBQUs7SUFDdkQsSUFBSSxDQUFDN00sb0JBQW9CLENBQUM2TSxDQUFDLENBQUM2SixZQUFZLENBQUMsRUFBRTtJQUMzQzdKLENBQUMsQ0FBQ0MsY0FBYyxDQUFDLENBQUM7SUFDbEJELENBQUMsQ0FBQ0csZUFBZSxDQUFDLENBQUM7SUFDbkIsSUFBSXhMLFFBQVEsRUFBRTtJQUNkcUwsQ0FBQyxDQUFDNkosWUFBWSxDQUFDRyxVQUFVLEdBQUcsTUFBTTtFQUNwQyxDQUFDO0VBRUQsSUFBTUMsVUFBVSxHQUFHLFNBQWJBLFVBQVVBLENBQUlqSyxDQUE0QixFQUFLO0lBQ25ELElBQUksQ0FBQzdNLG9CQUFvQixDQUFDNk0sQ0FBQyxDQUFDNkosWUFBWSxDQUFDLEVBQUU7TUFDekNGLGFBQWEsQ0FBQyxDQUFDO01BQ2Y7SUFDRjtJQUNBM0osQ0FBQyxDQUFDQyxjQUFjLENBQUMsQ0FBQztJQUNsQkQsQ0FBQyxDQUFDRyxlQUFlLENBQUMsQ0FBQztJQUNuQndKLGFBQWEsQ0FBQyxDQUFDO0lBQ2YsSUFBSWhWLFFBQVEsRUFBRTtJQUNkbVQsUUFBUSxDQUFDMVUscUJBQXFCLENBQUM0TSxDQUFDLENBQUM2SixZQUFZLENBQUMsQ0FBQztFQUNqRCxDQUFDO0VBRUQsSUFBTUssZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBSVosS0FBYSxFQUFLO0lBQzFDeEIsUUFBUSxDQUFDd0IsS0FBSyxDQUFDO0VBQ2pCLENBQUM7RUFFRCxJQUFNYSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQWtCQSxDQUFJbkssQ0FBaUMsRUFBSztJQUFBLElBQUFvSyxvQkFBQTtJQUNoRSxJQUFNQyxRQUFRLElBQUFELG9CQUFBLEdBQUc5VCxVQUFVLENBQUMwSCxPQUFPLGNBQUFvTSxvQkFBQSx1QkFBbEJBLG9CQUFBLENBQW9CRSxhQUFhLENBQUMsMEJBQTBCLENBQUM7SUFDOUUsSUFBSUQsUUFBUSxJQUFJQSxRQUFRLENBQUNFLFFBQVEsQ0FBQ3ZLLENBQUMsQ0FBQ3VKLE1BQWMsQ0FBQyxFQUFFO0lBQ3JELElBQU1ELEtBQUssR0FBR2xXLHFCQUFxQixDQUFDNE0sQ0FBQyxDQUFDd0ssYUFBYSxDQUFDO0lBQ3BELElBQUksQ0FBQ2xCLEtBQUssQ0FBQ3ZJLE1BQU0sRUFBRTtJQUNuQmYsQ0FBQyxDQUFDQyxjQUFjLENBQUMsQ0FBQztJQUNsQjZILFFBQVEsQ0FBQ3dCLEtBQUssQ0FBQztFQUNqQixDQUFDO0VBRUQsSUFBTW1CLHNCQUFzQixHQUFHLFNBQXpCQSxzQkFBc0JBLENBQUlDLE1BQWMsRUFBSztJQUNqRHJWLGtCQUFrQixhQUFsQkEsa0JBQWtCLGVBQWxCQSxrQkFBa0IsQ0FBR3FWLE1BQU0sQ0FBQztFQUM5QixDQUFDO0VBRUQsSUFBTUMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FBQSxFQUFTO0lBQ2pDL1MsY0FBYyxDQUFDeEYsTUFBTSxDQUFDd1ksa0JBQWtCLENBQUM7SUFDekM5VixnQkFBZ0IsYUFBaEJBLGdCQUFnQixlQUFoQkEsZ0JBQWdCLENBQUcsQ0FBQztFQUN0QixDQUFDO0VBRUQsSUFBTStWLFlBQVksR0FBR3pRLE9BQU8sQ0FBQyxDQUFBdEUsV0FBVyxhQUFYQSxXQUFXLGdCQUFBMUIsa0JBQUEsR0FBWDBCLFdBQVcsQ0FBRWdWLEtBQUssY0FBQTFXLGtCQUFBLHVCQUFsQkEsa0JBQUEsQ0FBb0IyTSxNQUFNLEtBQUl4TCxXQUFXLENBQUN3TCxNQUFNLENBQUM7RUFFOUV4UyxlQUFlLENBQUMsWUFBTTtJQUNwQixJQUFNd2MsT0FBTyxHQUFHNVUsV0FBVyxDQUFDNkgsT0FBTztJQUNuQyxJQUFNZ04sU0FBUyxHQUFHNVUsYUFBYSxDQUFDNEgsT0FBTztJQUV2QyxJQUFNaU4sYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFBLEVBQVM7TUFDMUIsSUFBTUMsU0FBUyxHQUFHTCxZQUFZLElBQUlFLE9BQU8sR0FBR25NLElBQUksQ0FBQ3VNLElBQUksQ0FBQ0osT0FBTyxDQUFDOU0scUJBQXFCLENBQUMsQ0FBQyxDQUFDbU4sTUFBTSxDQUFDLEdBQUcsQ0FBQztNQUNqRyxJQUFNQyxXQUFXLEdBQUdMLFNBQVMsR0FDekJwTSxJQUFJLENBQUN1TSxJQUFJLENBQUNILFNBQVMsQ0FBQy9NLHFCQUFxQixDQUFDLENBQUMsQ0FBQ21OLE1BQU0sQ0FBQyxHQUNuRHRhLGdDQUFnQztNQUVwQ2lHLGlCQUFpQixDQUFDLFVBQUF1VSxJQUFJO1FBQUEsT0FBS0EsSUFBSSxLQUFLSixTQUFTLEdBQUdJLElBQUksR0FBR0osU0FBUztNQUFBLENBQUMsQ0FBQztNQUNsRS9ULG1CQUFtQixDQUFDLFVBQUFtVSxJQUFJO1FBQUEsT0FBS0EsSUFBSSxLQUFLRCxXQUFXLEdBQUdDLElBQUksR0FBR0QsV0FBVztNQUFBLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRURKLGFBQWEsQ0FBQyxDQUFDO0lBRWYsSUFBTW5JLFFBQVEsR0FBRyxJQUFJeUksY0FBYyxDQUFDTixhQUFhLENBQUM7SUFDbEQsSUFBSUosWUFBWSxJQUFJRSxPQUFPLEVBQUVqSSxRQUFRLENBQUNTLE9BQU8sQ0FBQ3dILE9BQU8sQ0FBQztJQUN0RCxJQUFJQyxTQUFTLEVBQUVsSSxRQUFRLENBQUNTLE9BQU8sQ0FBQ3lILFNBQVMsQ0FBQztJQUUxQyxPQUFPO01BQUEsT0FBTWxJLFFBQVEsQ0FBQ08sVUFBVSxDQUFDLENBQUM7SUFBQTtFQUNwQyxDQUFDLEVBQUUsQ0FBQ3dILFlBQVksRUFBRS9VLFdBQVcsYUFBWEEsV0FBVyxnQkFBQXpCLG1CQUFBLEdBQVh5QixXQUFXLENBQUVnVixLQUFLLGNBQUF6VyxtQkFBQSx1QkFBbEJBLG1CQUFBLENBQW9CME0sTUFBTSxFQUFFeEwsV0FBVyxDQUFDd0wsTUFBTSxDQUFDLENBQUM7RUFFbEUsSUFBTXlLLGVBQWUsR0FBR2hkLE9BQU8sQ0FDN0I7SUFBQSxPQUNFcUMsMkJBQTJCLENBQUM7TUFDMUI0YSxnQkFBZ0IsRUFBRTNVLGNBQWM7TUFDaEM0VSxrQkFBa0IsRUFBRXhVO0lBQ3RCLENBQUMsQ0FBQztFQUFBLEdBQ0osQ0FBQ0osY0FBYyxFQUFFSSxnQkFBZ0IsQ0FDbkMsQ0FBQztFQUVELElBQU15VSxnQkFBZ0IsR0FBRyxTQUFTO0VBQ2xDLElBQU1DLGlCQUFpQixHQUFHclosa0JBQWtCLENBQUNzWixRQUFRO0VBQ3JELElBQU1DLGFBQWEsR0FBRyxDQUFBNVQsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUwQyxJQUFJLE1BQUssUUFBUTtFQUM5QyxJQUFNbVIsWUFBWSxHQUFHM1IsT0FBTyxDQUMxQjBSLGFBQWEsS0FDYjVULEtBQUssYUFBTEEsS0FBSyxnQkFBQTVELGlCQUFBLEdBQUw0RCxLQUFLLENBQUU4VCxVQUFVLGNBQUExWCxpQkFBQSx1QkFBakJBLGlCQUFBLENBQW1CMlgsSUFBSSxDQUNyQixVQUFBQyxTQUFTO0lBQUEsT0FDUEEsU0FBUyxDQUFDQyxLQUFLLEtBQUssS0FBSyxJQUFJRCxTQUFTLENBQUNFLEtBQUssQ0FBQ0gsSUFBSSxDQUFDLFVBQUFJLElBQUk7TUFBQSxPQUFJLE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksQ0FBQ3hLLElBQUksQ0FBQyxDQUFDLENBQUNkLE1BQU0sR0FBRyxDQUFDO0lBQUEsRUFBQztFQUFBLENBQ2pILENBQUMsQ0FDSCxDQUFDO0VBQ0QsSUFBTXVMLGNBQWMsR0FBR1IsYUFBYSxHQUFHLENBQUE1VCxLQUFLLGFBQUxBLEtBQUssZ0JBQUEzRCxxQkFBQSxHQUFMMkQsS0FBSyxDQUFFcVUsa0JBQWtCLGNBQUFoWSxxQkFBQSx1QkFBekJBLHFCQUFBLENBQTJCc04sSUFBSSxDQUFDLENBQUMsS0FBSSxJQUFJLEdBQUcsSUFBSTtFQUN2RixJQUFNMkssd0JBQXdCLEdBQUdULFlBQVksSUFBSTNSLE9BQU8sQ0FBQ2tTLGNBQWMsQ0FBQztFQUN4RSxJQUFNRyxpQkFBaUIsR0FBRyxDQUFBdlUsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUwQyxJQUFJLE1BQUssY0FBYyxJQUFJbVIsWUFBWTtFQUV4RSxJQUFJVyx5QkFBb0M7RUFDeEMsSUFBSXRULHFCQUFxQixFQUFFO0lBQ3pCc1QseUJBQXlCLGdCQUFHcFosSUFBQSxDQUFDeEUsS0FBSztNQUFDNmQsS0FBSyxFQUFFcGEsa0JBQWtCLENBQUNxYSxhQUFjO01BQUN2TyxLQUFLLEVBQUUsRUFBRztNQUFDK00sTUFBTSxFQUFFO0lBQUcsQ0FBRSxDQUFDO0VBQ3ZHLENBQUMsTUFBTSxJQUFJclQsaUJBQWlCLEVBQUU7SUFDNUIyVSx5QkFBeUIsZ0JBQUdwWixJQUFBLENBQUNuQixzQkFBc0I7TUFBQ3dhLEtBQUssRUFBRWYsaUJBQWtCO01BQUN2TixLQUFLLEVBQUUsRUFBRztNQUFDK00sTUFBTSxFQUFFO0lBQUcsQ0FBRSxDQUFDO0VBQ3pHLENBQUMsTUFBTTtJQUNMc0IseUJBQXlCLGdCQUFHcFosSUFBQSxDQUFDMUIsdUJBQXVCO01BQUMrYSxLQUFLLEVBQUVmLGlCQUFrQjtNQUFDdk4sS0FBSyxFQUFFLEVBQUc7TUFBQytNLE1BQU0sRUFBRTtJQUFHLENBQUUsQ0FBQztFQUMxRztFQUVBLG9CQUNFNVgsS0FBQSxDQUFBRSxTQUFBO0lBQUFtWixRQUFBLGdCQUNFclosS0FBQSxDQUFDckQsc0JBQXNCO01BQ3JCMmMsR0FBRyxFQUFFeFcsVUFBVztNQUNoQjNCLFFBQVEsRUFBRSxLQUFNO01BQ2hCUSxZQUFZLEVBQUVBLFlBQWE7TUFDM0I0WCxjQUFjLEVBQUUsQ0FBQyxDQUFDeFgsV0FBVyxDQUFDd0wsTUFBTztNQUNyQ2lNLGVBQWUsRUFBRXBULGdCQUFpQjtNQUNsQyxnQkFBYSxpQkFBaUI7TUFDOUIsdUJBQXFCaEYsV0FBVyxHQUFHLE1BQU0sR0FBRyxPQUFRO01BQ3BEcVksT0FBTyxFQUFFOUMsa0JBQW1CO01BQzVCK0MsV0FBVyxFQUFFdEQsZUFBZ0I7TUFDN0J1RCxXQUFXLEVBQUVyRCxlQUFnQjtNQUM3QnNELFVBQVUsRUFBRXJELGNBQWU7TUFDM0JzRCxNQUFNLEVBQUVwRCxVQUFXO01BQUE0QyxRQUFBLEdBRWxCaEMsWUFBWSxpQkFDWHJYLEtBQUEsQ0FBQzdELGVBQWU7UUFBQ21kLEdBQUcsRUFBRTNXLFdBQVk7UUFBQTBXLFFBQUEsR0FDL0IvVyxXQUFXLGFBQVhBLFdBQVcsZ0JBQUF0QixtQkFBQSxHQUFYc0IsV0FBVyxDQUFFZ1YsS0FBSyxjQUFBdFcsbUJBQUEsZUFBbEJBLG1CQUFBLENBQW9CdU0sTUFBTSxnQkFDekJ6TixJQUFBLENBQUNSLElBQUk7VUFDSGdZLEtBQUssRUFBRWhWLFdBQVcsQ0FBQ2dWLEtBQU07VUFDekJsUSxJQUFJLEVBQUU5RSxXQUFXLENBQUM4RSxJQUFLO1VBQ3ZCMFMsV0FBVyxFQUFFeFgsV0FBVyxDQUFDd1gsV0FBWTtVQUNyQzVYLGFBQWEsRUFBRUE7UUFBYyxDQUM5QixDQUFDLEdBQ0EsSUFBSSxFQUNQSCxXQUFXLENBQUNnWSxHQUFHLENBQUMsVUFBQ0MsVUFBVSxFQUFFQyxLQUFLLEVBQUs7VUFBQSxJQUFBQyxnQkFBQTtVQUN0QyxJQUFNQyxPQUFPLEdBQ1gsRUFBQUQsZ0JBQUEsR0FBQUYsVUFBVSxDQUFDNVMsSUFBSSxjQUFBOFMsZ0JBQUEsdUJBQWZBLGdCQUFBLENBQWlCRSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUksa0NBQWtDLENBQUNDLElBQUksQ0FBQ0wsVUFBVSxDQUFDbEosSUFBSSxJQUFJLEVBQUUsQ0FBQztVQUN6RyxJQUFNd0osUUFBUSxHQUFHSCxPQUFPLGdCQUN0QnJhLElBQUEsQ0FBQzNCLDRCQUE0QjtZQUFDZ2IsS0FBSyxFQUFDLFNBQVM7WUFBQ3RPLEtBQUssRUFBRSxFQUFHO1lBQUMrTSxNQUFNLEVBQUU7VUFBRyxDQUFFLENBQUMsZ0JBRXZFOVgsSUFBQSxDQUFDNUIsbUJBQW1CO1lBQUNpYixLQUFLLEVBQUMsU0FBUztZQUFDdE8sS0FBSyxFQUFFLEVBQUc7WUFBQytNLE1BQU0sRUFBRTtVQUFHLENBQUUsQ0FDOUQ7VUFFRCxvQkFDRTlYLElBQUEsQ0FBQ3ZFLE9BQU87WUFBQ29YLEtBQUssRUFBRXFILFVBQVUsQ0FBQ2xKLElBQUs7WUFBbUN5SixNQUFNLEVBQUVyWSxhQUFjO1lBQUFtWCxRQUFBLGVBQ3ZGclosS0FBQSxDQUFDMUQsY0FBYztjQUFBK2MsUUFBQSxnQkFDYnJaLEtBQUEsQ0FBQ3ZELGtCQUFrQjtnQkFBQTRjLFFBQUEsZ0JBQ2pCdlosSUFBQSxDQUFDdEQsc0JBQXNCO2tCQUFBNmMsUUFBQSxFQUFFaUI7Z0JBQVEsQ0FBeUIsQ0FBQyxlQUMzRHhhLElBQUEsQ0FBQ3ZELHdCQUF3QjtrQkFDdkI2SyxJQUFJLEVBQUMsUUFBUTtrQkFDYixjQUFZNUUsQ0FBQyxDQUFDLDJCQUEyQixFQUFFO29CQUFFZ1ksWUFBWSxFQUFFO2tCQUFpQixDQUFDLENBQUU7a0JBQy9FQyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQTtvQkFBQSxPQUFReEQsc0JBQXNCLENBQUMrQyxVQUFVLENBQUN6UyxFQUFFLENBQUM7a0JBQUEsQ0FBQztrQkFBQThSLFFBQUEsZUFFckR2WixJQUFBLENBQUN4RSxLQUFLO29CQUFDNmQsS0FBSyxFQUFDLFNBQVM7b0JBQUN0TyxLQUFLLEVBQUUsRUFBRztvQkFBQytNLE1BQU0sRUFBRTtrQkFBRyxDQUFFO2dCQUFDLENBQ3hCLENBQUM7Y0FBQSxDQUNULENBQUMsZUFDckI5WCxJQUFBLENBQUNwRCxrQkFBa0I7Z0JBQUEyYyxRQUFBLEVBQUVXLFVBQVUsQ0FBQ2xKO2NBQUksQ0FBcUIsQ0FBQztZQUFBLENBQzVDO1VBQUMsTUFBQUksTUFBQSxDQWJzQjhJLFVBQVUsQ0FBQ3pTLEVBQUUsT0FBQTJKLE1BQUEsQ0FBSStJLEtBQUssQ0FjdEQsQ0FBQztRQUVkLENBQUMsQ0FBQztNQUFBLENBQ2EsQ0FDbEIsZUFDRGphLEtBQUEsQ0FBQ25ELHlCQUF5QjtRQUFBd2MsUUFBQSxnQkFDeEJ2WixJQUFBLENBQUNoRCxpQkFBaUI7VUFBQXVjLFFBQUEsZUFDaEJ2WixJQUFBLENBQUNQLG9CQUFvQjtZQUNuQitaLEdBQUcsRUFBRTdXLFNBQVU7WUFDZnRCLFFBQVEsRUFBRUEsUUFBUztZQUNuQkksV0FBVyxFQUFFQSxXQUFZO1lBQ3pCaUgsU0FBUyxFQUFFd1AsZUFBZ0I7WUFDM0IwQyxPQUFPLEVBQUU5RyxpQkFBa0I7WUFDM0IrRyxTQUFTLEVBQUV2VixhQUFjO1lBQ3pCM0QsT0FBTyxFQUFFQSxPQUFRO1lBQ2pCbVosWUFBWSxFQUFFbEU7VUFBaUIsQ0FDaEM7UUFBQyxDQUNlLENBQUMsZUFDcEIxVyxLQUFBLENBQUNqRCxpQkFBaUI7VUFBQ3VjLEdBQUcsRUFBRTFXLGFBQWM7VUFBQXlXLFFBQUEsZ0JBQ3BDdlosSUFBQSxDQUFDOUMseUJBQXlCO1lBQUFxYyxRQUFBLGVBQ3hCclosS0FBQSxDQUFDaEUsZ0JBQWdCO2NBQUFxZCxRQUFBLGdCQUNmdlosSUFBQSxDQUFDN0QsZ0JBQWdCO2dCQUNmbUwsSUFBSSxFQUFDLFFBQVE7Z0JBQ2J5VCxTQUFTLEVBQUVsVSxZQUFhO2dCQUN4Qm1VLFdBQVcsRUFBRXZPLHlCQUEwQjtnQkFDdkNrTyxPQUFPLEVBQUUvTixxQkFBc0I7Z0JBQy9CLGNBQVlsSyxDQUFDLENBQUMsdUJBQXVCLENBQUU7Z0JBQ3ZDLGlCQUFjLE1BQU07Z0JBQ3BCLGlCQUFlbUUsWUFBYTtnQkFBQTBTLFFBQUEsZUFFNUJ2WixJQUFBLENBQUM3QixnQkFBZ0I7a0JBQUNrYixLQUFLLEVBQUVoQixnQkFBaUI7a0JBQUN0TixLQUFLLEVBQUUsRUFBRztrQkFBQytNLE1BQU0sRUFBRTtnQkFBRyxDQUFFO2NBQUMsQ0FDcEQsQ0FBQyxFQUNsQnFCLGlCQUFpQixpQkFDaEJuWixJQUFBLENBQUM3RCxnQkFBZ0I7Z0JBQ2ZtTCxJQUFJLEVBQUMsUUFBUTtnQkFDYnlULFNBQVMsRUFBRSxLQUFNO2dCQUNqQkosT0FBTyxFQUFFek4sd0JBQXlCO2dCQUNsQzdMLFFBQVEsRUFBRUEsUUFBUztnQkFDbkIsY0FBWXFCLENBQUMsQ0FBQyxzQkFBc0IsQ0FBRTtnQkFBQTZXLFFBQUEsZUFFdEN2WixJQUFBLENBQUN4QixvQkFBb0I7a0JBQUM2YSxLQUFLLEVBQUVoQixnQkFBaUI7a0JBQUN0TixLQUFLLEVBQUUsRUFBRztrQkFBQytNLE1BQU0sRUFBRTtnQkFBRyxDQUFFO2NBQUMsQ0FDeEQsQ0FDbkIsRUFDQS9PLGdCQUFnQixpQkFDZjdJLEtBQUEsQ0FBQzlELGtCQUFrQjtnQkFDakJvZCxHQUFHLEVBQUV4USxlQUFnQjtnQkFDckIxQixJQUFJLEVBQUMsUUFBUTtnQkFDYjBULFdBQVcsRUFBRXZPLHlCQUEwQjtnQkFDdkNrTyxPQUFPLEVBQUUxSCx1QkFBd0I7Z0JBQ2pDNVIsUUFBUSxFQUFFQSxRQUFTO2dCQUNuQixpQkFBYyxTQUFTO2dCQUN2QixpQkFBZXNJLGtCQUFtQjtnQkFBQTRQLFFBQUEsZ0JBRWxDdlosSUFBQSxDQUFDcEIsU0FBUztrQkFBQ21NLEtBQUssRUFBRSxFQUFHO2tCQUFDK00sTUFBTSxFQUFFLEVBQUc7a0JBQUN1QixLQUFLLEVBQUVoQjtnQkFBaUIsQ0FBRSxDQUFDLEVBQzVEM1YsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO2NBQUEsQ0FDWCxDQUNyQixlQUNEMUMsSUFBQSxDQUFDMUUsT0FBTztnQkFDTjJmLElBQUksRUFBRXBVLFlBQWE7Z0JBQ25CcVUsUUFBUSxFQUFFeFYsY0FBZTtnQkFDekJ5VixPQUFPLEVBQUU3TyxhQUFjO2dCQUN2QjhPLGdCQUFnQjtnQkFDaEJDLG1CQUFtQjtnQkFDbkJDLG1CQUFtQjtnQkFDbkJDLFlBQVksRUFBRTtrQkFBRUMsUUFBUSxFQUFFLEtBQUs7a0JBQUVDLFVBQVUsRUFBRTtnQkFBTyxDQUFFO2dCQUN0REMsZUFBZSxFQUFFO2tCQUFFRixRQUFRLEVBQUUsUUFBUTtrQkFBRUMsVUFBVSxFQUFFO2dCQUFPLENBQUU7Z0JBQzVERSxFQUFFLEVBQUU7a0JBQUVsQixNQUFNLEVBQUUxVjtnQkFBZSxDQUFFO2dCQUMvQjZXLFNBQVMsRUFBRTtrQkFDVEMsS0FBSyxFQUFFO29CQUNMQyxTQUFTLEVBQUUsQ0FBQztvQkFDWkgsRUFBRSxFQUFFO3NCQUNGSSxRQUFRLEVBQUUsU0FBUztzQkFDbkJDLFlBQVksRUFBRSxLQUFLO3NCQUNuQkMsU0FBUyxFQUFFLE1BQU07c0JBQ2pCQyxlQUFlLEVBQUUsYUFBYTtzQkFDOUJDLFNBQVMsRUFBRTtvQkFDYjtrQkFDRjtnQkFDRixDQUFFO2dCQUFBNUMsUUFBQSxlQUVGdlosSUFBQSxDQUFDL0QsYUFBYTtrQkFBQXNkLFFBQUEsZUFDWnJaLEtBQUEsQ0FBQ3BFLG1CQUFtQjtvQkFBQXlkLFFBQUEsZ0JBQ2xCclosS0FBQSxDQUFDbkUsa0JBQWtCO3NCQUFDdUwsSUFBSSxFQUFDLFFBQVE7c0JBQUNxVCxPQUFPLEVBQUV0TixvQkFBcUI7c0JBQUFrTSxRQUFBLGdCQUM5RHZaLElBQUEsQ0FBQzVCLG1CQUFtQjt3QkFBQ2liLEtBQUssRUFBRWYsaUJBQWtCO3dCQUFDdk4sS0FBSyxFQUFFLEVBQUc7d0JBQUMrTSxNQUFNLEVBQUU7c0JBQUcsQ0FBRSxDQUFDLGVBQ3hFOVgsSUFBQSxDQUFDaEUsaUJBQWlCO3dCQUFBdWQsUUFBQSxFQUFFN1csQ0FBQyxDQUFDLHFCQUFxQjtzQkFBQyxDQUFvQixDQUFDO29CQUFBLENBQy9DLENBQUMsZUFDckIxQyxJQUFBLENBQUNuRSxlQUFlLElBQUUsQ0FBQyxlQUNuQnFFLEtBQUEsQ0FBQ25FLGtCQUFrQjtzQkFBQ3VMLElBQUksRUFBQyxRQUFRO3NCQUFDcVQsT0FBTyxFQUFFNU0sdUJBQXdCO3NCQUFBd0wsUUFBQSxnQkFDakV2WixJQUFBLENBQUNuQixzQkFBc0I7d0JBQUN3YSxLQUFLLEVBQUVmLGlCQUFrQjt3QkFBQ3ZOLEtBQUssRUFBRSxFQUFHO3dCQUFDK00sTUFBTSxFQUFFO3NCQUFHLENBQUUsQ0FBQyxlQUMzRTlYLElBQUEsQ0FBQ2hFLGlCQUFpQjt3QkFBQXVkLFFBQUEsRUFBRTdXLENBQUMsQ0FBQyxnQkFBZ0I7c0JBQUMsQ0FBb0IsQ0FBQyxFQUMzRCtCLGlCQUFpQixnQkFBR3pFLElBQUEsQ0FBQ3pFLEtBQUs7d0JBQUM4ZCxLQUFLLEVBQUVmLGlCQUFrQjt3QkFBQ3ZOLEtBQUssRUFBRSxFQUFHO3dCQUFDK00sTUFBTSxFQUFFO3NCQUFHLENBQUUsQ0FBQyxHQUFHLElBQUk7b0JBQUEsQ0FDcEUsQ0FBQyxlQUNyQjVYLEtBQUEsQ0FBQ25FLGtCQUFrQjtzQkFBQ3VMLElBQUksRUFBQyxRQUFRO3NCQUFDcVQsT0FBTyxFQUFFM00sd0JBQXlCO3NCQUFBdUwsUUFBQSxnQkFDbEV2WixJQUFBLENBQUMxQix1QkFBdUI7d0JBQUMrYSxLQUFLLEVBQUVmLGlCQUFrQjt3QkFBQ3ZOLEtBQUssRUFBRSxFQUFHO3dCQUFDK00sTUFBTSxFQUFFO3NCQUFHLENBQUUsQ0FBQyxlQUM1RTlYLElBQUEsQ0FBQ2hFLGlCQUFpQjt3QkFBQXVkLFFBQUEsRUFBRTdXLENBQUMsQ0FBQyxnQ0FBZ0M7c0JBQUMsQ0FBb0IsQ0FBQyxFQUMzRWlDLGtCQUFrQixnQkFBRzNFLElBQUEsQ0FBQ3pFLEtBQUs7d0JBQUM4ZCxLQUFLLEVBQUVmLGlCQUFrQjt3QkFBQ3ZOLEtBQUssRUFBRSxFQUFHO3dCQUFDK00sTUFBTSxFQUFFO3NCQUFHLENBQUUsQ0FBQyxHQUFHLElBQUk7b0JBQUEsQ0FDckUsQ0FBQyxlQUNyQjlYLElBQUEsQ0FBQ25FLGVBQWUsSUFBRSxDQUFDLGVBQ25CcUUsS0FBQSxDQUFDbkUsa0JBQWtCO3NCQUFDdUwsSUFBSSxFQUFDLFFBQVE7c0JBQUNxVCxPQUFPLEVBQUUxTSwwQkFBMkI7c0JBQUFzTCxRQUFBLGdCQUNwRXZaLElBQUEsQ0FBQ3JCLGtCQUFrQjt3QkFBQzBhLEtBQUssRUFBRWYsaUJBQWtCO3dCQUFDdk4sS0FBSyxFQUFFLEVBQUc7d0JBQUMrTSxNQUFNLEVBQUU7c0JBQUcsQ0FBRSxDQUFDLGVBQ3ZFOVgsSUFBQSxDQUFDaEUsaUJBQWlCO3dCQUFBdWQsUUFBQSxFQUFFN1csQ0FBQyxDQUFDLDJCQUEyQjtzQkFBQyxDQUFvQixDQUFDO29CQUFBLENBQ3JELENBQUM7a0JBQUEsQ0FDRjtnQkFBQyxDQUNUO2NBQUMsQ0FDVCxDQUFDLEVBQ1QsQ0FBQytCLGlCQUFpQixJQUFJRSxrQkFBa0Isa0JBQ3ZDekUsS0FBQSxDQUFDdEUsa0JBQWtCO2dCQUNqQndnQixRQUFRLEVBQUV0VyxxQkFBc0I7Z0JBQ2hDdVcsUUFBUSxFQUFFblcsZUFBZ0I7Z0JBQzFCb1csWUFBWSxFQUFFLFNBQWRBLFlBQVlBLENBQUE7a0JBQUEsT0FBUXZXLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFBQSxDQUFDO2dCQUNuRHdXLFlBQVksRUFBRSxTQUFkQSxZQUFZQSxDQUFBO2tCQUFBLE9BQVF4Vyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7Z0JBQUEsQ0FBQztnQkFBQXdULFFBQUEsZ0JBRXBEdlosSUFBQSxDQUFDdEUsd0JBQXdCO2tCQUN2QjRMLElBQUksRUFBQyxRQUFRO2tCQUNia1YsV0FBVyxFQUFFMVcscUJBQXNCO2tCQUNuQyxjQUFZcEQsQ0FBQyxDQUFDLDJCQUEyQixDQUFFO2tCQUMzQ2lZLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFFak8sQ0FBQyxFQUFJO29CQUNaQSxDQUFDLENBQUNHLGVBQWUsQ0FBQyxDQUFDO29CQUNuQmMsaUJBQWlCLENBQUMsQ0FBQztrQkFDckIsQ0FBRTtrQkFBQTRMLFFBQUEsRUFFREg7Z0JBQXlCLENBQ0YsQ0FBQyxlQUMzQnBaLElBQUEsQ0FBQ3JFLG1CQUFtQjtrQkFBQTRkLFFBQUEsRUFDakI5VSxpQkFBaUIsR0FBRy9CLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHQSxDQUFDLENBQUMsZ0NBQWdDO2dCQUFDLENBQzNELENBQUM7Y0FBQSxDQUNKLENBQ3JCO1lBQUEsQ0FDZTtVQUFDLENBQ00sQ0FBQyxlQUM1QnhDLEtBQUEsQ0FBQy9DLHlCQUF5QjtZQUFBb2MsUUFBQSxHQUN2Qkwsd0JBQXdCLGlCQUN2QmhaLEtBQUEsQ0FBQzNELHFCQUFxQjtjQUFBZ2QsUUFBQSxHQUNuQmQsWUFBWSxpQkFDWHpZLElBQUEsQ0FBQ3ZFLE9BQU8sRUFBQXVSLGFBQUEsQ0FBQUEsYUFBQTtnQkFDTjZGLEtBQUssRUFBRW5RLENBQUMsQ0FBQyw4QkFBOEI7Y0FBRSxHQUNwQ04sYUFBYSxJQUFJLElBQUksR0FBRztnQkFBRXFZLE1BQU0sRUFBRXJZO2NBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQW1YLFFBQUEsZUFFM0R2WixJQUFBLENBQUMxRCxxQkFBcUI7a0JBQUMsY0FBWW9HLENBQUMsQ0FBQyw0QkFBNEIsQ0FBRTtrQkFBQTZXLFFBQUEsZUFDakV2WixJQUFBLENBQUN6QixhQUFhO29CQUFDd00sS0FBSyxFQUFFLEVBQUc7b0JBQUMrTSxNQUFNLEVBQUUsRUFBRztvQkFBQ3VCLEtBQUssRUFBRWhCO2tCQUFpQixDQUFFO2dCQUFDLENBQzVDO2NBQUMsRUFDakIsQ0FDVixFQUNBVyxjQUFjLGlCQUNiaFosSUFBQSxDQUFDdkUsT0FBTyxFQUFBdVIsYUFBQSxDQUFBQSxhQUFBO2dCQUNONkYsS0FBSyxFQUFFblEsQ0FBQyxDQUFDLGlCQUFpQixFQUFFO2tCQUFFK1osS0FBSyxFQUFFekQ7Z0JBQWUsQ0FBQztjQUFFLEdBQ2xENVcsYUFBYSxJQUFJLElBQUksR0FBRztnQkFBRXFZLE1BQU0sRUFBRXJZO2NBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQW1YLFFBQUEsZUFFM0R2WixJQUFBLENBQUMxRCxxQkFBcUI7a0JBQUMsY0FBWTBjLGNBQWU7a0JBQUFPLFFBQUEsZUFDaER2WixJQUFBLENBQUN2QixrQkFBa0I7b0JBQUNzTSxLQUFLLEVBQUUsRUFBRztvQkFBQytNLE1BQU0sRUFBRSxFQUFHO29CQUFDdUIsS0FBSyxFQUFFaEI7a0JBQWlCLENBQUU7Z0JBQUMsQ0FDakQ7Y0FBQyxFQUNqQixDQUNWO1lBQUEsQ0FDb0IsQ0FDeEIsRUFDQTlXLFNBQVMsZ0JBQ1J2QixJQUFBLENBQUN2RSxPQUFPO2NBQUNvWCxLQUFLLEVBQUVuUSxDQUFDLENBQUMsV0FBVyxDQUFFO2NBQUMrWCxNQUFNLEVBQUVyWSxhQUFjO2NBQUFtWCxRQUFBLGVBQ3BEdlosSUFBQSxDQUFDNUMsb0JBQW9CO2dCQUFDaUUsUUFBUSxFQUFFLEtBQU07Z0JBQUNzWixPQUFPLEVBQUV0RCxvQkFBcUI7Z0JBQUNqVyxTQUFTLEVBQUVBLFNBQVU7Z0JBQUFtWSxRQUFBLGVBQ3pGdlosSUFBQSxDQUFDM0Msa0JBQWtCLElBQUU7Y0FBQyxDQUNGO1lBQUMsQ0FDaEIsQ0FBQyxnQkFFVjJDLElBQUEsQ0FBQ3ZFLE9BQU87Y0FBQ29YLEtBQUssRUFBRW5RLENBQUMsQ0FBQyxXQUFXLENBQUU7Y0FBQytYLE1BQU0sRUFBRXJZLGFBQWM7Y0FBQW1YLFFBQUEsZUFDcER2WixJQUFBO2dCQUFNMGMsS0FBSyxFQUFFO2tCQUFFQyxPQUFPLEVBQUUsYUFBYTtrQkFBRUMsVUFBVSxFQUFFO2dCQUFTLENBQUU7Z0JBQUFyRCxRQUFBLGVBQzVEdlosSUFBQSxDQUFDbEQsb0JBQW9CO2tCQUNuQjZkLE9BQU8sRUFBRXJKLGlCQUFrQjtrQkFDM0JsUSxTQUFTLEVBQUVBLFNBQVU7a0JBQ3JCQyxRQUFRLEVBQUVxTixZQUFZLElBQUlyTixRQUFTO2tCQUNuQ3diLFNBQVMsRUFBRXpaLGlCQUFpQixJQUFJbkIsV0FBVyxDQUFDd0wsTUFBTSxHQUFHLENBQUU7a0JBQUE4TCxRQUFBLGVBRXZEdlosSUFBQSxDQUFDdEIsaUJBQWlCO29CQUFDMmEsS0FBSyxFQUFDLFNBQVM7b0JBQUN0TyxLQUFLLEVBQUUsRUFBRztvQkFBQytNLE1BQU0sRUFBRTtrQkFBRyxDQUFFO2dCQUFDLENBQ3hDO2NBQUMsQ0FDbkI7WUFBQyxDQUNBLENBQ1Y7VUFBQSxDQUN3QixDQUFDO1FBQUEsQ0FDWCxDQUFDO01BQUEsQ0FDSyxDQUFDLGVBQzVCOVgsSUFBQTtRQUNFd1osR0FBRyxFQUFFNVcsWUFBYTtRQUNsQjBFLElBQUksRUFBQyxNQUFNO1FBQ1h3VixRQUFRO1FBQ1JDLE1BQU0sRUFBQywrR0FBK0c7UUFDdEhyYixRQUFRLEVBQUVxVSxnQkFBaUI7UUFDM0IyRyxLQUFLLEVBQUU7VUFBRUMsT0FBTyxFQUFFO1FBQU87TUFBRSxDQUM1QixDQUFDLEVBQ0RyVyxnQkFBZ0IsaUJBQUl0RyxJQUFBLENBQUMxQyxxQkFBcUI7UUFBQWljLFFBQUEsRUFBRTdXLENBQUMsQ0FBQyxvQkFBb0I7TUFBQyxDQUF3QixDQUFDO0lBQUEsQ0FDdkUsQ0FBQyxFQUN4QjBCLFVBQVUsQ0FBQ0wsTUFBTSxpQkFDaEIvRCxJQUFBLENBQUN0QyxnQkFBZ0I7TUFDZnlkLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO1FBQUEsT0FBUTlXLGFBQWEsQ0FBQztVQUFFTixNQUFNLEVBQUUsS0FBSztVQUFFQyxhQUFhLEVBQUUsRUFBRTtVQUFFQyxhQUFhLEVBQUUsRUFBRTtVQUFFQyxTQUFTLEVBQUUsQ0FBQztRQUFFLENBQUMsQ0FBQztNQUFBLENBQUM7TUFDckdGLGFBQWEsRUFBRUksVUFBVSxDQUFDSixhQUFjO01BQ3hDQyxhQUFhLEVBQUVHLFVBQVUsQ0FBQ0gsYUFBYztNQUN4Q0MsU0FBUyxFQUFFRSxVQUFVLENBQUNGO0lBQVUsQ0FDakMsQ0FDRixFQUNBcUIsV0FBVyxpQkFBSWxLLFlBQVksQ0FBQ2tLLFdBQVcsRUFBRThLLFFBQVEsQ0FBQzJNLElBQUksQ0FBQyxFQUN2RGxWLGlCQUFpQixpQkFDaEJ6TSxZQUFZLGNBQ1YyRSxJQUFBLENBQUNyQyxvQkFBb0I7TUFDbkJnSyxRQUFRLEVBQUVELGFBQWM7TUFDeEIyTSxLQUFLLEVBQUVuTSxVQUFXO01BQ2xCK1UsUUFBUSxFQUFFbEwsd0JBQXlCO01BQ25Db0osT0FBTyxFQUFFcEksd0JBQXlCO01BQ2xDdkssTUFBTSxFQUFFSSxnQkFBZ0IsQ0FBQ0osTUFBTztNQUNoQ0MsSUFBSSxFQUFFRyxnQkFBZ0IsQ0FBQ0gsSUFBSztNQUM1QkMsU0FBUyxFQUFFRSxnQkFBZ0IsQ0FBQ0YsU0FBVTtNQUN0QytSLE1BQU0sRUFBRXBTLG1CQUFvQjtNQUM1QjZVLFNBQVMsRUFBRWxhO0lBQVcsQ0FDdkIsQ0FBQyxFQUNGcU4sUUFBUSxDQUFDMk0sSUFDWCxDQUFDLEVBQ0ZyVCxrQkFBa0IsaUJBQ2pCdE8sWUFBWSxjQUNWMkUsSUFBQSxDQUFDcEMsY0FBYztNQUNidUwsTUFBTSxFQUFFQSxNQUFPO01BQ2ZrTCxLQUFLLEVBQUV0SyxXQUFZO01BQ25CVixPQUFPLEVBQUVELGFBQWM7TUFDdkJHLEtBQUssRUFBRUQsV0FBWTtNQUNuQjZULFNBQVMsRUFBRXBVLGdCQUFpQjtNQUM1QmtVLFFBQVEsRUFBRTdKLGlCQUFrQjtNQUM1QmdLLFFBQVEsRUFBRTdKLGlCQUFrQjtNQUM1QjRILE9BQU8sRUFBRW5JLHlCQUEwQjtNQUNuQ3hLLE1BQU0sRUFBRTJCLGlCQUFpQixDQUFDM0IsTUFBTztNQUNqQ0MsSUFBSSxFQUFFMEIsaUJBQWlCLENBQUMxQixJQUFLO01BQzdCQyxTQUFTLEVBQUV5QixpQkFBaUIsQ0FBQ3pCLFNBQVU7TUFDdkMrUixNQUFNLEVBQUVwUyxtQkFBb0I7TUFDNUI2VSxTQUFTLEVBQUVsYTtJQUFXLENBQ3ZCLENBQUMsRUFDRnFOLFFBQVEsQ0FBQzJNLElBQ1gsQ0FBQztFQUFBLENBQ0gsQ0FBQztBQUVQLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|