@projectcor/maia-components 2.11.32-0 → 2.11.32-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 (56) hide show
  1. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +2 -2
  2. package/lib/components/atoms/icons/ChatConversation.js +40 -0
  3. package/lib/components/atoms/icons/index.js +2 -2
  4. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +41 -10
  5. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -4
  6. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +16 -3
  7. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +165 -178
  8. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +347 -253
  9. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +15 -28
  10. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +16 -81
  11. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +2 -17
  12. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +10 -9
  13. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +37 -6
  14. package/lib/components/molecules/Sidebar/Sidebar.js +269 -323
  15. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +17 -22
  16. package/lib/components/molecules/Sidebar/Sidebar.styles.js +54 -37
  17. package/lib/components/molecules/Sidebar/SidebarChats.styles.js +73 -0
  18. package/lib/components/molecules/Sidebar/SidebarChatsSection.js +69 -0
  19. package/lib/components/molecules/Sidebar/SidebarChatsSectionModal.js +150 -0
  20. package/lib/components/molecules/Sidebar/SidebarHistoryChat.js +238 -0
  21. package/lib/components/molecules/Sidebar/sidebarChats.helpers.js +70 -0
  22. package/lib/components/molecules/Sidebar/sidebarChats.types.js +14 -0
  23. package/lib/dev/Providers.js +2 -2
  24. package/lib/dev/fixtures/devUser.js +173 -0
  25. package/lib/dev/fixtures/mockedUser.js +169 -0
  26. package/lib/hooks/useChatManager/useChatManager.js +59 -103
  27. package/lib/hooks/useChats/useChats.js +12 -4
  28. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +70 -139
  29. package/lib/lang/br/index.js +11 -6
  30. package/lib/lang/en/index.js +11 -6
  31. package/lib/lang/es/index.js +11 -6
  32. package/lib/lang/fr/index.js +11 -6
  33. package/lib/services/maia/Chats/getChatMessagesV2.js +114 -0
  34. package/lib/services/maia/Chats/getChatsByUserId.js +14 -8
  35. package/lib/services/maia/Chats/getSessionByAgent.js +66 -0
  36. package/lib/services/maia/Chats/getSessionsGroupedV2.js +70 -0
  37. package/lib/services/maia/Chats/index.js +7 -1
  38. package/lib/services/maia/client.js +44 -9
  39. package/lib/store/chatsStore.types.js +10 -2
  40. package/lib/store/useChatsStore.js +75 -37
  41. package/lib/types/Chat.js +3 -1
  42. package/package.json +1 -1
  43. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +0 -33
  44. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +0 -16
  45. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +0 -12
  46. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +0 -13
  47. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +0 -3
  48. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +0 -57
  49. package/lib/components/molecules/ChatAIModal/layout.js +0 -35
  50. package/lib/hooks/useSmoothStreamText/index.js +0 -2
  51. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +0 -189
  52. package/lib/hooks/useStreamingMessage/index.js +0 -3
  53. package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
  54. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +0 -22
  55. package/lib/mocks/mockChats.js +0 -395
  56. package/lib/mocks/mockedUser.js +0 -169
@@ -14,7 +14,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
14
14
  /* eslint-disable react/function-component-definition */
15
15
  /* eslint-disable react/require-default-props */
16
16
  /* eslint-disable no-console */
17
- import { useCallback, useMemo, useState, useRef, useEffect, useLayoutEffect } from 'react';
17
+ import { useCallback, useMemo, useState, useRef, useEffect } from 'react';
18
18
  import ReactDOM from 'react-dom';
19
19
  import moment from 'moment';
20
20
  import { useTranslation } from 'react-i18next';
@@ -31,14 +31,13 @@ import { ProjectSummaryContent } from '../ProjectSummaryContent';
31
31
  import { AbmAgentModal } from '../../organisms/AbmAgentModal/AbmAgentModal';
32
32
  import { SECTIONS } from '../../../constants/config';
33
33
  import { SCCAIMContent, SCCAIMContentWrapper, SCCAIMWrapper } from './ChatAIModal.styles';
34
- import { getMaiaFloatingPanelWidthPx } from './layout';
35
- import { FloatingPanelMotion, useFloatingPanelDragTilt } from './floatingPanelMotion';
36
34
  import { ChatAiModalFooter } from './components/ChatAiModalFooter';
37
35
  import { validateIsMaia } from '../../../services/utils/validateIsMaia';
38
36
  import { useFaqsStore } from '../../../store/useFaqsStore';
39
37
  import { fetchMaia } from '../../../services/maia/client';
38
+ import { getSessionByAgent } from '../../../services/maia/Chats/getSessionByAgent';
40
39
  import { mapCORLang } from '../../../lang/utils';
41
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
40
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
42
41
  export var ID_MODAL_CHAT_AGENT = 'modals-portal-maia-chat-agent';
43
42
  var validateAccessByFeature = function validateAccessByFeature(section) {
44
43
  if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
@@ -74,41 +73,56 @@ export var ChatAIModal = function ChatAIModal(_ref) {
74
73
  _useState6 = _slicedToArray(_useState5, 2),
75
74
  newChatKey = _useState6[0],
76
75
  setNewChatKey = _useState6[1];
76
+ /**
77
+ * Sesión existente "preparada" para el agente/entity actual detectada por
78
+ * `resolveAgentChat` o por click en el sidebar sobre un chat clone.
79
+ *
80
+ * Mientras exista, el usuario ve la home (no entra al chat). Al enviar un
81
+ * mensaje o tocar una FAQ, `handleSendMessage` usa este id como chatId para
82
+ * continuar la conversación existente en vez de crear una nueva.
83
+ *
84
+ * Solo aplica a agentes `clone` (tanto los que requieren entity como los
85
+ * clone+global). Para agentes `custom` se mantiene el flujo directo a chat.
86
+ */
77
87
  var _useState7 = useState(null),
78
88
  _useState8 = _slicedToArray(_useState7, 2),
79
- sendMessageFunction = _useState8[0],
80
- setSendMessageFunction = _useState8[1];
89
+ pendingSessionId = _useState8[0],
90
+ setPendingSessionId = _useState8[1];
81
91
  var _useState9 = useState(null),
82
92
  _useState0 = _slicedToArray(_useState9, 2),
83
- stopGenerationFunction = _useState0[0],
84
- setStopGenerationFunction = _useState0[1];
85
- var _useState1 = useState(false),
93
+ sendMessageFunction = _useState0[0],
94
+ setSendMessageFunction = _useState0[1];
95
+ var _useState1 = useState(null),
86
96
  _useState10 = _slicedToArray(_useState1, 2),
87
- isStreaming = _useState10[0],
88
- setIsStreaming = _useState10[1];
97
+ stopGenerationFunction = _useState10[0],
98
+ setStopGenerationFunction = _useState10[1];
89
99
  var _useState11 = useState(false),
90
100
  _useState12 = _slicedToArray(_useState11, 2),
91
- isWriting = _useState12[0],
92
- setIsWriting = _useState12[1];
101
+ isStreaming = _useState12[0],
102
+ setIsStreaming = _useState12[1];
93
103
  var _useState13 = useState(false),
94
104
  _useState14 = _slicedToArray(_useState13, 2),
95
- refetchChats = _useState14[0],
96
- setRefetchChats = _useState14[1];
97
- var _useState15 = useState(options.home),
105
+ isWriting = _useState14[0],
106
+ setIsWriting = _useState14[1];
107
+ var _useState15 = useState(false),
98
108
  _useState16 = _slicedToArray(_useState15, 2),
99
- currentOption = _useState16[0],
100
- setCurrentOption = _useState16[1];
101
- var _useState17 = useState(false),
109
+ refetchChats = _useState16[0],
110
+ setRefetchChats = _useState16[1];
111
+ var _useState17 = useState(options.home),
102
112
  _useState18 = _slicedToArray(_useState17, 2),
103
- hasError = _useState18[0],
104
- setHasError = _useState18[1];
113
+ currentOption = _useState18[0],
114
+ setCurrentOption = _useState18[1];
115
+ var _useState19 = useState(false),
116
+ _useState20 = _slicedToArray(_useState19, 2),
117
+ hasError = _useState20[0],
118
+ setHasError = _useState20[1];
105
119
  var handlers = useMemo(function () {
106
120
  return buildHandlers(setCurrentOption, setHasError);
107
121
  }, []);
108
- var _useState19 = useState(false),
109
- _useState20 = _slicedToArray(_useState19, 2),
110
- sidebarHasError = _useState20[0],
111
- setSidebarHasError = _useState20[1];
122
+ var _useState21 = useState(false),
123
+ _useState22 = _slicedToArray(_useState21, 2),
124
+ sidebarHasError = _useState22[0],
125
+ setSidebarHasError = _useState22[1];
112
126
  var resetSelectedChatRef = useRef(null);
113
127
  var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
114
128
  moment.locale(lang);
@@ -183,125 +197,28 @@ export var ChatAIModal = function ChatAIModal(_ref) {
183
197
  */
184
198
 
185
199
  var agentsFetchedRef = useRef(false);
200
+ /**
201
+ * Guard contra race: si el usuario cambia de agente/entity antes de que termine
202
+ * una resolución previa, descartamos la respuesta vieja para no navegar a una
203
+ * conversación que ya no corresponde con la selección actual.
204
+ */
205
+ var resolveRequestRef = useRef(0);
186
206
  var selector = document.querySelector("#".concat(ID_MODAL_CHAT_AGENT));
187
- var _useState21 = useState('sidebar'),
188
- _useState22 = _slicedToArray(_useState21, 2),
189
- layoutMode = _useState22[0],
190
- setLayoutMode = _useState22[1];
191
- var expanded = layoutMode === 'fullscreen';
192
- var isFloating = layoutMode === 'floating';
193
- var contentWrapperRef = useRef(null);
194
- var _useState23 = useState(null),
207
+ var _useState23 = useState(false),
195
208
  _useState24 = _slicedToArray(_useState23, 2),
196
- dragPosition = _useState24[0],
197
- setDragPosition = _useState24[1];
198
- var _useFloatingPanelDrag = useFloatingPanelDragTilt(isFloating),
199
- tiltMotion = _useFloatingPanelDrag.tiltMotion,
200
- startPointerTracking = _useFloatingPanelDrag.startPointerTracking,
201
- samplePointerMove = _useFloatingPanelDrag.samplePointerMove,
202
- endPointerTracking = _useFloatingPanelDrag.endPointerTracking;
203
- var dragStateRef = useRef(null);
204
- var clampDragPosition = useCallback(function (x, y) {
205
- var contentWrapper = contentWrapperRef.current;
206
- if (!contentWrapper) {
207
- return {
208
- x: x,
209
- y: y
210
- };
211
- }
212
- var _contentWrapper$getBo = contentWrapper.getBoundingClientRect(),
213
- width = _contentWrapper$getBo.width,
214
- height = _contentWrapper$getBo.height;
215
- var offset = 16;
216
- var maxX = Math.max(offset, window.innerWidth - width - offset);
217
- var maxY = Math.max(offset, window.innerHeight - height - offset);
218
- return {
219
- x: Math.min(Math.max(x, offset), maxX),
220
- y: Math.min(Math.max(y, offset), maxY)
221
- };
222
- }, []);
223
- useLayoutEffect(function () {
224
- if (layoutMode !== 'floating') {
225
- setDragPosition(null);
226
- return;
227
- }
228
- setDragPosition(function (prev) {
229
- if (prev) {
230
- return clampDragPosition(prev.x, prev.y);
231
- }
232
- var pad = 16;
233
- var x = window.innerWidth - getMaiaFloatingPanelWidthPx() - pad;
234
- return clampDragPosition(x, pad);
235
- });
236
- }, [layoutMode, clampDragPosition]);
237
- var handleDragEnd = useCallback(function (event) {
238
- var _dragStateRef$current;
239
- endPointerTracking();
240
- if (((_dragStateRef$current = dragStateRef.current) === null || _dragStateRef$current === void 0 ? void 0 : _dragStateRef$current.pointerId) !== event.pointerId) {
241
- return;
242
- }
243
- dragStateRef.current = null;
244
- document.body.style.userSelect = '';
245
- document.body.style.cursor = '';
246
- }, [endPointerTracking]);
247
- var handleDragMove = useCallback(function (event) {
248
- var dragState = dragStateRef.current;
249
- if (!dragState || dragState.pointerId !== event.pointerId) {
250
- return;
251
- }
252
- samplePointerMove(event.clientX, event.clientY);
253
- var nextPosition = clampDragPosition(event.clientX - dragState.offsetX, event.clientY - dragState.offsetY);
254
- setDragPosition(function (prev) {
255
- if (prev && prev.x === nextPosition.x && prev.y === nextPosition.y) {
256
- return prev;
257
- }
258
- return nextPosition;
259
- });
260
- }, [clampDragPosition, samplePointerMove]);
261
- var resolvedDragPosition = useMemo(function () {
262
- if (layoutMode !== 'floating') {
263
- return dragPosition;
264
- }
265
- if (dragPosition) {
266
- return dragPosition;
267
- }
268
- var pad = 16;
269
- var x = typeof window !== 'undefined' ? window.innerWidth - getMaiaFloatingPanelWidthPx() - pad : pad;
270
- return clampDragPosition(x, pad);
271
- }, [layoutMode, dragPosition, clampDragPosition]);
272
- var handleDragStart = useCallback(function (event) {
273
- if (!isFloating || event.button !== 0) {
274
- return;
275
- }
276
- var target = event.target;
277
- if (target.closest('button, a, input, textarea, select, [role="button"], [data-no-drag="true"]')) {
278
- return;
279
- }
280
- var contentWrapper = contentWrapperRef.current;
281
- if (!contentWrapper) {
282
- return;
283
- }
284
- var rect = contentWrapper.getBoundingClientRect();
285
- var initialPosition = resolvedDragPosition !== null && resolvedDragPosition !== void 0 ? resolvedDragPosition : clampDragPosition(rect.left, rect.top);
286
- var pointerOffsetX = event.clientX - initialPosition.x;
287
- var pointerOffsetY = event.clientY - initialPosition.y;
288
- setDragPosition(initialPosition);
289
- dragStateRef.current = {
290
- pointerId: event.pointerId,
291
- offsetX: pointerOffsetX,
292
- offsetY: pointerOffsetY
293
- };
294
- event.currentTarget.setPointerCapture(event.pointerId);
295
- event.preventDefault();
296
- document.body.style.userSelect = 'none';
297
- document.body.style.cursor = 'grabbing';
298
- startPointerTracking(event.clientX, event.clientY);
299
- }, [clampDragPosition, isFloating, resolvedDragPosition, startPointerTracking]);
209
+ expanded = _useState24[0],
210
+ setExpanded = _useState24[1];
300
211
  var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId) {
301
212
  if (sidebarHasError) {
302
213
  setSidebarHasError(false);
303
214
  }
304
- setInitialChatId(null);
215
+ // Si había una sesión preparada (agente clone + entity), continuamos esa
216
+ // conversación: pasamos su sessionExternalId como initialChatId para que
217
+ // `ChatAIMessages` cargue el histórico y despache el userInitialMessage
218
+ // dentro de esa misma sesión en vez de crear una nueva.
219
+ var resumeSessionId = pendingSessionId;
220
+ setPendingSessionId(null);
221
+ setInitialChatId(resumeSessionId);
305
222
  setNewChatKey(function (prev) {
306
223
  return prev + 1;
307
224
  });
@@ -314,23 +231,151 @@ export var ChatAIModal = function ChatAIModal(_ref) {
314
231
  agentSuggestionId: agentSuggestionId
315
232
  } : {}));
316
233
  handlers.chat();
317
- }, [handlers, sidebarHasError]);
318
- var goToChat = useCallback(function (chat) {
234
+ }, [handlers, sidebarHasError, pendingSessionId]);
235
+
236
+ /**
237
+ * Deja al usuario en home con una sesión existente "preparada". Al enviar
238
+ * mensaje o tocar una FAQ se continuará esa conversación (ver `startChat`).
239
+ *
240
+ * Se usa para agentes clone (header/selector/sidebar). Para custom seguimos
241
+ * entrando directo al chat con `goToChat`. No setea project/client: el
242
+ * caller ya dejó el contexto global en el estado correcto (selector de
243
+ * proyecto/cliente, sidebar con data completa, etc).
244
+ */
245
+ var stageExistingSession = useCallback(function (chat) {
246
+ var _chat$sessionExternal;
319
247
  setUserInitialMessage({
320
248
  message: '',
321
249
  attachments: []
322
250
  });
323
- setInitialChatId(chat.sessionExternalId);
251
+ setInitialChatId(null);
252
+ setPendingSessionId((_chat$sessionExternal = chat === null || chat === void 0 ? void 0 : chat.sessionExternalId) !== null && _chat$sessionExternal !== void 0 ? _chat$sessionExternal : null);
253
+ setHasError(false);
254
+ setCurrentOption(options.home);
255
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
256
+ }, []);
257
+ var goToChat = useCallback(function (chat) {
324
258
  var selectedAgent = agents.data.find(function (agentItem) {
325
259
  return agentItem.id === chat.agentId;
326
260
  });
327
261
  if (selectedAgent) {
328
262
  selectAgent(selectedAgent);
329
263
  }
330
- // Dispatch event to clear the input textarea
264
+
265
+ // Agentes clone: pasar por home con sesión preparada. El mensaje/FAQ que
266
+ // el usuario escriba continuará esta conversación.
267
+ if ((chat === null || chat === void 0 ? void 0 : chat.agentType) === 'clone') {
268
+ // Setear project/client desde la data del chat (sidebar) para que el
269
+ // home se muestre con el contexto correcto y `askMaia` luego tenga
270
+ // projectId/clientId disponibles.
271
+ if ((chat === null || chat === void 0 ? void 0 : chat.projectId) != null) {
272
+ setProject({
273
+ id: Number(chat.projectId),
274
+ name: chat.projectName || ''
275
+ });
276
+ } else {
277
+ setProject(null);
278
+ }
279
+ if (setClient) {
280
+ if ((chat === null || chat === void 0 ? void 0 : chat.clientId) != null) {
281
+ setClient({
282
+ id: Number(chat.clientId),
283
+ name: chat.clientName || ''
284
+ });
285
+ } else {
286
+ setClient(null);
287
+ }
288
+ }
289
+ stageExistingSession(chat);
290
+ return;
291
+ }
292
+ setUserInitialMessage({
293
+ message: '',
294
+ attachments: []
295
+ });
296
+ setPendingSessionId(null);
297
+ setInitialChatId(chat.sessionExternalId);
331
298
  document.dispatchEvent(new CustomEvent('chat-session-changed'));
332
299
  handlers.chat();
333
- }, [handlers, agents, selectAgent]);
300
+ }, [handlers, agents, selectAgent, stageExistingSession, setProject, setClient]);
301
+
302
+ /**
303
+ * Resolución v2 `GET /v2/sessions/agent/{agent_id}[/{entity_id}]`.
304
+ *
305
+ * Si el usuario ya tenía una conversación para esa combinación agent+entity,
306
+ * navegamos a ella (`goToChat`). Si no (o si falla la red) devolvemos `false`
307
+ * y el caller decide el fallback (quedarse en home/selector actual).
308
+ *
309
+ * Puntos de ejecución:
310
+ * - Al seleccionar un agente en el header (custom o clone+global).
311
+ * - Al seleccionar proyecto/cliente en los selectors (clone+project | clone+client).
312
+ * - Al recibir `maia-open-new-chat-with-agent` y en `handleGoToMaiaker`.
313
+ */
314
+ var resolveAgentChat = useCallback(/*#__PURE__*/function () {
315
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(nextAgent, entityId) {
316
+ var requestId, session, _t;
317
+ return _regeneratorRuntime.wrap(function (_context) {
318
+ while (1) switch (_context.prev = _context.next) {
319
+ case 0:
320
+ if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) {
321
+ _context.next = 1;
322
+ break;
323
+ }
324
+ return _context.abrupt("return", false);
325
+ case 1:
326
+ resolveRequestRef.current += 1;
327
+ requestId = resolveRequestRef.current; // Al iniciar una nueva resolución descartamos cualquier sesión preparada
328
+ // previamente para evitar mezclar contextos si cambia la selección.
329
+ setPendingSessionId(null);
330
+ _context.prev = 2;
331
+ _context.next = 3;
332
+ return getSessionByAgent({
333
+ agent: nextAgent,
334
+ entityId: entityId,
335
+ lang: mapCORLang(i18n.language)
336
+ });
337
+ case 3:
338
+ session = _context.sent;
339
+ if (!(requestId !== resolveRequestRef.current)) {
340
+ _context.next = 4;
341
+ break;
342
+ }
343
+ return _context.abrupt("return", false);
344
+ case 4:
345
+ if (!session) {
346
+ _context.next = 5;
347
+ break;
348
+ }
349
+ // Para agentes clone pasamos por home con la sesión preparada; al enviar
350
+ // mensaje o FAQ desde ahí se continuará la conversación existente.
351
+ // Para custom mantenemos el comportamiento directo (`goToChat`).
352
+ if (nextAgent.type === 'clone') {
353
+ stageExistingSession(_objectSpread(_objectSpread({}, session), {}, {
354
+ agentId: nextAgent.id
355
+ }));
356
+ } else {
357
+ goToChat(session);
358
+ }
359
+ return _context.abrupt("return", true);
360
+ case 5:
361
+ _context.next = 7;
362
+ break;
363
+ case 6:
364
+ _context.prev = 6;
365
+ _t = _context["catch"](2);
366
+ console.error('[MAIA] getSessionByAgent failed', _t);
367
+ case 7:
368
+ return _context.abrupt("return", false);
369
+ case 8:
370
+ case "end":
371
+ return _context.stop();
372
+ }
373
+ }, _callee, null, [[2, 6]]);
374
+ }));
375
+ return function (_x, _x2) {
376
+ return _ref2.apply(this, arguments);
377
+ };
378
+ }(), [goToChat, stageExistingSession, i18n.language]);
334
379
  var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
