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