@projectcor/maia-components 2.11.78-17 → 2.11.78-2

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 (60) hide show
  1. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +2 -4
  2. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +17 -0
  3. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +15 -0
  4. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  5. package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.js +12 -0
  6. package/lib/components/atoms/SessionUnreadDot/SessionUnreadDot.styles.js +8 -0
  7. package/lib/components/atoms/SessionUnreadDot/index.js +2 -0
  8. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +3 -3
  9. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +18 -44
  10. package/lib/components/molecules/ChatAIHome/styles.js +41 -76
  11. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
  12. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +14 -20
  13. package/lib/components/molecules/Sidebar/Sidebar.js +51 -42
  14. package/lib/components/molecules/Sidebar/Sidebar.styles.js +10 -6
  15. package/lib/components/organisms/ChatAI/ChatAI.js +10 -2
  16. package/lib/constants/maiaTaskPanelAccess.js +2 -2
  17. package/lib/context/global-context.js +1 -1
  18. package/lib/dev/DevChatAI.js +2 -2
  19. package/lib/hooks/useChatManager/useChatManager.js +457 -470
  20. package/lib/hooks/useChatMessages/useChatMessages.js +411 -249
  21. package/lib/hooks/useChats/useChats.js +8 -3
  22. package/lib/hooks/useFrequentlyUsedActions.js +2 -4
  23. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  24. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +140 -496
  25. package/lib/hooks/useProjectSummaryConfig.js +1 -1
  26. package/lib/hooks/useStreamingMessage/index.js +2 -3
  27. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +13 -17
  28. package/lib/lang/br/index.js +8 -10
  29. package/lib/lang/en/index.js +8 -10
  30. package/lib/lang/es/index.js +8 -10
  31. package/lib/lang/fr/index.js +10 -11
  32. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  33. package/lib/services/maia/Agents/getAgents.js +2 -2
  34. package/lib/services/maia/Chats/getChatsByUserId.js +1 -1
  35. package/lib/store/chatsSidebarOptimistic.js +87 -0
  36. package/lib/store/chatsStore.types.js +1 -1
  37. package/lib/store/sessions/activeView.js +22 -0
  38. package/lib/store/sessions/index.js +10 -0
  39. package/lib/store/sessions/sessionHitlContext.js +15 -0
  40. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  41. package/lib/store/sessions/sessionNotifications.js +111 -0
  42. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  43. package/lib/store/sessions/sessionStreamManager.js +585 -0
  44. package/lib/store/sessions/sessionStreamingText.js +80 -0
  45. package/lib/store/sessions/sessionUnreadPersistence.js +49 -0
  46. package/lib/store/sessions/sessions.types.js +35 -0
  47. package/lib/store/sessions/useSessionMeta.js +39 -0
  48. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  49. package/lib/store/sessions/useSessionsStore.js +234 -0
  50. package/lib/store/useChatsStore.js +41 -9
  51. package/lib/types/Action.js +1 -1
  52. package/lib/utils/actionCategoryMap.js +2 -6
  53. package/lib/utils/actionIconMap.js +2 -8
  54. package/lib/utils/streamActivityMessages.js +1 -2
  55. package/package.json +1 -1
  56. package/lib/components/atoms/icons/ActionCalendarIcon.js +0 -112
  57. package/lib/components/atoms/icons/ActionChatIcon.js +0 -71
  58. package/lib/components/atoms/icons/ActionTimeBackIcon.js +0 -112
  59. package/lib/constants/plannerSyncEvents.js +0 -16
  60. package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
@@ -1,28 +1,27 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
5
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
- import _regeneratorRuntime from "@babel/runtime/regenerator";
7
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
8
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
9
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
10
- /* eslint-disable no-console */
11
- /* eslint-disable @typescript-eslint/no-shadow */
12
- /* eslint-disable no-constant-condition */
13
- /* eslint-disable no-continue */
14
- /* eslint-disable no-await-in-loop */
15
- /* eslint-disable no-case-declarations */
16
- /* eslint-disable no-restricted-syntax */
17
6
  /* eslint-disable @typescript-eslint/no-explicit-any */
18
- import { useState, useCallback, useRef, useEffect } from 'react';
7
+ import { useCallback, useRef } from 'react';
19
8
  import { useTranslation } from 'react-i18next';
20
- import maia from '../../services/maia';
21
9
  import { SECTIONS } from '../../constants/config';
