@projectcor/maia-components 2.49.0-beta.1 → 2.49.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (493) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  23. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +137 -0
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  25. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  26. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  27. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  28. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  29. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  31. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  32. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  33. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  34. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  35. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  36. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  37. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  38. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  39. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  40. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  41. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  42. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  43. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  44. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  45. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  46. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  47. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  48. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  49. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  50. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  51. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  52. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  53. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  54. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  55. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  56. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  57. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  58. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  59. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  60. package/lib/components/atoms/HelpButton.spec.js +87 -0
  61. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  62. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  63. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  64. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  65. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  66. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  67. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  68. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  70. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  71. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  72. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  73. package/lib/components/atoms/MAIAInput/MAIAInput.js +130 -177
  74. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +641 -0
  75. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  76. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  77. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  78. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  79. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  80. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  81. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  82. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  83. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  84. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  85. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  86. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  87. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  88. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  89. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  90. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  91. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  92. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  93. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  94. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  95. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  96. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  97. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  98. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +27 -13
  99. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  100. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +79 -52
  101. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  102. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  103. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  104. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  105. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  106. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  107. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  108. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  109. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  110. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  111. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  112. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  113. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  114. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  115. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  116. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  117. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  118. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  119. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  120. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  121. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  122. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  123. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  124. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  125. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  126. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  127. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  128. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  129. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  130. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  131. package/lib/components/index.js +2 -1
  132. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  133. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  134. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  135. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +742 -0
  136. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  137. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  138. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  139. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  140. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  141. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  142. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  143. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  144. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  145. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  146. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  147. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  148. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  149. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  150. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  151. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  152. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  153. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  154. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  155. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  156. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  157. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  158. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  159. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  160. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  161. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  162. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +285 -302
  163. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  164. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  165. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  166. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  167. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  168. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +742 -0
  169. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +235 -245
  170. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +541 -0
  171. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  172. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  173. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +522 -4
  174. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1394 -0
  175. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +250 -349
  176. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1401 -0
  177. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  178. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  179. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  180. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  181. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  182. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  183. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  184. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  185. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  186. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  187. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +100 -93
  188. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  189. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  190. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  191. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  192. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  193. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  194. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  195. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  196. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  197. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  198. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  199. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  200. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  201. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  202. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  203. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  204. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +369 -0
  205. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  206. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  207. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  208. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  209. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  210. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  211. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  212. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  213. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  214. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  215. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  216. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  217. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  218. package/lib/components/molecules/Sidebar/Sidebar.js +65 -44
  219. package/lib/components/molecules/Sidebar/Sidebar.spec.js +464 -0
  220. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  221. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  222. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +310 -644
  223. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  224. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  225. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  226. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  227. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  228. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  229. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  230. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  231. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  232. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  233. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  234. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  235. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  236. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +275 -0
  237. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +275 -0
  238. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +195 -0
  239. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  240. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  241. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  242. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  243. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  244. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  245. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  246. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  247. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  248. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  249. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  250. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  251. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  252. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  253. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  254. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  255. package/lib/constants/formatExtensions.js +7 -8
  256. package/lib/constants/formatExtensions.spec.js +14 -0
  257. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  258. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  259. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  260. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  261. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  262. package/lib/constants/permissions/index.js +2 -2
  263. package/lib/constants/permissions/utils.js +4 -1
  264. package/lib/constants/permissions/utils.spec.js +128 -0
  265. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  266. package/lib/constants/taskUrls.spec.js +9 -0
  267. package/lib/dev/DevMaiaPage.js +30 -0
  268. package/lib/dev/DevReasoningTimeline.js +75 -86
  269. package/lib/dev/Providers.js +5 -3
  270. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  271. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  272. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  273. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  274. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  275. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  276. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  277. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  278. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  279. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  280. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  281. package/lib/hooks/useCaretPosition.spec.js +58 -0
  282. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  283. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  284. package/lib/hooks/useChatManager/useChatManager.js +272 -745
  285. package/lib/hooks/useChatManager/useChatManager.spec.js +2409 -0
  286. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  287. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  288. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  289. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  290. package/lib/hooks/useChats/useChats.spec.js +208 -0
  291. package/lib/hooks/useClientSearch.helpers.js +36 -0
  292. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  293. package/lib/hooks/useClientSearch.js +4 -32
  294. package/lib/hooks/useClientSearch.spec.js +86 -0
  295. package/lib/hooks/useContextMentions.helpers.js +212 -0
  296. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  297. package/lib/hooks/useContextMentions.js +5 -223
  298. package/lib/hooks/useContextMentions.spec.js +338 -0
  299. package/lib/hooks/useContextMentions.types.js +2 -0
  300. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  301. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  302. package/lib/hooks/useContextPinPopover.js +16 -75
  303. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  304. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  305. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  306. package/lib/hooks/useDebounce.spec.js +42 -0
  307. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  308. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  309. package/lib/hooks/useEntitySearch.js +52 -436
  310. package/lib/hooks/useEntitySearch.spec.js +718 -0
  311. package/lib/hooks/useEvent.spec.js +45 -0
  312. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  313. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  314. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  315. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  316. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  317. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  318. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  319. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  320. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  321. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  322. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  323. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  324. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  325. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  326. package/lib/hooks/useMentionPopover.js +9 -35
  327. package/lib/hooks/useMentionPopover.spec.js +392 -0
  328. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  329. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  330. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  331. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  332. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  333. package/lib/hooks/useModal/useModal.spec.js +73 -0
  334. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  335. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  336. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  337. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +417 -0
  338. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  339. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  340. package/lib/hooks/useProjectSearch.js +4 -58
  341. package/lib/hooks/useProjectSearch.spec.js +91 -0
  342. package/lib/hooks/useProjectSummary.spec.js +193 -0
  343. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  344. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  345. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  346. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  347. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  348. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  349. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  350. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  351. package/lib/hooks/useRecentClientsSearch.js +4 -32
  352. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  353. package/lib/hooks/useRecentContexts.spec.js +139 -0
  354. package/lib/hooks/useResize.spec.js +37 -0
  355. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  356. package/lib/hooks/useSlashCommands.spec.js +139 -0
  357. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  358. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  359. package/lib/hooks/useStreamResponse.spec.js +199 -0
  360. package/lib/hooks/useT.spec.js +20 -0
  361. package/lib/hooks/useToggle.spec.js +33 -0
  362. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  363. package/lib/index.js +5 -2
  364. package/lib/lang/br/index.js +26 -7
  365. package/lib/lang/en/index.js +26 -7
  366. package/lib/lang/es/index.js +26 -7
  367. package/lib/lang/fr/index.js +26 -7
  368. package/lib/services/appcues.spec.js +37 -0
  369. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  370. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  371. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  372. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  373. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  374. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  375. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  376. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  377. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  378. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  379. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  380. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  381. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  382. package/lib/services/maia/Agents/getAgents.js +90 -282
  383. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  384. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  385. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  386. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  387. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  388. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  389. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  390. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  391. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  392. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  393. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  394. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  395. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  396. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  397. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  398. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +225 -0
  399. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  400. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  401. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  402. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  403. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  404. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  405. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  406. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  407. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  408. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  409. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  410. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  411. package/lib/services/maia/client.spec.js +56 -0
  412. package/lib/services/utils/fetchCOR.spec.js +211 -0
  413. package/lib/services/utils/getCookie.spec.js +20 -0
  414. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  415. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  416. package/lib/services/utils/mapChatMessages.js +25 -254
  417. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  418. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  419. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  420. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  421. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  422. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  423. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  424. package/lib/store/sessions/sessionNotifications.js +35 -41
  425. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  426. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  427. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  428. package/lib/store/sessions/sessionStreamManager.js +209 -277
  429. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  430. package/lib/store/sessions/sessions.types.spec.js +16 -0
  431. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  432. package/lib/store/useChatsStore.spec.js +619 -0
  433. package/lib/store/useFaqsStore.spec.js +57 -0
  434. package/lib/styles/cascade.js +29 -3
  435. package/lib/styles/transitions.js +3 -1
  436. package/lib/test/mockSseStream.js +121 -0
  437. package/lib/test/streamdownCodeMock.js +6 -0
  438. package/lib/test/streamdownMock.js +12 -0
  439. package/lib/types/Chat.js +1 -1
  440. package/lib/types/agentModal.js +1 -1
  441. package/lib/types/global.d.js +1 -1
  442. package/lib/types/reasoning.js +1 -1
  443. package/lib/utils/actionCategoryMap.spec.js +18 -0
  444. package/lib/utils/agentDisplayName.spec.js +48 -0
  445. package/lib/utils/autoApproveStorage.spec.js +25 -0
  446. package/lib/utils/chatInputFiles.spec.js +39 -0
  447. package/lib/utils/contextMentionIcons.spec.js +41 -0
  448. package/lib/utils/contextMentionLabel.spec.js +13 -0
  449. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  450. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  451. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  452. package/lib/utils/entityLinkRender.spec.js +72 -0
  453. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  454. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  455. package/lib/utils/formatUnreadCount.spec.js +12 -0
  456. package/lib/utils/getUnitFileSize.spec.js +18 -0
  457. package/lib/utils/hitlAnalytics.spec.js +136 -0
  458. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  459. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  460. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  461. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  462. package/lib/utils/imagePreprocessor.js +12 -37
  463. package/lib/utils/imagePreprocessor.spec.js +112 -0
  464. package/lib/utils/maiaPageRoute.js +24 -0
  465. package/lib/utils/maiaPageRoute.spec.js +23 -0
  466. package/lib/utils/mapBackendLang.spec.js +19 -0
  467. package/lib/utils/navigateContextEntity.spec.js +50 -0
  468. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  469. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  470. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  471. package/lib/utils/reasoningMappers.spec.js +103 -0
  472. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  473. package/lib/utils/renderContextMentions.helpers.js +110 -0
  474. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  475. package/lib/utils/renderContextMentions.js +4 -110
  476. package/lib/utils/renderContextMentions.spec.js +268 -0
  477. package/lib/utils/retryCompletion.spec.js +181 -0
  478. package/lib/utils/skillContentSize.spec.js +13 -0
  479. package/lib/utils/slashCommandMarker.spec.js +43 -0
  480. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  481. package/lib/utils/sseStreamContent.spec.js +31 -0
  482. package/lib/utils/streamActivityMessages.helpers.js +223 -0
  483. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  484. package/lib/utils/streamActivityMessages.js +33 -238
  485. package/lib/utils/streamActivityMessages.spec.js +336 -0
  486. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  487. package/package.json +2 -2
  488. package/README.md +0 -2
  489. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  490. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  491. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  492. package/lib/types/contextCompaction.js +0 -48
  493. package/lib/types/jest-dom.d.js +0 -2
@@ -1,5 +1,5 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
5
  import _regeneratorRuntime from "@babel/runtime/regenerator";
@@ -47,32 +47,12 @@ import { DeleteQuestionModal } from '../DeleteQuestionModal/DeleteQuestionModal'
47
47
  import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
48
48
  import { useAccessClient } from '../../../hooks/useAccessClient/useAccessClient';
49
49
  import { useToggleFavorite } from '../../../hooks';
50
- import { deriveAssignedConnectorSlugs, deriveCorAccessFromToolGroupSlugs, deriveMcpConnectorSlugs, DEFAULT_COR_ACCESS, COR_TOOL_GROUP_SLUGS, buildAgentToolGroupsRequest } from '../../../utils/normalizeAgentConnectors';
50
+ import { buildAgentToolGroupsRequest, DEFAULT_COR_ACCESS, deriveAssignedConnectorSlugs } from '../../../utils/normalizeAgentConnectors';
51
+ import { applyKnowledgeFileStatusUpdate, buildEditingModalValuesFromAgentDetail, createInitialAbmModalValues, hasAbmPendingChanges, hasAccessibilitySectionChanged, hasInactiveAccessibilityClients, isAbmSaveDisabled, isSameAgentModalSnapshot, resolveKnowledgeUploadOutcome, shouldConfirmAbmClose, canRenderAbmAgentModal, isAbmAccessDeniedError, resolveAbmProcessingKnowledgeLabelKey, resolvePendingAbmInitialSection, mergeAbmOpenAgentValues, shouldCloseAbmOnBackdropClick, resolveAbmCreateAccessUpdateContext, shouldSyncAbmClientAccessOnCreate, resolveAbmCreateSuccessPlan, shouldShowProcessFilesForCreatePlan, resolveAbmUpdateSuccessPlan, resolveAbmUpdateAccessUpdateContext, resolveAbmUpdateAccessOnlyContext, resolveAbmCreateAccessOnlyDecision, createResetAbmAccessUpdateContext, shouldFinalizeAbmUpdateWithoutPendingWork, resolveKnowledgeWsCompletionEffects, resolveAbmKnowledgeErrorMessageKey, shouldBlockKnowledgeDeleteSuccessClose, shouldDeferAccessUpdateUntilFilesComplete, shouldCloseCreateAfterKnowledgeWithoutAccess, shouldCloseCreateAfterKnowledgeWithAccess, shouldApplyPendingSectionAfterOpen, resolveAbmOpenModalLoadAction, canApplyAbmEditingAgentDetail, shouldSetDefaultAiModelForNewAgent, shouldSkipAbmConfirmWithoutMultiAgents, resolveAbmDraftFavoriteValue, resolveAbmCreateFavoriteAgents, applyAbmKnowledgeFileActions, mergeAbmAgentValuesByKey, shouldRunAbmCreateSuccessHandler, resolveAbmCreateKnowledgeHandler, shouldRepeatDeleteKnowledgesOnCreate, shouldEnqueueAbmCreateFavoriteToggle, shouldHandleAbmCreateAccessOnlyClient, shouldProcessKnowledgeWsStatus, resolveAbmKnowledgeWsChannel, resolveAbmFavoriteTooltipKey, shouldSelectAgentAfterDelete, shouldRunAbmProcessFilesTimeout, resolveAbmProcessFilesTimeoutSuccessKey, shouldSyncSelectedAgentAfterMutation, shouldIncludeAccessibilityUpdateInKnowledgeBatch, shouldResetSuccessUpdateAccessOnCreateClose, shouldHydrateAgentConnectorsOnEdit, shouldShowAbmLoaderFiles, resolveAbmModalTitleKey, shouldDisableAbmHeaderClose, resolveAbmSaveAction, resolveProcessFilesTimeoutFlagBeforeSave } from './AbmAgentModal.helpers';
51
52
  import { getAgentConnectors } from '../../../services/maia/Agents/connectors';
52
53
  import { hasMaiaExternalConnectorsAccess } from '../../../constants/maiaExternalConnectorsAccess';
53
54
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
54
- var initialValues = Object.freeze({
55
- isEditing: false,
56
- knowledge: [],
57
- general: {
58
- name: '',
59
- emoji: '',
60
- introduction: '',
61
- inputPlaceholder: '',
62
- isActive: false,
63
- aiModel: null,
64
- id: null,
65
- userPrompt: null,
66
- knowledgeBases: [],
67
- is_favorite: false
68
- },
69
- accessibility: {
70
- accessType: 'company',
71
- clients: null,
72
- corAccess: DEFAULT_COR_ACCESS,
73
- selectedConnectors: []
74
- }
75
- });
55
+ var initialValues = Object.freeze(createInitialAbmModalValues());
76
56
  export var SectionByKey = {
77
57
  general: function general(props) {
78
58
  return /*#__PURE__*/_jsx(AbmGeneralSection, _objectSpread({}, props));
@@ -84,64 +64,8 @@ export var SectionByKey = {
84
64
  return /*#__PURE__*/_jsx(AbmAccessibilitySection, _objectSpread({}, props));
85
65
  }
86
66
  };
87
- var validateFieldValues = function validateFieldValues(valueToValidate) {
88
- if (!valueToValidate.general.name || !valueToValidate.general.userPrompt) {
89
- return false;
90
- }
91
- return true;
92
- };
93
-
94
- /** Misma estructura que el efecto que hidrata desde useGetAgentById (todas las pestañas del ABM). */
95
- function buildEditingModalValuesFromAgentDetail(agentById, agentModels, prev) {
96
- var _agentById$knowledgeB, _agentById$clients;
97
- var agentModel = agentModels.find(function (model) {
98
- return model.id === agentById.modelAiId;
99
- });
100
- return _objectSpread(_objectSpread({}, prev), {}, {
101
- isEditing: true,
102
- general: {
103
- emoji: agentById.emoji,
104
- name: agentById.name,
105
- introduction: agentById.introduction,
106
- inputPlaceholder: agentById.inputPlaceholder,
107
- isActive: agentById.isActive,
108
- aiModel: agentModel || null,
109
- id: agentById.id,
110
- userPrompt: agentById.userPrompt,
111
- knowledgeBases: [],
112
- is_favorite: agentById.is_favorite,
113
- created_by: agentById.createdBy
114
- },
115
- knowledge: ((_agentById$knowledgeB = agentById.knowledgeBases) === null || _agentById$knowledgeB === void 0 ? void 0 : _agentById$knowledgeB.map(function (k) {
116
- return {
117
- file: new File([], k.filename),
118
- id: k.id.toString(),
119
- name: k.filename,
120
- size: k.file_size_bytes || 0,
121
- type: k.original_file_type,
122
- status: k.status,
123
- url_original: k.url_original || undefined,
124
- url_thumbnail: k.url_thumbnail || undefined
125
- };
126
- })) || [],
127
- accessibility: {
128
- accessType: agentById.access,
129
- clients: ((_agentById$clients = agentById.clients) === null || _agentById$clients === void 0 ? void 0 : _agentById$clients.map(function (client) {
130
- var _client$id, _client$is_active, _client$is_deleted;
131
- return {
132
- id: ((_client$id = client.id) === null || _client$id === void 0 ? void 0 : _client$id.toString()) || '',
133
- name: client.name,
134
- is_active: (_client$is_active = client.is_active) !== null && _client$is_active !== void 0 ? _client$is_active : false,
135
- is_deleted: (_client$is_deleted = client.is_deleted) !== null && _client$is_deleted !== void 0 ? _client$is_deleted : false
136
- };
137
- })) || null,
138
- corAccess: deriveCorAccessFromToolGroupSlugs(agentById.toolGroupSlugs),
139
- selectedConnectors: deriveMcpConnectorSlugs(agentById.connectors)
140
- }
141
- });
142
- }
143
67
  export var AbmAgentModal = function AbmAgentModal(_ref) {
144
- var _user$permissions, _modalValues$accessib4, _modalValues$general3, _modalValues$general4, _modalValues$general5, _modalValues$general6;
68
+ var _user$permissions, _modalValues$accessib3, _modalValues$general3, _modalValues$general4, _modalValues$general5, _modalValues$general6;
145
69
  var addAgent = _ref.addAgent,
146
70
  updateAgent = _ref.updateAgent,
147
71
  removeAgent = _ref.removeAgent,
@@ -260,67 +184,23 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
260
184
  successUpdateAccess = _useAccessClient.success,
261
185
  isLoadingUpdateAccess = _useAccessClient.isLoading,
262
186
  resetSuccessUpdateAccess = _useAccessClient.handleResetSuccess;
263
- if (!selector) return null;
264
- var areClientsArraysEqual = function areClientsArraysEqual(clients1, clients2) {
265
- if (!clients1 && !clients2) return true;
266
- if (!clients1 || !clients2) return false;
267
- if (clients1.length !== clients2.length) return false;
268
- var clients1Ids = clients1.map(function (c) {
269
- return c.clientId;
270
- }).sort();
271
- var clients2Ids = clients2.map(function (c) {
272
- return c.clientId;
273
- }).sort();
274
- return clients1Ids.every(function (id, index) {
275
- return id === clients2Ids[index];
276
- });
277
- };
187
+ var creationDraftDefaults = useMemo(function () {
188
+ var _agentModels$0$id, _agentModels$;
189
+ return {
190
+ defaultInputPlaceholder: t('generalSection.inputPlaceholder'),
191
+ defaultUserPromptPlaceholder: t('generalSection.initialPromptPlaceholder'),
192
+ defaultAiModelId: (_agentModels$0$id = (_agentModels$ = agentModels[0]) === null || _agentModels$ === void 0 ? void 0 : _agentModels$.id) !== null && _agentModels$0$id !== void 0 ? _agentModels$0$id : null
193
+ };
194
+ }, [agentModels, t]);
278
195
  var hasAccessibilityChanged = function hasAccessibilityChanged() {
279
- var _firstValueAgent$curr, _modalValues$accessib, _firstValueAgent$curr2;
280
- if (!((_firstValueAgent$curr = firstValueAgent.current) !== null && _firstValueAgent$curr !== void 0 && _firstValueAgent$curr.accessibility) || !(modalValues !== null && modalValues !== void 0 && modalValues.accessibility)) return true;
281
- var accessTypeSame = modalValues.accessibility.accessType === firstValueAgent.current.accessibility.accessType;
282
- var clientsSame = areClientsArraysEqual(modalValues.accessibility.clients, firstValueAgent.current.accessibility.clients);
283
- var currentCorAccess = (_modalValues$accessib = modalValues.accessibility.corAccess) !== null && _modalValues$accessib !== void 0 ? _modalValues$accessib : DEFAULT_COR_ACCESS;
284
- var initialCorAccess = (_firstValueAgent$curr2 = firstValueAgent.current.accessibility.corAccess) !== null && _firstValueAgent$curr2 !== void 0 ? _firstValueAgent$curr2 : DEFAULT_COR_ACCESS;
285
- var corAccessSame = COR_TOOL_GROUP_SLUGS.every(function (slug) {
286
- return currentCorAccess[slug] === initialCorAccess[slug];
287
- });
288
- var currentConnectors = _toConsumableArray(modalValues.accessibility.selectedConnectors || []).sort();
289
- var originalConnectors = _toConsumableArray(firstValueAgent.current.accessibility.selectedConnectors || []).sort();
290
- var connectorsSame = currentConnectors.length === originalConnectors.length && currentConnectors.every(function (slug, index) {
291
- return slug === originalConnectors[index];
292
- });
293
- return !accessTypeSame || !clientsSame || !corAccessSame || !connectorsSame;
294
- };
295
- var validateAgentValuesIsSame = function validateAgentValuesIsSame() {
296
- var _firstValueAgent$curr3, _modalValues$general$, _firstValueAgent$curr4, _modalValues$knowledg, _firstValueAgent$curr5, _modalValues$knowledg2, _firstValueAgent$curr6, _actionsToFiles$curre, _actionsToFiles$curre2;
297
- if (!((_firstValueAgent$curr3 = firstValueAgent.current) !== null && _firstValueAgent$curr3 !== void 0 && _firstValueAgent$curr3.general) || !(modalValues !== null && modalValues !== void 0 && modalValues.general)) return false;
298
- return modalValues.general.name === firstValueAgent.current.general.name && modalValues.general.emoji === firstValueAgent.current.general.emoji && modalValues.general.introduction === firstValueAgent.current.general.introduction && modalValues.general.inputPlaceholder === firstValueAgent.current.general.inputPlaceholder && ((_modalValues$general$ = modalValues.general.aiModel) === null || _modalValues$general$ === void 0 ? void 0 : _modalValues$general$.id) === ((_firstValueAgent$curr4 = firstValueAgent.current.general.aiModel) === null || _firstValueAgent$curr4 === void 0 ? void 0 : _firstValueAgent$curr4.id) && modalValues.general.userPrompt === firstValueAgent.current.general.userPrompt && (((_modalValues$knowledg = modalValues.knowledge) === null || _modalValues$knowledg === void 0 ? void 0 : _modalValues$knowledg.length) === ((_firstValueAgent$curr5 = firstValueAgent.current) === null || _firstValueAgent$curr5 === void 0 || (_firstValueAgent$curr5 = _firstValueAgent$curr5.knowledge) === null || _firstValueAgent$curr5 === void 0 ? void 0 : _firstValueAgent$curr5.length) || !((_modalValues$knowledg2 = modalValues.knowledge) !== null && _modalValues$knowledg2 !== void 0 && _modalValues$knowledg2.length) && !((_firstValueAgent$curr6 = firstValueAgent.current) !== null && _firstValueAgent$curr6 !== void 0 && (_firstValueAgent$curr6 = _firstValueAgent$curr6.knowledge) !== null && _firstValueAgent$curr6 !== void 0 && _firstValueAgent$curr6.length)) && !((_actionsToFiles$curre = actionsToFiles.current.toUpdate) !== null && _actionsToFiles$curre !== void 0 && _actionsToFiles$curre.length) && !((_actionsToFiles$curre2 = actionsToFiles.current.toDelete) !== null && _actionsToFiles$curre2 !== void 0 && _actionsToFiles$curre2.length) && !hasAccessibilityChanged();
299
- };
300
- var hasAnyValueForCreation = function hasAnyValueForCreation() {
301
- var _modalValues$general$2, _agentModels$, _modalValues$general$3;
302
- if (modalValues.isEditing) return false;
303
- var isDefaultAiModel = !!agentModels.length && ((_modalValues$general$2 = modalValues.general.aiModel) === null || _modalValues$general$2 === void 0 ? void 0 : _modalValues$general$2.id) === ((_agentModels$ = agentModels[0]) === null || _agentModels$ === void 0 ? void 0 : _agentModels$.id);
304
- var defaultInputPlaceholder = t('generalSection.inputPlaceholder');
305
- var isDefaultInputPlaceholder = modalValues.general.inputPlaceholder === defaultInputPlaceholder;
306
- var defaultUserPromptPlaceholder = t('generalSection.initialPromptPlaceholder');
307
- var isDefaultUserPrompt = modalValues.general.userPrompt === defaultUserPromptPlaceholder || modalValues.general.userPrompt === '' || modalValues.general.userPrompt === null;
308
- var hasName = modalValues.general.name.trim() !== '';
309
- var hasEmoji = modalValues.general.emoji.trim() !== '';
310
- var hasIntroduction = modalValues.general.introduction.trim() !== '';
311
- var hasInputPlaceholder = modalValues.general.inputPlaceholder.trim() !== '' && !isDefaultInputPlaceholder;
312
- var hasUserPrompt = ((_modalValues$general$3 = modalValues.general.userPrompt) === null || _modalValues$general$3 === void 0 ? void 0 : _modalValues$general$3.trim()) !== '' && !isDefaultUserPrompt;
313
- var hasKnowledge = !!modalValues.knowledge.length;
314
- var hasCustomAiModel = modalValues.general.aiModel && !isDefaultAiModel;
315
- var hasAccessibility = modalValues.accessibility.accessType !== 'company';
316
- return hasName || hasEmoji || hasIntroduction || hasInputPlaceholder || hasUserPrompt || hasKnowledge || hasCustomAiModel || hasAccessibility;
317
- };
318
- var hasChangesForEditing = function hasChangesForEditing() {
319
- if (!modalValues.isEditing) return false;
320
- return !validateAgentValuesIsSame() || !!actionsToFiles.current.toDelete.length || !!actionsToFiles.current.toUpload.length;
196
+ var _firstValueAgent$curr;
197
+ return hasAccessibilitySectionChanged(modalValues.accessibility, (_firstValueAgent$curr = firstValueAgent.current) === null || _firstValueAgent$curr === void 0 ? void 0 : _firstValueAgent$curr.accessibility);
321
198
  };
322
199
  var hasPendingChanges = function hasPendingChanges() {
323
- return hasAnyValueForCreation() || hasChangesForEditing();
200
+ return hasAbmPendingChanges(modalValues, firstValueAgent.current, actionsToFiles.current, creationDraftDefaults);
201
+ };
202
+ var validateAgentValuesIsSame = function validateAgentValuesIsSame() {
203
+ return Boolean(firstValueAgent.current && isSameAgentModalSnapshot(modalValues, firstValueAgent.current, actionsToFiles.current));
324
204
  };
325
205
 
326
206
  // Helper para manejar el toggle de favorito y actualizar el estado con ordenamiento
@@ -338,7 +218,11 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
338
218
  }, agent.is_favorite);
339
219
  }, [toggleFavorite, updateAgentFavorite]);
340
220
  var handleClose = function handleClose() {
341
- if (hasPendingChanges() && !successCreate && !successUpdate && !successDelete) {
221
+ if (shouldConfirmAbmClose(hasPendingChanges(), {
222
+ create: successCreate,
223
+ update: successUpdate,
224
+ "delete": successDelete
225
+ })) {
342
226
  var confirmMessage = modalValues.isEditing ? t('confirmCloseEditAgent') : t('confirmCloseCreateAgent');
343
227
  if (!window.confirm(confirmMessage)) {
344
228
  return;
@@ -353,13 +237,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
353
237
  toDelete: [],
354
238
  toUpload: []
355
239
  };
356
- accessUpdateContext.current = {
357
- isFromCreation: false,
358
- isFromEditing: false,
359
- hasActionFiles: false,
360
- operationType: null,
361
- hasBeenCalled: false
362
- };
240
+ accessUpdateContext.current = createResetAbmAccessUpdateContext();
363
241
  accessHandledRef.current = false;
364
242
  hasPendingFilesRef.current = false;
365
243
  processFilesTimedOutRef.current = false;
@@ -374,7 +252,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
374
252
  prefetchedAgentByIdRef.current = null;
375
253
  };
376
254
  var handleBackdropClick = function handleBackdropClick(event) {
377
- if (event.target === event.currentTarget && !isShowProcessFiles) {
255
+ if (shouldCloseAbmOnBackdropClick(event.target, event.currentTarget, isShowProcessFiles)) {
378
256
  handleClose();
379
257
  }
380
258
  };
@@ -389,46 +267,21 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
389
267
  value = _ref2.value,
390
268
  deleteKnowledge = _ref2.deleteKnowledge;
391
269
  if (key === 'knowledge') {
392
- if (!deleteKnowledge) {
393
- var _actionsToFiles$curre3;
394
- (_actionsToFiles$curre3 = actionsToFiles.current.toUpload).push.apply(_actionsToFiles$curre3, _toConsumableArray(value || []));
395
- } else {
396
- var filesPrevIds = value.length ? new Set(value.map(function (file) {
397
- return file.id;
398
- })) : new Set();
399
- var newFiles = modalValues.knowledge.filter(function (file) {
400
- return !filesPrevIds.has(file.id) && file.status !== 'started';
401
- });
402
- if (!newFiles.length && actionsToFiles.current.toUpload.length) {
403
- var valueIds = new Set(value.map(function (file) {
404
- return file.id;
405
- }));
406
- actionsToFiles.current.toUpload = actionsToFiles.current.toUpload.filter(function (file) {
407
- return valueIds.has(file.id);
408
- });
409
- }
410
- actionsToFiles.current.toDelete = [].concat(_toConsumableArray(actionsToFiles.current.toDelete || []), _toConsumableArray(newFiles));
411
- }
270
+ var nextActions = applyAbmKnowledgeFileActions(value, deleteKnowledge, modalValues.knowledge, actionsToFiles.current);
271
+ actionsToFiles.current = nextActions;
412
272
  }
413
273
  setModalValues(function (prev) {
414
- var knowledgeFiles = key === 'knowledge' ? deleteKnowledge ? value : [].concat(_toConsumableArray(prev.knowledge || []), _toConsumableArray(value || [])) : null;
415
- return _objectSpread(_objectSpread({}, prev), key === 'knowledge' ? {
416
- knowledge: knowledgeFiles
417
- } : key === 'accessibility' ? {
418
- accessibility: value
419
- } : {
420
- general: _objectSpread(_objectSpread({}, prev.general), {}, _defineProperty({}, key, value))
421
- });
274
+ return mergeAbmAgentValuesByKey(prev, key, value, deleteKnowledge);
422
275
  });
423
276
  };
424
277
  var _handleConfirmAction = /*#__PURE__*/function () {
425
278
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(chat, action) {
426
- var _modalValues$accessib2;
427
- var corAccess;
279
+ var _modalValues$accessib;
280
+ var corAccess, saveAction;
428
281
  return _regeneratorRuntime.wrap(function (_context) {
429
282
  while (1) switch (_context.prev = _context.next) {
430
283
  case 0:
431
- if (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
284
+ if (!shouldSkipAbmConfirmWithoutMultiAgents(Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS))) {
432
285
  _context.next = 1;
433
286
  break;
434
287
  }
@@ -442,7 +295,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
442
295
  handleDeleteAgent(chat.id);
443
296
  return _context.abrupt("return");
444
297
  case 2:
445
- corAccess = (_modalValues$accessib2 = modalValues.accessibility.corAccess) !== null && _modalValues$accessib2 !== void 0 ? _modalValues$accessib2 : DEFAULT_COR_ACCESS;
298
+ corAccess = (_modalValues$accessib = modalValues.accessibility.corAccess) !== null && _modalValues$accessib !== void 0 ? _modalValues$accessib : DEFAULT_COR_ACCESS;
446
299
  eventAmplitude(EVENTS.confirmAction, {
447
300
  option: modalValues.isEditing ? 'edit' : 'create',
448
301
  cor_slugs: buildAgentToolGroupsRequest(corAccess),
@@ -450,21 +303,21 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
450
303
  });
451
304
  // Al reintentar guardar, liberar el freno del timeout previo para que los
452
305
  // useEffect de post-guardado vuelvan a poder disparar snackbars y cerrar.
453
- processFilesTimedOutRef.current = false;
454
- if (!modalValues.isEditing) {
306
+ processFilesTimedOutRef.current = resolveProcessFilesTimeoutFlagBeforeSave();
307
+ saveAction = resolveAbmSaveAction(modalValues.isEditing, validateAgentValuesIsSame());
308
+ if (!(saveAction === 'update')) {
455
309
  _context.next = 4;
456
310
  break;
457
311
  }
458
- if (validateAgentValuesIsSame()) {
459
- _context.next = 3;
460
- break;
461
- }
462
312
  _context.next = 3;
463
313
  return handleUpdateAgent(modalValues);
464
314
  case 3:
465
- _context.next = 5;
466
- break;
315
+ return _context.abrupt("return");
467
316
  case 4:
317
+ if (!(saveAction === 'create')) {
318
+ _context.next = 5;
319
+ break;
320
+ }
468
321
  _context.next = 5;
469
322
  return handleCreateAgent(modalValues);
470
323
  case 5:
@@ -481,48 +334,41 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
481
334
  var handleSetAgentValues = function handleSetAgentValues(event) {
482
335
  var _agentValues$values, _agentValues$values3;
483
336
  var agentValues = event.detail.agentValues;
484
- var initialSection = agentValues === null || agentValues === void 0 ? void 0 : agentValues.initialSection;
485
- pendingInitialSectionRef.current = initialSection && ['general', 'knowledge', 'accessibility'].includes(initialSection) ? initialSection : null;
337
+ pendingInitialSectionRef.current = resolvePendingAbmInitialSection(agentValues === null || agentValues === void 0 ? void 0 : agentValues.initialSection);
486
338
  hydratingAgentIdRef.current = null;
487
339
  getAllAgentModels();
488
340
  setIsOpen(true);
489
341
  setIsLoading(true);
490
- accessUpdateContext.current = {
491
- isFromCreation: false,
492
- isFromEditing: false,
493
- hasActionFiles: false,
494
- operationType: null,
495
- hasBeenCalled: false
496
- };
497
- if ((_agentValues$values = agentValues.values) !== null && _agentValues$values !== void 0 && _agentValues$values.isEditing) {
342
+ accessUpdateContext.current = createResetAbmAccessUpdateContext();
343
+ var openLoadAction = resolveAbmOpenModalLoadAction({
344
+ isEditing: (_agentValues$values = agentValues.values) === null || _agentValues$values === void 0 ? void 0 : _agentValues$values.isEditing,
345
+ hasMultiAgentsAccess: Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS),
346
+ hasPrefetchedAgent: Boolean(agentValues.prefetchedAgentById)
347
+ });
348
+ if (openLoadAction === 'deny_edit') {
349
+ handleSnackbarError(t('errorAccessDenied'));
350
+ setIsOpen(false);
351
+ setIsLoading(false);
352
+ pendingInitialSectionRef.current = null;
353
+ prefetchedAgentByIdRef.current = null;
354
+ return;
355
+ }
356
+ if (openLoadAction === 'prefetch_edit') {
357
+ handleCleanAgent();
358
+ prefetchedAgentByIdRef.current = agentValues.prefetchedAgentById;
359
+ return;
360
+ }
361
+ if (openLoadAction === 'fetch_edit') {
498
362
  var _agentValues$values2;
499
- // Validar que la feature flag esté habilitada antes de cargar el agente para editar
500
- if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
501
- handleSnackbarError(t('errorAccessDenied'));
502
- setIsOpen(false);
503
- setIsLoading(false);
504
- pendingInitialSectionRef.current = null;
505
- prefetchedAgentByIdRef.current = null;
506
- return;
507
- }
508
- if (agentValues.prefetchedAgentById) {
509
- handleCleanAgent();
510
- prefetchedAgentByIdRef.current = agentValues.prefetchedAgentById;
511
- return;
512
- }
513
363
  handleGetAgentById(agentValues === null || agentValues === void 0 || (_agentValues$values2 = agentValues.values) === null || _agentValues$values2 === void 0 || (_agentValues$values2 = _agentValues$values2.general) === null || _agentValues$values2 === void 0 ? void 0 : _agentValues$values2.id);
514
364
  return;
515
365
  }
516
366
  if (agentValues.values) {
517
- var nextValues = _objectSpread(_objectSpread(_objectSpread({}, initialValues), agentValues.values), {}, {
518
- general: _objectSpread(_objectSpread({}, initialValues.general), agentValues.values.general || {}),
519
- accessibility: _objectSpread(_objectSpread({}, initialValues.accessibility), agentValues.values.accessibility || {}),
520
- knowledge: agentValues.values.knowledge || []
521
- });
367
+ var nextValues = mergeAbmOpenAgentValues(initialValues, agentValues.values);
522
368
  firstValueAgent.current = nextValues;
523
369
  setModalValues(nextValues);
524
370
  }
525
- if (pendingInitialSectionRef.current && !((_agentValues$values3 = agentValues.values) !== null && _agentValues$values3 !== void 0 && _agentValues$values3.isEditing)) {
371
+ if (shouldApplyPendingSectionAfterOpen(Boolean((_agentValues$values3 = agentValues.values) === null || _agentValues$values3 === void 0 ? void 0 : _agentValues$values3.isEditing), pendingInitialSectionRef.current)) {
526
372
  setSection(pendingInitialSectionRef.current);
527
373
  pendingInitialSectionRef.current = null;
528
374
  }
@@ -571,7 +417,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
571
417
  if (successDelete) {
572
418
  handleSnackbarSuccess(t('confirmAgentDeleted'));
573
419
  resetSuccess();
574
- if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === modalValues.general.id) {
420
+ if (shouldSelectAgentAfterDelete(currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id, modalValues.general.id)) {
575
421
  selectFirstAgent(currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id);
576
422
  }
577
423
  removeAgent(modalValues.general.id);
@@ -580,339 +426,181 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
580
426
  }
581
427
  }, [successDelete]);
582
428
  useEffect(function () {
583
- // Evitar ejecución múltiple del efecto
584
- if (successCreate && !isLoadingCreate && agentCreatedRef.current !== successCreate.id) {
585
- agentCreatedRef.current = successCreate.id;
586
- if (actionsToFiles.current.toDelete.length && actionsToFiles.current.toUpload.length) {
587
- if (modalValues.accessibility.accessType !== 'company') {
588
- accessUpdateContext.current = {
589
- isFromCreation: true,
590
- isFromEditing: false,
591
- hasActionFiles: true,
592
- operationType: 'create',
593
- hasBeenCalled: false
594
- };
595
- } else {
596
- // Si no hay accesibilidad pero hay archivos, establecer el contexto para creación
597
- accessUpdateContext.current = {
598
- isFromCreation: true,
599
- isFromEditing: false,
600
- hasActionFiles: false,
601
- operationType: 'create',
602
- hasBeenCalled: false
603
- };
604
- }
605
- var promises = [handleDeleteAndCreateKnowledges({
429
+ if (!successCreate) {
430
+ return;
431
+ }
432
+ if (!shouldRunAbmCreateSuccessHandler(successCreate.id, isLoadingCreate, agentCreatedRef.current)) {
433
+ return;
434
+ }
435
+ agentCreatedRef.current = successCreate.id;
436
+ var createPlan = resolveAbmCreateSuccessPlan(actionsToFiles.current);
437
+ var _resolveAbmCreateFavo = resolveAbmCreateFavoriteAgents(successCreate, Boolean(modalValues.general.is_favorite)),
438
+ listAgent = _resolveAbmCreateFavo.listAgent,
439
+ toggleAgent = _resolveAbmCreateFavo.toggleAgent;
440
+ var enqueueCreateFavorite = function enqueueCreateFavorite(promises) {
441
+ addAgent(listAgent);
442
+ if (shouldEnqueueAbmCreateFavoriteToggle(toggleAgent)) {
443
+ promises.push(new Promise(function (resolve, reject) {
444
+ handleToggleFavoriteForAgent(successCreate.id.toString(), toggleAgent, function () {
445
+ return resolve();
446
+ }, function () {
447
+ return reject();
448
+ });
449
+ }));
450
+ }
451
+ };
452
+ if (createPlan !== 'accessOnly') {
453
+ accessUpdateContext.current = resolveAbmCreateAccessUpdateContext(modalValues.accessibility.accessType);
454
+ var promises = [];
455
+ var knowledgeHandler = resolveAbmCreateKnowledgeHandler(createPlan);
456
+ if (knowledgeHandler === 'deleteAndCreate') {
457
+ promises.push(handleDeleteAndCreateKnowledges({
606
458
  filesToDelete: actionsToFiles.current.toDelete,
607
459
  filesToCreate: actionsToFiles.current.toUpload,
608
460
  agentId: successCreate.id.toString()
609
- })];
610
- if (modalValues.accessibility.accessType !== 'company') {
611
- promises.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
612
- }
613
- if (modalValues.general.is_favorite) {
614
- var agentWithFavorite = _objectSpread(_objectSpread({}, successCreate), {}, {
615
- is_favorite: true
616
- });
617
- addAgent(agentWithFavorite);
618
- // Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
619
- // Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
620
- var agentForToggle = _objectSpread(_objectSpread({}, agentWithFavorite), {}, {
621
- is_favorite: false
622
- });
623
- promises.push(new Promise(function (resolve, reject) {
624
- handleToggleFavoriteForAgent(successCreate.id.toString(), agentForToggle, function () {
625
- return resolve();
626
- }, function () {
627
- return reject();
628
- });
629
- }));
630
- } else {
631
- addAgent(successCreate);
632
- }
633
- Promise.all(promises);
634
- hasPendingFilesRef.current = true;
635
- setIsShowProcessFiles(true);
636
- return;
637
- }
638
- if (actionsToFiles.current.toDelete.length) {
639
- if (modalValues.accessibility.accessType !== 'company') {
640
- accessUpdateContext.current = {
641
- isFromCreation: true,
642
- isFromEditing: false,
643
- hasActionFiles: true,
644
- operationType: 'create',
645
- hasBeenCalled: false
646
- };
647
- } else {
648
- // Si no hay accesibilidad pero hay archivos, establecer el contexto para creación
649
- accessUpdateContext.current = {
650
- isFromCreation: true,
651
- isFromEditing: false,
652
- hasActionFiles: false,
653
- operationType: 'create',
654
- hasBeenCalled: false
655
- };
656
- }
657
- var _promises = [handleDeleteKnowledges({
461
+ }));
462
+ } else if (knowledgeHandler === 'deleteOnly') {
463
+ promises.push(handleDeleteKnowledges({
658
464
  files: actionsToFiles.current.toDelete,
659
465
  agentId: successCreate.id.toString()
660
- })];
661
- if (modalValues.accessibility.accessType !== 'company') {
662
- _promises.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
663
- }
664
- if (modalValues.general.is_favorite) {
665
- var _agentWithFavorite = _objectSpread(_objectSpread({}, successCreate), {}, {
666
- is_favorite: true
667
- });
668
- addAgent(_agentWithFavorite);
669
- // Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
670
- // Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
671
- var _agentForToggle = _objectSpread(_objectSpread({}, _agentWithFavorite), {}, {
672
- is_favorite: false
673
- });
674
- _promises.push(new Promise(function (resolve, reject) {
675
- handleToggleFavoriteForAgent(successCreate.id.toString(), _agentForToggle, function () {
676
- return resolve();
677
- }, function () {
678
- return reject();
679
- });
680
- }));
681
- } else {
682
- addAgent(successCreate);
683
- }
684
- Promise.all(_promises);
466
+ }));
467
+ } else if (knowledgeHandler === 'uploadOnly') {
468
+ promises.push(handleCreateKnowledges({
469
+ files: actionsToFiles.current.toUpload,
470
+ agentId: successCreate.id.toString()
471
+ }));
472
+ }
473
+ if (shouldSyncAbmClientAccessOnCreate(modalValues.accessibility.accessType)) {
474
+ promises.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
475
+ }
476
+ enqueueCreateFavorite(promises);
477
+ Promise.all(promises);
478
+ if (shouldRepeatDeleteKnowledgesOnCreate(createPlan)) {
685
479
  handleDeleteKnowledges({
686
480
  files: actionsToFiles.current.toDelete,
687
481
  agentId: successCreate.id.toString()
688
482
  });
689
- hasPendingFilesRef.current = true;
690
- setIsShowProcessFiles(true);
691
- return;
692
483
  }
693
- if (actionsToFiles.current.toUpload.length) {
694
- if (modalValues.accessibility.accessType !== 'company') {
695
- accessUpdateContext.current = {
696
- isFromCreation: true,
697
- isFromEditing: false,
698
- hasActionFiles: true,
699
- operationType: 'create',
700
- hasBeenCalled: false
701
- };
702
- } else {
703
- // Si no hay accesibilidad pero hay archivos, establecer el contexto para creación
704
- accessUpdateContext.current = {
705
- isFromCreation: true,
706
- isFromEditing: false,
707
- hasActionFiles: false,
708
- operationType: 'create',
709
- hasBeenCalled: false
710
- };
711
- }
712
- var _promises2 = [handleCreateKnowledges({
713
- files: actionsToFiles.current.toUpload,
714
- agentId: successCreate.id.toString()
715
- })];
716
- if (modalValues.accessibility.accessType !== 'company') {
717
- _promises2.push(handleAccessClient(successCreate.id.toString(), modalValues.accessibility));
718
- }
719
- if (modalValues.general.is_favorite) {
720
- var _agentWithFavorite2 = _objectSpread(_objectSpread({}, successCreate), {}, {
721
- is_favorite: true
722
- });
723
- addAgent(_agentWithFavorite2);
724
- // Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
725
- // Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
726
- var _agentForToggle2 = _objectSpread(_objectSpread({}, _agentWithFavorite2), {}, {
727
- is_favorite: false
728
- });
729
- _promises2.push(new Promise(function (resolve, reject) {
730
- handleToggleFavoriteForAgent(successCreate.id.toString(), _agentForToggle2, function () {
731
- return resolve();
732
- }, function () {
733
- return reject();
734
- });
735
- }));
736
- } else {
737
- addAgent(successCreate);
738
- }
739
- Promise.all(_promises2);
484
+ if (shouldShowProcessFilesForCreatePlan(createPlan)) {
740
485
  hasPendingFilesRef.current = true;
741
486
  setIsShowProcessFiles(true);
742
- return;
743
- }
744
- if (modalValues.accessibility.accessType !== 'company') {
745
- // Solo resetear el contexto si NO se ha llamado todavía
746
- if (!accessUpdateContext.current.hasBeenCalled) {
747
- var hasActionFiles = accessUpdateContext.current.hasActionFiles;
748
- accessUpdateContext.current = {
749
- isFromCreation: true,
750
- isFromEditing: false,
751
- hasActionFiles: hasActionFiles || false,
752
- operationType: 'create',
753
- hasBeenCalled: false
754
- };
755
- }
756
- if (!accessUpdateContext.current.hasBeenCalled) {
757
- handleAccessClient(successCreate.id.toString(), modalValues.accessibility);
758
- accessUpdateContext.current.hasBeenCalled = true;
759
- }
760
-
761
- // Solo ejecutar handleAccessClient, el agente se agregará y el toggle se hará en successUpdateAccess
762
- return;
763
487
  }
764
-
765
- // Handle favorite if it was marked during creation
766
- if (modalValues.general.is_favorite) {
767
- // Primero agregar el agente a la lista (addAgent ya ordena)
768
- var _agentWithFavorite3 = _objectSpread(_objectSpread({}, successCreate), {}, {
769
- is_favorite: true
770
- });
771
- addAgent(_agentWithFavorite3);
772
-
773
- // Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
774
- // Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
775
- var _agentForToggle3 = _objectSpread(_objectSpread({}, _agentWithFavorite3), {}, {
776
- is_favorite: false
488
+ return;
489
+ }
490
+ var accessOnlyDecision = resolveAbmCreateAccessOnlyDecision(accessUpdateContext.current, modalValues.accessibility.accessType);
491
+ accessUpdateContext.current = accessOnlyDecision.nextContext;
492
+ if (shouldHandleAbmCreateAccessOnlyClient(accessOnlyDecision)) {
493
+ handleAccessClient(successCreate.id.toString(), modalValues.accessibility);
494
+ accessUpdateContext.current.hasBeenCalled = true;
495
+ return;
496
+ }
497
+ if (toggleAgent) {
498
+ addAgent(listAgent);
499
+ handleToggleFavoriteForAgent(successCreate.id.toString(), toggleAgent, function (updatedAgent) {
500
+ eventAmplitude(EVENTS.aiChatFavorite, {
501
+ option: updatedAgent.is_favorite ? 'add' : 'remove'
777
502
  });
778
- // Luego hacer el toggle de favorito en el servidor y actualizar el estado
779
- handleToggleFavoriteForAgent(successCreate.id.toString(), _agentForToggle3, function (updatedAgent) {
780
- eventAmplitude(EVENTS.aiChatFavorite, {
781
- option: updatedAgent.is_favorite ? 'add' : 'remove'
782
- });
783
- handleSnackbarSuccess(t('confirmAgentCreated'));
784
- selectAgent(_objectSpread(_objectSpread({}, _agentWithFavorite3), {}, {
785
- is_favorite: updatedAgent.is_favorite
786
- }));
787
- handleResetSuccessDelete();
788
- resetSuccessCreate();
789
- handleClose();
790
- }, function () {
791
- eventAmplitude(EVENTS.aiChatFavorite, {
792
- option: 'add'
793
- });
794
- handleSnackbarSuccess(t('confirmAgentCreated'));
795
- selectAgent(_agentWithFavorite3);
796
- handleResetSuccessDelete();
797
- resetSuccessCreate();
798
- handleClose();
503
+ handleSnackbarSuccess(t('confirmAgentCreated'));
504
+ selectAgent(_objectSpread(_objectSpread({}, listAgent), {}, {
505
+ is_favorite: updatedAgent.is_favorite
506
+ }));
507
+ handleResetSuccessDelete();
508
+ resetSuccessCreate();
509
+ handleClose();
510
+ }, function () {
511
+ eventAmplitude(EVENTS.aiChatFavorite, {
512
+ option: 'add'
799
513
  });
800
- } else {
801
514
  handleSnackbarSuccess(t('confirmAgentCreated'));
802
- addAgent(successCreate);
803
- selectAgent(successCreate);
515
+ selectAgent(listAgent);
804
516
  handleResetSuccessDelete();
805
517
  resetSuccessCreate();
806
518
  handleClose();
807
- }
519
+ });
520
+ return;
808
521
  }
522
+ handleSnackbarSuccess(t('confirmAgentCreated'));
523
+ addAgent(listAgent);
524
+ selectAgent(listAgent);
525
+ handleResetSuccessDelete();
526
+ resetSuccessCreate();
527
+ handleClose();
809
528
  }, [isLoadingCreate, successCreate, handleDeleteAndCreateKnowledges, handleDeleteKnowledges, handleCreateKnowledges, handleSnackbarSuccess, t, addAgent, selectAgent, handleResetSuccessDelete, resetSuccessCreate, handleClose, updateAgentFavorite]);
810
529
  useEffect(function () {
811
- if (successUpdate) {
812
- if (actionsToFiles.current.toDelete.length && actionsToFiles.current.toUpload.length) {
813
- if (hasAccessibilityChanged()) {
814
- accessUpdateContext.current = {
815
- isFromCreation: false,
816
- isFromEditing: true,
817
- hasActionFiles: true,
818
- operationType: 'update',
819
- hasBeenCalled: false
820
- };
821
- }
822
- if (modalValues.general.id) {
823
- var filesToDelete = _toConsumableArray(actionsToFiles.current.toDelete);
824
- var filesToUpload = _toConsumableArray(actionsToFiles.current.toUpload);
825
- actionsToFiles.current.toDelete = [];
826
- actionsToFiles.current.toUpload = [];
827
- Promise.all([handleDeleteAndCreateKnowledges({
828
- filesToDelete: filesToDelete,
829
- filesToCreate: filesToUpload,
830
- agentId: modalValues.general.id.toString()
831
- })].concat(_toConsumableArray(hasAccessibilityChanged() ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
832
- }
833
- hasPendingFilesRef.current = true;
834
- setIsShowProcessFiles(true);
835
- return;
836
- }
837
- if (actionsToFiles.current.toDelete.length) {
838
- if (hasAccessibilityChanged()) {
839
- accessUpdateContext.current = {
840
- isFromCreation: false,
841
- isFromEditing: true,
842
- hasActionFiles: true,
843
- operationType: 'update',
844
- hasBeenCalled: false
845
- };
846
- }
847
- if (modalValues.general.id) {
848
- var _filesToDelete = _toConsumableArray(actionsToFiles.current.toDelete);
849
- actionsToFiles.current.toDelete = [];
850
- Promise.all([handleDeleteKnowledges({
851
- files: _filesToDelete,
852
- agentId: modalValues.general.id.toString()
853
- })].concat(_toConsumableArray(hasAccessibilityChanged() ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
854
- }
855
- return;
856
- }
857
- if (actionsToFiles.current.toUpload.length) {
858
- if (hasAccessibilityChanged()) {
859
- accessUpdateContext.current = {
860
- isFromCreation: false,
861
- isFromEditing: true,
862
- hasActionFiles: true,
863
- operationType: 'update',
864
- hasBeenCalled: false
865
- };
866
- }
867
- if (modalValues.general.id) {
868
- var _filesToUpload = _toConsumableArray(actionsToFiles.current.toUpload);
869
- actionsToFiles.current.toUpload = [];
870
- Promise.all([handleCreateKnowledges({
871
- files: _filesToUpload,
872
- agentId: modalValues.general.id.toString()
873
- })].concat(_toConsumableArray(hasAccessibilityChanged() ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
874
- }
875
- hasPendingFilesRef.current = true;
876
- setIsShowProcessFiles(true);
877
- return;
530
+ if (!successUpdate) {
531
+ return;
532
+ }
533
+ var accessibilityChanged = hasAccessibilityChanged();
534
+ var updatePlan = resolveAbmUpdateSuccessPlan(actionsToFiles.current, accessibilityChanged);
535
+ if (updatePlan !== 'generalOnly' && accessibilityChanged && updatePlan !== 'accessOnly') {
536
+ accessUpdateContext.current = resolveAbmUpdateAccessUpdateContext();
537
+ }
538
+ if (updatePlan === 'deleteAndCreate' && modalValues.general.id) {
539
+ var filesToDelete = _toConsumableArray(actionsToFiles.current.toDelete);
540
+ var filesToUpload = _toConsumableArray(actionsToFiles.current.toUpload);
541
+ actionsToFiles.current.toDelete = [];
542
+ actionsToFiles.current.toUpload = [];
543
+ Promise.all([handleDeleteAndCreateKnowledges({
544
+ filesToDelete: filesToDelete,
545
+ filesToCreate: filesToUpload,
546
+ agentId: modalValues.general.id.toString()
547
+ })].concat(_toConsumableArray(shouldIncludeAccessibilityUpdateInKnowledgeBatch(accessibilityChanged) ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
548
+ hasPendingFilesRef.current = true;
549
+ setIsShowProcessFiles(true);
550
+ return;
551
+ }
552
+ if (updatePlan === 'deleteOnly' && modalValues.general.id) {
553
+ var _filesToDelete = _toConsumableArray(actionsToFiles.current.toDelete);
554
+ actionsToFiles.current.toDelete = [];
555
+ Promise.all([handleDeleteKnowledges({
556
+ files: _filesToDelete,
557
+ agentId: modalValues.general.id.toString()
558
+ })].concat(_toConsumableArray(shouldIncludeAccessibilityUpdateInKnowledgeBatch(accessibilityChanged) ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
559
+ return;
560
+ }
561
+ if (updatePlan === 'uploadOnly' && modalValues.general.id) {
562
+ var _filesToUpload = _toConsumableArray(actionsToFiles.current.toUpload);
563
+ actionsToFiles.current.toUpload = [];
564
+ Promise.all([handleCreateKnowledges({
565
+ files: _filesToUpload,
566
+ agentId: modalValues.general.id.toString()
567
+ })].concat(_toConsumableArray(shouldIncludeAccessibilityUpdateInKnowledgeBatch(accessibilityChanged) ? [handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility)] : [])));
568
+ hasPendingFilesRef.current = true;
569
+ setIsShowProcessFiles(true);
570
+ return;
571
+ }
572
+ if (updatePlan === 'accessOnly') {
573
+ var accessOnlyContext = resolveAbmUpdateAccessOnlyContext(accessUpdateContext.current);
574
+ if (accessOnlyContext) {
575
+ accessUpdateContext.current = accessOnlyContext;
878
576
  }
879
- if (hasAccessibilityChanged()) {
880
- // Solo resetear el contexto si NO se ha llamado todavía y NO hay archivos pendientes
881
- if (!accessUpdateContext.current.hasBeenCalled && !accessUpdateContext.current.hasActionFiles) {
882
- accessUpdateContext.current = {
883
- isFromCreation: false,
884
- isFromEditing: true,
885
- hasActionFiles: false,
886
- operationType: 'update',
887
- hasBeenCalled: false
888
- };
889
- }
890
- if (modalValues.general.id) {
891
- // Llamar a handleAccessClient solo una vez
892
- if (!accessUpdateContext.current.hasBeenCalled) {
893
- handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility);
894
- accessUpdateContext.current.hasBeenCalled = true;
895
- }
896
- }
897
- return;
577
+ if (modalValues.general.id && !accessUpdateContext.current.hasBeenCalled) {
578
+ handleAccessClient(modalValues.general.id.toString(), modalValues.accessibility);
579
+ accessUpdateContext.current.hasBeenCalled = true;
898
580
  }
899
-
900
- // Solo cerrar si no hay archivos siendo procesados ni access pendiente
901
- if (!hasPendingFilesRef.current && !isShowProcessFiles && !actionsToFiles.current.toUpload.length && !accessUpdateContext.current.hasActionFiles && !successUpdateAccess && !processFilesTimedOutRef.current) {
902
- handleSnackbarSuccess(t('confirmAgentUpdated'));
903
- updateAgent(successUpdate);
904
- if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === successUpdate.id) {
905
- selectAgent(successUpdate);
906
- }
907
- handleResetSuccessDelete();
908
- resetSuccessUpdate();
909
- document.dispatchEvent(new CustomEvent('refetch-session'));
910
- handleClose();
581
+ return;
582
+ }
583
+ if (shouldFinalizeAbmUpdateWithoutPendingWork({
584
+ hasPendingFiles: hasPendingFilesRef.current,
585
+ isShowProcessFiles: isShowProcessFiles,
586
+ toUploadCount: actionsToFiles.current.toUpload.length,
587
+ accessHasActionFiles: accessUpdateContext.current.hasActionFiles,
588
+ successUpdateAccess: successUpdateAccess,
589
+ processFilesTimedOut: processFilesTimedOutRef.current
590
+ })) {
591
+ handleSnackbarSuccess(t('confirmAgentUpdated'));
592
+ updateAgent(successUpdate);
593
+ if (shouldSyncSelectedAgentAfterMutation(currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id, successUpdate.id)) {
594
+ selectAgent(successUpdate);
911
595
  }
596
+ handleResetSuccessDelete();
597
+ resetSuccessUpdate();
598
+ document.dispatchEvent(new CustomEvent('refetch-session'));
599
+ handleClose();
912
600
  }
913
601
  }, [successUpdate, modalValues.general.id, handleDeleteAndCreateKnowledges, handleDeleteKnowledges, handleCreateKnowledges, handleSnackbarSuccess, t, updateAgent, handleResetSuccessDelete, resetSuccessUpdate, handleClose]);
914
602
  var handleProcessFilesTimeout = useCallback(function () {
915
- if (!hasPendingFilesRef.current && !isShowProcessFiles) return;
603
+ if (!shouldRunAbmProcessFilesTimeout(hasPendingFilesRef.current, isShowProcessFiles)) return;
916
604
 
917
605
  // Al cumplirse el timeout asumimos que el guardado del agente fue exitoso
918
606
  // (el server respondió OK) y que los archivos se enviaron correctamente.
@@ -925,14 +613,14 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
925
613
  processFilesTimedOutRef.current = true;
926
614
  if (modalValues.isEditing && successUpdate) {
927
615
  updateAgent(successUpdate);
928
- if ((currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id) === successUpdate.id) {
616
+ if (shouldSyncSelectedAgentAfterMutation(currentSelectedAgent === null || currentSelectedAgent === void 0 ? void 0 : currentSelectedAgent.id, successUpdate.id)) {
929
617
  selectAgent(successUpdate);
930
618
  }
931
619
  document.dispatchEvent(new CustomEvent('refetch-session'));
932
- handleSnackbarSuccess(t('confirmAgentUpdated'));
620
+ handleSnackbarSuccess(t(resolveAbmProcessFilesTimeoutSuccessKey(true)));
933
621
  resetSuccessUpdate();
934
622
  } else if (!modalValues.isEditing && successCreate) {
935
- handleSnackbarSuccess(t('confirmAgentCreated'));
623
+ handleSnackbarSuccess(t(resolveAbmProcessFilesTimeoutSuccessKey(false)));
936
624
  resetSuccessCreate();
937
625
  }
938
626
  handleResetSuccessSave();
@@ -943,43 +631,24 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
943
631
  var webSocketFunction = function webSocketFunction(_ref4) {
944
632
  var modelData = _ref4.model_data;
945
633
  var fileStatus = modelData;
946
- if (fileStatus.status === 'done' || fileStatus.status === 'failed') {
634
+ if (shouldProcessKnowledgeWsStatus(fileStatus.status)) {
947
635
  setModalValues(function (prev) {
948
- var updatedKnowledge = prev.knowledge.map(function (file) {
949
- if (file.name === fileStatus.filename) {
950
- return _objectSpread(_objectSpread({}, file), {}, {
951
- status: fileStatus.status,
952
- id: fileStatus.knowledge_base_id || file.id
953
- });
954
- }
955
- return file;
956
- });
957
- var hasPendingFiles = updatedKnowledge.some(function (file) {
958
- return file.status === 'pending';
959
- });
960
- var hasErrorFiles = updatedKnowledge.some(function (file) {
961
- return file.status === 'failed';
962
- });
963
- if (hasErrorFiles && !hasPendingFiles) {
964
- hasPendingFilesRef.current = false;
965
- setIsShowProcessFiles(false);
966
- handleSnackbarError(modalValues.isEditing ? t('confirmAgentUpdatedWithFilesError') : t('confirmAgentWithFilesError'));
967
- } else if (!hasPendingFiles && !hasErrorFiles) {
636
+ var updatedKnowledge = applyKnowledgeFileStatusUpdate(prev.knowledge, fileStatus);
637
+ var uploadOutcome = resolveKnowledgeUploadOutcome(updatedKnowledge);
638
+ var wsEffects = resolveKnowledgeWsCompletionEffects(uploadOutcome, accessUpdateContext.current, accessHandledRef.current, filesFinishedRef.current);
639
+ if (wsEffects !== null && wsEffects !== void 0 && wsEffects.closeProcessFiles) {
968
640
  hasPendingFilesRef.current = false;
969
641
  setIsShowProcessFiles(false);
970
-
971
- // Si había access pendiente y ya estaba manejado, forzar que el useEffect de access se ejecute de nuevo
972
- if (accessUpdateContext.current.hasActionFiles && accessHandledRef.current) {
973
- setFilesProcessed(function (prevCount) {
974
- return prevCount + 1;
975
- });
976
- } else if (accessUpdateContext.current.operationType === 'create' && !accessUpdateContext.current.hasActionFiles && !filesFinishedRef.current) {
977
- // Si es creación sin accesibilidad, marcar que los archivos terminaron
642
+ }
643
+ if (uploadOutcome === 'error') {
644
+ handleSnackbarError(t(resolveAbmKnowledgeErrorMessageKey(modalValues.isEditing)));
645
+ } else if (wsEffects !== null && wsEffects !== void 0 && wsEffects.incrementFilesProcessed) {
646
+ if (wsEffects.markFilesFinishedForCreate) {
978
647
  filesFinishedRef.current = true;
979
- setFilesProcessed(function (prevCount) {
980
- return prevCount + 1;
981
- });
982
648
  }
649
+ setFilesProcessed(function (prevCount) {
650
+ return prevCount + 1;
651
+ });
983
652
  }
984
653
  return _objectSpread(_objectSpread({}, prev), {}, {
985
654
  knowledge: updatedKnowledge
@@ -990,11 +659,12 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
990
659
  useEffect(function () {
991
660
  if (successKnowledgeDelete && !isLoadingKnowledge && !errorKnowledge) {
992
661
  // Solo cerrar si NO hay archivos siendo procesados
993
- if (hasPendingFilesRef.current || isShowProcessFiles || actionsToFiles.current.toUpload.length) {
994
- return;
995
- }
996
- // Si el loader se cerró por timeout, no mostrar snackbar de éxito ni cerrar
997
- if (processFilesTimedOutRef.current) {
662
+ if (shouldBlockKnowledgeDeleteSuccessClose({
663
+ hasPendingFiles: hasPendingFilesRef.current,
664
+ isShowProcessFiles: isShowProcessFiles,
665
+ toUploadCount: actionsToFiles.current.toUpload.length,
666
+ processFilesTimedOut: processFilesTimedOutRef.current
667
+ })) {
998
668
  return;
999
669
  }
1000
670
  handleSnackbarSuccess(t('confirmAgentUpdated'));
@@ -1002,7 +672,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1002
672
  handleClose();
1003
673
  }
1004
674
  if (errorKnowledge) {
1005
- handleSnackbarError(modalValues.isEditing ? t('confirmAgentUpdatedWithFilesError') : t('confirmAgentWithFilesError'));
675
+ handleSnackbarError(t(resolveAbmKnowledgeErrorMessageKey(modalValues.isEditing)));
1006
676
  handleResetSuccessDelete();
1007
677
  }
1008
678
  }, [successKnowledgeDelete, isLoadingKnowledge, errorKnowledge, isShowProcessFiles]);
@@ -1010,7 +680,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1010
680
  var context = accessUpdateContext.current;
1011
681
 
1012
682
  // Si hay archivos siendo procesados, esperar a que terminen
1013
- if (context.hasActionFiles && (hasPendingFilesRef.current || isShowProcessFiles)) {
683
+ if (shouldDeferAccessUpdateUntilFilesComplete(context, hasPendingFilesRef.current, isShowProcessFiles)) {
1014
684
  // Si successUpdateAccess está activo, marcar como manejado pero NO resetear hasta que terminen los archivos
1015
685
  if (successUpdateAccess && !accessHandledRef.current) {
1016
686
  accessHandledRef.current = true;
@@ -1026,13 +696,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1026
696
  resetSuccessUpdateAccess();
1027
697
  }
1028
698
  handleClose();
1029
- accessUpdateContext.current = {
1030
- isFromCreation: false,
1031
- isFromEditing: false,
1032
- hasActionFiles: false,
1033
- operationType: null,
1034
- hasBeenCalled: false
1035
- };
699
+ accessUpdateContext.current = createResetAbmAccessUpdateContext();
1036
700
  return;
1037
701
  }
1038
702
  if (!successUpdateAccess) {
@@ -1055,21 +719,14 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1055
719
  }
1056
720
 
1057
721
  // Si el agente fue creado con favorito, necesitamos ordenar después de agregarlo
1058
- var agentToAdd = modalValues.general.is_favorite ? _objectSpread(_objectSpread({}, successCreate), {}, {
1059
- is_favorite: true
1060
- }) : successCreate;
722
+ var _resolveAbmCreateFavo2 = resolveAbmCreateFavoriteAgents(successCreate, Boolean(modalValues.general.is_favorite)),
723
+ listAgent = _resolveAbmCreateFavo2.listAgent,
724
+ toggleAgent = _resolveAbmCreateFavo2.toggleAgent;
1061
725
  handleSnackbarSuccess(t('confirmAgentCreated'));
1062
- addAgent(agentToAdd);
1063
- selectAgent(agentToAdd);
1064
-
1065
- // Si tiene favorito, hacer toggle y actualizar estado antes de cerrar
1066
- if (modalValues.general.is_favorite) {
1067
- // Cuando se crea un agente nuevo, el servidor no tiene el favorito marcado aún
1068
- // Entonces currentIsFavorite debe ser false para que el toggle lo marque como true
1069
- var agentForToggle = _objectSpread(_objectSpread({}, agentToAdd), {}, {
1070
- is_favorite: false
1071
- });
1072
- handleToggleFavoriteForAgent(successCreate.id.toString(), agentForToggle, function () {
726
+ addAgent(listAgent);
727
+ selectAgent(listAgent);
728
+ if (toggleAgent) {
729
+ handleToggleFavoriteForAgent(successCreate.id.toString(), toggleAgent, function () {
1073
730
  // Cerrar después de que el toggle complete y actualice el estado
1074
731
  resetSuccessCreate();
1075
732
  handleClose();
@@ -1091,60 +748,50 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1091
748
  document.dispatchEvent(new CustomEvent('refetch-session'));
1092
749
  handleClose();
1093
750
  }
1094
- accessUpdateContext.current = {
1095
- isFromCreation: false,
1096
- isFromEditing: false,
1097
- hasActionFiles: false,
1098
- operationType: null,
1099
- hasBeenCalled: false
1100
- };
751
+ accessUpdateContext.current = createResetAbmAccessUpdateContext();
1101
752
  }, [successUpdateAccess, filesProcessed]);
1102
753
 
1103
754
  // useEffect para manejar el cierre del modal cuando terminan los archivos en creación sin accesibilidad
1104
755
  useEffect(function () {
1105
756
  var context = accessUpdateContext.current;
1106
-
1107
- // Solo procesar si:
1108
- // - Es una operación de creación
1109
- // - No hay accesibilidad pendiente
1110
- // - Los archivos terminaron de procesarse
1111
- // - El agente fue creado exitosamente
1112
- // - Aún no se ha cerrado el modal
1113
- if (context.operationType === 'create' && !context.hasActionFiles && filesFinishedRef.current && successCreate && !hasPendingFilesRef.current && !isShowProcessFiles) {
757
+ if (shouldCloseCreateAfterKnowledgeWithoutAccess({
758
+ operationType: context.operationType,
759
+ hasActionFiles: context.hasActionFiles,
760
+ filesFinished: filesFinishedRef.current,
761
+ hasSuccessCreate: Boolean(successCreate),
762
+ hasPendingFiles: hasPendingFilesRef.current,
763
+ isShowProcessFiles: isShowProcessFiles
764
+ })) {
1114
765
  handleSnackbarSuccess(t('confirmAgentCreated'));
1115
766
  resetSuccessCreate();
1116
767
  handleClose();
1117
768
  filesFinishedRef.current = false;
1118
- accessUpdateContext.current = {
1119
- isFromCreation: false,
1120
- isFromEditing: false,
1121
- hasActionFiles: false,
1122
- operationType: null,
1123
- hasBeenCalled: false
1124
- };
769
+ accessUpdateContext.current = createResetAbmAccessUpdateContext();
1125
770
  }
1126
-
1127
- // También manejar el caso cuando hay accesibilidad y archivos terminaron
1128
- if (context.operationType === 'create' && context.hasActionFiles && accessHandledRef.current && successCreate && !hasPendingFilesRef.current && !isShowProcessFiles) {
771
+ if (shouldCloseCreateAfterKnowledgeWithAccess({
772
+ operationType: context.operationType,
773
+ hasActionFiles: context.hasActionFiles,
774
+ accessHandled: accessHandledRef.current,
775
+ hasSuccessCreate: Boolean(successCreate),
776
+ hasPendingFiles: hasPendingFilesRef.current,
777
+ isShowProcessFiles: isShowProcessFiles
778
+ })) {
1129
779
  handleSnackbarSuccess(t('confirmAgentCreated'));
1130
780
  resetSuccessCreate();
1131
- if (successUpdateAccess) {
781
+ if (shouldResetSuccessUpdateAccessOnCreateClose(Boolean(successUpdateAccess))) {
1132
782
  resetSuccessUpdateAccess();
1133
783
  }
1134
784
  handleClose();
1135
- accessUpdateContext.current = {
1136
- isFromCreation: false,
1137
- isFromEditing: false,
1138
- hasActionFiles: false,
1139
- operationType: null,
1140
- hasBeenCalled: false
1141
- };
785
+ accessUpdateContext.current = createResetAbmAccessUpdateContext();
1142
786
  }
1143
787
  }, [filesProcessed, successCreate, successUpdateAccess, isShowProcessFiles, handleSnackbarSuccess, t, resetSuccessCreate, resetSuccessUpdateAccess, handleClose]);
1144
788
  useEffect(function () {
1145
789
  if (isShowProcessFiles) {
1146
790
  var _successCreate$id;
1147
- var channel = "knowledge-base.status:".concat(agentById ? agentById === null || agentById === void 0 ? void 0 : agentById.id : successCreate === null || successCreate === void 0 || (_successCreate$id = successCreate.id) === null || _successCreate$id === void 0 ? void 0 : _successCreate$id.toString());
791
+ var channel = resolveAbmKnowledgeWsChannel(agentById, (_successCreate$id = successCreate === null || successCreate === void 0 ? void 0 : successCreate.id) !== null && _successCreate$id !== void 0 ? _successCreate$id : null);
792
+ if (!channel) {
793
+ return;
794
+ }
1148
795
  if ($_sc) {
1149
796
  if (isSubscribed) {
1150
797
  var _$_sc;
@@ -1170,7 +817,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1170
817
  return _regeneratorRuntime.wrap(function (_context2) {
1171
818
  while (1) switch (_context2.prev = _context2.next) {
1172
819
  case 0:
1173
- if (!(source.type !== 'custom' || !window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS)) {
820
+ if (canApplyAbmEditingAgentDetail(source, Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS))) {
1174
821
  _context2.next = 1;
1175
822
  break;
1176
823
  }
@@ -1190,7 +837,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1190
837
  case 2:
1191
838
  hydratingAgentIdRef.current = agentId;
1192
839
  agentValuesToSet = buildEditingModalValuesFromAgentDetail(source, agentModels, modalValues); // Keep the loading view until both the agent and its connector status are ready.
1193
- if (!(agentId && hasMaiaExternalConnectorsAccess())) {
840
+ if (!shouldHydrateAgentConnectorsOnEdit(agentId, hasMaiaExternalConnectorsAccess())) {
1194
841
  _context2.next = 6;
1195
842
  break;
1196
843
  }
@@ -1248,7 +895,12 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1248
895
  applyEditingAgent(agentById);
1249
896
  return;
1250
897
  }
1251
- if (!isLoading && !agentLoading && !agentById && !modalValues.isEditing) {
898
+ if (shouldSetDefaultAiModelForNewAgent({
899
+ isLoading: isLoading,
900
+ agentLoading: agentLoading,
901
+ hasAgentById: Boolean(agentById),
902
+ isEditing: modalValues.isEditing
903
+ })) {
1252
904
  setModalValues(function (prev) {
1253
905
  return _objectSpread(_objectSpread({}, prev), {}, {
1254
906
  general: _objectSpread(_objectSpread({}, prev.general), {}, {
@@ -1260,7 +912,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1260
912
  }, [agentById, isOpen, isLoading, agentLoading, agentModels === null || agentModels === void 0 ? void 0 : agentModels.length, modalValues.isEditing, t]);
1261
913
  useEffect(function () {
1262
914
  if (errorGetAgentById) {
1263
- if (errorGetAgentById === "Access denied: You don't have permission to access this agent") {
915
+ if (isAbmAccessDeniedError(errorGetAgentById)) {
1264
916
  handleSnackbarError(t('errorAccessDenied'));
1265
917
  setTimeout(function () {
1266
918
  handleClose();
@@ -1274,14 +926,9 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1274
926
  }
1275
927
  }, [errorGetAgentById]);
1276
928
  var shouldDisableSaveForClients = useMemo(function () {
1277
- var _modalValues$accessib3;
1278
- if (!(modalValues !== null && modalValues !== void 0 && (_modalValues$accessib3 = modalValues.accessibility) !== null && _modalValues$accessib3 !== void 0 && _modalValues$accessib3.clients) || modalValues.accessibility.clients.length === 0) {
1279
- return false;
1280
- }
1281
- return modalValues.accessibility.clients.some(function (client) {
1282
- return client.is_active === false || client.is_deleted === true;
1283
- });
1284
- }, [modalValues === null || modalValues === void 0 || (_modalValues$accessib4 = modalValues.accessibility) === null || _modalValues$accessib4 === void 0 ? void 0 : _modalValues$accessib4.clients]);
929
+ var _modalValues$accessib2;
930
+ return hasInactiveAccessibilityClients(modalValues === null || modalValues === void 0 || (_modalValues$accessib2 = modalValues.accessibility) === null || _modalValues$accessib2 === void 0 ? void 0 : _modalValues$accessib2.clients);
931
+ }, [modalValues === null || modalValues === void 0 || (_modalValues$accessib3 = modalValues.accessibility) === null || _modalValues$accessib3 === void 0 ? void 0 : _modalValues$accessib3.clients]);
1285
932
  var handleToggleFavorite = function handleToggleFavorite() {
1286
933
  var _modalValues$general;
1287
934
  if (modalValues !== null && modalValues !== void 0 && (_modalValues$general = modalValues.general) !== null && _modalValues$general !== void 0 && _modalValues$general.id) {
@@ -1306,13 +953,14 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1306
953
  setModalValues(function (prev) {
1307
954
  return _objectSpread(_objectSpread({}, prev), {}, {
1308
955
  general: _objectSpread(_objectSpread({}, prev.general), {}, {
1309
- is_favorite: !prev.general.is_favorite
956
+ is_favorite: resolveAbmDraftFavoriteValue(prev.general.is_favorite)
1310
957
  })
1311
958
  });
1312
959
  });
1313
960
  }
1314
961
  };
1315
- if (!isOpen || !(userPermissions !== null && userPermissions !== void 0 && userPermissions.create) && !(userPermissions !== null && userPermissions !== void 0 && userPermissions.edit) && !(userPermissions !== null && userPermissions !== void 0 && userPermissions["delete"])) return null;
962
+ if (!selector) return null;
963
+ if (!isOpen || !canRenderAbmAgentModal(userPermissions)) return null;
1316
964
  return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(Backdrop, {
1317
965
  zIndex: abmAgentModalZIndex,
1318
966
  onClick: handleBackdropClick,
@@ -1327,16 +975,16 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1327
975
  })
1328
976
  })
1329
977
  }) : /*#__PURE__*/_jsx(_Fragment, {
1330
- children: isShowProcessFiles && hasPendingFilesRef.current ? /*#__PURE__*/_jsx(AbmLoaderFiles, {
978
+ children: shouldShowAbmLoaderFiles(isShowProcessFiles, hasPendingFilesRef.current) ? /*#__PURE__*/_jsx(AbmLoaderFiles, {
1331
979
  attachments: modalValues.knowledge,
1332
- label: t("processingKnowledge.".concat(modalValues.isEditing ? 'descriptionUpdate' : 'descriptionCreate')),
980
+ label: t(resolveAbmProcessingKnowledgeLabelKey(modalValues.isEditing)),
1333
981
  onTimeout: handleProcessFilesTimeout
1334
982
  }) : /*#__PURE__*/_jsxs(_Fragment, {
1335
983
  children: [/*#__PURE__*/_jsxs(SCAAMHeader, {
1336
984
  children: [/*#__PURE__*/_jsxs(SCAAMHeaderLeft, {
1337
985
  children: [/*#__PURE__*/_jsx(Tooltip, {
1338
986
  zIndex: tooltipZIndex,
1339
- title: modalValues !== null && modalValues !== void 0 && (_modalValues$general3 = modalValues.general) !== null && _modalValues$general3 !== void 0 && _modalValues$general3.is_favorite ? t('generalSection.removeFavorite') : t('generalSection.addFavorite'),
987
+ title: t(resolveAbmFavoriteTooltipKey(Boolean(modalValues === null || modalValues === void 0 || (_modalValues$general3 = modalValues.general) === null || _modalValues$general3 === void 0 ? void 0 : _modalValues$general3.is_favorite))),
1340
988
  children: /*#__PURE__*/_jsx(SCAAMHeaderFavorite, {
1341
989
  onClick: handleToggleFavorite,
1342
990
  children: /*#__PURE__*/_jsx(Star, {
@@ -1349,14 +997,14 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1349
997
  })
1350
998
  })
1351
999
  }), /*#__PURE__*/_jsx(SCAAMHeaderTitle, {
1352
- children: modalValues !== null && modalValues !== void 0 && modalValues.isEditing ? t('editAgent') : t('newAgent')
1000
+ children: t(resolveAbmModalTitleKey(Boolean(modalValues === null || modalValues === void 0 ? void 0 : modalValues.isEditing)))
1353
1001
  })]
1354
1002
  }), /*#__PURE__*/_jsx(SCAAMHeaderCloseButton, {
1355
1003
  onClick: function onClick() {
1356
1004
  eventAmplitude(EVENTS.cancelModal);
1357
1005
  handleClose();
1358
1006
  },
1359
- disabled: isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess,
1007
+ disabled: shouldDisableAbmHeaderClose(isLoading, isLoadingKnowledge, isLoadingCreate, isLoadingUpdateAccess),
1360
1008
  children: /*#__PURE__*/_jsx(Cross, {
1361
1009
  color: "#a6a6a6",
1362
1010
  width: 20,
@@ -1444,7 +1092,7 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1444
1092
  onClick: function onClick() {
1445
1093
  setShowModalDelete(true);
1446
1094
  },
1447
- disabled: isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess,
1095
+ disabled: shouldDisableAbmHeaderClose(isLoading, isLoadingKnowledge, isLoadingCreate, isLoadingUpdateAccess),
1448
1096
  children: /*#__PURE__*/_jsxs(WrapperCenterIcon, {
1449
1097
  children: [/*#__PURE__*/_jsx(Trash, {
1450
1098
  color: "#08c",
@@ -1459,14 +1107,32 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1459
1107
  gap: '24px'
1460
1108
  },
1461
1109
  children: /*#__PURE__*/_jsx(SCAAMSaveButton, {
1462
- isDisabled: !validateFieldValues(modalValues) || validateAgentValuesIsSame() || isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess || shouldDisableSaveForClients || hasFileErrors,
1110
+ isDisabled: isAbmSaveDisabled({
1111
+ values: modalValues,
1112
+ initial: firstValueAgent.current,
1113
+ fileActions: actionsToFiles.current,
1114
+ isLoading: isLoading,
1115
+ isLoadingKnowledge: isLoadingKnowledge,
1116
+ isLoadingCreate: isLoadingCreate,
1117
+ isLoadingUpdateAccess: isLoadingUpdateAccess,
1118
+ hasFileErrors: hasFileErrors
1119
+ }),
1463
1120
  children: /*#__PURE__*/_jsx(CUButton, {
1464
1121
  variant: "contained",
1465
1122
  size: "medium",
1466
1123
  onClick: function onClick() {
1467
1124
  _handleConfirmAction(null, 'create');
1468
1125
  },
1469
- disabled: !validateFieldValues(modalValues) || validateAgentValuesIsSame() || isLoading || isLoadingKnowledge || isLoadingCreate || isLoadingUpdateAccess || shouldDisableSaveForClients || hasFileErrors,
1126
+ disabled: isAbmSaveDisabled({
1127
+ values: modalValues,
1128
+ initial: firstValueAgent.current,
1129
+ fileActions: actionsToFiles.current,
1130
+ isLoading: isLoading,
1131
+ isLoadingKnowledge: isLoadingKnowledge,
1132
+ isLoadingCreate: isLoadingCreate,
1133
+ isLoadingUpdateAccess: isLoadingUpdateAccess,
1134
+ hasFileErrors: hasFileErrors
1135
+ }),
1470
1136
  children: modalValues.isEditing ? t('saveChanges') : t('createAgentLabelButton')
1471
1137
  })
1472
1138
  })
@@ -1491,4 +1157,4 @@ export var AbmAgentModal = function AbmAgentModal(_ref) {
1491
1157
  })]
1492
1158
  }), selector);
1493
1159
  };
1494
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsImNyZWF0ZVBvcnRhbCIsInVzZVRyYW5zbGF0aW9uIiwiQ1VCdXR0b24iLCJDYXRlZ29yeSIsIkFsZXJ0IiwiVHJhc2giLCJTdGFyIiwiQ3Jvc3MiLCJTcGlubmVyTG90dGllIiwiVG9vbHRpcCIsIkFibUFjY2Vzc2liaWxpdHlTZWN0aW9uIiwiQmFja2Ryb3AiLCJ1c2VVc2VyIiwiQWNjZXNzaWJpbGl0eUljb24iLCJCcmFpbkljb24iLCJ1c2VBZ2VudE1vZGVsIiwidXNlR2V0QWdlbnRCeUlkIiwiQWJtR2VuZXJhbFNlY3Rpb24iLCJBYm1Lbm93bGVkZ2VTZWN0aW9uIiwiU0NBQU1Db250ZW50IiwiU0NBQU1Gb290ZXIiLCJTQ0FBTUhlYWRlciIsIlNDQUFNSGVhZGVyVGl0bGUiLCJTQ0FBTUhlYWRlckxlZnQiLCJTQ0FBTUhlYWRlckZhdm9yaXRlIiwiU0NBQU1IZWFkZXJDbG9zZUJ1dHRvbiIsIlNDQUFNU2lkZWJhciIsIlNDQUFNV3JhcHBlciIsIlNDQUFNU2lkZWJhckl0ZW0iLCJTQ0FBTVNpZGViYXJJdGVtVGl0bGUiLCJTQ0FBTURlbGV0ZUJ1dHRvbiIsIlNDQUFNU2F2ZUJ1dHRvbiIsIlNDQUFNV3JhcHBlclNwaW5uZXIiLCJTQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudCIsIlNDQUFNU2lkZWJhckl0ZW1FcnJvciIsInVzZUNyZWF0ZUFnZW50IiwidXNlRGVsZXRlQWdlbnQiLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJ1c2VHbG9iYWxDb250ZXh0IiwidXNlVXBkYXRlQWdlbnQiLCJ1c2VLbm93bGVkZ2VPcGVyYXRpb25zIiwiQWJtTG9hZGVyRmlsZXMiLCJXcmFwcGVyQ2VudGVySWNvbiIsIkVWRU5UUyIsInVzZUV2ZW50IiwiRGVsZXRlUXVlc3Rpb25Nb2RhbCIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJ1c2VBY2Nlc3NDbGllbnQiLCJ1c2VUb2dnbGVGYXZvcml0ZSIsImRlcml2ZUFzc2lnbmVkQ29ubmVjdG9yU2x1Z3MiLCJkZXJpdmVDb3JBY2Nlc3NGcm9tVG9vbEdyb3VwU2x1Z3MiLCJkZXJpdmVNY3BDb25uZWN0b3JTbHVncyIsIkRFRkFVTFRfQ09SX0FDQ0VTUyIsIkNPUl9UT09MX0dST1VQX1NMVUdTIiwiYnVpbGRBZ2VudFRvb2xHcm91cHNSZXF1ZXN0IiwiZ2V0QWdlbnRDb25uZWN0b3JzIiwiaGFzTWFpYUV4dGVybmFsQ29ubmVjdG9yc0FjY2VzcyIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImluaXRpYWxWYWx1ZXMiLCJPYmplY3QiLCJmcmVlemUiLCJpc0VkaXRpbmciLCJrbm93bGVkZ2UiLCJnZW5lcmFsIiwibmFtZSIsImVtb2ppIiwiaW50cm9kdWN0aW9uIiwiaW5wdXRQbGFjZWhvbGRlciIsImlzQWN0aXZlIiwiYWlNb2RlbCIsImlkIiwidXNlclByb21wdCIsImtub3dsZWRnZUJhc2VzIiwiaXNfZmF2b3JpdGUiLCJhY2Nlc3NpYmlsaXR5IiwiYWNjZXNzVHlwZSIsImNsaWVudHMiLCJjb3JBY2Nlc3MiLCJzZWxlY3RlZENvbm5lY3RvcnMiLCJTZWN0aW9uQnlLZXkiLCJwcm9wcyIsIl9vYmplY3RTcHJlYWQiLCJ2YWxpZGF0ZUZpZWxkVmFsdWVzIiwidmFsdWVUb1ZhbGlkYXRlIiwiYnVpbGRFZGl0aW5nTW9kYWxWYWx1ZXNGcm9tQWdlbnREZXRhaWwiLCJhZ2VudEJ5SWQiLCJhZ2VudE1vZGVscyIsInByZXYiLCJfYWdlbnRCeUlkJGtub3dsZWRnZUIiLCJfYWdlbnRCeUlkJGNsaWVudHMiLCJhZ2VudE1vZGVsIiwiZmluZCIsIm1vZGVsIiwibW9kZWxBaUlkIiwiY3JlYXRlZF9ieSIsImNyZWF0ZWRCeSIsIm1hcCIsImsiLCJmaWxlIiwiRmlsZSIsImZpbGVuYW1lIiwidG9TdHJpbmciLCJzaXplIiwiZmlsZV9zaXplX2J5dGVzIiwidHlwZSIsIm9yaWdpbmFsX2ZpbGVfdHlwZSIsInN0YXR1cyIsInVybF9vcmlnaW5hbCIsInVuZGVmaW5lZCIsInVybF90aHVtYm5haWwiLCJhY2Nlc3MiLCJjbGllbnQiLCJfY2xpZW50JGlkIiwiX2NsaWVudCRpc19hY3RpdmUiLCJfY2xpZW50JGlzX2RlbGV0ZWQiLCJpc19hY3RpdmUiLCJpc19kZWxldGVkIiwidG9vbEdyb3VwU2x1Z3MiLCJjb25uZWN0b3JzIiwiQWJtQWdlbnRNb2RhbCIsIl9yZWYiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl9tb2RhbFZhbHVlcyRhY2Nlc3NpYjQiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDMiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDQiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDUiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDYiLCJhZGRBZ2VudCIsInVwZGF0ZUFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInVzZXIiLCJldmVudEFtcGxpdHVkZSIsIl91c2VUcmFuc2xhdGlvbiIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImN1cnJlbnRTZWxlY3RlZEFnZW50IiwiYWdlbnQiLCJzZWxlY3RBZ2VudCIsImFibUFnZW50TW9kYWxaSW5kZXgiLCJ0b29sdGlwWkluZGV4IiwiX3VzZVRvZ2dsZUZhdm9yaXRlIiwidG9nZ2xlRmF2b3JpdGUiLCJzZWxlY3RvciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJpc1N1YnNjcmliZWQiLCJzZXRJc1N1YnNjcmliZWQiLCJtb2RhbFJlZiIsImhhc1BlbmRpbmdGaWxlc1JlZiIsImFjdGlvbnNUb0ZpbGVzIiwidG9EZWxldGUiLCJ0b1VwbG9hZCIsImFjY2Vzc1VwZGF0ZUNvbnRleHQiLCJpc0Zyb21DcmVhdGlvbiIsImlzRnJvbUVkaXRpbmciLCJoYXNBY3Rpb25GaWxlcyIsIm9wZXJhdGlvblR5cGUiLCJoYXNCZWVuQ2FsbGVkIiwiYWNjZXNzSGFuZGxlZFJlZiIsImFnZW50Q3JlYXRlZFJlZiIsInBlbmRpbmdJbml0aWFsU2VjdGlvblJlZiIsInByZWZldGNoZWRBZ2VudEJ5SWRSZWYiLCJoeWRyYXRpbmdBZ2VudElkUmVmIiwiZmlsZXNGaW5pc2hlZFJlZiIsInByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJmaWxlc1Byb2Nlc3NlZCIsInNldEZpbGVzUHJvY2Vzc2VkIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpc09wZW4iLCJzZXRJc09wZW4iLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNob3dNb2RhbERlbGV0ZSIsInNldFNob3dNb2RhbERlbGV0ZSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VjdGlvbiIsInNldFNlY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJpc0xvYWRpbmciLCJzZXRJc0xvYWRpbmciLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwibW9kYWxWYWx1ZXMiLCJzZXRNb2RhbFZhbHVlcyIsIl91c2VHZXRBZ2VudEJ5SWQiLCJhZ2VudExvYWRpbmciLCJsb2FkaW5nIiwiaGFuZGxlR2V0QWdlbnRCeUlkIiwiaGFuZGxlQ2xlYW5BZ2VudCIsImVycm9yR2V0QWdlbnRCeUlkIiwiZXJyb3IiLCJfdXNlQWdlbnRNb2RlbCIsImdldEFsbEFnZW50TW9kZWxzIiwiZmlyc3RWYWx1ZUFnZW50IiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzU2hvd1Byb2Nlc3NGaWxlcyIsInNldElzU2hvd1Byb2Nlc3NGaWxlcyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJoYXNGaWxlRXJyb3JzIiwic2V0SGFzRmlsZUVycm9ycyIsInVzZXJQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiX3VzZURlbGV0ZUFnZW50IiwiaGFuZGxlRGVsZXRlQWdlbnQiLCJzdWNjZXNzRGVsZXRlIiwic3VjY2VzcyIsInJlc2V0U3VjY2VzcyIsIl91c2VVcGRhdGVBZ2VudCIsImhhbmRsZVVwZGF0ZUFnZW50Iiwic3VjY2Vzc1VwZGF0ZSIsInJlc2V0U3VjY2Vzc1VwZGF0ZSIsIl91c2VDcmVhdGVBZ2VudCIsImhhbmRsZUNyZWF0ZUFnZW50IiwiaXNMb2FkaW5nQ3JlYXRlIiwic3VjY2Vzc0NyZWF0ZSIsInJlc2V0U3VjY2Vzc0NyZWF0ZSIsIl91c2VTbmFja0Jhck1hbmFnZXIiLCJoYW5kbGVTbmFja2JhclN1Y2Nlc3MiLCJoYW5kbGVTbmFja2JhckVycm9yIiwiX3VzZUtub3dsZWRnZU9wZXJhdGlvIiwiaGFuZGxlQ3JlYXRlS25vd2xlZGdlcyIsImhhbmRsZURlbGV0ZUtub3dsZWRnZXMiLCJoYW5kbGVEZWxldGVBbmRDcmVhdGVLbm93bGVkZ2VzIiwiaXNMb2FkaW5nS25vd2xlZGdlIiwiZXJyb3JLbm93bGVkZ2UiLCJzdWNjZXNzS25vd2xlZGdlRGVsZXRlIiwiaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSIsImhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSIsIl91c2VBY2Nlc3NDbGllbnQiLCJoYW5kbGVBY2Nlc3NDbGllbnQiLCJzdWNjZXNzVXBkYXRlQWNjZXNzIiwiaXNMb2FkaW5nVXBkYXRlQWNjZXNzIiwicmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzIiwiaGFuZGxlUmVzZXRTdWNjZXNzIiwiYXJlQ2xpZW50c0FycmF5c0VxdWFsIiwiY2xpZW50czEiLCJjbGllbnRzMiIsImxlbmd0aCIsImNsaWVudHMxSWRzIiwiYyIsImNsaWVudElkIiwic29ydCIsImNsaWVudHMySWRzIiwiZXZlcnkiLCJpbmRleCIsImhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkIiwiX2ZpcnN0VmFsdWVBZ2VudCRjdXJyIiwiX21vZGFsVmFsdWVzJGFjY2Vzc2liIiwiX2ZpcnN0VmFsdWVBZ2VudCRjdXJyMiIsImN1cnJlbnQiLCJhY2Nlc3NUeXBlU2FtZSIsImNsaWVudHNTYW1lIiwiY3VycmVudENvckFjY2VzcyIsImluaXRpYWxDb3JBY2Nlc3MiLCJjb3JBY2Nlc3NTYW1lIiwic2x1ZyIsImN1cnJlbnRDb25uZWN0b3JzIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwib3JpZ2luYWxDb25uZWN0b3JzIiwiY29ubmVjdG9yc1NhbWUiLCJ2YWxpZGF0ZUFnZW50VmFsdWVzSXNTYW1lIiwiX2ZpcnN0VmFsdWVBZ2VudCRjdXJyMyIsIl9tb2RhbFZhbHVlcyRnZW5lcmFsJCIsIl9maXJzdFZhbHVlQWdlbnQkY3VycjQiLCJfbW9kYWxWYWx1ZXMka25vd2xlZGciLCJfZmlyc3RWYWx1ZUFnZW50JGN1cnI1IiwiX21vZGFsVmFsdWVzJGtub3dsZWRnMiIsIl9maXJzdFZhbHVlQWdlbnQkY3VycjYiLCJfYWN0aW9uc1RvRmlsZXMkY3VycmUiLCJfYWN0aW9uc1RvRmlsZXMkY3VycmUyIiwidG9VcGRhdGUiLCJoYXNBbnlWYWx1ZUZvckNyZWF0aW9uIiwiX21vZGFsVmFsdWVzJGdlbmVyYWwkMiIsIl9hZ2VudE1vZGVscyQiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbCQzIiwiaXNEZWZhdWx0QWlNb2RlbCIsImRlZmF1bHRJbnB1dFBsYWNlaG9sZGVyIiwiaXNEZWZhdWx0SW5wdXRQbGFjZWhvbGRlciIsImRlZmF1bHRVc2VyUHJvbXB0UGxhY2Vob2xkZXIiLCJpc0RlZmF1bHRVc2VyUHJvbXB0IiwiaGFzTmFtZSIsInRyaW0iLCJoYXNFbW9qaSIsImhhc0ludHJvZHVjdGlvbiIsImhhc0lucHV0UGxhY2Vob2xkZXIiLCJoYXNVc2VyUHJvbXB0IiwiaGFzS25vd2xlZGdlIiwiaGFzQ3VzdG9tQWlNb2RlbCIsImhhc0FjY2Vzc2liaWxpdHkiLCJoYXNDaGFuZ2VzRm9yRWRpdGluZyIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudCIsImFnZW50SWQiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwidXBkYXRlZEFnZW50IiwiaGFuZGxlQ2xvc2UiLCJjb25maXJtTWVzc2FnZSIsIndpbmRvdyIsImNvbmZpcm0iLCJoYW5kbGVCYWNrZHJvcENsaWNrIiwiZXZlbnQiLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiaGFuZGxlU2VjdGlvbkNoYW5nZSIsIm5ld1NlY3Rpb24iLCJ0YWJTZWN0aW9uIiwib3B0aW9uIiwiaGFuZGxlU2V0QWdlbnRWYWx1ZXNCeUtleXMiLCJfcmVmMiIsImtleSIsInZhbHVlIiwiZGVsZXRlS25vd2xlZGdlIiwiX2FjdGlvbnNUb0ZpbGVzJGN1cnJlMyIsInB1c2giLCJhcHBseSIsImZpbGVzUHJldklkcyIsIlNldCIsIm5ld0ZpbGVzIiwiZmlsdGVyIiwiaGFzIiwidmFsdWVJZHMiLCJjb25jYXQiLCJrbm93bGVkZ2VGaWxlcyIsIl9kZWZpbmVQcm9wZXJ0eSIsImhhbmRsZUNvbmZpcm1BY3Rpb24iLCJfcmVmMyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiY2hhdCIsImFjdGlvbiIsIl9tb2RhbFZhbHVlcyRhY2Nlc3NpYjIiLCJ3cmFwIiwiX2NvbnRleHQiLCJuZXh0IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsImFicnVwdCIsImNvbmZpcm1BY3Rpb24iLCJjb3Jfc2x1Z3MiLCJjb3JfYWNjZXNzIiwic3RvcCIsIl94IiwiX3gyIiwiYXJndW1lbnRzIiwiaGFuZGxlU2V0QWdlbnRWYWx1ZXMiLCJfYWdlbnRWYWx1ZXMkdmFsdWVzIiwiX2FnZW50VmFsdWVzJHZhbHVlczMiLCJhZ2VudFZhbHVlcyIsImRldGFpbCIsImluaXRpYWxTZWN0aW9uIiwiaW5jbHVkZXMiLCJ2YWx1ZXMiLCJfYWdlbnRWYWx1ZXMkdmFsdWVzMiIsInByZWZldGNoZWRBZ2VudEJ5SWQiLCJuZXh0VmFsdWVzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfZG9jdW1lbnQiLCJib2R5Iiwib3JpZ2luYWxPdmVyZmxvdyIsInN0eWxlIiwib3ZlcmZsb3ciLCJoYW5kbGVCZWZvcmVVbmxvYWQiLCJwcmV2ZW50RGVmYXVsdCIsInJldHVyblZhbHVlIiwicHJvbWlzZXMiLCJmaWxlc1RvRGVsZXRlIiwiZmlsZXNUb0NyZWF0ZSIsImFnZW50V2l0aEZhdm9yaXRlIiwiYWdlbnRGb3JUb2dnbGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImFsbCIsImZpbGVzIiwiYWlDaGF0RmF2b3JpdGUiLCJmaWxlc1RvVXBsb2FkIiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiaGFuZGxlUHJvY2Vzc0ZpbGVzVGltZW91dCIsIndlYlNvY2tldEZ1bmN0aW9uIiwiX3JlZjQiLCJtb2RlbERhdGEiLCJtb2RlbF9kYXRhIiwiZmlsZVN0YXR1cyIsInVwZGF0ZWRLbm93bGVkZ2UiLCJrbm93bGVkZ2VfYmFzZV9pZCIsImhhc1BlbmRpbmdGaWxlcyIsInNvbWUiLCJoYXNFcnJvckZpbGVzIiwicHJldkNvdW50IiwiY29udGV4dCIsImFnZW50VG9BZGQiLCJfc3VjY2Vzc0NyZWF0ZSRpZCIsImNoYW5uZWwiLCIkX3NjIiwiXyRfc2MiLCJzdWJzY3JpYmVIYW5kbGVyIiwiXyRfc2MyIiwiXyRfc2MzIiwiXyRfc2MkY2hhbm5lbFR5cGUiLCJtb2RlbF9oYXNoIiwiYWN0aW9uVHlwZSIsIlNVQlNDUklCRSIsInVwZGF0ZUNvbm5lY3Rpb25Nb2RlbCIsImNoYW5uZWxUeXBlIiwiTU9ERUxfQ0hBTk5FTCIsImFwcGx5RWRpdGluZ0FnZW50IiwiX3JlZjUiLCJfY2FsbGVlMiIsInNvdXJjZSIsImFnZW50VmFsdWVzVG9TZXQiLCJfdCIsIl9jb250ZXh0MiIsInNldFRpbWVvdXQiLCJTdHJpbmciLCJzZW50IiwiY29ubmVjdG9yU3RhdHVzZXMiLCJmcm9tRW50cmllcyIsImNvbm5lY3RvciIsImNvbm5lY3Rpb25fc3RhdHVzIiwidXNlcl9hdXRob3JpemVkIiwiY29uc29sZSIsIl94MyIsInByZWZldGNoZWQiLCJzaG91bGREaXNhYmxlU2F2ZUZvckNsaWVudHMiLCJfbW9kYWxWYWx1ZXMkYWNjZXNzaWIzIiwiaGFuZGxlVG9nZ2xlRmF2b3JpdGUiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbCIsIl9tb2RhbFZhbHVlcyRnZW5lcmFsMiIsImNyZWF0ZSIsImVkaXQiLCJ6SW5kZXgiLCJvbkNsaWNrIiwiY2hpbGRyZW4iLCJyZWYiLCJ0YWJJbmRleCIsImNvbG9yIiwiYXR0YWNobWVudHMiLCJsYWJlbCIsIm9uVGltZW91dCIsInRpdGxlIiwid2lkdGgiLCJoZWlnaHQiLCJmaWxsIiwidmFyaWFudCIsImNsYXNzTmFtZSIsImNhbmNlbE1vZGFsIiwiZGlzYWJsZWQiLCJoYXNTY3JvbGwiLCIkaW5kZXgiLCJleGlzdGluZ0tub3dsZWRnZSIsIm5ld0tub3dsZWRnZSIsIm9uUmVtb3ZlRXhpc3RpbmdLbm93bGVkZ2UiLCJvblJlbW92ZU5ld0tub3dsZWRnZSIsIm9uRmlsZUVycm9yQ2hhbmdlIiwiY2hpbGRyZW5XaXRoSWNvbiIsImRpc3BsYXkiLCJnYXAiLCJpc0Rpc2FibGVkIiwib25DbG9zZSIsImhhbmRsZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0FibUFnZW50TW9kYWwvQWJtQWdlbnRNb2RhbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tYWxlcnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1jeWNsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvanN4LW5vLXVzZWxlc3MtZnJhZ21lbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcblxuaW1wb3J0IHsgQ1VCdXR0b24gfSBmcm9tICdAcHJvamVjdGNvci9idXR0b24vbGliL2NvbXBvbmVudHMvQ1VCdXR0b24nXG5pbXBvcnQgeyBDYXRlZ29yeSB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0NhdGVnb3J5J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9BbGVydCdcbmltcG9ydCB7IFRyYXNoIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvVHJhc2gnXG5pbXBvcnQgeyBTdGFyIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvU3RhcidcbmltcG9ydCB7IENyb3NzIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQ3Jvc3MnXG5pbXBvcnQgeyBTcGlubmVyTG90dGllIH0gZnJvbSAnQHByb2plY3Rjb3IvY29yLWNvbW1vbnMvbGliL2NvbXBvbmVudHMvc3Bpbm5lci1sb3R0aWUnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5pbXBvcnQgeyBBYm1BY2Nlc3NpYmlsaXR5U2VjdGlvbiB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uL0FibUFjY2Vzc2liaWxpdHlTZWN0aW9uJ1xuaW1wb3J0IHsgQmFja2Ryb3AgfSBmcm9tICcuLi8uLi9hdG9tcy9CYWNrZHJvcCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eUljb24sIEJyYWluSWNvbiB9IGZyb20gJy4uLy4uL2F0b21zL2ljb25zJ1xuaW1wb3J0IHsgdXNlQWdlbnRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlQWdlbnRNb2RlbCdcbmltcG9ydCB7IEFnZW50LCBBZ2VudE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VHZXRBZ2VudEJ5SWQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudEJ5SWQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBBYm1HZW5lcmFsU2VjdGlvbiwgQWJtS25vd2xlZGdlU2VjdGlvbiB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uJ1xuaW1wb3J0IHsgTW9kYWxWYWx1ZXMgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudE1vZGFsJ1xuaW1wb3J0IHtcbiAgU0NBQU1Db250ZW50LFxuICBTQ0FBTUZvb3RlcixcbiAgU0NBQU1IZWFkZXIsXG4gIFNDQUFNSGVhZGVyVGl0bGUsXG4gIFNDQUFNSGVhZGVyTGVmdCxcbiAgU0NBQU1IZWFkZXJGYXZvcml0ZSxcbiAgU0NBQU1IZWFkZXJDbG9zZUJ1dHRvbixcbiAgU0NBQU1TaWRlYmFyLFxuICBTQ0FBTVdyYXBwZXIsXG4gIFNDQUFNU2lkZWJhckl0ZW0sXG4gIFNDQUFNU2lkZWJhckl0ZW1UaXRsZSxcbiAgU0NBQU1EZWxldGVCdXR0b24sXG4gIFNDQUFNU2F2ZUJ1dHRvbixcbiAgU0NBQU1XcmFwcGVyU3Bpbm5lcixcbiAgU0NBQU1XcmFwcGVyU3Bpbm5lckNvbnRlbnQsXG4gIFNDQUFNU2lkZWJhckl0ZW1FcnJvcixcbn0gZnJvbSAnLi9BYm1BZ2VudE1vZGFsLnN0eWxlcydcbmltcG9ydCB7IHVzZUNyZWF0ZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQWdlbnRNb2RlbC91c2VDcmVhdGVBZ2VudCdcbmltcG9ydCB7IHVzZURlbGV0ZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQWdlbnRNb2RlbC91c2VEZWxldGVBZ2VudCdcbmltcG9ydCB7IHVzZVNuYWNrQmFyTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNuYWNrQmFyTWFuYWdlci91c2VTbmFja0Jhck1hbmFnZXInXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IHVzZVVwZGF0ZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQWdlbnRNb2RlbC91c2VVcGRhdGVBZ2VudCdcbmltcG9ydCB7IHVzZUtub3dsZWRnZU9wZXJhdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VLbm93bGVkZ2UnXG5pbXBvcnQgeyBBYm1Mb2FkZXJGaWxlcyB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BYm1TZWN0aW9uL0FibUxvYWRlckZpbGVzJ1xuaW1wb3J0IHsgV3JhcHBlckNlbnRlckljb24gfSBmcm9tICcuLi8uLi9hdG9tcy9XcmFwcGVyQ2VudGVySWNvbidcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IERlbGV0ZVF1ZXN0aW9uTW9kYWwgfSBmcm9tICcuLi9EZWxldGVRdWVzdGlvbk1vZGFsL0RlbGV0ZVF1ZXN0aW9uTW9kYWwnXG5pbXBvcnQgeyB1c2VNYWlhVGFza1BhbmVsWkluZGV4IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWFpYVRhc2tQYW5lbFpJbmRleCdcbmltcG9ydCB7IHVzZUFjY2Vzc0NsaWVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFjY2Vzc0NsaWVudC91c2VBY2Nlc3NDbGllbnQnXG5pbXBvcnQgeyB1c2VUb2dnbGVGYXZvcml0ZSB9IGZyb20gJy4uLy4uLy4uL2hvb2tzJ1xuaW1wb3J0IHtcbiAgZGVyaXZlQXNzaWduZWRDb25uZWN0b3JTbHVncyxcbiAgZGVyaXZlQ29yQWNjZXNzRnJvbVRvb2xHcm91cFNsdWdzLFxuICBkZXJpdmVNY3BDb25uZWN0b3JTbHVncyxcbiAgREVGQVVMVF9DT1JfQUNDRVNTLFxuICBDT1JfVE9PTF9HUk9VUF9TTFVHUyxcbiAgYnVpbGRBZ2VudFRvb2xHcm91cHNSZXF1ZXN0LFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9ub3JtYWxpemVBZ2VudENvbm5lY3RvcnMnXG5pbXBvcnQgeyBnZXRBZ2VudENvbm5lY3RvcnMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9jb25uZWN0b3JzJ1xuaW1wb3J0IHsgaGFzTWFpYUV4dGVybmFsQ29ubmVjdG9yc0FjY2VzcyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9tYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzJ1xuXG5jb25zdCBpbml0aWFsVmFsdWVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGlzRWRpdGluZzogZmFsc2UsXG4gIGtub3dsZWRnZTogW10sXG4gIGdlbmVyYWw6IHtcbiAgICBuYW1lOiAnJyxcbiAgICBlbW9qaTogJycsXG4gICAgaW50cm9kdWN0aW9uOiAnJyxcbiAgICBpbnB1dFBsYWNlaG9sZGVyOiAnJyxcbiAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgYWlNb2RlbDogbnVsbCxcbiAgICBpZDogbnVsbCxcbiAgICB1c2VyUHJvbXB0OiBudWxsLFxuICAgIGtub3dsZWRnZUJhc2VzOiBbXSxcbiAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gIH0sXG4gIGFjY2Vzc2liaWxpdHk6IHtcbiAgICBhY2Nlc3NUeXBlOiAnY29tcGFueScsXG4gICAgY2xpZW50czogbnVsbCxcbiAgICBjb3JBY2Nlc3M6IERFRkFVTFRfQ09SX0FDQ0VTUyxcbiAgICBzZWxlY3RlZENvbm5lY3RvcnM6IFtdLFxuICB9LFxufSlcblxudHlwZSBBYm1TZWN0aW9uID0gJ2dlbmVyYWwnIHwgJ2tub3dsZWRnZScgfCAndHJhaW5pbmcnIHwgJ3Rlc3RpbmcnIHwgJ2FjY2Vzc2liaWxpdHknXG5cbmV4cG9ydCBjb25zdCBTZWN0aW9uQnlLZXkgPSB7XG4gIGdlbmVyYWw6IChwcm9wczoge1xuICAgIHZhbHVlczogTW9kYWxWYWx1ZXNcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlczogKHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLFxuICAgICAgZGVsZXRlS25vd2xlZGdlLFxuICAgIH06IHtcbiAgICAgIGtleTogc3RyaW5nXG4gICAgICB2YWx1ZTogdW5rbm93blxuICAgICAgZGVsZXRlS25vd2xlZGdlPzogYm9vbGVhblxuICAgIH0pID0+IHZvaWRcbiAgICBhZ2VudE1vZGVsczogQWdlbnRNb2RlbFtdXG4gICAgbG9hZGluZzogYm9vbGVhblxuICAgIHRvb2x0aXBaSW5kZXg/OiBudW1iZXJcbiAgfSkgPT4gPEFibUdlbmVyYWxTZWN0aW9uIHsuLi5wcm9wc30gLz4sXG4gIGtub3dsZWRnZTogKHByb3BzOiB7XG4gICAgdmFsdWVzOiBNb2RhbFZhbHVlc1xuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiAoeyBrZXksIHZhbHVlIH06IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pID0+IHZvaWRcbiAgICBleGlzdGluZ0tub3dsZWRnZTogQXR0YWNobWVudEZpbGVbXVxuICAgIG5ld0tub3dsZWRnZTogQXR0YWNobWVudEZpbGVbXVxuICAgIG9uUmVtb3ZlRXhpc3RpbmdLbm93bGVkZ2U6IChmaWxlSWQ6IHN0cmluZykgPT4gdm9pZFxuICAgIG9uUmVtb3ZlTmV3S25vd2xlZGdlOiAoZmlsZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgICBvbkZpbGVFcnJvckNoYW5nZTogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZFxuICAgIHRvb2x0aXBaSW5kZXg/OiBudW1iZXJcbiAgfSkgPT4gPEFibUtub3dsZWRnZVNlY3Rpb24gey4uLnByb3BzfSAvPixcbiAgYWNjZXNzaWJpbGl0eTogKHByb3BzOiB7XG4gICAgdmFsdWVzOiBNb2RhbFZhbHVlc1xuICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiAoeyBrZXksIHZhbHVlIH06IHsga2V5OiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH0pID0+IHZvaWRcbiAgfSkgPT4gPEFibUFjY2Vzc2liaWxpdHlTZWN0aW9uIHsuLi5wcm9wc30gLz4sXG59XG5cbnR5cGUgQWJtQWdlbnRNb2RhbFByb3BzID0ge1xuICBhZGRBZ2VudDogKG5ld0FnZW50OiBBZ2VudCwgb3B0aW9ucz86IHsgbmF2aWdhdGVIb21lPzogYm9vbGVhbiB9KSA9PiB2b2lkXG4gIHJlbW92ZUFnZW50OiAoYWdlbnRJZDogbnVtYmVyIHwgc3RyaW5nKSA9PiB2b2lkXG4gIHVwZGF0ZUFnZW50OiAodXBkYXRlZEFnZW50OiBBZ2VudCkgPT4gdm9pZFxuICB1cGRhdGVBZ2VudEZhdm9yaXRlOiAodXBkYXRlZEFnZW50OiBBZ2VudCwgc2hvdWxkU29ydD86IGJvb2xlYW4pID0+IHZvaWRcbiAgc2VsZWN0Rmlyc3RBZ2VudDogKGFnZW50SWQ6IHN0cmluZykgPT4gdm9pZFxufVxuXG5jb25zdCB2YWxpZGF0ZUZpZWxkVmFsdWVzID0gKHZhbHVlVG9WYWxpZGF0ZTogTW9kYWxWYWx1ZXMpID0+IHtcbiAgaWYgKCF2YWx1ZVRvVmFsaWRhdGUuZ2VuZXJhbC5uYW1lIHx8ICF2YWx1ZVRvVmFsaWRhdGUuZ2VuZXJhbC51c2VyUHJvbXB0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqIE1pc21hIGVzdHJ1Y3R1cmEgcXVlIGVsIGVmZWN0byBxdWUgaGlkcmF0YSBkZXNkZSB1c2VHZXRBZ2VudEJ5SWQgKHRvZGFzIGxhcyBwZXN0YcOxYXMgZGVsIEFCTSkuICovXG5mdW5jdGlvbiBidWlsZEVkaXRpbmdNb2RhbFZhbHVlc0Zyb21BZ2VudERldGFpbChcbiAgYWdlbnRCeUlkOiBhbnksXG4gIGFnZW50TW9kZWxzOiBBZ2VudE1vZGVsW10sXG4gIHByZXY6IE1vZGFsVmFsdWVzXG4pOiBNb2RhbFZhbHVlcyB7XG4gIGNvbnN0IGFnZW50TW9kZWwgPSBhZ2VudE1vZGVscy5maW5kKG1vZGVsID0+IG1vZGVsLmlkID09PSBhZ2VudEJ5SWQubW9kZWxBaUlkKVxuICByZXR1cm4ge1xuICAgIC4uLnByZXYsXG4gICAgaXNFZGl0aW5nOiB0cnVlLFxuICAgIGdlbmVyYWw6IHtcbiAgICAgIGVtb2ppOiBhZ2VudEJ5SWQuZW1vamksXG4gICAgICBuYW1lOiBhZ2VudEJ5SWQubmFtZSxcbiAgICAgIGludHJvZHVjdGlvbjogYWdlbnRCeUlkLmludHJvZHVjdGlvbixcbiAgICAgIGlucHV0UGxhY2Vob2xkZXI6IGFnZW50QnlJZC5pbnB1dFBsYWNlaG9sZGVyLFxuICAgICAgaXNBY3RpdmU6IGFnZW50QnlJZC5pc0FjdGl2ZSxcbiAgICAgIGFpTW9kZWw6IGFnZW50TW9kZWwgfHwgbnVsbCxcbiAgICAgIGlkOiBhZ2VudEJ5SWQuaWQsXG4gICAgICB1c2VyUHJvbXB0OiBhZ2VudEJ5SWQudXNlclByb21wdCxcbiAgICAgIGtub3dsZWRnZUJhc2VzOiBbXSxcbiAgICAgIGlzX2Zhdm9yaXRlOiBhZ2VudEJ5SWQuaXNfZmF2b3JpdGUsXG4gICAgICBjcmVhdGVkX2J5OiBhZ2VudEJ5SWQuY3JlYXRlZEJ5LFxuICAgIH0sXG4gICAga25vd2xlZGdlOlxuICAgICAgYWdlbnRCeUlkLmtub3dsZWRnZUJhc2VzPy5tYXAoKGs6IGFueSkgPT4gKHtcbiAgICAgICAgZmlsZTogbmV3IEZpbGUoW10sIGsuZmlsZW5hbWUpLFxuICAgICAgICBpZDogay5pZC50b1N0cmluZygpLFxuICAgICAgICBuYW1lOiBrLmZpbGVuYW1lLFxuICAgICAgICBzaXplOiBrLmZpbGVfc2l6ZV9ieXRlcyB8fCAwLFxuICAgICAgICB0eXBlOiBrLm9yaWdpbmFsX2ZpbGVfdHlwZSxcbiAgICAgICAgc3RhdHVzOiBrLnN0YXR1cyxcbiAgICAgICAgdXJsX29yaWdpbmFsOiBrLnVybF9vcmlnaW5hbCB8fCB1bmRlZmluZWQsXG4gICAgICAgIHVybF90aHVtYm5haWw6IGsudXJsX3RodW1ibmFpbCB8fCB1bmRlZmluZWQsXG4gICAgICB9KSkgfHwgW10sXG4gICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgYWNjZXNzVHlwZTogYWdlbnRCeUlkLmFjY2VzcyxcbiAgICAgIGNsaWVudHM6XG4gICAgICAgIGFnZW50QnlJZC5jbGllbnRzPy5tYXAoKGNsaWVudDogYW55KSA9PiAoe1xuICAgICAgICAgIGlkOiBjbGllbnQuaWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgbmFtZTogY2xpZW50Lm5hbWUsXG4gICAgICAgICAgaXNfYWN0aXZlOiBjbGllbnQuaXNfYWN0aXZlID8/IGZhbHNlLFxuICAgICAgICAgIGlzX2RlbGV0ZWQ6IGNsaWVudC5pc19kZWxldGVkID8/IGZhbHNlLFxuICAgICAgICB9KSkgfHwgbnVsbCxcbiAgICAgIGNvckFjY2VzczogZGVyaXZlQ29yQWNjZXNzRnJvbVRvb2xHcm91cFNsdWdzKGFnZW50QnlJZC50b29sR3JvdXBTbHVncyksXG4gICAgICBzZWxlY3RlZENvbm5lY3RvcnM6IGRlcml2ZU1jcENvbm5lY3RvclNsdWdzKGFnZW50QnlJZC5jb25uZWN0b3JzKSxcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBYm1BZ2VudE1vZGFsID0gKHtcbiAgYWRkQWdlbnQsXG4gIHVwZGF0ZUFnZW50LFxuICByZW1vdmVBZ2VudCxcbiAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgc2VsZWN0Rmlyc3RBZ2VudCxcbn06IEFibUFnZW50TW9kYWxQcm9wcykgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IGV2ZW50QW1wbGl0dWRlID0gdXNlRXZlbnQoKVxuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCdhYm1fYWdlbnRfc2VjdGlvbicpXG4gIC8vIGNvbnN0ICRfc2M6IGFueSA9IG51bGxcbiAgY29uc3QgeyBhZ2VudDogY3VycmVudFNlbGVjdGVkQWdlbnQsIHNlbGVjdEFnZW50IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgYWJtQWdlbnRNb2RhbFpJbmRleCA9IHVzZU1haWFUYXNrUGFuZWxaSW5kZXgoMTExMiwgJ2FnZW50TW9kYWwnKVxuICBjb25zdCB0b29sdGlwWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxNTAwLCAnbmVzdGVkTW9kYWwnKVxuICBjb25zdCB7IHRvZ2dsZUZhdm9yaXRlIH0gPSB1c2VUb2dnbGVGYXZvcml0ZSgpXG4gIGNvbnN0IHNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FibS1hZ2VudC1tb2RhbCcpXG4gIGNvbnN0IFtpc1N1YnNjcmliZWQsIHNldElzU3Vic2NyaWJlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgbW9kYWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGhhc1BlbmRpbmdGaWxlc1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgYWN0aW9uc1RvRmlsZXMgPSB1c2VSZWY8YW55Pih7XG4gICAgdG9EZWxldGU6IFtdLFxuICAgIHRvVXBsb2FkOiBbXSxcbiAgfSlcbiAgY29uc3QgYWNjZXNzVXBkYXRlQ29udGV4dCA9IHVzZVJlZjx7XG4gICAgaXNGcm9tQ3JlYXRpb246IGJvb2xlYW5cbiAgICBpc0Zyb21FZGl0aW5nOiBib29sZWFuXG4gICAgaGFzQWN0aW9uRmlsZXM6IGJvb2xlYW5cbiAgICBvcGVyYXRpb25UeXBlOiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgbnVsbFxuICAgIGhhc0JlZW5DYWxsZWQ/OiBib29sZWFuXG4gIH0+KHtcbiAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gIH0pXG4gIGNvbnN0IGFjY2Vzc0hhbmRsZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGFnZW50Q3JlYXRlZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYgPSB1c2VSZWY8QWJtU2VjdGlvbiB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHByZWZldGNoZWRBZ2VudEJ5SWRSZWYgPSB1c2VSZWY8YW55PihudWxsKVxuICBjb25zdCBoeWRyYXRpbmdBZ2VudElkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGZpbGVzRmluaXNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8vIE1hcmNhIGN1YW5kbyBjZXJyYW1vcyBlbCBsb2FkZXIgcG9yIGVsIHRpbWVvdXQgZGUgc2VndXJpZGFkIGRlIGFyY2hpdm9zLlxuICAvLyBNaWVudHJhcyBlc3TDqSBhY3Rpdm8sIGxvcyB1c2VFZmZlY3QgZGUgcG9zdC1ndWFyZGFkbyBOTyBkZWJlbiBkaXNwYXJhclxuICAvLyBzbmFja2JhcnMgZGUgw6l4aXRvIG5pIGF1dG8tY2VycmFyIGVsIG1vZGFsLlxuICBjb25zdCBwcm9jZXNzRmlsZXNUaW1lZE91dFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgW2ZpbGVzUHJvY2Vzc2VkLCBzZXRGaWxlc1Byb2Nlc3NlZF0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93TW9kYWxEZWxldGUsIHNldFNob3dNb2RhbERlbGV0ZV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NlY3Rpb24sIHNldFNlY3Rpb25dID0gdXNlU3RhdGU8QWJtU2VjdGlvbj4oJ2dlbmVyYWwnKVxuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFttb2RhbFZhbHVlcywgc2V0TW9kYWxWYWx1ZXNdID0gdXNlU3RhdGU8e1xuICAgIGdlbmVyYWw6IGFueVxuICAgIGtub3dsZWRnZTogYW55XG4gICAgaXNFZGl0aW5nOiBib29sZWFuXG4gICAgYWNjZXNzaWJpbGl0eTogYW55XG4gIH0+KGluaXRpYWxWYWx1ZXMpXG4gIGNvbnN0IHtcbiAgICBsb2FkaW5nOiBhZ2VudExvYWRpbmcsXG4gICAgaGFuZGxlR2V0QWdlbnRCeUlkLFxuICAgIGFnZW50OiBhZ2VudEJ5SWQsXG4gICAgaGFuZGxlQ2xlYW5BZ2VudCxcbiAgICBlcnJvcjogZXJyb3JHZXRBZ2VudEJ5SWQsXG4gIH0gPSB1c2VHZXRBZ2VudEJ5SWQoKVxuICBjb25zdCB7IGFnZW50TW9kZWxzLCBnZXRBbGxBZ2VudE1vZGVscyB9ID0gdXNlQWdlbnRNb2RlbCgpXG4gIGNvbnN0IGZpcnN0VmFsdWVBZ2VudCA9IHVzZVJlZjxhbnk+KG51bGwpXG4gIGNvbnN0IFtpc1Nob3dQcm9jZXNzRmlsZXMsIHNldElzU2hvd1Byb2Nlc3NGaWxlc10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hhc0ZpbGVFcnJvcnMsIHNldEhhc0ZpbGVFcnJvcnNdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50c1xuXG4gIGNvbnN0IHsgaGFuZGxlRGVsZXRlQWdlbnQsIHN1Y2Nlc3M6IHN1Y2Nlc3NEZWxldGUsIHJlc2V0U3VjY2VzcyB9ID0gdXNlRGVsZXRlQWdlbnQoKVxuICBjb25zdCB7IGhhbmRsZVVwZGF0ZUFnZW50LCBzdWNjZXNzOiBzdWNjZXNzVXBkYXRlLCByZXNldFN1Y2Nlc3M6IHJlc2V0U3VjY2Vzc1VwZGF0ZSB9ID0gdXNlVXBkYXRlQWdlbnQoKVxuXG4gIGNvbnN0IHtcbiAgICBoYW5kbGVDcmVhdGVBZ2VudCxcbiAgICBpc0xvYWRpbmc6IGlzTG9hZGluZ0NyZWF0ZSxcbiAgICBzdWNjZXNzOiBzdWNjZXNzQ3JlYXRlLFxuICAgIHJlc2V0U3VjY2VzczogcmVzZXRTdWNjZXNzQ3JlYXRlLFxuICB9ID0gdXNlQ3JlYXRlQWdlbnQoKVxuXG4gIGNvbnN0IHsgaGFuZGxlU25hY2tiYXJTdWNjZXNzLCBoYW5kbGVTbmFja2JhckVycm9yIH0gPSB1c2VTbmFja0Jhck1hbmFnZXIoKVxuXG4gIGNvbnN0IHtcbiAgICBoYW5kbGVDcmVhdGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZURlbGV0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlcyxcbiAgICBpc0xvYWRpbmc6IGlzTG9hZGluZ0tub3dsZWRnZSxcbiAgICBlcnJvcjogZXJyb3JLbm93bGVkZ2UsXG4gICAgc3VjY2Vzc0RlbGV0ZTogc3VjY2Vzc0tub3dsZWRnZURlbGV0ZSxcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgfSA9IHVzZUtub3dsZWRnZU9wZXJhdGlvbnMoKVxuXG4gIGNvbnN0IHtcbiAgICBoYW5kbGVBY2Nlc3NDbGllbnQsXG4gICAgc3VjY2Vzczogc3VjY2Vzc1VwZGF0ZUFjY2VzcyxcbiAgICBpc0xvYWRpbmc6IGlzTG9hZGluZ1VwZGF0ZUFjY2VzcyxcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3M6IHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzcyxcbiAgfSA9IHVzZUFjY2Vzc0NsaWVudCgpXG5cbiAgaWYgKCFzZWxlY3RvcikgcmV0dXJuIG51bGxcblxuICBjb25zdCBhcmVDbGllbnRzQXJyYXlzRXF1YWwgPSAoY2xpZW50czE6IGFueVtdIHwgbnVsbCwgY2xpZW50czI6IGFueVtdIHwgbnVsbCkgPT4ge1xuICAgIGlmICghY2xpZW50czEgJiYgIWNsaWVudHMyKSByZXR1cm4gdHJ1ZVxuICAgIGlmICghY2xpZW50czEgfHwgIWNsaWVudHMyKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoY2xpZW50czEubGVuZ3RoICE9PSBjbGllbnRzMi5sZW5ndGgpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgY2xpZW50czFJZHMgPSBjbGllbnRzMS5tYXAoYyA9PiBjLmNsaWVudElkKS5zb3J0KClcbiAgICBjb25zdCBjbGllbnRzMklkcyA9IGNsaWVudHMyLm1hcChjID0+IGMuY2xpZW50SWQpLnNvcnQoKVxuXG4gICAgcmV0dXJuIGNsaWVudHMxSWRzLmV2ZXJ5KChpZCwgaW5kZXgpID0+IGlkID09PSBjbGllbnRzMklkc1tpbmRleF0pXG4gIH1cblxuICBjb25zdCBoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCA9ICgpID0+IHtcbiAgICBpZiAoIWZpcnN0VmFsdWVBZ2VudC5jdXJyZW50Py5hY2Nlc3NpYmlsaXR5IHx8ICFtb2RhbFZhbHVlcz8uYWNjZXNzaWJpbGl0eSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGFjY2Vzc1R5cGVTYW1lID0gbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5hY2Nlc3NUeXBlID09PSBmaXJzdFZhbHVlQWdlbnQuY3VycmVudC5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGVcbiAgICBjb25zdCBjbGllbnRzU2FtZSA9IGFyZUNsaWVudHNBcnJheXNFcXVhbChcbiAgICAgIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuY2xpZW50cyxcbiAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmFjY2Vzc2liaWxpdHkuY2xpZW50c1xuICAgIClcbiAgICBjb25zdCBjdXJyZW50Q29yQWNjZXNzID0gbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5jb3JBY2Nlc3MgPz8gREVGQVVMVF9DT1JfQUNDRVNTXG4gICAgY29uc3QgaW5pdGlhbENvckFjY2VzcyA9IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmFjY2Vzc2liaWxpdHkuY29yQWNjZXNzID8/IERFRkFVTFRfQ09SX0FDQ0VTU1xuICAgIGNvbnN0IGNvckFjY2Vzc1NhbWUgPSBDT1JfVE9PTF9HUk9VUF9TTFVHUy5ldmVyeShzbHVnID0+IGN1cnJlbnRDb3JBY2Nlc3Nbc2x1Z10gPT09IGluaXRpYWxDb3JBY2Nlc3Nbc2x1Z10pXG4gICAgY29uc3QgY3VycmVudENvbm5lY3RvcnMgPSBbLi4uKG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuc2VsZWN0ZWRDb25uZWN0b3JzIHx8IFtdKV0uc29ydCgpXG4gICAgY29uc3Qgb3JpZ2luYWxDb25uZWN0b3JzID0gWy4uLihmaXJzdFZhbHVlQWdlbnQuY3VycmVudC5hY2Nlc3NpYmlsaXR5LnNlbGVjdGVkQ29ubmVjdG9ycyB8fCBbXSldLnNvcnQoKVxuICAgIGNvbnN0IGNvbm5lY3RvcnNTYW1lID1cbiAgICAgIGN1cnJlbnRDb25uZWN0b3JzLmxlbmd0aCA9PT0gb3JpZ2luYWxDb25uZWN0b3JzLmxlbmd0aCAmJlxuICAgICAgY3VycmVudENvbm5lY3RvcnMuZXZlcnkoKHNsdWcsIGluZGV4KSA9PiBzbHVnID09PSBvcmlnaW5hbENvbm5lY3RvcnNbaW5kZXhdKVxuXG4gICAgcmV0dXJuICFhY2Nlc3NUeXBlU2FtZSB8fCAhY2xpZW50c1NhbWUgfHwgIWNvckFjY2Vzc1NhbWUgfHwgIWNvbm5lY3RvcnNTYW1lXG4gIH1cblxuICBjb25zdCB2YWxpZGF0ZUFnZW50VmFsdWVzSXNTYW1lID0gKCkgPT4ge1xuICAgIGlmICghZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQ/LmdlbmVyYWwgfHwgIW1vZGFsVmFsdWVzPy5nZW5lcmFsKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAoXG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLm5hbWUgPT09IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmdlbmVyYWwubmFtZSAmJlxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC5lbW9qaSA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuZ2VuZXJhbC5lbW9qaSAmJlxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pbnRyb2R1Y3Rpb24gPT09IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmdlbmVyYWwuaW50cm9kdWN0aW9uICYmXG4gICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmlucHV0UGxhY2Vob2xkZXIgPT09IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LmdlbmVyYWwuaW5wdXRQbGFjZWhvbGRlciAmJlxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC5haU1vZGVsPy5pZCA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQuZ2VuZXJhbC5haU1vZGVsPy5pZCAmJlxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC51c2VyUHJvbXB0ID09PSBmaXJzdFZhbHVlQWdlbnQuY3VycmVudC5nZW5lcmFsLnVzZXJQcm9tcHQgJiZcbiAgICAgIChtb2RhbFZhbHVlcy5rbm93bGVkZ2U/Lmxlbmd0aCA9PT0gZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQ/Lmtub3dsZWRnZT8ubGVuZ3RoIHx8XG4gICAgICAgICghbW9kYWxWYWx1ZXMua25vd2xlZGdlPy5sZW5ndGggJiYgIWZpcnN0VmFsdWVBZ2VudC5jdXJyZW50Py5rbm93bGVkZ2U/Lmxlbmd0aCkpICYmXG4gICAgICAhYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwZGF0ZT8ubGVuZ3RoICYmXG4gICAgICAhYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZT8ubGVuZ3RoICYmXG4gICAgICAhaGFzQWNjZXNzaWJpbGl0eUNoYW5nZWQoKVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGhhc0FueVZhbHVlRm9yQ3JlYXRpb24gPSAoKSA9PiB7XG4gICAgaWYgKG1vZGFsVmFsdWVzLmlzRWRpdGluZykgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBpc0RlZmF1bHRBaU1vZGVsID0gISFhZ2VudE1vZGVscy5sZW5ndGggJiYgbW9kYWxWYWx1ZXMuZ2VuZXJhbC5haU1vZGVsPy5pZCA9PT0gYWdlbnRNb2RlbHNbMF0/LmlkXG5cbiAgICBjb25zdCBkZWZhdWx0SW5wdXRQbGFjZWhvbGRlciA9IHQoJ2dlbmVyYWxTZWN0aW9uLmlucHV0UGxhY2Vob2xkZXInKVxuICAgIGNvbnN0IGlzRGVmYXVsdElucHV0UGxhY2Vob2xkZXIgPSBtb2RhbFZhbHVlcy5nZW5lcmFsLmlucHV0UGxhY2Vob2xkZXIgPT09IGRlZmF1bHRJbnB1dFBsYWNlaG9sZGVyXG5cbiAgICBjb25zdCBkZWZhdWx0VXNlclByb21wdFBsYWNlaG9sZGVyID0gdCgnZ2VuZXJhbFNlY3Rpb24uaW5pdGlhbFByb21wdFBsYWNlaG9sZGVyJylcbiAgICBjb25zdCBpc0RlZmF1bHRVc2VyUHJvbXB0ID1cbiAgICAgIG1vZGFsVmFsdWVzLmdlbmVyYWwudXNlclByb21wdCA9PT0gZGVmYXVsdFVzZXJQcm9tcHRQbGFjZWhvbGRlciB8fFxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC51c2VyUHJvbXB0ID09PSAnJyB8fFxuICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC51c2VyUHJvbXB0ID09PSBudWxsXG5cbiAgICBjb25zdCBoYXNOYW1lID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5uYW1lLnRyaW0oKSAhPT0gJydcbiAgICBjb25zdCBoYXNFbW9qaSA9IG1vZGFsVmFsdWVzLmdlbmVyYWwuZW1vamkudHJpbSgpICE9PSAnJ1xuICAgIGNvbnN0IGhhc0ludHJvZHVjdGlvbiA9IG1vZGFsVmFsdWVzLmdlbmVyYWwuaW50cm9kdWN0aW9uLnRyaW0oKSAhPT0gJydcbiAgICBjb25zdCBoYXNJbnB1dFBsYWNlaG9sZGVyID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pbnB1dFBsYWNlaG9sZGVyLnRyaW0oKSAhPT0gJycgJiYgIWlzRGVmYXVsdElucHV0UGxhY2Vob2xkZXJcbiAgICBjb25zdCBoYXNVc2VyUHJvbXB0ID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC51c2VyUHJvbXB0Py50cmltKCkgIT09ICcnICYmICFpc0RlZmF1bHRVc2VyUHJvbXB0XG4gICAgY29uc3QgaGFzS25vd2xlZGdlID0gISFtb2RhbFZhbHVlcy5rbm93bGVkZ2UubGVuZ3RoXG4gICAgY29uc3QgaGFzQ3VzdG9tQWlNb2RlbCA9IG1vZGFsVmFsdWVzLmdlbmVyYWwuYWlNb2RlbCAmJiAhaXNEZWZhdWx0QWlNb2RlbFxuICAgIGNvbnN0IGhhc0FjY2Vzc2liaWxpdHkgPSBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55J1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGhhc05hbWUgfHxcbiAgICAgIGhhc0Vtb2ppIHx8XG4gICAgICBoYXNJbnRyb2R1Y3Rpb24gfHxcbiAgICAgIGhhc0lucHV0UGxhY2Vob2xkZXIgfHxcbiAgICAgIGhhc1VzZXJQcm9tcHQgfHxcbiAgICAgIGhhc0tub3dsZWRnZSB8fFxuICAgICAgaGFzQ3VzdG9tQWlNb2RlbCB8fFxuICAgICAgaGFzQWNjZXNzaWJpbGl0eVxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGhhc0NoYW5nZXNGb3JFZGl0aW5nID0gKCkgPT4ge1xuICAgIGlmICghbW9kYWxWYWx1ZXMuaXNFZGl0aW5nKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAoXG4gICAgICAhdmFsaWRhdGVBZ2VudFZhbHVlc0lzU2FtZSgpIHx8XG4gICAgICAhIWFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUubGVuZ3RoIHx8XG4gICAgICAhIWFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgY29uc3QgaGFzUGVuZGluZ0NoYW5nZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlRm9yQ3JlYXRpb24oKSB8fCBoYXNDaGFuZ2VzRm9yRWRpdGluZygpXG4gIH1cblxuICAvLyBIZWxwZXIgcGFyYSBtYW5lamFyIGVsIHRvZ2dsZSBkZSBmYXZvcml0byB5IGFjdHVhbGl6YXIgZWwgZXN0YWRvIGNvbiBvcmRlbmFtaWVudG9cbiAgY29uc3QgaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudCA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkOiBzdHJpbmcsIGFnZW50OiBBZ2VudCwgb25TdWNjZXNzPzogKHVwZGF0ZWRBZ2VudDogQWdlbnQpID0+IHZvaWQsIG9uRXJyb3I/OiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICB0b2dnbGVGYXZvcml0ZShcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgdXBkYXRlZEFnZW50ID0+IHtcbiAgICAgICAgICAvLyBBY3R1YWxpemFyIGVsIGVzdGFkbyBkZSBhZ2VudGVzIGNvbiBlbCByZXN1bHRhZG8gZGVsIHNlcnZpZG9yIHkgb3JkZW5hclxuICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGUodXBkYXRlZEFnZW50LCB0cnVlKVxuICAgICAgICAgIGlmIChvblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIG9uU3VjY2Vzcyh1cGRhdGVkQWdlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgICAgIG9uRXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYWdlbnQuaXNfZmF2b3JpdGVcbiAgICAgIClcbiAgICB9LFxuICAgIFt0b2dnbGVGYXZvcml0ZSwgdXBkYXRlQWdlbnRGYXZvcml0ZV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gKCkgPT4ge1xuICAgIGlmIChoYXNQZW5kaW5nQ2hhbmdlcygpICYmICFzdWNjZXNzQ3JlYXRlICYmICFzdWNjZXNzVXBkYXRlICYmICFzdWNjZXNzRGVsZXRlKSB7XG4gICAgICBjb25zdCBjb25maXJtTWVzc2FnZSA9IG1vZGFsVmFsdWVzLmlzRWRpdGluZyA/IHQoJ2NvbmZpcm1DbG9zZUVkaXRBZ2VudCcpIDogdCgnY29uZmlybUNsb3NlQ3JlYXRlQWdlbnQnKVxuXG4gICAgICBpZiAoIXdpbmRvdy5jb25maXJtKGNvbmZpcm1NZXNzYWdlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRNb2RhbFZhbHVlcyhpbml0aWFsVmFsdWVzKVxuICAgIGhhbmRsZUNsZWFuQWdlbnQoKVxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc1NhdmUoKVxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcbiAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50ID0ge1xuICAgICAgdG9EZWxldGU6IFtdLFxuICAgICAgdG9VcGxvYWQ6IFtdLFxuICAgIH1cbiAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICB9XG4gICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKGZhbHNlKVxuICAgIHNldElzU3Vic2NyaWJlZChmYWxzZSlcbiAgICBzZXRGaWxlc1Byb2Nlc3NlZCgwKVxuICAgIHNldFNlY3Rpb24oJ2dlbmVyYWwnKVxuICAgIHNldElzT3BlbihmYWxzZSlcbiAgICBoeWRyYXRpbmdBZ2VudElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgYWdlbnRDcmVhdGVkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50ID0gbnVsbFxuICB9XG5cbiAgY29uc3QgaGFuZGxlQmFja2Ryb3BDbGljayA9IChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChldmVudC50YXJnZXQgPT09IGV2ZW50LmN1cnJlbnRUYXJnZXQgJiYgIWlzU2hvd1Byb2Nlc3NGaWxlcykge1xuICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNlY3Rpb25DaGFuZ2UgPSAobmV3U2VjdGlvbjogQWJtU2VjdGlvbikgPT4ge1xuICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy50YWJTZWN0aW9uLCB7IG9wdGlvbjogbmV3U2VjdGlvbiB9KVxuICAgIHNldFNlY3Rpb24obmV3U2VjdGlvbilcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNldEFnZW50VmFsdWVzQnlLZXlzID0gKHtcbiAgICBrZXksXG4gICAgdmFsdWUsXG4gICAgZGVsZXRlS25vd2xlZGdlLFxuICB9OiB7XG4gICAga2V5OiBzdHJpbmdcbiAgICB2YWx1ZTogYW55XG4gICAgZGVsZXRlS25vd2xlZGdlOiBib29sZWFuXG4gIH0pID0+IHtcbiAgICBpZiAoa2V5ID09PSAna25vd2xlZGdlJykge1xuICAgICAgaWYgKCFkZWxldGVLbm93bGVkZ2UpIHtcbiAgICAgICAgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5wdXNoKC4uLih2YWx1ZSB8fCBbXSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmaWxlc1ByZXZJZHMgPSB2YWx1ZS5sZW5ndGggPyBuZXcgU2V0KHZhbHVlLm1hcChmaWxlID0+IGZpbGUuaWQpKSA6IG5ldyBTZXQoKVxuICAgICAgICBjb25zdCBuZXdGaWxlcyA9IG1vZGFsVmFsdWVzLmtub3dsZWRnZS5maWx0ZXIoZmlsZSA9PiAhZmlsZXNQcmV2SWRzLmhhcyhmaWxlLmlkKSAmJiBmaWxlLnN0YXR1cyAhPT0gJ3N0YXJ0ZWQnKVxuICAgICAgICBpZiAoIW5ld0ZpbGVzLmxlbmd0aCAmJiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlSWRzID0gbmV3IFNldCh2YWx1ZS5tYXAoZmlsZSA9PiBmaWxlLmlkKSlcbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkID0gYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5maWx0ZXIoZmlsZSA9PiB2YWx1ZUlkcy5oYXMoZmlsZS5pZCkpXG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZSA9IFsuLi4oYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZSB8fCBbXSksIC4uLm5ld0ZpbGVzXVxuICAgICAgfVxuICAgIH1cbiAgICBzZXRNb2RhbFZhbHVlcyhwcmV2ID0+IHtcbiAgICAgIGNvbnN0IGtub3dsZWRnZUZpbGVzID1cbiAgICAgICAga2V5ID09PSAna25vd2xlZGdlJ1xuICAgICAgICAgID8gZGVsZXRlS25vd2xlZGdlXG4gICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICA6IFsuLi4ocHJldi5rbm93bGVkZ2UgfHwgW10pLCAuLi4oKHZhbHVlIGFzIEF0dGFjaG1lbnRGaWxlW10pIHx8IFtdKV1cbiAgICAgICAgICA6IG51bGxcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIC4uLihrZXkgPT09ICdrbm93bGVkZ2UnXG4gICAgICAgICAgPyB7IGtub3dsZWRnZToga25vd2xlZGdlRmlsZXMgfVxuICAgICAgICAgIDoga2V5ID09PSAnYWNjZXNzaWJpbGl0eSdcbiAgICAgICAgICAgID8geyBhY2Nlc3NpYmlsaXR5OiB2YWx1ZSB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgICAgICAgICAuLi5wcmV2LmdlbmVyYWwsXG4gICAgICAgICAgICAgICAgICBba2V5XTogdmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1BY3Rpb24gPSBhc3luYyAoY2hhdDogYW55LCBhY3Rpb246ICdkZWxldGUnIHwgJ3VwZGF0ZScgfCAnY3JlYXRlJykgPT4ge1xuICAgIC8vIFNvbG8gcGVybWl0aXIgb3BlcmFjaW9uZXMgZGUgYWdlbnRlcyBjdXN0b20gc2kgbGEgZmVhdHVyZSBmbGFnIGVzdMOhIGhhYmlsaXRhZGFcbiAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmRlbGV0ZSlcbiAgICAgIGhhbmRsZURlbGV0ZUFnZW50KGNoYXQuaWQgYXMgdW5rbm93biBhcyBzdHJpbmcpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgY29yQWNjZXNzID0gbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5jb3JBY2Nlc3MgPz8gREVGQVVMVF9DT1JfQUNDRVNTXG4gICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmNvbmZpcm1BY3Rpb24sIHtcbiAgICAgIG9wdGlvbjogbW9kYWxWYWx1ZXMuaXNFZGl0aW5nID8gJ2VkaXQnIDogJ2NyZWF0ZScsXG4gICAgICBjb3Jfc2x1Z3M6IGJ1aWxkQWdlbnRUb29sR3JvdXBzUmVxdWVzdChjb3JBY2Nlc3MpLFxuICAgICAgY29yX2FjY2VzczogY29yQWNjZXNzLFxuICAgIH0pXG4gICAgLy8gQWwgcmVpbnRlbnRhciBndWFyZGFyLCBsaWJlcmFyIGVsIGZyZW5vIGRlbCB0aW1lb3V0IHByZXZpbyBwYXJhIHF1ZSBsb3NcbiAgICAvLyB1c2VFZmZlY3QgZGUgcG9zdC1ndWFyZGFkbyB2dWVsdmFuIGEgcG9kZXIgZGlzcGFyYXIgc25hY2tiYXJzIHkgY2VycmFyLlxuICAgIHByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIGlmIChtb2RhbFZhbHVlcy5pc0VkaXRpbmcpIHtcbiAgICAgIGlmICghdmFsaWRhdGVBZ2VudFZhbHVlc0lzU2FtZSgpKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZVVwZGF0ZUFnZW50KG1vZGFsVmFsdWVzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoYW5kbGVDcmVhdGVBZ2VudChtb2RhbFZhbHVlcylcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVNldEFnZW50VmFsdWVzID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnRWYWx1ZXMgfSA9IGV2ZW50LmRldGFpbFxuICAgICAgY29uc3QgaW5pdGlhbFNlY3Rpb24gPSBhZ2VudFZhbHVlcz8uaW5pdGlhbFNlY3Rpb24gYXMgQWJtU2VjdGlvbiB8IHVuZGVmaW5lZFxuICAgICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPVxuICAgICAgICBpbml0aWFsU2VjdGlvbiAmJiBbJ2dlbmVyYWwnLCAna25vd2xlZGdlJywgJ2FjY2Vzc2liaWxpdHknXS5pbmNsdWRlcyhpbml0aWFsU2VjdGlvbikgPyBpbml0aWFsU2VjdGlvbiA6IG51bGxcbiAgICAgIGh5ZHJhdGluZ0FnZW50SWRSZWYuY3VycmVudCA9IG51bGxcblxuICAgICAgZ2V0QWxsQWdlbnRNb2RlbHMoKVxuICAgICAgc2V0SXNPcGVuKHRydWUpXG4gICAgICBzZXRJc0xvYWRpbmcodHJ1ZSlcblxuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY3Rpb25GaWxlczogZmFsc2UsXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgfVxuXG4gICAgICBpZiAoYWdlbnRWYWx1ZXMudmFsdWVzPy5pc0VkaXRpbmcpIHtcbiAgICAgICAgLy8gVmFsaWRhciBxdWUgbGEgZmVhdHVyZSBmbGFnIGVzdMOpIGhhYmlsaXRhZGEgYW50ZXMgZGUgY2FyZ2FyIGVsIGFnZW50ZSBwYXJhIGVkaXRhclxuICAgICAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSB7XG4gICAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdlcnJvckFjY2Vzc0RlbmllZCcpKVxuICAgICAgICAgIHNldElzT3BlbihmYWxzZSlcbiAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgICAgICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChhZ2VudFZhbHVlcy5wcmVmZXRjaGVkQWdlbnRCeUlkKSB7XG4gICAgICAgICAgaGFuZGxlQ2xlYW5BZ2VudCgpXG4gICAgICAgICAgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50ID0gYWdlbnRWYWx1ZXMucHJlZmV0Y2hlZEFnZW50QnlJZFxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGhhbmRsZUdldEFnZW50QnlJZChhZ2VudFZhbHVlcz8udmFsdWVzPy5nZW5lcmFsPy5pZCBhcyB1bmtub3duIGFzIHN0cmluZylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChhZ2VudFZhbHVlcy52YWx1ZXMpIHtcbiAgICAgICAgY29uc3QgbmV4dFZhbHVlcyA9IHtcbiAgICAgICAgICAuLi5pbml0aWFsVmFsdWVzLFxuICAgICAgICAgIC4uLmFnZW50VmFsdWVzLnZhbHVlcyxcbiAgICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgICAuLi5pbml0aWFsVmFsdWVzLmdlbmVyYWwsXG4gICAgICAgICAgICAuLi4oYWdlbnRWYWx1ZXMudmFsdWVzLmdlbmVyYWwgfHwge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgLi4uaW5pdGlhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LFxuICAgICAgICAgICAgLi4uKGFnZW50VmFsdWVzLnZhbHVlcy5hY2Nlc3NpYmlsaXR5IHx8IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtub3dsZWRnZTogYWdlbnRWYWx1ZXMudmFsdWVzLmtub3dsZWRnZSB8fCBbXSxcbiAgICAgICAgfVxuXG4gICAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50ID0gbmV4dFZhbHVlc1xuICAgICAgICBzZXRNb2RhbFZhbHVlcyhuZXh0VmFsdWVzKVxuICAgICAgfVxuXG4gICAgICBpZiAocGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgJiYgIWFnZW50VmFsdWVzLnZhbHVlcz8uaXNFZGl0aW5nKSB7XG4gICAgICAgIHNldFNlY3Rpb24ocGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQpXG4gICAgICAgIHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2FibS1hZ2VudC1tb2RhbC1zZXQtdmFsdWVzJywgaGFuZGxlU2V0QWdlbnRWYWx1ZXMpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FibS1hZ2VudC1tb2RhbC1zZXQtdmFsdWVzJywgaGFuZGxlU2V0QWdlbnRWYWx1ZXMgYXMgRXZlbnRMaXN0ZW5lcilcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIHVzZUVmZmVjdCB0byBoYW5kbGUgdGhlIG92ZXJmbG93IG9mIHRoZSBib2R5IHdoZW4gdGhlIG1vZGFsIGlzIG9wZW5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzT3Blbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHsgYm9keSB9ID0gZG9jdW1lbnRcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE92ZXJmbG93ID0gYm9keS5zdHlsZS5vdmVyZmxvd1xuICAgIGJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJ1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGJvZHkuc3R5bGUub3ZlcmZsb3cgPSBvcmlnaW5hbE92ZXJmbG93XG4gICAgfVxuICB9LCBbaXNPcGVuXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChldmVudDogQmVmb3JlVW5sb2FkRXZlbnQpID0+IHtcbiAgICAgIGlmIChoYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gdCgnY29uZmlybVJlbG9hZEJyb3dzZXInKVxuICAgICAgICByZXR1cm4gdCgnY29uZmlybVJlbG9hZEJyb3dzZXInKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmIChpc09wZW4pIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBoYW5kbGVCZWZvcmVVbmxvYWQpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBoYW5kbGVCZWZvcmVVbmxvYWQpXG4gICAgfVxuICB9LCBbaXNPcGVuLCBoYXNQZW5kaW5nQ2hhbmdlcywgdF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3VjY2Vzc0RlbGV0ZSkge1xuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudERlbGV0ZWQnKSlcbiAgICAgIHJlc2V0U3VjY2VzcygpXG4gICAgICBpZiAoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkID09PSBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICAgIHNlbGVjdEZpcnN0QWdlbnQoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkIGFzIHN0cmluZylcbiAgICAgIH1cbiAgICAgIHJlbW92ZUFnZW50KG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQpXG4gICAgICBzZXRTaG93TW9kYWxEZWxldGUoZmFsc2UpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfVxuICB9LCBbc3VjY2Vzc0RlbGV0ZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBFdml0YXIgZWplY3VjacOzbiBtw7psdGlwbGUgZGVsIGVmZWN0b1xuICAgIGlmIChzdWNjZXNzQ3JlYXRlICYmICFpc0xvYWRpbmdDcmVhdGUgJiYgYWdlbnRDcmVhdGVkUmVmLmN1cnJlbnQgIT09IHN1Y2Nlc3NDcmVhdGUuaWQpIHtcbiAgICAgIGFnZW50Q3JlYXRlZFJlZi5jdXJyZW50ID0gc3VjY2Vzc0NyZWF0ZS5pZFxuICAgICAgaWYgKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUubGVuZ3RoICYmIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGlzRnJvbUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBoYXNBY3Rpb25GaWxlczogdHJ1ZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpIG5vIGhheSBhY2Nlc2liaWxpZGFkIHBlcm8gaGF5IGFyY2hpdm9zLCBlc3RhYmxlY2VyIGVsIGNvbnRleHRvIHBhcmEgY3JlYWNpw7NuXG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAgICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlcyh7XG4gICAgICAgICAgICBmaWxlc1RvRGVsZXRlOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlLFxuICAgICAgICAgICAgZmlsZXNUb0NyZWF0ZTogYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZCxcbiAgICAgICAgICAgIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goaGFuZGxlQWNjZXNzQ2xpZW50KHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAgIGNvbnN0IGFnZW50V2l0aEZhdm9yaXRlID0geyAuLi5zdWNjZXNzQ3JlYXRlLCBpc19mYXZvcml0ZTogdHJ1ZSB9XG4gICAgICAgICAgYWRkQWdlbnQoYWdlbnRXaXRoRmF2b3JpdGUpXG4gICAgICAgICAgLy8gQ3VhbmRvIHNlIGNyZWEgdW4gYWdlbnRlIG51ZXZvLCBlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmYXZvcml0byBtYXJjYWRvIGHDum5cbiAgICAgICAgICAvLyBFbnRvbmNlcyBjdXJyZW50SXNGYXZvcml0ZSBkZWJlIHNlciBmYWxzZSBwYXJhIHF1ZSBlbCB0b2dnbGUgbG8gbWFycXVlIGNvbW8gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGFnZW50Rm9yVG9nZ2xlID0geyAuLi5hZ2VudFdpdGhGYXZvcml0ZSwgaXNfZmF2b3JpdGU6IGZhbHNlIH1cbiAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50KFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhZ2VudEZvclRvZ2dsZSxcbiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKCksXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuXG4gICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXModHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuYWNjZXNzVHlwZSAhPT0gJ2NvbXBhbnknKSB7XG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2kgbm8gaGF5IGFjY2VzaWJpbGlkYWQgcGVybyBoYXkgYXJjaGl2b3MsIGVzdGFibGVjZXIgZWwgY29udGV4dG8gcGFyYSBjcmVhY2nDs25cbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBpc0Zyb21DcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgICAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzKHsgZmlsZXM6IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUsIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSB9KSxcbiAgICAgICAgXVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goaGFuZGxlQWNjZXNzQ2xpZW50KHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAgIGNvbnN0IGFnZW50V2l0aEZhdm9yaXRlID0geyAuLi5zdWNjZXNzQ3JlYXRlLCBpc19mYXZvcml0ZTogdHJ1ZSB9XG4gICAgICAgICAgYWRkQWdlbnQoYWdlbnRXaXRoRmF2b3JpdGUpXG4gICAgICAgICAgLy8gQ3VhbmRvIHNlIGNyZWEgdW4gYWdlbnRlIG51ZXZvLCBlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmYXZvcml0byBtYXJjYWRvIGHDum5cbiAgICAgICAgICAvLyBFbnRvbmNlcyBjdXJyZW50SXNGYXZvcml0ZSBkZWJlIHNlciBmYWxzZSBwYXJhIHF1ZSBlbCB0b2dnbGUgbG8gbWFycXVlIGNvbW8gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGFnZW50Rm9yVG9nZ2xlID0geyAuLi5hZ2VudFdpdGhGYXZvcml0ZSwgaXNfZmF2b3JpdGU6IGZhbHNlIH1cbiAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50KFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBhZ2VudEZvclRvZ2dsZSxcbiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKCksXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzKHsgZmlsZXM6IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUsIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSB9KVxuICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGlzRnJvbUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBoYXNBY3Rpb25GaWxlczogdHJ1ZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpIG5vIGhheSBhY2Nlc2liaWxpZGFkIHBlcm8gaGF5IGFyY2hpdm9zLCBlc3RhYmxlY2VyIGVsIGNvbnRleHRvIHBhcmEgY3JlYWNpw7NuXG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAgICAgaGFuZGxlQ3JlYXRlS25vd2xlZGdlcyh7IGZpbGVzOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkLCBhZ2VudElkOiBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCkgfSksXG4gICAgICAgIF1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5hY2Nlc3NUeXBlICE9PSAnY29tcGFueScpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGhhbmRsZUFjY2Vzc0NsaWVudChzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGFsVmFsdWVzLmdlbmVyYWwuaXNfZmF2b3JpdGUpIHtcbiAgICAgICAgICBjb25zdCBhZ2VudFdpdGhGYXZvcml0ZSA9IHsgLi4uc3VjY2Vzc0NyZWF0ZSwgaXNfZmF2b3JpdGU6IHRydWUgfVxuICAgICAgICAgIGFkZEFnZW50KGFnZW50V2l0aEZhdm9yaXRlKVxuICAgICAgICAgIC8vIEN1YW5kbyBzZSBjcmVhIHVuIGFnZW50ZSBudWV2bywgZWwgc2Vydmlkb3Igbm8gdGllbmUgZWwgZmF2b3JpdG8gbWFyY2FkbyBhw7puXG4gICAgICAgICAgLy8gRW50b25jZXMgY3VycmVudElzRmF2b3JpdGUgZGViZSBzZXIgZmFsc2UgcGFyYSBxdWUgZWwgdG9nZ2xlIGxvIG1hcnF1ZSBjb21vIHRydWVcbiAgICAgICAgICBjb25zdCBhZ2VudEZvclRvZ2dsZSA9IHsgLi4uYWdlbnRXaXRoRmF2b3JpdGUsIGlzX2Zhdm9yaXRlOiBmYWxzZSB9XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudChcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgYWdlbnRGb3JUb2dnbGUsXG4gICAgICAgICAgICAgICAgKCkgPT4gcmVzb2x2ZSgpLFxuICAgICAgICAgICAgICAgICgpID0+IHJlamVjdCgpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFkZEFnZW50KHN1Y2Nlc3NDcmVhdGUpXG4gICAgICAgIH1cblxuICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHNldElzU2hvd1Byb2Nlc3NGaWxlcyh0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmIChtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGUgIT09ICdjb21wYW55Jykge1xuICAgICAgICAvLyBTb2xvIHJlc2V0ZWFyIGVsIGNvbnRleHRvIHNpIE5PIHNlIGhhIGxsYW1hZG8gdG9kYXbDrWFcbiAgICAgICAgaWYgKCFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQmVlbkNhbGxlZCkge1xuICAgICAgICAgIGNvbnN0IHsgaGFzQWN0aW9uRmlsZXMgfSA9IGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudFxuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgICAgIGlzRnJvbUNyZWF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogZmFsc2UsXG4gICAgICAgICAgICBoYXNBY3Rpb25GaWxlczogaGFzQWN0aW9uRmlsZXMgfHwgZmFsc2UsXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0JlZW5DYWxsZWQpIHtcbiAgICAgICAgICBoYW5kbGVBY2Nlc3NDbGllbnQoc3VjY2Vzc0NyZWF0ZS5pZC50b1N0cmluZygpLCBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5KVxuICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNCZWVuQ2FsbGVkID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29sbyBlamVjdXRhciBoYW5kbGVBY2Nlc3NDbGllbnQsIGVsIGFnZW50ZSBzZSBhZ3JlZ2Fyw6EgeSBlbCB0b2dnbGUgc2UgaGFyw6EgZW4gc3VjY2Vzc1VwZGF0ZUFjY2Vzc1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGZhdm9yaXRlIGlmIGl0IHdhcyBtYXJrZWQgZHVyaW5nIGNyZWF0aW9uXG4gICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAvLyBQcmltZXJvIGFncmVnYXIgZWwgYWdlbnRlIGEgbGEgbGlzdGEgKGFkZEFnZW50IHlhIG9yZGVuYSlcbiAgICAgICAgY29uc3QgYWdlbnRXaXRoRmF2b3JpdGUgPSB7IC4uLnN1Y2Nlc3NDcmVhdGUsIGlzX2Zhdm9yaXRlOiB0cnVlIH1cbiAgICAgICAgYWRkQWdlbnQoYWdlbnRXaXRoRmF2b3JpdGUpXG5cbiAgICAgICAgLy8gQ3VhbmRvIHNlIGNyZWEgdW4gYWdlbnRlIG51ZXZvLCBlbCBzZXJ2aWRvciBubyB0aWVuZSBlbCBmYXZvcml0byBtYXJjYWRvIGHDum5cbiAgICAgICAgLy8gRW50b25jZXMgY3VycmVudElzRmF2b3JpdGUgZGViZSBzZXIgZmFsc2UgcGFyYSBxdWUgZWwgdG9nZ2xlIGxvIG1hcnF1ZSBjb21vIHRydWVcbiAgICAgICAgY29uc3QgYWdlbnRGb3JUb2dnbGUgPSB7IC4uLmFnZW50V2l0aEZhdm9yaXRlLCBpc19mYXZvcml0ZTogZmFsc2UgfVxuICAgICAgICAvLyBMdWVnbyBoYWNlciBlbCB0b2dnbGUgZGUgZmF2b3JpdG8gZW4gZWwgc2Vydmlkb3IgeSBhY3R1YWxpemFyIGVsIGVzdGFkb1xuICAgICAgICBoYW5kbGVUb2dnbGVGYXZvcml0ZUZvckFnZW50KFxuICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBhZ2VudEZvclRvZ2dsZSxcbiAgICAgICAgICB1cGRhdGVkQWdlbnQgPT4ge1xuICAgICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7IG9wdGlvbjogdXBkYXRlZEFnZW50LmlzX2Zhdm9yaXRlID8gJ2FkZCcgOiAncmVtb3ZlJyB9KVxuICAgICAgICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgICAgICAgIHNlbGVjdEFnZW50KHsgLi4uYWdlbnRXaXRoRmF2b3JpdGUsIGlzX2Zhdm9yaXRlOiB1cGRhdGVkQWdlbnQuaXNfZmF2b3JpdGUgfSlcbiAgICAgICAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7IG9wdGlvbjogJ2FkZCcgfSlcbiAgICAgICAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICAgICAgICBzZWxlY3RBZ2VudChhZ2VudFdpdGhGYXZvcml0ZSlcbiAgICAgICAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgICAgYWRkQWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc0NyZWF0ZSlcbiAgICAgICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIGlzTG9hZGluZ0NyZWF0ZSxcbiAgICBzdWNjZXNzQ3JlYXRlLFxuICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVDcmVhdGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIGFkZEFnZW50LFxuICAgIHNlbGVjdEFnZW50LFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgICByZXNldFN1Y2Nlc3NDcmVhdGUsXG4gICAgaGFuZGxlQ2xvc2UsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdWNjZXNzVXBkYXRlKSB7XG4gICAgICBpZiAoYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGggJiYgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkKCkpIHtcbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiB0cnVlLFxuICAgICAgICAgICAgaGFzQWN0aW9uRmlsZXM6IHRydWUsXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAndXBkYXRlJyxcbiAgICAgICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXNUb0RlbGV0ZSA9IFsuLi5hY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlXVxuICAgICAgICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBbLi4uYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZF1cbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlID0gW11cbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkID0gW11cblxuICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMoe1xuICAgICAgICAgICAgICBmaWxlc1RvRGVsZXRlLFxuICAgICAgICAgICAgICBmaWxlc1RvQ3JlYXRlOiBmaWxlc1RvVXBsb2FkLFxuICAgICAgICAgICAgICBhZ2VudElkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLihoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpXG4gICAgICAgICAgICAgID8gW2hhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXModHJ1ZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkKCkpIHtcbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICBpc0Zyb21FZGl0aW5nOiB0cnVlLFxuICAgICAgICAgICAgaGFzQWN0aW9uRmlsZXM6IHRydWUsXG4gICAgICAgICAgICBvcGVyYXRpb25UeXBlOiAndXBkYXRlJyxcbiAgICAgICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZXNUb0RlbGV0ZSA9IFsuLi5hY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlXVxuICAgICAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUgPSBbXVxuXG4gICAgICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyh7XG4gICAgICAgICAgICAgIGZpbGVzOiBmaWxlc1RvRGVsZXRlLFxuICAgICAgICAgICAgICBhZ2VudElkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLihoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpXG4gICAgICAgICAgICAgID8gW2hhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXVxuICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICBdKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoKSB7XG4gICAgICAgIGlmIChoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgb3BlcmF0aW9uVHlwZTogJ3VwZGF0ZScsXG4gICAgICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZCkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzVG9VcGxvYWQgPSBbLi4uYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZF1cbiAgICAgICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkID0gW11cblxuICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXMoe1xuICAgICAgICAgICAgICBmaWxlczogZmlsZXNUb1VwbG9hZCxcbiAgICAgICAgICAgICAgYWdlbnRJZDogbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZC50b1N0cmluZygpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi4oaGFzQWNjZXNzaWJpbGl0eUNoYW5nZWQoKVxuICAgICAgICAgICAgICA/IFtoYW5kbGVBY2Nlc3NDbGllbnQobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZC50b1N0cmluZygpLCBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5KV1cbiAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgXSlcbiAgICAgICAgfVxuICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKHRydWUpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGhhc0FjY2Vzc2liaWxpdHlDaGFuZ2VkKCkpIHtcbiAgICAgICAgLy8gU29sbyByZXNldGVhciBlbCBjb250ZXh0byBzaSBOTyBzZSBoYSBsbGFtYWRvIHRvZGF2w61hIHkgTk8gaGF5IGFyY2hpdm9zIHBlbmRpZW50ZXNcbiAgICAgICAgaWYgKCFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQmVlbkNhbGxlZCAmJiAhYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0FjdGlvbkZpbGVzKSB7XG4gICAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgaXNGcm9tRWRpdGluZzogdHJ1ZSxcbiAgICAgICAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgaGFzQmVlbkNhbGxlZDogZmFsc2UsXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQpIHtcbiAgICAgICAgICAvLyBMbGFtYXIgYSBoYW5kbGVBY2Nlc3NDbGllbnQgc29sbyB1bmEgdmV6XG4gICAgICAgICAgaWYgKCFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQmVlbkNhbGxlZCkge1xuICAgICAgICAgICAgaGFuZGxlQWNjZXNzQ2xpZW50KG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSlcbiAgICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNCZWVuQ2FsbGVkID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gU29sbyBjZXJyYXIgc2kgbm8gaGF5IGFyY2hpdm9zIHNpZW5kbyBwcm9jZXNhZG9zIG5pIGFjY2VzcyBwZW5kaWVudGVcbiAgICAgIGlmIChcbiAgICAgICAgIWhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ICYmXG4gICAgICAgICFpc1Nob3dQcm9jZXNzRmlsZXMgJiZcbiAgICAgICAgIWFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoICYmXG4gICAgICAgICFhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQuaGFzQWN0aW9uRmlsZXMgJiZcbiAgICAgICAgIXN1Y2Nlc3NVcGRhdGVBY2Nlc3MgJiZcbiAgICAgICAgIXByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmLmN1cnJlbnRcbiAgICAgICkge1xuICAgICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50VXBkYXRlZCcpKVxuICAgICAgICB1cGRhdGVBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgICBpZiAoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkID09PSBzdWNjZXNzVXBkYXRlLmlkKSB7XG4gICAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgICAgICByZXNldFN1Y2Nlc3NVcGRhdGUoKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJykpXG4gICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBzdWNjZXNzVXBkYXRlLFxuICAgIG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQsXG4gICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVEZWxldGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICAgIHQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlLFxuICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZSxcbiAgICBoYW5kbGVDbG9zZSxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVQcm9jZXNzRmlsZXNUaW1lb3V0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgJiYgIWlzU2hvd1Byb2Nlc3NGaWxlcykgcmV0dXJuXG5cbiAgICAvLyBBbCBjdW1wbGlyc2UgZWwgdGltZW91dCBhc3VtaW1vcyBxdWUgZWwgZ3VhcmRhZG8gZGVsIGFnZW50ZSBmdWUgZXhpdG9zb1xuICAgIC8vIChlbCBzZXJ2ZXIgcmVzcG9uZGnDsyBPSykgeSBxdWUgbG9zIGFyY2hpdm9zIHNlIGVudmlhcm9uIGNvcnJlY3RhbWVudGUuXG4gICAgLy8gU29sbyBwZXJkaW1vcyBsYSBjb25maXJtYWNpw7NuIGFzaW5jcsOzbmljYSBkZWwgV2ViU29ja2V0IHNvYnJlIHN1XG4gICAgLy8gcHJvY2VzYW1pZW50by4gQ2VycmFtb3MgdG9kbyBtb3N0cmFuZG8gZWwgc25hY2tiYXIgZGUgw6l4aXRvIHF1ZSBodWJpZXNlXG4gICAgLy8gZGlzcGFyYWRvIGVsIGZsdWpvIG5vcm1hbCBkZSDDqXhpdG8uXG5cbiAgICAvLyBGcmVubyBwYXJhIHF1ZSBsb3MgdXNlRWZmZWN0IGRlIHBvc3QtZ3VhcmRhZG8gbm8gcmUtZGlzcGFyZW4gc25hY2tiYXJzXG4gICAgLy8gbyBjaWVycmVzIGR1cGxpY2Fkb3MgY3VhbmRvIHNldElzU2hvd1Byb2Nlc3NGaWxlcyhmYWxzZSkgbG9zIGdhdGlsbGUuXG4gICAgcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYuY3VycmVudCA9IHRydWVcblxuICAgIGlmIChtb2RhbFZhbHVlcy5pc0VkaXRpbmcgJiYgc3VjY2Vzc1VwZGF0ZSkge1xuICAgICAgdXBkYXRlQWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIGlmIChjdXJyZW50U2VsZWN0ZWRBZ2VudD8uaWQgPT09IHN1Y2Nlc3NVcGRhdGUuaWQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKSlcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRVcGRhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NVcGRhdGUoKVxuICAgIH0gZWxzZSBpZiAoIW1vZGFsVmFsdWVzLmlzRWRpdGluZyAmJiBzdWNjZXNzQ3JlYXRlKSB7XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICB9XG5cbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlKClcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzcygpXG5cbiAgICBoYW5kbGVDbG9zZSgpXG4gIH0sIFtcbiAgICBpc1Nob3dQcm9jZXNzRmlsZXMsXG4gICAgbW9kYWxWYWx1ZXMuaXNFZGl0aW5nLFxuICAgIHN1Y2Nlc3NVcGRhdGUsXG4gICAgc3VjY2Vzc0NyZWF0ZSxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICBjdXJyZW50U2VsZWN0ZWRBZ2VudD8uaWQsXG4gICAgc2VsZWN0QWdlbnQsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICAgIHQsXG4gICAgcmVzZXRTdWNjZXNzVXBkYXRlLFxuICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSxcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaGFuZGxlQ2xvc2UsXG4gIF0pXG5cbiAgY29uc3Qgd2ViU29ja2V0RnVuY3Rpb24gPSAoeyBtb2RlbF9kYXRhOiBtb2RlbERhdGEgfTogeyBtb2RlbF9kYXRhOiBhbnkgfSkgPT4ge1xuICAgIGNvbnN0IGZpbGVTdGF0dXMgPSBtb2RlbERhdGFcbiAgICBpZiAoZmlsZVN0YXR1cy5zdGF0dXMgPT09ICdkb25lJyB8fCBmaWxlU3RhdHVzLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkS25vd2xlZGdlID0gcHJldi5rbm93bGVkZ2UubWFwKGZpbGUgPT4ge1xuICAgICAgICAgIGlmIChmaWxlLm5hbWUgPT09IGZpbGVTdGF0dXMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmZpbGUsXG4gICAgICAgICAgICAgIHN0YXR1czogZmlsZVN0YXR1cy5zdGF0dXMsXG4gICAgICAgICAgICAgIGlkOiBmaWxlU3RhdHVzLmtub3dsZWRnZV9iYXNlX2lkIHx8IGZpbGUuaWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWxlXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGhhc1BlbmRpbmdGaWxlcyA9IHVwZGF0ZWRLbm93bGVkZ2Uuc29tZShmaWxlID0+IGZpbGUuc3RhdHVzID09PSAncGVuZGluZycpXG4gICAgICAgIGNvbnN0IGhhc0Vycm9yRmlsZXMgPSB1cGRhdGVkS25vd2xlZGdlLnNvbWUoZmlsZSA9PiBmaWxlLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpXG4gICAgICAgIGlmIChoYXNFcnJvckZpbGVzICYmICFoYXNQZW5kaW5nRmlsZXMpIHtcbiAgICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKGZhbHNlKVxuICAgICAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IoXG4gICAgICAgICAgICBtb2RhbFZhbHVlcy5pc0VkaXRpbmcgPyB0KCdjb25maXJtQWdlbnRVcGRhdGVkV2l0aEZpbGVzRXJyb3InKSA6IHQoJ2NvbmZpcm1BZ2VudFdpdGhGaWxlc0Vycm9yJylcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1BlbmRpbmdGaWxlcyAmJiAhaGFzRXJyb3JGaWxlcykge1xuICAgICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXMoZmFsc2UpXG5cbiAgICAgICAgICAvLyBTaSBoYWLDrWEgYWNjZXNzIHBlbmRpZW50ZSB5IHlhIGVzdGFiYSBtYW5lamFkbywgZm9yemFyIHF1ZSBlbCB1c2VFZmZlY3QgZGUgYWNjZXNzIHNlIGVqZWN1dGUgZGUgbnVldm9cbiAgICAgICAgICBpZiAoYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0FjdGlvbkZpbGVzICYmIGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgc2V0RmlsZXNQcm9jZXNzZWQocHJldkNvdW50ID0+IHByZXZDb3VudCArIDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJlxuICAgICAgICAgICAgIWFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNBY3Rpb25GaWxlcyAmJlxuICAgICAgICAgICAgIWZpbGVzRmluaXNoZWRSZWYuY3VycmVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gU2kgZXMgY3JlYWNpw7NuIHNpbiBhY2Nlc2liaWxpZGFkLCBtYXJjYXIgcXVlIGxvcyBhcmNoaXZvcyB0ZXJtaW5hcm9uXG4gICAgICAgICAgICBmaWxlc0ZpbmlzaGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgICBzZXRGaWxlc1Byb2Nlc3NlZChwcmV2Q291bnQgPT4gcHJldkNvdW50ICsgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIGtub3dsZWRnZTogdXBkYXRlZEtub3dsZWRnZSxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzdWNjZXNzS25vd2xlZGdlRGVsZXRlICYmICFpc0xvYWRpbmdLbm93bGVkZ2UgJiYgIWVycm9yS25vd2xlZGdlKSB7XG4gICAgICAvLyBTb2xvIGNlcnJhciBzaSBOTyBoYXkgYXJjaGl2b3Mgc2llbmRvIHByb2Nlc2Fkb3NcbiAgICAgIGlmIChoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCB8fCBpc1Nob3dQcm9jZXNzRmlsZXMgfHwgYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBTaSBlbCBsb2FkZXIgc2UgY2VycsOzIHBvciB0aW1lb3V0LCBubyBtb3N0cmFyIHNuYWNrYmFyIGRlIMOpeGl0byBuaSBjZXJyYXJcbiAgICAgIGlmIChwcm9jZXNzRmlsZXNUaW1lZE91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudFVwZGF0ZWQnKSlcbiAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfVxuICAgIGlmIChlcnJvcktub3dsZWRnZSkge1xuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcihcbiAgICAgICAgbW9kYWxWYWx1ZXMuaXNFZGl0aW5nID8gdCgnY29uZmlybUFnZW50VXBkYXRlZFdpdGhGaWxlc0Vycm9yJykgOiB0KCdjb25maXJtQWdlbnRXaXRoRmlsZXNFcnJvcicpXG4gICAgICApXG4gICAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgIH1cbiAgfSwgW3N1Y2Nlc3NLbm93bGVkZ2VEZWxldGUsIGlzTG9hZGluZ0tub3dsZWRnZSwgZXJyb3JLbm93bGVkZ2UsIGlzU2hvd1Byb2Nlc3NGaWxlc10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50XG5cbiAgICAvLyBTaSBoYXkgYXJjaGl2b3Mgc2llbmRvIHByb2Nlc2Fkb3MsIGVzcGVyYXIgYSBxdWUgdGVybWluZW5cbiAgICBpZiAoY29udGV4dC5oYXNBY3Rpb25GaWxlcyAmJiAoaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgfHwgaXNTaG93UHJvY2Vzc0ZpbGVzKSkge1xuICAgICAgLy8gU2kgc3VjY2Vzc1VwZGF0ZUFjY2VzcyBlc3TDoSBhY3Rpdm8sIG1hcmNhciBjb21vIG1hbmVqYWRvIHBlcm8gTk8gcmVzZXRlYXIgaGFzdGEgcXVlIHRlcm1pbmVuIGxvcyBhcmNoaXZvc1xuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MgJiYgIWFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCkge1xuICAgICAgICBhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTaSB5YSBmdWUgbWFuZWphZG8geSBubyBoYXkgYXJjaGl2b3MgcGVuZGllbnRlcywgZWplY3V0YXIgZWwgY2llcnJlXG4gICAgaWYgKGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCAmJiBjb250ZXh0Lmhhc0FjdGlvbkZpbGVzICYmIGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MpIHtcbiAgICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcbiAgICAgIH1cbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgICBvcGVyYXRpb25UeXBlOiBudWxsLFxuICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc3VjY2Vzc1VwZGF0ZUFjY2Vzcykge1xuICAgICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MoKVxuXG4gICAgaWYgKGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIC8vIFNpIGhheSBhcmNoaXZvcywgZWwgYWdlbnRlIHlhIGZ1ZSBhZ3JlZ2FkbyB5IGVsIHRvZ2dsZSB5YSBzZSBoaXpvIGVuIHN1Y2Nlc3NDcmVhdGVcbiAgICAgIC8vIFNvbG8gbmVjZXNpdGFtb3MgY2VycmFyIGVsIG1vZGFsXG4gICAgICBpZiAoY29udGV4dC5oYXNBY3Rpb25GaWxlcykge1xuICAgICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBTaSBlbCBhZ2VudGUgZnVlIGNyZWFkbyBjb24gZmF2b3JpdG8sIG5lY2VzaXRhbW9zIG9yZGVuYXIgZGVzcHXDqXMgZGUgYWdyZWdhcmxvXG4gICAgICBjb25zdCBhZ2VudFRvQWRkID0gbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSA/IHsgLi4uc3VjY2Vzc0NyZWF0ZSwgaXNfZmF2b3JpdGU6IHRydWUgfSA6IHN1Y2Nlc3NDcmVhdGVcblxuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgIGFkZEFnZW50KGFnZW50VG9BZGQpXG4gICAgICBzZWxlY3RBZ2VudChhZ2VudFRvQWRkKVxuXG4gICAgICAvLyBTaSB0aWVuZSBmYXZvcml0bywgaGFjZXIgdG9nZ2xlIHkgYWN0dWFsaXphciBlc3RhZG8gYW50ZXMgZGUgY2VycmFyXG4gICAgICBpZiAobW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSkge1xuICAgICAgICAvLyBDdWFuZG8gc2UgY3JlYSB1biBhZ2VudGUgbnVldm8sIGVsIHNlcnZpZG9yIG5vIHRpZW5lIGVsIGZhdm9yaXRvIG1hcmNhZG8gYcO6blxuICAgICAgICAvLyBFbnRvbmNlcyBjdXJyZW50SXNGYXZvcml0ZSBkZWJlIHNlciBmYWxzZSBwYXJhIHF1ZSBlbCB0b2dnbGUgbG8gbWFycXVlIGNvbW8gdHJ1ZVxuICAgICAgICBjb25zdCBhZ2VudEZvclRvZ2dsZSA9IHsgLi4uYWdlbnRUb0FkZCwgaXNfZmF2b3JpdGU6IGZhbHNlIH1cbiAgICAgICAgaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudChcbiAgICAgICAgICBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgYWdlbnRGb3JUb2dnbGUsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2VycmFyIGRlc3B1w6lzIGRlIHF1ZSBlbCB0b2dnbGUgY29tcGxldGUgeSBhY3R1YWxpY2UgZWwgZXN0YWRvXG4gICAgICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRVcGRhdGVkJykpXG4gICAgICB1cGRhdGVBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgaWYgKGN1cnJlbnRTZWxlY3RlZEFnZW50Py5pZCA9PT0gc3VjY2Vzc1VwZGF0ZS5pZCkge1xuICAgICAgICBzZWxlY3RBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgfVxuICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlKClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKSlcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9XG5cbiAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSB7XG4gICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgIGhhc0FjdGlvbkZpbGVzOiBmYWxzZSxcbiAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICB9XG4gIH0sIFtzdWNjZXNzVXBkYXRlQWNjZXNzLCBmaWxlc1Byb2Nlc3NlZF0pXG5cbiAgLy8gdXNlRWZmZWN0IHBhcmEgbWFuZWphciBlbCBjaWVycmUgZGVsIG1vZGFsIGN1YW5kbyB0ZXJtaW5hbiBsb3MgYXJjaGl2b3MgZW4gY3JlYWNpw7NuIHNpbiBhY2Nlc2liaWxpZGFkXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudFxuXG4gICAgLy8gU29sbyBwcm9jZXNhciBzaTpcbiAgICAvLyAtIEVzIHVuYSBvcGVyYWNpw7NuIGRlIGNyZWFjacOzblxuICAgIC8vIC0gTm8gaGF5IGFjY2VzaWJpbGlkYWQgcGVuZGllbnRlXG4gICAgLy8gLSBMb3MgYXJjaGl2b3MgdGVybWluYXJvbiBkZSBwcm9jZXNhcnNlXG4gICAgLy8gLSBFbCBhZ2VudGUgZnVlIGNyZWFkbyBleGl0b3NhbWVudGVcbiAgICAvLyAtIEHDum4gbm8gc2UgaGEgY2VycmFkbyBlbCBtb2RhbFxuICAgIGlmIChcbiAgICAgIGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScgJiZcbiAgICAgICFjb250ZXh0Lmhhc0FjdGlvbkZpbGVzICYmXG4gICAgICBmaWxlc0ZpbmlzaGVkUmVmLmN1cnJlbnQgJiZcbiAgICAgIHN1Y2Nlc3NDcmVhdGUgJiZcbiAgICAgICFoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCAmJlxuICAgICAgIWlzU2hvd1Byb2Nlc3NGaWxlc1xuICAgICkge1xuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICBmaWxlc0ZpbmlzaGVkUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0ge1xuICAgICAgICBpc0Zyb21DcmVhdGlvbjogZmFsc2UsXG4gICAgICAgIGlzRnJvbUVkaXRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY3Rpb25GaWxlczogZmFsc2UsXG4gICAgICAgIG9wZXJhdGlvblR5cGU6IG51bGwsXG4gICAgICAgIGhhc0JlZW5DYWxsZWQ6IGZhbHNlLFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRhbWJpw6luIG1hbmVqYXIgZWwgY2FzbyBjdWFuZG8gaGF5IGFjY2VzaWJpbGlkYWQgeSBhcmNoaXZvcyB0ZXJtaW5hcm9uXG4gICAgaWYgKFxuICAgICAgY29udGV4dC5vcGVyYXRpb25UeXBlID09PSAnY3JlYXRlJyAmJlxuICAgICAgY29udGV4dC5oYXNBY3Rpb25GaWxlcyAmJlxuICAgICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50ICYmXG4gICAgICBzdWNjZXNzQ3JlYXRlICYmXG4gICAgICAhaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgJiZcbiAgICAgICFpc1Nob3dQcm9jZXNzRmlsZXNcbiAgICApIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MpIHtcbiAgICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcbiAgICAgIH1cbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgICAgaXNGcm9tQ3JlYXRpb246IGZhbHNlLFxuICAgICAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGZhbHNlLFxuICAgICAgICBvcGVyYXRpb25UeXBlOiBudWxsLFxuICAgICAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBmaWxlc1Byb2Nlc3NlZCxcbiAgICBzdWNjZXNzQ3JlYXRlLFxuICAgIHN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaXNTaG93UHJvY2Vzc0ZpbGVzLFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSxcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MsXG4gICAgaGFuZGxlQ2xvc2UsXG4gIF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNTaG93UHJvY2Vzc0ZpbGVzKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gYGtub3dsZWRnZS1iYXNlLnN0YXR1czoke2FnZW50QnlJZCA/IGFnZW50QnlJZD8uaWQgOiBzdWNjZXNzQ3JlYXRlPy5pZD8udG9TdHJpbmcoKX1gXG4gICAgICBpZiAoJF9zYykge1xuICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgJF9zYz8uc3Vic2NyaWJlSGFuZGxlcihjaGFubmVsLCB3ZWJTb2NrZXRGdW5jdGlvbilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBtb2RlbERhdGEgPSB7XG4gICAgICAgICAgICBtb2RlbF9oYXNoOiBjaGFubmVsLFxuICAgICAgICAgICAgYWN0aW9uOiAkX3NjPy5hY3Rpb25UeXBlPy5TVUJTQ1JJQkUsXG4gICAgICAgICAgfVxuICAgICAgICAgICRfc2M/LnVwZGF0ZUNvbm5lY3Rpb25Nb2RlbChtb2RlbERhdGEsIGNoYW5uZWwsIHVzZXIsIHVzZXIsICRfc2MuY2hhbm5lbFR5cGU/Lk1PREVMX0NIQU5ORUwpXG4gICAgICAgICAgc2V0SXNTdWJzY3JpYmVkKHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtpc1Nob3dQcm9jZXNzRmlsZXMsIGlzU3Vic2NyaWJlZCwgJF9zYywgYWdlbnRCeUlkLCBzdWNjZXNzQ3JlYXRlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNPcGVuIHx8ICFhZ2VudE1vZGVscy5sZW5ndGgpIHJldHVyblxuICAgIGlmIChhZ2VudExvYWRpbmcgJiYgIXByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBjb25zdCBhcHBseUVkaXRpbmdBZ2VudCA9IGFzeW5jIChzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZS50eXBlICE9PSAnY3VzdG9tJyB8fCAhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdlcnJvckFjY2Vzc0RlbmllZCcpKVxuICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgfSwgMzAwMClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBjb25zdCBhZ2VudElkID0gc291cmNlLmlkICE9IG51bGwgPyBTdHJpbmcoc291cmNlLmlkKSA6IG51bGxcbiAgICAgIGlmIChhZ2VudElkICYmIGh5ZHJhdGluZ0FnZW50SWRSZWYuY3VycmVudCA9PT0gYWdlbnRJZCkgcmV0dXJuIHRydWVcbiAgICAgIGh5ZHJhdGluZ0FnZW50SWRSZWYuY3VycmVudCA9IGFnZW50SWRcblxuICAgICAgbGV0IGFnZW50VmFsdWVzVG9TZXQgPSBidWlsZEVkaXRpbmdNb2RhbFZhbHVlc0Zyb21BZ2VudERldGFpbChzb3VyY2UsIGFnZW50TW9kZWxzLCBtb2RhbFZhbHVlcylcbiAgICAgIC8vIEtlZXAgdGhlIGxvYWRpbmcgdmlldyB1bnRpbCBib3RoIHRoZSBhZ2VudCBhbmQgaXRzIGNvbm5lY3RvciBzdGF0dXMgYXJlIHJlYWR5LlxuICAgICAgaWYgKGFnZW50SWQgJiYgaGFzTWFpYUV4dGVybmFsQ29ubmVjdG9yc0FjY2VzcygpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29ubmVjdG9ycyA9IGF3YWl0IGdldEFnZW50Q29ubmVjdG9ycyhhZ2VudElkKVxuICAgICAgICAgIGFnZW50VmFsdWVzVG9TZXQgPSB7XG4gICAgICAgICAgICAuLi5hZ2VudFZhbHVlc1RvU2V0LFxuICAgICAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgICAuLi5hZ2VudFZhbHVlc1RvU2V0LmFjY2Vzc2liaWxpdHksXG4gICAgICAgICAgICAgIHNlbGVjdGVkQ29ubmVjdG9yczogZGVyaXZlQXNzaWduZWRDb25uZWN0b3JTbHVncyhjb25uZWN0b3JzKSxcbiAgICAgICAgICAgICAgY29ubmVjdG9yU3RhdHVzZXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICBjb25uZWN0b3JzLm1hcChjb25uZWN0b3IgPT4gW1xuICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLnNsdWcsXG4gICAgICAgICAgICAgICAgICBjb25uZWN0b3IuY29ubmVjdGlvbl9zdGF0dXMgfHwgKGNvbm5lY3Rvci51c2VyX2F1dGhvcml6ZWQgPyAnb2snIDogJ25lZWRzX2F0dGVudGlvbicpLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBhZ2VudCBjb25uZWN0b3JzOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaHlkcmF0aW5nQWdlbnRJZFJlZi5jdXJyZW50ICE9PSBhZ2VudElkKSByZXR1cm4gZmFsc2VcbiAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50ID0gYWdlbnRWYWx1ZXNUb1NldFxuICAgICAgc2V0TW9kYWxWYWx1ZXMoYWdlbnRWYWx1ZXNUb1NldClcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgIGlmIChwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCkge1xuICAgICAgICBzZXRTZWN0aW9uKHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50KVxuICAgICAgICBwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmV0Y2hlZCA9IHByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudFxuICAgIGlmIChwcmVmZXRjaGVkKSB7XG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhcHBseUVkaXRpbmdBZ2VudChwcmVmZXRjaGVkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGFnZW50QnlJZCAmJiAhYWdlbnRMb2FkaW5nICYmIGFnZW50TW9kZWxzLmxlbmd0aCkge1xuICAgICAgYXBwbHlFZGl0aW5nQWdlbnQoYWdlbnRCeUlkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFpc0xvYWRpbmcgJiYgIWFnZW50TG9hZGluZyAmJiAhYWdlbnRCeUlkICYmICFtb2RhbFZhbHVlcy5pc0VkaXRpbmcpIHtcbiAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZ2VuZXJhbDoge1xuICAgICAgICAgIC4uLnByZXYuZ2VuZXJhbCxcbiAgICAgICAgICBhaU1vZGVsOiBhZ2VudE1vZGVsc1swXSxcbiAgICAgICAgfSxcbiAgICAgIH0pKVxuICAgIH1cbiAgfSwgW2FnZW50QnlJZCwgaXNPcGVuLCBpc0xvYWRpbmcsIGFnZW50TG9hZGluZywgYWdlbnRNb2RlbHM/Lmxlbmd0aCwgbW9kYWxWYWx1ZXMuaXNFZGl0aW5nLCB0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlcnJvckdldEFnZW50QnlJZCkge1xuICAgICAgaWYgKGVycm9yR2V0QWdlbnRCeUlkID09PSBcIkFjY2VzcyBkZW5pZWQ6IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoaXMgYWdlbnRcIikge1xuICAgICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQoJ2Vycm9yQWNjZXNzRGVuaWVkJykpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgfSwgMzAwMClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKGVycm9yR2V0QWdlbnRCeUlkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIH0sIDMwMDApXG4gICAgfVxuICB9LCBbZXJyb3JHZXRBZ2VudEJ5SWRdKVxuXG4gIGNvbnN0IHNob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghbW9kYWxWYWx1ZXM/LmFjY2Vzc2liaWxpdHk/LmNsaWVudHMgfHwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5jbGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmNsaWVudHMuc29tZShjbGllbnQgPT4gY2xpZW50LmlzX2FjdGl2ZSA9PT0gZmFsc2UgfHwgY2xpZW50LmlzX2RlbGV0ZWQgPT09IHRydWUpXG4gIH0sIFttb2RhbFZhbHVlcz8uYWNjZXNzaWJpbGl0eT8uY2xpZW50c10pXG5cbiAgY29uc3QgaGFuZGxlVG9nZ2xlRmF2b3JpdGUgPSAoKSA9PiB7XG4gICAgaWYgKG1vZGFsVmFsdWVzPy5nZW5lcmFsPy5pZCkge1xuICAgICAgLy8gRXhpc3RpbmcgYWdlbnRcbiAgICAgIHRvZ2dsZUZhdm9yaXRlKFxuICAgICAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLFxuICAgICAgICB1cGRhdGVkQWdlbnQgPT4ge1xuICAgICAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgICAgIC4uLnByZXYuZ2VuZXJhbCxcbiAgICAgICAgICAgICAgaXNfZmF2b3JpdGU6IHVwZGF0ZWRBZ2VudC5pc19mYXZvcml0ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLy8gQWN0dWFsaXphciBlbCBlc3RhZG8gZGUgYWdlbnRlcyB5IG9yZGVuYXIgY3VhbmRvIHNlIGhhY2UgZGVzZGUgZWwgbW9kYWwgQUJNXG4gICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZSh1cGRhdGVkQWdlbnQsIHRydWUpXG4gICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7XG4gICAgICAgICAgICBvcHRpb246IHVwZGF0ZWRBZ2VudC5pc19mYXZvcml0ZSA/ICdhZGQnIDogJ3JlbW92ZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBtb2RhbFZhbHVlcz8uZ2VuZXJhbD8uaXNfZmF2b3JpdGVcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBhZ2VudFxuICAgICAgc2V0TW9kYWxWYWx1ZXMocHJldiA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgLi4ucHJldi5nZW5lcmFsLFxuICAgICAgICAgIGlzX2Zhdm9yaXRlOiAhcHJldi5nZW5lcmFsLmlzX2Zhdm9yaXRlLFxuICAgICAgICB9LFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc09wZW4gfHwgKCF1c2VyUGVybWlzc2lvbnM/LmNyZWF0ZSAmJiAhdXNlclBlcm1pc3Npb25zPy5lZGl0ICYmICF1c2VyUGVybWlzc2lvbnM/LmRlbGV0ZSkpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGNyZWF0ZVBvcnRhbChcbiAgICA8QmFja2Ryb3AgekluZGV4PXthYm1BZ2VudE1vZGFsWkluZGV4fSBvbkNsaWNrPXtoYW5kbGVCYWNrZHJvcENsaWNrfT5cbiAgICAgIDxTQ0FBTVdyYXBwZXIgcmVmPXttb2RhbFJlZn0gdGFiSW5kZXg9ey0xfT5cbiAgICAgICAge2lzTG9hZGluZyA/IChcbiAgICAgICAgICA8U0NBQU1XcmFwcGVyU3Bpbm5lcj5cbiAgICAgICAgICAgIDxTQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudD5cbiAgICAgICAgICAgICAgPFNwaW5uZXJMb3R0aWUgc2l6ZT1cIjgwcHhcIiBjb2xvcj1cInByaW1hcnlcIiAvPlxuICAgICAgICAgICAgPC9TQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudD5cbiAgICAgICAgICA8L1NDQUFNV3JhcHBlclNwaW5uZXI+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIHtpc1Nob3dQcm9jZXNzRmlsZXMgJiYgaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQgPyAoXG4gICAgICAgICAgICAgIDxBYm1Mb2FkZXJGaWxlc1xuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzPXttb2RhbFZhbHVlcy5rbm93bGVkZ2V9XG4gICAgICAgICAgICAgICAgbGFiZWw9e3QoYHByb2Nlc3NpbmdLbm93bGVkZ2UuJHttb2RhbFZhbHVlcy5pc0VkaXRpbmcgPyAnZGVzY3JpcHRpb25VcGRhdGUnIDogJ2Rlc2NyaXB0aW9uQ3JlYXRlJ31gKX1cbiAgICAgICAgICAgICAgICBvblRpbWVvdXQ9e2hhbmRsZVByb2Nlc3NGaWxlc1RpbWVvdXR9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlckxlZnQ+XG4gICAgICAgICAgICAgICAgICAgIDxUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgekluZGV4PXt0b29sdGlwWkluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsVmFsdWVzPy5nZW5lcmFsPy5pc19mYXZvcml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHQoJ2dlbmVyYWxTZWN0aW9uLnJlbW92ZUZhdm9yaXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0KCdnZW5lcmFsU2VjdGlvbi5hZGRGYXZvcml0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDQUFNSGVhZGVyRmF2b3JpdGUgb25DbGljaz17aGFuZGxlVG9nZ2xlRmF2b3JpdGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezIwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezIwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17bW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlID8gJyNGRkM2MjQnIDogJyNhNmE2YTYnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPXttb2RhbFZhbHVlcz8uZ2VuZXJhbD8uaXNfZmF2b3JpdGUgPyAnI0ZGQzYyNCcgOiAnbm9uZSd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzb2xpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17bW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlID8gJycgOiAnc3Rhci1mYXZvcml0ZS1pY29uJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTUhlYWRlckZhdm9yaXRlPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlclRpdGxlPnttb2RhbFZhbHVlcz8uaXNFZGl0aW5nID8gdCgnZWRpdEFnZW50JykgOiB0KCduZXdBZ2VudCcpfTwvU0NBQU1IZWFkZXJUaXRsZT5cbiAgICAgICAgICAgICAgICAgIDwvU0NBQU1IZWFkZXJMZWZ0PlxuICAgICAgICAgICAgICAgICAgPFNDQUFNSGVhZGVyQ2xvc2VCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5jYW5jZWxNb2RhbClcbiAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmcgfHwgaXNMb2FkaW5nS25vd2xlZGdlIHx8IGlzTG9hZGluZ0NyZWF0ZSB8fCBpc0xvYWRpbmdVcGRhdGVBY2Nlc3N9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxDcm9zcyBjb2xvcj1cIiNhNmE2YTZcIiB3aWR0aD17MjB9IGhlaWdodD17MjB9IC8+XG4gICAgICAgICAgICAgICAgICA8L1NDQUFNSGVhZGVyQ2xvc2VCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TQ0FBTUhlYWRlcj5cbiAgICAgICAgICAgICAgICA8U0NBQU1Db250ZW50IGhhc1Njcm9sbD17c2VjdGlvbiAhPT0gJ2tub3dsZWRnZSd9PlxuICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhcj5cbiAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17c2VjdGlvbiA9PT0gJ2dlbmVyYWwnfVxuICAgICAgICAgICAgICAgICAgICAgICRpbmRleD17MH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVTZWN0aW9uQ2hhbmdlKCdnZW5lcmFsJyl9XG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhYm0tYWdlbnQtbW9kYWwtZ2VuZXJhbFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtgJHtzZWN0aW9uID09PSAnZ2VuZXJhbCcgPyAncmdiYSg2MywgNjMsIDYzLCAxKScgOiAncmdiYSgxNjYsIDE2NiwgMTY2LCAxKSd9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTh9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVRpdGxlIGlzQWN0aXZlPXtzZWN0aW9uID09PSAnZ2VuZXJhbCd9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3QoJ2dlbmVyYWxTZWN0aW9uLnRpdGxlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNpZGViYXJJdGVtVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbT5cblxuICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlPXtzZWN0aW9uID09PSAna25vd2xlZGdlJ31cbiAgICAgICAgICAgICAgICAgICAgICAkaW5kZXg9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2VjdGlvbkNoYW5nZSgna25vd2xlZGdlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhYm0tYWdlbnQtbW9kYWwta25vd2xlZGdlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxCcmFpbkljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtgJHtzZWN0aW9uID09PSAna25vd2xlZGdlJyA/ICdyZ2JhKDYzLCA2MywgNjMsIDEpJyA6ICdyZ2JhKDE2NiwgMTY2LCAxNjYsIDEpJ31gfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE4fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXJJdGVtVGl0bGUgaXNBY3RpdmU9e3NlY3Rpb24gPT09ICdrbm93bGVkZ2UnfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KCdrbm93bGVkZ2VTZWN0aW9uLnRpdGxlJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNpZGViYXJJdGVtVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbT5cblxuICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVxuICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlPXtzZWN0aW9uID09PSAnYWNjZXNzaWJpbGl0eSd9XG4gICAgICAgICAgICAgICAgICAgICAgJGluZGV4PXsyfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlY3Rpb25DaGFuZ2UoJ2FjY2Vzc2liaWxpdHknKX1cbiAgICAgICAgICAgICAgICAgICAgICBpZD1cImFibS1hZ2VudC1tb2RhbC1hY2Nlc3NpYmlsaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmlsaXR5SWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9e2Ake3NlY3Rpb24gPT09ICdhY2Nlc3NpYmlsaXR5JyA/ICdyZ2JhKDYzLCA2MywgNjMsIDEpJyA6ICdyZ2JhKDE2NiwgMTY2LCAxNjYsIDEpJ31gfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezE4fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXJJdGVtVGl0bGUgaXNBY3RpdmU9e3NlY3Rpb24gPT09ICdhY2Nlc3NpYmlsaXR5J30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dCgnYWNjZXNzaWJpbGl0eVNlY3Rpb24udGl0bGVUYWInKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhckl0ZW1UaXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICB7c2hvdWxkRGlzYWJsZVNhdmVGb3JDbGllbnRzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwIHRpdGxlPXt0KCdhY2Nlc3NpYmlsaXR5U2VjdGlvbi5jbGllbnRzRXJyb3InKX0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1FcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWxlcnQgY29sb3I9XCIjQzcwNTA1XCIgd2lkdGg9XCIxNnB4XCIgaGVpZ2h0PVwiMTZweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbUVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbT5cbiAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFyPlxuICAgICAgICAgICAgICAgICAge1NlY3Rpb25CeUtleVtzZWN0aW9uXSh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogbW9kYWxWYWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVNldEFnZW50VmFsdWVzOiBoYW5kbGVTZXRBZ2VudFZhbHVlc0J5S2V5cyxcbiAgICAgICAgICAgICAgICAgICAgYWdlbnRNb2RlbHMsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0tub3dsZWRnZTogW10sXG4gICAgICAgICAgICAgICAgICAgIG5ld0tub3dsZWRnZTogW10sXG4gICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlRXhpc3RpbmdLbm93bGVkZ2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgICAgICAgICBvblJlbW92ZU5ld0tub3dsZWRnZTogKCkgPT4ge30sXG4gICAgICAgICAgICAgICAgICAgIG9uRmlsZUVycm9yQ2hhbmdlOiBzZXRIYXNGaWxlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwWkluZGV4LFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC9TQ0FBTUNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPFNDQUFNRm9vdGVyIGlzRWRpdGluZz17ISFtb2RhbFZhbHVlcz8uaXNFZGl0aW5nICYmICEhdXNlclBlcm1pc3Npb25zPy5kZWxldGV9PlxuICAgICAgICAgICAgICAgICAgeyEhbW9kYWxWYWx1ZXM/LmlzRWRpdGluZyAmJlxuICAgICAgICAgICAgICAgICAgICAhIXVzZXJQZXJtaXNzaW9ucz8uZGVsZXRlICYmXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8U0NBQU1EZWxldGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q1VCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbldpdGhJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TW9kYWxEZWxldGUodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzTG9hZGluZyB8fCBpc0xvYWRpbmdLbm93bGVkZ2UgfHwgaXNMb2FkaW5nQ3JlYXRlIHx8IGlzTG9hZGluZ1VwZGF0ZUFjY2Vzc31cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFdyYXBwZXJDZW50ZXJJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUcmFzaCBjb2xvcj1cIiMwOGNcIiB3aWR0aD17MTh9IGhlaWdodD17MTh9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3QoJ2RlbGV0ZUFnZW50Jyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvV3JhcHBlckNlbnRlckljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0NVQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NBQU1EZWxldGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgZ2FwOiAnMjRweCcgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNhdmVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICF2YWxpZGF0ZUZpZWxkVmFsdWVzKG1vZGFsVmFsdWVzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVBZ2VudFZhbHVlc0lzU2FtZSgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0tub3dsZWRnZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nQ3JlYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdVcGRhdGVBY2Nlc3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRmlsZUVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxDVUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29uZmlybUFjdGlvbihudWxsLCAnY3JlYXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICF2YWxpZGF0ZUZpZWxkVmFsdWVzKG1vZGFsVmFsdWVzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUFnZW50VmFsdWVzSXNTYW1lKCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0tub3dsZWRnZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdDcmVhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nVXBkYXRlQWNjZXNzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNGaWxlRXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge21vZGFsVmFsdWVzLmlzRWRpdGluZyA/IHQoJ3NhdmVDaGFuZ2VzJykgOiB0KCdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9DVUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNhdmVCdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1NDQUFNRm9vdGVyPlxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L1NDQUFNV3JhcHBlcj5cbiAgICAgIHtzaG93TW9kYWxEZWxldGUgJiYgKFxuICAgICAgICA8RGVsZXRlUXVlc3Rpb25Nb2RhbFxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dNb2RhbERlbGV0ZShmYWxzZSl9XG4gICAgICAgICAgaGFuZGxlcnM9e3tcbiAgICAgICAgICAgIGhhbmRsZUNvbmZpcm1BY3Rpb246IChwcm9wczogYW55KSA9PiBoYW5kbGVDb25maXJtQWN0aW9uKHByb3BzLCAnZGVsZXRlJyksXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjaGF0PXt7IHRpdGxlOiBtb2RhbFZhbHVlcy5nZW5lcmFsLm5hbWUsIGlkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkIH19XG4gICAgICAgICAgYWN0aW9uPVwiYWdlbnRcIlxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L0JhY2tkcm9wPixcbiAgICBzZWxlY3RvclxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsV0FBVyxRQUFRLE9BQU87QUFDekUsU0FBU0MsWUFBWSxRQUFRLFdBQVc7QUFDeEMsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFFOUMsU0FBU0MsUUFBUSxRQUFRLDRDQUE0QztBQUNyRSxTQUFTQyxRQUFRLFFBQVEsMkNBQTJDO0FBQ3BFLFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsS0FBSyxRQUFRLHdDQUF3QztBQUM5RCxTQUFTQyxJQUFJLFFBQVEsdUNBQXVDO0FBQzVELFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsYUFBYSxRQUFRLHVEQUF1RDtBQUNyRixTQUFTQyxPQUFPLFFBQVEsOENBQThDO0FBQ3RFLFNBQVNDLHVCQUF1QixRQUFRLDRFQUE0RTtBQUNwSCxTQUFTQyxRQUFRLFFBQVEsc0JBQXNCO0FBQy9DLFNBQVNDLE9BQU8sUUFBUSwyQkFBMkI7QUFDbkQsU0FBU0MsaUJBQWlCLEVBQUVDLFNBQVMsUUFBUSxtQkFBbUI7QUFDaEUsU0FBU0MsYUFBYSxRQUFRLDRDQUE0QztBQUUxRSxTQUFTQyxlQUFlLFFBQVEsNENBQTRDO0FBRTVFLFNBQVNDLGlCQUFpQixFQUFFQyxtQkFBbUIsUUFBUSw0QkFBNEI7QUFFbkYsU0FDRUMsWUFBWSxFQUNaQyxXQUFXLEVBQ1hD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
1160
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJ1c2VDYWxsYmFjayIsImNyZWF0ZVBvcnRhbCIsInVzZVRyYW5zbGF0aW9uIiwiQ1VCdXR0b24iLCJDYXRlZ29yeSIsIkFsZXJ0IiwiVHJhc2giLCJTdGFyIiwiQ3Jvc3MiLCJTcGlubmVyTG90dGllIiwiVG9vbHRpcCIsIkFibUFjY2Vzc2liaWxpdHlTZWN0aW9uIiwiQmFja2Ryb3AiLCJ1c2VVc2VyIiwiQWNjZXNzaWJpbGl0eUljb24iLCJCcmFpbkljb24iLCJ1c2VBZ2VudE1vZGVsIiwidXNlR2V0QWdlbnRCeUlkIiwiQWJtR2VuZXJhbFNlY3Rpb24iLCJBYm1Lbm93bGVkZ2VTZWN0aW9uIiwiU0NBQU1Db250ZW50IiwiU0NBQU1Gb290ZXIiLCJTQ0FBTUhlYWRlciIsIlNDQUFNSGVhZGVyVGl0bGUiLCJTQ0FBTUhlYWRlckxlZnQiLCJTQ0FBTUhlYWRlckZhdm9yaXRlIiwiU0NBQU1IZWFkZXJDbG9zZUJ1dHRvbiIsIlNDQUFNU2lkZWJhciIsIlNDQUFNV3JhcHBlciIsIlNDQUFNU2lkZWJhckl0ZW0iLCJTQ0FBTVNpZGViYXJJdGVtVGl0bGUiLCJTQ0FBTURlbGV0ZUJ1dHRvbiIsIlNDQUFNU2F2ZUJ1dHRvbiIsIlNDQUFNV3JhcHBlclNwaW5uZXIiLCJTQ0FBTVdyYXBwZXJTcGlubmVyQ29udGVudCIsIlNDQUFNU2lkZWJhckl0ZW1FcnJvciIsInVzZUNyZWF0ZUFnZW50IiwidXNlRGVsZXRlQWdlbnQiLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJ1c2VHbG9iYWxDb250ZXh0IiwidXNlVXBkYXRlQWdlbnQiLCJ1c2VLbm93bGVkZ2VPcGVyYXRpb25zIiwiQWJtTG9hZGVyRmlsZXMiLCJXcmFwcGVyQ2VudGVySWNvbiIsIkVWRU5UUyIsInVzZUV2ZW50IiwiRGVsZXRlUXVlc3Rpb25Nb2RhbCIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJ1c2VBY2Nlc3NDbGllbnQiLCJ1c2VUb2dnbGVGYXZvcml0ZSIsImJ1aWxkQWdlbnRUb29sR3JvdXBzUmVxdWVzdCIsIkRFRkFVTFRfQ09SX0FDQ0VTUyIsImRlcml2ZUFzc2lnbmVkQ29ubmVjdG9yU2x1Z3MiLCJhcHBseUtub3dsZWRnZUZpbGVTdGF0dXNVcGRhdGUiLCJidWlsZEVkaXRpbmdNb2RhbFZhbHVlc0Zyb21BZ2VudERldGFpbCIsImNyZWF0ZUluaXRpYWxBYm1Nb2RhbFZhbHVlcyIsImhhc0FibVBlbmRpbmdDaGFuZ2VzIiwiaGFzQWNjZXNzaWJpbGl0eVNlY3Rpb25DaGFuZ2VkIiwiaGFzSW5hY3RpdmVBY2Nlc3NpYmlsaXR5Q2xpZW50cyIsImlzQWJtU2F2ZURpc2FibGVkIiwiaXNTYW1lQWdlbnRNb2RhbFNuYXBzaG90IiwicmVzb2x2ZUtub3dsZWRnZVVwbG9hZE91dGNvbWUiLCJzaG91bGRDb25maXJtQWJtQ2xvc2UiLCJjYW5SZW5kZXJBYm1BZ2VudE1vZGFsIiwiaXNBYm1BY2Nlc3NEZW5pZWRFcnJvciIsInJlc29sdmVBYm1Qcm9jZXNzaW5nS25vd2xlZGdlTGFiZWxLZXkiLCJyZXNvbHZlUGVuZGluZ0FibUluaXRpYWxTZWN0aW9uIiwibWVyZ2VBYm1PcGVuQWdlbnRWYWx1ZXMiLCJzaG91bGRDbG9zZUFibU9uQmFja2Ryb3BDbGljayIsInJlc29sdmVBYm1DcmVhdGVBY2Nlc3NVcGRhdGVDb250ZXh0Iiwic2hvdWxkU3luY0FibUNsaWVudEFjY2Vzc09uQ3JlYXRlIiwicmVzb2x2ZUFibUNyZWF0ZVN1Y2Nlc3NQbGFuIiwic2hvdWxkU2hvd1Byb2Nlc3NGaWxlc0ZvckNyZWF0ZVBsYW4iLCJyZXNvbHZlQWJtVXBkYXRlU3VjY2Vzc1BsYW4iLCJyZXNvbHZlQWJtVXBkYXRlQWNjZXNzVXBkYXRlQ29udGV4dCIsInJlc29sdmVBYm1VcGRhdGVBY2Nlc3NPbmx5Q29udGV4dCIsInJlc29sdmVBYm1DcmVhdGVBY2Nlc3NPbmx5RGVjaXNpb24iLCJjcmVhdGVSZXNldEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQiLCJzaG91bGRGaW5hbGl6ZUFibVVwZGF0ZVdpdGhvdXRQZW5kaW5nV29yayIsInJlc29sdmVLbm93bGVkZ2VXc0NvbXBsZXRpb25FZmZlY3RzIiwicmVzb2x2ZUFibUtub3dsZWRnZUVycm9yTWVzc2FnZUtleSIsInNob3VsZEJsb2NrS25vd2xlZGdlRGVsZXRlU3VjY2Vzc0Nsb3NlIiwic2hvdWxkRGVmZXJBY2Nlc3NVcGRhdGVVbnRpbEZpbGVzQ29tcGxldGUiLCJzaG91bGRDbG9zZUNyZWF0ZUFmdGVyS25vd2xlZGdlV2l0aG91dEFjY2VzcyIsInNob3VsZENsb3NlQ3JlYXRlQWZ0ZXJLbm93bGVkZ2VXaXRoQWNjZXNzIiwic2hvdWxkQXBwbHlQZW5kaW5nU2VjdGlvbkFmdGVyT3BlbiIsInJlc29sdmVBYm1PcGVuTW9kYWxMb2FkQWN0aW9uIiwiY2FuQXBwbHlBYm1FZGl0aW5nQWdlbnREZXRhaWwiLCJzaG91bGRTZXREZWZhdWx0QWlNb2RlbEZvck5ld0FnZW50Iiwic2hvdWxkU2tpcEFibUNvbmZpcm1XaXRob3V0TXVsdGlBZ2VudHMiLCJyZXNvbHZlQWJtRHJhZnRGYXZvcml0ZVZhbHVlIiwicmVzb2x2ZUFibUNyZWF0ZUZhdm9yaXRlQWdlbnRzIiwiYXBwbHlBYm1Lbm93bGVkZ2VGaWxlQWN0aW9ucyIsIm1lcmdlQWJtQWdlbnRWYWx1ZXNCeUtleSIsInNob3VsZFJ1bkFibUNyZWF0ZVN1Y2Nlc3NIYW5kbGVyIiwicmVzb2x2ZUFibUNyZWF0ZUtub3dsZWRnZUhhbmRsZXIiLCJzaG91bGRSZXBlYXREZWxldGVLbm93bGVkZ2VzT25DcmVhdGUiLCJzaG91bGRFbnF1ZXVlQWJtQ3JlYXRlRmF2b3JpdGVUb2dnbGUiLCJzaG91bGRIYW5kbGVBYm1DcmVhdGVBY2Nlc3NPbmx5Q2xpZW50Iiwic2hvdWxkUHJvY2Vzc0tub3dsZWRnZVdzU3RhdHVzIiwicmVzb2x2ZUFibUtub3dsZWRnZVdzQ2hhbm5lbCIsInJlc29sdmVBYm1GYXZvcml0ZVRvb2x0aXBLZXkiLCJzaG91bGRTZWxlY3RBZ2VudEFmdGVyRGVsZXRlIiwic2hvdWxkUnVuQWJtUHJvY2Vzc0ZpbGVzVGltZW91dCIsInJlc29sdmVBYm1Qcm9jZXNzRmlsZXNUaW1lb3V0U3VjY2Vzc0tleSIsInNob3VsZFN5bmNTZWxlY3RlZEFnZW50QWZ0ZXJNdXRhdGlvbiIsInNob3VsZEluY2x1ZGVBY2Nlc3NpYmlsaXR5VXBkYXRlSW5Lbm93bGVkZ2VCYXRjaCIsInNob3VsZFJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2Vzc09uQ3JlYXRlQ2xvc2UiLCJzaG91bGRIeWRyYXRlQWdlbnRDb25uZWN0b3JzT25FZGl0Iiwic2hvdWxkU2hvd0FibUxvYWRlckZpbGVzIiwicmVzb2x2ZUFibU1vZGFsVGl0bGVLZXkiLCJzaG91bGREaXNhYmxlQWJtSGVhZGVyQ2xvc2UiLCJyZXNvbHZlQWJtU2F2ZUFjdGlvbiIsInJlc29sdmVQcm9jZXNzRmlsZXNUaW1lb3V0RmxhZ0JlZm9yZVNhdmUiLCJnZXRBZ2VudENvbm5lY3RvcnMiLCJoYXNNYWlhRXh0ZXJuYWxDb25uZWN0b3JzQWNjZXNzIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwiaW5pdGlhbFZhbHVlcyIsIk9iamVjdCIsImZyZWV6ZSIsIlNlY3Rpb25CeUtleSIsImdlbmVyYWwiLCJwcm9wcyIsIl9vYmplY3RTcHJlYWQiLCJrbm93bGVkZ2UiLCJhY2Nlc3NpYmlsaXR5IiwiQWJtQWdlbnRNb2RhbCIsIl9yZWYiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl9tb2RhbFZhbHVlcyRhY2Nlc3NpYjMiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDMiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDQiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDUiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDYiLCJhZGRBZ2VudCIsInVwZGF0ZUFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInVzZXIiLCJldmVudEFtcGxpdHVkZSIsIl91c2VUcmFuc2xhdGlvbiIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImN1cnJlbnRTZWxlY3RlZEFnZW50IiwiYWdlbnQiLCJzZWxlY3RBZ2VudCIsImFibUFnZW50TW9kYWxaSW5kZXgiLCJ0b29sdGlwWkluZGV4IiwiX3VzZVRvZ2dsZUZhdm9yaXRlIiwidG9nZ2xlRmF2b3JpdGUiLCJzZWxlY3RvciIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJpc1N1YnNjcmliZWQiLCJzZXRJc1N1YnNjcmliZWQiLCJtb2RhbFJlZiIsImhhc1BlbmRpbmdGaWxlc1JlZiIsImFjdGlvbnNUb0ZpbGVzIiwidG9EZWxldGUiLCJ0b1VwbG9hZCIsImFjY2Vzc1VwZGF0ZUNvbnRleHQiLCJpc0Zyb21DcmVhdGlvbiIsImlzRnJvbUVkaXRpbmciLCJoYXNBY3Rpb25GaWxlcyIsIm9wZXJhdGlvblR5cGUiLCJoYXNCZWVuQ2FsbGVkIiwiYWNjZXNzSGFuZGxlZFJlZiIsImFnZW50Q3JlYXRlZFJlZiIsInBlbmRpbmdJbml0aWFsU2VjdGlvblJlZiIsInByZWZldGNoZWRBZ2VudEJ5SWRSZWYiLCJoeWRyYXRpbmdBZ2VudElkUmVmIiwiZmlsZXNGaW5pc2hlZFJlZiIsInByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJmaWxlc1Byb2Nlc3NlZCIsInNldEZpbGVzUHJvY2Vzc2VkIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpc09wZW4iLCJzZXRJc09wZW4iLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNob3dNb2RhbERlbGV0ZSIsInNldFNob3dNb2RhbERlbGV0ZSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VjdGlvbiIsInNldFNlY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJpc0xvYWRpbmciLCJzZXRJc0xvYWRpbmciLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwibW9kYWxWYWx1ZXMiLCJzZXRNb2RhbFZhbHVlcyIsIl91c2VHZXRBZ2VudEJ5SWQiLCJhZ2VudExvYWRpbmciLCJsb2FkaW5nIiwiaGFuZGxlR2V0QWdlbnRCeUlkIiwiYWdlbnRCeUlkIiwiaGFuZGxlQ2xlYW5BZ2VudCIsImVycm9yR2V0QWdlbnRCeUlkIiwiZXJyb3IiLCJfdXNlQWdlbnRNb2RlbCIsImFnZW50TW9kZWxzIiwiZ2V0QWxsQWdlbnRNb2RlbHMiLCJmaXJzdFZhbHVlQWdlbnQiLCJfdXNlU3RhdGUxMyIsIl91c2VTdGF0ZTE0IiwiaXNTaG93UHJvY2Vzc0ZpbGVzIiwic2V0SXNTaG93UHJvY2Vzc0ZpbGVzIiwiX3VzZVN0YXRlMTUiLCJfdXNlU3RhdGUxNiIsImhhc0ZpbGVFcnJvcnMiLCJzZXRIYXNGaWxlRXJyb3JzIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJfdXNlRGVsZXRlQWdlbnQiLCJoYW5kbGVEZWxldGVBZ2VudCIsInN1Y2Nlc3NEZWxldGUiLCJzdWNjZXNzIiwicmVzZXRTdWNjZXNzIiwiX3VzZVVwZGF0ZUFnZW50IiwiaGFuZGxlVXBkYXRlQWdlbnQiLCJzdWNjZXNzVXBkYXRlIiwicmVzZXRTdWNjZXNzVXBkYXRlIiwiX3VzZUNyZWF0ZUFnZW50IiwiaGFuZGxlQ3JlYXRlQWdlbnQiLCJpc0xvYWRpbmdDcmVhdGUiLCJzdWNjZXNzQ3JlYXRlIiwicmVzZXRTdWNjZXNzQ3JlYXRlIiwiX3VzZVNuYWNrQmFyTWFuYWdlciIsImhhbmRsZVNuYWNrYmFyU3VjY2VzcyIsImhhbmRsZVNuYWNrYmFyRXJyb3IiLCJfdXNlS25vd2xlZGdlT3BlcmF0aW8iLCJoYW5kbGVDcmVhdGVLbm93bGVkZ2VzIiwiaGFuZGxlRGVsZXRlS25vd2xlZGdlcyIsImhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMiLCJpc0xvYWRpbmdLbm93bGVkZ2UiLCJlcnJvcktub3dsZWRnZSIsInN1Y2Nlc3NLbm93bGVkZ2VEZWxldGUiLCJoYW5kbGVSZXNldFN1Y2Nlc3NTYXZlIiwiaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlIiwiX3VzZUFjY2Vzc0NsaWVudCIsImhhbmRsZUFjY2Vzc0NsaWVudCIsInN1Y2Nlc3NVcGRhdGVBY2Nlc3MiLCJpc0xvYWRpbmdVcGRhdGVBY2Nlc3MiLCJyZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MiLCJoYW5kbGVSZXNldFN1Y2Nlc3MiLCJjcmVhdGlvbkRyYWZ0RGVmYXVsdHMiLCJfYWdlbnRNb2RlbHMkMCRpZCIsIl9hZ2VudE1vZGVscyQiLCJkZWZhdWx0SW5wdXRQbGFjZWhvbGRlciIsImRlZmF1bHRVc2VyUHJvbXB0UGxhY2Vob2xkZXIiLCJkZWZhdWx0QWlNb2RlbElkIiwiaWQiLCJoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCIsIl9maXJzdFZhbHVlQWdlbnQkY3VyciIsImN1cnJlbnQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInZhbGlkYXRlQWdlbnRWYWx1ZXNJc1NhbWUiLCJCb29sZWFuIiwiaGFuZGxlVG9nZ2xlRmF2b3JpdGVGb3JBZ2VudCIsImFnZW50SWQiLCJvblN1Y2Nlc3MiLCJvbkVycm9yIiwidXBkYXRlZEFnZW50IiwiaXNfZmF2b3JpdGUiLCJoYW5kbGVDbG9zZSIsImNyZWF0ZSIsInVwZGF0ZSIsImNvbmZpcm1NZXNzYWdlIiwiaXNFZGl0aW5nIiwid2luZG93IiwiY29uZmlybSIsImhhbmRsZUJhY2tkcm9wQ2xpY2siLCJldmVudCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJoYW5kbGVTZWN0aW9uQ2hhbmdlIiwibmV3U2VjdGlvbiIsInRhYlNlY3Rpb24iLCJvcHRpb24iLCJoYW5kbGVTZXRBZ2VudFZhbHVlc0J5S2V5cyIsIl9yZWYyIiwia2V5IiwidmFsdWUiLCJkZWxldGVLbm93bGVkZ2UiLCJuZXh0QWN0aW9ucyIsInByZXYiLCJoYW5kbGVDb25maXJtQWN0aW9uIiwiX3JlZjMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImNoYXQiLCJhY3Rpb24iLCJfbW9kYWxWYWx1ZXMkYWNjZXNzaWIiLCJjb3JBY2Nlc3MiLCJzYXZlQWN0aW9uIiwid3JhcCIsIl9jb250ZXh0IiwibmV4dCIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJhYnJ1cHQiLCJjb25maXJtQWN0aW9uIiwiY29yX3NsdWdzIiwiY29yX2FjY2VzcyIsInN0b3AiLCJfeCIsIl94MiIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlU2V0QWdlbnRWYWx1ZXMiLCJfYWdlbnRWYWx1ZXMkdmFsdWVzIiwiX2FnZW50VmFsdWVzJHZhbHVlczMiLCJhZ2VudFZhbHVlcyIsImRldGFpbCIsImluaXRpYWxTZWN0aW9uIiwib3BlbkxvYWRBY3Rpb24iLCJ2YWx1ZXMiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsImhhc1ByZWZldGNoZWRBZ2VudCIsInByZWZldGNoZWRBZ2VudEJ5SWQiLCJfYWdlbnRWYWx1ZXMkdmFsdWVzMiIsIm5leHRWYWx1ZXMiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVuZGVmaW5lZCIsIl9kb2N1bWVudCIsImJvZHkiLCJvcmlnaW5hbE92ZXJmbG93Iiwic3R5bGUiLCJvdmVyZmxvdyIsImhhbmRsZUJlZm9yZVVubG9hZCIsInByZXZlbnREZWZhdWx0IiwicmV0dXJuVmFsdWUiLCJjcmVhdGVQbGFuIiwiX3Jlc29sdmVBYm1DcmVhdGVGYXZvIiwibGlzdEFnZW50IiwidG9nZ2xlQWdlbnQiLCJlbnF1ZXVlQ3JlYXRlRmF2b3JpdGUiLCJwcm9taXNlcyIsInB1c2giLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInRvU3RyaW5nIiwiYWNjZXNzVHlwZSIsImtub3dsZWRnZUhhbmRsZXIiLCJmaWxlc1RvRGVsZXRlIiwiZmlsZXNUb0NyZWF0ZSIsImZpbGVzIiwiYWxsIiwiYWNjZXNzT25seURlY2lzaW9uIiwibmV4dENvbnRleHQiLCJhaUNoYXRGYXZvcml0ZSIsImFjY2Vzc2liaWxpdHlDaGFuZ2VkIiwidXBkYXRlUGxhbiIsIl90b0NvbnN1bWFibGVBcnJheSIsImZpbGVzVG9VcGxvYWQiLCJjb25jYXQiLCJhY2Nlc3NPbmx5Q29udGV4dCIsImhhc1BlbmRpbmdGaWxlcyIsInRvVXBsb2FkQ291bnQiLCJsZW5ndGgiLCJhY2Nlc3NIYXNBY3Rpb25GaWxlcyIsInByb2Nlc3NGaWxlc1RpbWVkT3V0IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiaGFuZGxlUHJvY2Vzc0ZpbGVzVGltZW91dCIsIndlYlNvY2tldEZ1bmN0aW9uIiwiX3JlZjQiLCJtb2RlbERhdGEiLCJtb2RlbF9kYXRhIiwiZmlsZVN0YXR1cyIsInN0YXR1cyIsInVwZGF0ZWRLbm93bGVkZ2UiLCJ1cGxvYWRPdXRjb21lIiwid3NFZmZlY3RzIiwiY2xvc2VQcm9jZXNzRmlsZXMiLCJpbmNyZW1lbnRGaWxlc1Byb2Nlc3NlZCIsIm1hcmtGaWxlc0ZpbmlzaGVkRm9yQ3JlYXRlIiwicHJldkNvdW50IiwiY29udGV4dCIsIl9yZXNvbHZlQWJtQ3JlYXRlRmF2bzIiLCJmaWxlc0ZpbmlzaGVkIiwiaGFzU3VjY2Vzc0NyZWF0ZSIsImFjY2Vzc0hhbmRsZWQiLCJfc3VjY2Vzc0NyZWF0ZSRpZCIsImNoYW5uZWwiLCIkX3NjIiwiXyRfc2MiLCJzdWJzY3JpYmVIYW5kbGVyIiwiXyRfc2MyIiwiXyRfc2MzIiwiXyRfc2MkY2hhbm5lbFR5cGUiLCJtb2RlbF9oYXNoIiwiYWN0aW9uVHlwZSIsIlNVQlNDUklCRSIsInVwZGF0ZUNvbm5lY3Rpb25Nb2RlbCIsImNoYW5uZWxUeXBlIiwiTU9ERUxfQ0hBTk5FTCIsImFwcGx5RWRpdGluZ0FnZW50IiwiX3JlZjUiLCJfY2FsbGVlMiIsInNvdXJjZSIsImFnZW50VmFsdWVzVG9TZXQiLCJjb25uZWN0b3JzIiwiX3QiLCJfY29udGV4dDIiLCJzZXRUaW1lb3V0IiwiU3RyaW5nIiwic2VudCIsInNlbGVjdGVkQ29ubmVjdG9ycyIsImNvbm5lY3RvclN0YXR1c2VzIiwiZnJvbUVudHJpZXMiLCJtYXAiLCJjb25uZWN0b3IiLCJzbHVnIiwiY29ubmVjdGlvbl9zdGF0dXMiLCJ1c2VyX2F1dGhvcml6ZWQiLCJjb25zb2xlIiwiX3gzIiwicHJlZmV0Y2hlZCIsImhhc0FnZW50QnlJZCIsImFpTW9kZWwiLCJzaG91bGREaXNhYmxlU2F2ZUZvckNsaWVudHMiLCJfbW9kYWxWYWx1ZXMkYWNjZXNzaWIyIiwiY2xpZW50cyIsImhhbmRsZVRvZ2dsZUZhdm9yaXRlIiwiX21vZGFsVmFsdWVzJGdlbmVyYWwiLCJfbW9kYWxWYWx1ZXMkZ2VuZXJhbDIiLCJ6SW5kZXgiLCJvbkNsaWNrIiwiY2hpbGRyZW4iLCJyZWYiLCJ0YWJJbmRleCIsInNpemUiLCJjb2xvciIsImF0dGFjaG1lbnRzIiwibGFiZWwiLCJvblRpbWVvdXQiLCJ0aXRsZSIsIndpZHRoIiwiaGVpZ2h0IiwiZmlsbCIsInZhcmlhbnQiLCJjbGFzc05hbWUiLCJjYW5jZWxNb2RhbCIsImRpc2FibGVkIiwiaGFzU2Nyb2xsIiwiaXNBY3RpdmUiLCIkaW5kZXgiLCJleGlzdGluZ0tub3dsZWRnZSIsIm5ld0tub3dsZWRnZSIsIm9uUmVtb3ZlRXhpc3RpbmdLbm93bGVkZ2UiLCJvblJlbW92ZU5ld0tub3dsZWRnZSIsIm9uRmlsZUVycm9yQ2hhbmdlIiwiY2hpbGRyZW5XaXRoSWNvbiIsImRpc3BsYXkiLCJnYXAiLCJpc0Rpc2FibGVkIiwiaW5pdGlhbCIsImZpbGVBY3Rpb25zIiwib25DbG9zZSIsImhhbmRsZXJzIiwibmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFsZXJ0ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tY3ljbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2pzeC1uby11c2VsZXNzLWZyYWdtZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5cbmltcG9ydCB7IENVQnV0dG9uIH0gZnJvbSAnQHByb2plY3Rjb3IvYnV0dG9uL2xpYi9jb21wb25lbnRzL0NVQnV0dG9uJ1xuaW1wb3J0IHsgQ2F0ZWdvcnkgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9DYXRlZ29yeSdcbmltcG9ydCB7IEFsZXJ0IH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQWxlcnQnXG5pbXBvcnQgeyBUcmFzaCB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL1RyYXNoJ1xuaW1wb3J0IHsgU3RhciB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL1N0YXInXG5pbXBvcnQgeyBDcm9zcyB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0Nyb3NzJ1xuaW1wb3J0IHsgU3Bpbm5lckxvdHRpZSB9IGZyb20gJ0Bwcm9qZWN0Y29yL2Nvci1jb21tb25zL2xpYi9jb21wb25lbnRzL3NwaW5uZXItbG90dGllJ1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJ0Bwcm9qZWN0Y29yL3Rvb2x0aXB2Mi9saWIvY29tcG9uZW50cy9Ub29sdGlwJ1xuaW1wb3J0IHsgQWJtQWNjZXNzaWJpbGl0eVNlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQWJtU2VjdGlvbi9BYm1BY2Nlc3NpYmlsaXR5U2VjdGlvbi9BYm1BY2Nlc3NpYmlsaXR5U2VjdGlvbidcbmltcG9ydCB7IEJhY2tkcm9wIH0gZnJvbSAnLi4vLi4vYXRvbXMvQmFja2Ryb3AnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlJY29uLCBCcmFpbkljb24gfSBmcm9tICcuLi8uLi9hdG9tcy9pY29ucydcbmltcG9ydCB7IHVzZUFnZW50TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VBZ2VudE1vZGVsL3VzZUFnZW50TW9kZWwnXG5pbXBvcnQgeyBBZ2VudCwgQWdlbnRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgdXNlR2V0QWdlbnRCeUlkIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRCeUlkJ1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgQWJtR2VuZXJhbFNlY3Rpb24sIEFibUtub3dsZWRnZVNlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQWJtU2VjdGlvbidcbmltcG9ydCB7IE1vZGFsVmFsdWVzIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnRNb2RhbCdcbmltcG9ydCB7XG4gIFNDQUFNQ29udGVudCxcbiAgU0NBQU1Gb290ZXIsXG4gIFNDQUFNSGVhZGVyLFxuICBTQ0FBTUhlYWRlclRpdGxlLFxuICBTQ0FBTUhlYWRlckxlZnQsXG4gIFNDQUFNSGVhZGVyRmF2b3JpdGUsXG4gIFNDQUFNSGVhZGVyQ2xvc2VCdXR0b24sXG4gIFNDQUFNU2lkZWJhcixcbiAgU0NBQU1XcmFwcGVyLFxuICBTQ0FBTVNpZGViYXJJdGVtLFxuICBTQ0FBTVNpZGViYXJJdGVtVGl0bGUsXG4gIFNDQUFNRGVsZXRlQnV0dG9uLFxuICBTQ0FBTVNhdmVCdXR0b24sXG4gIFNDQUFNV3JhcHBlclNwaW5uZXIsXG4gIFNDQUFNV3JhcHBlclNwaW5uZXJDb250ZW50LFxuICBTQ0FBTVNpZGViYXJJdGVtRXJyb3IsXG59IGZyb20gJy4vQWJtQWdlbnRNb2RhbC5zdHlsZXMnXG5pbXBvcnQgeyB1c2VDcmVhdGVBZ2VudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlQ3JlYXRlQWdlbnQnXG5pbXBvcnQgeyB1c2VEZWxldGVBZ2VudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlRGVsZXRlQWdlbnQnXG5pbXBvcnQgeyB1c2VTbmFja0Jhck1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VTbmFja0Jhck1hbmFnZXIvdXNlU25hY2tCYXJNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyB1c2VVcGRhdGVBZ2VudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUFnZW50TW9kZWwvdXNlVXBkYXRlQWdlbnQnXG5pbXBvcnQgeyB1c2VLbm93bGVkZ2VPcGVyYXRpb25zIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlS25vd2xlZGdlJ1xuaW1wb3J0IHsgQWJtTG9hZGVyRmlsZXMgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQWJtU2VjdGlvbi9BYm1Mb2FkZXJGaWxlcydcbmltcG9ydCB7IFdyYXBwZXJDZW50ZXJJY29uIH0gZnJvbSAnLi4vLi4vYXRvbXMvV3JhcHBlckNlbnRlckljb24nXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnXG5pbXBvcnQgeyBEZWxldGVRdWVzdGlvbk1vZGFsIH0gZnJvbSAnLi4vRGVsZXRlUXVlc3Rpb25Nb2RhbC9EZWxldGVRdWVzdGlvbk1vZGFsJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG5pbXBvcnQgeyB1c2VBY2Nlc3NDbGllbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VBY2Nlc3NDbGllbnQvdXNlQWNjZXNzQ2xpZW50J1xuaW1wb3J0IHsgdXNlVG9nZ2xlRmF2b3JpdGUgfSBmcm9tICcuLi8uLi8uLi9ob29rcydcbmltcG9ydCB7XG4gIGJ1aWxkQWdlbnRUb29sR3JvdXBzUmVxdWVzdCxcbiAgREVGQVVMVF9DT1JfQUNDRVNTLFxuICBkZXJpdmVBc3NpZ25lZENvbm5lY3RvclNsdWdzLFxufSBmcm9tICcuLi8uLi8uLi91dGlscy9ub3JtYWxpemVBZ2VudENvbm5lY3RvcnMnXG5pbXBvcnQge1xuICBhcHBseUtub3dsZWRnZUZpbGVTdGF0dXNVcGRhdGUsXG4gIGJ1aWxkRWRpdGluZ01vZGFsVmFsdWVzRnJvbUFnZW50RGV0YWlsLFxuICBjcmVhdGVJbml0aWFsQWJtTW9kYWxWYWx1ZXMsXG4gIGhhc0FibVBlbmRpbmdDaGFuZ2VzLFxuICBoYXNBY2Nlc3NpYmlsaXR5U2VjdGlvbkNoYW5nZWQsXG4gIGhhc0luYWN0aXZlQWNjZXNzaWJpbGl0eUNsaWVudHMsXG4gIGlzQWJtU2F2ZURpc2FibGVkLFxuICBpc1NhbWVBZ2VudE1vZGFsU25hcHNob3QsXG4gIHJlc29sdmVLbm93bGVkZ2VVcGxvYWRPdXRjb21lLFxuICBzaG91bGRDb25maXJtQWJtQ2xvc2UsXG4gIGNhblJlbmRlckFibUFnZW50TW9kYWwsXG4gIGlzQWJtQWNjZXNzRGVuaWVkRXJyb3IsXG4gIHJlc29sdmVBYm1Qcm9jZXNzaW5nS25vd2xlZGdlTGFiZWxLZXksXG4gIHJlc29sdmVQZW5kaW5nQWJtSW5pdGlhbFNlY3Rpb24sXG4gIG1lcmdlQWJtT3BlbkFnZW50VmFsdWVzLFxuICBzaG91bGRDbG9zZUFibU9uQmFja2Ryb3BDbGljayxcbiAgcmVzb2x2ZUFibUNyZWF0ZUFjY2Vzc1VwZGF0ZUNvbnRleHQsXG4gIHNob3VsZFN5bmNBYm1DbGllbnRBY2Nlc3NPbkNyZWF0ZSxcbiAgcmVzb2x2ZUFibUNyZWF0ZVN1Y2Nlc3NQbGFuLFxuICBzaG91bGRTaG93UHJvY2Vzc0ZpbGVzRm9yQ3JlYXRlUGxhbixcbiAgcmVzb2x2ZUFibVVwZGF0ZVN1Y2Nlc3NQbGFuLFxuICByZXNvbHZlQWJtVXBkYXRlQWNjZXNzVXBkYXRlQ29udGV4dCxcbiAgcmVzb2x2ZUFibVVwZGF0ZUFjY2Vzc09ubHlDb250ZXh0LFxuICByZXNvbHZlQWJtQ3JlYXRlQWNjZXNzT25seURlY2lzaW9uLFxuICBjcmVhdGVSZXNldEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQsXG4gIHNob3VsZEZpbmFsaXplQWJtVXBkYXRlV2l0aG91dFBlbmRpbmdXb3JrLFxuICByZXNvbHZlS25vd2xlZGdlV3NDb21wbGV0aW9uRWZmZWN0cyxcbiAgcmVzb2x2ZUFibUtub3dsZWRnZUVycm9yTWVzc2FnZUtleSxcbiAgc2hvdWxkQmxvY2tLbm93bGVkZ2VEZWxldGVTdWNjZXNzQ2xvc2UsXG4gIHNob3VsZERlZmVyQWNjZXNzVXBkYXRlVW50aWxGaWxlc0NvbXBsZXRlLFxuICBzaG91bGRDbG9zZUNyZWF0ZUFmdGVyS25vd2xlZGdlV2l0aG91dEFjY2VzcyxcbiAgc2hvdWxkQ2xvc2VDcmVhdGVBZnRlcktub3dsZWRnZVdpdGhBY2Nlc3MsXG4gIHNob3VsZEFwcGx5UGVuZGluZ1NlY3Rpb25BZnRlck9wZW4sXG4gIHJlc29sdmVBYm1PcGVuTW9kYWxMb2FkQWN0aW9uLFxuICBjYW5BcHBseUFibUVkaXRpbmdBZ2VudERldGFpbCxcbiAgc2hvdWxkU2V0RGVmYXVsdEFpTW9kZWxGb3JOZXdBZ2VudCxcbiAgc2hvdWxkU2tpcEFibUNvbmZpcm1XaXRob3V0TXVsdGlBZ2VudHMsXG4gIHJlc29sdmVBYm1EcmFmdEZhdm9yaXRlVmFsdWUsXG4gIHJlc29sdmVBYm1DcmVhdGVGYXZvcml0ZUFnZW50cyxcbiAgYXBwbHlBYm1Lbm93bGVkZ2VGaWxlQWN0aW9ucyxcbiAgbWVyZ2VBYm1BZ2VudFZhbHVlc0J5S2V5LFxuICBzaG91bGRSdW5BYm1DcmVhdGVTdWNjZXNzSGFuZGxlcixcbiAgcmVzb2x2ZUFibUNyZWF0ZUtub3dsZWRnZUhhbmRsZXIsXG4gIHNob3VsZFJlcGVhdERlbGV0ZUtub3dsZWRnZXNPbkNyZWF0ZSxcbiAgc2hvdWxkRW5xdWV1ZUFibUNyZWF0ZUZhdm9yaXRlVG9nZ2xlLFxuICBzaG91bGRIYW5kbGVBYm1DcmVhdGVBY2Nlc3NPbmx5Q2xpZW50LFxuICBzaG91bGRQcm9jZXNzS25vd2xlZGdlV3NTdGF0dXMsXG4gIHJlc29sdmVBYm1Lbm93bGVkZ2VXc0NoYW5uZWwsXG4gIHJlc29sdmVBYm1GYXZvcml0ZVRvb2x0aXBLZXksXG4gIHNob3VsZFNlbGVjdEFnZW50QWZ0ZXJEZWxldGUsXG4gIHNob3VsZFJ1bkFibVByb2Nlc3NGaWxlc1RpbWVvdXQsXG4gIHJlc29sdmVBYm1Qcm9jZXNzRmlsZXNUaW1lb3V0U3VjY2Vzc0tleSxcbiAgc2hvdWxkU3luY1NlbGVjdGVkQWdlbnRBZnRlck11dGF0aW9uLFxuICBzaG91bGRJbmNsdWRlQWNjZXNzaWJpbGl0eVVwZGF0ZUluS25vd2xlZGdlQmF0Y2gsXG4gIHNob3VsZFJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2Vzc09uQ3JlYXRlQ2xvc2UsXG4gIHNob3VsZEh5ZHJhdGVBZ2VudENvbm5lY3RvcnNPbkVkaXQsXG4gIHNob3VsZFNob3dBYm1Mb2FkZXJGaWxlcyxcbiAgcmVzb2x2ZUFibU1vZGFsVGl0bGVLZXksXG4gIHNob3VsZERpc2FibGVBYm1IZWFkZXJDbG9zZSxcbiAgcmVzb2x2ZUFibVNhdmVBY3Rpb24sXG4gIHJlc29sdmVQcm9jZXNzRmlsZXNUaW1lb3V0RmxhZ0JlZm9yZVNhdmUsXG59IGZyb20gJy4vQWJtQWdlbnRNb2RhbC5oZWxwZXJzJ1xuaW1wb3J0IHsgZ2V0QWdlbnRDb25uZWN0b3JzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvY29ubmVjdG9ycydcbmltcG9ydCB7IGhhc01haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3MgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbWFpYUV4dGVybmFsQ29ubmVjdG9yc0FjY2VzcydcblxuY29uc3QgaW5pdGlhbFZhbHVlcyA9IE9iamVjdC5mcmVlemUoY3JlYXRlSW5pdGlhbEFibU1vZGFsVmFsdWVzKCkpXG5cbnR5cGUgQWJtU2VjdGlvbiA9ICdnZW5lcmFsJyB8ICdrbm93bGVkZ2UnIHwgJ3RyYWluaW5nJyB8ICd0ZXN0aW5nJyB8ICdhY2Nlc3NpYmlsaXR5J1xuXG5leHBvcnQgY29uc3QgU2VjdGlvbkJ5S2V5ID0ge1xuICBnZW5lcmFsOiAocHJvcHM6IHtcbiAgICB2YWx1ZXM6IE1vZGFsVmFsdWVzXG4gICAgaGFuZGxlU2V0QWdlbnRWYWx1ZXM6ICh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIGRlbGV0ZUtub3dsZWRnZSxcbiAgICB9OiB7XG4gICAgICBrZXk6IHN0cmluZ1xuICAgICAgdmFsdWU6IHVua25vd25cbiAgICAgIGRlbGV0ZUtub3dsZWRnZT86IGJvb2xlYW5cbiAgICB9KSA9PiB2b2lkXG4gICAgYWdlbnRNb2RlbHM6IEFnZW50TW9kZWxbXVxuICAgIGxvYWRpbmc6IGJvb2xlYW5cbiAgICB0b29sdGlwWkluZGV4PzogbnVtYmVyXG4gIH0pID0+IDxBYm1HZW5lcmFsU2VjdGlvbiB7Li4ucHJvcHN9IC8+LFxuICBrbm93bGVkZ2U6IChwcm9wczoge1xuICAgIHZhbHVlczogTW9kYWxWYWx1ZXNcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlczogKHsga2V5LCB2YWx1ZSB9OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG4gICAgZXhpc3RpbmdLbm93bGVkZ2U6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBuZXdLbm93bGVkZ2U6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBvblJlbW92ZUV4aXN0aW5nS25vd2xlZGdlOiAoZmlsZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgICBvblJlbW92ZU5ld0tub3dsZWRnZTogKGZpbGVJZDogc3RyaW5nKSA9PiB2b2lkXG4gICAgb25GaWxlRXJyb3JDaGFuZ2U6IChoYXNFcnJvcnM6IGJvb2xlYW4pID0+IHZvaWRcbiAgICB0b29sdGlwWkluZGV4PzogbnVtYmVyXG4gIH0pID0+IDxBYm1Lbm93bGVkZ2VTZWN0aW9uIHsuLi5wcm9wc30gLz4sXG4gIGFjY2Vzc2liaWxpdHk6IChwcm9wczoge1xuICAgIHZhbHVlczogTW9kYWxWYWx1ZXNcbiAgICBoYW5kbGVTZXRBZ2VudFZhbHVlczogKHsga2V5LCB2YWx1ZSB9OiB7IGtleTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSA9PiB2b2lkXG4gIH0pID0+IDxBYm1BY2Nlc3NpYmlsaXR5U2VjdGlvbiB7Li4ucHJvcHN9IC8+LFxufVxuXG50eXBlIEFibUFnZW50TW9kYWxQcm9wcyA9IHtcbiAgYWRkQWdlbnQ6IChuZXdBZ2VudDogQWdlbnQsIG9wdGlvbnM/OiB7IG5hdmlnYXRlSG9tZT86IGJvb2xlYW4gfSkgPT4gdm9pZFxuICByZW1vdmVBZ2VudDogKGFnZW50SWQ6IG51bWJlciB8IHN0cmluZykgPT4gdm9pZFxuICB1cGRhdGVBZ2VudDogKHVwZGF0ZWRBZ2VudDogQWdlbnQpID0+IHZvaWRcbiAgdXBkYXRlQWdlbnRGYXZvcml0ZTogKHVwZGF0ZWRBZ2VudDogQWdlbnQsIHNob3VsZFNvcnQ/OiBib29sZWFuKSA9PiB2b2lkXG4gIHNlbGVjdEZpcnN0QWdlbnQ6IChhZ2VudElkOiBzdHJpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IGNvbnN0IEFibUFnZW50TW9kYWwgPSAoe1xuICBhZGRBZ2VudCxcbiAgdXBkYXRlQWdlbnQsXG4gIHJlbW92ZUFnZW50LFxuICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICBzZWxlY3RGaXJzdEFnZW50LFxufTogQWJtQWdlbnRNb2RhbFByb3BzKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgZXZlbnRBbXBsaXR1ZGUgPSB1c2VFdmVudCgpXG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oJ2FibV9hZ2VudF9zZWN0aW9uJylcbiAgLy8gY29uc3QgJF9zYzogYW55ID0gbnVsbFxuICBjb25zdCB7IGFnZW50OiBjdXJyZW50U2VsZWN0ZWRBZ2VudCwgc2VsZWN0QWdlbnQgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBhYm1BZ2VudE1vZGFsWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxMTEyLCAnYWdlbnRNb2RhbCcpXG4gIGNvbnN0IHRvb2x0aXBaSW5kZXggPSB1c2VNYWlhVGFza1BhbmVsWkluZGV4KDE1MDAsICduZXN0ZWRNb2RhbCcpXG4gIGNvbnN0IHsgdG9nZ2xlRmF2b3JpdGUgfSA9IHVzZVRvZ2dsZUZhdm9yaXRlKClcbiAgY29uc3Qgc2VsZWN0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWJtLWFnZW50LW1vZGFsJylcbiAgY29uc3QgW2lzU3Vic2NyaWJlZCwgc2V0SXNTdWJzY3JpYmVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBtb2RhbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgaGFzUGVuZGluZ0ZpbGVzUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBhY3Rpb25zVG9GaWxlcyA9IHVzZVJlZjxhbnk+KHtcbiAgICB0b0RlbGV0ZTogW10sXG4gICAgdG9VcGxvYWQ6IFtdLFxuICB9KVxuICBjb25zdCBhY2Nlc3NVcGRhdGVDb250ZXh0ID0gdXNlUmVmPHtcbiAgICBpc0Zyb21DcmVhdGlvbjogYm9vbGVhblxuICAgIGlzRnJvbUVkaXRpbmc6IGJvb2xlYW5cbiAgICBoYXNBY3Rpb25GaWxlczogYm9vbGVhblxuICAgIG9wZXJhdGlvblR5cGU6ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCBudWxsXG4gICAgaGFzQmVlbkNhbGxlZD86IGJvb2xlYW5cbiAgfT4oe1xuICAgIGlzRnJvbUNyZWF0aW9uOiBmYWxzZSxcbiAgICBpc0Zyb21FZGl0aW5nOiBmYWxzZSxcbiAgICBoYXNBY3Rpb25GaWxlczogZmFsc2UsXG4gICAgb3BlcmF0aW9uVHlwZTogbnVsbCxcbiAgICBoYXNCZWVuQ2FsbGVkOiBmYWxzZSxcbiAgfSlcbiAgY29uc3QgYWNjZXNzSGFuZGxlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgYWdlbnRDcmVhdGVkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZiA9IHVzZVJlZjxBYm1TZWN0aW9uIHwgbnVsbD4obnVsbClcbiAgY29uc3QgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZiA9IHVzZVJlZjxhbnk+KG51bGwpXG4gIGNvbnN0IGh5ZHJhdGluZ0FnZW50SWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgZmlsZXNGaW5pc2hlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgLy8gTWFyY2EgY3VhbmRvIGNlcnJhbW9zIGVsIGxvYWRlciBwb3IgZWwgdGltZW91dCBkZSBzZWd1cmlkYWQgZGUgYXJjaGl2b3MuXG4gIC8vIE1pZW50cmFzIGVzdMOpIGFjdGl2bywgbG9zIHVzZUVmZmVjdCBkZSBwb3N0LWd1YXJkYWRvIE5PIGRlYmVuIGRpc3BhcmFyXG4gIC8vIHNuYWNrYmFycyBkZSDDqXhpdG8gbmkgYXV0by1jZXJyYXIgZWwgbW9kYWwuXG4gIGNvbnN0IHByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBbZmlsZXNQcm9jZXNzZWQsIHNldEZpbGVzUHJvY2Vzc2VkXSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFtpc09wZW4sIHNldElzT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Nob3dNb2RhbERlbGV0ZSwgc2V0U2hvd01vZGFsRGVsZXRlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VjdGlvbiwgc2V0U2VjdGlvbl0gPSB1c2VTdGF0ZTxBYm1TZWN0aW9uPignZ2VuZXJhbCcpXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW21vZGFsVmFsdWVzLCBzZXRNb2RhbFZhbHVlc10gPSB1c2VTdGF0ZTx7XG4gICAgZ2VuZXJhbDogYW55XG4gICAga25vd2xlZGdlOiBhbnlcbiAgICBpc0VkaXRpbmc6IGJvb2xlYW5cbiAgICBhY2Nlc3NpYmlsaXR5OiBhbnlcbiAgfT4oaW5pdGlhbFZhbHVlcylcbiAgY29uc3Qge1xuICAgIGxvYWRpbmc6IGFnZW50TG9hZGluZyxcbiAgICBoYW5kbGVHZXRBZ2VudEJ5SWQsXG4gICAgYWdlbnQ6IGFnZW50QnlJZCxcbiAgICBoYW5kbGVDbGVhbkFnZW50LFxuICAgIGVycm9yOiBlcnJvckdldEFnZW50QnlJZCxcbiAgfSA9IHVzZUdldEFnZW50QnlJZCgpXG4gIGNvbnN0IHsgYWdlbnRNb2RlbHMsIGdldEFsbEFnZW50TW9kZWxzIH0gPSB1c2VBZ2VudE1vZGVsKClcbiAgY29uc3QgZmlyc3RWYWx1ZUFnZW50ID0gdXNlUmVmPGFueT4obnVsbClcbiAgY29uc3QgW2lzU2hvd1Byb2Nlc3NGaWxlcywgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaGFzRmlsZUVycm9ycywgc2V0SGFzRmlsZUVycm9yc10gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzXG5cbiAgY29uc3QgeyBoYW5kbGVEZWxldGVBZ2VudCwgc3VjY2Vzczogc3VjY2Vzc0RlbGV0ZSwgcmVzZXRTdWNjZXNzIH0gPSB1c2VEZWxldGVBZ2VudCgpXG4gIGNvbnN0IHsgaGFuZGxlVXBkYXRlQWdlbnQsIHN1Y2Nlc3M6IHN1Y2Nlc3NVcGRhdGUsIHJlc2V0U3VjY2VzczogcmVzZXRTdWNjZXNzVXBkYXRlIH0gPSB1c2VVcGRhdGVBZ2VudCgpXG5cbiAgY29uc3Qge1xuICAgIGhhbmRsZUNyZWF0ZUFnZW50LFxuICAgIGlzTG9hZGluZzogaXNMb2FkaW5nQ3JlYXRlLFxuICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NDcmVhdGUsXG4gICAgcmVzZXRTdWNjZXNzOiByZXNldFN1Y2Nlc3NDcmVhdGUsXG4gIH0gPSB1c2VDcmVhdGVBZ2VudCgpXG5cbiAgY29uc3QgeyBoYW5kbGVTbmFja2JhclN1Y2Nlc3MsIGhhbmRsZVNuYWNrYmFyRXJyb3IgfSA9IHVzZVNuYWNrQmFyTWFuYWdlcigpXG5cbiAgY29uc3Qge1xuICAgIGhhbmRsZUNyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVEZWxldGVBbmRDcmVhdGVLbm93bGVkZ2VzLFxuICAgIGlzTG9hZGluZzogaXNMb2FkaW5nS25vd2xlZGdlLFxuICAgIGVycm9yOiBlcnJvcktub3dsZWRnZSxcbiAgICBzdWNjZXNzRGVsZXRlOiBzdWNjZXNzS25vd2xlZGdlRGVsZXRlLFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc1NhdmUsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlLFxuICB9ID0gdXNlS25vd2xlZGdlT3BlcmF0aW9ucygpXG5cbiAgY29uc3Qge1xuICAgIGhhbmRsZUFjY2Vzc0NsaWVudCxcbiAgICBzdWNjZXNzOiBzdWNjZXNzVXBkYXRlQWNjZXNzLFxuICAgIGlzTG9hZGluZzogaXNMb2FkaW5nVXBkYXRlQWNjZXNzLFxuICAgIGhhbmRsZVJlc2V0U3VjY2VzczogcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzLFxuICB9ID0gdXNlQWNjZXNzQ2xpZW50KClcblxuICBjb25zdCBjcmVhdGlvbkRyYWZ0RGVmYXVsdHMgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBkZWZhdWx0SW5wdXRQbGFjZWhvbGRlcjogdCgnZ2VuZXJhbFNlY3Rpb24uaW5wdXRQbGFjZWhvbGRlcicpLFxuICAgICAgZGVmYXVsdFVzZXJQcm9tcHRQbGFjZWhvbGRlcjogdCgnZ2VuZXJhbFNlY3Rpb24uaW5pdGlhbFByb21wdFBsYWNlaG9sZGVyJyksXG4gICAgICBkZWZhdWx0QWlNb2RlbElkOiBhZ2VudE1vZGVsc1swXT8uaWQgPz8gbnVsbCxcbiAgICB9KSxcbiAgICBbYWdlbnRNb2RlbHMsIHRdXG4gIClcblxuICBjb25zdCBoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCA9ICgpID0+XG4gICAgaGFzQWNjZXNzaWJpbGl0eVNlY3Rpb25DaGFuZ2VkKG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHksIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50Py5hY2Nlc3NpYmlsaXR5KVxuXG4gIGNvbnN0IGhhc1BlbmRpbmdDaGFuZ2VzID0gKCkgPT5cbiAgICBoYXNBYm1QZW5kaW5nQ2hhbmdlcyhtb2RhbFZhbHVlcywgZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQsIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQsIGNyZWF0aW9uRHJhZnREZWZhdWx0cylcblxuICBjb25zdCB2YWxpZGF0ZUFnZW50VmFsdWVzSXNTYW1lID0gKCkgPT5cbiAgICBCb29sZWFuKFxuICAgICAgZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQgJiYgaXNTYW1lQWdlbnRNb2RhbFNuYXBzaG90KG1vZGFsVmFsdWVzLCBmaXJzdFZhbHVlQWdlbnQuY3VycmVudCwgYWN0aW9uc1RvRmlsZXMuY3VycmVudClcbiAgICApXG5cbiAgLy8gSGVscGVyIHBhcmEgbWFuZWphciBlbCB0b2dnbGUgZGUgZmF2b3JpdG8geSBhY3R1YWxpemFyIGVsIGVzdGFkbyBjb24gb3JkZW5hbWllbnRvXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUZhdm9yaXRlRm9yQWdlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoYWdlbnRJZDogc3RyaW5nLCBhZ2VudDogQWdlbnQsIG9uU3VjY2Vzcz86ICh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB2b2lkLCBvbkVycm9yPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgdG9nZ2xlRmF2b3JpdGUoXG4gICAgICAgIGFnZW50SWQsXG4gICAgICAgIHVwZGF0ZWRBZ2VudCA9PiB7XG4gICAgICAgICAgLy8gQWN0dWFsaXphciBlbCBlc3RhZG8gZGUgYWdlbnRlcyBjb24gZWwgcmVzdWx0YWRvIGRlbCBzZXJ2aWRvciB5IG9yZGVuYXJcbiAgICAgICAgICB1cGRhdGVBZ2VudEZhdm9yaXRlKHVwZGF0ZWRBZ2VudCwgdHJ1ZSlcbiAgICAgICAgICBpZiAob25TdWNjZXNzKSB7XG4gICAgICAgICAgICBvblN1Y2Nlc3ModXBkYXRlZEFnZW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgICAgICBvbkVycm9yKClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGFnZW50LmlzX2Zhdm9yaXRlXG4gICAgICApXG4gICAgfSxcbiAgICBbdG9nZ2xlRmF2b3JpdGUsIHVwZGF0ZUFnZW50RmF2b3JpdGVdXG4gIClcblxuICBjb25zdCBoYW5kbGVDbG9zZSA9ICgpID0+IHtcbiAgICBpZiAoXG4gICAgICBzaG91bGRDb25maXJtQWJtQ2xvc2UoaGFzUGVuZGluZ0NoYW5nZXMoKSwge1xuICAgICAgICBjcmVhdGU6IHN1Y2Nlc3NDcmVhdGUsXG4gICAgICAgIHVwZGF0ZTogc3VjY2Vzc1VwZGF0ZSxcbiAgICAgICAgZGVsZXRlOiBzdWNjZXNzRGVsZXRlLFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1NZXNzYWdlID0gbW9kYWxWYWx1ZXMuaXNFZGl0aW5nID8gdCgnY29uZmlybUNsb3NlRWRpdEFnZW50JykgOiB0KCdjb25maXJtQ2xvc2VDcmVhdGVBZ2VudCcpXG5cbiAgICAgIGlmICghd2luZG93LmNvbmZpcm0oY29uZmlybU1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIHNldE1vZGFsVmFsdWVzKGluaXRpYWxWYWx1ZXMpXG4gICAgaGFuZGxlQ2xlYW5BZ2VudCgpXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSgpXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MoKVxuICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQgPSB7XG4gICAgICB0b0RlbGV0ZTogW10sXG4gICAgICB0b1VwbG9hZDogW10sXG4gICAgfVxuICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IGNyZWF0ZVJlc2V0QWJtQWNjZXNzVXBkYXRlQ29udGV4dCgpXG4gICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKGZhbHNlKVxuICAgIHNldElzU3Vic2NyaWJlZChmYWxzZSlcbiAgICBzZXRGaWxlc1Byb2Nlc3NlZCgwKVxuICAgIHNldFNlY3Rpb24oJ2dlbmVyYWwnKVxuICAgIHNldElzT3BlbihmYWxzZSlcbiAgICBoeWRyYXRpbmdBZ2VudElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgYWdlbnRDcmVhdGVkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50ID0gbnVsbFxuICB9XG5cbiAgY29uc3QgaGFuZGxlQmFja2Ryb3BDbGljayA9IChldmVudDogUmVhY3QuTW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChzaG91bGRDbG9zZUFibU9uQmFja2Ryb3BDbGljayhldmVudC50YXJnZXQsIGV2ZW50LmN1cnJlbnRUYXJnZXQsIGlzU2hvd1Byb2Nlc3NGaWxlcykpIHtcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVTZWN0aW9uQ2hhbmdlID0gKG5ld1NlY3Rpb246IEFibVNlY3Rpb24pID0+IHtcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMudGFiU2VjdGlvbiwgeyBvcHRpb246IG5ld1NlY3Rpb24gfSlcbiAgICBzZXRTZWN0aW9uKG5ld1NlY3Rpb24pXG4gIH1cblxuICBjb25zdCBoYW5kbGVTZXRBZ2VudFZhbHVlc0J5S2V5cyA9ICh7XG4gICAga2V5LFxuICAgIHZhbHVlLFxuICAgIGRlbGV0ZUtub3dsZWRnZSxcbiAgfToge1xuICAgIGtleTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxuICAgIGRlbGV0ZUtub3dsZWRnZTogYm9vbGVhblxuICB9KSA9PiB7XG4gICAgaWYgKGtleSA9PT0gJ2tub3dsZWRnZScpIHtcbiAgICAgIGNvbnN0IG5leHRBY3Rpb25zID0gYXBwbHlBYm1Lbm93bGVkZ2VGaWxlQWN0aW9ucyhcbiAgICAgICAgdmFsdWUgYXMgQXR0YWNobWVudEZpbGVbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGVsZXRlS25vd2xlZGdlLFxuICAgICAgICBtb2RhbFZhbHVlcy5rbm93bGVkZ2UsXG4gICAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnRcbiAgICAgIClcbiAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQgPSBuZXh0QWN0aW9uc1xuICAgIH1cbiAgICBzZXRNb2RhbFZhbHVlcyhwcmV2ID0+IG1lcmdlQWJtQWdlbnRWYWx1ZXNCeUtleShwcmV2LCBrZXksIHZhbHVlLCBkZWxldGVLbm93bGVkZ2UpKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ29uZmlybUFjdGlvbiA9IGFzeW5jIChjaGF0OiBhbnksIGFjdGlvbjogJ2RlbGV0ZScgfCAndXBkYXRlJyB8ICdjcmVhdGUnKSA9PiB7XG4gICAgLy8gU29sbyBwZXJtaXRpciBvcGVyYWNpb25lcyBkZSBhZ2VudGVzIGN1c3RvbSBzaSBsYSBmZWF0dXJlIGZsYWcgZXN0w6EgaGFiaWxpdGFkYVxuICAgIGlmIChzaG91bGRTa2lwQWJtQ29uZmlybVdpdGhvdXRNdWx0aUFnZW50cyhCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChhY3Rpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuZGVsZXRlKVxuICAgICAgaGFuZGxlRGVsZXRlQWdlbnQoY2hhdC5pZCBhcyB1bmtub3duIGFzIHN0cmluZylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBjb3JBY2Nlc3MgPSBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmNvckFjY2VzcyA/PyBERUZBVUxUX0NPUl9BQ0NFU1NcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuY29uZmlybUFjdGlvbiwge1xuICAgICAgb3B0aW9uOiBtb2RhbFZhbHVlcy5pc0VkaXRpbmcgPyAnZWRpdCcgOiAnY3JlYXRlJyxcbiAgICAgIGNvcl9zbHVnczogYnVpbGRBZ2VudFRvb2xHcm91cHNSZXF1ZXN0KGNvckFjY2VzcyksXG4gICAgICBjb3JfYWNjZXNzOiBjb3JBY2Nlc3MsXG4gICAgfSlcbiAgICAvLyBBbCByZWludGVudGFyIGd1YXJkYXIsIGxpYmVyYXIgZWwgZnJlbm8gZGVsIHRpbWVvdXQgcHJldmlvIHBhcmEgcXVlIGxvc1xuICAgIC8vIHVzZUVmZmVjdCBkZSBwb3N0LWd1YXJkYWRvIHZ1ZWx2YW4gYSBwb2RlciBkaXNwYXJhciBzbmFja2JhcnMgeSBjZXJyYXIuXG4gICAgcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYuY3VycmVudCA9IHJlc29sdmVQcm9jZXNzRmlsZXNUaW1lb3V0RmxhZ0JlZm9yZVNhdmUoKVxuICAgIGNvbnN0IHNhdmVBY3Rpb24gPSByZXNvbHZlQWJtU2F2ZUFjdGlvbihtb2RhbFZhbHVlcy5pc0VkaXRpbmcsIHZhbGlkYXRlQWdlbnRWYWx1ZXNJc1NhbWUoKSlcbiAgICBpZiAoc2F2ZUFjdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIGF3YWl0IGhhbmRsZVVwZGF0ZUFnZW50KG1vZGFsVmFsdWVzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChzYXZlQWN0aW9uID09PSAnY3JlYXRlJykge1xuICAgICAgYXdhaXQgaGFuZGxlQ3JlYXRlQWdlbnQobW9kYWxWYWx1ZXMpXG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVTZXRBZ2VudFZhbHVlcyA9IChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50VmFsdWVzIH0gPSBldmVudC5kZXRhaWxcbiAgICAgIHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50ID0gcmVzb2x2ZVBlbmRpbmdBYm1Jbml0aWFsU2VjdGlvbihhZ2VudFZhbHVlcz8uaW5pdGlhbFNlY3Rpb24pXG4gICAgICBoeWRyYXRpbmdBZ2VudElkUmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGdldEFsbEFnZW50TW9kZWxzKClcbiAgICAgIHNldElzT3Blbih0cnVlKVxuICAgICAgc2V0SXNMb2FkaW5nKHRydWUpXG5cbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IGNyZWF0ZVJlc2V0QWJtQWNjZXNzVXBkYXRlQ29udGV4dCgpXG5cbiAgICAgIGNvbnN0IG9wZW5Mb2FkQWN0aW9uID0gcmVzb2x2ZUFibU9wZW5Nb2RhbExvYWRBY3Rpb24oe1xuICAgICAgICBpc0VkaXRpbmc6IGFnZW50VmFsdWVzLnZhbHVlcz8uaXNFZGl0aW5nLFxuICAgICAgICBoYXNNdWx0aUFnZW50c0FjY2VzczogQm9vbGVhbih3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyksXG4gICAgICAgIGhhc1ByZWZldGNoZWRBZ2VudDogQm9vbGVhbihhZ2VudFZhbHVlcy5wcmVmZXRjaGVkQWdlbnRCeUlkKSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChvcGVuTG9hZEFjdGlvbiA9PT0gJ2RlbnlfZWRpdCcpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdlcnJvckFjY2Vzc0RlbmllZCcpKVxuICAgICAgICBzZXRJc09wZW4oZmFsc2UpXG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgICAgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIHByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChvcGVuTG9hZEFjdGlvbiA9PT0gJ3ByZWZldGNoX2VkaXQnKSB7XG4gICAgICAgIGhhbmRsZUNsZWFuQWdlbnQoKVxuICAgICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkUmVmLmN1cnJlbnQgPSBhZ2VudFZhbHVlcy5wcmVmZXRjaGVkQWdlbnRCeUlkXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAob3BlbkxvYWRBY3Rpb24gPT09ICdmZXRjaF9lZGl0Jykge1xuICAgICAgICBoYW5kbGVHZXRBZ2VudEJ5SWQoYWdlbnRWYWx1ZXM/LnZhbHVlcz8uZ2VuZXJhbD8uaWQgYXMgdW5rbm93biBhcyBzdHJpbmcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoYWdlbnRWYWx1ZXMudmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZXMgPSBtZXJnZUFibU9wZW5BZ2VudFZhbHVlcyhpbml0aWFsVmFsdWVzLCBhZ2VudFZhbHVlcy52YWx1ZXMpXG5cbiAgICAgICAgZmlyc3RWYWx1ZUFnZW50LmN1cnJlbnQgPSBuZXh0VmFsdWVzXG4gICAgICAgIHNldE1vZGFsVmFsdWVzKG5leHRWYWx1ZXMpXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc2hvdWxkQXBwbHlQZW5kaW5nU2VjdGlvbkFmdGVyT3BlbihCb29sZWFuKGFnZW50VmFsdWVzLnZhbHVlcz8uaXNFZGl0aW5nKSwgcGVuZGluZ0luaXRpYWxTZWN0aW9uUmVmLmN1cnJlbnQpXG4gICAgICApIHtcbiAgICAgICAgc2V0U2VjdGlvbihwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCBhcyBBYm1TZWN0aW9uKVxuICAgICAgICBwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cblxuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdhYm0tYWdlbnQtbW9kYWwtc2V0LXZhbHVlcycsIGhhbmRsZVNldEFnZW50VmFsdWVzKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm0tYWdlbnQtbW9kYWwtc2V0LXZhbHVlcycsIGhhbmRsZVNldEFnZW50VmFsdWVzIGFzIEV2ZW50TGlzdGVuZXIpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyB1c2VFZmZlY3QgdG8gaGFuZGxlIHRoZSBvdmVyZmxvdyBvZiB0aGUgYm9keSB3aGVuIHRoZSBtb2RhbCBpcyBvcGVuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc09wZW4pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgaWYgKCFib2R5KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxPdmVyZmxvdyA9IGJvZHkuc3R5bGUub3ZlcmZsb3dcbiAgICBib2R5LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBib2R5LnN0eWxlLm92ZXJmbG93ID0gb3JpZ2luYWxPdmVyZmxvd1xuICAgIH1cbiAgfSwgW2lzT3Blbl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVCZWZvcmVVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gICAgICBpZiAoaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IHQoJ2NvbmZpcm1SZWxvYWRCcm93c2VyJylcbiAgICAgICAgcmV0dXJuIHQoJ2NvbmZpcm1SZWxvYWRCcm93c2VyJylcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAoaXNPcGVuKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgaGFuZGxlQmVmb3JlVW5sb2FkKVxuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgaGFuZGxlQmVmb3JlVW5sb2FkKVxuICAgIH1cbiAgfSwgW2lzT3BlbiwgaGFzUGVuZGluZ0NoYW5nZXMsIHRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN1Y2Nlc3NEZWxldGUpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnREZWxldGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3MoKVxuICAgICAgaWYgKHNob3VsZFNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkLCBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSkge1xuICAgICAgICBzZWxlY3RGaXJzdEFnZW50KGN1cnJlbnRTZWxlY3RlZEFnZW50Py5pZCBhcyBzdHJpbmcpXG4gICAgICB9XG4gICAgICByZW1vdmVBZ2VudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKVxuICAgICAgc2V0U2hvd01vZGFsRGVsZXRlKGZhbHNlKVxuICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgIH1cbiAgfSwgW3N1Y2Nlc3NEZWxldGVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFzdWNjZXNzQ3JlYXRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXNob3VsZFJ1bkFibUNyZWF0ZVN1Y2Nlc3NIYW5kbGVyKHN1Y2Nlc3NDcmVhdGUuaWQsIGlzTG9hZGluZ0NyZWF0ZSwgYWdlbnRDcmVhdGVkUmVmLmN1cnJlbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhZ2VudENyZWF0ZWRSZWYuY3VycmVudCA9IHN1Y2Nlc3NDcmVhdGUuaWRcbiAgICBjb25zdCBjcmVhdGVQbGFuID0gcmVzb2x2ZUFibUNyZWF0ZVN1Y2Nlc3NQbGFuKGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQpXG4gICAgY29uc3QgeyBsaXN0QWdlbnQsIHRvZ2dsZUFnZW50IH0gPSByZXNvbHZlQWJtQ3JlYXRlRmF2b3JpdGVBZ2VudHMoXG4gICAgICBzdWNjZXNzQ3JlYXRlLFxuICAgICAgQm9vbGVhbihtb2RhbFZhbHVlcy5nZW5lcmFsLmlzX2Zhdm9yaXRlKVxuICAgIClcblxuICAgIGNvbnN0IGVucXVldWVDcmVhdGVGYXZvcml0ZSA9IChwcm9taXNlczogUHJvbWlzZTx1bmtub3duPltdKSA9PiB7XG4gICAgICBhZGRBZ2VudChsaXN0QWdlbnQpXG4gICAgICBpZiAoc2hvdWxkRW5xdWV1ZUFibUNyZWF0ZUZhdm9yaXRlVG9nZ2xlKHRvZ2dsZUFnZW50KSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGhhbmRsZVRvZ2dsZUZhdm9yaXRlRm9yQWdlbnQoXG4gICAgICAgICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgdG9nZ2xlQWdlbnQsXG4gICAgICAgICAgICAgICgpID0+IHJlc29sdmUoKSxcbiAgICAgICAgICAgICAgKCkgPT4gcmVqZWN0KClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZVBsYW4gIT09ICdhY2Nlc3NPbmx5Jykge1xuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0gcmVzb2x2ZUFibUNyZWF0ZUFjY2Vzc1VwZGF0ZUNvbnRleHQobW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eS5hY2Nlc3NUeXBlKVxuICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdXG4gICAgICBjb25zdCBrbm93bGVkZ2VIYW5kbGVyID0gcmVzb2x2ZUFibUNyZWF0ZUtub3dsZWRnZUhhbmRsZXIoY3JlYXRlUGxhbilcblxuICAgICAgaWYgKGtub3dsZWRnZUhhbmRsZXIgPT09ICdkZWxldGVBbmRDcmVhdGUnKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgaGFuZGxlRGVsZXRlQW5kQ3JlYXRlS25vd2xlZGdlcyh7XG4gICAgICAgICAgICBmaWxlc1RvRGVsZXRlOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlLFxuICAgICAgICAgICAgZmlsZXNUb0NyZWF0ZTogYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZCxcbiAgICAgICAgICAgIGFnZW50SWQ6IHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKGtub3dsZWRnZUhhbmRsZXIgPT09ICdkZWxldGVPbmx5Jykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgIGhhbmRsZURlbGV0ZUtub3dsZWRnZXMoeyBmaWxlczogYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZSwgYWdlbnRJZDogc3VjY2Vzc0NyZWF0ZS5pZC50b1N0cmluZygpIH0pXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSBpZiAoa25vd2xlZGdlSGFuZGxlciA9PT0gJ3VwbG9hZE9ubHknKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgaGFuZGxlQ3JlYXRlS25vd2xlZGdlcyh7IGZpbGVzOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkLCBhZ2VudElkOiBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCkgfSlcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkU3luY0FibUNsaWVudEFjY2Vzc09uQ3JlYXRlKG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkuYWNjZXNzVHlwZSkpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChoYW5kbGVBY2Nlc3NDbGllbnQoc3VjY2Vzc0NyZWF0ZS5pZC50b1N0cmluZygpLCBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5KSlcbiAgICAgIH1cblxuICAgICAgZW5xdWV1ZUNyZWF0ZUZhdm9yaXRlKHByb21pc2VzKVxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgICAgIGlmIChzaG91bGRSZXBlYXREZWxldGVLbm93bGVkZ2VzT25DcmVhdGUoY3JlYXRlUGxhbikpIHtcbiAgICAgICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyh7IGZpbGVzOiBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlLCBhZ2VudElkOiBzdWNjZXNzQ3JlYXRlLmlkLnRvU3RyaW5nKCkgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFNob3dQcm9jZXNzRmlsZXNGb3JDcmVhdGVQbGFuKGNyZWF0ZVBsYW4pKSB7XG4gICAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICBzZXRJc1Nob3dQcm9jZXNzRmlsZXModHJ1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjY2Vzc09ubHlEZWNpc2lvbiA9IHJlc29sdmVBYm1DcmVhdGVBY2Nlc3NPbmx5RGVjaXNpb24oXG4gICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQsXG4gICAgICBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5LmFjY2Vzc1R5cGVcbiAgICApXG4gICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0gYWNjZXNzT25seURlY2lzaW9uLm5leHRDb250ZXh0XG5cbiAgICBpZiAoc2hvdWxkSGFuZGxlQWJtQ3JlYXRlQWNjZXNzT25seUNsaWVudChhY2Nlc3NPbmx5RGVjaXNpb24pKSB7XG4gICAgICBoYW5kbGVBY2Nlc3NDbGllbnQoc3VjY2Vzc0NyZWF0ZS5pZC50b1N0cmluZygpLCBtb2RhbFZhbHVlcy5hY2Nlc3NpYmlsaXR5KVxuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0JlZW5DYWxsZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodG9nZ2xlQWdlbnQpIHtcbiAgICAgIGFkZEFnZW50KGxpc3RBZ2VudClcbiAgICAgIGhhbmRsZVRvZ2dsZUZhdm9yaXRlRm9yQWdlbnQoXG4gICAgICAgIHN1Y2Nlc3NDcmVhdGUuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgdG9nZ2xlQWdlbnQsXG4gICAgICAgIHVwZGF0ZWRBZ2VudCA9PiB7XG4gICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7IG9wdGlvbjogdXBkYXRlZEFnZW50LmlzX2Zhdm9yaXRlID8gJ2FkZCcgOiAncmVtb3ZlJyB9KVxuICAgICAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICAgICAgc2VsZWN0QWdlbnQoeyAuLi5saXN0QWdlbnQsIGlzX2Zhdm9yaXRlOiB1cGRhdGVkQWdlbnQuaXNfZmF2b3JpdGUgfSlcbiAgICAgICAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgICAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdEZhdm9yaXRlLCB7IG9wdGlvbjogJ2FkZCcgfSlcbiAgICAgICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgICAgICAgIHNlbGVjdEFnZW50KGxpc3RBZ2VudClcbiAgICAgICAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUoKVxuICAgICAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICB9XG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgIGFkZEFnZW50KGxpc3RBZ2VudClcbiAgICBzZWxlY3RBZ2VudChsaXN0QWdlbnQpXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgIGhhbmRsZUNsb3NlKClcbiAgfSwgW1xuICAgIGlzTG9hZGluZ0NyZWF0ZSxcbiAgICBzdWNjZXNzQ3JlYXRlLFxuICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVDcmVhdGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIGFkZEFnZW50LFxuICAgIHNlbGVjdEFnZW50LFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgICByZXNldFN1Y2Nlc3NDcmVhdGUsXG4gICAgaGFuZGxlQ2xvc2UsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc3VjY2Vzc1VwZGF0ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXNzaWJpbGl0eUNoYW5nZWQgPSBoYXNBY2Nlc3NpYmlsaXR5Q2hhbmdlZCgpXG4gICAgY29uc3QgdXBkYXRlUGxhbiA9IHJlc29sdmVBYm1VcGRhdGVTdWNjZXNzUGxhbihhY3Rpb25zVG9GaWxlcy5jdXJyZW50LCBhY2Nlc3NpYmlsaXR5Q2hhbmdlZClcblxuICAgIGlmICh1cGRhdGVQbGFuICE9PSAnZ2VuZXJhbE9ubHknICYmIGFjY2Vzc2liaWxpdHlDaGFuZ2VkICYmIHVwZGF0ZVBsYW4gIT09ICdhY2Nlc3NPbmx5Jykge1xuICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0gcmVzb2x2ZUFibVVwZGF0ZUFjY2Vzc1VwZGF0ZUNvbnRleHQoKVxuICAgIH1cblxuICAgIGlmICh1cGRhdGVQbGFuID09PSAnZGVsZXRlQW5kQ3JlYXRlJyAmJiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICBjb25zdCBmaWxlc1RvRGVsZXRlID0gWy4uLmFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGVdXG4gICAgICBjb25zdCBmaWxlc1RvVXBsb2FkID0gWy4uLmFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWRdXG4gICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvRGVsZXRlID0gW11cbiAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQgPSBbXVxuXG4gICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMoe1xuICAgICAgICAgIGZpbGVzVG9EZWxldGUsXG4gICAgICAgICAgZmlsZXNUb0NyZWF0ZTogZmlsZXNUb1VwbG9hZCxcbiAgICAgICAgICBhZ2VudElkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICAuLi4oc2hvdWxkSW5jbHVkZUFjY2Vzc2liaWxpdHlVcGRhdGVJbktub3dsZWRnZUJhdGNoKGFjY2Vzc2liaWxpdHlDaGFuZ2VkKVxuICAgICAgICAgID8gW2hhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSlcbiAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKHRydWUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXBkYXRlUGxhbiA9PT0gJ2RlbGV0ZU9ubHknICYmIG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQpIHtcbiAgICAgIGNvbnN0IGZpbGVzVG9EZWxldGUgPSBbLi4uYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b0RlbGV0ZV1cbiAgICAgIGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9EZWxldGUgPSBbXVxuXG4gICAgICBQcm9taXNlLmFsbChbXG4gICAgICAgIGhhbmRsZURlbGV0ZUtub3dsZWRnZXMoe1xuICAgICAgICAgIGZpbGVzOiBmaWxlc1RvRGVsZXRlLFxuICAgICAgICAgIGFnZW50SWQ6IG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgfSksXG4gICAgICAgIC4uLihzaG91bGRJbmNsdWRlQWNjZXNzaWJpbGl0eVVwZGF0ZUluS25vd2xlZGdlQmF0Y2goYWNjZXNzaWJpbGl0eUNoYW5nZWQpXG4gICAgICAgICAgPyBbaGFuZGxlQWNjZXNzQ2xpZW50KG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQudG9TdHJpbmcoKSwgbW9kYWxWYWx1ZXMuYWNjZXNzaWJpbGl0eSldXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZVBsYW4gPT09ICd1cGxvYWRPbmx5JyAmJiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkKSB7XG4gICAgICBjb25zdCBmaWxlc1RvVXBsb2FkID0gWy4uLmFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWRdXG4gICAgICBhY3Rpb25zVG9GaWxlcy5jdXJyZW50LnRvVXBsb2FkID0gW11cblxuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBoYW5kbGVDcmVhdGVLbm93bGVkZ2VzKHtcbiAgICAgICAgICBmaWxlczogZmlsZXNUb1VwbG9hZCxcbiAgICAgICAgICBhZ2VudElkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksXG4gICAgICAgIH0pLFxuICAgICAgICAuLi4oc2hvdWxkSW5jbHVkZUFjY2Vzc2liaWxpdHlVcGRhdGVJbktub3dsZWRnZUJhdGNoKGFjY2Vzc2liaWxpdHlDaGFuZ2VkKVxuICAgICAgICAgID8gW2hhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSlcbiAgICAgIGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKHRydWUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodXBkYXRlUGxhbiA9PT0gJ2FjY2Vzc09ubHknKSB7XG4gICAgICBjb25zdCBhY2Nlc3NPbmx5Q29udGV4dCA9IHJlc29sdmVBYm1VcGRhdGVBY2Nlc3NPbmx5Q29udGV4dChhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQpXG4gICAgICBpZiAoYWNjZXNzT25seUNvbnRleHQpIHtcbiAgICAgICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0gYWNjZXNzT25seUNvbnRleHRcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGFsVmFsdWVzLmdlbmVyYWwuaWQgJiYgIWFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNCZWVuQ2FsbGVkKSB7XG4gICAgICAgIGhhbmRsZUFjY2Vzc0NsaWVudChtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLnRvU3RyaW5nKCksIG1vZGFsVmFsdWVzLmFjY2Vzc2liaWxpdHkpXG4gICAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudC5oYXNCZWVuQ2FsbGVkID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2hvdWxkRmluYWxpemVBYm1VcGRhdGVXaXRob3V0UGVuZGluZ1dvcmsoe1xuICAgICAgICBoYXNQZW5kaW5nRmlsZXM6IGhhc1BlbmRpbmdGaWxlc1JlZi5jdXJyZW50LFxuICAgICAgICBpc1Nob3dQcm9jZXNzRmlsZXMsXG4gICAgICAgIHRvVXBsb2FkQ291bnQ6IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQudG9VcGxvYWQubGVuZ3RoLFxuICAgICAgICBhY2Nlc3NIYXNBY3Rpb25GaWxlczogYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50Lmhhc0FjdGlvbkZpbGVzLFxuICAgICAgICBzdWNjZXNzVXBkYXRlQWNjZXNzLFxuICAgICAgICBwcm9jZXNzRmlsZXNUaW1lZE91dDogcHJvY2Vzc0ZpbGVzVGltZWRPdXRSZWYuY3VycmVudCxcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50VXBkYXRlZCcpKVxuICAgICAgdXBkYXRlQWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIGlmIChzaG91bGRTeW5jU2VsZWN0ZWRBZ2VudEFmdGVyTXV0YXRpb24oY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkLCBzdWNjZXNzVXBkYXRlLmlkKSkge1xuICAgICAgICBzZWxlY3RBZ2VudChzdWNjZXNzVXBkYXRlKVxuICAgICAgfVxuICAgICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZSgpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJykpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfVxuICB9LCBbXG4gICAgc3VjY2Vzc1VwZGF0ZSxcbiAgICBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkLFxuICAgIGhhbmRsZURlbGV0ZUFuZENyZWF0ZUtub3dsZWRnZXMsXG4gICAgaGFuZGxlRGVsZXRlS25vd2xlZGdlcyxcbiAgICBoYW5kbGVDcmVhdGVLbm93bGVkZ2VzLFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIHVwZGF0ZUFnZW50LFxuICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSxcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGUsXG4gICAgaGFuZGxlQ2xvc2UsXG4gIF0pXG5cbiAgY29uc3QgaGFuZGxlUHJvY2Vzc0ZpbGVzVGltZW91dCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXNob3VsZFJ1bkFibVByb2Nlc3NGaWxlc1RpbWVvdXQoaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQsIGlzU2hvd1Byb2Nlc3NGaWxlcykpIHJldHVyblxuXG4gICAgLy8gQWwgY3VtcGxpcnNlIGVsIHRpbWVvdXQgYXN1bWltb3MgcXVlIGVsIGd1YXJkYWRvIGRlbCBhZ2VudGUgZnVlIGV4aXRvc29cbiAgICAvLyAoZWwgc2VydmVyIHJlc3BvbmRpw7MgT0spIHkgcXVlIGxvcyBhcmNoaXZvcyBzZSBlbnZpYXJvbiBjb3JyZWN0YW1lbnRlLlxuICAgIC8vIFNvbG8gcGVyZGltb3MgbGEgY29uZmlybWFjacOzbiBhc2luY3LDs25pY2EgZGVsIFdlYlNvY2tldCBzb2JyZSBzdVxuICAgIC8vIHByb2Nlc2FtaWVudG8uIENlcnJhbW9zIHRvZG8gbW9zdHJhbmRvIGVsIHNuYWNrYmFyIGRlIMOpeGl0byBxdWUgaHViaWVzZVxuICAgIC8vIGRpc3BhcmFkbyBlbCBmbHVqbyBub3JtYWwgZGUgw6l4aXRvLlxuXG4gICAgLy8gRnJlbm8gcGFyYSBxdWUgbG9zIHVzZUVmZmVjdCBkZSBwb3N0LWd1YXJkYWRvIG5vIHJlLWRpc3BhcmVuIHNuYWNrYmFyc1xuICAgIC8vIG8gY2llcnJlcyBkdXBsaWNhZG9zIGN1YW5kbyBzZXRJc1Nob3dQcm9jZXNzRmlsZXMoZmFsc2UpIGxvcyBnYXRpbGxlLlxuICAgIHByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmLmN1cnJlbnQgPSB0cnVlXG5cbiAgICBpZiAobW9kYWxWYWx1ZXMuaXNFZGl0aW5nICYmIHN1Y2Nlc3NVcGRhdGUpIHtcbiAgICAgIHVwZGF0ZUFnZW50KHN1Y2Nlc3NVcGRhdGUpXG4gICAgICBpZiAoc2hvdWxkU3luY1NlbGVjdGVkQWdlbnRBZnRlck11dGF0aW9uKGN1cnJlbnRTZWxlY3RlZEFnZW50Py5pZCwgc3VjY2Vzc1VwZGF0ZS5pZCkpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKSlcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KHJlc29sdmVBYm1Qcm9jZXNzRmlsZXNUaW1lb3V0U3VjY2Vzc0tleSh0cnVlKSkpXG4gICAgICByZXNldFN1Y2Nlc3NVcGRhdGUoKVxuICAgIH0gZWxzZSBpZiAoIW1vZGFsVmFsdWVzLmlzRWRpdGluZyAmJiBzdWNjZXNzQ3JlYXRlKSB7XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModChyZXNvbHZlQWJtUHJvY2Vzc0ZpbGVzVGltZW91dFN1Y2Nlc3NLZXkoZmFsc2UpKSlcbiAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgfVxuXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSgpXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICByZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3MoKVxuXG4gICAgaGFuZGxlQ2xvc2UoKVxuICB9LCBbXG4gICAgaXNTaG93UHJvY2Vzc0ZpbGVzLFxuICAgIG1vZGFsVmFsdWVzLmlzRWRpdGluZyxcbiAgICBzdWNjZXNzVXBkYXRlLFxuICAgIHN1Y2Nlc3NDcmVhdGUsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgY3VycmVudFNlbGVjdGVkQWdlbnQ/LmlkLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIGhhbmRsZVNuYWNrYmFyU3VjY2VzcyxcbiAgICB0LFxuICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZSxcbiAgICByZXNldFN1Y2Nlc3NDcmVhdGUsXG4gICAgaGFuZGxlUmVzZXRTdWNjZXNzU2F2ZSxcbiAgICBoYW5kbGVSZXNldFN1Y2Nlc3NEZWxldGUsXG4gICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzLFxuICAgIGhhbmRsZUNsb3NlLFxuICBdKVxuXG4gIGNvbnN0IHdlYlNvY2tldEZ1bmN0aW9uID0gKHsgbW9kZWxfZGF0YTogbW9kZWxEYXRhIH06IHsgbW9kZWxfZGF0YTogYW55IH0pID0+IHtcbiAgICBjb25zdCBmaWxlU3RhdHVzID0gbW9kZWxEYXRhXG4gICAgaWYgKHNob3VsZFByb2Nlc3NLbm93bGVkZ2VXc1N0YXR1cyhmaWxlU3RhdHVzLnN0YXR1cykpIHtcbiAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkS25vd2xlZGdlID0gYXBwbHlLbm93bGVkZ2VGaWxlU3RhdHVzVXBkYXRlKHByZXYua25vd2xlZGdlLCBmaWxlU3RhdHVzKVxuICAgICAgICBjb25zdCB1cGxvYWRPdXRjb21lID0gcmVzb2x2ZUtub3dsZWRnZVVwbG9hZE91dGNvbWUodXBkYXRlZEtub3dsZWRnZSlcbiAgICAgICAgY29uc3Qgd3NFZmZlY3RzID0gcmVzb2x2ZUtub3dsZWRnZVdzQ29tcGxldGlvbkVmZmVjdHMoXG4gICAgICAgICAgdXBsb2FkT3V0Y29tZSxcbiAgICAgICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQsXG4gICAgICAgICAgYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50LFxuICAgICAgICAgIGZpbGVzRmluaXNoZWRSZWYuY3VycmVudFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKHdzRWZmZWN0cz8uY2xvc2VQcm9jZXNzRmlsZXMpIHtcbiAgICAgICAgICBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgc2V0SXNTaG93UHJvY2Vzc0ZpbGVzKGZhbHNlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwbG9hZE91dGNvbWUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQocmVzb2x2ZUFibUtub3dsZWRnZUVycm9yTWVzc2FnZUtleShtb2RhbFZhbHVlcy5pc0VkaXRpbmcpKSlcbiAgICAgICAgfSBlbHNlIGlmICh3c0VmZmVjdHM/LmluY3JlbWVudEZpbGVzUHJvY2Vzc2VkKSB7XG4gICAgICAgICAgaWYgKHdzRWZmZWN0cy5tYXJrRmlsZXNGaW5pc2hlZEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgZmlsZXNGaW5pc2hlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRGaWxlc1Byb2Nlc3NlZChwcmV2Q291bnQgPT4gcHJldkNvdW50ICsgMSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAga25vd2xlZGdlOiB1cGRhdGVkS25vd2xlZGdlLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN1Y2Nlc3NLbm93bGVkZ2VEZWxldGUgJiYgIWlzTG9hZGluZ0tub3dsZWRnZSAmJiAhZXJyb3JLbm93bGVkZ2UpIHtcbiAgICAgIC8vIFNvbG8gY2VycmFyIHNpIE5PIGhheSBhcmNoaXZvcyBzaWVuZG8gcHJvY2VzYWRvc1xuICAgICAgaWYgKFxuICAgICAgICBzaG91bGRCbG9ja0tub3dsZWRnZURlbGV0ZVN1Y2Nlc3NDbG9zZSh7XG4gICAgICAgICAgaGFzUGVuZGluZ0ZpbGVzOiBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCxcbiAgICAgICAgICBpc1Nob3dQcm9jZXNzRmlsZXMsXG4gICAgICAgICAgdG9VcGxvYWRDb3VudDogYWN0aW9uc1RvRmlsZXMuY3VycmVudC50b1VwbG9hZC5sZW5ndGgsXG4gICAgICAgICAgcHJvY2Vzc0ZpbGVzVGltZWRPdXQ6IHByb2Nlc3NGaWxlc1RpbWVkT3V0UmVmLmN1cnJlbnQsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50VXBkYXRlZCcpKVxuICAgICAgaGFuZGxlUmVzZXRTdWNjZXNzRGVsZXRlKClcbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICB9XG4gICAgaWYgKGVycm9yS25vd2xlZGdlKSB7XG4gICAgICBoYW5kbGVTbmFja2JhckVycm9yKHQocmVzb2x2ZUFibUtub3dsZWRnZUVycm9yTWVzc2FnZUtleShtb2RhbFZhbHVlcy5pc0VkaXRpbmcpKSlcbiAgICAgIGhhbmRsZVJlc2V0U3VjY2Vzc0RlbGV0ZSgpXG4gICAgfVxuICB9LCBbc3VjY2Vzc0tub3dsZWRnZURlbGV0ZSwgaXNMb2FkaW5nS25vd2xlZGdlLCBlcnJvcktub3dsZWRnZSwgaXNTaG93UHJvY2Vzc0ZpbGVzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnRcblxuICAgIC8vIFNpIGhheSBhcmNoaXZvcyBzaWVuZG8gcHJvY2VzYWRvcywgZXNwZXJhciBhIHF1ZSB0ZXJtaW5lblxuICAgIGlmIChzaG91bGREZWZlckFjY2Vzc1VwZGF0ZVVudGlsRmlsZXNDb21wbGV0ZShjb250ZXh0LCBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCwgaXNTaG93UHJvY2Vzc0ZpbGVzKSkge1xuICAgICAgLy8gU2kgc3VjY2Vzc1VwZGF0ZUFjY2VzcyBlc3TDoSBhY3Rpdm8sIG1hcmNhciBjb21vIG1hbmVqYWRvIHBlcm8gTk8gcmVzZXRlYXIgaGFzdGEgcXVlIHRlcm1pbmVuIGxvcyBhcmNoaXZvc1xuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MgJiYgIWFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCkge1xuICAgICAgICBhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTaSB5YSBmdWUgbWFuZWphZG8geSBubyBoYXkgYXJjaGl2b3MgcGVuZGllbnRlcywgZWplY3V0YXIgZWwgY2llcnJlXG4gICAgaWYgKGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCAmJiBjb250ZXh0Lmhhc0FjdGlvbkZpbGVzICYmIGNvbnRleHQub3BlcmF0aW9uVHlwZSA9PT0gJ2NyZWF0ZScpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgaWYgKHN1Y2Nlc3NVcGRhdGVBY2Nlc3MpIHtcbiAgICAgICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcbiAgICAgIH1cbiAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IGNyZWF0ZVJlc2V0QWJtQWNjZXNzVXBkYXRlQ29udGV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXN1Y2Nlc3NVcGRhdGVBY2Nlc3MpIHtcbiAgICAgIGFjY2Vzc0hhbmRsZWRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYWNjZXNzSGFuZGxlZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgcmVzZXRTdWNjZXNzVXBkYXRlQWNjZXNzKClcblxuICAgIGlmIChjb250ZXh0Lm9wZXJhdGlvblR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAvLyBTaSBoYXkgYXJjaGl2b3MsIGVsIGFnZW50ZSB5YSBmdWUgYWdyZWdhZG8geSBlbCB0b2dnbGUgeWEgc2UgaGl6byBlbiBzdWNjZXNzQ3JlYXRlXG4gICAgICAvLyBTb2xvIG5lY2VzaXRhbW9zIGNlcnJhciBlbCBtb2RhbFxuICAgICAgaWYgKGNvbnRleHQuaGFzQWN0aW9uRmlsZXMpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gU2kgZWwgYWdlbnRlIGZ1ZSBjcmVhZG8gY29uIGZhdm9yaXRvLCBuZWNlc2l0YW1vcyBvcmRlbmFyIGRlc3B1w6lzIGRlIGFncmVnYXJsb1xuICAgICAgY29uc3QgeyBsaXN0QWdlbnQsIHRvZ2dsZUFnZW50IH0gPSByZXNvbHZlQWJtQ3JlYXRlRmF2b3JpdGVBZ2VudHMoXG4gICAgICAgIHN1Y2Nlc3NDcmVhdGUsXG4gICAgICAgIEJvb2xlYW4obW9kYWxWYWx1ZXMuZ2VuZXJhbC5pc19mYXZvcml0ZSlcbiAgICAgIClcblxuICAgICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzKHQoJ2NvbmZpcm1BZ2VudENyZWF0ZWQnKSlcbiAgICAgIGFkZEFnZW50KGxpc3RBZ2VudClcbiAgICAgIHNlbGVjdEFnZW50KGxpc3RBZ2VudClcblxuICAgICAgaWYgKHRvZ2dsZUFnZW50KSB7XG4gICAgICAgIGhhbmRsZVRvZ2dsZUZhdm9yaXRlRm9yQWdlbnQoXG4gICAgICAgICAgc3VjY2Vzc0NyZWF0ZS5pZC50b1N0cmluZygpLFxuICAgICAgICAgIHRvZ2dsZUFnZW50LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIENlcnJhciBkZXNwdcOpcyBkZSBxdWUgZWwgdG9nZ2xlIGNvbXBsZXRlIHkgYWN0dWFsaWNlIGVsIGVzdGFkb1xuICAgICAgICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgICAgICAgIGhhbmRsZUNsb3NlKClcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc2V0U3VjY2Vzc0NyZWF0ZSgpXG4gICAgICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250ZXh0Lm9wZXJhdGlvblR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50VXBkYXRlZCcpKVxuICAgICAgdXBkYXRlQWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIGlmIChjdXJyZW50U2VsZWN0ZWRBZ2VudD8uaWQgPT09IHN1Y2Nlc3NVcGRhdGUuaWQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQoc3VjY2Vzc1VwZGF0ZSlcbiAgICAgIH1cbiAgICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZSgpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgncmVmZXRjaC1zZXNzaW9uJykpXG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgfVxuXG4gICAgYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50ID0gY3JlYXRlUmVzZXRBYm1BY2Nlc3NVcGRhdGVDb250ZXh0KClcbiAgfSwgW3N1Y2Nlc3NVcGRhdGVBY2Nlc3MsIGZpbGVzUHJvY2Vzc2VkXSlcblxuICAvLyB1c2VFZmZlY3QgcGFyYSBtYW5lamFyIGVsIGNpZXJyZSBkZWwgbW9kYWwgY3VhbmRvIHRlcm1pbmFuIGxvcyBhcmNoaXZvcyBlbiBjcmVhY2nDs24gc2luIGFjY2VzaWJpbGlkYWRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYWNjZXNzVXBkYXRlQ29udGV4dC5jdXJyZW50XG5cbiAgICBpZiAoXG4gICAgICBzaG91bGRDbG9zZUNyZWF0ZUFmdGVyS25vd2xlZGdlV2l0aG91dEFjY2Vzcyh7XG4gICAgICAgIG9wZXJhdGlvblR5cGU6IGNvbnRleHQub3BlcmF0aW9uVHlwZSxcbiAgICAgICAgaGFzQWN0aW9uRmlsZXM6IGNvbnRleHQuaGFzQWN0aW9uRmlsZXMsXG4gICAgICAgIGZpbGVzRmluaXNoZWQ6IGZpbGVzRmluaXNoZWRSZWYuY3VycmVudCxcbiAgICAgICAgaGFzU3VjY2Vzc0NyZWF0ZTogQm9vbGVhbihzdWNjZXNzQ3JlYXRlKSxcbiAgICAgICAgaGFzUGVuZGluZ0ZpbGVzOiBoYXNQZW5kaW5nRmlsZXNSZWYuY3VycmVudCxcbiAgICAgICAgaXNTaG93UHJvY2Vzc0ZpbGVzLFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyU3VjY2Vzcyh0KCdjb25maXJtQWdlbnRDcmVhdGVkJykpXG4gICAgICByZXNldFN1Y2Nlc3NDcmVhdGUoKVxuICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgZmlsZXNGaW5pc2hlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGFjY2Vzc1VwZGF0ZUNvbnRleHQuY3VycmVudCA9IGNyZWF0ZVJlc2V0QWJtQWNjZXNzVXBkYXRlQ29udGV4dCgpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2hvdWxkQ2xvc2VDcmVhdGVBZnRlcktub3dsZWRnZVdpdGhBY2Nlc3Moe1xuICAgICAgICBvcGVyYXRpb25UeXBlOiBjb250ZXh0Lm9wZXJhdGlvblR5cGUsXG4gICAgICAgIGhhc0FjdGlvbkZpbGVzOiBjb250ZXh0Lmhhc0FjdGlvbkZpbGVzLFxuICAgICAgICBhY2Nlc3NIYW5kbGVkOiBhY2Nlc3NIYW5kbGVkUmVmLmN1cnJlbnQsXG4gICAgICAgIGhhc1N1Y2Nlc3NDcmVhdGU6IEJvb2xlYW4oc3VjY2Vzc0NyZWF0ZSksXG4gICAgICAgIGhhc1BlbmRpbmdGaWxlczogaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQsXG4gICAgICAgIGlzU2hvd1Byb2Nlc3NGaWxlcyxcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBoYW5kbGVTbmFja2JhclN1Y2Nlc3ModCgnY29uZmlybUFnZW50Q3JlYXRlZCcpKVxuICAgICAgcmVzZXRTdWNjZXNzQ3JlYXRlKClcbiAgICAgIGlmIChzaG91bGRSZXNldFN1Y2Nlc3NVcGRhdGVBY2Nlc3NPbkNyZWF0ZUNsb3NlKEJvb2xlYW4oc3VjY2Vzc1VwZGF0ZUFjY2VzcykpKSB7XG4gICAgICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzcygpXG4gICAgICB9XG4gICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICBhY2Nlc3NVcGRhdGVDb250ZXh0LmN1cnJlbnQgPSBjcmVhdGVSZXNldEFibUFjY2Vzc1VwZGF0ZUNvbnRleHQoKVxuICAgIH1cbiAgfSwgW1xuICAgIGZpbGVzUHJvY2Vzc2VkLFxuICAgIHN1Y2Nlc3NDcmVhdGUsXG4gICAgc3VjY2Vzc1VwZGF0ZUFjY2VzcyxcbiAgICBpc1Nob3dQcm9jZXNzRmlsZXMsXG4gICAgaGFuZGxlU25hY2tiYXJTdWNjZXNzLFxuICAgIHQsXG4gICAgcmVzZXRTdWNjZXNzQ3JlYXRlLFxuICAgIHJlc2V0U3VjY2Vzc1VwZGF0ZUFjY2VzcyxcbiAgICBoYW5kbGVDbG9zZSxcbiAgXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc1Nob3dQcm9jZXNzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSByZXNvbHZlQWJtS25vd2xlZGdlV3NDaGFubmVsKGFnZW50QnlJZCwgc3VjY2Vzc0NyZWF0ZT8uaWQgPz8gbnVsbClcbiAgICAgIGlmICghY2hhbm5lbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICgkX3NjKSB7XG4gICAgICAgIGlmIChpc1N1YnNjcmliZWQpIHtcbiAgICAgICAgICAkX3NjPy5zdWJzY3JpYmVIYW5kbGVyKGNoYW5uZWwsIHdlYlNvY2tldEZ1bmN0aW9uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG1vZGVsRGF0YSA9IHtcbiAgICAgICAgICAgIG1vZGVsX2hhc2g6IGNoYW5uZWwsXG4gICAgICAgICAgICBhY3Rpb246ICRfc2M/LmFjdGlvblR5cGU/LlNVQlNDUklCRSxcbiAgICAgICAgICB9XG4gICAgICAgICAgJF9zYz8udXBkYXRlQ29ubmVjdGlvbk1vZGVsKG1vZGVsRGF0YSwgY2hhbm5lbCwgdXNlciwgdXNlciwgJF9zYy5jaGFubmVsVHlwZT8uTU9ERUxfQ0hBTk5FTClcbiAgICAgICAgICBzZXRJc1N1YnNjcmliZWQodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwgW2lzU2hvd1Byb2Nlc3NGaWxlcywgaXNTdWJzY3JpYmVkLCAkX3NjLCBhZ2VudEJ5SWQsIHN1Y2Nlc3NDcmVhdGVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc09wZW4gfHwgIWFnZW50TW9kZWxzLmxlbmd0aCkgcmV0dXJuXG4gICAgaWYgKGFnZW50TG9hZGluZyAmJiAhcHJlZmV0Y2hlZEFnZW50QnlJZFJlZi5jdXJyZW50KSByZXR1cm5cblxuICAgIGNvbnN0IGFwcGx5RWRpdGluZ0FnZW50ID0gYXN5bmMgKHNvdXJjZTogYW55KSA9PiB7XG4gICAgICBpZiAoIWNhbkFwcGx5QWJtRWRpdGluZ0FnZW50RGV0YWlsKHNvdXJjZSwgQm9vbGVhbih3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUykpKSB7XG4gICAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnZXJyb3JBY2Nlc3NEZW5pZWQnKSlcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgIH0sIDMwMDApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgY29uc3QgYWdlbnRJZCA9IHNvdXJjZS5pZCAhPSBudWxsID8gU3RyaW5nKHNvdXJjZS5pZCkgOiBudWxsXG4gICAgICBpZiAoYWdlbnRJZCAmJiBoeWRyYXRpbmdBZ2VudElkUmVmLmN1cnJlbnQgPT09IGFnZW50SWQpIHJldHVybiB0cnVlXG4gICAgICBoeWRyYXRpbmdBZ2VudElkUmVmLmN1cnJlbnQgPSBhZ2VudElkXG5cbiAgICAgIGxldCBhZ2VudFZhbHVlc1RvU2V0ID0gYnVpbGRFZGl0aW5nTW9kYWxWYWx1ZXNGcm9tQWdlbnREZXRhaWwoc291cmNlLCBhZ2VudE1vZGVscywgbW9kYWxWYWx1ZXMpXG4gICAgICAvLyBLZWVwIHRoZSBsb2FkaW5nIHZpZXcgdW50aWwgYm90aCB0aGUgYWdlbnQgYW5kIGl0cyBjb25uZWN0b3Igc3RhdHVzIGFyZSByZWFkeS5cbiAgICAgIGlmIChzaG91bGRIeWRyYXRlQWdlbnRDb25uZWN0b3JzT25FZGl0KGFnZW50SWQsIGhhc01haWFFeHRlcm5hbENvbm5lY3RvcnNBY2Nlc3MoKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb25uZWN0b3JzID0gYXdhaXQgZ2V0QWdlbnRDb25uZWN0b3JzKGFnZW50SWQgYXMgc3RyaW5nKVxuICAgICAgICAgIGFnZW50VmFsdWVzVG9TZXQgPSB7XG4gICAgICAgICAgICAuLi5hZ2VudFZhbHVlc1RvU2V0LFxuICAgICAgICAgICAgYWNjZXNzaWJpbGl0eToge1xuICAgICAgICAgICAgICAuLi5hZ2VudFZhbHVlc1RvU2V0LmFjY2Vzc2liaWxpdHksXG4gICAgICAgICAgICAgIHNlbGVjdGVkQ29ubmVjdG9yczogZGVyaXZlQXNzaWduZWRDb25uZWN0b3JTbHVncyhjb25uZWN0b3JzKSxcbiAgICAgICAgICAgICAgY29ubmVjdG9yU3RhdHVzZXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICBjb25uZWN0b3JzLm1hcChjb25uZWN0b3IgPT4gW1xuICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLnNsdWcsXG4gICAgICAgICAgICAgICAgICBjb25uZWN0b3IuY29ubmVjdGlvbl9zdGF0dXMgfHwgKGNvbm5lY3Rvci51c2VyX2F1dGhvcml6ZWQgPyAnb2snIDogJ25lZWRzX2F0dGVudGlvbicpLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBhZ2VudCBjb25uZWN0b3JzOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaHlkcmF0aW5nQWdlbnRJZFJlZi5jdXJyZW50ICE9PSBhZ2VudElkKSByZXR1cm4gZmFsc2VcbiAgICAgIGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50ID0gYWdlbnRWYWx1ZXNUb1NldFxuICAgICAgc2V0TW9kYWxWYWx1ZXMoYWdlbnRWYWx1ZXNUb1NldClcbiAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgIGlmIChwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCkge1xuICAgICAgICBzZXRTZWN0aW9uKHBlbmRpbmdJbml0aWFsU2VjdGlvblJlZi5jdXJyZW50KVxuICAgICAgICBwZW5kaW5nSW5pdGlhbFNlY3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmV0Y2hlZCA9IHByZWZldGNoZWRBZ2VudEJ5SWRSZWYuY3VycmVudFxuICAgIGlmIChwcmVmZXRjaGVkKSB7XG4gICAgICBwcmVmZXRjaGVkQWdlbnRCeUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhcHBseUVkaXRpbmdBZ2VudChwcmVmZXRjaGVkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGFnZW50QnlJZCAmJiAhYWdlbnRMb2FkaW5nICYmIGFnZW50TW9kZWxzLmxlbmd0aCkge1xuICAgICAgYXBwbHlFZGl0aW5nQWdlbnQoYWdlbnRCeUlkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2hvdWxkU2V0RGVmYXVsdEFpTW9kZWxGb3JOZXdBZ2VudCh7XG4gICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgYWdlbnRMb2FkaW5nLFxuICAgICAgICBoYXNBZ2VudEJ5SWQ6IEJvb2xlYW4oYWdlbnRCeUlkKSxcbiAgICAgICAgaXNFZGl0aW5nOiBtb2RhbFZhbHVlcy5pc0VkaXRpbmcsXG4gICAgICB9KVxuICAgICkge1xuICAgICAgc2V0TW9kYWxWYWx1ZXMocHJldiA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBnZW5lcmFsOiB7XG4gICAgICAgICAgLi4ucHJldi5nZW5lcmFsLFxuICAgICAgICAgIGFpTW9kZWw6IGFnZW50TW9kZWxzWzBdLFxuICAgICAgICB9LFxuICAgICAgfSkpXG4gICAgfVxuICB9LCBbYWdlbnRCeUlkLCBpc09wZW4sIGlzTG9hZGluZywgYWdlbnRMb2FkaW5nLCBhZ2VudE1vZGVscz8ubGVuZ3RoLCBtb2RhbFZhbHVlcy5pc0VkaXRpbmcsIHRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVycm9yR2V0QWdlbnRCeUlkKSB7XG4gICAgICBpZiAoaXNBYm1BY2Nlc3NEZW5pZWRFcnJvcihlcnJvckdldEFnZW50QnlJZCkpIHtcbiAgICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcih0KCdlcnJvckFjY2Vzc0RlbmllZCcpKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICAgIH0sIDMwMDApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaGFuZGxlU25hY2tiYXJFcnJvcihlcnJvckdldEFnZW50QnlJZClcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBoYW5kbGVDbG9zZSgpXG4gICAgICB9LCAzMDAwKVxuICAgIH1cbiAgfSwgW2Vycm9yR2V0QWdlbnRCeUlkXSlcblxuICBjb25zdCBzaG91bGREaXNhYmxlU2F2ZUZvckNsaWVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+IGhhc0luYWN0aXZlQWNjZXNzaWJpbGl0eUNsaWVudHMobW9kYWxWYWx1ZXM/LmFjY2Vzc2liaWxpdHk/LmNsaWVudHMpLFxuICAgIFttb2RhbFZhbHVlcz8uYWNjZXNzaWJpbGl0eT8uY2xpZW50c11cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUZhdm9yaXRlID0gKCkgPT4ge1xuICAgIGlmIChtb2RhbFZhbHVlcz8uZ2VuZXJhbD8uaWQpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGFnZW50XG4gICAgICB0b2dnbGVGYXZvcml0ZShcbiAgICAgICAgbW9kYWxWYWx1ZXMuZ2VuZXJhbC5pZCxcbiAgICAgICAgdXBkYXRlZEFnZW50ID0+IHtcbiAgICAgICAgICBzZXRNb2RhbFZhbHVlcyhwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgZ2VuZXJhbDoge1xuICAgICAgICAgICAgICAuLi5wcmV2LmdlbmVyYWwsXG4gICAgICAgICAgICAgIGlzX2Zhdm9yaXRlOiB1cGRhdGVkQWdlbnQuaXNfZmF2b3JpdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC8vIEFjdHVhbGl6YXIgZWwgZXN0YWRvIGRlIGFnZW50ZXMgeSBvcmRlbmFyIGN1YW5kbyBzZSBoYWNlIGRlc2RlIGVsIG1vZGFsIEFCTVxuICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGUodXBkYXRlZEFnZW50LCB0cnVlKVxuICAgICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRGYXZvcml0ZSwge1xuICAgICAgICAgICAgb3B0aW9uOiB1cGRhdGVkQWdlbnQuaXNfZmF2b3JpdGUgPyAnYWRkJyA6ICdyZW1vdmUnLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgbW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBuZXcgYWdlbnRcbiAgICAgIHNldE1vZGFsVmFsdWVzKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgZ2VuZXJhbDoge1xuICAgICAgICAgIC4uLnByZXYuZ2VuZXJhbCxcbiAgICAgICAgICBpc19mYXZvcml0ZTogcmVzb2x2ZUFibURyYWZ0RmF2b3JpdGVWYWx1ZShwcmV2LmdlbmVyYWwuaXNfZmF2b3JpdGUpLFxuICAgICAgICB9LFxuICAgICAgfSkpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFzZWxlY3RvcikgcmV0dXJuIG51bGxcblxuICBpZiAoIWlzT3BlbiB8fCAhY2FuUmVuZGVyQWJtQWdlbnRNb2RhbCh1c2VyUGVybWlzc2lvbnMpKSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoXG4gICAgPEJhY2tkcm9wIHpJbmRleD17YWJtQWdlbnRNb2RhbFpJbmRleH0gb25DbGljaz17aGFuZGxlQmFja2Ryb3BDbGlja30+XG4gICAgICA8U0NBQU1XcmFwcGVyIHJlZj17bW9kYWxSZWZ9IHRhYkluZGV4PXstMX0+XG4gICAgICAgIHtpc0xvYWRpbmcgPyAoXG4gICAgICAgICAgPFNDQUFNV3JhcHBlclNwaW5uZXI+XG4gICAgICAgICAgICA8U0NBQU1XcmFwcGVyU3Bpbm5lckNvbnRlbnQ+XG4gICAgICAgICAgICAgIDxTcGlubmVyTG90dGllIHNpemU9XCI4MHB4XCIgY29sb3I9XCJwcmltYXJ5XCIgLz5cbiAgICAgICAgICAgIDwvU0NBQU1XcmFwcGVyU3Bpbm5lckNvbnRlbnQ+XG4gICAgICAgICAgPC9TQ0FBTVdyYXBwZXJTcGlubmVyPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICB7c2hvdWxkU2hvd0FibUxvYWRlckZpbGVzKGlzU2hvd1Byb2Nlc3NGaWxlcywgaGFzUGVuZGluZ0ZpbGVzUmVmLmN1cnJlbnQpID8gKFxuICAgICAgICAgICAgICA8QWJtTG9hZGVyRmlsZXNcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50cz17bW9kYWxWYWx1ZXMua25vd2xlZGdlfVxuICAgICAgICAgICAgICAgIGxhYmVsPXt0KHJlc29sdmVBYm1Qcm9jZXNzaW5nS25vd2xlZGdlTGFiZWxLZXkobW9kYWxWYWx1ZXMuaXNFZGl0aW5nKSl9XG4gICAgICAgICAgICAgICAgb25UaW1lb3V0PXtoYW5kbGVQcm9jZXNzRmlsZXNUaW1lb3V0fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8U0NBQU1IZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8U0NBQU1IZWFkZXJMZWZ0PlxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgIHpJbmRleD17dG9vbHRpcFpJbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17dChyZXNvbHZlQWJtRmF2b3JpdGVUb29sdGlwS2V5KEJvb2xlYW4obW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlKSkpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDQUFNSGVhZGVyRmF2b3JpdGUgb25DbGljaz17aGFuZGxlVG9nZ2xlRmF2b3JpdGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9ezIwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezIwfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17bW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlID8gJyNGRkM2MjQnIDogJyNhNmE2YTYnfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPXttb2RhbFZhbHVlcz8uZ2VuZXJhbD8uaXNfZmF2b3JpdGUgPyAnI0ZGQzYyNCcgOiAnbm9uZSd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzb2xpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17bW9kYWxWYWx1ZXM/LmdlbmVyYWw/LmlzX2Zhdm9yaXRlID8gJycgOiAnc3Rhci1mYXZvcml0ZS1pY29uJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTUhlYWRlckZhdm9yaXRlPlxuICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlclRpdGxlPnt0KHJlc29sdmVBYm1Nb2RhbFRpdGxlS2V5KEJvb2xlYW4obW9kYWxWYWx1ZXM/LmlzRWRpdGluZykpKX08L1NDQUFNSGVhZGVyVGl0bGU+XG4gICAgICAgICAgICAgICAgICA8L1NDQUFNSGVhZGVyTGVmdD5cbiAgICAgICAgICAgICAgICAgIDxTQ0FBTUhlYWRlckNsb3NlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuY2FuY2VsTW9kYWwpXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2hvdWxkRGlzYWJsZUFibUhlYWRlckNsb3NlKFxuICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdLbm93bGVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nQ3JlYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ1VwZGF0ZUFjY2Vzc1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Q3Jvc3MgY29sb3I9XCIjYTZhNmE2XCIgd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgPC9TQ0FBTUhlYWRlckNsb3NlQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvU0NBQU1IZWFkZXI+XG4gICAgICAgICAgICAgICAgPFNDQUFNQ29udGVudCBoYXNTY3JvbGw9e3NlY3Rpb24gIT09ICdrbm93bGVkZ2UnfT5cbiAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXI+XG4gICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXJJdGVtXG4gICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU9e3NlY3Rpb24gPT09ICdnZW5lcmFsJ31cbiAgICAgICAgICAgICAgICAgICAgICAkaW5kZXg9ezB9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2VjdGlvbkNoYW5nZSgnZ2VuZXJhbCcpfVxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWJtLWFnZW50LW1vZGFsLWdlbmVyYWxcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPENhdGVnb3J5XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17YCR7c2VjdGlvbiA9PT0gJ2dlbmVyYWwnID8gJ3JnYmEoNjMsIDYzLCA2MywgMSknIDogJ3JnYmEoMTY2LCAxNjYsIDE2NiwgMSknfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD17MTh9XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9ezE4fVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1UaXRsZSBpc0FjdGl2ZT17c2VjdGlvbiA9PT0gJ2dlbmVyYWwnfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0KCdnZW5lcmFsU2VjdGlvbi50aXRsZScpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbVRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhckl0ZW0+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17c2VjdGlvbiA9PT0gJ2tub3dsZWRnZSd9XG4gICAgICAgICAgICAgICAgICAgICAgJGluZGV4PXsxfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlY3Rpb25DaGFuZ2UoJ2tub3dsZWRnZScpfVxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWJtLWFnZW50LW1vZGFsLWtub3dsZWRnZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8QnJhaW5JY29uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17YCR7c2VjdGlvbiA9PT0gJ2tub3dsZWRnZScgPyAncmdiYSg2MywgNjMsIDYzLCAxKScgOiAncmdiYSgxNjYsIDE2NiwgMTY2LCAxKSd9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTh9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVRpdGxlIGlzQWN0aXZlPXtzZWN0aW9uID09PSAna25vd2xlZGdlJ30+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dCgna25vd2xlZGdlU2VjdGlvbi50aXRsZScpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NBQU1TaWRlYmFySXRlbVRpdGxlPlxuICAgICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhckl0ZW0+XG5cbiAgICAgICAgICAgICAgICAgICAgPFNDQUFNU2lkZWJhckl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17c2VjdGlvbiA9PT0gJ2FjY2Vzc2liaWxpdHknfVxuICAgICAgICAgICAgICAgICAgICAgICRpbmRleD17Mn1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVTZWN0aW9uQ2hhbmdlKCdhY2Nlc3NpYmlsaXR5Jyl9XG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhYm0tYWdlbnQtbW9kYWwtYWNjZXNzaWJpbGl0eVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJpbGl0eUljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtgJHtzZWN0aW9uID09PSAnYWNjZXNzaWJpbGl0eScgPyAncmdiYSg2MywgNjMsIDYzLCAxKScgOiAncmdiYSgxNjYsIDE2NiwgMTY2LCAxKSd9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXsxOH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD17MTh9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NBQU1TaWRlYmFySXRlbVRpdGxlIGlzQWN0aXZlPXtzZWN0aW9uID09PSAnYWNjZXNzaWJpbGl0eSd9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3QoJ2FjY2Vzc2liaWxpdHlTZWN0aW9uLnRpdGxlVGFiJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNpZGViYXJJdGVtVGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAge3Nob3VsZERpc2FibGVTYXZlRm9yQ2xpZW50cyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnYWNjZXNzaWJpbGl0eVNlY3Rpb24uY2xpZW50c0Vycm9yJyl9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTQ0FBTVNpZGViYXJJdGVtRXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFsZXJ0IGNvbG9yPVwiI0M3MDUwNVwiIHdpZHRoPVwiMTZweFwiIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhckl0ZW1FcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhckl0ZW0+XG4gICAgICAgICAgICAgICAgICA8L1NDQUFNU2lkZWJhcj5cbiAgICAgICAgICAgICAgICAgIHtTZWN0aW9uQnlLZXlbc2VjdGlvbl0oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG1vZGFsVmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXRBZ2VudFZhbHVlczogaGFuZGxlU2V0QWdlbnRWYWx1ZXNCeUtleXMsXG4gICAgICAgICAgICAgICAgICAgIGFnZW50TW9kZWxzLFxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdLbm93bGVkZ2U6IFtdLFxuICAgICAgICAgICAgICAgICAgICBuZXdLbm93bGVkZ2U6IFtdLFxuICAgICAgICAgICAgICAgICAgICBvblJlbW92ZUV4aXN0aW5nS25vd2xlZGdlOiAoKSA9PiB7fSxcbiAgICAgICAgICAgICAgICAgICAgb25SZW1vdmVOZXdLbm93bGVkZ2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgICAgICAgICBvbkZpbGVFcnJvckNoYW5nZTogc2V0SGFzRmlsZUVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFpJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIDwvU0NBQU1Db250ZW50PlxuICAgICAgICAgICAgICAgIDxTQ0FBTUZvb3RlciBpc0VkaXRpbmc9eyEhbW9kYWxWYWx1ZXM/LmlzRWRpdGluZyAmJiAhIXVzZXJQZXJtaXNzaW9ucz8uZGVsZXRlfT5cbiAgICAgICAgICAgICAgICAgIHshIW1vZGFsVmFsdWVzPy5pc0VkaXRpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgISF1c2VyUGVybWlzc2lvbnM/LmRlbGV0ZSAmJlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFNDQUFNRGVsZXRlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPENVQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwibWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5XaXRoSWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd01vZGFsRGVsZXRlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzaG91bGREaXNhYmxlQWJtSGVhZGVyQ2xvc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0tub3dsZWRnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdDcmVhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nVXBkYXRlQWNjZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxXcmFwcGVyQ2VudGVySWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHJhc2ggY29sb3I9XCIjMDhjXCIgd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0KCdkZWxldGVBZ2VudCcpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1dyYXBwZXJDZW50ZXJJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9DVUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NDQUFNRGVsZXRlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGdhcDogJzI0cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICA8U0NBQU1TYXZlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgaXNEaXNhYmxlZD17aXNBYm1TYXZlRGlzYWJsZWQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBtb2RhbFZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWw6IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUFjdGlvbnM6IGFjdGlvbnNUb0ZpbGVzLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdLbm93bGVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdDcmVhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdVcGRhdGVBY2Nlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNGaWxlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPENVQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY29udGFpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtZWRpdW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb25maXJtQWN0aW9uKG51bGwsICdjcmVhdGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0FibVNhdmVEaXNhYmxlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogbW9kYWxWYWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWw6IGZpcnN0VmFsdWVBZ2VudC5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQWN0aW9uczogYWN0aW9uc1RvRmlsZXMuY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmdLbm93bGVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0NyZWF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nVXBkYXRlQWNjZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNGaWxlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge21vZGFsVmFsdWVzLmlzRWRpdGluZyA/IHQoJ3NhdmVDaGFuZ2VzJykgOiB0KCdjcmVhdGVBZ2VudExhYmVsQnV0dG9uJyl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9DVUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9TQ0FBTVNhdmVCdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1NDQUFNRm9vdGVyPlxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICA8L1NDQUFNV3JhcHBlcj5cbiAgICAgIHtzaG93TW9kYWxEZWxldGUgJiYgKFxuICAgICAgICA8RGVsZXRlUXVlc3Rpb25Nb2RhbFxuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFNob3dNb2RhbERlbGV0ZShmYWxzZSl9XG4gICAgICAgICAgaGFuZGxlcnM9e3tcbiAgICAgICAgICAgIGhhbmRsZUNvbmZpcm1BY3Rpb246IChwcm9wczogYW55KSA9PiBoYW5kbGVDb25maXJtQWN0aW9uKHByb3BzLCAnZGVsZXRlJyksXG4gICAgICAgICAgfX1cbiAgICAgICAgICBjaGF0PXt7IHRpdGxlOiBtb2RhbFZhbHVlcy5nZW5lcmFsLm5hbWUsIGlkOiBtb2RhbFZhbHVlcy5nZW5lcmFsLmlkIH19XG4gICAgICAgICAgYWN0aW9uPVwiYWdlbnRcIlxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L0JhY2tkcm9wPixcbiAgICBzZWxlY3RvclxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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