@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,1449 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
5
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
6
|
+
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; }
|
|
7
|
+
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; }
|
|
8
|
+
/* eslint-disable no-alert */
|
|
9
|
+
/* eslint-disable camelcase */
|
|
10
|
+
/* eslint-disable no-nested-ternary */
|
|
11
|
+
/* eslint-disable @typescript-eslint/indent */
|
|
12
|
+
/* eslint-disable import/no-cycle */
|
|
13
|
+
/* eslint-disable react/jsx-no-useless-fragment */
|
|
14
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
15
|
+
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
16
|
+
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
17
|
+
/* eslint-disable no-undef */
|
|
18
|
+
import { useEffect, useMemo, useRef, useState, useCallback } from 'react';
|
|
19
|
+
import { createPortal } from 'react-dom';
|
|
20
|
+
import { useTranslation } from 'react-i18next';
|
|
21
|
+
import { CUButton } from '@projectcor/button/lib/components/CUButton';
|
|
22
|
+
import { Category } from '@projectcor/icons/lib/components/Category';
|
|
23
|
+
import { Alert } from '@projectcor/icons/lib/components/Alert';
|
|
24
|
+
import { Trash } from '@projectcor/icons/lib/components/Trash';
|
|
25
|
+
import { Star } from '@projectcor/icons/lib/components/Star';
|
|
26
|
+
import { Cross } from '@projectcor/icons/lib/components/Cross';
|
|
27
|
+
import { SpinnerLottie } from '@projectcor/cor-commons/lib/components/spinner-lottie';
|
|
28
|
+
import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
|
|
29
|
+
import { AbmAccessibilitySection } from '../../molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection';
|
|
30
|
+
import { Backdrop } from '../../atoms/Backdrop';
|
|
31
|
+
import { useUser } from '../../../context/cor-user';
|
|
32
|
+
import { AccessibilityIcon, BrainIcon } from '../../atoms/icons';
|
|
33
|
+
import { useAgentModel } from '../../../hooks/useAgentModel/useAgentModel';
|
|
34
|
+
import { useGetAgentById } from '../../../services/maia/Agents/getAgentById';
|
|
35
|
+
import { AbmGeneralSection, AbmKnowledgeSection } from '../../molecules/AbmSection';
|
|
36
|
+
import { SCAAMContent, SCAAMFooter, SCAAMHeader, SCAAMHeaderTitle, SCAAMHeaderLeft, SCAAMHeaderFavorite, SCAAMHeaderCloseButton, SCAAMSidebar, SCAAMWrapper, SCAAMSidebarItem, SCAAMSidebarItemTitle, SCAAMDeleteButton, SCAAMSaveButton, SCAAMWrapperSpinner, SCAAMWrapperSpinnerContent, SCAAMSidebarItemError } from './AbmAgentModal.styles';
|
|
37
|
+
import { useCreateAgent } from '../../../hooks/useAgentModel/useCreateAgent';
|
|
38
|
+
import { useDeleteAgent } from '../../../hooks/useAgentModel/useDeleteAgent';
|
|
39
|
+
import { useSnackBarManager } from '../../../hooks/useSnackBarManager/useSnackBarManager';
|
|
40
|
+
import { useGlobalContext } from '../../../context/global-context';
|
|
41
|
+
import { useUpdateAgent } from '../../../hooks/useAgentModel/useUpdateAgent';
|
|
42
|
+
import { useKnowledgeOperations } from '../../../hooks/useKnowledge';
|
|
43
|
+
import { AbmLoaderFiles } from '../../molecules/AbmSection/AbmLoaderFiles';
|
|
44
|
+
import { WrapperCenterIcon } from '../../atoms/WrapperCenterIcon';
|
|
45
|
+
import { EVENTS, useEvent } from '../../../hooks/useEvent';
|
|
46
|
+
import { DeleteQuestionModal } from '../DeleteQuestionModal/DeleteQuestionModal';
|
|
47
|
+
import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
|
|
48
|
+
import { useAccessClient } from '../../../hooks/useAccessClient/useAccessClient';
|
|
49
|
+
import { useToggleFavorite } from '../../../hooks';
|
|
50
|
+
import { deriveConnectedConnectorSlugs, deriveTaskAccessFromToolGroupSlugs } from '../../../utils/normalizeAgentConnectors';
|
|
51
|
+
import { getAgentConnectors } from '../../../services/maia/Agents/connectors';
|
|
52
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
53
|
+
var initialValues = Object.freeze({
|
|
54
|
+
isEditing: false,
|
|
55
|
+
knowledge: [],
|
|
56
|
+
general: {
|
|
57
|
+
name: '',
|
|
58
|
+
emoji: '',
|
|
59
|
+
introduction: '',
|
|
60
|
+
inputPlaceholder: '',
|
|
61
|
+
isActive: false,
|
|
62
|
+
aiModel: null,
|
|
63
|
+
id: null,
|
|
64
|
+
userPrompt: null,
|
|
65
|
+
knowledgeBases: [],
|
|
66
|
+
is_favorite: false
|
|
67
|
+
},
|
|
68
|
+
accessibility: {
|
|
69
|
+
accessType: 'company',
|
|
70
|
+
clients: null,
|
|
71
|
+
taskAccess: true,
|
|
72
|
+
selectedConnectors: []
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
export var SectionByKey = {
|
|
76
|
+
general: function general(props) {
|
|
77
|
+
return /*#__PURE__*/_jsx(AbmGeneralSection, _objectSpread({}, props));
|
|
78
|
+
},
|
|
79
|
+
knowledge: function knowledge(props) {
|
|
80
|
+
return /*#__PURE__*/_jsx(AbmKnowledgeSection, _objectSpread({}, props));
|
|
81
|
+
},
|
|
82
|
+
accessibility: function accessibility(props) {
|
|
83
|
+
return /*#__PURE__*/_jsx(AbmAccessibilitySection, _objectSpread({}, props));
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var validateFieldValues = function validateFieldValues(valueToValidate) {
|
|
87
|
+
if (!valueToValidate.general.name || !valueToValidate.general.userPrompt) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/** Misma estructura que el efecto que hidrata desde useGetAgentById (todas las pestañas del ABM). */
|
|
94
|
+
function buildEditingModalValuesFromAgentDetail(agentById, agentModels, prev) {
|
|
95
|
+
var _agentById$knowledgeB, _agentById$clients;
|
|
96
|
+
var agentModel = agentModels.find(function (model) {
|
|
97
|
+
return model.id === agentById.modelAiId;
|
|
98
|
+
});
|
|
99
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
100
|
+
isEditing: true,
|
|
101
|
+
general: {
|
|
102
|
+
emoji: agentById.emoji,
|
|
103
|
+
name: agentById.name,
|
|
104
|
+
introduction: agentById.introduction,
|
|
105
|
+
inputPlaceholder: agentById.inputPlaceholder,
|
|
106
|
+
isActive: agentById.isActive,
|
|
107
|
+
aiModel: agentModel || null,
|
|
108
|
+
id: agentById.id,
|
|
109
|
+
userPrompt: agentById.userPrompt,
|
|
110
|
+
knowledgeBases: [],
|
|
111
|
+
is_favorite: agentById.is_favorite,
|
|
112
|
+
created_by: agentById.createdBy
|
|
113
|
+
},
|
|
114
|
+
knowledge: ((_agentById$knowledgeB = agentById.knowledgeBases) === null || _agentById$knowledgeB === void 0 ? void 0 : _agentById$knowledgeB.map(function (k) {
|
|
115
|
+
return {
|
|
116
|
+
file: new File([], k.filename),
|
|
117
|
+
id: k.id.toString(),
|
|
118
|
+
name: k.filename,
|
|
119
|
+
size: k.file_size_bytes || 0,
|
|
120
|
+
type: k.original_file_type,
|
|
121
|
+
status: k.status,
|
|
122
|
+
url_original: k.url_original || undefined,
|
|
123
|
+
url_thumbnail: k.url_thumbnail || undefined
|
|
124
|
+
};
|
|
125
|
+
})) || [],
|
|
126
|
+
accessibility: {
|
|
127
|
+
accessType: agentById.access,
|
|
128
|
+
clients: ((_agentById$clients = agentById.clients) === null || _agentById$clients === void 0 ? void 0 : _agentById$clients.map(function (client) {
|
|
129
|
+
var _client$id, _client$is_active, _client$is_deleted;
|
|
130
|
+
return {
|
|
131
|
+
id: ((_client$id = client.id) === null || _client$id === void 0 ? void 0 : _client$id.toString()) || '',
|
|
132
|
+
name: client.name,
|
|
133
|
+
is_active: (_client$is_active = client.is_active) !== null && _client$is_active !== void 0 ? _client$is_active : false,
|
|
134
|
+
is_deleted: (_client$is_deleted = client.is_deleted) !== null && _client$is_deleted !== void 0 ? _client$is_deleted : false
|
|
135
|
+
};
|
|
136
|
+
})) || null,
|
|
137
|
+
taskAccess: deriveTaskAccessFromToolGroupSlugs(agentById.toolGroupSlugs),
|
|
138
|
+
selectedConnectors: []
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
export var AbmAgentModal = function AbmAgentModal(_ref) {
|
|
143
|
+
var _user$permissions, _modalValues$accessib3, _modalValues$general3, _modalValues$general4, _modalValues$general5, _modalValues$general6;
|
|
144
|
+
var addAgent = _ref.addAgent,
|
|
145
|
+
updateAgent = _ref.updateAgent,
|
|
146
|
+
removeAgent = _ref.removeAgent,
|
|
147
|
+
updateAgentFavorite = _ref.updateAgentFavorite,
|
|
148
|
+
selectFirstAgent = _ref.selectFirstAgent;
|
|
149
|
+
var user = useUser();
|
|
150
|
+
var eventAmplitude = useEvent();
|
|
151
|
+
var _useTranslation = useTranslation('abm_agent_section'),
|
|
152
|
+
t = _useTranslation.t;
|
|
153
|
+
// const $_sc: any = null
|
|
154
|
+
var _useGlobalContext = useGlobalContext(),
|
|
155
|
+
currentSelectedAgent = _useGlobalContext.agent,
|
|
156
|
+
selectAgent = _useGlobalContext.selectAgent;
|
|
157
|
+
var abmAgentModalZIndex = useMaiaTaskPanelZIndex(1112, 'agentModal');
|
|
158
|
+
var tooltipZIndex = useMaiaTaskPanelZIndex(1500, 'nestedModal');
|
|
159
|
+
var _useToggleFavorite = useToggleFavorite(),
|
|
160
|
+
toggleFavorite = _useToggleFavorite.toggleFavorite;
|
|
161
|
+
var selector = document.getElementById('abm-agent-modal');
|
|
162
|
+
var _useState = useState(false),
|
|
163
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
164
|
+
isSubscribed = _useState2[0],
|
|
165
|
+
setIsSubscribed = _useState2[1];
|
|
166
|
+
var modalRef = useRef(null);
|
|
167
|
+
var hasPendingFilesRef = useRef(false);
|
|
168
|
+
var actionsToFiles = useRef({
|
|
169
|
+
toDelete: [],
|
|
170
|
+
toUpload: []
|
|
171
|
+
});
|
|
172
|
+
var accessUpdateContext = useRef({
|
|
173
|
+
isFromCreation: false,
|
|
174
|
+
isFromEditing: false,
|
|
175
|
+
hasActionFiles: false,
|
|
176
|
+
operationType: null,
|
|
177
|
+
hasBeenCalled: false
|
|
178
|
+
});
|
|
179
|
+
var accessHandledRef = useRef(false);
|
|
180
|
+
var agentCreatedRef = useRef(null);
|
|
181
|
+
var pendingInitialSectionRef = useRef(null);
|
|
182
|
+
var prefetchedAgentByIdRef = useRef(null);
|
|
183
|
+
var filesFinishedRef = useRef(false);
|
|
184
|
+
// Marca cuando cerramos el loader por el timeout de seguridad de archivos.
|
|
185
|
+
// Mientras esté activo, los useEffect de post-guardado NO deben disparar
|
|
186
|
+
// snackbars de éxito ni auto-cerrar el modal.
|
|
187
|
+
var processFilesTimedOutRef = useRef(false);
|
|
188
|
+
var _useState3 = useState(0),
|
|
189
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
190
|
+
filesProcessed = _useState4[0],
|
|
191
|
+
setFilesProcessed = _useState4[1];
|
|
192
|
+
var _useState5 = useState(false),
|
|
193
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
194
|
+
isOpen = _useState6[0],
|
|
195
|
+
setIsOpen = _useState6[1];
|
|
196
|
+
var _useState7 = useState(false),
|
|
197
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
198
|
+
showModalDelete = _useState8[0],
|
|
199
|
+
setShowModalDelete = _useState8[1];
|
|
200
|
+
var _useState9 = useState('general'),
|
|
201
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
202
|
+
section = _useState0[0],
|
|
203
|
+
setSection = _useState0[1];
|
|
204
|
+
var _useState1 = useState(false),
|
|
205
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
206
|
+
isLoading = _useState10[0],
|
|
207
|
+
setIsLoading = _useState10[1];
|
|
208
|
+
var _useState11 = useState(initialValues),
|
|
209
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
210
|
+
modalValues = _useState12[0],
|
|
211
|
+
setModalValues = _useState12[1];
|
|
212
|
+
var _useGetAgentById = useGetAgentById(),
|
|
213
|
+
agentLoading = _useGetAgentById.loading,
|
|
214
|
+
handleGetAgentById = _useGetAgentById.handleGetAgentById,
|
|
215
|
+
agentById = _useGetAgentById.agent,
|
|
216
|
+
handleCleanAgent = _useGetAgentById.handleCleanAgent,
|
|
217
|
+
errorGetAgentById = _useGetAgentById.error;
|
|
218
|
+
var _useAgentModel = useAgentModel(),
|
|
219
|
+
agentModels = _useAgentModel.agentModels,
|
|
220
|
+
getAllAgentModels = _useAgentModel.getAllAgentModels;
|
|
221
|
+
var firstValueAgent = useRef(null);
|
|
222
|
+
var _useState13 = useState(false),
|
|
223
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
224
|
+
isShowProcessFiles = _useState14[0],
|
|
225
|
+
setIsShowProcessFiles = _useState14[1];
|
|
226
|
+
var _useState15 = useState(false),
|
|
227
|
+
_useState16 = _slicedToArray(_useState15, 2),
|
|
228
|
+
hasFileErrors = _useState16[0],
|
|
229
|
+
setHasFileErrors = _useState16[1];
|
|
230
|
+
var userPermissions = user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 ? void 0 : _user$permissions.ai_agents;
|
|
231
|
+
var _useDeleteAgent = useDeleteAgent(),
|
|
232
|
+
handleDeleteAgent = _useDeleteAgent.handleDeleteAgent,
|
|
233
|
+
successDelete = _useDeleteAgent.success,
|
|
234
|
+
resetSuccess = _useDeleteAgent.resetSuccess;
|
|
235
|
+
var _useUpdateAgent = useUpdateAgent(),
|
|
236
|
+
handleUpdateAgent = _useUpdateAgent.handleUpdateAgent,
|
|
237
|
+
successUpdate = _useUpdateAgent.success,
|
|
238
|
+
resetSuccessUpdate = _useUpdateAgent.resetSuccess;
|
|
239
|
+
var _useCreateAgent = useCreateAgent(),
|
|
240
|
+
handleCreateAgent = _useCreateAgent.handleCreateAgent,
|
|
241
|
+
isLoadingCreate = _useCreateAgent.isLoading,
|
|
242
|
+
successCreate = _useCreateAgent.success,
|
|
243
|
+
resetSuccessCreate = _useCreateAgent.resetSuccess;
|
|
244
|
+
var _useSnackBarManager = useSnackBarManager(),
|
|
245
|
+
handleSnackbarSuccess = _useSnackBarManager.handleSnackbarSuccess,
|
|
246
|
+
handleSnackbarError = _useSnackBarManager.handleSnackbarError;
|
|
247
|
+
var _useKnowledgeOperatio = useKnowledgeOperations(),
|
|
248
|
+
handleCreateKnowledges = _useKnowledgeOperatio.handleCreateKnowledges,
|
|
249
|
+
handleDeleteKnowledges = _useKnowledgeOperatio.handleDeleteKnowledges,
|
|
250
|
+
handleDeleteAndCreateKnowledges = _useKnowledgeOperatio.handleDeleteAndCreateKnowledges,
|
|
251
|
+
isLoadingKnowledge = _useKnowledgeOperatio.isLoading,
|
|
252
|
+
errorKnowledge = _useKnowledgeOperatio.error,
|
|
253
|
+
successKnowledgeDelete = _useKnowledgeOperatio.successDelete,
|
|
254
|
+
handleResetSuccessSave = _useKnowledgeOperatio.handleResetSuccessSave,
|
|
255
|
+
handleResetSuccessDelete = _useKnowledgeOperatio.handleResetSuccessDelete;
|
|
256
|
+
var _useAccessClient = useAccessClient(),
|
|
257
|
+
handleAccessClient = _useAccessClient.handleAccessClient,
|
|
258
|
+
successUpdateAccess = _useAccessClient.success,
|
|
259
|
+
isLoadingUpdateAccess = _useAccessClient.isLoading,
|
|
260
|
+
resetSuccessUpdateAccess = _useAccessClient.handleResetSuccess;
|
|
261
|
+
if (!selector) return null;
|
|
262
|
+
var areClientsArraysEqual = function areClientsArraysEqual(clients1, clients2) {
|
|
263
|
+
if (!clients1 && !clients2) return true;
|
|
264
|
+
if (!clients1 || !clients2) return false;
|
|
265
|
+
if (clients1.length !== clients2.length) return false;
|
|
266
|
+
var clients1Ids = clients1.map(function (c) {
|
|
267
|
+
return c.clientId;
|
|
268
|
+
}).sort();
|
|
269
|
+
var clients2Ids = clients2.map(function (c) {
|
|
270
|
+
return c.clientId;
|
|
271
|
+
}).sort();
|
|
272
|
+
return clients1Ids.every(function (id, index) {
|
|
273
|
+
return id === clients2Ids[index];
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
var hasAccessibilityChanged = function hasAccessibilityChanged() {
|
|
277
|
+
var _firstValueAgent$curr, _modalValues$accessib, _firstValueAgent$curr2;
|
|
278
|
+
if (!((_firstValueAgent$curr = firstValueAgent.current) !== null && _firstValueAgent$curr !== void 0 && _firstValueAgent$curr.accessibility) || !(modalValues !== null && modalValues !== void 0 && modalValues.accessibility)) return true;
|
|
279
|
+
var accessTypeSame = modalValues.accessibility.accessType === firstValueAgent.current.accessibility.accessType;
|
|
280
|
+
var clientsSame = areClientsArraysEqual(modalValues.accessibility.clients, firstValueAgent.current.accessibility.clients);
|
|
281
|
+
var taskAccessSame = ((_modalValues$accessib = modalValues.accessibility.taskAccess) !== null && _modalValues$accessib !== void 0 ? _modalValues$accessib : true) === ((_firstValueAgent$curr2 = firstValueAgent.current.accessibility.taskAccess) !== null && _firstValueAgent$curr2 !== void 0 ? _firstValueAgent$curr2 : true);
|
|
282
|
+
var currentConnectors = _toConsumableArray(modalValues.accessibility.selectedConnectors || []).sort();
|
|
283
|
+
var originalConnectors = _toConsumableArray(firstValueAgent.current.accessibility.selectedConnectors || []).sort();
|
|
284
|
+
var connectorsSame = currentConnectors.length === originalConnectors.length && currentConnectors.every(function (slug, index) {
|
|
285
|
+
return slug === originalConnectors[index];
|
|
286
|
+
});
|
|
287
|
+
return !accessTypeSame || !clientsSame || !taskAccessSame || !connectorsSame;
|
|
288
|
+
};
|
|
289
|
+
var validateAgentValuesIsSame = function validateAgentValuesIsSame() {
|
|
290
|
+
var _firstValueAgent$curr3, _modalValues$general$, _firstValueAgent$curr4, _modalValues$knowledg, _firstValueAgent$curr5, _modalValues$knowledg2, _firstValueAgent$curr6, _actionsToFiles$curre, _actionsToFiles$curre2;
|
|
291
|
+
if (!((_firstValueAgent$curr3 = firstValueAgent.current) !== null && _firstValueAgent$curr3 !== void 0 && _firstValueAgent$curr3.general) || !(modalValues !== null && modalValues !== void 0 && modalValues.general)) return false;
|
|
292
|
+
return modalValues.general.name === firstValueAgent.current.general.name && modalValues.general.emoji === firstValueAgent.current.general.emoji && modalValues.general.introduction === firstValueAgent.current.general.introduction && modalValues.general.inputPlaceholder === firstValueAgent.current.general.inputPlaceholder && ((_modalValues$general$ = modalValues.general.aiModel) === null || _modalValues$general$ === void 0 ? void 0 : _modalValues$general$.id) === ((_firstValueAgent$curr4 = firstValueAgent.current.general.aiModel) === null || _firstValueAgent$curr4 === void 0 ? void 0 : _firstValueAgent$curr4.id) && modalValues.general.userPrompt === firstValueAgent.current.general.userPrompt && (((_modalValues$knowledg = modalValues.knowledge) === null || _modalValues$knowledg === void 0 ? void 0 : _modalValues$knowledg.length) === ((_firstValueAgent$curr5 = firstValueAgent.current) === null || _firstValueAgent$curr5 === void 0 || (_firstValueAgent$curr5 = _firstValueAgent$curr5.knowledge) === null || _firstValueAgent$curr5 === void 0 ? void 0 : _firstValueAgent$curr5.length) || !((_modalValues$knowledg2 = modalValues.knowledge) !== null && _modalValues$knowledg2 !== void 0 && _modalValues$knowledg2.length) && !((_firstValueAgent$curr6 = firstValueAgent.current) !== null && _firstValueAgent$curr6 !== void 0 && (_firstValueAgent$curr6 = _firstValueAgent$curr6.knowledge) !== null && _firstValueAgent$curr6 !== void 0 && _firstValueAgent$curr6.length)) && !((_actionsToFiles$curre = actionsToFiles.current.toUpdate) !== null && _actionsToFiles$curre !== void 0 && _actionsToFiles$curre.length) && !((_actionsToFiles$curre2 = actionsToFiles.current.toDelete) !== null && _actionsToFiles$curre2 !== void 0 && _actionsToFiles$curre2.length) && !hasAccessibilityChanged();
|
|
293
|
+
};
|
|
294
|
+
var hasAnyValueForCreation = function hasAnyValueForCreation() {
|
|
295
|
+
var _modalValues$general$2, _agentModels$, _modalValues$general$3;
|
|
296
|
+
if (modalValues.isEditing) return false;
|
|
297
|
+
var isDefaultAiModel = !!agentModels.length && ((_modalValues$general$2 = modalValues.general.aiModel) === null || _modalValues$general$2 === void 0 ? void 0 : _modalValues$general$2.id) === ((_agentModels$ = agentModels[0]) === null || _agentModels$ === void 0 ? void 0 : _agentModels$.id);
|
|
298
|
+
var defaultInputPlaceholder = t('generalSection.inputPlaceholder');
|
|
299
|
+
var isDefaultInputPlaceholder = modalValues.general.inputPlaceholder === defaultInputPlaceholder;
|
|
300
|
+
var defaultUserPromptPlaceholder = t('generalSection.initialPromptPlaceholder');
|
|
301
|
+
var isDefaultUserPrompt = modalValues.general.userPrompt === defaultUserPromptPlaceholder || modalValues.general.userPrompt === '' || modalValues.general.userPrompt === null;
|
|
302
|
+
var hasName = modalValues.general.name.trim() !== '';
|
|
303
|
+
var hasEmoji = modalValues.general.emoji.trim() !== '';
|
|
304
|
+
var hasIntroduction = modalValues.general.introduction.trim() !== '';
|
|
305
|
+
var hasInputPlaceholder = modalValues.general.inputPlaceholder.trim() !== '' && !isDefaultInputPlaceholder;
|
|
306
|
+
var hasUserPrompt = ((_modalValues$general$3 = modalValues.general.userPrompt) === null || _modalValues$general$3 === void 0 ? void 0 : _modalValues$general$3.trim()) !== '' && !isDefaultUserPrompt;
|
|
307
|
+
var hasKnowledge = !!modalValues.knowledge.length;
|
|
308
|
+
var hasCustomAiModel = modalValues.general.aiModel && !isDefaultAiModel;
|
|
309
|
+
var hasAccessibility = modalValues.accessibility.accessType !== 'company';
|
|
310
|
+
return hasName || hasEmoji || hasIntroduction || hasInputPlaceholder || hasUserPrompt || hasKnowledge || hasCustomAiModel || hasAccessibility;
|
|
311
|
+
};
|
|
312
|
+
var hasChangesForEditing = function hasChangesForEditing() {
|
|
313
|
+
if (!modalValues.isEditing) return false;
|
|
314
|
+
return !validateAgentValuesIsSame() || !!actionsToFiles.current.toDelete.length || !!actionsToFiles.current.toUpload.length;
|
|
315
|
+
};
|
|
316
|
+
var hasPendingChanges = function hasPendingChanges() {
|
|
317
|
+
return hasAnyValueForCreation() || hasChangesForEditing();
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
// Helper para manejar el toggle de favorito y actualizar el estado con ordenamiento
|
|
321
|
+
var handleToggleFavoriteForAgent = useCallback(function (agentId, agent, onSuccess, onError) {
|
|
322
|
+
toggleFavorite(agentId, function (updatedAgent) {
|
|
323
|
+
// Actualizar el estado de agentes con el resultado del servidor y ordenar
|
|
324
|
+
updateAgentFavorite(updatedAgent, true);
|
|
325
|
+
if (onSuccess) {
|
|
326
|
+
onSuccess(updatedAgent);
|
|
327
|
+
}
|
|
328
|
+
}, function () {
|
|
329
|
+
if (onError) {
|
|
330
|
+
onError();
|
|
331
|
+
}
|
|
332
|
+
}, agent.is_favorite);
|
|
333
|
+
}, [toggleFavorite, updateAgentFavorite]);
|
|
334
|
+
var handleClose = function handleClose() {
|
|
335
|
+
if (hasPendingChanges() && !successCreate && !successUpdate && !successDelete) {
|
|
336
|
+
var confirmMessage = modalValues.isEditing ? t('confirmCloseEditAgent') : t('confirmCloseCreateAgent');
|
|
337
|
+
if (!window.confirm(confirmMessage)) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
setModalValues(initialValues);
|
|
342
|
+
handleCleanAgent();
|
|
343
|
+
handleResetSuccessSave();
|
|
344
|
+
handleResetSuccessDelete();
|
|
345
|
+
resetSuccessUpdateAccess();
|
|
346
|
+
actionsToFiles.current = {
|
|
347
|
+
toDelete: [],
|
|
348
|
+
toUpload: []
|
|
349
|
+
};
|
|
350
|
+
accessUpdateContext.current = {
|
|
351
|
+
isFromCreation: false,
|
|
352
|
+
isFromEditing: false,
|
|
353
|
+
hasActionFiles: false,
|
|
354
|
+
operationType: null,
|
|
355
|
+
hasBeenCalled: false
|
|
356
|
+
};
|
|
357
|
+
accessHandledRef.current = false;
|
|
358
|
+
hasPendingFilesRef.current = false;
|
|
359
|
+
processFilesTimedOutRef.current = false;
|
|
360
|
+
setIsShowProcessFiles(false);
|
|
361
|
+
setIsSubscribed(false);
|
|
362
|
+
setFilesProcessed(0);
|
|
363
|
+
setSection('general');
|
|
364
|
+
setIsOpen(false);
|
|
365
|
+
agentCreatedRef.current = null;
|
|
366
|
+
pendingInitialSectionRef.current = null;
|
|
367
|
+
prefetchedAgentByIdRef.current = null;
|
|
368
|
+
};
|
|
369
|
+
var handleBackdropClick = function handleBackdropClick(event) {
|
|
370
|
+
if (event.target === event.currentTarget && !isShowProcessFiles) {
|
|
371
|
+
handleClose();
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
var handleSectionChange = function handleSectionChange(newSection) {
|
|
375
|
+
eventAmplitude(EVENTS.tabSection, {
|
|
376
|
+
option: newSection
|
|
377
|
+
});
|
|
378
|
+
setSection(newSection);
|
|
379
|
+
};
|
|
380
|
+
var handleSetAgentValuesByKeys = function handleSetAgentValuesByKeys(_ref2) {
|
|
381
|
+
var key = _ref2.key,
|
|
382
|
+
value = _ref2.value,
|
|
383
|
+
deleteKnowledge = _ref2.deleteKnowledge;
|
|
384
|
+
if (key === 'knowledge') {
|
|
385
|
+
if (!deleteKnowledge) {
|
|
386
|
+
var _actionsToFiles$curre3;
|
|
387
|
+
(_actionsToFiles$curre3 = actionsToFiles.current.toUpload).push.apply(_actionsToFiles$curre3, _toConsumableArray(value || []));
|
|
388
|
+
} else {
|
|
389
|
+
var filesPrevIds = value.length ? new Set(value.map(function (file) {
|
|
390
|
+
return file.id;
|
|
391
|
+
})) : new Set();
|
|
392
|
+
var newFiles = modalValues.knowledge.filter(function (file) {
|
|
393
|
+
return !filesPrevIds.has(file.id) && file.status !== 'started';
|
|
394
|
+
});
|
|
395
|
+
if (!newFiles.length && actionsToFiles.current.toUpload.length) {
|
|
396
|
+
var valueIds = new Set(value.map(function (file) {
|
|
397
|
+
return file.id;
|
|
398
|
+
}));
|
|
399
|
+
actionsToFiles.current.toUpload = actionsToFiles.current.toUpload.filter(function (file) {
|
|
400
|
+
return valueIds.has(file.id);
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
actionsToFiles.current.toDelete = [].concat(_toConsumableArray(actionsToFiles.current.toDelete || []), _toConsumableArray(newFiles));
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
setModalValues(function (prev) {
|
|
407
|
+
var knowledgeFiles = key === 'knowledge' ? deleteKnowledge ? value : [].concat(_toConsumableArray(prev.knowledge || []), _toConsumableArray(value || [])) : null;
|
|
408
|
+
return _objectSpread(_objectSpread({}, prev), key === 'knowledge' ? {
|
|
409
|
+
knowledge: knowledgeFiles
|
|
410
|
+
} : key === 'accessibility' ? {
|
|
411
|
+
accessibility: value
|
|
412
|
+
} : {
|
|
413
|
+
general: _objectSpread(_objectSpread({}, prev.general), {}, _defineProperty({}, key, value))
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
var _handleConfirmAction = /*#__PURE__*/function () {
|
|
418
|
+
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(chat, action) {
|
|
419
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
420
|
+
while (1) switch (_context.prev = _context.next) {
|
|
421
|
+
case 0:
|
|
422
|
+
if (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
423
|
+
_context.next = 1;
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
return _context.abrupt("return");
|
|
427
|
+
case 1:
|
|
428
|
+
if (!(action === 'delete')) {
|
|
429
|
+
_context.next = 2;
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
eventAmplitude(EVENTS["delete"]);
|
|
433
|
+
handleDeleteAgent(chat.id);
|
|
434
|
+
return _context.abrupt("return");
|
|
435
|
+
case 2:
|
|
436
|
+
eventAmplitude(EVENTS.confirmAction, {
|
|
437
|
+
option: modalValues.isEditing ? 'edite' : 'create'
|
|
438
|
+
});
|
|
439
|
+
// Al reintentar guardar, liberar el freno del timeout previo para que los
|
|
440
|
+
// useEffect de post-guardado vuelvan a poder disparar snackbars y cerrar.
|
|
441
|
+
processFilesTimedOutRef.current = false;
|
|
442
|
+
if (!modalValues.isEditing) {
|
|
443
|
+
_context.next = 4;
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
if (validateAgentValuesIsSame()) {
|
|
447
|
+
_context.next = 3;
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
_context.next = 3;
|
|
451
|
+
return handleUpdateAgent(modalValues);
|
|
452
|
+
case 3:
|
|
453
|
+
_context.next = 5;
|
|
454
|
+
break;
|
|
455
|
+
case 4:
|
|
456
|
+
_context.next = 5;
|
|
457
|
+
return handleCreateAgent(modalValues);
|
|
458
|
+
case 5:
|
|
459
|
+
case "end":
|
|
460
|
+
return _context.stop();
|
|
461
|
+
}
|
|
462
|
+
}, _callee);
|
|
463
|
+
}));
|
|
464
|
+
return function handleConfirmAction(_x, _x2) {
|
|
465
|
+
return _ref3.apply(this, arguments);
|
|
466
|
+
};
|
|
467
|
+
}();
|
|
468
|
+
useEffect(function () {
|
|
469
|
+
var handleSetAgentValues = function handleSetAgentValues(event) {
|
|
470
|
+
var _agentValues$values, _agentValues$values3;
|
|
471
|
+
var agentValues = event.detail.agentValues;
|
|
472
|
+
var initialSection = agentValues === null || agentValues === void 0 ? void 0 : agentValues.initialSection;
|
|
473
|
+
pendingInitialSectionRef.current = initialSection && ['general', 'knowledge', 'accessibility'].includes(initialSection) ? initialSection : null;
|
|
474
|
+
getAllAgentModels();
|
|
475
|
+
setIsOpen(true);
|
|
476
|
+
setIsLoading(true);
|
|
477
|
+
accessUpdateContext.current = {
|
|
478
|
+
isFromCreation: false,
|
|
479
|
+
isFromEditing: false,
|
|
480
|
+
hasActionFiles: false,
|
|
481
|
+
operationType: null,
|
|
482
|
+
hasBeenCalled: false
|
|
483
|
+
};
|
|
484
|
+
if ((_agentValues$values = agentValues.values) !== null && _agentValues$values !== void 0 && _agentValues$values.isEditing) {
|
|
485
|
+
var _agentValues$values2;
|
|
486
|
+
// Validar que la feature flag esté habilitada antes de cargar el agente para editar
|
|
487
|
+
if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
488
|
+
handleSnackbarError(t('errorAccessDenied'));
|
|
489
|
+
setIsOpen(false);
|
|
490
|
+
setIsLoading(false);
|
|
491
|
+
pendingInitialSectionRef.current = null;
|
|
492
|
+
prefetchedAgentByIdRef.current = null;
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (agentValues.prefetchedAgentById) {
|
|
496
|
+
handleCleanAgent();
|
|
497
|
+
prefetchedAgentByIdRef.current = agentValues.prefetchedAgentById;
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
handleGetAgentById(agentValues === null || agentValues === void 0 || (_agentValues$values2 = agentValues.values) === null || _agentValues$values2 === void 0 || (_agentValues$values2 = _agentValues$values2.general) === null || _agentValues$values2 === void 0 ? void 0 : _agentValues$values2.id);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
if (agentValues.values) {
|
|
504
|
+
var nextValues = _objectSpread(_objectSpread(_objectSpread({}, initialValues), agentValues.values), {}, {
|
|
505
|
+
general: _objectSpread(_objectSpread({}, initialValues.general), agentValues.values.general || {}),
|
|
506
|
+
accessibility: _objectSpread(_objectSpread({}, initialValues.accessibility), agentValues.values.accessibility || {}),
|
|
507
|
+
knowledge: agentValues.values.knowledge || []
|
|
508
|
+
});
|
|
509
|
+
firstValueAgent.current = nextValues;
|
|
510
|
+
setModalValues(nextValues);
|
|
511
|
+
}
|
|
512
|
+
if (pendingInitialSectionRef.current && !((_agentValues$values3 = agentValues.values) !== null && _agentValues$values3 !== void 0 && _agentValues$values3.isEditing)) {
|
|
513
|
+
setSection(pendingInitialSectionRef.current);
|
|
514
|
+
pendingInitialSectionRef.current = null;
|
|
515
|
+
}
|
|
516
|
+
setIsLoading(false);
|
|
517
|
+
};
|
|
518
|
+
document.addEventListener('abm-agent-modal-set-values', handleSetAgentValues);
|
|
519
|
+
return function () {
|
|
520
|
+
document.removeEventListener('abm-agent-modal-set-values', handleSetAgentValues);
|
|
521
|
+
};
|
|
522
|
+
}, []);
|
|
523
|
+
|
|
524
|
+
// useEffect to handle the overflow of the body when the modal is open
|
|
525
|
+
useEffect(function () {
|
|
526
|
+
if (!isOpen) {
|
|
527
|
+
return undefined;
|
|
528
|
+
}
|
|
529
|
+
var _document = document,
|
|
530
|
+
body = _document.body;
|
|
531
|
+
if (!body) {
|
|
532
|
+
return undefined;
|
|
533
|
+
}
|
|
534
|
+
var originalOverflow = body.style.overflow;
|
|
535
|
+
body.style.overflow = 'hidden';
|
|
536
|
+
return function () {
|
|
537
|
+
body.style.overflow = originalOverflow;
|
|
538
|
+
};
|
|
539
|
+
}, [isOpen]);
|
|
540
|
+
useEffect(function () {
|
|
541
|
+
var handleBeforeUnload = function handleBeforeUnload(event) {
|
|
542
|
+
if (hasPendingChanges()) {
|
|
543
|
+
event.preventDefault();
|
|
544
|
+
// eslint-disable-next-line no-param-reassign
|
|
545
|
+
event.returnValue = t('confirmReloadBrowser');
|
|
546
|
+
return t('confirmReloadBrowser');
|
|
547
|
+
}
|
|
548
|
+
return undefined;
|
|
549
|
+
};
|
|
550
|
+
if (isOpen) {
|
|
551
|
+
window.addEventListener('beforeunload', handleBeforeUnload);
|
|
552
|
+
}
|
|
553
|
+
return function () {
|
|
554
|
+
window.removeEventListener('beforeunload', handleBeforeUnload);
|
|
555
|
+
};
|
|
556
|
+
}, [isOpen, hasPendingChanges, t]);
|
|
557
|
+
useEffect(function () {
|
|
558
|
+
if (successDelete) {
|
|
559
|
+
handleSnackbarSuccess(t('confirmAgentDeleted'));
|
|
560
|
+
resetSuccess();
|
|
561
|
+
if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === modalValues.general.id) {
|
|
562
|
+
selectFirstAgent(currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id);
|
|
563
|
+
}
|
|
564
|
+
removeAgent(modalValues.general.id);
|
|
565
|
+
setShowModalDelete(false);
|
|
566
|
+
handleClose();
|
|
567
|
+
}
|
|
568
|
+
}, [successDelete]);
|
|
569
|
+
useEffect(function () {
|
|
570
|
+
// Evitar ejecución múltiple del efecto
|
|
571
|
+
if (successCreate && !isLoadingCreate && agentCreatedRef.current !== successCreate.id) {
|
|
572
|
+
agentCreatedRef.current = successCreate.id;
|
|
573
|
+
if (actionsToFiles.current.toDelete.length && actionsToFiles.current.toUpload.length) {
|
|
574
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
575
|
+
accessUpdateContext.current = {
|
|
576
|
+
isFromCreation: true,
|
|
577
|
+
isFromEditing: false,
|
|
578
|
+
hasActionFiles: true,
|
|
579
|
+
operationType: 'create',
|
|
580
|
+
hasBeenCalled: false
|
|
581
|
+
};
|
|
582
|
+
} else {
|
|
583
|
+
// Si no hay accesibilidad pero hay archivos, establecer el contexto para creación
|
|
584
|
+
accessUpdateContext.current = {
|
|
585
|
+
isFromCreation: true,
|
|
586
|
+
isFromEditing: false,
|
|
587
|
+
hasActionFiles: false,
|
|
588
|
+
operationType: 'create',
|
|
589
|
+
hasBeenCalled: false
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
var promises = [handleDeleteAndCreateKnowledges({
|
|
593
|
+
filesToDelete: actionsToFiles.current.toDelete,
|
|
594
|
+
filesToCreate: actionsToFiles.current.toUpload,
|
|
595
|
+
agentId: successCreate.id.toString()
|
|
596
|
+
})];
|
|
597
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
598
|
+
promises.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
|
|
599
|
+
}
|
|
600
|
+
if (modalValues.general.is_favorite) {
|
|
601
|
+
var agentWithFavorite = _objectSpread(_objectSpread({}, successCreate), {}, {
|
|
602
|
+
is_favorite: true
|
|
603
|
+
});
|
|
604
|
+
addAgent(agentWithFavorite);
|
|
605
|
+
// Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
|
|
606
|
+
// Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
|
|
607
|
+
var agentForToggle = _objectSpread(_objectSpread({}, agentWithFavorite), {}, {
|
|
608
|
+
is_favorite: false
|
|
609
|
+
});
|
|
610
|
+
promises.push(new Promise(function (resolve, reject) {
|
|
611
|
+
handleToggleFavoriteForAgent(successCreate.id.toString(), agentForToggle, function () {
|
|
612
|
+
return resolve();
|
|
613
|
+
}, function () {
|
|
614
|
+
return reject();
|
|
615
|
+
});
|
|
616
|
+
}));
|
|
617
|
+
} else {
|
|
618
|
+
addAgent(successCreate);
|
|
619
|
+
}
|
|
620
|
+
Promise.all(promises);
|
|
621
|
+
hasPendingFilesRef.current = true;
|
|
622
|
+
setIsShowProcessFiles(true);
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
if (actionsToFiles.current.toDelete.length) {
|
|
626
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
627
|
+
accessUpdateContext.current = {
|
|
628
|
+
isFromCreation: true,
|
|
629
|
+
isFromEditing: false,
|
|
630
|
+
hasActionFiles: true,
|
|
631
|
+
operationType: 'create',
|
|
632
|
+
hasBeenCalled: false
|
|
633
|
+
};
|
|
634
|
+
} else {
|
|
635
|
+
// Si no hay accesibilidad pero hay archivos, establecer el contexto para creación
|
|
636
|
+
accessUpdateContext.current = {
|
|
637
|
+
isFromCreation: true,
|
|
638
|
+
isFromEditing: false,
|
|
639
|
+
hasActionFiles: false,
|
|
640
|
+
operationType: 'create',
|
|
641
|
+
hasBeenCalled: false
|
|
642
|
+
};
|
|
643
|
+
}
|
|
644
|
+
var _promises = [handleDeleteKnowledges({
|
|
645
|
+
files: actionsToFiles.current.toDelete,
|
|
646
|
+
agentId: successCreate.id.toString()
|
|
647
|
+
})];
|
|
648
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
649
|
+
_promises.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
|
|
650
|
+
}
|
|
651
|
+
if (modalValues.general.is_favorite) {
|
|
652
|
+
var _agentWithFavorite = _objectSpread(_objectSpread({}, successCreate), {}, {
|
|
653
|
+
is_favorite: true
|
|
654
|
+
});
|
|
655
|
+
addAgent(_agentWithFavorite);
|
|
656
|
+
// Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
|
|
657
|
+
// Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
|
|
658
|
+
var _agentForToggle = _objectSpread(_objectSpread({}, _agentWithFavorite), {}, {
|
|
659
|
+
is_favorite: false
|
|
660
|
+
});
|
|
661
|
+
_promises.push(new Promise(function (resolve, reject) {
|
|
662
|
+
handleToggleFavoriteForAgent(successCreate.id.toString(), _agentForToggle, function () {
|
|
663
|
+
return resolve();
|
|
664
|
+
}, function () {
|
|
665
|
+
return reject();
|
|
666
|
+
});
|
|
667
|
+
}));
|
|
668
|
+
} else {
|
|
669
|
+
addAgent(successCreate);
|
|
670
|
+
}
|
|
671
|
+
Promise.all(_promises);
|
|
672
|
+
handleDeleteKnowledges({
|
|
673
|
+
files: actionsToFiles.current.toDelete,
|
|
674
|
+
agentId: successCreate.id.toString()
|
|
675
|
+
});
|
|
676
|
+
hasPendingFilesRef.current = true;
|
|
677
|
+
setIsShowProcessFiles(true);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (actionsToFiles.current.toUpload.length) {
|
|
681
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
682
|
+
accessUpdateContext.current = {
|
|
683
|
+
isFromCreation: true,
|
|
684
|
+
isFromEditing: false,
|
|
685
|
+
hasActionFiles: true,
|
|
686
|
+
operationType: 'create',
|
|
687
|
+
hasBeenCalled: false
|
|
688
|
+
};
|
|
689
|
+
} else {
|
|
690
|
+
// Si no hay accesibilidad pero hay archivos, establecer el contexto para creación
|
|
691
|
+
accessUpdateContext.current = {
|
|
692
|
+
isFromCreation: true,
|
|
693
|
+
isFromEditing: false,
|
|
694
|
+
hasActionFiles: false,
|
|
695
|
+
operationType: 'create',
|
|
696
|
+
hasBeenCalled: false
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
var _promises2 = [handleCreateKnowledges({
|
|
700
|
+
files: actionsToFiles.current.toUpload,
|
|
701
|
+
agentId: successCreate.id.toString()
|
|
702
|
+
})];
|
|
703
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
704
|
+
_promises2.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
|
|
705
|
+
}
|
|
706
|
+
if (modalValues.general.is_favorite) {
|
|
707
|
+
var _agentWithFavorite2 = _objectSpread(_objectSpread({}, successCreate), {}, {
|
|
708
|
+
is_favorite: true
|
|
709
|
+
});
|
|
710
|
+
addAgent(_agentWithFavorite2);
|
|
711
|
+
// Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
|
|
712
|
+
// Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
|
|
713
|
+
var _agentForToggle2 = _objectSpread(_objectSpread({}, _agentWithFavorite2), {}, {
|
|
714
|
+
is_favorite: false
|
|
715
|
+
});
|
|
716
|
+
_promises2.push(new Promise(function (resolve, reject) {
|
|
717
|
+
handleToggleFavoriteForAgent(successCreate.id.toString(), _agentForToggle2, function () {
|
|
718
|
+
return resolve();
|
|
719
|
+
}, function () {
|
|
720
|
+
return reject();
|
|
721
|
+
});
|
|
722
|
+
}));
|
|
723
|
+
} else {
|
|
724
|
+
addAgent(successCreate);
|
|
725
|
+
}
|
|
726
|
+
Promise.all(_promises2);
|
|
727
|
+
hasPendingFilesRef.current = true;
|
|
728
|
+
setIsShowProcessFiles(true);
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
if (modalValues.accessibility.accessType !== 'company') {
|
|
732
|
+
// Solo resetear el contexto si NO se ha llamado todavía
|
|
733
|
+
if (!accessUpdateContext.current.hasBeenCalled) {
|
|
734
|
+
var hasActionFiles = accessUpdateContext.current.hasActionFiles;
|
|
735
|
+
accessUpdateContext.current = {
|
|
736
|
+
isFromCreation: true,
|
|
737
|
+
isFromEditing: false,
|
|
738
|
+
hasActionFiles: hasActionFiles || false,
|
|
739
|
+
operationType: 'create',
|
|
740
|
+
hasBeenCalled: false
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
if (!accessUpdateContext.current.hasBeenCalled) {
|
|
744
|
+
handleAccessClient(successCreate.id.toString(), modalValues.accessibility);
|
|
745
|
+
accessUpdateContext.current.hasBeenCalled = true;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// Solo ejecutar handleAccessClient, el agente se agregará y el toggle se hará en successUpdateAccess
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// Handle favorite if it was marked during creation
|
|
753
|
+
if (modalValues.general.is_favorite) {
|
|
754
|
+
// Primero agregar el agente a la lista (addAgent ya ordena)
|
|
755
|
+
var _agentWithFavorite3 = _objectSpread(_objectSpread({}, successCreate), {}, {
|
|
756
|
+
is_favorite: true
|
|
757
|
+
});
|
|
758
|
+
addAgent(_agentWithFavorite3);
|
|
759
|
+
|
|
760
|
+
// Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
|
|
761
|
+
// Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
|
|
762
|
+
var _agentForToggle3 = _objectSpread(_objectSpread({}, _agentWithFavorite3), {}, {
|
|
763
|
+
is_favorite: false
|
|
764
|
+
});
|
|
765
|
+
// Luego hacer el toggle de favorito en el servidor y actualizar el estado
|
|
766
|
+
handleToggleFavoriteForAgent(successCreate.id.toString(), _agentForToggle3, function (updatedAgent) {
|
|
767
|
+
eventAmplitude(EVENTS.aiChatFavorite, {
|
|
768
|
+
option: updatedAgent.is_favorite ? 'add' : 'remove'
|
|
769
|
+
});
|
|
770
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
771
|
+
selectAgent(_objectSpread(_objectSpread({}, _agentWithFavorite3), {}, {
|
|
772
|
+
is_favorite: updatedAgent.is_favorite
|
|
773
|
+
}));
|
|
774
|
+
handleResetSuccessDelete();
|
|
775
|
+
resetSuccessCreate();
|
|
776
|
+
handleClose();
|
|
777
|
+
}, function () {
|
|
778
|
+
eventAmplitude(EVENTS.aiChatFavorite, {
|
|
779
|
+
option: 'add'
|
|
780
|
+
});
|
|
781
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
782
|
+
selectAgent(_agentWithFavorite3);
|
|
783
|
+
handleResetSuccessDelete();
|
|
784
|
+
resetSuccessCreate();
|
|
785
|
+
handleClose();
|
|
786
|
+
});
|
|
787
|
+
} else {
|
|
788
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
789
|
+
addAgent(successCreate);
|
|
790
|
+
selectAgent(successCreate);
|
|
791
|
+
handleResetSuccessDelete();
|
|
792
|
+
resetSuccessCreate();
|
|
793
|
+
handleClose();
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
}, [isLoadingCreate, successCreate, handleDeleteAndCreateKnowledges, handleDeleteKnowledges, handleCreateKnowledges, handleSnackbarSuccess, t, addAgent, selectAgent, handleResetSuccessDelete, resetSuccessCreate, handleClose, updateAgentFavorite]);
|
|
797
|
+
useEffect(function () {
|
|
798
|
+
if (successUpdate) {
|
|
799
|
+
if (actionsToFiles.current.toDelete.length && actionsToFiles.current.toUpload.length) {
|
|
800
|
+
if (hasAccessibilityChanged()) {
|
|
801
|
+
accessUpdateContext.current = {
|
|
802
|
+
isFromCreation: false,
|
|
803
|
+
isFromEditing: true,
|
|
804
|
+
hasActionFiles: true,
|
|
805
|
+
operationType: 'update',
|
|
806
|
+
hasBeenCalled: false
|
|
807
|
+
};
|
|
808
|
+
}
|
|
809
|
+
if (modalValues.general.id) {
|
|
810
|
+
var filesToDelete = _toConsumableArray(actionsToFiles.current.toDelete);
|
|
811
|
+
var filesToUpload = _toConsumableArray(actionsToFiles.current.toUpload);
|
|
812
|
+
actionsToFiles.current.toDelete = [];
|
|
813
|
+
actionsToFiles.current.toUpload = [];
|
|
814
|
+
Promise.all([handleDeleteAndCreateKnowledges({
|
|
815
|
+
filesToDelete: filesToDelete,
|
|
816
|
+
filesToCreate: filesToUpload,
|
|
817
|
+
agentId: modalValues.general.id.toString()
|
|
818
|
+
})].concat(_toConsumableArray(hasAccessibilityChanged() ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
|
|
819
|
+
}
|
|
820
|
+
hasPendingFilesRef.current = true;
|
|
821
|
+
setIsShowProcessFiles(true);
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
if (actionsToFiles.current.toDelete.length) {
|
|
825
|
+
if (hasAccessibilityChanged()) {
|
|
826
|
+
accessUpdateContext.current = {
|
|
827
|
+
isFromCreation: false,
|
|
828
|
+
isFromEditing: true,
|
|
829
|
+
hasActionFiles: true,
|
|
830
|
+
operationType: 'update',
|
|
831
|
+
hasBeenCalled: false
|
|
832
|
+
};
|
|
833
|
+
}
|
|
834
|
+
if (modalValues.general.id) {
|
|
835
|
+
var _filesToDelete = _toConsumableArray(actionsToFiles.current.toDelete);
|
|
836
|
+
actionsToFiles.current.toDelete = [];
|
|
837
|
+
Promise.all([handleDeleteKnowledges({
|
|
838
|
+
files: _filesToDelete,
|
|
839
|
+
agentId: modalValues.general.id.toString()
|
|
840
|
+
})].concat(_toConsumableArray(hasAccessibilityChanged() ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
|
|
841
|
+
}
|
|
842
|
+
return;
|
|
843
|
+
}
|
|
844
|
+
if (actionsToFiles.current.toUpload.length) {
|
|
845
|
+
if (hasAccessibilityChanged()) {
|
|
846
|
+
accessUpdateContext.current = {
|
|
847
|
+
isFromCreation: false,
|
|
848
|
+
isFromEditing: true,
|
|
849
|
+
hasActionFiles: true,
|
|
850
|
+
operationType: 'update',
|
|
851
|
+
hasBeenCalled: false
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
if (modalValues.general.id) {
|
|
855
|
+
var _filesToUpload = _toConsumableArray(actionsToFiles.current.toUpload);
|
|
856
|
+
actionsToFiles.current.toUpload = [];
|
|
857
|
+
Promise.all([handleCreateKnowledges({
|
|
858
|
+
files: _filesToUpload,
|
|
859
|
+
agentId: modalValues.general.id.toString()
|
|
860
|
+
})].concat(_toConsumableArray(hasAccessibilityChanged() ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
|
|
861
|
+
}
|
|
862
|
+
hasPendingFilesRef.current = true;
|
|
863
|
+
setIsShowProcessFiles(true);
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
if (hasAccessibilityChanged()) {
|
|
867
|
+
// Solo resetear el contexto si NO se ha llamado todavía y NO hay archivos pendientes
|
|
868
|
+
if (!accessUpdateContext.current.hasBeenCalled && !accessUpdateContext.current.hasActionFiles) {
|
|
869
|
+
accessUpdateContext.current = {
|
|
870
|
+
isFromCreation: false,
|
|
871
|
+
isFromEditing: true,
|
|
872
|
+
hasActionFiles: false,
|
|
873
|
+
operationType: 'update',
|
|
874
|
+
hasBeenCalled: false
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
if (modalValues.general.id) {
|
|
878
|
+
// Llamar a handleAccessClient solo una vez
|
|
879
|
+
if (!accessUpdateContext.current.hasBeenCalled) {
|
|
880
|
+
handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility);
|
|
881
|
+
accessUpdateContext.current.hasBeenCalled = true;
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
return;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
// Solo cerrar si no hay archivos siendo procesados ni access pendiente
|
|
888
|
+
if (!hasPendingFilesRef.current && !isShowProcessFiles && !actionsToFiles.current.toUpload.length && !accessUpdateContext.current.hasActionFiles && !successUpdateAccess && !processFilesTimedOutRef.current) {
|
|
889
|
+
handleSnackbarSuccess(t('confirmAgentUpdated'));
|
|
890
|
+
updateAgent(successUpdate);
|
|
891
|
+
if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === successUpdate.id) {
|
|
892
|
+
selectAgent(successUpdate);
|
|
893
|
+
}
|
|
894
|
+
handleResetSuccessDelete();
|
|
895
|
+
resetSuccessUpdate();
|
|
896
|
+
document.dispatchEvent(new CustomEvent('refetch-session'));
|
|
897
|
+
handleClose();
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
}, [successUpdate, modalValues.general.id, handleDeleteAndCreateKnowledges, handleDeleteKnowledges, handleCreateKnowledges, handleSnackbarSuccess, t, updateAgent, handleResetSuccessDelete, resetSuccessUpdate, handleClose]);
|
|
901
|
+
var handleProcessFilesTimeout = useCallback(function () {
|
|
902
|
+
if (!hasPendingFilesRef.current && !isShowProcessFiles) return;
|
|
903
|
+
|
|
904
|
+
// Al cumplirse el timeout asumimos que el guardado del agente fue exitoso
|
|
905
|
+
// (el server respondió OK) y que los archivos se enviaron correctamente.
|
|
906
|
+
// Solo perdimos la confirmación asincrónica del WebSocket sobre su
|
|
907
|
+
// procesamiento. Cerramos todo mostrando el snackbar de éxito que hubiese
|
|
908
|
+
// disparado el flujo normal de éxito.
|
|
909
|
+
|
|
910
|
+
// Freno para que los useEffect de post-guardado no re-disparen snackbars
|
|
911
|
+
// o cierres duplicados cuando setIsShowProcessFiles(false) los gatille.
|
|
912
|
+
processFilesTimedOutRef.current = true;
|
|
913
|
+
if (modalValues.isEditing && successUpdate) {
|
|
914
|
+
updateAgent(successUpdate);
|
|
915
|
+
if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === successUpdate.id) {
|
|
916
|
+
selectAgent(successUpdate);
|
|
917
|
+
}
|
|
918
|
+
document.dispatchEvent(new CustomEvent('refetch-session'));
|
|
919
|
+
handleSnackbarSuccess(t('confirmAgentUpdated'));
|
|
920
|
+
resetSuccessUpdate();
|
|
921
|
+
} else if (!modalValues.isEditing && successCreate) {
|
|
922
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
923
|
+
resetSuccessCreate();
|
|
924
|
+
}
|
|
925
|
+
handleResetSuccessSave();
|
|
926
|
+
handleResetSuccessDelete();
|
|
927
|
+
resetSuccessUpdateAccess();
|
|
928
|
+
handleClose();
|
|
929
|
+
}, [isShowProcessFiles, modalValues.isEditing, successUpdate, successCreate, updateAgent, currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id, selectAgent, handleSnackbarSuccess, t, resetSuccessUpdate, resetSuccessCreate, handleResetSuccessSave, handleResetSuccessDelete, resetSuccessUpdateAccess, handleClose]);
|
|
930
|
+
var webSocketFunction = function webSocketFunction(_ref4) {
|
|
931
|
+
var modelData = _ref4.model_data;
|
|
932
|
+
var fileStatus = modelData;
|
|
933
|
+
if (fileStatus.status === 'done' || fileStatus.status === 'failed') {
|
|
934
|
+
setModalValues(function (prev) {
|
|
935
|
+
var updatedKnowledge = prev.knowledge.map(function (file) {
|
|
936
|
+
if (file.name === fileStatus.filename) {
|
|
937
|
+
return _objectSpread(_objectSpread({}, file), {}, {
|
|
938
|
+
status: fileStatus.status,
|
|
939
|
+
id: fileStatus.knowledge_base_id || file.id
|
|
940
|
+
});
|
|
941
|
+
}
|
|
942
|
+
return file;
|
|
943
|
+
});
|
|
944
|
+
var hasPendingFiles = updatedKnowledge.some(function (file) {
|
|
945
|
+
return file.status === 'pending';
|
|
946
|
+
});
|
|
947
|
+
var hasErrorFiles = updatedKnowledge.some(function (file) {
|
|
948
|
+
return file.status === 'failed';
|
|
949
|
+
});
|
|
950
|
+
if (hasErrorFiles && !hasPendingFiles) {
|
|
951
|
+
hasPendingFilesRef.current = false;
|
|
952
|
+
setIsShowProcessFiles(false);
|
|
953
|
+
handleSnackbarError(modalValues.isEditing ? t('confirmAgentUpdatedWithFilesError') : t('confirmAgentWithFilesError'));
|
|
954
|
+
} else if (!hasPendingFiles && !hasErrorFiles) {
|
|
955
|
+
hasPendingFilesRef.current = false;
|
|
956
|
+
setIsShowProcessFiles(false);
|
|
957
|
+
|
|
958
|
+
// Si había access pendiente y ya estaba manejado, forzar que el useEffect de access se ejecute de nuevo
|
|
959
|
+
if (accessUpdateContext.current.hasActionFiles && accessHandledRef.current) {
|
|
960
|
+
setFilesProcessed(function (prevCount) {
|
|
961
|
+
return prevCount + 1;
|
|
962
|
+
});
|
|
963
|
+
} else if (accessUpdateContext.current.operationType === 'create' && !accessUpdateContext.current.hasActionFiles && !filesFinishedRef.current) {
|
|
964
|
+
// Si es creación sin accesibilidad, marcar que los archivos terminaron
|
|
965
|
+
filesFinishedRef.current = true;
|
|
966
|
+
setFilesProcessed(function (prevCount) {
|
|
967
|
+
return prevCount + 1;
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
972
|
+
knowledge: updatedKnowledge
|
|
973
|
+
});
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
};
|
|
977
|
+
useEffect(function () {
|
|
978
|
+
if (successKnowledgeDelete && !isLoadingKnowledge && !errorKnowledge) {
|
|
979
|
+
// Solo cerrar si NO hay archivos siendo procesados
|
|
980
|
+
if (hasPendingFilesRef.current || isShowProcessFiles || actionsToFiles.current.toUpload.length) {
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
// Si el loader se cerró por timeout, no mostrar snackbar de éxito ni cerrar
|
|
984
|
+
if (processFilesTimedOutRef.current) {
|
|
985
|
+
return;
|
|
986
|
+
}
|
|
987
|
+
handleSnackbarSuccess(t('confirmAgentUpdated'));
|
|
988
|
+
handleResetSuccessDelete();
|
|
989
|
+
handleClose();
|
|
990
|
+
}
|
|
991
|
+
if (errorKnowledge) {
|
|
992
|
+
handleSnackbarError(modalValues.isEditing ? t('confirmAgentUpdatedWithFilesError') : t('confirmAgentWithFilesError'));
|
|
993
|
+
handleResetSuccessDelete();
|
|
994
|
+
}
|
|
995
|
+
}, [successKnowledgeDelete, isLoadingKnowledge, errorKnowledge, isShowProcessFiles]);
|
|
996
|
+
useEffect(function () {
|
|
997
|
+
var context = accessUpdateContext.current;
|
|
998
|
+
|
|
999
|
+
// Si hay archivos siendo procesados, esperar a que terminen
|
|
1000
|
+
if (context.hasActionFiles && (hasPendingFilesRef.current || isShowProcessFiles)) {
|
|
1001
|
+
// Si successUpdateAccess está activo, marcar como manejado pero NO resetear hasta que terminen los archivos
|
|
1002
|
+
if (successUpdateAccess && !accessHandledRef.current) {
|
|
1003
|
+
accessHandledRef.current = true;
|
|
1004
|
+
}
|
|
1005
|
+
return;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
// Si ya fue manejado y no hay archivos pendientes, ejecutar el cierre
|
|
1009
|
+
if (accessHandledRef.current && context.hasActionFiles && context.operationType === 'create') {
|
|
1010
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
1011
|
+
resetSuccessCreate();
|
|
1012
|
+
if (successUpdateAccess) {
|
|
1013
|
+
resetSuccessUpdateAccess();
|
|
1014
|
+
}
|
|
1015
|
+
handleClose();
|
|
1016
|
+
accessUpdateContext.current = {
|
|
1017
|
+
isFromCreation: false,
|
|
1018
|
+
isFromEditing: false,
|
|
1019
|
+
hasActionFiles: false,
|
|
1020
|
+
operationType: null,
|
|
1021
|
+
hasBeenCalled: false
|
|
1022
|
+
};
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
if (!successUpdateAccess) {
|
|
1026
|
+
accessHandledRef.current = false;
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
if (accessHandledRef.current) {
|
|
1030
|
+
return;
|
|
1031
|
+
}
|
|
1032
|
+
accessHandledRef.current = true;
|
|
1033
|
+
resetSuccessUpdateAccess();
|
|
1034
|
+
if (context.operationType === 'create') {
|
|
1035
|
+
// Si hay archivos, el agente ya fue agregado y el toggle ya se hizo en successCreate
|
|
1036
|
+
// Solo necesitamos cerrar el modal
|
|
1037
|
+
if (context.hasActionFiles) {
|
|
1038
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
1039
|
+
resetSuccessCreate();
|
|
1040
|
+
handleClose();
|
|
1041
|
+
return;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
// Si el agente fue creado con favorito, necesitamos ordenar después de agregarlo
|
|
1045
|
+
var agentToAdd = modalValues.general.is_favorite ? _objectSpread(_objectSpread({}, successCreate), {}, {
|
|
1046
|
+
is_favorite: true
|
|
1047
|
+
}) : successCreate;
|
|
1048
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
1049
|
+
addAgent(agentToAdd);
|
|
1050
|
+
selectAgent(agentToAdd);
|
|
1051
|
+
|
|
1052
|
+
// Si tiene favorito, hacer toggle y actualizar estado antes de cerrar
|
|
1053
|
+
if (modalValues.general.is_favorite) {
|
|
1054
|
+
// Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
|
|
1055
|
+
// Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
|
|
1056
|
+
var agentForToggle = _objectSpread(_objectSpread({}, agentToAdd), {}, {
|
|
1057
|
+
is_favorite: false
|
|
1058
|
+
});
|
|
1059
|
+
handleToggleFavoriteForAgent(successCreate.id.toString(), agentForToggle, function () {
|
|
1060
|
+
// Cerrar después de que el toggle complete y actualice el estado
|
|
1061
|
+
resetSuccessCreate();
|
|
1062
|
+
handleClose();
|
|
1063
|
+
}, function () {
|
|
1064
|
+
resetSuccessCreate();
|
|
1065
|
+
handleClose();
|
|
1066
|
+
});
|
|
1067
|
+
} else {
|
|
1068
|
+
resetSuccessCreate();
|
|
1069
|
+
handleClose();
|
|
1070
|
+
}
|
|
1071
|
+
} else if (context.operationType === 'update') {
|
|
1072
|
+
handleSnackbarSuccess(t('confirmAgentUpdated'));
|
|
1073
|
+
updateAgent(successUpdate);
|
|
1074
|
+
if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === successUpdate.id) {
|
|
1075
|
+
selectAgent(successUpdate);
|
|
1076
|
+
}
|
|
1077
|
+
resetSuccessUpdate();
|
|
1078
|
+
document.dispatchEvent(new CustomEvent('refetch-session'));
|
|
1079
|
+
handleClose();
|
|
1080
|
+
}
|
|
1081
|
+
accessUpdateContext.current = {
|
|
1082
|
+
isFromCreation: false,
|
|
1083
|
+
isFromEditing: false,
|
|
1084
|
+
hasActionFiles: false,
|
|
1085
|
+
operationType: null,
|
|
1086
|
+
hasBeenCalled: false
|
|
1087
|
+
};
|
|
1088
|
+
}, [successUpdateAccess, filesProcessed]);
|
|
1089
|
+
|
|
1090
|
+
// useEffect para manejar el cierre del modal cuando terminan los archivos en creación sin accesibilidad
|
|
1091
|
+
useEffect(function () {
|
|
1092
|
+
var context = accessUpdateContext.current;
|
|
1093
|
+
|
|
1094
|
+
// Solo procesar si:
|
|
1095
|
+
// - Es una operación de creación
|
|
1096
|
+
// - No hay accesibilidad pendiente
|
|
1097
|
+
// - Los archivos terminaron de procesarse
|
|
1098
|
+
// - El agente fue creado exitosamente
|
|
1099
|
+
// - Aún no se ha cerrado el modal
|
|
1100
|
+
if (context.operationType === 'create' && !context.hasActionFiles && filesFinishedRef.current && successCreate && !hasPendingFilesRef.current && !isShowProcessFiles) {
|
|
1101
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
1102
|
+
resetSuccessCreate();
|
|
1103
|
+
handleClose();
|
|
1104
|
+
filesFinishedRef.current = false;
|
|
1105
|
+
accessUpdateContext.current = {
|
|
1106
|
+
isFromCreation: false,
|
|
1107
|
+
isFromEditing: false,
|
|
1108
|
+
hasActionFiles: false,
|
|
1109
|
+
operationType: null,
|
|
1110
|
+
hasBeenCalled: false
|
|
1111
|
+
};
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
// También manejar el caso cuando hay accesibilidad y archivos terminaron
|
|
1115
|
+
if (context.operationType === 'create' && context.hasActionFiles && accessHandledRef.current && successCreate && !hasPendingFilesRef.current && !isShowProcessFiles) {
|
|
1116
|
+
handleSnackbarSuccess(t('confirmAgentCreated'));
|
|
1117
|
+
resetSuccessCreate();
|
|
1118
|
+
if (successUpdateAccess) {
|
|
1119
|
+
resetSuccessUpdateAccess();
|
|
1120
|
+
}
|
|
1121
|
+
handleClose();
|
|
1122
|
+
accessUpdateContext.current = {
|
|
1123
|
+
isFromCreation: false,
|
|
1124
|
+
isFromEditing: false,
|
|
1125
|
+
hasActionFiles: false,
|
|
1126
|
+
operationType: null,
|
|
1127
|
+
hasBeenCalled: false
|
|
1128
|
+
};
|
|
1129
|
+
}
|
|
1130
|
+
}, [filesProcessed, successCreate, successUpdateAccess, isShowProcessFiles, handleSnackbarSuccess, t, resetSuccessCreate, resetSuccessUpdateAccess, handleClose]);
|
|
1131
|
+
useEffect(function () {
|
|
1132
|
+
if (isShowProcessFiles) {
|
|
1133
|
+
var _successCreate$id;
|
|
1134
|
+
var channel = "knowledge-base.status:".concat(agentById ? agentById === null || agentById === void 0 ? void 0 : agentById.id : successCreate === null || successCreate === void 0 || (_successCreate$id = successCreate.id) === null || _successCreate$id === void 0 ? void 0 : _successCreate$id.toString());
|
|
1135
|
+
if ($_sc) {
|
|
1136
|
+
if (isSubscribed) {
|
|
1137
|
+
var _$_sc;
|
|
1138
|
+
(_$_sc = $_sc) === null || _$_sc === void 0 || _$_sc.subscribeHandler(channel, webSocketFunction);
|
|
1139
|
+
} else {
|
|
1140
|
+
var _$_sc2, _$_sc3, _$_sc$channelType;
|
|
1141
|
+
var modelData = {
|
|
1142
|
+
model_hash: channel,
|
|
1143
|
+
action: (_$_sc2 = $_sc) === null || _$_sc2 === void 0 || (_$_sc2 = _$_sc2.actionType) === null || _$_sc2 === void 0 ? void 0 : _$_sc2.SUBSCRIBE
|
|
1144
|
+
};
|
|
1145
|
+
(_$_sc3 = $_sc) === null || _$_sc3 === void 0 || _$_sc3.updateConnectionModel(modelData, channel, user, user, (_$_sc$channelType = $_sc.channelType) === null || _$_sc$channelType === void 0 ? void 0 : _$_sc$channelType.MODEL_CHANNEL);
|
|
1146
|
+
setIsSubscribed(true);
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
}, [isShowProcessFiles, isSubscribed, $_sc, agentById, successCreate]);
|
|
1151
|
+
useEffect(function () {
|
|
1152
|
+
if (!isOpen || !agentModels.length) return;
|
|
1153
|
+
if (agentLoading && !prefetchedAgentByIdRef.current) return;
|
|
1154
|
+
var applyEditingAgent = function applyEditingAgent(source) {
|
|
1155
|
+
if (source.type !== 'custom' || !window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
|
|
1156
|
+
handleSnackbarError(t('errorAccessDenied'));
|
|
1157
|
+
setIsLoading(false);
|
|
1158
|
+
setTimeout(function () {
|
|
1159
|
+
handleClose();
|
|
1160
|
+
}, 3000);
|
|
1161
|
+
return false;
|
|
1162
|
+
}
|
|
1163
|
+
setModalValues(function (prev) {
|
|
1164
|
+
var agentValuesToSet = buildEditingModalValuesFromAgentDetail(source, agentModels, prev);
|
|
1165
|
+
firstValueAgent.current = agentValuesToSet;
|
|
1166
|
+
return agentValuesToSet;
|
|
1167
|
+
});
|
|
1168
|
+
setIsLoading(false);
|
|
1169
|
+
if (pendingInitialSectionRef.current) {
|
|
1170
|
+
setSection(pendingInitialSectionRef.current);
|
|
1171
|
+
pendingInitialSectionRef.current = null;
|
|
1172
|
+
}
|
|
1173
|
+
var agentId = source.id;
|
|
1174
|
+
if (agentId) {
|
|
1175
|
+
getAgentConnectors(agentId.toString()).then(function (connectors) {
|
|
1176
|
+
var connected = deriveConnectedConnectorSlugs(connectors);
|
|
1177
|
+
setModalValues(function (prev) {
|
|
1178
|
+
var next = _objectSpread(_objectSpread({}, prev), {}, {
|
|
1179
|
+
accessibility: _objectSpread(_objectSpread({}, prev.accessibility), {}, {
|
|
1180
|
+
selectedConnectors: connected
|
|
1181
|
+
})
|
|
1182
|
+
});
|
|
1183
|
+
firstValueAgent.current = _objectSpread(_objectSpread({}, firstValueAgent.current), {}, {
|
|
1184
|
+
accessibility: _objectSpread(_objectSpread({}, firstValueAgent.current.accessibility), {}, {
|
|
1185
|
+
selectedConnectors: connected
|
|
1186
|
+
})
|
|
1187
|
+
});
|
|
1188
|
+
return next;
|
|
1189
|
+
});
|
|
1190
|
+
})["catch"](function (error) {
|
|
1191
|
+
console.error('Error fetching agent connectors:', error);
|
|
1192
|
+
});
|
|
1193
|
+
}
|
|
1194
|
+
return true;
|
|
1195
|
+
};
|
|
1196
|
+
var prefetched = prefetchedAgentByIdRef.current;
|
|
1197
|
+
if (prefetched) {
|
|
1198
|
+
prefetchedAgentByIdRef.current = null;
|
|
1199
|
+
applyEditingAgent(prefetched);
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
if (agentById && !agentLoading && agentModels.length) {
|
|
1203
|
+
applyEditingAgent(agentById);
|
|
1204
|
+
return;
|
|
1205
|
+
}
|
|
1206
|
+
if (!isLoading && !agentLoading && !agentById && !modalValues.isEditing) {
|
|
1207
|
+
setModalValues(function (prev) {
|
|
1208
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
1209
|
+
general: _objectSpread(_objectSpread({}, prev.general), {}, {
|
|
1210
|
+
aiModel: agentModels[0]
|
|
1211
|
+
})
|
|
1212
|
+
});
|
|
1213
|
+
});
|
|
1214
|
+
}
|
|
1215
|
+
}, [agentById, isOpen, isLoading, agentLoading, agentModels === null || agentModels === void 0 ? void 0 : agentModels.length, modalValues.isEditing, t]);
|
|
1216
|
+
useEffect(function () {
|
|
1217
|
+
if (errorGetAgentById) {
|
|
1218
|
+
if (errorGetAgentById === "Access denied: You don't have permission to access this agent") {
|
|
1219
|
+
handleSnackbarError(t('errorAccessDenied'));
|
|
1220
|
+
setTimeout(function () {
|
|
1221
|
+
handleClose();
|
|
1222
|
+
}, 3000);
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
handleSnackbarError(errorGetAgentById);
|
|
1226
|
+
setTimeout(function () {
|
|
1227
|
+
handleClose();
|
|
1228
|
+
}, 3000);
|
|
1229
|
+
}
|
|
1230
|
+
}, [errorGetAgentById]);
|
|
1231
|
+
var shouldDisableSaveForClients = useMemo(function () {
|
|
1232
|
+
var _modalValues$accessib2;
|
|
1233
|
+
if (!(modalValues !== null && modalValues !== void 0 && (_modalValues$accessib2 = modalValues.accessibility) !== null && _modalValues$accessib2 !== void 0 && _modalValues$accessib2.clients) || modalValues.accessibility.clients.length === 0) {
|
|
1234
|
+
return false;
|
|
1235
|
+
}
|
|
1236
|
+
return modalValues.accessibility.clients.some(function (client) {
|
|
1237
|
+
return client.is_active === false || client.is_deleted === true;
|
|
1238
|
+
});
|
|
1239
|
+
}, [modalValues === null || modalValues === void 0 || (_modalValues$accessib3 = modalValues.accessibility) === null || _modalValues$accessib3 === void 0 ? void 0 : _modalValues$accessib3.clients]);
|
|
1240
|
+
var handleToggleFavorite = function handleToggleFavorite() {
|
|
1241
|
+
var _modalValues$general;
|
|
1242
|
+
if (modalValues !== null && modalValues !== void 0 && (_modalValues$general = modalValues.general) !== null && _modalValues$general !== void 0 && _modalValues$general.id) {
|
|
1243
|
+
var _modalValues$general2;
|
|
1244
|
+
// Existing agent
|
|
1245
|
+
toggleFavorite(modalValues.general.id, function (updatedAgent) {
|
|
1246
|
+
setModalValues(function (prev) {
|
|
1247
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
1248
|
+
general: _objectSpread(_objectSpread({}, prev.general), {}, {
|
|
1249
|
+
is_favorite: updatedAgent.is_favorite
|
|
1250
|
+
})
|
|
1251
|
+
});
|
|
1252
|
+
});
|
|
1253
|
+
// Actualizar el estado de agentes y ordenar cuando se hace desde el modal ABM
|
|
1254
|
+
updateAgentFavorite(updatedAgent, true);
|
|
1255
|
+
eventAmplitude(EVENTS.aiChatFavorite, {
|
|
1256
|
+
option: updatedAgent.is_favorite ? 'add' : 'remove'
|
|
1257
|
+
});
|
|
1258
|
+
}, undefined, modalValues === null || modalValues === void 0 || (_modalValues$general2 = modalValues.general) === null || _modalValues$general2 === void 0 ? void 0 : _modalValues$general2.is_favorite);
|
|
1259
|
+
} else {
|
|
1260
|
+
// Create new agent
|
|
1261
|
+
setModalValues(function (prev) {
|
|
1262
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
1263
|
+
general: _objectSpread(_objectSpread({}, prev.general), {}, {
|
|
1264
|
+
is_favorite: !prev.general.is_favorite
|
|
1265
|
+
})
|
|
1266
|
+
});
|
|
1267
|
+
});
|
|
1268
|
+
}
|
|
1269
|
+
};
|
|
1270
|
+
if (!isOpen || !(userPermissions !== null && userPermissions !== void 0 && userPermissions.create) && !(userPermissions !== null && userPermissions !== void 0 && userPermissions.edit) && !(userPermissions !== null && userPermissions !== void 0 && userPermissions["delete"])) return null;
|
|
1271
|
+
return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(Backdrop, {
|
|
1272
|
+
zIndex: abmAgentModalZIndex,
|
|
1273
|
+
onClick: handleBackdropClick,
|
|
1274
|
+
children: [/*#__PURE__*/_jsx(SCAAMWrapper, {
|
|
1275
|
+
ref: modalRef,
|
|
1276
|
+
tabIndex: -1,
|
|
1277
|
+
children: isLoading ? /*#__PURE__*/_jsx(SCAAMWrapperSpinner, {
|
|
1278
|
+
children: /*#__PURE__*/_jsx(SCAAMWrapperSpinnerContent, {
|
|
1279
|
+
children: /*#__PURE__*/_jsx(SpinnerLottie, {
|
|
1280
|
+
size: "80px",
|
|
1281
|
+
color: "primary"
|
|
1282
|
+
})
|
|
1283
|
+
})
|
|
1284
|
+
}) : /*#__PURE__*/_jsx(_Fragment, {
|
|
1285
|
+
children: isShowProcessFiles && hasPendingFilesRef.current ? /*#__PURE__*/_jsx(AbmLoaderFiles, {
|
|
1286
|
+
attachments: modalValues.knowledge,
|
|
1287
|
+
label: t("processingKnowledge.".concat(modalValues.isEditing ? 'descriptionUpdate' : 'descriptionCreate')),
|
|
1288
|
+
onTimeout: handleProcessFilesTimeout
|
|
1289
|
+
}) : /*#__PURE__*/_jsxs(_Fragment, {
|
|
1290
|
+
children: [/*#__PURE__*/_jsxs(SCAAMHeader, {
|
|
1291
|
+
children: [/*#__PURE__*/_jsxs(SCAAMHeaderLeft, {
|
|
1292
|
+
children: [/*#__PURE__*/_jsx(Tooltip, {
|
|
1293
|
+
zIndex: tooltipZIndex,
|
|
1294
|
+
title: modalValues !== null && modalValues !== void 0 && (_modalValues$general3 = modalValues.general) !== null && _modalValues$general3 !== void 0 && _modalValues$general3.is_favorite ? t('generalSection.removeFavorite') : t('generalSection.addFavorite'),
|
|
1295
|
+
children: /*#__PURE__*/_jsx(SCAAMHeaderFavorite, {
|
|
1296
|
+
onClick: handleToggleFavorite,
|
|
1297
|
+
children: /*#__PURE__*/_jsx(Star, {
|
|
1298
|
+
width: 20,
|
|
1299
|
+
height: 20,
|
|
1300
|
+
color: modalValues !== null && modalValues !== void 0 && (_modalValues$general4 = modalValues.general) !== null && _modalValues$general4 !== void 0 && _modalValues$general4.is_favorite ? '#FFC624' : '#a6a6a6',
|
|
1301
|
+
fill: modalValues !== null && modalValues !== void 0 && (_modalValues$general5 = modalValues.general) !== null && _modalValues$general5 !== void 0 && _modalValues$general5.is_favorite ? '#FFC624' : 'none',
|
|
1302
|
+
variant: "solid",
|
|
1303
|
+
className: modalValues !== null && modalValues !== void 0 && (_modalValues$general6 = modalValues.general) !== null && _modalValues$general6 !== void 0 && _modalValues$general6.is_favorite ? '' : 'star-favorite-icon'
|
|
1304
|
+
})
|
|
1305
|
+
})
|
|
1306
|
+
}), /*#__PURE__*/_jsx(SCAAMHeaderTitle, {
|
|
1307
|
+
children: modalValues !== null && modalValues !== void 0 && modalValues.isEditing ? t('editAgent') : t('newAgent')
|
|
1308
|
+
})]
|
|
1309
|
+
}), /*#__PURE__*/_jsx(SCAAMHeaderCloseButton, {
|
|
1310
|
+
onClick: function onClick() {
|
|
1311
|
+
eventAmplitude(EVENTS.cancelModal);
|
|
1312
|
+
handleClose();
|
|
1313
|
+
},
|
|
1314
|
+
disabled: isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess,
|
|
1315
|
+
children: /*#__PURE__*/_jsx(Cross, {
|
|
1316
|
+
color: "#a6a6a6",
|
|
1317
|
+
width: 20,
|
|
1318
|
+
height: 20
|
|
1319
|
+
})
|
|
1320
|
+
})]
|
|
1321
|
+
}), /*#__PURE__*/_jsxs(SCAAMContent, {
|
|
1322
|
+
hasScroll: section !== 'knowledge',
|
|
1323
|
+
children: [/*#__PURE__*/_jsxs(SCAAMSidebar, {
|
|
1324
|
+
children: [/*#__PURE__*/_jsxs(SCAAMSidebarItem, {
|
|
1325
|
+
isActive: section === 'general',
|
|
1326
|
+
$index: 0,
|
|
1327
|
+
onClick: function onClick() {
|
|
1328
|
+
return handleSectionChange('general');
|
|
1329
|
+
},
|
|
1330
|
+
id: "abm-agent-modal-general",
|
|
1331
|
+
children: [/*#__PURE__*/_jsx(Category, {
|
|
1332
|
+
color: "".concat(section === 'general' ? 'rgba(63, 63, 63, 1)' : 'rgba(166, 166, 166, 1)'),
|
|
1333
|
+
width: 18,
|
|
1334
|
+
height: 18
|
|
1335
|
+
}), /*#__PURE__*/_jsx(SCAAMSidebarItemTitle, {
|
|
1336
|
+
isActive: section === 'general',
|
|
1337
|
+
children: t('generalSection.title')
|
|
1338
|
+
})]
|
|
1339
|
+
}), /*#__PURE__*/_jsxs(SCAAMSidebarItem, {
|
|
1340
|
+
isActive: section === 'knowledge',
|
|
1341
|
+
$index: 1,
|
|
1342
|
+
onClick: function onClick() {
|
|
1343
|
+
return handleSectionChange('knowledge');
|
|
1344
|
+
},
|
|
1345
|
+
id: "abm-agent-modal-knowledge",
|
|
1346
|
+
children: [/*#__PURE__*/_jsx(BrainIcon, {
|
|
1347
|
+
color: "".concat(section === 'knowledge' ? 'rgba(63, 63, 63, 1)' : 'rgba(166, 166, 166, 1)'),
|
|
1348
|
+
width: 18,
|
|
1349
|
+
height: 18
|
|
1350
|
+
}), /*#__PURE__*/_jsx(SCAAMSidebarItemTitle, {
|
|
1351
|
+
isActive: section === 'knowledge',
|
|
1352
|
+
children: t('knowledgeSection.title')
|
|
1353
|
+
})]
|
|
1354
|
+
}), /*#__PURE__*/_jsxs(SCAAMSidebarItem, {
|
|
1355
|
+
isActive: section === 'accessibility',
|
|
1356
|
+
$index: 2,
|
|
1357
|
+
onClick: function onClick() {
|
|
1358
|
+
return handleSectionChange('accessibility');
|
|
1359
|
+
},
|
|
1360
|
+
id: "abm-agent-modal-accessibility",
|
|
1361
|
+
children: [/*#__PURE__*/_jsx(AccessibilityIcon, {
|
|
1362
|
+
color: "".concat(section === 'accessibility' ? 'rgba(63, 63, 63, 1)' : 'rgba(166, 166, 166, 1)'),
|
|
1363
|
+
width: 18,
|
|
1364
|
+
height: 18
|
|
1365
|
+
}), /*#__PURE__*/_jsx(SCAAMSidebarItemTitle, {
|
|
1366
|
+
isActive: section === 'accessibility',
|
|
1367
|
+
children: t('accessibilitySection.titleTab')
|
|
1368
|
+
}), shouldDisableSaveForClients && /*#__PURE__*/_jsx(Tooltip, {
|
|
1369
|
+
title: t('accessibilitySection.clientsError'),
|
|
1370
|
+
zIndex: tooltipZIndex,
|
|
1371
|
+
children: /*#__PURE__*/_jsx(SCAAMSidebarItemError, {
|
|
1372
|
+
children: /*#__PURE__*/_jsx(Alert, {
|
|
1373
|
+
color: "#C70505",
|
|
1374
|
+
width: "16px",
|
|
1375
|
+
height: "16px"
|
|
1376
|
+
})
|
|
1377
|
+
})
|
|
1378
|
+
})]
|
|
1379
|
+
})]
|
|
1380
|
+
}), SectionByKey[section]({
|
|
1381
|
+
values: modalValues,
|
|
1382
|
+
handleSetAgentValues: handleSetAgentValuesByKeys,
|
|
1383
|
+
agentModels: agentModels,
|
|
1384
|
+
loading: false,
|
|
1385
|
+
existingKnowledge: [],
|
|
1386
|
+
newKnowledge: [],
|
|
1387
|
+
onRemoveExistingKnowledge: function onRemoveExistingKnowledge() {},
|
|
1388
|
+
onRemoveNewKnowledge: function onRemoveNewKnowledge() {},
|
|
1389
|
+
onFileErrorChange: setHasFileErrors,
|
|
1390
|
+
tooltipZIndex: tooltipZIndex
|
|
1391
|
+
})]
|
|
1392
|
+
}), /*#__PURE__*/_jsxs(SCAAMFooter, {
|
|
1393
|
+
isEditing: !!(modalValues !== null && modalValues !== void 0 && modalValues.isEditing) && !!(userPermissions !== null && userPermissions !== void 0 && userPermissions["delete"]),
|
|
1394
|
+
children: [!!(modalValues !== null && modalValues !== void 0 && modalValues.isEditing) && !!(userPermissions !== null && userPermissions !== void 0 && userPermissions["delete"]) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS && /*#__PURE__*/_jsx(SCAAMDeleteButton, {
|
|
1395
|
+
children: /*#__PURE__*/_jsx(CUButton, {
|
|
1396
|
+
variant: "contained",
|
|
1397
|
+
size: "medium",
|
|
1398
|
+
childrenWithIcon: true,
|
|
1399
|
+
onClick: function onClick() {
|
|
1400
|
+
setShowModalDelete(true);
|
|
1401
|
+
},
|
|
1402
|
+
disabled: isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess,
|
|
1403
|
+
children: /*#__PURE__*/_jsxs(WrapperCenterIcon, {
|
|
1404
|
+
children: [/*#__PURE__*/_jsx(Trash, {
|
|
1405
|
+
color: "#08c",
|
|
1406
|
+
width: 18,
|
|
1407
|
+
height: 18
|
|
1408
|
+
}), t('deleteAgent')]
|
|
1409
|
+
})
|
|
1410
|
+
})
|
|
1411
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
1412
|
+
style: {
|
|
1413
|
+
display: 'flex',
|
|
1414
|
+
gap: '24px'
|
|
1415
|
+
},
|
|
1416
|
+
children: /*#__PURE__*/_jsx(SCAAMSaveButton, {
|
|
1417
|
+
isDisabled: !validateFieldValues(modalValues) || validateAgentValuesIsSame() || isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess || shouldDisableSaveForClients || hasFileErrors,
|
|
1418
|
+
children: /*#__PURE__*/_jsx(CUButton, {
|
|
1419
|
+
variant: "contained",
|
|
1420
|
+
size: "medium",
|
|
1421
|
+
onClick: function onClick() {
|
|
1422
|
+
_handleConfirmAction(null, 'create');
|
|
1423
|
+
},
|
|
1424
|
+
disabled: !validateFieldValues(modalValues) || validateAgentValuesIsSame() || isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess || shouldDisableSaveForClients || hasFileErrors,
|
|
1425
|
+
children: modalValues.isEditing ? t('saveChanges') : t('createAgentLabelButton')
|
|
1426
|
+
})
|
|
1427
|
+
})
|
|
1428
|
+
})]
|
|
1429
|
+
})]
|
|
1430
|
+
})
|
|
1431
|
+
})
|
|
1432
|
+
}), showModalDelete && /*#__PURE__*/_jsx(DeleteQuestionModal, {
|
|
1433
|
+
onClose: function onClose() {
|
|
1434
|
+
return setShowModalDelete(false);
|
|
1435
|
+
},
|
|
1436
|
+
handlers: {
|
|
1437
|
+
handleConfirmAction: function handleConfirmAction(props) {
|
|
1438
|
+
return _handleConfirmAction(props, 'delete');
|
|
1439
|
+
}
|
|
1440
|
+
},
|
|
1441
|
+
chat: {
|
|
1442
|
+
title: modalValues.general.name,
|
|
1443
|
+
id: modalValues.general.id
|
|
1444
|
+
},
|
|
1445
|
+
action: "agent"
|
|
1446
|
+
})]
|
|
1447
|
+
}), selector);
|
|
1448
|
+
};
|
|
1449
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsImNyZWF0ZVBvcnRhbCIsInVzZVRyYW5zbGF0aW9uIiwiQ1VCdXR0b24iLCJDYXRlZ29yeSIsIkFsZXJ0IiwiVHJhc2giLCJTdGFyIiwiQ3Jvc3MiLCJTcGlubmVyTG90dGllIiwiVG9vbHRpcCIsIkFibUFjY2Vzc2liaWxpdHlTZWN0aW9uIiwiQmFja2Ryb3AiLCJ1c2VVc2VyIiwiQWNjZXNzaWJpbGl0eUljb24iLCJCcmFpbkljb24iLCJ1c2VBZ2VudE1vZGVsIiwidXNlR2V0QWdlbnRCeUlkIiwiQWJtR2VuZXJhbFNlY3Rpb24iLCJBYm1Lbm93bGVkZ2VTZWN0aW9uIiwiU0NBQU1Db250ZW50IiwiU0NBQU1Gb290ZXIiLCJTQ0FBTUhlYWRlciIsIlNDQUFNSGVhZGVyVGl0bGUiLCJTQ0FBTUhlYWRlckxlZnQiLCJTQ0FBTUhlYWRlckZhdm9yaXRlIiwiU0NBQU1IZWFkZXJDbG9zZUJ1dHRvbiIsIlNDQUFNU2lkZWJhciIsIlNDQUFNV3JhcHBlciIsIlNDQUFNU2lkZWJhckl0ZW0iLCJTQ0FBTVNpZGViYXJJdGVtVGl0bGUiLCJTQ0FBTURlbGV0ZUJ1dHRvbiIsIlNDQUFNU2F2ZUJ1dHRvbiIsIlNDQUFNV3JhcHBlclNwaW5uZXIiLCJTQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudCIsIlNDQUFNU2lkZWJhckl0ZW1FcnJvciIsInVzZUNyZWF0ZUFnZW50IiwidXNlRGVsZXRlQWdlbnQiLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJ1c2VHbG9iYWxDb250ZXh0IiwidXNlVXBkYXRlQWdlbnQiLCJ1c2VLbm93bGVkZ2VPcGVyYXRpb25zIiwiQWJtTG9hZGVyRmlsZXMiLCJXcmFwcGVyQ2VudGVySWNvbiIsIkVWRU5UUyIsInVzZUV2ZW50IiwiRGVsZXRlUXVlc3Rpb25Nb2RhbCIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJ1c2VBY2Nlc3NDbGllbnQiLCJ1c2VUb2dnbGVGYXZvcml0ZSIsImRlcml2ZUNvbm5lY3RlZENvbm5lY3RvclNsdWdzIiwiZGVyaXZlVGFza0FjY2Vzc0Zyb21Ub29sR3JvdXBTbHVncyIsImdldEFnZW50Q29ubmVjdG9ycyIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImluaXRpYWxWYWx1ZXMiLCJPYmplY3QiLCJmcmVlemUiLCJpc0VkaXRpbmciLCJrbm93bGVkZ2UiLCJnZW5lcmFsIiwibmFtZSIsImVtb2ppIiwiaW50cm9kdWN0aW9uIiwiaW5wdXRQbGFjZWhvbGRlciIsImlzQWN0aXZlIiwiYWlNb2RlbCIsImlkIiwidXNlclByb21wdCIsImtub3dsZWRnZUJhc2VzIiwiaXNfZmF2b3JpdGUiLCJhY2Nlc3NpYmlsaXR5IiwiYWNjZXNzVHlwZSIsImNsaWVudHMiLCJ0YXNrQWNjZXNzIiwic2VsZWN0ZWRDb25uZWN0b3JzIiwiU2VjdGlvbkJ5S2V5IiwicHJvcHMiLCJfb2JqZWN0U3ByZWFkIiwidmFsaWRhdGVGaWVsZFZhbHVlcyIsInZhbHVlVG9WYWxpZGF0ZSIsImJ1aWxkRWRpdGluZ01vZGFsVmFsdWVzRnJvbUFnZW50RGV0YWlsIiwiYWdlbnRCeUlkIiwiYWdlbnRNb2RlbHMiLCJwcmV2IiwiX2FnZW50QnlJZCRrbm93bGVkZ2VCIiwiX2FnZW50QnlJZCRjbGllbnRzIiwiYWdlbnRNb2RlbCIsImZpbmQiLCJtb2RlbCIsIm1vZGVsQWlJZCIsImNyZWF0ZWRfYnkiLCJjcmVhdGVkQnkiLCJtYXAiLCJrIiwiZmlsZSIsIkZpbGUiLCJmaWxlbmFtZSIsInRvU3RyaW5nIiwic2l6ZSIsImZpbGVfc2l6ZV9ieXRlcyIsInR5cGUiLCJvcmlnaW5hbF9maWxlX3R5cGUiLCJzdGF0dXMiLCJ1cmxfb3JpZ2luYWwiLCJ1bmRlZmluZWQiLCJ1cmxfdGh1bWJuYWlsIiwiYWNjZXNzIiwiY2xpZW50IiwiX2NsaWVudCRpZCIsIl9jbGllbnQkaXNfYWN0aXZlIiwiX2NsaWVudCRpc19kZWxldGVkIiwiaXNfYWN0aXZlIiwiaXNfZGVsZXRlZCIsInRvb2xHcm91cFNsdWdzIiwiQWJtQWdlbnRNb2RhbCIsIl9yZWYiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl9tb2RhbFZhbHVlcyRhY2Nlc3NpYjMiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDMiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDQiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDUiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDYiLCJhZGRBZ2VudCIsInVwZGF0ZUFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInVzZXIiLCJldmVudEFtcGxpdHVkZSIsIl91c2VUcmFuc2xhdGlvbiIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImN1cnJlbnRTZWxlY3RlZEFnZW50IiwiYWdlbnQiLCJzZWxlY3RBZ2VudCIsImFibUFnZW50TW9kYWxaSW5kZXgiLCJ0b29sdGlwWkluZGV4IiwiX3VzZVRvZ2dsZUZhdm9yaXRlIiwidG9nZ2xlRmF2b3JpdGUiLCJzZWxlY3RvciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJpc1N1YnNjcmliZWQiLCJzZXRJc1N1YnNjcmliZWQiLCJtb2RhbFJlZiIsImhhc1BlbmRpbmdGaWxlc1JlZiIsImFjdGlvbnNUb0ZpbGVzIiwidG9EZWxldGUiLCJ0b1VwbG9hZCIsImFjY2Vzc1VwZGF0ZUNvbnRleHQiLCJpc0Zyb21DcmVhdGlvbiIsImlzRnJvbUVkaXRpbmciLCJoYXNBY3Rpb25GaWxlcyIsIm9wZXJhdGlvblR5cGUiLCJoYXNCZWVuQ2FsbGVkIiwiYWNjZXNzSGFuZGxlZFJlZiIsImFnZW50Q3JlYXRlZFJlZiIsInBlbmRpbmdJbml0aWFsU2VjdGlvblJlZiIsInByZWZldGNoZWRBZ2VudEJ5SWRSZWYiLCJmaWxlc0ZpbmlzaGVkUmVmIiwicHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImZpbGVzUHJvY2Vzc2VkIiwic2V0RmlsZXNQcm9jZXNzZWQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzT3BlbiIsInNldElzT3BlbiIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4Iiwic2hvd01vZGFsRGVsZXRlIiwic2V0U2hvd01vZGFsRGVsZXRlIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJzZWN0aW9uIiwic2V0U2VjdGlvbiIsIl91c2VTdGF0ZTEiLCJfdXNlU3RhdGUxMCIsImlzTG9hZGluZyIsInNldElzTG9hZGluZyIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJtb2RhbFZhbHVlcyIsInNldE1vZGFsVmFsdWVzIiwiX3VzZUdldEFnZW50QnlJZCIsImFnZW50TG9hZGluZyIsImxvYWRpbmciLCJoYW5kbGVHZXRBZ2VudEJ5SWQiLCJoYW5kbGVDbGVhbkFnZW50IiwiZXJyb3JHZXRBZ2VudEJ5SWQiLCJlcnJvciIsIl91c2VBZ2VudE1vZGVsIiwiZ2V0QWxsQWdlbnRNb2RlbHMiLCJmaXJzdFZhbHVlQWdlbnQiLCJfdXNlU3RhdGUxMyIsIl91c2VTdGF0ZTE0IiwiaXNTaG93UHJvY2Vzc0ZpbGVzIiwic2V0SXNTaG93UHJvY2Vzc0ZpbGVzIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImhhc0ZpbGVFcnJvcnMiLCJzZXRIYXNGaWxlRXJyb3JzIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJfdXNlRGVsZXRlQWdlbnQiLCJoYW5kbGVEZWxldGVBZ2VudCIsInN1Y2Nlc3NEZWxldGUiLCJzdWNjZXNzIiwicmVzZXRTdWNjZXNzIiwiX3VzZVVwZGF0ZUFnZW50IiwiaGFuZGxlVXBkYXRlQWdlbnQiLCJzdWNjZXNzVXBkYXRlIiwicmVzZXRTdWNjZXNzVXBkYXRlIiwiX3VzZUNyZWF0ZUFnZW50IiwiaGFuZGxlQ3JlYXRlQWdlbnQiLCJpc0xvYWRpbmdDcmVhdGUiLCJzdWNjZXNzQ3JlYXRlIiwicmVzZXRTdWNjZXNzQ3JlYXRlIiwiX3VzZVNuYWNrQmFyTWFuYWdlciIsImhhbmRsZVNuYWNrYmFyU3VjY2VzcyIsImhhbmRsZVNuYWNrYmFyRXJyb3IiLCJfdXNlS25vd2xlZGdlT3BlcmF0aW8iLCJoYW5kbGVDcmVhdGVLbm93bGVkZ2VzIiwiaGFuZGxlRGVsZXRlS25vd2xlZGdlcyIsImhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMiLCJpc0xvYWRpbmdLbm93bGVkZ2UiLCJlcnJvcktub3dsZWRnZSIsInN1Y2Nlc3NLbm93bGVkZ2VEZWxldGUiLCJoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlIiwiaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlIiwiX3VzZUFjY2Vzc0NsaWVudCIsImhhbmRsZUFjY2Vzc0NsaWVudCIsInN1Y2Nlc3NVcGRhdGVBY2Nlc3MiLCJpc0xvYWRpbmdVcGRhdGVBY2Nlc3MiLCJyZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MiLCJoYW5kbGVSZXNldFN1Y2Nlc3MiLCJhcmVDbGllbnRzQXJyYXlzRXF1YWwiLCJjbGllbnRzMSIsImNsaWVudHMyIiwibGVuZ3RoIiwiY2xpZW50czFJZHMiLCJjIiwiY2xpZW50SWQiLCJzb3J0IiwiY2xpZW50czJJZHMiLCJldmVyeSIsImluZGV4IiwiaGFzQWNjZXNzaWJpbGl0eUNoYW5nZWQiLCJfZmlyc3RWYWx1ZUFnZW50JGN1cnIiLCJfbW9kYWxWYWx1ZXMkYWNjZXNzaWIiLCJfZmlyc3RWYWx1ZUFnZW50JGN1cnIyIiwiY3VycmVudCIsImFjY2Vzc1R5cGVTYW1lIiwiY2xpZW50c1NhbWUiLCJ0YXNrQWNjZXNzU2FtZSIsImN1cnJlbnRDb25uZWN0b3JzIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwib3JpZ2luYWxDb25uZWN0b3JzIiwiY29ubmVjdG9yc1NhbWUiLCJzbHVnIiwidmFsaWRhdGVBZ2VudFZhbHVlc0lzU2FtZSIsIl9maXJzdFZhbHVlQWdlbnQkY3VycjMiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbCQiLCJfZmlyc3RWYWx1ZUFnZW50JGN1cnI0IiwiX21vZGFsVmFsdWVzJGtub3dsZWRnIiwiX2ZpcnN0VmFsdWVBZ2VudCRjdXJyNSIsIl9tb2RhbFZhbHVlcyRrbm93bGVkZzIiLCJfZmlyc3RWYWx1ZUFnZW50JGN1cnI2IiwiX2FjdGlvbnNUb0ZpbGVzJGN1cnJlIiwiX2FjdGlvbnNUb0ZpbGVzJGN1cnJlMiIsInRvVXBkYXRlIiwiaGFzQW55VmFsdWVGb3JDcmVhdGlvbiIsIl9tb2RhbFZhbHVlcyRnZW5lcmFsJDIiLCJfYWdlbnRNb2RlbHMkIiwiX21vZGFsVmFsdWVzJGdlbmVyYWwkMyIsImlzRGVmYXVsdEFpTW9kZWwiLCJkZWZhdWx0SW5wdXRQbGFjZWhvbGRlciIsImlzRGVmYXVsdElucHV0UGxhY2Vob2xkZXIiLCJkZWZhdWx0VXNlclByb21wdFBsYWNlaG9sZGVyIiwiaXNEZWZhdWx0VXNlclByb21wdCIsImhhc05hbWUiLCJ0cmltIiwiaGFzRW1vamkiLCJoYXNJbnRyb2R1Y3Rpb24iLCJoYXNJbnB1dFBsYWNlaG9sZGVyIiwiaGFzVXNlclByb21wdCIsImhhc0tub3dsZWRnZSIsImhhc0N1c3RvbUFpTW9kZWwiLCJoYXNBY2Nlc3NpYmlsaXR5IiwiaGFzQ2hhbmdlc0ZvckVkaXRpbmciLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImhhbmRsZVRvZ2dsZUZhdm9yaXRlRm9yQWdlbnQiLCJhZ2VudElkIiwib25TdWNjZXNzIiwib25FcnJvciIsInVwZGF0ZWRBZ2VudCIsImhhbmRsZUNsb3NlIiwiY29uZmlybU1lc3NhZ2UiLCJ3aW5kb3ciLCJjb25maXJtIiwiaGFuZGxlQmFja2Ryb3BDbGljayIsImV2ZW50IiwidGFyZ2V0IiwiY3VycmVudFRhcmdldCIsImhhbmRsZVNlY3Rpb25DaGFuZ2UiLCJuZXdTZWN0aW9uIiwidGFiU2VjdGlvbiIsIm9wdGlvbiIsImhhbmRsZVNldEFnZW50VmFsdWVzQnlLZXlzIiwiX3JlZjIiLCJrZXkiLCJ2YWx1ZSIsImRlbGV0ZUtub3dsZWRnZSIsIl9hY3Rpb25zVG9GaWxlcyRjdXJyZTMiLCJwdXNoIiwiYXBwbHkiLCJmaWxlc1ByZXZJZHMiLCJTZXQiLCJuZXdGaWxlcyIsImZpbHRlciIsImhhcyIsInZhbHVlSWRzIiwiY29uY2F0Iiwia25vd2xlZGdlRmlsZXMiLCJfZGVmaW5lUHJvcGVydHkiLCJoYW5kbGVDb25maXJtQWN0aW9uIiwiX3JlZjMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImNoYXQiLCJhY3Rpb24iLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsImFicnVwdCIsImNvbmZpcm1BY3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcmd1bWVudHMiLCJoYW5kbGVTZXRBZ2VudFZhbHVlcyIsIl9hZ2VudFZhbHVlcyR2YWx1ZXMiLCJfYWdlbnRWYWx1ZXMkdmFsdWVzMyIsImFnZW50VmFsdWVzIiwiZGV0YWlsIiwiaW5pdGlhbFNlY3Rpb24iLCJpbmNsdWRlcyIsInZhbHVlcyIsIl9hZ2VudFZhbHVlcyR2YWx1ZXMyIiwicHJlZmV0Y2hlZEFnZW50QnlJZCIsIm5leHRWYWx1ZXMiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9kb2N1bWVudCIsImJvZHkiLCJvcmlnaW5hbE92ZXJmbG93Iiwic3R5bGUiLCJvdmVyZmxvdyIsImhhbmRsZUJlZm9yZVVubG9hZCIsInByZXZlbnREZWZhdWx0IiwicmV0dXJuVmFsdWUiLCJwcm9taXNlcyIsImZpbGVzVG9EZWxldGUiLCJmaWxlc1RvQ3JlYXRlIiwiYWdlbnRXaXRoRmF2b3JpdGUiLCJhZ2VudEZvclRvZ2dsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiYWxsIiwiZmlsZXMiLCJhaUNoYXRGYXZvcml0ZSIsImZpbGVzVG9VcGxvYWQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJoYW5kbGVQcm9jZXNzRmlsZXNUaW1lb3V0Iiwid2ViU29ja2V0RnVuY3Rpb24iLCJfcmVmNCIsIm1vZGVsRGF0YSIsIm1vZGVsX2RhdGEiLCJmaWxlU3RhdHVzIiwidXBkYXRlZEtub3dsZWRnZSIsImtub3dsZWRnZV9iYXNlX2lkIiwiaGFzUGVuZGluZ0ZpbGVzIiwic29tZSIsImhhc0Vycm9yRmlsZXMiLCJwcmV2Q291bnQiLCJjb250ZXh0IiwiYWdlbnRUb0FkZCIsIl9zdWNjZXNzQ3JlYXRlJGlkIiwiY2hhbm5lbCIsIiRfc2MiLCJfJF9zYyIsInN1YnNjcmliZUhhbmRsZXIiLCJfJF9zYzIiLCJfJF9zYzMiLCJfJF9zYyRjaGFubmVsVHlwZSIsIm1vZGVsX2hhc2giLCJhY3Rpb25UeXBlIiwiU1VCU0NSSUJFIiwidXBkYXRlQ29ubmVjdGlvbk1vZGVsIiwiY2hhbm5lbFR5cGUiLCJNT0RFTF9DSEFOTkVMIiwiYXBwbHlFZGl0aW5nQWdlbnQiLCJzb3VyY2UiLCJzZXRUaW1lb3V0IiwiYWdlbnRWYWx1ZXNUb1NldCIsInRoZW4iLCJjb25uZWN0b3JzIiwiY29ubmVjdGVkIiwiY29uc29sZSIsInByZWZldGNoZWQiLCJzaG91bGREaXNhYmxlU2F2ZUZvckNsaWVudHMiLCJfbW9kYWxWYWx1ZXMkYWNjZXNzaWIyIiwiaGFuZGxlVG9nZ2xlRmF2b3JpdGUiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbCIsIl9tb2RhbFZhbHVlcyRnZW5lcmFsMiIsImNyZWF0ZSIsImVkaXQiLCJ6SW5kZXgiLCJvbkNsaWNrIiwiY2hpbGRyZW4iLCJyZWYiLCJ0YWJJbmRleCIsImNvbG9yIiwiYXR0YWNobWVudHMiLCJsYWJlbCIsIm9uVGltZW91dCIsInRpdGxlIiwid2lkdGgiLCJoZWlnaHQiLCJmaWxsIiwidmFyaWFudCIsImNsYXNzTmFtZSIsImNhbmNlbE1vZGFsIiwiZGlzYWJsZWQiLCJoYXNTY3JvbGwiLCIkaW5kZXgiLCJleGlzdGluZ0tub3dsZWRnZSIsIm5ld0tub3dsZWRnZSIsIm9uUmVtb3ZlRXhpc3RpbmdLbm93bGVkZ2UiLCJvblJlbW92ZU5ld0tub3dsZWRnZSIsIm9uRmlsZUVycm9yQ2hhbmdlIiwiY2hpbGRyZW5XaXRoSWNvbiIsImRpc3BsYXkiLCJnYXAiLCJpc0Rpc2FibGVkIiwib25DbG9zZSIsImhhbmRsZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0FibUFnZW50TW9kYWwvQWJtQWdlbnRNb2RhbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYWxlcnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1jeWNsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvanN4LW5vLXVzZWxlc3MtZnJhZ21lbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcblxuaW1wb3J0IHsgQ1VCdXR0b24gfSBmcm9tICdAcHJvamVjdGNvci9idXR0b24vbGliL2NvbXBvbmVudHMvQ1VCdXR0b24nXG5pbXBvcnQgeyBDYXRlZ29yeSB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0NhdGVnb3J5J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9BbGVydCdcbmltcG9ydCB7IFRyYXNoIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvVHJhc2gnXG5pbXBvcnQgeyBTdGFyIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvU3RhcidcbmltcG9ydCB7IENyb3NzIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQ3Jvc3MnXG5pbXBvcnQgeyBTcGlubmVyTG90dGllIH0gZnJvbSAnQHByb2plY3Rjb3IvY29yLWNvbW1vbnMvbGliL2NvbXBvbmVudHMvc3Bpbm5lci1sb3R0aWUnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5pbXBvcnQgeyBBYm1BY2Nlc3NpYmlsaXR5U2VjdGlvbiB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uJ1xuaW1wb3J0IHsgQmFja2Ryb3AgfSBmcm9tICcuLi8uLi9hdG9tcy9CYWNrZHJvcCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eUljb24sIEJyYWluSWNvbiB9IGZyb20gJy4uLy4uL2F0b21zL2ljb25zJ1xuaW1wb3J0IHsgdXNlQWdlbnRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlQWdlbnRNb2RlbCdcbmltcG9ydCB7IEFnZW50LCBBZ2VudE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VHZXRBZ2VudEJ5SWQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudEJ5SWQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBBYm1HZW5lcmFsU2VjdGlvbiwgQWJtS25vd2xlZGdlU2VjdGlvbiB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uJ1xuaW1wb3J0IHsgTW9kYWxWYWx1ZXMgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudE1vZGFsJ1xuaW1wb3J0IHtcbiAgU0NBQU1Db250ZW50LFxuICBTQ0FBTUZvb3RlcixcbiAgU0NBQU1IZWFkZXIsXG4gIFNDQUFNSGVhZGVyVGl0bGUsXG4gIFNDQUFNSGVhZGVyTGVmdCxcbiAgU0NBQU1IZWFkZXJGYXZvcml0ZSxcbiAgU0NBQU1IZWFkZXJDbG9zZUJ1dHRvbixcbiAgU0NBQU1TaWRlYmFyLFxuICBTQ0FBTVdyYXBwZXIsXG4gIFNDQUFNU2lkZWJhckl0ZW0sXG4gIFNDQUFNU2lkZWJhckl0ZW1UaXRsZSxcbiAgU0NBQU1EZWxldGVCdXR0b24sXG4gIFNDQUFNU2F2ZUJ1dHRvbixcbiAgU0NBQU1XcmFwcGVyU3Bpbm5lcixcbiAgU0NBQU1XcmFwcGVyU3Bpbm5lckNvbnRlbnQsXG4gIFNDQUFNU2lkZWJhckl0ZW1FcnJvcixcbn0gZnJvbSAnLi9BYm1BZ2VudE1vZGFsLnN0eWxlcydcbmltcG9ydCB7IHVzZUNyZWF0ZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQWdlbnRNb2RlbC91c2VDcmVhdGVBZ2VudCdcbmltcG9ydCB7IHVzZURlbGV0ZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQWdlbnRNb2RlbC91c2VEZWxldGVBZ2VudCdcbmltcG9ydCB7IHVzZVNuYWNrQmFyTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNuYWNrQmFyTWFuYWdlci91c2VTbmFja0Jhck1hbmFnZXInXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IHVzZVVwZGF0ZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQWdlbnRNb2RlbC91c2VVcGRhdGVBZ2VudCdcbmltcG9ydCB7IHVzZUtub3dsZWRnZU9wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VLbm93bGVkZ2UnXG5pbXBvcnQgeyBBYm1Mb2FkZXJGaWxlcyB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUxvYWRlckZpbGVzJ1xuaW1wb3J0IHsgV3JhcHBlckNlbnRlckljb24gfSBmcm9tICcuLi8uLi9hdG9tcy9XcmFwcGVyQ2VudGVySWNvbidcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IERlbGV0ZVF1ZXN0aW9uTW9kYWwgfSBmcm9tICcuLi9EZWxldGVRdWVzdGlvbk1vZGFsL0RlbGV0ZVF1ZXN0aW9uTW9kYWwnXG5pbXBvcnQgeyB1c2VNYWlhVGFza1BhbmVsWkluZGV4IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWFpYVRhc2tQYW5lbFpJbmRleCdcbmltcG9ydCB7IHVzZUFjY2Vzc0NsaWVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFjY2Vzc0NsaWVudC91c2VBY2Nlc3NDbGllbnQnXG5pbXBvcnQgeyB1c2VUb2dnbGVGYXZvcml0ZSB9IGZyb20gJy4uLy4uLy4uL2hvb2tzJ1xuaW1wb3J0IHsgZGVyaXZlQ29ubmVjdGVkQ29ubmVjdG9yU2x1Z3MsIGRlcml2ZVRhc2tBY2Nlc3NGcm9tVG9vbEdyb3VwU2x1Z3MgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ub3JtYWxpemVBZ2VudENvbm5lY3RvcnMnXG5pbXBvcnQgeyBnZXRBZ2VudENvbm5lY3RvcnMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9jb25uZWN0b3JzJ1xuXG5jb25zdCBpbml0aWFsVmFsdWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGlzRWRpdGluZzogZmFsc2UsXG4gIGtub3dsZWRnZTogW10sXG4gIGdlbmVyYWw6IHtcbiAgICBuYW1lOiAnJyxcbiAgICBlbW9qaTogJycsXG4gICAgaW50cm9kdWN0aW9uOiAnJyxcbiAgICBpbnB1dFBsYWNlaG9sZGVyOiAnJyxcbiAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgYWlNb2RlbDogbnVsbCxcbiAgICBpZDogbnVsbCxcbiAgICB1c2VyUHJvbXB0OiBudWxsLFxuICAgIGtub3dsZWRnZUJhc2VzOiBbXSxcbiAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gIH0sXG4gIGFjY2Vzc2liaWxpdHk6IHtcbiAgICBhY2Nlc3NUeXBlOiAnY29tcGFueScsXG4gICAgY2xpZW50czogbnVsbCxcbiAgICB0YXNrQWNjZXNzOiB0cnVlLFxuICAgIHNlbGVjdGVkQ29ubmVjdG9yczogW10sXG4gIH0sXG59KVxuXG50eXBlIEFibVNlY3Rpb24gPSAnZ2VuZXJhbCcgfCAna25vd2xlZGdlJyB8ICd0cmFpbmluZycgfCAndGVzdGluZycgfCAnYWNjZXNzaWJpbGl0eSdcblxuZXhwb3J0IGNvbnN0IFNlY3Rpb25CeUtleSA9IHtcbiAgZ2VuZXJhbDogKHByb3BzOiB7XG4gICAgdmFsdWVzOiBNb2RhbFZhbHVlc1xuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiAoe1xuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBkZWxldGVLbm93bGVkZ2UsXG4gICAgfToge1xuICAgICAga2V5OiBzdHJpbmdcbiAgICAgIHZhbHVlOiB1bmtub3duXG4gICAgICBkZWxldGVLbm93bGVkZ2U/OiBib29sZWFuXG4gICAgfSkgPT4gdm9pZFxuICAgIGFnZW50TW9kZWxzOiBBZ2VudE1vZGVsW11cbiAgICBsb2FkaW5nOiBib29sZWFuXG4gICAgdG9vbHRpcFpJbmRleD86IG51bWJlclxuICB9KSA9PiA8QWJtR2VuZXJhbFNlY3Rpb24gey4uLnByb3BzfSAvPixcbiAga25vd2xlZGdlOiAocHJvcHM6IHtcbiAgICB2YWx1ZXM6IE1vZGFsVmFsdWVzXG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6ICh7IGtleSwgdmFsdWUgfTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSkgPT4gdm9pZFxuICAgIGV4aXN0aW5nS25vd2xlZGdlOiBBdHRhY2htZW50RmlsZVtdXG4gICAgbmV3S25vd2xlZGdlOiBBdHRhY2htZW50RmlsZVtdXG4gICAgb25SZW1vdmVFeGlzdGluZ0tub3dsZWRnZTogKGZpbGVJZDogc3RyaW5nKSA9PiB2b2lkXG4gICAgb25SZW1vdmVOZXdLbm93bGVkZ2U6IChmaWxlSWQ6IHN0cmluZykgPT4gdm9pZFxuICAgIG9uRmlsZUVycm9yQ2hhbmdlOiAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB2b2lkXG4gICAgdG9vbHRpcFpJbmRleD86IG51bWJlclxuICB9KSA9PiA8QWJtS25vd2xlZGdlU2VjdGlvbiB7Li4ucHJvcHN9IC8+LFxuICBhY2Nlc3NpYmlsaXR5OiAocHJvcHM6IHtcbiAgICB2YWx1ZXM6IE1vZGFsVmFsdWVzXG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6ICh7IGtleSwgdmFsdWUgfTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSkgPT4gdm9pZFxuICB9KSA9PiA8QWJtQWNjZXNzaWJpbGl0eVNlY3Rpb24gey4uLnByb3BzfSAvPixcbn1cblxudHlwZSBBYm1BZ2VudE1vZGFsUHJvcHMgPSB7XG4gIGFkZEFnZW50OiAobmV3QWdlbnQ6IEFnZW50LCBvcHRpb25zPzogeyBuYXZpZ2F0ZUhvbWU/OiBib29sZWFuIH0pID0+IHZvaWRcbiAgcmVtb3ZlQWdlbnQ6IChhZ2VudElkOiBudW1iZXIgfCBzdHJpbmcpID0+IHZvaWRcbiAgdXBkYXRlQWdlbnQ6ICh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB2b2lkXG4gIHVwZGF0ZUFnZW50RmF2b3JpdGU6ICh1cGRhdGVkQWdlbnQ6IEFnZW50LCBzaG91bGRTb3J0PzogYm9vbGVhbikgPT4gdm9pZFxuICBzZWxlY3RGaXJzdEFnZW50OiAoYWdlbnRJZDogc3RyaW5nKSA9PiB2b2lkXG59XG5cbmNvbnN0IHZhbGlkYXRlRmllbGRWYWx1ZXMgPSAodmFsdWVUb1ZhbGlkYXRlOiBNb2RhbFZhbHVlcykgPT4ge1xuICBpZiAoIXZhbHVlVG9WYWxpZGF0ZS5nZW5lcmFsLm5hbWUgfHwgIXZhbHVlVG9WYWxpZGF0ZS5nZW5lcmFsLnVzZXJQcm9tcHQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKiogTWlzbWEgZXN0cnVjdHVyYSBxdWUgZWwgZWZlY3RvIHF1ZSBoaWRyYXRhIGRlc2RlIHVzZUdldEFnZW50QnlJZCAodG9kYXMgbGFzIHBlc3Rhw7FhcyBkZWwgQUJNKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkRWRpdGluZ01vZGFsVmFsdWVzRnJvbUFnZW50RGV0YWlsKFxuICBhZ2VudEJ5SWQ6IGFueSxcbiAgYWdlbnRNb2RlbHM6IEFnZW50TW9kZWxbXSxcbiAgcHJldjogTW9kYWxWYWx1ZXNcbik6IE1vZGFsVmFsdWVzIHtcbiAgY29uc3QgYWdlbnRNb2RlbCA9IGFnZW50TW9kZWxzLmZpbmQobW9kZWwgPT4gbW9kZWwuaWQgPT09IGFnZW50QnlJZC5tb2RlbEFpSWQpXG4gIHJldHVybiB7XG4gICAgLi4ucHJldixcbiAgICBpc0VkaXRpbmc6IHRydWUsXG4gICAgZ2VuZXJhbDoge1xuICAgICAgZW1vamk6IGFnZW50QnlJZC5lbW9qaSxcbiAgICAgIG5hbWU6IGFnZW50QnlJZC5uYW1lLFxuICAgICAgaW50cm9kdWN0aW9uOiBhZ2VudEJ5SWQuaW50cm9kdWN0aW9uLFxuICAgICAgaW5wdXRQbGFjZWhvbGRlcjogYWdlbnRCeUlkLmlucHV0UGxhY2Vob2xkZXIsXG4gICAgICBpc0FjdGl2ZTogYWdlbnRCeUlkLmlzQWN0aXZlLFxuICAgICAgYWlNb2RlbDogYWdlbnRNb2RlbCB8fCBudWxsLFxuICAgICAgaWQ6IGFnZW50QnlJZC5pZCxcbiAgICAgIHVzZXJQcm9tcHQ6IGFnZW50QnlJZC51c2VyUHJvbXB0LFxuICAgICAga25vd2xlZGdlQmFzZXM6IFtdLFxuICAgICAgaXNfZmF2b3JpdGU6IGFnZW50QnlJZC5pc19mYXZvcml0ZSxcbiAgICAgIGNyZWF0ZWRfYnk6IGFnZW50QnlJZC5jcmVhdGVkQnksXG4gICAgfSxcbiAgICBrbm93bGVkZ2U6XG4gICAgICBhZ2VudEJ5SWQua25vd2xlZGdlQmFzZXM/Lm1hcCgoazogYW55KSA9PiAoe1xuICAgICAgICBmaWxlOiBuZXcgRmlsZShbXSwgay5maWxlbmFtZSksXG4gICAgICAgIGlkOiBrLmlkLnRvU3RyaW5nKCksXG4gICAgICAgIG5hbWU6IGsuZmlsZW5hbWUsXG4gICAgICAgIHNpemU6IGsuZmlsZV9zaXplX2J5dGVzIHx8IDAsXG4gICAgICAgIHR5cGU6IGsub3JpZ2luYWxfZmlsZV90eXBlLFxuICAgICAgICBzdGF0dXM6IGsuc3RhdHVzLFxuICAgICAgICB1cmxfb3JpZ2luYWw6IGsudXJsX29yaWdpbmFsIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgdXJsX3RodW1ibmFpbDogay51cmxfdGh1bWJuYWlsIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pKSB8fCBbXSxcbiAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICBhY2Nlc3NUeXBlOiBhZ2VudEJ5SWQuYWNjZXNzLFxuICAgICAgY2xpZW50czpcbiAgICAgICAgYWdlbnRCeUlkLmNsaWVudHM/Lm1hcCgoY2xpZW50OiBhbnkpID0+ICh7XG4gICAgICAgICAgaWQ6IGNsaWVudC5pZD8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICBuYW1lOiBjbGllbnQubmFtZSxcbiAgICAgICAgICBpc19hY3RpdmU6IGNsaWVudC5pc19hY3RpdmUgPz8gZmFsc2UsXG4gICAgICAgICAgaXNfZGVsZXRlZDogY2xpZW50LmlzX2RlbGV0ZWQgPz8gZmFsc2UsXG4gICAgICAgIH0pKSB8fCBudWxsLFxuICAgICAgdGFza0FjY2VzczogZGVyaXZlVGFza0FjY2Vzc0Zyb21Ub29sR3JvdXBTbHVncyhhZ2VudEJ5SWQudG9vbEdyb3VwU2x1Z3MpLFxuICAgICAgc2VsZWN0ZWRDb25uZWN0b3JzOiBbXSxcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBYm1BZ2VudE1vZGFsID0gKHtcbiAgYWRkQWdlbnQsXG4gIHVwZGF0ZUFnZW50LFxuICByZW1vdmVBZ2VudCxcbiAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgc2VsZWN0Rmlyc3RBZ2VudCxcbn06IEFibUFnZW50TW9kYWxQcm9wcykgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IGV2ZW50QW1wbGl0dWRlID0gdXNlRXZlbnQoKVxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCdhYm1fYWdlbnRfc2VjdGlvbicpXG4gIC8vIGNvbnN0ICRfc2M6IGFueSA9IG51bGxcbiAgY29uc3QgeyBhZ2VudDogY3VycmVudFNlbGVjdGVkQWdlbnQsIHNlbGVjdEFnZW50IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgYWJtQWdlbnRNb2RhbFpJbmRleCA9IHVzZU1haWFUYXNrUGFuZWxaSW5kZXgoMTExMiwgJ2FnZW50TW9kYWwnKVxuICBjb25zdCB0b29sdGlwWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxNTAwLCAnbmVzdGVkTW9kYWwnKVxuICBjb25zdCB7IHRvZ2dsZUZhdm9yaXRlIH0gPSB1c2VUb2dnbGVGYXZvcml0ZSgpXG4gIGNvbnN0IHNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FibS1hZ2VudC1tb2RhbCcpXG4gIGNvbnN0IFtpc1N1YnNjcmliZWQsIHNldElzU3Vic2NyaWJlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgbW9kYWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGhhc1BlbmRpbmdGaWxlc1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgYWN0aW9uc1RvRmlsZXMgPSB1c2VSZWY8YW55Pih7XG4gICAgdG9EZWxldGU6IFtdLFxuICAgIHRvVXBsb2FkOiBbXSxcbiAgfSlcbiAgY29uc3QgYWNjZXNzVXBkYXRlQ29udGV4dCA9IHVzZVJlZjx7XG4gICAgaXNGcm9tQ3JlYXRpb246IGJvb2xlYW5cbiAgICBpc0Zyb21FZGl0aW5nOiBib29sZWFuXG4gICAgaGFzQWN0aW9uRmlsZXM6IGJvb2xlYW5cbiAgICBvcGVyYXRpb25UeXBlOiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgbnVsbFxuICAgIGhhc0JlZW5DYWxsZWQ/OiBib29sZWFuXG4gIH0+KHtcbiAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gIH0pXG4gIGNvbnN0IGFjY2Vzc0hhbmRsZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGFnZW50Q3JlYXRlZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYgPSB1c2VSZWY8QWJtU2VjdGlvbiB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHByZWZldGNoZWRBZ2VudEJ5SWRSZWYgPSB1c2VSZWY8YW55PihudWxsKVxuICBjb25zdCBmaWxlc0ZpbmlzaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuICAvLyBNYXJjYSBjdWFuZG8gY2VycmFtb3MgZWwgbG9hZGVyIHBvciBlbCB0aW1lb3V0IGRlIHNlZ3VyaWRhZCBkZSBhcmNoaXZvcy5cbiAgLy8gTWllbnRyYXMgZXN0w6kgYWN0aXZvLCBsb3MgdXNlRWZmZWN0IGRlIHBvc3QtZ3VhcmRhZG8gTk8gZGViZW4gZGlzcGFyYXJcbiAgLy8gc25hY2tiYXJzIGRlIMOpeGl0byBuaSBhdXRvLWNlcnJhciBlbCBtb2RhbC5cbiAgY29uc3QgcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IFtmaWxlc1Byb2Nlc3NlZCwgc2V0RmlsZXNQcm9jZXNzZWRdID0gdXNlU3RhdGUoMClcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2hvd01vZGFsRGVsZXRlLCBzZXRTaG93TW9kYWxEZWxldGVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZWN0aW9uLCBzZXRTZWN0aW9uXSA9IHVzZVN0YXRlPEFibVNlY3Rpb24+KCdnZW5lcmFsJylcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbW9kYWxWYWx1ZXMsIHNldE1vZGFsVmFsdWVzXSA9IHVzZVN0YXRlPHtcbiAgICBnZW5lcmFsOiBhbnlcbiAgICBrbm93bGVkZ2U6IGFueVxuICAgIGlzRWRpdGluZzogYm9vbGVhblxuICAgIGFjY2Vzc2liaWxpdHk6IGFueVxuICB9Pihpbml0aWFsVmFsdWVzKVxuICBjb25zdCB7XG4gICAgbG9hZGluZzogYWdlbnRMb2FkaW5nLFxuICAgIGhhbmRsZUdldEFnZW50QnlJZCxcbiAgICBhZ2VudDogYWdlbnRCeUlkLFxuICAgIGhhbmRsZUNsZWFuQWdlbnQsXG4gICAgZXJyb3I6IGVycm9yR2V0QWdlbnRCeUlkLFxuICB9ID0gdXNlR2V0QWdlbnRCeUlkKClcbiAgY29uc3QgeyBhZ2VudE1vZGVscywgZ2V0QWxsQWdlbnRNb2RlbHMgfSA9IHVzZUFnZW50TW9kZWwoKVxuICBjb25zdCBmaXJzdFZhbHVlQWdlbnQgPSB1c2VSZWY8YW55PihudWxsKVxuICBjb25zdCBbaXNTaG93UHJvY2Vzc0ZpbGVzLCBzZXRJc1Nob3dQcm9jZXNzRmlsZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtoYXNGaWxlRXJyb3JzLCBzZXRIYXNGaWxlRXJyb3JzXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHNcblxuICBjb25zdCB7IGhhbmRsZURlbGV0ZUFnZW50LCBzdWNjZXNzOiBzdWNjZXNzRGVsZXRlLCByZXNldFN1Y2Nlc3MgfSA9IHVzZURlbGV0ZUFnZW50KClcbiAgY29uc3QgeyBoYW5kbGVVcGRhdGVBZ2VudCwgc3VjY2Vzczogc3VjY2Vzc1VwZGF0ZSwgcmVzZXRTdWNjZXNzOiByZXNldFN1Y2Nlc3NVcGRhdGUgfSA9IHVzZVVwZGF0ZUFnZW50KClcblxuICBjb25zdCB7XG4gICAgaGFuZGxlQ3JlYXRlQWdlbnQsXG4gICAgaXNMb2FkaW5nOiBpc0xvYWRpbmdDcmVhdGUsXG4gICAgc3VjY2Vzczogc3VjY2Vzc0NyZWF0ZSxcbiAgICByZXNldFN1Y2Nlc3M6IHJlc2V0U3VjY2Vzc0NyZWF0ZSxcbiAgfSA9IHVzZUNyZWF0ZUFnZW50KClcblxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyU3VjY2VzcywgaGFuZGxlU25hY2tiYXJFcnJvciB9ID0gdXNlU25hY2tCYXJNYW5hZ2VyKClcblxuICBjb25zdCB7XG4gICAgaGFuZGxlQ3JlYXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMsXG4gICAgaXNMb2FkaW5nOiBpc0xvYWRpbmdLbm93bGVkZ2UsXG4gICAgZXJyb3I6IGVycm9yS25vd2xlZGdlLFxuICAgIHN1Y2Nlc3NEZWxldGU6IHN1Y2Nlc3NLbm93bGVkZ2VEZWxldGUsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSxcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUsXG4gIH0gPSB1c2VLbm93bGVkZ2VPcGVyYXRpb25zKClcblxuICBjb25zdCB7XG4gICAgaGFuZGxlQWNjZXNzQ2xpZW50LFxuICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaXNMb2FkaW5nOiBpc0xvYWRpbmdVcGRhdGVBY2Nlc3MsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzOiByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gIH0gPSB1c2VBY2Nlc3NDbGllbnQoKVxuXG4gIGlmICghc2VsZWN0b3IpIHJldHVybiBudWxsXG5cbiAgY29uc3QgYXJlQ2xpZW50c0FycmF5c0VxdWFsID0gKGNsaWVudHMxOiBhbnlbXSB8IG51bGwsIGNsaWVudHMyOiBhbnlbXSB8IG51bGwpID0+IHtcbiAgICBpZiAoIWNsaWVudHMxICYmICFjbGllbnRzMikgcmV0dXJuIHRydWVcbiAgICBpZiAoIWNsaWVudHMxIHx8ICFjbGllbnRzMikgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGNsaWVudHMxLmxlbmd0aCAhPT0gY2xpZW50czIubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGNsaWVudHMxSWRzID0gY2xpZW50czEubWFwKGMgPT4gYy5jbGllbnRJZCkuc29ydCgpXG4gICAgY29uc3QgY2xpZW50czJJZHMgPSBjbGllbnRzMi5tYXAoYyA9PiBjLmNsaWVudElkKS5zb3J0KClcblxuICAgIHJldHVybiBjbGllbnRzMUlkcy5ldmVyeSgoaWQsIGluZGV4KSA9PiBpZCA9PT0gY2xpZW50czJJZHNbaW5kZXhdKVxuICB9XG5cbiAgY29uc3QgaGFzQWNjZXNzaWJpbGl0eUNoYW5nZWQgPSAoKSA9PiB7XG4gICAgaWYgKCFmaXJzdFZhbHVlQWdlbnQuY3VycmVudD8uYWNjZXNzaWJpbGl0eSB8fCAhbW9kYWxWYWx1ZXM/LmFjY2Vzc2liaWxpdHkpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBhY2Nlc3NUeXBlU2FtZSA9IG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuYWNjZXNzVHlwZSA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuYWNjZXNzaWJpbGl0eS5hY2Nlc3NUeXBlXG4gICAgY29uc3QgY2xpZW50c1NhbWUgPSBhcmVDbGllbnRzQXJyYXlzRXF1YWwoXG4gICAgICBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmNsaWVudHMsXG4gICAgICBmaXJzdFZhbHVlQWdlbnQuY3VycmVudC5hY2Nlc3NpYmlsaXR5LmNsaWVudHNcbiAgICApXG4gICAgY29uc3QgdGFza0FjY2Vzc1NhbWUgPVxuICAgICAgKG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkudGFza0FjY2VzcyA/PyB0cnVlKSA9PT0gKGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmFjY2Vzc2liaWxpdHkudGFza0FjY2VzcyA/PyB0cnVlKVxuICAgIGNvbnN0IGN1cnJlbnRDb25uZWN0b3JzID0gWy4uLihtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LnNlbGVjdGVkQ29ubmVjdG9ycyB8fCBbXSldLnNvcnQoKVxuICAgIGNvbnN0IG9yaWdpbmFsQ29ubmVjdG9ycyA9IFsuLi4oZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuYWNjZXNzaWJpbGl0eS5zZWxlY3RlZENvbm5lY3RvcnMgfHwgW10pXS5zb3J0KClcbiAgICBjb25zdCBjb25uZWN0b3JzU2FtZSA9XG4gICAgICBjdXJyZW50Q29ubmVjdG9ycy5sZW5ndGggPT09IG9yaWdpbmFsQ29ubmVjdG9ycy5sZW5ndGggJiZcbiAgICAgIGN1cnJlbnRDb25uZWN0b3JzLmV2ZXJ5KChzbHVnLCBpbmRleCkgPT4gc2x1ZyA9PT0gb3JpZ2luYWxDb25uZWN0b3JzW2luZGV4XSlcblxuICAgIHJldHVybiAhYWNjZXNzVHlwZVNhbWUgfHwgIWNsaWVudHNTYW1lIHx8ICF0YXNrQWNjZXNzU2FtZSB8fCAhY29ubmVjdG9yc1NhbWVcbiAgfVxuXG4gIGNvbnN0IHZhbGlkYXRlQWdlbnRWYWx1ZXNJc1NhbWUgPSAoKSA9PiB7XG4gICAgaWYgKCFmaXJzdFZhbHVlQWdlbnQuY3VycmVudD8uZ2VuZXJhbCB8fCAhbW9kYWxWYWx1ZXM/LmdlbmVyYWwpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIG1vZGFsVmFsdWVzLmdlbmVyYWwubmFtZSA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuZ2VuZXJhbC5uYW1lICYmXG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmVtb2ppID09PSBmaXJzdFZhbHVlQWdlbnQuY3VycmVudC5nZW5lcmFsLmVtb2ppICYmXG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmludHJvZHVjdGlvbiA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuZ2VuZXJhbC5pbnRyb2R1Y3Rpb24gJiZcbiAgICAgIG1vZGFsVmFsdWVzLmdlbmVyYWwuaW5wdXRQbGFjZWhvbGRlciA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuZ2VuZXJhbC5pbnB1dFBsYWNlaG9sZGVyICYmXG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmFpTW9kZWw/LmlkID09PSBmaXJzdFZhbHVlQWdlbnQuY3VycmVudC5nZW5lcmFsLmFpTW9kZWw/LmlkICYmXG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgPT09IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmdlbmVyYWwudXNlclByb21wdCAmJlxuICAgICAgKG1vZGFsVmFsdWVzLmtub3dsZWRnZT8ubGVuZ3RoID09PSBmaXJzdFZhbHVlQWdlbnQuY3VycmVudD8ua25vd2xlZGdlPy5sZW5ndGggfHxcbiAgICAgICAgKCFtb2RhbFZhbHVlcy5rbm93bGVkZ2U/Lmxlbmd0aCAmJiAhZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQ/Lmtub3dsZWRnZT8ubGVuZ3RoKSkgJiZcbiAgICAgICFhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBkYXRlPy5sZW5ndGggJiZcbiAgICAgICFhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlPy5sZW5ndGggJiZcbiAgICAgICFoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpXG4gICAgKVxuICB9XG5cbiAgY29uc3QgaGFzQW55VmFsdWVGb3JDcmVhdGlvbiA9ICgpID0+IHtcbiAgICBpZiAobW9kYWxWYWx1ZXMuaXNFZGl0aW5nKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGlzRGVmYXVsdEFpTW9kZWwgPSAhIWFnZW50TW9kZWxzLmxlbmd0aCAmJiBtb2RhbFZhbHVlcy5nZW5lcmFsLmFpTW9kZWw/LmlkID09PSBhZ2VudE1vZGVsc1swXT8uaWRcblxuICAgIGNvbnN0IGRlZmF1bHRJbnB1dFBsYWNlaG9sZGVyID0gdCgnZ2VuZXJhbFNlY3Rpb24uaW5wdXRQbGFjZWhvbGRlcicpXG4gICAgY29uc3QgaXNEZWZhdWx0SW5wdXRQbGFjZWhvbGRlciA9IG1vZGFsVmFsdWVzLmdlbmVyYWwuaW5wdXRQbGFjZWhvbGRlciA9PT0gZGVmYXVsdElucHV0UGxhY2Vob2xkZXJcblxuICAgIGNvbnN0IGRlZmF1bHRVc2VyUHJvbXB0UGxhY2Vob2xkZXIgPSB0KCdnZW5lcmFsU2VjdGlvbi5pbml0aWFsUHJvbXB0UGxhY2Vob2xkZXInKVxuICAgIGNvbnN0IGlzRGVmYXVsdFVzZXJQcm9tcHQgPVxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC51c2VyUHJvbXB0ID09PSBkZWZhdWx0VXNlclByb21wdFBsYWNlaG9sZGVyIHx8XG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgPT09ICcnIHx8XG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQgPT09IG51bGxcblxuICAgIGNvbnN0IGhhc05hbWUgPSBtb2RhbFZhbHVlcy5nZW5lcmFsLm5hbWUudHJpbSgpICE9PSAnJ1xuICAgIGNvbnN0IGhhc0Vtb2ppID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5lbW9qaS50cmltKCkgIT09ICcnXG4gICAgY29uc3QgaGFzSW50cm9kdWN0aW9uID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pbnRyb2R1Y3Rpb24udHJpbSgpICE9PSAnJ1xuICAgIGNvbnN0IGhhc0lucHV0UGxhY2Vob2xkZXIgPSBtb2RhbFZhbHVlcy5nZW5lcmFsLmlucHV0UGxhY2Vob2xkZXIudHJpbSgpICE9PSAnJyAmJiAhaXNEZWZhdWx0SW5wdXRQbGFjZWhvbGRlclxuICAgIGNvbnN0IGhhc1VzZXJQcm9tcHQgPSBtb2RhbFZhbHVlcy5nZW5lcmFsLnVzZXJQcm9tcHQ/LnRyaW0oKSAhPT0gJycgJiYgIWlzRGVmYXVsdFVzZXJQcm9tcHRcbiAgICBjb25zdCBoYXNLbm93bGVkZ2UgPSAhIW1vZGFsVmFsdWVzLmtub3dsZWRnZS5sZW5ndGhcbiAgICBjb25zdCBoYXNDdXN0b21BaU1vZGVsID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5haU1vZGVsICYmICFpc0RlZmF1bHRBaU1vZGVsXG4gICAgY29uc3QgaGFzQWNjZXNzaWJpbGl0eSA9IG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuYWNjZXNzVHlwZSAhPT0gJ2NvbXBhbnknXG5cbiAgICByZXR1cm4gKFxuICAgICAgaGFzTmFtZSB8fFxuICAgICAgaGFzRW1vamkgfHxcbiAgICAgIGhhc0ludHJvZHVjdGlvbiB8fFxuICAgICAgaGFzSW5wdXRQbGFjZWhvbGRlciB8fFxuICAgICAgaGFzVXNlclByb21wdCB8fFxuICAgICAgaGFzS25vd2xlZGdlIHx8XG4gICAgICBoYXNDdXN0b21BaU1vZGVsIHx8XG4gICAgICBoYXNBY2Nlc3NpYmlsaXR5XG4gICAgKVxuICB9XG5cbiAgY29uc3QgaGFzQ2hhbmdlc0ZvckVkaXRpbmcgPSAoKSA9PiB7XG4gICAgaWYgKCFtb2RhbFZhbHVlcy5pc0VkaXRpbmcpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIChcbiAgICAgICF2YWxpZGF0ZUFnZW50VmFsdWVzSXNTYW1lKCkgfHxcbiAgICAgICEhYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGggfHxcbiAgICAgICEhYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGhcbiAgICApXG4gIH1cblxuICBjb25zdCBoYXNQZW5kaW5nQ2hhbmdlcyA9ICgpID0+IHtcbiAgICByZXR1cm4gaGFzQW55VmFsdWVGb3JDcmVhdGlvbigpIHx8IGhhc0NoYW5nZXNGb3JFZGl0aW5nKClcbiAgfVxuXG4gIC8vIEhlbHBlciBwYXJhIG1hbmVqYXIgZWwgdG9nZ2xlIGRlIGZhdm9yaXRvIHkgYWN0dWFsaXphciBlbCBlc3RhZG8gY29uIG9yZGVuYW1pZW50b1xuICBjb25zdCBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ6IHN0cmluZywgYWdlbnQ6IEFnZW50LCBvblN1Y2Nlc3M/OiAodXBkYXRlZEFnZW50OiBBZ2VudCkgPT4gdm9pZCwgb25FcnJvcj86ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHRvZ2dsZUZhdm9yaXRlKFxuICAgICAgICBhZ2VudElkLFxuICAgICAgICB1cGRhdGVkQWdlbnQgPT4ge1xuICAgICAgICAgIC8vIEFjdHVhbGl6YXIgZWwgZXN0YWRvIGRlIGFnZW50ZXMgY29uIGVsIHJlc3VsdGFkbyBkZWwgc2Vydmlkb3IgeSBvcmRlbmFyXG4gICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZSh1cGRhdGVkQWdlbnQsIHRydWUpXG4gICAgICAgICAgaWYgKG9uU3VjY2Vzcykge1xuICAgICAgICAgICAgb25TdWNjZXNzKHVwZGF0ZWRBZ2VudClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICBpZiAob25FcnJvcikge1xuICAgICAgICAgICAgb25FcnJvcigpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBhZ2VudC5pc19mYXZvcml0ZVxuICAgICAgKVxuICAgIH0sXG4gICAgW3RvZ2dsZUZhdm9yaXRlLCB1cGRhdGVBZ2VudEZhdm9yaXRlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSAoKSA9PiB7XG4gICAgaWYgKGhhc1BlbmRpbmdDaGFuZ2VzKCkgJiYgIXN1Y2Nlc3NDcmVhdGUgJiYgIXN1Y2Nlc3NVcGRhdGUgJiYgIXN1Y2Nlc3NEZWxldGUpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1NZXNzYWdlID0gbW9kYWxWYWx1ZXMuaXNFZGl0aW5nID8gdCgnY29uZmlybUNsb3NlRWRpdEFnZW50JykgOiB0KCdjb25maXJtQ2xvc2VDcmVhdGVBZ2VudCcpXG5cbiAgICAgIGlmICghd2luZG93LmNvbmZpcm0oY29uZmlybU1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIHNldE1vZGFsVmFsdWVzKGluaXRpYWxWYWx1ZXMpXG4gICAgaGFuZGxlQ2xlYW5BZ2VudCgpXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSgpXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MoKVxuICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQgPSB7XG4gICAgICB0b0RlbGV0ZTogW10sXG4gICAgICB0b1VwbG9hZDogW10sXG4gICAgfVxuICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgIGlzRnJvbUNyZWF0aW9uOiBmYWxzZSxcbiAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgb3BlcmF0aW9uVHlwZTogbnVsbCxcbiAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgIH1cbiAgICBhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBwcm9jZXNzRmlsZXNUaW1lZE91dFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXMoZmFsc2UpXG4gICAgc2V0SXNTdWJzY3JpYmVkKGZhbHNlKVxuICAgIHNldEZpbGVzUHJvY2Vzc2VkKDApXG4gICAgc2V0U2VjdGlvbignZ2VuZXJhbCcpXG4gICAgc2V0SXNPcGVuKGZhbHNlKVxuICAgIGFnZW50Q3JlYXRlZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudCA9IG51bGxcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUJhY2tkcm9wQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0ICYmICFpc1Nob3dQcm9jZXNzRmlsZXMpIHtcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVTZWN0aW9uQ2hhbmdlID0gKG5ld1NlY3Rpb246IEFibVNlY3Rpb24pID0+IHtcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMudGFiU2VjdGlvbiwgeyBvcHRpb246IG5ld1NlY3Rpb24gfSlcbiAgICBzZXRTZWN0aW9uKG5ld1NlY3Rpb24pXG4gIH1cblxuICBjb25zdCBoYW5kbGVTZXRBZ2VudFZhbHVlc0J5S2V5cyA9ICh7XG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRlbGV0ZUtub3dsZWRnZSxcbiAgfToge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIGRlbGV0ZUtub3dsZWRnZTogYm9vbGVhblxuICB9KSA9PiB7XG4gICAgaWYgKGtleSA9PT0gJ2tub3dsZWRnZScpIHtcbiAgICAgIGlmICghZGVsZXRlS25vd2xlZGdlKSB7XG4gICAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQucHVzaCguLi4odmFsdWUgfHwgW10pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZmlsZXNQcmV2SWRzID0gdmFsdWUubGVuZ3RoID8gbmV3IFNldCh2YWx1ZS5tYXAoZmlsZSA9PiBmaWxlLmlkKSkgOiBuZXcgU2V0KClcbiAgICAgICAgY29uc3QgbmV3RmlsZXMgPSBtb2RhbFZhbHVlcy5rbm93bGVkZ2UuZmlsdGVyKGZpbGUgPT4gIWZpbGVzUHJldklkcy5oYXMoZmlsZS5pZCkgJiYgZmlsZS5zdGF0dXMgIT09ICdzdGFydGVkJylcbiAgICAgICAgaWYgKCFuZXdGaWxlcy5sZW5ndGggJiYgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZUlkcyA9IG5ldyBTZXQodmFsdWUubWFwKGZpbGUgPT4gZmlsZS5pZCkpXG4gICAgICAgICAgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZCA9IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQuZmlsdGVyKGZpbGUgPT4gdmFsdWVJZHMuaGFzKGZpbGUuaWQpKVxuICAgICAgICB9XG4gICAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUgPSBbLi4uKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUgfHwgW10pLCAuLi5uZXdGaWxlc11cbiAgICAgIH1cbiAgICB9XG4gICAgc2V0TW9kYWxWYWx1ZXMocHJldiA9PiB7XG4gICAgICBjb25zdCBrbm93bGVkZ2VGaWxlcyA9XG4gICAgICAgIGtleSA9PT0gJ2tub3dsZWRnZSdcbiAgICAgICAgICA/IGRlbGV0ZUtub3dsZWRnZVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiBbLi4uKHByZXYua25vd2xlZGdlIHx8IFtdKSwgLi4uKCh2YWx1ZSBhcyBBdHRhY2htZW50RmlsZVtdKSB8fCBbXSldXG4gICAgICAgICAgOiBudWxsXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICAuLi4oa2V5ID09PSAna25vd2xlZGdlJ1xuICAgICAgICAgID8geyBrbm93bGVkZ2U6IGtub3dsZWRnZUZpbGVzIH1cbiAgICAgICAgICA6IGtleSA9PT0gJ2FjY2Vzc2liaWxpdHknXG4gICAgICAgICAgICA/IHsgYWNjZXNzaWJpbGl0eTogdmFsdWUgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhbDoge1xuICAgICAgICAgICAgICAgICAgLi4ucHJldi5nZW5lcmFsLFxuICAgICAgICAgICAgICAgICAgW2tleV06IHZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBoYW5kbGVDb25maXJtQWN0aW9uID0gYXN5bmMgKGNoYXQ6IGFueSwgYWN0aW9uOiAnZGVsZXRlJyB8ICd1cGRhdGUnIHwgJ2NyZWF0ZScpID0+IHtcbiAgICAvLyBTb2xvIHBlcm1pdGlyIG9wZXJhY2lvbmVzIGRlIGFnZW50ZXMgY3VzdG9tIHNpIGxhIGZlYXR1cmUgZmxhZyBlc3TDoSBoYWJpbGl0YWRhXG4gICAgaWYgKCF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5kZWxldGUpXG4gICAgICBoYW5kbGVEZWxldGVBZ2VudChjaGF0LmlkIGFzIHVua25vd24gYXMgc3RyaW5nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5jb25maXJtQWN0aW9uLCB7IG9wdGlvbjogbW9kYWxWYWx1ZXMuaXNFZGl0aW5nID8gJ2VkaXRlJyA6ICdjcmVhdGUnIH0pXG4gICAgLy8gQWwgcmVpbnRlbnRhciBndWFyZGFyLCBsaWJlcmFyIGVsIGZyZW5vIGRlbCB0aW1lb3V0IHByZXZpbyBwYXJhIHF1ZSBsb3NcbiAgICAvLyB1c2VFZmZlY3QgZGUgcG9zdC1ndWFyZGFkbyB2dWVsdmFuIGEgcG9kZXIgZGlzcGFyYXIgc25hY2tiYXJzIHkgY2VycmFyLlxuICAgIHByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIGlmIChtb2RhbFZhbHVlcy5pc0VkaXRpbmcpIHtcbiAgICAgIGlmICghdmFsaWRhdGVBZ2VudFZhbHVlc0lzU2FtZSgpKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZVVwZGF0ZUFnZW50KG1vZGFsVmFsdWVzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoYW5kbGVDcmVhdGVBZ2VudChtb2RhbFZhbHVlcylcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVNldEFnZW50VmFsdWVzID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnRWYWx1ZXMgfSA9IGV2ZW50LmRldGFpbFxuICAgICAgY29uc3QgaW5pdGlhbFNlY3Rpb24gPSBhZ2VudFZhbHVlcz8uaW5pdGlhbFNlY3Rpb24gYXMgQWJtU2VjdGlvbiB8IHVuZGVmaW5lZFxuICAgICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPVxuICAgICAgICBpbml0aWFsU2VjdGlvbiAmJiBbJ2dlbmVyYWwnLCAna25vd2xlZGdlJywgJ2FjY2Vzc2liaWxpdHknXS5pbmNsdWRlcyhpbml0aWFsU2VjdGlvbikgPyBpbml0aWFsU2VjdGlvbiA6IG51bGxcblxuICAgICAgZ2V0QWxsQWdlbnRNb2RlbHMoKVxuICAgICAgc2V0SXNPcGVuKHRydWUpXG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcblxuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY3Rpb25GaWxlczogZmFsc2UsXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgfVxuXG4gICAgICBpZiAoYWdlbnRWYWx1ZXMudmFsdWVzPy5pc0VkaXRpbmcpIHtcbiAgICAgICAgLy8gVmFsaWRhciBxdWUgbGEgZmVhdHVyZSBmbGFnIGVzdMOpIGhhYmlsaXRhZGEgYW50ZXMgZGUgY2FyZ2FyIGVsIGFnZW50ZSBwYXJhIGVkaXRhclxuICAgICAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdlcnJvckFjY2Vzc0RlbmllZCcpKVxuICAgICAgICAgIHNldElzT3BlbihmYWxzZSlcbiAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgICAgICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChhZ2VudFZhbHVlcy5wcmVmZXRjaGVkQWdlbnRCeUlkKSB7XG4gICAgICAgICAgaGFuZGxlQ2xlYW5BZ2VudCgpXG4gICAgICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50ID0gYWdlbnRWYWx1ZXMucHJlZmV0Y2hlZEFnZW50QnlJZFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGhhbmRsZUdldEFnZW50QnlJZChhZ2VudFZhbHVlcz8udmFsdWVzPy5nZW5lcmFsPy5pZCBhcyB1bmtub3duIGFzIHN0cmluZylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChhZ2VudFZhbHVlcy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlcyA9IHtcbiAgICAgICAgICAuLi5pbml0aWFsVmFsdWVzLFxuICAgICAgICAgIC4uLmFnZW50VmFsdWVzLnZhbHVlcyxcbiAgICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgICAuLi5pbml0aWFsVmFsdWVzLmdlbmVyYWwsXG4gICAgICAgICAgICAuLi4oYWdlbnRWYWx1ZXMudmFsdWVzLmdlbmVyYWwgfHwge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgLi4uaW5pdGlhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LFxuICAgICAgICAgICAgLi4uKGFnZW50VmFsdWVzLnZhbHVlcy5hY2Nlc3NpYmlsaXR5IHx8IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtub3dsZWRnZTogYWdlbnRWYWx1ZXMudmFsdWVzLmtub3dsZWRnZSB8fCBbXSxcbiAgICAgICAgfVxuXG4gICAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50ID0gbmV4dFZhbHVlc1xuICAgICAgICBzZXRNb2RhbFZhbHVlcyhuZXh0VmFsdWVzKVxuICAgICAgfVxuXG4gICAgICBpZiAocGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgJiYgIWFnZW50VmFsdWVzLnZhbHVlcz8uaXNFZGl0aW5nKSB7XG4gICAgICAgIHNldFNlY3Rpb24ocGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQpXG4gICAgICAgIHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2FibS1hZ2VudC1tb2RhbC1zZXQtdmFsdWVzJywgaGFuZGxlU2V0QWdlbnRWYWx1ZXMpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FibS1hZ2VudC1tb2RhbC1zZXQtdmFsdWVzJywgaGFuZGxlU2V0QWdlbnRWYWx1ZXMgYXMgRXZlbnRMaXN0ZW5lcilcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIHVzZUVmZmVjdCB0byBoYW5kbGUgdGhlIG92ZXJmbG93IG9mIHRoZSBib2R5IHdoZW4gdGhlIG1vZGFsIGlzIG9wZW5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzT3Blbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHsgYm9keSB9ID0gZG9jdW1lbnRcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE92ZXJmbG93ID0gYm9keS5zdHlsZS5vdmVyZmxvd1xuICAgIGJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGJvZHkuc3R5bGUub3ZlcmZsb3cgPSBvcmlnaW5hbE92ZXJmbG93XG4gICAgfVxuICB9LCBbaXNPcGVuXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChldmVudDogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHtcbiAgICAgIGlmIChoYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gdCgnY29uZmlybVJlbG9hZEJyb3dzZXInKVxuICAgICAgICByZXR1cm4gdCgnY29uZmlybVJlbG9hZEJyb3dzZXInKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmIChpc09wZW4pIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBoYW5kbGVCZWZvcmVVbmxvYWQpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBoYW5kbGVCZWZvcmVVbmxvYWQpXG4gICAgfVxuICB9LCBbaXNPcGVuLCBoYXNQZW5kaW5nQ2hhbmdlcywgdF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3VjY2Vzc0RlbGV0ZSkge1xuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudERlbGV0ZWQnKSlcbiAgICAgIHJlc2V0U3VjY2VzcygpXG4gICAgICBpZiAoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkID09PSBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICAgIHNlbGVjdEZpcnN0QWdlbnQoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkIGFzIHN0cmluZylcbiAgICAgIH1cbiAgICAgIHJlbW92ZUFnZW50KG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQpXG4gICAgICBzZXRTaG93TW9kYWxEZWxldGUoZmFsc2UpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfVxuICB9LCBbc3VjY2Vzc0RlbGV0ZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBFdml0YXIgZWplY3VjacOzbiBtw7psdGlwbGUgZGVsIGVmZWN0b1xuICAgIGlmIChzdWNjZXNzQ3JlYXRlICYmICFpc0xvYWRpbmdDcmVhdGUgJiYgYWdlbnRDcmVhdGVkUmVmLmN1cnJlbnQgIT09IHN1Y2Nlc3NDcmVhdGUuaWQpIHtcbiAgICAgIGFnZW50Q3JlYXRlZFJlZi5jdXJyZW50ID0gc3VjY2Vzc0NyZWF0ZS5pZFxuICAgICAgaWYgKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUubGVuZ3RoICYmIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGlzRnJvbUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBoYXNBY3Rpb25GaWxlczogdHJ1ZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpIG5vIGhheSBhY2Nlc2liaWxpZGFkIHBlcm8gaGF5IGFyY2hpdm9zLCBlc3RhYmxlY2VyIGVsIGNvbnRleHRvIHBhcmEgY3JlYWNpw7NuXG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAgICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlcyh7XG4gICAgICAgICAgICBmaWxlc1RvRGVsZXRlOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlLFxuICAgICAgICAgICAgZmlsZXNUb0NyZWF0ZTogYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZCxcbiAgICAgICAgICAgIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goaGFuZGxlQWNjZXNzQ2xpZW50KHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAgIGNvbnN0IGFnZW50V2l0aEZhdm9yaXRlID0geyAuLi5zdWNjZXNzQ3JlYXRlLCBpc19mYXZvcml0ZTogdHJ1ZSB9XG4gICAgICAgICAgYWRkQWdlbnQoYWdlbnRXaXRoRmF2b3JpdGUpXG4gICAgICAgICAgLy8gQ3VhbmRvIHNlIGNyZWEgdW4gYWdlbnRlIG51ZXZvLCBlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmYXZvcml0byBtYXJjYWRvIGHDum5cbiAgICAgICAgICAvLyBFbnRvbmNlcyBjdXJyZW50SXNGYXZvcml0ZSBkZWJlIHNlciBmYWxzZSBwYXJhIHF1ZSBlbCB0b2dnbGUgbG8gbWFycXVlIGNvbW8gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGFnZW50Rm9yVG9nZ2xlID0geyAuLi5hZ2VudFdpdGhGYXZvcml0ZSwgaXNfZmF2b3JpdGU6IGZhbHNlIH1cbiAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50KFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhZ2VudEZvclRvZ2dsZSxcbiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKCksXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuXG4gICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXModHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuYWNjZXNzVHlwZSAhPT0gJ2NvbXBhbnknKSB7XG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2kgbm8gaGF5IGFjY2VzaWJpbGlkYWQgcGVybyBoYXkgYXJjaGl2b3MsIGVzdGFibGVjZXIgZWwgY29udGV4dG8gcGFyYSBjcmVhY2nDs25cbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBpc0Zyb21DcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzKHsgZmlsZXM6IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUsIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSB9KSxcbiAgICAgICAgXVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goaGFuZGxlQWNjZXNzQ2xpZW50KHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAgIGNvbnN0IGFnZW50V2l0aEZhdm9yaXRlID0geyAuLi5zdWNjZXNzQ3JlYXRlLCBpc19mYXZvcml0ZTogdHJ1ZSB9XG4gICAgICAgICAgYWRkQWdlbnQoYWdlbnRXaXRoRmF2b3JpdGUpXG4gICAgICAgICAgLy8gQ3VhbmRvIHNlIGNyZWEgdW4gYWdlbnRlIG51ZXZvLCBlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmYXZvcml0byBtYXJjYWRvIGHDum5cbiAgICAgICAgICAvLyBFbnRvbmNlcyBjdXJyZW50SXNGYXZvcml0ZSBkZWJlIHNlciBmYWxzZSBwYXJhIHF1ZSBlbCB0b2dnbGUgbG8gbWFycXVlIGNvbW8gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGFnZW50Rm9yVG9nZ2xlID0geyAuLi5hZ2VudFdpdGhGYXZvcml0ZSwgaXNfZmF2b3JpdGU6IGZhbHNlIH1cbiAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50KFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhZ2VudEZvclRvZ2dsZSxcbiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKCksXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzKHsgZmlsZXM6IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUsIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSB9KVxuICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGlzRnJvbUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBoYXNBY3Rpb25GaWxlczogdHJ1ZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpIG5vIGhheSBhY2Nlc2liaWxpZGFkIHBlcm8gaGF5IGFyY2hpdm9zLCBlc3RhYmxlY2VyIGVsIGNvbnRleHRvIHBhcmEgY3JlYWNpw7NuXG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAgICAgaGFuZGxlQ3JlYXRlS25vd2xlZGdlcyh7IGZpbGVzOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkLCBhZ2VudElkOiBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCkgfSksXG4gICAgICAgIF1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5hY2Nlc3NUeXBlICE9PSAnY29tcGFueScpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGhhbmRsZUFjY2Vzc0NsaWVudChzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGFsVmFsdWVzLmdlbmVyYWwuaXNfZmF2b3JpdGUpIHtcbiAgICAgICAgICBjb25zdCBhZ2VudFdpdGhGYXZvcml0ZSA9IHsgLi4uc3VjY2Vzc0NyZWF0ZSwgaXNfZmF2b3JpdGU6IHRydWUgfVxuICAgICAgICAgIGFkZEFnZW50KGFnZW50V2l0aEZhdm9yaXRlKVxuICAgICAgICAgIC8vIEN1YW5kbyBzZSBjcmVhIHVuIGFnZW50ZSBudWV2bywgZWwgc2Vydmlkb3Igbm8gdGllbmUgZWwgZmF2b3JpdG8gbWFyY2FkbyBhw7puXG4gICAgICAgICAgLy8gRW50b25jZXMgY3VycmVudElzRmF2b3JpdGUgZGViZSBzZXIgZmFsc2UgcGFyYSBxdWUgZWwgdG9nZ2xlIGxvIG1hcnF1ZSBjb21vIHRydWVcbiAgICAgICAgICBjb25zdCBhZ2VudEZvclRvZ2dsZSA9IHsgLi4uYWdlbnRXaXRoRmF2b3JpdGUsIGlzX2Zhdm9yaXRlOiBmYWxzZSB9XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudChcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYWdlbnRGb3JUb2dnbGUsXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSgpLFxuICAgICAgICAgICAgICAgICgpID0+IHJlamVjdCgpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZEFnZW50KHN1Y2Nlc3NDcmVhdGUpXG4gICAgICAgIH1cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHNldElzU2hvd1Byb2Nlc3NGaWxlcyh0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAvLyBTb2xvIHJlc2V0ZWFyIGVsIGNvbnRleHRvIHNpIE5PIHNlIGhhIGxsYW1hZG8gdG9kYXbDrWFcbiAgICAgICAgaWYgKCFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQmVlbkNhbGxlZCkge1xuICAgICAgICAgIGNvbnN0IHsgaGFzQWN0aW9uRmlsZXMgfSA9IGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudFxuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGlzRnJvbUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBoYXNBY3Rpb25GaWxlczogaGFzQWN0aW9uRmlsZXMgfHwgZmFsc2UsXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0JlZW5DYWxsZWQpIHtcbiAgICAgICAgICBoYW5kbGVBY2Nlc3NDbGllbnQoc3VjY2Vzc0NyZWF0ZS5pZC50b1N0cmluZygpLCBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5KVxuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNCZWVuQ2FsbGVkID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29sbyBlamVjdXRhciBoYW5kbGVBY2Nlc3NDbGllbnQsIGVsIGFnZW50ZSBzZSBhZ3JlZ2Fyw6EgeSBlbCB0b2dnbGUgc2UgaGFyw6EgZW4gc3VjY2Vzc1VwZGF0ZUFjY2Vzc1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGZhdm9yaXRlIGlmIGl0IHdhcyBtYXJrZWQgZHVyaW5nIGNyZWF0aW9uXG4gICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAvLyBQcmltZXJvIGFncmVnYXIgZWwgYWdlbnRlIGEgbGEgbGlzdGEgKGFkZEFnZW50IHlhIG9yZGVuYSlcbiAgICAgICAgY29uc3QgYWdlbnRXaXRoRmF2b3JpdGUgPSB7IC4uLnN1Y2Nlc3NDcmVhdGUsIGlzX2Zhdm9yaXRlOiB0cnVlIH1cbiAgICAgICAgYWRkQWdlbnQoYWdlbnRXaXRoRmF2b3JpdGUpXG5cbiAgICAgICAgLy8gQ3VhbmRvIHNlIGNyZWEgdW4gYWdlbnRlIG51ZXZvLCBlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmYXZvcml0byBtYXJjYWRvIGHDum5cbiAgICAgICAgLy8gRW50b25jZXMgY3VycmVudElzRmF2b3JpdGUgZGViZSBzZXIgZmFsc2UgcGFyYSBxdWUgZWwgdG9nZ2xlIGxvIG1hcnF1ZSBjb21vIHRydWVcbiAgICAgICAgY29uc3QgYWdlbnRGb3JUb2dnbGUgPSB7IC4uLmFnZW50V2l0aEZhdm9yaXRlLCBpc19mYXZvcml0ZTogZmFsc2UgfVxuICAgICAgICAvLyBMdWVnbyBoYWNlciBlbCB0b2dnbGUgZGUgZmF2b3JpdG8gZW4gZWwgc2Vydmlkb3IgeSBhY3R1YWxpemFyIGVsIGVzdGFkb1xuICAgICAgICBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50KFxuICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBhZ2VudEZvclRvZ2dsZSxcbiAgICAgICAgICB1cGRhdGVkQWdlbnQgPT4ge1xuICAgICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7IG9wdGlvbjogdXBkYXRlZEFnZW50LmlzX2Zhdm9yaXRlID8gJ2FkZCcgOiAncmVtb3ZlJyB9KVxuICAgICAgICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgICAgICAgIHNlbGVjdEFnZW50KHsgLi4uYWdlbnRXaXRoRmF2b3JpdGUsIGlzX2Zhdm9yaXRlOiB1cGRhdGVkQWdlbnQuaXNfZmF2b3JpdGUgfSlcbiAgICAgICAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7IG9wdGlvbjogJ2FkZCcgfSlcbiAgICAgICAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFdpdGhGYXZvcml0ZSlcbiAgICAgICAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgICAgYWRkQWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIGlzTG9hZGluZ0NyZWF0ZSxcbiAgICBzdWNjZXNzQ3JlYXRlLFxuICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVDcmVhdGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIGFkZEFnZW50LFxuICAgIHNlbGVjdEFnZW50LFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgICByZXNldFN1Y2Nlc3NDcmVhdGUsXG4gICAgaGFuZGxlQ2xvc2UsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdWNjZXNzVXBkYXRlKSB7XG4gICAgICBpZiAoYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGggJiYgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkKCkpIHtcbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiB0cnVlLFxuICAgICAgICAgICAgaGFzQWN0aW9uRmlsZXM6IHRydWUsXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAndXBkYXRlJyxcbiAgICAgICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXNUb0RlbGV0ZSA9IFsuLi5hY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlXVxuICAgICAgICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBbLi4uYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZF1cbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlID0gW11cbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkID0gW11cblxuICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMoe1xuICAgICAgICAgICAgICBmaWxlc1RvRGVsZXRlLFxuICAgICAgICAgICAgICBmaWxlc1RvQ3JlYXRlOiBmaWxlc1RvVXBsb2FkLFxuICAgICAgICAgICAgICBhZ2VudElkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLihoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpXG4gICAgICAgICAgICAgID8gW2hhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXModHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkKCkpIHtcbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiB0cnVlLFxuICAgICAgICAgICAgaGFzQWN0aW9uRmlsZXM6IHRydWUsXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAndXBkYXRlJyxcbiAgICAgICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXNUb0RlbGV0ZSA9IFsuLi5hY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlXVxuICAgICAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUgPSBbXVxuXG4gICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyh7XG4gICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1RvRGVsZXRlLFxuICAgICAgICAgICAgICBhZ2VudElkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLihoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpXG4gICAgICAgICAgICAgID8gW2hhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogJ3VwZGF0ZScsXG4gICAgICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZCkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBbLi4uYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZF1cbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkID0gW11cblxuICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXMoe1xuICAgICAgICAgICAgICBmaWxlczogZmlsZXNUb1VwbG9hZCxcbiAgICAgICAgICAgICAgYWdlbnRJZDogbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZC50b1N0cmluZygpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi4oaGFzQWNjZXNzaWJpbGl0eUNoYW5nZWQoKVxuICAgICAgICAgICAgICA/IFtoYW5kbGVBY2Nlc3NDbGllbnQobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZC50b1N0cmluZygpLCBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5KV1cbiAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgXSlcbiAgICAgICAgfVxuICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkKCkpIHtcbiAgICAgICAgLy8gU29sbyByZXNldGVhciBlbCBjb250ZXh0byBzaSBOTyBzZSBoYSBsbGFtYWRvIHRvZGF2w61hIHkgTk8gaGF5IGFyY2hpdm9zIHBlbmRpZW50ZXNcbiAgICAgICAgaWYgKCFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQmVlbkNhbGxlZCAmJiAhYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0FjdGlvbkZpbGVzKSB7XG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQpIHtcbiAgICAgICAgICAvLyBMbGFtYXIgYSBoYW5kbGVBY2Nlc3NDbGllbnQgc29sbyB1bmEgdmV6XG4gICAgICAgICAgaWYgKCFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQmVlbkNhbGxlZCkge1xuICAgICAgICAgICAgaGFuZGxlQWNjZXNzQ2xpZW50KG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSlcbiAgICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNCZWVuQ2FsbGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gU29sbyBjZXJyYXIgc2kgbm8gaGF5IGFyY2hpdm9zIHNpZW5kbyBwcm9jZXNhZG9zIG5pIGFjY2VzcyBwZW5kaWVudGVcbiAgICAgIGlmIChcbiAgICAgICAgIWhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ICYmXG4gICAgICAgICFpc1Nob3dQcm9jZXNzRmlsZXMgJiZcbiAgICAgICAgIWFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoICYmXG4gICAgICAgICFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQWN0aW9uRmlsZXMgJiZcbiAgICAgICAgIXN1Y2Nlc3NVcGRhdGVBY2Nlc3MgJiZcbiAgICAgICAgIXByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmLmN1cnJlbnRcbiAgICAgICkge1xuICAgICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50VXBkYXRlZCcpKVxuICAgICAgICB1cGRhdGVBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgICBpZiAoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkID09PSBzdWNjZXNzVXBkYXRlLmlkKSB7XG4gICAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgICAgICByZXNldFN1Y2Nlc3NVcGRhdGUoKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJykpXG4gICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBzdWNjZXNzVXBkYXRlLFxuICAgIG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQsXG4gICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICAgIHQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlLFxuICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZSxcbiAgICBoYW5kbGVDbG9zZSxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVQcm9jZXNzRmlsZXNUaW1lb3V0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgJiYgIWlzU2hvd1Byb2Nlc3NGaWxlcykgcmV0dXJuXG5cbiAgICAvLyBBbCBjdW1wbGlyc2UgZWwgdGltZW91dCBhc3VtaW1vcyBxdWUgZWwgZ3VhcmRhZG8gZGVsIGFnZW50ZSBmdWUgZXhpdG9zb1xuICAgIC8vIChlbCBzZXJ2ZXIgcmVzcG9uZGnDsyBPSykgeSBxdWUgbG9zIGFyY2hpdm9zIHNlIGVudmlhcm9uIGNvcnJlY3RhbWVudGUuXG4gICAgLy8gU29sbyBwZXJkaW1vcyBsYSBjb25maXJtYWNpw7NuIGFzaW5jcsOzbmljYSBkZWwgV2ViU29ja2V0IHNvYnJlIHN1XG4gICAgLy8gcHJvY2VzYW1pZW50by4gQ2VycmFtb3MgdG9kbyBtb3N0cmFuZG8gZWwgc25hY2tiYXIgZGUgw6l4aXRvIHF1ZSBodWJpZXNlXG4gICAgLy8gZGlzcGFyYWRvIGVsIGZsdWpvIG5vcm1hbCBkZSDDqXhpdG8uXG5cbiAgICAvLyBGcmVubyBwYXJhIHF1ZSBsb3MgdXNlRWZmZWN0IGRlIHBvc3QtZ3VhcmRhZG8gbm8gcmUtZGlzcGFyZW4gc25hY2tiYXJzXG4gICAgLy8gbyBjaWVycmVzIGR1cGxpY2Fkb3MgY3VhbmRvIHNldElzU2hvd1Byb2Nlc3NGaWxlcyhmYWxzZSkgbG9zIGdhdGlsbGUuXG4gICAgcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYuY3VycmVudCA9IHRydWVcblxuICAgIGlmIChtb2RhbFZhbHVlcy5pc0VkaXRpbmcgJiYgc3VjY2Vzc1VwZGF0ZSkge1xuICAgICAgdXBkYXRlQWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIGlmIChjdXJyZW50U2VsZWN0ZWRBZ2VudD8uaWQgPT09IHN1Y2Nlc3NVcGRhdGUuaWQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKSlcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRVcGRhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NVcGRhdGUoKVxuICAgIH0gZWxzZSBpZiAoIW1vZGFsVmFsdWVzLmlzRWRpdGluZyAmJiBzdWNjZXNzQ3JlYXRlKSB7XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICB9XG5cbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlKClcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzcygpXG5cbiAgICBoYW5kbGVDbG9zZSgpXG4gIH0sIFtcbiAgICBpc1Nob3dQcm9jZXNzRmlsZXMsXG4gICAgbW9kYWxWYWx1ZXMuaXNFZGl0aW5nLFxuICAgIHN1Y2Nlc3NVcGRhdGUsXG4gICAgc3VjY2Vzc0NyZWF0ZSxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICBjdXJyZW50U2VsZWN0ZWRBZ2VudD8uaWQsXG4gICAgc2VsZWN0QWdlbnQsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICAgIHQsXG4gICAgcmVzZXRTdWNjZXNzVXBkYXRlLFxuICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSxcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaGFuZGxlQ2xvc2UsXG4gIF0pXG5cbiAgY29uc3Qgd2ViU29ja2V0RnVuY3Rpb24gPSAoeyBtb2RlbF9kYXRhOiBtb2RlbERhdGEgfTogeyBtb2RlbF9kYXRhOiBhbnkgfSkgPT4ge1xuICAgIGNvbnN0IGZpbGVTdGF0dXMgPSBtb2RlbERhdGFcbiAgICBpZiAoZmlsZVN0YXR1cy5zdGF0dXMgPT09ICdkb25lJyB8fCBmaWxlU3RhdHVzLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkS25vd2xlZGdlID0gcHJldi5rbm93bGVkZ2UubWFwKGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLm5hbWUgPT09IGZpbGVTdGF0dXMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmZpbGUsXG4gICAgICAgICAgICAgIHN0YXR1czogZmlsZVN0YXR1cy5zdGF0dXMsXG4gICAgICAgICAgICAgIGlkOiBmaWxlU3RhdHVzLmtub3dsZWRnZV9iYXNlX2lkIHx8IGZpbGUuaWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWxlXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGhhc1BlbmRpbmdGaWxlcyA9IHVwZGF0ZWRLbm93bGVkZ2Uuc29tZShmaWxlID0+IGZpbGUuc3RhdHVzID09PSAncGVuZGluZycpXG4gICAgICAgIGNvbnN0IGhhc0Vycm9yRmlsZXMgPSB1cGRhdGVkS25vd2xlZGdlLnNvbWUoZmlsZSA9PiBmaWxlLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpXG4gICAgICAgIGlmIChoYXNFcnJvckZpbGVzICYmICFoYXNQZW5kaW5nRmlsZXMpIHtcbiAgICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKGZhbHNlKVxuICAgICAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IoXG4gICAgICAgICAgICBtb2RhbFZhbHVlcy5pc0VkaXRpbmcgPyB0KCdjb25maXJtQWdlbnRVcGRhdGVkV2l0aEZpbGVzRXJyb3InKSA6IHQoJ2NvbmZpcm1BZ2VudFdpdGhGaWxlc0Vycm9yJylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1BlbmRpbmdGaWxlcyAmJiAhaGFzRXJyb3JGaWxlcykge1xuICAgICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXMoZmFsc2UpXG5cbiAgICAgICAgICAvLyBTaSBoYWLDrWEgYWNjZXNzIHBlbmRpZW50ZSB5IHlhIGVzdGFiYSBtYW5lamFkbywgZm9yemFyIHF1ZSBlbCB1c2VFZmZlY3QgZGUgYWNjZXNzIHNlIGVqZWN1dGUgZGUgbnVldm9cbiAgICAgICAgICBpZiAoYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0FjdGlvbkZpbGVzICYmIGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgc2V0RmlsZXNQcm9jZXNzZWQocHJldkNvdW50ID0+IHByZXZDb3VudCArIDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJlxuICAgICAgICAgICAgIWFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNBY3Rpb25GaWxlcyAmJlxuICAgICAgICAgICAgIWZpbGVzRmluaXNoZWRSZWYuY3VycmVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gU2kgZXMgY3JlYWNpw7NuIHNpbiBhY2Nlc2liaWxpZGFkLCBtYXJjYXIgcXVlIGxvcyBhcmNoaXZvcyB0ZXJtaW5hcm9uXG4gICAgICAgICAgICBmaWxlc0ZpbmlzaGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgICBzZXRGaWxlc1Byb2Nlc3NlZChwcmV2Q291bnQgPT4gcHJldkNvdW50ICsgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGtub3dsZWRnZTogdXBkYXRlZEtub3dsZWRnZSxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdWNjZXNzS25vd2xlZGdlRGVsZXRlICYmICFpc0xvYWRpbmdLbm93bGVkZ2UgJiYgIWVycm9yS25vd2xlZGdlKSB7XG4gICAgICAvLyBTb2xvIGNlcnJhciBzaSBOTyBoYXkgYXJjaGl2b3Mgc2llbmRvIHByb2Nlc2Fkb3NcbiAgICAgIGlmIChoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCB8fCBpc1Nob3dQcm9jZXNzRmlsZXMgfHwgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBTaSBlbCBsb2FkZXIgc2UgY2VycsOzIHBvciB0aW1lb3V0LCBubyBtb3N0cmFyIHNuYWNrYmFyIGRlIMOpeGl0byBuaSBjZXJyYXJcbiAgICAgIGlmIChwcm9jZXNzRmlsZXNUaW1lZE91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudFVwZGF0ZWQnKSlcbiAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfVxuICAgIGlmIChlcnJvcktub3dsZWRnZSkge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcihcbiAgICAgICAgbW9kYWxWYWx1ZXMuaXNFZGl0aW5nID8gdCgnY29uZmlybUFnZW50VXBkYXRlZFdpdGhGaWxlc0Vycm9yJykgOiB0KCdjb25maXJtQWdlbnRXaXRoRmlsZXNFcnJvcicpXG4gICAgICApXG4gICAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgIH1cbiAgfSwgW3N1Y2Nlc3NLbm93bGVkZ2VEZWxldGUsIGlzTG9hZGluZ0tub3dsZWRnZSwgZXJyb3JLbm93bGVkZ2UsIGlzU2hvd1Byb2Nlc3NGaWxlc10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50XG5cbiAgICAvLyBTaSBoYXkgYXJjaGl2b3Mgc2llbmRvIHByb2Nlc2Fkb3MsIGVzcGVyYXIgYSBxdWUgdGVybWluZW5cbiAgICBpZiAoY29udGV4dC5oYXNBY3Rpb25GaWxlcyAmJiAoaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgfHwgaXNTaG93UHJvY2Vzc0ZpbGVzKSkge1xuICAgICAgLy8gU2kgc3VjY2Vzc1VwZGF0ZUFjY2VzcyBlc3TDoSBhY3Rpdm8sIG1hcmNhciBjb21vIG1hbmVqYWRvIHBlcm8gTk8gcmVzZXRlYXIgaGFzdGEgcXVlIHRlcm1pbmVuIGxvcyBhcmNoaXZvc1xuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MgJiYgIWFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCkge1xuICAgICAgICBhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTaSB5YSBmdWUgbWFuZWphZG8geSBubyBoYXkgYXJjaGl2b3MgcGVuZGllbnRlcywgZWplY3V0YXIgZWwgY2llcnJlXG4gICAgaWYgKGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCAmJiBjb250ZXh0Lmhhc0FjdGlvbkZpbGVzICYmIGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MpIHtcbiAgICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcbiAgICAgIH1cbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgICBvcGVyYXRpb25UeXBlOiBudWxsLFxuICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc3VjY2Vzc1VwZGF0ZUFjY2Vzcykge1xuICAgICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MoKVxuXG4gICAgaWYgKGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIC8vIFNpIGhheSBhcmNoaXZvcywgZWwgYWdlbnRlIHlhIGZ1ZSBhZ3JlZ2FkbyB5IGVsIHRvZ2dsZSB5YSBzZSBoaXpvIGVuIHN1Y2Nlc3NDcmVhdGVcbiAgICAgIC8vIFNvbG8gbmVjZXNpdGFtb3MgY2VycmFyIGVsIG1vZGFsXG4gICAgICBpZiAoY29udGV4dC5oYXNBY3Rpb25GaWxlcykge1xuICAgICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBTaSBlbCBhZ2VudGUgZnVlIGNyZWFkbyBjb24gZmF2b3JpdG8sIG5lY2VzaXRhbW9zIG9yZGVuYXIgZGVzcHXDqXMgZGUgYWdyZWdhcmxvXG4gICAgICBjb25zdCBhZ2VudFRvQWRkID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSA/IHsgLi4uc3VjY2Vzc0NyZWF0ZSwgaXNfZmF2b3JpdGU6IHRydWUgfSA6IHN1Y2Nlc3NDcmVhdGVcblxuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgIGFkZEFnZW50KGFnZW50VG9BZGQpXG4gICAgICBzZWxlY3RBZ2VudChhZ2VudFRvQWRkKVxuXG4gICAgICAvLyBTaSB0aWVuZSBmYXZvcml0bywgaGFjZXIgdG9nZ2xlIHkgYWN0dWFsaXphciBlc3RhZG8gYW50ZXMgZGUgY2VycmFyXG4gICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAvLyBDdWFuZG8gc2UgY3JlYSB1biBhZ2VudGUgbnVldm8sIGVsIHNlcnZpZG9yIG5vIHRpZW5lIGVsIGZhdm9yaXRvIG1hcmNhZG8gYcO6blxuICAgICAgICAvLyBFbnRvbmNlcyBjdXJyZW50SXNGYXZvcml0ZSBkZWJlIHNlciBmYWxzZSBwYXJhIHF1ZSBlbCB0b2dnbGUgbG8gbWFycXVlIGNvbW8gdHJ1ZVxuICAgICAgICBjb25zdCBhZ2VudEZvclRvZ2dsZSA9IHsgLi4uYWdlbnRUb0FkZCwgaXNfZmF2b3JpdGU6IGZhbHNlIH1cbiAgICAgICAgaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudChcbiAgICAgICAgICBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgYWdlbnRGb3JUb2dnbGUsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2VycmFyIGRlc3B1w6lzIGRlIHF1ZSBlbCB0b2dnbGUgY29tcGxldGUgeSBhY3R1YWxpY2UgZWwgZXN0YWRvXG4gICAgICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRVcGRhdGVkJykpXG4gICAgICB1cGRhdGVBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgaWYgKGN1cnJlbnRTZWxlY3RlZEFnZW50Py5pZCA9PT0gc3VjY2Vzc1VwZGF0ZS5pZCkge1xuICAgICAgICBzZWxlY3RBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgfVxuICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlKClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKSlcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9XG5cbiAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICB9XG4gIH0sIFtzdWNjZXNzVXBkYXRlQWNjZXNzLCBmaWxlc1Byb2Nlc3NlZF0pXG5cbiAgLy8gdXNlRWZmZWN0IHBhcmEgbWFuZWphciBlbCBjaWVycmUgZGVsIG1vZGFsIGN1YW5kbyB0ZXJtaW5hbiBsb3MgYXJjaGl2b3MgZW4gY3JlYWNpw7NuIHNpbiBhY2Nlc2liaWxpZGFkXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudFxuXG4gICAgLy8gU29sbyBwcm9jZXNhciBzaTpcbiAgICAvLyAtIEVzIHVuYSBvcGVyYWNpw7NuIGRlIGNyZWFjacOzblxuICAgIC8vIC0gTm8gaGF5IGFjY2VzaWJpbGlkYWQgcGVuZGllbnRlXG4gICAgLy8gLSBMb3MgYXJjaGl2b3MgdGVybWluYXJvbiBkZSBwcm9jZXNhcnNlXG4gICAgLy8gLSBFbCBhZ2VudGUgZnVlIGNyZWFkbyBleGl0b3NhbWVudGVcbiAgICAvLyAtIEHDum4gbm8gc2UgaGEgY2VycmFkbyBlbCBtb2RhbFxuICAgIGlmIChcbiAgICAgIGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScgJiZcbiAgICAgICFjb250ZXh0Lmhhc0FjdGlvbkZpbGVzICYmXG4gICAgICBmaWxlc0ZpbmlzaGVkUmVmLmN1cnJlbnQgJiZcbiAgICAgIHN1Y2Nlc3NDcmVhdGUgJiZcbiAgICAgICFoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCAmJlxuICAgICAgIWlzU2hvd1Byb2Nlc3NGaWxlc1xuICAgICkge1xuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICBmaWxlc0ZpbmlzaGVkUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY3Rpb25GaWxlczogZmFsc2UsXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhbWJpw6luIG1hbmVqYXIgZWwgY2FzbyBjdWFuZG8gaGF5IGFjY2VzaWJpbGlkYWQgeSBhcmNoaXZvcyB0ZXJtaW5hcm9uXG4gICAgaWYgKFxuICAgICAgY29udGV4dC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJlxuICAgICAgY29udGV4dC5oYXNBY3Rpb25GaWxlcyAmJlxuICAgICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50ICYmXG4gICAgICBzdWNjZXNzQ3JlYXRlICYmXG4gICAgICAhaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgJiZcbiAgICAgICFpc1Nob3dQcm9jZXNzRmlsZXNcbiAgICApIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MpIHtcbiAgICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcbiAgICAgIH1cbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgICBvcGVyYXRpb25UeXBlOiBudWxsLFxuICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBmaWxlc1Byb2Nlc3NlZCxcbiAgICBzdWNjZXNzQ3JlYXRlLFxuICAgIHN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaXNTaG93UHJvY2Vzc0ZpbGVzLFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSxcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaGFuZGxlQ2xvc2UsXG4gIF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNTaG93UHJvY2Vzc0ZpbGVzKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gYGtub3dsZWRnZS1iYXNlLnN0YXR1czoke2FnZW50QnlJZCA/IGFnZW50QnlJZD8uaWQgOiBzdWNjZXNzQ3JlYXRlPy5pZD8udG9TdHJpbmcoKX1gXG4gICAgICBpZiAoJF9zYykge1xuICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgJF9zYz8uc3Vic2NyaWJlSGFuZGxlcihjaGFubmVsLCB3ZWJTb2NrZXRGdW5jdGlvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBtb2RlbERhdGEgPSB7XG4gICAgICAgICAgICBtb2RlbF9oYXNoOiBjaGFubmVsLFxuICAgICAgICAgICAgYWN0aW9uOiAkX3NjPy5hY3Rpb25UeXBlPy5TVUJTQ1JJQkUsXG4gICAgICAgICAgfVxuICAgICAgICAgICRfc2M/LnVwZGF0ZUNvbm5lY3Rpb25Nb2RlbChtb2RlbERhdGEsIGNoYW5uZWwsIHVzZXIsIHVzZXIsICRfc2MuY2hhbm5lbFR5cGU/Lk1PREVMX0NIQU5ORUwpXG4gICAgICAgICAgc2V0SXNTdWJzY3JpYmVkKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtpc1Nob3dQcm9jZXNzRmlsZXMsIGlzU3Vic2NyaWJlZCwgJF9zYywgYWdlbnRCeUlkLCBzdWNjZXNzQ3JlYXRlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNPcGVuIHx8ICFhZ2VudE1vZGVscy5sZW5ndGgpIHJldHVyblxuICAgIGlmIChhZ2VudExvYWRpbmcgJiYgIXByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBjb25zdCBhcHBseUVkaXRpbmdBZ2VudCA9IChzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZS50eXBlICE9PSAnY3VzdG9tJyB8fCAhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdlcnJvckFjY2Vzc0RlbmllZCcpKVxuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgfSwgMzAwMClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBzZXRNb2RhbFZhbHVlcyhwcmV2ID0+IHtcbiAgICAgICAgY29uc3QgYWdlbnRWYWx1ZXNUb1NldCA9IGJ1aWxkRWRpdGluZ01vZGFsVmFsdWVzRnJvbUFnZW50RGV0YWlsKHNvdXJjZSwgYWdlbnRNb2RlbHMsIHByZXYpXG4gICAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50ID0gYWdlbnRWYWx1ZXNUb1NldFxuICAgICAgICByZXR1cm4gYWdlbnRWYWx1ZXNUb1NldFxuICAgICAgfSlcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgIGlmIChwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCkge1xuICAgICAgICBzZXRTZWN0aW9uKHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50KVxuICAgICAgICBwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZW50SWQgPSBzb3VyY2UuaWRcbiAgICAgIGlmIChhZ2VudElkKSB7XG4gICAgICAgIGdldEFnZW50Q29ubmVjdG9ycyhhZ2VudElkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgLnRoZW4oY29ubmVjdG9ycyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0ZWQgPSBkZXJpdmVDb25uZWN0ZWRDb25uZWN0b3JTbHVncyhjb25uZWN0b3JzKVxuICAgICAgICAgICAgc2V0TW9kYWxWYWx1ZXMocHJldiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB7XG4gICAgICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5OiB7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2LmFjY2Vzc2liaWxpdHksXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbm5lY3RvcnM6IGNvbm5lY3RlZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHk6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmFjY2Vzc2liaWxpdHksXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbm5lY3RvcnM6IGNvbm5lY3RlZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGFnZW50IGNvbm5lY3RvcnM6JywgZXJyb3IpXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmV0Y2hlZCA9IHByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudFxuICAgIGlmIChwcmVmZXRjaGVkKSB7XG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhcHBseUVkaXRpbmdBZ2VudChwcmVmZXRjaGVkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGFnZW50QnlJZCAmJiAhYWdlbnRMb2FkaW5nICYmIGFnZW50TW9kZWxzLmxlbmd0aCkge1xuICAgICAgYXBwbHlFZGl0aW5nQWdlbnQoYWdlbnRCeUlkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFpc0xvYWRpbmcgJiYgIWFnZW50TG9hZGluZyAmJiAhYWdlbnRCeUlkICYmICFtb2RhbFZhbHVlcy5pc0VkaXRpbmcpIHtcbiAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZ2VuZXJhbDoge1xuICAgICAgICAgIC4uLnByZXYuZ2VuZXJhbCxcbiAgICAgICAgICBhaU1vZGVsOiBhZ2VudE1vZGVsc1swXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKVxuICAgIH1cbiAgfSwgW2FnZW50QnlJZCwgaXNPcGVuLCBpc0xvYWRpbmcsIGFnZW50TG9hZGluZywgYWdlbnRNb2RlbHM/Lmxlbmd0aCwgbW9kYWxWYWx1ZXMuaXNFZGl0aW5nLCB0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlcnJvckdldEFnZW50QnlJZCkge1xuICAgICAgaWYgKGVycm9yR2V0QWdlbnRCeUlkID09PSBcIkFjY2VzcyBkZW5pZWQ6IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoaXMgYWdlbnRcIikge1xuICAgICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ2Vycm9yQWNjZXNzRGVuaWVkJykpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgfSwgMzAwMClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKGVycm9yR2V0QWdlbnRCeUlkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIH0sIDMwMDApXG4gICAgfVxuICB9LCBbZXJyb3JHZXRBZ2VudEJ5SWRdKVxuXG4gIGNvbnN0IHNob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghbW9kYWxWYWx1ZXM/LmFjY2Vzc2liaWxpdHk/LmNsaWVudHMgfHwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5jbGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmNsaWVudHMuc29tZShjbGllbnQgPT4gY2xpZW50LmlzX2FjdGl2ZSA9PT0gZmFsc2UgfHwgY2xpZW50LmlzX2RlbGV0ZWQgPT09IHRydWUpXG4gIH0sIFttb2RhbFZhbHVlcz8uYWNjZXNzaWJpbGl0eT8uY2xpZW50c10pXG5cbiAgY29uc3QgaGFuZGxlVG9nZ2xlRmF2b3JpdGUgPSAoKSA9PiB7XG4gICAgaWYgKG1vZGFsVmFsdWVzPy5nZW5lcmFsPy5pZCkge1xuICAgICAgLy8gRXhpc3RpbmcgYWdlbnRcbiAgICAgIHRvZ2dsZUZhdm9yaXRlKFxuICAgICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLFxuICAgICAgICB1cGRhdGVkQWdlbnQgPT4ge1xuICAgICAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgICAgIC4uLnByZXYuZ2VuZXJhbCxcbiAgICAgICAgICAgICAgaXNfZmF2b3JpdGU6IHVwZGF0ZWRBZ2VudC5pc19mYXZvcml0ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLy8gQWN0dWFsaXphciBlbCBlc3RhZG8gZGUgYWdlbnRlcyB5IG9yZGVuYXIgY3VhbmRvIHNlIGhhY2UgZGVzZGUgZWwgbW9kYWwgQUJNXG4gICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZSh1cGRhdGVkQWdlbnQsIHRydWUpXG4gICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7XG4gICAgICAgICAgICBvcHRpb246IHVwZGF0ZWRBZ2VudC5pc19mYXZvcml0ZSA/ICdhZGQnIDogJ3JlbW92ZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBtb2RhbFZhbHVlcz8uZ2VuZXJhbD8uaXNfZmF2b3JpdGVcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBhZ2VudFxuICAgICAgc2V0TW9kYWxWYWx1ZXMocHJldiA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgLi4ucHJldi5nZW5lcmFsLFxuICAgICAgICAgIGlzX2Zhdm9yaXRlOiAhcHJldi5nZW5lcmFsLmlzX2Zhdm9yaXRlLFxuICAgICAgICB9LFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc09wZW4gfHwgKCF1c2VyUGVybWlzc2lvbnM/LmNyZWF0ZSAmJiAhdXNlclBlcm1pc3Npb25zPy5lZGl0ICYmICF1c2VyUGVybWlzc2lvbnM/LmRlbGV0ZSkpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChcbiAgICA8QmFja2Ryb3AgekluZGV4PXthYm1BZ2VudE1vZGFsWkluZGV4fSBvbkNsaWNrPXtoYW5kbGVCYWNrZHJvcENsaWNrfT5cbiAgICAgIDxTQ0FBTVdyYXBwZXIgcmVmPXttb2RhbFJlZn0gdGFiSW5kZXg9ey0xfT5cbiAgICAgICAge2lzTG9hZGluZyA/IChcbiAgICAgICAgICA8U0NBQU1XcmFwcGVyU3Bpbm5lcj5cbiAgICAgICAgICAgIDxTQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudD5cbiAgICAgICAgICAgICAgPFNwaW5uZXJMb3R0aWUgc2l6ZT1cIjgwcHhcIiBjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgICAgICAgICAgPC9TQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudD5cbiAgICAgICAgICA8L1NDQUFNV3JhcHBlclNwaW5uZXI+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIHtpc1Nob3dQcm9jZXNzRmlsZXMgJiYgaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgPyAoXG4gICAgICAgICAgICAgIDxBYm1Mb2FkZXJGaWxlc1xuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzPXttb2RhbFZhbHVlcy5rbm93bGVkZ2V9XG4gICAgICAgICAgICAgICAgbGFiZWw9e3QoYHByb2Nlc3NpbmdLbm93bGVkZ2UuJHttb2RhbFZhbHVlcy5pc0VkaXRpbmcgPyAnZGVzY3JpcHRpb25VcGRhdGUnIDogJ2Rlc2NyaXB0aW9uQ3JlYXRlJ31gKX1cbiAgICAgICAgICAgICAgICBvblRpbWVvdXQ9e2hhbmRsZVByb2Nlc3NGaWxlc1RpbWVvdXR9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlckxlZnQ+XG4gICAgICAgICAgICAgICAgICAgIDxUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgekluZGV4PXt0b29sdGlwWkluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsVmFsdWVzPy5nZW5lcmFsPy5pc19mYXZvcml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHQoJ2dlbmVyYWxTZWN0aW9uLnJlbW92ZUZhdm9yaXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0KCdnZW5lcmFsU2VjdGlvbi5hZGRGYXZvcml0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDQUFNSGVhZGVyRmF2b3JpdGUgb25DbGljaz17aGFuZGxlVG9nZ2xlRmF2b3JpdGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezIwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezIwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17bW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlID8gJyNGRkM2MjQnIDogJyNhNmE2YTYnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPXttb2RhbFZhbHVlcz8uZ2VuZXJhbD8uaXNfZmF2b3JpdGUgPyAnI0ZGQzYyNCcgOiAnbm9uZSd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzb2xpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17bW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlID8gJycgOiAnc3Rhci1mYXZvcml0ZS1pY29uJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTUhlYWRlckZhdm9yaXRlPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlclRpdGxlPnttb2RhbFZhbHVlcz8uaXNFZGl0aW5nID8gdCgnZWRpdEFnZW50JykgOiB0KCduZXdBZ2VudCcpfTwvU0NBQU1IZWFkZXJUaXRsZT5cbiAgICAgICAgICAgICAgICAgIDwvU0NBQU1IZWFkZXJMZWZ0PlxuICAgICAgICAgICAgICAgICAgPFNDQUFNSGVhZGVyQ2xvc2VCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5jYW5jZWxNb2RhbClcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmcgfHwgaXNMb2FkaW5nS25vd2xlZGdlIHx8IGlzTG9hZGluZ0NyZWF0ZSB8fCBpc0xvYWRpbmdVcGRhdGVBY2Nlc3N9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxDcm9zcyBjb2xvcj1cIiNhNmE2YTZcIiB3aWR0aD17MjB9IGhlaWdodD17MjB9IC8+XG4gICAgICAgICAgICAgICAgICA8L1NDQUFNSGVhZGVyQ2xvc2VCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TQ0FBTUhlYWRlcj5cbiAgICAgICAgICAgICAgICA8U0NBQU1Db250ZW50IGhhc1Njcm9sbD17c2VjdGlvbiAhPT0gJ2tub3dsZWRnZSd9PlxuICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhcj5cbiAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17c2VjdGlvbiA9PT0gJ2dlbmVyYWwnfVxuICAgICAgICAgICAgICAgICAgICAgICRpbmRleD17MH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVTZWN0aW9uQ2hhbmdlKCdnZW5lcmFsJyl9XG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhYm0tYWdlbnQtbW9kYWwtZ2VuZXJhbFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtgJHtzZWN0aW9uID09PSAnZ2VuZXJhbCcgPyAncmdiYSg2MywgNjMsIDYzLCAxKScgOiAncmdiYSgxNjYsIDE2NiwgMTY2LCAxKSd9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTh9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVRpdGxlIGlzQWN0aXZlPXtzZWN0aW9uID09PSAnZ2VuZXJhbCd9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3QoJ2dlbmVyYWxTZWN0aW9uLnRpdGxlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNpZGViYXJJdGVtVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbT5cblxuICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlPXtzZWN0aW9uID09PSAna25vd2xlZGdlJ31cbiAgICAgICAgICAgICAgICAgICAgICAkaW5kZXg9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2VjdGlvbkNoYW5nZSgna25vd2xlZGdlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxCcmFpbkljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtgJHtzZWN0aW9uID09PSAna25vd2xlZGdlJyA/ICdyZ2JhKDYzLCA2MywgNjMsIDEpJyA6ICdyZ2JhKDE2NiwgMTY2LCAxNjYsIDEpJ31gfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE4fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXJJdGVtVGl0bGUgaXNBY3RpdmU9e3NlY3Rpb24gPT09ICdrbm93bGVkZ2UnfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KCdrbm93bGVkZ2VTZWN0aW9uLnRpdGxlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNpZGViYXJJdGVtVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbT5cblxuICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlPXtzZWN0aW9uID09PSAnYWNjZXNzaWJpbGl0eSd9XG4gICAgICAgICAgICAgICAgICAgICAgJGluZGV4PXsyfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlY3Rpb25DaGFuZ2UoJ2FjY2Vzc2liaWxpdHknKX1cbiAgICAgICAgICAgICAgICAgICAgICBpZD1cImFibS1hZ2VudC1tb2RhbC1hY2Nlc3NpYmlsaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmlsaXR5SWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9e2Ake3NlY3Rpb24gPT09ICdhY2Nlc3NpYmlsaXR5JyA/ICdyZ2JhKDYzLCA2MywgNjMsIDEpJyA6ICdyZ2JhKDE2NiwgMTY2LCAxNjYsIDEpJ31gfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE4fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXJJdGVtVGl0bGUgaXNBY3RpdmU9e3NlY3Rpb24gPT09ICdhY2Nlc3NpYmlsaXR5J30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dCgnYWNjZXNzaWJpbGl0eVNlY3Rpb24udGl0bGVUYWInKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhckl0ZW1UaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICB7c2hvdWxkRGlzYWJsZVNhdmVGb3JDbGllbnRzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwIHRpdGxlPXt0KCdhY2Nlc3NpYmlsaXR5U2VjdGlvbi5jbGllbnRzRXJyb3InKX0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1FcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWxlcnQgY29sb3I9XCIjQzcwNTA1XCIgd2lkdGg9XCIxNnB4XCIgaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbUVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbT5cbiAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFyPlxuICAgICAgICAgICAgICAgICAge1NlY3Rpb25CeUtleVtzZWN0aW9uXSh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogbW9kYWxWYWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiBoYW5kbGVTZXRBZ2VudFZhbHVlc0J5S2V5cyxcbiAgICAgICAgICAgICAgICAgICAgYWdlbnRNb2RlbHMsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0tub3dsZWRnZTogW10sXG4gICAgICAgICAgICAgICAgICAgIG5ld0tub3dsZWRnZTogW10sXG4gICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlRXhpc3RpbmdLbm93bGVkZ2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgICAgICAgICBvblJlbW92ZU5ld0tub3dsZWRnZTogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgICAgIG9uRmlsZUVycm9yQ2hhbmdlOiBzZXRIYXNGaWxlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwWkluZGV4LFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC9TQ0FBTUNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPFNDQUFNRm9vdGVyIGlzRWRpdGluZz17ISFtb2RhbFZhbHVlcz8uaXNFZGl0aW5nICYmICEhdXNlclBlcm1pc3Npb25zPy5kZWxldGV9PlxuICAgICAgICAgICAgICAgICAgeyEhbW9kYWxWYWx1ZXM/LmlzRWRpdGluZyAmJlxuICAgICAgICAgICAgICAgICAgICAhIXVzZXJQZXJtaXNzaW9ucz8uZGVsZXRlICYmXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8U0NBQU1EZWxldGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q1VCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbldpdGhJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TW9kYWxEZWxldGUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZyB8fCBpc0xvYWRpbmdLbm93bGVkZ2UgfHwgaXNMb2FkaW5nQ3JlYXRlIHx8IGlzTG9hZGluZ1VwZGF0ZUFjY2Vzc31cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFdyYXBwZXJDZW50ZXJJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUcmFzaCBjb2xvcj1cIiMwOGNcIiB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoJ2RlbGV0ZUFnZW50Jyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvV3JhcHBlckNlbnRlckljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0NVQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NBQU1EZWxldGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAnMjRweCcgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNhdmVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICF2YWxpZGF0ZUZpZWxkVmFsdWVzKG1vZGFsVmFsdWVzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBZ2VudFZhbHVlc0lzU2FtZSgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0tub3dsZWRnZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nQ3JlYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdVcGRhdGVBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRmlsZUVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxDVUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29uZmlybUFjdGlvbihudWxsLCAnY3JlYXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICF2YWxpZGF0ZUZpZWxkVmFsdWVzKG1vZGFsVmFsdWVzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUFnZW50VmFsdWVzSXNTYW1lKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0tub3dsZWRnZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdDcmVhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nVXBkYXRlQWNjZXNzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNGaWxlRXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge21vZGFsVmFsdWVzLmlzRWRpdGluZyA/IHQoJ3NhdmVDaGFuZ2VzJykgOiB0KCdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9DVUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNhdmVCdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1NDQUFNRm9vdGVyPlxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L1NDQUFNV3JhcHBlcj5cbiAgICAgIHtzaG93TW9kYWxEZWxldGUgJiYgKFxuICAgICAgICA8RGVsZXRlUXVlc3Rpb25Nb2RhbFxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dNb2RhbERlbGV0ZShmYWxzZSl9XG4gICAgICAgICAgaGFuZGxlcnM9e3tcbiAgICAgICAgICAgIGhhbmRsZUNvbmZpcm1BY3Rpb246IChwcm9wczogYW55KSA9PiBoYW5kbGVDb25maXJtQWN0aW9uKHByb3BzLCAnZGVsZXRlJyksXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjaGF0PXt7IHRpdGxlOiBtb2RhbFZhbHVlcy5nZW5lcmFsLm5hbWUsIGlkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkIH19XG4gICAgICAgICAgYWN0aW9uPVwiYWdlbnRcIlxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L0JhY2tkcm9wPixcbiAgICBzZWxlY3RvclxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsV0FBVyxRQUFRLE9BQU87QUFDekUsU0FBU0MsWUFBWSxRQUFRLFdBQVc7QUFDeEMsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFFOUMsU0FBU0MsUUFBUSxRQUFRLDRDQUE0QztBQUNyRSxTQUFTQyxRQUFRLFFBQVEsMkNBQTJDO0FBQ3BFLFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsS0FBSyxRQUFRLHdDQUF3QztBQUM5RCxTQUFTQyxJQUFJLFFBQVEsdUNBQXVDO0FBQzVELFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsYUFBYSxRQUFRLHVEQUF1RDtBQUNyRixTQUFTQyxPQUFPLFFBQVEsOENBQThDO0FBQ3RFLFNBQVNDLHVCQUF1QixRQUFRLDRFQUE0RTtBQUNwSCxTQUFTQyxRQUFRLFFBQVEsc0JBQXNCO0FBQy9DLFNBQVNDLE9BQU8sUUFBUSwyQkFBMkI7QUFDbkQsU0FBU0MsaUJBQWlCLEVBQUVDLFNBQVMsUUFBUSxtQkFBbUI7QUFDaEUsU0FBU0MsYUFBYSxRQUFRLDRDQUE0QztBQUUxRSxTQUFTQyxlQUFlLFFBQVEsNENBQTRDO0FBRTVFLFNBQVNDLGlCQUFpQixFQUFFQyxtQkFBbUIsUUFBUSw0QkFBNEI7QUFFbkYsU0FDRUMsWUFBWSxFQUNaQyxXQUFXLEVBQ1hDLFdBQVcsRUFDWEMsZ0JBQWdCLEVBQ2hCQyxlQUFlLEVBQ2ZDLG1CQUFtQixFQUNuQkMsc0JBQXNCLEVBQ3RCQyxZQUFZLEVBQ1pDLFlBQVksRUFDWkMsZ0JBQWdCLEVBQ2hCQyxxQkFBcUIsRUFDckJDLGlCQUFpQixFQUNqQkMsZUFBZSxFQUNmQyxtQkFBbUIsRUFDbkJDLDBCQUEwQixFQUMxQkMscUJBQXFCLFFBQ2hCLHdCQUF3QjtBQUMvQixTQUFTQyxjQUFjLFFBQVEsNkNBQTZDO0FBQzVFLFNBQVNDLGNBQWMsUUFBUSw2Q0FBNkM7QUFDNUUsU0FBU0Msa0JBQWtCLFFBQVEsc0RBQXNEO0FBQ3pGLFNBQVNDLGdCQUFnQixRQUFRLGlDQUFpQztBQUNsRSxTQUFTQyxjQUFjLFFBQVEsNkNBQTZDO0FBQzVFLFNBQVNDLHNCQUFzQixRQUFRLDZCQUE2QjtBQUNwRSxTQUFTQyxjQUFjLFFBQVEsMkNBQTJDO0FBQzFFLFNBQVNDLGlCQUFpQixRQUFRLCtCQUErQjtBQUNqRSxTQUFTQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSx5QkFBeUI7QUFDMUQsU0FBU0MsbUJBQW1CLFFBQVEsNENBQTRDO0FBQ2hGLFNBQVNDLHNCQUFzQixRQUFRLHVDQUF1QztBQUM5RSxTQUFTQyxlQUFlLFFBQVEsZ0RBQWdEO0FBQ2hGLFNBQVNDLGlCQUFpQixRQUFRLGdCQUFnQjtBQUNsRCxTQUFTQyw2QkFBNkIsRUFBRUMsa0NBQWtDLFFBQVEseUNBQXlDO0FBQzNILFNBQVNDLGtCQUFrQixRQUFRLDBDQUEwQztBQUFBLFNBQUFDLEdBQUEsSUFBQUMsSUFBQSxFQUFBQyxJQUFBLElBQUFDLEtBQUEsRUFBQUMsUUFBQSxJQUFBQyxTQUFBO0FBRTdFLElBQU1DLGFBQWEsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDbENDLFNBQVMsRUFBRSxLQUFLO0VBQ2hCQyxTQUFTLEVBQUUsRUFBRTtFQUNiQyxPQUFPLEVBQUU7SUFDUEMsSUFBSSxFQUFFLEVBQUU7SUFDUkMsS0FBSyxFQUFFLEVBQUU7SUFDVEMsWUFBWSxFQUFFLEVBQUU7SUFDaEJDLGdCQUFnQixFQUFFLEVBQUU7SUFDcEJDLFFBQVEsRUFBRSxLQUFLO0lBQ2ZDLE9BQU8sRUFBRSxJQUFJO0lBQ2JDLEVBQUUsRUFBRSxJQUFJO0lBQ1JDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCQyxjQUFjLEVBQUUsRUFBRTtJQUNsQkMsV0FBVyxFQUFFO0VBQ2YsQ0FBQztFQUNEQyxhQUFhLEVBQUU7SUFDYkMsVUFBVSxFQUFFLFNBQVM7SUFDckJDLE9BQU8sRUFBRSxJQUFJO0lBQ2JDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCQyxrQkFBa0IsRUFBRTtFQUN0QjtBQUNGLENBQUMsQ0FBQztBQUlGLE9BQU8sSUFBTUMsWUFBWSxHQUFHO0VBQzFCaEIsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUdpQixLQWNUO0lBQUEsb0JBQUszQixJQUFBLENBQUNwQyxpQkFBaUIsRUFBQWdFLGFBQUEsS0FBS0QsS0FBSyxDQUFHLENBQUM7RUFBQTtFQUN0Q2xCLFNBQVMsRUFBRSxTQUFYQSxTQUFTQSxDQUFHa0IsS0FTWDtJQUFBLG9CQUFLM0IsSUFBQSxDQUFDbkMsbUJBQW1CLEVBQUErRCxhQUFBLEtBQUtELEtBQUssQ0FBRyxDQUFDO0VBQUE7RUFDeENOLGFBQWEsRUFBRSxTQUFmQSxhQUFhQSxDQUFHTSxLQUdmO0lBQUEsb0JBQUszQixJQUFBLENBQUMzQyx1QkFBdUIsRUFBQXVFLGFBQUEsS0FBS0QsS0FBSyxDQUFHLENBQUM7RUFBQTtBQUM5QyxDQUFDO0FBVUQsSUFBTUUsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBSUMsZUFBNEIsRUFBSztFQUM1RCxJQUFJLENBQUNBLGVBQWUsQ0FBQ3BCLE9BQU8sQ0FBQ0MsSUFBSSxJQUFJLENBQUNtQixlQUFlLENBQUNwQixPQUFPLENBQUNRLFVBQVUsRUFBRTtJQUN4RSxPQUFPLEtBQUs7RUFDZDtFQUNBLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQSxTQUFTYSxzQ0FBc0NBLENBQzdDQyxTQUFjLEVBQ2RDLFdBQXlCLEVBQ3pCQyxJQUFpQixFQUNKO0VBQUEsSUFBQUMscUJBQUEsRUFBQUMsa0JBQUE7RUFDYixJQUFNQyxVQUFVLEdBQUdKLFdBQVcsQ0FBQ0ssSUFBSSxDQUFDLFVBQUFDLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUN0QixFQUFFLEtBQUtlLFNBQVMsQ0FBQ1EsU0FBUztFQUFBLEVBQUM7RUFDOUUsT0FBQVosYUFBQSxDQUFBQSxhQUFBLEtBQ0tNLElBQUk7SUFDUDFCLFNBQVMsRUFBRSxJQUFJO0lBQ2ZFLE9BQU8sRUFBRTtNQUNQRSxLQUFLLEVBQUVvQixTQUFTLENBQUNwQixLQUFLO01BQ3RCRCxJQUFJLEVBQUVxQixTQUFTLENBQUNyQixJQUFJO01BQ3BCRSxZQUFZLEVBQUVtQixTQUFTLENBQUNuQixZQUFZO01BQ3BDQyxnQkFBZ0IsRUFBRWtCLFNBQVMsQ0FBQ2xCLGdCQUFnQjtNQUM1Q0MsUUFBUSxFQUFFaUIsU0FBUyxDQUFDakIsUUFBUTtNQUM1QkMsT0FBTyxFQUFFcUIsVUFBVSxJQUFJLElBQUk7TUFDM0JwQixFQUFFLEVBQUVlLFNBQVMsQ0FBQ2YsRUFBRTtNQUNoQkMsVUFBVSxFQUFFYyxTQUFTLENBQUNkLFVBQVU7TUFDaENDLGNBQWMsRUFBRSxFQUFFO01BQ2xCQyxXQUFXLEVBQUVZLFNBQVMsQ0FBQ1osV0FBVztNQUNsQ3FCLFVBQVUsRUFBRVQsU0FBUyxDQUFDVTtJQUN4QixDQUFDO0lBQ0RqQyxTQUFTLEVBQ1AsRUFBQTBCLHFCQUFBLEdBQUFILFNBQVMsQ0FBQ2IsY0FBYyxjQUFBZ0IscUJBQUEsdUJBQXhCQSxxQkFBQSxDQUEwQlEsR0FBRyxDQUFDLFVBQUNDLENBQU07TUFBQSxPQUFNO1FBQ3pDQyxJQUFJLEVBQUUsSUFBSUMsSUFBSSxDQUFDLEVBQUUsRUFBRUYsQ0FBQyxDQUFDRyxRQUFRLENBQUM7UUFDOUI5QixFQUFFLEVBQUUyQixDQUFDLENBQUMzQixFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQztRQUNuQnJDLElBQUksRUFBRWlDLENBQUMsQ0FBQ0csUUFBUTtRQUNoQkUsSUFBSSxFQUFFTCxDQUFDLENBQUNNLGVBQWUsSUFBSSxDQUFDO1FBQzVCQyxJQUFJLEVBQUVQLENBQUMsQ0FBQ1Esa0JBQWtCO1FBQzFCQyxNQUFNLEVBQUVULENBQUMsQ0FBQ1MsTUFBTTtRQUNoQkMsWUFBWSxFQUFFVixDQUFDLENBQUNVLFlBQVksSUFBSUMsU0FBUztRQUN6Q0MsYUFBYSxFQUFFWixDQUFDLENBQUNZLGFBQWEsSUFBSUQ7TUFDcEMsQ0FBQztJQUFBLENBQUMsQ0FBQyxLQUFJLEVBQUU7SUFDWGxDLGFBQWEsRUFBRTtNQUNiQyxVQUFVLEVBQUVVLFNBQVMsQ0FBQ3lCLE1BQU07TUFDNUJsQyxPQUFPLEVBQ0wsRUFBQWEsa0JBQUEsR0FBQUosU0FBUyxDQUFDVCxPQUFPLGNBQUFhLGtCQUFBLHVCQUFqQkEsa0JBQUEsQ0FBbUJPLEdBQUcsQ0FBQyxVQUFDZSxNQUFXO1FBQUEsSUFBQUMsVUFBQSxFQUFBQyxpQkFBQSxFQUFBQyxrQkFBQTtRQUFBLE9BQU07VUFDdkM1QyxFQUFFLEVBQUUsRUFBQTBDLFVBQUEsR0FBQUQsTUFBTSxDQUFDekMsRUFBRSxjQUFBMEMsVUFBQSx1QkFBVEEsVUFBQSxDQUFXWCxRQUFRLENBQUMsQ0FBQyxLQUFJLEVBQUU7VUFDL0JyQyxJQUFJLEVBQUUrQyxNQUFNLENBQUMvQyxJQUFJO1VBQ2pCbUQsU0FBUyxHQUFBRixpQkFBQSxHQUFFRixNQUFNLENBQUNJLFNBQVMsY0FBQUYsaUJBQUEsY0FBQUEsaUJBQUEsR0FBSSxLQUFLO1VBQ3BDRyxVQUFVLEdBQUFGLGtCQUFBLEdBQUVILE1BQU0sQ0FBQ0ssVUFBVSxjQUFBRixrQkFBQSxjQUFBQSxrQkFBQSxHQUFJO1FBQ25DLENBQUM7TUFBQSxDQUFDLENBQUMsS0FBSSxJQUFJO01BQ2JyQyxVQUFVLEVBQUUzQixrQ0FBa0MsQ0FBQ21DLFNBQVMsQ0FBQ2dDLGNBQWMsQ0FBQztNQUN4RXZDLGtCQUFrQixFQUFFO0lBQ3RCO0VBQUM7QUFFTDtBQUVBLE9BQU8sSUFBTXdDLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBQUMsSUFBQSxFQU1BO0VBQUEsSUFBQUMsaUJBQUEsRUFBQUMsc0JBQUEsRUFBQUMscUJBQUEsRUFBQUMscUJBQUEsRUFBQUMscUJBQUEsRUFBQUMscUJBQUE7RUFBQSxJQUx4QkMsUUFBUSxHQUFBUCxJQUFBLENBQVJPLFFBQVE7SUFDUkMsV0FBVyxHQUFBUixJQUFBLENBQVhRLFdBQVc7SUFDWEMsV0FBVyxHQUFBVCxJQUFBLENBQVhTLFdBQVc7SUFDWEMsbUJBQW1CLEdBQUFWLElBQUEsQ0FBbkJVLG1CQUFtQjtJQUNuQkMsZ0JBQWdCLEdBQUFYLElBQUEsQ0FBaEJXLGdCQUFnQjtFQUVoQixJQUFNQyxJQUFJLEdBQUd2SCxPQUFPLENBQUMsQ0FBQztFQUN0QixJQUFNd0gsY0FBYyxHQUFHeEYsUUFBUSxDQUFDLENBQUM7RUFDakMsSUFBQXlGLGVBQUEsR0FBY3BJLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztJQUF6Q3FJLENBQUMsR0FBQUQsZUFBQSxDQUFEQyxDQUFDO0VBQ1Q7RUFDQSxJQUFBQyxpQkFBQSxHQUFxRGpHLGdCQUFnQixDQUFDLENBQUM7SUFBeERrRyxvQkFBb0IsR0FBQUQsaUJBQUEsQ0FBM0JFLEtBQUs7SUFBd0JDLFdBQVcsR0FBQUgsaUJBQUEsQ0FBWEcsV0FBVztFQUNoRCxJQUFNQyxtQkFBbUIsR0FBRzdGLHNCQUFzQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUM7RUFDdEUsSUFBTThGLGFBQWEsR0FBRzlGLHNCQUFzQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUM7RUFDakUsSUFBQStGLGtCQUFBLEdBQTJCN0YsaUJBQWlCLENBQUMsQ0FBQztJQUF0QzhGLGNBQWMsR0FBQUQsa0JBQUEsQ0FBZEMsY0FBYztFQUN0QixJQUFNQyxRQUFRLEdBQUdDLFFBQVEsQ0FBQ0MsY0FBYyxDQUFDLGlCQUFpQixDQUFDO0VBQzNELElBQUFDLFNBQUEsR0FBd0NwSixRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFxSixVQUFBLEdBQUFDLGNBQUEsQ0FBQUYsU0FBQTtJQUFoREcsWUFBWSxHQUFBRixVQUFBO0lBQUVHLGVBQWUsR0FBQUgsVUFBQTtFQUNwQyxJQUFNSSxRQUFRLEdBQUcxSixNQUFNLENBQWlCLElBQUksQ0FBQztFQUM3QyxJQUFNMkosa0JBQWtCLEdBQUczSixNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ3hDLElBQU00SixjQUFjLEdBQUc1SixNQUFNLENBQU07SUFDakM2SixRQUFRLEVBQUUsRUFBRTtJQUNaQyxRQUFRLEVBQUU7RUFDWixDQUFDLENBQUM7RUFDRixJQUFNQyxtQkFBbUIsR0FBRy9KLE1BQU0sQ0FNL0I7SUFDRGdLLGNBQWMsRUFBRSxLQUFLO0lBQ3JCQyxhQUFhLEVBQUUsS0FBSztJQUNwQkMsY0FBYyxFQUFFLEtBQUs7SUFDckJDLGFBQWEsRUFBRSxJQUFJO0lBQ25CQyxhQUFhLEVBQUU7RUFDakIsQ0FBQyxDQUFDO0VBQ0YsSUFBTUMsZ0JBQWdCLEdBQUdySyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ3RDLElBQU1zSyxlQUFlLEdBQUd0SyxNQUFNLENBQWdCLElBQUksQ0FBQztFQUNuRCxJQUFNdUssd0JBQXdCLEdBQUd2SyxNQUFNLENBQW9CLElBQUksQ0FBQztFQUNoRSxJQUFNd0ssc0JBQXNCLEdBQUd4SyxNQUFNLENBQU0sSUFBSSxDQUFDO0VBQ2hELElBQU15SyxnQkFBZ0IsR0FBR3pLLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDdEM7RUFDQTtFQUNBO0VBQ0EsSUFBTTBLLHVCQUF1QixHQUFHMUssTUFBTSxDQUFDLEtBQUssQ0FBQztFQUM3QyxJQUFBMkssVUFBQSxHQUE0QzFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFBQTJLLFVBQUEsR0FBQXJCLGNBQUEsQ0FBQW9CLFVBQUE7SUFBaERFLGNBQWMsR0FBQUQsVUFBQTtJQUFFRSxpQkFBaUIsR0FBQUYsVUFBQTtFQUN4QyxJQUFBRyxVQUFBLEdBQTRCOUssUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBK0ssVUFBQSxHQUFBekIsY0FBQSxDQUFBd0IsVUFBQTtJQUFwQ0UsTUFBTSxHQUFBRCxVQUFBO0lBQUVFLFNBQVMsR0FBQUYsVUFBQTtFQUN4QixJQUFBRyxVQUFBLEdBQThDbEwsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUFBbUwsVUFBQSxHQUFBN0IsY0FBQSxDQUFBNEIsVUFBQTtJQUF0REUsZUFBZSxHQUFBRCxVQUFBO0lBQUVFLGtCQUFrQixHQUFBRixVQUFBO0VBQzFDLElBQUFHLFVBQUEsR0FBOEJ0TCxRQUFRLENBQWEsU0FBUyxDQUFDO0lBQUF1TCxVQUFBLEdBQUFqQyxjQUFBLENBQUFnQyxVQUFBO0lBQXRERSxPQUFPLEdBQUFELFVBQUE7SUFBRUUsVUFBVSxHQUFBRixVQUFBO0VBQzFCLElBQUFHLFVBQUEsR0FBa0MxTCxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUEyTCxXQUFBLEdBQUFyQyxjQUFBLENBQUFvQyxVQUFBO0lBQTFDRSxTQUFTLEdBQUFELFdBQUE7SUFBRUUsWUFBWSxHQUFBRixXQUFBO0VBQzlCLElBQUFHLFdBQUEsR0FBc0M5TCxRQUFRLENBSzNDNEQsYUFBYSxDQUFDO0lBQUFtSSxXQUFBLEdBQUF6QyxjQUFBLENBQUF3QyxXQUFBO0lBTFZFLFdBQVcsR0FBQUQsV0FBQTtJQUFFRSxjQUFjLEdBQUFGLFdBQUE7RUFNbEMsSUFBQUcsZ0JBQUEsR0FNSWhMLGVBQWUsQ0FBQyxDQUFDO0lBTFZpTCxZQUFZLEdBQUFELGdCQUFBLENBQXJCRSxPQUFPO0lBQ1BDLGtCQUFrQixHQUFBSCxnQkFBQSxDQUFsQkcsa0JBQWtCO0lBQ1g5RyxTQUFTLEdBQUEyRyxnQkFBQSxDQUFoQnZELEtBQUs7SUFDTDJELGdCQUFnQixHQUFBSixnQkFBQSxDQUFoQkksZ0JBQWdCO0lBQ1RDLGlCQUFpQixHQUFBTCxnQkFBQSxDQUF4Qk0sS0FBSztFQUVQLElBQUFDLGNBQUEsR0FBMkN4TCxhQUFhLENBQUMsQ0FBQztJQUFsRHVFLFdBQVcsR0FBQWlILGNBQUEsQ0FBWGpILFdBQVc7SUFBRWtILGlCQUFpQixHQUFBRCxjQUFBLENBQWpCQyxpQkFBaUI7RUFDdEMsSUFBTUMsZUFBZSxHQUFHNU0sTUFBTSxDQUFNLElBQUksQ0FBQztFQUN6QyxJQUFBNk0sV0FBQSxHQUFvRDVNLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFBQTZNLFdBQUEsR0FBQXZELGNBQUEsQ0FBQXNELFdBQUE7SUFBNURFLGtCQUFrQixHQUFBRCxXQUFBO0lBQUVFLHFCQUFxQixHQUFBRixXQUFBO0VBQ2hELElBQUFHLFdBQUEsR0FBMENoTixRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFpTixXQUFBLEdBQUEzRCxjQUFBLENBQUEwRCxXQUFBO0lBQWxERSxhQUFhLEdBQUFELFdBQUE7SUFBRUUsZ0JBQWdCLEdBQUFGLFdBQUE7RUFFdEMsSUFBTUcsZUFBZSxHQUFHL0UsSUFBSSxhQUFKQSxJQUFJLGdCQUFBWCxpQkFBQSxHQUFKVyxJQUFJLENBQUVnRixXQUFXLGNBQUEzRixpQkFBQSx1QkFBakJBLGlCQUFBLENBQW1CNEYsU0FBUztFQUVwRCxJQUFBQyxlQUFBLEdBQW9FakwsY0FBYyxDQUFDLENBQUM7SUFBNUVrTCxpQkFBaUIsR0FBQUQsZUFBQSxDQUFqQkMsaUJBQWlCO0lBQVdDLGFBQWEsR0FBQUYsZUFBQSxDQUF0QkcsT0FBTztJQUFpQkMsWUFBWSxHQUFBSixlQUFBLENBQVpJLFlBQVk7RUFDL0QsSUFBQUMsZUFBQSxHQUF3Rm5MLGNBQWMsQ0FBQyxDQUFDO0lBQWhHb0wsaUJBQWlCLEdBQUFELGVBQUEsQ0FBakJDLGlCQUFpQjtJQUFXQyxhQUFhLEdBQUFGLGVBQUEsQ0FBdEJGLE9BQU87SUFBK0JLLGtCQUFrQixHQUFBSCxlQUFBLENBQWhDRCxZQUFZO0VBRS9ELElBQUFLLGVBQUEsR0FLSTNMLGNBQWMsQ0FBQyxDQUFDO0lBSmxCNEwsaUJBQWlCLEdBQUFELGVBQUEsQ0FBakJDLGlCQUFpQjtJQUNOQyxlQUFlLEdBQUFGLGVBQUEsQ0FBMUJwQyxTQUFTO0lBQ0F1QyxhQUFhLEdBQUFILGVBQUEsQ0FBdEJOLE9BQU87SUFDT1Usa0JBQWtCLEdBQUFKLGVBQUEsQ0FBaENMLFlBQVk7RUFHZCxJQUFBVSxtQkFBQSxHQUF1RDlMLGtCQUFrQixDQUFDLENBQUM7SUFBbkUrTCxxQkFBcUIsR0FBQUQsbUJBQUEsQ0FBckJDLHFCQUFxQjtJQUFFQyxtQkFBbUIsR0FBQUYsbUJBQUEsQ0FBbkJFLG1CQUFtQjtFQUVsRCxJQUFBQyxxQkFBQSxHQVNJOUwsc0JBQXNCLENBQUMsQ0FBQztJQVIxQitMLHNCQUFzQixHQUFBRCxxQkFBQSxDQUF0QkMsc0JBQXNCO0lBQ3RCQyxzQkFBc0IsR0FBQUYscUJBQUEsQ0FBdEJFLHNCQUFzQjtJQUN0QkMsK0JBQStCLEdBQUFILHFCQUFBLENBQS9CRywrQkFBK0I7SUFDcEJDLGtCQUFrQixHQUFBSixxQkFBQSxDQUE3QjVDLFNBQVM7SUFDRmlELGNBQWMsR0FBQUwscUJBQUEsQ0FBckJoQyxLQUFLO0lBQ1VzQyxzQkFBc0IsR0FBQU4scUJBQUEsQ0FBckNmLGFBQWE7SUFDYnNCLHNCQUFzQixHQUFBUCxxQkFBQSxDQUF0Qk8sc0JBQXNCO0lBQ3RCQyx3QkFBd0IsR0FBQVIscUJBQUEsQ0FBeEJRLHdCQUF3QjtFQUcxQixJQUFBQyxnQkFBQSxHQUtJaE0sZUFBZSxDQUFDLENBQUM7SUFKbkJpTSxrQkFBa0IsR0FBQUQsZ0JBQUEsQ0FBbEJDLGtCQUFrQjtJQUNUQyxtQkFBbUIsR0FBQUYsZ0JBQUEsQ0FBNUJ2QixPQUFPO0lBQ0kwQixxQkFBcUIsR0FBQUgsZ0JBQUEsQ0FBaENyRCxTQUFTO0lBQ1d5RCx3QkFBd0IsR0FBQUosZ0JBQUEsQ0FBNUNLLGtCQUFrQjtFQUdwQixJQUFJLENBQUNyRyxRQUFRLEVBQUUsT0FBTyxJQUFJO0VBRTFCLElBQU1zRyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXFCQSxDQUFJQyxRQUFzQixFQUFFQyxRQUFzQixFQUFLO0lBQ2hGLElBQUksQ0FBQ0QsUUFBUSxJQUFJLENBQUNDLFFBQVEsRUFBRSxPQUFPLElBQUk7SUFDdkMsSUFBSSxDQUFDRCxRQUFRLElBQUksQ0FBQ0MsUUFBUSxFQUFFLE9BQU8sS0FBSztJQUN4QyxJQUFJRCxRQUFRLENBQUNFLE1BQU0sS0FBS0QsUUFBUSxDQUFDQyxNQUFNLEVBQUUsT0FBTyxLQUFLO0lBRXJELElBQU1DLFdBQVcsR0FBR0gsUUFBUSxDQUFDdEosR0FBRyxDQUFDLFVBQUEwSixDQUFDO01BQUEsT0FBSUEsQ0FBQyxDQUFDQyxRQUFRO0lBQUEsRUFBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxJQUFNQyxXQUFXLEdBQUdOLFFBQVEsQ0FBQ3ZKLEdBQUcsQ0FBQyxVQUFBMEosQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQ0MsUUFBUTtJQUFBLEVBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7SUFFeEQsT0FBT0gsV0FBVyxDQUFDSyxLQUFLLENBQUMsVUFBQ3hMLEVBQUUsRUFBRXlMLEtBQUs7TUFBQSxPQUFLekwsRUFBRSxLQUFLdUwsV0FBVyxDQUFDRSxLQUFLLENBQUM7SUFBQSxFQUFDO0VBQ3BFLENBQUM7RUFFRCxJQUFNQyx1QkFBdUIsR0FBRyxTQUExQkEsdUJBQXVCQSxDQUFBLEVBQVM7SUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxxQkFBQSxFQUFBQyxzQkFBQTtJQUNwQyxJQUFJLEdBQUFGLHFCQUFBLEdBQUN4RCxlQUFlLENBQUMyRCxPQUFPLGNBQUFILHFCQUFBLGVBQXZCQSxxQkFBQSxDQUF5QnZMLGFBQWEsS0FBSSxFQUFDb0gsV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBRXBILGFBQWEsR0FBRSxPQUFPLElBQUk7SUFFdkYsSUFBTTJMLGNBQWMsR0FBR3ZFLFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQ0MsVUFBVSxLQUFLOEgsZUFBZSxDQUFDMkQsT0FBTyxDQUFDMUwsYUFBYSxDQUFDQyxVQUFVO0lBQ2hILElBQU0yTCxXQUFXLEdBQUdqQixxQkFBcUIsQ0FDdkN2RCxXQUFXLENBQUNwSCxhQUFhLENBQUNFLE9BQU8sRUFDakM2SCxlQUFlLENBQUMyRCxPQUFPLENBQUMxTCxhQUFhLENBQUNFLE9BQ3hDLENBQUM7SUFDRCxJQUFNMkwsY0FBYyxHQUNsQixFQUFBTCxxQkFBQSxHQUFDcEUsV0FBVyxDQUFDcEgsYUFBYSxDQUFDRyxVQUFVLGNBQUFxTCxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLElBQUksUUFBQUMsc0JBQUEsR0FBTzFELGVBQWUsQ0FBQzJELE9BQU8sQ0FBQzFMLGFBQWEsQ0FBQ0csVUFBVSxjQUFBc0wsc0JBQUEsY0FBQUEsc0JBQUEsR0FBSSxJQUFJLENBQUM7SUFDL0csSUFBTUssaUJBQWlCLEdBQUdDLGtCQUFBLENBQUszRSxXQUFXLENBQUNwSCxhQUFhLENBQUNJLGtCQUFrQixJQUFJLEVBQUUsRUFBRzhLLElBQUksQ0FBQyxDQUFDO0lBQzFGLElBQU1jLGtCQUFrQixHQUFHRCxrQkFBQSxDQUFLaEUsZUFBZSxDQUFDMkQsT0FBTyxDQUFDMUwsYUFBYSxDQUFDSSxrQkFBa0IsSUFBSSxFQUFFLEVBQUc4SyxJQUFJLENBQUMsQ0FBQztJQUN2RyxJQUFNZSxjQUFjLEdBQ2xCSCxpQkFBaUIsQ0FBQ2hCLE1BQU0sS0FBS2tCLGtCQUFrQixDQUFDbEIsTUFBTSxJQUN0RGdCLGlCQUFpQixDQUFDVixLQUFLLENBQUMsVUFBQ2MsSUFBSSxFQUFFYixLQUFLO01BQUEsT0FBS2EsSUFBSSxLQUFLRixrQkFBa0IsQ0FBQ1gsS0FBSyxDQUFDO0lBQUEsRUFBQztJQUU5RSxPQUFPLENBQUNNLGNBQWMsSUFBSSxDQUFDQyxXQUFXLElBQUksQ0FBQ0MsY0FBYyxJQUFJLENBQUNJLGNBQWM7RUFDOUUsQ0FBQztFQUVELElBQU1FLHlCQUF5QixHQUFHLFNBQTVCQSx5QkFBeUJBLENBQUEsRUFBUztJQUFBLElBQUFDLHNCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHNCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHNCQUFBO0lBQ3RDLElBQUksR0FBQVIsc0JBQUEsR0FBQ3JFLGVBQWUsQ0FBQzJELE9BQU8sY0FBQVUsc0JBQUEsZUFBdkJBLHNCQUFBLENBQXlCL00sT0FBTyxLQUFJLEVBQUMrSCxXQUFXLGFBQVhBLFdBQVcsZUFBWEEsV0FBVyxDQUFFL0gsT0FBTyxHQUFFLE9BQU8sS0FBSztJQUU1RSxPQUNFK0gsV0FBVyxDQUFDL0gsT0FBTyxDQUFDQyxJQUFJLEtBQUt5SSxlQUFlLENBQUMyRCxPQUFPLENBQUNyTSxPQUFPLENBQUNDLElBQUksSUFDakU4SCxXQUFXLENBQUMvSCxPQUFPLENBQUNFLEtBQUssS0FBS3dJLGVBQWUsQ0FBQzJELE9BQU8sQ0FBQ3JNLE9BQU8sQ0FBQ0UsS0FBSyxJQUNuRTZILFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ0csWUFBWSxLQUFLdUksZUFBZSxDQUFDMkQsT0FBTyxDQUFDck0sT0FBTyxDQUFDRyxZQUFZLElBQ2pGNEgsV0FBVyxDQUFDL0gsT0FBTyxDQUFDSSxnQkFBZ0IsS0FBS3NJLGVBQWUsQ0FBQzJELE9BQU8sQ0FBQ3JNLE9BQU8sQ0FBQ0ksZ0JBQWdCLElBQ3pGLEVBQUE0TSxxQkFBQSxHQUFBakYsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTSxPQUFPLGNBQUEwTSxxQkFBQSx1QkFBM0JBLHFCQUFBLENBQTZCek0sRUFBRSxRQUFBME0sc0JBQUEsR0FBS3ZFLGVBQWUsQ0FBQzJELE9BQU8sQ0FBQ3JNLE9BQU8sQ0FBQ00sT0FBTyxjQUFBMk0sc0JBQUEsdUJBQXZDQSxzQkFBQSxDQUF5QzFNLEVBQUUsS0FDL0V3SCxXQUFXLENBQUMvSCxPQUFPLENBQUNRLFVBQVUsS0FBS2tJLGVBQWUsQ0FBQzJELE9BQU8sQ0FBQ3JNLE9BQU8sQ0FBQ1EsVUFBVSxLQUM1RSxFQUFBME0scUJBQUEsR0FBQW5GLFdBQVcsQ0FBQ2hJLFNBQVMsY0FBQW1OLHFCQUFBLHVCQUFyQkEscUJBQUEsQ0FBdUJ6QixNQUFNLFFBQUEwQixzQkFBQSxHQUFLekUsZUFBZSxDQUFDMkQsT0FBTyxjQUFBYyxzQkFBQSxnQkFBQUEsc0JBQUEsR0FBdkJBLHNCQUFBLENBQXlCcE4sU0FBUyxjQUFBb04sc0JBQUEsdUJBQWxDQSxzQkFBQSxDQUFvQzFCLE1BQU0sS0FDMUUsR0FBQTJCLHNCQUFBLEdBQUNyRixXQUFXLENBQUNoSSxTQUFTLGNBQUFxTixzQkFBQSxlQUFyQkEsc0JBQUEsQ0FBdUIzQixNQUFNLEtBQUksR0FBQTRCLHNCQUFBLEdBQUMzRSxlQUFlLENBQUMyRCxPQUFPLGNBQUFnQixzQkFBQSxnQkFBQUEsc0JBQUEsR0FBdkJBLHNCQUFBLENBQXlCdE4sU0FBUyxjQUFBc04sc0JBQUEsZUFBbENBLHNCQUFBLENBQW9DNUIsTUFBTSxDQUFDLENBQUMsSUFDbEYsR0FBQTZCLHFCQUFBLEdBQUM1SCxjQUFjLENBQUMyRyxPQUFPLENBQUNtQixRQUFRLGNBQUFGLHFCQUFBLGVBQS9CQSxxQkFBQSxDQUFpQzdCLE1BQU0sS0FDeEMsR0FBQThCLHNCQUFBLEdBQUM3SCxjQUFjLENBQUMyRyxPQUFPLENBQUMxRyxRQUFRLGNBQUE0SCxzQkFBQSxlQUEvQkEsc0JBQUEsQ0FBaUM5QixNQUFNLEtBQ3hDLENBQUNRLHVCQUF1QixDQUFDLENBQUM7RUFFOUIsQ0FBQztFQUVELElBQU13QixzQkFBc0IsR0FBRyxTQUF6QkEsc0JBQXNCQSxDQUFBLEVBQVM7SUFBQSxJQUFBQyxzQkFBQSxFQUFBQyxhQUFBLEVBQUFDLHNCQUFBO0lBQ25DLElBQUk3RixXQUFXLENBQUNqSSxTQUFTLEVBQUUsT0FBTyxLQUFLO0lBRXZDLElBQU0rTixnQkFBZ0IsR0FBRyxDQUFDLENBQUN0TSxXQUFXLENBQUNrSyxNQUFNLElBQUksRUFBQWlDLHNCQUFBLEdBQUEzRixXQUFXLENBQUMvSCxPQUFPLENBQUNNLE9BQU8sY0FBQW9OLHNCQUFBLHVCQUEzQkEsc0JBQUEsQ0FBNkJuTixFQUFFLFFBQUFvTixhQUFBLEdBQUtwTSxXQUFXLENBQUMsQ0FBQyxDQUFDLGNBQUFvTSxhQUFBLHVCQUFkQSxhQUFBLENBQWdCcE4sRUFBRTtJQUV2RyxJQUFNdU4sdUJBQXVCLEdBQUd2SixDQUFDLENBQUMsaUNBQWlDLENBQUM7SUFDcEUsSUFBTXdKLHlCQUF5QixHQUFHaEcsV0FBVyxDQUFDL0gsT0FBTyxDQUFDSSxnQkFBZ0IsS0FBSzBOLHVCQUF1QjtJQUVsRyxJQUFNRSw0QkFBNEIsR0FBR3pKLENBQUMsQ0FBQyx5Q0FBeUMsQ0FBQztJQUNqRixJQUFNMEosbUJBQW1CLEdBQ3ZCbEcsV0FBVyxDQUFDL0gsT0FBTyxDQUFDUSxVQUFVLEtBQUt3Tiw0QkFBNEIsSUFDL0RqRyxXQUFXLENBQUMvSCxPQUFPLENBQUNRLFVBQVUsS0FBSyxFQUFFLElBQ3JDdUgsV0FBVyxDQUFDL0gsT0FBTyxDQUFDUSxVQUFVLEtBQUssSUFBSTtJQUV6QyxJQUFNME4sT0FBTyxHQUFHbkcsV0FBVyxDQUFDL0gsT0FBTyxDQUFDQyxJQUFJLENBQUNrTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7SUFDdEQsSUFBTUMsUUFBUSxHQUFHckcsV0FBVyxDQUFDL0gsT0FBTyxDQUFDRSxLQUFLLENBQUNpTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7SUFDeEQsSUFBTUUsZUFBZSxHQUFHdEcsV0FBVyxDQUFDL0gsT0FBTyxDQUFDRyxZQUFZLENBQUNnTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7SUFDdEUsSUFBTUcsbUJBQW1CLEdBQUd2RyxXQUFXLENBQUMvSCxPQUFPLENBQUNJLGdCQUFnQixDQUFDK04sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ0oseUJBQXlCO0lBQzVHLElBQU1RLGFBQWEsR0FBRyxFQUFBWCxzQkFBQSxHQUFBN0YsV0FBVyxDQUFDL0gsT0FBTyxDQUFDUSxVQUFVLGNBQUFvTixzQkFBQSx1QkFBOUJBLHNCQUFBLENBQWdDTyxJQUFJLENBQUMsQ0FBQyxNQUFLLEVBQUUsSUFBSSxDQUFDRixtQkFBbUI7SUFDM0YsSUFBTU8sWUFBWSxHQUFHLENBQUMsQ0FBQ3pHLFdBQVcsQ0FBQ2hJLFNBQVMsQ0FBQzBMLE1BQU07SUFDbkQsSUFBTWdELGdCQUFnQixHQUFHMUcsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTSxPQUFPLElBQUksQ0FBQ3VOLGdCQUFnQjtJQUN6RSxJQUFNYSxnQkFBZ0IsR0FBRzNHLFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQ0MsVUFBVSxLQUFLLFNBQVM7SUFFM0UsT0FDRXNOLE9BQU8sSUFDUEUsUUFBUSxJQUNSQyxlQUFlLElBQ2ZDLG1CQUFtQixJQUNuQkMsYUFBYSxJQUNiQyxZQUFZLElBQ1pDLGdCQUFnQixJQUNoQkMsZ0JBQWdCO0VBRXBCLENBQUM7RUFFRCxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFBLEVBQVM7SUFDakMsSUFBSSxDQUFDNUcsV0FBVyxDQUFDakksU0FBUyxFQUFFLE9BQU8sS0FBSztJQUV4QyxPQUNFLENBQUNnTix5QkFBeUIsQ0FBQyxDQUFDLElBQzVCLENBQUMsQ0FBQ3BILGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQzFHLFFBQVEsQ0FBQzhGLE1BQU0sSUFDeEMsQ0FBQyxDQUFDL0YsY0FBYyxDQUFDMkcsT0FBTyxDQUFDekcsUUFBUSxDQUFDNkYsTUFBTTtFQUU1QyxDQUFDO0VBRUQsSUFBTW1ELGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUEsRUFBUztJQUM5QixPQUFPbkIsc0JBQXNCLENBQUMsQ0FBQyxJQUFJa0Isb0JBQW9CLENBQUMsQ0FBQztFQUMzRCxDQUFDOztFQUVEO0VBQ0EsSUFBTUUsNEJBQTRCLEdBQUc3UyxXQUFXLENBQzlDLFVBQUM4UyxPQUFlLEVBQUVwSyxLQUFZLEVBQUVxSyxTQUF5QyxFQUFFQyxPQUFvQixFQUFLO0lBQ2xHakssY0FBYyxDQUNaK0osT0FBTyxFQUNQLFVBQUFHLFlBQVksRUFBSTtNQUNkO01BQ0EvSyxtQkFBbUIsQ0FBQytLLFlBQVksRUFBRSxJQUFJLENBQUM7TUFDdkMsSUFBSUYsU0FBUyxFQUFFO1FBQ2JBLFNBQVMsQ0FBQ0UsWUFBWSxDQUFDO01BQ3pCO0lBQ0YsQ0FBQyxFQUNELFlBQU07TUFDSixJQUFJRCxPQUFPLEVBQUU7UUFDWEEsT0FBTyxDQUFDLENBQUM7TUFDWDtJQUNGLENBQUMsRUFDRHRLLEtBQUssQ0FBQ2hFLFdBQ1IsQ0FBQztFQUNILENBQUMsRUFDRCxDQUFDcUUsY0FBYyxFQUFFYixtQkFBbUIsQ0FDdEMsQ0FBQztFQUVELElBQU1nTCxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQSxFQUFTO0lBQ3hCLElBQUlOLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDMUUsYUFBYSxJQUFJLENBQUNMLGFBQWEsSUFBSSxDQUFDTCxhQUFhLEVBQUU7TUFDN0UsSUFBTTJGLGNBQWMsR0FBR3BILFdBQVcsQ0FBQ2pJLFNBQVMsR0FBR3lFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHQSxDQUFDLENBQUMseUJBQXlCLENBQUM7TUFFeEcsSUFBSSxDQUFDNkssTUFBTSxDQUFDQyxPQUFPLENBQUNGLGNBQWMsQ0FBQyxFQUFFO1FBQ25DO01BQ0Y7SUFDRjtJQUVBbkgsY0FBYyxDQUFDckksYUFBYSxDQUFDO0lBQzdCMEksZ0JBQWdCLENBQUMsQ0FBQztJQUNsQnlDLHNCQUFzQixDQUFDLENBQUM7SUFDeEJDLHdCQUF3QixDQUFDLENBQUM7SUFDMUJLLHdCQUF3QixDQUFDLENBQUM7SUFDMUIxRixjQUFjLENBQUMyRyxPQUFPLEdBQUc7TUFDdkIxRyxRQUFRLEVBQUUsRUFBRTtNQUNaQyxRQUFRLEVBQUU7SUFDWixDQUFDO0lBQ0RDLG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO01BQzVCdkcsY0FBYyxFQUFFLEtBQUs7TUFDckJDLGFBQWEsRUFBRSxLQUFLO01BQ3BCQyxjQUFjLEVBQUUsS0FBSztNQUNyQkMsYUFBYSxFQUFFLElBQUk7TUFDbkJDLGFBQWEsRUFBRTtJQUNqQixDQUFDO0lBQ0RDLGdCQUFnQixDQUFDa0csT0FBTyxHQUFHLEtBQUs7SUFDaEM1RyxrQkFBa0IsQ0FBQzRHLE9BQU8sR0FBRyxLQUFLO0lBQ2xDN0YsdUJBQXVCLENBQUM2RixPQUFPLEdBQUcsS0FBSztJQUN2Q3ZELHFCQUFxQixDQUFDLEtBQUssQ0FBQztJQUM1QnZELGVBQWUsQ0FBQyxLQUFLLENBQUM7SUFDdEJxQixpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDcEJZLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDckJSLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDaEJaLGVBQWUsQ0FBQ2lHLE9BQU8sR0FBRyxJQUFJO0lBQzlCaEcsd0JBQXdCLENBQUNnRyxPQUFPLEdBQUcsSUFBSTtJQUN2Qy9GLHNCQUFzQixDQUFDK0YsT0FBTyxHQUFHLElBQUk7RUFDdkMsQ0FBQztFQUVELElBQU1pRCxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFJQyxLQUF1QixFQUFLO0lBQ3ZELElBQUlBLEtBQUssQ0FBQ0MsTUFBTSxLQUFLRCxLQUFLLENBQUNFLGFBQWEsSUFBSSxDQUFDNUcsa0JBQWtCLEVBQUU7TUFDL0RxRyxXQUFXLENBQUMsQ0FBQztJQUNmO0VBQ0YsQ0FBQztFQUVELElBQU1RLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQUlDLFVBQXNCLEVBQUs7SUFDdER0TCxjQUFjLENBQUN6RixNQUFNLENBQUNnUixVQUFVLEVBQUU7TUFBRUMsTUFBTSxFQUFFRjtJQUFXLENBQUMsQ0FBQztJQUN6RG5JLFVBQVUsQ0FBQ21JLFVBQVUsQ0FBQztFQUN4QixDQUFDO0VBRUQsSUFBTUcsMEJBQTBCLEdBQUcsU0FBN0JBLDBCQUEwQkEsQ0FBQUMsS0FBQSxFQVExQjtJQUFBLElBUEpDLEdBQUcsR0FBQUQsS0FBQSxDQUFIQyxHQUFHO01BQ0hDLEtBQUssR0FBQUYsS0FBQSxDQUFMRSxLQUFLO01BQ0xDLGVBQWUsR0FBQUgsS0FBQSxDQUFmRyxlQUFlO0lBTWYsSUFBSUYsR0FBRyxLQUFLLFdBQVcsRUFBRTtNQUN2QixJQUFJLENBQUNFLGVBQWUsRUFBRTtRQUFBLElBQUFDLHNCQUFBO1FBQ3BCLENBQUFBLHNCQUFBLEdBQUF6SyxjQUFjLENBQUMyRyxPQUFPLENBQUN6RyxRQUFRLEVBQUN3SyxJQUFJLENBQUFDLEtBQUEsQ0FBQUYsc0JBQUEsRUFBQXpELGtCQUFBLENBQUt1RCxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7TUFDeEQsQ0FBQyxNQUFNO1FBQ0wsSUFBTUssWUFBWSxHQUFHTCxLQUFLLENBQUN4RSxNQUFNLEdBQUcsSUFBSThFLEdBQUcsQ0FBQ04sS0FBSyxDQUFDaE8sR0FBRyxDQUFDLFVBQUFFLElBQUk7VUFBQSxPQUFJQSxJQUFJLENBQUM1QixFQUFFO1FBQUEsRUFBQyxDQUFDLEdBQUcsSUFBSWdRLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLElBQU1DLFFBQVEsR0FBR3pJLFdBQVcsQ0FBQ2hJLFNBQVMsQ0FBQzBRLE1BQU0sQ0FBQyxVQUFBdE8sSUFBSTtVQUFBLE9BQUksQ0FBQ21PLFlBQVksQ0FBQ0ksR0FBRyxDQUFDdk8sSUFBSSxDQUFDNUIsRUFBRSxDQUFDLElBQUk0QixJQUFJLENBQUNRLE1BQU0sS0FBSyxTQUFTO1FBQUEsRUFBQztRQUM5RyxJQUFJLENBQUM2TixRQUFRLENBQUMvRSxNQUFNLElBQUkvRixjQUFjLENBQUMyRyxPQUFPLENBQUN6RyxRQUFRLENBQUM2RixNQUFNLEVBQUU7VUFDOUQsSUFBTWtGLFFBQVEsR0FBRyxJQUFJSixHQUFHLENBQUNOLEtBQUssQ0FBQ2hPLEdBQUcsQ0FBQyxVQUFBRSxJQUFJO1lBQUEsT0FBSUEsSUFBSSxDQUFDNUIsRUFBRTtVQUFBLEVBQUMsQ0FBQztVQUNwRG1GLGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVEsR0FBR0YsY0FBYyxDQUFDMkcsT0FBTyxDQUFDekcsUUFBUSxDQUFDNkssTUFBTSxDQUFDLFVBQUF0TyxJQUFJO1lBQUEsT0FBSXdPLFFBQVEsQ0FBQ0QsR0FBRyxDQUFDdk8sSUFBSSxDQUFDNUIsRUFBRSxDQUFDO1VBQUEsRUFBQztRQUN6RztRQUNBbUYsY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUSxNQUFBaUwsTUFBQSxDQUFBbEUsa0JBQUEsQ0FBUWhILGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQzFHLFFBQVEsSUFBSSxFQUFFLEdBQUErRyxrQkFBQSxDQUFNOEQsUUFBUSxFQUFDO01BQzdGO0lBQ0Y7SUFDQXhJLGNBQWMsQ0FBQyxVQUFBeEcsSUFBSSxFQUFJO01BQ3JCLElBQU1xUCxjQUFjLEdBQ2xCYixHQUFHLEtBQUssV0FBVyxHQUNmRSxlQUFlLEdBQ2JELEtBQUssTUFBQVcsTUFBQSxDQUFBbEUsa0JBQUEsQ0FDQWxMLElBQUksQ0FBQ3pCLFNBQVMsSUFBSSxFQUFFLEdBQUEyTSxrQkFBQSxDQUFRdUQsS0FBSyxJQUF5QixFQUFFLEVBQUUsR0FDckUsSUFBSTtNQUNWLE9BQUEvTyxhQUFBLENBQUFBLGFBQUEsS0FDS00sSUFBSSxHQUNId08sR0FBRyxLQUFLLFdBQVcsR0FDbkI7UUFBRWpRLFNBQVMsRUFBRThRO01BQWUsQ0FBQyxHQUM3QmIsR0FBRyxLQUFLLGVBQWUsR0FDckI7UUFBRXJQLGFBQWEsRUFBRXNQO01BQU0sQ0FBQyxHQUN4QjtRQUNFalEsT0FBTyxFQUFBa0IsYUFBQSxDQUFBQSxhQUFBLEtBQ0ZNLElBQUksQ0FBQ3hCLE9BQU8sT0FBQThRLGVBQUEsS0FDZGQsR0FBRyxFQUFHQyxLQUFLO01BRWhCLENBQUM7SUFFWCxDQUFDLENBQUM7RUFDSixDQUFDO0VBRUQsSUFBTWMsb0JBQW1CO0lBQUEsSUFBQUMsS0FBQSxHQUFBQyxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUcsU0FBQUMsUUFBT0MsSUFBUyxFQUFFQyxNQUFzQztNQUFBLE9BQUFKLG1CQUFBLENBQUFLLElBQUEsV0FBQUMsUUFBQTtRQUFBLGtCQUFBQSxRQUFBLENBQUFoUSxJQUFBLEdBQUFnUSxRQUFBLENBQUFDLElBQUE7VUFBQTtZQUFBLElBRTdFckMsTUFBTSxDQUFDc0Msd0NBQXdDO2NBQUFGLFFBQUEsQ0FBQUMsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBRCxRQUFBLENBQUFHLE1BQUE7VUFBQTtZQUFBLE1BSWhETCxNQUFNLEtBQUssUUFBUTtjQUFBRSxRQUFBLENBQUFDLElBQUE7Y0FBQTtZQUFBO1lBQ3JCcE4sY0FBYyxDQUFDekYsTUFBTSxVQUFPLENBQUM7WUFDN0IySyxpQkFBaUIsQ0FBQzhILElBQUksQ0FBQzlRLEVBQXVCLENBQUM7WUFBQSxPQUFBaVIsUUFBQSxDQUFBRyxNQUFBO1VBQUE7WUFHakR0TixjQUFjLENBQUN6RixNQUFNLENBQUNnVCxhQUFhLEVBQUU7Y0FBRS9CLE1BQU0sRUFBRTlILFdBQVcsQ0FBQ2pJLFNBQVMsR0FBRyxPQUFPLEdBQUc7WUFBUyxDQUFDLENBQUM7WUFDNUY7WUFDQTtZQUNBMEcsdUJBQXVCLENBQUM2RixPQUFPLEdBQUcsS0FBSztZQUFBLEtBQ25DdEUsV0FBVyxDQUFDakksU0FBUztjQUFBMFIsUUFBQSxDQUFBQyxJQUFBO2NBQUE7WUFBQTtZQUFBLElBQ2xCM0UseUJBQXlCLENBQUMsQ0FBQztjQUFBMEUsUUFBQSxDQUFBQyxJQUFBO2NBQUE7WUFBQTtZQUFBRCxRQUFBLENBQUFDLElBQUE7WUFBQSxPQUN4QjdILGlCQUFpQixDQUFDN0IsV0FBVyxDQUFDO1VBQUE7WUFBQXlKLFFBQUEsQ0FBQUMsSUFBQTtZQUFBO1VBQUE7WUFBQUQsUUFBQSxDQUFBQyxJQUFBO1lBQUEsT0FHaEN6SCxpQkFBaUIsQ0FBQ2pDLFdBQVcsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBeUosUUFBQSxDQUFBSyxJQUFBO1FBQUE7TUFBQSxHQUFBVCxPQUFBO0lBQUEsQ0FFdkM7SUFBQSxnQkF0QktMLG1CQUFtQkEsQ0FBQWUsRUFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQWYsS0FBQSxDQUFBWCxLQUFBLE9BQUEyQixTQUFBO0lBQUE7RUFBQSxHQXNCeEI7RUFFRHBXLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTXFXLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUkxQyxLQUFVLEVBQUs7TUFBQSxJQUFBMkMsbUJBQUEsRUFBQUMsb0JBQUE7TUFDM0MsSUFBUUMsV0FBVyxHQUFLN0MsS0FBSyxDQUFDOEMsTUFBTSxDQUE1QkQsV0FBVztNQUNuQixJQUFNRSxjQUFjLEdBQUdGLFdBQVcsYUFBWEEsV0FBVyx1QkFBWEEsV0FBVyxDQUFFRSxjQUF3QztNQUM1RWpNLHdCQUF3QixDQUFDZ0csT0FBTyxHQUM5QmlHLGNBQWMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUNDLFFBQVEsQ0FBQ0QsY0FBYyxDQUFDLEdBQUdBLGNBQWMsR0FBRyxJQUFJO01BRTlHN0osaUJBQWlCLENBQUMsQ0FBQztNQUNuQnpCLFNBQVMsQ0FBQyxJQUFJLENBQUM7TUFDZlksWUFBWSxDQUFDLElBQUksQ0FBQztNQUVsQi9CLG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO1FBQzVCdkcsY0FBYyxFQUFFLEtBQUs7UUFDckJDLGFBQWEsRUFBRSxLQUFLO1FBQ3BCQyxjQUFjLEVBQUUsS0FBSztRQUNyQkMsYUFBYSxFQUFFLElBQUk7UUFDbkJDLGFBQWEsRUFBRTtNQUNqQixDQUFDO01BRUQsS0FBQWdNLG1CQUFBLEdBQUlFLFdBQVcsQ0FBQ0ksTUFBTSxjQUFBTixtQkFBQSxlQUFsQkEsbUJBQUEsQ0FBb0JwUyxTQUFTLEVBQUU7UUFBQSxJQUFBMlMsb0JBQUE7UUFDakM7UUFDQSxJQUFJLENBQUNyRCxNQUFNLENBQUNzQyx3Q0FBd0MsRUFBRTtVQUNwRHBILG1CQUFtQixDQUFDL0YsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7VUFDM0N5QyxTQUFTLENBQUMsS0FBSyxDQUFDO1VBQ2hCWSxZQUFZLENBQUMsS0FBSyxDQUFDO1VBQ25CdkIsd0JBQXdCLENBQUNnRyxPQUFPLEdBQUcsSUFBSTtVQUN2Qy9GLHNCQUFzQixDQUFDK0YsT0FBTyxHQUFHLElBQUk7VUFDckM7UUFDRjtRQUNBLElBQUkrRixXQUFXLENBQUNNLG1CQUFtQixFQUFFO1VBQ25DckssZ0JBQWdCLENBQUMsQ0FBQztVQUNsQi9CLHNCQUFzQixDQUFDK0YsT0FBTyxHQUFHK0YsV0FBVyxDQUFDTSxtQkFBbUI7VUFDaEU7UUFDRjtRQUNBdEssa0JBQWtCLENBQUNnSyxXQUFXLGFBQVhBLFdBQVcsZ0JBQUFLLG9CQUFBLEdBQVhMLFdBQVcsQ0FBRUksTUFBTSxjQUFBQyxvQkFBQSxnQkFBQUEsb0JBQUEsR0FBbkJBLG9CQUFBLENBQXFCelMsT0FBTyxjQUFBeVMsb0JBQUEsdUJBQTVCQSxvQkFBQSxDQUE4QmxTLEVBQXVCLENBQUM7UUFDekU7TUFDRjtNQUVBLElBQUk2UixXQUFXLENBQUNJLE1BQU0sRUFBRTtRQUN0QixJQUFNRyxVQUFVLEdBQUF6UixhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxLQUNYdkIsYUFBYSxHQUNieVMsV0FBVyxDQUFDSSxNQUFNO1VBQ3JCeFMsT0FBTyxFQUFBa0IsYUFBQSxDQUFBQSxhQUFBLEtBQ0Z2QixhQUFhLENBQUNLLE9BQU8sR0FDcEJvUyxXQUFXLENBQUNJLE1BQU0sQ0FBQ3hTLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FDckM7VUFDRFcsYUFBYSxFQUFBTyxhQUFBLENBQUFBLGFBQUEsS0FDUnZCLGFBQWEsQ0FBQ2dCLGFBQWEsR0FDMUJ5UixXQUFXLENBQUNJLE1BQU0sQ0FBQzdSLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FDM0M7VUFDRFosU0FBUyxFQUFFcVMsV0FBVyxDQUFDSSxNQUFNLENBQUN6UyxTQUFTLElBQUk7UUFBRSxFQUM5QztRQUVEMkksZUFBZSxDQUFDMkQsT0FBTyxHQUFHc0csVUFBVTtRQUNwQzNLLGNBQWMsQ0FBQzJLLFVBQVUsQ0FBQztNQUM1QjtNQUVBLElBQUl0TSx3QkFBd0IsQ0FBQ2dHLE9BQU8sSUFBSSxHQUFBOEYsb0JBQUEsR0FBQ0MsV0FBVyxDQUFDSSxNQUFNLGNBQUFMLG9CQUFBLGVBQWxCQSxvQkFBQSxDQUFvQnJTLFNBQVMsR0FBRTtRQUN0RTBILFVBQVUsQ0FBQ25CLHdCQUF3QixDQUFDZ0csT0FBTyxDQUFDO1FBQzVDaEcsd0JBQXdCLENBQUNnRyxPQUFPLEdBQUcsSUFBSTtNQUN6QztNQUVBekUsWUFBWSxDQUFDLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQ0QzQyxRQUFRLENBQUMyTixnQkFBZ0IsQ0FBQyw0QkFBNEIsRUFBRVgsb0JBQW9CLENBQUM7SUFDN0UsT0FBTyxZQUFNO01BQ1hoTixRQUFRLENBQUM0TixtQkFBbUIsQ0FBQyw0QkFBNEIsRUFBRVosb0JBQXFDLENBQUM7SUFDbkcsQ0FBQztFQUNILENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRU47RUFDQXJXLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBSSxDQUFDbUwsTUFBTSxFQUFFO01BQ1gsT0FBT2xFLFNBQVM7SUFDbEI7SUFFQSxJQUFBaVEsU0FBQSxHQUFpQjdOLFFBQVE7TUFBakI4TixJQUFJLEdBQUFELFNBQUEsQ0FBSkMsSUFBSTtJQUNaLElBQUksQ0FBQ0EsSUFBSSxFQUFFO01BQ1QsT0FBT2xRLFNBQVM7SUFDbEI7SUFFQSxJQUFNbVEsZ0JBQWdCLEdBQUdELElBQUksQ0FBQ0UsS0FBSyxDQUFDQyxRQUFRO0lBQzVDSCxJQUFJLENBQUNFLEtBQUssQ0FBQ0MsUUFBUSxHQUFHLFFBQVE7SUFFOUIsT0FBTyxZQUFNO01BQ1hILElBQUksQ0FBQ0UsS0FBSyxDQUFDQyxRQUFRLEdBQUdGLGdCQUFnQjtJQUN4QyxDQUFDO0VBQ0gsQ0FBQyxFQUFFLENBQUNqTSxNQUFNLENBQUMsQ0FBQztFQUVabkwsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFNdVgsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFrQkEsQ0FBSTVELEtBQXdCLEVBQUs7TUFDdkQsSUFBSVgsaUJBQWlCLENBQUMsQ0FBQyxFQUFFO1FBQ3ZCVyxLQUFLLENBQUM2RCxjQUFjLENBQUMsQ0FBQztRQUN0QjtRQUNBN0QsS0FBSyxDQUFDOEQsV0FBVyxHQUFHOU8sQ0FBQyxDQUFDLHNCQUFzQixDQUFDO1FBQzdDLE9BQU9BLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQztNQUNsQztNQUNBLE9BQU8xQixTQUFTO0lBQ2xCLENBQUM7SUFFRCxJQUFJa0UsTUFBTSxFQUFFO01BQ1ZxSSxNQUFNLENBQUN3RCxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUVPLGtCQUFrQixDQUFDO0lBQzdEO0lBRUEsT0FBTyxZQUFNO01BQ1gvRCxNQUFNLENBQUN5RCxtQkFBbUIsQ0FBQyxjQUFjLEVBQUVNLGtCQUFrQixDQUFDO0lBQ2hFLENBQUM7RUFDSCxDQUFDLEVBQUUsQ0FBQ3BNLE1BQU0sRUFBRTZILGlCQUFpQixFQUFFckssQ0FBQyxDQUFDLENBQUM7RUFFbEMzSSxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUk0TixhQUFhLEVBQUU7TUFDakJhLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7TUFDL0NtRixZQUFZLENBQUMsQ0FBQztNQUNkLElBQUksQ0FBQWpGLG9CQUFvQixhQUFwQkEsb0JBQW9CLHVCQUFwQkEsb0JBQW9CLENBQUVsRSxFQUFFLE1BQUt3SCxXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsRUFBRTtRQUN2RDRELGdCQUFnQixDQUFDTSxvQkFBb0IsYUFBcEJBLG9CQUFvQix1QkFBcEJBLG9CQUFvQixDQUFFbEUsRUFBWSxDQUFDO01BQ3REO01BQ0EwRCxXQUFXLENBQUM4RCxXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsQ0FBQztNQUNuQzZHLGtCQUFrQixDQUFDLEtBQUssQ0FBQztNQUN6QjhILFdBQVcsQ0FBQyxDQUFDO0lBQ2Y7RUFDRixDQUFDLEVBQUUsQ0FBQzFGLGFBQWEsQ0FBQyxDQUFDO0VBRW5CNU4sU0FBUyxDQUFDLFlBQU07SUFDZDtJQUNBLElBQUlzTyxhQUFhLElBQUksQ0FBQ0QsZUFBZSxJQUFJN0QsZUFBZSxDQUFDaUcsT0FBTyxLQUFLbkMsYUFBYSxDQUFDM0osRUFBRSxFQUFFO01BQ3JGNkYsZUFBZSxDQUFDaUcsT0FBTyxHQUFHbkMsYUFBYSxDQUFDM0osRUFBRTtNQUMxQyxJQUFJbUYsY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUSxDQUFDOEYsTUFBTSxJQUFJL0YsY0FBYyxDQUFDMkcsT0FBTyxDQUFDekcsUUFBUSxDQUFDNkYsTUFBTSxFQUFFO1FBQ3BGLElBQUkxRCxXQUFXLENBQUNwSCxhQUFhLENBQUNDLFVBQVUsS0FBSyxTQUFTLEVBQUU7VUFDdERpRixtQkFBbUIsQ0FBQ3dHLE9BQU8sR0FBRztZQUM1QnZHLGNBQWMsRUFBRSxJQUFJO1lBQ3BCQyxhQUFhLEVBQUUsS0FBSztZQUNwQkMsY0FBYyxFQUFFLElBQUk7WUFDcEJDLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCQyxhQUFhLEVBQUU7VUFDakIsQ0FBQztRQUNILENBQUMsTUFBTTtVQUNMO1VBQ0FMLG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO1lBQzVCdkcsY0FBYyxFQUFFLElBQUk7WUFDcEJDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCQyxjQUFjLEVBQUUsS0FBSztZQUNyQkMsYUFBYSxFQUFFLFFBQVE7WUFDdkJDLGFBQWEsRUFBRTtVQUNqQixDQUFDO1FBQ0g7UUFFQSxJQUFNb04sUUFBUSxHQUFHLENBQ2Y1SSwrQkFBK0IsQ0FBQztVQUM5QjZJLGFBQWEsRUFBRTdOLGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQzFHLFFBQVE7VUFDOUM2TixhQUFhLEVBQUU5TixjQUFjLENBQUMyRyxPQUFPLENBQUN6RyxRQUFRO1VBQzlDa0osT0FBTyxFQUFFNUUsYUFBYSxDQUFDM0osRUFBRSxDQUFDK0IsUUFBUSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUNIO1FBRUQsSUFBSXlGLFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQ0MsVUFBVSxLQUFLLFNBQVMsRUFBRTtVQUN0RDBTLFFBQVEsQ0FBQ2xELElBQUksQ0FBQ25GLGtCQUFrQixDQUFDZixhQUFhLENBQUMzSixFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUFFeUYsV0FBVyxDQUFDcEgsYUFBYSxDQUFDLENBQUM7UUFDM0Y7UUFFQSxJQUFJb0gsV0FBVyxDQUFDL0gsT0FBTyxDQUFDVSxXQUFXLEVBQUU7VUFDbkMsSUFBTStTLGlCQUFpQixHQUFBdlMsYUFBQSxDQUFBQSxhQUFBLEtBQVFnSixhQUFhO1lBQUV4SixXQUFXLEVBQUU7VUFBSSxFQUFFO1VBQ2pFcUQsUUFBUSxDQUFDMFAsaUJBQWlCLENBQUM7VUFDM0I7VUFDQTtVQUNBLElBQU1DLGNBQWMsR0FBQXhTLGFBQUEsQ0FBQUEsYUFBQSxLQUFRdVMsaUJBQWlCO1lBQUUvUyxXQUFXLEVBQUU7VUFBSyxFQUFFO1VBQ25FNFMsUUFBUSxDQUFDbEQsSUFBSSxDQUNYLElBQUl1RCxPQUFPLENBQU8sVUFBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUs7WUFDckNoRiw0QkFBNEIsQ0FDMUIzRSxhQUFhLENBQUMzSixFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUMzQm9SLGNBQWMsRUFDZDtjQUFBLE9BQU1FLE9BQU8sQ0FBQyxDQUFDO1lBQUEsR0FDZjtjQUFBLE9BQU1DLE1BQU0sQ0FBQyxDQUFDO1lBQUEsQ0FDaEIsQ0FBQztVQUNILENBQUMsQ0FDSCxDQUFDO1FBQ0gsQ0FBQyxNQUFNO1VBQ0w5UCxRQUFRLENBQUNtRyxhQUFhLENBQUM7UUFDekI7UUFFQXlKLE9BQU8sQ0FBQ0csR0FBRyxDQUFDUixRQUFRLENBQUM7UUFFckI3TixrQkFBa0IsQ0FBQzRHLE9BQU8sR0FBRyxJQUFJO1FBQ2pDdkQscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQzNCO01BQ0Y7TUFDQSxJQUFJcEQsY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUSxDQUFDOEYsTUFBTSxFQUFFO1FBQzFDLElBQUkxRCxXQUFXLENBQUNwSCxhQUFhLENBQUNDLFVBQVUsS0FBSyxTQUFTLEVBQUU7VUFDdERpRixtQkFBbUIsQ0FBQ3dHLE9BQU8sR0FBRztZQUM1QnZHLGNBQWMsRUFBRSxJQUFJO1lBQ3BCQyxhQUFhLEVBQUUsS0FBSztZQUNwQkMsY0FBYyxFQUFFLElBQUk7WUFDcEJDLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCQyxhQUFhLEVBQUU7VUFDakIsQ0FBQztRQUNILENBQUMsTUFBTTtVQUNMO1VBQ0FMLG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO1lBQzVCdkcsY0FBYyxFQUFFLElBQUk7WUFDcEJDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCQyxjQUFjLEVBQUUsS0FBSztZQUNyQkMsYUFBYSxFQUFFLFFBQVE7WUFDdkJDLGFBQWEsRUFBRTtVQUNqQixDQUFDO1FBQ0g7UUFFQSxJQUFNb04sU0FBUSxHQUFHLENBQ2Y3SSxzQkFBc0IsQ0FBQztVQUFFc0osS0FBSyxFQUFFck8sY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUTtVQUFFbUosT0FBTyxFQUFFNUUsYUFBYSxDQUFDM0osRUFBRSxDQUFDK0IsUUFBUSxDQUFDO1FBQUUsQ0FBQyxDQUFDLENBQ3pHO1FBRUQsSUFBSXlGLFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQ0MsVUFBVSxLQUFLLFNBQVMsRUFBRTtVQUN0RDBTLFNBQVEsQ0FBQ2xELElBQUksQ0FBQ25GLGtCQUFrQixDQUFDZixhQUFhLENBQUMzSixFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUFFeUYsV0FBVyxDQUFDcEgsYUFBYSxDQUFDLENBQUM7UUFDM0Y7UUFFQSxJQUFJb0gsV0FBVyxDQUFDL0gsT0FBTyxDQUFDVSxXQUFXLEVBQUU7VUFDbkMsSUFBTStTLGtCQUFpQixHQUFBdlMsYUFBQSxDQUFBQSxhQUFBLEtBQVFnSixhQUFhO1lBQUV4SixXQUFXLEVBQUU7VUFBSSxFQUFFO1VBQ2pFcUQsUUFBUSxDQUFDMFAsa0JBQWlCLENBQUM7VUFDM0I7VUFDQTtVQUNBLElBQU1DLGVBQWMsR0FBQXhTLGFBQUEsQ0FBQUEsYUFBQSxLQUFRdVMsa0JBQWlCO1lBQUUvUyxXQUFXLEVBQUU7VUFBSyxFQUFFO1VBQ25FNFMsU0FBUSxDQUFDbEQsSUFBSSxDQUNYLElBQUl1RCxPQUFPLENBQU8sVUFBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUs7WUFDckNoRiw0QkFBNEIsQ0FDMUIzRSxhQUFhLENBQUMzSixFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUMzQm9SLGVBQWMsRUFDZDtjQUFBLE9BQU1FLE9BQU8sQ0FBQyxDQUFDO1lBQUEsR0FDZjtjQUFBLE9BQU1DLE1BQU0sQ0FBQyxDQUFDO1lBQUEsQ0FDaEIsQ0FBQztVQUNILENBQUMsQ0FDSCxDQUFDO1FBQ0gsQ0FBQyxNQUFNO1VBQ0w5UCxRQUFRLENBQUNtRyxhQUFhLENBQUM7UUFDekI7UUFFQXlKLE9BQU8sQ0FBQ0csR0FBRyxDQUFDUixTQUFRLENBQUM7UUFDckI3SSxzQkFBc0IsQ0FBQztVQUFFc0osS0FBSyxFQUFFck8sY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUTtVQUFFbUosT0FBTyxFQUFFNUUsYUFBYSxDQUFDM0osRUFBRSxDQUFDK0IsUUFBUSxDQUFDO1FBQUUsQ0FBQyxDQUFDO1FBQ3hHbUQsa0JBQWtCLENBQUM0RyxPQUFPLEdBQUcsSUFBSTtRQUNqQ3ZELHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUMzQjtNQUNGO01BQ0EsSUFBSXBELGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVEsQ0FBQzZGLE1BQU0sRUFBRTtRQUMxQyxJQUFJMUQsV0FBVyxDQUFDcEgsYUFBYSxDQUFDQyxVQUFVLEtBQUssU0FBUyxFQUFFO1VBQ3REaUYsbUJBQW1CLENBQUN3RyxPQUFPLEdBQUc7WUFDNUJ2RyxjQUFjLEVBQUUsSUFBSTtZQUNwQkMsYUFBYSxFQUFFLEtBQUs7WUFDcEJDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCQyxhQUFhLEVBQUUsUUFBUTtZQUN2QkMsYUFBYSxFQUFFO1VBQ2pCLENBQUM7UUFDSCxDQUFDLE1BQU07VUFDTDtVQUNBTCxtQkFBbUIsQ0FBQ3dHLE9BQU8sR0FBRztZQUM1QnZHLGNBQWMsRUFBRSxJQUFJO1lBQ3BCQyxhQUFhLEVBQUUsS0FBSztZQUNwQkMsY0FBYyxFQUFFLEtBQUs7WUFDckJDLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCQyxhQUFhLEVBQUU7VUFDakIsQ0FBQztRQUNIO1FBRUEsSUFBTW9OLFVBQVEsR0FBRyxDQUNmOUksc0JBQXNCLENBQUM7VUFBRXVKLEtBQUssRUFBRXJPLGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVE7VUFBRWtKLE9BQU8sRUFBRTVFLGFBQWEsQ0FBQzNKLEVBQUUsQ0FBQytCLFFBQVEsQ0FBQztRQUFFLENBQUMsQ0FBQyxDQUN6RztRQUVELElBQUl5RixXQUFXLENBQUNwSCxhQUFhLENBQUNDLFVBQVUsS0FBSyxTQUFTLEVBQUU7VUFDdEQwUyxVQUFRLENBQUNsRCxJQUFJLENBQUNuRixrQkFBa0IsQ0FBQ2YsYUFBYSxDQUFDM0osRUFBRSxDQUFDK0IsUUFBUSxDQUFDLENBQUMsRUFBRXlGLFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQyxDQUFDO1FBQzNGO1FBRUEsSUFBSW9ILFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ1UsV0FBVyxFQUFFO1VBQ25DLElBQU0rUyxtQkFBaUIsR0FBQXZTLGFBQUEsQ0FBQUEsYUFBQSxLQUFRZ0osYUFBYTtZQUFFeEosV0FBVyxFQUFFO1VBQUksRUFBRTtVQUNqRXFELFFBQVEsQ0FBQzBQLG1CQUFpQixDQUFDO1VBQzNCO1VBQ0E7VUFDQSxJQUFNQyxnQkFBYyxHQUFBeFMsYUFBQSxDQUFBQSxhQUFBLEtBQVF1UyxtQkFBaUI7WUFBRS9TLFdBQVcsRUFBRTtVQUFLLEVBQUU7VUFDbkU0UyxVQUFRLENBQUNsRCxJQUFJLENBQ1gsSUFBSXVELE9BQU8sQ0FBTyxVQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBSztZQUNyQ2hGLDRCQUE0QixDQUMxQjNFLGFBQWEsQ0FBQzNKLEVBQUUsQ0FBQytCLFFBQVEsQ0FBQyxDQUFDLEVBQzNCb1IsZ0JBQWMsRUFDZDtjQUFBLE9BQU1FLE9BQU8sQ0FBQyxDQUFDO1lBQUEsR0FDZjtjQUFBLE9BQU1DLE1BQU0sQ0FBQyxDQUFDO1lBQUEsQ0FDaEIsQ0FBQztVQUNILENBQUMsQ0FDSCxDQUFDO1FBQ0gsQ0FBQyxNQUFNO1VBQ0w5UCxRQUFRLENBQUNtRyxhQUFhLENBQUM7UUFDekI7UUFFQXlKLE9BQU8sQ0FBQ0csR0FBRyxDQUFDUixVQUFRLENBQUM7UUFDckI3TixrQkFBa0IsQ0FBQzRHLE9BQU8sR0FBRyxJQUFJO1FBQ2pDdkQscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQzNCO01BQ0Y7TUFDQSxJQUFJZixXQUFXLENBQUNwSCxhQUFhLENBQUNDLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDdEQ7UUFDQSxJQUFJLENBQUNpRixtQkFBbUIsQ0FBQ3dHLE9BQU8sQ0FBQ25HLGFBQWEsRUFBRTtVQUM5QyxJQUFRRixjQUFjLEdBQUtILG1CQUFtQixDQUFDd0csT0FBTyxDQUE5Q3JHLGNBQWM7VUFDdEJILG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO1lBQzVCdkcsY0FBYyxFQUFFLElBQUk7WUFDcEJDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCQyxjQUFjLEVBQUVBLGNBQWMsSUFBSSxLQUFLO1lBQ3ZDQyxhQUFhLEVBQUUsUUFBUTtZQUN2QkMsYUFBYSxFQUFFO1VBQ2pCLENBQUM7UUFDSDtRQUVBLElBQUksQ0FBQ0wsbUJBQW1CLENBQUN3RyxPQUFPLENBQUNuRyxhQUFhLEVBQUU7VUFDOUMrRSxrQkFBa0IsQ0FBQ2YsYUFBYSxDQUFDM0osRUFBRSxDQUFDK0IsUUFBUSxDQUFDLENBQUMsRUFBRXlGLFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQztVQUMxRWtGLG1CQUFtQixDQUFDd0csT0FBTyxDQUFDbkcsYUFBYSxHQUFHLElBQUk7UUFDbEQ7O1FBRUE7UUFDQTtNQUNGOztNQUVBO01BQ0EsSUFBSTZCLFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ1UsV0FBVyxFQUFFO1FBQ25DO1FBQ0EsSUFBTStTLG1CQUFpQixHQUFBdlMsYUFBQSxDQUFBQSxhQUFBLEtBQVFnSixhQUFhO1VBQUV4SixXQUFXLEVBQUU7UUFBSSxFQUFFO1FBQ2pFcUQsUUFBUSxDQUFDMFAsbUJBQWlCLENBQUM7O1FBRTNCO1FBQ0E7UUFDQSxJQUFNQyxnQkFBYyxHQUFBeFMsYUFBQSxDQUFBQSxhQUFBLEtBQVF1UyxtQkFBaUI7VUFBRS9TLFdBQVcsRUFBRTtRQUFLLEVBQUU7UUFDbkU7UUFDQW1PLDRCQUE0QixDQUMxQjNFLGFBQWEsQ0FBQzNKLEVBQUUsQ0FBQytCLFFBQVEsQ0FBQyxDQUFDLEVBQzNCb1IsZ0JBQWMsRUFDZCxVQUFBekUsWUFBWSxFQUFJO1VBQ2Q1SyxjQUFjLENBQUN6RixNQUFNLENBQUNvVixjQUFjLEVBQUU7WUFBRW5FLE1BQU0sRUFBRVosWUFBWSxDQUFDdk8sV0FBVyxHQUFHLEtBQUssR0FBRztVQUFTLENBQUMsQ0FBQztVQUM5RjJKLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7VUFDL0NJLFdBQVcsQ0FBQXpELGFBQUEsQ0FBQUEsYUFBQSxLQUFNdVMsbUJBQWlCO1lBQUUvUyxXQUFXLEVBQUV1TyxZQUFZLENBQUN2TztVQUFXLEVBQUUsQ0FBQztVQUM1RXFLLHdCQUF3QixDQUFDLENBQUM7VUFDMUJaLGtCQUFrQixDQUFDLENBQUM7VUFDcEIrRSxXQUFXLENBQUMsQ0FBQztRQUNmLENBQUMsRUFDRCxZQUFNO1VBQ0o3SyxjQUFjLENBQUN6RixNQUFNLENBQUNvVixjQUFjLEVBQUU7WUFBRW5FLE1BQU0sRUFBRTtVQUFNLENBQUMsQ0FBQztVQUN4RHhGLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7VUFDL0NJLFdBQVcsQ0FBQzhPLG1CQUFpQixDQUFDO1VBQzlCMUksd0JBQXdCLENBQUMsQ0FBQztVQUMxQlosa0JBQWtCLENBQUMsQ0FBQztVQUNwQitFLFdBQVcsQ0FBQyxDQUFDO1FBQ2YsQ0FDRixDQUFDO01BQ0gsQ0FBQyxNQUFNO1FBQ0w3RSxxQkFBcUIsQ0FBQzlGLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DUixRQUFRLENBQUNtRyxhQUFhLENBQUM7UUFDdkJ2RixXQUFXLENBQUN1RixhQUFhLENBQUM7UUFDMUJhLHdCQUF3QixDQUFDLENBQUM7UUFDMUJaLGtCQUFrQixDQUFDLENBQUM7UUFDcEIrRSxXQUFXLENBQUMsQ0FBQztNQUNmO0lBQ0Y7RUFDRixDQUFDLEVBQUUsQ0FDRGpGLGVBQWUsRUFDZkMsYUFBYSxFQUNiUSwrQkFBK0IsRUFDL0JELHNCQUFzQixFQUN0QkQsc0JBQXNCLEVBQ3RCSCxxQkFBcUIsRUFDckI5RixDQUFDLEVBQ0RSLFFBQVEsRUFDUlksV0FBVyxFQUNYb0csd0JBQXdCLEVBQ3hCWixrQkFBa0IsRUFDbEIrRSxXQUFXLEVBQ1hoTCxtQkFBbUIsQ0FDcEIsQ0FBQztFQUVGdEksU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJaU8sYUFBYSxFQUFFO01BQ2pCLElBQUluRSxjQUFjLENBQUMyRyxPQUFPLENBQUMxRyxRQUFRLENBQUM4RixNQUFNLElBQUkvRixjQUFjLENBQUMyRyxPQUFPLENBQUN6RyxRQUFRLENBQUM2RixNQUFNLEVBQUU7UUFDcEYsSUFBSVEsdUJBQXVCLENBQUMsQ0FBQyxFQUFFO1VBQzdCcEcsbUJBQW1CLENBQUN3RyxPQUFPLEdBQUc7WUFDNUJ2RyxjQUFjLEVBQUUsS0FBSztZQUNyQkMsYUFBYSxFQUFFLElBQUk7WUFDbkJDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCQyxhQUFhLEVBQUUsUUFBUTtZQUN2QkMsYUFBYSxFQUFFO1VBQ2pCLENBQUM7UUFDSDtRQUVBLElBQUk2QixXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsRUFBRTtVQUMxQixJQUFNZ1QsYUFBYSxHQUFBN0csa0JBQUEsQ0FBT2hILGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQzFHLFFBQVEsQ0FBQztVQUMxRCxJQUFNc08sYUFBYSxHQUFBdkgsa0JBQUEsQ0FBT2hILGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVEsQ0FBQztVQUMxREYsY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUSxHQUFHLEVBQUU7VUFDcENELGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVEsR0FBRyxFQUFFO1VBRXBDK04sT0FBTyxDQUFDRyxHQUFHLEVBQ1RwSiwrQkFBK0IsQ0FBQztZQUM5QjZJLGFBQWEsRUFBYkEsYUFBYTtZQUNiQyxhQUFhLEVBQUVTLGFBQWE7WUFDNUJuRixPQUFPLEVBQUUvRyxXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsQ0FBQytCLFFBQVEsQ0FBQztVQUMzQyxDQUFDLENBQUMsRUFBQXNPLE1BQUEsQ0FBQWxFLGtCQUFBLENBQ0VULHVCQUF1QixDQUFDLENBQUMsR0FDekIsQ0FBQ2hCLGtCQUFrQixDQUFDbEQsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTyxFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUFFeUYsV0FBVyxDQUFDcEgsYUFBYSxDQUFDLENBQUMsR0FDbEYsRUFBRSxFQUNQLENBQUM7UUFDSjtRQUNBOEUsa0JBQWtCLENBQUM0RyxPQUFPLEdBQUcsSUFBSTtRQUNqQ3ZELHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUMzQjtNQUNGO01BQ0EsSUFBSXBELGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQzFHLFFBQVEsQ0FBQzhGLE1BQU0sRUFBRTtRQUMxQyxJQUFJUSx1QkFBdUIsQ0FBQyxDQUFDLEVBQUU7VUFDN0JwRyxtQkFBbUIsQ0FBQ3dHLE9BQU8sR0FBRztZQUM1QnZHLGNBQWMsRUFBRSxLQUFLO1lBQ3JCQyxhQUFhLEVBQUUsSUFBSTtZQUNuQkMsY0FBYyxFQUFFLElBQUk7WUFDcEJDLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCQyxhQUFhLEVBQUU7VUFDakIsQ0FBQztRQUNIO1FBRUEsSUFBSTZCLFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ08sRUFBRSxFQUFFO1VBQzFCLElBQU1nVCxjQUFhLEdBQUE3RyxrQkFBQSxDQUFPaEgsY0FBYyxDQUFDMkcsT0FBTyxDQUFDMUcsUUFBUSxDQUFDO1VBQzFERCxjQUFjLENBQUMyRyxPQUFPLENBQUMxRyxRQUFRLEdBQUcsRUFBRTtVQUVwQ2dPLE9BQU8sQ0FBQ0csR0FBRyxFQUNUckosc0JBQXNCLENBQUM7WUFDckJzSixLQUFLLEVBQUVSLGNBQWE7WUFDcEJ6RSxPQUFPLEVBQUUvRyxXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsQ0FBQytCLFFBQVEsQ0FBQztVQUMzQyxDQUFDLENBQUMsRUFBQXNPLE1BQUEsQ0FBQWxFLGtCQUFBLENBQ0VULHVCQUF1QixDQUFDLENBQUMsR0FDekIsQ0FBQ2hCLGtCQUFrQixDQUFDbEQsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTyxFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUFFeUYsV0FBVyxDQUFDcEgsYUFBYSxDQUFDLENBQUMsR0FDbEYsRUFBRSxFQUNQLENBQUM7UUFDSjtRQUNBO01BQ0Y7TUFDQSxJQUFJK0UsY0FBYyxDQUFDMkcsT0FBTyxDQUFDekcsUUFBUSxDQUFDNkYsTUFBTSxFQUFFO1FBQzFDLElBQUlRLHVCQUF1QixDQUFDLENBQUMsRUFBRTtVQUM3QnBHLG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO1lBQzVCdkcsY0FBYyxFQUFFLEtBQUs7WUFDckJDLGFBQWEsRUFBRSxJQUFJO1lBQ25CQyxjQUFjLEVBQUUsSUFBSTtZQUNwQkMsYUFBYSxFQUFFLFFBQVE7WUFDdkJDLGFBQWEsRUFBRTtVQUNqQixDQUFDO1FBQ0g7UUFFQSxJQUFJNkIsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTyxFQUFFLEVBQUU7VUFDMUIsSUFBTTBULGNBQWEsR0FBQXZILGtCQUFBLENBQU9oSCxjQUFjLENBQUMyRyxPQUFPLENBQUN6RyxRQUFRLENBQUM7VUFDMURGLGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVEsR0FBRyxFQUFFO1VBRXBDK04sT0FBTyxDQUFDRyxHQUFHLEVBQ1R0SixzQkFBc0IsQ0FBQztZQUNyQnVKLEtBQUssRUFBRUUsY0FBYTtZQUNwQm5GLE9BQU8sRUFBRS9HLFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ08sRUFBRSxDQUFDK0IsUUFBUSxDQUFDO1VBQzNDLENBQUMsQ0FBQyxFQUFBc08sTUFBQSxDQUFBbEUsa0JBQUEsQ0FDRVQsdUJBQXVCLENBQUMsQ0FBQyxHQUN6QixDQUFDaEIsa0JBQWtCLENBQUNsRCxXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsQ0FBQytCLFFBQVEsQ0FBQyxDQUFDLEVBQUV5RixXQUFXLENBQUNwSCxhQUFhLENBQUMsQ0FBQyxHQUNsRixFQUFFLEVBQ1AsQ0FBQztRQUNKO1FBQ0E4RSxrQkFBa0IsQ0FBQzRHLE9BQU8sR0FBRyxJQUFJO1FBQ2pDdkQscUJBQXFCLENBQUMsSUFBSSxDQUFDO1FBQzNCO01BQ0Y7TUFDQSxJQUFJbUQsdUJBQXVCLENBQUMsQ0FBQyxFQUFFO1FBQzdCO1FBQ0EsSUFBSSxDQUFDcEcsbUJBQW1CLENBQUN3RyxPQUFPLENBQUNuRyxhQUFhLElBQUksQ0FBQ0wsbUJBQW1CLENBQUN3RyxPQUFPLENBQUNyRyxjQUFjLEVBQUU7VUFDN0ZILG1CQUFtQixDQUFDd0csT0FBTyxHQUFHO1lBQzVCdkcsY0FBYyxFQUFFLEtBQUs7WUFDckJDLGFBQWEsRUFBRSxJQUFJO1lBQ25CQyxjQUFjLEVBQUUsS0FBSztZQUNyQkMsYUFBYSxFQUFFLFFBQVE7WUFDdkJDLGFBQWEsRUFBRTtVQUNqQixDQUFDO1FBQ0g7UUFFQSxJQUFJNkIsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTyxFQUFFLEVBQUU7VUFDMUI7VUFDQSxJQUFJLENBQUNzRixtQkFBbUIsQ0FBQ3dHLE9BQU8sQ0FBQ25HLGFBQWEsRUFBRTtZQUM5QytFLGtCQUFrQixDQUFDbEQsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTyxFQUFFLENBQUMrQixRQUFRLENBQUMsQ0FBQyxFQUFFeUYsV0FBVyxDQUFDcEgsYUFBYSxDQUFDO1lBQ2hGa0YsbUJBQW1CLENBQUN3RyxPQUFPLENBQUNuRyxhQUFhLEdBQUcsSUFBSTtVQUNsRDtRQUNGO1FBQ0E7TUFDRjs7TUFFQTtNQUNBLElBQ0UsQ0FBQ1Qsa0JBQWtCLENBQUM0RyxPQUFPLElBQzNCLENBQUN4RCxrQkFBa0IsSUFDbkIsQ0FBQ25ELGNBQWMsQ0FBQzJHLE9BQU8sQ0FBQ3pHLFFBQVEsQ0FBQzZGLE1BQU0sSUFDdkMsQ0FBQzVGLG1CQUFtQixDQUFDd0csT0FBTyxDQUFDckcsY0FBYyxJQUMzQyxDQUFDa0YsbUJBQW1CLElBQ3BCLENBQUMxRSx1QkFBdUIsQ0FBQzZGLE9BQU8sRUFDaEM7UUFDQWhDLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0NQLFdBQVcsQ0FBQzZGLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUFwRixvQkFBb0IsYUFBcEJBLG9CQUFvQix1QkFBcEJBLG9CQUFvQixDQUFFbEUsRUFBRSxNQUFLc0osYUFBYSxDQUFDdEosRUFBRSxFQUFFO1VBQ2pEb0UsV0FBVyxDQUFDa0YsYUFBYSxDQUFDO1FBQzVCO1FBQ0FrQix3QkFBd0IsQ0FBQyxDQUFDO1FBQzFCakIsa0JBQWtCLENBQUMsQ0FBQztRQUNwQjdFLFFBQVEsQ0FBQ2lQLGFBQWEsQ0FBQyxJQUFJQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRGpGLFdBQVcsQ0FBQyxDQUFDO01BQ2Y7SUFDRjtFQUNGLENBQUMsRUFBRSxDQUNEckYsYUFBYSxFQUNiOUIsV0FBVyxDQUFDL0gsT0FBTyxDQUFDTyxFQUFFLEVBQ3RCbUssK0JBQStCLEVBQy9CRCxzQkFBc0IsRUFDdEJELHNCQUFzQixFQUN0QkgscUJBQXFCLEVBQ3JCOUYsQ0FBQyxFQUNEUCxXQUFXLEVBQ1grRyx3QkFBd0IsRUFDeEJqQixrQkFBa0IsRUFDbEJvRixXQUFXLENBQ1osQ0FBQztFQUVGLElBQU1rRix5QkFBeUIsR0FBR3BZLFdBQVcsQ0FBQyxZQUFNO0lBQ2xELElBQUksQ0FBQ3lKLGtCQUFrQixDQUFDNEcsT0FBTyxJQUFJLENBQUN4RCxrQkFBa0IsRUFBRTs7SUFFeEQ7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7SUFFQTtJQUNBO0lBQ0FyQyx1QkFBdUIsQ0FBQzZGLE9BQU8sR0FBRyxJQUFJO0lBRXRDLElBQUl0RSxXQUFXLENBQUNqSSxTQUFTLElBQUkrSixhQUFhLEVBQUU7TUFDMUM3RixXQUFXLENBQUM2RixhQUFhLENBQUM7TUFDMUIsSUFBSSxDQUFBcEYsb0JBQW9CLGFBQXBCQSxvQkFBb0IsdUJBQXBCQSxvQkFBb0IsQ0FBRWxFLEVBQUUsTUFBS3NKLGFBQWEsQ0FBQ3RKLEVBQUUsRUFBRTtRQUNqRG9FLFdBQVcsQ0FBQ2tGLGFBQWEsQ0FBQztNQUM1QjtNQUNBNUUsUUFBUSxDQUFDaVAsYUFBYSxDQUFDLElBQUlDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO01BQzFEOUoscUJBQXFCLENBQUM5RixDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztNQUMvQ3VGLGtCQUFrQixDQUFDLENBQUM7SUFDdEIsQ0FBQyxNQUFNLElBQUksQ0FBQy9CLFdBQVcsQ0FBQ2pJLFNBQVMsSUFBSW9LLGFBQWEsRUFBRTtNQUNsREcscUJBQXFCLENBQUM5RixDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztNQUMvQzRGLGtCQUFrQixDQUFDLENBQUM7SUFDdEI7SUFFQVcsc0JBQXNCLENBQUMsQ0FBQztJQUN4QkMsd0JBQXdCLENBQUMsQ0FBQztJQUMxQkssd0JBQXdCLENBQUMsQ0FBQztJQUUxQjhELFdBQVcsQ0FBQyxDQUFDO0VBQ2YsQ0FBQyxFQUFFLENBQ0RyRyxrQkFBa0IsRUFDbEJkLFdBQVcsQ0FBQ2pJLFNBQVMsRUFDckIrSixhQUFhLEVBQ2JLLGFBQWEsRUFDYmxHLFdBQVcsRUFDWFMsb0JBQW9CLGFBQXBCQSxvQkFBb0IsdUJBQXBCQSxvQkFBb0IsQ0FBRWxFLEVBQUUsRUFDeEJvRSxXQUFXLEVBQ1gwRixxQkFBcUIsRUFDckI5RixDQUFDLEVBQ0R1RixrQkFBa0IsRUFDbEJLLGtCQUFrQixFQUNsQlcsc0JBQXNCLEVBQ3RCQyx3QkFBd0IsRUFDeEJLLHdCQUF3QixFQUN4QjhELFdBQVcsQ0FDWixDQUFDO0VBRUYsSUFBTW1GLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBaUJBLENBQUFDLEtBQUEsRUFBdUQ7SUFBQSxJQUFyQ0MsU0FBUyxHQUFBRCxLQUFBLENBQXJCRSxVQUFVO0lBQ3JDLElBQU1DLFVBQVUsR0FBR0YsU0FBUztJQUM1QixJQUFJRSxVQUFVLENBQUM5UixNQUFNLEtBQUssTUFBTSxJQUFJOFIsVUFBVSxDQUFDOVIsTUFBTSxLQUFLLFFBQVEsRUFBRTtNQUNsRXFGLGNBQWMsQ0FBQyxVQUFBeEcsSUFBSSxFQUFJO1FBQ3JCLElBQU1rVCxnQkFBZ0IsR0FBR2xULElBQUksQ0FBQ3pCLFNBQVMsQ0FBQ2tDLEdBQUcsQ0FBQyxVQUFBRSxJQUFJLEVBQUk7VUFDbEQsSUFBSUEsSUFBSSxDQUFDbEMsSUFBSSxLQUFLd1UsVUFBVSxDQUFDcFMsUUFBUSxFQUFFO1lBQ3JDLE9BQUFuQixhQUFBLENBQUFBLGFBQUEsS0FDS2lCLElBQUk7Y0FDUFEsTUFBTSxFQUFFOFIsVUFBVSxDQUFDOVIsTUFBTTtjQUN6QnBDLEVBQUUsRUFBRWtVLFVBQVUsQ0FBQ0UsaUJBQWlCLElBQUl4UyxJQUFJLENBQUM1QjtZQUFFO1VBRS9DO1VBQ0EsT0FBTzRCLElBQUk7UUFDYixDQUFDLENBQUM7UUFDRixJQUFNeVMsZUFBZSxHQUFHRixnQkFBZ0IsQ0FBQ0csSUFBSSxDQUFDLFVBQUExUyxJQUFJO1VBQUEsT0FBSUEsSUFBSSxDQUFDUSxNQUFNLEtBQUssU0FBUztRQUFBLEVBQUM7UUFDaEYsSUFBTW1TLGFBQWEsR0FBR0osZ0JBQWdCLENBQUNHLElBQUksQ0FBQyxVQUFBMVMsSUFBSTtVQUFBLE9BQUlBLElBQUksQ0FBQ1EsTUFBTSxLQUFLLFFBQVE7UUFBQSxFQUFDO1FBQzdFLElBQUltUyxhQUFhLElBQUksQ0FBQ0YsZUFBZSxFQUFFO1VBQ3JDblAsa0JBQWtCLENBQUM0RyxPQUFPLEdBQUcsS0FBSztVQUNsQ3ZELHFCQUFxQixDQUFDLEtBQUssQ0FBQztVQUM1QndCLG1CQUFtQixDQUNqQnZDLFdBQVcsQ0FBQ2pJLFNBQVMsR0FBR3lFLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxHQUFHQSxDQUFDLENBQUMsNEJBQTRCLENBQ2pHLENBQUM7UUFDSCxDQUFDLE1BQU0sSUFBSSxDQUFDcVEsZUFBZSxJQUFJLENBQUNFLGFBQWEsRUFBRTtVQUM3Q3JQLGtCQUFrQixDQUFDNEcsT0FBTyxHQUFHLEtBQUs7VUFDbEN2RCxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7O1VBRTVCO1VBQ0EsSUFBSWpELG1CQUFtQixDQUFDd0csT0FBTyxDQUFDckcsY0FBYyxJQUFJRyxnQkFBZ0IsQ0FBQ2tHLE9BQU8sRUFBRTtZQUMxRXpGLGlCQUFpQixDQUFDLFVBQUFtTyxTQUFTO2NBQUEsT0FBSUEsU0FBUyxHQUFHLENBQUM7WUFBQSxFQUFDO1VBQy9DLENBQUMsTUFBTSxJQUNMbFAsbUJBQW1CLENBQUN3RyxPQUFPLENBQUNwRyxhQUFhLEtBQUssUUFBUSxJQUN0RCxDQUFDSixtQkFBbUIsQ0FBQ3dHLE9BQU8sQ0FBQ3JHLGNBQWMsSUFDM0MsQ0FBQ08sZ0JBQWdCLENBQUM4RixPQUFPLEVBQ3pCO1lBQ0E7WUFDQTlGLGdCQUFnQixDQUFDOEYsT0FBTyxHQUFHLElBQUk7WUFDL0J6RixpQkFBaUIsQ0FBQyxVQUFBbU8sU0FBUztjQUFBLE9BQUlBLFNBQVMsR0FBRyxDQUFDO1lBQUEsRUFBQztVQUMvQztRQUNGO1FBQ0EsT0FBQTdULGFBQUEsQ0FBQUEsYUFBQSxLQUNLTSxJQUFJO1VBQ1B6QixTQUFTLEVBQUUyVTtRQUFnQjtNQUUvQixDQUFDLENBQUM7SUFDSjtFQUNGLENBQUM7RUFFRDlZLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBSWlQLHNCQUFzQixJQUFJLENBQUNGLGtCQUFrQixJQUFJLENBQUNDLGNBQWMsRUFBRTtNQUNwRTtNQUNBLElBQUluRixrQkFBa0IsQ0FBQzRHLE9BQU8sSUFBSXhELGtCQUFrQixJQUFJbkQsY0FBYyxDQUFDMkcsT0FBTyxDQUFDekcsUUFBUSxDQUFDNkYsTUFBTSxFQUFFO1FBQzlGO01BQ0Y7TUFDQTtNQUNBLElBQUlqRix1QkFBdUIsQ0FBQzZGLE9BQU8sRUFBRTtRQUNuQztNQUNGO01BQ0FoQyxxQkFBcUIsQ0FBQzlGLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO01BQy9Dd0csd0JBQXdCLENBQUMsQ0FBQztNQUMxQm1FLFdBQVcsQ0FBQyxDQUFDO0lBQ2Y7SUFDQSxJQUFJdEUsY0FBYyxFQUFFO01BQ2xCTixtQkFBbUIsQ0FDakJ2QyxXQUFXLENBQUNqSSxTQUFTLEdBQUd5RSxDQUFDLENBQUMsbUNBQW1DLENBQUMsR0FBR0EsQ0FBQyxDQUFDLDRCQUE0QixDQUNqRyxDQUFDO01BQ0R3Ryx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVCO0VBQ0YsQ0FBQyxFQUFFLENBQUNGLHNCQUFzQixFQUFFRixrQkFBa0IsRUFBRUMsY0FBYyxFQUFFL0Isa0JBQWtCLENBQUMsQ0FBQztFQUVwRmpOLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTW9aLE9BQU8sR0FBR25QLG1CQUFtQixDQUFDd0csT0FBTzs7SUFFM0M7SUFDQSxJQUFJMkksT0FBTyxDQUFDaFAsY0FBYyxLQUFLUCxrQkFBa0IsQ0FBQzRHLE9BQU8sSUFBSXhELGtCQUFrQixDQUFDLEVBQUU7TUFDaEY7TUFDQSxJQUFJcUMsbUJBQW1CLElBQUksQ0FBQy9FLGdCQUFnQixDQUFDa0csT0FBTyxFQUFFO1FBQ3BEbEcsZ0JBQWdCLENBQUNrRyxPQUFPLEdBQUcsSUFBSTtNQUNqQztNQUNBO0lBQ0Y7O0lBRUE7SUFDQSxJQUFJbEcsZ0JBQWdCLENBQUNrRyxPQUFPLElBQUkySSxPQUFPLENBQUNoUCxjQUFjLElBQUlnUCxPQUFPLENBQUMvTyxhQUFhLEtBQUssUUFBUSxFQUFFO01BQzVGb0UscUJBQXFCLENBQUM5RixDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztNQUMvQzRGLGtCQUFrQixDQUFDLENBQUM7TUFDcEIsSUFBSWUsbUJBQW1CLEVBQUU7UUFDdkJFLHdCQUF3QixDQUFDLENBQUM7TUFDNUI7TUFDQThELFdBQVcsQ0FBQyxDQUFDO01BQ2JySixtQkFBbUIsQ0FBQ3dHLE9BQU8sR0FBRztRQUM1QnZHLGNBQWMsRUFBRSxLQUFLO1FBQ3JCQyxhQUFhLEVBQUUsS0FBSztRQUNwQkMsY0FBYyxFQUFFLEtBQUs7UUFDckJDLGFBQWEsRUFBRSxJQUFJO1FBQ25CQyxhQUFhLEVBQUU7TUFDakIsQ0FBQztNQUNEO0lBQ0Y7SUFFQSxJQUFJLENBQUNnRixtQkFBbUIsRUFBRTtNQUN4Qi9FLGdCQUFnQixDQUFDa0csT0FBTyxHQUFHLEtBQUs7TUFDaEM7SUFDRjtJQUVBLElBQUlsRyxnQkFBZ0IsQ0FBQ2tHLE9BQU8sRUFBRTtNQUM1QjtJQUNGO0lBRUFsRyxnQkFBZ0IsQ0FBQ2tHLE9BQU8sR0FBRyxJQUFJO0lBQy9CakIsd0JBQXdCLENBQUMsQ0FBQztJQUUxQixJQUFJNEosT0FBTyxDQUFDL08sYUFBYSxLQUFLLFFBQVEsRUFBRTtNQUN0QztNQUNBO01BQ0EsSUFBSStPLE9BQU8sQ0FBQ2hQLGNBQWMsRUFBRTtRQUMxQnFFLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0M0RixrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BCK0UsV0FBVyxDQUFDLENBQUM7UUFDYjtNQUNGOztNQUVBO01BQ0EsSUFBTStGLFVBQVUsR0FBR2xOLFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ1UsV0FBVyxHQUFBUSxhQUFBLENBQUFBLGFBQUEsS0FBUWdKLGFBQWE7UUFBRXhKLFdBQVcsRUFBRTtNQUFJLEtBQUt3SixhQUFhO01BRTVHRyxxQkFBcUIsQ0FBQzlGLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO01BQy9DUixRQUFRLENBQUNrUixVQUFVLENBQUM7TUFDcEJ0USxXQUFXLENBQUNzUSxVQUFVLENBQUM7O01BRXZCO01BQ0EsSUFBSWxOLFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ1UsV0FBVyxFQUFFO1FBQ25DO1FBQ0E7UUFDQSxJQUFNZ1QsY0FBYyxHQUFBeFMsYUFBQSxDQUFBQSxhQUFBLEtBQVErVCxVQUFVO1VBQUV2VSxXQUFXLEVBQUU7UUFBSyxFQUFFO1FBQzVEbU8sNEJBQTRCLENBQzFCM0UsYUFBYSxDQUFDM0osRUFBRSxDQUFDK0IsUUFBUSxDQUFDLENBQUMsRUFDM0JvUixjQUFjLEVBQ2QsWUFBTTtVQUNKO1VBQ0F2SixrQkFBa0IsQ0FBQyxDQUFDO1VBQ3BCK0UsV0FBVyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQ0QsWUFBTTtVQUNKL0Usa0JBQWtCLENBQUMsQ0FBQztVQUNwQitFLFdBQVcsQ0FBQyxDQUFDO1FBQ2YsQ0FDRixDQUFDO01BQ0gsQ0FBQyxNQUFNO1FBQ0wvRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3BCK0UsV0FBVyxDQUFDLENBQUM7TUFDZjtJQUNGLENBQUMsTUFBTSxJQUFJOEYsT0FBTyxDQUFDL08sYUFBYSxLQUFLLFFBQVEsRUFBRTtNQUM3Q29FLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7TUFDL0NQLFdBQVcsQ0FBQzZGLGFBQWEsQ0FBQztNQUMxQixJQUFJLENBQUFwRixvQkFBb0IsYUFBcEJBLG9CQUFvQix1QkFBcEJBLG9CQUFvQixDQUFFbEUsRUFBRSxNQUFLc0osYUFBYSxDQUFDdEosRUFBRSxFQUFFO1FBQ2pEb0UsV0FBVyxDQUFDa0YsYUFBYSxDQUFDO01BQzVCO01BQ0FDLGtCQUFrQixDQUFDLENBQUM7TUFDcEI3RSxRQUFRLENBQUNpUCxhQUFhLENBQUMsSUFBSUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7TUFDMURqRixXQUFXLENBQUMsQ0FBQztJQUNmO0lBRUFySixtQkFBbUIsQ0FBQ3dHLE9BQU8sR0FBRztNQUM1QnZHLGNBQWMsRUFBRSxLQUFLO01BQ3JCQyxhQUFhLEVBQUUsS0FBSztNQUNwQkMsY0FBYyxFQUFFLEtBQUs7TUFDckJDLGFBQWEsRUFBRSxJQUFJO01BQ25CQyxhQUFhLEVBQUU7SUFDakIsQ0FBQztFQUNILENBQUMsRUFBRSxDQUFDZ0YsbUJBQW1CLEVBQUV2RSxjQUFjLENBQUMsQ0FBQzs7RUFFekM7RUFDQS9LLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTW9aLE9BQU8sR0FBR25QLG1CQUFtQixDQUFDd0csT0FBTzs7SUFFM0M7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0EsSUFDRTJJLE9BQU8sQ0FBQy9PLGFBQWEsS0FBSyxRQUFRLElBQ2xDLENBQUMrTyxPQUFPLENBQUNoUCxjQUFjLElBQ3ZCTyxnQkFBZ0IsQ0FBQzhGLE9BQU8sSUFDeEJuQyxhQUFhLElBQ2IsQ0FBQ3pFLGtCQUFrQixDQUFDNEcsT0FBTyxJQUMzQixDQUFDeEQsa0JBQWtCLEVBQ25CO01BQ0F3QixxQkFBcUIsQ0FBQzlGLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO01BQy9DNEYsa0JBQWtCLENBQUMsQ0FBQztNQUNwQitFLFdBQVcsQ0FBQyxDQUFDO01BQ2IzSSxnQkFBZ0IsQ0FBQzhGLE9BQU8sR0FBRyxLQUFLO01BQ2hDeEcsbUJBQW1CLENBQUN3RyxPQUFPLEdBQUc7UUFDNUJ2RyxjQUFjLEVBQUUsS0FBSztRQUNyQkMsYUFBYSxFQUFFLEtBQUs7UUFDcEJDLGNBQWMsRUFBRSxLQUFLO1FBQ3JCQyxhQUFhLEVBQUUsSUFBSTtRQUNuQkMsYUFBYSxFQUFFO01BQ2pCLENBQUM7SUFDSDs7SUFFQTtJQUNBLElBQ0U4TyxPQUFPLENBQUMvTyxhQUFhLEtBQUssUUFBUSxJQUNsQytPLE9BQU8sQ0FBQ2hQLGNBQWMsSUFDdEJHLGdCQUFnQixDQUFDa0csT0FBTyxJQUN4Qm5DLGFBQWEsSUFDYixDQUFDekUsa0JBQWtCLENBQUM0RyxPQUFPLElBQzNCLENBQUN4RCxrQkFBa0IsRUFDbkI7TUFDQXdCLHFCQUFxQixDQUFDOUYsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUM7TUFDL0M0RixrQkFBa0IsQ0FBQyxDQUFDO01BQ3BCLElBQUllLG1CQUFtQixFQUFFO1FBQ3ZCRSx3QkFBd0IsQ0FBQyxDQUFDO01BQzVCO01BQ0E4RCxXQUFXLENBQUMsQ0FBQztNQUNickosbUJBQW1CLENBQUN3RyxPQUFPLEdBQUc7UUFDNUJ2RyxjQUFjLEVBQUUsS0FBSztRQUNyQkMsYUFBYSxFQUFFLEtBQUs7UUFDcEJDLGNBQWMsRUFBRSxLQUFLO1FBQ3JCQyxhQUFhLEVBQUUsSUFBSTtRQUNuQkMsYUFBYSxFQUFFO01BQ2pCLENBQUM7SUFDSDtFQUNGLENBQUMsRUFBRSxDQUNEUyxjQUFjLEVBQ2R1RCxhQUFhLEVBQ2JnQixtQkFBbUIsRUFDbkJyQyxrQkFBa0IsRUFDbEJ3QixxQkFBcUIsRUFDckI5RixDQUFDLEVBQ0Q0RixrQkFBa0IsRUFDbEJpQix3QkFBd0IsRUFDeEI4RCxXQUFXLENBQ1osQ0FBQztFQUVGdFQsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJaU4sa0JBQWtCLEVBQUU7TUFBQSxJQUFBcU0saUJBQUE7TUFDdEIsSUFBTUMsT0FBTyw0QkFBQXZFLE1BQUEsQ0FBNEJ0UCxTQUFTLEdBQUdBLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFZixFQUFFLEdBQUcySixhQUFhLGFBQWJBLGFBQWEsZ0JBQUFnTCxpQkFBQSxHQUFiaEwsYUFBYSxDQUFFM0osRUFBRSxjQUFBMlUsaUJBQUEsdUJBQWpCQSxpQkFBQSxDQUFtQjVTLFFBQVEsQ0FBQyxDQUFDLENBQUU7TUFDcEcsSUFBSThTLElBQUksRUFBRTtRQUNSLElBQUk5UCxZQUFZLEVBQUU7VUFBQSxJQUFBK1AsS0FBQTtVQUNoQixDQUFBQSxLQUFBLEdBQUFELElBQUksY0FBQUMsS0FBQSxlQUFKQSxLQUFBLENBQU1DLGdCQUFnQixDQUFDSCxPQUFPLEVBQUVkLGlCQUFpQixDQUFDO1FBQ3BELENBQUMsTUFBTTtVQUFBLElBQUFrQixNQUFBLEVBQUFDLE1BQUEsRUFBQUMsaUJBQUE7VUFDTCxJQUFNbEIsU0FBUyxHQUFHO1lBQ2hCbUIsVUFBVSxFQUFFUCxPQUFPO1lBQ25CN0QsTUFBTSxHQUFBaUUsTUFBQSxHQUFFSCxJQUFJLGNBQUFHLE1BQUEsZ0JBQUFBLE1BQUEsR0FBSkEsTUFBQSxDQUFNSSxVQUFVLGNBQUFKLE1BQUEsdUJBQWhCQSxNQUFBLENBQWtCSztVQUM1QixDQUFDO1VBQ0QsQ0FBQUosTUFBQSxHQUFBSixJQUFJLGNBQUFJLE1BQUEsZUFBSkEsTUFBQSxDQUFNSyxxQkFBcUIsQ0FBQ3RCLFNBQVMsRUFBRVksT0FBTyxFQUFFL1EsSUFBSSxFQUFFQSxJQUFJLEdBQUFxUixpQkFBQSxHQUFFTCxJQUFJLENBQUNVLFdBQVcsY0FBQUwsaUJBQUEsdUJBQWhCQSxpQkFBQSxDQUFrQk0sYUFBYSxDQUFDO1VBQzVGeFEsZUFBZSxDQUFDLElBQUksQ0FBQztRQUN2QjtNQUNGO0lBQ0Y7RUFDRixDQUFDLEVBQUUsQ0FBQ3NELGtCQUFrQixFQUFFdkQsWUFBWSxFQUFFOFAsSUFBSSxFQUFFOVQsU0FBUyxFQUFFNEksYUFBYSxDQUFDLENBQUM7RUFFdEV0TyxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUksQ0FBQ21MLE1BQU0sSUFBSSxDQUFDeEYsV0FBVyxDQUFDa0ssTUFBTSxFQUFFO0lBQ3BDLElBQUl2RCxZQUFZLElBQUksQ0FBQzVCLHNCQUFzQixDQUFDK0YsT0FBTyxFQUFFO0lBRXJELElBQU0ySixpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQWlCQSxDQUFJQyxNQUFXLEVBQUs7TUFDekMsSUFBSUEsTUFBTSxDQUFDeFQsSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDMk0sTUFBTSxDQUFDc0Msd0NBQXdDLEVBQUU7UUFDaEZwSCxtQkFBbUIsQ0FBQy9GLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNDcUQsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUNuQnNPLFVBQVUsQ0FBQyxZQUFNO1VBQ2ZoSCxXQUFXLENBQUMsQ0FBQztRQUNmLENBQUMsRUFBRSxJQUFJLENBQUM7UUFDUixPQUFPLEtBQUs7TUFDZDtNQUNBbEgsY0FBYyxDQUFDLFVBQUF4RyxJQUFJLEVBQUk7UUFDckIsSUFBTTJVLGdCQUFnQixHQUFHOVUsc0NBQXNDLENBQUM0VSxNQUFNLEVBQUUxVSxXQUFXLEVBQUVDLElBQUksQ0FBQztRQUMxRmtILGVBQWUsQ0FBQzJELE9BQU8sR0FBRzhKLGdCQUFnQjtRQUMxQyxPQUFPQSxnQkFBZ0I7TUFDekIsQ0FBQyxDQUFDO01BQ0Z2TyxZQUFZLENBQUMsS0FBSyxDQUFDO01BQ25CLElBQUl2Qix3QkFBd0IsQ0FBQ2dHLE9BQU8sRUFBRTtRQUNwQzdFLFVBQVUsQ0FBQ25CLHdCQUF3QixDQUFDZ0csT0FBTyxDQUFDO1FBQzVDaEcsd0JBQXdCLENBQUNnRyxPQUFPLEdBQUcsSUFBSTtNQUN6QztNQUNBLElBQU15QyxPQUFPLEdBQUdtSCxNQUFNLENBQUMxVixFQUFFO01BQ3pCLElBQUl1TyxPQUFPLEVBQUU7UUFDWDFQLGtCQUFrQixDQUFDMFAsT0FBTyxDQUFDeE0sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUNuQzhULElBQUksQ0FBQyxVQUFBQyxVQUFVLEVBQUk7VUFDbEIsSUFBTUMsU0FBUyxHQUFHcFgsNkJBQTZCLENBQUNtWCxVQUFVLENBQUM7VUFDM0RyTyxjQUFjLENBQUMsVUFBQXhHLElBQUksRUFBSTtZQUNyQixJQUFNaVEsSUFBSSxHQUFBdlEsYUFBQSxDQUFBQSxhQUFBLEtBQ0xNLElBQUk7Y0FDUGIsYUFBYSxFQUFBTyxhQUFBLENBQUFBLGFBQUEsS0FDUk0sSUFBSSxDQUFDYixhQUFhO2dCQUNyQkksa0JBQWtCLEVBQUV1VjtjQUFTO1lBQzlCLEVBQ0Y7WUFDRDVOLGVBQWUsQ0FBQzJELE9BQU8sR0FBQW5MLGFBQUEsQ0FBQUEsYUFBQSxLQUNsQndILGVBQWUsQ0FBQzJELE9BQU87Y0FDMUIxTCxhQUFhLEVBQUFPLGFBQUEsQ0FBQUEsYUFBQSxLQUNSd0gsZUFBZSxDQUFDMkQsT0FBTyxDQUFDMUwsYUFBYTtnQkFDeENJLGtCQUFrQixFQUFFdVY7Y0FBUztZQUM5QixFQUNGO1lBQ0QsT0FBTzdFLElBQUk7VUFDYixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsU0FDSSxDQUFDLFVBQUFsSixLQUFLLEVBQUk7VUFDZGdPLE9BQU8sQ0FBQ2hPLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRUEsS0FBSyxDQUFDO1FBQzFELENBQUMsQ0FBQztNQUNOO01BQ0EsT0FBTyxJQUFJO0lBQ2IsQ0FBQztJQUVELElBQU1pTyxVQUFVLEdBQUdsUSxzQkFBc0IsQ0FBQytGLE9BQU87SUFDakQsSUFBSW1LLFVBQVUsRUFBRTtNQUNkbFEsc0JBQXNCLENBQUMrRixPQUFPLEdBQUcsSUFBSTtNQUNyQzJKLGlCQUFpQixDQUFDUSxVQUFVLENBQUM7TUFDN0I7SUFDRjtJQUVBLElBQUlsVixTQUFTLElBQUksQ0FBQzRHLFlBQVksSUFBSTNHLFdBQVcsQ0FBQ2tLLE1BQU0sRUFBRTtNQUNwRHVLLGlCQUFpQixDQUFDMVUsU0FBUyxDQUFDO01BQzVCO0lBQ0Y7SUFFQSxJQUFJLENBQUNxRyxTQUFTLElBQUksQ0FBQ08sWUFBWSxJQUFJLENBQUM1RyxTQUFTLElBQUksQ0FBQ3lHLFdBQVcsQ0FBQ2pJLFNBQVMsRUFBRTtNQUN2RWtJLGNBQWMsQ0FBQyxVQUFBeEcsSUFBSTtRQUFBLE9BQUFOLGFBQUEsQ0FBQUEsYUFBQSxLQUNkTSxJQUFJO1VBQ1B4QixPQUFPLEVBQUFrQixhQUFBLENBQUFBLGFBQUEsS0FDRk0sSUFBSSxDQUFDeEIsT0FBTztZQUNmTSxPQUFPLEVBQUVpQixXQUFXLENBQUMsQ0FBQztVQUFDO1FBQ3hCO01BQUEsQ0FDRCxDQUFDO0lBQ0w7RUFDRixDQUFDLEVBQUUsQ0FBQ0QsU0FBUyxFQUFFeUYsTUFBTSxFQUFFWSxTQUFTLEVBQUVPLFlBQVksRUFBRTNHLFdBQVcsYUFBWEEsV0FBVyx1QkFBWEEsV0FBVyxDQUFFa0ssTUFBTSxFQUFFMUQsV0FBVyxDQUFDakksU0FBUyxFQUFFeUUsQ0FBQyxDQUFDLENBQUM7RUFFL0YzSSxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUkwTSxpQkFBaUIsRUFBRTtNQUNyQixJQUFJQSxpQkFBaUIsS0FBSywrREFBK0QsRUFBRTtRQUN6RmdDLG1CQUFtQixDQUFDL0YsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0MyUixVQUFVLENBQUMsWUFBTTtVQUNmaEgsV0FBVyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQ1I7TUFDRjtNQUNBNUUsbUJBQW1CLENBQUNoQyxpQkFBaUIsQ0FBQztNQUN0QzROLFVBQVUsQ0FBQyxZQUFNO1FBQ2ZoSCxXQUFXLENBQUMsQ0FBQztNQUNmLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDVjtFQUNGLENBQUMsRUFBRSxDQUFDNUcsaUJBQWlCLENBQUMsQ0FBQztFQUV2QixJQUFNbU8sMkJBQTJCLEdBQUc1YSxPQUFPLENBQUMsWUFBTTtJQUFBLElBQUE2YSxzQkFBQTtJQUNoRCxJQUFJLEVBQUMzTyxXQUFXLGFBQVhBLFdBQVcsZ0JBQUEyTyxzQkFBQSxHQUFYM08sV0FBVyxDQUFFcEgsYUFBYSxjQUFBK1Ysc0JBQUEsZUFBMUJBLHNCQUFBLENBQTRCN1YsT0FBTyxLQUFJa0gsV0FBVyxDQUFDcEgsYUFBYSxDQUFDRSxPQUFPLENBQUM0SyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQzFGLE9BQU8sS0FBSztJQUNkO0lBQ0EsT0FBTzFELFdBQVcsQ0FBQ3BILGFBQWEsQ0FBQ0UsT0FBTyxDQUFDZ1UsSUFBSSxDQUFDLFVBQUE3UixNQUFNO01BQUEsT0FBSUEsTUFBTSxDQUFDSSxTQUFTLEtBQUssS0FBSyxJQUFJSixNQUFNLENBQUNLLFVBQVUsS0FBSyxJQUFJO0lBQUEsRUFBQztFQUNuSCxDQUFDLEVBQUUsQ0FBQzBFLFdBQVcsYUFBWEEsV0FBVyxnQkFBQXJFLHNCQUFBLEdBQVhxRSxXQUFXLENBQUVwSCxhQUFhLGNBQUErQyxzQkFBQSx1QkFBMUJBLHNCQUFBLENBQTRCN0MsT0FBTyxDQUFDLENBQUM7RUFFekMsSUFBTThWLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUEsRUFBUztJQUFBLElBQUFDLG9CQUFBO0lBQ2pDLElBQUk3TyxXQUFXLGFBQVhBLFdBQVcsZ0JBQUE2TyxvQkFBQSxHQUFYN08sV0FBVyxDQUFFL0gsT0FBTyxjQUFBNFcsb0JBQUEsZUFBcEJBLG9CQUFBLENBQXNCclcsRUFBRSxFQUFFO01BQUEsSUFBQXNXLHFCQUFBO01BQzVCO01BQ0E5UixjQUFjLENBQ1pnRCxXQUFXLENBQUMvSCxPQUFPLENBQUNPLEVBQUUsRUFDdEIsVUFBQTBPLFlBQVksRUFBSTtRQUNkakgsY0FBYyxDQUFDLFVBQUF4RyxJQUFJO1VBQUEsT0FBQU4sYUFBQSxDQUFBQSxhQUFBLEtBQ2RNLElBQUk7WUFDUHhCLE9BQU8sRUFBQWtCLGFBQUEsQ0FBQUEsYUFBQSxLQUNGTSxJQUFJLENBQUN4QixPQUFPO2NBQ2ZVLFdBQVcsRUFBRXVPLFlBQVksQ0FBQ3ZPO1lBQVc7VUFDdEM7UUFBQSxDQUNELENBQUM7UUFDSDtRQUNBd0QsbUJBQW1CLENBQUMrSyxZQUFZLEVBQUUsSUFBSSxDQUFDO1FBQ3ZDNUssY0FBYyxDQUFDekYsTUFBTSxDQUFDb1YsY0FBYyxFQUFFO1VBQ3BDbkUsTUFBTSxFQUFFWixZQUFZLENBQUN2TyxXQUFXLEdBQUcsS0FBSyxHQUFHO1FBQzdDLENBQUMsQ0FBQztNQUNKLENBQUMsRUFDRG1DLFNBQVMsRUFDVGtGLFdBQVcsYUFBWEEsV0FBVyxnQkFBQThPLHFCQUFBLEdBQVg5TyxXQUFXLENBQUUvSCxPQUFPLGNBQUE2VyxxQkFBQSx1QkFBcEJBLHFCQUFBLENBQXNCblcsV0FDeEIsQ0FBQztJQUNILENBQUMsTUFBTTtNQUNMO01BQ0FzSCxjQUFjLENBQUMsVUFBQXhHLElBQUk7UUFBQSxPQUFBTixhQUFBLENBQUFBLGFBQUEsS0FDZE0sSUFBSTtVQUNQeEIsT0FBTyxFQUFBa0IsYUFBQSxDQUFBQSxhQUFBLEtBQ0ZNLElBQUksQ0FBQ3hCLE9BQU87WUFDZlUsV0FBVyxFQUFFLENBQUNjLElBQUksQ0FBQ3hCLE9BQU8sQ0FBQ1U7VUFBVztRQUN2QztNQUFBLENBQ0QsQ0FBQztJQUNMO0VBQ0YsQ0FBQztFQUVELElBQUksQ0FBQ3FHLE1BQU0sSUFBSyxFQUFDb0MsZUFBZSxhQUFmQSxlQUFlLGVBQWZBLGVBQWUsQ0FBRTJOLE1BQU0sS0FBSSxFQUFDM04sZUFBZSxhQUFmQSxlQUFlLGVBQWZBLGVBQWUsQ0FBRTROLElBQUksS0FBSSxFQUFDNU4sZUFBZSxhQUFmQSxlQUFlLGVBQWZBLGVBQWUsVUFBUSxDQUFDLEVBQUUsT0FBTyxJQUFJO0VBRTVHLG9CQUFPbE4sWUFBWSxjQUNqQnVELEtBQUEsQ0FBQzVDLFFBQVE7SUFBQ29hLE1BQU0sRUFBRXBTLG1CQUFvQjtJQUFDcVMsT0FBTyxFQUFFM0gsbUJBQW9CO0lBQUE0SCxRQUFBLGdCQUNsRTVYLElBQUEsQ0FBQzFCLFlBQVk7TUFBQ3VaLEdBQUcsRUFBRTNSLFFBQVM7TUFBQzRSLFFBQVEsRUFBRSxDQUFDLENBQUU7TUFBQUYsUUFBQSxFQUN2Q3ZQLFNBQVMsZ0JBQ1JySSxJQUFBLENBQUNyQixtQkFBbUI7UUFBQWlaLFFBQUEsZUFDbEI1WCxJQUFBLENBQUNwQiwwQkFBMEI7VUFBQWdaLFFBQUEsZUFDekI1WCxJQUFBLENBQUM3QyxhQUFhO1lBQUM4RixJQUFJLEVBQUMsTUFBTTtZQUFDOFUsS0FBSyxFQUFDO1VBQVMsQ0FBRTtRQUFDLENBQ25CO01BQUMsQ0FDVixDQUFDLGdCQUV0Qi9YLElBQUEsQ0FBQUksU0FBQTtRQUFBd1gsUUFBQSxFQUNHck8sa0JBQWtCLElBQUlwRCxrQkFBa0IsQ0FBQzRHLE9BQU8sZ0JBQy9DL00sSUFBQSxDQUFDWixjQUFjO1VBQ2I0WSxXQUFXLEVBQUV2UCxXQUFXLENBQUNoSSxTQUFVO1VBQ25Dd1gsS0FBSyxFQUFFaFQsQ0FBQyx3QkFBQXFNLE1BQUEsQ0FBd0I3SSxXQUFXLENBQUNqSSxTQUFTLEdBQUcsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUUsQ0FBRTtVQUNyRzBYLFNBQVMsRUFBRXBEO1FBQTBCLENBQ3RDLENBQUMsZ0JBRUY1VSxLQUFBLENBQUFFLFNBQUE7VUFBQXdYLFFBQUEsZ0JBQ0UxWCxLQUFBLENBQUNsQyxXQUFXO1lBQUE0WixRQUFBLGdCQUNWMVgsS0FBQSxDQUFDaEMsZUFBZTtjQUFBMFosUUFBQSxnQkFDZDVYLElBQUEsQ0FBQzVDLE9BQU87Z0JBQ05zYSxNQUFNLEVBQUVuUyxhQUFjO2dCQUN0QjRTLEtBQUssRUFDSDFQLFdBQVcsYUFBWEEsV0FBVyxnQkFBQXBFLHFCQUFBLEdBQVhvRSxXQUFXLENBQUUvSCxPQUFPLGNBQUEyRCxxQkFBQSxlQUFwQkEscUJBQUEsQ0FBc0JqRCxXQUFXLEdBQzdCNkQsQ0FBQyxDQUFDLCtCQUErQixDQUFDLEdBQ2xDQSxDQUFDLENBQUMsNEJBQTRCLENBQ25DO2dCQUFBMlMsUUFBQSxlQUVENVgsSUFBQSxDQUFDN0IsbUJBQW1CO2tCQUFDd1osT0FBTyxFQUFFTixvQkFBcUI7a0JBQUFPLFFBQUEsZUFDakQ1WCxJQUFBLENBQUMvQyxJQUFJO29CQUNIbWIsS0FBSyxFQUFFLEVBQUc7b0JBQ1ZDLE1BQU0sRUFBRSxFQUFHO29CQUNYTixLQUFLLEVBQUV0UCxXQUFXLGFBQVhBLFdBQVcsZ0JBQUFuRSxxQkFBQSxHQUFYbUUsV0FBVyxDQUFFL0gsT0FBTyxjQUFBNEQscUJBQUEsZUFBcEJBLHFCQUFBLENBQXNCbEQsV0FBVyxHQUFHLFNBQVMsR0FBRyxTQUFVO29CQUNqRWtYLElBQUksRUFBRTdQLFdBQVcsYUFBWEEsV0FBVyxnQkFBQWxFLHFCQUFBLEdBQVhrRSxXQUFXLENBQUUvSCxPQUFPLGNBQUE2RCxxQkFBQSxlQUFwQkEscUJBQUEsQ0FBc0JuRCxXQUFXLEdBQUcsU0FBUyxHQUFHLE1BQU87b0JBQzdEbVgsT0FBTyxFQUFDLE9BQU87b0JBQ2ZDLFNBQVMsRUFBRS9QLFdBQVcsYUFBWEEsV0FBVyxnQkFBQWpFLHFCQUFBLEdBQVhpRSxXQUFXLENBQUUvSCxPQUFPLGNBQUE4RCxxQkFBQSxlQUFwQkEscUJBQUEsQ0FBc0JwRCxXQUFXLEdBQUcsRUFBRSxHQUFHO2tCQUFxQixDQUMxRTtnQkFBQyxDQUNpQjtjQUFDLENBQ2YsQ0FBQyxlQUNWcEIsSUFBQSxDQUFDL0IsZ0JBQWdCO2dCQUFBMlosUUFBQSxFQUFFblAsV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBRWpJLFNBQVMsR0FBR3lFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBR0EsQ0FBQyxDQUFDLFVBQVU7Y0FBQyxDQUFtQixDQUFDO1lBQUEsQ0FDL0UsQ0FBQyxlQUNsQmpGLElBQUEsQ0FBQzVCLHNCQUFzQjtjQUNyQnVaLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBLEVBQVE7Z0JBQ2I1UyxjQUFjLENBQUN6RixNQUFNLENBQUNtWixXQUFXLENBQUM7Z0JBQ2xDN0ksV0FBVyxDQUFDLENBQUM7Y0FDZixDQUFFO2NBQ0Y4SSxRQUFRLEVBQUVyUSxTQUFTLElBQUlnRCxrQkFBa0IsSUFBSVYsZUFBZSxJQUFJa0IscUJBQXNCO2NBQUErTCxRQUFBLGVBRXRGNVgsSUFBQSxDQUFDOUMsS0FBSztnQkFBQzZhLEtBQUssRUFBQyxTQUFTO2dCQUFDSyxLQUFLLEVBQUUsRUFBRztnQkFBQ0MsTUFBTSxFQUFFO2NBQUcsQ0FBRTtZQUFDLENBQzFCLENBQUM7VUFBQSxDQUNkLENBQUMsZUFDZG5ZLEtBQUEsQ0FBQ3BDLFlBQVk7WUFBQzZhLFNBQVMsRUFBRTFRLE9BQU8sS0FBSyxXQUFZO1lBQUEyUCxRQUFBLGdCQUMvQzFYLEtBQUEsQ0FBQzdCLFlBQVk7Y0FBQXVaLFFBQUEsZ0JBQ1gxWCxLQUFBLENBQUMzQixnQkFBZ0I7Z0JBQ2Z3QyxRQUFRLEVBQUVrSCxPQUFPLEtBQUssU0FBVTtnQkFDaEMyUSxNQUFNLEVBQUUsQ0FBRTtnQkFDVmpCLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO2tCQUFBLE9BQVF2SCxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7Z0JBQUEsQ0FBQztnQkFDOUNuUCxFQUFFLEVBQUMseUJBQXlCO2dCQUFBMlcsUUFBQSxnQkFFNUI1WCxJQUFBLENBQUNsRCxRQUFRO2tCQUNQaWIsS0FBSyxLQUFBekcsTUFBQSxDQUFLckosT0FBTyxLQUFLLFNBQVMsR0FBRyxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBRztrQkFDckZtUSxLQUFLLEVBQUUsRUFBRztrQkFDVkMsTUFBTSxFQUFFO2dCQUFHLENBQ1osQ0FBQyxlQUNGclksSUFBQSxDQUFDeEIscUJBQXFCO2tCQUFDdUMsUUFBUSxFQUFFa0gsT0FBTyxLQUFLLFNBQVU7a0JBQUEyUCxRQUFBLEVBQ3BEM1MsQ0FBQyxDQUFDLHNCQUFzQjtnQkFBQyxDQUNMLENBQUM7Y0FBQSxDQUNSLENBQUMsZUFFbkIvRSxLQUFBLENBQUMzQixnQkFBZ0I7Z0JBQ2Z3QyxRQUFRLEVBQUVrSCxPQUFPLEtBQUssV0FBWTtnQkFDbEMyUSxNQUFNLEVBQUUsQ0FBRTtnQkFDVmpCLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO2tCQUFBLE9BQVF2SCxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7Z0JBQUEsQ0FBQztnQkFDaERuUCxFQUFFLEVBQUMsMkJBQTJCO2dCQUFBMlcsUUFBQSxnQkFFOUI1WCxJQUFBLENBQUN2QyxTQUFTO2tCQUNSc2EsS0FBSyxLQUFBekcsTUFBQSxDQUFLckosT0FBTyxLQUFLLFdBQVcsR0FBRyxxQkFBcUIsR0FBRyx3QkFBd0IsQ0FBRztrQkFDdkZtUSxLQUFLLEVBQUUsRUFBRztrQkFDVkMsTUFBTSxFQUFFO2dCQUFHLENBQ1osQ0FBQyxlQUNGclksSUFBQSxDQUFDeEIscUJBQXFCO2tCQUFDdUMsUUFBUSxFQUFFa0gsT0FBTyxLQUFLLFdBQVk7a0JBQUEyUCxRQUFBLEVBQ3REM1MsQ0FBQyxDQUFDLHdCQUF3QjtnQkFBQyxDQUNQLENBQUM7Y0FBQSxDQUNSLENBQUMsZUFFbkIvRSxLQUFBLENBQUMzQixnQkFBZ0I7Z0JBQ2Z3QyxRQUFRLEVBQUVrSCxPQUFPLEtBQUssZUFBZ0I7Z0JBQ3RDMlEsTUFBTSxFQUFFLENBQUU7Z0JBQ1ZqQixPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQTtrQkFBQSxPQUFRdkgsbUJBQW1CLENBQUMsZUFBZSxDQUFDO2dCQUFBLENBQUM7Z0JBQ3BEblAsRUFBRSxFQUFDLCtCQUErQjtnQkFBQTJXLFFBQUEsZ0JBRWxDNVgsSUFBQSxDQUFDeEMsaUJBQWlCO2tCQUNoQnVhLEtBQUssS0FBQXpHLE1BQUEsQ0FBS3JKLE9BQU8sS0FBSyxlQUFlLEdBQUcscUJBQXFCLEdBQUcsd0JBQXdCLENBQUc7a0JBQzNGbVEsS0FBSyxFQUFFLEVBQUc7a0JBQ1ZDLE1BQU0sRUFBRTtnQkFBRyxDQUNaLENBQUMsZUFDRnJZLElBQUEsQ0FBQ3hCLHFCQUFxQjtrQkFBQ3VDLFFBQVEsRUFBRWtILE9BQU8sS0FBSyxlQUFnQjtrQkFBQTJQLFFBQUEsRUFDMUQzUyxDQUFDLENBQUMsK0JBQStCO2dCQUFDLENBQ2QsQ0FBQyxFQUN2QmtTLDJCQUEyQixpQkFDMUJuWCxJQUFBLENBQUM1QyxPQUFPO2tCQUFDK2EsS0FBSyxFQUFFbFQsQ0FBQyxDQUFDLG1DQUFtQyxDQUFFO2tCQUFDeVMsTUFBTSxFQUFFblMsYUFBYztrQkFBQXFTLFFBQUEsZUFDNUU1WCxJQUFBLENBQUNuQixxQkFBcUI7b0JBQUErWSxRQUFBLGVBQ3BCNVgsSUFBQSxDQUFDakQsS0FBSztzQkFBQ2diLEtBQUssRUFBQyxTQUFTO3NCQUFDSyxLQUFLLEVBQUMsTUFBTTtzQkFBQ0MsTUFBTSxFQUFDO29CQUFNLENBQUU7a0JBQUMsQ0FDL0I7Z0JBQUMsQ0FDakIsQ0FDVjtjQUFBLENBQ2UsQ0FBQztZQUFBLENBQ1AsQ0FBQyxFQUNkM1csWUFBWSxDQUFDdUcsT0FBTyxDQUFDLENBQUM7Y0FDckJpTCxNQUFNLEVBQUV6SyxXQUFXO2NBQ25Ca0ssb0JBQW9CLEVBQUVuQywwQkFBMEI7Y0FDaER2TyxXQUFXLEVBQVhBLFdBQVc7Y0FDWDRHLE9BQU8sRUFBRSxLQUFLO2NBQ2RnUSxpQkFBaUIsRUFBRSxFQUFFO2NBQ3JCQyxZQUFZLEVBQUUsRUFBRTtjQUNoQkMseUJBQXlCLEVBQUUsU0FBM0JBLHlCQUF5QkEsQ0FBQSxFQUFRLENBQUMsQ0FBQztjQUNuQ0Msb0JBQW9CLEVBQUUsU0FBdEJBLG9CQUFvQkEsQ0FBQSxFQUFRLENBQUMsQ0FBQztjQUM5QkMsaUJBQWlCLEVBQUVyUCxnQkFBZ0I7Y0FDbkNyRSxhQUFhLEVBQWJBO1lBQ0YsQ0FBQyxDQUFDO1VBQUEsQ0FDVSxDQUFDLGVBQ2ZyRixLQUFBLENBQUNuQyxXQUFXO1lBQUN5QyxTQUFTLEVBQUUsQ0FBQyxFQUFDaUksV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBRWpJLFNBQVMsS0FBSSxDQUFDLEVBQUNxSixlQUFlLGFBQWZBLGVBQWUsZUFBZkEsZUFBZSxVQUFRLENBQUM7WUFBQStOLFFBQUEsR0FDM0UsQ0FBQyxFQUFDblAsV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBRWpJLFNBQVMsS0FDdkIsQ0FBQyxFQUFDcUosZUFBZSxhQUFmQSxlQUFlLGVBQWZBLGVBQWUsVUFBUSxLQUN6QmlHLE1BQU0sQ0FBQ3NDLHdDQUF3QyxpQkFDN0NwUyxJQUFBLENBQUN2QixpQkFBaUI7Y0FBQW1aLFFBQUEsZUFDaEI1WCxJQUFBLENBQUNuRCxRQUFRO2dCQUNQMGIsT0FBTyxFQUFDLFdBQVc7Z0JBQ25CdFYsSUFBSSxFQUFDLFFBQVE7Z0JBQ2JpVyxnQkFBZ0I7Z0JBQ2hCdkIsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQUEsRUFBUTtrQkFDYjdQLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDMUIsQ0FBRTtnQkFDRjRRLFFBQVEsRUFBRXJRLFNBQVMsSUFBSWdELGtCQUFrQixJQUFJVixlQUFlLElBQUlrQixxQkFBc0I7Z0JBQUErTCxRQUFBLGVBRXRGMVgsS0FBQSxDQUFDYixpQkFBaUI7a0JBQUF1WSxRQUFBLGdCQUNoQjVYLElBQUEsQ0FBQ2hELEtBQUs7b0JBQUMrYSxLQUFLLEVBQUMsTUFBTTtvQkFBQ0ssS0FBSyxFQUFFLEVBQUc7b0JBQUNDLE1BQU0sRUFBRTtrQkFBRyxDQUFFLENBQUMsRUFDNUNwVCxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUFBLENBQ0E7Y0FBQyxDQUNaO1lBQUMsQ0FDTSxDQUNwQixlQUNIakYsSUFBQTtjQUFLMlQsS0FBSyxFQUFFO2dCQUFFd0YsT0FBTyxFQUFFLE1BQU07Z0JBQUVDLEdBQUcsRUFBRTtjQUFPLENBQUU7Y0FBQXhCLFFBQUEsZUFDM0M1WCxJQUFBLENBQUN0QixlQUFlO2dCQUNkMmEsVUFBVSxFQUNSLENBQUN4WCxtQkFBbUIsQ0FBQzRHLFdBQVcsQ0FBQyxJQUNqQytFLHlCQUF5QixDQUFDLENBQUMsSUFDM0JuRixTQUFTLElBQ1RnRCxrQkFBa0IsSUFDbEJWLGVBQWUsSUFDZmtCLHFCQUFxQixJQUNyQnNMLDJCQUEyQixJQUMzQnhOLGFBQ0Q7Z0JBQUFpTyxRQUFBLGVBRUQ1WCxJQUFBLENBQUNuRCxRQUFRO2tCQUNQMGIsT0FBTyxFQUFDLFdBQVc7a0JBQ25CdFYsSUFBSSxFQUFDLFFBQVE7a0JBQ2IwVSxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQSxFQUFRO29CQUNibEcsb0JBQW1CLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztrQkFDckMsQ0FBRTtrQkFDRmlILFFBQVEsRUFDTixDQUFDN1csbUJBQW1CLENBQUM0RyxXQUFXLENBQUMsSUFDakMrRSx5QkFBeUIsQ0FBQyxDQUFDLElBQzNCbkYsU0FBUyxJQUNUZ0Qsa0JBQWtCLElBQ2xCVixlQUFlLElBQ2ZrQixxQkFBcUIsSUFDckJzTCwyQkFBMkIsSUFDM0J4TixhQUNEO2tCQUFBaU8sUUFBQSxFQUVBblAsV0FBVyxDQUFDakksU0FBUyxHQUFHeUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHQSxDQUFDLENBQUMsd0JBQXdCO2dCQUFDLENBQy9EO2NBQUMsQ0FDSTtZQUFDLENBQ2YsQ0FBQztVQUFBLENBQ0ssQ0FBQztRQUFBLENBQ2Q7TUFDSCxDQUNEO0lBQ0gsQ0FDVyxDQUFDLEVBQ2Q0QyxlQUFlLGlCQUNkN0gsSUFBQSxDQUFDUixtQkFBbUI7TUFDbEI4WixPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQTtRQUFBLE9BQVF4UixrQkFBa0IsQ0FBQyxLQUFLLENBQUM7TUFBQSxDQUFDO01BQ3pDeVIsUUFBUSxFQUFFO1FBQ1I5SCxtQkFBbUIsRUFBRSxTQUFyQkEsbUJBQW1CQSxDQUFHOVAsS0FBVTtVQUFBLE9BQUs4UCxvQkFBbUIsQ0FBQzlQLEtBQUssRUFBRSxRQUFRLENBQUM7UUFBQTtNQUMzRSxDQUFFO01BQ0ZvUSxJQUFJLEVBQUU7UUFBRW9HLEtBQUssRUFBRTFQLFdBQVcsQ0FBQy9ILE9BQU8sQ0FBQ0MsSUFBSTtRQUFFTSxFQUFFLEVBQUV3SCxXQUFXLENBQUMvSCxPQUFPLENBQUNPO01BQUcsQ0FBRTtNQUN0RStRLE1BQU0sRUFBQztJQUFPLENBQ2YsQ0FDRjtFQUFBLENBQ08sQ0FBQyxFQUNYdE0sUUFDRixDQUFDO0FBQ0gsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|