@projectcor/maia-components 2.41.1-0 → 2.42.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 (175) hide show
  1. package/README.md +2 -0
  2. package/lib/App.js +19 -44
  3. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
  4. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
  5. package/lib/components/atoms/MAIAInput/MAIAInput.js +3 -3
  6. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
  7. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +14 -10
  8. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +1 -1
  9. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +37 -57
  10. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +12 -18
  11. package/lib/components/index.js +1 -2
  12. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
  13. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +6 -21
  14. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +3 -9
  15. package/lib/components/molecules/ChatAIMessages/newStyles.js +26 -29
  16. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +1 -8
  17. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -25
  18. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +61 -65
  19. package/lib/components/molecules/ChatFooter/ChatFooter.js +3 -5
  20. package/lib/components/molecules/Sidebar/Sidebar.js +25 -30
  21. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
  22. package/lib/constants/permissions/clientRoleAccess.js +33 -0
  23. package/lib/constants/permissions/index.js +2 -2
  24. package/lib/constants/permissions/utils.js +12 -3
  25. package/lib/dev/DevReasoningTimeline.js +17 -11
  26. package/lib/hooks/useChatManager/useChatManager.js +7 -7
  27. package/lib/hooks/useFrequentlyUsedActions.js +12 -31
  28. package/lib/index.js +2 -5
  29. package/lib/lang/br/index.js +1 -26
  30. package/lib/lang/en/index.js +1 -26
  31. package/lib/lang/es/index.js +1 -26
  32. package/lib/lang/fr/index.js +1 -26
  33. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  34. package/lib/store/sessions/sessionStreamManager.js +52 -40
  35. package/lib/styles/cascade.js +3 -29
  36. package/lib/styles/transitions.js +1 -3
  37. package/lib/types/global.d.js +1 -1
  38. package/lib/utils/hoursPlannerQuickActionType.js +1 -74
  39. package/lib/utils/streamActivityMessages.js +19 -32
  40. package/package.json +1 -1
  41. package/CHANGELOG.md +0 -840
  42. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
  43. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  44. package/lib/components/atoms/Chip/Chip.spec.js +0 -82
  45. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  46. package/lib/components/atoms/Fade/Fade.spec.js +0 -31
  47. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  48. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -300
  49. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
  50. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
  51. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -58
  52. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -68
  53. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
  54. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
  55. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  56. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
  57. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  58. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -77
  59. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
  60. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  61. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -291
  62. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  63. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -148
  64. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
  65. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
  66. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -112
  67. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  68. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  69. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -234
  70. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -335
  71. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
  72. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  73. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -486
  74. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -231
  75. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  76. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
  77. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
  78. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
  79. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -250
  80. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -224
  81. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -144
  82. package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
  83. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
  84. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  85. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  86. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  87. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  88. package/lib/constants/permissions/utils.spec.js +0 -34
  89. package/lib/dev/DevMaiaPage.js +0 -30
  90. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -95
  91. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -96
  92. package/lib/hooks/useCaretPosition.spec.js +0 -58
  93. package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -279
  94. package/lib/hooks/useDebounce.spec.js +0 -42
  95. package/lib/hooks/useEvent.spec.js +0 -40
  96. package/lib/hooks/useIsMaiaPageRoute.js +0 -26
  97. package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
  98. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  99. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
  100. package/lib/hooks/useModal/useModal.spec.js +0 -73
  101. package/lib/hooks/useResize.spec.js +0 -37
  102. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  103. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  104. package/lib/hooks/useT.spec.js +0 -20
  105. package/lib/hooks/useToggle.spec.js +0 -33
  106. package/lib/lib/utils.js +0 -9
  107. package/lib/services/maia/Access/updateAccess.spec.js +0 -108
  108. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -69
  109. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -74
  110. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  111. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -42
  112. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  113. package/lib/services/maia/Agents/getAgentById.spec.js +0 -55
  114. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -82
  115. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  116. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -47
  117. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  118. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  119. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  120. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  121. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  122. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  123. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  124. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  125. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  126. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  127. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  128. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -72
  129. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  130. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -83
  131. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  132. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  133. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  134. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  135. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  136. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  137. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  138. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  139. package/lib/services/maia/client.spec.js +0 -56
  140. package/lib/services/utils/fetchCOR.spec.js +0 -211
  141. package/lib/services/utils/getCookie.spec.js +0 -20
  142. package/lib/store/chatsSidebarOptimistic.spec.js +0 -120
  143. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  144. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  145. package/lib/store/sessions/sessions.types.spec.js +0 -16
  146. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  147. package/lib/store/useChatsStore.spec.js +0 -619
  148. package/lib/store/useFaqsStore.spec.js +0 -57
  149. package/lib/utils/agentDisplayName.spec.js +0 -44
  150. package/lib/utils/autoApproveStorage.spec.js +0 -25
  151. package/lib/utils/chatInputFiles.spec.js +0 -39
  152. package/lib/utils/contextMentionLabel.spec.js +0 -13
  153. package/lib/utils/contextMentionTriggers.spec.js +0 -38
  154. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  155. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  156. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  157. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  158. package/lib/utils/formatUnreadCount.spec.js +0 -12
  159. package/lib/utils/getUnitFileSize.spec.js +0 -18
  160. package/lib/utils/hitlAnalytics.spec.js +0 -100
  161. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
  162. package/lib/utils/maiaPageRoute.js +0 -24
  163. package/lib/utils/maiaPageRoute.spec.js +0 -23
  164. package/lib/utils/mapBackendLang.spec.js +0 -19
  165. package/lib/utils/navigateContextEntity.spec.js +0 -50
  166. package/lib/utils/normalizeAgentConnectors.spec.js +0 -89
  167. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  168. package/lib/utils/reasoningMappers.spec.js +0 -103
  169. package/lib/utils/retryCompletion.spec.js +0 -99
  170. package/lib/utils/skillContentSize.spec.js +0 -13
  171. package/lib/utils/slashCommandMarker.spec.js +0 -43
  172. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  173. package/lib/utils/sseStreamContent.spec.js +0 -31
  174. package/lib/utils/streamActivityMessages.spec.js +0 -131
  175. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -1,486 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
