@projectcor/maia-components 2.30.2-0 → 2.30.3-1
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.
- package/lib/App.js +2 -4
- package/lib/components/atoms/MAIAInput/MAIAInput.js +14 -73
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +6 -3
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +150 -391
- package/lib/components/molecules/ChatAIMessages/newStyles.js +18 -50
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +381 -94
- package/lib/components/molecules/MessageFeedback/styles.js +2 -6
- package/lib/components/molecules/Sidebar/Sidebar.js +41 -18
- package/lib/components/organisms/ChatAI/ChatAI.js +21 -8
- package/lib/context/global-context.js +1 -1
- package/lib/hooks/useChatManager/useChatManager.js +59 -97
- package/lib/hooks/useChatMessages/useChatMessages.js +27 -28
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +3 -4
- package/lib/hooks/useProjectSummaryConfig.js +17 -36
- package/lib/lang/br/index.js +31 -237
- package/lib/lang/en/index.js +31 -237
- package/lib/lang/es/index.js +31 -237
- package/lib/lang/fr/index.js +31 -237
- package/lib/services/maia/Agents/getAgents.js +25 -21
- package/lib/services/maia/Orchestrator/orchestrator.js +7 -9
- package/lib/services/utils/mapChatMessages.js +18 -21
- package/lib/store/maiaLastChatPersistence.js +3 -4
- package/lib/store/maiaPanelSessionPersistence.js +74 -0
- package/lib/store/sessions/sessionStreamManager.js +51 -98
- package/lib/store/sessions/sessions.types.js +1 -1
- package/lib/types/Chat.js +1 -1
- package/lib/utils/hitlAnalytics.js +3 -4
- package/lib/utils/streamActivityMessages.js +41 -106
- package/package.json +1 -1
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +0 -116
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +0 -197
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +0 -157
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +0 -123
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +0 -115
- package/lib/components/atoms/ReasoningBlock/index.js +0 -3
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +0 -54
- package/lib/dev/DevReasoningTimeline.js +0 -235
- package/lib/dev/reasoningTraceMock.js +0 -556
- package/lib/hooks/useReasoningTrace/index.js +0 -3
- package/lib/hooks/useReasoningTrace/reasoningStore.js +0 -142
- package/lib/hooks/useReasoningTrace/useReasoningTrace.js +0 -14
- package/lib/types/reasoning.js +0 -2
- package/lib/utils/autoApproveStorage.js +0 -26
- package/lib/utils/reasoningMappers.js +0 -62
|
@@ -19,6 +19,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
19
19
|
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
20
20
|
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
21
21
|
import React, { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, createElement as _createElement } from 'react';
|
|
22
|
+
import { ArrowSmallDown } from '@projectcor/icons/lib/components/ArrowSmallDown';
|
|
22
23
|
import { AttachmentCard } from '../../atoms/AttachmentCard/AttachmentCard';
|
|
23
24
|
import { ApprovalBox } from '../../atoms/ApprovalBox/ApprovalBox';
|
|
24
25
|
import { AttachmentPreviewModal } from '../../atoms/AttachmentPreviewModal';
|
|
@@ -34,18 +35,14 @@ import { useSmoothStreamText } from '../../../hooks/useSmoothStreamText';
|
|
|
34
35
|
import { useStreamingMessage } from '../../../hooks/useStreamingMessage';
|
|
35
36
|
import { LoadingText } from '../../atoms/LoadingText';
|
|
36
37
|
import { AgentActivityIndicator } from '../../atoms/AgentActivityIndicator';
|
|
37
|
-
import { ReasoningBlock } from '../../atoms/ReasoningBlock/ReasoningBlock';
|
|
38
|
-
import { shouldStreamNarrationInTimeline } from '../../atoms/ReasoningBlock/reasoningLiveNarration';
|
|
39
|
-
import { ReasoningTimeline } from '../../atoms/ReasoningBlock/ReasoningTimeline';
|
|
40
|
-
import { SCTimelineIndicator } from '../../atoms/ReasoningBlock/ReasoningBlock.styles';
|
|
41
38
|
import { isStreamingPlaceholderMessageId, resolveStreamLoadingDisplay } from '../../../utils/streamActivityMessages';
|
|
42
39
|
import { resolveRetryTurnId, findUserMessageForRetry } from '../../../utils/retryCompletion';
|
|
43
|
-
import { useReasoningTrace } from '../../../hooks/useReasoningTrace';
|
|
44
40
|
import { Loader } from '../../atoms/Loader';
|
|
45
41
|
import { Fade } from '../../atoms/Fade';
|
|
42
|
+
import { patchMaiaPanelSession, readMaiaPanelSession } from '../../../store/maiaPanelSessionPersistence';
|
|
46
43
|
import { MessageFromUser, MessageFromOther, MessageContentFromUser, MessageContentFromOther } from './styles';
|
|
47
44
|
import { MessageFeedback } from '../MessageFeedback';
|
|
48
|
-
import { SCCAIMessageWrapper, ScrollToBottomButton,
|
|
45
|
+
import { SCCAIMessageWrapper, ScrollToBottomButton, SCMessagesOuter, SCMessagesScroll, SCMessagesInner, SCLoadingMessagesColumn, SCOptionsList, SCOptionItem, SCMessageItemWrapper, SCMessageItemInner, SCAttachmentsRow, SCApprovalActionsColumn } from './newStyles';
|
|
49
46
|
import { Feedback } from '../MessageFeedback/MessageFeedback';
|
|
50
47
|
import { useGlobalContext } from '../../../context/global-context';
|
|
51
48
|
import { EntityLinkCustomLink, getEntityLinkWrapperClassName } from '../../../utils/entityLinkRender';
|
|
@@ -54,24 +51,6 @@ import { ChatAICreateAgentActions } from './ChatAICreateAgentActions';
|
|
|
54
51
|
import { EVENTS, useEvent } from '../../../hooks/useEvent';
|
|
55
52
|
import { downloadFileFromUrl } from '../../../utils/fileDownloadHelper';
|
|
56
53
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
57
|
-
/**
|
|
58
|
-
* Al anclar el turno, la pregunta no se pega al borde superior: dejamos asomar
|
|
59
|
-
* la cola del mensaje anterior para no perder el hilo de la conversación.
|
|
60
|
-
* Relativo al viewport porque un valor fijo se come demasiado en pantallas cortas.
|
|
61
|
-
*/
|
|
62
|
-
var turnAnchorOffset = function turnAnchorOffset(viewportHeight) {
|
|
63
|
-
return Math.min(viewportHeight * 0.18, 200);
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Duración del scroll animado: base y tope para recorridos largos, para que un
|
|
68
|
-
* salto de varias pantallas no se sienta un latigazo.
|
|
69
|
-
*/
|
|
70
|
-
var TURN_SCROLL_DURATION_MS = 600;
|
|
71
|
-
var TURN_SCROLL_MAX_DURATION_MS = 800;
|
|
72
|
-
|
|
73
|
-
/** Distancia a partir de la cual la duración ya está en su tope. */
|
|
74
|
-
var TURN_SCROLL_LONG_DISTANCE_PX = 1200;
|
|
75
54
|
var MessageWrapper = function MessageWrapper(_ref) {
|
|
76
55
|
var isCurrentUser = _ref.isCurrentUser,
|
|
77
56
|
children = _ref.children,
|
|
@@ -199,7 +178,7 @@ var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
|
|
|
199
178
|
});
|
|
200
179
|
});
|
|
201
180
|
var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
202
|
-
var _props$
|
|
181
|
+
var _props$projectMetadat;
|
|
203
182
|
var id = props.id,
|
|
204
183
|
user = props.user,
|
|
205
184
|
message = props.message,
|
|
@@ -222,22 +201,22 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
222
201
|
suggestions = props.suggestions,
|
|
223
202
|
createAgentFollowUp = props.createAgentFollowUp,
|
|
224
203
|
hasSelectedSuggestion = props.hasSelectedSuggestion,
|
|
225
|
-
isLastMessage = props.isLastMessage
|
|
226
|
-
streamActivity = props.streamActivity;
|
|
204
|
+
isLastMessage = props.isLastMessage;
|
|
227
205
|
var _useState3 = useState(null),
|
|
228
206
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
229
207
|
previewAttachment = _useState4[0],
|
|
230
208
|
setPreviewAttachment = _useState4[1];
|
|
231
209
|
var isCurrentUser = role === ChatHistoryRole.USER || user.id === authUser.id.toString();
|
|
232
210
|
var isAssistant = role === ChatHistoryRole.ASSISTANT || user.id === 'assistant';
|
|
211
|
+
// Mientras el agente "piensa" (streaming sin texto) no montamos el MessageItem:
|
|
212
|
+
// un placeholder vacío sumaría otro gap de 36px encima del indicador de actividad.
|
|
233
213
|
var isStreamingPlaceholder = isStreamingPlaceholderMessageId(id);
|
|
234
214
|
var streamingText = useStreamingMessage(isStreaming || isStreamingPlaceholder ? id : null);
|
|
235
215
|
var isActiveStreaming = !!isStreaming || isStreamingPlaceholder;
|
|
236
|
-
var
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
var showActivityIndicator = isAssistant && isActiveStreaming && !!streamActivity;
|
|
216
|
+
var isThinking = isActiveStreaming && !streamingText;
|
|
217
|
+
if (isThinking) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
241
220
|
var messageAttachments = attachments && attachments.length > 0 ? attachments : !isAssistant && Array.isArray(sources) ? sources : [];
|
|
242
221
|
var handleAttachmentClick = function handleAttachmentClick(attachment) {
|
|
243
222
|
// Permitir previsualización si tiene archivo local o URLs del backend
|
|
@@ -335,16 +314,8 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
335
314
|
};
|
|
336
315
|
return /*#__PURE__*/_jsxs(SCMessageItemWrapper, {
|
|
337
316
|
$isAssistant: isAssistant,
|
|
338
|
-
"data-message-id": id,
|
|
339
317
|
children: [/*#__PURE__*/_jsxs(SCMessageItemInner, {
|
|
340
|
-
children: [
|
|
341
|
-
messageId: id,
|
|
342
|
-
streamActivity: streamActivity,
|
|
343
|
-
streamingText: streamingText
|
|
344
|
-
}) : /*#__PURE__*/_jsx(ReasoningBlock, {
|
|
345
|
-
messageId: id,
|
|
346
|
-
trace: (_props$reasoning = props.reasoning) !== null && _props$reasoning !== void 0 ? _props$reasoning : null
|
|
347
|
-
})), !!messageAttachments.length && /*#__PURE__*/_jsx(SCAttachmentsRow, {
|
|
318
|
+
children: [!!messageAttachments.length && /*#__PURE__*/_jsx(SCAttachmentsRow, {
|
|
348
319
|
$isAssistant: isAssistant,
|
|
349
320
|
children: messageAttachments.map(function (attachment, index) {
|
|
350
321
|
var _attachment$type, _attachment$name;
|
|
@@ -370,9 +341,9 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
370
341
|
}
|
|
371
342
|
}, "".concat(attachment.id, "-").concat(attachment.name));
|
|
372
343
|
})
|
|
373
|
-
}), (!!message ||
|
|
344
|
+
}), (!!message || isActiveStreaming) && !(isAssistant && !!messageAttachments.length) && /*#__PURE__*/_jsx(StreamingMessageBody, {
|
|
374
345
|
message: message !== null && message !== void 0 ? message : '',
|
|
375
|
-
isStreaming:
|
|
346
|
+
isStreaming: isActiveStreaming,
|
|
376
347
|
isCurrentUser: isCurrentUser,
|
|
377
348
|
isAssistant: isAssistant,
|
|
378
349
|
isFrontendCancelled: props.isFrontendCancelled,
|
|
@@ -388,11 +359,6 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
388
359
|
suggestionsDisabled: isActiveStreaming || !!hasSelectedSuggestion,
|
|
389
360
|
messageId: id,
|
|
390
361
|
isLastMessage: isLastMessage
|
|
391
|
-
}), showActivityIndicator && /*#__PURE__*/_jsx(SCTimelineIndicator, {
|
|
392
|
-
children: /*#__PURE__*/_jsx(AgentActivityIndicator, {
|
|
393
|
-
activity: streamActivity,
|
|
394
|
-
compact: true
|
|
395
|
-
})
|
|
396
362
|
}), approval && approval.pending_actions && /*#__PURE__*/_jsx(SCApprovalActionsColumn, {
|
|
397
363
|
children: /*#__PURE__*/_jsx(ApprovalBox, {
|
|
398
364
|
actions: approval.pending_actions,
|
|
@@ -441,36 +407,19 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
441
407
|
var scrollThresholdRef = useRef(39);
|
|
442
408
|
var lastScrollTopRef = useRef(0);
|
|
443
409
|
var showScrollToBottomRef = useRef(false);
|
|
444
|
-
var showTopGradientRef = useRef(false);
|
|
445
|
-
var showBottomGradientRef = useRef(false);
|
|
446
410
|
var scrollRafRef = useRef(null);
|
|
447
|
-
/**
|
|
448
|
-
* Turno con el scroll bajo control del usuario: desde que envía el mensaje y
|
|
449
|
-
* hasta el próximo envío no movemos el scroll por ningún motivo. Es
|
|
450
|
-
* independiente de la altura del spacer, que puede llegar a 0 sin desanclar.
|
|
451
|
-
*/
|
|
452
|
-
var anchoredTurnIdRef = useRef(null);
|
|
453
|
-
var spacerElRef = useRef(null);
|
|
454
|
-
var spacerHeightRef = useRef(0);
|
|
455
|
-
var turnScrollRafRef = useRef(null);
|
|
456
411
|
var wasLoadingMessagesRef = useRef(false);
|
|
457
412
|
var lastScrolledSessionRef = useRef(null);
|
|
413
|
+
var pendingScrollRestoreRef = useRef(null);
|
|
414
|
+
var scrollPersistTimerRef = useRef(null);
|
|
458
415
|
var _useState5 = useState(false),
|
|
459
416
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
460
417
|
showScrollToBottom = _useState6[0],
|
|
461
418
|
setShowScrollToBottom = _useState6[1];
|
|
462
|
-
var _useState7 = useState(
|
|
419
|
+
var _useState7 = useState({}),
|
|
463
420
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
var _useState9 = useState(false),
|
|
467
|
-
_useState0 = _slicedToArray(_useState9, 2),
|
|
468
|
-
showBottomGradient = _useState0[0],
|
|
469
|
-
setShowBottomGradient = _useState0[1];
|
|
470
|
-
var _useState1 = useState({}),
|
|
471
|
-
_useState10 = _slicedToArray(_useState1, 2),
|
|
472
|
-
selectedSuggestionMessageIds = _useState10[0],
|
|
473
|
-
setSelectedSuggestionMessageIds = _useState10[1];
|
|
421
|
+
selectedSuggestionMessageIds = _useState8[0],
|
|
422
|
+
setSelectedSuggestionMessageIds = _useState8[1];
|
|
474
423
|
var _useChatManager = useChatManager({
|
|
475
424
|
chatId: initialChatId || undefined,
|
|
476
425
|
userInitialMessage: userInitialMessage,
|
|
@@ -497,36 +446,50 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
497
446
|
var handleSelectOption = useCallback(function (option) {
|
|
498
447
|
changeProject(option);
|
|
499
448
|
}, [changeProject]);
|
|
449
|
+
var handleSuggestionClick = useCallback(function (messageId, suggestion) {
|
|
450
|
+
if (!(suggestion !== null && suggestion !== void 0 && suggestion.trim())) return;
|
|
451
|
+
if (selectedSuggestionMessageIds[messageId]) return;
|
|
452
|
+
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
453
|
+
event(EVENTS.aiChatSuggestedAnswer, {
|
|
454
|
+
agent_type: isMarketplaceGlobalAgent ? 'marketplace' : agent === null || agent === void 0 ? void 0 : agent.type
|
|
455
|
+
});
|
|
456
|
+
setSelectedSuggestionMessageIds(function (prev) {
|
|
457
|
+
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, messageId, true));
|
|
458
|
+
});
|
|
459
|
+
var targetMessage = messages.find(function (msg) {
|
|
460
|
+
return msg.id === messageId;
|
|
461
|
+
});
|
|
462
|
+
var isRetrySuggestion = !!(targetMessage !== null && targetMessage !== void 0 && targetMessage.isError) && suggestion === t('chat.retry');
|
|
463
|
+
if (isRetrySuggestion) {
|
|
464
|
+
var _lastUserMessage = messages.filter(function (msg) {
|
|
465
|
+
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
466
|
+
}).at(-1);
|
|
467
|
+
if (_lastUserMessage !== null && _lastUserMessage !== void 0 && _lastUserMessage.message) {
|
|
468
|
+
var retryAttachments = Array.isArray(_lastUserMessage.attachments) ? _lastUserMessage.attachments : Array.isArray(_lastUserMessage.sources) ? _lastUserMessage.sources : [];
|
|
469
|
+
sendMessage(_lastUserMessage.message, retryAttachments);
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
sendMessage(suggestion);
|
|
474
|
+
}, [sendMessage, selectedSuggestionMessageIds, event, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type, messages, t, authUser.id]);
|
|
500
475
|
|
|
501
476
|
/**
|
|
502
|
-
*
|
|
503
|
-
*
|
|
504
|
-
*
|
|
477
|
+
* Actualiza el estado del botón "scroll to bottom" comparando la posición
|
|
478
|
+
* actual del scroll con el fondo. Usa un ref para evitar `setState` cuando
|
|
479
|
+
* el valor no cambia.
|
|
505
480
|
*/
|
|
506
|
-
var
|
|
481
|
+
var updateScrollBottomVisibility = useCallback(function () {
|
|
507
482
|
var el = messagesRef.current;
|
|
508
483
|
if (!el) return;
|
|
509
484
|
var scrollTop = el.scrollTop,
|
|
510
485
|
scrollHeight = el.scrollHeight,
|
|
511
486
|
clientHeight = el.clientHeight;
|
|
512
|
-
|
|
513
|
-
// la flecha y el gradiente de abajo quedan encendidos durante todo el turno.
|
|
514
|
-
var distanceFromBottom = scrollHeight - spacerHeightRef.current - scrollTop - clientHeight;
|
|
487
|
+
var distanceFromBottom = scrollHeight - scrollTop - clientHeight;
|
|
515
488
|
var shouldShow = distanceFromBottom > 50;
|
|
516
489
|
if (showScrollToBottomRef.current !== shouldShow) {
|
|
517
490
|
showScrollToBottomRef.current = shouldShow;
|
|
518
491
|
setShowScrollToBottom(shouldShow);
|
|
519
492
|
}
|
|
520
|
-
var nextTopGradient = scrollTop > 1;
|
|
521
|
-
if (showTopGradientRef.current !== nextTopGradient) {
|
|
522
|
-
showTopGradientRef.current = nextTopGradient;
|
|
523
|
-
setShowTopGradient(nextTopGradient);
|
|
524
|
-
}
|
|
525
|
-
var nextBottomGradient = distanceFromBottom > 1;
|
|
526
|
-
if (showBottomGradientRef.current !== nextBottomGradient) {
|
|
527
|
-
showBottomGradientRef.current = nextBottomGradient;
|
|
528
|
-
setShowBottomGradient(nextBottomGradient);
|
|
529
|
-
}
|
|
530
493
|
}, []);
|
|
531
494
|
|
|
532
495
|
/**
|
|
@@ -546,149 +509,33 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
546
509
|
if (!el) return;
|
|
547
510
|
if (skipIfUserScrolling && userScrollingRef.current) return;
|
|
548
511
|
el.scrollTop = el.scrollHeight;
|
|
549
|
-
|
|
512
|
+
updateScrollBottomVisibility();
|
|
550
513
|
});
|
|
551
514
|
};
|
|
552
515
|
if (delayMs > 0) setTimeout(run, delayMs);else run();
|
|
553
|
-
}, [
|
|
554
|
-
var cancelTurnScroll = useCallback(function () {
|
|
555
|
-
if (turnScrollRafRef.current === null) return;
|
|
556
|
-
cancelAnimationFrame(turnScrollRafRef.current);
|
|
557
|
-
turnScrollRafRef.current = null;
|
|
558
|
-
}, []);
|
|
559
|
-
|
|
560
|
-
/**
|
|
561
|
-
* Scroll animado con easing propio: `behavior: 'smooth'` no permite regular la
|
|
562
|
-
* duración y el salto al anclar el turno queda demasiado seco.
|
|
563
|
-
*/
|
|
564
|
-
var animateScrollTo = useCallback(function (top) {
|
|
565
|
-
cancelTurnScroll();
|
|
566
|
-
var el = messagesRef.current;
|
|
567
|
-
if (!el) return;
|
|
568
|
-
var from = el.scrollTop;
|
|
569
|
-
var distance = top - from;
|
|
570
|
-
if (Math.abs(distance) < 1) return;
|
|
571
|
-
var duration = TURN_SCROLL_DURATION_MS + (TURN_SCROLL_MAX_DURATION_MS - TURN_SCROLL_DURATION_MS) * Math.min(1, Math.abs(distance) / TURN_SCROLL_LONG_DISTANCE_PX);
|
|
572
|
-
var startedAt = performance.now();
|
|
573
|
-
var _step = function step(now) {
|
|
574
|
-
var progress = Math.min(1, (now - startedAt) / duration);
|
|
575
|
-
// easeOutExpo (~cubic-bezier(0.16, 1, 0.3, 1)): empieza a frenar mucho
|
|
576
|
-
// antes que el quint y aterriza sin corte perceptible.
|
|
577
|
-
var eased = progress === 1 ? 1 : 1 - Math.pow(2, -12 * progress);
|
|
578
|
-
el.scrollTop = from + distance * eased;
|
|
579
|
-
updateScrollAffordances();
|
|
580
|
-
turnScrollRafRef.current = progress < 1 ? requestAnimationFrame(_step) : null;
|
|
581
|
-
};
|
|
582
|
-
turnScrollRafRef.current = requestAnimationFrame(_step);
|
|
583
|
-
}, [cancelTurnScroll, updateScrollAffordances]);
|
|
584
|
-
useEffect(function () {
|
|
585
|
-
return cancelTurnScroll;
|
|
586
|
-
}, [cancelTurnScroll]);
|
|
587
|
-
var setSpacerHeight = useCallback(function (next) {
|
|
588
|
-
if (Math.abs(spacerHeightRef.current - next) < 1) return;
|
|
589
|
-
spacerHeightRef.current = next;
|
|
590
|
-
if (spacerElRef.current) {
|
|
591
|
-
spacerElRef.current.style.height = "".concat(next, "px");
|
|
592
|
-
}
|
|
593
|
-
}, []);
|
|
594
|
-
var clearTurnSpace = useCallback(function () {
|
|
595
|
-
anchoredTurnIdRef.current = null;
|
|
596
|
-
setSpacerHeight(0);
|
|
597
|
-
}, [setSpacerHeight]);
|
|
598
|
-
|
|
599
|
-
/**
|
|
600
|
-
* Devuelve el alto reservado que se puede sacar sin mover la vista: todo lo
|
|
601
|
-
* que quede por debajo del scroll actual. Si el usuario está en el fondo, se
|
|
602
|
-
* saca entero; si está a mitad de camino, se va drenando a medida que baja.
|
|
603
|
-
*/
|
|
604
|
-
var drainTurnSpace = useCallback(function () {
|
|
605
|
-
var el = messagesRef.current;
|
|
606
|
-
if (!el || spacerHeightRef.current <= 0) return;
|
|
607
|
-
var removable = Math.max(0, el.scrollHeight - el.clientHeight - el.scrollTop);
|
|
608
|
-
setSpacerHeight(Math.max(0, spacerHeightRef.current - removable));
|
|
609
|
-
}, [setSpacerHeight]);
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* El usuario tomó el control del scroll: el turno deja de estar anclado y el
|
|
613
|
-
* espacio reservado empieza a devolverse. Sin ancla y con spacer > 0, el
|
|
614
|
-
* handler de scroll sigue drenando hasta que llega al fondo y no queda hueco.
|
|
615
|
-
*/
|
|
616
|
-
var releaseTurnSpace = useCallback(function () {
|
|
617
|
-
if (!anchoredTurnIdRef.current && spacerHeightRef.current <= 0) return;
|
|
618
|
-
anchoredTurnIdRef.current = null;
|
|
619
|
-
drainTurnSpace();
|
|
620
|
-
}, [drainTurnSpace]);
|
|
621
|
-
var handleUserScrollIntent = useCallback(function () {
|
|
622
|
-
cancelTurnScroll();
|
|
623
|
-
releaseTurnSpace();
|
|
624
|
-
}, [cancelTurnScroll, releaseTurnSpace]);
|
|
625
|
-
var measureTurn = useCallback(function (questionId) {
|
|
626
|
-
var el = messagesRef.current;
|
|
627
|
-
var spacerEl = spacerElRef.current;
|
|
628
|
-
if (!el || !spacerEl) return null;
|
|
629
|
-
var questionEl = el.querySelector("[data-message-id=\"".concat(questionId, "\"]"));
|
|
630
|
-
if (!questionEl) return null;
|
|
631
|
-
var containerTop = el.getBoundingClientRect().top;
|
|
632
|
-
var questionTop = questionEl.getBoundingClientRect().top - containerTop + el.scrollTop;
|
|
633
|
-
var contentBottom = spacerEl.getBoundingClientRect().top - containerTop + el.scrollTop;
|
|
634
|
-
return {
|
|
635
|
-
el: el,
|
|
636
|
-
questionTop: questionTop,
|
|
637
|
-
turnHeight: contentBottom - questionTop
|
|
638
|
-
};
|
|
639
|
-
}, []);
|
|
640
|
-
var reserveTurnSpace = useCallback(function (questionId) {
|
|
641
|
-
var measured = measureTurn(questionId);
|
|
642
|
-
if (!measured) return;
|
|
643
|
-
var el = measured.el,
|
|
644
|
-
questionTop = measured.questionTop,
|
|
645
|
-
turnHeight = measured.turnHeight;
|
|
646
|
-
|
|
647
|
-
// Anclamos siempre, incluso cuando no haga falta reservar: durante el
|
|
648
|
-
// turno el scroll no se mueve solo en ningún caso.
|
|
649
|
-
anchoredTurnIdRef.current = questionId;
|
|
650
|
-
var offset = turnAnchorOffset(el.clientHeight);
|
|
651
|
-
var targetScrollTop = Math.max(0, questionTop - offset);
|
|
652
|
-
// Chat recién iniciado o conversación que aún entra en pantalla: la
|
|
653
|
-
// pregunta ya está arriba, no hay nada que subir ni que reservar.
|
|
654
|
-
if (targetScrollTop <= el.scrollTop) {
|
|
655
|
-
setSpacerHeight(0);
|
|
656
|
-
updateScrollAffordances();
|
|
657
|
-
return;
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
// Reservamos lo mínimo para que `targetScrollTop` sea alcanzable. El
|
|
661
|
-
// spacer se inserta de una (es alto reservado, no contenido visible);
|
|
662
|
-
// lo único que se percibe es el desplazamiento animado.
|
|
663
|
-
setSpacerHeight(Math.max(0, el.clientHeight - turnHeight - offset));
|
|
664
|
-
animateScrollTo(targetScrollTop);
|
|
665
|
-
}, [measureTurn, setSpacerHeight, updateScrollAffordances, animateScrollTo]);
|
|
666
|
-
|
|
667
|
-
/**
|
|
668
|
-
* Encoge el spacer a medida que crece la respuesta: el alto total del scroll
|
|
669
|
-
* queda constante y la vista no se mueve sola. Solo achica, nunca agranda,
|
|
670
|
-
* para no inyectar espacio en turnos que arrancaron sin reserva.
|
|
671
|
-
* Devuelve si el turno sigue anclado (aunque el spacer ya sea 0).
|
|
672
|
-
*/
|
|
673
|
-
var syncTurnSpace = useCallback(function () {
|
|
674
|
-
if (!anchoredTurnIdRef.current) return false;
|
|
675
|
-
if (spacerHeightRef.current > 0) {
|
|
676
|
-
var measured = measureTurn(anchoredTurnIdRef.current);
|
|
677
|
-
if (measured) {
|
|
678
|
-
var offset = turnAnchorOffset(measured.el.clientHeight);
|
|
679
|
-
var reserved = Math.max(0, measured.el.clientHeight - measured.turnHeight - offset);
|
|
680
|
-
setSpacerHeight(Math.min(spacerHeightRef.current, reserved));
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
return true;
|
|
684
|
-
}, [measureTurn, setSpacerHeight]);
|
|
516
|
+
}, [updateScrollBottomVisibility]);
|
|
685
517
|
var handleClickScrollToBottom = useCallback(function () {
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
518
|
+
if (!messagesRef.current) return;
|
|
519
|
+
messagesRef.current.scrollTo({
|
|
520
|
+
top: messagesRef.current.scrollHeight,
|
|
521
|
+
behavior: 'smooth'
|
|
522
|
+
});
|
|
523
|
+
// Dar tiempo al smooth-scroll antes de recalcular la visibilidad del botón.
|
|
524
|
+
setTimeout(updateScrollBottomVisibility, 500);
|
|
525
|
+
}, [updateScrollBottomVisibility]);
|
|
526
|
+
|
|
527
|
+
// Al decidir en el ApprovalBox: el box colapsa (botones -> badge) y el stream
|
|
528
|
+
// continúa abajo. Reactivar el auto-scroll y seguir el fondo para que la vista
|
|
529
|
+
// no quede atrás (evita que aparezca la flecha de scroll-to-bottom).
|
|
530
|
+
var handleApprovalDecisionWithScroll = useCallback(function () {
|
|
531
|
+
userScrollingRef.current = false;
|
|
532
|
+
scrollThresholdRef.current = 39;
|
|
533
|
+
handleApprovalDecision.apply(void 0, arguments);
|
|
534
|
+
scrollToBottomRaf();
|
|
535
|
+
scrollToBottomRaf({
|
|
536
|
+
delayMs: 100
|
|
537
|
+
});
|
|
538
|
+
}, [handleApprovalDecision, scrollToBottomRaf]);
|
|
692
539
|
var handleScrollToBottom = useCallback(function (e) {
|
|
693
540
|
var container = e.currentTarget;
|
|
694
541
|
if (scrollRafRef.current !== null) {
|
|
@@ -709,18 +556,24 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
709
556
|
}
|
|
710
557
|
userScrollingRef.current = !isNearBottom;
|
|
711
558
|
lastScrollTopRef.current = scrollTop;
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
559
|
+
updateScrollBottomVisibility();
|
|
560
|
+
if (initialChatId && scrollTop > 0) {
|
|
561
|
+
if (scrollPersistTimerRef.current != null) {
|
|
562
|
+
window.clearTimeout(scrollPersistTimerRef.current);
|
|
563
|
+
}
|
|
564
|
+
scrollPersistTimerRef.current = window.setTimeout(function () {
|
|
565
|
+
patchMaiaPanelSession(authUser.id, {
|
|
566
|
+
scrollTop: scrollTop,
|
|
567
|
+
scrollSessionId: initialChatId
|
|
568
|
+
});
|
|
569
|
+
}, 150);
|
|
570
|
+
}
|
|
718
571
|
if (isNearBottom && onScrollToBottom) {
|
|
719
572
|
onScrollToBottom();
|
|
720
573
|
}
|
|
721
574
|
handleScroll(container);
|
|
722
575
|
});
|
|
723
|
-
}, [
|
|
576
|
+
}, [authUser.id, handleScroll, initialChatId, onScrollToBottom, updateScrollBottomVisibility]);
|
|
724
577
|
|
|
725
578
|
// refs to stabilize functions and avoid unnecessary re-renders
|
|
726
579
|
var sendMessageRef = useRef(sendMessage);
|
|
@@ -737,45 +590,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
737
590
|
sendMessageRef.current = sendMessage;
|
|
738
591
|
stopGenerationRef.current = stopGeneration;
|
|
739
592
|
onSendMessageReadyRef.current = onSendMessageReady;
|
|
740
|
-
|
|
741
|
-
/**
|
|
742
|
-
* `handleSuggestionClick` se pasa a TODOS los MessageItem, así que su identidad
|
|
743
|
-
* decide si el `memo` de la lista sostiene. Leemos por ref lo que cambia en cada
|
|
744
|
-
* update (`messages`, `sendMessage`, las sugerencias ya elegidas) para que el
|
|
745
|
-
* callback sea estable: si no, al terminar el stream se repinta el chat entero
|
|
746
|
-
* y cada MaiaStreamdown vuelve a parsear su markdown.
|
|
747
|
-
*/
|
|
748
|
-
var messagesDataRef = useRef(messages);
|
|
749
|
-
messagesDataRef.current = messages;
|
|
750
|
-
var selectedSuggestionMessageIdsRef = useRef(selectedSuggestionMessageIds);
|
|
751
|
-
selectedSuggestionMessageIdsRef.current = selectedSuggestionMessageIds;
|
|
752
|
-
var handleSuggestionClick = useCallback(function (messageId, suggestion) {
|
|
753
|
-
if (!(suggestion !== null && suggestion !== void 0 && suggestion.trim())) return;
|
|
754
|
-
if (selectedSuggestionMessageIdsRef.current[messageId]) return;
|
|
755
|
-
var currentMessages = messagesDataRef.current;
|
|
756
|
-
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
757
|
-
event(EVENTS.aiChatSuggestedAnswer, {
|
|
758
|
-
agent_type: isMarketplaceGlobalAgent ? 'marketplace' : agent === null || agent === void 0 ? void 0 : agent.type
|
|
759
|
-
});
|
|
760
|
-
setSelectedSuggestionMessageIds(function (prev) {
|
|
761
|
-
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, messageId, true));
|
|
762
|
-
});
|
|
763
|
-
var targetMessage = currentMessages.find(function (msg) {
|
|
764
|
-
return msg.id === messageId;
|
|
765
|
-
});
|
|
766
|
-
var isRetrySuggestion = !!(targetMessage !== null && targetMessage !== void 0 && targetMessage.isError) && suggestion === t('chat.retry');
|
|
767
|
-
if (isRetrySuggestion) {
|
|
768
|
-
var _lastUserMessage = currentMessages.filter(function (msg) {
|
|
769
|
-
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
770
|
-
}).at(-1);
|
|
771
|
-
if (_lastUserMessage !== null && _lastUserMessage !== void 0 && _lastUserMessage.message) {
|
|
772
|
-
var retryAttachments = Array.isArray(_lastUserMessage.attachments) ? _lastUserMessage.attachments : Array.isArray(_lastUserMessage.sources) ? _lastUserMessage.sources : [];
|
|
773
|
-
sendMessageRef.current(_lastUserMessage.message, retryAttachments);
|
|
774
|
-
return;
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
sendMessageRef.current(suggestion);
|
|
778
|
-
}, [event, agent, t, authUser.id]);
|
|
779
593
|
useEffect(function () {
|
|
780
594
|
if (onSendMessageReadyRef.current) {
|
|
781
595
|
onSendMessageReadyRef.current(sendMessageProxyRef.current, stopGenerationProxyRef.current, waitingResponse, isWriting);
|
|
@@ -805,7 +619,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
805
619
|
// contra el último valor observado y ajusta solo cuando cambia. Así el
|
|
806
620
|
// scroll queda perfectamente sincronizado con la animación del texto sin
|
|
807
621
|
// depender de la cadencia del streamingStore.
|
|
808
|
-
// Con el turno anclado este loop solo encoge el spacer: no toca el scroll.
|
|
809
622
|
useEffect(function () {
|
|
810
623
|
if (!waitingResponse && !isWriting) return undefined;
|
|
811
624
|
if (!messagesRef.current) return undefined;
|
|
@@ -817,20 +630,13 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
817
630
|
rafId = null;
|
|
818
631
|
return;
|
|
819
632
|
}
|
|
820
|
-
if (syncTurnSpace()) {
|
|
821
|
-
// El scroll no se mueve, pero el contenido crece: la flecha y el
|
|
822
|
-
// gradiente de abajo tienen que encenderse apenas se pasa del viewport.
|
|
823
|
-
updateScrollAffordances();
|
|
824
|
-
rafId = requestAnimationFrame(_tick);
|
|
825
|
-
return;
|
|
826
|
-
}
|
|
827
633
|
var currentHeight = el.scrollHeight;
|
|
828
634
|
if (currentHeight !== lastHeight) {
|
|
829
635
|
lastHeight = currentHeight;
|
|
830
636
|
if (!userScrollingRef.current) {
|
|
831
637
|
el.scrollTop = currentHeight;
|
|
832
638
|
}
|
|
833
|
-
|
|
639
|
+
updateScrollBottomVisibility();
|
|
834
640
|
}
|
|
835
641
|
rafId = requestAnimationFrame(_tick);
|
|
836
642
|
};
|
|
@@ -838,43 +644,16 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
838
644
|
return function () {
|
|
839
645
|
if (rafId != null) cancelAnimationFrame(rafId);
|
|
840
646
|
};
|
|
841
|
-
}, [waitingResponse, isWriting,
|
|
647
|
+
}, [waitingResponse, isWriting, updateScrollBottomVisibility]);
|
|
842
648
|
|
|
843
649
|
// Al comenzar a esperar la respuesta del backend, scroll inicial al fondo.
|
|
844
650
|
useEffect(function () {
|
|
845
|
-
if (waitingResponse && messagesRef.current
|
|
651
|
+
if (waitingResponse && messagesRef.current) {
|
|
846
652
|
scrollToBottomRaf({
|
|
847
653
|
skipIfUserScrolling: true
|
|
848
654
|
});
|
|
849
655
|
}
|
|
850
656
|
}, [waitingResponse, scrollToBottomRaf]);
|
|
851
|
-
var lastReservedQuestionRef = useRef(null);
|
|
852
|
-
|
|
853
|
-
// Cambio de chat: el ancla y el spacer del turno anterior dejan de aplicar.
|
|
854
|
-
useEffect(function () {
|
|
855
|
-
if (!loadingMessages) return;
|
|
856
|
-
lastReservedQuestionRef.current = null;
|
|
857
|
-
clearTurnSpace();
|
|
858
|
-
}, [loadingMessages, clearTurnSpace]);
|
|
859
|
-
|
|
860
|
-
// Al enviar un mensaje: anclamos el turno y hacemos el único scroll del ciclo.
|
|
861
|
-
useEffect(function () {
|
|
862
|
-
if (loadingMessages || isLoadingMoreMessages) return;
|
|
863
|
-
var questionId = null;
|
|
864
|
-
for (var index = messages.length - 1; index >= 0; index -= 1) {
|
|
865
|
-
var _messages$index;
|
|
866
|
-
if ((_messages$index = messages[index]) !== null && _messages$index !== void 0 && (_messages$index = _messages$index.id) !== null && _messages$index !== void 0 && _messages$index.startsWith('question-')) {
|
|
867
|
-
questionId = messages[index].id;
|
|
868
|
-
break;
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
if (!questionId || questionId === lastReservedQuestionRef.current) return;
|
|
872
|
-
lastReservedQuestionRef.current = questionId;
|
|
873
|
-
userScrollingRef.current = false;
|
|
874
|
-
requestAnimationFrame(function () {
|
|
875
|
-
return reserveTurnSpace(questionId);
|
|
876
|
-
});
|
|
877
|
-
}, [messages, loadingMessages, isLoadingMoreMessages, reserveTurnSpace]);
|
|
878
657
|
|
|
879
658
|
// Scroll cuando cambian los mensajes: distingue "nuevo mensaje" (agregado)
|
|
880
659
|
// de "reemplazo" (mismo id/length, ej. feedback o approvalStatus). En
|
|
@@ -921,14 +700,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
921
700
|
lastMessagesLengthRef.current = messages.length;
|
|
922
701
|
var isNewMessage = lastId !== prevId || messages.length !== prevLen;
|
|
923
702
|
if (!isNewMessage) {
|
|
924
|
-
|
|
925
|
-
return;
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
// Turno anclado: ni el reemplazo del placeholder por el mensaje final, ni la
|
|
929
|
-
// aparición del ApprovalBox mueven el scroll. Solo se ajusta el spacer.
|
|
930
|
-
if (anchoredTurnIdRef.current) {
|
|
931
|
-
requestAnimationFrame(syncTurnSpace);
|
|
703
|
+
updateScrollBottomVisibility();
|
|
932
704
|
return;
|
|
933
705
|
}
|
|
934
706
|
var container = messagesRef.current;
|
|
@@ -939,6 +711,18 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
939
711
|
var isApproval = !!lastMessage && (lastMessage.id.startsWith('approval-') || !!lastMessage.approval);
|
|
940
712
|
var isAnswerOrQuestion = !!lastMessage && (lastMessage.id.startsWith('answer-') || lastMessage.id.startsWith('question-'));
|
|
941
713
|
|
|
714
|
+
// Approval: secuencia de scrolls con delay porque el ApprovalBox necesita
|
|
715
|
+
// un tick para medirse. Scrollea aunque el usuario no esté al fondo si no
|
|
716
|
+
// está scrolleando manualmente.
|
|
717
|
+
if (isApproval && (isAtBottom || !userScrollingRef.current)) {
|
|
718
|
+
scrollToBottomRaf();
|
|
719
|
+
scrollToBottomRaf();
|
|
720
|
+
scrollToBottomRaf({
|
|
721
|
+
delayMs: 100
|
|
722
|
+
});
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
|
|
942
726
|
// Nuevos answer/question: scroll si el usuario ya estaba al fondo.
|
|
943
727
|
if (isAnswerOrQuestion && isAtBottom) {
|
|
944
728
|
scrollToBottomRaf();
|
|
@@ -951,8 +735,8 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
951
735
|
scrollToBottomRaf();
|
|
952
736
|
return;
|
|
953
737
|
}
|
|
954
|
-
|
|
955
|
-
}, [messages, loadingMessages, isLoadingMoreMessages, scrollToBottomRaf,
|
|
738
|
+
updateScrollBottomVisibility();
|
|
739
|
+
}, [messages, loadingMessages, isLoadingMoreMessages, scrollToBottomRaf, updateScrollBottomVisibility]);
|
|
956
740
|
|
|
957
741
|
// Al abrir/cargar una conversación el contenedor se remonta (Loader → lista) con
|
|
958
742
|
// scrollTop=0. Forzamos ir al fondo al terminar loadMessages, sin afectar paginación hacia arriba.
|
|
@@ -971,13 +755,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
971
755
|
});
|
|
972
756
|
}, [loadingMessages, messages.length, scrollToBottomRaf]);
|
|
973
757
|
|
|
974
|
-
// Estado inicial del botón scroll-to-bottom al terminar loadingMessages.
|
|
975
|
-
useEffect(function () {
|
|
976
|
-
if (!loadingMessages) {
|
|
977
|
-
updateScrollAffordances();
|
|
978
|
-
}
|
|
979
|
-
}, [loadingMessages, messages.length, updateScrollAffordances]);
|
|
980
|
-
|
|
981
758
|
// Obtener el último mensaje del usuario para verificar si tiene attachments
|
|
982
759
|
var lastUserMessage = messages.filter(function (msg) {
|
|
983
760
|
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
@@ -995,6 +772,23 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
995
772
|
t: t
|
|
996
773
|
});
|
|
997
774
|
var isScrollOnParent = !!expanded;
|
|
775
|
+
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
776
|
+
useEffect(function () {
|
|
777
|
+
if (!initialChatId) {
|
|
778
|
+
pendingScrollRestoreRef.current = null;
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
var session = readMaiaPanelSession(authUser.id);
|
|
782
|
+
if ((session === null || session === void 0 ? void 0 : session.scrollSessionId) === initialChatId && typeof session.scrollTop === 'number' && session.scrollTop > 0) {
|
|
783
|
+
pendingScrollRestoreRef.current = session.scrollTop;
|
|
784
|
+
}
|
|
785
|
+
}, [authUser.id, initialChatId]);
|
|
786
|
+
useLayoutEffect(function () {
|
|
787
|
+
if (loadingMessages || pendingScrollRestoreRef.current == null || !messagesRef.current) return;
|
|
788
|
+
messagesRef.current.scrollTop = pendingScrollRestoreRef.current;
|
|
789
|
+
lastScrollTopRef.current = pendingScrollRestoreRef.current;
|
|
790
|
+
pendingScrollRestoreRef.current = null;
|
|
791
|
+
}, [loadingMessages, messages.length]);
|
|
998
792
|
|
|
999
793
|
// Al expandir/contraer el modal el ref pasa a otro contenedor (scrollTop se resetea a 0).
|
|
1000
794
|
// Restaurar la posición de scroll antes del paint para evitar que la conversación salte arriba.
|
|
@@ -1014,8 +808,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
1014
808
|
children: /*#__PURE__*/_jsx(Loader, {})
|
|
1015
809
|
});
|
|
1016
810
|
}
|
|
1017
|
-
var lastMessage = messages[messages.length - 1];
|
|
1018
|
-
var hasMessageLevelIndicator = !!lastMessage && isStreamingPlaceholderMessageId(lastMessage.id) && (waitingResponse || isWriting);
|
|
1019
811
|
var messagesContent = /*#__PURE__*/_jsxs(_Fragment, {
|
|
1020
812
|
children: [isLoadingMoreMessages && /*#__PURE__*/_jsx(LoadingText, {
|
|
1021
813
|
text: t('chat.loadingMore')
|
|
@@ -1042,7 +834,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
1042
834
|
authUser: authUser,
|
|
1043
835
|
handleSelectOption: handleSelectOption,
|
|
1044
836
|
handleFeedback: handleFeedback,
|
|
1045
|
-
handleApprovalDecision:
|
|
837
|
+
handleApprovalDecision: handleApprovalDecisionWithScroll,
|
|
1046
838
|
handleSuggestionClick: handleSuggestionClick,
|
|
1047
839
|
handleRetry: canRetry ? function () {
|
|
1048
840
|
return retryMessage(message);
|
|
@@ -1051,74 +843,41 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
1051
843
|
disableFeedback: messageFeedback,
|
|
1052
844
|
isStreaming: isStreaming,
|
|
1053
845
|
isLastMessage: isLastMessage,
|
|
1054
|
-
expanded: expanded
|
|
1055
|
-
streamActivity: isStreaming ? streamLoadingDisplay : null
|
|
846
|
+
expanded: expanded
|
|
1056
847
|
}));
|
|
1057
848
|
})
|
|
1058
|
-
}),
|
|
849
|
+
}), streamLoadingDisplay && /*#__PURE__*/_jsx(SCLoadingMessagesColumn, {
|
|
1059
850
|
children: /*#__PURE__*/_jsx(AgentActivityIndicator, {
|
|
1060
851
|
activity: streamLoadingDisplay
|
|
1061
852
|
})
|
|
1062
|
-
}), /*#__PURE__*/_jsx(SCTurnSpacer, {
|
|
1063
|
-
ref: spacerElRef,
|
|
1064
|
-
"aria-hidden": "true"
|
|
1065
853
|
})]
|
|
1066
854
|
});
|
|
1067
|
-
return (
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
children: [/*#__PURE__*/_jsx(SCMessagesGradientTop, {
|
|
1076
|
-
$show: showTopGradient,
|
|
1077
|
-
"aria-hidden": "true"
|
|
1078
|
-
}), isScrollOnParent ? /*#__PURE__*/_jsx(SCMessagesScroll, {
|
|
1079
|
-
ref: messagesRef,
|
|
1080
|
-
onScroll: handleScrollToBottom,
|
|
1081
|
-
children: /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
1082
|
-
$scrollOnParent: isScrollOnParent,
|
|
1083
|
-
children: messagesContent
|
|
1084
|
-
})
|
|
1085
|
-
}) : /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
1086
|
-
ref: messagesRef,
|
|
1087
|
-
onScroll: handleScrollToBottom,
|
|
1088
|
-
$scrollOnParent: false,
|
|
855
|
+
return /*#__PURE__*/_jsxs(SCMessagesOuter, {
|
|
856
|
+
$scrollOnParent: isScrollOnParent,
|
|
857
|
+
children: [isScrollOnParent ? /*#__PURE__*/_jsx(SCMessagesScroll, {
|
|
858
|
+
ref: messagesRef,
|
|
859
|
+
onScroll: handleScrollToBottom,
|
|
860
|
+
children: /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
861
|
+
$scrollOnParent: isScrollOnParent,
|
|
862
|
+
$isMarketplaceGlobal: isMarketplaceGlobalAgent,
|
|
1089
863
|
children: messagesContent
|
|
1090
|
-
})
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
width: 12,
|
|
1108
|
-
height: 12,
|
|
1109
|
-
fill: "none",
|
|
1110
|
-
children: /*#__PURE__*/_jsx("path", {
|
|
1111
|
-
stroke: "#202020",
|
|
1112
|
-
strokeLinecap: "round",
|
|
1113
|
-
strokeLinejoin: "round",
|
|
1114
|
-
strokeWidth: 1.5,
|
|
1115
|
-
d: "M6 .75v10.5M.75 6 6 11.25 11.25 6"
|
|
1116
|
-
})
|
|
1117
|
-
})
|
|
1118
|
-
})]
|
|
1119
|
-
})]
|
|
1120
|
-
})
|
|
1121
|
-
);
|
|
864
|
+
})
|
|
865
|
+
}) : /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
866
|
+
ref: messagesRef,
|
|
867
|
+
onScroll: handleScrollToBottom,
|
|
868
|
+
$scrollOnParent: false,
|
|
869
|
+
$isMarketplaceGlobal: isMarketplaceGlobalAgent,
|
|
870
|
+
children: messagesContent
|
|
871
|
+
}), showScrollToBottom && /*#__PURE__*/_jsx(ScrollToBottomButton, {
|
|
872
|
+
type: "button",
|
|
873
|
+
onClick: handleClickScrollToBottom,
|
|
874
|
+
children: /*#__PURE__*/_jsx(ArrowSmallDown, {
|
|
875
|
+
color: "#666",
|
|
876
|
+
width: "20px",
|
|
877
|
+
height: "20px"
|
|
878
|
+
})
|
|
879
|
+
})]
|
|
880
|
+
});
|
|
1122
881
|
};
|
|
1123
882
|
export var ChatAIMessages = /*#__PURE__*/React.memo(ChatAIMessagesInner);
|
|
1124
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiQXR0YWNobWVudENhcmQiLCJBcHByb3ZhbEJveCIsIkF0dGFjaG1lbnRQcmV2aWV3TW9kYWwiLCJBdHRhY2htZW50Q2FyZEF1ZGlvIiwiTWFpYVN0cmVhbWRvd24iLCJDaGF0SGlzdG9yeVJvbGUiLCJyZW5kZXJUZXh0V2l0aE1lbnRpb25zIiwiaGFzSW5saW5lTWFya2VycyIsImlzTWFpYWtlckFnZW50IiwidXNlVXNlciIsInVzZVQiLCJ1c2VDaGF0TWFuYWdlciIsInVzZVNtb290aFN0cmVhbVRleHQiLCJ1c2VTdHJlYW1pbmdNZXNzYWdlIiwiTG9hZGluZ1RleHQiLCJBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIiwiUmVhc29uaW5nQmxvY2siLCJzaG91bGRTdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lIiwiUmVhc29uaW5nVGltZWxpbmUiLCJTQ1RpbWVsaW5lSW5kaWNhdG9yIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsInJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSIsInJlc29sdmVSZXRyeVR1cm5JZCIsImZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IiwidXNlUmVhc29uaW5nVHJhY2UiLCJMb2FkZXIiLCJGYWRlIiwiTWVzc2FnZUZyb21Vc2VyIiwiTWVzc2FnZUZyb21PdGhlciIsIk1lc3NhZ2VDb250ZW50RnJvbVVzZXIiLCJNZXNzYWdlQ29udGVudEZyb21PdGhlciIsIk1lc3NhZ2VGZWVkYmFjayIsIlNDQ0FJTWVzc2FnZVdyYXBwZXIiLCJTY3JvbGxUb0JvdHRvbUJ1dHRvbiIsIlNDU2Nyb2xsSWNvblN3YXAiLCJTQ1dyaXRpbmdEb3RzIiwiU0NNZXNzYWdlc091dGVyIiwiU0NNZXNzYWdlc1Njcm9sbCIsIlNDTWVzc2FnZXNJbm5lciIsIlNDVHVyblNwYWNlciIsIlNDT3B0aW9uc0xpc3QiLCJTQ09wdGlvbkl0ZW0iLCJTQ01lc3NhZ2VJdGVtV3JhcHBlciIsIlNDTWVzc2FnZUl0ZW1Jbm5lciIsIlNDQXR0YWNobWVudHNSb3ciLCJTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbiIsIlNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uIiwiU0NNZXNzYWdlc0dyYWRpZW50VG9wIiwiU0NNZXNzYWdlc0dyYWRpZW50Qm90dG9tIiwiRmVlZGJhY2siLCJ1c2VHbG9iYWxDb250ZXh0IiwiRW50aXR5TGlua0N1c3RvbUxpbmsiLCJnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSIsIkNoYXRBSVN1Z2dlc3Rpb25zIiwiQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zIiwiRVZFTlRTIiwidXNlRXZlbnQiLCJkb3dubG9hZEZpbGVGcm9tVXJsIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwidHVybkFuY2hvck9mZnNldCIsInZpZXdwb3J0SGVpZ2h0IiwiTWF0aCIsIm1pbiIsIlRVUk5fU0NST0xMX0RVUkFUSU9OX01TIiwiVFVSTl9TQ1JPTExfTUFYX0RVUkFUSU9OX01TIiwiVFVSTl9TQ1JPTExfTE9OR19ESVNUQU5DRV9QWCIsIk1lc3NhZ2VXcmFwcGVyIiwiX3JlZiIsImlzQ3VycmVudFVzZXIiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiTWVzc2FnZUNvbXBvbmVudCIsIl9vYmplY3RTcHJlYWQiLCJNZXNzYWdlQ29udGVudFdyYXBwZXIiLCJfcmVmMiIsIl9leGNsdWRlZDIiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIk1lc3NhZ2VPcHRpb25zIiwiX3JlZjMiLCJvcHRpb25zIiwiaGFuZGxlU2VsZWN0T3B0aW9uIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5Iiwic2VsZWN0ZWRPcHRpb24iLCJzZXRTZWxlY3RlZE9wdGlvbiIsImhhbmRsZVNlbGVjdCIsIm9wdGlvbiIsIm1hcCIsIiRoYXNTZWxlY3Rpb24iLCIkZGltbWVkIiwiaWQiLCJvbkNsaWNrIiwibmFtZSIsIlN0cmVhbWluZ01lc3NhZ2VCb2R5IiwiX3Byb3BzJGNyZWF0ZUFnZW50Rm9sIiwiX3Byb3BzJHN1Z2dlc3Rpb25zIiwic3RyZWFtaW5nVGV4dCIsImlzU3RyZWFtaW5nIiwibWVzc2FnZUlkIiwicmF3VGV4dCIsIm1lc3NhZ2UiLCJ3aW5GbGFncyIsIndpbmRvdyIsImRpc3BsYXlUZXh0IiwiZW5hYmxlZCIsIm1heENoYXJzUGVyRnJhbWUiLCJzbmFwVG9Xb3JkQm91bmRhcnkiLCJzdHJlYW1MYWdNcyIsInRhcmdldExhZ01zIiwic3RyZWFtQWRhcHQiLCJhZGFwdFRvQmFja2VuZFJhdGUiLCJzdHJlYW1CdWZmZXJNcyIsInRhcmdldEJ1ZmZlck1zIiwic3RyZWFtTWluQnVmZmVyIiwibWluQnVmZmVyQ2hhcnMiLCJzdHJlYW1XYXJtdXBNcyIsIndhcm11cE1zIiwiY3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJhZ2VudElkIiwiaGFzTWVudGlvbnMiLCJtZW50aW9uTm9kZXMiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJkaXNwbGF5IiwidmFyaWFudCIsImNvbXBvbmVudHMiLCJhIiwiaXNBbmltYXRpbmciLCJpc0Fzc2lzdGFudCIsImlzRXJyb3IiLCJhcHByb3ZhbCIsIm9uUmV0cnkiLCJjb250ZW50Iiwic291cmNlcyIsInVuZGVmaW5lZCIsImhhbmRsZUZlZWRiYWNrIiwiaGFuZGxlRmVlZGJhY2tDbGljayIsImRpc2FibGVGZWVkYmFjayIsInN1Z2dlc3Rpb25zIiwibGVuZ3RoIiwib25TZWxlY3RTdWdnZXN0aW9uIiwic3VnZ2VzdGlvbiIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsImRpc2FibGVkIiwic3VnZ2VzdGlvbnNEaXNhYmxlZCIsImhpZGRlbiIsImlzTGFzdE1lc3NhZ2UiLCJNZXNzYWdlSXRlbSIsIl9wcm9wcyRyZWFzb25pbmciLCJfcHJvcHMkcHJvamVjdE1ldGFkYXQiLCJ1c2VyIiwiYXV0aFVzZXIiLCJpc0NoYW5nZVByb2plY3QiLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uIiwiaGFuZGxlUmV0cnkiLCJyb2xlIiwiYXR0YWNobWVudHMiLCJhcHByb3ZhbFN0YXR1cyIsImhhc1NlbGVjdGVkU3VnZ2VzdGlvbiIsInN0cmVhbUFjdGl2aXR5IiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJwcmV2aWV3QXR0YWNobWVudCIsInNldFByZXZpZXdBdHRhY2htZW50IiwiVVNFUiIsInRvU3RyaW5nIiwiQVNTSVNUQU5UIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImlzQWN0aXZlU3RyZWFtaW5nIiwiaGFzU3RyZWFtVGV4dCIsIkJvb2xlYW4iLCJyZWFzb25pbmdUcmFjZSIsInN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUiLCJzdGVwcyIsInNob3dTdHJlYW1pbmdCb2R5Iiwic2hvd0FjdGl2aXR5SW5kaWNhdG9yIiwibWVzc2FnZUF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiaGFuZGxlQXR0YWNobWVudENsaWNrIiwiYXR0YWNobWVudCIsImZpbGUiLCJGaWxlIiwib3JpZ2luYWxGaWxlIiwidXJsX3RodW1ibmFpbCIsInVybF9vcmlnaW5hbCIsInVybF9maWxlIiwiaGFuZGxlQ2xvc2VQcmV2aWV3IiwiaGFuZGxlQXR0YWNobWVudERvd25sb2FkIiwiX3JlZjQiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImV4dGVuc2lvbiIsImZpbGVOYW1lIiwiZmlsZVVybCIsImJsb2JVcmwiLCJkb3dubG9hZGVkRmlsZSIsImxpbmsiLCJfdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiaW5jbHVkZXMiLCJjb25jYXQiLCJ0eXBlIiwic2VudCIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImFicnVwdCIsImRvY3VtZW50IiwiaHJlZiIsImRvd25sb2FkIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY2xpY2siLCJzZXRUaW1lb3V0IiwicmVtb3ZlQ2hpbGQiLCJyZXZva2VPYmplY3RVUkwiLCJjb25zb2xlIiwiZXJyb3IiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsImhhc0ZlZWRiYWNrIiwiJGlzQXNzaXN0YW50IiwibWVzc2FnZUV4dHJhQ29udGVudCIsImZlZWRiYWNrIiwic2Vzc2lvbklkIiwic3BsaXQiLCJmaWx0ZXIiLCJxdWVzdGlvbklkIiwiam9pbiIsInRyYWNlIiwicmVhc29uaW5nIiwiaW5kZXgiLCJfYXR0YWNobWVudCR0eXBlIiwiX2F0dGFjaG1lbnQkbmFtZSIsImF0dGFjaG1lbnRUeXBlIiwidG9Mb3dlckNhc2UiLCJhdHRhY2htZW50TmFtZSIsImlzQXVkaW9GaWxlIiwic3RhcnRzV2l0aCIsInNvbWUiLCJleHQiLCJlbmRzV2l0aCIsInBvc2l0aW9uSW5kZXgiLCJvbkRvd25sb2FkIiwiYWN0aXZpdHkiLCJjb21wYWN0IiwicGVuZGluZ19hY3Rpb25zIiwiYWN0aW9ucyIsInN0YXR1cyIsIm9uQXBwcm92ZSIsInRocmVhZElkcyIsIm9uUmVqZWN0IiwiaXNQcm9qZWN0RGVsZXRlZCIsInByb2plY3RNZXRhZGF0YSIsImlzX2RlbGV0ZWQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kZWQiLCJoaXRsSW5zdGFuY2VJZCIsIm9yaWdpbmFsX3RocmVhZF9pZCIsIndhcm5pbmdNZXNzYWdlIiwid2FybmluZ19tZXNzYWdlIiwibWFudWFsQXBwcm92YWxEZXRlY3RlZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsImlzT3BlbiIsIm9uQ2xvc2UiLCJDaGF0QUlNZXNzYWdlc0lubmVyIiwiX3JlZjUiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJpbml0aWFsQ2hhdElkIiwib25FcnJvciIsIm9uU2VuZE1lc3NhZ2VSZWFkeSIsIm9uU2Nyb2xsVG9Cb3R0b20iLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiYWdlbnQiLCJldmVudCIsIm1lc3NhZ2VzUmVmIiwiY2hhdEluaXRpYWxpemVkUmVmIiwiaXNMb2FkaW5nTW9yZVJlZiIsInVzZXJTY3JvbGxpbmdSZWYiLCJzY3JvbGxUaHJlc2hvbGRSZWYiLCJsYXN0U2Nyb2xsVG9wUmVmIiwic2hvd1Njcm9sbFRvQm90dG9tUmVmIiwic2hvd1RvcEdyYWRpZW50UmVmIiwic2hvd0JvdHRvbUdyYWRpZW50UmVmIiwic2Nyb2xsUmFmUmVmIiwiYW5jaG9yZWRUdXJuSWRSZWYiLCJzcGFjZXJFbFJlZiIsInNwYWNlckhlaWdodFJlZiIsInR1cm5TY3JvbGxSYWZSZWYiLCJ3YXNMb2FkaW5nTWVzc2FnZXNSZWYiLCJsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93U2Nyb2xsVG9Cb3R0b20iLCJzZXRTaG93U2Nyb2xsVG9Cb3R0b20iLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNob3dUb3BHcmFkaWVudCIsInNldFNob3dUb3BHcmFkaWVudCIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2hvd0JvdHRvbUdyYWRpZW50Iiwic2V0U2hvd0JvdHRvbUdyYWRpZW50IiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwic2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyIsInNldFNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMiLCJfdXNlQ2hhdE1hbmFnZXIiLCJjaGF0SWQiLCJtZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsIndhaXRpbmdSZXNwb25zZSIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwiYWN0aXZlTG9hZGluZ3MiLCJzZW5kTWVzc2FnZSIsInJldHJ5TWVzc2FnZSIsImNoYW5nZVByb2plY3QiLCJpbml0aWFsaXplQ2hhdCIsImhhbmRsZVNjcm9sbCIsInN0b3BHZW5lcmF0aW9uIiwidXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMiLCJlbCIsImN1cnJlbnQiLCJzY3JvbGxUb3AiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJkaXN0YW5jZUZyb21Cb3R0b20iLCJzaG91bGRTaG93IiwibmV4dFRvcEdyYWRpZW50IiwibmV4dEJvdHRvbUdyYWRpZW50Iiwic2Nyb2xsVG9Cb3R0b21SYWYiLCJvcHRzIiwiX29wdHMkc2tpcElmVXNlclNjcm9sIiwic2tpcElmVXNlclNjcm9sbGluZyIsIl9vcHRzJGRlbGF5TXMiLCJkZWxheU1zIiwicnVuIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2FuY2VsVHVyblNjcm9sbCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZVNjcm9sbFRvIiwidG9wIiwiZnJvbSIsImRpc3RhbmNlIiwiYWJzIiwiZHVyYXRpb24iLCJzdGFydGVkQXQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInN0ZXAiLCJwcm9ncmVzcyIsImVhc2VkIiwicG93Iiwic2V0U3BhY2VySGVpZ2h0IiwiaGVpZ2h0IiwiY2xlYXJUdXJuU3BhY2UiLCJkcmFpblR1cm5TcGFjZSIsInJlbW92YWJsZSIsIm1heCIsInJlbGVhc2VUdXJuU3BhY2UiLCJoYW5kbGVVc2VyU2Nyb2xsSW50ZW50IiwibWVhc3VyZVR1cm4iLCJzcGFjZXJFbCIsInF1ZXN0aW9uRWwiLCJxdWVyeVNlbGVjdG9yIiwiY29udGFpbmVyVG9wIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicXVlc3Rpb25Ub3AiLCJjb250ZW50Qm90dG9tIiwidHVybkhlaWdodCIsInJlc2VydmVUdXJuU3BhY2UiLCJtZWFzdXJlZCIsIm9mZnNldCIsInRhcmdldFNjcm9sbFRvcCIsInN5bmNUdXJuU3BhY2UiLCJyZXNlcnZlZCIsImhhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b20iLCJoYW5kbGVTY3JvbGxUb0JvdHRvbSIsImUiLCJjb250YWluZXIiLCJjdXJyZW50VGFyZ2V0IiwiaXNTY3JvbGxpbmdVcCIsImlzTmVhckJvdHRvbSIsInNlbmRNZXNzYWdlUmVmIiwic3RvcEdlbmVyYXRpb25SZWYiLCJvblNlbmRNZXNzYWdlUmVhZHlSZWYiLCJzZW5kTWVzc2FnZVByb3h5UmVmIiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIm1lbnRpb25zIiwiZnVhSWQiLCJzY0lkIiwic3RvcEdlbmVyYXRpb25Qcm94eVJlZiIsIm1lc3NhZ2VzRGF0YVJlZiIsInNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNSZWYiLCJ0cmltIiwiY3VycmVudE1lc3NhZ2VzIiwiaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50IiwiYWlDaGF0U3VnZ2VzdGVkQW5zd2VyIiwiYWdlbnRfdHlwZSIsIl9kZWZpbmVQcm9wZXJ0eSIsInRhcmdldE1lc3NhZ2UiLCJmaW5kIiwibXNnIiwiaXNSZXRyeVN1Z2dlc3Rpb24iLCJsYXN0VXNlck1lc3NhZ2UiLCJhdCIsInJldHJ5QXR0YWNobWVudHMiLCJyYWZJZCIsImxhc3RIZWlnaHQiLCJ0aWNrIiwiY3VycmVudEhlaWdodCIsImxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmIiwiX21lc3NhZ2VzJGluZGV4IiwibGFzdE1lc3NhZ2VJZFJlZiIsImxhc3RNZXNzYWdlc0xlbmd0aFJlZiIsIl9tZXNzYWdlcyRpZCIsIl9tZXNzYWdlcyIsIl9sYXN0TWVzc2FnZSRpZCIsImxhc3RNZXNzYWdlIiwibGFzdElkIiwicHJldklkIiwicHJldkxlbiIsImlzTmV3TWVzc2FnZSIsImlzQXRCb3R0b20iLCJoYXNJbml0aWFsTWVzc2FnZSIsImlzQXBwcm92YWwiLCJpc0Fuc3dlck9yUXVlc3Rpb24iLCJfbWVzc2FnZXMkaWQyIiwiX21lc3NhZ2VzMiIsImp1c3RGaW5pc2hlZExvYWRpbmciLCJhdHRhY2htZW50c0NvdW50Iiwic3RyZWFtTG9hZGluZ0Rpc3BsYXkiLCJoYXNBdHRhY2htZW50cyIsImlzU2Nyb2xsT25QYXJlbnQiLCJleHBhbmRlZFJlZiIsInNhdmVkU2Nyb2xsVG9wIiwiZmlsbCIsImhhc01lc3NhZ2VMZXZlbEluZGljYXRvciIsIm1lc3NhZ2VzQ29udGVudCIsInRleHQiLCJfbWVzc2FnZSRhdHRhY2htZW50cyIsIl9tZXNzYWdlJHNvdXJjZXMiLCJfbWVzc2FnZSRwcm9qZWN0IiwiX21lc3NhZ2UkaWQiLCJpc0Fzc2lzdGFudE1lc3NhZ2UiLCJwcm9qZWN0IiwibWVzc2FnZUZlZWRiYWNrIiwid2FzSGVscGZ1bCIsIlRIVU1CU19VUCIsIlRIVU1CU19ET1dOIiwibWVzc2FnZUtleSIsInR1cm5JZCIsInVzZXJNZXNzYWdlRm9yUmV0cnkiLCJjYW5SZXRyeSIsImlzX2NhbmNlbGxlZCIsImtleSIsInJlZiIsIiRzY3JvbGxPblBhcmVudCIsIm9uV2hlZWwiLCJvblRvdWNoU3RhcnQiLCIkc2hvdyIsIm9uU2Nyb2xsIiwiJHZpc2libGUiLCJ4bWxucyIsIndpZHRoIiwic3Ryb2tlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwiQ2hhdEFJTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5zdGFibGUtbmVzdGVkLWNvbXBvbmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3cgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wcyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgUmVhY3QsIHsgRkMsIG1lbW8sIFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmQnXG5pbXBvcnQgeyBBcHByb3ZhbEJveCB9IGZyb20gJy4uLy4uL2F0b21zL0FwcHJvdmFsQm94L0FwcHJvdmFsQm94J1xuaW1wb3J0IHsgQXR0YWNobWVudFByZXZpZXdNb2RhbCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwnXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZEF1ZGlvIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmRBdWRpbydcbmltcG9ydCB7IE1haWFTdHJlYW1kb3duIH0gZnJvbSAnLi4vLi4vYXRvbXMvTWFpYVN0cmVhbWRvd24nXG5pbXBvcnQgdHlwZSB7IE1haWFTdHJlYW1kb3duUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NYWlhU3RyZWFtZG93bidcbmltcG9ydCB7IE1BSUFNZXNzYWdlUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBTWVzc2FnZS9NQUlBTWVzc2FnZS5pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRIaXN0b3J5Um9sZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyByZW5kZXJUZXh0V2l0aE1lbnRpb25zLCBoYXNJbmxpbmVNYXJrZXJzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zJ1xuXG5pbXBvcnQgeyBpc01haWFrZXJBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FnZW50RGlzcGxheU5hbWUnXG5pbXBvcnQgeyBDT1JVc2VyLCB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcblxuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVQnXG5pbXBvcnQgeyB1c2VDaGF0TWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlU21vb3RoU3RyZWFtVGV4dCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNtb290aFN0cmVhbVRleHQnXG5pbXBvcnQgeyB1c2VTdHJlYW1pbmdNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtaW5nTWVzc2FnZSdcblxuaW1wb3J0IHsgTG9hZGluZ1RleHQgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkaW5nVGV4dCdcbmltcG9ydCB7IEFnZW50QWN0aXZpdHlJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9BZ2VudEFjdGl2aXR5SW5kaWNhdG9yJ1xuaW1wb3J0IHsgUmVhc29uaW5nQmxvY2sgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdCbG9jaydcbmltcG9ydCB7IHNob3VsZFN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9yZWFzb25pbmdMaXZlTmFycmF0aW9uJ1xuaW1wb3J0IHsgUmVhc29uaW5nVGltZWxpbmUgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdUaW1lbGluZSdcbmltcG9ydCB7IFNDVGltZWxpbmVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdCbG9jay5zdHlsZXMnXG5pbXBvcnQgdHlwZSB7IFN0cmVhbUFjdGl2aXR5IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvc3RyZWFtQWN0aXZpdHknXG5pbXBvcnQgeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkLCByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgcmVzb2x2ZVJldHJ5VHVybklkLCBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3JldHJ5Q29tcGxldGlvbidcbmltcG9ydCB7IHVzZVJlYXNvbmluZ1RyYWNlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkZXInXG5pbXBvcnQgeyBGYWRlIH0gZnJvbSAnLi4vLi4vYXRvbXMvRmFkZSdcblxuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1Byb2plY3QnXG5cbmltcG9ydCB7IE1lc3NhZ2VGcm9tVXNlciwgTWVzc2FnZUZyb21PdGhlciwgTWVzc2FnZUNvbnRlbnRGcm9tVXNlciwgTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXIgfSBmcm9tICcuL3N0eWxlcydcbmltcG9ydCB7IE1lc3NhZ2VGZWVkYmFjayB9IGZyb20gJy4uL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7XG4gIFNDQ0FJTWVzc2FnZVdyYXBwZXIsXG4gIFNjcm9sbFRvQm90dG9tQnV0dG9uLFxuICBTQ1Njcm9sbEljb25Td2FwLFxuICBTQ1dyaXRpbmdEb3RzLFxuICBTQ01lc3NhZ2VzT3V0ZXIsXG4gIFNDTWVzc2FnZXNTY3JvbGwsXG4gIFNDTWVzc2FnZXNJbm5lcixcbiAgU0NUdXJuU3BhY2VyLFxuICBTQ09wdGlvbnNMaXN0LFxuICBTQ09wdGlvbkl0ZW0sXG4gIFNDTWVzc2FnZUl0ZW1XcmFwcGVyLFxuICBTQ01lc3NhZ2VJdGVtSW5uZXIsXG4gIFNDQXR0YWNobWVudHNSb3csXG4gIFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uLFxuICBTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbixcbiAgU0NNZXNzYWdlc0dyYWRpZW50VG9wLFxuICBTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20sXG59IGZyb20gJy4vbmV3U3R5bGVzJ1xuaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgQXR0YWNobWVudEZpbGUgfSBmcm9tICcuLi9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgRW50aXR5TGlua0N1c3RvbUxpbmssIGdldEVudGl0eUxpbmtXcmFwcGVyQ2xhc3NOYW1lIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZW50aXR5TGlua1JlbmRlcidcbmltcG9ydCB7IENoYXRBSVN1Z2dlc3Rpb25zIH0gZnJvbSAnLi9DaGF0QUlTdWdnZXN0aW9ucydcbmltcG9ydCB7IENoYXRBSUNyZWF0ZUFnZW50QWN0aW9ucyB9IGZyb20gJy4vQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zJ1xuaW1wb3J0IHsgRVZFTlRTLCB1c2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50J1xuaW1wb3J0IHsgZG93bmxvYWRGaWxlRnJvbVVybCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ZpbGVEb3dubG9hZEhlbHBlcidcblxudHlwZSBDaGF0QUlNZXNzYWdlc1Byb3BzID0ge1xuICB1c2VySW5pdGlhbE1lc3NhZ2U6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICAgIGZhcUlkPzogc3RyaW5nXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW11cbiAgICBmdWFJZD86IHN0cmluZ1xuICAgIHNjSWQ/OiBzdHJpbmdcbiAgfVxuICBpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsXG4gIG9uRXJyb3I6ICgpID0+IHZvaWRcbiAgb25TZW5kTWVzc2FnZVJlYWR5PzogKFxuICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiB2b2lkLFxuICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgIGlzU3RyZWFtaW5nOiBib29sZWFuLFxuICAgIGlzV3JpdGluZzogYm9vbGVhblxuICApID0+IHZvaWRcbiAgaXNEaXNhYmxlZD86IGJvb2xlYW5cbiAgb25TY3JvbGxUb0JvdHRvbT86ICgpID0+IHZvaWRcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGFnZW50cz86IEFnZW50W11cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG59XG5cbi8qKlxuICogQWwgYW5jbGFyIGVsIHR1cm5vLCBsYSBwcmVndW50YSBubyBzZSBwZWdhIGFsIGJvcmRlIHN1cGVyaW9yOiBkZWphbW9zIGFzb21hclxuICogbGEgY29sYSBkZWwgbWVuc2FqZSBhbnRlcmlvciBwYXJhIG5vIHBlcmRlciBlbCBoaWxvIGRlIGxhIGNvbnZlcnNhY2nDs24uXG4gKiBSZWxhdGl2byBhbCB2aWV3cG9ydCBwb3JxdWUgdW4gdmFsb3IgZmlqbyBzZSBjb21lIGRlbWFzaWFkbyBlbiBwYW50YWxsYXMgY29ydGFzLlxuICovXG5jb25zdCB0dXJuQW5jaG9yT2Zmc2V0ID0gKHZpZXdwb3J0SGVpZ2h0OiBudW1iZXIpOiBudW1iZXIgPT4gTWF0aC5taW4odmlld3BvcnRIZWlnaHQgKiAwLjE4LCAyMDApXG5cbi8qKlxuICogRHVyYWNpw7NuIGRlbCBzY3JvbGwgYW5pbWFkbzogYmFzZSB5IHRvcGUgcGFyYSByZWNvcnJpZG9zIGxhcmdvcywgcGFyYSBxdWUgdW5cbiAqIHNhbHRvIGRlIHZhcmlhcyBwYW50YWxsYXMgbm8gc2Ugc2llbnRhIHVuIGxhdGlnYXpvLlxuICovXG5jb25zdCBUVVJOX1NDUk9MTF9EVVJBVElPTl9NUyA9IDYwMFxuY29uc3QgVFVSTl9TQ1JPTExfTUFYX0RVUkFUSU9OX01TID0gODAwXG5cbi8qKiBEaXN0YW5jaWEgYSBwYXJ0aXIgZGUgbGEgY3VhbCBsYSBkdXJhY2nDs24geWEgZXN0w6EgZW4gc3UgdG9wZS4gKi9cbmNvbnN0IFRVUk5fU0NST0xMX0xPTkdfRElTVEFOQ0VfUFggPSAxMjAwXG5cbnR5cGUgTWVzc2FnZUl0ZW1Qcm9wcyA9IENoYXRNZXNzYWdlICYge1xuICBhdXRoVXNlcjogQ09SVXNlclxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbiAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiAobWVzc2FnZUlkOiBzdHJpbmcsIHN1Z2dlc3Rpb246IHN0cmluZykgPT4gdm9pZFxuICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb24/OiBib29sZWFuXG4gIGhhbmRsZUZlZWRiYWNrOiAoZmVlZGJhY2s6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbjogKHRocmVhZElkczogc3RyaW5nW10sIGRlY2lzaW9uOiAnYXBwcm92ZScgfCAncmVqZWN0JykgPT4gdm9pZFxuICBoYW5kbGVSZXRyeT86ICgpID0+IHZvaWRcbiAgZGlzYWJsZUZlZWRiYWNrPzogRmVlZGJhY2sgfCBudWxsXG4gIHNvdXJjZXM/OiBhbnlcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhblxuICBpc0xhc3RNZXNzYWdlPzogYm9vbGVhblxuICBleHBhbmRlZD86IGJvb2xlYW5cbiAgc3RyZWFtQWN0aXZpdHk/OiBTdHJlYW1BY3Rpdml0eSB8IG51bGxcbn1cblxuaW50ZXJmYWNlIE1lc3NhZ2VXcmFwcGVyUHJvcHMge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgJ2RhdGEtbWVzc2FnZS1pZCc/OiBzdHJpbmdcbiAgaGFzRmVlZGJhY2s/OiBib29sZWFuXG59XG5cbnR5cGUgTWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHMgPSBNQUlBTWVzc2FnZVByb3BzICYge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGlzRXJyb3I/OiBib29sZWFuXG4gIGlzQ2hhbmdlUHJvamVjdD86IGJvb2xlYW5cbn1cblxuY29uc3QgTWVzc2FnZVdyYXBwZXI6IEZDPE1lc3NhZ2VXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgY2hpbGRyZW4sIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlRnJvbVVzZXIgOiBNZXNzYWdlRnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L01lc3NhZ2VDb21wb25lbnQ+XG59XG5cbmNvbnN0IE1lc3NhZ2VDb250ZW50V3JhcHBlcjogRkM8TWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgLi4ucHJvcHMgfSkgPT4ge1xuICBjb25zdCBNZXNzYWdlQ29udGVudENvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlQ29udGVudEZyb21Vc2VyIDogTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXJcbiAgcmV0dXJuIDxNZXNzYWdlQ29udGVudENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIE1lc3NhZ2VPcHRpb25zKHtcbiAgb3B0aW9ucyxcbiAgaGFuZGxlU2VsZWN0T3B0aW9uLFxufToge1xuICBvcHRpb25zOiBQcm9qZWN0W10gfCBudWxsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbjogKG9wdGlvbjogUHJvamVjdCkgPT4gdm9pZFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFByb2plY3QgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHJldHVyblxuICAgIHNldFNlbGVjdGVkT3B0aW9uKG9wdGlvbilcbiAgICBoYW5kbGVTZWxlY3RPcHRpb24ob3B0aW9uKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U0NPcHRpb25zTGlzdD5cbiAgICAgIHsob3B0aW9ucyB8fCBbXSkubWFwKG9wdGlvbiA9PiAoXG4gICAgICAgIDxTQ09wdGlvbkl0ZW1cbiAgICAgICAgICAkaGFzU2VsZWN0aW9uPXshIXNlbGVjdGVkT3B0aW9ufVxuICAgICAgICAgICRkaW1tZWQ9eyEhc2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb24/LmlkICE9PSBvcHRpb24uaWR9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlU2VsZWN0KG9wdGlvbil9XG4gICAgICAgICAga2V5PXtvcHRpb24uaWR9XG4gICAgICAgID5cbiAgICAgICAgICB7b3B0aW9uLm5hbWV9XG4gICAgICAgIDwvU0NPcHRpb25JdGVtPlxuICAgICAgKSl9XG4gICAgPC9TQ09wdGlvbnNMaXN0PlxuICApXG59XG5cbi8qKiBTb2xvIGVzdGUgY29tcG9uZW50ZSByZS1yZW5kZXJpemEgY3VhbmRvIGNhbWJpYSBlbCB0ZXh0byBlbiBzdHJlYW1pbmcgKGxlZSBkZWwgY29udGV4dCkuICovXG5jb25zdCBTdHJlYW1pbmdNZXNzYWdlQm9keSA9IG1lbW8oXG4gIChwcm9wczoge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGlzU3RyZWFtaW5nOiBib29sZWFuXG4gICAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICAgIGlzQXNzaXN0YW50OiBib29sZWFuXG4gICAgaXNGcm9udGVuZENhbmNlbGxlZD86IGJvb2xlYW5cbiAgICBhcHByb3ZhbD86IE1lc3NhZ2VJdGVtUHJvcHNbJ2FwcHJvdmFsJ11cbiAgICBpc0Vycm9yPzogYm9vbGVhblxuICAgIHNvdXJjZXM/OiBNZXNzYWdlSXRlbVByb3BzWydzb3VyY2VzJ11cbiAgICBzdWdnZXN0aW9ucz86IHN0cmluZ1tdIHwgbnVsbFxuICAgIGNyZWF0ZUFnZW50Rm9sbG93VXA/OiB7IGFnZW50SWQ6IHN0cmluZyB9IHwgbnVsbFxuICAgIGhhbmRsZUZlZWRiYWNrQ2xpY2s6IChmOiBGZWVkYmFjaykgPT4gdm9pZFxuICAgIGRpc2FibGVGZWVkYmFjazogRmVlZGJhY2sgfCBudWxsXG4gICAgb25SZXRyeT86ICgpID0+IHZvaWRcbiAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s6IChtZXNzYWdlSWQ6IHN0cmluZywgc3VnZ2VzdGlvbjogc3RyaW5nKSA9PiB2b2lkXG4gICAgc3VnZ2VzdGlvbnNEaXNhYmxlZD86IGJvb2xlYW5cbiAgICBtZXNzYWdlSWQ6IHN0cmluZ1xuICAgIGlzTGFzdE1lc3NhZ2U/OiBib29sZWFuXG4gIH0pID0+IHtcbiAgICAvLyBUZXh0byBkZWwgc3RyZWFtOiBzb2xvIHNlIGxlZSBkZWwgc3RvcmUgY3VhbmRvIGVzdGUgbWVuc2FqZSBlcyBlbFxuICAgIC8vIHF1ZSBlc3TDoSBlbiBzdHJlYW1pbmcuIHVzZVN5bmNFeHRlcm5hbFN0b3JlIGHDrXNsYSBlbCByZS1yZW5kZXIgYVxuICAgIC8vIGVzdGUgY29tcG9uZW50ZSwgc2luIHRvY2FyIGVsIHJlc3RvIGRlbCDDoXJib2wuXG4gICAgY29uc3Qgc3RyZWFtaW5nVGV4dCA9IHVzZVN0cmVhbWluZ01lc3NhZ2UocHJvcHMuaXNTdHJlYW1pbmcgPyBwcm9wcy5tZXNzYWdlSWQgOiBudWxsKVxuICAgIGNvbnN0IHJhd1RleHQgPSBwcm9wcy5pc1N0cmVhbWluZyA/IHN0cmVhbWluZ1RleHQgOiBwcm9wcy5tZXNzYWdlXG4gICAgLy8gU21vb3RoIHN0cmVhbWluZzogZGVzYWNvcGxhIGxhIGNhZGVuY2lhIGRlbCBiYWNrZW5kIGRlbCByZW5kZXIuXG4gICAgLy8gRHVyYW50ZSBlbCBzdHJlYW1pbmcgbGliZXJhIGNoYXJzIGEgcml0bW8gY29uc3RhbnRlIHbDrWEgckFGOyBjdWFuZG9cbiAgICAvLyB0ZXJtaW5hLCBtdWVzdHJhIGVsIHRleHRvIGZpbmFsIGFsIGluc3RhbnRlIChzaW4gYW5pbWFjacOzbiByZXNpZHVhbCkuXG4gICAgLy8gTG9zIGRlZmF1bHRzIGRlbCBob29rIHNlIGFqdXN0YXJvbiBlbXDDrXJpY2FtZW50ZSBlbiBzdGFnaW5nOyBhdW4gYXPDrVxuICAgIC8vIHNlIGV4cG9uZW4gZmxhZ3MgZGUgcnVudGltZSAod2luZG93LiopIHBhcmEgcG9kZXIgdHVuZWFyIHNpbiByZWNvbXBpbGFyXG4gICAgLy8gc2kgYWxnw7puIGJhY2tlbmQgcHJlc2VudGEgdW5hIGNhZGVuY2lhIG11eSBkaXN0aW50YSBlbiBwcm9kdWNjacOzbi5cbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1BZGFwdCA9IGZhbHNlICAgICAgLy8gZGVzYWN0aXZhIGFkYXB0YWNpw7NuIGFsIGJhY2tlbmRcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1CdWZmZXJNcyA9IDYwMCAgICAgLy8gY29sY2jDs24gb2JqZXRpdm8gKG1zKVxuICAgIC8vICAgd2luZG93LnN0cmVhbUxhZ01zID0gNDUwICAgICAgICAvLyBsYWcgbcOheGltbyBiYXNlIChtcylcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1NaW5CdWZmZXIgPSA3MCAgICAgLy8gcGlzbyBkZWwgY29sY2jDs24gZW4gY2hhcnNcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1XYXJtdXBNcyA9IDQwMCAgICAgLy8gd2FybXVwIGluaWNpYWwgKG1zKVxuICAgIGNvbnN0IHdpbkZsYWdzID1cbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gKHdpbmRvdyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIHN0cmVhbUFkYXB0PzogYm9vbGVhblxuICAgICAgICAgICAgc3RyZWFtQnVmZmVyTXM/OiBudW1iZXJcbiAgICAgICAgICAgIHN0cmVhbUxhZ01zPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1NaW5CdWZmZXI/OiBudW1iZXJcbiAgICAgICAgICAgIHN0cmVhbVdhcm11cE1zPzogbnVtYmVyXG4gICAgICAgICAgfSlcbiAgICAgICAgOiB7fVxuICAgIGNvbnN0IGRpc3BsYXlUZXh0ID0gdXNlU21vb3RoU3RyZWFtVGV4dChyYXdUZXh0LCB7XG4gICAgICBlbmFibGVkOiAhIXByb3BzLmlzU3RyZWFtaW5nLFxuICAgICAgbWF4Q2hhcnNQZXJGcmFtZTogMjQsXG4gICAgICBzbmFwVG9Xb3JkQm91bmRhcnk6IHRydWUsXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtTGFnTXMgIT0gbnVsbCAmJiB7IHRhcmdldExhZ01zOiB3aW5GbGFncy5zdHJlYW1MYWdNcyB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1BZGFwdCAhPSBudWxsICYmIHsgYWRhcHRUb0JhY2tlbmRSYXRlOiB3aW5GbGFncy5zdHJlYW1BZGFwdCB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1CdWZmZXJNcyAhPSBudWxsICYmIHsgdGFyZ2V0QnVmZmVyTXM6IHdpbkZsYWdzLnN0cmVhbUJ1ZmZlck1zIH0pLFxuICAgICAgLi4uKHdpbkZsYWdzLnN0cmVhbU1pbkJ1ZmZlciAhPSBudWxsICYmIHsgbWluQnVmZmVyQ2hhcnM6IHdpbkZsYWdzLnN0cmVhbU1pbkJ1ZmZlciB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1XYXJtdXBNcyAhPSBudWxsICYmIHsgd2FybXVwTXM6IHdpbkZsYWdzLnN0cmVhbVdhcm11cE1zIH0pLFxuICAgIH0pXG4gICAgY29uc3QgY3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCA9IHByb3BzLmNyZWF0ZUFnZW50Rm9sbG93VXA/LmFnZW50SWRcblxuICAgIGlmICghZGlzcGxheVRleHQgJiYgIXByb3BzLmlzU3RyZWFtaW5nKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGhhc01lbnRpb25zID0gaGFzSW5saW5lTWFya2VycyhkaXNwbGF5VGV4dClcbiAgICBjb25zdCBtZW50aW9uTm9kZXMgPSBoYXNNZW50aW9ucyA/IHJlbmRlclRleHRXaXRoTWVudGlvbnMoZGlzcGxheVRleHQpIDogbnVsbFxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8U0NDQUlNZXNzYWdlV3JhcHBlclxuICAgICAgICAgIGlzQ3VycmVudFVzZXI9e3Byb3BzLmlzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICBjbGFzc05hbWU9e2dldEVudGl0eUxpbmtXcmFwcGVyQ2xhc3NOYW1lKGRpc3BsYXlUZXh0KX1cbiAgICAgICAgPlxuICAgICAgICAgIHtoYXNNZW50aW9ucyAmJiBtZW50aW9uTm9kZXMgPyAoXG4gICAgICAgICAgICAvLyBTaSBoYXkgbWVudGlvbnMsIHJlbmRlcml6YXIgZGlyZWN0YW1lbnRlIChzaW4gbWFya2Rvd24gZW4gZWwgbWlzbW8gcMOhcnJhZm8pXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lJyB9fT57bWVudGlvbk5vZGVzfTwvc3Bhbj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgLy8gU2luIG1lbnRpb25zLCBwYXNhciBhIFN0cmVhbWRvd24gcGFyYSBtYXJrZG93biBzdXBwb3J0XG4gICAgICAgICAgICA8TWFpYVN0cmVhbWRvd25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImNoYXRcIlxuICAgICAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtwcm9wcy5pc0N1cnJlbnRVc2VyfVxuICAgICAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkfVxuICAgICAgICAgICAgICBjb21wb25lbnRzPXt7IGE6IEVudGl0eUxpbmtDdXN0b21MaW5rIH0gYXMgTWFpYVN0cmVhbWRvd25Qcm9wc1snY29tcG9uZW50cyddfVxuICAgICAgICAgICAgICBpc0FuaW1hdGluZz17ISFwcm9wcy5pc1N0cmVhbWluZ31cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Rpc3BsYXlUZXh0fVxuICAgICAgICAgICAgPC9NYWlhU3RyZWFtZG93bj5cbiAgICAgICAgICApfVxuICAgICAgICA8L1NDQ0FJTWVzc2FnZVdyYXBwZXI+XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJlxuICAgICAgICAgICFwcm9wcy5pc0Vycm9yICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgIXByb3BzLmlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgKCFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkIHx8ICEhcHJvcHMub25SZXRyeSkgJiYgKFxuICAgICAgICAgICAgPE1lc3NhZ2VGZWVkYmFja1xuICAgICAgICAgICAgICBjb250ZW50PXtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgICAgc291cmNlcz17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCA/IHVuZGVmaW5lZCA6IHByb3BzLnNvdXJjZXN9XG4gICAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkID8gdW5kZWZpbmVkIDogcHJvcHMuaGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXtwcm9wcy5kaXNhYmxlRmVlZGJhY2t9XG4gICAgICAgICAgICAgIG9uUmV0cnk9e3Byb3BzLm9uUmV0cnl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJlxuICAgICAgICAgICFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgKCFwcm9wcy5pc0Vycm9yIHx8IHByb3BzLnN1Z2dlc3Rpb25zPy5sZW5ndGgpICYmIChcbiAgICAgICAgICAgIDxDaGF0QUlTdWdnZXN0aW9uc1xuICAgICAgICAgICAgICBzdWdnZXN0aW9ucz17cHJvcHMuc3VnZ2VzdGlvbnMgfHwgW119XG4gICAgICAgICAgICAgIG9uU2VsZWN0U3VnZ2VzdGlvbj17c3VnZ2VzdGlvbiA9PiBwcm9wcy5oYW5kbGVTdWdnZXN0aW9uQ2xpY2socHJvcHMubWVzc2FnZUlkLCBzdWdnZXN0aW9uKX1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAgIGhpZGRlbj17ISFwcm9wcy5pc1N0cmVhbWluZyB8fCAhcHJvcHMuaXNMYXN0TWVzc2FnZSB8fCAhIXByb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIHtwcm9wcy5pc0Fzc2lzdGFudCAmJlxuICAgICAgICAgICFwcm9wcy5pc0Vycm9yICYmXG4gICAgICAgICAgIXByb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWQgJiZcbiAgICAgICAgICAhcHJvcHMuYXBwcm92YWwgJiZcbiAgICAgICAgICAhIWNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgJiYgKFxuICAgICAgICAgICAgPENoYXRBSUNyZWF0ZUFnZW50QWN0aW9uc1xuICAgICAgICAgICAgICBhZ2VudElkPXtjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkfVxuICAgICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuc3VnZ2VzdGlvbnNEaXNhYmxlZH1cbiAgICAgICAgICAgICAgaGlkZGVuPXshIXByb3BzLmlzU3RyZWFtaW5nIHx8ICFwcm9wcy5pc0xhc3RNZXNzYWdlIHx8ICEhcHJvcHMuc3VnZ2VzdGlvbnNEaXNhYmxlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuKVxuXG5jb25zdCBNZXNzYWdlSXRlbSA9IG1lbW8oKHByb3BzOiBNZXNzYWdlSXRlbVByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBpZCxcbiAgICB1c2VyLFxuICAgIG1lc3NhZ2UsXG4gICAgaXNTdHJlYW1pbmcsXG4gICAgaXNFcnJvcixcbiAgICBhdXRoVXNlcixcbiAgICBvcHRpb25zLFxuICAgIGlzQ2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVTZWxlY3RPcHRpb24sXG4gICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrLFxuICAgIGhhbmRsZUZlZWRiYWNrLFxuICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24sXG4gICAgZGlzYWJsZUZlZWRiYWNrLFxuICAgIGhhbmRsZVJldHJ5LFxuICAgIHJvbGUsXG4gICAgc291cmNlcyxcbiAgICBhdHRhY2htZW50cyxcbiAgICBhcHByb3ZhbCxcbiAgICBhcHByb3ZhbFN0YXR1cyxcbiAgICBzdWdnZXN0aW9ucyxcbiAgICBjcmVhdGVBZ2VudEZvbGxvd1VwLFxuICAgIGhhc1NlbGVjdGVkU3VnZ2VzdGlvbixcbiAgICBpc0xhc3RNZXNzYWdlLFxuICAgIHN0cmVhbUFjdGl2aXR5LFxuICB9ID0gcHJvcHNcblxuICBjb25zdCBbcHJldmlld0F0dGFjaG1lbnQsIHNldFByZXZpZXdBdHRhY2htZW50XSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRGaWxlIHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNDdXJyZW50VXNlciA9IHJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IHVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKClcbiAgY29uc3QgaXNBc3Npc3RhbnQgPSByb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5UIHx8IHVzZXIuaWQgPT09ICdhc3Npc3RhbnQnXG4gIGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPSBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGlkKVxuICBjb25zdCBzdHJlYW1pbmdUZXh0ID0gdXNlU3RyZWFtaW5nTWVzc2FnZShpc1N0cmVhbWluZyB8fCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID8gaWQgOiBudWxsKVxuICBjb25zdCBpc0FjdGl2ZVN0cmVhbWluZyA9ICEhaXNTdHJlYW1pbmcgfHwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlclxuICBjb25zdCBoYXNTdHJlYW1UZXh0ID0gQm9vbGVhbihzdHJlYW1pbmdUZXh0KVxuICBjb25zdCByZWFzb25pbmdUcmFjZSA9IHVzZVJlYXNvbmluZ1RyYWNlKGlzQXNzaXN0YW50ICYmIGlzQWN0aXZlU3RyZWFtaW5nID8gaWQgOiAnJylcbiAgY29uc3Qgc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZSA9XG4gICAgaXNBc3Npc3RhbnQgJiYgc2hvdWxkU3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZShyZWFzb25pbmdUcmFjZS5zdGVwcywgc3RyZWFtQWN0aXZpdHksIHN0cmVhbWluZ1RleHQpXG4gIGNvbnN0IHNob3dTdHJlYW1pbmdCb2R5ID0gaXNBY3RpdmVTdHJlYW1pbmcgJiYgaGFzU3RyZWFtVGV4dCAmJiAhc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZVxuICBjb25zdCBzaG93QWN0aXZpdHlJbmRpY2F0b3IgPSBpc0Fzc2lzdGFudCAmJiBpc0FjdGl2ZVN0cmVhbWluZyAmJiAhIXN0cmVhbUFjdGl2aXR5XG5cbiAgY29uc3QgbWVzc2FnZUF0dGFjaG1lbnRzID1cbiAgICBhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwXG4gICAgICA/IGF0dGFjaG1lbnRzXG4gICAgICA6ICFpc0Fzc2lzdGFudCAmJiBBcnJheS5pc0FycmF5KHNvdXJjZXMpXG4gICAgICAgID8gKHNvdXJjZXMgYXMgQXR0YWNobWVudEZpbGVbXSlcbiAgICAgICAgOiBbXVxuXG4gIGNvbnN0IGhhbmRsZUF0dGFjaG1lbnRDbGljayA9IChhdHRhY2htZW50OiBBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgIC8vIFBlcm1pdGlyIHByZXZpc3VhbGl6YWNpw7NuIHNpIHRpZW5lIGFyY2hpdm8gbG9jYWwgbyBVUkxzIGRlbCBiYWNrZW5kXG4gICAgaWYgKFxuICAgICAgYXR0YWNobWVudC5maWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICAgICAgYXR0YWNobWVudC5vcmlnaW5hbEZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gICAgICBhdHRhY2htZW50LnVybF90aHVtYm5haWwgfHxcbiAgICAgIGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIHx8XG4gICAgICBhdHRhY2htZW50LnVybF9maWxlXG4gICAgKSB7XG4gICAgICBzZXRQcmV2aWV3QXR0YWNobWVudChhdHRhY2htZW50KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlUHJldmlldyA9ICgpID0+IHtcbiAgICBzZXRQcmV2aWV3QXR0YWNobWVudChudWxsKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudERvd25sb2FkID0gYXN5bmMgKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gYXR0YWNobWVudC5uYW1lLmluY2x1ZGVzKCcuJykgPyAnJyA6IGAuJHthdHRhY2htZW50LnR5cGV9YFxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7YXR0YWNobWVudC5uYW1lfSR7ZXh0ZW5zaW9ufWBcbiAgICBjb25zdCBmaWxlVXJsID0gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgfHwgYXR0YWNobWVudC51cmxfZmlsZSB8fCBhdHRhY2htZW50LnVybF90aHVtYm5haWxcblxuICAgIHRyeSB7XG4gICAgICBsZXQgYmxvYlVybDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgaWYgKGZpbGVVcmwpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZEZpbGUgPSBhd2FpdCBkb3dubG9hZEZpbGVGcm9tVXJsKGZpbGVVcmwsIGZpbGVOYW1lLCBhdHRhY2htZW50LnR5cGUpXG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRvd25sb2FkZWRGaWxlKVxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGF0dGFjaG1lbnQuZmlsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFibG9iVXJsKSByZXR1cm5cblxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgbGluay5ocmVmID0gYmxvYlVybFxuICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lXG4gICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICAgIGxpbmsuY2xpY2soKVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpXG4gICAgICB9LCAxMDApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkb3dubG9hZCBhdHRhY2htZW50JywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ2hhbmdlUHJvamVjdCAmJiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNZXNzYWdlV3JhcHBlciBrZXk9e2lkfSBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfSBkYXRhLW1lc3NhZ2UtaWQ9e2lkfSBoYXNGZWVkYmFjaz17ZmFsc2V9PlxuICAgICAgICA8U0NNZXNzYWdlSXRlbVdyYXBwZXIgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgPE1lc3NhZ2VDb250ZW50V3JhcHBlclxuICAgICAgICAgICAgaXNDaGFuZ2VQcm9qZWN0PXtpc0NoYW5nZVByb2plY3R9XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBtZXNzYWdlRXh0cmFDb250ZW50PXs8TWVzc2FnZU9wdGlvbnMgb3B0aW9ucz17b3B0aW9ucyBhcyBhbnl9IGhhbmRsZVNlbGVjdE9wdGlvbj17aGFuZGxlU2VsZWN0T3B0aW9ufSAvPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICAgICAgPC9NZXNzYWdlV3JhcHBlcj5cbiAgICApXG4gIH1cblxuICBjb25zdCBoYW5kbGVGZWVkYmFja0NsaWNrID0gKGZlZWRiYWNrOiBGZWVkYmFjaykgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGlkXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihxdWVzdGlvbklkID0+IHF1ZXN0aW9uSWQgIT09ICdhbnN3ZXInKVxuICAgICAgLmpvaW4oJy0nKVxuICAgIGhhbmRsZUZlZWRiYWNrPy4oZmVlZGJhY2ssIHNlc3Npb25JZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9IGRhdGEtbWVzc2FnZS1pZD17aWR9PlxuICAgICAgPFNDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgICAgey8qIE1pc21vIHNsb3QgcGFyYSBsYSB0cmF6YSBlbiB2aXZvIHkgbGEgeWEgcGxlZ2FkYTogbWllbnRyYXMgZWwgdHVybm9cbiAgICAgICAgICAgIGNvcnJlLCBsb3MgcGFzb3Mgc2UgYXBpbGFuIGFjw6EgKHRpbWVsYXBzZSk7IGFsIGNvbXBsZXRhciwgZWxcbiAgICAgICAgICAgIFJlYXNvbmluZ0Jsb2NrIG9jdXBhIGVsIGx1Z2FyIHkgY29sYXBzYSBzb2xvLlxuICAgICAgICAgICAgVmEgQVJSSUJBIGRlbCBjdWVycG8gcG9ycXVlIGxhIG5hcnJhY2nDs24gZGUgY2FkYSB0dXJubyB0ZXJtaW5hIGNvbW9cbiAgICAgICAgICAgIGZpbGEgZGUgbGEgdHJhemE6IHNpIGVzdHV2aWVyYSBhYmFqbywgZWwgdGV4dG8gdmllam8gcXVlZGFyw61hIHBvclxuICAgICAgICAgICAgZGViYWpvIGRlbCB0ZXh0byBudWV2by4gKi99XG4gICAgICAgIHtpc0Fzc2lzdGFudCAmJlxuICAgICAgICAgIChpc0FjdGl2ZVN0cmVhbWluZyA/IChcbiAgICAgICAgICAgIDxSZWFzb25pbmdUaW1lbGluZSBtZXNzYWdlSWQ9e2lkfSBzdHJlYW1BY3Rpdml0eT17c3RyZWFtQWN0aXZpdHl9IHN0cmVhbWluZ1RleHQ9e3N0cmVhbWluZ1RleHR9IC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxSZWFzb25pbmdCbG9jayBtZXNzYWdlSWQ9e2lkfSB0cmFjZT17cHJvcHMucmVhc29uaW5nID8/IG51bGx9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIHshIW1lc3NhZ2VBdHRhY2htZW50cy5sZW5ndGggJiYgKFxuICAgICAgICAgIDxTQ0F0dGFjaG1lbnRzUm93ICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAgICAgICAge21lc3NhZ2VBdHRhY2htZW50cy5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIC8vIERldGVjdGFyIHNpIGVzIHVuIGFyY2hpdm8gZGUgYXVkaW9cbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Py50eXBlPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnROYW1lID0gYXR0YWNobWVudD8ubmFtZT8udG9Mb3dlckNhc2UoKSB8fCAnJ1xuICAgICAgICAgICAgICBjb25zdCBpc0F1ZGlvRmlsZSA9XG4gICAgICAgICAgICAgICAgYXR0YWNobWVudFR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykgfHxcbiAgICAgICAgICAgICAgICBbJ2ZsYWMnLCAnbTRhJywgJ21wMycsICdtcDQnLCAnb2dhJywgJ29nZycsICd3YXYnLCAnd2VibSddLmluY2x1ZGVzKGF0dGFjaG1lbnRUeXBlKSB8fFxuICAgICAgICAgICAgICAgIFsnLmZsYWMnLCAnLm00YScsICcubXAzJywgJy5tcDQnLCAnLm9nYScsICcub2dnJywgJy53YXYnLCAnLndlYm0nXS5zb21lKGV4dCA9PlxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudE5hbWUuZW5kc1dpdGgoZXh0KVxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICBpZiAoaXNBdWRpb0ZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPEF0dGFjaG1lbnRDYXJkQXVkaW8ga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2F0dGFjaG1lbnQubmFtZX1gfSBhdHRhY2htZW50PXthdHRhY2htZW50fSAvPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8QXR0YWNobWVudENhcmRcbiAgICAgICAgICAgICAgICAgIGtleT17YCR7YXR0YWNobWVudC5pZH0tJHthdHRhY2htZW50Lm5hbWV9YH1cbiAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQ9e2F0dGFjaG1lbnR9XG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbkluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIG9uRG93bmxvYWQ9eygpID0+IGhhbmRsZUF0dGFjaG1lbnREb3dubG9hZChhdHRhY2htZW50KX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUF0dGFjaG1lbnRDbGljayhhdHRhY2htZW50KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1NDQXR0YWNobWVudHNSb3c+XG4gICAgICAgICl9XG4gICAgICAgIHsoISFtZXNzYWdlIHx8IHNob3dTdHJlYW1pbmdCb2R5KSAmJiAhKGlzQXNzaXN0YW50ICYmICEhbWVzc2FnZUF0dGFjaG1lbnRzLmxlbmd0aCkgJiYgKFxuICAgICAgICAgIDxTdHJlYW1pbmdNZXNzYWdlQm9keVxuICAgICAgICAgICAgbWVzc2FnZT17bWVzc2FnZSA/PyAnJ31cbiAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtzaG93U3RyZWFtaW5nQm9keX1cbiAgICAgICAgICAgIGlzQ3VycmVudFVzZXI9e2lzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgICBpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9XG4gICAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkfVxuICAgICAgICAgICAgYXBwcm92YWw9e2FwcHJvdmFsfVxuICAgICAgICAgICAgaXNFcnJvcj17aXNFcnJvcn1cbiAgICAgICAgICAgIHNvdXJjZXM9e3NvdXJjZXN9XG4gICAgICAgICAgICBzdWdnZXN0aW9ucz17c3VnZ2VzdGlvbnN9XG4gICAgICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwPXtjcmVhdGVBZ2VudEZvbGxvd1VwfVxuICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2tDbGljaz17aGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17ZGlzYWJsZUZlZWRiYWNrID8/IG51bGx9XG4gICAgICAgICAgICBvblJldHJ5PXtoYW5kbGVSZXRyeX1cbiAgICAgICAgICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljaz17aGFuZGxlU3VnZ2VzdGlvbkNsaWNrfVxuICAgICAgICAgICAgc3VnZ2VzdGlvbnNEaXNhYmxlZD17aXNBY3RpdmVTdHJlYW1pbmcgfHwgISFoYXNTZWxlY3RlZFN1Z2dlc3Rpb259XG4gICAgICAgICAgICBtZXNzYWdlSWQ9e2lkfVxuICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aXNMYXN0TWVzc2FnZX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7LyogU3Bpbm5lciBkZSBhY3RpdmlkYWQ6IHZpc2libGUgdGFtYmnDqW4gZW4gd3JpdGluZyAobmFycmFjacOzbiBlbiB0cmF6YSBvIHJlc3B1ZXN0YSBmaW5hbCkuICovfVxuICAgICAgICB7c2hvd0FjdGl2aXR5SW5kaWNhdG9yICYmIChcbiAgICAgICAgICA8U0NUaW1lbGluZUluZGljYXRvcj5cbiAgICAgICAgICAgIDxBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIGFjdGl2aXR5PXtzdHJlYW1BY3Rpdml0eX0gY29tcGFjdCAvPlxuICAgICAgICAgIDwvU0NUaW1lbGluZUluZGljYXRvcj5cbiAgICAgICAgKX1cbiAgICAgICAge2FwcHJvdmFsICYmIGFwcHJvdmFsLnBlbmRpbmdfYWN0aW9ucyAmJiAoXG4gICAgICAgICAgPFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uPlxuICAgICAgICAgICAgPEFwcHJvdmFsQm94XG4gICAgICAgICAgICAgIGFjdGlvbnM9e2FwcHJvdmFsLnBlbmRpbmdfYWN0aW9uc31cbiAgICAgICAgICAgICAgc3RhdHVzPXthcHByb3ZhbFN0YXR1c31cbiAgICAgICAgICAgICAgb25BcHByb3ZlPXt0aHJlYWRJZHMgPT4gaGFuZGxlQXBwcm92YWxEZWNpc2lvbih0aHJlYWRJZHMsICdhcHByb3ZlJyl9XG4gICAgICAgICAgICAgIG9uUmVqZWN0PXt0aHJlYWRJZHMgPT4gaGFuZGxlQXBwcm92YWxEZWNpc2lvbih0aHJlYWRJZHMsICdyZWplY3QnKX1cbiAgICAgICAgICAgICAgaXNQcm9qZWN0RGVsZXRlZD17cHJvcHMucHJvamVjdE1ldGFkYXRhPy5pc19kZWxldGVkID09PSB0cnVlfVxuICAgICAgICAgICAgICBpc0V4cGFuZGVkPXtwcm9wcy5leHBhbmRlZH1cbiAgICAgICAgICAgICAgaGl0bEluc3RhbmNlSWQ9e2FwcHJvdmFsLm9yaWdpbmFsX3RocmVhZF9pZH1cbiAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2U9e2FwcHJvdmFsLndhcm5pbmdfbWVzc2FnZX1cbiAgICAgICAgICAgICAgbWFudWFsQXBwcm92YWxEZXRlY3RlZD17YXBwcm92YWwubWFudWFsX2FwcHJvdmFsX2RldGVjdGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1NDQXBwcm92YWxBY3Rpb25zQ29sdW1uPlxuICAgICAgICApfVxuICAgICAgPC9TQ01lc3NhZ2VJdGVtSW5uZXI+XG4gICAgICA8QXR0YWNobWVudFByZXZpZXdNb2RhbFxuICAgICAgICBpc09wZW49eyEhcHJldmlld0F0dGFjaG1lbnR9XG4gICAgICAgIG9uQ2xvc2U9e2hhbmRsZUNsb3NlUHJldmlld31cbiAgICAgICAgYXR0YWNobWVudD17cHJldmlld0F0dGFjaG1lbnR9XG4gICAgICAvPlxuICAgIDwvU0NNZXNzYWdlSXRlbVdyYXBwZXI+XG4gIClcbn0pXG5cbmNvbnN0IENoYXRBSU1lc3NhZ2VzSW5uZXIgPSAoe1xuICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gIGluaXRpYWxDaGF0SWQsXG4gIG9uRXJyb3IsXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeSxcbiAgb25TY3JvbGxUb0JvdHRvbSxcbiAgYXR0YWNobWVudHMsXG4gIGFnZW50cyxcbiAgZXhwYW5kZWQsXG59OiBDaGF0QUlNZXNzYWdlc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVCgpXG4gIGNvbnN0IHsgaXNXZWJTZWFyY2hBY3RpdmUsIGlzRGVlcFNlYXJjaEFjdGl2ZSwgYWdlbnQgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCBldmVudCA9IHVzZUV2ZW50KClcbiAgY29uc3QgYXV0aFVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGNoYXRJbml0aWFsaXplZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaXNMb2FkaW5nTW9yZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgdXNlclNjcm9sbGluZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsVGhyZXNob2xkUmVmID0gdXNlUmVmKDM5KVxuICBjb25zdCBsYXN0U2Nyb2xsVG9wUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNob3dTY3JvbGxUb0JvdHRvbVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2hvd1RvcEdyYWRpZW50UmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBzaG93Qm90dG9tR3JhZGllbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNjcm9sbFJhZlJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICAvKipcbiAgICogVHVybm8gY29uIGVsIHNjcm9sbCBiYWpvIGNvbnRyb2wgZGVsIHVzdWFyaW86IGRlc2RlIHF1ZSBlbnbDrWEgZWwgbWVuc2FqZSB5XG4gICAqIGhhc3RhIGVsIHByw7N4aW1vIGVudsOtbyBubyBtb3ZlbW9zIGVsIHNjcm9sbCBwb3IgbmluZ8O6biBtb3Rpdm8uIEVzXG4gICAqIGluZGVwZW5kaWVudGUgZGUgbGEgYWx0dXJhIGRlbCBzcGFjZXIsIHF1ZSBwdWVkZSBsbGVnYXIgYSAwIHNpbiBkZXNhbmNsYXIuXG4gICAqL1xuICBjb25zdCBhbmNob3JlZFR1cm5JZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBzcGFjZXJFbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNwYWNlckhlaWdodFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCB0dXJuU2Nyb2xsUmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHdhc0xvYWRpbmdNZXNzYWdlc1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2hvd1Njcm9sbFRvQm90dG9tLCBzZXRTaG93U2Nyb2xsVG9Cb3R0b21dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93VG9wR3JhZGllbnQsIHNldFNob3dUb3BHcmFkaWVudF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Nob3dCb3R0b21HcmFkaWVudCwgc2V0U2hvd0JvdHRvbUdyYWRpZW50XSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcywgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pXG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICByZXRyeU1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBzdG9wR2VuZXJhdGlvbixcbiAgfSA9IHVzZUNoYXRNYW5hZ2VyKHtcbiAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBvbkVycm9yLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFnZW50cyxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3RPcHRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBjaGFuZ2VQcm9qZWN0KG9wdGlvbilcbiAgICB9LFxuICAgIFtjaGFuZ2VQcm9qZWN0XVxuICApXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYSBlbCBib3TDs24gXCJzY3JvbGwgdG8gYm90dG9tXCIgeSBsb3MgZ3JhZGllbnRlcyBkZSBib3JkZSBhIHBhcnRpciBkZVxuICAgKiBsYSBwb3NpY2nDs24gZGVsIHNjcm9sbC4gTG9zIHJlZnMgZXZpdGFuIGBzZXRTdGF0ZWAgY3VhbmRvIGVsIHZhbG9yIG5vIGNhbWJpYTpcbiAgICogZXN0byBjb3JyZSBlbiBjYWRhIGZyYW1lIGRlbCBzdHJlYW0uXG4gICAqL1xuICBjb25zdCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGVsXG4gICAgLy8gRWwgc3BhY2VyIGRlbCB0dXJubyBlcyBhbHRvIHJlc2VydmFkbywgbm8gY29udGVuaWRvOiBzaSBubyBsbyBkZXNjb250YW1vc1xuICAgIC8vIGxhIGZsZWNoYSB5IGVsIGdyYWRpZW50ZSBkZSBhYmFqbyBxdWVkYW4gZW5jZW5kaWRvcyBkdXJhbnRlIHRvZG8gZWwgdHVybm8uXG4gICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gc2Nyb2xsSGVpZ2h0IC0gc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHRcblxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgIGlmIChzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCAhPT0gc2hvdWxkU2hvdykge1xuICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VG9wR3JhZGllbnQgPSBzY3JvbGxUb3AgPiAxXG4gICAgaWYgKHNob3dUb3BHcmFkaWVudFJlZi5jdXJyZW50ICE9PSBuZXh0VG9wR3JhZGllbnQpIHtcbiAgICAgIHNob3dUb3BHcmFkaWVudFJlZi5jdXJyZW50ID0gbmV4dFRvcEdyYWRpZW50XG4gICAgICBzZXRTaG93VG9wR3JhZGllbnQobmV4dFRvcEdyYWRpZW50KVxuICAgIH1cblxuICAgIGNvbnN0IG5leHRCb3R0b21HcmFkaWVudCA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDFcbiAgICBpZiAoc2hvd0JvdHRvbUdyYWRpZW50UmVmLmN1cnJlbnQgIT09IG5leHRCb3R0b21HcmFkaWVudCkge1xuICAgICAgc2hvd0JvdHRvbUdyYWRpZW50UmVmLmN1cnJlbnQgPSBuZXh0Qm90dG9tR3JhZGllbnRcbiAgICAgIHNldFNob3dCb3R0b21HcmFkaWVudChuZXh0Qm90dG9tR3JhZGllbnQpXG4gICAgfVxuICB9LCBbXSlcblxuICAvKipcbiAgICogU2Nyb2xsIGlubWVkaWF0byBhbCBmb25kbyAoZGVudHJvIGRlIHJBRiBwYXJhIGNvb3JkaW5hciBjb24gZWwgcGFpbnQpXG4gICAqIHkgYWN0dWFsaXphIGxhIHZpc2liaWxpZGFkIGRlbCBib3TDs24uIFJlc3BldGEgYHNraXBJZlVzZXJTY3JvbGxpbmdgIHBhcmFcbiAgICogbm8gc29icmVzY3JpYmlyIGVsIHNjcm9sbCBtYW51YWwgZGVsIHVzdWFyaW8gZHVyYW50ZSBlbCBzdHJlYW1pbmcuXG4gICAqL1xuICBjb25zdCBzY3JvbGxUb0JvdHRvbVJhZiA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRzOiB7IHNraXBJZlVzZXJTY3JvbGxpbmc/OiBib29sZWFuOyBkZWxheU1zPzogbnVtYmVyIH0gPSB7fSkgPT4ge1xuICAgICAgY29uc3QgeyBza2lwSWZVc2VyU2Nyb2xsaW5nID0gZmFsc2UsIGRlbGF5TXMgPSAwIH0gPSBvcHRzXG4gICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlbCkgcmV0dXJuXG4gICAgICAgICAgaWYgKHNraXBJZlVzZXJTY3JvbGxpbmcgJiYgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50KSByZXR1cm5cbiAgICAgICAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHRcbiAgICAgICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZGVsYXlNcyA+IDApIHNldFRpbWVvdXQocnVuLCBkZWxheU1zKVxuICAgICAgZWxzZSBydW4oKVxuICAgIH0sXG4gICAgW3VwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXVxuICApXG5cbiAgY29uc3QgY2FuY2VsVHVyblNjcm9sbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAodHVyblNjcm9sbFJhZlJlZi5jdXJyZW50ID09PSBudWxsKSByZXR1cm5cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQpXG4gICAgdHVyblNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbXSlcblxuICAvKipcbiAgICogU2Nyb2xsIGFuaW1hZG8gY29uIGVhc2luZyBwcm9waW86IGBiZWhhdmlvcjogJ3Ntb290aCdgIG5vIHBlcm1pdGUgcmVndWxhciBsYVxuICAgKiBkdXJhY2nDs24geSBlbCBzYWx0byBhbCBhbmNsYXIgZWwgdHVybm8gcXVlZGEgZGVtYXNpYWRvIHNlY28uXG4gICAqL1xuICBjb25zdCBhbmltYXRlU2Nyb2xsVG8gPSB1c2VDYWxsYmFjayhcbiAgICAodG9wOiBudW1iZXIpID0+IHtcbiAgICAgIGNhbmNlbFR1cm5TY3JvbGwoKVxuICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBpZiAoIWVsKSByZXR1cm5cbiAgICAgIGNvbnN0IGZyb20gPSBlbC5zY3JvbGxUb3BcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gdG9wIC0gZnJvbVxuICAgICAgaWYgKE1hdGguYWJzKGRpc3RhbmNlKSA8IDEpIHJldHVyblxuXG4gICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgIFRVUk5fU0NST0xMX0RVUkFUSU9OX01TICtcbiAgICAgICAgKFRVUk5fU0NST0xMX01BWF9EVVJBVElPTl9NUyAtIFRVUk5fU0NST0xMX0RVUkFUSU9OX01TKSAqXG4gICAgICAgICAgTWF0aC5taW4oMSwgTWF0aC5hYnMoZGlzdGFuY2UpIC8gVFVSTl9TQ1JPTExfTE9OR19ESVNUQU5DRV9QWClcblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KClcbiAgICAgIGNvbnN0IHN0ZXAgPSAobm93OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLm1pbigxLCAobm93IC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uKVxuICAgICAgICAvLyBlYXNlT3V0RXhwbyAofmN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpKTogZW1waWV6YSBhIGZyZW5hciBtdWNob1xuICAgICAgICAvLyBhbnRlcyBxdWUgZWwgcXVpbnQgeSBhdGVycml6YSBzaW4gY29ydGUgcGVyY2VwdGlibGUuXG4gICAgICAgIGNvbnN0IGVhc2VkID0gcHJvZ3Jlc3MgPT09IDEgPyAxIDogMSAtIDIgKiogKC0xMiAqIHByb2dyZXNzKVxuICAgICAgICBlbC5zY3JvbGxUb3AgPSBmcm9tICsgZGlzdGFuY2UgKiBlYXNlZFxuICAgICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICAgIHR1cm5TY3JvbGxSYWZSZWYuY3VycmVudCA9IHByb2dyZXNzIDwgMSA/IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSA6IG51bGxcbiAgICAgIH1cbiAgICAgIHR1cm5TY3JvbGxSYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKVxuICAgIH0sXG4gICAgW2NhbmNlbFR1cm5TY3JvbGwsIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IGNhbmNlbFR1cm5TY3JvbGwsIFtjYW5jZWxUdXJuU2Nyb2xsXSlcblxuICBjb25zdCBzZXRTcGFjZXJIZWlnaHQgPSB1c2VDYWxsYmFjaygobmV4dDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKE1hdGguYWJzKHNwYWNlckhlaWdodFJlZi5jdXJyZW50IC0gbmV4dCkgPCAxKSByZXR1cm5cbiAgICBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA9IG5leHRcbiAgICBpZiAoc3BhY2VyRWxSZWYuY3VycmVudCkge1xuICAgICAgc3BhY2VyRWxSZWYuY3VycmVudC5zdHlsZS5oZWlnaHQgPSBgJHtuZXh0fXB4YFxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgY2xlYXJUdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBzZXRTcGFjZXJIZWlnaHQoMClcbiAgfSwgW3NldFNwYWNlckhlaWdodF0pXG5cbiAgLyoqXG4gICAqIERldnVlbHZlIGVsIGFsdG8gcmVzZXJ2YWRvIHF1ZSBzZSBwdWVkZSBzYWNhciBzaW4gbW92ZXIgbGEgdmlzdGE6IHRvZG8gbG9cbiAgICogcXVlIHF1ZWRlIHBvciBkZWJham8gZGVsIHNjcm9sbCBhY3R1YWwuIFNpIGVsIHVzdWFyaW8gZXN0w6EgZW4gZWwgZm9uZG8sIHNlXG4gICAqIHNhY2EgZW50ZXJvOyBzaSBlc3TDoSBhIG1pdGFkIGRlIGNhbWlubywgc2UgdmEgZHJlbmFuZG8gYSBtZWRpZGEgcXVlIGJhamEuXG4gICAqL1xuICBjb25zdCBkcmFpblR1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsIHx8IHNwYWNlckhlaWdodFJlZi5jdXJyZW50IDw9IDApIHJldHVyblxuICAgIGNvbnN0IHJlbW92YWJsZSA9IE1hdGgubWF4KDAsIGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodCAtIGVsLnNjcm9sbFRvcClcbiAgICBzZXRTcGFjZXJIZWlnaHQoTWF0aC5tYXgoMCwgc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgLSByZW1vdmFibGUpKVxuICB9LCBbc2V0U3BhY2VySGVpZ2h0XSlcblxuICAvKipcbiAgICogRWwgdXN1YXJpbyB0b23DsyBlbCBjb250cm9sIGRlbCBzY3JvbGw6IGVsIHR1cm5vIGRlamEgZGUgZXN0YXIgYW5jbGFkbyB5IGVsXG4gICAqIGVzcGFjaW8gcmVzZXJ2YWRvIGVtcGllemEgYSBkZXZvbHZlcnNlLiBTaW4gYW5jbGEgeSBjb24gc3BhY2VyID4gMCwgZWxcbiAgICogaGFuZGxlciBkZSBzY3JvbGwgc2lndWUgZHJlbmFuZG8gaGFzdGEgcXVlIGxsZWdhIGFsIGZvbmRvIHkgbm8gcXVlZGEgaHVlY28uXG4gICAqL1xuICBjb25zdCByZWxlYXNlVHVyblNwYWNlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudCAmJiBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA8PSAwKSByZXR1cm5cbiAgICBhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGRyYWluVHVyblNwYWNlKClcbiAgfSwgW2RyYWluVHVyblNwYWNlXSlcblxuICBjb25zdCBoYW5kbGVVc2VyU2Nyb2xsSW50ZW50ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNhbmNlbFR1cm5TY3JvbGwoKVxuICAgIHJlbGVhc2VUdXJuU3BhY2UoKVxuICB9LCBbY2FuY2VsVHVyblNjcm9sbCwgcmVsZWFzZVR1cm5TcGFjZV0pXG5cbiAgY29uc3QgbWVhc3VyZVR1cm4gPSB1c2VDYWxsYmFjaygocXVlc3Rpb25JZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgY29uc3Qgc3BhY2VyRWwgPSBzcGFjZXJFbFJlZi5jdXJyZW50XG4gICAgaWYgKCFlbCB8fCAhc3BhY2VyRWwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBxdWVzdGlvbkVsID0gZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLW1lc3NhZ2UtaWQ9XCIke3F1ZXN0aW9uSWR9XCJdYClcbiAgICBpZiAoIXF1ZXN0aW9uRWwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjb250YWluZXJUb3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICBjb25zdCBxdWVzdGlvblRvcCA9IHF1ZXN0aW9uRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gY29udGFpbmVyVG9wICsgZWwuc2Nyb2xsVG9wXG4gICAgY29uc3QgY29udGVudEJvdHRvbSA9IHNwYWNlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIGNvbnRhaW5lclRvcCArIGVsLnNjcm9sbFRvcFxuICAgIHJldHVybiB7IGVsLCBxdWVzdGlvblRvcCwgdHVybkhlaWdodDogY29udGVudEJvdHRvbSAtIHF1ZXN0aW9uVG9wIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgcmVzZXJ2ZVR1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKFxuICAgIChxdWVzdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVR1cm4ocXVlc3Rpb25JZClcbiAgICAgIGlmICghbWVhc3VyZWQpIHJldHVyblxuICAgICAgY29uc3QgeyBlbCwgcXVlc3Rpb25Ub3AsIHR1cm5IZWlnaHQgfSA9IG1lYXN1cmVkXG5cbiAgICAgIC8vIEFuY2xhbW9zIHNpZW1wcmUsIGluY2x1c28gY3VhbmRvIG5vIGhhZ2EgZmFsdGEgcmVzZXJ2YXI6IGR1cmFudGUgZWxcbiAgICAgIC8vIHR1cm5vIGVsIHNjcm9sbCBubyBzZSBtdWV2ZSBzb2xvIGVuIG5pbmfDum4gY2Fzby5cbiAgICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBxdWVzdGlvbklkXG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IHR1cm5BbmNob3JPZmZzZXQoZWwuY2xpZW50SGVpZ2h0KVxuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgcXVlc3Rpb25Ub3AgLSBvZmZzZXQpXG4gICAgICAvLyBDaGF0IHJlY2nDqW4gaW5pY2lhZG8gbyBjb252ZXJzYWNpw7NuIHF1ZSBhw7puIGVudHJhIGVuIHBhbnRhbGxhOiBsYVxuICAgICAgLy8gcHJlZ3VudGEgeWEgZXN0w6EgYXJyaWJhLCBubyBoYXkgbmFkYSBxdWUgc3ViaXIgbmkgcXVlIHJlc2VydmFyLlxuICAgICAgaWYgKHRhcmdldFNjcm9sbFRvcCA8PSBlbC5zY3JvbGxUb3ApIHtcbiAgICAgICAgc2V0U3BhY2VySGVpZ2h0KDApXG4gICAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2VydmFtb3MgbG8gbcOtbmltbyBwYXJhIHF1ZSBgdGFyZ2V0U2Nyb2xsVG9wYCBzZWEgYWxjYW56YWJsZS4gRWxcbiAgICAgIC8vIHNwYWNlciBzZSBpbnNlcnRhIGRlIHVuYSAoZXMgYWx0byByZXNlcnZhZG8sIG5vIGNvbnRlbmlkbyB2aXNpYmxlKTtcbiAgICAgIC8vIGxvIMO6bmljbyBxdWUgc2UgcGVyY2liZSBlcyBlbCBkZXNwbGF6YW1pZW50byBhbmltYWRvLlxuICAgICAgc2V0U3BhY2VySGVpZ2h0KE1hdGgubWF4KDAsIGVsLmNsaWVudEhlaWdodCAtIHR1cm5IZWlnaHQgLSBvZmZzZXQpKVxuICAgICAgYW5pbWF0ZVNjcm9sbFRvKHRhcmdldFNjcm9sbFRvcClcbiAgICB9LFxuICAgIFttZWFzdXJlVHVybiwgc2V0U3BhY2VySGVpZ2h0LCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcywgYW5pbWF0ZVNjcm9sbFRvXVxuICApXG5cbiAgLyoqXG4gICAqIEVuY29nZSBlbCBzcGFjZXIgYSBtZWRpZGEgcXVlIGNyZWNlIGxhIHJlc3B1ZXN0YTogZWwgYWx0byB0b3RhbCBkZWwgc2Nyb2xsXG4gICAqIHF1ZWRhIGNvbnN0YW50ZSB5IGxhIHZpc3RhIG5vIHNlIG11ZXZlIHNvbGEuIFNvbG8gYWNoaWNhLCBudW5jYSBhZ3JhbmRhLFxuICAgKiBwYXJhIG5vIGlueWVjdGFyIGVzcGFjaW8gZW4gdHVybm9zIHF1ZSBhcnJhbmNhcm9uIHNpbiByZXNlcnZhLlxuICAgKiBEZXZ1ZWx2ZSBzaSBlbCB0dXJubyBzaWd1ZSBhbmNsYWRvIChhdW5xdWUgZWwgc3BhY2VyIHlhIHNlYSAwKS5cbiAgICovXG4gIGNvbnN0IHN5bmNUdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgPiAwKSB7XG4gICAgICBjb25zdCBtZWFzdXJlZCA9IG1lYXN1cmVUdXJuKGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQpXG4gICAgICBpZiAobWVhc3VyZWQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHVybkFuY2hvck9mZnNldChtZWFzdXJlZC5lbC5jbGllbnRIZWlnaHQpXG4gICAgICAgIGNvbnN0IHJlc2VydmVkID0gTWF0aC5tYXgoMCwgbWVhc3VyZWQuZWwuY2xpZW50SGVpZ2h0IC0gbWVhc3VyZWQudHVybkhlaWdodCAtIG9mZnNldClcbiAgICAgICAgc2V0U3BhY2VySGVpZ2h0KE1hdGgubWluKHNwYWNlckhlaWdodFJlZi5jdXJyZW50LCByZXNlcnZlZCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH0sIFttZWFzdXJlVHVybiwgc2V0U3BhY2VySGVpZ2h0XSlcblxuICBjb25zdCBoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGlmICghZWwpIHJldHVyblxuICAgIGNsZWFyVHVyblNwYWNlKClcbiAgICAvLyBNaXNtYSBjdXJ2YSB5IGR1cmFjacOzbiBxdWUgZWwgYW5jbGFqZSBkZWwgdHVybm86IGVsIGBzbW9vdGhgIG5hdGl2byBmcmVuYSBzZWNvLlxuICAgIGFuaW1hdGVTY3JvbGxUbyhlbC5zY3JvbGxIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQpXG4gIH0sIFtjbGVhclR1cm5TcGFjZSwgYW5pbWF0ZVNjcm9sbFRvXSlcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5VSUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZS5jdXJyZW50VGFyZ2V0XG5cbiAgICAgIGlmIChzY3JvbGxSYWZSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzY3JvbGxSYWZSZWYuY3VycmVudClcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcblxuICAgICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsVG9wIDwgbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzU2Nyb2xsaW5nVXApIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDE1XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05lYXJCb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHQgPCBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudFxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20pIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgICAgIH1cblxuICAgICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSAhaXNOZWFyQm90dG9tXG4gICAgICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IHNjcm9sbFRvcFxuXG4gICAgICAgIC8vIFR1cm5vIHlhIGxpYmVyYWRvIHBvciBlbCB1c3VhcmlvOiBzZWd1aW1vcyBkZXZvbHZpZW5kbyBlbCBhbHRvXG4gICAgICAgIC8vIHJlc2VydmFkbyBtaWVudHJhcyBiYWphLCBwYXJhIHF1ZSBhbCBsbGVnYXIgYWwgw7psdGltbyBtZW5zYWplIG5vXG4gICAgICAgIC8vIHF1ZWRlIGh1ZWNvIGRlYmFqby5cbiAgICAgICAgaWYgKCFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSBkcmFpblR1cm5TcGFjZSgpXG5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20gJiYgb25TY3JvbGxUb0JvdHRvbSkge1xuICAgICAgICAgIG9uU2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlU2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbb25TY3JvbGxUb0JvdHRvbSwgaGFuZGxlU2Nyb2xsLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcywgZHJhaW5UdXJuU3BhY2VdXG4gIClcblxuICAvLyByZWZzIHRvIHN0YWJpbGl6ZSBmdW5jdGlvbnMgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3Qgc2VuZE1lc3NhZ2VSZWYgPSB1c2VSZWYoc2VuZE1lc3NhZ2UpXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUmVmID0gdXNlUmVmKHN0b3BHZW5lcmF0aW9uKVxuICBjb25zdCBvblNlbmRNZXNzYWdlUmVhZHlSZWYgPSB1c2VSZWYob25TZW5kTWVzc2FnZVJlYWR5KVxuICBjb25zdCBzZW5kTWVzc2FnZVByb3h5UmVmID0gdXNlUmVmKFxuICAgIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICApXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUHJveHlSZWYgPSB1c2VSZWYoKCkgPT4gc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCgpKVxuXG4gIC8vIHVwZGF0ZSByZWZzIHdoZW4gZnVuY3Rpb25zIGNoYW5nZVxuICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50ID0gc2VuZE1lc3NhZ2VcbiAgc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCA9IHN0b3BHZW5lcmF0aW9uXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50ID0gb25TZW5kTWVzc2FnZVJlYWR5XG5cbiAgLyoqXG4gICAqIGBoYW5kbGVTdWdnZXN0aW9uQ2xpY2tgIHNlIHBhc2EgYSBUT0RPUyBsb3MgTWVzc2FnZUl0ZW0sIGFzw60gcXVlIHN1IGlkZW50aWRhZFxuICAgKiBkZWNpZGUgc2kgZWwgYG1lbW9gIGRlIGxhIGxpc3RhIHNvc3RpZW5lLiBMZWVtb3MgcG9yIHJlZiBsbyBxdWUgY2FtYmlhIGVuIGNhZGFcbiAgICogdXBkYXRlIChgbWVzc2FnZXNgLCBgc2VuZE1lc3NhZ2VgLCBsYXMgc3VnZXJlbmNpYXMgeWEgZWxlZ2lkYXMpIHBhcmEgcXVlIGVsXG4gICAqIGNhbGxiYWNrIHNlYSBlc3RhYmxlOiBzaSBubywgYWwgdGVybWluYXIgZWwgc3RyZWFtIHNlIHJlcGludGEgZWwgY2hhdCBlbnRlcm9cbiAgICogeSBjYWRhIE1haWFTdHJlYW1kb3duIHZ1ZWx2ZSBhIHBhcnNlYXIgc3UgbWFya2Rvd24uXG4gICAqL1xuICBjb25zdCBtZXNzYWdlc0RhdGFSZWYgPSB1c2VSZWYobWVzc2FnZXMpXG4gIG1lc3NhZ2VzRGF0YVJlZi5jdXJyZW50ID0gbWVzc2FnZXNcbiAgY29uc3Qgc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZiA9IHVzZVJlZihzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzKVxuICBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzUmVmLmN1cnJlbnQgPSBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzXG5cbiAgY29uc3QgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc3VnZ2VzdGlvbj8udHJpbSgpKSByZXR1cm5cbiAgICAgIGlmIChzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzUmVmLmN1cnJlbnRbbWVzc2FnZUlkXSkgcmV0dXJuXG4gICAgICBjb25zdCBjdXJyZW50TWVzc2FnZXMgPSBtZXNzYWdlc0RhdGFSZWYuY3VycmVudFxuICAgICAgY29uc3QgaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50ID0gaXNNYWlha2VyQWdlbnQoYWdlbnQpXG4gICAgICBldmVudChFVkVOVFMuYWlDaGF0U3VnZ2VzdGVkQW5zd2VyLCB7XG4gICAgICAgIGFnZW50X3R5cGU6IGlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCA/ICdtYXJrZXRwbGFjZScgOiBhZ2VudD8udHlwZSxcbiAgICAgIH0pXG4gICAgICBzZXRTZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzKHByZXYgPT4gKHsgLi4ucHJldiwgW21lc3NhZ2VJZF06IHRydWUgfSkpXG5cbiAgICAgIGNvbnN0IHRhcmdldE1lc3NhZ2UgPSBjdXJyZW50TWVzc2FnZXMuZmluZChtc2cgPT4gbXNnLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICBjb25zdCBpc1JldHJ5U3VnZ2VzdGlvbiA9ICEhdGFyZ2V0TWVzc2FnZT8uaXNFcnJvciAmJiBzdWdnZXN0aW9uID09PSB0KCdjaGF0LnJldHJ5JylcbiAgICAgIGlmIChpc1JldHJ5U3VnZ2VzdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0VXNlck1lc3NhZ2UgPSBjdXJyZW50TWVzc2FnZXNcbiAgICAgICAgICAuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgLmF0KC0xKVxuICAgICAgICBpZiAobGFzdFVzZXJNZXNzYWdlPy5tZXNzYWdlKSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlBdHRhY2htZW50cyA9IEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzKVxuICAgICAgICAgICAgPyBsYXN0VXNlck1lc3NhZ2UuYXR0YWNobWVudHNcbiAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2Uuc291cmNlcylcbiAgICAgICAgICAgICAgPyBsYXN0VXNlck1lc3NhZ2Uuc291cmNlc1xuICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgc2VuZE1lc3NhZ2VSZWYuY3VycmVudChsYXN0VXNlck1lc3NhZ2UubWVzc2FnZSwgcmV0cnlBdHRhY2htZW50cylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50KHN1Z2dlc3Rpb24pXG4gICAgfSxcbiAgICBbZXZlbnQsIGFnZW50LCB0LCBhdXRoVXNlci5pZF1cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50KSB7XG4gICAgICBvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudChcbiAgICAgICAgc2VuZE1lc3NhZ2VQcm94eVJlZi5jdXJyZW50LFxuICAgICAgICBzdG9wR2VuZXJhdGlvblByb3h5UmVmLmN1cnJlbnQsXG4gICAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgICAgaXNXcml0aW5nXG4gICAgICApXG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlLCBpc1dyaXRpbmddKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50ID0gaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXG4gIH0sIFtpc0xvYWRpbmdNb3JlTWVzc2FnZXNdKVxuXG4gIC8vIEN1YW5kbyBlbCBhZ2VudGUgZW1waWV6YSBhIHJlc3BvbmRlciwgcmVzZXRlYXIgZWwgZmxhZyB5IGVsIHVtYnJhbCBwYXJhIGFjdGl2YXIgZWwgYXV0by1zY3JvbGxcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAod2FpdGluZ1Jlc3BvbnNlKSB7XG4gICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNoYXRJbml0aWFsaXplZFJlZi5jdXJyZW50KSB7XG4gICAgICBjaGF0SW5pdGlhbGl6ZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGluaXRpYWxpemVDaGF0KClcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8vIEF1dG9zY3JvbGwgbWllbnRyYXMgZWwgdGV4dG8gZGVsIHN0cmVhbSBjcmVjZS4gRWwgdGV4dG8gc2UgcGludGEgYWwgcml0bW9cbiAgLy8gZGUgYHVzZVNtb290aFN0cmVhbVRleHRgICh+NjBmcHMpLCBubyBhbCByaXRtbyBkZSBsbGVnYWRhIGRlIHRva2VucyBkZWxcbiAgLy8gYmFja2VuZDogcG9yIGVzbyBhY8OhIHVzYW1vcyB1biBsb29wIGRlIHJBRiBxdWUgY29tcGFyYSBgc2Nyb2xsSGVpZ2h0YFxuICAvLyBjb250cmEgZWwgw7psdGltbyB2YWxvciBvYnNlcnZhZG8geSBhanVzdGEgc29sbyBjdWFuZG8gY2FtYmlhLiBBc8OtIGVsXG4gIC8vIHNjcm9sbCBxdWVkYSBwZXJmZWN0YW1lbnRlIHNpbmNyb25pemFkbyBjb24gbGEgYW5pbWFjacOzbiBkZWwgdGV4dG8gc2luXG4gIC8vIGRlcGVuZGVyIGRlIGxhIGNhZGVuY2lhIGRlbCBzdHJlYW1pbmdTdG9yZS5cbiAgLy8gQ29uIGVsIHR1cm5vIGFuY2xhZG8gZXN0ZSBsb29wIHNvbG8gZW5jb2dlIGVsIHNwYWNlcjogbm8gdG9jYSBlbCBzY3JvbGwuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF3YWl0aW5nUmVzcG9uc2UgJiYgIWlzV3JpdGluZykgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmICghbWVzc2FnZXNSZWYuY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgbGV0IHJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAgIGxldCBsYXN0SGVpZ2h0ID0gbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcblxuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmFmSWQgPSBudWxsXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHN5bmNUdXJuU3BhY2UoKSkge1xuICAgICAgICAvLyBFbCBzY3JvbGwgbm8gc2UgbXVldmUsIHBlcm8gZWwgY29udGVuaWRvIGNyZWNlOiBsYSBmbGVjaGEgeSBlbFxuICAgICAgICAvLyBncmFkaWVudGUgZGUgYWJham8gdGllbmVuIHF1ZSBlbmNlbmRlcnNlIGFwZW5hcyBzZSBwYXNhIGRlbCB2aWV3cG9ydC5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHRcbiAgICAgIGlmIChjdXJyZW50SGVpZ2h0ICE9PSBsYXN0SGVpZ2h0KSB7XG4gICAgICAgIGxhc3RIZWlnaHQgPSBjdXJyZW50SGVpZ2h0XG4gICAgICAgIGlmICghdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgZWwuc2Nyb2xsVG9wID0gY3VycmVudEhlaWdodFxuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgIH1cbiAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spXG4gICAgfVxuXG4gICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljaylcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHJhZklkICE9IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nLCBzeW5jVHVyblNwYWNlLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc10pXG5cbiAgLy8gQWwgY29tZW56YXIgYSBlc3BlcmFyIGxhIHJlc3B1ZXN0YSBkZWwgYmFja2VuZCwgc2Nyb2xsIGluaWNpYWwgYWwgZm9uZG8uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHdhaXRpbmdSZXNwb25zZSAmJiBtZXNzYWdlc1JlZi5jdXJyZW50ICYmICFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZih7IHNraXBJZlVzZXJTY3JvbGxpbmc6IHRydWUgfSlcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIHNjcm9sbFRvQm90dG9tUmFmXSlcblxuICBjb25zdCBsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIC8vIENhbWJpbyBkZSBjaGF0OiBlbCBhbmNsYSB5IGVsIHNwYWNlciBkZWwgdHVybm8gYW50ZXJpb3IgZGVqYW4gZGUgYXBsaWNhci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxvYWRpbmdNZXNzYWdlcykgcmV0dXJuXG4gICAgbGFzdFJlc2VydmVkUXVlc3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICBjbGVhclR1cm5TcGFjZSgpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIGNsZWFyVHVyblNwYWNlXSlcblxuICAvLyBBbCBlbnZpYXIgdW4gbWVuc2FqZTogYW5jbGFtb3MgZWwgdHVybm8geSBoYWNlbW9zIGVsIMO6bmljbyBzY3JvbGwgZGVsIGNpY2xvLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzKSByZXR1cm5cblxuICAgIGxldCBxdWVzdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICAgIGZvciAobGV0IGluZGV4ID0gbWVzc2FnZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXggLT0gMSkge1xuICAgICAgaWYgKG1lc3NhZ2VzW2luZGV4XT8uaWQ/LnN0YXJ0c1dpdGgoJ3F1ZXN0aW9uLScpKSB7XG4gICAgICAgIHF1ZXN0aW9uSWQgPSBtZXNzYWdlc1tpbmRleF0uaWRcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFxdWVzdGlvbklkIHx8IHF1ZXN0aW9uSWQgPT09IGxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuXG4gICAgbGFzdFJlc2VydmVkUXVlc3Rpb25SZWYuY3VycmVudCA9IHF1ZXN0aW9uSWRcbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNlcnZlVHVyblNwYWNlKHF1ZXN0aW9uSWQpKVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCByZXNlcnZlVHVyblNwYWNlXSlcblxuICAvLyBTY3JvbGwgY3VhbmRvIGNhbWJpYW4gbG9zIG1lbnNhamVzOiBkaXN0aW5ndWUgXCJudWV2byBtZW5zYWplXCIgKGFncmVnYWRvKVxuICAvLyBkZSBcInJlZW1wbGF6b1wiIChtaXNtbyBpZC9sZW5ndGgsIGVqLiBmZWVkYmFjayBvIGFwcHJvdmFsU3RhdHVzKS4gRW5cbiAgLy8gcmVlbXBsYXpvcyBzb2xvIHNlIHJlY2FsY3VsYSBsYSB2aXNpYmlsaWRhZCBkZWwgYm90w7NuIHNpbiBmb3J6YXIgc2Nyb2xsLlxuICBjb25zdCBsYXN0TWVzc2FnZUlkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGxhc3RNZXNzYWdlc0xlbmd0aFJlZiA9IHVzZVJlZjxudW1iZXI+KDApXG5cbiAgLy8gQWwgY2FtYmlhciBkZSBzZXNpw7NuLCByZXNldGVhciBlc3RhZG8gZGUgc2Nyb2xsIG1hbnVhbCBwYXJhIG5vIGhlcmVkYXIgZWwgY2hhdCBhbnRlcmlvci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IDBcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSAwXG4gIH0sIFtpbml0aWFsQ2hhdElkXSlcblxuICAvLyBSZXN0YXVyYWNpw7NuIGRlc2RlIGNhY2hlIChzaW4gTG9hZGVyKTogYmFqYXIgYWwgZm9uZG8gYWwgcmVhYnJpciBzZXNpw7NuIHZpc2l0YWRhLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgIWluaXRpYWxDaGF0SWQgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAobGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID09PSBpbml0aWFsQ2hhdElkKSByZXR1cm5cbiAgICBsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG5cbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQgPz8gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgfSwgW2luaXRpYWxDaGF0SWQsIGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCBtZXNzYWdlcywgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlc1JlZi5jdXJyZW50IHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbGFzdElkID0gbGFzdE1lc3NhZ2U/LmlkID8/IG51bGxcbiAgICBjb25zdCBwcmV2SWQgPSBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnRcbiAgICBjb25zdCBwcmV2TGVuID0gbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnRcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBsYXN0SWRcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgY29uc3QgaXNOZXdNZXNzYWdlID0gbGFzdElkICE9PSBwcmV2SWQgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSBwcmV2TGVuXG4gICAgaWYgKCFpc05ld01lc3NhZ2UpIHtcbiAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFR1cm5vIGFuY2xhZG86IG5pIGVsIHJlZW1wbGF6byBkZWwgcGxhY2Vob2xkZXIgcG9yIGVsIG1lbnNhamUgZmluYWwsIG5pIGxhXG4gICAgLy8gYXBhcmljacOzbiBkZWwgQXBwcm92YWxCb3ggbXVldmVuIGVsIHNjcm9sbC4gU29sbyBzZSBhanVzdGEgZWwgc3BhY2VyLlxuICAgIGlmIChhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3luY1R1cm5TcGFjZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBjb25zdCBpc0F0Qm90dG9tID0gY29udGFpbmVyLnNjcm9sbEhlaWdodCAtIGNvbnRhaW5lci5zY3JvbGxUb3AgPD0gY29udGFpbmVyLmNsaWVudEhlaWdodCArIDEwMFxuICAgIGNvbnN0IGhhc0luaXRpYWxNZXNzYWdlID0gbWVzc2FnZXMuc29tZShtc2cgPT4gbXNnLmlkID09PSAndXNlci1pbml0aWFsLW1lc3NhZ2UnKVxuICAgIGNvbnN0IGlzQXBwcm92YWwgPSAhIWxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhcHByb3ZhbC0nKSB8fCAhIWxhc3RNZXNzYWdlLmFwcHJvdmFsKVxuICAgIGNvbnN0IGlzQW5zd2VyT3JRdWVzdGlvbiA9XG4gICAgICAhIWxhc3RNZXNzYWdlICYmIChsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdhbnN3ZXItJykgfHwgbGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgncXVlc3Rpb24tJykpXG5cbiAgICAvLyBOdWV2b3MgYW5zd2VyL3F1ZXN0aW9uOiBzY3JvbGwgc2kgZWwgdXN1YXJpbyB5YSBlc3RhYmEgYWwgZm9uZG8uXG4gICAgaWYgKGlzQW5zd2VyT3JRdWVzdGlvbiAmJiBpc0F0Qm90dG9tKSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNvIGJvcmRlOiBjYW1iaW9zIGRlIG1lbnNhamVzIHNpbiBzZXIgbnVldm8gYW5zd2VyL3VzZXIvYXBwcm92YWxcbiAgICAvLyBwZXJvIHPDrSB1biBtZW5zYWplIG51ZXZvIChubyBlbCBcInVzZXItaW5pdGlhbC1tZXNzYWdlXCIpLiBTY3JvbGxlYS5cbiAgICBpZiAoIWlzQW5zd2VyT3JRdWVzdGlvbiAmJiAhaXNBcHByb3ZhbCAmJiAhaGFzSW5pdGlhbE1lc3NhZ2UgJiYgbWVzc2FnZXMubGVuZ3RoID4gcHJldkxlbikge1xuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCBzY3JvbGxUb0JvdHRvbVJhZiwgc3luY1R1cm5TcGFjZSwgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNdKVxuXG4gIC8vIEFsIGFicmlyL2NhcmdhciB1bmEgY29udmVyc2FjacOzbiBlbCBjb250ZW5lZG9yIHNlIHJlbW9udGEgKExvYWRlciDihpIgbGlzdGEpIGNvblxuICAvLyBzY3JvbGxUb3A9MC4gRm9yemFtb3MgaXIgYWwgZm9uZG8gYWwgdGVybWluYXIgbG9hZE1lc3NhZ2VzLCBzaW4gYWZlY3RhciBwYWdpbmFjacOzbiBoYWNpYSBhcnJpYmEuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QganVzdEZpbmlzaGVkTG9hZGluZyA9IHdhc0xvYWRpbmdNZXNzYWdlc1JlZi5jdXJyZW50ICYmICFsb2FkaW5nTWVzc2FnZXNcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGxvYWRpbmdNZXNzYWdlc1xuXG4gICAgaWYgKCFqdXN0RmluaXNoZWRMb2FkaW5nIHx8IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQgPz8gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCBzY3JvbGxUb0JvdHRvbVJhZl0pXG5cbiAgLy8gRXN0YWRvIGluaWNpYWwgZGVsIGJvdMOzbiBzY3JvbGwtdG8tYm90dG9tIGFsIHRlcm1pbmFyIGxvYWRpbmdNZXNzYWdlcy5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxvYWRpbmdNZXNzYWdlcykge1xuICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgIH1cbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc10pXG5cbiAgLy8gT2J0ZW5lciBlbCDDumx0aW1vIG1lbnNhamUgZGVsIHVzdWFyaW8gcGFyYSB2ZXJpZmljYXIgc2kgdGllbmUgYXR0YWNobWVudHNcbiAgY29uc3QgbGFzdFVzZXJNZXNzYWdlID0gbWVzc2FnZXNcbiAgICAuZmlsdGVyKG1zZyA9PiBtc2cucm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLlVTRVIgfHwgbXNnLnVzZXIuaWQgPT09IGF1dGhVc2VyLmlkLnRvU3RyaW5nKCkpXG4gICAgLmF0KC0xKVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRzQ291bnQgPVxuICAgIChBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZT8uYXR0YWNobWVudHMpID8gbGFzdFVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzLmxlbmd0aCA6IDApIHx8XG4gICAgKEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlPy5zb3VyY2VzKSA/IGxhc3RVc2VyTWVzc2FnZS5zb3VyY2VzLmxlbmd0aCA6IDApXG5cbiAgY29uc3Qgc3RyZWFtTG9hZGluZ0Rpc3BsYXkgPSByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkoe1xuICAgIHN0cmVhbUFjdGl2aXR5LFxuICAgIGxvYWRpbmdNZXNzYWdlLFxuICAgIGFjdGl2ZUxvYWRpbmdzOiBhY3RpdmVMb2FkaW5ncyB8fCB7fSxcbiAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGhhc0F0dGFjaG1lbnRzOiBCb29sZWFuKGF0dGFjaG1lbnRzQ291bnQpLFxuICAgIGF0dGFjaG1lbnRzQ291bnQsXG4gICAgdCxcbiAgfSlcblxuICBjb25zdCBpc1Njcm9sbE9uUGFyZW50ID0gISFleHBhbmRlZFxuXG4gIC8vIEFsIGV4cGFuZGlyL2NvbnRyYWVyIGVsIG1vZGFsIGVsIHJlZiBwYXNhIGEgb3RybyBjb250ZW5lZG9yIChzY3JvbGxUb3Agc2UgcmVzZXRlYSBhIDApLlxuICAvLyBSZXN0YXVyYXIgbGEgcG9zaWNpw7NuIGRlIHNjcm9sbCBhbnRlcyBkZWwgcGFpbnQgcGFyYSBldml0YXIgcXVlIGxhIGNvbnZlcnNhY2nDs24gc2FsdGUgYXJyaWJhLlxuICBjb25zdCBleHBhbmRlZFJlZiA9IHVzZVJlZihleHBhbmRlZClcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZXhwYW5kZWRSZWYuY3VycmVudCAhPT0gZXhwYW5kZWQgJiYgbWVzc2FnZXNSZWYuY3VycmVudCkge1xuICAgICAgY29uc3Qgc2F2ZWRTY3JvbGxUb3AgPSBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG9wID0gc2F2ZWRTY3JvbGxUb3BcbiAgICAgIGV4cGFuZGVkUmVmLmN1cnJlbnQgPSBleHBhbmRlZFxuICAgIH0gZWxzZSB7XG4gICAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgICB9XG4gIH0sIFtleHBhbmRlZF0pXG5cbiAgaWYgKGxvYWRpbmdNZXNzYWdlcykge1xuICAgIHJldHVybiAoXG4gICAgICA8RmFkZSBmaWxsPlxuICAgICAgICA8TG9hZGVyIC8+XG4gICAgICA8L0ZhZGU+XG4gICAgKVxuICB9XG5cbiAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXVxuICBjb25zdCBoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3IgPVxuICAgICEhbGFzdE1lc3NhZ2UgJiYgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChsYXN0TWVzc2FnZS5pZCkgJiYgKHdhaXRpbmdSZXNwb25zZSB8fCBpc1dyaXRpbmcpXG5cbiAgY29uc3QgbWVzc2FnZXNDb250ZW50ID0gKFxuICAgIDw+XG4gICAgICB7aXNMb2FkaW5nTW9yZU1lc3NhZ2VzICYmIDxMb2FkaW5nVGV4dCB0ZXh0PXt0KCdjaGF0LmxvYWRpbmdNb3JlJyl9IC8+fVxuICAgICAgPD5cbiAgICAgICAge21lc3NhZ2VzLm1hcCgobWVzc2FnZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0Fzc2lzdGFudE1lc3NhZ2UgPSBtZXNzYWdlLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQgfHwgbWVzc2FnZS51c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICAgICAgICAgIGNvbnN0IGlzTGFzdE1lc3NhZ2UgPSBpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPVxuICAgICAgICAgICAgaXNBc3Npc3RhbnRNZXNzYWdlICYmIGlzTGFzdE1lc3NhZ2UgJiYgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChtZXNzYWdlLmlkKVxuICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJiAod2FpdGluZ1Jlc3BvbnNlIHx8IGlzV3JpdGluZylcblxuICAgICAgICAgIC8vIE5vIGZpbHRyYXIgZWwgcGxhY2Vob2xkZXIgZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nOiBzdSB0ZXh0byB2aXZlXG4gICAgICAgICAgLy8gZW4gZWwgc3RyZWFtaW5nU3RvcmUgeSBgbWVzc2FnZS5tZXNzYWdlYCBlcyAnJyBoYXN0YSBlbCBjb21wbGV0ZS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaXNTdHJlYW1pbmdQbGFjZWhvbGRlciAmJlxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgICAhKG1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aCB8fCBtZXNzYWdlLnNvdXJjZXM/Lmxlbmd0aCkgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLm1lc3NhZ2UgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLnByb2plY3Q/Lm5hbWUgJiZcbiAgICAgICAgICAgICFtZXNzYWdlLmFwcHJvdmFsXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VGZWVkYmFjayA9XG4gICAgICAgICAgICBtZXNzYWdlPy53YXNIZWxwZnVsID09PSB1bmRlZmluZWQgfHwgbWVzc2FnZS53YXNIZWxwZnVsID09PSBudWxsXG4gICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICA6IG1lc3NhZ2Uud2FzSGVscGZ1bFxuICAgICAgICAgICAgICAgID8gRmVlZGJhY2suVEhVTUJTX1VQXG4gICAgICAgICAgICAgICAgOiBGZWVkYmFjay5USFVNQlNfRE9XTlxuXG4gICAgICAgICAgLy8gS2V5IGVzdGFibGU6IHNvbG8gbWVzc2FnZS5pZCBwYXJhIGV2aXRhciByZW1vdW50IGR1cmFudGUgc3RyZWFtaW5nIChtZXNzYWdlLmRhdGUgcHVlZGUgY2FtYmlhcilcbiAgICAgICAgICBjb25zdCBtZXNzYWdlS2V5ID0gbWVzc2FnZS5pZCA/PyBgbXNnLSR7aW5kZXh9YFxuXG4gICAgICAgICAgY29uc3QgdHVybklkID0gcmVzb2x2ZVJldHJ5VHVybklkKG1lc3NhZ2UpXG4gICAgICAgICAgY29uc3QgdXNlck1lc3NhZ2VGb3JSZXRyeSA9IGZpbmRVc2VyTWVzc2FnZUZvclJldHJ5KG1lc3NhZ2VzLCBtZXNzYWdlKVxuICAgICAgICAgIGNvbnN0IGNhblJldHJ5ID1cbiAgICAgICAgICAgICEhdXNlck1lc3NhZ2VGb3JSZXRyeSAmJlxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5pc0Vycm9yICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5hcHByb3ZhbCAmJlxuICAgICAgICAgICAgKG1lc3NhZ2UuaXNGcm9udGVuZENhbmNlbGxlZCB8fCAoIW1lc3NhZ2UuaXNfY2FuY2VsbGVkICYmICEhdHVybklkKSlcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8TWVzc2FnZUl0ZW1cbiAgICAgICAgICAgICAgey4uLm1lc3NhZ2V9XG4gICAgICAgICAgICAgIGtleT17bWVzc2FnZUtleX1cbiAgICAgICAgICAgICAgYXV0aFVzZXI9e2F1dGhVc2VyfVxuICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RPcHRpb249e2hhbmRsZVNlbGVjdE9wdGlvbn1cbiAgICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2s9e2hhbmRsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uPXtoYW5kbGVBcHByb3ZhbERlY2lzaW9ufVxuICAgICAgICAgICAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s9e2hhbmRsZVN1Z2dlc3Rpb25DbGlja31cbiAgICAgICAgICAgICAgaGFuZGxlUmV0cnk9e2NhblJldHJ5ID8gKCkgPT4gcmV0cnlNZXNzYWdlKG1lc3NhZ2UpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb249eyEhc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1ttZXNzYWdlLmlkXX1cbiAgICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXttZXNzYWdlRmVlZGJhY2t9XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aXNMYXN0TWVzc2FnZX1cbiAgICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgICBzdHJlYW1BY3Rpdml0eT17aXNTdHJlYW1pbmcgPyBzdHJlYW1Mb2FkaW5nRGlzcGxheSA6IG51bGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8Lz5cbiAgICAgIHshaGFzTWVzc2FnZUxldmVsSW5kaWNhdG9yICYmIHN0cmVhbUxvYWRpbmdEaXNwbGF5ICYmIChcbiAgICAgICAgPFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uPlxuICAgICAgICAgIDxBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIGFjdGl2aXR5PXtzdHJlYW1Mb2FkaW5nRGlzcGxheX0gLz5cbiAgICAgICAgPC9TQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICl9XG4gICAgICB7LyogRXNwYWNpbyBxdWUgbGUgcGVybWl0ZSBhIGxhIHByZWd1bnRhIHN1YmlyIGFsIHRvcGUuIEFsdHVyYSBtYW5lamFkYVxuICAgICAgICAgIGltcGVyYXRpdmFtZW50ZSBkZXNkZSBgc2V0U3BhY2VySGVpZ2h0YDsgYXJyYW5jYSBlbiAwLiAqL31cbiAgICAgIDxTQ1R1cm5TcGFjZXIgcmVmPXtzcGFjZXJFbFJlZn0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICA8Lz5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgLy8gU2kgZWwgdXN1YXJpbyBtdWV2ZSBlbCBzY3JvbGwgYWJvcnRhbW9zIGxhIGFuaW1hY2nDs24geSBzb2x0YW1vcyBlbCB0dXJubzpcbiAgICAvLyBubyBsZSBwZWxlYW1vcyBlbCBjb250cm9sIGRlbCBjb250ZW5lZG9yLlxuICAgIDxTQ01lc3NhZ2VzT3V0ZXJcbiAgICAgICRzY3JvbGxPblBhcmVudD17aXNTY3JvbGxPblBhcmVudH1cbiAgICAgIG9uV2hlZWw9e2hhbmRsZVVzZXJTY3JvbGxJbnRlbnR9XG4gICAgICBvblRvdWNoU3RhcnQ9e2hhbmRsZVVzZXJTY3JvbGxJbnRlbnR9XG4gICAgPlxuICAgICAgPFNDTWVzc2FnZXNHcmFkaWVudFRvcCAkc2hvdz17c2hvd1RvcEdyYWRpZW50fSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAge2lzU2Nyb2xsT25QYXJlbnQgPyAoXG4gICAgICAgIDxTQ01lc3NhZ2VzU2Nyb2xsIHJlZj17bWVzc2FnZXNSZWZ9IG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDTWVzc2FnZXNJbm5lciAkc2Nyb2xsT25QYXJlbnQ9e2lzU2Nyb2xsT25QYXJlbnR9PnttZXNzYWdlc0NvbnRlbnR9PC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICAgIDwvU0NNZXNzYWdlc1Njcm9sbD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgcmVmPXttZXNzYWdlc1JlZn0gb25TY3JvbGw9e2hhbmRsZVNjcm9sbFRvQm90dG9tfSAkc2Nyb2xsT25QYXJlbnQ9e2ZhbHNlfT5cbiAgICAgICAgICB7bWVzc2FnZXNDb250ZW50fVxuICAgICAgICA8L1NDTWVzc2FnZXNJbm5lcj5cbiAgICAgICl9XG5cbiAgICAgIDxTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20gJHNob3c9e3Nob3dCb3R0b21HcmFkaWVudH0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cblxuICAgICAge3Nob3dTY3JvbGxUb0JvdHRvbSAmJiAoXG4gICAgICAgIDxTY3JvbGxUb0JvdHRvbUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDU2Nyb2xsSWNvblN3YXAgJHZpc2libGU9e2lzV3JpdGluZ30gYXJpYS1oaWRkZW4+XG4gICAgICAgICAgICA8U0NXcml0aW5nRG90cz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgIDwvU0NXcml0aW5nRG90cz5cbiAgICAgICAgICA8L1NDU2Nyb2xsSWNvblN3YXA+XG4gICAgICAgICAgPFNDU2Nyb2xsSWNvblN3YXAgJHZpc2libGU9eyFpc1dyaXRpbmd9IGFyaWEtaGlkZGVuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9ezEyfSBoZWlnaHQ9ezEyfSBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMyMDIwMjBcIlxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezEuNX1cbiAgICAgICAgICAgICAgICBkPVwiTTYgLjc1djEwLjVNLjc1IDYgNiAxMS4yNSAxMS4yNSA2XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvU0NTY3JvbGxJY29uU3dhcD5cbiAgICAgICAgPC9TY3JvbGxUb0JvdHRvbUJ1dHRvbj5cbiAgICAgICl9XG4gICAgPC9TQ01lc3NhZ2VzT3V0ZXI+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1lc3NhZ2VzID0gUmVhY3QubWVtbyhDaGF0QUlNZXNzYWdlc0lubmVyKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxJQUFRQyxJQUFJLEVBQWFDLFdBQVcsRUFBRUMsU0FBUyxFQUFFQyxlQUFlLEVBQUVDLE1BQU0sRUFBRUMsUUFBUSxFQUFBQyxhQUFBLElBQUFDLGNBQUEsUUFBUSxPQUFPO0FBRTdHLFNBQVNDLGNBQWMsUUFBUSwyQ0FBMkM7QUFDMUUsU0FBU0MsV0FBVyxRQUFRLHFDQUFxQztBQUNqRSxTQUFTQyxzQkFBc0IsUUFBUSxvQ0FBb0M7QUFDM0UsU0FBU0MsbUJBQW1CLFFBQVEsZ0RBQWdEO0FBQ3BGLFNBQVNDLGNBQWMsUUFBUSw0QkFBNEI7QUFHM0QsU0FBc0JDLGVBQWUsUUFBUSxxQkFBcUI7QUFDbEUsU0FBU0Msc0JBQXNCLEVBQUVDLGdCQUFnQixRQUFRLHNDQUFzQztBQUUvRixTQUFTQyxjQUFjLFFBQVEsaUNBQWlDO0FBQ2hFLFNBQWtCQyxPQUFPLFFBQVEsMkJBQTJCO0FBRTVELFNBQVNDLElBQUksUUFBUSxxQkFBcUI7QUFDMUMsU0FBU0MsY0FBYyxRQUFRLDhDQUE4QztBQUM3RSxTQUFTQyxtQkFBbUIsUUFBUSxvQ0FBb0M7QUFDeEUsU0FBU0MsbUJBQW1CLFFBQVEsb0NBQW9DO0FBRXhFLFNBQVNDLFdBQVcsUUFBUSx5QkFBeUI7QUFDckQsU0FBU0Msc0JBQXNCLFFBQVEsb0NBQW9DO0FBQzNFLFNBQVNDLGNBQWMsUUFBUSwyQ0FBMkM7QUFDMUUsU0FBU0MsK0JBQStCLFFBQVEsbURBQW1EO0FBQ25HLFNBQVNDLGlCQUFpQixRQUFRLDhDQUE4QztBQUNoRixTQUFTQyxtQkFBbUIsUUFBUSxrREFBa0Q7QUFFdEYsU0FBU0MsK0JBQStCLEVBQUVDLDJCQUEyQixRQUFRLHVDQUF1QztBQUNwSCxTQUFTQyxrQkFBa0IsRUFBRUMsdUJBQXVCLFFBQVEsZ0NBQWdDO0FBQzVGLFNBQVNDLGlCQUFpQixRQUFRLGtDQUFrQztBQUNwRSxTQUFTQyxNQUFNLFFBQVEsb0JBQW9CO0FBQzNDLFNBQVNDLElBQUksUUFBUSxrQkFBa0I7QUFJdkMsU0FBU0MsZUFBZSxFQUFFQyxnQkFBZ0IsRUFBRUMsc0JBQXNCLEVBQUVDLHVCQUF1QixRQUFRLFVBQVU7QUFDN0csU0FBU0MsZUFBZSxRQUFRLG9CQUFvQjtBQUNwRCxTQUNFQyxtQkFBbUIsRUFDbkJDLG9CQUFvQixFQUNwQkMsZ0JBQWdCLEVBQ2hCQyxhQUFhLEVBQ2JDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxlQUFlLEVBQ2ZDLFlBQVksRUFDWkMsYUFBYSxFQUNiQyxZQUFZLEVBQ1pDLG9CQUFvQixFQUNwQkMsa0JBQWtCLEVBQ2xCQyxnQkFBZ0IsRUFDaEJDLHVCQUF1QixFQUN2QkMsdUJBQXVCLEVBQ3ZCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixRQUNuQixhQUFhO0FBQ3BCLFNBQVNDLFFBQVEsUUFBUSxvQ0FBb0M7QUFDN0QsU0FBU0MsZ0JBQWdCLFFBQVEsaUNBQWlDO0FBSWxFLFNBQVNDLG9CQUFvQixFQUFFQyw2QkFBNkIsUUFBUSxpQ0FBaUM7QUFDckcsU0FBU0MsaUJBQWlCLFFBQVEscUJBQXFCO0FBQ3ZELFNBQVNDLHdCQUF3QixRQUFRLDRCQUE0QjtBQUNyRSxTQUFTQyxNQUFNLEVBQUVDLFFBQVEsUUFBUSx5QkFBeUI7QUFDMUQsU0FBU0MsbUJBQW1CLFFBQVEsbUNBQW1DO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLFFBQUEsSUFBQUMsU0FBQSxFQUFBQyxJQUFBLElBQUFDLEtBQUE7QUFtQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQWdCQSxDQUFJQyxjQUFzQjtFQUFBLE9BQWFDLElBQUksQ0FBQ0MsR0FBRyxDQUFDRixjQUFjLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQztBQUFBOztBQUVqRztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1HLHVCQUF1QixHQUFHLEdBQUc7QUFDbkMsSUFBTUMsMkJBQTJCLEdBQUcsR0FBRzs7QUFFdkM7QUFDQSxJQUFNQyw0QkFBNEIsR0FBRyxJQUFJO0FBZ0N6QyxJQUFNQyxjQUF1QyxHQUFHLFNBQTFDQSxjQUF1Q0EsQ0FBQUMsSUFBQSxFQUE4QztFQUFBLElBQXhDQyxhQUFhLEdBQUFELElBQUEsQ0FBYkMsYUFBYTtJQUFFQyxRQUFRLEdBQUFGLElBQUEsQ0FBUkUsUUFBUTtJQUFLQyxLQUFLLEdBQUFDLHdCQUFBLENBQUFKLElBQUEsRUFBQUssU0FBQTtFQUNsRixJQUFNQyxnQkFBZ0IsR0FBR0wsYUFBYSxHQUFHOUMsZUFBZSxHQUFHQyxnQkFBZ0I7RUFDM0Usb0JBQU8rQixJQUFBLENBQUNtQixnQkFBZ0IsRUFBQUMsYUFBQSxDQUFBQSxhQUFBLEtBQUtKLEtBQUs7SUFBQUQsUUFBQSxFQUFHQTtFQUFRLEVBQW1CLENBQUM7QUFDbkUsQ0FBQztBQUVELElBQU1NLHFCQUFxRCxHQUFHLFNBQXhEQSxxQkFBcURBLENBQUFDLEtBQUEsRUFBb0M7RUFBQSxJQUE5QlIsYUFBYSxHQUFBUSxLQUFBLENBQWJSLGFBQWE7SUFBS0UsS0FBSyxHQUFBQyx3QkFBQSxDQUFBSyxLQUFBLEVBQUFDLFVBQUE7RUFDdEYsSUFBTUMsdUJBQXVCLEdBQUdWLGFBQWEsR0FBRzVDLHNCQUFzQixHQUFHQyx1QkFBdUI7RUFDaEcsb0JBQU82QixJQUFBLENBQUN3Qix1QkFBdUIsRUFBQUosYUFBQSxLQUFLSixLQUFLLENBQUcsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBU1MsY0FBY0EsQ0FBQUMsS0FBQSxFQU1wQjtFQUFBLElBTERDLE9BQU8sR0FBQUQsS0FBQSxDQUFQQyxPQUFPO0lBQ1BDLGtCQUFrQixHQUFBRixLQUFBLENBQWxCRSxrQkFBa0I7RUFLbEIsSUFBQUMsU0FBQSxHQUE0QzNGLFFBQVEsQ0FBaUIsSUFBSSxDQUFDO0lBQUE0RixVQUFBLEdBQUFDLGNBQUEsQ0FBQUYsU0FBQTtJQUFuRUcsY0FBYyxHQUFBRixVQUFBO0lBQUVHLGlCQUFpQixHQUFBSCxVQUFBO0VBRXhDLElBQU1JLFlBQVksR0FBRyxTQUFmQSxZQUFZQSxDQUFJQyxNQUFlLEVBQUs7SUFDeEMsSUFBSUgsY0FBYyxFQUFFO0lBQ3BCQyxpQkFBaUIsQ0FBQ0UsTUFBTSxDQUFDO0lBQ3pCUCxrQkFBa0IsQ0FBQ08sTUFBTSxDQUFDO0VBQzVCLENBQUM7RUFFRCxvQkFDRW5DLElBQUEsQ0FBQ25CLGFBQWE7SUFBQWtDLFFBQUEsRUFDWCxDQUFDWSxPQUFPLElBQUksRUFBRSxFQUFFUyxHQUFHLENBQUMsVUFBQUQsTUFBTTtNQUFBLG9CQUN6Qm5DLElBQUEsQ0FBQ2xCLFlBQVk7UUFDWHVELGFBQWEsRUFBRSxDQUFDLENBQUNMLGNBQWU7UUFDaENNLE9BQU8sRUFBRSxDQUFDLENBQUNOLGNBQWMsSUFBSSxDQUFBQSxjQUFjLGFBQWRBLGNBQWMsdUJBQWRBLGNBQWMsQ0FBRU8sRUFBRSxNQUFLSixNQUFNLENBQUNJLEVBQUc7UUFDOURDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO1VBQUEsT0FBUU4sWUFBWSxDQUFDQyxNQUFNLENBQUM7UUFBQSxDQUFDO1FBQUFwQixRQUFBLEVBR25Db0IsTUFBTSxDQUFDTTtNQUFJLEdBRlBOLE1BQU0sQ0FBQ0ksRUFHQSxDQUFDO0lBQUEsQ0FDaEI7RUFBQyxDQUNXLENBQUM7QUFFcEI7O0FBRUE7QUFDQSxJQUFNRyxvQkFBb0IsZ0JBQUc3RyxJQUFJLENBQy9CLFVBQUNtRixLQWtCQSxFQUFLO0VBQUEsSUFBQTJCLHFCQUFBLEVBQUFDLGtCQUFBO0VBQ0o7RUFDQTtFQUNBO0VBQ0EsSUFBTUMsYUFBYSxHQUFHM0YsbUJBQW1CLENBQUM4RCxLQUFLLENBQUM4QixXQUFXLEdBQUc5QixLQUFLLENBQUMrQixTQUFTLEdBQUcsSUFBSSxDQUFDO0VBQ3JGLElBQU1DLE9BQU8sR0FBR2hDLEtBQUssQ0FBQzhCLFdBQVcsR0FBR0QsYUFBYSxHQUFHN0IsS0FBSyxDQUFDaUMsT0FBTztFQUNqRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsSUFBTUMsUUFBUSxHQUNaLE9BQU9DLE1BQU0sS0FBSyxXQUFXLEdBQ3hCQSxNQUFNLEdBT1AsQ0FBQyxDQUFDO0VBQ1IsSUFBTUMsV0FBVyxHQUFHbkcsbUJBQW1CLENBQUMrRixPQUFPLEVBQUE1QixhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUE7SUFDN0NpQyxPQUFPLEVBQUUsQ0FBQyxDQUFDckMsS0FBSyxDQUFDOEIsV0FBVztJQUM1QlEsZ0JBQWdCLEVBQUUsRUFBRTtJQUNwQkMsa0JBQWtCLEVBQUU7RUFBSSxHQUNwQkwsUUFBUSxDQUFDTSxXQUFXLElBQUksSUFBSSxJQUFJO0lBQUVDLFdBQVcsRUFBRVAsUUFBUSxDQUFDTTtFQUFZLENBQUMsR0FDckVOLFFBQVEsQ0FBQ1EsV0FBVyxJQUFJLElBQUksSUFBSTtJQUFFQyxrQkFBa0IsRUFBRVQsUUFBUSxDQUFDUTtFQUFZLENBQUMsR0FDNUVSLFFBQVEsQ0FBQ1UsY0FBYyxJQUFJLElBQUksSUFBSTtJQUFFQyxjQUFjLEVBQUVYLFFBQVEsQ0FBQ1U7RUFBZSxDQUFDLEdBQzlFVixRQUFRLENBQUNZLGVBQWUsSUFBSSxJQUFJLElBQUk7SUFBRUMsY0FBYyxFQUFFYixRQUFRLENBQUNZO0VBQWdCLENBQUMsR0FDaEZaLFFBQVEsQ0FBQ2MsY0FBYyxJQUFJLElBQUksSUFBSTtJQUFFQyxRQUFRLEVBQUVmLFFBQVEsQ0FBQ2M7RUFBZSxDQUFDLENBQzdFLENBQUM7RUFDRixJQUFNRSx5QkFBeUIsSUFBQXZCLHFCQUFBLEdBQUczQixLQUFLLENBQUNtRCxtQkFBbUIsY0FBQXhCLHFCQUFBLHVCQUF6QkEscUJBQUEsQ0FBMkJ5QixPQUFPO0VBRXBFLElBQUksQ0FBQ2hCLFdBQVcsSUFBSSxDQUFDcEMsS0FBSyxDQUFDOEIsV0FBVyxFQUFFLE9BQU8sSUFBSTtFQUNuRCxJQUFNdUIsV0FBVyxHQUFHekgsZ0JBQWdCLENBQUN3RyxXQUFXLENBQUM7RUFDakQsSUFBTWtCLFlBQVksR0FBR0QsV0FBVyxHQUFHMUgsc0JBQXNCLENBQUN5RyxXQUFXLENBQUMsR0FBRyxJQUFJO0VBQzdFLG9CQUNFaEQsS0FBQSxDQUFBRixTQUFBO0lBQUFhLFFBQUEsZ0JBQ0VmLElBQUEsQ0FBQzNCLG1CQUFtQjtNQUNsQnlDLGFBQWEsRUFBRUUsS0FBSyxDQUFDRixhQUFjO01BQ25DeUQsbUJBQW1CLEVBQUV2RCxLQUFLLENBQUN1RCxtQkFBb0I7TUFDL0NDLFNBQVMsRUFBRS9FLDZCQUE2QixDQUFDMkQsV0FBVyxDQUFFO01BQUFyQyxRQUFBLEVBRXJEc0QsV0FBVyxJQUFJQyxZQUFZO01BQUE7TUFDMUI7TUFDQXRFLElBQUE7UUFBTXlFLEtBQUssRUFBRTtVQUFFQyxPQUFPLEVBQUU7UUFBUyxDQUFFO1FBQUEzRCxRQUFBLEVBQUV1RDtNQUFZLENBQU8sQ0FBQztNQUFBO01BRXpEO01BQ0F0RSxJQUFBLENBQUN2RCxjQUFjO1FBQ2JrSSxPQUFPLEVBQUMsTUFBTTtRQUNkN0QsYUFBYSxFQUFFRSxLQUFLLENBQUNGLGFBQWM7UUFDbkN5RCxtQkFBbUIsRUFBRXZELEtBQUssQ0FBQ3VELG1CQUFvQjtRQUMvQ0ssVUFBVSxFQUFFO1VBQUVDLENBQUMsRUFBRXJGO1FBQXFCLENBQXVDO1FBQzdFc0YsV0FBVyxFQUFFLENBQUMsQ0FBQzlELEtBQUssQ0FBQzhCLFdBQVk7UUFBQS9CLFFBQUEsRUFFaENxQztNQUFXLENBQ0U7SUFDakIsQ0FDa0IsQ0FBQyxFQUNyQnBDLEtBQUssQ0FBQytELFdBQVcsSUFDaEIsQ0FBQy9ELEtBQUssQ0FBQ2dFLE9BQU8sSUFDZCxDQUFDaEUsS0FBSyxDQUFDaUUsUUFBUSxJQUNmLENBQUNqRSxLQUFLLENBQUM4QixXQUFXLEtBQ2pCLENBQUM5QixLQUFLLENBQUN1RCxtQkFBbUIsSUFBSSxDQUFDLENBQUN2RCxLQUFLLENBQUNrRSxPQUFPLENBQUMsaUJBQzdDbEYsSUFBQSxDQUFDNUIsZUFBZTtNQUNkK0csT0FBTyxFQUFFL0IsV0FBWTtNQUNyQmdDLE9BQU8sRUFBRXBFLEtBQUssQ0FBQ3VELG1CQUFtQixHQUFHYyxTQUFTLEdBQUdyRSxLQUFLLENBQUNvRSxPQUFRO01BQy9ERSxjQUFjLEVBQUV0RSxLQUFLLENBQUN1RCxtQkFBbUIsR0FBR2MsU0FBUyxHQUFHckUsS0FBSyxDQUFDdUUsbUJBQW9CO01BQ2xGQyxlQUFlLEVBQUV4RSxLQUFLLENBQUN3RSxlQUFnQjtNQUN2Q04sT0FBTyxFQUFFbEUsS0FBSyxDQUFDa0U7SUFBUSxDQUN4QixDQUNGLEVBQ0ZsRSxLQUFLLENBQUMrRCxXQUFXLElBQ2hCLENBQUMvRCxLQUFLLENBQUN1RCxtQkFBbUIsSUFDMUIsQ0FBQ3ZELEtBQUssQ0FBQ2lFLFFBQVEsS0FDZCxDQUFDakUsS0FBSyxDQUFDZ0UsT0FBTyxNQUFBcEMsa0JBQUEsR0FBSTVCLEtBQUssQ0FBQ3lFLFdBQVcsY0FBQTdDLGtCQUFBLHVCQUFqQkEsa0JBQUEsQ0FBbUI4QyxNQUFNLEVBQUMsaUJBQzNDMUYsSUFBQSxDQUFDTixpQkFBaUI7TUFDaEIrRixXQUFXLEVBQUV6RSxLQUFLLENBQUN5RSxXQUFXLElBQUksRUFBRztNQUNyQ0Usa0JBQWtCLEVBQUUsU0FBcEJBLGtCQUFrQkEsQ0FBRUMsVUFBVTtRQUFBLE9BQUk1RSxLQUFLLENBQUM2RSxxQkFBcUIsQ0FBQzdFLEtBQUssQ0FBQytCLFNBQVMsRUFBRTZDLFVBQVUsQ0FBQztNQUFBLENBQUM7TUFDM0ZFLFFBQVEsRUFBRTlFLEtBQUssQ0FBQytFLG1CQUFvQjtNQUNwQ0MsTUFBTSxFQUFFLENBQUMsQ0FBQ2hGLEtBQUssQ0FBQzhCLFdBQVcsSUFBSSxDQUFDOUIsS0FBSyxDQUFDaUYsYUFBYSxJQUFJLENBQUMsQ0FBQ2pGLEtBQUssQ0FBQytFO0lBQW9CLENBQ3BGLENBQ0YsRUFDRi9FLEtBQUssQ0FBQytELFdBQVcsSUFDaEIsQ0FBQy9ELEtBQUssQ0FBQ2dFLE9BQU8sSUFDZCxDQUFDaEUsS0FBSyxDQUFDdUQsbUJBQW1CLElBQzFCLENBQUN2RCxLQUFLLENBQUNpRSxRQUFRLElBQ2YsQ0FBQyxDQUFDZix5QkFBeUIsaUJBQ3pCbEUsSUFBQSxDQUFDTCx3QkFBd0I7TUFDdkJ5RSxPQUFPLEVBQUVGLHlCQUEwQjtNQUNuQzRCLFFBQVEsRUFBRTlFLEtBQUssQ0FBQytFLG1CQUFvQjtNQUNwQ0MsTUFBTSxFQUFFLENBQUMsQ0FBQ2hGLEtBQUssQ0FBQzhCLFdBQVcsSUFBSSxDQUFDOUIsS0FBSyxDQUFDaUYsYUFBYSxJQUFJLENBQUMsQ0FBQ2pGLEtBQUssQ0FBQytFO0lBQW9CLENBQ3BGLENBQ0Y7RUFBQSxDQUNILENBQUM7QUFFUCxDQUNGLENBQUM7QUFFRCxJQUFNRyxXQUFXLGdCQUFHckssSUFBSSxDQUFDLFVBQUNtRixLQUF1QixFQUFLO0VBQUEsSUFBQW1GLGdCQUFBLEVBQUFDLHFCQUFBO0VBQ3BELElBQ0U3RCxFQUFFLEdBd0JBdkIsS0FBSyxDQXhCUHVCLEVBQUU7SUFDRjhELElBQUksR0F1QkZyRixLQUFLLENBdkJQcUYsSUFBSTtJQUNKcEQsT0FBTyxHQXNCTGpDLEtBQUssQ0F0QlBpQyxPQUFPO0lBQ1BILFdBQVcsR0FxQlQ5QixLQUFLLENBckJQOEIsV0FBVztJQUNYa0MsT0FBTyxHQW9CTGhFLEtBQUssQ0FwQlBnRSxPQUFPO0lBQ1BzQixRQUFRLEdBbUJOdEYsS0FBSyxDQW5CUHNGLFFBQVE7SUFDUjNFLE9BQU8sR0FrQkxYLEtBQUssQ0FsQlBXLE9BQU87SUFDUDRFLGVBQWUsR0FpQmJ2RixLQUFLLENBakJQdUYsZUFBZTtJQUNmM0Usa0JBQWtCLEdBZ0JoQlosS0FBSyxDQWhCUFksa0JBQWtCO0lBQ2xCaUUscUJBQXFCLEdBZW5CN0UsS0FBSyxDQWZQNkUscUJBQXFCO0lBQ3JCUCxjQUFjLEdBY1p0RSxLQUFLLENBZFBzRSxjQUFjO0lBQ2RrQixzQkFBc0IsR0FhcEJ4RixLQUFLLENBYlB3RixzQkFBc0I7SUFDdEJoQixlQUFlLEdBWWJ4RSxLQUFLLENBWlB3RSxlQUFlO0lBQ2ZpQixXQUFXLEdBV1R6RixLQUFLLENBWFB5RixXQUFXO0lBQ1hDLElBQUksR0FVRjFGLEtBQUssQ0FWUDBGLElBQUk7SUFDSnRCLE9BQU8sR0FTTHBFLEtBQUssQ0FUUG9FLE9BQU87SUFDUHVCLFdBQVcsR0FRVDNGLEtBQUssQ0FSUDJGLFdBQVc7SUFDWDFCLFFBQVEsR0FPTmpFLEtBQUssQ0FQUGlFLFFBQVE7SUFDUjJCLGNBQWMsR0FNWjVGLEtBQUssQ0FOUDRGLGNBQWM7SUFDZG5CLFdBQVcsR0FLVHpFLEtBQUssQ0FMUHlFLFdBQVc7SUFDWHRCLG1CQUFtQixHQUlqQm5ELEtBQUssQ0FKUG1ELG1CQUFtQjtJQUNuQjBDLHFCQUFxQixHQUduQjdGLEtBQUssQ0FIUDZGLHFCQUFxQjtJQUNyQlosYUFBYSxHQUVYakYsS0FBSyxDQUZQaUYsYUFBYTtJQUNiYSxjQUFjLEdBQ1o5RixLQUFLLENBRFA4RixjQUFjO0VBR2hCLElBQUFDLFVBQUEsR0FBa0Q3SyxRQUFRLENBQXdCLElBQUksQ0FBQztJQUFBOEssVUFBQSxHQUFBakYsY0FBQSxDQUFBZ0YsVUFBQTtJQUFoRkUsaUJBQWlCLEdBQUFELFVBQUE7SUFBRUUsb0JBQW9CLEdBQUFGLFVBQUE7RUFDOUMsSUFBTWxHLGFBQWEsR0FBRzRGLElBQUksS0FBS2hLLGVBQWUsQ0FBQ3lLLElBQUksSUFBSWQsSUFBSSxDQUFDOUQsRUFBRSxLQUFLK0QsUUFBUSxDQUFDL0QsRUFBRSxDQUFDNkUsUUFBUSxDQUFDLENBQUM7RUFDekYsSUFBTXJDLFdBQVcsR0FBRzJCLElBQUksS0FBS2hLLGVBQWUsQ0FBQzJLLFNBQVMsSUFBSWhCLElBQUksQ0FBQzlELEVBQUUsS0FBSyxXQUFXO0VBQ2pGLElBQU0rRSxzQkFBc0IsR0FBRzdKLCtCQUErQixDQUFDOEUsRUFBRSxDQUFDO0VBQ2xFLElBQU1NLGFBQWEsR0FBRzNGLG1CQUFtQixDQUFDNEYsV0FBVyxJQUFJd0Usc0JBQXNCLEdBQUcvRSxFQUFFLEdBQUcsSUFBSSxDQUFDO0VBQzVGLElBQU1nRixpQkFBaUIsR0FBRyxDQUFDLENBQUN6RSxXQUFXLElBQUl3RSxzQkFBc0I7RUFDakUsSUFBTUUsYUFBYSxHQUFHQyxPQUFPLENBQUM1RSxhQUFhLENBQUM7RUFDNUMsSUFBTTZFLGNBQWMsR0FBRzdKLGlCQUFpQixDQUFDa0gsV0FBVyxJQUFJd0MsaUJBQWlCLEdBQUdoRixFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3BGLElBQU1vRix5QkFBeUIsR0FDN0I1QyxXQUFXLElBQUl6SCwrQkFBK0IsQ0FBQ29LLGNBQWMsQ0FBQ0UsS0FBSyxFQUFFZCxjQUFjLEVBQUVqRSxhQUFhLENBQUM7RUFDckcsSUFBTWdGLGlCQUFpQixHQUFHTixpQkFBaUIsSUFBSUMsYUFBYSxJQUFJLENBQUNHLHlCQUF5QjtFQUMxRixJQUFNRyxxQkFBcUIsR0FBRy9DLFdBQVcsSUFBSXdDLGlCQUFpQixJQUFJLENBQUMsQ0FBQ1QsY0FBYztFQUVsRixJQUFNaUIsa0JBQWtCLEdBQ3RCcEIsV0FBVyxJQUFJQSxXQUFXLENBQUNqQixNQUFNLEdBQUcsQ0FBQyxHQUNqQ2lCLFdBQVcsR0FDWCxDQUFDNUIsV0FBVyxJQUFJaUQsS0FBSyxDQUFDQyxPQUFPLENBQUM3QyxPQUFPLENBQUMsR0FDbkNBLE9BQU8sR0FDUixFQUFFO0VBRVYsSUFBTThDLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBcUJBLENBQUlDLFVBQTBCLEVBQUs7SUFDNUQ7SUFDQSxJQUNFQSxVQUFVLENBQUNDLElBQUksWUFBWUMsSUFBSSxJQUMvQkYsVUFBVSxDQUFDRyxZQUFZLFlBQVlELElBQUksSUFDdkNGLFVBQVUsQ0FBQ0ksYUFBYSxJQUN4QkosVUFBVSxDQUFDSyxZQUFZLElBQ3ZCTCxVQUFVLENBQUNNLFFBQVEsRUFDbkI7TUFDQXZCLG9CQUFvQixDQUFDaUIsVUFBVSxDQUFDO0lBQ2xDO0VBQ0YsQ0FBQztFQUVELElBQU1PLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBa0JBLENBQUEsRUFBUztJQUMvQnhCLG9CQUFvQixDQUFDLElBQUksQ0FBQztFQUM1QixDQUFDO0VBRUQsSUFBTXlCLHdCQUF3QjtJQUFBLElBQUFDLEtBQUEsR0FBQUMsaUJBQUEsY0FBQUMsbUJBQUEsQ0FBQUMsSUFBQSxDQUFHLFNBQUFDLFFBQU9iLFVBQTBCO01BQUEsSUFBQWMsU0FBQSxFQUFBQyxRQUFBLEVBQUFDLE9BQUEsRUFBQUMsT0FBQSxFQUFBQyxjQUFBLEVBQUFDLElBQUEsRUFBQUMsRUFBQTtNQUFBLE9BQUFULG1CQUFBLENBQUFVLElBQUEsV0FBQUMsUUFBQTtRQUFBLGtCQUFBQSxRQUFBLENBQUFDLElBQUEsR0FBQUQsUUFBQSxDQUFBRSxJQUFBO1VBQUE7WUFDMURWLFNBQVMsR0FBR2QsVUFBVSxDQUFDMUYsSUFBSSxDQUFDbUgsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBQUMsTUFBQSxDQUFPMUIsVUFBVSxDQUFDMkIsSUFBSSxDQUFFO1lBQ3RFWixRQUFRLE1BQUFXLE1BQUEsQ0FBTTFCLFVBQVUsQ0FBQzFGLElBQUksRUFBQW9ILE1BQUEsQ0FBR1osU0FBUztZQUN6Q0UsT0FBTyxHQUFHaEIsVUFBVSxDQUFDSyxZQUFZLElBQUlMLFVBQVUsQ0FBQ00sUUFBUSxJQUFJTixVQUFVLENBQUNJLGFBQWE7WUFBQWtCLFFBQUEsQ0FBQUMsSUFBQTtZQUdwRk4sT0FBc0IsR0FBRyxJQUFJO1lBQUEsS0FFN0JELE9BQU87Y0FBQU0sUUFBQSxDQUFBRSxJQUFBO2NBQUE7WUFBQTtZQUFBRixRQUFBLENBQUFFLElBQUE7WUFBQSxPQUNvQjdKLG1CQUFtQixDQUFDcUosT0FBTyxFQUFFRCxRQUFRLEVBQUVmLFVBQVUsQ0FBQzJCLElBQUksQ0FBQztVQUFBO1lBQTlFVCxjQUFjLEdBQUFJLFFBQUEsQ0FBQU0sSUFBQTtZQUNwQlgsT0FBTyxHQUFHWSxHQUFHLENBQUNDLGVBQWUsQ0FBQ1osY0FBYyxDQUFDO1lBQUFJLFFBQUEsQ0FBQUUsSUFBQTtZQUFBO1VBQUE7WUFDeEMsSUFBSXhCLFVBQVUsQ0FBQ0MsSUFBSSxZQUFZQyxJQUFJLEVBQUU7Y0FDMUNlLE9BQU8sR0FBR1ksR0FBRyxDQUFDQyxlQUFlLENBQUM5QixVQUFVLENBQUNDLElBQUksQ0FBQztZQUNoRDtVQUFDO1lBQUEsSUFFSWdCLE9BQU87Y0FBQUssUUFBQSxDQUFBRSxJQUFBO2NBQUE7WUFBQTtZQUFBLE9BQUFGLFFBQUEsQ0FBQVMsTUFBQTtVQUFBO1lBRU5aLElBQUksR0FBR2EsUUFBUSxDQUFDaE8sYUFBYSxDQUFDLEdBQUcsQ0FBQztZQUN4Q21OLElBQUksQ0FBQ2MsSUFBSSxHQUFHaEIsT0FBTztZQUNuQkUsSUFBSSxDQUFDZSxRQUFRLEdBQUduQixRQUFRO1lBQ3hCSSxJQUFJLENBQUM3RSxLQUFLLENBQUNDLE9BQU8sR0FBRyxNQUFNO1lBQzNCeUYsUUFBUSxDQUFDRyxJQUFJLENBQUNDLFdBQVcsQ0FBQ2pCLElBQUksQ0FBQztZQUMvQkEsSUFBSSxDQUFDa0IsS0FBSyxDQUFDLENBQUM7WUFFWkMsVUFBVSxDQUFDLFlBQU07Y0FDZk4sUUFBUSxDQUFDRyxJQUFJLENBQUNJLFdBQVcsQ0FBQ3BCLElBQUksQ0FBQztjQUMvQlUsR0FBRyxDQUFDVyxlQUFlLENBQUN2QixPQUFPLENBQUM7WUFDOUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFBSyxRQUFBLENBQUFFLElBQUE7WUFBQTtVQUFBO1lBQUFGLFFBQUEsQ0FBQUMsSUFBQTtZQUFBSCxFQUFBLEdBQUFFLFFBQUE7WUFFUG1CLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLCtCQUErQixFQUFBdEIsRUFBTyxDQUFDO1VBQUE7VUFBQTtZQUFBLE9BQUFFLFFBQUEsQ0FBQXFCLElBQUE7UUFBQTtNQUFBLEdBQUE5QixPQUFBO0lBQUEsQ0FFeEQ7SUFBQSxnQkEvQktMLHdCQUF3QkEsQ0FBQW9DLEVBQUE7TUFBQSxPQUFBbkMsS0FBQSxDQUFBb0MsS0FBQSxPQUFBQyxTQUFBO0lBQUE7RUFBQSxHQStCN0I7RUFFRCxJQUFJMUUsZUFBZSxJQUFJNUUsT0FBTyxFQUFFO0lBQzlCLG9CQUNFM0IsSUFBQSxDQUFDWSxjQUFjO01BQVVFLGFBQWEsRUFBRUEsYUFBYztNQUFDLG1CQUFpQnlCLEVBQUc7TUFBQzJJLFdBQVcsRUFBRSxLQUFNO01BQUFuSyxRQUFBLGVBQzdGZixJQUFBLENBQUNqQixvQkFBb0I7UUFBQ29NLFlBQVksRUFBRXBHLFdBQVk7UUFBQWhFLFFBQUEsZUFDOUNmLElBQUEsQ0FBQ3FCLHFCQUFxQjtVQUNwQmtGLGVBQWUsRUFBRUEsZUFBZ0I7VUFDakN0RCxPQUFPLEVBQUVBLE9BQVE7VUFDakJuQyxhQUFhLEVBQUVBLGFBQWM7VUFDN0JrRSxPQUFPLEVBQUVBLE9BQVE7VUFDakJvRyxtQkFBbUIsZUFBRXBMLElBQUEsQ0FBQ3lCLGNBQWM7WUFBQ0UsT0FBTyxFQUFFQSxPQUFlO1lBQUNDLGtCQUFrQixFQUFFQTtVQUFtQixDQUFFO1FBQUUsQ0FDMUc7TUFBQyxDQUNrQjtJQUFDLEdBVEpXLEVBVUwsQ0FBQztFQUVyQjtFQUVBLElBQU1nRCxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFJOEYsUUFBa0IsRUFBSztJQUNsRCxJQUFNQyxTQUFTLEdBQUcvSSxFQUFFLENBQ2pCZ0osS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUNWQyxNQUFNLENBQUMsVUFBQUMsVUFBVTtNQUFBLE9BQUlBLFVBQVUsS0FBSyxRQUFRO0lBQUEsRUFBQyxDQUM3Q0MsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNacEcsY0FBYyxhQUFkQSxjQUFjLGVBQWRBLGNBQWMsQ0FBRytGLFFBQVEsRUFBRUMsU0FBUyxDQUFDO0VBQ3ZDLENBQUM7RUFFRCxvQkFDRWxMLEtBQUEsQ0FBQ3JCLG9CQUFvQjtJQUFDb00sWUFBWSxFQUFFcEcsV0FBWTtJQUFDLG1CQUFpQnhDLEVBQUc7SUFBQXhCLFFBQUEsZ0JBQ25FWCxLQUFBLENBQUNwQixrQkFBa0I7TUFBQStCLFFBQUEsR0FPaEJnRSxXQUFXLEtBQ1R3QyxpQkFBaUIsZ0JBQ2hCdkgsSUFBQSxDQUFDekMsaUJBQWlCO1FBQUN3RixTQUFTLEVBQUVSLEVBQUc7UUFBQ3VFLGNBQWMsRUFBRUEsY0FBZTtRQUFDakUsYUFBYSxFQUFFQTtNQUFjLENBQUUsQ0FBQyxnQkFFbEc3QyxJQUFBLENBQUMzQyxjQUFjO1FBQUMwRixTQUFTLEVBQUVSLEVBQUc7UUFBQ29KLEtBQUssR0FBQXhGLGdCQUFBLEdBQUVuRixLQUFLLENBQUM0SyxTQUFTLGNBQUF6RixnQkFBQSxjQUFBQSxnQkFBQSxHQUFJO01BQUssQ0FBRSxDQUNqRSxDQUFDLEVBQ0gsQ0FBQyxDQUFDNEIsa0JBQWtCLENBQUNyQyxNQUFNLGlCQUMxQjFGLElBQUEsQ0FBQ2YsZ0JBQWdCO1FBQUNrTSxZQUFZLEVBQUVwRyxXQUFZO1FBQUFoRSxRQUFBLEVBQ3pDZ0gsa0JBQWtCLENBQUMzRixHQUFHLENBQUMsVUFBQytGLFVBQVUsRUFBRTBELEtBQUssRUFBSztVQUFBLElBQUFDLGdCQUFBLEVBQUFDLGdCQUFBO1VBQzdDO1VBQ0EsSUFBTUMsY0FBYyxHQUFHLENBQUE3RCxVQUFVLGFBQVZBLFVBQVUsZ0JBQUEyRCxnQkFBQSxHQUFWM0QsVUFBVSxDQUFFMkIsSUFBSSxjQUFBZ0MsZ0JBQUEsdUJBQWhCQSxnQkFBQSxDQUFrQkcsV0FBVyxDQUFDLENBQUMsS0FBSSxFQUFFO1VBQzVELElBQU1DLGNBQWMsR0FBRyxDQUFBL0QsVUFBVSxhQUFWQSxVQUFVLGdCQUFBNEQsZ0JBQUEsR0FBVjVELFVBQVUsQ0FBRTFGLElBQUksY0FBQXNKLGdCQUFBLHVCQUFoQkEsZ0JBQUEsQ0FBa0JFLFdBQVcsQ0FBQyxDQUFDLEtBQUksRUFBRTtVQUM1RCxJQUFNRSxXQUFXLEdBQ2ZILGNBQWMsQ0FBQ0ksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUNuQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQ3hDLFFBQVEsQ0FBQ29DLGNBQWMsQ0FBQyxJQUNuRixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQ0ssSUFBSSxDQUFDLFVBQUFDLEdBQUc7WUFBQSxPQUN6RUosY0FBYyxDQUFDSyxRQUFRLENBQUNELEdBQUcsQ0FBQztVQUFBLENBQzlCLENBQUM7VUFFSCxJQUFJSCxXQUFXLEVBQUU7WUFDZixvQkFBT25NLElBQUEsQ0FBQ3hELG1CQUFtQjtjQUE2QzJMLFVBQVUsRUFBRUE7WUFBVyxNQUFBMEIsTUFBQSxDQUEzRDFCLFVBQVUsQ0FBQzVGLEVBQUUsT0FBQXNILE1BQUEsQ0FBSTFCLFVBQVUsQ0FBQzFGLElBQUksQ0FBNkIsQ0FBQztVQUNwRztVQUVBLG9CQUNFekMsSUFBQSxDQUFDM0QsY0FBYztZQUViOEwsVUFBVSxFQUFFQSxVQUFXO1lBQ3ZCcUUsYUFBYSxFQUFFWCxLQUFNO1lBQ3JCWSxVQUFVLEVBQUUsU0FBWkEsVUFBVUEsQ0FBQTtjQUFBLE9BQVE5RCx3QkFBd0IsQ0FBQ1IsVUFBVSxDQUFDO1lBQUEsQ0FBQztZQUN2RDNGLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFBO2NBQUEsT0FBUTBGLHFCQUFxQixDQUFDQyxVQUFVLENBQUM7WUFBQTtVQUFDLE1BQUEwQixNQUFBLENBSnpDMUIsVUFBVSxDQUFDNUYsRUFBRSxPQUFBc0gsTUFBQSxDQUFJMUIsVUFBVSxDQUFDMUYsSUFBSSxDQUt6QyxDQUFDO1FBRU4sQ0FBQztNQUFDLENBQ2MsQ0FDbkIsRUFDQSxDQUFDLENBQUMsQ0FBQ1EsT0FBTyxJQUFJNEUsaUJBQWlCLEtBQUssRUFBRTlDLFdBQVcsSUFBSSxDQUFDLENBQUNnRCxrQkFBa0IsQ0FBQ3JDLE1BQU0sQ0FBQyxpQkFDaEYxRixJQUFBLENBQUMwQyxvQkFBb0I7UUFDbkJPLE9BQU8sRUFBRUEsT0FBTyxhQUFQQSxPQUFPLGNBQVBBLE9BQU8sR0FBSSxFQUFHO1FBQ3ZCSCxXQUFXLEVBQUUrRSxpQkFBa0I7UUFDL0IvRyxhQUFhLEVBQUVBLGFBQWM7UUFDN0JpRSxXQUFXLEVBQUVBLFdBQVk7UUFDekJSLG1CQUFtQixFQUFFdkQsS0FBSyxDQUFDdUQsbUJBQW9CO1FBQy9DVSxRQUFRLEVBQUVBLFFBQVM7UUFDbkJELE9BQU8sRUFBRUEsT0FBUTtRQUNqQkksT0FBTyxFQUFFQSxPQUFRO1FBQ2pCSyxXQUFXLEVBQUVBLFdBQVk7UUFDekJ0QixtQkFBbUIsRUFBRUEsbUJBQW9CO1FBQ3pDb0IsbUJBQW1CLEVBQUVBLG1CQUFvQjtRQUN6Q0MsZUFBZSxFQUFFQSxlQUFlLGFBQWZBLGVBQWUsY0FBZkEsZUFBZSxHQUFJLElBQUs7UUFDekNOLE9BQU8sRUFBRXVCLFdBQVk7UUFDckJaLHFCQUFxQixFQUFFQSxxQkFBc0I7UUFDN0NFLG1CQUFtQixFQUFFd0IsaUJBQWlCLElBQUksQ0FBQyxDQUFDVixxQkFBc0I7UUFDbEU5RCxTQUFTLEVBQUVSLEVBQUc7UUFDZDBELGFBQWEsRUFBRUE7TUFBYyxDQUM5QixDQUNGLEVBRUE2QixxQkFBcUIsaUJBQ3BCOUgsSUFBQSxDQUFDeEMsbUJBQW1CO1FBQUF1RCxRQUFBLGVBQ2xCZixJQUFBLENBQUM1QyxzQkFBc0I7VUFBQ3NQLFFBQVEsRUFBRTVGLGNBQWU7VUFBQzZGLE9BQU87UUFBQSxDQUFFO01BQUMsQ0FDekMsQ0FDdEIsRUFDQTFILFFBQVEsSUFBSUEsUUFBUSxDQUFDMkgsZUFBZSxpQkFDbkM1TSxJQUFBLENBQUNkLHVCQUF1QjtRQUFBNkIsUUFBQSxlQUN0QmYsSUFBQSxDQUFDMUQsV0FBVztVQUNWdVEsT0FBTyxFQUFFNUgsUUFBUSxDQUFDMkgsZUFBZ0I7VUFDbENFLE1BQU0sRUFBRWxHLGNBQWU7VUFDdkJtRyxTQUFTLEVBQUUsU0FBWEEsU0FBU0EsQ0FBRUMsU0FBUztZQUFBLE9BQUl4RyxzQkFBc0IsQ0FBQ3dHLFNBQVMsRUFBRSxTQUFTLENBQUM7VUFBQSxDQUFDO1VBQ3JFQyxRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBRUQsU0FBUztZQUFBLE9BQUl4RyxzQkFBc0IsQ0FBQ3dHLFNBQVMsRUFBRSxRQUFRLENBQUM7VUFBQSxDQUFDO1VBQ25FRSxnQkFBZ0IsRUFBRSxFQUFBOUcscUJBQUEsR0FBQXBGLEtBQUssQ0FBQ21NLGVBQWUsY0FBQS9HLHFCQUFBLHVCQUFyQkEscUJBQUEsQ0FBdUJnSCxVQUFVLE1BQUssSUFBSztVQUM3REMsVUFBVSxFQUFFck0sS0FBSyxDQUFDc00sUUFBUztVQUMzQkMsY0FBYyxFQUFFdEksUUFBUSxDQUFDdUksa0JBQW1CO1VBQzVDQyxjQUFjLEVBQUV4SSxRQUFRLENBQUN5SSxlQUFnQjtVQUN6Q0Msc0JBQXNCLEVBQUUxSSxRQUFRLENBQUMySTtRQUF5QixDQUMzRDtNQUFDLENBQ3FCLENBQzFCO0lBQUEsQ0FDaUIsQ0FBQyxlQUNyQjVOLElBQUEsQ0FBQ3pELHNCQUFzQjtNQUNyQnNSLE1BQU0sRUFBRSxDQUFDLENBQUM1RyxpQkFBa0I7TUFDNUI2RyxPQUFPLEVBQUVwRixrQkFBbUI7TUFDNUJQLFVBQVUsRUFBRWxCO0lBQWtCLENBQy9CLENBQUM7RUFBQSxDQUNrQixDQUFDO0FBRTNCLENBQUMsQ0FBQztBQUVGLElBQU04RyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQW1CQSxDQUFBQyxLQUFBLEVBU0U7RUFBQSxJQVJ6QkMsa0JBQWtCLEdBQUFELEtBQUEsQ0FBbEJDLGtCQUFrQjtJQUNsQkMsYUFBYSxHQUFBRixLQUFBLENBQWJFLGFBQWE7SUFDYkMsT0FBTyxHQUFBSCxLQUFBLENBQVBHLE9BQU87SUFDUEMsa0JBQWtCLEdBQUFKLEtBQUEsQ0FBbEJJLGtCQUFrQjtJQUNsQkMsZ0JBQWdCLEdBQUFMLEtBQUEsQ0FBaEJLLGdCQUFnQjtJQUNoQjFILFdBQVcsR0FBQXFILEtBQUEsQ0FBWHJILFdBQVc7SUFDWDJILE1BQU0sR0FBQU4sS0FBQSxDQUFOTSxNQUFNO0lBQ05oQixRQUFRLEdBQUFVLEtBQUEsQ0FBUlYsUUFBUTtFQUVSLElBQUFpQixLQUFBLEdBQWN4UixJQUFJLENBQUMsQ0FBQztJQUFaeVIsQ0FBQyxHQUFBRCxLQUFBLENBQURDLENBQUM7RUFDVCxJQUFBQyxpQkFBQSxHQUF5RGxQLGdCQUFnQixDQUFDLENBQUM7SUFBbkVtUCxpQkFBaUIsR0FBQUQsaUJBQUEsQ0FBakJDLGlCQUFpQjtJQUFFQyxrQkFBa0IsR0FBQUYsaUJBQUEsQ0FBbEJFLGtCQUFrQjtJQUFFQyxLQUFLLEdBQUFILGlCQUFBLENBQUxHLEtBQUs7RUFDcEQsSUFBTUMsS0FBSyxHQUFHaFAsUUFBUSxDQUFDLENBQUM7RUFDeEIsSUFBTXlHLFFBQVEsR0FBR3hKLE9BQU8sQ0FBQyxDQUFDO0VBQzFCLElBQU1nUyxXQUFXLEdBQUc3UyxNQUFNLENBQWlCLElBQUksQ0FBQztFQUNoRCxJQUFNOFMsa0JBQWtCLEdBQUc5UyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ3hDLElBQU0rUyxnQkFBZ0IsR0FBRy9TLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDdEMsSUFBTWdULGdCQUFnQixHQUFHaFQsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUN0QyxJQUFNaVQsa0JBQWtCLEdBQUdqVCxNQUFNLENBQUMsRUFBRSxDQUFDO0VBQ3JDLElBQU1rVCxnQkFBZ0IsR0FBR2xULE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDbEMsSUFBTW1ULHFCQUFxQixHQUFHblQsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUMzQyxJQUFNb1Qsa0JBQWtCLEdBQUdwVCxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ3hDLElBQU1xVCxxQkFBcUIsR0FBR3JULE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDM0MsSUFBTXNULFlBQVksR0FBR3RULE1BQU0sQ0FBZ0IsSUFBSSxDQUFDO0VBQ2hEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNdVQsaUJBQWlCLEdBQUd2VCxNQUFNLENBQWdCLElBQUksQ0FBQztFQUNyRCxJQUFNd1QsV0FBVyxHQUFHeFQsTUFBTSxDQUF3QixJQUFJLENBQUM7RUFDdkQsSUFBTXlULGVBQWUsR0FBR3pULE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDakMsSUFBTTBULGdCQUFnQixHQUFHMVQsTUFBTSxDQUFnQixJQUFJLENBQUM7RUFDcEQsSUFBTTJULHFCQUFxQixHQUFHM1QsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUMzQyxJQUFNNFQsc0JBQXNCLEdBQUc1VCxNQUFNLENBQWdCLElBQUksQ0FBQztFQUMxRCxJQUFBNlQsVUFBQSxHQUFvRDVULFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFBQTZULFVBQUEsR0FBQWhPLGNBQUEsQ0FBQStOLFVBQUE7SUFBNURFLGtCQUFrQixHQUFBRCxVQUFBO0lBQUVFLHFCQUFxQixHQUFBRixVQUFBO0VBQ2hELElBQUFHLFVBQUEsR0FBOENoVSxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUFpVSxVQUFBLEdBQUFwTyxjQUFBLENBQUFtTyxVQUFBO0lBQXRERSxlQUFlLEdBQUFELFVBQUE7SUFBRUUsa0JBQWtCLEdBQUFGLFVBQUE7RUFDMUMsSUFBQUcsVUFBQSxHQUFvRHBVLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFBQXFVLFVBQUEsR0FBQXhPLGNBQUEsQ0FBQXVPLFVBQUE7SUFBNURFLGtCQUFrQixHQUFBRCxVQUFBO0lBQUVFLHFCQUFxQixHQUFBRixVQUFBO0VBQ2hELElBQUFHLFVBQUEsR0FBd0V4VSxRQUFRLENBQTBCLENBQUMsQ0FBQyxDQUFDO0lBQUF5VSxXQUFBLEdBQUE1TyxjQUFBLENBQUEyTyxVQUFBO0lBQXRHRSw0QkFBNEIsR0FBQUQsV0FBQTtJQUFFRSwrQkFBK0IsR0FBQUYsV0FBQTtFQUVwRSxJQUFBRyxlQUFBLEdBaUJJOVQsY0FBYyxDQUFDO01BQ2pCK1QsTUFBTSxFQUFFN0MsYUFBYSxJQUFJN0ksU0FBUztNQUNsQzRJLGtCQUFrQixFQUFsQkEsa0JBQWtCO01BQ2xCRSxPQUFPLEVBQVBBLE9BQU87TUFDUHhILFdBQVcsRUFBWEEsV0FBVztNQUNYMkgsTUFBTSxFQUFOQTtJQUNGLENBQUMsQ0FBQztJQXRCQTBDLFFBQVEsR0FBQUYsZUFBQSxDQUFSRSxRQUFRO0lBQ1JDLGVBQWUsR0FBQUgsZUFBQSxDQUFmRyxlQUFlO0lBQ2ZDLHFCQUFxQixHQUFBSixlQUFBLENBQXJCSSxxQkFBcUI7SUFDckJDLGVBQWUsR0FBQUwsZUFBQSxDQUFmSyxlQUFlO0lBQ2ZDLFNBQVMsR0FBQU4sZUFBQSxDQUFUTSxTQUFTO0lBQ1RDLGNBQWMsR0FBQVAsZUFBQSxDQUFkTyxjQUFjO0lBQ2R2SyxjQUFjLEdBQUFnSyxlQUFBLENBQWRoSyxjQUFjO0lBQ2R3SyxjQUFjLEdBQUFSLGVBQUEsQ0FBZFEsY0FBYztJQUNkQyxXQUFXLEdBQUFULGVBQUEsQ0FBWFMsV0FBVztJQUNYQyxZQUFZLEdBQUFWLGVBQUEsQ0FBWlUsWUFBWTtJQUNaQyxhQUFhLEdBQUFYLGVBQUEsQ0FBYlcsYUFBYTtJQUNibk0sY0FBYyxHQUFBd0wsZUFBQSxDQUFkeEwsY0FBYztJQUNka0Isc0JBQXNCLEdBQUFzSyxlQUFBLENBQXRCdEssc0JBQXNCO0lBQ3RCa0wsY0FBYyxHQUFBWixlQUFBLENBQWRZLGNBQWM7SUFDZEMsWUFBWSxHQUFBYixlQUFBLENBQVphLFlBQVk7SUFDWkMsY0FBYyxHQUFBZCxlQUFBLENBQWRjLGNBQWM7RUFTaEIsSUFBTWhRLGtCQUFrQixHQUFHOUYsV0FBVyxDQUNwQyxVQUFDcUcsTUFBZSxFQUFLO0lBQ25Cc1AsYUFBYSxDQUFDdFAsTUFBTSxDQUFDO0VBQ3ZCLENBQUMsRUFDRCxDQUFDc1AsYUFBYSxDQUNoQixDQUFDOztFQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNSSx1QkFBdUIsR0FBRy9WLFdBQVcsQ0FBQyxZQUFNO0lBQ2hELElBQU1nVyxFQUFFLEdBQUdoRCxXQUFXLENBQUNpRCxPQUFPO0lBQzlCLElBQUksQ0FBQ0QsRUFBRSxFQUFFO0lBQ1QsSUFBUUUsU0FBUyxHQUFpQ0YsRUFBRSxDQUE1Q0UsU0FBUztNQUFFQyxZQUFZLEdBQW1CSCxFQUFFLENBQWpDRyxZQUFZO01BQUVDLFlBQVksR0FBS0osRUFBRSxDQUFuQkksWUFBWTtJQUM3QztJQUNBO0lBQ0EsSUFBTUMsa0JBQWtCLEdBQUdGLFlBQVksR0FBR3ZDLGVBQWUsQ0FBQ3FDLE9BQU8sR0FBR0MsU0FBUyxHQUFHRSxZQUFZO0lBRTVGLElBQU1FLFVBQVUsR0FBR0Qsa0JBQWtCLEdBQUcsRUFBRTtJQUMxQyxJQUFJL0MscUJBQXFCLENBQUMyQyxPQUFPLEtBQUtLLFVBQVUsRUFBRTtNQUNoRGhELHFCQUFxQixDQUFDMkMsT0FBTyxHQUFHSyxVQUFVO01BQzFDbkMscUJBQXFCLENBQUNtQyxVQUFVLENBQUM7SUFDbkM7SUFFQSxJQUFNQyxlQUFlLEdBQUdMLFNBQVMsR0FBRyxDQUFDO0lBQ3JDLElBQUkzQyxrQkFBa0IsQ0FBQzBDLE9BQU8sS0FBS00sZUFBZSxFQUFFO01BQ2xEaEQsa0JBQWtCLENBQUMwQyxPQUFPLEdBQUdNLGVBQWU7TUFDNUNoQyxrQkFBa0IsQ0FBQ2dDLGVBQWUsQ0FBQztJQUNyQztJQUVBLElBQU1DLGtCQUFrQixHQUFHSCxrQkFBa0IsR0FBRyxDQUFDO0lBQ2pELElBQUk3QyxxQkFBcUIsQ0FBQ3lDLE9BQU8sS0FBS08sa0JBQWtCLEVBQUU7TUFDeERoRCxxQkFBcUIsQ0FBQ3lDLE9BQU8sR0FBR08sa0JBQWtCO01BQ2xEN0IscUJBQXFCLENBQUM2QixrQkFBa0IsQ0FBQztJQUMzQztFQUNGLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRU47QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFLElBQU1DLGlCQUFpQixHQUFHelcsV0FBVyxDQUNuQyxZQUFvRTtJQUFBLElBQW5FMFcsSUFBeUQsR0FBQXZILFNBQUEsQ0FBQXZGLE1BQUEsUUFBQXVGLFNBQUEsUUFBQTVGLFNBQUEsR0FBQTRGLFNBQUEsTUFBRyxDQUFDLENBQUM7SUFDN0QsSUFBQXdILHFCQUFBLEdBQXFERCxJQUFJLENBQWpERSxtQkFBbUI7TUFBbkJBLG1CQUFtQixHQUFBRCxxQkFBQSxjQUFHLEtBQUssR0FBQUEscUJBQUE7TUFBQUUsYUFBQSxHQUFrQkgsSUFBSSxDQUFwQkksT0FBTztNQUFQQSxPQUFPLEdBQUFELGFBQUEsY0FBRyxDQUFDLEdBQUFBLGFBQUE7SUFDaEQsSUFBTUUsR0FBRyxHQUFHLFNBQU5BLEdBQUdBLENBQUEsRUFBUztNQUNoQkMscUJBQXFCLENBQUMsWUFBTTtRQUMxQixJQUFNaEIsRUFBRSxHQUFHaEQsV0FBVyxDQUFDaUQsT0FBTztRQUM5QixJQUFJLENBQUNELEVBQUUsRUFBRTtRQUNULElBQUlZLG1CQUFtQixJQUFJekQsZ0JBQWdCLENBQUM4QyxPQUFPLEVBQUU7UUFDckRELEVBQUUsQ0FBQ0UsU0FBUyxHQUFHRixFQUFFLENBQUNHLFlBQVk7UUFDOUJKLHVCQUF1QixDQUFDLENBQUM7TUFDM0IsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUllLE9BQU8sR0FBRyxDQUFDLEVBQUVuSSxVQUFVLENBQUNvSSxHQUFHLEVBQUVELE9BQU8sQ0FBQyxNQUNwQ0MsR0FBRyxDQUFDLENBQUM7RUFDWixDQUFDLEVBQ0QsQ0FBQ2hCLHVCQUF1QixDQUMxQixDQUFDO0VBRUQsSUFBTWtCLGdCQUFnQixHQUFHalgsV0FBVyxDQUFDLFlBQU07SUFDekMsSUFBSTZULGdCQUFnQixDQUFDb0MsT0FBTyxLQUFLLElBQUksRUFBRTtJQUN2Q2lCLG9CQUFvQixDQUFDckQsZ0JBQWdCLENBQUNvQyxPQUFPLENBQUM7SUFDOUNwQyxnQkFBZ0IsQ0FBQ29DLE9BQU8sR0FBRyxJQUFJO0VBQ2pDLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRU47QUFDRjtBQUNBO0FBQ0E7RUFDRSxJQUFNa0IsZUFBZSxHQUFHblgsV0FBVyxDQUNqQyxVQUFDb1gsR0FBVyxFQUFLO0lBQ2ZILGdCQUFnQixDQUFDLENBQUM7SUFDbEIsSUFBTWpCLEVBQUUsR0FBR2hELFdBQVcsQ0FBQ2lELE9BQU87SUFDOUIsSUFBSSxDQUFDRCxFQUFFLEVBQUU7SUFDVCxJQUFNcUIsSUFBSSxHQUFHckIsRUFBRSxDQUFDRSxTQUFTO0lBQ3pCLElBQU1vQixRQUFRLEdBQUdGLEdBQUcsR0FBR0MsSUFBSTtJQUMzQixJQUFJNVMsSUFBSSxDQUFDOFMsR0FBRyxDQUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFFNUIsSUFBTUUsUUFBUSxHQUNaN1MsdUJBQXVCLEdBQ3ZCLENBQUNDLDJCQUEyQixHQUFHRCx1QkFBdUIsSUFDcERGLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRUQsSUFBSSxDQUFDOFMsR0FBRyxDQUFDRCxRQUFRLENBQUMsR0FBR3pTLDRCQUE0QixDQUFDO0lBRWxFLElBQU00UyxTQUFTLEdBQUdDLFdBQVcsQ0FBQ0MsR0FBRyxDQUFDLENBQUM7SUFDbkMsSUFBTUMsS0FBSSxHQUFHLFNBQVBBLElBQUlBLENBQUlELEdBQVcsRUFBSztNQUM1QixJQUFNRSxRQUFRLEdBQUdwVCxJQUFJLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQ2lULEdBQUcsR0FBR0YsU0FBUyxJQUFJRCxRQUFRLENBQUM7TUFDMUQ7TUFDQTtNQUNBLElBQU1NLEtBQUssR0FBR0QsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFBcFQsSUFBQSxDQUFBc1QsR0FBQSxDQUFHLENBQUMsRUFBSyxDQUFDLEVBQUUsR0FBR0YsUUFBUSxDQUFDO01BQzVEN0IsRUFBRSxDQUFDRSxTQUFTLEdBQUdtQixJQUFJLEdBQUdDLFFBQVEsR0FBR1EsS0FBSztNQUN0Qy9CLHVCQUF1QixDQUFDLENBQUM7TUFDekJsQyxnQkFBZ0IsQ0FBQ29DLE9BQU8sR0FBRzRCLFFBQVEsR0FBRyxDQUFDLEdBQUdiLHFCQUFxQixDQUFDWSxLQUFJLENBQUMsR0FBRyxJQUFJO0lBQzlFLENBQUM7SUFDRC9ELGdCQUFnQixDQUFDb0MsT0FBTyxHQUFHZSxxQkFBcUIsQ0FBQ1ksS0FBSSxDQUFDO0VBQ3hELENBQUMsRUFDRCxDQUFDWCxnQkFBZ0IsRUFBRWxCLHVCQUF1QixDQUM1QyxDQUFDO0VBRUQ5VixTQUFTLENBQUM7SUFBQSxPQUFNZ1gsZ0JBQWdCO0VBQUEsR0FBRSxDQUFDQSxnQkFBZ0IsQ0FBQyxDQUFDO0VBRXJELElBQU1lLGVBQWUsR0FBR2hZLFdBQVcsQ0FBQyxVQUFDNk4sSUFBWSxFQUFLO0lBQ3BELElBQUlwSixJQUFJLENBQUM4UyxHQUFHLENBQUMzRCxlQUFlLENBQUNxQyxPQUFPLEdBQUdwSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDbEQrRixlQUFlLENBQUNxQyxPQUFPLEdBQUdwSSxJQUFJO0lBQzlCLElBQUk4RixXQUFXLENBQUNzQyxPQUFPLEVBQUU7TUFDdkJ0QyxXQUFXLENBQUNzQyxPQUFPLENBQUN0TixLQUFLLENBQUNzUCxNQUFNLE1BQUFsSyxNQUFBLENBQU1GLElBQUksT0FBSTtJQUNoRDtFQUNGLENBQUMsRUFBRSxFQUFFLENBQUM7RUFFTixJQUFNcUssY0FBYyxHQUFHbFksV0FBVyxDQUFDLFlBQU07SUFDdkMwVCxpQkFBaUIsQ0FBQ3VDLE9BQU8sR0FBRyxJQUFJO0lBQ2hDK0IsZUFBZSxDQUFDLENBQUMsQ0FBQztFQUNwQixDQUFDLEVBQUUsQ0FBQ0EsZUFBZSxDQUFDLENBQUM7O0VBRXJCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNRyxjQUFjLEdBQUduWSxXQUFXLENBQUMsWUFBTTtJQUN2QyxJQUFNZ1csRUFBRSxHQUFHaEQsV0FBVyxDQUFDaUQsT0FBTztJQUM5QixJQUFJLENBQUNELEVBQUUsSUFBSXBDLGVBQWUsQ0FBQ3FDLE9BQU8sSUFBSSxDQUFDLEVBQUU7SUFDekMsSUFBTW1DLFNBQVMsR0FBRzNULElBQUksQ0FBQzRULEdBQUcsQ0FBQyxDQUFDLEVBQUVyQyxFQUFFLENBQUNHLFlBQVksR0FBR0gsRUFBRSxDQUFDSSxZQUFZLEdBQUdKLEVBQUUsQ0FBQ0UsU0FBUyxDQUFDO0lBQy9FOEIsZUFBZSxDQUFDdlQsSUFBSSxDQUFDNFQsR0FBRyxDQUFDLENBQUMsRUFBRXpFLGVBQWUsQ0FBQ3FDLE9BQU8sR0FBR21DLFNBQVMsQ0FBQyxDQUFDO0VBQ25FLENBQUMsRUFBRSxDQUFDSixlQUFlLENBQUMsQ0FBQzs7RUFFckI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtFQUNFLElBQU1NLGdCQUFnQixHQUFHdFksV0FBVyxDQUFDLFlBQU07SUFDekMsSUFBSSxDQUFDMFQsaUJBQWlCLENBQUN1QyxPQUFPLElBQUlyQyxlQUFlLENBQUNxQyxPQUFPLElBQUksQ0FBQyxFQUFFO0lBQ2hFdkMsaUJBQWlCLENBQUN1QyxPQUFPLEdBQUcsSUFBSTtJQUNoQ2tDLGNBQWMsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsRUFBRSxDQUFDQSxjQUFjLENBQUMsQ0FBQztFQUVwQixJQUFNSSxzQkFBc0IsR0FBR3ZZLFdBQVcsQ0FBQyxZQUFNO0lBQy9DaVgsZ0JBQWdCLENBQUMsQ0FBQztJQUNsQnFCLGdCQUFnQixDQUFDLENBQUM7RUFDcEIsQ0FBQyxFQUFFLENBQUNyQixnQkFBZ0IsRUFBRXFCLGdCQUFnQixDQUFDLENBQUM7RUFFeEMsSUFBTUUsV0FBVyxHQUFHeFksV0FBVyxDQUFDLFVBQUMyUCxVQUFrQixFQUFLO0lBQ3RELElBQU1xRyxFQUFFLEdBQUdoRCxXQUFXLENBQUNpRCxPQUFPO0lBQzlCLElBQU13QyxRQUFRLEdBQUc5RSxXQUFXLENBQUNzQyxPQUFPO0lBQ3BDLElBQUksQ0FBQ0QsRUFBRSxJQUFJLENBQUN5QyxRQUFRLEVBQUUsT0FBTyxJQUFJO0lBRWpDLElBQU1DLFVBQVUsR0FBRzFDLEVBQUUsQ0FBQzJDLGFBQWEsdUJBQUE1SyxNQUFBLENBQW1DNEIsVUFBVSxRQUFJLENBQUM7SUFDckYsSUFBSSxDQUFDK0ksVUFBVSxFQUFFLE9BQU8sSUFBSTtJQUU1QixJQUFNRSxZQUFZLEdBQUc1QyxFQUFFLENBQUM2QyxxQkFBcUIsQ0FBQyxDQUFDLENBQUN6QixHQUFHO0lBQ25ELElBQU0wQixXQUFXLEdBQUdKLFVBQVUsQ0FBQ0cscUJBQXFCLENBQUMsQ0FBQyxDQUFDekIsR0FBRyxHQUFHd0IsWUFBWSxHQUFHNUMsRUFBRSxDQUFDRSxTQUFTO0lBQ3hGLElBQU02QyxhQUFhLEdBQUdOLFFBQVEsQ0FBQ0kscUJBQXFCLENBQUMsQ0FBQyxDQUFDekIsR0FBRyxHQUFHd0IsWUFBWSxHQUFHNUMsRUFBRSxDQUFDRSxTQUFTO0lBQ3hGLE9BQU87TUFBRUYsRUFBRSxFQUFGQSxFQUFFO01BQUU4QyxXQUFXLEVBQVhBLFdBQVc7TUFBRUUsVUFBVSxFQUFFRCxhQUFhLEdBQUdEO0lBQVksQ0FBQztFQUNyRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sSUFBTUcsZ0JBQWdCLEdBQUdqWixXQUFXLENBQ2xDLFVBQUMyUCxVQUFrQixFQUFLO0lBQ3RCLElBQU11SixRQUFRLEdBQUdWLFdBQVcsQ0FBQzdJLFVBQVUsQ0FBQztJQUN4QyxJQUFJLENBQUN1SixRQUFRLEVBQUU7SUFDZixJQUFRbEQsRUFBRSxHQUE4QmtELFFBQVEsQ0FBeENsRCxFQUFFO01BQUU4QyxXQUFXLEdBQWlCSSxRQUFRLENBQXBDSixXQUFXO01BQUVFLFVBQVUsR0FBS0UsUUFBUSxDQUF2QkYsVUFBVTs7SUFFbkM7SUFDQTtJQUNBdEYsaUJBQWlCLENBQUN1QyxPQUFPLEdBQUd0RyxVQUFVO0lBRXRDLElBQU13SixNQUFNLEdBQUc1VSxnQkFBZ0IsQ0FBQ3lSLEVBQUUsQ0FBQ0ksWUFBWSxDQUFDO0lBQ2hELElBQU1nRCxlQUFlLEdBQUczVSxJQUFJLENBQUM0VCxHQUFHLENBQUMsQ0FBQyxFQUFFUyxXQUFXLEdBQUdLLE1BQU0sQ0FBQztJQUN6RDtJQUNBO0lBQ0EsSUFBSUMsZUFBZSxJQUFJcEQsRUFBRSxDQUFDRSxTQUFTLEVBQUU7TUFDbkM4QixlQUFlLENBQUMsQ0FBQyxDQUFDO01BQ2xCakMsdUJBQXVCLENBQUMsQ0FBQztNQUN6QjtJQUNGOztJQUVBO0lBQ0E7SUFDQTtJQUNBaUMsZUFBZSxDQUFDdlQsSUFBSSxDQUFDNFQsR0FBRyxDQUFDLENBQUMsRUFBRXJDLEVBQUUsQ0FBQ0ksWUFBWSxHQUFHNEMsVUFBVSxHQUFHRyxNQUFNLENBQUMsQ0FBQztJQUNuRWhDLGVBQWUsQ0FBQ2lDLGVBQWUsQ0FBQztFQUNsQyxDQUFDLEVBQ0QsQ0FBQ1osV0FBVyxFQUFFUixlQUFlLEVBQUVqQyx1QkFBdUIsRUFBRW9CLGVBQWUsQ0FDekUsQ0FBQzs7RUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNa0MsYUFBYSxHQUFHclosV0FBVyxDQUFDLFlBQWU7SUFDL0MsSUFBSSxDQUFDMFQsaUJBQWlCLENBQUN1QyxPQUFPLEVBQUUsT0FBTyxLQUFLO0lBQzVDLElBQUlyQyxlQUFlLENBQUNxQyxPQUFPLEdBQUcsQ0FBQyxFQUFFO01BQy9CLElBQU1pRCxRQUFRLEdBQUdWLFdBQVcsQ0FBQzlFLGlCQUFpQixDQUFDdUMsT0FBTyxDQUFDO01BQ3ZELElBQUlpRCxRQUFRLEVBQUU7UUFDWixJQUFNQyxNQUFNLEdBQUc1VSxnQkFBZ0IsQ0FBQzJVLFFBQVEsQ0FBQ2xELEVBQUUsQ0FBQ0ksWUFBWSxDQUFDO1FBQ3pELElBQU1rRCxRQUFRLEdBQUc3VSxJQUFJLENBQUM0VCxHQUFHLENBQUMsQ0FBQyxFQUFFYSxRQUFRLENBQUNsRCxFQUFFLENBQUNJLFlBQVksR0FBRzhDLFFBQVEsQ0FBQ0YsVUFBVSxHQUFHRyxNQUFNLENBQUM7UUFDckZuQixlQUFlLENBQUN2VCxJQUFJLENBQUNDLEdBQUcsQ0FBQ2tQLGVBQWUsQ0FBQ3FDLE9BQU8sRUFBRXFELFFBQVEsQ0FBQyxDQUFDO01BQzlEO0lBQ0Y7SUFDQSxPQUFPLElBQUk7RUFDYixDQUFDLEVBQUUsQ0FBQ2QsV0FBVyxFQUFFUixlQUFlLENBQUMsQ0FBQztFQUVsQyxJQUFNdUIseUJBQXlCLEdBQUd2WixXQUFXLENBQUMsWUFBTTtJQUNsRCxJQUFNZ1csRUFBRSxHQUFHaEQsV0FBVyxDQUFDaUQsT0FBTztJQUM5QixJQUFJLENBQUNELEVBQUUsRUFBRTtJQUNUa0MsY0FBYyxDQUFDLENBQUM7SUFDaEI7SUFDQWYsZUFBZSxDQUFDbkIsRUFBRSxDQUFDRyxZQUFZLEdBQUdILEVBQUUsQ0FBQ0ksWUFBWSxDQUFDO0VBQ3BELENBQUMsRUFBRSxDQUFDOEIsY0FBYyxFQUFFZixlQUFlLENBQUMsQ0FBQztFQUVyQyxJQUFNcUMsb0JBQW9CLEdBQUd4WixXQUFXLENBQ3RDLFVBQUN5WixDQUFnQyxFQUFLO0lBQ3BDLElBQU1DLFNBQVMsR0FBR0QsQ0FBQyxDQUFDRSxhQUFhO0lBRWpDLElBQUlsRyxZQUFZLENBQUN3QyxPQUFPLEtBQUssSUFBSSxFQUFFO01BQ2pDaUIsb0JBQW9CLENBQUN6RCxZQUFZLENBQUN3QyxPQUFPLENBQUM7SUFDNUM7SUFFQXhDLFlBQVksQ0FBQ3dDLE9BQU8sR0FBR2UscUJBQXFCLENBQUMsWUFBTTtNQUNqRHZELFlBQVksQ0FBQ3dDLE9BQU8sR0FBRyxJQUFJO01BQzNCLElBQVFDLFNBQVMsR0FBaUN3RCxTQUFTLENBQW5EeEQsU0FBUztRQUFFQyxZQUFZLEdBQW1CdUQsU0FBUyxDQUF4Q3ZELFlBQVk7UUFBRUMsWUFBWSxHQUFLc0QsU0FBUyxDQUExQnRELFlBQVk7TUFFN0MsSUFBTXdELGFBQWEsR0FBRzFELFNBQVMsR0FBRzdDLGdCQUFnQixDQUFDNEMsT0FBTztNQUUxRCxJQUFJMkQsYUFBYSxFQUFFO1FBQ2pCeEcsa0JBQWtCLENBQUM2QyxPQUFPLEdBQUcsRUFBRTtNQUNqQztNQUVBLElBQU00RCxZQUFZLEdBQUcxRCxZQUFZLEdBQUdELFNBQVMsR0FBR0UsWUFBWSxHQUFHaEQsa0JBQWtCLENBQUM2QyxPQUFPO01BRXpGLElBQUk0RCxZQUFZLEVBQUU7UUFDaEJ6RyxrQkFBa0IsQ0FBQzZDLE9BQU8sR0FBRyxFQUFFO01BQ2pDO01BRUE5QyxnQkFBZ0IsQ0FBQzhDLE9BQU8sR0FBRyxDQUFDNEQsWUFBWTtNQUN4Q3hHLGdCQUFnQixDQUFDNEMsT0FBTyxHQUFHQyxTQUFTOztNQUVwQztNQUNBO01BQ0E7TUFDQSxJQUFJLENBQUN4QyxpQkFBaUIsQ0FBQ3VDLE9BQU8sRUFBRWtDLGNBQWMsQ0FBQyxDQUFDO01BRWhEcEMsdUJBQXVCLENBQUMsQ0FBQztNQUV6QixJQUFJOEQsWUFBWSxJQUFJdEgsZ0JBQWdCLEVBQUU7UUFDcENBLGdCQUFnQixDQUFDLENBQUM7TUFDcEI7TUFFQXNELFlBQVksQ0FBQzZELFNBQVMsQ0FBQztJQUN6QixDQUFDLENBQUM7RUFDSixDQUFDLEVBQ0QsQ0FBQ25ILGdCQUFnQixFQUFFc0QsWUFBWSxFQUFFRSx1QkFBdUIsRUFBRW9DLGNBQWMsQ0FDMUUsQ0FBQzs7RUFFRDtFQUNBLElBQU0yQixjQUFjLEdBQUczWixNQUFNLENBQUNzVixXQUFXLENBQUM7RUFDMUMsSUFBTXNFLGlCQUFpQixHQUFHNVosTUFBTSxDQUFDMlYsY0FBYyxDQUFDO0VBQ2hELElBQU1rRSxxQkFBcUIsR0FBRzdaLE1BQU0sQ0FBQ21TLGtCQUFrQixDQUFDO0VBQ3hELElBQU0ySCxtQkFBbUIsR0FBRzlaLE1BQU0sQ0FDaEMsVUFDRWdILE9BQWUsRUFDZjBELFdBQThCLEVBQzlCcVAsS0FBYyxFQUNkQyxpQkFBMEIsRUFDMUJDLFFBQTJCLEVBQzNCQyxLQUFjLEVBQ2RDLElBQWE7SUFBQSxPQUNWUixjQUFjLENBQUM3RCxPQUFPLENBQUM5TyxPQUFPLEVBQUUwRCxXQUFXLEVBQUVxUCxLQUFLLEVBQUVDLGlCQUFpQixFQUFFQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxDQUFDO0VBQUEsQ0FDcEcsQ0FBQztFQUNELElBQU1DLHNCQUFzQixHQUFHcGEsTUFBTSxDQUFDO0lBQUEsT0FBTTRaLGlCQUFpQixDQUFDOUQsT0FBTyxDQUFDLENBQUM7RUFBQSxFQUFDOztFQUV4RTtFQUNBNkQsY0FBYyxDQUFDN0QsT0FBTyxHQUFHUixXQUFXO0VBQ3BDc0UsaUJBQWlCLENBQUM5RCxPQUFPLEdBQUdILGNBQWM7RUFDMUNrRSxxQkFBcUIsQ0FBQy9ELE9BQU8sR0FBRzNELGtCQUFrQjs7RUFFbEQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRSxJQUFNa0ksZUFBZSxHQUFHcmEsTUFBTSxDQUFDK1UsUUFBUSxDQUFDO0VBQ3hDc0YsZUFBZSxDQUFDdkUsT0FBTyxHQUFHZixRQUFRO0VBQ2xDLElBQU11RiwrQkFBK0IsR0FBR3RhLE1BQU0sQ0FBQzJVLDRCQUE0QixDQUFDO0VBQzVFMkYsK0JBQStCLENBQUN4RSxPQUFPLEdBQUduQiw0QkFBNEI7RUFFdEUsSUFBTS9LLHFCQUFxQixHQUFHL0osV0FBVyxDQUN2QyxVQUFDaUgsU0FBaUIsRUFBRTZDLFVBQWtCLEVBQUs7SUFDekMsSUFBSSxFQUFDQSxVQUFVLGFBQVZBLFVBQVUsZUFBVkEsVUFBVSxDQUFFNFEsSUFBSSxDQUFDLENBQUMsR0FBRTtJQUN6QixJQUFJRCwrQkFBK0IsQ0FBQ3hFLE9BQU8sQ0FBQ2hQLFNBQVMsQ0FBQyxFQUFFO0lBQ3hELElBQU0wVCxlQUFlLEdBQUdILGVBQWUsQ0FBQ3ZFLE9BQU87SUFDL0MsSUFBTTJFLHdCQUF3QixHQUFHN1osY0FBYyxDQUFDK1IsS0FBSyxDQUFDO0lBQ3REQyxLQUFLLENBQUNqUCxNQUFNLENBQUMrVyxxQkFBcUIsRUFBRTtNQUNsQ0MsVUFBVSxFQUFFRix3QkFBd0IsR0FBRyxhQUFhLEdBQUc5SCxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRTlFO0lBQ2hFLENBQUMsQ0FBQztJQUNGK0csK0JBQStCLENBQUMsVUFBQW5ILElBQUk7TUFBQSxPQUFBdEksYUFBQSxDQUFBQSxhQUFBLEtBQVVzSSxJQUFJLE9BQUFtTixlQUFBLEtBQUc5VCxTQUFTLEVBQUcsSUFBSTtJQUFBLENBQUcsQ0FBQztJQUV6RSxJQUFNK1QsYUFBYSxHQUFHTCxlQUFlLENBQUNNLElBQUksQ0FBQyxVQUFBQyxHQUFHO01BQUEsT0FBSUEsR0FBRyxDQUFDelUsRUFBRSxLQUFLUSxTQUFTO0lBQUEsRUFBQztJQUN2RSxJQUFNa1UsaUJBQWlCLEdBQUcsQ0FBQyxFQUFDSCxhQUFhLGFBQWJBLGFBQWEsZUFBYkEsYUFBYSxDQUFFOVIsT0FBTyxLQUFJWSxVQUFVLEtBQUs0SSxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQ3BGLElBQUl5SSxpQkFBaUIsRUFBRTtNQUNyQixJQUFNQyxnQkFBZSxHQUFHVCxlQUFlLENBQ3BDakwsTUFBTSxDQUFDLFVBQUF3TCxHQUFHO1FBQUEsT0FBSUEsR0FBRyxDQUFDdFEsSUFBSSxLQUFLaEssZUFBZSxDQUFDeUssSUFBSSxJQUFJNlAsR0FBRyxDQUFDM1EsSUFBSSxDQUFDOUQsRUFBRSxLQUFLK0QsUUFBUSxDQUFDL0QsRUFBRSxDQUFDNkUsUUFBUSxDQUFDLENBQUM7TUFBQSxFQUFDLENBQzFGK1AsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ1QsSUFBSUQsZ0JBQWUsYUFBZkEsZ0JBQWUsZUFBZkEsZ0JBQWUsQ0FBRWpVLE9BQU8sRUFBRTtRQUM1QixJQUFNbVUsZ0JBQWdCLEdBQUdwUCxLQUFLLENBQUNDLE9BQU8sQ0FBQ2lQLGdCQUFlLENBQUN2USxXQUFXLENBQUMsR0FDL0R1USxnQkFBZSxDQUFDdlEsV0FBVyxHQUMzQnFCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDaVAsZ0JBQWUsQ0FBQzlSLE9BQU8sQ0FBQyxHQUNwQzhSLGdCQUFlLENBQUM5UixPQUFPLEdBQ3ZCLEVBQUU7UUFDUndRLGNBQWMsQ0FBQzdELE9BQU8sQ0FBQ21GLGdCQUFlLENBQUNqVSxPQUFPLEVBQUVtVSxnQkFBZ0IsQ0FBQztRQUNqRTtNQUNGO0lBQ0Y7SUFFQXhCLGNBQWMsQ0FBQzdELE9BQU8sQ0FBQ25NLFVBQVUsQ0FBQztFQUNwQyxDQUFDLEVBQ0QsQ0FBQ2lKLEtBQUssRUFBRUQsS0FBSyxFQUFFSixDQUFDLEVBQUVsSSxRQUFRLENBQUMvRCxFQUFFLENBQy9CLENBQUM7RUFFRHhHLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBSStaLHFCQUFxQixDQUFDL0QsT0FBTyxFQUFFO01BQ2pDK0QscUJBQXFCLENBQUMvRCxPQUFPLENBQzNCZ0UsbUJBQW1CLENBQUNoRSxPQUFPLEVBQzNCc0Usc0JBQXNCLENBQUN0RSxPQUFPLEVBQzlCWixlQUFlLEVBQ2ZDLFNBQ0YsQ0FBQztJQUNIO0VBQ0YsQ0FBQyxFQUFFLENBQUNELGVBQWUsRUFBRUMsU0FBUyxDQUFDLENBQUM7RUFFaENyVixTQUFTLENBQUMsWUFBTTtJQUNkaVQsZ0JBQWdCLENBQUMrQyxPQUFPLEdBQUdiLHFCQUFxQjtFQUNsRCxDQUFDLEVBQUUsQ0FBQ0EscUJBQXFCLENBQUMsQ0FBQzs7RUFFM0I7RUFDQW5WLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBSW9WLGVBQWUsRUFBRTtNQUNuQmxDLGdCQUFnQixDQUFDOEMsT0FBTyxHQUFHLEtBQUs7TUFDaEM3QyxrQkFBa0IsQ0FBQzZDLE9BQU8sR0FBRyxFQUFFO0lBQ2pDO0VBQ0YsQ0FBQyxFQUFFLENBQUNaLGVBQWUsQ0FBQyxDQUFDO0VBRXJCcFYsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJLENBQUNnVCxrQkFBa0IsQ0FBQ2dELE9BQU8sRUFBRTtNQUMvQmhELGtCQUFrQixDQUFDZ0QsT0FBTyxHQUFHLElBQUk7TUFDakNMLGNBQWMsQ0FBQyxDQUFDO0lBQ2xCO0VBQ0YsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFTjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBM1YsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJLENBQUNvVixlQUFlLElBQUksQ0FBQ0MsU0FBUyxFQUFFLE9BQU8vTCxTQUFTO0lBQ3BELElBQUksQ0FBQ3lKLFdBQVcsQ0FBQ2lELE9BQU8sRUFBRSxPQUFPMU0sU0FBUztJQUUxQyxJQUFJZ1MsS0FBb0IsR0FBRyxJQUFJO0lBQy9CLElBQUlDLFVBQVUsR0FBR3hJLFdBQVcsQ0FBQ2lELE9BQU8sQ0FBQ0UsWUFBWTtJQUVqRCxJQUFNc0YsS0FBSSxHQUFHLFNBQVBBLElBQUlBLENBQUEsRUFBUztNQUNqQixJQUFNekYsRUFBRSxHQUFHaEQsV0FBVyxDQUFDaUQsT0FBTztNQUM5QixJQUFJLENBQUNELEVBQUUsRUFBRTtRQUNQdUYsS0FBSyxHQUFHLElBQUk7UUFDWjtNQUNGO01BQ0EsSUFBSWxDLGFBQWEsQ0FBQyxDQUFDLEVBQUU7UUFDbkI7UUFDQTtRQUNBdEQsdUJBQXVCLENBQUMsQ0FBQztRQUN6QndGLEtBQUssR0FBR3ZFLHFCQUFxQixDQUFDeUUsS0FBSSxDQUFDO1FBQ25DO01BQ0Y7TUFDQSxJQUFNQyxhQUFhLEdBQUcxRixFQUFFLENBQUNHLFlBQVk7TUFDckMsSUFBSXVGLGFBQWEsS0FBS0YsVUFBVSxFQUFFO1FBQ2hDQSxVQUFVLEdBQUdFLGFBQWE7UUFDMUIsSUFBSSxDQUFDdkksZ0JBQWdCLENBQUM4QyxPQUFPLEVBQUU7VUFDN0JELEVBQUUsQ0FBQ0UsU0FBUyxHQUFHd0YsYUFBYTtRQUM5QjtRQUNBM0YsdUJBQXVCLENBQUMsQ0FBQztNQUMzQjtNQUNBd0YsS0FBSyxHQUFHdkUscUJBQXFCLENBQUN5RSxLQUFJLENBQUM7SUFDckMsQ0FBQztJQUVERixLQUFLLEdBQUd2RSxxQkFBcUIsQ0FBQ3lFLEtBQUksQ0FBQztJQUNuQyxPQUFPLFlBQU07TUFDWCxJQUFJRixLQUFLLElBQUksSUFBSSxFQUFFckUsb0JBQW9CLENBQUNxRSxLQUFLLENBQUM7SUFDaEQsQ0FBQztFQUNILENBQUMsRUFBRSxDQUFDbEcsZUFBZSxFQUFFQyxTQUFTLEVBQUUrRCxhQUFhLEVBQUV0RCx1QkFBdUIsQ0FBQyxDQUFDOztFQUV4RTtFQUNBOVYsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJb1YsZUFBZSxJQUFJckMsV0FBVyxDQUFDaUQsT0FBTyxJQUFJLENBQUN2QyxpQkFBaUIsQ0FBQ3VDLE9BQU8sRUFBRTtNQUN4RVEsaUJBQWlCLENBQUM7UUFBRUcsbUJBQW1CLEVBQUU7TUFBSyxDQUFDLENBQUM7SUFDbEQ7RUFDRixDQUFDLEVBQUUsQ0FBQ3ZCLGVBQWUsRUFBRW9CLGlCQUFpQixDQUFDLENBQUM7RUFFeEMsSUFBTWtGLHVCQUF1QixHQUFHeGIsTUFBTSxDQUFnQixJQUFJLENBQUM7O0VBRTNEO0VBQ0FGLFNBQVMsQ0FBQyxZQUFNO0lBQ2QsSUFBSSxDQUFDa1YsZUFBZSxFQUFFO0lBQ3RCd0csdUJBQXVCLENBQUMxRixPQUFPLEdBQUcsSUFBSTtJQUN0Q2lDLGNBQWMsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsRUFBRSxDQUFDL0MsZUFBZSxFQUFFK0MsY0FBYyxDQUFDLENBQUM7O0VBRXJDO0VBQ0FqWSxTQUFTLENBQUMsWUFBTTtJQUNkLElBQUlrVixlQUFlLElBQUlDLHFCQUFxQixFQUFFO0lBRTlDLElBQUl6RixVQUF5QixHQUFHLElBQUk7SUFDcEMsS0FBSyxJQUFJSSxLQUFLLEdBQUdtRixRQUFRLENBQUN0TCxNQUFNLEdBQUcsQ0FBQyxFQUFFbUcsS0FBSyxJQUFJLENBQUMsRUFBRUEsS0FBSyxJQUFJLENBQUMsRUFBRTtNQUFBLElBQUE2TCxlQUFBO01BQzVELEtBQUFBLGVBQUEsR0FBSTFHLFFBQVEsQ0FBQ25GLEtBQUssQ0FBQyxjQUFBNkwsZUFBQSxnQkFBQUEsZUFBQSxHQUFmQSxlQUFBLENBQWlCblYsRUFBRSxjQUFBbVYsZUFBQSxlQUFuQkEsZUFBQSxDQUFxQnRMLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUNoRFgsVUFBVSxHQUFHdUYsUUFBUSxDQUFDbkYsS0FBSyxDQUFDLENBQUN0SixFQUFFO1FBQy9CO01BQ0Y7SUFDRjtJQUNBLElBQUksQ0FBQ2tKLFVBQVUsSUFBSUEsVUFBVSxLQUFLZ00sdUJBQXVCLENBQUMxRixPQUFPLEVBQUU7SUFFbkUwRix1QkFBdUIsQ0FBQzFGLE9BQU8sR0FBR3RHLFVBQVU7SUFDNUN3RCxnQkFBZ0IsQ0FBQzhDLE9BQU8sR0FBRyxLQUFLO0lBQ2hDZSxxQkFBcUIsQ0FBQztNQUFBLE9BQU1pQyxnQkFBZ0IsQ0FBQ3RKLFVBQVUsQ0FBQztJQUFBLEVBQUM7RUFDM0QsQ0FBQyxFQUFFLENBQUN1RixRQUFRLEVBQUVDLGVBQWUsRUFBRUMscUJBQXFCLEVBQUU2RCxnQkFBZ0IsQ0FBQyxDQUFDOztFQUV4RTtFQUNBO0VBQ0E7RUFDQSxJQUFNNEMsZ0JBQWdCLEdBQUcxYixNQUFNLENBQWdCLElBQUksQ0FBQztFQUNwRCxJQUFNMmIscUJBQXFCLEdBQUczYixNQUFNLENBQVMsQ0FBQyxDQUFDOztFQUUvQztFQUNBRixTQUFTLENBQUMsWUFBTTtJQUNkNlQscUJBQXFCLENBQUNtQyxPQUFPLEdBQUcsS0FBSztJQUNyQ2xDLHNCQUFzQixDQUFDa0MsT0FBTyxHQUFHLElBQUk7SUFDckM5QyxnQkFBZ0IsQ0FBQzhDLE9BQU8sR0FBRyxLQUFLO0lBQ2hDN0Msa0JBQWtCLENBQUM2QyxPQUFPLEdBQUcsRUFBRTtJQUMvQjVDLGdCQUFnQixDQUFDNEMsT0FBTyxHQUFHLENBQUM7SUFDNUI0RixnQkFBZ0IsQ0FBQzVGLE9BQU8sR0FBRyxJQUFJO0lBQy9CNkYscUJBQXFCLENBQUM3RixPQUFPLEdBQUcsQ0FBQztFQUNuQyxDQUFDLEVBQUUsQ0FBQzdELGFBQWEsQ0FBQyxDQUFDOztFQUVuQjtFQUNBbFMsZUFBZSxDQUFDLFlBQU07SUFBQSxJQUFBNmIsWUFBQSxFQUFBQyxTQUFBO0lBQ3BCLElBQUk3RyxlQUFlLElBQUksQ0FBQy9DLGFBQWEsSUFBSThDLFFBQVEsQ0FBQ3RMLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDaEUsSUFBSW1LLHNCQUFzQixDQUFDa0MsT0FBTyxLQUFLN0QsYUFBYSxFQUFFO0lBQ3REMkIsc0JBQXNCLENBQUNrQyxPQUFPLEdBQUc3RCxhQUFhO0lBRTlDZSxnQkFBZ0IsQ0FBQzhDLE9BQU8sR0FBRyxLQUFLO0lBQ2hDN0Msa0JBQWtCLENBQUM2QyxPQUFPLEdBQUcsRUFBRTtJQUMvQjRGLGdCQUFnQixDQUFDNUYsT0FBTyxJQUFBOEYsWUFBQSxJQUFBQyxTQUFBLEdBQUc5RyxRQUFRLENBQUNBLFFBQVEsQ0FBQ3RMLE1BQU0sR0FBRyxDQUFDLENBQUMsY0FBQW9TLFNBQUEsdUJBQTdCQSxTQUFBLENBQStCdlYsRUFBRSxjQUFBc1YsWUFBQSxjQUFBQSxZQUFBLEdBQUksSUFBSTtJQUNwRUQscUJBQXFCLENBQUM3RixPQUFPLEdBQUdmLFFBQVEsQ0FBQ3RMLE1BQU07SUFFL0M2TSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ25CQSxpQkFBaUIsQ0FBQztNQUFFSyxPQUFPLEVBQUU7SUFBSSxDQUFDLENBQUM7RUFDckMsQ0FBQyxFQUFFLENBQUMxRSxhQUFhLEVBQUUrQyxlQUFlLEVBQUVELFFBQVEsQ0FBQ3RMLE1BQU0sRUFBRXNMLFFBQVEsRUFBRXVCLGlCQUFpQixDQUFDLENBQUM7RUFFbEZ4VyxTQUFTLENBQUMsWUFBTTtJQUFBLElBQUFnYyxlQUFBO0lBQ2QsSUFBSSxDQUFDakosV0FBVyxDQUFDaUQsT0FBTyxJQUFJZCxlQUFlLElBQUlDLHFCQUFxQixJQUFJbEMsZ0JBQWdCLENBQUMrQyxPQUFPLEVBQUU7TUFDaEc7SUFDRjtJQUVBLElBQU1pRyxXQUFXLEdBQUdoSCxRQUFRLENBQUNBLFFBQVEsQ0FBQ3RMLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakQsSUFBTXVTLE1BQU0sSUFBQUYsZUFBQSxHQUFHQyxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRXpWLEVBQUUsY0FBQXdWLGVBQUEsY0FBQUEsZUFBQSxHQUFJLElBQUk7SUFDdEMsSUFBTUcsTUFBTSxHQUFHUCxnQkFBZ0IsQ0FBQzVGLE9BQU87SUFDdkMsSUFBTW9HLE9BQU8sR0FBR1AscUJBQXFCLENBQUM3RixPQUFPO0lBQzdDNEYsZ0JBQWdCLENBQUM1RixPQUFPLEdBQUdrRyxNQUFNO0lBQ2pDTCxxQkFBcUIsQ0FBQzdGLE9BQU8sR0FBR2YsUUFBUSxDQUFDdEwsTUFBTTtJQUUvQyxJQUFNMFMsWUFBWSxHQUFHSCxNQUFNLEtBQUtDLE1BQU0sSUFBSWxILFFBQVEsQ0FBQ3RMLE1BQU0sS0FBS3lTLE9BQU87SUFDckUsSUFBSSxDQUFDQyxZQUFZLEVBQUU7TUFDakJ2Ryx1QkFBdUIsQ0FBQyxDQUFDO01BQ3pCO0lBQ0Y7O0lBRUE7SUFDQTtJQUNBLElBQUlyQyxpQkFBaUIsQ0FBQ3VDLE9BQU8sRUFBRTtNQUM3QmUscUJBQXFCLENBQUNxQyxhQUFhLENBQUM7TUFDcEM7SUFDRjtJQUVBLElBQU1LLFNBQVMsR0FBRzFHLFdBQVcsQ0FBQ2lELE9BQU87SUFDckMsSUFBTXNHLFVBQVUsR0FBRzdDLFNBQVMsQ0FBQ3ZELFlBQVksR0FBR3VELFNBQVMsQ0FBQ3hELFNBQVMsSUFBSXdELFNBQVMsQ0FBQ3RELFlBQVksR0FBRyxHQUFHO0lBQy9GLElBQU1vRyxpQkFBaUIsR0FBR3RILFFBQVEsQ0FBQzNFLElBQUksQ0FBQyxVQUFBMkssR0FBRztNQUFBLE9BQUlBLEdBQUcsQ0FBQ3pVLEVBQUUsS0FBSyxzQkFBc0I7SUFBQSxFQUFDO0lBQ2pGLElBQU1nVyxVQUFVLEdBQUcsQ0FBQyxDQUFDUCxXQUFXLEtBQUtBLFdBQVcsQ0FBQ3pWLEVBQUUsQ0FBQzZKLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM0TCxXQUFXLENBQUMvUyxRQUFRLENBQUM7SUFDdEcsSUFBTXVULGtCQUFrQixHQUN0QixDQUFDLENBQUNSLFdBQVcsS0FBS0EsV0FBVyxDQUFDelYsRUFBRSxDQUFDNkosVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJNEwsV0FBVyxDQUFDelYsRUFBRSxDQUFDNkosVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDOztJQUVuRztJQUNBLElBQUlvTSxrQkFBa0IsSUFBSUgsVUFBVSxFQUFFO01BQ3BDOUYsaUJBQWlCLENBQUMsQ0FBQztNQUNuQjtJQUNGOztJQUVBO0lBQ0E7SUFDQSxJQUFJLENBQUNpRyxrQkFBa0IsSUFBSSxDQUFDRCxVQUFVLElBQUksQ0FBQ0QsaUJBQWlCLElBQUl0SCxRQUFRLENBQUN0TCxNQUFNLEdBQUd5UyxPQUFPLEVBQUU7TUFDekY1RixpQkFBaUIsQ0FBQyxDQUFDO01BQ25CO0lBQ0Y7SUFFQVYsdUJBQXVCLENBQUMsQ0FBQztFQUMzQixDQUFDLEVBQUUsQ0FBQ2IsUUFBUSxFQUFFQyxlQUFlLEVBQUVDLHFCQUFxQixFQUFFcUIsaUJBQWlCLEVBQUU0QyxhQUFhLEVBQUV0RCx1QkFBdUIsQ0FBQyxDQUFDOztFQUVqSDtFQUNBO0VBQ0E3VixlQUFlLENBQUMsWUFBTTtJQUFBLElBQUF5YyxhQUFBLEVBQUFDLFVBQUE7SUFDcEIsSUFBTUMsbUJBQW1CLEdBQUcvSSxxQkFBcUIsQ0FBQ21DLE9BQU8sSUFBSSxDQUFDZCxlQUFlO0lBQzdFckIscUJBQXFCLENBQUNtQyxPQUFPLEdBQUdkLGVBQWU7SUFFL0MsSUFBSSxDQUFDMEgsbUJBQW1CLElBQUkzSCxRQUFRLENBQUN0TCxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBRW5EdUosZ0JBQWdCLENBQUM4QyxPQUFPLEdBQUcsS0FBSztJQUNoQzdDLGtCQUFrQixDQUFDNkMsT0FBTyxHQUFHLEVBQUU7SUFDL0I0RixnQkFBZ0IsQ0FBQzVGLE9BQU8sSUFBQTBHLGFBQUEsSUFBQUMsVUFBQSxHQUFHMUgsUUFBUSxDQUFDQSxRQUFRLENBQUN0TCxNQUFNLEdBQUcsQ0FBQyxDQUFDLGNBQUFnVCxVQUFBLHVCQUE3QkEsVUFBQSxDQUErQm5XLEVBQUUsY0FBQWtXLGFBQUEsY0FBQUEsYUFBQSxHQUFJLElBQUk7SUFDcEViLHFCQUFxQixDQUFDN0YsT0FBTyxHQUFHZixRQUFRLENBQUN0TCxNQUFNO0lBRS9DNk0saUJBQWlCLENBQUMsQ0FBQztJQUNuQkEsaUJBQWlCLENBQUM7TUFBRUssT0FBTyxFQUFFO0lBQUksQ0FBQyxDQUFDO0VBQ3JDLENBQUMsRUFBRSxDQUFDM0IsZUFBZSxFQUFFRCxRQUFRLENBQUN0TCxNQUFNLEVBQUU2TSxpQkFBaUIsQ0FBQyxDQUFDOztFQUV6RDtFQUNBeFcsU0FBUyxDQUFDLFlBQU07SUFDZCxJQUFJLENBQUNrVixlQUFlLEVBQUU7TUFDcEJZLHVCQUF1QixDQUFDLENBQUM7SUFDM0I7RUFDRixDQUFDLEVBQUUsQ0FBQ1osZUFBZSxFQUFFRCxRQUFRLENBQUN0TCxNQUFNLEVBQUVtTSx1QkFBdUIsQ0FBQyxDQUFDOztFQUUvRDtFQUNBLElBQU1xRixlQUFlLEdBQUdsRyxRQUFRLENBQzdCeEYsTUFBTSxDQUFDLFVBQUF3TCxHQUFHO0lBQUEsT0FBSUEsR0FBRyxDQUFDdFEsSUFBSSxLQUFLaEssZUFBZSxDQUFDeUssSUFBSSxJQUFJNlAsR0FBRyxDQUFDM1EsSUFBSSxDQUFDOUQsRUFBRSxLQUFLK0QsUUFBUSxDQUFDL0QsRUFBRSxDQUFDNkUsUUFBUSxDQUFDLENBQUM7RUFBQSxFQUFDLENBQzFGK1AsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBRVQsSUFBTXlCLGdCQUFnQixHQUNwQixDQUFDNVEsS0FBSyxDQUFDQyxPQUFPLENBQUNpUCxlQUFlLGFBQWZBLGVBQWUsdUJBQWZBLGVBQWUsQ0FBRXZRLFdBQVcsQ0FBQyxHQUFHdVEsZUFBZSxDQUFDdlEsV0FBVyxDQUFDakIsTUFBTSxHQUFHLENBQUMsTUFDcEZzQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2lQLGVBQWUsYUFBZkEsZUFBZSx1QkFBZkEsZUFBZSxDQUFFOVIsT0FBTyxDQUFDLEdBQUc4UixlQUFlLENBQUM5UixPQUFPLENBQUNNLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFFaEYsSUFBTW1ULG9CQUFvQixHQUFHbmIsMkJBQTJCLENBQUM7SUFDdkRvSixjQUFjLEVBQWRBLGNBQWM7SUFDZHVLLGNBQWMsRUFBZEEsY0FBYztJQUNkQyxjQUFjLEVBQUVBLGNBQWMsSUFBSSxDQUFDLENBQUM7SUFDcENILGVBQWUsRUFBZkEsZUFBZTtJQUNmekMsaUJBQWlCLEVBQWpCQSxpQkFBaUI7SUFDakJDLGtCQUFrQixFQUFsQkEsa0JBQWtCO0lBQ2xCbUssY0FBYyxFQUFFclIsT0FBTyxDQUFDbVIsZ0JBQWdCLENBQUM7SUFDekNBLGdCQUFnQixFQUFoQkEsZ0JBQWdCO0lBQ2hCcEssQ0FBQyxFQUFEQTtFQUNGLENBQUMsQ0FBQztFQUVGLElBQU11SyxnQkFBZ0IsR0FBRyxDQUFDLENBQUN6TCxRQUFROztFQUVuQztFQUNBO0VBQ0EsSUFBTTBMLFdBQVcsR0FBRy9jLE1BQU0sQ0FBQ3FSLFFBQVEsQ0FBQztFQUNwQ3RSLGVBQWUsQ0FBQyxZQUFNO0lBQ3BCLElBQUlnZCxXQUFXLENBQUNqSCxPQUFPLEtBQUt6RSxRQUFRLElBQUl3QixXQUFXLENBQUNpRCxPQUFPLEVBQUU7TUFDM0QsSUFBTWtILGNBQWMsR0FBRzlKLGdCQUFnQixDQUFDNEMsT0FBTztNQUMvQ2pELFdBQVcsQ0FBQ2lELE9BQU8sQ0FBQ0MsU0FBUyxHQUFHaUgsY0FBYztNQUM5Q0QsV0FBVyxDQUFDakgsT0FBTyxHQUFHekUsUUFBUTtJQUNoQyxDQUFDLE1BQU07TUFDTDBMLFdBQVcsQ0FBQ2pILE9BQU8sR0FBR3pFLFFBQVE7SUFDaEM7RUFDRixDQUFDLEVBQUUsQ0FBQ0EsUUFBUSxDQUFDLENBQUM7RUFFZCxJQUFJMkQsZUFBZSxFQUFFO0lBQ25CLG9CQUNFalIsSUFBQSxDQUFDakMsSUFBSTtNQUFDbWIsSUFBSTtNQUFBblksUUFBQSxlQUNSZixJQUFBLENBQUNsQyxNQUFNLElBQUU7SUFBQyxDQUNOLENBQUM7RUFFWDtFQUVBLElBQU1rYSxXQUFXLEdBQUdoSCxRQUFRLENBQUNBLFFBQVEsQ0FBQ3RMLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDakQsSUFBTXlULHdCQUF3QixHQUM1QixDQUFDLENBQUNuQixXQUFXLElBQUl2YSwrQkFBK0IsQ0FBQ3VhLFdBQVcsQ0FBQ3pWLEVBQUUsQ0FBQyxLQUFLNE8sZUFBZSxJQUFJQyxTQUFTLENBQUM7RUFFcEcsSUFBTWdJLGVBQWUsZ0JBQ25CaFosS0FBQSxDQUFBRixTQUFBO0lBQUFhLFFBQUEsR0FDR21RLHFCQUFxQixpQkFBSWxSLElBQUEsQ0FBQzdDLFdBQVc7TUFBQ2tjLElBQUksRUFBRTdLLENBQUMsQ0FBQyxrQkFBa0I7SUFBRSxDQUFFLENBQUMsZUFDdEV4TyxJQUFBLENBQUFFLFNBQUE7TUFBQWEsUUFBQSxFQUNHaVEsUUFBUSxDQUFDNU8sR0FBRyxDQUFDLFVBQUNhLE9BQU8sRUFBRTRJLEtBQUssRUFBSztRQUFBLElBQUF5TixvQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxXQUFBO1FBQ2hDLElBQU1DLGtCQUFrQixHQUFHelcsT0FBTyxDQUFDeUQsSUFBSSxLQUFLaEssZUFBZSxDQUFDMkssU0FBUyxJQUFJcEUsT0FBTyxDQUFDb0QsSUFBSSxDQUFDOUQsRUFBRSxLQUFLLFdBQVc7UUFDeEcsSUFBTTBELGFBQWEsR0FBRzRGLEtBQUssS0FBS21GLFFBQVEsQ0FBQ3RMLE1BQU0sR0FBRyxDQUFDO1FBQ25ELElBQU00QixzQkFBc0IsR0FDMUJvUyxrQkFBa0IsSUFBSXpULGFBQWEsSUFBSXhJLCtCQUErQixDQUFDd0YsT0FBTyxDQUFDVixFQUFFLENBQUM7UUFDcEYsSUFBTU8sV0FBVyxHQUFHd0Usc0JBQXNCLEtBQUs2SixlQUFlLElBQUlDLFNBQVMsQ0FBQzs7UUFFNUU7UUFDQTtRQUNBLElBQ0UsQ0FBQzlKLHNCQUFzQixJQUN2QixDQUFDeEUsV0FBVyxJQUNaLEVBQUUsQ0FBQXdXLG9CQUFBLEdBQUFyVyxPQUFPLENBQUMwRCxXQUFXLGNBQUEyUyxvQkFBQSxlQUFuQkEsb0JBQUEsQ0FBcUI1VCxNQUFNLEtBQUE2VCxnQkFBQSxHQUFJdFcsT0FBTyxDQUFDbUMsT0FBTyxjQUFBbVUsZ0JBQUEsZUFBZkEsZ0JBQUEsQ0FBaUI3VCxNQUFNLENBQUMsSUFDekQsQ0FBQ3pDLE9BQU8sQ0FBQ0EsT0FBTyxJQUNoQixHQUFBdVcsZ0JBQUEsR0FBQ3ZXLE9BQU8sQ0FBQzBXLE9BQU8sY0FBQUgsZ0JBQUEsZUFBZkEsZ0JBQUEsQ0FBaUIvVyxJQUFJLEtBQ3RCLENBQUNRLE9BQU8sQ0FBQ2dDLFFBQVEsRUFFakIsT0FBTyxJQUFJO1FBRWIsSUFBTTJVLGVBQWUsR0FDbkIsQ0FBQTNXLE9BQU8sYUFBUEEsT0FBTyx1QkFBUEEsT0FBTyxDQUFFNFcsVUFBVSxNQUFLeFUsU0FBUyxJQUFJcEMsT0FBTyxDQUFDNFcsVUFBVSxLQUFLLElBQUksR0FDNUQsSUFBSSxHQUNKNVcsT0FBTyxDQUFDNFcsVUFBVSxHQUNoQnZhLFFBQVEsQ0FBQ3dhLFNBQVMsR0FDbEJ4YSxRQUFRLENBQUN5YSxXQUFXOztRQUU1QjtRQUNBLElBQU1DLFVBQVUsSUFBQVAsV0FBQSxHQUFHeFcsT0FBTyxDQUFDVixFQUFFLGNBQUFrWCxXQUFBLGNBQUFBLFdBQUEsVUFBQTVQLE1BQUEsQ0FBV2dDLEtBQUssQ0FBRTtRQUUvQyxJQUFNb08sTUFBTSxHQUFHdGMsa0JBQWtCLENBQUNzRixPQUFPLENBQUM7UUFDMUMsSUFBTWlYLG1CQUFtQixHQUFHdGMsdUJBQXVCLENBQUNvVCxRQUFRLEVBQUUvTixPQUFPLENBQUM7UUFDdEUsSUFBTWtYLFFBQVEsR0FDWixDQUFDLENBQUNELG1CQUFtQixJQUNyQixDQUFDcFgsV0FBVyxJQUNaLENBQUNHLE9BQU8sQ0FBQytCLE9BQU8sSUFDaEIsQ0FBQy9CLE9BQU8sQ0FBQ2dDLFFBQVEsS0FDaEJoQyxPQUFPLENBQUNzQixtQkFBbUIsSUFBSyxDQUFDdEIsT0FBTyxDQUFDbVgsWUFBWSxJQUFJLENBQUMsQ0FBQ0gsTUFBTyxDQUFDO1FBRXRFLG9CQUNFN2QsY0FBQSxDQUFDOEosV0FBVyxFQUFBOUUsYUFBQSxDQUFBQSxhQUFBLEtBQ042QixPQUFPO1VBQ1hvWCxHQUFHLEVBQUVMLFVBQVc7VUFDaEIxVCxRQUFRLEVBQUVBLFFBQVM7VUFDbkIxRSxrQkFBa0IsRUFBRUEsa0JBQW1CO1VBQ3ZDMEQsY0FBYyxFQUFFQSxjQUFlO1VBQy9Ca0Isc0JBQXNCLEVBQUVBLHNCQUF1QjtVQUMvQ1gscUJBQXFCLEVBQUVBLHFCQUFzQjtVQUM3Q1ksV0FBVyxFQUFFMFQsUUFBUSxHQUFHO1lBQUEsT0FBTTNJLFlBQVksQ0FBQ3ZPLE9BQU8sQ0FBQztVQUFBLElBQUdvQyxTQUFVO1VBQ2hFd0IscUJBQXFCLEVBQUUsQ0FBQyxDQUFDK0osNEJBQTRCLENBQUMzTixPQUFPLENBQUNWLEVBQUUsQ0FBRTtVQUNsRWlELGVBQWUsRUFBRW9VLGVBQWdCO1VBQ2pDOVcsV0FBVyxFQUFFQSxXQUFZO1VBQ3pCbUQsYUFBYSxFQUFFQSxhQUFjO1VBQzdCcUgsUUFBUSxFQUFFQSxRQUFTO1VBQ25CeEcsY0FBYyxFQUFFaEUsV0FBVyxHQUFHK1Ysb0JBQW9CLEdBQUc7UUFBSyxFQUMzRCxDQUFDO01BRU4sQ0FBQztJQUFDLENBQ0YsQ0FBQyxFQUNGLENBQUNNLHdCQUF3QixJQUFJTixvQkFBb0IsaUJBQ2hEN1ksSUFBQSxDQUFDYix1QkFBdUI7TUFBQTRCLFFBQUEsZUFDdEJmLElBQUEsQ0FBQzVDLHNCQUFzQjtRQUFDc1AsUUFBUSxFQUFFbU07TUFBcUIsQ0FBRTtJQUFDLENBQ25DLENBQzFCLGVBR0Q3WSxJQUFBLENBQUNwQixZQUFZO01BQUMwYixHQUFHLEVBQUU3SyxXQUFZO01BQUMsZUFBWTtJQUFNLENBQUUsQ0FBQztFQUFBLENBQ3JELENBQ0g7RUFFRDtJQUFBO0lBQ0U7SUFDQTtJQUNBclAsS0FBQSxDQUFDM0IsZUFBZTtNQUNkOGIsZUFBZSxFQUFFeEIsZ0JBQWlCO01BQ2xDeUIsT0FBTyxFQUFFbkcsc0JBQXVCO01BQ2hDb0csWUFBWSxFQUFFcEcsc0JBQXVCO01BQUF0VCxRQUFBLGdCQUVyQ2YsSUFBQSxDQUFDWixxQkFBcUI7UUFBQ3NiLEtBQUssRUFBRXRLLGVBQWdCO1FBQUMsZUFBWTtNQUFNLENBQUUsQ0FBQyxFQUNuRTJJLGdCQUFnQixnQkFDZi9ZLElBQUEsQ0FBQ3RCLGdCQUFnQjtRQUFDNGIsR0FBRyxFQUFFeEwsV0FBWTtRQUFDNkwsUUFBUSxFQUFFckYsb0JBQXFCO1FBQUF2VSxRQUFBLGVBQ2pFZixJQUFBLENBQUNyQixlQUFlO1VBQUM0YixlQUFlLEVBQUV4QixnQkFBaUI7VUFBQWhZLFFBQUEsRUFBRXFZO1FBQWUsQ0FBa0I7TUFBQyxDQUN2RSxDQUFDLGdCQUVuQnBaLElBQUEsQ0FBQ3JCLGVBQWU7UUFBQzJiLEdBQUcsRUFBRXhMLFdBQVk7UUFBQzZMLFFBQVEsRUFBRXJGLG9CQUFxQjtRQUFDaUYsZUFBZSxFQUFFLEtBQU07UUFBQXhaLFFBQUEsRUFDdkZxWTtNQUFlLENBQ0QsQ0FDbEIsZUFFRHBaLElBQUEsQ0FBQ1gsd0JBQXdCO1FBQUNxYixLQUFLLEVBQUVsSyxrQkFBbUI7UUFBQyxlQUFZO01BQU0sQ0FBRSxDQUFDLEVBRXpFUixrQkFBa0IsaUJBQ2pCNVAsS0FBQSxDQUFDOUIsb0JBQW9CO1FBQUN3TCxJQUFJLEVBQUMsUUFBUTtRQUFDdEgsT0FBTyxFQUFFNlMseUJBQTBCO1FBQUF0VSxRQUFBLGdCQUNyRWYsSUFBQSxDQUFDekIsZ0JBQWdCO1VBQUNxYyxRQUFRLEVBQUV4SixTQUFVO1VBQUMsbUJBQVc7VUFBQXJRLFFBQUEsZUFDaERYLEtBQUEsQ0FBQzVCLGFBQWE7WUFBQXVDLFFBQUEsZ0JBQ1pmLElBQUEsV0FBTyxDQUFDLGVBQ1JBLElBQUEsV0FBTyxDQUFDLGVBQ1JBLElBQUEsV0FBTyxDQUFDO1VBQUEsQ0FDSztRQUFDLENBQ0EsQ0FBQyxlQUNuQkEsSUFBQSxDQUFDekIsZ0JBQWdCO1VBQUNxYyxRQUFRLEVBQUUsQ0FBQ3hKLFNBQVU7VUFBQyxtQkFBVztVQUFBclEsUUFBQSxlQUNqRGYsSUFBQTtZQUFLNmEsS0FBSyxFQUFDLDRCQUE0QjtZQUFDQyxLQUFLLEVBQUUsRUFBRztZQUFDL0csTUFBTSxFQUFFLEVBQUc7WUFBQ21GLElBQUksRUFBQyxNQUFNO1lBQUFuWSxRQUFBLGVBQ3hFZixJQUFBO2NBQ0UrYSxNQUFNLEVBQUMsU0FBUztjQUNoQkMsYUFBYSxFQUFDLE9BQU87Y0FDckJDLGNBQWMsRUFBQyxPQUFPO2NBQ3RCQyxXQUFXLEVBQUUsR0FBSTtjQUNqQkMsQ0FBQyxFQUFDO1lBQW1DLENBQ3RDO1VBQUMsQ0FDQztRQUFDLENBQ1UsQ0FBQztNQUFBLENBQ0MsQ0FDdkI7SUFBQSxDQUNjO0VBQUM7QUFFdEIsQ0FBQztBQUVELE9BQU8sSUFBTUMsY0FBYyxnQkFBR3hmLEtBQUssQ0FBQ0MsSUFBSSxDQUFDa1MsbUJBQW1CLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
883
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiQXJyb3dTbWFsbERvd24iLCJBdHRhY2htZW50Q2FyZCIsIkFwcHJvdmFsQm94IiwiQXR0YWNobWVudFByZXZpZXdNb2RhbCIsIkF0dGFjaG1lbnRDYXJkQXVkaW8iLCJNYWlhU3RyZWFtZG93biIsIkNoYXRIaXN0b3J5Um9sZSIsInJlbmRlclRleHRXaXRoTWVudGlvbnMiLCJoYXNJbmxpbmVNYXJrZXJzIiwiaXNNYWlha2VyQWdlbnQiLCJ1c2VVc2VyIiwidXNlVCIsInVzZUNoYXRNYW5hZ2VyIiwidXNlU21vb3RoU3RyZWFtVGV4dCIsInVzZVN0cmVhbWluZ01lc3NhZ2UiLCJMb2FkaW5nVGV4dCIsIkFnZW50QWN0aXZpdHlJbmRpY2F0b3IiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIiwicmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5IiwicmVzb2x2ZVJldHJ5VHVybklkIiwiZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkiLCJMb2FkZXIiLCJGYWRlIiwicGF0Y2hNYWlhUGFuZWxTZXNzaW9uIiwicmVhZE1haWFQYW5lbFNlc3Npb24iLCJNZXNzYWdlRnJvbVVzZXIiLCJNZXNzYWdlRnJvbU90aGVyIiwiTWVzc2FnZUNvbnRlbnRGcm9tVXNlciIsIk1lc3NhZ2VDb250ZW50RnJvbU90aGVyIiwiTWVzc2FnZUZlZWRiYWNrIiwiU0NDQUlNZXNzYWdlV3JhcHBlciIsIlNjcm9sbFRvQm90dG9tQnV0dG9uIiwiU0NNZXNzYWdlc091dGVyIiwiU0NNZXNzYWdlc1Njcm9sbCIsIlNDTWVzc2FnZXNJbm5lciIsIlNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uIiwiU0NPcHRpb25zTGlzdCIsIlNDT3B0aW9uSXRlbSIsIlNDTWVzc2FnZUl0ZW1XcmFwcGVyIiwiU0NNZXNzYWdlSXRlbUlubmVyIiwiU0NBdHRhY2htZW50c1JvdyIsIlNDQXBwcm92YWxBY3Rpb25zQ29sdW1uIiwiRmVlZGJhY2siLCJ1c2VHbG9iYWxDb250ZXh0IiwiRW50aXR5TGlua0N1c3RvbUxpbmsiLCJnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSIsIkNoYXRBSVN1Z2dlc3Rpb25zIiwiQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zIiwiRVZFTlRTIiwidXNlRXZlbnQiLCJkb3dubG9hZEZpbGVGcm9tVXJsIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwiTWVzc2FnZVdyYXBwZXIiLCJfcmVmIiwiaXNDdXJyZW50VXNlciIsImNoaWxkcmVuIiwicHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJNZXNzYWdlQ29tcG9uZW50IiwiX29iamVjdFNwcmVhZCIsIk1lc3NhZ2VDb250ZW50V3JhcHBlciIsIl9yZWYyIiwiX2V4Y2x1ZGVkMiIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiTWVzc2FnZU9wdGlvbnMiLCJfcmVmMyIsIm9wdGlvbnMiLCJoYW5kbGVTZWxlY3RPcHRpb24iLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZWxlY3RlZE9wdGlvbiIsInNldFNlbGVjdGVkT3B0aW9uIiwiaGFuZGxlU2VsZWN0Iiwib3B0aW9uIiwibWFwIiwiJGhhc1NlbGVjdGlvbiIsIiRkaW1tZWQiLCJpZCIsIm9uQ2xpY2siLCJuYW1lIiwiU3RyZWFtaW5nTWVzc2FnZUJvZHkiLCJfcHJvcHMkY3JlYXRlQWdlbnRGb2wiLCJfcHJvcHMkc3VnZ2VzdGlvbnMiLCJzdHJlYW1pbmdUZXh0IiwiaXNTdHJlYW1pbmciLCJtZXNzYWdlSWQiLCJyYXdUZXh0IiwibWVzc2FnZSIsIndpbkZsYWdzIiwid2luZG93IiwiZGlzcGxheVRleHQiLCJlbmFibGVkIiwibWF4Q2hhcnNQZXJGcmFtZSIsInNuYXBUb1dvcmRCb3VuZGFyeSIsInN0cmVhbUxhZ01zIiwidGFyZ2V0TGFnTXMiLCJzdHJlYW1BZGFwdCIsImFkYXB0VG9CYWNrZW5kUmF0ZSIsInN0cmVhbUJ1ZmZlck1zIiwidGFyZ2V0QnVmZmVyTXMiLCJzdHJlYW1NaW5CdWZmZXIiLCJtaW5CdWZmZXJDaGFycyIsInN0cmVhbVdhcm11cE1zIiwid2FybXVwTXMiLCJjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsImFnZW50SWQiLCJoYXNNZW50aW9ucyIsIm1lbnRpb25Ob2RlcyIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJjbGFzc05hbWUiLCJzdHlsZSIsImRpc3BsYXkiLCJ2YXJpYW50IiwiY29tcG9uZW50cyIsImEiLCJpc0FuaW1hdGluZyIsImlzQXNzaXN0YW50IiwiaXNFcnJvciIsImFwcHJvdmFsIiwib25SZXRyeSIsImNvbnRlbnQiLCJzb3VyY2VzIiwidW5kZWZpbmVkIiwiaGFuZGxlRmVlZGJhY2siLCJoYW5kbGVGZWVkYmFja0NsaWNrIiwiZGlzYWJsZUZlZWRiYWNrIiwic3VnZ2VzdGlvbnMiLCJsZW5ndGgiLCJvblNlbGVjdFN1Z2dlc3Rpb24iLCJzdWdnZXN0aW9uIiwiaGFuZGxlU3VnZ2VzdGlvbkNsaWNrIiwiZGlzYWJsZWQiLCJzdWdnZXN0aW9uc0Rpc2FibGVkIiwiaGlkZGVuIiwiaXNMYXN0TWVzc2FnZSIsIk1lc3NhZ2VJdGVtIiwiX3Byb3BzJHByb2plY3RNZXRhZGF0IiwidXNlciIsImF1dGhVc2VyIiwiaXNDaGFuZ2VQcm9qZWN0IiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsImhhbmRsZVJldHJ5Iiwicm9sZSIsImF0dGFjaG1lbnRzIiwiYXBwcm92YWxTdGF0dXMiLCJoYXNTZWxlY3RlZFN1Z2dlc3Rpb24iLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInByZXZpZXdBdHRhY2htZW50Iiwic2V0UHJldmlld0F0dGFjaG1lbnQiLCJVU0VSIiwidG9TdHJpbmciLCJBU1NJU1RBTlQiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyIiwiaXNBY3RpdmVTdHJlYW1pbmciLCJpc1RoaW5raW5nIiwibWVzc2FnZUF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiaGFuZGxlQXR0YWNobWVudENsaWNrIiwiYXR0YWNobWVudCIsImZpbGUiLCJGaWxlIiwib3JpZ2luYWxGaWxlIiwidXJsX3RodW1ibmFpbCIsInVybF9vcmlnaW5hbCIsInVybF9maWxlIiwiaGFuZGxlQ2xvc2VQcmV2aWV3IiwiaGFuZGxlQXR0YWNobWVudERvd25sb2FkIiwiX3JlZjQiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsImV4dGVuc2lvbiIsImZpbGVOYW1lIiwiZmlsZVVybCIsImJsb2JVcmwiLCJkb3dubG9hZGVkRmlsZSIsImxpbmsiLCJfdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiaW5jbHVkZXMiLCJjb25jYXQiLCJ0eXBlIiwic2VudCIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImFicnVwdCIsImRvY3VtZW50IiwiaHJlZiIsImRvd25sb2FkIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY2xpY2siLCJzZXRUaW1lb3V0IiwicmVtb3ZlQ2hpbGQiLCJyZXZva2VPYmplY3RVUkwiLCJjb25zb2xlIiwiZXJyb3IiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsImhhc0ZlZWRiYWNrIiwiJGlzQXNzaXN0YW50IiwibWVzc2FnZUV4dHJhQ29udGVudCIsImZlZWRiYWNrIiwic2Vzc2lvbklkIiwic3BsaXQiLCJmaWx0ZXIiLCJxdWVzdGlvbklkIiwiam9pbiIsImluZGV4IiwiX2F0dGFjaG1lbnQkdHlwZSIsIl9hdHRhY2htZW50JG5hbWUiLCJhdHRhY2htZW50VHlwZSIsInRvTG93ZXJDYXNlIiwiYXR0YWNobWVudE5hbWUiLCJpc0F1ZGlvRmlsZSIsInN0YXJ0c1dpdGgiLCJzb21lIiwiZXh0IiwiZW5kc1dpdGgiLCJwb3NpdGlvbkluZGV4Iiwib25Eb3dubG9hZCIsInBlbmRpbmdfYWN0aW9ucyIsImFjdGlvbnMiLCJzdGF0dXMiLCJvbkFwcHJvdmUiLCJ0aHJlYWRJZHMiLCJvblJlamVjdCIsImlzUHJvamVjdERlbGV0ZWQiLCJwcm9qZWN0TWV0YWRhdGEiLCJpc19kZWxldGVkIiwiaXNFeHBhbmRlZCIsImV4cGFuZGVkIiwiaGl0bEluc3RhbmNlSWQiLCJvcmlnaW5hbF90aHJlYWRfaWQiLCJ3YXJuaW5nTWVzc2FnZSIsIndhcm5pbmdfbWVzc2FnZSIsIm1hbnVhbEFwcHJvdmFsRGV0ZWN0ZWQiLCJtYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWQiLCJpc09wZW4iLCJvbkNsb3NlIiwiQ2hhdEFJTWVzc2FnZXNJbm5lciIsIl9yZWY1IiwidXNlckluaXRpYWxNZXNzYWdlIiwiaW5pdGlhbENoYXRJZCIsIm9uRXJyb3IiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJvblNjcm9sbFRvQm90dG9tIiwiYWdlbnRzIiwiX3VzZVQiLCJ0IiwiX3VzZUdsb2JhbENvbnRleHQiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsImFnZW50IiwiZXZlbnQiLCJtZXNzYWdlc1JlZiIsImNoYXRJbml0aWFsaXplZFJlZiIsImlzTG9hZGluZ01vcmVSZWYiLCJ1c2VyU2Nyb2xsaW5nUmVmIiwic2Nyb2xsVGhyZXNob2xkUmVmIiwibGFzdFNjcm9sbFRvcFJlZiIsInNob3dTY3JvbGxUb0JvdHRvbVJlZiIsInNjcm9sbFJhZlJlZiIsIndhc0xvYWRpbmdNZXNzYWdlc1JlZiIsImxhc3RTY3JvbGxlZFNlc3Npb25SZWYiLCJwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZiIsInNjcm9sbFBlcnNpc3RUaW1lclJlZiIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2Iiwic2hvd1Njcm9sbFRvQm90dG9tIiwic2V0U2hvd1Njcm9sbFRvQm90dG9tIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzIiwic2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyIsIl91c2VDaGF0TWFuYWdlciIsImNoYXRJZCIsIm1lc3NhZ2VzIiwibG9hZGluZ01lc3NhZ2VzIiwiaXNMb2FkaW5nTW9yZU1lc3NhZ2VzIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNXcml0aW5nIiwibG9hZGluZ01lc3NhZ2UiLCJzdHJlYW1BY3Rpdml0eSIsImFjdGl2ZUxvYWRpbmdzIiwic2VuZE1lc3NhZ2UiLCJyZXRyeU1lc3NhZ2UiLCJjaGFuZ2VQcm9qZWN0IiwiaW5pdGlhbGl6ZUNoYXQiLCJoYW5kbGVTY3JvbGwiLCJzdG9wR2VuZXJhdGlvbiIsInRyaW0iLCJpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQiLCJhaUNoYXRTdWdnZXN0ZWRBbnN3ZXIiLCJhZ2VudF90eXBlIiwiX2RlZmluZVByb3BlcnR5IiwidGFyZ2V0TWVzc2FnZSIsImZpbmQiLCJtc2ciLCJpc1JldHJ5U3VnZ2VzdGlvbiIsImxhc3RVc2VyTWVzc2FnZSIsImF0IiwicmV0cnlBdHRhY2htZW50cyIsImVudGl0eSIsInVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkiLCJlbCIsImN1cnJlbnQiLCJzY3JvbGxUb3AiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJkaXN0YW5jZUZyb21Cb3R0b20iLCJzaG91bGRTaG93Iiwic2Nyb2xsVG9Cb3R0b21SYWYiLCJvcHRzIiwiX29wdHMkc2tpcElmVXNlclNjcm9sIiwic2tpcElmVXNlclNjcm9sbGluZyIsIl9vcHRzJGRlbGF5TXMiLCJkZWxheU1zIiwicnVuIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiaGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbSIsInNjcm9sbFRvIiwidG9wIiwiYmVoYXZpb3IiLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uV2l0aFNjcm9sbCIsImhhbmRsZVNjcm9sbFRvQm90dG9tIiwiZSIsImNvbnRhaW5lciIsImN1cnJlbnRUYXJnZXQiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsImlzU2Nyb2xsaW5nVXAiLCJpc05lYXJCb3R0b20iLCJjbGVhclRpbWVvdXQiLCJzY3JvbGxTZXNzaW9uSWQiLCJzZW5kTWVzc2FnZVJlZiIsInN0b3BHZW5lcmF0aW9uUmVmIiwib25TZW5kTWVzc2FnZVJlYWR5UmVmIiwic2VuZE1lc3NhZ2VQcm94eVJlZiIsImZhcUlkIiwiYWdlbnRTdWdnZXN0aW9uSWQiLCJtZW50aW9ucyIsImZ1YUlkIiwic2NJZCIsInN0b3BHZW5lcmF0aW9uUHJveHlSZWYiLCJyYWZJZCIsImxhc3RIZWlnaHQiLCJ0aWNrIiwiY3VycmVudEhlaWdodCIsImxhc3RNZXNzYWdlSWRSZWYiLCJsYXN0TWVzc2FnZXNMZW5ndGhSZWYiLCJfbWVzc2FnZXMkaWQiLCJfbWVzc2FnZXMiLCJfbGFzdE1lc3NhZ2UkaWQiLCJsYXN0TWVzc2FnZSIsImxhc3RJZCIsInByZXZJZCIsInByZXZMZW4iLCJpc05ld01lc3NhZ2UiLCJpc0F0Qm90dG9tIiwiaGFzSW5pdGlhbE1lc3NhZ2UiLCJpc0FwcHJvdmFsIiwiaXNBbnN3ZXJPclF1ZXN0aW9uIiwiX21lc3NhZ2VzJGlkMiIsIl9tZXNzYWdlczIiLCJqdXN0RmluaXNoZWRMb2FkaW5nIiwiYXR0YWNobWVudHNDb3VudCIsInN0cmVhbUxvYWRpbmdEaXNwbGF5IiwiaGFzQXR0YWNobWVudHMiLCJCb29sZWFuIiwiaXNTY3JvbGxPblBhcmVudCIsInNlc3Npb24iLCJleHBhbmRlZFJlZiIsInNhdmVkU2Nyb2xsVG9wIiwiZmlsbCIsIm1lc3NhZ2VzQ29udGVudCIsInRleHQiLCJfbWVzc2FnZSRhdHRhY2htZW50cyIsIl9tZXNzYWdlJHNvdXJjZXMiLCJfbWVzc2FnZSRwcm9qZWN0IiwiX21lc3NhZ2UkaWQiLCJpc0Fzc2lzdGFudE1lc3NhZ2UiLCJwcm9qZWN0IiwibWVzc2FnZUZlZWRiYWNrIiwid2FzSGVscGZ1bCIsIlRIVU1CU19VUCIsIlRIVU1CU19ET1dOIiwibWVzc2FnZUtleSIsInR1cm5JZCIsInVzZXJNZXNzYWdlRm9yUmV0cnkiLCJjYW5SZXRyeSIsImlzX2NhbmNlbGxlZCIsImtleSIsImFjdGl2aXR5IiwiJHNjcm9sbE9uUGFyZW50IiwicmVmIiwib25TY3JvbGwiLCIkaXNNYXJrZXRwbGFjZUdsb2JhbCIsImNvbG9yIiwid2lkdGgiLCJoZWlnaHQiLCJDaGF0QUlNZXNzYWdlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0QUlNZXNzYWdlcy9DaGF0QUlNZXNzYWdlcy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby11bnN0YWJsZS1uZXN0ZWQtY29tcG9uZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvdyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9mdW5jdGlvbi1jb21wb25lbnQtZGVmaW5pdGlvbiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvcmVxdWlyZS1kZWZhdWx0LXByb3BzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbmltcG9ydCBSZWFjdCwgeyBGQywgbWVtbywgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEFycm93U21hbGxEb3duIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQXJyb3dTbWFsbERvd24nXG5cbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmQnXG5pbXBvcnQgeyBBcHByb3ZhbEJveCB9IGZyb20gJy4uLy4uL2F0b21zL0FwcHJvdmFsQm94L0FwcHJvdmFsQm94J1xuaW1wb3J0IHsgQXR0YWNobWVudFByZXZpZXdNb2RhbCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwnXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZEF1ZGlvIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmRBdWRpbydcbmltcG9ydCB7IE1haWFTdHJlYW1kb3duIH0gZnJvbSAnLi4vLi4vYXRvbXMvTWFpYVN0cmVhbWRvd24nXG5pbXBvcnQgdHlwZSB7IE1haWFTdHJlYW1kb3duUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NYWlhU3RyZWFtZG93bidcbmltcG9ydCB7IE1BSUFNZXNzYWdlUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBTWVzc2FnZS9NQUlBTWVzc2FnZS5pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRIaXN0b3J5Um9sZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyByZW5kZXJUZXh0V2l0aE1lbnRpb25zLCBoYXNJbmxpbmVNYXJrZXJzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zJ1xuXG5pbXBvcnQgeyBpc01haWFrZXJBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FnZW50RGlzcGxheU5hbWUnXG5pbXBvcnQgeyBDT1JVc2VyLCB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcblxuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVQnXG5pbXBvcnQgeyB1c2VDaGF0TWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlU21vb3RoU3RyZWFtVGV4dCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNtb290aFN0cmVhbVRleHQnXG5pbXBvcnQgeyB1c2VTdHJlYW1pbmdNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtaW5nTWVzc2FnZSdcblxuaW1wb3J0IHsgTG9hZGluZ1RleHQgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkaW5nVGV4dCdcbmltcG9ydCB7IEFnZW50QWN0aXZpdHlJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9BZ2VudEFjdGl2aXR5SW5kaWNhdG9yJ1xuaW1wb3J0IHsgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCwgcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IHJlc29sdmVSZXRyeVR1cm5JZCwgZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkgfSBmcm9tICcuLi8uLi8uLi91dGlscy9yZXRyeUNvbXBsZXRpb24nXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkZXInXG5pbXBvcnQgeyBGYWRlIH0gZnJvbSAnLi4vLi4vYXRvbXMvRmFkZSdcbmltcG9ydCB7IHBhdGNoTWFpYVBhbmVsU2Vzc2lvbiwgcmVhZE1haWFQYW5lbFNlc3Npb24gfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9tYWlhUGFuZWxTZXNzaW9uUGVyc2lzdGVuY2UnXG5cbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuXG5pbXBvcnQgeyBNZXNzYWdlRnJvbVVzZXIsIE1lc3NhZ2VGcm9tT3RoZXIsIE1lc3NhZ2VDb250ZW50RnJvbVVzZXIsIE1lc3NhZ2VDb250ZW50RnJvbU90aGVyIH0gZnJvbSAnLi9zdHlsZXMnXG5pbXBvcnQgeyBNZXNzYWdlRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQge1xuICBTQ0NBSU1lc3NhZ2VXcmFwcGVyLFxuICBTY3JvbGxUb0JvdHRvbUJ1dHRvbixcbiAgU0NNZXNzYWdlc091dGVyLFxuICBTQ01lc3NhZ2VzU2Nyb2xsLFxuICBTQ01lc3NhZ2VzSW5uZXIsXG4gIFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uLFxuICBTQ09wdGlvbnNMaXN0LFxuICBTQ09wdGlvbkl0ZW0sXG4gIFNDTWVzc2FnZUl0ZW1XcmFwcGVyLFxuICBTQ01lc3NhZ2VJdGVtSW5uZXIsXG4gIFNDQXR0YWNobWVudHNSb3csXG4gIFNDQXBwcm92YWxBY3Rpb25zQ29sdW1uLFxufSBmcm9tICcuL25ld1N0eWxlcydcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IEVudGl0eUxpbmtDdXN0b21MaW5rLCBnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2VudGl0eUxpbmtSZW5kZXInXG5pbXBvcnQgeyBDaGF0QUlTdWdnZXN0aW9ucyB9IGZyb20gJy4vQ2hhdEFJU3VnZ2VzdGlvbnMnXG5pbXBvcnQgeyBDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnMgfSBmcm9tICcuL0NoYXRBSUNyZWF0ZUFnZW50QWN0aW9ucydcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IGRvd25sb2FkRmlsZUZyb21VcmwgfSBmcm9tICcuLi8uLi8uLi91dGlscy9maWxlRG93bmxvYWRIZWxwZXInXG5cbnR5cGUgQ2hhdEFJTWVzc2FnZXNQcm9wcyA9IHtcbiAgdXNlckluaXRpYWxNZXNzYWdlOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRGaWxlW11cbiAgICBmYXFJZD86IHN0cmluZ1xuICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdXG4gICAgZnVhSWQ/OiBzdHJpbmdcbiAgICBzY0lkPzogc3RyaW5nXG4gIH1cbiAgaW5pdGlhbENoYXRJZDogc3RyaW5nIHwgbnVsbFxuICBvbkVycm9yOiAoKSA9PiB2b2lkXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeT86IChcbiAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZ1xuICAgICkgPT4gdm9pZCxcbiAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhbixcbiAgICBpc1dyaXRpbmc6IGJvb2xlYW5cbiAgKSA9PiB2b2lkXG4gIGlzRGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uU2Nyb2xsVG9Cb3R0b20/OiAoKSA9PiB2b2lkXG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBhZ2VudHM/OiBBZ2VudFtdXG4gIGV4cGFuZGVkPzogYm9vbGVhblxufVxuXG50eXBlIE1lc3NhZ2VJdGVtUHJvcHMgPSBDaGF0TWVzc2FnZSAmIHtcbiAgYXV0aFVzZXI6IENPUlVzZXJcbiAgaGFuZGxlU2VsZWN0T3B0aW9uOiAob3B0aW9uOiBQcm9qZWN0KSA9PiB2b2lkXG4gIGhhbmRsZVN1Z2dlc3Rpb25DbGljazogKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHZvaWRcbiAgaGFzU2VsZWN0ZWRTdWdnZXN0aW9uPzogYm9vbGVhblxuICBoYW5kbGVGZWVkYmFjazogKGZlZWRiYWNrOiBGZWVkYmFjaywgY2hhdE1lc3NhZ2VJZDogc3RyaW5nKSA9PiB2b2lkXG4gIGhhbmRsZUFwcHJvdmFsRGVjaXNpb246ICh0aHJlYWRJZHM6IHN0cmluZ1tdLCBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcpID0+IHZvaWRcbiAgaGFuZGxlUmV0cnk/OiAoKSA9PiB2b2lkXG4gIGRpc2FibGVGZWVkYmFjaz86IEZlZWRiYWNrIHwgbnVsbFxuICBzb3VyY2VzPzogYW55XG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgaXNMYXN0TWVzc2FnZT86IGJvb2xlYW5cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBNZXNzYWdlV3JhcHBlclByb3BzIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gICdkYXRhLW1lc3NhZ2UtaWQnPzogc3RyaW5nXG4gIGhhc0ZlZWRiYWNrPzogYm9vbGVhblxufVxuXG50eXBlIE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzID0gTUFJQU1lc3NhZ2VQcm9wcyAmIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBpc0NoYW5nZVByb2plY3Q/OiBib29sZWFuXG59XG5cbmNvbnN0IE1lc3NhZ2VXcmFwcGVyOiBGQzxNZXNzYWdlV3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiB7XG4gIGNvbnN0IE1lc3NhZ2VDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUZyb21Vc2VyIDogTWVzc2FnZUZyb21PdGhlclxuICByZXR1cm4gPE1lc3NhZ2VDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9NZXNzYWdlQ29tcG9uZW50PlxufVxuXG5jb25zdCBNZXNzYWdlQ29udGVudFdyYXBwZXI6IEZDPE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUNvbnRlbnRGcm9tVXNlciA6IE1lc3NhZ2VDb250ZW50RnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbnRlbnRDb21wb25lbnQgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBNZXNzYWdlT3B0aW9ucyh7XG4gIG9wdGlvbnMsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbixcbn06IHtcbiAgb3B0aW9uczogUHJvamVjdFtdIHwgbnVsbFxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxQcm9qZWN0IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSByZXR1cm5cbiAgICBzZXRTZWxlY3RlZE9wdGlvbihvcHRpb24pXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uKG9wdGlvbilcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDT3B0aW9uc0xpc3Q+XG4gICAgICB7KG9wdGlvbnMgfHwgW10pLm1hcChvcHRpb24gPT4gKFxuICAgICAgICA8U0NPcHRpb25JdGVtXG4gICAgICAgICAgJGhhc1NlbGVjdGlvbj17ISFzZWxlY3RlZE9wdGlvbn1cbiAgICAgICAgICAkZGltbWVkPXshIXNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uPy5pZCAhPT0gb3B0aW9uLmlkfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlbGVjdChvcHRpb24pfVxuICAgICAgICAgIGtleT17b3B0aW9uLmlkfVxuICAgICAgICA+XG4gICAgICAgICAge29wdGlvbi5uYW1lfVxuICAgICAgICA8L1NDT3B0aW9uSXRlbT5cbiAgICAgICkpfVxuICAgIDwvU0NPcHRpb25zTGlzdD5cbiAgKVxufVxuXG4vKiogU29sbyBlc3RlIGNvbXBvbmVudGUgcmUtcmVuZGVyaXphIGN1YW5kbyBjYW1iaWEgZWwgdGV4dG8gZW4gc3RyZWFtaW5nIChsZWUgZGVsIGNvbnRleHQpLiAqL1xuY29uc3QgU3RyZWFtaW5nTWVzc2FnZUJvZHkgPSBtZW1vKFxuICAocHJvcHM6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhblxuICAgIGlzQ3VycmVudFVzZXI6IGJvb2xlYW5cbiAgICBpc0Fzc2lzdGFudDogYm9vbGVhblxuICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ/OiBib29sZWFuXG4gICAgYXBwcm92YWw/OiBNZXNzYWdlSXRlbVByb3BzWydhcHByb3ZhbCddXG4gICAgaXNFcnJvcj86IGJvb2xlYW5cbiAgICBzb3VyY2VzPzogTWVzc2FnZUl0ZW1Qcm9wc1snc291cmNlcyddXG4gICAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXSB8IG51bGxcbiAgICBjcmVhdGVBZ2VudEZvbGxvd1VwPzogeyBhZ2VudElkOiBzdHJpbmcgfSB8IG51bGxcbiAgICBoYW5kbGVGZWVkYmFja0NsaWNrOiAoZjogRmVlZGJhY2spID0+IHZvaWRcbiAgICBkaXNhYmxlRmVlZGJhY2s6IEZlZWRiYWNrIHwgbnVsbFxuICAgIG9uUmV0cnk/OiAoKSA9PiB2b2lkXG4gICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiAobWVzc2FnZUlkOiBzdHJpbmcsIHN1Z2dlc3Rpb246IHN0cmluZykgPT4gdm9pZFxuICAgIHN1Z2dlc3Rpb25zRGlzYWJsZWQ/OiBib29sZWFuXG4gICAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgICBpc0xhc3RNZXNzYWdlPzogYm9vbGVhblxuICB9KSA9PiB7XG4gICAgLy8gVGV4dG8gZGVsIHN0cmVhbTogc29sbyBzZSBsZWUgZGVsIHN0b3JlIGN1YW5kbyBlc3RlIG1lbnNhamUgZXMgZWxcbiAgICAvLyBxdWUgZXN0w6EgZW4gc3RyZWFtaW5nLiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSBhw61zbGEgZWwgcmUtcmVuZGVyIGFcbiAgICAvLyBlc3RlIGNvbXBvbmVudGUsIHNpbiB0b2NhciBlbCByZXN0byBkZWwgw6FyYm9sLlxuICAgIGNvbnN0IHN0cmVhbWluZ1RleHQgPSB1c2VTdHJlYW1pbmdNZXNzYWdlKHByb3BzLmlzU3RyZWFtaW5nID8gcHJvcHMubWVzc2FnZUlkIDogbnVsbClcbiAgICBjb25zdCByYXdUZXh0ID0gcHJvcHMuaXNTdHJlYW1pbmcgPyBzdHJlYW1pbmdUZXh0IDogcHJvcHMubWVzc2FnZVxuICAgIC8vIFNtb290aCBzdHJlYW1pbmc6IGRlc2Fjb3BsYSBsYSBjYWRlbmNpYSBkZWwgYmFja2VuZCBkZWwgcmVuZGVyLlxuICAgIC8vIER1cmFudGUgZWwgc3RyZWFtaW5nIGxpYmVyYSBjaGFycyBhIHJpdG1vIGNvbnN0YW50ZSB2w61hIHJBRjsgY3VhbmRvXG4gICAgLy8gdGVybWluYSwgbXVlc3RyYSBlbCB0ZXh0byBmaW5hbCBhbCBpbnN0YW50ZSAoc2luIGFuaW1hY2nDs24gcmVzaWR1YWwpLlxuICAgIC8vIExvcyBkZWZhdWx0cyBkZWwgaG9vayBzZSBhanVzdGFyb24gZW1ww61yaWNhbWVudGUgZW4gc3RhZ2luZzsgYXVuIGFzw61cbiAgICAvLyBzZSBleHBvbmVuIGZsYWdzIGRlIHJ1bnRpbWUgKHdpbmRvdy4qKSBwYXJhIHBvZGVyIHR1bmVhciBzaW4gcmVjb21waWxhclxuICAgIC8vIHNpIGFsZ8O6biBiYWNrZW5kIHByZXNlbnRhIHVuYSBjYWRlbmNpYSBtdXkgZGlzdGludGEgZW4gcHJvZHVjY2nDs24uXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtQWRhcHQgPSBmYWxzZSAgICAgIC8vIGRlc2FjdGl2YSBhZGFwdGFjacOzbiBhbCBiYWNrZW5kXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtQnVmZmVyTXMgPSA2MDAgICAgIC8vIGNvbGNow7NuIG9iamV0aXZvIChtcylcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1MYWdNcyA9IDQ1MCAgICAgICAgLy8gbGFnIG3DoXhpbW8gYmFzZSAobXMpXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtTWluQnVmZmVyID0gNzAgICAgIC8vIHBpc28gZGVsIGNvbGNow7NuIGVuIGNoYXJzXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtV2FybXVwTXMgPSA0MDAgICAgIC8vIHdhcm11cCBpbmljaWFsIChtcylcbiAgICBjb25zdCB3aW5GbGFncyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/ICh3aW5kb3cgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBzdHJlYW1BZGFwdD86IGJvb2xlYW5cbiAgICAgICAgICAgIHN0cmVhbUJ1ZmZlck1zPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1MYWdNcz86IG51bWJlclxuICAgICAgICAgICAgc3RyZWFtTWluQnVmZmVyPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1XYXJtdXBNcz86IG51bWJlclxuICAgICAgICAgIH0pXG4gICAgICAgIDoge31cbiAgICBjb25zdCBkaXNwbGF5VGV4dCA9IHVzZVNtb290aFN0cmVhbVRleHQocmF3VGV4dCwge1xuICAgICAgZW5hYmxlZDogISFwcm9wcy5pc1N0cmVhbWluZyxcbiAgICAgIG1heENoYXJzUGVyRnJhbWU6IDI0LFxuICAgICAgc25hcFRvV29yZEJvdW5kYXJ5OiB0cnVlLFxuICAgICAgLi4uKHdpbkZsYWdzLnN0cmVhbUxhZ01zICE9IG51bGwgJiYgeyB0YXJnZXRMYWdNczogd2luRmxhZ3Muc3RyZWFtTGFnTXMgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtQWRhcHQgIT0gbnVsbCAmJiB7IGFkYXB0VG9CYWNrZW5kUmF0ZTogd2luRmxhZ3Muc3RyZWFtQWRhcHQgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtQnVmZmVyTXMgIT0gbnVsbCAmJiB7IHRhcmdldEJ1ZmZlck1zOiB3aW5GbGFncy5zdHJlYW1CdWZmZXJNcyB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1NaW5CdWZmZXIgIT0gbnVsbCAmJiB7IG1pbkJ1ZmZlckNoYXJzOiB3aW5GbGFncy5zdHJlYW1NaW5CdWZmZXIgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtV2FybXVwTXMgIT0gbnVsbCAmJiB7IHdhcm11cE1zOiB3aW5GbGFncy5zdHJlYW1XYXJtdXBNcyB9KSxcbiAgICB9KVxuICAgIGNvbnN0IGNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgPSBwcm9wcy5jcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkXG5cbiAgICBpZiAoIWRpc3BsYXlUZXh0ICYmICFwcm9wcy5pc1N0cmVhbWluZykgcmV0dXJuIG51bGxcbiAgICBjb25zdCBoYXNNZW50aW9ucyA9IGhhc0lubGluZU1hcmtlcnMoZGlzcGxheVRleHQpXG4gICAgY29uc3QgbWVudGlvbk5vZGVzID0gaGFzTWVudGlvbnMgPyByZW5kZXJUZXh0V2l0aE1lbnRpb25zKGRpc3BsYXlUZXh0KSA6IG51bGxcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPFNDQ0FJTWVzc2FnZVdyYXBwZXJcbiAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtwcm9wcy5pc0N1cnJlbnRVc2VyfVxuICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZShkaXNwbGF5VGV4dCl9XG4gICAgICAgID5cbiAgICAgICAgICB7aGFzTWVudGlvbnMgJiYgbWVudGlvbk5vZGVzID8gKFxuICAgICAgICAgICAgLy8gU2kgaGF5IG1lbnRpb25zLCByZW5kZXJpemFyIGRpcmVjdGFtZW50ZSAoc2luIG1hcmtkb3duIGVuIGVsIG1pc21vIHDDoXJyYWZvKVxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZScgfX0+e21lbnRpb25Ob2Rlc308L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8vIFNpbiBtZW50aW9ucywgcGFzYXIgYSBTdHJlYW1kb3duIHBhcmEgbWFya2Rvd24gc3VwcG9ydFxuICAgICAgICAgICAgPE1haWFTdHJlYW1kb3duXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJjaGF0XCJcbiAgICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17cHJvcHMuaXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICAgICAgY29tcG9uZW50cz17eyBhOiBFbnRpdHlMaW5rQ3VzdG9tTGluayB9IGFzIE1haWFTdHJlYW1kb3duUHJvcHNbJ2NvbXBvbmVudHMnXX1cbiAgICAgICAgICAgICAgaXNBbmltYXRpbmc9eyEhcHJvcHMuaXNTdHJlYW1pbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgIDwvTWFpYVN0cmVhbWRvd24+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9TQ0NBSU1lc3NhZ2VXcmFwcGVyPlxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNFcnJvciAmJlxuICAgICAgICAgICFwcm9wcy5hcHByb3ZhbCAmJlxuICAgICAgICAgICFwcm9wcy5pc1N0cmVhbWluZyAmJlxuICAgICAgICAgICghcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCB8fCAhIXByb3BzLm9uUmV0cnkpICYmIChcbiAgICAgICAgICAgIDxNZXNzYWdlRmVlZGJhY2tcbiAgICAgICAgICAgICAgY29udGVudD17ZGlzcGxheVRleHR9XG4gICAgICAgICAgICAgIHNvdXJjZXM9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWQgPyB1bmRlZmluZWQgOiBwcm9wcy5zb3VyY2VzfVxuICAgICAgICAgICAgICBoYW5kbGVGZWVkYmFjaz17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCA/IHVuZGVmaW5lZCA6IHByb3BzLmhhbmRsZUZlZWRiYWNrQ2xpY2t9XG4gICAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17cHJvcHMuZGlzYWJsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBvblJldHJ5PXtwcm9wcy5vblJldHJ5fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCAmJlxuICAgICAgICAgICFwcm9wcy5hcHByb3ZhbCAmJlxuICAgICAgICAgICghcHJvcHMuaXNFcnJvciB8fCBwcm9wcy5zdWdnZXN0aW9ucz8ubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgICA8Q2hhdEFJU3VnZ2VzdGlvbnNcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM9e3Byb3BzLnN1Z2dlc3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICBvblNlbGVjdFN1Z2dlc3Rpb249e3N1Z2dlc3Rpb24gPT4gcHJvcHMuaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKHByb3BzLm1lc3NhZ2VJZCwgc3VnZ2VzdGlvbil9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkfVxuICAgICAgICAgICAgICBoaWRkZW49eyEhcHJvcHMuaXNTdHJlYW1pbmcgfHwgIXByb3BzLmlzTGFzdE1lc3NhZ2UgfHwgISFwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNFcnJvciAmJlxuICAgICAgICAgICFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgISFjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkICYmIChcbiAgICAgICAgICAgIDxDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnNcbiAgICAgICAgICAgICAgYWdlbnRJZD17Y3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZH1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAgIGhpZGRlbj17ISFwcm9wcy5pc1N0cmVhbWluZyB8fCAhcHJvcHMuaXNMYXN0TWVzc2FnZSB8fCAhIXByb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cbilcblxuY29uc3QgTWVzc2FnZUl0ZW0gPSBtZW1vKChwcm9wczogTWVzc2FnZUl0ZW1Qcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgdXNlcixcbiAgICBtZXNzYWdlLFxuICAgIGlzU3RyZWFtaW5nLFxuICAgIGlzRXJyb3IsXG4gICAgYXV0aFVzZXIsXG4gICAgb3B0aW9ucyxcbiAgICBpc0NoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uLFxuICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljayxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGRpc2FibGVGZWVkYmFjayxcbiAgICBoYW5kbGVSZXRyeSxcbiAgICByb2xlLFxuICAgIHNvdXJjZXMsXG4gICAgYXR0YWNobWVudHMsXG4gICAgYXBwcm92YWwsXG4gICAgYXBwcm92YWxTdGF0dXMsXG4gICAgc3VnZ2VzdGlvbnMsXG4gICAgY3JlYXRlQWdlbnRGb2xsb3dVcCxcbiAgICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb24sXG4gICAgaXNMYXN0TWVzc2FnZSxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgW3ByZXZpZXdBdHRhY2htZW50LCBzZXRQcmV2aWV3QXR0YWNobWVudF0gPSB1c2VTdGF0ZTxBdHRhY2htZW50RmlsZSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzQ3VycmVudFVzZXIgPSByb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCB1c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpXG4gIGNvbnN0IGlzQXNzaXN0YW50ID0gcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCB8fCB1c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICAvLyBNaWVudHJhcyBlbCBhZ2VudGUgXCJwaWVuc2FcIiAoc3RyZWFtaW5nIHNpbiB0ZXh0bykgbm8gbW9udGFtb3MgZWwgTWVzc2FnZUl0ZW06XG4gIC8vIHVuIHBsYWNlaG9sZGVyIHZhY8OtbyBzdW1hcsOtYSBvdHJvIGdhcCBkZSAzNnB4IGVuY2ltYSBkZWwgaW5kaWNhZG9yIGRlIGFjdGl2aWRhZC5cbiAgY29uc3QgaXNTdHJlYW1pbmdQbGFjZWhvbGRlciA9IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQoaWQpXG4gIGNvbnN0IHN0cmVhbWluZ1RleHQgPSB1c2VTdHJlYW1pbmdNZXNzYWdlKGlzU3RyZWFtaW5nIHx8IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPyBpZCA6IG51bGwpXG4gIGNvbnN0IGlzQWN0aXZlU3RyZWFtaW5nID0gISFpc1N0cmVhbWluZyB8fCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyXG4gIGNvbnN0IGlzVGhpbmtpbmcgPSBpc0FjdGl2ZVN0cmVhbWluZyAmJiAhc3RyZWFtaW5nVGV4dFxuICBpZiAoaXNUaGlua2luZykge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgY29uc3QgbWVzc2FnZUF0dGFjaG1lbnRzID1cbiAgICBhdHRhY2htZW50cyAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwXG4gICAgICA/IGF0dGFjaG1lbnRzXG4gICAgICA6ICFpc0Fzc2lzdGFudCAmJiBBcnJheS5pc0FycmF5KHNvdXJjZXMpXG4gICAgICAgID8gKHNvdXJjZXMgYXMgQXR0YWNobWVudEZpbGVbXSlcbiAgICAgICAgOiBbXVxuXG4gIGNvbnN0IGhhbmRsZUF0dGFjaG1lbnRDbGljayA9IChhdHRhY2htZW50OiBBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgIC8vIFBlcm1pdGlyIHByZXZpc3VhbGl6YWNpw7NuIHNpIHRpZW5lIGFyY2hpdm8gbG9jYWwgbyBVUkxzIGRlbCBiYWNrZW5kXG4gICAgaWYgKFxuICAgICAgYXR0YWNobWVudC5maWxlIGluc3RhbmNlb2YgRmlsZSB8fFxuICAgICAgYXR0YWNobWVudC5vcmlnaW5hbEZpbGUgaW5zdGFuY2VvZiBGaWxlIHx8XG4gICAgICBhdHRhY2htZW50LnVybF90aHVtYm5haWwgfHxcbiAgICAgIGF0dGFjaG1lbnQudXJsX29yaWdpbmFsIHx8XG4gICAgICBhdHRhY2htZW50LnVybF9maWxlXG4gICAgKSB7XG4gICAgICBzZXRQcmV2aWV3QXR0YWNobWVudChhdHRhY2htZW50KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlUHJldmlldyA9ICgpID0+IHtcbiAgICBzZXRQcmV2aWV3QXR0YWNobWVudChudWxsKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudERvd25sb2FkID0gYXN5bmMgKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gYXR0YWNobWVudC5uYW1lLmluY2x1ZGVzKCcuJykgPyAnJyA6IGAuJHthdHRhY2htZW50LnR5cGV9YFxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7YXR0YWNobWVudC5uYW1lfSR7ZXh0ZW5zaW9ufWBcbiAgICBjb25zdCBmaWxlVXJsID0gYXR0YWNobWVudC51cmxfb3JpZ2luYWwgfHwgYXR0YWNobWVudC51cmxfZmlsZSB8fCBhdHRhY2htZW50LnVybF90aHVtYm5haWxcblxuICAgIHRyeSB7XG4gICAgICBsZXQgYmxvYlVybDogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgICAgaWYgKGZpbGVVcmwpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZEZpbGUgPSBhd2FpdCBkb3dubG9hZEZpbGVGcm9tVXJsKGZpbGVVcmwsIGZpbGVOYW1lLCBhdHRhY2htZW50LnR5cGUpXG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRvd25sb2FkZWRGaWxlKVxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGF0dGFjaG1lbnQuZmlsZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFibG9iVXJsKSByZXR1cm5cblxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgbGluay5ocmVmID0gYmxvYlVybFxuICAgICAgbGluay5kb3dubG9hZCA9IGZpbGVOYW1lXG4gICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICAgIGxpbmsuY2xpY2soKVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGJsb2JVcmwpXG4gICAgICB9LCAxMDApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkb3dubG9hZCBhdHRhY2htZW50JywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQ2hhbmdlUHJvamVjdCAmJiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNZXNzYWdlV3JhcHBlciBrZXk9e2lkfSBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfSBkYXRhLW1lc3NhZ2UtaWQ9e2lkfSBoYXNGZWVkYmFjaz17ZmFsc2V9PlxuICAgICAgICA8U0NNZXNzYWdlSXRlbVdyYXBwZXIgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgPE1lc3NhZ2VDb250ZW50V3JhcHBlclxuICAgICAgICAgICAgaXNDaGFuZ2VQcm9qZWN0PXtpc0NoYW5nZVByb2plY3R9XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBtZXNzYWdlRXh0cmFDb250ZW50PXs8TWVzc2FnZU9wdGlvbnMgb3B0aW9ucz17b3B0aW9ucyBhcyBhbnl9IGhhbmRsZVNlbGVjdE9wdGlvbj17aGFuZGxlU2VsZWN0T3B0aW9ufSAvPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICAgICAgPC9NZXNzYWdlV3JhcHBlcj5cbiAgICApXG4gIH1cblxuICBjb25zdCBoYW5kbGVGZWVkYmFja0NsaWNrID0gKGZlZWRiYWNrOiBGZWVkYmFjaykgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGlkXG4gICAgICAuc3BsaXQoJy0nKVxuICAgICAgLmZpbHRlcihxdWVzdGlvbklkID0+IHF1ZXN0aW9uSWQgIT09ICdhbnN3ZXInKVxuICAgICAgLmpvaW4oJy0nKVxuICAgIGhhbmRsZUZlZWRiYWNrPy4oZmVlZGJhY2ssIHNlc3Npb25JZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAgPFNDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgICAgeyEhbWVzc2FnZUF0dGFjaG1lbnRzLmxlbmd0aCAmJiAoXG4gICAgICAgICAgPFNDQXR0YWNobWVudHNSb3cgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgICB7bWVzc2FnZUF0dGFjaG1lbnRzLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGV0ZWN0YXIgc2kgZXMgdW4gYXJjaGl2byBkZSBhdWRpb1xuICAgICAgICAgICAgICBjb25zdCBhdHRhY2htZW50VHlwZSA9IGF0dGFjaG1lbnQ/LnR5cGU/LnRvTG93ZXJDYXNlKCkgfHwgJydcbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudE5hbWUgPSBhdHRhY2htZW50Py5uYW1lPy50b0xvd2VyQ2FzZSgpIHx8ICcnXG4gICAgICAgICAgICAgIGNvbnN0IGlzQXVkaW9GaWxlID1cbiAgICAgICAgICAgICAgICBhdHRhY2htZW50VHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKSB8fFxuICAgICAgICAgICAgICAgIFsnZmxhYycsICdtNGEnLCAnbXAzJywgJ21wNCcsICdvZ2EnLCAnb2dnJywgJ3dhdicsICd3ZWJtJ10uaW5jbHVkZXMoYXR0YWNobWVudFR5cGUpIHx8XG4gICAgICAgICAgICAgICAgWycuZmxhYycsICcubTRhJywgJy5tcDMnLCAnLm1wNCcsICcub2dhJywgJy5vZ2cnLCAnLndhdicsICcud2VibSddLnNvbWUoZXh0ID0+XG4gICAgICAgICAgICAgICAgICBhdHRhY2htZW50TmFtZS5lbmRzV2l0aChleHQpXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIGlmIChpc0F1ZGlvRmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA8QXR0YWNobWVudENhcmRBdWRpbyBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7YXR0YWNobWVudC5uYW1lfWB9IGF0dGFjaG1lbnQ9e2F0dGFjaG1lbnR9IC8+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxBdHRhY2htZW50Q2FyZFxuICAgICAgICAgICAgICAgICAga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2F0dGFjaG1lbnQubmFtZX1gfVxuICAgICAgICAgICAgICAgICAgYXR0YWNobWVudD17YXR0YWNobWVudH1cbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5kZXg9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgb25Eb3dubG9hZD17KCkgPT4gaGFuZGxlQXR0YWNobWVudERvd25sb2FkKGF0dGFjaG1lbnQpfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQXR0YWNobWVudENsaWNrKGF0dGFjaG1lbnQpfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU0NBdHRhY2htZW50c1Jvdz5cbiAgICAgICAgKX1cbiAgICAgICAgeyghIW1lc3NhZ2UgfHwgaXNBY3RpdmVTdHJlYW1pbmcpICYmICEoaXNBc3Npc3RhbnQgJiYgISFtZXNzYWdlQXR0YWNobWVudHMubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgPFN0cmVhbWluZ01lc3NhZ2VCb2R5XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlID8/ICcnfVxuICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2lzQWN0aXZlU3RyZWFtaW5nfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH1cbiAgICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgICBhcHByb3ZhbD17YXBwcm92YWx9XG4gICAgICAgICAgICBpc0Vycm9yPXtpc0Vycm9yfVxuICAgICAgICAgICAgc291cmNlcz17c291cmNlc31cbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPXtzdWdnZXN0aW9uc31cbiAgICAgICAgICAgIGNyZWF0ZUFnZW50Rm9sbG93VXA9e2NyZWF0ZUFnZW50Rm9sbG93VXB9XG4gICAgICAgICAgICBoYW5kbGVGZWVkYmFja0NsaWNrPXtoYW5kbGVGZWVkYmFja0NsaWNrfVxuICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXtkaXNhYmxlRmVlZGJhY2sgPz8gbnVsbH1cbiAgICAgICAgICAgIG9uUmV0cnk9e2hhbmRsZVJldHJ5fVxuICAgICAgICAgICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrPXtoYW5kbGVTdWdnZXN0aW9uQ2xpY2t9XG4gICAgICAgICAgICBzdWdnZXN0aW9uc0Rpc2FibGVkPXtpc0FjdGl2ZVN0cmVhbWluZyB8fCAhIWhhc1NlbGVjdGVkU3VnZ2VzdGlvbn1cbiAgICAgICAgICAgIG1lc3NhZ2VJZD17aWR9XG4gICAgICAgICAgICBpc0xhc3RNZXNzYWdlPXtpc0xhc3RNZXNzYWdlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIHthcHByb3ZhbCAmJiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMgJiYgKFxuICAgICAgICAgIDxTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgICAgIDxBcHByb3ZhbEJveFxuICAgICAgICAgICAgICBhY3Rpb25zPXthcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnN9XG4gICAgICAgICAgICAgIHN0YXR1cz17YXBwcm92YWxTdGF0dXN9XG4gICAgICAgICAgICAgIG9uQXBwcm92ZT17dGhyZWFkSWRzID0+IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24odGhyZWFkSWRzLCAnYXBwcm92ZScpfVxuICAgICAgICAgICAgICBvblJlamVjdD17dGhyZWFkSWRzID0+IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24odGhyZWFkSWRzLCAncmVqZWN0Jyl9XG4gICAgICAgICAgICAgIGlzUHJvamVjdERlbGV0ZWQ9e3Byb3BzLnByb2plY3RNZXRhZGF0YT8uaXNfZGVsZXRlZCA9PT0gdHJ1ZX1cbiAgICAgICAgICAgICAgaXNFeHBhbmRlZD17cHJvcHMuZXhwYW5kZWR9XG4gICAgICAgICAgICAgIGhpdGxJbnN0YW5jZUlkPXthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9XG4gICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlPXthcHByb3ZhbC53YXJuaW5nX21lc3NhZ2V9XG4gICAgICAgICAgICAgIG1hbnVhbEFwcHJvdmFsRGV0ZWN0ZWQ9e2FwcHJvdmFsLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9TQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgKX1cbiAgICAgIDwvU0NNZXNzYWdlSXRlbUlubmVyPlxuICAgICAgPEF0dGFjaG1lbnRQcmV2aWV3TW9kYWxcbiAgICAgICAgaXNPcGVuPXshIXByZXZpZXdBdHRhY2htZW50fVxuICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZVByZXZpZXd9XG4gICAgICAgIGF0dGFjaG1lbnQ9e3ByZXZpZXdBdHRhY2htZW50fVxuICAgICAgLz5cbiAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICApXG59KVxuXG5jb25zdCBDaGF0QUlNZXNzYWdlc0lubmVyID0gKHtcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBpbml0aWFsQ2hhdElkLFxuICBvbkVycm9yLFxuICBvblNlbmRNZXNzYWdlUmVhZHksXG4gIG9uU2Nyb2xsVG9Cb3R0b20sXG4gIGF0dGFjaG1lbnRzLFxuICBhZ2VudHMsXG4gIGV4cGFuZGVkLFxufTogQ2hhdEFJTWVzc2FnZXNQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCB7IGlzV2ViU2VhcmNoQWN0aXZlLCBpc0RlZXBTZWFyY2hBY3RpdmUsIGFnZW50IH0gPSB1c2VHbG9iYWxDb250ZXh0KClcbiAgY29uc3QgZXZlbnQgPSB1c2VFdmVudCgpXG4gIGNvbnN0IGF1dGhVc2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IG1lc3NhZ2VzUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBjaGF0SW5pdGlhbGl6ZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGlzTG9hZGluZ01vcmVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHVzZXJTY3JvbGxpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNjcm9sbFRocmVzaG9sZFJlZiA9IHVzZVJlZigzOSlcbiAgY29uc3QgbGFzdFNjcm9sbFRvcFJlZiA9IHVzZVJlZigwKVxuICBjb25zdCBzaG93U2Nyb2xsVG9Cb3R0b21SZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNjcm9sbFJhZlJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCB3YXNMb2FkaW5nTWVzc2FnZXNSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGxhc3RTY3JvbGxlZFNlc3Npb25SZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgcGVuZGluZ1Njcm9sbFJlc3RvcmVSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbClcbiAgY29uc3Qgc2Nyb2xsUGVyc2lzdFRpbWVyUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzaG93U2Nyb2xsVG9Cb3R0b20sIHNldFNob3dTY3JvbGxUb0JvdHRvbV0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMsIHNldFNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNdID0gdXNlU3RhdGU8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KVxuXG4gIGNvbnN0IHtcbiAgICBtZXNzYWdlcyxcbiAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dyaXRpbmcsXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgYWN0aXZlTG9hZGluZ3MsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgcmV0cnlNZXNzYWdlLFxuICAgIGNoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlRmVlZGJhY2ssXG4gICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICBpbml0aWFsaXplQ2hhdCxcbiAgICBoYW5kbGVTY3JvbGwsXG4gICAgc3RvcEdlbmVyYXRpb24sXG4gIH0gPSB1c2VDaGF0TWFuYWdlcih7XG4gICAgY2hhdElkOiBpbml0aWFsQ2hhdElkIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgb25FcnJvcixcbiAgICBhdHRhY2htZW50cyxcbiAgICBhZ2VudHMsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0T3B0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdGlvbjogUHJvamVjdCkgPT4ge1xuICAgICAgY2hhbmdlUHJvamVjdChvcHRpb24pXG4gICAgfSxcbiAgICBbY2hhbmdlUHJvamVjdF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25DbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlSWQ6IHN0cmluZywgc3VnZ2VzdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXN1Z2dlc3Rpb24/LnRyaW0oKSkgcmV0dXJuXG4gICAgICBpZiAoc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1ttZXNzYWdlSWRdKSByZXR1cm5cbiAgICAgIGNvbnN0IGlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCA9IGlzTWFpYWtlckFnZW50KGFnZW50KVxuICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdFN1Z2dlc3RlZEFuc3dlciwge1xuICAgICAgICBhZ2VudF90eXBlOiBpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQgPyAnbWFya2V0cGxhY2UnIDogYWdlbnQ/LnR5cGUsXG4gICAgICB9KVxuICAgICAgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyhwcmV2ID0+ICh7IC4uLnByZXYsIFttZXNzYWdlSWRdOiB0cnVlIH0pKVxuXG4gICAgICBjb25zdCB0YXJnZXRNZXNzYWdlID0gbWVzc2FnZXMuZmluZChtc2cgPT4gbXNnLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICBjb25zdCBpc1JldHJ5U3VnZ2VzdGlvbiA9ICEhdGFyZ2V0TWVzc2FnZT8uaXNFcnJvciAmJiBzdWdnZXN0aW9uID09PSB0KCdjaGF0LnJldHJ5JylcbiAgICAgIGlmIChpc1JldHJ5U3VnZ2VzdGlvbikge1xuICAgICAgICBjb25zdCBsYXN0VXNlck1lc3NhZ2UgPSBtZXNzYWdlc1xuICAgICAgICAgIC5maWx0ZXIobXNnID0+IG1zZy5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCBtc2cudXNlci5pZCA9PT0gYXV0aFVzZXIuaWQudG9TdHJpbmcoKSlcbiAgICAgICAgICAuYXQoLTEpXG4gICAgICAgIGlmIChsYXN0VXNlck1lc3NhZ2U/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICBjb25zdCByZXRyeUF0dGFjaG1lbnRzID0gQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2UuYXR0YWNobWVudHMpXG4gICAgICAgICAgICA/IGxhc3RVc2VyTWVzc2FnZS5hdHRhY2htZW50c1xuICAgICAgICAgICAgOiBBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZS5zb3VyY2VzKVxuICAgICAgICAgICAgICA/IGxhc3RVc2VyTWVzc2FnZS5zb3VyY2VzXG4gICAgICAgICAgICAgIDogW11cbiAgICAgICAgICBzZW5kTWVzc2FnZShsYXN0VXNlck1lc3NhZ2UubWVzc2FnZSwgcmV0cnlBdHRhY2htZW50cylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZW5kTWVzc2FnZShzdWdnZXN0aW9uKVxuICAgIH0sXG4gICAgW1xuICAgICAgc2VuZE1lc3NhZ2UsXG4gICAgICBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzLFxuICAgICAgZXZlbnQsXG4gICAgICBhZ2VudD8uZW50aXR5LFxuICAgICAgYWdlbnQ/Lm5hbWUsXG4gICAgICBhZ2VudD8udHlwZSxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgdCxcbiAgICAgIGF1dGhVc2VyLmlkLFxuICAgIF1cbiAgKVxuXG4gIC8qKlxuICAgKiBBY3R1YWxpemEgZWwgZXN0YWRvIGRlbCBib3TDs24gXCJzY3JvbGwgdG8gYm90dG9tXCIgY29tcGFyYW5kbyBsYSBwb3NpY2nDs25cbiAgICogYWN0dWFsIGRlbCBzY3JvbGwgY29uIGVsIGZvbmRvLiBVc2EgdW4gcmVmIHBhcmEgZXZpdGFyIGBzZXRTdGF0ZWAgY3VhbmRvXG4gICAqIGVsIHZhbG9yIG5vIGNhbWJpYS5cbiAgICovXG4gIGNvbnN0IHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgaWYgKCFlbCkgcmV0dXJuXG4gICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBlbFxuICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodFxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBkaXN0YW5jZUZyb21Cb3R0b20gPiA1MFxuICAgIGlmIChzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCAhPT0gc2hvdWxkU2hvdykge1xuICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgaW5tZWRpYXRvIGFsIGZvbmRvIChkZW50cm8gZGUgckFGIHBhcmEgY29vcmRpbmFyIGNvbiBlbCBwYWludClcbiAgICogeSBhY3R1YWxpemEgbGEgdmlzaWJpbGlkYWQgZGVsIGJvdMOzbi4gUmVzcGV0YSBgc2tpcElmVXNlclNjcm9sbGluZ2AgcGFyYVxuICAgKiBubyBzb2JyZXNjcmliaXIgZWwgc2Nyb2xsIG1hbnVhbCBkZWwgdXN1YXJpbyBkdXJhbnRlIGVsIHN0cmVhbWluZy5cbiAgICovXG4gIGNvbnN0IHNjcm9sbFRvQm90dG9tUmFmID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdHM6IHsgc2tpcElmVXNlclNjcm9sbGluZz86IGJvb2xlYW47IGRlbGF5TXM/OiBudW1iZXIgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IHNraXBJZlVzZXJTY3JvbGxpbmcgPSBmYWxzZSwgZGVsYXlNcyA9IDAgfSA9IG9wdHNcbiAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVsKSByZXR1cm5cbiAgICAgICAgICBpZiAoc2tpcElmVXNlclNjcm9sbGluZyAmJiB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQpIHJldHVyblxuICAgICAgICAgIGVsLnNjcm9sbFRvcCA9IGVsLnNjcm9sbEhlaWdodFxuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGRlbGF5TXMgPiAwKSBzZXRUaW1lb3V0KHJ1biwgZGVsYXlNcylcbiAgICAgIGVsc2UgcnVuKClcbiAgICB9LFxuICAgIFt1cGRhdGVTY3JvbGxCb3R0b21WaXNpYmlsaXR5XVxuICApXG5cbiAgY29uc3QgaGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIW1lc3NhZ2VzUmVmLmN1cnJlbnQpIHJldHVyblxuICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQuc2Nyb2xsVG8oe1xuICAgICAgdG9wOiBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbEhlaWdodCxcbiAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICB9KVxuICAgIC8vIERhciB0aWVtcG8gYWwgc21vb3RoLXNjcm9sbCBhbnRlcyBkZSByZWNhbGN1bGFyIGxhIHZpc2liaWxpZGFkIGRlbCBib3TDs24uXG4gICAgc2V0VGltZW91dCh1cGRhdGVTY3JvbGxCb3R0b21WaXNpYmlsaXR5LCA1MDApXG4gIH0sIFt1cGRhdGVTY3JvbGxCb3R0b21WaXNpYmlsaXR5XSlcblxuICAvLyBBbCBkZWNpZGlyIGVuIGVsIEFwcHJvdmFsQm94OiBlbCBib3ggY29sYXBzYSAoYm90b25lcyAtPiBiYWRnZSkgeSBlbCBzdHJlYW1cbiAgLy8gY29udGluw7phIGFiYWpvLiBSZWFjdGl2YXIgZWwgYXV0by1zY3JvbGwgeSBzZWd1aXIgZWwgZm9uZG8gcGFyYSBxdWUgbGEgdmlzdGFcbiAgLy8gbm8gcXVlZGUgYXRyw6FzIChldml0YSBxdWUgYXBhcmV6Y2EgbGEgZmxlY2hhIGRlIHNjcm9sbC10by1ib3R0b20pLlxuICBjb25zdCBoYW5kbGVBcHByb3ZhbERlY2lzaW9uV2l0aFNjcm9sbCA9IHVzZUNhbGxiYWNrKFxuICAgICguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBoYW5kbGVBcHByb3ZhbERlY2lzaW9uPikgPT4ge1xuICAgICAgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICAgIGhhbmRsZUFwcHJvdmFsRGVjaXNpb24oLi4uYXJncylcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKHsgZGVsYXlNczogMTAwIH0pXG4gICAgfSxcbiAgICBbaGFuZGxlQXBwcm92YWxEZWNpc2lvbiwgc2Nyb2xsVG9Cb3R0b21SYWZdXG4gIClcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5VSUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZS5jdXJyZW50VGFyZ2V0XG5cbiAgICAgIGlmIChzY3JvbGxSYWZSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShzY3JvbGxSYWZSZWYuY3VycmVudClcbiAgICAgIH1cblxuICAgICAgc2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcblxuICAgICAgICBjb25zdCBpc1Njcm9sbGluZ1VwID0gc2Nyb2xsVG9wIDwgbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzU2Nyb2xsaW5nVXApIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDE1XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc05lYXJCb3R0b20gPSBzY3JvbGxIZWlnaHQgLSBzY3JvbGxUb3AgLSBjbGllbnRIZWlnaHQgPCBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudFxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20pIHtcbiAgICAgICAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgICAgIH1cblxuICAgICAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSAhaXNOZWFyQm90dG9tXG4gICAgICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IHNjcm9sbFRvcFxuXG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkoKVxuXG4gICAgICAgIGlmIChpbml0aWFsQ2hhdElkICYmIHNjcm9sbFRvcCA+IDApIHtcbiAgICAgICAgICBpZiAoc2Nyb2xsUGVyc2lzdFRpbWVyUmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzY3JvbGxQZXJzaXN0VGltZXJSZWYuY3VycmVudClcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsUGVyc2lzdFRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24oYXV0aFVzZXIuaWQsIHtcbiAgICAgICAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICAgICAgICBzY3JvbGxTZXNzaW9uSWQ6IGluaXRpYWxDaGF0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sIDE1MClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20gJiYgb25TY3JvbGxUb0JvdHRvbSkge1xuICAgICAgICAgIG9uU2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlU2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbYXV0aFVzZXIuaWQsIGhhbmRsZVNjcm9sbCwgaW5pdGlhbENoYXRJZCwgb25TY3JvbGxUb0JvdHRvbSwgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eV1cbiAgKVxuXG4gIC8vIHJlZnMgdG8gc3RhYmlsaXplIGZ1bmN0aW9ucyBhbmQgYXZvaWQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICBjb25zdCBzZW5kTWVzc2FnZVJlZiA9IHVzZVJlZihzZW5kTWVzc2FnZSlcbiAgY29uc3Qgc3RvcEdlbmVyYXRpb25SZWYgPSB1c2VSZWYoc3RvcEdlbmVyYXRpb24pXG4gIGNvbnN0IG9uU2VuZE1lc3NhZ2VSZWFkeVJlZiA9IHVzZVJlZihvblNlbmRNZXNzYWdlUmVhZHkpXG4gIGNvbnN0IHNlbmRNZXNzYWdlUHJveHlSZWYgPSB1c2VSZWYoXG4gICAgKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZ1xuICAgICkgPT4gc2VuZE1lc3NhZ2VSZWYuY3VycmVudChtZXNzYWdlLCBhdHRhY2htZW50cywgZmFxSWQsIGFnZW50U3VnZ2VzdGlvbklkLCBtZW50aW9ucywgZnVhSWQsIHNjSWQpXG4gIClcbiAgY29uc3Qgc3RvcEdlbmVyYXRpb25Qcm94eVJlZiA9IHVzZVJlZigoKSA9PiBzdG9wR2VuZXJhdGlvblJlZi5jdXJyZW50KCkpXG5cbiAgLy8gdXBkYXRlIHJlZnMgd2hlbiBmdW5jdGlvbnMgY2hhbmdlXG4gIHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQgPSBzZW5kTWVzc2FnZVxuICBzdG9wR2VuZXJhdGlvblJlZi5jdXJyZW50ID0gc3RvcEdlbmVyYXRpb25cbiAgb25TZW5kTWVzc2FnZVJlYWR5UmVmLmN1cnJlbnQgPSBvblNlbmRNZXNzYWdlUmVhZHlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudCkge1xuICAgICAgb25TZW5kTWVzc2FnZVJlYWR5UmVmLmN1cnJlbnQoXG4gICAgICAgIHNlbmRNZXNzYWdlUHJveHlSZWYuY3VycmVudCxcbiAgICAgICAgc3RvcEdlbmVyYXRpb25Qcm94eVJlZi5jdXJyZW50LFxuICAgICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICAgIGlzV3JpdGluZ1xuICAgICAgKVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTG9hZGluZ01vcmVSZWYuY3VycmVudCA9IGlzTG9hZGluZ01vcmVNZXNzYWdlc1xuICB9LCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSlcblxuICAvLyBDdWFuZG8gZWwgYWdlbnRlIGVtcGllemEgYSByZXNwb25kZXIsIHJlc2V0ZWFyIGVsIGZsYWcgeSBlbCB1bWJyYWwgcGFyYSBhY3RpdmFyIGVsIGF1dG8tc2Nyb2xsXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHdhaXRpbmdSZXNwb25zZSkge1xuICAgICAgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjaGF0SW5pdGlhbGl6ZWRSZWYuY3VycmVudCkge1xuICAgICAgY2hhdEluaXRpYWxpemVkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICBpbml0aWFsaXplQ2hhdCgpXG4gICAgfVxuICB9LCBbXSlcblxuICAvLyBBdXRvc2Nyb2xsIG1pZW50cmFzIGVsIHRleHRvIGRlbCBzdHJlYW0gY3JlY2UuIEVsIHRleHRvIHNlIHBpbnRhIGFsIHJpdG1vXG4gIC8vIGRlIGB1c2VTbW9vdGhTdHJlYW1UZXh0YCAofjYwZnBzKSwgbm8gYWwgcml0bW8gZGUgbGxlZ2FkYSBkZSB0b2tlbnMgZGVsXG4gIC8vIGJhY2tlbmQ6IHBvciBlc28gYWPDoSB1c2Ftb3MgdW4gbG9vcCBkZSByQUYgcXVlIGNvbXBhcmEgYHNjcm9sbEhlaWdodGBcbiAgLy8gY29udHJhIGVsIMO6bHRpbW8gdmFsb3Igb2JzZXJ2YWRvIHkgYWp1c3RhIHNvbG8gY3VhbmRvIGNhbWJpYS4gQXPDrSBlbFxuICAvLyBzY3JvbGwgcXVlZGEgcGVyZmVjdGFtZW50ZSBzaW5jcm9uaXphZG8gY29uIGxhIGFuaW1hY2nDs24gZGVsIHRleHRvIHNpblxuICAvLyBkZXBlbmRlciBkZSBsYSBjYWRlbmNpYSBkZWwgc3RyZWFtaW5nU3RvcmUuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF3YWl0aW5nUmVzcG9uc2UgJiYgIWlzV3JpdGluZykgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmICghbWVzc2FnZXNSZWYuY3VycmVudCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgbGV0IHJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICAgIGxldCBsYXN0SGVpZ2h0ID0gbWVzc2FnZXNSZWYuY3VycmVudC5zY3JvbGxIZWlnaHRcblxuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmFmSWQgPSBudWxsXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudEhlaWdodCA9IGVsLnNjcm9sbEhlaWdodFxuICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgIT09IGxhc3RIZWlnaHQpIHtcbiAgICAgICAgbGFzdEhlaWdodCA9IGN1cnJlbnRIZWlnaHRcbiAgICAgICAgaWYgKCF1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBlbC5zY3JvbGxUb3AgPSBjdXJyZW50SGVpZ2h0XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eSgpXG4gICAgICB9XG4gICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgIH1cblxuICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChyYWZJZCAhPSBudWxsKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZClcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIGlzV3JpdGluZywgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eV0pXG5cbiAgLy8gQWwgY29tZW56YXIgYSBlc3BlcmFyIGxhIHJlc3B1ZXN0YSBkZWwgYmFja2VuZCwgc2Nyb2xsIGluaWNpYWwgYWwgZm9uZG8uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHdhaXRpbmdSZXNwb25zZSAmJiBtZXNzYWdlc1JlZi5jdXJyZW50KSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZih7IHNraXBJZlVzZXJTY3JvbGxpbmc6IHRydWUgfSlcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIHNjcm9sbFRvQm90dG9tUmFmXSlcblxuICAvLyBTY3JvbGwgY3VhbmRvIGNhbWJpYW4gbG9zIG1lbnNhamVzOiBkaXN0aW5ndWUgXCJudWV2byBtZW5zYWplXCIgKGFncmVnYWRvKVxuICAvLyBkZSBcInJlZW1wbGF6b1wiIChtaXNtbyBpZC9sZW5ndGgsIGVqLiBmZWVkYmFjayBvIGFwcHJvdmFsU3RhdHVzKS4gRW5cbiAgLy8gcmVlbXBsYXpvcyBzb2xvIHNlIHJlY2FsY3VsYSBsYSB2aXNpYmlsaWRhZCBkZWwgYm90w7NuIHNpbiBmb3J6YXIgc2Nyb2xsLlxuICBjb25zdCBsYXN0TWVzc2FnZUlkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGxhc3RNZXNzYWdlc0xlbmd0aFJlZiA9IHVzZVJlZjxudW1iZXI+KDApXG5cbiAgLy8gQWwgY2FtYmlhciBkZSBzZXNpw7NuLCByZXNldGVhciBlc3RhZG8gZGUgc2Nyb2xsIG1hbnVhbCBwYXJhIG5vIGhlcmVkYXIgZWwgY2hhdCBhbnRlcmlvci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IDBcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSAwXG4gIH0sIFtpbml0aWFsQ2hhdElkXSlcblxuICAvLyBSZXN0YXVyYWNpw7NuIGRlc2RlIGNhY2hlIChzaW4gTG9hZGVyKTogYmFqYXIgYWwgZm9uZG8gYWwgcmVhYnJpciBzZXNpw7NuIHZpc2l0YWRhLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgIWluaXRpYWxDaGF0SWQgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAobGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID09PSBpbml0aWFsQ2hhdElkKSByZXR1cm5cbiAgICBsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmLmN1cnJlbnQgPSBpbml0aWFsQ2hhdElkXG5cbiAgICB1c2VyU2Nyb2xsaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQgPz8gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgfSwgW2luaXRpYWxDaGF0SWQsIGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCBtZXNzYWdlcywgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlc1JlZi5jdXJyZW50IHx8IGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMgfHwgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbGFzdElkID0gbGFzdE1lc3NhZ2U/LmlkID8/IG51bGxcbiAgICBjb25zdCBwcmV2SWQgPSBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnRcbiAgICBjb25zdCBwcmV2TGVuID0gbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnRcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBsYXN0SWRcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgY29uc3QgaXNOZXdNZXNzYWdlID0gbGFzdElkICE9PSBwcmV2SWQgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSBwcmV2TGVuXG4gICAgaWYgKCFpc05ld01lc3NhZ2UpIHtcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdHRvbVZpc2liaWxpdHkoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGNvbnN0IGlzQXRCb3R0b20gPSBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IC0gY29udGFpbmVyLnNjcm9sbFRvcCA8PSBjb250YWluZXIuY2xpZW50SGVpZ2h0ICsgMTAwXG4gICAgY29uc3QgaGFzSW5pdGlhbE1lc3NhZ2UgPSBtZXNzYWdlcy5zb21lKG1zZyA9PiBtc2cuaWQgPT09ICd1c2VyLWluaXRpYWwtbWVzc2FnZScpXG4gICAgY29uc3QgaXNBcHByb3ZhbCA9ICEhbGFzdE1lc3NhZ2UgJiYgKGxhc3RNZXNzYWdlLmlkLnN0YXJ0c1dpdGgoJ2FwcHJvdmFsLScpIHx8ICEhbGFzdE1lc3NhZ2UuYXBwcm92YWwpXG4gICAgY29uc3QgaXNBbnN3ZXJPclF1ZXN0aW9uID1cbiAgICAgICEhbGFzdE1lc3NhZ2UgJiYgKGxhc3RNZXNzYWdlLmlkLnN0YXJ0c1dpdGgoJ2Fuc3dlci0nKSB8fCBsYXN0TWVzc2FnZS5pZC5zdGFydHNXaXRoKCdxdWVzdGlvbi0nKSlcblxuICAgIC8vIEFwcHJvdmFsOiBzZWN1ZW5jaWEgZGUgc2Nyb2xscyBjb24gZGVsYXkgcG9ycXVlIGVsIEFwcHJvdmFsQm94IG5lY2VzaXRhXG4gICAgLy8gdW4gdGljayBwYXJhIG1lZGlyc2UuIFNjcm9sbGVhIGF1bnF1ZSBlbCB1c3VhcmlvIG5vIGVzdMOpIGFsIGZvbmRvIHNpIG5vXG4gICAgLy8gZXN0w6Egc2Nyb2xsZWFuZG8gbWFudWFsbWVudGUuXG4gICAgaWYgKGlzQXBwcm92YWwgJiYgKGlzQXRCb3R0b20gfHwgIXVzZXJTY3JvbGxpbmdSZWYuY3VycmVudCkpIHtcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKHsgZGVsYXlNczogMTAwIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBOdWV2b3MgYW5zd2VyL3F1ZXN0aW9uOiBzY3JvbGwgc2kgZWwgdXN1YXJpbyB5YSBlc3RhYmEgYWwgZm9uZG8uXG4gICAgaWYgKGlzQW5zd2VyT3JRdWVzdGlvbiAmJiBpc0F0Qm90dG9tKSB7XG4gICAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDYXNvIGJvcmRlOiBjYW1iaW9zIGRlIG1lbnNhamVzIHNpbiBzZXIgbnVldm8gYW5zd2VyL3VzZXIvYXBwcm92YWxcbiAgICAvLyBwZXJvIHPDrSB1biBtZW5zYWplIG51ZXZvIChubyBlbCBcInVzZXItaW5pdGlhbC1tZXNzYWdlXCIpLiBTY3JvbGxlYS5cbiAgICBpZiAoIWlzQW5zd2VyT3JRdWVzdGlvbiAmJiAhaXNBcHByb3ZhbCAmJiAhaGFzSW5pdGlhbE1lc3NhZ2UgJiYgbWVzc2FnZXMubGVuZ3RoID4gcHJldkxlbikge1xuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXBkYXRlU2Nyb2xsQm90dG9tVmlzaWJpbGl0eSgpXG4gIH0sIFttZXNzYWdlcywgbG9hZGluZ01lc3NhZ2VzLCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsIHNjcm9sbFRvQm90dG9tUmFmLCB1cGRhdGVTY3JvbGxCb3R0b21WaXNpYmlsaXR5XSlcblxuICAvLyBBbCBhYnJpci9jYXJnYXIgdW5hIGNvbnZlcnNhY2nDs24gZWwgY29udGVuZWRvciBzZSByZW1vbnRhIChMb2FkZXIg4oaSIGxpc3RhKSBjb25cbiAgLy8gc2Nyb2xsVG9wPTAuIEZvcnphbW9zIGlyIGFsIGZvbmRvIGFsIHRlcm1pbmFyIGxvYWRNZXNzYWdlcywgc2luIGFmZWN0YXIgcGFnaW5hY2nDs24gaGFjaWEgYXJyaWJhLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGp1c3RGaW5pc2hlZExvYWRpbmcgPSB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCAmJiAhbG9hZGluZ01lc3NhZ2VzXG4gICAgd2FzTG9hZGluZ01lc3NhZ2VzUmVmLmN1cnJlbnQgPSBsb2FkaW5nTWVzc2FnZXNcblxuICAgIGlmICghanVzdEZpbmlzaGVkTG9hZGluZyB8fCBtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgdXNlclNjcm9sbGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkID8/IG51bGxcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgIHNjcm9sbFRvQm90dG9tUmFmKHsgZGVsYXlNczogMTAwIH0pXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aCwgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIC8vIE9idGVuZXIgZWwgw7psdGltbyBtZW5zYWplIGRlbCB1c3VhcmlvIHBhcmEgdmVyaWZpY2FyIHNpIHRpZW5lIGF0dGFjaG1lbnRzXG4gIGNvbnN0IGxhc3RVc2VyTWVzc2FnZSA9IG1lc3NhZ2VzXG4gICAgLmZpbHRlcihtc2cgPT4gbXNnLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IG1zZy51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpKVxuICAgIC5hdCgtMSlcblxuICBjb25zdCBhdHRhY2htZW50c0NvdW50ID1cbiAgICAoQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2U/LmF0dGFjaG1lbnRzKSA/IGxhc3RVc2VyTWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGggOiAwKSB8fFxuICAgIChBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZT8uc291cmNlcykgPyBsYXN0VXNlck1lc3NhZ2Uuc291cmNlcy5sZW5ndGggOiAwKVxuXG4gIGNvbnN0IHN0cmVhbUxvYWRpbmdEaXNwbGF5ID0gcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5KHtcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBhY3RpdmVMb2FkaW5nczogYWN0aXZlTG9hZGluZ3MgfHwge30sXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBoYXNBdHRhY2htZW50czogQm9vbGVhbihhdHRhY2htZW50c0NvdW50KSxcbiAgICBhdHRhY2htZW50c0NvdW50LFxuICAgIHQsXG4gIH0pXG5cbiAgY29uc3QgaXNTY3JvbGxPblBhcmVudCA9ICEhZXhwYW5kZWRcbiAgY29uc3QgaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50ID0gaXNNYWlha2VyQWdlbnQoYWdlbnQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWluaXRpYWxDaGF0SWQpIHtcbiAgICAgIHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHJlYWRNYWlhUGFuZWxTZXNzaW9uKGF1dGhVc2VyLmlkKVxuICAgIGlmIChzZXNzaW9uPy5zY3JvbGxTZXNzaW9uSWQgPT09IGluaXRpYWxDaGF0SWQgJiYgdHlwZW9mIHNlc3Npb24uc2Nyb2xsVG9wID09PSAnbnVtYmVyJyAmJiBzZXNzaW9uLnNjcm9sbFRvcCA+IDApIHtcbiAgICAgIHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnQgPSBzZXNzaW9uLnNjcm9sbFRvcFxuICAgIH1cbiAgfSwgW2F1dGhVc2VyLmlkLCBpbml0aWFsQ2hhdElkXSlcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgcGVuZGluZ1Njcm9sbFJlc3RvcmVSZWYuY3VycmVudCA9PSBudWxsIHx8ICFtZXNzYWdlc1JlZi5jdXJyZW50KSByZXR1cm5cbiAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnRcbiAgICBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZi5jdXJyZW50XG4gICAgcGVuZGluZ1Njcm9sbFJlc3RvcmVSZWYuY3VycmVudCA9IG51bGxcbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoXSlcblxuICAvLyBBbCBleHBhbmRpci9jb250cmFlciBlbCBtb2RhbCBlbCByZWYgcGFzYSBhIG90cm8gY29udGVuZWRvciAoc2Nyb2xsVG9wIHNlIHJlc2V0ZWEgYSAwKS5cbiAgLy8gUmVzdGF1cmFyIGxhIHBvc2ljacOzbiBkZSBzY3JvbGwgYW50ZXMgZGVsIHBhaW50IHBhcmEgZXZpdGFyIHF1ZSBsYSBjb252ZXJzYWNpw7NuIHNhbHRlIGFycmliYS5cbiAgY29uc3QgZXhwYW5kZWRSZWYgPSB1c2VSZWYoZXhwYW5kZWQpXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGV4cGFuZGVkUmVmLmN1cnJlbnQgIT09IGV4cGFuZGVkICYmIG1lc3NhZ2VzUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHNhdmVkU2Nyb2xsVG9wID0gbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHNhdmVkU2Nyb2xsVG9wXG4gICAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwYW5kZWRSZWYuY3VycmVudCA9IGV4cGFuZGVkXG4gICAgfVxuICB9LCBbZXhwYW5kZWRdKVxuXG4gIGlmIChsb2FkaW5nTWVzc2FnZXMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZhZGUgZmlsbD5cbiAgICAgICAgPExvYWRlciAvPlxuICAgICAgPC9GYWRlPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VzQ29udGVudCA9IChcbiAgICA8PlxuICAgICAge2lzTG9hZGluZ01vcmVNZXNzYWdlcyAmJiA8TG9hZGluZ1RleHQgdGV4dD17dCgnY2hhdC5sb2FkaW5nTW9yZScpfSAvPn1cbiAgICAgIDw+XG4gICAgICAgIHttZXNzYWdlcy5tYXAoKG1lc3NhZ2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBc3Npc3RhbnRNZXNzYWdlID0gbWVzc2FnZS5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5UIHx8IG1lc3NhZ2UudXNlci5pZCA9PT0gJ2Fzc2lzdGFudCdcbiAgICAgICAgICBjb25zdCBpc0xhc3RNZXNzYWdlID0gaW5kZXggPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDFcbiAgICAgICAgICBjb25zdCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID1cbiAgICAgICAgICAgIGlzQXNzaXN0YW50TWVzc2FnZSAmJiBpc0xhc3RNZXNzYWdlICYmIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQobWVzc2FnZS5pZClcbiAgICAgICAgICBjb25zdCBpc1N0cmVhbWluZyA9IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgJiYgKHdhaXRpbmdSZXNwb25zZSB8fCBpc1dyaXRpbmcpXG5cbiAgICAgICAgICAvLyBObyBmaWx0cmFyIGVsIHBsYWNlaG9sZGVyIGRlbCBtZW5zYWplIGVuIHN0cmVhbWluZzogc3UgdGV4dG8gdml2ZVxuICAgICAgICAgIC8vIGVuIGVsIHN0cmVhbWluZ1N0b3JlIHkgYG1lc3NhZ2UubWVzc2FnZWAgZXMgJycgaGFzdGEgZWwgY29tcGxldGUuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgJiZcbiAgICAgICAgICAgICFpc1N0cmVhbWluZyAmJlxuICAgICAgICAgICAgIShtZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggfHwgbWVzc2FnZS5zb3VyY2VzPy5sZW5ndGgpICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5tZXNzYWdlICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5wcm9qZWN0Py5uYW1lICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5hcHByb3ZhbFxuICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlRmVlZGJhY2sgPVxuICAgICAgICAgICAgbWVzc2FnZT8ud2FzSGVscGZ1bCA9PT0gdW5kZWZpbmVkIHx8IG1lc3NhZ2Uud2FzSGVscGZ1bCA9PT0gbnVsbFxuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLndhc0hlbHBmdWxcbiAgICAgICAgICAgICAgICA/IEZlZWRiYWNrLlRIVU1CU19VUFxuICAgICAgICAgICAgICAgIDogRmVlZGJhY2suVEhVTUJTX0RPV05cblxuICAgICAgICAgIC8vIEtleSBlc3RhYmxlOiBzb2xvIG1lc3NhZ2UuaWQgcGFyYSBldml0YXIgcmVtb3VudCBkdXJhbnRlIHN0cmVhbWluZyAobWVzc2FnZS5kYXRlIHB1ZWRlIGNhbWJpYXIpXG4gICAgICAgICAgY29uc3QgbWVzc2FnZUtleSA9IG1lc3NhZ2UuaWQgPz8gYG1zZy0ke2luZGV4fWBcblxuICAgICAgICAgIGNvbnN0IHR1cm5JZCA9IHJlc29sdmVSZXRyeVR1cm5JZChtZXNzYWdlKVxuICAgICAgICAgIGNvbnN0IHVzZXJNZXNzYWdlRm9yUmV0cnkgPSBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeShtZXNzYWdlcywgbWVzc2FnZSlcbiAgICAgICAgICBjb25zdCBjYW5SZXRyeSA9XG4gICAgICAgICAgICAhIXVzZXJNZXNzYWdlRm9yUmV0cnkgJiZcbiAgICAgICAgICAgICFpc1N0cmVhbWluZyAmJlxuICAgICAgICAgICAgIW1lc3NhZ2UuaXNFcnJvciAmJlxuICAgICAgICAgICAgIW1lc3NhZ2UuYXBwcm92YWwgJiZcbiAgICAgICAgICAgIChtZXNzYWdlLmlzRnJvbnRlbmRDYW5jZWxsZWQgfHwgKCFtZXNzYWdlLmlzX2NhbmNlbGxlZCAmJiAhIXR1cm5JZCkpXG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPE1lc3NhZ2VJdGVtXG4gICAgICAgICAgICAgIHsuLi5tZXNzYWdlfVxuICAgICAgICAgICAgICBrZXk9e21lc3NhZ2VLZXl9XG4gICAgICAgICAgICAgIGF1dGhVc2VyPXthdXRoVXNlcn1cbiAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0T3B0aW9uPXtoYW5kbGVTZWxlY3RPcHRpb259XG4gICAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrPXtoYW5kbGVGZWVkYmFja31cbiAgICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbj17aGFuZGxlQXBwcm92YWxEZWNpc2lvbldpdGhTY3JvbGx9XG4gICAgICAgICAgICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljaz17aGFuZGxlU3VnZ2VzdGlvbkNsaWNrfVxuICAgICAgICAgICAgICBoYW5kbGVSZXRyeT17Y2FuUmV0cnkgPyAoKSA9PiByZXRyeU1lc3NhZ2UobWVzc2FnZSkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIGhhc1NlbGVjdGVkU3VnZ2VzdGlvbj17ISFzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzW21lc3NhZ2UuaWRdfVxuICAgICAgICAgICAgICBkaXNhYmxlRmVlZGJhY2s9e21lc3NhZ2VGZWVkYmFja31cbiAgICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2lzU3RyZWFtaW5nfVxuICAgICAgICAgICAgICBpc0xhc3RNZXNzYWdlPXtpc0xhc3RNZXNzYWdlfVxuICAgICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8Lz5cbiAgICAgIHtzdHJlYW1Mb2FkaW5nRGlzcGxheSAmJiAoXG4gICAgICAgIDxTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICAgICA8QWdlbnRBY3Rpdml0eUluZGljYXRvciBhY3Rpdml0eT17c3RyZWFtTG9hZGluZ0Rpc3BsYXl9IC8+XG4gICAgICAgIDwvU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4+XG4gICAgICApfVxuICAgIDwvPlxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8U0NNZXNzYWdlc091dGVyICRzY3JvbGxPblBhcmVudD17aXNTY3JvbGxPblBhcmVudH0+XG4gICAgICB7aXNTY3JvbGxPblBhcmVudCA/IChcbiAgICAgICAgPFNDTWVzc2FnZXNTY3JvbGwgcmVmPXttZXNzYWdlc1JlZn0gb25TY3JvbGw9e2hhbmRsZVNjcm9sbFRvQm90dG9tfT5cbiAgICAgICAgICA8U0NNZXNzYWdlc0lubmVyICRzY3JvbGxPblBhcmVudD17aXNTY3JvbGxPblBhcmVudH0gJGlzTWFya2V0cGxhY2VHbG9iYWw9e2lzTWFya2V0cGxhY2VHbG9iYWxBZ2VudH0+XG4gICAgICAgICAgICB7bWVzc2FnZXNDb250ZW50fVxuICAgICAgICAgIDwvU0NNZXNzYWdlc0lubmVyPlxuICAgICAgICA8L1NDTWVzc2FnZXNTY3JvbGw+XG4gICAgICApIDogKFxuICAgICAgICA8U0NNZXNzYWdlc0lubmVyXG4gICAgICAgICAgcmVmPXttZXNzYWdlc1JlZn1cbiAgICAgICAgICBvblNjcm9sbD17aGFuZGxlU2Nyb2xsVG9Cb3R0b219XG4gICAgICAgICAgJHNjcm9sbE9uUGFyZW50PXtmYWxzZX1cbiAgICAgICAgICAkaXNNYXJrZXRwbGFjZUdsb2JhbD17aXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50fVxuICAgICAgICA+XG4gICAgICAgICAge21lc3NhZ2VzQ29udGVudH1cbiAgICAgICAgPC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICApfVxuXG4gICAgICB7c2hvd1Njcm9sbFRvQm90dG9tICYmIChcbiAgICAgICAgPFNjcm9sbFRvQm90dG9tQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVDbGlja1Njcm9sbFRvQm90dG9tfT5cbiAgICAgICAgICA8QXJyb3dTbWFsbERvd24gY29sb3I9XCIjNjY2XCIgd2lkdGg9XCIyMHB4XCIgaGVpZ2h0PVwiMjBweFwiIC8+XG4gICAgICAgIDwvU2Nyb2xsVG9Cb3R0b21CdXR0b24+XG4gICAgICApfVxuICAgIDwvU0NNZXNzYWdlc091dGVyPlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlNZXNzYWdlcyA9IFJlYWN0Lm1lbW8oQ2hhdEFJTWVzc2FnZXNJbm5lcilcbiJdLCJtYXBwaW5n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
|