335
380
  setSendMessageFunction(function () {
336
381
  return sendMessage;
@@ -363,6 +408,9 @@ export var ChatAIModal = function ChatAIModal(_ref) {
363
408
  setClient === null || setClient === void 0 || setClient(null);
364
409
  }
365
410
  }
411
+ // Ir a home por una acción explícita (botón home, nuevo chat, etc.) descarta
412
+ // cualquier sesión preparada: el usuario decidió empezar desde cero.
413
+ setPendingSessionId(null);
366
414
  if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
367
415
  selectAgent(agents.data[0]);
368
416
  }
@@ -374,9 +422,9 @@ export var ChatAIModal = function ChatAIModal(_ref) {
374
422
  resetSelectedChatRef.current();
375
423
  }
376
424
  }, [options.home, options.chat, currentOption, isWebSearchActive, toggleWebSearch, agent, agents, selectAgent, setClient]);
377
- var handleResetChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
378
- return _regeneratorRuntime.wrap(function (_context) {
379
- while (1) switch (_context.prev = _context.next) {
425
+ var handleResetChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
426
+ return _regeneratorRuntime.wrap(function (_context2) {
427
+ while (1) switch (_context2.prev = _context2.next) {
380
428
  case 0:
381
429
  setUserInitialMessage({
382
430
  message: '',
@@ -388,9 +436,9 @@ export var ChatAIModal = function ChatAIModal(_ref) {
388
436
  handleGoHome();
389
437
  case 1:
390
438
  case "end":
391
- return _context.stop();
439
+ return _context2.stop();
392
440
  }
393
- }, _callee);
441
+ }, _callee2);
394
442
  })), [handleGoHome]);