22
- import { ACTIVITY_MESSAGE_ROTATE_MS, advanceStreamActivityMessage, canAdvanceStreamActivityMessage, canRotateStreamActivityPhase, getInitialStreamActivity, getThinkingLoadingMessage, getWritingStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity } from '../../utils/streamActivityMessages';
23
- import { isCompleteLikeSsePayload, mergeStreamChunk } from '../../utils/sseStreamContent';
10
+ import { sessionStreamManager } from '../../store/sessions/sessionStreamManager';
11
+ import { useSessionsStore } from '../../store/sessions/useSessionsStore';
12
+ import { useSessionStreamState } from '../../store/sessions/useSessionMeta';
13
+ /**
14
+ * Adapter sobre `sessionStreamManager`. Mantiene la API pública histórica
15
+ * (`askMaia`, `isLoading`, `isWriting`, `stopStreaming`, etc.) pero ahora el
16
+ * motor de streaming vive en el manager (module-level), lo que permite tener
17
+ * varias sesiones generando a la vez y que sobrevivan a cambios de vista.
18
+ *
19
+ * Los flags reactivos (`isLoading`/`isWriting`/`streamActivity`) se leen del
20
+ * store para la sesión actualmente activa (`activeSessionId`).
21
+ */
24
22
  export var useOrchestratorStream = function useOrchestratorStream(_ref) {
25
- var onStreamUpdate = _ref.onStreamUpdate,
23
+ var activeSessionId = _ref.activeSessionId,
24
+ onStreamUpdate = _ref.onStreamUpdate,
26
25
  onFinishStream = _ref.onFinishStream,
27
26
  onStartWriting = _ref.onStartWriting,
28
27
  onStop = _ref.onStop,
@@ -31,29 +30,11 @@ export var useOrchestratorStream = function useOrchestratorStream(_ref) {
31
30
  hitlExecutionContextRef = _ref.hitlExecutionContextRef;
32
31
  var _useTranslation = useTranslation([SECTIONS.chatAI]),
33
32
  t = _useTranslation.t;
34
- var _useState = useState(null),
35
- _useState2 = _slicedToArray(_useState, 2),
36
- data = _useState2[0],
37
- setData = _useState2[1];
38
- var _useState3 = useState(false),
39
- _useState4 = _slicedToArray(_useState3, 2),
40
- isLoading = _useState4[0],
41
- setLoading = _useState4[1];
42
- var _useState5 = useState(false),
43
- _useState6 = _slicedToArray(_useState5, 2),
44
- isWriting = _useState6[0],
45
- setIsWriting = _useState6[1];
46
- var _useState7 = useState(null),
47
- _useState8 = _slicedToArray(_useState7, 2),
48
- loadingMessage = _useState8[0],
49
- setLoadingMessage = _useState8[1];
50
- var _useState9 = useState(null),
51
- _useState0 = _slicedToArray(_useState9, 2),
52
- streamActivity = _useState0[0],
53
- setStreamActivity = _useState0[1];
54
- var abortControllerRef = useRef(null);
55
- var isStoppedRef = useRef(false);
56
- var activityMessageIndexRef = useRef(0);
33
+ var _useSessionStreamStat = useSessionStreamState(activeSessionId),
34
+ isLoading = _useSessionStreamStat.isLoading,
35
+ isWriting = _useSessionStreamStat.isWriting,
36
+ loadingMessage = _useSessionStreamStat.loadingMessage,
37
+ streamActivity = _useSessionStreamStat.streamActivity;
57
38
  var onStreamUpdateRef = useRef(onStreamUpdate);
58
39
  var onFinishStreamRef = useRef(onFinishStream);
59
40
  var onStartWritingRef = useRef(onStartWriting);
@@ -66,477 +47,141 @@ export var useOrchestratorStream = function useOrchestratorStream(_ref) {
66
47
  onStopRef.current = onStop;
67
48
  onErrorRef.current = onError;
68
49
  onApprovalRequiredRef.current = onApprovalRequired;
69
- var clearStreamLoadingState = useCallback(function () {
70
- activityMessageIndexRef.current = 0;
71
- setStreamActivity(null);
72
- setLoadingMessage(null);
73
- }, []);
74
- var applyStreamActivity = useCallback(function (activity) {
75
- setStreamActivity(function (prev) {
76
- if ((prev === null || prev === void 0 ? void 0 : prev.phase) === activity.phase && canRotateStreamActivityPhase(activity.phase)) {
77
- return prev;
78
- }
79
- if ((prev === null || prev === void 0 ? void 0 : prev.phase) !== activity.phase) {
80
- activityMessageIndexRef.current = 0;
81
- }
82
- setLoadingMessage(activity.message);
83
- return activity;
84
- });
85
- }, []);
86
- useEffect(function () {
87
- if (!isLoading || isWriting || !streamActivity) {
88
- return undefined;
89
- }
90
- if (!canRotateStreamActivityPhase(streamActivity.phase)) {
91
- return undefined;
92
- }
93
- var intervalId = window.setInterval(function () {
94
- setStreamActivity(function (prev) {
95
- if (!prev || !canRotateStreamActivityPhase(prev.phase)) {
96
- return prev;
97
- }
98
- if (!canAdvanceStreamActivityMessage(prev.phase, activityMessageIndexRef.current)) {
99
- return prev;
100
- }
101
- var advanced = advanceStreamActivityMessage(prev, activityMessageIndexRef.current, t);
102
- if (!advanced) {
103
- return prev;
104
- }
105
- activityMessageIndexRef.current = advanced.nextIndex;
106
- setLoadingMessage(advanced.activity.message);
107
- return advanced.activity;
108
- });
109
- }, ACTIVITY_MESSAGE_ROTATE_MS);
110
- return function () {
111
- return window.clearInterval(intervalId);
112
- };
113
- }, [isLoading, isWriting, streamActivity === null || streamActivity === void 0 ? void 0 : streamActivity.phase, t]);
114
- var handleSSEStream = useCallback(/*#__PURE__*/function () {
115
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(response) {
116
- var _onErrorRef$current, _data$error, _data$error2;
117
- var pendingContent, throttleTimer, emitThrottled, flushPending, _response$body, reader, decoder, buffer, accumulatedContent, hasStartedWriting, ensureWritingStarted, applyStreamChunk, applyStreamComplete, _yield$reader$read, done, value, lines, _iterator, _step, line, _line$split, _line$split2, eventLine, dataLine, eventType, dataStr, _data, chunk, _chunk, _onApprovalRequiredRe, isManualApproval, _onErrorRef$current2, _t, _t2, _t3, _t4;
50
+ var askMaia = useCallback(/*#__PURE__*/function () {
51
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(payload) {
52
+ var _payload$attachments, _payload$attachments$, _payload$attachments2, _hitlExecutionContext;
53
+ var sessionId, messageId, placeholderId, ctx, request;
118
54
  return _regeneratorRuntime.wrap(function (_context) {
119
55
  while (1) switch (_context.prev = _context.next) {
120
56
  case 0:
121
- // Time-throttle: evita emitir onStreamUpdate más de una vez cada ~16ms.
122
- // Usamos timer para que el stream siga pintando aunque rAF esté throttleado.
123
- // Nota: no tocamos el state `data` en el hot path (solo se actualiza en
124
- // `complete`/resets) para no re-renderizar a los consumidores del hook
125
- // en cada frame; el texto en vivo viaja por el streamingStore.
126
- pendingContent = null;
127
- throttleTimer = null;
128
- emitThrottled = function emitThrottled(content) {
129
- pendingContent = content;
130
- if (throttleTimer != null) return;
131
- throttleTimer = window.setTimeout(function () {
132
- throttleTimer = null;
133
- if (pendingContent != null) {
57
+ sessionId = payload.chatId, messageId = payload.messageId;
58
+ placeholderId = "answer-".concat(messageId, "-streaming");
59
+ ctx = {
60
+ sessionId: sessionId,
61
+ messageId: messageId,
62
+ placeholderId: placeholderId
63
+ };
64
+ request = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
65
+ input: payload.message,
66
+ history: payload.history,
67
+ lang: payload.lang,
68
+ userId: payload.userId
69
+ }, payload.firstName ? {
70
+ firstName: payload.firstName
71
+ } : {}), payload.lastName ? {
72
+ lastName: payload.lastName
73
+ } : {}), {}, {
74
+ companyId: payload.companyId,
75
+ chatId: payload.chatId,
76
+ messageId: payload.messageId,
77
+ clientId: payload.clientId
78
+ }, payload.feeId != null ? {
79
+ feeId: payload.feeId
80
+ } : {}), {}, {
81
+ agentName: payload.agentName,
82
+ agentId: payload.agentId,
83
+ isWebSearchActive: payload.isWebSearchActive,
84
+ isDeepSearchActive: payload.isDeepSearchActive
85
+ }, payload.projectId ? {
86
+ projectId: payload.projectId
87
+ } : {}), payload.attachments ? {
88
+ attachments: payload.attachments
89
+ } : {}), payload.projectName ? {
90
+ projectName: payload.projectName
91
+ } : {}), payload.clientName ? {
92
+ clientName: payload.clientName
93
+ } : {}), payload.taskId != null ? {
94
+ taskId: payload.taskId
95
+ } : {}), payload.taskName ? {
96
+ taskName: payload.taskName
97
+ } : {}), payload.faqId ? {
98
+ faqId: payload.faqId
99
+ } : {}), payload.agentSuggestionId ? {
100
+ agentSuggestionId: payload.agentSuggestionId
101
+ } : {}), payload.fuaId ? {
102
+ fuaId: payload.fuaId
103
+ } : {}), payload.scId ? {
104
+ scId: payload.scId
105
+ } : {}), payload.agentEntity != null ? {
106
+ agentEntity: payload.agentEntity
107
+ } : {}), payload.agentType != null ? {
108
+ agentType: payload.agentType
109
+ } : {}), payload.contextMessage ? {
110
+ contextMessage: payload.contextMessage
111
+ } : {}), payload.contextData ? {
112
+ contextData: payload.contextData
113
+ } : {});
114
+ return _context.abrupt("return", sessionStreamManager.startStream({
115
+ sessionId: sessionId,
116
+ placeholderId: placeholderId,
117
+ request: request,
118
+ t: t,
119
+ activityOptions: {
120
+ isWebSearchActive: payload.isWebSearchActive,
121
+ isDeepSearchActive: payload.isDeepSearchActive,
122
+ hasAttachments: Boolean((_payload$attachments = payload.attachments) === null || _payload$attachments === void 0 ? void 0 : _payload$attachments.length),
123
+ attachmentsCount: (_payload$attachments$ = (_payload$attachments2 = payload.attachments) === null || _payload$attachments2 === void 0 ? void 0 : _payload$attachments2.length) !== null && _payload$attachments$ !== void 0 ? _payload$attachments$ : 0
124
+ },
125
+ hitlExecutionContext: (_hitlExecutionContext = hitlExecutionContextRef === null || hitlExecutionContextRef === void 0 ? void 0 : hitlExecutionContextRef.current) !== null && _hitlExecutionContext !== void 0 ? _hitlExecutionContext : null,
126
+ agentId: payload.agentId,
127
+ agentName: payload.agentName,
128
+ agentEmoji: payload.agentEmoji,
129
+ callbacks: {
130
+ onStreamUpdate: function onStreamUpdate(content) {
134
131
  var _onStreamUpdateRef$cu;
135
- var toEmit = pendingContent;
136
- pendingContent = null;
137
- (_onStreamUpdateRef$cu = onStreamUpdateRef.current) === null || _onStreamUpdateRef$cu === void 0 || _onStreamUpdateRef$cu.call(onStreamUpdateRef, toEmit, null, '');
132
+ return (_onStreamUpdateRef$cu = onStreamUpdateRef.current) === null || _onStreamUpdateRef$cu === void 0 ? void 0 : _onStreamUpdateRef$cu.call(onStreamUpdateRef, ctx, content);
133
+ },
134
+ onStartWriting: function onStartWriting() {
135
+ var _onStartWritingRef$cu;
136
+ return (_onStartWritingRef$cu = onStartWritingRef.current) === null || _onStartWritingRef$cu === void 0 ? void 0 : _onStartWritingRef$cu.call(onStartWritingRef);
137
+ },
138
+ onFinishStream: function onFinishStream(finishPayload) {
139
+ var _onFinishStreamRef$cu;
140
+ return (_onFinishStreamRef$cu = onFinishStreamRef.current) === null || _onFinishStreamRef$cu === void 0 ? void 0 : _onFinishStreamRef$cu.call(onFinishStreamRef, ctx, finishPayload.content, finishPayload.sources, finishPayload.memorySessionId, finishPayload.attachments, finishPayload.suggestions, finishPayload.completedAgentId, finishPayload.resolvedContext);
141
+ },
142
+ onError: function onError(errorType, errorMessage) {
143
+ var _onErrorRef$current;
144
+ return (_onErrorRef$current = onErrorRef.current) === null || _onErrorRef$current === void 0 ? void 0 : _onErrorRef$current.call(onErrorRef, ctx, errorType, errorMessage);
145
+ },
146
+ onApprovalRequired: function onApprovalRequired(approval, accumulatedContent) {
147
+ var _onApprovalRequiredRe;
148
+ return (_onApprovalRequiredRe = onApprovalRequiredRef.current) === null || _onApprovalRequiredRe === void 0 ? void 0 : _onApprovalRequiredRe.call(onApprovalRequiredRef, ctx, approval, accumulatedContent);
138
149
  }
139
- }, 16);
140
- };
141
- flushPending = function flushPending() {
142
- if (throttleTimer != null) {
143
- window.clearTimeout(throttleTimer);
144
- throttleTimer = null;
145
- }
146
- if (pendingContent != null) {
147
- var _onStreamUpdateRef$cu2;
148
- var toEmit = pendingContent;
149
- pendingContent = null;
150
- (_onStreamUpdateRef$cu2 = onStreamUpdateRef.current) === null || _onStreamUpdateRef$cu2 === void 0 || _onStreamUpdateRef$cu2.call(onStreamUpdateRef, toEmit, null, '');
151
- }
152
- };
153
- _context.prev = 1;
154
- reader = (_response$body = response.body) === null || _response$body === void 0 ? void 0 : _response$body.getReader();
155
- if (reader) {
156
- _context.next = 2;
157
- break;
158
- }
159
- throw new Error('No reader available');
160
- case 2:
161
- decoder = new TextDecoder();
162
- buffer = '';
163
- accumulatedContent = '';
164
- hasStartedWriting = false;
165
- ensureWritingStarted = function ensureWritingStarted() {
166
- var _onStartWritingRef$cu;
167
- if (hasStartedWriting) return;
168
- hasStartedWriting = true;
169
- setIsWriting(true);
170
- applyStreamActivity(getWritingStreamActivity(t));
171
- (_onStartWritingRef$cu = onStartWritingRef.current) === null || _onStartWritingRef$cu === void 0 || _onStartWritingRef$cu.call(onStartWritingRef);
172
- };
173
- applyStreamChunk = function applyStreamChunk(chunk) {
174
- if (!chunk) return;
175
- accumulatedContent = mergeStreamChunk(accumulatedContent, chunk);
176
- emitThrottled(accumulatedContent);
177
- };
178
- applyStreamComplete = function applyStreamComplete(payload) {
179
- var _payload$agent_id, _subagentRaw$resolved, _onFinishStreamRef$cu;
180
- var finalContent = payload.content || accumulatedContent;
181
- var sources = payload.sources || null;
182
- var memorySessionId = payload.memory_session_id || '';
183
- var attachments = Array.isArray(payload.attachments) ? payload.attachments : null;
184
- var suggestions = null;
185
- if (Array.isArray(payload.suggest_reply)) {
186
- suggestions = payload.suggest_reply;
187
- } else if (Array.isArray(payload.suggestions)) {
188
- suggestions = payload.suggestions;
189
150
  }
190
- var agentIdRaw = (_payload$agent_id = payload.agent_id) !== null && _payload$agent_id !== void 0 ? _payload$agent_id : payload.agentId;
191
- var completedAgentId = agentIdRaw != null && String(agentIdRaw).trim() !== '' ? String(agentIdRaw).trim() : null;
192
- var subagentRaw = payload.subagent;
193
- var resolvedContext = (_subagentRaw$resolved = subagentRaw === null || subagentRaw === void 0 ? void 0 : subagentRaw.resolved_context) !== null && _subagentRaw$resolved !== void 0 ? _subagentRaw$resolved : null;
194
- flushPending();
195
- setData(finalContent);
196
- setLoading(false);
197
- setIsWriting(false);
198
- clearStreamLoadingState();
199
- (_onFinishStreamRef$cu = onFinishStreamRef.current) === null || _onFinishStreamRef$cu === void 0 || _onFinishStreamRef$cu.call(onFinishStreamRef, finalContent, sources, memorySessionId, attachments, suggestions, completedAgentId, resolvedContext);
200
- };
201
- case 3:
202
- if (!true) {
203
- _context.next = 28;
204
- break;
205
- }
206
- if (!isStoppedRef.current) {
207
- _context.next = 4;
208
- break;
209
- }
210
- reader.cancel();
211
- return _context.abrupt("continue", 28);
212
- case 4:
213
- _context.next = 5;
214
- return reader.read();
215
- case 5:
216
- _yield$reader$read = _context.sent;
217
- done = _yield$reader$read.done;
218
- value = _yield$reader$read.value;
219
- if (!done) {
220
- _context.next = 6;
221
- break;
222
- }
223
- return _context.abrupt("continue", 28);
224
- case 6:
225
- if (!isStoppedRef.current) {
226
- _context.next = 7;
227
- break;
228
- }
229
- reader.cancel();
230
- return _context.abrupt("continue", 28);
231
- case 7:
232
- buffer += decoder.decode(value, {
233
- stream: true
234
- });
235
- lines = buffer.split('\n\n');
236
- buffer = lines.pop() || '';
237
- _iterator = _createForOfIteratorHelper(lines);
238
- _context.prev = 8;
239
- _iterator.s();
240
- case 9:
241
- if ((_step = _iterator.n()).done) {
242
- _context.next = 24;
243
- break;
244
- }
245
- line = _step.value;
246
- if (!(line.trim() === '')) {
247
- _context.next = 10;
248
- break;
249
- }
250
- return _context.abrupt("continue", 23);
251
- case 10:
252
- _line$split = line.split('\n'), _line$split2 = _slicedToArray(_line$split, 2), eventLine = _line$split2[0], dataLine = _line$split2[1];
253
- if (!(!eventLine || !dataLine)) {
254
- _context.next = 11;
255
- break;
256
- }
257
- return _context.abrupt("continue", 23);
258
- case 11:
259
- eventType = eventLine.replace('event: ', '').trim();
260
- dataStr = dataLine.replace('data: ', '').trim();
261
- _context.prev = 12;
262
- _data = JSON.parse(dataStr);
263
- _t = eventType;
264
- _context.next = _t === 'thinking' ? 13 : _t === 'token' ? 14 : _t === 'content' ? 15 : _t === 'node' ? 16 : _t === 'complete' ? 17 : _t === 'approval_required' ? 18 : _t === 'error' ? 19 : 20;
265
- break;
266
- case 13:
267
- if (!hasStartedWriting) {
268
- setLoading(true);
269
- applyStreamActivity({
270
- phase: 'thinking',
271
- message: getThinkingLoadingMessage(0, t)
272
- });
273
- }
274
- return _context.abrupt("continue", 21);
275
- case 14:
276
- chunk = typeof _data.content === 'string' ? _data.content : '';
277
- ensureWritingStarted();
278
- applyStreamChunk(chunk);
279
- return _context.abrupt("continue", 21);
280
- case 15:
281
- _chunk = typeof _data.content === 'string' ? _data.content : '';
282
- ensureWritingStarted();
283
- applyStreamChunk(_chunk);
284
- if (isCompleteLikeSsePayload(_data)) {
285
- applyStreamComplete(_data);
286
- }
287
- return _context.abrupt("continue", 21);
288
- case 16:
289
- // El orchestrator delegó a un subagente: NO lo exponemos. Mantenemos
290
- // el indicador de actividad genérico de MAIA, sin anunciar la
291
- // transferencia ni el nombre del subagente.
292
- if (_data.node === 'agent_transfer') {
293
- setLoading(true);
294
- } else if (_data.message && typeof _data.message === 'string') {
295
- setLoading(true);
296
- applyStreamActivity(resolveHitlNodeStreamActivity(_data.message, t, hitlExecutionContextRef === null || hitlExecutionContextRef === void 0 ? void 0 : hitlExecutionContextRef.current, typeof _data.thread_id === 'string' ? _data.thread_id : undefined));
297
- }
298
- return _context.abrupt("continue", 21);
299
- case 17:
300
- applyStreamComplete(_data);
301
- return _context.abrupt("continue", 21);
302
- case 18:
303
- flushPending();
304
- setIsWriting(false);
305
- isManualApproval = _data.manual_approval_detected === true;
306
- if (!isManualApproval) {
307
- setLoading(false);
308
- clearStreamLoadingState();
309
- }
310
- (_onApprovalRequiredRe = onApprovalRequiredRef.current) === null || _onApprovalRequiredRe === void 0 || _onApprovalRequiredRe.call(onApprovalRequiredRef, _data, accumulatedContent);
311
- if (isManualApproval && Array.isArray(_data.pending_actions) && _data.pending_actions.length > 0) {
312
- setLoading(true);
313
- applyStreamActivity(resolveInitialHitlStreamActivity(t, hitlExecutionContextRef === null || hitlExecutionContextRef === void 0 ? void 0 : hitlExecutionContextRef.current));
314
- }
315
- return _context.abrupt("continue", 21);
316
- case 19:
317
- console.error('SSE Error:', _data.error);
318
- flushPending();
319
- setIsWriting(false);
320
- setLoading(false);
321
- clearStreamLoadingState();
322
- setLoadingMessage(null); // Limpiar mensaje cuando hay error
323
- (_onErrorRef$current = onErrorRef.current) === null || _onErrorRef$current === void 0 || _onErrorRef$current.call(onErrorRef, (_data$error = _data.error) === null || _data$error === void 0 ? void 0 : _data$error.type, (_data$error2 = _data.error) === null || _data$error2 === void 0 ? void 0 : _data$error2.message);
324
- return _context.abrupt("continue", 21);
325
- case 20:
326
- console.warn('Unknown SSE event type:', eventType);
327
- return _context.abrupt("continue", 21);
328
- case 21:
329
- _context.next = 23;
330
- break;
331
- case 22:
332
- _context.prev = 22;
333
- _t2 = _context["catch"](12);
334
- console.error('Error parsing SSE data:', _t2, dataStr);
335
- case 23:
336
- _context.next = 9;
337
- break;
338
- case 24:
339
- _context.next = 26;
340
- break;
341
- case 25:
342
- _context.prev = 25;
343
- _t3 = _context["catch"](8);
344
- _iterator.e(_t3);
345
- case 26:
346
- _context.prev = 26;
347
- _iterator.f();
348
- return _context.finish(26);
349
- case 27:
350
- _context.next = 3;
351
- break;
352
- case 28:
353
- _context.next = 30;
354
- break;
355
- case 29:
356
- _context.prev = 29;
357
- _t4 = _context["catch"](1);
358
- flushPending();
359
- setIsWriting(false);
360
-
361
- // Solo ejecutar onError si no fue un stop intencional
362
- if (!isStoppedRef.current) {
363
- (_onErrorRef$current2 = onErrorRef.current) === null || _onErrorRef$current2 === void 0 || _onErrorRef$current2.call(onErrorRef);
364
- }
365
- case 30:
366
- _context.prev = 30;
367
- flushPending();
368
- setLoading(false);
369
- setIsWriting(false);
370
- clearStreamLoadingState();
371
- return _context.finish(30);
372
- case 31:
151
+ }));
152
+ case 1:
373
153
  case "end":
