@projectcor/maia-components 2.48.1-1 → 2.49.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/lib/App.js +19 -44
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +53 -1
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +28 -52
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +37 -1
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +33 -66
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +227 -1
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -177
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +29 -1
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -28
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +173 -1
- package/lib/components/atoms/MAIAInput/MAIAInput.js +126 -171
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +47 -1
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -61
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +30 -1
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +13 -18
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +48 -1
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +17 -26
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +266 -321
- package/lib/components/molecules/ChatAIHome/styles.js +78 -85
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +345 -1
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +201 -200
- package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +373 -5
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +199 -271
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +20 -1
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +87 -74
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +46 -61
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +314 -1
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +261 -480
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +1 -4
- package/lib/dev/DevReasoningTimeline.js +37 -68
- package/lib/dev/Providers.js +3 -5
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useChatManager/useChatManager.helpers.js +550 -1
- package/lib/hooks/useChatManager/useChatManager.js +245 -429
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +257 -1
- package/lib/hooks/useChatMessages/useChatMessages.js +50 -206
- package/lib/hooks/useContextMentions.helpers.js +61 -1
- package/lib/hooks/useContextMentions.js +5 -62
- package/lib/hooks/useEntitySearch.helpers.js +49 -1
- package/lib/hooks/useEntitySearch.js +22 -53
- package/lib/hooks/useFrequentlyUsedActions.js +22 -60
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/index.js +2 -5
- package/lib/lang/br/index.js +1 -26
- package/lib/lang/en/index.js +1 -26
- package/lib/lang/es/index.js +1 -26
- package/lib/lang/fr/index.js +1 -26
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Agents/getAgents.helpers.js +61 -1
- package/lib/services/maia/Agents/getAgents.js +31 -59
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.js +25 -249
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.js +213 -273
- package/lib/styles/cascade.js +3 -29
- package/lib/styles/transitions.js +1 -3
- package/lib/types/global.d.js +1 -1
- package/lib/utils/hoursPlannerQuickActionType.js +1 -74
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/streamActivityMessages.helpers.js +222 -0
- package/lib/utils/streamActivityMessages.js +21 -251
- package/package.json +1 -1
- package/lib/components/atoms/ActionableButton.spec.js +0 -111
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -66
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -211
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -41
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -253
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -33
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -25
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
- package/lib/components/atoms/Chip/Chip.spec.js +0 -82
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -88
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -77
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -48
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -231
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
- package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
- package/lib/components/atoms/Expand/Expand.spec.js +0 -57
- package/lib/components/atoms/Fade/Fade.spec.js +0 -31
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
- package/lib/components/atoms/HelpButton.spec.js +0 -87
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -26
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -444
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -20
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -53
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -22
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
- package/lib/components/atoms/NextPageLoader.spec.js +0 -37
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -86
- package/lib/components/atoms/PrimaryButton.spec.js +0 -42
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
- package/lib/components/atoms/Switch/Switch.spec.js +0 -41
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
- package/lib/components/atoms/TextArea/TextArea.spec.js +0 -68
- package/lib/components/atoms/ThirdButton.spec.js +0 -29
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
- package/lib/components/atoms/WithAppCfg.spec.js +0 -60
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -495
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -57
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -227
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -108
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -254
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
- package/lib/components/molecules/AgentInputBlock/index.js +0 -5
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -77
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -445
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -471
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -659
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -95
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
- package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
- package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -172
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -82
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -453
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -391
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1204
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -195
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
- package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
- package/lib/components/organisms/ChatAIPage/index.js +0 -3
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
- package/lib/constants/maiaFeatureAccess.spec.js +0 -30
- package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
- package/lib/constants/maiaTaskPanelAccess.spec.js +0 -30
- package/lib/constants/permissions/clientRoleAccess.spec.js +0 -31
- package/lib/constants/permissions/utils.spec.js +0 -128
- package/lib/dev/DevMaiaPage.js +0 -30
- package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -231
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -313
- package/lib/hooks/useAgentSuggestions.spec.js +0 -89
- package/lib/hooks/useCaretPosition.spec.js +0 -58
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -506
- package/lib/hooks/useChatManager/useChatManager.spec.js +0 -1261
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -176
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -379
- package/lib/hooks/useChats/useChats.spec.js +0 -208
- package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
- package/lib/hooks/useClientSearch.spec.js +0 -86
- package/lib/hooks/useContextMentions.helpers.spec.js +0 -143
- package/lib/hooks/useContextMentions.spec.js +0 -239
- package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -115
- package/lib/hooks/useContextPinPopover.spec.js +0 -159
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
- package/lib/hooks/useDebounce.spec.js +0 -42
- package/lib/hooks/useEntitySearch.helpers.spec.js +0 -321
- package/lib/hooks/useEntitySearch.spec.js +0 -443
- package/lib/hooks/useEvent.spec.js +0 -45
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
- package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
- package/lib/hooks/useIsMaiaPageRoute.js +0 -26
- package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
- package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
- package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
- package/lib/hooks/useMentionPopover.helpers.spec.js +0 -71
- package/lib/hooks/useMentionPopover.spec.js +0 -215
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -132
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
- package/lib/hooks/useModal/useModal.spec.js +0 -73
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -192
- package/lib/hooks/useProjectSearch.helpers.spec.js +0 -70
- package/lib/hooks/useProjectSearch.spec.js +0 -91
- package/lib/hooks/useProjectSummary.spec.js +0 -193
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -92
- package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
- package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
- package/lib/hooks/useRecentContexts.spec.js +0 -139
- package/lib/hooks/useResize.spec.js +0 -37
- package/lib/hooks/useSkillsCatalog.spec.js +0 -88
- package/lib/hooks/useSlashCommands.spec.js +0 -139
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
- package/lib/hooks/useStreamResponse.spec.js +0 -199
- package/lib/hooks/useT.spec.js +0 -20
- package/lib/hooks/useToggle.spec.js +0 -33
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
- package/lib/services/maia/Access/updateAccess.spec.js +0 -137
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
- package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
- package/lib/services/maia/Agents/connectors.spec.js +0 -359
- package/lib/services/maia/Agents/createAgent.spec.js +0 -55
- package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
- package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -211
- package/lib/services/maia/Agents/getAgents.spec.js +0 -697
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
- package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
- package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
- package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
- package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
- package/lib/services/maia/Chats/patchChat.spec.js +0 -41
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
- package/lib/services/maia/Knowledge/delete.spec.js +0 -45
- package/lib/services/maia/Knowledge/download.spec.js +0 -78
- package/lib/services/maia/Knowledge/save.spec.js +0 -58
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -153
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
- package/lib/services/maia/Skills/createSkill.spec.js +0 -68
- package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
- package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
- package/lib/services/maia/Skills/getSkills.spec.js +0 -152
- package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
- package/lib/services/maia/client.spec.js +0 -56
- package/lib/services/utils/fetchCOR.spec.js +0 -211
- package/lib/services/utils/getCookie.spec.js +0 -20
- package/lib/services/utils/mapChatMessages.spec.js +0 -254
- package/lib/store/chatsSidebarOptimistic.spec.js +0 -112
- package/lib/store/maiaLastChatPersistence.spec.js +0 -22
- package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
- package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
- package/lib/store/sessions/sessionNotifications.spec.js +0 -106
- package/lib/store/sessions/sessionStreamManager.spec.js +0 -503
- package/lib/store/sessions/sessions.types.spec.js +0 -16
- package/lib/store/sessions/useSessionsStore.spec.js +0 -135
- package/lib/store/useChatsStore.spec.js +0 -619
- package/lib/store/useFaqsStore.spec.js +0 -57
- package/lib/utils/actionCategoryMap.spec.js +0 -18
- package/lib/utils/agentDisplayName.spec.js +0 -44
- package/lib/utils/autoApproveStorage.spec.js +0 -25
- package/lib/utils/chatInputFiles.spec.js +0 -39
- package/lib/utils/contextMentionIcons.spec.js +0 -41
- package/lib/utils/contextMentionLabel.spec.js +0 -13
- package/lib/utils/contextMentionTriggers.spec.js +0 -38
- package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
- package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
- package/lib/utils/entityLinkRender.spec.js +0 -72
- package/lib/utils/fileDownloadHelper.spec.js +0 -67
- package/lib/utils/formatQuickActionMessage.spec.js +0 -27
- package/lib/utils/formatUnreadCount.spec.js +0 -12
- package/lib/utils/getUnitFileSize.spec.js +0 -18
- package/lib/utils/hitlAnalytics.spec.js +0 -100
- package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
- package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
- package/lib/utils/imagePreprocessor.spec.js +0 -112
- package/lib/utils/maiaPageRoute.js +0 -24
- package/lib/utils/maiaPageRoute.spec.js +0 -23
- package/lib/utils/mapBackendLang.spec.js +0 -19
- package/lib/utils/navigateContextEntity.spec.js +0 -50
- package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
- package/lib/utils/orchestratorSubagents.spec.js +0 -32
- package/lib/utils/reasoningMappers.spec.js +0 -103
- package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
- package/lib/utils/renderContextMentions.spec.js +0 -158
- package/lib/utils/retryCompletion.spec.js +0 -99
- package/lib/utils/skillContentSize.spec.js +0 -13
- package/lib/utils/slashCommandMarker.spec.js +0 -43
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
- package/lib/utils/sseStreamContent.spec.js +0 -31
- package/lib/utils/streamActivityMessages.spec.js +0 -253
- package/lib/utils/validateTrimmedFields.spec.js +0 -26
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
2
|
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
4
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
5
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
-
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
7
6
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
8
7
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
8
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
@@ -14,13 +13,14 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
|
|
|
14
13
|
/* eslint-disable no-constant-condition */
|
|
15
14
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
16
15
|
import maia from '../../services/maia';
|
|
17
|
-
import { getInitialStreamActivity,
|
|
16
|
+
import { getInitialStreamActivity, getThinkingLoadingMessage, getUsingSkillActivity, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity, resolveToolActionLabel } from '../../utils/streamActivityMessages';
|
|
18
17
|
import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
|
|
19
18
|
import { reasoningStore } from '../../hooks/useReasoningTrace';
|
|
20
19
|
import { sessionStreamingText } from './sessionStreamingText';
|
|
21
20
|
import { useSessionsStore } from './useSessionsStore';
|
|
22
21
|
import { ensureSessionNotificationsInitialized } from './sessionNotifications';
|
|
23
22
|
import { sessionHitlContext } from './sessionHitlContext';
|
|
23
|
+
import { buildSessionFinishPayload, isAgentTransferNode, isApprovalPreApproved, isRetryTurnNotFoundResponse, parseSseBlock, patchMetaAgentFields, resolveNodeStreamMessage, resolveNodeThreadId, resolveReasoningStepTool, resolveReasoningStepType, resolveStartStreamGuard, resolveStreamTextChunk, resolveThinkingDelta, shouldAbortSessionStreamOnStop, shouldApplyReasoningStepIndex, shouldAppendThinkingStep, shouldResumeHitlAfterPreApproval, shouldSetIdleOnSilentAbort, shouldShowReasoningToolActivity, splitSseBuffer } from './sessionStreamManager.helpers';
|
|
24
24
|
|
|
25
25
|
/** Compatible con el `t` de i18next (uso de una sola key). */
|
|
26
26
|
|
|
@@ -42,12 +42,13 @@ var getActiveStreamCount = function getActiveStreamCount() {
|
|
|
42
42
|
};
|
|
43
43
|
var parseSessionSSE = /*#__PURE__*/function () {
|
|
44
44
|
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response, active, params) {
|
|
45
|
-
var _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
|
|
46
|
-
var sessionId, placeholderId, callbacks, t, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, isUsingSkill,
|
|
45
|
+
var _params$hitlExecution, _response$body, _data$error, _data$error2, _callbacks$onError, _data$error3, _data$error4;
|
|
46
|
+
var sessionId, placeholderId, callbacks, t, hitlExecutionContext, pendingContent, throttleTimer, flushToStores, emitThrottled, flushPending, reader, decoder, buffer, accumulatedContent, hasStartedWriting, isUsingSkill, ensureWritingStarted, applyStreamChunk, clearStreamLikeAnswerReset, applyStreamComplete, _yield$reader$read, done, value, _splitSseBuffer, blocks, remainder, _iterator, _step, line, parsedBlock, eventType, dataStr, data, _resolveThinkingDelta, index, thinkingDelta, stepTool, stepType, label, _data$args, stepIndex, chunk, _chunk, nodeMessage, _callbacks$onApproval, isPreApproved, _ref2, _t, _t2, _t3;
|
|
47
47
|
return _regeneratorRuntime.wrap(function (_context) {
|
|
48
48
|
while (1) switch (_context.prev = _context.next) {
|
|
49
49
|
case 0:
|
|
50
50
|
sessionId = params.sessionId, placeholderId = params.placeholderId, callbacks = params.callbacks, t = params.t;
|
|
51
|
+
hitlExecutionContext = (_params$hitlExecution = params.hitlExecutionContext) !== null && _params$hitlExecution !== void 0 ? _params$hitlExecution : sessionHitlContext.get(sessionId);
|
|
51
52
|
pendingContent = null;
|
|
52
53
|
throttleTimer = null;
|
|
53
54
|
flushToStores = function flushToStores(content) {
|
|
@@ -91,39 +92,17 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
91
92
|
hasStartedWriting = false; // "Usando Skill" queda visible mientras el modelo piensa con la skill cargada;
|
|
92
93
|
// los deltas de `thinking` no lo pisan hasta la próxima acción o el primer token.
|
|
93
94
|
isUsingSkill = false;
|
|
94
|
-
|
|
95
|
-
var
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if ((current === null || current === void 0 ? void 0 : current.phase) === 'thinking' && current.message === thinkingActivity.message) return;
|
|
95
|
+
ensureWritingStarted = function ensureWritingStarted() {
|
|
96
|
+
var _callbacks$onStartWri;
|
|
97
|
+
if (hasStartedWriting) return;
|
|
98
|
+
hasStartedWriting = true;
|
|
99
99
|
store().patchMeta(sessionId, {
|
|
100
|
-
isLoading: true
|
|
100
|
+
isLoading: true,
|
|
101
|
+
isWriting: true
|
|
101
102
|
});
|
|
102
|
-
store().setStatus(sessionId, '
|
|
103
|
-
store().setActivity(sessionId,
|
|
104
|
-
|
|
105
|
-
ensureWritingStarted = function ensureWritingStarted() {
|
|
106
|
-
var _store$getMeta2;
|
|
107
|
-
// Cualquier token corta "Usando Skill": el indicador vuelve a alternar pensando / escribiendo.
|
|
108
|
-
isUsingSkill = false;
|
|
109
|
-
if (!hasStartedWriting) {
|
|
110
|
-
var _callbacks$onStartWri;
|
|
111
|
-
hasStartedWriting = true;
|
|
112
|
-
store().patchMeta(sessionId, {
|
|
113
|
-
isLoading: true,
|
|
114
|
-
isWriting: true
|
|
115
|
-
});
|
|
116
|
-
(_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
|
|
117
|
-
}
|
|
118
|
-
var current = (_store$getMeta2 = store().getMeta(sessionId)) === null || _store$getMeta2 === void 0 ? void 0 : _store$getMeta2.streamActivity;
|
|
119
|
-
if ((current === null || current === void 0 ? void 0 : current.phase) !== 'writing') {
|
|
120
|
-
store().patchMeta(sessionId, {
|
|
121
|
-
isLoading: true,
|
|
122
|
-
isWriting: true
|
|
123
|
-
});
|
|
124
|
-
store().setStatus(sessionId, 'writing');
|
|
125
|
-
store().setActivity(sessionId, getWritingStreamActivity(t));
|
|
126
|
-
}
|
|
103
|
+
store().setStatus(sessionId, 'writing');
|
|
104
|
+
store().setActivity(sessionId, getWritingStreamActivity(t));
|
|
105
|
+
(_callbacks$onStartWri = callbacks.onStartWriting) === null || _callbacks$onStartWri === void 0 || _callbacks$onStartWri.call(callbacks);
|
|
127
106
|
};
|
|
128
107
|
applyStreamChunk = function applyStreamChunk(chunk) {
|
|
129
108
|
if (!chunk) return;
|
|
@@ -142,23 +121,9 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
142
121
|
reasoningStore.markAnswerReset(placeholderId);
|
|
143
122
|
};
|
|
144
123
|
applyStreamComplete = function applyStreamComplete(payload) {
|
|
145
|
-
var
|
|
146
|
-
var
|
|
147
|
-
|
|
148
|
-
var memorySessionId = payload.memory_session_id || '';
|
|
149
|
-
var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
|
|
150
|
-
var suggestions = null;
|
|
151
|
-
if (Array.isArray(payload.suggest_reply)) {
|
|
152
|
-
suggestions = payload.suggest_reply;
|
|
153
|
-
} else if (Array.isArray(payload.suggestions)) {
|
|
154
|
-
suggestions = payload.suggestions;
|
|
155
|
-
}
|
|
156
|
-
var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
|
|
157
|
-
var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
|
|
158
|
-
var subagentRaw = payload.subagent;
|
|
159
|
-
var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
|
|
160
|
-
var reasoning = (_ref2 = payload.reasoning) !== null && _ref2 !== void 0 ? _ref2 : null;
|
|
161
|
-
reasoningStore.finish(placeholderId, reasoning);
|
|
124
|
+
var _callbacks$onFinishSt;
|
|
125
|
+
var finishPayload = buildSessionFinishPayload(payload, accumulatedContent);
|
|
126
|
+
reasoningStore.finish(placeholderId, finishPayload.reasoning);
|
|
162
127
|
flushPending();
|
|
163
128
|
store().patchMeta(sessionId, {
|
|
164
129
|
isLoading: false,
|
|
@@ -166,16 +131,6 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
166
131
|
});
|
|
167
132
|
store().setActivity(sessionId, null);
|
|
168
133
|
store().setStatus(sessionId, 'complete');
|
|
169
|
-
var finishPayload = {
|
|
170
|
-
content: finalContent,
|
|
171
|
-
sources: sources,
|
|
172
|
-
memorySessionId: memorySessionId,
|
|
173
|
-
attachments: attachments,
|
|
174
|
-
suggestions: suggestions,
|
|
175
|
-
completedAgentId: completedAgentId,
|
|
176
|
-
resolvedContext: resolvedContext,
|
|
177
|
-
reasoning: reasoning
|
|
178
|
-
};
|
|
179
134
|
(_callbacks$onFinishSt = callbacks.onFinishStream) === null || _callbacks$onFinishSt === void 0 || _callbacks$onFinishSt.call(callbacks, finishPayload);
|
|
180
135
|
|
|
181
136
|
// El texto en vivo NO se limpia acá a propósito. El placeholder se va con el
|
|
@@ -189,15 +144,15 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
189
144
|
_context.prev = 2;
|
|
190
145
|
case 3:
|
|
191
146
|
if (!true) {
|
|
192
|
-
_context.next =
|
|
147
|
+
_context.next = 30;
|
|
193
148
|
break;
|
|
194
149
|
}
|
|
195
|
-
if (!active.isStopped) {
|
|
150
|
+
if (!shouldAbortSessionStreamOnStop(active.isStopped)) {
|
|
196
151
|
_context.next = 4;
|
|
197
152
|
break;
|
|
198
153
|
}
|
|
199
154
|
reader.cancel();
|
|
200
|
-
return _context.abrupt("continue",
|
|
155
|
+
return _context.abrupt("continue", 30);
|
|
201
156
|
case 4:
|
|
202
157
|
_context.next = 5;
|
|
203
158
|
return reader.read();
|
|
@@ -209,60 +164,61 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
209
164
|
_context.next = 6;
|
|
210
165
|
break;
|
|
211
166
|
}
|
|
212
|
-
return _context.abrupt("continue",
|
|
167
|
+
return _context.abrupt("continue", 30);
|
|
213
168
|
case 6:
|
|
214
|
-
if (!active.isStopped) {
|
|
169
|
+
if (!shouldAbortSessionStreamOnStop(active.isStopped)) {
|
|
215
170
|
_context.next = 7;
|
|
216
171
|
break;
|
|
217
172
|
}
|
|
218
173
|
reader.cancel();
|
|
219
|
-
return _context.abrupt("continue",
|
|
174
|
+
return _context.abrupt("continue", 30);
|
|
220
175
|
case 7:
|
|
221
176
|
buffer += decoder.decode(value, {
|
|
222
177
|
stream: true
|
|
223
178
|
});
|
|
224
|
-
|
|
225
|
-
buffer =
|
|
226
|
-
_iterator = _createForOfIteratorHelper(
|
|
179
|
+
_splitSseBuffer = splitSseBuffer(buffer), blocks = _splitSseBuffer.blocks, remainder = _splitSseBuffer.remainder;
|
|
180
|
+
buffer = remainder;
|
|
181
|
+
_iterator = _createForOfIteratorHelper(blocks);
|
|
227
182
|
_context.prev = 8;
|
|
228
183
|
_iterator.s();
|
|
229
184
|
case 9:
|
|
230
185
|
if ((_step = _iterator.n()).done) {
|
|
231
|
-
_context.next =
|
|
186
|
+
_context.next = 26;
|
|
232
187
|
break;
|
|
233
188
|
}
|
|
234
189
|
line = _step.value;
|
|
235
|
-
|
|
190
|
+
parsedBlock = parseSseBlock(line);
|
|
191
|
+
if (parsedBlock) {
|
|
236
192
|
_context.next = 10;
|
|
237
193
|
break;
|
|
238
194
|
}
|
|
239
|
-
return _context.abrupt("continue",
|
|
195
|
+
return _context.abrupt("continue", 25);
|
|
240
196
|
case 10:
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
_context.next = 11;
|
|
244
|
-
break;
|
|
245
|
-
}
|
|
246
|
-
return _context.abrupt("continue", 26);
|
|
247
|
-
case 11:
|
|
248
|
-
eventType = eventLine.replace('event: ', '').trim();
|
|
249
|
-
dataStr = dataLine.replace('data: ', '').trim();
|
|
250
|
-
_context.prev = 12;
|
|
197
|
+
eventType = parsedBlock.eventType, dataStr = parsedBlock.dataStr;
|
|
198
|
+
_context.prev = 11;
|
|
251
199
|
data = JSON.parse(dataStr);
|
|
252
200
|
_t = eventType;
|
|
253
|
-
_context.next = _t === 'thinking' ?
|
|
201
|
+
_context.next = _t === 'thinking' ? 12 : _t === 'using_skill' ? 13 : _t === 'answer_reset' ? 14 : _t === 'reasoning_step' ? 15 : _t === 'token' ? 16 : _t === 'content' ? 17 : _t === 'node' ? 18 : _t === 'complete' ? 19 : _t === 'approval_required' ? 20 : _t === 'error' ? 21 : 22;
|
|
254
202
|
break;
|
|
255
|
-
case
|
|
256
|
-
|
|
257
|
-
if (
|
|
258
|
-
reasoningStore.appendThinking(placeholderId,
|
|
203
|
+
case 12:
|
|
204
|
+
_resolveThinkingDelta = resolveThinkingDelta(data), index = _resolveThinkingDelta.index, thinkingDelta = _resolveThinkingDelta.delta;
|
|
205
|
+
if (shouldAppendThinkingStep(index, thinkingDelta)) {
|
|
206
|
+
reasoningStore.appendThinking(placeholderId, index, thinkingDelta);
|
|
259
207
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
208
|
+
if (!hasStartedWriting) {
|
|
209
|
+
store().patchMeta(sessionId, {
|
|
210
|
+
isLoading: true
|
|
211
|
+
});
|
|
212
|
+
store().setStatus(sessionId, 'thinking');
|
|
213
|
+
if (!isUsingSkill) {
|
|
214
|
+
store().setActivity(sessionId, {
|
|
215
|
+
phase: 'thinking',
|
|
216
|
+
message: getThinkingLoadingMessage(0, t)
|
|
217
|
+
});
|
|
218
|
+
}
|
|
263
219
|
}
|
|
264
|
-
return _context.abrupt("continue",
|
|
265
|
-
case
|
|
220
|
+
return _context.abrupt("continue", 23);
|
|
221
|
+
case 13:
|
|
266
222
|
if (!hasStartedWriting) {
|
|
267
223
|
isUsingSkill = true;
|
|
268
224
|
store().patchMeta(sessionId, {
|
|
@@ -271,66 +227,82 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
271
227
|
store().setStatus(sessionId, 'thinking');
|
|
272
228
|
store().setActivity(sessionId, getUsingSkillActivity(t, data.skill));
|
|
273
229
|
}
|
|
274
|
-
return _context.abrupt("continue",
|
|
275
|
-
case
|
|
230
|
+
return _context.abrupt("continue", 23);
|
|
231
|
+
case 14:
|
|
276
232
|
clearStreamLikeAnswerReset();
|
|
277
|
-
return _context.abrupt("continue",
|
|
278
|
-
case
|
|
279
|
-
stepTool =
|
|
280
|
-
stepType =
|
|
281
|
-
if (stepTool
|
|
282
|
-
|
|
283
|
-
if (
|
|
284
|
-
|
|
233
|
+
return _context.abrupt("continue", 23);
|
|
234
|
+
case 15:
|
|
235
|
+
stepTool = resolveReasoningStepTool(data);
|
|
236
|
+
stepType = resolveReasoningStepType(data);
|
|
237
|
+
if (shouldShowReasoningToolActivity(stepTool, stepType, data.status)) {
|
|
238
|
+
label = resolveToolActionLabel(stepTool, t, 'present');
|
|
239
|
+
if (label) {
|
|
240
|
+
isUsingSkill = stepTool === 'get_skill';
|
|
285
241
|
store().patchMeta(sessionId, {
|
|
286
242
|
isLoading: true
|
|
287
243
|
});
|
|
288
|
-
|
|
289
|
-
store().setActivity(sessionId, getUsingSkillActivity(t, (_data$args = data.args) === null || _data$args === void 0 ? void 0 : _data$args.name)
|
|
290
|
-
|
|
291
|
-
|
|
244
|
+
// El step de `get_skill` llega justo después de `using_skill`: mantiene el nombre.
|
|
245
|
+
store().setActivity(sessionId, isUsingSkill ? getUsingSkillActivity(t, (_data$args = data.args) === null || _data$args === void 0 ? void 0 : _data$args.name) : {
|
|
246
|
+
phase: 'action',
|
|
247
|
+
message: label
|
|
248
|
+
});
|
|
292
249
|
}
|
|
293
250
|
}
|
|
294
|
-
if (
|
|
251
|
+
if (shouldApplyReasoningStepIndex(data.i)) {
|
|
252
|
+
stepIndex = data.i;
|
|
295
253
|
reasoningStore.captureLeadingFromBody(placeholderId, accumulatedContent);
|
|
296
|
-
reasoningStore.applyStep(placeholderId, data)
|
|
254
|
+
reasoningStore.applyStep(placeholderId, _objectSpread(_objectSpread({}, data), {}, {
|
|
255
|
+
i: stepIndex
|
|
256
|
+
}));
|
|
297
257
|
if (reasoningStore.shouldClearStreamForLeading(placeholderId, accumulatedContent)) {
|
|
298
258
|
clearStreamLikeAnswerReset();
|
|
299
259
|
}
|
|
300
260
|
}
|
|
301
|
-
return _context.abrupt("continue",
|
|
302
|
-
case
|
|
303
|
-
chunk =
|
|
261
|
+
return _context.abrupt("continue", 23);
|
|
262
|
+
case 16:
|
|
263
|
+
chunk = resolveStreamTextChunk(data);
|
|
304
264
|
ensureWritingStarted();
|
|
305
265
|
applyStreamChunk(chunk);
|
|
306
|
-
return _context.abrupt("continue",
|
|
307
|
-
case
|
|
308
|
-
_chunk =
|
|
266
|
+
return _context.abrupt("continue", 23);
|
|
267
|
+
case 17:
|
|
268
|
+
_chunk = resolveStreamTextChunk(data);
|
|
309
269
|
ensureWritingStarted();
|
|
310
270
|
applyStreamChunk(_chunk);
|
|
311
271
|
if (isCompleteLikeSsePayload(data)) {
|
|
312
272
|
applyStreamComplete(data);
|
|
313
273
|
}
|
|
314
|
-
return _context.abrupt("continue",
|
|
315
|
-
case
|
|
274
|
+
return _context.abrupt("continue", 23);
|
|
275
|
+
case 18:
|
|
316
276
|
isUsingSkill = false;
|
|
317
|
-
if (data
|
|
318
|
-
|
|
277
|
+
if (isAgentTransferNode(data)) {
|
|
278
|
+
store().patchMeta(sessionId, {
|
|
279
|
+
isLoading: true
|
|
280
|
+
});
|
|
281
|
+
store().setStatus(sessionId, 'thinking');
|
|
282
|
+
} else {
|
|
283
|
+
nodeMessage = resolveNodeStreamMessage(data);
|
|
284
|
+
if (nodeMessage) {
|
|
285
|
+
store().patchMeta(sessionId, {
|
|
286
|
+
isLoading: true
|
|
287
|
+
});
|
|
288
|
+
store().setStatus(sessionId, 'thinking');
|
|
289
|
+
store().setActivity(sessionId, resolveHitlNodeStreamActivity(nodeMessage, t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined, resolveNodeThreadId(data)));
|
|
290
|
+
}
|
|
319
291
|
}
|
|
320
|
-
return _context.abrupt("continue",
|
|
321
|
-
case
|
|
292
|
+
return _context.abrupt("continue", 23);
|
|
293
|
+
case 19:
|
|
322
294
|
applyStreamComplete(data);
|
|
323
|
-
return _context.abrupt("continue",
|
|
324
|
-
case
|
|
295
|
+
return _context.abrupt("continue", 23);
|
|
296
|
+
case 20:
|
|
325
297
|
flushPending();
|
|
326
298
|
// Preaprobado (auto-approve o detección manual): el stream no se corta,
|
|
327
299
|
// sigue ejecutando las acciones sin esperar decisión del usuario.
|
|
328
|
-
isPreApproved = data
|
|
300
|
+
isPreApproved = isApprovalPreApproved(data);
|
|
329
301
|
store().patchMeta(sessionId, {
|
|
330
302
|
isWriting: false
|
|
331
303
|
});
|
|
332
304
|
if (!isPreApproved) {
|
|
333
|
-
reasoningStore.finish(placeholderId, (
|
|
305
|
+
reasoningStore.finish(placeholderId, (_ref2 = data.reasoning) !== null && _ref2 !== void 0 ? _ref2 : null);
|
|
334
306
|
store().patchMeta(sessionId, {
|
|
335
307
|
isLoading: false
|
|
336
308
|
});
|
|
@@ -339,11 +311,15 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
339
311
|
}
|
|
340
312
|
store().setStatus(sessionId, 'awaiting_approval');
|
|
341
313
|
(_callbacks$onApproval = callbacks.onApprovalRequired) === null || _callbacks$onApproval === void 0 || _callbacks$onApproval.call(callbacks, data, accumulatedContent);
|
|
342
|
-
if (isPreApproved
|
|
343
|
-
|
|
314
|
+
if (shouldResumeHitlAfterPreApproval(isPreApproved, data.pending_actions)) {
|
|
315
|
+
store().patchMeta(sessionId, {
|
|
316
|
+
isLoading: true
|
|
317
|
+
});
|
|
318
|
+
store().setStatus(sessionId, 'thinking');
|
|
319
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : undefined));
|
|
344
320
|
}
|
|
345
|
-
return _context.abrupt("continue",
|
|
346
|
-
case
|
|
321
|
+
return _context.abrupt("continue", 23);
|
|
322
|
+
case 21:
|
|
347
323
|
console.error('SSE Error:', data.error);
|
|
348
324
|
flushPending();
|
|
349
325
|
sessionStreamingText.clear(sessionId);
|
|
@@ -358,43 +334,43 @@ var parseSessionSSE = /*#__PURE__*/function () {
|
|
|
358
334
|
});
|
|
359
335
|
store().setStatus(sessionId, 'error');
|
|
360
336
|
(_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, (_data$error3 = data.error) === null || _data$error3 === void 0 ? void 0 : _data$error3.type, (_data$error4 = data.error) === null || _data$error4 === void 0 ? void 0 : _data$error4.message);
|
|
361
|
-
return _context.abrupt("continue",
|
|
362
|
-
case
|
|
337
|
+
return _context.abrupt("continue", 23);
|
|
338
|
+
case 22:
|
|
363
339
|
console.warn('Unknown SSE event type:', eventType);
|
|
364
|
-
return _context.abrupt("continue",
|
|
365
|
-
case
|
|
366
|
-
_context.next =
|
|
340
|
+
return _context.abrupt("continue", 23);
|
|
341
|
+
case 23:
|
|
342
|
+
_context.next = 25;
|
|
367
343
|
break;
|
|
368
|
-
case
|
|
369
|
-
_context.prev =
|
|
370
|
-
_t2 = _context["catch"](
|
|
344
|
+
case 24:
|
|
345
|
+
_context.prev = 24;
|
|
346
|
+
_t2 = _context["catch"](11);
|
|
371
347
|
console.error('Error parsing SSE data:', _t2, dataStr);
|
|
372
|
-
case
|
|
348
|
+
case 25:
|
|
373
349
|
_context.next = 9;
|
|
374
350
|
break;
|
|
375
|
-
case
|
|
376
|
-
_context.next =
|
|
351
|
+
case 26:
|
|
352
|
+
_context.next = 28;
|
|
377
353
|
break;
|
|
378
|
-
case
|
|
379
|
-
_context.prev =
|
|
354
|
+
case 27:
|
|
355
|
+
_context.prev = 27;
|
|
380
356
|
_t3 = _context["catch"](8);
|
|
381
357
|
_iterator.e(_t3);
|
|
382
|
-
case
|
|
383
|
-
_context.prev =
|
|
358
|
+
case 28:
|
|
359
|
+
_context.prev = 28;
|
|
384
360
|
_iterator.f();
|
|
385
|
-
return _context.finish(
|
|
386
|
-
case
|
|
361
|
+
return _context.finish(28);
|
|
362
|
+
case 29:
|
|
387
363
|
_context.next = 3;
|
|
388
364
|
break;
|
|
389
|
-
case
|
|
390
|
-
_context.prev =
|
|
365
|
+
case 30:
|
|
366
|
+
_context.prev = 30;
|
|
391
367
|
flushPending();
|
|
392
|
-
return _context.finish(
|
|
393
|
-
case
|
|
368
|
+
return _context.finish(30);
|
|
369
|
+
case 31:
|
|
394
370
|
case "end":
|
|
395
371
|
return _context.stop();
|
|
396
372
|
}
|
|
397
|
-
}, _callee, null, [[2,,
|
|
373
|
+
}, _callee, null, [[2,, 30, 31], [8, 27, 28, 29], [11, 24]]);
|
|
398
374
|
}));
|
|
399
375
|
return function parseSessionSSE(_x, _x2, _x3) {
|
|
400
376
|
return _ref.apply(this, arguments);
|
|
@@ -415,30 +391,22 @@ export var sessionStreamManager = {
|
|
|
415
391
|
},
|
|
416
392
|
startStream: function startStream(params) {
|
|
417
393
|
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
418
|
-
var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, controller, active, response, _callbacks$onError2, _t4;
|
|
394
|
+
var sessionId, placeholderId, request, callbacks, t, activityOptions, agentId, agentName, startGuard, controller, active, response, _callbacks$onError2, _t4;
|
|
419
395
|
return _regeneratorRuntime.wrap(function (_context2) {
|
|
420
396
|
while (1) switch (_context2.prev = _context2.next) {
|
|
421
397
|
case 0:
|
|
422
398
|
ensureSessionNotificationsInitialized();
|
|
423
399
|
sessionId = params.sessionId, placeholderId = params.placeholderId, request = params.request, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
424
|
-
|
|
400
|
+
startGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
|
|
401
|
+
if (startGuard.allowed) {
|
|
425
402
|
_context2.next = 1;
|
|
426
403
|
break;
|
|
427
404
|
}
|
|
428
405
|
return _context2.abrupt("return", {
|
|
429
406
|
started: false,
|
|
430
|
-
reason:
|
|
407
|
+
reason: startGuard.reason
|
|
431
408
|
});
|
|
432
409
|
case 1:
|
|
433
|
-
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
434
|
-
_context2.next = 2;
|
|
435
|
-
break;
|
|
436
|
-
}
|
|
437
|
-
return _context2.abrupt("return", {
|
|
438
|
-
started: false,
|
|
439
|
-
reason: 'limit'
|
|
440
|
-
});
|
|
441
|
-
case 2:
|
|
442
410
|
controller = new AbortController();
|
|
443
411
|
active = {
|
|
444
412
|
sessionId: sessionId,
|
|
@@ -447,33 +415,29 @@ export var sessionStreamManager = {
|
|
|
447
415
|
};
|
|
448
416
|
activeStreams.set(sessionId, active);
|
|
449
417
|
store().ensureSession(sessionId);
|
|
450
|
-
store().patchMeta(sessionId, _objectSpread(
|
|
418
|
+
store().patchMeta(sessionId, _objectSpread({
|
|
451
419
|
placeholderId: placeholderId,
|
|
452
420
|
error: null,
|
|
453
421
|
isLoading: true,
|
|
454
422
|
isWriting: false
|
|
455
|
-
}, agentId
|
|
456
|
-
agentId: agentId
|
|
457
|
-
} : {}), agentName != null ? {
|
|
458
|
-
agentName: agentName
|
|
459
|
-
} : {}));
|
|
423
|
+
}, patchMetaAgentFields(agentId, agentName)));
|
|
460
424
|
store().setStatus(sessionId, 'thinking');
|
|
461
425
|
sessionStreamingText.start(sessionId, placeholderId);
|
|
462
426
|
reasoningStore.start(placeholderId);
|
|
463
427
|
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
464
|
-
_context2.prev =
|
|
465
|
-
_context2.next =
|
|
428
|
+
_context2.prev = 2;
|
|
429
|
+
_context2.next = 3;
|
|
466
430
|
return maia.Orchestrator.orchestrator(request, controller.signal);
|
|
467
|
-
case
|
|
431
|
+
case 3:
|
|
468
432
|
response = _context2.sent;
|
|
469
|
-
_context2.next =
|
|
433
|
+
_context2.next = 4;
|
|
470
434
|
return parseSessionSSE(response, active, params);
|
|
471
|
-
case
|
|
472
|
-
_context2.next =
|
|
435
|
+
case 4:
|
|
436
|
+
_context2.next = 6;
|
|
473
437
|
break;
|
|
474
|
-
case
|
|
475
|
-
_context2.prev =
|
|
476
|
-
_t4 = _context2["catch"](
|
|
438
|
+
case 5:
|
|
439
|
+
_context2.prev = 5;
|
|
440
|
+
_t4 = _context2["catch"](2);
|
|
477
441
|
if (!active.isStopped) {
|
|
478
442
|
sessionStreamingText.clear(sessionId);
|
|
479
443
|
store().patchMeta(sessionId, {
|
|
@@ -484,48 +448,40 @@ export var sessionStreamManager = {
|
|
|
484
448
|
store().setStatus(sessionId, 'error');
|
|
485
449
|
(_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 || _callbacks$onError2.call(callbacks);
|
|
486
450
|
}
|
|
487
|
-
case
|
|
488
|
-
_context2.prev =
|
|
451
|
+
case 6:
|
|
452
|
+
_context2.prev = 6;
|
|
489
453
|
activeStreams["delete"](sessionId);
|
|
490
|
-
return _context2.finish(
|
|
491
|
-
case
|
|
454
|
+
return _context2.finish(6);
|
|
455
|
+
case 7:
|
|
492
456
|
return _context2.abrupt("return", {
|
|
493
457
|
started: true
|
|
494
458
|
});
|
|
495
|
-
case
|
|
459
|
+
case 8:
|
|
496
460
|
case "end":
|
|
497
461
|
return _context2.stop();
|
|
498
462
|
}
|
|
499
|
-
}, _callee2, null, [[
|
|
463
|
+
}, _callee2, null, [[2, 5, 6, 7]]);
|
|
500
464
|
}))();
|
|
501
465
|
},
|
|
502
466
|
/** Resume HITL (`continue-thread`) keyed por sessionId — mismo motor que orchestrator. */startContinueStream: function startContinueStream(params) {
|
|
503
467
|
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
504
|
-
var
|
|
505
|
-
var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, controller, active, sseParams, response, _callbacks$onError3, _t5;
|
|
468
|
+
var _ref3;
|
|
469
|
+
var sessionId, placeholderId, continueRequest, callbacks, t, hitlExecutionContext, agentId, agentName, continueGuard, controller, active, sseParams, response, _callbacks$onError3, _t5;
|
|
506
470
|
return _regeneratorRuntime.wrap(function (_context3) {
|
|
507
471
|
while (1) switch (_context3.prev = _context3.next) {
|
|
508
472
|
case 0:
|
|
509
473
|
ensureSessionNotificationsInitialized();
|
|
510
474
|
sessionId = params.sessionId, placeholderId = params.placeholderId, continueRequest = params.continueRequest, callbacks = params.callbacks, t = params.t, hitlExecutionContext = params.hitlExecutionContext, agentId = params.agentId, agentName = params.agentName;
|
|
511
|
-
|
|
475
|
+
continueGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
|
|
476
|
+
if (continueGuard.allowed) {
|
|
512
477
|
_context3.next = 1;
|
|
513
478
|
break;
|
|
514
479
|
}
|
|
515
480
|
return _context3.abrupt("return", {
|
|
516
481
|
started: false,
|
|
517
|
-
reason:
|
|
482
|
+
reason: continueGuard.reason
|
|
518
483
|
});
|
|
519
484
|
case 1:
|
|
520
|
-
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
521
|
-
_context3.next = 2;
|
|
522
|
-
break;
|
|
523
|
-
}
|
|
524
|
-
return _context3.abrupt("return", {
|
|
525
|
-
started: false,
|
|
526
|
-
reason: 'limit'
|
|
527
|
-
});
|
|
528
|
-
case 2:
|
|
529
485
|
if (hitlExecutionContext) {
|
|
530
486
|
sessionHitlContext.set(sessionId, hitlExecutionContext);
|
|
531
487
|
}
|
|
@@ -537,19 +493,15 @@ export var sessionStreamManager = {
|
|
|
537
493
|
};
|
|
538
494
|
activeStreams.set(sessionId, active);
|
|
539
495
|
store().ensureSession(sessionId);
|
|
540
|
-
store().patchMeta(sessionId, _objectSpread(
|
|
496
|
+
store().patchMeta(sessionId, _objectSpread({
|
|
541
497
|
placeholderId: placeholderId,
|
|
542
498
|
error: null,
|
|
543
499
|
isLoading: true,
|
|
544
500
|
isWriting: false
|
|
545
|
-
}, agentId
|
|
546
|
-
agentId: agentId
|
|
547
|
-
} : {}), agentName != null ? {
|
|
548
|
-
agentName: agentName
|
|
549
|
-
} : {}));
|
|
501
|
+
}, patchMetaAgentFields(agentId, agentName)));
|
|
550
502
|
store().setStatus(sessionId, 'thinking');
|
|
551
503
|
sessionStreamingText.start(sessionId, placeholderId);
|
|
552
|
-
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (
|
|
504
|
+
store().setActivity(sessionId, resolveInitialHitlStreamActivity(t, (_ref3 = hitlExecutionContext !== null && hitlExecutionContext !== void 0 ? hitlExecutionContext : sessionHitlContext.get(sessionId)) !== null && _ref3 !== void 0 ? _ref3 : undefined));
|
|
553
505
|
sseParams = {
|
|
554
506
|
sessionId: sessionId,
|
|
555
507
|
placeholderId: placeholderId,
|
|
@@ -560,25 +512,25 @@ export var sessionStreamManager = {
|
|
|
560
512
|
agentId: agentId,
|
|
561
513
|
agentName: agentName
|
|
562
514
|
};
|
|
563
|
-
_context3.prev =
|
|
564
|
-
_context3.next =
|
|
515
|
+
_context3.prev = 2;
|
|
516
|
+
_context3.next = 3;
|
|
565
517
|
return maia.Orchestrator.continueThread(continueRequest, controller.signal);
|
|
566
|
-
case
|
|
518
|
+
case 3:
|
|
567
519
|
response = _context3.sent;
|
|
568
520
|
if (response.ok) {
|
|
569
|
-
_context3.next =
|
|
521
|
+
_context3.next = 4;
|
|
570
522
|
break;
|
|
571
523
|
}
|
|
572
524
|
throw new Error("continue-thread failed: ".concat(response.status));
|
|
573
|
-
case
|
|
574
|
-
_context3.next =
|
|
525
|
+
case 4:
|
|
526
|
+
_context3.next = 5;
|
|
575
527
|
return parseSessionSSE(response, active, sseParams);
|
|
576
|
-
case
|
|
577
|
-
_context3.next =
|
|
528
|
+
case 5:
|
|
529
|
+
_context3.next = 7;
|
|
578
530
|
break;
|
|
579
|
-
case
|
|
580
|
-
_context3.prev =
|
|
581
|
-
_t5 = _context3["catch"](
|
|
531
|
+
case 6:
|
|
532
|
+
_context3.prev = 6;
|
|
533
|
+
_t5 = _context3["catch"](2);
|
|
582
534
|
if (!active.isStopped) {
|
|
583
535
|
sessionStreamingText.clear(sessionId);
|
|
584
536
|
store().patchMeta(sessionId, {
|
|
@@ -589,48 +541,40 @@ export var sessionStreamManager = {
|
|
|
589
541
|
store().setStatus(sessionId, 'error');
|
|
590
542
|
(_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks);
|
|
591
543
|
}
|
|
592
|
-
case
|
|
593
|
-
_context3.prev =
|
|
544
|
+
case 7:
|
|
545
|
+
_context3.prev = 7;
|
|
594
546
|
activeStreams["delete"](sessionId);
|
|
595
547
|
sessionHitlContext.clear(sessionId);
|
|
596
|
-
return _context3.finish(
|
|
597
|
-
case
|
|
548
|
+
return _context3.finish(7);
|
|
549
|
+
case 8:
|
|
598
550
|
return _context3.abrupt("return", {
|
|
599
551
|
started: true
|
|
600
552
|
});
|
|
601
|
-
case
|
|
553
|
+
case 9:
|
|
602
554
|
case "end":
|
|
603
555
|
return _context3.stop();
|
|
604
556
|
}
|
|
605
|
-
}, _callee3, null, [[
|
|
557
|
+
}, _callee3, null, [[2, 6, 7, 8]]);
|
|
606
558
|
}))();
|
|
607
559
|
},
|
|
608
560
|
/** Regenera la respuesta de un turno (`retry_completion`) — mismo motor SSE que orchestrator. */startRetryStream: function startRetryStream(params) {
|
|
609
561
|
return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
|
|
610
|
-
var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
|
|
562
|
+
var sessionId, placeholderId, retryRequest, callbacks, t, activityOptions, agentId, agentName, retryGuard, controller, active, sseParams, response, detail, data, _callbacks$onError4, _t6, _t7;
|
|
611
563
|
return _regeneratorRuntime.wrap(function (_context4) {
|
|
612
564
|
while (1) switch (_context4.prev = _context4.next) {
|
|
613
565
|
case 0:
|
|
614
566
|
ensureSessionNotificationsInitialized();
|
|
615
567
|
sessionId = params.sessionId, placeholderId = params.placeholderId, retryRequest = params.retryRequest, callbacks = params.callbacks, t = params.t, activityOptions = params.activityOptions, agentId = params.agentId, agentName = params.agentName;
|
|
616
|
-
|
|
568
|
+
retryGuard = resolveStartStreamGuard(isStreamActive(sessionId), getActiveStreamCount(), MAX_CONCURRENT_STREAMS);
|
|
569
|
+
if (retryGuard.allowed) {
|
|
617
570
|
_context4.next = 1;
|
|
618
571
|
break;
|
|
619
572
|
}
|
|
620
573
|
return _context4.abrupt("return", {
|
|
621
574
|
started: false,
|
|
622
|
-
reason:
|
|
575
|
+
reason: retryGuard.reason
|
|
623
576
|
});
|
|
624
577
|
case 1:
|
|
625
|
-
if (!(getActiveStreamCount() >= MAX_CONCURRENT_STREAMS)) {
|
|
626
|
-
_context4.next = 2;
|
|
627
|
-
break;
|
|
628
|
-
}
|
|
629
|
-
return _context4.abrupt("return", {
|
|
630
|
-
started: false,
|
|
631
|
-
reason: 'limit'
|
|
632
|
-
});
|
|
633
|
-
case 2:
|
|
634
578
|
controller = new AbortController();
|
|
635
579
|
active = {
|
|
636
580
|
sessionId: sessionId,
|
|
@@ -639,16 +583,12 @@ export var sessionStreamManager = {
|
|
|
639
583
|
};
|
|
640
584
|
activeStreams.set(sessionId, active);
|
|
641
585
|
store().ensureSession(sessionId);
|
|
642
|
-
store().patchMeta(sessionId, _objectSpread(
|
|
586
|
+
store().patchMeta(sessionId, _objectSpread({
|
|
643
587
|
placeholderId: placeholderId,
|
|
644
588
|
error: null,
|
|
645
589
|
isLoading: true,
|
|
646
590
|
isWriting: false
|
|
647
|
-
}, agentId
|
|
648
|
-
agentId: agentId
|
|
649
|
-
} : {}), agentName != null ? {
|
|
650
|
-
agentName: agentName
|
|
651
|
-
} : {}));
|
|
591
|
+
}, patchMetaAgentFields(agentId, agentName)));
|
|
652
592
|
store().setStatus(sessionId, 'thinking');
|
|
653
593
|
sessionStreamingText.start(sessionId, placeholderId);
|
|
654
594
|
store().setActivity(sessionId, getInitialStreamActivity(t, activityOptions !== null && activityOptions !== void 0 ? activityOptions : {}));
|
|
@@ -662,34 +602,34 @@ export var sessionStreamManager = {
|
|
|
662
602
|
agentId: agentId,
|
|
663
603
|
agentName: agentName
|
|
664
604
|
};
|
|
665
|
-
_context4.prev =
|
|
666
|
-
_context4.next =
|
|
605
|
+
_context4.prev = 2;
|
|
606
|
+
_context4.next = 3;
|
|
667
607
|
return maia.Orchestrator.retryCompletion(retryRequest, controller.signal);
|
|
668
|
-
case
|
|
608
|
+
case 3:
|
|
669
609
|
response = _context4.sent;
|
|
670
610
|
if (response.ok) {
|
|
671
|
-
_context4.next =
|
|
611
|
+
_context4.next = 9;
|
|
672
612
|
break;
|
|
673
613
|
}
|
|
674
614
|
if (!(response.status === 404)) {
|
|
675
|
-
_context4.next =
|
|
615
|
+
_context4.next = 8;
|
|
676
616
|
break;
|
|
677
617
|
}
|
|
678
|
-
_context4.prev =
|
|
679
|
-
_context4.next =
|
|
618
|
+
_context4.prev = 4;
|
|
619
|
+
_context4.next = 5;
|
|
680
620
|
return response.json();
|
|
681
|
-
case
|
|
621
|
+
case 5:
|
|
682
622
|
data = _context4.sent;
|
|
683
623
|
detail = typeof data.detail === 'string' ? data.detail : undefined;
|
|
684
|
-
_context4.next =
|
|
624
|
+
_context4.next = 7;
|
|
685
625
|
break;
|
|
686
|
-
case
|
|
687
|
-
_context4.prev =
|
|
688
|
-
_t6 = _context4["catch"](
|
|
626
|
+
case 6:
|
|
627
|
+
_context4.prev = 6;
|
|
628
|
+
_t6 = _context4["catch"](4);
|
|
689
629
|
detail = undefined;
|
|
690
|
-
case
|
|
691
|
-
if (!(detail
|
|
692
|
-
_context4.next =
|
|
630
|
+
case 7:
|
|
631
|
+
if (!isRetryTurnNotFoundResponse(response.status, detail)) {
|
|
632
|
+
_context4.next = 8;
|
|
693
633
|
break;
|
|
694
634
|
}
|
|
695
635
|
sessionStreamingText.clear(sessionId);
|
|
@@ -705,17 +645,17 @@ export var sessionStreamManager = {
|
|
|
705
645
|
started: false,
|
|
706
646
|
reason: 'turn_not_found'
|
|
707
647
|
});
|
|
708
|
-
case
|
|
648
|
+
case 8:
|
|
709
649
|
throw new Error("retry_completion failed: ".concat(response.status));
|
|
710
|
-
case
|
|
711
|
-
_context4.next =
|
|
650
|
+
case 9:
|
|
651
|
+
_context4.next = 10;
|
|
712
652
|
return parseSessionSSE(response, active, sseParams);
|
|
713
|
-
case
|
|
714
|
-
_context4.next =
|
|
653
|
+
case 10:
|
|
654
|
+
_context4.next = 12;
|
|
715
655
|
break;
|
|
716
|
-
case
|
|
717
|
-
_context4.prev =
|
|
718
|
-
_t7 = _context4["catch"](
|
|
656
|
+
case 11:
|
|
657
|
+
_context4.prev = 11;
|
|
658
|
+
_t7 = _context4["catch"](2);
|
|
719
659
|
if (!active.isStopped) {
|
|
720
660
|
sessionStreamingText.clear(sessionId);
|
|
721
661
|
store().patchMeta(sessionId, {
|
|
@@ -726,19 +666,19 @@ export var sessionStreamManager = {
|
|
|
726
666
|
store().setStatus(sessionId, 'error');
|
|
727
667
|
(_callbacks$onError4 = callbacks.onError) === null || _callbacks$onError4 === void 0 || _callbacks$onError4.call(callbacks);
|
|
728
668
|
}
|
|
729
|
-
case
|
|
730
|
-
_context4.prev =
|
|
669
|
+
case 12:
|
|
670
|
+
_context4.prev = 12;
|
|
731
671
|
activeStreams["delete"](sessionId);
|
|
732
|
-
return _context4.finish(
|
|
733
|
-
case
|
|
672
|
+
return _context4.finish(12);
|
|
673
|
+
case 13:
|
|
734
674
|
return _context4.abrupt("return", {
|
|
735
675
|
started: true
|
|
736
676
|
});
|
|
737
|
-
case
|
|
677
|
+
case 14:
|
|
738
678
|
case "end":
|
|
739
679
|
return _context4.stop();
|
|
740
680
|
}
|
|
741
|
-
}, _callee4, null, [[
|
|
681
|
+
}, _callee4, null, [[2, 11, 12, 13], [4, 6]]);
|
|
742
682
|
}))();
|
|
743
683
|
},
|
|
744
684
|
/** Cancelación explícita del usuario (mensaje "cancelado"). */stopStream: function stopStream(sessionId, callbacks) {
|
|
@@ -761,7 +701,7 @@ export var sessionStreamManager = {
|
|
|
761
701
|
callbacks === null || callbacks === void 0 || (_callbacks$onStop = callbacks.onStop) === null || _callbacks$onStop === void 0 || _callbacks$onStop.call(callbacks, partialText);
|
|
762
702
|
},
|
|
763
703
|
/** Aborta sin marcar "cancelado" (uso interno / limpieza). */abortSilently: function abortSilently(sessionId) {
|
|
764
|
-
var _store$
|
|
704
|
+
var _store$getMeta;
|
|
765
705
|
var active = activeStreams.get(sessionId);
|
|
766
706
|
if (!active) return;
|
|
767
707
|
active.isStopped = true;
|
|
@@ -773,7 +713,7 @@ export var sessionStreamManager = {
|
|
|
773
713
|
isWriting: false
|
|
774
714
|
});
|
|
775
715
|
store().setActivity(sessionId, null);
|
|
776
|
-
if (((_store$
|
|
716
|
+
if (shouldSetIdleOnSilentAbort((_store$getMeta = store().getMeta(sessionId)) === null || _store$getMeta === void 0 ? void 0 : _store$getMeta.status)) {
|
|
777
717
|
store().setStatus(sessionId, 'idle');
|
|
778
718
|
}
|
|
779
719
|
},
|
|
@@ -784,4 +724,4 @@ export var sessionStreamManager = {
|
|
|
784
724
|
});
|
|
785
725
|
}
|
|
786
726
|
};
|
|
787
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdTdHJlYW1BY3Rpdml0eSIsImdldFVzaW5nU2tpbGxBY3Rpdml0eSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5IiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInJlYXNvbmluZ1N0b3JlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsIk1BWF9DT05DVVJSRU5UX1NUUkVBTVMiLCJTVFJFQU1fVEhST1RUTEVfTVMiLCJhY3RpdmVTdHJlYW1zIiwiTWFwIiwic3RvcmUiLCJnZXRTdGF0ZSIsImlzU3RyZWFtQWN0aXZlIiwic2Vzc2lvbklkIiwiaGFzIiwiZ2V0QWN0aXZlU3RyZWFtQ291bnQiLCJzaXplIiwicGFyc2VTZXNzaW9uU1NFIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJhY3RpdmUiLCJwYXJhbXMiLCJfcmVzcG9uc2UkYm9keSIsIl9kYXRhJGVycm9yIiwiX2RhdGEkZXJyb3IyIiwiX2NhbGxiYWNrcyRvbkVycm9yIiwiX2RhdGEkZXJyb3IzIiwiX2RhdGEkZXJyb3I0IiwicGxhY2Vob2xkZXJJZCIsImNhbGxiYWNrcyIsInQiLCJwZW5kaW5nQ29udGVudCIsInRocm90dGxlVGltZXIiLCJmbHVzaFRvU3RvcmVzIiwiZW1pdFRocm90dGxlZCIsImZsdXNoUGVuZGluZyIsInJlYWRlciIsImRlY29kZXIiLCJidWZmZXIiLCJhY2N1bXVsYXRlZENvbnRlbnQiLCJoYXNTdGFydGVkV3JpdGluZyIsImlzVXNpbmdTa2lsbCIsInNldFRoaW5raW5nQWN0aXZpdHkiLCJlbnN1cmVXcml0aW5nU3RhcnRlZCIsImFwcGx5U3RyZWFtQ2h1bmsiLCJjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCIsImFwcGx5U3RyZWFtQ29tcGxldGUiLCJfeWllbGQkcmVhZGVyJHJlYWQiLCJkb25lIiwidmFsdWUiLCJsaW5lcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwibGluZSIsIl9saW5lJHNwbGl0IiwiX2xpbmUkc3BsaXQyIiwiZXZlbnRMaW5lIiwiZGF0YUxpbmUiLCJldmVudFR5cGUiLCJkYXRhU3RyIiwiZGF0YSIsInRoaW5raW5nRGVsdGEiLCJzdGVwVG9vbCIsInN0ZXBUeXBlIiwiX2RhdGEkYXJncyIsImNodW5rIiwiX2NodW5rIiwiX2NhbGxiYWNrcyRvbkFwcHJvdmFsIiwiaXNQcmVBcHByb3ZlZCIsIl9yZWYzIiwiX3QiLCJfdDIiLCJfdDMiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImNvbnRlbnQiLCJfY2FsbGJhY2tzJG9uU3RyZWFtVXAiLCJzZXRUZXh0Iiwib25TdHJlYW1VcGRhdGUiLCJjYWxsIiwid2luZG93Iiwic2V0VGltZW91dCIsInRvRW1pdCIsImNsZWFyVGltZW91dCIsImJvZHkiLCJnZXRSZWFkZXIiLCJFcnJvciIsIlRleHREZWNvZGVyIiwiX3N0b3JlJGdldE1ldGEiLCJ0aGlua2luZ0FjdGl2aXR5IiwiY3VycmVudCIsImdldE1ldGEiLCJzdHJlYW1BY3Rpdml0eSIsInBoYXNlIiwibWVzc2FnZSIsInBhdGNoTWV0YSIsImlzTG9hZGluZyIsInNldFN0YXR1cyIsInNldEFjdGl2aXR5IiwiX3N0b3JlJGdldE1ldGEyIiwiX2NhbGxiYWNrcyRvblN0YXJ0V3JpIiwiaXNXcml0aW5nIiwib25TdGFydFdyaXRpbmciLCJzeW5jTGl2ZU5hcnJhdGlvbiIsIm1hcmtBbnN3ZXJSZXNldCIsInBheWxvYWQiLCJfcGF5bG9hZCRhZ2VudF9pZCIsIl9zdWJhZ2VudFJhdyRyZXNvbHZlZCIsIl9yZWYyIiwiX2NhbGxiYWNrcyRvbkZpbmlzaFN0IiwiZmluYWxDb250ZW50Iiwic291cmNlcyIsIm1lbW9yeVNlc3Npb25JZCIsIm1lbW9yeV9zZXNzaW9uX2lkIiwiYXR0YWNobWVudHMiLCJBcnJheSIsImlzQXJyYXkiLCJzdWdnZXN0aW9ucyIsInN1Z2dlc3RfcmVwbHkiLCJhZ2VudElkUmF3IiwiYWdlbnRfaWQiLCJhZ2VudElkIiwiY29tcGxldGVkQWdlbnRJZCIsIlN0cmluZyIsInRyaW0iLCJzdWJhZ2VudFJhdyIsInN1YmFnZW50IiwicmVzb2x2ZWRDb250ZXh0IiwicmVzb2x2ZWRfY29udGV4dCIsInJlYXNvbmluZyIsImZpbmlzaCIsImZpbmlzaFBheWxvYWQiLCJvbkZpbmlzaFN0cmVhbSIsImlzU3RvcHBlZCIsImNhbmNlbCIsImFicnVwdCIsInJlYWQiLCJzZW50IiwiZGVjb2RlIiwic3RyZWFtIiwic3BsaXQiLCJwb3AiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInMiLCJuIiwiX3NsaWNlZFRvQXJyYXkiLCJyZXBsYWNlIiwiSlNPTiIsInBhcnNlIiwiZGVsdGEiLCJpIiwiYXBwZW5kVGhpbmtpbmciLCJza2lsbCIsInRvb2wiLCJ0eXBlIiwic3RhdHVzIiwiYXJncyIsIm5hbWUiLCJjYXB0dXJlTGVhZGluZ0Zyb21Cb2R5IiwiYXBwbHlTdGVwIiwic2hvdWxkQ2xlYXJTdHJlYW1Gb3JMZWFkaW5nIiwibm9kZSIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsImF1dG9fYXBwcm92ZWQiLCJhcHByb3ZhbF9zdGF0dXMiLCJjbGVhciIsIm9uQXBwcm92YWxSZXF1aXJlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInNldEVycm9yIiwib25FcnJvciIsIndhcm4iLCJlIiwiZiIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwiYXJndW1lbnRzIiwic2Vzc2lvblN0cmVhbU1hbmFnZXIiLCJpc0FjdGl2ZSIsImdldEFjdGl2ZUNvdW50IiwiZ2V0QWN0aXZlU2Vzc2lvbklkcyIsImZyb20iLCJrZXlzIiwic3RhcnRTdHJlYW0iLCJfY2FsbGVlMiIsInJlcXVlc3QiLCJhY3Rpdml0eU9wdGlvbnMiLCJhZ2VudE5hbWUiLCJjb250cm9sbGVyIiwiX2NhbGxiYWNrcyRvbkVycm9yMiIsIl90NCIsIl9jb250ZXh0MiIsInN0YXJ0ZWQiLCJyZWFzb24iLCJBYm9ydENvbnRyb2xsZXIiLCJzZXQiLCJlbnN1cmVTZXNzaW9uIiwiX29iamVjdFNwcmVhZCIsInN0YXJ0IiwiT3JjaGVzdHJhdG9yIiwib3JjaGVzdHJhdG9yIiwic2lnbmFsIiwic3RhcnRDb250aW51ZVN0cmVhbSIsIl9jYWxsZWUzIiwiX3JlZjQiLCJjb250aW51ZVJlcXVlc3QiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsInNzZVBhcmFtcyIsIl9jYWxsYmFja3Mkb25FcnJvcjMiLCJfdDUiLCJfY29udGV4dDMiLCJnZXQiLCJ1bmRlZmluZWQiLCJjb250aW51ZVRocmVhZCIsIm9rIiwiY29uY2F0Iiwic3RhcnRSZXRyeVN0cmVhbSIsIl9jYWxsZWU0IiwicmV0cnlSZXF1ZXN0IiwiZGV0YWlsIiwiX2NhbGxiYWNrcyRvbkVycm9yNCIsIl90NiIsIl90NyIsIl9jb250ZXh0NCIsInJldHJ5Q29tcGxldGlvbiIsImpzb24iLCJzdG9wU3RyZWFtIiwiX2NhbGxiYWNrcyRvblN0b3AiLCJhYm9ydCIsInBhcnRpYWxUZXh0IiwiZ2V0U25hcHNob3QiLCJ0ZXh0Iiwib25TdG9wIiwiYWJvcnRTaWxlbnRseSIsIl9zdG9yZSRnZXRNZXRhMyIsImFib3J0QWxsIiwiX3RoaXMiLCJmb3JFYWNoIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25TdHJlYW1NYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRpbnVlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1hd2FpdC1pbi1sb29wICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLXN5bnRheCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc3RhbnQtY29uZGl0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgbWFpYSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tYWlhJ1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbFJlcXVlc3QgfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5LFxuICBnZXRUaGlua2luZ1N0cmVhbUFjdGl2aXR5LFxuICBnZXRVc2luZ1NraWxsQWN0aXZpdHksXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHksXG59IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgdHlwZSB7IEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZCwgbWVyZ2VTdHJlYW1DaHVuayB9IGZyb20gJy4uLy4uL3V0aWxzL3NzZVN0cmVhbUNvbnRlbnQnXG5pbXBvcnQgeyByZWFzb25pbmdTdG9yZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVJlYXNvbmluZ1RyYWNlJ1xuaW1wb3J0IHR5cGUgeyBSZWFzb25pbmdTdGVwUGF5bG9hZCwgUmVhc29uaW5nVHJhY2VQYXlsb2FkIH0gZnJvbSAnLi4vLi4vdHlwZXMvcmVhc29uaW5nJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4vdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQgfSBmcm9tICcuL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgc2Vzc2lvbkhpdGxDb250ZXh0IH0gZnJvbSAnLi9zZXNzaW9uSGl0bENvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25GaW5pc2hQYXlsb2FkLCBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzLCBTdGFydFN0cmVhbVJlc3VsdCB9IGZyb20gJy4vc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgT3JjaGVzdHJhdG9yUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcj5bMF1cbnR5cGUgQ29udGludWVUaHJlYWRSZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3IuY29udGludWVUaHJlYWQ+WzBdXG50eXBlIFJldHJ5Q29tcGxldGlvblJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24+WzBdXG5cbi8qKiBDb21wYXRpYmxlIGNvbiBlbCBgdGAgZGUgaTE4bmV4dCAodXNvIGRlIHVuYSBzb2xhIGtleSkuICovXG50eXBlIFRyYW5zbGF0ZUZuID0gKGtleTogc3RyaW5nKSA9PiBzdHJpbmdcblxudHlwZSBTdGFydFN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIHJlcXVlc3Q6IE9yY2hlc3RyYXRvclJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU3RhcnRDb250aW51ZVN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIGNvbnRpbnVlUmVxdWVzdDogQ29udGludWVUaHJlYWRSZXF1ZXN0XG4gIGNhbGxiYWNrczogU2Vzc2lvblN0cmVhbUNhbGxiYWNrc1xuICB0OiBUcmFuc2xhdGVGblxuICBoaXRsRXhlY3V0aW9uQ29udGV4dD86IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbFxuICBhZ2VudElkPzogc3RyaW5nIHwgbnVtYmVyXG4gIGFnZW50TmFtZT86IHN0cmluZ1xufVxuXG50eXBlIFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMgPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZ1xuICByZXRyeVJlcXVlc3Q6IFJldHJ5Q29tcGxldGlvblJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGFjdGl2aXR5T3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgQWN0aXZlU3RyZWFtID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXJcbiAgaXNTdG9wcGVkOiBib29sZWFuXG59XG5cbi8qKlxuICogTcOheGltbyBkZSBzZXNpb25lcyBnZW5lcmFuZG8gZW4gcGFyYWxlbG8uIFByb3RlZ2UgcmVkL3JlY3Vyc29zIGRlbCBjbGllbnRlLlxuICogQWp1c3RhYmxlIGEgZnV0dXJvIHbDrWEgZmxhZyBkZWwgaG9zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMgPSA0XG5cbmNvbnN0IFNUUkVBTV9USFJPVFRMRV9NUyA9IDE2XG5cbmNvbnN0IGFjdGl2ZVN0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgQWN0aXZlU3RyZWFtPigpXG5cbmNvbnN0IHN0b3JlID0gKCkgPT4gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG5cbmNvbnN0IGlzU3RyZWFtQWN0aXZlID0gKHNlc3Npb25JZDogc3RyaW5nKTogYm9vbGVhbiA9PiBhY3RpdmVTdHJlYW1zLmhhcyhzZXNzaW9uSWQpXG5cbmNvbnN0IGdldEFjdGl2ZVN0cmVhbUNvdW50ID0gKCk6IG51bWJlciA9PiBhY3RpdmVTdHJlYW1zLnNpemVcblxuY29uc3QgcGFyc2VTZXNzaW9uU1NFID0gYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSwgYWN0aXZlOiBBY3RpdmVTdHJlYW0sIHBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIGNhbGxiYWNrcywgdCB9ID0gcGFyYW1zXG5cbiAgbGV0IHBlbmRpbmdDb250ZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgdGhyb3R0bGVUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICBjb25zdCBmbHVzaFRvU3RvcmVzID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnNldFRleHQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjb250ZW50KVxuICAgIGNhbGxiYWNrcy5vblN0cmVhbVVwZGF0ZT8uKGNvbnRlbnQpXG4gIH1cblxuICBjb25zdCBlbWl0VGhyb3R0bGVkID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIHBlbmRpbmdDb250ZW50ID0gY29udGVudFxuICAgIGlmICh0aHJvdHRsZVRpbWVyICE9IG51bGwpIHJldHVyblxuICAgIHRocm90dGxlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG9FbWl0ID0gcGVuZGluZ0NvbnRlbnRcbiAgICAgICAgcGVuZGluZ0NvbnRlbnQgPSBudWxsXG4gICAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgICAgfVxuICAgIH0sIFNUUkVBTV9USFJPVFRMRV9NUylcbiAgfVxuXG4gIGNvbnN0IGZsdXNoUGVuZGluZyA9ICgpID0+IHtcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgIH1cbiAgICBpZiAocGVuZGluZ0NvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdG9FbWl0ID0gcGVuZGluZ0NvbnRlbnRcbiAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgZmx1c2hUb1N0b3Jlcyh0b0VtaXQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKClcbiAgaWYgKCFyZWFkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlYWRlciBhdmFpbGFibGUnKVxuICB9XG5cbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIGxldCBidWZmZXIgPSAnJ1xuICBsZXQgYWNjdW11bGF0ZWRDb250ZW50ID0gJydcbiAgbGV0IGhhc1N0YXJ0ZWRXcml0aW5nID0gZmFsc2VcbiAgLy8gXCJVc2FuZG8gU2tpbGxcIiBxdWVkYSB2aXNpYmxlIG1pZW50cmFzIGVsIG1vZGVsbyBwaWVuc2EgY29uIGxhIHNraWxsIGNhcmdhZGE7XG4gIC8vIGxvcyBkZWx0YXMgZGUgYHRoaW5raW5nYCBubyBsbyBwaXNhbiBoYXN0YSBsYSBwcsOzeGltYSBhY2Npw7NuIG8gZWwgcHJpbWVyIHRva2VuLlxuICBsZXQgaXNVc2luZ1NraWxsID0gZmFsc2VcblxuICBjb25zdCBzZXRUaGlua2luZ0FjdGl2aXR5ID0gKCkgPT4ge1xuICAgIGNvbnN0IHRoaW5raW5nQWN0aXZpdHkgPSBnZXRUaGlua2luZ1N0cmVhbUFjdGl2aXR5KHQpXG4gICAgY29uc3QgY3VycmVudCA9IHN0b3JlKCkuZ2V0TWV0YShzZXNzaW9uSWQpPy5zdHJlYW1BY3Rpdml0eVxuICAgIGlmIChjdXJyZW50Py5waGFzZSA9PT0gJ3RoaW5raW5nJyAmJiBjdXJyZW50Lm1lc3NhZ2UgPT09IHRoaW5raW5nQWN0aXZpdHkubWVzc2FnZSkgcmV0dXJuXG4gICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgdGhpbmtpbmdBY3Rpdml0eSlcbiAgfVxuXG4gIGNvbnN0IGVuc3VyZVdyaXRpbmdTdGFydGVkID0gKCkgPT4ge1xuICAgIC8vIEN1YWxxdWllciB0b2tlbiBjb3J0YSBcIlVzYW5kbyBTa2lsbFwiOiBlbCBpbmRpY2Fkb3IgdnVlbHZlIGEgYWx0ZXJuYXIgcGVuc2FuZG8gLyBlc2NyaWJpZW5kby5cbiAgICBpc1VzaW5nU2tpbGwgPSBmYWxzZVxuICAgIGlmICghaGFzU3RhcnRlZFdyaXRpbmcpIHtcbiAgICAgIGhhc1N0YXJ0ZWRXcml0aW5nID0gdHJ1ZVxuICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSwgaXNXcml0aW5nOiB0cnVlIH0pXG4gICAgICBjYWxsYmFja3Mub25TdGFydFdyaXRpbmc/LigpXG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnQgPSBzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RyZWFtQWN0aXZpdHlcbiAgICBpZiAoY3VycmVudD8ucGhhc2UgIT09ICd3cml0aW5nJykge1xuICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSwgaXNXcml0aW5nOiB0cnVlIH0pXG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd3cml0aW5nJylcbiAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkodCkpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwbHlTdHJlYW1DaHVuayA9IChjaHVuazogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFjaHVuaykgcmV0dXJuXG4gICAgYWNjdW11bGF0ZWRDb250ZW50ID0gbWVyZ2VTdHJlYW1DaHVuayhhY2N1bXVsYXRlZENvbnRlbnQsIGNodW5rKVxuICAgIHJlYXNvbmluZ1N0b3JlLnN5bmNMaXZlTmFycmF0aW9uKHBsYWNlaG9sZGVySWQsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICBlbWl0VGhyb3R0bGVkKGFjY3VtdWxhdGVkQ29udGVudClcbiAgfVxuXG4gIGNvbnN0IGNsZWFyU3RyZWFtTGlrZUFuc3dlclJlc2V0ID0gKCkgPT4ge1xuICAgIGlmICh0aHJvdHRsZVRpbWVyICE9IG51bGwpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhyb3R0bGVUaW1lcilcbiAgICAgIHRocm90dGxlVGltZXIgPSBudWxsXG4gICAgfVxuICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gICAgZmx1c2hUb1N0b3JlcygnJylcbiAgICByZWFzb25pbmdTdG9yZS5tYXJrQW5zd2VyUmVzZXQocGxhY2Vob2xkZXJJZClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ29tcGxldGUgPSAocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBjb25zdCBmaW5hbENvbnRlbnQgPSAocGF5bG9hZC5jb250ZW50IGFzIHN0cmluZykgfHwgYWNjdW11bGF0ZWRDb250ZW50XG4gICAgY29uc3Qgc291cmNlcyA9IHBheWxvYWQuc291cmNlcyB8fCBudWxsXG4gICAgY29uc3QgbWVtb3J5U2Vzc2lvbklkID0gKHBheWxvYWQubWVtb3J5X3Nlc3Npb25faWQgYXMgc3RyaW5nKSB8fCAnJ1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmF0dGFjaG1lbnRzKSA/IHBheWxvYWQuYXR0YWNobWVudHMgOiBudWxsXG4gICAgbGV0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5zdWdnZXN0X3JlcGx5KSkge1xuICAgICAgc3VnZ2VzdGlvbnMgPSBwYXlsb2FkLnN1Z2dlc3RfcmVwbHkgYXMgc3RyaW5nW11cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF5bG9hZC5zdWdnZXN0aW9ucykpIHtcbiAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0aW9ucyBhcyBzdHJpbmdbXVxuICAgIH1cbiAgICBjb25zdCBhZ2VudElkUmF3ID0gcGF5bG9hZC5hZ2VudF9pZCA/PyBwYXlsb2FkLmFnZW50SWRcbiAgICBjb25zdCBjb21wbGV0ZWRBZ2VudElkID0gYWdlbnRJZFJhdyAhPSBudWxsICYmIFN0cmluZyhhZ2VudElkUmF3KS50cmltKCkgIT09ICcnID8gU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSA6IG51bGxcbiAgICBjb25zdCBzdWJhZ2VudFJhdyA9IHBheWxvYWQuc3ViYWdlbnQgYXMgeyByZXNvbHZlZF9jb250ZXh0PzogdW5rbm93biB9IHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IHJlc29sdmVkQ29udGV4dCA9IHN1YmFnZW50UmF3Py5yZXNvbHZlZF9jb250ZXh0ID8/IG51bGxcbiAgICBjb25zdCByZWFzb25pbmcgPSAocGF5bG9hZC5yZWFzb25pbmcgYXMgUmVhc29uaW5nVHJhY2VQYXlsb2FkIHwgbnVsbCkgPz8gbnVsbFxuXG4gICAgcmVhc29uaW5nU3RvcmUuZmluaXNoKHBsYWNlaG9sZGVySWQsIHJlYXNvbmluZylcbiAgICBmbHVzaFBlbmRpbmcoKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY29tcGxldGUnKVxuXG4gICAgY29uc3QgZmluaXNoUGF5bG9hZDogU2Vzc2lvbkZpbmlzaFBheWxvYWQgPSB7XG4gICAgICBjb250ZW50OiBmaW5hbENvbnRlbnQsXG4gICAgICBzb3VyY2VzLFxuICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgYXR0YWNobWVudHMsXG4gICAgICBzdWdnZXN0aW9ucyxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQsXG4gICAgICByZXNvbHZlZENvbnRleHQsXG4gICAgICByZWFzb25pbmcsXG4gICAgfVxuICAgIGNhbGxiYWNrcy5vbkZpbmlzaFN0cmVhbT8uKGZpbmlzaFBheWxvYWQpXG5cbiAgICAvLyBFbCB0ZXh0byBlbiB2aXZvIE5PIHNlIGxpbXBpYSBhY8OhIGEgcHJvcMOzc2l0by4gRWwgcGxhY2Vob2xkZXIgc2UgdmEgY29uIGVsXG4gICAgLy8gYGRyb3BgIHF1ZSBoYWNlIGVsIGNvbnN1bWlkb3IsIHkgY29uIMOpbCBzdSBzdXNjcmlwY2nDs247IHZhY2lhcmxvIGFudGVzIGxvXG4gICAgLy8gZGVqYWJhIG1vbnRhZG8geSBzaW4gdGV4dG8gKGFsdHVyYSAwKSBkdXJhbnRlIH4yNW1zOiBlbCBmbGlja2VyIGRlIGZpbiBkZVxuICAgIC8vIHN0cmVhbS4gTm8gYWxjYW56YSBjb24gZGlmZXJpcmxvLCBwb3JxdWUgZXN0ZSBjbGVhciB2aWFqYSBlbiBTeW5jTGFuZVxuICAgIC8vIChzdG9yZSBleHRlcm5vKSB5IGVsIHN3YXAgZGUgbWVuc2FqZXMgZW4gRGVmYXVsdExhbmUsIGFzw60gcXVlIHNpZW1wcmUgc2VcbiAgICAvLyBjdWVsYSBlbiBlbCBtZWRpby4gRWwgc2xvdCBzZSBsaWJlcmEgZW4gZWwgcHLDs3hpbW8gYHN0YXJ0KClgIGRlIGxhIHNlc2nDs24sXG4gICAgLy8geSBlbiBzdG9wL2Vycm9yL2FwcHJvdmFsL2NhbWJpbyBkZSBzZXNpw7NuLCBxdWUgc8OtIGxsYW1hbiBgY2xlYXJgLlxuICB9XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKGFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgIGlmIChkb25lKSBicmVha1xuXG4gICAgICBpZiAoYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICByZWFkZXIuY2FuY2VsKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KVxuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcblxcbicpXG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSB8fCAnJ1xuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUudHJpbSgpID09PSAnJykgY29udGludWVcblxuICAgICAgICBjb25zdCBbZXZlbnRMaW5lLCBkYXRhTGluZV0gPSBsaW5lLnNwbGl0KCdcXG4nKVxuICAgICAgICBpZiAoIWV2ZW50TGluZSB8fCAhZGF0YUxpbmUpIGNvbnRpbnVlXG5cbiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnRMaW5lLnJlcGxhY2UoJ2V2ZW50OiAnLCAnJykudHJpbSgpXG4gICAgICAgIGNvbnN0IGRhdGFTdHIgPSBkYXRhTGluZS5yZXBsYWNlKCdkYXRhOiAnLCAnJykudHJpbSgpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyKVxuXG4gICAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RoaW5raW5nJzoge1xuICAgICAgICAgICAgICBjb25zdCB0aGlua2luZ0RlbHRhID0gdHlwZW9mIGRhdGEuZGVsdGEgPT09ICdzdHJpbmcnID8gZGF0YS5kZWx0YSA6ICcnXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5pID09PSAnbnVtYmVyJyAmJiB0aGlua2luZ0RlbHRhKSB7XG4gICAgICAgICAgICAgICAgcmVhc29uaW5nU3RvcmUuYXBwZW5kVGhpbmtpbmcocGxhY2Vob2xkZXJJZCwgZGF0YS5pLCB0aGlua2luZ0RlbHRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIE1pZW50cmFzIGR1cmEgXCJVc2FuZG8gU2tpbGxcIiBsb3MgZGVsdGFzIGRlIHRoaW5raW5nIG5vIHBpc2FuIGxhIGFjdGl2aWRhZC5cbiAgICAgICAgICAgICAgaWYgKCFpc1VzaW5nU2tpbGwpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGlua2luZ0FjdGl2aXR5KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lsbCBALW1lbmNpb25hZGEgKGFsIGFicmlyIGVsIHN0cmVhbSkgbyBsbGFtYWRhIGEgYGdldF9za2lsbGAuXG4gICAgICAgICAgICBjYXNlICd1c2luZ19za2lsbCc6XG4gICAgICAgICAgICAgIGlmICghaGFzU3RhcnRlZFdyaXRpbmcpIHtcbiAgICAgICAgICAgICAgICBpc1VzaW5nU2tpbGwgPSB0cnVlXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0VXNpbmdTa2lsbEFjdGl2aXR5KHQsIGRhdGEuc2tpbGwpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIC8vIEVsIGJhY2tlbmQgZGVzY2FydGEgbG8gZW1pdGlkbyB5IHJlaW5pY2lhIGxhIHJlc3B1ZXN0YSBkZXNkZSBjZXJvLlxuICAgICAgICAgICAgY2FzZSAnYW5zd2VyX3Jlc2V0JzpcbiAgICAgICAgICAgICAgY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQoKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdyZWFzb25pbmdfc3RlcCc6IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcFRvb2wgPSB0eXBlb2YgZGF0YS50b29sID09PSAnc3RyaW5nJyA/IGRhdGEudG9vbCA6ICcnXG4gICAgICAgICAgICAgIGNvbnN0IHN0ZXBUeXBlID0gdHlwZW9mIGRhdGEudHlwZSA9PT0gJ3N0cmluZycgPyBkYXRhLnR5cGUgOiAnJ1xuICAgICAgICAgICAgICBpZiAoc3RlcFRvb2wgJiYgc3RlcFR5cGUgIT09ICdoYW5kb2ZmJyAmJiBkYXRhLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gc3RlcFRvb2wgPT09ICdnZXRfc2tpbGwnXG4gICAgICAgICAgICAgICAgaWYgKGlzVXNpbmdTa2lsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gRWwgc3RlcCBkZSBgZ2V0X3NraWxsYCBsbGVnYSBqdXN0byBkZXNwdcOpcyBkZSBgdXNpbmdfc2tpbGxgOiBtYW50aWVuZSBlbCBub21icmUuXG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0VXNpbmdTa2lsbEFjdGl2aXR5KHQsIGRhdGEuYXJncz8ubmFtZSkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHNldFRoaW5raW5nQWN0aXZpdHkoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuaSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZWFzb25pbmdTdG9yZS5jYXB0dXJlTGVhZGluZ0Zyb21Cb2R5KHBsYWNlaG9sZGVySWQsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgICAgICAgICAgICByZWFzb25pbmdTdG9yZS5hcHBseVN0ZXAocGxhY2Vob2xkZXJJZCwgZGF0YSBhcyBSZWFzb25pbmdTdGVwUGF5bG9hZClcbiAgICAgICAgICAgICAgICBpZiAocmVhc29uaW5nU3RvcmUuc2hvdWxkQ2xlYXJTdHJlYW1Gb3JMZWFkaW5nKHBsYWNlaG9sZGVySWQsIGFjY3VtdWxhdGVkQ29udGVudCkpIHtcbiAgICAgICAgICAgICAgICAgIGNsZWFyU3RyZWFtTGlrZUFuc3dlclJlc2V0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAndG9rZW4nOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIGRhdGEuY29udGVudCA9PT0gJ3N0cmluZycgPyBkYXRhLmNvbnRlbnQgOiAnJ1xuICAgICAgICAgICAgICBlbnN1cmVXcml0aW5nU3RhcnRlZCgpXG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ2h1bmsoY2h1bmspXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ2NvbnRlbnQnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIGRhdGEuY29udGVudCA9PT0gJ3N0cmluZycgPyBkYXRhLmNvbnRlbnQgOiAnJ1xuICAgICAgICAgICAgICBlbnN1cmVXcml0aW5nU3RhcnRlZCgpXG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ2h1bmsoY2h1bmspXG4gICAgICAgICAgICAgIGlmIChpc0NvbXBsZXRlTGlrZVNzZVBheWxvYWQoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUNvbXBsZXRlKGRhdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgICAgIGlzVXNpbmdTa2lsbCA9IGZhbHNlXG4gICAgICAgICAgICAgIGlmIChkYXRhLm5vZGUgPT09ICdhZ2VudF90cmFuc2ZlcicgfHwgKGRhdGEubWVzc2FnZSAmJiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICBzZXRUaGlua2luZ0FjdGl2aXR5KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgIC8vIFByZWFwcm9iYWRvIChhdXRvLWFwcHJvdmUgbyBkZXRlY2Npw7NuIG1hbnVhbCk6IGVsIHN0cmVhbSBubyBzZSBjb3J0YSxcbiAgICAgICAgICAgICAgLy8gc2lndWUgZWplY3V0YW5kbyBsYXMgYWNjaW9uZXMgc2luIGVzcGVyYXIgZGVjaXNpw7NuIGRlbCB1c3VhcmlvLlxuICAgICAgICAgICAgICBjb25zdCBpc1ByZUFwcHJvdmVkID1cbiAgICAgICAgICAgICAgICBkYXRhLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgIGRhdGEuYXV0b19hcHByb3ZlZCA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgIGRhdGEuYXBwcm92YWxfc3RhdHVzID09PSAnYXBwcm92ZWQnXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIGlmICghaXNQcmVBcHByb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmZpbmlzaChwbGFjZWhvbGRlcklkLCAoZGF0YS5yZWFzb25pbmcgYXMgUmVhc29uaW5nVHJhY2VQYXlsb2FkIHwgbnVsbCkgPz8gbnVsbClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdhd2FpdGluZ19hcHByb3ZhbCcpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihkYXRhIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoaXNQcmVBcHByb3ZlZCAmJiBBcnJheS5pc0FycmF5KGRhdGEucGVuZGluZ19hY3Rpb25zKSAmJiBkYXRhLnBlbmRpbmdfYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0VGhpbmtpbmdBY3Rpdml0eSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTU0UgRXJyb3I6JywgZGF0YS5lcnJvcilcbiAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nKClcbiAgICAgICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgc3RvcmUoKS5zZXRFcnJvcihzZXNzaW9uSWQsIHsgdHlwZTogZGF0YS5lcnJvcj8udHlwZSwgbWVzc2FnZTogZGF0YS5lcnJvcj8ubWVzc2FnZSB9KVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oZGF0YS5lcnJvcj8udHlwZSwgZGF0YS5lcnJvcj8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmtub3duIFNTRSBldmVudCB0eXBlOicsIGV2ZW50VHlwZSlcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgZmx1c2hQZW5kaW5nKClcbiAgfVxufVxuXG4vKipcbiAqIE1hbmFnZXIgc2luZ2xldG9uIChtb2R1bGUtbGV2ZWwpIHF1ZSBjb3JyZSBOIHN0cmVhbXMgZGVsIG9yY2hlc3RyYXRvciBlblxuICogcGFyYWxlbG8sIHVubyBwb3IgYHNlc3Npb25JZGAuIFNvYnJldml2ZSBhIGNhbWJpb3MgZGUgdmlzdGEgeSBhbCBjaWVycmUgZGVsXG4gKiBtb2RhbDogbG9zIHN0cmVhbXMgc29sbyBzZSBjYW5jZWxhbiBjb24gc3RvcCBleHBsw61jaXRvIGRlbCB1c3VhcmlvIG8gYWxcbiAqIGNvbXBsZXRhci9lcnJvcmFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vzc2lvblN0cmVhbU1hbmFnZXIgPSB7XG4gIGlzQWN0aXZlOiBpc1N0cmVhbUFjdGl2ZSxcbiAgZ2V0QWN0aXZlQ291bnQ6IGdldEFjdGl2ZVN0cmVhbUNvdW50LFxuICBnZXRBY3RpdmVTZXNzaW9uSWRzOiAoKTogc3RyaW5nW10gPT4gQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSksXG5cbiAgYXN5bmMgc3RhcnRTdHJlYW0ocGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+IHtcbiAgICBlbnN1cmVTZXNzaW9uTm90aWZpY2F0aW9uc0luaXRpYWxpemVkKClcblxuICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCByZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICByZWFzb25pbmdTdG9yZS5zdGFydChwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcihyZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBwYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlc3VtZSBISVRMIChgY29udGludWUtdGhyZWFkYCkga2V5ZWQgcG9yIHNlc3Npb25JZCDigJQgbWlzbW8gbW90b3IgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRDb250aW51ZVN0cmVhbShwYXJhbXM6IFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGludWVSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGhpdGxFeGVjdXRpb25Db250ZXh0LCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgaWYgKGlzU3RyZWFtQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICdhbHJlYWR5X2FjdGl2ZScgfVxuICAgIH1cbiAgICBpZiAoZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnbGltaXQnIH1cbiAgICB9XG5cbiAgICBpZiAoaGl0bEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIHNlc3Npb25IaXRsQ29udGV4dC5zZXQoc2Vzc2lvbklkLCBoaXRsRXhlY3V0aW9uQ29udGV4dClcbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLihhZ2VudElkICE9IG51bGwgPyB7IGFnZW50SWQgfSA6IHt9KSxcbiAgICAgIC4uLihhZ2VudE5hbWUgIT0gbnVsbCA/IHsgYWdlbnROYW1lIH0gOiB7fSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCBoaXRsRXhlY3V0aW9uQ29udGV4dCA/PyBzZXNzaW9uSGl0bENvbnRleHQuZ2V0KHNlc3Npb25JZCkgPz8gdW5kZWZpbmVkKVxuICAgIClcblxuICAgIGNvbnN0IHNzZVBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgcmVxdWVzdDoge30gYXMgT3JjaGVzdHJhdG9yUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIHQsXG4gICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZChjb250aW51ZVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbnRpbnVlLXRocmVhZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG4gICAgICBhd2FpdCBwYXJzZVNlc3Npb25TU0UocmVzcG9uc2UsIGFjdGl2ZSwgc3NlUGFyYW1zKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWFjdGl2ZS5pc1N0b3BwZWQpIHtcbiAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnZXJyb3InKVxuICAgICAgICBjYWxsYmFja3Mub25FcnJvcj8uKClcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgICAgc2Vzc2lvbkhpdGxDb250ZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogUmVnZW5lcmEgbGEgcmVzcHVlc3RhIGRlIHVuIHR1cm5vIChgcmV0cnlfY29tcGxldGlvbmApIOKAlCBtaXNtbyBtb3RvciBTU0UgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRSZXRyeVN0cmVhbShwYXJhbXM6IFN0YXJ0UmV0cnlTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgcmV0cnlSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGFjdGl2aXR5T3B0aW9ucywgYWdlbnRJZCwgYWdlbnROYW1lIH0gPSBwYXJhbXNcblxuICAgIGlmIChpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiAnYWxyZWFkeV9hY3RpdmUnIH1cbiAgICB9XG4gICAgaWYgKGdldEFjdGl2ZVN0cmVhbUNvdW50KCkgPj0gTUFYX0NPTkNVUlJFTlRfU1RSRUFNUykge1xuICAgICAgcmV0dXJuIHsgc3RhcnRlZDogZmFsc2UsIHJlYXNvbjogJ2xpbWl0JyB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi4oYWdlbnRJZCAhPSBudWxsID8geyBhZ2VudElkIH0gOiB7fSksXG4gICAgICAuLi4oYWdlbnROYW1lICE9IG51bGwgPyB7IGFnZW50TmFtZSB9IDoge30pLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIGFjdGl2aXR5T3B0aW9ucyA/PyB7fSkpXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgYWN0aXZpdHlPcHRpb25zLFxuICAgICAgYWdlbnRJZCxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtYWlhLk9yY2hlc3RyYXRvci5yZXRyeUNvbXBsZXRpb24ocmV0cnlSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgbGV0IGRldGFpbDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGRldGFpbD86IHN0cmluZyB9XG4gICAgICAgICAgICBkZXRhaWwgPSB0eXBlb2YgZGF0YS5kZXRhaWwgPT09ICdzdHJpbmcnID8gZGF0YS5kZXRhaWwgOiB1bmRlZmluZWRcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGV0YWlsID09PSAnVHVybiBub3QgZm91bmQnKSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSwgcGxhY2Vob2xkZXJJZDogbnVsbCB9KVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICd0dXJuX25vdF9mb3VuZCcgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJldHJ5X2NvbXBsZXRpb24gZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGFyc2VTZXNzaW9uU1NFKHJlc3BvbnNlLCBhY3RpdmUsIHNzZVBhcmFtcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LigpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAvLyBFbCBwYXJjaWFsIHNlIHJlc2NhdGEgYW50ZXMgZGUgbGltcGlhcjogZWwgYmFja2VuZCBsbyBwZXJzaXN0ZSwgcGVybyBzaSBubyBsb1xuICAgIC8vIHBhc2Ftb3MgYWwgY2FsbGJhY2sgZGVzYXBhcmVjZSBkZSBwYW50YWxsYSBoYXN0YSBlbCBwcsOzeGltbyBmZXRjaCBkZSBsYSBzZXNpw7NuLlxuICAgIGNvbnN0IHBhcnRpYWxUZXh0ID0gc2Vzc2lvblN0cmVhbWluZ1RleHQuZ2V0U25hcHNob3Qoc2Vzc2lvbklkKS50ZXh0XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY2FuY2VsbGVkJylcbiAgICBjYWxsYmFja3M/Lm9uU3RvcD8uKHBhcnRpYWxUZXh0KVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzICE9PSAnY29tcGxldGUnKSB7XG4gICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICB9XG4gIH0sXG5cbiAgYWJvcnRBbGwoKSB7XG4gICAgQXJyYXkuZnJvbShhY3RpdmVTdHJlYW1zLmtleXMoKSkuZm9yRWFjaChzZXNzaW9uSWQgPT4gdGhpcy5hYm9ydFNpbGVudGx5KHNlc3Npb25JZCkpXG4gIH0sXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyxnQ0FBZ0MsUUFDM0Isb0NBQW9DO0FBRTNDLFNBQVNDLHdCQUF3QixFQUFFQyxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDekYsU0FBU0MsY0FBYyxRQUFRLCtCQUErQjtBQUU5RCxTQUFTQyxvQkFBb0IsUUFBUSx3QkFBd0I7QUFDN0QsU0FBU0MsZ0JBQWdCLFFBQVEsb0JBQW9CO0FBQ3JELFNBQVNDLHFDQUFxQyxRQUFRLHdCQUF3QjtBQUM5RSxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBc0I7O0FBT3pEOztBQXFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUMsc0JBQXNCLEdBQUcsQ0FBQztBQUV2QyxJQUFNQyxrQkFBa0IsR0FBRyxFQUFFO0FBRTdCLElBQU1DLGFBQWEsR0FBRyxJQUFJQyxHQUFHLENBQXVCLENBQUM7QUFFckQsSUFBTUMsS0FBSyxHQUFHLFNBQVJBLEtBQUtBLENBQUE7RUFBQSxPQUFTUCxnQkFBZ0IsQ0FBQ1EsUUFBUSxDQUFDLENBQUM7QUFBQTtBQUUvQyxJQUFNQyxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUlDLFNBQWlCO0VBQUEsT0FBY0wsYUFBYSxDQUFDTSxHQUFHLENBQUNELFNBQVMsQ0FBQztBQUFBO0FBRW5GLElBQU1FLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUE7RUFBQSxPQUFpQlAsYUFBYSxDQUFDUSxJQUFJO0FBQUE7QUFFN0QsSUFBTUMsZUFBZTtFQUFBLElBQUFDLElBQUEsR0FBQUMsaUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUFHLFNBQUFDLFFBQU9DLFFBQWtCLEVBQUVDLE1BQW9CLEVBQUVDLE1BQXlCO0lBQUEsSUFBQUMsY0FBQSxFQUFBQyxXQUFBLEVBQUFDLFlBQUEsRUFBQUMsa0JBQUEsRUFBQUMsWUFBQSxFQUFBQyxZQUFBO0lBQUEsSUFBQWxCLFNBQUEsRUFBQW1CLGFBQUEsRUFBQUMsU0FBQSxFQUFBQyxDQUFBLEVBQUFDLGNBQUEsRUFBQUMsYUFBQSxFQUFBQyxhQUFBLEVBQUFDLGFBQUEsRUFBQUMsWUFBQSxFQUFBQyxNQUFBLEVBQUFDLE9BQUEsRUFBQUMsTUFBQSxFQUFBQyxrQkFBQSxFQUFBQyxpQkFBQSxFQUFBQyxZQUFBLEVBQUFDLG1CQUFBLEVBQUFDLG9CQUFBLEVBQUFDLGdCQUFBLEVBQUFDLDBCQUFBLEVBQUFDLG1CQUFBLEVBQUFDLGtCQUFBLEVBQUFDLElBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLFNBQUEsRUFBQUMsS0FBQSxFQUFBQyxJQUFBLEVBQUFDLFdBQUEsRUFBQUMsWUFBQSxFQUFBQyxTQUFBLEVBQUFDLFFBQUEsRUFBQUMsU0FBQSxFQUFBQyxPQUFBLEVBQUFDLElBQUEsRUFBQUMsYUFBQSxFQUFBQyxRQUFBLEVBQUFDLFFBQUEsRUFBQUMsVUFBQSxFQUFBQyxLQUFBLEVBQUFDLE1BQUEsRUFBQUMscUJBQUEsRUFBQUMsYUFBQSxFQUFBQyxLQUFBLEVBQUFDLEVBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQXhELG1CQUFBLENBQUF5RCxJQUFBLFdBQUFDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQUUsSUFBQTtRQUFBO1VBQ3hGbkUsU0FBUyxHQUFrQ1ksTUFBTSxDQUFqRFosU0FBUyxFQUFFbUIsYUFBYSxHQUFtQlAsTUFBTSxDQUF0Q08sYUFBYSxFQUFFQyxTQUFTLEdBQVFSLE1BQU0sQ0FBdkJRLFNBQVMsRUFBRUMsQ0FBQyxHQUFLVCxNQUFNLENBQVpTLENBQUM7VUFFMUNDLGNBQTZCLEdBQUcsSUFBSTtVQUNwQ0MsYUFBNEIsR0FBRyxJQUFJO1VBRWpDQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWFBLENBQUk0QyxPQUFlLEVBQUs7WUFBQSxJQUFBQyxxQkFBQTtZQUN6Q2hGLG9CQUFvQixDQUFDaUYsT0FBTyxDQUFDdEUsU0FBUyxFQUFFbUIsYUFBYSxFQUFFaUQsT0FBTyxDQUFDO1lBQy9ELENBQUFDLHFCQUFBLEdBQUFqRCxTQUFTLENBQUNtRCxjQUFjLGNBQUFGLHFCQUFBLGVBQXhCQSxxQkFBQSxDQUFBRyxJQUFBLENBQUFwRCxTQUFTLEVBQWtCZ0QsT0FBTyxDQUFDO1VBQ3JDLENBQUM7VUFFSzNDLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBSTJDLE9BQWUsRUFBSztZQUN6QzlDLGNBQWMsR0FBRzhDLE9BQU87WUFDeEIsSUFBSTdDLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDM0JBLGFBQWEsR0FBR2tELE1BQU0sQ0FBQ0MsVUFBVSxDQUFDLFlBQU07Y0FDdENuRCxhQUFhLEdBQUcsSUFBSTtjQUNwQixJQUFJRCxjQUFjLElBQUksSUFBSSxFQUFFO2dCQUMxQixJQUFNcUQsTUFBTSxHQUFHckQsY0FBYztnQkFDN0JBLGNBQWMsR0FBRyxJQUFJO2dCQUNyQkUsYUFBYSxDQUFDbUQsTUFBTSxDQUFDO2NBQ3ZCO1lBQ0YsQ0FBQyxFQUFFakYsa0JBQWtCLENBQUM7VUFDeEIsQ0FBQztVQUVLZ0MsWUFBWSxHQUFHLFNBQWZBLFlBQVlBLENBQUEsRUFBUztZQUN6QixJQUFJSCxhQUFhLElBQUksSUFBSSxFQUFFO2NBQ3pCa0QsTUFBTSxDQUFDRyxZQUFZLENBQUNyRCxhQUFhLENBQUM7Y0FDbENBLGFBQWEsR0FBRyxJQUFJO1lBQ3RCO1lBQ0EsSUFBSUQsY0FBYyxJQUFJLElBQUksRUFBRTtjQUMxQixJQUFNcUQsTUFBTSxHQUFHckQsY0FBYztjQUM3QkEsY0FBYyxHQUFHLElBQUk7Y0FDckJFLGFBQWEsQ0FBQ21ELE1BQU0sQ0FBQztZQUN2QjtVQUNGLENBQUM7VUFFS2hELE1BQU0sSUFBQWQsY0FBQSxHQUFHSCxRQUFRLENBQUNtRSxJQUFJLGNBQUFoRSxjQUFBLHVCQUFiQSxjQUFBLENBQWVpRSxTQUFTLENBQUMsQ0FBQztVQUFBLElBQ3BDbkQsTUFBTTtZQUFBc0MsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE1BQ0gsSUFBSVksS0FBSyxDQUFDLHFCQUFxQixDQUFDO1FBQUE7VUFHbENuRCxPQUFPLEdBQUcsSUFBSW9ELFdBQVcsQ0FBQyxDQUFDO1VBQzdCbkQsTUFBTSxHQUFHLEVBQUU7VUFDWEMsa0JBQWtCLEdBQUcsRUFBRTtVQUN2QkMsaUJBQWlCLEdBQUcsS0FBSyxFQUM3QjtVQUNBO1VBQ0lDLFlBQVksR0FBRyxLQUFLO1VBRWxCQyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFBLEVBQVM7WUFBQSxJQUFBZ0QsY0FBQTtZQUNoQyxJQUFNQyxnQkFBZ0IsR0FBR3BHLHlCQUF5QixDQUFDdUMsQ0FBQyxDQUFDO1lBQ3JELElBQU04RCxPQUFPLElBQUFGLGNBQUEsR0FBR3BGLEtBQUssQ0FBQyxDQUFDLENBQUN1RixPQUFPLENBQUNwRixTQUFTLENBQUMsY0FBQWlGLGNBQUEsdUJBQTFCQSxjQUFBLENBQTRCSSxjQUFjO1lBQzFELElBQUksQ0FBQUYsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVHLEtBQUssTUFBSyxVQUFVLElBQUlILE9BQU8sQ0FBQ0ksT0FBTyxLQUFLTCxnQkFBZ0IsQ0FBQ0ssT0FBTyxFQUFFO1lBQ25GMUYsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtjQUFFeUYsU0FBUyxFQUFFO1lBQUssQ0FBQyxDQUFDO1lBQ2pENUYsS0FBSyxDQUFDLENBQUMsQ0FBQzZGLFNBQVMsQ0FBQzFGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeENILEtBQUssQ0FBQyxDQUFDLENBQUM4RixXQUFXLENBQUMzRixTQUFTLEVBQUVrRixnQkFBZ0IsQ0FBQztVQUNsRCxDQUFDO1VBRUtoRCxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFBLEVBQVM7WUFBQSxJQUFBMEQsZUFBQTtZQUNqQztZQUNBNUQsWUFBWSxHQUFHLEtBQUs7WUFDcEIsSUFBSSxDQUFDRCxpQkFBaUIsRUFBRTtjQUFBLElBQUE4RCxxQkFBQTtjQUN0QjlELGlCQUFpQixHQUFHLElBQUk7Y0FDeEJsQyxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFLElBQUk7Z0JBQUVLLFNBQVMsRUFBRTtjQUFLLENBQUMsQ0FBQztjQUNsRSxDQUFBRCxxQkFBQSxHQUFBekUsU0FBUyxDQUFDMkUsY0FBYyxjQUFBRixxQkFBQSxlQUF4QkEscUJBQUEsQ0FBQXJCLElBQUEsQ0FBQXBELFNBQTJCLENBQUM7WUFDOUI7WUFDQSxJQUFNK0QsT0FBTyxJQUFBUyxlQUFBLEdBQUcvRixLQUFLLENBQUMsQ0FBQyxDQUFDdUYsT0FBTyxDQUFDcEYsU0FBUyxDQUFDLGNBQUE0RixlQUFBLHVCQUExQkEsZUFBQSxDQUE0QlAsY0FBYztZQUMxRCxJQUFJLENBQUFGLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFRyxLQUFLLE1BQUssU0FBUyxFQUFFO2NBQ2hDekYsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtnQkFBRXlGLFNBQVMsRUFBRSxJQUFJO2dCQUFFSyxTQUFTLEVBQUU7Y0FBSyxDQUFDLENBQUM7Y0FDbEVqRyxLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLFNBQVMsQ0FBQztjQUN2Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFdBQVcsQ0FBQzNGLFNBQVMsRUFBRWhCLHdCQUF3QixDQUFDcUMsQ0FBQyxDQUFDLENBQUM7WUFDN0Q7VUFDRixDQUFDO1VBRUtjLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQUlxQixLQUFhLEVBQUs7WUFDMUMsSUFBSSxDQUFDQSxLQUFLLEVBQUU7WUFDWjFCLGtCQUFrQixHQUFHM0MsZ0JBQWdCLENBQUMyQyxrQkFBa0IsRUFBRTBCLEtBQUssQ0FBQztZQUNoRXBFLGNBQWMsQ0FBQzRHLGlCQUFpQixDQUFDN0UsYUFBYSxFQUFFVyxrQkFBa0IsQ0FBQztZQUNuRUwsYUFBYSxDQUFDSyxrQkFBa0IsQ0FBQztVQUNuQyxDQUFDO1VBRUtNLDBCQUEwQixHQUFHLFNBQTdCQSwwQkFBMEJBLENBQUEsRUFBUztZQUN2QyxJQUFJYixhQUFhLElBQUksSUFBSSxFQUFFO2NBQ3pCa0QsTUFBTSxDQUFDRyxZQUFZLENBQUNyRCxhQUFhLENBQUM7Y0FDbENBLGFBQWEsR0FBRyxJQUFJO1lBQ3RCO1lBQ0FELGNBQWMsR0FBRyxJQUFJO1lBQ3JCUSxrQkFBa0IsR0FBRyxFQUFFO1lBQ3ZCTixhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2pCcEMsY0FBYyxDQUFDNkcsZUFBZSxDQUFDOUUsYUFBYSxDQUFDO1VBQy9DLENBQUM7VUFFS2tCLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQUk2RCxPQUFnQyxFQUFLO1lBQUEsSUFBQUMsaUJBQUEsRUFBQUMscUJBQUEsRUFBQUMsS0FBQSxFQUFBQyxxQkFBQTtZQUNoRSxJQUFNQyxZQUFZLEdBQUlMLE9BQU8sQ0FBQzlCLE9BQU8sSUFBZXRDLGtCQUFrQjtZQUN0RSxJQUFNMEUsT0FBTyxHQUFHTixPQUFPLENBQUNNLE9BQU8sSUFBSSxJQUFJO1lBQ3ZDLElBQU1DLGVBQWUsR0FBSVAsT0FBTyxDQUFDUSxpQkFBaUIsSUFBZSxFQUFFO1lBQ25FLElBQU1DLFdBQVcsR0FBR0MsS0FBSyxDQUFDQyxPQUFPLENBQUNYLE9BQU8sQ0FBQ1MsV0FBVyxDQUFDLEdBQUdULE9BQU8sQ0FBQ1MsV0FBVyxHQUFHLElBQUk7WUFDbkYsSUFBSUcsV0FBNEIsR0FBRyxJQUFJO1lBQ3ZDLElBQUlGLEtBQUssQ0FBQ0MsT0FBTyxDQUFDWCxPQUFPLENBQUNhLGFBQWEsQ0FBQyxFQUFFO2NBQ3hDRCxXQUFXLEdBQUdaLE9BQU8sQ0FBQ2EsYUFBeUI7WUFDakQsQ0FBQyxNQUFNLElBQUlILEtBQUssQ0FBQ0MsT0FBTyxDQUFDWCxPQUFPLENBQUNZLFdBQVcsQ0FBQyxFQUFFO2NBQzdDQSxXQUFXLEdBQUdaLE9BQU8sQ0FBQ1ksV0FBdUI7WUFDL0M7WUFDQSxJQUFNRSxVQUFVLElBQUFiLGlCQUFBLEdBQUdELE9BQU8sQ0FBQ2UsUUFBUSxjQUFBZCxpQkFBQSxjQUFBQSxpQkFBQSxHQUFJRCxPQUFPLENBQUNnQixPQUFPO1lBQ3RELElBQU1DLGdCQUFnQixHQUFHSCxVQUFVLElBQUksSUFBSSxJQUFJSSxNQUFNLENBQUNKLFVBQVUsQ0FBQyxDQUFDSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBR0QsTUFBTSxDQUFDSixVQUFVLENBQUMsQ0FBQ0ssSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJO1lBQ2xILElBQU1DLFdBQVcsR0FBR3BCLE9BQU8sQ0FBQ3FCLFFBQTZEO1lBQ3pGLElBQU1DLGVBQWUsSUFBQXBCLHFCQUFBLEdBQUdrQixXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUcsZ0JBQWdCLGNBQUFyQixxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLElBQUk7WUFDN0QsSUFBTXNCLFNBQVMsSUFBQXJCLEtBQUEsR0FBSUgsT0FBTyxDQUFDd0IsU0FBUyxjQUFBckIsS0FBQSxjQUFBQSxLQUFBLEdBQXFDLElBQUk7WUFFN0VqSCxjQUFjLENBQUN1SSxNQUFNLENBQUN4RyxhQUFhLEVBQUV1RyxTQUFTLENBQUM7WUFDL0NoRyxZQUFZLENBQUMsQ0FBQztZQUNkN0IsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtjQUFFeUYsU0FBUyxFQUFFLEtBQUs7Y0FBRUssU0FBUyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1lBQ3BFakcsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFdBQVcsQ0FBQzNGLFNBQVMsRUFBRSxJQUFJLENBQUM7WUFDcENILEtBQUssQ0FBQyxDQUFDLENBQUM2RixTQUFTLENBQUMxRixTQUFTLEVBQUUsVUFBVSxDQUFDO1lBRXhDLElBQU00SCxhQUFtQyxHQUFHO2NBQzFDeEQsT0FBTyxFQUFFbUMsWUFBWTtjQUNyQkMsT0FBTyxFQUFQQSxPQUFPO2NBQ1BDLGVBQWUsRUFBZkEsZUFBZTtjQUNmRSxXQUFXLEVBQVhBLFdBQVc7Y0FDWEcsV0FBVyxFQUFYQSxXQUFXO2NBQ1hLLGdCQUFnQixFQUFoQkEsZ0JBQWdCO2NBQ2hCSyxlQUFlLEVBQWZBLGVBQWU7Y0FDZkUsU0FBUyxFQUFUQTtZQUNGLENBQUM7WUFDRCxDQUFBcEIscUJBQUEsR0FBQWxGLFNBQVMsQ0FBQ3lHLGNBQWMsY0FBQXZCLHFCQUFBLGVBQXhCQSxxQkFBQSxDQUFBOUIsSUFBQSxDQUFBcEQsU0FBUyxFQUFrQndHLGFBQWEsQ0FBQzs7WUFFekM7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7VUFDRixDQUFDO1VBQUEzRCxRQUFBLENBQUFDLElBQUE7UUFBQTtVQUFBLEtBR1EsSUFBSTtZQUFBRCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsS0FDTHhELE1BQU0sQ0FBQ21ILFNBQVM7WUFBQTdELFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDbEJ4QyxNQUFNLENBQUNvRyxNQUFNLENBQUMsQ0FBQztVQUFBLE9BQUE5RCxRQUFBLENBQUErRCxNQUFBO1FBQUE7VUFBQS9ELFFBQUEsQ0FBQUUsSUFBQTtVQUFBLE9BSWF4QyxNQUFNLENBQUNzRyxJQUFJLENBQUMsQ0FBQztRQUFBO1VBQUEzRixrQkFBQSxHQUFBMkIsUUFBQSxDQUFBaUUsSUFBQTtVQUFuQzNGLElBQUksR0FBQUQsa0JBQUEsQ0FBSkMsSUFBSTtVQUFFQyxLQUFLLEdBQUFGLGtCQUFBLENBQUxFLEtBQUs7VUFBQSxLQUNmRCxJQUFJO1lBQUEwQixRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBK0QsTUFBQTtRQUFBO1VBQUEsS0FFSnJILE1BQU0sQ0FBQ21ILFNBQVM7WUFBQTdELFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDbEJ4QyxNQUFNLENBQUNvRyxNQUFNLENBQUMsQ0FBQztVQUFBLE9BQUE5RCxRQUFBLENBQUErRCxNQUFBO1FBQUE7VUFJakJuRyxNQUFNLElBQUlELE9BQU8sQ0FBQ3VHLE1BQU0sQ0FBQzNGLEtBQUssRUFBRTtZQUFFNEYsTUFBTSxFQUFFO1VBQUssQ0FBQyxDQUFDO1VBQzNDM0YsS0FBSyxHQUFHWixNQUFNLENBQUN3RyxLQUFLLENBQUMsTUFBTSxDQUFDO1VBQ2xDeEcsTUFBTSxHQUFHWSxLQUFLLENBQUM2RixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUU7VUFBQTVGLFNBQUEsR0FBQTZGLDBCQUFBLENBRVA5RixLQUFLO1VBQUF3QixRQUFBLENBQUFDLElBQUE7VUFBQXhCLFNBQUEsQ0FBQThGLENBQUE7UUFBQTtVQUFBLEtBQUE3RixLQUFBLEdBQUFELFNBQUEsQ0FBQStGLENBQUEsSUFBQWxHLElBQUE7WUFBQTBCLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBYnZCLElBQUksR0FBQUQsS0FBQSxDQUFBSCxLQUFBO1VBQUEsTUFDVEksSUFBSSxDQUFDeUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQUFwRCxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBK0QsTUFBQTtRQUFBO1VBQUFuRixXQUFBLEdBRVFELElBQUksQ0FBQ3lGLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQXZGLFlBQUEsR0FBQTRGLGNBQUEsQ0FBQTdGLFdBQUEsTUFBdkNFLFNBQVMsR0FBQUQsWUFBQSxLQUFFRSxRQUFRLEdBQUFGLFlBQUE7VUFBQSxNQUN0QixDQUFDQyxTQUFTLElBQUksQ0FBQ0MsUUFBUTtZQUFBaUIsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFGLFFBQUEsQ0FBQStELE1BQUE7UUFBQTtVQUVyQi9FLFNBQVMsR0FBR0YsU0FBUyxDQUFDNEYsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQ3RCLElBQUksQ0FBQyxDQUFDO1VBQ25EbkUsT0FBTyxHQUFHRixRQUFRLENBQUMyRixPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDdEIsSUFBSSxDQUFDLENBQUM7VUFBQXBELFFBQUEsQ0FBQUMsSUFBQTtVQUc3Q2YsSUFBSSxHQUFHeUYsSUFBSSxDQUFDQyxLQUFLLENBQUMzRixPQUFPLENBQUM7VUFBQVcsRUFBQSxHQUV4QlosU0FBUztVQUFBZ0IsUUFBQSxDQUFBRSxJQUFBLEdBQUFOLEVBQUEsS0FDVixVQUFVLFFBQUFBLEVBQUEsS0FhVixhQUFhLFFBQUFBLEVBQUEsS0FVYixjQUFjLFFBQUFBLEVBQUEsS0FJZCxnQkFBZ0IsUUFBQUEsRUFBQSxLQXdCaEIsT0FBTyxRQUFBQSxFQUFBLEtBT1AsU0FBUyxRQUFBQSxFQUFBLEtBVVQsTUFBTSxRQUFBQSxFQUFBLEtBT04sVUFBVSxRQUFBQSxFQUFBLEtBSVYsbUJBQW1CLFFBQUFBLEVBQUEsS0F1Qm5CLE9BQU87VUFBQTtRQUFBO1VBckdKVCxhQUFhLEdBQUcsT0FBT0QsSUFBSSxDQUFDMkYsS0FBSyxLQUFLLFFBQVEsR0FBRzNGLElBQUksQ0FBQzJGLEtBQUssR0FBRyxFQUFFO1VBQ3RFLElBQUksT0FBTzNGLElBQUksQ0FBQzRGLENBQUMsS0FBSyxRQUFRLElBQUkzRixhQUFhLEVBQUU7WUFDL0NoRSxjQUFjLENBQUM0SixjQUFjLENBQUM3SCxhQUFhLEVBQUVnQyxJQUFJLENBQUM0RixDQUFDLEVBQUUzRixhQUFhLENBQUM7VUFDckU7VUFDQTtVQUNBLElBQUksQ0FBQ3BCLFlBQVksRUFBRTtZQUNqQkMsbUJBQW1CLENBQUMsQ0FBQztVQUN2QjtVQUFDLE9BQUFnQyxRQUFBLENBQUErRCxNQUFBO1FBQUE7VUFNRCxJQUFJLENBQUNqRyxpQkFBaUIsRUFBRTtZQUN0QkMsWUFBWSxHQUFHLElBQUk7WUFDbkJuQyxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2NBQUV5RixTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDakQ1RixLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFdBQVcsQ0FBQzNGLFNBQVMsRUFBRWpCLHFCQUFxQixDQUFDc0MsQ0FBQyxFQUFFOEIsSUFBSSxDQUFDOEYsS0FBSyxDQUFDLENBQUM7VUFDdEU7VUFBQyxPQUFBaEYsUUFBQSxDQUFBK0QsTUFBQTtRQUFBO1VBS0Q1RiwwQkFBMEIsQ0FBQyxDQUFDO1VBQUEsT0FBQTZCLFFBQUEsQ0FBQStELE1BQUE7UUFBQTtVQUl0QjNFLFFBQVEsR0FBRyxPQUFPRixJQUFJLENBQUMrRixJQUFJLEtBQUssUUFBUSxHQUFHL0YsSUFBSSxDQUFDK0YsSUFBSSxHQUFHLEVBQUU7VUFDekQ1RixRQUFRLEdBQUcsT0FBT0gsSUFBSSxDQUFDZ0csSUFBSSxLQUFLLFFBQVEsR0FBR2hHLElBQUksQ0FBQ2dHLElBQUksR0FBRyxFQUFFO1VBQy9ELElBQUk5RixRQUFRLElBQUlDLFFBQVEsS0FBSyxTQUFTLElBQUlILElBQUksQ0FBQ2lHLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDbkVwSCxZQUFZLEdBQUdxQixRQUFRLEtBQUssV0FBVztZQUN2QyxJQUFJckIsWUFBWSxFQUFFO2NBQ2hCO2NBQ0FuQyxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFO2NBQUssQ0FBQyxDQUFDO2NBQ2pENUYsS0FBSyxDQUFDLENBQUMsQ0FBQzZGLFNBQVMsQ0FBQzFGLFNBQVMsRUFBRSxVQUFVLENBQUM7Y0FDeENILEtBQUssQ0FBQyxDQUFDLENBQUM4RixXQUFXLENBQUMzRixTQUFTLEVBQUVqQixxQkFBcUIsQ0FBQ3NDLENBQUMsR0FBQWtDLFVBQUEsR0FBRUosSUFBSSxDQUFDa0csSUFBSSxjQUFBOUYsVUFBQSx1QkFBVEEsVUFBQSxDQUFXK0YsSUFBSSxDQUFDLENBQUM7WUFDM0UsQ0FBQyxNQUFNO2NBQ0xySCxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZCO1VBQ0Y7VUFDQSxJQUFJLE9BQU9rQixJQUFJLENBQUM0RixDQUFDLEtBQUssUUFBUSxFQUFFO1lBQzlCM0osY0FBYyxDQUFDbUssc0JBQXNCLENBQUNwSSxhQUFhLEVBQUVXLGtCQUFrQixDQUFDO1lBQ3hFMUMsY0FBYyxDQUFDb0ssU0FBUyxDQUFDckksYUFBYSxFQUFFZ0MsSUFBNEIsQ0FBQztZQUNyRSxJQUFJL0QsY0FBYyxDQUFDcUssMkJBQTJCLENBQUN0SSxhQUFhLEVBQUVXLGtCQUFrQixDQUFDLEVBQUU7Y0FDakZNLDBCQUEwQixDQUFDLENBQUM7WUFDOUI7VUFDRjtVQUFDLE9BQUE2QixRQUFBLENBQUErRCxNQUFBO1FBQUE7VUFLS3hFLEtBQUssR0FBRyxPQUFPTCxJQUFJLENBQUNpQixPQUFPLEtBQUssUUFBUSxHQUFHakIsSUFBSSxDQUFDaUIsT0FBTyxHQUFHLEVBQUU7VUFDbEVsQyxvQkFBb0IsQ0FBQyxDQUFDO1VBQ3RCQyxnQkFBZ0IsQ0FBQ3FCLEtBQUssQ0FBQztVQUFBLE9BQUFTLFFBQUEsQ0FBQStELE1BQUE7UUFBQTtVQUtqQnhFLE1BQUssR0FBRyxPQUFPTCxJQUFJLENBQUNpQixPQUFPLEtBQUssUUFBUSxHQUFHakIsSUFBSSxDQUFDaUIsT0FBTyxHQUFHLEVBQUU7VUFDbEVsQyxvQkFBb0IsQ0FBQyxDQUFDO1VBQ3RCQyxnQkFBZ0IsQ0FBQ3FCLE1BQUssQ0FBQztVQUN2QixJQUFJdEUsd0JBQXdCLENBQUNpRSxJQUFJLENBQUMsRUFBRTtZQUNsQ2QsbUJBQW1CLENBQUNjLElBQUksQ0FBQztVQUMzQjtVQUFDLE9BQUFjLFFBQUEsQ0FBQStELE1BQUE7UUFBQTtVQUtEaEcsWUFBWSxHQUFHLEtBQUs7VUFDcEIsSUFBSW1CLElBQUksQ0FBQ3VHLElBQUksS0FBSyxnQkFBZ0IsSUFBS3ZHLElBQUksQ0FBQ29DLE9BQU8sSUFBSSxPQUFPcEMsSUFBSSxDQUFDb0MsT0FBTyxLQUFLLFFBQVMsRUFBRTtZQUN4RnRELG1CQUFtQixDQUFDLENBQUM7VUFDdkI7VUFBQyxPQUFBZ0MsUUFBQSxDQUFBK0QsTUFBQTtRQUFBO1VBSUQzRixtQkFBbUIsQ0FBQ2MsSUFBSSxDQUFDO1VBQUEsT0FBQWMsUUFBQSxDQUFBK0QsTUFBQTtRQUFBO1VBSXpCdEcsWUFBWSxDQUFDLENBQUM7VUFDZDtVQUNBO1VBQ01pQyxhQUFhLEdBQ2pCUixJQUFJLENBQUN3Ryx3QkFBd0IsS0FBSyxJQUFJLElBQ3RDeEcsSUFBSSxDQUFDeUcsYUFBYSxLQUFLLElBQUksSUFDM0J6RyxJQUFJLENBQUMwRyxlQUFlLEtBQUssVUFBVTtVQUNyQ2hLLEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUU7WUFBRThGLFNBQVMsRUFBRTtVQUFNLENBQUMsQ0FBQztVQUNsRCxJQUFJLENBQUNuQyxhQUFhLEVBQUU7WUFDbEJ2RSxjQUFjLENBQUN1SSxNQUFNLENBQUN4RyxhQUFhLEdBQUF5QyxLQUFBLEdBQUdULElBQUksQ0FBQ3VFLFNBQVMsY0FBQTlELEtBQUEsY0FBQUEsS0FBQSxHQUFxQyxJQUFJLENBQUM7WUFDOUYvRCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2NBQUV5RixTQUFTLEVBQUU7WUFBTSxDQUFDLENBQUM7WUFDbERwRyxvQkFBb0IsQ0FBQ3lLLEtBQUssQ0FBQzlKLFNBQVMsQ0FBQztZQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFdBQVcsQ0FBQzNGLFNBQVMsRUFBRSxJQUFJLENBQUM7VUFDdEM7VUFDQUgsS0FBSyxDQUFDLENBQUMsQ0FBQzZGLFNBQVMsQ0FBQzFGLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQztVQUNqRCxDQUFBMEQscUJBQUEsR0FBQXRDLFNBQVMsQ0FBQzJJLGtCQUFrQixjQUFBckcscUJBQUEsZUFBNUJBLHFCQUFBLENBQUFjLElBQUEsQ0FBQXBELFNBQVMsRUFBc0IrQixJQUFJLEVBQXFCckIsa0JBQWtCLENBQUM7VUFDM0UsSUFBSTZCLGFBQWEsSUFBSWlELEtBQUssQ0FBQ0MsT0FBTyxDQUFDMUQsSUFBSSxDQUFDNkcsZUFBZSxDQUFDLElBQUk3RyxJQUFJLENBQUM2RyxlQUFlLENBQUNDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0ZoSSxtQkFBbUIsQ0FBQyxDQUFDO1VBQ3ZCO1VBQUMsT0FBQWdDLFFBQUEsQ0FBQStELE1BQUE7UUFBQTtVQUtEa0MsT0FBTyxDQUFDQyxLQUFLLENBQUMsWUFBWSxFQUFFaEgsSUFBSSxDQUFDZ0gsS0FBSyxDQUFDO1VBQ3ZDekksWUFBWSxDQUFDLENBQUM7VUFDZHJDLG9CQUFvQixDQUFDeUssS0FBSyxDQUFDOUosU0FBUyxDQUFDO1VBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO1lBQUV5RixTQUFTLEVBQUUsS0FBSztZQUFFSyxTQUFTLEVBQUU7VUFBTSxDQUFDLENBQUM7VUFDcEVqRyxLQUFLLENBQUMsQ0FBQyxDQUFDOEYsV0FBVyxDQUFDM0YsU0FBUyxFQUFFLElBQUksQ0FBQztVQUNwQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQ3VLLFFBQVEsQ0FBQ3BLLFNBQVMsRUFBRTtZQUFFbUosSUFBSSxHQUFBckksV0FBQSxHQUFFcUMsSUFBSSxDQUFDZ0gsS0FBSyxjQUFBckosV0FBQSx1QkFBVkEsV0FBQSxDQUFZcUksSUFBSTtZQUFFNUQsT0FBTyxHQUFBeEUsWUFBQSxHQUFFb0MsSUFBSSxDQUFDZ0gsS0FBSyxjQUFBcEosWUFBQSx1QkFBVkEsWUFBQSxDQUFZd0U7VUFBUSxDQUFDLENBQUM7VUFDckYxRixLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLE9BQU8sQ0FBQztVQUNyQyxDQUFBZ0Isa0JBQUEsR0FBQUksU0FBUyxDQUFDaUosT0FBTyxjQUFBckosa0JBQUEsZUFBakJBLGtCQUFBLENBQUF3RCxJQUFBLENBQUFwRCxTQUFTLEdBQUFILFlBQUEsR0FBV2tDLElBQUksQ0FBQ2dILEtBQUssY0FBQWxKLFlBQUEsdUJBQVZBLFlBQUEsQ0FBWWtJLElBQUksR0FBQWpJLFlBQUEsR0FBRWlDLElBQUksQ0FBQ2dILEtBQUssY0FBQWpKLFlBQUEsdUJBQVZBLFlBQUEsQ0FBWXFFLE9BQU8sQ0FBQztVQUFBLE9BQUF0QixRQUFBLENBQUErRCxNQUFBO1FBQUE7VUFJMURrQyxPQUFPLENBQUNJLElBQUksQ0FBQyx5QkFBeUIsRUFBRXJILFNBQVMsQ0FBQztVQUFBLE9BQUFnQixRQUFBLENBQUErRCxNQUFBO1FBQUE7VUFBQS9ELFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQUYsUUFBQSxDQUFBQyxJQUFBO1VBQUFKLEdBQUEsR0FBQUcsUUFBQTtVQUl0RGlHLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLHlCQUF5QixFQUFBckcsR0FBQSxFQUFjWixPQUFPLENBQUM7UUFBQTtVQUFBZSxRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQUYsUUFBQSxDQUFBQyxJQUFBO1VBQUFILEdBQUEsR0FBQUUsUUFBQTtVQUFBdkIsU0FBQSxDQUFBNkgsQ0FBQSxDQUFBeEcsR0FBQTtRQUFBO1VBQUFFLFFBQUEsQ0FBQUMsSUFBQTtVQUFBeEIsU0FBQSxDQUFBOEgsQ0FBQTtVQUFBLE9BQUF2RyxRQUFBLENBQUEwRCxNQUFBO1FBQUE7VUFBQTFELFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQUYsUUFBQSxDQUFBQyxJQUFBO1VBS25FeEMsWUFBWSxDQUFDLENBQUM7VUFBQSxPQUFBdUMsUUFBQSxDQUFBMEQsTUFBQTtRQUFBO1FBQUE7VUFBQSxPQUFBMUQsUUFBQSxDQUFBd0csSUFBQTtNQUFBO0lBQUEsR0FBQWhLLE9BQUE7RUFBQSxDQUVqQjtFQUFBLGdCQXJTS0wsZUFBZUEsQ0FBQXNLLEVBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQXZLLElBQUEsQ0FBQXdLLEtBQUEsT0FBQUMsU0FBQTtFQUFBO0FBQUEsR0FxU3BCOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUMsb0JBQW9CLEdBQUc7RUFDbENDLFFBQVEsRUFBRWpMLGNBQWM7RUFDeEJrTCxjQUFjLEVBQUUvSyxvQkFBb0I7RUFDcENnTCxtQkFBbUIsRUFBRSxTQUFyQkEsbUJBQW1CQSxDQUFBO0lBQUEsT0FBa0J0RSxLQUFLLENBQUN1RSxJQUFJLENBQUN4TCxhQUFhLENBQUN5TCxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQUE7RUFFL0RDLFdBQVcsV0FBWEEsV0FBV0EsQ0FBQ3pLLE1BQXlCLEVBQThCO0lBQUEsT0FBQU4saUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxVQUFBOEssU0FBQTtNQUFBLElBQUF0TCxTQUFBLEVBQUFtQixhQUFBLEVBQUFvSyxPQUFBLEVBQUFuSyxTQUFBLEVBQUFDLENBQUEsRUFBQW1LLGVBQUEsRUFBQXRFLE9BQUEsRUFBQXVFLFNBQUEsRUFBQUMsVUFBQSxFQUFBL0ssTUFBQSxFQUFBRCxRQUFBLEVBQUFpTCxtQkFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQXJMLG1CQUFBLENBQUF5RCxJQUFBLFdBQUE2SCxTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQTNILElBQUEsR0FBQTJILFNBQUEsQ0FBQTFILElBQUE7VUFBQTtZQUN2RTVFLHFDQUFxQyxDQUFDLENBQUM7WUFFL0JTLFNBQVMsR0FBZ0ZZLE1BQU0sQ0FBL0ZaLFNBQVMsRUFBRW1CLGFBQWEsR0FBaUVQLE1BQU0sQ0FBcEZPLGFBQWEsRUFBRW9LLE9BQU8sR0FBd0QzSyxNQUFNLENBQXJFMkssT0FBTyxFQUFFbkssU0FBUyxHQUE2Q1IsTUFBTSxDQUE1RFEsU0FBUyxFQUFFQyxDQUFDLEdBQTBDVCxNQUFNLENBQWpEUyxDQUFDLEVBQUVtSyxlQUFlLEdBQXlCNUssTUFBTSxDQUE5QzRLLGVBQWUsRUFBRXRFLE9BQU8sR0FBZ0J0RyxNQUFNLENBQTdCc0csT0FBTyxFQUFFdUUsU0FBUyxHQUFLN0ssTUFBTSxDQUFwQjZLLFNBQVM7WUFBQSxLQUV4RjFMLGNBQWMsQ0FBQ0MsU0FBUyxDQUFDO2NBQUE2TCxTQUFBLENBQUExSCxJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUEwSCxTQUFBLENBQUE3RCxNQUFBLFdBQ3BCO2NBQUU4RCxPQUFPLEVBQUUsS0FBSztjQUFFQyxNQUFNLEVBQUU7WUFBaUIsQ0FBQztVQUFBO1lBQUEsTUFFakQ3TCxvQkFBb0IsQ0FBQyxDQUFDLElBQUlULHNCQUFzQjtjQUFBb00sU0FBQSxDQUFBMUgsSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBMEgsU0FBQSxDQUFBN0QsTUFBQSxXQUMzQztjQUFFOEQsT0FBTyxFQUFFLEtBQUs7Y0FBRUMsTUFBTSxFQUFFO1lBQVEsQ0FBQztVQUFBO1lBR3RDTCxVQUFVLEdBQUcsSUFBSU0sZUFBZSxDQUFDLENBQUM7WUFDbENyTCxNQUFvQixHQUFHO2NBQUVYLFNBQVMsRUFBVEEsU0FBUztjQUFFMEwsVUFBVSxFQUFWQSxVQUFVO2NBQUU1RCxTQUFTLEVBQUU7WUFBTSxDQUFDO1lBQ3hFbkksYUFBYSxDQUFDc00sR0FBRyxDQUFDak0sU0FBUyxFQUFFVyxNQUFNLENBQUM7WUFFcENkLEtBQUssQ0FBQyxDQUFDLENBQUNxTSxhQUFhLENBQUNsTSxTQUFTLENBQUM7WUFDaENILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUFtTSxhQUFBLENBQUFBLGFBQUE7Y0FDekJoTCxhQUFhLEVBQWJBLGFBQWE7Y0FDYmdKLEtBQUssRUFBRSxJQUFJO2NBQ1gxRSxTQUFTLEVBQUUsSUFBSTtjQUNmSyxTQUFTLEVBQUU7WUFBSyxHQUNab0IsT0FBTyxJQUFJLElBQUksR0FBRztjQUFFQSxPQUFPLEVBQVBBO1lBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNsQ3VFLFNBQVMsSUFBSSxJQUFJLEdBQUc7Y0FBRUEsU0FBUyxFQUFUQTtZQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDM0MsQ0FBQztZQUNGNUwsS0FBSyxDQUFDLENBQUMsQ0FBQzZGLFNBQVMsQ0FBQzFGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeENYLG9CQUFvQixDQUFDK00sS0FBSyxDQUFDcE0sU0FBUyxFQUFFbUIsYUFBYSxDQUFDO1lBQ3BEL0IsY0FBYyxDQUFDZ04sS0FBSyxDQUFDakwsYUFBYSxDQUFDO1lBQ25DdEIsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFdBQVcsQ0FBQzNGLFNBQVMsRUFBRW5CLHdCQUF3QixDQUFDd0MsQ0FBQyxFQUFFbUssZUFBZSxhQUFmQSxlQUFlLGNBQWZBLGVBQWUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUFLLFNBQUEsQ0FBQTNILElBQUE7WUFBQTJILFNBQUEsQ0FBQTFILElBQUE7WUFBQSxPQUd6RHZGLElBQUksQ0FBQ3lOLFlBQVksQ0FBQ0MsWUFBWSxDQUFDZixPQUFPLEVBQUVHLFVBQVUsQ0FBQ2EsTUFBTSxDQUFDO1VBQUE7WUFBM0U3TCxRQUFRLEdBQUFtTCxTQUFBLENBQUEzRCxJQUFBO1lBQUEyRCxTQUFBLENBQUExSCxJQUFBO1lBQUEsT0FDUi9ELGVBQWUsQ0FBQ00sUUFBUSxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sQ0FBQztVQUFBO1lBQUFpTCxTQUFBLENBQUExSCxJQUFBO1lBQUE7VUFBQTtZQUFBMEgsU0FBQSxDQUFBM0gsSUFBQTtZQUFBMEgsR0FBQSxHQUFBQyxTQUFBO1lBRS9DLElBQUksQ0FBQ2xMLE1BQU0sQ0FBQ21ILFNBQVMsRUFBRTtjQUNyQnpJLG9CQUFvQixDQUFDeUssS0FBSyxDQUFDOUosU0FBUyxDQUFDO2NBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFLEtBQUs7Z0JBQUVLLFNBQVMsRUFBRTtjQUFNLENBQUMsQ0FBQztjQUNwRWpHLEtBQUssQ0FBQyxDQUFDLENBQUM4RixXQUFXLENBQUMzRixTQUFTLEVBQUUsSUFBSSxDQUFDO2NBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLE9BQU8sQ0FBQztjQUNyQyxDQUFBMkwsbUJBQUEsR0FBQXZLLFNBQVMsQ0FBQ2lKLE9BQU8sY0FBQXNCLG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFBbkgsSUFBQSxDQUFBcEQsU0FBb0IsQ0FBQztZQUN2QjtVQUFDO1lBQUF5SyxTQUFBLENBQUEzSCxJQUFBO1lBRUR2RSxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQUEsT0FBQTZMLFNBQUEsQ0FBQWxFLE1BQUE7VUFBQTtZQUFBLE9BQUFrRSxTQUFBLENBQUE3RCxNQUFBLFdBRzFCO2NBQUU4RCxPQUFPLEVBQUU7WUFBSyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFELFNBQUEsQ0FBQXBCLElBQUE7UUFBQTtNQUFBLEdBQUFhLFFBQUE7SUFBQTtFQUMxQixDQUFDO0VBRUQsMEZBQ01rQixtQkFBbUIsV0FBbkJBLG1CQUFtQkEsQ0FBQzVMLE1BQWlDLEVBQThCO0lBQUEsT0FBQU4saUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxVQUFBaU0sU0FBQTtNQUFBLElBQUFDLEtBQUE7TUFBQSxJQUFBMU0sU0FBQSxFQUFBbUIsYUFBQSxFQUFBd0wsZUFBQSxFQUFBdkwsU0FBQSxFQUFBQyxDQUFBLEVBQUF1TCxvQkFBQSxFQUFBMUYsT0FBQSxFQUFBdUUsU0FBQSxFQUFBQyxVQUFBLEVBQUEvSyxNQUFBLEVBQUFrTSxTQUFBLEVBQUFuTSxRQUFBLEVBQUFvTSxtQkFBQSxFQUFBQyxHQUFBO01BQUEsT0FBQXhNLG1CQUFBLENBQUF5RCxJQUFBLFdBQUFnSixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQTlJLElBQUEsR0FBQThJLFNBQUEsQ0FBQTdJLElBQUE7VUFBQTtZQUN2RjVFLHFDQUFxQyxDQUFDLENBQUM7WUFFL0JTLFNBQVMsR0FBNkZZLE1BQU0sQ0FBNUdaLFNBQVMsRUFBRW1CLGFBQWEsR0FBOEVQLE1BQU0sQ0FBakdPLGFBQWEsRUFBRXdMLGVBQWUsR0FBNkQvTCxNQUFNLENBQWxGK0wsZUFBZSxFQUFFdkwsU0FBUyxHQUFrRFIsTUFBTSxDQUFqRVEsU0FBUyxFQUFFQyxDQUFDLEdBQStDVCxNQUFNLENBQXREUyxDQUFDLEVBQUV1TCxvQkFBb0IsR0FBeUJoTSxNQUFNLENBQW5EZ00sb0JBQW9CLEVBQUUxRixPQUFPLEdBQWdCdEcsTUFBTSxDQUE3QnNHLE9BQU8sRUFBRXVFLFNBQVMsR0FBSzdLLE1BQU0sQ0FBcEI2SyxTQUFTO1lBQUEsS0FFckcxTCxjQUFjLENBQUNDLFNBQVMsQ0FBQztjQUFBZ04sU0FBQSxDQUFBN0ksSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBNkksU0FBQSxDQUFBaEYsTUFBQSxXQUNwQjtjQUFFOEQsT0FBTyxFQUFFLEtBQUs7Y0FBRUMsTUFBTSxFQUFFO1lBQWlCLENBQUM7VUFBQTtZQUFBLE1BRWpEN0wsb0JBQW9CLENBQUMsQ0FBQyxJQUFJVCxzQkFBc0I7Y0FBQXVOLFNBQUEsQ0FBQTdJLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQTZJLFNBQUEsQ0FBQWhGLE1BQUEsV0FDM0M7Y0FBRThELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRTtZQUFRLENBQUM7VUFBQTtZQUc1QyxJQUFJYSxvQkFBb0IsRUFBRTtjQUN4QnBOLGtCQUFrQixDQUFDeU0sR0FBRyxDQUFDak0sU0FBUyxFQUFFNE0sb0JBQW9CLENBQUM7WUFDekQ7WUFFTWxCLFVBQVUsR0FBRyxJQUFJTSxlQUFlLENBQUMsQ0FBQztZQUNsQ3JMLE1BQW9CLEdBQUc7Y0FBRVgsU0FBUyxFQUFUQSxTQUFTO2NBQUUwTCxVQUFVLEVBQVZBLFVBQVU7Y0FBRTVELFNBQVMsRUFBRTtZQUFNLENBQUM7WUFDeEVuSSxhQUFhLENBQUNzTSxHQUFHLENBQUNqTSxTQUFTLEVBQUVXLE1BQU0sQ0FBQztZQUVwQ2QsS0FBSyxDQUFDLENBQUMsQ0FBQ3FNLGFBQWEsQ0FBQ2xNLFNBQVMsQ0FBQztZQUNoQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBQW1NLGFBQUEsQ0FBQUEsYUFBQTtjQUN6QmhMLGFBQWEsRUFBYkEsYUFBYTtjQUNiZ0osS0FBSyxFQUFFLElBQUk7Y0FDWDFFLFNBQVMsRUFBRSxJQUFJO2NBQ2ZLLFNBQVMsRUFBRTtZQUFLLEdBQ1pvQixPQUFPLElBQUksSUFBSSxHQUFHO2NBQUVBLE9BQU8sRUFBUEE7WUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQ2xDdUUsU0FBUyxJQUFJLElBQUksR0FBRztjQUFFQSxTQUFTLEVBQVRBO1lBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUMzQyxDQUFDO1lBQ0Y1TCxLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q1gsb0JBQW9CLENBQUMrTSxLQUFLLENBQUNwTSxTQUFTLEVBQUVtQixhQUFhLENBQUM7WUFDcER0QixLQUFLLENBQUMsQ0FBQyxDQUFDOEYsV0FBVyxDQUNqQjNGLFNBQVMsRUFDVGYsZ0NBQWdDLENBQUNvQyxDQUFDLEdBQUFxTCxLQUFBLEdBQUVFLG9CQUFvQixhQUFwQkEsb0JBQW9CLGNBQXBCQSxvQkFBb0IsR0FBSXBOLGtCQUFrQixDQUFDeU4sR0FBRyxDQUFDak4sU0FBUyxDQUFDLGNBQUEwTSxLQUFBLGNBQUFBLEtBQUEsR0FBSVEsU0FBUyxDQUM1RyxDQUFDO1lBRUtMLFNBQTRCLEdBQUc7Y0FDbkM3TSxTQUFTLEVBQVRBLFNBQVM7Y0FDVG1CLGFBQWEsRUFBYkEsYUFBYTtjQUNib0ssT0FBTyxFQUFFLENBQUMsQ0FBd0I7Y0FDbENuSyxTQUFTLEVBQVRBLFNBQVM7Y0FDVEMsQ0FBQyxFQUFEQSxDQUFDO2NBQ0R1TCxvQkFBb0IsRUFBRUEsb0JBQW9CLGFBQXBCQSxvQkFBb0IsY0FBcEJBLG9CQUFvQixHQUFJcE4sa0JBQWtCLENBQUN5TixHQUFHLENBQUNqTixTQUFTLENBQUM7Y0FDL0VrSCxPQUFPLEVBQVBBLE9BQU87Y0FDUHVFLFNBQVMsRUFBVEE7WUFDRixDQUFDO1lBQUF1QixTQUFBLENBQUE5SSxJQUFBO1lBQUE4SSxTQUFBLENBQUE3SSxJQUFBO1lBQUEsT0FHd0J2RixJQUFJLENBQUN5TixZQUFZLENBQUNjLGNBQWMsQ0FBQ1IsZUFBZSxFQUFFakIsVUFBVSxDQUFDYSxNQUFNLENBQUM7VUFBQTtZQUFyRjdMLFFBQVEsR0FBQXNNLFNBQUEsQ0FBQTlFLElBQUE7WUFBQSxJQUNUeEgsUUFBUSxDQUFDME0sRUFBRTtjQUFBSixTQUFBLENBQUE3SSxJQUFBO2NBQUE7WUFBQTtZQUFBLE1BQ1IsSUFBSVksS0FBSyw0QkFBQXNJLE1BQUEsQ0FBNEIzTSxRQUFRLENBQUMwSSxNQUFNLENBQUUsQ0FBQztVQUFBO1lBQUE0RCxTQUFBLENBQUE3SSxJQUFBO1lBQUEsT0FFekQvRCxlQUFlLENBQUNNLFFBQVEsRUFBRUMsTUFBTSxFQUFFa00sU0FBUyxDQUFDO1VBQUE7WUFBQUcsU0FBQSxDQUFBN0ksSUFBQTtZQUFBO1VBQUE7WUFBQTZJLFNBQUEsQ0FBQTlJLElBQUE7WUFBQTZJLEdBQUEsR0FBQUMsU0FBQTtZQUVsRCxJQUFJLENBQUNyTSxNQUFNLENBQUNtSCxTQUFTLEVBQUU7Y0FDckJ6SSxvQkFBb0IsQ0FBQ3lLLEtBQUssQ0FBQzlKLFNBQVMsQ0FBQztjQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtnQkFBRXlGLFNBQVMsRUFBRSxLQUFLO2dCQUFFSyxTQUFTLEVBQUU7Y0FBTSxDQUFDLENBQUM7Y0FDcEVqRyxLQUFLLENBQUMsQ0FBQyxDQUFDOEYsV0FBVyxDQUFDM0YsU0FBUyxFQUFFLElBQUksQ0FBQztjQUNwQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzZGLFNBQVMsQ0FBQzFGLFNBQVMsRUFBRSxPQUFPLENBQUM7Y0FDckMsQ0FBQThNLG1CQUFBLEdBQUExTCxTQUFTLENBQUNpSixPQUFPLGNBQUF5QyxtQkFBQSxlQUFqQkEsbUJBQUEsQ0FBQXRJLElBQUEsQ0FBQXBELFNBQW9CLENBQUM7WUFDdkI7VUFBQztZQUFBNEwsU0FBQSxDQUFBOUksSUFBQTtZQUVEdkUsYUFBYSxVQUFPLENBQUNLLFNBQVMsQ0FBQztZQUMvQlIsa0JBQWtCLENBQUNzSyxLQUFLLENBQUM5SixTQUFTLENBQUM7WUFBQSxPQUFBZ04sU0FBQSxDQUFBckYsTUFBQTtVQUFBO1lBQUEsT0FBQXFGLFNBQUEsQ0FBQWhGLE1BQUEsV0FHOUI7Y0FBRThELE9BQU8sRUFBRTtZQUFLLENBQUM7VUFBQTtVQUFBO1lBQUEsT0FBQWtCLFNBQUEsQ0FBQXZDLElBQUE7UUFBQTtNQUFBLEdBQUFnQyxRQUFBO0lBQUE7RUFDMUIsQ0FBQztFQUVELGlHQUNNYSxnQkFBZ0IsV0FBaEJBLGdCQUFnQkEsQ0FBQzFNLE1BQThCLEVBQThCO0lBQUEsT0FBQU4saUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxVQUFBK00sU0FBQTtNQUFBLElBQUF2TixTQUFBLEVBQUFtQixhQUFBLEVBQUFxTSxZQUFBLEVBQUFwTSxTQUFBLEVBQUFDLENBQUEsRUFBQW1LLGVBQUEsRUFBQXRFLE9BQUEsRUFBQXVFLFNBQUEsRUFBQUMsVUFBQSxFQUFBL0ssTUFBQSxFQUFBa00sU0FBQSxFQUFBbk0sUUFBQSxFQUFBK00sTUFBQSxFQUFBdEssSUFBQSxFQUFBdUssbUJBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBO01BQUEsT0FBQXJOLG1CQUFBLENBQUF5RCxJQUFBLFdBQUE2SixTQUFBO1FBQUEsa0JBQUFBLFNBQUEsQ0FBQTNKLElBQUEsR0FBQTJKLFNBQUEsQ0FBQTFKLElBQUE7VUFBQTtZQUNqRjVFLHFDQUFxQyxDQUFDLENBQUM7WUFFL0JTLFNBQVMsR0FBcUZZLE1BQU0sQ0FBcEdaLFNBQVMsRUFBRW1CLGFBQWEsR0FBc0VQLE1BQU0sQ0FBekZPLGFBQWEsRUFBRXFNLFlBQVksR0FBd0Q1TSxNQUFNLENBQTFFNE0sWUFBWSxFQUFFcE0sU0FBUyxHQUE2Q1IsTUFBTSxDQUE1RFEsU0FBUyxFQUFFQyxDQUFDLEdBQTBDVCxNQUFNLENBQWpEUyxDQUFDLEVBQUVtSyxlQUFlLEdBQXlCNUssTUFBTSxDQUE5QzRLLGVBQWUsRUFBRXRFLE9BQU8sR0FBZ0J0RyxNQUFNLENBQTdCc0csT0FBTyxFQUFFdUUsU0FBUyxHQUFLN0ssTUFBTSxDQUFwQjZLLFNBQVM7WUFBQSxLQUU3RjFMLGNBQWMsQ0FBQ0MsU0FBUyxDQUFDO2NBQUE2TixTQUFBLENBQUExSixJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUEwSixTQUFBLENBQUE3RixNQUFBLFdBQ3BCO2NBQUU4RCxPQUFPLEVBQUUsS0FBSztjQUFFQyxNQUFNLEVBQUU7WUFBaUIsQ0FBQztVQUFBO1lBQUEsTUFFakQ3TCxvQkFBb0IsQ0FBQyxDQUFDLElBQUlULHNCQUFzQjtjQUFBb08sU0FBQSxDQUFBMUosSUFBQTtjQUFBO1lBQUE7WUFBQSxPQUFBMEosU0FBQSxDQUFBN0YsTUFBQSxXQUMzQztjQUFFOEQsT0FBTyxFQUFFLEtBQUs7Y0FBRUMsTUFBTSxFQUFFO1lBQVEsQ0FBQztVQUFBO1lBR3RDTCxVQUFVLEdBQUcsSUFBSU0sZUFBZSxDQUFDLENBQUM7WUFDbENyTCxNQUFvQixHQUFHO2NBQUVYLFNBQVMsRUFBVEEsU0FBUztjQUFFMEwsVUFBVSxFQUFWQSxVQUFVO2NBQUU1RCxTQUFTLEVBQUU7WUFBTSxDQUFDO1lBQ3hFbkksYUFBYSxDQUFDc00sR0FBRyxDQUFDak0sU0FBUyxFQUFFVyxNQUFNLENBQUM7WUFFcENkLEtBQUssQ0FBQyxDQUFDLENBQUNxTSxhQUFhLENBQUNsTSxTQUFTLENBQUM7WUFDaENILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUFtTSxhQUFBLENBQUFBLGFBQUE7Y0FDekJoTCxhQUFhLEVBQWJBLGFBQWE7Y0FDYmdKLEtBQUssRUFBRSxJQUFJO2NBQ1gxRSxTQUFTLEVBQUUsSUFBSTtjQUNmSyxTQUFTLEVBQUU7WUFBSyxHQUNab0IsT0FBTyxJQUFJLElBQUksR0FBRztjQUFFQSxPQUFPLEVBQVBBO1lBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNsQ3VFLFNBQVMsSUFBSSxJQUFJLEdBQUc7Y0FBRUEsU0FBUyxFQUFUQTtZQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDM0MsQ0FBQztZQUNGNUwsS0FBSyxDQUFDLENBQUMsQ0FBQzZGLFNBQVMsQ0FBQzFGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeENYLG9CQUFvQixDQUFDK00sS0FBSyxDQUFDcE0sU0FBUyxFQUFFbUIsYUFBYSxDQUFDO1lBQ3BEdEIsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFdBQVcsQ0FBQzNGLFNBQVMsRUFBRW5CLHdCQUF3QixDQUFDd0MsQ0FBQyxFQUFFbUssZUFBZSxhQUFmQSxlQUFlLGNBQWZBLGVBQWUsR0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTVFcUIsU0FBNEIsR0FBRztjQUNuQzdNLFNBQVMsRUFBVEEsU0FBUztjQUNUbUIsYUFBYSxFQUFiQSxhQUFhO2NBQ2JvSyxPQUFPLEVBQUUsQ0FBQyxDQUF3QjtjQUNsQ25LLFNBQVMsRUFBVEEsU0FBUztjQUNUQyxDQUFDLEVBQURBLENBQUM7Y0FDRG1LLGVBQWUsRUFBZkEsZUFBZTtjQUNmdEUsT0FBTyxFQUFQQSxPQUFPO2NBQ1B1RSxTQUFTLEVBQVRBO1lBQ0YsQ0FBQztZQUFBb0MsU0FBQSxDQUFBM0osSUFBQTtZQUFBMkosU0FBQSxDQUFBMUosSUFBQTtZQUFBLE9BR3dCdkYsSUFBSSxDQUFDeU4sWUFBWSxDQUFDeUIsZUFBZSxDQUFDTixZQUFZLEVBQUU5QixVQUFVLENBQUNhLE1BQU0sQ0FBQztVQUFBO1lBQW5GN0wsUUFBUSxHQUFBbU4sU0FBQSxDQUFBM0YsSUFBQTtZQUFBLElBQ1R4SCxRQUFRLENBQUMwTSxFQUFFO2NBQUFTLFNBQUEsQ0FBQTFKLElBQUE7Y0FBQTtZQUFBO1lBQUEsTUFDVnpELFFBQVEsQ0FBQzBJLE1BQU0sS0FBSyxHQUFHO2NBQUF5RSxTQUFBLENBQUExSixJQUFBO2NBQUE7WUFBQTtZQUFBMEosU0FBQSxDQUFBM0osSUFBQTtZQUFBMkosU0FBQSxDQUFBMUosSUFBQTtZQUFBLE9BR0h6RCxRQUFRLENBQUNxTixJQUFJLENBQUMsQ0FBQztVQUFBO1lBQTdCNUssSUFBSSxHQUFBMEssU0FBQSxDQUFBM0YsSUFBQTtZQUNWdUYsTUFBTSxHQUFHLE9BQU90SyxJQUFJLENBQUNzSyxNQUFNLEtBQUssUUFBUSxHQUFHdEssSUFBSSxDQUFDc0ssTUFBTSxHQUFHUCxTQUFTO1lBQUFXLFNBQUEsQ0FBQTFKLElBQUE7WUFBQTtVQUFBO1lBQUEwSixTQUFBLENBQUEzSixJQUFBO1lBQUF5SixHQUFBLEdBQUFFLFNBQUE7WUFFbEVKLE1BQU0sR0FBR1AsU0FBUztVQUFBO1lBQUEsTUFFaEJPLE1BQU0sS0FBSyxnQkFBZ0I7Y0FBQUksU0FBQSxDQUFBMUosSUFBQTtjQUFBO1lBQUE7WUFDN0I5RSxvQkFBb0IsQ0FBQ3lLLEtBQUssQ0FBQzlKLFNBQVMsQ0FBQztZQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtjQUFFeUYsU0FBUyxFQUFFLEtBQUs7Y0FBRUssU0FBUyxFQUFFLEtBQUs7Y0FBRTNFLGFBQWEsRUFBRTtZQUFLLENBQUMsQ0FBQztZQUN6RnRCLEtBQUssQ0FBQyxDQUFDLENBQUM4RixXQUFXLENBQUMzRixTQUFTLEVBQUUsSUFBSSxDQUFDO1lBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLE1BQU0sQ0FBQztZQUNwQ0wsYUFBYSxVQUFPLENBQUNLLFNBQVMsQ0FBQztZQUFBLE9BQUE2TixTQUFBLENBQUE3RixNQUFBLFdBQ3hCO2NBQUU4RCxPQUFPLEVBQUUsS0FBSztjQUFFQyxNQUFNLEVBQUU7WUFBaUIsQ0FBQztVQUFBO1lBQUEsTUFHakQsSUFBSWhILEtBQUssNkJBQUFzSSxNQUFBLENBQTZCM00sUUFBUSxDQUFDMEksTUFBTSxDQUFFLENBQUM7VUFBQTtZQUFBeUUsU0FBQSxDQUFBMUosSUFBQTtZQUFBLE9BRTFEL0QsZUFBZSxDQUFDTSxRQUFRLEVBQUVDLE1BQU0sRUFBRWtNLFNBQVMsQ0FBQztVQUFBO1lBQUFnQixTQUFBLENBQUExSixJQUFBO1lBQUE7VUFBQTtZQUFBMEosU0FBQSxDQUFBM0osSUFBQTtZQUFBMEosR0FBQSxHQUFBQyxTQUFBO1lBRWxELElBQUksQ0FBQ2xOLE1BQU0sQ0FBQ21ILFNBQVMsRUFBRTtjQUNyQnpJLG9CQUFvQixDQUFDeUssS0FBSyxDQUFDOUosU0FBUyxDQUFDO2NBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFLEtBQUs7Z0JBQUVLLFNBQVMsRUFBRTtjQUFNLENBQUMsQ0FBQztjQUNwRWpHLEtBQUssQ0FBQyxDQUFDLENBQUM4RixXQUFXLENBQUMzRixTQUFTLEVBQUUsSUFBSSxDQUFDO2NBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLE9BQU8sQ0FBQztjQUNyQyxDQUFBME4sbUJBQUEsR0FBQXRNLFNBQVMsQ0FBQ2lKLE9BQU8sY0FBQXFELG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFBbEosSUFBQSxDQUFBcEQsU0FBb0IsQ0FBQztZQUN2QjtVQUFDO1lBQUF5TSxTQUFBLENBQUEzSixJQUFBO1lBRUR2RSxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQUEsT0FBQTZOLFNBQUEsQ0FBQWxHLE1BQUE7VUFBQTtZQUFBLE9BQUFrRyxTQUFBLENBQUE3RixNQUFBLFdBRzFCO2NBQUU4RCxPQUFPLEVBQUU7WUFBSyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUErQixTQUFBLENBQUFwRCxJQUFBO1FBQUE7TUFBQSxHQUFBOEMsUUFBQTtJQUFBO0VBQzFCLENBQUM7RUFFRCwrREFDQVMsVUFBVSxXQUFWQSxVQUFVQSxDQUFDaE8sU0FBaUIsRUFBRW9CLFNBQWtDLEVBQUU7SUFBQSxJQUFBNk0saUJBQUE7SUFDaEUsSUFBTXROLE1BQU0sR0FBR2hCLGFBQWEsQ0FBQ3NOLEdBQUcsQ0FBQ2pOLFNBQVMsQ0FBQztJQUMzQyxJQUFJLENBQUNXLE1BQU0sRUFBRTtJQUNiQSxNQUFNLENBQUNtSCxTQUFTLEdBQUcsSUFBSTtJQUN2Qm5ILE1BQU0sQ0FBQytLLFVBQVUsQ0FBQ3dDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCdk8sYUFBYSxVQUFPLENBQUNLLFNBQVMsQ0FBQztJQUMvQjtJQUNBO0lBQ0EsSUFBTW1PLFdBQVcsR0FBRzlPLG9CQUFvQixDQUFDK08sV0FBVyxDQUFDcE8sU0FBUyxDQUFDLENBQUNxTyxJQUFJO0lBQ3BFaFAsb0JBQW9CLENBQUN5SyxLQUFLLENBQUM5SixTQUFTLENBQUM7SUFDckNILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUU7TUFBRXlGLFNBQVMsRUFBRSxLQUFLO01BQUVLLFNBQVMsRUFBRTtJQUFNLENBQUMsQ0FBQztJQUNwRWpHLEtBQUssQ0FBQyxDQUFDLENBQUM4RixXQUFXLENBQUMzRixTQUFTLEVBQUUsSUFBSSxDQUFDO0lBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLFdBQVcsQ0FBQztJQUN6Q29CLFNBQVMsYUFBVEEsU0FBUyxnQkFBQTZNLGlCQUFBLEdBQVQ3TSxTQUFTLENBQUVrTixNQUFNLGNBQUFMLGlCQUFBLGVBQWpCQSxpQkFBQSxDQUFBekosSUFBQSxDQUFBcEQsU0FBUyxFQUFXK00sV0FBVyxDQUFDO0VBQ2xDLENBQUM7RUFFRCw4REFDQUksYUFBYSxXQUFiQSxhQUFhQSxDQUFDdk8sU0FBaUIsRUFBRTtJQUFBLElBQUF3TyxlQUFBO0lBQy9CLElBQU03TixNQUFNLEdBQUdoQixhQUFhLENBQUNzTixHQUFHLENBQUNqTixTQUFTLENBQUM7SUFDM0MsSUFBSSxDQUFDVyxNQUFNLEVBQUU7SUFDYkEsTUFBTSxDQUFDbUgsU0FBUyxHQUFHLElBQUk7SUFDdkJuSCxNQUFNLENBQUMrSyxVQUFVLENBQUN3QyxLQUFLLENBQUMsQ0FBQztJQUN6QnZPLGFBQWEsVUFBTyxDQUFDSyxTQUFTLENBQUM7SUFDL0JYLG9CQUFvQixDQUFDeUssS0FBSyxDQUFDOUosU0FBUyxDQUFDO0lBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO01BQUV5RixTQUFTLEVBQUUsS0FBSztNQUFFSyxTQUFTLEVBQUU7SUFBTSxDQUFDLENBQUM7SUFDcEVqRyxLQUFLLENBQUMsQ0FBQyxDQUFDOEYsV0FBVyxDQUFDM0YsU0FBUyxFQUFFLElBQUksQ0FBQztJQUNwQyxJQUFJLEVBQUF3TyxlQUFBLEdBQUEzTyxLQUFLLENBQUMsQ0FBQyxDQUFDdUYsT0FBTyxDQUFDcEYsU0FBUyxDQUFDLGNBQUF3TyxlQUFBLHVCQUExQkEsZUFBQSxDQUE0QnBGLE1BQU0sTUFBSyxVQUFVLEVBQUU7TUFDckR2SixLQUFLLENBQUMsQ0FBQyxDQUFDNkYsU0FBUyxDQUFDMUYsU0FBUyxFQUFFLE1BQU0sQ0FBQztJQUN0QztFQUNGLENBQUM7RUFFRHlPLFFBQVEsV0FBUkEsUUFBUUEsQ0FBQSxFQUFHO0lBQUEsSUFBQUMsS0FBQTtJQUNUOUgsS0FBSyxDQUFDdUUsSUFBSSxDQUFDeEwsYUFBYSxDQUFDeUwsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDdUQsT0FBTyxDQUFDLFVBQUEzTyxTQUFTO01BQUEsT0FBSTBPLEtBQUksQ0FBQ0gsYUFBYSxDQUFDdk8sU0FBUyxDQUFDO0lBQUEsRUFBQztFQUN0RjtBQUNGLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
727
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtYWlhIiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFVzaW5nU2tpbGxBY3Rpdml0eSIsImdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlVG9vbEFjdGlvbkxhYmVsIiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInJlYXNvbmluZ1N0b3JlIiwic2Vzc2lvblN0cmVhbWluZ1RleHQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCIsInNlc3Npb25IaXRsQ29udGV4dCIsImJ1aWxkU2Vzc2lvbkZpbmlzaFBheWxvYWQiLCJpc0FnZW50VHJhbnNmZXJOb2RlIiwiaXNBcHByb3ZhbFByZUFwcHJvdmVkIiwiaXNSZXRyeVR1cm5Ob3RGb3VuZFJlc3BvbnNlIiwicGFyc2VTc2VCbG9jayIsInBhdGNoTWV0YUFnZW50RmllbGRzIiwicmVzb2x2ZU5vZGVTdHJlYW1NZXNzYWdlIiwicmVzb2x2ZU5vZGVUaHJlYWRJZCIsInJlc29sdmVSZWFzb25pbmdTdGVwVG9vbCIsInJlc29sdmVSZWFzb25pbmdTdGVwVHlwZSIsInJlc29sdmVTdGFydFN0cmVhbUd1YXJkIiwicmVzb2x2ZVN0cmVhbVRleHRDaHVuayIsInJlc29sdmVUaGlua2luZ0RlbHRhIiwic2hvdWxkQWJvcnRTZXNzaW9uU3RyZWFtT25TdG9wIiwic2hvdWxkQXBwbHlSZWFzb25pbmdTdGVwSW5kZXgiLCJzaG91bGRBcHBlbmRUaGlua2luZ1N0ZXAiLCJzaG91bGRSZXN1bWVIaXRsQWZ0ZXJQcmVBcHByb3ZhbCIsInNob3VsZFNldElkbGVPblNpbGVudEFib3J0Iiwic2hvdWxkU2hvd1JlYXNvbmluZ1Rvb2xBY3Rpdml0eSIsInNwbGl0U3NlQnVmZmVyIiwiTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyIsIlNUUkVBTV9USFJPVFRMRV9NUyIsImFjdGl2ZVN0cmVhbXMiLCJNYXAiLCJzdG9yZSIsImdldFN0YXRlIiwiaXNTdHJlYW1BY3RpdmUiLCJzZXNzaW9uSWQiLCJoYXMiLCJnZXRBY3RpdmVTdHJlYW1Db3VudCIsInNpemUiLCJwYXJzZVNlc3Npb25TU0UiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJyZXNwb25zZSIsImFjdGl2ZSIsInBhcmFtcyIsIl9wYXJhbXMkaGl0bEV4ZWN1dGlvbiIsIl9yZXNwb25zZSRib2R5IiwiX2RhdGEkZXJyb3IiLCJfZGF0YSRlcnJvcjIiLCJfY2FsbGJhY2tzJG9uRXJyb3IiLCJfZGF0YSRlcnJvcjMiLCJfZGF0YSRlcnJvcjQiLCJwbGFjZWhvbGRlcklkIiwiY2FsbGJhY2tzIiwidCIsImhpdGxFeGVjdXRpb25Db250ZXh0IiwicGVuZGluZ0NvbnRlbnQiLCJ0aHJvdHRsZVRpbWVyIiwiZmx1c2hUb1N0b3JlcyIsImVtaXRUaHJvdHRsZWQiLCJmbHVzaFBlbmRpbmciLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiaGFzU3RhcnRlZFdyaXRpbmciLCJpc1VzaW5nU2tpbGwiLCJlbnN1cmVXcml0aW5nU3RhcnRlZCIsImFwcGx5U3RyZWFtQ2h1bmsiLCJjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCIsImFwcGx5U3RyZWFtQ29tcGxldGUiLCJfeWllbGQkcmVhZGVyJHJlYWQiLCJkb25lIiwidmFsdWUiLCJfc3BsaXRTc2VCdWZmZXIiLCJibG9ja3MiLCJyZW1haW5kZXIiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJwYXJzZWRCbG9jayIsImV2ZW50VHlwZSIsImRhdGFTdHIiLCJkYXRhIiwiX3Jlc29sdmVUaGlua2luZ0RlbHRhIiwiaW5kZXgiLCJ0aGlua2luZ0RlbHRhIiwic3RlcFRvb2wiLCJzdGVwVHlwZSIsImxhYmVsIiwiX2RhdGEkYXJncyIsInN0ZXBJbmRleCIsImNodW5rIiwiX2NodW5rIiwibm9kZU1lc3NhZ2UiLCJfY2FsbGJhY2tzJG9uQXBwcm92YWwiLCJpc1ByZUFwcHJvdmVkIiwiX3JlZjIiLCJfdCIsIl90MiIsIl90MyIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiZ2V0IiwiY29udGVudCIsIl9jYWxsYmFja3Mkb25TdHJlYW1VcCIsInNldFRleHQiLCJvblN0cmVhbVVwZGF0ZSIsImNhbGwiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwidG9FbWl0IiwiY2xlYXJUaW1lb3V0IiwiYm9keSIsImdldFJlYWRlciIsIkVycm9yIiwiVGV4dERlY29kZXIiLCJfY2FsbGJhY2tzJG9uU3RhcnRXcmkiLCJwYXRjaE1ldGEiLCJpc0xvYWRpbmciLCJpc1dyaXRpbmciLCJzZXRTdGF0dXMiLCJzZXRBY3Rpdml0eSIsIm9uU3RhcnRXcml0aW5nIiwic3luY0xpdmVOYXJyYXRpb24iLCJtYXJrQW5zd2VyUmVzZXQiLCJwYXlsb2FkIiwiX2NhbGxiYWNrcyRvbkZpbmlzaFN0IiwiZmluaXNoUGF5bG9hZCIsImZpbmlzaCIsInJlYXNvbmluZyIsIm9uRmluaXNoU3RyZWFtIiwiaXNTdG9wcGVkIiwiY2FuY2VsIiwiYWJydXB0IiwicmVhZCIsInNlbnQiLCJkZWNvZGUiLCJzdHJlYW0iLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInMiLCJuIiwiSlNPTiIsInBhcnNlIiwiZGVsdGEiLCJhcHBlbmRUaGlua2luZyIsInBoYXNlIiwibWVzc2FnZSIsInNraWxsIiwic3RhdHVzIiwiYXJncyIsIm5hbWUiLCJpIiwiY2FwdHVyZUxlYWRpbmdGcm9tQm9keSIsImFwcGx5U3RlcCIsIl9vYmplY3RTcHJlYWQiLCJzaG91bGRDbGVhclN0cmVhbUZvckxlYWRpbmciLCJ1bmRlZmluZWQiLCJjbGVhciIsIm9uQXBwcm92YWxSZXF1aXJlZCIsInBlbmRpbmdfYWN0aW9ucyIsImNvbnNvbGUiLCJlcnJvciIsInNldEVycm9yIiwidHlwZSIsIm9uRXJyb3IiLCJ3YXJuIiwiZSIsImYiLCJzdG9wIiwiX3giLCJfeDIiLCJfeDMiLCJhcHBseSIsImFyZ3VtZW50cyIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiaXNBY3RpdmUiLCJnZXRBY3RpdmVDb3VudCIsImdldEFjdGl2ZVNlc3Npb25JZHMiLCJBcnJheSIsImZyb20iLCJrZXlzIiwic3RhcnRTdHJlYW0iLCJfY2FsbGVlMiIsInJlcXVlc3QiLCJhY3Rpdml0eU9wdGlvbnMiLCJhZ2VudElkIiwiYWdlbnROYW1lIiwic3RhcnRHdWFyZCIsImNvbnRyb2xsZXIiLCJfY2FsbGJhY2tzJG9uRXJyb3IyIiwiX3Q0IiwiX2NvbnRleHQyIiwiYWxsb3dlZCIsInN0YXJ0ZWQiLCJyZWFzb24iLCJBYm9ydENvbnRyb2xsZXIiLCJzZXQiLCJlbnN1cmVTZXNzaW9uIiwic3RhcnQiLCJPcmNoZXN0cmF0b3IiLCJvcmNoZXN0cmF0b3IiLCJzaWduYWwiLCJzdGFydENvbnRpbnVlU3RyZWFtIiwiX2NhbGxlZTMiLCJfcmVmMyIsImNvbnRpbnVlUmVxdWVzdCIsImNvbnRpbnVlR3VhcmQiLCJzc2VQYXJhbXMiLCJfY2FsbGJhY2tzJG9uRXJyb3IzIiwiX3Q1IiwiX2NvbnRleHQzIiwiY29udGludWVUaHJlYWQiLCJvayIsImNvbmNhdCIsInN0YXJ0UmV0cnlTdHJlYW0iLCJfY2FsbGVlNCIsInJldHJ5UmVxdWVzdCIsInJldHJ5R3VhcmQiLCJkZXRhaWwiLCJfY2FsbGJhY2tzJG9uRXJyb3I0IiwiX3Q2IiwiX3Q3IiwiX2NvbnRleHQ0IiwicmV0cnlDb21wbGV0aW9uIiwianNvbiIsInN0b3BTdHJlYW0iLCJfY2FsbGJhY2tzJG9uU3RvcCIsImFib3J0IiwicGFydGlhbFRleHQiLCJnZXRTbmFwc2hvdCIsInRleHQiLCJvblN0b3AiLCJhYm9ydFNpbGVudGx5IiwiX3N0b3JlJGdldE1ldGEiLCJnZXRNZXRhIiwiYWJvcnRBbGwiLCJfdGhpcyIsImZvckVhY2giXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29udGludWUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zdGFudC1jb25kaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsUmVxdWVzdCB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQge1xuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFVzaW5nU2tpbGxBY3Rpdml0eSxcbiAgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVUb29sQWN0aW9uTGFiZWwsXG59IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgdHlwZSB7IEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZCwgbWVyZ2VTdHJlYW1DaHVuayB9IGZyb20gJy4uLy4uL3V0aWxzL3NzZVN0cmVhbUNvbnRlbnQnXG5pbXBvcnQgeyByZWFzb25pbmdTdG9yZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVJlYXNvbmluZ1RyYWNlJ1xuaW1wb3J0IHR5cGUgeyBSZWFzb25pbmdTdGVwUGF5bG9hZCwgUmVhc29uaW5nVHJhY2VQYXlsb2FkIH0gZnJvbSAnLi4vLi4vdHlwZXMvcmVhc29uaW5nJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuL3Nlc3Npb25TdHJlYW1pbmdUZXh0J1xuaW1wb3J0IHsgdXNlU2Vzc2lvbnNTdG9yZSB9IGZyb20gJy4vdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQgfSBmcm9tICcuL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgc2Vzc2lvbkhpdGxDb250ZXh0IH0gZnJvbSAnLi9zZXNzaW9uSGl0bENvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25TdHJlYW1DYWxsYmFja3MsIFN0YXJ0U3RyZWFtUmVzdWx0IH0gZnJvbSAnLi9zZXNzaW9ucy50eXBlcydcbmltcG9ydCB7XG4gIGJ1aWxkU2Vzc2lvbkZpbmlzaFBheWxvYWQsXG4gIGlzQWdlbnRUcmFuc2Zlck5vZGUsXG4gIGlzQXBwcm92YWxQcmVBcHByb3ZlZCxcbiAgaXNSZXRyeVR1cm5Ob3RGb3VuZFJlc3BvbnNlLFxuICBwYXJzZVNzZUJsb2NrLFxuICBwYXRjaE1ldGFBZ2VudEZpZWxkcyxcbiAgcmVzb2x2ZU5vZGVTdHJlYW1NZXNzYWdlLFxuICByZXNvbHZlTm9kZVRocmVhZElkLFxuICByZXNvbHZlUmVhc29uaW5nU3RlcFRvb2wsXG4gIHJlc29sdmVSZWFzb25pbmdTdGVwVHlwZSxcbiAgcmVzb2x2ZVN0YXJ0U3RyZWFtR3VhcmQsXG4gIHJlc29sdmVTdHJlYW1UZXh0Q2h1bmssXG4gIHJlc29sdmVUaGlua2luZ0RlbHRhLFxuICBzaG91bGRBYm9ydFNlc3Npb25TdHJlYW1PblN0b3AsXG4gIHNob3VsZEFwcGx5UmVhc29uaW5nU3RlcEluZGV4LFxuICBzaG91bGRBcHBlbmRUaGlua2luZ1N0ZXAsXG4gIHNob3VsZFJlc3VtZUhpdGxBZnRlclByZUFwcHJvdmFsLFxuICBzaG91bGRTZXRJZGxlT25TaWxlbnRBYm9ydCxcbiAgc2hvdWxkU2hvd1JlYXNvbmluZ1Rvb2xBY3Rpdml0eSxcbiAgc3BsaXRTc2VCdWZmZXIsXG59IGZyb20gJy4vc2Vzc2lvblN0cmVhbU1hbmFnZXIuaGVscGVycydcblxudHlwZSBPcmNoZXN0cmF0b3JSZXF1ZXN0ID0gUGFyYW1ldGVyczx0eXBlb2YgbWFpYS5PcmNoZXN0cmF0b3Iub3JjaGVzdHJhdG9yPlswXVxudHlwZSBDb250aW51ZVRocmVhZFJlcXVlc3QgPSBQYXJhbWV0ZXJzPHR5cGVvZiBtYWlhLk9yY2hlc3RyYXRvci5jb250aW51ZVRocmVhZD5bMF1cbnR5cGUgUmV0cnlDb21wbGV0aW9uUmVxdWVzdCA9IFBhcmFtZXRlcnM8dHlwZW9mIG1haWEuT3JjaGVzdHJhdG9yLnJldHJ5Q29tcGxldGlvbj5bMF1cblxuLyoqIENvbXBhdGlibGUgY29uIGVsIGB0YCBkZSBpMThuZXh0ICh1c28gZGUgdW5hIHNvbGEga2V5KS4gKi9cbnR5cGUgVHJhbnNsYXRlRm4gPSAoa2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuXG50eXBlIFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgcmVxdWVzdDogT3JjaGVzdHJhdG9yUmVxdWVzdFxuICBjYWxsYmFja3M6IFNlc3Npb25TdHJlYW1DYWxsYmFja3NcbiAgdDogVHJhbnNsYXRlRm5cbiAgYWN0aXZpdHlPcHRpb25zPzoge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBoYXNBdHRhY2htZW50cz86IGJvb2xlYW5cbiAgICBhdHRhY2htZW50c0NvdW50PzogbnVtYmVyXG4gIH1cbiAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGxcbiAgYWdlbnRJZD86IHN0cmluZyB8IG51bWJlclxuICBhZ2VudE5hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTdGFydENvbnRpbnVlU3RyZWFtUGFyYW1zID0ge1xuICBzZXNzaW9uSWQ6IHN0cmluZ1xuICBwbGFjZWhvbGRlcklkOiBzdHJpbmdcbiAgY29udGludWVSZXF1ZXN0OiBDb250aW51ZVRocmVhZFJlcXVlc3RcbiAgY2FsbGJhY2tzOiBTZXNzaW9uU3RyZWFtQ2FsbGJhY2tzXG4gIHQ6IFRyYW5zbGF0ZUZuXG4gIGhpdGxFeGVjdXRpb25Db250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4gIGFnZW50SWQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgYWdlbnROYW1lPzogc3RyaW5nXG59XG5cbnR5cGUgU3RhcnRSZXRyeVN0cmVhbVBhcmFtcyA9IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmdcbiAgcGxhY2Vob2xkZXJJZDogc3RyaW5nXG4gIHJldHJ5UmVxdWVzdDogUmV0cnlDb21wbGV0aW9uUmVxdWVzdFxuICBjYWxsYmFja3M6IFNlc3Npb25TdHJlYW1DYWxsYmFja3NcbiAgdDogVHJhbnNsYXRlRm5cbiAgYWN0aXZpdHlPcHRpb25zPzoge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBoYXNBdHRhY2htZW50cz86IGJvb2xlYW5cbiAgICBhdHRhY2htZW50c0NvdW50PzogbnVtYmVyXG4gIH1cbiAgYWdlbnRJZD86IHN0cmluZyB8IG51bWJlclxuICBhZ2VudE5hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBBY3RpdmVTdHJlYW0gPSB7XG4gIHNlc3Npb25JZDogc3RyaW5nXG4gIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlclxuICBpc1N0b3BwZWQ6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBNw6F4aW1vIGRlIHNlc2lvbmVzIGdlbmVyYW5kbyBlbiBwYXJhbGVsby4gUHJvdGVnZSByZWQvcmVjdXJzb3MgZGVsIGNsaWVudGUuXG4gKiBBanVzdGFibGUgYSBmdXR1cm8gdsOtYSBmbGFnIGRlbCBob3N0LlxuICovXG5leHBvcnQgY29uc3QgTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyA9IDRcblxuY29uc3QgU1RSRUFNX1RIUk9UVExFX01TID0gMTZcblxuY29uc3QgYWN0aXZlU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBBY3RpdmVTdHJlYW0+KClcblxuY29uc3Qgc3RvcmUgPSAoKSA9PiB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKClcblxuY29uc3QgaXNTdHJlYW1BY3RpdmUgPSAoc2Vzc2lvbklkOiBzdHJpbmcpOiBib29sZWFuID0+IGFjdGl2ZVN0cmVhbXMuaGFzKHNlc3Npb25JZClcblxuY29uc3QgZ2V0QWN0aXZlU3RyZWFtQ291bnQgPSAoKTogbnVtYmVyID0+IGFjdGl2ZVN0cmVhbXMuc2l6ZVxuXG5jb25zdCBwYXJzZVNlc3Npb25TU0UgPSBhc3luYyAocmVzcG9uc2U6IFJlc3BvbnNlLCBhY3RpdmU6IEFjdGl2ZVN0cmVhbSwgcGFyYW1zOiBTdGFydFN0cmVhbVBhcmFtcyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY2FsbGJhY2tzLCB0IH0gPSBwYXJhbXNcbiAgY29uc3QgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPSBwYXJhbXMuaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpXG5cbiAgbGV0IHBlbmRpbmdDb250ZW50OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBsZXQgdGhyb3R0bGVUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICBjb25zdCBmbHVzaFRvU3RvcmVzID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnNldFRleHQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjb250ZW50KVxuICAgIGNhbGxiYWNrcy5vblN0cmVhbVVwZGF0ZT8uKGNvbnRlbnQpXG4gIH1cblxuICBjb25zdCBlbWl0VGhyb3R0bGVkID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIHBlbmRpbmdDb250ZW50ID0gY29udGVudFxuICAgIGlmICh0aHJvdHRsZVRpbWVyICE9IG51bGwpIHJldHVyblxuICAgIHRocm90dGxlVGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG9FbWl0ID0gcGVuZGluZ0NvbnRlbnRcbiAgICAgICAgcGVuZGluZ0NvbnRlbnQgPSBudWxsXG4gICAgICAgIGZsdXNoVG9TdG9yZXModG9FbWl0KVxuICAgICAgfVxuICAgIH0sIFNUUkVBTV9USFJPVFRMRV9NUylcbiAgfVxuXG4gIGNvbnN0IGZsdXNoUGVuZGluZyA9ICgpID0+IHtcbiAgICBpZiAodGhyb3R0bGVUaW1lciAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICB0aHJvdHRsZVRpbWVyID0gbnVsbFxuICAgIH1cbiAgICBpZiAocGVuZGluZ0NvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgdG9FbWl0ID0gcGVuZGluZ0NvbnRlbnRcbiAgICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgICAgZmx1c2hUb1N0b3Jlcyh0b0VtaXQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKClcbiAgaWYgKCFyZWFkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlYWRlciBhdmFpbGFibGUnKVxuICB9XG5cbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gIGxldCBidWZmZXIgPSAnJ1xuICBsZXQgYWNjdW11bGF0ZWRDb250ZW50ID0gJydcbiAgbGV0IGhhc1N0YXJ0ZWRXcml0aW5nID0gZmFsc2VcbiAgLy8gXCJVc2FuZG8gU2tpbGxcIiBxdWVkYSB2aXNpYmxlIG1pZW50cmFzIGVsIG1vZGVsbyBwaWVuc2EgY29uIGxhIHNraWxsIGNhcmdhZGE7XG4gIC8vIGxvcyBkZWx0YXMgZGUgYHRoaW5raW5nYCBubyBsbyBwaXNhbiBoYXN0YSBsYSBwcsOzeGltYSBhY2Npw7NuIG8gZWwgcHJpbWVyIHRva2VuLlxuICBsZXQgaXNVc2luZ1NraWxsID0gZmFsc2VcblxuICBjb25zdCBlbnN1cmVXcml0aW5nU3RhcnRlZCA9ICgpID0+IHtcbiAgICBpZiAoaGFzU3RhcnRlZFdyaXRpbmcpIHJldHVyblxuICAgIGhhc1N0YXJ0ZWRXcml0aW5nID0gdHJ1ZVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUsIGlzV3JpdGluZzogdHJ1ZSB9KVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3dyaXRpbmcnKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkodCkpXG4gICAgY2FsbGJhY2tzLm9uU3RhcnRXcml0aW5nPy4oKVxuICB9XG5cbiAgY29uc3QgYXBwbHlTdHJlYW1DaHVuayA9IChjaHVuazogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFjaHVuaykgcmV0dXJuXG4gICAgYWNjdW11bGF0ZWRDb250ZW50ID0gbWVyZ2VTdHJlYW1DaHVuayhhY2N1bXVsYXRlZENvbnRlbnQsIGNodW5rKVxuICAgIHJlYXNvbmluZ1N0b3JlLnN5bmNMaXZlTmFycmF0aW9uKHBsYWNlaG9sZGVySWQsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICBlbWl0VGhyb3R0bGVkKGFjY3VtdWxhdGVkQ29udGVudClcbiAgfVxuXG4gIGNvbnN0IGNsZWFyU3RyZWFtTGlrZUFuc3dlclJlc2V0ID0gKCkgPT4ge1xuICAgIGlmICh0aHJvdHRsZVRpbWVyICE9IG51bGwpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhyb3R0bGVUaW1lcilcbiAgICAgIHRocm90dGxlVGltZXIgPSBudWxsXG4gICAgfVxuICAgIHBlbmRpbmdDb250ZW50ID0gbnVsbFxuICAgIGFjY3VtdWxhdGVkQ29udGVudCA9ICcnXG4gICAgZmx1c2hUb1N0b3JlcygnJylcbiAgICByZWFzb25pbmdTdG9yZS5tYXJrQW5zd2VyUmVzZXQocGxhY2Vob2xkZXJJZClcbiAgfVxuXG4gIGNvbnN0IGFwcGx5U3RyZWFtQ29tcGxldGUgPSAocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICBjb25zdCBmaW5pc2hQYXlsb2FkID0gYnVpbGRTZXNzaW9uRmluaXNoUGF5bG9hZChwYXlsb2FkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG5cbiAgICByZWFzb25pbmdTdG9yZS5maW5pc2gocGxhY2Vob2xkZXJJZCwgZmluaXNoUGF5bG9hZC5yZWFzb25pbmcpXG4gICAgZmx1c2hQZW5kaW5nKClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2NvbXBsZXRlJylcblxuICAgIGNhbGxiYWNrcy5vbkZpbmlzaFN0cmVhbT8uKGZpbmlzaFBheWxvYWQpXG5cbiAgICAvLyBFbCB0ZXh0byBlbiB2aXZvIE5PIHNlIGxpbXBpYSBhY8OhIGEgcHJvcMOzc2l0by4gRWwgcGxhY2Vob2xkZXIgc2UgdmEgY29uIGVsXG4gICAgLy8gYGRyb3BgIHF1ZSBoYWNlIGVsIGNvbnN1bWlkb3IsIHkgY29uIMOpbCBzdSBzdXNjcmlwY2nDs247IHZhY2lhcmxvIGFudGVzIGxvXG4gICAgLy8gZGVqYWJhIG1vbnRhZG8geSBzaW4gdGV4dG8gKGFsdHVyYSAwKSBkdXJhbnRlIH4yNW1zOiBlbCBmbGlja2VyIGRlIGZpbiBkZVxuICAgIC8vIHN0cmVhbS4gTm8gYWxjYW56YSBjb24gZGlmZXJpcmxvLCBwb3JxdWUgZXN0ZSBjbGVhciB2aWFqYSBlbiBTeW5jTGFuZVxuICAgIC8vIChzdG9yZSBleHRlcm5vKSB5IGVsIHN3YXAgZGUgbWVuc2FqZXMgZW4gRGVmYXVsdExhbmUsIGFzw60gcXVlIHNpZW1wcmUgc2VcbiAgICAvLyBjdWVsYSBlbiBlbCBtZWRpby4gRWwgc2xvdCBzZSBsaWJlcmEgZW4gZWwgcHLDs3hpbW8gYHN0YXJ0KClgIGRlIGxhIHNlc2nDs24sXG4gICAgLy8geSBlbiBzdG9wL2Vycm9yL2FwcHJvdmFsL2NhbWJpbyBkZSBzZXNpw7NuLCBxdWUgc8OtIGxsYW1hbiBgY2xlYXJgLlxuICB9XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHNob3VsZEFib3J0U2Vzc2lvblN0cmVhbU9uU3RvcChhY3RpdmUuaXNTdG9wcGVkKSkge1xuICAgICAgICByZWFkZXIuY2FuY2VsKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKVxuICAgICAgaWYgKGRvbmUpIGJyZWFrXG5cbiAgICAgIGlmIChzaG91bGRBYm9ydFNlc3Npb25TdHJlYW1PblN0b3AoYWN0aXZlLmlzU3RvcHBlZCkpIHtcbiAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSlcbiAgICAgIGNvbnN0IHsgYmxvY2tzLCByZW1haW5kZXIgfSA9IHNwbGl0U3NlQnVmZmVyKGJ1ZmZlcilcbiAgICAgIGJ1ZmZlciA9IHJlbWFpbmRlclxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2tzKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZEJsb2NrID0gcGFyc2VTc2VCbG9jayhsaW5lKVxuICAgICAgICBpZiAoIXBhcnNlZEJsb2NrKSBjb250aW51ZVxuXG4gICAgICAgIGNvbnN0IHsgZXZlbnRUeXBlLCBkYXRhU3RyIH0gPSBwYXJzZWRCbG9ja1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGF0YVN0cilcblxuICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICd0aGlua2luZyc6IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBpbmRleCwgZGVsdGE6IHRoaW5raW5nRGVsdGEgfSA9IHJlc29sdmVUaGlua2luZ0RlbHRhKGRhdGEpXG4gICAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRUaGlua2luZ1N0ZXAoaW5kZXgsIHRoaW5raW5nRGVsdGEpKSB7XG4gICAgICAgICAgICAgICAgcmVhc29uaW5nU3RvcmUuYXBwZW5kVGhpbmtpbmcocGxhY2Vob2xkZXJJZCwgaW5kZXgsIHRoaW5raW5nRGVsdGEpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFoYXNTdGFydGVkV3JpdGluZykge1xuICAgICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IHRydWUgfSlcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgaWYgKCFpc1VzaW5nU2tpbGwpIHtcbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCB7IHBoYXNlOiAndGhpbmtpbmcnLCBtZXNzYWdlOiBnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlKDAsIHQpIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraWxsIEAtbWVuY2lvbmFkYSAoYWwgYWJyaXIgZWwgc3RyZWFtKSBvIGxsYW1hZGEgYSBgZ2V0X3NraWxsYC5cbiAgICAgICAgICAgIGNhc2UgJ3VzaW5nX3NraWxsJzpcbiAgICAgICAgICAgICAgaWYgKCFoYXNTdGFydGVkV3JpdGluZykge1xuICAgICAgICAgICAgICAgIGlzVXNpbmdTa2lsbCA9IHRydWVcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRVc2luZ1NraWxsQWN0aXZpdHkodCwgZGF0YS5za2lsbCkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgLy8gRWwgYmFja2VuZCBkZXNjYXJ0YSBsbyBlbWl0aWRvIHkgcmVpbmljaWEgbGEgcmVzcHVlc3RhIGRlc2RlIGNlcm8uXG4gICAgICAgICAgICBjYXNlICdhbnN3ZXJfcmVzZXQnOlxuICAgICAgICAgICAgICBjbGVhclN0cmVhbUxpa2VBbnN3ZXJSZXNldCgpXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgJ3JlYXNvbmluZ19zdGVwJzoge1xuICAgICAgICAgICAgICBjb25zdCBzdGVwVG9vbCA9IHJlc29sdmVSZWFzb25pbmdTdGVwVG9vbChkYXRhKVxuICAgICAgICAgICAgICBjb25zdCBzdGVwVHlwZSA9IHJlc29sdmVSZWFzb25pbmdTdGVwVHlwZShkYXRhKVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkU2hvd1JlYXNvbmluZ1Rvb2xBY3Rpdml0eShzdGVwVG9vbCwgc3RlcFR5cGUsIGRhdGEuc3RhdHVzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVzb2x2ZVRvb2xBY3Rpb25MYWJlbChzdGVwVG9vbCwgdCwgJ3ByZXNlbnQnKVxuICAgICAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gc3RlcFRvb2wgPT09ICdnZXRfc2tpbGwnXG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAvLyBFbCBzdGVwIGRlIGBnZXRfc2tpbGxgIGxsZWdhIGp1c3RvIGRlc3B1w6lzIGRlIGB1c2luZ19za2lsbGA6IG1hbnRpZW5lIGVsIG5vbWJyZS5cbiAgICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID8gZ2V0VXNpbmdTa2lsbEFjdGl2aXR5KHQsIGRhdGEuYXJncz8ubmFtZSkgOiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogbGFiZWwgfVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkQXBwbHlSZWFzb25pbmdTdGVwSW5kZXgoZGF0YS5pKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBJbmRleCA9IGRhdGEuaVxuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmNhcHR1cmVMZWFkaW5nRnJvbUJvZHkocGxhY2Vob2xkZXJJZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmFwcGx5U3RlcChwbGFjZWhvbGRlcklkLCB7IC4uLmRhdGEsIGk6IHN0ZXBJbmRleCB9IGFzIFJlYXNvbmluZ1N0ZXBQYXlsb2FkKVxuICAgICAgICAgICAgICAgIGlmIChyZWFzb25pbmdTdG9yZS5zaG91bGRDbGVhclN0cmVhbUZvckxlYWRpbmcocGxhY2Vob2xkZXJJZCwgYWNjdW11bGF0ZWRDb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJTdHJlYW1MaWtlQW5zd2VyUmVzZXQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICd0b2tlbic6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSByZXNvbHZlU3RyZWFtVGV4dENodW5rKGRhdGEpXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnY29udGVudCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSByZXNvbHZlU3RyZWFtVGV4dENodW5rKGRhdGEpXG4gICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgYXBwbHlTdHJlYW1DaHVuayhjaHVuaylcbiAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGVMaWtlU3NlUGF5bG9hZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgICAgaXNVc2luZ1NraWxsID0gZmFsc2VcbiAgICAgICAgICAgICAgaWYgKGlzQWdlbnRUcmFuc2Zlck5vZGUoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVNZXNzYWdlID0gcmVzb2x2ZU5vZGVTdHJlYW1NZXNzYWdlKGRhdGEpXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5KFxuICAgICAgICAgICAgICAgICAgICAgIG5vZGVNZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIHQsXG4gICAgICAgICAgICAgICAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVOb2RlVGhyZWFkSWQoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSAnYXBwcm92YWxfcmVxdWlyZWQnOiB7XG4gICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgIC8vIFByZWFwcm9iYWRvIChhdXRvLWFwcHJvdmUgbyBkZXRlY2Npw7NuIG1hbnVhbCk6IGVsIHN0cmVhbSBubyBzZSBjb3J0YSxcbiAgICAgICAgICAgICAgLy8gc2lndWUgZWplY3V0YW5kbyBsYXMgYWNjaW9uZXMgc2luIGVzcGVyYXIgZGVjaXNpw7NuIGRlbCB1c3VhcmlvLlxuICAgICAgICAgICAgICBjb25zdCBpc1ByZUFwcHJvdmVkID0gaXNBcHByb3ZhbFByZUFwcHJvdmVkKGRhdGEpXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIGlmICghaXNQcmVBcHByb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJlYXNvbmluZ1N0b3JlLmZpbmlzaChwbGFjZWhvbGRlcklkLCAoZGF0YS5yZWFzb25pbmcgYXMgUmVhc29uaW5nVHJhY2VQYXlsb2FkIHwgbnVsbCkgPz8gbnVsbClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgbnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdhd2FpdGluZ19hcHByb3ZhbCcpXG4gICAgICAgICAgICAgIGNhbGxiYWNrcy5vbkFwcHJvdmFsUmVxdWlyZWQ/LihkYXRhIGFzIEFwcHJvdmFsUmVxdWVzdCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgICAgICBpZiAoc2hvdWxkUmVzdW1lSGl0bEFmdGVyUHJlQXBwcm92YWwoaXNQcmVBcHByb3ZlZCwgZGF0YS5wZW5kaW5nX2FjdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ3RoaW5raW5nJylcbiAgICAgICAgICAgICAgICBzdG9yZSgpLnNldEFjdGl2aXR5KHNlc3Npb25JZCwgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NTRSBFcnJvcjonLCBkYXRhLmVycm9yKVxuICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICAgICAgICBzdG9yZSgpLnNldEVycm9yKHNlc3Npb25JZCwgeyB0eXBlOiBkYXRhLmVycm9yPy50eXBlLCBtZXNzYWdlOiBkYXRhLmVycm9yPy5tZXNzYWdlIH0pXG4gICAgICAgICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LihkYXRhLmVycm9yPy50eXBlLCBkYXRhLmVycm9yPy5tZXNzYWdlKVxuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gU1NFIGV2ZW50IHR5cGU6JywgZXZlbnRUeXBlKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgU1NFIGRhdGE6JywgcGFyc2VFcnJvciwgZGF0YVN0cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmbHVzaFBlbmRpbmcoKVxuICB9XG59XG5cbi8qKlxuICogTWFuYWdlciBzaW5nbGV0b24gKG1vZHVsZS1sZXZlbCkgcXVlIGNvcnJlIE4gc3RyZWFtcyBkZWwgb3JjaGVzdHJhdG9yIGVuXG4gKiBwYXJhbGVsbywgdW5vIHBvciBgc2Vzc2lvbklkYC4gU29icmV2aXZlIGEgY2FtYmlvcyBkZSB2aXN0YSB5IGFsIGNpZXJyZSBkZWxcbiAqIG1vZGFsOiBsb3Mgc3RyZWFtcyBzb2xvIHNlIGNhbmNlbGFuIGNvbiBzdG9wIGV4cGzDrWNpdG8gZGVsIHVzdWFyaW8gbyBhbFxuICogY29tcGxldGFyL2Vycm9yYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXNzaW9uU3RyZWFtTWFuYWdlciA9IHtcbiAgaXNBY3RpdmU6IGlzU3RyZWFtQWN0aXZlLFxuICBnZXRBY3RpdmVDb3VudDogZ2V0QWN0aXZlU3RyZWFtQ291bnQsXG4gIGdldEFjdGl2ZVNlc3Npb25JZHM6ICgpOiBzdHJpbmdbXSA9PiBBcnJheS5mcm9tKGFjdGl2ZVN0cmVhbXMua2V5cygpKSxcblxuICBhc3luYyBzdGFydFN0cmVhbShwYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIHJlcXVlc3QsIGNhbGxiYWNrcywgdCwgYWN0aXZpdHlPcHRpb25zLCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgY29uc3Qgc3RhcnRHdWFyZCA9IHJlc29sdmVTdGFydFN0cmVhbUd1YXJkKFxuICAgICAgaXNTdHJlYW1BY3RpdmUoc2Vzc2lvbklkKSxcbiAgICAgIGdldEFjdGl2ZVN0cmVhbUNvdW50KCksXG4gICAgICBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TXG4gICAgKVxuICAgIGlmICghc3RhcnRHdWFyZC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiBzdGFydEd1YXJkLnJlYXNvbiB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi5wYXRjaE1ldGFBZ2VudEZpZWxkcyhhZ2VudElkLCBhZ2VudE5hbWUpLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICByZWFzb25pbmdTdG9yZS5zdGFydChwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLm9yY2hlc3RyYXRvcihyZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGF3YWl0IHBhcnNlU2Vzc2lvblNTRShyZXNwb25zZSwgYWN0aXZlLCBwYXJhbXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYWN0aXZlLmlzU3RvcHBlZCkge1xuICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdlcnJvcicpXG4gICAgICAgIGNhbGxiYWNrcy5vbkVycm9yPy4oKVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlc3VtZSBISVRMIChgY29udGludWUtdGhyZWFkYCkga2V5ZWQgcG9yIHNlc3Npb25JZCDigJQgbWlzbW8gbW90b3IgcXVlIG9yY2hlc3RyYXRvci4gKi9cbiAgYXN5bmMgc3RhcnRDb250aW51ZVN0cmVhbShwYXJhbXM6IFN0YXJ0Q29udGludWVTdHJlYW1QYXJhbXMpOiBQcm9taXNlPFN0YXJ0U3RyZWFtUmVzdWx0PiB7XG4gICAgZW5zdXJlU2Vzc2lvbk5vdGlmaWNhdGlvbnNJbml0aWFsaXplZCgpXG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCwgY29udGludWVSZXF1ZXN0LCBjYWxsYmFja3MsIHQsIGhpdGxFeGVjdXRpb25Db250ZXh0LCBhZ2VudElkLCBhZ2VudE5hbWUgfSA9IHBhcmFtc1xuXG4gICAgY29uc3QgY29udGludWVHdWFyZCA9IHJlc29sdmVTdGFydFN0cmVhbUd1YXJkKFxuICAgICAgaXNTdHJlYW1BY3RpdmUoc2Vzc2lvbklkKSxcbiAgICAgIGdldEFjdGl2ZVN0cmVhbUNvdW50KCksXG4gICAgICBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TXG4gICAgKVxuICAgIGlmICghY29udGludWVHdWFyZC5hbGxvd2VkKSB7XG4gICAgICByZXR1cm4geyBzdGFydGVkOiBmYWxzZSwgcmVhc29uOiBjb250aW51ZUd1YXJkLnJlYXNvbiB9XG4gICAgfVxuXG4gICAgaWYgKGhpdGxFeGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBzZXNzaW9uSGl0bENvbnRleHQuc2V0KHNlc3Npb25JZCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQpXG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgIGNvbnN0IGFjdGl2ZTogQWN0aXZlU3RyZWFtID0geyBzZXNzaW9uSWQsIGNvbnRyb2xsZXIsIGlzU3RvcHBlZDogZmFsc2UgfVxuICAgIGFjdGl2ZVN0cmVhbXMuc2V0KHNlc3Npb25JZCwgYWN0aXZlKVxuXG4gICAgc3RvcmUoKS5lbnN1cmVTZXNzaW9uKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHtcbiAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcbiAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAuLi5wYXRjaE1ldGFBZ2VudEZpZWxkcyhhZ2VudElkLCBhZ2VudE5hbWUpLFxuICAgIH0pXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAndGhpbmtpbmcnKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICBzdG9yZSgpLnNldEFjdGl2aXR5KFxuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkodCwgaGl0bEV4ZWN1dGlvbkNvbnRleHQgPz8gc2Vzc2lvbkhpdGxDb250ZXh0LmdldChzZXNzaW9uSWQpID8/IHVuZGVmaW5lZClcbiAgICApXG5cbiAgICBjb25zdCBzc2VQYXJhbXM6IFN0YXJ0U3RyZWFtUGFyYW1zID0ge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIHJlcXVlc3Q6IHt9IGFzIE9yY2hlc3RyYXRvclJlcXVlc3QsXG4gICAgICBjYWxsYmFja3MsXG4gICAgICB0LFxuICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ6IGhpdGxFeGVjdXRpb25Db250ZXh0ID8/IHNlc3Npb25IaXRsQ29udGV4dC5nZXQoc2Vzc2lvbklkKSxcbiAgICAgIGFnZW50SWQsXG4gICAgICBhZ2VudE5hbWUsXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFpYS5PcmNoZXN0cmF0b3IuY29udGludWVUaHJlYWQoY29udGludWVSZXF1ZXN0LCBjb250cm9sbGVyLnNpZ25hbClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb250aW51ZS10aHJlYWQgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGFyc2VTZXNzaW9uU1NFKHJlc3BvbnNlLCBhY3RpdmUsIHNzZVBhcmFtcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LigpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAgIHNlc3Npb25IaXRsQ29udGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSB9XG4gIH0sXG5cbiAgLyoqIFJlZ2VuZXJhIGxhIHJlc3B1ZXN0YSBkZSB1biB0dXJubyAoYHJldHJ5X2NvbXBsZXRpb25gKSDigJQgbWlzbW8gbW90b3IgU1NFIHF1ZSBvcmNoZXN0cmF0b3IuICovXG4gIGFzeW5jIHN0YXJ0UmV0cnlTdHJlYW0ocGFyYW1zOiBTdGFydFJldHJ5U3RyZWFtUGFyYW1zKTogUHJvbWlzZTxTdGFydFN0cmVhbVJlc3VsdD4ge1xuICAgIGVuc3VyZVNlc3Npb25Ob3RpZmljYXRpb25zSW5pdGlhbGl6ZWQoKVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQsIHJldHJ5UmVxdWVzdCwgY2FsbGJhY2tzLCB0LCBhY3Rpdml0eU9wdGlvbnMsIGFnZW50SWQsIGFnZW50TmFtZSB9ID0gcGFyYW1zXG5cbiAgICBjb25zdCByZXRyeUd1YXJkID0gcmVzb2x2ZVN0YXJ0U3RyZWFtR3VhcmQoXG4gICAgICBpc1N0cmVhbUFjdGl2ZShzZXNzaW9uSWQpLFxuICAgICAgZ2V0QWN0aXZlU3RyZWFtQ291bnQoKSxcbiAgICAgIE1BWF9DT05DVVJSRU5UX1NUUkVBTVNcbiAgICApXG4gICAgaWYgKCFyZXRyeUd1YXJkLmFsbG93ZWQpIHtcbiAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246IHJldHJ5R3VhcmQucmVhc29uIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgY29uc3QgYWN0aXZlOiBBY3RpdmVTdHJlYW0gPSB7IHNlc3Npb25JZCwgY29udHJvbGxlciwgaXNTdG9wcGVkOiBmYWxzZSB9XG4gICAgYWN0aXZlU3RyZWFtcy5zZXQoc2Vzc2lvbklkLCBhY3RpdmUpXG5cbiAgICBzdG9yZSgpLmVuc3VyZVNlc3Npb24oc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwge1xuICAgICAgcGxhY2Vob2xkZXJJZCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgIC4uLnBhdGNoTWV0YUFnZW50RmllbGRzKGFnZW50SWQsIGFnZW50TmFtZSksXG4gICAgfSlcbiAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICd0aGlua2luZycpXG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwgYWN0aXZpdHlPcHRpb25zID8/IHt9KSlcblxuICAgIGNvbnN0IHNzZVBhcmFtczogU3RhcnRTdHJlYW1QYXJhbXMgPSB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBwbGFjZWhvbGRlcklkLFxuICAgICAgcmVxdWVzdDoge30gYXMgT3JjaGVzdHJhdG9yUmVxdWVzdCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIHQsXG4gICAgICBhY3Rpdml0eU9wdGlvbnMsXG4gICAgICBhZ2VudElkLFxuICAgICAgYWdlbnROYW1lLFxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuT3JjaGVzdHJhdG9yLnJldHJ5Q29tcGxldGlvbihyZXRyeVJlcXVlc3QsIGNvbnRyb2xsZXIuc2lnbmFsKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgZGV0YWlsPzogc3RyaW5nIH1cbiAgICAgICAgICAgIGRldGFpbCA9IHR5cGVvZiBkYXRhLmRldGFpbCA9PT0gJ3N0cmluZycgPyBkYXRhLmRldGFpbCA6IHVuZGVmaW5lZFxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgZGV0YWlsID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1JldHJ5VHVybk5vdEZvdW5kUmVzcG9uc2UocmVzcG9uc2Uuc3RhdHVzLCBkZXRhaWwpKSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSwgcGxhY2Vob2xkZXJJZDogbnVsbCB9KVxuICAgICAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgICAgICBzdG9yZSgpLnNldFN0YXR1cyhzZXNzaW9uSWQsICdpZGxlJylcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0ZWQ6IGZhbHNlLCByZWFzb246ICd0dXJuX25vdF9mb3VuZCcgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJldHJ5X2NvbXBsZXRpb24gZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuICAgICAgYXdhaXQgcGFyc2VTZXNzaW9uU1NFKHJlc3BvbnNlLCBhY3RpdmUsIHNzZVBhcmFtcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFhY3RpdmUuaXNTdG9wcGVkKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgICAgc3RvcmUoKS5wYXRjaE1ldGEoc2Vzc2lvbklkLCB7IGlzTG9hZGluZzogZmFsc2UsIGlzV3JpdGluZzogZmFsc2UgfSlcbiAgICAgICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgICAgIHN0b3JlKCkuc2V0U3RhdHVzKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgICAgY2FsbGJhY2tzLm9uRXJyb3I/LigpXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGFydGVkOiB0cnVlIH1cbiAgfSxcblxuICAvKiogQ2FuY2VsYWNpw7NuIGV4cGzDrWNpdGEgZGVsIHVzdWFyaW8gKG1lbnNhamUgXCJjYW5jZWxhZG9cIikuICovXG4gIHN0b3BTdHJlYW0oc2Vzc2lvbklkOiBzdHJpbmcsIGNhbGxiYWNrcz86IFNlc3Npb25TdHJlYW1DYWxsYmFja3MpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBhY3RpdmVTdHJlYW1zLmdldChzZXNzaW9uSWQpXG4gICAgaWYgKCFhY3RpdmUpIHJldHVyblxuICAgIGFjdGl2ZS5pc1N0b3BwZWQgPSB0cnVlXG4gICAgYWN0aXZlLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHNlc3Npb25JZClcbiAgICAvLyBFbCBwYXJjaWFsIHNlIHJlc2NhdGEgYW50ZXMgZGUgbGltcGlhcjogZWwgYmFja2VuZCBsbyBwZXJzaXN0ZSwgcGVybyBzaSBubyBsb1xuICAgIC8vIHBhc2Ftb3MgYWwgY2FsbGJhY2sgZGVzYXBhcmVjZSBkZSBwYW50YWxsYSBoYXN0YSBlbCBwcsOzeGltbyBmZXRjaCBkZSBsYSBzZXNpw7NuLlxuICAgIGNvbnN0IHBhcnRpYWxUZXh0ID0gc2Vzc2lvblN0cmVhbWluZ1RleHQuZ2V0U25hcHNob3Qoc2Vzc2lvbklkKS50ZXh0XG4gICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgIHN0b3JlKCkucGF0Y2hNZXRhKHNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgc3RvcmUoKS5zZXRBY3Rpdml0eShzZXNzaW9uSWQsIG51bGwpXG4gICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnY2FuY2VsbGVkJylcbiAgICBjYWxsYmFja3M/Lm9uU3RvcD8uKHBhcnRpYWxUZXh0KVxuICB9LFxuXG4gIC8qKiBBYm9ydGEgc2luIG1hcmNhciBcImNhbmNlbGFkb1wiICh1c28gaW50ZXJubyAvIGxpbXBpZXphKS4gKi9cbiAgYWJvcnRTaWxlbnRseShzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZVN0cmVhbXMuZ2V0KHNlc3Npb25JZClcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuXG4gICAgYWN0aXZlLmlzU3RvcHBlZCA9IHRydWVcbiAgICBhY3RpdmUuY29udHJvbGxlci5hYm9ydCgpXG4gICAgYWN0aXZlU3RyZWFtcy5kZWxldGUoc2Vzc2lvbklkKVxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICBzdG9yZSgpLnBhdGNoTWV0YShzZXNzaW9uSWQsIHsgaXNMb2FkaW5nOiBmYWxzZSwgaXNXcml0aW5nOiBmYWxzZSB9KVxuICAgIHN0b3JlKCkuc2V0QWN0aXZpdHkoc2Vzc2lvbklkLCBudWxsKVxuICAgIGlmIChzaG91bGRTZXRJZGxlT25TaWxlbnRBYm9ydChzdG9yZSgpLmdldE1ldGEoc2Vzc2lvbklkKT8uc3RhdHVzKSkge1xuICAgICAgc3RvcmUoKS5zZXRTdGF0dXMoc2Vzc2lvbklkLCAnaWRsZScpXG4gICAgfVxuICB9LFxuXG4gIGFib3J0QWxsKCkge1xuICAgIEFycmF5LmZyb20oYWN0aXZlU3RyZWFtcy5rZXlzKCkpLmZvckVhY2goc2Vzc2lvbklkID0+IHRoaXMuYWJvcnRTaWxlbnRseShzZXNzaW9uSWQpKVxuICB9LFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLElBQUksTUFBTSxxQkFBcUI7QUFFdEMsU0FDRUMsd0JBQXdCLEVBQ3hCQyx5QkFBeUIsRUFDekJDLHFCQUFxQixFQUNyQkMsd0JBQXdCLEVBQ3hCQyw2QkFBNkIsRUFDN0JDLGdDQUFnQyxFQUNoQ0Msc0JBQXNCLFFBQ2pCLG9DQUFvQztBQUUzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBQ3pGLFNBQVNDLGNBQWMsUUFBUSwrQkFBK0I7QUFFOUQsU0FBU0Msb0JBQW9CLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLGdCQUFnQixRQUFRLG9CQUFvQjtBQUNyRCxTQUFTQyxxQ0FBcUMsUUFBUSx3QkFBd0I7QUFDOUUsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQXNCO0FBRXpELFNBQ0VDLHlCQUF5QixFQUN6QkMsbUJBQW1CLEVBQ25CQyxxQkFBcUIsRUFDckJDLDJCQUEyQixFQUMzQkMsYUFBYSxFQUNiQyxvQkFBb0IsRUFDcEJDLHdCQUF3QixFQUN4QkMsbUJBQW1CLEVBQ25CQyx3QkFBd0IsRUFDeEJDLHdCQUF3QixFQUN4QkMsdUJBQXVCLEVBQ3ZCQyxzQkFBc0IsRUFDdEJDLG9CQUFvQixFQUNwQkMsOEJBQThCLEVBQzlCQyw2QkFBNkIsRUFDN0JDLHdCQUF3QixFQUN4QkMsZ0NBQWdDLEVBQ2hDQywwQkFBMEIsRUFDMUJDLCtCQUErQixFQUMvQkMsY0FBYyxRQUNULGdDQUFnQzs7QUFNdkM7O0FBcURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxJQUFNQyxzQkFBc0IsR0FBRyxDQUFDO0FBRXZDLElBQU1DLGtCQUFrQixHQUFHLEVBQUU7QUFFN0IsSUFBTUMsYUFBYSxHQUFHLElBQUlDLEdBQUcsQ0FBdUIsQ0FBQztBQUVyRCxJQUFNQyxLQUFLLEdBQUcsU0FBUkEsS0FBS0EsQ0FBQTtFQUFBLE9BQVMzQixnQkFBZ0IsQ0FBQzRCLFFBQVEsQ0FBQyxDQUFDO0FBQUE7QUFFL0MsSUFBTUMsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFJQyxTQUFpQjtFQUFBLE9BQWNMLGFBQWEsQ0FBQ00sR0FBRyxDQUFDRCxTQUFTLENBQUM7QUFBQTtBQUVuRixJQUFNRSxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFBO0VBQUEsT0FBaUJQLGFBQWEsQ0FBQ1EsSUFBSTtBQUFBO0FBRTdELElBQU1DLGVBQWU7RUFBQSxJQUFBQyxJQUFBLEdBQUFDLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsQ0FBRyxTQUFBQyxRQUFPQyxRQUFrQixFQUFFQyxNQUFvQixFQUFFQyxNQUF5QjtJQUFBLElBQUFDLHFCQUFBLEVBQUFDLGNBQUEsRUFBQUMsV0FBQSxFQUFBQyxZQUFBLEVBQUFDLGtCQUFBLEVBQUFDLFlBQUEsRUFBQUMsWUFBQTtJQUFBLElBQUFuQixTQUFBLEVBQUFvQixhQUFBLEVBQUFDLFNBQUEsRUFBQUMsQ0FBQSxFQUFBQyxvQkFBQSxFQUFBQyxjQUFBLEVBQUFDLGFBQUEsRUFBQUMsYUFBQSxFQUFBQyxhQUFBLEVBQUFDLFlBQUEsRUFBQUMsTUFBQSxFQUFBQyxPQUFBLEVBQUFDLE1BQUEsRUFBQUMsa0JBQUEsRUFBQUMsaUJBQUEsRUFBQUMsWUFBQSxFQUFBQyxvQkFBQSxFQUFBQyxnQkFBQSxFQUFBQywwQkFBQSxFQUFBQyxtQkFBQSxFQUFBQyxrQkFBQSxFQUFBQyxJQUFBLEVBQUFDLEtBQUEsRUFBQUMsZUFBQSxFQUFBQyxNQUFBLEVBQUFDLFNBQUEsRUFBQUMsU0FBQSxFQUFBQyxLQUFBLEVBQUFDLElBQUEsRUFBQUMsV0FBQSxFQUFBQyxTQUFBLEVBQUFDLE9BQUEsRUFBQUMsSUFBQSxFQUFBQyxxQkFBQSxFQUFBQyxLQUFBLEVBQUFDLGFBQUEsRUFBQUMsUUFBQSxFQUFBQyxRQUFBLEVBQUFDLEtBQUEsRUFBQUMsVUFBQSxFQUFBQyxTQUFBLEVBQUFDLEtBQUEsRUFBQUMsTUFBQSxFQUFBQyxXQUFBLEVBQUFDLHFCQUFBLEVBQUFDLGFBQUEsRUFBQUMsS0FBQSxFQUFBQyxFQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtJQUFBLE9BQUE3RCxtQkFBQSxDQUFBOEQsSUFBQSxXQUFBQyxRQUFBO01BQUEsa0JBQUFBLFFBQUEsQ0FBQUMsSUFBQSxHQUFBRCxRQUFBLENBQUFFLElBQUE7UUFBQTtVQUN4RnhFLFNBQVMsR0FBa0NZLE1BQU0sQ0FBakRaLFNBQVMsRUFBRW9CLGFBQWEsR0FBbUJSLE1BQU0sQ0FBdENRLGFBQWEsRUFBRUMsU0FBUyxHQUFRVCxNQUFNLENBQXZCUyxTQUFTLEVBQUVDLENBQUMsR0FBS1YsTUFBTSxDQUFaVSxDQUFDO1VBQ3hDQyxvQkFBb0IsSUFBQVYscUJBQUEsR0FBR0QsTUFBTSxDQUFDVyxvQkFBb0IsY0FBQVYscUJBQUEsY0FBQUEscUJBQUEsR0FBSXpDLGtCQUFrQixDQUFDcUcsR0FBRyxDQUFDekUsU0FBUyxDQUFDO1VBRXpGd0IsY0FBNkIsR0FBRyxJQUFJO1VBQ3BDQyxhQUE0QixHQUFHLElBQUk7VUFFakNDLGFBQWEsR0FBRyxTQUFoQkEsYUFBYUEsQ0FBSWdELE9BQWUsRUFBSztZQUFBLElBQUFDLHFCQUFBO1lBQ3pDMUcsb0JBQW9CLENBQUMyRyxPQUFPLENBQUM1RSxTQUFTLEVBQUVvQixhQUFhLEVBQUVzRCxPQUFPLENBQUM7WUFDL0QsQ0FBQUMscUJBQUEsR0FBQXRELFNBQVMsQ0FBQ3dELGNBQWMsY0FBQUYscUJBQUEsZUFBeEJBLHFCQUFBLENBQUFHLElBQUEsQ0FBQXpELFNBQVMsRUFBa0JxRCxPQUFPLENBQUM7VUFDckMsQ0FBQztVQUVLL0MsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFJK0MsT0FBZSxFQUFLO1lBQ3pDbEQsY0FBYyxHQUFHa0QsT0FBTztZQUN4QixJQUFJakQsYUFBYSxJQUFJLElBQUksRUFBRTtZQUMzQkEsYUFBYSxHQUFHc0QsTUFBTSxDQUFDQyxVQUFVLENBQUMsWUFBTTtjQUN0Q3ZELGFBQWEsR0FBRyxJQUFJO2NBQ3BCLElBQUlELGNBQWMsSUFBSSxJQUFJLEVBQUU7Z0JBQzFCLElBQU15RCxNQUFNLEdBQUd6RCxjQUFjO2dCQUM3QkEsY0FBYyxHQUFHLElBQUk7Z0JBQ3JCRSxhQUFhLENBQUN1RCxNQUFNLENBQUM7Y0FDdkI7WUFDRixDQUFDLEVBQUV2RixrQkFBa0IsQ0FBQztVQUN4QixDQUFDO1VBRUtrQyxZQUFZLEdBQUcsU0FBZkEsWUFBWUEsQ0FBQSxFQUFTO1lBQ3pCLElBQUlILGFBQWEsSUFBSSxJQUFJLEVBQUU7Y0FDekJzRCxNQUFNLENBQUNHLFlBQVksQ0FBQ3pELGFBQWEsQ0FBQztjQUNsQ0EsYUFBYSxHQUFHLElBQUk7WUFDdEI7WUFDQSxJQUFJRCxjQUFjLElBQUksSUFBSSxFQUFFO2NBQzFCLElBQU15RCxNQUFNLEdBQUd6RCxjQUFjO2NBQzdCQSxjQUFjLEdBQUcsSUFBSTtjQUNyQkUsYUFBYSxDQUFDdUQsTUFBTSxDQUFDO1lBQ3ZCO1VBQ0YsQ0FBQztVQUVLcEQsTUFBTSxJQUFBZixjQUFBLEdBQUdKLFFBQVEsQ0FBQ3lFLElBQUksY0FBQXJFLGNBQUEsdUJBQWJBLGNBQUEsQ0FBZXNFLFNBQVMsQ0FBQyxDQUFDO1VBQUEsSUFDcEN2RCxNQUFNO1lBQUF5QyxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsTUFDSCxJQUFJYSxLQUFLLENBQUMscUJBQXFCLENBQUM7UUFBQTtVQUdsQ3ZELE9BQU8sR0FBRyxJQUFJd0QsV0FBVyxDQUFDLENBQUM7VUFDN0J2RCxNQUFNLEdBQUcsRUFBRTtVQUNYQyxrQkFBa0IsR0FBRyxFQUFFO1VBQ3ZCQyxpQkFBaUIsR0FBRyxLQUFLLEVBQzdCO1VBQ0E7VUFDSUMsWUFBWSxHQUFHLEtBQUs7VUFFbEJDLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBb0JBLENBQUEsRUFBUztZQUFBLElBQUFvRCxxQkFBQTtZQUNqQyxJQUFJdEQsaUJBQWlCLEVBQUU7WUFDdkJBLGlCQUFpQixHQUFHLElBQUk7WUFDeEJwQyxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2NBQUV5RixTQUFTLEVBQUUsSUFBSTtjQUFFQyxTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDbEU3RixLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLFNBQVMsQ0FBQztZQUN2Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRXRDLHdCQUF3QixDQUFDNEQsQ0FBQyxDQUFDLENBQUM7WUFDM0QsQ0FBQWlFLHFCQUFBLEdBQUFsRSxTQUFTLENBQUN3RSxjQUFjLGNBQUFOLHFCQUFBLGVBQXhCQSxxQkFBQSxDQUFBVCxJQUFBLENBQUF6RCxTQUEyQixDQUFDO1VBQzlCLENBQUM7VUFFS2UsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFnQkEsQ0FBSXdCLEtBQWEsRUFBSztZQUMxQyxJQUFJLENBQUNBLEtBQUssRUFBRTtZQUNaNUIsa0JBQWtCLEdBQUdqRSxnQkFBZ0IsQ0FBQ2lFLGtCQUFrQixFQUFFNEIsS0FBSyxDQUFDO1lBQ2hFNUYsY0FBYyxDQUFDOEgsaUJBQWlCLENBQUMxRSxhQUFhLEVBQUVZLGtCQUFrQixDQUFDO1lBQ25FTCxhQUFhLENBQUNLLGtCQUFrQixDQUFDO1VBQ25DLENBQUM7VUFFS0ssMEJBQTBCLEdBQUcsU0FBN0JBLDBCQUEwQkEsQ0FBQSxFQUFTO1lBQ3ZDLElBQUlaLGFBQWEsSUFBSSxJQUFJLEVBQUU7Y0FDekJzRCxNQUFNLENBQUNHLFlBQVksQ0FBQ3pELGFBQWEsQ0FBQztjQUNsQ0EsYUFBYSxHQUFHLElBQUk7WUFDdEI7WUFDQUQsY0FBYyxHQUFHLElBQUk7WUFDckJRLGtCQUFrQixHQUFHLEVBQUU7WUFDdkJOLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDakIxRCxjQUFjLENBQUMrSCxlQUFlLENBQUMzRSxhQUFhLENBQUM7VUFDL0MsQ0FBQztVQUVLa0IsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFtQkEsQ0FBSTBELE9BQWdDLEVBQUs7WUFBQSxJQUFBQyxxQkFBQTtZQUNoRSxJQUFNQyxhQUFhLEdBQUc3SCx5QkFBeUIsQ0FBQzJILE9BQU8sRUFBRWhFLGtCQUFrQixDQUFDO1lBRTVFaEUsY0FBYyxDQUFDbUksTUFBTSxDQUFDL0UsYUFBYSxFQUFFOEUsYUFBYSxDQUFDRSxTQUFTLENBQUM7WUFDN0R4RSxZQUFZLENBQUMsQ0FBQztZQUNkL0IsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtjQUFFeUYsU0FBUyxFQUFFLEtBQUs7Y0FBRUMsU0FBUyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1lBQ3BFN0YsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRSxJQUFJLENBQUM7WUFDcENILEtBQUssQ0FBQyxDQUFDLENBQUM4RixTQUFTLENBQUMzRixTQUFTLEVBQUUsVUFBVSxDQUFDO1lBRXhDLENBQUFpRyxxQkFBQSxHQUFBNUUsU0FBUyxDQUFDZ0YsY0FBYyxjQUFBSixxQkFBQSxlQUF4QkEscUJBQUEsQ0FBQW5CLElBQUEsQ0FBQXpELFNBQVMsRUFBa0I2RSxhQUFhLENBQUM7O1lBRXpDO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1VBQ0YsQ0FBQztVQUFBNUIsUUFBQSxDQUFBQyxJQUFBO1FBQUE7VUFBQSxLQUdRLElBQUk7WUFBQUQsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUFBLEtBQ0x0Riw4QkFBOEIsQ0FBQ3lCLE1BQU0sQ0FBQzJGLFNBQVMsQ0FBQztZQUFBaEMsUUFBQSxDQUFBRSxJQUFBO1lBQUE7VUFBQTtVQUNsRDNDLE1BQU0sQ0FBQzBFLE1BQU0sQ0FBQyxDQUFDO1VBQUEsT0FBQWpDLFFBQUEsQ0FBQWtDLE1BQUE7UUFBQTtVQUFBbEMsUUFBQSxDQUFBRSxJQUFBO1VBQUEsT0FJYTNDLE1BQU0sQ0FBQzRFLElBQUksQ0FBQyxDQUFDO1FBQUE7VUFBQWxFLGtCQUFBLEdBQUErQixRQUFBLENBQUFvQyxJQUFBO1VBQW5DbEUsSUFBSSxHQUFBRCxrQkFBQSxDQUFKQyxJQUFJO1VBQUVDLEtBQUssR0FBQUYsa0JBQUEsQ0FBTEUsS0FBSztVQUFBLEtBQ2ZELElBQUk7WUFBQThCLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBRixRQUFBLENBQUFrQyxNQUFBO1FBQUE7VUFBQSxLQUVKdEgsOEJBQThCLENBQUN5QixNQUFNLENBQUMyRixTQUFTLENBQUM7WUFBQWhDLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFDbEQzQyxNQUFNLENBQUMwRSxNQUFNLENBQUMsQ0FBQztVQUFBLE9BQUFqQyxRQUFBLENBQUFrQyxNQUFBO1FBQUE7VUFJakJ6RSxNQUFNLElBQUlELE9BQU8sQ0FBQzZFLE1BQU0sQ0FBQ2xFLEtBQUssRUFBRTtZQUFFbUUsTUFBTSxFQUFFO1VBQUssQ0FBQyxDQUFDO1VBQUFsRSxlQUFBLEdBQ25CbEQsY0FBYyxDQUFDdUMsTUFBTSxDQUFDLEVBQTVDWSxNQUFNLEdBQUFELGVBQUEsQ0FBTkMsTUFBTSxFQUFFQyxTQUFTLEdBQUFGLGVBQUEsQ0FBVEUsU0FBUztVQUN6QmIsTUFBTSxHQUFHYSxTQUFTO1VBQUFDLFNBQUEsR0FBQWdFLDBCQUFBLENBRUNsRSxNQUFNO1VBQUEyQixRQUFBLENBQUFDLElBQUE7VUFBQTFCLFNBQUEsQ0FBQWlFLENBQUE7UUFBQTtVQUFBLEtBQUFoRSxLQUFBLEdBQUFELFNBQUEsQ0FBQWtFLENBQUEsSUFBQXZFLElBQUE7WUFBQThCLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7VUFBZHpCLElBQUksR0FBQUQsS0FBQSxDQUFBTCxLQUFBO1VBQ1BPLFdBQVcsR0FBR3ZFLGFBQWEsQ0FBQ3NFLElBQUksQ0FBQztVQUFBLElBQ2xDQyxXQUFXO1lBQUFzQixRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1VBQUEsT0FBQUYsUUFBQSxDQUFBa0MsTUFBQTtRQUFBO1VBRVJ2RCxTQUFTLEdBQWNELFdBQVcsQ0FBbENDLFNBQVMsRUFBRUMsT0FBTyxHQUFLRixXQUFXLENBQXZCRSxPQUFPO1VBQUFvQixRQUFBLENBQUFDLElBQUE7VUFHbEJwQixJQUFJLEdBQUc2RCxJQUFJLENBQUNDLEtBQUssQ0FBQy9ELE9BQU8sQ0FBQztVQUFBZ0IsRUFBQSxHQUV4QmpCLFNBQVM7VUFBQXFCLFFBQUEsQ0FBQUUsSUFBQSxHQUFBTixFQUFBLEtBQ1YsVUFBVSxRQUFBQSxFQUFBLEtBZ0JWLGFBQWEsUUFBQUEsRUFBQSxLQVViLGNBQWMsUUFBQUEsRUFBQSxLQUlkLGdCQUFnQixRQUFBQSxFQUFBLEtBMEJoQixPQUFPLFFBQUFBLEVBQUEsS0FPUCxTQUFTLFFBQUFBLEVBQUEsS0FVVCxNQUFNLFFBQUFBLEVBQUEsS0F1Qk4sVUFBVSxRQUFBQSxFQUFBLEtBSVYsbUJBQW1CLFFBQUFBLEVBQUEsS0FzQm5CLE9BQU87VUFBQTtRQUFBO1VBQUFkLHFCQUFBLEdBekg4Qm5FLG9CQUFvQixDQUFDa0UsSUFBSSxDQUFDLEVBQTFERSxLQUFLLEdBQUFELHFCQUFBLENBQUxDLEtBQUssRUFBU0MsYUFBYSxHQUFBRixxQkFBQSxDQUFwQjhELEtBQUs7VUFDcEIsSUFBSTlILHdCQUF3QixDQUFDaUUsS0FBSyxFQUFFQyxhQUFhLENBQUMsRUFBRTtZQUNsRHRGLGNBQWMsQ0FBQ21KLGNBQWMsQ0FBQy9GLGFBQWEsRUFBRWlDLEtBQUssRUFBRUMsYUFBYSxDQUFDO1VBQ3BFO1VBQ0EsSUFBSSxDQUFDckIsaUJBQWlCLEVBQUU7WUFDdEJwQyxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2NBQUV5RixTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDakQ1RixLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4QyxJQUFJLENBQUNrQyxZQUFZLEVBQUU7Y0FDakJyQyxLQUFLLENBQUMsQ0FBQyxDQUFDK0YsV0FBVyxDQUFDNUYsU0FBUyxFQUFFO2dCQUFFb0gsS0FBSyxFQUFFLFVBQVU7Z0JBQUVDLE9BQU8sRUFBRTdKLHlCQUF5QixDQUFDLENBQUMsRUFBRThELENBQUM7Y0FBRSxDQUFDLENBQUM7WUFDakc7VUFDRjtVQUFDLE9BQUFnRCxRQUFBLENBQUFrQyxNQUFBO1FBQUE7VUFNRCxJQUFJLENBQUN2RSxpQkFBaUIsRUFBRTtZQUN0QkMsWUFBWSxHQUFHLElBQUk7WUFDbkJyQyxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2NBQUV5RixTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDakQ1RixLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRXZDLHFCQUFxQixDQUFDNkQsQ0FBQyxFQUFFNkIsSUFBSSxDQUFDbUUsS0FBSyxDQUFDLENBQUM7VUFDdEU7VUFBQyxPQUFBaEQsUUFBQSxDQUFBa0MsTUFBQTtRQUFBO1VBS0RuRSwwQkFBMEIsQ0FBQyxDQUFDO1VBQUEsT0FBQWlDLFFBQUEsQ0FBQWtDLE1BQUE7UUFBQTtVQUl0QmpELFFBQVEsR0FBRzFFLHdCQUF3QixDQUFDc0UsSUFBSSxDQUFDO1VBQ3pDSyxRQUFRLEdBQUcxRSx3QkFBd0IsQ0FBQ3FFLElBQUksQ0FBQztVQUMvQyxJQUFJNUQsK0JBQStCLENBQUNnRSxRQUFRLEVBQUVDLFFBQVEsRUFBRUwsSUFBSSxDQUFDb0UsTUFBTSxDQUFDLEVBQUU7WUFDOUQ5RCxLQUFLLEdBQUc1RixzQkFBc0IsQ0FBQzBGLFFBQVEsRUFBRWpDLENBQUMsRUFBRSxTQUFTLENBQUM7WUFDNUQsSUFBSW1DLEtBQUssRUFBRTtjQUNUdkIsWUFBWSxHQUFHcUIsUUFBUSxLQUFLLFdBQVc7Y0FDdkMxRCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFO2NBQUssQ0FBQyxDQUFDO2NBQ2pEO2NBQ0E1RixLQUFLLENBQUMsQ0FBQyxDQUFDK0YsV0FBVyxDQUNqQjVGLFNBQVMsRUFDVGtDLFlBQVksR0FBR3pFLHFCQUFxQixDQUFDNkQsQ0FBQyxHQUFBb0MsVUFBQSxHQUFFUCxJQUFJLENBQUNxRSxJQUFJLGNBQUE5RCxVQUFBLHVCQUFUQSxVQUFBLENBQVcrRCxJQUFJLENBQUMsR0FBRztnQkFBRUwsS0FBSyxFQUFFLFFBQVE7Z0JBQUVDLE9BQU8sRUFBRTVEO2NBQU0sQ0FDL0YsQ0FBQztZQUNIO1VBQ0Y7VUFDQSxJQUFJdEUsNkJBQTZCLENBQUNnRSxJQUFJLENBQUN1RSxDQUFDLENBQUMsRUFBRTtZQUNuQy9ELFNBQVMsR0FBR1IsSUFBSSxDQUFDdUUsQ0FBQztZQUN4QjFKLGNBQWMsQ0FBQzJKLHNCQUFzQixDQUFDdkcsYUFBYSxFQUFFWSxrQkFBa0IsQ0FBQztZQUN4RWhFLGNBQWMsQ0FBQzRKLFNBQVMsQ0FBQ3hHLGFBQWEsRUFBQXlHLGFBQUEsQ0FBQUEsYUFBQSxLQUFPMUUsSUFBSTtjQUFFdUUsQ0FBQyxFQUFFL0Q7WUFBUyxFQUEwQixDQUFDO1lBQzFGLElBQUkzRixjQUFjLENBQUM4SiwyQkFBMkIsQ0FBQzFHLGFBQWEsRUFBRVksa0JBQWtCLENBQUMsRUFBRTtjQUNqRkssMEJBQTBCLENBQUMsQ0FBQztZQUM5QjtVQUNGO1VBQUMsT0FBQWlDLFFBQUEsQ0FBQWtDLE1BQUE7UUFBQTtVQUtLNUMsS0FBSyxHQUFHNUUsc0JBQXNCLENBQUNtRSxJQUFJLENBQUM7VUFDMUNoQixvQkFBb0IsQ0FBQyxDQUFDO1VBQ3RCQyxnQkFBZ0IsQ0FBQ3dCLEtBQUssQ0FBQztVQUFBLE9BQUFVLFFBQUEsQ0FBQWtDLE1BQUE7UUFBQTtVQUtqQjVDLE1BQUssR0FBRzVFLHNCQUFzQixDQUFDbUUsSUFBSSxDQUFDO1VBQzFDaEIsb0JBQW9CLENBQUMsQ0FBQztVQUN0QkMsZ0JBQWdCLENBQUN3QixNQUFLLENBQUM7VUFDdkIsSUFBSTlGLHdCQUF3QixDQUFDcUYsSUFBSSxDQUFDLEVBQUU7WUFDbENiLG1CQUFtQixDQUFDYSxJQUFJLENBQUM7VUFDM0I7VUFBQyxPQUFBbUIsUUFBQSxDQUFBa0MsTUFBQTtRQUFBO1VBS0R0RSxZQUFZLEdBQUcsS0FBSztVQUNwQixJQUFJNUQsbUJBQW1CLENBQUM2RSxJQUFJLENBQUMsRUFBRTtZQUM3QnRELEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUU7Y0FBRXlGLFNBQVMsRUFBRTtZQUFLLENBQUMsQ0FBQztZQUNqRDVGLEtBQUssQ0FBQyxDQUFDLENBQUM4RixTQUFTLENBQUMzRixTQUFTLEVBQUUsVUFBVSxDQUFDO1VBQzFDLENBQUMsTUFBTTtZQUNDOEQsV0FBVyxHQUFHbkYsd0JBQXdCLENBQUN3RSxJQUFJLENBQUM7WUFDbEQsSUFBSVcsV0FBVyxFQUFFO2NBQ2ZqRSxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFO2NBQUssQ0FBQyxDQUFDO2NBQ2pENUYsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFNBQVMsQ0FBQzNGLFNBQVMsRUFBRSxVQUFVLENBQUM7Y0FDeENILEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQ2pCNUYsU0FBUyxFQUNUckMsNkJBQTZCLENBQzNCbUcsV0FBVyxFQUNYeEMsQ0FBQyxFQUNEQyxvQkFBb0IsYUFBcEJBLG9CQUFvQixjQUFwQkEsb0JBQW9CLEdBQUl3RyxTQUFTLEVBQ2pDbkosbUJBQW1CLENBQUN1RSxJQUFJLENBQzFCLENBQ0YsQ0FBQztZQUNIO1VBQ0Y7VUFBQyxPQUFBbUIsUUFBQSxDQUFBa0MsTUFBQTtRQUFBO1VBSURsRSxtQkFBbUIsQ0FBQ2EsSUFBSSxDQUFDO1VBQUEsT0FBQW1CLFFBQUEsQ0FBQWtDLE1BQUE7UUFBQTtVQUl6QjVFLFlBQVksQ0FBQyxDQUFDO1VBQ2Q7VUFDQTtVQUNNb0MsYUFBYSxHQUFHekYscUJBQXFCLENBQUM0RSxJQUFJLENBQUM7VUFDakR0RCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO1lBQUUwRixTQUFTLEVBQUU7VUFBTSxDQUFDLENBQUM7VUFDbEQsSUFBSSxDQUFDMUIsYUFBYSxFQUFFO1lBQ2xCaEcsY0FBYyxDQUFDbUksTUFBTSxDQUFDL0UsYUFBYSxHQUFBNkMsS0FBQSxHQUFHZCxJQUFJLENBQUNpRCxTQUFTLGNBQUFuQyxLQUFBLGNBQUFBLEtBQUEsR0FBcUMsSUFBSSxDQUFDO1lBQzlGcEUsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtjQUFFeUYsU0FBUyxFQUFFO1lBQU0sQ0FBQyxDQUFDO1lBQ2xEeEgsb0JBQW9CLENBQUMrSixLQUFLLENBQUNoSSxTQUFTLENBQUM7WUFDckNILEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQUM1RixTQUFTLEVBQUUsSUFBSSxDQUFDO1VBQ3RDO1VBQ0FILEtBQUssQ0FBQyxDQUFDLENBQUM4RixTQUFTLENBQUMzRixTQUFTLEVBQUUsbUJBQW1CLENBQUM7VUFDakQsQ0FBQStELHFCQUFBLEdBQUExQyxTQUFTLENBQUM0RyxrQkFBa0IsY0FBQWxFLHFCQUFBLGVBQTVCQSxxQkFBQSxDQUFBZSxJQUFBLENBQUF6RCxTQUFTLEVBQXNCOEIsSUFBSSxFQUFxQm5CLGtCQUFrQixDQUFDO1VBQzNFLElBQUkzQyxnQ0FBZ0MsQ0FBQzJFLGFBQWEsRUFBRWIsSUFBSSxDQUFDK0UsZUFBZSxDQUFDLEVBQUU7WUFDekVySSxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2NBQUV5RixTQUFTLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDakQ1RixLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLFVBQVUsQ0FBQztZQUN4Q0gsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRXBDLGdDQUFnQyxDQUFDMEQsQ0FBQyxFQUFFQyxvQkFBb0IsYUFBcEJBLG9CQUFvQixjQUFwQkEsb0JBQW9CLEdBQUl3RyxTQUFTLENBQUMsQ0FBQztVQUN4RztVQUFDLE9BQUF6RCxRQUFBLENBQUFrQyxNQUFBO1FBQUE7VUFLRDJCLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLFlBQVksRUFBRWpGLElBQUksQ0FBQ2lGLEtBQUssQ0FBQztVQUN2Q3hHLFlBQVksQ0FBQyxDQUFDO1VBQ2QzRCxvQkFBb0IsQ0FBQytKLEtBQUssQ0FBQ2hJLFNBQVMsQ0FBQztVQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtZQUFFeUYsU0FBUyxFQUFFLEtBQUs7WUFBRUMsU0FBUyxFQUFFO1VBQU0sQ0FBQyxDQUFDO1VBQ3BFN0YsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRSxJQUFJLENBQUM7VUFDcENILEtBQUssQ0FBQyxDQUFDLENBQUN3SSxRQUFRLENBQUNySSxTQUFTLEVBQUU7WUFBRXNJLElBQUksR0FBQXZILFdBQUEsR0FBRW9DLElBQUksQ0FBQ2lGLEtBQUssY0FBQXJILFdBQUEsdUJBQVZBLFdBQUEsQ0FBWXVILElBQUk7WUFBRWpCLE9BQU8sR0FBQXJHLFlBQUEsR0FBRW1DLElBQUksQ0FBQ2lGLEtBQUssY0FBQXBILFlBQUEsdUJBQVZBLFlBQUEsQ0FBWXFHO1VBQVEsQ0FBQyxDQUFDO1VBQ3JGeEgsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFNBQVMsQ0FBQzNGLFNBQVMsRUFBRSxPQUFPLENBQUM7VUFDckMsQ0FBQWlCLGtCQUFBLEdBQUFJLFNBQVMsQ0FBQ2tILE9BQU8sY0FBQXRILGtCQUFBLGVBQWpCQSxrQkFBQSxDQUFBNkQsSUFBQSxDQUFBekQsU0FBUyxHQUFBSCxZQUFBLEdBQVdpQyxJQUFJLENBQUNpRixLQUFLLGNBQUFsSCxZQUFBLHVCQUFWQSxZQUFBLENBQVlvSCxJQUFJLEdBQUFuSCxZQUFBLEdBQUVnQyxJQUFJLENBQUNpRixLQUFLLGNBQUFqSCxZQUFBLHVCQUFWQSxZQUFBLENBQVlrRyxPQUFPLENBQUM7VUFBQSxPQUFBL0MsUUFBQSxDQUFBa0MsTUFBQTtRQUFBO1VBSTFEMkIsT0FBTyxDQUFDSyxJQUFJLENBQUMseUJBQXlCLEVBQUV2RixTQUFTLENBQUM7VUFBQSxPQUFBcUIsUUFBQSxDQUFBa0MsTUFBQTtRQUFBO1VBQUFsQyxRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUMsSUFBQTtVQUFBSixHQUFBLEdBQUFHLFFBQUE7VUFJdEQ2RCxPQUFPLENBQUNDLEtBQUssQ0FBQyx5QkFBeUIsRUFBQWpFLEdBQUEsRUFBY2pCLE9BQU8sQ0FBQztRQUFBO1VBQUFvQixRQUFBLENBQUFFLElBQUE7VUFBQTtRQUFBO1VBQUFGLFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQUYsUUFBQSxDQUFBQyxJQUFBO1VBQUFILEdBQUEsR0FBQUUsUUFBQTtVQUFBekIsU0FBQSxDQUFBNEYsQ0FBQSxDQUFBckUsR0FBQTtRQUFBO1VBQUFFLFFBQUEsQ0FBQUMsSUFBQTtVQUFBMUIsU0FBQSxDQUFBNkYsQ0FBQTtVQUFBLE9BQUFwRSxRQUFBLENBQUE2QixNQUFBO1FBQUE7VUFBQTdCLFFBQUEsQ0FBQUUsSUFBQTtVQUFBO1FBQUE7VUFBQUYsUUFBQSxDQUFBQyxJQUFBO1VBS25FM0MsWUFBWSxDQUFDLENBQUM7VUFBQSxPQUFBMEMsUUFBQSxDQUFBNkIsTUFBQTtRQUFBO1FBQUE7VUFBQSxPQUFBN0IsUUFBQSxDQUFBcUUsSUFBQTtNQUFBO0lBQUEsR0FBQWxJLE9BQUE7RUFBQSxDQUVqQjtFQUFBLGdCQS9RS0wsZUFBZUEsQ0FBQXdJLEVBQUEsRUFBQUMsR0FBQSxFQUFBQyxHQUFBO0lBQUEsT0FBQXpJLElBQUEsQ0FBQTBJLEtBQUEsT0FBQUMsU0FBQTtFQUFBO0FBQUEsR0ErUXBCOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUMsb0JBQW9CLEdBQUc7RUFDbENDLFFBQVEsRUFBRW5KLGNBQWM7RUFDeEJvSixjQUFjLEVBQUVqSixvQkFBb0I7RUFDcENrSixtQkFBbUIsRUFBRSxTQUFyQkEsbUJBQW1CQSxDQUFBO0lBQUEsT0FBa0JDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDM0osYUFBYSxDQUFDNEosSUFBSSxDQUFDLENBQUMsQ0FBQztFQUFBO0VBRS9EQyxXQUFXLFdBQVhBLFdBQVdBLENBQUM1SSxNQUF5QixFQUE4QjtJQUFBLE9BQUFOLGlCQUFBLGNBQUFDLG1CQUFBLENBQUFDLElBQUEsVUFBQWlKLFNBQUE7TUFBQSxJQUFBekosU0FBQSxFQUFBb0IsYUFBQSxFQUFBc0ksT0FBQSxFQUFBckksU0FBQSxFQUFBQyxDQUFBLEVBQUFxSSxlQUFBLEVBQUFDLE9BQUEsRUFBQUMsU0FBQSxFQUFBQyxVQUFBLEVBQUFDLFVBQUEsRUFBQXBKLE1BQUEsRUFBQUQsUUFBQSxFQUFBc0osbUJBQUEsRUFBQUMsR0FBQTtNQUFBLE9BQUExSixtQkFBQSxDQUFBOEQsSUFBQSxXQUFBNkYsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUEzRixJQUFBLEdBQUEyRixTQUFBLENBQUExRixJQUFBO1VBQUE7WUFDdkVyRyxxQ0FBcUMsQ0FBQyxDQUFDO1lBRS9CNkIsU0FBUyxHQUFnRlksTUFBTSxDQUEvRlosU0FBUyxFQUFFb0IsYUFBYSxHQUFpRVIsTUFBTSxDQUFwRlEsYUFBYSxFQUFFc0ksT0FBTyxHQUF3RDlJLE1BQU0sQ0FBckU4SSxPQUFPLEVBQUVySSxTQUFTLEdBQTZDVCxNQUFNLENBQTVEUyxTQUFTLEVBQUVDLENBQUMsR0FBMENWLE1BQU0sQ0FBakRVLENBQUMsRUFBRXFJLGVBQWUsR0FBeUIvSSxNQUFNLENBQTlDK0ksZUFBZSxFQUFFQyxPQUFPLEdBQWdCaEosTUFBTSxDQUE3QmdKLE9BQU8sRUFBRUMsU0FBUyxHQUFLakosTUFBTSxDQUFwQmlKLFNBQVM7WUFFdEZDLFVBQVUsR0FBRy9LLHVCQUF1QixDQUN4Q2dCLGNBQWMsQ0FBQ0MsU0FBUyxDQUFDLEVBQ3pCRSxvQkFBb0IsQ0FBQyxDQUFDLEVBQ3RCVCxzQkFDRixDQUFDO1lBQUEsSUFDSXFLLFVBQVUsQ0FBQ0ssT0FBTztjQUFBRCxTQUFBLENBQUExRixJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUEwRixTQUFBLENBQUExRCxNQUFBLFdBQ2Q7Y0FBRTRELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRVAsVUFBVSxDQUFDTztZQUFPLENBQUM7VUFBQTtZQUdoRE4sVUFBVSxHQUFHLElBQUlPLGVBQWUsQ0FBQyxDQUFDO1lBQ2xDM0osTUFBb0IsR0FBRztjQUFFWCxTQUFTLEVBQVRBLFNBQVM7Y0FBRStKLFVBQVUsRUFBVkEsVUFBVTtjQUFFekQsU0FBUyxFQUFFO1lBQU0sQ0FBQztZQUN4RTNHLGFBQWEsQ0FBQzRLLEdBQUcsQ0FBQ3ZLLFNBQVMsRUFBRVcsTUFBTSxDQUFDO1lBRXBDZCxLQUFLLENBQUMsQ0FBQyxDQUFDMkssYUFBYSxDQUFDeEssU0FBUyxDQUFDO1lBQ2hDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFBNkgsYUFBQTtjQUN6QnpHLGFBQWEsRUFBYkEsYUFBYTtjQUNiZ0gsS0FBSyxFQUFFLElBQUk7Y0FDWDNDLFNBQVMsRUFBRSxJQUFJO2NBQ2ZDLFNBQVMsRUFBRTtZQUFLLEdBQ2JoSCxvQkFBb0IsQ0FBQ2tMLE9BQU8sRUFBRUMsU0FBUyxDQUFDLENBQzVDLENBQUM7WUFDRmhLLEtBQUssQ0FBQyxDQUFDLENBQUM4RixTQUFTLENBQUMzRixTQUFTLEVBQUUsVUFBVSxDQUFDO1lBQ3hDL0Isb0JBQW9CLENBQUN3TSxLQUFLLENBQUN6SyxTQUFTLEVBQUVvQixhQUFhLENBQUM7WUFDcERwRCxjQUFjLENBQUN5TSxLQUFLLENBQUNySixhQUFhLENBQUM7WUFDbkN2QixLQUFLLENBQUMsQ0FBQyxDQUFDK0YsV0FBVyxDQUFDNUYsU0FBUyxFQUFFekMsd0JBQXdCLENBQUMrRCxDQUFDLEVBQUVxSSxlQUFlLGFBQWZBLGVBQWUsY0FBZkEsZUFBZSxHQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQU8sU0FBQSxDQUFBM0YsSUFBQTtZQUFBMkYsU0FBQSxDQUFBMUYsSUFBQTtZQUFBLE9BR3pEbEgsSUFBSSxDQUFDb04sWUFBWSxDQUFDQyxZQUFZLENBQUNqQixPQUFPLEVBQUVLLFVBQVUsQ0FBQ2EsTUFBTSxDQUFDO1VBQUE7WUFBM0VsSyxRQUFRLEdBQUF3SixTQUFBLENBQUF4RCxJQUFBO1lBQUF3RCxTQUFBLENBQUExRixJQUFBO1lBQUEsT0FDUnBFLGVBQWUsQ0FBQ00sUUFBUSxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sQ0FBQztVQUFBO1lBQUFzSixTQUFBLENBQUExRixJQUFBO1lBQUE7VUFBQTtZQUFBMEYsU0FBQSxDQUFBM0YsSUFBQTtZQUFBMEYsR0FBQSxHQUFBQyxTQUFBO1lBRS9DLElBQUksQ0FBQ3ZKLE1BQU0sQ0FBQzJGLFNBQVMsRUFBRTtjQUNyQnJJLG9CQUFvQixDQUFDK0osS0FBSyxDQUFDaEksU0FBUyxDQUFDO2NBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFLEtBQUs7Z0JBQUVDLFNBQVMsRUFBRTtjQUFNLENBQUMsQ0FBQztjQUNwRTdGLEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQUM1RixTQUFTLEVBQUUsSUFBSSxDQUFDO2NBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLE9BQU8sQ0FBQztjQUNyQyxDQUFBZ0ssbUJBQUEsR0FBQTNJLFNBQVMsQ0FBQ2tILE9BQU8sY0FBQXlCLG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFBbEYsSUFBQSxDQUFBekQsU0FBb0IsQ0FBQztZQUN2QjtVQUFDO1lBQUE2SSxTQUFBLENBQUEzRixJQUFBO1lBRUQ1RSxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQUEsT0FBQWtLLFNBQUEsQ0FBQS9ELE1BQUE7VUFBQTtZQUFBLE9BQUErRCxTQUFBLENBQUExRCxNQUFBLFdBRzFCO2NBQUU0RCxPQUFPLEVBQUU7WUFBSyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFGLFNBQUEsQ0FBQXZCLElBQUE7UUFBQTtNQUFBLEdBQUFjLFFBQUE7SUFBQTtFQUMxQixDQUFDO0VBRUQsMEZBQ01vQixtQkFBbUIsV0FBbkJBLG1CQUFtQkEsQ0FBQ2pLLE1BQWlDLEVBQThCO0lBQUEsT0FBQU4saUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxVQUFBc0ssU0FBQTtNQUFBLElBQUFDLEtBQUE7TUFBQSxJQUFBL0ssU0FBQSxFQUFBb0IsYUFBQSxFQUFBNEosZUFBQSxFQUFBM0osU0FBQSxFQUFBQyxDQUFBLEVBQUFDLG9CQUFBLEVBQUFxSSxPQUFBLEVBQUFDLFNBQUEsRUFBQW9CLGFBQUEsRUFBQWxCLFVBQUEsRUFBQXBKLE1BQUEsRUFBQXVLLFNBQUEsRUFBQXhLLFFBQUEsRUFBQXlLLG1CQUFBLEVBQUFDLEdBQUE7TUFBQSxPQUFBN0ssbUJBQUEsQ0FBQThELElBQUEsV0FBQWdILFNBQUE7UUFBQSxrQkFBQUEsU0FBQSxDQUFBOUcsSUFBQSxHQUFBOEcsU0FBQSxDQUFBN0csSUFBQTtVQUFBO1lBQ3ZGckcscUNBQXFDLENBQUMsQ0FBQztZQUUvQjZCLFNBQVMsR0FBNkZZLE1BQU0sQ0FBNUdaLFNBQVMsRUFBRW9CLGFBQWEsR0FBOEVSLE1BQU0sQ0FBakdRLGFBQWEsRUFBRTRKLGVBQWUsR0FBNkRwSyxNQUFNLENBQWxGb0ssZUFBZSxFQUFFM0osU0FBUyxHQUFrRFQsTUFBTSxDQUFqRVMsU0FBUyxFQUFFQyxDQUFDLEdBQStDVixNQUFNLENBQXREVSxDQUFDLEVBQUVDLG9CQUFvQixHQUF5QlgsTUFBTSxDQUFuRFcsb0JBQW9CLEVBQUVxSSxPQUFPLEdBQWdCaEosTUFBTSxDQUE3QmdKLE9BQU8sRUFBRUMsU0FBUyxHQUFLakosTUFBTSxDQUFwQmlKLFNBQVM7WUFFbkdvQixhQUFhLEdBQUdsTSx1QkFBdUIsQ0FDM0NnQixjQUFjLENBQUNDLFNBQVMsQ0FBQyxFQUN6QkUsb0JBQW9CLENBQUMsQ0FBQyxFQUN0QlQsc0JBQ0YsQ0FBQztZQUFBLElBQ0l3TCxhQUFhLENBQUNkLE9BQU87Y0FBQWtCLFNBQUEsQ0FBQTdHLElBQUE7Y0FBQTtZQUFBO1lBQUEsT0FBQTZHLFNBQUEsQ0FBQTdFLE1BQUEsV0FDakI7Y0FBRTRELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRVksYUFBYSxDQUFDWjtZQUFPLENBQUM7VUFBQTtZQUd6RCxJQUFJOUksb0JBQW9CLEVBQUU7Y0FDeEJuRCxrQkFBa0IsQ0FBQ21NLEdBQUcsQ0FBQ3ZLLFNBQVMsRUFBRXVCLG9CQUFvQixDQUFDO1lBQ3pEO1lBRU13SSxVQUFVLEdBQUcsSUFBSU8sZUFBZSxDQUFDLENBQUM7WUFDbEMzSixNQUFvQixHQUFHO2NBQUVYLFNBQVMsRUFBVEEsU0FBUztjQUFFK0osVUFBVSxFQUFWQSxVQUFVO2NBQUV6RCxTQUFTLEVBQUU7WUFBTSxDQUFDO1lBQ3hFM0csYUFBYSxDQUFDNEssR0FBRyxDQUFDdkssU0FBUyxFQUFFVyxNQUFNLENBQUM7WUFFcENkLEtBQUssQ0FBQyxDQUFDLENBQUMySyxhQUFhLENBQUN4SyxTQUFTLENBQUM7WUFDaENILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUE2SCxhQUFBO2NBQ3pCekcsYUFBYSxFQUFiQSxhQUFhO2NBQ2JnSCxLQUFLLEVBQUUsSUFBSTtjQUNYM0MsU0FBUyxFQUFFLElBQUk7Y0FDZkMsU0FBUyxFQUFFO1lBQUssR0FDYmhILG9CQUFvQixDQUFDa0wsT0FBTyxFQUFFQyxTQUFTLENBQUMsQ0FDNUMsQ0FBQztZQUNGaEssS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFNBQVMsQ0FBQzNGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeEMvQixvQkFBb0IsQ0FBQ3dNLEtBQUssQ0FBQ3pLLFNBQVMsRUFBRW9CLGFBQWEsQ0FBQztZQUNwRHZCLEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQ2pCNUYsU0FBUyxFQUNUcEMsZ0NBQWdDLENBQUMwRCxDQUFDLEdBQUF5SixLQUFBLEdBQUV4SixvQkFBb0IsYUFBcEJBLG9CQUFvQixjQUFwQkEsb0JBQW9CLEdBQUluRCxrQkFBa0IsQ0FBQ3FHLEdBQUcsQ0FBQ3pFLFNBQVMsQ0FBQyxjQUFBK0ssS0FBQSxjQUFBQSxLQUFBLEdBQUloRCxTQUFTLENBQzVHLENBQUM7WUFFS21ELFNBQTRCLEdBQUc7Y0FDbkNsTCxTQUFTLEVBQVRBLFNBQVM7Y0FDVG9CLGFBQWEsRUFBYkEsYUFBYTtjQUNic0ksT0FBTyxFQUFFLENBQUMsQ0FBd0I7Y0FDbENySSxTQUFTLEVBQVRBLFNBQVM7Y0FDVEMsQ0FBQyxFQUFEQSxDQUFDO2NBQ0RDLG9CQUFvQixFQUFFQSxvQkFBb0IsYUFBcEJBLG9CQUFvQixjQUFwQkEsb0JBQW9CLEdBQUluRCxrQkFBa0IsQ0FBQ3FHLEdBQUcsQ0FBQ3pFLFNBQVMsQ0FBQztjQUMvRTRKLE9BQU8sRUFBUEEsT0FBTztjQUNQQyxTQUFTLEVBQVRBO1lBQ0YsQ0FBQztZQUFBd0IsU0FBQSxDQUFBOUcsSUFBQTtZQUFBOEcsU0FBQSxDQUFBN0csSUFBQTtZQUFBLE9BR3dCbEgsSUFBSSxDQUFDb04sWUFBWSxDQUFDWSxjQUFjLENBQUNOLGVBQWUsRUFBRWpCLFVBQVUsQ0FBQ2EsTUFBTSxDQUFDO1VBQUE7WUFBckZsSyxRQUFRLEdBQUEySyxTQUFBLENBQUEzRSxJQUFBO1lBQUEsSUFDVGhHLFFBQVEsQ0FBQzZLLEVBQUU7Y0FBQUYsU0FBQSxDQUFBN0csSUFBQTtjQUFBO1lBQUE7WUFBQSxNQUNSLElBQUlhLEtBQUssNEJBQUFtRyxNQUFBLENBQTRCOUssUUFBUSxDQUFDNkcsTUFBTSxDQUFFLENBQUM7VUFBQTtZQUFBOEQsU0FBQSxDQUFBN0csSUFBQTtZQUFBLE9BRXpEcEUsZUFBZSxDQUFDTSxRQUFRLEVBQUVDLE1BQU0sRUFBRXVLLFNBQVMsQ0FBQztVQUFBO1lBQUFHLFNBQUEsQ0FBQTdHLElBQUE7WUFBQTtVQUFBO1lBQUE2RyxTQUFBLENBQUE5RyxJQUFBO1lBQUE2RyxHQUFBLEdBQUFDLFNBQUE7WUFFbEQsSUFBSSxDQUFDMUssTUFBTSxDQUFDMkYsU0FBUyxFQUFFO2NBQ3JCckksb0JBQW9CLENBQUMrSixLQUFLLENBQUNoSSxTQUFTLENBQUM7Y0FDckNILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUU7Z0JBQUV5RixTQUFTLEVBQUUsS0FBSztnQkFBRUMsU0FBUyxFQUFFO2NBQU0sQ0FBQyxDQUFDO2NBQ3BFN0YsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRSxJQUFJLENBQUM7Y0FDcENILEtBQUssQ0FBQyxDQUFDLENBQUM4RixTQUFTLENBQUMzRixTQUFTLEVBQUUsT0FBTyxDQUFDO2NBQ3JDLENBQUFtTCxtQkFBQSxHQUFBOUosU0FBUyxDQUFDa0gsT0FBTyxjQUFBNEMsbUJBQUEsZUFBakJBLG1CQUFBLENBQUFyRyxJQUFBLENBQUF6RCxTQUFvQixDQUFDO1lBQ3ZCO1VBQUM7WUFBQWdLLFNBQUEsQ0FBQTlHLElBQUE7WUFFRDVFLGFBQWEsVUFBTyxDQUFDSyxTQUFTLENBQUM7WUFDL0I1QixrQkFBa0IsQ0FBQzRKLEtBQUssQ0FBQ2hJLFNBQVMsQ0FBQztZQUFBLE9BQUFxTCxTQUFBLENBQUFsRixNQUFBO1VBQUE7WUFBQSxPQUFBa0YsU0FBQSxDQUFBN0UsTUFBQSxXQUc5QjtjQUFFNEQsT0FBTyxFQUFFO1lBQUssQ0FBQztVQUFBO1VBQUE7WUFBQSxPQUFBaUIsU0FBQSxDQUFBMUMsSUFBQTtRQUFBO01BQUEsR0FBQW1DLFFBQUE7SUFBQTtFQUMxQixDQUFDO0VBRUQsaUdBQ01XLGdCQUFnQixXQUFoQkEsZ0JBQWdCQSxDQUFDN0ssTUFBOEIsRUFBOEI7SUFBQSxPQUFBTixpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLFVBQUFrTCxTQUFBO01BQUEsSUFBQTFMLFNBQUEsRUFBQW9CLGFBQUEsRUFBQXVLLFlBQUEsRUFBQXRLLFNBQUEsRUFBQUMsQ0FBQSxFQUFBcUksZUFBQSxFQUFBQyxPQUFBLEVBQUFDLFNBQUEsRUFBQStCLFVBQUEsRUFBQTdCLFVBQUEsRUFBQXBKLE1BQUEsRUFBQXVLLFNBQUEsRUFBQXhLLFFBQUEsRUFBQW1MLE1BQUEsRUFBQTFJLElBQUEsRUFBQTJJLG1CQUFBLEVBQUFDLEdBQUEsRUFBQUMsR0FBQTtNQUFBLE9BQUF6TCxtQkFBQSxDQUFBOEQsSUFBQSxXQUFBNEgsU0FBQTtRQUFBLGtCQUFBQSxTQUFBLENBQUExSCxJQUFBLEdBQUEwSCxTQUFBLENBQUF6SCxJQUFBO1VBQUE7WUFDakZyRyxxQ0FBcUMsQ0FBQyxDQUFDO1lBRS9CNkIsU0FBUyxHQUFxRlksTUFBTSxDQUFwR1osU0FBUyxFQUFFb0IsYUFBYSxHQUFzRVIsTUFBTSxDQUF6RlEsYUFBYSxFQUFFdUssWUFBWSxHQUF3RC9LLE1BQU0sQ0FBMUUrSyxZQUFZLEVBQUV0SyxTQUFTLEdBQTZDVCxNQUFNLENBQTVEUyxTQUFTLEVBQUVDLENBQUMsR0FBMENWLE1BQU0sQ0FBakRVLENBQUMsRUFBRXFJLGVBQWUsR0FBeUIvSSxNQUFNLENBQTlDK0ksZUFBZSxFQUFFQyxPQUFPLEdBQWdCaEosTUFBTSxDQUE3QmdKLE9BQU8sRUFBRUMsU0FBUyxHQUFLakosTUFBTSxDQUFwQmlKLFNBQVM7WUFFM0YrQixVQUFVLEdBQUc3TSx1QkFBdUIsQ0FDeENnQixjQUFjLENBQUNDLFNBQVMsQ0FBQyxFQUN6QkUsb0JBQW9CLENBQUMsQ0FBQyxFQUN0QlQsc0JBQ0YsQ0FBQztZQUFBLElBQ0ltTSxVQUFVLENBQUN6QixPQUFPO2NBQUE4QixTQUFBLENBQUF6SCxJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUF5SCxTQUFBLENBQUF6RixNQUFBLFdBQ2Q7Y0FBRTRELE9BQU8sRUFBRSxLQUFLO2NBQUVDLE1BQU0sRUFBRXVCLFVBQVUsQ0FBQ3ZCO1lBQU8sQ0FBQztVQUFBO1lBR2hETixVQUFVLEdBQUcsSUFBSU8sZUFBZSxDQUFDLENBQUM7WUFDbEMzSixNQUFvQixHQUFHO2NBQUVYLFNBQVMsRUFBVEEsU0FBUztjQUFFK0osVUFBVSxFQUFWQSxVQUFVO2NBQUV6RCxTQUFTLEVBQUU7WUFBTSxDQUFDO1lBQ3hFM0csYUFBYSxDQUFDNEssR0FBRyxDQUFDdkssU0FBUyxFQUFFVyxNQUFNLENBQUM7WUFFcENkLEtBQUssQ0FBQyxDQUFDLENBQUMySyxhQUFhLENBQUN4SyxTQUFTLENBQUM7WUFDaENILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUE2SCxhQUFBO2NBQ3pCekcsYUFBYSxFQUFiQSxhQUFhO2NBQ2JnSCxLQUFLLEVBQUUsSUFBSTtjQUNYM0MsU0FBUyxFQUFFLElBQUk7Y0FDZkMsU0FBUyxFQUFFO1lBQUssR0FDYmhILG9CQUFvQixDQUFDa0wsT0FBTyxFQUFFQyxTQUFTLENBQUMsQ0FDNUMsQ0FBQztZQUNGaEssS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFNBQVMsQ0FBQzNGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDeEMvQixvQkFBb0IsQ0FBQ3dNLEtBQUssQ0FBQ3pLLFNBQVMsRUFBRW9CLGFBQWEsQ0FBQztZQUNwRHZCLEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQUM1RixTQUFTLEVBQUV6Qyx3QkFBd0IsQ0FBQytELENBQUMsRUFBRXFJLGVBQWUsYUFBZkEsZUFBZSxjQUFmQSxlQUFlLEdBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RXVCLFNBQTRCLEdBQUc7Y0FDbkNsTCxTQUFTLEVBQVRBLFNBQVM7Y0FDVG9CLGFBQWEsRUFBYkEsYUFBYTtjQUNic0ksT0FBTyxFQUFFLENBQUMsQ0FBd0I7Y0FDbENySSxTQUFTLEVBQVRBLFNBQVM7Y0FDVEMsQ0FBQyxFQUFEQSxDQUFDO2NBQ0RxSSxlQUFlLEVBQWZBLGVBQWU7Y0FDZkMsT0FBTyxFQUFQQSxPQUFPO2NBQ1BDLFNBQVMsRUFBVEE7WUFDRixDQUFDO1lBQUFvQyxTQUFBLENBQUExSCxJQUFBO1lBQUEwSCxTQUFBLENBQUF6SCxJQUFBO1lBQUEsT0FHd0JsSCxJQUFJLENBQUNvTixZQUFZLENBQUN3QixlQUFlLENBQUNQLFlBQVksRUFBRTVCLFVBQVUsQ0FBQ2EsTUFBTSxDQUFDO1VBQUE7WUFBbkZsSyxRQUFRLEdBQUF1TCxTQUFBLENBQUF2RixJQUFBO1lBQUEsSUFDVGhHLFFBQVEsQ0FBQzZLLEVBQUU7Y0FBQVUsU0FBQSxDQUFBekgsSUFBQTtjQUFBO1lBQUE7WUFBQSxNQUNWOUQsUUFBUSxDQUFDNkcsTUFBTSxLQUFLLEdBQUc7Y0FBQTBFLFNBQUEsQ0FBQXpILElBQUE7Y0FBQTtZQUFBO1lBQUF5SCxTQUFBLENBQUExSCxJQUFBO1lBQUEwSCxTQUFBLENBQUF6SCxJQUFBO1lBQUEsT0FHSDlELFFBQVEsQ0FBQ3lMLElBQUksQ0FBQyxDQUFDO1VBQUE7WUFBN0JoSixJQUFJLEdBQUE4SSxTQUFBLENBQUF2RixJQUFBO1lBQ1ZtRixNQUFNLEdBQUcsT0FBTzFJLElBQUksQ0FBQzBJLE1BQU0sS0FBSyxRQUFRLEdBQUcxSSxJQUFJLENBQUMwSSxNQUFNLEdBQUc5RCxTQUFTO1lBQUFrRSxTQUFBLENBQUF6SCxJQUFBO1lBQUE7VUFBQTtZQUFBeUgsU0FBQSxDQUFBMUgsSUFBQTtZQUFBd0gsR0FBQSxHQUFBRSxTQUFBO1lBRWxFSixNQUFNLEdBQUc5RCxTQUFTO1VBQUE7WUFBQSxLQUVoQnZKLDJCQUEyQixDQUFDa0MsUUFBUSxDQUFDNkcsTUFBTSxFQUFFc0UsTUFBTSxDQUFDO2NBQUFJLFNBQUEsQ0FBQXpILElBQUE7Y0FBQTtZQUFBO1lBQ3REdkcsb0JBQW9CLENBQUMrSixLQUFLLENBQUNoSSxTQUFTLENBQUM7WUFDckNILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUU7Y0FBRXlGLFNBQVMsRUFBRSxLQUFLO2NBQUVDLFNBQVMsRUFBRSxLQUFLO2NBQUV0RSxhQUFhLEVBQUU7WUFBSyxDQUFDLENBQUM7WUFDekZ2QixLQUFLLENBQUMsQ0FBQyxDQUFDK0YsV0FBVyxDQUFDNUYsU0FBUyxFQUFFLElBQUksQ0FBQztZQUNwQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFNBQVMsQ0FBQzNGLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDcENMLGFBQWEsVUFBTyxDQUFDSyxTQUFTLENBQUM7WUFBQSxPQUFBaU0sU0FBQSxDQUFBekYsTUFBQSxXQUN4QjtjQUFFNEQsT0FBTyxFQUFFLEtBQUs7Y0FBRUMsTUFBTSxFQUFFO1lBQWlCLENBQUM7VUFBQTtZQUFBLE1BR2pELElBQUloRixLQUFLLDZCQUFBbUcsTUFBQSxDQUE2QjlLLFFBQVEsQ0FBQzZHLE1BQU0sQ0FBRSxDQUFDO1VBQUE7WUFBQTBFLFNBQUEsQ0FBQXpILElBQUE7WUFBQSxPQUUxRHBFLGVBQWUsQ0FBQ00sUUFBUSxFQUFFQyxNQUFNLEVBQUV1SyxTQUFTLENBQUM7VUFBQTtZQUFBZSxTQUFBLENBQUF6SCxJQUFBO1lBQUE7VUFBQTtZQUFBeUgsU0FBQSxDQUFBMUgsSUFBQTtZQUFBeUgsR0FBQSxHQUFBQyxTQUFBO1lBRWxELElBQUksQ0FBQ3RMLE1BQU0sQ0FBQzJGLFNBQVMsRUFBRTtjQUNyQnJJLG9CQUFvQixDQUFDK0osS0FBSyxDQUFDaEksU0FBUyxDQUFDO2NBQ3JDSCxLQUFLLENBQUMsQ0FBQyxDQUFDMkYsU0FBUyxDQUFDeEYsU0FBUyxFQUFFO2dCQUFFeUYsU0FBUyxFQUFFLEtBQUs7Z0JBQUVDLFNBQVMsRUFBRTtjQUFNLENBQUMsQ0FBQztjQUNwRTdGLEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQUM1RixTQUFTLEVBQUUsSUFBSSxDQUFDO2NBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLE9BQU8sQ0FBQztjQUNyQyxDQUFBOEwsbUJBQUEsR0FBQXpLLFNBQVMsQ0FBQ2tILE9BQU8sY0FBQXVELG1CQUFBLGVBQWpCQSxtQkFBQSxDQUFBaEgsSUFBQSxDQUFBekQsU0FBb0IsQ0FBQztZQUN2QjtVQUFDO1lBQUE0SyxTQUFBLENBQUExSCxJQUFBO1lBRUQ1RSxhQUFhLFVBQU8sQ0FBQ0ssU0FBUyxDQUFDO1lBQUEsT0FBQWlNLFNBQUEsQ0FBQTlGLE1BQUE7VUFBQTtZQUFBLE9BQUE4RixTQUFBLENBQUF6RixNQUFBLFdBRzFCO2NBQUU0RCxPQUFPLEVBQUU7WUFBSyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUE2QixTQUFBLENBQUF0RCxJQUFBO1FBQUE7TUFBQSxHQUFBK0MsUUFBQTtJQUFBO0VBQzFCLENBQUM7RUFFRCwrREFDQVUsVUFBVSxXQUFWQSxVQUFVQSxDQUFDcE0sU0FBaUIsRUFBRXFCLFNBQWtDLEVBQUU7SUFBQSxJQUFBZ0wsaUJBQUE7SUFDaEUsSUFBTTFMLE1BQU0sR0FBR2hCLGFBQWEsQ0FBQzhFLEdBQUcsQ0FBQ3pFLFNBQVMsQ0FBQztJQUMzQyxJQUFJLENBQUNXLE1BQU0sRUFBRTtJQUNiQSxNQUFNLENBQUMyRixTQUFTLEdBQUcsSUFBSTtJQUN2QjNGLE1BQU0sQ0FBQ29KLFVBQVUsQ0FBQ3VDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCM00sYUFBYSxVQUFPLENBQUNLLFNBQVMsQ0FBQztJQUMvQjtJQUNBO0lBQ0EsSUFBTXVNLFdBQVcsR0FBR3RPLG9CQUFvQixDQUFDdU8sV0FBVyxDQUFDeE0sU0FBUyxDQUFDLENBQUN5TSxJQUFJO0lBQ3BFeE8sb0JBQW9CLENBQUMrSixLQUFLLENBQUNoSSxTQUFTLENBQUM7SUFDckNILEtBQUssQ0FBQyxDQUFDLENBQUMyRixTQUFTLENBQUN4RixTQUFTLEVBQUU7TUFBRXlGLFNBQVMsRUFBRSxLQUFLO01BQUVDLFNBQVMsRUFBRTtJQUFNLENBQUMsQ0FBQztJQUNwRTdGLEtBQUssQ0FBQyxDQUFDLENBQUMrRixXQUFXLENBQUM1RixTQUFTLEVBQUUsSUFBSSxDQUFDO0lBQ3BDSCxLQUFLLENBQUMsQ0FBQyxDQUFDOEYsU0FBUyxDQUFDM0YsU0FBUyxFQUFFLFdBQVcsQ0FBQztJQUN6Q3FCLFNBQVMsYUFBVEEsU0FBUyxnQkFBQWdMLGlCQUFBLEdBQVRoTCxTQUFTLENBQUVxTCxNQUFNLGNBQUFMLGlCQUFBLGVBQWpCQSxpQkFBQSxDQUFBdkgsSUFBQSxDQUFBekQsU0FBUyxFQUFXa0wsV0FBVyxDQUFDO0VBQ2xDLENBQUM7RUFFRCw4REFDQUksYUFBYSxXQUFiQSxhQUFhQSxDQUFDM00sU0FBaUIsRUFBRTtJQUFBLElBQUE0TSxjQUFBO0lBQy9CLElBQU1qTSxNQUFNLEdBQUdoQixhQUFhLENBQUM4RSxHQUFHLENBQUN6RSxTQUFTLENBQUM7SUFDM0MsSUFBSSxDQUFDVyxNQUFNLEVBQUU7SUFDYkEsTUFBTSxDQUFDMkYsU0FBUyxHQUFHLElBQUk7SUFDdkIzRixNQUFNLENBQUNvSixVQUFVLENBQUN1QyxLQUFLLENBQUMsQ0FBQztJQUN6QjNNLGFBQWEsVUFBTyxDQUFDSyxTQUFTLENBQUM7SUFDL0IvQixvQkFBb0IsQ0FBQytKLEtBQUssQ0FBQ2hJLFNBQVMsQ0FBQztJQUNyQ0gsS0FBSyxDQUFDLENBQUMsQ0FBQzJGLFNBQVMsQ0FBQ3hGLFNBQVMsRUFBRTtNQUFFeUYsU0FBUyxFQUFFLEtBQUs7TUFBRUMsU0FBUyxFQUFFO0lBQU0sQ0FBQyxDQUFDO0lBQ3BFN0YsS0FBSyxDQUFDLENBQUMsQ0FBQytGLFdBQVcsQ0FBQzVGLFNBQVMsRUFBRSxJQUFJLENBQUM7SUFDcEMsSUFBSVYsMEJBQTBCLEVBQUFzTixjQUFBLEdBQUMvTSxLQUFLLENBQUMsQ0FBQyxDQUFDZ04sT0FBTyxDQUFDN00sU0FBUyxDQUFDLGNBQUE0TSxjQUFBLHVCQUExQkEsY0FBQSxDQUE0QnJGLE1BQU0sQ0FBQyxFQUFFO01BQ2xFMUgsS0FBSyxDQUFDLENBQUMsQ0FBQzhGLFNBQVMsQ0FBQzNGLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDdEM7RUFDRixDQUFDO0VBRUQ4TSxRQUFRLFdBQVJBLFFBQVFBLENBQUEsRUFBRztJQUFBLElBQUFDLEtBQUE7SUFDVDFELEtBQUssQ0FBQ0MsSUFBSSxDQUFDM0osYUFBYSxDQUFDNEosSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDeUQsT0FBTyxDQUFDLFVBQUFoTixTQUFTO01BQUEsT0FBSStNLEtBQUksQ0FBQ0osYUFBYSxDQUFDM00sU0FBUyxDQUFDO0lBQUEsRUFBQztFQUN0RjtBQUNGLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|