@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
@@ -1,11 +1,10 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
3
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
4
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
- import _typeof from "@babel/runtime/helpers/typeof";
5
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
6
- import _regeneratorRuntime from "@babel/runtime/regenerator";
7
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; }
8
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 _regeneratorRuntime from "@babel/runtime/regenerator";
9
8
  /* eslint-disable radix */
10
9
  /* eslint-disable no-nested-ternary */
11
10
  /* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */
@@ -16,6 +15,7 @@ import { v4 as uuidv4 } from 'uuid';
16
15
  import { useChatMessages } from '../useChatMessages';
17
16
  import { useOrchestratorStream } from '../useOrchestratorStream';
18
17
  import { useT } from '../useT';
18
+ import { findMessageWithApprovalByThreadIds, resolveApprovalDecisionStatus, resolveContinueStreamDecision, mapAuthUserToChatMessageUser, normalizeAssistantAttachments, normalizeSendMessageArgs, reasoningTraceFor, resolveClientPayload, resolveProjectToRequest, resolveStreamErrorMessageKey, applyProjectDashboardMutation, shouldRefetchOpenTaskPanel, resolveSendMessageGate, resolveSendMessagePayloadFields, buildChatHistoryFromMessages, resolveLastMessageAgentId, resolveAgentIdForStream, resolveUserQuestionMessageId, buildMaiaStreamRequestPayload, buildMaiaStreamRequestPayloadForProjectChange, resolveStreamErrorHandlingMode, buildStreamErrorAssistantMessage, resolveHitlApprovalRequiredOutcome, buildHitlApprovalPendingMessage, shouldPreserveReasoningOnStreamStop, buildStreamStopPartialAssistantMessage, buildStreamStopCancelledAssistantMessage, resolveRetryBlockReason, resolveRetryEligibility, resolveRetryUserAttachments, shouldUpdateProjectOnChange, shouldResendAfterProjectChange, resolveStreamFinishFinalMessageId, resolveStreamStopMessageIds, resolveRentabilidadProjectFaqMessage, resolveStreamErrorUserMessage, resolveHitlExecutionContext, resolveSkippedHitlManualApproval, resolveHitlSkipResolutionSource, resolveCreateAgentHitlAnalyticsEvents, buildTerminalSessionReconciliationKey, shouldForceReloadMessagesOnTerminalSession, shouldRotateSessionForNewHome, shouldSwitchToInitialChatSession, buildStreamFinishAssistantMessage, resolveActiveStreamFinishProcessing, shouldMarkChatReadAfterStreamFinish, shouldDispatchFirstSessionRefetch } from './useChatManager.helpers';
19
19
  import { useUser } from '../../context/cor-user';
20
20
  import { useGlobalContext } from '../../context/global-context';
21
21
  import { EVENTS, useEvent } from '../useEvent';
@@ -27,7 +27,7 @@ import { formatQuickActionMessageForDisplay } from '../../utils/formatQuickActio
27
27
  import { useProjects } from '../useProjects';
28
28
  import { useTabTaskDefault } from '../useTabTaskDefault';
29
29
  import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
30
- import { dispatchMaiaHoursCharged, isHoursChargeTool } from '../../constants/plannerSyncEvents';
30
+ import { dispatchMaiaHoursCharged } from '../../constants/plannerSyncEvents';
31
31
  import { fetchAgentDetail } from '../../services/maia/Agents/fetchAgentDetail';
32
32
  import { buildHitlActionTypeList, getHitlAnalyticsAgentType, normalizeHitlToolName, trackManualHitlEvents } from '../../utils/hitlAnalytics';
33
33
  import { sessionStreamingText } from '../../store/sessions/sessionStreamingText';
@@ -38,270 +38,26 @@ import { activeView } from '../../store/sessions/activeView';
38
38
  import { notifySessionFinishedInBackground } from '../../store/sessions/sessionNotifications';
39
39
  import { buildSidebarSessionTitle, ensureSessionInSidebar } from '../../store/chatsSidebarOptimistic';
40
40
  import { isStreamingPlaceholderMessageId, streamingPlaceholderMessageId } from '../../utils/streamActivityMessages';
41
- import { findUserMessageForRetry, messagesWithoutRetriedTurn, resolveRetryTurnId } from '../../utils/retryCompletion';
41
+ import { findUserMessageForRetry, messagesWithoutRetriedTurn } from '../../utils/retryCompletion';
42
42
  import { getChatsStoreState, useChatsStore } from '../../store/useChatsStore';
43
43
  import { reasoningStore } from '../useReasoningTrace';
44
- import { buildReasoningTrace, mapReasoningTrace } from '../../utils/reasoningMappers';
45
- import { mapContextCompaction } from '../../types/contextCompaction';
46
- /** Trace acumulado en vivo para `messageId`, o null si el store apunta a otro mensaje. */
47
- var reasoningTraceFor = function reasoningTraceFor(messageId) {
48
- var snapshot = reasoningStore.getSnapshot(messageId);
49
- if (!snapshot.steps.length) return null;
50
- return buildReasoningTrace(snapshot.steps, snapshot.summary);
51
- };
52
-
53
- /** Aviso de compactación: store en vivo, o el `complete` persistido. Capturar antes del `rename`. */
54
- var compactionFor = function compactionFor(messageId, payload) {
55
- var _reasoningStore$getSn;
56
- return (_reasoningStore$getSn = reasoningStore.getSnapshot(messageId).compaction) !== null && _reasoningStore$getSn !== void 0 ? _reasoningStore$getSn : mapContextCompaction(payload === null || payload === void 0 ? void 0 : payload.compaction);
57
- };
58
- var normalizeSendMessageArgs = function normalizeSendMessageArgs(attachmentsOrOptions) {
59
- var _options$attachments;
60
- if (Array.isArray(attachmentsOrOptions)) {
61
- return {
62
- attachments: attachmentsOrOptions,
63
- options: {}
64
- };
65
- }
66
- var options = attachmentsOrOptions !== null && attachmentsOrOptions !== void 0 ? attachmentsOrOptions : {};
67
- return {
68
- attachments: (_options$attachments = options.attachments) !== null && _options$attachments !== void 0 ? _options$attachments : [],
69
- options: options
70
- };
71
- };
72
-
73
- /** chipsProject es la fuente de verdad del pin visible; si no hay pin, restaurar desde historial. */
74
- var resolveProjectToRequest = function resolveProjectToRequest(chipsProject, lastMessageProjectId) {
75
- var chipsProjectId = chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId ? Number(chipsProject.projectId) : null;
76
- if (chipsProjectId != null && Number.isFinite(chipsProjectId)) {
77
- return chipsProjectId;
78
- }
79
- if (lastMessageProjectId != null) {
80
- var parsed = Number(lastMessageProjectId);
81
- return Number.isFinite(parsed) ? parsed : null;
82
- }
83
- return null;
84
- };
85
- var resolveClientPayload = function resolveClientPayload(ctxClient, ctxProject) {
86
- var _ctxProject$client;
87
- if (ctxClient !== null && ctxClient !== void 0 && ctxClient.id) {
88
- return _objectSpread({
89
- clientId: ctxClient.id
90
- }, ctxClient.name ? {
91
- clientName: ctxClient.name
92
- } : {});
93
- }
94
- if ((ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.clientId) != null) {
95
- return {
96
- clientId: Number(ctxProject.clientId)
97
- };
98
- }
99
- if (ctxProject !== null && ctxProject !== void 0 && (_ctxProject$client = ctxProject.client) !== null && _ctxProject$client !== void 0 && _ctxProject$client.id) {
100
- return _objectSpread({
101
- clientId: ctxProject.client.id
102
- }, ctxProject.client.name ? {
103
- clientName: ctxProject.client.name
104
- } : {});
105
- }
106
- return {};
107
- };
108
- var normalizeAssistantAttachments = function normalizeAssistantAttachments(rawAttachments) {
109
- if (!Array.isArray(rawAttachments)) {
110
- return [];
111
- }
112
- return rawAttachments.filter(function (attachment) {
113
- return !!attachment && _typeof(attachment) === 'object';
114
- }).map(function (attachment, index) {
115
- var name = typeof attachment.name === 'string' && attachment.name.trim() ? attachment.name.trim() : "file-".concat(index + 1);
116
- var type = typeof attachment.type === 'string' && attachment.type.trim() ? attachment.type.trim() : 'pdf';
117
- var mimeType = typeof attachment.mime_type === 'string' ? attachment.mime_type : '';
118
- var fullFileName = name.includes('.') ? name : "".concat(name, ".").concat(type);
119
- var numericSize = typeof attachment.size === 'number' ? attachment.size : Number.isFinite(Number(attachment.size)) ? Number(attachment.size) : 0;
120
- return {
121
- file: new File([], fullFileName, {
122
- type: mimeType
123
- }),
124
- id: typeof attachment.id === 'string' && attachment.id.trim() ? attachment.id : "assistant-file-".concat(index, "-").concat(fullFileName),
125
- name: name,
126
- size: numericSize,
127
- type: type,
128
- url_original: typeof attachment.url_original === 'string' ? attachment.url_original : undefined,
129
- url_thumbnail: typeof attachment.url_thumbnail === 'string' ? attachment.url_thumbnail : undefined,
130
- url_file: typeof attachment.url_file === 'string' ? attachment.url_file : undefined,
131
- role: attachment.role === 'assistant' ? 'assistant' : 'user'
132
- };
133
- });
134
- };
135
-
136
- /** Extrae task_ids de los tool_args de pending_actions, cubriendo las formas comunes:
137
- * - `{ task_id }` o `{ id }`
138
- * - `{ task_ids: [] }`
139
- * - `{ tasks: [{ task_id|id }, ...] }`
140
- * Útil para tools de edit/assign/delete cuando la respuesta del LLM no incluye URLs /tasks/.../detail. */
141
- function extractTaskIdsFromPendingActionsArgs(pendingActions) {
142
- var ids = [];
143
- var pushId = function pushId(raw) {
144
- if (raw == null) return;
145
- var n = parseInt(String(raw), 10);
146
- if (!Number.isNaN(n)) ids.push(n);
147
- };
148
- pendingActions.forEach(function (action) {
149
- var _rec$task_id;
150
- if (!action || _typeof(action) !== 'object') return;
151
- var args = action.tool_args;
152
- if (!(args && _typeof(args) === 'object' && !Array.isArray(args))) return;
153
- var rec = args;
154
- pushId((_rec$task_id = rec.task_id) !== null && _rec$task_id !== void 0 ? _rec$task_id : rec.id);
155
- if (Array.isArray(rec.task_ids)) {
156
- rec.task_ids.forEach(pushId);
157
- }
158
- if (Array.isArray(rec.tasks)) {
159
- rec.tasks.forEach(function (t) {
160
- if (t && _typeof(t) === 'object' && !Array.isArray(t)) {
161
- var _trec$task_id;
162
- var trec = t;
163
- pushId((_trec$task_id = trec.task_id) !== null && _trec$task_id !== void 0 ? _trec$task_id : trec.id);
164
- }
165
- });
166
- }
167
- });
168
- return ids;
169
- }
170
-
171
- /** task_id / task_ids en pending_actions de delete_* (la respuesta puede no incluir URLs /tasks/…/detail). */
172
- function extractTaskIdsFromDeletePendingActions(pendingActions) {
173
- var ids = [];
174
- pendingActions.forEach(function (action) {
175
- if (!action || _typeof(action) !== 'object') return;
176
- var args = action.tool_args;
177
- if (!(args && _typeof(args) === 'object' && !Array.isArray(args))) return;
178
- var rec = args;
179
- if (action.tool_name === 'delete_task') {
180
- var _rec$task_id2;
181
- var raw = (_rec$task_id2 = rec.task_id) !== null && _rec$task_id2 !== void 0 ? _rec$task_id2 : rec.id;
182
- if (raw != null) {
183
- var n = parseInt(String(raw), 10);
184
- if (!Number.isNaN(n)) ids.push(n);
185
- }
186
- }
187
- if (action.tool_name === 'delete_tasks_batch') {
188
- var list = rec.task_ids;
189
- if (Array.isArray(list)) {
190
- list.forEach(function (tid) {
191
- var n = parseInt(String(tid), 10);
192
- if (!Number.isNaN(n)) ids.push(n);
193
- });
194
- }
195
- }
196
- });
197
- return ids;
198
- }
199
- function extractAgentIdFromEditAgentPendingActions(pendingActions) {
200
- var _rec$agent_id;
201
- var editAction = pendingActions.find(function (a) {
202
- return (a.tool_name || '').toLowerCase() === 'edit_agent';
203
- });
204
- if (!editAction || !editAction.tool_args || _typeof(editAction.tool_args) !== 'object' || Array.isArray(editAction.tool_args)) {
205
- return null;
206
- }
207
- var rec = editAction.tool_args;
208
- var raw = (_rec$agent_id = rec.agent_id) !== null && _rec$agent_id !== void 0 ? _rec$agent_id : rec.agentId;
209
- return raw != null ? String(raw) : null;
210
- }
211
- function extractAgentIdFromPendingActionsByToolName(pendingActions, toolName) {
212
- var _ref, _rec$agent_id2;
213
- var action = pendingActions.find(function (a) {
214
- return (a.tool_name || '').toLowerCase() === toolName.toLowerCase();
215
- });
216
- if (!action || !action.tool_args || _typeof(action.tool_args) !== 'object' || Array.isArray(action.tool_args)) {
217
- return null;
218
- }
219
- var rec = action.tool_args;
220
- var raw = (_ref = (_rec$agent_id2 = rec.agent_id) !== null && _rec$agent_id2 !== void 0 ? _rec$agent_id2 : rec.agentId) !== null && _ref !== void 0 ? _ref : rec.id;
221
- return raw != null ? String(raw) : null;
222
- }
223
-
224
- /** Último recurso si no hay links ni tool_args parseables (p. ej. "ID **7597106**"). */
225
- function extractTaskIdsFromAssistantDeletionText(text) {
226
- var labeled = text.match(/\bID\s*\*\*(\d+)\*\*/i);
227
- if (labeled) {
228
- var n = parseInt(labeled[1], 10);
229
- return Number.isNaN(n) ? [] : [n];
230
- }
231
- var bold = text.match(/\*\*(\d{5,})\*\*/);
232
- if (bold) {
233
- var _n = parseInt(bold[1], 10);
234
- return Number.isNaN(_n) ? [] : [_n];
235
- }
236
- return [];
237
- }
44
+ import { mapReasoningTrace } from '../../utils/reasoningMappers';
238
45
  var useStableCallbacks = function useStableCallbacks(authUser) {
239
- var currentUser = useRef({
240
- id: authUser.id.toString(),
241
- name: authUser.firstName,
242
- avatar: authUser.picture
243
- });
244
- if (currentUser.current.id !== authUser.id.toString() || currentUser.current.name !== authUser.firstName || currentUser.current.avatar !== authUser.picture) {
245
- currentUser.current = {
246
- id: authUser.id.toString(),
247
- name: authUser.firstName,
248
- avatar: authUser.picture
249
- };
46
+ var currentUser = useRef(mapAuthUserToChatMessageUser(authUser));
47
+ var nextUser = mapAuthUserToChatMessageUser(authUser);
48
+ if (currentUser.current.id !== nextUser.id || currentUser.current.name !== nextUser.name || currentUser.current.avatar !== nextUser.avatar) {
49
+ currentUser.current = nextUser;
250
50
  }
251
51
  return {
252
52
  currentUser: currentUser.current
253
53
  };
254
54
  };
255
- var findMessageWithApprovalByThreadIds = function findMessageWithApprovalByThreadIds(threadIds, activeMessages) {
256
- var fromActiveView = activeMessages.find(function (message) {
257
- var _message$approval;
258
- return (_message$approval = message.approval) === null || _message$approval === void 0 || (_message$approval = _message$approval.pending_actions) === null || _message$approval === void 0 ? void 0 : _message$approval.some(function (action) {
259
- return threadIds.includes(action.thread_id);
260
- });
261
- });
262
- if (fromActiveView !== null && fromActiveView !== void 0 && fromActiveView.approval) {
263
- return {
264
- message: fromActiveView,
265
- sessionId: fromActiveView.approval.session_id || activeView.get() || ''
266
- };
267
- }
268
- var _useSessionsStore$get = useSessionsStore.getState(),
269
- messages = _useSessionsStore$get.messages;
270
- var sessionEntry = Object.entries(messages).find(function (_ref2) {
271
- var _ref3 = _slicedToArray(_ref2, 2),
272
- sessionMessages = _ref3[1];
273
- return sessionMessages.some(function (message) {
274
- var _message$approval2;
275
- return (_message$approval2 = message.approval) === null || _message$approval2 === void 0 || (_message$approval2 = _message$approval2.pending_actions) === null || _message$approval2 === void 0 ? void 0 : _message$approval2.some(function (action) {
276
- return threadIds.includes(action.thread_id);
277
- });
278
- });
279
- });
280
- if (sessionEntry) {
281
- var _sessionEntry = _slicedToArray(sessionEntry, 2),
282
- sessionId = _sessionEntry[0],
283
- sessionMessages = _sessionEntry[1];
284
- var found = sessionMessages.find(function (message) {
285
- var _message$approval3;
286
- return (_message$approval3 = message.approval) === null || _message$approval3 === void 0 || (_message$approval3 = _message$approval3.pending_actions) === null || _message$approval3 === void 0 ? void 0 : _message$approval3.some(function (action) {
287
- return threadIds.includes(action.thread_id);
288
- });
289
- });
290
- if (found !== null && found !== void 0 && found.approval) {
291
- return {
292
- message: found,
293
- sessionId: found.approval.session_id || sessionId
294
- };
295
- }
296
- }
297
- return null;
298
- };
299
- export var useChatManager = function useChatManager(_ref4) {
300
- var initialChatId = _ref4.chatId,
301
- userInitialMessage = _ref4.userInitialMessage,
302
- onError = _ref4.onError,
303
- _ref4$agents = _ref4.agents,
304
- agents = _ref4$agents === void 0 ? [] : _ref4$agents;
55
+ export var useChatManager = function useChatManager(_ref) {
56
+ var initialChatId = _ref.chatId,
57
+ userInitialMessage = _ref.userInitialMessage,
58
+ onError = _ref.onError,
59
+ _ref$agents = _ref.agents,
60
+ agents = _ref$agents === void 0 ? [] : _ref$agents;
305
61
  var _useT = useT(),
306
62
  t = _useT.t;
307
63
  var authUser = useUser();
@@ -462,19 +218,13 @@ export var useChatManager = function useChatManager(_ref4) {
462
218
  // cancelado) y recargar acá mostraba la pantalla de carga del chat entero.
463
219
  var activeSessionMeta = useSessionMeta(activeSessionId);
464
220
  useEffect(function () {
465
- var _activeSessionMeta$fi;
466
221
  var status = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.status;
467
222
  if (!status) return;
468
- var isTerminal = status === 'complete' || status === 'error';
469
- if (!isTerminal) return;
470
- var key = "".concat(activeSessionId, ":").concat(status, ":").concat((_activeSessionMeta$fi = activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt) !== null && _activeSessionMeta$fi !== void 0 ? _activeSessionMeta$fi : '');
223
+ var key = buildTerminalSessionReconciliationKey(activeSessionId, status, activeSessionMeta === null || activeSessionMeta === void 0 ? void 0 : activeSessionMeta.finishedAt);
471
224
  if (lastHandledTerminalRef.current === key) return;
472
225
  lastHandledTerminalRef.current = key;
473
226
  var tail = useSessionsStore.getState().getMessages(activeSessionId);
474
- var hasStalePlaceholder = tail.some(function (msg) {
475
- return isStreamingPlaceholderMessageId(msg.id);
476
- });
477
- if (hasStalePlaceholder) {
227
+ if (shouldForceReloadMessagesOnTerminalSession(status, tail, isStreamingPlaceholderMessageId)) {
478
228
  loadMessages({
479
229
  force: true
480
230
  });
@@ -498,7 +248,7 @@ export var useChatManager = function useChatManager(_ref4) {
498
248
  // anterior, `activeView` la sigue marcando como activa y cuando termina no se
499
249
  // notifica (y su respuesta se commitea sobre la vista nueva). El árbol no
500
250
  // remonta en este flujo (no hay `key`) y nadie consume `resetChat`.
501
- if (!initialChatId && previousInitialChatId) {
251
+ if (shouldRotateSessionForNewHome(initialChatId, previousInitialChatId)) {
502
252
  currentChatId.current = uuidv4();
503
253
  setActiveSessionId(currentChatId.current);
504
254
  currentMessageId.current = uuidv4();
@@ -509,7 +259,7 @@ export var useChatManager = function useChatManager(_ref4) {
509
259
  activeStreamChatIdRef.current = null;
510
260
  return;
511
261
  }
512
- if (initialChatId && initialChatId !== currentChatId.current) {
262
+ if (shouldSwitchToInitialChatSession(initialChatId, currentChatId.current) && initialChatId) {
513
263
  // NO abortamos el stream anterior: puede seguir generando en background.
514
264
  // Solo cambiamos de sesión activa; el motor rutea cada stream por su
515
265
  // sessionId, así que los tokens de la sesión previa siguen aplicándose a
@@ -539,7 +289,6 @@ export var useChatManager = function useChatManager(_ref4) {
539
289
  setActiveChatId(initialChatId || null);
540
290
  }, [initialChatId, setActiveChatId]);
541
291
  var handleStreamError = useCallback(function (ctx, errorMessage, errorRawMessage) {
542
- var _errorRawMessage$matc, _errorRawMessage$matc2;
543
292
  var sessionId = ctx.sessionId,
544
293
  messageId = ctx.messageId,
545
294
  placeholderId = ctx.placeholderId;
@@ -547,7 +296,7 @@ export var useChatManager = function useChatManager(_ref4) {
547
296
  sessionStreamingText.clear(sessionId);
548
297
  dropFromSession(sessionId, placeholderId);
549
298
  var retrySnapshot = retrySnapshotRef.current;
550
- if (retrySnapshot) {
299
+ if (resolveStreamErrorHandlingMode(Boolean(retrySnapshot)) === 'retry-restore' && retrySnapshot) {
551
300
  retrySnapshotRef.current = null;
552
301
  messagesRef.current = retrySnapshot;
553
302
  replaceMessages(retrySnapshot);
@@ -572,24 +321,16 @@ export var useChatManager = function useChatManager(_ref4) {
572
321
  activeStreamChatIdRef.current = null;
573
322
  isProcessingRef.current = false;
574
323
  }
575
- var isAccessDenied = errorMessage === "Access denied: You don't have permission to access this agent";
576
- var isPromptTooLong = errorMessage === 'invalid_request_error' && (errorRawMessage === null || errorRawMessage === void 0 ? void 0 : errorRawMessage.includes('prompt is too long'));
577
- var message = isAccessDenied ? t('chat.errorAccessDenied') : isPromptTooLong ? t('chat.errorPromptTooLong', {
578
- used: (_errorRawMessage$matc = errorRawMessage === null || errorRawMessage === void 0 || (_errorRawMessage$matc2 = errorRawMessage.match(/(\d+) tokens/)) === null || _errorRawMessage$matc2 === void 0 ? void 0 : _errorRawMessage$matc2[1]) !== null && _errorRawMessage$matc !== void 0 ? _errorRawMessage$matc : ''
579
- }) : t('chat.error');
580
- commitToSession(sessionId, _objectSpread(_objectSpread({
581
- id: "answer-".concat(messageId),
324
+ var _resolveStreamErrorMe = resolveStreamErrorMessageKey(errorMessage, errorRawMessage),
325
+ messageKey = _resolveStreamErrorMe.messageKey,
326
+ tokensUsed = _resolveStreamErrorMe.tokensUsed,
327
+ showRetry = _resolveStreamErrorMe.showRetry;
328
+ var message = resolveStreamErrorUserMessage(messageKey, t, tokensUsed);
329
+ commitToSession(sessionId, buildStreamErrorAssistantMessage({
330
+ messageId: messageId,
582
331
  message: message,
583
- isError: true
584
- }, !isAccessDenied && !isPromptTooLong ? {
585
- suggestions: [t('chat.retry')]
586
- } : {}), {}, {
587
- date: new Date(),
588
- user: {
589
- id: 'assistant',
590
- name: 'Assistant'
591
- },
592
- role: ChatHistoryRole.ASSISTANT
332
+ showRetry: showRetry,
333
+ retryLabel: t('chat.retry')
593
334
  }));
594
335
  clearSessionTail(sessionId);
595
336
  if (!isActive) {
@@ -627,9 +368,9 @@ export var useChatManager = function useChatManager(_ref4) {
627
368
  sessionStreamingText.setText(sessionId, placeholderId, content);
628
369
  }, [commitToSession]);
629
370
  var handleStreamFinish = useCallback(/*#__PURE__*/function () {
630
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(ctx, content, sources, memorySessionId, rawAttachments, suggestions, completedAgentId, _resolvedContext, reasoning) {
631
- var _reasoningTraceFor, _previousMessage$appr, _window$taskPanel, _createAgentFollowUp, _editAgentFollowUp;
632
- var sessionId, placeholderId, isActive, tempMessageId, attachments, finalMessageId, compaction, finalTrace, taskUrlRegex, matches, contentToAdd, previousMessage, hasApprovalInPreviousMessage, TASK_CREATION_TOOLS, TASK_EDIT_TOOLS, TASK_DELETE_TOOLS, pendingActions, wasTaskCreation, wasTaskEdit, wasTaskDelete, wasCreateAgentApproved, wasConfigureAgentAccessApproved, createAgentFollowUp, configuredAgentId, manualApprovalForAnalytics, wasManualCreateAgentApproved, wasEditAgentApproved, editAgentFollowUp, fromStream, fromArgs, resolvedAgentId, taskIdsFromUrls, taskIdsFromDeleteApproval, taskIdsFromDeletionText, taskIdsForDashboard, shouldSyncDashboard, taskIds, tab, tabSegment, lastProjectMessage, contextProjectIdRaw, contextProjectId, pathMatch, routeProjectId, isOnProjectRoute, _window$newProjectDas, _window$newProjectDas2, _window$newProjectDas3, _window$newProjectDas4, _window$newProjectDas5, _window$newProjectDas6, openTaskPanelId, manualApproval, manualWasTaskEdit, manualWasTaskDelete, hoursToolsFromApproval, wasHoursChargeApproved, manualHoursTool, wasHoursChargeManualApproved, tools, _manualApproval$toolA, manualPseudoAction, affectedTaskIds, _window$taskPanel2, _window$taskPanel2$re, _getChatsStoreState, isChatViewVisible, markChatAsRead, customEvent;
371
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(ctx, content, sources, memorySessionId, rawAttachments, suggestions, completedAgentId, _resolvedContext, reasoning) {
372
+ var _reasoningTraceFor, _window$taskPanel;
373
+ var sessionId, placeholderId, isActive, tempMessageId, attachments, finalMessageId, finalTrace, taskUrlRegex, manualApprovalForAnalytics, manualApproval, _yield$resolveActiveS, contentToAdd, createAgentFollowUp, editAgentFollowUp, hoursChargeTools, affectedTaskIds, manualWasTaskEdit, manualWasTaskDelete, wasTaskEdit, wasTaskDelete, wasCreateAgentApproved, pendingActions, openTaskPanelId, _window$taskPanel2, _window$taskPanel2$re, _getChatsStoreState, isChatViewVisible, markChatAsRead;
633
374
  return _regeneratorRuntime.wrap(function (_context) {
634
375
  while (1) switch (_context.prev = _context.next) {
635
376
  case 0:
@@ -642,9 +383,8 @@ export var useChatManager = function useChatManager(_ref4) {
642
383
  useSessionsStore.getState().removeMessage(sessionId, tempMessageId);
643
384
  attachments = normalizeAssistantAttachments(rawAttachments); // El trace acumulado en vivo está keyed por el placeholder; lo movemos al
644
385
  // id definitivo para que el bloque de razonamiento sobreviva al swap.
645
- finalMessageId = "answer-".concat(memorySessionId); // Preferir el snapshot en vivo (narración anclada al inicio) sobre el
386
+ finalMessageId = resolveStreamFinishFinalMessageId(memorySessionId); // Preferir el snapshot en vivo (narración anclada al inicio) sobre el
646
387
  // `complete` del back, que suele mandar esa narración al final.
647
- compaction = compactionFor(tempMessageId, reasoning);
648
388
  finalTrace = (_reasoningTraceFor = reasoningTraceFor(tempMessageId)) !== null && _reasoningTraceFor !== void 0 ? _reasoningTraceFor : mapReasoningTrace(reasoning);
649
389
  reasoningStore.rename(tempMessageId, finalMessageId);
650
390
 
@@ -655,23 +395,14 @@ export var useChatManager = function useChatManager(_ref4) {
655
395
  _context.next = 1;
656
396
  break;
657
397
  }
658
- commitToSession(sessionId, _objectSpread(_objectSpread({
659
- id: finalMessageId,
660
- message: content,
661
- date: new Date(),
662
- user: {
663
- id: 'assistant',
664
- name: 'Assistant'
665
- },
666
- role: ChatHistoryRole.ASSISTANT,
667
- sources: sources
668
- }, attachments.length > 0 ? {
669
- attachments: attachments
670
- } : {}), {}, {
398
+ commitToSession(sessionId, buildStreamFinishAssistantMessage({
399
+ finalMessageId: finalMessageId,
400
+ content: content,
401
+ sources: sources,
402
+ attachments: attachments,
671
403
  memorySessionId: memorySessionId,
672
- suggestions: suggestions || [],
673
- reasoning: finalTrace,
674
- compaction: compaction
404
+ suggestions: suggestions,
405
+ reasoning: finalTrace
675
406
  }));
676
407
  clearSessionTail(sessionId);
677
408
  getChatsStoreState().markChatAsUnread(sessionId);
@@ -681,157 +412,66 @@ export var useChatManager = function useChatManager(_ref4) {
681
412
  streamingPlaceholderIdRef.current = null;
682
413
  activeStreamChatIdRef.current = null;
683
414
  hitlExecutionContextRef.current = null;
684
-
685
- // Detectar todas las URLs de tareas (.../tasks/123/detail|message|messages|files|history|hours)
686
415
  taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
687
- matches = _toConsumableArray(content.matchAll(taskUrlRegex));
688
- contentToAdd = content;
689
- previousMessage = messagesRef.current.filter(function (m) {
690
- return m.id !== tempMessageId;
691
- }).at(-1);
692
- hasApprovalInPreviousMessage = (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approval) != null;
693
- TASK_CREATION_TOOLS = ['create_task', 'create_tasks_batch', 'clone_task'];
694
- TASK_EDIT_TOOLS = ['edit_task', 'edit_tasks_batch', 'task_assign', 'task_unassign', 'update_task_type', 'update_estimated_hours', 'assign_task_label'];
695
- TASK_DELETE_TOOLS = ['delete_task', 'delete_tasks_batch'];
696
- pendingActions = (previousMessage === null || previousMessage === void 0 || (_previousMessage$appr = previousMessage.approval) === null || _previousMessage$appr === void 0 ? void 0 : _previousMessage$appr.pending_actions) || [];
697
- wasTaskCreation = hasApprovalInPreviousMessage && pendingActions.some(function (action) {
698
- return TASK_CREATION_TOOLS.includes(action.tool_name);
699
- });
700
- wasTaskEdit = hasApprovalInPreviousMessage && pendingActions.some(function (action) {
701
- return TASK_EDIT_TOOLS.includes(action.tool_name);
702
- });
703
- wasTaskDelete = hasApprovalInPreviousMessage && pendingActions.some(function (action) {
704
- return TASK_DELETE_TOOLS.includes(action.tool_name);
705
- });
706
- wasCreateAgentApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && pendingActions.some(function (action) {
707
- return action.tool_name === 'create_agent';
708
- });
709
- wasConfigureAgentAccessApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && pendingActions.some(function (action) {
710
- return (action.tool_name || '').toLowerCase() === 'configure_agent_access';
711
- });
712
- if (wasCreateAgentApproved && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS && completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim()) {
713
- createAgentFollowUp = {
714
- agentId: completedAgentId.trim()
715
- };
716
- } else if (wasConfigureAgentAccessApproved && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS && (completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim() || extractAgentIdFromPendingActionsByToolName(pendingActions, 'configure_agent_access'))) {
717
- configuredAgentId = (completedAgentId === null || completedAgentId === void 0 ? void 0 : completedAgentId.trim()) || extractAgentIdFromPendingActionsByToolName(pendingActions, 'configure_agent_access');
718
- createAgentFollowUp = {
719
- agentId: configuredAgentId
720
- };
721
- }
722
- if (wasCreateAgentApproved) {
723
- event(EVENTS.aiChatHitlOption, _objectSpread({
724
- agent_type: getHitlAnalyticsAgentType(agent),
725
- action_type: buildHitlActionTypeList(pendingActions),
726
- decision: 'accept',
727
- option: 'create_agent'
728
- }, completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim() ? {
729
- created_agent_id: completedAgentId.trim()
730
- } : {}));
731
- }
732
416
  manualApprovalForAnalytics = lastManualApprovalRef.current;
733
- wasManualCreateAgentApproved = manualApprovalForAnalytics && normalizeHitlToolName(manualApprovalForAnalytics.toolName) === 'create_agent';
734
- if (wasManualCreateAgentApproved) {
735
- event(EVENTS.aiChatHitlOption, _objectSpread({
736
- agent_type: getHitlAnalyticsAgentType(agent),
737
- action_type: 'create_agent',
738
- decision: 'accept',
739
- resolution_source: 'manual',
740
- option: 'create_agent'
741
- }, completedAgentId !== null && completedAgentId !== void 0 && completedAgentId.trim() ? {
742
- created_agent_id: completedAgentId.trim()
743
- } : {}));
744
- }
745
- wasEditAgentApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && pendingActions.some(function (action) {
746
- return (action.tool_name || '').toLowerCase() === 'edit_agent';
747
- });
748
- if (wasEditAgentApproved) {
749
- fromStream = completedAgentId === null || completedAgentId === void 0 ? void 0 : completedAgentId.trim();
750
- fromArgs = extractAgentIdFromEditAgentPendingActions(pendingActions);
751
- resolvedAgentId = fromStream || fromArgs;
752
- if (resolvedAgentId) {
753
- editAgentFollowUp = {
754
- agentId: resolvedAgentId
755
- };
417
+ manualApproval = lastManualApprovalRef.current;
418
+ lastManualApprovalRef.current = null;
419
+ _context.next = 2;
420
+ return resolveActiveStreamFinishProcessing({
421
+ content: content,
422
+ messages: messagesRef.current,
423
+ tempMessageId: tempMessageId,
424
+ taskUrlRegex: taskUrlRegex,
425
+ projectId: project === null || project === void 0 ? void 0 : project.id,
426
+ pathname: window.location.pathname,
427
+ getTabTaskDefault: getTabTaskDefault,
428
+ multiAgentsAccess: Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS),
429
+ completedAgentId: completedAgentId,
430
+ manualApproval: manualApproval,
431
+ applyDashboardMutation: function applyDashboardMutation(mutation, taskIds) {
432
+ applyProjectDashboardMutation(mutation, taskIds, window.newProjectDashboard);
756
433
  }
757
- }
758
- taskIdsFromUrls = matches.map(function (match) {
759
- return parseInt(match[1], 10);
760
434
  });
761
- taskIdsFromDeleteApproval = extractTaskIdsFromDeletePendingActions(pendingActions);
762
- taskIdsFromDeletionText = wasTaskDelete && taskIdsFromUrls.length === 0 && taskIdsFromDeleteApproval.length === 0 ? extractTaskIdsFromAssistantDeletionText(content) : [];
763
- taskIdsForDashboard = taskIdsFromUrls.length > 0 ? taskIdsFromUrls : taskIdsFromDeleteApproval.length > 0 ? taskIdsFromDeleteApproval : taskIdsFromDeletionText;
764
- shouldSyncDashboard = hasApprovalInPreviousMessage && (wasTaskCreation || wasTaskEdit || wasTaskDelete) && taskIdsForDashboard.length > 0;
765
- if (!shouldSyncDashboard) {
766
- _context.next = 4;
767
- break;
768
- }
769
- taskIds = taskIdsForDashboard;
770
- if (!(matches.length > 0)) {
771
- _context.next = 3;
772
- break;
773
- }
774
- _context.next = 2;
775
- return getTabTaskDefault(taskIds[0]);
776
435
  case 2:
777
- tab = _context.sent;
778
- tabSegment = tab ? "/".concat(tab) : '/detail';
779
- contentToAdd = content.replace(taskUrlRegex, function (url) {
780
- return url.replace(/\/(detail|message|messages|files|history|hours)(?=$|\?)/, tabSegment);
436
+ _yield$resolveActiveS = _context.sent;
437
+ contentToAdd = _yield$resolveActiveS.contentToAdd;
438
+ createAgentFollowUp = _yield$resolveActiveS.createAgentFollowUp;
439
+ editAgentFollowUp = _yield$resolveActiveS.editAgentFollowUp;
440
+ hoursChargeTools = _yield$resolveActiveS.hoursChargeTools;
441
+ affectedTaskIds = _yield$resolveActiveS.affectedTaskIds;
442
+ manualWasTaskEdit = _yield$resolveActiveS.manualWasTaskEdit;
443
+ manualWasTaskDelete = _yield$resolveActiveS.manualWasTaskDelete;
444
+ wasTaskEdit = _yield$resolveActiveS.wasTaskEdit;
445
+ wasTaskDelete = _yield$resolveActiveS.wasTaskDelete;
446
+ wasCreateAgentApproved = _yield$resolveActiveS.wasCreateAgentApproved;
447
+ pendingActions = _yield$resolveActiveS.pendingActions;
448
+ resolveCreateAgentHitlAnalyticsEvents({
449
+ wasCreateAgentApproved: wasCreateAgentApproved,
450
+ pendingActions: pendingActions,
451
+ manualApprovalToolName: manualApprovalForAnalytics === null || manualApprovalForAnalytics === void 0 ? void 0 : manualApprovalForAnalytics.toolName,
452
+ completedAgentId: completedAgentId,
453
+ agentType: getHitlAnalyticsAgentType(agent),
454
+ normalizeToolName: normalizeHitlToolName,
455
+ buildActionTypeList: buildHitlActionTypeList
456
+ }).forEach(function (payload) {
457
+ event(EVENTS.aiChatHitlOption, payload);
781
458
  });
782
- case 3:
783
- lastProjectMessage = messagesRef.current.filter(function (msg) {
784
- return msg.projectId;
785
- }).at(-1);
786
- contextProjectIdRaw = (project === null || project === void 0 ? void 0 : project.id) || (lastProjectMessage === null || lastProjectMessage === void 0 ? void 0 : lastProjectMessage.projectId);
787
- contextProjectId = contextProjectIdRaw ? parseInt(String(contextProjectIdRaw), 10) : null;
788
- pathMatch = window.location.pathname.match(/^\/projects\/(\d+)\//);
789
- routeProjectId = pathMatch ? parseInt(pathMatch[1], 10) : null;
790
- isOnProjectRoute = contextProjectId && routeProjectId && contextProjectId === routeProjectId;
791
- if (isOnProjectRoute) {
792
- if (wasTaskCreation) {
793
- (_window$newProjectDas = window.newProjectDashboard) === null || _window$newProjectDas === void 0 || (_window$newProjectDas2 = _window$newProjectDas.addExistingTaskToDashboard) === null || _window$newProjectDas2 === void 0 || _window$newProjectDas2.call(_window$newProjectDas, taskIds);
794
- } else if (wasTaskEdit) {
795
- (_window$newProjectDas3 = window.newProjectDashboard) === null || _window$newProjectDas3 === void 0 || (_window$newProjectDas4 = _window$newProjectDas3.editExistingTaskInDashboard) === null || _window$newProjectDas4 === void 0 || _window$newProjectDas4.call(_window$newProjectDas3, taskIds);
796
- } else if (wasTaskDelete) {
797
- (_window$newProjectDas5 = window.newProjectDashboard) === null || _window$newProjectDas5 === void 0 || (_window$newProjectDas6 = _window$newProjectDas5.deleteExistingTaskFromDashboard) === null || _window$newProjectDas6 === void 0 || _window$newProjectDas6.call(_window$newProjectDas5, taskIds);
798
- }
799
- }
800
- case 4:
801
- // Refetch del task panel si está abierto y la tool aprobada editó/borró esa tarea.
802
- // Cubre los dos flujos de approval:
803
- // 1) Approval por botón → `previousMessage.approval.pending_actions` (vía hasApprovalInPreviousMessage)
804
- // 2) Manual approval (usuario tipea "si"/"no") → `lastManualApprovalRef.current`
805
459
  openTaskPanelId = (_window$taskPanel = window.taskPanel) === null || _window$taskPanel === void 0 ? void 0 : _window$taskPanel.taskId;
806
- manualApproval = lastManualApprovalRef.current;
807
- lastManualApprovalRef.current = null; // consumir una sola vez
808
- manualWasTaskEdit = !!manualApproval && TASK_EDIT_TOOLS.includes(manualApproval.toolName);
809
- manualWasTaskDelete = !!manualApproval && TASK_DELETE_TOOLS.includes(manualApproval.toolName); // Sync Planner: avisar carga de horas confirmada (create_hour / create_hours).
810
- hoursToolsFromApproval = pendingActions.map(function (action) {
811
- return action.tool_name;
812
- }).filter(function (toolName) {
813
- return isHoursChargeTool(toolName);
814
- });
815
- wasHoursChargeApproved = hasApprovalInPreviousMessage && (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.approvalStatus) === 'approved' && hoursToolsFromApproval.length > 0;
816
- manualHoursTool = manualApproval === null || manualApproval === void 0 ? void 0 : manualApproval.toolName;
817
- wasHoursChargeManualApproved = isHoursChargeTool(manualHoursTool);
818
- if (wasHoursChargeApproved || wasHoursChargeManualApproved) {
819
- tools = wasHoursChargeApproved ? hoursToolsFromApproval : manualHoursTool ? [manualHoursTool] : [];
460
+ if (hoursChargeTools.length > 0) {
820
461
  dispatchMaiaHoursCharged({
821
462
  source: 'maia',
822
- tools: tools,
463
+ tools: hoursChargeTools,
823
464
  sessionId: memorySessionId
824
465
  });
825
466
  }
826
- if (openTaskPanelId && (wasTaskEdit || wasTaskDelete || manualWasTaskEdit || manualWasTaskDelete)) {
827
- manualPseudoAction = manualApproval ? {
828
- tool_name: manualApproval.toolName,
829
- tool_args: (_manualApproval$toolA = manualApproval.toolArgs) !== null && _manualApproval$toolA !== void 0 ? _manualApproval$toolA : {}
830
- } : null;
831
- affectedTaskIds = [].concat(_toConsumableArray(extractTaskIdsFromPendingActionsArgs(pendingActions)), _toConsumableArray(taskIdsFromUrls), _toConsumableArray(taskIdsFromDeleteApproval), _toConsumableArray(manualPseudoAction ? extractTaskIdsFromPendingActionsArgs([manualPseudoAction]) : [])).map(String);
832
- if (affectedTaskIds.includes(String(openTaskPanelId))) {
833
- (_window$taskPanel2 = window.taskPanel) === null || _window$taskPanel2 === void 0 || (_window$taskPanel2$re = _window$taskPanel2.refetchTask) === null || _window$taskPanel2$re === void 0 || _window$taskPanel2$re.call(_window$taskPanel2);
834
- }
467
+ if (shouldRefetchOpenTaskPanel(openTaskPanelId, {
468
+ wasTaskEdit: wasTaskEdit,
469
+ wasTaskDelete: wasTaskDelete
470
+ }, {
471
+ manualWasTaskEdit: manualWasTaskEdit,
472
+ manualWasTaskDelete: manualWasTaskDelete
473
+ }, affectedTaskIds)) {
474
+ (_window$taskPanel2 = window.taskPanel) === null || _window$taskPanel2 === void 0 || (_window$taskPanel2$re = _window$taskPanel2.refetchTask) === null || _window$taskPanel2$re === void 0 || _window$taskPanel2$re.call(_window$taskPanel2);
835
475
  }
836
476
 
837
477
  // Swap placeholder → mensaje final. Va en `flushSync` porque el motor ya
@@ -844,30 +484,19 @@ export var useChatManager = function useChatManager(_ref4) {
844
484
  // stream entra en un único commit.
845
485
  flushSync(function () {
846
486
  dropFromSession(sessionId, tempMessageId);
847
- commitToSession(sessionId, _objectSpread(_objectSpread(_objectSpread({
848
- id: finalMessageId,
849
- message: contentToAdd,
850
- date: new Date(),
851
- user: {
852
- id: 'assistant',
853
- name: 'Assistant'
854
- },
855
- role: ChatHistoryRole.ASSISTANT,
856
- sources: sources
857
- }, attachments.length > 0 ? {
858
- attachments: attachments
859
- } : {}), {}, {
487
+ commitToSession(sessionId, buildStreamFinishAssistantMessage({
488
+ finalMessageId: finalMessageId,
489
+ content: contentToAdd,
490
+ sources: sources,
491
+ attachments: attachments,
860
492
  memorySessionId: memorySessionId,
861
- suggestions: suggestions || []
862
- }, createAgentFollowUp ? {
863
- createAgentFollowUp: createAgentFollowUp
864
- } : {}), {}, {
865
- reasoning: finalTrace,
866
- compaction: compaction
493
+ suggestions: suggestions,
494
+ createAgentFollowUp: createAgentFollowUp,
495
+ reasoning: finalTrace
867
496
  }));
868
497
  });
869
498
  clearSessionTail(sessionId);
870
- if ((_createAgentFollowUp = createAgentFollowUp) !== null && _createAgentFollowUp !== void 0 && _createAgentFollowUp.agentId) {
499
+ if (createAgentFollowUp !== null && createAgentFollowUp !== void 0 && createAgentFollowUp.agentId) {
871
500
  fetchAgentDetail(createAgentFollowUp.agentId).then(function (chatAgent) {
872
501
  document.dispatchEvent(new CustomEvent('maia-merge-created-agent-into-list', {
873
502
  detail: {
@@ -878,7 +507,7 @@ export var useChatManager = function useChatManager(_ref4) {
878
507
  console.error('[useChatManager] No se pudo añadir el agente recién creado al listado', err);
879
508
  });
880
509
  }
881
- if ((_editAgentFollowUp = editAgentFollowUp) !== null && _editAgentFollowUp !== void 0 && _editAgentFollowUp.agentId) {
510
+ if (editAgentFollowUp !== null && editAgentFollowUp !== void 0 && editAgentFollowUp.agentId) {
882
511
  fetchAgentDetail(editAgentFollowUp.agentId).then(function (chatAgent) {
883
512
  document.dispatchEvent(new CustomEvent('maia-sync-edited-agent-from-chat', {
884
513
  detail: {
@@ -892,28 +521,27 @@ export var useChatManager = function useChatManager(_ref4) {
892
521
  isProcessingRef.current = false;
893
522
  retrySnapshotRef.current = null;
894
523
  _getChatsStoreState = getChatsStoreState(), isChatViewVisible = _getChatsStoreState.isChatViewVisible, markChatAsRead = _getChatsStoreState.markChatAsRead;
895
- if (!(isActive && isChatViewVisible)) {
896
- _context.next = 5;
524
+ if (!shouldMarkChatReadAfterStreamFinish(isActive, isChatViewVisible)) {
525
+ _context.next = 3;
897
526
  break;
898
527
  }
899
- _context.next = 5;
528
+ _context.next = 3;
900
529
  return markChatAsRead(sessionId, {
901
530
  force: true
902
531
  });
903
- case 5:
904
- if (firstTimeRef.current) {
905
- customEvent = new CustomEvent('refetch-session');
906
- document.dispatchEvent(customEvent);
532
+ case 3:
533
+ if (shouldDispatchFirstSessionRefetch(firstTimeRef.current)) {
534
+ document.dispatchEvent(new CustomEvent('refetch-session'));
907
535
  firstTimeRef.current = false;
908
536
  }
909
- case 6:
537
+ case 4:
910
538
  case "end":
911
539
  return _context.stop();
912
540
  }
913
541
  }, _callee);
914
542
  }));
915
543
  return function (_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9) {
916
- return _ref5.apply(this, arguments);
544
+ return _ref2.apply(this, arguments);
917
545
  };
918
546
  }(), [commitToSession, dropFromSession, clearSessionTail, project, getTabTaskDefault, event, agent]);
919
547
 
@@ -925,52 +553,37 @@ export var useChatManager = function useChatManager(_ref4) {
925
553
  var sessionId = currentChatId.current;
926
554
  clearStreamUiRef.current();
927
555
  var tempMessageId = streamingPlaceholderMessageId(currentMessageId.current);
928
- var finalMessageId = "answer-".concat(currentMessageId.current);
556
+ var _resolveStreamStopMes = resolveStreamStopMessageIds(currentMessageId.current),
557
+ finalMessageId = _resolveStreamStopMes.finalMessageId,
558
+ cancelledMessageId = _resolveStreamStopMes.cancelledMessageId;
929
559
  var stoppedTrace = reasoningTraceFor(tempMessageId);
930
- var compaction = compactionFor(tempMessageId);
931
560
  sessionStreamingText.clear(sessionId);
932
561
  streamingPlaceholderIdRef.current = null;
933
562
  activeStreamChatIdRef.current = null;
934
563
  dropFromSession(sessionId, tempMessageId);
935
- if (stoppedTrace !== null && stoppedTrace !== void 0 && stoppedTrace.steps.length || compaction) {
564
+ if (shouldPreserveReasoningOnStreamStop(stoppedTrace)) {
936
565
  reasoningStore.finish(tempMessageId, null);
937
566
  reasoningStore.rename(tempMessageId, finalMessageId);
938
567
  } else {
939
568
  reasoningStore.remove(tempMessageId);
940
569
  }
941
570
  if (partialText) {
942
- commitToSession(sessionId, _objectSpread(_objectSpread({
943
- id: finalMessageId,
944
- message: partialText,
945
- date: new Date(),
946
- user: {
947
- id: 'assistant',
948
- name: 'Assistant'
949
- },
950
- role: ChatHistoryRole.ASSISTANT
951
- }, stoppedTrace ? {
952
- reasoning: stoppedTrace
953
- } : {}), {}, {
954
- compaction: compaction
571
+ commitToSession(sessionId, buildStreamStopPartialAssistantMessage({
572
+ finalMessageId: finalMessageId,
573
+ partialText: partialText,
574
+ stoppedTrace: stoppedTrace
955
575
  }));
956
576
  }
957
- commitToSession(sessionId, {
958
- id: "".concat(finalMessageId, "-cancelled"),
959
- message: t('chat.cancelled'),
960
- date: new Date(),
961
- user: {
962
- id: 'assistant',
963
- name: 'Assistant'
964
- },
965
- role: ChatHistoryRole.ASSISTANT,
966
- isFrontendCancelled: true
967
- });
577
+ commitToSession(sessionId, buildStreamStopCancelledAssistantMessage({
578
+ cancelledMessageId: cancelledMessageId,
579
+ cancelledLabel: t('chat.cancelled')
580
+ }));
968
581
  clearSessionTail(sessionId);
969
582
  isProcessingRef.current = false;
970
583
  retrySnapshotRef.current = null;
971
584
  }, [commitToSession, dropFromSession, clearSessionTail, t]);
972
585
  var handleApprovalRequired = useCallback(function (ctx, approval, accumulatedContent) {
973
- var _approval$pending_act, _mapReasoningTrace;
586
+ var _mapReasoningTrace;
974
587
  var sessionId = ctx.sessionId,
975
588
  placeholderId = ctx.placeholderId;
976
589
  var isActive = activeView.is(sessionId);
@@ -981,61 +594,37 @@ export var useChatManager = function useChatManager(_ref4) {
981
594
  streamingPlaceholderIdRef.current = null;
982
595
  activeStreamChatIdRef.current = null;
983
596
  }
984
- var hitlContext = {
985
- messageId: "approval-".concat(approval.original_thread_id),
986
- messageText: accumulatedContent || '',
987
- approval: approval,
988
- pendingActions: approval.pending_actions,
989
- threadIds: (_approval$pending_act = approval.pending_actions) === null || _approval$pending_act === void 0 ? void 0 : _approval$pending_act.map(function (action) {
990
- return action.thread_id;
991
- })
992
- };
597
+ var hitlContext = resolveHitlExecutionContext(approval, accumulatedContent);
993
598
  if (isActive) {
994
599
  hitlExecutionContextRef.current = hitlContext;
995
600
  }
601
+ var hitlOutcome = resolveHitlApprovalRequiredOutcome(approval);
996
602
 
997
603
  // Preaprobado: por detección manual o por auto-approve. En ambos casos el
998
604
  // stream continúa y no hay que pintar la caja de aprobación.
999
- if (approval.manual_approval_detected || approval.auto_approved || approval.approval_status === 'approved') {
1000
- var _approval$pending_act2, _ref6, _tool_name, _tool_args;
605
+ if (hitlOutcome.type === 'skip-ui') {
1001
606
  trackManualHitlEvents(event, {
1002
607
  impression: EVENTS.aiChatHitl,
1003
608
  option: EVENTS.aiChatHitlOption
1004
- }, agent, approval, trackedManualHitlKeysRef.current, approval.manual_approval_detected ? 'manual' : 'auto');
1005
- var firstAction = (_approval$pending_act2 = approval.pending_actions) === null || _approval$pending_act2 === void 0 ? void 0 : _approval$pending_act2[0];
1006
- var toolName = (_ref6 = (_tool_name = approval.tool_name) !== null && _tool_name !== void 0 ? _tool_name : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_name) !== null && _ref6 !== void 0 ? _ref6 : '';
1007
- var toolArgs = ((_tool_args = approval.tool_args) !== null && _tool_args !== void 0 ? _tool_args : firstAction === null || firstAction === void 0 ? void 0 : firstAction.tool_args) || null;
1008
- if (toolName && isActive) {
1009
- lastManualApprovalRef.current = {
1010
- toolName: toolName,
1011
- toolArgs: toolArgs
1012
- };
609
+ }, agent, approval, trackedManualHitlKeysRef.current, resolveHitlSkipResolutionSource(approval));
610
+ var skippedManualApproval = resolveSkippedHitlManualApproval(approval);
611
+ if (skippedManualApproval && isActive) {
612
+ lastManualApprovalRef.current = skippedManualApproval;
1013
613
  }
1014
614
  if (isActive) {
1015
615
  isProcessingRef.current = false;
1016
616
  }
1017
617
  return;
1018
618
  }
1019
-
1020
- // Add a message with the approval request
1021
- var approvalMessageId = "approval-".concat(approval.original_thread_id);
1022
- var compaction = compactionFor(placeholderId, approval.reasoning);
619
+ var approvalMessageId = hitlOutcome.approvalMessageId;
1023
620
  reasoningStore.rename(placeholderId, approvalMessageId);
1024
621
  var approvalTrace = (_mapReasoningTrace = mapReasoningTrace(approval.reasoning)) !== null && _mapReasoningTrace !== void 0 ? _mapReasoningTrace : reasoningTraceFor(approvalMessageId);
1025
- commitToSession(sessionId, {
1026
- id: approvalMessageId,
1027
- message: accumulatedContent || '',
1028
- date: new Date(),
1029
- user: {
1030
- id: 'assistant',
1031
- name: 'Assistant'
1032
- },
1033
- role: ChatHistoryRole.ASSISTANT,
622
+ commitToSession(sessionId, buildHitlApprovalPendingMessage({
623
+ approvalMessageId: approvalMessageId,
624
+ accumulatedContent: accumulatedContent,
1034
625
  approval: approval,
1035
- approvalStatus: 'pending',
1036
- reasoning: approvalTrace,
1037
- compaction: compaction
1038
- });
626
+ reasoning: approvalTrace
627
+ }));
1039
628
  if (isActive) {
1040
629
  isProcessingRef.current = false;
1041
630
  } else {
@@ -1067,23 +656,23 @@ export var useChatManager = function useChatManager(_ref4) {
1067
656
  };
1068
657
  var currentProject = project;
1069
658
  var sendMessage = useCallback(/*#__PURE__*/function () {
1070
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(message, attachmentsOrOptions, faqId, agentSuggestionId, mentions, fuaId, scId) {
1071
- var _messagesRef$current;
1072
- var willStartNewStream, _normalizeSendMessage, attachments, options, effectiveMentions, contextMessage, payloadFuaId, payloadScId, payloadContextData, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, sessionId, _contextRef$current, ctxChipsProject, ctxProject, ctxClient, ctxTask, streamingPlaceholderId, finalMessage, _options$projectChang, _contextRef$current$p, history, lastMessageProjectId, projectToRequest, projects, payloadFaqId, payloadAgentSuggestionId, payloadData;
659
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(message, attachmentsOrOptions, faqId, agentSuggestionId, mentions, fuaId, scId) {
660
+ var _options$projectChang, _contextRef$current$p;
661
+ var willStartNewStream, sendGate, _normalizeSendMessage, attachments, options, payloadFields, contextMessage, displayMessage, newMessageId, lastMessageWithProject, currentAgentFromMessages, sessionId, _contextRef$current, ctxChipsProject, ctxProject, ctxClient, ctxTask, streamingPlaceholderId, finalMessage, history, lastMessageProjectId, projectToRequest, projects, payloadData;
1073
662
  return _regeneratorRuntime.wrap(function (_context2) {
1074
663
  while (1) switch (_context2.prev = _context2.next) {
1075
664
  case 0:
1076
- if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
1077
- _context2.next = 1;
1078
- break;
1079
- }
1080
- return _context2.abrupt("return");
1081
- case 1:
1082
- // Tope de concurrencia: si esta sesión no está generando y ya hay
1083
- // MAX_CONCURRENT_STREAMS activas, avisamos y no arrancamos otra.
1084
665
  willStartNewStream = !sessionStreamManager.isActive(currentChatId.current);
1085
- if (!(willStartNewStream && sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
1086
- _context2.next = 2;
666
+ sendGate = resolveSendMessageGate({
667
+ isProcessing: isProcessingRef.current,
668
+ waitingResponse: waitingResponse,
669
+ loadingMessages: loadingMessages,
670
+ willStartNewStream: willStartNewStream,
671
+ activeStreamCount: sessionStreamManager.getActiveCount(),
672
+ maxConcurrent: MAX_CONCURRENT_STREAMS
673
+ });
674
+ if (!(sendGate === 'concurrency')) {
675
+ _context2.next = 1;
1087
676
  break;
1088
677
  }
1089
678
  document.dispatchEvent(new CustomEvent('snackbar-event', {
@@ -1094,17 +683,25 @@ export var useChatManager = function useChatManager(_ref4) {
1094
683
  }
1095
684
  }));
1096
685
  return _context2.abrupt("return");
686
+ case 1:
687
+ if (!(sendGate === 'busy')) {
688
+ _context2.next = 2;
689
+ break;
690
+ }
691
+ return _context2.abrupt("return");
1097
692
  case 2:
1098
- _normalizeSendMessage = normalizeSendMessageArgs(attachmentsOrOptions), attachments = _normalizeSendMessage.attachments, options = _normalizeSendMessage.options; // Las mentions pueden venir vía 5to parámetro (call positional desde el footer)
1099
- // o vía SendMessageOptions (call programático). El parámetro explícito gana.
1100
- effectiveMentions = mentions !== null && mentions !== void 0 ? mentions : options.mentions;
1101
- contextMessage = buildContextMessage(effectiveMentions);
1102
- payloadFuaId = fuaId !== null && fuaId !== void 0 ? fuaId : options.fuaId;
1103
- payloadScId = scId !== null && scId !== void 0 ? scId : options.scId;
1104
- payloadContextData = options.contextData;
693
+ _normalizeSendMessage = normalizeSendMessageArgs(attachmentsOrOptions), attachments = _normalizeSendMessage.attachments, options = _normalizeSendMessage.options;
694
+ payloadFields = resolveSendMessagePayloadFields(options, {
695
+ faqId: faqId,
696
+ agentSuggestionId: agentSuggestionId,
697
+ mentions: mentions,
698
+ fuaId: fuaId,
699
+ scId: scId
700
+ });
701
+ contextMessage = buildContextMessage(payloadFields.mentions);
1105
702
  displayMessage = formatQuickActionMessageForDisplay(message, {
1106
- fuaId: payloadFuaId,
1107
- scId: payloadScId
703
+ fuaId: payloadFields.fuaId,
704
+ scId: payloadFields.scId
1108
705
  });
1109
706
  isProcessingRef.current = true;
1110
707
  setActiveChatId(currentChatId.current);
@@ -1120,7 +717,7 @@ export var useChatManager = function useChatManager(_ref4) {
1120
717
  lastMessageWithProject = messagesRef.current.filter(function (msg) {
1121
718
  return msg.projectId;
1122
719
  }).at(-1);
1123
- currentAgentFromMessages = (_messagesRef$current = messagesRef.current) === null || _messagesRef$current === void 0 || (_messagesRef$current = _messagesRef$current[messagesRef.current.length - 1]) === null || _messagesRef$current === void 0 ? void 0 : _messagesRef$current.agentId;
720
+ currentAgentFromMessages = resolveLastMessageAgentId(messagesRef.current);
1124
721
  sessionId = currentChatId.current;
1125
722
  _contextRef$current = contextRef.current, ctxChipsProject = _contextRef$current.chipsProject, ctxProject = _contextRef$current.project, ctxClient = _contextRef$current.client, ctxTask = _contextRef$current.task;
1126
723
  ensureSessionInSidebar({
@@ -1135,7 +732,7 @@ export var useChatManager = function useChatManager(_ref4) {
1135
732
 
1136
733
  // No agregar projectId al mensaje del usuario - se determinará después
1137
734
  commitToSession(sessionId, _objectSpread({
1138
- id: "question-".concat(currentMessageId.current),
735
+ id: resolveUserQuestionMessageId(currentMessageId.current),
1139
736
  message: displayMessage,
1140
737
  date: new Date(),
1141
738
  user: currentUser,
@@ -1160,68 +757,41 @@ export var useChatManager = function useChatManager(_ref4) {
1160
757
  role: ChatHistoryRole.ASSISTANT
1161
758
  });
1162
759
  finalMessage = message;
1163
- if (message === t('qa.items.rentabilidad_proyecto')) {
1164
- finalMessage = "FAQ: ".concat(t('qa.items.rentabilidad_proyecto'), " - Tipo de rentabilidad: ").concat(((_options$projectChang = options.projectChanged) === null || _options$projectChang === void 0 ? void 0 : _options$projectChang.incomeType) || ((_contextRef$current$p = contextRef.current.project) === null || _contextRef$current$p === void 0 ? void 0 : _contextRef$current$p.incomeType));
1165
- }
1166
- history = messagesRef.current.map(function (historyMessage) {
1167
- return {
1168
- content: historyMessage.message,
1169
- role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
1170
- };
1171
- });
760
+ finalMessage = resolveRentabilidadProjectFaqMessage(message, t('qa.items.rentabilidad_proyecto'), ((_options$projectChang = options.projectChanged) === null || _options$projectChang === void 0 ? void 0 : _options$projectChang.incomeType) || ((_contextRef$current$p = contextRef.current.project) === null || _contextRef$current$p === void 0 ? void 0 : _contextRef$current$p.incomeType));
761
+ history = buildChatHistoryFromMessages(messagesRef.current, authUser.id.toString());
1172
762
  lastMessageProjectId = lastMessageWithProject === null || lastMessageWithProject === void 0 ? void 0 : lastMessageWithProject.projectId;
1173
763
  projectToRequest = resolveProjectToRequest(ctxChipsProject, lastMessageProjectId);
1174
764
  _context2.next = 3;
1175
765
  return fetchProjects([projectToRequest]);
1176
766
  case 3:
1177
767
  projects = _context2.sent;
1178
- payloadFaqId = faqId !== null && faqId !== void 0 ? faqId : options.faqId;
1179
- payloadAgentSuggestionId = agentSuggestionId !== null && agentSuggestionId !== void 0 ? agentSuggestionId : options.agentSuggestionId;
1180
- payloadData = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
768
+ payloadData = buildMaiaStreamRequestPayload({
1181
769
  message: finalMessage,
1182
770
  history: history,
1183
771
  projectId: projectToRequest,
1184
- lang: authUser.lang,
1185
- userId: authUser.id.toString(),
1186
- firstName: authUser.firstName,
1187
- lastName: authUser.lastName,
1188
- companyId: authUser.company_id.toString(),
772
+ authUser: authUser,
1189
773
  chatId: currentChatId.current,
1190
774
  messageId: currentMessageId.current,
1191
775
  agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || '',
1192
- agentId: currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id),
1193
- isWebSearchActive: isWebSearchActiveRef.current,
1194
- isDeepSearchActive: isDeepSearchActiveRef.current,
1195
- isAutoApproveActive: isAutoApproveActiveRef.current
1196
- }, (ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.feeId) != null ? {
1197
- feeId: Number(ctxProject.feeId)
1198
- } : {}), resolveClientPayload(ctxClient, ctxProject)), projects !== null && projects !== void 0 && projects.length ? {
1199
- projectName: projects[0].name
1200
- } : {}), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? _objectSpread({
1201
- taskId: Number(ctxTask.id)
1202
- }, ctxTask.name ? {
1203
- taskName: ctxTask.name
1204
- } : {}) : {}), attachments.length > 0 ? {
1205
- attachments: attachments
1206
- } : {}), payloadFaqId ? {
1207
- faqId: payloadFaqId
1208
- } : {}), payloadAgentSuggestionId ? {
1209
- agentSuggestionId: payloadAgentSuggestionId
1210
- } : {}), payloadFuaId ? {
1211
- fuaId: payloadFuaId
1212
- } : {}), payloadScId ? {
1213
- scId: payloadScId
1214
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
1215
- agentEntity: agent.entity
1216
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
1217
- agentType: agent.type
1218
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
1219
- agentEmoji: agent.emoji
1220
- } : {}), contextMessage ? {
1221
- contextMessage: contextMessage
1222
- } : {}), payloadContextData ? {
1223
- contextData: payloadContextData
1224
- } : {});
776
+ agentId: resolveAgentIdForStream(currentAgentFromMessages, agent === null || agent === void 0 ? void 0 : agent.id),
777
+ isWebSearchActive: Boolean(isWebSearchActiveRef.current),
778
+ isDeepSearchActive: Boolean(isDeepSearchActiveRef.current),
779
+ isAutoApproveActive: Boolean(isAutoApproveActiveRef.current),
780
+ ctxProject: ctxProject,
781
+ ctxClient: ctxClient,
782
+ ctxTask: ctxTask,
783
+ projectName: projects !== null && projects !== void 0 && projects.length ? projects[0].name : undefined,
784
+ attachments: attachments,
785
+ faqId: payloadFields.faqId,
786
+ agentSuggestionId: payloadFields.agentSuggestionId,
787
+ fuaId: payloadFields.fuaId,
788
+ scId: payloadFields.scId,
789
+ agentEntity: agent === null || agent === void 0 ? void 0 : agent.entity,
790
+ agentType: agent === null || agent === void 0 ? void 0 : agent.type,
791
+ agentEmoji: agent === null || agent === void 0 ? void 0 : agent.emoji,
792
+ contextMessage: contextMessage,
793
+ contextData: payloadFields.contextData
794
+ });
1225
795
  askMaia(payloadData);
1226
796
  case 4:
1227
797
  case "end":
@@ -1230,70 +800,51 @@ export var useChatManager = function useChatManager(_ref4) {
1230
800
  }, _callee2);
1231
801
  }));
1232
802
  return function (_x0, _x1, _x10, _x11, _x12, _x13, _x14) {
1233
- return _ref7.apply(this, arguments);
803
+ return _ref3.apply(this, arguments);
1234
804
  };
1235
805
  }(), [addMessage, commitToSession, event, askMaia, project, client, task, chipsProject, authUser, agent, t, waitingResponse, loadingMessages, isWebSearchActive, isDeepSearchActive]);
1236
806
  var changeProject = useCallback(function (option) {
1237
807
  if (!currentUserQuestion.current) return;
1238
- if (option.id !== (project === null || project === void 0 ? void 0 : project.id)) {
808
+ if (shouldUpdateProjectOnChange(option.id, project === null || project === void 0 ? void 0 : project.id)) {
1239
809
  setProject(option);
1240
810
  }
1241
- if (project && currentUserQuestion.current) {
1242
- var history = messagesRef.current.map(function (historyMessage) {
1243
- return {
1244
- content: historyMessage.message,
1245
- role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
1246
- };
1247
- });
1248
- askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
811
+ if (shouldResendAfterProjectChange(currentUserQuestion.current, project)) {
812
+ var history = buildChatHistoryFromMessages(messagesRef.current, authUser.id.toString());
813
+ askMaia(buildMaiaStreamRequestPayloadForProjectChange({
1249
814
  message: currentUserQuestion.current,
1250
815
  history: history,
1251
- projectId: option.id,
1252
- lang: authUser.lang,
1253
- userId: authUser.id.toString(),
1254
- firstName: authUser.firstName,
1255
- lastName: authUser.lastName,
1256
- companyId: authUser.company_id.toString(),
816
+ project: option,
817
+ authUser: authUser,
1257
818
  chatId: currentChatId.current,
1258
819
  messageId: currentMessageId.current,
1259
820
  agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || '',
1260
821
  agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
1261
- isWebSearchActive: isWebSearchActiveRef.current,
1262
- isDeepSearchActive: isDeepSearchActiveRef.current,
1263
- isAutoApproveActive: isAutoApproveActiveRef.current
1264
- }, (option === null || option === void 0 ? void 0 : option.feeId) != null ? {
1265
- feeId: Number(option.feeId)
1266
- } : {}), (option === null || option === void 0 ? void 0 : option.clientId) != null ? {
1267
- clientId: Number(option.clientId)
1268
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
1269
- agentEntity: agent.entity
1270
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
1271
- agentType: agent.type
1272
- } : {}));
822
+ isWebSearchActive: Boolean(isWebSearchActiveRef.current),
823
+ isDeepSearchActive: Boolean(isDeepSearchActiveRef.current),
824
+ isAutoApproveActive: Boolean(isAutoApproveActiveRef.current),
825
+ agentEntity: agent === null || agent === void 0 ? void 0 : agent.entity,
826
+ agentType: agent === null || agent === void 0 ? void 0 : agent.type
827
+ }));
1273
828
  }
1274
829
  }, [project, setProject, askMaia, authUser, isWebSearchActive, agent]);
1275
830
  var retryMessage = useCallback(/*#__PURE__*/function () {
1276
- var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(message) {
1277
- var _userMessage$message, _userMessage$attachme, _userMessage$sources, _message$memorySessio, _truncated$at;
1278
- var sessionId, previousMessages, userMessage, turnId, useOrchestratorFallback, truncated, newMessageId, streamingPlaceholderId, placeholder, nextMessages, _contextRef$current2, ctxChipsProject, ctxProject, ctxClient, ctxTask, lastMessageWithProject, projectToRequest, currentAgentFromMessages, attachments, replayViaOrchestrator, result;
831
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(message) {
832
+ var _truncated$at;
833
+ var sessionId, retryBlock, previousMessages, userMessage, retryEligibility, turnId, useOrchestratorFallback, truncated, newMessageId, streamingPlaceholderId, placeholder, nextMessages, _contextRef$current2, ctxChipsProject, ctxProject, ctxClient, ctxTask, lastMessageWithProject, projectToRequest, currentAgentFromMessages, attachments, replayViaOrchestrator, result;
1279
834
  return _regeneratorRuntime.wrap(function (_context4) {
1280
835
  while (1) switch (_context4.prev = _context4.next) {
1281
836
  case 0:
1282
- if (!(isProcessingRef.current || waitingResponse || loadingMessages)) {
1283
- _context4.next = 1;
1284
- break;
1285
- }
1286
- return _context4.abrupt("return");
1287
- case 1:
1288
837
  sessionId = currentChatId.current;
1289
- if (!sessionStreamManager.isActive(sessionId)) {
1290
- _context4.next = 2;
1291
- break;
1292
- }
1293
- return _context4.abrupt("return");
1294
- case 2:
1295
- if (!(sessionStreamManager.getActiveCount() >= MAX_CONCURRENT_STREAMS)) {
1296
- _context4.next = 3;
838
+ retryBlock = resolveRetryBlockReason({
839
+ isProcessing: isProcessingRef.current,
840
+ waitingResponse: waitingResponse,
841
+ loadingMessages: loadingMessages,
842
+ isSessionStreamActive: sessionStreamManager.isActive(sessionId),
843
+ activeStreamCount: sessionStreamManager.getActiveCount(),
844
+ maxConcurrent: MAX_CONCURRENT_STREAMS
845
+ });
846
+ if (!(retryBlock === 'concurrency')) {
847
+ _context4.next = 1;
1297
848
  break;
1298
849
  }
1299
850
  document.dispatchEvent(new CustomEvent('snackbar-event', {
@@ -1304,31 +855,23 @@ export var useChatManager = function useChatManager(_ref4) {
1304
855
  }
1305
856
  }));
1306
857
  return _context4.abrupt("return");
1307
- case 3:
1308
- previousMessages = messagesRef.current;
1309
- if (previousMessages.some(function (item) {
1310
- return item.id === message.id;
1311
- })) {
1312
- _context4.next = 4;
858
+ case 1:
859
+ if (!(retryBlock != null)) {
860
+ _context4.next = 2;
1313
861
  break;
1314
862
  }
1315
863
  return _context4.abrupt("return");
1316
- case 4:
864
+ case 2:
865
+ previousMessages = messagesRef.current;
1317
866
  userMessage = findUserMessageForRetry(previousMessages, message);
1318
- if (!(!(userMessage !== null && userMessage !== void 0 && (_userMessage$message = userMessage.message) !== null && _userMessage$message !== void 0 && _userMessage$message.trim()) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$attachme = userMessage.attachments) !== null && _userMessage$attachme !== void 0 && _userMessage$attachme.length) && !(userMessage !== null && userMessage !== void 0 && (_userMessage$sources = userMessage.sources) !== null && _userMessage$sources !== void 0 && _userMessage$sources.length))) {
1319
- _context4.next = 5;
1320
- break;
1321
- }
1322
- return _context4.abrupt("return");
1323
- case 5:
1324
- turnId = resolveRetryTurnId(message);
1325
- useOrchestratorFallback = message.isFrontendCancelled && !((_message$memorySessio = message.memorySessionId) !== null && _message$memorySessio !== void 0 && _message$memorySessio.trim());
1326
- if (!(!turnId && !useOrchestratorFallback)) {
1327
- _context4.next = 6;
867
+ retryEligibility = resolveRetryEligibility(previousMessages, message, userMessage);
868
+ if (!(!retryEligibility.eligible || !userMessage)) {
869
+ _context4.next = 3;
1328
870
  break;
1329
871
  }
1330
872
  return _context4.abrupt("return");
1331
- case 6:
873
+ case 3:
874
+ turnId = retryEligibility.turnId, useOrchestratorFallback = retryEligibility.useOrchestratorFallback;
1332
875
  truncated = messagesWithoutRetriedTurn(previousMessages, message);
1333
876
  isProcessingRef.current = true;
1334
877
  retrySnapshotRef.current = previousMessages;
@@ -1359,19 +902,14 @@ export var useChatManager = function useChatManager(_ref4) {
1359
902
  }).at(-1);
1360
903
  projectToRequest = resolveProjectToRequest(ctxChipsProject, lastMessageWithProject === null || lastMessageWithProject === void 0 ? void 0 : lastMessageWithProject.projectId);
1361
904
  currentAgentFromMessages = ((_truncated$at = truncated.at(-1)) === null || _truncated$at === void 0 ? void 0 : _truncated$at.agentId) || message.agentId;
1362
- attachments = Array.isArray(userMessage.attachments) ? userMessage.attachments : Array.isArray(userMessage.sources) ? userMessage.sources : [];
905
+ attachments = resolveRetryUserAttachments(userMessage);
1363
906
  replayViaOrchestrator = /*#__PURE__*/function () {
1364
- var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
907
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
1365
908
  var history, projects, result, _t;
1366
909
  return _regeneratorRuntime.wrap(function (_context3) {
1367
910
  while (1) switch (_context3.prev = _context3.next) {
1368
911
  case 0:
1369
- history = truncated.map(function (historyMessage) {
1370
- return {
1371
- content: historyMessage.message,
1372
- role: historyMessage.user.id === authUser.id.toString() ? ChatHistoryRole.USER : ChatHistoryRole.ASSISTANT
1373
- };
1374
- });
912
+ history = buildChatHistoryFromMessages(truncated, authUser.id.toString());
1375
913
  if (!projectToRequest) {
1376
914
  _context3.next = 2;
1377
915
  break;
@@ -1387,40 +925,28 @@ export var useChatManager = function useChatManager(_ref4) {
1387
925
  case 3:
1388
926
  projects = _t;
1389
927
  _context3.next = 4;
1390
- return askMaia(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
928
+ return askMaia(buildMaiaStreamRequestPayload({
1391
929
  message: userMessage.message,
1392
930
  history: history,
1393
931
  projectId: projectToRequest,
1394
- lang: authUser.lang,
1395
- userId: authUser.id.toString(),
1396
- firstName: authUser.firstName,
1397
- lastName: authUser.lastName,
1398
- companyId: authUser.company_id.toString(),
932
+ authUser: authUser,
1399
933
  chatId: sessionId,
1400
934
  messageId: newMessageId,
1401
935
  agentName: (agent === null || agent === void 0 ? void 0 : agent.name) || '',
1402
- agentId: String(currentAgentFromMessages || (agent === null || agent === void 0 ? void 0 : agent.id) || ''),
1403
- isWebSearchActive: isWebSearchActiveRef.current,
1404
- isDeepSearchActive: isDeepSearchActiveRef.current
1405
- }, (ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.feeId) != null ? {
1406
- feeId: Number(ctxProject.feeId)
1407
- } : {}), resolveClientPayload(ctxClient, ctxProject)), projects !== null && projects !== void 0 && projects.length ? {
1408
- projectName: projects[0].name
1409
- } : {}), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? _objectSpread({
1410
- taskId: Number(ctxTask.id)
1411
- }, ctxTask.name ? {
1412
- taskName: ctxTask.name
1413
- } : {}) : {}), attachments.length > 0 ? {
1414
- attachments: attachments
1415
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.entity) != null ? {
1416
- agentEntity: agent.entity
1417
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.type) != null ? {
1418
- agentType: agent.type
1419
- } : {}), (agent === null || agent === void 0 ? void 0 : agent.emoji) != null ? {
1420
- agentEmoji: agent.emoji
1421
- } : {}), userMessage.contextMessage ? {
936
+ agentId: resolveAgentIdForStream(currentAgentFromMessages, agent === null || agent === void 0 ? void 0 : agent.id),
937
+ isWebSearchActive: Boolean(isWebSearchActiveRef.current),
938
+ isDeepSearchActive: Boolean(isDeepSearchActiveRef.current),
939
+ isAutoApproveActive: Boolean(isAutoApproveActiveRef.current),
940
+ ctxProject: ctxProject,
941
+ ctxClient: ctxClient,
942
+ ctxTask: ctxTask,
943
+ projectName: projects !== null && projects !== void 0 && projects.length ? projects[0].name : undefined,
944
+ attachments: attachments,
945
+ agentEntity: agent === null || agent === void 0 ? void 0 : agent.entity,
946
+ agentType: agent === null || agent === void 0 ? void 0 : agent.type,
947
+ agentEmoji: agent === null || agent === void 0 ? void 0 : agent.emoji,
1422
948
  contextMessage: userMessage.contextMessage
1423
- } : {}));
949
+ }));
1424
950
  case 4:
1425
951
  result = _context3.sent;
1426
952
  if (!result.started) {
@@ -1448,19 +974,19 @@ export var useChatManager = function useChatManager(_ref4) {
1448
974
  }, _callee3);
1449
975
  }));
1450
976
  return function replayViaOrchestrator() {
1451
- return _ref9.apply(this, arguments);
977
+ return _ref5.apply(this, arguments);
1452
978
  };
1453
979
  }();
1454
980
  if (!(useOrchestratorFallback || !turnId)) {
1455
- _context4.next = 8;
981
+ _context4.next = 5;
1456
982
  break;
1457
983
  }
1458
- _context4.next = 7;
984
+ _context4.next = 4;
1459
985
  return replayViaOrchestrator();
1460
- case 7:
986
+ case 4:
1461
987
  return _context4.abrupt("return");
1462
- case 8:
1463
- _context4.next = 9;
988
+ case 5:
989
+ _context4.next = 6;
1464
990
  return retryCompletion(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
1465
991
  chatId: sessionId,
1466
992
  messageId: newMessageId,
@@ -1478,23 +1004,23 @@ export var useChatManager = function useChatManager(_ref4) {
1478
1004
  } : {}), resolveClientPayload(ctxClient, ctxProject)), (ctxTask === null || ctxTask === void 0 ? void 0 : ctxTask.id) != null ? {
1479
1005
  taskId: Number(ctxTask.id)
1480
1006
  } : {}));
1481
- case 9:
1007
+ case 6:
1482
1008
  result = _context4.sent;
1483
1009
  if (!result.started) {
1484
- _context4.next = 10;
1010
+ _context4.next = 7;
1485
1011
  break;
1486
1012
  }
1487
1013
  return _context4.abrupt("return");
1488
- case 10:
1014
+ case 7:
1489
1015
  if (!(result.reason === 'turn_not_found')) {
1490
- _context4.next = 12;
1016
+ _context4.next = 9;
1491
1017
  break;
1492
1018
  }
1493
- _context4.next = 11;
1019
+ _context4.next = 8;
1494
1020
  return replayViaOrchestrator();
1495
- case 11:
1021
+ case 8:
1496
1022
  return _context4.abrupt("return");
1497
- case 12:
1023
+ case 9:
1498
1024
  retrySnapshotRef.current = null;
1499
1025
  messagesRef.current = previousMessages;
1500
1026
  replaceMessages(previousMessages);
@@ -1511,18 +1037,18 @@ export var useChatManager = function useChatManager(_ref4) {
1511
1037
  }
1512
1038
  }));
1513
1039
  }
1514
- case 13:
1040
+ case 10:
1515
1041
  case "end":
1516
1042
  return _context4.stop();
1517
1043
  }
1518
1044
  }, _callee4);
1519
1045
  }));
1520
1046
  return function (_x15) {
1521
- return _ref8.apply(this, arguments);
1047
+ return _ref4.apply(this, arguments);
1522
1048
  };
1523
1049
  }(), [waitingResponse, loadingMessages, replaceMessages, retryCompletion, askMaia, fetchProjects, authUser, agent, t, setActiveChatId]);
1524
1050
  var handleFeedback = useCallback(/*#__PURE__*/function () {
1525
- var _ref0 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(feedbackProp, chatMessageId) {
1051
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(feedbackProp, chatMessageId) {
1526
1052
  var response;
1527
1053
  return _regeneratorRuntime.wrap(function (_context5) {
1528
1054
  while (1) switch (_context5.prev = _context5.next) {
@@ -1548,11 +1074,11 @@ export var useChatManager = function useChatManager(_ref4) {
1548
1074
  }, _callee5);
1549
1075
  }));
1550
1076
  return function (_x16, _x17) {
1551
- return _ref0.apply(this, arguments);
1077
+ return _ref6.apply(this, arguments);
1552
1078
  };
1553
1079
  }(), []);
1554
1080
  var handleApprovalDecision = useCallback(/*#__PURE__*/function () {
1555
- var _ref1 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(threadIds, decision, editedActions, metadata) {
1081
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(threadIds, decision, editedActions, metadata) {
1556
1082
  var found, messageWithApproval, foundSessionId, approval, sessionId, messageId, newStatus, hitlContext, isActiveSession, streamMessageId, hitlCtx, releaseActiveProcessing, result;
1557
1083
  return _regeneratorRuntime.wrap(function (_context6) {
1558
1084
  while (1) switch (_context6.prev = _context6.next) {
@@ -1564,7 +1090,7 @@ export var useChatManager = function useChatManager(_ref4) {
1564
1090
  console.error('No thread_ids provided for approval decision');
1565
1091
  return _context6.abrupt("return");
1566
1092
  case 1:
1567
- found = findMessageWithApprovalByThreadIds(threadIds, messagesRef.current);
1093
+ found = findMessageWithApprovalByThreadIds(threadIds, messagesRef.current, useSessionsStore.getState().messages, activeView.get());
1568
1094
  if (found !== null && found !== void 0 && found.message.approval) {
1569
1095
  _context6.next = 2;
1570
1096
  break;
@@ -1608,7 +1134,7 @@ export var useChatManager = function useChatManager(_ref4) {
1608
1134
  return _context6.abrupt("return");
1609
1135
  case 6:
1610
1136
  messageId = messageWithApproval.id;
1611
- newStatus = decision === 'approve' ? 'approved' : 'rejected';
1137
+ newStatus = resolveApprovalDecisionStatus(decision);
1612
1138
  hitlContext = {
1613
1139
  messageId: messageId,
1614
1140
  messageText: messageWithApproval.message,
@@ -1645,7 +1171,7 @@ export var useChatManager = function useChatManager(_ref4) {
1645
1171
  continueRequest: {
1646
1172
  threadIds: threadIds,
1647
1173
  sessionId: approval.session_id,
1648
- decision: editedActions ? 'edit' : decision,
1174
+ decision: resolveContinueStreamDecision(decision, editedActions),
1649
1175
  editedActions: editedActions,
1650
1176
  agentId: (agent === null || agent === void 0 ? void 0 : agent.id) || '',
1651
1177
  lang: authUser.lang,
@@ -1695,11 +1221,11 @@ export var useChatManager = function useChatManager(_ref4) {
1695
1221
  }, _callee6);
1696
1222
  }));
1697
1223
  return function (_x18, _x19, _x20, _x21) {
1698
- return _ref1.apply(this, arguments);
1224
+ return _ref7.apply(this, arguments);
1699
1225
  };
1700
1226
  }(), [authUser, agent, commitToSession, handleStreamError, handleStreamUpdate, handleStreamFinish, handleApprovalRequired, t]);
1701
1227
  var initializeChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
1702
- var _userInitialMessage$m, _userInitialMessage$a, _ref11, _resolveProjectToRequ, hasInitialMessage, hasInitialAttachments, hasInitialFaq, hasInitialFua, hasInitialSc, history, _contextRef$current3, ctxChipsProject, ctxProject, ctxClient, ctxTask, projectToRequest, initialDisplayMessage;
1228
+ var _userInitialMessage$m, _userInitialMessage$a, _ref9, _resolveProjectToRequ, hasInitialMessage, hasInitialAttachments, hasInitialFaq, hasInitialFua, hasInitialSc, history, _contextRef$current3, ctxChipsProject, ctxProject, ctxClient, ctxTask, projectToRequest, initialDisplayMessage;
1703
1229
  return _regeneratorRuntime.wrap(function (_context7) {
1704
1230
  while (1) switch (_context7.prev = _context7.next) {
1705
1231
  case 0:
@@ -1738,7 +1264,7 @@ export var useChatManager = function useChatManager(_ref4) {
1738
1264
  };
1739
1265
  });
1740
1266
  _contextRef$current3 = contextRef.current, ctxChipsProject = _contextRef$current3.chipsProject, ctxProject = _contextRef$current3.project, ctxClient = _contextRef$current3.client, ctxTask = _contextRef$current3.task;
1741
- projectToRequest = (_ref11 = (_resolveProjectToRequ = resolveProjectToRequest(ctxChipsProject, null)) !== null && _resolveProjectToRequ !== void 0 ? _resolveProjectToRequ : ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ref11 !== void 0 ? _ref11 : null;
1267
+ projectToRequest = (_ref9 = (_resolveProjectToRequ = resolveProjectToRequest(ctxChipsProject, null)) !== null && _resolveProjectToRequ !== void 0 ? _resolveProjectToRequ : ctxProject === null || ctxProject === void 0 ? void 0 : ctxProject.id) !== null && _ref9 !== void 0 ? _ref9 : null;
1742
1268
  initialDisplayMessage = formatQuickActionMessageForDisplay(userInitialMessage.message, {
1743
1269
  fuaId: userInitialMessage.fuaId,
1744
1270
  scId: userInitialMessage.scId
@@ -1844,4 +1370,4 @@ export var useChatManager = function useChatManager(_ref4) {
1844
1370
  isDisabled: waitingResponse || loadingMessages
1845
1371
  };
1846
1372
  };
1847
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiZmx1c2hTeW5jIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwidXNlVXNlciIsInVzZUdsb2JhbENvbnRleHQiLCJFVkVOVFMiLCJ1c2VFdmVudCIsIm1haWEiLCJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImJ1aWxkQ29udGV4dE1lc3NhZ2UiLCJmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5IiwidXNlUHJvamVjdHMiLCJ1c2VUYWJUYXNrRGVmYXVsdCIsIlRBU0tfVVJMX1JFR0VYX1BBVFRFUk4iLCJkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQiLCJpc0hvdXJzQ2hhcmdlVG9vbCIsImZldGNoQWdlbnREZXRhaWwiLCJidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCIsImdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUiLCJub3JtYWxpemVIaXRsVG9vbE5hbWUiLCJ0cmFja01hbnVhbEhpdGxFdmVudHMiLCJzZXNzaW9uU3RyZWFtaW5nVGV4dCIsInVzZVNlc3Npb25zU3RvcmUiLCJ1c2VTZXNzaW9uTWV0YSIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyIsImFjdGl2ZVZpZXciLCJub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQiLCJidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUiLCJlbnN1cmVTZXNzaW9uSW5TaWRlYmFyIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsInN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIiwiZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkiLCJtZXNzYWdlc1dpdGhvdXRSZXRyaWVkVHVybiIsInJlc29sdmVSZXRyeVR1cm5JZCIsImdldENoYXRzU3RvcmVTdGF0ZSIsInVzZUNoYXRzU3RvcmUiLCJyZWFzb25pbmdTdG9yZSIsImJ1aWxkUmVhc29uaW5nVHJhY2UiLCJtYXBSZWFzb25pbmdUcmFjZSIsIm1hcENvbnRleHRDb21wYWN0aW9uIiwicmVhc29uaW5nVHJhY2VGb3IiLCJtZXNzYWdlSWQiLCJzbmFwc2hvdCIsImdldFNuYXBzaG90Iiwic3RlcHMiLCJsZW5ndGgiLCJzdW1tYXJ5IiwiY29tcGFjdGlvbkZvciIsInBheWxvYWQiLCJfcmVhc29uaW5nU3RvcmUkZ2V0U24iLCJjb21wYWN0aW9uIiwibm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzIiwiYXR0YWNobWVudHNPck9wdGlvbnMiLCJfb3B0aW9ucyRhdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsImF0dGFjaG1lbnRzIiwib3B0aW9ucyIsInJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0IiwiY2hpcHNQcm9qZWN0IiwibGFzdE1lc3NhZ2VQcm9qZWN0SWQiLCJjaGlwc1Byb2plY3RJZCIsInByb2plY3RJZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VkIiwicmVzb2x2ZUNsaWVudFBheWxvYWQiLCJjdHhDbGllbnQiLCJjdHhQcm9qZWN0IiwiX2N0eFByb2plY3QkY2xpZW50IiwiaWQiLCJfb2JqZWN0U3ByZWFkIiwiY2xpZW50SWQiLCJuYW1lIiwiY2xpZW50TmFtZSIsImNsaWVudCIsIm5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzIiwicmF3QXR0YWNobWVudHMiLCJmaWx0ZXIiLCJhdHRhY2htZW50IiwiX3R5cGVvZiIsIm1hcCIsImluZGV4IiwidHJpbSIsImNvbmNhdCIsInR5cGUiLCJtaW1lVHlwZSIsIm1pbWVfdHlwZSIsImZ1bGxGaWxlTmFtZSIsImluY2x1ZGVzIiwibnVtZXJpY1NpemUiLCJzaXplIiwiZmlsZSIsIkZpbGUiLCJ1cmxfb3JpZ2luYWwiLCJ1bmRlZmluZWQiLCJ1cmxfdGh1bWJuYWlsIiwidXJsX2ZpbGUiLCJyb2xlIiwiZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzIiwicGVuZGluZ0FjdGlvbnMiLCJpZHMiLCJwdXNoSWQiLCJyYXciLCJuIiwicGFyc2VJbnQiLCJTdHJpbmciLCJpc05hTiIsInB1c2giLCJmb3JFYWNoIiwiYWN0aW9uIiwiX3JlYyR0YXNrX2lkIiwiYXJncyIsInRvb2xfYXJncyIsInJlYyIsInRhc2tfaWQiLCJ0YXNrX2lkcyIsInRhc2tzIiwidCIsIl90cmVjJHRhc2tfaWQiLCJ0cmVjIiwiZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMiLCJ0b29sX25hbWUiLCJfcmVjJHRhc2tfaWQyIiwibGlzdCIsInRpZCIsImV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zIiwiX3JlYyRhZ2VudF9pZCIsImVkaXRBY3Rpb24iLCJmaW5kIiwiYSIsInRvTG93ZXJDYXNlIiwiYWdlbnRfaWQiLCJhZ2VudElkIiwiZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lIiwidG9vbE5hbWUiLCJfcmVmIiwiX3JlYyRhZ2VudF9pZDIiLCJleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQiLCJ0ZXh0IiwibGFiZWxlZCIsIm1hdGNoIiwiYm9sZCIsInVzZVN0YWJsZUNhbGxiYWNrcyIsImF1dGhVc2VyIiwiY3VycmVudFVzZXIiLCJ0b1N0cmluZyIsImZpcnN0TmFtZSIsImF2YXRhciIsInBpY3R1cmUiLCJjdXJyZW50IiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyIsInRocmVhZElkcyIsImFjdGl2ZU1lc3NhZ2VzIiwiZnJvbUFjdGl2ZVZpZXciLCJtZXNzYWdlIiwiX21lc3NhZ2UkYXBwcm92YWwiLCJhcHByb3ZhbCIsInBlbmRpbmdfYWN0aW9ucyIsInNvbWUiLCJ0aHJlYWRfaWQiLCJzZXNzaW9uSWQiLCJzZXNzaW9uX2lkIiwiZ2V0IiwiX3VzZVNlc3Npb25zU3RvcmUkZ2V0IiwiZ2V0U3RhdGUiLCJtZXNzYWdlcyIsInNlc3Npb25FbnRyeSIsIk9iamVjdCIsImVudHJpZXMiLCJfcmVmMiIsIl9yZWYzIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXNzaW9uTWVzc2FnZXMiLCJfbWVzc2FnZSRhcHByb3ZhbDIiLCJfc2Vzc2lvbkVudHJ5IiwiZm91bmQiLCJfbWVzc2FnZSRhcHByb3ZhbDMiLCJ1c2VDaGF0TWFuYWdlciIsIl9yZWY0IiwiaW5pdGlhbENoYXRJZCIsImNoYXRJZCIsInVzZXJJbml0aWFsTWVzc2FnZSIsIm9uRXJyb3IiLCJfcmVmNCRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsIl91c2VHbG9iYWxDb250ZXh0IiwicHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJ0YXNrIiwic2V0VGFzayIsImFnZW50IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJpc0F1dG9BcHByb3ZlQWN0aXZlIiwic2V0Q2hpcHNQcm9qZWN0IiwiZXZlbnQiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZVN0YWJsZUNhbGxiYWNrcyIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwiY3VycmVudE1lc3NhZ2VJZCIsImN1cnJlbnRVc2VyUXVlc3Rpb24iLCJjdXJyZW50Q2hhdElkIiwic2V0QWN0aXZlQ2hhdElkIiwic3RhdGUiLCJyZXBvcnRlZEV2ZW50IiwibWVzc2FnZXNSZWYiLCJsYXN0TWFudWFsQXBwcm92YWxSZWYiLCJ0cmFja2VkTWFudWFsSGl0bEtleXNSZWYiLCJTZXQiLCJoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiIsInJldHJ5U25hcHNob3RSZWYiLCJpc1Byb2Nlc3NpbmdSZWYiLCJmaXJzdFRpbWVSZWYiLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmIiwiYWN0aXZlU3RyZWFtQ2hhdElkUmVmIiwiY2xlYXJTdHJlYW1VaVJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJhY3RpdmVMb2FkaW5ncyIsInNldEFjdGl2ZUxvYWRpbmdzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJhY3RpdmVTZXNzaW9uSWQiLCJzZXRBY3RpdmVTZXNzaW9uSWQiLCJpc01vdW50ZWRSZWYiLCJsYXN0SGFuZGxlZFRlcm1pbmFsUmVmIiwiaXNXZWJTZWFyY2hBY3RpdmVSZWYiLCJpc0RlZXBTZWFyY2hBY3RpdmVSZWYiLCJpc0F1dG9BcHByb3ZlQWN0aXZlUmVmIiwiY29udGV4dFJlZiIsIl91c2VDaGF0TWVzc2FnZXMiLCJsb2FkaW5nTWVzc2FnZXMiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJsb2FkTWVzc2FnZXMiLCJhZGRNZXNzYWdlIiwicmVtb3ZlTWVzc2FnZSIsInJlcGxhY2VNZXNzYWdlcyIsImhhbmRsZVNjcm9sbCIsImNvbW1pdFRvU2Vzc2lvbiIsImlzIiwiZHJvcEZyb21TZXNzaW9uIiwiY2xlYXJTZXNzaW9uVGFpbCIsInNldE1lc3NhZ2VzIiwic2V0IiwiYWN0aXZlU2Vzc2lvbk1ldGEiLCJfYWN0aXZlU2Vzc2lvbk1ldGEkZmkiLCJzdGF0dXMiLCJpc1Rlcm1pbmFsIiwia2V5IiwiZmluaXNoZWRBdCIsInRhaWwiLCJnZXRNZXNzYWdlcyIsImhhc1N0YWxlUGxhY2Vob2xkZXIiLCJtc2ciLCJmb3JjZSIsImN1c3RvbUV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJwcmV2aW91c0luaXRpYWxDaGF0SWRSZWYiLCJwcmV2aW91c0luaXRpYWxDaGF0SWQiLCJpc0FjdGl2ZSIsImhhbmRsZVN0cmVhbUVycm9yIiwiY3R4IiwiZXJyb3JNZXNzYWdlIiwiZXJyb3JSYXdNZXNzYWdlIiwiX2Vycm9yUmF3TWVzc2FnZSRtYXRjIiwiX2Vycm9yUmF3TWVzc2FnZSRtYXRjMiIsInBsYWNlaG9sZGVySWQiLCJjbGVhciIsInJldHJ5U25hcHNob3QiLCJzaG93Iiwic2V2ZXJpdHkiLCJpc0FjY2Vzc0RlbmllZCIsImlzUHJvbXB0VG9vTG9uZyIsInVzZWQiLCJpc0Vycm9yIiwic3VnZ2VzdGlvbnMiLCJkYXRlIiwiRGF0ZSIsInVzZXIiLCJBU1NJU1RBTlQiLCJtYXJrQ2hhdEFzVW5yZWFkIiwiaGFuZGxlU3RyZWFtVXBkYXRlIiwiY29udGVudCIsInBsYWNlaG9sZGVyRXhpc3RzIiwic3RhcnQiLCJzZXRUZXh0IiwiaGFuZGxlU3RyZWFtRmluaXNoIiwiX3JlZjUiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsInNvdXJjZXMiLCJtZW1vcnlTZXNzaW9uSWQiLCJjb21wbGV0ZWRBZ2VudElkIiwiX3Jlc29sdmVkQ29udGV4dCIsInJlYXNvbmluZyIsIl9yZWFzb25pbmdUcmFjZUZvciIsIl9wcmV2aW91c01lc3NhZ2UkYXBwciIsIl93aW5kb3ckdGFza1BhbmVsIiwiX2NyZWF0ZUFnZW50Rm9sbG93VXAiLCJfZWRpdEFnZW50Rm9sbG93VXAiLCJ0ZW1wTWVzc2FnZUlkIiwiZmluYWxNZXNzYWdlSWQiLCJmaW5hbFRyYWNlIiwidGFza1VybFJlZ2V4IiwibWF0Y2hlcyIsImNvbnRlbnRUb0FkZCIsInByZXZpb3VzTWVzc2FnZSIsImhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UiLCJUQVNLX0NSRUFUSU9OX1RPT0xTIiwiVEFTS19FRElUX1RPT0xTIiwiVEFTS19ERUxFVEVfVE9PTFMiLCJ3YXNUYXNrQ3JlYXRpb24iLCJ3YXNUYXNrRWRpdCIsIndhc1Rhc2tEZWxldGUiLCJ3YXNDcmVhdGVBZ2VudEFwcHJvdmVkIiwid2FzQ29uZmlndXJlQWdlbnRBY2Nlc3NBcHByb3ZlZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJjb25maWd1cmVkQWdlbnRJZCIsIm1hbnVhbEFwcHJvdmFsRm9yQW5hbHl0aWNzIiwid2FzTWFudWFsQ3JlYXRlQWdlbnRBcHByb3ZlZCIsIndhc0VkaXRBZ2VudEFwcHJvdmVkIiwiZWRpdEFnZW50Rm9sbG93VXAiLCJmcm9tU3RyZWFtIiwiZnJvbUFyZ3MiLCJyZXNvbHZlZEFnZW50SWQiLCJ0YXNrSWRzRnJvbVVybHMiLCJ0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsIiwidGFza0lkc0Zyb21EZWxldGlvblRleHQiLCJ0YXNrSWRzRm9yRGFzaGJvYXJkIiwic2hvdWxkU3luY0Rhc2hib2FyZCIsInRhc2tJZHMiLCJ0YWIiLCJ0YWJTZWdtZW50IiwibGFzdFByb2plY3RNZXNzYWdlIiwiY29udGV4dFByb2plY3RJZFJhdyIsImNvbnRleHRQcm9qZWN0SWQiLCJwYXRoTWF0Y2giLCJyb3V0ZVByb2plY3RJZCIsImlzT25Qcm9qZWN0Um91dGUiLCJfd2luZG93JG5ld1Byb2plY3REYXMiLCJfd2luZG93JG5ld1Byb2plY3REYXMyIiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzMyIsIl93aW5kb3ckbmV3UHJvamVjdERhczQiLCJfd2luZG93JG5ld1Byb2plY3REYXM1IiwiX3dpbmRvdyRuZXdQcm9qZWN0RGFzNiIsIm9wZW5UYXNrUGFuZWxJZCIsIm1hbnVhbEFwcHJvdmFsIiwibWFudWFsV2FzVGFza0VkaXQiLCJtYW51YWxXYXNUYXNrRGVsZXRlIiwiaG91cnNUb29sc0Zyb21BcHByb3ZhbCIsIndhc0hvdXJzQ2hhcmdlQXBwcm92ZWQiLCJtYW51YWxIb3Vyc1Rvb2wiLCJ3YXNIb3Vyc0NoYXJnZU1hbnVhbEFwcHJvdmVkIiwidG9vbHMiLCJfbWFudWFsQXBwcm92YWwkdG9vbEEiLCJtYW51YWxQc2V1ZG9BY3Rpb24iLCJhZmZlY3RlZFRhc2tJZHMiLCJfd2luZG93JHRhc2tQYW5lbDIiLCJfd2luZG93JHRhc2tQYW5lbDIkcmUiLCJfZ2V0Q2hhdHNTdG9yZVN0YXRlIiwiaXNDaGF0Vmlld1Zpc2libGUiLCJtYXJrQ2hhdEFzUmVhZCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwicmVuYW1lIiwiYWJydXB0IiwiUmVnRXhwIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwibWF0Y2hBbGwiLCJtIiwiYXQiLCJhcHByb3ZhbFN0YXR1cyIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJhaUNoYXRIaXRsT3B0aW9uIiwiYWdlbnRfdHlwZSIsImFjdGlvbl90eXBlIiwiZGVjaXNpb24iLCJvcHRpb24iLCJjcmVhdGVkX2FnZW50X2lkIiwicmVzb2x1dGlvbl9zb3VyY2UiLCJzZW50IiwicmVwbGFjZSIsInVybCIsImxvY2F0aW9uIiwicGF0aG5hbWUiLCJuZXdQcm9qZWN0RGFzaGJvYXJkIiwiYWRkRXhpc3RpbmdUYXNrVG9EYXNoYm9hcmQiLCJjYWxsIiwiZWRpdEV4aXN0aW5nVGFza0luRGFzaGJvYXJkIiwiZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZCIsInRhc2tQYW5lbCIsInRhc2tJZCIsInNvdXJjZSIsInRvb2xBcmdzIiwicmVmZXRjaFRhc2siLCJ0aGVuIiwiY2hhdEFnZW50IiwiZXJyIiwiY29uc29sZSIsImVycm9yIiwic3RvcCIsIl94IiwiX3gyIiwiX3gzIiwiX3g0IiwiX3g1IiwiX3g2IiwiX3g3IiwiX3g4IiwiX3g5IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJoYW5kbGVTdHJlYW1TdG9wIiwicGFydGlhbFRleHQiLCJzdG9wcGVkVHJhY2UiLCJmaW5pc2giLCJyZW1vdmUiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwiaGFuZGxlQXBwcm92YWxSZXF1aXJlZCIsImFjY3VtdWxhdGVkQ29udGVudCIsIl9hcHByb3ZhbCRwZW5kaW5nX2FjdCIsIl9tYXBSZWFzb25pbmdUcmFjZSIsImhpdGxDb250ZXh0Iiwib3JpZ2luYWxfdGhyZWFkX2lkIiwibWVzc2FnZVRleHQiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJhdXRvX2FwcHJvdmVkIiwiYXBwcm92YWxfc3RhdHVzIiwiX2FwcHJvdmFsJHBlbmRpbmdfYWN0MiIsIl9yZWY2IiwiX3Rvb2xfbmFtZSIsIl90b29sX2FyZ3MiLCJpbXByZXNzaW9uIiwiYWlDaGF0SGl0bCIsImZpcnN0QWN0aW9uIiwiYXBwcm92YWxNZXNzYWdlSWQiLCJhcHByb3ZhbFRyYWNlIiwiX3VzZU9yY2hlc3RyYXRvclN0cmVhIiwib25TdHJlYW1VcGRhdGUiLCJvbkZpbmlzaFN0cmVhbSIsIm9uU3RvcCIsIm9uQXBwcm92YWxSZXF1aXJlZCIsImFza01haWEiLCJyZXRyeUNvbXBsZXRpb24iLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc0xvYWRpbmciLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsInN0cmVhbUFjdGl2aXR5IiwidXBkYXRlU3RyZWFtQWN0aXZpdHkiLCJzdG9wU3RyZWFtaW5nIiwiY3VycmVudFByb2plY3QiLCJzZW5kTWVzc2FnZSIsIl9yZWY3IiwiX2NhbGxlZTIiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJfbWVzc2FnZXNSZWYkY3VycmVudCIsIndpbGxTdGFydE5ld1N0cmVhbSIsIl9ub3JtYWxpemVTZW5kTWVzc2FnZSIsImVmZmVjdGl2ZU1lbnRpb25zIiwiY29udGV4dE1lc3NhZ2UiLCJwYXlsb2FkRnVhSWQiLCJwYXlsb2FkU2NJZCIsInBheWxvYWRDb250ZXh0RGF0YSIsImRpc3BsYXlNZXNzYWdlIiwibmV3TWVzc2FnZUlkIiwibGFzdE1lc3NhZ2VXaXRoUHJvamVjdCIsImN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyIsIl9jb250ZXh0UmVmJGN1cnJlbnQiLCJjdHhDaGlwc1Byb2plY3QiLCJjdHhUYXNrIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJJZCIsImZpbmFsTWVzc2FnZSIsIl9vcHRpb25zJHByb2plY3RDaGFuZyIsIl9jb250ZXh0UmVmJGN1cnJlbnQkcCIsImhpc3RvcnkiLCJwcm9qZWN0VG9SZXF1ZXN0IiwicHJvamVjdHMiLCJwYXlsb2FkRmFxSWQiLCJwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQiLCJwYXlsb2FkRGF0YSIsIl9jb250ZXh0MiIsImdldEFjdGl2ZUNvdW50IiwiY29udGV4dERhdGEiLCJwbUFpVHlwZWRUZXh0IiwidGl0bGUiLCJVU0VSIiwicHJvamVjdENoYW5nZWQiLCJpbmNvbWVUeXBlIiwiaGlzdG9yeU1lc3NhZ2UiLCJsYW5nIiwidXNlcklkIiwibGFzdE5hbWUiLCJjb21wYW55SWQiLCJjb21wYW55X2lkIiwiYWdlbnROYW1lIiwiZmVlSWQiLCJwcm9qZWN0TmFtZSIsInRhc2tOYW1lIiwiZW50aXR5IiwiYWdlbnRFbnRpdHkiLCJhZ2VudFR5cGUiLCJlbW9qaSIsImFnZW50RW1vamkiLCJfeDAiLCJfeDEiLCJfeDEwIiwiX3gxMSIsIl94MTIiLCJfeDEzIiwiX3gxNCIsImNoYW5nZVByb2plY3QiLCJyZXRyeU1lc3NhZ2UiLCJfcmVmOCIsIl9jYWxsZWU0IiwiX3VzZXJNZXNzYWdlJG1lc3NhZ2UiLCJfdXNlck1lc3NhZ2UkYXR0YWNobWUiLCJfdXNlck1lc3NhZ2Ukc291cmNlcyIsIl9tZXNzYWdlJG1lbW9yeVNlc3NpbyIsIl90cnVuY2F0ZWQkYXQiLCJwcmV2aW91c01lc3NhZ2VzIiwidXNlck1lc3NhZ2UiLCJ0dXJuSWQiLCJ1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayIsInRydW5jYXRlZCIsInBsYWNlaG9sZGVyIiwibmV4dE1lc3NhZ2VzIiwiX2NvbnRleHRSZWYkY3VycmVudDIiLCJyZXBsYXlWaWFPcmNoZXN0cmF0b3IiLCJyZXN1bHQiLCJfY29udGV4dDQiLCJpdGVtIiwiX3JlZjkiLCJfY2FsbGVlMyIsIl90IiwiX2NvbnRleHQzIiwic3RhcnRlZCIsInJlYXNvbiIsIl94MTUiLCJoYW5kbGVGZWVkYmFjayIsIl9yZWYwIiwiX2NhbGxlZTUiLCJmZWVkYmFja1Byb3AiLCJjaGF0TWVzc2FnZUlkIiwicmVzcG9uc2UiLCJfY29udGV4dDUiLCJDaGF0cyIsIndhc0hlbHBmdWxDaGF0IiwiVEhVTUJTX1VQIiwid2FzSGVscGZ1bCIsIl94MTYiLCJfeDE3IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsIl9yZWYxIiwiX2NhbGxlZTYiLCJlZGl0ZWRBY3Rpb25zIiwibWV0YWRhdGEiLCJtZXNzYWdlV2l0aEFwcHJvdmFsIiwiZm91bmRTZXNzaW9uSWQiLCJuZXdTdGF0dXMiLCJpc0FjdGl2ZVNlc3Npb24iLCJzdHJlYW1NZXNzYWdlSWQiLCJoaXRsQ3R4IiwicmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmciLCJfY29udGV4dDYiLCJzdGFydENvbnRpbnVlU3RyZWFtIiwiY29udGludWVSZXF1ZXN0IiwiaGl0bEV4ZWN1dGlvbkNvbnRleHQiLCJjYWxsYmFja3MiLCJmaW5pc2hQYXlsb2FkIiwicmVzb2x2ZWRDb250ZXh0IiwiYXBwcm92YWxQYXlsb2FkIiwiX3gxOCIsIl94MTkiLCJfeDIwIiwiX3gyMSIsImluaXRpYWxpemVDaGF0IiwiX2NhbGxlZTciLCJfdXNlckluaXRpYWxNZXNzYWdlJG0iLCJfdXNlckluaXRpYWxNZXNzYWdlJGEiLCJfcmVmMTEiLCJfcmVzb2x2ZVByb2plY3RUb1JlcXUiLCJoYXNJbml0aWFsTWVzc2FnZSIsImhhc0luaXRpYWxBdHRhY2htZW50cyIsImhhc0luaXRpYWxGYXEiLCJoYXNJbml0aWFsRnVhIiwiaGFzSW5pdGlhbFNjIiwiX2NvbnRleHRSZWYkY3VycmVudDMiLCJpbml0aWFsRGlzcGxheU1lc3NhZ2UiLCJfY29udGV4dDciLCJCb29sZWFuIiwicmVzZXRDaGF0IiwicHJldmlvdXNTZXNzaW9uSWQiLCJzdG9wR2VuZXJhdGlvbiIsImlzRGlzYWJsZWQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlQ2hhdE1hbmFnZXIvdXNlQ2hhdE1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgcmFkaXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0ZWQtb3B0aW9uYWwtY2hhaW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGZsdXNoU3luYyB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnXG5pbXBvcnQgeyB1c2VDaGF0TWVzc2FnZXMgfSBmcm9tICcuLi91c2VDaGF0TWVzc2FnZXMnXG5pbXBvcnQgeyB1c2VPcmNoZXN0cmF0b3JTdHJlYW0gfSBmcm9tICcuLi91c2VPcmNoZXN0cmF0b3JTdHJlYW0nXG5pbXBvcnQgeyB1c2VUIH0gZnJvbSAnLi4vdXNlVCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgU2VuZE1lc3NhZ2VPcHRpb25zLCBVc2VDaGF0TWFuYWdlclByb3BzIH0gZnJvbSAnLi91c2VDaGF0TWFuYWdlci5pbnRlcmZhY2UnXG5pbXBvcnQgeyB1c2VVc2VyLCBDT1JVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uL3VzZUV2ZW50J1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2xlY3VsZXMvTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0TWVzc2FnZVVzZXIsIENoYXRIaXN0b3J5Um9sZSwgQXBwcm92YWxSZXF1ZXN0LCBQZW5kaW5nQWN0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uLCBDb250ZXh0TWVzc2FnZSwgYnVpbGRDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcblxuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgeyB1c2VQcm9qZWN0cyB9IGZyb20gJy4uL3VzZVByb2plY3RzJ1xuaW1wb3J0IHsgdXNlVGFiVGFza0RlZmF1bHQgfSBmcm9tICcuLi91c2VUYWJUYXNrRGVmYXVsdCdcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5pbXBvcnQgeyBkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQsIGlzSG91cnNDaGFyZ2VUb29sIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3BsYW5uZXJTeW5jRXZlbnRzJ1xuaW1wb3J0IHsgZmV0Y2hBZ2VudERldGFpbCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEvQWdlbnRzL2ZldGNoQWdlbnREZXRhaWwnXG5pbXBvcnQge1xuICBidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCxcbiAgZ2V0SGl0bEFuYWx5dGljc0FnZW50VHlwZSxcbiAgbm9ybWFsaXplSGl0bFRvb2xOYW1lLFxuICB0cmFja01hbnVhbEhpdGxFdmVudHMsXG59IGZyb20gJy4uLy4uL3V0aWxzL2hpdGxBbmFseXRpY3MnXG5pbXBvcnQgeyB0eXBlIEhpdGxFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IHNlc3Npb25TdHJlYW1pbmdUZXh0IH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbWluZ1RleHQnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IHVzZVNlc3Npb25NZXRhIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbk1ldGEnXG5pbXBvcnQgeyBzZXNzaW9uU3RyZWFtTWFuYWdlciwgTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25TdHJlYW1NYW5hZ2VyJ1xuaW1wb3J0IHsgYWN0aXZlVmlldyB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL2FjdGl2ZVZpZXcnXG5pbXBvcnQgeyBub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uTm90aWZpY2F0aW9ucydcbmltcG9ydCB7IGJ1aWxkU2lkZWJhclNlc3Npb25UaXRsZSwgZW5zdXJlU2Vzc2lvbkluU2lkZWJhciB9IGZyb20gJy4uLy4uL3N0b3JlL2NoYXRzU2lkZWJhck9wdGltaXN0aWMnXG5pbXBvcnQgeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkLCBzdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmVhbUFjdGl2aXR5TWVzc2FnZXMnXG5pbXBvcnQgeyBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeSwgbWVzc2FnZXNXaXRob3V0UmV0cmllZFR1cm4sIHJlc29sdmVSZXRyeVR1cm5JZCB9IGZyb20gJy4uLy4uL3V0aWxzL3JldHJ5Q29tcGxldGlvbidcbmltcG9ydCB0eXBlIHsgU3RyZWFtQ29udGV4dCB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbS91c2VPcmNoZXN0cmF0b3JTdHJlYW0uaW50ZXJmYWNlJ1xuaW1wb3J0IHsgZ2V0Q2hhdHNTdG9yZVN0YXRlLCB1c2VDaGF0c1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdXNlQ2hhdHNTdG9yZSdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgeyBidWlsZFJlYXNvbmluZ1RyYWNlLCBtYXBSZWFzb25pbmdUcmFjZSB9IGZyb20gJy4uLy4uL3V0aWxzL3JlYXNvbmluZ01hcHBlcnMnXG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1RyYWNlLCBSZWFzb25pbmdUcmFjZVBheWxvYWQgfSBmcm9tICcuLi8uLi90eXBlcy9yZWFzb25pbmcnXG5pbXBvcnQgeyBtYXBDb250ZXh0Q29tcGFjdGlvbiwgdHlwZSBDb250ZXh0Q29tcGFjdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRDb21wYWN0aW9uJ1xuXG50eXBlIEF0dGFjaG1lbnRzT3JPcHRpb25zID0gQXR0YWNobWVudEZpbGVbXSB8IFNlbmRNZXNzYWdlT3B0aW9uc1xuXG4vKiogVHJhY2UgYWN1bXVsYWRvIGVuIHZpdm8gcGFyYSBgbWVzc2FnZUlkYCwgbyBudWxsIHNpIGVsIHN0b3JlIGFwdW50YSBhIG90cm8gbWVuc2FqZS4gKi9cbmNvbnN0IHJlYXNvbmluZ1RyYWNlRm9yID0gKG1lc3NhZ2VJZDogc3RyaW5nKTogUmVhc29uaW5nVHJhY2UgfCBudWxsID0+IHtcbiAgY29uc3Qgc25hcHNob3QgPSByZWFzb25pbmdTdG9yZS5nZXRTbmFwc2hvdChtZXNzYWdlSWQpXG4gIGlmICghc25hcHNob3Quc3RlcHMubGVuZ3RoKSByZXR1cm4gbnVsbFxuICByZXR1cm4gYnVpbGRSZWFzb25pbmdUcmFjZShzbmFwc2hvdC5zdGVwcywgc25hcHNob3Quc3VtbWFyeSlcbn1cblxuLyoqIEF2aXNvIGRlIGNvbXBhY3RhY2nDs246IHN0b3JlIGVuIHZpdm8sIG8gZWwgYGNvbXBsZXRlYCBwZXJzaXN0aWRvLiBDYXB0dXJhciBhbnRlcyBkZWwgYHJlbmFtZWAuICovXG5jb25zdCBjb21wYWN0aW9uRm9yID0gKG1lc3NhZ2VJZDogc3RyaW5nLCBwYXlsb2FkPzogUmVhc29uaW5nVHJhY2VQYXlsb2FkIHwgbnVsbCk6IENvbnRleHRDb21wYWN0aW9uIHwgbnVsbCA9PlxuICByZWFzb25pbmdTdG9yZS5nZXRTbmFwc2hvdChtZXNzYWdlSWQpLmNvbXBhY3Rpb24gPz8gbWFwQ29udGV4dENvbXBhY3Rpb24ocGF5bG9hZD8uY29tcGFjdGlvbilcblxuY29uc3Qgbm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzID0gKGF0dGFjaG1lbnRzT3JPcHRpb25zPzogQXR0YWNobWVudHNPck9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXR0YWNobWVudHNPck9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHsgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzT3JPcHRpb25zLCBvcHRpb25zOiB7fSBhcyBTZW5kTWVzc2FnZU9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogU2VuZE1lc3NhZ2VPcHRpb25zID0gYXR0YWNobWVudHNPck9wdGlvbnMgPz8ge31cbiAgcmV0dXJuIHsgYXR0YWNobWVudHM6IG9wdGlvbnMuYXR0YWNobWVudHMgPz8gW10sIG9wdGlvbnMgfVxufVxuXG4vKiogY2hpcHNQcm9qZWN0IGVzIGxhIGZ1ZW50ZSBkZSB2ZXJkYWQgZGVsIHBpbiB2aXNpYmxlOyBzaSBubyBoYXkgcGluLCByZXN0YXVyYXIgZGVzZGUgaGlzdG9yaWFsLiAqL1xuY29uc3QgcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QgPSAoXG4gIGNoaXBzUHJvamVjdDogeyBwcm9qZWN0SWQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxhc3RNZXNzYWdlUHJvamVjdElkOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBudW1iZXIgfCBudWxsID0+IHtcbiAgY29uc3QgY2hpcHNQcm9qZWN0SWQgPSBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCA/IE51bWJlcihjaGlwc1Byb2plY3QucHJvamVjdElkKSA6IG51bGxcbiAgaWYgKGNoaXBzUHJvamVjdElkICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGNoaXBzUHJvamVjdElkKSkge1xuICAgIHJldHVybiBjaGlwc1Byb2plY3RJZFxuICB9XG4gIGlmIChsYXN0TWVzc2FnZVByb2plY3RJZCAhPSBudWxsKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKGxhc3RNZXNzYWdlUHJvamVjdElkKVxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSA/IHBhcnNlZCA6IG51bGxcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCByZXNvbHZlQ2xpZW50UGF5bG9hZCA9IChcbiAgY3R4Q2xpZW50OiB7IGlkPzogbnVtYmVyOyBuYW1lPzogc3RyaW5nIH0gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjdHhQcm9qZWN0OiBQcm9qZWN0IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogeyBjbGllbnRJZD86IG51bWJlcjsgY2xpZW50TmFtZT86IHN0cmluZyB9ID0+IHtcbiAgaWYgKGN0eENsaWVudD8uaWQpIHtcbiAgICByZXR1cm4geyBjbGllbnRJZDogY3R4Q2xpZW50LmlkLCAuLi4oY3R4Q2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eENsaWVudC5uYW1lIH0gOiB7fSkgfVxuICB9XG4gIGlmIChjdHhQcm9qZWN0Py5jbGllbnRJZCAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgY2xpZW50SWQ6IE51bWJlcihjdHhQcm9qZWN0LmNsaWVudElkKSB9XG4gIH1cbiAgaWYgKGN0eFByb2plY3Q/LmNsaWVudD8uaWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IGN0eFByb2plY3QuY2xpZW50LmlkLFxuICAgICAgLi4uKGN0eFByb2plY3QuY2xpZW50Lm5hbWUgPyB7IGNsaWVudE5hbWU6IGN0eFByb2plY3QuY2xpZW50Lm5hbWUgfSA6IHt9KSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt9XG59XG5cbmNvbnN0IG5vcm1hbGl6ZUFzc2lzdGFudEF0dGFjaG1lbnRzID0gKHJhd0F0dGFjaG1lbnRzOiB1bmtub3duKTogQXR0YWNobWVudEZpbGVbXSA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShyYXdBdHRhY2htZW50cykpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIHJldHVybiByYXdBdHRhY2htZW50c1xuICAgIC5maWx0ZXIoKGF0dGFjaG1lbnQpOiBhdHRhY2htZW50IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+ICEhYXR0YWNobWVudCAmJiB0eXBlb2YgYXR0YWNobWVudCA9PT0gJ29iamVjdCcpXG4gICAgLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICB0eXBlb2YgYXR0YWNobWVudC5uYW1lID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50Lm5hbWUudHJpbSgpID8gYXR0YWNobWVudC5uYW1lLnRyaW0oKSA6IGBmaWxlLSR7aW5kZXggKyAxfWBcbiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgYXR0YWNobWVudC50eXBlID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LnR5cGUudHJpbSgpID8gYXR0YWNobWVudC50eXBlLnRyaW0oKSA6ICdwZGYnXG4gICAgICBjb25zdCBtaW1lVHlwZSA9IHR5cGVvZiBhdHRhY2htZW50Lm1pbWVfdHlwZSA9PT0gJ3N0cmluZycgPyBhdHRhY2htZW50Lm1pbWVfdHlwZSA6ICcnXG4gICAgICBjb25zdCBmdWxsRmlsZU5hbWUgPSBuYW1lLmluY2x1ZGVzKCcuJykgPyBuYW1lIDogYCR7bmFtZX0uJHt0eXBlfWBcbiAgICAgIGNvbnN0IG51bWVyaWNTaXplID1cbiAgICAgICAgdHlwZW9mIGF0dGFjaG1lbnQuc2l6ZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IGF0dGFjaG1lbnQuc2l6ZVxuICAgICAgICAgIDogTnVtYmVyLmlzRmluaXRlKE51bWJlcihhdHRhY2htZW50LnNpemUpKVxuICAgICAgICAgICAgPyBOdW1iZXIoYXR0YWNobWVudC5zaXplKVxuICAgICAgICAgICAgOiAwXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IG5ldyBGaWxlKFtdLCBmdWxsRmlsZU5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSksXG4gICAgICAgIGlkOlxuICAgICAgICAgIHR5cGVvZiBhdHRhY2htZW50LmlkID09PSAnc3RyaW5nJyAmJiBhdHRhY2htZW50LmlkLnRyaW0oKVxuICAgICAgICAgICAgPyBhdHRhY2htZW50LmlkXG4gICAgICAgICAgICA6IGBhc3Npc3RhbnQtZmlsZS0ke2luZGV4fS0ke2Z1bGxGaWxlTmFtZX1gLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzaXplOiBudW1lcmljU2l6ZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdXJsX29yaWdpbmFsOiB0eXBlb2YgYXR0YWNobWVudC51cmxfb3JpZ2luYWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybF90aHVtYm5haWw6IHR5cGVvZiBhdHRhY2htZW50LnVybF90aHVtYm5haWwgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfdGh1bWJuYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICB1cmxfZmlsZTogdHlwZW9mIGF0dGFjaG1lbnQudXJsX2ZpbGUgPT09ICdzdHJpbmcnID8gYXR0YWNobWVudC51cmxfZmlsZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcm9sZTogYXR0YWNobWVudC5yb2xlID09PSAnYXNzaXN0YW50JyA/ICdhc3Npc3RhbnQnIDogJ3VzZXInLFxuICAgICAgfVxuICAgIH0pXG59XG5cbi8qKiBFeHRyYWUgdGFza19pZHMgZGUgbG9zIHRvb2xfYXJncyBkZSBwZW5kaW5nX2FjdGlvbnMsIGN1YnJpZW5kbyBsYXMgZm9ybWFzIGNvbXVuZXM6XG4gKiAgLSBgeyB0YXNrX2lkIH1gIG8gYHsgaWQgfWBcbiAqICAtIGB7IHRhc2tfaWRzOiBbXSB9YFxuICogIC0gYHsgdGFza3M6IFt7IHRhc2tfaWR8aWQgfSwgLi4uXSB9YFxuICogIMOadGlsIHBhcmEgdG9vbHMgZGUgZWRpdC9hc3NpZ24vZGVsZXRlIGN1YW5kbyBsYSByZXNwdWVzdGEgZGVsIExMTSBubyBpbmNsdXllIFVSTHMgL3Rhc2tzLy4uLi9kZXRhaWwuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21QZW5kaW5nQWN0aW9uc0FyZ3MocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSk6IG51bWJlcltdIHtcbiAgY29uc3QgaWRzOiBudW1iZXJbXSA9IFtdXG4gIGNvbnN0IHB1c2hJZCA9IChyYXc6IHVua25vd24pID0+IHtcbiAgICBpZiAocmF3ID09IG51bGwpIHJldHVyblxuICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gIH1cbiAgcGVuZGluZ0FjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgIGlmICghYWN0aW9uIHx8IHR5cGVvZiBhY3Rpb24gIT09ICdvYmplY3QnKSByZXR1cm5cbiAgICBjb25zdCBhcmdzID0gYWN0aW9uLnRvb2xfYXJnc1xuICAgIGlmICghKGFyZ3MgJiYgdHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFyZ3MpKSkgcmV0dXJuXG4gICAgY29uc3QgcmVjID0gYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHB1c2hJZChyZWMudGFza19pZCA/PyByZWMuaWQpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVjLnRhc2tfaWRzKSkge1xuICAgICAgcmVjLnRhc2tfaWRzLmZvckVhY2gocHVzaElkKVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWMudGFza3MpKSB7XG4gICAgICByZWMudGFza3MuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgaWYgKHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHQpKSB7XG4gICAgICAgICAgY29uc3QgdHJlYyA9IHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICBwdXNoSWQodHJlYy50YXNrX2lkID8/IHRyZWMuaWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbi8qKiB0YXNrX2lkIC8gdGFza19pZHMgZW4gcGVuZGluZ19hY3Rpb25zIGRlIGRlbGV0ZV8qIChsYSByZXNwdWVzdGEgcHVlZGUgbm8gaW5jbHVpciBVUkxzIC90YXNrcy/igKYvZGV0YWlsKS4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RUYXNrSWRzRnJvbURlbGV0ZVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IGlkczogbnVtYmVyW10gPSBbXVxuICBwZW5kaW5nQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgaWYgKCFhY3Rpb24gfHwgdHlwZW9mIGFjdGlvbiAhPT0gJ29iamVjdCcpIHJldHVyblxuICAgIGNvbnN0IGFyZ3MgPSBhY3Rpb24udG9vbF9hcmdzXG4gICAgaWYgKCEoYXJncyAmJiB0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoYXJncykpKSByZXR1cm5cbiAgICBjb25zdCByZWMgPSBhcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgaWYgKGFjdGlvbi50b29sX25hbWUgPT09ICdkZWxldGVfdGFzaycpIHtcbiAgICAgIGNvbnN0IHJhdyA9IHJlYy50YXNrX2lkID8/IHJlYy5pZFxuICAgICAgaWYgKHJhdyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcocmF3KSwgMTApXG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG4pKSBpZHMucHVzaChuKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWN0aW9uLnRvb2xfbmFtZSA9PT0gJ2RlbGV0ZV90YXNrc19iYXRjaCcpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSByZWMudGFza19pZHNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgICAgIGxpc3QuZm9yRWFjaCh0aWQgPT4ge1xuICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChTdHJpbmcodGlkKSwgMTApXG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIGlkcy5wdXNoKG4pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRzXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBZ2VudElkRnJvbUVkaXRBZ2VudFBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZWRpdEFjdGlvbiA9IHBlbmRpbmdBY3Rpb25zLmZpbmQoYSA9PiAoYS50b29sX25hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09ICdlZGl0X2FnZW50JylcbiAgaWYgKFxuICAgICFlZGl0QWN0aW9uIHx8XG4gICAgIWVkaXRBY3Rpb24udG9vbF9hcmdzIHx8XG4gICAgdHlwZW9mIGVkaXRBY3Rpb24udG9vbF9hcmdzICE9PSAnb2JqZWN0JyB8fFxuICAgIEFycmF5LmlzQXJyYXkoZWRpdEFjdGlvbi50b29sX2FyZ3MpXG4gICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gZWRpdEFjdGlvbi50b29sX2FyZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgY29uc3QgcmF3ID0gcmVjLmFnZW50X2lkID8/IHJlYy5hZ2VudElkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG5mdW5jdGlvbiBleHRyYWN0QWdlbnRJZEZyb21QZW5kaW5nQWN0aW9uc0J5VG9vbE5hbWUocGVuZGluZ0FjdGlvbnM6IFBlbmRpbmdBY3Rpb25bXSwgdG9vbE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBhY3Rpb24gPSBwZW5kaW5nQWN0aW9ucy5maW5kKGEgPT4gKGEudG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSB0b29sTmFtZS50b0xvd2VyQ2FzZSgpKVxuICBpZiAoIWFjdGlvbiB8fCAhYWN0aW9uLnRvb2xfYXJncyB8fCB0eXBlb2YgYWN0aW9uLnRvb2xfYXJncyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShhY3Rpb24udG9vbF9hcmdzKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgcmVjID0gYWN0aW9uLnRvb2xfYXJncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBjb25zdCByYXcgPSByZWMuYWdlbnRfaWQgPz8gcmVjLmFnZW50SWQgPz8gcmVjLmlkXG4gIHJldHVybiByYXcgIT0gbnVsbCA/IFN0cmluZyhyYXcpIDogbnVsbFxufVxuXG4vKiogw5psdGltbyByZWN1cnNvIHNpIG5vIGhheSBsaW5rcyBuaSB0b29sX2FyZ3MgcGFyc2VhYmxlcyAocC4gZWouIFwiSUQgKio3NTk3MTA2KipcIikuICovXG5mdW5jdGlvbiBleHRyYWN0VGFza0lkc0Zyb21Bc3Npc3RhbnREZWxldGlvblRleHQodGV4dDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBsYWJlbGVkID0gdGV4dC5tYXRjaCgvXFxiSURcXHMqXFwqXFwqKFxcZCspXFwqXFwqL2kpXG4gIGlmIChsYWJlbGVkKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGxhYmVsZWRbMV0sIDEwKVxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBbXSA6IFtuXVxuICB9XG4gIGNvbnN0IGJvbGQgPSB0ZXh0Lm1hdGNoKC9cXCpcXCooXFxkezUsfSlcXCpcXCovKVxuICBpZiAoYm9sZCkge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChib2xkWzFdLCAxMClcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG4pID8gW10gOiBbbl1cbiAgfVxuICByZXR1cm4gW11cbn1cblxuY29uc3QgdXNlU3RhYmxlQ2FsbGJhY2tzID0gKGF1dGhVc2VyOiBDT1JVc2VyKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gdXNlUmVmPENoYXRNZXNzYWdlVXNlcj4oe1xuICAgIGlkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICBhdmF0YXI6IGF1dGhVc2VyLnBpY3R1cmUsXG4gIH0pXG5cbiAgaWYgKFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQuaWQgIT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkgfHxcbiAgICBjdXJyZW50VXNlci5jdXJyZW50Lm5hbWUgIT09IGF1dGhVc2VyLmZpcnN0TmFtZSB8fFxuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQuYXZhdGFyICE9PSBhdXRoVXNlci5waWN0dXJlXG4gICkge1xuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQgPSB7XG4gICAgICBpZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgIG5hbWU6IGF1dGhVc2VyLmZpcnN0TmFtZSxcbiAgICAgIGF2YXRhcjogYXV0aFVzZXIucGljdHVyZSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50VXNlcjogY3VycmVudFVzZXIuY3VycmVudCxcbiAgfVxufVxuXG5jb25zdCBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEJ5VGhyZWFkSWRzID0gKFxuICB0aHJlYWRJZHM6IHN0cmluZ1tdLFxuICBhY3RpdmVNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXVxuKTogeyBtZXNzYWdlOiBDaGF0TWVzc2FnZTsgc2Vzc2lvbklkOiBzdHJpbmcgfSB8IG51bGwgPT4ge1xuICBjb25zdCBmcm9tQWN0aXZlVmlldyA9IGFjdGl2ZU1lc3NhZ2VzLmZpbmQobWVzc2FnZSA9PlxuICAgIG1lc3NhZ2UuYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucz8uc29tZShhY3Rpb24gPT4gdGhyZWFkSWRzLmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICApXG4gIGlmIChmcm9tQWN0aXZlVmlldz8uYXBwcm92YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogZnJvbUFjdGl2ZVZpZXcsXG4gICAgICBzZXNzaW9uSWQ6IGZyb21BY3RpdmVWaWV3LmFwcHJvdmFsLnNlc3Npb25faWQgfHwgYWN0aXZlVmlldy5nZXQoKSB8fCAnJyxcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IG1lc3NhZ2VzIH0gPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKClcbiAgY29uc3Qgc2Vzc2lvbkVudHJ5ID0gT2JqZWN0LmVudHJpZXMobWVzc2FnZXMpLmZpbmQoKFssIHNlc3Npb25NZXNzYWdlc10pID0+XG4gICAgc2Vzc2lvbk1lc3NhZ2VzLnNvbWUobWVzc2FnZSA9PlxuICAgICAgbWVzc2FnZS5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zPy5zb21lKGFjdGlvbiA9PiB0aHJlYWRJZHMuaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gICAgKVxuICApXG4gIGlmIChzZXNzaW9uRW50cnkpIHtcbiAgICBjb25zdCBbc2Vzc2lvbklkLCBzZXNzaW9uTWVzc2FnZXNdID0gc2Vzc2lvbkVudHJ5XG4gICAgY29uc3QgZm91bmQgPSBzZXNzaW9uTWVzc2FnZXMuZmluZChtZXNzYWdlID0+XG4gICAgICBtZXNzYWdlLmFwcHJvdmFsPy5wZW5kaW5nX2FjdGlvbnM/LnNvbWUoYWN0aW9uID0+IHRocmVhZElkcy5pbmNsdWRlcyhhY3Rpb24udGhyZWFkX2lkKSlcbiAgICApXG4gICAgaWYgKGZvdW5kPy5hcHByb3ZhbCkge1xuICAgICAgcmV0dXJuIHsgbWVzc2FnZTogZm91bmQsIHNlc3Npb25JZDogZm91bmQuYXBwcm92YWwuc2Vzc2lvbl9pZCB8fCBzZXNzaW9uSWQgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCB1c2VDaGF0TWFuYWdlciA9ICh7XG4gIGNoYXRJZDogaW5pdGlhbENoYXRJZCxcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBvbkVycm9yLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNYW5hZ2VyUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3Qge1xuICAgIHByb2plY3QsXG4gICAgc2V0UHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHRhc2ssXG4gICAgc2V0VGFzayxcbiAgICBhZ2VudCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgaXNBdXRvQXBwcm92ZUFjdGl2ZSxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IGV2ZW50ID0gdXNlRXZlbnQoKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBjdXJyZW50VXNlciB9ID0gdXNlU3RhYmxlQ2FsbGJhY2tzKGF1dGhVc2VyKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG5cbiAgY29uc3QgY3VycmVudE1lc3NhZ2VJZCA9IHVzZVJlZih1dWlkdjQoKSlcbiAgY29uc3QgY3VycmVudFVzZXJRdWVzdGlvbiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjdXJyZW50Q2hhdElkID0gdXNlUmVmKGluaXRpYWxDaGF0SWQgfHwgdXVpZHY0KCkpXG4gIGNvbnN0IHNldEFjdGl2ZUNoYXRJZCA9IHVzZUNoYXRzU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0QWN0aXZlQ2hhdElkKVxuICBjb25zdCByZXBvcnRlZEV2ZW50ID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdPihbXSlcbiAgLyoqXG4gICAqIEd1YXJkYSBpbmZvIGRlbCDDumx0aW1vIGFwcHJvdmFsIG1hbnVhbCAoY3VhbmRvIGVsIHVzdWFyaW8gdGlwZWEgXCJzaVwiL1wibm9cIiBlbiBsdWdhclxuICAgKiBkZSBjbGlja2VhciBlbCBib3TDs24pLiBFbiBtYW51YWwgYXBwcm92YWwsIGBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkYCByZXRvcm5hIGVhcmx5XG4gICAqIHNpbiBhZ3JlZ2FyIHVuIG1lbnNhamUgY29uIGBhcHByb3ZhbGAsIGFzw60gcXVlIGxhIGzDs2dpY2EgZGUgcmVmZXRjaCBlbiBgb25TdHJlYW1GaW5pc2hgXG4gICAqIG5vIGxvIGRldGVjdGEgdsOtYSBgcHJldmlvdXNNZXNzYWdlLmFwcHJvdmFsYC4gTG8gZ3VhcmRhbW9zIGFjw6EgcGFyYSBjb25zdW1pcmxvIGRlc3B1w6lzLlxuICAgKi9cbiAgY29uc3QgbGFzdE1hbnVhbEFwcHJvdmFsUmVmID0gdXNlUmVmPHtcbiAgICB0b29sTmFtZTogc3RyaW5nXG4gICAgdG9vbEFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICB9IHwgbnVsbD4obnVsbClcbiAgLyoqIEV2aXRhIGR1cGxpY2FyIEFJX0NIQVRfSElUTCAvIEFJX0NIQVRfSElUTF9PUFRJT04gZW4gcHJlYXByb2JhY2lvbmVzIChtYW51YWwgbyBhdXRvKSBwb3IgbG90ZS4gKi9cbiAgY29uc3QgdHJhY2tlZE1hbnVhbEhpdGxLZXlzUmVmID0gdXNlUmVmPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpXG4gIC8qKiBDb250ZXh0byBkZWwgbWVuc2FqZSBkZSBhcHJvYmFjacOzbiBwcmV2aW8gYWwgZWplY3V0YXIgY29udGludWUtdGhyZWFkLiAqL1xuICBjb25zdCBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiA9IHVzZVJlZjxIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGw+KG51bGwpXG4gIC8qKiBNZW5zYWplcyBhIHJlc3RhdXJhciBzaSBgcmV0cnlfY29tcGxldGlvbmAgZmFsbGEgYW50ZXMgZGUgcGVyc2lzdGlyIGVsIHJlZW1wbGF6by4gKi9cbiAgY29uc3QgcmV0cnlTbmFwc2hvdFJlZiA9IHVzZVJlZjxDaGF0TWVzc2FnZVtdIHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNQcm9jZXNzaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBmaXJzdFRpbWVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIC8qKiBJZCBkZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nIGFjdGl2byAoc2kgaGF5KS4gKi9cbiAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogQ2hhdCBhbCBxdWUgcGVydGVuZWNlIGVsIHN0cmVhbSBhY3R1YWxtZW50ZSBhY3Rpdm8uIFNpIGNhbWJpYSBlbCBjaGF0XG4gICAqIG1pZW50cmFzIHVuIHN0cmVhbSBlc3TDoSBlbiB2dWVsbywgZGVzY2FydGFtb3MgbG9zIHRva2VucyByZXNpZHVhbGVzXG4gICAqIHF1ZSBwdWVkYW4gbGxlZ2FyIGFudGVzIGRlIHF1ZSBlbCBhYm9ydCBzZSBjb21wbGV0ZS5cbiAgICovXG4gIGNvbnN0IGFjdGl2ZVN0cmVhbUNoYXRJZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBjbGVhclN0cmVhbVVpUmVmID0gdXNlUmVmPCgpID0+IHZvaWQ+KCgpID0+IHVuZGVmaW5lZClcbiAgY29uc3QgW2FjdGl2ZUxvYWRpbmdzLCBzZXRBY3RpdmVMb2FkaW5nc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSlcbiAgLyoqXG4gICAqIFNlc2nDs24gYWN0dWFsbWVudGUgdmlzaWJsZS4gU2UgbWFudGllbmUgZW4gc3RhdGUgKG5vIHNvbG8gZW4gcmVmKSBwYXJhIHF1ZVxuICAgKiBlbCBtb3RvciBkZSBzdHJlYW1pbmcgcHVlZGEgbGVlciByZWFjdGl2YW1lbnRlIGxvcyBmbGFncyBkZSBFU1RBIHNlc2nDs25cbiAgICogZGVzZGUgZWwgc3RvcmUsIG1pZW50cmFzIG90cmFzIHNpZ3VlbiBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZC5cbiAgICovXG4gIGNvbnN0IFthY3RpdmVTZXNzaW9uSWQsIHNldEFjdGl2ZVNlc3Npb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmc+KGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgLyoqIFRydWUgbWllbnRyYXMgZXN0YSBpbnN0YW5jaWEgZXN0w6kgbW9udGFkYSAoZXZpdGEgc2V0U3RhdGUgdHJhcyBkZXNtb250YXIpLiAqL1xuICBjb25zdCBpc01vdW50ZWRSZWYgPSB1c2VSZWYodHJ1ZSlcbiAgLyoqIEV2aXRhIHJlY29uY2lsaWFyIGRvcyB2ZWNlcyBlbCBtaXNtbyBlc3RhZG8gdGVybWluYWwgZGUgdW5hIHNlc2nDs24uICovXG4gIGNvbnN0IGxhc3RIYW5kbGVkVGVybWluYWxSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICBjb25zdCBpc1dlYlNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc1dlYlNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNEZWVwU2VhcmNoQWN0aXZlUmVmID0gdXNlUmVmKGlzRGVlcFNlYXJjaEFjdGl2ZSlcbiAgY29uc3QgaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZiA9IHVzZVJlZihpc0F1dG9BcHByb3ZlQWN0aXZlKVxuICAvKiogRXZpdGEgY2xvc3VyZXMgb2Jzb2xldGFzIGN1YW5kbyBlbCBmb290ZXIgY29uc2VydmEgc2VuZE1lc3NhZ2UgZW50cmUgcmVuZGVycy4gKi9cbiAgY29uc3QgY29udGV4dFJlZiA9IHVzZVJlZih7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH0pXG4gIGNvbnRleHRSZWYuY3VycmVudCA9IHsgY2hpcHNQcm9qZWN0LCBwcm9qZWN0LCBjbGllbnQsIHRhc2sgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCA9IGlzV2ViU2VhcmNoQWN0aXZlXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc0RlZXBTZWFyY2hBY3RpdmVcbiAgICBpc0F1dG9BcHByb3ZlQWN0aXZlUmVmLmN1cnJlbnQgPSBpc0F1dG9BcHByb3ZlQWN0aXZlXG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlLCBpc0F1dG9BcHByb3ZlQWN0aXZlXSlcblxuICBjb25zdCB7XG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIG1lc3NhZ2VzLFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgYWRkTWVzc2FnZSxcbiAgICByZW1vdmVNZXNzYWdlLFxuICAgIHJlcGxhY2VNZXNzYWdlcyxcbiAgICBoYW5kbGVTY3JvbGwsXG4gIH0gPSB1c2VDaGF0TWVzc2FnZXMoe1xuICAgIGNoYXRJZDogaW5pdGlhbENoYXRJZCB8fCBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudFVzZXIsXG4gICAgdXNlckluaXRpYWxNZXNzYWdlLFxuICAgIG9uRXJyb3IsXG4gICAgYWdlbnRzLFxuICB9KVxuXG4gIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1xuXG4gIC8qKlxuICAgKiBFc2NyaWJlIHVuIG1lbnNhamUgZW4gZWwgc3RvcmUgcG9yLXNlc2nDs24geSwgc2kgbGEgc2VzacOzbiBlcyBsYSBhY3RpdmEsXG4gICAqIHRhbWJpw6luIGVuIGxhIHZpc3RhIGxvY2FsLiBQZXJtaXRlIHF1ZSBzZXNpb25lcyBlbiBiYWNrZ3JvdW5kIGFjdW11bGVuIHN1XG4gICAqIHJlc3VsdGFkbyBzaW4gcGlzYXIgZWwgY2hhdCBxdWUgZWwgdXN1YXJpbyBlc3TDoSBtaXJhbmRvLlxuICAgKi9cbiAgY29uc3QgY29tbWl0VG9TZXNzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHNlc3Npb25JZDogc3RyaW5nLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmFkZE1lc3NhZ2Uoc2Vzc2lvbklkLCBtZXNzYWdlKVxuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmIGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBhZGRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfSxcbiAgICBbYWRkTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGRyb3BGcm9tU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzZXNzaW9uSWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5yZW1vdmVNZXNzYWdlKHNlc3Npb25JZCwgbWVzc2FnZUlkKVxuICAgICAgaWYgKGlzTW91bnRlZFJlZi5jdXJyZW50ICYmIGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICByZW1vdmVNZXNzYWdlKG1lc3NhZ2VJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtyZW1vdmVNZXNzYWdlXVxuICApXG5cbiAgLyoqIExpbXBpYSBlbCB0YWlsIGVuIHZ1ZWxvIGRlIHVuYSBzZXNpw7NuICh0cmFzIHRlcm1pbmFyOyBlbCBiYWNrZW5kIHBhc2EgYSBzZXIgZnVlbnRlKS4gKi9cbiAgY29uc3QgY2xlYXJTZXNzaW9uVGFpbCA9IHVzZUNhbGxiYWNrKChzZXNzaW9uSWQ6IHN0cmluZykgPT4ge1xuICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyhzZXNzaW9uSWQsIFtdKVxuICB9LCBbXSlcblxuICAvLyBSZWdpc3RyYXIgbGEgc2VzacOzbiB2aXNpYmxlIGVuIGVsIHRyYWNrZXIgZ2xvYmFsIHBhcmEgcXVlIGxvcyBjYWxsYmFja3MgZGVsXG4gIC8vIG1vdG9yIChxdWUgcHVlZGVuIHBlcnRlbmVjZXIgYSB1bmEgaW5zdGFuY2lhIHlhIGRlc21vbnRhZGEpIHNlcGFuIGN1w6FsIGVzIGxhXG4gIC8vIHNlc2nDs24gYWN0aXZhIGFjdHVhbC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhY3RpdmVWaWV3LnNldChhY3RpdmVTZXNzaW9uSWQpXG4gIH0sIFthY3RpdmVTZXNzaW9uSWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNNb3VudGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChhY3RpdmVWaWV3LmlzKGN1cnJlbnRDaGF0SWQuY3VycmVudCkpIHtcbiAgICAgICAgYWN0aXZlVmlldy5zZXQobnVsbClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIFJlY29uY2lsaWFjacOzbjogc2kgbGEgc2VzacOzbiBhY3RpdmEgdGVybWluYSAoY29tcGxldGUvZXJyb3IpIHBlcm8gZWwgc3RvcmVcbiAgLy8gcG9yLXNlc2nDs24gdG9kYXbDrWEgdGllbmUgdW4gcGxhY2Vob2xkZXIgZGUgc3RyZWFtaW5nLCByZWZyZXNjYW1vcyBkZXNkZVxuICAvLyBlbCBiYWNrZW5kLiBVc2Ftb3MgZWwgc3RvcmUgKG5vIG1lc3NhZ2VzUmVmKTogaGFuZGxlU3RyZWFtRmluaXNoIGxpbXBpYSBlbFxuICAvLyBwbGFjZWhvbGRlciBhaMOtIGRlIGZvcm1hIHPDrW5jcm9uYTsgbWVzc2FnZXNSZWYgcHVlZGUgcXVlZGFyIHN0YWxlIHVuIHJlbmRlclxuICAvLyBwb3JxdWUgc2V0U3RhdHVzIChadXN0YW5kKSB5IHJlbW92ZU1lc3NhZ2UgKFJlYWN0KSBubyBiYXRjaGFuIGp1bnRvcy5cbiAgLy8gYGNhbmNlbGxlZGAgcXVlZGEgYWZ1ZXJhOiBlbCBzdG9wIHlhIHJlY29uY2lsaWEgbG9jYWwgKHBhcmNpYWwgKyBidXJidWphIGRlXG4gIC8vIGNhbmNlbGFkbykgeSByZWNhcmdhciBhY8OhIG1vc3RyYWJhIGxhIHBhbnRhbGxhIGRlIGNhcmdhIGRlbCBjaGF0IGVudGVyby5cbiAgY29uc3QgYWN0aXZlU2Vzc2lvbk1ldGEgPSB1c2VTZXNzaW9uTWV0YShhY3RpdmVTZXNzaW9uSWQpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzID0gYWN0aXZlU2Vzc2lvbk1ldGE/LnN0YXR1c1xuICAgIGlmICghc3RhdHVzKSByZXR1cm5cbiAgICBjb25zdCBpc1Rlcm1pbmFsID0gc3RhdHVzID09PSAnY29tcGxldGUnIHx8IHN0YXR1cyA9PT0gJ2Vycm9yJ1xuICAgIGlmICghaXNUZXJtaW5hbCkgcmV0dXJuXG4gICAgY29uc3Qga2V5ID0gYCR7YWN0aXZlU2Vzc2lvbklkfToke3N0YXR1c306JHthY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCA/PyAnJ31gXG4gICAgaWYgKGxhc3RIYW5kbGVkVGVybWluYWxSZWYuY3VycmVudCA9PT0ga2V5KSByZXR1cm5cbiAgICBsYXN0SGFuZGxlZFRlcm1pbmFsUmVmLmN1cnJlbnQgPSBrZXlcblxuICAgIGNvbnN0IHRhaWwgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWVzc2FnZXMoYWN0aXZlU2Vzc2lvbklkKVxuICAgIGNvbnN0IGhhc1N0YWxlUGxhY2Vob2xkZXIgPSB0YWlsLnNvbWUobXNnID0+IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQobXNnLmlkKSlcbiAgICBpZiAoaGFzU3RhbGVQbGFjZWhvbGRlcikge1xuICAgICAgbG9hZE1lc3NhZ2VzKHsgZm9yY2U6IHRydWUgfSlcbiAgICB9XG4gIH0sIFthY3RpdmVTZXNzaW9uTWV0YT8uc3RhdHVzLCBhY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCwgYWN0aXZlU2Vzc2lvbklkLCBsb2FkTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtbG9hZGluZy1tZXNzYWdlcy1jaGFuZ2VkJywge1xuICAgICAgZGV0YWlsOiB7IGxvYWRpbmdNZXNzYWdlcyB9LFxuICAgIH0pXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgfSwgW2xvYWRpbmdNZXNzYWdlc10pXG5cbiAgY29uc3QgcHJldmlvdXNJbml0aWFsQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KGluaXRpYWxDaGF0SWQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0luaXRpYWxDaGF0SWQgPSBwcmV2aW91c0luaXRpYWxDaGF0SWRSZWYuY3VycmVudFxuICAgIHByZXZpb3VzSW5pdGlhbENoYXRJZFJlZi5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuXG4gICAgLy8gQ2hhdCBudWV2byAvIGhvbWU6IGluaXRpYWxDaGF0SWQgcGFzYSBhIG51bGwsIGFzw60gcXVlIGxhIHJhbWEgZGUgYWJham8gbm9cbiAgICAvLyBhcGxpY2EuIEhheSBxdWUgcm90YXIgYSB1bmEgc2VzacOzbiBudWV2YSBpZ3VhbDogc2kgc2VndWltb3MgYXB1bnRhbmRvIGEgbGFcbiAgICAvLyBhbnRlcmlvciwgYGFjdGl2ZVZpZXdgIGxhIHNpZ3VlIG1hcmNhbmRvIGNvbW8gYWN0aXZhIHkgY3VhbmRvIHRlcm1pbmEgbm8gc2VcbiAgICAvLyBub3RpZmljYSAoeSBzdSByZXNwdWVzdGEgc2UgY29tbWl0ZWEgc29icmUgbGEgdmlzdGEgbnVldmEpLiBFbCDDoXJib2wgbm9cbiAgICAvLyByZW1vbnRhIGVuIGVzdGUgZmx1am8gKG5vIGhheSBga2V5YCkgeSBuYWRpZSBjb25zdW1lIGByZXNldENoYXRgLlxuICAgIGlmICghaW5pdGlhbENoYXRJZCAmJiBwcmV2aW91c0luaXRpYWxDaGF0SWQpIHtcbiAgICAgIGN1cnJlbnRDaGF0SWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgICBzZXRBY3RpdmVTZXNzaW9uSWQoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpbml0aWFsQ2hhdElkICYmIGluaXRpYWxDaGF0SWQgIT09IGN1cnJlbnRDaGF0SWQuY3VycmVudCkge1xuICAgICAgLy8gTk8gYWJvcnRhbW9zIGVsIHN0cmVhbSBhbnRlcmlvcjogcHVlZGUgc2VndWlyIGdlbmVyYW5kbyBlbiBiYWNrZ3JvdW5kLlxuICAgICAgLy8gU29sbyBjYW1iaWFtb3MgZGUgc2VzacOzbiBhY3RpdmE7IGVsIG1vdG9yIHJ1dGVhIGNhZGEgc3RyZWFtIHBvciBzdVxuICAgICAgLy8gc2Vzc2lvbklkLCBhc8OtIHF1ZSBsb3MgdG9rZW5zIGRlIGxhIHNlc2nDs24gcHJldmlhIHNpZ3VlbiBhcGxpY8OhbmRvc2UgYVxuICAgICAgLy8gRVNBIHNlc2nDs24gKHN0b3JlKSwgbm8gYSBsYSBudWV2YS5cblxuICAgICAgLy8gTGltcGlhciBjb250ZXh0byBnbG9iYWwgYWwgY2FtYmlhciBkZSBjb252ZXJzYWNpw7NuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICBzZXRUYXNrKG51bGwpXG5cbiAgICAgIGN1cnJlbnRDaGF0SWQuY3VycmVudCA9IGluaXRpYWxDaGF0SWRcbiAgICAgIHNldEFjdGl2ZVNlc3Npb25JZChpbml0aWFsQ2hhdElkKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgICAvLyBpc1Byb2Nlc3NpbmdSZWYgcmVmbGVqYSBzaSBsYSBzZXNpw7NuIEFDVElWQSBlc3TDoSBvY3VwYWRhLiBTaSBsYSBzZXNpw7NuXG4gICAgICAvLyBhIGxhIHF1ZSBlbnRyYW1vcyBzaWd1ZSBnZW5lcmFuZG8gZW4gYmFja2dyb3VuZCwgcXVlZGEgYmxvcXVlYWRhOyBzaSBubyxcbiAgICAgIC8vIHNlIGhhYmlsaXRhIGVsIGVudsOtbyBhdW5xdWUgb3RyYXMgc2VzaW9uZXMgc2lnYW4gZ2VuZXJhbmRvLlxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShpbml0aWFsQ2hhdElkKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIC8vIGxvYWRNZXNzYWdlcyBsbyBkaXNwYXJhIHVzZUNoYXRNZXNzYWdlcyBhbCBjYW1iaWFyIGNoYXRJZCAoY29uIGNhY2hlIGVuIG1lbW9yaWEpLlxuICAgIH1cbiAgfSwgW2luaXRpYWxDaGF0SWQsIHByb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRUYXNrXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldEFjdGl2ZUNoYXRJZChpbml0aWFsQ2hhdElkIHx8IG51bGwpXG4gIH0sIFtpbml0aWFsQ2hhdElkLCBzZXRBY3RpdmVDaGF0SWRdKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUVycm9yID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgZXJyb3JNZXNzYWdlPzogc3RyaW5nLCBlcnJvclJhd01lc3NhZ2U/OiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcblxuICAgICAgY29uc3QgcmV0cnlTbmFwc2hvdCA9IHJldHJ5U25hcHNob3RSZWYuY3VycmVudFxuICAgICAgaWYgKHJldHJ5U25hcHNob3QpIHtcbiAgICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gcmV0cnlTbmFwc2hvdFxuICAgICAgICByZXBsYWNlTWVzc2FnZXMocmV0cnlTbmFwc2hvdClcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50KClcbiAgICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2Vycm9yJywgbWVzc2FnZTogdCgnY2hhdC5lcnJvcicpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGNsZWFyU3RyZWFtVWlSZWYuY3VycmVudCgpXG4gICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBY2Nlc3NEZW5pZWQgPSBlcnJvck1lc3NhZ2UgPT09IFwiQWNjZXNzIGRlbmllZDogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhpcyBhZ2VudFwiXG4gICAgICBjb25zdCBpc1Byb21wdFRvb0xvbmcgPVxuICAgICAgICBlcnJvck1lc3NhZ2UgPT09ICdpbnZhbGlkX3JlcXVlc3RfZXJyb3InICYmIGVycm9yUmF3TWVzc2FnZT8uaW5jbHVkZXMoJ3Byb21wdCBpcyB0b28gbG9uZycpXG4gICAgICBjb25zdCBtZXNzYWdlID0gaXNBY2Nlc3NEZW5pZWRcbiAgICAgICAgPyB0KCdjaGF0LmVycm9yQWNjZXNzRGVuaWVkJylcbiAgICAgICAgOiBpc1Byb21wdFRvb0xvbmdcbiAgICAgICAgICA/IHQoJ2NoYXQuZXJyb3JQcm9tcHRUb29Mb25nJywgeyB1c2VkOiBlcnJvclJhd01lc3NhZ2U/Lm1hdGNoKC8oXFxkKykgdG9rZW5zLyk/LlsxXSA/PyAnJyB9KVxuICAgICAgICAgIDogdCgnY2hhdC5lcnJvcicpXG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGBhbnN3ZXItJHttZXNzYWdlSWR9YCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgLy8gQ2hpcCBcIlJlaW50ZW50YXJcIiBzb2xvIGVuIGVsIGVycm9yIGdlbsOpcmljbyAocC4gZWouIDUwMCk7IG5vIGFwbGljYSBhIGFjY2VzcyBkZW5pZWQgbmkgcHJvbXB0IHRvbyBsb25nLlxuICAgICAgICAuLi4oIWlzQWNjZXNzRGVuaWVkICYmICFpc1Byb21wdFRvb0xvbmcgPyB7IHN1Z2dlc3Rpb25zOiBbdCgnY2hhdC5yZXRyeScpXSB9IDoge30pLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcblxuICAgICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5tYXJrQ2hhdEFzVW5yZWFkKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgcmVwbGFjZU1lc3NhZ2VzLCB0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtVXBkYXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG5cbiAgICAgIC8vIEFzZWd1cmFtb3MgZWwgcGxhY2Vob2xkZXIgdW5hIMO6bmljYSB2ZXogcG9yIHN0cmVhbSwgdGFudG8gZW4gZWwgc3RvcmVcbiAgICAgIC8vIGRlIGxhIHNlc2nDs24gY29tbyBlbiBsYSB2aXN0YSBzaSBlcyBsYSBhY3RpdmEuIEVsIHRleHRvIGVuIHZpdm8gdmlhamFcbiAgICAgIC8vIHBvciBzZXNzaW9uU3RyZWFtaW5nVGV4dCAoZXh0ZXJubyksIHNpbiByZS1yZW5kZXIgZGVsIMOhcmJvbCBjb21wbGV0by5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyRXhpc3RzID0gdXNlU2Vzc2lvbnNTdG9yZVxuICAgICAgICAuZ2V0U3RhdGUoKVxuICAgICAgICAuZ2V0TWVzc2FnZXMoc2Vzc2lvbklkKVxuICAgICAgICAuc29tZShtc2cgPT4gbXNnLmlkID09PSBwbGFjZWhvbGRlcklkKVxuXG4gICAgICBpZiAoIXBsYWNlaG9sZGVyRXhpc3RzKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBwbGFjZWhvbGRlcklkLFxuICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBwbGFjZWhvbGRlcklkXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICB9XG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnNldFRleHQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjb250ZW50KVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUZpbmlzaCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIGN0eDogU3RyZWFtQ29udGV4dCxcbiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgcmF3QXR0YWNobWVudHM/OiBhbnlbXSB8IG51bGwsXG4gICAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbCxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsLFxuICAgICAgLyoqIFBvc2ljaW9uYWw6IG1hc3RlciBubyBsbyBjb25zdW1lLCBwZXJvIGByZWFzb25pbmdgIHZpZW5lIGRlc3B1w6lzLiAqL1xuICAgICAgX3Jlc29sdmVkQ29udGV4dD86IGFueSxcbiAgICAgIHJlYXNvbmluZz86IFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG4gICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBwbGFjZWhvbGRlcklkXG4gICAgICAvLyBFbCBwbGFjZWhvbGRlciBzYWxlIGRlbCBzdG9yZSBwb3Itc2VzacOzbiB5YTogZWwgZWZlY3RvIGRlIHJlY29uY2lsaWFjacOzblxuICAgICAgLy8gbG8gdXNhIHBhcmEgZGV0ZWN0YXIgcmVzcHVlc3RhcyBodcOpcmZhbmFzIHkgZGUgYWPDoSBhbCBjb21taXQgcHVlZGUgaGFiZXJcbiAgICAgIC8vIHVuIGF3YWl0LiBMYSB2aXN0YSBsb2NhbCBsbyBzdWVsdGEgbcOhcyBhYmFqbywganVudG8gYWwgY29tbWl0LlxuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnJlbW92ZU1lc3NhZ2Uoc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyhyYXdBdHRhY2htZW50cylcblxuICAgICAgLy8gRWwgdHJhY2UgYWN1bXVsYWRvIGVuIHZpdm8gZXN0w6Ega2V5ZWQgcG9yIGVsIHBsYWNlaG9sZGVyOyBsbyBtb3ZlbW9zIGFsXG4gICAgICAvLyBpZCBkZWZpbml0aXZvIHBhcmEgcXVlIGVsIGJsb3F1ZSBkZSByYXpvbmFtaWVudG8gc29icmV2aXZhIGFsIHN3YXAuXG4gICAgICBjb25zdCBmaW5hbE1lc3NhZ2VJZCA9IGBhbnN3ZXItJHttZW1vcnlTZXNzaW9uSWR9YFxuICAgICAgLy8gUHJlZmVyaXIgZWwgc25hcHNob3QgZW4gdml2byAobmFycmFjacOzbiBhbmNsYWRhIGFsIGluaWNpbykgc29icmUgZWxcbiAgICAgIC8vIGBjb21wbGV0ZWAgZGVsIGJhY2ssIHF1ZSBzdWVsZSBtYW5kYXIgZXNhIG5hcnJhY2nDs24gYWwgZmluYWwuXG4gICAgICBjb25zdCBjb21wYWN0aW9uID0gY29tcGFjdGlvbkZvcih0ZW1wTWVzc2FnZUlkLCByZWFzb25pbmcpXG4gICAgICBjb25zdCBmaW5hbFRyYWNlID0gcmVhc29uaW5nVHJhY2VGb3IodGVtcE1lc3NhZ2VJZCkgPz8gbWFwUmVhc29uaW5nVHJhY2UocmVhc29uaW5nKVxuICAgICAgcmVhc29uaW5nU3RvcmUucmVuYW1lKHRlbXBNZXNzYWdlSWQsIGZpbmFsTWVzc2FnZUlkKVxuXG4gICAgICAvLyBTZXNpw7NuIGVuIGJhY2tncm91bmQ6IGNlcnJhbW9zIGxlYW4uIEVsIGJhY2tlbmQgeWEgcGVyc2lzdGnDsyBsYVxuICAgICAgLy8gcmVzcHVlc3RhLCBhc8OtIHF1ZSBhbCB2b2x2ZXIgYSBsYSBzZXNpw7NuIHNlIGNhcmdhIGRlc2RlIGFow60uIEF2aXNhbW9zXG4gICAgICAvLyBxdWUgdGVybWluw7MgKHVucmVhZCArIGV2ZW50byBwYXJhIHRvYXN0L3NvbmlkbykuXG4gICAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgICBpZDogZmluYWxNZXNzYWdlSWQsXG4gICAgICAgICAgbWVzc2FnZTogY29udGVudCxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICAuLi4oYXR0YWNobWVudHMubGVuZ3RoID4gMCA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICBtZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zIHx8IFtdLFxuICAgICAgICAgIHJlYXNvbmluZzogZmluYWxUcmFjZSxcbiAgICAgICAgICBjb21wYWN0aW9uLFxuICAgICAgICB9KVxuICAgICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkubWFya0NoYXRBc1VucmVhZChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdjb21wbGV0ZScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIC8vIERldGVjdGFyIHRvZGFzIGxhcyBVUkxzIGRlIHRhcmVhcyAoLi4uL3Rhc2tzLzEyMy9kZXRhaWx8bWVzc2FnZXxtZXNzYWdlc3xmaWxlc3xoaXN0b3J5fGhvdXJzKVxuICAgICAgY29uc3QgdGFza1VybFJlZ2V4ID0gbmV3IFJlZ0V4cChUQVNLX1VSTF9SRUdFWF9QQVRURVJOLCAnZycpXG4gICAgICBjb25zdCBtYXRjaGVzID0gWy4uLmNvbnRlbnQubWF0Y2hBbGwodGFza1VybFJlZ2V4KV1cblxuICAgICAgbGV0IGNvbnRlbnRUb0FkZCA9IGNvbnRlbnRcbiAgICAgIGNvbnN0IHByZXZpb3VzTWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG0gPT4gbS5pZCAhPT0gdGVtcE1lc3NhZ2VJZCkuYXQoLTEpXG4gICAgICBjb25zdCBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbCAhPSBudWxsXG4gICAgICBjb25zdCBUQVNLX0NSRUFUSU9OX1RPT0xTID0gWydjcmVhdGVfdGFzaycsICdjcmVhdGVfdGFza3NfYmF0Y2gnLCAnY2xvbmVfdGFzayddXG4gICAgICBjb25zdCBUQVNLX0VESVRfVE9PTFMgPSBbXG4gICAgICAgICdlZGl0X3Rhc2snLFxuICAgICAgICAnZWRpdF90YXNrc19iYXRjaCcsXG4gICAgICAgICd0YXNrX2Fzc2lnbicsXG4gICAgICAgICd0YXNrX3VuYXNzaWduJyxcbiAgICAgICAgJ3VwZGF0ZV90YXNrX3R5cGUnLFxuICAgICAgICAndXBkYXRlX2VzdGltYXRlZF9ob3VycycsXG4gICAgICAgICdhc3NpZ25fdGFza19sYWJlbCcsXG4gICAgICBdXG4gICAgICBjb25zdCBUQVNLX0RFTEVURV9UT09MUyA9IFsnZGVsZXRlX3Rhc2snLCAnZGVsZXRlX3Rhc2tzX2JhdGNoJ11cbiAgICAgIGNvbnN0IHBlbmRpbmdBY3Rpb25zID0gcHJldmlvdXNNZXNzYWdlPy5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zIHx8IFtdXG4gICAgICBjb25zdCB3YXNUYXNrQ3JlYXRpb24gPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0NSRUFUSU9OX1RPT0xTLmluY2x1ZGVzKGFjdGlvbi50b29sX25hbWUpKVxuICAgICAgY29uc3Qgd2FzVGFza0VkaXQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBUQVNLX0VESVRfVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNUYXNrRGVsZXRlID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwZW5kaW5nQWN0aW9ucy5zb21lKChhY3Rpb246IGFueSkgPT4gVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMoYWN0aW9uLnRvb2xfbmFtZSkpXG4gICAgICBjb25zdCB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiBhY3Rpb24udG9vbF9uYW1lID09PSAnY3JlYXRlX2FnZW50JylcbiAgICAgIGNvbnN0IHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgcGVuZGluZ0FjdGlvbnMuc29tZSgoYWN0aW9uOiBhbnkpID0+IChhY3Rpb24udG9vbF9uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpXG4gICAgICBsZXQgY3JlYXRlQWdlbnRGb2xsb3dVcDogeyBhZ2VudElkOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgJiYgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpKSB7XG4gICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAgPSB7IGFnZW50SWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHdhc0NvbmZpZ3VyZUFnZW50QWNjZXNzQXBwcm92ZWQgJiZcbiAgICAgICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgJiZcbiAgICAgICAgKGNvbXBsZXRlZEFnZW50SWQ/LnRyaW0oKSB8fFxuICAgICAgICAgIGV4dHJhY3RBZ2VudElkRnJvbVBlbmRpbmdBY3Rpb25zQnlUb29sTmFtZShwZW5kaW5nQWN0aW9ucywgJ2NvbmZpZ3VyZV9hZ2VudF9hY2Nlc3MnKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBjb25maWd1cmVkQWdlbnRJZCA9XG4gICAgICAgICAgY29tcGxldGVkQWdlbnRJZD8udHJpbSgpIHx8XG4gICAgICAgICAgZXh0cmFjdEFnZW50SWRGcm9tUGVuZGluZ0FjdGlvbnNCeVRvb2xOYW1lKHBlbmRpbmdBY3Rpb25zLCAnY29uZmlndXJlX2FnZW50X2FjY2VzcycpXG4gICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAgPSB7XG4gICAgICAgICAgYWdlbnRJZDogY29uZmlndXJlZEFnZW50SWQgYXMgc3RyaW5nLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh3YXNDcmVhdGVBZ2VudEFwcHJvdmVkKSB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5haUNoYXRIaXRsT3B0aW9uLCB7XG4gICAgICAgICAgYWdlbnRfdHlwZTogZ2V0SGl0bEFuYWx5dGljc0FnZW50VHlwZShhZ2VudCksXG4gICAgICAgICAgYWN0aW9uX3R5cGU6IGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0KHBlbmRpbmdBY3Rpb25zKSxcbiAgICAgICAgICBkZWNpc2lvbjogJ2FjY2VwdCcsXG4gICAgICAgICAgb3B0aW9uOiAnY3JlYXRlX2FnZW50JyxcbiAgICAgICAgICAuLi4oY29tcGxldGVkQWdlbnRJZD8udHJpbSgpID8geyBjcmVhdGVkX2FnZW50X2lkOiBjb21wbGV0ZWRBZ2VudElkLnRyaW0oKSB9IDoge30pLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbEZvckFuYWx5dGljcyA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBjb25zdCB3YXNNYW51YWxDcmVhdGVBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgbWFudWFsQXBwcm92YWxGb3JBbmFseXRpY3MgJiYgbm9ybWFsaXplSGl0bFRvb2xOYW1lKG1hbnVhbEFwcHJvdmFsRm9yQW5hbHl0aWNzLnRvb2xOYW1lKSA9PT0gJ2NyZWF0ZV9hZ2VudCdcblxuICAgICAgaWYgKHdhc01hbnVhbENyZWF0ZUFnZW50QXBwcm92ZWQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdEhpdGxPcHRpb24sIHtcbiAgICAgICAgICBhZ2VudF90eXBlOiBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlKGFnZW50KSxcbiAgICAgICAgICBhY3Rpb25fdHlwZTogJ2NyZWF0ZV9hZ2VudCcsXG4gICAgICAgICAgZGVjaXNpb246ICdhY2NlcHQnLFxuICAgICAgICAgIHJlc29sdXRpb25fc291cmNlOiAnbWFudWFsJyxcbiAgICAgICAgICBvcHRpb246ICdjcmVhdGVfYWdlbnQnLFxuICAgICAgICAgIC4uLihjb21wbGV0ZWRBZ2VudElkPy50cmltKCkgPyB7IGNyZWF0ZWRfYWdlbnRfaWQ6IGNvbXBsZXRlZEFnZW50SWQudHJpbSgpIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdhc0VkaXRBZ2VudEFwcHJvdmVkID1cbiAgICAgICAgaGFzQXBwcm92YWxJblByZXZpb3VzTWVzc2FnZSAmJlxuICAgICAgICBwcmV2aW91c01lc3NhZ2U/LmFwcHJvdmFsU3RhdHVzID09PSAnYXBwcm92ZWQnICYmXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLnNvbWUoKGFjdGlvbjogYW55KSA9PiAoYWN0aW9uLnRvb2xfbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2VkaXRfYWdlbnQnKVxuXG4gICAgICBsZXQgZWRpdEFnZW50Rm9sbG93VXA6IHsgYWdlbnRJZDogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgICAgIGlmICh3YXNFZGl0QWdlbnRBcHByb3ZlZCkge1xuICAgICAgICBjb25zdCBmcm9tU3RyZWFtID0gY29tcGxldGVkQWdlbnRJZD8udHJpbSgpXG4gICAgICAgIGNvbnN0IGZyb21BcmdzID0gZXh0cmFjdEFnZW50SWRGcm9tRWRpdEFnZW50UGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICAgIGNvbnN0IHJlc29sdmVkQWdlbnRJZCA9IGZyb21TdHJlYW0gfHwgZnJvbUFyZ3NcbiAgICAgICAgaWYgKHJlc29sdmVkQWdlbnRJZCkge1xuICAgICAgICAgIGVkaXRBZ2VudEZvbGxvd1VwID0geyBhZ2VudElkOiByZXNvbHZlZEFnZW50SWQgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhc2tJZHNGcm9tVXJscyA9IG1hdGNoZXMubWFwKG1hdGNoID0+IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsID0gZXh0cmFjdFRhc2tJZHNGcm9tRGVsZXRlUGVuZGluZ0FjdGlvbnMocGVuZGluZ0FjdGlvbnMpXG4gICAgICBjb25zdCB0YXNrSWRzRnJvbURlbGV0aW9uVGV4dCA9XG4gICAgICAgIHdhc1Rhc2tEZWxldGUgJiYgdGFza0lkc0Zyb21VcmxzLmxlbmd0aCA9PT0gMCAmJiB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsLmxlbmd0aCA9PT0gMFxuICAgICAgICAgID8gZXh0cmFjdFRhc2tJZHNGcm9tQXNzaXN0YW50RGVsZXRpb25UZXh0KGNvbnRlbnQpXG4gICAgICAgICAgOiBbXVxuICAgICAgY29uc3QgdGFza0lkc0ZvckRhc2hib2FyZCA9XG4gICAgICAgIHRhc2tJZHNGcm9tVXJscy5sZW5ndGggPiAwXG4gICAgICAgICAgPyB0YXNrSWRzRnJvbVVybHNcbiAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRlQXBwcm92YWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0YXNrSWRzRnJvbURlbGV0ZUFwcHJvdmFsXG4gICAgICAgICAgICA6IHRhc2tJZHNGcm9tRGVsZXRpb25UZXh0XG5cbiAgICAgIGNvbnN0IHNob3VsZFN5bmNEYXNoYm9hcmQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgICh3YXNUYXNrQ3JlYXRpb24gfHwgd2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSkgJiZcbiAgICAgICAgdGFza0lkc0ZvckRhc2hib2FyZC5sZW5ndGggPiAwXG5cbiAgICAgIGlmIChzaG91bGRTeW5jRGFzaGJvYXJkKSB7XG4gICAgICAgIGNvbnN0IHRhc2tJZHMgPSB0YXNrSWRzRm9yRGFzaGJvYXJkXG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCh0YXNrSWRzWzBdKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBjb250ZW50VG9BZGQgPSBjb250ZW50LnJlcGxhY2UodGFza1VybFJlZ2V4LCB1cmwgPT5cbiAgICAgICAgICAgIHVybC5yZXBsYWNlKC9cXC8oZGV0YWlsfG1lc3NhZ2V8bWVzc2FnZXN8ZmlsZXN8aGlzdG9yeXxob3VycykoPz0kfFxcPykvLCB0YWJTZWdtZW50KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQcm9qZWN0TWVzc2FnZSA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcbiAgICAgICAgY29uc3QgY29udGV4dFByb2plY3RJZFJhdyA9IHByb2plY3Q/LmlkIHx8IGxhc3RQcm9qZWN0TWVzc2FnZT8ucHJvamVjdElkXG4gICAgICAgIGNvbnN0IGNvbnRleHRQcm9qZWN0SWQgPSBjb250ZXh0UHJvamVjdElkUmF3ID8gcGFyc2VJbnQoU3RyaW5nKGNvbnRleHRQcm9qZWN0SWRSYXcpLCAxMCkgOiBudWxsXG4gICAgICAgIGNvbnN0IHBhdGhNYXRjaCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvXlxcL3Byb2plY3RzXFwvKFxcZCspXFwvLylcbiAgICAgICAgY29uc3Qgcm91dGVQcm9qZWN0SWQgPSBwYXRoTWF0Y2ggPyBwYXJzZUludChwYXRoTWF0Y2hbMV0sIDEwKSA6IG51bGxcbiAgICAgICAgY29uc3QgaXNPblByb2plY3RSb3V0ZSA9IGNvbnRleHRQcm9qZWN0SWQgJiYgcm91dGVQcm9qZWN0SWQgJiYgY29udGV4dFByb2plY3RJZCA9PT0gcm91dGVQcm9qZWN0SWRcblxuICAgICAgICBpZiAoaXNPblByb2plY3RSb3V0ZSkge1xuICAgICAgICAgIGlmICh3YXNUYXNrQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIHdpbmRvdy5uZXdQcm9qZWN0RGFzaGJvYXJkPy5hZGRFeGlzdGluZ1Rhc2tUb0Rhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRWRpdCkge1xuICAgICAgICAgICAgd2luZG93Lm5ld1Byb2plY3REYXNoYm9hcmQ/LmVkaXRFeGlzdGluZ1Rhc2tJbkRhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfSBlbHNlIGlmICh3YXNUYXNrRGVsZXRlKSB7XG4gICAgICAgICAgICB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZD8uZGVsZXRlRXhpc3RpbmdUYXNrRnJvbURhc2hib2FyZD8uKHRhc2tJZHMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZmV0Y2ggZGVsIHRhc2sgcGFuZWwgc2kgZXN0w6EgYWJpZXJ0byB5IGxhIHRvb2wgYXByb2JhZGEgZWRpdMOzL2JvcnLDsyBlc2EgdGFyZWEuXG4gICAgICAvLyBDdWJyZSBsb3MgZG9zIGZsdWpvcyBkZSBhcHByb3ZhbDpcbiAgICAgIC8vICAgMSkgQXBwcm92YWwgcG9yIGJvdMOzbiDihpIgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnNgICh2w61hIGhhc0FwcHJvdmFsSW5QcmV2aW91c01lc3NhZ2UpXG4gICAgICAvLyAgIDIpIE1hbnVhbCBhcHByb3ZhbCAodXN1YXJpbyB0aXBlYSBcInNpXCIvXCJub1wiKSDihpIgYGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50YFxuICAgICAgY29uc3Qgb3BlblRhc2tQYW5lbElkID0gd2luZG93LnRhc2tQYW5lbD8udGFza0lkXG4gICAgICBjb25zdCBtYW51YWxBcHByb3ZhbCA9IGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50XG4gICAgICBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudCA9IG51bGwgLy8gY29uc3VtaXIgdW5hIHNvbGEgdmV6XG4gICAgICBjb25zdCBtYW51YWxXYXNUYXNrRWRpdCA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19FRElUX1RPT0xTLmluY2x1ZGVzKG1hbnVhbEFwcHJvdmFsLnRvb2xOYW1lKVxuICAgICAgY29uc3QgbWFudWFsV2FzVGFza0RlbGV0ZSA9ICEhbWFudWFsQXBwcm92YWwgJiYgVEFTS19ERUxFVEVfVE9PTFMuaW5jbHVkZXMobWFudWFsQXBwcm92YWwudG9vbE5hbWUpXG5cbiAgICAgIC8vIFN5bmMgUGxhbm5lcjogYXZpc2FyIGNhcmdhIGRlIGhvcmFzIGNvbmZpcm1hZGEgKGNyZWF0ZV9ob3VyIC8gY3JlYXRlX2hvdXJzKS5cbiAgICAgIGNvbnN0IGhvdXJzVG9vbHNGcm9tQXBwcm92YWwgPSBwZW5kaW5nQWN0aW9uc1xuICAgICAgICAubWFwKChhY3Rpb246IFBlbmRpbmdBY3Rpb24pID0+IGFjdGlvbi50b29sX25hbWUpXG4gICAgICAgIC5maWx0ZXIoKHRvb2xOYW1lKTogdG9vbE5hbWUgaXMgc3RyaW5nID0+IGlzSG91cnNDaGFyZ2VUb29sKHRvb2xOYW1lKSlcbiAgICAgIGNvbnN0IHdhc0hvdXJzQ2hhcmdlQXBwcm92ZWQgPVxuICAgICAgICBoYXNBcHByb3ZhbEluUHJldmlvdXNNZXNzYWdlICYmXG4gICAgICAgIHByZXZpb3VzTWVzc2FnZT8uYXBwcm92YWxTdGF0dXMgPT09ICdhcHByb3ZlZCcgJiZcbiAgICAgICAgaG91cnNUb29sc0Zyb21BcHByb3ZhbC5sZW5ndGggPiAwXG4gICAgICBjb25zdCBtYW51YWxIb3Vyc1Rvb2wgPSBtYW51YWxBcHByb3ZhbD8udG9vbE5hbWVcbiAgICAgIGNvbnN0IHdhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQgPSBpc0hvdXJzQ2hhcmdlVG9vbChtYW51YWxIb3Vyc1Rvb2wpXG5cbiAgICAgIGlmICh3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkIHx8IHdhc0hvdXJzQ2hhcmdlTWFudWFsQXBwcm92ZWQpIHtcbiAgICAgICAgY29uc3QgdG9vbHMgPSB3YXNIb3Vyc0NoYXJnZUFwcHJvdmVkID8gaG91cnNUb29sc0Zyb21BcHByb3ZhbCA6IG1hbnVhbEhvdXJzVG9vbCA/IFttYW51YWxIb3Vyc1Rvb2xdIDogW11cbiAgICAgICAgZGlzcGF0Y2hNYWlhSG91cnNDaGFyZ2VkKHtcbiAgICAgICAgICBzb3VyY2U6ICdtYWlhJyxcbiAgICAgICAgICB0b29scyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKG9wZW5UYXNrUGFuZWxJZCAmJiAod2FzVGFza0VkaXQgfHwgd2FzVGFza0RlbGV0ZSB8fCBtYW51YWxXYXNUYXNrRWRpdCB8fCBtYW51YWxXYXNUYXNrRGVsZXRlKSkge1xuICAgICAgICBjb25zdCBtYW51YWxQc2V1ZG9BY3Rpb246IFBlbmRpbmdBY3Rpb24gfCBudWxsID0gbWFudWFsQXBwcm92YWxcbiAgICAgICAgICA/ICh7IHRvb2xfbmFtZTogbWFudWFsQXBwcm92YWwudG9vbE5hbWUsIHRvb2xfYXJnczogbWFudWFsQXBwcm92YWwudG9vbEFyZ3MgPz8ge30gfSBhcyBQZW5kaW5nQWN0aW9uKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBjb25zdCBhZmZlY3RlZFRhc2tJZHMgPSBbXG4gICAgICAgICAgLi4uZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKHBlbmRpbmdBY3Rpb25zKSxcbiAgICAgICAgICAuLi50YXNrSWRzRnJvbVVybHMsXG4gICAgICAgICAgLi4udGFza0lkc0Zyb21EZWxldGVBcHByb3ZhbCxcbiAgICAgICAgICAuLi4obWFudWFsUHNldWRvQWN0aW9uID8gZXh0cmFjdFRhc2tJZHNGcm9tUGVuZGluZ0FjdGlvbnNBcmdzKFttYW51YWxQc2V1ZG9BY3Rpb25dKSA6IFtdKSxcbiAgICAgICAgXS5tYXAoU3RyaW5nKVxuICAgICAgICBpZiAoYWZmZWN0ZWRUYXNrSWRzLmluY2x1ZGVzKFN0cmluZyhvcGVuVGFza1BhbmVsSWQpKSkge1xuICAgICAgICAgIHdpbmRvdy50YXNrUGFuZWw/LnJlZmV0Y2hUYXNrPy4oKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN3YXAgcGxhY2Vob2xkZXIg4oaSIG1lbnNhamUgZmluYWwuIFZhIGVuIGBmbHVzaFN5bmNgIHBvcnF1ZSBlbCBtb3RvciB5YVxuICAgICAgLy8gZGVqw7MgZW5jb2xhZGFzIGxhcyBlc2NyaXR1cmFzIGRlIGZpbiBkZSBzdHJlYW0gKGlzV3JpdGluZywgYWN0aXZpdHksXG4gICAgICAvLyBzdGF0dXMpLCB5IGVzYXMgdmlhamFuIGVuIFN5bmNMYW5lIHBvciBzZXIgZGUgdW4gc3RvcmUgZXh0ZXJubyBtaWVudHJhc1xuICAgICAgLy8gcXVlIGVzdG9zIHNldFN0YXRlIHZpYWphbiBlbiBEZWZhdWx0TGFuZS4gU2luIGZvcnphcmxvLCBSZWFjdCBwaW50YVxuICAgICAgLy8gcHJpbWVybyBlbCBwbGFjZWhvbGRlciB5YSBzaW4gaW5kaWNhZG9yIGRlIGFjdGl2aWRhZCAodHVybm8gNDFweCBtw6FzXG4gICAgICAvLyBiYWpvKSB5IHJlY2nDqW4gfjI1bXMgZGVzcHXDqXMgZWwgbWVuc2FqZSBkZWZpbml0aXZvOiBlc2Ugc2FsdG8gZGUgaWRhIHlcbiAgICAgIC8vIHZ1ZWx0YSBlcmEgZWwgZmxpY2tlciBkZSBmaW4gZGUgc3RyZWFtLiBDb24gZWwgZmx1c2gsIHRvZG8gZWwgZmluIGRlXG4gICAgICAvLyBzdHJlYW0gZW50cmEgZW4gdW4gw7puaWNvIGNvbW1pdC5cbiAgICAgIGZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgIGRyb3BGcm9tU2Vzc2lvbihzZXNzaW9uSWQsIHRlbXBNZXNzYWdlSWQpXG4gICAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgICBpZDogZmluYWxNZXNzYWdlSWQsXG4gICAgICAgICAgbWVzc2FnZTogY29udGVudFRvQWRkLFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICBzb3VyY2VzLFxuICAgICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgICBzdWdnZXN0aW9uczogc3VnZ2VzdGlvbnMgfHwgW10sXG4gICAgICAgICAgLi4uKGNyZWF0ZUFnZW50Rm9sbG93VXAgPyB7IGNyZWF0ZUFnZW50Rm9sbG93VXAgfSA6IHt9KSxcbiAgICAgICAgICByZWFzb25pbmc6IGZpbmFsVHJhY2UsXG4gICAgICAgICAgY29tcGFjdGlvbixcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcblxuICAgICAgaWYgKGNyZWF0ZUFnZW50Rm9sbG93VXA/LmFnZW50SWQpIHtcbiAgICAgICAgZmV0Y2hBZ2VudERldGFpbChjcmVhdGVBZ2VudEZvbGxvd1VwLmFnZW50SWQpXG4gICAgICAgICAgLnRoZW4oY2hhdEFnZW50ID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gYcOxYWRpciBlbCBhZ2VudGUgcmVjacOpbiBjcmVhZG8gYWwgbGlzdGFkbycsIGVycilcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAoZWRpdEFnZW50Rm9sbG93VXA/LmFnZW50SWQpIHtcbiAgICAgICAgZmV0Y2hBZ2VudERldGFpbChlZGl0QWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywge1xuICAgICAgICAgICAgICAgIGRldGFpbDogeyBhZ2VudDogY2hhdEFnZW50IH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t1c2VDaGF0TWFuYWdlcl0gTm8gc2UgcHVkbyByZWZyZXNjYXIgZWwgYWdlbnRlIGVkaXRhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuXG4gICAgICBjb25zdCB7IGlzQ2hhdFZpZXdWaXNpYmxlLCBtYXJrQ2hhdEFzUmVhZCB9ID0gZ2V0Q2hhdHNTdG9yZVN0YXRlKClcbiAgICAgIGlmIChpc0FjdGl2ZSAmJiBpc0NoYXRWaWV3VmlzaWJsZSkge1xuICAgICAgICBhd2FpdCBtYXJrQ2hhdEFzUmVhZChzZXNzaW9uSWQsIHsgZm9yY2U6IHRydWUgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdyZWZldGNoLXNlc3Npb24nKVxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KVxuICAgICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGNsZWFyU2Vzc2lvblRhaWwsIHByb2plY3QsIGdldFRhYlRhc2tEZWZhdWx0LCBldmVudCwgYWdlbnRdXG4gIClcblxuICAvLyBgcGFydGlhbFRleHRgIGxvIHJlc2NhdGEgYHN0b3BTdHJlYW1gIGFudGVzIGRlIGxpbXBpYXIgZWwgc3RvcmUgZXh0ZXJubzogZWwgdGV4dG8gZW4gdml2b1xuICAvLyBubyB2aXZlIGVuIGBtZXNzYWdlc2AsIGFzw60gcXVlIHNpbiBlc3RvIGxhIHJlc3B1ZXN0YSBhIG1lZGlhcyBkZXNhcGFyZWNlIGRlIHBhbnRhbGxhIGF1bnF1ZVxuICAvLyBlbCBiYWNrZW5kIHPDrSBsYSBoYXlhIHBlcnNpc3RpZG8uXG4gIGNvbnN0IGhhbmRsZVN0cmVhbVN0b3AgPSB1c2VDYWxsYmFjayhcbiAgICAocGFydGlhbFRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgLy8gRWwgc3RvcCBzaWVtcHJlIGFwbGljYSBhIGxhIHNlc2nDs24gYWN0aXZhIChib3TDs24gZGVsIGlucHV0IHZpc2libGUpLlxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudClcbiAgICAgIGNvbnN0IGZpbmFsTWVzc2FnZUlkID0gYGFuc3dlci0ke2N1cnJlbnRNZXNzYWdlSWQuY3VycmVudH1gXG4gICAgICBjb25zdCBzdG9wcGVkVHJhY2UgPSByZWFzb25pbmdUcmFjZUZvcih0ZW1wTWVzc2FnZUlkKVxuICAgICAgY29uc3QgY29tcGFjdGlvbiA9IGNvbXBhY3Rpb25Gb3IodGVtcE1lc3NhZ2VJZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuXG4gICAgICBpZiAoc3RvcHBlZFRyYWNlPy5zdGVwcy5sZW5ndGggfHwgY29tcGFjdGlvbikge1xuICAgICAgICByZWFzb25pbmdTdG9yZS5maW5pc2godGVtcE1lc3NhZ2VJZCwgbnVsbClcbiAgICAgICAgcmVhc29uaW5nU3RvcmUucmVuYW1lKHRlbXBNZXNzYWdlSWQsIGZpbmFsTWVzc2FnZUlkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVhc29uaW5nU3RvcmUucmVtb3ZlKHRlbXBNZXNzYWdlSWQpXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJ0aWFsVGV4dCkge1xuICAgICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgICAgaWQ6IGZpbmFsTWVzc2FnZUlkLFxuICAgICAgICAgIG1lc3NhZ2U6IHBhcnRpYWxUZXh0LFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICAuLi4oc3RvcHBlZFRyYWNlID8geyByZWFzb25pbmc6IHN0b3BwZWRUcmFjZSB9IDoge30pLFxuICAgICAgICAgIGNvbXBhY3Rpb24sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGAke2ZpbmFsTWVzc2FnZUlkfS1jYW5jZWxsZWRgLFxuICAgICAgICBtZXNzYWdlOiB0KCdjaGF0LmNhbmNlbGxlZCcpLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHJ5U25hcHNob3RSZWYuY3VycmVudCA9IG51bGxcbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgdF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQgPSB1c2VDYWxsYmFjayhcbiAgICAoY3R4OiBTdHJlYW1Db250ZXh0LCBhcHByb3ZhbDogQXBwcm92YWxSZXF1ZXN0LCBhY2N1bXVsYXRlZENvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIHBsYWNlaG9sZGVySWQgfSA9IGN0eFxuICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcblxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcblxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGl0bENvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICBtZXNzYWdlSWQ6IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gLFxuICAgICAgICBtZXNzYWdlVGV4dDogYWNjdW11bGF0ZWRDb250ZW50IHx8ICcnLFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgcGVuZGluZ0FjdGlvbnM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyxcbiAgICAgICAgdGhyZWFkSWRzOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnM/Lm1hcChhY3Rpb24gPT4gYWN0aW9uLnRocmVhZF9pZCksXG4gICAgICB9XG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IGhpdGxDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIC8vIFByZWFwcm9iYWRvOiBwb3IgZGV0ZWNjacOzbiBtYW51YWwgbyBwb3IgYXV0by1hcHByb3ZlLiBFbiBhbWJvcyBjYXNvcyBlbFxuICAgICAgLy8gc3RyZWFtIGNvbnRpbsO6YSB5IG5vIGhheSBxdWUgcGludGFyIGxhIGNhamEgZGUgYXByb2JhY2nDs24uXG4gICAgICBpZiAoYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIHx8IGFwcHJvdmFsLmF1dG9fYXBwcm92ZWQgfHwgYXBwcm92YWwuYXBwcm92YWxfc3RhdHVzID09PSAnYXBwcm92ZWQnKSB7XG4gICAgICAgIHRyYWNrTWFudWFsSGl0bEV2ZW50cyhcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICB7IGltcHJlc3Npb246IEVWRU5UUy5haUNoYXRIaXRsLCBvcHRpb246IEVWRU5UUy5haUNoYXRIaXRsT3B0aW9uIH0sXG4gICAgICAgICAgYWdlbnQsXG4gICAgICAgICAgYXBwcm92YWwsXG4gICAgICAgICAgdHJhY2tlZE1hbnVhbEhpdGxLZXlzUmVmLmN1cnJlbnQsXG4gICAgICAgICAgYXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkID8gJ21hbnVhbCcgOiAnYXV0bydcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IGZpcnN0QWN0aW9uID0gYXBwcm92YWwucGVuZGluZ19hY3Rpb25zPy5bMF1cbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSAoYXBwcm92YWwgYXMgeyB0b29sX25hbWU/OiBzdHJpbmcgfSkudG9vbF9uYW1lID8/IGZpcnN0QWN0aW9uPy50b29sX25hbWUgPz8gJydcbiAgICAgICAgY29uc3QgdG9vbEFyZ3MgPVxuICAgICAgICAgICgoYXBwcm92YWwgYXMgeyB0b29sX2FyZ3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS50b29sX2FyZ3MgPz9cbiAgICAgICAgICAgIChmaXJzdEFjdGlvbj8udG9vbF9hcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICBudWxsXG4gICAgICAgIGlmICh0b29sTmFtZSAmJiBpc0FjdGl2ZSkge1xuICAgICAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0geyB0b29sTmFtZSwgdG9vbEFyZ3MgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGEgbWVzc2FnZSB3aXRoIHRoZSBhcHByb3ZhbCByZXF1ZXN0XG4gICAgICBjb25zdCBhcHByb3ZhbE1lc3NhZ2VJZCA9IGBhcHByb3ZhbC0ke2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1gXG4gICAgICBjb25zdCBjb21wYWN0aW9uID0gY29tcGFjdGlvbkZvcihwbGFjZWhvbGRlcklkLCBhcHByb3ZhbC5yZWFzb25pbmcpXG4gICAgICByZWFzb25pbmdTdG9yZS5yZW5hbWUocGxhY2Vob2xkZXJJZCwgYXBwcm92YWxNZXNzYWdlSWQpXG4gICAgICBjb25zdCBhcHByb3ZhbFRyYWNlID0gbWFwUmVhc29uaW5nVHJhY2UoYXBwcm92YWwucmVhc29uaW5nKSA/PyByZWFzb25pbmdUcmFjZUZvcihhcHByb3ZhbE1lc3NhZ2VJZClcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbihzZXNzaW9uSWQsIHtcbiAgICAgICAgaWQ6IGFwcHJvdmFsTWVzc2FnZUlkLFxuICAgICAgICBtZXNzYWdlOiBhY2N1bXVsYXRlZENvbnRlbnQgfHwgJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgYXBwcm92YWxTdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgcmVhc29uaW5nOiBhcHByb3ZhbFRyYWNlLFxuICAgICAgICBjb21wYWN0aW9uLFxuICAgICAgfSlcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5tYXJrQ2hhdEFzVW5yZWFkKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2FwcHJvdmFsX3JlcXVpcmVkJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudCwgY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGV2ZW50XVxuICApXG5cbiAgY29uc3Qge1xuICAgIGFza01haWEsXG4gICAgcmV0cnlDb21wbGV0aW9uLFxuICAgIGlzTG9hZGluZzogd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eSxcbiAgICBzdG9wU3RyZWFtaW5nLFxuICB9ID0gdXNlT3JjaGVzdHJhdG9yU3RyZWFtKHtcbiAgICBhY3RpdmVTZXNzaW9uSWQsXG4gICAgb25FcnJvcjogaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgb25TdHJlYW1VcGRhdGU6IGhhbmRsZVN0cmVhbVVwZGF0ZSxcbiAgICBvbkZpbmlzaFN0cmVhbTogaGFuZGxlU3RyZWFtRmluaXNoLFxuICAgIG9uU3RvcDogaGFuZGxlU3RyZWFtU3RvcCxcbiAgICBvbkFwcHJvdmFsUmVxdWlyZWQ6IGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQsXG4gICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYsXG4gIH0pXG5cbiAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50ID0gKCkgPT4ge1xuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgc2V0QWN0aXZlTG9hZGluZ3Moe30pXG4gICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdFxuXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHNPck9wdGlvbnM/OiBBdHRhY2htZW50RmlsZVtdIHwgU2VuZE1lc3NhZ2VPcHRpb25zLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50IHx8IHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZXMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFRvcGUgZGUgY29uY3VycmVuY2lhOiBzaSBlc3RhIHNlc2nDs24gbm8gZXN0w6EgZ2VuZXJhbmRvIHkgeWEgaGF5XG4gICAgICAvLyBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TIGFjdGl2YXMsIGF2aXNhbW9zIHkgbm8gYXJyYW5jYW1vcyBvdHJhLlxuICAgICAgY29uc3Qgd2lsbFN0YXJ0TmV3U3RyZWFtID0gIXNlc3Npb25TdHJlYW1NYW5hZ2VyLmlzQWN0aXZlKGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgICAgIGlmICh3aWxsU3RhcnROZXdTdHJlYW0gJiYgc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhdHRhY2htZW50cywgb3B0aW9ucyB9ID0gbm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzKGF0dGFjaG1lbnRzT3JPcHRpb25zKVxuICAgICAgLy8gTGFzIG1lbnRpb25zIHB1ZWRlbiB2ZW5pciB2w61hIDV0byBwYXLDoW1ldHJvIChjYWxsIHBvc2l0aW9uYWwgZGVzZGUgZWwgZm9vdGVyKVxuICAgICAgLy8gbyB2w61hIFNlbmRNZXNzYWdlT3B0aW9ucyAoY2FsbCBwcm9ncmFtw6F0aWNvKS4gRWwgcGFyw6FtZXRybyBleHBsw61jaXRvIGdhbmEuXG4gICAgICBjb25zdCBlZmZlY3RpdmVNZW50aW9ucyA9IG1lbnRpb25zID8/IG9wdGlvbnMubWVudGlvbnNcbiAgICAgIGNvbnN0IGNvbnRleHRNZXNzYWdlOiBDb250ZXh0TWVzc2FnZSB8IHVuZGVmaW5lZCA9IGJ1aWxkQ29udGV4dE1lc3NhZ2UoZWZmZWN0aXZlTWVudGlvbnMpXG4gICAgICBjb25zdCBwYXlsb2FkRnVhSWQgPSBmdWFJZCA/PyBvcHRpb25zLmZ1YUlkXG4gICAgICBjb25zdCBwYXlsb2FkU2NJZCA9IHNjSWQgPz8gb3B0aW9ucy5zY0lkXG4gICAgICBjb25zdCBwYXlsb2FkQ29udGV4dERhdGEgPSBvcHRpb25zLmNvbnRleHREYXRhXG4gICAgICBjb25zdCBkaXNwbGF5TWVzc2FnZSA9IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkobWVzc2FnZSwge1xuICAgICAgICBmdWFJZDogcGF5bG9hZEZ1YUlkLFxuICAgICAgICBzY0lkOiBwYXlsb2FkU2NJZCxcbiAgICAgIH0pXG5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgc2V0QWN0aXZlQ2hhdElkKGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgICAgIGNvbnN0IG5ld01lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSBuZXdNZXNzYWdlSWRcbiAgICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG1lc3NhZ2VcblxuICAgICAgaWYgKCFyZXBvcnRlZEV2ZW50LmN1cnJlbnQpIHtcbiAgICAgICAgZXZlbnQoRVZFTlRTLnBtQWlUeXBlZFRleHQpXG4gICAgICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIGNvbnRleHRvIGdsb2JhbCBlc3TDoSBkZXNhY3R1YWxpemFkb1xuICAgICAgY29uc3QgbGFzdE1lc3NhZ2VXaXRoUHJvamVjdCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcblxuICAgICAgY29uc3QgY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzID0gbWVzc2FnZXNSZWYuY3VycmVudD8uW21lc3NhZ2VzUmVmLmN1cnJlbnQubGVuZ3RoIC0gMV0/LmFnZW50SWRcblxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcblxuICAgICAgZW5zdXJlU2Vzc2lvbkluU2lkZWJhcih7XG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgdGl0bGU6IGJ1aWxkU2lkZWJhclNlc3Npb25UaXRsZShkaXNwbGF5TWVzc2FnZSksXG4gICAgICAgIGFnZW50LFxuICAgICAgICBhZ2VudElkOiBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkLFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgYXR0YWNobWVudHMsXG4gICAgICB9KVxuXG4gICAgICAvLyBObyBhZ3JlZ2FyIHByb2plY3RJZCBhbCBtZW5zYWplIGRlbCB1c3VhcmlvIC0gc2UgZGV0ZXJtaW5hcsOhIGRlc3B1w6lzXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBgcXVlc3Rpb24tJHtjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnR9YCxcbiAgICAgICAgbWVzc2FnZTogZGlzcGxheU1lc3NhZ2UsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IGN1cnJlbnRVc2VyLFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuVVNFUixcbiAgICAgICAgc291cmNlczogYXR0YWNobWVudHMsXG4gICAgICAgIC4uLihjb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG5cbiAgICAgIGNvbnN0IHN0cmVhbWluZ1BsYWNlaG9sZGVySWQgPSBzdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQpXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBzdHJlYW1pbmdQbGFjZWhvbGRlcklkXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IHNlc3Npb25JZFxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkKVxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiBhZ2VudD8ubmFtZSB8fCAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSlcblxuICAgICAgbGV0IGZpbmFsTWVzc2FnZSA9IG1lc3NhZ2VcblxuICAgICAgaWYgKG1lc3NhZ2UgPT09IHQoJ3FhLml0ZW1zLnJlbnRhYmlsaWRhZF9wcm95ZWN0bycpKSB7XG4gICAgICAgIGZpbmFsTWVzc2FnZSA9IGBGQVE6ICR7dCgncWEuaXRlbXMucmVudGFiaWxpZGFkX3Byb3llY3RvJyl9IC0gVGlwbyBkZSByZW50YWJpbGlkYWQ6ICR7XG4gICAgICAgICAgb3B0aW9ucy5wcm9qZWN0Q2hhbmdlZD8uaW5jb21lVHlwZSB8fCBjb250ZXh0UmVmLmN1cnJlbnQucHJvamVjdD8uaW5jb21lVHlwZVxuICAgICAgICB9YFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCBsYXN0TWVzc2FnZVByb2plY3RJZCA9IGxhc3RNZXNzYWdlV2l0aFByb2plY3Q/LnByb2plY3RJZFxuICAgICAgY29uc3QgcHJvamVjdFRvUmVxdWVzdCA9IHJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0KGN0eENoaXBzUHJvamVjdCwgbGFzdE1lc3NhZ2VQcm9qZWN0SWQpXG5cbiAgICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmV0Y2hQcm9qZWN0cyhbcHJvamVjdFRvUmVxdWVzdF0pXG5cbiAgICAgIGNvbnN0IHBheWxvYWRGYXFJZCA9IGZhcUlkID8/IG9wdGlvbnMuZmFxSWRcbiAgICAgIGNvbnN0IHBheWxvYWRBZ2VudFN1Z2dlc3Rpb25JZCA9IGFnZW50U3VnZ2VzdGlvbklkID8/IG9wdGlvbnMuYWdlbnRTdWdnZXN0aW9uSWRcblxuICAgICAgY29uc3QgcGF5bG9hZERhdGEgPSB7XG4gICAgICAgIG1lc3NhZ2U6IGZpbmFsTWVzc2FnZSxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICB1c2VySWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgICAgIGZpcnN0TmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgIGNvbXBhbnlJZDogYXV0aFVzZXIuY29tcGFueV9pZC50b1N0cmluZygpLFxuICAgICAgICBjaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgIGFnZW50SWQ6IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyB8fCBhZ2VudD8uaWQhLFxuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4ocHJvamVjdHM/Lmxlbmd0aCA/IHsgcHJvamVjdE5hbWU6IHByb2plY3RzWzBdLm5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKGN0eFRhc2s/LmlkICE9IG51bGxcbiAgICAgICAgICA/IHsgdGFza0lkOiBOdW1iZXIoY3R4VGFzay5pZCksIC4uLihjdHhUYXNrLm5hbWUgPyB7IHRhc2tOYW1lOiBjdHhUYXNrLm5hbWUgfSA6IHt9KSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhdHRhY2htZW50cy5sZW5ndGggPiAwID8geyBhdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZEZhcUlkID8geyBmYXFJZDogcGF5bG9hZEZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiBwYXlsb2FkQWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRGdWFJZCA/IHsgZnVhSWQ6IHBheWxvYWRGdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZFNjSWQgPyB7IHNjSWQ6IHBheWxvYWRTY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LmVtb2ppICE9IG51bGwgPyB7IGFnZW50RW1vamk6IGFnZW50LmVtb2ppIH0gOiB7fSksXG4gICAgICAgIC4uLihjb250ZXh0TWVzc2FnZSA/IHsgY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWRDb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHBheWxvYWRDb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfVxuXG4gICAgICBhc2tNYWlhKHBheWxvYWREYXRhKVxuICAgIH0sXG4gICAgW1xuICAgICAgYWRkTWVzc2FnZSxcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbixcbiAgICAgIGV2ZW50LFxuICAgICAgYXNrTWFpYSxcbiAgICAgIHByb2plY3QsXG4gICAgICBjbGllbnQsXG4gICAgICB0YXNrLFxuICAgICAgY2hpcHNQcm9qZWN0LFxuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIHQsXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBdXG4gIClcblxuICBjb25zdCBjaGFuZ2VQcm9qZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBpZiAob3B0aW9uLmlkICE9PSBwcm9qZWN0Py5pZCkge1xuICAgICAgICBzZXRQcm9qZWN0KG9wdGlvbilcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2plY3QgJiYgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSkpXG5cbiAgICAgICAgYXNrTWFpYSh7XG4gICAgICAgICAgbWVzc2FnZTogY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50LFxuICAgICAgICAgIGhpc3RvcnksXG4gICAgICAgICAgcHJvamVjdElkOiBvcHRpb24uaWQsXG4gICAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgICB1c2VySWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgICAgbGFzdE5hbWU6IGF1dGhVc2VyLmxhc3ROYW1lLFxuICAgICAgICAgIGNvbXBhbnlJZDogYXV0aFVzZXIuY29tcGFueV9pZC50b1N0cmluZygpLFxuICAgICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICAgIGFnZW50TmFtZTogYWdlbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkIHx8ICcnLFxuICAgICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIC4uLihvcHRpb24/LmZlZUlkICE9IG51bGwgPyB7IGZlZUlkOiBOdW1iZXIob3B0aW9uLmZlZUlkKSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb24/LmNsaWVudElkICE9IG51bGwgPyB7IGNsaWVudElkOiBOdW1iZXIob3B0aW9uLmNsaWVudElkKSB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBbcHJvamVjdCwgc2V0UHJvamVjdCwgYXNrTWFpYSwgYXV0aFVzZXIsIGlzV2ViU2VhcmNoQWN0aXZlLCBhZ2VudF1cbiAgKVxuXG4gIGNvbnN0IHJldHJ5TWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50IHx8IHdhaXRpbmdSZXNwb25zZSB8fCBsb2FkaW5nTWVzc2FnZXMpIHJldHVyblxuXG4gICAgICBjb25zdCBzZXNzaW9uSWQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShzZXNzaW9uSWQpKSByZXR1cm5cbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5nZXRBY3RpdmVDb3VudCgpID49IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMpIHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2aW91c01lc3NhZ2VzID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgaWYgKCFwcmV2aW91c01lc3NhZ2VzLnNvbWUoaXRlbSA9PiBpdGVtLmlkID09PSBtZXNzYWdlLmlkKSkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHVzZXJNZXNzYWdlID0gZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkocHJldmlvdXNNZXNzYWdlcywgbWVzc2FnZSlcbiAgICAgIGlmICghdXNlck1lc3NhZ2U/Lm1lc3NhZ2U/LnRyaW0oKSAmJiAhdXNlck1lc3NhZ2U/LmF0dGFjaG1lbnRzPy5sZW5ndGggJiYgIXVzZXJNZXNzYWdlPy5zb3VyY2VzPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR1cm5JZCA9IHJlc29sdmVSZXRyeVR1cm5JZChtZXNzYWdlKVxuICAgICAgY29uc3QgdXNlT3JjaGVzdHJhdG9yRmFsbGJhY2sgPSBtZXNzYWdlLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiYgIW1lc3NhZ2UubWVtb3J5U2Vzc2lvbklkPy50cmltKClcbiAgICAgIGlmICghdHVybklkICYmICF1c2VPcmNoZXN0cmF0b3JGYWxsYmFjaykgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHRydW5jYXRlZCA9IG1lc3NhZ2VzV2l0aG91dFJldHJpZWRUdXJuKHByZXZpb3VzTWVzc2FnZXMsIG1lc3NhZ2UpXG5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gcHJldmlvdXNNZXNzYWdlc1xuICAgICAgc2V0QWN0aXZlQ2hhdElkKHNlc3Npb25JZClcblxuICAgICAgY29uc3QgbmV3TWVzc2FnZUlkID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IG5ld01lc3NhZ2VJZFxuICAgICAgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50ID0gdXNlck1lc3NhZ2UubWVzc2FnZVxuICAgICAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCA9IGBhbnN3ZXItJHtuZXdNZXNzYWdlSWR9LXN0cmVhbWluZ2BcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVySWRcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgaWQ6IHN0cmVhbWluZ1BsYWNlaG9sZGVySWQsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1c2VyOiB7IGlkOiAnYXNzaXN0YW50JywgbmFtZTogYWdlbnQ/Lm5hbWUgfHwgJ0Fzc2lzdGFudCcgfSxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5leHRNZXNzYWdlcyA9IFsuLi50cnVuY2F0ZWQsIHBsYWNlaG9sZGVyXVxuICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG5leHRNZXNzYWdlc1xuICAgICAgcmVwbGFjZU1lc3NhZ2VzKG5leHRNZXNzYWdlcylcbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZClcblxuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlwc1Byb2plY3Q6IGN0eENoaXBzUHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIHRhc2s6IGN0eFRhc2ssXG4gICAgICB9ID0gY29udGV4dFJlZi5jdXJyZW50XG4gICAgICBjb25zdCBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0ID0gdHJ1bmNhdGVkLmZpbHRlcihtc2cgPT4gbXNnLnByb2plY3RJZCkuYXQoLTEpXG4gICAgICBjb25zdCBwcm9qZWN0VG9SZXF1ZXN0ID0gcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QoY3R4Q2hpcHNQcm9qZWN0LCBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0Py5wcm9qZWN0SWQpXG4gICAgICBjb25zdCBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgPSB0cnVuY2F0ZWQuYXQoLTEpPy5hZ2VudElkIHx8IG1lc3NhZ2UuYWdlbnRJZFxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBBcnJheS5pc0FycmF5KHVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzKVxuICAgICAgICA/IHVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzXG4gICAgICAgIDogQXJyYXkuaXNBcnJheSh1c2VyTWVzc2FnZS5zb3VyY2VzKVxuICAgICAgICAgID8gdXNlck1lc3NhZ2Uuc291cmNlc1xuICAgICAgICAgIDogW11cblxuICAgICAgY29uc3QgcmVwbGF5VmlhT3JjaGVzdHJhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gdHJ1bmNhdGVkLm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICAgIGNvbnRlbnQ6IGhpc3RvcnlNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSkpXG4gICAgICAgIGNvbnN0IHByb2plY3RzID0gcHJvamVjdFRvUmVxdWVzdCA/IGF3YWl0IGZldGNoUHJvamVjdHMoW3Byb2plY3RUb1JlcXVlc3RdKSA6IG51bGxcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhc2tNYWlhKHtcbiAgICAgICAgICBtZXNzYWdlOiB1c2VyTWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICAgIGhpc3RvcnksXG4gICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgICAgdXNlcklkOiBhdXRoVXNlci5pZC50b1N0cmluZygpLFxuICAgICAgICAgIGZpcnN0TmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBjb21wYW55SWQ6IGF1dGhVc2VyLmNvbXBhbnlfaWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjaGF0SWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICBtZXNzYWdlSWQ6IG5ld01lc3NhZ2VJZCxcbiAgICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICAgIGFnZW50SWQ6IFN0cmluZyhjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkIHx8ICcnKSxcbiAgICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgICAgLi4ucmVzb2x2ZUNsaWVudFBheWxvYWQoY3R4Q2xpZW50LCBjdHhQcm9qZWN0KSxcbiAgICAgICAgICAuLi4ocHJvamVjdHM/Lmxlbmd0aCA/IHsgcHJvamVjdE5hbWU6IHByb2plY3RzWzBdLm5hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgICAgPyB7IHRhc2tJZDogTnVtYmVyKGN0eFRhc2suaWQpLCAuLi4oY3R4VGFzay5uYW1lID8geyB0YXNrTmFtZTogY3R4VGFzay5uYW1lIH0gOiB7fSkgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGF0dGFjaG1lbnRzLmxlbmd0aCA+IDAgPyB7IGF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudD8udHlwZSAhPSBudWxsID8geyBhZ2VudFR5cGU6IGFnZW50LnR5cGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oYWdlbnQ/LmVtb2ppICE9IG51bGwgPyB7IGFnZW50RW1vamk6IGFnZW50LmVtb2ppIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHVzZXJNZXNzYWdlLmNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZTogdXNlck1lc3NhZ2UuY29udGV4dE1lc3NhZ2UgfSA6IHt9KSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydGVkKSB7XG4gICAgICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBwcmV2aW91c01lc3NhZ2VzXG4gICAgICAgICAgcmVwbGFjZU1lc3NhZ2VzKHByZXZpb3VzTWVzc2FnZXMpXG4gICAgICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuY2xlYXIoc2Vzc2lvbklkKVxuICAgICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHVzZU9yY2hlc3RyYXRvckZhbGxiYWNrIHx8ICF0dXJuSWQpIHtcbiAgICAgICAgYXdhaXQgcmVwbGF5VmlhT3JjaGVzdHJhdG9yKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldHJ5Q29tcGxldGlvbih7XG4gICAgICAgIGNoYXRJZDogc2Vzc2lvbklkLFxuICAgICAgICBtZXNzYWdlSWQ6IG5ld01lc3NhZ2VJZCxcbiAgICAgICAgbWVtb3J5U2Vzc2lvbklkOiB0dXJuSWQsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIGFnZW50SWQ6IFN0cmluZyhjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgfHwgYWdlbnQ/LmlkIHx8ICcnKSxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgLi4uKHByb2plY3RUb1JlcXVlc3QgPyB7IHByb2plY3RJZDogcHJvamVjdFRvUmVxdWVzdCB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbCA/IHsgdGFza0lkOiBOdW1iZXIoY3R4VGFzay5pZCkgfSA6IHt9KSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChyZXN1bHQuc3RhcnRlZCkgcmV0dXJuXG5cbiAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAndHVybl9ub3RfZm91bmQnKSB7XG4gICAgICAgIGF3YWl0IHJlcGxheVZpYU9yY2hlc3RyYXRvcigpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gcHJldmlvdXNNZXNzYWdlc1xuICAgICAgcmVwbGFjZU1lc3NhZ2VzKHByZXZpb3VzTWVzc2FnZXMpXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIGlmIChyZXN1bHQucmVhc29uID09PSAnbGltaXQnKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgICAgcmVwbGFjZU1lc3NhZ2VzLFxuICAgICAgcmV0cnlDb21wbGV0aW9uLFxuICAgICAgYXNrTWFpYSxcbiAgICAgIGZldGNoUHJvamVjdHMsXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgdCxcbiAgICAgIHNldEFjdGl2ZUNoYXRJZCxcbiAgICBdXG4gIClcblxuICBjb25zdCBoYW5kbGVGZWVkYmFjayA9IHVzZUNhbGxiYWNrKGFzeW5jIChmZWVkYmFja1Byb3A6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1haWEuQ2hhdHMud2FzSGVscGZ1bENoYXQoY2hhdE1lc3NhZ2VJZCwgZmVlZGJhY2tQcm9wID09PSBGZWVkYmFjay5USFVNQlNfVVApXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBjaGF0TWVzc2FnZUlkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCcpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5tZXNzYWdlLCB3YXNIZWxwZnVsOiBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUCB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVBcHByb3ZhbERlY2lzaW9uID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgICAgIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JyxcbiAgICAgIGVkaXRlZEFjdGlvbnM/OiBBcnJheTx7IHRvb2xfbmFtZTogc3RyaW5nOyBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgICAgIG1ldGFkYXRhPzogeyB0b29sX2dyb3VwX3NsdWdzOiBzdHJpbmdbXSB9XG4gICAgKSA9PiB7XG4gICAgICBpZiAoIXRocmVhZElkcz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHRocmVhZF9pZHMgcHJvdmlkZWQgZm9yIGFwcHJvdmFsIGRlY2lzaW9uJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyh0aHJlYWRJZHMsIG1lc3NhZ2VzUmVmLmN1cnJlbnQpXG4gICAgICBpZiAoIWZvdW5kPy5tZXNzYWdlLmFwcHJvdmFsKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlIGVuY29udHLDsyBtZW5zYWplIGNvbiBhcHByb3ZhbCBwYXJhIHRocmVhZF9pZHM6JywgdGhyZWFkSWRzKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBtZXNzYWdlOiBtZXNzYWdlV2l0aEFwcHJvdmFsLCBzZXNzaW9uSWQ6IGZvdW5kU2Vzc2lvbklkIH0gPSBmb3VuZFxuICAgICAgY29uc3QgeyBhcHByb3ZhbCB9ID0gbWVzc2FnZVdpdGhBcHByb3ZhbFxuICAgICAgaWYgKCFhcHByb3ZhbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gYXBwcm92YWwuc2Vzc2lvbl9pZCB8fCBmb3VuZFNlc3Npb25JZFxuICAgICAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gc2Vzc2lvbl9pZCBkaXNwb25pYmxlIHBhcmEgYXBwcm92YWw6JywgdGhyZWFkSWRzKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHNlc3Npb25TdHJlYW1NYW5hZ2VyLmlzQWN0aXZlKHNlc3Npb25JZCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5nZXRBY3RpdmVDb3VudCgpID49IE1BWF9DT05DVVJSRU5UX1NUUkVBTVMpIHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlV2l0aEFwcHJvdmFsLmlkXG4gICAgICBjb25zdCBuZXdTdGF0dXMgPSBkZWNpc2lvbiA9PT0gJ2FwcHJvdmUnID8gJ2FwcHJvdmVkJyA6ICdyZWplY3RlZCdcbiAgICAgIGNvbnN0IGhpdGxDb250ZXh0OiBIaXRsRXhlY3V0aW9uQ29udGV4dCA9IHtcbiAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICBtZXNzYWdlVGV4dDogbWVzc2FnZVdpdGhBcHByb3ZhbC5tZXNzYWdlLFxuICAgICAgICBhcHByb3ZhbCxcbiAgICAgICAgcGVuZGluZ0FjdGlvbnM6IGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyxcbiAgICAgICAgdGhyZWFkSWRzLFxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0FjdGl2ZVNlc3Npb24gPSBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZClcbiAgICAgIGlmIChpc0FjdGl2ZVNlc3Npb24pIHtcbiAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IGhpdGxDb250ZXh0XG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7IC4uLm1lc3NhZ2VXaXRoQXBwcm92YWwsIGFwcHJvdmFsU3RhdHVzOiBuZXdTdGF0dXMgfSlcblxuICAgICAgY29uc3Qgc3RyZWFtTWVzc2FnZUlkID0gdXVpZHY0KClcbiAgICAgIGlmIChpc0FjdGl2ZVNlc3Npb24pIHtcbiAgICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gc3RyZWFtTWVzc2FnZUlkXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpdGxDdHg6IFN0cmVhbUNvbnRleHQgPSB7XG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgbWVzc2FnZUlkOiBzdHJlYW1NZXNzYWdlSWQsXG4gICAgICAgIHBsYWNlaG9sZGVySWQ6IHN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKHN0cmVhbU1lc3NhZ2VJZCksXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nID0gKCkgPT4ge1xuICAgICAgICBpZiAoIWlzQWN0aXZlU2Vzc2lvbikgcmV0dXJuXG4gICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2Vzc2lvblN0cmVhbU1hbmFnZXIuc3RhcnRDb250aW51ZVN0cmVhbSh7XG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcGxhY2Vob2xkZXJJZDogaGl0bEN0eC5wbGFjZWhvbGRlcklkLFxuICAgICAgICBjb250aW51ZVJlcXVlc3Q6IHtcbiAgICAgICAgICB0aHJlYWRJZHMsXG4gICAgICAgICAgc2Vzc2lvbklkOiBhcHByb3ZhbC5zZXNzaW9uX2lkLFxuICAgICAgICAgIGRlY2lzaW9uOiBlZGl0ZWRBY3Rpb25zID8gJ2VkaXQnIDogZGVjaXNpb24sXG4gICAgICAgICAgZWRpdGVkQWN0aW9ucyxcbiAgICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQgfHwgJycsXG4gICAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgICBpc0F1dG9BcHByb3ZlQWN0aXZlOiBpc0F1dG9BcHByb3ZlQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIH0sXG4gICAgICAgIHQsXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0OiBoaXRsQ29udGV4dCxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICBvblN0cmVhbVVwZGF0ZTogY29udGVudCA9PiBoYW5kbGVTdHJlYW1VcGRhdGUoaGl0bEN0eCwgY29udGVudCksXG4gICAgICAgICAgb25GaW5pc2hTdHJlYW06IGZpbmlzaFBheWxvYWQgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRmluaXNoKFxuICAgICAgICAgICAgICBoaXRsQ3R4LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc291cmNlcyxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5tZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuY29tcGxldGVkQWdlbnRJZCxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5yZXNvbHZlZENvbnRleHQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQucmVhc29uaW5nXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZygpXG4gICAgICAgICAgICBoYW5kbGVTdHJlYW1FcnJvcihoaXRsQ3R4KVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25BcHByb3ZhbFJlcXVpcmVkOiAoYXBwcm92YWxQYXlsb2FkLCBhY2N1bXVsYXRlZENvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgICAgIGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQoaGl0bEN0eCwgYXBwcm92YWxQYXlsb2FkLCBhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzdWx0LnN0YXJ0ZWQpIHtcbiAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gJ2xpbWl0Jykge1xuICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGF1dGhVc2VyLFxuICAgICAgYWdlbnQsXG4gICAgICBjb21taXRUb1Nlc3Npb24sXG4gICAgICBoYW5kbGVTdHJlYW1FcnJvcixcbiAgICAgIGhhbmRsZVN0cmVhbVVwZGF0ZSxcbiAgICAgIGhhbmRsZVN0cmVhbUZpbmlzaCxcbiAgICAgIGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQsXG4gICAgICB0LFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGluaXRpYWxpemVDaGF0ID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmICghZmlyc3RUaW1lUmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpcnN0VGltZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaW5pdGlhbENoYXRJZCkge1xuICAgICAgYXdhaXQgbG9hZE1lc3NhZ2VzKClcbiAgICB9IGVsc2UgaWYgKHVzZXJJbml0aWFsTWVzc2FnZSkge1xuICAgICAgY29uc3QgaGFzSW5pdGlhbE1lc3NhZ2UgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlPy50cmltKCkpXG4gICAgICBjb25zdCBoYXNJbml0aWFsQXR0YWNobWVudHMgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cz8ubGVuZ3RoKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEZhcSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEZ1YSA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbFNjID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZClcblxuICAgICAgaWYgKCFoYXNJbml0aWFsTWVzc2FnZSAmJiAhaGFzSW5pdGlhbEF0dGFjaG1lbnRzICYmICFoYXNJbml0aWFsRmFxICYmICFoYXNJbml0aWFsRnVhICYmICFoYXNJbml0aWFsU2MpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChoaXN0b3J5TWVzc2FnZSA9PiAoe1xuICAgICAgICBjb250ZW50OiBoaXN0b3J5TWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICByb2xlOiBoaXN0b3J5TWVzc2FnZS51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpID8gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY2hpcHNQcm9qZWN0OiBjdHhDaGlwc1Byb2plY3QsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICB0YXNrOiBjdHhUYXNrLFxuICAgICAgfSA9IGNvbnRleHRSZWYuY3VycmVudFxuICAgICAgY29uc3QgcHJvamVjdFRvUmVxdWVzdCA9IHJlc29sdmVQcm9qZWN0VG9SZXF1ZXN0KGN0eENoaXBzUHJvamVjdCwgbnVsbCkgPz8gY3R4UHJvamVjdD8uaWQgPz8gbnVsbFxuXG4gICAgICBjb25zdCBpbml0aWFsRGlzcGxheU1lc3NhZ2UgPSBmb3JtYXRRdWlja0FjdGlvbk1lc3NhZ2VGb3JEaXNwbGF5KHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLCB7XG4gICAgICAgIGZ1YUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZnVhSWQsXG4gICAgICAgIHNjSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkLFxuICAgICAgfSlcblxuICAgICAgZW5zdXJlU2Vzc2lvbkluU2lkZWJhcih7XG4gICAgICAgIHNlc3Npb25JZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICB0aXRsZTogYnVpbGRTaWRlYmFyU2Vzc2lvblRpdGxlKGluaXRpYWxEaXNwbGF5TWVzc2FnZSksXG4gICAgICAgIGFnZW50LFxuICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQsXG4gICAgICAgIHByb2plY3Q6IGN0eFByb2plY3QsXG4gICAgICAgIGNsaWVudDogY3R4Q2xpZW50LFxuICAgICAgICBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzLFxuICAgICAgfSlcblxuICAgICAgYXNrTWFpYSh7XG4gICAgICAgIG1lc3NhZ2U6IHVzZXJJbml0aWFsTWVzc2FnZS5tZXNzYWdlLFxuICAgICAgICBoaXN0b3J5LFxuICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RUb1JlcXVlc3QsXG4gICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgIHVzZXJJZDogYXV0aFVzZXIuaWQudG9TdHJpbmcoKSxcbiAgICAgICAgZmlyc3ROYW1lOiBhdXRoVXNlci5maXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lOiBhdXRoVXNlci5sYXN0TmFtZSxcbiAgICAgICAgY29tcGFueUlkOiBhdXRoVXNlci5jb21wYW55X2lkLnRvU3RyaW5nKCksXG4gICAgICAgIGNoYXRJZDogY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgICAgICBtZXNzYWdlSWQ6IGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSEsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCEsXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0F1dG9BcHByb3ZlQWN0aXZlOiBpc0F1dG9BcHByb3ZlQWN0aXZlUmVmLmN1cnJlbnQsXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5mZWVJZCAhPSBudWxsID8geyBmZWVJZDogTnVtYmVyKGN0eFByb2plY3QuZmVlSWQpIH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihjdHhQcm9qZWN0Py5uYW1lID8geyBwcm9qZWN0TmFtZTogY3R4UHJvamVjdC5uYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihjdHhUYXNrPy5pZCAhPSBudWxsXG4gICAgICAgICAgPyB7IHRhc2tJZDogTnVtYmVyKGN0eFRhc2suaWQpLCAuLi4oY3R4VGFzay5uYW1lID8geyB0YXNrTmFtZTogY3R4VGFzay5uYW1lIH0gOiB7fSkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogdXNlckluaXRpYWxNZXNzYWdlLmF0dGFjaG1lbnRzIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgPyB7IGZhcUlkOiB1c2VySW5pdGlhbE1lc3NhZ2UuZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5hZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkID8geyBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCA/IHsgc2NJZDogdXNlckluaXRpYWxNZXNzYWdlLnNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py5lbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IGFnZW50LmVudGl0eSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW1vamkgIT0gbnVsbCA/IHsgYWdlbnRFbW9qaTogYWdlbnQuZW1vamkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKVxuICAgICAgICAgID8geyBjb250ZXh0TWVzc2FnZTogYnVpbGRDb250ZXh0TWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UubWVudGlvbnMpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5jb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGE6IHVzZXJJbml0aWFsTWVzc2FnZS5jb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtcbiAgICBpbml0aWFsQ2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBwcm9qZWN0LFxuICAgIGNsaWVudCxcbiAgICB0YXNrLFxuICAgIGF1dGhVc2VyLFxuICAgIGFnZW50LFxuICAgIGFza01haWEsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICBdKVxuXG4gIGNvbnN0IHJlc2V0Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBwcmV2aW91c1Nlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHByZXZpb3VzU2Vzc2lvbklkKVxuICAgIHJlYXNvbmluZ1N0b3JlLmNsZWFyKClcbiAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCA9IG51bGxcbiAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgIHNldEFjdGl2ZVNlc3Npb25JZChjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gICAgcmVwb3J0ZWRFdmVudC5jdXJyZW50ID0gZmFsc2VcbiAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgc2V0QWN0aXZlQ2hhdElkKG51bGwpXG4gIH0sIFtzZXRBY3RpdmVDaGF0SWRdKVxuXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN0b3BTdHJlYW1pbmcoKVxuICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgfSwgW3N0b3BTdHJlYW1pbmddKVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZXMsXG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXcml0aW5nLFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIGFjdGl2ZUxvYWRpbmdzLFxuICAgIGN1cnJlbnRQcm9qZWN0LFxuICAgIGN1cnJlbnRDaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICBjdXJyZW50TWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG5cbiAgICBzZW5kTWVzc2FnZSxcbiAgICByZXRyeU1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICByZXNldENoYXQsXG4gICAgc3RvcEdlbmVyYXRpb24sXG5cbiAgICBpc0Rpc2FibGVkOiB3YWl0aW5nUmVzcG9uc2UgfHwgbG9hZGluZ01lc3NhZ2VzLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUNoRSxTQUFTQyxTQUFTLFFBQVEsV0FBVztBQUNyQyxTQUFTQyxFQUFFLElBQUlDLE1BQU0sUUFBUSxNQUFNO0FBQ25DLFNBQVNDLGVBQWUsUUFBUSxvQkFBb0I7QUFDcEQsU0FBU0MscUJBQXFCLFFBQVEsMEJBQTBCO0FBQ2hFLFNBQVNDLElBQUksUUFBUSxTQUFTO0FBRzlCLFNBQVNDLE9BQU8sUUFBaUIsd0JBQXdCO0FBQ3pELFNBQVNDLGdCQUFnQixRQUFRLDhCQUE4QjtBQUMvRCxTQUFTQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSxhQUFhO0FBQzlDLE9BQU9DLElBQUksTUFBTSxxQkFBcUI7QUFDdEMsU0FBU0MsUUFBUSxRQUFRLDREQUE0RDtBQUNyRixTQUF1Q0MsZUFBZSxRQUF3QyxrQkFBa0I7QUFDaEgsU0FBeUNDLG1CQUFtQixRQUFRLDRCQUE0QjtBQUNoRyxTQUFTQyxrQ0FBa0MsUUFBUSxzQ0FBc0M7QUFH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
1373
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiZmx1c2hTeW5jIiwidjQiLCJ1dWlkdjQiLCJ1c2VDaGF0TWVzc2FnZXMiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJ1c2VUIiwiZmluZE1lc3NhZ2VXaXRoQXBwcm92YWxCeVRocmVhZElkcyIsInJlc29sdmVBcHByb3ZhbERlY2lzaW9uU3RhdHVzIiwicmVzb2x2ZUNvbnRpbnVlU3RyZWFtRGVjaXNpb24iLCJtYXBBdXRoVXNlclRvQ2hhdE1lc3NhZ2VVc2VyIiwibm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMiLCJub3JtYWxpemVTZW5kTWVzc2FnZUFyZ3MiLCJyZWFzb25pbmdUcmFjZUZvciIsInJlc29sdmVDbGllbnRQYXlsb2FkIiwicmVzb2x2ZVByb2plY3RUb1JlcXVlc3QiLCJyZXNvbHZlU3RyZWFtRXJyb3JNZXNzYWdlS2V5IiwiYXBwbHlQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24iLCJzaG91bGRSZWZldGNoT3BlblRhc2tQYW5lbCIsInJlc29sdmVTZW5kTWVzc2FnZUdhdGUiLCJyZXNvbHZlU2VuZE1lc3NhZ2VQYXlsb2FkRmllbGRzIiwiYnVpbGRDaGF0SGlzdG9yeUZyb21NZXNzYWdlcyIsInJlc29sdmVMYXN0TWVzc2FnZUFnZW50SWQiLCJyZXNvbHZlQWdlbnRJZEZvclN0cmVhbSIsInJlc29sdmVVc2VyUXVlc3Rpb25NZXNzYWdlSWQiLCJidWlsZE1haWFTdHJlYW1SZXF1ZXN0UGF5bG9hZCIsImJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkRm9yUHJvamVjdENoYW5nZSIsInJlc29sdmVTdHJlYW1FcnJvckhhbmRsaW5nTW9kZSIsImJ1aWxkU3RyZWFtRXJyb3JBc3Npc3RhbnRNZXNzYWdlIiwicmVzb2x2ZUhpdGxBcHByb3ZhbFJlcXVpcmVkT3V0Y29tZSIsImJ1aWxkSGl0bEFwcHJvdmFsUGVuZGluZ01lc3NhZ2UiLCJzaG91bGRQcmVzZXJ2ZVJlYXNvbmluZ09uU3RyZWFtU3RvcCIsImJ1aWxkU3RyZWFtU3RvcFBhcnRpYWxBc3Npc3RhbnRNZXNzYWdlIiwiYnVpbGRTdHJlYW1TdG9wQ2FuY2VsbGVkQXNzaXN0YW50TWVzc2FnZSIsInJlc29sdmVSZXRyeUJsb2NrUmVhc29uIiwicmVzb2x2ZVJldHJ5RWxpZ2liaWxpdHkiLCJyZXNvbHZlUmV0cnlVc2VyQXR0YWNobWVudHMiLCJzaG91bGRVcGRhdGVQcm9qZWN0T25DaGFuZ2UiLCJzaG91bGRSZXNlbmRBZnRlclByb2plY3RDaGFuZ2UiLCJyZXNvbHZlU3RyZWFtRmluaXNoRmluYWxNZXNzYWdlSWQiLCJyZXNvbHZlU3RyZWFtU3RvcE1lc3NhZ2VJZHMiLCJyZXNvbHZlUmVudGFiaWxpZGFkUHJvamVjdEZhcU1lc3NhZ2UiLCJyZXNvbHZlU3RyZWFtRXJyb3JVc2VyTWVzc2FnZSIsInJlc29sdmVIaXRsRXhlY3V0aW9uQ29udGV4dCIsInJlc29sdmVTa2lwcGVkSGl0bE1hbnVhbEFwcHJvdmFsIiwicmVzb2x2ZUhpdGxTa2lwUmVzb2x1dGlvblNvdXJjZSIsInJlc29sdmVDcmVhdGVBZ2VudEhpdGxBbmFseXRpY3NFdmVudHMiLCJidWlsZFRlcm1pbmFsU2Vzc2lvblJlY29uY2lsaWF0aW9uS2V5Iiwic2hvdWxkRm9yY2VSZWxvYWRNZXNzYWdlc09uVGVybWluYWxTZXNzaW9uIiwic2hvdWxkUm90YXRlU2Vzc2lvbkZvck5ld0hvbWUiLCJzaG91bGRTd2l0Y2hUb0luaXRpYWxDaGF0U2Vzc2lvbiIsImJ1aWxkU3RyZWFtRmluaXNoQXNzaXN0YW50TWVzc2FnZSIsInJlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nIiwic2hvdWxkTWFya0NoYXRSZWFkQWZ0ZXJTdHJlYW1GaW5pc2giLCJzaG91bGREaXNwYXRjaEZpcnN0U2Vzc2lvblJlZmV0Y2giLCJ1c2VVc2VyIiwidXNlR2xvYmFsQ29udGV4dCIsIkVWRU5UUyIsInVzZUV2ZW50IiwibWFpYSIsIkZlZWRiYWNrIiwiQ2hhdEhpc3RvcnlSb2xlIiwiYnVpbGRDb250ZXh0TWVzc2FnZSIsImZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkiLCJ1c2VQcm9qZWN0cyIsInVzZVRhYlRhc2tEZWZhdWx0IiwiVEFTS19VUkxfUkVHRVhfUEFUVEVSTiIsImRpc3BhdGNoTWFpYUhvdXJzQ2hhcmdlZCIsImZldGNoQWdlbnREZXRhaWwiLCJidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCIsImdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUiLCJub3JtYWxpemVIaXRsVG9vbE5hbWUiLCJ0cmFja01hbnVhbEhpdGxFdmVudHMiLCJzZXNzaW9uU3RyZWFtaW5nVGV4dCIsInVzZVNlc3Npb25zU3RvcmUiLCJ1c2VTZXNzaW9uTWV0YSIsInNlc3Npb25TdHJlYW1NYW5hZ2VyIiwiTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyIsImFjdGl2ZVZpZXciLCJub3RpZnlTZXNzaW9uRmluaXNoZWRJbkJhY2tncm91bmQiLCJidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUiLCJlbnN1cmVTZXNzaW9uSW5TaWRlYmFyIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsInN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIiwiZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkiLCJtZXNzYWdlc1dpdGhvdXRSZXRyaWVkVHVybiIsImdldENoYXRzU3RvcmVTdGF0ZSIsInVzZUNoYXRzU3RvcmUiLCJyZWFzb25pbmdTdG9yZSIsIm1hcFJlYXNvbmluZ1RyYWNlIiwidXNlU3RhYmxlQ2FsbGJhY2tzIiwiYXV0aFVzZXIiLCJjdXJyZW50VXNlciIsIm5leHRVc2VyIiwiY3VycmVudCIsImlkIiwibmFtZSIsImF2YXRhciIsInVzZUNoYXRNYW5hZ2VyIiwiX3JlZiIsImluaXRpYWxDaGF0SWQiLCJjaGF0SWQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJvbkVycm9yIiwiX3JlZiRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInByb2plY3QiLCJzZXRQcm9qZWN0IiwiY2xpZW50Iiwic2V0Q2xpZW50IiwidGFzayIsInNldFRhc2siLCJhZ2VudCIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiaXNBdXRvQXBwcm92ZUFjdGl2ZSIsImNoaXBzUHJvamVjdCIsInNldENoaXBzUHJvamVjdCIsImV2ZW50IiwiX3VzZVByb2plY3RzIiwiZmV0Y2hQcm9qZWN0cyIsIl91c2VTdGFibGVDYWxsYmFja3MiLCJfdXNlVGFiVGFza0RlZmF1bHQiLCJnZXRUYWJUYXNrRGVmYXVsdCIsImN1cnJlbnRNZXNzYWdlSWQiLCJjdXJyZW50VXNlclF1ZXN0aW9uIiwiY3VycmVudENoYXRJZCIsInNldEFjdGl2ZUNoYXRJZCIsInN0YXRlIiwicmVwb3J0ZWRFdmVudCIsIm1lc3NhZ2VzUmVmIiwibGFzdE1hbnVhbEFwcHJvdmFsUmVmIiwidHJhY2tlZE1hbnVhbEhpdGxLZXlzUmVmIiwiU2V0IiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJyZXRyeVNuYXBzaG90UmVmIiwiaXNQcm9jZXNzaW5nUmVmIiwiZmlyc3RUaW1lUmVmIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZiIsImFjdGl2ZVN0cmVhbUNoYXRJZFJlZiIsImNsZWFyU3RyZWFtVWlSZWYiLCJ1bmRlZmluZWQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJhY3RpdmVMb2FkaW5ncyIsInNldEFjdGl2ZUxvYWRpbmdzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJhY3RpdmVTZXNzaW9uSWQiLCJzZXRBY3RpdmVTZXNzaW9uSWQiLCJpc01vdW50ZWRSZWYiLCJsYXN0SGFuZGxlZFRlcm1pbmFsUmVmIiwiaXNXZWJTZWFyY2hBY3RpdmVSZWYiLCJpc0RlZXBTZWFyY2hBY3RpdmVSZWYiLCJpc0F1dG9BcHByb3ZlQWN0aXZlUmVmIiwiY29udGV4dFJlZiIsIl91c2VDaGF0TWVzc2FnZXMiLCJsb2FkaW5nTWVzc2FnZXMiLCJtZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsImxvYWRNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwicmVwbGFjZU1lc3NhZ2VzIiwiaGFuZGxlU2Nyb2xsIiwiY29tbWl0VG9TZXNzaW9uIiwic2Vzc2lvbklkIiwibWVzc2FnZSIsImdldFN0YXRlIiwiaXMiLCJkcm9wRnJvbVNlc3Npb24iLCJtZXNzYWdlSWQiLCJjbGVhclNlc3Npb25UYWlsIiwic2V0TWVzc2FnZXMiLCJzZXQiLCJhY3RpdmVTZXNzaW9uTWV0YSIsInN0YXR1cyIsImtleSIsImZpbmlzaGVkQXQiLCJ0YWlsIiwiZ2V0TWVzc2FnZXMiLCJmb3JjZSIsImN1c3RvbUV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJkb2N1bWVudCIsImRpc3BhdGNoRXZlbnQiLCJwcmV2aW91c0luaXRpYWxDaGF0SWRSZWYiLCJwcmV2aW91c0luaXRpYWxDaGF0SWQiLCJpc0FjdGl2ZSIsImhhbmRsZVN0cmVhbUVycm9yIiwiY3R4IiwiZXJyb3JNZXNzYWdlIiwiZXJyb3JSYXdNZXNzYWdlIiwicGxhY2Vob2xkZXJJZCIsImNsZWFyIiwicmV0cnlTbmFwc2hvdCIsIkJvb2xlYW4iLCJzaG93Iiwic2V2ZXJpdHkiLCJfcmVzb2x2ZVN0cmVhbUVycm9yTWUiLCJtZXNzYWdlS2V5IiwidG9rZW5zVXNlZCIsInNob3dSZXRyeSIsInJldHJ5TGFiZWwiLCJtYXJrQ2hhdEFzVW5yZWFkIiwiaGFuZGxlU3RyZWFtVXBkYXRlIiwiY29udGVudCIsInBsYWNlaG9sZGVyRXhpc3RzIiwic29tZSIsIm1zZyIsInN0YXJ0IiwiZGF0ZSIsIkRhdGUiLCJ1c2VyIiwicm9sZSIsIkFTU0lTVEFOVCIsInNldFRleHQiLCJoYW5kbGVTdHJlYW1GaW5pc2giLCJfcmVmMiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwic291cmNlcyIsIm1lbW9yeVNlc3Npb25JZCIsInJhd0F0dGFjaG1lbnRzIiwic3VnZ2VzdGlvbnMiLCJjb21wbGV0ZWRBZ2VudElkIiwiX3Jlc29sdmVkQ29udGV4dCIsInJlYXNvbmluZyIsIl9yZWFzb25pbmdUcmFjZUZvciIsIl93aW5kb3ckdGFza1BhbmVsIiwidGVtcE1lc3NhZ2VJZCIsImF0dGFjaG1lbnRzIiwiZmluYWxNZXNzYWdlSWQiLCJmaW5hbFRyYWNlIiwidGFza1VybFJlZ2V4IiwibWFudWFsQXBwcm92YWxGb3JBbmFseXRpY3MiLCJtYW51YWxBcHByb3ZhbCIsIl95aWVsZCRyZXNvbHZlQWN0aXZlUyIsImNvbnRlbnRUb0FkZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJlZGl0QWdlbnRGb2xsb3dVcCIsImhvdXJzQ2hhcmdlVG9vbHMiLCJhZmZlY3RlZFRhc2tJZHMiLCJtYW51YWxXYXNUYXNrRWRpdCIsIm1hbnVhbFdhc1Rhc2tEZWxldGUiLCJ3YXNUYXNrRWRpdCIsIndhc1Rhc2tEZWxldGUiLCJ3YXNDcmVhdGVBZ2VudEFwcHJvdmVkIiwicGVuZGluZ0FjdGlvbnMiLCJvcGVuVGFza1BhbmVsSWQiLCJfd2luZG93JHRhc2tQYW5lbDIiLCJfd2luZG93JHRhc2tQYW5lbDIkcmUiLCJfZ2V0Q2hhdHNTdG9yZVN0YXRlIiwiaXNDaGF0Vmlld1Zpc2libGUiLCJtYXJrQ2hhdEFzUmVhZCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwicmVuYW1lIiwiYWJydXB0IiwiUmVnRXhwIiwicHJvamVjdElkIiwicGF0aG5hbWUiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsIm11bHRpQWdlbnRzQWNjZXNzIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsImFwcGx5RGFzaGJvYXJkTXV0YXRpb24iLCJtdXRhdGlvbiIsInRhc2tJZHMiLCJuZXdQcm9qZWN0RGFzaGJvYXJkIiwic2VudCIsIm1hbnVhbEFwcHJvdmFsVG9vbE5hbWUiLCJ0b29sTmFtZSIsImFnZW50VHlwZSIsIm5vcm1hbGl6ZVRvb2xOYW1lIiwiYnVpbGRBY3Rpb25UeXBlTGlzdCIsImZvckVhY2giLCJwYXlsb2FkIiwiYWlDaGF0SGl0bE9wdGlvbiIsInRhc2tQYW5lbCIsInRhc2tJZCIsImxlbmd0aCIsInNvdXJjZSIsInRvb2xzIiwicmVmZXRjaFRhc2siLCJjYWxsIiwiYWdlbnRJZCIsInRoZW4iLCJjaGF0QWdlbnQiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJzdG9wIiwiX3giLCJfeDIiLCJfeDMiLCJfeDQiLCJfeDUiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJhcHBseSIsImFyZ3VtZW50cyIsImhhbmRsZVN0cmVhbVN0b3AiLCJwYXJ0aWFsVGV4dCIsIl9yZXNvbHZlU3RyZWFtU3RvcE1lcyIsImNhbmNlbGxlZE1lc3NhZ2VJZCIsInN0b3BwZWRUcmFjZSIsImZpbmlzaCIsInJlbW92ZSIsImNhbmNlbGxlZExhYmVsIiwiaGFuZGxlQXBwcm92YWxSZXF1aXJlZCIsImFwcHJvdmFsIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiX21hcFJlYXNvbmluZ1RyYWNlIiwiaGl0bENvbnRleHQiLCJoaXRsT3V0Y29tZSIsInR5cGUiLCJpbXByZXNzaW9uIiwiYWlDaGF0SGl0bCIsIm9wdGlvbiIsInNraXBwZWRNYW51YWxBcHByb3ZhbCIsImFwcHJvdmFsTWVzc2FnZUlkIiwiYXBwcm92YWxUcmFjZSIsIl91c2VPcmNoZXN0cmF0b3JTdHJlYSIsIm9uU3RyZWFtVXBkYXRlIiwib25GaW5pc2hTdHJlYW0iLCJvblN0b3AiLCJvbkFwcHJvdmFsUmVxdWlyZWQiLCJhc2tNYWlhIiwicmV0cnlDb21wbGV0aW9uIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNMb2FkaW5nIiwiaXNXcml0aW5nIiwibG9hZGluZ01lc3NhZ2UiLCJzdHJlYW1BY3Rpdml0eSIsInVwZGF0ZVN0cmVhbUFjdGl2aXR5Iiwic3RvcFN0cmVhbWluZyIsImN1cnJlbnRQcm9qZWN0Iiwic2VuZE1lc3NhZ2UiLCJfcmVmMyIsIl9jYWxsZWUyIiwiYXR0YWNobWVudHNPck9wdGlvbnMiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJfb3B0aW9ucyRwcm9qZWN0Q2hhbmciLCJfY29udGV4dFJlZiRjdXJyZW50JHAiLCJ3aWxsU3RhcnROZXdTdHJlYW0iLCJzZW5kR2F0ZSIsIl9ub3JtYWxpemVTZW5kTWVzc2FnZSIsIm9wdGlvbnMiLCJwYXlsb2FkRmllbGRzIiwiY29udGV4dE1lc3NhZ2UiLCJkaXNwbGF5TWVzc2FnZSIsIm5ld01lc3NhZ2VJZCIsImxhc3RNZXNzYWdlV2l0aFByb2plY3QiLCJjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMiLCJfY29udGV4dFJlZiRjdXJyZW50IiwiY3R4Q2hpcHNQcm9qZWN0IiwiY3R4UHJvamVjdCIsImN0eENsaWVudCIsImN0eFRhc2siLCJzdHJlYW1pbmdQbGFjZWhvbGRlcklkIiwiZmluYWxNZXNzYWdlIiwiaGlzdG9yeSIsImxhc3RNZXNzYWdlUHJvamVjdElkIiwicHJvamVjdFRvUmVxdWVzdCIsInByb2plY3RzIiwicGF5bG9hZERhdGEiLCJfY29udGV4dDIiLCJpc1Byb2Nlc3NpbmciLCJhY3RpdmVTdHJlYW1Db3VudCIsImdldEFjdGl2ZUNvdW50IiwibWF4Q29uY3VycmVudCIsInBtQWlUeXBlZFRleHQiLCJmaWx0ZXIiLCJhdCIsInRpdGxlIiwiX29iamVjdFNwcmVhZCIsIlVTRVIiLCJwcm9qZWN0Q2hhbmdlZCIsImluY29tZVR5cGUiLCJ0b1N0cmluZyIsImFnZW50TmFtZSIsInByb2plY3ROYW1lIiwiYWdlbnRFbnRpdHkiLCJlbnRpdHkiLCJhZ2VudEVtb2ppIiwiZW1vamkiLCJjb250ZXh0RGF0YSIsIl94MCIsIl94MSIsIl94MTAiLCJfeDExIiwiX3gxMiIsIl94MTMiLCJfeDE0IiwiY2hhbmdlUHJvamVjdCIsInJldHJ5TWVzc2FnZSIsIl9yZWY0IiwiX2NhbGxlZTQiLCJfdHJ1bmNhdGVkJGF0IiwicmV0cnlCbG9jayIsInByZXZpb3VzTWVzc2FnZXMiLCJ1c2VyTWVzc2FnZSIsInJldHJ5RWxpZ2liaWxpdHkiLCJ0dXJuSWQiLCJ1c2VPcmNoZXN0cmF0b3JGYWxsYmFjayIsInRydW5jYXRlZCIsInBsYWNlaG9sZGVyIiwibmV4dE1lc3NhZ2VzIiwiX2NvbnRleHRSZWYkY3VycmVudDIiLCJyZXBsYXlWaWFPcmNoZXN0cmF0b3IiLCJyZXN1bHQiLCJfY29udGV4dDQiLCJpc1Nlc3Npb25TdHJlYW1BY3RpdmUiLCJlbGlnaWJsZSIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9yZWY1IiwiX2NhbGxlZTMiLCJfdCIsIl9jb250ZXh0MyIsInN0YXJ0ZWQiLCJyZWFzb24iLCJsYW5nIiwiU3RyaW5nIiwiTnVtYmVyIiwiX3gxNSIsImhhbmRsZUZlZWRiYWNrIiwiX3JlZjYiLCJfY2FsbGVlNSIsImZlZWRiYWNrUHJvcCIsImNoYXRNZXNzYWdlSWQiLCJyZXNwb25zZSIsIl9jb250ZXh0NSIsIkNoYXRzIiwid2FzSGVscGZ1bENoYXQiLCJUSFVNQlNfVVAiLCJtYXAiLCJ3YXNIZWxwZnVsIiwiX3gxNiIsIl94MTciLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uIiwiX3JlZjciLCJfY2FsbGVlNiIsInRocmVhZElkcyIsImRlY2lzaW9uIiwiZWRpdGVkQWN0aW9ucyIsIm1ldGFkYXRhIiwiZm91bmQiLCJtZXNzYWdlV2l0aEFwcHJvdmFsIiwiZm91bmRTZXNzaW9uSWQiLCJuZXdTdGF0dXMiLCJpc0FjdGl2ZVNlc3Npb24iLCJzdHJlYW1NZXNzYWdlSWQiLCJoaXRsQ3R4IiwicmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmciLCJfY29udGV4dDYiLCJnZXQiLCJzZXNzaW9uX2lkIiwibWVzc2FnZVRleHQiLCJwZW5kaW5nX2FjdGlvbnMiLCJhcHByb3ZhbFN0YXR1cyIsInN0YXJ0Q29udGludWVTdHJlYW0iLCJjb250aW51ZVJlcXVlc3QiLCJoaXRsRXhlY3V0aW9uQ29udGV4dCIsImNhbGxiYWNrcyIsImZpbmlzaFBheWxvYWQiLCJyZXNvbHZlZENvbnRleHQiLCJhcHByb3ZhbFBheWxvYWQiLCJfeDE4IiwiX3gxOSIsIl94MjAiLCJfeDIxIiwiaW5pdGlhbGl6ZUNoYXQiLCJfY2FsbGVlNyIsIl91c2VySW5pdGlhbE1lc3NhZ2UkbSIsIl91c2VySW5pdGlhbE1lc3NhZ2UkYSIsIl9yZWY5IiwiX3Jlc29sdmVQcm9qZWN0VG9SZXF1IiwiaGFzSW5pdGlhbE1lc3NhZ2UiLCJoYXNJbml0aWFsQXR0YWNobWVudHMiLCJoYXNJbml0aWFsRmFxIiwiaGFzSW5pdGlhbEZ1YSIsImhhc0luaXRpYWxTYyIsIl9jb250ZXh0UmVmJGN1cnJlbnQzIiwiaW5pdGlhbERpc3BsYXlNZXNzYWdlIiwiX2NvbnRleHQ3IiwidHJpbSIsImhpc3RvcnlNZXNzYWdlIiwidXNlcklkIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJjb21wYW55SWQiLCJjb21wYW55X2lkIiwiZmVlSWQiLCJ0YXNrTmFtZSIsInJlc2V0Q2hhdCIsInByZXZpb3VzU2Vzc2lvbklkIiwic3RvcEdlbmVyYXRpb24iLCJpc0Rpc2FibGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHJhZGl4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGVkLW9wdGlvbmFsLWNoYWluICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmLCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJ1xuaW1wb3J0IHsgdXNlQ2hhdE1lc3NhZ2VzIH0gZnJvbSAnLi4vdXNlQ2hhdE1lc3NhZ2VzJ1xuaW1wb3J0IHsgdXNlT3JjaGVzdHJhdG9yU3RyZWFtIH0gZnJvbSAnLi4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtJ1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7XG4gIGZpbmRNZXNzYWdlV2l0aEFwcHJvdmFsQnlUaHJlYWRJZHMsXG4gIHJlc29sdmVBcHByb3ZhbERlY2lzaW9uU3RhdHVzLFxuICByZXNvbHZlQ29udGludWVTdHJlYW1EZWNpc2lvbixcbiAgbWFwQXV0aFVzZXJUb0NoYXRNZXNzYWdlVXNlcixcbiAgbm9ybWFsaXplQXNzaXN0YW50QXR0YWNobWVudHMsXG4gIG5vcm1hbGl6ZVNlbmRNZXNzYWdlQXJncyxcbiAgcmVhc29uaW5nVHJhY2VGb3IsXG4gIHJlc29sdmVDbGllbnRQYXlsb2FkLFxuICByZXNvbHZlUHJvamVjdFRvUmVxdWVzdCxcbiAgcmVzb2x2ZVN0cmVhbUVycm9yTWVzc2FnZUtleSxcbiAgYXBwbHlQcm9qZWN0RGFzaGJvYXJkTXV0YXRpb24sXG4gIHNob3VsZFJlZmV0Y2hPcGVuVGFza1BhbmVsLFxuICByZXNvbHZlU2VuZE1lc3NhZ2VHYXRlLFxuICByZXNvbHZlU2VuZE1lc3NhZ2VQYXlsb2FkRmllbGRzLFxuICBidWlsZENoYXRIaXN0b3J5RnJvbU1lc3NhZ2VzLFxuICByZXNvbHZlTGFzdE1lc3NhZ2VBZ2VudElkLFxuICByZXNvbHZlQWdlbnRJZEZvclN0cmVhbSxcbiAgcmVzb2x2ZVVzZXJRdWVzdGlvbk1lc3NhZ2VJZCxcbiAgYnVpbGRNYWlhU3RyZWFtUmVxdWVzdFBheWxvYWQsXG4gIGJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkRm9yUHJvamVjdENoYW5nZSxcbiAgcmVzb2x2ZVN0cmVhbUVycm9ySGFuZGxpbmdNb2RlLFxuICBidWlsZFN0cmVhbUVycm9yQXNzaXN0YW50TWVzc2FnZSxcbiAgcmVzb2x2ZUhpdGxBcHByb3ZhbFJlcXVpcmVkT3V0Y29tZSxcbiAgYnVpbGRIaXRsQXBwcm92YWxQZW5kaW5nTWVzc2FnZSxcbiAgc2hvdWxkUHJlc2VydmVSZWFzb25pbmdPblN0cmVhbVN0b3AsXG4gIGJ1aWxkU3RyZWFtU3RvcFBhcnRpYWxBc3Npc3RhbnRNZXNzYWdlLFxuICBidWlsZFN0cmVhbVN0b3BDYW5jZWxsZWRBc3Npc3RhbnRNZXNzYWdlLFxuICByZXNvbHZlUmV0cnlCbG9ja1JlYXNvbixcbiAgcmVzb2x2ZVJldHJ5RWxpZ2liaWxpdHksXG4gIHJlc29sdmVSZXRyeVVzZXJBdHRhY2htZW50cyxcbiAgc2hvdWxkVXBkYXRlUHJvamVjdE9uQ2hhbmdlLFxuICBzaG91bGRSZXNlbmRBZnRlclByb2plY3RDaGFuZ2UsXG4gIHJlc29sdmVTdHJlYW1GaW5pc2hGaW5hbE1lc3NhZ2VJZCxcbiAgcmVzb2x2ZVN0cmVhbVN0b3BNZXNzYWdlSWRzLFxuICByZXNvbHZlUmVudGFiaWxpZGFkUHJvamVjdEZhcU1lc3NhZ2UsXG4gIHJlc29sdmVTdHJlYW1FcnJvclVzZXJNZXNzYWdlLFxuICByZXNvbHZlSGl0bEV4ZWN1dGlvbkNvbnRleHQsXG4gIHJlc29sdmVTa2lwcGVkSGl0bE1hbnVhbEFwcHJvdmFsLFxuICByZXNvbHZlSGl0bFNraXBSZXNvbHV0aW9uU291cmNlLFxuICByZXNvbHZlQ3JlYXRlQWdlbnRIaXRsQW5hbHl0aWNzRXZlbnRzLFxuICBidWlsZFRlcm1pbmFsU2Vzc2lvblJlY29uY2lsaWF0aW9uS2V5LFxuICBzaG91bGRGb3JjZVJlbG9hZE1lc3NhZ2VzT25UZXJtaW5hbFNlc3Npb24sXG4gIHNob3VsZFJvdGF0ZVNlc3Npb25Gb3JOZXdIb21lLFxuICBzaG91bGRTd2l0Y2hUb0luaXRpYWxDaGF0U2Vzc2lvbixcbiAgYnVpbGRTdHJlYW1GaW5pc2hBc3Npc3RhbnRNZXNzYWdlLFxuICByZXNvbHZlQWN0aXZlU3RyZWFtRmluaXNoUHJvY2Vzc2luZyxcbiAgc2hvdWxkTWFya0NoYXRSZWFkQWZ0ZXJTdHJlYW1GaW5pc2gsXG4gIHNob3VsZERpc3BhdGNoRmlyc3RTZXNzaW9uUmVmZXRjaCxcbn0gZnJvbSAnLi91c2VDaGF0TWFuYWdlci5oZWxwZXJzJ1xuaW1wb3J0IHsgU2VuZE1lc3NhZ2VPcHRpb25zLCBVc2VDaGF0TWFuYWdlclByb3BzIH0gZnJvbSAnLi91c2VDaGF0TWFuYWdlci5pbnRlcmZhY2UnXG5pbXBvcnQgeyB1c2VVc2VyLCBDT1JVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uL3VzZUV2ZW50J1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tb2xlY3VsZXMvTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0TWVzc2FnZVVzZXIsIENoYXRIaXN0b3J5Um9sZSwgQXBwcm92YWxSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uLCBDb250ZXh0TWVzc2FnZSwgYnVpbGRDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZSdcblxuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgeyB1c2VQcm9qZWN0cyB9IGZyb20gJy4uL3VzZVByb2plY3RzJ1xuaW1wb3J0IHsgdXNlVGFiVGFza0RlZmF1bHQgfSBmcm9tICcuLi91c2VUYWJUYXNrRGVmYXVsdCdcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5pbXBvcnQgeyBkaXNwYXRjaE1haWFIb3Vyc0NoYXJnZWQgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvcGxhbm5lclN5bmNFdmVudHMnXG5pbXBvcnQgeyBmZXRjaEFnZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZmV0Y2hBZ2VudERldGFpbCdcbmltcG9ydCB7XG4gIGJ1aWxkSGl0bEFjdGlvblR5cGVMaXN0LFxuICBnZXRIaXRsQW5hbHl0aWNzQWdlbnRUeXBlLFxuICBub3JtYWxpemVIaXRsVG9vbE5hbWUsXG4gIHRyYWNrTWFudWFsSGl0bEV2ZW50cyxcbn0gZnJvbSAnLi4vLi4vdXRpbHMvaGl0bEFuYWx5dGljcydcbmltcG9ydCB7IHR5cGUgSGl0bEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgc2Vzc2lvblN0cmVhbWluZ1RleHQgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy9zZXNzaW9uU3RyZWFtaW5nVGV4dCdcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgdXNlU2Vzc2lvbk1ldGEgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uTWV0YSdcbmltcG9ydCB7IHNlc3Npb25TdHJlYW1NYW5hZ2VyLCBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXInXG5pbXBvcnQgeyBhY3RpdmVWaWV3IH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvYWN0aXZlVmlldydcbmltcG9ydCB7IG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZCB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25Ob3RpZmljYXRpb25zJ1xuaW1wb3J0IHsgYnVpbGRTaWRlYmFyU2Vzc2lvblRpdGxlLCBlbnN1cmVTZXNzaW9uSW5TaWRlYmFyIH0gZnJvbSAnLi4vLi4vc3RvcmUvY2hhdHNTaWRlYmFyT3B0aW1pc3RpYydcbmltcG9ydCB7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQsIHN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IGZpbmRVc2VyTWVzc2FnZUZvclJldHJ5LCBtZXNzYWdlc1dpdGhvdXRSZXRyaWVkVHVybiB9IGZyb20gJy4uLy4uL3V0aWxzL3JldHJ5Q29tcGxldGlvbidcbmltcG9ydCB0eXBlIHsgU3RyZWFtQ29udGV4dCB9IGZyb20gJy4uL3VzZU9yY2hlc3RyYXRvclN0cmVhbS91c2VPcmNoZXN0cmF0b3JTdHJlYW0uaW50ZXJmYWNlJ1xuaW1wb3J0IHsgZ2V0Q2hhdHNTdG9yZVN0YXRlLCB1c2VDaGF0c1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdXNlQ2hhdHNTdG9yZSdcbmltcG9ydCB7IHJlYXNvbmluZ1N0b3JlIH0gZnJvbSAnLi4vdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgeyBtYXBSZWFzb25pbmdUcmFjZSB9IGZyb20gJy4uLy4uL3V0aWxzL3JlYXNvbmluZ01hcHBlcnMnXG5pbXBvcnQgdHlwZSB7IFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB9IGZyb20gJy4uLy4uL3R5cGVzL3JlYXNvbmluZydcblxuY29uc3QgdXNlU3RhYmxlQ2FsbGJhY2tzID0gKGF1dGhVc2VyOiBDT1JVc2VyKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRVc2VyID0gdXNlUmVmPENoYXRNZXNzYWdlVXNlcj4obWFwQXV0aFVzZXJUb0NoYXRNZXNzYWdlVXNlcihhdXRoVXNlcikpXG5cbiAgY29uc3QgbmV4dFVzZXIgPSBtYXBBdXRoVXNlclRvQ2hhdE1lc3NhZ2VVc2VyKGF1dGhVc2VyKVxuICBpZiAoXG4gICAgY3VycmVudFVzZXIuY3VycmVudC5pZCAhPT0gbmV4dFVzZXIuaWQgfHxcbiAgICBjdXJyZW50VXNlci5jdXJyZW50Lm5hbWUgIT09IG5leHRVc2VyLm5hbWUgfHxcbiAgICBjdXJyZW50VXNlci5jdXJyZW50LmF2YXRhciAhPT0gbmV4dFVzZXIuYXZhdGFyXG4gICkge1xuICAgIGN1cnJlbnRVc2VyLmN1cnJlbnQgPSBuZXh0VXNlclxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50VXNlcjogY3VycmVudFVzZXIuY3VycmVudCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdE1hbmFnZXIgPSAoe1xuICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQsXG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgb25FcnJvcixcbiAgYWdlbnRzID0gW10sXG59OiBVc2VDaGF0TWFuYWdlclByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVCgpXG4gIGNvbnN0IGF1dGhVc2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHtcbiAgICBwcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgY2xpZW50LFxuICAgIHNldENsaWVudCxcbiAgICB0YXNrLFxuICAgIHNldFRhc2ssXG4gICAgYWdlbnQsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGlzQXV0b0FwcHJvdmVBY3RpdmUsXG4gICAgY2hpcHNQcm9qZWN0LFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBldmVudCA9IHVzZUV2ZW50KClcbiAgY29uc3QgeyBmZXRjaFByb2plY3RzIH0gPSB1c2VQcm9qZWN0cygpXG4gIGNvbnN0IHsgY3VycmVudFVzZXIgfSA9IHVzZVN0YWJsZUNhbGxiYWNrcyhhdXRoVXNlcilcbiAgY29uc3QgeyBnZXRUYWJUYXNrRGVmYXVsdCB9ID0gdXNlVGFiVGFza0RlZmF1bHQoKVxuXG4gIGNvbnN0IGN1cnJlbnRNZXNzYWdlSWQgPSB1c2VSZWYodXVpZHY0KCkpXG4gIGNvbnN0IGN1cnJlbnRVc2VyUXVlc3Rpb24gPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY3VycmVudENoYXRJZCA9IHVzZVJlZihpbml0aWFsQ2hhdElkIHx8IHV1aWR2NCgpKVxuICBjb25zdCBzZXRBY3RpdmVDaGF0SWQgPSB1c2VDaGF0c1N0b3JlKHN0YXRlID0+IHN0YXRlLnNldEFjdGl2ZUNoYXRJZClcbiAgY29uc3QgcmVwb3J0ZWRFdmVudCA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8Q2hhdE1lc3NhZ2VbXT4oW10pXG4gIC8qKlxuICAgKiBHdWFyZGEgaW5mbyBkZWwgw7psdGltbyBhcHByb3ZhbCBtYW51YWwgKGN1YW5kbyBlbCB1c3VhcmlvIHRpcGVhIFwic2lcIi9cIm5vXCIgZW4gbHVnYXJcbiAgICogZGUgY2xpY2tlYXIgZWwgYm90w7NuKS4gRW4gbWFudWFsIGFwcHJvdmFsLCBgaGFuZGxlQXBwcm92YWxSZXF1aXJlZGAgcmV0b3JuYSBlYXJseVxuICAgKiBzaW4gYWdyZWdhciB1biBtZW5zYWplIGNvbiBgYXBwcm92YWxgLCBhc8OtIHF1ZSBsYSBsw7NnaWNhIGRlIHJlZmV0Y2ggZW4gYG9uU3RyZWFtRmluaXNoYFxuICAgKiBubyBsbyBkZXRlY3RhIHbDrWEgYHByZXZpb3VzTWVzc2FnZS5hcHByb3ZhbGAuIExvIGd1YXJkYW1vcyBhY8OhIHBhcmEgY29uc3VtaXJsbyBkZXNwdcOpcy5cbiAgICovXG4gIGNvbnN0IGxhc3RNYW51YWxBcHByb3ZhbFJlZiA9IHVzZVJlZjx7XG4gICAgdG9vbE5hbWU6IHN0cmluZ1xuICAgIHRvb2xBcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgfSB8IG51bGw+KG51bGwpXG4gIC8qKiBFdml0YSBkdXBsaWNhciBBSV9DSEFUX0hJVEwgLyBBSV9DSEFUX0hJVExfT1BUSU9OIGVuIHByZWFwcm9iYWNpb25lcyAobWFudWFsIG8gYXV0bykgcG9yIGxvdGUuICovXG4gIGNvbnN0IHRyYWNrZWRNYW51YWxIaXRsS2V5c1JlZiA9IHVzZVJlZjxTZXQ8c3RyaW5nPj4obmV3IFNldCgpKVxuICAvKiogQ29udGV4dG8gZGVsIG1lbnNhamUgZGUgYXByb2JhY2nDs24gcHJldmlvIGFsIGVqZWN1dGFyIGNvbnRpbnVlLXRocmVhZC4gKi9cbiAgY29uc3QgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYgPSB1c2VSZWY8SGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsPihudWxsKVxuICAvKiogTWVuc2FqZXMgYSByZXN0YXVyYXIgc2kgYHJldHJ5X2NvbXBsZXRpb25gIGZhbGxhIGFudGVzIGRlIHBlcnNpc3RpciBlbCByZWVtcGxhem8uICovXG4gIGNvbnN0IHJldHJ5U25hcHNob3RSZWYgPSB1c2VSZWY8Q2hhdE1lc3NhZ2VbXSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzUHJvY2Vzc2luZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgZmlyc3RUaW1lUmVmID0gdXNlUmVmKGZhbHNlKVxuICAvKiogSWQgZGVsIHBsYWNlaG9sZGVyIGRlbCBtZW5zYWplIGVuIHN0cmVhbWluZyBhY3Rpdm8gKHNpIGhheSkuICovXG4gIGNvbnN0IHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgLyoqXG4gICAqIENoYXQgYWwgcXVlIHBlcnRlbmVjZSBlbCBzdHJlYW0gYWN0dWFsbWVudGUgYWN0aXZvLiBTaSBjYW1iaWEgZWwgY2hhdFxuICAgKiBtaWVudHJhcyB1biBzdHJlYW0gZXN0w6EgZW4gdnVlbG8sIGRlc2NhcnRhbW9zIGxvcyB0b2tlbnMgcmVzaWR1YWxlc1xuICAgKiBxdWUgcHVlZGFuIGxsZWdhciBhbnRlcyBkZSBxdWUgZWwgYWJvcnQgc2UgY29tcGxldGUuXG4gICAqL1xuICBjb25zdCBhY3RpdmVTdHJlYW1DaGF0SWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgY2xlYXJTdHJlYW1VaVJlZiA9IHVzZVJlZjwoKSA9PiB2b2lkPigoKSA9PiB1bmRlZmluZWQpXG4gIGNvbnN0IFthY3RpdmVMb2FkaW5ncywgc2V0QWN0aXZlTG9hZGluZ3NdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pXG4gIC8qKlxuICAgKiBTZXNpw7NuIGFjdHVhbG1lbnRlIHZpc2libGUuIFNlIG1hbnRpZW5lIGVuIHN0YXRlIChubyBzb2xvIGVuIHJlZikgcGFyYSBxdWVcbiAgICogZWwgbW90b3IgZGUgc3RyZWFtaW5nIHB1ZWRhIGxlZXIgcmVhY3RpdmFtZW50ZSBsb3MgZmxhZ3MgZGUgRVNUQSBzZXNpw7NuXG4gICAqIGRlc2RlIGVsIHN0b3JlLCBtaWVudHJhcyBvdHJhcyBzaWd1ZW4gZ2VuZXJhbmRvIGVuIGJhY2tncm91bmQuXG4gICAqL1xuICBjb25zdCBbYWN0aXZlU2Vzc2lvbklkLCBzZXRBY3RpdmVTZXNzaW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nPihjdXJyZW50Q2hhdElkLmN1cnJlbnQpXG4gIC8qKiBUcnVlIG1pZW50cmFzIGVzdGEgaW5zdGFuY2lhIGVzdMOpIG1vbnRhZGEgKGV2aXRhIHNldFN0YXRlIHRyYXMgZGVzbW9udGFyKS4gKi9cbiAgY29uc3QgaXNNb3VudGVkUmVmID0gdXNlUmVmKHRydWUpXG4gIC8qKiBFdml0YSByZWNvbmNpbGlhciBkb3MgdmVjZXMgZWwgbWlzbW8gZXN0YWRvIHRlcm1pbmFsIGRlIHVuYSBzZXNpw7NuLiAqL1xuICBjb25zdCBsYXN0SGFuZGxlZFRlcm1pbmFsUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgY29uc3QgaXNXZWJTZWFyY2hBY3RpdmVSZWYgPSB1c2VSZWYoaXNXZWJTZWFyY2hBY3RpdmUpXG4gIGNvbnN0IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZiA9IHVzZVJlZihpc0RlZXBTZWFyY2hBY3RpdmUpXG4gIGNvbnN0IGlzQXV0b0FwcHJvdmVBY3RpdmVSZWYgPSB1c2VSZWYoaXNBdXRvQXBwcm92ZUFjdGl2ZSlcbiAgLyoqIEV2aXRhIGNsb3N1cmVzIG9ic29sZXRhcyBjdWFuZG8gZWwgZm9vdGVyIGNvbnNlcnZhIHNlbmRNZXNzYWdlIGVudHJlIHJlbmRlcnMuICovXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoeyBjaGlwc1Byb2plY3QsIHByb2plY3QsIGNsaWVudCwgdGFzayB9KVxuICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IGNoaXBzUHJvamVjdCwgcHJvamVjdCwgY2xpZW50LCB0YXNrIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQgPSBpc1dlYlNlYXJjaEFjdGl2ZVxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50ID0gaXNEZWVwU2VhcmNoQWN0aXZlXG4gICAgaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50ID0gaXNBdXRvQXBwcm92ZUFjdGl2ZVxuICB9LCBbaXNXZWJTZWFyY2hBY3RpdmUsIGlzRGVlcFNlYXJjaEFjdGl2ZSwgaXNBdXRvQXBwcm92ZUFjdGl2ZV0pXG5cbiAgY29uc3Qge1xuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIGFkZE1lc3NhZ2UsXG4gICAgcmVtb3ZlTWVzc2FnZSxcbiAgICByZXBsYWNlTWVzc2FnZXMsXG4gICAgaGFuZGxlU2Nyb2xsLFxuICB9ID0gdXNlQ2hhdE1lc3NhZ2VzKHtcbiAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgY3VycmVudENoYXRJZC5jdXJyZW50LFxuICAgIGN1cnJlbnRVc2VyLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBvbkVycm9yLFxuICAgIGFnZW50cyxcbiAgfSlcblxuICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNcblxuICAvKipcbiAgICogRXNjcmliZSB1biBtZW5zYWplIGVuIGVsIHN0b3JlIHBvci1zZXNpw7NuIHksIHNpIGxhIHNlc2nDs24gZXMgbGEgYWN0aXZhLFxuICAgKiB0YW1iacOpbiBlbiBsYSB2aXN0YSBsb2NhbC4gUGVybWl0ZSBxdWUgc2VzaW9uZXMgZW4gYmFja2dyb3VuZCBhY3VtdWxlbiBzdVxuICAgKiByZXN1bHRhZG8gc2luIHBpc2FyIGVsIGNoYXQgcXVlIGVsIHVzdWFyaW8gZXN0w6EgbWlyYW5kby5cbiAgICovXG4gIGNvbnN0IGNvbW1pdFRvU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzZXNzaW9uSWQ6IHN0cmluZywgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5hZGRNZXNzYWdlKHNlc3Npb25JZCwgbWVzc2FnZSlcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZE1lc3NhZ2VdXG4gIClcblxuICBjb25zdCBkcm9wRnJvbVNlc3Npb24gPSB1c2VDYWxsYmFjayhcbiAgICAoc2Vzc2lvbklkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucmVtb3ZlTWVzc2FnZShzZXNzaW9uSWQsIG1lc3NhZ2VJZClcbiAgICAgIGlmIChpc01vdW50ZWRSZWYuY3VycmVudCAmJiBhY3RpdmVWaWV3LmlzKHNlc3Npb25JZCkpIHtcbiAgICAgICAgcmVtb3ZlTWVzc2FnZShtZXNzYWdlSWQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbcmVtb3ZlTWVzc2FnZV1cbiAgKVxuXG4gIC8qKiBMaW1waWEgZWwgdGFpbCBlbiB2dWVsbyBkZSB1bmEgc2VzacOzbiAodHJhcyB0ZXJtaW5hcjsgZWwgYmFja2VuZCBwYXNhIGEgc2VyIGZ1ZW50ZSkuICovXG4gIGNvbnN0IGNsZWFyU2Vzc2lvblRhaWwgPSB1c2VDYWxsYmFjaygoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHtcbiAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXMoc2Vzc2lvbklkLCBbXSlcbiAgfSwgW10pXG5cbiAgLy8gUmVnaXN0cmFyIGxhIHNlc2nDs24gdmlzaWJsZSBlbiBlbCB0cmFja2VyIGdsb2JhbCBwYXJhIHF1ZSBsb3MgY2FsbGJhY2tzIGRlbFxuICAvLyBtb3RvciAocXVlIHB1ZWRlbiBwZXJ0ZW5lY2VyIGEgdW5hIGluc3RhbmNpYSB5YSBkZXNtb250YWRhKSBzZXBhbiBjdcOhbCBlcyBsYVxuICAvLyBzZXNpw7NuIGFjdGl2YSBhY3R1YWwuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYWN0aXZlVmlldy5zZXQoYWN0aXZlU2Vzc2lvbklkKVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpc01vdW50ZWRSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpZiAoYWN0aXZlVmlldy5pcyhjdXJyZW50Q2hhdElkLmN1cnJlbnQpKSB7XG4gICAgICAgIGFjdGl2ZVZpZXcuc2V0KG51bGwpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBSZWNvbmNpbGlhY2nDs246IHNpIGxhIHNlc2nDs24gYWN0aXZhIHRlcm1pbmEgKGNvbXBsZXRlL2Vycm9yKSBwZXJvIGVsIHN0b3JlXG4gIC8vIHBvci1zZXNpw7NuIHRvZGF2w61hIHRpZW5lIHVuIHBsYWNlaG9sZGVyIGRlIHN0cmVhbWluZywgcmVmcmVzY2Ftb3MgZGVzZGVcbiAgLy8gZWwgYmFja2VuZC4gVXNhbW9zIGVsIHN0b3JlIChubyBtZXNzYWdlc1JlZik6IGhhbmRsZVN0cmVhbUZpbmlzaCBsaW1waWEgZWxcbiAgLy8gcGxhY2Vob2xkZXIgYWjDrSBkZSBmb3JtYSBzw61uY3JvbmE7IG1lc3NhZ2VzUmVmIHB1ZWRlIHF1ZWRhciBzdGFsZSB1biByZW5kZXJcbiAgLy8gcG9ycXVlIHNldFN0YXR1cyAoWnVzdGFuZCkgeSByZW1vdmVNZXNzYWdlIChSZWFjdCkgbm8gYmF0Y2hhbiBqdW50b3MuXG4gIC8vIGBjYW5jZWxsZWRgIHF1ZWRhIGFmdWVyYTogZWwgc3RvcCB5YSByZWNvbmNpbGlhIGxvY2FsIChwYXJjaWFsICsgYnVyYnVqYSBkZVxuICAvLyBjYW5jZWxhZG8pIHkgcmVjYXJnYXIgYWPDoSBtb3N0cmFiYSBsYSBwYW50YWxsYSBkZSBjYXJnYSBkZWwgY2hhdCBlbnRlcm8uXG4gIGNvbnN0IGFjdGl2ZVNlc3Npb25NZXRhID0gdXNlU2Vzc2lvbk1ldGEoYWN0aXZlU2Vzc2lvbklkKVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IGFjdGl2ZVNlc3Npb25NZXRhPy5zdGF0dXNcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuXG4gICAgY29uc3Qga2V5ID0gYnVpbGRUZXJtaW5hbFNlc3Npb25SZWNvbmNpbGlhdGlvbktleShhY3RpdmVTZXNzaW9uSWQsIHN0YXR1cywgYWN0aXZlU2Vzc2lvbk1ldGE/LmZpbmlzaGVkQXQpXG4gICAgaWYgKGxhc3RIYW5kbGVkVGVybWluYWxSZWYuY3VycmVudCA9PT0ga2V5KSByZXR1cm5cbiAgICBsYXN0SGFuZGxlZFRlcm1pbmFsUmVmLmN1cnJlbnQgPSBrZXlcblxuICAgIGNvbnN0IHRhaWwgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWVzc2FnZXMoYWN0aXZlU2Vzc2lvbklkKVxuICAgIGlmIChzaG91bGRGb3JjZVJlbG9hZE1lc3NhZ2VzT25UZXJtaW5hbFNlc3Npb24oc3RhdHVzLCB0YWlsLCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKSkge1xuICAgICAgbG9hZE1lc3NhZ2VzKHsgZm9yY2U6IHRydWUgfSlcbiAgICB9XG4gIH0sIFthY3RpdmVTZXNzaW9uTWV0YT8uc3RhdHVzLCBhY3RpdmVTZXNzaW9uTWV0YT8uZmluaXNoZWRBdCwgYWN0aXZlU2Vzc2lvbklkLCBsb2FkTWVzc2FnZXNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VzdG9tRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtbG9hZGluZy1tZXNzYWdlcy1jaGFuZ2VkJywge1xuICAgICAgZGV0YWlsOiB7IGxvYWRpbmdNZXNzYWdlcyB9LFxuICAgIH0pXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudClcbiAgfSwgW2xvYWRpbmdNZXNzYWdlc10pXG5cbiAgY29uc3QgcHJldmlvdXNJbml0aWFsQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KGluaXRpYWxDaGF0SWQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBwcmV2aW91c0luaXRpYWxDaGF0SWQgPSBwcmV2aW91c0luaXRpYWxDaGF0SWRSZWYuY3VycmVudFxuICAgIHByZXZpb3VzSW5pdGlhbENoYXRJZFJlZi5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuXG4gICAgLy8gQ2hhdCBudWV2byAvIGhvbWU6IGluaXRpYWxDaGF0SWQgcGFzYSBhIG51bGwsIGFzw60gcXVlIGxhIHJhbWEgZGUgYWJham8gbm9cbiAgICAvLyBhcGxpY2EuIEhheSBxdWUgcm90YXIgYSB1bmEgc2VzacOzbiBudWV2YSBpZ3VhbDogc2kgc2VndWltb3MgYXB1bnRhbmRvIGEgbGFcbiAgICAvLyBhbnRlcmlvciwgYGFjdGl2ZVZpZXdgIGxhIHNpZ3VlIG1hcmNhbmRvIGNvbW8gYWN0aXZhIHkgY3VhbmRvIHRlcm1pbmEgbm8gc2VcbiAgICAvLyBub3RpZmljYSAoeSBzdSByZXNwdWVzdGEgc2UgY29tbWl0ZWEgc29icmUgbGEgdmlzdGEgbnVldmEpLiBFbCDDoXJib2wgbm9cbiAgICAvLyByZW1vbnRhIGVuIGVzdGUgZmx1am8gKG5vIGhheSBga2V5YCkgeSBuYWRpZSBjb25zdW1lIGByZXNldENoYXRgLlxuICAgIGlmIChzaG91bGRSb3RhdGVTZXNzaW9uRm9yTmV3SG9tZShpbml0aWFsQ2hhdElkLCBwcmV2aW91c0luaXRpYWxDaGF0SWQpKSB7XG4gICAgICBjdXJyZW50Q2hhdElkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgICAgc2V0QWN0aXZlU2Vzc2lvbklkKGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHV1aWR2NCgpXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXBvcnRlZEV2ZW50LmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkU3dpdGNoVG9Jbml0aWFsQ2hhdFNlc3Npb24oaW5pdGlhbENoYXRJZCwgY3VycmVudENoYXRJZC5jdXJyZW50KSAmJiBpbml0aWFsQ2hhdElkKSB7XG4gICAgICAvLyBOTyBhYm9ydGFtb3MgZWwgc3RyZWFtIGFudGVyaW9yOiBwdWVkZSBzZWd1aXIgZ2VuZXJhbmRvIGVuIGJhY2tncm91bmQuXG4gICAgICAvLyBTb2xvIGNhbWJpYW1vcyBkZSBzZXNpw7NuIGFjdGl2YTsgZWwgbW90b3IgcnV0ZWEgY2FkYSBzdHJlYW0gcG9yIHN1XG4gICAgICAvLyBzZXNzaW9uSWQsIGFzw60gcXVlIGxvcyB0b2tlbnMgZGUgbGEgc2VzacOzbiBwcmV2aWEgc2lndWVuIGFwbGljw6FuZG9zZSBhXG4gICAgICAvLyBFU0Egc2VzacOzbiAoc3RvcmUpLCBubyBhIGxhIG51ZXZhLlxuXG4gICAgICAvLyBMaW1waWFyIGNvbnRleHRvIGdsb2JhbCBhbCBjYW1iaWFyIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgIHNldFRhc2sobnVsbClcblxuICAgICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuICAgICAgc2V0QWN0aXZlU2Vzc2lvbklkKGluaXRpYWxDaGF0SWQpXG4gICAgICBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmVwb3J0ZWRFdmVudC5jdXJyZW50ID0gZmFsc2VcbiAgICAgIC8vIGlzUHJvY2Vzc2luZ1JlZiByZWZsZWphIHNpIGxhIHNlc2nDs24gQUNUSVZBIGVzdMOhIG9jdXBhZGEuIFNpIGxhIHNlc2nDs25cbiAgICAgIC8vIGEgbGEgcXVlIGVudHJhbW9zIHNpZ3VlIGdlbmVyYW5kbyBlbiBiYWNrZ3JvdW5kLCBxdWVkYSBibG9xdWVhZGE7IHNpIG5vLFxuICAgICAgLy8gc2UgaGFiaWxpdGEgZWwgZW52w61vIGF1bnF1ZSBvdHJhcyBzZXNpb25lcyBzaWdhbiBnZW5lcmFuZG8uXG4gICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHNlc3Npb25TdHJlYW1NYW5hZ2VyLmlzQWN0aXZlKGluaXRpYWxDaGF0SWQpXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcblxuICAgICAgLy8gbG9hZE1lc3NhZ2VzIGxvIGRpc3BhcmEgdXNlQ2hhdE1lc3NhZ2VzIGFsIGNhbWJpYXIgY2hhdElkIChjb24gY2FjaGUgZW4gbWVtb3JpYSkuXG4gICAgfVxuICB9LCBbaW5pdGlhbENoYXRJZCwgcHJvamVjdCwgc2V0UHJvamVjdCwgc2V0Q2xpZW50LCBzZXRDaGlwc1Byb2plY3QsIHNldFRhc2tdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0QWN0aXZlQ2hhdElkKGluaXRpYWxDaGF0SWQgfHwgbnVsbClcbiAgfSwgW2luaXRpYWxDaGF0SWQsIHNldEFjdGl2ZUNoYXRJZF0pXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtRXJyb3IgPSB1c2VDYWxsYmFjayhcbiAgICAoY3R4OiBTdHJlYW1Db250ZXh0LCBlcnJvck1lc3NhZ2U/OiBzdHJpbmcsIGVycm9yUmF3TWVzc2FnZT86IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSWQsIG1lc3NhZ2VJZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKVxuXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuXG4gICAgICBjb25zdCByZXRyeVNuYXBzaG90ID0gcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50XG4gICAgICBpZiAocmVzb2x2ZVN0cmVhbUVycm9ySGFuZGxpbmdNb2RlKEJvb2xlYW4ocmV0cnlTbmFwc2hvdCkpID09PSAncmV0cnktcmVzdG9yZScgJiYgcmV0cnlTbmFwc2hvdCkge1xuICAgICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSByZXRyeVNuYXBzaG90XG4gICAgICAgIHJlcGxhY2VNZXNzYWdlcyhyZXRyeVNuYXBzaG90KVxuICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnZXJyb3InLCBtZXNzYWdlOiB0KCdjaGF0LmVycm9yJykgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50KClcbiAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IG1lc3NhZ2VLZXksIHRva2Vuc1VzZWQsIHNob3dSZXRyeSB9ID0gcmVzb2x2ZVN0cmVhbUVycm9yTWVzc2FnZUtleShlcnJvck1lc3NhZ2UsIGVycm9yUmF3TWVzc2FnZSlcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXNvbHZlU3RyZWFtRXJyb3JVc2VyTWVzc2FnZShtZXNzYWdlS2V5LCB0LCB0b2tlbnNVc2VkKVxuXG4gICAgICBjb21taXRUb1Nlc3Npb24oXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgYnVpbGRTdHJlYW1FcnJvckFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHNob3dSZXRyeSxcbiAgICAgICAgICByZXRyeUxhYmVsOiB0KCdjaGF0LnJldHJ5JyksXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcblxuICAgICAgaWYgKCFpc0FjdGl2ZSkge1xuICAgICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5tYXJrQ2hhdEFzVW5yZWFkKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2Vycm9yJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtjb21taXRUb1Nlc3Npb24sIGRyb3BGcm9tU2Vzc2lvbiwgY2xlYXJTZXNzaW9uVGFpbCwgcmVwbGFjZU1lc3NhZ2VzLCB0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU3RyZWFtVXBkYXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKGN0eDogU3RyZWFtQ29udGV4dCwgY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG5cbiAgICAgIC8vIEFzZWd1cmFtb3MgZWwgcGxhY2Vob2xkZXIgdW5hIMO6bmljYSB2ZXogcG9yIHN0cmVhbSwgdGFudG8gZW4gZWwgc3RvcmVcbiAgICAgIC8vIGRlIGxhIHNlc2nDs24gY29tbyBlbiBsYSB2aXN0YSBzaSBlcyBsYSBhY3RpdmEuIEVsIHRleHRvIGVuIHZpdm8gdmlhamFcbiAgICAgIC8vIHBvciBzZXNzaW9uU3RyZWFtaW5nVGV4dCAoZXh0ZXJubyksIHNpbiByZS1yZW5kZXIgZGVsIMOhcmJvbCBjb21wbGV0by5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyRXhpc3RzID0gdXNlU2Vzc2lvbnNTdG9yZVxuICAgICAgICAuZ2V0U3RhdGUoKVxuICAgICAgICAuZ2V0TWVzc2FnZXMoc2Vzc2lvbklkKVxuICAgICAgICAuc29tZShtc2cgPT4gbXNnLmlkID09PSBwbGFjZWhvbGRlcklkKVxuXG4gICAgICBpZiAoIXBsYWNlaG9sZGVyRXhpc3RzKSB7XG4gICAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnN0YXJ0KHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZClcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICAgIGlkOiBwbGFjZWhvbGRlcklkLFxuICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKSkge1xuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBwbGFjZWhvbGRlcklkXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICB9XG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LnNldFRleHQoc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkLCBjb250ZW50KVxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN0cmVhbUZpbmlzaCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChcbiAgICAgIGN0eDogU3RyZWFtQ29udGV4dCxcbiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICAgIHNvdXJjZXM6IGFueSxcbiAgICAgIG1lbW9yeVNlc3Npb25JZDogc3RyaW5nLFxuICAgICAgcmF3QXR0YWNobWVudHM/OiBhbnlbXSB8IG51bGwsXG4gICAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbCxcbiAgICAgIGNvbXBsZXRlZEFnZW50SWQ/OiBzdHJpbmcgfCBudWxsLFxuICAgICAgLyoqIFBvc2ljaW9uYWw6IG1hc3RlciBubyBsbyBjb25zdW1lLCBwZXJvIGByZWFzb25pbmdgIHZpZW5lIGRlc3B1w6lzLiAqL1xuICAgICAgX3Jlc29sdmVkQ29udGV4dD86IGFueSxcbiAgICAgIHJlYXNvbmluZz86IFJlYXNvbmluZ1RyYWNlUGF5bG9hZCB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkIH0gPSBjdHhcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG4gICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGNvbnN0IHRlbXBNZXNzYWdlSWQgPSBwbGFjZWhvbGRlcklkXG4gICAgICAvLyBFbCBwbGFjZWhvbGRlciBzYWxlIGRlbCBzdG9yZSBwb3Itc2VzacOzbiB5YTogZWwgZWZlY3RvIGRlIHJlY29uY2lsaWFjacOzblxuICAgICAgLy8gbG8gdXNhIHBhcmEgZGV0ZWN0YXIgcmVzcHVlc3RhcyBodcOpcmZhbmFzIHkgZGUgYWPDoSBhbCBjb21taXQgcHVlZGUgaGFiZXJcbiAgICAgIC8vIHVuIGF3YWl0LiBMYSB2aXN0YSBsb2NhbCBsbyBzdWVsdGEgbcOhcyBhYmFqbywganVudG8gYWwgY29tbWl0LlxuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnJlbW92ZU1lc3NhZ2Uoc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBub3JtYWxpemVBc3Npc3RhbnRBdHRhY2htZW50cyhyYXdBdHRhY2htZW50cylcblxuICAgICAgLy8gRWwgdHJhY2UgYWN1bXVsYWRvIGVuIHZpdm8gZXN0w6Ega2V5ZWQgcG9yIGVsIHBsYWNlaG9sZGVyOyBsbyBtb3ZlbW9zIGFsXG4gICAgICAvLyBpZCBkZWZpbml0aXZvIHBhcmEgcXVlIGVsIGJsb3F1ZSBkZSByYXpvbmFtaWVudG8gc29icmV2aXZhIGFsIHN3YXAuXG4gICAgICBjb25zdCBmaW5hbE1lc3NhZ2VJZCA9IHJlc29sdmVTdHJlYW1GaW5pc2hGaW5hbE1lc3NhZ2VJZChtZW1vcnlTZXNzaW9uSWQpXG4gICAgICAvLyBQcmVmZXJpciBlbCBzbmFwc2hvdCBlbiB2aXZvIChuYXJyYWNpw7NuIGFuY2xhZGEgYWwgaW5pY2lvKSBzb2JyZSBlbFxuICAgICAgLy8gYGNvbXBsZXRlYCBkZWwgYmFjaywgcXVlIHN1ZWxlIG1hbmRhciBlc2EgbmFycmFjacOzbiBhbCBmaW5hbC5cbiAgICAgIGNvbnN0IGZpbmFsVHJhY2UgPSByZWFzb25pbmdUcmFjZUZvcih0ZW1wTWVzc2FnZUlkKSA/PyBtYXBSZWFzb25pbmdUcmFjZShyZWFzb25pbmcpXG4gICAgICByZWFzb25pbmdTdG9yZS5yZW5hbWUodGVtcE1lc3NhZ2VJZCwgZmluYWxNZXNzYWdlSWQpXG5cbiAgICAgIC8vIFNlc2nDs24gZW4gYmFja2dyb3VuZDogY2VycmFtb3MgbGVhbi4gRWwgYmFja2VuZCB5YSBwZXJzaXN0acOzIGxhXG4gICAgICAvLyByZXNwdWVzdGEsIGFzw60gcXVlIGFsIHZvbHZlciBhIGxhIHNlc2nDs24gc2UgY2FyZ2EgZGVzZGUgYWjDrS4gQXZpc2Ftb3NcbiAgICAgIC8vIHF1ZSB0ZXJtaW7DsyAodW5yZWFkICsgZXZlbnRvIHBhcmEgdG9hc3Qvc29uaWRvKS5cbiAgICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKFxuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBidWlsZFN0cmVhbUZpbmlzaEFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgICAgZmluYWxNZXNzYWdlSWQsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICAgICAgc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICByZWFzb25pbmc6IGZpbmFsVHJhY2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBjbGVhclNlc3Npb25UYWlsKHNlc3Npb25JZClcbiAgICAgICAgZ2V0Q2hhdHNTdG9yZVN0YXRlKCkubWFya0NoYXRBc1VucmVhZChzZXNzaW9uSWQpXG4gICAgICAgIG5vdGlmeVNlc3Npb25GaW5pc2hlZEluQmFja2dyb3VuZChzZXNzaW9uSWQsICdjb21wbGV0ZScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBhY3RpdmVTdHJlYW1DaGF0SWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgICAgY29uc3QgbWFudWFsQXBwcm92YWxGb3JBbmFseXRpY3MgPSBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudFxuICAgICAgY29uc3QgbWFudWFsQXBwcm92YWwgPSBsYXN0TWFudWFsQXBwcm92YWxSZWYuY3VycmVudFxuICAgICAgbGFzdE1hbnVhbEFwcHJvdmFsUmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29udGVudFRvQWRkLFxuICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwLFxuICAgICAgICBlZGl0QWdlbnRGb2xsb3dVcCxcbiAgICAgICAgaG91cnNDaGFyZ2VUb29scyxcbiAgICAgICAgYWZmZWN0ZWRUYXNrSWRzLFxuICAgICAgICBtYW51YWxXYXNUYXNrRWRpdCxcbiAgICAgICAgbWFudWFsV2FzVGFza0RlbGV0ZSxcbiAgICAgICAgd2FzVGFza0VkaXQsXG4gICAgICAgIHdhc1Rhc2tEZWxldGUsXG4gICAgICAgIHdhc0NyZWF0ZUFnZW50QXBwcm92ZWQsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zLFxuICAgICAgfSA9IGF3YWl0IHJlc29sdmVBY3RpdmVTdHJlYW1GaW5pc2hQcm9jZXNzaW5nKHtcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzUmVmLmN1cnJlbnQsXG4gICAgICAgIHRlbXBNZXNzYWdlSWQsXG4gICAgICAgIHRhc2tVcmxSZWdleCxcbiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0Py5pZCxcbiAgICAgICAgcGF0aG5hbWU6IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgZ2V0VGFiVGFza0RlZmF1bHQsXG4gICAgICAgIG11bHRpQWdlbnRzQWNjZXNzOiBCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTKSxcbiAgICAgICAgY29tcGxldGVkQWdlbnRJZCxcbiAgICAgICAgbWFudWFsQXBwcm92YWwsXG4gICAgICAgIGFwcGx5RGFzaGJvYXJkTXV0YXRpb246IChtdXRhdGlvbiwgdGFza0lkcykgPT4ge1xuICAgICAgICAgIGFwcGx5UHJvamVjdERhc2hib2FyZE11dGF0aW9uKG11dGF0aW9uLCB0YXNrSWRzLCB3aW5kb3cubmV3UHJvamVjdERhc2hib2FyZClcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJlc29sdmVDcmVhdGVBZ2VudEhpdGxBbmFseXRpY3NFdmVudHMoe1xuICAgICAgICB3YXNDcmVhdGVBZ2VudEFwcHJvdmVkLFxuICAgICAgICBwZW5kaW5nQWN0aW9ucyxcbiAgICAgICAgbWFudWFsQXBwcm92YWxUb29sTmFtZTogbWFudWFsQXBwcm92YWxGb3JBbmFseXRpY3M/LnRvb2xOYW1lLFxuICAgICAgICBjb21wbGV0ZWRBZ2VudElkLFxuICAgICAgICBhZ2VudFR5cGU6IGdldEhpdGxBbmFseXRpY3NBZ2VudFR5cGUoYWdlbnQpLFxuICAgICAgICBub3JtYWxpemVUb29sTmFtZTogbm9ybWFsaXplSGl0bFRvb2xOYW1lLFxuICAgICAgICBidWlsZEFjdGlvblR5cGVMaXN0OiBidWlsZEhpdGxBY3Rpb25UeXBlTGlzdCxcbiAgICAgIH0pLmZvckVhY2gocGF5bG9hZCA9PiB7XG4gICAgICAgIGV2ZW50KEVWRU5UUy5haUNoYXRIaXRsT3B0aW9uLCBwYXlsb2FkKVxuICAgICAgfSlcblxuICAgICAgY29uc3Qgb3BlblRhc2tQYW5lbElkID0gd2luZG93LnRhc2tQYW5lbD8udGFza0lkXG5cbiAgICAgIGlmIChob3Vyc0NoYXJnZVRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGlzcGF0Y2hNYWlhSG91cnNDaGFyZ2VkKHtcbiAgICAgICAgICBzb3VyY2U6ICdtYWlhJyxcbiAgICAgICAgICB0b29sczogaG91cnNDaGFyZ2VUb29scyxcbiAgICAgICAgICBzZXNzaW9uSWQ6IG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzaG91bGRSZWZldGNoT3BlblRhc2tQYW5lbChcbiAgICAgICAgICBvcGVuVGFza1BhbmVsSWQsXG4gICAgICAgICAgeyB3YXNUYXNrRWRpdCwgd2FzVGFza0RlbGV0ZSB9LFxuICAgICAgICAgIHsgbWFudWFsV2FzVGFza0VkaXQsIG1hbnVhbFdhc1Rhc2tEZWxldGUgfSxcbiAgICAgICAgICBhZmZlY3RlZFRhc2tJZHNcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHdpbmRvdy50YXNrUGFuZWw/LnJlZmV0Y2hUYXNrPy4oKVxuICAgICAgfVxuXG4gICAgICAvLyBTd2FwIHBsYWNlaG9sZGVyIOKGkiBtZW5zYWplIGZpbmFsLiBWYSBlbiBgZmx1c2hTeW5jYCBwb3JxdWUgZWwgbW90b3IgeWFcbiAgICAgIC8vIGRlasOzIGVuY29sYWRhcyBsYXMgZXNjcml0dXJhcyBkZSBmaW4gZGUgc3RyZWFtIChpc1dyaXRpbmcsIGFjdGl2aXR5LFxuICAgICAgLy8gc3RhdHVzKSwgeSBlc2FzIHZpYWphbiBlbiBTeW5jTGFuZSBwb3Igc2VyIGRlIHVuIHN0b3JlIGV4dGVybm8gbWllbnRyYXNcbiAgICAgIC8vIHF1ZSBlc3RvcyBzZXRTdGF0ZSB2aWFqYW4gZW4gRGVmYXVsdExhbmUuIFNpbiBmb3J6YXJsbywgUmVhY3QgcGludGFcbiAgICAgIC8vIHByaW1lcm8gZWwgcGxhY2Vob2xkZXIgeWEgc2luIGluZGljYWRvciBkZSBhY3RpdmlkYWQgKHR1cm5vIDQxcHggbcOhc1xuICAgICAgLy8gYmFqbykgeSByZWNpw6luIH4yNW1zIGRlc3B1w6lzIGVsIG1lbnNhamUgZGVmaW5pdGl2bzogZXNlIHNhbHRvIGRlIGlkYSB5XG4gICAgICAvLyB2dWVsdGEgZXJhIGVsIGZsaWNrZXIgZGUgZmluIGRlIHN0cmVhbS4gQ29uIGVsIGZsdXNoLCB0b2RvIGVsIGZpbiBkZVxuICAgICAgLy8gc3RyZWFtIGVudHJhIGVuIHVuIMO6bmljbyBjb21taXQuXG4gICAgICBmbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCB0ZW1wTWVzc2FnZUlkKVxuICAgICAgICBjb21taXRUb1Nlc3Npb24oXG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIGJ1aWxkU3RyZWFtRmluaXNoQXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnRUb0FkZCxcbiAgICAgICAgICAgIHNvdXJjZXMsXG4gICAgICAgICAgICBhdHRhY2htZW50cyxcbiAgICAgICAgICAgIG1lbW9yeVNlc3Npb25JZCxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcCxcbiAgICAgICAgICAgIHJlYXNvbmluZzogZmluYWxUcmFjZSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9KVxuICAgICAgY2xlYXJTZXNzaW9uVGFpbChzZXNzaW9uSWQpXG5cbiAgICAgIGlmIChjcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoY3JlYXRlQWdlbnRGb2xsb3dVcC5hZ2VudElkKVxuICAgICAgICAgIC50aGVuKGNoYXRBZ2VudCA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGFnZW50OiBjaGF0QWdlbnQgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNYW5hZ2VyXSBObyBzZSBwdWRvIGHDsWFkaXIgZWwgYWdlbnRlIHJlY2nDqW4gY3JlYWRvIGFsIGxpc3RhZG8nLCBlcnIpXG4gICAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGVkaXRBZ2VudEZvbGxvd1VwPy5hZ2VudElkKSB7XG4gICAgICAgIGZldGNoQWdlbnREZXRhaWwoZWRpdEFnZW50Rm9sbG93VXAuYWdlbnRJZClcbiAgICAgICAgICAudGhlbihjaGF0QWdlbnQgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgYWdlbnQ6IGNoYXRBZ2VudCB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1hbmFnZXJdIE5vIHNlIHB1ZG8gcmVmcmVzY2FyIGVsIGFnZW50ZSBlZGl0YWRvJywgZXJyKVxuICAgICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHJ5U25hcHNob3RSZWYuY3VycmVudCA9IG51bGxcblxuICAgICAgY29uc3QgeyBpc0NoYXRWaWV3VmlzaWJsZSwgbWFya0NoYXRBc1JlYWQgfSA9IGdldENoYXRzU3RvcmVTdGF0ZSgpXG4gICAgICBpZiAoc2hvdWxkTWFya0NoYXRSZWFkQWZ0ZXJTdHJlYW1GaW5pc2goaXNBY3RpdmUsIGlzQ2hhdFZpZXdWaXNpYmxlKSkge1xuICAgICAgICBhd2FpdCBtYXJrQ2hhdEFzUmVhZChzZXNzaW9uSWQsIHsgZm9yY2U6IHRydWUgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZERpc3BhdGNoRmlyc3RTZXNzaW9uUmVmZXRjaChmaXJzdFRpbWVSZWYuY3VycmVudCkpIHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ3JlZmV0Y2gtc2Vzc2lvbicpKVxuICAgICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBbY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGNsZWFyU2Vzc2lvblRhaWwsIHByb2plY3QsIGdldFRhYlRhc2tEZWZhdWx0LCBldmVudCwgYWdlbnRdXG4gIClcblxuICAvLyBgcGFydGlhbFRleHRgIGxvIHJlc2NhdGEgYHN0b3BTdHJlYW1gIGFudGVzIGRlIGxpbXBpYXIgZWwgc3RvcmUgZXh0ZXJubzogZWwgdGV4dG8gZW4gdml2b1xuICAvLyBubyB2aXZlIGVuIGBtZXNzYWdlc2AsIGFzw60gcXVlIHNpbiBlc3RvIGxhIHJlc3B1ZXN0YSBhIG1lZGlhcyBkZXNhcGFyZWNlIGRlIHBhbnRhbGxhIGF1bnF1ZVxuICAvLyBlbCBiYWNrZW5kIHPDrSBsYSBoYXlhIHBlcnNpc3RpZG8uXG4gIGNvbnN0IGhhbmRsZVN0cmVhbVN0b3AgPSB1c2VDYWxsYmFjayhcbiAgICAocGFydGlhbFRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgLy8gRWwgc3RvcCBzaWVtcHJlIGFwbGljYSBhIGxhIHNlc2nDs24gYWN0aXZhIChib3TDs24gZGVsIGlucHV0IHZpc2libGUpLlxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgICBjbGVhclN0cmVhbVVpUmVmLmN1cnJlbnQoKVxuICAgICAgY29uc3QgdGVtcE1lc3NhZ2VJZCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudClcbiAgICAgIGNvbnN0IHsgZmluYWxNZXNzYWdlSWQsIGNhbmNlbGxlZE1lc3NhZ2VJZCB9ID0gcmVzb2x2ZVN0cmVhbVN0b3BNZXNzYWdlSWRzKGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudClcbiAgICAgIGNvbnN0IHN0b3BwZWRUcmFjZSA9IHJlYXNvbmluZ1RyYWNlRm9yKHRlbXBNZXNzYWdlSWQpXG5cbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgZHJvcEZyb21TZXNzaW9uKHNlc3Npb25JZCwgdGVtcE1lc3NhZ2VJZClcblxuICAgICAgaWYgKHNob3VsZFByZXNlcnZlUmVhc29uaW5nT25TdHJlYW1TdG9wKHN0b3BwZWRUcmFjZSkpIHtcbiAgICAgICAgcmVhc29uaW5nU3RvcmUuZmluaXNoKHRlbXBNZXNzYWdlSWQsIG51bGwpXG4gICAgICAgIHJlYXNvbmluZ1N0b3JlLnJlbmFtZSh0ZW1wTWVzc2FnZUlkLCBmaW5hbE1lc3NhZ2VJZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlYXNvbmluZ1N0b3JlLnJlbW92ZSh0ZW1wTWVzc2FnZUlkKVxuICAgICAgfVxuXG4gICAgICBpZiAocGFydGlhbFRleHQpIHtcbiAgICAgICAgY29tbWl0VG9TZXNzaW9uKFxuICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICBidWlsZFN0cmVhbVN0b3BQYXJ0aWFsQXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIHBhcnRpYWxUZXh0LFxuICAgICAgICAgICAgc3RvcHBlZFRyYWNlLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29tbWl0VG9TZXNzaW9uKFxuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIGJ1aWxkU3RyZWFtU3RvcENhbmNlbGxlZEFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGNhbmNlbGxlZE1lc3NhZ2VJZCxcbiAgICAgICAgICBjYW5jZWxsZWRMYWJlbDogdCgnY2hhdC5jYW5jZWxsZWQnKSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIGNsZWFyU2Vzc2lvblRhaWwoc2Vzc2lvbklkKVxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcmV0cnlTbmFwc2hvdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIH0sXG4gICAgW2NvbW1pdFRvU2Vzc2lvbiwgZHJvcEZyb21TZXNzaW9uLCBjbGVhclNlc3Npb25UYWlsLCB0XVxuICApXG5cbiAgY29uc3QgaGFuZGxlQXBwcm92YWxSZXF1aXJlZCA9IHVzZUNhbGxiYWNrKFxuICAgIChjdHg6IFN0cmVhbUNvbnRleHQsIGFwcHJvdmFsOiBBcHByb3ZhbFJlcXVlc3QsIGFjY3VtdWxhdGVkQ29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb25JZCwgcGxhY2Vob2xkZXJJZCB9ID0gY3R4XG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGFjdGl2ZVZpZXcuaXMoc2Vzc2lvbklkKVxuXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICBkcm9wRnJvbVNlc3Npb24oc2Vzc2lvbklkLCBwbGFjZWhvbGRlcklkKVxuXG4gICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBzdHJlYW1pbmdQbGFjZWhvbGRlcklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSByZXNvbHZlSGl0bEV4ZWN1dGlvbkNvbnRleHQoYXBwcm92YWwsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZi5jdXJyZW50ID0gaGl0bENvbnRleHRcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGl0bE91dGNvbWUgPSByZXNvbHZlSGl0bEFwcHJvdmFsUmVxdWlyZWRPdXRjb21lKGFwcHJvdmFsKVxuXG4gICAgICAvLyBQcmVhcHJvYmFkbzogcG9yIGRldGVjY2nDs24gbWFudWFsIG8gcG9yIGF1dG8tYXBwcm92ZS4gRW4gYW1ib3MgY2Fzb3MgZWxcbiAgICAgIC8vIHN0cmVhbSBjb250aW7DumEgeSBubyBoYXkgcXVlIHBpbnRhciBsYSBjYWphIGRlIGFwcm9iYWNpw7NuLlxuICAgICAgaWYgKGhpdGxPdXRjb21lLnR5cGUgPT09ICdza2lwLXVpJykge1xuICAgICAgICB0cmFja01hbnVhbEhpdGxFdmVudHMoXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgeyBpbXByZXNzaW9uOiBFVkVOVFMuYWlDaGF0SGl0bCwgb3B0aW9uOiBFVkVOVFMuYWlDaGF0SGl0bE9wdGlvbiB9LFxuICAgICAgICAgIGFnZW50LFxuICAgICAgICAgIGFwcHJvdmFsLFxuICAgICAgICAgIHRyYWNrZWRNYW51YWxIaXRsS2V5c1JlZi5jdXJyZW50LFxuICAgICAgICAgIHJlc29sdmVIaXRsU2tpcFJlc29sdXRpb25Tb3VyY2UoYXBwcm92YWwpXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBza2lwcGVkTWFudWFsQXBwcm92YWwgPSByZXNvbHZlU2tpcHBlZEhpdGxNYW51YWxBcHByb3ZhbChhcHByb3ZhbClcbiAgICAgICAgaWYgKHNraXBwZWRNYW51YWxBcHByb3ZhbCAmJiBpc0FjdGl2ZSkge1xuICAgICAgICAgIGxhc3RNYW51YWxBcHByb3ZhbFJlZi5jdXJyZW50ID0gc2tpcHBlZE1hbnVhbEFwcHJvdmFsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGFwcHJvdmFsTWVzc2FnZUlkIH0gPSBoaXRsT3V0Y29tZVxuICAgICAgcmVhc29uaW5nU3RvcmUucmVuYW1lKHBsYWNlaG9sZGVySWQsIGFwcHJvdmFsTWVzc2FnZUlkKVxuICAgICAgY29uc3QgYXBwcm92YWxUcmFjZSA9IG1hcFJlYXNvbmluZ1RyYWNlKGFwcHJvdmFsLnJlYXNvbmluZykgPz8gcmVhc29uaW5nVHJhY2VGb3IoYXBwcm92YWxNZXNzYWdlSWQpXG4gICAgICBjb21taXRUb1Nlc3Npb24oXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgYnVpbGRIaXRsQXBwcm92YWxQZW5kaW5nTWVzc2FnZSh7XG4gICAgICAgICAgYXBwcm92YWxNZXNzYWdlSWQsXG4gICAgICAgICAgYWNjdW11bGF0ZWRDb250ZW50LFxuICAgICAgICAgIGFwcHJvdmFsLFxuICAgICAgICAgIHJlYXNvbmluZzogYXBwcm92YWxUcmFjZSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRDaGF0c1N0b3JlU3RhdGUoKS5tYXJrQ2hhdEFzVW5yZWFkKHNlc3Npb25JZClcbiAgICAgICAgbm90aWZ5U2Vzc2lvbkZpbmlzaGVkSW5CYWNrZ3JvdW5kKHNlc3Npb25JZCwgJ2FwcHJvdmFsX3JlcXVpcmVkJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudCwgY29tbWl0VG9TZXNzaW9uLCBkcm9wRnJvbVNlc3Npb24sIGV2ZW50XVxuICApXG5cbiAgY29uc3Qge1xuICAgIGFza01haWEsXG4gICAgcmV0cnlDb21wbGV0aW9uLFxuICAgIGlzTG9hZGluZzogd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICB1cGRhdGVTdHJlYW1BY3Rpdml0eSxcbiAgICBzdG9wU3RyZWFtaW5nLFxuICB9ID0gdXNlT3JjaGVzdHJhdG9yU3RyZWFtKHtcbiAgICBhY3RpdmVTZXNzaW9uSWQsXG4gICAgb25FcnJvcjogaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgb25TdHJlYW1VcGRhdGU6IGhhbmRsZVN0cmVhbVVwZGF0ZSxcbiAgICBvbkZpbmlzaFN0cmVhbTogaGFuZGxlU3RyZWFtRmluaXNoLFxuICAgIG9uU3RvcDogaGFuZGxlU3RyZWFtU3RvcCxcbiAgICBvbkFwcHJvdmFsUmVxdWlyZWQ6IGhhbmRsZUFwcHJvdmFsUmVxdWlyZWQsXG4gICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYsXG4gIH0pXG5cbiAgY2xlYXJTdHJlYW1VaVJlZi5jdXJyZW50ID0gKCkgPT4ge1xuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5KG51bGwpXG4gICAgc2V0QWN0aXZlTG9hZGluZ3Moe30pXG4gICAgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYuY3VycmVudCA9IG51bGxcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRQcm9qZWN0ID0gcHJvamVjdFxuXG4gIGNvbnN0IHNlbmRNZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHNPck9wdGlvbnM/OiBBdHRhY2htZW50RmlsZVtdIHwgU2VuZE1lc3NhZ2VPcHRpb25zLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgY29uc3Qgd2lsbFN0YXJ0TmV3U3RyZWFtID0gIXNlc3Npb25TdHJlYW1NYW5hZ2VyLmlzQWN0aXZlKGN1cnJlbnRDaGF0SWQuY3VycmVudClcbiAgICAgIGNvbnN0IHNlbmRHYXRlID0gcmVzb2x2ZVNlbmRNZXNzYWdlR2F0ZSh7XG4gICAgICAgIGlzUHJvY2Vzc2luZzogaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQsXG4gICAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgICAgICB3aWxsU3RhcnROZXdTdHJlYW0sXG4gICAgICAgIGFjdGl2ZVN0cmVhbUNvdW50OiBzZXNzaW9uU3RyZWFtTWFuYWdlci5nZXRBY3RpdmVDb3VudCgpLFxuICAgICAgICBtYXhDb25jdXJyZW50OiBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TLFxuICAgICAgfSlcbiAgICAgIGlmIChzZW5kR2F0ZSA9PT0gJ2NvbmN1cnJlbmN5Jykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoc2VuZEdhdGUgPT09ICdidXN5Jykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhdHRhY2htZW50cywgb3B0aW9ucyB9ID0gbm9ybWFsaXplU2VuZE1lc3NhZ2VBcmdzKGF0dGFjaG1lbnRzT3JPcHRpb25zKVxuICAgICAgY29uc3QgcGF5bG9hZEZpZWxkcyA9IHJlc29sdmVTZW5kTWVzc2FnZVBheWxvYWRGaWVsZHMob3B0aW9ucywge1xuICAgICAgICBmYXFJZCxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQsXG4gICAgICAgIG1lbnRpb25zLFxuICAgICAgICBmdWFJZCxcbiAgICAgICAgc2NJZCxcbiAgICAgIH0pXG4gICAgICBjb25zdCBjb250ZXh0TWVzc2FnZTogQ29udGV4dE1lc3NhZ2UgfCB1bmRlZmluZWQgPSBidWlsZENvbnRleHRNZXNzYWdlKHBheWxvYWRGaWVsZHMubWVudGlvbnMpXG4gICAgICBjb25zdCBkaXNwbGF5TWVzc2FnZSA9IGZvcm1hdFF1aWNrQWN0aW9uTWVzc2FnZUZvckRpc3BsYXkobWVzc2FnZSwge1xuICAgICAgICBmdWFJZDogcGF5bG9hZEZpZWxkcy5mdWFJZCxcbiAgICAgICAgc2NJZDogcGF5bG9hZEZpZWxkcy5zY0lkLFxuICAgICAgfSlcblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBzZXRBY3RpdmVDaGF0SWQoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgICAgY29uc3QgbmV3TWVzc2FnZUlkID0gdXVpZHY0KClcbiAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IG5ld01lc3NhZ2VJZFxuICAgICAgY3VycmVudFVzZXJRdWVzdGlvbi5jdXJyZW50ID0gbWVzc2FnZVxuXG4gICAgICBpZiAoIXJlcG9ydGVkRXZlbnQuY3VycmVudCkge1xuICAgICAgICBldmVudChFVkVOVFMucG1BaVR5cGVkVGV4dClcbiAgICAgICAgcmVwb3J0ZWRFdmVudC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICAvLyBWZXJpZmljYXIgc2kgZWwgY29udGV4dG8gZ2xvYmFsIGVzdMOhIGRlc2FjdHVhbGl6YWRvXG4gICAgICBjb25zdCBsYXN0TWVzc2FnZVdpdGhQcm9qZWN0ID0gbWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobXNnID0+IG1zZy5wcm9qZWN0SWQpLmF0KC0xKVxuXG4gICAgICBjb25zdCBjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMgPSByZXNvbHZlTGFzdE1lc3NhZ2VBZ2VudElkKG1lc3NhZ2VzUmVmLmN1cnJlbnQpXG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGN1cnJlbnRDaGF0SWQuY3VycmVudFxuICAgICAgY29uc3Qge1xuICAgICAgICBjaGlwc1Byb2plY3Q6IGN0eENoaXBzUHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIHRhc2s6IGN0eFRhc2ssXG4gICAgICB9ID0gY29udGV4dFJlZi5jdXJyZW50XG5cbiAgICAgIGVuc3VyZVNlc3Npb25JblNpZGViYXIoe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHRpdGxlOiBidWlsZFNpZGViYXJTZXNzaW9uVGl0bGUoZGlzcGxheU1lc3NhZ2UpLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgYWdlbnRJZDogY3VycmVudEFnZW50RnJvbU1lc3NhZ2VzIHx8IGFnZW50Py5pZCxcbiAgICAgICAgcHJvamVjdDogY3R4UHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBjdHhDbGllbnQsXG4gICAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgfSlcblxuICAgICAgLy8gTm8gYWdyZWdhciBwcm9qZWN0SWQgYWwgbWVuc2FqZSBkZWwgdXN1YXJpbyAtIHNlIGRldGVybWluYXLDoSBkZXNwdcOpc1xuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwge1xuICAgICAgICBpZDogcmVzb2x2ZVVzZXJRdWVzdGlvbk1lc3NhZ2VJZChjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQpLFxuICAgICAgICBtZXNzYWdlOiBkaXNwbGF5TWVzc2FnZSxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogY3VycmVudFVzZXIsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5VU0VSLFxuICAgICAgICBzb3VyY2VzOiBhdHRhY2htZW50cyxcbiAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgfSlcblxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcblxuICAgICAgY29uc3Qgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IHN0cmVhbWluZ1BsYWNlaG9sZGVySWRcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gc2Vzc2lvbklkXG4gICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5zdGFydChzZXNzaW9uSWQsIHN0cmVhbWluZ1BsYWNlaG9sZGVySWQpXG4gICAgICBjb21taXRUb1Nlc3Npb24oc2Vzc2lvbklkLCB7XG4gICAgICAgIGlkOiBzdHJlYW1pbmdQbGFjZWhvbGRlcklkLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcsIG5hbWU6IGFnZW50Py5uYW1lIHx8ICdBc3Npc3RhbnQnIH0sXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICB9KVxuXG4gICAgICBsZXQgZmluYWxNZXNzYWdlID0gbWVzc2FnZVxuXG4gICAgICBmaW5hbE1lc3NhZ2UgPSByZXNvbHZlUmVudGFiaWxpZGFkUHJvamVjdEZhcU1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHQoJ3FhLml0ZW1zLnJlbnRhYmlsaWRhZF9wcm95ZWN0bycpLFxuICAgICAgICBvcHRpb25zLnByb2plY3RDaGFuZ2VkPy5pbmNvbWVUeXBlIHx8IGNvbnRleHRSZWYuY3VycmVudC5wcm9qZWN0Py5pbmNvbWVUeXBlXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBidWlsZENoYXRIaXN0b3J5RnJvbU1lc3NhZ2VzKG1lc3NhZ2VzUmVmLmN1cnJlbnQsIGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG5cbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlUHJvamVjdElkID0gbGFzdE1lc3NhZ2VXaXRoUHJvamVjdD8ucHJvamVjdElkXG4gICAgICBjb25zdCBwcm9qZWN0VG9SZXF1ZXN0ID0gcmVzb2x2ZVByb2plY3RUb1JlcXVlc3QoY3R4Q2hpcHNQcm9qZWN0LCBsYXN0TWVzc2FnZVByb2plY3RJZClcblxuICAgICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmZXRjaFByb2plY3RzKFtwcm9qZWN0VG9SZXF1ZXN0XSlcblxuICAgICAgY29uc3QgcGF5bG9hZERhdGEgPSBidWlsZE1haWFTdHJlYW1SZXF1ZXN0UGF5bG9hZCh7XG4gICAgICAgIG1lc3NhZ2U6IGZpbmFsTWVzc2FnZSxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBhdXRoVXNlcixcbiAgICAgICAgY2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICBhZ2VudElkOiByZXNvbHZlQWdlbnRJZEZvclN0cmVhbShjdXJyZW50QWdlbnRGcm9tTWVzc2FnZXMsIGFnZW50Py5pZCksXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBCb29sZWFuKGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQpLFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IEJvb2xlYW4oaXNEZWVwU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQpLFxuICAgICAgICBpc0F1dG9BcHByb3ZlQWN0aXZlOiBCb29sZWFuKGlzQXV0b0FwcHJvdmVBY3RpdmVSZWYuY3VycmVudCksXG4gICAgICAgIGN0eFByb2plY3QsXG4gICAgICAgIGN0eENsaWVudCxcbiAgICAgICAgY3R4VGFzayxcbiAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3RzPy5sZW5ndGggPyBwcm9qZWN0c1swXS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICBhdHRhY2htZW50cyxcbiAgICAgICAgZmFxSWQ6IHBheWxvYWRGaWVsZHMuZmFxSWQsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiBwYXlsb2FkRmllbGRzLmFnZW50U3VnZ2VzdGlvbklkLFxuICAgICAgICBmdWFJZDogcGF5bG9hZEZpZWxkcy5mdWFJZCxcbiAgICAgICAgc2NJZDogcGF5bG9hZEZpZWxkcy5zY0lkLFxuICAgICAgICBhZ2VudEVudGl0eTogYWdlbnQ/LmVudGl0eSxcbiAgICAgICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICAgICAgYWdlbnRFbW9qaTogYWdlbnQ/LmVtb2ppLFxuICAgICAgICBjb250ZXh0TWVzc2FnZSxcbiAgICAgICAgY29udGV4dERhdGE6IHBheWxvYWRGaWVsZHMuY29udGV4dERhdGEsXG4gICAgICB9KVxuXG4gICAgICBhc2tNYWlhKHBheWxvYWREYXRhKVxuICAgIH0sXG4gICAgW1xuICAgICAgYWRkTWVzc2FnZSxcbiAgICAgIGNvbW1pdFRvU2Vzc2lvbixcbiAgICAgIGV2ZW50LFxuICAgICAgYXNrTWFpYSxcbiAgICAgIHByb2plY3QsXG4gICAgICBjbGllbnQsXG4gICAgICB0YXNrLFxuICAgICAgY2hpcHNQcm9qZWN0LFxuICAgICAgYXV0aFVzZXIsXG4gICAgICBhZ2VudCxcbiAgICAgIHQsXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBdXG4gIClcblxuICBjb25zdCBjaGFuZ2VQcm9qZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBpZiAoc2hvdWxkVXBkYXRlUHJvamVjdE9uQ2hhbmdlKG9wdGlvbi5pZCwgcHJvamVjdD8uaWQpKSB7XG4gICAgICAgIHNldFByb2plY3Qob3B0aW9uKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVzZW5kQWZ0ZXJQcm9qZWN0Q2hhbmdlKGN1cnJlbnRVc2VyUXVlc3Rpb24uY3VycmVudCwgcHJvamVjdCkpIHtcbiAgICAgICAgY29uc3QgaGlzdG9yeSA9IGJ1aWxkQ2hhdEhpc3RvcnlGcm9tTWVzc2FnZXMobWVzc2FnZXNSZWYuY3VycmVudCwgYXV0aFVzZXIuaWQudG9TdHJpbmcoKSlcblxuICAgICAgICBhc2tNYWlhKFxuICAgICAgICAgIGJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkRm9yUHJvamVjdENoYW5nZSh7XG4gICAgICAgICAgICBtZXNzYWdlOiBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQsXG4gICAgICAgICAgICBoaXN0b3J5LFxuICAgICAgICAgICAgcHJvamVjdDogb3B0aW9uLFxuICAgICAgICAgICAgYXV0aFVzZXIsXG4gICAgICAgICAgICBjaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuICAgICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCB8fCAnJyxcbiAgICAgICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBCb29sZWFuKGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQpLFxuICAgICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBCb29sZWFuKGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50KSxcbiAgICAgICAgICAgIGlzQXV0b0FwcHJvdmVBY3RpdmU6IEJvb2xlYW4oaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50KSxcbiAgICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudD8uZW50aXR5LFxuICAgICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudD8udHlwZSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBbcHJvamVjdCwgc2V0UHJvamVjdCwgYXNrTWFpYSwgYXV0aFVzZXIsIGlzV2ViU2VhcmNoQWN0aXZlLCBhZ2VudF1cbiAgKVxuXG4gIGNvbnN0IHJldHJ5TWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gY3VycmVudENoYXRJZC5jdXJyZW50XG4gICAgICBjb25zdCByZXRyeUJsb2NrID0gcmVzb2x2ZVJldHJ5QmxvY2tSZWFzb24oe1xuICAgICAgICBpc1Byb2Nlc3Npbmc6IGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50LFxuICAgICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICAgICAgaXNTZXNzaW9uU3RyZWFtQWN0aXZlOiBzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShzZXNzaW9uSWQpLFxuICAgICAgICBhY3RpdmVTdHJlYW1Db3VudDogc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSxcbiAgICAgICAgbWF4Q29uY3VycmVudDogTUFYX0NPTkNVUlJFTlRfU1RSRUFNUyxcbiAgICAgIH0pXG4gICAgICBpZiAocmV0cnlCbG9jayA9PT0gJ2NvbmN1cnJlbmN5Jykge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnc25hY2tiYXItZXZlbnQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAocmV0cnlCbG9jayAhPSBudWxsKSByZXR1cm5cblxuICAgICAgY29uc3QgcHJldmlvdXNNZXNzYWdlcyA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHVzZXJNZXNzYWdlID0gZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkocHJldmlvdXNNZXNzYWdlcywgbWVzc2FnZSlcbiAgICAgIGNvbnN0IHJldHJ5RWxpZ2liaWxpdHkgPSByZXNvbHZlUmV0cnlFbGlnaWJpbGl0eShwcmV2aW91c01lc3NhZ2VzLCBtZXNzYWdlLCB1c2VyTWVzc2FnZSlcbiAgICAgIGlmICghcmV0cnlFbGlnaWJpbGl0eS5lbGlnaWJsZSB8fCAhdXNlck1lc3NhZ2UpIHJldHVyblxuXG4gICAgICBjb25zdCB7IHR1cm5JZCwgdXNlT3JjaGVzdHJhdG9yRmFsbGJhY2sgfSA9IHJldHJ5RWxpZ2liaWxpdHlcblxuICAgICAgY29uc3QgdHJ1bmNhdGVkID0gbWVzc2FnZXNXaXRob3V0UmV0cmllZFR1cm4ocHJldmlvdXNNZXNzYWdlcywgbWVzc2FnZSlcblxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBwcmV2aW91c01lc3NhZ2VzXG4gICAgICBzZXRBY3RpdmVDaGF0SWQoc2Vzc2lvbklkKVxuXG4gICAgICBjb25zdCBuZXdNZXNzYWdlSWQgPSB1dWlkdjQoKVxuICAgICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gbmV3TWVzc2FnZUlkXG4gICAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSB1c2VyTWVzc2FnZS5tZXNzYWdlXG4gICAgICBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkID0gYGFuc3dlci0ke25ld01lc3NhZ2VJZH0tc3RyZWFtaW5nYFxuICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFxuICAgICAgYWN0aXZlU3RyZWFtQ2hhdElkUmVmLmN1cnJlbnQgPSBzZXNzaW9uSWRcblxuICAgICAgY29uc3QgcGxhY2Vob2xkZXI6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICBpZDogc3RyZWFtaW5nUGxhY2Vob2xkZXJJZCxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIGRhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnLCBuYW1lOiBhZ2VudD8ubmFtZSB8fCAnQXNzaXN0YW50JyB9LFxuICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgfVxuICAgICAgY29uc3QgbmV4dE1lc3NhZ2VzID0gWy4uLnRydW5jYXRlZCwgcGxhY2Vob2xkZXJdXG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbmV4dE1lc3NhZ2VzXG4gICAgICByZXBsYWNlTWVzc2FnZXMobmV4dE1lc3NhZ2VzKVxuICAgICAgc2Vzc2lvblN0cmVhbWluZ1RleHQuc3RhcnQoc2Vzc2lvbklkLCBzdHJlYW1pbmdQbGFjZWhvbGRlcklkKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IGxhc3RNZXNzYWdlV2l0aFByb2plY3QgPSB0cnVuY2F0ZWQuZmlsdGVyKG1zZyA9PiBtc2cucHJvamVjdElkKS5hdCgtMSlcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIGxhc3RNZXNzYWdlV2l0aFByb2plY3Q/LnByb2plY3RJZClcbiAgICAgIGNvbnN0IGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyA9IHRydW5jYXRlZC5hdCgtMSk/LmFnZW50SWQgfHwgbWVzc2FnZS5hZ2VudElkXG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IHJlc29sdmVSZXRyeVVzZXJBdHRhY2htZW50cyh1c2VyTWVzc2FnZSlcblxuICAgICAgY29uc3QgcmVwbGF5VmlhT3JjaGVzdHJhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gYnVpbGRDaGF0SGlzdG9yeUZyb21NZXNzYWdlcyh0cnVuY2F0ZWQsIGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG4gICAgICAgIGNvbnN0IHByb2plY3RzID0gcHJvamVjdFRvUmVxdWVzdCA/IGF3YWl0IGZldGNoUHJvamVjdHMoW3Byb2plY3RUb1JlcXVlc3RdKSA6IG51bGxcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhc2tNYWlhKFxuICAgICAgICAgIGJ1aWxkTWFpYVN0cmVhbVJlcXVlc3RQYXlsb2FkKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHVzZXJNZXNzYWdlLm1lc3NhZ2UsXG4gICAgICAgICAgICBoaXN0b3J5LFxuICAgICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICAgICAgYXV0aFVzZXIsXG4gICAgICAgICAgICBjaGF0SWQ6IHNlc3Npb25JZCxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogbmV3TWVzc2FnZUlkLFxuICAgICAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSB8fCAnJyxcbiAgICAgICAgICAgIGFnZW50SWQ6IHJlc29sdmVBZ2VudElkRm9yU3RyZWFtKGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcywgYWdlbnQ/LmlkKSxcbiAgICAgICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBCb29sZWFuKGlzV2ViU2VhcmNoQWN0aXZlUmVmLmN1cnJlbnQpLFxuICAgICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBCb29sZWFuKGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50KSxcbiAgICAgICAgICAgIGlzQXV0b0FwcHJvdmVBY3RpdmU6IEJvb2xlYW4oaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50KSxcbiAgICAgICAgICAgIGN0eFByb2plY3QsXG4gICAgICAgICAgICBjdHhDbGllbnQsXG4gICAgICAgICAgICBjdHhUYXNrLFxuICAgICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3RzPy5sZW5ndGggPyBwcm9qZWN0c1swXS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0YWNobWVudHMsXG4gICAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnQ/LmVudGl0eSxcbiAgICAgICAgICAgIGFnZW50VHlwZTogYWdlbnQ/LnR5cGUsXG4gICAgICAgICAgICBhZ2VudEVtb2ppOiBhZ2VudD8uZW1vamksXG4gICAgICAgICAgICBjb250ZXh0TWVzc2FnZTogdXNlck1lc3NhZ2UuY29udGV4dE1lc3NhZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghcmVzdWx0LnN0YXJ0ZWQpIHtcbiAgICAgICAgICByZXRyeVNuYXBzaG90UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgICAgbWVzc2FnZXNSZWYuY3VycmVudCA9IHByZXZpb3VzTWVzc2FnZXNcbiAgICAgICAgICByZXBsYWNlTWVzc2FnZXMocHJldmlvdXNNZXNzYWdlcylcbiAgICAgICAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihzZXNzaW9uSWQpXG4gICAgICAgICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIGlzUHJvY2Vzc2luZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gJ2xpbWl0Jykge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgc2hvdzogdHJ1ZSwgc2V2ZXJpdHk6ICdpbmZvJywgbWVzc2FnZTogdCgnY2hhdC50b29NYW55QWN0aXZlU2Vzc2lvbnMnKSB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXNlT3JjaGVzdHJhdG9yRmFsbGJhY2sgfHwgIXR1cm5JZCkge1xuICAgICAgICBhd2FpdCByZXBsYXlWaWFPcmNoZXN0cmF0b3IoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV0cnlDb21wbGV0aW9uKHtcbiAgICAgICAgY2hhdElkOiBzZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogbmV3TWVzc2FnZUlkLFxuICAgICAgICBtZW1vcnlTZXNzaW9uSWQ6IHR1cm5JZCxcbiAgICAgICAgbGFuZzogYXV0aFVzZXIubGFuZyxcbiAgICAgICAgYWdlbnRJZDogU3RyaW5nKGN1cnJlbnRBZ2VudEZyb21NZXNzYWdlcyB8fCBhZ2VudD8uaWQgfHwgJycpLFxuICAgICAgICBhZ2VudE5hbWU6IGFnZW50Py5uYW1lIHx8ICcnLFxuICAgICAgICAuLi4oYWdlbnQ/LnR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlOiBhZ2VudC50eXBlIH0gOiB7fSksXG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBpc1dlYlNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGlzRGVlcFNlYXJjaEFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4ocHJvamVjdFRvUmVxdWVzdCA/IHsgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0IH0gOiB7fSksXG4gICAgICAgIC4uLnJlc29sdmVDbGllbnRQYXlsb2FkKGN0eENsaWVudCwgY3R4UHJvamVjdCksXG4gICAgICAgIC4uLihjdHhUYXNrPy5pZCAhPSBudWxsID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSB9IDoge30pLFxuICAgICAgfSlcblxuICAgICAgaWYgKHJlc3VsdC5zdGFydGVkKSByZXR1cm5cblxuICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICd0dXJuX25vdF9mb3VuZCcpIHtcbiAgICAgICAgYXdhaXQgcmVwbGF5VmlhT3JjaGVzdHJhdG9yKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJldHJ5U25hcHNob3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBwcmV2aW91c01lc3NhZ2VzXG4gICAgICByZXBsYWNlTWVzc2FnZXMocHJldmlvdXNNZXNzYWdlcylcbiAgICAgIHNlc3Npb25TdHJlYW1pbmdUZXh0LmNsZWFyKHNlc3Npb25JZClcbiAgICAgIHN0cmVhbWluZ1BsYWNlaG9sZGVySWRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgaXNQcm9jZXNzaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdsaW1pdCcpIHtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3NuYWNrYmFyLWV2ZW50Jywge1xuICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICByZXBsYWNlTWVzc2FnZXMsXG4gICAgICByZXRyeUNvbXBsZXRpb24sXG4gICAgICBhc2tNYWlhLFxuICAgICAgZmV0Y2hQcm9qZWN0cyxcbiAgICAgIGF1dGhVc2VyLFxuICAgICAgYWdlbnQsXG4gICAgICB0LFxuICAgICAgc2V0QWN0aXZlQ2hhdElkLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUZlZWRiYWNrID0gdXNlQ2FsbGJhY2soYXN5bmMgKGZlZWRiYWNrUHJvcDogRmVlZGJhY2ssIGNoYXRNZXNzYWdlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFpYS5DaGF0cy53YXNIZWxwZnVsQ2hhdChjaGF0TWVzc2FnZUlkLCBmZWVkYmFja1Byb3AgPT09IEZlZWRiYWNrLlRIVU1CU19VUClcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1JlZi5jdXJyZW50Lm1hcChtZXNzYWdlID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgPT09IGNoYXRNZXNzYWdlSWQgJiYgbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50Jykge1xuICAgICAgICAgIHJldHVybiB7IC4uLm1lc3NhZ2UsIHdhc0hlbHBmdWw6IGZlZWRiYWNrUHJvcCA9PT0gRmVlZGJhY2suVEhVTUJTX1VQIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZVxuICAgICAgfSlcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoXG4gICAgICB0aHJlYWRJZHM6IHN0cmluZ1tdLFxuICAgICAgZGVjaXNpb246ICdhcHByb3ZlJyB8ICdyZWplY3QnLFxuICAgICAgZWRpdGVkQWN0aW9ucz86IEFycmF5PHsgdG9vbF9uYW1lOiBzdHJpbmc7IGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICAgICAgbWV0YWRhdGE/OiB7IHRvb2xfZ3JvdXBfc2x1Z3M6IHN0cmluZ1tdIH1cbiAgICApID0+IHtcbiAgICAgIGlmICghdGhyZWFkSWRzPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gdGhyZWFkX2lkcyBwcm92aWRlZCBmb3IgYXBwcm92YWwgZGVjaXNpb24nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmQgPSBmaW5kTWVzc2FnZVdpdGhBcHByb3ZhbEJ5VGhyZWFkSWRzKFxuICAgICAgICB0aHJlYWRJZHMsXG4gICAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQsXG4gICAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5tZXNzYWdlcyxcbiAgICAgICAgYWN0aXZlVmlldy5nZXQoKVxuICAgICAgKVxuICAgICAgaWYgKCFmb3VuZD8ubWVzc2FnZS5hcHByb3ZhbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRyw7MgbWVuc2FqZSBjb24gYXBwcm92YWwgcGFyYSB0aHJlYWRfaWRzOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgbWVzc2FnZTogbWVzc2FnZVdpdGhBcHByb3ZhbCwgc2Vzc2lvbklkOiBmb3VuZFNlc3Npb25JZCB9ID0gZm91bmRcbiAgICAgIGNvbnN0IHsgYXBwcm92YWwgfSA9IG1lc3NhZ2VXaXRoQXBwcm92YWxcbiAgICAgIGlmICghYXBwcm92YWwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IGFwcHJvdmFsLnNlc3Npb25faWQgfHwgZm91bmRTZXNzaW9uSWRcbiAgICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIHNlc3Npb25faWQgZGlzcG9uaWJsZSBwYXJhIGFwcHJvdmFsOicsIHRocmVhZElkcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXNzaW9uU3RyZWFtTWFuYWdlci5pc0FjdGl2ZShzZXNzaW9uSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAoc2Vzc2lvblN0cmVhbU1hbmFnZXIuZ2V0QWN0aXZlQ291bnQoKSA+PSBNQVhfQ09OQ1VSUkVOVF9TVFJFQU1TKSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgIGRldGFpbDogeyBzaG93OiB0cnVlLCBzZXZlcml0eTogJ2luZm8nLCBtZXNzYWdlOiB0KCdjaGF0LnRvb01hbnlBY3RpdmVTZXNzaW9ucycpIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZUlkID0gbWVzc2FnZVdpdGhBcHByb3ZhbC5pZFxuICAgICAgY29uc3QgbmV3U3RhdHVzID0gcmVzb2x2ZUFwcHJvdmFsRGVjaXNpb25TdGF0dXMoZGVjaXNpb24pXG4gICAgICBjb25zdCBoaXRsQ29udGV4dDogSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgbWVzc2FnZVRleHQ6IG1lc3NhZ2VXaXRoQXBwcm92YWwubWVzc2FnZSxcbiAgICAgICAgYXBwcm92YWwsXG4gICAgICAgIHBlbmRpbmdBY3Rpb25zOiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMsXG4gICAgICAgIHRocmVhZElkcyxcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBY3RpdmVTZXNzaW9uID0gYWN0aXZlVmlldy5pcyhzZXNzaW9uSWQpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBoaXRsQ29udGV4dFxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29tbWl0VG9TZXNzaW9uKHNlc3Npb25JZCwgeyAuLi5tZXNzYWdlV2l0aEFwcHJvdmFsLCBhcHByb3ZhbFN0YXR1czogbmV3U3RhdHVzIH0pXG5cbiAgICAgIGNvbnN0IHN0cmVhbU1lc3NhZ2VJZCA9IHV1aWR2NCgpXG4gICAgICBpZiAoaXNBY3RpdmVTZXNzaW9uKSB7XG4gICAgICAgIGN1cnJlbnRNZXNzYWdlSWQuY3VycmVudCA9IHN0cmVhbU1lc3NhZ2VJZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXRsQ3R4OiBTdHJlYW1Db250ZXh0ID0ge1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIG1lc3NhZ2VJZDogc3RyZWFtTWVzc2FnZUlkLFxuICAgICAgICBwbGFjZWhvbGRlcklkOiBzdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChzdHJlYW1NZXNzYWdlSWQpLFxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc0FjdGl2ZVNlc3Npb24pIHJldHVyblxuICAgICAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb25TdHJlYW1NYW5hZ2VyLnN0YXJ0Q29udGludWVTdHJlYW0oe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHBsYWNlaG9sZGVySWQ6IGhpdGxDdHgucGxhY2Vob2xkZXJJZCxcbiAgICAgICAgY29udGludWVSZXF1ZXN0OiB7XG4gICAgICAgICAgdGhyZWFkSWRzLFxuICAgICAgICAgIHNlc3Npb25JZDogYXBwcm92YWwuc2Vzc2lvbl9pZCxcbiAgICAgICAgICBkZWNpc2lvbjogcmVzb2x2ZUNvbnRpbnVlU3RyZWFtRGVjaXNpb24oZGVjaXNpb24sIGVkaXRlZEFjdGlvbnMpLFxuICAgICAgICAgIGVkaXRlZEFjdGlvbnMsXG4gICAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkIHx8ICcnLFxuICAgICAgICAgIGxhbmc6IGF1dGhVc2VyLmxhbmcsXG4gICAgICAgICAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICB9LFxuICAgICAgICB0LFxuICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dDogaGl0bENvbnRleHQsXG4gICAgICAgIGFnZW50SWQ6IGFnZW50Py5pZCxcbiAgICAgICAgYWdlbnROYW1lOiBhZ2VudD8ubmFtZSxcbiAgICAgICAgY2FsbGJhY2tzOiB7XG4gICAgICAgICAgb25TdHJlYW1VcGRhdGU6IGNvbnRlbnQgPT4gaGFuZGxlU3RyZWFtVXBkYXRlKGhpdGxDdHgsIGNvbnRlbnQpLFxuICAgICAgICAgIG9uRmluaXNoU3RyZWFtOiBmaW5pc2hQYXlsb2FkID0+IHtcbiAgICAgICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgICAgIGhhbmRsZVN0cmVhbUZpbmlzaChcbiAgICAgICAgICAgICAgaGl0bEN0eCxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5jb250ZW50LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLnNvdXJjZXMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQubWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmF0dGFjaG1lbnRzLFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLnN1Z2dlc3Rpb25zLFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbXBsZXRlZEFnZW50SWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQucmVzb2x2ZWRDb250ZXh0LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLnJlYXNvbmluZ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgcmVsZWFzZUFjdGl2ZVByb2Nlc3NpbmcoKVxuICAgICAgICAgICAgaGFuZGxlU3RyZWFtRXJyb3IoaGl0bEN0eClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZDogKGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KSA9PiB7XG4gICAgICAgICAgICByZWxlYXNlQWN0aXZlUHJvY2Vzc2luZygpXG4gICAgICAgICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkKGhpdGxDdHgsIGFwcHJvdmFsUGF5bG9hZCwgYWNjdW11bGF0ZWRDb250ZW50KVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3VsdC5zdGFydGVkKSB7XG4gICAgICAgIHJlbGVhc2VBY3RpdmVQcm9jZXNzaW5nKClcbiAgICAgICAgaWYgKHJlc3VsdC5yZWFzb24gPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdzbmFja2Jhci1ldmVudCcsIHtcbiAgICAgICAgICAgICAgZGV0YWlsOiB7IHNob3c6IHRydWUsIHNldmVyaXR5OiAnaW5mbycsIG1lc3NhZ2U6IHQoJ2NoYXQudG9vTWFueUFjdGl2ZVNlc3Npb25zJykgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRoVXNlcixcbiAgICAgIGFnZW50LFxuICAgICAgY29tbWl0VG9TZXNzaW9uLFxuICAgICAgaGFuZGxlU3RyZWFtRXJyb3IsXG4gICAgICBoYW5kbGVTdHJlYW1VcGRhdGUsXG4gICAgICBoYW5kbGVTdHJlYW1GaW5pc2gsXG4gICAgICBoYW5kbGVBcHByb3ZhbFJlcXVpcmVkLFxuICAgICAgdCxcbiAgICBdXG4gIClcblxuICBjb25zdCBpbml0aWFsaXplQ2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWZpcnN0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICBmaXJzdFRpbWVSZWYuY3VycmVudCA9IHRydWVcbiAgICB9XG4gICAgaWYgKGluaXRpYWxDaGF0SWQpIHtcbiAgICAgIGF3YWl0IGxvYWRNZXNzYWdlcygpXG4gICAgfSBlbHNlIGlmICh1c2VySW5pdGlhbE1lc3NhZ2UpIHtcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZT8udHJpbSgpKVxuICAgICAgY29uc3QgaGFzSW5pdGlhbEF0dGFjaG1lbnRzID0gQm9vbGVhbih1c2VySW5pdGlhbE1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGYXEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mYXFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxGdWEgPSBCb29sZWFuKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZClcbiAgICAgIGNvbnN0IGhhc0luaXRpYWxTYyA9IEJvb2xlYW4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQpXG5cbiAgICAgIGlmICghaGFzSW5pdGlhbE1lc3NhZ2UgJiYgIWhhc0luaXRpYWxBdHRhY2htZW50cyAmJiAhaGFzSW5pdGlhbEZhcSAmJiAhaGFzSW5pdGlhbEZ1YSAmJiAhaGFzSW5pdGlhbFNjKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBoaXN0b3J5ID0gbWVzc2FnZXNSZWYuY3VycmVudC5tYXAoaGlzdG9yeU1lc3NhZ2UgPT4gKHtcbiAgICAgICAgY29udGVudDogaGlzdG9yeU1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgcm9sZTogaGlzdG9yeU1lc3NhZ2UudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSA/IENoYXRIaXN0b3J5Um9sZS5VU0VSIDogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGNoaXBzUHJvamVjdDogY3R4Q2hpcHNQcm9qZWN0LFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgdGFzazogY3R4VGFzayxcbiAgICAgIH0gPSBjb250ZXh0UmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHByb2plY3RUb1JlcXVlc3QgPSByZXNvbHZlUHJvamVjdFRvUmVxdWVzdChjdHhDaGlwc1Byb2plY3QsIG51bGwpID8/IGN0eFByb2plY3Q/LmlkID8/IG51bGxcblxuICAgICAgY29uc3QgaW5pdGlhbERpc3BsYXlNZXNzYWdlID0gZm9ybWF0UXVpY2tBY3Rpb25NZXNzYWdlRm9yRGlzcGxheSh1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZSwge1xuICAgICAgICBmdWFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZ1YUlkLFxuICAgICAgICBzY0lkOiB1c2VySW5pdGlhbE1lc3NhZ2Uuc2NJZCxcbiAgICAgIH0pXG5cbiAgICAgIGVuc3VyZVNlc3Npb25JblNpZGViYXIoe1xuICAgICAgICBzZXNzaW9uSWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgdGl0bGU6IGJ1aWxkU2lkZWJhclNlc3Npb25UaXRsZShpbml0aWFsRGlzcGxheU1lc3NhZ2UpLFxuICAgICAgICBhZ2VudCxcbiAgICAgICAgYWdlbnRJZDogYWdlbnQ/LmlkLFxuICAgICAgICBwcm9qZWN0OiBjdHhQcm9qZWN0LFxuICAgICAgICBjbGllbnQ6IGN0eENsaWVudCxcbiAgICAgICAgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyxcbiAgICAgIH0pXG5cbiAgICAgIGFza01haWEoe1xuICAgICAgICBtZXNzYWdlOiB1c2VySW5pdGlhbE1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0VG9SZXF1ZXN0LFxuICAgICAgICBsYW5nOiBhdXRoVXNlci5sYW5nLFxuICAgICAgICB1c2VySWQ6IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCksXG4gICAgICAgIGZpcnN0TmFtZTogYXV0aFVzZXIuZmlyc3ROYW1lLFxuICAgICAgICBsYXN0TmFtZTogYXV0aFVzZXIubGFzdE5hbWUsXG4gICAgICAgIGNvbXBhbnlJZDogYXV0aFVzZXIuY29tcGFueV9pZC50b1N0cmluZygpLFxuICAgICAgICBjaGF0SWQ6IGN1cnJlbnRDaGF0SWQuY3VycmVudCxcbiAgICAgICAgbWVzc2FnZUlkOiBjdXJyZW50TWVzc2FnZUlkLmN1cnJlbnQsXG4gICAgICAgIGFnZW50TmFtZTogYWdlbnQ/Lm5hbWUhLFxuICAgICAgICBhZ2VudElkOiBhZ2VudD8uaWQhLFxuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogaXNXZWJTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBpc0RlZXBTZWFyY2hBY3RpdmVSZWYuY3VycmVudCxcbiAgICAgICAgaXNBdXRvQXBwcm92ZUFjdGl2ZTogaXNBdXRvQXBwcm92ZUFjdGl2ZVJlZi5jdXJyZW50LFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8uZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IE51bWJlcihjdHhQcm9qZWN0LmZlZUlkKSB9IDoge30pLFxuICAgICAgICAuLi5yZXNvbHZlQ2xpZW50UGF5bG9hZChjdHhDbGllbnQsIGN0eFByb2plY3QpLFxuICAgICAgICAuLi4oY3R4UHJvamVjdD8ubmFtZSA/IHsgcHJvamVjdE5hbWU6IGN0eFByb2plY3QubmFtZSB9IDoge30pLFxuICAgICAgICAuLi4oY3R4VGFzaz8uaWQgIT0gbnVsbFxuICAgICAgICAgID8geyB0YXNrSWQ6IE51bWJlcihjdHhUYXNrLmlkKSwgLi4uKGN0eFRhc2submFtZSA/IHsgdGFza05hbWU6IGN0eFRhc2submFtZSB9IDoge30pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHM6IHVzZXJJbml0aWFsTWVzc2FnZS5hdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLmZhcUlkID8geyBmYXFJZDogdXNlckluaXRpYWxNZXNzYWdlLmZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiB1c2VySW5pdGlhbE1lc3NhZ2UuYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCA/IHsgZnVhSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5mdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4odXNlckluaXRpYWxNZXNzYWdlLnNjSWQgPyB7IHNjSWQ6IHVzZXJJbml0aWFsTWVzc2FnZS5zY0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudD8uZW50aXR5ICE9IG51bGwgPyB7IGFnZW50RW50aXR5OiBhZ2VudC5lbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50Py50eXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogYWdlbnQudHlwZSB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnQ/LmVtb2ppICE9IG51bGwgPyB7IGFnZW50RW1vamk6IGFnZW50LmVtb2ppIH0gOiB7fSksXG4gICAgICAgIC4uLihidWlsZENvbnRleHRNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZS5tZW50aW9ucylcbiAgICAgICAgICA/IHsgY29udGV4dE1lc3NhZ2U6IGJ1aWxkQ29udGV4dE1lc3NhZ2UodXNlckluaXRpYWxNZXNzYWdlLm1lbnRpb25zKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLih1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgPyB7IGNvbnRleHREYXRhOiB1c2VySW5pdGlhbE1lc3NhZ2UuY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgfVxuICB9LCBbXG4gICAgaW5pdGlhbENoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBhdXRoVXNlcixcbiAgICBhZ2VudCxcbiAgICBhc2tNYWlhLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgXSlcblxuICBjb25zdCByZXNldENoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgcHJldmlvdXNTZXNzaW9uSWQgPSBjdXJyZW50Q2hhdElkLmN1cnJlbnRcbiAgICBzZXNzaW9uU3RyZWFtaW5nVGV4dC5jbGVhcihwcmV2aW91c1Nlc3Npb25JZClcbiAgICByZWFzb25pbmdTdG9yZS5jbGVhcigpXG4gICAgY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBjdXJyZW50VXNlclF1ZXN0aW9uLmN1cnJlbnQgPSBudWxsXG4gICAgY3VycmVudENoYXRJZC5jdXJyZW50ID0gdXVpZHY0KClcbiAgICBzZXRBY3RpdmVTZXNzaW9uSWQoY3VycmVudENoYXRJZC5jdXJyZW50KVxuICAgIHJlcG9ydGVkRXZlbnQuY3VycmVudCA9IGZhbHNlXG4gICAgc3RyZWFtaW5nUGxhY2Vob2xkZXJJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGFjdGl2ZVN0cmVhbUNoYXRJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHNldEFjdGl2ZUNoYXRJZChudWxsKVxuICB9LCBbc2V0QWN0aXZlQ2hhdElkXSlcblxuICBjb25zdCBzdG9wR2VuZXJhdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzdG9wU3RyZWFtaW5nKClcbiAgICBpc1Byb2Nlc3NpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gIH0sIFtzdG9wU3RyZWFtaW5nXSlcblxuICByZXR1cm4ge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBjdXJyZW50UHJvamVjdCxcbiAgICBjdXJyZW50Q2hhdElkOiBjdXJyZW50Q2hhdElkLmN1cnJlbnQsXG4gICAgY3VycmVudE1lc3NhZ2VJZDogY3VycmVudE1lc3NhZ2VJZC5jdXJyZW50LFxuXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgcmV0cnlNZXNzYWdlLFxuICAgIGNoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlRmVlZGJhY2ssXG4gICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICBoYW5kbGVTY3JvbGwsXG4gICAgaW5pdGlhbGl6ZUNoYXQsXG4gICAgcmVzZXRDaGF0LFxuICAgIHN0b3BHZW5lcmF0aW9uLFxuXG4gICAgaXNEaXNhYmxlZDogd2FpdGluZ1Jlc3BvbnNlIHx8IGxvYWRpbmdNZXNzYWdlcyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUNoRSxTQUFTQyxTQUFTLFFBQVEsV0FBVztBQUNyQyxTQUFTQyxFQUFFLElBQUlDLE1BQU0sUUFBUSxNQUFNO0FBQ25DLFNBQVNDLGVBQWUsUUFBUSxvQkFBb0I7QUFDcEQsU0FBU0MscUJBQXFCLFFBQVEsMEJBQTBCO0FBQ2hFLFNBQVNDLElBQUksUUFBUSxTQUFTO0FBRTlCLFNBQ0VDLGtDQUFrQyxFQUNsQ0MsNkJBQTZCLEVBQzdCQyw2QkFBNkIsRUFDN0JDLDRCQUE0QixFQUM1QkMsNkJBQTZCLEVBQzdCQyx3QkFBd0IsRUFDeEJDLGlCQUFpQixFQUNqQkMsb0JBQW9CLEVBQ3BCQyx1QkFBdUIsRUFDdkJDLDRCQUE0QixFQUM1QkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsRUFDMUJDLHNCQUFzQixFQUN0QkMsK0JBQStCLEVBQy9CQyw0QkFBNEIsRUFDNUJDLHlCQUF5QixFQUN6QkMsdUJBQXVCLEVBQ3ZCQyw0QkFBNEIsRUFDNUJDLDZCQUE2QixFQUM3QkMsNkNBQTZDLEVBQzdDQyw4QkFBOEIsRUFDOUJDLGdDQUFnQyxFQUNoQ0Msa0NBQWtDLEVBQ2xDQywrQkFBK0IsRUFDL0JDLG1DQUFtQyxFQUNuQ0Msc0NBQXNDLEVBQ3RDQyx3Q0FBd0MsRUFDeENDLHVCQUF1QixFQUN2QkMsdUJBQXVCLEVBQ3ZCQywyQkFBMkIsRUFDM0JDLDJCQUEyQixFQUMzQkMsOEJBQThCLEVBQzlCQyxpQ0FBaUMsRUFDakNDLDJCQUEyQixFQUMzQkMsb0NBQW9DLEVBQ3BDQyw2QkFBNkIsRUFDN0JDLDJCQUEyQixFQUMzQkMsZ0NBQWdDLEVBQ2hDQywrQkFBK0Is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