374
154
  return _context.stop();
375
155
  }
376
- }, _callee, null, [[1, 29, 30, 31], [8, 25, 26, 27], [12, 22]]);
156
+ }, _callee);
377
157
  }));
378
158
  return function (_x) {
379
159
  return _ref2.apply(this, arguments);
380
160
  };
381
- }(), [applyStreamActivity, clearStreamLoadingState, hitlExecutionContextRef, t]);
382
- var askMaia = /*#__PURE__*/function () {
383
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref3) {
384
- var message, history, projectId, lang, userId, firstName, lastName, companyId, chatId, messageId, clientId, clientName, feeId, agentName, agentId, isWebSearchActive, isDeepSearchActive, attachments, projectName, taskId, taskName, faqId, agentSuggestionId, fuaId, scId, agentEntity, agentType, contextMessage, contextData, _attachments$length, _abortControllerRef$c, initialActivity, response, _onErrorRef$current3, _t5;
385
- return _regeneratorRuntime.wrap(function (_context2) {
386
- while (1) switch (_context2.prev = _context2.next) {
387
- case 0:
388
- message = _ref3.message, history = _ref3.history, projectId = _ref3.projectId, lang = _ref3.lang, userId = _ref3.userId, firstName = _ref3.firstName, lastName = _ref3.lastName, companyId = _ref3.companyId, chatId = _ref3.chatId, messageId = _ref3.messageId, clientId = _ref3.clientId, clientName = _ref3.clientName, feeId = _ref3.feeId, agentName = _ref3.agentName, agentId = _ref3.agentId, isWebSearchActive = _ref3.isWebSearchActive, isDeepSearchActive = _ref3.isDeepSearchActive, attachments = _ref3.attachments, projectName = _ref3.projectName, taskId = _ref3.taskId, taskName = _ref3.taskName, faqId = _ref3.faqId, agentSuggestionId = _ref3.agentSuggestionId, fuaId = _ref3.fuaId, scId = _ref3.scId, agentEntity = _ref3.agentEntity, agentType = _ref3.agentType, contextMessage = _ref3.contextMessage, contextData = _ref3.contextData;
389
- _context2.prev = 1;
390
- setLoading(true);
391
- setIsWriting(false);
392
- setData(null);
393
- activityMessageIndexRef.current = 0;
394
- initialActivity = getInitialStreamActivity(t, {
395
- isWebSearchActive: isWebSearchActive,
396
- isDeepSearchActive: isDeepSearchActive,
397
- hasAttachments: Boolean(attachments === null || attachments === void 0 ? void 0 : attachments.length),
398
- attachmentsCount: (_attachments$length = attachments === null || attachments === void 0 ? void 0 : attachments.length) !== null && _attachments$length !== void 0 ? _attachments$length : 0
399
- });
400
- applyStreamActivity(initialActivity);
401
- isStoppedRef.current = false; // Resetear flag al iniciar nueva petición
402
-
403
- abortControllerRef.current = new AbortController();
404
- _context2.next = 2;
405
- return maia.Orchestrator.orchestrator(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
406
- input: message,
407
- history: history,
408
- lang: lang,
409
- userId: userId
410
- }, firstName ? {
411
- firstName: firstName
412
- } : {}), lastName ? {
413
- lastName: lastName
414
- } : {}), {}, {
415
- companyId: companyId,
416
- chatId: chatId,
417
- messageId: messageId,
418
- clientId: clientId
419
- }, feeId != null ? {
420
- feeId: feeId
421
- } : {}), {}, {
422
- agentName: agentName,
423
- agentId: agentId,
424
- isWebSearchActive: isWebSearchActive,
425
- isDeepSearchActive: isDeepSearchActive
426
- }, projectId ? {
427
- projectId: projectId
428
- } : {}), attachments ? {
429
- attachments: attachments
430
- } : {}), projectName ? {
431
- projectName: projectName
432
- } : {}), clientName ? {
433
- clientName: clientName
434
- } : {}), taskId != null ? {
435
- taskId: taskId
436
- } : {}), taskName ? {
437
- taskName: taskName
438
- } : {}), faqId ? {
439
- faqId: faqId
440
- } : {}), agentSuggestionId ? {
441
- agentSuggestionId: agentSuggestionId
442
- } : {}), fuaId ? {
443
- fuaId: fuaId
444
- } : {}), scId ? {
445
- scId: scId
446
- } : {}), agentEntity != null ? {
447
- agentEntity: agentEntity
448
- } : {}), agentType != null ? {
449
- agentType: agentType
450
- } : {}), contextMessage ? {
451
- contextMessage: contextMessage
452
- } : {}), contextData ? {
453
- contextData: contextData
454
- } : {}), (_abortControllerRef$c = abortControllerRef.current) === null || _abortControllerRef$c === void 0 ? void 0 : _abortControllerRef$c.signal);
455
- case 2:
456
- response = _context2.sent;
457
- _context2.next = 3;
458
- return handleSSEStream(response);
459
- case 3:
460
- _context2.next = 5;
461
- break;
462
- case 4:
463
- _context2.prev = 4;
464
- _t5 = _context2["catch"](1);
465
- // Si fue un abort intencional (stop manual o cambio de chat), no disparar onError
466
- // porque eso inserta un "mensaje de error" en el chat al que acabamos de navegar.
467
- if (!isStoppedRef.current) {
468
- (_onErrorRef$current3 = onErrorRef.current) === null || _onErrorRef$current3 === void 0 || _onErrorRef$current3.call(onErrorRef);
469
- }
470
- clearStreamLoadingState();
471
- setLoading(false);
472
- setIsWriting(false);
473
- case 5:
474
- case "end":
475
- return _context2.stop();
476
- }
477
- }, _callee2, null, [[1, 4]]);
478
- }));
479
- return function askMaia(_x2) {
480
- return _ref4.apply(this, arguments);
481
- };
482
- }();
161
+ }(), [t, hitlExecutionContextRef]);
483
162
  var stopStreaming = useCallback(function () {
484
- if (abortControllerRef.current) {
485
- var _onStopRef$current;
486
- isStoppedRef.current = true;
487
- abortControllerRef.current.abort();
488
- abortControllerRef.current = null;
489
- setLoading(false);
490
- setIsWriting(false);
491
- clearStreamLoadingState();
492
- (_onStopRef$current = onStopRef.current) === null || _onStopRef$current === void 0 || _onStopRef$current.call(onStopRef);
493
- }
494
- }, [clearStreamLoadingState]);
495
-
496
- /**
497
- * Aborta el stream en curso (si existe) sin disparar `onStop`.
498
- * Úselo en casos donde no queremos agregar el mensaje de "cancelado"
499
- * (por ejemplo, al cambiar de chat).
500
- */
501
- var abortStreamSilently = useCallback(function () {
502
- if (abortControllerRef.current) {
503
- isStoppedRef.current = true;
504
- abortControllerRef.current.abort();
505
- abortControllerRef.current = null;
506
- setLoading(false);
507
- setIsWriting(false);
508
- clearStreamLoadingState();
509
- }
510
- }, [clearStreamLoadingState]);
511
-
512
- // Cleanup al desmontar: si queda un stream activo, abortarlo para evitar
513
- // que intente actualizar estado en un componente ya desmontado (fugas de
514
- // memoria y warnings).
515
- useEffect(function () {
516
- return function () {
517
- if (abortControllerRef.current) {
518
- abortControllerRef.current.abort();
519
- abortControllerRef.current = null;
163
+ sessionStreamManager.stopStream(activeSessionId, {
164
+ onStop: function onStop() {
165
+ var _onStopRef$current;
166
+ return (_onStopRef$current = onStopRef.current) === null || _onStopRef$current === void 0 ? void 0 : _onStopRef$current.call(onStopRef);
520
167
  }
521
- };
522
- }, []);
168
+ });
169
+ }, [activeSessionId]);
170
+ var abortStreamSilently = useCallback(function () {
171
+ sessionStreamManager.abortSilently(activeSessionId);
172
+ }, [activeSessionId]);
523
173
  var updateStreamActivity = useCallback(function (activity) {
524
- if (!activity) {
525
- clearStreamLoadingState();
526
- return;
527
- }
528
- applyStreamActivity(activity);
529
- }, [applyStreamActivity, clearStreamLoadingState]);
530
- var reset = function reset() {
531
- setData(null);
532
- setLoading(false);
533
- setIsWriting(false);
534
- clearStreamLoadingState();
535
- isStoppedRef.current = false;
536
- };
174
+ useSessionsStore.getState().setActivity(activeSessionId, activity);
175
+ }, [activeSessionId]);
176
+ var reset = useCallback(function () {
177
+ useSessionsStore.getState().patchMeta(activeSessionId, {
178
+ isLoading: false,
179
+ isWriting: false
180
+ });
181
+ useSessionsStore.getState().setActivity(activeSessionId, null);
182
+ }, [activeSessionId]);
537
183
  return {
538
184
  askMaia: askMaia,
539
- response: data,
540
185
  isLoading: isLoading,
541
186
  isWriting: isWriting,
542
187
  loadingMessage: loadingMessage,
@@ -544,8 +189,7 @@ export var useOrchestratorStream = function useOrchestratorStream(_ref) {
544
189
  updateStreamActivity: updateStreamActivity,
545
190
  reset: reset,
546
191
  stopStreaming: stopStreaming,
547
- abortStreamSilently: abortStreamSilently,
548
- handleSSEStream: handleSSEStream // Exponer para poder usarlo en continue-thread
192
+ abortStreamSilently: abortStreamSilently
549
193
  };
550
194
  };