- /* eslint-disable no-nested-ternary */
6
- /* eslint-disable react/function-component-definition */
7
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
- import moment from 'moment';
9
- import { useTranslation } from 'react-i18next';
10
- import { useUser } from '../../../context/cor-user';
11
- import { MAIAError } from '../../atoms/MAIAError';
12
- import { ChatAIContent } from '../../molecules/ChatAIContent';
13
- import { buildHandlers, options } from '../../molecules/ChatAIModal/constants';
14
- import { Sidebar } from '../../molecules/Sidebar';
15
- import { useGetAgents } from '../../../services/maia/Agents/getAgents';
16
- import { GlobalContext, useGlobalContext } from '../../../context/global-context';
17
- import { Snackbar } from '../SnackBar/Snackbar';
18
- import { ProjectSummaryContent } from '../../molecules/ProjectSummaryContent';
19
- import { AbmAgentModal } from '../AbmAgentModal/AbmAgentModal';
20
- import { ChatAiModalFooter } from '../../molecules/ChatAIModal/components/ChatAiModalFooter';
21
- import { ChatAIPageHeader } from './ChatAIPageHeader';
22
- import { ChatAIPageHome } from './ChatAIPageHome';
23
- import { SECTIONS } from '../../../constants/config';
24
- import { useStreamdownStyles } from '../../../hooks/useStreamdownStyles';
25
- import { useProjectSummaryConfig } from '../../../hooks/useProjectSummaryConfig';
26
- import { acquireChatsStore, releaseChatsStore } from '../../../store';
27
- import { useEvent } from '../../../hooks/useEvent';
28
- import { withAppCfg } from '../../atoms/WithAppCfg';
29
- import { Features } from '../../atoms/WithFeatureValidation';
30
- import { setMaiaPagePresence } from '../../../utils/maiaPageRoute';
31
- import { SCPageMain, SCPageWrapper } from './ChatAIPage.styles';
32
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
33
- var validateAccessByFeature = function validateAccessByFeature(section) {
34
- if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
35
- return true;
36
- }
37
- if ((section === 'project' || section === 'client') && window.MAIA_CHAT_AI_FEATURE_ACCESS) {
38
- return true;
39
- }
40
- return false;
41
- };
42
- export var ChatAIPage = withAppCfg(function (_ref) {
43
- var _ref$entity = _ref.entity,
44
- entity = _ref$entity === void 0 ? {
45
- projectId: null,
46
- clientId: null
47
- } : _ref$entity,
48
- _ref$project = _ref.project,
49
- initialProject = _ref$project === void 0 ? null : _ref$project,
50
- _ref$client = _ref.client,
51
- initialClient = _ref$client === void 0 ? null : _ref$client,
52
- _ref$section = _ref.section,
53
- section = _ref$section === void 0 ? 'header' : _ref$section,
54
- _ref$hasMultiAgents = _ref.hasMultiAgents,
55
- hasMultiAgents = _ref$hasMultiAgents === void 0 ? false : _ref$hasMultiAgents,
56
- className = _ref.className;
57
- useStreamdownStyles();
58
- useEffect(function () {
59
- setMaiaPagePresence(true);
60
- return function () {
61
- setMaiaPagePresence(false);
62
- };
63
- }, []);
64
- var initialProjectValue = section === 'project' ? initialProject : null;
65
- var _useState = useState(initialProjectValue),
66
- _useState2 = _slicedToArray(_useState, 2),
67
- project = _useState2[0],
68
- setProject = _useState2[1];
69
- useEffect(function () {
70
- if (section === 'project' && initialProject != null) {
71
- setProject(initialProject);
72
- }
73
- }, [section, initialProject]);
74
- var _useProjectSummaryCon = useProjectSummaryConfig({
75
- section: section,
76
- entity: entity,
77
- project: project,
78
- setProject: setProject,
79
- client: section === 'client' ? initialClient !== null && initialClient !== void 0 ? initialClient : null : undefined,
80
- hasMultiAgents: hasMultiAgents
81
- }),
82
- context = _useProjectSummaryCon.context,
83
- restoreConfigureSettings = _useProjectSummaryCon.restoreConfigureSettings;
84
- var providerValue = useMemo(function () {
85
- return _objectSpread(_objectSpread({}, context), {}, {
86
- section: section
87
- });
88
- }, [context, section]);
89
- useEffect(function () {
90
- acquireChatsStore();
91
- return function () {
92
- releaseChatsStore();
93
- restoreConfigureSettings();
94
- };
95
- }, [restoreConfigureSettings]);
96
- return /*#__PURE__*/_jsx(GlobalContext.Provider, {
97
- value: providerValue,
98
- children: /*#__PURE__*/_jsx(ChatAIPageContent, {
99
- section: section,
100
- className: className
101
- })
102
- });
103
- }, Features.CHAT_AI);
104
- var ChatAIPageContent = function ChatAIPageContent(_ref2) {
105
- var _user$permissions, _user$permissions2, _user$permissions3;
106
- var section = _ref2.section,
107
- className = _ref2.className;
108
- var user = useUser();
109
- var _useTranslation = useTranslation([SECTIONS.abmAgent]),
110
- i18n = _useTranslation.i18n;
111
- var amplitudEvent = useEvent();
112
- var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
113
- moment.locale(lang);
114
- var _useState3 = useState({
115
- message: '',
116
- attachments: []
117
- }),
118
- _useState4 = _slicedToArray(_useState3, 2),
119
- userInitialMessage = _useState4[0],
120
- setUserInitialMessage = _useState4[1];
121
- var _useState5 = useState(null),
122
- _useState6 = _slicedToArray(_useState5, 2),
123
- initialChatId = _useState6[0],
124
- setInitialChatId = _useState6[1];
125
- var _useState7 = useState(0),
126
- _useState8 = _slicedToArray(_useState7, 2),
127
- newChatKey = _useState8[0],
128
- setNewChatKey = _useState8[1];
129
- var _useState9 = useState(null),
130
- _useState0 = _slicedToArray(_useState9, 2),
131
- sendMessageFunction = _useState0[0],
132
- setSendMessageFunction = _useState0[1];
133
- var _useState1 = useState(null),
134
- _useState10 = _slicedToArray(_useState1, 2),
135
- stopGenerationFunction = _useState10[0],
136
- setStopGenerationFunction = _useState10[1];
137
- var _useState11 = useState(false),
138
- _useState12 = _slicedToArray(_useState11, 2),
139
- isStreaming = _useState12[0],
140
- setIsStreaming = _useState12[1];
141
- var _useState13 = useState(false),
142
- _useState14 = _slicedToArray(_useState13, 2),
143
- isWriting = _useState14[0],
144
- setIsWriting = _useState14[1];
145
- var _useState15 = useState(false),
146
- _useState16 = _slicedToArray(_useState15, 2),
147
- refetchChats = _useState16[0],
148
- setRefetchChats = _useState16[1];
149
- var _useState17 = useState(options.home),
150
- _useState18 = _slicedToArray(_useState17, 2),
151
- currentOption = _useState18[0],
152
- setCurrentOption = _useState18[1];
153
- var _useState19 = useState(false),
154
- _useState20 = _slicedToArray(_useState19, 2),
155
- hasError = _useState20[0],
156
- setHasError = _useState20[1];
157
- var handlers = useMemo(function () {
158
- return buildHandlers(setCurrentOption, setHasError);
159
- }, []);
160
- var _useState21 = useState(false),
161
- _useState22 = _slicedToArray(_useState21, 2),
162
- sidebarHasError = _useState22[0],
163
- setSidebarHasError = _useState22[1];
164
- var resetSelectedChatRef = useRef(null);
165
- var _useState23 = useState('sidebar'),
166
- _useState24 = _slicedToArray(_useState23, 2),
167
- layoutMode = _useState24[0],
168
- setLayoutMode = _useState24[1];
169
- var _useState25 = useState(false),
170
- _useState26 = _slicedToArray(_useState25, 2),
171
- sidebarOpen = _useState26[0],
172
- setSidebarOpen = _useState26[1];
173
- var _useState27 = useState(false),
174
- _useState28 = _slicedToArray(_useState27, 2),
175
- homeLeaving = _useState28[0],
176
- setHomeLeaving = _useState28[1];
177
- var skipChatEnterRef = useRef(false);
178
- var expanded = layoutMode === 'fullscreen';
179
- var _useGlobalContext = useGlobalContext(),
180
- selectAgent = _useGlobalContext.selectAgent,
181
- agent = _useGlobalContext.agent,
182
- toggleWebSearch = _useGlobalContext.toggleWebSearch,
183
- isWebSearchActive = _useGlobalContext.isWebSearchActive,
184
- setChipsProject = _useGlobalContext.setChipsProject,
185
- setClient = _useGlobalContext.setClient,
186
- setProject = _useGlobalContext.setProject;
187
- var _useGetAgents = useGetAgents({
188
- selectAgent: selectAgent,
189
- section: section,
190
- agent: agent,
191
- handleGoHome: handlers.home
192
- }),
193
- agents = _useGetAgents.agents,
194
- loading = _useGetAgents.loading,
195
- loadingMore = _useGetAgents.loadingMore,
196
- agentError = _useGetAgents.error,
197
- handleGetAgents = _useGetAgents.handleGetAgents,
198
- loadMoreAgents = _useGetAgents.loadMoreAgents,
199
- sortAgentsList = _useGetAgents.sortAgentsList,
200
- addAgent = _useGetAgents.addAgent,
201
- removeAgent = _useGetAgents.removeAgent,
202
- updateAgent = _useGetAgents.updateAgent,
203
- updateAgentFavorite = _useGetAgents.updateAgentFavorite,
204
- selectFirstAgent = _useGetAgents.selectFirstAgent;
205
- var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
206
- var orchestrator = useMemo(function () {
207
- var _agents$data$find;
208
- return (_agents$data$find = agents.data.find(function (item) {
209
- return item.type === 'orchestrator';
210
- })) !== null && _agents$data$find !== void 0 ? _agents$data$find : null;
211
- }, [agents.data]);
212
- var computedCurrentOption = currentOption === options.chat ? options.chat : options.home;
213
- var didInitAgentRef = useRef(false);
214
- useEffect(function () {
215
- if (didInitAgentRef.current || !orchestrator) return;
216
- didInitAgentRef.current = true;
217
- selectAgent(orchestrator);
218
- }, [orchestrator, selectAgent]);
219
- var agentsFetchedRef = useRef(false);
220
- useEffect(function () {
221
- if (!agentsFetchedRef.current) {
222
- agentsFetchedRef.current = true;
223
- handleGetAgents();
224
- }
225
- }, [handleGetAgents]);
226
- useEffect(function () {
227
- var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
228
- var _ref3 = evt.detail || {},
229
- nextAgent = _ref3.agent;
230
- if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) addAgent(nextAgent, {
231
- navigateHome: false
232
- });
233
- };
234
- document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
235
- return function () {
236
- return document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
237
- };
238
- }, [addAgent]);
239
- useEffect(function () {
240
- var onSyncEditedAgent = function onSyncEditedAgent(evt) {
241
- var _ref4 = evt.detail || {},
242
- nextAgent = _ref4.agent;
243
- if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
244
- updateAgent(nextAgent);
245
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) selectAgent(nextAgent);
246
- };
247
- document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
248
- return function () {
249
- return document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
250
- };
251
- }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
252
- useEffect(function () {
253
- var openChatView = function openChatView() {
254
- setHasError(false);
255
- setInitialChatId(null);
256
- setNewChatKey(function (prev) {
257
- return prev + 1;
258
- });
259
- setUserInitialMessage({
260
- message: '',
261
- attachments: []
262
- });
263
- setCurrentOption(options.chat);
264
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
265
- };
266
- document.addEventListener('maia-open-chat-view', openChatView);
267
- return function () {
268
- return document.removeEventListener('maia-open-chat-view', openChatView);
269
- };
270
- }, []);
271
- useEffect(function () {
272
- var openNewChatWithAgent = function openNewChatWithAgent(event) {
273
- var _detail;
274
- var nextAgent = (_detail = event.detail) === null || _detail === void 0 ? void 0 : _detail.agent;
275
- if (!nextAgent) return;
276
- setProject(null);
277
- setClient === null || setClient === void 0 || setClient(null);
278
- selectAgent(nextAgent);
279
- setHasError(false);
280
- setCurrentOption(options.home);
281
- };
282
- document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
283
- return function () {
284
- return document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
285
- };
286
- }, [selectAgent, setClient, setProject]);
287
- var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, _mentions, fuaId) {
288
- if (sidebarHasError) setSidebarHasError(false);
289
- setInitialChatId(null);
290
- setNewChatKey(function (prev) {
291
- return prev + 1;
292
- });
293
- setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread({
294
- message: message || '',
295
- attachments: attachments || []
296
- }, faqId ? {
297
- faqId: faqId
298
- } : {}), agentSuggestionId ? {
299
- agentSuggestionId: agentSuggestionId
300
- } : {}), fuaId ? {
301
- fuaId: fuaId
302
- } : {}));
303
- handlers.chat();
304
- }, [handlers, sidebarHasError]);
305
-
306
- // Sidebar types this prop as (chatId: string) but passes the full chat object at runtime
307
- var goToChat = useCallback(function (chatArg) {
308
- var chat = chatArg;
309
- setUserInitialMessage({
310
- message: '',
311
- attachments: []
312
- });
313
- setInitialChatId(chat.sessionExternalId);
314
- var selectedAgent = agents.data.find(function (agentItem) {
315
- return agentItem.id === chat.agentId;
316
- });
317
- if (selectedAgent) selectAgent(selectedAgent);
318
- skipChatEnterRef.current = false;
319
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
320
- handlers.chat();
321
- }, [handlers, agents, selectAgent]);
322
- var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
323
- setSendMessageFunction(function () {
324
- return sendMessage;
325
- });
326
- setStopGenerationFunction(function () {
327
- return stopGeneration;
328
- });
329
- setIsStreaming(streaming);
330
- setIsWriting(writing);
331
- }, []);
332
- var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
333
- if (sidebarHasError) setSidebarHasError(false);
334
- if (sendMessageFunction && computedCurrentOption === options.chat) {
335
- sendMessageFunction(message, attachments, faqId, agentSuggestionId);
336
- } else {
337
- startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
338
- }
339
- }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
340
- var handleHomeLeaveStart = useCallback(function () {
341
- skipChatEnterRef.current = true;
342
- setHomeLeaving(true);
343
- }, []);
344
- var handleHomeSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
345
- setHomeLeaving(false);
346
- handleSendMessage(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
347
- }, [handleSendMessage]);
348
- var handleGoHome = useCallback(function () {
349
- setHomeLeaving(false);
350
- skipChatEnterRef.current = false;
351
- if (currentOption === options.chat) {
352
- setInitialChatId(null);
353
- setNewChatKey(function (prev) {
354
- return prev + 1;
355
- });
356
- if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') setClient === null || setClient === void 0 || setClient(null);
357
- }
358
- if (orchestrator) {
359
- selectAgent(orchestrator);
360
- } else if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
361
- selectAgent(agents.data[0]);
362
- }
363
- setCurrentOption(options.home);
364
- setChipsProject(null);
365
- setHasError(false);
366
- if (isWebSearchActive) toggleWebSearch();
367
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
368
- }, [currentOption, isWebSearchActive, toggleWebSearch, agent, agents, orchestrator, selectAgent, setClient, setChipsProject]);
369
- var handleResetChat = useCallback(function () {
370
- setHomeLeaving(false);
371
- skipChatEnterRef.current = false;
372
- setInitialChatId(null);
373
- setNewChatKey(function (prev) {
374
- return prev + 1;
375
- });
376
- setUserInitialMessage({
377
- message: '',
378
- attachments: []
379
- });
380
- setCurrentOption(options.home);
381
- setChipsProject(null);
382
- setHasError(false);
383
- if (isWebSearchActive) toggleWebSearch();
384
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
385
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
386
- }, [isWebSearchActive, toggleWebSearch, setChipsProject]);
387
- var focusChatInput = useCallback(function () {
388
- window.setTimeout(function () {
389
- document.dispatchEvent(new CustomEvent('maia-input-refocus'));
390
- }, 100);
391
- }, []);
392
- var handleStartNewChat = useCallback(function () {
393
- if (currentOption === options.home) {
394
- focusChatInput();
395
- return;
396
- }
397
- if (orchestrator) selectAgent(orchestrator);
398
- handleGoHome();
399
- focusChatInput();
400
- }, [currentOption, focusChatInput, handleGoHome, orchestrator, selectAgent]);
401
- var noop = useCallback(function () {
402
- return undefined;
403
- }, []);
404
-
405
- // Suppress unused variable warning — kept for potential Amplitude tracking parity
406
- void amplitudEvent;
407
- var canAccessPage = validateAccessByFeature(section);
408
- var isHome = computedCurrentOption === options.home;
409
- var showChatFooter = computedCurrentOption === options.chat && !hasError && !loading && canAccessPage;
410
- return /*#__PURE__*/_jsxs(SCPageWrapper, {
411
- className: className,
412
- children: [canAccessPage ? /*#__PURE__*/_jsx(Sidebar, {
413
- conversationsOnly: true,
414
- open: sidebarOpen,
415
- onOpenChange: setSidebarOpen,
416
- onGoToChat: goToChat,
417
- onError: function onError() {
418
- return setSidebarHasError(true);
419
- },
420
- handleGoToHome: handleGoHome,
421
- handleStartNewChat: handleStartNewChat,
422
- handleOpenMarketplace: noop,
423
- handleOpenSkills: noop,
424
- showNewChat: false,
425
- refetchChats: refetchChats,
426
- handleSetRefetchChats: setRefetchChats,
427
- hasError: sidebarHasError,
428
- resetSelectedChatRef: resetSelectedChatRef
429
- }) : null, /*#__PURE__*/_jsxs(SCPageMain, {
430
- children: [/*#__PURE__*/_jsx(ChatAIPageHeader, {
431
- overlay: isHome && !homeLeaving,
432
- showBack: !isHome,
433
- agents: agents.data,
434
- loading: loading,
435
- loadingMore: loadingMore,
436
- hasMore: agents.has_more,
437
- loadMoreAgents: loadMoreAgents,
438
- sortAgentsList: sortAgentsList,
439
- handleResetChat: handleResetChat,
440
- onAgentUpdate: updateAgentFavorite
441
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : canAccessPage ? isHome ? /*#__PURE__*/_jsx(ChatAIPageHome, {
442
- onSendMessage: handleHomeSendMessage,
443
- onLeaveStart: handleHomeLeaveStart
444
- }) : /*#__PURE__*/_jsx(ChatAIContent, {
445
- currentOption: options.chat,
446
- handlers: _objectSpread(_objectSpread({}, handlers), {}, {
447
- chat: startChat,
448
- home: handlers.home,
449
- handleGoHome: handleGoHome
450
- }),
451
- onError: function onError() {
452
- return setHasError(true);
453
- },
454
- refs: {
455
- userInitialMessage: userInitialMessage,
456
- initialChatId: initialChatId
457
- },
458
- onSendMessageReady: handleSendMessageReady,
459
- expanded: expanded,
460
- floating: false,
461
- agents: agents.data,
462
- loadingAgents: loading,
463
- agentError: agentError,
464
- skipEnterAnimation: skipChatEnterRef.current
465
- }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
466
- onRestartSummary: handlers.home
467
- }), showChatFooter ? /*#__PURE__*/_jsx(ChatAiModalFooter, {
468
- agent: agent,
469
- handleSendMessage: handleSendMessage,
470
- handleStopGeneration: stopGenerationFunction,
471
- isStreaming: isStreaming,
472
- isWriting: isWriting,
473
- chatId: initialChatId,
474
- newChatKey: newChatKey,
475
- layoutMode: layoutMode
476
- }) : null]
477
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
478
- addAgent: addAgent,
479
- updateAgent: updateAgent,
480
- removeAgent: removeAgent,
481
- updateAgentFavorite: updateAgentFavorite,
482
- selectFirstAgent: selectFirstAgent
483
- }), /*#__PURE__*/_jsx(Snackbar, {})]
484
- });
485
- };
486
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIm1vbWVudCIsInVzZVRyYW5zbGF0aW9uIiwidXNlVXNlciIsIk1BSUFFcnJvciIsIkNoYXRBSUNvbnRlbnQiLCJidWlsZEhhbmRsZXJzIiwib3B0aW9ucyIsIlNpZGViYXIiLCJ1c2VHZXRBZ2VudHMiLCJHbG9iYWxDb250ZXh0IiwidXNlR2xvYmFsQ29udGV4dCIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIkNoYXRBaU1vZGFsRm9vdGVyIiwiQ2hhdEFJUGFnZUhlYWRlciIsIkNoYXRBSVBhZ2VIb21lIiwiU0VDVElPTlMiLCJ1c2VTdHJlYW1kb3duU3R5bGVzIiwidXNlUHJvamVjdFN1bW1hcnlDb25maWciLCJhY3F1aXJlQ2hhdHNTdG9yZSIsInJlbGVhc2VDaGF0c1N0b3JlIiwidXNlRXZlbnQiLCJ3aXRoQXBwQ2ZnIiwiRmVhdHVyZXMiLCJzZXRNYWlhUGFnZVByZXNlbmNlIiwiU0NQYWdlTWFpbiIsIlNDUGFnZVdyYXBwZXIiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJzZWN0aW9uIiwid2luZG93IiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIkNoYXRBSVBhZ2UiLCJfcmVmIiwiX3JlZiRlbnRpdHkiLCJlbnRpdHkiLCJwcm9qZWN0SWQiLCJjbGllbnRJZCIsIl9yZWYkcHJvamVjdCIsInByb2plY3QiLCJpbml0aWFsUHJvamVjdCIsIl9yZWYkY2xpZW50IiwiY2xpZW50IiwiaW5pdGlhbENsaWVudCIsIl9yZWYkc2VjdGlvbiIsIl9yZWYkaGFzTXVsdGlBZ2VudHMiLCJoYXNNdWx0aUFnZW50cyIsImNsYXNzTmFtZSIsImluaXRpYWxQcm9qZWN0VmFsdWUiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRQcm9qZWN0IiwiX3VzZVByb2plY3RTdW1tYXJ5Q29uIiwidW5kZWZpbmVkIiwiY29udGV4dCIsInJlc3RvcmVDb25maWd1cmVTZXR0aW5ncyIsInByb3ZpZGVyVmFsdWUiLCJfb2JqZWN0U3ByZWFkIiwiUHJvdmlkZXIiLCJ2YWx1ZSIsImNoaWxkcmVuIiwiQ2hhdEFJUGFnZUNvbnRlbnQiLCJDSEFUX0FJIiwiX3JlZjIiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl91c2VyJHBlcm1pc3Npb25zMiIsIl91c2VyJHBlcm1pc3Npb25zMyIsInVzZXIiLCJfdXNlVHJhbnNsYXRpb24iLCJhYm1BZ2VudCIsImkxOG4iLCJhbXBsaXR1ZEV2ZW50IiwibGFuZyIsImxhbmd1YWdlIiwibG9jYWxlIiwiX3VzZVN0YXRlMyIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwic2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc1N0cmVhbWluZyIsInNldElzU3RyZWFtaW5nIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJyZWZldGNoQ2hhdHMiLCJzZXRSZWZldGNoQ2hhdHMiLCJfdXNlU3RhdGUxNyIsImhvbWUiLCJfdXNlU3RhdGUxOCIsImN1cnJlbnRPcHRpb24iLCJzZXRDdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMTkiLCJfdXNlU3RhdGUyMCIsImhhc0Vycm9yIiwic2V0SGFzRXJyb3IiLCJoYW5kbGVycyIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJzaWRlYmFySGFzRXJyb3IiLCJzZXRTaWRlYmFySGFzRXJyb3IiLCJyZXNldFNlbGVjdGVkQ2hhdFJlZiIsIl91c2VTdGF0ZTIzIiwiX3VzZVN0YXRlMjQiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsIl91c2VTdGF0ZTI1IiwiX3VzZVN0YXRlMjYiLCJzaWRlYmFyT3BlbiIsInNldFNpZGViYXJPcGVuIiwiX3VzZVN0YXRlMjciLCJfdXNlU3RhdGUyOCIsImhvbWVMZWF2aW5nIiwic2V0SG9tZUxlYXZpbmciLCJza2lwQ2hhdEVudGVyUmVmIiwiZXhwYW5kZWQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiYWdlbnQiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsInNldENsaWVudCIsIl91c2VHZXRBZ2VudHMiLCJoYW5kbGVHb0hvbWUiLCJhZ2VudHMiLCJsb2FkaW5nIiwibG9hZGluZ01vcmUiLCJhZ2VudEVycm9yIiwiZXJyb3IiLCJoYW5kbGVHZXRBZ2VudHMiLCJsb2FkTW9yZUFnZW50cyIsInNvcnRBZ2VudHNMaXN0IiwiYWRkQWdlbnQiLCJyZW1vdmVBZ2VudCIsInVwZGF0ZUFnZW50IiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNlbGVjdEZpcnN0QWdlbnQiLCJ1c2VySGFzUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsImFpX2FnZW50cyIsImNyZWF0ZSIsImVkaXQiLCJvcmNoZXN0cmF0b3IiLCJfYWdlbnRzJGRhdGEkZmluZCIsImRhdGEiLCJmaW5kIiwiaXRlbSIsInR5cGUiLCJjb21wdXRlZEN1cnJlbnRPcHRpb24iLCJjaGF0IiwiZGlkSW5pdEFnZW50UmVmIiwiY3VycmVudCIsImFnZW50c0ZldGNoZWRSZWYiLCJvbk1lcmdlQ3JlYXRlZEFnZW50IiwiZXZ0IiwiX3JlZjMiLCJkZXRhaWwiLCJuZXh0QWdlbnQiLCJpZCIsIm5hdmlnYXRlSG9tZSIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvblN5bmNFZGl0ZWRBZ2VudCIsIl9yZWY0Iiwib3BlbkNoYXRWaWV3IiwicHJldiIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIm9wZW5OZXdDaGF0V2l0aEFnZW50IiwiZXZlbnQiLCJfZGV0YWlsIiwic3RhcnRDaGF0IiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIl9tZW50aW9ucyIsImZ1YUlkIiwiZ29Ub0NoYXQiLCJjaGF0QXJnIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiYWdlbnRJdGVtIiwiYWdlbnRJZCIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwibWVudGlvbnMiLCJoYW5kbGVIb21lTGVhdmVTdGFydCIsImhhbmRsZUhvbWVTZW5kTWVzc2FnZSIsImlzX2RlbGV0ZWQiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwiaGFzX25vdF9hY2Nlc3MiLCJwcm9qZWN0X2RlbGV0ZWQiLCJsZW5ndGgiLCJoYW5kbGVSZXNldENoYXQiLCJmb2N1c0NoYXRJbnB1dCIsInNldFRpbWVvdXQiLCJoYW5kbGVTdGFydE5ld0NoYXQiLCJub29wIiwiY2FuQWNjZXNzUGFnZSIsImlzSG9tZSIsInNob3dDaGF0Rm9vdGVyIiwiY29udmVyc2F0aW9uc09ubHkiLCJvcGVuIiwib25PcGVuQ2hhbmdlIiwib25Hb1RvQ2hhdCIsIm9uRXJyb3IiLCJoYW5kbGVHb1RvSG9tZSIsImhhbmRsZU9wZW5NYXJrZXRwbGFjZSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJzaG93TmV3Q2hhdCIsImhhbmRsZVNldFJlZmV0Y2hDaGF0cyIsIm92ZXJsYXkiLCJzaG93QmFjayIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJvblNlbmRNZXNzYWdlIiwib25MZWF2ZVN0YXJ0IiwicmVmcyIsIm9uU2VuZE1lc3NhZ2VSZWFkeSIsImZsb2F0aW5nIiwibG9hZGluZ0FnZW50cyIsInNraXBFbnRlckFuaW1hdGlvbiIsIm9uUmVzdGFydFN1bW1hcnkiLCJoYW5kbGVTdG9wR2VuZXJhdGlvbiIsImNoYXRJZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9DaGF0QUlQYWdlL0NoYXRBSVBhZ2UudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9mdW5jdGlvbi1jb21wb25lbnQtZGVmaW5pdGlvbiAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IE1BSUFFcnJvciB9IGZyb20gJy4uLy4uL2F0b21zL01BSUFFcnJvcidcbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJQ29udGVudCdcbmltcG9ydCB7IGJ1aWxkSGFuZGxlcnMsIG9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9TaWRlYmFyJ1xuaW1wb3J0IHsgdXNlR2V0QWdlbnRzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRzJ1xuaW1wb3J0IHsgR2xvYmFsQ29udGV4dCwgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uL1NuYWNrQmFyL1NuYWNrYmFyJ1xuaW1wb3J0IHsgUHJvamVjdFN1bW1hcnlDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwnXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgQ2hhdEFJUGFnZUhlYWRlciB9IGZyb20gJy4vQ2hhdEFJUGFnZUhlYWRlcidcbmltcG9ydCB7IENoYXRBSVBhZ2VIb21lIH0gZnJvbSAnLi9DaGF0QUlQYWdlSG9tZSdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VTdHJlYW1kb3duU3R5bGVzIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtZG93blN0eWxlcydcbmltcG9ydCB7IHVzZVByb2plY3RTdW1tYXJ5Q29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUHJvamVjdFN1bW1hcnlDb25maWcnXG5pbXBvcnQgeyBhY3F1aXJlQ2hhdHNTdG9yZSwgcmVsZWFzZUNoYXRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZSdcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2xpZW50J1xuaW1wb3J0IHsgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL0NoYXRBSU1vZGFsL2xheW91dCdcbmltcG9ydCB7IHdpdGhBcHBDZmcgfSBmcm9tICcuLi8uLi9hdG9tcy9XaXRoQXBwQ2ZnJ1xuaW1wb3J0IHsgRmVhdHVyZXMgfSBmcm9tICcuLi8uLi9hdG9tcy9XaXRoRmVhdHVyZVZhbGlkYXRpb24nXG5pbXBvcnQgeyBzZXRNYWlhUGFnZVByZXNlbmNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbWFpYVBhZ2VSb3V0ZSdcbmltcG9ydCB7IFNDUGFnZU1haW4sIFNDUGFnZVdyYXBwZXIgfSBmcm9tICcuL0NoYXRBSVBhZ2Uuc3R5bGVzJ1xuXG5leHBvcnQgdHlwZSBDaGF0QUlQYWdlUHJvcHMgPSB7XG4gIGVudGl0eT86IHsgcHJvamVjdElkOiBzdHJpbmcgfCBudWxsOyBjbGllbnRJZDogc3RyaW5nIHwgbnVsbCB9XG4gIHByb2plY3Q/OiBQcm9qZWN0IHwgbnVsbFxuICBjbGllbnQ/OiBDbGllbnQgfCBudWxsXG4gIHNlY3Rpb24/OiAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnXG4gIGhhc011bHRpQWdlbnRzPzogYm9vbGVhblxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTZWN0aW9uVHlwZSA9ICdwcm9qZWN0JyB8ICdoZWFkZXInIHwgJ2NsaWVudCdcblxudHlwZSBDaGF0TGlzdEl0ZW0gPSB7IHNlc3Npb25FeHRlcm5hbElkOiBzdHJpbmc7IGFnZW50SWQ6IHN0cmluZyB9XG5cbmNvbnN0IHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlID0gKHNlY3Rpb246IHN0cmluZykgPT4ge1xuICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicgJiYgKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIHx8IHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JykgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlQYWdlID0gd2l0aEFwcENmZyhcbiAgKHtcbiAgICBlbnRpdHkgPSB7IHByb2plY3RJZDogbnVsbCwgY2xpZW50SWQ6IG51bGwgfSxcbiAgICBwcm9qZWN0OiBpbml0aWFsUHJvamVjdCA9IG51bGwsXG4gICAgY2xpZW50OiBpbml0aWFsQ2xpZW50ID0gbnVsbCxcbiAgICBzZWN0aW9uID0gJ2hlYWRlcicsXG4gICAgaGFzTXVsdGlBZ2VudHMgPSBmYWxzZSxcbiAgICBjbGFzc05hbWUsXG4gIH06IENoYXRBSVBhZ2VQcm9wcykgPT4ge1xuICAgIHVzZVN0cmVhbWRvd25TdHlsZXMoKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHNldE1haWFQYWdlUHJlc2VuY2UodHJ1ZSlcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHNldE1haWFQYWdlUHJlc2VuY2UoZmFsc2UpXG4gICAgICB9XG4gICAgfSwgW10pXG5cbiAgICBjb25zdCBpbml0aWFsUHJvamVjdFZhbHVlID0gc2VjdGlvbiA9PT0gJ3Byb2plY3QnID8gaW5pdGlhbFByb2plY3QgOiBudWxsXG4gICAgY29uc3QgW3Byb2plY3QsIHNldFByb2plY3RdID0gdXNlU3RhdGU8UHJvamVjdCB8IG51bGw+KGluaXRpYWxQcm9qZWN0VmFsdWUpXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyAmJiBpbml0aWFsUHJvamVjdCAhPSBudWxsKSB7XG4gICAgICAgIHNldFByb2plY3QoaW5pdGlhbFByb2plY3QpXG4gICAgICB9XG4gICAgfSwgW3NlY3Rpb24sIGluaXRpYWxQcm9qZWN0XSlcblxuICAgIGNvbnN0IHsgY29udGV4dCwgcmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzIH0gPSB1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyh7XG4gICAgICBzZWN0aW9uLFxuICAgICAgZW50aXR5LFxuICAgICAgcHJvamVjdCxcbiAgICAgIHNldFByb2plY3QsXG4gICAgICBjbGllbnQ6IHNlY3Rpb24gPT09ICdjbGllbnQnID8gKGluaXRpYWxDbGllbnQgPz8gbnVsbCkgOiB1bmRlZmluZWQsXG4gICAgICBoYXNNdWx0aUFnZW50cyxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXJWYWx1ZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoeyAuLi5jb250ZXh0LCBzZWN0aW9uOiBzZWN0aW9uIGFzICdwcm9qZWN0JyB8ICdoZWFkZXInIHwgJ2NsaWVudCcgfSksXG4gICAgICBbY29udGV4dCwgc2VjdGlvbl1cbiAgICApXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgYWNxdWlyZUNoYXRzU3RvcmUoKVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmVsZWFzZUNoYXRzU3RvcmUoKVxuICAgICAgICByZXN0b3JlQ29uZmlndXJlU2V0dGluZ3MoKVxuICAgICAgfVxuICAgIH0sIFtyZXN0b3JlQ29uZmlndXJlU2V0dGluZ3NdKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxHbG9iYWxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcm92aWRlclZhbHVlfT5cbiAgICAgICAgPENoYXRBSVBhZ2VDb250ZW50IHNlY3Rpb249e3NlY3Rpb24gYXMgU2VjdGlvblR5cGV9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIClcbiAgfSxcbiAgRmVhdHVyZXMuQ0hBVF9BSVxuKVxuXG5jb25zdCBDaGF0QUlQYWdlQ29udGVudCA9ICh7IHNlY3Rpb24sIGNsYXNzTmFtZSB9OiB7IHNlY3Rpb246IFNlY3Rpb25UeXBlOyBjbGFzc05hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHsgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmFibUFnZW50XSlcbiAgY29uc3QgYW1wbGl0dWRFdmVudCA9IHVzZUV2ZW50KClcblxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG4gIG1vbWVudC5sb2NhbGUobGFuZylcblxuICBjb25zdCBbdXNlckluaXRpYWxNZXNzYWdlLCBzZXRVc2VySW5pdGlhbE1lc3NhZ2VdID0gdXNlU3RhdGU8e1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIGZ1YUlkPzogc3RyaW5nXG4gIH0+KHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICBjb25zdCBbaW5pdGlhbENoYXRJZCwgc2V0SW5pdGlhbENoYXRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbmV3Q2hhdEtleSwgc2V0TmV3Q2hhdEtleV0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICAoKG1lc3NhZ2U6IHN0cmluZywgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLCBmYXFJZD86IHN0cmluZywgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbFxuICA+KG51bGwpXG4gIGNvbnN0IFtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLCBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSA9IHVzZVN0YXRlPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc1N0cmVhbWluZywgc2V0SXNTdHJlYW1pbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3JlZmV0Y2hDaGF0cywgc2V0UmVmZXRjaENoYXRzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudE9wdGlvbiwgc2V0Q3VycmVudE9wdGlvbl0gPSB1c2VTdGF0ZShvcHRpb25zLmhvbWUpXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IGhhbmRsZXJzID0gdXNlTWVtbygoKSA9PiBidWlsZEhhbmRsZXJzKHNldEN1cnJlbnRPcHRpb24sIHNldEhhc0Vycm9yKSwgW10pXG4gIGNvbnN0IFtzaWRlYmFySGFzRXJyb3IsIHNldFNpZGViYXJIYXNFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgcmVzZXRTZWxlY3RlZENoYXRSZWYgPSB1c2VSZWY8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2xheW91dE1vZGUsIHNldExheW91dE1vZGVdID0gdXNlU3RhdGU8TWFpYUNoYXRNb2RhbExheW91dE1vZGU+KCdzaWRlYmFyJylcbiAgY29uc3QgW3NpZGViYXJPcGVuLCBzZXRTaWRlYmFyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2hvbWVMZWF2aW5nLCBzZXRIb21lTGVhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3Qgc2tpcENoYXRFbnRlclJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcblxuICBjb25zdCB7IHNlbGVjdEFnZW50LCBhZ2VudCwgdG9nZ2xlV2ViU2VhcmNoLCBpc1dlYlNlYXJjaEFjdGl2ZSwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRDbGllbnQsIHNldFByb2plY3QgfSA9XG4gICAgdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgY29uc3Qge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yOiBhZ2VudEVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzb3J0QWdlbnRzTGlzdCxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gIH0gPSB1c2VHZXRBZ2VudHMoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZTogaGFuZGxlcnMuaG9tZSB9KVxuXG4gIGNvbnN0IHVzZXJIYXNQZXJtaXNzaW9ucyA9XG4gICAgKHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmNyZWF0ZSB8fFxuICAgICAgdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uZWRpdCB8fFxuICAgICAgdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uZGVsZXRlKSAmJlxuICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgY29uc3Qgb3JjaGVzdHJhdG9yID0gdXNlTWVtbygoKSA9PiBhZ2VudHMuZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS50eXBlID09PSAnb3JjaGVzdHJhdG9yJykgPz8gbnVsbCwgW2FnZW50cy5kYXRhXSlcblxuICBjb25zdCBjb21wdXRlZEN1cnJlbnRPcHRpb24gPSBjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQgPyBvcHRpb25zLmNoYXQgOiBvcHRpb25zLmhvbWVcblxuICBjb25zdCBkaWRJbml0QWdlbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpZEluaXRBZ2VudFJlZi5jdXJyZW50IHx8ICFvcmNoZXN0cmF0b3IpIHJldHVyblxuICAgIGRpZEluaXRBZ2VudFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHNlbGVjdEFnZW50KG9yY2hlc3RyYXRvcilcbiAgfSwgW29yY2hlc3RyYXRvciwgc2VsZWN0QWdlbnRdKVxuXG4gIGNvbnN0IGFnZW50c0ZldGNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWFnZW50c0ZldGNoZWRSZWYuY3VycmVudCkge1xuICAgICAgYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgaGFuZGxlR2V0QWdlbnRzKClcbiAgICB9XG4gIH0sIFtoYW5kbGVHZXRBZ2VudHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25NZXJnZUNyZWF0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKG5leHRBZ2VudD8uaWQpIGFkZEFnZW50KG5leHRBZ2VudCwgeyBuYXZpZ2F0ZUhvbWU6IGZhbHNlIH0pXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCBvbk1lcmdlQ3JlYXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgfSwgW2FkZEFnZW50XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uU3luY0VkaXRlZEFnZW50ID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnQ6IG5leHRBZ2VudCB9ID0gKGV2dCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAoIW5leHRBZ2VudD8uaWQpIHJldHVyblxuICAgICAgdXBkYXRlQWdlbnQobmV4dEFnZW50KVxuICAgICAgaWYgKGFnZW50Py5pZCA9PT0gbmV4dEFnZW50LmlkKSBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gIH0sIFt1cGRhdGVBZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50Py5pZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuQ2hhdFZpZXcgPSAoKSA9PiB7XG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5jaGF0KVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1jaGF0LXZpZXcnLCBvcGVuQ2hhdFZpZXcpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1jaGF0LXZpZXcnLCBvcGVuQ2hhdFZpZXcpXG4gIH0sIFtdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3Blbk5ld0NoYXRXaXRoQWdlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXh0QWdlbnQgPSAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbD8uYWdlbnRcbiAgICAgIGlmICghbmV4dEFnZW50KSByZXR1cm5cbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICB9LCBbc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdF0pXG5cbiAgY29uc3Qgc3RhcnRDaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBfbWVudGlvbnM/OiB1bmtub3duLFxuICAgICAgZnVhSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJycsXG4gICAgICAgIGF0dGFjaG1lbnRzOiBhdHRhY2htZW50cyB8fCBbXSxcbiAgICAgICAgLi4uKGZhcUlkID8geyBmYXFJZCB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkIH0gOiB7fSksXG4gICAgICAgIC4uLihmdWFJZCA/IHsgZnVhSWQgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgLy8gU2lkZWJhciB0eXBlcyB0aGlzIHByb3AgYXMgKGNoYXRJZDogc3RyaW5nKSBidXQgcGFzc2VzIHRoZSBmdWxsIGNoYXQgb2JqZWN0IGF0IHJ1bnRpbWVcbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdEFyZzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjaGF0ID0gY2hhdEFyZyBhcyB1bmtub3duIGFzIENoYXRMaXN0SXRlbVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChjaGF0LnNlc3Npb25FeHRlcm5hbElkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gY2hhdC5hZ2VudElkKVxuICAgICAgaWYgKHNlbGVjdGVkQWdlbnQpIHNlbGVjdEFnZW50KHNlbGVjdGVkQWdlbnQpXG4gICAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgYWdlbnRzLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlUmVhZHkgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgICApID0+IHZvaWQsXG4gICAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICAgIHN0cmVhbWluZzogYm9vbGVhbixcbiAgICAgIHdyaXRpbmc6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHNldFNlbmRNZXNzYWdlRnVuY3Rpb24oKCkgPT4gc2VuZE1lc3NhZ2UpXG4gICAgICBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uKCgpID0+IHN0b3BHZW5lcmF0aW9uKVxuICAgICAgc2V0SXNTdHJlYW1pbmcoc3RyZWFtaW5nKVxuICAgICAgc2V0SXNXcml0aW5nKHdyaXRpbmcpXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiB1bmtub3duLFxuICAgICAgZnVhSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIGlmIChzZW5kTWVzc2FnZUZ1bmN0aW9uICYmIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24obWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0Q2hhdChtZXNzYWdlLCBhdHRhY2htZW50cywgZmFxSWQsIGFnZW50U3VnZ2VzdGlvbklkLCBtZW50aW9ucywgZnVhSWQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc3RhcnRDaGF0LCBjb21wdXRlZEN1cnJlbnRPcHRpb24sIHNpZGViYXJIYXNFcnJvcl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUhvbWVMZWF2ZVN0YXJ0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNraXBDaGF0RW50ZXJSZWYuY3VycmVudCA9IHRydWVcbiAgICBzZXRIb21lTGVhdmluZyh0cnVlKVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVIb21lU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiB1bmtub3duLFxuICAgICAgZnVhSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIHNldEhvbWVMZWF2aW5nKGZhbHNlKVxuICAgICAgaGFuZGxlU2VuZE1lc3NhZ2UobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkKVxuICAgIH0sXG4gICAgW2hhbmRsZVNlbmRNZXNzYWdlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhvbWVMZWF2aW5nKGZhbHNlKVxuICAgIHNraXBDaGF0RW50ZXJSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgaWYgKGFnZW50Py5lbnRpdHkgIT09ICdjbGllbnQnKSBzZXRDbGllbnQ/LihudWxsKVxuICAgIH1cbiAgICBpZiAob3JjaGVzdHJhdG9yKSB7XG4gICAgICBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgICghYWdlbnQgfHwgYWdlbnQ/LmlzX2RlbGV0ZWQgfHwgYWdlbnQ/Lmhhc19ub3RfcGVybWlzc2lvbnMgfHwgYWdlbnQ/Lmhhc19ub3RfYWNjZXNzIHx8IGFnZW50Py5wcm9qZWN0X2RlbGV0ZWQpICYmXG4gICAgICBhZ2VudHMuZGF0YS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBzZWxlY3RBZ2VudChhZ2VudHMuZGF0YVswXSlcbiAgICB9XG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB0b2dnbGVXZWJTZWFyY2goKVxuICAgIGlmIChyZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KSByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KClcbiAgfSwgW1xuICAgIGN1cnJlbnRPcHRpb24sXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGFnZW50LFxuICAgIGFnZW50cyxcbiAgICBvcmNoZXN0cmF0b3IsXG4gICAgc2VsZWN0QWdlbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG9tZUxlYXZpbmcoZmFsc2UpXG4gICAgc2tpcENoYXRFbnRlclJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICB9LCBbaXNXZWJTZWFyY2hBY3RpdmUsIHRvZ2dsZVdlYlNlYXJjaCwgc2V0Q2hpcHNQcm9qZWN0XSlcblxuICBjb25zdCBmb2N1c0NoYXRJbnB1dCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbWFpYS1pbnB1dC1yZWZvY3VzJykpXG4gICAgfSwgMTAwKVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVTdGFydE5ld0NoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgZm9jdXNDaGF0SW5wdXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChvcmNoZXN0cmF0b3IpIHNlbGVjdEFnZW50KG9yY2hlc3RyYXRvcilcbiAgICBoYW5kbGVHb0hvbWUoKVxuICAgIGZvY3VzQ2hhdElucHV0KClcbiAgfSwgW2N1cnJlbnRPcHRpb24sIGZvY3VzQ2hhdElucHV0LCBoYW5kbGVHb0hvbWUsIG9yY2hlc3RyYXRvciwgc2VsZWN0QWdlbnRdKVxuXG4gIGNvbnN0IG5vb3AgPSB1c2VDYWxsYmFjaygoKSA9PiB1bmRlZmluZWQsIFtdKVxuXG4gIC8vIFN1cHByZXNzIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nIOKAlCBrZXB0IGZvciBwb3RlbnRpYWwgQW1wbGl0dWRlIHRyYWNraW5nIHBhcml0eVxuICB2b2lkIGFtcGxpdHVkRXZlbnRcblxuICBjb25zdCBjYW5BY2Nlc3NQYWdlID0gdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoc2VjdGlvbilcbiAgY29uc3QgaXNIb21lID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWVcbiAgY29uc3Qgc2hvd0NoYXRGb290ZXIgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCAmJiAhaGFzRXJyb3IgJiYgIWxvYWRpbmcgJiYgY2FuQWNjZXNzUGFnZVxuXG4gIHJldHVybiAoXG4gICAgPFNDUGFnZVdyYXBwZXIgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAge2NhbkFjY2Vzc1BhZ2UgPyAoXG4gICAgICAgIDxTaWRlYmFyXG4gICAgICAgICAgY29udmVyc2F0aW9uc09ubHlcbiAgICAgICAgICBvcGVuPXtzaWRlYmFyT3Blbn1cbiAgICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldFNpZGViYXJPcGVufVxuICAgICAgICAgIG9uR29Ub0NoYXQ9e2dvVG9DaGF0fVxuICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldFNpZGViYXJIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICBoYW5kbGVHb1RvSG9tZT17aGFuZGxlR29Ib21lfVxuICAgICAgICAgIGhhbmRsZVN0YXJ0TmV3Q2hhdD17aGFuZGxlU3RhcnROZXdDaGF0fVxuICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZT17bm9vcH1cbiAgICAgICAgICBoYW5kbGVPcGVuU2tpbGxzPXtub29wfVxuICAgICAgICAgIHNob3dOZXdDaGF0PXtmYWxzZX1cbiAgICAgICAgICByZWZldGNoQ2hhdHM9e3JlZmV0Y2hDaGF0c31cbiAgICAgICAgICBoYW5kbGVTZXRSZWZldGNoQ2hhdHM9e3NldFJlZmV0Y2hDaGF0c31cbiAgICAgICAgICBoYXNFcnJvcj17c2lkZWJhckhhc0Vycm9yfVxuICAgICAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmPXtyZXNldFNlbGVjdGVkQ2hhdFJlZn1cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAgPFNDUGFnZU1haW4+XG4gICAgICAgIDxDaGF0QUlQYWdlSGVhZGVyXG4gICAgICAgICAgb3ZlcmxheT17aXNIb21lICYmICFob21lTGVhdmluZ31cbiAgICAgICAgICBzaG93QmFjaz17IWlzSG9tZX1cbiAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgbG9hZGluZ01vcmU9e2xvYWRpbmdNb3JlfVxuICAgICAgICAgIGhhc01vcmU9e2FnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICBsb2FkTW9yZUFnZW50cz17bG9hZE1vcmVBZ2VudHN9XG4gICAgICAgICAgc29ydEFnZW50c0xpc3Q9e3NvcnRBZ2VudHNMaXN0fVxuICAgICAgICAgIGhhbmRsZVJlc2V0Q2hhdD17aGFuZGxlUmVzZXRDaGF0fVxuICAgICAgICAgIG9uQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgIC8+XG4gICAgICAgIHtoYXNFcnJvciA/IChcbiAgICAgICAgICA8TUFJQUVycm9yIC8+XG4gICAgICAgICkgOiBjYW5BY2Nlc3NQYWdlID8gKFxuICAgICAgICAgIGlzSG9tZSA/IChcbiAgICAgICAgICAgIDxDaGF0QUlQYWdlSG9tZSBvblNlbmRNZXNzYWdlPXtoYW5kbGVIb21lU2VuZE1lc3NhZ2V9IG9uTGVhdmVTdGFydD17aGFuZGxlSG9tZUxlYXZlU3RhcnR9IC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDaGF0QUlDb250ZW50XG4gICAgICAgICAgICAgIGN1cnJlbnRPcHRpb249e29wdGlvbnMuY2hhdH1cbiAgICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldEhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgICAgICByZWZzPXt7IHVzZXJJbml0aWFsTWVzc2FnZSwgaW5pdGlhbENoYXRJZCB9fVxuICAgICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAgICAgZmxvYXRpbmc9e2ZhbHNlfVxuICAgICAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgICAgICBsb2FkaW5nQWdlbnRzPXtsb2FkaW5nfVxuICAgICAgICAgICAgICBhZ2VudEVycm9yPXthZ2VudEVycm9yfVxuICAgICAgICAgICAgICBza2lwRW50ZXJBbmltYXRpb249e3NraXBDaGF0RW50ZXJSZWYuY3VycmVudH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICApIDogKFxuICAgICAgICAgIDxQcm9qZWN0U3VtbWFyeUNvbnRlbnQgb25SZXN0YXJ0U3VtbWFyeT17aGFuZGxlcnMuaG9tZX0gLz5cbiAgICAgICAgKX1cbiAgICAgICAge3Nob3dDaGF0Rm9vdGVyID8gKFxuICAgICAgICAgIDxDaGF0QWlNb2RhbEZvb3RlclxuICAgICAgICAgICAgYWdlbnQ9e2FnZW50fVxuICAgICAgICAgICAgaGFuZGxlU2VuZE1lc3NhZ2U9e2hhbmRsZVNlbmRNZXNzYWdlfVxuICAgICAgICAgICAgaGFuZGxlU3RvcEdlbmVyYXRpb249e3N0b3BHZW5lcmF0aW9uRnVuY3Rpb259XG4gICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICBpc1dyaXRpbmc9e2lzV3JpdGluZ31cbiAgICAgICAgICAgIGNoYXRJZD17aW5pdGlhbENoYXRJZH1cbiAgICAgICAgICAgIG5ld0NoYXRLZXk9e25ld0NoYXRLZXl9XG4gICAgICAgICAgICBsYXlvdXRNb2RlPXtsYXlvdXRNb2RlfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9TQ1BhZ2VNYWluPlxuICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgIDxBYm1BZ2VudE1vZGFsXG4gICAgICAgICAgYWRkQWdlbnQ9e2FkZEFnZW50fVxuICAgICAgICAgIHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH1cbiAgICAgICAgICByZW1vdmVBZ2VudD17cmVtb3ZlQWdlbnR9XG4gICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICBzZWxlY3RGaXJzdEFnZW50PXtzZWxlY3RGaXJzdEFnZW50fVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIDxTbmFja2JhciAvPlxuICAgIDwvU0NQYWdlV3JhcHBlcj5cbiAgKVxufVxu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