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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
  2. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +117 -0
  4. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +31 -101
  5. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +91 -0
  6. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +49 -140
  7. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +257 -0
  8. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -205
  9. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  10. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  11. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
  12. package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
  13. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  14. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  15. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +59 -0
  16. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -57
  17. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
  18. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +184 -0
  19. package/lib/components/atoms/MAIAInput/MAIAInput.js +127 -176
  20. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +96 -0
  21. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -113
  22. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  23. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  24. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +3 -4
  25. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +3 -11
  26. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  27. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +2 -3
  28. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  29. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
  30. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
  31. package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
  32. package/lib/components/atoms/TextArea/TextArea.js +11 -20
  33. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  34. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +6 -29
  35. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +68 -0
  36. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +17 -56
  37. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +133 -0
  38. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +31 -112
  39. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  40. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  41. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
  42. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +197 -233
  43. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +398 -0
  44. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +209 -235
  45. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +515 -4
  46. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +228 -344
  47. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  48. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  49. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +49 -0
  50. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +36 -33
  51. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
  52. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
  53. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
  54. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
  55. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  56. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  57. package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
  58. package/lib/components/molecules/Sidebar/Sidebar.js +25 -22
  59. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +512 -0
  60. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +309 -643
  61. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
  62. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
  63. package/lib/constants/formatExtensions.js +7 -8
  64. package/lib/dev/DevReasoningTimeline.js +8 -50
  65. package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
  66. package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
  67. package/lib/hooks/useChatManager/useChatManager.helpers.js +902 -0
  68. package/lib/hooks/useChatManager/useChatManager.js +267 -741
  69. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +365 -0
  70. package/lib/hooks/useChatMessages/useChatMessages.js +59 -285
  71. package/lib/hooks/useClientSearch.helpers.js +36 -0
  72. package/lib/hooks/useClientSearch.js +4 -32
  73. package/lib/hooks/useContextMentions.helpers.js +212 -0
  74. package/lib/hooks/useContextMentions.js +5 -223
  75. package/lib/hooks/useContextMentions.types.js +2 -0
  76. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  77. package/lib/hooks/useContextPinPopover.js +16 -75
  78. package/lib/hooks/useEntitySearch.helpers.js +407 -0
  79. package/lib/hooks/useEntitySearch.js +52 -436
  80. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  81. package/lib/hooks/useMentionPopover.js +9 -35
  82. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  83. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  84. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
  85. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
  86. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  87. package/lib/hooks/useProjectSearch.js +4 -58
  88. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  89. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  90. package/lib/hooks/useReasoningTrace/reasoningStore.js +8 -39
  91. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  92. package/lib/hooks/useRecentClientsSearch.js +4 -32
  93. package/lib/lang/br/index.js +1 -7
  94. package/lib/lang/en/index.js +1 -7
  95. package/lib/lang/es/index.js +1 -7
  96. package/lib/lang/fr/index.js +1 -7
  97. package/lib/services/maia/Agents/getAgents.helpers.js +241 -0
  98. package/lib/services/maia/Agents/getAgents.js +90 -282
  99. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  100. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  101. package/lib/services/utils/mapChatMessages.helpers.js +223 -0
  102. package/lib/services/utils/mapChatMessages.js +25 -254
  103. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  104. package/lib/store/sessions/sessionNotifications.js +35 -41
  105. package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
  106. package/lib/store/sessions/sessionStreamManager.js +172 -236
  107. package/lib/test/mockSseStream.js +121 -0
  108. package/lib/test/streamdownCodeMock.js +6 -0
  109. package/lib/test/streamdownMock.js +12 -0
  110. package/lib/types/Chat.js +1 -1
  111. package/lib/types/agentModal.js +1 -1
  112. package/lib/types/reasoning.js +1 -1
  113. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  114. package/lib/utils/imagePreprocessor.js +12 -37
  115. package/lib/utils/renderContextMentions.helpers.js +110 -0
  116. package/lib/utils/renderContextMentions.js +4 -110
  117. package/lib/utils/streamActivityMessages.helpers.js +222 -0
  118. package/lib/utils/streamActivityMessages.js +4 -221
  119. package/package.json +2 -2
  120. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +0 -53
  121. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +0 -8
  122. package/lib/components/atoms/ContextCompactedNotice/index.js +0 -2
  123. package/lib/types/contextCompaction.js +0 -48
  124. package/lib/types/jest-dom.d.js +0 -2