551
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlVHJhbnNsYXRpb24iLCJtYWlhIiwiU0VDVElPTlMiLCJBQ1RJVklUWV9NRVNTQUdFX1JPVEFURV9NUyIsImFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UiLCJjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlIiwiY2FuUm90YXRlU3RyZWFtQWN0aXZpdHlQaGFzZSIsImdldEluaXRpYWxTdHJlYW1BY3Rpdml0eSIsImdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UiLCJnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSIsInJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5IiwiaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkIiwibWVyZ2VTdHJlYW1DaHVuayIsInVzZU9yY2hlc3RyYXRvclN0cmVhbSIsIl9yZWYiLCJvblN0cmVhbVVwZGF0ZSIsIm9uRmluaXNoU3RyZWFtIiwib25TdGFydFdyaXRpbmciLCJvblN0b3AiLCJvbkVycm9yIiwib25BcHByb3ZhbFJlcXVpcmVkIiwiaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWYiLCJfdXNlVHJhbnNsYXRpb24iLCJjaGF0QUkiLCJ0IiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwiZGF0YSIsInNldERhdGEiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlzTG9hZGluZyIsInNldExvYWRpbmciLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibG9hZGluZ01lc3NhZ2UiLCJzZXRMb2FkaW5nTWVzc2FnZSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic3RyZWFtQWN0aXZpdHkiLCJzZXRTdHJlYW1BY3Rpdml0eSIsImFib3J0Q29udHJvbGxlclJlZiIsImlzU3RvcHBlZFJlZiIsImFjdGl2aXR5TWVzc2FnZUluZGV4UmVmIiwib25TdHJlYW1VcGRhdGVSZWYiLCJvbkZpbmlzaFN0cmVhbVJlZiIsIm9uU3RhcnRXcml0aW5nUmVmIiwib25TdG9wUmVmIiwib25FcnJvclJlZiIsIm9uQXBwcm92YWxSZXF1aXJlZFJlZiIsImN1cnJlbnQiLCJjbGVhclN0cmVhbUxvYWRpbmdTdGF0ZSIsImFwcGx5U3RyZWFtQWN0aXZpdHkiLCJhY3Rpdml0eSIsInByZXYiLCJwaGFzZSIsIm1lc3NhZ2UiLCJ1bmRlZmluZWQiLCJpbnRlcnZhbElkIiwid2luZG93Iiwic2V0SW50ZXJ2YWwiLCJhZHZhbmNlZCIsIm5leHRJbmRleCIsImNsZWFySW50ZXJ2YWwiLCJoYW5kbGVTU0VTdHJlYW0iLCJfcmVmMiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJfb25FcnJvclJlZiRjdXJyZW50IiwiX2RhdGEkZXJyb3IiLCJfZGF0YSRlcnJvcjIiLCJwZW5kaW5nQ29udGVudCIsInRocm90dGxlVGltZXIiLCJlbWl0VGhyb3R0bGVkIiwiZmx1c2hQZW5kaW5nIiwiX3Jlc3BvbnNlJGJvZHkiLCJyZWFkZXIiLCJkZWNvZGVyIiwiYnVmZmVyIiwiYWNjdW11bGF0ZWRDb250ZW50IiwiaGFzU3RhcnRlZFdyaXRpbmciLCJlbnN1cmVXcml0aW5nU3RhcnRlZCIsImFwcGx5U3RyZWFtQ2h1bmsiLCJhcHBseVN0cmVhbUNvbXBsZXRlIiwiX3lpZWxkJHJlYWRlciRyZWFkIiwiZG9uZSIsInZhbHVlIiwibGluZXMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImxpbmUiLCJfbGluZSRzcGxpdCIsIl9saW5lJHNwbGl0MiIsImV2ZW50TGluZSIsImRhdGFMaW5lIiwiZXZlbnRUeXBlIiwiZGF0YVN0ciIsIl9kYXRhIiwiY2h1bmsiLCJfY2h1bmsiLCJfb25BcHByb3ZhbFJlcXVpcmVkUmUiLCJpc01hbnVhbEFwcHJvdmFsIiwiX29uRXJyb3JSZWYkY3VycmVudDIiLCJfdCIsIl90MiIsIl90MyIsIl90NCIsIndyYXAiLCJfY29udGV4dCIsIm5leHQiLCJjb250ZW50Iiwic2V0VGltZW91dCIsIl9vblN0cmVhbVVwZGF0ZVJlZiRjdSIsInRvRW1pdCIsImNhbGwiLCJjbGVhclRpbWVvdXQiLCJfb25TdHJlYW1VcGRhdGVSZWYkY3UyIiwiYm9keSIsImdldFJlYWRlciIsIkVycm9yIiwiVGV4dERlY29kZXIiLCJfb25TdGFydFdyaXRpbmdSZWYkY3UiLCJwYXlsb2FkIiwiX3BheWxvYWQkYWdlbnRfaWQiLCJfc3ViYWdlbnRSYXckcmVzb2x2ZWQiLCJfb25GaW5pc2hTdHJlYW1SZWYkY3UiLCJmaW5hbENvbnRlbnQiLCJzb3VyY2VzIiwibWVtb3J5U2Vzc2lvbklkIiwibWVtb3J5X3Nlc3Npb25faWQiLCJhdHRhY2htZW50cyIsIkFycmF5IiwiaXNBcnJheSIsInN1Z2dlc3Rpb25zIiwic3VnZ2VzdF9yZXBseSIsImFnZW50SWRSYXciLCJhZ2VudF9pZCIsImFnZW50SWQiLCJjb21wbGV0ZWRBZ2VudElkIiwiU3RyaW5nIiwidHJpbSIsInN1YmFnZW50UmF3Iiwic3ViYWdlbnQiLCJyZXNvbHZlZENvbnRleHQiLCJyZXNvbHZlZF9jb250ZXh0IiwiY2FuY2VsIiwiYWJydXB0IiwicmVhZCIsInNlbnQiLCJkZWNvZGUiLCJzdHJlYW0iLCJzcGxpdCIsInBvcCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJyZXBsYWNlIiwiSlNPTiIsInBhcnNlIiwibm9kZSIsInRocmVhZF9pZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsInBlbmRpbmdfYWN0aW9ucyIsImxlbmd0aCIsImNvbnNvbGUiLCJlcnJvciIsInR5cGUiLCJ3YXJuIiwiZSIsImYiLCJmaW5pc2giLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsImFza01haWEiLCJfcmVmNCIsIl9jYWxsZWUyIiwiX3JlZjMiLCJoaXN0b3J5IiwicHJvamVjdElkIiwibGFuZyIsInVzZXJJZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY2hhdElkIiwibWVzc2FnZUlkIiwiY2xpZW50SWQiLCJjbGllbnROYW1lIiwiZmVlSWQiLCJhZ2VudE5hbWUiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsInByb2plY3ROYW1lIiwidGFza0lkIiwidGFza05hbWUiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwiZnVhSWQiLCJzY0lkIiwiYWdlbnRFbnRpdHkiLCJhZ2VudFR5cGUiLCJjb250ZXh0TWVzc2FnZSIsImNvbnRleHREYXRhIiwiX2F0dGFjaG1lbnRzJGxlbmd0aCIsIl9hYm9ydENvbnRyb2xsZXJSZWYkYyIsImluaXRpYWxBY3Rpdml0eSIsIl9vbkVycm9yUmVmJGN1cnJlbnQzIiwiX3Q1IiwiX2NvbnRleHQyIiwiaGFzQXR0YWNobWVudHMiLCJCb29sZWFuIiwiYXR0YWNobWVudHNDb3VudCIsIkFib3J0Q29udHJvbGxlciIsIk9yY2hlc3RyYXRvciIsIm9yY2hlc3RyYXRvciIsIl9vYmplY3RTcHJlYWQiLCJpbnB1dCIsInNpZ25hbCIsIl94MiIsInN0b3BTdHJlYW1pbmciLCJfb25TdG9wUmVmJGN1cnJlbnQiLCJhYm9ydCIsImFib3J0U3RyZWFtU2lsZW50bHkiLCJ1cGRhdGVTdHJlYW1BY3Rpdml0eSIsInJlc2V0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZU9yY2hlc3RyYXRvclN0cmVhbS91c2VPcmNoZXN0cmF0b3JTdHJlYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvdyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc3RhbnQtY29uZGl0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb250aW51ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY2FzZS1kZWNsYXJhdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtc3ludGF4ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBDaGF0SGlzdG9yeSB9IGZyb20gJy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBBZ2VudEVudGl0eSwgQWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBDb250ZXh0TWVzc2FnZSB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgVXNlT3JjaGVzdHJhdG9yU3RyZWFtUHJvcHMsIFJlc29sdmVkQ29udGV4dCB9IGZyb20gJy4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtLmludGVyZmFjZSdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB0eXBlIHsgU3RyZWFtQWN0aXZpdHkgfSBmcm9tICcuLi8uLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB7XG4gIEFDVElWSVRZX01FU1NBR0VfUk9UQVRFX01TLFxuICBhZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlLFxuICBjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlLFxuICBjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlLFxuICBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHksXG4gIGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UsXG4gIGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxufSBmcm9tICcuLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkLCBtZXJnZVN0cmVhbUNodW5rIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3NlU3RyZWFtQ29udGVudCdcblxudHlwZSBTdWJhZ2VudFJhdyA9IHsgbmFtZT86IHN0cmluZzsgcmVzb2x2ZWRfY29udGV4dD86IFJlc29sdmVkQ29udGV4dCB8IG51bGwgfSB8IG51bGwgfCB1bmRlZmluZWRcblxuZXhwb3J0IGNvbnN0IHVzZU9yY2hlc3RyYXRvclN0cmVhbSA9ICh7XG4gIG9uU3RyZWFtVXBkYXRlLFxuICBvbkZpbmlzaFN0cmVhbSxcbiAgb25TdGFydFdyaXRpbmcsXG4gIG9uU3RvcCxcbiAgb25FcnJvcixcbiAgb25BcHByb3ZhbFJlcXVpcmVkLFxuICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZixcbn06IFVzZU9yY2hlc3RyYXRvclN0cmVhbVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmNoYXRBSV0pXG4gIGNvbnN0IFtkYXRhLCBzZXREYXRhXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xvYWRpbmdNZXNzYWdlLCBzZXRMb2FkaW5nTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbc3RyZWFtQWN0aXZpdHksIHNldFN0cmVhbUFjdGl2aXR5XSA9IHVzZVN0YXRlPFN0cmVhbUFjdGl2aXR5IHwgbnVsbD4obnVsbClcbiAgY29uc3QgYWJvcnRDb250cm9sbGVyUmVmID0gdXNlUmVmPEFib3J0Q29udHJvbGxlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzU3RvcHBlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgYWN0aXZpdHlNZXNzYWdlSW5kZXhSZWYgPSB1c2VSZWYoMClcblxuICBjb25zdCBvblN0cmVhbVVwZGF0ZVJlZiA9IHVzZVJlZihvblN0cmVhbVVwZGF0ZSlcbiAgY29uc3Qgb25GaW5pc2hTdHJlYW1SZWYgPSB1c2VSZWYob25GaW5pc2hTdHJlYW0pXG4gIGNvbnN0IG9uU3RhcnRXcml0aW5nUmVmID0gdXNlUmVmKG9uU3RhcnRXcml0aW5nKVxuICBjb25zdCBvblN0b3BSZWYgPSB1c2VSZWYob25TdG9wKVxuICBjb25zdCBvbkVycm9yUmVmID0gdXNlUmVmKG9uRXJyb3IpXG4gIGNvbnN0IG9uQXBwcm92YWxSZXF1aXJlZFJlZiA9IHVzZVJlZihvbkFwcHJvdmFsUmVxdWlyZWQpXG5cbiAgb25TdHJlYW1VcGRhdGVSZWYuY3VycmVudCA9IG9uU3RyZWFtVXBkYXRlXG4gIG9uRmluaXNoU3RyZWFtUmVmLmN1cnJlbnQgPSBvbkZpbmlzaFN0cmVhbVxuICBvblN0YXJ0V3JpdGluZ1JlZi5jdXJyZW50ID0gb25TdGFydFdyaXRpbmdcbiAgb25TdG9wUmVmLmN1cnJlbnQgPSBvblN0b3BcbiAgb25FcnJvclJlZi5jdXJyZW50ID0gb25FcnJvclxuICBvbkFwcHJvdmFsUmVxdWlyZWRSZWYuY3VycmVudCA9IG9uQXBwcm92YWxSZXF1aXJlZFxuXG4gIGNvbnN0IGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGFjdGl2aXR5TWVzc2FnZUluZGV4UmVmLmN1cnJlbnQgPSAwXG4gICAgc2V0U3RyZWFtQWN0aXZpdHkobnVsbClcbiAgICBzZXRMb2FkaW5nTWVzc2FnZShudWxsKVxuICB9LCBbXSlcblxuICBjb25zdCBhcHBseVN0cmVhbUFjdGl2aXR5ID0gdXNlQ2FsbGJhY2soKGFjdGl2aXR5OiBTdHJlYW1BY3Rpdml0eSkgPT4ge1xuICAgIHNldFN0cmVhbUFjdGl2aXR5KHByZXYgPT4ge1xuICAgICAgaWYgKHByZXY/LnBoYXNlID09PSBhY3Rpdml0eS5waGFzZSAmJiBjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlKGFjdGl2aXR5LnBoYXNlKSkge1xuICAgICAgICByZXR1cm4gcHJldlxuICAgICAgfVxuICAgICAgaWYgKHByZXY/LnBoYXNlICE9PSBhY3Rpdml0eS5waGFzZSkge1xuICAgICAgICBhY3Rpdml0eU1lc3NhZ2VJbmRleFJlZi5jdXJyZW50ID0gMFxuICAgICAgfVxuICAgICAgc2V0TG9hZGluZ01lc3NhZ2UoYWN0aXZpdHkubWVzc2FnZSlcbiAgICAgIHJldHVybiBhY3Rpdml0eVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0xvYWRpbmcgfHwgaXNXcml0aW5nIHx8ICFzdHJlYW1BY3Rpdml0eSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgICBpZiAoIWNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2Uoc3RyZWFtQWN0aXZpdHkucGhhc2UpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBzZXRTdHJlYW1BY3Rpdml0eShwcmV2ID0+IHtcbiAgICAgICAgaWYgKCFwcmV2IHx8ICFjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlKHByZXYucGhhc2UpKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNhbkFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UocHJldi5waGFzZSwgYWN0aXZpdHlNZXNzYWdlSW5kZXhSZWYuY3VycmVudCkpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkdmFuY2VkID0gYWR2YW5jZVN0cmVhbUFjdGl2aXR5TWVzc2FnZShwcmV2LCBhY3Rpdml0eU1lc3NhZ2VJbmRleFJlZi5jdXJyZW50LCB0KVxuICAgICAgICBpZiAoIWFkdmFuY2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBhY3Rpdml0eU1lc3NhZ2VJbmRleFJlZi5jdXJyZW50ID0gYWR2YW5jZWQubmV4dEluZGV4XG4gICAgICAgIHNldExvYWRpbmdNZXNzYWdlKGFkdmFuY2VkLmFjdGl2aXR5Lm1lc3NhZ2UpXG4gICAgICAgIHJldHVybiBhZHZhbmNlZC5hY3Rpdml0eVxuICAgICAgfSlcbiAgICB9LCBBQ1RJVklUWV9NRVNTQUdFX1JPVEFURV9NUylcblxuICAgIHJldHVybiAoKSA9PiB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKVxuICB9LCBbaXNMb2FkaW5nLCBpc1dyaXRpbmcsIHN0cmVhbUFjdGl2aXR5Py5waGFzZSwgdF0pXG5cbiAgY29uc3QgaGFuZGxlU1NFU3RyZWFtID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgLy8gVGltZS10aHJvdHRsZTogZXZpdGEgZW1pdGlyIG9uU3RyZWFtVXBkYXRlIG3DoXMgZGUgdW5hIHZleiBjYWRhIH4xNm1zLlxuICAgICAgLy8gVXNhbW9zIHRpbWVyIHBhcmEgcXVlIGVsIHN0cmVhbSBzaWdhIHBpbnRhbmRvIGF1bnF1ZSByQUYgZXN0w6kgdGhyb3R0bGVhZG8uXG4gICAgICAvLyBOb3RhOiBubyB0b2NhbW9zIGVsIHN0YXRlIGBkYXRhYCBlbiBlbCBob3QgcGF0aCAoc29sbyBzZSBhY3R1YWxpemEgZW5cbiAgICAgIC8vIGBjb21wbGV0ZWAvcmVzZXRzKSBwYXJhIG5vIHJlLXJlbmRlcml6YXIgYSBsb3MgY29uc3VtaWRvcmVzIGRlbCBob29rXG4gICAgICAvLyBlbiBjYWRhIGZyYW1lOyBlbCB0ZXh0byBlbiB2aXZvIHZpYWphIHBvciBlbCBzdHJlYW1pbmdTdG9yZS5cbiAgICAgIGxldCBwZW5kaW5nQ29udGVudDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICAgIGxldCB0aHJvdHRsZVRpbWVyOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAgICAgY29uc3QgZW1pdFRocm90dGxlZCA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICAgICAgcGVuZGluZ0NvbnRlbnQgPSBjb250ZW50XG4gICAgICAgIGlmICh0aHJvdHRsZVRpbWVyICE9IG51bGwpIHJldHVyblxuICAgICAgICB0aHJvdHRsZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRocm90dGxlVGltZXIgPSBudWxsXG4gICAgICAgICAgaWYgKHBlbmRpbmdDb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgICAgICBwZW5kaW5nQ29udGVudCA9IG51bGxcbiAgICAgICAgICAgIG9uU3RyZWFtVXBkYXRlUmVmLmN1cnJlbnQ/Lih0b0VtaXQsIG51bGwsICcnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTYpXG4gICAgICB9XG4gICAgICBjb25zdCBmbHVzaFBlbmRpbmcgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aHJvdHRsZVRpbWVyICE9IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRocm90dGxlVGltZXIpXG4gICAgICAgICAgdGhyb3R0bGVUaW1lciA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVuZGluZ0NvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHRvRW1pdCA9IHBlbmRpbmdDb250ZW50XG4gICAgICAgICAgcGVuZGluZ0NvbnRlbnQgPSBudWxsXG4gICAgICAgICAgb25TdHJlYW1VcGRhdGVSZWYuY3VycmVudD8uKHRvRW1pdCwgbnVsbCwgJycpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKClcbiAgICAgICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlYWRlciBhdmFpbGFibGUnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgICAgIGxldCBidWZmZXIgPSAnJ1xuICAgICAgICBsZXQgYWNjdW11bGF0ZWRDb250ZW50ID0gJydcbiAgICAgICAgbGV0IGhhc1N0YXJ0ZWRXcml0aW5nID0gZmFsc2VcblxuICAgICAgICBjb25zdCBlbnN1cmVXcml0aW5nU3RhcnRlZCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoaGFzU3RhcnRlZFdyaXRpbmcpIHJldHVyblxuICAgICAgICAgIGhhc1N0YXJ0ZWRXcml0aW5nID0gdHJ1ZVxuICAgICAgICAgIHNldElzV3JpdGluZyh0cnVlKVxuICAgICAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgICAgICAgIG9uU3RhcnRXcml0aW5nUmVmLmN1cnJlbnQ/LigpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBseVN0cmVhbUNodW5rID0gKGNodW5rOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoIWNodW5rKSByZXR1cm5cbiAgICAgICAgICBhY2N1bXVsYXRlZENvbnRlbnQgPSBtZXJnZVN0cmVhbUNodW5rKGFjY3VtdWxhdGVkQ29udGVudCwgY2h1bmspXG4gICAgICAgICAgZW1pdFRocm90dGxlZChhY2N1bXVsYXRlZENvbnRlbnQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBseVN0cmVhbUNvbXBsZXRlID0gKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmluYWxDb250ZW50ID0gKHBheWxvYWQuY29udGVudCBhcyBzdHJpbmcpIHx8IGFjY3VtdWxhdGVkQ29udGVudFxuICAgICAgICAgIGNvbnN0IHNvdXJjZXMgPSBwYXlsb2FkLnNvdXJjZXMgfHwgbnVsbFxuICAgICAgICAgIGNvbnN0IG1lbW9yeVNlc3Npb25JZCA9IChwYXlsb2FkLm1lbW9yeV9zZXNzaW9uX2lkIGFzIHN0cmluZykgfHwgJydcbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5hdHRhY2htZW50cykgPyBwYXlsb2FkLmF0dGFjaG1lbnRzIDogbnVsbFxuICAgICAgICAgIGxldCBzdWdnZXN0aW9uczogc3RyaW5nW10gfCBudWxsID0gbnVsbFxuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdF9yZXBseSkpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gcGF5bG9hZC5zdWdnZXN0X3JlcGx5IGFzIHN0cmluZ1tdXG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQuc3VnZ2VzdGlvbnMpKSB7XG4gICAgICAgICAgICBzdWdnZXN0aW9ucyA9IHBheWxvYWQuc3VnZ2VzdGlvbnMgYXMgc3RyaW5nW11cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYWdlbnRJZFJhdyA9IHBheWxvYWQuYWdlbnRfaWQgPz8gcGF5bG9hZC5hZ2VudElkXG4gICAgICAgICAgY29uc3QgY29tcGxldGVkQWdlbnRJZCA9XG4gICAgICAgICAgICBhZ2VudElkUmF3ICE9IG51bGwgJiYgU3RyaW5nKGFnZW50SWRSYXcpLnRyaW0oKSAhPT0gJycgPyBTdHJpbmcoYWdlbnRJZFJhdykudHJpbSgpIDogbnVsbFxuICAgICAgICAgIGNvbnN0IHN1YmFnZW50UmF3ID0gcGF5bG9hZC5zdWJhZ2VudCBhcyBTdWJhZ2VudFJhd1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29udGV4dCA9IHN1YmFnZW50UmF3Py5yZXNvbHZlZF9jb250ZXh0ID8/IG51bGxcbiAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgIHNldERhdGEoZmluYWxDb250ZW50KVxuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgICAgICBvbkZpbmlzaFN0cmVhbVJlZi5jdXJyZW50Py4oXG4gICAgICAgICAgICBmaW5hbENvbnRlbnQsXG4gICAgICAgICAgICBzb3VyY2VzLFxuICAgICAgICAgICAgbWVtb3J5U2Vzc2lvbklkLFxuICAgICAgICAgICAgYXR0YWNobWVudHMsXG4gICAgICAgICAgICBzdWdnZXN0aW9ucyxcbiAgICAgICAgICAgIGNvbXBsZXRlZEFnZW50SWQsXG4gICAgICAgICAgICByZXNvbHZlZENvbnRleHRcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGlmIChpc1N0b3BwZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgcmVhZGVyLmNhbmNlbCgpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKClcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXNTdG9wcGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcblxcbicpXG4gICAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJydcblxuICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpID09PSAnJykgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgW2V2ZW50TGluZSwgZGF0YUxpbmVdID0gbGluZS5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIGlmICghZXZlbnRMaW5lIHx8ICFkYXRhTGluZSkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnRMaW5lLnJlcGxhY2UoJ2V2ZW50OiAnLCAnJykudHJpbSgpXG4gICAgICAgICAgICBjb25zdCBkYXRhU3RyID0gZGF0YUxpbmUucmVwbGFjZSgnZGF0YTogJywgJycpLnRyaW0oKVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkYXRhU3RyKVxuXG4gICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndGhpbmtpbmcnOlxuICAgICAgICAgICAgICAgICAgaWYgKCFoYXNTdGFydGVkV3JpdGluZykge1xuICAgICAgICAgICAgICAgICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoe1xuICAgICAgICAgICAgICAgICAgICAgIHBoYXNlOiAndGhpbmtpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UoMCwgdCksXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAgICAgY2FzZSAndG9rZW4nOiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHR5cGVvZiBkYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZGF0YS5jb250ZW50IDogJydcbiAgICAgICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ2h1bmsoY2h1bmspXG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRlbnQnOiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IHR5cGVvZiBkYXRhLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gZGF0YS5jb250ZW50IDogJydcbiAgICAgICAgICAgICAgICAgIGVuc3VyZVdyaXRpbmdTdGFydGVkKClcbiAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ2h1bmsoY2h1bmspXG4gICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZUxpa2VTc2VQYXlsb2FkKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgICAgICAgICAvLyBFbCBvcmNoZXN0cmF0b3IgZGVsZWfDsyBhIHVuIHN1YmFnZW50ZTogTk8gbG8gZXhwb25lbW9zLiBNYW50ZW5lbW9zXG4gICAgICAgICAgICAgICAgICAvLyBlbCBpbmRpY2Fkb3IgZGUgYWN0aXZpZGFkIGdlbsOpcmljbyBkZSBNQUlBLCBzaW4gYW51bmNpYXIgbGFcbiAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVyZW5jaWEgbmkgZWwgbm9tYnJlIGRlbCBzdWJhZ2VudGUuXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0YS5ub2RlID09PSAnYWdlbnRfdHJhbnNmZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1BY3Rpdml0eShcbiAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZj8uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnRocmVhZF9pZCA9PT0gJ3N0cmluZycgPyBkYXRhLnRocmVhZF9pZCA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtQ29tcGxldGUoZGF0YSlcbiAgICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgICAgICBjYXNlICdhcHByb3ZhbF9yZXF1aXJlZCc6IHtcbiAgICAgICAgICAgICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgICAgICAgICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICAgICAgICAgICAgICBjb25zdCBpc01hbnVhbEFwcHJvdmFsID0gZGF0YS5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgIGlmICghaXNNYW51YWxBcHByb3ZhbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICBjbGVhclN0cmVhbUxvYWRpbmdTdGF0ZSgpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvbkFwcHJvdmFsUmVxdWlyZWRSZWYuY3VycmVudD8uKGRhdGEsIGFjY3VtdWxhdGVkQ29udGVudClcbiAgICAgICAgICAgICAgICAgIGlmIChpc01hbnVhbEFwcHJvdmFsICYmIEFycmF5LmlzQXJyYXkoZGF0YS5wZW5kaW5nX2FjdGlvbnMpICYmIGRhdGEucGVuZGluZ19hY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbUFjdGl2aXR5KHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIGhpdGxFeGVjdXRpb25Db250ZXh0UmVmPy5jdXJyZW50KSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU1NFIEVycm9yOicsIGRhdGEuZXJyb3IpXG4gICAgICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICAgICAgICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgICAgICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgICAgICAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgICAgICAgICAgICAgIHNldExvYWRpbmdNZXNzYWdlKG51bGwpIC8vIExpbXBpYXIgbWVuc2FqZSBjdWFuZG8gaGF5IGVycm9yXG4gICAgICAgICAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQ/LihkYXRhLmVycm9yPy50eXBlLCBkYXRhLmVycm9yPy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Vua25vd24gU1NFIGV2ZW50IHR5cGU6JywgZXZlbnRUeXBlKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIFNTRSBkYXRhOicsIHBhcnNlRXJyb3IsIGRhdGFTdHIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBmbHVzaFBlbmRpbmcoKVxuICAgICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG5cbiAgICAgICAgLy8gU29sbyBlamVjdXRhciBvbkVycm9yIHNpIG5vIGZ1ZSB1biBzdG9wIGludGVuY2lvbmFsXG4gICAgICAgIGlmICghaXNTdG9wcGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQ/LigpXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGZsdXNoUGVuZGluZygpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgICAgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGUoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FwcGx5U3RyZWFtQWN0aXZpdHksIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlLCBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZiwgdF1cbiAgKVxuXG4gIGNvbnN0IGFza01haWEgPSBhc3luYyAoe1xuICAgIG1lc3NhZ2UsXG4gICAgaGlzdG9yeSxcbiAgICBwcm9qZWN0SWQsXG4gICAgbGFuZyxcbiAgICB1c2VySWQsXG4gICAgZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lLFxuICAgIGNvbXBhbnlJZCxcbiAgICBjaGF0SWQsXG4gICAgbWVzc2FnZUlkLFxuICAgIGNsaWVudElkLFxuICAgIGNsaWVudE5hbWUsXG4gICAgZmVlSWQsXG4gICAgYWdlbnROYW1lLFxuICAgIGFnZW50SWQsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIHByb2plY3ROYW1lLFxuICAgIHRhc2tJZCxcbiAgICB0YXNrTmFtZSxcbiAgICBmYXFJZCxcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZCxcbiAgICBmdWFJZCxcbiAgICBzY0lkLFxuICAgIGFnZW50RW50aXR5LFxuICAgIGFnZW50VHlwZSxcbiAgICBjb250ZXh0TWVzc2FnZSxcbiAgICBjb250ZXh0RGF0YSxcbiAgfToge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGhpc3Rvcnk6IENoYXRIaXN0b3J5W11cbiAgICBwcm9qZWN0SWQ6IG51bWJlciB8IG51bGxcbiAgICBsYW5nOiBzdHJpbmdcbiAgICB1c2VySWQ6IHN0cmluZ1xuICAgIGZpcnN0TmFtZT86IHN0cmluZ1xuICAgIGxhc3ROYW1lPzogc3RyaW5nXG4gICAgY29tcGFueUlkOiBzdHJpbmdcbiAgICBjaGF0SWQ6IHN0cmluZ1xuICAgIG1lc3NhZ2VJZDogc3RyaW5nXG4gICAgY2xpZW50SWQ/OiBudW1iZXJcbiAgICBjbGllbnROYW1lPzogc3RyaW5nXG4gICAgZmVlSWQ/OiBudW1iZXJcbiAgICBhZ2VudE5hbWU6IHN0cmluZ1xuICAgIGFnZW50SWQ6IHN0cmluZ1xuICAgIGlzV2ViU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgICBwcm9qZWN0TmFtZT86IHN0cmluZ1xuICAgIHRhc2tJZD86IG51bWJlclxuICAgIHRhc2tOYW1lPzogc3RyaW5nXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgc2NJZD86IHN0cmluZ1xuICAgIGFnZW50RW50aXR5PzogQWdlbnRFbnRpdHlcbiAgICBhZ2VudFR5cGU/OiBBZ2VudFR5cGVcbiAgICBjb250ZXh0TWVzc2FnZT86IENvbnRleHRNZXNzYWdlXG4gICAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICB9KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIHNldERhdGEobnVsbClcbiAgICAgIGFjdGl2aXR5TWVzc2FnZUluZGV4UmVmLmN1cnJlbnQgPSAwXG4gICAgICBjb25zdCBpbml0aWFsQWN0aXZpdHkgPSBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkodCwge1xuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgICAgICBoYXNBdHRhY2htZW50czogQm9vbGVhbihhdHRhY2htZW50cz8ubGVuZ3RoKSxcbiAgICAgICAgYXR0YWNobWVudHNDb3VudDogYXR0YWNobWVudHM/Lmxlbmd0aCA/PyAwLFxuICAgICAgfSlcbiAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoaW5pdGlhbEFjdGl2aXR5KVxuICAgICAgaXNTdG9wcGVkUmVmLmN1cnJlbnQgPSBmYWxzZSAvLyBSZXNldGVhciBmbGFnIGFsIGluaWNpYXIgbnVldmEgcGV0aWNpw7NuXG5cbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50ID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWFpYS5PcmNoZXN0cmF0b3Iub3JjaGVzdHJhdG9yKFxuICAgICAgICB7XG4gICAgICAgICAgaW5wdXQ6IG1lc3NhZ2UsXG4gICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICBsYW5nLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAuLi4oZmlyc3ROYW1lID8geyBmaXJzdE5hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4obGFzdE5hbWUgPyB7IGxhc3ROYW1lIH0gOiB7fSksXG4gICAgICAgICAgY29tcGFueUlkLFxuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgY2xpZW50SWQsXG4gICAgICAgICAgLi4uKGZlZUlkICE9IG51bGwgPyB7IGZlZUlkIH0gOiB7fSksXG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgICAgICAgIC4uLihwcm9qZWN0SWQgPyB7IHByb2plY3RJZCB9IDoge30pLFxuICAgICAgICAgIC4uLihhdHRhY2htZW50cyA/IHsgYXR0YWNobWVudHMgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ocHJvamVjdE5hbWUgPyB7IHByb2plY3ROYW1lIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGNsaWVudE5hbWUgPyB7IGNsaWVudE5hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4odGFza0lkICE9IG51bGwgPyB7IHRhc2tJZCB9IDoge30pLFxuICAgICAgICAgIC4uLih0YXNrTmFtZSA/IHsgdGFza05hbWUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oZmFxSWQgPyB7IGZhcUlkIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgICAgIC4uLihmdWFJZCA/IHsgZnVhSWQgfSA6IHt9KSxcbiAgICAgICAgICAuLi4oc2NJZCA/IHsgc2NJZCB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudEVudGl0eSAhPSBudWxsID8geyBhZ2VudEVudGl0eSB9IDoge30pLFxuICAgICAgICAgIC4uLihhZ2VudFR5cGUgIT0gbnVsbCA/IHsgYWdlbnRUeXBlIH0gOiB7fSksXG4gICAgICAgICAgLi4uKGNvbnRleHRNZXNzYWdlID8geyBjb250ZXh0TWVzc2FnZSB9IDoge30pLFxuICAgICAgICAgIC4uLihjb250ZXh0RGF0YSA/IHsgY29udGV4dERhdGEgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQ/LnNpZ25hbFxuICAgICAgKVxuXG4gICAgICBhd2FpdCBoYW5kbGVTU0VTdHJlYW0ocmVzcG9uc2UpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFNpIGZ1ZSB1biBhYm9ydCBpbnRlbmNpb25hbCAoc3RvcCBtYW51YWwgbyBjYW1iaW8gZGUgY2hhdCksIG5vIGRpc3BhcmFyIG9uRXJyb3JcbiAgICAgIC8vIHBvcnF1ZSBlc28gaW5zZXJ0YSB1biBcIm1lbnNhamUgZGUgZXJyb3JcIiBlbiBlbCBjaGF0IGFsIHF1ZSBhY2FiYW1vcyBkZSBuYXZlZ2FyLlxuICAgICAgaWYgKCFpc1N0b3BwZWRSZWYuY3VycmVudCkge1xuICAgICAgICBvbkVycm9yUmVmLmN1cnJlbnQ/LigpXG4gICAgICB9XG4gICAgICBjbGVhclN0cmVhbUxvYWRpbmdTdGF0ZSgpXG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0b3BTdHJlYW1pbmcgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50KSB7XG4gICAgICBpc1N0b3BwZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50LmFib3J0KClcbiAgICAgIGFib3J0Q29udHJvbGxlclJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIGNsZWFyU3RyZWFtTG9hZGluZ1N0YXRlKClcbiAgICAgIG9uU3RvcFJlZi5jdXJyZW50Py4oKVxuICAgIH1cbiAgfSwgW2NsZWFyU3RyZWFtTG9hZGluZ1N0YXRlXSlcblxuICAvKipcbiAgICogQWJvcnRhIGVsIHN0cmVhbSBlbiBjdXJzbyAoc2kgZXhpc3RlKSBzaW4gZGlzcGFyYXIgYG9uU3RvcGAuXG4gICAqIMOac2VsbyBlbiBjYXNvcyBkb25kZSBubyBxdWVyZW1vcyBhZ3JlZ2FyIGVsIG1lbnNhamUgZGUgXCJjYW5jZWxhZG9cIlxuICAgKiAocG9yIGVqZW1wbG8sIGFsIGNhbWJpYXIgZGUgY2hhdCkuXG4gICAqL1xuICBjb25zdCBhYm9ydFN0cmVhbVNpbGVudGx5ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCkge1xuICAgICAgaXNTdG9wcGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudC5hYm9ydCgpXG4gICAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgICBjbGVhclN0cmVhbUxvYWRpbmdTdGF0ZSgpXG4gICAgfVxuICB9LCBbY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGVdKVxuXG4gIC8vIENsZWFudXAgYWwgZGVzbW9udGFyOiBzaSBxdWVkYSB1biBzdHJlYW0gYWN0aXZvLCBhYm9ydGFybG8gcGFyYSBldml0YXJcbiAgLy8gcXVlIGludGVudGUgYWN0dWFsaXphciBlc3RhZG8gZW4gdW4gY29tcG9uZW50ZSB5YSBkZXNtb250YWRvIChmdWdhcyBkZVxuICAvLyBtZW1vcmlhIHkgd2FybmluZ3MpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyUmVmLmN1cnJlbnQuYWJvcnQoKVxuICAgICAgICBhYm9ydENvbnRyb2xsZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZVN0cmVhbUFjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAgKGFjdGl2aXR5OiBTdHJlYW1BY3Rpdml0eSB8IG51bGwpID0+IHtcbiAgICAgIGlmICghYWN0aXZpdHkpIHtcbiAgICAgICAgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGFwcGx5U3RyZWFtQWN0aXZpdHkoYWN0aXZpdHkpXG4gICAgfSxcbiAgICBbYXBwbHlTdHJlYW1BY3Rpdml0eSwgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGVdXG4gIClcblxuICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICBzZXREYXRhKG51bGwpXG4gICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgY2xlYXJTdHJlYW1Mb2FkaW5nU3RhdGUoKVxuICAgIGlzU3RvcHBlZFJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXNrTWFpYSxcbiAgICByZXNwb25zZTogZGF0YSxcbiAgICBpc0xvYWRpbmcsXG4gICAgaXNXcml0aW5nLFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIHVwZGF0ZVN0cmVhbUFjdGl2aXR5LFxuICAgIHJlc2V0LFxuICAgIHN0b3BTdHJlYW1pbmcsXG4gICAgYWJvcnRTdHJlYW1TaWxlbnRseSxcbiAgICBoYW5kbGVTU0VTdHJlYW0sIC8vIEV4cG9uZXIgcGFyYSBwb2RlciB1c2FybG8gZW4gY29udGludWUtdGhyZWFkXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFFBQVEsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLFNBQVMsUUFBUSxPQUFPO0FBQ2hFLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBRTlDLE9BQU9DLElBQUksTUFBTSxxQkFBcUI7QUFLdEMsU0FBU0MsUUFBUSxRQUFRLHdCQUF3QjtBQUVqRCxTQUNFQywwQkFBMEIsRUFDMUJDLDRCQUE0QixFQUM1QkMsK0JBQStCLEVBQy9CQyw0QkFBNEIsRUFDNUJDLHdCQUF3QixFQUN4QkMseUJBQXlCLEVBQ3pCQyx3QkFBd0IsRUFDeEJDLDZCQUE2QixFQUM3QkMsZ0NBQWdDLFFBQzNCLG9DQUFvQztBQUMzQyxTQUFTQyx3QkFBd0IsRUFBRUMsZ0JBQWdCLFFBQVEsOEJBQThCO0FBSXpGLE9BQU8sSUFBTUMscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBQUMsSUFBQSxFQVFBO0VBQUEsSUFQaENDLGNBQWMsR0FBQUQsSUFBQSxDQUFkQyxjQUFjO0lBQ2RDLGNBQWMsR0FBQUYsSUFBQSxDQUFkRSxjQUFjO0lBQ2RDLGNBQWMsR0FBQUgsSUFBQSxDQUFkRyxjQUFjO0lBQ2RDLE1BQU0sR0FBQUosSUFBQSxDQUFOSSxNQUFNO0lBQ05DLE9BQU8sR0FBQUwsSUFBQSxDQUFQSyxPQUFPO0lBQ1BDLGtCQUFrQixHQUFBTixJQUFBLENBQWxCTSxrQkFBa0I7SUFDbEJDLHVCQUF1QixHQUFBUCxJQUFBLENBQXZCTyx1QkFBdUI7RUFFdkIsSUFBQUMsZUFBQSxHQUFjdkIsY0FBYyxDQUFDLENBQUNFLFFBQVEsQ0FBQ3NCLE1BQU0sQ0FBQyxDQUFDO0lBQXZDQyxDQUFDLEdBQUFGLGVBQUEsQ0FBREUs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
195
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVJlZiIsInVzZVRyYW5zbGF0aW9uIiwiU0VDVElPTlMiLCJzZXNzaW9uU3RyZWFtTWFuYWdlciIsInVzZVNlc3Npb25zU3RvcmUiLCJ1c2VTZXNzaW9uU3RyZWFtU3RhdGUiLCJ1c2VPcmNoZXN0cmF0b3JTdHJlYW0iLCJfcmVmIiwiYWN0aXZlU2Vzc2lvbklkIiwib25TdHJlYW1VcGRhdGUiLCJvbkZpbmlzaFN0cmVhbSIsIm9uU3RhcnRXcml0aW5nIiwib25TdG9wIiwib25FcnJvciIsIm9uQXBwcm92YWxSZXF1aXJlZCIsImhpdGxFeGVjdXRpb25Db250ZXh0UmVmIiwiX3VzZVRyYW5zbGF0aW9uIiwiY2hhdEFJIiwidCIsIl91c2VTZXNzaW9uU3RyZWFtU3RhdCIsImlzTG9hZGluZyIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwic3RyZWFtQWN0aXZpdHkiLCJvblN0cmVhbVVwZGF0ZVJlZiIsIm9uRmluaXNoU3RyZWFtUmVmIiwib25TdGFydFdyaXRpbmdSZWYiLCJvblN0b3BSZWYiLCJvbkVycm9yUmVmIiwib25BcHByb3ZhbFJlcXVpcmVkUmVmIiwiY3VycmVudCIsImFza01haWEiLCJfcmVmMiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicGF5bG9hZCIsIl9wYXlsb2FkJGF0dGFjaG1lbnRzIiwiX3BheWxvYWQkYXR0YWNobWVudHMkIiwiX3BheWxvYWQkYXR0YWNobWVudHMyIiwiX2hpdGxFeGVjdXRpb25Db250ZXh0Iiwic2Vzc2lvbklkIiwibWVzc2FnZUlkIiwicGxhY2Vob2xkZXJJZCIsImN0eCIsInJlcXVlc3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImNoYXRJZCIsImNvbmNhdCIsIl9vYmplY3RTcHJlYWQiLCJpbnB1dCIsIm1lc3NhZ2UiLCJoaXN0b3J5IiwibGFuZyIsInVzZXJJZCIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiY29tcGFueUlkIiwiY2xpZW50SWQiLCJmZWVJZCIsImFnZW50TmFtZSIsImFnZW50SWQiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsInByb2plY3RJZCIsImF0dGFjaG1lbnRzIiwicHJvamVjdE5hbWUiLCJjbGllbnROYW1lIiwidGFza0lkIiwidGFza05hbWUiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwiZnVhSWQiLCJzY0lkIiwiYWdlbnRFbnRpdHkiLCJhZ2VudFR5cGUiLCJjb250ZXh0TWVzc2FnZSIsImNvbnRleHREYXRhIiwiYWJydXB0Iiwic3RhcnRTdHJlYW0iLCJhY3Rpdml0eU9wdGlvbnMiLCJoYXNBdHRhY2htZW50cyIsIkJvb2xlYW4iLCJsZW5ndGgiLCJhdHRhY2htZW50c0NvdW50IiwiaGl0bEV4ZWN1dGlvbkNvbnRleHQiLCJhZ2VudEVtb2ppIiwiY2FsbGJhY2tzIiwiY29udGVudCIsIl9vblN0cmVhbVVwZGF0ZVJlZiRjdSIsImNhbGwiLCJfb25TdGFydFdyaXRpbmdSZWYkY3UiLCJmaW5pc2hQYXlsb2FkIiwiX29uRmluaXNoU3RyZWFtUmVmJGN1Iiwic291cmNlcyIsIm1lbW9yeVNlc3Npb25JZCIsInN1Z2dlc3Rpb25zIiwiY29tcGxldGVkQWdlbnRJZCIsInJlc29sdmVkQ29udGV4dCIsImVycm9yVHlwZSIsImVycm9yTWVzc2FnZSIsIl9vbkVycm9yUmVmJGN1cnJlbnQiLCJhcHByb3ZhbCIsImFjY3VtdWxhdGVkQ29udGVudCIsIl9vbkFwcHJvdmFsUmVxdWlyZWRSZSIsInN0b3AiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwic3RvcFN0cmVhbWluZyIsInN0b3BTdHJlYW0iLCJfb25TdG9wUmVmJGN1cnJlbnQiLCJhYm9ydFN0cmVhbVNpbGVudGx5IiwiYWJvcnRTaWxlbnRseSIsInVwZGF0ZVN0cmVhbUFjdGl2aXR5IiwiYWN0aXZpdHkiLCJnZXRTdGF0ZSIsInNldEFjdGl2aXR5IiwicmVzZXQiLCJwYXRjaE1ldGEiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlT3JjaGVzdHJhdG9yU3RyZWFtL3VzZU9yY2hlc3RyYXRvclN0cmVhbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENoYXRIaXN0b3J5IH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IEFnZW50RW50aXR5LCBBZ2VudFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IENvbnRleHRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBVc2VPcmNoZXN0cmF0b3JTdHJlYW1Qcm9wcywgU3RyZWFtQ29udGV4dCB9IGZyb20gJy4vdXNlT3JjaGVzdHJhdG9yU3RyZWFtLmludGVyZmFjZSdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB0eXBlIHsgU3RyZWFtQWN0aXZpdHkgfSBmcm9tICcuLi8uLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB7IHNlc3Npb25TdHJlYW1NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvblN0cmVhbU1hbmFnZXInXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IHVzZVNlc3Npb25TdHJlYW1TdGF0ZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25NZXRhJ1xuaW1wb3J0IHR5cGUgeyBTdGFydFN0cmVhbVJlc3VsdCB9IGZyb20gJy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25zLnR5cGVzJ1xuXG50eXBlIEFza01haWFQYXlsb2FkID0ge1xuICBtZXNzYWdlOiBzdHJpbmdcbiAgaGlzdG9yeTogQ2hhdEhpc3RvcnlbXVxuICBwcm9qZWN0SWQ6IG51bWJlciB8IG51bGxcbiAgbGFuZzogc3RyaW5nXG4gIHVzZXJJZDogc3RyaW5nXG4gIGZpcnN0TmFtZT86IHN0cmluZ1xuICBsYXN0TmFtZT86IHN0cmluZ1xuICBjb21wYW55SWQ6IHN0cmluZ1xuICBjaGF0SWQ6IHN0cmluZ1xuICBtZXNzYWdlSWQ6IHN0cmluZ1xuICBjbGllbnRJZD86IG51bWJlclxuICBjbGllbnROYW1lPzogc3RyaW5nXG4gIGZlZUlkPzogbnVtYmVyXG4gIGFnZW50TmFtZTogc3RyaW5nXG4gIGFnZW50SWQ6IHN0cmluZ1xuICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgcHJvamVjdE5hbWU/OiBzdHJpbmdcbiAgdGFza0lkPzogbnVtYmVyXG4gIHRhc2tOYW1lPzogc3RyaW5nXG4gIGZhcUlkPzogc3RyaW5nXG4gIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gIGZ1YUlkPzogc3RyaW5nXG4gIHNjSWQ/OiBzdHJpbmdcbiAgYWdlbnRFbnRpdHk/OiBBZ2VudEVudGl0eVxuICBhZ2VudFR5cGU/OiBBZ2VudFR5cGVcbiAgYWdlbnRFbW9qaT86IHN0cmluZyB8IG51bGxcbiAgY29udGV4dE1lc3NhZ2U/OiBDb250ZXh0TWVzc2FnZVxuICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG59XG5cbi8qKlxuICogQWRhcHRlciBzb2JyZSBgc2Vzc2lvblN0cmVhbU1hbmFnZXJgLiBNYW50aWVuZSBsYSBBUEkgcMO6YmxpY2EgaGlzdMOzcmljYVxuICogKGBhc2tNYWlhYCwgYGlzTG9hZGluZ2AsIGBpc1dyaXRpbmdgLCBgc3RvcFN0cmVhbWluZ2AsIGV0Yy4pIHBlcm8gYWhvcmEgZWxcbiAqIG1vdG9yIGRlIHN0cmVhbWluZyB2aXZlIGVuIGVsIG1hbmFnZXIgKG1vZHVsZS1sZXZlbCksIGxvIHF1ZSBwZXJtaXRlIHRlbmVyXG4gKiB2YXJpYXMgc2VzaW9uZXMgZ2VuZXJhbmRvIGEgbGEgdmV6IHkgcXVlIHNvYnJldml2YW4gYSBjYW1iaW9zIGRlIHZpc3RhLlxuICpcbiAqIExvcyBmbGFncyByZWFjdGl2b3MgKGBpc0xvYWRpbmdgL2Bpc1dyaXRpbmdgL2BzdHJlYW1BY3Rpdml0eWApIHNlIGxlZW4gZGVsXG4gKiBzdG9yZSBwYXJhIGxhIHNlc2nDs24gYWN0dWFsbWVudGUgYWN0aXZhIChgYWN0aXZlU2Vzc2lvbklkYCkuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VPcmNoZXN0cmF0b3JTdHJlYW0gPSAoe1xuICBhY3RpdmVTZXNzaW9uSWQsXG4gIG9uU3RyZWFtVXBkYXRlLFxuICBvbkZpbmlzaFN0cmVhbSxcbiAgb25TdGFydFdyaXRpbmcsXG4gIG9uU3RvcCxcbiAgb25FcnJvcixcbiAgb25BcHByb3ZhbFJlcXVpcmVkLFxuICBoaXRsRXhlY3V0aW9uQ29udGV4dFJlZixcbn06IFVzZU9yY2hlc3RyYXRvclN0cmVhbVByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmNoYXRBSV0pXG5cbiAgY29uc3QgeyBpc0xvYWRpbmcsIGlzV3JpdGluZywgbG9hZGluZ01lc3NhZ2UsIHN0cmVhbUFjdGl2aXR5IH0gPSB1c2VTZXNzaW9uU3RyZWFtU3RhdGUoYWN0aXZlU2Vzc2lvbklkKVxuXG4gIGNvbnN0IG9uU3RyZWFtVXBkYXRlUmVmID0gdXNlUmVmKG9uU3RyZWFtVXBkYXRlKVxuICBjb25zdCBvbkZpbmlzaFN0cmVhbVJlZiA9IHVzZVJlZihvbkZpbmlzaFN0cmVhbSlcbiAgY29uc3Qgb25TdGFydFdyaXRpbmdSZWYgPSB1c2VSZWYob25TdGFydFdyaXRpbmcpXG4gIGNvbnN0IG9uU3RvcFJlZiA9IHVzZVJlZihvblN0b3ApXG4gIGNvbnN0IG9uRXJyb3JSZWYgPSB1c2VSZWYob25FcnJvcilcbiAgY29uc3Qgb25BcHByb3ZhbFJlcXVpcmVkUmVmID0gdXNlUmVmKG9uQXBwcm92YWxSZXF1aXJlZClcblxuICBvblN0cmVhbVVwZGF0ZVJlZi5jdXJyZW50ID0gb25TdHJlYW1VcGRhdGVcbiAgb25GaW5pc2hTdHJlYW1SZWYuY3VycmVudCA9IG9uRmluaXNoU3RyZWFtXG4gIG9uU3RhcnRXcml0aW5nUmVmLmN1cnJlbnQgPSBvblN0YXJ0V3JpdGluZ1xuICBvblN0b3BSZWYuY3VycmVudCA9IG9uU3RvcFxuICBvbkVycm9yUmVmLmN1cnJlbnQgPSBvbkVycm9yXG4gIG9uQXBwcm92YWxSZXF1aXJlZFJlZi5jdXJyZW50ID0gb25BcHByb3ZhbFJlcXVpcmVkXG5cbiAgY29uc3QgYXNrTWFpYSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChwYXlsb2FkOiBBc2tNYWlhUGF5bG9hZCk6IFByb21pc2U8U3RhcnRTdHJlYW1SZXN1bHQ+ID0+IHtcbiAgICAgIGNvbnN0IHsgY2hhdElkOiBzZXNzaW9uSWQsIG1lc3NhZ2VJZCB9ID0gcGF5bG9hZFxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJJZCA9IGBhbnN3ZXItJHttZXNzYWdlSWR9LXN0cmVhbWluZ2BcbiAgICAgIGNvbnN0IGN0eDogU3RyZWFtQ29udGV4dCA9IHsgc2Vzc2lvbklkLCBtZXNzYWdlSWQsIHBsYWNlaG9sZGVySWQgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICBpbnB1dDogcGF5bG9hZC5tZXNzYWdlLFxuICAgICAgICBoaXN0b3J5OiBwYXlsb2FkLmhpc3RvcnksXG4gICAgICAgIGxhbmc6IHBheWxvYWQubGFuZyxcbiAgICAgICAgdXNlcklkOiBwYXlsb2FkLnVzZXJJZCxcbiAgICAgICAgLi4uKHBheWxvYWQuZmlyc3ROYW1lID8geyBmaXJzdE5hbWU6IHBheWxvYWQuZmlyc3ROYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmxhc3ROYW1lID8geyBsYXN0TmFtZTogcGF5bG9hZC5sYXN0TmFtZSB9IDoge30pLFxuICAgICAgICBjb21wYW55SWQ6IHBheWxvYWQuY29tcGFueUlkLFxuICAgICAgICBjaGF0SWQ6IHBheWxvYWQuY2hhdElkLFxuICAgICAgICBtZXNzYWdlSWQ6IHBheWxvYWQubWVzc2FnZUlkLFxuICAgICAgICBjbGllbnRJZDogcGF5bG9hZC5jbGllbnRJZCxcbiAgICAgICAgLi4uKHBheWxvYWQuZmVlSWQgIT0gbnVsbCA/IHsgZmVlSWQ6IHBheWxvYWQuZmVlSWQgfSA6IHt9KSxcbiAgICAgICAgYWdlbnROYW1lOiBwYXlsb2FkLmFnZW50TmFtZSxcbiAgICAgICAgYWdlbnRJZDogcGF5bG9hZC5hZ2VudElkLFxuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogcGF5bG9hZC5pc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBwYXlsb2FkLmlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICAgICAgLi4uKHBheWxvYWQucHJvamVjdElkID8geyBwcm9qZWN0SWQ6IHBheWxvYWQucHJvamVjdElkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmF0dGFjaG1lbnRzID8geyBhdHRhY2htZW50czogcGF5bG9hZC5hdHRhY2htZW50cyB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5wcm9qZWN0TmFtZSA/IHsgcHJvamVjdE5hbWU6IHBheWxvYWQucHJvamVjdE5hbWUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuY2xpZW50TmFtZSA/IHsgY2xpZW50TmFtZTogcGF5bG9hZC5jbGllbnROYW1lIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLnRhc2tJZCAhPSBudWxsID8geyB0YXNrSWQ6IHBheWxvYWQudGFza0lkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLnRhc2tOYW1lID8geyB0YXNrTmFtZTogcGF5bG9hZC50YXNrTmFtZSB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5mYXFJZCA/IHsgZmFxSWQ6IHBheWxvYWQuZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkOiBwYXlsb2FkLmFnZW50U3VnZ2VzdGlvbklkIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmZ1YUlkID8geyBmdWFJZDogcGF5bG9hZC5mdWFJZCB9IDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5zY0lkID8geyBzY0lkOiBwYXlsb2FkLnNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuYWdlbnRFbnRpdHkgIT0gbnVsbCA/IHsgYWdlbnRFbnRpdHk6IHBheWxvYWQuYWdlbnRFbnRpdHkgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuYWdlbnRUeXBlICE9IG51bGwgPyB7IGFnZW50VHlwZTogcGF5bG9hZC5hZ2VudFR5cGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHBheWxvYWQuY29udGV4dE1lc3NhZ2UgPyB7IGNvbnRleHRNZXNzYWdlOiBwYXlsb2FkLmNvbnRleHRNZXNzYWdlIH0gOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbnRleHREYXRhID8geyBjb250ZXh0RGF0YTogcGF5bG9hZC5jb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2Vzc2lvblN0cmVhbU1hbmFnZXIuc3RhcnRTdHJlYW0oe1xuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHBsYWNlaG9sZGVySWQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHQsXG4gICAgICAgIGFjdGl2aXR5T3B0aW9uczoge1xuICAgICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBwYXlsb2FkLmlzV2ViU2VhcmNoQWN0aXZlLFxuICAgICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogcGF5bG9hZC5pc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgICAgICAgaGFzQXR0YWNobWVudHM6IEJvb2xlYW4ocGF5bG9hZC5hdHRhY2htZW50cz8ubGVuZ3RoKSxcbiAgICAgICAgICBhdHRhY2htZW50c0NvdW50OiBwYXlsb2FkLmF0dGFjaG1lbnRzPy5sZW5ndGggPz8gMCxcbiAgICAgICAgfSxcbiAgICAgICAgaGl0bEV4ZWN1dGlvbkNvbnRleHQ6IGhpdGxFeGVjdXRpb25Db250ZXh0UmVmPy5jdXJyZW50ID8/IG51bGwsXG4gICAgICAgIGFnZW50SWQ6IHBheWxvYWQuYWdlbnRJZCxcbiAgICAgICAgYWdlbnROYW1lOiBwYXlsb2FkLmFnZW50TmFtZSxcbiAgICAgICAgYWdlbnRFbW9qaTogcGF5bG9hZC5hZ2VudEVtb2ppLFxuICAgICAgICBjYWxsYmFja3M6IHtcbiAgICAgICAgICBvblN0cmVhbVVwZGF0ZTogY29udGVudCA9PiBvblN0cmVhbVVwZGF0ZVJlZi5jdXJyZW50Py4oY3R4LCBjb250ZW50KSxcbiAgICAgICAgICBvblN0YXJ0V3JpdGluZzogKCkgPT4gb25TdGFydFdyaXRpbmdSZWYuY3VycmVudD8uKCksXG4gICAgICAgICAgb25GaW5pc2hTdHJlYW06IGZpbmlzaFBheWxvYWQgPT5cbiAgICAgICAgICAgIG9uRmluaXNoU3RyZWFtUmVmLmN1cnJlbnQ/LihcbiAgICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgICBmaW5pc2hQYXlsb2FkLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc291cmNlcyxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5tZW1vcnlTZXNzaW9uSWQsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuYXR0YWNobWVudHMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuc3VnZ2VzdGlvbnMsXG4gICAgICAgICAgICAgIGZpbmlzaFBheWxvYWQuY29tcGxldGVkQWdlbnRJZCxcbiAgICAgICAgICAgICAgZmluaXNoUGF5bG9hZC5yZXNvbHZlZENvbnRleHQgYXMgYW55XG4gICAgICAgICAgICApLFxuICAgICAgICAgIG9uRXJyb3I6IChlcnJvclR5cGUsIGVycm9yTWVzc2FnZSkgPT4gb25FcnJvclJlZi5jdXJyZW50Py4oY3R4LCBlcnJvclR5cGUsIGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgb25BcHByb3ZhbFJlcXVpcmVkOiAoYXBwcm92YWwsIGFjY3VtdWxhdGVkQ29udGVudCkgPT5cbiAgICAgICAgICAgIG9uQXBwcm92YWxSZXF1aXJlZFJlZi5jdXJyZW50Py4oY3R4LCBhcHByb3ZhbCwgYWNjdW11bGF0ZWRDb250ZW50KSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbdCwgaGl0bEV4ZWN1dGlvbkNvbnRleHRSZWZdXG4gIClcblxuICBjb25zdCBzdG9wU3RyZWFtaW5nID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNlc3Npb25TdHJlYW1NYW5hZ2VyLnN0b3BTdHJlYW0oYWN0aXZlU2Vzc2lvbklkLCB7XG4gICAgICBvblN0b3A6ICgpID0+IG9uU3RvcFJlZi5jdXJyZW50Py4oKSxcbiAgICB9KVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICBjb25zdCBhYm9ydFN0cmVhbVNpbGVudGx5ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNlc3Npb25TdHJlYW1NYW5hZ2VyLmFib3J0U2lsZW50bHkoYWN0aXZlU2Vzc2lvbklkKVxuICB9LCBbYWN0aXZlU2Vzc2lvbklkXSlcblxuICBjb25zdCB1cGRhdGVTdHJlYW1BY3Rpdml0eSA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHkgfCBudWxsKSA9PiB7XG4gICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0QWN0aXZpdHkoYWN0aXZlU2Vzc2lvbklkLCBhY3Rpdml0eSlcbiAgICB9LFxuICAgIFthY3RpdmVTZXNzaW9uSWRdXG4gIClcblxuICBjb25zdCByZXNldCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucGF0Y2hNZXRhKGFjdGl2ZVNlc3Npb25JZCwgeyBpc0xvYWRpbmc6IGZhbHNlLCBpc1dyaXRpbmc6IGZhbHNlIH0pXG4gICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldEFjdGl2aXR5KGFjdGl2ZVNlc3Npb25JZCwgbnVsbClcbiAgfSwgW2FjdGl2ZVNlc3Npb25JZF0pXG5cbiAgcmV0dXJuIHtcbiAgICBhc2tNYWlhLFxuICAgIGlzTG9hZGluZyxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgdXBkYXRlU3RyZWFtQWN0aXZpdHksXG4gICAgcmVzZXQsXG4gICAgc3RvcFN0cmVhbWluZyxcbiAgICBhYm9ydFN0cmVhbVNpbGVudGx5LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBQzNDLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBTTlDLFNBQVNDLFFBQVEsUUFBUSx3QkFBd0I7QUFFakQsU0FBU0Msb0JBQW9CLFFBQVEsMkNBQTJDO0FBQ2hGLFNBQVNDLGdCQUFnQixRQUFRLHVDQUF1QztBQUN4RSxTQUFTQyxxQkFBcUIsUUFBUSxxQ0FBcUM7QUFvQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBTUMscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUFxQkEsQ0FBQUMsSUFBQSxFQVNBO0VBQUEsSUFSaENDLGVBQWUsR0FBQUQsSUFBQSxDQUFmQyxlQUFlO0lBQ2ZDLGNBQWMsR0FBQUYsSUFBQSxDQUFkRSxjQUFjO0lBQ2RD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