395
443
  useEffect(function () {
396
444
  if (!agentsFetchedRef.current) {
@@ -398,10 +446,37 @@ export var ChatAIModal = function ChatAIModal(_ref) {
398
446
  handleGetAgents();
399
447
  }
400
448
  }, [handleGetAgents]);
449
+
450
+ /**
451
+ * Resolución inicial de sesión cuando el modal se abre desde un contexto con
452
+ * entity pre-seteada:
453
+ * - `section === 'project'`: `ProjectAIButton` ya inyectó el `project` y
454
+ * `useGetAgents` autoselecciona el especialista en proyectos (clone+project).
455
+ * - `section === 'client'`: idem con `ClientAIButton` y clone+client.
456
+ *
457
+ * En esos casos no pasamos por los selectors (no hay chance de ejecutar
458
+ * `resolveAgentChat`), así que lo disparamos acá una única vez en cuanto la
459
+ * combinación agent+entity está lista. Si hay sesión previa se "prepara" y
460
+ * el usuario ve home con pending (el próximo mensaje/FAQ la continúa); si no,
461
+ * queda en home para iniciar un nuevo chat.
462
+ */
463
+ var initialEntityResolveDoneRef = useRef(false);
464
+ useEffect(function () {
465
+ if (initialEntityResolveDoneRef.current) return;
466
+ if (section !== 'project' && section !== 'client') return;
467
+ if ((agent === null || agent === void 0 ? void 0 : agent.type) !== 'clone') return;
468
+ if (section === 'project' && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' && (project === null || project === void 0 ? void 0 : project.id) != null) {
469
+ initialEntityResolveDoneRef.current = true;
470
+ resolveAgentChat(agent, project.id);
471
+ } else if (section === 'client' && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client' && (client === null || client === void 0 ? void 0 : client.id) != null) {
472
+ initialEntityResolveDoneRef.current = true;
473
+ resolveAgentChat(agent, client.id);
474
+ }
475
+ }, [section, agent, project === null || project === void 0 ? void 0 : project.id, client === null || client === void 0 ? void 0 : client.id, resolveAgentChat]);
401
476
  useEffect(function () {
402
477
  var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
403
- var _ref3 = evt.detail || {},
404
- nextAgent = _ref3.agent;
478
+ var _ref4 = evt.detail || {},
479
+ nextAgent = _ref4.agent;
405
480
  if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) {
406
481
  addAgent(nextAgent, {
407
482
  navigateHome: false
@@ -415,8 +490,8 @@ export var ChatAIModal = function ChatAIModal(_ref) {
415
490
  }, [addAgent]);
416
491
  useEffect(function () {
417
492
  var onSyncEditedAgent = function onSyncEditedAgent(evt) {
418
- var _ref4 = evt.detail || {},
419
- nextAgent = _ref4.agent;
493
+ var _ref5 = evt.detail || {},
494
+ nextAgent = _ref5.agent;
420
495
  if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
421
496
  updateAgent(nextAgent);
422
497
  if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) {
@@ -432,6 +507,7 @@ export var ChatAIModal = function ChatAIModal(_ref) {
432
507
  var openChatView = function openChatView() {
433
508
  setHasError(false);
434
509
  setInitialChatId(null);
510
+ setPendingSessionId(null);
435
511
  setNewChatKey(function (prev) {
436
512
  return prev + 1;
437
513
  });
@@ -456,60 +532,97 @@ export var ChatAIModal = function ChatAIModal(_ref) {
456
532
  if (!nextAgent) return;
457
533
  setProject(null);
458
534
  setClient === null || setClient === void 0 || setClient(null);
535
+ setPendingSessionId(null);
459
536
  selectAgent(nextAgent);
460
537
  setHasError(false);
461
538
  setCurrentOption(options.home);
539
+
540
+ // Custom / clone+global no requieren entity: resolvemos sesión existente inmediatamente.
541
+ // Clone+project|client quedan esperando selección de entidad (resolverá el selector).
542
+ var needsEntity = (nextAgent === null || nextAgent === void 0 ? void 0 : nextAgent.type) === 'clone' && ((nextAgent === null || nextAgent === void 0 ? void 0 : nextAgent.entity) === 'project' || (nextAgent === null || nextAgent === void 0 ? void 0 : nextAgent.entity) === 'client');
543
+ if (!needsEntity) {
544
+ resolveAgentChat(nextAgent);
545
+ }
462
546
  };
463
547
  document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
464
548
  return function () {
465
549
  document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
466
550
  };
467
- }, [selectAgent, setClient, setProject]);
551
+ }, [selectAgent, setClient, setProject, resolveAgentChat]);
468
552
  var showNewChat = computedCurrentOption !== options.chat;
469
553
  var hideHeaderAgentSelector = computedCurrentOption === options.myAgents;
470
554
  var handleOpenMarketplace = useCallback(function () {
471
555
  setCurrentOption(options.myAgents);
472
556
  }, []);
473
- var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
474
- var maiakerAgent, response, data, _t;
475
- return _regeneratorRuntime.wrap(function (_context2) {
476
- while (1) switch (_context2.prev = _context2.next) {
557
+
558
+ /**
559
+ * Acción del botón "nuevo chat" del toolbar de la Sidebar.
560
+ *
561
+ * La pantalla destino depende del agente actual:
562
+ * - `custom` → `options.myAgents` (elegir otro agente).
563
+ * - `clone` + `entity: 'project'` → `options.projectSelector` (elegir proyecto).
564
+ * - `clone` + `entity: 'client'` → `options.clientSelector` (elegir cliente).
565
+ * - `clone` + `entity: 'global'` con nombre maiaker/marketplace → `options.home`
566
+ * (renderiza `ChatAIHomeMaiaker`).
567
+ * - Fallback → `options.home`.
568
+ */
569
+ var handleNewChatAction = useCallback(function () {
570
+ var currentAgent = agent;
571
+
572
+ // Aseguramos que la selección de entity quede limpia para los selectors.
573
+ if ((currentAgent === null || currentAgent === void 0 ? void 0 : currentAgent.type) === 'clone' && (currentAgent === null || currentAgent === void 0 ? void 0 : currentAgent.entity) === 'project') {
574
+ setProject(null);
575
+ } else if ((currentAgent === null || currentAgent === void 0 ? void 0 : currentAgent.type) === 'clone' && (currentAgent === null || currentAgent === void 0 ? void 0 : currentAgent.entity) === 'client') {
576
+ setClient === null || setClient === void 0 || setClient(null);
577
+ }
578
+ handleGoHome();
579
+
580
+ // Para agentes custom, handleGoHome ya hizo los resets comunes; sólo
581
+ // redirigimos el destino a Mis Agentes.
582
+ if ((currentAgent === null || currentAgent === void 0 ? void 0 : currentAgent.type) === 'custom') {
583
+ setCurrentOption(options.myAgents);
584
+ }
585
+ }, [agent, handleGoHome, setProject, setClient]);
586
+ var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
587
+ var maiakerAgent, response, data, _t2;
588
+ return _regeneratorRuntime.wrap(function (_context3) {
589
+ while (1) switch (_context3.prev = _context3.next) {
477
590
  case 0:
478
591
  setHasError(false);
479
592
  maiakerAgent = agents.data.find(function (a) {
480
593
  return a.type === 'clone' && a.entity === 'global';
481
594
  });
482
595
  if (maiakerAgent) {
483
- _context2.next = 5;
596
+ _context3.next = 5;
484
597
  break;
485
598
  }
486
- _context2.prev = 1;
487
- _context2.next = 2;
599
+ _context3.prev = 1;
600
+ _context3.next = 2;
488
601
  return fetchMaia({
489
602
  path: "agents?agent_type=clone&lang=".concat(mapCORLang(i18n.language)),
490
603
  method: 'GET'
491
604
  });
492
605
  case 2:
493
- response = _context2.sent;
494
- _context2.next = 3;
606
+ response = _context3.sent;
607
+ _context3.next = 3;
495
608
  return response.json();
496
609
  case 3:
497
- data = _context2.sent;
610
+ data = _context3.sent;
498
611
  maiakerAgent = (data.data || []).find(function (a) {
499
612
  return a.type === 'clone' && a.entity === 'global';
500
613
  });
501
- _context2.next = 5;
614
+ _context3.next = 5;
502
615
  break;
503
616
  case 4:
504
- _context2.prev = 4;
505
- _t = _context2["catch"](1);
506
- return _context2.abrupt("return");
617
+ _context3.prev = 4;
618
+ _t2 = _context3["catch"](1);
619
+ return _context3.abrupt("return");
507
620
  case 5:
508
621
  if (maiakerAgent) {
509
- _context2.next = 6;
622
+ _context3.next = 6;
510
623
  break;
511
624
  }
512
- return _context2.abrupt("return");
625
+ return _context3.abrupt("return");
513
626
  case 6:
514
627
  setProject(null);
515
628
  setClient === null || setClient === void 0 || setClient(null);
@@ -518,12 +631,14 @@ export var ChatAIModal = function ChatAIModal(_ref) {
518
631
  if (resetSelectedChatRef.current) {
519
632
  resetSelectedChatRef.current();
520
633
  }
634
+ // maiaker/marketplace = clone+global → no requiere entity_id
635
+ resolveAgentChat(maiakerAgent);
521
636
  case 7:
522
637
  case "end":
523
- return _context2.stop();
638
+ return _context3.stop();
524
639
  }
525
- }, _callee2, null, [[1, 4]]);
526
- })), [agents.data, i18n.language, selectAgent, setClient, setProject]);
640
+ }, _callee3, null, [[1, 4]]);
641
+ })), [agents.data, i18n.language, selectAgent, setClient, setProject, resolveAgentChat]);
527
642
  var handleDeleteAgentFromMyAgents = useCallback(function (agentId) {
528
643
  removeAgent(agentId);
529
644
  if ((agent === null || agent === void 0 ? void 0 : agent.id) === agentId) {
@@ -531,13 +646,11 @@ export var ChatAIModal = function ChatAIModal(_ref) {
531
646
  }
532
647
  }, [agent === null || agent === void 0 ? void 0 : agent.id, removeAgent, selectFirstAgent]);
533
648
  var hideFooterOnMaiakerMarketplaceHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
534
- var modalPanel = /*#__PURE__*/_jsxs(_Fragment, {
535
- children: [validateAccessByFeature(section) ? /*#__PURE__*/_jsx("div", {
536
- style: {
537
- display: isFloating ? 'none' : 'contents'
538
- },
539
- "aria-hidden": isFloating,
540
- children: /*#__PURE__*/_jsx(Sidebar, {
649
+ return selector && /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/_jsxs(SCCAIMWrapper, {
650
+ expanded: expanded,
651
+ children: [/*#__PURE__*/_jsxs(SCCAIMContentWrapper, {
652
+ expanded: expanded,
653
+ children: [validateAccessByFeature(section) && /*#__PURE__*/_jsx(Sidebar, {
541
654
  onGoToChat: goToChat,
542
655
  onError: function onError() {
543
656
  return setSidebarHasError(true);
@@ -549,81 +662,62 @@ export var ChatAIModal = function ChatAIModal(_ref) {
549
662
  handleSetRefetchChats: setRefetchChats,
550
663
  hasError: sidebarHasError,
551
664
  resetSelectedChatRef: resetSelectedChatRef,
552
- agentsNavActive: sidebarAgentsNavActive
553
- })
554
- }) : null, /*#__PURE__*/_jsxs(SCCAIMContent, {
555
- expanded: expanded,
556
- floating: isFloating,
557
- children: [/*#__PURE__*/_jsx(ChatAIModalHeader, {
558
- layoutMode: layoutMode,
559
- onLayoutModeChange: setLayoutMode,
560
- expanded: expanded,
561
- draggable: isFloating,
562
- onDragStart: handleDragStart,
563
- onDragMove: handleDragMove,
564
- onDragEnd: handleDragEnd,
565
- handleClose: handleCloseModal,
566
- agents: agents.data,
567
- hasError: !!agentError,
568
- loading: loading,
569
- loadingMore: loadingMore,
570
- hasMore: agents.has_more,
571
- handleResetChat: handleResetChat,
572
- onAgentUpdate: updateAgentFavorite,
573
- loadMoreAgents: loadMoreAgents,
574
- sortAgentsList: sortAgentsList,
575
- hideAgentSelector: hideHeaderAgentSelector
576
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section) ? /*#__PURE__*/_jsx(ChatAIContent, {
577
- currentOption: computedCurrentOption,
578
- handlers: _objectSpread(_objectSpread({}, handlers), {}, {
579
- chat: startChat,
580
- home: handlers.home,
581
- handleGoHome: handleGoHome
582
- }),
583
- onError: function onError() {
584
- return setHasError(true);
585
- },
586
- refs: {
587
- userInitialMessage: userInitialMessage,
588
- initialChatId: initialChatId
589
- },
590
- onSendMessageReady: handleSendMessageReady,
665
+ agentsNavActive: sidebarAgentsNavActive,
666
+ onNewChat: handleNewChatAction
667
+ }), /*#__PURE__*/_jsxs(SCCAIMContent, {
591
668
  expanded: expanded,
592
- agents: agents.data,
593
- onDeleteAgent: handleDeleteAgentFromMyAgents,
594
- onFavoriteAgentUpdate: updateAgentFavorite,
595
- hasMoreAgents: !!agents.has_more,
596
- loadingMoreAgents: loadingMore,
597
- onLoadMoreAgents: loadMoreAgents,
598
- onGoToMaiaker: handleGoToMaiaker
599
- }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
600
- onRestartSummary: handlers.home
601
- }), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !hideFooterOnMaiakerMarketplaceHome && !hasError && !loading && validateAccessByFeature(section) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
602
- agent: agent,
603
- handleSendMessage: handleSendMessage,
604
- handleStopGeneration: stopGenerationFunction,
605
- isStreaming: isStreaming,
606
- isWriting: isWriting,
607
- chatId: initialChatId,
608
- newChatKey: newChatKey,
609
- showFaqs: computedCurrentOption === options.chat
669
+ children: [/*#__PURE__*/_jsx(ChatAIModalHeader, {
670
+ expanded: expanded,
671
+ setExpanded: setExpanded,
672
+ handleClose: handleCloseModal,
673
+ agents: agents.data,
674
+ hasError: !!agentError,
675
+ loading: loading,
676
+ loadingMore: loadingMore,
677
+ hasMore: agents.has_more,
678
+ handleResetChat: handleResetChat,
679
+ onAgentUpdate: updateAgentFavorite,
680
+ loadMoreAgents: loadMoreAgents,
681
+ sortAgentsList: sortAgentsList,
682
+ hideAgentSelector: hideHeaderAgentSelector,
683
+ onAgentSelected: resolveAgentChat
684
+ }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section) ? /*#__PURE__*/_jsx(ChatAIContent, {
685
+ currentOption: computedCurrentOption,
686
+ handlers: _objectSpread(_objectSpread({}, handlers), {}, {
687
+ chat: startChat,
688
+ home: handlers.home,
689
+ handleGoHome: handleGoHome
690
+ }),
691
+ onError: function onError() {
692
+ return setHasError(true);
693
+ },
694
+ refs: {
695
+ userInitialMessage: userInitialMessage,
696
+ initialChatId: initialChatId
697
+ },
698
+ onSendMessageReady: handleSendMessageReady,
699
+ expanded: expanded,
700
+ agents: agents.data,
701
+ onDeleteAgent: handleDeleteAgentFromMyAgents,
702
+ onFavoriteAgentUpdate: updateAgentFavorite,
703
+ hasMoreAgents: !!agents.has_more,
704
+ loadingMoreAgents: loadingMore,
705
+ onLoadMoreAgents: loadMoreAgents,
706
+ onGoToMaiaker: handleGoToMaiaker,
707
+ onResolveAgentChat: resolveAgentChat
708
+ }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
709
+ onRestartSummary: handlers.home
710
+ }), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !hideFooterOnMaiakerMarketplaceHome && !hasError && !loading && validateAccessByFeature(section) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
711
+ agent: agent,
712
+ handleSendMessage: handleSendMessage,
713
+ handleStopGeneration: stopGenerationFunction,
714
+ isStreaming: isStreaming,
715
+ isWriting: isWriting,
716
+ chatId: initialChatId,
717
+ newChatKey: newChatKey,
718
+ showFaqs: computedCurrentOption === options.chat
719
+ })]
610
720
  })]
611
- })]
612
- });
613
- var contentWrapper = /*#__PURE__*/_jsx(SCCAIMContentWrapper, {
614
- expanded: expanded,
615
- floating: isFloating,
616
- ref: contentWrapperRef,
617
- children: modalPanel
618
- });
619
- return selector && /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/_jsxs(SCCAIMWrapper, {
620
- expanded: expanded,
621
- layoutMode: layoutMode,
622
- dragPosition: resolvedDragPosition,
623
- children: [/*#__PURE__*/_jsx(FloatingPanelMotion, {
624
- tilt: tiltMotion,
625
- expanded: expanded,
626
- children: contentWrapper
627
721
  }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
628
722
  addAgent: addAgent,
629
723
  updateAgent: updateAgent,
@@ -633,4 +727,4 @@ export var ChatAIModal = function ChatAIModal(_ref) {
633
727
  }), /*#__PURE__*/_jsx(Snackbar, {})]
634
728
  }), selector);
635
729
  };
636
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsIlJlYWN0RE9NIiwibW9tZW50IiwidXNlVHJhbnNsYXRpb24iLCJ1c2VVc2VyIiwiTUFJQUVycm9yIiwiQ2hhdEFJQ29udGVudCIsImJ1aWxkSGFuZGxlcnMiLCJvcHRpb25zIiwiU2lkZWJhciIsInVzZUdldEFnZW50cyIsInVzZUdsb2JhbENvbnRleHQiLCJDaGF0QUlNb2RhbEhlYWRlciIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIlNFQ1RJT05TIiwiU0NDQUlNQ29udGVudCIsIlNDQ0FJTUNvbnRlbnRXcmFwcGVyIiwiU0NDQUlNV3JhcHBlciIsImdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCIsIkZsb2F0aW5nUGFuZWxNb3Rpb24iLCJ1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQiLCJDaGF0QWlNb2RhbEZvb3RlciIsInZhbGlkYXRlSXNNYWlhIiwidXNlRmFxc1N0b3JlIiwiZmV0Y2hNYWlhIiwibWFwQ09STGFuZyIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsIklEX01PREFMX0NIQVRfQUdFTlQiLCJ2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSIsInNlY3Rpb24iLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTIiwiQ2hhdEFJTW9kYWwiLCJfcmVmIiwiX3VzZXIkcGVybWlzc2lvbnMiLCJfdXNlciRwZXJtaXNzaW9uczIiLCJfdXNlciRwZXJtaXNzaW9uczMiLCJfYWdlbnRzJGRhdGEiLCJoYW5kbGVDbG9zZSIsInVzZXIiLCJfdXNlVHJhbnNsYXRpb24iLCJhYm1BZ2VudCIsImkxOG4iLCJoYW5kbGVDbG9zZU1vZGFsIiwiZ2V0U3RhdGUiLCJjbGVhckZhcXMiLCJfdXNlU3RhdGUiLCJtZXNzYWdlIiwiYXR0YWNobWVudHMiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4Iiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMCIsInN0b3BHZW5lcmF0aW9uRnVuY3Rpb24iLCJzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwiaXNTdHJlYW1pbmciLCJzZXRJc1N0cmVhbWluZyIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc1dyaXRpbmciLCJzZXRJc1dyaXRpbmciLCJfdXNlU3RhdGUxMyIsIl91c2VTdGF0ZTE0IiwicmVmZXRjaENoYXRzIiwic2V0UmVmZXRjaENoYXRzIiwiX3VzZVN0YXRlMTUiLCJob21lIiwiX3VzZVN0YXRlMTYiLCJjdXJyZW50T3B0aW9uIiwic2V0Q3VycmVudE9wdGlvbiIsIl91c2VTdGF0ZTE3IiwiX3VzZVN0YXRlMTgiLCJoYXNFcnJvciIsInNldEhhc0Vycm9yIiwiaGFuZGxlcnMiLCJfdXNlU3RhdGUxOSIsIl91c2VTdGF0ZTIwIiwic2lkZWJhckhhc0Vycm9yIiwic2V0U2lkZWJhckhhc0Vycm9yIiwicmVzZXRTZWxlY3RlZENoYXRSZWYiLCJsYW5nIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiYWdlbnQiLCJwcm9qZWN0IiwiY2xpZW50IiwidG9nZ2xlV2ViU2VhcmNoIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRDbGllbnQiLCJzZXRQcm9qZWN0IiwiX3VzZUdldEFnZW50cyIsImhhbmRsZUdvSG9tZSIsImFnZW50cyIsImxvYWRpbmciLCJsb2FkaW5nTW9yZSIsImFnZW50RXJyb3IiLCJlcnJvciIsImhhbmRsZUdldEFnZW50cyIsImxvYWRNb3JlQWdlbnRzIiwiYWRkQWdlbnQiLCJyZW1vdmVBZ2VudCIsInVwZGF0ZUFnZW50IiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNlbGVjdEZpcnN0QWdlbnQiLCJzb3J0QWdlbnRzTGlzdCIsImlzTUFJQSIsInVzZXJIYXNQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsImNvbXB1dGVkQ3VycmVudE9wdGlvbiIsImlzR2xvYmFsU3BlY2lhbGlzdCIsImVudGl0eSIsImlzUHJvamVjdFNwZWNpYWxpc3QiLCJpc0NsaWVudFNwZWNpYWxpc3QiLCJpc01haWFrZXIiLCJ0ZXN0IiwibmFtZSIsIm15QWdlbnRzIiwiY2hhdCIsInNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IiLCJzaG91bGRTaG93Q2xpZW50U2VsZWN0b3IiLCJwcm9qZWN0U2VsZWN0b3IiLCJjbGllbnRTZWxlY3RvciIsImlzTWFpYWtlckFnZW50U2VsZWN0ZWQiLCJ0eXBlIiwic2lkZWJhckFnZW50c05hdkFjdGl2ZSIsImFnZW50c0ZldGNoZWRSZWYiLCJzZWxlY3RvciIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsImNvbmNhdCIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJsYXlvdXRNb2RlIiwic2V0TGF5b3V0TW9kZSIsImV4cGFuZGVkIiwiaXNGbG9hdGluZyIsImNvbnRlbnRXcmFwcGVyUmVmIiwiX3VzZVN0YXRlMjMiLCJfdXNlU3RhdGUyNCIsImRyYWdQb3NpdGlvbiIsInNldERyYWdQb3NpdGlvbiIsIl91c2VGbG9hdGluZ1BhbmVsRHJhZyIsInRpbHRNb3Rpb24iLCJzdGFydFBvaW50ZXJUcmFja2luZyIsInNhbXBsZVBvaW50ZXJNb3ZlIiwiZW5kUG9pbnRlclRyYWNraW5nIiwiZHJhZ1N0YXRlUmVmIiwiY2xhbXBEcmFnUG9zaXRpb24iLCJ4IiwieSIsImNvbnRlbnRXcmFwcGVyIiwiY3VycmVudCIsIl9jb250ZW50V3JhcHBlciRnZXRCbyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIndpZHRoIiwiaGVpZ2h0Iiwib2Zmc2V0IiwibWF4WCIsIk1hdGgiLCJtYXgiLCJpbm5lcldpZHRoIiwibWF4WSIsImlubmVySGVpZ2h0IiwibWluIiwicHJldiIsInBhZCIsImhhbmRsZURyYWdFbmQiLCJldmVudCIsIl9kcmFnU3RhdGVSZWYkY3VycmVudCIsInBvaW50ZXJJZCIsImJvZHkiLCJzdHlsZSIsInVzZXJTZWxlY3QiLCJjdXJzb3IiLCJoYW5kbGVEcmFnTW92ZSIsImRyYWdTdGF0ZSIsImNsaWVudFgiLCJjbGllbnRZIiwibmV4dFBvc2l0aW9uIiwib2Zmc2V0WCIsIm9mZnNldFkiLCJyZXNvbHZlZERyYWdQb3NpdGlvbiIsImhhbmRsZURyYWdTdGFydCIsImJ1dHRvbiIsInRhcmdldCIsImNsb3Nlc3QiLCJyZWN0IiwiaW5pdGlhbFBvc2l0aW9uIiwibGVmdCIsInRvcCIsInBvaW50ZXJPZmZzZXRYIiwicG9pbnRlck9mZnNldFkiLCJjdXJyZW50VGFyZ2V0Iiwic2V0UG9pbnRlckNhcHR1cmUiLCJwcmV2ZW50RGVmYXVsdCIsInN0YXJ0Q2hhdCIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJfb2JqZWN0U3ByZWFkIiwiZ29Ub0NoYXQiLCJzZXNzaW9uRXh0ZXJuYWxJZCIsInNlbGVjdGVkQWdlbnQiLCJkYXRhIiwiZmluZCIsImFnZW50SXRlbSIsImlkIiwiYWdlbnRJZCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwiaXNfZGVsZXRlZCIsImhhc19ub3RfcGVybWlzc2lvbnMiLCJoYXNfbm90X2FjY2VzcyIsInByb2plY3RfZGVsZXRlZCIsImxlbmd0aCIsImhhbmRsZVJlc2V0Q2hhdCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwid3JhcCIsIl9jb250ZXh0IiwibmV4dCIsInN0b3AiLCJvbk1lcmdlQ3JlYXRlZEFnZW50IiwiZXZ0IiwiX3JlZjMiLCJkZXRhaWwiLCJuZXh0QWdlbnQiLCJuYXZpZ2F0ZUhvbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uU3luY0VkaXRlZEFnZW50IiwiX3JlZjQiLCJvcGVuQ2hhdFZpZXciLCJvcGVuTmV3Q2hhdFdpdGhBZ2VudCIsIl9kZXRhaWwiLCJzaG93TmV3Q2hhdCIsImhpZGVIZWFkZXJBZ2VudFNlbGVjdG9yIiwiaGFuZGxlT3Blbk1hcmtldHBsYWNlIiwiaGFuZGxlR29Ub01haWFrZXIiLCJfY2FsbGVlMiIsIm1haWFrZXJBZ2VudCIsInJlc3BvbnNlIiwiX3QiLCJfY29udGV4dDIiLCJhIiwicGF0aCIsIm1ldGhvZCIsInNlbnQiLCJqc29uIiwiYWJydXB0IiwiaGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHMiLCJoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lIiwibW9kYWxQYW5lbCIsImNoaWxkcmVuIiwiZGlzcGxheSIsIm9uR29Ub0NoYXQiLCJvbkVycm9yIiwiaGFuZGxlR29Ub0hvbWUiLCJoYW5kbGVTZXRSZWZldGNoQ2hhdHMiLCJhZ2VudHNOYXZBY3RpdmUiLCJmbG9hdGluZyIsIm9uTGF5b3V0TW9kZUNoYW5nZSIsImRyYWdnYWJsZSIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnTW92ZSIsIm9uRHJhZ0VuZCIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJoaWRlQWdlbnRTZWxlY3RvciIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJvbkRlbGV0ZUFnZW50Iiwib25GYXZvcml0ZUFnZW50VXBkYXRlIiwiaGFzTW9yZUFnZW50cyIsImxvYWRpbmdNb3JlQWdlbnRzIiwib25Mb2FkTW9yZUFnZW50cyIsIm9uR29Ub01haWFrZXIiLCJvblJlc3RhcnRTdW1tYXJ5IiwiaGFuZGxlU3RvcEdlbmVyYXRpb24iLCJjaGF0SWQiLCJzaG93RmFxcyIsInJlZiIsImNyZWF0ZVBvcnRhbCIsInRpbHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvQ2hhdEFJTW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9qc3gtbm8tdXNlbGVzcy1mcmFnbWVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7XG4gIFJlZk9iamVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB1c2VSZWYsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICBQb2ludGVyRXZlbnQgYXMgUmVhY3RQb2ludGVyRXZlbnQsXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBNQUlBRXJyb3IgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBRXJyb3InXG5cbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi9DaGF0QUlDb250ZW50J1xuaW1wb3J0IHsgYnVpbGRIYW5kbGVycywgb3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uL1NpZGViYXInXG5pbXBvcnQgeyB1c2VHZXRBZ2VudHMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgQ2hhdEFJTW9kYWxIZWFkZXIgfSBmcm9tICcuL2NvbXBvbmVudHMvQ2hhdEFpTW9kYWxIZWFkZXIvQ2hhdEFpTW9kYWxIZWFkZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9TbmFja0Jhci9TbmFja2JhcidcbmltcG9ydCB7IFByb2plY3RTdW1tYXJ5Q29udGVudCB9IGZyb20gJy4uL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvQWJtQWdlbnRNb2RhbC9BYm1BZ2VudE1vZGFsJ1xuaW1wb3J0IHsgU0VDVElPTlMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgU0NDQUlNQ29udGVudCwgU0NDQUlNQ29udGVudFdyYXBwZXIsIFNDQ0FJTVdyYXBwZXIgfSBmcm9tICcuL0NoYXRBSU1vZGFsLnN0eWxlcydcbmltcG9ydCB7IGdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCwgTWFpYUNoYXRNb2RhbExheW91dE1vZGUgfSBmcm9tICcuL2xheW91dCdcbmltcG9ydCB7IEZsb2F0aW5nUGFuZWxNb3Rpb24sIHVzZUZsb2F0aW5nUGFuZWxEcmFnVGlsdCB9IGZyb20gJy4vZmxvYXRpbmdQYW5lbE1vdGlvbidcbmltcG9ydCB7IENoYXRBaU1vZGFsRm9vdGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgdmFsaWRhdGVJc01haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy92YWxpZGF0ZUlzTWFpYSdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VGYXFzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZS91c2VGYXFzU3RvcmUnXG5pbXBvcnQgeyBmZXRjaE1haWEgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYWlhL2NsaWVudCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuXG50eXBlIENoYXRBSU1vZGFsUHJvcHMgPSB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBoYW5kbGVDbG9zZT86ICgpID0+IHZvaWRcbiAgcGFyZW50UmVmPzogUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50PlxufVxuXG5leHBvcnQgY29uc3QgSURfTU9EQUxfQ0hBVF9BR0VOVCA9ICdtb2RhbHMtcG9ydGFsLW1haWEtY2hhdC1hZ2VudCdcblxuY29uc3QgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUgPSAoc2VjdGlvbjogc3RyaW5nKSA9PiB7XG4gIGlmIChzZWN0aW9uID09PSAnaGVhZGVyJyAmJiAod2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMgfHwgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICgoc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IHNlY3Rpb24gPT09ICdjbGllbnQnKSAmJiB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1vZGFsID0gKHsgaGFuZGxlQ2xvc2UgfTogQ2hhdEFJTW9kYWxQcm9wcykgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHsgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmFibUFnZW50XSlcblxuICBjb25zdCBoYW5kbGVDbG9zZU1vZGFsID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHVzZUZhcXNTdG9yZS5nZXRTdGF0ZSgpLmNsZWFyRmFxcygpXG4gICAgaGFuZGxlQ2xvc2U/LigpXG4gIH0sIFtoYW5kbGVDbG9zZV0pXG4gIGNvbnN0IFt1c2VySW5pdGlhbE1lc3NhZ2UsIHNldFVzZXJJbml0aWFsTWVzc2FnZV0gPSB1c2VTdGF0ZTx7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gIH0+KHtcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBhdHRhY2htZW50czogW10sXG4gIH0pXG4gIGNvbnN0IFtpbml0aWFsQ2hhdElkLCBzZXRJbml0aWFsQ2hhdElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtuZXdDaGF0S2V5LCBzZXROZXdDaGF0S2V5XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uXSA9IHVzZVN0YXRlPFxuICAgICgobWVzc2FnZTogc3RyaW5nLCBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sIGZhcUlkPzogc3RyaW5nLCBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZykgPT4gdm9pZCkgfCBudWxsXG4gID4obnVsbClcbiAgY29uc3QgW3N0b3BHZW5lcmF0aW9uRnVuY3Rpb24sIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb25dID0gdXNlU3RhdGU8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2lzU3RyZWFtaW5nLCBzZXRJc1N0cmVhbWluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzV3JpdGluZywgc2V0SXNXcml0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IFtyZWZldGNoQ2hhdHMsIHNldFJlZmV0Y2hDaGF0c10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2N1cnJlbnRPcHRpb24sIHNldEN1cnJlbnRPcHRpb25dID0gdXNlU3RhdGUob3B0aW9ucy5ob21lKVxuICBjb25zdCBbaGFzRXJyb3IsIHNldEhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBoYW5kbGVycyA9IHVzZU1lbW8oKCkgPT4gYnVpbGRIYW5kbGVycyhzZXRDdXJyZW50T3B0aW9uLCBzZXRIYXNFcnJvciksIFtdKVxuICBjb25zdCBbc2lkZWJhckhhc0Vycm9yLCBzZXRTaWRlYmFySGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHJlc2V0U2VsZWN0ZWRDaGF0UmVmID0gdXNlUmVmPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGxhbmcgPSBpMThuLmxhbmd1YWdlID09PSAnYnInID8gJ3B0LWJyJyA6IGkxOG4ubGFuZ3VhZ2VcblxuICBtb21lbnQubG9jYWxlKGxhbmcpXG5cbiAgY29uc3Qge1xuICAgIHNlbGVjdEFnZW50LFxuICAgIHNlY3Rpb24sXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuXG4gIGNvbnN0IHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcjogYWdlbnRFcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9ID0gdXNlR2V0QWdlbnRzKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWU6IGhhbmRsZXJzLmhvbWUgfSlcblxuICBjb25zdCBpc01BSUEgPSB2YWxpZGF0ZUlzTWFpYShhZ2VudCBhcyBBZ2VudClcblxuICBjb25zdCB1c2VySGFzUGVybWlzc2lvbnMgPVxuICAgICh1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5jcmVhdGUgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmVkaXQgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmRlbGV0ZSkgJiZcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gIGNvbnN0IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGlzR2xvYmFsU3BlY2lhbGlzdCA9IGlzTUFJQSAmJiBhZ2VudD8uZW50aXR5ID09PSAnZ2xvYmFsJ1xuICAgIGNvbnN0IGlzUHJvamVjdFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgKGFnZW50Py5lbnRpdHkgPT09ICdwcm9qZWN0JyB8fCBhZ2VudD8uZW50aXR5ID09IG51bGwpXG4gICAgY29uc3QgaXNDbGllbnRTcGVjaWFsaXN0ID0gaXNNQUlBICYmIGFnZW50Py5lbnRpdHkgPT09ICdjbGllbnQnXG4gICAgY29uc3QgaXNNYWlha2VyID0gaXNHbG9iYWxTcGVjaWFsaXN0ICYmIC8obWFpYWtlcnxtYXJrZXRwbGFjZSkvaS50ZXN0KGFnZW50Py5uYW1lIHx8ICcnKVxuXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLm15QWdlbnRzXG4gICAgfVxuXG4gICAgaWYgKGlzR2xvYmFsU3BlY2lhbGlzdCAmJiAhaXNNYWlha2VyICYmIGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2hhdFxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNQcm9qZWN0U3BlY2lhbGlzdCAmJiAhcHJvamVjdFxuICAgIGNvbnN0IHNob3VsZFNob3dDbGllbnRTZWxlY3RvciA9IGN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdCAmJiBpc0NsaWVudFNwZWNpYWxpc3QgJiYgIWNsaWVudFxuXG4gICAgaWYgKHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnByb2plY3RTZWxlY3RvclxuICAgIH1cbiAgICBpZiAoc2hvdWxkU2hvd0NsaWVudFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jbGllbnRTZWxlY3RvclxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE9wdGlvblxuICB9LCBbY3VycmVudE9wdGlvbiwgcHJvamVjdCwgY2xpZW50LCBpc01BSUEsIGFnZW50Py5lbnRpdHksIGFnZW50Py5uYW1lXSlcblxuICBjb25zdCBpc01haWFrZXJBZ2VudFNlbGVjdGVkID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgaXNNQUlBICYmXG4gICAgICBhZ2VudD8uZW50aXR5ID09PSAnZ2xvYmFsJyAmJlxuICAgICAgYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiZcbiAgICAgIC8obWFpYWtlcnxtYXJrZXRwbGFjZSkvaS50ZXN0KGFnZW50Py5uYW1lIHx8ICcnKSxcbiAgICBbaXNNQUlBLCBhZ2VudD8uZW50aXR5LCBhZ2VudD8udHlwZSwgYWdlbnQ/Lm5hbWVdXG4gIClcblxuICBjb25zdCBzaWRlYmFyQWdlbnRzTmF2QWN0aXZlID0gdXNlTWVtbygoKTogJ21haWFrZXInIHwgJ215QWdlbnRzJyB8IG51bGwgPT4ge1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMpIHJldHVybiAnbXlBZ2VudHMnXG4gICAgaWYgKGlzTWFpYWtlckFnZW50U2VsZWN0ZWQpIHJldHVybiAnbWFpYWtlcidcbiAgICByZXR1cm4gbnVsbFxuICB9LCBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBpc01haWFrZXJBZ2VudFNlbGVjdGVkXSlcblxuICAvKiBSZWFjdGl2YXIgY29uIGxhIGZpbGEg4oCcTWlzIGFnZW50ZXPigJ0gZW4gU2lkZWJhcjogbXlBZ2VudHNDb3VudCBwcm9wXG4gIGNvbnN0IHNpZGViYXJNeUFnZW50c0NvdW50ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGFnZW50cy5kYXRhLmZpbHRlcihcbiAgICAgIGEgPT4gIShhLnR5cGUgPT09ICdjbG9uZScgJiYgYS5lbnRpdHkgPT09ICdnbG9iYWwnICYmIC8obWFpYWtlcnxtYXJrZXRwbGFjZSkvaS50ZXN0KGEubmFtZSB8fCAnJykpXG4gICAgKVxuICAgICAgLmxlbmd0aFxuICB9LCBbYWdlbnRzLmRhdGFdKVxuICAqL1xuXG4gIGNvbnN0IGFnZW50c0ZldGNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtJRF9NT0RBTF9DSEFUX0FHRU5UfWApXG5cbiAgY29uc3QgW2xheW91dE1vZGUsIHNldExheW91dE1vZGVdID0gdXNlU3RhdGU8TWFpYUNoYXRNb2RhbExheW91dE1vZGU+KCdzaWRlYmFyJylcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcbiAgY29uc3QgaXNGbG9hdGluZyA9IGxheW91dE1vZGUgPT09ICdmbG9hdGluZydcbiAgY29uc3QgY29udGVudFdyYXBwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IFtkcmFnUG9zaXRpb24sIHNldERyYWdQb3NpdGlvbl0gPSB1c2VTdGF0ZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsPihudWxsKVxuICBjb25zdCB7IHRpbHRNb3Rpb24sIHN0YXJ0UG9pbnRlclRyYWNraW5nLCBzYW1wbGVQb2ludGVyTW92ZSwgZW5kUG9pbnRlclRyYWNraW5nIH0gPVxuICAgIHVzZUZsb2F0aW5nUGFuZWxEcmFnVGlsdChpc0Zsb2F0aW5nKVxuICBjb25zdCBkcmFnU3RhdGVSZWYgPSB1c2VSZWY8e1xuICAgIHBvaW50ZXJJZDogbnVtYmVyXG4gICAgb2Zmc2V0WDogbnVtYmVyXG4gICAgb2Zmc2V0WTogbnVtYmVyXG4gIH0gfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGNsYW1wRHJhZ1Bvc2l0aW9uID0gdXNlQ2FsbGJhY2soKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBjb250ZW50V3JhcHBlclJlZi5jdXJyZW50XG4gICAgaWYgKCFjb250ZW50V3JhcHBlcikge1xuICAgICAgcmV0dXJuIHsgeCwgeSB9XG4gICAgfVxuXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb250ZW50V3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IG9mZnNldCA9IDE2XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KG9mZnNldCwgd2luZG93LmlubmVyV2lkdGggLSB3aWR0aCAtIG9mZnNldClcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgob2Zmc2V0LCB3aW5kb3cuaW5uZXJIZWlnaHQgLSBoZWlnaHQgLSBvZmZzZXQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5taW4oTWF0aC5tYXgoeCwgb2Zmc2V0KSwgbWF4WCksXG4gICAgICB5OiBNYXRoLm1pbihNYXRoLm1heCh5LCBvZmZzZXQpLCBtYXhZKSxcbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxheW91dE1vZGUgIT09ICdmbG9hdGluZycpIHtcbiAgICAgIHNldERyYWdQb3NpdGlvbihudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0RHJhZ1Bvc2l0aW9uKHByZXYgPT4ge1xuICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgcmV0dXJuIGNsYW1wRHJhZ1Bvc2l0aW9uKHByZXYueCwgcHJldi55KVxuICAgICAgfVxuICAgICAgY29uc3QgcGFkID0gMTZcbiAgICAgIGNvbnN0IHggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCgpIC0gcGFkXG4gICAgICByZXR1cm4gY2xhbXBEcmFnUG9zaXRpb24oeCwgcGFkKVxuICAgIH0pXG4gIH0sIFtsYXlvdXRNb2RlLCBjbGFtcERyYWdQb3NpdGlvbl0pXG5cbiAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBlbmRQb2ludGVyVHJhY2tpbmcoKVxuICAgICAgaWYgKGRyYWdTdGF0ZVJlZi5jdXJyZW50Py5wb2ludGVySWQgIT09IGV2ZW50LnBvaW50ZXJJZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZHJhZ1N0YXRlUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnJ1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJ1xuICAgIH0sXG4gICAgW2VuZFBvaW50ZXJUcmFja2luZ11cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdNb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdTdGF0ZSA9IGRyYWdTdGF0ZVJlZi5jdXJyZW50XG4gICAgICBpZiAoIWRyYWdTdGF0ZSB8fCBkcmFnU3RhdGUucG9pbnRlcklkICE9PSBldmVudC5wb2ludGVySWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNhbXBsZVBvaW50ZXJNb3ZlKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG5cbiAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IGNsYW1wRHJhZ1Bvc2l0aW9uKGV2ZW50LmNsaWVudFggLSBkcmFnU3RhdGUub2Zmc2V0WCwgZXZlbnQuY2xpZW50WSAtIGRyYWdTdGF0ZS5vZmZzZXRZKVxuXG4gICAgICBzZXREcmFnUG9zaXRpb24ocHJldiA9PiB7XG4gICAgICAgIGlmIChwcmV2ICYmIHByZXYueCA9PT0gbmV4dFBvc2l0aW9uLnggJiYgcHJldi55ID09PSBuZXh0UG9zaXRpb24ueSkge1xuICAgICAgICAgIHJldHVybiBwcmV2XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHRQb3NpdGlvblxuICAgICAgfSlcbiAgICB9LFxuICAgIFtjbGFtcERyYWdQb3NpdGlvbiwgc2FtcGxlUG9pbnRlck1vdmVdXG4gIClcblxuICBjb25zdCByZXNvbHZlZERyYWdQb3NpdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChsYXlvdXRNb2RlICE9PSAnZmxvYXRpbmcnKSB7XG4gICAgICByZXR1cm4gZHJhZ1Bvc2l0aW9uXG4gICAgfVxuICAgIGlmIChkcmFnUG9zaXRpb24pIHtcbiAgICAgIHJldHVybiBkcmFnUG9zaXRpb25cbiAgICB9XG4gICAgY29uc3QgcGFkID0gMTZcbiAgICBjb25zdCB4ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuaW5uZXJXaWR0aCAtIGdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCgpIC0gcGFkIDogcGFkXG4gICAgcmV0dXJuIGNsYW1wRHJhZ1Bvc2l0aW9uKHgsIHBhZClcbiAgfSwgW2xheW91dE1vZGUsIGRyYWdQb3NpdGlvbiwgY2xhbXBEcmFnUG9zaXRpb25dKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWlzRmxvYXRpbmcgfHwgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnYnV0dG9uLCBhLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgW3JvbGU9XCJidXR0b25cIl0sIFtkYXRhLW5vLWRyYWc9XCJ0cnVlXCJdJykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gY29udGVudFdyYXBwZXJSZWYuY3VycmVudFxuICAgICAgaWYgKCFjb250ZW50V3JhcHBlcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjdCA9IGNvbnRlbnRXcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCBpbml0aWFsUG9zaXRpb24gPSByZXNvbHZlZERyYWdQb3NpdGlvbiA/PyBjbGFtcERyYWdQb3NpdGlvbihyZWN0LmxlZnQsIHJlY3QudG9wKVxuICAgICAgY29uc3QgcG9pbnRlck9mZnNldFggPSBldmVudC5jbGllbnRYIC0gaW5pdGlhbFBvc2l0aW9uLnhcbiAgICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIGluaXRpYWxQb3NpdGlvbi55XG5cbiAgICAgIHNldERyYWdQb3NpdGlvbihpbml0aWFsUG9zaXRpb24pXG4gICAgICBkcmFnU3RhdGVSZWYuY3VycmVudCA9IHtcbiAgICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgIG9mZnNldFg6IHBvaW50ZXJPZmZzZXRYLFxuICAgICAgICBvZmZzZXRZOiBwb2ludGVyT2Zmc2V0WSxcbiAgICAgIH1cblxuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJ1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZ3JhYmJpbmcnXG4gICAgICBzdGFydFBvaW50ZXJUcmFja2luZyhldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKVxuICAgIH0sXG4gICAgW2NsYW1wRHJhZ1Bvc2l0aW9uLCBpc0Zsb2F0aW5nLCByZXNvbHZlZERyYWdQb3NpdGlvbiwgc3RhcnRQb2ludGVyVHJhY2tpbmddXG4gIClcblxuICBjb25zdCBzdGFydENoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZT86IHN0cmluZywgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLCBmYXFJZD86IHN0cmluZywgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHtcbiAgICAgICAgc2V0U2lkZWJhckhhc0Vycm9yKGZhbHNlKVxuICAgICAgfVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnJyxcbiAgICAgICAgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgICAuLi4oZmFxSWQgPyB7IGZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdDogYW55KSA9PiB7XG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKGNoYXQuc2Vzc2lvbkV4dGVybmFsSWQpXG4gICAgICBjb25zdCBzZWxlY3RlZEFnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhZ2VudEl0ZW0gPT4gYWdlbnRJdGVtLmlkID09PSBjaGF0LmFnZW50SWQpXG4gICAgICBpZiAoc2VsZWN0ZWRBZ2VudCkge1xuICAgICAgICBzZWxlY3RBZ2VudChzZWxlY3RlZEFnZW50KVxuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggZXZlbnQgdG8gY2xlYXIgdGhlIGlucHV0IHRleHRhcmVhXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBhZ2VudHMsIHNlbGVjdEFnZW50XVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2VSZWFkeSA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZCxcbiAgICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgICAgc3RyZWFtaW5nOiBib29sZWFuLFxuICAgICAgd3JpdGluZzogYm9vbGVhblxuICAgICkgPT4ge1xuICAgICAgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbigoKSA9PiBzZW5kTWVzc2FnZSlcbiAgICAgIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24oKCkgPT4gc3RvcEdlbmVyYXRpb24pXG4gICAgICBzZXRJc1N0cmVhbWluZyhzdHJlYW1pbmcpXG4gICAgICBzZXRJc1dyaXRpbmcod3JpdGluZylcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICBjb25zdCBoYW5kbGVTZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlOiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSwgZmFxSWQ/OiBzdHJpbmcsIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSB7XG4gICAgICAgIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmIChzZW5kTWVzc2FnZUZ1bmN0aW9uICYmIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24obWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0Q2hhdChtZXNzYWdlLCBhdHRhY2htZW50cywgZmFxSWQsIGFnZW50U3VnZ2VzdGlvbklkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbmRNZXNzYWdlRnVuY3Rpb24sIHN0YXJ0Q2hhdCwgY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBzaWRlYmFySGFzRXJyb3JdXG4gIClcblxuICBjb25zdCBoYW5kbGVHb0hvbWUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gU2kgZXN0YW1vcyBlbiB1bmEgY29udmVyc2FjacOzbiB5IHZhbW9zIGEgaG9tZSwgcmVzZXRlYXIgaW5pdGlhbENoYXRJZCB5IGluY3JlbWVudGFyIG5ld0NoYXRLZXlcbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICAvLyBObyBib3JyYXIgZWwgY2xpZW50ZSBzaSBlcyBhZ2VudGUgZGUgY2xpZW50ZXMgKGlndWFsIHF1ZSBlbCBwcm95ZWN0byBzZSBtYW50aWVuZSlcbiAgICAgIGlmIChhZ2VudD8uZW50aXR5ICE9PSAnY2xpZW50Jykge1xuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICAoIWFnZW50IHx8IGFnZW50Py5pc19kZWxldGVkIHx8IGFnZW50Py5oYXNfbm90X3Blcm1pc3Npb25zIHx8IGFnZW50Py5oYXNfbm90X2FjY2VzcyB8fCBhZ2VudD8ucHJvamVjdF9kZWxldGVkKSAmJlxuICAgICAgYWdlbnRzLmRhdGEubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbMF0pXG4gICAgfVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGlzV2ViU2VhcmNoQWN0aXZlICYmIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICAgIH1cbiAgfSwgW1xuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBvcHRpb25zLmNoYXQsXG4gICAgY3VycmVudE9wdGlvbixcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICB0b2dnbGVXZWJTZWFyY2gsXG4gICAgYWdlbnQsXG4gICAgYWdlbnRzLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldENsaWVudCxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAvLyBEaXNwYXRjaCBldmVudCB0byBjbGVhciB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbaGFuZGxlR29Ib21lXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50KSB7XG4gICAgICBhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBoYW5kbGVHZXRBZ2VudHMoKVxuICAgIH1cbiAgfSwgW2hhbmRsZUdldEFnZW50c10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvbk1lcmdlQ3JlYXRlZEFnZW50ID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnQ6IG5leHRBZ2VudCB9ID0gKGV2dCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAobmV4dEFnZW50Py5pZCkge1xuICAgICAgICBhZGRBZ2VudChuZXh0QWdlbnQsIHsgbmF2aWdhdGVIb21lOiBmYWxzZSB9KVxuICAgICAgfVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gICAgfVxuICB9LCBbYWRkQWdlbnRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25TeW5jRWRpdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmICghbmV4dEFnZW50Py5pZCkgcmV0dXJuXG4gICAgICB1cGRhdGVBZ2VudChuZXh0QWdlbnQpXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSBuZXh0QWdlbnQuaWQpIHtcbiAgICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgfVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLXN5bmMtZWRpdGVkLWFnZW50LWZyb20tY2hhdCcsIG9uU3luY0VkaXRlZEFnZW50KVxuICAgIH1cbiAgfSwgW3VwZGF0ZUFnZW50LCBzZWxlY3RBZ2VudCwgYWdlbnQ/LmlkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5DaGF0VmlldyA9ICgpID0+IHtcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmNoYXQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLWNoYXQtdmlldycsIG9wZW5DaGF0VmlldylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1vcGVuLWNoYXQtdmlldycsIG9wZW5DaGF0VmlldylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8qKiBNaXNtbyBmbHVqbyBxdWUgQ2hhdEFJTXlBZ2VudHMuaGFuZGxlVXNlQWdlbnQgKyBvbkJhY2sgKGhhbmRsZXJzLmhvbWUpLiAqL1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5OZXdDaGF0V2l0aEFnZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV4dEFnZW50ID0gKGV2ZW50IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWw/LmFnZW50XG4gICAgICBpZiAoIW5leHRBZ2VudCkgcmV0dXJuXG5cbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50Jywgb3Blbk5ld0NoYXRXaXRoQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50Jywgb3Blbk5ld0NoYXRXaXRoQWdlbnQpXG4gICAgfVxuICB9LCBbc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdF0pXG5cbiAgY29uc3Qgc2hvd05ld0NoYXQgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdFxuICBjb25zdCBoaWRlSGVhZGVyQWdlbnRTZWxlY3RvciA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50c1xuICBjb25zdCBoYW5kbGVPcGVuTWFya2V0cGxhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15QWdlbnRzKVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVHb1RvTWFpYWtlciA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBsZXQgbWFpYWtlckFnZW50ID0gYWdlbnRzLmRhdGEuZmluZCgoYTogQWdlbnQpID0+IGEudHlwZSA9PT0gJ2Nsb25lJyAmJiBhLmVudGl0eSA9PT0gJ2dsb2JhbCcpXG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9YCxcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIG1haWFrZXJBZ2VudCA9IChkYXRhLmRhdGEgfHwgW10pLmZpbmQoKGE6IEFnZW50KSA9PiBhLnR5cGUgPT09ICdjbG9uZScgJiYgYS5lbnRpdHkgPT09ICdnbG9iYWwnKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1haWFrZXJBZ2VudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNlbGVjdEFnZW50KG1haWFrZXJBZ2VudClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gICAgfVxuICB9LCBbYWdlbnRzLmRhdGEsIGkxOG4ubGFuZ3VhZ2UsIHNlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3RdKVxuICBjb25zdCBoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkOiBzdHJpbmcpID0+IHtcbiAgICAgIHJlbW92ZUFnZW50KGFnZW50SWQpXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSBhZ2VudElkKSB7XG4gICAgICAgIHNlbGVjdEZpcnN0QWdlbnQoYWdlbnRJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudD8uaWQsIHJlbW92ZUFnZW50LCBzZWxlY3RGaXJzdEFnZW50XVxuICApXG5cbiAgY29uc3QgaGlkZUZvb3Rlck9uTWFpYWtlck1hcmtldHBsYWNlSG9tZSA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmIGlzTWFpYWtlckFnZW50U2VsZWN0ZWRcblxuICBjb25zdCBtb2RhbFBhbmVsID0gKFxuICAgIDw+XG4gICAgICB7dmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoc2VjdGlvbikgPyAoXG4gICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogaXNGbG9hdGluZyA/ICdub25lJyA6ICdjb250ZW50cycgfX0gYXJpYS1oaWRkZW49e2lzRmxvYXRpbmd9PlxuICAgICAgICAgIDxTaWRlYmFyXG4gICAgICAgICAgICBvbkdvVG9DaGF0PXtnb1RvQ2hhdH1cbiAgICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldFNpZGViYXJIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICAgIGhhbmRsZUdvVG9Ib21lPXtoYW5kbGVHb0hvbWV9XG4gICAgICAgICAgICBoYW5kbGVPcGVuTWFya2V0cGxhY2U9e2hhbmRsZU9wZW5NYXJrZXRwbGFjZX1cbiAgICAgICAgICAgIHNob3dOZXdDaGF0PXtzaG93TmV3Q2hhdH1cbiAgICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgICAgaGFuZGxlU2V0UmVmZXRjaENoYXRzPXtzZXRSZWZldGNoQ2hhdHN9XG4gICAgICAgICAgICBoYXNFcnJvcj17c2lkZWJhckhhc0Vycm9yfVxuICAgICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAgICAgYWdlbnRzTmF2QWN0aXZlPXtzaWRlYmFyQWdlbnRzTmF2QWN0aXZlfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IG51bGx9XG4gICAgICA8U0NDQUlNQ29udGVudCBleHBhbmRlZD17ZXhwYW5kZWR9IGZsb2F0aW5nPXtpc0Zsb2F0aW5nfT5cbiAgICAgICAgPENoYXRBSU1vZGFsSGVhZGVyXG4gICAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgICBvbkxheW91dE1vZGVDaGFuZ2U9e3NldExheW91dE1vZGV9XG4gICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgIGRyYWdnYWJsZT17aXNGbG9hdGluZ31cbiAgICAgICAgICBvbkRyYWdTdGFydD17aGFuZGxlRHJhZ1N0YXJ0fVxuICAgICAgICAgIG9uRHJhZ01vdmU9e2hhbmRsZURyYWdNb3ZlfVxuICAgICAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgICAgICBoYW5kbGVDbG9zZT17aGFuZGxlQ2xvc2VNb2RhbH1cbiAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgIGhhc0Vycm9yPXshIWFnZW50RXJyb3J9XG4gICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICBsb2FkaW5nTW9yZT17bG9hZGluZ01vcmV9XG4gICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgIGhhbmRsZVJlc2V0Q2hhdD17aGFuZGxlUmVzZXRDaGF0fVxuICAgICAgICAgIG9uQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgbG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgIHNvcnRBZ2VudHNMaXN0PXtzb3J0QWdlbnRzTGlzdH1cbiAgICAgICAgICBoaWRlQWdlbnRTZWxlY3Rvcj17aGlkZUhlYWRlckFnZW50U2VsZWN0b3J9XG4gICAgICAgIC8+XG4gICAgICAgIHtoYXNFcnJvciA/IChcbiAgICAgICAgICA8TUFJQUVycm9yIC8+XG4gICAgICAgICkgOiB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSA/IChcbiAgICAgICAgICA8Q2hhdEFJQ29udGVudFxuICAgICAgICAgICAgY3VycmVudE9wdGlvbj17Y29tcHV0ZWRDdXJyZW50T3B0aW9ufVxuICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICAgIHJlZnM9e3sgdXNlckluaXRpYWxNZXNzYWdlLCBpbml0aWFsQ2hhdElkIH19XG4gICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICBhZ2VudHM9e2FnZW50cy5kYXRhfVxuICAgICAgICAgICAgb25EZWxldGVBZ2VudD17aGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHN9XG4gICAgICAgICAgICBvbkZhdm9yaXRlQWdlbnRVcGRhdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBoYXNNb3JlQWdlbnRzPXshIWFnZW50cy5oYXNfbW9yZX1cbiAgICAgICAgICAgIGxvYWRpbmdNb3JlQWdlbnRzPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICAgIG9uTG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgICAgb25Hb1RvTWFpYWtlcj17aGFuZGxlR29Ub01haWFrZXJ9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8UHJvamVjdFN1bW1hcnlDb250ZW50IG9uUmVzdGFydFN1bW1hcnk9e2hhbmRsZXJzLmhvbWV9IC8+XG4gICAgICAgICl9XG4gICAgICAgIHsoKGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmICEhYWdlbnRzPy5kYXRhPy5sZW5ndGgpIHx8XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpICYmXG4gICAgICAgICAgIWhpZGVGb290ZXJPbk1haWFrZXJNYXJrZXRwbGFjZUhvbWUgJiZcbiAgICAgICAgICAhaGFzRXJyb3IgJiZcbiAgICAgICAgICAhbG9hZGluZyAmJlxuICAgICAgICAgIHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24pICYmIChcbiAgICAgICAgICAgIDxDaGF0QWlNb2RhbEZvb3RlclxuICAgICAgICAgICAgICBhZ2VudD17YWdlbnR9XG4gICAgICAgICAgICAgIGhhbmRsZVNlbmRNZXNzYWdlPXtoYW5kbGVTZW5kTWVzc2FnZX1cbiAgICAgICAgICAgICAgaGFuZGxlU3RvcEdlbmVyYXRpb249e3N0b3BHZW5lcmF0aW9uRnVuY3Rpb259XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgaXNXcml0aW5nPXtpc1dyaXRpbmd9XG4gICAgICAgICAgICAgIGNoYXRJZD17aW5pdGlhbENoYXRJZH1cbiAgICAgICAgICAgICAgbmV3Q2hhdEtleT17bmV3Q2hhdEtleX1cbiAgICAgICAgICAgICAgc2hvd0ZhcXM9e2NvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgPC9TQ0NBSU1Db250ZW50PlxuICAgIDwvPlxuICApXG5cbiAgY29uc3QgY29udGVudFdyYXBwZXIgPSAoXG4gICAgPFNDQ0FJTUNvbnRlbnRXcmFwcGVyIGV4cGFuZGVkPXtleHBhbmRlZH0gZmxvYXRpbmc9e2lzRmxvYXRpbmd9IHJlZj17Y29udGVudFdyYXBwZXJSZWZ9PlxuICAgICAge21vZGFsUGFuZWx9XG4gICAgPC9TQ0NBSU1Db250ZW50V3JhcHBlcj5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgc2VsZWN0b3IgJiZcbiAgICBSZWFjdERPTS5jcmVhdGVQb3J0YWwoXG4gICAgICA8U0NDQUlNV3JhcHBlciBleHBhbmRlZD17ZXhwYW5kZWR9IGxheW91dE1vZGU9e2xheW91dE1vZGV9IGRyYWdQb3NpdGlvbj17cmVzb2x2ZWREcmFnUG9zaXRpb259PlxuICAgICAgICA8RmxvYXRpbmdQYW5lbE1vdGlvbiB0aWx0PXt0aWx0TW90aW9ufSBleHBhbmRlZD17ZXhwYW5kZWR9PlxuICAgICAgICAgIHtjb250ZW50V3JhcHBlcn1cbiAgICAgICAgPC9GbG9hdGluZ1BhbmVsTW90aW9uPlxuICAgICAgICB7dXNlckhhc1Blcm1pc3Npb25zICYmIChcbiAgICAgICAgICA8QWJtQWdlbnRNb2RhbFxuICAgICAgICAgICAgYWRkQWdlbnQ9e2FkZEFnZW50fVxuICAgICAgICAgICAgdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fVxuICAgICAgICAgICAgcmVtb3ZlQWdlbnQ9e3JlbW92ZUFnZW50fVxuICAgICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICAgIHNlbGVjdEZpcnN0QWdlbnQ9e3NlbGVjdEZpcnN0QWdlbnR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPFNuYWNrYmFyIC8+XG4gICAgICA8L1NDQ0FJTVdyYXBwZXI+LFxuICAgICAgc2VsZWN0b3JcbiAgICApXG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUVFQSxXQUFXLEVBQ1hDLE9BQU8sRUFDUEMsUUFBUSxFQUNSQyxNQUFNLEVBQ05DLFNBQVMsRUFDVEMsZUFBZSxRQUVWLE9BQU87QUFDZCxPQUFPQyxRQUFRLE1BQU0sV0FBVztBQUNoQyxPQUFPQyxNQUFNLE1BQU0sUUFBUTtBQUMzQixTQUFTQyxjQUFjLFFBQVEsZUFBZTtBQUM5QyxTQUFTQyxPQUFPLFFBQVEsMkJBQTJCO0FBQ25ELFNBQVNDLFNBQVMsUUFBUSx1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
730
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZVJlZiIsInVzZUVmZmVjdCIsIlJlYWN0RE9NIiwibW9tZW50IiwidXNlVHJhbnNsYXRpb24iLCJ1c2VVc2VyIiwiTUFJQUVycm9yIiwiQ2hhdEFJQ29udGVudCIsImJ1aWxkSGFuZGxlcnMiLCJvcHRpb25zIiwiU2lkZWJhciIsInVzZUdldEFnZW50cyIsInVzZUdsb2JhbENvbnRleHQiLCJDaGF0QUlNb2RhbEhlYWRlciIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIlNFQ1RJT05TIiwiU0NDQUlNQ29udGVudCIsIlNDQ0FJTUNvbnRlbnRXcmFwcGVyIiwiU0NDQUlNV3JhcHBlciIsIkNoYXRBaU1vZGFsRm9vdGVyIiwidmFsaWRhdGVJc01haWEiLCJ1c2VGYXFzU3RvcmUiLCJmZXRjaE1haWEiLCJnZXRTZXNzaW9uQnlBZ2VudCIsIm1hcENPUkxhbmciLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiSURfTU9EQUxfQ0hBVF9BR0VOVCIsInZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlIiwic2VjdGlvbiIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJDaGF0QUlNb2RhbCIsIl9yZWYiLCJfdXNlciRwZXJtaXNzaW9ucyIsIl91c2VyJHBlcm1pc3Npb25zMiIsIl91c2VyJHBlcm1pc3Npb25zMyIsIl9hZ2VudHMkZGF0YSIsImhhbmRsZUNsb3NlIiwidXNlciIsIl91c2VUcmFuc2xhdGlvbiIsImFibUFnZW50IiwiaTE4biIsImhhbmRsZUNsb3NlTW9kYWwiLCJnZXRTdGF0ZSIsImNsZWFyRmFxcyIsIl91c2VTdGF0ZSIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInVzZXJJbml0aWFsTWVzc2FnZSIsInNldFVzZXJJbml0aWFsTWVzc2FnZSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiaW5pdGlhbENoYXRJZCIsInNldEluaXRpYWxDaGF0SWQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsIm5ld0NoYXRLZXkiLCJzZXROZXdDaGF0S2V5IiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJwZW5kaW5nU2Vzc2lvbklkIiwic2V0UGVuZGluZ1Nlc3Npb25JZCIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2VuZE1lc3NhZ2VGdW5jdGlvbiIsInNldFNlbmRNZXNzYWdlRnVuY3Rpb24iLCJfdXNlU3RhdGUxIiwiX3VzZVN0YXRlMTAiLCJzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwic2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsIl91c2VTdGF0ZTExIiwiX3VzZVN0YXRlMTIiLCJpc1N0cmVhbWluZyIsInNldElzU3RyZWFtaW5nIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzV3JpdGluZyIsInNldElzV3JpdGluZyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJyZWZldGNoQ2hhdHMiLCJzZXRSZWZldGNoQ2hhdHMiLCJfdXNlU3RhdGUxNyIsImhvbWUiLCJfdXNlU3RhdGUxOCIsImN1cnJlbnRPcHRpb24iLCJzZXRDdXJyZW50T3B0aW9uIiwiX3VzZVN0YXRlMTkiLCJfdXNlU3RhdGUyMCIsImhhc0Vycm9yIiwic2V0SGFzRXJyb3IiLCJoYW5kbGVycyIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJzaWRlYmFySGFzRXJyb3IiLCJzZXRTaWRlYmFySGFzRXJyb3IiLCJyZXNldFNlbGVjdGVkQ2hhdFJlZiIsImxhbmciLCJsYW5ndWFnZSIsImxvY2FsZSIsIl91c2VHbG9iYWxDb250ZXh0Iiwic2VsZWN0QWdlbnQiLCJhZ2VudCIsInByb2plY3QiLCJjbGllbnQiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsInNldENsaWVudCIsInNldFByb2plY3QiLCJfdXNlR2V0QWdlbnRzIiwiaGFuZGxlR29Ib21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJhZGRBZ2VudCIsInJlbW92ZUFnZW50IiwidXBkYXRlQWdlbnQiLCJ1cGRhdGVBZ2VudEZhdm9yaXRlIiwic2VsZWN0Rmlyc3RBZ2VudCIsInNvcnRBZ2VudHNMaXN0IiwiaXNNQUlBIiwidXNlckhhc1Blcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0IiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiaXNHbG9iYWxTcGVjaWFsaXN0IiwiZW50aXR5IiwiaXNQcm9qZWN0U3BlY2lhbGlzdCIsImlzQ2xpZW50U3BlY2lhbGlzdCIsImlzTWFpYWtlciIsInRlc3QiLCJuYW1lIiwibXlBZ2VudHMiLCJjaGF0Iiwic2hvdWxkU2hvd1Byb2plY3RTZWxlY3RvciIsInNob3VsZFNob3dDbGllbnRTZWxlY3RvciIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwiaXNNYWlha2VyQWdlbnRTZWxlY3RlZCIsInR5cGUiLCJzaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwiYWdlbnRzRmV0Y2hlZFJlZiIsInJlc29sdmVSZXF1ZXN0UmVmIiwic2VsZWN0b3IiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJjb25jYXQiLCJfdXNlU3RhdGUyMyIsIl91c2VTdGF0ZTI0IiwiZXhwYW5kZWQiLCJzZXRFeHBhbmRlZCIsInN0YXJ0Q2hhdCIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJyZXN1bWVTZXNzaW9uSWQiLCJwcmV2IiwiX29iamVjdFNwcmVhZCIsInN0YWdlRXhpc3RpbmdTZXNzaW9uIiwiX2NoYXQkc2Vzc2lvbkV4dGVybmFsIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJnb1RvQ2hhdCIsInNlbGVjdGVkQWdlbnQiLCJkYXRhIiwiZmluZCIsImFnZW50SXRlbSIsImlkIiwiYWdlbnRJZCIsImFnZW50VHlwZSIsInByb2plY3RJZCIsIk51bWJlciIsInByb2plY3ROYW1lIiwiY2xpZW50SWQiLCJjbGllbnROYW1lIiwicmVzb2x2ZUFnZW50Q2hhdCIsIl9yZWYyIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJuZXh0QWdlbnQiLCJlbnRpdHlJZCIsInJlcXVlc3RJZCIsInNlc3Npb24iLCJfdCIsIndyYXAiLCJfY29udGV4dCIsIm5leHQiLCJhYnJ1cHQiLCJjdXJyZW50Iiwic2VudCIsImNvbnNvbGUiLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwiaXNfZGVsZXRlZCIsImhhc19ub3RfcGVybWlzc2lvbnMiLCJoYXNfbm90X2FjY2VzcyIsInByb2plY3RfZGVsZXRlZCIsImxlbmd0aCIsImhhbmRsZVJlc2V0Q2hhdCIsIl9jYWxsZWUyIiwiX2NvbnRleHQyIiwiaW5pdGlhbEVudGl0eVJlc29sdmVEb25lUmVmIiwib25NZXJnZUNyZWF0ZWRBZ2VudCIsImV2dCIsIl9yZWY0IiwiZGV0YWlsIiwibmF2aWdhdGVIb21lIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvblN5bmNFZGl0ZWRBZ2VudCIsIl9yZWY1Iiwib3BlbkNoYXRWaWV3Iiwib3Blbk5ld0NoYXRXaXRoQWdlbnQiLCJldmVudCIsIl9kZXRhaWwiLCJuZWVkc0VudGl0eSIsInNob3dOZXdDaGF0IiwiaGlkZUhlYWRlckFnZW50U2VsZWN0b3IiLCJoYW5kbGVPcGVuTWFya2V0cGxhY2UiLCJoYW5kbGVOZXdDaGF0QWN0aW9uIiwiY3VycmVudEFnZW50IiwiaGFuZGxlR29Ub01haWFrZXIiLCJfY2FsbGVlMyIsIm1haWFrZXJBZ2VudCIsInJlc3BvbnNlIiwiX3QyIiwiX2NvbnRleHQzIiwiYSIsInBhdGgiLCJtZXRob2QiLCJqc29uIiwiaGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHMiLCJoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lIiwiY3JlYXRlUG9ydGFsIiwiY2hpbGRyZW4iLCJvbkdvVG9DaGF0Iiwib25FcnJvciIsImhhbmRsZUdvVG9Ib21lIiwiaGFuZGxlU2V0UmVmZXRjaENoYXRzIiwiYWdlbnRzTmF2QWN0aXZlIiwib25OZXdDaGF0IiwiaGFzTW9yZSIsImhhc19tb3JlIiwib25BZ2VudFVwZGF0ZSIsImhpZGVBZ2VudFNlbGVjdG9yIiwib25BZ2VudFNlbGVjdGVkIiwicmVmcyIsIm9uU2VuZE1lc3NhZ2VSZWFkeSIsIm9uRGVsZXRlQWdlbnQiLCJvbkZhdm9yaXRlQWdlbnRVcGRhdGUiLCJoYXNNb3JlQWdlbnRzIiwibG9hZGluZ01vcmVBZ2VudHMiLCJvbkxvYWRNb3JlQWdlbnRzIiwib25Hb1RvTWFpYWtlciIsIm9uUmVzb2x2ZUFnZW50Q2hhdCIsIm9uUmVzdGFydFN1bW1hcnkiLCJoYW5kbGVTdG9wR2VuZXJhdGlvbiIsImNoYXRJZCIsInNob3dGYXFzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL0NoYXRBSU1vZGFsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvanN4LW5vLXVzZWxlc3MtZnJhZ21lbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9mdW5jdGlvbi1jb21wb25lbnQtZGVmaW5pdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvcmVxdWlyZS1kZWZhdWx0LXByb3BzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyBSZWZPYmplY3QsIHVzZUNhbGxiYWNrLCB1c2VNZW1vLCB1c2VTdGF0ZSwgdXNlUmVmLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgTUFJQUVycm9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQUVycm9yJ1xuXG5pbXBvcnQgeyBDaGF0QUlDb250ZW50IH0gZnJvbSAnLi4vQ2hhdEFJQ29udGVudCdcbmltcG9ydCB7IGJ1aWxkSGFuZGxlcnMsIG9wdGlvbnMgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IFNpZGViYXIgfSBmcm9tICcuLi9TaWRlYmFyJ1xuaW1wb3J0IHsgdXNlR2V0QWdlbnRzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRzJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENoYXRBSU1vZGFsSGVhZGVyIH0gZnJvbSAnLi9jb21wb25lbnRzL0NoYXRBaU1vZGFsSGVhZGVyL0NoYXRBaU1vZGFsSGVhZGVyJ1xuaW1wb3J0IHsgU25hY2tiYXIgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvU25hY2tCYXIvU25hY2tiYXInXG5pbXBvcnQgeyBQcm9qZWN0U3VtbWFyeUNvbnRlbnQgfSBmcm9tICcuLi9Qcm9qZWN0U3VtbWFyeUNvbnRlbnQnXG5pbXBvcnQgeyBBYm1BZ2VudE1vZGFsIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL0FibUFnZW50TW9kYWwvQWJtQWdlbnRNb2RhbCdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB7IFNDQ0FJTUNvbnRlbnQsIFNDQ0FJTUNvbnRlbnRXcmFwcGVyLCBTQ0NBSU1XcmFwcGVyIH0gZnJvbSAnLi9DaGF0QUlNb2RhbC5zdHlsZXMnXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4vY29tcG9uZW50cy9DaGF0QWlNb2RhbEZvb3RlcidcbmltcG9ydCB7IHZhbGlkYXRlSXNNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbHMvdmFsaWRhdGVJc01haWEnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgdXNlRmFxc1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvdXNlRmFxc1N0b3JlJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9jbGllbnQnXG5pbXBvcnQgeyBnZXRTZXNzaW9uQnlBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvQ2hhdHMvZ2V0U2Vzc2lvbkJ5QWdlbnQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcblxudHlwZSBDaGF0QUlNb2RhbFByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgaGFuZGxlQ2xvc2U/OiAoKSA9PiB2b2lkXG4gIHBhcmVudFJlZj86IFJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD5cbn1cblxuZXhwb3J0IGNvbnN0IElEX01PREFMX0NIQVRfQUdFTlQgPSAnbW9kYWxzLXBvcnRhbC1tYWlhLWNoYXQtYWdlbnQnXG5cbmNvbnN0IHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlID0gKHNlY3Rpb246IHN0cmluZykgPT4ge1xuICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicgJiYgKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIHx8IHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JykgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlNb2RhbCA9ICh7IGhhbmRsZUNsb3NlIH06IENoYXRBSU1vZGFsUHJvcHMpID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCB7IGkxOG4gfSA9IHVzZVRyYW5zbGF0aW9uKFtTRUNUSU9OUy5hYm1BZ2VudF0pXG5cbiAgY29uc3QgaGFuZGxlQ2xvc2VNb2RhbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB1c2VGYXFzU3RvcmUuZ2V0U3RhdGUoKS5jbGVhckZhcXMoKVxuICAgIGhhbmRsZUNsb3NlPy4oKVxuICB9LCBbaGFuZGxlQ2xvc2VdKVxuICBjb25zdCBbdXNlckluaXRpYWxNZXNzYWdlLCBzZXRVc2VySW5pdGlhbE1lc3NhZ2VdID0gdXNlU3RhdGU8e1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICB9Pih7XG4gICAgbWVzc2FnZTogJycsXG4gICAgYXR0YWNobWVudHM6IFtdLFxuICB9KVxuICBjb25zdCBbaW5pdGlhbENoYXRJZCwgc2V0SW5pdGlhbENoYXRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbmV3Q2hhdEtleSwgc2V0TmV3Q2hhdEtleV0gPSB1c2VTdGF0ZSgwKVxuICAvKipcbiAgICogU2VzacOzbiBleGlzdGVudGUgXCJwcmVwYXJhZGFcIiBwYXJhIGVsIGFnZW50ZS9lbnRpdHkgYWN0dWFsIGRldGVjdGFkYSBwb3JcbiAgICogYHJlc29sdmVBZ2VudENoYXRgIG8gcG9yIGNsaWNrIGVuIGVsIHNpZGViYXIgc29icmUgdW4gY2hhdCBjbG9uZS5cbiAgICpcbiAgICogTWllbnRyYXMgZXhpc3RhLCBlbCB1c3VhcmlvIHZlIGxhIGhvbWUgKG5vIGVudHJhIGFsIGNoYXQpLiBBbCBlbnZpYXIgdW5cbiAgICogbWVuc2FqZSBvIHRvY2FyIHVuYSBGQVEsIGBoYW5kbGVTZW5kTWVzc2FnZWAgdXNhIGVzdGUgaWQgY29tbyBjaGF0SWQgcGFyYVxuICAgKiBjb250aW51YXIgbGEgY29udmVyc2FjacOzbiBleGlzdGVudGUgZW4gdmV6IGRlIGNyZWFyIHVuYSBudWV2YS5cbiAgICpcbiAgICogU29sbyBhcGxpY2EgYSBhZ2VudGVzIGBjbG9uZWAgKHRhbnRvIGxvcyBxdWUgcmVxdWllcmVuIGVudGl0eSBjb21vIGxvc1xuICAgKiBjbG9uZStnbG9iYWwpLiBQYXJhIGFnZW50ZXMgYGN1c3RvbWAgc2UgbWFudGllbmUgZWwgZmx1am8gZGlyZWN0byBhIGNoYXQuXG4gICAqL1xuICBjb25zdCBbcGVuZGluZ1Nlc3Npb25JZCwgc2V0UGVuZGluZ1Nlc3Npb25JZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICAoKG1lc3NhZ2U6IHN0cmluZywgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLCBmYXFJZD86IHN0cmluZywgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbFxuICA+KG51bGwpXG4gIGNvbnN0IFtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uLCBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSA9IHVzZVN0YXRlPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtpc1N0cmVhbWluZywgc2V0SXNTdHJlYW1pbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc1dyaXRpbmcsIHNldElzV3JpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBbcmVmZXRjaENoYXRzLCBzZXRSZWZldGNoQ2hhdHNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtjdXJyZW50T3B0aW9uLCBzZXRDdXJyZW50T3B0aW9uXSA9IHVzZVN0YXRlKG9wdGlvbnMuaG9tZSlcbiAgY29uc3QgW2hhc0Vycm9yLCBzZXRIYXNFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCByZXNldFNlbGVjdGVkQ2hhdFJlZiA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG5cbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IHtcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBzZWN0aW9uLFxuICAgIGFnZW50LFxuICAgIHByb2plY3QsXG4gICAgY2xpZW50LFxuICAgIHRvZ2dsZVdlYlNlYXJjaCxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBzZXRDaGlwc1Byb2plY3QsXG4gICAgc2V0Q2xpZW50LFxuICAgIHNldFByb2plY3QsXG4gIH0gPSB1c2VHbG9iYWxDb250ZXh0KClcblxuICBjb25zdCB7XG4gICAgYWdlbnRzLFxuICAgIGxvYWRpbmcsXG4gICAgbG9hZGluZ01vcmUsXG4gICAgZXJyb3I6IGFnZW50RXJyb3IsXG4gICAgaGFuZGxlR2V0QWdlbnRzLFxuICAgIGxvYWRNb3JlQWdlbnRzLFxuICAgIGFkZEFnZW50LFxuICAgIHJlbW92ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50LFxuICAgIHVwZGF0ZUFnZW50RmF2b3JpdGUsXG4gICAgc2VsZWN0Rmlyc3RBZ2VudCxcbiAgICBzb3J0QWdlbnRzTGlzdCxcbiAgfSA9IHVzZUdldEFnZW50cyh7IHNlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgaGFuZGxlR29Ib21lOiBoYW5kbGVycy5ob21lIH0pXG5cbiAgY29uc3QgaXNNQUlBID0gdmFsaWRhdGVJc01haWEoYWdlbnQgYXMgQWdlbnQpXG5cbiAgY29uc3QgdXNlckhhc1Blcm1pc3Npb25zID1cbiAgICAodXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uY3JlYXRlIHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5lZGl0IHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5kZWxldGUpICYmXG4gICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICBjb25zdCBjb21wdXRlZEN1cnJlbnRPcHRpb24gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBpc0dsb2JhbFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCdcbiAgICBjb25zdCBpc1Byb2plY3RTcGVjaWFsaXN0ID0gaXNNQUlBICYmIChhZ2VudD8uZW50aXR5ID09PSAncHJvamVjdCcgfHwgYWdlbnQ/LmVudGl0eSA9PSBudWxsKVxuICAgIGNvbnN0IGlzQ2xpZW50U3BlY2lhbGlzdCA9IGlzTUFJQSAmJiBhZ2VudD8uZW50aXR5ID09PSAnY2xpZW50J1xuICAgIGNvbnN0IGlzTWFpYWtlciA9IGlzR2xvYmFsU3BlY2lhbGlzdCAmJiAvKG1haWFrZXJ8bWFya2V0cGxhY2UpL2kudGVzdChhZ2VudD8ubmFtZSB8fCAnJylcblxuICAgIGlmIChjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15QWdlbnRzKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5teUFnZW50c1xuICAgIH1cblxuICAgIGlmIChpc0dsb2JhbFNwZWNpYWxpc3QgJiYgIWlzTWFpYWtlciAmJiBjdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmNoYXRcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yID0gY3VycmVudE9wdGlvbiAhPT0gb3B0aW9ucy5jaGF0ICYmIGlzUHJvamVjdFNwZWNpYWxpc3QgJiYgIXByb2plY3RcbiAgICBjb25zdCBzaG91bGRTaG93Q2xpZW50U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNDbGllbnRTcGVjaWFsaXN0ICYmICFjbGllbnRcblxuICAgIGlmIChzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wcm9qZWN0U2VsZWN0b3JcbiAgICB9XG4gICAgaWYgKHNob3VsZFNob3dDbGllbnRTZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2xpZW50U2VsZWN0b3JcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRPcHRpb25cbiAgfSwgW2N1cnJlbnRPcHRpb24sIHByb2plY3QsIGNsaWVudCwgaXNNQUlBLCBhZ2VudD8uZW50aXR5LCBhZ2VudD8ubmFtZV0pXG5cbiAgY29uc3QgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGlzTUFJQSAmJlxuICAgICAgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCcgJiZcbiAgICAgIGFnZW50Py50eXBlID09PSAnY2xvbmUnICYmXG4gICAgICAvKG1haWFrZXJ8bWFya2V0cGxhY2UpL2kudGVzdChhZ2VudD8ubmFtZSB8fCAnJyksXG4gICAgW2lzTUFJQSwgYWdlbnQ/LmVudGl0eSwgYWdlbnQ/LnR5cGUsIGFnZW50Py5uYW1lXVxuICApXG5cbiAgY29uc3Qgc2lkZWJhckFnZW50c05hdkFjdGl2ZSA9IHVzZU1lbW8oKCk6ICdtYWlha2VyJyB8ICdteUFnZW50cycgfCBudWxsID0+IHtcbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15QWdlbnRzKSByZXR1cm4gJ215QWdlbnRzJ1xuICAgIGlmIChpc01haWFrZXJBZ2VudFNlbGVjdGVkKSByZXR1cm4gJ21haWFrZXInXG4gICAgcmV0dXJuIG51bGxcbiAgfSwgW2NvbXB1dGVkQ3VycmVudE9wdGlvbiwgaXNNYWlha2VyQWdlbnRTZWxlY3RlZF0pXG5cbiAgLyogUmVhY3RpdmFyIGNvbiBsYSBmaWxhIOKAnE1pcyBhZ2VudGVz4oCdIGVuIFNpZGViYXI6IG15QWdlbnRzQ291bnQgcHJvcFxuICBjb25zdCBzaWRlYmFyTXlBZ2VudHNDb3VudCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBhZ2VudHMuZGF0YS5maWx0ZXIoXG4gICAgICBhID0+ICEoYS50eXBlID09PSAnY2xvbmUnICYmIGEuZW50aXR5ID09PSAnZ2xvYmFsJyAmJiAvKG1haWFrZXJ8bWFya2V0cGxhY2UpL2kudGVzdChhLm5hbWUgfHwgJycpKVxuICAgIClcbiAgICAgIC5sZW5ndGhcbiAgfSwgW2FnZW50cy5kYXRhXSlcbiAgKi9cblxuICBjb25zdCBhZ2VudHNGZXRjaGVkUmVmID0gdXNlUmVmKGZhbHNlKVxuICAvKipcbiAgICogR3VhcmQgY29udHJhIHJhY2U6IHNpIGVsIHVzdWFyaW8gY2FtYmlhIGRlIGFnZW50ZS9lbnRpdHkgYW50ZXMgZGUgcXVlIHRlcm1pbmVcbiAgICogdW5hIHJlc29sdWNpw7NuIHByZXZpYSwgZGVzY2FydGFtb3MgbGEgcmVzcHVlc3RhIHZpZWphIHBhcmEgbm8gbmF2ZWdhciBhIHVuYVxuICAgKiBjb252ZXJzYWNpw7NuIHF1ZSB5YSBubyBjb3JyZXNwb25kZSBjb24gbGEgc2VsZWNjacOzbiBhY3R1YWwuXG4gICAqL1xuICBjb25zdCByZXNvbHZlUmVxdWVzdFJlZiA9IHVzZVJlZigwKVxuXG4gIGNvbnN0IHNlbGVjdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7SURfTU9EQUxfQ0hBVF9BR0VOVH1gKVxuXG4gIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3Qgc3RhcnRDaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2U/OiBzdHJpbmcsIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSwgZmFxSWQ/OiBzdHJpbmcsIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoc2lkZWJhckhhc0Vycm9yKSB7XG4gICAgICAgIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIH1cbiAgICAgIC8vIFNpIGhhYsOtYSB1bmEgc2VzacOzbiBwcmVwYXJhZGEgKGFnZW50ZSBjbG9uZSArIGVudGl0eSksIGNvbnRpbnVhbW9zIGVzYVxuICAgICAgLy8gY29udmVyc2FjacOzbjogcGFzYW1vcyBzdSBzZXNzaW9uRXh0ZXJuYWxJZCBjb21vIGluaXRpYWxDaGF0SWQgcGFyYSBxdWVcbiAgICAgIC8vIGBDaGF0QUlNZXNzYWdlc2AgY2FyZ3VlIGVsIGhpc3TDs3JpY28geSBkZXNwYWNoZSBlbCB1c2VySW5pdGlhbE1lc3NhZ2VcbiAgICAgIC8vIGRlbnRybyBkZSBlc2EgbWlzbWEgc2VzacOzbiBlbiB2ZXogZGUgY3JlYXIgdW5hIG51ZXZhLlxuICAgICAgY29uc3QgcmVzdW1lU2Vzc2lvbklkID0gcGVuZGluZ1Nlc3Npb25JZFxuICAgICAgc2V0UGVuZGluZ1Nlc3Npb25JZChudWxsKVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChyZXN1bWVTZXNzaW9uSWQpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2Uoe1xuICAgICAgICBtZXNzYWdlOiBtZXNzYWdlIHx8ICcnLFxuICAgICAgICBhdHRhY2htZW50czogYXR0YWNobWVudHMgfHwgW10sXG4gICAgICAgIC4uLihmYXFJZCA/IHsgZmFxSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFnZW50U3VnZ2VzdGlvbklkID8geyBhZ2VudFN1Z2dlc3Rpb25JZCB9IDoge30pLFxuICAgICAgfSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBzaWRlYmFySGFzRXJyb3IsIHBlbmRpbmdTZXNzaW9uSWRdXG4gIClcblxuICAvKipcbiAgICogRGVqYSBhbCB1c3VhcmlvIGVuIGhvbWUgY29uIHVuYSBzZXNpw7NuIGV4aXN0ZW50ZSBcInByZXBhcmFkYVwiLiBBbCBlbnZpYXJcbiAgICogbWVuc2FqZSBvIHRvY2FyIHVuYSBGQVEgc2UgY29udGludWFyw6EgZXNhIGNvbnZlcnNhY2nDs24gKHZlciBgc3RhcnRDaGF0YCkuXG4gICAqXG4gICAqIFNlIHVzYSBwYXJhIGFnZW50ZXMgY2xvbmUgKGhlYWRlci9zZWxlY3Rvci9zaWRlYmFyKS4gUGFyYSBjdXN0b20gc2VndWltb3NcbiAgICogZW50cmFuZG8gZGlyZWN0byBhbCBjaGF0IGNvbiBgZ29Ub0NoYXRgLiBObyBzZXRlYSBwcm9qZWN0L2NsaWVudDogZWxcbiAgICogY2FsbGVyIHlhIGRlasOzIGVsIGNvbnRleHRvIGdsb2JhbCBlbiBlbCBlc3RhZG8gY29ycmVjdG8gKHNlbGVjdG9yIGRlXG4gICAqIHByb3llY3RvL2NsaWVudGUsIHNpZGViYXIgY29uIGRhdGEgY29tcGxldGEsIGV0YykuXG4gICAqL1xuICBjb25zdCBzdGFnZUV4aXN0aW5nU2Vzc2lvbiA9IHVzZUNhbGxiYWNrKChjaGF0OiBhbnkpID0+IHtcbiAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgIHNldFBlbmRpbmdTZXNzaW9uSWQoY2hhdD8uc2Vzc2lvbkV4dGVybmFsSWQgPz8gbnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdDogYW55KSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZEFnZW50ID0gYWdlbnRzLmRhdGEuZmluZChhZ2VudEl0ZW0gPT4gYWdlbnRJdGVtLmlkID09PSBjaGF0LmFnZW50SWQpXG4gICAgICBpZiAoc2VsZWN0ZWRBZ2VudCkge1xuICAgICAgICBzZWxlY3RBZ2VudChzZWxlY3RlZEFnZW50KVxuICAgICAgfVxuXG4gICAgICAvLyBBZ2VudGVzIGNsb25lOiBwYXNhciBwb3IgaG9tZSBjb24gc2VzacOzbiBwcmVwYXJhZGEuIEVsIG1lbnNhamUvRkFRIHF1ZVxuICAgICAgLy8gZWwgdXN1YXJpbyBlc2NyaWJhIGNvbnRpbnVhcsOhIGVzdGEgY29udmVyc2FjacOzbi5cbiAgICAgIGlmIChjaGF0Py5hZ2VudFR5cGUgPT09ICdjbG9uZScpIHtcbiAgICAgICAgLy8gU2V0ZWFyIHByb2plY3QvY2xpZW50IGRlc2RlIGxhIGRhdGEgZGVsIGNoYXQgKHNpZGViYXIpIHBhcmEgcXVlIGVsXG4gICAgICAgIC8vIGhvbWUgc2UgbXVlc3RyZSBjb24gZWwgY29udGV4dG8gY29ycmVjdG8geSBgYXNrTWFpYWAgbHVlZ28gdGVuZ2FcbiAgICAgICAgLy8gcHJvamVjdElkL2NsaWVudElkIGRpc3BvbmlibGVzLlxuICAgICAgICBpZiAoY2hhdD8ucHJvamVjdElkICE9IG51bGwpIHtcbiAgICAgICAgICBzZXRQcm9qZWN0KHsgaWQ6IE51bWJlcihjaGF0LnByb2plY3RJZCksIG5hbWU6IGNoYXQucHJvamVjdE5hbWUgfHwgJycgfSBhcyBhbnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRDbGllbnQpIHtcbiAgICAgICAgICBpZiAoY2hhdD8uY2xpZW50SWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0Q2xpZW50KHsgaWQ6IE51bWJlcihjaGF0LmNsaWVudElkKSwgbmFtZTogY2hhdC5jbGllbnROYW1lIHx8ICcnIH0gYXMgYW55KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDbGllbnQobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhZ2VFeGlzdGluZ1Nlc3Npb24oY2hhdClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRQZW5kaW5nU2Vzc2lvbklkKG51bGwpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKGNoYXQuc2Vzc2lvbkV4dGVybmFsSWQpXG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBhZ2VudHMsIHNlbGVjdEFnZW50LCBzdGFnZUV4aXN0aW5nU2Vzc2lvbiwgc2V0UHJvamVjdCwgc2V0Q2xpZW50XVxuICApXG5cbiAgLyoqXG4gICAqIFJlc29sdWNpw7NuIHYyIGBHRVQgL3YyL3Nlc3Npb25zL2FnZW50L3thZ2VudF9pZH1bL3tlbnRpdHlfaWR9XWAuXG4gICAqXG4gICAqIFNpIGVsIHVzdWFyaW8geWEgdGVuw61hIHVuYSBjb252ZXJzYWNpw7NuIHBhcmEgZXNhIGNvbWJpbmFjacOzbiBhZ2VudCtlbnRpdHksXG4gICAqIG5hdmVnYW1vcyBhIGVsbGEgKGBnb1RvQ2hhdGApLiBTaSBubyAobyBzaSBmYWxsYSBsYSByZWQpIGRldm9sdmVtb3MgYGZhbHNlYFxuICAgKiB5IGVsIGNhbGxlciBkZWNpZGUgZWwgZmFsbGJhY2sgKHF1ZWRhcnNlIGVuIGhvbWUvc2VsZWN0b3IgYWN0dWFsKS5cbiAgICpcbiAgICogUHVudG9zIGRlIGVqZWN1Y2nDs246XG4gICAqIC0gQWwgc2VsZWNjaW9uYXIgdW4gYWdlbnRlIGVuIGVsIGhlYWRlciAoY3VzdG9tIG8gY2xvbmUrZ2xvYmFsKS5cbiAgICogLSBBbCBzZWxlY2Npb25hciBwcm95ZWN0by9jbGllbnRlIGVuIGxvcyBzZWxlY3RvcnMgKGNsb25lK3Byb2plY3QgfCBjbG9uZStjbGllbnQpLlxuICAgKiAtIEFsIHJlY2liaXIgYG1haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50YCB5IGVuIGBoYW5kbGVHb1RvTWFpYWtlcmAuXG4gICAqL1xuICBjb25zdCByZXNvbHZlQWdlbnRDaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG5leHRBZ2VudDogQWdlbnQgfCBudWxsIHwgdW5kZWZpbmVkLCBlbnRpdHlJZD86IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgIGlmICghbmV4dEFnZW50Py5pZCkgcmV0dXJuIGZhbHNlXG4gICAgICByZXNvbHZlUmVxdWVzdFJlZi5jdXJyZW50ICs9IDFcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlc29sdmVSZXF1ZXN0UmVmLmN1cnJlbnRcbiAgICAgIC8vIEFsIGluaWNpYXIgdW5hIG51ZXZhIHJlc29sdWNpw7NuIGRlc2NhcnRhbW9zIGN1YWxxdWllciBzZXNpw7NuIHByZXBhcmFkYVxuICAgICAgLy8gcHJldmlhbWVudGUgcGFyYSBldml0YXIgbWV6Y2xhciBjb250ZXh0b3Mgc2kgY2FtYmlhIGxhIHNlbGVjY2nDs24uXG4gICAgICBzZXRQZW5kaW5nU2Vzc2lvbklkKG51bGwpXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U2Vzc2lvbkJ5QWdlbnQoe1xuICAgICAgICAgIGFnZW50OiBuZXh0QWdlbnQsXG4gICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcbiAgICAgICAgLy8gU2kgZW50cmUgdGFudG8gaHVibyBvdHJhIHJlc29sdWNpw7NuIGluaWNpYWRhLCBpZ25vcmFtb3MgZXN0YSByZXNwdWVzdGEuXG4gICAgICAgIGlmIChyZXF1ZXN0SWQgIT09IHJlc29sdmVSZXF1ZXN0UmVmLmN1cnJlbnQpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgICAgIC8vIFBhcmEgYWdlbnRlcyBjbG9uZSBwYXNhbW9zIHBvciBob21lIGNvbiBsYSBzZXNpw7NuIHByZXBhcmFkYTsgYWwgZW52aWFyXG4gICAgICAgICAgLy8gbWVuc2FqZSBvIEZBUSBkZXNkZSBhaMOtIHNlIGNvbnRpbnVhcsOhIGxhIGNvbnZlcnNhY2nDs24gZXhpc3RlbnRlLlxuICAgICAgICAgIC8vIFBhcmEgY3VzdG9tIG1hbnRlbmVtb3MgZWwgY29tcG9ydGFtaWVudG8gZGlyZWN0byAoYGdvVG9DaGF0YCkuXG4gICAgICAgICAgaWYgKG5leHRBZ2VudC50eXBlID09PSAnY2xvbmUnKSB7XG4gICAgICAgICAgICBzdGFnZUV4aXN0aW5nU2Vzc2lvbih7IC4uLihzZXNzaW9uIGFzIGFueSksIGFnZW50SWQ6IG5leHRBZ2VudC5pZCB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnb1RvQ2hhdChzZXNzaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW01BSUFdIGdldFNlc3Npb25CeUFnZW50IGZhaWxlZCcsIGVycilcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgW2dvVG9DaGF0LCBzdGFnZUV4aXN0aW5nU2Vzc2lvbiwgaTE4bi5sYW5ndWFnZV1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlUmVhZHkgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgICApID0+IHZvaWQsXG4gICAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICAgIHN0cmVhbWluZzogYm9vbGVhbixcbiAgICAgIHdyaXRpbmc6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHNldFNlbmRNZXNzYWdlRnVuY3Rpb24oKCkgPT4gc2VuZE1lc3NhZ2UpXG4gICAgICBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uKCgpID0+IHN0b3BHZW5lcmF0aW9uKVxuICAgICAgc2V0SXNTdHJlYW1pbmcoc3RyZWFtaW5nKVxuICAgICAgc2V0SXNXcml0aW5nKHdyaXRpbmcpXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZTogc3RyaW5nLCBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sIGZhcUlkPzogc3RyaW5nLCBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHNpZGViYXJIYXNFcnJvcikge1xuICAgICAgICBzZXRTaWRlYmFySGFzRXJyb3IoZmFsc2UpXG4gICAgICB9XG4gICAgICBpZiAoc2VuZE1lc3NhZ2VGdW5jdGlvbiAmJiBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgICBzZW5kTWVzc2FnZUZ1bmN0aW9uKG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzdGFydENoYXQsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIC8vIFNpIGVzdGFtb3MgZW4gdW5hIGNvbnZlcnNhY2nDs24geSB2YW1vcyBhIGhvbWUsIHJlc2V0ZWFyIGluaXRpYWxDaGF0SWQgeSBpbmNyZW1lbnRhciBuZXdDaGF0S2V5XG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgLy8gTm8gYm9ycmFyIGVsIGNsaWVudGUgc2kgZXMgYWdlbnRlIGRlIGNsaWVudGVzIChpZ3VhbCBxdWUgZWwgcHJveWVjdG8gc2UgbWFudGllbmUpXG4gICAgICBpZiAoYWdlbnQ/LmVudGl0eSAhPT0gJ2NsaWVudCcpIHtcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSXIgYSBob21lIHBvciB1bmEgYWNjacOzbiBleHBsw61jaXRhIChib3TDs24gaG9tZSwgbnVldm8gY2hhdCwgZXRjLikgZGVzY2FydGFcbiAgICAvLyBjdWFscXVpZXIgc2VzacOzbiBwcmVwYXJhZGE6IGVsIHVzdWFyaW8gZGVjaWRpw7MgZW1wZXphciBkZXNkZSBjZXJvLlxuICAgIHNldFBlbmRpbmdTZXNzaW9uSWQobnVsbClcbiAgICBpZiAoXG4gICAgICAoIWFnZW50IHx8IGFnZW50Py5pc19kZWxldGVkIHx8IGFnZW50Py5oYXNfbm90X3Blcm1pc3Npb25zIHx8IGFnZW50Py5oYXNfbm90X2FjY2VzcyB8fCBhZ2VudD8ucHJvamVjdF9kZWxldGVkKSAmJlxuICAgICAgYWdlbnRzLmRhdGEubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbMF0pXG4gICAgfVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGlzV2ViU2VhcmNoQWN0aXZlICYmIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICAgIH1cbiAgfSwgW1xuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBvcHRpb25zLmNoYXQsXG4gICAgY3VycmVudE9wdGlvbixcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICB0b2dnbGVXZWJTZWFyY2gsXG4gICAgYWdlbnQsXG4gICAgYWdlbnRzLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldENsaWVudCxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAvLyBEaXNwYXRjaCBldmVudCB0byBjbGVhciB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbaGFuZGxlR29Ib21lXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50KSB7XG4gICAgICBhZ2VudHNGZXRjaGVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBoYW5kbGVHZXRBZ2VudHMoKVxuICAgIH1cbiAgfSwgW2hhbmRsZUdldEFnZW50c10pXG5cbiAgLyoqXG4gICAqIFJlc29sdWNpw7NuIGluaWNpYWwgZGUgc2VzacOzbiBjdWFuZG8gZWwgbW9kYWwgc2UgYWJyZSBkZXNkZSB1biBjb250ZXh0byBjb25cbiAgICogZW50aXR5IHByZS1zZXRlYWRhOlxuICAgKiAtIGBzZWN0aW9uID09PSAncHJvamVjdCdgOiBgUHJvamVjdEFJQnV0dG9uYCB5YSBpbnllY3TDsyBlbCBgcHJvamVjdGAgeVxuICAgKiAgIGB1c2VHZXRBZ2VudHNgIGF1dG9zZWxlY2Npb25hIGVsIGVzcGVjaWFsaXN0YSBlbiBwcm95ZWN0b3MgKGNsb25lK3Byb2plY3QpLlxuICAgKiAtIGBzZWN0aW9uID09PSAnY2xpZW50J2A6IGlkZW0gY29uIGBDbGllbnRBSUJ1dHRvbmAgeSBjbG9uZStjbGllbnQuXG4gICAqXG4gICAqIEVuIGVzb3MgY2Fzb3Mgbm8gcGFzYW1vcyBwb3IgbG9zIHNlbGVjdG9ycyAobm8gaGF5IGNoYW5jZSBkZSBlamVjdXRhclxuICAgKiBgcmVzb2x2ZUFnZW50Q2hhdGApLCBhc8OtIHF1ZSBsbyBkaXNwYXJhbW9zIGFjw6EgdW5hIMO6bmljYSB2ZXogZW4gY3VhbnRvIGxhXG4gICAqIGNvbWJpbmFjacOzbiBhZ2VudCtlbnRpdHkgZXN0w6EgbGlzdGEuIFNpIGhheSBzZXNpw7NuIHByZXZpYSBzZSBcInByZXBhcmFcIiB5XG4gICAqIGVsIHVzdWFyaW8gdmUgaG9tZSBjb24gcGVuZGluZyAoZWwgcHLDs3hpbW8gbWVuc2FqZS9GQVEgbGEgY29udGluw7phKTsgc2kgbm8sXG4gICAqIHF1ZWRhIGVuIGhvbWUgcGFyYSBpbmljaWFyIHVuIG51ZXZvIGNoYXQuXG4gICAqL1xuICBjb25zdCBpbml0aWFsRW50aXR5UmVzb2x2ZURvbmVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxFbnRpdHlSZXNvbHZlRG9uZVJlZi5jdXJyZW50KSByZXR1cm5cbiAgICBpZiAoc2VjdGlvbiAhPT0gJ3Byb2plY3QnICYmIHNlY3Rpb24gIT09ICdjbGllbnQnKSByZXR1cm5cbiAgICBpZiAoYWdlbnQ/LnR5cGUgIT09ICdjbG9uZScpIHJldHVyblxuXG4gICAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyAmJiBhZ2VudD8uZW50aXR5ID09PSAncHJvamVjdCcgJiYgcHJvamVjdD8uaWQgIT0gbnVsbCkge1xuICAgICAgaW5pdGlhbEVudGl0eVJlc29sdmVEb25lUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICByZXNvbHZlQWdlbnRDaGF0KGFnZW50LCBwcm9qZWN0LmlkKVxuICAgIH0gZWxzZSBpZiAoc2VjdGlvbiA9PT0gJ2NsaWVudCcgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2NsaWVudCcgJiYgY2xpZW50Py5pZCAhPSBudWxsKSB7XG4gICAgICBpbml0aWFsRW50aXR5UmVzb2x2ZURvbmVSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIHJlc29sdmVBZ2VudENoYXQoYWdlbnQsIGNsaWVudC5pZClcbiAgICB9XG4gIH0sIFtzZWN0aW9uLCBhZ2VudCwgcHJvamVjdD8uaWQsIGNsaWVudD8uaWQsIHJlc29sdmVBZ2VudENoYXRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25NZXJnZUNyZWF0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKG5leHRBZ2VudD8uaWQpIHtcbiAgICAgICAgYWRkQWdlbnQobmV4dEFnZW50LCB7IG5hdmlnYXRlSG9tZTogZmFsc2UgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1tZXJnZS1jcmVhdGVkLWFnZW50LWludG8tbGlzdCcsIG9uTWVyZ2VDcmVhdGVkQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCBvbk1lcmdlQ3JlYXRlZEFnZW50KVxuICAgIH1cbiAgfSwgW2FkZEFnZW50XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uU3luY0VkaXRlZEFnZW50ID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnQ6IG5leHRBZ2VudCB9ID0gKGV2dCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAoIW5leHRBZ2VudD8uaWQpIHJldHVyblxuICAgICAgdXBkYXRlQWdlbnQobmV4dEFnZW50KVxuICAgICAgaWYgKGFnZW50Py5pZCA9PT0gbmV4dEFnZW50LmlkKSB7XG4gICAgICAgIHNlbGVjdEFnZW50KG5leHRBZ2VudClcbiAgICAgIH1cbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1zeW5jLWVkaXRlZC1hZ2VudC1mcm9tLWNoYXQnLCBvblN5bmNFZGl0ZWRBZ2VudClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1zeW5jLWVkaXRlZC1hZ2VudC1mcm9tLWNoYXQnLCBvblN5bmNFZGl0ZWRBZ2VudClcbiAgICB9XG4gIH0sIFt1cGRhdGVBZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50Py5pZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuQ2hhdFZpZXcgPSAoKSA9PiB7XG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldFBlbmRpbmdTZXNzaW9uSWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5jaGF0KVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1jaGF0LXZpZXcnLCBvcGVuQ2hhdFZpZXcpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1jaGF0LXZpZXcnLCBvcGVuQ2hhdFZpZXcpXG4gICAgfVxuICB9LCBbXSlcblxuICAvKiogTWlzbW8gZmx1am8gcXVlIENoYXRBSU15QWdlbnRzLmhhbmRsZVVzZUFnZW50ICsgb25CYWNrIChoYW5kbGVycy5ob21lKS4gKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuTmV3Q2hhdFdpdGhBZ2VudCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IG5leHRBZ2VudCA9IChldmVudCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsPy5hZ2VudFxuICAgICAgaWYgKCFuZXh0QWdlbnQpIHJldHVyblxuXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0UGVuZGluZ1Nlc3Npb25JZChudWxsKVxuICAgICAgc2VsZWN0QWdlbnQobmV4dEFnZW50KVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcblxuICAgICAgLy8gQ3VzdG9tIC8gY2xvbmUrZ2xvYmFsIG5vIHJlcXVpZXJlbiBlbnRpdHk6IHJlc29sdmVtb3Mgc2VzacOzbiBleGlzdGVudGUgaW5tZWRpYXRhbWVudGUuXG4gICAgICAvLyBDbG9uZStwcm9qZWN0fGNsaWVudCBxdWVkYW4gZXNwZXJhbmRvIHNlbGVjY2nDs24gZGUgZW50aWRhZCAocmVzb2x2ZXLDoSBlbCBzZWxlY3RvcikuXG4gICAgICBjb25zdCBuZWVkc0VudGl0eSA9XG4gICAgICAgIG5leHRBZ2VudD8udHlwZSA9PT0gJ2Nsb25lJyAmJiAobmV4dEFnZW50Py5lbnRpdHkgPT09ICdwcm9qZWN0JyB8fCBuZXh0QWdlbnQ/LmVudGl0eSA9PT0gJ2NsaWVudCcpXG4gICAgICBpZiAoIW5lZWRzRW50aXR5KSB7XG4gICAgICAgIHJlc29sdmVBZ2VudENoYXQobmV4dEFnZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50Jywgb3Blbk5ld0NoYXRXaXRoQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50Jywgb3Blbk5ld0NoYXRXaXRoQWdlbnQpXG4gICAgfVxuICB9LCBbc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgcmVzb2x2ZUFnZW50Q2hhdF0pXG5cbiAgY29uc3Qgc2hvd05ld0NoYXQgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdFxuICBjb25zdCBoaWRlSGVhZGVyQWdlbnRTZWxlY3RvciA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50c1xuICBjb25zdCBoYW5kbGVPcGVuTWFya2V0cGxhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLm15QWdlbnRzKVxuICB9LCBbXSlcblxuICAvKipcbiAgICogQWNjacOzbiBkZWwgYm90w7NuIFwibnVldm8gY2hhdFwiIGRlbCB0b29sYmFyIGRlIGxhIFNpZGViYXIuXG4gICAqXG4gICAqIExhIHBhbnRhbGxhIGRlc3Rpbm8gZGVwZW5kZSBkZWwgYWdlbnRlIGFjdHVhbDpcbiAgICogLSBgY3VzdG9tYCAgICAgICAgICAgICAgICAgICAgICAgICDihpIgYG9wdGlvbnMubXlBZ2VudHNgIChlbGVnaXIgb3RybyBhZ2VudGUpLlxuICAgKiAtIGBjbG9uZWAgKyBgZW50aXR5OiAncHJvamVjdCdgICAgIOKGkiBgb3B0aW9ucy5wcm9qZWN0U2VsZWN0b3JgIChlbGVnaXIgcHJveWVjdG8pLlxuICAgKiAtIGBjbG9uZWAgKyBgZW50aXR5OiAnY2xpZW50J2AgICAgIOKGkiBgb3B0aW9ucy5jbGllbnRTZWxlY3RvcmAgKGVsZWdpciBjbGllbnRlKS5cbiAgICogLSBgY2xvbmVgICsgYGVudGl0eTogJ2dsb2JhbCdgIGNvbiBub21icmUgbWFpYWtlci9tYXJrZXRwbGFjZSDihpIgYG9wdGlvbnMuaG9tZWBcbiAgICogICAocmVuZGVyaXphIGBDaGF0QUlIb21lTWFpYWtlcmApLlxuICAgKiAtIEZhbGxiYWNrIOKGkiBgb3B0aW9ucy5ob21lYC5cbiAgICovXG4gIGNvbnN0IGhhbmRsZU5ld0NoYXRBY3Rpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEFnZW50ID0gYWdlbnRcblxuICAgIC8vIEFzZWd1cmFtb3MgcXVlIGxhIHNlbGVjY2nDs24gZGUgZW50aXR5IHF1ZWRlIGxpbXBpYSBwYXJhIGxvcyBzZWxlY3RvcnMuXG4gICAgaWYgKGN1cnJlbnRBZ2VudD8udHlwZSA9PT0gJ2Nsb25lJyAmJiBjdXJyZW50QWdlbnQ/LmVudGl0eSA9PT0gJ3Byb2plY3QnKSB7XG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50QWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiYgY3VycmVudEFnZW50Py5lbnRpdHkgPT09ICdjbGllbnQnKSB7XG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIH1cblxuICAgIGhhbmRsZUdvSG9tZSgpXG5cbiAgICAvLyBQYXJhIGFnZW50ZXMgY3VzdG9tLCBoYW5kbGVHb0hvbWUgeWEgaGl6byBsb3MgcmVzZXRzIGNvbXVuZXM7IHPDs2xvXG4gICAgLy8gcmVkaXJpZ2ltb3MgZWwgZGVzdGlubyBhIE1pcyBBZ2VudGVzLlxuICAgIGlmIChjdXJyZW50QWdlbnQ/LnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMubXlBZ2VudHMpXG4gICAgfVxuICB9LCBbYWdlbnQsIGhhbmRsZUdvSG9tZSwgc2V0UHJvamVjdCwgc2V0Q2xpZW50XSlcblxuICBjb25zdCBoYW5kbGVHb1RvTWFpYWtlciA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBsZXQgbWFpYWtlckFnZW50ID0gYWdlbnRzLmRhdGEuZmluZCgoYTogQWdlbnQpID0+IGEudHlwZSA9PT0gJ2Nsb25lJyAmJiBhLmVudGl0eSA9PT0gJ2dsb2JhbCcpXG4gICAgaWYgKCFtYWlha2VyQWdlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmbGFuZz0ke21hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSl9YCxcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAgIG1haWFrZXJBZ2VudCA9IChkYXRhLmRhdGEgfHwgW10pLmZpbmQoKGE6IEFnZW50KSA9PiBhLnR5cGUgPT09ICdjbG9uZScgJiYgYS5lbnRpdHkgPT09ICdnbG9iYWwnKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1haWFrZXJBZ2VudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNlbGVjdEFnZW50KG1haWFrZXJBZ2VudClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCkge1xuICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gICAgfVxuICAgIC8vIG1haWFrZXIvbWFya2V0cGxhY2UgPSBjbG9uZStnbG9iYWwg4oaSIG5vIHJlcXVpZXJlIGVudGl0eV9pZFxuICAgIHJlc29sdmVBZ2VudENoYXQobWFpYWtlckFnZW50KVxuICB9LCBbYWdlbnRzLmRhdGEsIGkxOG4ubGFuZ3VhZ2UsIHNlbGVjdEFnZW50LCBzZXRDbGllbnQsIHNldFByb2plY3QsIHJlc29sdmVBZ2VudENoYXRdKVxuICBjb25zdCBoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50cyA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkOiBzdHJpbmcpID0+IHtcbiAgICAgIHJlbW92ZUFnZW50KGFnZW50SWQpXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSBhZ2VudElkKSB7XG4gICAgICAgIHNlbGVjdEZpcnN0QWdlbnQoYWdlbnRJZClcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudD8uaWQsIHJlbW92ZUFnZW50LCBzZWxlY3RGaXJzdEFnZW50XVxuICApXG5cbiAgY29uc3QgaGlkZUZvb3Rlck9uTWFpYWtlck1hcmtldHBsYWNlSG9tZSA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmIGlzTWFpYWtlckFnZW50U2VsZWN0ZWRcblxuICByZXR1cm4gKFxuICAgIHNlbGVjdG9yICYmXG4gICAgUmVhY3RET00uY3JlYXRlUG9ydGFsKFxuICAgICAgPFNDQ0FJTVdyYXBwZXIgZXhwYW5kZWQ9e2V4cGFuZGVkfT5cbiAgICAgICAgPFNDQ0FJTUNvbnRlbnRXcmFwcGVyIGV4cGFuZGVkPXtleHBhbmRlZH0+XG4gICAgICAgICAge3ZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24pICYmIChcbiAgICAgICAgICAgIDxTaWRlYmFyXG4gICAgICAgICAgICAgIG9uR29Ub0NoYXQ9e2dvVG9DaGF0fVxuICAgICAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRTaWRlYmFySGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgICAgIGhhbmRsZUdvVG9Ib21lPXtoYW5kbGVHb0hvbWV9XG4gICAgICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZT17aGFuZGxlT3Blbk1hcmtldHBsYWNlfVxuICAgICAgICAgICAgICBzaG93TmV3Q2hhdD17c2hvd05ld0NoYXR9XG4gICAgICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgICAgICBoYW5kbGVTZXRSZWZldGNoQ2hhdHM9e3NldFJlZmV0Y2hDaGF0c31cbiAgICAgICAgICAgICAgaGFzRXJyb3I9e3NpZGViYXJIYXNFcnJvcn1cbiAgICAgICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU9e3NpZGViYXJBZ2VudHNOYXZBY3RpdmV9XG4gICAgICAgICAgICAgIG9uTmV3Q2hhdD17aGFuZGxlTmV3Q2hhdEFjdGlvbn1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8U0NDQUlNQ29udGVudCBleHBhbmRlZD17ZXhwYW5kZWR9PlxuICAgICAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgICAgIDxDaGF0QUlNb2RhbEhlYWRlclxuICAgICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICAgIHNldEV4cGFuZGVkPXtzZXRFeHBhbmRlZH1cbiAgICAgICAgICAgICAgaGFuZGxlQ2xvc2U9e2hhbmRsZUNsb3NlTW9kYWx9XG4gICAgICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgICAgIGhhc0Vycm9yPXshIWFnZW50RXJyb3J9XG4gICAgICAgICAgICAgIGxvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgICAgIGxvYWRpbmdNb3JlPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICAgICAgaGFzTW9yZT17YWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgICAgICBoYW5kbGVSZXNldENoYXQ9e2hhbmRsZVJlc2V0Q2hhdH1cbiAgICAgICAgICAgICAgb25BZ2VudFVwZGF0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICAgICAgbG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgICAgICBzb3J0QWdlbnRzTGlzdD17c29ydEFnZW50c0xpc3R9XG4gICAgICAgICAgICAgIGhpZGVBZ2VudFNlbGVjdG9yPXtoaWRlSGVhZGVyQWdlbnRTZWxlY3Rvcn1cbiAgICAgICAgICAgICAgb25BZ2VudFNlbGVjdGVkPXtyZXNvbHZlQWdlbnRDaGF0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHsvKiBDb250ZW50ICovfVxuXG4gICAgICAgICAgICB7aGFzRXJyb3IgPyAoXG4gICAgICAgICAgICAgIDxNQUlBRXJyb3IgLz5cbiAgICAgICAgICAgICkgOiB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSA/IChcbiAgICAgICAgICAgICAgPENoYXRBSUNvbnRlbnRcbiAgICAgICAgICAgICAgICBjdXJyZW50T3B0aW9uPXtjb21wdXRlZEN1cnJlbnRPcHRpb259XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM9e3sgLi4uaGFuZGxlcnMsIGNoYXQ6IHN0YXJ0Q2hhdCwgaG9tZTogaGFuZGxlcnMuaG9tZSwgaGFuZGxlR29Ib21lIH19XG4gICAgICAgICAgICAgICAgb25FcnJvcj17KCkgPT4gc2V0SGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgICAgICAgcmVmcz17eyB1c2VySW5pdGlhbE1lc3NhZ2UsIGluaXRpYWxDaGF0SWQgfX1cbiAgICAgICAgICAgICAgICBvblNlbmRNZXNzYWdlUmVhZHk9e2hhbmRsZVNlbmRNZXNzYWdlUmVhZHl9XG4gICAgICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgICAgICAgb25EZWxldGVBZ2VudD17aGFuZGxlRGVsZXRlQWdlbnRGcm9tTXlBZ2VudHN9XG4gICAgICAgICAgICAgICAgb25GYXZvcml0ZUFnZW50VXBkYXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAgICAgICAgIGhhc01vcmVBZ2VudHM9eyEhYWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgICAgICAgIGxvYWRpbmdNb3JlQWdlbnRzPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICAgICAgICBvbkxvYWRNb3JlQWdlbnRzPXtsb2FkTW9yZUFnZW50c31cbiAgICAgICAgICAgICAgICBvbkdvVG9NYWlha2VyPXtoYW5kbGVHb1RvTWFpYWtlcn1cbiAgICAgICAgICAgICAgICBvblJlc29sdmVBZ2VudENoYXQ9e3Jlc29sdmVBZ2VudENoYXR9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8UHJvamVjdFN1bW1hcnlDb250ZW50IG9uUmVzdGFydFN1bW1hcnk9e2hhbmRsZXJzLmhvbWV9IC8+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7LyogRm9vdGVyICovfVxuICAgICAgICAgICAgeygoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgISFhZ2VudHM/LmRhdGE/Lmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpICYmXG4gICAgICAgICAgICAgICFoaWRlRm9vdGVyT25NYWlha2VyTWFya2V0cGxhY2VIb21lICYmXG4gICAgICAgICAgICAgICFoYXNFcnJvciAmJlxuICAgICAgICAgICAgICAhbG9hZGluZyAmJlxuICAgICAgICAgICAgICB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKSAmJiAoXG4gICAgICAgICAgICAgICAgPENoYXRBaU1vZGFsRm9vdGVyXG4gICAgICAgICAgICAgICAgICBhZ2VudD17YWdlbnR9XG4gICAgICAgICAgICAgICAgICBoYW5kbGVTZW5kTWVzc2FnZT17aGFuZGxlU2VuZE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICBoYW5kbGVTdG9wR2VuZXJhdGlvbj17c3RvcEdlbmVyYXRpb25GdW5jdGlvbn1cbiAgICAgICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgICAgIGlzV3JpdGluZz17aXNXcml0aW5nfVxuICAgICAgICAgICAgICAgICAgY2hhdElkPXtpbml0aWFsQ2hhdElkfVxuICAgICAgICAgICAgICAgICAgbmV3Q2hhdEtleT17bmV3Q2hhdEtleX1cbiAgICAgICAgICAgICAgICAgIHNob3dGYXFzPXtjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgIDwvU0NDQUlNQ29udGVudD5cbiAgICAgICAgPC9TQ0NBSU1Db250ZW50V3JhcHBlcj5cbiAgICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgICAgPEFibUFnZW50TW9kYWxcbiAgICAgICAgICAgIGFkZEFnZW50PXthZGRBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50PXt1cGRhdGVBZ2VudH1cbiAgICAgICAgICAgIHJlbW92ZUFnZW50PXtyZW1vdmVBZ2VudH1cbiAgICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgICBzZWxlY3RGaXJzdEFnZW50PXtzZWxlY3RGaXJzdEFnZW50fVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxTbmFja2JhciAvPlxuICAgICAgPC9TQ0NBSU1XcmFwcGVyPixcbiAgICAgIHNlbGVjdG9yXG4gICAgKVxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBb0JBLFdBQVcsRUFBRUMsT0FBTyxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxRQUFRLE9BQU87QUFDcEYsT0FBT0MsUUFBUSxNQUFNLFdBQVc7QUFDaEMsT0FBT0MsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFDOUMsU0FBU0MsT0FBTyxRQUFRLDJCQUEyQjtBQUNuRCxTQUFTQyxTQUFTLFFBQVEsdUJBQXVCO0FBRWpELFNBQVNDLGFBQWEsUUFBUSxrQkFB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