@@ -0,0 +1,365 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ 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; }
6
+ 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; }
7
+ import { buildContextMessage } from '../../types/contextMention';
8
+ import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
9
+ import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActionMessage';
10
+ import { getChatsStoreState } from '../../store/useChatsStore';
11
+ import { isActiveSessionStatus } from '../../store/sessions/sessions.types';
12
+ /** El modal usa `{ message: '', attachments: [] }` como "sin mensaje inicial"; no es falsy. */
13
+ export var hasMeaningfulUserInitialMessage = function hasMeaningfulUserInitialMessage(userInitialMessage) {
14
+ var _userInitialMessage$m, _userInitialMessage$a;
15
+ return Boolean(userInitialMessage && (((_userInitialMessage$m = userInitialMessage.message) === null || _userInitialMessage$m === void 0 ? void 0 : _userInitialMessage$m.trim()) || ((_userInitialMessage$a = userInitialMessage.attachments) === null || _userInitialMessage$a === void 0 ? void 0 : _userInitialMessage$a.length) || userInitialMessage.fuaId || userInitialMessage.scId));
16
+ };
17
+
18
+ /** Marca la sesión como leída cuando terminó de hidratarse y sigue siendo la activa y visible. */
19
+ export var markOpenedSessionAsReadIfVisible = function markOpenedSessionAsReadIfVisible(sessionId) {
20
+ var _getChatsStoreState = getChatsStoreState(),
21
+ isChatViewVisible = _getChatsStoreState.isChatViewVisible,
22
+ activeChatId = _getChatsStoreState.activeChatId,
23
+ markChatAsRead = _getChatsStoreState.markChatAsRead;
24
+ if (!isChatViewVisible || activeChatId !== sessionId) return;
25
+ markChatAsRead(sessionId);
26
+ };
27
+ export var buildInitialMessagePlaceholder = function buildInitialMessagePlaceholder(userInitialMessage, currentUser) {
28
+ return [_objectSpread(_objectSpread({
29
+ id: 'user-initial-message',
30
+ date: new Date(),
31
+ user: currentUser,
32
+ message: formatQuickActionMessageForDisplay(userInitialMessage.message, {
33
+ fuaId: userInitialMessage.fuaId,
34
+ scId: userInitialMessage.scId
35
+ })
36
+ }, userInitialMessage.attachments ? {
37
+ attachments: userInitialMessage.attachments
38
+ } : {}), buildContextMessage(userInitialMessage.mentions) ? {
39
+ contextMessage: buildContextMessage(userInitialMessage.mentions)
40
+ } : {})];
41
+ };
42
+ export var rewriteTaskUrlsInContent = function rewriteTaskUrlsInContent(content, tabSegment) {
43
+ var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
44
+ return content.replace(taskUrlRegex, function (url) {
45
+ return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
46
+ });
47
+ };
48
+ export var conversationProjectToGlobalProject = function conversationProjectToGlobalProject(project) {
49
+ var _project$client;
50
+ if (!project) return null;
51
+ var id = typeof project.id === 'number' ? project.id : Number(project.id);
52
+ if (!Number.isFinite(id)) return null;
53
+ return _objectSpread({
54
+ id: id,
55
+ name: project.name
56
+ }, ((_project$client = project.client) === null || _project$client === void 0 ? void 0 : _project$client.id) != null && project.client.name ? {
57
+ client: {
58
+ id: project.client.id,
59
+ name: project.client.name
60
+ }
61
+ } : {});
62
+ };
63
+ export var resolveTaskFromConversationMetadata = function resolveTaskFromConversationMetadata(taskId, taskName) {
64
+ return taskId != null && taskName ? {
65
+ id: taskId,
66
+ name: taskName
67
+ } : null;
68
+ };
69
+ export var hasClientConversationMetadata = function hasClientConversationMetadata(clientId, clientName) {
70
+ return clientId != null && Boolean(clientName);
71
+ };
72
+ export var shouldApplyMultiAgentProjectContext = function shouldApplyMultiAgentProjectContext(projectIdMessage, hasMultiAgentsAccess) {
73
+ return Boolean(projectIdMessage && hasMultiAgentsAccess);
74
+ };
75
+ export var resolveProjectChipFromSession = function resolveProjectChipFromSession(projectIdMessage, projectNameFromSession) {
76
+ var clientName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
77
+ return {
78
+ projectName: projectNameFromSession,
79
+ clientName: clientName,
80
+ projectId: String(projectIdMessage)
81
+ };
82
+ };
83
+ export var resolveProjectContextFromFetch = function resolveProjectContextFromFetch(projectIdMessage, projects, projectNameFromSession) {
84
+ var projectIdNum = Number(projectIdMessage);
85
+ var foundProject = projects.find(function (project) {
86
+ return Number(project.id) === projectIdNum;
87
+ });
88
+ if (foundProject) {
89
+ var _foundProject$client;
90
+ return {
91
+ chipsProject: {
92
+ projectName: foundProject.name,
93
+ clientName: ((_foundProject$client = foundProject.client) === null || _foundProject$client === void 0 ? void 0 : _foundProject$client.name) || '',
94
+ projectId: String(foundProject.id)
95
+ },
96
+ project: foundProject
97
+ };
98
+ }
99
+ if (projectNameFromSession) {
100
+ return {
101
+ chipsProject: resolveProjectChipFromSession(projectIdMessage, projectNameFromSession),
102
+ project: {
103
+ id: projectIdNum,
104
+ name: projectNameFromSession
105
+ }
106
+ };
107
+ }
108
+ return {
109
+ chipsProject: null,
110
+ project: null
111
+ };
112
+ };
113
+ export var resolveTaskUrlTabSegment = function resolveTaskUrlTabSegment(tab) {
114
+ return tab ? "/".concat(tab) : '/detail';
115
+ };
116
+ export var rewriteChatMessagesTaskUrls = function rewriteChatMessagesTaskUrls(items, tabSegment) {
117
+ return items.map(function (item) {
118
+ return _objectSpread(_objectSpread({}, item), {}, {
119
+ message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
120
+ });
121
+ });
122
+ };
123
+ export var mergeChatMessagesWithActiveSessionTail = function mergeChatMessagesWithActiveSessionTail(historical, tail) {
124
+ var existingIds = new Set(historical.map(function (item) {
125
+ return item.id;
126
+ }));
127
+ var extra = tail.filter(function (item) {
128
+ return !existingIds.has(item.id);
129
+ });
130
+ return extra.length ? [].concat(_toConsumableArray(historical), _toConsumableArray(extra)) : historical;
131
+ };
132
+ export var shouldAbortStaleMessageLoad = function shouldAbortStaleMessageLoad(seq, currentSeq, targetChatId, activeChatId) {
133
+ return seq !== currentSeq || targetChatId !== activeChatId;
134
+ };
135
+ export var buildDeletedSessionAgent = function buildDeletedSessionAgent(agentDeleted, agentNoPermission) {
136
+ return _objectSpread(_objectSpread({
137
+ id: agentDeleted.id,
138
+ name: agentDeleted.name,
139
+ emoji: agentDeleted.emoji,
140
+ type: 'custom',
141
+ is_deleted: true
142
+ }, agentDeleted.deletedAt ? {
143
+ deleted_at: agentDeleted.deletedAt
144
+ } : {}), agentNoPermission !== null && agentNoPermission !== void 0 && agentNoPermission.connectors ? {
145
+ connectors: agentNoPermission.connectors
146
+ } : {});
147
+ };
148
+ export var shouldSelectOrphanSessionAgent = function shouldSelectOrphanSessionAgent(params) {
149
+ return Boolean(params.agentNoPermission && !params.agentDeleted && params.userCanViewAgents && params.hasAgentAccess && params.hasAgentPermission && !params.agentExistsInList);
150
+ };
151
+ export var buildOrphanSessionAgent = function buildOrphanSessionAgent(agentNoPermission, projectDeleted) {
152
+ return _objectSpread(_objectSpread({
153
+ id: agentNoPermission.id,
154
+ name: agentNoPermission.name,
155
+ emoji: agentNoPermission.emoji,
156
+ type: agentNoPermission.type,
157
+ is_from_conversation: true
158
+ }, agentNoPermission.connectors ? {
159
+ connectors: agentNoPermission.connectors
160
+ } : {}), projectDeleted ? {
161
+ project_deleted: {
162
+ name: projectDeleted.name
163
+ }
164
+ } : {});
165
+ };
166
+ export var shouldMergeListedSessionAgent = function shouldMergeListedSessionAgent(params) {
167
+ return Boolean(params.agentNoPermission && !params.agentDeleted && params.hasAgentAccess && params.hasAgentPermission && params.agentExistsInList);
168
+ };
169
+ export var mergeListedSessionAgent = function mergeListedSessionAgent(agentInList, agentNoPermission, projectDeleted) {
170
+ return _objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
171
+ connectors: agentNoPermission.connectors
172
+ } : {}), projectDeleted ? {
173
+ project_deleted: {
174
+ name: projectDeleted.name
175
+ }
176
+ } : {
177
+ project_deleted: undefined
178
+ });
179
+ };
180
+ export var resolveRestrictedSessionAgent = function resolveRestrictedSessionAgent(agentNoPermission, params) {
181
+ var base = _objectSpread(_objectSpread({
182
+ id: agentNoPermission.id,
183
+ name: agentNoPermission.name,
184
+ emoji: agentNoPermission.emoji,
185
+ type: agentNoPermission.type
186
+ }, agentNoPermission.connectors ? {
187
+ connectors: agentNoPermission.connectors
188
+ } : {}), params.projectDeleted ? {
189
+ project_deleted: {
190
+ name: params.projectDeleted.name
191
+ }
192
+ } : {});
193
+ if (!params.hasAgentAccess) {
194
+ return {
195
+ reason: 'no_access',
196
+ agent: _objectSpread(_objectSpread({}, base), {}, {
197
+ has_not_access: true
198
+ })
199
+ };
200
+ }
201
+ if (!params.hasAgentPermission) {
202
+ return {
203
+ reason: 'no_permission',
204
+ agent: _objectSpread(_objectSpread({}, base), {}, {
205
+ has_not_permissions: true
206
+ })
207
+ };
208
+ }
209
+ if (params.projectDeleted) {
210
+ return {
211
+ reason: 'project_deleted',
212
+ agent: _objectSpread(_objectSpread({
213
+ id: agentNoPermission.id,
214
+ name: agentNoPermission.name,
215
+ emoji: agentNoPermission.emoji,
216
+ type: agentNoPermission.type
217
+ }, agentNoPermission.connectors ? {
218
+ connectors: agentNoPermission.connectors
219
+ } : {}), {}, {
220
+ project_deleted: {
221
+ name: params.projectDeleted.name
222
+ }
223
+ })
224
+ };
225
+ }
226
+ return null;
227
+ };
228
+ /** Réplica la cadena de `selectAgent` en `loadMessages` (última selección gana). */
229
+ export var resolveSessionAgentFromChatLoad = function resolveSessionAgentFromChatLoad(ctx) {
230
+ var agentDeleted = ctx.agentDeleted,
231
+ agentNoPermission = ctx.agentNoPermission,
232
+ agents = ctx.agents,
233
+ projectDeleted = ctx.projectDeleted;
234
+ var selected = null;
235
+ if (agentDeleted) {
236
+ selected = buildDeletedSessionAgent(agentDeleted, agentNoPermission);
237
+ }
238
+ var agentExistsInList = Boolean(agentNoPermission && agents.some(function (agentItem) {
239
+ return agentItem.id === agentNoPermission.id;
240
+ }));
241
+ if (shouldSelectOrphanSessionAgent({
242
+ agentNoPermission: agentNoPermission,
243
+ agentDeleted: agentDeleted,
244
+ userCanViewAgents: ctx.userCanViewAgents,
245
+ hasAgentAccess: ctx.hasAgentAccess,
246
+ hasAgentPermission: ctx.hasAgentPermission,
247
+ agentExistsInList: agentExistsInList
248
+ }) && agentNoPermission) {
249
+ selected = buildOrphanSessionAgent(agentNoPermission, projectDeleted);
250
+ }
251
+ if (shouldMergeListedSessionAgent({
252
+ agentNoPermission: agentNoPermission,
253
+ agentDeleted: agentDeleted,
254
+ hasAgentAccess: ctx.hasAgentAccess,
255
+ hasAgentPermission: ctx.hasAgentPermission,
256
+ agentExistsInList: agentExistsInList
257
+ }) && agentNoPermission) {
258
+ var agentInList = agents.find(function (agentItem) {
259
+ return agentItem.id === agentNoPermission.id;
260
+ });
261
+ if (agentInList) {
262
+ selected = mergeListedSessionAgent(agentInList, agentNoPermission, projectDeleted);
263
+ }
264
+ }
265
+ if (agentNoPermission && !agentDeleted) {
266
+ var restricted = resolveRestrictedSessionAgent(agentNoPermission, {
267
+ hasAgentAccess: ctx.hasAgentAccess,
268
+ hasAgentPermission: ctx.hasAgentPermission,
269
+ projectDeleted: projectDeleted
270
+ });
271
+ if (restricted) {
272
+ selected = restricted.agent;
273
+ }
274
+ }
275
+ return selected;
276
+ };
277
+ export var buildSessionConversationMeta = function buildSessionConversationMeta(fields) {
278
+ return {
279
+ projectIdMessage: fields.projectIdMessage,
280
+ projectNameFromSession: fields.projectNameFromSession,
281
+ clientIdFromSession: fields.clientIdFromSession,
282
+ clientNameFromSession: fields.clientNameFromSession,
283
+ taskIdFromSession: fields.taskIdFromSession,
284
+ taskNameFromSession: fields.taskNameFromSession
285
+ };
286
+ };
287
+ export var buildSessionMetaEventDetail = function buildSessionMetaEventDetail(chatId, fields) {
288
+ return {
289
+ chatId: chatId,
290
+ agentType: fields.agentType,
291
+ agentEntity: fields.agentEntity,
292
+ projectId: fields.projectId,
293
+ projectName: fields.projectName,
294
+ clientId: fields.clientId,
295
+ clientName: fields.clientName,
296
+ taskId: fields.taskId,
297
+ taskName: fields.taskName
298
+ };
299
+ };
300
+ export var hasConversationProjectContext = function hasConversationProjectContext(projectIdMessage) {
301
+ return Boolean(projectIdMessage);
302
+ };
303
+ export var rewriteMessagesForProjectTaskUrls = /*#__PURE__*/function () {
304
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(items, projectIdMessage, getTabTaskDefault) {
305
+ var tab;
306
+ return _regeneratorRuntime.wrap(function (_context) {
307
+ while (1) switch (_context.prev = _context.next) {
308
+ case 0:
309
+ if (hasConversationProjectContext(projectIdMessage)) {
310
+ _context.next = 1;
311
+ break;
312
+ }
313
+ return _context.abrupt("return", items);
314
+ case 1:
315
+ _context.next = 2;
316
+ return getTabTaskDefault(1);
317
+ case 2:
318
+ tab = _context.sent;
319
+ return _context.abrupt("return", rewriteChatMessagesTaskUrls(items, resolveTaskUrlTabSegment(tab)));
320
+ case 3:
321
+ case "end":
322
+ return _context.stop();
323
+ }
324
+ }, _callee);
325
+ }));
326
+ return function rewriteMessagesForProjectTaskUrls(_x, _x2, _x3) {
327
+ return _ref.apply(this, arguments);
328
+ };
329
+ }();
330
+ export var resolveFinalMessagesWithActiveStreamingTail = function resolveFinalMessagesWithActiveStreamingTail(items, tail, sessionStatus) {
331
+ if (sessionStatus && isActiveSessionStatus(sessionStatus)) {
332
+ return mergeChatMessagesWithActiveSessionTail(items, tail);
333
+ }
334
+ return items;
335
+ };
336
+ export var shouldLoadMoreMessagesOnScroll = function shouldLoadMoreMessagesOnScroll(scrollTop, scrollHeight, clientHeight) {
337
+ var thresholdPercent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 90;
338
+ var scrollable = scrollHeight - clientHeight;
339
+ if (scrollable <= 0) return false;
340
+ var scrollPercentage = scrollTop / scrollable * 100;
341
+ return scrollPercentage > thresholdPercent;
342
+ };
343
+ export var messagesNeedTabRewrite = function messagesNeedTabRewrite(messages, tabTaskDefault) {
344
+ var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
345
+ return messages.some(function (msg) {
346
+ var content = msg.message || '';
347
+ var matches = content.match(taskUrlRegex);
348
+ if (!(matches !== null && matches !== void 0 && matches.length)) return false;
349
+ return matches.some(function (url) {
350
+ return !url.endsWith("/".concat(tabTaskDefault)) && !url.includes("/".concat(tabTaskDefault, "?"));
351
+ });
352
+ });
353
+ };
354
+ export var upsertChatMessage = function upsertChatMessage(previous, message) {
355
+ var existingMessageIndex = previous.findIndex(function (msg) {
356
+ return msg.id === message.id;
357
+ });
358
+ if (existingMessageIndex >= 0) {
359
+ return previous.map(function (msg, index) {
360
+ return index === existingMessageIndex ? message : msg;
361
+ });
362
+ }
363
+ return [].concat(_toConsumableArray(previous), [message]);
364
+ };
365
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJidWlsZENvbnRleHRNZXNzYWdlIiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsImZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkiLCJnZXRDaGF0c1N0b3JlU3RhdGUiLCJpc0FjdGl2ZVNlc3Npb25TdGF0dXMiLCJoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlIiwidXNlckluaXRpYWxNZXNzYWdlIiwiX3VzZXJJbml0aWFsTWVzc2FnZSRtIiwiX3VzZXJJbml0aWFsTWVzc2FnZSRhIiwiQm9vbGVhbiIsIm1lc3NhZ2UiLCJ0cmltIiwiYXR0YWNobWVudHMiLCJsZW5ndGgiLCJmdWFJZCIsInNjSWQiLCJtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSIsInNlc3Npb25JZCIsIl9nZXRDaGF0c1N0b3JlU3RhdGUiLCJpc0NoYXRWaWV3VmlzaWJsZSIsImFjdGl2ZUNoYXRJZCIsIm1hcmtDaGF0QXNSZWFkIiwiYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyIiwiY3VycmVudFVzZXIiLCJfb2JqZWN0U3ByZWFkIiwiaWQiLCJkYXRlIiwiRGF0ZSIsInVzZXIiLCJtZW50aW9ucyIsImNvbnRleHRNZXNzYWdlIiwicmV3cml0ZVRhc2tVcmxzSW5Db250ZW50IiwiY29udGVudCIsInRhYlNlZ21lbnQiLCJ0YXNrVXJsUmVnZXgiLCJSZWdFeHAiLCJyZXBsYWNlIiwidXJsIiwiY29udmVyc2F0aW9uUHJvamVjdFRvR2xvYmFsUHJvamVjdCIsInByb2plY3QiLCJfcHJvamVjdCRjbGllbnQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIm5hbWUiLCJjbGllbnQiLCJyZXNvbHZlVGFza0Zyb21Db252ZXJzYXRpb25NZXRhZGF0YSIsInRhc2tJZCIsInRhc2tOYW1lIiwiaGFzQ2xpZW50Q29udmVyc2F0aW9uTWV0YWRhdGEiLCJjbGllbnRJZCIsImNsaWVudE5hbWUiLCJzaG91bGRBcHBseU11bHRpQWdlbnRQcm9qZWN0Q29udGV4dCIsInByb2plY3RJZE1lc3NhZ2UiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsInJlc29sdmVQcm9qZWN0Q2hpcEZyb21TZXNzaW9uIiwicHJvamVjdE5hbWVGcm9tU2Vzc2lvbiIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsInByb2plY3ROYW1lIiwicHJvamVjdElkIiwiU3RyaW5nIiwicmVzb2x2ZVByb2plY3RDb250ZXh0RnJvbUZldGNoIiwicHJvamVjdHMiLCJwcm9qZWN0SWROdW0iLCJmb3VuZFByb2plY3QiLCJmaW5kIiwiX2ZvdW5kUHJvamVjdCRjbGllbnQiLCJjaGlwc1Byb2plY3QiLCJyZXNvbHZlVGFza1VybFRhYlNlZ21lbnQiLCJ0YWIiLCJjb25jYXQiLCJyZXdyaXRlQ2hhdE1lc3NhZ2VzVGFza1VybHMiLCJpdGVtcyIsIm1hcCIsIml0ZW0iLCJtZXJnZUNoYXRNZXNzYWdlc1dpdGhBY3RpdmVTZXNzaW9uVGFpbCIsImhpc3RvcmljYWwiLCJ0YWlsIiwiZXhpc3RpbmdJZHMiLCJTZXQiLCJleHRyYSIsImZpbHRlciIsImhhcyIsIl90b0NvbnN1bWFibGVBcnJheSIsInNob3VsZEFib3J0U3RhbGVNZXNzYWdlTG9hZCIsInNlcSIsImN1cnJlbnRTZXEiLCJ0YXJnZXRDaGF0SWQiLCJidWlsZERlbGV0ZWRTZXNzaW9uQWdlbnQiLCJhZ2VudERlbGV0ZWQiLCJhZ2VudE5vUGVybWlzc2lvbiIsImVtb2ppIiwidHlwZSIsImlzX2RlbGV0ZWQiLCJkZWxldGVkQXQiLCJkZWxldGVkX2F0IiwiY29ubmVjdG9ycyIsInNob3VsZFNlbGVjdE9ycGhhblNlc3Npb25BZ2VudCIsInBhcmFtcyIsInVzZXJDYW5WaWV3QWdlbnRzIiwiaGFzQWdlbnRBY2Nlc3MiLCJoYXNBZ2VudFBlcm1pc3Npb24iLCJhZ2VudEV4aXN0c0luTGlzdCIsImJ1aWxkT3JwaGFuU2Vzc2lvbkFnZW50IiwicHJvamVjdERlbGV0ZWQiLCJpc19mcm9tX2NvbnZlcnNhdGlvbiIsInByb2plY3RfZGVsZXRlZCIsInNob3VsZE1lcmdlTGlzdGVkU2Vzc2lvbkFnZW50IiwibWVyZ2VMaXN0ZWRTZXNzaW9uQWdlbnQiLCJhZ2VudEluTGlzdCIsInJlc29sdmVSZXN0cmljdGVkU2Vzc2lvbkFnZW50IiwiYmFzZSIsInJlYXNvbiIsImFnZW50IiwiaGFzX25vdF9hY2Nlc3MiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwicmVzb2x2ZVNlc3Npb25BZ2VudEZyb21DaGF0TG9hZCIsImN0eCIsImFnZW50cyIsInNlbGVjdGVkIiwic29tZSIsImFnZW50SXRlbSIsInJlc3RyaWN0ZWQiLCJidWlsZFNlc3Npb25Db252ZXJzYXRpb25NZXRhIiwiZmllbGRzIiwiY2xpZW50SWRGcm9tU2Vzc2lvbiIsImNsaWVudE5hbWVGcm9tU2Vzc2lvbiIsInRhc2tJZEZyb21TZXNzaW9uIiwidGFza05hbWVGcm9tU2Vzc2lvbiIsImJ1aWxkU2Vzc2lvbk1ldGFFdmVudERldGFpbCIsImNoYXRJZCIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwiaGFzQ29udmVyc2F0aW9uUHJvamVjdENvbnRleHQiLCJyZXdyaXRlTWVzc2FnZXNGb3JQcm9qZWN0VGFza1VybHMiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJnZXRUYWJUYXNrRGVmYXVsdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiYWJydXB0Iiwic2VudCIsInN0b3AiLCJfeCIsIl94MiIsIl94MyIsImFwcGx5IiwicmVzb2x2ZUZpbmFsTWVzc2FnZXNXaXRoQWN0aXZlU3RyZWFtaW5nVGFpbCIsInNlc3Npb25TdGF0dXMiLCJzaG91bGRMb2FkTW9yZU1lc3NhZ2VzT25TY3JvbGwiLCJzY3JvbGxUb3AiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJ0aHJlc2hvbGRQZXJjZW50Iiwic2Nyb2xsYWJsZSIsInNjcm9sbFBlcmNlbnRhZ2UiLCJtZXNzYWdlc05lZWRUYWJSZXdyaXRlIiwibWVzc2FnZXMiLCJ0YWJUYXNrRGVmYXVsdCIsIm1zZyIsIm1hdGNoZXMiLCJtYXRjaCIsImVuZHNXaXRoIiwiaW5jbHVkZXMiLCJ1cHNlcnRDaGF0TWVzc2FnZSIsInByZXZpb3VzIiwiZXhpc3RpbmdNZXNzYWdlSW5kZXgiLCJmaW5kSW5kZXgiLCJpbmRleCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VDaGF0TWVzc2FnZXMvdXNlQ2hhdE1lc3NhZ2VzLmhlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRNZXNzYWdlVXNlciB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBidWlsZENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBUQVNLX1VSTF9SRUdFWF9QQVRURVJOIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3Rhc2tVcmxzJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcbmltcG9ydCB7IGdldENoYXRzU3RvcmVTdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3VzZUNoYXRzU3RvcmUnXG5pbXBvcnQgdHlwZSB7IEFnZW50LCBBZ2VudFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgdHlwZSB7IFVzZUNoYXRNZXNzYWdlc1Byb3BzIH0gZnJvbSAnLi91c2VDaGF0TWVzc2FnZXMuaW50ZXJmYWNlJ1xuaW1wb3J0IHtcbiAgaXNBY3RpdmVTZXNzaW9uU3RhdHVzLFxuICB0eXBlIFNlc3Npb25Db252ZXJzYXRpb25NZXRhLFxuICB0eXBlIFNlc3Npb25NZXRhRXZlbnREZXRhaWwsXG4gIHR5cGUgU2Vzc2lvblN0YXR1cyxcbn0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5cbnR5cGUgVXNlckluaXRpYWxNZXNzYWdlID0gVXNlQ2hhdE1lc3NhZ2VzUHJvcHNbJ3VzZXJJbml0aWFsTWVzc2FnZSddXG5cbi8qKiBFbCBtb2RhbCB1c2EgYHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9YCBjb21vIFwic2luIG1lbnNhamUgaW5pY2lhbFwiOyBubyBlcyBmYWxzeS4gKi9cbmV4cG9ydCBjb25zdCBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlID0gKHVzZXJJbml0aWFsTWVzc2FnZT86IFVzZXJJbml0aWFsTWVzc2FnZSk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UgJiZcbiAgICAodXNlckluaXRpYWxNZXNzYWdlLm1lc3NhZ2U/LnRyaW0oKSB8fFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggfHxcbiAgICAgIHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB8fFxuICAgICAgdXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG4gIClcblxuLyoqIE1hcmNhIGxhIHNlc2nDs24gY29tbyBsZcOtZGEgY3VhbmRvIHRlcm1pbsOzIGRlIGhpZHJhdGFyc2UgeSBzaWd1ZSBzaWVuZG8gbGEgYWN0aXZhIHkgdmlzaWJsZS4gKi9cbmV4cG9ydCBjb25zdCBtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSA9IChzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCB7IGlzQ2hhdFZpZXdWaXNpYmxlLCBhY3RpdmVDaGF0SWQsIG1hcmtDaGF0QXNSZWFkIH0gPSBnZXRDaGF0c1N0b3JlU3RhdGUoKVxuICBpZiAoIWlzQ2hhdFZpZXdWaXNpYmxlIHx8IGFjdGl2ZUNoYXRJZCAhPT0gc2Vzc2lvbklkKSByZXR1cm5cbiAgbWFya0NoYXRBc1JlYWQoc2Vzc2lvbklkKVxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyID0gKFxuICB1c2VySW5pdGlhbE1lc3NhZ2U6IE5vbk51bGxhYmxlPFVzZXJJbml0aWFsTWVzc2FnZT4sXG4gIGN1cnJlbnRVc2VyOiBDaGF0TWVzc2FnZVVzZXJcbik6IENoYXRNZXNzYWdlW10gPT4gW1xuICB7XG4gICAgaWQ6ICd1c2VyLWluaXRpYWwtbWVzc2FnZScsXG4gICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICB1c2VyOiBjdXJyZW50VXNlcixcbiAgICBtZXNzYWdlOiBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLCB7XG4gICAgICBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkLFxuICAgICAgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQsXG4gICAgfSksXG4gICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgID8geyBjb250ZXh0TWVzc2FnZTogYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpIH1cbiAgICAgIDoge30pLFxuICB9LFxuXVxuXG5leHBvcnQgY29uc3QgcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZywgdGFiU2VnbWVudDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICB1cmwucmVwbGFjZSgvXFwvKGRldGFpbHxtZXNzYWdlfG1lc3NhZ2VzfGZpbGVzfGhpc3Rvcnl8aG91cnMpKD89JHxcXD8pLywgdGFiU2VnbWVudClcbiAgKVxufVxuXG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25Qcm9qZWN0T3B0aW9uID0ge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjbGllbnQ/OiB7IG5hbWU/OiBzdHJpbmc7IGlkPzogbnVtYmVyIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbnZlcnNhdGlvblByb2plY3RUb0dsb2JhbFByb2plY3QgPSAocHJvamVjdDogQ29udmVyc2F0aW9uUHJvamVjdE9wdGlvbiB8IG51bGwpOiBQcm9qZWN0IHwgbnVsbCA9PiB7XG4gIGlmICghcHJvamVjdCkgcmV0dXJuIG51bGxcbiAgY29uc3QgaWQgPSB0eXBlb2YgcHJvamVjdC5pZCA9PT0gJ251bWJlcicgPyBwcm9qZWN0LmlkIDogTnVtYmVyKHByb2plY3QuaWQpXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGlkKSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4ge1xuICAgIGlkLFxuICAgIG5hbWU6IHByb2plY3QubmFtZSxcbiAgICAuLi4ocHJvamVjdC5jbGllbnQ/LmlkICE9IG51bGwgJiYgcHJvamVjdC5jbGllbnQubmFtZVxuICAgICAgPyB7IGNsaWVudDogeyBpZDogcHJvamVjdC5jbGllbnQuaWQsIG5hbWU6IHByb2plY3QuY2xpZW50Lm5hbWUgfSB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBDb252ZXJzYXRpb25Qcm9qZWN0Q2hpcCA9IHtcbiAgcHJvamVjdE5hbWU6IHN0cmluZ1xuICBjbGllbnROYW1lOiBzdHJpbmdcbiAgcHJvamVjdElkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUYXNrRnJvbUNvbnZlcnNhdGlvbk1ldGFkYXRhID0gKFxuICB0YXNrSWQ/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsLFxuICB0YXNrTmFtZT86IHN0cmluZyB8IG51bGxcbik6IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgbmFtZTogc3RyaW5nIH0gfCBudWxsID0+ICh0YXNrSWQgIT0gbnVsbCAmJiB0YXNrTmFtZSA/IHsgaWQ6IHRhc2tJZCwgbmFtZTogdGFza05hbWUgfSA6IG51bGwpXG5cbmV4cG9ydCBjb25zdCBoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YSA9IChjbGllbnRJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwsIGNsaWVudE5hbWU/OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiA9PlxuICBjbGllbnRJZCAhPSBudWxsICYmIEJvb2xlYW4oY2xpZW50TmFtZSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFwcGx5TXVsdGlBZ2VudFByb2plY3RDb250ZXh0ID0gKFxuICBwcm9qZWN0SWRNZXNzYWdlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBoYXNNdWx0aUFnZW50c0FjY2VzczogYm9vbGVhblxuKTogYm9vbGVhbiA9PiBCb29sZWFuKHByb2plY3RJZE1lc3NhZ2UgJiYgaGFzTXVsdGlBZ2VudHNBY2Nlc3MpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlUHJvamVjdENoaXBGcm9tU2Vzc2lvbiA9IChcbiAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyLFxuICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcsXG4gIGNsaWVudE5hbWUgPSAnJ1xuKTogQ29udmVyc2F0aW9uUHJvamVjdENoaXAgPT4gKHtcbiAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gIGNsaWVudE5hbWUsXG4gIHByb2plY3RJZDogU3RyaW5nKHByb2plY3RJZE1lc3NhZ2UpLFxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVQcm9qZWN0Q29udGV4dEZyb21GZXRjaCA9IChcbiAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyLFxuICBwcm9qZWN0czogQ29udmVyc2F0aW9uUHJvamVjdE9wdGlvbltdLFxuICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uPzogc3RyaW5nIHwgbnVsbFxuKTogeyBjaGlwc1Byb2plY3Q6IENvbnZlcnNhdGlvblByb2plY3RDaGlwIHwgbnVsbDsgcHJvamVjdDogQ29udmVyc2F0aW9uUHJvamVjdE9wdGlvbiB8IG51bGwgfSA9PiB7XG4gIGNvbnN0IHByb2plY3RJZE51bSA9IE51bWJlcihwcm9qZWN0SWRNZXNzYWdlKVxuICBjb25zdCBmb3VuZFByb2plY3QgPSBwcm9qZWN0cy5maW5kKHByb2plY3QgPT4gTnVtYmVyKHByb2plY3QuaWQpID09PSBwcm9qZWN0SWROdW0pXG5cbiAgaWYgKGZvdW5kUHJvamVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICBjaGlwc1Byb2plY3Q6IHtcbiAgICAgICAgcHJvamVjdE5hbWU6IGZvdW5kUHJvamVjdC5uYW1lLFxuICAgICAgICBjbGllbnROYW1lOiBmb3VuZFByb2plY3QuY2xpZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBwcm9qZWN0SWQ6IFN0cmluZyhmb3VuZFByb2plY3QuaWQpLFxuICAgICAgfSxcbiAgICAgIHByb2plY3Q6IGZvdW5kUHJvamVjdCxcbiAgICB9XG4gIH1cblxuICBpZiAocHJvamVjdE5hbWVGcm9tU2Vzc2lvbikge1xuICAgIHJldHVybiB7XG4gICAgICBjaGlwc1Byb2plY3Q6IHJlc29sdmVQcm9qZWN0Q2hpcEZyb21TZXNzaW9uKHByb2plY3RJZE1lc3NhZ2UsIHByb2plY3ROYW1lRnJvbVNlc3Npb24pLFxuICAgICAgcHJvamVjdDogeyBpZDogcHJvamVjdElkTnVtLCBuYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uIH0sXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2hpcHNQcm9qZWN0OiBudWxsLCBwcm9qZWN0OiBudWxsIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUYXNrVXJsVGFiU2VnbWVudCA9ICh0YWI6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4gKHRhYiA/IGAvJHt0YWJ9YCA6ICcvZGV0YWlsJylcblxuZXhwb3J0IGNvbnN0IHJld3JpdGVDaGF0TWVzc2FnZXNUYXNrVXJscyA9IChpdGVtczogQ2hhdE1lc3NhZ2VbXSwgdGFiU2VnbWVudDogc3RyaW5nKTogQ2hhdE1lc3NhZ2VbXSA9PlxuICBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgIC4uLml0ZW0sXG4gICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KGl0ZW0ubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gIH0pKVxuXG5leHBvcnQgY29uc3QgbWVyZ2VDaGF0TWVzc2FnZXNXaXRoQWN0aXZlU2Vzc2lvblRhaWwgPSAoXG4gIGhpc3RvcmljYWw6IENoYXRNZXNzYWdlW10sXG4gIHRhaWw6IENoYXRNZXNzYWdlW11cbik6IENoYXRNZXNzYWdlW10gPT4ge1xuICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoaGlzdG9yaWNhbC5tYXAoaXRlbSA9PiBpdGVtLmlkKSlcbiAgY29uc3QgZXh0cmEgPSB0YWlsLmZpbHRlcihpdGVtID0+ICFleGlzdGluZ0lkcy5oYXMoaXRlbS5pZCkpXG4gIHJldHVybiBleHRyYS5sZW5ndGggPyBbLi4uaGlzdG9yaWNhbCwgLi4uZXh0cmFdIDogaGlzdG9yaWNhbFxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkID0gKFxuICBzZXE6IG51bWJlcixcbiAgY3VycmVudFNlcTogbnVtYmVyLFxuICB0YXJnZXRDaGF0SWQ6IHN0cmluZyxcbiAgYWN0aXZlQ2hhdElkOiBzdHJpbmdcbik6IGJvb2xlYW4gPT4gc2VxICE9PSBjdXJyZW50U2VxIHx8IHRhcmdldENoYXRJZCAhPT0gYWN0aXZlQ2hhdElkXG5cbmV4cG9ydCB0eXBlIFNlc3Npb25BZ2VudE5vUGVybWlzc2lvbiA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgZW1vamk6IHN0cmluZ1xuICB0eXBlOiBzdHJpbmdcbiAgY29ubmVjdG9ycz86IEFnZW50Wydjb25uZWN0b3JzJ11cbn1cblxuZXhwb3J0IHR5cGUgU2Vzc2lvbkFnZW50RGVsZXRlZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgZW1vamk6IHN0cmluZ1xuICBkZWxldGVkQXQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbm5lY3RvcnM/OiBBZ2VudFsnY29ubmVjdG9ycyddXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZERlbGV0ZWRTZXNzaW9uQWdlbnQgPSAoXG4gIGFnZW50RGVsZXRlZDogU2Vzc2lvbkFnZW50RGVsZXRlZCxcbiAgYWdlbnROb1Blcm1pc3Npb24/OiBTZXNzaW9uQWdlbnROb1Blcm1pc3Npb24gfCBudWxsXG4pOiBBZ2VudCA9PiAoe1xuICBpZDogYWdlbnREZWxldGVkLmlkLFxuICBuYW1lOiBhZ2VudERlbGV0ZWQubmFtZSxcbiAgZW1vamk6IGFnZW50RGVsZXRlZC5lbW9qaSxcbiAgdHlwZTogJ2N1c3RvbScsXG4gIGlzX2RlbGV0ZWQ6IHRydWUsXG4gIC4uLihhZ2VudERlbGV0ZWQuZGVsZXRlZEF0ID8geyBkZWxldGVkX2F0OiBhZ2VudERlbGV0ZWQuZGVsZXRlZEF0IH0gOiB7fSksXG4gIC4uLihhZ2VudE5vUGVybWlzc2lvbj8uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxufSlcblxuZXhwb3J0IGNvbnN0IHNob3VsZFNlbGVjdE9ycGhhblNlc3Npb25BZ2VudCA9IChwYXJhbXM6IHtcbiAgYWdlbnROb1Blcm1pc3Npb246IFNlc3Npb25BZ2VudE5vUGVybWlzc2lvbiB8IG51bGwgfCB1bmRlZmluZWRcbiAgYWdlbnREZWxldGVkOiBTZXNzaW9uQWdlbnREZWxldGVkIHwgbnVsbCB8IHVuZGVmaW5lZFxuICB1c2VyQ2FuVmlld0FnZW50czogYm9vbGVhblxuICBoYXNBZ2VudEFjY2VzczogYm9vbGVhblxuICBoYXNBZ2VudFBlcm1pc3Npb246IGJvb2xlYW5cbiAgYWdlbnRFeGlzdHNJbkxpc3Q6IGJvb2xlYW5cbn0pOiBib29sZWFuID0+XG4gIEJvb2xlYW4oXG4gICAgcGFyYW1zLmFnZW50Tm9QZXJtaXNzaW9uICYmXG4gICAgIXBhcmFtcy5hZ2VudERlbGV0ZWQgJiZcbiAgICBwYXJhbXMudXNlckNhblZpZXdBZ2VudHMgJiZcbiAgICBwYXJhbXMuaGFzQWdlbnRBY2Nlc3MgJiZcbiAgICBwYXJhbXMuaGFzQWdlbnRQZXJtaXNzaW9uICYmXG4gICAgIXBhcmFtcy5hZ2VudEV4aXN0c0luTGlzdFxuICApXG5cbmV4cG9ydCBjb25zdCBidWlsZE9ycGhhblNlc3Npb25BZ2VudCA9IChcbiAgYWdlbnROb1Blcm1pc3Npb246IFNlc3Npb25BZ2VudE5vUGVybWlzc2lvbixcbiAgcHJvamVjdERlbGV0ZWQ/OiB7IG5hbWU6IHN0cmluZyB9IHwgbnVsbFxuKTogQWdlbnQgPT4gKHtcbiAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgQWdlbnRUeXBlLFxuICBpc19mcm9tX2NvbnZlcnNhdGlvbjogdHJ1ZSxcbiAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG59KVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkTWVyZ2VMaXN0ZWRTZXNzaW9uQWdlbnQgPSAocGFyYW1zOiB7XG4gIGFnZW50Tm9QZXJtaXNzaW9uOiBTZXNzaW9uQWdlbnROb1Blcm1pc3Npb24gfCBudWxsIHwgdW5kZWZpbmVkXG4gIGFnZW50RGVsZXRlZDogU2Vzc2lvbkFnZW50RGVsZXRlZCB8IG51bGwgfCB1bmRlZmluZWRcbiAgaGFzQWdlbnRBY2Nlc3M6IGJvb2xlYW5cbiAgaGFzQWdlbnRQZXJtaXNzaW9uOiBib29sZWFuXG4gIGFnZW50RXhpc3RzSW5MaXN0OiBib29sZWFuXG59KTogYm9vbGVhbiA9PlxuICBCb29sZWFuKFxuICAgIHBhcmFtcy5hZ2VudE5vUGVybWlzc2lvbiAmJlxuICAgICFwYXJhbXMuYWdlbnREZWxldGVkICYmXG4gICAgcGFyYW1zLmhhc0FnZW50QWNjZXNzICYmXG4gICAgcGFyYW1zLmhhc0FnZW50UGVybWlzc2lvbiAmJlxuICAgIHBhcmFtcy5hZ2VudEV4aXN0c0luTGlzdFxuICApXG5cbmV4cG9ydCBjb25zdCBtZXJnZUxpc3RlZFNlc3Npb25BZ2VudCA9IChcbiAgYWdlbnRJbkxpc3Q6IEFnZW50LFxuICBhZ2VudE5vUGVybWlzc2lvbjogU2Vzc2lvbkFnZW50Tm9QZXJtaXNzaW9uLFxuICBwcm9qZWN0RGVsZXRlZD86IHsgbmFtZTogc3RyaW5nIH0gfCBudWxsXG4pOiBBZ2VudCA9PiAoe1xuICAuLi5hZ2VudEluTGlzdCxcbiAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7IHByb2plY3RfZGVsZXRlZDogdW5kZWZpbmVkIH0pLFxufSlcblxuZXhwb3J0IHR5cGUgUmVzdHJpY3RlZFNlc3Npb25BZ2VudFJlYXNvbiA9ICdub19hY2Nlc3MnIHwgJ25vX3Blcm1pc3Npb24nIHwgJ3Byb2plY3RfZGVsZXRlZCdcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVSZXN0cmljdGVkU2Vzc2lvbkFnZW50ID0gKFxuICBhZ2VudE5vUGVybWlzc2lvbjogU2Vzc2lvbkFnZW50Tm9QZXJtaXNzaW9uLFxuICBwYXJhbXM6IHtcbiAgICBoYXNBZ2VudEFjY2VzczogYm9vbGVhblxuICAgIGhhc0FnZW50UGVybWlzc2lvbjogYm9vbGVhblxuICAgIHByb2plY3REZWxldGVkPzogeyBuYW1lOiBzdHJpbmcgfSB8IG51bGxcbiAgfVxuKTogeyBhZ2VudDogQWdlbnQ7IHJlYXNvbjogUmVzdHJpY3RlZFNlc3Npb25BZ2VudFJlYXNvbiB9IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgQWdlbnRUeXBlLFxuICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgLi4uKHBhcmFtcy5wcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHBhcmFtcy5wcm9qZWN0RGVsZXRlZC5uYW1lIH0gfSA6IHt9KSxcbiAgfVxuXG4gIGlmICghcGFyYW1zLmhhc0FnZW50QWNjZXNzKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnbm9fYWNjZXNzJywgYWdlbnQ6IHsgLi4uYmFzZSwgaGFzX25vdF9hY2Nlc3M6IHRydWUgfSB9XG4gIH1cbiAgaWYgKCFwYXJhbXMuaGFzQWdlbnRQZXJtaXNzaW9uKSB7XG4gICAgcmV0dXJuIHsgcmVhc29uOiAnbm9fcGVybWlzc2lvbicsIGFnZW50OiB7IC4uLmJhc2UsIGhhc19ub3RfcGVybWlzc2lvbnM6IHRydWUgfSB9XG4gIH1cbiAgaWYgKHBhcmFtcy5wcm9qZWN0RGVsZXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWFzb246ICdwcm9qZWN0X2RlbGV0ZWQnLFxuICAgICAgYWdlbnQ6IHtcbiAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICBuYW1lOiBhZ2VudE5vUGVybWlzc2lvbi5uYW1lLFxuICAgICAgICBlbW9qaTogYWdlbnROb1Blcm1pc3Npb24uZW1vamksXG4gICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgQWdlbnRUeXBlLFxuICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcGFyYW1zLnByb2plY3REZWxldGVkLm5hbWUgfSxcbiAgICAgIH0sXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCB0eXBlIENoYXRMb2FkU2Vzc2lvbkFnZW50Q29udGV4dCA9IHtcbiAgYWdlbnREZWxldGVkOiBTZXNzaW9uQWdlbnREZWxldGVkIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBhZ2VudE5vUGVybWlzc2lvbjogU2Vzc2lvbkFnZW50Tm9QZXJtaXNzaW9uIHwgbnVsbCB8IHVuZGVmaW5lZFxuICBhZ2VudHM6IEFnZW50W11cbiAgdXNlckNhblZpZXdBZ2VudHM6IGJvb2xlYW5cbiAgaGFzQWdlbnRBY2Nlc3M6IGJvb2xlYW5cbiAgaGFzQWdlbnRQZXJtaXNzaW9uOiBib29sZWFuXG4gIHByb2plY3REZWxldGVkPzogeyBuYW1lOiBzdHJpbmcgfSB8IG51bGxcbn1cblxuLyoqIFLDqXBsaWNhIGxhIGNhZGVuYSBkZSBgc2VsZWN0QWdlbnRgIGVuIGBsb2FkTWVzc2FnZXNgICjDumx0aW1hIHNlbGVjY2nDs24gZ2FuYSkuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZVNlc3Npb25BZ2VudEZyb21DaGF0TG9hZCA9IChjdHg6IENoYXRMb2FkU2Vzc2lvbkFnZW50Q29udGV4dCk6IEFnZW50IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHsgYWdlbnREZWxldGVkLCBhZ2VudE5vUGVybWlzc2lvbiwgYWdlbnRzLCBwcm9qZWN0RGVsZXRlZCB9ID0gY3R4XG4gIGxldCBzZWxlY3RlZDogQWdlbnQgfCBudWxsID0gbnVsbFxuXG4gIGlmIChhZ2VudERlbGV0ZWQpIHtcbiAgICBzZWxlY3RlZCA9IGJ1aWxkRGVsZXRlZFNlc3Npb25BZ2VudChhZ2VudERlbGV0ZWQsIGFnZW50Tm9QZXJtaXNzaW9uKVxuICB9XG5cbiAgY29uc3QgYWdlbnRFeGlzdHNJbkxpc3QgPSBCb29sZWFuKFxuICAgIGFnZW50Tm9QZXJtaXNzaW9uICYmIGFnZW50cy5zb21lKGFnZW50SXRlbSA9PiBhZ2VudEl0ZW0uaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICApXG5cbiAgaWYgKFxuICAgIHNob3VsZFNlbGVjdE9ycGhhblNlc3Npb25BZ2VudCh7XG4gICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgIHVzZXJDYW5WaWV3QWdlbnRzOiBjdHgudXNlckNhblZpZXdBZ2VudHMsXG4gICAgICBoYXNBZ2VudEFjY2VzczogY3R4Lmhhc0FnZW50QWNjZXNzLFxuICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uOiBjdHguaGFzQWdlbnRQZXJtaXNzaW9uLFxuICAgICAgYWdlbnRFeGlzdHNJbkxpc3QsXG4gICAgfSkgJiZcbiAgICBhZ2VudE5vUGVybWlzc2lvblxuICApIHtcbiAgICBzZWxlY3RlZCA9IGJ1aWxkT3JwaGFuU2Vzc2lvbkFnZW50KGFnZW50Tm9QZXJtaXNzaW9uLCBwcm9qZWN0RGVsZXRlZClcbiAgfVxuXG4gIGlmIChcbiAgICBzaG91bGRNZXJnZUxpc3RlZFNlc3Npb25BZ2VudCh7XG4gICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgIGhhc0FnZW50QWNjZXNzOiBjdHguaGFzQWdlbnRBY2Nlc3MsXG4gICAgICBoYXNBZ2VudFBlcm1pc3Npb246IGN0eC5oYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICBhZ2VudEV4aXN0c0luTGlzdCxcbiAgICB9KSAmJlxuICAgIGFnZW50Tm9QZXJtaXNzaW9uXG4gICkge1xuICAgIGNvbnN0IGFnZW50SW5MaXN0ID0gYWdlbnRzLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gYWdlbnROb1Blcm1pc3Npb24uaWQpXG4gICAgaWYgKGFnZW50SW5MaXN0KSB7XG4gICAgICBzZWxlY3RlZCA9IG1lcmdlTGlzdGVkU2Vzc2lvbkFnZW50KGFnZW50SW5MaXN0LCBhZ2VudE5vUGVybWlzc2lvbiwgcHJvamVjdERlbGV0ZWQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGFnZW50Tm9QZXJtaXNzaW9uICYmICFhZ2VudERlbGV0ZWQpIHtcbiAgICBjb25zdCByZXN0cmljdGVkID0gcmVzb2x2ZVJlc3RyaWN0ZWRTZXNzaW9uQWdlbnQoYWdlbnROb1Blcm1pc3Npb24sIHtcbiAgICAgIGhhc0FnZW50QWNjZXNzOiBjdHguaGFzQWdlbnRBY2Nlc3MsXG4gICAgICBoYXNBZ2VudFBlcm1pc3Npb246IGN0eC5oYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICBwcm9qZWN0RGVsZXRlZCxcbiAgICB9KVxuICAgIGlmIChyZXN0cmljdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHJlc3RyaWN0ZWQuYWdlbnRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEgPSAoZmllbGRzOiB7XG4gIHByb2plY3RJZE1lc3NhZ2U/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHByb2plY3ROYW1lRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudWxsXG4gIGNsaWVudElkRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGNsaWVudE5hbWVGcm9tU2Vzc2lvbj86IHN0cmluZyB8IG51bGxcbiAgdGFza0lkRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIHRhc2tOYW1lRnJvbVNlc3Npb24/OiBzdHJpbmcgfCBudWxsXG59KTogU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEgPT4gKHtcbiAgcHJvamVjdElkTWVzc2FnZTogZmllbGRzLnByb2plY3RJZE1lc3NhZ2UsXG4gIHByb2plY3ROYW1lRnJvbVNlc3Npb246IGZpZWxkcy5wcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICBjbGllbnRJZEZyb21TZXNzaW9uOiBmaWVsZHMuY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBmaWVsZHMuY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICB0YXNrSWRGcm9tU2Vzc2lvbjogZmllbGRzLnRhc2tJZEZyb21TZXNzaW9uLFxuICB0YXNrTmFtZUZyb21TZXNzaW9uOiBmaWVsZHMudGFza05hbWVGcm9tU2Vzc2lvbixcbn0pXG5cbmV4cG9ydCBjb25zdCBidWlsZFNlc3Npb25NZXRhRXZlbnREZXRhaWwgPSAoXG4gIGNoYXRJZDogc3RyaW5nLFxuICBmaWVsZHM6IE9taXQ8U2Vzc2lvbk1ldGFFdmVudERldGFpbCwgJ2NoYXRJZCc+XG4pOiBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsID0+ICh7XG4gIGNoYXRJZCxcbiAgYWdlbnRUeXBlOiBmaWVsZHMuYWdlbnRUeXBlLFxuICBhZ2VudEVudGl0eTogZmllbGRzLmFnZW50RW50aXR5LFxuICBwcm9qZWN0SWQ6IGZpZWxkcy5wcm9qZWN0SWQsXG4gIHByb2plY3ROYW1lOiBmaWVsZHMucHJvamVjdE5hbWUsXG4gIGNsaWVudElkOiBmaWVsZHMuY2xpZW50SWQsXG4gIGNsaWVudE5hbWU6IGZpZWxkcy5jbGllbnROYW1lLFxuICB0YXNrSWQ6IGZpZWxkcy50YXNrSWQsXG4gIHRhc2tOYW1lOiBmaWVsZHMudGFza05hbWUsXG59KVxuXG5leHBvcnQgY29uc3QgaGFzQ29udmVyc2F0aW9uUHJvamVjdENvbnRleHQgPSAocHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgQm9vbGVhbihwcm9qZWN0SWRNZXNzYWdlKVxuXG5leHBvcnQgY29uc3QgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzID0gYXN5bmMgKFxuICBpdGVtczogQ2hhdE1lc3NhZ2VbXSxcbiAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZ2V0VGFiVGFza0RlZmF1bHQ6IChwYWdlOiBudW1iZXIpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD5cbik6IFByb21pc2U8Q2hhdE1lc3NhZ2VbXT4gPT4ge1xuICBpZiAoIWhhc0NvbnZlcnNhdGlvblByb2plY3RDb250ZXh0KHByb2plY3RJZE1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGl0ZW1zXG4gIH1cbiAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQoMSlcbiAgcmV0dXJuIHJld3JpdGVDaGF0TWVzc2FnZXNUYXNrVXJscyhpdGVtcywgcmVzb2x2ZVRhc2tVcmxUYWJTZWdtZW50KHRhYikpXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlRmluYWxNZXNzYWdlc1dpdGhBY3RpdmVTdHJlYW1pbmdUYWlsID0gKFxuICBpdGVtczogQ2hhdE1lc3NhZ2VbXSxcbiAgdGFpbDogQ2hhdE1lc3NhZ2VbXSxcbiAgc2Vzc2lvblN0YXR1czogU2Vzc2lvblN0YXR1cyB8IHVuZGVmaW5lZFxuKTogQ2hhdE1lc3NhZ2VbXSA9PiB7XG4gIGlmIChzZXNzaW9uU3RhdHVzICYmIGlzQWN0aXZlU2Vzc2lvblN0YXR1cyhzZXNzaW9uU3RhdHVzKSkge1xuICAgIHJldHVybiBtZXJnZUNoYXRNZXNzYWdlc1dpdGhBY3RpdmVTZXNzaW9uVGFpbChpdGVtcywgdGFpbClcbiAgfVxuICByZXR1cm4gaXRlbXNcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZExvYWRNb3JlTWVzc2FnZXNPblNjcm9sbCA9IChcbiAgc2Nyb2xsVG9wOiBudW1iZXIsXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyLFxuICBjbGllbnRIZWlnaHQ6IG51bWJlcixcbiAgdGhyZXNob2xkUGVyY2VudCA9IDkwXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3Qgc2Nyb2xsYWJsZSA9IHNjcm9sbEhlaWdodCAtIGNsaWVudEhlaWdodFxuICBpZiAoc2Nyb2xsYWJsZSA8PSAwKSByZXR1cm4gZmFsc2VcbiAgY29uc3Qgc2Nyb2xsUGVyY2VudGFnZSA9IChzY3JvbGxUb3AgLyBzY3JvbGxhYmxlKSAqIDEwMFxuICByZXR1cm4gc2Nyb2xsUGVyY2VudGFnZSA+IHRocmVzaG9sZFBlcmNlbnRcbn1cblxuZXhwb3J0IGNvbnN0IG1lc3NhZ2VzTmVlZFRhYlJld3JpdGUgPSAobWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIHRhYlRhc2tEZWZhdWx0OiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gIHJldHVybiBtZXNzYWdlcy5zb21lKG1zZyA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IG1zZy5tZXNzYWdlIHx8ICcnXG4gICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgIGlmICghbWF0Y2hlcz8ubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gbWF0Y2hlcy5zb21lKHVybCA9PiAhdXJsLmVuZHNXaXRoKGAvJHt0YWJUYXNrRGVmYXVsdH1gKSAmJiAhdXJsLmluY2x1ZGVzKGAvJHt0YWJUYXNrRGVmYXVsdH0/YCkpXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCB1cHNlcnRDaGF0TWVzc2FnZSA9IChwcmV2aW91czogQ2hhdE1lc3NhZ2VbXSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDaGF0TWVzc2FnZVtdID0+IHtcbiAgY29uc3QgZXhpc3RpbmdNZXNzYWdlSW5kZXggPSBwcmV2aW91cy5maW5kSW5kZXgobXNnID0+IG1zZy5pZCA9PT0gbWVzc2FnZS5pZClcbiAgaWYgKGV4aXN0aW5nTWVzc2FnZUluZGV4ID49IDApIHtcbiAgICByZXR1cm4gcHJldmlvdXMubWFwKChtc2csIGluZGV4KSA9PiAoaW5kZXggPT09IGV4aXN0aW5nTWVzc2FnZUluZGV4ID8gbWVzc2FnZSA6IG1zZykpXG4gIH1cbiAgcmV0dXJuIFsuLi5wcmV2aW91cywgbWVzc2FnZV1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsU0FBU0EsbUJBQW1CLFFBQVEsNEJBQTRCO0FBQ2hFLFNBQVNDLHNCQUFzQixRQUFRLDBCQUEwQjtBQUNqRSxTQUFTQyxrQ0FBa0MsUUFBUSxzQ0FBc0M7QUFDekYsU0FBU0Msa0JBQWtCLFFBQVEsMkJBQTJCO0FBSTlELFNBQ0VDLHFCQUFxQixRQUloQixxQ0FBcUM7QUFJNUM7QUFDQSxPQUFPLElBQU1DLCtCQUErQixHQUFHLFNBQWxDQSwrQkFBK0JBLENBQUlDLGtCQUF1QztFQUFBLElBQUFDLHFCQUFBLEVBQUFDLHFCQUFBO0VBQUEsT0FDckZDLE9BQU8sQ0FDTEgsa0JBQWtCLEtBQ2pCLEVBQUFDLHFCQUFBLEdBQUFELGtCQUFrQixDQUFDSSxPQUFPLGNBQUFILHFCQUFBLHVCQUExQkEscUJBQUEsQ0FBNEJJLElBQUksQ0FBQyxDQUFDLE9BQUFILHFCQUFBLEdBQ2pDRixrQkFBa0IsQ0FBQ00sV0FBVyxjQUFBSixxQkFBQSx1QkFBOUJBLHFCQUFBLENBQWdDSyxNQUFNLEtBQ3RDUCxrQkFBa0IsQ0FBQ1EsS0FBSyxJQUN4QlIsa0JBQWtCLENBQUNTLElBQUksQ0FDM0IsQ0FBQztBQUFBOztBQUVIO0FBQ0EsT0FBTyxJQUFNQyxnQ0FBZ0MsR0FBRyxTQUFuQ0EsZ0NBQWdDQSxDQUFJQyxTQUFpQixFQUFXO0VBQzNFLElBQUFDLG1CQUFBLEdBQTREZixrQkFBa0IsQ0FBQyxDQUFDO0lBQXhFZ0IsaUJBQWlCLEdBQUFELG1CQUFBLENBQWpCQyxpQkFBaUI7SUFBRUMsWUFB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