@projectcor/maia-components 2.11.110-1 → 2.26.1
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/README.md +2 -0
- package/package.json +3 -3
- package/CHANGELOG.md +0 -642
- package/lib/App.js +0 -55
- package/lib/components/atoms/ActionableButton.js +0 -60
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +0 -89
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +0 -21
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +0 -9
- package/lib/components/atoms/AgentActivityIndicator/index.js +0 -2
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +0 -209
- package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +0 -93
- package/lib/components/atoms/ApprovalBox/index.js +0 -2
- package/lib/components/atoms/AttachmentCard/AttachmentCard.js +0 -218
- package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +0 -52
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +0 -448
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +0 -58
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +0 -55
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +0 -14
- package/lib/components/atoms/AttachmentCard/index.js +0 -4
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +0 -442
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +0 -119
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +0 -222
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +0 -313
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +0 -128
- package/lib/components/atoms/AttachmentPreviewModal/index.js +0 -2
- package/lib/components/atoms/Backdrop/Backdrop.js +0 -17
- package/lib/components/atoms/Backdrop/Backdrop.styles.js +0 -9
- package/lib/components/atoms/Backdrop/index.js +0 -2
- package/lib/components/atoms/CardItem.js +0 -7
- package/lib/components/atoms/CardMenu/CardMenu.js +0 -131
- package/lib/components/atoms/CardMenu/index.js +0 -2
- package/lib/components/atoms/CardMenu/styles.js +0 -21
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +0 -77
- package/lib/components/atoms/ChatClientSelector/index.js +0 -2
- package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +0 -9
- package/lib/components/atoms/ChatDisclaimerMessage/index.js +0 -2
- package/lib/components/atoms/ChatDisclaimerMessage/styles.js +0 -6
- package/lib/components/atoms/Checkbox/Checkbox.js +0 -34
- package/lib/components/atoms/Checkbox/index.js +0 -2
- package/lib/components/atoms/Checkbox/styles.js +0 -39
- package/lib/components/atoms/Chip/Chip.js +0 -150
- package/lib/components/atoms/Chip/index.js +0 -2
- package/lib/components/atoms/Chip/styles.js +0 -43
- package/lib/components/atoms/ChipLlm/ChipLlm.js +0 -45
- package/lib/components/atoms/ChipLlm/ChipLlm.style.js +0 -21
- package/lib/components/atoms/ChipLlm/index.js +0 -2
- package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +0 -2
- package/lib/components/atoms/ChipStatus/ChipStatus.js +0 -14
- package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +0 -27
- package/lib/components/atoms/ChipStatus/index.js +0 -2
- package/lib/components/atoms/ClearButton.js +0 -6
- package/lib/components/atoms/ClientSelector/ClientSelector.js +0 -146
- package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +0 -15
- package/lib/components/atoms/ClientSelector/index.js +0 -2
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +0 -38
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +0 -188
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +0 -39
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +0 -445
- package/lib/components/atoms/ContextMentionChip/index.js +0 -4
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +0 -533
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +0 -10
- package/lib/components/atoms/ContextMentionEditor/index.js +0 -2
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +0 -282
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +0 -148
- package/lib/components/atoms/ContextMentionItem/index.js +0 -2
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +0 -290
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +0 -108
- package/lib/components/atoms/ContextMentionPopover/index.js +0 -3
- package/lib/components/atoms/CopyToClipboard.js +0 -70
- package/lib/components/atoms/EditableLabel/EditableLabel.js +0 -110
- package/lib/components/atoms/EditableLabel/index.js +0 -2
- package/lib/components/atoms/EditableLabel/styles.js +0 -7
- package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +0 -22
- package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +0 -18
- package/lib/components/atoms/EmptySearchClients/index.js +0 -2
- package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +0 -19
- package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +0 -15
- package/lib/components/atoms/EmptySearchProjects/index.js +0 -2
- package/lib/components/atoms/EntitySelector/EntitySelector.js +0 -247
- package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +0 -38
- package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +0 -67
- package/lib/components/atoms/EntitySelector/index.js +0 -2
- package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +0 -14
- package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +0 -15
- package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +0 -14
- package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +0 -15
- package/lib/components/atoms/ErrorSearchFaqs/index.js +0 -2
- package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +0 -18
- package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +0 -15
- package/lib/components/atoms/ErrorSearchProjects/index.js +0 -2
- package/lib/components/atoms/Expand/Expand.js +0 -32
- package/lib/components/atoms/Expand/index.js +0 -2
- package/lib/components/atoms/Fade/Fade.js +0 -56
- package/lib/components/atoms/Fade/index.js +0 -2
- package/lib/components/atoms/FeedbackButton/FeedbackButton.js +0 -59
- package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +0 -14
- package/lib/components/atoms/FeedbackButton/index.js +0 -2
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +0 -138
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +0 -44
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +0 -43
- package/lib/components/atoms/FrequentlyAskedQuestions/index.js +0 -2
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +0 -122
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +0 -43
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +0 -62
- package/lib/components/atoms/FrequentlyUsedActions/index.js +0 -2
- package/lib/components/atoms/GoBackButton.js +0 -24
- package/lib/components/atoms/HelpButton.js +0 -44
- package/lib/components/atoms/IconButton.js +0 -56
- package/lib/components/atoms/ImagePreview/ImagePreview.js +0 -96
- package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +0 -70
- package/lib/components/atoms/Input/CustomInput.interface.js +0 -2
- package/lib/components/atoms/Input/CustomInput.js +0 -91
- package/lib/components/atoms/Input/CustomInput.styles.js +0 -39
- package/lib/components/atoms/Input/index.js +0 -2
- package/lib/components/atoms/ListMenuOption/ListMenuOption.js +0 -41
- package/lib/components/atoms/ListMenuOption/index.js +0 -2
- package/lib/components/atoms/ListMenuOption/styles.js +0 -9
- package/lib/components/atoms/Loader.js +0 -41
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +0 -11
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +0 -6
- package/lib/components/atoms/LoadingFaqs/index.js +0 -2
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +0 -11
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +0 -6
- package/lib/components/atoms/LoadingSearchClients/index.js +0 -2
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +0 -14
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +0 -10
- package/lib/components/atoms/LoadingSearchProjects/index.js +0 -2
- package/lib/components/atoms/LoadingText/LoadingText.js +0 -18
- package/lib/components/atoms/LoadingText/index.js +0 -2
- package/lib/components/atoms/LoadingText/styles.js +0 -7
- package/lib/components/atoms/MAIAButton/MAIAButton.js +0 -33
- package/lib/components/atoms/MAIAButton/index.js +0 -2
- package/lib/components/atoms/MAIAError/MAIAError.js +0 -15
- package/lib/components/atoms/MAIAError/index.js +0 -2
- package/lib/components/atoms/MAIAInput/MAIAInput.js +0 -1233
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +0 -266
- package/lib/components/atoms/MAIAInput/index.js +0 -2
- package/lib/components/atoms/MAIAInput/maiaInputLayout.js +0 -25
- package/lib/components/atoms/MAIAInput/styles.js +0 -186
- package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +0 -2
- package/lib/components/atoms/MAIAMessage/MAIAMessage.js +0 -22
- package/lib/components/atoms/MAIAMessage/index.js +0 -2
- package/lib/components/atoms/MAIAMessage/styles.js +0 -7
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +0 -23
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +0 -2
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +0 -51
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +0 -26
- package/lib/components/atoms/MaiaStreamdown/index.js +0 -2
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +0 -18
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +0 -84
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +0 -15
- package/lib/components/atoms/MaiaWrapper/index.js +0 -3
- package/lib/components/atoms/MaiaWrapper/styles.js +0 -21
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +0 -2
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +0 -84
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +0 -53
- package/lib/components/atoms/ModalClientAccess/index.js +0 -2
- package/lib/components/atoms/ModalInfo/ModalInfo.js +0 -52
- package/lib/components/atoms/ModalInfo/ModalInfoContent.js +0 -7
- package/lib/components/atoms/ModalInfo/index.js +0 -3
- package/lib/components/atoms/ModalInfo/styles.js +0 -7
- package/lib/components/atoms/ModalProject/ModalProject.interface.js +0 -2
- package/lib/components/atoms/ModalProject/ModalProject.js +0 -112
- package/lib/components/atoms/ModalProject/ModalProject.style.js +0 -59
- package/lib/components/atoms/ModalProject/index.js +0 -2
- package/lib/components/atoms/NextPageLoader.js +0 -33
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +0 -28
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +0 -180
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +0 -34
- package/lib/components/atoms/OnboardingModalButton/index.js +0 -3
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +0 -131
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +0 -59
- package/lib/components/atoms/OptionAccessibility/index.js +0 -2
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +0 -27
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +0 -18
- package/lib/components/atoms/OptionCorPermission/index.js +0 -2
- package/lib/components/atoms/PrimaryButton.js +0 -31
- package/lib/components/atoms/ProjectSelector/ProjectSelector.js +0 -77
- package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +0 -61
- package/lib/components/atoms/ProjectSelector/index.js +0 -2
- package/lib/components/atoms/SecondaryButton.js +0 -20
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +0 -20
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +0 -20
- package/lib/components/atoms/SessionGeneratingDot/index.js +0 -2
- package/lib/components/atoms/Skeleton/Skeleton.js +0 -36
- package/lib/components/atoms/Skeleton/index.js +0 -2
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +0 -208
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +0 -77
- package/lib/components/atoms/SkillsDropdown/index.js +0 -2
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +0 -16
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +0 -24
- package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +0 -18
- package/lib/components/atoms/SlashCommandChip/index.js +0 -4
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +0 -210
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +0 -53
- package/lib/components/atoms/SlashCommandDropdown/index.js +0 -2
- package/lib/components/atoms/Switch/Switch.js +0 -27
- package/lib/components/atoms/Switch/Switch.styles.js +0 -22
- package/lib/components/atoms/Switch/index.js +0 -2
- package/lib/components/atoms/TextArea/CustomTextArea.interface.js +0 -2
- package/lib/components/atoms/TextArea/CustomTextArea.js +0 -93
- package/lib/components/atoms/TextArea/CustomTextArea.styles.js +0 -25
- package/lib/components/atoms/TextArea/TextArea.interfaces.js +0 -2
- package/lib/components/atoms/TextArea/TextArea.js +0 -172
- package/lib/components/atoms/TextArea/TextArea.styles.js +0 -16
- package/lib/components/atoms/TextArea/index.js +0 -2
- package/lib/components/atoms/ThirdButton.js +0 -19
- package/lib/components/atoms/VideoModal/VideoModal.js +0 -76
- package/lib/components/atoms/VideoModal/index.js +0 -2
- package/lib/components/atoms/WithAppCfg.js +0 -26
- package/lib/components/atoms/WithFeatureValidation.js +0 -23
- package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +0 -9
- package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +0 -6
- package/lib/components/atoms/WrapperCenterIcon/index.js +0 -2
- package/lib/components/atoms/icons/AIIcon.js +0 -23
- package/lib/components/atoms/icons/AacFile.js +0 -39
- package/lib/components/atoms/icons/AccessibilityIcon.js +0 -42
- package/lib/components/atoms/icons/ActionAssignIcon.js +0 -111
- package/lib/components/atoms/icons/ActionCalendarIcon.js +0 -112
- package/lib/components/atoms/icons/ActionChargeHoursIcon.js +0 -111
- package/lib/components/atoms/icons/ActionChatIcon.js +0 -71
- package/lib/components/atoms/icons/ActionCreateIcon.js +0 -91
- package/lib/components/atoms/icons/ActionCreateReworkIcon.js +0 -39
- package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +0 -37
- package/lib/components/atoms/icons/ActionEditIcon.js +0 -39
- package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +0 -88
- package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +0 -37
- package/lib/components/atoms/icons/ActionTimeBackIcon.js +0 -112
- package/lib/components/atoms/icons/AgentMaiaIcon.js +0 -31
- package/lib/components/atoms/icons/Brain.js +0 -77
- package/lib/components/atoms/icons/CorAccessIcon.js +0 -41
- package/lib/components/atoms/icons/CorLogo.js +0 -76
- package/lib/components/atoms/icons/CsvFile.js +0 -41
- package/lib/components/atoms/icons/DocFile.js +0 -41
- package/lib/components/atoms/icons/DocxFile.js +0 -41
- package/lib/components/atoms/icons/EmptyClientIllustration.js +0 -67
- package/lib/components/atoms/icons/EmptyHistory.js +0 -46
- package/lib/components/atoms/icons/EmptySearchIllustration.js +0 -37
- package/lib/components/atoms/icons/EmptyState.js +0 -84
- package/lib/components/atoms/icons/EmptyStateAgents.js +0 -58
- package/lib/components/atoms/icons/ErrorIcon.js +0 -14
- package/lib/components/atoms/icons/ErrorSearchIllustration.js +0 -52
- package/lib/components/atoms/icons/ErrorState.js +0 -51
- package/lib/components/atoms/icons/FaqChevronIcon.js +0 -39
- package/lib/components/atoms/icons/FaqsIcon.js +0 -51
- package/lib/components/atoms/icons/FlacIcon.js +0 -39
- package/lib/components/atoms/icons/FolderIcon.js +0 -29
- package/lib/components/atoms/icons/HomeIcon.js +0 -30
- package/lib/components/atoms/icons/ImageFile.js +0 -46
- package/lib/components/atoms/icons/M4aFile.js +0 -39
- package/lib/components/atoms/icons/MAIAIcon.js +0 -20
- package/lib/components/atoms/icons/MAIAIsologo.js +0 -65
- package/lib/components/atoms/icons/MDFile.js +0 -41
- package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +0 -41
- package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +0 -41
- package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +0 -33
- package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +0 -41
- package/lib/components/atoms/icons/MaiaInputAddIcon.js +0 -42
- package/lib/components/atoms/icons/MaiaInputAttachIcon.js +0 -29
- package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +0 -33
- package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +0 -35
- package/lib/components/atoms/icons/MaiaInputMentionIcon.js +0 -44
- package/lib/components/atoms/icons/MaiaInputRobotIcon.js +0 -29
- package/lib/components/atoms/icons/MaiaInputSendIcon.js +0 -29
- package/lib/components/atoms/icons/MaiaInputSlashIcon.js +0 -29
- package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +0 -35
- package/lib/components/atoms/icons/MaiaSettingsProject.js +0 -111
- package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +0 -193
- package/lib/components/atoms/icons/MaiaSparkleIcon.js +0 -75
- package/lib/components/atoms/icons/MaiaStoreIcon.js +0 -31
- package/lib/components/atoms/icons/Mp3File.js +0 -39
- package/lib/components/atoms/icons/Mp4File.js +0 -39
- package/lib/components/atoms/icons/MyAgentsNavIcon.js +0 -51
- package/lib/components/atoms/icons/NewChat.js +0 -29
- package/lib/components/atoms/icons/NotionIcon.js +0 -36
- package/lib/components/atoms/icons/OgaFile.js +0 -39
- package/lib/components/atoms/icons/OggFile.js +0 -39
- package/lib/components/atoms/icons/PdfFile.js +0 -39
- package/lib/components/atoms/icons/PlusIcon.js +0 -29
- package/lib/components/atoms/icons/PptFile.js +0 -47
- package/lib/components/atoms/icons/PptxFile.js +0 -49
- package/lib/components/atoms/icons/RetryIcon.js +0 -34
- package/lib/components/atoms/icons/SkillCreatedByIcon.js +0 -20
- package/lib/components/atoms/icons/SkillIcon.js +0 -30
- package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +0 -23
- package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +0 -23
- package/lib/components/atoms/icons/SkillsNavIcon.js +0 -24
- package/lib/components/atoms/icons/SubtaskIcon.js +0 -36
- package/lib/components/atoms/icons/TaskLinkIcon.js +0 -27
- package/lib/components/atoms/icons/TelescopeIcon.js +0 -60
- package/lib/components/atoms/icons/TemplateGradientIcon.js +0 -42
- package/lib/components/atoms/icons/TextFile.js +0 -41
- package/lib/components/atoms/icons/WavFile.js +0 -39
- package/lib/components/atoms/icons/WebmFile.js +0 -50
- package/lib/components/atoms/icons/XlsFile.js +0 -42
- package/lib/components/atoms/icons/XlsxFile.js +0 -42
- package/lib/components/atoms/icons/index.js +0 -54
- package/lib/components/atoms/index.js +0 -42
- package/lib/components/index.js +0 -11
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +0 -2
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +0 -149
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +0 -53
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +0 -415
- package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +0 -152
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +0 -374
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +0 -106
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +0 -92
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +0 -57
- package/lib/components/molecules/AbmSection/index.js +0 -4
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +0 -52
- package/lib/components/molecules/ChatAIClientSelector/index.js +0 -2
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +0 -119
- package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +0 -187
- package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +0 -6
- package/lib/components/molecules/ChatAIContent/index.js +0 -2
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +0 -241
- package/lib/components/molecules/ChatAIHistory/index.js +0 -2
- package/lib/components/molecules/ChatAIHistory/styles.js +0 -22
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +0 -649
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +0 -115
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +0 -95
- package/lib/components/molecules/ChatAIHome/index.js +0 -2
- package/lib/components/molecules/ChatAIHome/styles.js +0 -335
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +0 -137
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +0 -853
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +0 -47
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +0 -37
- package/lib/components/molecules/ChatAIMessages/README.md +0 -101
- package/lib/components/molecules/ChatAIMessages/index.js +0 -2
- package/lib/components/molecules/ChatAIMessages/newStyles.js +0 -131
- package/lib/components/molecules/ChatAIMessages/styles.js +0 -94
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +0 -1254
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +0 -58
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +0 -127
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +0 -34
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +0 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +0 -189
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +0 -26
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +0 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +0 -453
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +0 -108
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +0 -2
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +0 -48
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +0 -38
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +0 -2
- package/lib/components/molecules/ChatAIModal/constants.js +0 -40
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +0 -16
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +0 -12
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +0 -13
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +0 -3
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +0 -57
- package/lib/components/molecules/ChatAIModal/index.js +0 -2
- package/lib/components/molecules/ChatAIModal/layout.js +0 -74
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +0 -457
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +0 -218
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +0 -430
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +0 -169
- package/lib/components/molecules/ChatAIMySkills/index.js +0 -2
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +0 -48
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +0 -49
- package/lib/components/molecules/ChatAIProjectSelector/index.js +0 -2
- package/lib/components/molecules/ChatFooter/ChatFooter.js +0 -337
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +0 -32
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +0 -14
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +0 -201
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +0 -51
- package/lib/components/molecules/ChatFooter/index.js +0 -2
- package/lib/components/molecules/ChatFooter/styles.js +0 -23
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +0 -60
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +0 -6
- package/lib/components/molecules/ContextMentionInput/index.js +0 -2
- package/lib/components/molecules/MessageFeedback/MessageFeedback.js +0 -118
- package/lib/components/molecules/MessageFeedback/index.js +0 -2
- package/lib/components/molecules/MessageFeedback/styles.js +0 -14
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +0 -127
- package/lib/components/molecules/ProjectSummaryChat/index.js +0 -2
- package/lib/components/molecules/ProjectSummaryChat/styles.js +0 -8
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +0 -152
- package/lib/components/molecules/ProjectSummaryConfig/index.js +0 -2
- package/lib/components/molecules/ProjectSummaryConfig/styles.js +0 -86
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +0 -49
- package/lib/components/molecules/ProjectSummaryContent/index.js +0 -2
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +0 -19
- package/lib/components/molecules/ProjectSummaryModal/index.js +0 -2
- package/lib/components/molecules/ProjectSummaryModal/styles.js +0 -2
- package/lib/components/molecules/Sidebar/Sidebar.js +0 -716
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +0 -157
- package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +0 -48
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +0 -75
- package/lib/components/molecules/Sidebar/index.js +0 -2
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +0 -1420
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +0 -93
- package/lib/components/organisms/AbmAgentModal/index.js +0 -2
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +0 -182
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +0 -34
- package/lib/components/organisms/AbmSkillGenerateModal/index.js +0 -2
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +0 -585
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +0 -154
- package/lib/components/organisms/AbmSkillModal/index.js +0 -2
- package/lib/components/organisms/ChatAI/ChatAI.js +0 -167
- package/lib/components/organisms/ChatAI/index.js +0 -2
- package/lib/components/organisms/ChatAI/styles.js +0 -7
- package/lib/components/organisms/ClientAIButton/ClientAIButton.js +0 -23
- package/lib/components/organisms/ClientAIButton/index.js +0 -2
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +0 -86
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +0 -39
- package/lib/components/organisms/DeleteAgentModal/index.js +0 -2
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +0 -122
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +0 -47
- package/lib/components/organisms/DeleteQuestionModal/index.js +0 -2
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +0 -138
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +0 -69
- package/lib/components/organisms/EditQuestionModal/index.js +0 -2
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +0 -113
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +0 -54
- package/lib/components/organisms/ModalFileExceeds/index.js +0 -2
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +0 -26
- package/lib/components/organisms/ProjectAIButton/index.js +0 -2
- package/lib/components/organisms/ProjectSummary/ProjectSummary.js +0 -60
- package/lib/components/organisms/ProjectSummary/index.js +0 -2
- package/lib/components/organisms/ProjectSummary/styles.js +0 -7
- package/lib/components/organisms/SnackBar/Snackbar.interface.js +0 -2
- package/lib/components/organisms/SnackBar/Snackbar.js +0 -73
- package/lib/components/organisms/SnackBar/Snackbar.styles.js +0 -9
- package/lib/components/organisms/SnackBar/index.js +0 -2
- package/lib/components/organisms/SourcesInformation/SourceItem.js +0 -18
- package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +0 -14
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +0 -66
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +0 -27
- package/lib/components/organisms/SourcesInformation/index.js +0 -2
- package/lib/constants/config.js +0 -10
- package/lib/constants/formatExtensions.js +0 -55
- package/lib/constants/gqlClient.js +0 -4
- package/lib/constants/maiaHourAgentAccess.js +0 -15
- package/lib/constants/maiaTaskPanelAccess.js +0 -24
- package/lib/constants/maiaTaskPanelOutsideClick.js +0 -9
- package/lib/constants/maiaTaskPanelZIndex.js +0 -19
- package/lib/constants/permissions/config.js +0 -72
- package/lib/constants/permissions/index.js +0 -3
- package/lib/constants/permissions/types.js +0 -2
- package/lib/constants/permissions/utils.js +0 -18
- package/lib/constants/plannerSyncEvents.js +0 -15
- package/lib/constants/taskLinkIcon.js +0 -15
- package/lib/constants/taskUrls.js +0 -11
- package/lib/context/cor-user.js +0 -31
- package/lib/context/global-context.js +0 -39
- package/lib/dev/DevChatAI.js +0 -101
- package/lib/dev/DevContextMentionInput.js +0 -67
- package/lib/dev/ProjectSummary.js +0 -9
- package/lib/dev/Providers.js +0 -27
- package/lib/exports.js +0 -2
- package/lib/hooks/README.md +0 -192
- package/lib/hooks/index.js +0 -30
- package/lib/hooks/useAccessClient/index.js +0 -2
- package/lib/hooks/useAccessClient/useAccessClient.js +0 -81
- package/lib/hooks/useAgentModel/index.js +0 -2
- package/lib/hooks/useAgentModel/useAgentModel.js +0 -62
- package/lib/hooks/useAgentModel/useCreateAgent.js +0 -128
- package/lib/hooks/useAgentModel/useDeleteAgent.js +0 -88
- package/lib/hooks/useAgentModel/useUpdateAgent.js +0 -129
- package/lib/hooks/useAgentSuggestions.js +0 -60
- package/lib/hooks/useCaretPosition.js +0 -65
- package/lib/hooks/useChatManager/index.js +0 -2
- package/lib/hooks/useChatManager/useChatManager.interface.js +0 -2
- package/lib/hooks/useChatManager/useChatManager.js +0 -1782
- package/lib/hooks/useChatMessages/index.js +0 -2
- package/lib/hooks/useChatMessages/useChatMessages.interface.js +0 -2
- package/lib/hooks/useChatMessages/useChatMessages.js +0 -722
- package/lib/hooks/useChats/index.js +0 -2
- package/lib/hooks/useChats/useChats.interfaces.js +0 -2
- package/lib/hooks/useChats/useChats.js +0 -187
- package/lib/hooks/useClientSearch.js +0 -163
- package/lib/hooks/useContextMentions.js +0 -500
- package/lib/hooks/useContextPinPopover.js +0 -228
- package/lib/hooks/useDebounce.js +0 -18
- package/lib/hooks/useEntitySearch.js +0 -1053
- package/lib/hooks/useEvent.js +0 -93
- package/lib/hooks/useFrequentlyAskedQuestions.js +0 -150
- package/lib/hooks/useFrequentlyUsedActions.js +0 -94
- package/lib/hooks/useKnowledge/deleteKnowledge.js +0 -69
- package/lib/hooks/useKnowledge/downloadKnowledge.js +0 -81
- package/lib/hooks/useKnowledge/index.js +0 -4
- package/lib/hooks/useKnowledge/saveKnowledge.js +0 -107
- package/lib/hooks/useKnowledge/useKnowledgeOperations.js +0 -156
- package/lib/hooks/useMaiaTaskPanelZIndex.js +0 -17
- package/lib/hooks/useMentionAllowedTypes.js +0 -120
- package/lib/hooks/useMentionPopover.js +0 -342
- package/lib/hooks/useMinimizedPillBottomOffset.js +0 -110
- package/lib/hooks/useModal/index.js +0 -2
- package/lib/hooks/useModal/useModal.interfaces.js +0 -2
- package/lib/hooks/useModal/useModal.js +0 -47
- package/lib/hooks/useOnboardingNavigation.js +0 -20
- package/lib/hooks/useOrchestratorStream/index.js +0 -2
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +0 -2
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +0 -269
- package/lib/hooks/useProjectSearch.js +0 -183
- package/lib/hooks/useProjectSummary.js +0 -101
- package/lib/hooks/useProjectSummaryConfig.js +0 -211
- package/lib/hooks/useProjects.js +0 -46
- package/lib/hooks/useRecentClientsSearch.js +0 -150
- package/lib/hooks/useRecentContexts.js +0 -86
- package/lib/hooks/useResize.js +0 -29
- package/lib/hooks/useSkillsCatalog.js +0 -66
- package/lib/hooks/useSlashCommands.js +0 -84
- package/lib/hooks/useSmoothStreamText/index.js +0 -2
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +0 -197
- package/lib/hooks/useSnackBarManager/useSnackBarManager.js +0 -41
- package/lib/hooks/useStreamResponse.js +0 -112
- package/lib/hooks/useStreamdownStyles.js +0 -13
- package/lib/hooks/useStreamingMessage/index.js +0 -2
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +0 -18
- package/lib/hooks/useT.js +0 -17
- package/lib/hooks/useTabTaskDefault.js +0 -33
- package/lib/hooks/useTaskPanel.js +0 -22
- package/lib/hooks/useTextOverflowEllipsisTooltip.js +0 -34
- package/lib/hooks/useToggle.js +0 -19
- package/lib/hooks/useToggleFavorite/index.js +0 -2
- package/lib/hooks/useToggleFavorite/useToggleFavorite.js +0 -83
- package/lib/index.css +0 -76
- package/lib/index.js +0 -30
- package/lib/lang/br/index.js +0 -785
- package/lib/lang/en/index.js +0 -785
- package/lib/lang/es/index.js +0 -786
- package/lib/lang/fr/index.js +0 -606
- package/lib/lang/index.js +0 -24
- package/lib/lang/utils.js +0 -33
- package/lib/mocks/mockChats.js +0 -395
- package/lib/mocks/mockOrchestrator.js +0 -5
- package/lib/mocks/mockProject.js +0 -11
- package/lib/mocks/mockProjectSummary.js +0 -6
- package/lib/mocks/mockedUser.js +0 -169
- package/lib/services/apolloClient.js +0 -3
- package/lib/services/appcues.js +0 -19
- package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +0 -31
- package/lib/services/corpilot/ProjectSummary/index.js +0 -5
- package/lib/services/corpilot/client.js +0 -27
- package/lib/services/corpilot/index.js +0 -5
- package/lib/services/maia/Access/updateAccess.js +0 -59
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +0 -46
- package/lib/services/maia/Actions/getSlashCommands.js +0 -39
- package/lib/services/maia/Actions/index.js +0 -7
- package/lib/services/maia/Agents/createAgent.js +0 -39
- package/lib/services/maia/Agents/deleteAgent.js +0 -38
- package/lib/services/maia/Agents/fetchAgentDetail.js +0 -122
- package/lib/services/maia/Agents/getAgentById.js +0 -162
- package/lib/services/maia/Agents/getAgentModels.js +0 -112
- package/lib/services/maia/Agents/getAgentSuggestions.js +0 -44
- package/lib/services/maia/Agents/getAgents.js +0 -718
- package/lib/services/maia/Agents/setAgentToolGroups.js +0 -42
- package/lib/services/maia/Agents/toggleFavorite.js +0 -34
- package/lib/services/maia/Agents/updateAgent.js +0 -39
- package/lib/services/maia/Chats/deleteChat.js +0 -32
- package/lib/services/maia/Chats/getChatMessages.js +0 -144
- package/lib/services/maia/Chats/getChatsByUserId.js +0 -82
- package/lib/services/maia/Chats/index.js +0 -15
- package/lib/services/maia/Chats/markSessionAsRead.js +0 -32
- package/lib/services/maia/Chats/patchChat.js +0 -43
- package/lib/services/maia/Chats/wasHelpfulChat.js +0 -31
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +0 -55
- package/lib/services/maia/Faqs/index.js +0 -5
- package/lib/services/maia/Knowledge/delete.js +0 -41
- package/lib/services/maia/Knowledge/download.js +0 -48
- package/lib/services/maia/Knowledge/index.js +0 -3
- package/lib/services/maia/Knowledge/save.js +0 -43
- package/lib/services/maia/Orchestrator/index.js +0 -7
- package/lib/services/maia/Orchestrator/orchestrator.js +0 -246
- package/lib/services/maia/RecentClients/getRecentClients.js +0 -43
- package/lib/services/maia/RecentClients/index.js +0 -6
- package/lib/services/maia/RecentContexts/getRecentContexts.js +0 -54
- package/lib/services/maia/RecentContexts/index.js +0 -6
- package/lib/services/maia/RecentProjects/getRecentProjects.js +0 -55
- package/lib/services/maia/RecentProjects/index.js +0 -6
- package/lib/services/maia/RecentTasks/getRecentTasks.js +0 -54
- package/lib/services/maia/RecentTasks/index.js +0 -6
- package/lib/services/maia/RecentUsers/getRecentUsers.js +0 -59
- package/lib/services/maia/RecentUsers/index.js +0 -6
- package/lib/services/maia/Skills/createSkill.js +0 -39
- package/lib/services/maia/Skills/deleteSkill.js +0 -38
- package/lib/services/maia/Skills/generateSkill.js +0 -41
- package/lib/services/maia/Skills/getSkills.js +0 -120
- package/lib/services/maia/Skills/updateSkill.js +0 -39
- package/lib/services/maia/client.js +0 -27
- package/lib/services/maia/index.js +0 -17
- package/lib/services/query/ClientSearchQuery.js +0 -5
- package/lib/services/query/entitySearchQuery.js +0 -18
- package/lib/services/query/index.js +0 -2
- package/lib/services/query/projectSearchByValueQuery.js +0 -5
- package/lib/services/query/taskUserTabQuery.js +0 -8
- package/lib/services/query/usersDirectoryQuery.js +0 -19
- package/lib/services/types.js +0 -6
- package/lib/services/utils/fetchCOR.js +0 -117
- package/lib/services/utils/getCookie.js +0 -10
- package/lib/services/utils/index.js +0 -3
- package/lib/services/utils/mapChatMessages.js +0 -287
- package/lib/services/utils/validateIsMaia.js +0 -4
- package/lib/store/chatsSidebarOptimistic.js +0 -92
- package/lib/store/chatsStore.types.js +0 -2
- package/lib/store/chatsStoreLifecycle.js +0 -8
- package/lib/store/faqsStore.types.js +0 -2
- package/lib/store/index.js +0 -4
- package/lib/store/maiaLastChatPersistence.js +0 -35
- package/lib/store/sessions/activeView.js +0 -22
- package/lib/store/sessions/index.js +0 -9
- package/lib/store/sessions/sessionHitlContext.js +0 -15
- package/lib/store/sessions/sessionNotificationSound.js +0 -57
- package/lib/store/sessions/sessionNotifications.js +0 -110
- package/lib/store/sessions/sessionNotifications.types.js +0 -2
- package/lib/store/sessions/sessionStreamManager.js +0 -715
- package/lib/store/sessions/sessionStreamingText.js +0 -80
- package/lib/store/sessions/sessions.types.js +0 -35
- package/lib/store/sessions/useSessionMeta.js +0 -39
- package/lib/store/sessions/useSessionStreamingText.js +0 -18
- package/lib/store/sessions/useSessionsStore.js +0 -197
- package/lib/store/useChatsStore.js +0 -387
- package/lib/store/useFaqsStore.js +0 -27
- package/lib/streamdownStyles.js +0 -9
- package/lib/styles/StyledCleanContainer.js +0 -7
- package/lib/styles/cascade.js +0 -14
- package/lib/styles/config.js +0 -47
- package/lib/styles/shared/scrollable.js +0 -3
- package/lib/styles/transitions.js +0 -21
- package/lib/types/Action.js +0 -2
- package/lib/types/AgentSuggestion.js +0 -2
- package/lib/types/Chat.js +0 -10
- package/lib/types/Client.js +0 -2
- package/lib/types/FrequentlyAskedQuestion.js +0 -2
- package/lib/types/Project.js +0 -2
- package/lib/types/ProjectSummaryConfigKeys.js +0 -9
- package/lib/types/Task.js +0 -2
- package/lib/types/agent.js +0 -2
- package/lib/types/agentModal.js +0 -2
- package/lib/types/contextMention.js +0 -37
- package/lib/types/global.d.js +0 -2
- package/lib/types/skill.js +0 -2
- package/lib/types/streamActivity.js +0 -2
- package/lib/types/userType.d.js +0 -2
- package/lib/utils/actionCategoryMap.js +0 -37
- package/lib/utils/actionIconMap.js +0 -61
- package/lib/utils/agentDisplayName.js +0 -42
- package/lib/utils/chatInputFiles.js +0 -52
- package/lib/utils/contextMentionIcons.js +0 -134
- package/lib/utils/contextMentionLabel.js +0 -4
- package/lib/utils/contextMentionTriggers.js +0 -51
- package/lib/utils/contextMentionTypeLabel.js +0 -17
- package/lib/utils/corConnectorMentionTypes.js +0 -41
- package/lib/utils/ensureStreamdownStyles.js +0 -21
- package/lib/utils/entityLinkRender.js +0 -135
- package/lib/utils/fileDownloadHelper.js +0 -40
- package/lib/utils/formatQuickActionMessage.js +0 -16
- package/lib/utils/formatUnreadCount.js +0 -6
- package/lib/utils/getUnitFileSize.js +0 -13
- package/lib/utils/hitlAnalytics.js +0 -65
- package/lib/utils/hoursPlannerQuickActionType.js +0 -64
- package/lib/utils/imagePreprocessor.js +0 -108
- package/lib/utils/index.js +0 -3
- package/lib/utils/maiaHostOpen.js +0 -19
- package/lib/utils/maiaStreamdownRehypePlugins.js +0 -27
- package/lib/utils/mapBackendLang.js +0 -8
- package/lib/utils/normalizeAgentConnectors.js +0 -70
- package/lib/utils/openTaskInCorPanel.js +0 -22
- package/lib/utils/orchestratorSubagents.js +0 -11
- package/lib/utils/renderContextMentions.js +0 -420
- package/lib/utils/retryCompletion.js +0 -85
- package/lib/utils/slashCommandMarker.js +0 -30
- package/lib/utils/sortManagerHoursHomeFuas.js +0 -14
- package/lib/utils/sseStreamContent.js +0 -17
- package/lib/utils/streamActivityMessages.js +0 -359
- package/lib/utils/validateTrimmedFields.js +0 -8
|
@@ -1,1782 +0,0 @@
|
|
|
1
|
-
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
2
|
-
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
-
import _typeof from "@babel/runtime/helpers/typeof";
|
|
5
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
6
|
-
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
7
|
-
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; }
|
|
8
|
-
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; }
|
|
9
|
-
/* eslint-disable radix */
|
|
10
|
-
/* eslint-disable no-nested-ternary */
|
|
11
|
-
/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */
|
|
12
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
13
|
-
import { useCallback, useRef, useEffect, useState } from 'react';
|
|
14
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
15
|
-
import { useChatMessages } from '../useChatMessages';
|
|
16
|
-
import { useOrchestratorStream } from '../useOrchestratorStream';
|
|
17
|
-
import { useT } from '../useT';
|
|
18
|
-
import { useUser } from '../../context/cor-user';
|
|
19
|
-
import { useGlobalContext } from '../../context/global-context';
|
|
20
|
-
import { EVENTS, useEvent } from '../useEvent';
|
|
21
|
-
import maia from '../../services/maia';
|
|
22
|
-
import { Feedback } from '../../components/molecules/MessageFeedback/MessageFeedback';
|
|
23
|
-
import { ChatHistoryRole } from '../../types/Chat';
|
|
24
|
-
import { buildContextMessage } from '../../types/contextMention';
|
|
25
|
-
import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActionMessage';
|
|
26
|
-
import { useProjects } from '../useProjects';
|
|
27
|
-
import { useTabTaskDefault } from '../useTabTaskDefault';
|
|
28
|
-
import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
|
|
29
|
-
import { dispatchMaiaHoursCharged, isHoursChargeTool } from '../../constants/plannerSyncEvents';
|
|
30
|
-
import { fetchAgentDetail } from '../../services/maia/Agents/fetchAgentDetail';
|
|
31
|
-
import { buildHitlActionTypeList, getHitlAnalyticsAgentType, normalizeHitlToolName, trackManualHitlEvents } from '../../utils/hitlAnalytics';
|
|
32
|
-
import { sessionStreamingText } from '../../store/sessions/sessionStreamingText';
|
|
33
|
-
import { useSessionsStore } from '../../store/sessions/useSessionsStore';
|
|
34
|
-
import { useSessionMeta } from '../../store/sessions/useSessionMeta';
|
|
35
|
-
import { sessionStreamManager, MAX_CONCURRENT_STREAMS } from '../../store/sessions/sessionStreamManager';
|
|
36
|
-
import { activeView } from '../../store/sessions/activeView';
|
|
37
|
-
import { notifySessionFinishedInBackground } from '../../store/sessions/sessionNotifications';
|
|
38
|
-
import { buildSidebarSessionTitle, ensureSessionInSidebar } from '../../store/chatsSidebarOptimistic';
|
|
39
|
-
import { isStreamingPlaceholderMessageId } from '../../utils/streamActivityMessages';
|
|
40
|
-
import { findUserMessageForRetry, messagesWithoutRetriedTurn, resolveRetryTurnId } from '../../utils/retryCompletion';
|
|
41
|
-
import { getChatsStoreState, useChatsStore } from '../../store/useChatsStore';
|
|
42
|
-
var normalizeSendMessageArgs = function normalizeSendMessageArgs(attachmentsOrOptions) {
|
|
43
|
-
var _options$attachments;
|
|
44
|
-
if (Array.isArray(attachmentsOrOptions)) {
|
|
45
|
-
return {
|
|
46
|
-
attachments: attachmentsOrOptions,
|
|
47
|
-
options: {}
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
var options = attachmentsOrOptions !== null && attachmentsOrOptions !== void 0 ? attachmentsOrOptions : {};
|
|
51
|
-
return {
|
|
52
|
-
attachments: (_options$attachments = options.attachments) !== null && _options$attachments !== void 0 ? _options$attachments : [],
|
|
53
|
-
options: options
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
/** chipsProject es la fuente de verdad del pin visible; si no hay pin, restaurar desde historial. */
|
|
58
|
-
var resolveProjectToRequest = function resolveProjectToRequest(chipsProject, lastMessageProjectId) {
|
|
59
|
-
var chipsProjectId = chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId ? Number(chipsProject.projectId) : null;
|
|
60
|
-
if (chipsProjectId != null && Number.isFinite(chipsProjectId)) {
|
|
61
|
-
return chipsProjectId;
|
|
62
|
-
}
|
|
63
|
-
if (lastMessageProjectId != null) {
|
|
64
|
-
var parsed = Number(lastMessageProjectId);
|
|
65
|
-
return Number.isFinite(parsed) ? parsed : null;
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
};
|
|
69
|
-
var resolveClientPayload = function resolveClientPayload(ctxClient, ctxProject) {
|
|
70
|
-
var _ctxProject$client;
|
|
71
|
-
if (ctxClient !== null && ctxClient !== void 0 && ctxClient.id) {
|
|
72
|
-
return _objectSpread({
|
|
73
|
-
clientId: ctxClient.id
|
|
74
|
-
}, ctxClient.name ? {
|
|
75
|
-
clientName: ctxClient.name
|
|
76
|
-
} : {});
|
|
77
|
-
}
|
|
78
|
-
if ((ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.clientId) != null) {
|
|
79
|
-
return {
|
|
80
|
-
clientId: Number(ctxProject.clientId)
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
if (ctxProject !== null && ctxProject !== void 0 && (_ctxProject$client = ctxProject.client) !== null && _ctxProject$client !== void 0 && _ctxProject$client.id) {
|
|
84
|
-
return _objectSpread({
|
|
85
|
-
clientId: ctxProject.client.id
|
|
86
|
-
}, ctxProject.client.name ? {
|
|
87
|
-
clientName: ctxProject.client.name
|
|
88
|
-
} : {});
|
|
89
|
-
}
|
|
90
|
-
return {};
|
|
91
|
-
};
|
|
92
|
-
var normalizeAssistantAttachments = function normalizeAssistantAttachments(rawAttachments) {
|
|
93
|
-
if (!Array.isArray(rawAttachments)) {
|
|
94
|
-
return [];
|
|
95
|
-
}
|
|
96
|
-
return rawAttachments.filter(function (attachment) {
|
|
97
|
-
return !!attachment && _typeof(attachment) === 'object';
|
|
98
|
-
}).map(function (attachment, index) {
|
|
99
|
-
var name = typeof attachment.name === 'string' && attachment.name.trim() ? attachment.name.trim() : "file-".concat(index + 1);
|
|
100
|
-
var type = typeof attachment.type === 'string' && attachment.type.trim() ? attachment.type.trim() : 'pdf';
|
|
101
|
-
var mimeType = typeof attachment.mime_type === 'string' ? attachment.mime_type : '';
|
|
102
|
-
var fullFileName = name.includes('.') ? name : "".concat(name, ".").concat(type);
|
|
103
|
-
var numericSize = typeof attachment.size === 'number' ? attachment.size : Number.isFinite(Number(attachment.size)) ? Number(attachment.size) : 0;
|
|
104
|
-
return {
|
|
105
|
-
file: new File([], fullFileName, {
|
|
106
|
-
type: mimeType
|
|
107
|
-
}),
|
|
108
|
-
id: typeof attachment.id === 'string' && attachment.id.trim() ? attachment.id : "assistant-file-".concat(index, "-").concat(fullFileName),
|
|
109
|
-
name: name,
|
|
110
|
-
size: numericSize,
|
|
111
|
-
type: type,
|
|
112
|
-
url_original: typeof attachment.url_original === 'string' ? attachment.url_original : undefined,
|
|
113
|
-
url_thumbnail: typeof attachment.url_thumbnail === 'string' ? attachment.url_thumbnail : undefined,
|
|
114
|
-
url_file: typeof attachment.url_file === 'string' ? attachment.url_file : undefined,
|
|
115
|
-
role: attachment.role === 'assistant' ? 'assistant' : 'user'
|
|
116
|
-
};
|
|
117
|
-
});
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
/** Extrae task_ids de los tool_args de pending_actions, cubriendo las formas comunes:
|
|
121
|
-
* - `{ task_id }` o `{ id }`
|
|
122
|
-
* - `{ task_ids: [] }`
|
|
123
|
-
* - `{ tasks: [{ task_id|id }, ...] }`
|
|
124
|
-
* Útil para tools de edit/assign/delete cuando la respuesta del LLM no incluye URLs /tasks/.../detail. */
|
|
125
|
-
function extractTaskIdsFromPendingActionsArgs(pendingActions) {
|
|
126
|
-
var ids = [];
|
|
127
|
-
var pushId = function pushId(raw) {
|
|
128
|
-
if (raw == null) return;
|
|
129
|
-
var n = parseInt(String(raw), 10);
|
|
130
|
-
if (!Number.isNaN(n)) ids.push(n);
|
|
131
|
-
};
|
|
132
|
-
pendingActions.forEach(function (action) {
|
|
133
|
-
var _rec$task_id;
|
|
134
|
-
if (!action || _typeof(action) !== 'object') return;
|
|
135
|
-
var args = action.tool_args;
|
|
136
|
-
if (!(args && _typeof(args) === 'object' && !Array.isArray(args))) return;
|
|
137
|
-
var rec = args;
|
|
138
|
-
pushId((_rec$task_id = rec.task_id) !== null && _rec$task_id !== void 0 ? _rec$task_id : rec.id);
|
|
139
|
-
if (Array.isArray(rec.task_ids)) {
|
|
140
|
-
rec.task_ids.forEach(pushId);
|
|
141
|
-
}
|
|
142
|
-
if (Array.isArray(rec.tasks)) {
|
|
143
|
-
rec.tasks.forEach(function (t) {
|
|
144
|
-
if (t && _typeof(t) === 'object' && !Array.isArray(t)) {
|
|
145
|
-
var _trec$task_id;
|
|
146
|
-
var trec = t;
|
|
147
|
-
pushId((_trec$task_id = trec.task_id) !== null && _trec$task_id !== void 0 ? _trec$task_id : trec.id);
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
return ids;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/** task_id / task_ids en pending_actions de delete_* (la respuesta puede no incluir URLs /tasks/…/detail). */
|
|
156
|
-
function extractTaskIdsFromDeletePendingActions(pendingActions) {
|
|
157
|
-
var ids = [];
|
|
158
|
-
pendingActions.forEach(function (action) {
|
|
159
|
-
if (!action || _typeof(action) !== 'object') return;
|
|
160
|
-
var args = action.tool_args;
|
|
161
|
-
if (!(args && _typeof(args) === 'object' && !Array.isArray(args))) return;
|
|
162
|
-
var rec = args;
|
|
163
|
-
if (action.tool_name === 'delete_task') {
|
|
164
|
-
var _rec$task_id2;
|
|
165
|
-
var raw = (_rec$task_id2 = rec.task_id) !== null && _rec$task_id2 !== void 0 ? _rec$task_id2 : rec.id;
|
|
166
|
-
if (raw != null) {
|
|
167
|
-
var n = parseInt(String(raw), 10);
|
|
168
|
-
if (!Number.isNaN(n)) ids.push(n);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (action.tool_name === 'delete_tasks_batch') {
|
|
172
|
-
var list = rec.task_ids;
|
|
173
|
-
if (Array.isArray(list)) {
|
|
174
|
-
list.forEach(function (tid) {
|
|
175
|
-
var n = parseInt(String(tid), 10);
|
|
176
|
-
if (!Number.isNaN(n)) ids.push(n);
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
return ids;
|
|
182
|
-
}
|
|
183
|
-
function extractAgentIdFromEditAgentPendingActions(pendingActions) {
|
|
184
|
-
var _rec$agent_id;
|
|
185
|
-
var editAction = pendingActions.find(function (a) {
|
|
186
|
-
return (a.tool_name || '').toLowerCase() === 'edit_agent';
|
|
187
|
-
});
|
|
188
|
-
if (!editAction || !editAction.tool_args || _typeof(editAction.tool_args) !== 'object' || Array.isArray(editAction.tool_args)) {
|
|
189
|
-
return null;
|
|
190
|
-
}
|
|
191
|
-
var rec = editAction.tool_args;
|
|
192
|
-
var raw = (_rec$agent_id = rec.agent_id) !== null && _rec$agent_id !== void 0 ? _rec$agent_id : rec.agentId;
|
|
193
|
-
return raw != null ? String(raw) : null;
|
|
194
|
-
}
|
|
195
|
-
function extractAgentIdFromPendingActionsByToolName(pendingActions, toolName) {
|
|
196
|
-
var _ref, _rec$agent_id2;
|
|
197
|
-
var action = pendingActions.find(function (a) {
|
|
198
|
-
return (a.tool_name || '').toLowerCase() === toolName.toLowerCase();
|
|
199
|
-
});
|
|
200
|
-
if (!action || !action.tool_args || _typeof(action.tool_args) !== 'object' || Array.isArray(action.tool_args)) {
|
|
201
|
-
return null;
|
|
202
|
-
}
|
|
203
|
-
var rec = action.tool_args;
|
|
204
|
-
var raw = (_ref = (_rec$agent_id2 = rec.agent_id) !== null && _rec$agent_id2 !== void 0 ? _rec$agent_id2 : rec.agentId) !== null && _ref !== void 0 ? _ref : rec.id;
|
|
205
|
-
return raw != null ? String(raw) : null;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/** Último recurso si no hay links ni tool_args parseables (p. ej. "ID **7597106**"). */
|
|
209
|
-
function extractTaskIdsFromAssistantDeletionText(text) {
|
|
210
|
-
var labeled = text.match(/\bID\s*\*\*(\d+)\*\*/i);
|
|
211
|
-
if (labeled) {
|
|
212
|
-
var n = parseInt(labeled[1], 10);
|
|
213
|
-
return Number.isNaN(n) ? [] : [n];
|
|
214
|
-
}
|
|
215
|
-
var bold = text.match(/\*\*(\d{5,})\*\*/);
|
|
216
|
-
if (bold) {
|
|
217
|
-
var _n = parseInt(bold[1], 10);
|
|
218
|
-
return Number.isNaN(_n) ? [] : [_n];
|
|
219
|
-
}
|
|
220
|
-
return [];
|
|
221
|
-
}
|
|
222
|
-
var useStableCallbacks = function useStableCallbacks(authUser) {
|
|
223
|
-
var currentUser = useRef({
|
|
224
|
-
id: authUser.id.toString(),
|
|
225
|
-
name: authUser.firstName,
|
|
226
|
-
avatar: authUser.picture
|
|
227
|
-
});
|
|
228
|
-
if (currentUser.current.id !== authUser.id.toString() || currentUser.current.name !== authUser.firstName || currentUser.current.avatar !== authUser.picture) {
|
|
229
|
-
currentUser.current = {
|
|
230
|
-
id: authUser.id.toString(),
|
|
231
|
-
name: authUser.firstName,
|
|
232
|
-
avatar: authUser.picture
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
return {
|
|
236
|
-
currentUser: currentUser.current
|
|
237
|
-
};
|
|
238
|
-
};
|
|
239
|
-
var findMessageWithApprovalByThreadIds = function findMessageWithApprovalByThreadIds(threadIds, activeMessages) {
|
|
240
|
-
var fromActiveView = activeMessages.find(function (message) {
|
|
241
|
-
var _message$approval;
|
|
242
|
-
return (_message$approval = message.approval) === null || _message$approval === void 0 || (_message$approval = _message$approval.pending_actions) === null || _message$approval === void 0 ? void 0 : _message$approval.some(function (action) {
|
|
243
|
-
return threadIds.includes(action.thread_id);
|
|
244
|
-
});
|
|
245
|
-
});
|
|
246
|
-
if (fromActiveView !== null && fromActiveView !== void 0 && fromActiveView.approval) {
|
|
247
|
-
return {
|
|
248
|
-
message: fromActiveView,
|
|
249
|
-
sessionId: fromActiveView.approval.session_id || activeView.get() || ''
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
var _useSessionsStore$get = useSessionsStore.getState(),
|
|
253
|
-
messages = _useSessionsStore$get.messages;
|
|
254
|
-
var sessionEntry = Object.entries(messages).find(function (_ref2) {
|
|
255
|
-
var _ref3 = _slicedToArray(_ref2, 2),
|
|
256
|
-
sessionMessages = _ref3[1];
|
|
257
|
-
return sessionMessages.some(function (message) {
|
|
258
|
-
var _message$approval2;
|
|
259
|
-
return (_message$approval2 = message.approval) === null || _message$approval2 === void 0 || (_message$approval2 = _message$approval2.pending_actions) === null || _message$approval2 === void 0 ? void 0 : _message$approval2.some(function (action) {
|
|
260
|
-
return threadIds.includes(action.thread_id);
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
if (sessionEntry) {
|
|
265
|
-
var _sessionEntry = _slicedToArray(sessionEntry, 2),
|
|
266
|
-
sessionId = _sessionEntry[0],
|
|
267
|
-
sessionMessages = _sessionEntry[1];
|
|
268
|
-
var found = sessionMessages.find(function (message) {
|
|
269
|
-
var _message$approval3;
|
|
270
|
-
return (_message$approval3 = message.approval) === null || _message$approval3 === void 0 || (_message$approval3 = _message$approval3.pending_actions) === null || _message$approval3 === void 0 ? void 0 : _message$approval3.some(function (action) {
|
|
271
|
-
return threadIds.includes(action.thread_id);
|
|
272
|
-
});
|
|
273
|
-
});
|
|
274
|
-
if (found !== null && found !== void 0 && found.approval) {
|
|
275
|
-
return {
|
|
276
|
-
message: found,
|
|
277
|
-
sessionId: found.approval.session_id || sessionId
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
return null;
|
|
282
|
-
};
|
|
283
|
-
export var useChatManager = function useChatManager(_ref4) {
|
|
284
|
-
var initialChatId = _ref4.chatId,
|
|
285
|
-
userInitialMessage = _ref4.userInitialMessage,
|
|
286
|
-
onError = _ref4.onError,
|
|
287
|
-
_ref4$agents = _ref4.agents,
|
|
288
|
-
agents = _ref4$agents === void 0 ? [] : _ref4$agents;
|
|
289
|
-
var _useT = useT(),
|
|
290
|
-
t = _useT.t;
|
|
291
|
-
var authUser = useUser();
|
|
292
|
-
var _useGlobalContext = useGlobalContext(),
|
|
293
|
-
project = _useGlobalContext.project,
|
|
294
|
-
setProject = _useGlobalContext.setProject,
|
|
295
|
-
client = _useGlobalContext.client,
|
|
296
|
-
setClient = _useGlobalContext.setClient,
|
|
297
|
-
task = _useGlobalContext.task,
|
|
298
|
-
setTask = _useGlobalContext.setTask,
|
|
299
|
-
agent = _useGlobalContext.agent,
|
|
300
|
-
isWebSearchActive = _useGlobalContext.isWebSearchActive,
|
|
301
|
-
isDeepSearchActive = _useGlobalContext.isDeepSearchActive,
|
|
302
|
-
chipsProject = _useGlobalContext.chipsProject,
|
|
303
|
-
setChipsProject = _useGlobalContext.setChipsProject;
|
|
304
|
-
var event = useEvent();
|
|
305
|
-
var _useProjects = useProjects(),
|
|
306
|
-
fetchProjects = _useProjects.fetchProjects;
|
|
307
|
-
var _useStableCallbacks = useStableCallbacks(authUser),
|
|
308
|
-
currentUser = _useStableCallbacks.currentUser;
|
|
309
|
-
var _useTabTaskDefault = useTabTaskDefault(),
|
|
310
|
-
getTabTaskDefault = _useTabTaskDefault.getTabTaskDefault;
|
|
311
|
-
var currentMessageId = useRef(uuidv4());
|
|
312
|
-
var currentUserQuestion = useRef(null);
|
|
313
|
-
var currentChatId = useRef(initialChatId || uuidv4());
|
|
314
|
-
var setActiveChatId = useChatsStore(function (state) {
|
|
315
|
-
return state.setActiveChatId;
|
|
316
|
-
});
|
|
317
|
-
var reportedEvent = useRef(false);
|
|
318
|
-
var messagesRef = useRef([]);
|
|
319
|
-
/**
|
|
320
|
-
* Guarda info del último approval manual (cuando el usuario tipea "si"/"no" en lugar
|
|
321
|
-
* de clickear el botón). En manual approval, `handleApprovalRequired` retorna early
|
|
322
|
-
* sin agregar un mensaje con `approval`, así que la lógica de refetch en `onStreamFinish`
|
|
323
|
-
* no lo detecta vía `previousMessage.approval`. Lo guardamos acá para consumirlo después.
|
|
324
|
-
*/
|
|
325
|
-
var lastManualApprovalRef = useRef(null);
|
|
326
|
-
/** Evita duplicar AI_CHAT_HITL / AI_CHAT_HITL_OPTION en aprobaciones manuales por lote. */
|
|
327
|
-
var trackedManualHitlKeysRef = useRef(new Set());
|
|
328
|
-
/** Contexto del mensaje de aprobación previo al ejecutar continue-thread. */
|
|
329
|
-
var hitlExecutionContextRef = useRef(null);
|
|
330
|
-
/** Mensajes a restaurar si `retry_completion` falla antes de persistir el reemplazo. */
|
|
331
|
-
var retrySnapshotRef = useRef(null);
|
|
332
|
-
var isProcessingRef = useRef(false);
|
|
333
|
-
var firstTimeRef = useRef(false);
|
|
334
|
-
/** Id del placeholder del mensaje en streaming activo (si hay). */
|
|
335
|
-
var streamingPlaceholderIdRef = useRef(null);
|
|
336
|
-
/**
|
|
337
|
-
* Chat al que pertenece el stream actualmente activo. Si cambia el chat
|
|
338
|
-
* mientras un stream está en vuelo, descartamos los tokens residuales
|
|
339
|
-
* que puedan llegar antes de que el abort se complete.
|
|
340
|
-
*/
|
|
341
|
-
var activeStreamChatIdRef = useRef(null);
|
|
342
|
-
var clearStreamUiRef = useRef(function () {
|
|
343
|
-
return undefined;
|
|
344
|
-
});
|
|
345
|
-
var _useState = useState({}),
|
|
346
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
347
|
-
activeLoadings = _useState2[0],
|
|
348
|
-
setActiveLoadings = _useState2[1];
|
|
349
|
-
/**
|
|
350
|
-
* Sesión actualmente visible. Se mantiene en state (no solo en ref) para que
|
|
351
|
-
* el motor de streaming pueda leer reactivamente los flags de ESTA sesión
|
|
352
|
-
* desde el store, mientras otras siguen generando en background.
|
|
353
|
-
*/
|
|
354
|
-
var _useState3 = useState(currentChatId.current),
|
|
355
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
356
|
-
activeSessionId = _useState4[0],
|
|
357
|
-
setActiveSessionId = _useState4[1];
|
|
358
|
-
/** True mientras esta instancia esté montada (evita setState tras desmontar). */
|
|
359
|
-
var isMountedRef = useRef(true);
|
|
360
|
-
/** Evita reconciliar dos veces el mismo estado terminal de una sesión. */
|
|
361
|
-
var lastHandledTerminalRef = useRef(null);
|
|
362
|
-
var isWebSearchActiveRef = useRef(isWebSearchActive);
|
|
363
|
-
var isDeepSearchActiveRef = useRef(isDeepSearchActive);
|
|
364
|
-
/** Evita closures obsoletas cuando el footer conserva sendMessage entre renders. */
|
|
365
|
-
var contextRef = useRef({
|
|
366
|
-
chipsProject: chipsProject,
|
|
367
|
-
project: project,
|
|
368
|
-
client: client,
|
|
369
|
-
task: task
|
|
370
|
-
});
|
|
371
|
-
contextRef.current = {
|
|
372
|
-
chipsProject: chipsProject,
|
|
373
|
-
project: project,
|
|
374
|
-
client: client,
|
|
375
|
-
task: task
|
|
376
|
-
};
|
|
377
|
-
useEffect(function () {
|
|
378
|
-
isWebSearchActiveRef.current = isWebSearchActive;
|
|
379
|
-
isDeepSearchActiveRef.current = isDeepSearchActive;
|
|
380
|
-
}, [isWebSearchActive, isDeepSearchActive]);
|
|
381
|
-
var _useChatMessages = useChatMessages({
|
|
382
|
-
chatId: initialChatId || currentChatId.current,
|
|
383
|
-
currentUser: currentUser,
|
|
384
|
-
userInitialMessage: userInitialMessage,
|
|
385
|
-
onError: onError,
|
|
386
|
-
agents: agents
|
|
387
|
-
}),
|
|
388
|
-
loadingMessages = _useChatMessages.loadingMessages,
|
|
389
|
-
messages = _useChatMessages.messages,
|
|
390
|
-
isLoadingMoreMessages = _useChatMessages.isLoadingMoreMessages,
|
|
391
|
-
loadMessages = _useChatMessages.loadMessages,
|
|
392
|
-
addMessage = _useChatMessages.addMessage,
|
|
393
|
-
removeMessage = _useChatMessages.removeMessage,
|
|
394
|
-
replaceMessages = _useChatMessages.replaceMessages,
|
|
395
|
-
handleScroll = _useChatMessages.handleScroll;
|
|
396
|
-
messagesRef.current = messages;
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Escribe un mensaje en el store por-sesión y, si la sesión es la activa,
|
|
400
|
-
* también en la vista local. Permite que sesiones en background acumulen su
|
|
401
|
-
* resultado sin pisar el chat que el usuario está mirando.
|
|
402
|
-
*/
|
|
403
|
-
var commitToSession = useCallback(function (sessionId, message) {
|
|
404
|
-
useSessionsStore.getState().addMessage(sessionId, message);
|
|
405
|
-
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
406
|
-
addMessage(message);
|
|
407
|
-
}
|
|
408
|
-
}, [addMessage]);
|
|
409
|
-
var dropFromSession = useCallback(function (sessionId, messageId) {
|
|
410
|
-
useSessionsStore.getState().removeMessage(sessionId, messageId);
|
|
411
|
-
if (isMountedRef.current && activeView.is(sessionId)) {
|
|
412
|
-
removeMessage(messageId);
|
|
413
|
-
}
|
|
414
|
-
}, [removeMessage]);
|
|
415
|
-
|
|
416
|
-
/** Limpia el tail en vuelo de una sesión (tras terminar; el backend pasa a ser fuente). */
|
|
417
|
-
var clearSessionTail = useCallback(function (sessionId) {
|
|
418
|
-
useSessionsStore.getState().setMessages(sessionId, []);
|
|
419
|
-
}, []);
|
|
420
|
-
|
|
421
|
-
// Registrar la sesión visible en el tracker global para que los callbacks del
|
|
422
|
-
// motor (que pueden pertenecer a una instancia ya desmontada) sepan cuál es la
|
|
423
|
-
// sesión activa actual.
|
|
424
|
-
useEffect(function () {
|
|
425
|
-
activeView.set(activeSessionId);
|
|
426
|
-
}, [activeSessionId]);
|
|
427
|
-
useEffect(function () {
|
|
428
|
-
isMountedRef.current = true;
|
|
429
|
-
return function () {
|
|
430
|
-
isMountedRef.current = false;
|
|
431
|
-
if (activeView.is(currentChatId.current)) {
|
|
432
|
-
activeView.set(null);
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
}, []);
|
|
436
|
-
|
|
437
|
-
// Reconciliación: si la sesión activa termina (complete/error) pero el store
|
|
438
|
-
// por-sesión todavía tiene un placeholder de streaming, refrescamos desde
|
|
439
|
-
// el backend. Usamos el store (no messagesRef): handleStreamFinish limpia el
|
|
440
|
-
// placeholder ahí de forma síncrona; messagesRef puede quedar stale un render
|
|
441
|
-
// porque setStatus (Zustand) y removeMessage (React) no batchan juntos.
|
|
442
|
-
// `cancelled` queda afuera: el stop ya reconcilia local (parcial + burbuja de
|
|
443
|
-
// cancelado) y recargar acá mostraba la pantalla de carga del chat entero.
|
|
444
|
-
var activeSessionMeta = useSessionMeta(activeSessionId);
|
|
445
|
-
useEffect(function () {
|
|
446
|
-
var _activeSessionMeta$fi;
|
|
447
|
-
var status = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status;
|
|
448
|
-
if (!status) return;
|
|
449
|
-
var isTerminal = status === 'complete' || status === 'error';
|
|
450
|
-
if (!isTerminal) return;
|
|
451
|
-
var key = "".concat(activeSessionId, ":").concat(status, ":").concat((_activeSessionMeta$fi = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt) !== null && _activeSessionMeta$fi !== void 0 ? _activeSessionMeta$fi : '');
|
|
452
|
-
if (lastHandledTerminalRef.current === key) return;
|
|
453
|
-
lastHandledTerminalRef.current = key;
|
|
454
|
-
var tail = useSessionsStore.getState().getMessages(activeSessionId);
|
|
455
|
-
var hasStalePlaceholder = tail.some(function (msg) {
|
|
456
|
-
return isStreamingPlaceholderMessageId(msg.id);
|
|
457
|
-
});
|
|
458
|
-
if (hasStalePlaceholder) {
|
|
459
|
-
loadMessages({
|
|
460
|
-
force: true
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
}, [activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status, activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt, activeSessionId, loadMessages]);
|
|
464
|
-
useEffect(function () {
|
|
465
|
-
var customEvent = new CustomEvent('chat-loading-messages-changed', {
|
|
466
|
-
detail: {
|
|
467
|
-
loadingMessages: loadingMessages
|
|
468
|
-
}
|
|
469
|
-
});
|
|
470
|
-
document.dispatchEvent(customEvent);
|
|
471
|
-
}, [loadingMessages]);
|
|
472
|
-
var previousInitialChatIdRef = useRef(initialChatId);
|
|
473
|
-
useEffect(function () {
|
|
474
|
-
var previousInitialChatId = previousInitialChatIdRef.current;
|
|
475
|
-
previousInitialChatIdRef.current = initialChatId;
|
|
476
|
-
|
|
477
|
-
// Chat nuevo / home: initialChatId pasa a null, así que la rama de abajo no
|
|
478
|
-
// aplica. Hay que rotar a una sesión nueva igual: si seguimos apuntando a la
|
|
479
|
-
// anterior, `activeView` la sigue marcando como activa y cuando termina no se
|
|
480
|
-
// notifica (y su respuesta se commitea sobre la vista nueva). El árbol no
|
|
481
|
-
// remonta en este flujo (no hay `key`) y nadie consume `resetChat`.
|
|
482
|
-
if (!initialChatId && previousInitialChatId) {
|
|
483
|
-
currentChatId.current = uuidv4();
|
|
484
|
-
setActiveSessionId(currentChatId.current);
|
|
485
|
-
currentMessageId.current = uuidv4();
|
|
486
|
-
currentUserQuestion.current = null;
|
|
487
|
-
reportedEvent.current = false;
|
|
488
|
-
isProcessingRef.current = false;
|
|
489
|
-
streamingPlaceholderIdRef.current = null;
|
|
490
|
-
activeStreamChatIdRef.current = null;
|
|
491
|
-
return;
|
|
492
|
-
}
|
|
493
|
-
if (initialChatId && initialChatId !== currentChatId.current) {
|
|
494
|
-
// NO abortamos el stream anterior: puede seguir generando en background.
|
|
495
|
-
// Solo cambiamos de sesión activa; el motor rutea cada stream por su
|
|
496
|
-
// sessionId, así que los tokens de la sesión previa siguen aplicándose a
|
|
497
|
-
// ESA sesión (store), no a la nueva.
|
|
498
|
-
|
|
499
|
-
// Limpiar contexto global al cambiar de conversación
|
|
500
|
-
setProject(null);
|
|
501
|
-
setClient === null || setClient === void 0 || setClient(null);
|
|
502
|
-
setChipsProject(null);
|
|
503
|
-
setTask(null);
|
|
504
|
-
currentChatId.current = initialChatId;
|
|
505
|
-
setActiveSessionId(initialChatId);
|
|
506
|
-
currentMessageId.current = uuidv4();
|
|
507
|
-
currentUserQuestion.current = null;
|
|
508
|
-
reportedEvent.current = false;
|
|
509
|
-
// isProcessingRef refleja si la sesión ACTIVA está ocupada. Si la sesión
|
|
510
|
-
// a la que entramos sigue generando en background, queda bloqueada; si no,
|
|
511
|
-
// se habilita el envío aunque otras sesiones sigan generando.
|
|
512
|
-
isProcessingRef.current = sessionStreamManager.isActive(initialChatId);
|
|
513
|
-
streamingPlaceholderIdRef.current = null;
|
|
514
|
-
activeStreamChatIdRef.current = null;
|
|
515
|
-
|
|
516
|
-
// loadMessages lo dispara useChatMessages al cambiar chatId (con cache en memoria).
|
|
517
|
-
}
|
|
518
|
-
}, [initialChatId, project, setProject, setClient, setChipsProject, setTask]);
|
|
519
|
-
useEffect(function () {
|
|
520
|
-
setActiveChatId(initialChatId || null);
|
|
521
|
-
}, [initialChatId, setActiveChatId]);
|
|
522
|
-
var handleStreamError = useCallback(function (ctx, errorMessage, errorRawMessage) {
|
|
523
|
-
var _errorRawMessage$matc, _errorRawMessage$matc2;
|
|
524
|
-
var sessionId = ctx.sessionId,
|
|
525
|
-
messageId = ctx.messageId,
|
|
526
|
-
placeholderId = ctx.placeholderId;
|
|
527
|
-
var isActive = activeView.is(sessionId);
|
|
528
|
-
sessionStreamingText.clear(sessionId);
|
|
529
|
-
dropFromSession(sessionId, placeholderId);
|
|
530
|
-
var retrySnapshot = retrySnapshotRef.current;
|
|
531
|
-
if (retrySnapshot) {
|
|
532
|
-
retrySnapshotRef.current = null;
|
|
533
|
-
messagesRef.current = retrySnapshot;
|
|
534
|
-
replaceMessages(retrySnapshot);
|
|
535
|
-
if (isActive) {
|
|
536
|
-
clearStreamUiRef.current();
|
|
537
|
-
streamingPlaceholderIdRef.current = null;
|
|
538
|
-
activeStreamChatIdRef.current = null;
|
|
539
|
-
isProcessingRef.current = false;
|
|
540
|
-
}
|
|
541
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
542
|
-
detail: {
|
|
543
|
-
show: true,
|
|
544
|
-
severity: 'error',
|
|
545
|
-
message: t('chat.error')
|
|
546
|
-
}
|
|
547
|
-
}));
|
|
548
|
-
return;
|
|
549
|
-
}
|
|
550
|
-
if (isActive) {
|
|
551
|
-
clearStreamUiRef.current();
|
|
552
|
-
streamingPlaceholderIdRef.current = null;
|
|
553
|
-
activeStreamChatIdRef.current = null;
|
|
554
|
-
isProcessingRef.current = false;
|
|
555
|
-
}
|
|
556
|
-
var isAccessDenied = errorMessage === "Access denied: You don't have permission to access this agent";
|
|
557
|
-
var isPromptTooLong = errorMessage === 'invalid_request_error' && (errorRawMessage === null || errorRawMessage === void 0 ? void 0 : errorRawMessage.includes('prompt is too long'));
|
|
558
|
-
var message = isAccessDenied ? t('chat.errorAccessDenied') : isPromptTooLong ? t('chat.errorPromptTooLong', {
|
|
559
|
-
used: (_errorRawMessage$matc = errorRawMessage === null || errorRawMessage === void 0 || (_errorRawMessage$matc2 = errorRawMessage.match(/(\d+) tokens/)) === null || _errorRawMessage$matc2 === void 0 ? void 0 : _errorRawMessage$matc2[1]) !== null && _errorRawMessage$matc !== void 0 ? _errorRawMessage$matc : ''
|
|
560
|
-
}) : t('chat.error');
|
|
561
|
-
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
562
|
-
id: "answer-".concat(messageId),
|
|
563
|
-
message: message,
|
|
564
|
-
isError: true
|
|
565
|
-
}, !isAccessDenied && !isPromptTooLong ? {
|
|
566
|
-
suggestions: [t('chat.retry')]
|
|
567
|
-
} : {}), {}, {
|
|
568
|
-
date: new Date(),
|
|
569
|
-
user: {
|
|
570
|
-
id: 'assistant',
|
|
571
|
-
name: 'Assistant'
|
|
572
|
-
},
|
|
573
|
-
role: ChatHistoryRole.ASSISTANT
|
|
574
|
-
}));
|
|
575
|
-
clearSessionTail(sessionId);
|
|
576
|
-
if (!isActive) {
|
|
577
|
-
getChatsStoreState().markChatAsUnread(sessionId);
|
|
578
|
-
notifySessionFinishedInBackground(sessionId, 'error');
|
|
579
|
-
}
|
|
580
|
-
}, [commitToSession, dropFromSession, clearSessionTail, replaceMessages, t]);
|
|
581
|
-
var handleStreamUpdate = useCallback(function (ctx, content) {
|
|
582
|
-
var sessionId = ctx.sessionId,
|
|
583
|
-
placeholderId = ctx.placeholderId;
|
|
584
|
-
|
|
585
|
-
// Aseguramos el placeholder una única vez por stream, tanto en el store
|
|
586
|
-
// de la sesión como en la vista si es la activa. El texto en vivo viaja
|
|
587
|
-
// por sessionStreamingText (externo), sin re-render del árbol completo.
|
|
588
|
-
var placeholderExists = useSessionsStore.getState().getMessages(sessionId).some(function (msg) {
|
|
589
|
-
return msg.id === placeholderId;
|
|
590
|
-
});
|
|
591
|
-
if (!placeholderExists) {
|
|
592
|
-
sessionStreamingText.start(sessionId, placeholderId);
|
|
593
|
-
commitToSession(sessionId, {
|
|
594
|
-
id: placeholderId,
|
|
595
|
-
message: '',
|
|
596
|
-
date: new Date(),
|
|
597
|
-
user: {
|
|
598
|
-
id: 'assistant',
|
|
599
|
-
name: 'Assistant'
|
|
600
|
-
},
|
|
601
|
-
role: ChatHistoryRole.ASSISTANT
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
if (activeView.is(sessionId)) {
|
|
605
|
-
streamingPlaceholderIdRef.current = placeholderId;
|
|
606
|
-
activeStreamChatIdRef.current = sessionId;
|
|
607
|
-
}
|
|
608
|
-
sessionStreamingText.setText(sessionId, placeholderId, content);
|
|
609
|
-
}, [commitToSession]);
|
|
610
|
-
var handleStreamFinish = useCallback(/*#__PURE__*/function () {
|
|
611
|
-
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(ctx, content, sources, memorySessionId, rawAttachments, suggestions, completedAgentId) {
|
|
612
|
-
var _previousMessage$appr, _window$taskPanel, _createAgentFollowUp, _editAgentFollowUp;
|
|
613
|
-
var sessionId, placeholderId, isActive, tempMessageId, attachments, taskUrlRegex, matches, contentToAdd, previousMessage, hasApprovalInPreviousMessage, TASK_CREATION_TOOLS, TASK_EDIT_TOOLS, TASK_DELETE_TOOLS, pendingActions, wasTaskCreation, wasTaskEdit, wasTaskDelete, wasCreateAgentApproved, wasConfigureAgentAccessApproved, createAgentFollowUp, configuredAgentId, manualApprovalForAnalytics, wasManualCreateAgentApproved, wasEditAgentApproved, editAgentFollowUp, fromStream, fromArgs, resolvedAgentId, taskIdsFromUrls, taskIdsFromDeleteApproval, taskIdsFromDeletionText, taskIdsForDashboard, shouldSyncDashboard, taskIds, tab, tabSegment, lastProjectMessage, contextProjectIdRaw, contextProjectId, pathMatch, routeProjectId, isOnProjectRoute, _window$newProjectDas, _window$newProjectDas2, _window$newProjectDas3, _window$newProjectDas4, _window$newProjectDas5, _window$newProjectDas6, openTaskPanelId, manualApproval, manualWasTaskEdit, manualWasTaskDelete, hoursToolsFromApproval, wasHoursChargeApproved, manualHoursTool, wasHoursChargeManualApproved, tools, _manualApproval$toolA, manualPseudoAction, affectedTaskIds, _window$taskPanel2, _window$taskPanel2$re, _getChatsStoreState, isChatViewVisible, markChatAsRead, customEvent;
|
|
614
|
-
return _regeneratorRuntime.wrap(function (_context) {
|
|
615
|
-
while (1) switch (_context.prev = _context.next) {
|
|
616
|
-
case 0:
|
|
617
|
-
sessionId = ctx.sessionId, placeholderId = ctx.placeholderId;
|
|
618
|
-
isActive = activeView.is(sessionId);
|
|
619
|
-
retrySnapshotRef.current = null;
|
|
620
|
-
tempMessageId = placeholderId;
|
|
621
|
-
sessionStreamingText.clear(sessionId);
|
|
622
|
-
dropFromSession(sessionId, tempMessageId);
|
|
623
|
-
attachments = normalizeAssistantAttachments(rawAttachments); // Sesión en background: cerramos lean. El backend ya persistió la
|
|
624
|
-
// respuesta, así que al volver a la sesión se carga desde ahí. Avisamos
|
|
625
|
-
// que terminó (unread + evento para toast/sonido).
|
|
626
|
-
if (isActive) {
|
|
627
|
-
_context.next = 1;
|
|
628
|
-
break;
|
|
629
|
-
}
|
|
630
|
-
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
631
|
-
id: "answer-".concat(memorySessionId),
|
|
632
|
-
message: content,
|
|
633
|
-
date: new Date(),
|
|
634
|
-
user: {
|
|
635
|
-
id: 'assistant',
|
|
636
|
-
name: 'Assistant'
|
|
637
|
-
},
|
|
638
|
-
role: ChatHistoryRole.ASSISTANT,
|
|
639
|
-
sources: sources
|
|
640
|
-
}, attachments.length > 0 ? {
|
|
641
|
-
attachments: attachments
|
|
642
|
-
} : {}), {}, {
|
|
643
|
-
memorySessionId: memorySessionId,
|
|
644
|
-
suggestions: suggestions || []
|
|
645
|
-
}));
|
|
646
|
-
clearSessionTail(sessionId);
|
|
647
|
-
getChatsStoreState().markChatAsUnread(sessionId);
|
|
648
|
-
notifySessionFinishedInBackground(sessionId, 'complete');
|
|
649
|
-
return _context.abrupt("return");
|
|
650
|
-
case 1:
|
|
651
|
-
streamingPlaceholderIdRef.current = null;
|
|
652
|
-
activeStreamChatIdRef.current = null;
|
|
653
|
-
hitlExecutionContextRef.current = null;
|
|
654
|
-
|
|
655
|
-
// Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
|
|
656
|
-
taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
657
|
-
matches = _toConsumableArray(content.matchAll(taskUrlRegex));
|
|
658
|
-
contentToAdd = content;
|
|
659
|
-
previousMessage = messagesRef.current.filter(function (m) {
|
|
660
|
-
return m.id !== tempMessageId;
|
|
661
|
-
}).at(-1);
|
|
662
|
-
hasApprovalInPreviousMessage = (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approval) != null;
|
|
663
|
-
TASK_CREATION_TOOLS = ['create_task', 'create_tasks_batch', 'clone_task'];
|
|
664
|
-
TASK_EDIT_TOOLS = ['edit_task', 'edit_tasks_batch', 'task_assign', 'task_unassign', 'update_task_type', 'update_estimated_hours', 'assign_task_label'];
|
|
665
|
-
TASK_DELETE_TOOLS = ['delete_task', 'delete_tasks_batch'];
|
|
666
|
-
pendingActions = (previousMessage === null || previousMessage === void 0 || (_previousMessage$appr = previousMessage.approval) === null || _previousMessage$appr === void 0 ? void 0 : _previousMessage$appr.pending_actions) || [];
|
|
667
|
-
wasTaskCreation = hasApprovalInPreviousMessage && pendingActions.some(function (action) {
|
|
668
|
-
return TASK_CREATION_TOOLS.includes(action.tool_name);
|
|
669
|
-
});
|
|
670
|
-
wasTaskEdit = hasApprovalInPreviousMessage && pendingActions.some(function (action) {
|
|
671
|
-
return TASK_EDIT_TOOLS.includes(action.tool_name);
|
|
672
|
-
});
|
|
673
|
-
wasTaskDelete = hasApprovalInPreviousMessage && pendingActions.some(function (action) {
|
|
674
|
-
return TASK_DELETE_TOOLS.includes(action.tool_name);
|
|
675
|
-
});
|
|
676
|
-
wasCreateAgentApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && pendingActions.some(function (action) {
|
|
677
|
-
return action.tool_name === 'create_agent';
|
|
678
|
-
});
|
|
679
|
-
wasConfigureAgentAccessApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && pendingActions.some(function (action) {
|
|
680
|
-
return (action.tool_name || '').toLowerCase() === 'configure_agent_access';
|
|
681
|
-
});
|
|
682
|
-
if (wasCreateAgentApproved && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS && completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim()) {
|
|
683
|
-
createAgentFollowUp = {
|
|
684
|
-
agentId: completedAgentId.trim()
|
|
685
|
-
};
|
|
686
|
-
} else if (wasConfigureAgentAccessApproved && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS && (completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim() || extractAgentIdFromPendingActionsByToolName(pendingActions, 'configure_agent_access'))) {
|
|
687
|
-
configuredAgentId = (completedAgentId === null || completedAgentId === void 0 ? void 0 : completedAgentId.trim()) || extractAgentIdFromPendingActionsByToolName(pendingActions, 'configure_agent_access');
|
|
688
|
-
createAgentFollowUp = {
|
|
689
|
-
agentId: configuredAgentId
|
|
690
|
-
};
|
|
691
|
-
}
|
|
692
|
-
if (wasCreateAgentApproved) {
|
|
693
|
-
event(EVENTS.aiChatHitlOption, _objectSpread({
|
|
694
|
-
agent_type: getHitlAnalyticsAgentType(agent),
|
|
695
|
-
action_type: buildHitlActionTypeList(pendingActions),
|
|
696
|
-
decision: 'accept',
|
|
697
|
-
option: 'create_agent'
|
|
698
|
-
}, completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim() ? {
|
|
699
|
-
created_agent_id: completedAgentId.trim()
|
|
700
|
-
} : {}));
|
|
701
|
-
}
|
|
702
|
-
manualApprovalForAnalytics = lastManualApprovalRef.current;
|
|
703
|
-
wasManualCreateAgentApproved = manualApprovalForAnalytics && normalizeHitlToolName(manualApprovalForAnalytics.toolName) === 'create_agent';
|
|
704
|
-
if (wasManualCreateAgentApproved) {
|
|
705
|
-
event(EVENTS.aiChatHitlOption, _objectSpread({
|
|
706
|
-
agent_type: getHitlAnalyticsAgentType(agent),
|
|
707
|
-
action_type: 'create_agent',
|
|
708
|
-
decision: 'accept',
|
|
709
|
-
resolution_source: 'manual',
|
|
710
|
-
option: 'create_agent'
|
|
711
|
-
}, completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim() ? {
|
|
712
|
-
created_agent_id: completedAgentId.trim()
|
|
713
|
-
} : {}));
|
|
714
|
-
}
|
|
715
|
-
wasEditAgentApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && pendingActions.some(function (action) {
|
|
716
|
-
return (action.tool_name || '').toLowerCase() === 'edit_agent';
|
|
717
|
-
});
|
|
718
|
-
if (wasEditAgentApproved) {
|
|
719
|
-
fromStream = completedAgentId === null || completedAgentId === void 0 ? void 0 : completedAgentId.trim();
|
|
720
|
-
fromArgs = extractAgentIdFromEditAgentPendingActions(pendingActions);
|
|
721
|
-
resolvedAgentId = fromStream || fromArgs;
|
|
722
|
-
if (resolvedAgentId) {
|
|
723
|
-
editAgentFollowUp = {
|
|
724
|
-
agentId: resolvedAgentId
|
|
725
|
-
};
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
taskIdsFromUrls = matches.map(function (match) {
|
|
729
|
-
return parseInt(match[1], 10);
|
|
730
|
-
});
|
|
731
|
-
taskIdsFromDeleteApproval = extractTaskIdsFromDeletePendingActions(pendingActions);
|
|
732
|
-
taskIdsFromDeletionText = wasTaskDelete && taskIdsFromUrls.length === 0 && taskIdsFromDeleteApproval.length === 0 ? extractTaskIdsFromAssistantDeletionText(content) : [];
|
|
733
|
-
taskIdsForDashboard = taskIdsFromUrls.length > 0 ? taskIdsFromUrls : taskIdsFromDeleteApproval.length > 0 ? taskIdsFromDeleteApproval : taskIdsFromDeletionText;
|
|
734
|
-
shouldSyncDashboard = hasApprovalInPreviousMessage && (wasTaskCreation || wasTaskEdit || wasTaskDelete) && taskIdsForDashboard.length > 0;
|
|
735
|
-
if (!shouldSyncDashboard) {
|
|
736
|
-
_context.next = 4;
|
|
737
|
-
break;
|
|
738
|
-
}
|
|
739
|
-
taskIds = taskIdsForDashboard;
|
|
740
|
-
if (!(matches.length > 0)) {
|
|
741
|
-
_context.next = 3;
|
|
742
|
-
break;
|
|
743
|
-
}
|
|
744
|
-
_context.next = 2;
|
|
745
|
-
return getTabTaskDefault(taskIds[0]);
|
|
746
|
-
case 2:
|
|
747
|
-
tab = _context.sent;
|
|
748
|
-
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
749
|
-
contentToAdd = content.replace(taskUrlRegex, function (url) {
|
|
750
|
-
return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
|
|
751
|
-
});
|
|
752
|
-
case 3:
|
|
753
|
-
lastProjectMessage = messagesRef.current.filter(function (msg) {
|
|
754
|
-
return msg.projectId;
|
|
755
|
-
}).at(-1);
|
|
756
|
-
contextProjectIdRaw = (project === null || project === void 0 ? void 0 : project.id) || (lastProjectMessage === null || lastProjectMessage === void 0 ? void 0 : lastProjectMessage.projectId);
|
|
757
|
-
contextProjectId = contextProjectIdRaw ? parseInt(String(contextProjectIdRaw), 10) : null;
|
|
758
|
-
pathMatch = window.location.pathname.match(/^\/projects\/(\d+)\//);
|
|
759
|
-
routeProjectId = pathMatch ? parseInt(pathMatch[1], 10) : null;
|
|
760
|
-
isOnProjectRoute = contextProjectId && routeProjectId && contextProjectId === routeProjectId;
|
|
761
|
-
if (isOnProjectRoute) {
|
|
762
|
-
if (wasTaskCreation) {
|
|
763
|
-
(_window$newProjectDas = window.newProjectDashboard) === null || _window$newProjectDas === void 0 || (_window$newProjectDas2 = _window$newProjectDas.addExistingTaskToDashboard) === null || _window$newProjectDas2 === void 0 || _window$newProjectDas2.call(_window$newProjectDas, taskIds);
|
|
764
|
-
} else if (wasTaskEdit) {
|
|
765
|
-
(_window$newProjectDas3 = window.newProjectDashboard) === null || _window$newProjectDas3 === void 0 || (_window$newProjectDas4 = _window$newProjectDas3.editExistingTaskInDashboard) === null || _window$newProjectDas4 === void 0 || _window$newProjectDas4.call(_window$newProjectDas3, taskIds);
|
|
766
|
-
} else if (wasTaskDelete) {
|
|
767
|
-
(_window$newProjectDas5 = window.newProjectDashboard) === null || _window$newProjectDas5 === void 0 || (_window$newProjectDas6 = _window$newProjectDas5.deleteExistingTaskFromDashboard) === null || _window$newProjectDas6 === void 0 || _window$newProjectDas6.call(_window$newProjectDas5, taskIds);
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
case 4:
|
|
771
|
-
// Refetch del task panel si está abierto y la tool aprobada editó/borró esa tarea.
|
|
772
|
-
// Cubre los dos flujos de approval:
|
|
773
|
-
// 1) Approval por botón → `previousMessage.approval.pending_actions` (vía hasApprovalInPreviousMessage)
|
|
774
|
-
// 2) Manual approval (usuario tipea "si"/"no") → `lastManualApprovalRef.current`
|
|
775
|
-
openTaskPanelId = (_window$taskPanel = window.taskPanel) === null || _window$taskPanel === void 0 ? void 0 : _window$taskPanel.taskId;
|
|
776
|
-
manualApproval = lastManualApprovalRef.current;
|
|
777
|
-
lastManualApprovalRef.current = null; // consumir una sola vez
|
|
778
|
-
manualWasTaskEdit = !!manualApproval && TASK_EDIT_TOOLS.includes(manualApproval.toolName);
|
|
779
|
-
manualWasTaskDelete = !!manualApproval && TASK_DELETE_TOOLS.includes(manualApproval.toolName); // Sync Planner: avisar carga de horas confirmada (create_hour / create_hours).
|
|
780
|
-
hoursToolsFromApproval = pendingActions.map(function (action) {
|
|
781
|
-
return action.tool_name;
|
|
782
|
-
}).filter(function (toolName) {
|
|
783
|
-
return isHoursChargeTool(toolName);
|
|
784
|
-
});
|
|
785
|
-
wasHoursChargeApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && hoursToolsFromApproval.length > 0;
|
|
786
|
-
manualHoursTool = manualApproval === null || manualApproval === void 0 ? void 0 : manualApproval.toolName;
|
|
787
|
-
wasHoursChargeManualApproved = isHoursChargeTool(manualHoursTool);
|
|
788
|
-
if (wasHoursChargeApproved || wasHoursChargeManualApproved) {
|
|
789
|
-
tools = wasHoursChargeApproved ? hoursToolsFromApproval : manualHoursTool ? [manualHoursTool] : [];
|
|
790
|
-
dispatchMaiaHoursCharged({
|
|
791
|
-
source: 'maia',
|
|
792
|
-
tools: tools,
|
|
793
|
-
sessionId: memorySessionId
|
|
794
|
-
});
|
|
795
|
-
}
|
|
796
|
-
if (openTaskPanelId && (wasTaskEdit || wasTaskDelete || manualWasTaskEdit || manualWasTaskDelete)) {
|
|
797
|
-
manualPseudoAction = manualApproval ? {
|
|
798
|
-
tool_name: manualApproval.toolName,
|
|
799
|
-
tool_args: (_manualApproval$toolA = manualApproval.toolArgs) !== null && _manualApproval$toolA !== void 0 ? _manualApproval$toolA : {}
|
|
800
|
-
} : null;
|
|
801
|
-
affectedTaskIds = [].concat(_toConsumableArray(extractTaskIdsFromPendingActionsArgs(pendingActions)), _toConsumableArray(taskIdsFromUrls), _toConsumableArray(taskIdsFromDeleteApproval), _toConsumableArray(manualPseudoAction ? extractTaskIdsFromPendingActionsArgs([manualPseudoAction]) : [])).map(String);
|
|
802
|
-
if (affectedTaskIds.includes(String(openTaskPanelId))) {
|
|
803
|
-
(_window$taskPanel2 = window.taskPanel) === null || _window$taskPanel2 === void 0 || (_window$taskPanel2$re = _window$taskPanel2.refetchTask) === null || _window$taskPanel2$re === void 0 || _window$taskPanel2$re.call(_window$taskPanel2);
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
commitToSession(sessionId, _objectSpread(_objectSpread({
|
|
807
|
-
id: "answer-".concat(memorySessionId),
|
|
808
|
-
message: contentToAdd,
|
|
809
|
-
date: new Date(),
|
|
810
|
-
user: {
|
|
811
|
-
id: 'assistant',
|
|
812
|
-
name: 'Assistant'
|
|
813
|
-
},
|
|
814
|
-
role: ChatHistoryRole.ASSISTANT,
|
|
815
|
-
sources: sources
|
|
816
|
-
}, attachments.length > 0 ? {
|
|
817
|
-
attachments: attachments
|
|
818
|
-
} : {}), {}, {
|
|
819
|
-
memorySessionId: memorySessionId,
|
|
820
|
-
suggestions: suggestions || []
|
|
821
|
-
}, createAgentFollowUp ? {
|
|
822
|
-
createAgentFollowUp: createAgentFollowUp
|
|
823
|
-
} : {}));
|
|
824
|
-
clearSessionTail(sessionId);
|
|
825
|
-
if ((_createAgentFollowUp = createAgentFollowUp) !== null && _createAgentFollowUp !== void 0 && _createAgentFollowUp.agentId) {
|
|
826
|
-
fetchAgentDetail(createAgentFollowUp.agentId).then(function (chatAgent) {
|
|
827
|
-
document.dispatchEvent(new CustomEvent('maia-merge-created-agent-into-list', {
|
|
828
|
-
detail: {
|
|
829
|
-
agent: chatAgent
|
|
830
|
-
}
|
|
831
|
-
}));
|
|
832
|
-
})["catch"](function (err) {
|
|
833
|
-
console.error('[useChatManager] No se pudo añadir el agente recién creado al listado', err);
|
|
834
|
-
});
|
|
835
|
-
}
|
|
836
|
-
if ((_editAgentFollowUp = editAgentFollowUp) !== null && _editAgentFollowUp !== void 0 && _editAgentFollowUp.agentId) {
|
|
837
|
-
fetchAgentDetail(editAgentFollowUp.agentId).then(function (chatAgent) {
|
|
838
|
-
document.dispatchEvent(new CustomEvent('maia-sync-edited-agent-from-chat', {
|
|
839
|
-
detail: {
|
|
840
|
-
agent: chatAgent
|
|
841
|
-
}
|
|
842
|
-
}));
|
|
843
|
-
})["catch"](function (err) {
|
|
844
|
-
console.error('[useChatManager] No se pudo refrescar el agente editado', err);
|
|
845
|
-
});
|
|
846
|
-
}
|
|
847
|
-
isProcessingRef.current = false;
|
|
848
|
-
retrySnapshotRef.current = null;
|
|
849
|
-
_getChatsStoreState = getChatsStoreState(), isChatViewVisible = _getChatsStoreState.isChatViewVisible, markChatAsRead = _getChatsStoreState.markChatAsRead;
|
|
850
|
-
if (!(isActive && isChatViewVisible)) {
|
|
851
|
-
_context.next = 5;
|
|
852
|
-
break;
|
|
853
|
-
}
|
|
854
|
-
_context.next = 5;
|
|
855
|
-
return markChatAsRead(sessionId, {
|
|
856
|
-
force: true
|
|
857
|
-
});
|
|
858
|
-
case 5:
|
|
859
|
-
if (firstTimeRef.current) {
|
|
860
|
-
customEvent = new CustomEvent('refetch-session');
|
|
861
|
-
document.dispatchEvent(customEvent);
|
|
862
|
-
firstTimeRef.current = false;
|
|
863
|
-
}
|
|
864
|
-
case 6:
|
|
865
|
-
case "end":
|
|
866
|
-
return _context.stop();
|
|
867
|
-
}
|
|
868
|
-
}, _callee);
|
|
869
|
-
}));
|
|
870
|
-
return function (_x, _x2, _x3, _x4, _x5, _x6, _x7) {
|
|
871
|
-
return _ref5.apply(this, arguments);
|
|
872
|
-
};
|
|
873
|
-
}(), [commitToSession, dropFromSession, clearSessionTail, project, getTabTaskDefault, event, agent]);
|
|
874
|
-
|
|
875
|
-
// `partialText` lo rescata `stopStream` antes de limpiar el store externo: el texto en vivo
|
|
876
|
-
// no vive en `messages`, así que sin esto la respuesta a medias desaparece de pantalla aunque
|
|
877
|
-
// el backend sí la haya persistido.
|
|
878
|
-
var handleStreamStop = useCallback(function (partialText) {
|
|
879
|
-
// El stop siempre aplica a la sesión activa (botón del input visible).
|
|
880
|
-
var sessionId = currentChatId.current;
|
|
881
|
-
clearStreamUiRef.current();
|
|
882
|
-
var tempMessageId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
883
|
-
sessionStreamingText.clear(sessionId);
|
|
884
|
-
streamingPlaceholderIdRef.current = null;
|
|
885
|
-
activeStreamChatIdRef.current = null;
|
|
886
|
-
dropFromSession(sessionId, tempMessageId);
|
|
887
|
-
if (partialText) {
|
|
888
|
-
commitToSession(sessionId, {
|
|
889
|
-
id: "answer-".concat(currentMessageId.current),
|
|
890
|
-
message: partialText,
|
|
891
|
-
date: new Date(),
|
|
892
|
-
user: {
|
|
893
|
-
id: 'assistant',
|
|
894
|
-
name: 'Assistant'
|
|
895
|
-
},
|
|
896
|
-
role: ChatHistoryRole.ASSISTANT
|
|
897
|
-
});
|
|
898
|
-
}
|
|
899
|
-
commitToSession(sessionId, {
|
|
900
|
-
id: "answer-".concat(currentMessageId.current, "-cancelled"),
|
|
901
|
-
message: t('chat.cancelled'),
|
|
902
|
-
date: new Date(),
|
|
903
|
-
user: {
|
|
904
|
-
id: 'assistant',
|
|
905
|
-
name: 'Assistant'
|
|
906
|
-
},
|
|
907
|
-
role: ChatHistoryRole.ASSISTANT,
|
|
908
|
-
isFrontendCancelled: true
|
|
909
|
-
});
|
|
910
|
-
clearSessionTail(sessionId);
|
|
911
|
-
isProcessingRef.current = false;
|
|
912
|
-
retrySnapshotRef.current = null;
|
|
913
|
-
}, [commitToSession, dropFromSession, clearSessionTail, t]);
|
|
914
|
-
var handleApprovalRequired = useCallback(function (ctx, approval, accumulatedContent) {
|
|
915
|
-
var _approval$pending_act;
|
|
916
|
-
var sessionId = ctx.sessionId,
|
|
917
|
-
placeholderId = ctx.placeholderId;
|
|
918
|
-
var isActive = activeView.is(sessionId);
|
|
919
|
-
sessionStreamingText.clear(sessionId);
|
|
920
|
-
dropFromSession(sessionId, placeholderId);
|
|
921
|
-
retrySnapshotRef.current = null;
|
|
922
|
-
if (isActive) {
|
|
923
|
-
streamingPlaceholderIdRef.current = null;
|
|
924
|
-
activeStreamChatIdRef.current = null;
|
|
925
|
-
}
|
|
926
|
-
var hitlContext = {
|
|
927
|
-
messageId: "approval-".concat(approval.original_thread_id),
|
|
928
|
-
messageText: accumulatedContent || '',
|
|
929
|
-
approval: approval,
|
|
930
|
-
pendingActions: approval.pending_actions,
|
|
931
|
-
threadIds: (_approval$pending_act = approval.pending_actions) === null || _approval$pending_act === void 0 ? void 0 : _approval$pending_act.map(function (action) {
|
|
932
|
-
return action.thread_id;
|
|
933
|
-
})
|
|
934
|
-
};
|
|
935
|
-
if (isActive) {
|
|
936
|
-
hitlExecutionContextRef.current = hitlContext;
|
|
937
|
-
}
|
|
938
|
-
if (approval.manual_approval_detected) {
|
|
939
|
-
var _approval$pending_act2, _ref6, _tool_name, _tool_args;
|
|
940
|
-
trackManualHitlEvents(event, {
|
|
941
|
-
impression: EVENTS.aiChatHitl,
|
|
942
|
-
option: EVENTS.aiChatHitlOption
|
|
943
|
-
}, agent, approval, trackedManualHitlKeysRef.current);
|
|
944
|
-
var firstAction = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2[0];
|
|
945
|
-
var toolName = (_ref6 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref6 !== void 0 ? _ref6 : '';
|
|
946
|
-
var toolArgs = ((_tool_args = approval.tool_args) !== null && _tool_args !== void 0 ? _tool_args : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_args) || null;
|
|
947
|
-
if (toolName) {
|
|
948
|
-
lastManualApprovalRef.current = {
|
|
949
|
-
toolName: toolName,
|
|
950
|
-
toolArgs: toolArgs
|
|
951
|
-
};
|
|
952
|
-
}
|
|
953
|
-
if (isActive) {
|
|
954
|
-
isProcessingRef.current = false;
|
|
955
|
-
}
|
|
956
|
-
return;
|
|
957
|
-
}
|
|
958
|
-
|
|
959
|
-
// Add a message with the approval request
|
|
960
|
-
commitToSession(sessionId, {
|
|
961
|
-
id: "approval-".concat(approval.original_thread_id),
|
|
962
|
-
message: accumulatedContent || '',
|
|
963
|
-
date: new Date(),
|
|
964
|
-
user: {
|
|
965
|
-
id: 'assistant',
|
|
966
|
-
name: 'Assistant'
|
|
967
|
-
},
|
|
968
|
-
role: ChatHistoryRole.ASSISTANT,
|
|
969
|
-
approval: approval,
|
|
970
|
-
approvalStatus: 'pending'
|
|
971
|
-
});
|
|
972
|
-
if (isActive) {
|
|
973
|
-
isProcessingRef.current = false;
|
|
974
|
-
} else {
|
|
975
|
-
getChatsStoreState().markChatAsUnread(sessionId);
|
|
976
|
-
notifySessionFinishedInBackground(sessionId, 'approval_required');
|
|
977
|
-
}
|
|
978
|
-
}, [agent, commitToSession, dropFromSession, event]);
|
|
979
|
-
var _useOrchestratorStrea = useOrchestratorStream({
|
|
980
|
-
activeSessionId: activeSessionId,
|
|
981
|
-
onError: handleStreamError,
|
|
982
|
-
onStreamUpdate: handleStreamUpdate,
|
|
983
|
-
onFinishStream: handleStreamFinish,
|
|
984
|
-
onStop: handleStreamStop,
|
|
985
|
-
onApprovalRequired: handleApprovalRequired,
|
|
986
|
-
hitlExecutionContextRef: hitlExecutionContextRef
|
|
987
|
-
}),
|
|
988
|
-
askMaia = _useOrchestratorStrea.askMaia,
|
|
989
|
-
retryCompletion = _useOrchestratorStrea.retryCompletion,
|
|
990
|
-
waitingResponse = _useOrchestratorStrea.isLoading,
|
|
991
|
-
isWriting = _useOrchestratorStrea.isWriting,
|
|
992
|
-
loadingMessage = _useOrchestratorStrea.loadingMessage,
|
|
993
|
-
streamActivity = _useOrchestratorStrea.streamActivity,
|
|
994
|
-
updateStreamActivity = _useOrchestratorStrea.updateStreamActivity,
|
|
995
|
-
stopStreaming = _useOrchestratorStrea.stopStreaming;
|
|
996
|
-
clearStreamUiRef.current = function () {
|
|
997
|
-
updateStreamActivity(null);
|
|
998
|
-
setActiveLoadings({});
|
|
999
|
-
hitlExecutionContextRef.current = null;
|
|
1000
|
-
};
|
|
1001
|
-
var currentProject = project;
|
|
1002
|
-
var sendMessage = useCallback(/*#__PURE__*/function () {
|
|
1003
|
-
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(message, attachmentsOrOptions, faqId, agentSuggestionId, mentions, fuaId, scId) {
|
|
1004
|
-
var _messagesRef$current;
|
|
1005
|
-
var willStartNewStream, _normalizeSendMessage, attachments, options, effectiveMentions, contextMessage, payloadFuaId, payloadScId, payloadContextData, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, sessionId, _contextRef$current, ctxChipsProject, ctxProject, ctxClient, ctxTask, streamingPlaceholderId, finalMessage, _options$projectChang, _contextRef$current$p, history, lastMessageProjectId, projectToRequest, projects, payloadFaqId, payloadAgentSuggestionId, payloadData;
|
|
1006
|
-
return _regeneratorRuntime.wrap(function (_context2) {
|
|
1007
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
1008
|
-
case 0:
|
|
1009
|
-
if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
|
|
1010
|
-
_context2.next = 1;
|
|
1011
|
-
break;
|
|
1012
|
-
}
|
|
1013
|
-
return _context2.abrupt("return");
|
|
1014
|
-
case 1:
|
|
1015
|
-
// Tope de concurrencia: si esta sesión no está generando y ya hay
|
|
1016
|
-
// MAX_CONCURRENT_STREAMS activas, avisamos y no arrancamos otra.
|
|
1017
|
-
willStartNewStream = !sessionStreamManager.isActive(currentChatId.current);
|
|
1018
|
-
if (!(willStartNewStream && sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
1019
|
-
_context2.next = 2;
|
|
1020
|
-
break;
|
|
1021
|
-
}
|
|
1022
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1023
|
-
detail: {
|
|
1024
|
-
show: true,
|
|
1025
|
-
severity: 'info',
|
|
1026
|
-
message: t('chat.tooManyActiveSessions')
|
|
1027
|
-
}
|
|
1028
|
-
}));
|
|
1029
|
-
return _context2.abrupt("return");
|
|
1030
|
-
case 2:
|
|
1031
|
-
_normalizeSendMessage = normalizeSendMessageArgs(attachmentsOrOptions), attachments = _normalizeSendMessage.attachments, options = _normalizeSendMessage.options; // Las mentions pueden venir vía 5to parámetro (call positional desde el footer)
|
|
1032
|
-
// o vía SendMessageOptions (call programático). El parámetro explícito gana.
|
|
1033
|
-
effectiveMentions = mentions !== null && mentions !== void 0 ? mentions : options.mentions;
|
|
1034
|
-
contextMessage = buildContextMessage(effectiveMentions);
|
|
1035
|
-
payloadFuaId = fuaId !== null && fuaId !== void 0 ? fuaId : options.fuaId;
|
|
1036
|
-
payloadScId = scId !== null && scId !== void 0 ? scId : options.scId;
|
|
1037
|
-
payloadContextData = options.contextData;
|
|
1038
|
-
displayMessage = formatQuickActionMessageForDisplay(message, {
|
|
1039
|
-
fuaId: payloadFuaId,
|
|
1040
|
-
scId: payloadScId
|
|
1041
|
-
});
|
|
1042
|
-
isProcessingRef.current = true;
|
|
1043
|
-
setActiveChatId(currentChatId.current);
|
|
1044
|
-
newMessageId = uuidv4();
|
|
1045
|
-
currentMessageId.current = newMessageId;
|
|
1046
|
-
currentUserQuestion.current = message;
|
|
1047
|
-
if (!reportedEvent.current) {
|
|
1048
|
-
event(EVENTS.pmAiTypedText);
|
|
1049
|
-
reportedEvent.current = true;
|
|
1050
|
-
}
|
|
1051
|
-
|
|
1052
|
-
// Verificar si el contexto global está desactualizado
|
|
1053
|
-
lastMessageWithProject = messagesRef.current.filter(function (msg) {
|
|
1054
|
-
return msg.projectId;
|
|
1055
|
-
}).at(-1);
|
|
1056
|
-
currentAgentFromMessages = (_messagesRef$current = messagesRef.current) === null || _messagesRef$current === void 0 || (_messagesRef$current = _messagesRef$current[messagesRef.current.length - 1]) === null || _messagesRef$current === void 0 ? void 0 : _messagesRef$current.agentId;
|
|
1057
|
-
sessionId = currentChatId.current;
|
|
1058
|
-
_contextRef$current = contextRef.current, ctxChipsProject = _contextRef$current.chipsProject, ctxProject = _contextRef$current.project, ctxClient = _contextRef$current.client, ctxTask = _contextRef$current.task;
|
|
1059
|
-
ensureSessionInSidebar({
|
|
1060
|
-
sessionId: sessionId,
|
|
1061
|
-
title: buildSidebarSessionTitle(displayMessage),
|
|
1062
|
-
agent: agent,
|
|
1063
|
-
agentId: currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id),
|
|
1064
|
-
project: ctxProject,
|
|
1065
|
-
client: ctxClient,
|
|
1066
|
-
attachments: attachments
|
|
1067
|
-
});
|
|
1068
|
-
|
|
1069
|
-
// No agregar projectId al mensaje del usuario - se determinará después
|
|
1070
|
-
commitToSession(sessionId, _objectSpread({
|
|
1071
|
-
id: "question-".concat(currentMessageId.current),
|
|
1072
|
-
message: displayMessage,
|
|
1073
|
-
date: new Date(),
|
|
1074
|
-
user: currentUser,
|
|
1075
|
-
role: ChatHistoryRole.USER,
|
|
1076
|
-
sources: attachments
|
|
1077
|
-
}, contextMessage ? {
|
|
1078
|
-
contextMessage: contextMessage
|
|
1079
|
-
} : {}));
|
|
1080
|
-
currentMessageId.current = uuidv4();
|
|
1081
|
-
streamingPlaceholderId = "answer-".concat(currentMessageId.current, "-streaming");
|
|
1082
|
-
streamingPlaceholderIdRef.current = streamingPlaceholderId;
|
|
1083
|
-
activeStreamChatIdRef.current = sessionId;
|
|
1084
|
-
sessionStreamingText.start(sessionId, streamingPlaceholderId);
|
|
1085
|
-
commitToSession(sessionId, {
|
|
1086
|
-
id: streamingPlaceholderId,
|
|
1087
|
-
message: '',
|
|
1088
|
-
date: new Date(),
|
|
1089
|
-
user: {
|
|
1090
|
-
id: 'assistant',
|
|
1091
|
-
name: (agent === null || agent === void 0 ? void 0 : agent.name) || 'Assistant'
|
|
1092
|
-
},
|
|
1093
|
-
role: ChatHistoryRole.ASSISTANT
|
|
1094
|
-
});
|
|
1095
|
-
finalMessage = message;
|
|
1096
|
-
if (message === t('qa.items.rentabilidad_proyecto')) {
|
|
1097
|
-
finalMessage = "FAQ: ".concat(t('qa.items.rentabilidad_proyecto'), " - Tipo de rentabilidad: ").concat(((_options$projectChang = options.projectChanged) === null || _options$projectChang === void 0 ? void 0 : _options$projectChang.incomeType) || ((_contextRef$current$p = contextRef.current.project) === null || _contextRef$current$p === void 0 ? void 0 : _contextRef$current$p.incomeType));
|
|
1098
|
-
}
|
|
1099
|
-
history = messagesRef.current.map(function (historyMessage) {
|
|
1100
|
-
return {
|
|
1101
|
-
content: historyMessage.message,
|
|
1102
|
-
role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
1103
|
-
};
|
|
1104
|
-
});
|
|
1105
|
-
lastMessageProjectId = lastMessageWithProject === null || lastMessageWithProject === void 0 ? void 0 : lastMessageWithProject.projectId;
|
|
1106
|
-
projectToRequest = resolveProjectToRequest(ctxChipsProject, lastMessageProjectId);
|
|
1107
|
-
_context2.next = 3;
|
|
1108
|
-
return fetchProjects([projectToRequest]);
|
|
1109
|
-
case 3:
|
|
1110
|
-
projects = _context2.sent;
|
|
1111
|
-
payloadFaqId = faqId !== null && faqId !== void 0 ? faqId : options.faqId;
|
|
1112
|
-
payloadAgentSuggestionId = agentSuggestionId !== null && agentSuggestionId !== void 0 ? agentSuggestionId : options.agentSuggestionId;
|
|
1113
|
-
payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1114
|
-
message: finalMessage,
|
|
1115
|
-
history: history,
|
|
1116
|
-
projectId: projectToRequest,
|
|
1117
|
-
lang: authUser.lang,
|
|
1118
|
-
userId: authUser.id.toString(),
|
|
1119
|
-
firstName: authUser.firstName,
|
|
1120
|
-
lastName: authUser.lastName,
|
|
1121
|
-
companyId: authUser.company_id.toString(),
|
|
1122
|
-
chatId: currentChatId.current,
|
|
1123
|
-
messageId: currentMessageId.current,
|
|
1124
|
-
agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || '',
|
|
1125
|
-
agentId: currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id),
|
|
1126
|
-
isWebSearchActive: isWebSearchActiveRef.current,
|
|
1127
|
-
isDeepSearchActive: isDeepSearchActiveRef.current
|
|
1128
|
-
}, (ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.feeId) != null ? {
|
|
1129
|
-
feeId: Number(ctxProject.feeId)
|
|
1130
|
-
} : {}), resolveClientPayload(ctxClient, ctxProject)), projects !== null && projects !== void 0 && projects.length ? {
|
|
1131
|
-
projectName: projects[0].name
|
|
1132
|
-
} : {}), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? _objectSpread({
|
|
1133
|
-
taskId: Number(ctxTask.id)
|
|
1134
|
-
}, ctxTask.name ? {
|
|
1135
|
-
taskName: ctxTask.name
|
|
1136
|
-
} : {}) : {}), attachments.length > 0 ? {
|
|
1137
|
-
attachments: attachments
|
|
1138
|
-
} : {}), payloadFaqId ? {
|
|
1139
|
-
faqId: payloadFaqId
|
|
1140
|
-
} : {}), payloadAgentSuggestionId ? {
|
|
1141
|
-
agentSuggestionId: payloadAgentSuggestionId
|
|
1142
|
-
} : {}), payloadFuaId ? {
|
|
1143
|
-
fuaId: payloadFuaId
|
|
1144
|
-
} : {}), payloadScId ? {
|
|
1145
|
-
scId: payloadScId
|
|
1146
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
|
|
1147
|
-
agentEntity: agent.entity
|
|
1148
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1149
|
-
agentType: agent.type
|
|
1150
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1151
|
-
agentEmoji: agent.emoji
|
|
1152
|
-
} : {}), contextMessage ? {
|
|
1153
|
-
contextMessage: contextMessage
|
|
1154
|
-
} : {}), payloadContextData ? {
|
|
1155
|
-
contextData: payloadContextData
|
|
1156
|
-
} : {});
|
|
1157
|
-
askMaia(payloadData);
|
|
1158
|
-
case 4:
|
|
1159
|
-
case "end":
|
|
1160
|
-
return _context2.stop();
|
|
1161
|
-
}
|
|
1162
|
-
}, _callee2);
|
|
1163
|
-
}));
|
|
1164
|
-
return function (_x8, _x9, _x0, _x1, _x10, _x11, _x12) {
|
|
1165
|
-
return _ref7.apply(this, arguments);
|
|
1166
|
-
};
|
|
1167
|
-
}(), [addMessage, commitToSession, event, askMaia, project, client, task, chipsProject, authUser, agent, t, waitingResponse, loadingMessages, isWebSearchActive, isDeepSearchActive]);
|
|
1168
|
-
var changeProject = useCallback(function (option) {
|
|
1169
|
-
if (!currentUserQuestion.current) return;
|
|
1170
|
-
if (option.id !== (project === null || project === void 0 ? void 0 : project.id)) {
|
|
1171
|
-
setProject(option);
|
|
1172
|
-
}
|
|
1173
|
-
if (project && currentUserQuestion.current) {
|
|
1174
|
-
var history = messagesRef.current.map(function (historyMessage) {
|
|
1175
|
-
return {
|
|
1176
|
-
content: historyMessage.message,
|
|
1177
|
-
role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
1178
|
-
};
|
|
1179
|
-
});
|
|
1180
|
-
askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1181
|
-
message: currentUserQuestion.current,
|
|
1182
|
-
history: history,
|
|
1183
|
-
projectId: option.id,
|
|
1184
|
-
lang: authUser.lang,
|
|
1185
|
-
userId: authUser.id.toString(),
|
|
1186
|
-
firstName: authUser.firstName,
|
|
1187
|
-
lastName: authUser.lastName,
|
|
1188
|
-
companyId: authUser.company_id.toString(),
|
|
1189
|
-
chatId: currentChatId.current,
|
|
1190
|
-
messageId: currentMessageId.current,
|
|
1191
|
-
agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || '',
|
|
1192
|
-
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1193
|
-
isWebSearchActive: isWebSearchActiveRef.current,
|
|
1194
|
-
isDeepSearchActive: isDeepSearchActiveRef.current
|
|
1195
|
-
}, (option === null || option === void 0 ? void 0 : option.feeId) != null ? {
|
|
1196
|
-
feeId: Number(option.feeId)
|
|
1197
|
-
} : {}), (option === null || option === void 0 ? void 0 : option.clientId) != null ? {
|
|
1198
|
-
clientId: Number(option.clientId)
|
|
1199
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
|
|
1200
|
-
agentEntity: agent.entity
|
|
1201
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1202
|
-
agentType: agent.type
|
|
1203
|
-
} : {}));
|
|
1204
|
-
}
|
|
1205
|
-
}, [project, setProject, askMaia, authUser, isWebSearchActive, agent]);
|
|
1206
|
-
var retryMessage = useCallback(/*#__PURE__*/function () {
|
|
1207
|
-
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(message) {
|
|
1208
|
-
var _userMessage$message, _userMessage$attachme, _userMessage$sources, _message$memorySessio, _truncated$at;
|
|
1209
|
-
var sessionId, previousMessages, userMessage, turnId, useOrchestratorFallback, truncated, newMessageId, streamingPlaceholderId, placeholder, nextMessages, _contextRef$current2, ctxChipsProject, ctxProject, ctxClient, ctxTask, lastMessageWithProject, projectToRequest, currentAgentFromMessages, attachments, replayViaOrchestrator, result;
|
|
1210
|
-
return _regeneratorRuntime.wrap(function (_context4) {
|
|
1211
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
1212
|
-
case 0:
|
|
1213
|
-
if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
|
|
1214
|
-
_context4.next = 1;
|
|
1215
|
-
break;
|
|
1216
|
-
}
|
|
1217
|
-
return _context4.abrupt("return");
|
|
1218
|
-
case 1:
|
|
1219
|
-
sessionId = currentChatId.current;
|
|
1220
|
-
if (!sessionStreamManager.isActive(sessionId)) {
|
|
1221
|
-
_context4.next = 2;
|
|
1222
|
-
break;
|
|
1223
|
-
}
|
|
1224
|
-
return _context4.abrupt("return");
|
|
1225
|
-
case 2:
|
|
1226
|
-
if (!(sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
1227
|
-
_context4.next = 3;
|
|
1228
|
-
break;
|
|
1229
|
-
}
|
|
1230
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1231
|
-
detail: {
|
|
1232
|
-
show: true,
|
|
1233
|
-
severity: 'info',
|
|
1234
|
-
message: t('chat.tooManyActiveSessions')
|
|
1235
|
-
}
|
|
1236
|
-
}));
|
|
1237
|
-
return _context4.abrupt("return");
|
|
1238
|
-
case 3:
|
|
1239
|
-
previousMessages = messagesRef.current;
|
|
1240
|
-
if (previousMessages.some(function (item) {
|
|
1241
|
-
return item.id === message.id;
|
|
1242
|
-
})) {
|
|
1243
|
-
_context4.next = 4;
|
|
1244
|
-
break;
|
|
1245
|
-
}
|
|
1246
|
-
return _context4.abrupt("return");
|
|
1247
|
-
case 4:
|
|
1248
|
-
userMessage = findUserMessageForRetry(previousMessages, message);
|
|
1249
|
-
if (!(!(userMessage !== null && userMessage !== void 0 && (_userMessage$message = userMessage.message) !== null && _userMessage$message !== void 0 && _userMessage$message.trim()) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$attachme = userMessage.attachments) !== null && _userMessage$attachme !== void 0 && _userMessage$attachme.length) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$sources = userMessage.sources) !== null && _userMessage$sources !== void 0 && _userMessage$sources.length))) {
|
|
1250
|
-
_context4.next = 5;
|
|
1251
|
-
break;
|
|
1252
|
-
}
|
|
1253
|
-
return _context4.abrupt("return");
|
|
1254
|
-
case 5:
|
|
1255
|
-
turnId = resolveRetryTurnId(message);
|
|
1256
|
-
useOrchestratorFallback = message.isFrontendCancelled && !((_message$memorySessio = message.memorySessionId) !== null && _message$memorySessio !== void 0 && _message$memorySessio.trim());
|
|
1257
|
-
if (!(!turnId && !useOrchestratorFallback)) {
|
|
1258
|
-
_context4.next = 6;
|
|
1259
|
-
break;
|
|
1260
|
-
}
|
|
1261
|
-
return _context4.abrupt("return");
|
|
1262
|
-
case 6:
|
|
1263
|
-
truncated = messagesWithoutRetriedTurn(previousMessages, message);
|
|
1264
|
-
isProcessingRef.current = true;
|
|
1265
|
-
retrySnapshotRef.current = previousMessages;
|
|
1266
|
-
setActiveChatId(sessionId);
|
|
1267
|
-
newMessageId = uuidv4();
|
|
1268
|
-
currentMessageId.current = newMessageId;
|
|
1269
|
-
currentUserQuestion.current = userMessage.message;
|
|
1270
|
-
streamingPlaceholderId = "answer-".concat(newMessageId, "-streaming");
|
|
1271
|
-
streamingPlaceholderIdRef.current = streamingPlaceholderId;
|
|
1272
|
-
activeStreamChatIdRef.current = sessionId;
|
|
1273
|
-
placeholder = {
|
|
1274
|
-
id: streamingPlaceholderId,
|
|
1275
|
-
message: '',
|
|
1276
|
-
date: new Date(),
|
|
1277
|
-
user: {
|
|
1278
|
-
id: 'assistant',
|
|
1279
|
-
name: (agent === null || agent === void 0 ? void 0 : agent.name) || 'Assistant'
|
|
1280
|
-
},
|
|
1281
|
-
role: ChatHistoryRole.ASSISTANT
|
|
1282
|
-
};
|
|
1283
|
-
nextMessages = [].concat(_toConsumableArray(truncated), [placeholder]);
|
|
1284
|
-
messagesRef.current = nextMessages;
|
|
1285
|
-
replaceMessages(nextMessages);
|
|
1286
|
-
sessionStreamingText.start(sessionId, streamingPlaceholderId);
|
|
1287
|
-
_contextRef$current2 = contextRef.current, ctxChipsProject = _contextRef$current2.chipsProject, ctxProject = _contextRef$current2.project, ctxClient = _contextRef$current2.client, ctxTask = _contextRef$current2.task;
|
|
1288
|
-
lastMessageWithProject = truncated.filter(function (msg) {
|
|
1289
|
-
return msg.projectId;
|
|
1290
|
-
}).at(-1);
|
|
1291
|
-
projectToRequest = resolveProjectToRequest(ctxChipsProject, lastMessageWithProject === null || lastMessageWithProject === void 0 ? void 0 : lastMessageWithProject.projectId);
|
|
1292
|
-
currentAgentFromMessages = ((_truncated$at = truncated.at(-1)) === null || _truncated$at === void 0 ? void 0 : _truncated$at.agentId) || message.agentId;
|
|
1293
|
-
attachments = Array.isArray(userMessage.attachments) ? userMessage.attachments : Array.isArray(userMessage.sources) ? userMessage.sources : [];
|
|
1294
|
-
replayViaOrchestrator = /*#__PURE__*/function () {
|
|
1295
|
-
var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
1296
|
-
var history, projects, result, _t;
|
|
1297
|
-
return _regeneratorRuntime.wrap(function (_context3) {
|
|
1298
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
1299
|
-
case 0:
|
|
1300
|
-
history = truncated.map(function (historyMessage) {
|
|
1301
|
-
return {
|
|
1302
|
-
content: historyMessage.message,
|
|
1303
|
-
role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
1304
|
-
};
|
|
1305
|
-
});
|
|
1306
|
-
if (!projectToRequest) {
|
|
1307
|
-
_context3.next = 2;
|
|
1308
|
-
break;
|
|
1309
|
-
}
|
|
1310
|
-
_context3.next = 1;
|
|
1311
|
-
return fetchProjects([projectToRequest]);
|
|
1312
|
-
case 1:
|
|
1313
|
-
_t = _context3.sent;
|
|
1314
|
-
_context3.next = 3;
|
|
1315
|
-
break;
|
|
1316
|
-
case 2:
|
|
1317
|
-
_t = null;
|
|
1318
|
-
case 3:
|
|
1319
|
-
projects = _t;
|
|
1320
|
-
_context3.next = 4;
|
|
1321
|
-
return askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1322
|
-
message: userMessage.message,
|
|
1323
|
-
history: history,
|
|
1324
|
-
projectId: projectToRequest,
|
|
1325
|
-
lang: authUser.lang,
|
|
1326
|
-
userId: authUser.id.toString(),
|
|
1327
|
-
firstName: authUser.firstName,
|
|
1328
|
-
lastName: authUser.lastName,
|
|
1329
|
-
companyId: authUser.company_id.toString(),
|
|
1330
|
-
chatId: sessionId,
|
|
1331
|
-
messageId: newMessageId,
|
|
1332
|
-
agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || '',
|
|
1333
|
-
agentId: String(currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id) || ''),
|
|
1334
|
-
isWebSearchActive: isWebSearchActiveRef.current,
|
|
1335
|
-
isDeepSearchActive: isDeepSearchActiveRef.current
|
|
1336
|
-
}, (ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.feeId) != null ? {
|
|
1337
|
-
feeId: Number(ctxProject.feeId)
|
|
1338
|
-
} : {}), resolveClientPayload(ctxClient, ctxProject)), projects !== null && projects !== void 0 && projects.length ? {
|
|
1339
|
-
projectName: projects[0].name
|
|
1340
|
-
} : {}), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? _objectSpread({
|
|
1341
|
-
taskId: Number(ctxTask.id)
|
|
1342
|
-
}, ctxTask.name ? {
|
|
1343
|
-
taskName: ctxTask.name
|
|
1344
|
-
} : {}) : {}), attachments.length > 0 ? {
|
|
1345
|
-
attachments: attachments
|
|
1346
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
|
|
1347
|
-
agentEntity: agent.entity
|
|
1348
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1349
|
-
agentType: agent.type
|
|
1350
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1351
|
-
agentEmoji: agent.emoji
|
|
1352
|
-
} : {}), userMessage.contextMessage ? {
|
|
1353
|
-
contextMessage: userMessage.contextMessage
|
|
1354
|
-
} : {}));
|
|
1355
|
-
case 4:
|
|
1356
|
-
result = _context3.sent;
|
|
1357
|
-
if (!result.started) {
|
|
1358
|
-
retrySnapshotRef.current = null;
|
|
1359
|
-
messagesRef.current = previousMessages;
|
|
1360
|
-
replaceMessages(previousMessages);
|
|
1361
|
-
sessionStreamingText.clear(sessionId);
|
|
1362
|
-
streamingPlaceholderIdRef.current = null;
|
|
1363
|
-
activeStreamChatIdRef.current = null;
|
|
1364
|
-
isProcessingRef.current = false;
|
|
1365
|
-
if (result.reason === 'limit') {
|
|
1366
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1367
|
-
detail: {
|
|
1368
|
-
show: true,
|
|
1369
|
-
severity: 'info',
|
|
1370
|
-
message: t('chat.tooManyActiveSessions')
|
|
1371
|
-
}
|
|
1372
|
-
}));
|
|
1373
|
-
}
|
|
1374
|
-
}
|
|
1375
|
-
case 5:
|
|
1376
|
-
case "end":
|
|
1377
|
-
return _context3.stop();
|
|
1378
|
-
}
|
|
1379
|
-
}, _callee3);
|
|
1380
|
-
}));
|
|
1381
|
-
return function replayViaOrchestrator() {
|
|
1382
|
-
return _ref9.apply(this, arguments);
|
|
1383
|
-
};
|
|
1384
|
-
}();
|
|
1385
|
-
if (!(useOrchestratorFallback || !turnId)) {
|
|
1386
|
-
_context4.next = 8;
|
|
1387
|
-
break;
|
|
1388
|
-
}
|
|
1389
|
-
_context4.next = 7;
|
|
1390
|
-
return replayViaOrchestrator();
|
|
1391
|
-
case 7:
|
|
1392
|
-
return _context4.abrupt("return");
|
|
1393
|
-
case 8:
|
|
1394
|
-
_context4.next = 9;
|
|
1395
|
-
return retryCompletion(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1396
|
-
chatId: sessionId,
|
|
1397
|
-
messageId: newMessageId,
|
|
1398
|
-
memorySessionId: turnId,
|
|
1399
|
-
lang: authUser.lang,
|
|
1400
|
-
agentId: String(currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id) || ''),
|
|
1401
|
-
agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || ''
|
|
1402
|
-
}, (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1403
|
-
agentType: agent.type
|
|
1404
|
-
} : {}), {}, {
|
|
1405
|
-
isWebSearchActive: isWebSearchActiveRef.current,
|
|
1406
|
-
isDeepSearchActive: isDeepSearchActiveRef.current
|
|
1407
|
-
}, projectToRequest ? {
|
|
1408
|
-
projectId: projectToRequest
|
|
1409
|
-
} : {}), resolveClientPayload(ctxClient, ctxProject)), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? {
|
|
1410
|
-
taskId: Number(ctxTask.id)
|
|
1411
|
-
} : {}));
|
|
1412
|
-
case 9:
|
|
1413
|
-
result = _context4.sent;
|
|
1414
|
-
if (!result.started) {
|
|
1415
|
-
_context4.next = 10;
|
|
1416
|
-
break;
|
|
1417
|
-
}
|
|
1418
|
-
return _context4.abrupt("return");
|
|
1419
|
-
case 10:
|
|
1420
|
-
if (!(result.reason === 'turn_not_found')) {
|
|
1421
|
-
_context4.next = 12;
|
|
1422
|
-
break;
|
|
1423
|
-
}
|
|
1424
|
-
_context4.next = 11;
|
|
1425
|
-
return replayViaOrchestrator();
|
|
1426
|
-
case 11:
|
|
1427
|
-
return _context4.abrupt("return");
|
|
1428
|
-
case 12:
|
|
1429
|
-
retrySnapshotRef.current = null;
|
|
1430
|
-
messagesRef.current = previousMessages;
|
|
1431
|
-
replaceMessages(previousMessages);
|
|
1432
|
-
sessionStreamingText.clear(sessionId);
|
|
1433
|
-
streamingPlaceholderIdRef.current = null;
|
|
1434
|
-
activeStreamChatIdRef.current = null;
|
|
1435
|
-
isProcessingRef.current = false;
|
|
1436
|
-
if (result.reason === 'limit') {
|
|
1437
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1438
|
-
detail: {
|
|
1439
|
-
show: true,
|
|
1440
|
-
severity: 'info',
|
|
1441
|
-
message: t('chat.tooManyActiveSessions')
|
|
1442
|
-
}
|
|
1443
|
-
}));
|
|
1444
|
-
}
|
|
1445
|
-
case 13:
|
|
1446
|
-
case "end":
|
|
1447
|
-
return _context4.stop();
|
|
1448
|
-
}
|
|
1449
|
-
}, _callee4);
|
|
1450
|
-
}));
|
|
1451
|
-
return function (_x13) {
|
|
1452
|
-
return _ref8.apply(this, arguments);
|
|
1453
|
-
};
|
|
1454
|
-
}(), [waitingResponse, loadingMessages, replaceMessages, retryCompletion, askMaia, fetchProjects, authUser, agent, t, setActiveChatId]);
|
|
1455
|
-
var handleFeedback = useCallback(/*#__PURE__*/function () {
|
|
1456
|
-
var _ref0 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(feedbackProp, chatMessageId) {
|
|
1457
|
-
var response;
|
|
1458
|
-
return _regeneratorRuntime.wrap(function (_context5) {
|
|
1459
|
-
while (1) switch (_context5.prev = _context5.next) {
|
|
1460
|
-
case 0:
|
|
1461
|
-
_context5.next = 1;
|
|
1462
|
-
return maia.Chats.wasHelpfulChat(chatMessageId, feedbackProp === Feedback.THUMBS_UP);
|
|
1463
|
-
case 1:
|
|
1464
|
-
response = _context5.sent;
|
|
1465
|
-
if (response) {
|
|
1466
|
-
messagesRef.current = messagesRef.current.map(function (message) {
|
|
1467
|
-
if (message.id === chatMessageId && message.role === 'assistant') {
|
|
1468
|
-
return _objectSpread(_objectSpread({}, message), {}, {
|
|
1469
|
-
wasHelpful: feedbackProp === Feedback.THUMBS_UP
|
|
1470
|
-
});
|
|
1471
|
-
}
|
|
1472
|
-
return message;
|
|
1473
|
-
});
|
|
1474
|
-
}
|
|
1475
|
-
case 2:
|
|
1476
|
-
case "end":
|
|
1477
|
-
return _context5.stop();
|
|
1478
|
-
}
|
|
1479
|
-
}, _callee5);
|
|
1480
|
-
}));
|
|
1481
|
-
return function (_x14, _x15) {
|
|
1482
|
-
return _ref0.apply(this, arguments);
|
|
1483
|
-
};
|
|
1484
|
-
}(), []);
|
|
1485
|
-
var handleApprovalDecision = useCallback(/*#__PURE__*/function () {
|
|
1486
|
-
var _ref1 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(threadIds, decision, editedActions) {
|
|
1487
|
-
var found, messageWithApproval, foundSessionId, approval, sessionId, messageId, newStatus, hitlContext, isActiveSession, streamMessageId, hitlCtx, releaseActiveProcessing, result;
|
|
1488
|
-
return _regeneratorRuntime.wrap(function (_context6) {
|
|
1489
|
-
while (1) switch (_context6.prev = _context6.next) {
|
|
1490
|
-
case 0:
|
|
1491
|
-
if (threadIds !== null && threadIds !== void 0 && threadIds.length) {
|
|
1492
|
-
_context6.next = 1;
|
|
1493
|
-
break;
|
|
1494
|
-
}
|
|
1495
|
-
console.error('No thread_ids provided for approval decision');
|
|
1496
|
-
return _context6.abrupt("return");
|
|
1497
|
-
case 1:
|
|
1498
|
-
found = findMessageWithApprovalByThreadIds(threadIds, messagesRef.current);
|
|
1499
|
-
if (found !== null && found !== void 0 && found.message.approval) {
|
|
1500
|
-
_context6.next = 2;
|
|
1501
|
-
break;
|
|
1502
|
-
}
|
|
1503
|
-
console.error('No se encontró mensaje con approval para thread_ids:', threadIds);
|
|
1504
|
-
return _context6.abrupt("return");
|
|
1505
|
-
case 2:
|
|
1506
|
-
messageWithApproval = found.message, foundSessionId = found.sessionId;
|
|
1507
|
-
approval = messageWithApproval.approval;
|
|
1508
|
-
if (approval) {
|
|
1509
|
-
_context6.next = 3;
|
|
1510
|
-
break;
|
|
1511
|
-
}
|
|
1512
|
-
return _context6.abrupt("return");
|
|
1513
|
-
case 3:
|
|
1514
|
-
sessionId = approval.session_id || foundSessionId;
|
|
1515
|
-
if (sessionId) {
|
|
1516
|
-
_context6.next = 4;
|
|
1517
|
-
break;
|
|
1518
|
-
}
|
|
1519
|
-
console.error('No session_id disponible para approval:', threadIds);
|
|
1520
|
-
return _context6.abrupt("return");
|
|
1521
|
-
case 4:
|
|
1522
|
-
if (!sessionStreamManager.isActive(sessionId)) {
|
|
1523
|
-
_context6.next = 5;
|
|
1524
|
-
break;
|
|
1525
|
-
}
|
|
1526
|
-
return _context6.abrupt("return");
|
|
1527
|
-
case 5:
|
|
1528
|
-
if (!(sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
1529
|
-
_context6.next = 6;
|
|
1530
|
-
break;
|
|
1531
|
-
}
|
|
1532
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1533
|
-
detail: {
|
|
1534
|
-
show: true,
|
|
1535
|
-
severity: 'info',
|
|
1536
|
-
message: t('chat.tooManyActiveSessions')
|
|
1537
|
-
}
|
|
1538
|
-
}));
|
|
1539
|
-
return _context6.abrupt("return");
|
|
1540
|
-
case 6:
|
|
1541
|
-
messageId = messageWithApproval.id;
|
|
1542
|
-
newStatus = decision === 'approve' ? 'approved' : 'rejected';
|
|
1543
|
-
hitlContext = {
|
|
1544
|
-
messageId: messageId,
|
|
1545
|
-
messageText: messageWithApproval.message,
|
|
1546
|
-
approval: approval,
|
|
1547
|
-
pendingActions: approval.pending_actions,
|
|
1548
|
-
threadIds: threadIds
|
|
1549
|
-
};
|
|
1550
|
-
isActiveSession = activeView.is(sessionId);
|
|
1551
|
-
if (isActiveSession) {
|
|
1552
|
-
hitlExecutionContextRef.current = hitlContext;
|
|
1553
|
-
isProcessingRef.current = true;
|
|
1554
|
-
}
|
|
1555
|
-
commitToSession(sessionId, _objectSpread(_objectSpread({}, messageWithApproval), {}, {
|
|
1556
|
-
approvalStatus: newStatus
|
|
1557
|
-
}));
|
|
1558
|
-
streamMessageId = uuidv4();
|
|
1559
|
-
if (isActiveSession) {
|
|
1560
|
-
currentMessageId.current = streamMessageId;
|
|
1561
|
-
}
|
|
1562
|
-
hitlCtx = {
|
|
1563
|
-
sessionId: sessionId,
|
|
1564
|
-
messageId: streamMessageId,
|
|
1565
|
-
placeholderId: "answer-".concat(streamMessageId, "-streaming")
|
|
1566
|
-
};
|
|
1567
|
-
releaseActiveProcessing = function releaseActiveProcessing() {
|
|
1568
|
-
if (!isActiveSession) return;
|
|
1569
|
-
isProcessingRef.current = false;
|
|
1570
|
-
hitlExecutionContextRef.current = null;
|
|
1571
|
-
};
|
|
1572
|
-
_context6.next = 7;
|
|
1573
|
-
return sessionStreamManager.startContinueStream({
|
|
1574
|
-
sessionId: sessionId,
|
|
1575
|
-
placeholderId: hitlCtx.placeholderId,
|
|
1576
|
-
continueRequest: {
|
|
1577
|
-
threadIds: threadIds,
|
|
1578
|
-
sessionId: approval.session_id,
|
|
1579
|
-
decision: editedActions ? 'edit' : decision,
|
|
1580
|
-
editedActions: editedActions,
|
|
1581
|
-
agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
|
|
1582
|
-
lang: authUser.lang
|
|
1583
|
-
},
|
|
1584
|
-
t: t,
|
|
1585
|
-
hitlExecutionContext: hitlContext,
|
|
1586
|
-
agentId: agent === null || agent === void 0 ? void 0 : agent.id,
|
|
1587
|
-
agentName: agent === null || agent === void 0 ? void 0 : agent.name,
|
|
1588
|
-
callbacks: {
|
|
1589
|
-
onStreamUpdate: function onStreamUpdate(content) {
|
|
1590
|
-
return handleStreamUpdate(hitlCtx, content);
|
|
1591
|
-
},
|
|
1592
|
-
onFinishStream: function onFinishStream(finishPayload) {
|
|
1593
|
-
releaseActiveProcessing();
|
|
1594
|
-
handleStreamFinish(hitlCtx, finishPayload.content, finishPayload.sources, finishPayload.memorySessionId, finishPayload.attachments, finishPayload.suggestions, finishPayload.completedAgentId);
|
|
1595
|
-
},
|
|
1596
|
-
onError: function onError() {
|
|
1597
|
-
releaseActiveProcessing();
|
|
1598
|
-
handleStreamError(hitlCtx);
|
|
1599
|
-
},
|
|
1600
|
-
onApprovalRequired: function onApprovalRequired(approvalPayload, accumulatedContent) {
|
|
1601
|
-
releaseActiveProcessing();
|
|
1602
|
-
handleApprovalRequired(hitlCtx, approvalPayload, accumulatedContent);
|
|
1603
|
-
}
|
|
1604
|
-
}
|
|
1605
|
-
});
|
|
1606
|
-
case 7:
|
|
1607
|
-
result = _context6.sent;
|
|
1608
|
-
if (!result.started) {
|
|
1609
|
-
releaseActiveProcessing();
|
|
1610
|
-
if (result.reason === 'limit') {
|
|
1611
|
-
document.dispatchEvent(new CustomEvent('snackbar-event', {
|
|
1612
|
-
detail: {
|
|
1613
|
-
show: true,
|
|
1614
|
-
severity: 'info',
|
|
1615
|
-
message: t('chat.tooManyActiveSessions')
|
|
1616
|
-
}
|
|
1617
|
-
}));
|
|
1618
|
-
}
|
|
1619
|
-
}
|
|
1620
|
-
case 8:
|
|
1621
|
-
case "end":
|
|
1622
|
-
return _context6.stop();
|
|
1623
|
-
}
|
|
1624
|
-
}, _callee6);
|
|
1625
|
-
}));
|
|
1626
|
-
return function (_x16, _x17, _x18) {
|
|
1627
|
-
return _ref1.apply(this, arguments);
|
|
1628
|
-
};
|
|
1629
|
-
}(), [authUser, agent, commitToSession, handleStreamError, handleStreamUpdate, handleStreamFinish, handleApprovalRequired, t]);
|
|
1630
|
-
var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
|
|
1631
|
-
var _userInitialMessage$m, _userInitialMessage$a, _ref11, _resolveProjectToRequ, _ctxProject$id, _ctxClient$id, _ctxTask$id, _ctxChipsProject$proj, hasInitialMessage, hasInitialAttachments, hasInitialFaq, hasInitialFua, hasInitialSc, history, _contextRef$current3, ctxChipsProject, ctxProject, ctxClient, ctxTask, projectToRequest, initialDisplayMessage;
|
|
1632
|
-
return _regeneratorRuntime.wrap(function (_context7) {
|
|
1633
|
-
while (1) switch (_context7.prev = _context7.next) {
|
|
1634
|
-
case 0:
|
|
1635
|
-
if (!firstTimeRef.current) {
|
|
1636
|
-
firstTimeRef.current = true;
|
|
1637
|
-
}
|
|
1638
|
-
if (!initialChatId) {
|
|
1639
|
-
_context7.next = 2;
|
|
1640
|
-
break;
|
|
1641
|
-
}
|
|
1642
|
-
_context7.next = 1;
|
|
1643
|
-
return loadMessages();
|
|
1644
|
-
case 1:
|
|
1645
|
-
_context7.next = 4;
|
|
1646
|
-
break;
|
|
1647
|
-
case 2:
|
|
1648
|
-
if (!userInitialMessage) {
|
|
1649
|
-
_context7.next = 4;
|
|
1650
|
-
break;
|
|
1651
|
-
}
|
|
1652
|
-
hasInitialMessage = Boolean((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim());
|
|
1653
|
-
hasInitialAttachments = Boolean((_userInitialMessage$a = userInitialMessage.attachments) === null || _userInitialMessage$a === void 0 ? void 0 : _userInitialMessage$a.length);
|
|
1654
|
-
hasInitialFaq = Boolean(userInitialMessage.faqId);
|
|
1655
|
-
hasInitialFua = Boolean(userInitialMessage.fuaId);
|
|
1656
|
-
hasInitialSc = Boolean(userInitialMessage.scId);
|
|
1657
|
-
if (!(!hasInitialMessage && !hasInitialAttachments && !hasInitialFaq && !hasInitialFua && !hasInitialSc)) {
|
|
1658
|
-
_context7.next = 3;
|
|
1659
|
-
break;
|
|
1660
|
-
}
|
|
1661
|
-
return _context7.abrupt("return");
|
|
1662
|
-
case 3:
|
|
1663
|
-
history = messagesRef.current.map(function (historyMessage) {
|
|
1664
|
-
return {
|
|
1665
|
-
content: historyMessage.message,
|
|
1666
|
-
role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
|
|
1667
|
-
};
|
|
1668
|
-
});
|
|
1669
|
-
_contextRef$current3 = contextRef.current, ctxChipsProject = _contextRef$current3.chipsProject, ctxProject = _contextRef$current3.project, ctxClient = _contextRef$current3.client, ctxTask = _contextRef$current3.task;
|
|
1670
|
-
projectToRequest = (_ref11 = (_resolveProjectToRequ = resolveProjectToRequest(ctxChipsProject, null)) !== null && _resolveProjectToRequ !== void 0 ? _resolveProjectToRequ : ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ref11 !== void 0 ? _ref11 : null;
|
|
1671
|
-
console.info('[useChatManager] PATH=initializeChat/userInitialMessage — contextRef resolution:', {
|
|
1672
|
-
projectPropId: (_ctxProject$id = ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ctxProject$id !== void 0 ? _ctxProject$id : null,
|
|
1673
|
-
clientId: (_ctxClient$id = ctxClient === null || ctxClient === void 0 ? void 0 : ctxClient.id) !== null && _ctxClient$id !== void 0 ? _ctxClient$id : null,
|
|
1674
|
-
taskId: (_ctxTask$id = ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) !== null && _ctxTask$id !== void 0 ? _ctxTask$id : null,
|
|
1675
|
-
chipsProjectId: (_ctxChipsProject$proj = ctxChipsProject === null || ctxChipsProject === void 0 ? void 0 : ctxChipsProject.projectId) !== null && _ctxChipsProject$proj !== void 0 ? _ctxChipsProject$proj : null,
|
|
1676
|
-
projectToRequest: projectToRequest,
|
|
1677
|
-
agentType: agent === null || agent === void 0 ? void 0 : agent.type
|
|
1678
|
-
});
|
|
1679
|
-
initialDisplayMessage = formatQuickActionMessageForDisplay(userInitialMessage.message, {
|
|
1680
|
-
fuaId: userInitialMessage.fuaId,
|
|
1681
|
-
scId: userInitialMessage.scId
|
|
1682
|
-
});
|
|
1683
|
-
ensureSessionInSidebar({
|
|
1684
|
-
sessionId: currentChatId.current,
|
|
1685
|
-
title: buildSidebarSessionTitle(initialDisplayMessage),
|
|
1686
|
-
agent: agent,
|
|
1687
|
-
agentId: agent === null || agent === void 0 ? void 0 : agent.id,
|
|
1688
|
-
project: ctxProject,
|
|
1689
|
-
client: ctxClient,
|
|
1690
|
-
attachments: userInitialMessage.attachments
|
|
1691
|
-
});
|
|
1692
|
-
askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
|
|
1693
|
-
message: userInitialMessage.message,
|
|
1694
|
-
history: history,
|
|
1695
|
-
projectId: projectToRequest,
|
|
1696
|
-
lang: authUser.lang,
|
|
1697
|
-
userId: authUser.id.toString(),
|
|
1698
|
-
firstName: authUser.firstName,
|
|
1699
|
-
lastName: authUser.lastName,
|
|
1700
|
-
companyId: authUser.company_id.toString(),
|
|
1701
|
-
chatId: currentChatId.current,
|
|
1702
|
-
messageId: currentMessageId.current,
|
|
1703
|
-
agentName: agent === null || agent === void 0 ? void 0 : agent.name,
|
|
1704
|
-
agentId: agent === null || agent === void 0 ? void 0 : agent.id,
|
|
1705
|
-
isWebSearchActive: isWebSearchActiveRef.current,
|
|
1706
|
-
isDeepSearchActive: isDeepSearchActiveRef.current
|
|
1707
|
-
}, (ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.feeId) != null ? {
|
|
1708
|
-
feeId: Number(ctxProject.feeId)
|
|
1709
|
-
} : {}), resolveClientPayload(ctxClient, ctxProject)), ctxProject !== null && ctxProject !== void 0 && ctxProject.name ? {
|
|
1710
|
-
projectName: ctxProject.name
|
|
1711
|
-
} : {}), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? _objectSpread({
|
|
1712
|
-
taskId: Number(ctxTask.id)
|
|
1713
|
-
}, ctxTask.name ? {
|
|
1714
|
-
taskName: ctxTask.name
|
|
1715
|
-
} : {}) : {}), userInitialMessage.attachments ? {
|
|
1716
|
-
attachments: userInitialMessage.attachments
|
|
1717
|
-
} : {}), userInitialMessage.faqId ? {
|
|
1718
|
-
faqId: userInitialMessage.faqId
|
|
1719
|
-
} : {}), userInitialMessage.agentSuggestionId ? {
|
|
1720
|
-
agentSuggestionId: userInitialMessage.agentSuggestionId
|
|
1721
|
-
} : {}), userInitialMessage.fuaId ? {
|
|
1722
|
-
fuaId: userInitialMessage.fuaId
|
|
1723
|
-
} : {}), userInitialMessage.scId ? {
|
|
1724
|
-
scId: userInitialMessage.scId
|
|
1725
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
|
|
1726
|
-
agentEntity: agent.entity
|
|
1727
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
|
|
1728
|
-
agentType: agent.type
|
|
1729
|
-
} : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
|
|
1730
|
-
agentEmoji: agent.emoji
|
|
1731
|
-
} : {}), buildContextMessage(userInitialMessage.mentions) ? {
|
|
1732
|
-
contextMessage: buildContextMessage(userInitialMessage.mentions)
|
|
1733
|
-
} : {}), userInitialMessage.contextData ? {
|
|
1734
|
-
contextData: userInitialMessage.contextData
|
|
1735
|
-
} : {}));
|
|
1736
|
-
case 4:
|
|
1737
|
-
case "end":
|
|
1738
|
-
return _context7.stop();
|
|
1739
|
-
}
|
|
1740
|
-
}, _callee7);
|
|
1741
|
-
})), [initialChatId, userInitialMessage, project, client, task, authUser, agent, askMaia, isWebSearchActive, isDeepSearchActive]);
|
|
1742
|
-
var resetChat = useCallback(function () {
|
|
1743
|
-
var previousSessionId = currentChatId.current;
|
|
1744
|
-
sessionStreamingText.clear(previousSessionId);
|
|
1745
|
-
currentMessageId.current = uuidv4();
|
|
1746
|
-
currentUserQuestion.current = null;
|
|
1747
|
-
currentChatId.current = uuidv4();
|
|
1748
|
-
setActiveSessionId(currentChatId.current);
|
|
1749
|
-
reportedEvent.current = false;
|
|
1750
|
-
streamingPlaceholderIdRef.current = null;
|
|
1751
|
-
activeStreamChatIdRef.current = null;
|
|
1752
|
-
setActiveChatId(null);
|
|
1753
|
-
}, [setActiveChatId]);
|
|
1754
|
-
var stopGeneration = useCallback(function () {
|
|
1755
|
-
stopStreaming();
|
|
1756
|
-
isProcessingRef.current = false;
|
|
1757
|
-
}, [stopStreaming]);
|
|
1758
|
-
return {
|
|
1759
|
-
messages: messages,
|
|
1760
|
-
loadingMessages: loadingMessages,
|
|
1761
|
-
isLoadingMoreMessages: isLoadingMoreMessages,
|
|
1762
|
-
waitingResponse: waitingResponse,
|
|
1763
|
-
isWriting: isWriting,
|
|
1764
|
-
loadingMessage: loadingMessage,
|
|
1765
|
-
streamActivity: streamActivity,
|
|
1766
|
-
activeLoadings: activeLoadings,
|
|
1767
|
-
currentProject: currentProject,
|
|
1768
|
-
currentChatId: currentChatId.current,
|
|
1769
|
-
currentMessageId: currentMessageId.current,
|
|
1770
|
-
sendMessage: sendMessage,
|
|
1771
|
-
retryMessage: retryMessage,
|
|
1772
|
-
changeProject: changeProject,
|
|
1773
|
-
handleFeedback: handleFeedback,
|
|
1774
|
-
handleApprovalDecision: handleApprovalDecision,
|
|
1775
|
-
handleScroll: handleScroll,
|
|
1776
|
-
initializeChat: initializeChat,
|
|
1777
|
-
resetChat: resetChat,
|
|
1778
|
-
stopGeneration: stopGeneration,
|
|
1779
|
-
isDisabled: waitingResponse || loadingMessages
|
|
1780
|
-
};
|
|
1781
|
-
};
|
|
1782
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQiLCJpc0hvdXJzQ2hhcmdlVG9vbCIsImZldGNoQWdlbnREZXRhaWwiLCJidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCIsImdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUiLCJub3JtYWxpemVIaXRsVG9vbE5hbWUiLCJ0cmFja01hbnVhbEhpdGxFdmVudHMiLCJzZXNzaW9uU3RyZWFtaW5nVGV4dCIsInVzZVNlc3Npb25zU3RvcmUiLCJ1c2VTZXNzaW9uTWV0YSIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyIsImFjdGl2ZVZpZXciLCJub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQiLCJidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUiLCJlbnN1cmVTZXNzaW9uSW5TaWRlYmFyIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsImZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IiwibWVzc2FnZXNXaXRob3V0UmV0cmllZFR1cm4iLCJyZXNvbHZlUmV0cnlUdXJuSWQiLCJnZXRDaGF0c1N0b3JlU3RhdGUiLCJ1c2VDaGF0c1N0b3JlIiwibm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzIiwiYXR0YWNobWVudHNPck9wdGlvbnMiLCJfb3B0aW9ucyRhdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsImF0dGFjaG1lbnRzIiwib3B0aW9ucyIsInJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0IiwiY2hpcHNQcm9qZWN0IiwibGFzdE1lc3NhZ2VQcm9qZWN0SWQiLCJjaGlwc1Byb2plY3RJZCIsInByb2plY3RJZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VkIiwicmVzb2x2ZUNsaWVudFBheWxvYWQiLCJjdHhDbGllbnQiLCJjdHhQcm9qZWN0IiwiX2N0eFByb2plY3QkY2xpZW50IiwiaWQiLCJfb2JqZWN0U3ByZWFkIiwiY2xpZW50SWQiLCJuYW1lIiwiY2xpZW50TmFtZSIsImNsaWVudCIsIm5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzIiwicmF3QXR0YWNobWVudHMiLCJmaWx0ZXIiLCJhdHRhY2htZW50IiwiX3R5cGVvZiIsIm1hcCIsImluZGV4IiwidHJpbSIsImNvbmNhdCIsInR5cGUiLCJtaW1lVHlwZSIsIm1pbWVfdHlwZSIsImZ1bGxGaWxlTmFtZSIsImluY2x1ZGVzIiwibnVtZXJpY1NpemUiLCJzaXplIiwiZmlsZSIsIkZpbGUiLCJ1cmxfb3JpZ2luYWwiLCJ1bmRlZmluZWQiLCJ1cmxfdGh1bWJuYWlsIiwidXJsX2ZpbGUiLCJyb2xlIiwiZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzIiwicGVuZGluZ0FjdGlvbnMiLCJpZHMiLCJwdXNoSWQiLCJyYXciLCJuIiwicGFyc2VJbnQiLCJTdHJpbmciLCJpc05hTiIsInB1c2giLCJmb3JFYWNoIiwiYWN0aW9uIiwiX3JlYyR0YXNrX2lkIiwiYXJncyIsInRvb2xfYXJncyIsInJlYyIsInRhc2tfaWQiLCJ0YXNrX2lkcyIsInRhc2tzIiwidCIsIl90cmVjJHRhc2tfaWQiLCJ0cmVjIiwiZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMiLCJ0b29sX25hbWUiLCJfcmVjJHRhc2tfaWQyIiwibGlzdCIsInRpZCIsImV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zIiwiX3JlYyRhZ2VudF9pZCIsImVkaXRBY3Rpb24iLCJmaW5kIiwiYSIsInRvTG93ZXJDYXNlIiwiYWdlbnRfaWQiLCJhZ2VudElkIiwiZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lIiwidG9vbE5hbWUiLCJfcmVmIiwiX3JlYyRhZ2VudF9pZDIiLCJleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQiLCJ0ZXh0IiwibGFiZWxlZCIsIm1hdGNoIiwiYm9sZCIsInVzZVN0YWJsZUNhbGxiYWNrcyIsImF1dGhVc2VyIiwiY3VycmVudFVzZXIiLCJ0b1N0cmluZyIsImZpcnN0TmFtZSIsImF2YXRhciIsInBpY3R1cmUiLCJjdXJyZW50IiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyIsInRocmVhZElkcyIsImFjdGl2ZU1lc3NhZ2VzIiwiZnJvbUFjdGl2ZVZpZXciLCJtZXNzYWdlIiwiX21lc3NhZ2UkYXBwcm92YWwiLCJhcHByb3ZhbCIsInBlbmRpbmdfYWN0aW9ucyIsInNvbWUiLCJ0aHJlYWRfaWQiLCJzZXNzaW9uSWQiLCJzZXNzaW9uX2lkIiwiZ2V0IiwiX3VzZVNlc3Npb25zU3RvcmUkZ2V0IiwiZ2V0U3RhdGUiLCJtZXNzYWdlcyIsInNlc3Npb25FbnRyeSIsIk9iamVjdCIsImVudHJpZXMiLCJfcmVmMiIsIl9yZWYzIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXNzaW9uTWVzc2FnZXMiLCJfbWVzc2FnZSRhcHByb3ZhbDIiLCJfc2Vzc2lvbkVudHJ5IiwiZm91bmQiLCJfbWVzc2FnZSRhcHByb3ZhbDMiLCJ1c2VDaGF0TWFuYWdlciIsIl9yZWY0IiwiaW5pdGlhbENoYXRJZCIsImNoYXRJZCIsInVzZXJJbml0aWFsTWVzc2FnZSIsIm9uRXJyb3IiLCJfcmVmNCRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsIl91c2VHbG9iYWxDb250ZXh0IiwicHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJ0YXNrIiwic2V0VGFzayIsImFnZW50IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJldmVudCIsIl91c2VQcm9qZWN0cyIsImZldGNoUHJvamVjdHMiLCJfdXNlU3RhYmxlQ2FsbGJhY2tzIiwiX3VzZVRhYlRhc2tEZWZhdWx0IiwiZ2V0VGFiVGFza0RlZmF1bHQiLCJjdXJyZW50TWVzc2FnZUlkIiwiY3VycmVudFVzZXJRdWVzdGlvbiIsImN1cnJlbnRDaGF0SWQiLCJzZXRBY3RpdmVDaGF0SWQiLCJzdGF0ZSIsInJlcG9ydGVkRXZlbnQiLCJtZXNzYWdlc1JlZiIsImxhc3RNYW51YWxBcHByb3ZhbFJlZiIsInRyYWNrZWRNYW51YWxIaXRsS2V5c1JlZiIsIlNldCIsImhpdGxFeGVjdXRpb25Db250ZXh0UmVmIiwicmV0cnlTbmFwc2hvdFJlZiIsImlzUHJvY2Vzc2luZ1JlZiIsImZpcnN0VGltZVJlZiIsInN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYiLCJhY3RpdmVTdHJlYW1DaGF0SWRSZWYiLCJjbGVhclN0cmVhbVVpUmVmIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsImFjdGl2ZUxvYWRpbmdzIiwic2V0QWN0aXZlTG9hZGluZ3MiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImFjdGl2ZVNlc3Npb25JZCIsInNldEFjdGl2ZVNlc3Npb25JZCIsImlzTW91bnRlZFJlZiIsImxhc3RIYW5kbGVkVGVybWluYWxSZWYiLCJpc1dlYlNlYXJjaEFjdGl2ZVJlZiIsImlzRGVlcFNlYXJjaEFjdGl2ZVJlZiIsImNvbnRleHRSZWYiLCJfdXNlQ2hhdE1lc3NhZ2VzIiwibG9hZGluZ01lc3NhZ2VzIiwiaXNMb2FkaW5nTW9yZU1lc3NhZ2VzIiwibG9hZE1lc3NhZ2VzIiwiYWRkTWVzc2FnZSIsInJlbW92ZU1lc3NhZ2UiLCJyZXBsYWNlTWVzc2FnZXMiLCJoYW5kbGVTY3JvbGwiLCJjb21taXRUb1Nlc3Npb24iLCJpcyIsImRyb3BGcm9tU2Vzc2lvbiIsIm1lc3NhZ2VJZCIsImNsZWFyU2Vzc2lvblRhaWwiLCJzZXRNZXNzYWdlcyIsInNldCIsImFjdGl2ZVNlc3Npb25NZXRhIiwiX2FjdGl2ZVNlc3Npb25NZXRhJGZpIiwic3RhdHVzIiwiaXNUZXJtaW5hbCIsImtleSIsImZpbmlzaGVkQXQiLCJ0YWlsIiwiZ2V0TWVzc2FnZXMiLCJoYXNTdGFsZVBsYWNlaG9sZGVyIiwibXNnIiwiZm9yY2UiLCJjdXN0b21FdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwicHJldmlvdXNJbml0aWFsQ2hhdElkUmVmIiwicHJldmlvdXNJbml0aWFsQ2hhdElkIiwiaXNBY3RpdmUiLCJoYW5kbGVTdHJlYW1FcnJvciIsImN0eCIsImVycm9yTWVzc2FnZSIsImVycm9yUmF3TWVzc2FnZSIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YyIsIl9lcnJvclJhd01lc3NhZ2UkbWF0YzIiLCJwbGFjZWhvbGRlcklkIiwiY2xlYXIiLCJyZXRyeVNuYXBzaG90Iiwic2hvdyIsInNldmVyaXR5IiwiaXNBY2Nlc3NEZW5pZWQiLCJpc1Byb21wdFRvb0xvbmciLCJ1c2VkIiwiaXNFcnJvciIsInN1Z2dlc3Rpb25zIiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwiQVNTSVNUQU5UIiwibWFya0NoYXRBc1VucmVhZCIsImhhbmRsZVN0cmVhbVVwZGF0ZSIsImNvbnRlbnQiLCJwbGFjZWhvbGRlckV4aXN0cyIsInN0YXJ0Iiwic2V0VGV4dCIsImhhbmRsZVN0cmVhbUZpbmlzaCIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwiY29tcGxldGVkQWdlbnRJZCIsIl9wcmV2aW91c01lc3NhZ2UkYXBwciIsIl93aW5kb3ckdGFza1BhbmVsIiwiX2NyZWF0ZUFnZW50Rm9sbG93VXAiLCJfZWRpdEFnZW50Rm9sbG93VXAiLCJ0ZW1wTWVzc2FnZUlkIiwidGFza1VybFJlZ2V4IiwibWF0Y2hlcyIsImNvbnRlbnRUb0FkZCIsInByZXZpb3VzTWVzc2FnZSIsImhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UiLCJUQVNLX0NSRUFUSU9OX1RPT0xTIiwiVEFTS19FRElUX1RPT0xTIiwiVEFTS19ERUxFVEVfVE9PTFMiLCJ3YXNUYXNrQ3JlYXRpb24iLCJ3YXNUYXNrRWRpdCIsIndhc1Rhc2tEZWxldGUiLCJ3YXNDcmVhdGVBZ2VudEFwcHJvdmVkIiwid2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJjb25maWd1cmVkQWdlbnRJZCIsIm1hbnVhbEFwcHJvdmFsRm9yQW5hbHl0aWNzIiwid2FzTWFudWFsQ3JlYXRlQWdlbnRBcHByb3ZlZCIsIndhc0VkaXRBZ2VudEFwcHJvdmVkIiwiZWRpdEFnZW50Rm9sbG93VXAiLCJmcm9tU3RyZWFtIiwiZnJvbUFyZ3MiLCJyZXNvbHZlZEFnZW50SWQiLCJ0YXNrSWRzRnJvbVVybHMiLCJ0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsIiwidGFza0lkc0Zyb21EZWxldGlvblRleHQiLCJ0YXNrSWRzRm9yRGFzaGJvYXJkIiwic2hvdWxkU3luY0Rhc2hib2FyZCIsInRhc2tJZHMiLCJ0YWIiLCJ0YWJTZWdtZW50IiwibGFzdFByb2plY3RNZXNzYWdlIiwiY29udGV4dFByb2plY3RJZFJhdyIsImNvbnRleHRQcm9qZWN0SWQiLCJwYXRoTWF0Y2giLCJyb3V0ZVByb2plY3RJZCIsImlzT25Qcm9qZWN0Um91dGUiLCJfd2luZG93JG5ld1Byb2plY3REYXMiLCJfd2luZG93JG5ld1Byb2plY3REYXMyIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzMyIsIl93aW5kb3ckbmV3UHJvamVjdERhczQiLCJfd2luZG93JG5ld1Byb2plY3REYXM1IiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNiIsIm9wZW5UYXNrUGFuZWxJZCIsIm1hbnVhbEFwcHJvdmFsIiwibWFudWFsV2FzVGFza0VkaXQiLCJtYW51YWxXYXNUYXNrRGVsZXRlIiwiaG91cnNUb29sc0Zyb21BcHByb3ZhbCIsIndhc0hvdXJzQ2hhcmdlQXBwcm92ZWQiLCJtYW51YWxIb3Vyc1Rvb2wiLCJ3YXNIb3Vyc0NoYXJnZU1hbnVhbEFwcHJvdmVkIiwidG9vbHMiLCJfbWFudWFsQXBwcm92YWwkdG9vbEEiLCJtYW51YWxQc2V1ZG9BY3Rpb24iLCJhZmZlY3RlZFRhc2tJZHMiLCJfd2luZG93JHRhc2tQYW5lbDIiLCJfd2luZG93JHRhc2tQYW5lbDIkcmUiLCJfZ2V0Q2hhdHNTdG9yZVN0YXRlIiwiaXNDaGF0Vmlld1Zpc2libGUiLCJtYXJrQ2hhdEFzUmVhZCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwiYWJydXB0IiwiUmVnRXhwIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJtIiwiYXQiLCJhcHByb3ZhbFN0YXR1cyIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJhaUNoYXRIaXRsT3B0aW9uIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiZGVjaXNpb24iLCJvcHRpb24iLCJjcmVhdGVkX2FnZW50X2lkIiwicmVzb2x1dGlvbl9zb3VyY2UiLCJzZW50IiwicmVwbGFjZSIsInVybCIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJuZXdQcm9qZWN0RGFzaGJvYXJkIiwiYWRkRXhpc3RpbmdUYXNrVG9EYXNoYm9hcmQiLCJjYWxsIiwiZWRpdEV4aXN0aW5nVGFza0luRGFzaGJvYXJkIiwiZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZCIsInRhc2tQYW5lbCIsInRhc2tJZCIsInNvdXJjZSIsInRvb2xBcmdzIiwicmVmZXRjaFRhc2siLCJ0aGVuIiwiY2hhdEFnZW50IiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3g2IiwiX3g3IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJoYW5kbGVTdHJlYW1TdG9wIiwicGFydGlhbFRleHQiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwiaGFuZGxlQXBwcm92YWxSZXF1aXJlZCIsImFjY3VtdWxhdGVkQ29udGVudCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsImhpdGxDb250ZXh0Iiwib3JpZ2luYWxfdGhyZWFkX2lkIiwibWVzc2FnZVRleHQiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJfYXBwcm92YWwkcGVuZGluZ19hY3QyIiwiX3JlZjYiLCJfdG9vbF9uYW1lIiwiX3Rvb2xfYXJncyIsImltcHJlc3Npb24iLCJhaUNoYXRIaXRsIiwiZmlyc3RBY3Rpb24iLCJfdXNlT3JjaGVzdHJhdG9yU3RyZWEiLCJvblN0cmVhbVVwZGF0ZSIsIm9uRmluaXNoU3RyZWFtIiwib25TdG9wIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiYXNrTWFpYSIsInJldHJ5Q29tcGxldGlvbiIsIndhaXRpbmdSZXNwb25zZSIsImlzTG9hZGluZyIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwic3RyZWFtQWN0aXZpdHkiLCJ1cGRhdGVTdHJlYW1BY3Rpdml0eSIsInN0b3BTdHJlYW1pbmciLCJjdXJyZW50UHJvamVjdCIsInNlbmRNZXNzYWdlIiwiX3JlZjciLCJfY2FsbGVlMiIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJtZW50aW9ucyIsImZ1YUlkIiwic2NJZCIsIl9tZXNzYWdlc1JlZiRjdXJyZW50Iiwid2lsbFN0YXJ0TmV3U3RyZWFtIiwiX25vcm1hbGl6ZVNlbmRNZXNzYWdlIiwiZWZmZWN0aXZlTWVudGlvbnMiLCJjb250ZXh0TWVzc2FnZSIsInBheWxvYWRGdWFJZCIsInBheWxvYWRTY0lkIiwicGF5bG9hZENvbnRleHREYXRhIiwiZGlzcGxheU1lc3NhZ2UiLCJuZXdNZXNzYWdlSWQiLCJsYXN0TWVzc2FnZVdpdGhQcm9qZWN0IiwiY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIiwiX2NvbnRleHRSZWYkY3VycmVudCIsImN0eENoaXBzUHJvamVjdCIsImN0eFRhc2siLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkIiwiZmluYWxNZXNzYWdlIiwiX29wdGlvbnMkcHJvamVjdENoYW5nIiwiX2NvbnRleHRSZWYkY3VycmVudCRwIiwiaGlzdG9yeSIsInByb2plY3RUb1JlcXVlc3QiLCJwcm9qZWN0cyIsInBheWxvYWRGYXFJZCIsInBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCIsInBheWxvYWREYXRhIiwiX2NvbnRleHQyIiwiZ2V0QWN0aXZlQ291bnQiLCJjb250ZXh0RGF0YSIsInBtQWlUeXBlZFRleHQiLCJ0aXRsZSIsIlVTRVIiLCJwcm9qZWN0Q2hhbmdlZCIsImluY29tZVR5cGUiLCJoaXN0b3J5TWVzc2FnZSIsImxhbmciLCJ1c2VySWQiLCJsYXN0TmFtZSIsImNvbXBhbnlJZCIsImNvbXBhbnlfaWQiLCJhZ2VudE5hbWUiLCJmZWVJZCIsInByb2plY3ROYW1lIiwidGFza05hbWUiLCJlbnRpdHkiLCJhZ2VudEVudGl0eSIsImFnZW50VHlwZSIsImVtb2ppIiwiYWdlbnRFbW9qaSIsIl94OCIsIl94OSIsIl94MCIsIl94MSIsIl94MTAiLCJfeDExIiwiX3gxMiIsImNoYW5nZVByb2plY3QiLCJyZXRyeU1lc3NhZ2UiLCJfcmVmOCIsIl9jYWxsZWU0IiwiX3VzZXJNZXNzYWdlJG1lc3NhZ2UiLCJfdXNlck1lc3NhZ2UkYXR0YWNobWUiLCJfdXNlck1lc3NhZ2Ukc291cmNlcyIsIl9tZXNzYWdlJG1lbW9yeVNlc3NpbyIsIl90cnVuY2F0ZWQkYXQiLCJwcmV2aW91c01lc3NhZ2VzIiwidXNlck1lc3NhZ2UiLCJ0dXJuSWQiLCJ1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayIsInRydW5jYXRlZCIsInBsYWNlaG9sZGVyIiwibmV4dE1lc3NhZ2VzIiwiX2NvbnRleHRSZWYkY3VycmVudDIiLCJyZXBsYXlWaWFPcmNoZXN0cmF0b3IiLCJyZXN1bHQiLCJfY29udGV4dDQiLCJpdGVtIiwiX3JlZjkiLCJfY2FsbGVlMyIsIl90IiwiX2NvbnRleHQzIiwic3RhcnRlZCIsInJlYXNvbiIsIl94MTMiLCJoYW5kbGVGZWVkYmFjayIsIl9yZWYwIiwiX2NhbGxlZTUiLCJmZWVkYmFja1Byb3AiLCJjaGF0TWVzc2FnZUlkIiwicmVzcG9uc2UiLCJfY29udGV4dDUiLCJDaGF0cyIsIndhc0hlbHBmdWxDaGF0IiwiVEhVTUJTX1VQIiwid2FzSGVscGZ1bCIsIl94MTQiLCJfeDE1IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsIl9yZWYxIiwiX2NhbGxlZTYiLCJlZGl0ZWRBY3Rpb25zIiwibWVzc2FnZVdpdGhBcHByb3ZhbCIsImZvdW5kU2Vzc2lvbklkIiwibmV3U3RhdHVzIiwiaXNBY3RpdmVTZXNzaW9uIiwic3RyZWFtTWVzc2FnZUlkIiwiaGl0bEN0eCIsInJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nIiwiX2NvbnRleHQ2Iiwic3RhcnRDb250aW51ZVN0cmVhbSIsImNvbnRpbnVlUmVxdWVzdCIsImhpdGxFeGVjdXRpb25Db250ZXh0IiwiY2FsbGJhY2tzIiwiZmluaXNoUGF5bG9hZCIsImFwcHJvdmFsUGF5bG9hZCIsIl94MTYiLCJfeDE3IiwiX3gxOCIsImluaXRpYWxpemVDaGF0IiwiX2NhbGxlZTciLCJfdXNlckluaXRpYWxNZXNzYWdlJG0iLCJfdXNlckluaXRpYWxNZXNzYWdlJGEiLCJfcmVmMTEiLCJfcmVzb2x2ZVByb2plY3RUb1JlcXUiLCJfY3R4UHJvamVjdCRpZCIsIl9jdHhDbGllbnQkaWQiLCJfY3R4VGFzayRpZCIsIl9jdHhDaGlwc1Byb2plY3QkcHJvaiIsImhhc0luaXRpYWxNZXNzYWdlIiwiaGFzSW5pdGlhbEF0dGFjaG1lbnRzIiwiaGFzSW5pdGlhbEZhcSIsImhhc0luaXRpYWxGdWEiLCJoYXNJbml0aWFsU2MiLCJfY29udGV4dFJlZiRjdXJyZW50MyIsImluaXRpYWxEaXNwbGF5TWVzc2FnZSIsIl9jb250ZXh0NyIsIkJvb2xlYW4iLCJpbmZvIiwicHJvamVjdFByb3BJZCIsInJlc2V0Q2hhdCIsInByZXZpb3VzU2Vzc2lvbklkIiwic3RvcEdlbmVyYXRpb24iLCJpc0Rpc2FibGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJhZGl4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGVkLW9wdGlvbmFsLWNoYWluICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgdXNlQ2hhdE1lc3NhZ2VzIH0gZnJvbSAnLi4vdXNlQ2hhdE1lc3NhZ2VzJ1xuaW1wb3J0IHsgdXNlT3JjaGVzdHJhdG9yU3RyZWFtIH0gZnJvbSAnLi4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IFNlbmRNZXNzYWdlT3B0aW9ucywgVXNlQ2hhdE1hbmFnZXJQcm9wcyB9IGZyb20gJy4vdXNlQ2hhdE1hbmFnZXIuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgdXNlVXNlciwgQ09SVXNlciB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi91c2VFdmVudCdcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBGZWVkYmFjayB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL01lc3NhZ2VGZWVkYmFjay9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQgeyBDaGF0TWVzc2FnZSwgQ2hhdE1lc3NhZ2VVc2VyLCBDaGF0SGlzdG9yeVJvbGUsIEFwcHJvdmFsUmVxdWVzdCwgUGVuZGluZ0FjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiwgQ29udGV4dE1lc3NhZ2UsIGJ1aWxkQ29udGV4dE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkgfSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2UnXG5cbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgdXNlUHJvamVjdHMgfSBmcm9tICcuLi91c2VQcm9qZWN0cydcbmltcG9ydCB7IHVzZVRhYlRhc2tEZWZhdWx0IH0gZnJvbSAnLi4vdXNlVGFiVGFza0RlZmF1bHQnXG5pbXBvcnQgeyBUQVNLX1VSTF9SRUdFWF9QQVRURVJOIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3Rhc2tVcmxzJ1xuaW1wb3J0IHsgZGlzcGF0Y2hNYWlhSG91cnNDaGFyZ2VkLCBpc0hvdXJzQ2hhcmdlVG9vbCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9wbGFubmVyU3luY0V2ZW50cydcbmltcG9ydCB7IGZldGNoQWdlbnREZXRhaWwgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9mZXRjaEFnZW50RGV0YWlsJ1xuaW1wb3J0IHtcbiAgYnVpbGRIaXRsQWN0aW9uVHlwZUxpc3QsXG4gIGdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUsXG4gIG5vcm1hbGl6ZUhpdGxUb29sTmFtZSxcbiAgdHJhY2tNYW51YWxIaXRsRXZlbnRzLFxufSBmcm9tICcuLi8uLi91dGlscy9oaXRsQW5hbHl0aWNzJ1xuaW1wb3J0IHsgdHlwZSBIaXRsRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtaW5nVGV4dCB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25zU3RvcmUnXG5pbXBvcnQgeyB1c2VTZXNzaW9uTWV0YSB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25NZXRhJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbU1hbmFnZXIsIE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtTWFuYWdlcidcbmltcG9ydCB7IGFjdGl2ZVZpZXcgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9hY3RpdmVWaWV3J1xuaW1wb3J0IHsgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbk5vdGlmaWNhdGlvbnMnXG5pbXBvcnQgeyBidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUsIGVuc3VyZVNlc3Npb25JblNpZGViYXIgfSBmcm9tICcuLi8uLi9zdG9yZS9jaGF0c1NpZGViYXJPcHRpbWlzdGljJ1xuaW1wb3J0IHsgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeSwgbWVzc2FnZXNXaXRob3V0UmV0cmllZFR1cm4sIHJlc29sdmVSZXRyeVR1cm5JZCB9IGZyb20gJy4uLy4uL3V0aWxzL3JldHJ5Q29tcGxldGlvbidcbmltcG9ydCB0eXBlIHsgU3RyZWFtQ29udGV4dCB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbS91c2VPcmNoZXN0cmF0b3JTdHJlYW0uaW50ZXJmYWNlJ1xuaW1wb3J0IHsgZ2V0Q2hhdHNTdG9yZVN0YXRlLCB1c2VDaGF0c1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdXNlQ2hhdHNTdG9yZSdcblxudHlwZSBBdHRhY2htZW50c09yT3B0aW9ucyA9IEF0dGFjaG1lbnRGaWxlW10gfCBTZW5kTWVzc2FnZU9wdGlvbnNcblxuY29uc3Qgbm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzID0gKGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudHNPck9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXR0YWNobWVudHNPck9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHsgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzT3JPcHRpb25zLCBvcHRpb25zOiB7fSBhcyBTZW5kTWVzc2FnZU9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogU2VuZE1lc3NhZ2VPcHRpb25zID0gYXR0YWNobWVudHNPck9wdGlvbnMgPz8ge31cbiAgcmV0dXJuIHsgYXR0YWNobWVudHM6IG9wdGlvbnMuYXR0YWNobWVudHMgPz8gW10sIG9wdGlvbnMgfVxufVxuXG4vKiogY2hpcHNQcm9qZWN0IGVzIGxhIGZ1ZW50ZSBkZSB2ZXJkYWQgZGVsIHBpbiB2aXNpYmxlOyBzaSBubyBoYXkgcGluLCByZXN0YXVyYXIgZGVzZGUgaGlzdG9yaWFsLiAqL1xuY29uc3QgcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QgPSAoXG4gIGNoaXBzUHJvamVjdDogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxhc3RNZXNzYWdlUHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgY2hpcHNQcm9qZWN0SWQgPSBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/IE51bWJlcihjaGlwc1Byb2plY3QucHJvamVjdElkKSA6IG51bGxcbiAgaWYgKGNoaXBzUHJvamVjdElkICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGNoaXBzUHJvamVjdElkKSkge1xuICAgIHJldHVybiBjaGlwc1Byb2plY3RJZFxuICB9XG4gIGlmIChsYXN0TWVzc2FnZVByb2plY3RJZCAhPSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGxhc3RNZXNzYWdlUHJvamVjdElkKVxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGxcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCByZXNvbHZlQ2xpZW50UGF5bG9hZCA9IChcbiAgY3R4Q2xpZW50OiB7IGlkPzogbnVtYmVyOyBuYW1lPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjdHhQcm9qZWN0OiBQcm9qZWN0IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogeyBjbGllbnRJZD86IG51bWJlcjsgY2xpZW50TmFtZT86IHN0cmluZyB9ID0+IHtcbiAgaWYgKGN0eENsaWVudD8uaWQpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogY3R4Q2xpZW50LmlkLCAuLi4oY3R4Q2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eENsaWVudC5uYW1lIH0gOiB7fSkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnRJZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IE51bWJlcihjdHhQcm9qZWN0LmNsaWVudElkKSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudD8uaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGN0eFByb2plY3QuY2xpZW50LmlkLFxuICAgICAgLi4uKGN0eFByb2plY3QuY2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eFByb2plY3QuY2xpZW50Lm5hbWUgfSA6IHt9KSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzID0gKHJhd0F0dGFjaG1lbnRzOiB1bmtub3duKTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdBdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiByYXdBdHRhY2htZW50c1xuICAgIC5maWx0ZXIoKGF0dGFjaG1lbnQpOiBhdHRhY2htZW50IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICEhYXR0YWNobWVudCAmJiB0eXBlb2YgYXR0YWNobWVudCA9PT0gJ29iamVjdCcpXG4gICAgLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5uYW1lID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50Lm5hbWUudHJpbSgpID8gYXR0YWNobWVudC5uYW1lLnRyaW0oKSA6IGBmaWxlLSR7aW5kZXggKyAxfWBcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgYXR0YWNobWVudC50eXBlID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LnR5cGUudHJpbSgpID8gYXR0YWNobWVudC50eXBlLnRyaW0oKSA6ICdwZGYnXG4gICAgICBjb25zdCBtaW1lVHlwZSA9IHR5cGVvZiBhdHRhY2htZW50Lm1pbWVfdHlwZSA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50Lm1pbWVfdHlwZSA6ICcnXG4gICAgICBjb25zdCBmdWxsRmlsZU5hbWUgPSBuYW1lLmluY2x1ZGVzKCcuJykgPyBuYW1lIDogYCR7bmFtZX0uJHt0eXBlfWBcbiAgICAgIGNvbnN0IG51bWVyaWNTaXplID1cbiAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQuc2l6ZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IGF0dGFjaG1lbnQuc2l6ZVxuICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKE51bWJlcihhdHRhY2htZW50LnNpemUpKVxuICAgICAgICAgICAgPyBOdW1iZXIoYXR0YWNobWVudC5zaXplKVxuICAgICAgICAgICAgOiAwXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCBmdWxsRmlsZU5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSksXG4gICAgICAgIGlkOlxuICAgICAgICAgIHR5cGVvZiBhdHRhY2htZW50LmlkID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LmlkLnRyaW0oKVxuICAgICAgICAgICAgPyBhdHRhY2htZW50LmlkXG4gICAgICAgICAgICA6IGBhc3Npc3RhbnQtZmlsZS0ke2luZGV4fS0ke2Z1bGxGaWxlTmFtZX1gLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplOiBudW1lcmljU2l6ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXJsX29yaWdpbmFsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfb3JpZ2luYWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF90aHVtYm5haWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF90aHVtYm5haWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfdGh1bWJuYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfZmlsZTogdHlwZW9mIGF0dGFjaG1lbnQudXJsX2ZpbGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfZmlsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcm9sZTogYXR0YWNobWVudC5yb2xlID09PSAnYXNzaXN0YW50JyA/ICdhc3Npc3RhbnQnIDogJ3VzZXInLFxuICAgICAgfVxuICAgIH0pXG59XG5cbi8qKiBFeHRyYWUgdGFza19pZHMgZGUgbG9zIHRvb2xfYXJncyBkZSBwZW5kaW5nX2FjdGlvbnMsIGN1YnJpZW5kbyBsYXMgZm9ybWFzIGNvbXVuZXM6XG4gKiAgLSBgeyB0YXNrX2lkIH1gIG8gYHsgaWQgfWBcbiAqICAtIGB7IHRhc2tfaWRzOiBbXSB9YFxuICogIC0gYHsgdGFza3M6IFt7IHRhc2tfaWR8aWQgfSwgLi4uXSB9YFxuICogIMOadGlsIHBhcmEgdG9vbHMgZGUgZWRpdC9hc3NpZ24vZGVsZXRlIGN1YW5kbyBsYSByZXNwdWVzdGEgZGVsIExMTSBubyBpbmNsdXllIFVSTHMgL3Rhc2tzLy4uLi9kZXRhaWwuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdIHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIGNvbnN0IHB1c2hJZCA9IChyYXc6IHVua25vd24pID0+IHtcbiAgICBpZiAocmF3ID09IG51bGwpIHJldHVyblxuICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gIH1cbiAgcGVuZGluZ0FjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgIGlmICghYWN0aW9uIHx8IHR5cGVvZiBhY3Rpb24gIT09ICdvYmplY3QnKSByZXR1cm5cbiAgICBjb25zdCBhcmdzID0gYWN0aW9uLnRvb2xfYXJnc1xuICAgIGlmICghKGFyZ3MgJiYgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFyZ3MpKSkgcmV0dXJuXG4gICAgY29uc3QgcmVjID0gYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHB1c2hJZChyZWMudGFza19pZCA/PyByZWMuaWQpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjLnRhc2tfaWRzKSkge1xuICAgICAgcmVjLnRhc2tfaWRzLmZvckVhY2gocHVzaElkKVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWMudGFza3MpKSB7XG4gICAgICByZWMudGFza3MuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgaWYgKHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHQpKSB7XG4gICAgICAgICAgY29uc3QgdHJlYyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICBwdXNoSWQodHJlYy50YXNrX2lkID8/IHRyZWMuaWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbi8qKiB0YXNrX2lkIC8gdGFza19pZHMgZW4gcGVuZGluZ19hY3Rpb25zIGRlIGRlbGV0ZV8qIChsYSByZXNwdWVzdGEgcHVlZGUgbm8gaW5jbHVpciBVUkxzIC90YXNrcy/igKYvZGV0YWlsKS4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgaWYgKGFjdGlvbi50b29sX25hbWUgPT09ICdkZWxldGVfdGFzaycpIHtcbiAgICAgIGNvbnN0IHJhdyA9IHJlYy50YXNrX2lkID8/IHJlYy5pZFxuICAgICAgaWYgKHJhdyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrc19iYXRjaCcpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSByZWMudGFza19pZHNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgIGxpc3QuZm9yRWFjaCh0aWQgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcodGlkKSwgMTApXG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZWRpdEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JylcbiAgaWYgKFxuICAgICFlZGl0QWN0aW9uIHx8XG4gICAgIWVkaXRBY3Rpb24udG9vbF9hcmdzIHx8XG4gICAgdHlwZW9mIGVkaXRBY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fFxuICAgIEFycmF5LmlzQXJyYXkoZWRpdEFjdGlvbi50b29sX2FyZ3MpXG4gICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gZWRpdEFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSwgdG9vbE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBhY3Rpb24gPSBwZW5kaW5nQWN0aW9ucy5maW5kKGEgPT4gKGEudG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSB0b29sTmFtZS50b0xvd2VyQ2FzZSgpKVxuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLnRvb2xfYXJncyB8fCB0eXBlb2YgYWN0aW9uLnRvb2xfYXJncyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShhY3Rpb24udG9vbF9hcmdzKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gYWN0aW9uLnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBjb25zdCByYXcgPSByZWMuYWdlbnRfaWQgPz8gcmVjLmFnZW50SWQgPz8gcmVjLmlkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG4vKiogw5psdGltbyByZWN1cnNvIHNpIG5vIGhheSBsaW5rcyBuaSB0b29sX2FyZ3MgcGFyc2VhYmxlcyAocC4gZWouIFwiSUQgKio3NTk3MTA2KipcIikuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQodGV4dDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBsYWJlbGVkID0gdGV4dC5tYXRjaCgvXFxiSURcXHMqXFwqXFwqKFxcZCspXFwqXFwqL2kpXG4gIGlmIChsYWJlbGVkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGxhYmVsZWRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIGNvbnN0IGJvbGQgPSB0ZXh0Lm1hdGNoKC9cXCpcXCooXFxkezUsfSlcXCpcXCovKVxuICBpZiAoYm9sZCkge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChib2xkWzFdLCAxMClcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG4pID8gW10gOiBbbl1cbiAgfVxuICByZXR1cm4gW11cbn1cblxuY29uc3QgdXNlU3RhYmxlQ2FsbGJhY2tzID0gKGF1dGhVc2VyOiBDT1JVc2VyKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gdXNlUmVmPENoYXRNZXNzYWdlVXNlcj4oe1xuICAgIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICBhdmF0YXI6IGF1dGhVc2VyLnBpY3R1cmUsXG4gIH0pXG5cbiAgaWYgKFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQuaWQgIT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgfHxcbiAgICBjdXJyZW50VXNlci5jdXJyZW50Lm5hbWUgIT09IGF1dGhVc2VyLmZpcnN0TmFtZSB8fFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQuYXZhdGFyICE9PSBhdXRoVXNlci5waWN0dXJlXG4gICkge1xuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQgPSB7XG4gICAgICBpZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50VXNlcjogY3VycmVudFVzZXIuY3VycmVudCxcbiAgfVxufVxuXG5jb25zdCBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEJ5VGhyZWFkSWRzID0gKFxuICB0aHJlYWRJZHM6IHN0cmluZ1tdLFxuICBhY3RpdmVNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXVxuKTogeyBtZXNzYWdlOiBDaGF0TWVzc2FnZTsgc2Vzc2lvbklkOiBzdHJpbmcgfSB8IG51bGwgPT4ge1xuICBjb25zdCBmcm9tQWN0aXZlVmlldyA9IGFjdGl2ZU1lc3NhZ2VzLmZpbmQobWVzc2FnZSA9PlxuICAgIG1lc3NhZ2UuYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucz8uc29tZShhY3Rpb24gPT4gdGhyZWFkSWRzLmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICApXG4gIGlmIChmcm9tQWN0aXZlVmlldz8uYXBwcm92YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogZnJvbUFjdGl2ZVZpZXcsXG4gICAgICBzZXNzaW9uSWQ6IGZyb21BY3RpdmVWaWV3LmFwcHJvdmFsLnNlc3Npb25faWQgfHwgYWN0aXZlVmlldy5nZXQoKSB8fCAnJyxcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IG1lc3NhZ2VzIH0gPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKClcbiAgY29uc3Qgc2Vzc2lvbkVudHJ5ID0gT2JqZWN0LmVudHJpZXMobWVzc2FnZXMpLmZpbmQoKFssIHNlc3Npb25NZXNzYWdlc10pID0+XG4gICAgc2Vzc2lvbk1lc3NhZ2VzLnNvbWUobWVzc2FnZSA9PlxuICAgICAgbWVzc2FnZS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gICAgKVxuICApXG4gIGlmIChzZXNzaW9uRW50cnkpIHtcbiAgICBjb25zdCBbc2Vzc2lvbklkLCBzZXNzaW9uTWVzc2FnZXNdID0gc2Vzc2lvbkVudHJ5XG4gICAgY29uc3QgZm91bmQgPSBzZXNzaW9uTWVzc2FnZXMuZmluZChtZXNzYWdlID0+XG4gICAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgICApXG4gICAgaWYgKGZvdW5kPy5hcHByb3ZhbCkge1xuICAgICAgcmV0dXJuIHsgbWVzc2FnZTogZm91bmQsIHNlc3Npb25JZDogZm91bmQuYXBwcm92YWwuc2Vzc2lvbl9pZCB8fCBzZXNzaW9uSWQgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGF0TWFuYWdlciA9ICh7XG4gIGNoYXRJZDogaW5pdGlhbENoYXRJZCxcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBvbkVycm9yLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNYW5hZ2VyUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3Qge1xuICAgIHByb2plY3QsXG4gICAgc2V0UHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHRhc2ssXG4gICAgc2V0VGFzayxcbiAgICBhZ2VudCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgY2hpcHNQcm9qZWN0LFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBldmVudCA9IHVzZUV2ZW50KClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgY3VycmVudFVzZXIgfSA9IHVzZVN0YWJsZUNhbGxiYWNrcyhhdXRoVXNlcilcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuXG4gIGNvbnN0IGN1cnJlbnRNZXNzYWdlSWQgPSB1c2VSZWYodXVpZHY0KCkpXG4gIGNvbnN0IGN1cnJlbnRVc2VyUXVlc3Rpb24gPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY3VycmVudENoYXRJZCA9IHVzZVJlZihpbml0aWFsQ2hhdElkIHx8IHV1aWR2NCgpKVxuICBjb25zdCBzZXRBY3RpdmVDaGF0SWQgPSB1c2VDaGF0c1N0b3JlKHN0YXRlID0+IHN0YXRlLnNldEFjdGl2ZUNoYXRJZClcbiAgY29uc3QgcmVwb3J0ZWRFdmVudCA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8Q2hhdE1lc3NhZ2VbXT4oW10pXG4gIC8qKlxuICAgKiBHdWFyZGEgaW5mbyBkZWwgw7psdGltbyBhcHByb3ZhbCBtYW51YWwgKGN1YW5kbyBlbCB1c3VhcmlvIHRpcGVhIFwic2lcIi9cIm5vXCIgZW4gbHVnYXJcbiAgICogZGUgY2xpY2tlYXIgZWwgYm90w7NuKS4gRW4gbWFudWFsIGFwcHJvdmFsLCBgaGFuZGxlQXBwcm92YWxSZXF1aXJlZGAgcmV0b3JuYSBlYXJseVxuICAgKiBzaW4gYWdyZWdhciB1biBtZW5zYWplIGNvbiBgYXBwcm92YWxgLCBhc8OtIHF1ZSBsYSBsw7NnaWNhIGRlIHJlZmV0Y2ggZW4gYG9uU3RyZWFtRmluaXNoYFxuICAgKiBubyBsbyBkZXRlY3RhIHbDrWEgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbGAuIExvIGd1YXJkYW1vcyBhY8OhIHBhcmEgY29uc3VtaXJsbyBkZXNwdcOpcy5cbiAgICovXG4gIGNvbnN0IGxhc3RNYW51YWxBcHByb3ZhbFJlZiA9IHVzZVJlZjx7XG4gICAgdG9vbE5hbWU6IHN0cmluZ1xuICAgIHRvb2xBcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgfSB8IG51bGw+KG51bGwpXG4gIC8qKiBFdml0YSBkdXBsaWNhciBBSV9DSEFUX0hJVEwgLyBBSV9DSEFUX0hJVExfT1BUSU9OIGVuIGFwcm9iYWNpb25lcyBtYW51YWxlcyBwb3IgbG90ZS4gKi9cbiAgY29uc3QgdHJhY2tlZE1hbnVhbEhpdGxLZXlzUmVmID0gdXNlUmVmPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpXG4gIC8qKiBDb250ZXh0byBkZWwgbWVuc2FqZSBkZSBhcHJvYmFjacOzbiBwcmV2aW8gYWwgZWplY3V0YXIgY29udGludWUtdGhyZWFkLiAqL1xuICBjb25zdCBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiA9IHVzZVJlZjxIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGw+KG51bGwpXG4gIC8qKiBNZW5zYWplcyBhIHJlc3RhdXJhciBzaSBgcmV0cnlfY29tcGxldGlvbmAgZmFsbGEgYW50ZXMgZGUgcGVyc2lzdGlyIGVsIHJlZW1wbGF6by4gKi9cbiAgY29uc3QgcmV0cnlTbmFwc2hvdFJlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdIHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNQcm9jZXNzaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBmaXJzdFRpbWVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBJZCBkZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIGFjdGl2byAoc2kgaGF5KS4gKi9cbiAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogQ2hhdCBhbCBxdWUgcGVydGVuZWNlIGVsIHN0cmVhbSBhY3R1YWxtZW50ZSBhY3Rpdm8uIFNpIGNhbWJpYSBlbCBjaGF0XG4gICAqIG1pZW50cmFzIHVuIHN0cmVhbSBlc3TDoSBlbiB2dWVsbywgZGVzY2FydGFtb3MgbG9zIHRva2VucyByZXNpZHVhbGVzXG4gICAqIHF1ZSBwdWVkYW4gbGxlZ2FyIGFudGVzIGRlIHF1ZSBlbCBhYm9ydCBzZSBjb21wbGV0ZS5cbiAgICovXG4gIGNvbnN0IGFjdGl2ZVN0cmVhbUNoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjbGVhclN0cmVhbVVpUmVmID0gdXNlUmVmPCgpID0+IHZvaWQ+KCgpID0+IHVuZGVmaW5lZClcbiAgY29uc3QgW2FjdGl2ZUxvYWRpbmdzLCBzZXRBY3RpdmVMb2FkaW5nc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSlcbiAgLyoqXG4gICAqIFNlc2nDs24gYWN0dWFsbWVudGUgdmlzaWJsZS4gU2UgbWFudGllbmUgZW4gc3RhdGUgKG5vIHNvbG8gZW4gcmVmKSBwYXJhIHF1ZVxuICAgKiBlbCBtb3RvciBkZSBzdHJlYW1pbmcgcHVlZGEgbGVlciByZWFjdGl2YW1lbnRlIGxvcyBmbGFncyBkZSBFU1RBIHNlc2nDs25cbiAgICogZGVzZGUgZWwgc3RvcmUsIG1pZW50cmFzIG90cmFzIHNpZ3VlbiBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZC5cbiAgICovXG4gIGNvbnN0IFthY3RpdmVTZXNzaW9uSWQsIHNldEFjdGl2ZVNlc3Npb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgLyoqIFRydWUgbWllbnRyYXMgZXN0YSBpbnN0YW5jaWEgZXN0w6kgbW9udGFkYSAoZXZpdGEgc2V0U3RhdGUgdHJhcyBkZXNtb250YXIpLiAqL1xuICBjb25zdCBpc01vdW50ZWRSZWYgPSB1c2VSZWYodHJ1ZSlcbiAgLyoqIEV2aXRhIHJlY29uY2lsaWFyIGRvcyB2ZWNlcyBlbCBtaXNtbyBlc3RhZG8gdGVybWluYWwgZGUgdW5hIHNlc2nDs24uICovXG4gIGNvbnN0IGxhc3RIYW5kbGVkVGVybWluYWxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBjb25zdCBpc1dlYlNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc1dlYlNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNEZWVwU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzRGVlcFNlYXJjaEFjdGl2ZSlcbiAgLyoqIEV2aXRhIGNsb3N1cmVzIG9ic29sZXRhcyBjdWFuZG8gZWwgZm9vdGVyIGNvbnNlcnZhIHNlbmRNZXNzYWdlIGVudHJlIHJlbmRlcnMuICovXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoeyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9KVxuICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNEZWVwU2VhcmNoQWN0aXZlXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICBjb25zdCB7XG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgYWRkTWVzc2FnZSxcbiAgICByZW1vdmVNZXNzYWdlLFxuICAgIHJlcGxhY2VNZXNzYWdlcyxcbiAgICBoYW5kbGVTY3JvbGwsXG4gIH0gPSB1c2VDaGF0TWVzc2FnZXMoe1xuICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudFVzZXIsXG4gICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgIG9uRXJyb3IsXG4gICAgYWdlbnRzLFxuICB9KVxuXG4gIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1xuXG4gIC8qKlxuICAgKiBFc2NyaWJlIHVuIG1lbnNhamUgZW4gZWwgc3RvcmUgcG9yLXNlc2nDs24geSwgc2kgbGEgc2VzacOzbiBlcyBsYSBhY3RpdmEsXG4gICAqIHRhbWJpw6luIGVuIGxhIHZpc3RhIGxvY2FsLiBQZXJtaXRlIHF1ZSBzZXNpb25lcyBlbiBiYWNrZ3JvdW5kIGFjdW11bGVuIHN1XG4gICAqIHJlc3VsdGFkbyBzaW4gcGlzYXIgZWwgY2hhdCBxdWUgZWwgdXN1YXJpbyBlc3TDoSBtaXJhbmRvLlxuICAgKi9cbiAgY29uc3QgY29tbWl0VG9TZXNzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHNlc3Npb25JZDogc3RyaW5nLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmFkZE1lc3NhZ2Uoc2Vzc2lvbklkLCBtZXNzYWdlKVxuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmIGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBhZGRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfSxcbiAgICBbYWRkTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGRyb3BGcm9tU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzZXNzaW9uSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5yZW1vdmVNZXNzYWdlKHNlc3Npb25JZCwgbWVzc2FnZUlkKVxuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmIGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICByZW1vdmVNZXNzYWdlKG1lc3NhZ2VJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyZW1vdmVNZXNzYWdlXVxuICApXG5cbiAgLyoqIExpbXBpYSBlbCB0YWlsIGVuIHZ1ZWxvIGRlIHVuYSBzZXNpw7NuICh0cmFzIHRlcm1pbmFyOyBlbCBiYWNrZW5kIHBhc2EgYSBzZXIgZnVlbnRlKS4gKi9cbiAgY29uc3QgY2xlYXJTZXNzaW9uVGFpbCA9IHVzZUNhbGxiYWNrKChzZXNzaW9uSWQ6IHN0cmluZykgPT4ge1xuICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyhzZXNzaW9uSWQsIFtdKVxuICB9LCBbXSlcblxuICAvLyBSZWdpc3RyYXIgbGEgc2VzacOzbiB2aXNpYmxlIGVuIGVsIHRyYWNrZXIgZ2xvYmFsIHBhcmEgcXVlIGxvcyBjYWxsYmFja3MgZGVsXG4gIC8vIG1vdG9yIChxdWUgcHVlZGVuIHBlcnRlbmVjZXIgYSB1bmEgaW5zdGFuY2lhIHlhIGRlc21vbnRhZGEpIHNlcGFuIGN1w6FsIGVzIGxhXG4gIC8vIHNlc2nDs24gYWN0aXZhIGFjdHVhbC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVWaWV3LnNldChhY3RpdmVTZXNzaW9uSWQpXG4gIH0sIFthY3RpdmVTZXNzaW9uSWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChhY3RpdmVWaWV3LmlzKGN1cnJlbnRDaGF0SWQuY3VycmVudCkpIHtcbiAgICAgICAgYWN0aXZlVmlldy5zZXQobnVsbClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIFJlY29uY2lsaWFjacOzbjogc2kgbGEgc2VzacOzbiBhY3RpdmEgdGVybWluYSAoY29tcGxldGUvZXJyb3IpIHBlcm8gZWwgc3RvcmVcbiAgLy8gcG9yLXNlc2nDs24gdG9kYXbDrWEgdGllbmUgdW4gcGxhY2Vob2xkZXIgZGUgc3RyZWFtaW5nLCByZWZyZXNjYW1vcyBkZXNkZVxuICAvLyBlbCBiYWNrZW5kLiBVc2Ftb3MgZWwgc3RvcmUgKG5vIG1lc3NhZ2VzUmVmKTogaGFuZGxlU3RyZWFtRmluaXNoIGxpbXBpYSBlbFxuICAvLyBwbGFjZWhvbGRlciBhaMOtIGRlIGZvcm1hIHPDrW5jcm9uYTsgbWVzc2FnZXNSZWYgcHVlZGUgcXVlZGFyIHN0YWxlIHVuIHJlbmRlclxuICAvLyBwb3JxdWUgc2V0U3RhdHVzIChadXN0YW5kKSB5IHJlbW92ZU1lc3NhZ2UgKFJlYWN0KSBubyBiYXRjaGFuIGp1bnRvcy5cbiAgLy8gYGNhbmNlbGxlZGAgcXVlZGEgYWZ1ZXJhOiBlbCBzdG9wIHlhIHJlY29uY2lsaWEgbG9jYWwgKHBhcmNpYWwgKyBidXJidWphIGRlXG4gIC8vIGNhbmNlbGFkbykgeSByZWNhcmdhciBhY8OhIG1vc3RyYWJhIGxhIHBhbnRhbGxhIGRlIGNhcmdhIGRlbCBjaGF0IGVudGVyby5cbiAgY29uc3QgYWN0aXZlU2Vzc2lvbk1ldGEgPSB1c2VTZXNzaW9uTWV0YShhY3RpdmVTZXNzaW9uSWQpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzID0gYWN0aXZlU2Vzc2lvbk1ldGE/LnN0YXR1c1xuICAgIGlmICghc3RhdHVzKSByZXR1cm5cbiAgICBjb25zdCBpc1Rlcm1pbmFsID0gc3RhdHVzID09PSAnY29tcGxldGUnIHx8IHN0YXR1cyA9PT0gJ2Vycm9yJ1xuICAgIGlmICghaXNUZXJtaW5hbCkgcmV0dXJuXG4gICAgY29uc3Qga2V5ID0gYCR7YWN0aXZlU2Vzc2lvbklkfToke3N0YXR1c306JHthY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCA/PyAnJ31gXG4gICAgaWYgKGxhc3RIYW5kbGVkVGVybWluYWxSZWYuY3VycmVudCA9PT0ga2V5KSByZXR1cm5cbiAgICBsYXN0SGFuZGxlZFRlcm1pbmFsUmVmLmN1cnJlbnQgPSBrZXlcblxuICAgIGNvbnN0IHRhaWwgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWVzc2FnZXMoYWN0aXZlU2Vzc2lvbklkKVxuICAgIGNvbnN0IGhhc1N0YWxlUGxhY2Vob2xkZXIgPSB0YWlsLnNvbWUobXNnID0+IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQobXNnLmlkKSlcbiAgICBpZiAoaGFzU3RhbGVQbGFjZWhvbGRlcikge1xuICAgICAgbG9hZE1lc3NhZ2VzKHsgZm9yY2U6IHRydWUgfSlcbiAgICB9XG4gIH0sIFthY3RpdmVTZXNzaW9uTWV0YT8uc3RhdHVzLCBhY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCwgYWN0aXZlU2Vzc2lvbklkLCBsb2FkTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtbG9hZGluZy1tZXNzYWdlcy1jaGFuZ2VkJywge1xuICAgICAgZGV0YWlsOiB7IGxvYWRpbmdNZXNzYWdlcyB9LFxuICAgIH0pXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgfSwgW2xvYWRpbmdNZXNzYWdlc10pXG5cbiAgY29uc3QgcHJldmlvdXNJbml0aWFsQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KGluaXRpYWxDaGF0SWQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0luaXRpYWxDaGF0SWQgPSBwcmV2aW91c0luaXRpYWxDaGF0SWRSZWYuY3VycmVudFxuICAgIHByZXZpb3VzSW5pdGlhbENoYXRJZFJlZi5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuXG4gICAgLy8gQ2hhdCBudWV2byAvIGhvbWU6IGluaXRpYWxDaGF0SWQgcGFzYSBhIG51bGwsIGFzw60gcXVlIGxhIHJhbWEgZGUgYWJham8gbm9cbiAgICAvLyBhcGxpY2EuIEhheSBxdWUgcm90YXIgYSB1bmEgc2VzacOzbiBudWV2YSBpZ3VhbDogc2kgc2VndWltb3MgYXB1bnRhbmRvIGEgbGFcbiAgICAvLyBhbnRlcmlvciwgYGFjdGl2ZVZpZXdgIGxhIHNpZ3VlIG1hcmNhbmRvIGNvbW8gYWN0aXZhIHkgY3VhbmRvIHRlcm1pbmEgbm8gc2VcbiAgICAvLyBub3RpZmljYSAoeSBzdSByZXNwdWVzdGEgc2UgY29tbWl0ZWEgc29icmUgbGEgdmlzdGEgbnVldmEpLiBFbCDDoXJib2wgbm9cbiAgICAvLyByZW1vbnRhIGVuIGVzdGUgZmx1am8gKG5vIGhheSBga2V5YCkgeSBuYWRpZSBjb25zdW1lIGByZXNldENoYXRgLlxuICAgIGlmICghaW5pdGlhbENoYXRJZCAmJiBwcmV2aW91c0luaXRpYWxDaGF0SWQpIHtcbiAgICAgIGN1cnJlbnRDaGF0SWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgICBzZXRBY3RpdmVTZXNzaW9uSWQoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpbml0aWFsQ2hhdElkICYmIGluaXRpYWxDaGF0SWQgIT09IGN1cnJlbnRDaGF0SWQuY3VycmVudCkge1xuICAgICAgLy8gTk8gYWJvcnRhbW9zIGVsIHN0cmVhbSBhbnRlcmlvcjogcHVlZGUgc2VndWlyIGdlbmVyYW5kbyBlbiBiYWNrZ3JvdW5kLlxuICAgICAgLy8gU29sbyBjYW1iaWFtb3MgZGUgc2VzacOzbiBhY3RpdmE7IGVsIG1vdG9yIHJ1dGVhIGNhZGEgc3RyZWFtIHBvciBzdVxuICAgICAgLy8gc2Vzc2lvbklkLCBhc8OtIHF1ZSBsb3MgdG9rZW5zIGRlIGxhIHNlc2nDs24gcHJldmlhIHNpZ3VlbiBhcGxpY8OhbmRvc2UgYVxuICAgICAgLy8gRVNBIHNlc2nDs24gKHN0b3JlKSwgbm8gYSBsYSBudWV2YS5cblxuICAgICAgLy8gTGltcGlhciBjb250ZXh0byBnbG9iYWwgYWwgY2FtYmlhciBkZSBjb252ZXJzYWNpw7NuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICBzZXRUYXNrKG51bGwpXG5cbiAgICAgIGN1cnJlbnRDaGF0SWQuY3VycmVudCA9IGluaXRpYWxDaGF0SWRcbiAgICAgIHNldEFjdGl2ZVNlc3Npb25JZChpbml0aWFsQ2hhdElkKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgICAvLyBpc1Byb2Nlc3NpbmdSZWYgcmVmbGVqYSBzaSBsYSBzZXNpw7NuIEFDVElWQSBlc3TDoSBvY3VwYWRhLiBTaSBsYSBzZXNpw7NuXG4gICAgICAvLyBhIGxhIHF1ZSBlbnRyYW1vcyBzaWd1ZSBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZCwgcXVlZGEgYmxvcXVlYWRhOyBzaSBubyxcbiAgICAgIC8vIHNlIGhhYmlsaXRhIGVsIGVudsOtbyBhdW5xdWUgb3RyYXMgc2VzaW9uZXMgc2lnYW4gZ2VuZXJhbmRvLlxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShpbml0aWFsQ2hhdElkKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIC8vIGxvYWRNZXNzYWdlcyBsbyBkaXNwYXJhIHVzZUNoYXRNZXNzYWdlcyBhbCBjYW1iaWFyIGNoYXRJZCAoY29uIGNhY2hlIGVuIG1lbW9yaWEpLlxuICAgIH1cbiAgfSwgW2luaXRpYWxDaGF0SWQsIHByb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRUYXNrXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldEFjdGl2ZUNoYXRJZChpbml0aWFsQ2hhdElkIHx8IG51bGwpXG4gIH0sIFtpbml0aWFsQ2hhdElkLCBzZXRBY3RpdmVDaGF0SWRdKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUVycm9yID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgZXJyb3JNZXNzYWdlPzogc3RyaW5nLCBlcnJvclJhd01lc3NhZ2U/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcblxuICAgICAgY29uc3QgcmV0cnlTbmFwc2hvdCA9IHJldHJ5U25hcHNob3RSZWYuY3VycmVudFxuICAgICAgaWYgKHJldHJ5U25hcHNob3QpIHtcbiAgICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gcmV0cnlTbmFwc2hvdFxuICAgICAgICByZXBsYWNlTWVzc2FnZXMocmV0cnlTbmFwc2hvdClcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50KClcbiAgICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2Vycm9yJywgbWVzc2FnZTogdCgnY2hhdC5lcnJvcicpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBY2Nlc3NEZW5pZWQgPSBlcnJvck1lc3NhZ2UgPT09IFwiQWNjZXNzIGRlbmllZDogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhpcyBhZ2VudFwiXG4gICAgICBjb25zdCBpc1Byb21wdFRvb0xvbmcgPVxuICAgICAgICBlcnJvck1lc3NhZ2UgPT09ICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InICYmIGVycm9yUmF3TWVzc2FnZT8uaW5jbHVkZXMoJ3Byb21wdCBpcyB0b28gbG9uZycpXG4gICAgICBjb25zdCBtZXNzYWdlID0gaXNBY2Nlc3NEZW5pZWRcbiAgICAgICAgPyB0KCdjaGF0LmVycm9yQWNjZXNzRGVuaWVkJylcbiAgICAgICAgOiBpc1Byb21wdFRvb0xvbmdcbiAgICAgICAgICA/IHQoJ2NoYXQuZXJyb3JQcm9tcHRUb29Mb25nJywgeyB1c2VkOiBlcnJvclJhd01lc3NhZ2U/Lm1hdGNoKC8oXFxkKykgdG9rZW5zLyk/LlsxXSA/PyAnJyB9KVxuICAgICAgICAgIDogdCgnY2hhdC5lcnJvcicpXG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHttZXNzYWdlSWR9YCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgLy8gQ2hpcCBcIlJlaW50ZW50YXJcIiBzb2xvIGVuIGVsIGVycm9yIGdlbsOpcmljbyAocC4gZWouIDUwMCk7IG5vIGFwbGljYSBhIGFjY2VzcyBkZW5pZWQgbmkgcHJvbXB0IHRvbyBsb25nLlxuICAgICAgICAuLi4oIWlzQWNjZXNzRGVuaWVkICYmICFpc1Byb21wdFRvb0xvbmcgPyB7IHN1Z2dlc3Rpb25zOiBbdCgnY2hhdC5yZXRyeScpXSB9IDoge30pLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcblxuICAgICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5tYXJrQ2hhdEFzVW5yZWFkKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgcmVwbGFjZU1lc3NhZ2VzLCB0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtVXBkYXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG5cbiAgICAgIC8vIEFzZWd1cmFtb3MgZWwgcGxhY2Vob2xkZXIgdW5hIMO6bmljYSB2ZXogcG9yIHN0cmVhbSwgdGFudG8gZW4gZWwgc3RvcmVcbiAgICAgIC8vIGRlIGxhIHNlc2nDs24gY29tbyBlbiBsYSB2aXN0YSBzaSBlcyBsYSBhY3RpdmEuIEVsIHRleHRvIGVuIHZpdm8gdmlhamFcbiAgICAgIC8vIHBvciBzZXNzaW9uU3RyZWFtaW5nVGV4dCAoZXh0ZXJubyksIHNpbiByZS1yZW5kZXIgZGVsIMOhcmJvbCBjb21wbGV0by5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyRXhpc3RzID0gdXNlU2Vzc2lvbnNTdG9yZVxuICAgICAgICAuZ2V0U3RhdGUoKVxuICAgICAgICAuZ2V0TWVzc2FnZXMoc2Vzc2lvbklkKVxuICAgICAgICAuc29tZShtc2cgPT4gbXNnLmlkID09PSBwbGFjZWhvbGRlcklkKVxuXG4gICAgICBpZiAoIXBsYWNlaG9sZGVyRXhpc3RzKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBwbGFjZWhvbGRlcklkLFxuICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBwbGFjZWhvbGRlcklkXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICB9XG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnNldFRleHQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjb250ZW50KVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUZpbmlzaCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIGN0eDogU3RyZWFtQ29udGV4dCxcbiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgcmF3QXR0YWNobWVudHM/OiBhbnlbXSB8IG51bGwsXG4gICAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbCxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKVxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuXG4gICAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gcGxhY2Vob2xkZXJJZFxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgdGVtcE1lc3NhZ2VJZClcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMocmF3QXR0YWNobWVudHMpXG5cbiAgICAgIC8vIFNlc2nDs24gZW4gYmFja2dyb3VuZDogY2VycmFtb3MgbGVhbi4gRWwgYmFja2VuZCB5YSBwZXJzaXN0acOzIGxhXG4gICAgICAvLyByZXNwdWVzdGEsIGFzw60gcXVlIGFsIHZvbHZlciBhIGxhIHNlc2nDs24gc2UgY2FyZ2EgZGVzZGUgYWjDrS4gQXZpc2Ftb3NcbiAgICAgIC8vIHF1ZSB0ZXJtaW7DsyAodW5yZWFkICsgZXZlbnRvIHBhcmEgdG9hc3Qvc29uaWRvKS5cbiAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBgYW5zd2VyLSR7bWVtb3J5U2Vzc2lvbklkfWAsXG4gICAgICAgICAgbWVzc2FnZTogY29udGVudCxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICAuLi4oYXR0YWNobWVudHMubGVuZ3RoID4gMCA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zIHx8IFtdLFxuICAgICAgICB9KVxuICAgICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkubWFya0NoYXRBc1VucmVhZChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdjb21wbGV0ZScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIC8vIERldGVjdGFyIHRvZGFzIGxhcyBVUkxzIGRlIHRhcmVhcyAoLi4uL3Rhc2tzLzEyMy9kZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKVxuICAgICAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gICAgICBjb25zdCBtYXRjaGVzID0gWy4uLmNvbnRlbnQubWF0Y2hBbGwodGFza1VybFJlZ2V4KV1cblxuICAgICAgbGV0IGNvbnRlbnRUb0FkZCA9IGNvbnRlbnRcbiAgICAgIGNvbnN0IHByZXZpb3VzTWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG0gPT4gbS5pZCAhPT0gdGVtcE1lc3NhZ2VJZCkuYXQoLTEpXG4gICAgICBjb25zdCBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbCAhPSBudWxsXG4gICAgICBjb25zdCBUQVNLX0NSRUFUSU9OX1RPT0xTID0gWydjcmVhdGVfdGFzaycsICdjcmVhdGVfdGFza3NfYmF0Y2gnLCAnY2xvbmVfdGFzayddXG4gICAgICBjb25zdCBUQVNLX0VESVRfVE9PTFMgPSBbXG4gICAgICAgICdlZGl0X3Rhc2snLFxuICAgICAgICAnZWRpdF90YXNrc19iYXRjaCcsXG4gICAgICAgICd0YXNrX2Fzc2lnbicsXG4gICAgICAgICd0YXNrX3VuYXNzaWduJyxcbiAgICAgICAgJ3VwZGF0ZV90YXNrX3R5cGUnLFxuICAgICAgICAndXBkYXRlX2VzdGltYXRlZF9ob3VycycsXG4gICAgICAgICdhc3NpZ25fdGFza19sYWJlbCcsXG4gICAgICBdXG4gICAgICBjb25zdCBUQVNLX0RFTEVURV9UT09MUyA9IFsnZGVsZXRlX3Rhc2snLCAnZGVsZXRlX3Rhc2tzX2JhdGNoJ11cbiAgICAgIGNvbnN0IHBlbmRpbmdBY3Rpb25zID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zIHx8IFtdXG4gICAgICBjb25zdCB3YXNUYXNrQ3JlYXRpb24gPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0NSRUFUSU9OX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzVGFza0VkaXQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0VESVRfVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNUYXNrRGVsZXRlID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBhY3Rpb24udG9vbF9uYW1lID09PSAnY3JlYXRlX2FnZW50JylcbiAgICAgIGNvbnN0IHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IChhY3Rpb24udG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpXG4gICAgICBsZXQgY3JlYXRlQWdlbnRGb2xsb3dVcDogeyBhZ2VudElkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgJiYgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpKSB7XG4gICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAgPSB7IGFnZW50SWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQgJiZcbiAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgJiZcbiAgICAgICAgKGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fFxuICAgICAgICAgIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjb25maWd1cmVkQWdlbnRJZCA9XG4gICAgICAgICAgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8XG4gICAgICAgICAgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zLCAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpXG4gICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAgPSB7XG4gICAgICAgICAgYWdlbnRJZDogY29uZmlndXJlZEFnZW50SWQgYXMgc3RyaW5nLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh3YXNDcmVhdGVBZ2VudEFwcHJvdmVkKSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5haUNoYXRIaXRsT3B0aW9uLCB7XG4gICAgICAgICAgYWdlbnRfdHlwZTogZ2V0SGl0bEFuYWx5dGljc0FnZW50VHlwZShhZ2VudCksXG4gICAgICAgICAgYWN0aW9uX3R5cGU6IGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0KHBlbmRpbmdBY3Rpb25zKSxcbiAgICAgICAgICBkZWNpc2lvbjogJ2FjY2VwdCcsXG4gICAgICAgICAgb3B0aW9uOiAnY3JlYXRlX2FnZW50JyxcbiAgICAgICAgICAuLi4oY29tcGxldGVkQWdlbnRJZD8udHJpbSgpID8geyBjcmVhdGVkX2FnZW50X2lkOiBjb21wbGV0ZWRBZ2VudElkLnRyaW0oKSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbEZvckFuYWx5dGljcyA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBjb25zdCB3YXNNYW51YWxDcmVhdGVBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgbWFudWFsQXBwcm92YWxGb3JBbmFseXRpY3MgJiYgbm9ybWFsaXplSGl0bFRvb2xOYW1lKG1hbnVhbEFwcHJvdmFsRm9yQW5hbHl0aWNzLnRvb2xOYW1lKSA9PT0gJ2NyZWF0ZV9hZ2VudCdcblxuICAgICAgaWYgKHdhc01hbnVhbENyZWF0ZUFnZW50QXBwcm92ZWQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdEhpdGxPcHRpb24sIHtcbiAgICAgICAgICBhZ2VudF90eXBlOiBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlKGFnZW50KSxcbiAgICAgICAgICBhY3Rpb25fdHlwZTogJ2NyZWF0ZV9hZ2VudCcsXG4gICAgICAgICAgZGVjaXNpb246ICdhY2NlcHQnLFxuICAgICAgICAgIHJlc29sdXRpb25fc291cmNlOiAnbWFudWFsJyxcbiAgICAgICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgICAgIC4uLihjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgPyB7IGNyZWF0ZWRfYWdlbnRfaWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhc0VkaXRBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuXG4gICAgICBsZXQgZWRpdEFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNFZGl0QWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCBmcm9tU3RyZWFtID0gY29tcGxldGVkQWdlbnRJZD8udHJpbSgpXG4gICAgICAgIGNvbnN0IGZyb21BcmdzID0gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGZyb21TdHJlYW0gfHwgZnJvbUFyZ3NcbiAgICAgICAgaWYgKHJlc29sdmVkQWdlbnRJZCkge1xuICAgICAgICAgIGVkaXRBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiByZXNvbHZlZEFnZW50SWQgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IG1hdGNoZXMubWFwKG1hdGNoID0+IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCA9XG4gICAgICAgIHdhc1Rhc2tEZWxldGUgJiYgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA9PT0gMCAmJiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICAgICAgOiBbXVxuICAgICAgY29uc3QgdGFza0lkc0ZvckRhc2hib2FyZCA9XG4gICAgICAgIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0YXNrSWRzRnJvbVVybHNcbiAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gICAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0XG5cbiAgICAgIGNvbnN0IHNob3VsZFN5bmNEYXNoYm9hcmQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgICh3YXNUYXNrQ3JlYXRpb24gfHwgd2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSkgJiZcbiAgICAgICAgdGFza0lkc0ZvckRhc2hib2FyZC5sZW5ndGggPiAwXG5cbiAgICAgIGlmIChzaG91bGRTeW5jRGFzaGJvYXJkKSB7XG4gICAgICAgIGNvbnN0IHRhc2tJZHMgPSB0YXNrSWRzRm9yRGFzaGJvYXJkXG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCh0YXNrSWRzWzBdKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBjb250ZW50VG9BZGQgPSBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICAgICAgICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQcm9qZWN0TWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZFJhdyA9IHByb2plY3Q/LmlkIHx8IGxhc3RQcm9qZWN0TWVzc2FnZT8ucHJvamVjdElkXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBjb250ZXh0UHJvamVjdElkUmF3ID8gcGFyc2VJbnQoU3RyaW5nKGNvbnRleHRQcm9qZWN0SWRSYXcpLCAxMCkgOiBudWxsXG4gICAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXlxcL3Byb2plY3RzXFwvKFxcZCspXFwvLylcbiAgICAgICAgY29uc3Qgcm91dGVQcm9qZWN0SWQgPSBwYXRoTWF0Y2ggPyBwYXJzZUludChwYXRoTWF0Y2hbMV0sIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgaXNPblByb2plY3RSb3V0ZSA9IGNvbnRleHRQcm9qZWN0SWQgJiYgcm91dGVQcm9qZWN0SWQgJiYgY29udGV4dFByb2plY3RJZCA9PT0gcm91dGVQcm9qZWN0SWRcblxuICAgICAgICBpZiAoaXNPblByb2plY3RSb3V0ZSkge1xuICAgICAgICAgIGlmICh3YXNUYXNrQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5hZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRWRpdCkge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRGVsZXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZmV0Y2ggZGVsIHRhc2sgcGFuZWwgc2kgZXN0w6EgYWJpZXJ0byB5IGxhIHRvb2wgYXByb2JhZGEgZWRpdMOzL2JvcnLDsyBlc2EgdGFyZWEuXG4gICAgICAvLyBDdWJyZSBsb3MgZG9zIGZsdWpvcyBkZSBhcHByb3ZhbDpcbiAgICAgIC8vICAgMSkgQXBwcm92YWwgcG9yIGJvdMOzbiDihpIgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnNgICh2w61hIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UpXG4gICAgICAvLyAgIDIpIE1hbnVhbCBhcHByb3ZhbCAodXN1YXJpbyB0aXBlYSBcInNpXCIvXCJub1wiKSDihpIgYGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50YFxuICAgICAgY29uc3Qgb3BlblRhc2tQYW5lbElkID0gd2luZG93LnRhc2tQYW5lbD8udGFza0lkXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbCA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudCA9IG51bGwgLy8gY29uc3VtaXIgdW5hIHNvbGEgdmV6XG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRWRpdCA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lKVxuICAgICAgY29uc3QgbWFudWFsV2FzVGFza0RlbGV0ZSA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG5cbiAgICAgIC8vIFN5bmMgUGxhbm5lcjogYXZpc2FyIGNhcmdhIGRlIGhvcmFzIGNvbmZpcm1hZGEgKGNyZWF0ZV9ob3VyIC8gY3JlYXRlX2hvdXJzKS5cbiAgICAgIGNvbnN0IGhvdXJzVG9vbHNGcm9tQXBwcm92YWwgPSBwZW5kaW5nQWN0aW9uc1xuICAgICAgICAubWFwKChhY3Rpb246IFBlbmRpbmdBY3Rpb24pID0+IGFjdGlvbi50b29sX25hbWUpXG4gICAgICAgIC5maWx0ZXIoKHRvb2xOYW1lKTogdG9vbE5hbWUgaXMgc3RyaW5nID0+IGlzSG91cnNDaGFyZ2VUb29sKHRvb2xOYW1lKSlcbiAgICAgIGNvbnN0IHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgaG91cnNUb29sc0Zyb21BcHByb3ZhbC5sZW5ndGggPiAwXG4gICAgICBjb25zdCBtYW51YWxIb3Vyc1Rvb2wgPSBtYW51YWxBcHByb3ZhbD8udG9vbE5hbWVcbiAgICAgIGNvbnN0IHdhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQgPSBpc0hvdXJzQ2hhcmdlVG9vbChtYW51YWxIb3Vyc1Rvb2wpXG5cbiAgICAgIGlmICh3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkIHx8IHdhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQpIHtcbiAgICAgICAgY29uc3QgdG9vbHMgPSB3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkID8gaG91cnNUb29sc0Zyb21BcHByb3ZhbCA6IG1hbnVhbEhvdXJzVG9vbCA/IFttYW51YWxIb3Vyc1Rvb2xdIDogW11cbiAgICAgICAgZGlzcGF0Y2hNYWlhSG91cnNDaGFyZ2VkKHtcbiAgICAgICAgICBzb3VyY2U6ICdtYWlhJyxcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wZW5UYXNrUGFuZWxJZCAmJiAod2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSB8fCBtYW51YWxXYXNUYXNrRWRpdCB8fCBtYW51YWxXYXNUYXNrRGVsZXRlKSkge1xuICAgICAgICBjb25zdCBtYW51YWxQc2V1ZG9BY3Rpb246IFBlbmRpbmdBY3Rpb24gfCBudWxsID0gbWFudWFsQXBwcm92YWxcbiAgICAgICAgICA/ICh7IHRvb2xfbmFtZTogbWFudWFsQXBwcm92YWwudG9vbE5hbWUsIHRvb2xfYXJnczogbWFudWFsQXBwcm92YWwudG9vbEFyZ3MgPz8ge30gfSBhcyBQZW5kaW5nQWN0aW9uKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBjb25zdCBhZmZlY3RlZFRhc2tJZHMgPSBbXG4gICAgICAgICAgLi4uZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKHBlbmRpbmdBY3Rpb25zKSxcbiAgICAgICAgICAuLi50YXNrSWRzRnJvbVVybHMsXG4gICAgICAgICAgLi4udGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCxcbiAgICAgICAgICAuLi4obWFudWFsUHNldWRvQWN0aW9uID8gZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKFttYW51YWxQc2V1ZG9BY3Rpb25dKSA6IFtdKSxcbiAgICAgICAgXS5tYXAoU3RyaW5nKVxuICAgICAgICBpZiAoYWZmZWN0ZWRUYXNrSWRzLmluY2x1ZGVzKFN0cmluZyhvcGVuVGFza1BhbmVsSWQpKSkge1xuICAgICAgICAgIHdpbmRvdy50YXNrUGFuZWw/LnJlZmV0Y2hUYXNrPy4oKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHttZW1vcnlTZXNzaW9uSWR9YCxcbiAgICAgICAgbWVzc2FnZTogY29udGVudFRvQWRkLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgc291cmNlcyxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zIHx8IFtdLFxuICAgICAgICAuLi4oY3JlYXRlQWdlbnRGb2xsb3dVcCA/IHsgY3JlYXRlQWdlbnRGb2xsb3dVcCB9IDoge30pLFxuICAgICAgfSlcbiAgICAgIGNsZWFyU2Vzc2lvblRhaWwoc2Vzc2lvbklkKVxuXG4gICAgICBpZiAoY3JlYXRlQWdlbnRGb2xsb3dVcD8uYWdlbnRJZCkge1xuICAgICAgICBmZXRjaEFnZW50RGV0YWlsKGNyZWF0ZUFnZW50Rm9sbG93VXAuYWdlbnRJZClcbiAgICAgICAgICAudGhlbihjaGF0QWdlbnQgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDogeyBhZ2VudDogY2hhdEFnZW50IH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t1c2VDaGF0TWFuYWdlcl0gTm8gc2UgcHVkbyBhw7FhZGlyIGVsIGFnZW50ZSByZWNpw6luIGNyZWFkbyBhbCBsaXN0YWRvJywgZXJyKVxuICAgICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0QWdlbnRGb2xsb3dVcD8uYWdlbnRJZCkge1xuICAgICAgICBmZXRjaEFnZW50RGV0YWlsKGVkaXRBZ2VudEZvbGxvd1VwLmFnZW50SWQpXG4gICAgICAgICAgLnRoZW4oY2hhdEFnZW50ID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1zeW5jLWVkaXRlZC1hZ2VudC1mcm9tLWNoYXQnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGFnZW50OiBjaGF0QWdlbnQgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNYW5hZ2VyXSBObyBzZSBwdWRvIHJlZnJlc2NhciBlbCBhZ2VudGUgZWRpdGFkbycsIGVycilcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGNvbnN0IHsgaXNDaGF0Vmlld1Zpc2libGUsIG1hcmtDaGF0QXNSZWFkIH0gPSBnZXRDaGF0c1N0b3JlU3RhdGUoKVxuICAgICAgaWYgKGlzQWN0aXZlICYmIGlzQ2hhdFZpZXdWaXNpYmxlKSB7XG4gICAgICAgIGF3YWl0IG1hcmtDaGF0QXNSZWFkKHNlc3Npb25JZCwgeyBmb3JjZTogdHJ1ZSB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoZmlyc3RUaW1lUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3JlZmV0Y2gtc2Vzc2lvbicpXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzdG9tRXZlbnQpXG4gICAgICAgIGZpcnN0VGltZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgcHJvamVjdCwgZ2V0VGFiVGFza0RlZmF1bHQsIGV2ZW50LCBhZ2VudF1cbiAgKVxuXG4gIC8vIGBwYXJ0aWFsVGV4dGAgbG8gcmVzY2F0YSBgc3RvcFN0cmVhbWAgYW50ZXMgZGUgbGltcGlhciBlbCBzdG9yZSBleHRlcm5vOiBlbCB0ZXh0byBlbiB2aXZvXG4gIC8vIG5vIHZpdmUgZW4gYG1lc3NhZ2VzYCwgYXPDrSBxdWUgc2luIGVzdG8gbGEgcmVzcHVlc3RhIGEgbWVkaWFzIGRlc2FwYXJlY2UgZGUgcGFudGFsbGEgYXVucXVlXG4gIC8vIGVsIGJhY2tlbmQgc8OtIGxhIGhheWEgcGVyc2lzdGlkby5cbiAgY29uc3QgaGFuZGxlU3RyZWFtU3RvcCA9IHVzZUNhbGxiYWNrKFxuICAgIChwYXJ0aWFsVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBFbCBzdG9wIHNpZW1wcmUgYXBsaWNhIGEgbGEgc2VzacOzbiBhY3RpdmEgKGJvdMOzbiBkZWwgaW5wdXQgdmlzaWJsZSkuXG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgICBjb25zdCB0ZW1wTWVzc2FnZUlkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuXG4gICAgICBpZiAocGFydGlhbFRleHQpIHtcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgICAgbWVzc2FnZTogcGFydGlhbFRleHQsXG4gICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBgYW5zd2VyLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fS1jYW5jZWxsZWRgLFxuICAgICAgICBtZXNzYWdlOiB0KCdjaGF0LmNhbmNlbGxlZCcpLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHJ5U25hcHNob3RSZWYuY3VycmVudCA9IG51bGxcbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgdF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQgPSB1c2VDYWxsYmFjayhcbiAgICAoY3R4OiBTdHJlYW1Db250ZXh0LCBhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcblxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGl0bENvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICBtZXNzYWdlSWQ6IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gLFxuICAgICAgICBtZXNzYWdlVGV4dDogYWNjdW11bGF0ZWRDb250ZW50IHx8ICcnLFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgcGVuZGluZ0FjdGlvbnM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyxcbiAgICAgICAgdGhyZWFkSWRzOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/Lm1hcChhY3Rpb24gPT4gYWN0aW9uLnRocmVhZF9pZCksXG4gICAgICB9XG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IGhpdGxDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIGlmIChhcHByb3ZhbC5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQpIHtcbiAgICAgICAgdHJhY2tNYW51YWxIaXRsRXZlbnRzKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHsgaW1wcmVzc2lvbjogRVZFTlRTLmFpQ2hhdEhpdGwsIG9wdGlvbjogRVZFTlRTLmFpQ2hhdEhpdGxPcHRpb24gfSxcbiAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgICB0cmFja2VkTWFudWFsSGl0bEtleXNSZWYuY3VycmVudFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgZmlyc3RBY3Rpb24gPSBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/LlswXVxuICAgICAgICBjb25zdCB0b29sTmFtZSA9IChhcHByb3ZhbCBhcyB7IHRvb2xfbmFtZT86IHN0cmluZyB9KS50b29sX25hbWUgPz8gZmlyc3RBY3Rpb24/LnRvb2xfbmFtZSA/PyAnJ1xuICAgICAgICBjb25zdCB0b29sQXJncyA9XG4gICAgICAgICAgKChhcHByb3ZhbCBhcyB7IHRvb2xfYXJncz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLnRvb2xfYXJncyA/P1xuICAgICAgICAgICAgKGZpcnN0QWN0aW9uPy50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpKSB8fFxuICAgICAgICAgIG51bGxcbiAgICAgICAgaWYgKHRvb2xOYW1lKSB7XG4gICAgICAgICAgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnQgPSB7IHRvb2xOYW1lLCB0b29sQXJncyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYSBtZXNzYWdlIHdpdGggdGhlIGFwcHJvdmFsIHJlcXVlc3RcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gLFxuICAgICAgICBtZXNzYWdlOiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgYXBwcm92YWxTdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgIH0pXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkubWFya0NoYXRBc1VucmVhZChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdhcHByb3ZhbF9yZXF1aXJlZCcpXG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQsIGNvbW1pdFRvU2Vzc2lvbiwgZHJvcEZyb21TZXNzaW9uLCBldmVudF1cbiAgKVxuXG4gIGNvbnN0IHtcbiAgICBhc2tNYWlhLFxuICAgIHJldHJ5Q29tcGxldGlvbixcbiAgICBpc0xvYWRpbmc6IHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgfSA9IHVzZU9yY2hlc3RyYXRvclN0cmVhbSh7XG4gICAgYWN0aXZlU2Vzc2lvbklkLFxuICAgIG9uRXJyb3I6IGhhbmRsZVN0cmVhbUVycm9yLFxuICAgIG9uU3RyZWFtVXBkYXRlOiBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgb25GaW5pc2hTdHJlYW06IGhhbmRsZVN0cmVhbUZpbmlzaCxcbiAgICBvblN0b3A6IGhhbmRsZVN0cmVhbVN0b3AsXG4gICAgb25BcHByb3ZhbFJlcXVpcmVkOiBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLFxuICB9KVxuXG4gIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCA9ICgpID0+IHtcbiAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eShudWxsKVxuICAgIHNldEFjdGl2ZUxvYWRpbmdzKHt9KVxuICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gIH1cblxuICBjb25zdCBjdXJyZW50UHJvamVjdCA9IHByb2plY3RcblxuICBjb25zdCBzZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9ucyxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBUb3BlIGRlIGNvbmN1cnJlbmNpYTogc2kgZXN0YSBzZXNpw7NuIG5vIGVzdMOhIGdlbmVyYW5kbyB5IHlhIGhheVxuICAgICAgLy8gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyBhY3RpdmFzLCBhdmlzYW1vcyB5IG5vIGFycmFuY2Ftb3Mgb3RyYS5cbiAgICAgIGNvbnN0IHdpbGxTdGFydE5ld1N0cmVhbSA9ICFzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgICBpZiAod2lsbFN0YXJ0TmV3U3RyZWFtICYmIHNlc3Npb25TdHJlYW1NYW5hZ2VyLmdldEFjdGl2ZUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIG9wdGlvbnMgfSA9IG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyhhdHRhY2htZW50c09yT3B0aW9ucylcbiAgICAgIC8vIExhcyBtZW50aW9ucyBwdWVkZW4gdmVuaXIgdsOtYSA1dG8gcGFyw6FtZXRybyAoY2FsbCBwb3NpdGlvbmFsIGRlc2RlIGVsIGZvb3RlcilcbiAgICAgIC8vIG8gdsOtYSBTZW5kTWVzc2FnZU9wdGlvbnMgKGNhbGwgcHJvZ3JhbcOhdGljbykuIEVsIHBhcsOhbWV0cm8gZXhwbMOtY2l0byBnYW5hLlxuICAgICAgY29uc3QgZWZmZWN0aXZlTWVudGlvbnMgPSBtZW50aW9ucyA/PyBvcHRpb25zLm1lbnRpb25zXG4gICAgICBjb25zdCBjb250ZXh0TWVzc2FnZTogQ29udGV4dE1lc3NhZ2UgfCB1bmRlZmluZWQgPSBidWlsZENvbnRleHRNZXNzYWdlKGVmZmVjdGl2ZU1lbnRpb25zKVxuICAgICAgY29uc3QgcGF5bG9hZEZ1YUlkID0gZnVhSWQgPz8gb3B0aW9ucy5mdWFJZFxuICAgICAgY29uc3QgcGF5bG9hZFNjSWQgPSBzY0lkID8/IG9wdGlvbnMuc2NJZFxuICAgICAgY29uc3QgcGF5bG9hZENvbnRleHREYXRhID0gb3B0aW9ucy5jb250ZXh0RGF0YVxuICAgICAgY29uc3QgZGlzcGxheU1lc3NhZ2UgPSBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KG1lc3NhZ2UsIHtcbiAgICAgICAgZnVhSWQ6IHBheWxvYWRGdWFJZCxcbiAgICAgICAgc2NJZDogcGF5bG9hZFNjSWQsXG4gICAgICB9KVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIHNldEFjdGl2ZUNoYXRJZChjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgICBjb25zdCBuZXdNZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gbmV3TWVzc2FnZUlkXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBtZXNzYWdlXG5cbiAgICAgIGlmICghcmVwb3J0ZWRFdmVudC5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5wbUFpVHlwZWRUZXh0KVxuICAgICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFZlcmlmaWNhciBzaSBlbCBjb250ZXh0byBnbG9iYWwgZXN0w6EgZGVzYWN0dWFsaXphZG9cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlV2l0aFByb2plY3QgPSBtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG5cbiAgICAgIGNvbnN0IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQ/LlttZXNzYWdlc1JlZi5jdXJyZW50Lmxlbmd0aCAtIDFdPy5hZ2VudElkXG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlwc1Byb2plY3Q6IGN0eENoaXBzUHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIHRhc2s6IGN0eFRhc2ssXG4gICAgICB9ID0gY29udGV4dFJlZi5jdXJyZW50XG5cbiAgICAgIGVuc3VyZVNlc3Npb25JblNpZGViYXIoe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHRpdGxlOiBidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUoZGlzcGxheU1lc3NhZ2UpLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgYWdlbnRJZDogY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgfSlcblxuICAgICAgLy8gTm8gYWdyZWdhciBwcm9qZWN0SWQgYWwgbWVuc2FqZSBkZWwgdXN1YXJpbyAtIHNlIGRldGVybWluYXLDoSBkZXNwdcOpc1xuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogYHF1ZXN0aW9uLSR7Y3VycmVudE1lc3NhZ2VJZC5jdXJyZW50fWAsXG4gICAgICAgIG1lc3NhZ2U6IGRpc3BsYXlNZXNzYWdlLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLlVTRVIsXG4gICAgICAgIHNvdXJjZXM6IGF0dGFjaG1lbnRzLFxuICAgICAgICAuLi4oY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICB9KVxuXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuXG4gICAgICBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBzZXNzaW9uSWRcbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZClcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IHN0cmVhbWluZ1BsYWNlaG9sZGVySWQsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogYWdlbnQ/Lm5hbWUgfHwgJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pXG5cbiAgICAgIGxldCBmaW5hbE1lc3NhZ2UgPSBtZXNzYWdlXG5cbiAgICAgIGlmIChtZXNzYWdlID09PSB0KCdxYS5pdGVtcy5yZW50YWJpbGlkYWRfcHJveWVjdG8nKSkge1xuICAgICAgICBmaW5hbE1lc3NhZ2UgPSBgRkFROiAke3QoJ3FhLml0ZW1zLnJlbnRhYmlsaWRhZF9wcm95ZWN0bycpfSAtIFRpcG8gZGUgcmVudGFiaWxpZGFkOiAke1xuICAgICAgICAgIG9wdGlvbnMucHJvamVjdENoYW5nZWQ/LmluY29tZVR5cGUgfHwgY29udGV4dFJlZi5jdXJyZW50LnByb2plY3Q/LmluY29tZVR5cGVcbiAgICAgICAgfWBcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlzdG9yeSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKGhpc3RvcnlNZXNzYWdlID0+ICh7XG4gICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KSlcblxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VQcm9qZWN0SWQgPSBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0Py5wcm9qZWN0SWRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIGxhc3RNZXNzYWdlUHJvamVjdElkKVxuXG4gICAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZldGNoUHJvamVjdHMoW3Byb2plY3RUb1JlcXVlc3RdKVxuXG4gICAgICBjb25zdCBwYXlsb2FkRmFxSWQgPSBmYXFJZCA/PyBvcHRpb25zLmZhcUlkXG4gICAgICBjb25zdCBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPSBhZ2VudFN1Z2dlc3Rpb25JZCA/PyBvcHRpb25zLmFnZW50U3VnZ2VzdGlvbklkXG5cbiAgICAgIGNvbnN0IHBheWxvYWREYXRhID0ge1xuICAgICAgICBtZXNzYWdlOiBmaW5hbE1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBhZ2VudElkOiBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihwcm9qZWN0cz8ubGVuZ3RoID8geyBwcm9qZWN0TmFtZTogcHJvamVjdHNbMF0ubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkRmFxSWQgPyB7IGZhcUlkOiBwYXlsb2FkRmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZ1YUlkID8geyBmdWFJZDogcGF5bG9hZEZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkU2NJZCA/IHsgc2NJZDogcGF5bG9hZFNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW1vamkgIT0gbnVsbCA/IHsgYWdlbnRFbW9qaTogYWdlbnQuZW1vamkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZENvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogcGF5bG9hZENvbnRleHREYXRhIH0gOiB7fSksXG4gICAgICB9XG5cbiAgICAgIGFza01haWEocGF5bG9hZERhdGEpXG4gICAgfSxcbiAgICBbXG4gICAgICBhZGRNZXNzYWdlLFxuICAgICAgY29tbWl0VG9TZXNzaW9uLFxuICAgICAgZXZlbnQsXG4gICAgICBhc2tNYWlhLFxuICAgICAgcHJvamVjdCxcbiAgICAgIGNsaWVudCxcbiAgICAgIHRhc2ssXG4gICAgICBjaGlwc1Byb2plY3QsXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgdCxcbiAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGNoYW5nZVByb2plY3QgPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCkgcmV0dXJuXG5cbiAgICAgIGlmIChvcHRpb24uaWQgIT09IHByb2plY3Q/LmlkKSB7XG4gICAgICAgIHNldFByb2plY3Qob3B0aW9uKVxuICAgICAgfVxuXG4gICAgICBpZiAocHJvamVjdCAmJiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgaGlzdG9yeSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKGhpc3RvcnlNZXNzYWdlID0+ICh7XG4gICAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICB9KSlcblxuICAgICAgICBhc2tNYWlhKHtcbiAgICAgICAgICBtZXNzYWdlOiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKG9wdGlvbi5mZWVJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9uPy5jbGllbnRJZCAhPSBudWxsID8geyBjbGllbnRJZDogTnVtYmVyKG9wdGlvbi5jbGllbnRJZCkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LmVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eTogYWdlbnQuZW50aXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW3Byb2plY3QsIHNldFByb2plY3QsIGFza01haWEsIGF1dGhVc2VyLCBpc1dlYlNlYXJjaEFjdGl2ZSwgYWdlbnRdXG4gIClcblxuICBjb25zdCByZXRyeU1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCB8fCB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzKSByZXR1cm5cblxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuaXNBY3RpdmUoc2Vzc2lvbklkKSkgcmV0dXJuXG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXNNZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICghcHJldmlvdXNNZXNzYWdlcy5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gbWVzc2FnZS5pZCkpIHJldHVyblxuXG4gICAgICBjb25zdCB1c2VyTWVzc2FnZSA9IGZpbmRVc2VyTWVzc2FnZUZvclJldHJ5KHByZXZpb3VzTWVzc2FnZXMsIG1lc3NhZ2UpXG4gICAgICBpZiAoIXVzZXJNZXNzYWdlPy5tZXNzYWdlPy50cmltKCkgJiYgIXVzZXJNZXNzYWdlPy5hdHRhY2htZW50cz8ubGVuZ3RoICYmICF1c2VyTWVzc2FnZT8uc291cmNlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0dXJuSWQgPSByZXNvbHZlUmV0cnlUdXJuSWQobWVzc2FnZSlcbiAgICAgIGNvbnN0IHVzZU9yY2hlc3RyYXRvckZhbGxiYWNrID0gbWVzc2FnZS5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmICFtZXNzYWdlLm1lbW9yeVNlc3Npb25JZD8udHJpbSgpXG4gICAgICBpZiAoIXR1cm5JZCAmJiAhdXNlT3JjaGVzdHJhdG9yRmFsbGJhY2spIHJldHVyblxuXG4gICAgICBjb25zdCB0cnVuY2F0ZWQgPSBtZXNzYWdlc1dpdGhvdXRSZXRyaWVkVHVybihwcmV2aW91c01lc3NhZ2VzLCBtZXNzYWdlKVxuXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIHJldHJ5U25hcHNob3RSZWYuY3VycmVudCA9IHByZXZpb3VzTWVzc2FnZXNcbiAgICAgIHNldEFjdGl2ZUNoYXRJZChzZXNzaW9uSWQpXG5cbiAgICAgIGNvbnN0IG5ld01lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSBuZXdNZXNzYWdlSWRcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IHVzZXJNZXNzYWdlLm1lc3NhZ2VcbiAgICAgIGNvbnN0IHN0cmVhbWluZ1BsYWNlaG9sZGVySWQgPSBgYW5zd2VyLSR7bmV3TWVzc2FnZUlkfS1zdHJlYW1pbmdgXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBzdHJlYW1pbmdQbGFjZWhvbGRlcklkXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IHNlc3Npb25JZFxuXG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogQ2hhdE1lc3NhZ2UgPSB7XG4gICAgICAgIGlkOiBzdHJlYW1pbmdQbGFjZWhvbGRlcklkLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6IGFnZW50Py5uYW1lIHx8ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9XG4gICAgICBjb25zdCBuZXh0TWVzc2FnZXMgPSBbLi4udHJ1bmNhdGVkLCBwbGFjZWhvbGRlcl1cbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBuZXh0TWVzc2FnZXNcbiAgICAgIHJlcGxhY2VNZXNzYWdlcyhuZXh0TWVzc2FnZXMpXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHN0cmVhbWluZ1BsYWNlaG9sZGVySWQpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICB0YXNrOiBjdHhUYXNrLFxuICAgICAgfSA9IGNvbnRleHRSZWYuY3VycmVudFxuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VXaXRoUHJvamVjdCA9IHRydW5jYXRlZC5maWx0ZXIobXNnID0+IG1zZy5wcm9qZWN0SWQpLmF0KC0xKVxuICAgICAgY29uc3QgcHJvamVjdFRvUmVxdWVzdCA9IHJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0KGN0eENoaXBzUHJvamVjdCwgbGFzdE1lc3NhZ2VXaXRoUHJvamVjdD8ucHJvamVjdElkKVxuICAgICAgY29uc3QgY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzID0gdHJ1bmNhdGVkLmF0KC0xKT8uYWdlbnRJZCB8fCBtZXNzYWdlLmFnZW50SWRcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gQXJyYXkuaXNBcnJheSh1c2VyTWVzc2FnZS5hdHRhY2htZW50cylcbiAgICAgICAgPyB1c2VyTWVzc2FnZS5hdHRhY2htZW50c1xuICAgICAgICA6IEFycmF5LmlzQXJyYXkodXNlck1lc3NhZ2Uuc291cmNlcylcbiAgICAgICAgICA/IHVzZXJNZXNzYWdlLnNvdXJjZXNcbiAgICAgICAgICA6IFtdXG5cbiAgICAgIGNvbnN0IHJlcGxheVZpYU9yY2hlc3RyYXRvciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgaGlzdG9yeSA9IHRydW5jYXRlZC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIH0pKVxuICAgICAgICBjb25zdCBwcm9qZWN0cyA9IHByb2plY3RUb1JlcXVlc3QgPyBhd2FpdCBmZXRjaFByb2plY3RzKFtwcm9qZWN0VG9SZXF1ZXN0XSkgOiBudWxsXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXNrTWFpYSh7XG4gICAgICAgICAgbWVzc2FnZTogdXNlck1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgICBoaXN0b3J5LFxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2hhdElkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZUlkOiBuZXdNZXNzYWdlSWQsXG4gICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICBhZ2VudElkOiBTdHJpbmcoY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCB8fCAnJyksXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgICAgLi4uKHByb2plY3RzPy5sZW5ndGggPyB7IHByb2plY3ROYW1lOiBwcm9qZWN0c1swXS5uYW1lIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGxcbiAgICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py5lbW9qaSAhPSBudWxsID8geyBhZ2VudEVtb2ppOiBhZ2VudC5lbW9qaSB9IDoge30pLFxuICAgICAgICAgIC4uLih1c2VyTWVzc2FnZS5jb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2U6IHVzZXJNZXNzYWdlLmNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFyZXN1bHQuc3RhcnRlZCkge1xuICAgICAgICAgIHJldHJ5U25hcHNob3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gcHJldmlvdXNNZXNzYWdlc1xuICAgICAgICAgIHJlcGxhY2VNZXNzYWdlcyhwcmV2aW91c01lc3NhZ2VzKVxuICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAnbGltaXQnKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayB8fCAhdHVybklkKSB7XG4gICAgICAgIGF3YWl0IHJlcGxheVZpYU9yY2hlc3RyYXRvcigpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXRyeUNvbXBsZXRpb24oe1xuICAgICAgICBjaGF0SWQ6IHNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZUlkOiBuZXdNZXNzYWdlSWQsXG4gICAgICAgIG1lbW9yeVNlc3Npb25JZDogdHVybklkLFxuICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICBhZ2VudElkOiBTdHJpbmcoY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCB8fCAnJyksXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgIC4uLihhZ2VudD8udHlwZSAhPSBudWxsID8geyBhZ2VudFR5cGU6IGFnZW50LnR5cGUgfSA6IHt9KSxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihwcm9qZWN0VG9SZXF1ZXN0ID8geyBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QgfSA6IHt9KSxcbiAgICAgICAgLi4ucmVzb2x2ZUNsaWVudFBheWxvYWQoY3R4Q2xpZW50LCBjdHhQcm9qZWN0KSxcbiAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGwgPyB7IHRhc2tJZDogTnVtYmVyKGN0eFRhc2suaWQpIH0gOiB7fSksXG4gICAgICB9KVxuXG4gICAgICBpZiAocmVzdWx0LnN0YXJ0ZWQpIHJldHVyblxuXG4gICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gJ3R1cm5fbm90X2ZvdW5kJykge1xuICAgICAgICBhd2FpdCByZXBsYXlWaWFPcmNoZXN0cmF0b3IoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IHByZXZpb3VzTWVzc2FnZXNcbiAgICAgIHJlcGxhY2VNZXNzYWdlcyhwcmV2aW91c01lc3NhZ2VzKVxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gJ2xpbWl0Jykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICAgIHJlcGxhY2VNZXNzYWdlcyxcbiAgICAgIHJldHJ5Q29tcGxldGlvbixcbiAgICAgIGFza01haWEsXG4gICAgICBmZXRjaFByb2plY3RzLFxuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIHQsXG4gICAgICBzZXRBY3RpdmVDaGF0SWQsXG4gICAgXVxuICApXG5cbiAgY29uc3QgaGFuZGxlRmVlZGJhY2sgPSB1c2VDYWxsYmFjayhhc3luYyAoZmVlZGJhY2tQcm9wOiBGZWVkYmFjaywgY2hhdE1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLkNoYXRzLndhc0hlbHBmdWxDaGF0KGNoYXRNZXNzYWdlSWQsIGZlZWRiYWNrUHJvcCA9PT0gRmVlZGJhY2suVEhVTUJTX1VQKVxuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKG1lc3NhZ2UgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gY2hhdE1lc3NhZ2VJZCAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgd2FzSGVscGZ1bDogZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlXG4gICAgICB9KVxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlQXBwcm92YWxEZWNpc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIHRocmVhZElkczogc3RyaW5nW10sXG4gICAgICBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcsXG4gICAgICBlZGl0ZWRBY3Rpb25zPzogQXJyYXk8eyB0b29sX25hbWU6IHN0cmluZzsgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT5cbiAgICApID0+IHtcbiAgICAgIGlmICghdGhyZWFkSWRzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gdGhyZWFkX2lkcyBwcm92aWRlZCBmb3IgYXBwcm92YWwgZGVjaXNpb24nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmQgPSBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEJ5VGhyZWFkSWRzKHRocmVhZElkcywgbWVzc2FnZXNSZWYuY3VycmVudClcbiAgICAgIGlmICghZm91bmQ/Lm1lc3NhZ2UuYXBwcm92YWwpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2UgZW5jb250csOzIG1lbnNhamUgY29uIGFwcHJvdmFsIHBhcmEgdGhyZWFkX2lkczonLCB0aHJlYWRJZHMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IG1lc3NhZ2U6IG1lc3NhZ2VXaXRoQXBwcm92YWwsIHNlc3Npb25JZDogZm91bmRTZXNzaW9uSWQgfSA9IGZvdW5kXG4gICAgICBjb25zdCB7IGFwcHJvdmFsIH0gPSBtZXNzYWdlV2l0aEFwcHJvdmFsXG4gICAgICBpZiAoIWFwcHJvdmFsKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBhcHByb3ZhbC5zZXNzaW9uX2lkIHx8IGZvdW5kU2Vzc2lvbklkXG4gICAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZXNzaW9uX2lkIGRpc3BvbmlibGUgcGFyYSBhcHByb3ZhbDonLCB0aHJlYWRJZHMpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuaXNBY3RpdmUoc2Vzc2lvbklkKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHNlc3Npb25TdHJlYW1NYW5hZ2VyLmdldEFjdGl2ZUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VXaXRoQXBwcm92YWwuaWRcbiAgICAgIGNvbnN0IG5ld1N0YXR1cyA9IGRlY2lzaW9uID09PSAnYXBwcm92ZScgPyAnYXBwcm92ZWQnIDogJ3JlamVjdGVkJ1xuICAgICAgY29uc3QgaGl0bENvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgIG1lc3NhZ2VUZXh0OiBtZXNzYWdlV2l0aEFwcHJvdmFsLm1lc3NhZ2UsXG4gICAgICAgIGFwcHJvdmFsLFxuICAgICAgICBwZW5kaW5nQWN0aW9uczogYXBwcm92YWwucGVuZGluZ19hY3Rpb25zLFxuICAgICAgICB0aHJlYWRJZHMsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKVxuICAgICAgaWYgKGlzQWN0aXZlU2Vzc2lvbikge1xuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gaGl0bENvbnRleHRcbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHsgLi4ubWVzc2FnZVdpdGhBcHByb3ZhbCwgYXBwcm92YWxTdGF0dXM6IG5ld1N0YXR1cyB9KVxuXG4gICAgICBjb25zdCBzdHJlYW1NZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgaWYgKGlzQWN0aXZlU2Vzc2lvbikge1xuICAgICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSBzdHJlYW1NZXNzYWdlSWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGl0bEN0eDogU3RyZWFtQ29udGV4dCA9IHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IHN0cmVhbU1lc3NhZ2VJZCxcbiAgICAgICAgcGxhY2Vob2xkZXJJZDogYGFuc3dlci0ke3N0cmVhbU1lc3NhZ2VJZH0tc3RyZWFtaW5nYCxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcgPSAoKSA9PiB7XG4gICAgICAgIGlmICghaXNBY3RpdmVTZXNzaW9uKSByZXR1cm5cbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uU3RyZWFtTWFuYWdlci5zdGFydENvbnRpbnVlU3RyZWFtKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBwbGFjZWhvbGRlcklkOiBoaXRsQ3R4LnBsYWNlaG9sZGVySWQsXG4gICAgICAgIGNvbnRpbnVlUmVxdWVzdDoge1xuICAgICAgICAgIHRocmVhZElkcyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IGFwcHJvdmFsLnNlc3Npb25faWQsXG4gICAgICAgICAgZGVjaXNpb246IGVkaXRlZEFjdGlvbnMgPyAnZWRpdCcgOiBkZWNpc2lvbixcbiAgICAgICAgICBlZGl0ZWRBY3Rpb25zLFxuICAgICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCB8fCAnJyxcbiAgICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICB9LFxuICAgICAgICB0LFxuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bENvbnRleHQsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSxcbiAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgb25TdHJlYW1VcGRhdGU6IGNvbnRlbnQgPT4gaGFuZGxlU3RyZWFtVXBkYXRlKGhpdGxDdHgsIGNvbnRlbnQpLFxuICAgICAgICAgIG9uRmluaXNoU3RyZWFtOiBmaW5pc2hQYXlsb2FkID0+IHtcbiAgICAgICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgICAgIGhhbmRsZVN0cmVhbUZpbmlzaChcbiAgICAgICAgICAgICAgaGl0bEN0eCxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5jb250ZW50LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLnNvdXJjZXMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQubWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLnN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbXBsZXRlZEFnZW50SWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgICAgIGhhbmRsZVN0cmVhbUVycm9yKGhpdGxDdHgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkFwcHJvdmFsUmVxdWlyZWQ6IChhcHByb3ZhbFBheWxvYWQsIGFjY3VtdWxhdGVkQ29udGVudCkgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxSZXF1aXJlZChoaXRsQ3R4LCBhcHByb3ZhbFBheWxvYWQsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXN1bHQuc3RhcnRlZCkge1xuICAgICAgICByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZygpXG4gICAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAnbGltaXQnKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbixcbiAgICAgIGhhbmRsZVN0cmVhbUVycm9yLFxuICAgICAgaGFuZGxlU3RyZWFtVXBkYXRlLFxuICAgICAgaGFuZGxlU3RyZWFtRmluaXNoLFxuICAgICAgaGFuZGxlQXBwcm92YWxSZXF1aXJlZCxcbiAgICAgIHQsXG4gICAgXVxuICApXG5cbiAgY29uc3QgaW5pdGlhbGl6ZUNoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmaXJzdFRpbWVSZWYuY3VycmVudCkge1xuICAgICAgZmlyc3RUaW1lUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgfVxuICAgIGlmIChpbml0aWFsQ2hhdElkKSB7XG4gICAgICBhd2FpdCBsb2FkTWVzc2FnZXMoKVxuICAgIH0gZWxzZSBpZiAodXNlckluaXRpYWxNZXNzYWdlKSB7XG4gICAgICBjb25zdCBoYXNJbml0aWFsTWVzc2FnZSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2U/LnRyaW0oKSlcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxBdHRhY2htZW50cyA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGgpXG4gICAgICBjb25zdCBoYXNJbml0aWFsRmFxID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQpXG4gICAgICBjb25zdCBoYXNJbml0aWFsRnVhID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQpXG4gICAgICBjb25zdCBoYXNJbml0aWFsU2MgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkKVxuXG4gICAgICBpZiAoIWhhc0luaXRpYWxNZXNzYWdlICYmICFoYXNJbml0aWFsQXR0YWNobWVudHMgJiYgIWhhc0luaXRpYWxGYXEgJiYgIWhhc0luaXRpYWxGdWEgJiYgIWhhc0luaXRpYWxTYykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGlzdG9yeSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQubWFwKGhpc3RvcnlNZXNzYWdlID0+ICh7XG4gICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIHJvbGU6IGhpc3RvcnlNZXNzYWdlLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgPyBDaGF0SGlzdG9yeVJvbGUuVVNFUiA6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KSlcblxuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlwc1Byb2plY3Q6IGN0eENoaXBzUHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIHRhc2s6IGN0eFRhc2ssXG4gICAgICB9ID0gY29udGV4dFJlZi5jdXJyZW50XG4gICAgICBjb25zdCBwcm9qZWN0VG9SZXF1ZXN0ID0gcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QoY3R4Q2hpcHNQcm9qZWN0LCBudWxsKSA/PyBjdHhQcm9qZWN0Py5pZCA/PyBudWxsXG5cbiAgICAgIGNvbnNvbGUuaW5mbygnW3VzZUNoYXRNYW5hZ2VyXSBQQVRIPWluaXRpYWxpemVDaGF0L3VzZXJJbml0aWFsTWVzc2FnZSDigJQgY29udGV4dFJlZiByZXNvbHV0aW9uOicsIHtcbiAgICAgICAgcHJvamVjdFByb3BJZDogY3R4UHJvamVjdD8uaWQgPz8gbnVsbCxcbiAgICAgICAgY2xpZW50SWQ6IGN0eENsaWVudD8uaWQgPz8gbnVsbCxcbiAgICAgICAgdGFza0lkOiBjdHhUYXNrPy5pZCA/PyBudWxsLFxuICAgICAgICBjaGlwc1Byb2plY3RJZDogY3R4Q2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgPz8gbnVsbCxcbiAgICAgICAgcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGluaXRpYWxEaXNwbGF5TWVzc2FnZSA9IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsIHtcbiAgICAgICAgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCxcbiAgICAgICAgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQsXG4gICAgICB9KVxuXG4gICAgICBlbnN1cmVTZXNzaW9uSW5TaWRlYmFyKHtcbiAgICAgICAgc2Vzc2lvbklkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIHRpdGxlOiBidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUoaW5pdGlhbERpc3BsYXlNZXNzYWdlKSxcbiAgICAgICAgYWdlbnQsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIGF0dGFjaG1lbnRzOiB1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHMsXG4gICAgICB9KVxuXG4gICAgICBhc2tNYWlhKHtcbiAgICAgICAgbWVzc2FnZTogdXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgIGhpc3RvcnksXG4gICAgICAgIHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICBmaXJzdE5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lISxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkISxcbiAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5uYW1lID8geyBwcm9qZWN0TmFtZTogY3R4UHJvamVjdC5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihjdHhUYXNrPy5pZCAhPSBudWxsXG4gICAgICAgICAgPyB7IHRhc2tJZDogTnVtYmVyKGN0eFRhc2suaWQpLCAuLi4oY3R4VGFzay5uYW1lID8geyB0YXNrTmFtZTogY3R4VGFzay5uYW1lIH0gOiB7fSkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgPyB7IGZhcUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkID8geyBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCA/IHsgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW1vamkgIT0gbnVsbCA/IHsgYWdlbnRFbW9qaTogYWdlbnQuZW1vamkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKVxuICAgICAgICAgID8geyBjb250ZXh0TWVzc2FnZTogYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5jb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHVzZXJJbml0aWFsTWVzc2FnZS5jb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtcbiAgICBpbml0aWFsQ2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBwcm9qZWN0LFxuICAgIGNsaWVudCxcbiAgICB0YXNrLFxuICAgIGF1dGhVc2VyLFxuICAgIGFnZW50LFxuICAgIGFza01haWEsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICBdKVxuXG4gIGNvbnN0IHJlc2V0Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBwcmV2aW91c1Nlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHByZXZpb3VzU2Vzc2lvbklkKVxuICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50ID0gbnVsbFxuICAgIGN1cnJlbnRDaGF0SWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgc2V0QWN0aXZlU2Vzc2lvbklkKGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSBmYWxzZVxuICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBzZXRBY3RpdmVDaGF0SWQobnVsbClcbiAgfSwgW3NldEFjdGl2ZUNoYXRJZF0pXG5cbiAgY29uc3Qgc3RvcEdlbmVyYXRpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc3RvcFN0cmVhbWluZygpXG4gICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9LCBbc3RvcFN0cmVhbWluZ10pXG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlcyxcbiAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgYWN0aXZlTG9hZGluZ3MsXG4gICAgY3VycmVudFByb2plY3QsXG4gICAgY3VycmVudENoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgIGN1cnJlbnRNZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcblxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHJldHJ5TWVzc2FnZSxcbiAgICBjaGFuZ2VQcm9qZWN0LFxuICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24sXG4gICAgaGFuZGxlU2Nyb2xsLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIHJlc2V0Q2hhdCxcbiAgICBzdG9wR2VuZXJhdGlvbixcblxuICAgIGlzRGlzYWJsZWQ6IHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZXMsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFdBQVcsRUFBRUMsTUFBTSxFQUFFQyxTQUFTLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLEVBQUUsSUFBSUMsTUFBTSxRQUFRLE1BQU07QUFDbkMsU0FBU0MsZUFBZSxRQUFRLG9CQUFvQjtBQUNwRCxTQUFTQyxxQkFBcUIsUUFBUSwwQkFBMEI7QUFDaEUsU0FBU0MsSUFBSSxRQUFRLFNBQVM7QUFHOUIsU0FBU0MsT0FBTyxRQUFpQix3QkFBd0I7QUFDekQsU0FBU0MsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQy9ELFNBQVNDLE1BQU0sRUFBRUMsUUFBUSxRQUFRLGFBQWE7QUFDOUMsT0FBT0MsSUFBSSxNQUFNLHFCQUFxQjtBQUN0QyxTQUFTQyxRQUFRLFFBQVEsNERBQTREO0FBQ3JGLFNBQXVDQyxlQUFlLFFBQXdDLGtCQUFrQjtBQUNoSCxTQUF5Q0MsbUJBQW1CLFFBQVEsNEJBQTRCO0FBQ2hHLFNBQVNDLGtDQUFrQyxRQUFRLHNDQUFzQztBQUd6RixTQUFTQyxXQUFXLFFBQVEsZ0JBQWdCO0FBQzVDLFNBQVNDLGlCQUFpQixRQUFRLHNCQUFzQjtBQUN4RCxTQUFTQyxzQkFBc0IsUUFBUSwwQkFBMEI7QUFDakUsU0FBU0Msd0JBQXdCLEVBQUVDLGlCQUFpQixRQUFRLG1DQUFtQztBQUMvRixTQUFTQyxnQkFBZ0IsUUFBUSw2Q0FBNkM7QUFDOUUsU0FDRUMsdUJBQXVCLEVBQ3ZCQyx5QkFBeUIsRUFDekJDLHFCQUFxQixFQUNyQkMscUJBQXFCLFFBQ2hCLDJCQUEyQjtBQUVsQyxTQUFTQyxvQkFBb0IsUUFBUSwyQ0FBMkM7QUFDaEYsU0FBU0MsZ0JBQWdCLFFBQVEsdUNBQXVDO0FBQ3hFLFNBQVNDLGNBQWMsUUFBUSxxQ0FBcUM7QUFDcEUsU0FBU0Msb0JBQW9CLEVBQUVDLHNCQUFzQixRQUFRLDJDQUEyQztBQUN4RyxTQUFTQyxVQUFVLFFBQVEsaUNBQWlDO0FBQzVELFNBQVNDLGlDQUFpQyxRQUFRLDJDQUEyQztBQUM3RixTQUFTQyx3QkFBd0IsRUFBRUMsc0JBQXNCLFFBQVEsb0NBQW9DO0FBQ3JHLFNBQVNDLCtCQUErQixRQUFRLG9DQUFvQztBQUNwRixTQUFTQyx1QkFBdUIsRUFBRUMsMEJBQTBCLEVBQUVDLGtCQUFrQixRQUFRLDZCQUE2QjtBQUVySCxTQUFTQyxrQkFBa0IsRUFBRUMsYUFBYSxRQUFRLDJCQUEyQjtBQUk3RSxJQUFNQyx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQXdCQSxDQUFJQyxvQkFBMkMsRUFBSztFQUFBLElBQUFDLG9CQUFBO0VBQ2hGLElBQUlDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDSCxvQkFBb0IsQ0FBQyxFQUFFO0lBQ3ZDLE9BQU87TUFBRUksV0FBVyxFQUFFSixvQkFBb0I7TUFBRUssT0FBTyxFQUFFLENBQUM7SUFBd0IsQ0FBQztFQUNqRjtFQUVBLElBQU1BLE9BQTJCLEdBQUdMLG9CQUFvQixhQUFwQkEsb0JBQW9CLGNBQXBCQSxvQkFBb0IsR0FBSSxDQUFDLENBQUM7RUFDOUQsT0FBTztJQUFFSSxXQUFXLEdBQUFILG9CQUFBLEdBQUVJLE9BQU8sQ0FBQ0QsV0FBVyxjQUFBSCxvQkFBQSxjQUFBQSxvQkFBQSxHQUFJLEVBQUU7SUFBRUksT0FBTyxFQUFQQTtFQUFRLENBQUM7QUFDNUQsQ0FBQzs7QUFFRDtBQUNBLElBQU1DLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBdUJBLENBQzNCQyxZQUF1RCxFQUN2REMsb0JBQXdELEVBQ3RDO0VBQ2xCLElBQU1DLGNBQWMsR0FBR0YsWUFBWSxhQUFaQSxZQUFZLGVBQVpBLFlBQVksQ0FBRUcsU0FBUyxHQUFHQyxNQUFNLENBQUNKLFlBQVksQ0FBQ0csU0FBUyxDQUFDLEdBQUcsSUFBSTtFQUN0RixJQUFJRCxjQUFjLElBQUksSUFBSSxJQUFJRSxNQUFNLENBQUNDLFFBQVEsQ0FBQ0gsY0FBYyxDQUFDLEVBQUU7SUFDN0QsT0FBT0EsY0FBYztFQUN2QjtFQUNBLElBQUlELG9CQUFvQixJQUFJLElBQUksRUFBRTtJQUNoQyxJQUFNSyxNQUFNLEdBQUdGLE1BQU0sQ0FBQ0gsb0JBQW9CLENBQUM7SUFDM0MsT0FBT0csTUFBTSxDQUFDQyxRQUFRLENBQUNDLE1BQU0sQ0FBQyxHQUFHQSxNQUFNLEdBQUcsSUFBSTtFQUNoRDtFQUNBLE9BQU8sSUFBSTtBQUNiLENBQUM7QUFFRCxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUN4QkMsU0FBNEQsRUFDNURDLFVBQXNDLEVBQ1M7RUFBQSxJQUFBQyxrQkFBQTtFQUMvQyxJQUFJRixTQUFTLGFBQVRBLFNBQVMsZUFBVEEsU0FBUyxDQUFFRyxFQUFFLEVBQUU7SUFDakIsT0FBQUMsYUFBQTtNQUFTQyxRQUFRLEVBQUVMLFNBQVMsQ0FBQ0c7SUFBRSxHQUFNSCxTQUFTLENBQUNNLElBQUksR0FBRztNQUFFQyxVQUFVLEVBQUVQLFNBQVMsQ0FBQ007SUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzNGO0VBQ0EsSUFBSSxDQUFBTCxVQUFVLGFBQVZBLFVBQVUsdUJBQVZBLFVBQVUsQ0FBRUksUUFBUSxLQUFJLElBQUksRUFBRTtJQUNoQyxPQUFPO01BQUVBLFFBQVEsRUFBRVQsTUFBTSxDQUFDSyxVQUFVLENBQUNJLFFBQVE7SUFBRSxDQUFDO0VBQ2xEO0VBQ0EsSUFBSUosVUFBVSxhQUFWQSxVQUFVLGdCQUFBQyxrQkFBQSxHQUFWRCxVQUFVLENBQUVPLE1BQU0sY0FBQU4sa0JBQUEsZUFBbEJBLGtCQUFBLENBQW9CQyxFQUFFLEVBQUU7SUFDMUIsT0FBQUMsYUFBQTtNQUNFQyxRQUFRLEVBQUVKLFVBQVUsQ0FBQ08sTUFBTSxDQUFDTDtJQUFFLEdBQzFCRixVQUFVLENBQUNPLE1BQU0sQ0FBQ0YsSUFBSSxHQUFHO01BQUVDLFVBQVUsRUFBRU4sVUFBVSxDQUFDTyxNQUFNLENBQUNGO0lBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUU1RTtFQUNBLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELElBQU1HLDZCQUE2QixHQUFHLFNBQWhDQSw2QkFBNkJBLENBQUlDLGNBQXVCLEVBQXVCO0VBQ25GLElBQUksQ0FBQ3ZCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDc0IsY0FBYyxDQUFDLEVBQUU7SUFDbEMsT0FBTyxFQUFFO0VBQ1g7RUFFQSxPQUFPQSxjQUFjLENBQ2xCQyxNQUFNLENBQUMsVUFBQ0MsVUFBVTtJQUFBLE9BQTRDLENBQUMsQ0FBQ0EsVUFBVSxJQUFJQyxPQUFBLENBQU9ELFVBQVUsTUFBSyxRQUFRO0VBQUEsRUFBQyxDQUM3R0UsR0FBRyxDQUFDLFVBQUNGLFVBQVUsRUFBRUcsS0FBSyxFQUFLO0lBQzFCLElBQU1ULElBQUksR0FDUixPQUFPTSxVQUFVLENBQUNOLElBQUksS0FBSyxRQUFRLElBQUlNLFVBQVUsQ0FBQ04sSUFBSSxDQUFDVSxJQUFJLENBQUMsQ0FBQyxHQUFHSixVQUFVLENBQUNOLElBQUksQ0FBQ1UsSUFBSSxDQUFDLENBQUMsV0FBQUMsTUFBQSxDQUFXRixLQUFLLEdBQUcsQ0FBQyxDQUFFO0lBQzlHLElBQU1HLElBQUksR0FBRyxPQUFPTixVQUFVLENBQUNNLElBQUksS0FBSyxRQUFRLElBQUlOLFVBQVUsQ0FBQ00sSUFBSSxDQUFDRixJQUFJLENBQUMsQ0FBQyxHQUFHSixVQUFVLENBQUNNLElBQUksQ0FBQ0YsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLO0lBQzNHLElBQU1HLFFBQVEsR0FBRyxPQUFPUCxVQUFVLENBQUNRLFNBQVMsS0FBSyxRQUFRLEdBQUdSLFVBQVUsQ0FBQ1EsU0FBUyxHQUFHLEVBQUU7SUFDckYsSUFBTUMsWUFBWSxHQUFHZixJQUFJLENBQUNnQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUdoQixJQUFJLE1BQUFXLE1BQUEsQ0FBTVgsSUFBSSxPQUFBVyxNQUFBLENBQUlDLElBQUksQ0FBRTtJQUNsRSxJQUFNSyxXQUFXLEdBQ2YsT0FBT1gsVUFBVSxDQUFDWSxJQUFJLEtBQUssUUFBUSxHQUMvQlosVUFBVSxDQUFDWSxJQUFJLEdBQ2Y1QixNQUFNLENBQUNDLFFBQVEsQ0FBQ0QsTUFBTSxDQUFDZ0IsVUFBVSxDQUFDWSxJQUFJLENBQUMsQ0FBQyxHQUN0QzVCLE1BQU0sQ0FBQ2dCLFVBQVUsQ0FBQ1ksSUFBSSxDQUFDLEdBQ3ZCLENBQUM7SUFFVCxPQUFPO01BQ0xDLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsRUFBRSxFQUFFTCxZQUFZLEVBQUU7UUFBRUgsSUFBSSxFQUFFQztNQUFTLENBQUMsQ0FBQztNQUNwRGhCLEVBQUUsRUFDQSxPQUFPUyxVQUFVLENBQUNULEVBQUUsS0FBSyxRQUFRLElBQUlTLFVBQVUsQ0FBQ1QsRUFBRSxDQUFDYSxJQUFJLENBQUMsQ0FBQyxHQUNyREosVUFBVSxDQUFDVCxFQUFFLHFCQUFBYyxNQUFBLENBQ0tGLEtBQUssT0FBQUUsTUFBQSxDQUFJSSxZQUFZLENBQUU7TUFDL0NmLElBQUksRUFBSkEsSUFBSTtNQUNKa0IsSUFBSSxFQUFFRCxXQUFXO01BQ2pCTCxJQUFJLEVBQUpBLElBQUk7TUFDSlMsWUFBWSxFQUFFLE9BQU9mLFVBQVUsQ0FBQ2UsWUFBWSxLQUFLLFFBQVEsR0FBR2YsVUFBVSxDQUFDZSxZQUFZLEdBQUdDLFNBQVM7TUFDL0ZDLGFBQWEsRUFBRSxPQUFPakIsVUFBVSxDQUFDaUIsYUFBYSxLQUFLLFFBQVEsR0FBR2pCLFVBQVUsQ0FBQ2lCLGFBQWEsR0FBR0QsU0FBUztNQUNsR0UsUUFBUSxFQUFFLE9BQU9sQixVQUFVLENBQUNrQixRQUFRLEtBQUssUUFBUSxHQUFHbEIsVUFBVSxDQUFDa0IsUUFBUSxHQUFHRixTQUFTO01BQ25GRyxJQUFJLEVBQUVuQixVQUFVLENBQUNtQixJQUFJLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRztJQUN4RCxDQUFDO0VBQ0gsQ0FBQyxDQUFDO0FBQ04sQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0Msb0NBQW9DQSxDQUFDQyxjQUErQixFQUFZO0VBQ3ZGLElBQU1DLEdBQWEsR0FBRyxFQUFFO0VBQ3hCLElBQU1DLE1BQU0sR0FBRyxTQUFUQSxNQUFNQSxDQUFJQyxHQUFZLEVBQUs7SUFDL0IsSUFBSUEsR0FBRyxJQUFJLElBQUksRUFBRTtJQUNqQixJQUFNQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDSCxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDeEMsTUFBTSxDQUFDNEMsS0FBSyxDQUFDSCxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFDTyxJQUFJLENBQUNKLENBQUMsQ0FBQztFQUNuQyxDQUFDO0VBQ0RKLGNBQWMsQ0FBQ1MsT0FBTyxDQUFDLFVBQUFDLE1BQU0sRUFBSTtJQUFBLElBQUFDLFlBQUE7SUFDL0IsSUFBSSxDQUFDRCxNQUFNLElBQUk5QixPQUFBLENBQU84QixNQUFNLE1BQUssUUFBUSxFQUFFO0lBQzNDLElBQU1FLElBQUksR0FBR0YsTUFBTSxDQUFDRyxTQUFTO0lBQzdCLElBQUksRUFBRUQsSUFBSSxJQUFJaEMsT0FBQSxDQUFPZ0MsSUFBSSxNQUFLLFFBQVEsSUFBSSxDQUFDMUQsS0FBSyxDQUFDQyxPQUFPLENBQUN5RCxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLElBQU1FLEdBQUcsR0FBR0YsSUFBK0I7SUFDM0NWLE1BQU0sRUFBQVMsWUFBQSxHQUFDRyxHQUFHLENBQUNDLE9BQU8sY0FBQUosWUFBQSxjQUFBQSxZQUFBLEdBQUlHLEdBQUcsQ0FBQzVDLEVBQUUsQ0FBQztJQUM3QixJQUFJaEIsS0FBSyxDQUFDQyxPQUFPLENBQUMyRCxHQUFHLENBQUNFLFFBQVEsQ0FBQyxFQUFFO01BQy9CRixHQUFHLENBQUNFLFFBQVEsQ0FBQ1AsT0FBTyxDQUFDUCxNQUFNLENBQUM7SUFDOUI7SUFDQSxJQUFJaEQsS0FBSyxDQUFDQyxPQUFPLENBQUMyRCxHQUFHLENBQUNHLEtBQUssQ0FBQyxFQUFFO01BQzVCSCxHQUFHLENBQUNHLEtBQUssQ0FBQ1IsT0FBTyxDQUFDLFVBQUFTLENBQUMsRUFBSTtRQUNyQixJQUFJQSxDQUFDLElBQUl0QyxPQUFBLENBQU9zQyxDQUFDLE1BQUssUUFBUSxJQUFJLENBQUNoRSxLQUFLLENBQUNDLE9BQU8sQ0FBQytELENBQUMsQ0FBQyxFQUFFO1VBQUEsSUFBQUMsYUFBQTtVQUNuRCxJQUFNQyxJQUFJLEdBQUdGLENBQTRCO1VBQ3pDaEIsTUFBTSxFQUFBaUIsYUFBQSxHQUFDQyxJQUFJLENBQUNMLE9BQU8sY0FBQUksYUFBQSxjQUFBQSxhQUFBLEdBQUlDLElBQUksQ0FBQ2xELEVBQUUsQ0FBQztRQUNqQztNQUNGLENBQUMsQ0FBQztJQUNKO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsT0FBTytCLEdBQUc7QUFDWjs7QUFFQTtBQUNBLFNBQVNvQixzQ0FBc0NBLENBQUNyQixjQUErQixFQUFZO0VBQ3pGLElBQU1DLEdBQWEsR0FBRyxFQUFFO0VBQ3hCRCxjQUFjLENBQUNTLE9BQU8sQ0FBQyxVQUFBQyxNQUFNLEVBQUk7SUFDL0IsSUFBSSxDQUFDQSxNQUFNLElBQUk5QixPQUFBLENBQU84QixNQUFNLE1BQUssUUFBUSxFQUFFO0lBQzNDLElBQU1FLElBQUksR0FBR0YsTUFBTSxDQUFDRyxTQUFTO0lBQzdCLElBQUksRUFBRUQsSUFBSSxJQUFJaEMsT0FBQSxDQUFPZ0MsSUFBSSxNQUFLLFFBQVEsSUFBSSxDQUFDMUQsS0FBSyxDQUFDQyxPQUFPLENBQUN5RCxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ2pFLElBQU1FLEdBQUcsR0FBR0YsSUFBK0I7SUFDM0MsSUFBSUYsTUFBTSxDQUFDWSxTQUFTLEtBQUssYUFBYSxFQUFFO01BQUEsSUFBQUMsYUFBQTtNQUN0QyxJQUFNcEIsR0FBRyxJQUFBb0IsYUFBQSxHQUFHVCxHQUFHLENBQUNDLE9BQU8sY0FBQVEsYUFBQSxjQUFBQSxhQUFBLEdBQUlULEdBQUcsQ0FBQzVDLEVBQUU7TUFDakMsSUFBSWlDLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDZixJQUFNQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDSCxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDeEMsTUFBTSxDQUFDNEMsS0FBSyxDQUFDSCxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFDTyxJQUFJLENBQUNKLENBQUMsQ0FBQztNQUNuQztJQUNGO0lBQ0EsSUFBSU0sTUFBTSxDQUFDWSxTQUFTLEtBQUssb0JBQW9CLEVBQUU7TUFDN0MsSUFBTUUsSUFBSSxHQUFHVixHQUFHLENBQUNFLFFBQVE7TUFDekIsSUFBSTlELEtBQUssQ0FBQ0MsT0FBTyxDQUFDcUUsSUFBSSxDQUFDLEVBQUU7UUFDdkJBLElBQUksQ0FBQ2YsT0FBTyxDQUFDLFVBQUFnQixHQUFHLEVBQUk7VUFDbEIsSUFBTXJCLENBQUMsR0FBR0MsUUFBUSxDQUFDQyxNQUFNLENBQUNtQixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7VUFDbkMsSUFBSSxDQUFDOUQsTUFBTSxDQUFDNEMsS0FBSyxDQUFDSCxDQUFDLENBQUMsRUFBRUgsR0FBRyxDQUFDTyxJQUFJLENBQUNKLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUM7TUFDSjtJQUNGO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsT0FBT0gsR0FBRztBQUNaO0FBRUEsU0FBU3lCLHlDQUF5Q0EsQ0FBQzFCLGNBQStCLEVBQWlCO0VBQUEsSUFBQTJCLGFBQUE7RUFDakcsSUFBTUMsVUFBVSxHQUFHNUIsY0FBYyxDQUFDNkIsSUFBSSxDQUFDLFVBQUFDLENBQUM7SUFBQSxPQUFJLENBQUNBLENBQUMsQ0FBQ1IsU0FBUyxJQUFJLEVBQUUsRUFBRVMsV0FBVyxDQUFDLENBQUMsS0FBSyxZQUFZO0VBQUEsRUFBQztFQUMvRixJQUNFLENBQUNILFVBQVUsSUFDWCxDQUFDQSxVQUFVLENBQUNmLFNBQVMsSUFDckJqQyxPQUFBLENBQU9nRCxVQUFVLENBQUNmLFNBQVMsTUFBSyxRQUFRLElBQ3hDM0QsS0FBSyxDQUFDQyxPQUFPLENBQUN5RSxVQUFVLENBQUNmLFNBQVMsQ0FBQyxFQUNuQztJQUNBLE9BQU8sSUFBSTtFQUNiO0VBQ0EsSUFBTUMsR0FBRyxHQUFHYyxVQUFVLENBQUNmLFNBQW9DO0VBQzNELElBQU1WLEdBQUcsSUFBQXdCLGFBQUEsR0FBR2IsR0FBRyxDQUFDa0IsUUFBUSxjQUFBTCxhQUFBLGNBQUFBLGFBQUEsR0FBSWIsR0FBRyxDQUFDbUIsT0FBTztFQUN2QyxPQUFPOUIsR0FBRyxJQUFJLElBQUksR0FBR0csTUFBTSxDQUFDSCxHQUFHLENBQUMsR0FBRyxJQUFJO0FBQ3pDO0FBRUEsU0FBUytCLDBDQUEwQ0EsQ0FBQ2xDLGNBQStCLEVBQUVtQyxRQUFnQixFQUFpQjtFQUFBLElBQUFDLElBQUEsRUFBQUMsY0FBQTtFQUNwSCxJQUFNM0IsTUFBTSxHQUFHVixjQUFjLENBQUM2QixJQUFJLENBQUMsVUFBQUMsQ0FBQztJQUFBLE9BQUksQ0FBQ0EsQ0FBQyxDQUFDUixTQUFTLElBQUksRUFBRSxFQUFFUyxXQUFXLENBQUMsQ0FBQyxLQUFLSSxRQUFRLENBQUNKLFdBQVcsQ0FBQyxDQUFDO0VBQUEsRUFBQztFQUNyRyxJQUFJLENBQUNyQixNQUFNLElBQUksQ0FBQ0EsTUFBTSxDQUFDRyxTQUFTLElBQUlqQyxPQUFBLENBQU84QixNQUFNLENBQUNHLFNBQVMsTUFBSyxRQUFRLElBQUkzRCxLQUFLLENBQUNDLE9BQU8sQ0FBQ3VELE1BQU0sQ0FBQ0csU0FBUyxDQUFDLEVBQUU7SUFDM0csT0FBTyxJQUFJO0VBQ2I7RUFDQSxJQUFNQyxHQUFHLEdBQUdKLE1BQU0sQ0FBQ0csU0FBb0M7RUFDdkQsSUFBTVYsR0FBRyxJQUFBaUMsSUFBQSxJQUFBQyxjQUFBLEdBQUd2QixHQUFHLENBQUNrQixRQUFRLGNBQUFLLGNBQUEsY0FBQUEsY0FBQSxHQUFJdkIsR0FBRyxDQUFDbUIsT0FBTyxjQUFBRyxJQUFBLGNBQUFBLElBQUEsR0FBSXRCLEdBQUcsQ0FBQzVDLEVBQUU7RUFDakQsT0FBT2lDLEdBQUcsSUFBSSxJQUFJLEdBQUdHLE1BQU0sQ0FBQ0gsR0FBRyxDQUFDLEdBQUcsSUFBSTtBQUN6Qzs7QUFFQTtBQUNBLFNBQVNtQyx1Q0FBdUNBLENBQUNDLElBQVksRUFBWTtFQUN2RSxJQUFNQyxPQUFPLEdBQUdELElBQUksQ0FBQ0UsS0FBSyxDQUFDLHVCQUF1QixDQUFDO0VBQ25ELElBQUlELE9BQU8sRUFBRTtJQUNYLElBQU1wQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ21DLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDbEMsT0FBTzdFLE1BQU0sQ0FBQzRDLEtBQUssQ0FBQ0gsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUNBLENBQUMsQ0FBQztFQUNuQztFQUNBLElBQU1zQyxJQUFJLEdBQUdILElBQUksQ0FBQ0UsS0FBSyxDQUFDLGtCQUFrQixDQUFDO0VBQzNDLElBQUlDLElBQUksRUFBRTtJQUNSLElBQU10QyxFQUFDLEdBQUdDLFFBQVEsQ0FBQ3FDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDL0IsT0FBTy9FLE1BQU0sQ0FBQzRDLEtBQUssQ0FBQ0gsRUFBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUNBLEVBQUMsQ0FBQztFQUNuQztFQUNBLE9BQU8sRUFBRTtBQUNYO0FBRUEsSUFBTXVDLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUlDLFFBQWlCLEVBQUs7RUFDaEQsSUFBTUMsV0FBVyxHQUFHeEksTUFBTSxDQUFrQjtJQUMxQzZELEVBQUUsRUFBRTBFLFFBQVEsQ0FBQzFFLEVBQUUsQ0FBQzRFLFFBQVEsQ0FBQyxDQUFDO0lBQzFCekUsSUFBSSxFQUFFdUUsUUFBUSxDQUFDRyxTQUFTO0lBQ3hCQyxNQUFNLEVBQUVKLFFBQVEsQ0FBQ0s7RUFDbkIsQ0FBQyxDQUFDO0VBRUYsSUFDRUosV0FBVyxDQUFDSyxPQUFPLENBQUNoRixFQUFFLEtBQUswRSxRQUFRLENBQUMxRSxFQUFFLENBQUM0RSxRQUFRLENBQUMsQ0FBQyxJQUNqREQsV0FBVyxDQUFDSyxPQUFPLENBQUM3RSxJQUFJLEtBQUt1RSxRQUFRLENBQUNHLFNBQVMsSUFDL0NGLFdBQVcsQ0FBQ0ssT0FBTyxDQUFDRixNQUFNLEtBQUtKLFFBQVEsQ0FBQ0ssT0FBTyxFQUMvQztJQUNBSixXQUFXLENBQUNLLE9BQU8sR0FBRztNQUNwQmhGLEVBQUUsRUFBRTBFLFFBQVEsQ0FBQzFFLEVBQUUsQ0FBQzRFLFFBQVEsQ0FBQyxDQUFDO01BQzFCekUsSUFBSSxFQUFFdUUsUUFBUSxDQUFDRyxTQUFTO01BQ3hCQyxNQUFNLEVBQUVKLFFBQVEsQ0FBQ0s7SUFDbkIsQ0FBQztFQUNIO0VBQ0EsT0FBTztJQUNMSixXQUFXLEVBQUVBLFdBQVcsQ0FBQ0s7RUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFNQyxrQ0FBa0MsR0FBRyxTQUFyQ0Esa0NBQWtDQSxDQUN0Q0MsU0FBbUIsRUFDbkJDLGNBQTZCLEVBQzBCO0VBQ3ZELElBQU1DLGNBQWMsR0FBR0QsY0FBYyxDQUFDeEIsSUFBSSxDQUFDLFVBQUEwQixPQUFPO0lBQUEsSUFBQUMsaUJBQUE7SUFBQSxRQUFBQSxpQkFBQSxHQUNoREQsT0FBTyxDQUFDRSxRQUFRLGNBQUFELGlCQUFBLGdCQUFBQSxpQkFBQSxHQUFoQkEsaUJBQUEsQ0FBa0JFLGVBQWUsY0FBQUYsaUJBQUEsdUJBQWpDQSxpQkFBQSxDQUFtQ0csSUFBSSxDQUFDLFVBQUFqRCxNQUFNO01BQUEsT0FBSTBDLFNBQVMsQ0FBQy9ELFFBQVEsQ0FBQ3FCLE1BQU0sQ0FBQ2tELFNBQVMsQ0FBQztJQUFBLEVBQUM7RUFBQSxDQUN6RixDQUFDO0VBQ0QsSUFBSU4sY0FBYyxhQUFkQSxjQUFjLGVBQWRBLGNBQWMsQ0FBRUcsUUFBUSxFQUFFO0lBQzVCLE9BQU87TUFDTEYsT0FBTyxFQUFFRCxjQUFjO01BQ3ZCTyxTQUFTLEVBQUVQLGNBQWMsQ0FBQ0csUUFBUSxDQUFDSyxVQUFVLElBQUl6SCxVQUFVLENBQUMwSCxHQUFHLENBQUMsQ0FBQyxJQUFJO0lBQ3ZFLENBQUM7RUFDSDtFQUVBLElBQUFDLHFCQUFBLEdBQXFCL0gsZ0JBQWdCLENBQUNnSSxRQUFRLENBQUMsQ0FBQztJQUF4Q0MsUUFBUSxHQUFBRixxQkFBQSxDQUFSRSxRQUFRO0VBQ2hCLElBQU1DLFlBQVksR0FBR0MsTUFBTSxDQUFDQyxPQUFPLENBQUNILFFBQVEsQ0FBQyxDQUFDckMsSUFBSSxDQUFDLFVBQUF5QyxLQUFBO0lBQUEsSUFBQUMsS0FBQSxHQUFBQyxjQUFBLENBQUFGLEtBQUE7TUFBSUcsZUFBZSxHQUFBRixLQUFBO0lBQUEsT0FDcEVFLGVBQWUsQ0FBQ2QsSUFBSSxDQUFDLFVBQUFKLE9BQU87TUFBQSxJQUFBbUIsa0JBQUE7TUFBQSxRQUFBQSxrQkFBQSxHQUMxQm5CLE9BQU8sQ0FBQ0UsUUFBUSxjQUFBaUIsa0JBQUEsZ0JBQUFBLGtCQUFBLEdBQWhCQSxrQkFBQSxDQUFrQmhCLGVBQWUsY0FBQWdCLGtCQUFBLHVCQUFqQ0Esa0JBQUEsQ0FBbUNmLElBQUksQ0FBQyxVQUFBakQsTUFBTTtRQUFBLE9BQUkwQyxTQUFTLENBQUMvRCxRQUFRLENBQUNxQixNQUFNLENBQUNrRCxTQUFTLENBQUM7TUFBQSxFQUFDO0lBQUEsQ0FDekYsQ0FBQztFQUFBLENBQ0gsQ0FBQztFQUNELElBQUlPLFlBQVksRUFBRTtJQUNoQixJQUFBUSxhQUFBLEdBQUFILGNBQUEsQ0FBcUNMLFlBQVk7TUFBMUNOLFNBQVMsR0FBQWMsYUFBQTtNQUFFRixlQUFlLEdBQUFFLGFBQUE7SUFDakMsSUFBTUMsS0FBSyxHQUFHSCxlQUFlLENBQUM1QyxJQUFJLENBQUMsVUFBQTBCLE9BQU87TUFBQSxJQUFBc0Isa0JBQUE7TUFBQSxRQUFBQSxrQkFBQSxHQUN4Q3RCLE9BQU8sQ0FBQ0UsUUFBUSxjQUFBb0Isa0JBQUEsZ0JBQUFBLGtCQUFBLEdBQWhCQSxrQkFBQSxDQUFrQm5CLGVBQWUsY0FBQW1CLGtCQUFBLHVCQUFqQ0Esa0JBQUEsQ0FBbUNsQixJQUFJLENBQUMsVUFBQWpELE1BQU07UUFBQSxPQUFJMEMsU0FBUyxDQUFDL0QsUUFBUSxDQUFDcUIsTUFBTSxDQUFDa0QsU0FBUyxDQUFDO01BQUEsRUFBQztJQUFBLENBQ3pGLENBQUM7SUFDRCxJQUFJZ0IsS0FBSyxhQUFMQSxLQUFLLGVBQUxBLEtBQUssQ0FBRW5CLFFBQVEsRUFBRTtNQUNuQixPQUFPO1FBQUVGLE9BQU8sRUFBRXFCLEtBQUs7UUFBRWYsU0FBUyxFQUFFZSxLQUFLLENBQUNuQixRQUFRLENBQUNLLFVBQVUsSUFBSUQ7TUFBVSxDQUFDO0lBQzlFO0VBQ0Y7RUFFQSxPQUFPLElBQUk7QUFDYixDQUFDO0FBRUQsT0FBTyxJQUFNaUIsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFBQyxLQUFBLEVBS0E7RUFBQSxJQUpqQkMsYUFBYSxHQUFBRCxLQUFBLENBQXJCRSxNQUFNO0lBQ05DLGtCQUFrQixHQUFBSCxLQUFBLENBQWxCRyxrQkFBa0I7SUFDbEJDLE9BQU8sR0FBQUosS0FBQSxDQUFQSSxPQUFPO0lBQUFDLFlBQUEsR0FBQUwsS0FBQSxDQUNQTSxNQUFNO0lBQU5BLE1BQU0sR0FBQUQsWUFBQSxjQUFHLEVBQUUsR0FBQUEsWUFBQTtFQUVYLElBQUFFLEtBQUEsR0FBYzFLLElBQUksQ0FBQyxDQUFDO0lBQVpzRyxDQUFDLEdBQUFvRSxLQUFBLENBQURwRSxDQUFDO0VBQ1QsSUFBTTBCLFFBQVEsR0FBRy9ILE9BQU8sQ0FBQyxDQUFDO0VBQzFCLElBQUEwSyxpQkFBQSxHQVlJekssZ0JBQWdCLENBQUMsQ0FBQztJQVhwQjBLLE9BQU8sR0FBQUQsaUJBQUEsQ0FBUEMsT0FBTztJQUNQQyxVQUFVLEdBQUFGLGlCQUFBLENBQVZFLFVBQVU7SUFDVmxILE1BQU0sR0FBQWdILGlCQUFBLENBQU5oSCxNQUFNO0lBQ05tSCxTQUFTLEdBQUFILGlCQUFBLENBQVRHLFNBQVM7SUFDVEMsSUFBSSxHQUFBSixpQkFBQSxDQUFKSSxJQUFJO0lBQ0pDLE9BQU8sR0FBQUwsaUJBQUEsQ0FBUEssT0FBTztJQUNQQyxLQUFLLEdBQUFOLGlCQUFBLENBQUxNLEtBQUs7SUFDTEMsaUJBQWlCLEdBQUFQLGlCQUFBLENBQWpCTyxpQkFBaUI7SUFDakJDLGtCQUFrQixHQUFBUixpQkFBQSxDQUFsQlEsa0JBQWtCO0lBQ2xCeEksWUFBWSxHQUFBZ0ksaUJBQUEsQ0FBWmhJLFlBQVk7SUFDWnlJLGVBQWUsR0FBQVQsaUJBQUEsQ0FBZlMsZUFBZTtFQUVqQixJQUFNQyxLQUFLLEdBQUdqTCxRQUFRLENBQUMsQ0FBQztFQUN4QixJQUFBa0wsWUFBQSxHQUEwQjVLLFdBQVcsQ0FBQyxDQUFDO0lBQS9CNkssYUFBYSxHQUFBRCxZQUFBLENBQWJDLGFBQWE7RUFDckIsSUFBQUMsbUJBQUEsR0FBd0J6RCxrQkFBa0IsQ0FBQ0MsUUFBUSxDQUFDO0lBQTVDQyxXQUFXLEdBQUF1RCxtQkFBQSxDQUFYdkQsV0FBVztFQUNuQixJQUFBd0Qsa0JBQUEsR0FBOEI5SyxpQkFBaUIsQ0FBQyxDQUFDO0lBQXpDK0ssaUJBQWlCLEdBQUFELGtCQUFBLENBQWpCQyxpQkFBaUI7RUFFekIsSUFBTUMsZ0JBQWdCLEdBQUdsTSxNQUFNLENBQUNJLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDekMsSUFBTStMLG1CQUFtQixHQUFHbk0sTUFBTSxDQUFnQixJQUFJLENBQUM7RUFDdkQsSUFBTW9NLGFBQWEsR0FBR3BNLE1BQU0sQ0FBQzJLLGFBQWEsSUFBSXZLLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDdkQsSUFBTWlNLGVBQWUsR0FBRzVKLGFBQWEsQ0FBQyxVQUFBNkosS0FBSztJQUFBLE9BQUlBLEtBQUssQ0FBQ0QsZUFBZTtFQUFBLEVBQUM7RUFDckUsSUFBTUUsYUFBYSxHQUFHdk0sTUFBTSxDQUFDLEtBQUssQ0FBQztFQUNuQyxJQUFNd00sV0FBVyxHQUFHeE0sTUFBTSxDQUFnQixFQUFFLENBQUM7RUFDN0M7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsSUFBTXlNLHFCQUFxQixHQUFHek0sTUFBTSxDQUcxQixJQUFJLENBQUM7RUFDZjtFQUNBLElBQU0wTSx3QkFBd0IsR0FBRzFNLE1BQU0sQ0FBYyxJQUFJMk0sR0FBRyxDQUFDLENBQUMsQ0FBQztFQUMvRDtFQUNBLElBQU1DLHVCQUF1QixHQUFHNU0sTUFBTSxDQUE4QixJQUFJLENBQUM7RUFDekU7RUFDQSxJQUFNNk0sZ0JBQWdCLEdBQUc3TSxNQUFNLENBQXVCLElBQUksQ0FBQztFQUMzRCxJQUFNOE0sZUFBZSxHQUFHOU0sTUFBTSxDQUFDLEtBQUssQ0FBQztFQUNyQyxJQUFNK00sWUFBWSxHQUFHL00sTUFBTSxDQUFDLEtBQUssQ0FBQztFQUNsQztFQUNBLElBQU1nTix5QkFBeUIsR0FBR2hOLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDO0VBQzdEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNaU4scUJBQXFCLEdBQUdqTixNQUFNLENBQWdCLElBQUksQ0FBQztFQUN6RCxJQUFNa04sZ0JBQWdCLEdBQUdsTixNQUFNLENBQWE7SUFBQSxPQUFNc0YsU0FBUztFQUFBLEVBQUM7RUFDNUQsSUFBQTZILFNBQUEsR0FBNENqTixRQUFRLENBQXlCLENBQUMsQ0FBQyxDQUFDO0lBQUFrTixVQUFBLEdBQUFqRCxjQUFBLENBQUFnRCxTQUFBO0lBQXpFRSxjQUFjLEdBQUFELFVBQUE7SUFBRUUsaUJBQWlCLEdBQUFGLFVBQUE7RUFDeEM7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFLElBQUFHLFVBQUEsR0FBOENyTixRQUFRLENBQVNrTSxhQUFhLENBQUN2RCxPQUFPLENBQUM7SUFBQTJFLFVBQUEsR0FBQXJELGNBQUEsQ0FBQW9ELFVBQUE7SUFBOUVFLGVBQWUsR0FBQUQsVUFBQTtJQUFFRSxrQkFBa0IsR0FBQUYsVUFBQTtFQUMxQztFQUNBLElBQU1HLFlBQVksR0FBRzNOLE1BQU0sQ0FBQyxJQUFJLENBQUM7RUFDakM7RUFDQSxJQUFNNE4sc0JBQXNCLEdBQUc1TixNQUFNLENBQWdCLElBQUksQ0FBQztFQUUxRCxJQUFNNk4sb0JBQW9CLEdBQUc3TixNQUFNLENBQUN5TCxpQkFBaUIsQ0FBQztFQUN0RCxJQUFNcUMscUJBQXFCLEdBQUc5TixNQUFNLENBQUMwTCxrQkFBa0IsQ0FBQztFQUN4RDtFQUNBLElBQU1xQyxVQUFVLEdBQUcvTixNQUFNLENBQUM7SUFBRWtELFlBQVksRUFBWkEsWUFBWTtJQUFFaUksT0FBTyxFQUFQQSxPQUFPO0lBQUVqSCxNQUFNLEVBQU5BLE1BQU07SUFBRW9ILElBQUksRUFBSkE7RUFBSyxDQUFDLENBQUM7RUFDbEV5QyxVQUFVLENBQUNsRixPQUFPLEdBQUc7SUFBRTNGLFlBQVksRUFBWkEsWUFBWTtJQUFFaUksT0FBTyxFQUFQQSxPQUFPO0lBQUVqSCxNQUFNLEVBQU5BLE1BQU07SUFBRW9ILElBQUksRUFBSkE7RUFBSyxDQUFDO0VBRTVEckwsU0FBUyxDQUFDLFlBQU07SUFDZDROLG9CQUFvQixDQUFDaEYsT0FBTyxHQUFHNEMsaUJBQWlCO0lBQ2hEcUMscUJBQXFCLENBQUNqRixPQUFPLEdBQUc2QyxrQkFBa0I7RUFDcEQsQ0FBQyxFQUFFLENBQUNELGlCQUFpQixFQUFFQyxrQkFBa0IsQ0FBQyxDQUFDO0VBRTNDLElBQUFzQyxnQkFBQSxHQVNJM04sZUFBZSxDQUFDO01BQ2xCdUssTUFBTSxFQUFFRCxhQUFhLElBQUl5QixhQUFhLENBQUN2RCxPQUFPO01BQzlDTCxXQUFXLEVBQVhBLFdBQVc7TUFDWHFDLGtCQUFrQixFQUFsQkEsa0JBQWtCO01BQ2xCQyxPQUFPLEVBQVBBLE9BQU87TUFDUEUsTUFBTSxFQUFOQTtJQUNGLENBQUMsQ0FBQztJQWRBaUQsZUFBZSxHQUFBRCxnQkFBQSxDQUFmQyxlQUFlO0lBQ2ZwRSxRQUFRLEdBQUFtRSxnQkFBQSxDQUFSbkUsUUFBUTtJQUNScUUscUJBQXFCLEdBQUFGLGdCQUFBLENBQXJCRSxxQkFBcUI7SUFDckJDLFlBQVksR0FBQUgsZ0JBQUEsQ0FBWkcsWUFBWTtJQUNaQyxVQUFVLEdBQUFKLGdCQUFBLENBQVZJLFVBQVU7SUFDVkMsYUFBYSxHQUFBTCxnQkFBQSxDQUFiSyxhQUFhO0lBQ2JDLGVBQWUsR0FBQU4sZ0JBQUEsQ0FBZk0sZUFBZTtJQUNmQyxZQUFZLEdBQUFQLGdCQUFBLENBQVpPLFlBQVk7RUFTZC9CLFdBQVcsQ0FBQzNELE9BQU8sR0FBR2dCLFFBQVE7O0VBRTlCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNMkUsZUFBZSxHQUFHek8sV0FBVyxDQUNqQyxVQUFDeUosU0FBaUIsRUFBRU4sT0FBb0IsRUFBSztJQUMzQ3RILGdCQUFnQixDQUFDZ0ksUUFBUSxDQUFDLENBQUMsQ0FBQ3dFLFVBQVUsQ0FBQzVFLFNBQVMsRUFBRU4sT0FBTyxDQUFDO0lBQzFELElBQUl5RSxZQUFZLENBQUM5RSxPQUFPLElBQUk3RyxVQUFVLENBQUN5TSxFQUFFLENBQUNqRixTQUFTLENBQUMsRUFBRTtNQUNwRDRFLFVBQVUsQ0FBQ2xGLE9BQU8sQ0FBQztJQUNyQjtFQUNGLENBQUMsRUFDRCxDQUFDa0YsVUFBVSxDQUNiLENBQUM7RUFFRCxJQUFNTSxlQUFlLEdBQUczTyxXQUFXLENBQ2pDLFVBQUN5SixTQUFpQixFQUFFbUYsU0FBaUIsRUFBSztJQUN4Qy9NLGdCQUFnQixDQUFDZ0ksUUFBUSxDQUFDLENBQUMsQ0FBQ3lFLGFBQWEsQ0FBQzdFLFNBQVMsRUFBRW1GLFNBQVMsQ0FBQztJQUMvRCxJQUFJaEIsWUFBWSxDQUFDOUUsT0FBTyxJQUFJN0csVUFBVSxDQUFDeU0sRUFBRSxDQUFDakYsU0FBUyxDQUFDLEVBQUU7TUFDcEQ2RSxhQUFhLENBQUNNLFNBQVMsQ0FBQztJQUMxQjtFQUNGLENBQUMsRUFDRCxDQUFDTixhQUFhLENBQ2hCLENBQUM7O0VBRUQ7RUFDQSxJQUFNTyxnQkFBZ0IsR0FBRzdPLFdBQVcsQ0FBQyxVQUFDeUosU0FBaUIsRUFBSztJQUMxRDVILGdCQUFnQixDQUFDZ0ksUUFBUSxDQUFDLENBQUMsQ0FBQ2lGLFdBQVcsQ0FBQ3JGLFNBQVMsRUFBRSxFQUFFLENBQUM7RUFDeEQsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFTjtFQUNBO0VBQ0E7RUFDQXZKLFNBQVMsQ0FBQyxZQUFNO0lBQ2QrQixVQUFVLENBQUM4TSxHQUFHLENBQUNyQixlQUFlLENBQUM7RUFDakMsQ0FBQyxFQUFFLENBQUNBLGVBQWUsQ0FBQyxDQUFDO0VBRXJCeE4sU0FBUyxDQUFDLFlBQU07SUFDZDBOLFlBQVksQ0FBQzlFLE9BQU8sR0FBRyxJQUFJO0lBQzNCLE9BQU8sWUFBTTtNQUNYOEUsWUFBWSxDQUFDOUUsT0FBTyxHQUFHLEtBQUs7TUFDNUIsSUFBSTdHLFVBQVUsQ0FBQ3lNLEVBQUUsQ0FBQ3JDLGFBQWEsQ0FBQ3ZELE9BQU8sQ0FBQyxFQUFFO1FBQ3hDN0csVUFBVSxDQUFDOE0sR0FBRyxDQUFDLElBQUksQ0FBQztNQUN0QjtJQUNGLENBQUM7RUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVOO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBTUMsaUJBQWlCLEdBQUdsTixjQUFjLENBQUM0TCxlQUFlLENBQUM7RUFDekR4TixTQUFTLENBQUMsWUFBTTtJQUFBLElBQUErTyxxQkFBQTtJQUNkLElBQU1DLE1BQU0sR0FBR0YsaUJBQWlCLGFBQWpCQSxpQkFBaUIsdUJBQWpCQSxpQkFBaUIsQ0FBRUUsTUFBTTtJQUN4QyxJQUFJLENBQUNBLE1BQU0sRUFBRTtJQUNiLElBQU1DLFVBQVUsR0FBR0QsTUFBTSxLQUFLLFVBQVUsSUFBSUEsTUFBTSxLQUFLLE9BQU87SUFDOUQsSUFBSSxDQUFDQyxVQUFVLEVBQUU7SUFDakIsSUFBTUMsR0FBRyxNQUFBeEssTUFBQSxDQUFNOEksZUFBZSxPQUFBOUksTUFBQSxDQUFJc0ssTUFBTSxPQUFBdEssTUFBQSxFQUFBcUsscUJBQUEsR0FBSUQsaUJBQWlCLGFBQWpCQSxpQkFBaUIsdUJBQWpCQSxpQkFBaUIsQ0FBRUssVUFBVSxjQUFBSixxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLEVBQUUsQ0FBRTtJQUNqRixJQUFJcEIsc0JBQXNCLENBQUMvRSxPQUFPLEtBQUtzRyxHQUFHLEVBQUU7SUFDNUN2QixzQkFBc0IsQ0FBQy9FLE9BQU8sR0FBR3NHLEdBQUc7SUFFcEMsSUFBTUUsSUFBSSxHQUFHek4sZ0JBQWdCLENBQUNnSSxRQUFRLENBQUMsQ0FBQyxDQUFDMEYsV0FBVyxDQUFDN0IsZUFBZSxDQUFDO0lBQ3JFLElBQU04QixtQkFBbUIsR0FBR0YsSUFBSSxDQUFDL0YsSUFBSSxDQUFDLFVBQUFrRyxHQUFHO01BQUEsT0FBSXBOLCtCQUErQixDQUFDb04sR0FBRyxDQUFDM0wsRUFBRSxDQUFDO0lBQUEsRUFBQztJQUNyRixJQUFJMEwsbUJBQW1CLEVBQUU7TUFDdkJwQixZQUFZLENBQUM7UUFBRXNCLEtBQUssRUFBRTtNQUFLLENBQUMsQ0FBQztJQUMvQjtFQUNGLENBQUMsRUFBRSxDQUFDVixpQkFBaUIsYUFBakJBLGlCQUFpQix1QkFBakJBLGlCQUFpQixDQUFFRSxNQUFNLEVBQUVGLGlCQUFpQixhQUFqQkEsaUJBQWlCLHVCQUFqQkEsaUJBQWlCLENBQUVLLFVBQVUsRUFBRTNCLGVBQWUsRUFBRVUsWUFBWSxDQUFDLENBQUM7RUFFN0ZsTyxTQUFTLENBQUMsWUFBTTtJQUNkLElBQU15UCxXQUFXLEdBQUcsSUFBSUMsV0FBVyxDQUFDLCtCQUErQixFQUFFO01BQ25FQyxNQUFNLEVBQUU7UUFBRTNCLGVBQWUsRUFBZkE7TUFBZ0I7SUFDNUIsQ0FBQyxDQUFDO0lBQ0Y0QixRQUFRLENBQUNDLGFBQWEsQ0FBQ0osV0FBVyxDQUFDO0VBQ3JDLENBQUMsRUFBRSxDQUFDekIsZUFBZSxDQUFDLENBQUM7RUFFckIsSUFBTThCLHdCQUF3QixHQUFHL1AsTUFBTSxDQUE0QjJLLGFBQWEsQ0FBQztFQUVqRjFLLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBTStQLHFCQUFxQixHQUFHRCx3QkFBd0IsQ0FBQ2xILE9BQU87SUFDOURrSCx3QkFBd0IsQ0FBQ2xILE9BQU8sR0FBRzhCLGFBQWE7O0lBRWhEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQSxJQUFJLENBQUNBLGFBQWEsSUFBSXFGLHFCQUFxQixFQUFFO01BQzNDNUQsYUFBYSxDQUFDdkQsT0FBTyxHQUFHekksTUFBTSxDQUFDLENBQUM7TUFDaENzTixrQkFBa0IsQ0FBQ3RCLGFBQWEsQ0FBQ3ZELE9BQU8sQ0FBQztNQUN6Q3FELGdCQUFnQixDQUFDckQsT0FBTyxHQUFHekksTUFBTSxDQUFDLENBQUM7TUFDbkMrTCxtQkFBbUIsQ0FBQ3RELE9BQU8sR0FBRyxJQUFJO01BQ2xDMEQsYUFBYSxDQUFDMUQsT0FBTyxHQUFHLEtBQUs7TUFDN0JpRSxlQUFlLENBQUNqRSxPQUFPLEdBQUcsS0FBSztNQUMvQm1FLHlCQUF5QixDQUFDbkUsT0FBTyxHQUFHLElBQUk7TUFDeENvRSxxQkFBcUIsQ0FBQ3BFLE9BQU8sR0FBRyxJQUFJO01BQ3BDO0lBQ0Y7SUFFQSxJQUFJOEIsYUFBYSxJQUFJQSxhQUFhLEtBQUt5QixhQUFhLENBQUN2RCxPQUFPLEVBQUU7TUFDNUQ7TUFDQTtNQUNBO01BQ0E7O01BRUE7TUFDQXVDLFVBQVUsQ0FBQyxJQUFJLENBQUM7TUFDaEJDLFNBQVMsYUFBVEEsU0FBUyxlQUFUQSxTQUFTLENBQUcsSUFBSSxDQUFDO01BQ2pCTSxlQUFlLENBQUMsSUFBSSxDQUFDO01BQ3JCSixPQUFPLENBQUMsSUFBSSxDQUFDO01BRWJhLGFBQWEsQ0FBQ3ZELE9BQU8sR0FBRzhCLGFBQWE7TUFDckMrQyxrQkFBa0IsQ0FBQy9DLGFBQWEsQ0FBQztNQUNqQ3VCLGdCQUFnQixDQUFDckQsT0FBTyxHQUFHekksTUFBTSxDQUFDLENBQUM7TUFDbkMrTCxtQkFBbUIsQ0FBQ3RELE9BQU8sR0FBRyxJQUFJO01BQ2xDMEQsYUFBYSxDQUFDMUQsT0FBTyxHQUFHLEtBQUs7TUFDN0I7TUFDQTtNQUNBO01BQ0FpRSxlQUFlLENBQUNqRSxPQUFPLEdBQUcvRyxvQkFBb0IsQ0FBQ21PLFFBQVEsQ0FBQ3RGLGFBQWEsQ0FBQztNQUN0RXFDLHlCQUF5QixDQUFDbkUsT0FBTyxHQUFHLElBQUk7TUFDeENvRSxxQkFBcUIsQ0FBQ3BFLE9BQU8sR0FBRyxJQUFJOztNQUVwQztJQUNGO0VBQ0YsQ0FBQyxFQUFFLENBQUM4QixhQUFhLEVBQUVRLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVNLGVBQWUsRUFBRUosT0FBTyxDQUFDLENBQUM7RUFFN0V0TCxTQUFTLENBQUMsWUFBTTtJQUNkb00sZUFBZSxDQUFDMUIsYUFBYSxJQUFJLElBQUksQ0FBQztFQUN4QyxDQUFDLEVBQUUsQ0FBQ0EsYUFBYSxFQUFFMEIsZUFBZSxDQUFDLENBQUM7RUFFcEMsSUFBTTZELGlCQUFpQixHQUFHblEsV0FBVyxDQUNuQyxVQUFDb1EsR0FBa0IsRUFBRUMsWUFBcUIsRUFBRUMsZUFBd0IsRUFBSztJQUFBLElBQUFDLHFCQUFBLEVBQUFDLHNCQUFBO0lBQ3ZFLElBQVEvRyxTQUFTLEdBQStCMkcsR0FBRyxDQUEzQzNHLFNBQVM7TUFBRW1GLFNBQVMsR0FBb0J3QixHQUFHLENBQWhDeEIsU0FBUztNQUFFNkIsYUFBYSxHQUFLTCxHQUFHLENBQXJCSyxhQUFhO0lBQzNDLElBQU1QLFFBQVEsR0FBR2pPLFVBQVUsQ0FBQ3lNLEVBQUUsQ0FBQ2pGLFNBQVMsQ0FBQztJQUV6QzdILG9CQUFvQixDQUFDOE8sS0FBSyxDQUFDakgsU0FBUyxDQUFDO0lBQ3JDa0YsZUFBZSxDQUFDbEYsU0FBUyxFQUFFZ0gsYUFBYSxDQUFDO0lBRXpDLElBQU1FLGFBQWEsR0FBRzdELGdCQUFnQixDQUFDaEUsT0FBTztJQUM5QyxJQUFJNkgsYUFBYSxFQUFFO01BQ2pCN0QsZ0JBQWdCLENBQUNoRSxPQUFPLEdBQUcsSUFBSTtNQUMvQjJELFdBQVcsQ0FBQzNELE9BQU8sR0FBRzZILGFBQWE7TUFDbkNwQyxlQUFlLENBQUNvQyxhQUFhLENBQUM7TUFDOUIsSUFBSVQsUUFBUSxFQUFFO1FBQ1ovQyxnQkFBZ0IsQ0FBQ3JFLE9BQU8sQ0FBQyxDQUFDO1FBQzFCbUUseUJBQXlCLENBQUNuRSxPQUFPLEdBQUcsSUFBSTtRQUN4Q29FLHFCQUFxQixDQUFDcEUsT0FBTyxHQUFHLElBQUk7UUFDcENpRSxlQUFlLENBQUNqRSxPQUFPLEdBQUcsS0FBSztNQUNqQztNQUNBZ0gsUUFBUSxDQUFDQyxhQUFhLENBQ3BCLElBQUlILFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtRQUNoQ0MsTUFBTSxFQUFFO1VBQUVlLElBQUksRUFBRSxJQUFJO1VBQUVDLFFBQVEsRUFBRSxPQUFPO1VBQUUxSCxPQUFPLEVBQUVyQyxDQUFDLENBQUMsWUFBWTtRQUFFO01BQ3BFLENBQUMsQ0FDSCxDQUFDO01BQ0Q7SUFDRjtJQUVBLElBQUlvSixRQUFRLEVBQUU7TUFDWi9DLGdCQUFnQixDQUFDckUsT0FBTyxDQUFDLENBQUM7TUFDMUJtRSx5QkFBeUIsQ0FBQ25FLE9BQU8sR0FBRyxJQUFJO01BQ3hDb0UscUJBQXFCLENBQUNwRSxPQUFPLEdBQUcsSUFBSTtNQUNwQ2lFLGVBQWUsQ0FBQ2pFLE9BQU8sR0FBRyxLQUFLO0lBQ2pDO0lBRUEsSUFBTWdJLGNBQWMsR0FBR1QsWUFBWSxLQUFLLCtEQUErRDtJQUN2RyxJQUFNVSxlQUFlLEdBQ25CVixZQUFZLEtBQUssdUJBQXVCLEtBQUlDLGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFckwsUUFBUSxDQUFDLG9CQUFvQixDQUFDO0lBQzdGLElBQU1rRSxPQUFPLEdBQUcySCxjQUFjLEdBQzFCaEssQ0FBQyxDQUFDLHdCQUF3QixDQUFDLEdBQzNCaUssZUFBZSxHQUNiakssQ0FBQyxDQUFDLHlCQUF5QixFQUFFO01BQUVrSyxJQUFJLEdBQUFULHFCQUFBLEdBQUVELGVBQWUsYUFBZkEsZUFBZSxnQkFBQUUsc0JBQUEsR0FBZkYsZUFBZSxDQUFFakksS0FBSyxDQUFDLGNBQWMsQ0FBQyxjQUFBbUksc0JBQUEsdUJBQXRDQSxzQkFBQSxDQUF5QyxDQUFDLENBQUMsY0FBQUQscUJBQUEsY0FBQUEscUJBQUEsR0FBSTtJQUFHLENBQUMsQ0FBQyxHQUN6RnpKLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFFckIySCxlQUFlLENBQUNoRixTQUFTLEVBQUExRixhQUFBLENBQUFBLGFBQUE7TUFDdkJELEVBQUUsWUFBQWMsTUFBQSxDQUFZZ0ssU0FBUyxDQUFFO01BQ3pCekYsT0FBTyxFQUFQQSxPQUFPO01BQ1A4SCxPQUFPLEVBQUU7SUFBSSxHQUVULENBQUNILGNBQWMsSUFBSSxDQUFDQyxlQUFlLEdBQUc7TUFBRUcsV0FBVyxFQUFFLENBQUNwSyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUNqRnFLLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztNQUNoQkMsSUFBSSxFQUFFO1FBQUV2TixFQUFFLEVBQUUsV0FBVztRQUFFRyxJQUFJLEVBQUU7TUFBWSxDQUFDO01BQzVDeUIsSUFBSSxFQUFFM0UsZUFBZSxDQUFDdVE7SUFBUyxFQUNoQyxDQUFDO0lBQ0Z6QyxnQkFBZ0IsQ0FBQ3BGLFNBQVMsQ0FBQztJQUUzQixJQUFJLENBQUN5RyxRQUFRLEVBQUU7TUFDYnpOLGtCQUFrQixDQUFDLENBQUMsQ0FBQzhPLGdCQUFnQixDQUFDOUgsU0FBUyxDQUFDO01BQ2hEdkgsaUNBQWlDLENBQUN1SCxTQUFTLEVBQUUsT0FBTyxDQUFDO0lBQ3ZEO0VBQ0YsQ0FBQyxFQUNELENBQUNnRixlQUFlLEVBQUVFLGVBQWUsRUFBRUUsZ0JBQWdCLEVBQUVOLGVBQWUsRUFBRXpILENBQUMsQ0FDekUsQ0FBQztFQUVELElBQU0wSyxrQkFBa0IsR0FBR3hSLFdBQVcsQ0FDcEMsVUFBQ29RLEdBQWtCLEVBQUVxQixPQUFlLEVBQUs7SUFDdkMsSUFBUWhJLFNBQVMsR0FBb0IyRyxHQUFHLENBQWhDM0csU0FBUztNQUFFZ0gsYUFBYSxHQUFLTCxHQUFHLENBQXJCSyxhQUFhOztJQUVoQztJQUNBO0lBQ0E7SUFDQSxJQUFNaUIsaUJBQWlCLEdBQUc3UCxnQkFBZ0IsQ0FDdkNnSSxRQUFRLENBQUMsQ0FBQyxDQUNWMEYsV0FBVyxDQUFDOUYsU0FBUyxDQUFDLENBQ3RCRixJQUFJLENBQUMsVUFBQWtHLEdBQUc7TUFBQSxPQUFJQSxHQUFHLENBQUMzTCxFQUFFLEtBQUsyTSxhQUFhO0lBQUEsRUFBQztJQUV4QyxJQUFJLENBQUNpQixpQkFBaUIsRUFBRTtNQUN0QjlQLG9CQUFvQixDQUFDK1AsS0FBSyxDQUFDbEksU0FBUyxFQUFFZ0gsYUFBYSxDQUFDO01BQ3BEaEMsZUFBZSxDQUFDaEYsU0FBUyxFQUFFO1FBQ3pCM0YsRUFBRSxFQUFFMk0sYUFBYTtRQUNqQnRILE9BQU8sRUFBRSxFQUFFO1FBQ1hnSSxJQUFJLEVBQUUsSUFBSUMsSUFBSSxDQUFDLENBQUM7UUFDaEJDLElBQUksRUFBRTtVQUFFdk4sRUFBRSxFQUFFLFdBQVc7VUFBRUcsSUFBSSxFQUFFO1FBQVksQ0FBQztRQUM1Q3lCLElBQUksRUFBRTNFLGVBQWUsQ0FBQ3VRO01BQ3hCLENBQUMsQ0FBQztJQUNKO0lBRUEsSUFBSXJQLFVBQVUsQ0FBQ3lNLEVBQUUsQ0FBQ2pGLFNBQVMsQ0FBQyxFQUFFO01BQzVCd0QseUJBQXlCLENBQUNuRSxPQUFPLEdBQUcySCxhQUFhO01BQ2pEdkQscUJBQXFCLENBQUNwRSxPQUFPLEdBQUdXLFNBQVM7SUFDM0M7SUFFQTdILG9CQUFvQixDQUFDZ1EsT0FBTyxDQUFDbkksU0FBUyxFQUFFZ0gsYUFBYSxFQUFFZ0IsT0FBTyxDQUFDO0VBQ2pFLENBQUMsRUFDRCxDQUFDaEQsZUFBZSxDQUNsQixDQUFDO0VBRUQsSUFBTW9ELGtCQUFrQixHQUFHN1IsV0FBVztJQUFBLElBQUE4UixLQUFBLEdBQUFDLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FDcEMsU0FBQUMsUUFDRTlCLEdBQWtCLEVBQ2xCcUIsT0FBZSxFQUNmVSxPQUFZLEVBQ1pDLGVBQXVCLEVBQ3ZCL04sY0FBNkIsRUFDN0I2TSxXQUE2QixFQUM3Qm1CLGdCQUFnQztNQUFBLElBQUFDLHFCQUFBLEVBQUFDLGlCQUFBLEVBQUFDLG9CQUFBLEVBQUFDLGtCQUFBO01BQUEsSUFBQWhKLFNBQUEsRUFBQWdILGFBQUEsRUFBQVAsUUFBQSxFQUFBd0MsYUFBQSxFQUFBMVAsV0FBQSxFQUFBMlAsWUFBQSxFQUFBQyxPQUFBLEVBQUFDLFlBQUEsRUFBQUMsZUFBQSxFQUFBQyw0QkFBQSxFQUFBQyxtQkFBQSxFQUFBQyxlQUFBLEVBQUFDLGlCQUFBLEVBQUF0TixjQUFBLEVBQUF1TixlQUFBLEVBQUFDLFdBQUEsRUFBQUMsYUFBQSxFQUFBQyxzQkFBQSxFQUFBQywrQkFBQSxFQUFBQyxtQkFBQSxFQUFBQyxpQkFBQSxFQUFBQywwQkFBQSxFQUFBQyw0QkFBQSxFQUFBQyxvQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxVQUFBLEVBQUFDLFFBQUEsRUFBQUMsZUFBQSxFQUFBQyxlQUFBLEVBQUFDLHlCQUFBLEVBQUFDLHVCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLG1CQUFBLEVBQUFDLE9BQUEsRUFBQUMsR0FBQSxFQUFBQyxVQUFBLEVBQUFDLGtCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLGdCQUFBLEVBQUFDLFNBQUEsRUFBQUMsY0FBQSxFQUFBQyxnQkFBQSxFQUFBQyxxQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxzQkFBQSxFQUFBQyxlQUFBLEVBQUFDLGNBQUEsRUFBQUMsaUJBQUEsRUFBQUMsbUJBQUEsRUFBQUMsc0JBQUEsRUFBQUMsc0JBQUEsRUFBQUMsZUFBQSxFQUFBQyw0QkFBQSxFQUFBQyxLQUFBLEVBQUFDLHFCQUFBLEVBQUFDLGtCQUFBLEVBQUFDLGVBQUEsRUFBQUMsa0JBQUEsRUFBQUMscUJBQUEsRUFBQUMsbUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMsY0FBQSxFQUFBMUcsV0FBQTtNQUFBLE9BQUFxQyxtQkFBQSxDQUFBc0UsSUFBQSxXQUFBQyxRQUFBO1FBQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7VUFBQTtZQUV4QmhOLFNBQVMsR0FBb0IyRyxHQUFHLENBQWhDM0csU0FBUyxFQUFFZ0gsYUFBYSxHQUFLTCxHQUFHLENBQXJCSyxhQUFhO1lBQzFCUCxRQUFRLEdBQUdqTyxVQUFVLENBQUN5TSxFQUFFLENBQUNqRixTQUFTLENBQUM7WUFDekNxRCxnQkFBZ0IsQ0FBQ2hFLE9BQU8sR0FBRyxJQUFJO1lBRXpCNEosYUFBYSxHQUFHakMsYUFBYTtZQUNuQzdPLG9CQUFvQixDQUFDOE8sS0FBSyxDQUFDakgsU0FBUyxDQUFDO1lBQ3JDa0YsZUFBZSxDQUFDbEYsU0FBUyxFQUFFaUosYUFBYSxDQUFDO1lBQ25DMVAsV0FBVyxHQUFHb0IsNkJBQTZCLENBQUNDLGNBQWMsQ0FBQyxFQUVqRTtZQUNBO1lBQ0E7WUFBQSxJQUNLNkwsUUFBUTtjQUFBcUcsUUFBQSxDQUFBRSxJQUFBO2NBQUE7WUFBQTtZQUNYaEksZUFBZSxDQUFDaEYsU0FBUyxFQUFBMUYsYUFBQSxDQUFBQSxhQUFBO2NBQ3ZCRCxFQUFFLFlBQUFjLE1BQUEsQ0FBWXdOLGVBQWUsQ0FBRTtjQUMvQmpKLE9BQU8sRUFBRXNJLE9BQU87Y0FDaEJOLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztjQUNoQkMsSUFBSSxFQUFFO2dCQUFFdk4sRUFBRSxFQUFFLFdBQVc7Z0JBQUVHLElBQUksRUFBRTtjQUFZLENBQUM7Y0FDNUN5QixJQUFJLEVBQUUzRSxlQUFlLENBQUN1USxTQUFTO2NBQy9CYSxPQUFPLEVBQVBBO1lBQU8sR0FDSG5QLFdBQVcsQ0FBQzBULE1BQU0sR0FBRyxDQUFDLEdBQUc7Y0FBRTFULFdBQVcsRUFBWEE7WUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2NBQ2pEb1AsZUFBZSxFQUFmQSxlQUFlO2NBQ2ZsQixXQUFXLEVBQUVBLFdBQVcsSUFBSTtZQUFFLEVBQy9CLENBQUM7WUFDRnJDLGdCQUFnQixDQUFDcEYsU0FBUyxDQUFDO1lBQzNCaEgsa0JBQWtCLENBQUMsQ0FBQyxDQUFDOE8sZ0JBQWdCLENBQUM5SCxTQUFTLENBQUM7WUFDaER2SCxpQ0FBaUMsQ0FBQ3VILFNBQVMsRUFBRSxVQUFVLENBQUM7WUFBQSxPQUFBOE0sUUFBQSxDQUFBSSxNQUFBO1VBQUE7WUFJMUQxSix5QkFBeUIsQ0FBQ25FLE9BQU8sR0FBRyxJQUFJO1lBQ3hDb0UscUJBQXFCLENBQUNwRSxPQUFPLEdBQUcsSUFBSTtZQUNwQytELHVCQUF1QixDQUFDL0QsT0FBTyxHQUFHLElBQUk7O1lBRXRDO1lBQ002SixZQUFZLEdBQUcsSUFBSWlFLE1BQU0sQ0FBQ3hWLHNCQUFzQixFQUFFLEdBQUcsQ0FBQztZQUN0RHdSLE9BQU8sR0FBQWlFLGtCQUFBLENBQU9wRixPQUFPLENBQUNxRixRQUFRLENBQUNuRSxZQUFZLENBQUM7WUFFOUNFLFlBQVksR0FBR3BCLE9BQU87WUFDcEJxQixlQUFlLEdBQUdyRyxXQUFXLENBQUMzRCxPQUFPLENBQUN4RSxNQUFNLENBQUMsVUFBQXlTLENBQUM7Y0FBQSxPQUFJQSxDQUFDLENBQUNqVCxFQUFFLEtBQUs0TyxhQUFhO1lBQUEsRUFBQyxDQUFDc0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hGakUsNEJBQTRCLEdBQUcsQ0FBQUQsZUFBZSxhQUFmQSxlQUFlLHVCQUFmQSxlQUFlLENBQUV6SixRQUFRLEtBQUksSUFBSTtZQUNoRTJKLG1CQUFtQixHQUFHLENBQUMsYUFBYSxFQUFFLG9CQUFvQixFQUFFLFlBQVksQ0FBQztZQUN6RUMsZUFBZSxHQUFHLENBQ3RCLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLG1CQUFtQixDQUNwQjtZQUNLQyxpQkFBaUIsR0FBRyxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQztZQUN6RHROLGNBQWMsR0FBRyxDQUFBa04sZUFBZSxhQUFmQSxlQUFlLGdCQUFBUixxQkFBQSxHQUFmUSxlQUFlLENBQUV6SixRQUFRLGNBQUFpSixxQkFBQSx1QkFBekJBLHFCQUFBLENBQTJCaEosZUFBZSxLQUFJLEVBQUU7WUFDakU2SixlQUFlLEdBQ25CSiw0QkFBNEIsSUFDNUJuTixjQUFjLENBQUMyRCxJQUFJLENBQUMsVUFBQ2pELE1BQVc7Y0FBQSxPQUFLME0sbUJBQW1CLENBQUMvTixRQUFRLENBQUNxQixNQUFNLENBQUNZLFNBQVMsQ0FBQztZQUFBLEVBQUM7WUFDaEZrTSxXQUFXLEdBQ2ZMLDRCQUE0QixJQUFJbk4sY0FBYyxDQUFDMkQsSUFBSSxDQUFDLFVBQUNqRCxNQUFXO2NBQUEsT0FBSzJNLGVBQWUsQ0FBQ2hPLFFBQVEsQ0FBQ3FCLE1BQU0sQ0FBQ1ksU0FBUyxDQUFDO1lBQUEsRUFBQztZQUM1R21NLGFBQWEsR0FDakJOLDRCQUE0QixJQUM1Qm5OLGNBQWMsQ0FBQzJELElBQUksQ0FBQyxVQUFDakQsTUFBVztjQUFBLE9BQUs0TSxpQkFBaUIsQ0FBQ2pPLFFBQVEsQ0FBQ3FCLE1BQU0sQ0FBQ1ksU0FBUyxDQUFDO1lBQUEsRUFBQztZQUM5RW9NLHNCQUFzQixHQUMxQlAsNEJBQTRCLElBQzVCLENBQUFELGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFbUUsY0FBYyxNQUFLLFVBQVUsSUFDOUNyUixjQUFjLENBQUMyRCxJQUFJLENBQUMsVUFBQ2pELE1BQVc7Y0FBQSxPQUFLQSxNQUFNLENBQUNZLFNBQVMsS0FBSyxjQUFjO1lBQUEsRUFBQztZQUNyRXFNLCtCQUErQixHQUNuQ1IsNEJBQTRCLElBQzVCLENBQUFELGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFbUUsY0FBYyxNQUFLLFVBQVUsSUFDOUNyUixjQUFjLENBQUMyRCxJQUFJLENBQUMsVUFBQ2pELE1BQVc7Y0FBQSxPQUFLLENBQUNBLE1BQU0sQ0FBQ1ksU0FBUyxJQUFJLEVBQUUsRUFBRVMsV0FBVyxDQUFDLENBQUMsS0FBSyx3QkFBd0I7WUFBQSxFQUFDO1lBRTNHLElBQUkyTCxzQkFBc0IsSUFBSTRELE1BQU0sQ0FBQ0Msd0NBQXdDLElBQUk5RSxnQkFBZ0IsYUFBaEJBLGdCQUFnQixlQUFoQkEsZ0JBQWdCLENBQUUxTixJQUFJLENBQUMsQ0FBQyxFQUFFO2NBQ3pHNk8sbUJBQW1CLEdBQUc7Z0JBQUUzTCxPQUFPLEVBQUV3SyxnQkFBZ0IsQ0FBQzFOLElBQUksQ0FBQztjQUFFLENBQUM7WUFDNUQsQ0FBQyxNQUFNLElBQ0w0TywrQkFBK0IsSUFDL0IyRCxNQUFNLENBQUNDLHdDQUF3QyxLQUM5QzlFLGdCQUFnQixhQUFoQkEsZ0JBQWdCLGVBQWhCQSxnQkFBZ0IsQ0FBRTFOLElBQUksQ0FBQyxDQUFDLElBQ3ZCbUQsMENBQTBDLENBQUNsQyxjQUFjLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxFQUN2RjtjQUNNNk4saUJBQWlCLEdBQ3JCLENBQUFwQixnQkFBZ0IsYUFBaEJBLGdCQUFnQix1QkFBaEJBLGdCQUFnQixDQUFFMU4sSUFBSSxDQUFDLENBQUMsS0FDeEJtRCwwQ0FBMEMsQ0FBQ2xDLGNBQWMsRUFBRSx3QkFBd0IsQ0FBQztjQUN0RjROLG1CQUFtQixHQUFHO2dCQUNwQjNMLE9BQU8sRUFBRTRMO2NBQ1gsQ0FBQztZQUNIO1lBRUEsSUFBSUgsc0JBQXNCLEVBQUU7Y0FDMUJ6SCxLQUFLLENBQUNsTCxNQUFNLENBQUN5VyxnQkFBZ0IsRUFBQXJULGFBQUE7Z0JBQzNCc1QsVUFBVSxFQUFFNVYseUJBQXlCLENBQUNnSyxLQUFLLENBQUM7Z0JBQzVDNkwsV0FBVyxFQUFFOVYsdUJBQXVCLENBQUNvRSxjQUFjLENBQUM7Z0JBQ3BEMlIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCQyxNQUFNLEVBQUU7Y0FBYyxHQUNsQm5GLGdCQUFnQixhQUFoQkEsZ0JBQWdCLGVBQWhCQSxnQkFBZ0IsQ0FBRTFOLElBQUksQ0FBQyxDQUFDLEdBQUc7Z0JBQUU4UyxnQkFBZ0IsRUFBRXBGLGdCQUFnQixDQUFDMU4sSUFBSSxDQUFDO2NBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNsRixDQUFDO1lBQ0o7WUFFTStPLDBCQUEwQixHQUFHaEgscUJBQXFCLENBQUM1RCxPQUFPO1lBQzFENkssNEJBQTRCLEdBQ2hDRCwwQkFBMEIsSUFBSWhTLHFCQUFxQixDQUFDZ1MsMEJBQTBCLENBQUMzTCxRQUFRLENBQUMsS0FBSyxjQUFjO1lBRTdHLElBQUk0TCw0QkFBNEIsRUFBRTtjQUNoQzlILEtBQUssQ0FBQ2xMLE1BQU0sQ0FBQ3lXLGdCQUFnQixFQUFBclQsYUFBQTtnQkFDM0JzVCxVQUFVLEVBQUU1Vix5QkFBeUIsQ0FBQ2dLLEtBQUssQ0FBQztnQkFDNUM2TCxXQUFXLEVBQUUsY0FBYztnQkFDM0JDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQkcsaUJBQWlCLEVBQUUsUUFBUTtnQkFDM0JGLE1BQU0sRUFBRTtjQUFjLEdBQ2xCbkYsZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsZUFBaEJBLGdCQUFnQixDQUFFMU4sSUFBSSxDQUFDLENBQUMsR0FBRztnQkFBRThTLGdCQUFnQixFQUFFcEYsZ0JBQWdCLENBQUMxTixJQUFJLENBQUM7Y0FBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ2xGLENBQUM7WUFDSjtZQUVNaVAsb0JBQW9CLEdBQ3hCYiw0QkFBNEIsSUFDNUIsQ0FBQUQsZUFBZSxhQUFmQSxlQUFlLHVCQUFmQSxlQUFlLENBQUVtRSxjQUFjLE1BQUssVUFBVSxJQUM5Q3JSLGNBQWMsQ0FBQzJELElBQUksQ0FBQyxVQUFDakQsTUFBVztjQUFBLE9BQUssQ0FBQ0EsTUFBTSxDQUFDWSxTQUFTLElBQUksRUFBRSxFQUFFUyxXQUFXLENBQUMsQ0FBQyxLQUFLLFlBQVk7WUFBQSxFQUFDO1lBRy9GLElBQUlpTSxvQkFBb0IsRUFBRTtjQUNsQkUsVUFBVSxHQUFHekIsZ0JBQWdCLGFBQWhCQSxnQkFBZ0IsdUJBQWhCQSxnQkFBZ0IsQ0FBRTFOLElBQUksQ0FBQyxDQUFDO2NBQ3JDb1AsUUFBUSxHQUFHek0seUNBQXlDLENBQUMxQixjQUFjLENBQUM7Y0FDcEVvTyxlQUFlLEdBQUdGLFVBQVUsSUFBSUMsUUFBUTtjQUM5QyxJQUFJQyxlQUFlLEVBQUU7Z0JBQ25CSCxpQkFBaUIsR0FBRztrQkFBRWhNLE9BQU8sRUFBRW1NO2dCQUFnQixDQUFDO2NBQ2xEO1lBQ0Y7WUFFTUMsZUFBZSxHQUFHckIsT0FBTyxDQUFDbk8sR0FBRyxDQUFDLFVBQUE0RCxLQUFLO2NBQUEsT0FBSXBDLFFBQVEsQ0FBQ29DLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFBQSxFQUFDO1lBQzlENkwseUJBQXlCLEdBQUdqTixzQ0FBc0MsQ0FBQ3JCLGNBQWMsQ0FBQztZQUNsRnVPLHVCQUF1QixHQUMzQmQsYUFBYSxJQUFJWSxlQUFlLENBQUN5QyxNQUFNLEtBQUssQ0FBQyxJQUFJeEMseUJBQXlCLENBQUN3QyxNQUFNLEtBQUssQ0FBQyxHQUNuRnhPLHVDQUF1QyxDQUFDdUosT0FBTyxDQUFDLEdBQ2hELEVBQUU7WUFDRjJDLG1CQUFtQixHQUN2QkgsZUFBZSxDQUFDeUMsTUFBTSxHQUFHLENBQUMsR0FDdEJ6QyxlQUFlLEdBQ2ZDLHlCQUF5QixDQUFDd0MsTUFBTSxHQUFHLENBQUMsR0FDbEN4Qyx5QkFBeUIsR0FDekJDLHVCQUF1QjtZQUV6QkUsbUJBQW1CLEdBQ3ZCdEIsNEJBQTRCLEtBQzNCSSxlQUFlLElBQUlDLFdBQVcsSUFBSUMsYUFBYSxDQUFDLElBQ2pEZSxtQkFBbUIsQ0FBQ3NDLE1BQU0sR0FBRyxDQUFDO1lBQUEsS0FFNUJyQyxtQkFBbUI7Y0FBQWtDLFFBQUEsQ0FBQUUsSUFBQTtjQUFBO1lBQUE7WUFDZm5DLE9BQU8sR0FBR0YsbUJBQW1CO1lBQUEsTUFDL0J4QixPQUFPLENBQUM4RCxNQUFNLEdBQUcsQ0FBQztjQUFBSCxRQUFBLENBQUFFLElBQUE7Y0FBQTtZQUFBO1lBQUFGLFFBQUEsQ0FBQUUsSUFBQTtZQUFBLE9BQ0Z2SyxpQkFBaUIsQ0FBQ29JLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUFBO1lBQXpDQyxHQUFHLEdBQUFnQyxRQUFBLENBQUFvQixJQUFBO1lBQ0huRCxVQUFVLEdBQUdELEdBQUcsT0FBQTNQLE1BQUEsQ0FBTzJQLEdBQUcsSUFBSyxTQUFTO1lBQzlDMUIsWUFBWSxHQUFHcEIsT0FBTyxDQUFDbUcsT0FBTyxDQUFDakYsWUFBWSxFQUFFLFVBQUFrRixHQUFHO2NBQUEsT0FDOUNBLEdBQUcsQ0FBQ0QsT0FBTyxDQUFDLHlEQUF5RCxFQUFFcEQsVUFBVSxDQUFDO1lBQUEsQ0FDcEYsQ0FBQztVQUFBO1lBR0dDLGtCQUFrQixHQUFHaEksV0FBVyxDQUFDM0QsT0FBTyxDQUFDeEUsTUFBTSxDQUFDLFVBQUFtTCxHQUFHO2NBQUEsT0FBSUEsR0FBRyxDQUFDbk0sU0FBUztZQUFBLEVBQUMsQ0FBQzBULEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RXRDLG1CQUFtQixHQUFHLENBQUF0SixPQUFPLGFBQVBBLE9BQU8sdUJBQVBBLE9BQU8sQ0FBRXRILEVBQUUsTUFBSTJRLGtCQUFrQixhQUFsQkEsa0JBQWtCLHVCQUFsQkEsa0JBQWtCLENBQUVuUixTQUFTO1lBQ2xFcVIsZ0JBQWdCLEdBQUdELG1CQUFtQixHQUFHek8sUUFBUSxDQUFDQyxNQUFNLENBQUN3TyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUk7WUFDekZFLFNBQVMsR0FBR3NDLE1BQU0sQ0FBQ1ksUUFBUSxDQUFDQyxRQUFRLENBQUMxUCxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDbEV3TSxjQUFjLEdBQUdELFNBQVMsR0FBRzNPLFFBQVEsQ0FBQzJPLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJO1lBQzlERSxnQkFBZ0IsR0FBR0gsZ0JBQWdCLElBQUlFLGNBQWMsSUFBSUYsZ0JBQWdCLEtBQUtFLGNBQWM7WUFFbEcsSUFBSUMsZ0JBQWdCLEVBQUU7Y0FDcEIsSUFBSTNCLGVBQWUsRUFBRTtnQkFDbkIsQ0FBQTRCLHFCQUFBLEdBQUFtQyxNQUFNLENBQUNjLG1CQUFtQixjQUFBakQscUJBQUEsZ0JBQUFDLHNCQUFBLEdBQTFCRCxxQkFBQSxDQUE0QmtELDBCQUEwQixjQUFBakQsc0JBQUEsZUFBdERBLHNCQUFBLENBQUFrRCxJQUFBLENBQUFuRCxxQkFBQSxFQUF5RFQsT0FBTyxDQUFDO2NBQ25FLENBQUMsTUFBTSxJQUFJbEIsV0FBVyxFQUFFO2dCQUN0QixDQUFBNkIsc0JBQUEsR0FBQWlDLE1BQU0sQ0FBQ2MsbUJBQW1CLGNBQUEvQyxzQkFBQSxnQkFBQUMsc0JBQUEsR0FBMUJELHNCQUFBLENBQTRCa0QsMkJBQTJCLGNBQUFqRCxzQkFBQSxlQUF2REEsc0JBQUEsQ0FBQWdELElBQUEsQ0FBQWpELHNCQUFBLEVBQTBEWCxPQUFPLENBQUM7Y0FDcEUsQ0FBQyxNQUFNLElBQUlqQixhQUFhLEVBQUU7Z0JBQ3hCLENBQUE4QixzQkFBQSxHQUFBK0IsTUFBTSxDQUFDYyxtQkFBbUIsY0FBQTdDLHNCQUFBLGdCQUFBQyxzQkFBQSxHQUExQkQsc0JBQUEsQ0FBNEJpRCwrQkFBK0IsY0FBQWhELHNCQUFBLGVBQTNEQSxzQkFBQSxDQUFBOEMsSUFBQSxDQUFBL0Msc0JBQUEsRUFBOERiLE9BQU8sQ0FBQztjQUN4RTtZQUNGO1VBQUM7WUFHSDtZQUNBO1lBQ0E7WUFDQTtZQUNNZSxlQUFlLElBQUE5QyxpQkFBQSxHQUFHMkUsTUFBTSxDQUFDbUIsU0FBUyxjQUFBOUYsaUJBQUEsdUJBQWhCQSxpQkFBQSxDQUFrQitGLE1BQU07WUFDMUNoRCxjQUFjLEdBQUc1SSxxQkFBcUIsQ0FBQzVELE9BQU87WUFDcEQ0RCxxQkFBcUIsQ0FBQzVELE9BQU8sR0FBRyxJQUFJLEVBQUM7WUFDL0J5TSxpQkFBaUIsR0FBRyxDQUFDLENBQUNELGNBQWMsSUFBSXJDLGVBQWUsQ0FBQ2hPLFFBQVEsQ0FBQ3FRLGNBQWMsQ0FBQ3ZOLFFBQVEsQ0FBQztZQUN6RnlOLG1CQUFtQixHQUFHLENBQUMsQ0FBQ0YsY0FBYyxJQUFJcEMsaUJBQWlCLENBQUNqTyxRQUFRLENBQUNxUSxjQUFjLENBQUN2TixRQUFRLENBQUMsRUFFbkc7WUFDTTBOLHNCQUFzQixHQUFHN1AsY0FBYyxDQUMxQ25CLEdBQUcsQ0FBQyxVQUFDNkIsTUFBcUI7Y0FBQSxPQUFLQSxNQUFNLENBQUNZLFNBQVM7WUFBQSxFQUFDLENBQ2hENUMsTUFBTSxDQUFDLFVBQUN5RCxRQUFRO2NBQUEsT0FBeUJ6RyxpQkFBaUIsQ0FBQ3lHLFFBQVEsQ0FBQztZQUFBLEVBQUM7WUFDbEUyTixzQkFBc0IsR0FDMUIzQyw0QkFBNEIsSUFDNUIsQ0FBQUQsZUFBZSxhQUFmQSxlQUFlLHVCQUFmQSxlQUFlLENBQUVtRSxjQUFjLE1BQUssVUFBVSxJQUM5Q3hCLHNCQUFzQixDQUFDaUIsTUFBTSxHQUFHLENBQUM7WUFDN0JmLGVBQWUsR0FBR0wsY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUV2TixRQUFRO1lBQzFDNk4sNEJBQTRCLEdBQUd0VSxpQkFBaUIsQ0FBQ3FVLGVBQWUsQ0FBQztZQUV2RSxJQUFJRCxzQkFBc0IsSUFBSUUsNEJBQTRCLEVBQUU7Y0FDcERDLEtBQUssR0FBR0gsc0JBQXNCLEdBQUdELHNCQUFzQixHQUFHRSxlQUFlLEdBQUcsQ0FBQ0EsZUFBZSxDQUFDLEdBQUcsRUFBRTtjQUN4R3RVLHdCQUF3QixDQUFDO2dCQUN2QmtYLE1BQU0sRUFBRSxNQUFNO2dCQUNkMUMsS0FBSyxFQUFMQSxLQUFLO2dCQUNMcE0sU0FBUyxFQUFFMkk7Y0FDYixDQUFDLENBQUM7WUFDSjtZQUVBLElBQUlpRCxlQUFlLEtBQUtqQyxXQUFXLElBQUlDLGFBQWEsSUFBSWtDLGlCQUFpQixJQUFJQyxtQkFBbUIsQ0FBQyxFQUFFO2NBQzNGTyxrQkFBd0MsR0FBR1QsY0FBYyxHQUMxRDtnQkFBRXBPLFNBQVMsRUFBRW9PLGNBQWMsQ0FBQ3ZOLFFBQVE7Z0JBQUV0QixTQUFTLEdBQUFxUCxxQkFBQSxHQUFFUixjQUFjLENBQUNrRCxRQUFRLGNBQUExQyxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLENBQUM7Y0FBRSxDQUFDLEdBQ2pGLElBQUk7Y0FDRkUsZUFBZSxHQUFHLEdBQUFwUixNQUFBLENBQUFpUyxrQkFBQSxDQUNuQmxSLG9DQUFvQyxDQUFDQyxjQUFjLENBQUMsR0FBQWlSLGtCQUFBLENBQ3BENUMsZUFBZSxHQUFBNEMsa0JBQUEsQ0FDZjNDLHlCQUF5QixHQUFBMkMsa0JBQUEsQ0FDeEJkLGtCQUFrQixHQUFHcFEsb0NBQW9DLENBQUMsQ0FBQ29RLGtCQUFrQixDQUFDLENBQUMsR0FBRyxFQUFFLEdBQ3hGdFIsR0FBRyxDQUFDeUIsTUFBTSxDQUFDO2NBQ2IsSUFBSThQLGVBQWUsQ0FBQy9RLFFBQVEsQ0FBQ2lCLE1BQU0sQ0FBQ21QLGVBQWUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JELENBQUFZLGtCQUFBLEdBQUFpQixNQUFNLENBQUNtQixTQUFTLGNBQUFwQyxrQkFBQSxnQkFBQUMscUJBQUEsR0FBaEJELGtCQUFBLENBQWtCd0MsV0FBVyxjQUFBdkMscUJBQUEsZUFBN0JBLHFCQUFBLENBQUFnQyxJQUFBLENBQUFqQyxrQkFBZ0MsQ0FBQztjQUNuQztZQUNGO1lBRUF4SCxlQUFlLENBQUNoRixTQUFTLEVBQUExRixhQUFBLENBQUFBLGFBQUE7Y0FDdkJELEVBQUUsWUFBQWMsTUFBQSxDQUFZd04sZUFBZSxDQUFFO2NBQy9CakosT0FBTyxFQUFFMEosWUFBWTtjQUNyQjFCLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztjQUNoQkMsSUFBSSxFQUFFO2dCQUFFdk4sRUFBRSxFQUFFLFdBQVc7Z0JBQUVHLElBQUksRUFBRTtjQUFZLENBQUM7Y0FDNUN5QixJQUFJLEVBQUUzRSxlQUFlLENBQUN1USxTQUFTO2NBQy9CYSxPQUFPLEVBQVBBO1lBQU8sR0FDSG5QLFdBQVcsQ0FBQzBULE1BQU0sR0FBRyxDQUFDLEdBQUc7Y0FBRTFULFdBQVcsRUFBWEE7WUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2NBQ2pEb1AsZUFBZSxFQUFmQSxlQUFlO2NBQ2ZsQixXQUFXLEVBQUVBLFdBQVcsSUFBSTtZQUFFLEdBQzFCc0MsbUJBQW1CLEdBQUc7Y0FBRUEsbUJBQW1CLEVBQW5CQTtZQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3ZELENBQUM7WUFDRjNFLGdCQUFnQixDQUFDcEYsU0FBUyxDQUFDO1lBRTNCLEtBQUErSSxvQkFBQSxHQUFJZ0IsbUJBQW1CLGNBQUFoQixvQkFBQSxlQUFuQkEsb0JBQUEsQ0FBcUIzSyxPQUFPLEVBQUU7Y0FDaEN0RyxnQkFBZ0IsQ0FBQ2lTLG1CQUFtQixDQUFDM0wsT0FBTyxDQUFDLENBQzFDNlEsSUFBSSxDQUFDLFVBQUFDLFNBQVMsRUFBSTtnQkFDakI3SSxRQUFRLENBQUNDLGFBQWEsQ0FDcEIsSUFBSUgsV0FBVyxDQUFDLG9DQUFvQyxFQUFFO2tCQUNwREMsTUFBTSxFQUFFO29CQUFFcEUsS0FBSyxFQUFFa047a0JBQVU7Z0JBQzdCLENBQUMsQ0FDSCxDQUFDO2NBQ0gsQ0FBQyxDQUFDLFNBQ0ksQ0FBQyxVQUFBQyxHQUFHLEVBQUk7Z0JBQ1pDLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLHVFQUF1RSxFQUFFRixHQUFHLENBQUM7Y0FDN0YsQ0FBQyxDQUFDO1lBQ047WUFFQSxLQUFBbkcsa0JBQUEsR0FBSW9CLGlCQUFpQixjQUFBcEIsa0JBQUEsZUFBakJBLGtCQUFBLENBQW1CNUssT0FBTyxFQUFFO2NBQzlCdEcsZ0JBQWdCLENBQUNzUyxpQkFBaUIsQ0FBQ2hNLE9BQU8sQ0FBQyxDQUN4QzZRLElBQUksQ0FBQyxVQUFBQyxTQUFTLEVBQUk7Z0JBQ2pCN0ksUUFBUSxDQUFDQyxhQUFhLENBQ3BCLElBQUlILFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRTtrQkFDbERDLE1BQU0sRUFBRTtvQkFBRXBFLEtBQUssRUFBRWtOO2tCQUFVO2dCQUM3QixDQUFDLENBQ0gsQ0FBQztjQUNILENBQUMsQ0FBQyxTQUNJLENBQUMsVUFBQUMsR0FBRyxFQUFJO2dCQUNaQyxPQUFPLENBQUNDLEtBQUssQ0FBQyx5REFBeUQsRUFBRUYsR0FBRyxDQUFDO2NBQy9FLENBQUMsQ0FBQztZQUNOO1lBRUE3TCxlQUFlLENBQUNqRSxPQUFPLEdBQUcsS0FBSztZQUMvQmdFLGdCQUFnQixDQUFDaEUsT0FBTyxHQUFHLElBQUk7WUFBQXFOLG1CQUFBLEdBRWUxVCxrQkFBa0IsQ0FBQyxDQUFDLEVBQTFEMlQsaUJBQWlCLEdBQUFELG1CQUFBLENBQWpCQyxpQkFBaUIsRUFBRUMsY0FBYyxHQUFBRixtQkFBQSxDQUFkRSxjQUFjO1lBQUEsTUFDckNuRyxRQUFRLElBQUlrRyxpQkFBaUI7Y0FBQUcsUUFBQSxDQUFBRSxJQUFBO2NBQUE7WUFBQTtZQUFBRixRQUFBLENBQUFFLElBQUE7WUFBQSxPQUN6QkosY0FBYyxDQUFDNU0sU0FBUyxFQUFFO2NBQUVpRyxLQUFLLEVBQUU7WUFBSyxDQUFDLENBQUM7VUFBQTtZQUdsRCxJQUFJMUMsWUFBWSxDQUFDbEUsT0FBTyxFQUFFO2NBQ2xCNkcsV0FBVyxHQUFHLElBQUlDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztjQUN0REUsUUFBUSxDQUFDQyxhQUFhLENBQUNKLFdBQVcsQ0FBQztjQUNuQzNDLFlBQVksQ0FBQ2xFLE9BQU8sR0FBRyxLQUFLO1lBQzlCO1VBQUM7VUFBQTtZQUFBLE9BQUF5TixRQUFBLENBQUF3QyxJQUFBO1FBQUE7TUFBQSxHQUFBN0csT0FBQTtJQUFBLENBQ0Y7SUFBQSxpQkFBQThHLEVBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLEdBQUE7TUFBQSxPQUFBeEgsS0FBQSxDQUFBeUgsS0FBQSxPQUFBQyxTQUFBO0lBQUE7RUFBQSxLQUNELENBQUMvSyxlQUFlLEVBQUVFLGVBQWUsRUFBRUUsZ0JBQWdCLEVBQUV6RCxPQUFPLEVBQUVjLGlCQUFpQixFQUFFTCxLQUFLLEVBQUVKLEtBQUssQ0FDL0YsQ0FBQzs7RUFFRDtFQUNBO0VBQ0E7RUFDQSxJQUFNZ08sZ0JBQWdCLEdBQUd6WixXQUFXLENBQ2xDLFVBQUMwWixXQUFtQixFQUFLO0lBQ3ZCO0lBQ0EsSUFBTWpRLFNBQVMsR0FBRzRDLGFBQWEsQ0FBQ3ZELE9BQU87SUFDdkNxRSxnQkFBZ0IsQ0FBQ3JFLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLElBQU00SixhQUFhLGFBQUE5TixNQUFBLENBQWF1SCxnQkFBZ0IsQ0FBQ3JELE9BQU8sZUFBWTtJQUNwRWxILG9CQUFvQixDQUFDOE8sS0FBSyxDQUFDakgsU0FBUyxDQUFDO0lBQ3JDd0QseUJBQXlCLENBQUNuRSxPQUFPLEdBQUcsSUFBSTtJQUN4Q29FLHFCQUFxQixDQUFDcEUsT0FBTyxHQUFHLElBQUk7SUFDcEM2RixlQUFlLENBQUNsRixTQUFTLEVBQUVpSixhQUFhLENBQUM7SUFFekMsSUFBSWdILFdBQVcsRUFBRTtNQUNmakwsZUFBZSxDQUFDaEYsU0FBUyxFQUFFO1FBQ3pCM0YsRUFBRSxZQUFBYyxNQUFBLENBQVl1SCxnQkFBZ0IsQ0FBQ3JELE9BQU8sQ0FBRTtRQUN4Q0ssT0FBTyxFQUFFdVEsV0FBVztRQUNwQnZJLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztRQUNoQkMsSUFBSSxFQUFFO1VBQUV2TixFQUFFLEVBQUUsV0FBVztVQUFFRyxJQUFJLEVBQUU7UUFBWSxDQUFDO1FBQzVDeUIsSUFBSSxFQUFFM0UsZUFBZSxDQUFDdVE7TUFDeEIsQ0FBQyxDQUFDO0lBQ0o7SUFFQTdDLGVBQWUsQ0FBQ2hGLFNBQVMsRUFBRTtNQUN6QjNGLEVBQUUsWUFBQWMsTUFBQSxDQUFZdUgsZ0JBQWdCLENBQUNyRCxPQUFPLGVBQVk7TUFDbERLLE9BQU8sRUFBRXJDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztNQUM1QnFLLElBQUksRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQztNQUNoQkMsSUFBSSxFQUFFO1FBQUV2TixFQUFFLEVBQUUsV0FBVztRQUFFRyxJQUFJLEVBQUU7TUFBWSxDQUFDO01BQzVDeUIsSUFBSSxFQUFFM0UsZUFBZSxDQUFDdVEsU0FBUztNQUMvQnFJLG1CQUFtQixFQUFFO0lBQ3ZCLENBQUMsQ0FBQztJQUNGOUssZ0JBQWdCLENBQUNwRixTQUFTLENBQUM7SUFDM0JzRCxlQUFlLENBQUNqRSxPQUFPLEdBQUcsS0FBSztJQUMvQmdFLGdCQUFnQixDQUFDaEUsT0FBTyxHQUFHLElBQUk7RUFDakMsQ0FBQyxFQUNELENBQUMyRixlQUFlLEVBQUVFLGVBQWUsRUFBRUUsZ0JBQWdCLEVBQUUvSCxDQUFDLENBQ3hELENBQUM7RUFFRCxJQUFNOFMsc0JBQXNCLEdBQUc1WixXQUFXLENBQ3hDLFVBQUNvUSxHQUFrQixFQUFFL0csUUFBeUIsRUFBRXdRLGtCQUEwQixFQUFLO0lBQUEsSUFBQUMscUJBQUE7SUFDN0UsSUFBUXJRLFNBQVMsR0FBb0IyRyxHQUFHLENBQWhDM0csU0FBUztNQUFFZ0gsYUFBYSxHQUFLTCxHQUFHLENBQXJCSyxhQUFhO0lBQ2hDLElBQU1QLFFBQVEsR0FBR2pPLFVBQVUsQ0FBQ3lNLEVBQUUsQ0FBQ2pGLFNBQVMsQ0FBQztJQUV6QzdILG9CQUFvQixDQUFDOE8sS0FBSyxDQUFDakgsU0FBUyxDQUFDO0lBQ3JDa0YsZUFBZSxDQUFDbEYsU0FBUyxFQUFFZ0gsYUFBYSxDQUFDO0lBRXpDM0QsZ0JBQWdCLENBQUNoRSxPQUFPLEdBQUcsSUFBSTtJQUUvQixJQUFJb0gsUUFBUSxFQUFFO01BQ1pqRCx5QkFBeUIsQ0FBQ25FLE9BQU8sR0FBRyxJQUFJO01BQ3hDb0UscUJBQXFCLENBQUNwRSxPQUFPLEdBQUcsSUFBSTtJQUN0QztJQUVBLElBQU1pUixXQUFpQyxHQUFHO01BQ3hDbkwsU0FBUyxjQUFBaEssTUFBQSxDQUFjeUUsUUFBUSxDQUFDMlEsa0JBQWtCLENBQUU7TUFDcERDLFdBQVcsRUFBRUosa0JBQWtCLElBQUksRUFBRTtNQUNyQ3hRLFFBQVEsRUFBUkEsUUFBUTtNQUNSekQsY0FBYyxFQUFFeUQsUUFBUSxDQUFDQyxlQUFlO01BQ3hDTixTQUFTLEdBQUE4USxxQkFBQSxHQUFFelEsUUFBUSxDQUFDQyxlQUFlLGNBQUF3USxxQkFBQSx1QkFBeEJBLHFCQUFBLENBQTBCclYsR0FBRyxDQUFDLFVBQUE2QixNQUFNO1FBQUEsT0FBSUEsTUFBTSxDQUFDa0QsU0FBUztNQUFBO0lBQ3JFLENBQUM7SUFDRCxJQUFJMEcsUUFBUSxFQUFFO01BQ1pyRCx1QkFBdUIsQ0FBQy9ELE9BQU8sR0FBR2lSLFdBQVc7SUFDL0M7SUFFQSxJQUFJMVEsUUFBUSxDQUFDNlEsd0JBQXdCLEVBQUU7TUFBQSxJQUFBQyxzQkFBQSxFQUFBQyxLQUFBLEVBQUFDLFVBQUEsRUFBQUMsVUFBQTtNQUNyQzNZLHFCQUFxQixDQUNuQmtLLEtBQUssRUFDTDtRQUFFME8sVUFBVSxFQUFFNVosTUFBTSxDQUFDNlosVUFBVTtRQUFFaEQsTUFBTSxFQUFFN1csTUFBTSxDQUFDeVc7TUFBaUIsQ0FBQyxFQUNsRTNMLEtBQUssRUFDTHBDLFFBQVEsRUFDUnNELHdCQUF3QixDQUFDN0QsT0FDM0IsQ0FBQztNQUVELElBQU0yUixXQUFXLElBQUFOLHNCQUFBLEdBQUc5USxRQUFRLENBQUNDLGVBQWUsY0FBQTZRLHNCQUFBLHVCQUF4QkEsc0JBQUEsQ0FBMkIsQ0FBQyxDQUFDO01BQ2pELElBQU1wUyxRQUFRLElBQUFxUyxLQUFBLElBQUFDLFVBQUEsR0FBSWhSLFFBQVEsQ0FBNEJuQyxTQUFTLGNBQUFtVCxVQUFBLGNBQUFBLFVBQUEsR0FBSUksV0FBVyxhQUFYQSxXQUFXLHVCQUFYQSxXQUFXLENBQUV2VCxTQUFTLGNBQUFrVCxLQUFBLGNBQUFBLEtBQUEsR0FBSSxFQUFFO01BQy9GLElBQU01QixRQUFRLEdBQ1osRUFBQThCLFVBQUEsR0FBRWpSLFFBQVEsQ0FBNkM1QyxTQUFTLGNBQUE2VCxVQUFBLGNBQUFBLFVBQUEsR0FDN0RHLFdBQVcsYUFBWEEsV0FBVyx1QkFBWEEsV0FBVyxDQUFFaFUsU0FBUyxLQUN6QixJQUFJO01BQ04sSUFBSXNCLFFBQVEsRUFBRTtRQUNaMkUscUJBQXFCLENBQUM1RCxPQUFPLEdBQUc7VUFBRWYsUUFBUSxFQUFSQSxRQUFRO1VBQUV5USxRQUFRLEVBQVJBO1FBQVMsQ0FBQztNQUN4RDtNQUNBLElBQUl0SSxRQUFRLEVBQUU7UUFDWm5ELGVBQWUsQ0FBQ2pFLE9BQU8sR0FBRyxLQUFLO01BQ2pDO01BQ0E7SUFDRjs7SUFFQTtJQUNBMkYsZUFBZSxDQUFDaEYsU0FBUyxFQUFFO01BQ3pCM0YsRUFBRSxjQUFBYyxNQUFBLENBQWN5RSxRQUFRLENBQUMyUSxrQkFBa0IsQ0FBRTtNQUM3QzdRLE9BQU8sRUFBRTBRLGtCQUFrQixJQUFJLEVBQUU7TUFDakMxSSxJQUFJLEVBQUUsSUFBSUMsSUFBSSxDQUFDLENBQUM7TUFDaEJDLElBQUksRUFBRTtRQUFFdk4sRUFBRSxFQUFFLFdBQVc7UUFBRUcsSUFBSSxFQUFFO01BQVksQ0FBQztNQUM1Q3lCLElBQUksRUFBRTNFLGVBQWUsQ0FBQ3VRLFNBQVM7TUFDL0JqSSxRQUFRLEVBQVJBLFFBQVE7TUFDUjROLGNBQWMsRUFBRTtJQUNsQixDQUFDLENBQUM7SUFDRixJQUFJL0csUUFBUSxFQUFFO01BQ1puRCxlQUFlLENBQUNqRSxPQUFPLEdBQUcsS0FBSztJQUNqQyxDQUFDLE1BQU07TUFDTHJHLGtCQUFrQixDQUFDLENBQUMsQ0FBQzhPLGdCQUFnQixDQUFDOUgsU0FBUyxDQUFDO01BQ2hEdkgsaUNBQWlDLENBQUN1SCxTQUFTLEVBQUUsbUJBQW1CLENBQUM7SUFDbkU7RUFDRixDQUFDLEVBQ0QsQ0FBQ2dDLEtBQUssRUFBRWdELGVBQWUsRUFBRUUsZUFBZSxFQUFFOUMsS0FBSyxDQUNqRCxDQUFDO0VBRUQsSUFBQTZPLHFCQUFBLEdBU0luYSxxQkFBcUIsQ0FBQztNQUN4Qm1OLGVBQWUsRUFBZkEsZUFBZTtNQUNmM0MsT0FBTyxFQUFFb0YsaUJBQWlCO01BQzFCd0ssY0FBYyxFQUFFbkosa0JBQWtCO01BQ2xDb0osY0FBYyxFQUFFL0ksa0JBQWtCO01BQ2xDZ0osTUFBTSxFQUFFcEIsZ0JBQWdCO01BQ3hCcUIsa0JBQWtCLEVBQUVsQixzQkFBc0I7TUFDMUMvTSx1QkFBdUIsRUFBdkJBO0lBQ0YsQ0FBQyxDQUFDO0lBaEJBa08sT0FBTyxHQUFBTCxxQkFBQSxDQUFQSyxPQUFPO0lBQ1BDLGVBQWUsR0FBQU4scUJBQUEsQ0FBZk0sZUFBZTtJQUNKQyxlQUFlLEdBQUFQLHFCQUFBLENBQTFCUSxTQUFTO0lBQ1RDLFNBQVMsR0FBQVQscUJBQUEsQ0FBVFMsU0FBUztJQUNUQyxjQUFjLEdBQUFWLHFCQUFBLENBQWRVLGNBQWM7SUFDZEMsY0FBYyxHQUFBWCxxQkFBQSxDQUFkVyxjQUFjO0lBQ2RDLG9CQUFvQixHQUFBWixxQkFBQSxDQUFwQlksb0JBQW9CO0lBQ3BCQyxhQUFhLEdBQUFiLHFCQUFBLENBQWJhLGFBQWE7RUFXZnBPLGdCQUFnQixDQUFDckUsT0FBTyxHQUFHLFlBQU07SUFDL0J3UyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7SUFDMUIvTixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQlYsdUJBQXVCLENBQUMvRCxPQUFPLEdBQUcsSUFBSTtFQUN4QyxDQUFDO0VBRUQsSUFBTTBTLGNBQWMsR0FBR3BRLE9BQU87RUFFOUIsSUFBTXFRLFdBQVcsR0FBR3piLFdBQVc7SUFBQSxJQUFBMGIsS0FBQSxHQUFBM0osaUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUM3QixTQUFBMEosU0FDRXhTLE9BQWUsRUFDZnZHLG9CQUE0RCxFQUM1RGdaLEtBQWMsRUFDZEMsaUJBQTBCLEVBQzFCQyxRQUEyQixFQUMzQkMsS0FBYyxFQUNkQyxJQUFhO01BQUEsSUFBQUMsb0JBQUE7TUFBQSxJQUFBQyxrQkFBQSxFQUFBQyxxQkFBQSxFQUFBblosV0FBQSxFQUFBQyxPQUFBLEVBQUFtWixpQkFBQSxFQUFBQyxjQUFBLEVBQUFDLFlBQUEsRUFBQUMsV0FBQSxFQUFBQyxrQkFBQSxFQUFBQyxjQUFBLEVBQUFDLFlBQUEsRUFBQUMsc0JBQUEsRUFBQUMsd0JBQUEsRUFBQW5ULFNBQUEsRUFBQW9ULG1CQUFBLEVBQUFDLGVBQUEsRUFBQWxaLFVBQUEsRUFBQUQsU0FBQSxFQUFBb1osT0FBQSxFQUFBQyxzQkFBQSxFQUFBQyxZQUFBLEVBQUFDLHFCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLE9BQUEsRUFBQWhhLG9CQUFBLEVBQUFpYSxnQkFBQSxFQUFBQyxRQUFBLEVBQUFDLFlBQUEsRUFBQUMsd0JBQUEsRUFBQUMsV0FBQTtNQUFBLE9BQUF6TCxtQkFBQSxDQUFBc0UsSUFBQSxXQUFBb0gsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFsSCxJQUFBLEdBQUFrSCxTQUFBLENBQUFqSCxJQUFBO1VBQUE7WUFBQSxNQUVUMUosZUFBZSxDQUFDakUsT0FBTyxJQUFJbVMsZUFBZSxJQUFJL00sZUFBZTtjQUFBd1AsU0FBQSxDQUFBakgsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBaUgsU0FBQSxDQUFBL0csTUFBQTtVQUFBO1lBSWpFO1lBQ0E7WUFDTXVGLGtCQUFrQixHQUFHLENBQUNuYSxvQkFBb0IsQ0FBQ21PLFFBQVEsQ0FBQzdELGFBQWEsQ0FBQ3ZELE9BQU8sQ0FBQztZQUFBLE1BQzVFb1Qsa0JBQWtCLElBQUluYSxvQkFBb0IsQ0FBQzRiLGNBQWMsQ0FBQyxDQUFDLElBQUkzYixzQkFBc0I7Y0FBQTBiLFNBQUEsQ0FBQWpILElBQUE7Y0FBQTtZQUFBO1lBQ3ZGM0csUUFBUSxDQUFDQyxhQUFhLENBQ3BCLElBQUlILFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtjQUNoQ0MsTUFBTSxFQUFFO2dCQUFFZSxJQUFJLEVBQUUsSUFBSTtnQkFBRUMsUUFBUSxFQUFFLE1BQU07Z0JBQUUxSCxPQUFPLEVBQUVyQyxDQUFDLENBQUMsNEJBQTRCO2NBQUU7WUFDbkYsQ0FBQyxDQUNILENBQUM7WUFBQSxPQUFBNFcsU0FBQSxDQUFBL0csTUFBQTtVQUFBO1lBQUF3RixxQkFBQSxHQUk4QnhaLHdCQUF3QixDQUFDQyxvQkFBb0IsQ0FBQyxFQUF2RUksV0FBVyxHQUFBbVoscUJBQUEsQ0FBWG5aLFdBQVcsRUFBRUMsT0FBTyxHQUFBa1oscUJBQUEsQ0FBUGxaLE9BQU8sRUFDNUI7WUFDQTtZQUNNbVosaUJBQWlCLEdBQUdOLFFBQVEsYUFBUkEsUUFBUSxjQUFSQSxRQUFRLEdBQUk3WSxPQUFPLENBQUM2WSxRQUFRO1lBQ2hETyxjQUEwQyxHQUFHcmIsbUJBQW1CLENBQUNvYixpQkFBaUIsQ0FBQztZQUNuRkUsWUFBWSxHQUFHUCxLQUFLLGFBQUxBLEtBQUssY0FBTEEsS0FBSyxHQUFJOVksT0FBTyxDQUFDOFksS0FBSztZQUNyQ1EsV0FBVyxHQUFHUCxJQUFJLGFBQUpBLElBQUksY0FBSkEsSUFBSSxHQUFJL1ksT0FBTyxDQUFDK1ksSUFBSTtZQUNsQ1Esa0JBQWtCLEdBQUd2WixPQUFPLENBQUMyYSxXQUFXO1lBQ3hDbkIsY0FBYyxHQUFHeGIsa0NBQWtDLENBQUNrSSxPQUFPLEVBQUU7Y0FDakU0UyxLQUFLLEVBQUVPLFlBQVk7Y0FDbkJOLElBQUksRUFBRU87WUFDUixDQUFDLENBQUM7WUFFRnhQLGVBQWUsQ0FBQ2pFLE9BQU8sR0FBRyxJQUFJO1lBQzlCd0QsZUFBZSxDQUFDRCxhQUFhLENBQUN2RCxPQUFPLENBQUM7WUFDaEM0VCxZQUFZLEdBQUdyYyxNQUFNLENBQUMsQ0FBQztZQUM3QjhMLGdCQUFnQixDQUFDckQsT0FBTyxHQUFHNFQsWUFBWTtZQUN2Q3RRLG1CQUFtQixDQUFDdEQsT0FBTyxHQUFHSyxPQUFPO1lBRXJDLElBQUksQ0FBQ3FELGFBQWEsQ0FBQzFELE9BQU8sRUFBRTtjQUMxQitDLEtBQUssQ0FBQ2xMLE1BQU0sQ0FBQ2tkLGFBQWEsQ0FBQztjQUMzQnJSLGFBQWEsQ0FBQzFELE9BQU8sR0FBRyxJQUFJO1lBQzlCOztZQUVBO1lBQ002VCxzQkFBc0IsR0FBR2xRLFdBQVcsQ0FBQzNELE9BQU8sQ0FBQ3hFLE1BQU0sQ0FBQyxVQUFBbUwsR0FBRztjQUFBLE9BQUlBLEdBQUcsQ0FBQ25NLFNBQVM7WUFBQSxFQUFDLENBQUMwVCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEY0Rix3QkFBd0IsSUFBQVgsb0JBQUEsR0FBR3hQLFdBQVcsQ0FBQzNELE9BQU8sY0FBQW1ULG9CQUFBLGdCQUFBQSxvQkFBQSxHQUFuQkEsb0JBQUEsQ0FBc0J4UCxXQUFXLENBQUMzRCxPQUFPLENBQUM0TixNQUFNLEdBQUcsQ0FBQyxDQUFDLGNBQUF1RixvQkFBQSx1QkFBckRBLG9CQUFBLENBQXVEcFUsT0FBTztZQUV6RjRCLFNBQVMsR0FBRzRDLGFBQWEsQ0FBQ3ZELE9BQU87WUFBQStULG1CQUFBLEdBTW5DN08sVUFBVSxDQUFDbEYsT0FBTyxFQUpOZ1UsZUFBZSxHQUFBRCxtQkFBQSxDQUE3QjFaLFlBQVksRUFDSFMsVUFBVSxHQUFBaVosbUJBQUEsQ0FBbkJ6UixPQUFPLEVBQ0N6SCxTQUFTLEdBQUFrWixtQkFBQSxDQUFqQjFZLE1BQU0sRUFDQTRZLE9BQU8sR0FBQUYsbUJBQUEsQ0FBYnRSLElBQUk7WUFHTm5KLHNCQUFzQixDQUFDO2NBQ3JCcUgsU0FBUyxFQUFUQSxTQUFTO2NBQ1RxVSxLQUFLLEVBQUUzYix3QkFBd0IsQ0FBQ3NhLGNBQWMsQ0FBQztjQUMvQ2hSLEtBQUssRUFBTEEsS0FBSztjQUNMNUQsT0FBTyxFQUFFK1Usd0JBQXdCLEtBQUluUixLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTNILEVBQUU7Y0FDOUNzSCxPQUFPLEVBQUV4SCxVQUFVO2NBQ25CTyxNQUFNLEVBQUVSLFNBQVM7Y0FDakJYLFdBQVcsRUFBWEE7WUFDRixDQUFDLENBQUM7O1lBRUY7WUFDQXlMLGVBQWUsQ0FBQ2hGLFNBQVMsRUFBQTFGLGFBQUE7Y0FDdkJELEVBQUUsY0FBQWMsTUFBQSxDQUFjdUgsZ0JBQWdCLENBQUNyRCxPQUFPLENBQUU7Y0FDMUNLLE9BQU8sRUFBRXNULGNBQWM7Y0FDdkJ0TCxJQUFJLEVBQUUsSUFBSUMsSUFBSSxDQUFDLENBQUM7Y0FDaEJDLElBQUksRUFBRTVJLFdBQVc7Y0FDakIvQyxJQUFJLEVBQUUzRSxlQUFlLENBQUNnZCxJQUFJO2NBQzFCNUwsT0FBTyxFQUFFblA7WUFBVyxHQUNoQnFaLGNBQWMsR0FBRztjQUFFQSxjQUFjLEVBQWRBO1lBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUM3QyxDQUFDO1lBRUZsUSxnQkFBZ0IsQ0FBQ3JELE9BQU8sR0FBR3pJLE1BQU0sQ0FBQyxDQUFDO1lBRTdCMmMsc0JBQXNCLGFBQUFwWSxNQUFBLENBQWF1SCxnQkFBZ0IsQ0FBQ3JELE9BQU87WUFDakVtRSx5QkFBeUIsQ0FBQ25FLE9BQU8sR0FBR2tVLHNCQUFzQjtZQUMxRDlQLHFCQUFxQixDQUFDcEUsT0FBTyxHQUFHVyxTQUFTO1lBQ3pDN0gsb0JBQW9CLENBQUMrUCxLQUFLLENBQUNsSSxTQUFTLEVBQUV1VCxzQkFBc0IsQ0FBQztZQUM3RHZPLGVBQWUsQ0FBQ2hGLFNBQVMsRUFBRTtjQUN6QjNGLEVBQUUsRUFBRWtaLHNCQUFzQjtjQUMxQjdULE9BQU8sRUFBRSxFQUFFO2NBQ1hnSSxJQUFJLEVBQUUsSUFBSUMsSUFBSSxDQUFDLENBQUM7Y0FDaEJDLElBQUksRUFBRTtnQkFBRXZOLEVBQUUsRUFBRSxXQUFXO2dCQUFFRyxJQUFJLEVBQUUsQ0FBQXdILEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFeEgsSUFBSSxLQUFJO2NBQVksQ0FBQztjQUMzRHlCLElBQUksRUFBRTNFLGVBQWUsQ0FBQ3VRO1lBQ3hCLENBQUMsQ0FBQztZQUVFMkwsWUFBWSxHQUFHOVQsT0FBTztZQUUxQixJQUFJQSxPQUFPLEtBQUtyQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtjQUNuRG1XLFlBQVksV0FBQXJZLE1BQUEsQ0FBV2tDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQywrQkFBQWxDLE1BQUEsQ0FDeEQsRUFBQXNZLHFCQUFBLEdBQUFqYSxPQUFPLENBQUMrYSxjQUFjLGNBQUFkLHFCQUFBLHVCQUF0QkEscUJBQUEsQ0FBd0JlLFVBQVUsT0FBQWQscUJBQUEsR0FBSW5QLFVBQVUsQ0FBQ2xGLE9BQU8sQ0FBQ3NDLE9BQU8sY0FBQStSLHFCQUFBLHVCQUExQkEscUJBQUEsQ0FBNEJjLFVBQVUsRUFDNUU7WUFDSjtZQUVNYixPQUFPLEdBQUczUSxXQUFXLENBQUMzRCxPQUFPLENBQUNyRSxHQUFHLENBQUMsVUFBQXlaLGNBQWM7Y0FBQSxPQUFLO2dCQUN6RHpNLE9BQU8sRUFBRXlNLGNBQWMsQ0FBQy9VLE9BQU87Z0JBQy9CekQsSUFBSSxFQUFFd1ksY0FBYyxDQUFDN00sSUFBSSxDQUFDdk4sRUFBRSxLQUFLMEUsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUMsR0FBRzNILGVBQWUsQ0FBQ2dkLElBQUksR0FBR2hkLGVBQWUsQ0FBQ3VRO2NBQ25HLENBQUM7WUFBQSxDQUFDLENBQUM7WUFFR2xPLG9CQUFvQixHQUFHdVosc0JBQXNCLGFBQXRCQSxzQkFBc0IsdUJBQXRCQSxzQkFBc0IsQ0FBRXJaLFNBQVM7WUFDeEQrWixnQkFBZ0IsR0FBR25hLHVCQUF1QixDQUFDNFosZUFBZSxFQUFFMVosb0JBQW9CLENBQUM7WUFBQXNhLFNBQUEsQ0FBQWpILElBQUE7WUFBQSxPQUVoRTFLLGFBQWEsQ0FBQyxDQUFDc1IsZ0JBQWdCLENBQUMsQ0FBQztVQUFBO1lBQWxEQyxRQUFRLEdBQUFJLFNBQUEsQ0FBQS9GLElBQUE7WUFFUjRGLFlBQVksR0FBRzNCLEtBQUssYUFBTEEsS0FBSyxjQUFMQSxLQUFLLEdBQUkzWSxPQUFPLENBQUMyWSxLQUFLO1lBQ3JDNEIsd0JBQXdCLEdBQUczQixpQkFBaUIsYUFBakJBLGlCQUFpQixjQUFqQkEsaUJBQWlCLEdBQUk1WSxPQUFPLENBQUM0WSxpQkFBaUI7WUFFekU0QixXQUFXLEdBQUExWixhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUE7Y0FDZm9GLE9BQU8sRUFBRThULFlBQVk7Y0FDckJHLE9BQU8sRUFBUEEsT0FBTztjQUNQOVosU0FBUyxFQUFFK1osZ0JBQWdCO2NBQzNCYyxJQUFJLEVBQUUzVixRQUFRLENBQUMyVixJQUFJO2NBQ25CQyxNQUFNLEVBQUU1VixRQUFRLENBQUMxRSxFQUFFLENBQUM0RSxRQUFRLENBQUMsQ0FBQztjQUM5QkMsU0FBUyxFQUFFSCxRQUFRLENBQUNHLFNBQVM7Y0FDN0IwVixRQUFRLEVBQUU3VixRQUFRLENBQUM2VixRQUFRO2NBQzNCQyxTQUFTLEVBQUU5VixRQUFRLENBQUMrVixVQUFVLENBQUM3VixRQUFRLENBQUMsQ0FBQztjQUN6Q21DLE1BQU0sRUFBRXdCLGFBQWEsQ0FBQ3ZELE9BQU87Y0FDN0I4RixTQUFTLEVBQUV6QyxnQkFBZ0IsQ0FBQ3JELE9BQU87Y0FDbkMwVixTQUFTLEVBQUUsQ0FBQS9TLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFeEgsSUFBSSxLQUFJLEVBQUU7Y0FDNUI0RCxPQUFPLEVBQUUrVSx3QkFBd0IsS0FBSW5SLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFM0gsRUFBRSxDQUFDO2NBQy9DNEgsaUJBQWlCLEVBQUVvQyxvQkFBb0IsQ0FBQ2hGLE9BQU87Y0FDL0M2QyxrQkFBa0IsRUFBRW9DLHFCQUFxQixDQUFDakY7WUFBTyxHQUM3QyxDQUFBbEYsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUU2YSxLQUFLLEtBQUksSUFBSSxHQUFHO2NBQUVBLEtBQUssRUFBRWxiLE1BQU0sQ0FBQ0ssVUFBVSxDQUFDNmEsS0FBSztZQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDckUvYSxvQkFBb0IsQ0FBQ0MsU0FBUyxFQUFFQyxVQUFVLENBQUMsR0FDMUMwWixRQUFRLGFBQVJBLFFBQVEsZUFBUkEsUUFBUSxDQUFFNUcsTUFBTSxHQUFHO2NBQUVnSSxXQUFXLEVBQUVwQixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUNyWjtZQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDekQsQ0FBQThZLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFalosRUFBRSxLQUFJLElBQUksR0FBQUMsYUFBQTtjQUNqQnVVLE1BQU0sRUFBRS9VLE1BQU0sQ0FBQ3daLE9BQU8sQ0FBQ2paLEVBQUU7WUFBQyxHQUFNaVosT0FBTyxDQUFDOVksSUFBSSxHQUFHO2NBQUUwYSxRQUFRLEVBQUU1QixPQUFPLENBQUM5WTtZQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDaEYsQ0FBQyxDQUFDLEdBQ0ZqQixXQUFXLENBQUMwVCxNQUFNLEdBQUcsQ0FBQyxHQUFHO2NBQUUxVCxXQUFXLEVBQVhBO1lBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUM3Q3VhLFlBQVksR0FBRztjQUFFM0IsS0FBSyxFQUFFMkI7WUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzNDQyx3QkFBd0IsR0FBRztjQUFFM0IsaUJBQWlCLEVBQUUyQjtZQUF5QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQy9FbEIsWUFBWSxHQUFHO2NBQUVQLEtBQUssRUFBRU87WUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzNDQyxXQUFXLEdBQUc7Y0FBRVAsSUFBSSxFQUFFTztZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDeEMsQ0FBQTlRLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbVQsTUFBTSxLQUFJLElBQUksR0FBRztjQUFFQyxXQUFXLEVBQUVwVCxLQUFLLENBQUNtVDtZQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQsQ0FBQW5ULEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFNUcsSUFBSSxLQUFJLElBQUksR0FBRztjQUFFaWEsU0FBUyxFQUFFclQsS0FBSyxDQUFDNUc7WUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3BELENBQUE0RyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRXNULEtBQUssS0FBSSxJQUFJLEdBQUc7Y0FBRUMsVUFBVSxFQUFFdlQsS0FBSyxDQUFDc1Q7WUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3ZEMUMsY0FBYyxHQUFHO2NBQUVBLGNBQWMsRUFBZEE7WUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3hDRyxrQkFBa0IsR0FBRztjQUFFb0IsV0FBVyxFQUFFcEI7WUFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUduRXpCLE9BQU8sQ0FBQzBDLFdBQVcsQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBQyxTQUFBLENBQUEzRSxJQUFBO1FBQUE7TUFBQSxHQUFBNEMsUUFBQTtJQUFBLENBQ3JCO0lBQUEsaUJBQUFzRCxHQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBLEVBQUFDLElBQUEsRUFBQUMsSUFBQSxFQUFBQyxJQUFBO01BQUEsT0FBQTdELEtBQUEsQ0FBQW5DLEtBQUEsT0FBQUMsU0FBQTtJQUFBO0VBQUEsS0FDRCxDQUNFbkwsVUFBVSxFQUNWSSxlQUFlLEVBQ2Y1QyxLQUFLLEVBQ0xrUCxPQUFPLEVBQ1AzUCxPQUFPLEVBQ1BqSCxNQUFNLEVBQ05vSCxJQUFJLEVBQ0pwSSxZQUFZLEVBQ1pxRixRQUFRLEVBQ1JpRCxLQUFLLEVBQ0wzRSxDQUFDLEVBQ0RtVSxlQUFlLEVBQ2YvTSxlQUFlLEVBQ2Z4QyxpQkFBaUIsRUFDakJDLGtCQUFrQixDQUV0QixDQUFDO0VBRUQsSUFBTTZULGFBQWEsR0FBR3hmLFdBQVcsQ0FDL0IsVUFBQ3dYLE1BQWUsRUFBSztJQUNuQixJQUFJLENBQUNwTCxtQkFBbUIsQ0FBQ3RELE9BQU8sRUFBRTtJQUVsQyxJQUFJME8sTUFBTSxDQUFDMVQsRUFBRSxNQUFLc0gsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUV0SCxFQUFFLEdBQUU7TUFDN0J1SCxVQUFVLENBQUNtTSxNQUFNLENBQUM7SUFDcEI7SUFFQSxJQUFJcE0sT0FBTyxJQUFJZ0IsbUJBQW1CLENBQUN0RCxPQUFPLEVBQUU7TUFDMUMsSUFBTXNVLE9BQU8sR0FBRzNRLFdBQVcsQ0FBQzNELE9BQU8sQ0FBQ3JFLEdBQUcsQ0FBQyxVQUFBeVosY0FBYztRQUFBLE9BQUs7VUFDekR6TSxPQUFPLEVBQUV5TSxjQUFjLENBQUMvVSxPQUFPO1VBQy9CekQsSUFBSSxFQUFFd1ksY0FBYyxDQUFDN00sSUFBSSxDQUFDdk4sRUFBRSxLQUFLMEUsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUMsR0FBRzNILGVBQWUsQ0FBQ2dkLElBQUksR0FBR2hkLGVBQWUsQ0FBQ3VRO1FBQ25HLENBQUM7TUFBQSxDQUFDLENBQUM7TUFFSHlKLE9BQU8sQ0FBQWhYLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUE7UUFDTG9GLE9BQU8sRUFBRWlELG1CQUFtQixDQUFDdEQsT0FBTztRQUNwQ3NVLE9BQU8sRUFBUEEsT0FBTztRQUNQOVosU0FBUyxFQUFFa1UsTUFBTSxDQUFDMVQsRUFBRTtRQUNwQnFhLElBQUksRUFBRTNWLFFBQVEsQ0FBQzJWLElBQUk7UUFDbkJDLE1BQU0sRUFBRTVWLFFBQVEsQ0FBQzFFLEVBQUUsQ0FBQzRFLFFBQVEsQ0FBQyxDQUFDO1FBQzlCQyxTQUFTLEVBQUVILFFBQVEsQ0FBQ0csU0FBUztRQUM3QjBWLFFBQVEsRUFBRTdWLFFBQVEsQ0FBQzZWLFFBQVE7UUFDM0JDLFNBQVMsRUFBRTlWLFFBQVEsQ0FBQytWLFVBQVUsQ0FBQzdWLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDbUMsTUFBTSxFQUFFd0IsYUFBYSxDQUFDdkQsT0FBTztRQUM3QjhGLFNBQVMsRUFBRXpDLGdCQUFnQixDQUFDckQsT0FBTztRQUNuQzBWLFNBQVMsRUFBRSxDQUFBL1MsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUV4SCxJQUFJLEtBQUksRUFBRTtRQUM1QjRELE9BQU8sRUFBRSxDQUFBNEQsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUzSCxFQUFFLEtBQUksRUFBRTtRQUN4QjRILGlCQUFpQixFQUFFb0Msb0JBQW9CLENBQUNoRixPQUFPO1FBQy9DNkMsa0JBQWtCLEVBQUVvQyxxQkFBcUIsQ0FBQ2pGO01BQU8sR0FDN0MsQ0FBQTBPLE1BQU0sYUFBTkEsTUFBTSx1QkFBTkEsTUFBTSxDQUFFaUgsS0FBSyxLQUFJLElBQUksR0FBRztRQUFFQSxLQUFLLEVBQUVsYixNQUFNLENBQUNpVSxNQUFNLENBQUNpSCxLQUFLO01BQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUM1RCxDQUFBakgsTUFBTSxhQUFOQSxNQUFNLHVCQUFOQSxNQUFNLENBQUV4VCxRQUFRLEtBQUksSUFBSSxHQUFHO1FBQUVBLFFBQVEsRUFBRVQsTUFBTSxDQUFDaVUsTUFBTSxDQUFDeFQsUUFBUTtNQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDckUsQ0FBQXlILEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbVQsTUFBTSxLQUFJLElBQUksR0FBRztRQUFFQyxXQUFXLEVBQUVwVCxLQUFLLENBQUNtVDtNQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQsQ0FBQW5ULEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFNUcsSUFBSSxLQUFJLElBQUksR0FBRztRQUFFaWEsU0FBUyxFQUFFclQsS0FBSyxDQUFDNUc7TUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3pELENBQUM7SUFDSjtFQUNGLENBQUMsRUFDRCxDQUFDdUcsT0FBTyxFQUFFQyxVQUFVLEVBQUUwUCxPQUFPLEVBQUV2UyxRQUFRLEVBQUVrRCxpQkFBaUIsRUFBRUQsS0FBSyxDQUNuRSxDQUFDO0VBRUQsSUFBTWdVLFlBQVksR0FBR3pmLFdBQVc7SUFBQSxJQUFBMGYsS0FBQSxHQUFBM04saUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUM5QixTQUFBME4sU0FBT3hXLE9BQW9CO01BQUEsSUFBQXlXLG9CQUFBLEVBQUFDLHFCQUFBLEVBQUFDLG9CQUFBLEVBQUFDLHFCQUFBLEVBQUFDLGFBQUE7TUFBQSxJQUFBdlcsU0FBQSxFQUFBd1csZ0JBQUEsRUFBQUMsV0FBQSxFQUFBQyxNQUFBLEVBQUFDLHVCQUFBLEVBQUFDLFNBQUEsRUFBQTNELFlBQUEsRUFBQU0sc0JBQUEsRUFBQXNELFdBQUEsRUFBQUMsWUFBQSxFQUFBQyxvQkFBQSxFQUFBMUQsZUFBQSxFQUFBbFosVUFBQSxFQUFBRCxTQUFBLEVBQUFvWixPQUFBLEVBQUFKLHNCQUFBLEVBQUFVLGdCQUFBLEVBQUFULHdCQUFBLEVBQUE1WixXQUFBLEVBQUF5ZCxxQkFBQSxFQUFBQyxNQUFBO01BQUEsT0FBQTFPLG1CQUFBLENBQUFzRSxJQUFBLFdBQUFxSyxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQW5LLElBQUEsR0FBQW1LLFNBQUEsQ0FBQWxLLElBQUE7VUFBQTtZQUFBLE1BQ3JCMUosZUFBZSxDQUFDakUsT0FBTyxJQUFJbVMsZUFBZSxJQUFJL00sZUFBZTtjQUFBeVMsU0FBQSxDQUFBbEssSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBa0ssU0FBQSxDQUFBaEssTUFBQTtVQUFBO1lBRTNEbE4sU0FBUyxHQUFHNEMsYUFBYSxDQUFDdkQsT0FBTztZQUFBLEtBQ25DL0csb0JBQW9CLENBQUNtTyxRQUFRLENBQUN6RyxTQUFTLENBQUM7Y0FBQWtYLFNBQUEsQ0FBQWxLLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQWtLLFNBQUEsQ0FBQWhLLE1BQUE7VUFBQTtZQUFBLE1BQ3hDNVUsb0JBQW9CLENBQUM0YixjQUFjLENBQUMsQ0FBQyxJQUFJM2Isc0JBQXNCO2NBQUEyZSxTQUFBLENBQUFsSyxJQUFBO2NBQUE7WUFBQTtZQUNqRTNHLFFBQVEsQ0FBQ0MsYUFBYSxDQUNwQixJQUFJSCxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7Y0FDaENDLE1BQU0sRUFBRTtnQkFBRWUsSUFBSSxFQUFFLElBQUk7Z0JBQUVDLFFBQVEsRUFBRSxNQUFNO2dCQUFFMUgsT0FBTyxFQUFFckMsQ0FBQyxDQUFDLDRCQUE0QjtjQUFFO1lBQ25GLENBQUMsQ0FDSCxDQUFDO1lBQUEsT0FBQTZaLFNBQUEsQ0FBQWhLLE1BQUE7VUFBQTtZQUlHc0osZ0JBQWdCLEdBQUd4VCxXQUFXLENBQUMzRCxPQUFPO1lBQUEsSUFDdkNtWCxnQkFBZ0IsQ0FBQzFXLElBQUksQ0FBQyxVQUFBcVgsSUFBSTtjQUFBLE9BQUlBLElBQUksQ0FBQzljLEVBQUUsS0FBS3FGLE9BQU8sQ0FBQ3JGLEVBQUU7WUFBQSxFQUFDO2NBQUE2YyxTQUFBLENBQUFsSyxJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUFrSyxTQUFBLENBQUFoSyxNQUFBO1VBQUE7WUFFcER1SixXQUFXLEdBQUc1ZCx1QkFBdUIsQ0FBQzJkLGdCQUFnQixFQUFFOVcsT0FBTyxDQUFDO1lBQUEsTUFDbEUsRUFBQytXLFdBQVcsYUFBWEEsV0FBVyxnQkFBQU4sb0JBQUEsR0FBWE0sV0FBVyxDQUFFL1csT0FBTyxjQUFBeVcsb0JBQUEsZUFBcEJBLG9CQUFBLENBQXNCamIsSUFBSSxDQUFDLENBQUMsS0FBSSxFQUFDdWIsV0FBVyxhQUFYQSxXQUFXLGdCQUFBTCxxQkFBQSxHQUFYSyxXQUFXLENBQUVsZCxXQUFXLGNBQUE2YyxxQkFBQSxlQUF4QkEscUJBQUEsQ0FBMEJuSixNQUFNLEtBQUksRUFBQ3dKLFdBQVcsYUFBWEEsV0FBVyxnQkFBQUosb0JBQUEsR0FBWEksV0FBVyxDQUFFL04sT0FBTyxjQUFBMk4sb0JBQUEsZUFBcEJBLG9CQUFBLENBQXNCcEosTUFBTTtjQUFBaUssU0FBQSxDQUFBbEssSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBa0ssU0FBQSxDQUFBaEssTUFBQTtVQUFBO1lBSWpHd0osTUFBTSxHQUFHM2Qsa0JBQWtCLENBQUMyRyxPQUFPLENBQUM7WUFDcENpWCx1QkFBdUIsR0FBR2pYLE9BQU8sQ0FBQ3dRLG1CQUFtQixJQUFJLEdBQUFvRyxxQkFBQSxHQUFDNVcsT0FBTyxDQUFDaUosZUFBZSxjQUFBMk4scUJBQUEsZUFBdkJBLHFCQUFBLENBQXlCcGIsSUFBSSxDQUFDLENBQUM7WUFBQSxNQUMzRixDQUFDd2IsTUFBTSxJQUFJLENBQUNDLHVCQUF1QjtjQUFBTyxTQUFBLENBQUFsSyxJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUFrSyxTQUFBLENBQUFoSyxNQUFBO1VBQUE7WUFFakMwSixTQUFTLEdBQUc5ZCwwQkFBMEIsQ0FBQzBkLGdCQUFnQixFQUFFOVcsT0FBTyxDQUFDO1lBRXZFNEQsZUFBZSxDQUFDakUsT0FBTyxHQUFHLElBQUk7WUFDOUJnRSxnQkFBZ0IsQ0FBQ2hFLE9BQU8sR0FBR21YLGdCQUFnQjtZQUMzQzNULGVBQWUsQ0FBQzdDLFNBQVMsQ0FBQztZQUVwQmlULFlBQVksR0FBR3JjLE1BQU0sQ0FBQyxDQUFDO1lBQzdCOEwsZ0JBQWdCLENBQUNyRCxPQUFPLEdBQUc0VCxZQUFZO1lBQ3ZDdFEsbUJBQW1CLENBQUN0RCxPQUFPLEdBQUdvWCxXQUFXLENBQUMvVyxPQUFPO1lBQzNDNlQsc0JBQXNCLGFBQUFwWSxNQUFBLENBQWE4WCxZQUFZO1lBQ3JEelAseUJBQXlCLENBQUNuRSxPQUFPLEdBQUdrVSxzQkFBc0I7WUFDMUQ5UCxxQkFBcUIsQ0FBQ3BFLE9BQU8sR0FBR1csU0FBUztZQUVuQzZXLFdBQXdCLEdBQUc7Y0FDL0J4YyxFQUFFLEVBQUVrWixzQkFBc0I7Y0FDMUI3VCxPQUFPLEVBQUUsRUFBRTtjQUNYZ0ksSUFBSSxFQUFFLElBQUlDLElBQUksQ0FBQyxDQUFDO2NBQ2hCQyxJQUFJLEVBQUU7Z0JBQUV2TixFQUFFLEVBQUUsV0FBVztnQkFBRUcsSUFBSSxFQUFFLENBQUF3SCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRXhILElBQUksS0FBSTtjQUFZLENBQUM7Y0FDM0R5QixJQUFJLEVBQUUzRSxlQUFlLENBQUN1UTtZQUN4QixDQUFDO1lBQ0tpUCxZQUFZLE1BQUEzYixNQUFBLENBQUFpUyxrQkFBQSxDQUFPd0osU0FBUyxJQUFFQyxXQUFXO1lBQy9DN1QsV0FBVyxDQUFDM0QsT0FBTyxHQUFHeVgsWUFBWTtZQUNsQ2hTLGVBQWUsQ0FBQ2dTLFlBQVksQ0FBQztZQUM3QjNlLG9CQUFvQixDQUFDK1AsS0FBSyxDQUFDbEksU0FBUyxFQUFFdVQsc0JBQXNCLENBQUM7WUFBQXdELG9CQUFBLEdBT3pEeFMsVUFBVSxDQUFDbEYsT0FBTyxFQUpOZ1UsZUFBZSxHQUFBMEQsb0JBQUEsQ0FBN0JyZCxZQUFZLEVBQ0hTLFVBQVUsR0FBQTRjLG9CQUFBLENBQW5CcFYsT0FBTyxFQUNDekgsU0FBUyxHQUFBNmMsb0JBQUEsQ0FBakJyYyxNQUFNLEVBQ0E0WSxPQUFPLEdBQUF5RCxvQkFBQSxDQUFialYsSUFBSTtZQUVBb1Isc0JBQXNCLEdBQUcwRCxTQUFTLENBQUMvYixNQUFNLENBQUMsVUFBQW1MLEdBQUc7Y0FBQSxPQUFJQSxHQUFHLENBQUNuTSxTQUFTO1lBQUEsRUFBQyxDQUFDMFQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFcUcsZ0JBQWdCLEdBQUduYSx1QkFBdUIsQ0FBQzRaLGVBQWUsRUFBRUgsc0JBQXNCLGFBQXRCQSxzQkFBc0IsdUJBQXRCQSxzQkFBc0IsQ0FBRXJaLFNBQVMsQ0FBQztZQUM5RnNaLHdCQUF3QixHQUFHLEVBQUFvRCxhQUFBLEdBQUFLLFNBQVMsQ0FBQ3JKLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFBZ0osYUFBQSx1QkFBaEJBLGFBQUEsQ0FBa0JuWSxPQUFPLEtBQUlzQixPQUFPLENBQUN0QixPQUFPO1lBQ3ZFN0UsV0FBVyxHQUFHRixLQUFLLENBQUNDLE9BQU8sQ0FBQ21kLFdBQVcsQ0FBQ2xkLFdBQVcsQ0FBQyxHQUN0RGtkLFdBQVcsQ0FBQ2xkLFdBQVcsR0FDdkJGLEtBQUssQ0FBQ0MsT0FBTyxDQUFDbWQsV0FBVyxDQUFDL04sT0FBTyxDQUFDLEdBQ2hDK04sV0FBVyxDQUFDL04sT0FBTyxHQUNuQixFQUFFO1lBRUZzTyxxQkFBcUI7Y0FBQSxJQUFBSSxLQUFBLEdBQUE5TyxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUcsU0FBQTZPLFNBQUE7Z0JBQUEsSUFBQTFELE9BQUEsRUFBQUUsUUFBQSxFQUFBb0QsTUFBQSxFQUFBSyxFQUFBO2dCQUFBLE9BQUEvTyxtQkFBQSxDQUFBc0UsSUFBQSxXQUFBMEssU0FBQTtrQkFBQSxrQkFBQUEsU0FBQSxDQUFBeEssSUFBQSxHQUFBd0ssU0FBQSxDQUFBdkssSUFBQTtvQkFBQTtzQkFDdEIyRyxPQUFPLEdBQUdpRCxTQUFTLENBQUM1YixHQUFHLENBQUMsVUFBQXlaLGNBQWM7d0JBQUEsT0FBSzswQkFDL0N6TSxPQUFPLEVBQUV5TSxjQUFjLENBQUMvVSxPQUFPOzBCQUMvQnpELElBQUksRUFBRXdZLGNBQWMsQ0FBQzdNLElBQUksQ0FBQ3ZOLEVBQUUsS0FBSzBFLFFBQVEsQ0FBQzFFLEVBQUUsQ0FBQzRFLFFBQVEsQ0FBQyxDQUFDLEdBQUczSCxlQUFlLENBQUNnZCxJQUFJLEdBQUdoZCxlQUFlLENBQUN1UTt3QkFDbkcsQ0FBQztzQkFBQSxDQUFDLENBQUM7c0JBQUEsS0FDYytMLGdCQUFnQjt3QkFBQTJELFNBQUEsQ0FBQXZLLElBQUE7d0JBQUE7c0JBQUE7c0JBQUF1SyxTQUFBLENBQUF2SyxJQUFBO3NCQUFBLE9BQVMxSyxhQUFhLENBQUMsQ0FBQ3NSLGdCQUFnQixDQUFDLENBQUM7b0JBQUE7c0JBQUEwRCxFQUFBLEdBQUFDLFNBQUEsQ0FBQXJKLElBQUE7c0JBQUFxSixTQUFBLENBQUF2SyxJQUFBO3NCQUFBO29CQUFBO3NCQUFBc0ssRUFBQSxHQUFHLElBQUk7b0JBQUE7c0JBQTVFekQsUUFBUSxHQUFBeUQsRUFBQTtzQkFBQUMsU0FBQSxDQUFBdkssSUFBQTtzQkFBQSxPQUVPc0UsT0FBTyxDQUFBaFgsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUE7d0JBQzFCb0YsT0FBTyxFQUFFK1csV0FBVyxDQUFDL1csT0FBTzt3QkFDNUJpVSxPQUFPLEVBQVBBLE9BQU87d0JBQ1A5WixTQUFTLEVBQUUrWixnQkFBZ0I7d0JBQzNCYyxJQUFJLEVBQUUzVixRQUFRLENBQUMyVixJQUFJO3dCQUNuQkMsTUFBTSxFQUFFNVYsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUM7d0JBQzlCQyxTQUFTLEVBQUVILFFBQVEsQ0FBQ0csU0FBUzt3QkFDN0IwVixRQUFRLEVBQUU3VixRQUFRLENBQUM2VixRQUFRO3dCQUMzQkMsU0FBUyxFQUFFOVYsUUFBUSxDQUFDK1YsVUFBVSxDQUFDN1YsUUFBUSxDQUFDLENBQUM7d0JBQ3pDbUMsTUFBTSxFQUFFcEIsU0FBUzt3QkFDakJtRixTQUFTLEVBQUU4TixZQUFZO3dCQUN2QjhCLFNBQVMsRUFBRSxDQUFBL1MsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUV4SCxJQUFJLEtBQUksRUFBRTt3QkFDNUI0RCxPQUFPLEVBQUUzQixNQUFNLENBQUMwVyx3QkFBd0IsS0FBSW5SLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFM0gsRUFBRSxLQUFJLEVBQUUsQ0FBQzt3QkFDNUQ0SCxpQkFBaUIsRUFBRW9DLG9CQUFvQixDQUFDaEYsT0FBTzt3QkFDL0M2QyxrQkFBa0IsRUFBRW9DLHFCQUFxQixDQUFDakY7c0JBQU8sR0FDN0MsQ0FBQWxGLFVBQVUsYUFBVkEsVUFBVSx1QkFBVkEsVUFBVSxDQUFFNmEsS0FBSyxLQUFJLElBQUksR0FBRzt3QkFBRUEsS0FBSyxFQUFFbGIsTUFBTSxDQUFDSyxVQUFVLENBQUM2YSxLQUFLO3NCQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDckUvYSxvQkFBb0IsQ0FBQ0MsU0FBUyxFQUFFQyxVQUFVLENBQUMsR0FDMUMwWixRQUFRLGFBQVJBLFFBQVEsZUFBUkEsUUFBUSxDQUFFNUcsTUFBTSxHQUFHO3dCQUFFZ0ksV0FBVyxFQUFFcEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDclo7c0JBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUN6RCxDQUFBOFksT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVqWixFQUFFLEtBQUksSUFBSSxHQUFBQyxhQUFBO3dCQUNqQnVVLE1BQU0sRUFBRS9VLE1BQU0sQ0FBQ3daLE9BQU8sQ0FBQ2paLEVBQUU7c0JBQUMsR0FBTWlaLE9BQU8sQ0FBQzlZLElBQUksR0FBRzt3QkFBRTBhLFFBQVEsRUFBRTVCLE9BQU8sQ0FBQzlZO3NCQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDaEYsQ0FBQyxDQUFDLEdBQ0ZqQixXQUFXLENBQUMwVCxNQUFNLEdBQUcsQ0FBQyxHQUFHO3dCQUFFMVQsV0FBVyxFQUFYQTtzQkFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQzdDLENBQUF5SSxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRW1ULE1BQU0sS0FBSSxJQUFJLEdBQUc7d0JBQUVDLFdBQVcsRUFBRXBULEtBQUssQ0FBQ21UO3NCQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQsQ0FBQW5ULEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFNUcsSUFBSSxLQUFJLElBQUksR0FBRzt3QkFBRWlhLFNBQVMsRUFBRXJULEtBQUssQ0FBQzVHO3NCQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDcEQsQ0FBQTRHLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFc1QsS0FBSyxLQUFJLElBQUksR0FBRzt3QkFBRUMsVUFBVSxFQUFFdlQsS0FBSyxDQUFDc1Q7c0JBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUN2RG1CLFdBQVcsQ0FBQzdELGNBQWMsR0FBRzt3QkFBRUEsY0FBYyxFQUFFNkQsV0FBVyxDQUFDN0Q7c0JBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNyRixDQUFDO29CQUFBO3NCQTFCSXFFLE1BQU0sR0FBQU0sU0FBQSxDQUFBckosSUFBQTtzQkE0QlosSUFBSSxDQUFDK0ksTUFBTSxDQUFDTyxPQUFPLEVBQUU7d0JBQ25CblUsZ0JBQWdCLENBQUNoRSxPQUFPLEdBQUcsSUFBSTt3QkFDL0IyRCxXQUFXLENBQUMzRCxPQUFPLEdBQUdtWCxnQkFBZ0I7d0JBQ3RDMVIsZUFBZSxDQUFDMFIsZ0JBQWdCLENBQUM7d0JBQ2pDcmUsb0JBQW9CLENBQUM4TyxLQUFLLENBQUNqSCxTQUFTLENBQUM7d0JBQ3JDd0QseUJBQXlCLENBQUNuRSxPQUFPLEdBQUcsSUFBSTt3QkFDeENvRSxxQkFBcUIsQ0FBQ3BFLE9BQU8sR0FBRyxJQUFJO3dCQUNwQ2lFLGVBQWUsQ0FBQ2pFLE9BQU8sR0FBRyxLQUFLO3dCQUMvQixJQUFJNFgsTUFBTSxDQUFDUSxNQUFNLEtBQUssT0FBTyxFQUFFOzBCQUM3QnBSLFFBQVEsQ0FBQ0MsYUFBYSxDQUNwQixJQUFJSCxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7NEJBQ2hDQyxNQUFNLEVBQUU7OEJBQUVlLElBQUksRUFBRSxJQUFJOzhCQUFFQyxRQUFRLEVBQUUsTUFBTTs4QkFBRTFILE9BQU8sRUFBRXJDLENBQUMsQ0FBQyw0QkFBNEI7NEJBQUU7MEJBQ25GLENBQUMsQ0FDSCxDQUFDO3dCQUNIO3NCQUNGO29CQUFDO29CQUFBO3NCQUFBLE9BQUFrYSxTQUFBLENBQUFqSSxJQUFBO2tCQUFBO2dCQUFBLEdBQUErSCxRQUFBO2NBQUEsQ0FDRjtjQUFBLGdCQW5ES0wscUJBQXFCQSxDQUFBO2dCQUFBLE9BQUFJLEtBQUEsQ0FBQXRILEtBQUEsT0FBQUMsU0FBQTtjQUFBO1lBQUE7WUFBQSxNQXFEdkI0Ryx1QkFBdUIsSUFBSSxDQUFDRCxNQUFNO2NBQUFRLFNBQUEsQ0FBQWxLLElBQUE7Y0FBQTtZQUFBO1lBQUFrSyxTQUFBLENBQUFsSyxJQUFBO1lBQUEsT0FDOUJnSyxxQkFBcUIsQ0FBQyxDQUFDO1VBQUE7WUFBQSxPQUFBRSxTQUFBLENBQUFoSyxNQUFBO1VBQUE7WUFBQWdLLFNBQUEsQ0FBQWxLLElBQUE7WUFBQSxPQUlWdUUsZUFBZSxDQUFBalgsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQTtjQUNsQzhHLE1BQU0sRUFBRXBCLFNBQVM7Y0FDakJtRixTQUFTLEVBQUU4TixZQUFZO2NBQ3ZCdEssZUFBZSxFQUFFK04sTUFBTTtjQUN2QmhDLElBQUksRUFBRTNWLFFBQVEsQ0FBQzJWLElBQUk7Y0FDbkJ0VyxPQUFPLEVBQUUzQixNQUFNLENBQUMwVyx3QkFBd0IsS0FBSW5SLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFM0gsRUFBRSxLQUFJLEVBQUUsQ0FBQztjQUM1RDBhLFNBQVMsRUFBRSxDQUFBL1MsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUV4SCxJQUFJLEtBQUk7WUFBRSxHQUN4QixDQUFBd0gsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUU1RyxJQUFJLEtBQUksSUFBSSxHQUFHO2NBQUVpYSxTQUFTLEVBQUVyVCxLQUFLLENBQUM1RztZQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Y0FDeEQ2RyxpQkFBaUIsRUFBRW9DLG9CQUFvQixDQUFDaEYsT0FBTztjQUMvQzZDLGtCQUFrQixFQUFFb0MscUJBQXFCLENBQUNqRjtZQUFPLEdBQzdDdVUsZ0JBQWdCLEdBQUc7Y0FBRS9aLFNBQVMsRUFBRStaO1lBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDeEQzWixvQkFBb0IsQ0FBQ0MsU0FBUyxFQUFFQyxVQUFVLENBQUMsR0FDMUMsQ0FBQW1aLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFalosRUFBRSxLQUFJLElBQUksR0FBRztjQUFFd1UsTUFBTSxFQUFFL1UsTUFBTSxDQUFDd1osT0FBTyxDQUFDalosRUFBRTtZQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDOUQsQ0FBQztVQUFBO1lBYkk0YyxNQUFNLEdBQUFDLFNBQUEsQ0FBQWhKLElBQUE7WUFBQSxLQWVSK0ksTUFBTSxDQUFDTyxPQUFPO2NBQUFOLFNBQUEsQ0FBQWxLLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQWtLLFNBQUEsQ0FBQWhLLE1BQUE7VUFBQTtZQUFBLE1BRWQrSixNQUFNLENBQUNRLE1BQU0sS0FBSyxnQkFBZ0I7Y0FBQVAsU0FBQSxDQUFBbEssSUFBQTtjQUFBO1lBQUE7WUFBQWtLLFNBQUEsQ0FBQWxLLElBQUE7WUFBQSxPQUM5QmdLLHFCQUFxQixDQUFDLENBQUM7VUFBQTtZQUFBLE9BQUFFLFNBQUEsQ0FBQWhLLE1BQUE7VUFBQTtZQUkvQjdKLGdCQUFnQixDQUFDaEUsT0FBTyxHQUFHLElBQUk7WUFDL0IyRCxXQUFXLENBQUMzRCxPQUFPLEdBQUdtWCxnQkFBZ0I7WUFDdEMxUixlQUFlLENBQUMwUixnQkFBZ0IsQ0FBQztZQUNqQ3JlLG9CQUFvQixDQUFDOE8sS0FBSyxDQUFDakgsU0FBUyxDQUFDO1lBQ3JDd0QseUJBQXlCLENBQUNuRSxPQUFPLEdBQUcsSUFBSTtZQUN4Q29FLHFCQUFxQixDQUFDcEUsT0FBTyxHQUFHLElBQUk7WUFDcENpRSxlQUFlLENBQUNqRSxPQUFPLEdBQUcsS0FBSztZQUMvQixJQUFJNFgsTUFBTSxDQUFDUSxNQUFNLEtBQUssT0FBTyxFQUFFO2NBQzdCcFIsUUFBUSxDQUFDQyxhQUFhLENBQ3BCLElBQUlILFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDaENDLE1BQU0sRUFBRTtrQkFBRWUsSUFBSSxFQUFFLElBQUk7a0JBQUVDLFFBQVEsRUFBRSxNQUFNO2tCQUFFMUgsT0FBTyxFQUFFckMsQ0FBQyxDQUFDLDRCQUE0QjtnQkFBRTtjQUNuRixDQUFDLENBQ0gsQ0FBQztZQUNIO1VBQUM7VUFBQTtZQUFBLE9BQUE2WixTQUFBLENBQUE1SCxJQUFBO1FBQUE7TUFBQSxHQUFBNEcsUUFBQTtJQUFBLENBQ0Y7SUFBQSxpQkFBQXdCLElBQUE7TUFBQSxPQUFBekIsS0FBQSxDQUFBbkcsS0FBQSxPQUFBQyxTQUFBO0lBQUE7RUFBQSxLQUNELENBQ0V5QixlQUFlLEVBQ2YvTSxlQUFlLEVBQ2ZLLGVBQWUsRUFDZnlNLGVBQWUsRUFDZkQsT0FBTyxFQUNQaFAsYUFBYSxFQUNidkQsUUFBUSxFQUNSaUQsS0FBSyxFQUNMM0UsQ0FBQyxFQUNEd0YsZUFBZSxDQUVuQixDQUFDO0VBRUQsSUFBTThVLGNBQWMsR0FBR3BoQixXQUFXO0lBQUEsSUFBQXFoQixLQUFBLEdBQUF0UCxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUMsU0FBQXFQLFNBQU9DLFlBQXNCLEVBQUVDLGFBQXFCO01BQUEsSUFBQUMsUUFBQTtNQUFBLE9BQUF6UCxtQkFBQSxDQUFBc0UsSUFBQSxXQUFBb0wsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFsTCxJQUFBLEdBQUFrTCxTQUFBLENBQUFqTCxJQUFBO1VBQUE7WUFBQWlMLFNBQUEsQ0FBQWpMLElBQUE7WUFBQSxPQUM5RDVWLElBQUksQ0FBQzhnQixLQUFLLENBQUNDLGNBQWMsQ0FBQ0osYUFBYSxFQUFFRCxZQUFZLEtBQUt6Z0IsUUFBUSxDQUFDK2dCLFNBQVMsQ0FBQztVQUFBO1lBQTlGSixRQUFRLEdBQUFDLFNBQUEsQ0FBQS9KLElBQUE7WUFDZCxJQUFJOEosUUFBUSxFQUFFO2NBQ1poVixXQUFXLENBQUMzRCxPQUFPLEdBQUcyRCxXQUFXLENBQUMzRCxPQUFPLENBQUNyRSxHQUFHLENBQUMsVUFBQTBFLE9BQU8sRUFBSTtnQkFDdkQsSUFBSUEsT0FBTyxDQUFDckYsRUFBRSxLQUFLMGQsYUFBYSxJQUFJclksT0FBTyxDQUFDekQsSUFBSSxLQUFLLFdBQVcsRUFBRTtrQkFDaEUsT0FBQTNCLGFBQUEsQ0FBQUEsYUFBQSxLQUFZb0YsT0FBTztvQkFBRTJZLFVBQVUsRUFBRVAsWUFBWSxLQUFLemdCLFFBQVEsQ0FBQytnQjtrQkFBUztnQkFDdEU7Z0JBQ0EsT0FBTzFZLE9BQU87Y0FDaEIsQ0FBQyxDQUFDO1lBQ0o7VUFBQztVQUFBO1lBQUEsT0FBQXVZLFNBQUEsQ0FBQTNJLElBQUE7UUFBQTtNQUFBLEdBQUF1SSxRQUFBO0lBQUEsQ0FDRjtJQUFBLGlCQUFBUyxJQUFBLEVBQUFDLElBQUE7TUFBQSxPQUFBWCxLQUFBLENBQUE5SCxLQUFBLE9BQUFDLFNBQUE7SUFBQTtFQUFBLEtBQUUsRUFBRSxDQUFDO0VBRU4sSUFBTXlJLHNCQUFzQixHQUFHamlCLFdBQVc7SUFBQSxJQUFBa2lCLEtBQUEsR0FBQW5RLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FDeEMsU0FBQWtRLFNBQ0VuWixTQUFtQixFQUNuQnVPLFFBQThCLEVBQzlCNkssYUFBMkU7TUFBQSxJQUFBNVgsS0FBQSxFQUFBNlgsbUJBQUEsRUFBQUMsY0FBQSxFQUFBalosUUFBQSxFQUFBSSxTQUFBLEVBQUFtRixTQUFBLEVBQUEyVCxTQUFBLEVBQUF4SSxXQUFBLEVBQUF5SSxlQUFBLEVBQUFDLGVBQUEsRUFBQUMsT0FBQSxFQUFBQyx1QkFBQSxFQUFBakMsTUFBQTtNQUFBLE9BQUExTyxtQkFBQSxDQUFBc0UsSUFBQSxXQUFBc00sU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUFwTSxJQUFBLEdBQUFvTSxTQUFBLENBQUFuTSxJQUFBO1VBQUE7WUFBQSxJQUV0RXpOLFNBQVMsYUFBVEEsU0FBUyxlQUFUQSxTQUFTLENBQUUwTixNQUFNO2NBQUFrTSxTQUFBLENBQUFuTSxJQUFBO2NBQUE7WUFBQTtZQUNwQm9DLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLDhDQUE4QyxDQUFDO1lBQUEsT0FBQThKLFNBQUEsQ0FBQWpNLE1BQUE7VUFBQTtZQUl6RG5NLEtBQUssR0FBR3pCLGtDQUFrQyxDQUFDQyxTQUFTLEVBQUV5RCxXQUFXLENBQUMzRCxPQUFPLENBQUM7WUFBQSxJQUMzRTBCLEtBQUssYUFBTEEsS0FBSyxlQUFMQSxLQUFLLENBQUVyQixPQUFPLENBQUNFLFFBQVE7Y0FBQXVaLFNBQUEsQ0FBQW5NLElBQUE7Y0FBQTtZQUFBO1lBQzFCb0MsT0FBTyxDQUFDQyxLQUFLLENBQUMsc0RBQXNELEVBQUU5UCxTQUFTLENBQUM7WUFBQSxPQUFBNFosU0FBQSxDQUFBak0sTUFBQTtVQUFBO1lBSWpFMEwsbUJBQW1CLEdBQWdDN1gsS0FBSyxDQUFqRXJCLE9BQU8sRUFBa0NtWixjQUFjLEdBQUs5WCxLQUFLLENBQW5DZixTQUFTO1lBQ3ZDSixRQUFRLEdBQUtnWixtQkFBbUIsQ0FBaENoWixRQUFRO1lBQUEsSUFDWEEsUUFBUTtjQUFBdVosU0FBQSxDQUFBbk0sSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBbU0sU0FBQSxDQUFBak0sTUFBQTtVQUFBO1lBSVBsTixTQUFTLEdBQUdKLFFBQVEsQ0FBQ0ssVUFBVSxJQUFJNFksY0FBYztZQUFBLElBQ2xEN1ksU0FBUztjQUFBbVosU0FBQSxDQUFBbk0sSUFBQTtjQUFBO1lBQUE7WUFDWm9DLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLHlDQUF5QyxFQUFFOVAsU0FBUyxDQUFDO1lBQUEsT0FBQTRaLFNBQUEsQ0FBQWpNLE1BQUE7VUFBQTtZQUFBLEtBSWpFNVUsb0JBQW9CLENBQUNtTyxRQUFRLENBQUN6RyxTQUFTLENBQUM7Y0FBQW1aLFNBQUEsQ0FBQW5NLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQW1NLFNBQUEsQ0FBQWpNLE1BQUE7VUFBQTtZQUFBLE1BSXhDNVUsb0JBQW9CLENBQUM0YixjQUFjLENBQUMsQ0FBQyxJQUFJM2Isc0JBQXNCO2NBQUE0Z0IsU0FBQSxDQUFBbk0sSUFBQTtjQUFBO1lBQUE7WUFDakUzRyxRQUFRLENBQUNDLGFBQWEsQ0FDcEIsSUFBSUgsV0FBVyxDQUFDLGdCQUFnQixFQUFFO2NBQ2hDQyxNQUFNLEVBQUU7Z0JBQUVlLElBQUksRUFBRSxJQUFJO2dCQUFFQyxRQUFRLEVBQUUsTUFBTTtnQkFBRTFILE9BQU8sRUFBRXJDLENBQUMsQ0FBQyw0QkFBNEI7Y0FBRTtZQUNuRixDQUFDLENBQ0gsQ0FBQztZQUFBLE9BQUE4YixTQUFBLENBQUFqTSxNQUFBO1VBQUE7WUFJRy9ILFNBQVMsR0FBR3lULG1CQUFtQixDQUFDdmUsRUFBRTtZQUNsQ3llLFNBQVMsR0FBR2hMLFFBQVEsS0FBSyxTQUFTLEdBQUcsVUFBVSxHQUFHLFVBQVU7WUFDNUR3QyxXQUFpQyxHQUFHO2NBQ3hDbkwsU0FBUyxFQUFUQSxTQUFTO2NBQ1RxTCxXQUFXLEVBQUVvSSxtQkFBbUIsQ0FBQ2xaLE9BQU87Y0FDeENFLFFBQVEsRUFBUkEsUUFBUTtjQUNSekQsY0FBYyxFQUFFeUQsUUFBUSxDQUFDQyxlQUFlO2NBQ3hDTixTQUFTLEVBQVRBO1lBQ0YsQ0FBQztZQUVLd1osZUFBZSxHQUFHdmdCLFVBQVUsQ0FBQ3lNLEVBQUUsQ0FBQ2pGLFNBQVMsQ0FBQztZQUNoRCxJQUFJK1ksZUFBZSxFQUFFO2NBQ25CM1YsdUJBQXVCLENBQUMvRCxPQUFPLEdBQUdpUixXQUFXO2NBQzdDaE4sZUFBZSxDQUFDakUsT0FBTyxHQUFHLElBQUk7WUFDaEM7WUFFQTJGLGVBQWUsQ0FBQ2hGLFNBQVMsRUFBQTFGLGFBQUEsQ0FBQUEsYUFBQSxLQUFPc2UsbUJBQW1CO2NBQUVwTCxjQUFjLEVBQUVzTDtZQUFTLEVBQUUsQ0FBQztZQUUzRUUsZUFBZSxHQUFHcGlCLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUltaUIsZUFBZSxFQUFFO2NBQ25CclcsZ0JBQWdCLENBQUNyRCxPQUFPLEdBQUcyWixlQUFlO1lBQzVDO1lBRU1DLE9BQXNCLEdBQUc7Y0FDN0JqWixTQUFTLEVBQVRBLFNBQVM7Y0FDVG1GLFNBQVMsRUFBRTZULGVBQWU7Y0FDMUJoUyxhQUFhLFlBQUE3TCxNQUFBLENBQVk2ZCxlQUFlO1lBQzFDLENBQUM7WUFFS0UsdUJBQXVCLEdBQUcsU0FBMUJBLHVCQUF1QkEsQ0FBQSxFQUFTO2NBQ3BDLElBQUksQ0FBQ0gsZUFBZSxFQUFFO2NBQ3RCelYsZUFBZSxDQUFDakUsT0FBTyxHQUFHLEtBQUs7Y0FDL0IrRCx1QkFBdUIsQ0FBQy9ELE9BQU8sR0FBRyxJQUFJO1lBQ3hDLENBQUM7WUFBQThaLFNBQUEsQ0FBQW5NLElBQUE7WUFBQSxPQUVvQjFVLG9CQUFvQixDQUFDOGdCLG1CQUFtQixDQUFDO2NBQzVEcFosU0FBUyxFQUFUQSxTQUFTO2NBQ1RnSCxhQUFhLEVBQUVpUyxPQUFPLENBQUNqUyxhQUFhO2NBQ3BDcVMsZUFBZSxFQUFFO2dCQUNmOVosU0FBUyxFQUFUQSxTQUFTO2dCQUNUUyxTQUFTLEVBQUVKLFFBQVEsQ0FBQ0ssVUFBVTtnQkFDOUI2TixRQUFRLEVBQUU2SyxhQUFhLEdBQUcsTUFBTSxHQUFHN0ssUUFBUTtnQkFDM0M2SyxhQUFhLEVBQWJBLGFBQWE7Z0JBQ2J2YSxPQUFPLEVBQUUsQ0FBQTRELEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFM0gsRUFBRSxLQUFJLEVBQUU7Z0JBQ3hCcWEsSUFBSSxFQUFFM1YsUUFBUSxDQUFDMlY7Y0FDakIsQ0FBQztjQUNEclgsQ0FBQyxFQUFEQSxDQUFDO2NBQ0RpYyxvQkFBb0IsRUFBRWhKLFdBQVc7Y0FDakNsUyxPQUFPLEVBQUU0RCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTNILEVBQUU7Y0FDbEIwYSxTQUFTLEVBQUUvUyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRXhILElBQUk7Y0FDdEIrZSxTQUFTLEVBQUU7Z0JBQ1RySSxjQUFjLEVBQUUsU0FBaEJBLGNBQWNBLENBQUVsSixPQUFPO2tCQUFBLE9BQUlELGtCQUFrQixDQUFDa1IsT0FBTyxFQUFFalIsT0FBTyxDQUFDO2dCQUFBO2dCQUMvRG1KLGNBQWMsRUFBRSxTQUFoQkEsY0FBY0EsQ0FBRXFJLGFBQWEsRUFBSTtrQkFDL0JOLHVCQUF1QixDQUFDLENBQUM7a0JBQ3pCOVEsa0JBQWtCLENBQ2hCNlEsT0FBTyxFQUNQTyxhQUFhLENBQUN4UixPQUFPLEVBQ3JCd1IsYUFBYSxDQUFDOVEsT0FBTyxFQUNyQjhRLGFBQWEsQ0FBQzdRLGVBQWUsRUFDN0I2USxhQUFhLENBQUNqZ0IsV0FBVyxFQUN6QmlnQixhQUFhLENBQUMvUixXQUFXLEVBQ3pCK1IsYUFBYSxDQUFDNVEsZ0JBQ2hCLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRHRILE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBLEVBQVE7a0JBQ2I0WCx1QkFBdUIsQ0FBQyxDQUFDO2tCQUN6QnhTLGlCQUFpQixDQUFDdVMsT0FBTyxDQUFDO2dCQUM1QixDQUFDO2dCQUNENUgsa0JBQWtCLEVBQUUsU0FBcEJBLGtCQUFrQkEsQ0FBR29JLGVBQWUsRUFBRXJKLGtCQUFrQixFQUFLO2tCQUMzRDhJLHVCQUF1QixDQUFDLENBQUM7a0JBQ3pCL0ksc0JBQXNCLENBQUM4SSxPQUFPLEVBQUVRLGVBQWUsRUFBRXJKLGtCQUFrQixDQUFDO2dCQUN0RTtjQUNGO1lBQ0YsQ0FBQyxDQUFDO1VBQUE7WUF0Q0k2RyxNQUFNLEdBQUFrQyxTQUFBLENBQUFqTCxJQUFBO1lBd0NaLElBQUksQ0FBQytJLE1BQU0sQ0FBQ08sT0FBTyxFQUFFO2NBQ25CMEIsdUJBQXVCLENBQUMsQ0FBQztjQUN6QixJQUFJakMsTUFBTSxDQUFDUSxNQUFNLEtBQUssT0FBTyxFQUFFO2dCQUM3QnBSLFFBQVEsQ0FBQ0MsYUFBYSxDQUNwQixJQUFJSCxXQUFXLENBQUMsZ0JBQWdCLEVBQUU7a0JBQ2hDQyxNQUFNLEVBQUU7b0JBQUVlLElBQUksRUFBRSxJQUFJO29CQUFFQyxRQUFRLEVBQUUsTUFBTTtvQkFBRTFILE9BQU8sRUFBRXJDLENBQUMsQ0FBQyw0QkFBNEI7a0JBQUU7Z0JBQ25GLENBQUMsQ0FDSCxDQUFDO2NBQ0g7WUFDRjtVQUFDO1VBQUE7WUFBQSxPQUFBOGIsU0FBQSxDQUFBN0osSUFBQTtRQUFBO01BQUEsR0FBQW9KLFFBQUE7SUFBQSxDQUNGO0lBQUEsaUJBQUFnQixJQUFBLEVBQUFDLElBQUEsRUFBQUMsSUFBQTtNQUFBLE9BQUFuQixLQUFBLENBQUEzSSxLQUFBLE9BQUFDLFNBQUE7SUFBQTtFQUFBLEtBQ0QsQ0FDRWhSLFFBQVEsRUFDUmlELEtBQUssRUFDTGdELGVBQWUsRUFDZjBCLGlCQUFpQixFQUNqQnFCLGtCQUFrQixFQUNsQkssa0JBQWtCLEVBQ2xCK0gsc0JBQXNCLEVBQ3RCOVMsQ0FBQyxDQUVMLENBQUM7RUFFRCxJQUFNd2MsY0FBYyxHQUFHdGpCLFdBQVcsY0FBQStSLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBQyxTQUFBc1IsU0FBQTtJQUFBLElBQUFDLHFCQUFBLEVBQUFDLHFCQUFBLEVBQUFDLE1BQUEsRUFBQUMscUJBQUEsRUFBQUMsY0FBQSxFQUFBQyxhQUFBLEVBQUFDLFdBQUEsRUFBQUMscUJBQUEsRUFBQUMsaUJBQUEsRUFBQUMscUJBQUEsRUFBQUMsYUFBQSxFQUFBQyxhQUFBLEVBQUFDLFlBQUEsRUFBQWhILE9BQUEsRUFBQWlILG9CQUFBLEVBQUF2SCxlQUFBLEVBQUFsWixVQUFBLEVBQUFELFNBQUEsRUFBQW9aLE9BQUEsRUFBQU0sZ0JBQUEsRUFBQWlILHFCQUFBO0lBQUEsT0FBQXRTLG1CQUFBLENBQUFzRSxJQUFBLFdBQUFpTyxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQS9OLElBQUEsR0FBQStOLFNBQUEsQ0FBQTlOLElBQUE7UUFBQTtVQUNqQyxJQUFJLENBQUN6SixZQUFZLENBQUNsRSxPQUFPLEVBQUU7WUFDekJrRSxZQUFZLENBQUNsRSxPQUFPLEdBQUcsSUFBSTtVQUM3QjtVQUFDLEtBQ0c4QixhQUFhO1lBQUEyWixTQUFBLENBQUE5TixJQUFBO1lBQUE7VUFBQTtVQUFBOE4sU0FBQSxDQUFBOU4sSUFBQTtVQUFBLE9BQ1RySSxZQUFZLENBQUMsQ0FBQztRQUFBO1VBQUFtVyxTQUFBLENBQUE5TixJQUFBO1VBQUE7UUFBQTtVQUFBLEtBQ1gzTCxrQkFBa0I7WUFBQXlaLFNBQUEsQ0FBQTlOLElBQUE7WUFBQTtVQUFBO1VBQ3JCdU4saUJBQWlCLEdBQUdRLE9BQU8sRUFBQWhCLHFCQUFBLEdBQUMxWSxrQkFBa0IsQ0FBQzNCLE9BQU8sY0FBQXFhLHFCQUFBLHVCQUExQkEscUJBQUEsQ0FBNEI3ZSxJQUFJLENBQUMsQ0FBQyxDQUFDO1VBQy9Ec2YscUJBQXFCLEdBQUdPLE9BQU8sRUFBQWYscUJBQUEsR0FBQzNZLGtCQUFrQixDQUFDOUgsV0FBVyxjQUFBeWdCLHFCQUFBLHVCQUE5QkEscUJBQUEsQ0FBZ0MvTSxNQUFNLENBQUM7VUFDdkV3TixhQUFhLEdBQUdNLE9BQU8sQ0FBQzFaLGtCQUFrQixDQUFDOFEsS0FBSyxDQUFDO1VBQ2pEdUksYUFBYSxHQUFHSyxPQUFPLENBQUMxWixrQkFBa0IsQ0FBQ2lSLEtBQUssQ0FBQztVQUNqRHFJLFlBQVksR0FBR0ksT0FBTyxDQUFDMVosa0JBQWtCLENBQUNrUixJQUFJLENBQUM7VUFBQSxNQUVqRCxDQUFDZ0ksaUJBQWlCLElBQUksQ0FBQ0MscUJBQXFCLElBQUksQ0FBQ0MsYUFBYSxJQUFJLENBQUNDLGFBQWEsSUFBSSxDQUFDQyxZQUFZO1lBQUFHLFNBQUEsQ0FBQTlOLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQThOLFNBQUEsQ0FBQTVOLE1BQUE7UUFBQTtVQUkvRnlHLE9BQU8sR0FBRzNRLFdBQVcsQ0FBQzNELE9BQU8sQ0FBQ3JFLEdBQUcsQ0FBQyxVQUFBeVosY0FBYztZQUFBLE9BQUs7Y0FDekR6TSxPQUFPLEVBQUV5TSxjQUFjLENBQUMvVSxPQUFPO2NBQy9CekQsSUFBSSxFQUFFd1ksY0FBYyxDQUFDN00sSUFBSSxDQUFDdk4sRUFBRSxLQUFLMEUsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUMsR0FBRzNILGVBQWUsQ0FBQ2dkLElBQUksR0FBR2hkLGVBQWUsQ0FBQ3VRO1lBQ25HLENBQUM7VUFBQSxDQUFDLENBQUM7VUFBQStTLG9CQUFBLEdBT0NyVyxVQUFVLENBQUNsRixPQUFPLEVBSk5nVSxlQUFlLEdBQUF1SCxvQkFBQSxDQUE3QmxoQixZQUFZLEVBQ0hTLFVBQVUsR0FBQXlnQixvQkFBQSxDQUFuQmpaLE9BQU8sRUFDQ3pILFNBQVMsR0FBQTBnQixvQkFBQSxDQUFqQmxnQixNQUFNLEVBQ0E0WSxPQUFPLEdBQUFzSCxvQkFBQSxDQUFiOVksSUFBSTtVQUVBOFIsZ0JBQWdCLElBQUFxRyxNQUFBLElBQUFDLHFCQUFBLEdBQUd6Z0IsdUJBQXVCLENBQUM0WixlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQUE2RyxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJL2YsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUVFLEVBQUUsY0FBQTRmLE1BQUEsY0FBQUEsTUFBQSxHQUFJLElBQUk7VUFFakc3SyxPQUFPLENBQUM0TCxJQUFJLENBQUMsa0ZBQWtGLEVBQUU7WUFDL0ZDLGFBQWEsR0FBQWQsY0FBQSxHQUFFaGdCLFVBQVUsYUFBVkEsVUFBVSx1QkFBVkEsVUFBVSxDQUFFRSxFQUFFLGNBQUE4ZixjQUFBLGNBQUFBLGNBQUEsR0FBSSxJQUFJO1lBQ3JDNWYsUUFBUSxHQUFBNmYsYUFBQSxHQUFFbGdCLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFRyxFQUFFLGNBQUErZixhQUFBLGNBQUFBLGFBQUEsR0FBSSxJQUFJO1lBQy9CdkwsTUFBTSxHQUFBd0wsV0FBQSxHQUFFL0csT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVqWixFQUFFLGNBQUFnZ0IsV0FBQSxjQUFBQSxXQUFBLEdBQUksSUFBSTtZQUMzQnpnQixjQUFjLEdBQUEwZ0IscUJBQUEsR0FBRWpILGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFeFosU0FBUyxjQUFBeWdCLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUksSUFBSTtZQUNsRDFHLGdCQUFnQixFQUFoQkEsZ0JBQWdCO1lBQ2hCeUIsU0FBUyxFQUFFclQsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUU1RztVQUNwQixDQUFDLENBQUM7VUFFSXlmLHFCQUFxQixHQUFHcmpCLGtDQUFrQyxDQUFDNkosa0JBQWtCLENBQUMzQixPQUFPLEVBQUU7WUFDM0Y0UyxLQUFLLEVBQUVqUixrQkFBa0IsQ0FBQ2lSLEtBQUs7WUFDL0JDLElBQUksRUFBRWxSLGtCQUFrQixDQUFDa1I7VUFDM0IsQ0FBQyxDQUFDO1VBRUY1WixzQkFBc0IsQ0FBQztZQUNyQnFILFNBQVMsRUFBRTRDLGFBQWEsQ0FBQ3ZELE9BQU87WUFDaENnVixLQUFLLEVBQUUzYix3QkFBd0IsQ0FBQ21pQixxQkFBcUIsQ0FBQztZQUN0RDdZLEtBQUssRUFBTEEsS0FBSztZQUNMNUQsT0FBTyxFQUFFNEQsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUzSCxFQUFFO1lBQ2xCc0gsT0FBTyxFQUFFeEgsVUFBVTtZQUNuQk8sTUFBTSxFQUFFUixTQUFTO1lBQ2pCWCxXQUFXLEVBQUU4SCxrQkFBa0IsQ0FBQzlIO1VBQ2xDLENBQUMsQ0FBQztVQUVGK1gsT0FBTyxDQUFBaFgsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBO1lBQ0xvRixPQUFPLEVBQUUyQixrQkFBa0IsQ0FBQzNCLE9BQU87WUFDbkNpVSxPQUFPLEVBQVBBLE9BQU87WUFDUDlaLFNBQVMsRUFBRStaLGdCQUFnQjtZQUMzQmMsSUFBSSxFQUFFM1YsUUFBUSxDQUFDMlYsSUFBSTtZQUNuQkMsTUFBTSxFQUFFNVYsUUFBUSxDQUFDMUUsRUFBRSxDQUFDNEUsUUFBUSxDQUFDLENBQUM7WUFDOUJDLFNBQVMsRUFBRUgsUUFBUSxDQUFDRyxTQUFTO1lBQzdCMFYsUUFBUSxFQUFFN1YsUUFBUSxDQUFDNlYsUUFBUTtZQUMzQkMsU0FBUyxFQUFFOVYsUUFBUSxDQUFDK1YsVUFBVSxDQUFDN1YsUUFBUSxDQUFDLENBQUM7WUFDekNtQyxNQUFNLEVBQUV3QixhQUFhLENBQUN2RCxPQUFPO1lBQzdCOEYsU0FBUyxFQUFFekMsZ0JBQWdCLENBQUNyRCxPQUFPO1lBQ25DMFYsU0FBUyxFQUFFL1MsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUV4SCxJQUFLO1lBQ3ZCNEQsT0FBTyxFQUFFNEQsS0FBSyxhQUFMQSxLQUFLLHVCQUFMQSxLQUFLLENBQUUzSCxFQUFHO1lBQ25CNEgsaUJBQWlCLEVBQUVvQyxvQkFBb0IsQ0FBQ2hGLE9BQU87WUFDL0M2QyxrQkFBa0IsRUFBRW9DLHFCQUFxQixDQUFDakY7VUFBTyxHQUM3QyxDQUFBbEYsVUFBVSxhQUFWQSxVQUFVLHVCQUFWQSxVQUFVLENBQUU2YSxLQUFLLEtBQUksSUFBSSxHQUFHO1lBQUVBLEtBQUssRUFBRWxiLE1BQU0sQ0FBQ0ssVUFBVSxDQUFDNmEsS0FBSztVQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDckUvYSxvQkFBb0IsQ0FBQ0MsU0FBUyxFQUFFQyxVQUFVLENBQUMsR0FDMUNBLFVBQVUsYUFBVkEsVUFBVSxlQUFWQSxVQUFVLENBQUVLLElBQUksR0FBRztZQUFFeWEsV0FBVyxFQUFFOWEsVUFBVSxDQUFDSztVQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDeEQsQ0FBQThZLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFalosRUFBRSxLQUFJLElBQUksR0FBQUMsYUFBQTtZQUNqQnVVLE1BQU0sRUFBRS9VLE1BQU0sQ0FBQ3daLE9BQU8sQ0FBQ2paLEVBQUU7VUFBQyxHQUFNaVosT0FBTyxDQUFDOVksSUFBSSxHQUFHO1lBQUUwYSxRQUFRLEVBQUU1QixPQUFPLENBQUM5WTtVQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFDaEYsQ0FBQyxDQUFDLEdBQ0Y2RyxrQkFBa0IsQ0FBQzlILFdBQVcsR0FBRztZQUFFQSxXQUFXLEVBQUU4SCxrQkFBa0IsQ0FBQzlIO1VBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNyRjhILGtCQUFrQixDQUFDOFEsS0FBSyxHQUFHO1lBQUVBLEtBQUssRUFBRTlRLGtCQUFrQixDQUFDOFE7VUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ25FOVEsa0JBQWtCLENBQUMrUSxpQkFBaUIsR0FBRztZQUFFQSxpQkFBaUIsRUFBRS9RLGtCQUFrQixDQUFDK1E7VUFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUN2Ry9RLGtCQUFrQixDQUFDaVIsS0FBSyxHQUFHO1lBQUVBLEtBQUssRUFBRWpSLGtCQUFrQixDQUFDaVI7VUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ25FalIsa0JBQWtCLENBQUNrUixJQUFJLEdBQUc7WUFBRUEsSUFBSSxFQUFFbFIsa0JBQWtCLENBQUNrUjtVQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDaEUsQ0FBQXZRLEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFbVQsTUFBTSxLQUFJLElBQUksR0FBRztZQUFFQyxXQUFXLEVBQUVwVCxLQUFLLENBQUNtVDtVQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQsQ0FBQW5ULEtBQUssYUFBTEEsS0FBSyx1QkFBTEEsS0FBSyxDQUFFNUcsSUFBSSxLQUFJLElBQUksR0FBRztZQUFFaWEsU0FBUyxFQUFFclQsS0FBSyxDQUFDNUc7VUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3BELENBQUE0RyxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRXNULEtBQUssS0FBSSxJQUFJLEdBQUc7WUFBRUMsVUFBVSxFQUFFdlQsS0FBSyxDQUFDc1Q7VUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ3ZEL2QsbUJBQW1CLENBQUM4SixrQkFBa0IsQ0FBQ2dSLFFBQVEsQ0FBQyxHQUNoRDtZQUFFTyxjQUFjLEVBQUVyYixtQkFBbUIsQ0FBQzhKLGtCQUFrQixDQUFDZ1IsUUFBUTtVQUFFLENBQUMsR0FDcEUsQ0FBQyxDQUFDLEdBQ0ZoUixrQkFBa0IsQ0FBQzhTLFdBQVcsR0FBRztZQUFFQSxXQUFXLEVBQUU5UyxrQkFBa0IsQ0FBQzhTO1VBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUMxRixDQUFDO1FBQUE7UUFBQTtVQUFBLE9BQUEyRyxTQUFBLENBQUF4TCxJQUFBO01BQUE7SUFBQSxHQUFBd0ssUUFBQTtFQUFBLENBRUwsSUFBRSxDQUNEM1ksYUFBYSxFQUNiRSxrQkFBa0IsRUFDbEJNLE9BQU8sRUFDUGpILE1BQU0sRUFDTm9ILElBQUksRUFDSi9DLFFBQVEsRUFDUmlELEtBQUssRUFDTHNQLE9BQU8sRUFDUHJQLGlCQUFpQixFQUNqQkMsa0JBQWtCLENBQ25CLENBQUM7RUFFRixJQUFNZ1osU0FBUyxHQUFHM2tCLFdBQVcsQ0FBQyxZQUFNO0lBQ2xDLElBQU00a0IsaUJBQWlCLEdBQUd2WSxhQUFhLENBQUN2RCxPQUFPO0lBQy9DbEgsb0JBQW9CLENBQUM4TyxLQUFLLENBQUNrVSxpQkFBaUIsQ0FBQztJQUM3Q3pZLGdCQUFnQixDQUFDckQsT0FBTyxHQUFHekksTUFBTSxDQUFDLENBQUM7SUFDbkMrTCxtQkFBbUIsQ0FBQ3RELE9BQU8sR0FBRyxJQUFJO0lBQ2xDdUQsYUFBYSxDQUFDdkQsT0FBTyxHQUFHekksTUFBTSxDQUFDLENBQUM7SUFDaENzTixrQkFBa0IsQ0FBQ3RCLGFBQWEsQ0FBQ3ZELE9BQU8sQ0FBQztJQUN6QzBELGFBQWEsQ0FBQzFELE9BQU8sR0FBRyxLQUFLO0lBQzdCbUUseUJBQXlCLENBQUNuRSxPQUFPLEdBQUcsSUFBSTtJQUN4Q29FLHFCQUFxQixDQUFDcEUsT0FBTyxHQUFHLElBQUk7SUFDcEN3RCxlQUFlLENBQUMsSUFBSSxDQUFDO0VBQ3ZCLENBQUMsRUFBRSxDQUFDQSxlQUFlLENBQUMsQ0FBQztFQUVyQixJQUFNdVksY0FBYyxHQUFHN2tCLFdBQVcsQ0FBQyxZQUFNO0lBQ3ZDdWIsYUFBYSxDQUFDLENBQUM7SUFDZnhPLGVBQWUsQ0FBQ2pFLE9BQU8sR0FBRyxLQUFLO0VBQ2pDLENBQUMsRUFBRSxDQUFDeVMsYUFBYSxDQUFDLENBQUM7RUFFbkIsT0FBTztJQUNMelIsUUFBUSxFQUFSQSxRQUFRO0lBQ1JvRSxlQUFlLEVBQWZBLGVBQWU7SUFDZkMscUJBQXFCLEVBQXJCQSxxQkFBcUI7SUFDckI4TSxlQUFlLEVBQWZBLGVBQWU7SUFDZkUsU0FBUyxFQUFUQSxTQUFTO0lBQ1RDLGNBQWMsRUFBZEEsY0FBYztJQUNkQyxjQUFjLEVBQWRBLGNBQWM7SUFDZC9OLGNBQWMsRUFBZEEsY0FBYztJQUNka08sY0FBYyxFQUFkQSxjQUFjO0lBQ2RuUCxhQUFhLEVBQUVBLGFBQWEsQ0FBQ3ZELE9BQU87SUFDcENxRCxnQkFBZ0IsRUFBRUEsZ0JBQWdCLENBQUNyRCxPQUFPO0lBRTFDMlMsV0FBVyxFQUFYQSxXQUFXO0lBQ1hnRSxZQUFZLEVBQVpBLFlBQVk7SUFDWkQsYUFBYSxFQUFiQSxhQUFhO0lBQ2I0QixjQUFjLEVBQWRBLGNBQWM7SUFDZGEsc0JBQXNCLEVBQXRCQSxzQkFBc0I7SUFDdEJ6VCxZQUFZLEVBQVpBLFlBQVk7SUFDWjhVLGNBQWMsRUFBZEEsY0FBYztJQUNkcUIsU0FBUyxFQUFUQSxTQUFTO0lBQ1RFLGNBQWMsRUFBZEEsY0FBYztJQUVkQyxVQUFVLEVBQUU3SixlQUFlLElBQUkvTTtFQUNqQyxDQUFDO0FBQ0gsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
|