genassist-chat-react 1.0.37 → 1.0.38

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.
@@ -45,20 +45,15 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
45
45
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
46
  }
47
47
  };
48
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
49
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
50
- if (ar || !(i in from)) {
51
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
52
- ar[i] = from[i];
53
- }
54
- }
55
- return to.concat(ar || Array.prototype.slice.call(from));
56
- };
57
48
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
58
- import { useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react';
49
+ import React, { useState, useRef, useEffect, useLayoutEffect, useMemo, useCallback } from 'react';
59
50
  import { ChatMessageComponent } from './ChatMessage';
60
51
  import { AttachmentPreview } from './common/AttachmentPreview';
61
52
  import { useChat } from '../hooks/useChat';
53
+ import { useScrollManagement } from '../hooks/useScrollManagement';
54
+ import { useThinkingAnimation } from '../hooks/useThinkingAnimation';
55
+ import { useViewportManager } from '../hooks/useViewportManager';
56
+ import { useFileAttachments } from '../hooks/useFileAttachments';
62
57
  import { VoiceInput } from './VoiceInput';
63
58
  import { AudioService } from '../services/audioService';
64
59
  import { Paperclip, MoreVertical, RefreshCw, Globe, X, ArrowUp, Maximize2, Minimize2, AlertCircle } from 'lucide-react';
@@ -66,10 +61,9 @@ import { ChatBubble } from './ChatBubble';
66
61
  import DynamicFormMessage from './DynamicFormMessage';
67
62
  import { LanguageSelector } from './LanguageSelector';
68
63
  import chatLogo from '../assets/chat-logo.png';
69
- // Type for attachment with file reference
70
- import { resolveLanguage, mergeTranslations, getTranslationString, getTranslationArray, getTranslationsForLanguage, } from '../utils/i18n';
64
+ import { resolveLanguage, mergeTranslations, getTranslationString, getTranslationsForLanguage, } from '../utils/i18n';
71
65
  import { GoogleReCaptcha, GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';
72
- // can be used to hide the language selector on the chat box
66
+ import { resolveTheme, hexToRgba, getContainerStyle, getHeaderStyle, logoContainerStyle, logoStyle, headerTitleContainerStyle, getHeaderTitleStyle, getHeaderSubtitleStyle, menuButtonStyle, getMenuPopupStyle, getMenuItemStyle, chatContainerStyle, inputContainerStyle, inputWrapperStyle, getTextAreaStyle, attachButtonStyle, getSendButtonStyle, sendButtonDisabledStyle, rightActionContainerStyle, getPossibleQueriesContainerStyle, getQueryButtonStyle, getConfirmOverlayStyle, getConfirmDialogStyle, confirmButtonsStyle, getConfirmButtonStyle, getContentCardStyle, getDisclaimerStyle, getPositionStyles, getFloatingContainerStyle, CSS_KEYFRAMES, } from '../styles/genAgentChatStyles';
73
67
  var SHOW_CHAT_LANGUAGE_SELECTOR = true;
74
68
  export var GenAgentChat = function (_a) {
75
69
  var baseUrl = _a.baseUrl, websocketUrl = _a.websocketUrl, apiKey = _a.apiKey, tenant = _a.tenant, metadata = _a.metadata, _b = _a.useWs, useWs = _b === void 0 ? true : _b, _c = _a.usePoll, usePoll = _c === void 0 ? false : _c, onError = _a.onError, onTakeover = _a.onTakeover, onFinalize = _a.onFinalize, theme = _a.theme, _d = _a.headerTitle, headerTitle = _d === void 0 ? 'Genassist' : _d, description = _a.description, placeholder = _a.placeholder, agentName = _a.agentName, logoUrl = _a.logoUrl, _e = _a.mode, mode = _e === void 0 ? 'embedded' : _e, onExitFullscreen = _a.onExitFullscreen, _f = _a.floatingConfig, floatingConfig = _f === void 0 ? {} : _f, language = _a.language, customTranslations = _a.translations, reCaptchaKey = _a.reCaptchaKey, _g = _a.widget, widget = _g === void 0 ? false : _g, _h = _a.useAudio, useAudio = _h === void 0 ? false : _h, _j = _a.useFile, useFile = _j === void 0 ? false : _j, _k = _a.noColorAnimation, noColorAnimation = _k === void 0 ? false : _k, _l = _a.showWelcomeBeforeStart, showWelcomeBeforeStart = _l === void 0 ? true : _l, _m = _a.allowedExtensions, allowedExtensions = _m === void 0 ? [] : _m, serverUnavailableMessage = _a.serverUnavailableMessage, serverUnavailableContactUrl = _a.serverUnavailableContactUrl, serverUnavailableContactLabel = _a.serverUnavailableContactLabel, _o = _a.formDisplay, formDisplay = _o === void 0 ? 'footer' : _o, onConfigLoaded = _a.onConfigLoaded;
@@ -102,17 +96,12 @@ export var GenAgentChat = function (_a) {
102
96
  }, [metadata, resolvedLanguage, selectedFaqQuery]);
103
97
  // Get translations based on resolved language, then merge with custom translations
104
98
  var translations = useMemo(function () {
105
- // First get base translations for the language
106
99
  var baseTranslations = getTranslationsForLanguage(resolvedLanguage);
107
- // Then merge with any custom translations provided
108
100
  return mergeTranslations(customTranslations, baseTranslations);
109
101
  }, [resolvedLanguage, customTranslations]);
110
- // Translation helper function
111
102
  var t = function (key, fallback) {
112
103
  return getTranslationString(key, translations, fallback);
113
104
  };
114
- // Get translated placeholder or use provided/default
115
- // Make it reactive to language changes
116
105
  var inputPlaceholder = useMemo(function () { return placeholder || t('input.placeholder', 'Ask a question'); }, [placeholder, translations]);
117
106
  var _r = useState(''), inputValue = _r[0], setInputValue = _r[1];
118
107
  var _s = useState(false), showResetConfirm = _s[0], setShowResetConfirm = _s[1];
@@ -120,33 +109,14 @@ export var GenAgentChat = function (_a) {
120
109
  var _u = useState(false), showLanguageDropdown = _u[0], setShowLanguageDropdown = _u[1];
121
110
  var _v = useState(false), isPlayingAudio = _v[0], setIsPlayingAudio = _v[1];
122
111
  var _w = useState(false), isFloatingOpen = _w[0], setIsFloatingOpen = _w[1];
123
- var _x = useState([]), attachments = _x[0], setAttachments = _x[1];
124
- var _y = useState(new Set()), submittedForms = _y[0], setSubmittedForms = _y[1];
125
- var _z = useState(null), submittingFormIndex = _z[0], setSubmittingFormIndex = _z[1];
126
- var _0 = useState(new Set()), uploadingFiles = _0[0], setUploadingFiles = _0[1];
127
- var _1 = useState(null), fileErrorToast = _1[0], setFileErrorToast = _1[1];
128
- var fileErrorToastTimeoutRef = useRef(null);
112
+ var _x = useState(new Set()), submittedForms = _x[0], setSubmittedForms = _x[1];
113
+ var _y = useState(null), submittingFormIndex = _y[0], setSubmittingFormIndex = _y[1];
129
114
  var menuRef = useRef(null);
130
- var fileInputRef = useRef(null);
131
115
  var textAreaRef = useRef(null);
132
116
  var headerRef = useRef(null);
133
- var _2 = useState(56), headerHeight = _2[0], setHeaderHeight = _2[1];
134
- var _3 = useState(false), showBacklight = _3[0], setShowBacklight = _3[1];
135
- var _4 = useState(false), isFullscreenToggled = _4[0], setIsFullscreenToggled = _4[1];
136
- // default thinking messages if none provided by workflow
137
- var DEFAULT_THINKING_MESSAGES = useMemo(function () { return getTranslationArray('thinking.messages', translations, [
138
- "Thinking…",
139
- "Analyzing your question…",
140
- "Searching knowledge…",
141
- "Pulling relevant info…",
142
- "Drafting the answer…",
143
- "Double‑checking details…",
144
- "Tying it together…",
145
- "Almost there…",
146
- ]); }, [translations]);
147
- var _5 = useState([]), currentThinkingParts = _5[0], setCurrentThinkingParts = _5[1];
148
- var _6 = useState(0), currentThinkingPartIndex = _6[0], setCurrentThinkingPartIndex = _6[1];
149
- var _7 = useChat({
117
+ var _z = useState(56), headerHeight = _z[0], setHeaderHeight = _z[1];
118
+ var _0 = useState(false), showBacklight = _0[0], setShowBacklight = _0[1];
119
+ var _1 = useChat({
150
120
  baseUrl: baseUrl,
151
121
  websocketUrl: websocketUrl,
152
122
  apiKey: apiKey,
@@ -162,7 +132,35 @@ export var GenAgentChat = function (_a) {
162
132
  serverUnavailableContactUrl: serverUnavailableContactUrl,
163
133
  serverUnavailableContactLabel: serverUnavailableContactLabel,
164
134
  onConfigLoaded: onConfigLoaded,
165
- }), messages = _7.messages, isLoading = _7.isLoading, sendMessage = _7.sendMessage, uploadFile = _7.uploadFile, resetConversation = _7.resetConversation, startConversation = _7.startConversation, connectionState = _7.connectionState, conversationId = _7.conversationId, guestToken = _7.guestToken, possibleQueries = _7.possibleQueries, isFinalized = _7.isFinalized, isAgentTyping = _7.isAgentTyping, addFeedback = _7.addFeedback, agentAvailableLanguages = _7.availableLanguages, welcomeTitle = _7.welcomeTitle, welcomeImageUrl = _7.welcomeImageUrl, welcomeMessage = _7.welcomeMessage, inputDisclaimerHtml = _7.inputDisclaimerHtml, thinkingPhrases = _7.thinkingPhrases, thinkingDelayMs = _7.thinkingDelayMs;
135
+ }), messages = _1.messages, isLoading = _1.isLoading, sendMessage = _1.sendMessage, sendAudioMessage = _1.sendAudioMessage, uploadFile = _1.uploadFile, resetConversation = _1.resetConversation, startConversation = _1.startConversation, conversationId = _1.conversationId, guestToken = _1.guestToken, possibleQueries = _1.possibleQueries, isFinalized = _1.isFinalized, isAgentTyping = _1.isAgentTyping, addFeedback = _1.addFeedback, agentAvailableLanguages = _1.availableLanguages, welcomeTitle = _1.welcomeTitle, welcomeImageUrl = _1.welcomeImageUrl, welcomeMessage = _1.welcomeMessage, inputDisclaimerHtml = _1.inputDisclaimerHtml, thinkingPhrases = _1.thinkingPhrases, thinkingDelayMs = _1.thinkingDelayMs;
136
+ var _2 = useThinkingAnimation({
137
+ isAgentTyping: isAgentTyping,
138
+ thinkingPhrases: thinkingPhrases,
139
+ thinkingDelayMs: thinkingDelayMs,
140
+ translations: translations,
141
+ }), currentThinkingParts = _2.currentThinkingParts, currentThinkingPartIndex = _2.currentThinkingPartIndex;
142
+ var _3 = useScrollManagement({
143
+ messages: messages,
144
+ isAgentTyping: isAgentTyping,
145
+ currentThinkingPartIndex: currentThinkingPartIndex,
146
+ currentThinkingPartsLength: currentThinkingParts.length,
147
+ conversationId: conversationId,
148
+ isFloatingOpen: isFloatingOpen,
149
+ mode: mode,
150
+ }), messagesEndRef = _3.messagesEndRef, chatContainerRef = _3.chatContainerRef;
151
+ var _4 = useViewportManager({
152
+ mode: mode,
153
+ widget: widget,
154
+ isFloatingOpen: isFloatingOpen,
155
+ showResetConfirm: showResetConfirm,
156
+ showLanguageDropdown: showLanguageDropdown,
157
+ showMenu: showMenu,
158
+ onExitFullscreen: onExitFullscreen,
159
+ setShowResetConfirm: setShowResetConfirm,
160
+ setShowLanguageDropdown: setShowLanguageDropdown,
161
+ setShowMenu: setShowMenu,
162
+ }), windowWidth = _4.windowWidth, windowHeight = _4.windowHeight, isFullscreen = _4.isFullscreen, handleFullscreenToggle = _4.handleFullscreenToggle;
163
+ var _5 = useFileAttachments({ uploadFile: uploadFile, t: t }), attachments = _5.attachments, setAttachments = _5.setAttachments, uploadingFiles = _5.uploadingFiles, fileErrorToast = _5.fileErrorToast, fileInputRef = _5.fileInputRef, handleFileChange = _5.handleFileChange, handleRemoveAttachment = _5.handleRemoveAttachment, clearAttachments = _5.clearAttachments;
166
164
  useEffect(function () {
167
165
  if (language)
168
166
  return;
@@ -174,44 +172,8 @@ export var GenAgentChat = function (_a) {
174
172
  setSelectedLanguage(normalized[0]);
175
173
  }
176
174
  }, [agentAvailableLanguages, language, selectedLanguage]);
177
- var messagesEndRef = useRef(null);
178
175
  var audioService = useRef(null);
179
- var hasAnchoredHistory = useRef(false);
180
- var chatContainerRef = useRef(null);
181
176
  var reCaptchaTokenRef = useRef(undefined);
182
- var isUserAtBottomRef = useRef(true);
183
- var anchorHistory = function () {
184
- var el = chatContainerRef.current;
185
- if (!el || !messages.length || hasAnchoredHistory.current)
186
- return;
187
- if (el.clientHeight === 0)
188
- return; // hidden, wait for visibility/size
189
- el.scrollTop = el.scrollHeight;
190
- hasAnchoredHistory.current = true;
191
- isUserAtBottomRef.current = true;
192
- };
193
- var scrollToBottom = function (behavior, force) {
194
- if (behavior === void 0) { behavior = 'smooth'; }
195
- if (force === void 0) { force = false; }
196
- var container = chatContainerRef.current;
197
- var el = messagesEndRef.current;
198
- if (!container || !el)
199
- return;
200
- // Only scroll if user is at bottom or if forced (e.g., for agent typing)
201
- if (!force && !isUserAtBottomRef.current) {
202
- return;
203
- }
204
- var doScroll = function () {
205
- container.scrollTo({ top: container.scrollHeight, behavior: behavior });
206
- isUserAtBottomRef.current = true;
207
- };
208
- if (behavior === 'auto') {
209
- doScroll();
210
- }
211
- else {
212
- requestAnimationFrame(doScroll);
213
- }
214
- };
215
177
  var hasUserMessages = messages.some(function (message) { return message.speaker === 'customer'; });
216
178
  useEffect(function () {
217
179
  audioService.current = new AudioService({ baseUrl: baseUrl, websocketUrl: websocketUrl, apiKey: apiKey });
@@ -220,108 +182,11 @@ export var GenAgentChat = function (_a) {
220
182
  var _a;
221
183
  (_a = audioService.current) === null || _a === void 0 ? void 0 : _a.setGuestToken(guestToken !== null && guestToken !== void 0 ? guestToken : null);
222
184
  }, [guestToken]);
223
- useLayoutEffect(function () {
224
- if (!messages.length)
225
- return;
226
- if (hasAnchoredHistory.current) {
227
- scrollToBottom('smooth', false);
228
- }
229
- else {
230
- anchorHistory();
231
- }
232
- }, [messages]);
233
- useLayoutEffect(function () {
234
- if (!isAgentTyping)
235
- return;
236
- // Force scroll when agent is typing
237
- scrollToBottom('auto', true);
238
- }, [isAgentTyping, currentThinkingPartIndex, currentThinkingParts.length]);
239
- useEffect(function () {
240
- hasAnchoredHistory.current = false;
241
- }, [conversationId]);
242
- useEffect(function () {
243
- return function () {
244
- if (fileErrorToastTimeoutRef.current) {
245
- clearTimeout(fileErrorToastTimeoutRef.current);
246
- }
247
- };
248
- }, []);
249
- // Ensure chat is always open when mode is fullscreen
250
185
  useEffect(function () {
251
186
  if (mode === 'fullscreen' && !isFloatingOpen) {
252
187
  setIsFloatingOpen(true);
253
188
  }
254
189
  }, [mode, isFloatingOpen]);
255
- // Scroll to bottom when chat is reopened in floating mode
256
- var prevIsFloatingOpenRef = useRef(isFloatingOpen);
257
- useEffect(function () {
258
- // Only trigger when chat transitions from closed to open
259
- if ((mode === 'floating' || mode === 'fullscreen') && isFloatingOpen && !prevIsFloatingOpenRef.current && messages.length > 0) {
260
- // Reset the anchor flag so it can scroll to bottom
261
- hasAnchoredHistory.current = false;
262
- isUserAtBottomRef.current = true;
263
- // Wait for container to be visible and then scroll
264
- var scrollWhenVisible_1 = function () {
265
- var container = chatContainerRef.current;
266
- if (!container) {
267
- requestAnimationFrame(scrollWhenVisible_1);
268
- return;
269
- }
270
- // Check if container is visible
271
- if (container.clientHeight === 0) {
272
- requestAnimationFrame(scrollWhenVisible_1);
273
- return;
274
- }
275
- // Scroll to bottom
276
- container.scrollTop = container.scrollHeight;
277
- hasAnchoredHistory.current = true;
278
- isUserAtBottomRef.current = true;
279
- };
280
- // Use requestAnimationFrame to wait for render
281
- requestAnimationFrame(function () {
282
- requestAnimationFrame(scrollWhenVisible_1);
283
- });
284
- }
285
- prevIsFloatingOpenRef.current = isFloatingOpen;
286
- }, [isFloatingOpen, mode]);
287
- useEffect(function () {
288
- if (!messages.length)
289
- return;
290
- var el = chatContainerRef.current;
291
- if (!el)
292
- return;
293
- // Observe size/visibility changes to anchor chat view.
294
- var resizeObserver = new ResizeObserver(function () {
295
- if (isUserAtBottomRef.current) {
296
- anchorHistory();
297
- }
298
- });
299
- resizeObserver.observe(el);
300
- anchorHistory();
301
- return function () {
302
- resizeObserver.disconnect();
303
- };
304
- }, [messages]);
305
- useEffect(function () {
306
- var container = chatContainerRef.current;
307
- if (!container)
308
- return;
309
- var isAtBottom = function (threshold) {
310
- if (threshold === void 0) { threshold = 100; }
311
- if (!container)
312
- return true;
313
- var scrollTop = container.scrollTop, scrollHeight = container.scrollHeight, clientHeight = container.clientHeight;
314
- return scrollHeight - scrollTop - clientHeight <= threshold;
315
- };
316
- var handleScroll = function () {
317
- isUserAtBottomRef.current = isAtBottom();
318
- };
319
- container.addEventListener('scroll', handleScroll, { passive: true });
320
- handleScroll();
321
- return function () {
322
- container.removeEventListener('scroll', handleScroll);
323
- };
324
- }, []);
325
190
  useLayoutEffect(function () {
326
191
  var updateHeaderHeight = function () {
327
192
  var _a;
@@ -338,53 +203,14 @@ export var GenAgentChat = function (_a) {
338
203
  window.removeEventListener('resize', updateHeaderHeight);
339
204
  };
340
205
  }, []);
341
- // Smoothly show/hide the backlight while the agent is typing
342
206
  useEffect(function () {
343
207
  if (isAgentTyping) {
344
208
  setShowBacklight(true);
345
209
  return;
346
210
  }
347
- var t = setTimeout(function () { return setShowBacklight(false); }, 420); // allow fade-out
348
- return function () { return clearTimeout(t); };
211
+ var timer = setTimeout(function () { return setShowBacklight(false); }, 420);
212
+ return function () { return clearTimeout(timer); };
349
213
  }, [isAgentTyping]);
350
- // Show "thinking" phrases while agent is typing
351
- useEffect(function () {
352
- if (!isAgentTyping) {
353
- setCurrentThinkingParts([]);
354
- setCurrentThinkingPartIndex(0);
355
- return;
356
- }
357
- // Randomly select a phrase from the list
358
- var list = (thinkingPhrases && thinkingPhrases.length > 0) ? thinkingPhrases : DEFAULT_THINKING_MESSAGES;
359
- var randomIndex = Math.floor(Math.random() * list.length);
360
- var selectedPhrase = list[randomIndex];
361
- // Split by | to get parts, or use the phrase as a single part if no | found
362
- var parts = selectedPhrase.includes('|')
363
- ? selectedPhrase.split('|').map(function (part) { return part.trim(); }).filter(function (part) { return part.length > 0; })
364
- : [selectedPhrase.trim()];
365
- // Initialize with first part
366
- setCurrentThinkingParts(parts);
367
- setCurrentThinkingPartIndex(0);
368
- // If there's only one part, no need to progress
369
- if (parts.length <= 1)
370
- return;
371
- // Progress through parts with delay, but stop at the last one
372
- var rotDelay = Math.max(250, thinkingDelayMs || 1000);
373
- var timeoutIds = [];
374
- var _loop_1 = function (i) {
375
- var timeoutId = setTimeout(function () {
376
- setCurrentThinkingPartIndex(i);
377
- }, rotDelay * i);
378
- timeoutIds.push(timeoutId);
379
- };
380
- // Set up timeouts for each part transition
381
- for (var i = 1; i < parts.length; i++) {
382
- _loop_1(i);
383
- }
384
- return function () {
385
- timeoutIds.forEach(function (id) { return clearTimeout(id); });
386
- };
387
- }, [isAgentTyping, thinkingPhrases, thinkingDelayMs]);
388
214
  var submitMessage = function () { return __awaiter(void 0, void 0, void 0, function () {
389
215
  var textToSend, filesToUpload, extraMetadata, error_1;
390
216
  return __generator(this, function (_a) {
@@ -393,13 +219,11 @@ export var GenAgentChat = function (_a) {
393
219
  if (inputValue.trim() === '' && attachments.length === 0)
394
220
  return [2 /*return*/];
395
221
  if (isAgentTyping)
396
- return [2 /*return*/]; // Prevent sending while agent is thinking/typing
222
+ return [2 /*return*/];
397
223
  textToSend = inputValue;
398
224
  filesToUpload = attachments.map(function (a) { return a.file; });
399
- // const fileAttachments = attachments.map(a => a.attachment);
400
225
  setInputValue('');
401
226
  setAttachments([]);
402
- // Reset the file input value so the same file can be selected again
403
227
  if (fileInputRef.current) {
404
228
  fileInputRef.current.value = '';
405
229
  }
@@ -413,17 +237,14 @@ export var GenAgentChat = function (_a) {
413
237
  if (filesToUpload.length > 0) {
414
238
  extraMetadata.attachments = attachments.map(function (a) { return a.attachment; });
415
239
  }
416
- // send message with attachments
417
240
  return [4 /*yield*/, sendMessage(textToSend, filesToUpload, extraMetadata, reCaptchaTokenRef.current)];
418
241
  case 2:
419
- // send message with attachments
420
242
  _a.sent();
421
243
  return [3 /*break*/, 5];
422
244
  case 3:
423
245
  error_1 = _a.sent();
424
246
  return [3 /*break*/, 5];
425
247
  case 4:
426
- // Refocus the input field
427
248
  setTimeout(function () { var _a; return (_a = textAreaRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
428
249
  return [7 /*endfinally*/];
429
250
  case 5: return [2 /*return*/];
@@ -520,7 +341,7 @@ export var GenAgentChat = function (_a) {
520
341
  if (!text.trim())
521
342
  return [2 /*return*/];
522
343
  if (isAgentTyping)
523
- return [2 /*return*/]; // Prevent sending while agent is thinking/typing
344
+ return [2 /*return*/];
524
345
  _a.label = 1;
525
346
  case 1:
526
347
  _a.trys.push([1, 3, , 4]);
@@ -556,108 +377,13 @@ export var GenAgentChat = function (_a) {
556
377
  }
557
378
  });
558
379
  }); };
559
- var handleFileChange = function (e) { return __awaiter(void 0, void 0, void 0, function () {
560
- var newFiles_1, newAttachments_1, newUploadingFiles_1, settled, fileToAttachmentMap_1, failedFileKeys_1, hasFailedUploads, error_6, finalUploadingFiles_1;
561
- return __generator(this, function (_a) {
562
- switch (_a.label) {
563
- case 0:
564
- if (!(e.target.files && e.target.files.length > 0)) return [3 /*break*/, 5];
565
- newFiles_1 = Array.from(e.target.files);
566
- newAttachments_1 = newFiles_1.map(function (file) { return ({ file: file, attachment: null }); });
567
- setAttachments(function (prev) { return __spreadArray(__spreadArray([], prev, true), newAttachments_1, true); });
568
- newUploadingFiles_1 = new Set(uploadingFiles);
569
- newFiles_1.forEach(function (file) { return newUploadingFiles_1.add(file.name); });
570
- setUploadingFiles(newUploadingFiles_1);
571
- _a.label = 1;
572
- case 1:
573
- _a.trys.push([1, 3, 4, 5]);
574
- return [4 /*yield*/, Promise.allSettled(newFiles_1.map(function (file) { return __awaiter(void 0, void 0, void 0, function () {
575
- var _a;
576
- return __generator(this, function (_b) {
577
- switch (_b.label) {
578
- case 0:
579
- _a = { file: file };
580
- return [4 /*yield*/, uploadFile(file)];
581
- case 1: return [2 /*return*/, (_a.attachment = _b.sent(), _a)];
582
- }
583
- });
584
- }); }))];
585
- case 2:
586
- settled = _a.sent();
587
- fileToAttachmentMap_1 = new Map();
588
- failedFileKeys_1 = new Set();
589
- settled.forEach(function (result, index) {
590
- var file = newFiles_1[index];
591
- if (!file)
592
- return;
593
- var fileKey = "".concat(file.name, ":").concat(file.size, ":").concat(file.lastModified);
594
- if (result.status === 'rejected') {
595
- fileToAttachmentMap_1.set(fileKey, null);
596
- failedFileKeys_1.add(fileKey);
597
- return;
598
- }
599
- var attachment = result.value.attachment;
600
- fileToAttachmentMap_1.set(fileKey, attachment);
601
- if (attachment === null) {
602
- failedFileKeys_1.add(fileKey);
603
- }
604
- });
605
- hasFailedUploads = failedFileKeys_1.size > 0;
606
- // Update attachments: remove failed files, set attachment for successful ones
607
- setAttachments(function (prev) {
608
- return prev
609
- .filter(function (att) {
610
- var fileKey = "".concat(att.file.name, ":").concat(att.file.size, ":").concat(att.file.lastModified);
611
- return !failedFileKeys_1.has(fileKey);
612
- })
613
- .map(function (att) {
614
- var fileKey = "".concat(att.file.name, ":").concat(att.file.size, ":").concat(att.file.lastModified);
615
- var uploadedAttachment = fileToAttachmentMap_1.get(fileKey);
616
- if (uploadedAttachment !== undefined) {
617
- return __assign(__assign({}, att), { attachment: uploadedAttachment });
618
- }
619
- return att;
620
- });
621
- });
622
- if (hasFailedUploads) {
623
- if (fileErrorToastTimeoutRef.current) {
624
- clearTimeout(fileErrorToastTimeoutRef.current);
625
- }
626
- setFileErrorToast(t('fileUpload.fileTypeNotSupported', 'This file type is not supported.'));
627
- fileErrorToastTimeoutRef.current = setTimeout(function () {
628
- setFileErrorToast(null);
629
- fileErrorToastTimeoutRef.current = null;
630
- }, 4000);
631
- }
632
- return [3 /*break*/, 5];
633
- case 3:
634
- error_6 = _a.sent();
635
- // ignore
636
- console.error('Error uploading file', error_6);
637
- return [3 /*break*/, 5];
638
- case 4:
639
- finalUploadingFiles_1 = new Set(uploadingFiles);
640
- newFiles_1.forEach(function (file) { return finalUploadingFiles_1.delete(file.name); });
641
- setUploadingFiles(finalUploadingFiles_1);
642
- // Reset the file input value so the same file can be selected again
643
- if (fileInputRef.current) {
644
- fileInputRef.current.value = '';
645
- }
646
- return [7 /*endfinally*/];
647
- case 5: return [2 /*return*/];
648
- }
649
- });
650
- }); };
651
- var handleRemoveAttachment = function (fileName) {
652
- setAttachments(function (prev) { return prev.filter(function (att) { return att.file.name !== fileName; }); });
653
- };
654
380
  var handleVoiceError = function (error) {
655
381
  if (onError) {
656
382
  onError(error);
657
383
  }
658
384
  };
659
385
  var playResponseAudio = function (text) { return __awaiter(void 0, void 0, void 0, function () {
660
- var audioBlob, error_7;
386
+ var audioBlob, error_6;
661
387
  return __generator(this, function (_a) {
662
388
  switch (_a.label) {
663
389
  case 0:
@@ -675,9 +401,9 @@ export var GenAgentChat = function (_a) {
675
401
  _a.sent();
676
402
  return [3 /*break*/, 6];
677
403
  case 4:
678
- error_7 = _a.sent();
404
+ error_6 = _a.sent();
679
405
  if (onError) {
680
- onError(error_7);
406
+ onError(error_6);
681
407
  }
682
408
  return [3 /*break*/, 6];
683
409
  case 5:
@@ -687,14 +413,43 @@ export var GenAgentChat = function (_a) {
687
413
  }
688
414
  });
689
415
  }); };
416
+ var audioUrlBuilder = useCallback(function (messageId) {
417
+ return "".concat(baseUrl, "/api/conversations/").concat(conversationId, "/messages/").concat(messageId, "/audio");
418
+ }, [baseUrl, conversationId]);
419
+ var audioHeaders = useMemo(function () {
420
+ var h = { 'x-api-key': apiKey };
421
+ if (tenant)
422
+ h['x-tenant-id'] = tenant;
423
+ if (guestToken)
424
+ h['Authorization'] = "Bearer ".concat(guestToken);
425
+ return h;
426
+ }, [apiKey, tenant, guestToken]);
427
+ var _6 = useState(null), autoPlayAudioMessageId = _6[0], setAutoPlayAudioMessageId = _6[1];
428
+ var prevMessageCountRef = useRef(0);
429
+ var initialLoadDoneRef = useRef(false);
430
+ React.useEffect(function () {
431
+ if (!useAudio || !messages.length)
432
+ return;
433
+ var prevCount = prevMessageCountRef.current;
434
+ prevMessageCountRef.current = messages.length;
435
+ if (!initialLoadDoneRef.current) {
436
+ initialLoadDoneRef.current = true;
437
+ return;
438
+ }
439
+ if (messages.length <= prevCount)
440
+ return;
441
+ var last = messages[messages.length - 1];
442
+ if (last.speaker === 'agent' && last.type === 'audio' && last.message_id) {
443
+ setAutoPlayAudioMessageId(last.message_id);
444
+ }
445
+ }, [messages, useAudio]);
690
446
  var handleQueryClick = function (query) { return __awaiter(void 0, void 0, void 0, function () {
691
- var error_8;
447
+ var error_7;
692
448
  return __generator(this, function (_a) {
693
449
  switch (_a.label) {
694
450
  case 0:
695
451
  if (isAgentTyping || isLoading)
696
- return [2 /*return*/]; // Prevent sending while agent is thinking/typing
697
- // Store the FAQ query for all subsequent messages
452
+ return [2 /*return*/];
698
453
  setSelectedFaqQuery(query);
699
454
  _a.label = 1;
700
455
  case 1:
@@ -704,25 +459,21 @@ export var GenAgentChat = function (_a) {
704
459
  _a.sent();
705
460
  return [3 /*break*/, 4];
706
461
  case 3:
707
- error_8 = _a.sent();
462
+ error_7 = _a.sent();
708
463
  return [3 /*break*/, 4];
709
464
  case 4: return [2 /*return*/];
710
465
  }
711
466
  });
712
467
  }); };
713
468
  var handleStartConversation = function () { return __awaiter(void 0, void 0, void 0, function () {
714
- var error_9;
469
+ var error_8;
715
470
  return __generator(this, function (_a) {
716
471
  switch (_a.label) {
717
472
  case 0:
718
473
  if (isLoading)
719
474
  return [2 /*return*/];
720
- // Clear input text and file attachments when starting a conversation
721
475
  setInputValue('');
722
- setAttachments([]);
723
- if (fileInputRef.current) {
724
- fileInputRef.current.value = '';
725
- }
476
+ clearAttachments();
726
477
  _a.label = 1;
727
478
  case 1:
728
479
  _a.trys.push([1, 3, , 4]);
@@ -731,8 +482,8 @@ export var GenAgentChat = function (_a) {
731
482
  _a.sent();
732
483
  return [3 /*break*/, 4];
733
484
  case 3:
734
- error_9 = _a.sent();
735
- console.error('Error starting conversation', error_9);
485
+ error_8 = _a.sent();
486
+ console.error('Error starting conversation', error_8);
736
487
  return [3 /*break*/, 4];
737
488
  case 4: return [2 /*return*/];
738
489
  }
@@ -749,17 +500,13 @@ export var GenAgentChat = function (_a) {
749
500
  return __generator(this, function (_a) {
750
501
  switch (_a.label) {
751
502
  case 0:
752
- // Clear input text and file attachments when restarting
753
503
  setInputValue('');
754
- setAttachments([]);
755
- if (fileInputRef.current) {
756
- fileInputRef.current.value = '';
757
- }
504
+ clearAttachments();
758
505
  return [4 /*yield*/, resetConversation(reCaptchaTokenRef.current)];
759
506
  case 1:
760
507
  _a.sent();
761
- setSelectedFaqQuery(null); // Clear FAQ query on reset
762
- setSubmittedForms(new Set()); // Clear form submission state so new forms are interactive
508
+ setSelectedFaqQuery(null);
509
+ setSubmittedForms(new Set());
763
510
  setSubmittingFormIndex(null);
764
511
  setShowResetConfirm(false);
765
512
  return [2 /*return*/];
@@ -772,105 +519,9 @@ export var GenAgentChat = function (_a) {
772
519
  var handleLanguageChange = function (lang) {
773
520
  setSelectedLanguage(lang);
774
521
  };
775
- var handleFullscreenToggle = function () {
776
- setIsFullscreenToggled(function (prev) { return !prev; });
777
- setShowMenu(false);
778
- };
779
- // Track window / visual viewport size for layout and mobile detection
780
- var _8 = useState(typeof window !== 'undefined' ? window.innerWidth : 1024), windowWidth = _8[0], setWindowWidth = _8[1];
781
- var _9 = useState(typeof window !== 'undefined' ? window.innerHeight : 700), windowHeight = _9[0], setWindowHeight = _9[1];
782
- // Automatically determine if should be fullscreen (mobile devices or widget mode or manual toggle or fullscreen mode)
783
- var isFullscreen = useMemo(function () {
784
- // If mode is fullscreen, always fullscreen
785
- if (mode === 'fullscreen')
786
- return true;
787
- // If widget prop is true, always fullscreen
788
- if (widget)
789
- return true;
790
- // If manually toggled, use toggle state
791
- if (isFullscreenToggled)
792
- return true;
793
- // Otherwise, use mobile detection
794
- return windowWidth <= 768;
795
- }, [windowWidth, widget, isFullscreenToggled, mode]);
796
- // Escape: close overlays first, then exit UI fullscreen when applicable
797
- useEffect(function () {
798
- if (typeof window === 'undefined')
799
- return;
800
- if (mode === 'floating' && !isFloatingOpen)
801
- return;
802
- var onKeyDown = function (e) {
803
- if (e.key !== 'Escape')
804
- return;
805
- if (showResetConfirm) {
806
- e.preventDefault();
807
- setShowResetConfirm(false);
808
- return;
809
- }
810
- if (showLanguageDropdown) {
811
- e.preventDefault();
812
- setShowLanguageDropdown(false);
813
- return;
814
- }
815
- if (showMenu) {
816
- e.preventDefault();
817
- setShowMenu(false);
818
- return;
819
- }
820
- if (!isFullscreen)
821
- return;
822
- if (isFullscreenToggled) {
823
- e.preventDefault();
824
- setIsFullscreenToggled(false);
825
- return;
826
- }
827
- if (mode === 'fullscreen' && onExitFullscreen) {
828
- e.preventDefault();
829
- onExitFullscreen();
830
- }
831
- };
832
- window.addEventListener('keydown', onKeyDown);
833
- return function () { return window.removeEventListener('keydown', onKeyDown); };
834
- }, [
835
- isFloatingOpen,
836
- isFullscreen,
837
- isFullscreenToggled,
838
- mode,
839
- onExitFullscreen,
840
- showLanguageDropdown,
841
- showMenu,
842
- showResetConfirm,
843
- ]);
844
- useEffect(function () {
845
- var updateViewport = function () {
846
- setWindowWidth(window.innerWidth);
847
- setWindowHeight(window.innerHeight);
848
- };
849
- updateViewport();
850
- window.addEventListener('resize', updateViewport);
851
- var vv = typeof window !== 'undefined' ? window.visualViewport : null;
852
- vv === null || vv === void 0 ? void 0 : vv.addEventListener('resize', updateViewport);
853
- vv === null || vv === void 0 ? void 0 : vv.addEventListener('scroll', updateViewport);
854
- return function () {
855
- window.removeEventListener('resize', updateViewport);
856
- vv === null || vv === void 0 ? void 0 : vv.removeEventListener('resize', updateViewport);
857
- vv === null || vv === void 0 ? void 0 : vv.removeEventListener('scroll', updateViewport);
858
- };
859
- }, []);
860
- // Lock body scroll when fullscreen is active on mobile
861
- useEffect(function () {
862
- if (isFullscreen && typeof document !== 'undefined') {
863
- var originalStyle_1 = window.getComputedStyle(document.body).overflow;
864
- document.body.style.overflow = 'hidden';
865
- return function () {
866
- document.body.style.overflow = originalStyle_1;
867
- };
868
- }
869
- }, [isFullscreen]);
870
522
  var handleReCaptchaVerify = useCallback(function (token) {
871
523
  reCaptchaTokenRef.current = token;
872
524
  }, []);
873
- // Available languages (can be extended)
874
525
  var allLanguages = [
875
526
  { code: 'en', name: 'English' },
876
527
  { code: 'es', name: 'Español' },
@@ -888,164 +539,31 @@ export var GenAgentChat = function (_a) {
888
539
  return allLanguages;
889
540
  }, [agentAvailableLanguages]);
890
541
  var hasLanguageOptions = availableLanguages.length > 0;
891
- var primaryColor = (theme === null || theme === void 0 ? void 0 : theme.primaryColor) || '#2962FF';
892
- var backgroundColor = (theme === null || theme === void 0 ? void 0 : theme.backgroundColor) || '#ffffff';
893
- var textColor = (theme === null || theme === void 0 ? void 0 : theme.textColor) || '#000000';
894
- var fontFamily = (theme === null || theme === void 0 ? void 0 : theme.fontFamily) || 'Roboto, Arial, sans-serif';
895
- var fontSize = (theme === null || theme === void 0 ? void 0 : theme.fontSize) || '14px';
542
+ // Resolve theme values
543
+ var themeParams = resolveTheme(theme);
544
+ var primaryColor = themeParams.primaryColor, backgroundColor = themeParams.backgroundColor, textColor = themeParams.textColor, fontFamily = themeParams.fontFamily, fontSize = themeParams.fontSize;
896
545
  var fontSizeNumber = typeof fontSize === 'string' ? parseInt(fontSize, 10) : (typeof fontSize === 'number' ? fontSize : 14);
897
- // Helper function to convert hex color to rgba
898
- var hexToRgba = function (hex, alpha) {
899
- var r = parseInt(hex.slice(1, 3), 16);
900
- var g = parseInt(hex.slice(3, 5), 16);
901
- var b = parseInt(hex.slice(5, 7), 16);
902
- return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
903
- };
904
546
  var position = floatingConfig.position || 'bottom-right';
905
547
  var offset = floatingConfig.offset || { x: 20, y: 20 };
906
548
  var offsetX = offset.x || 20;
907
549
  var offsetY = offset.y || 20;
908
550
  var isFloatingDocked = mode === 'floating' && !isFullscreen;
909
- var containerStyle = {
910
- display: 'flex',
911
- flexDirection: 'column',
912
- // When fullscreen, let height be calculated from top/bottom, otherwise use specified height
913
- height: isFullscreen ? undefined : '100%',
914
- maxHeight: isFullscreen
915
- ? undefined
916
- : isFloatingDocked
917
- ? '100%'
918
- : windowWidth > 768
919
- ? '700px'
920
- : '600px',
921
- minHeight: isFloatingDocked ? 0 : undefined,
922
- width: isFullscreen ? '100vw' : '380px',
923
- maxWidth: isFullscreen ? '100vw' : '400px',
924
- border: isFullscreen ? 'none' : '1px solid #e0e0e0',
925
- borderRadius: isFullscreen ? '0' : '32px',
926
- overflow: 'hidden',
927
- backgroundColor: (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5',
928
- fontFamily: fontFamily,
929
- boxShadow: isFullscreen ? 'none' : "0 4px 20px rgba(0, 0, 0, 0.2)",
930
- position: isFullscreen ? 'fixed' : 'relative',
931
- top: isFullscreen ? 0 : undefined,
932
- left: isFullscreen ? 0 : undefined,
933
- right: isFullscreen ? 0 : undefined,
934
- // Position container above browser footer using safe area insets
935
- bottom: isFullscreen ? 'env(safe-area-inset-bottom, 0px)' : undefined,
936
- zIndex: isFullscreen ? 9999 : undefined,
937
- };
938
- var headerStyle = {
939
- padding: '15px',
940
- backgroundColor: (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5',
941
- color: '#111111',
942
- fontWeight: 'bold',
943
- display: 'flex',
944
- justifyContent: 'space-between',
945
- alignItems: 'center',
946
- position: 'relative',
947
- };
948
- var logoContainerStyle = {
949
- display: 'flex',
950
- alignItems: 'center',
951
- gap: '10px',
952
- position: 'relative',
953
- zIndex: 1,
954
- };
955
- var logoStyle = {
956
- width: '28px',
957
- height: '28px',
958
- };
959
- var headerTitleContainerStyle = {
960
- display: 'flex',
961
- flexDirection: 'column',
962
- };
963
- var headerTitleStyle = {
964
- fontSize: '16px',
965
- fontWeight: 'bold',
966
- margin: 0,
967
- fontFamily: fontFamily,
968
- };
969
- var headerSubtitleStyle = {
970
- fontSize: '14px',
971
- fontWeight: 'normal',
972
- margin: 0,
973
- fontFamily: fontFamily,
974
- };
975
- var menuButtonStyle = {
976
- backgroundColor: 'transparent',
977
- color: '#111111',
978
- border: 'none',
979
- borderRadius: '50%',
980
- width: '32px',
981
- height: '32px',
982
- display: 'flex',
983
- alignItems: 'center',
984
- justifyContent: 'center',
985
- cursor: 'pointer',
986
- outline: 'none',
987
- position: 'relative',
988
- zIndex: 1,
989
- };
990
- var menuPopupStyle = {
991
- position: 'absolute',
992
- top: '50px',
993
- right: '15px',
994
- backgroundColor: backgroundColor,
995
- borderRadius: '8px',
996
- boxShadow: '0 2px 10px rgba(0, 0, 0, 0.1)',
997
- zIndex: 1000,
998
- minWidth: '150px',
999
- overflow: 'visible',
1000
- };
1001
- var menuItemStyle = {
1002
- display: 'flex',
1003
- alignItems: 'center',
1004
- gap: '8px',
1005
- padding: '10px 15px',
1006
- color: textColor,
1007
- cursor: 'pointer',
1008
- fontSize: fontSize,
1009
- fontFamily: fontFamily,
1010
- borderBottom: '1px solid #f0f0f0',
1011
- };
1012
- var chatContainerStyle = {
1013
- flex: 1,
1014
- minHeight: 0,
1015
- overflowY: 'auto',
1016
- padding: '15px',
1017
- backgroundColor: 'transparent',
1018
- display: 'flex',
1019
- flexDirection: 'column',
1020
- };
1021
- var inputContainerStyle = {
1022
- display: 'flex',
1023
- padding: '12px 15px',
1024
- backgroundColor: '#ffffff',
1025
- alignItems: 'center',
1026
- gap: '8px',
1027
- flexShrink: 0,
1028
- overflowX: 'hidden',
1029
- minWidth: 0,
1030
- };
1031
- var inputWrapperStyle = {
1032
- display: 'flex',
1033
- flex: 1,
1034
- alignItems: 'center',
1035
- backgroundColor: '#ffffff',
1036
- borderRadius: '24px',
1037
- border: '1px solid #e5e7eb',
1038
- padding: '0 12px',
1039
- minHeight: '50px',
1040
- boxShadow: '0 1px 3px rgba(0, 0, 0, 0.06)',
1041
- position: 'relative',
1042
- overflowX: 'hidden',
1043
- minWidth: 0,
1044
- };
1045
- // Use at least 16px font size on mobile to prevent zoom
551
+ // Computed styles
552
+ var containerStyle = getContainerStyle({ isFullscreen: isFullscreen, isFloatingDocked: isFloatingDocked, windowWidth: windowWidth, t: themeParams });
553
+ var headerStyle = getHeaderStyle(themeParams);
554
+ var headerTitleStyle = getHeaderTitleStyle(fontFamily);
555
+ var headerSubtitleStyle = getHeaderSubtitleStyle(fontFamily);
556
+ var menuPopupStyle = getMenuPopupStyle(backgroundColor);
557
+ var menuItemStyle = getMenuItemStyle(themeParams);
558
+ var contentCardStyle = getContentCardStyle(backgroundColor);
559
+ var sendButtonStyle = getSendButtonStyle(primaryColor);
560
+ var possibleQueriesContainerStyle = getPossibleQueriesContainerStyle(fontFamily);
561
+ var queryButtonStyle = getQueryButtonStyle(themeParams);
562
+ var confirmOverlayStyle = getConfirmOverlayStyle(showResetConfirm);
563
+ var confirmDialogStyle = getConfirmDialogStyle(themeParams);
564
+ var disclaimerStyle = getDisclaimerStyle(fontFamily);
1046
565
  var textAreaFontSize = useMemo(function () {
1047
566
  if (windowWidth <= 768) {
1048
- // On mobile, use at least 16px to prevent zoom
1049
567
  return Math.max(16, fontSizeNumber) + 'px';
1050
568
  }
1051
569
  return fontSize;
@@ -1055,45 +573,20 @@ export var GenAgentChat = function (_a) {
1055
573
  return Math.round(size * 1.5);
1056
574
  }, [windowWidth, fontSizeNumber]);
1057
575
  var textAreaMaxHeightCalculated = useMemo(function () {
1058
- return textAreaLineHeight * 3; // up to 3 lines
576
+ return textAreaLineHeight * 3;
1059
577
  }, [textAreaLineHeight]);
1060
- var textAreaStyle = {
1061
- flex: 1,
1062
- border: 'none',
1063
- outline: 'none',
1064
- background: 'transparent',
1065
- fontSize: textAreaFontSize,
578
+ var textAreaStyle = getTextAreaStyle({
579
+ textAreaFontSize: textAreaFontSize,
1066
580
  fontFamily: fontFamily,
1067
- padding: '10px',
1068
- paddingRight: '46px',
1069
- color: textColor,
1070
- resize: 'none',
1071
- lineHeight: "".concat(textAreaLineHeight, "px"),
1072
- maxHeight: "".concat(textAreaMaxHeightCalculated, "px"),
1073
- overflowY: 'hidden',
1074
- overflowX: 'hidden',
1075
- minWidth: 0,
1076
- width: '100%',
1077
- boxSizing: 'border-box',
1078
- };
1079
- var attachButtonStyle = {
1080
- backgroundColor: 'transparent',
1081
- border: 'none',
1082
- display: 'flex',
1083
- alignItems: 'center',
1084
- justifyContent: 'center',
1085
- cursor: 'pointer',
1086
- outline: 'none',
1087
- color: '#757575',
1088
- padding: 0,
1089
- };
1090
- // Disable chat input when a form_request is pending (not yet submitted).
581
+ textAreaLineHeight: textAreaLineHeight,
582
+ textAreaMaxHeightCalculated: textAreaMaxHeightCalculated,
583
+ textColor: textColor,
584
+ });
1091
585
  var hasPendingForm = messages.some(function (msg, idx) {
1092
586
  if (msg.type !== 'form_request' || msg.speaker !== 'agent')
1093
587
  return false;
1094
588
  return !submittedForms.has(idx);
1095
589
  });
1096
- // Derive the pending form schema + index for footer rendering.
1097
590
  var pendingForm = useMemo(function () {
1098
591
  for (var i = messages.length - 1; i >= 0; i--) {
1099
592
  var msg = messages[i];
@@ -1107,35 +600,6 @@ export var GenAgentChat = function (_a) {
1107
600
  return null;
1108
601
  }, [messages, submittedForms]);
1109
602
  var isSendDisabled = (inputValue.trim() === '' && attachments.length === 0) || isAgentTyping || hasPendingForm;
1110
- var sendButtonStyle = {
1111
- backgroundColor: primaryColor,
1112
- color: '#ffffff',
1113
- border: 'none',
1114
- borderRadius: '50%',
1115
- width: '36px',
1116
- height: '36px',
1117
- display: 'flex',
1118
- alignItems: 'center',
1119
- justifyContent: 'center',
1120
- cursor: 'pointer',
1121
- outline: 'none',
1122
- flexShrink: 0,
1123
- boxShadow: '0 1px 3px rgba(0, 0, 0, 0.08)',
1124
- };
1125
- var sendButtonDisabledStyle = {
1126
- backgroundColor: '#d1d5db',
1127
- cursor: 'not-allowed',
1128
- opacity: 0.8,
1129
- };
1130
- var rightActionContainerStyle = {
1131
- position: 'absolute',
1132
- right: '4px',
1133
- top: '50%',
1134
- transform: 'translateY(-50%)',
1135
- display: 'flex',
1136
- alignItems: 'center',
1137
- justifyContent: 'center',
1138
- };
1139
603
  var autoResizeTextArea = function () {
1140
604
  var el = textAreaRef.current;
1141
605
  if (!el)
@@ -1148,205 +612,33 @@ export var GenAgentChat = function (_a) {
1148
612
  useEffect(function () {
1149
613
  autoResizeTextArea();
1150
614
  }, [inputValue, textAreaMaxHeightCalculated]);
1151
- var possibleQueriesContainerStyle = {
1152
- display: 'flex',
1153
- flexDirection: 'column',
1154
- gap: '8px',
1155
- padding: '0',
1156
- paddingLeft: '28px',
1157
- paddingRight: '28px',
1158
- marginTop: '5px',
1159
- marginBottom: '15px',
1160
- width: '100%',
1161
- fontFamily: fontFamily,
1162
- };
1163
- var queryButtonStyle = {
1164
- padding: '12px 15px',
1165
- backgroundColor: (theme === null || theme === void 0 ? void 0 : theme.secondaryColor) || '#f5f5f5',
1166
- color: textColor,
1167
- border: 'none',
1168
- borderRadius: '6px',
1169
- fontSize: fontSize,
1170
- cursor: 'pointer',
1171
- textAlign: 'left',
1172
- fontWeight: 'normal',
1173
- boxShadow: 'none',
1174
- width: '100%',
1175
- maxWidth: '240px',
1176
- fontFamily: fontFamily,
1177
- };
1178
- var confirmOverlayStyle = {
1179
- display: showResetConfirm ? 'flex' : 'none',
1180
- position: 'absolute',
1181
- top: 0,
1182
- left: 0,
1183
- right: 0,
1184
- bottom: 0,
1185
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
1186
- zIndex: 10,
1187
- justifyContent: 'center',
1188
- alignItems: 'center',
1189
- };
1190
- var confirmDialogStyle = {
1191
- backgroundColor: backgroundColor,
1192
- padding: '20px',
1193
- borderRadius: '8px',
1194
- maxWidth: '300px',
1195
- textAlign: 'center',
1196
- fontFamily: fontFamily,
1197
- color: textColor,
1198
- };
1199
- var confirmButtonsStyle = {
1200
- display: 'flex',
1201
- justifyContent: 'center',
1202
- marginTop: '15px',
1203
- gap: '10px',
1204
- };
1205
- var confirmButtonStyle = function (isConfirm) { return ({
1206
- padding: '8px 16px',
1207
- backgroundColor: isConfirm ? '#F44336' : '#e0e0e0',
1208
- color: isConfirm ? '#ffffff' : textColor,
1209
- border: 'none',
1210
- borderRadius: '4px',
1211
- cursor: 'pointer',
1212
- fontFamily: fontFamily,
1213
- fontSize: fontSize,
1214
- }); };
1215
- var contentCardStyle = {
1216
- flex: 1,
1217
- display: 'flex',
1218
- flexDirection: 'column',
1219
- backgroundColor: backgroundColor,
1220
- borderTopLeftRadius: 24,
1221
- borderTopRightRadius: 24,
1222
- boxShadow: '0 -2px 6px rgba(0,0,0,0.03)',
1223
- position: 'relative',
1224
- zIndex: 2,
1225
- overflow: 'hidden',
1226
- minHeight: 0,
1227
- };
1228
- // Floating mode styles
1229
- var getPositionStyles = function () {
1230
- var base = {
1231
- position: 'fixed',
1232
- zIndex: 1000,
1233
- };
1234
- switch (position) {
1235
- case 'bottom-right':
1236
- return __assign(__assign({}, base), { bottom: offsetY, right: offsetX });
1237
- case 'bottom-left':
1238
- return __assign(__assign({}, base), { bottom: offsetY, left: offsetX });
1239
- case 'top-right':
1240
- return __assign(__assign({}, base), { top: offsetY, right: offsetX });
1241
- case 'top-left':
1242
- return __assign(__assign({}, base), { top: offsetY, left: offsetX });
1243
- default:
1244
- return __assign(__assign({}, base), { bottom: offsetY, right: offsetX });
1245
- }
1246
- };
1247
- var getChatPositionStyles = function () {
1248
- var base = {
1249
- position: 'fixed',
1250
- borderRadius: '32px',
1251
- zIndex: 1004,
1252
- };
1253
- switch (position) {
1254
- case 'bottom-right':
1255
- return __assign(__assign({}, base), { bottom: offsetY, right: offsetX });
1256
- case 'bottom-left':
1257
- return __assign(__assign({}, base), { bottom: offsetY, left: offsetX });
1258
- case 'top-right':
1259
- return __assign(__assign({}, base), { top: offsetY, right: offsetX });
1260
- case 'top-left':
1261
- return __assign(__assign({}, base), { top: offsetY, left: offsetX });
1262
- default:
1263
- return __assign(__assign({}, base), { bottom: offsetY, right: offsetX });
1264
- }
1265
- };
1266
- var disclaimerStyle = {
1267
- textAlign: 'left',
1268
- fontSize: '12px',
1269
- color: '#9ca3af',
1270
- margin: '12px 4px 2px 4px',
1271
- fontFamily: fontFamily,
1272
- };
1273
615
  var showAgentDisclaimer = Boolean(inputDisclaimerHtml);
1274
616
  var agentDisclaimerContent = showAgentDisclaimer && (_jsx("span", { dangerouslySetInnerHTML: { __html: inputDisclaimerHtml } }));
1275
- var getResponsiveDimensions = function () {
1276
- var screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1024;
1277
- var fallbackHeight = isFullscreen ? '100vh' : '60vh';
1278
- if (isFullscreen) {
1279
- return { width: '100vw', height: fallbackHeight, borderRadius: '0' };
1280
- }
1281
- // Floating docked panel: width only; height/maxHeight come from viewport-aware shell styles
1282
- if (mode === 'floating') {
1283
- if (screenWidth <= 480) {
1284
- return { width: 'calc(100vw - 40px)' };
1285
- }
1286
- if (screenWidth <= 768) {
1287
- return { width: '350px' };
1288
- }
1289
- return { width: '380px' };
1290
- }
1291
- if (screenWidth <= 480) {
1292
- return { width: 'calc(100vw - 40px)', height: fallbackHeight };
1293
- }
1294
- if (screenWidth <= 768) {
1295
- return { width: '350px', height: fallbackHeight };
1296
- }
1297
- return { width: '380px', height: fallbackHeight };
1298
- };
1299
- /** Max height for open floating chat ≈ viewport minus corner offset; updates with resize / visualViewport. */
1300
- var getFloatingShellStyle = function () {
1301
- var screenWidth = typeof window !== 'undefined' ? window.innerWidth : 1024;
1302
- var screenHeight = typeof window !== 'undefined' ? window.innerHeight : 1080;
1303
- var margin = 10;
1304
- var usableHeight = Math.max(280, windowHeight - offsetY - margin * 10);
1305
- var maxHeight = usableHeight;
1306
- // If the screen is large enough, set the max height to 60vh
1307
- if (screenWidth >= 765 && screenHeight >= 1070) {
1308
- maxHeight = '60vh';
1309
- }
1310
- return __assign({ display: 'flex', flexDirection: 'column', maxHeight: maxHeight, height: usableHeight }, (position === 'top-right' || position === 'top-left'
1311
- ? { top: offsetY, bottom: 'auto' }
1312
- : { top: 'auto', bottom: offsetY }));
1313
- };
1314
- var floatingContainerStyle = __assign({}, ((mode === 'fullscreen' || (isFullscreen && windowWidth <= 768))
1315
- ? {
1316
- position: 'fixed',
1317
- top: 0,
1318
- left: 0,
1319
- right: 0,
1320
- bottom: 'env(safe-area-inset-bottom, 0px)',
1321
- // Height will be automatically calculated from top and bottom
1322
- borderRadius: '0',
1323
- zIndex: 9999,
1324
- }
1325
- : __assign(__assign(__assign({}, getChatPositionStyles()), getResponsiveDimensions()), (mode === 'floating' && !isFullscreen ? getFloatingShellStyle() : {}))));
617
+ var floatingContainerStyle = getFloatingContainerStyle({
618
+ mode: mode,
619
+ isFullscreen: isFullscreen,
620
+ windowWidth: windowWidth,
621
+ windowHeight: windowHeight,
622
+ position: position,
623
+ offsetX: offsetX,
624
+ offsetY: offsetY,
625
+ });
1326
626
  var renderLanguageSelector = function () {
1327
- // ------------------------------------------------------------
1328
- // Show language selector only when SHOW_CHAT_LANGUAGE_SELECTOR is true
1329
- // ------------------------------------------------------------
1330
627
  if (!SHOW_CHAT_LANGUAGE_SELECTOR) {
1331
628
  return null;
1332
629
  }
1333
630
  if (!hasLanguageOptions || (conversationId && !isFinalized) || messages.length > 0 || hasUserMessages) {
1334
631
  return null;
1335
632
  }
1336
- return (_jsx(_Fragment, { children: _jsx(LanguageSelector, { availableLanguages: availableLanguages, selectedLanguage: resolvedLanguage, onLanguageChange: handleLanguageChange, translations: translations, theme: theme }) }));
633
+ return (_jsx(LanguageSelector, { availableLanguages: availableLanguages, selectedLanguage: resolvedLanguage, onLanguageChange: handleLanguageChange, translations: translations, theme: theme }));
1337
634
  };
1338
- /**
1339
- * Render the component with ReCaptcha
1340
- * @param children - The children to be rendered
1341
- * @returns The rendered component
1342
- */
1343
635
  var renderWithReCaptcha = useMemo(function () {
1344
636
  if (!reCaptchaKey) {
1345
637
  return function (children) { return _jsx(_Fragment, { children: children }); };
1346
638
  }
1347
639
  return function (children) { return (_jsxs(GoogleReCaptchaProvider, { reCaptchaKey: reCaptchaKey || '', children: [_jsx(GoogleReCaptcha, { action: "genassist_chat", onVerify: handleReCaptchaVerify, refreshReCaptcha: false }), _jsx(_Fragment, { children: children })] })); };
1348
640
  }, [reCaptchaKey, handleReCaptchaVerify]);
1349
- var renderChatComponent = function () { return (_jsxs("div", { style: containerStyle, "data-genassist-root": "true", children: [_jsx("style", { children: "\n @keyframes blink { 0% { opacity: 0.2; } 20% { opacity: 1; } 100% { opacity: 0.2; } }\n /* Hide scrollbars for the expanding textarea but keep scrolling */\n .ga-textarea-nosb {\n scrollbar-width: none;\n -ms-overflow-style: none;\n max-width: 100%;\n box-sizing: border-box;\n }\n .ga-textarea-nosb::-webkit-scrollbar { width: 0; height: 0; }\n /* Disclaimer links color */\n .ga-input-disclaimer a {\n color: #9ca3af !important;\n text-decoration: underline;\n }\n .ga-input-disclaimer a:hover {\n color: #6b7280 !important;\n }\n /* Prevent zoom on mobile - ensure minimum 16px font size */\n @media (max-width: 768px) {\n .ga-textarea-nosb {\n font-size: 16px !important;\n }\n }\n /* Backlight sweep under content edge (GPU-friendly).\n Wider travel to fully reach both corners. */\n @keyframes ga-backlight-sweep2 { 0% { transform: translateX(-35%); } 100% { transform: translateX(105%); } }\n @keyframes ga-backlight-pulse { 0%,100% { opacity: 0.7; } 50% { opacity: 1; } }\n @keyframes ga-think-change { 0% { opacity: 0; transform: translateY(4px); } 100% { opacity: 1; transform: translateY(0); } }\n /* Hide reCAPTCHA badge */\n /* Ensure reCAPTCHA container is always hidden */\n .grecaptcha-badge {\n display: none !important;\n visibility: hidden !important;\n position: absolute !important;\n width: 0 !important;\n height: 0 !important;\n overflow: hidden !important;\n opacity: 0 !important;\n pointer-events: none !important;\n }\n /* Support for safe area insets - handled via inline styles on input container */\n " }), _jsxs("div", { style: headerStyle, ref: headerRef, children: [_jsxs("div", { style: logoContainerStyle, children: [_jsx("img", { src: (logoUrl === null || logoUrl === void 0 ? void 0 : logoUrl.trim()) || chatLogo, alt: "Logo", style: logoStyle }), _jsxs("div", { style: headerTitleContainerStyle, children: [_jsx("div", { style: headerTitleStyle, children: headerTitle }), _jsx("div", { style: headerSubtitleStyle, children: description !== null && description !== void 0 ? description : t('header.subtitle') })] })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx("button", { style: menuButtonStyle, onClick: handleMenuClick, title: t('menu.title'), children: _jsx(MoreVertical, { size: 24, color: "#111111" }) }), mode === 'floating' && (_jsx("button", { style: menuButtonStyle, onClick: function () { return setIsFloatingOpen(false); }, title: "Close chat", children: _jsx(X, { size: 24, color: "#111111" }) }))] })] }), !noColorAnimation && showBacklight && (_jsx("div", { style: {
641
+ var renderChatComponent = function () { return (_jsxs("div", { style: containerStyle, "data-genassist-root": "true", children: [_jsx("style", { children: CSS_KEYFRAMES }), _jsxs("div", { style: headerStyle, ref: headerRef, children: [_jsxs("div", { style: logoContainerStyle, children: [_jsx("img", { src: (logoUrl === null || logoUrl === void 0 ? void 0 : logoUrl.trim()) || chatLogo, alt: "Logo", style: logoStyle }), _jsxs("div", { style: headerTitleContainerStyle, children: [_jsx("div", { style: headerTitleStyle, children: headerTitle }), _jsx("div", { style: headerSubtitleStyle, children: description !== null && description !== void 0 ? description : t('header.subtitle') })] })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx("button", { style: menuButtonStyle, onClick: handleMenuClick, title: t('menu.title'), children: _jsx(MoreVertical, { size: 24, color: "#111111" }) }), mode === 'floating' && (_jsx("button", { style: menuButtonStyle, onClick: function () { return setIsFloatingOpen(false); }, title: "Close chat", children: _jsx(X, { size: 24, color: "#111111" }) }))] })] }), !noColorAnimation && showBacklight && (_jsx("div", { style: {
1350
642
  position: 'absolute',
1351
643
  left: 0,
1352
644
  right: 0,
@@ -1410,7 +702,6 @@ export var GenAgentChat = function (_a) {
1410
702
  setShowLanguageDropdown(false);
1411
703
  setShowMenu(false);
1412
704
  }, children: lang.name }, lang.code)); }) }))] }))] })), _jsxs("div", { style: contentCardStyle, children: [_jsxs("div", { style: chatContainerStyle, ref: chatContainerRef, children: [renderLanguageSelector(), (function () {
1413
- // show welcome card (only when showWelcomeBeforeStart is true)
1414
705
  var shouldShowSyntheticWelcome = showWelcomeBeforeStart &&
1415
706
  !hasUserMessages &&
1416
707
  (messages.length === 0 || messages[0].speaker !== 'agent') &&
@@ -1430,11 +721,9 @@ export var GenAgentChat = function (_a) {
1430
721
  })(), (function () {
1431
722
  var firstAgentIndex = messages.findIndex(function (m) { return m.speaker === 'agent'; });
1432
723
  var applyMessageFilter = function (message) {
1433
- // filter out file messages added by the agent
1434
724
  return message.type !== 'file';
1435
725
  };
1436
726
  return messages.filter(applyMessageFilter).map(function (message, index) {
1437
- // For form_request messages, show just the message text as an agent bubble
1438
727
  if (message.type === 'form_request' && message.speaker === 'agent') {
1439
728
  try {
1440
729
  var formSchema = JSON.parse(message.text);
@@ -1457,7 +746,7 @@ export var GenAgentChat = function (_a) {
1457
746
  var isFirstAgentMessage = index === firstAgentIndex && message.speaker === 'agent' && !hasUserMessages;
1458
747
  var displayMessage = isFirstAgentMessage && welcomeMessage
1459
748
  ? __assign(__assign({}, message), { text: welcomeMessage }) : message;
1460
- return (_jsx(ChatMessageComponent, { message: displayMessage, theme: theme, onPlayAudio: message.speaker === 'agent' ? playResponseAudio : undefined, isPlayingAudio: isPlayingAudio, isFirstMessage: isFirstAgentMessage, isNextSameSpeaker: isNextSameSpeaker, isPrevSameSpeaker: isPrevSameSpeaker, onFeedback: function (messageId, value) { return addFeedback(messageId, value); }, enableTypewriter: index === messages.length - 1 && message.speaker === 'agent', welcomeImageUrl: isFirstAgentMessage ? (welcomeImageUrl || undefined) : undefined, welcomeTitle: isFirstAgentMessage ? (welcomeTitle || undefined) : undefined, possibleQueries: isFirstAgentMessage ? possibleQueries : undefined, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, onScheduleConfirm: handleScheduleConfirm, isLastMessage: index === messages.length - 1 && message.speaker === 'agent', translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping }, index));
749
+ return (_jsx(ChatMessageComponent, { message: displayMessage, theme: theme, onPlayAudio: message.speaker === 'agent' ? playResponseAudio : undefined, isPlayingAudio: isPlayingAudio, isFirstMessage: isFirstAgentMessage, isNextSameSpeaker: isNextSameSpeaker, isPrevSameSpeaker: isPrevSameSpeaker, onFeedback: function (messageId, value) { return addFeedback(messageId, value); }, enableTypewriter: index === messages.length - 1 && message.speaker === 'agent', welcomeImageUrl: isFirstAgentMessage ? (welcomeImageUrl || undefined) : undefined, welcomeTitle: isFirstAgentMessage ? (welcomeTitle || undefined) : undefined, possibleQueries: isFirstAgentMessage ? possibleQueries : undefined, onQuickQuery: handleQueryClick, onQuickAction: handleQuickAction, onScheduleConfirm: handleScheduleConfirm, isLastMessage: index === messages.length - 1 && message.speaker === 'agent', translations: translations, language: resolvedLanguage, agentName: agentName, isAgentTyping: isAgentTyping, audioUrlBuilder: message.type === 'audio' && useAudio ? audioUrlBuilder : undefined, audioHeaders: message.type === 'audio' && useAudio ? audioHeaders : undefined, autoPlayAudioMessageId: autoPlayAudioMessageId }, index));
1461
750
  });
1462
751
  })(), isAgentTyping && currentThinkingParts.length > 0 && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', maxWidth: '80%' }, children: [_jsx("div", { style: { fontSize: '14px', color: '#000000', fontWeight: 600, marginBottom: 4 }, children: agentName || t('labels.agent') }), _jsx("div", { style: {
1463
752
  backgroundColor: 'transparent',
@@ -1496,13 +785,33 @@ export var GenAgentChat = function (_a) {
1496
785
  submitMessage();
1497
786
  }
1498
787
  }
1499
- }, placeholder: inputPlaceholder, disabled: !conversationId || isFinalized || hasPendingForm, rows: 1 }), _jsx("div", { style: rightActionContainerStyle, children: useAudio && inputValue.trim() === '' && attachments.length === 0 ? (_jsx(VoiceInput, { onTranscription: function (text) { return setInputValue(text); }, onError: handleVoiceError, baseUrl: baseUrl, apiKey: apiKey, theme: theme })) : (_jsx("button", { type: "submit", style: __assign(__assign({}, sendButtonStyle), (isSendDisabled ? sendButtonDisabledStyle : {})), disabled: isSendDisabled, children: _jsx(ArrowUp, { size: 18, strokeWidth: 3, color: "#ffffff" }) })) })] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) }))] }), _jsx("div", { style: confirmOverlayStyle, children: _jsxs("div", { style: confirmDialogStyle, children: [_jsx("h3", { style: { fontFamily: fontFamily, marginTop: 0 }, children: t('dialog.resetConversation.title') }), _jsx("p", { style: { fontFamily: fontFamily, fontSize: fontSize }, children: t('dialog.resetConversation.message') }), _jsxs("div", { style: confirmButtonsStyle, children: [_jsx("button", { style: __assign(__assign({}, confirmButtonStyle(false)), { color: textColor }), onClick: handleCancelReset, children: t('buttons.cancel') }), _jsx("button", { style: confirmButtonStyle(true), onClick: handleConfirmReset, children: t('buttons.reset') })] })] }) })] })); };
788
+ }, placeholder: inputPlaceholder, disabled: !conversationId || isFinalized || hasPendingForm, rows: 1 }), _jsx("div", { style: rightActionContainerStyle, children: !(useAudio && inputValue.trim() === '' && attachments.length === 0) && (_jsx("button", { type: "submit", style: __assign(__assign({}, sendButtonStyle), (isSendDisabled ? sendButtonDisabledStyle : {})), disabled: isSendDisabled, children: _jsx(ArrowUp, { size: 18, strokeWidth: 3, color: "#ffffff" }) })) }), useAudio && inputValue.trim() === '' && attachments.length === 0 && (_jsx(VoiceInput, { onAudioReady: function (blob, format) { return __awaiter(void 0, void 0, void 0, function () {
789
+ var _a;
790
+ return __generator(this, function (_b) {
791
+ switch (_b.label) {
792
+ case 0:
793
+ _b.trys.push([0, 2, 3, 4]);
794
+ setIsPlayingAudio(true);
795
+ return [4 /*yield*/, sendAudioMessage(blob, format)];
796
+ case 1:
797
+ _b.sent();
798
+ return [3 /*break*/, 4];
799
+ case 2:
800
+ _a = _b.sent();
801
+ return [3 /*break*/, 4];
802
+ case 3:
803
+ setIsPlayingAudio(false);
804
+ return [7 /*endfinally*/];
805
+ case 4: return [2 /*return*/];
806
+ }
807
+ });
808
+ }); }, onError: handleVoiceError, theme: theme }))] }), agentDisclaimerContent && (_jsx("div", { className: "ga-input-disclaimer", style: disclaimerStyle, children: agentDisclaimerContent }))] }) }))] }), _jsx("div", { style: confirmOverlayStyle, children: _jsxs("div", { style: confirmDialogStyle, children: [_jsx("h3", { style: { fontFamily: fontFamily, marginTop: 0 }, children: t('dialog.resetConversation.title') }), _jsx("p", { style: { fontFamily: fontFamily, fontSize: fontSize }, children: t('dialog.resetConversation.message') }), _jsxs("div", { style: confirmButtonsStyle, children: [_jsx("button", { style: __assign(__assign({}, getConfirmButtonStyle(false, themeParams)), { color: textColor }), onClick: handleCancelReset, children: t('buttons.cancel') }), _jsx("button", { style: getConfirmButtonStyle(true, themeParams), onClick: handleConfirmReset, children: t('buttons.reset') })] })] }) })] })); };
1500
809
  if (mode === 'floating') {
1501
- return (_jsxs(_Fragment, { children: [!isFloatingOpen && (_jsx(ChatBubble, { showChat: isFloatingOpen, onClick: function () { return setIsFloatingOpen(function (prev) { return !prev; }); }, primaryColor: primaryColor, style: getPositionStyles() })), isFloatingOpen && (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "floating", children: renderWithReCaptcha(renderChatComponent()) }))] }));
810
+ return (_jsxs(_Fragment, { children: [!isFloatingOpen && (_jsx(ChatBubble, { showChat: isFloatingOpen, onClick: function () { return setIsFloatingOpen(function (prev) { return !prev; }); }, primaryColor: primaryColor, style: getPositionStyles({ position: position, offsetX: offsetX, offsetY: offsetY }) })), isFloatingOpen && (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "floating", children: renderWithReCaptcha(renderChatComponent()) }))] }));
1502
811
  }
1503
812
  if (mode === 'fullscreen') {
1504
813
  return (_jsx("div", { style: floatingContainerStyle, "data-genassist-container": "fullscreen", children: renderWithReCaptcha(renderChatComponent()) }));
1505
814
  }
1506
815
  return renderWithReCaptcha(renderChatComponent());
1507
816
  };
1508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuQWdlbnRDaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDbEcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLGtCQUFrQixNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sUUFBUSxNQUFNLHlCQUF5QixDQUFDO0FBRS9DLDBDQUEwQztBQUUxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLDBCQUEwQixHQUMzQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLHVC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QUssRUFBRSxTQUFTLEtBQUcsT0FBTyxFQUFFLGlCQUFpQixZQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFVLEVBQzNILGlCQUFRLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLFlBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFVLElBQy9GLElBQ0YsR0FDRixJQUNGLENBQ1AsRUEvZ0JpQyxDQStnQmpDLENBQUM7SUFFRixJQUFJLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQ0wsOEJBQ0csQ0FBQyxjQUFjLElBQUksQ0FDbEIsS0FBQyxVQUFVLElBQ1QsUUFBUSxFQUFFLGNBQWMsRUFDeEIsT0FBTyxFQUFFLGNBQU0sT0FBQSxpQkFBaUIsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLENBQUMsSUFBSSxFQUFMLENBQUssQ0FBQyxFQUFoQyxDQUFnQyxFQUMvQyxZQUFZLEVBQUUsWUFBWSxFQUMxQixLQUFLLEVBQUUsaUJBQWlCLEVBQUUsR0FDMUIsQ0FDSCxFQUVBLGNBQWMsSUFBSSxDQUNqQixjQUFLLEtBQUssRUFBRSxzQkFBc0IsOEJBQTJCLFVBQVUsWUFDcEUsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLElBQ0EsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQzFCLE9BQU8sQ0FDTCxjQUFLLEtBQUssRUFBRSxzQkFBc0IsOEJBQTJCLFlBQVksWUFDdEUsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxHQUN2QyxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VNZW1vLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IENoYXRNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9DaGF0TWVzc2FnZSc7XG5pbXBvcnQgeyBBdHRhY2htZW50UHJldmlldyB9IGZyb20gJy4vY29tbW9uL0F0dGFjaG1lbnRQcmV2aWV3JztcbmltcG9ydCB7IHVzZUNoYXQgfSBmcm9tICcuLi9ob29rcy91c2VDaGF0JztcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBHZW5BZ2VudENoYXRQcm9wcywgU2NoZWR1bGVJdGVtLCBBdHRhY2htZW50LCBBdHRhY2htZW50V2l0aEZpbGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBWb2ljZUlucHV0IH0gZnJvbSAnLi9Wb2ljZUlucHV0JztcbmltcG9ydCB7IEF1ZGlvU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2F1ZGlvU2VydmljZSc7XG5pbXBvcnQgeyBQYXBlcmNsaXAsIE1vcmVWZXJ0aWNhbCwgUmVmcmVzaEN3LCBHbG9iZSwgWCwgQXJyb3dVcCwgTWF4aW1pemUyLCBNaW5pbWl6ZTIsIEFsZXJ0Q2lyY2xlIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IENoYXRCdWJibGUgfSBmcm9tICcuL0NoYXRCdWJibGUnO1xuaW1wb3J0IER5bmFtaWNGb3JtTWVzc2FnZSBmcm9tICcuL0R5bmFtaWNGb3JtTWVzc2FnZSc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlbGVjdG9yIH0gZnJvbSAnLi9MYW5ndWFnZVNlbGVjdG9yJztcbmltcG9ydCBjaGF0TG9nbyBmcm9tICcuLi9hc3NldHMvY2hhdC1sb2dvLnBuZyc7XG5cbi8vIFR5cGUgZm9yIGF0dGFjaG1lbnQgd2l0aCBmaWxlIHJlZmVyZW5jZVxuXG5pbXBvcnQge1xuICByZXNvbHZlTGFuZ3VhZ2UsXG4gIG1lcmdlVHJhbnNsYXRpb25zLFxuICBnZXRUcmFuc2xhdGlvblN0cmluZyxcbiAgZ2V0VHJhbnNsYXRpb25BcnJheSxcbiAgZ2V0VHJhbnNsYXRpb25zRm9yTGFuZ3VhZ2UsXG59IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgR29vZ2xlUmVDYXB0Y2hhLCBHb29nbGVSZUNhcHRjaGFQcm92aWRlciB9IGZyb20gJ3JlYWN0LWdvb2dsZS1yZWNhcHRjaGEtdjMnO1xuXG4vLyBjYW4gYmUgdXNlZCB0byBoaWRlIHRoZSBsYW5ndWFnZSBzZWxlY3RvciBvbiB0aGUgY2hhdCBib3hcbmNvbnN0IFNIT1dfQ0hBVF9MQU5HVUFHRV9TRUxFQ1RPUiA9IHRydWU7XG5cbmV4cG9ydCBjb25zdCBHZW5BZ2VudENoYXQ6IFJlYWN0LkZDPEdlbkFnZW50Q2hhdFByb3BzPiA9ICh7XG4gIGJhc2VVcmwsXG4gIHdlYnNvY2tldFVybCxcbiAgYXBpS2V5LFxuICB0ZW5hbnQsXG4gIG1ldGFkYXRhLFxuICB1c2VXcyA9IHRydWUsXG4gIHVzZVBvbGwgPSBmYWxzZSxcbiAgb25FcnJvcixcbiAgb25UYWtlb3ZlcixcbiAgb25GaW5hbGl6ZSxcbiAgdGhlbWUsXG4gIGhlYWRlclRpdGxlID0gJ0dlbmFzc2lzdCcsXG4gIGRlc2NyaXB0aW9uLFxuICBwbGFjZWhvbGRlcixcbiAgYWdlbnROYW1lLFxuICBsb2dvVXJsLFxuICBtb2RlID0gJ2VtYmVkZGVkJyxcbiAgb25FeGl0RnVsbHNjcmVlbixcbiAgZmxvYXRpbmdDb25maWcgPSB7fSxcbiAgbGFuZ3VhZ2UsXG4gIHRyYW5zbGF0aW9uczogY3VzdG9tVHJhbnNsYXRpb25zLFxuICByZUNhcHRjaGFLZXksXG4gIHdpZGdldCA9IGZhbHNlLFxuICB1c2VBdWRpbyA9IGZhbHNlLFxuICB1c2VGaWxlID0gZmFsc2UsXG4gIG5vQ29sb3JBbmltYXRpb24gPSBmYWxzZSxcbiAgc2hvd1dlbGNvbWVCZWZvcmVTdGFydCA9IHRydWUsXG4gIGFsbG93ZWRFeHRlbnNpb25zID0gW10sXG4gIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgZm9ybURpc3BsYXkgPSAnZm9vdGVyJyxcbiAgb25Db25maWdMb2FkZWQsXG59KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgLy8gTGFuZ3VhZ2Ugc2VsZWN0aW9uIHN0YXRlICh3aXRoIGxvY2FsU3RvcmFnZSBwZXJzaXN0ZW5jZSlcbiAgY29uc3QgW3NlbGVjdGVkTGFuZ3VhZ2UsIHNldFNlbGVjdGVkTGFuZ3VhZ2VdID0gdXNlU3RhdGU8c3RyaW5nPigoKSA9PiB7XG4gICAgaWYgKGxhbmd1YWdlKSByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgY29uc3Qgc3RvcmVkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZ2VuYXNzaXN0X2xhbmd1YWdlJykgOiBudWxsO1xuICAgIGlmIChzdG9yZWQpIHJldHVybiBzdG9yZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVMYW5ndWFnZSgpO1xuICB9KTtcblxuICAvLyBTYXZlIGxhbmd1YWdlIHRvIGxvY2FsU3RvcmFnZSB3aGVuIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWxhbmd1YWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ2VuYXNzaXN0X2xhbmd1YWdlJywgc2VsZWN0ZWRMYW5ndWFnZSk7XG4gICAgfVxuICB9LCBbc2VsZWN0ZWRMYW5ndWFnZSwgbGFuZ3VhZ2VdKTtcblxuICAvLyBTdGF0ZSBmb3IgdHJhY2tpbmcgc2VsZWN0ZWQgRkFRIHF1ZXJ5XG4gIGNvbnN0IFtzZWxlY3RlZEZhcVF1ZXJ5LCBzZXRTZWxlY3RlZEZhcVF1ZXJ5XSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFJlc29sdmUgbGFuZ3VhZ2U6IHByb3AgPiBzZWxlY3RlZCA+IGJyb3dzZXIgPiAnZW4nXG4gIGNvbnN0IHJlc29sdmVkTGFuZ3VhZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybiBsYW5ndWFnZTtcbiAgICByZXR1cm4gc2VsZWN0ZWRMYW5ndWFnZSB8fCByZXNvbHZlTGFuZ3VhZ2UoKSB8fCAnZW4nO1xuICB9LCBbbGFuZ3VhZ2UsIHNlbGVjdGVkTGFuZ3VhZ2VdKTtcblxuICAvLyBNZXJnZSBsYW5ndWFnZSBhbmQgRkFRIHF1ZXJ5IGludG8gbWV0YWRhdGFcbiAgY29uc3QgbWV0YWRhdGFXaXRoTGFuZ3VhZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKG1ldGFkYXRhIHx8IHt9KSxcbiAgICAgIGxhbmd1YWdlOiByZXNvbHZlZExhbmd1YWdlLFxuICAgICAgLi4uKHNlbGVjdGVkRmFxUXVlcnkgPyB7IGZhcV9xdWVyeTogc2VsZWN0ZWRGYXFRdWVyeSB9IDoge30pLFxuICAgIH07XG4gIH0sIFttZXRhZGF0YSwgcmVzb2x2ZWRMYW5ndWFnZSwgc2VsZWN0ZWRGYXFRdWVyeV0pO1xuXG4gIC8vIEdldCB0cmFuc2xhdGlvbnMgYmFzZWQgb24gcmVzb2x2ZWQgbGFuZ3VhZ2UsIHRoZW4gbWVyZ2Ugd2l0aCBjdXN0b20gdHJhbnNsYXRpb25zXG4gIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIEZpcnN0IGdldCBiYXNlIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGxhbmd1YWdlXG4gICAgY29uc3QgYmFzZVRyYW5zbGF0aW9ucyA9IGdldFRyYW5zbGF0aW9uc0Zvckxhbmd1YWdlKHJlc29sdmVkTGFuZ3VhZ2UpO1xuICAgIC8vIFRoZW4gbWVyZ2Ugd2l0aCBhbnkgY3VzdG9tIHRyYW5zbGF0aW9ucyBwcm92aWRlZFxuICAgIHJldHVybiBtZXJnZVRyYW5zbGF0aW9ucyhjdXN0b21UcmFuc2xhdGlvbnMsIGJhc2VUcmFuc2xhdGlvbnMpO1xuICB9LCBbcmVzb2x2ZWRMYW5ndWFnZSwgY3VzdG9tVHJhbnNsYXRpb25zXSk7XG5cbiAgLy8gVHJhbnNsYXRpb24gaGVscGVyIGZ1bmN0aW9uXG4gIGNvbnN0IHQgPSAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gZ2V0VHJhbnNsYXRpb25TdHJpbmcoa2V5LCB0cmFuc2xhdGlvbnMsIGZhbGxiYWNrKTtcbiAgfTtcblxuICAvLyBHZXQgdHJhbnNsYXRlZCBwbGFjZWhvbGRlciBvciB1c2UgcHJvdmlkZWQvZGVmYXVsdFxuICAvLyBNYWtlIGl0IHJlYWN0aXZlIHRvIGxhbmd1YWdlIGNoYW5nZXNcbiAgY29uc3QgaW5wdXRQbGFjZWhvbGRlciA9IHVzZU1lbW8oKCkgPT4gcGxhY2Vob2xkZXIgfHwgdCgnaW5wdXQucGxhY2Vob2xkZXInLCAnQXNrIGEgcXVlc3Rpb24nKSwgW3BsYWNlaG9sZGVyLCB0cmFuc2xhdGlvbnNdKTtcbiAgY29uc3QgW2lucHV0VmFsdWUsIHNldElucHV0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xuICBjb25zdCBbc2hvd1Jlc2V0Q29uZmlybSwgc2V0U2hvd1Jlc2V0Q29uZmlybV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93TWVudSwgc2V0U2hvd01lbnVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd0xhbmd1YWdlRHJvcGRvd24sIHNldFNob3dMYW5ndWFnZURyb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzUGxheWluZ0F1ZGlvLCBzZXRJc1BsYXlpbmdBdWRpb10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpc0Zsb2F0aW5nT3Blbiwgc2V0SXNGbG9hdGluZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXR0YWNobWVudHMsIHNldEF0dGFjaG1lbnRzXSA9IHVzZVN0YXRlPEF0dGFjaG1lbnRXaXRoRmlsZVtdPihbXSk7XG4gIGNvbnN0IFtzdWJtaXR0ZWRGb3Jtcywgc2V0U3VibWl0dGVkRm9ybXNdID0gdXNlU3RhdGU8U2V0PG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIGNvbnN0IFtzdWJtaXR0aW5nRm9ybUluZGV4LCBzZXRTdWJtaXR0aW5nRm9ybUluZGV4XSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdXBsb2FkaW5nRmlsZXMsIHNldFVwbG9hZGluZ0ZpbGVzXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuICBjb25zdCBbZmlsZUVycm9yVG9hc3QsIHNldEZpbGVFcnJvclRvYXN0XSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBmaWxlRXJyb3JUb2FzdFRpbWVvdXRSZWYgPSB1c2VSZWY8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsPihudWxsKTtcbiAgY29uc3QgbWVudVJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcbiAgY29uc3QgdGV4dEFyZWFSZWYgPSB1c2VSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGhlYWRlclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IFtoZWFkZXJIZWlnaHQsIHNldEhlYWRlckhlaWdodF0gPSB1c2VTdGF0ZSg1Nik7XG4gIGNvbnN0IFtzaG93QmFja2xpZ2h0LCBzZXRTaG93QmFja2xpZ2h0XSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzRnVsbHNjcmVlblRvZ2dsZWQsIHNldElzRnVsbHNjcmVlblRvZ2dsZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIC8vIGRlZmF1bHQgdGhpbmtpbmcgbWVzc2FnZXMgaWYgbm9uZSBwcm92aWRlZCBieSB3b3JrZmxvd1xuICBjb25zdCBERUZBVUxUX1RISU5LSU5HX01FU1NBR0VTID0gdXNlTWVtbyhcbiAgICAoKSA9PiBnZXRUcmFuc2xhdGlvbkFycmF5KCd0aGlua2luZy5tZXNzYWdlcycsIHRyYW5zbGF0aW9ucywgW1xuICAgICAgXCJUaGlua2luZ+KAplwiLFxuICAgICAgXCJBbmFseXppbmcgeW91ciBxdWVzdGlvbuKAplwiLFxuICAgICAgXCJTZWFyY2hpbmcga25vd2xlZGdl4oCmXCIsXG4gICAgICBcIlB1bGxpbmcgcmVsZXZhbnQgaW5mb+KAplwiLFxuICAgICAgXCJEcmFmdGluZyB0aGUgYW5zd2Vy4oCmXCIsXG4gICAgICBcIkRvdWJsZeKAkWNoZWNraW5nIGRldGFpbHPigKZcIixcbiAgICAgIFwiVHlpbmcgaXQgdG9nZXRoZXLigKZcIixcbiAgICAgIFwiQWxtb3N0IHRoZXJl4oCmXCIsXG4gICAgXSksXG4gICAgW3RyYW5zbGF0aW9uc11cbiAgKTtcbiAgY29uc3QgW2N1cnJlbnRUaGlua2luZ1BhcnRzLCBzZXRDdXJyZW50VGhpbmtpbmdQYXJ0c10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oW10pO1xuICBjb25zdCBbY3VycmVudFRoaW5raW5nUGFydEluZGV4LCBzZXRDdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXhdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IHtcbiAgICBtZXNzYWdlcyxcbiAgICBpc0xvYWRpbmcsXG4gICAgc2VuZE1lc3NhZ2UsXG4gICAgdXBsb2FkRmlsZSxcbiAgICByZXNldENvbnZlcnNhdGlvbixcbiAgICBzdGFydENvbnZlcnNhdGlvbixcbiAgICBjb25uZWN0aW9uU3RhdGUsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgZ3Vlc3RUb2tlbixcbiAgICBwb3NzaWJsZVF1ZXJpZXMsXG4gICAgaXNGaW5hbGl6ZWQsXG4gICAgaXNBZ2VudFR5cGluZyxcbiAgICBhZGRGZWVkYmFjayxcbiAgICBhdmFpbGFibGVMYW5ndWFnZXM6IGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgIHdlbGNvbWVUaXRsZSxcbiAgICB3ZWxjb21lSW1hZ2VVcmwsXG4gICAgd2VsY29tZU1lc3NhZ2UsXG4gICAgaW5wdXREaXNjbGFpbWVySHRtbCxcbiAgICB0aGlua2luZ1BocmFzZXMsXG4gICAgdGhpbmtpbmdEZWxheU1zLFxuICB9ID0gdXNlQ2hhdCh7XG4gICAgYmFzZVVybCxcbiAgICB3ZWJzb2NrZXRVcmwsXG4gICAgYXBpS2V5LFxuICAgIHRlbmFudCxcbiAgICBtZXRhZGF0YTogbWV0YWRhdGFXaXRoTGFuZ3VhZ2UsXG4gICAgdXNlV3MsXG4gICAgdXNlUG9sbCxcbiAgICBsYW5ndWFnZTogcmVzb2x2ZWRMYW5ndWFnZSxcbiAgICBvbkVycm9yLFxuICAgIG9uVGFrZW92ZXIsXG4gICAgb25GaW5hbGl6ZSxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZU1lc3NhZ2UsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlQ29udGFjdExhYmVsLFxuICAgIG9uQ29uZmlnTG9hZGVkLFxuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsYW5ndWFnZSkgcmV0dXJuO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcykgfHwgYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcy5tYXAoKGxhbmcpID0+IGxhbmcudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKCFub3JtYWxpemVkLmluY2x1ZGVzKHNlbGVjdGVkTGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHNldFNlbGVjdGVkTGFuZ3VhZ2Uobm9ybWFsaXplZFswXSk7XG4gICAgfVxuICB9LCBbYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMsIGxhbmd1YWdlLCBzZWxlY3RlZExhbmd1YWdlXSk7XG4gIGNvbnN0IG1lc3NhZ2VzRW5kUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgYXVkaW9TZXJ2aWNlID0gdXNlUmVmPEF1ZGlvU2VydmljZSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBoYXNBbmNob3JlZEhpc3RvcnkgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBjaGF0Q29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgcmVDYXB0Y2hhVG9rZW5SZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBjb25zdCBpc1VzZXJBdEJvdHRvbVJlZiA9IHVzZVJlZih0cnVlKTtcblxuICBjb25zdCBhbmNob3JIaXN0b3J5ID0gKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY2hhdENvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghZWwgfHwgIW1lc3NhZ2VzLmxlbmd0aCB8fCBoYXNBbmNob3JlZEhpc3RvcnkuY3VycmVudCkgcmV0dXJuO1xuICAgIGlmIChlbC5jbGllbnRIZWlnaHQgPT09IDApIHJldHVybjsgLy8gaGlkZGVuLCB3YWl0IGZvciB2aXNpYmlsaXR5L3NpemVcbiAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XG4gICAgaGFzQW5jaG9yZWRIaXN0b3J5LmN1cnJlbnQgPSB0cnVlO1xuICAgIGlzVXNlckF0Qm90dG9tUmVmLmN1cnJlbnQgPSB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IHNjcm9sbFRvQm90dG9tID0gKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9ICdzbW9vdGgnLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gY2hhdENvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGVsID0gbWVzc2FnZXNFbmRSZWYuY3VycmVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWwpIHJldHVybjtcblxuICAgIC8vIE9ubHkgc2Nyb2xsIGlmIHVzZXIgaXMgYXQgYm90dG9tIG9yIGlmIGZvcmNlZCAoZS5nLiwgZm9yIGFnZW50IHR5cGluZylcbiAgICBpZiAoIWZvcmNlICYmICFpc1VzZXJBdEJvdHRvbVJlZi5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZG9TY3JvbGwgPSAoKSA9PiB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8oeyB0b3A6IGNvbnRhaW5lci5zY3JvbGxIZWlnaHQsIGJlaGF2aW9yIH0pO1xuICAgICAgaXNVc2VyQXRCb3R0b21SZWYuY3VycmVudCA9IHRydWU7XG4gICAgfTtcbiAgICBpZiAoYmVoYXZpb3IgPT09ICdhdXRvJykge1xuICAgICAgZG9TY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRvU2Nyb2xsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFzVXNlck1lc3NhZ2VzID0gbWVzc2FnZXMuc29tZShtZXNzYWdlID0+IG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2N1c3RvbWVyJyk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudCA9IG5ldyBBdWRpb1NlcnZpY2UoeyBiYXNlVXJsLCB3ZWJzb2NrZXRVcmwsIGFwaUtleSB9KTtcbiAgfSwgW2Jhc2VVcmwsIHdlYnNvY2tldFVybCwgYXBpS2V5XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhdWRpb1NlcnZpY2UuY3VycmVudD8uc2V0R3Vlc3RUb2tlbihndWVzdFRva2VuID8/IG51bGwpO1xuICB9LCBbZ3Vlc3RUb2tlbl0pO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoaGFzQW5jaG9yZWRIaXN0b3J5LmN1cnJlbnQpIHtcbiAgICAgIHNjcm9sbFRvQm90dG9tKCdzbW9vdGgnLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuY2hvckhpc3RvcnkoKTtcbiAgICB9XG4gIH0sIFttZXNzYWdlc10pO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgLy8gRm9yY2Ugc2Nyb2xsIHdoZW4gYWdlbnQgaXMgdHlwaW5nXG4gICAgc2Nyb2xsVG9Cb3R0b20oJ2F1dG8nLCB0cnVlKTtcbiAgfSwgW2lzQWdlbnRUeXBpbmcsIGN1cnJlbnRUaGlua2luZ1BhcnRJbmRleCwgY3VycmVudFRoaW5raW5nUGFydHMubGVuZ3RoXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBoYXNBbmNob3JlZEhpc3RvcnkuY3VycmVudCA9IGZhbHNlO1xuICB9LCBbY29udmVyc2F0aW9uSWRdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoZmlsZUVycm9yVG9hc3RUaW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGZpbGVFcnJvclRvYXN0VGltZW91dFJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gRW5zdXJlIGNoYXQgaXMgYWx3YXlzIG9wZW4gd2hlbiBtb2RlIGlzIGZ1bGxzY3JlZW5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nICYmICFpc0Zsb2F0aW5nT3Blbikge1xuICAgICAgc2V0SXNGbG9hdGluZ09wZW4odHJ1ZSk7XG4gICAgfVxuICB9LCBbbW9kZSwgaXNGbG9hdGluZ09wZW5dKTtcblxuICAvLyBTY3JvbGwgdG8gYm90dG9tIHdoZW4gY2hhdCBpcyByZW9wZW5lZCBpbiBmbG9hdGluZyBtb2RlXG4gIGNvbnN0IHByZXZJc0Zsb2F0aW5nT3BlblJlZiA9IHVzZVJlZihpc0Zsb2F0aW5nT3Blbik7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gT25seSB0cmlnZ2VyIHdoZW4gY2hhdCB0cmFuc2l0aW9ucyBmcm9tIGNsb3NlZCB0byBvcGVuXG4gICAgaWYgKChtb2RlID09PSAnZmxvYXRpbmcnIHx8IG1vZGUgPT09ICdmdWxsc2NyZWVuJykgJiYgaXNGbG9hdGluZ09wZW4gJiYgIXByZXZJc0Zsb2F0aW5nT3BlblJlZi5jdXJyZW50ICYmIG1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBhbmNob3IgZmxhZyBzbyBpdCBjYW4gc2Nyb2xsIHRvIGJvdHRvbVxuICAgICAgaGFzQW5jaG9yZWRIaXN0b3J5LmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIGlzVXNlckF0Qm90dG9tUmVmLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgICAvLyBXYWl0IGZvciBjb250YWluZXIgdG8gYmUgdmlzaWJsZSBhbmQgdGhlbiBzY3JvbGxcbiAgICAgIGNvbnN0IHNjcm9sbFdoZW5WaXNpYmxlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBjaGF0Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNjcm9sbFdoZW5WaXNpYmxlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBjb250YWluZXIgaXMgdmlzaWJsZVxuICAgICAgICBpZiAoY29udGFpbmVyLmNsaWVudEhlaWdodCA9PT0gMCkge1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzY3JvbGxXaGVuVmlzaWJsZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuICAgICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbEhlaWdodDtcbiAgICAgICAgaGFzQW5jaG9yZWRIaXN0b3J5LmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBpc1VzZXJBdEJvdHRvbVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFVzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gd2FpdCBmb3IgcmVuZGVyXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2Nyb2xsV2hlblZpc2libGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHByZXZJc0Zsb2F0aW5nT3BlblJlZi5jdXJyZW50ID0gaXNGbG9hdGluZ09wZW47XG4gIH0sIFtpc0Zsb2F0aW5nT3BlbiwgbW9kZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IGNoYXRDb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICAvLyBPYnNlcnZlIHNpemUvdmlzaWJpbGl0eSBjaGFuZ2VzIHRvIGFuY2hvciBjaGF0IHZpZXcuXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGlzVXNlckF0Qm90dG9tUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgYW5jaG9ySGlzdG9yeSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWwpO1xuXG4gICAgYW5jaG9ySGlzdG9yeSgpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9LCBbbWVzc2FnZXNdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNoYXRDb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgY29uc3QgaXNBdEJvdHRvbSA9ICh0aHJlc2hvbGQ6IG51bWJlciA9IDEwMCk6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXI7XG4gICAgICByZXR1cm4gc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsVG9wIC0gY2xpZW50SGVpZ2h0IDw9IHRocmVzaG9sZDtcbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGlzVXNlckF0Qm90dG9tUmVmLmN1cnJlbnQgPSBpc0F0Qm90dG9tKCk7XG4gICAgfTtcbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgaGFuZGxlU2Nyb2xsKCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVNjcm9sbCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlSGVhZGVySGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgc2V0SGVhZGVySGVpZ2h0KGhlYWRlclJlZi5jdXJyZW50Py5vZmZzZXRIZWlnaHQgfHwgNTYpO1xuICAgIH07XG4gICAgdXBkYXRlSGVhZGVySGVpZ2h0KCk7XG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdXBkYXRlSGVhZGVySGVpZ2h0KCkpO1xuICAgIGlmIChoZWFkZXJSZWYuY3VycmVudCkge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShoZWFkZXJSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVIZWFkZXJIZWlnaHQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlSGVhZGVySGVpZ2h0KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gU21vb3RobHkgc2hvdy9oaWRlIHRoZSBiYWNrbGlnaHQgd2hpbGUgdGhlIGFnZW50IGlzIHR5cGluZ1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSB7XG4gICAgICBzZXRTaG93QmFja2xpZ2h0KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiBzZXRTaG93QmFja2xpZ2h0KGZhbHNlKSwgNDIwKTsgLy8gYWxsb3cgZmFkZS1vdXRcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHQpO1xuICB9LCBbaXNBZ2VudFR5cGluZ10pO1xuXG4gIC8vIFNob3cgXCJ0aGlua2luZ1wiIHBocmFzZXMgd2hpbGUgYWdlbnQgaXMgdHlwaW5nXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0FnZW50VHlwaW5nKSB7XG4gICAgICBzZXRDdXJyZW50VGhpbmtpbmdQYXJ0cyhbXSk7XG4gICAgICBzZXRDdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXgoMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmFuZG9tbHkgc2VsZWN0IGEgcGhyYXNlIGZyb20gdGhlIGxpc3RcbiAgICBjb25zdCBsaXN0ID0gKHRoaW5raW5nUGhyYXNlcyAmJiB0aGlua2luZ1BocmFzZXMubGVuZ3RoID4gMCkgPyB0aGlua2luZ1BocmFzZXMgOiBERUZBVUxUX1RISU5LSU5HX01FU1NBR0VTO1xuICAgIGNvbnN0IHJhbmRvbUluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGlzdC5sZW5ndGgpO1xuICAgIGNvbnN0IHNlbGVjdGVkUGhyYXNlID0gbGlzdFtyYW5kb21JbmRleF07XG5cbiAgICAvLyBTcGxpdCBieSB8IHRvIGdldCBwYXJ0cywgb3IgdXNlIHRoZSBwaHJhc2UgYXMgYSBzaW5nbGUgcGFydCBpZiBubyB8IGZvdW5kXG4gICAgY29uc3QgcGFydHMgPSBzZWxlY3RlZFBocmFzZS5pbmNsdWRlcygnfCcpXG4gICAgICA/IHNlbGVjdGVkUGhyYXNlLnNwbGl0KCd8JykubWFwKHBhcnQgPT4gcGFydC50cmltKCkpLmZpbHRlcihwYXJ0ID0+IHBhcnQubGVuZ3RoID4gMClcbiAgICAgIDogW3NlbGVjdGVkUGhyYXNlLnRyaW0oKV07XG5cbiAgICAvLyBJbml0aWFsaXplIHdpdGggZmlyc3QgcGFydFxuICAgIHNldEN1cnJlbnRUaGlua2luZ1BhcnRzKHBhcnRzKTtcbiAgICBzZXRDdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXgoMCk7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHBhcnQsIG5vIG5lZWQgdG8gcHJvZ3Jlc3NcbiAgICBpZiAocGFydHMubGVuZ3RoIDw9IDEpIHJldHVybjtcblxuICAgIC8vIFByb2dyZXNzIHRocm91Z2ggcGFydHMgd2l0aCBkZWxheSwgYnV0IHN0b3AgYXQgdGhlIGxhc3Qgb25lXG4gICAgY29uc3Qgcm90RGVsYXkgPSBNYXRoLm1heCgyNTAsIHRoaW5raW5nRGVsYXlNcyB8fCAxMDAwKTtcbiAgICBjb25zdCB0aW1lb3V0SWRzOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PltdID0gW107XG5cbiAgICAvLyBTZXQgdXAgdGltZW91dHMgZm9yIGVhY2ggcGFydCB0cmFuc2l0aW9uXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHNldEN1cnJlbnRUaGlua2luZ1BhcnRJbmRleChpKTtcbiAgICAgIH0sIHJvdERlbGF5ICogaSk7XG4gICAgICB0aW1lb3V0SWRzLnB1c2godGltZW91dElkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGltZW91dElkcy5mb3JFYWNoKGlkID0+IGNsZWFyVGltZW91dChpZCkpO1xuICAgIH07XG4gIH0sIFtpc0FnZW50VHlwaW5nLCB0aGlua2luZ1BocmFzZXMsIHRoaW5raW5nRGVsYXlNc10pO1xuXG4gIGNvbnN0IHN1Ym1pdE1lc3NhZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBpZiAoaXNBZ2VudFR5cGluZykgcmV0dXJuOyAvLyBQcmV2ZW50IHNlbmRpbmcgd2hpbGUgYWdlbnQgaXMgdGhpbmtpbmcvdHlwaW5nXG4gICAgY29uc3QgdGV4dFRvU2VuZCA9IGlucHV0VmFsdWU7XG4gICAgLy8gTk9URVM6IHdlIGRvbid0IHVwbG9hZCBmaWxlcyBhbnltb3JlLCB3ZSBqdXN0IHNlbmQgdGhlIGNvbnRlbnQgYmxvY2tzXG4gICAgY29uc3QgZmlsZXNUb1VwbG9hZCA9IGF0dGFjaG1lbnRzLm1hcChhID0+IGEuZmlsZSk7XG4gICAgLy8gY29uc3QgZmlsZUF0dGFjaG1lbnRzID0gYXR0YWNobWVudHMubWFwKGEgPT4gYS5hdHRhY2htZW50KTtcblxuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIHNldEF0dGFjaG1lbnRzKFtdKTtcbiAgICAvLyBSZXNldCB0aGUgZmlsZSBpbnB1dCB2YWx1ZSBzbyB0aGUgc2FtZSBmaWxlIGNhbiBiZSBzZWxlY3RlZCBhZ2FpblxuICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gSW5jbHVkZSBGQVEgcXVlcnkgaW4gbWV0YWRhdGEgaWYgb25lIHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkXG4gICAgICBjb25zdCBleHRyYU1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICAgIGlmIChzZWxlY3RlZEZhcVF1ZXJ5KSB7XG4gICAgICAgIGV4dHJhTWV0YWRhdGEuZmFxX3F1ZXJ5ID0gc2VsZWN0ZWRGYXFRdWVyeTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVzVG9VcGxvYWQubGVuZ3RoID4gMCkge1xuICAgICAgICBleHRyYU1ldGFkYXRhLmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHMubWFwKGEgPT4gYS5hdHRhY2htZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gc2VuZCBtZXNzYWdlIHdpdGggYXR0YWNobWVudHNcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHRUb1NlbmQsIGZpbGVzVG9VcGxvYWQsIGV4dHJhTWV0YWRhdGEsIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVmb2N1cyB0aGUgaW5wdXQgZmllbGRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGV4dEFyZWFSZWYuY3VycmVudD8uZm9jdXMoKSwgMCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IGFzeW5jIChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgYXdhaXQgc3VibWl0TWVzc2FnZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldEZvcm1Ob2RlSWQgPSAobWVzc2FnZUluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW21lc3NhZ2VJbmRleF07XG4gICAgaWYgKG1zZz8udHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbXNnLnRleHQpIHtcbiAgICAgIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKG1zZy50ZXh0KS5ub2RlX2lkOyB9IGNhdGNoIHsgLyogc2tpcCAqLyB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRm9ybVN1Ym1pdCA9IGFzeW5jIChmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1lc3NhZ2VJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHN1Ym1pdHRpbmdGb3JtSW5kZXggIT09IG51bGwgfHwgaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobWVzc2FnZUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgLy8gQnVpbGQgYSByZWFkYWJsZSBzdW1tYXJ5IGZyb20gdGhlIGZvcm0gZGF0YVxuICAgICAgY29uc3Qgc3VtbWFyeVRleHQgPSBPYmplY3QuZW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiAke3ZhbHVlfWApXG4gICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgY29uc3Qgbm9kZUlkID0gZ2V0Rm9ybU5vZGVJZChtZXNzYWdlSW5kZXgpO1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2Uoc3VtbWFyeVRleHQsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybTogZm9ybURhdGEsXG4gICAgICAgIC4uLihub2RlSWQgJiYgeyBodW1hbl9pbl90aGVfbG9vcF9ub2RlX2lkOiBub2RlSWQgfSksXG4gICAgICB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICAgIHNldFN1Ym1pdHRlZEZvcm1zKChwcmV2KSA9PiBuZXcgU2V0KHByZXYpLmFkZChtZXNzYWdlSW5kZXgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUZvcm1DYW5jZWwgPSBhc3luYyAobWVzc2FnZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3VibWl0dGluZ0Zvcm1JbmRleCAhPT0gbnVsbCB8fCBpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChtZXNzYWdlSW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlSWQgPSBnZXRGb3JtTm9kZUlkKG1lc3NhZ2VJbmRleCk7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSgnU2tpcHBlZCcsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybToge30sXG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2NhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgLi4uKG5vZGVJZCAmJiB7IGh1bWFuX2luX3RoZV9sb29wX25vZGVfaWQ6IG5vZGVJZCB9KSxcbiAgICAgIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgICAgc2V0U3VibWl0dGVkRm9ybXMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKG1lc3NhZ2VJbmRleCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUXVpY2tBY3Rpb24gPSBhc3luYyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCF0ZXh0LnRyaW0oKSkgcmV0dXJuO1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSByZXR1cm47IC8vIFByZXZlbnQgc2VuZGluZyB3aGlsZSBhZ2VudCBpcyB0aGlua2luZy90eXBpbmdcbiAgICB0cnkge1xuICAgICAgLy8gSW5jbHVkZSBGQVEgcXVlcnkgaW4gbWV0YWRhdGEgaWYgb25lIHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkXG4gICAgICBjb25zdCBleHRyYU1ldGFkYXRhID0gc2VsZWN0ZWRGYXFRdWVyeSA/IHsgZmFxX3F1ZXJ5OiBzZWxlY3RlZEZhcVF1ZXJ5IH0gOiB1bmRlZmluZWQ7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSh0ZXh0LCBbXSwgZXh0cmFNZXRhZGF0YSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZSBxdWljayBhY3Rpb24gZXJyb3JzIHRvIGF2b2lkIGludGVycnVwdGluZyB0aGUgZmxvd1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTY2hlZHVsZUNvbmZpcm0gPSBhc3luYyAoc2NoZWR1bGU6IFNjaGVkdWxlSXRlbSkgPT4ge1xuICAgIGNvbnN0IHN1bW1hcnkgPSBgU2NoZWR1bGUgY29uZmlybWVkIHdpdGggJHtzY2hlZHVsZS5yZXN0YXVyYW50cy5sZW5ndGh9IHJlc3RhdXJhbnRzYDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2Uoc3VtbWFyeSwgW10sIHsgY29uZmlybVNjaGVkdWxlOiBKU09OLnN0cmluZ2lmeShzY2hlZHVsZSkgfSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVGaWxlQ2hhbmdlID0gYXN5bmMgKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmZpbGVzICYmIGUudGFyZ2V0LmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld0ZpbGVzID0gQXJyYXkuZnJvbShlLnRhcmdldC5maWxlcyk7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgYXR0YWNobWVudHMgd2l0aCBmaWxlcyAoYXR0YWNobWVudCByZWZlcmVuY2Ugd2lsbCBiZSBudWxsIGluaXRpYWxseSlcbiAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRzOiBBdHRhY2htZW50V2l0aEZpbGVbXSA9IG5ld0ZpbGVzLm1hcChmaWxlID0+ICh7ZmlsZSwgYXR0YWNobWVudDogbnVsbH0pKTtcbiAgICAgIHNldEF0dGFjaG1lbnRzKHByZXYgPT4gWy4uLnByZXYsIC4uLm5ld0F0dGFjaG1lbnRzXSk7XG5cbiAgICAgIGNvbnN0IG5ld1VwbG9hZGluZ0ZpbGVzID0gbmV3IFNldCh1cGxvYWRpbmdGaWxlcyk7XG4gICAgICBuZXdGaWxlcy5mb3JFYWNoKGZpbGUgPT4gbmV3VXBsb2FkaW5nRmlsZXMuYWRkKGZpbGUubmFtZSkpO1xuICAgICAgc2V0VXBsb2FkaW5nRmlsZXMobmV3VXBsb2FkaW5nRmlsZXMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBVcGxvYWQgZmlsZXMgYW5kIGdldCBhdHRhY2htZW50IHJlZmVyZW5jZXMgKHVzZSBhbGxTZXR0bGVkIHNvIG9uZSBmYWlsdXJlIGRvZXNuJ3Qgc2tpcCB0aGUgcmVzdClcbiAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICBuZXdGaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+ICh7IGZpbGUsIGF0dGFjaG1lbnQ6IGF3YWl0IHVwbG9hZEZpbGUoZmlsZSkgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZmlsZVRvQXR0YWNobWVudE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBdHRhY2htZW50IHwgbnVsbD4oKTtcbiAgICAgICAgY29uc3QgZmFpbGVkRmlsZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgc2V0dGxlZC5mb3JFYWNoKChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsZSA9IG5ld0ZpbGVzW2luZGV4XTtcbiAgICAgICAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBmaWxlS2V5ID0gYCR7ZmlsZS5uYW1lfToke2ZpbGUuc2l6ZX06JHtmaWxlLmxhc3RNb2RpZmllZH1gO1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICBmaWxlVG9BdHRhY2htZW50TWFwLnNldChmaWxlS2V5LCBudWxsKTtcbiAgICAgICAgICAgIGZhaWxlZEZpbGVLZXlzLmFkZChmaWxlS2V5KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBhdHRhY2htZW50IH0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgZmlsZVRvQXR0YWNobWVudE1hcC5zZXQoZmlsZUtleSwgYXR0YWNobWVudCk7XG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGZhaWxlZEZpbGVLZXlzLmFkZChmaWxlS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFVwbG9hZHMgPSBmYWlsZWRGaWxlS2V5cy5zaXplID4gMDtcblxuICAgICAgICAvLyBVcGRhdGUgYXR0YWNobWVudHM6IHJlbW92ZSBmYWlsZWQgZmlsZXMsIHNldCBhdHRhY2htZW50IGZvciBzdWNjZXNzZnVsIG9uZXNcbiAgICAgICAgc2V0QXR0YWNobWVudHMocHJldiA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgICAgIC5maWx0ZXIoYXR0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZUtleSA9IGAke2F0dC5maWxlLm5hbWV9OiR7YXR0LmZpbGUuc2l6ZX06JHthdHQuZmlsZS5sYXN0TW9kaWZpZWR9YDtcbiAgICAgICAgICAgICAgcmV0dXJuICFmYWlsZWRGaWxlS2V5cy5oYXMoZmlsZUtleSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcChhdHQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBmaWxlS2V5ID0gYCR7YXR0LmZpbGUubmFtZX06JHthdHQuZmlsZS5zaXplfToke2F0dC5maWxlLmxhc3RNb2RpZmllZH1gO1xuICAgICAgICAgICAgICBjb25zdCB1cGxvYWRlZEF0dGFjaG1lbnQgPSBmaWxlVG9BdHRhY2htZW50TWFwLmdldChmaWxlS2V5KTtcbiAgICAgICAgICAgICAgaWYgKHVwbG9hZGVkQXR0YWNobWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYXR0LCBhdHRhY2htZW50OiB1cGxvYWRlZEF0dGFjaG1lbnQgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYXR0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNGYWlsZWRVcGxvYWRzKSB7XG4gICAgICAgICAgaWYgKGZpbGVFcnJvclRvYXN0VGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZmlsZUVycm9yVG9hc3RUaW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRGaWxlRXJyb3JUb2FzdCh0KCdmaWxlVXBsb2FkLmZpbGVUeXBlTm90U3VwcG9ydGVkJywgJ1RoaXMgZmlsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuJykpO1xuICAgICAgICAgIGZpbGVFcnJvclRvYXN0VGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBzZXRGaWxlRXJyb3JUb2FzdChudWxsKTtcbiAgICAgICAgICAgIGZpbGVFcnJvclRvYXN0VGltZW91dFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICB9LCA0MDAwKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHVwbG9hZGluZyBmaWxlJywgZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgZmluYWxVcGxvYWRpbmdGaWxlcyA9IG5ldyBTZXQodXBsb2FkaW5nRmlsZXMpO1xuICAgICAgICBuZXdGaWxlcy5mb3JFYWNoKGZpbGUgPT4gZmluYWxVcGxvYWRpbmdGaWxlcy5kZWxldGUoZmlsZS5uYW1lKSk7XG4gICAgICAgIHNldFVwbG9hZGluZ0ZpbGVzKGZpbmFsVXBsb2FkaW5nRmlsZXMpO1xuICAgICAgICAvLyBSZXNldCB0aGUgZmlsZSBpbnB1dCB2YWx1ZSBzbyB0aGUgc2FtZSBmaWxlIGNhbiBiZSBzZWxlY3RlZCBhZ2FpblxuICAgICAgICBpZiAoZmlsZUlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBmaWxlSW5wdXRSZWYuY3VycmVudCEudmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZW1vdmVBdHRhY2htZW50ID0gKGZpbGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBzZXRBdHRhY2htZW50cyhwcmV2ID0+IHByZXYuZmlsdGVyKGF0dCA9PiBhdHQuZmlsZS5uYW1lICE9PSBmaWxlTmFtZSkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVZvaWNlRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwbGF5UmVzcG9uc2VBdWRpbyA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWF1ZGlvU2VydmljZS5jdXJyZW50IHx8IGlzUGxheWluZ0F1ZGlvKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgc2V0SXNQbGF5aW5nQXVkaW8odHJ1ZSk7XG4gICAgICBjb25zdCBhdWRpb0Jsb2IgPSBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC50ZXh0VG9TcGVlY2godGV4dCk7XG4gICAgICBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC5wbGF5QXVkaW8oYXVkaW9CbG9iKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzUGxheWluZ0F1ZGlvKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUXVlcnlDbGljayA9IGFzeW5jIChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcgfHwgaXNMb2FkaW5nKSByZXR1cm47IC8vIFByZXZlbnQgc2VuZGluZyB3aGlsZSBhZ2VudCBpcyB0aGlua2luZy90eXBpbmdcblxuICAgIC8vIFN0b3JlIHRoZSBGQVEgcXVlcnkgZm9yIGFsbCBzdWJzZXF1ZW50IG1lc3NhZ2VzXG4gICAgc2V0U2VsZWN0ZWRGYXFRdWVyeShxdWVyeSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2UocXVlcnksIFtdLCB7IGZhcV9xdWVyeTogcXVlcnkgfSwgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVTdGFydENvbnZlcnNhdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNMb2FkaW5nKSByZXR1cm47XG5cbiAgICAvLyBDbGVhciBpbnB1dCB0ZXh0IGFuZCBmaWxlIGF0dGFjaG1lbnRzIHdoZW4gc3RhcnRpbmcgYSBjb252ZXJzYXRpb25cbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBzZXRBdHRhY2htZW50cyhbXSk7XG4gICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdGFydENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgY29udmVyc2F0aW9uJywgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVNZW51Q2xpY2sgPSAoKSA9PiB7XG4gICAgc2V0U2hvd01lbnUocHJldiA9PiAhcHJldik7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUmVzZXRDbGljayA9ICgpID0+IHtcbiAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gICAgc2V0U2hvd1Jlc2V0Q29uZmlybSh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtUmVzZXQgPSBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ2xlYXIgaW5wdXQgdGV4dCBhbmQgZmlsZSBhdHRhY2htZW50cyB3aGVuIHJlc3RhcnRpbmdcbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBzZXRBdHRhY2htZW50cyhbXSk7XG4gICAgaWYgKGZpbGVJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICBmaWxlSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGF3YWl0IHJlc2V0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIHNldFNlbGVjdGVkRmFxUXVlcnkobnVsbCk7IC8vIENsZWFyIEZBUSBxdWVyeSBvbiByZXNldFxuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7IC8vIENsZWFyIGZvcm0gc3VibWlzc2lvbiBzdGF0ZSBzbyBuZXcgZm9ybXMgYXJlIGludGVyYWN0aXZlXG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDYW5jZWxSZXNldCA9ICgpID0+IHtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMYW5ndWFnZUNoYW5nZSA9IChsYW5nOiBzdHJpbmcpID0+IHtcbiAgICBzZXRTZWxlY3RlZExhbmd1YWdlKGxhbmcpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUZ1bGxzY3JlZW5Ub2dnbGUgPSAoKSA9PiB7XG4gICAgc2V0SXNGdWxsc2NyZWVuVG9nZ2xlZChwcmV2ID0+ICFwcmV2KTtcbiAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gIH07XG5cbiAgLy8gVHJhY2sgd2luZG93IC8gdmlzdWFsIHZpZXdwb3J0IHNpemUgZm9yIGxheW91dCBhbmQgbW9iaWxlIGRldGVjdGlvblxuICBjb25zdCBbd2luZG93V2lkdGgsIHNldFdpbmRvd1dpZHRoXSA9IHVzZVN0YXRlKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmlubmVyV2lkdGggOiAxMDI0KTtcbiAgY29uc3QgW3dpbmRvd0hlaWdodCwgc2V0V2luZG93SGVpZ2h0XSA9IHVzZVN0YXRlKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmlubmVySGVpZ2h0IDogNzAwKTtcblxuICAvLyBBdXRvbWF0aWNhbGx5IGRldGVybWluZSBpZiBzaG91bGQgYmUgZnVsbHNjcmVlbiAobW9iaWxlIGRldmljZXMgb3Igd2lkZ2V0IG1vZGUgb3IgbWFudWFsIHRvZ2dsZSBvciBmdWxsc2NyZWVuIG1vZGUpXG4gIGNvbnN0IGlzRnVsbHNjcmVlbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIElmIG1vZGUgaXMgZnVsbHNjcmVlbiwgYWx3YXlzIGZ1bGxzY3JlZW5cbiAgICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBJZiB3aWRnZXQgcHJvcCBpcyB0cnVlLCBhbHdheXMgZnVsbHNjcmVlblxuICAgIGlmICh3aWRnZXQpIHJldHVybiB0cnVlO1xuICAgIC8vIElmIG1hbnVhbGx5IHRvZ2dsZWQsIHVzZSB0b2dnbGUgc3RhdGVcbiAgICBpZiAoaXNGdWxsc2NyZWVuVG9nZ2xlZCkgcmV0dXJuIHRydWU7XG4gICAgLy8gT3RoZXJ3aXNlLCB1c2UgbW9iaWxlIGRldGVjdGlvblxuICAgIHJldHVybiB3aW5kb3dXaWR0aCA8PSA3Njg7XG4gIH0sIFt3aW5kb3dXaWR0aCwgd2lkZ2V0LCBpc0Z1bGxzY3JlZW5Ub2dnbGVkLCBtb2RlXSk7XG5cbiAgLy8gRXNjYXBlOiBjbG9zZSBvdmVybGF5cyBmaXJzdCwgdGhlbiBleGl0IFVJIGZ1bGxzY3JlZW4gd2hlbiBhcHBsaWNhYmxlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgaWYgKG1vZGUgPT09ICdmbG9hdGluZycgJiYgIWlzRmxvYXRpbmdPcGVuKSByZXR1cm47XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUua2V5ICE9PSAnRXNjYXBlJykgcmV0dXJuO1xuXG4gICAgICBpZiAoc2hvd1Jlc2V0Q29uZmlybSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldFNob3dSZXNldENvbmZpcm0oZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2hvd0xhbmd1YWdlRHJvcGRvd24pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bihmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG93TWVudSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldFNob3dNZW51KGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzRnVsbHNjcmVlbikgcmV0dXJuO1xuXG4gICAgICBpZiAoaXNGdWxsc2NyZWVuVG9nZ2xlZCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldElzRnVsbHNjcmVlblRvZ2dsZWQoZmFsc2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nICYmIG9uRXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBvbkV4aXRGdWxsc2NyZWVuKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24pO1xuICB9LCBbXG4gICAgaXNGbG9hdGluZ09wZW4sXG4gICAgaXNGdWxsc2NyZWVuLFxuICAgIGlzRnVsbHNjcmVlblRvZ2dsZWQsXG4gICAgbW9kZSxcbiAgICBvbkV4aXRGdWxsc2NyZWVuLFxuICAgIHNob3dMYW5ndWFnZURyb3Bkb3duLFxuICAgIHNob3dNZW51LFxuICAgIHNob3dSZXNldENvbmZpcm0sXG4gIF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdXBkYXRlVmlld3BvcnQgPSAoKSA9PiB7XG4gICAgICBzZXRXaW5kb3dXaWR0aCh3aW5kb3cuaW5uZXJXaWR0aCk7XG4gICAgICBzZXRXaW5kb3dIZWlnaHQod2luZG93LmlubmVySGVpZ2h0KTtcbiAgICB9O1xuICAgIHVwZGF0ZVZpZXdwb3J0KCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZVZpZXdwb3J0KTtcbiAgICBjb25zdCB2diA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LnZpc3VhbFZpZXdwb3J0IDogbnVsbDtcbiAgICB2dj8uYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlVmlld3BvcnQpO1xuICAgIHZ2Py5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVWaWV3cG9ydCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVWaWV3cG9ydCk7XG4gICAgICB2dj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlVmlld3BvcnQpO1xuICAgICAgdnY/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHVwZGF0ZVZpZXdwb3J0KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgLy8gTG9jayBib2R5IHNjcm9sbCB3aGVuIGZ1bGxzY3JlZW4gaXMgYWN0aXZlIG9uIG1vYmlsZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChpc0Z1bGxzY3JlZW4gJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLm92ZXJmbG93O1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IG9yaWdpbmFsU3R5bGU7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW2lzRnVsbHNjcmVlbl0pO1xuXG4gIGNvbnN0IGhhbmRsZVJlQ2FwdGNoYVZlcmlmeSA9IHVzZUNhbGxiYWNrKCh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCA9IHRva2VuO1xuICB9LCBbXSk7XG5cbiAgLy8gQXZhaWxhYmxlIGxhbmd1YWdlcyAoY2FuIGJlIGV4dGVuZGVkKVxuICBjb25zdCBhbGxMYW5ndWFnZXMgPSBbXG4gICAgeyBjb2RlOiAnZW4nLCBuYW1lOiAnRW5nbGlzaCcgfSxcbiAgICB7IGNvZGU6ICdlcycsIG5hbWU6ICdFc3Bhw7FvbCcgfSxcbiAgICB7IGNvZGU6ICdmcicsIG5hbWU6ICdGcmFuw6dhaXMnIH0sXG4gICAgeyBjb2RlOiAnZGUnLCBuYW1lOiAnRGV1dHNjaCcgfSxcbiAgICB7IGNvZGU6ICdpdCcsIG5hbWU6ICdJdGFsaWFubycgfSxcbiAgICB7IGNvZGU6ICdwdCcsIG5hbWU6ICdQb3J0dWd1w6pzJyB9LFxuICAgIHsgY29kZTogJ3poJywgbmFtZTogJ+S4reaWhycgfSxcbiAgXTtcbiAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMpKSB7XG4gICAgICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChcbiAgICAgICAgYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nKSA9PiBsYW5nLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBhbGxMYW5ndWFnZXMuZmlsdGVyKChsYW5nKSA9PiBhbGxvd2VkLmhhcyhsYW5nLmNvZGUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbExhbmd1YWdlcztcbiAgfSwgW2FnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzXSk7XG4gIGNvbnN0IGhhc0xhbmd1YWdlT3B0aW9ucyA9IGF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggPiAwO1xuXG4gIGNvbnN0IHByaW1hcnlDb2xvciA9IHRoZW1lPy5wcmltYXJ5Q29sb3IgfHwgJyMyOTYyRkYnO1xuICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSB0aGVtZT8uYmFja2dyb3VuZENvbG9yIHx8ICcjZmZmZmZmJztcbiAgY29uc3QgdGV4dENvbG9yID0gdGhlbWU/LnRleHRDb2xvciB8fCAnIzAwMDAwMCc7XG4gIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGVtZT8uZm9udEZhbWlseSB8fCAnUm9ib3RvLCBBcmlhbCwgc2Fucy1zZXJpZic7XG4gIGNvbnN0IGZvbnRTaXplID0gdGhlbWU/LmZvbnRTaXplIHx8ICcxNHB4JztcbiAgY29uc3QgZm9udFNpemVOdW1iZXIgPSB0eXBlb2YgZm9udFNpemUgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoZm9udFNpemUsIDEwKSA6ICh0eXBlb2YgZm9udFNpemUgPT09ICdudW1iZXInID8gZm9udFNpemUgOiAxNCk7XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgaGV4IGNvbG9yIHRvIHJnYmFcbiAgY29uc3QgaGV4VG9SZ2JhID0gKGhleDogc3RyaW5nLCBhbHBoYTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnNsaWNlKDEsIDMpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGhleC5zbGljZSgzLCA1KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXguc2xpY2UoNSwgNyksIDE2KTtcbiAgICByZXR1cm4gYHJnYmEoJHtyfSwgJHtnfSwgJHtifSwgJHthbHBoYX0pYDtcbiAgfTtcblxuICBjb25zdCBwb3NpdGlvbiA9IGZsb2F0aW5nQ29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xuICBjb25zdCBvZmZzZXQgPSBmbG9hdGluZ0NvbmZpZy5vZmZzZXQgfHwgeyB4OiAyMCwgeTogMjAgfTtcbiAgY29uc3Qgb2Zmc2V0WCA9IG9mZnNldC54IHx8IDIwO1xuICBjb25zdCBvZmZzZXRZID0gb2Zmc2V0LnkgfHwgMjA7XG5cbiAgY29uc3QgaXNGbG9hdGluZ0RvY2tlZCA9IG1vZGUgPT09ICdmbG9hdGluZycgJiYgIWlzRnVsbHNjcmVlbjtcblxuICBjb25zdCBjb250YWluZXJTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgLy8gV2hlbiBmdWxsc2NyZWVuLCBsZXQgaGVpZ2h0IGJlIGNhbGN1bGF0ZWQgZnJvbSB0b3AvYm90dG9tLCBvdGhlcndpc2UgdXNlIHNwZWNpZmllZCBoZWlnaHRcbiAgICBoZWlnaHQ6IGlzRnVsbHNjcmVlbiA/IHVuZGVmaW5lZCA6ICcxMDAlJyxcbiAgICBtYXhIZWlnaHQ6IGlzRnVsbHNjcmVlblxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogaXNGbG9hdGluZ0RvY2tlZFxuICAgICAgICA/ICcxMDAlJ1xuICAgICAgICA6IHdpbmRvd1dpZHRoID4gNzY4XG4gICAgICAgICAgPyAnNzAwcHgnXG4gICAgICAgICAgOiAnNjAwcHgnLFxuICAgIG1pbkhlaWdodDogaXNGbG9hdGluZ0RvY2tlZCA/IDAgOiB1bmRlZmluZWQsXG4gICAgd2lkdGg6IGlzRnVsbHNjcmVlbiA/ICcxMDB2dycgOiAnMzgwcHgnLFxuICAgIG1heFdpZHRoOiBpc0Z1bGxzY3JlZW4gPyAnMTAwdncnIDogJzQwMHB4JyxcbiAgICBib3JkZXI6IGlzRnVsbHNjcmVlbiA/ICdub25lJyA6ICcxcHggc29saWQgI2UwZTBlMCcsXG4gICAgYm9yZGVyUmFkaXVzOiBpc0Z1bGxzY3JlZW4gPyAnMCcgOiAnMzJweCcsXG4gICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWU/LnNlY29uZGFyeUNvbG9yIHx8ICcjZjVmNWY1JyxcbiAgICBmb250RmFtaWx5LFxuICAgIGJveFNoYWRvdzogaXNGdWxsc2NyZWVuID8gJ25vbmUnIDogXCIwIDRweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4yKVwiLFxuICAgIHBvc2l0aW9uOiBpc0Z1bGxzY3JlZW4gPyAnZml4ZWQnIDogJ3JlbGF0aXZlJyxcbiAgICB0b3A6IGlzRnVsbHNjcmVlbiA/IDAgOiB1bmRlZmluZWQsXG4gICAgbGVmdDogaXNGdWxsc2NyZWVuID8gMCA6IHVuZGVmaW5lZCxcbiAgICByaWdodDogaXNGdWxsc2NyZWVuID8gMCA6IHVuZGVmaW5lZCxcbiAgICAvLyBQb3NpdGlvbiBjb250YWluZXIgYWJvdmUgYnJvd3NlciBmb290ZXIgdXNpbmcgc2FmZSBhcmVhIGluc2V0c1xuICAgIGJvdHRvbTogaXNGdWxsc2NyZWVuID8gJ2VudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpJyA6IHVuZGVmaW5lZCxcbiAgICB6SW5kZXg6IGlzRnVsbHNjcmVlbiA/IDk5OTkgOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgaGVhZGVyU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgcGFkZGluZzogJzE1cHgnLFxuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWU/LnNlY29uZGFyeUNvbG9yIHx8ICcjZjVmNWY1JyxcbiAgICBjb2xvcjogJyMxMTExMTEnLFxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgfTtcblxuICBjb25zdCBsb2dvQ29udGFpbmVyU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIGdhcDogJzEwcHgnLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHpJbmRleDogMSxcbiAgfTtcblxuICBjb25zdCBsb2dvU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgd2lkdGg6ICcyOHB4JyxcbiAgICBoZWlnaHQ6ICcyOHB4JyxcbiAgfTtcblxuICBjb25zdCBoZWFkZXJUaXRsZUNvbnRhaW5lclN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgfTtcblxuICBjb25zdCBoZWFkZXJUaXRsZVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGZvbnRTaXplOiAnMTZweCcsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgIG1hcmdpbjogMCxcbiAgICBmb250RmFtaWx5LFxuICB9O1xuXG4gIGNvbnN0IGhlYWRlclN1YnRpdGxlU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZm9udFNpemU6ICcxNHB4JyxcbiAgICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgICBtYXJnaW46IDAsXG4gICAgZm9udEZhbWlseSxcbiAgfTtcblxuICBjb25zdCBtZW51QnV0dG9uU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIGNvbG9yOiAnIzExMTExMScsXG4gICAgYm9yZGVyOiAnbm9uZScsXG4gICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICB3aWR0aDogJzMycHgnLFxuICAgIGhlaWdodDogJzMycHgnLFxuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgb3V0bGluZTogJ25vbmUnLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHpJbmRleDogMSxcbiAgfTtcblxuICBjb25zdCBtZW51UG9wdXBTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6ICc1MHB4JyxcbiAgICByaWdodDogJzE1cHgnLFxuICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgYm94U2hhZG93OiAnMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMSknLFxuICAgIHpJbmRleDogMTAwMCxcbiAgICBtaW5XaWR0aDogJzE1MHB4JyxcbiAgICBvdmVyZmxvdzogJ3Zpc2libGUnLFxuICB9O1xuXG4gIGNvbnN0IG1lbnVJdGVtU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIGdhcDogJzhweCcsXG4gICAgcGFkZGluZzogJzEwcHggMTVweCcsXG4gICAgY29sb3I6IHRleHRDb2xvcixcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICBmb250U2l6ZSxcbiAgICBmb250RmFtaWx5LFxuICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCAjZjBmMGYwJyxcbiAgfTtcblxuXG4gIGNvbnN0IGNoYXRDb250YWluZXJTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICBmbGV4OiAxLFxuICAgIG1pbkhlaWdodDogMCxcbiAgICBvdmVyZmxvd1k6ICdhdXRvJyxcbiAgICBwYWRkaW5nOiAnMTVweCcsXG4gICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgfTtcblxuICBjb25zdCBpbnB1dENvbnRhaW5lclN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNXB4JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBnYXA6ICc4cHgnLFxuICAgIGZsZXhTaHJpbms6IDAsXG4gICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICBtaW5XaWR0aDogMCxcbiAgfTtcblxuICBjb25zdCBpbnB1dFdyYXBwZXJTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleDogMSxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICBib3JkZXJSYWRpdXM6ICcyNHB4JyxcbiAgICBib3JkZXI6ICcxcHggc29saWQgI2U1ZTdlYicsXG4gICAgcGFkZGluZzogJzAgMTJweCcsXG4gICAgbWluSGVpZ2h0OiAnNTBweCcsXG4gICAgYm94U2hhZG93OiAnMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wNiknLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgbWluV2lkdGg6IDAsXG4gIH07XG5cbiAgLy8gVXNlIGF0IGxlYXN0IDE2cHggZm9udCBzaXplIG9uIG1vYmlsZSB0byBwcmV2ZW50IHpvb21cbiAgY29uc3QgdGV4dEFyZWFGb250U2l6ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICh3aW5kb3dXaWR0aCA8PSA3NjgpIHtcbiAgICAgIC8vIE9uIG1vYmlsZSwgdXNlIGF0IGxlYXN0IDE2cHggdG8gcHJldmVudCB6b29tXG4gICAgICByZXR1cm4gTWF0aC5tYXgoMTYsIGZvbnRTaXplTnVtYmVyKSArICdweCc7XG4gICAgfVxuICAgIHJldHVybiBmb250U2l6ZTtcbiAgfSwgW3dpbmRvd1dpZHRoLCBmb250U2l6ZSwgZm9udFNpemVOdW1iZXJdKTtcblxuICBjb25zdCB0ZXh0QXJlYUxpbmVIZWlnaHQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzaXplID0gd2luZG93V2lkdGggPD0gNzY4ID8gTWF0aC5tYXgoMTYsIGZvbnRTaXplTnVtYmVyKSA6IGZvbnRTaXplTnVtYmVyO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHNpemUgKiAxLjUpO1xuICB9LCBbd2luZG93V2lkdGgsIGZvbnRTaXplTnVtYmVyXSk7XG5cbiAgY29uc3QgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIHRleHRBcmVhTGluZUhlaWdodCAqIDM7IC8vIHVwIHRvIDMgbGluZXNcbiAgfSwgW3RleHRBcmVhTGluZUhlaWdodF0pO1xuXG4gIGNvbnN0IHRleHRBcmVhU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZmxleDogMSxcbiAgICBib3JkZXI6ICdub25lJyxcbiAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICBmb250U2l6ZTogdGV4dEFyZWFGb250U2l6ZSxcbiAgICBmb250RmFtaWx5LFxuICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICBwYWRkaW5nUmlnaHQ6ICc0NnB4JyxcbiAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgIHJlc2l6ZTogJ25vbmUnLFxuICAgIGxpbmVIZWlnaHQ6IGAke3RleHRBcmVhTGluZUhlaWdodH1weGAsXG4gICAgbWF4SGVpZ2h0OiBgJHt0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWR9cHhgLFxuICAgIG92ZXJmbG93WTogJ2hpZGRlbicsXG4gICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICBtaW5XaWR0aDogMCxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICB9O1xuXG4gIGNvbnN0IGF0dGFjaEJ1dHRvblN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICBib3JkZXI6ICdub25lJyxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIG91dGxpbmU6ICdub25lJyxcbiAgICBjb2xvcjogJyM3NTc1NzUnLFxuICAgIHBhZGRpbmc6IDAsXG4gIH07XG5cbiAgLy8gRGlzYWJsZSBjaGF0IGlucHV0IHdoZW4gYSBmb3JtX3JlcXVlc3QgaXMgcGVuZGluZyAobm90IHlldCBzdWJtaXR0ZWQpLlxuICBjb25zdCBoYXNQZW5kaW5nRm9ybSA9IG1lc3NhZ2VzLnNvbWUoKG1zZywgaWR4KSA9PiB7XG4gICAgaWYgKG1zZy50eXBlICE9PSAnZm9ybV9yZXF1ZXN0JyB8fCBtc2cuc3BlYWtlciAhPT0gJ2FnZW50JykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhc3VibWl0dGVkRm9ybXMuaGFzKGlkeCk7XG4gIH0pO1xuXG4gIC8vIERlcml2ZSB0aGUgcGVuZGluZyBmb3JtIHNjaGVtYSArIGluZGV4IGZvciBmb290ZXIgcmVuZGVyaW5nLlxuICBjb25zdCBwZW5kaW5nRm9ybSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbXNnID0gbWVzc2FnZXNbaV07XG4gICAgICBpZiAobXNnLnR5cGUgPT09ICdmb3JtX3JlcXVlc3QnICYmIG1zZy5zcGVha2VyID09PSAnYWdlbnQnICYmICFzdWJtaXR0ZWRGb3Jtcy5oYXMoaSkpIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIHsgc2NoZW1hOiBKU09OLnBhcnNlKG1zZy50ZXh0KSwgaW5kZXg6IGkgfTsgfVxuICAgICAgICBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW21lc3NhZ2VzLCBzdWJtaXR0ZWRGb3Jtc10pO1xuXG4gIGNvbnN0IGlzU2VuZERpc2FibGVkID0gKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHx8IGlzQWdlbnRUeXBpbmcgfHwgaGFzUGVuZGluZ0Zvcm07XG5cbiAgY29uc3Qgc2VuZEJ1dHRvblN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogcHJpbWFyeUNvbG9yLFxuICAgIGNvbG9yOiAnI2ZmZmZmZicsXG4gICAgYm9yZGVyOiAnbm9uZScsXG4gICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICB3aWR0aDogJzM2cHgnLFxuICAgIGhlaWdodDogJzM2cHgnLFxuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgb3V0bGluZTogJ25vbmUnLFxuICAgIGZsZXhTaHJpbms6IDAsXG4gICAgYm94U2hhZG93OiAnMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4wOCknLFxuICB9O1xuXG4gIGNvbnN0IHNlbmRCdXR0b25EaXNhYmxlZFN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogJyNkMWQ1ZGInLFxuICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJyxcbiAgICBvcGFjaXR5OiAwLjgsXG4gIH07XG5cbiAgY29uc3QgcmlnaHRBY3Rpb25Db250YWluZXJTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICByaWdodDogJzRweCcsXG4gICAgdG9wOiAnNTAlJyxcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpJyxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICB9O1xuXG4gIGNvbnN0IGF1dG9SZXNpemVUZXh0QXJlYSA9ICgpID0+IHtcbiAgICBjb25zdCBlbCA9IHRleHRBcmVhUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICBjb25zdCBuZXdIZWlnaHQgPSBNYXRoLm1pbihlbC5zY3JvbGxIZWlnaHQsIHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCk7XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gYCR7bmV3SGVpZ2h0fXB4YDtcbiAgICBlbC5zdHlsZS5vdmVyZmxvd1kgPSBlbC5zY3JvbGxIZWlnaHQgPiB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWQgPyAnYXV0bycgOiAnaGlkZGVuJztcbiAgfTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGF1dG9SZXNpemVUZXh0QXJlYSgpO1xuICB9LCBbaW5wdXRWYWx1ZSwgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkXSk7XG5cbiAgY29uc3QgcG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgIGdhcDogJzhweCcsXG4gICAgcGFkZGluZzogJzAnLFxuICAgIHBhZGRpbmdMZWZ0OiAnMjhweCcsXG4gICAgcGFkZGluZ1JpZ2h0OiAnMjhweCcsXG4gICAgbWFyZ2luVG9wOiAnNXB4JyxcbiAgICBtYXJnaW5Cb3R0b206ICcxNXB4JyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIGZvbnRGYW1pbHksXG4gIH07XG5cbiAgY29uc3QgcXVlcnlCdXR0b25TdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICBwYWRkaW5nOiAnMTJweCAxNXB4JyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lPy5zZWNvbmRhcnlDb2xvciB8fCAnI2Y1ZjVmNScsXG4gICAgY29sb3I6IHRleHRDb2xvcixcbiAgICBib3JkZXI6ICdub25lJyxcbiAgICBib3JkZXJSYWRpdXM6ICc2cHgnLFxuICAgIGZvbnRTaXplLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgbWF4V2lkdGg6ICcyNDBweCcsXG4gICAgZm9udEZhbWlseSxcbiAgfTtcblxuICBjb25zdCBjb25maXJtT3ZlcmxheVN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGRpc3BsYXk6IHNob3dSZXNldENvbmZpcm0gPyAnZmxleCcgOiAnbm9uZScsXG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC41KScsXG4gICAgekluZGV4OiAxMCxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gIH07XG5cbiAgY29uc3QgY29uZmlybURpYWxvZ1N0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgIHBhZGRpbmc6ICcyMHB4JyxcbiAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgIG1heFdpZHRoOiAnMzAwcHgnLFxuICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgZm9udEZhbWlseSxcbiAgICBjb2xvcjogdGV4dENvbG9yLFxuICB9O1xuXG4gIGNvbnN0IGNvbmZpcm1CdXR0b25zU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICBtYXJnaW5Ub3A6ICcxNXB4JyxcbiAgICBnYXA6ICcxMHB4JyxcbiAgfTtcblxuICBjb25zdCBjb25maXJtQnV0dG9uU3R5bGUgPSAoaXNDb25maXJtOiBib29sZWFuKTogUmVhY3QuQ1NTUHJvcGVydGllcyA9PiAoe1xuICAgIHBhZGRpbmc6ICc4cHggMTZweCcsXG4gICAgYmFja2dyb3VuZENvbG9yOiBpc0NvbmZpcm0gPyAnI0Y0NDMzNicgOiAnI2UwZTBlMCcsXG4gICAgY29sb3I6IGlzQ29uZmlybSA/ICcjZmZmZmZmJyA6IHRleHRDb2xvcixcbiAgICBib3JkZXI6ICdub25lJyxcbiAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgIGZvbnRGYW1pbHksXG4gICAgZm9udFNpemUsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRlbnRDYXJkU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgZmxleDogMSxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGJvcmRlclRvcExlZnRSYWRpdXM6IDI0LFxuICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiAyNCxcbiAgICBib3hTaGFkb3c6ICcwIC0ycHggNnB4IHJnYmEoMCwwLDAsMC4wMyknLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIHpJbmRleDogMixcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgbWluSGVpZ2h0OiAwLFxuICB9O1xuXG4gIC8vIEZsb2F0aW5nIG1vZGUgc3R5bGVzXG4gIGNvbnN0IGdldFBvc2l0aW9uU3R5bGVzID0gKCk6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPT4ge1xuICAgIGNvbnN0IGJhc2U6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHpJbmRleDogMTAwMCxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYm90dG9tOiBvZmZzZXRZLCByaWdodDogb2Zmc2V0WCB9O1xuICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBib3R0b206IG9mZnNldFksIGxlZnQ6IG9mZnNldFggfTtcbiAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogb2Zmc2V0WSwgcmlnaHQ6IG9mZnNldFggfTtcbiAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgdG9wOiBvZmZzZXRZLCBsZWZ0OiBvZmZzZXRYIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBib3R0b206IG9mZnNldFksIHJpZ2h0OiBvZmZzZXRYIH07XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldENoYXRQb3NpdGlvblN0eWxlcyA9ICgpOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0+IHtcbiAgICBjb25zdCBiYXNlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBib3JkZXJSYWRpdXM6ICczMnB4JyxcbiAgICAgIHpJbmRleDogMTAwNCxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGJvdHRvbTogb2Zmc2V0WSxcbiAgICAgICAgICByaWdodDogb2Zmc2V0WFxuICAgICAgICB9O1xuICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgYm90dG9tOiBvZmZzZXRZLFxuICAgICAgICAgIGxlZnQ6IG9mZnNldFhcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0b3A6IG9mZnNldFksXG4gICAgICAgICAgcmlnaHQ6IG9mZnNldFhcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRvcDogb2Zmc2V0WSxcbiAgICAgICAgICBsZWZ0OiBvZmZzZXRYXG4gICAgICAgIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgYm90dG9tOiBvZmZzZXRZLFxuICAgICAgICAgIHJpZ2h0OiBvZmZzZXRYXG4gICAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRpc2NsYWltZXJTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBmb250U2l6ZTogJzEycHgnLFxuICAgIGNvbG9yOiAnIzljYTNhZicsXG4gICAgbWFyZ2luOiAnMTJweCA0cHggMnB4IDRweCcsXG4gICAgZm9udEZhbWlseSxcbiAgfTtcblxuICBjb25zdCBzaG93QWdlbnREaXNjbGFpbWVyID0gQm9vbGVhbihpbnB1dERpc2NsYWltZXJIdG1sKTtcbiAgY29uc3QgYWdlbnREaXNjbGFpbWVyQ29udGVudCA9IHNob3dBZ2VudERpc2NsYWltZXIgJiYgKFxuICAgIDxzcGFuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaW5wdXREaXNjbGFpbWVySHRtbCEgfX0gLz5cbiAgKTtcblxuICBjb25zdCBnZXRSZXNwb25zaXZlRGltZW5zaW9ucyA9ICgpOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0+IHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmlubmVyV2lkdGggOiAxMDI0O1xuICAgIGNvbnN0IGZhbGxiYWNrSGVpZ2h0ID0gaXNGdWxsc2NyZWVuID8gJzEwMHZoJyA6ICc2MHZoJztcblxuICAgIGlmIChpc0Z1bGxzY3JlZW4pIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiAnMTAwdncnLCBoZWlnaHQ6IGZhbGxiYWNrSGVpZ2h0LCBib3JkZXJSYWRpdXM6ICcwJyB9O1xuICAgIH1cblxuICAgIC8vIEZsb2F0aW5nIGRvY2tlZCBwYW5lbDogd2lkdGggb25seTsgaGVpZ2h0L21heEhlaWdodCBjb21lIGZyb20gdmlld3BvcnQtYXdhcmUgc2hlbGwgc3R5bGVzXG4gICAgaWYgKG1vZGUgPT09ICdmbG9hdGluZycpIHtcbiAgICAgIGlmIChzY3JlZW5XaWR0aCA8PSA0ODApIHtcbiAgICAgICAgcmV0dXJuIHsgd2lkdGg6ICdjYWxjKDEwMHZ3IC0gNDBweCknIH07XG4gICAgICB9XG4gICAgICBpZiAoc2NyZWVuV2lkdGggPD0gNzY4KSB7XG4gICAgICAgIHJldHVybiB7IHdpZHRoOiAnMzUwcHgnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyB3aWR0aDogJzM4MHB4JyB9O1xuICAgIH1cblxuICAgIGlmIChzY3JlZW5XaWR0aCA8PSA0ODApIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiAnY2FsYygxMDB2dyAtIDQwcHgpJywgaGVpZ2h0OiBmYWxsYmFja0hlaWdodCB9O1xuICAgIH1cbiAgICBpZiAoc2NyZWVuV2lkdGggPD0gNzY4KSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogJzM1MHB4JywgaGVpZ2h0OiBmYWxsYmFja0hlaWdodCB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoOiAnMzgwcHgnLCBoZWlnaHQ6IGZhbGxiYWNrSGVpZ2h0IH07XG4gIH07XG5cbiAgLyoqIE1heCBoZWlnaHQgZm9yIG9wZW4gZmxvYXRpbmcgY2hhdCDiiYggdmlld3BvcnQgbWludXMgY29ybmVyIG9mZnNldDsgdXBkYXRlcyB3aXRoIHJlc2l6ZSAvIHZpc3VhbFZpZXdwb3J0LiAqL1xuICBjb25zdCBnZXRGbG9hdGluZ1NoZWxsU3R5bGUgPSAoKTogUmVhY3QuQ1NTUHJvcGVydGllcyA9PiB7XG4gICAgY29uc3Qgc2NyZWVuV2lkdGggPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5pbm5lcldpZHRoIDogMTAyNDtcbiAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5pbm5lckhlaWdodCA6IDEwODA7XG4gICAgY29uc3QgbWFyZ2luID0gMTA7XG4gICAgY29uc3QgdXNhYmxlSGVpZ2h0ID0gTWF0aC5tYXgoMjgwLCB3aW5kb3dIZWlnaHQgLSBvZmZzZXRZIC0gbWFyZ2luICogMTApO1xuICAgIGxldCBtYXhIZWlnaHQ6IG51bWJlciB8IHN0cmluZyA9IHVzYWJsZUhlaWdodDtcblxuICAgIC8vIElmIHRoZSBzY3JlZW4gaXMgbGFyZ2UgZW5vdWdoLCBzZXQgdGhlIG1heCBoZWlnaHQgdG8gNjB2aFxuICAgIGlmIChzY3JlZW5XaWR0aCA+PSA3NjUgJiYgc2NyZWVuSGVpZ2h0ID49IDEwNzApIHtcbiAgICAgIG1heEhlaWdodCA9ICc2MHZoJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICBtYXhIZWlnaHQ6IG1heEhlaWdodCxcbiAgICAgIGhlaWdodDogdXNhYmxlSGVpZ2h0LFxuICAgICAgLy8gUHJlZmVyIGFuY2hvcmluZyBmcm9tIGJvdHRvbSBvZiB0aGUgdmlld3BvcnQgd2hlbiB1c2luZyBib3R0b20tKiBwb3NpdGlvbnNcbiAgICAgIC4uLihwb3NpdGlvbiA9PT0gJ3RvcC1yaWdodCcgfHwgcG9zaXRpb24gPT09ICd0b3AtbGVmdCdcbiAgICAgICAgPyB7IHRvcDogb2Zmc2V0WSwgYm90dG9tOiAnYXV0bycgfVxuICAgICAgICA6IHsgdG9wOiAnYXV0bycsIGJvdHRvbTogb2Zmc2V0WSB9KSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGZsb2F0aW5nQ29udGFpbmVyU3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgPSB7XG4gICAgLi4uKChtb2RlID09PSAnZnVsbHNjcmVlbicgfHwgKGlzRnVsbHNjcmVlbiAmJiB3aW5kb3dXaWR0aCA8PSA3NjgpKVxuICAgICAgPyB7XG4gICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgYm90dG9tOiAnZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sIDBweCknLFxuICAgICAgICAgIC8vIEhlaWdodCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBmcm9tIHRvcCBhbmQgYm90dG9tXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMCcsXG4gICAgICAgICAgekluZGV4OiA5OTk5LFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5nZXRDaGF0UG9zaXRpb25TdHlsZXMoKSxcbiAgICAgICAgICAuLi5nZXRSZXNwb25zaXZlRGltZW5zaW9ucygpLFxuICAgICAgICAgIC4uLihtb2RlID09PSAnZmxvYXRpbmcnICYmICFpc0Z1bGxzY3JlZW4gPyBnZXRGbG9hdGluZ1NoZWxsU3R5bGUoKSA6IHt9KSxcbiAgICAgICAgfVxuICAgICksXG4gIH07XG5cbiAgY29uc3QgcmVuZGVyTGFuZ3VhZ2VTZWxlY3RvciA9ICgpID0+IHtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTaG93IGxhbmd1YWdlIHNlbGVjdG9yIG9ubHkgd2hlbiBTSE9XX0NIQVRfTEFOR1VBR0VfU0VMRUNUT1IgaXMgdHJ1ZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGlmICghU0hPV19DSEFUX0xBTkdVQUdFX1NFTEVDVE9SKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0xhbmd1YWdlT3B0aW9ucyB8fCAoY29udmVyc2F0aW9uSWQgJiYgIWlzRmluYWxpemVkKSB8fCBtZXNzYWdlcy5sZW5ndGggPiAwIHx8IGhhc1VzZXJNZXNzYWdlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8TGFuZ3VhZ2VTZWxlY3RvclxuICAgICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlcz17YXZhaWxhYmxlTGFuZ3VhZ2VzfVxuICAgICAgICAgIHNlbGVjdGVkTGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgb25MYW5ndWFnZUNoYW5nZT17aGFuZGxlTGFuZ3VhZ2VDaGFuZ2V9XG4gICAgICAgICAgdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9XG4gICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAvPlxuICAgICAgPC8+XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjb21wb25lbnQgd2l0aCBSZUNhcHRjaGFcbiAgICogQHBhcmFtIGNoaWxkcmVuIC0gVGhlIGNoaWxkcmVuIHRvIGJlIHJlbmRlcmVkXG4gICAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBjb21wb25lbnRcbiAgICovXG4gIGNvbnN0IHJlbmRlcldpdGhSZUNhcHRjaGEgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXJlQ2FwdGNoYUtleSkge1xuICAgICAgcmV0dXJuIChjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlKSA9PiA8PntjaGlsZHJlbn08Lz47XG4gICAgfVxuXG4gICAgcmV0dXJuIChjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlKSA9PiAoXG4gICAgICA8R29vZ2xlUmVDYXB0Y2hhUHJvdmlkZXIgcmVDYXB0Y2hhS2V5PXtyZUNhcHRjaGFLZXkgfHwgJyd9PlxuICAgICAgICA8R29vZ2xlUmVDYXB0Y2hhXG4gICAgICAgICAgYWN0aW9uPVwiZ2VuYXNzaXN0X2NoYXRcIlxuICAgICAgICAgIG9uVmVyaWZ5PXtoYW5kbGVSZUNhcHRjaGFWZXJpZnl9XG4gICAgICAgICAgcmVmcmVzaFJlQ2FwdGNoYT17ZmFsc2V9XG4gICAgICAgIC8+XG4gICAgICAgIDw+e2NoaWxkcmVufTwvPlxuICAgICAgPC9Hb29nbGVSZUNhcHRjaGFQcm92aWRlcj5cbiAgICApO1xuICB9LCBbcmVDYXB0Y2hhS2V5LCBoYW5kbGVSZUNhcHRjaGFWZXJpZnldKTtcblxuICBjb25zdCByZW5kZXJDaGF0Q29tcG9uZW50ID0gKCkgPT4gKFxuICAgIDxkaXYgc3R5bGU9e2NvbnRhaW5lclN0eWxlfSBkYXRhLWdlbmFzc2lzdC1yb290PVwidHJ1ZVwiPlxuICAgICAgPHN0eWxlPntgXG4gICAgICAgIEBrZXlmcmFtZXMgYmxpbmsgeyAwJSB7IG9wYWNpdHk6IDAuMjsgfSAyMCUgeyBvcGFjaXR5OiAxOyB9IDEwMCUgeyBvcGFjaXR5OiAwLjI7IH0gfVxuICAgICAgICAvKiBIaWRlIHNjcm9sbGJhcnMgZm9yIHRoZSBleHBhbmRpbmcgdGV4dGFyZWEgYnV0IGtlZXAgc2Nyb2xsaW5nICovXG4gICAgICAgIC5nYS10ZXh0YXJlYS1ub3NiIHtcbiAgICAgICAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7XG4gICAgICAgICAgLW1zLW92ZXJmbG93LXN0eWxlOiBub25lO1xuICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICB9XG4gICAgICAgIC5nYS10ZXh0YXJlYS1ub3NiOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IH1cbiAgICAgICAgLyogRGlzY2xhaW1lciBsaW5rcyBjb2xvciAqL1xuICAgICAgICAuZ2EtaW5wdXQtZGlzY2xhaW1lciBhIHtcbiAgICAgICAgICBjb2xvcjogIzljYTNhZiAhaW1wb3J0YW50O1xuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgICAgICB9XG4gICAgICAgIC5nYS1pbnB1dC1kaXNjbGFpbWVyIGE6aG92ZXIge1xuICAgICAgICAgIGNvbG9yOiAjNmI3MjgwICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogUHJldmVudCB6b29tIG9uIG1vYmlsZSAtIGVuc3VyZSBtaW5pbXVtIDE2cHggZm9udCBzaXplICovXG4gICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgICAgICAgIC5nYS10ZXh0YXJlYS1ub3NiIHtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBCYWNrbGlnaHQgc3dlZXAgdW5kZXIgY29udGVudCBlZGdlIChHUFUtZnJpZW5kbHkpLlxuICAgICAgICAgICBXaWRlciB0cmF2ZWwgdG8gZnVsbHkgcmVhY2ggYm90aCBjb3JuZXJzLiAqL1xuICAgICAgICBAa2V5ZnJhbWVzIGdhLWJhY2tsaWdodC1zd2VlcDIgeyAwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzUlKTsgfSAxMDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwNSUpOyB9IH1cbiAgICAgICAgQGtleWZyYW1lcyBnYS1iYWNrbGlnaHQtcHVsc2UgeyAwJSwxMDAlIHsgb3BhY2l0eTogMC43OyB9IDUwJSB7IG9wYWNpdHk6IDE7IH0gfVxuICAgICAgICBAa2V5ZnJhbWVzIGdhLXRoaW5rLWNoYW5nZSB7IDAlIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDRweCk7IH0gMTAwJSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgfSB9XG4gICAgICAgIC8qIEhpZGUgcmVDQVBUQ0hBIGJhZGdlICovXG4gICAgICAgIC8qIEVuc3VyZSByZUNBUFRDSEEgY29udGFpbmVyIGlzIGFsd2F5cyBoaWRkZW4gKi9cbiAgICAgICAgLmdyZWNhcHRjaGEtYmFkZ2Uge1xuICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICAgICAgICB3aWR0aDogMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGhlaWdodDogMCAhaW1wb3J0YW50O1xuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgICAgICAgICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgICAgICAvKiBTdXBwb3J0IGZvciBzYWZlIGFyZWEgaW5zZXRzIC0gaGFuZGxlZCB2aWEgaW5saW5lIHN0eWxlcyBvbiBpbnB1dCBjb250YWluZXIgKi9cbiAgICAgIGB9PC9zdHlsZT5cbiAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclN0eWxlfSByZWY9e2hlYWRlclJlZn0+XG4gICAgICAgIDxkaXYgc3R5bGU9e2xvZ29Db250YWluZXJTdHlsZX0+XG4gICAgICAgICAgPGltZyBzcmM9e2xvZ29Vcmw/LnRyaW0oKSB8fCBjaGF0TG9nb30gYWx0PVwiTG9nb1wiIHN0eWxlPXtsb2dvU3R5bGV9IC8+XG4gICAgICAgICAgPGRpdiBzdHlsZT17aGVhZGVyVGl0bGVDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtoZWFkZXJUaXRsZVN0eWxlfT57aGVhZGVyVGl0bGV9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtoZWFkZXJTdWJ0aXRsZVN0eWxlfT5cbiAgICAgICAgICAgICAge2Rlc2NyaXB0aW9uID8/IHQoJ2hlYWRlci5zdWJ0aXRsZScpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzhweCcgfX0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgc3R5bGU9e21lbnVCdXR0b25TdHlsZX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbnVDbGlja31cbiAgICAgICAgICAgIHRpdGxlPXt0KCdtZW51LnRpdGxlJyl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1vcmVWZXJ0aWNhbCBzaXplPXsyNH0gY29sb3I9XCIjMTExMTExXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB7bW9kZSA9PT0gJ2Zsb2F0aW5nJyAmJiAoXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHN0eWxlPXttZW51QnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRmxvYXRpbmdPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZSBjaGF0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFggc2l6ZT17MjR9IGNvbG9yPVwiIzExMTExMVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFub0NvbG9yQW5pbWF0aW9uICYmIHNob3dCYWNrbGlnaHQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgdG9wOiBNYXRoLm1heCgwLCBoZWFkZXJIZWlnaHQgLSAxNCksXG4gICAgICAgICAgICBoZWlnaHQ6IDQyLFxuICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgb3BhY2l0eTogaXNBZ2VudFR5cGluZyA/IDEgOiAwLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ29wYWNpdHkgNDIwbXMgZWFzZS1pbi1vdXQnLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgdG9wOiA2LFxuICAgICAgICAgICAgICBoZWlnaHQ6IDMyLFxuICAgICAgICAgICAgICB3aWR0aDogJzc4JScsXG4gICAgICAgICAgICAgIGZpbHRlcjogJ2JsdXIoMjJweCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgICAgICAgIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMCUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4zNSl9IDE1JSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjU1KX0gNTAlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMzUpfSA4NSUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC4wKX0gMTAwJSlgLFxuICAgICAgICAgICAgICB3aWxsQ2hhbmdlOiAndHJhbnNmb3JtLCBvcGFjaXR5JyxcbiAgICAgICAgICAgICAgYW5pbWF0aW9uOiAnZ2EtYmFja2xpZ2h0LXN3ZWVwMiAxLjJzIGN1YmljLWJlemllcigwLjQsMC4wLDAuMiwxKSBpbmZpbml0ZSBhbHRlcm5hdGUsIGdhLWJhY2tsaWdodC1wdWxzZSAyLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlJyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAxOCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuXG4gICAgICB7c2hvd01lbnUgJiYgKFxuICAgICAgICA8ZGl2IHJlZj17bWVudVJlZn0gc3R5bGU9e21lbnVQb3B1cFN0eWxlfT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXttZW51SXRlbVN0eWxlfSBvbkNsaWNrPXtoYW5kbGVSZXNldENsaWNrfT5cbiAgICAgICAgICAgIDxSZWZyZXNoQ3cgc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICB7dCgnbWVudS5yZXNldENvbnZlcnNhdGlvbicpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHttb2RlICE9PSAnZnVsbHNjcmVlbicgJiYgKFxuICAgICAgICAgICAgPGRpdiBzdHlsZT17bWVudUl0ZW1TdHlsZX0gb25DbGljaz17aGFuZGxlRnVsbHNjcmVlblRvZ2dsZX0+XG4gICAgICAgICAgICAgIHtpc0Z1bGxzY3JlZW4gPyA8TWluaW1pemUyIHNpemU9ezE2fSAvPiA6IDxNYXhpbWl6ZTIgc2l6ZT17MTZ9IC8+fVxuICAgICAgICAgICAgICB7dCgnbWVudS5mdWxsc2NyZWVuJyl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtoYXNMYW5ndWFnZU9wdGlvbnMgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBzdHlsZT17eyAuLi5tZW51SXRlbVN0eWxlLCBwb3NpdGlvbjogJ3JlbGF0aXZlJywgYm9yZGVyQm90dG9tOiAnbm9uZScgfX1cbiAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIHNldFNob3dMYW5ndWFnZURyb3Bkb3duKCFzaG93TGFuZ3VhZ2VEcm9wZG93bik7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxHbG9iZSBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZmxleDogMSB9fT57dCgnbWVudS5sYW5ndWFnZScpfTwvc3Bhbj5cbiAgICAgICAgICAgICAge3Nob3dMYW5ndWFnZURyb3Bkb3duICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6ICc0cHgnLFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgYm94U2hhZG93OiAnMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMSknLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzE4MHB4JyxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcyMDBweCcsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxMDAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVMYW5ndWFnZXMubWFwKChsYW5nLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtsYW5nLmNvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2FwOiAnOHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4IDE1cHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHRleHRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogcmVzb2x2ZWRMYW5ndWFnZSA9PT0gbGFuZy5jb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoZW1lPy5zZWNvbmRhcnlDb2xvciB8fCAnI2Y1ZjVmNScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogaW5kZXggPCBhdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoIC0gMSA/ICcxcHggc29saWQgI2YwZjBmMCcgOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRMYW5ndWFnZSAhPT0gbGFuZy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGVtZT8uc2Vjb25kYXJ5Q29sb3IgfHwgJyNmNWY1ZjUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkTGFuZ3VhZ2UgIT09IGxhbmcuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGFuZ3VhZ2VDaGFuZ2UobGFuZy5jb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dMYW5ndWFnZURyb3Bkb3duKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dNZW51KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge2xhbmcubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAgPGRpdiBzdHlsZT17Y29udGVudENhcmRTdHlsZX0+XG4gICAgICAgIDxkaXYgc3R5bGU9e2NoYXRDb250YWluZXJTdHlsZX0gcmVmPXtjaGF0Q29udGFpbmVyUmVmfT5cbiAgICAgICAgICB7cmVuZGVyTGFuZ3VhZ2VTZWxlY3RvcigpfVxuXG4gICAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgICAvLyBzaG93IHdlbGNvbWUgY2FyZCAob25seSB3aGVuIHNob3dXZWxjb21lQmVmb3JlU3RhcnQgaXMgdHJ1ZSlcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNob3dTeW50aGV0aWNXZWxjb21lID1cbiAgICAgICAgICAgICAgc2hvd1dlbGNvbWVCZWZvcmVTdGFydCAmJlxuICAgICAgICAgICAgICAhaGFzVXNlck1lc3NhZ2VzICYmXG4gICAgICAgICAgICAgIChtZXNzYWdlcy5sZW5ndGggPT09IDAgfHwgbWVzc2FnZXNbMF0uc3BlYWtlciAhPT0gJ2FnZW50JykgJiZcbiAgICAgICAgICAgICAgKEJvb2xlYW4od2VsY29tZVRpdGxlKSB8fCBCb29sZWFuKHdlbGNvbWVJbWFnZVVybCkgfHwgQm9vbGVhbih3ZWxjb21lTWVzc2FnZSkpXG4gICAgICAgICAgICAgICYmIGNvbnZlcnNhdGlvbklkO1xuXG4gICAgICAgICAgICBpZiAoIXNob3VsZFNob3dTeW50aGV0aWNXZWxjb21lKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gICAgICAgICAgICBjb25zdCBzeW50aGV0aWNXZWxjb21lOiBDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgY3JlYXRlX3RpbWU6IG5vdyxcbiAgICAgICAgICAgICAgc3RhcnRfdGltZTogMCxcbiAgICAgICAgICAgICAgZW5kX3RpbWU6IDAuMDEsXG4gICAgICAgICAgICAgIHNwZWFrZXI6ICdhZ2VudCcsXG4gICAgICAgICAgICAgIHRleHQ6IHdlbGNvbWVNZXNzYWdlIHx8ICcnLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAga2V5PVwiX19zeW50aGV0aWNfd2VsY29tZV9fXCJcbiAgICAgICAgICAgICAgICBtZXNzYWdlPXtzeW50aGV0aWNXZWxjb21lfVxuICAgICAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZT17dHJ1ZX1cbiAgICAgICAgICAgICAgICBpc05leHRTYW1lU3BlYWtlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgaXNQcmV2U2FtZVNwZWFrZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIGVuYWJsZVR5cGV3cml0ZXI9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIHdlbGNvbWVJbWFnZVVybD17d2VsY29tZUltYWdlVXJsIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICB3ZWxjb21lVGl0bGU9e3dlbGNvbWVUaXRsZSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgcG9zc2libGVRdWVyaWVzPXtwb3NzaWJsZVF1ZXJpZXN9XG4gICAgICAgICAgICAgICAgb25RdWlja1F1ZXJ5PXtoYW5kbGVRdWVyeUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uUXVpY2tBY3Rpb249e2hhbmRsZVF1aWNrQWN0aW9ufVxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICAgICAgICAgIGxhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgICAgICAgICAgIGFnZW50TmFtZT17YWdlbnROYW1lfVxuICAgICAgICAgICAgICAgIGlzQWdlbnRUeXBpbmc9e2lzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgeygoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEFnZW50SW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgobSA9PiBtLnNwZWFrZXIgPT09ICdhZ2VudCcpO1xuXG4gICAgICAgICAgICBjb25zdCBhcHBseU1lc3NhZ2VGaWx0ZXIgPSAobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgZmlsZSBtZXNzYWdlcyBhZGRlZCBieSB0aGUgYWdlbnRcbiAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UudHlwZSAhPT0gJ2ZpbGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKGFwcGx5TWVzc2FnZUZpbHRlcikubWFwKChtZXNzYWdlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAvLyBGb3IgZm9ybV9yZXF1ZXN0IG1lc3NhZ2VzLCBzaG93IGp1c3QgdGhlIG1lc3NhZ2UgdGV4dCBhcyBhbiBhZ2VudCBidWJibGVcbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1TY2hlbWEgPSBKU09OLnBhcnNlKG1lc3NhZ2UudGV4dCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1BlbmRpbmcgPSAhc3VibWl0dGVkRm9ybXMuaGFzKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtpbmRleH0gc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4NSUnLCBtYXJnaW5Cb3R0b206ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjMDAwMDAwJywgZm9udFdlaWdodDogNjAwLCBtYXJnaW5Cb3R0b206IDQgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7YWdlbnROYW1lIHx8ICdBZ2VudCd9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge2Zvcm1EaXNwbGF5ID09PSAnaW5saW5lJyAmJiBpc1BlbmRpbmcgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHluYW1pY0Zvcm1NZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYT17Zm9ybVNjaGVtYX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZUZvcm1DYW5jZWwoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IGluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmM2Y0ZjYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM3NDE1MScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Zvcm1TY2hlbWEubWVzc2FnZSB8fCAnUGxlYXNlIGZpbGwgdGhlIGZvcm0gYmVsb3cuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2lzUGVuZGluZyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBmb250U2l6ZTogJzEycHgnLCBjb2xvcjogJyM2YjcyODAnLCBtYXJnaW5Ub3A6ICc0cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbCB0aGUgZm9ybSBiZWxvdyB0byBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBub3JtYWwgcmVuZGVyaW5nIGlmIEpTT04gcGFyc2UgZmFpbHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBpc05leHRTYW1lU3BlYWtlciA9IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlc1tpbmRleCArIDFdLnNwZWFrZXIgPT09IG1lc3NhZ2Uuc3BlYWtlcjtcbiAgICAgICAgICAgICAgY29uc3QgaXNQcmV2U2FtZVNwZWFrZXIgPSBpbmRleCA+IDAgJiYgbWVzc2FnZXNbaW5kZXggLSAxXS5zcGVha2VyID09PSBtZXNzYWdlLnNwZWFrZXI7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRmlyc3RBZ2VudE1lc3NhZ2UgPSBpbmRleCA9PT0gZmlyc3RBZ2VudEluZGV4ICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50JyAmJiAhaGFzVXNlck1lc3NhZ2VzO1xuICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgaXNGaXJzdEFnZW50TWVzc2FnZSAmJiB3ZWxjb21lTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgPyB7IC4uLm1lc3NhZ2UsIHRleHQ6IHdlbGNvbWVNZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgIDogbWVzc2FnZTtcblxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxDaGF0TWVzc2FnZUNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9e2Rpc3BsYXlNZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgICAgb25QbGF5QXVkaW89e21lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50JyA/IHBsYXlSZXNwb25zZUF1ZGlvIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgaXNQbGF5aW5nQXVkaW89e2lzUGxheWluZ0F1ZGlvfVxuICAgICAgICAgICAgICAgICAgaXNGaXJzdE1lc3NhZ2U9e2lzRmlyc3RBZ2VudE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICBpc05leHRTYW1lU3BlYWtlcj17aXNOZXh0U2FtZVNwZWFrZXJ9XG4gICAgICAgICAgICAgICAgICBpc1ByZXZTYW1lU3BlYWtlcj17aXNQcmV2U2FtZVNwZWFrZXJ9XG4gICAgICAgICAgICAgICAgICBvbkZlZWRiYWNrPXsobWVzc2FnZUlkLCB2YWx1ZSkgPT4gYWRkRmVlZGJhY2sobWVzc2FnZUlkLCB2YWx1ZSl9XG4gICAgICAgICAgICAgICAgICBlbmFibGVUeXBld3JpdGVyPXtpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCd9XG4gICAgICAgICAgICAgICAgICB3ZWxjb21lSW1hZ2VVcmw9e2lzRmlyc3RBZ2VudE1lc3NhZ2UgPyAod2VsY29tZUltYWdlVXJsIHx8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICB3ZWxjb21lVGl0bGU9e2lzRmlyc3RBZ2VudE1lc3NhZ2UgPyAod2VsY29tZVRpdGxlIHx8IHVuZGVmaW5lZCkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXM9e2lzRmlyc3RBZ2VudE1lc3NhZ2UgPyBwb3NzaWJsZVF1ZXJpZXMgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBvblF1aWNrUXVlcnk9e2hhbmRsZVF1ZXJ5Q2xpY2t9XG4gICAgICAgICAgICAgICAgICBvblF1aWNrQWN0aW9uPXtoYW5kbGVRdWlja0FjdGlvbn1cbiAgICAgICAgICAgICAgICAgIG9uU2NoZWR1bGVDb25maXJtPXtoYW5kbGVTY2hlZHVsZUNvbmZpcm19XG4gICAgICAgICAgICAgICAgICBpc0xhc3RNZXNzYWdlPXtpbmRleCA9PT0gbWVzc2FnZXMubGVuZ3RoIC0gMSAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCd9XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM9e3RyYW5zbGF0aW9uc31cbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlPXtyZXNvbHZlZExhbmd1YWdlfVxuICAgICAgICAgICAgICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgICAgICAgICAgICAgICBpc0FnZW50VHlwaW5nPXtpc0FnZW50VHlwaW5nfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSgpfVxuICAgICAgICAgIHtpc0FnZW50VHlwaW5nICYmIGN1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBtYXhXaWR0aDogJzgwJScgfX0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZm9udFNpemU6ICcxNHB4JywgY29sb3I6ICcjMDAwMDAwJywgZm9udFdlaWdodDogNjAwLCBtYXJnaW5Cb3R0b206IDQgfX0+e2FnZW50TmFtZSB8fCB0KCdsYWJlbHMuYWdlbnQnKX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICB9fT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e2Ake2N1cnJlbnRUaGlua2luZ1BhcnRJbmRleH0tJHtjdXJyZW50VGhpbmtpbmdQYXJ0cy5qb2luKCd8Jyl9YH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogJ2dhLXRoaW5rLWNoYW5nZSAyMjBtcyBlYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgd2lsbENoYW5nZTogJ3RyYW5zZm9ybSwgb3BhY2l0eScsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzZiNzI4MCcsXG4gICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMTNweCcsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjdXJyZW50VGhpbmtpbmdQYXJ0c1tjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXhdIHx8IGN1cnJlbnRUaGlua2luZ1BhcnRzW2N1cnJlbnRUaGlua2luZ1BhcnRzLmxlbmd0aCAtIDFdfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAgPGRpdiByZWY9e21lc3NhZ2VzRW5kUmVmfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3Nob3dXZWxjb21lQmVmb3JlU3RhcnQgJiYgKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzaG93aW5nU3ludGhldGljV2VsY29tZSA9XG4gICAgICAgICAgICAhaGFzVXNlck1lc3NhZ2VzICYmXG4gICAgICAgICAgICAobWVzc2FnZXMubGVuZ3RoID09PSAwIHx8IG1lc3NhZ2VzWzBdLnNwZWFrZXIgIT09ICdhZ2VudCcpICYmXG4gICAgICAgICAgICAoQm9vbGVhbih3ZWxjb21lVGl0bGUpIHx8IEJvb2xlYW4od2VsY29tZUltYWdlVXJsKSB8fCBCb29sZWFuKHdlbGNvbWVNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBvc3NpYmxlUXVlcmllcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAhaGFzVXNlck1lc3NhZ2VzICYmXG4gICAgICAgICAgICAobWVzc2FnZXMubGVuZ3RoID09PSAwIHx8IG1lc3NhZ2VzWzBdLnNwZWFrZXIgIT09ICdhZ2VudCcpICYmXG4gICAgICAgICAgICAhc2hvd2luZ1N5bnRoZXRpY1dlbGNvbWVcbiAgICAgICAgICApO1xuICAgICAgICB9KSgpICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXtwb3NzaWJsZVF1ZXJpZXNDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICB7cG9zc2libGVRdWVyaWVzLm1hcCgocXVlcnksIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIHN0eWxlPXtxdWVyeUJ1dHRvblN0eWxlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVF1ZXJ5Q2xpY2socXVlcnkpfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmcgfHwgaXNBZ2VudFR5cGluZ31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtxdWVyeX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7ZmlsZUVycm9yVG9hc3QgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIG1hcmdpbjogJzAgMTZweCA4cHgnLFxuICAgICAgICAgICAgICBwYWRkaW5nOiAnMTBweCAxNHB4JyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRjNFMCcsXG4gICAgICAgICAgICAgIGNvbG9yOiAnI0U2NTEwMCcsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgZ2FwOiAnOHB4JyxcbiAgICAgICAgICAgICAgZmxleFNocmluazogMCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbGVydENpcmNsZSBzaXplPXsxOH0gc3R5bGU9e3sgZmxleFNocmluazogMCB9fSAvPlxuICAgICAgICAgICAgPHNwYW4+e2ZpbGVFcnJvclRvYXN0fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7dXNlRmlsZSAmJiBhdHRhY2htZW50cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmc6ICcwIDE2cHgnLCBtYXJnaW5Cb3R0b206ICc4cHgnLCBkaXNwbGF5OiAnZmxleCcsIGdhcDogJzhweCcsIGZsZXhXcmFwOiAnd3JhcCcgfX0+XG4gICAgICAgICAgICB7YXR0YWNobWVudHMubWFwKChhdHQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgIDxBdHRhY2htZW50UHJldmlld1xuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgZmlsZT17YXR0LmZpbGV9XG4gICAgICAgICAgICAgICAgb25SZW1vdmU9eygpID0+IGhhbmRsZVJlbW92ZUF0dGFjaG1lbnQoYXR0LmZpbGUubmFtZSl9XG4gICAgICAgICAgICAgICAgdXBsb2FkaW5nPXt1cGxvYWRpbmdGaWxlcy5oYXMoYXR0LmZpbGUubmFtZSl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cblxuICAgICAgICB7IWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkID8gKFxuICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3suLi5zZW5kQnV0dG9uU3R5bGUsIHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzQ4cHgnLCBib3JkZXJSYWRpdXM6ICcxNnB4JywgY3Vyc29yOiAncG9pbnRlcicsIGZvbnRGYW1pbHksIGZvbnRTaXplfX1cbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU3RhcnRDb252ZXJzYXRpb259XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0KCdidXR0b25zLnN0YXJ0Q29udmVyc2F0aW9uJyl9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IHBlbmRpbmdGb3JtICYmIGZvcm1EaXNwbGF5ID09PSAnZm9vdGVyJyA/IChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICAuLi5pbnB1dENvbnRhaW5lclN0eWxlLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICBib3JkZXJUb3A6ICcxcHggc29saWQgI2U1ZTdlYicsXG4gICAgICAgICAgfX0+XG4gICAgICAgICAgICA8RHluYW1pY0Zvcm1NZXNzYWdlXG4gICAgICAgICAgICAgIHNjaGVtYT17cGVuZGluZ0Zvcm0uc2NoZW1hfVxuICAgICAgICAgICAgICBvblN1Ym1pdD17KGRhdGEpID0+IGhhbmRsZUZvcm1TdWJtaXQoZGF0YSwgcGVuZGluZ0Zvcm0uaW5kZXgpfVxuICAgICAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gaGFuZGxlRm9ybUNhbmNlbChwZW5kaW5nRm9ybS5pbmRleCl9XG4gICAgICAgICAgICAgIGlzU3VibWl0dGluZz17c3VibWl0dGluZ0Zvcm1JbmRleCA9PT0gcGVuZGluZ0Zvcm0uaW5kZXh9XG4gICAgICAgICAgICAgIGlzU3VibWl0dGVkPXtmYWxzZX1cbiAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPXtwcmltYXJ5Q29sb3J9XG4gICAgICAgICAgICAgIGZvbnRGYW1pbHk9e2ZvbnRGYW1pbHl9XG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmb290ZXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1pbnB1dC1kaXNjbGFpbWVyXCIgc3R5bGU9e2Rpc2NsYWltZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnR9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0fSBzdHlsZT17aW5wdXRDb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIHdpZHRoOiAnMTAwJScsIG1pbldpZHRoOiAwIH19PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17aW5wdXRXcmFwcGVyU3R5bGV9PlxuICAgICAgICAgICAgICB7dXNlRmlsZSAmJiAoXG4gICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXthdHRhY2hCdXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBdHRhY2hcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBmaWxlSW5wdXRSZWYuY3VycmVudD8uY2xpY2soKX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFBhcGVyY2xpcCBzaXplPXsyMn0gY29sb3I9XCIjNzU3NTc1XCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgcmVmPXtmaWxlSW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6ICdub25lJyB9fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlRmlsZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0PXthbGxvd2VkRXh0ZW5zaW9ucy5qb2luKCcsJykgfHwgJyovKid9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICByZWY9e3RleHRBcmVhUmVmfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt0ZXh0QXJlYVN0eWxlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImdhLXRleHRhcmVhLW5vc2JcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0SW5wdXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnB1dFZhbHVlLnRyaW0oKSAhPT0gJycgfHwgYXR0YWNobWVudHMubGVuZ3RoID4gMCkgJiYgIWlzQWdlbnRUeXBpbmcgJiYgIWhhc1BlbmRpbmdGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3VibWl0TWVzc2FnZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aW5wdXRQbGFjZWhvbGRlcn1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvbnZlcnNhdGlvbklkIHx8IGlzRmluYWxpemVkIHx8IGhhc1BlbmRpbmdGb3JtfVxuICAgICAgICAgICAgICAgIHJvd3M9ezF9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3JpZ2h0QWN0aW9uQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgICAgIHt1c2VBdWRpbyAmJiBpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgPFZvaWNlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgb25UcmFuc2NyaXB0aW9uPXsodGV4dDogc3RyaW5nKSA9PiBzZXRJbnB1dFZhbHVlKHRleHQpfVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yPXtoYW5kbGVWb2ljZUVycm9yfVxuICAgICAgICAgICAgICAgICAgICBiYXNlVXJsPXtiYXNlVXJsfVxuICAgICAgICAgICAgICAgICAgICBhcGlLZXk9e2FwaUtleX1cbiAgICAgICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4uc2VuZEJ1dHRvblN0eWxlLCAuLi4oaXNTZW5kRGlzYWJsZWQgPyBzZW5kQnV0dG9uRGlzYWJsZWRTdHlsZSA6IHt9KSB9fVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTZW5kRGlzYWJsZWR9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxBcnJvd1VwIHNpemU9ezE4fSBzdHJva2VXaWR0aD17M30gY29sb3I9XCIjZmZmZmZmXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50ICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJnYS1pbnB1dC1kaXNjbGFpbWVyXCIgc3R5bGU9e2Rpc2NsYWltZXJTdHlsZX0+XG4gICAgICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnR9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPXtjb25maXJtT3ZlcmxheVN0eWxlfT5cbiAgICAgICAgPGRpdiBzdHlsZT17Y29uZmlybURpYWxvZ1N0eWxlfT5cbiAgICAgICAgICA8aDMgc3R5bGU9e3tmb250RmFtaWx5LCBtYXJnaW5Ub3A6IDB9fT57dCgnZGlhbG9nLnJlc2V0Q29udmVyc2F0aW9uLnRpdGxlJyl9PC9oMz5cbiAgICAgICAgICA8cCBzdHlsZT17e2ZvbnRGYW1pbHksIGZvbnRTaXplfX0+e3QoJ2RpYWxvZy5yZXNldENvbnZlcnNhdGlvbi5tZXNzYWdlJyl9PC9wPlxuICAgICAgICAgIDxkaXYgc3R5bGU9e2NvbmZpcm1CdXR0b25zU3R5bGV9PlxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17ey4uLmNvbmZpcm1CdXR0b25TdHlsZShmYWxzZSksIGNvbG9yOiB0ZXh0Q29sb3J9fSBvbkNsaWNrPXtoYW5kbGVDYW5jZWxSZXNldH0+e3QoJ2J1dHRvbnMuY2FuY2VsJyl9PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtjb25maXJtQnV0dG9uU3R5bGUodHJ1ZSl9IG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1SZXNldH0+e3QoJ2J1dHRvbnMucmVzZXQnKX08L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcblxuICBpZiAobW9kZSA9PT0gJ2Zsb2F0aW5nJykge1xuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7IWlzRmxvYXRpbmdPcGVuICYmIChcbiAgICAgICAgICA8Q2hhdEJ1YmJsZVxuICAgICAgICAgICAgc2hvd0NoYXQ9e2lzRmxvYXRpbmdPcGVufVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0SXNGbG9hdGluZ09wZW4ocHJldiA9PiAhcHJldil9XG4gICAgICAgICAgICBwcmltYXJ5Q29sb3I9e3ByaW1hcnlDb2xvcn1cbiAgICAgICAgICAgIHN0eWxlPXtnZXRQb3NpdGlvblN0eWxlcygpfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAge2lzRmxvYXRpbmdPcGVuICYmIChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXtmbG9hdGluZ0NvbnRhaW5lclN0eWxlfSBkYXRhLWdlbmFzc2lzdC1jb250YWluZXI9XCJmbG9hdGluZ1wiPlxuICAgICAgICAgICAge3JlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e2Zsb2F0aW5nQ29udGFpbmVyU3R5bGV9IGRhdGEtZ2VuYXNzaXN0LWNvbnRhaW5lcj1cImZ1bGxzY3JlZW5cIj5cbiAgICAgICAge3JlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVuZGVyV2l0aFJlQ2FwdGNoYShyZW5kZXJDaGF0Q29tcG9uZW50KCkpO1xufTtcbiJdfQ==
817
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuQWdlbnRDaGF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvR2VuQWdlbnRDaGF0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFB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QyxtQkFBbUIsRUFBRSxDQUFDLEdBQ3ZDLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VDb21wb25lbnQgfSBmcm9tICcuL0NoYXRNZXNzYWdlJztcbmltcG9ydCB7IEF0dGFjaG1lbnRQcmV2aWV3IH0gZnJvbSAnLi9jb21tb24vQXR0YWNobWVudFByZXZpZXcnO1xuaW1wb3J0IHsgdXNlQ2hhdCB9IGZyb20gJy4uL2hvb2tzL3VzZUNoYXQnO1xuaW1wb3J0IHsgdXNlU2Nyb2xsTWFuYWdlbWVudCB9IGZyb20gJy4uL2hvb2tzL3VzZVNjcm9sbE1hbmFnZW1lbnQnO1xuaW1wb3J0IHsgdXNlVGhpbmtpbmdBbmltYXRpb24gfSBmcm9tICcuLi9ob29rcy91c2VUaGlua2luZ0FuaW1hdGlvbic7XG5pbXBvcnQgeyB1c2VWaWV3cG9ydE1hbmFnZXIgfSBmcm9tICcuLi9ob29rcy91c2VWaWV3cG9ydE1hbmFnZXInO1xuaW1wb3J0IHsgdXNlRmlsZUF0dGFjaG1lbnRzIH0gZnJvbSAnLi4vaG9va3MvdXNlRmlsZUF0dGFjaG1lbnRzJztcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBHZW5BZ2VudENoYXRQcm9wcywgU2NoZWR1bGVJdGVtIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVm9pY2VJbnB1dCB9IGZyb20gJy4vVm9pY2VJbnB1dCc7XG5pbXBvcnQgeyBBdWRpb1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdWRpb1NlcnZpY2UnO1xuaW1wb3J0IHsgUGFwZXJjbGlwLCBNb3JlVmVydGljYWwsIFJlZnJlc2hDdywgR2xvYmUsIFgsIEFycm93VXAsIE1heGltaXplMiwgTWluaW1pemUyLCBBbGVydENpcmNsZSB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyBDaGF0QnViYmxlIH0gZnJvbSAnLi9DaGF0QnViYmxlJztcbmltcG9ydCBEeW5hbWljRm9ybU1lc3NhZ2UgZnJvbSAnLi9EeW5hbWljRm9ybU1lc3NhZ2UnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZWxlY3RvciB9IGZyb20gJy4vTGFuZ3VhZ2VTZWxlY3Rvcic7XG5pbXBvcnQgY2hhdExvZ28gZnJvbSAnLi4vYXNzZXRzL2NoYXQtbG9nby5wbmcnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlTGFuZ3VhZ2UsXG4gIG1lcmdlVHJhbnNsYXRpb25zLFxuICBnZXRUcmFuc2xhdGlvblN0cmluZyxcbiAgZ2V0VHJhbnNsYXRpb25zRm9yTGFuZ3VhZ2UsXG59IGZyb20gJy4uL3V0aWxzL2kxOG4nO1xuaW1wb3J0IHsgR29vZ2xlUmVDYXB0Y2hhLCBHb29nbGVSZUNhcHRjaGFQcm92aWRlciB9IGZyb20gJ3JlYWN0LWdvb2dsZS1yZWNhcHRjaGEtdjMnO1xuXG5pbXBvcnQge1xuICByZXNvbHZlVGhlbWUsXG4gIGhleFRvUmdiYSxcbiAgZ2V0Q29udGFpbmVyU3R5bGUsXG4gIGdldEhlYWRlclN0eWxlLFxuICBsb2dvQ29udGFpbmVyU3R5bGUsXG4gIGxvZ29TdHlsZSxcbiAgaGVhZGVyVGl0bGVDb250YWluZXJTdHlsZSxcbiAgZ2V0SGVhZGVyVGl0bGVTdHlsZSxcbiAgZ2V0SGVhZGVyU3VidGl0bGVTdHlsZSxcbiAgbWVudUJ1dHRvblN0eWxlLFxuICBnZXRNZW51UG9wdXBTdHlsZSxcbiAgZ2V0TWVudUl0ZW1TdHlsZSxcbiAgY2hhdENvbnRhaW5lclN0eWxlLFxuICBpbnB1dENvbnRhaW5lclN0eWxlLFxuICBpbnB1dFdyYXBwZXJTdHlsZSxcbiAgZ2V0VGV4dEFyZWFTdHlsZSxcbiAgYXR0YWNoQnV0dG9uU3R5bGUsXG4gIGdldFNlbmRCdXR0b25TdHlsZSxcbiAgc2VuZEJ1dHRvbkRpc2FibGVkU3R5bGUsXG4gIHJpZ2h0QWN0aW9uQ29udGFpbmVyU3R5bGUsXG4gIGdldFBvc3NpYmxlUXVlcmllc0NvbnRhaW5lclN0eWxlLFxuICBnZXRRdWVyeUJ1dHRvblN0eWxlLFxuICBnZXRDb25maXJtT3ZlcmxheVN0eWxlLFxuICBnZXRDb25maXJtRGlhbG9nU3R5bGUsXG4gIGNvbmZpcm1CdXR0b25zU3R5bGUsXG4gIGdldENvbmZpcm1CdXR0b25TdHlsZSxcbiAgZ2V0Q29udGVudENhcmRTdHlsZSxcbiAgZ2V0RGlzY2xhaW1lclN0eWxlLFxuICBnZXRQb3NpdGlvblN0eWxlcyxcbiAgZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSxcbiAgQ1NTX0tFWUZSQU1FUyxcbn0gZnJvbSAnLi4vc3R5bGVzL2dlbkFnZW50Q2hhdFN0eWxlcyc7XG5cbmNvbnN0IFNIT1dfQ0hBVF9MQU5HVUFHRV9TRUxFQ1RPUiA9IHRydWU7XG5cbmV4cG9ydCBjb25zdCBHZW5BZ2VudENoYXQ6IFJlYWN0LkZDPEdlbkFnZW50Q2hhdFByb3BzPiA9ICh7XG4gIGJhc2VVcmwsXG4gIHdlYnNvY2tldFVybCxcbiAgYXBpS2V5LFxuICB0ZW5hbnQsXG4gIG1ldGFkYXRhLFxuICB1c2VXcyA9IHRydWUsXG4gIHVzZVBvbGwgPSBmYWxzZSxcbiAgb25FcnJvcixcbiAgb25UYWtlb3ZlcixcbiAgb25GaW5hbGl6ZSxcbiAgdGhlbWUsXG4gIGhlYWRlclRpdGxlID0gJ0dlbmFzc2lzdCcsXG4gIGRlc2NyaXB0aW9uLFxuICBwbGFjZWhvbGRlcixcbiAgYWdlbnROYW1lLFxuICBsb2dvVXJsLFxuICBtb2RlID0gJ2VtYmVkZGVkJyxcbiAgb25FeGl0RnVsbHNjcmVlbixcbiAgZmxvYXRpbmdDb25maWcgPSB7fSxcbiAgbGFuZ3VhZ2UsXG4gIHRyYW5zbGF0aW9uczogY3VzdG9tVHJhbnNsYXRpb25zLFxuICByZUNhcHRjaGFLZXksXG4gIHdpZGdldCA9IGZhbHNlLFxuICB1c2VBdWRpbyA9IGZhbHNlLFxuICB1c2VGaWxlID0gZmFsc2UsXG4gIG5vQ29sb3JBbmltYXRpb24gPSBmYWxzZSxcbiAgc2hvd1dlbGNvbWVCZWZvcmVTdGFydCA9IHRydWUsXG4gIGFsbG93ZWRFeHRlbnNpb25zID0gW10sXG4gIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0VXJsLFxuICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RMYWJlbCxcbiAgZm9ybURpc3BsYXkgPSAnZm9vdGVyJyxcbiAgb25Db25maWdMb2FkZWQsXG59KTogUmVhY3QuUmVhY3RFbGVtZW50ID0+IHtcbiAgLy8gTGFuZ3VhZ2Ugc2VsZWN0aW9uIHN0YXRlICh3aXRoIGxvY2FsU3RvcmFnZSBwZXJzaXN0ZW5jZSlcbiAgY29uc3QgW3NlbGVjdGVkTGFuZ3VhZ2UsIHNldFNlbGVjdGVkTGFuZ3VhZ2VdID0gdXNlU3RhdGU8c3RyaW5nPigoKSA9PiB7XG4gICAgaWYgKGxhbmd1YWdlKSByZXR1cm4gbGFuZ3VhZ2U7XG4gICAgY29uc3Qgc3RvcmVkID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZ2VuYXNzaXN0X2xhbmd1YWdlJykgOiBudWxsO1xuICAgIGlmIChzdG9yZWQpIHJldHVybiBzdG9yZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVMYW5ndWFnZSgpO1xuICB9KTtcblxuICAvLyBTYXZlIGxhbmd1YWdlIHRvIGxvY2FsU3RvcmFnZSB3aGVuIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWxhbmd1YWdlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZ2VuYXNzaXN0X2xhbmd1YWdlJywgc2VsZWN0ZWRMYW5ndWFnZSk7XG4gICAgfVxuICB9LCBbc2VsZWN0ZWRMYW5ndWFnZSwgbGFuZ3VhZ2VdKTtcblxuICAvLyBTdGF0ZSBmb3IgdHJhY2tpbmcgc2VsZWN0ZWQgRkFRIHF1ZXJ5XG4gIGNvbnN0IFtzZWxlY3RlZEZhcVF1ZXJ5LCBzZXRTZWxlY3RlZEZhcVF1ZXJ5XSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFJlc29sdmUgbGFuZ3VhZ2U6IHByb3AgPiBzZWxlY3RlZCA+IGJyb3dzZXIgPiAnZW4nXG4gIGNvbnN0IHJlc29sdmVkTGFuZ3VhZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAobGFuZ3VhZ2UpIHJldHVybiBsYW5ndWFnZTtcbiAgICByZXR1cm4gc2VsZWN0ZWRMYW5ndWFnZSB8fCByZXNvbHZlTGFuZ3VhZ2UoKSB8fCAnZW4nO1xuICB9LCBbbGFuZ3VhZ2UsIHNlbGVjdGVkTGFuZ3VhZ2VdKTtcblxuICAvLyBNZXJnZSBsYW5ndWFnZSBhbmQgRkFRIHF1ZXJ5IGludG8gbWV0YWRhdGFcbiAgY29uc3QgbWV0YWRhdGFXaXRoTGFuZ3VhZ2UgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKG1ldGFkYXRhIHx8IHt9KSxcbiAgICAgIGxhbmd1YWdlOiByZXNvbHZlZExhbmd1YWdlLFxuICAgICAgLi4uKHNlbGVjdGVkRmFxUXVlcnkgPyB7IGZhcV9xdWVyeTogc2VsZWN0ZWRGYXFRdWVyeSB9IDoge30pLFxuICAgIH07XG4gIH0sIFttZXRhZGF0YSwgcmVzb2x2ZWRMYW5ndWFnZSwgc2VsZWN0ZWRGYXFRdWVyeV0pO1xuXG4gIC8vIEdldCB0cmFuc2xhdGlvbnMgYmFzZWQgb24gcmVzb2x2ZWQgbGFuZ3VhZ2UsIHRoZW4gbWVyZ2Ugd2l0aCBjdXN0b20gdHJhbnNsYXRpb25zXG4gIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGJhc2VUcmFuc2xhdGlvbnMgPSBnZXRUcmFuc2xhdGlvbnNGb3JMYW5ndWFnZShyZXNvbHZlZExhbmd1YWdlKTtcbiAgICByZXR1cm4gbWVyZ2VUcmFuc2xhdGlvbnMoY3VzdG9tVHJhbnNsYXRpb25zLCBiYXNlVHJhbnNsYXRpb25zKTtcbiAgfSwgW3Jlc29sdmVkTGFuZ3VhZ2UsIGN1c3RvbVRyYW5zbGF0aW9uc10pO1xuXG4gIGNvbnN0IHQgPSAoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gZ2V0VHJhbnNsYXRpb25TdHJpbmcoa2V5LCB0cmFuc2xhdGlvbnMsIGZhbGxiYWNrKTtcbiAgfTtcblxuICBjb25zdCBpbnB1dFBsYWNlaG9sZGVyID0gdXNlTWVtbygoKSA9PiBwbGFjZWhvbGRlciB8fCB0KCdpbnB1dC5wbGFjZWhvbGRlcicsICdBc2sgYSBxdWVzdGlvbicpLCBbcGxhY2Vob2xkZXIsIHRyYW5zbGF0aW9uc10pO1xuICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG4gIGNvbnN0IFtzaG93UmVzZXRDb25maXJtLCBzZXRTaG93UmVzZXRDb25maXJtXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Nob3dNZW51LCBzZXRTaG93TWVudV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzaG93TGFuZ3VhZ2VEcm9wZG93biwgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd25dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXNQbGF5aW5nQXVkaW8sIHNldElzUGxheWluZ0F1ZGlvXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2lzRmxvYXRpbmdPcGVuLCBzZXRJc0Zsb2F0aW5nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzdWJtaXR0ZWRGb3Jtcywgc2V0U3VibWl0dGVkRm9ybXNdID0gdXNlU3RhdGU8U2V0PG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIGNvbnN0IFtzdWJtaXR0aW5nRm9ybUluZGV4LCBzZXRTdWJtaXR0aW5nRm9ybUluZGV4XSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KG51bGwpO1xuICBjb25zdCBtZW51UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgdGV4dEFyZWFSZWYgPSB1c2VSZWY8SFRNTFRleHRBcmVhRWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGhlYWRlclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IFtoZWFkZXJIZWlnaHQsIHNldEhlYWRlckhlaWdodF0gPSB1c2VTdGF0ZSg1Nik7XG4gIGNvbnN0IFtzaG93QmFja2xpZ2h0LCBzZXRTaG93QmFja2xpZ2h0XSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCB7XG4gICAgbWVzc2FnZXMsXG4gICAgaXNMb2FkaW5nLFxuICAgIHNlbmRNZXNzYWdlLFxuICAgIHNlbmRBdWRpb01lc3NhZ2UsXG4gICAgdXBsb2FkRmlsZSxcbiAgICByZXNldENvbnZlcnNhdGlvbixcbiAgICBzdGFydENvbnZlcnNhdGlvbixcbiAgICBjb252ZXJzYXRpb25JZCxcbiAgICBndWVzdFRva2VuLFxuICAgIHBvc3NpYmxlUXVlcmllcyxcbiAgICBpc0ZpbmFsaXplZCxcbiAgICBpc0FnZW50VHlwaW5nLFxuICAgIGFkZEZlZWRiYWNrLFxuICAgIGF2YWlsYWJsZUxhbmd1YWdlczogYWdlbnRBdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgd2VsY29tZVRpdGxlLFxuICAgIHdlbGNvbWVJbWFnZVVybCxcbiAgICB3ZWxjb21lTWVzc2FnZSxcbiAgICBpbnB1dERpc2NsYWltZXJIdG1sLFxuICAgIHRoaW5raW5nUGhyYXNlcyxcbiAgICB0aGlua2luZ0RlbGF5TXMsXG4gIH0gPSB1c2VDaGF0KHtcbiAgICBiYXNlVXJsLFxuICAgIHdlYnNvY2tldFVybCxcbiAgICBhcGlLZXksXG4gICAgdGVuYW50LFxuICAgIG1ldGFkYXRhOiBtZXRhZGF0YVdpdGhMYW5ndWFnZSxcbiAgICB1c2VXcyxcbiAgICB1c2VQb2xsLFxuICAgIGxhbmd1YWdlOiByZXNvbHZlZExhbmd1YWdlLFxuICAgIG9uRXJyb3IsXG4gICAgb25UYWtlb3ZlcixcbiAgICBvbkZpbmFsaXplLFxuICAgIHNlcnZlclVuYXZhaWxhYmxlTWVzc2FnZSxcbiAgICBzZXJ2ZXJVbmF2YWlsYWJsZUNvbnRhY3RVcmwsXG4gICAgc2VydmVyVW5hdmFpbGFibGVDb250YWN0TGFiZWwsXG4gICAgb25Db25maWdMb2FkZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHsgY3VycmVudFRoaW5raW5nUGFydHMsIGN1cnJlbnRUaGlua2luZ1BhcnRJbmRleCB9ID0gdXNlVGhpbmtpbmdBbmltYXRpb24oe1xuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgdGhpbmtpbmdQaHJhc2VzLFxuICAgIHRoaW5raW5nRGVsYXlNcyxcbiAgICB0cmFuc2xhdGlvbnMsXG4gIH0pO1xuXG4gIGNvbnN0IHsgbWVzc2FnZXNFbmRSZWYsIGNoYXRDb250YWluZXJSZWYgfSA9IHVzZVNjcm9sbE1hbmFnZW1lbnQoe1xuICAgIG1lc3NhZ2VzLFxuICAgIGlzQWdlbnRUeXBpbmcsXG4gICAgY3VycmVudFRoaW5raW5nUGFydEluZGV4LFxuICAgIGN1cnJlbnRUaGlua2luZ1BhcnRzTGVuZ3RoOiBjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGgsXG4gICAgY29udmVyc2F0aW9uSWQsXG4gICAgaXNGbG9hdGluZ09wZW4sXG4gICAgbW9kZSxcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIHdpbmRvd1dpZHRoLFxuICAgIHdpbmRvd0hlaWdodCxcbiAgICBpc0Z1bGxzY3JlZW4sXG4gICAgaGFuZGxlRnVsbHNjcmVlblRvZ2dsZSxcbiAgfSA9IHVzZVZpZXdwb3J0TWFuYWdlcih7XG4gICAgbW9kZSxcbiAgICB3aWRnZXQsXG4gICAgaXNGbG9hdGluZ09wZW4sXG4gICAgc2hvd1Jlc2V0Q29uZmlybSxcbiAgICBzaG93TGFuZ3VhZ2VEcm9wZG93bixcbiAgICBzaG93TWVudSxcbiAgICBvbkV4aXRGdWxsc2NyZWVuLFxuICAgIHNldFNob3dSZXNldENvbmZpcm0sXG4gICAgc2V0U2hvd0xhbmd1YWdlRHJvcGRvd24sXG4gICAgc2V0U2hvd01lbnUsXG4gIH0pO1xuXG4gIGNvbnN0IHtcbiAgICBhdHRhY2htZW50cyxcbiAgICBzZXRBdHRhY2htZW50cyxcbiAgICB1cGxvYWRpbmdGaWxlcyxcbiAgICBmaWxlRXJyb3JUb2FzdCxcbiAgICBmaWxlSW5wdXRSZWYsXG4gICAgaGFuZGxlRmlsZUNoYW5nZSxcbiAgICBoYW5kbGVSZW1vdmVBdHRhY2htZW50LFxuICAgIGNsZWFyQXR0YWNobWVudHMsXG4gIH0gPSB1c2VGaWxlQXR0YWNobWVudHMoeyB1cGxvYWRGaWxlLCB0IH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxhbmd1YWdlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzKSB8fCBhZ2VudEF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLm1hcCgobGFuZykgPT4gbGFuZy50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWQuaW5jbHVkZXMoc2VsZWN0ZWRMYW5ndWFnZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgc2V0U2VsZWN0ZWRMYW5ndWFnZShub3JtYWxpemVkWzBdKTtcbiAgICB9XG4gIH0sIFthZ2VudEF2YWlsYWJsZUxhbmd1YWdlcywgbGFuZ3VhZ2UsIHNlbGVjdGVkTGFuZ3VhZ2VdKTtcblxuICBjb25zdCBhdWRpb1NlcnZpY2UgPSB1c2VSZWY8QXVkaW9TZXJ2aWNlIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHJlQ2FwdGNoYVRva2VuUmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBjb25zdCBoYXNVc2VyTWVzc2FnZXMgPSBtZXNzYWdlcy5zb21lKG1lc3NhZ2UgPT4gbWVzc2FnZS5zcGVha2VyID09PSAnY3VzdG9tZXInKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGF1ZGlvU2VydmljZS5jdXJyZW50ID0gbmV3IEF1ZGlvU2VydmljZSh7IGJhc2VVcmwsIHdlYnNvY2tldFVybCwgYXBpS2V5IH0pO1xuICB9LCBbYmFzZVVybCwgd2Vic29ja2V0VXJsLCBhcGlLZXldKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGF1ZGlvU2VydmljZS5jdXJyZW50Py5zZXRHdWVzdFRva2VuKGd1ZXN0VG9rZW4gPz8gbnVsbCk7XG4gIH0sIFtndWVzdFRva2VuXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobW9kZSA9PT0gJ2Z1bGxzY3JlZW4nICYmICFpc0Zsb2F0aW5nT3Blbikge1xuICAgICAgc2V0SXNGbG9hdGluZ09wZW4odHJ1ZSk7XG4gICAgfVxuICB9LCBbbW9kZSwgaXNGbG9hdGluZ09wZW5dKTtcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUhlYWRlckhlaWdodCA9ICgpID0+IHtcbiAgICAgIHNldEhlYWRlckhlaWdodChoZWFkZXJSZWYuY3VycmVudD8ub2Zmc2V0SGVpZ2h0IHx8IDU2KTtcbiAgICB9O1xuICAgIHVwZGF0ZUhlYWRlckhlaWdodCgpO1xuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHVwZGF0ZUhlYWRlckhlaWdodCgpKTtcbiAgICBpZiAoaGVhZGVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoaGVhZGVyUmVmLmN1cnJlbnQpO1xuICAgIH1cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlSGVhZGVySGVpZ2h0KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZUhlYWRlckhlaWdodCk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcpIHtcbiAgICAgIHNldFNob3dCYWNrbGlnaHQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBzZXRTaG93QmFja2xpZ2h0KGZhbHNlKSwgNDIwKTtcbiAgICByZXR1cm4gKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfSwgW2lzQWdlbnRUeXBpbmddKTtcblxuICBjb25zdCBzdWJtaXRNZXNzYWdlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYgKGlzQWdlbnRUeXBpbmcpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0VG9TZW5kID0gaW5wdXRWYWx1ZTtcbiAgICBjb25zdCBmaWxlc1RvVXBsb2FkID0gYXR0YWNobWVudHMubWFwKGEgPT4gYS5maWxlKTtcblxuICAgIHNldElucHV0VmFsdWUoJycpO1xuICAgIHNldEF0dGFjaG1lbnRzKFtdKTtcbiAgICBpZiAoZmlsZUlucHV0UmVmLmN1cnJlbnQpIHtcbiAgICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50LnZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4dHJhTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICAgICAgaWYgKHNlbGVjdGVkRmFxUXVlcnkpIHtcbiAgICAgICAgZXh0cmFNZXRhZGF0YS5mYXFfcXVlcnkgPSBzZWxlY3RlZEZhcVF1ZXJ5O1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZXNUb1VwbG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4dHJhTWV0YWRhdGEuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cy5tYXAoYSA9PiBhLmF0dGFjaG1lbnQpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSh0ZXh0VG9TZW5kLCBmaWxlc1RvVXBsb2FkLCBleHRyYU1ldGFkYXRhLCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGV4dEFyZWFSZWYuY3VycmVudD8uZm9jdXMoKSwgMCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IGFzeW5jIChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgYXdhaXQgc3VibWl0TWVzc2FnZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldEZvcm1Ob2RlSWQgPSAobWVzc2FnZUluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2VzW21lc3NhZ2VJbmRleF07XG4gICAgaWYgKG1zZz8udHlwZSA9PT0gJ2Zvcm1fcmVxdWVzdCcgJiYgbXNnLnRleHQpIHtcbiAgICAgIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKG1zZy50ZXh0KS5ub2RlX2lkOyB9IGNhdGNoIHsgLyogc2tpcCAqLyB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRm9ybVN1Ym1pdCA9IGFzeW5jIChmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1lc3NhZ2VJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHN1Ym1pdHRpbmdGb3JtSW5kZXggIT09IG51bGwgfHwgaXNBZ2VudFR5cGluZykgcmV0dXJuO1xuICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobWVzc2FnZUluZGV4KTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VtbWFyeVRleHQgPSBPYmplY3QuZW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiAke3ZhbHVlfWApXG4gICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgY29uc3Qgbm9kZUlkID0gZ2V0Rm9ybU5vZGVJZChtZXNzYWdlSW5kZXgpO1xuICAgICAgYXdhaXQgc2VuZE1lc3NhZ2Uoc3VtbWFyeVRleHQsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybTogZm9ybURhdGEsXG4gICAgICAgIC4uLihub2RlSWQgJiYgeyBodW1hbl9pbl90aGVfbG9vcF9ub2RlX2lkOiBub2RlSWQgfSksXG4gICAgICB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICAgIHNldFN1Ym1pdHRlZEZvcm1zKChwcmV2KSA9PiBuZXcgU2V0KHByZXYpLmFkZChtZXNzYWdlSW5kZXgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFN1Ym1pdHRpbmdGb3JtSW5kZXgobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUZvcm1DYW5jZWwgPSBhc3luYyAobWVzc2FnZUluZGV4OiBudW1iZXIpID0+IHtcbiAgICBpZiAoc3VibWl0dGluZ0Zvcm1JbmRleCAhPT0gbnVsbCB8fCBpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChtZXNzYWdlSW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBub2RlSWQgPSBnZXRGb3JtTm9kZUlkKG1lc3NhZ2VJbmRleCk7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZSgnU2tpcHBlZCcsIFtdLCB7XG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2Zyb21fZm9ybToge30sXG4gICAgICAgIGh1bWFuX2luX3RoZV9sb29wX2NhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgLi4uKG5vZGVJZCAmJiB7IGh1bWFuX2luX3RoZV9sb29wX25vZGVfaWQ6IG5vZGVJZCB9KSxcbiAgICAgIH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgICAgc2V0U3VibWl0dGVkRm9ybXMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKG1lc3NhZ2VJbmRleCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlUXVpY2tBY3Rpb24gPSBhc3luYyAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCF0ZXh0LnRyaW0oKSkgcmV0dXJuO1xuICAgIGlmIChpc0FnZW50VHlwaW5nKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4dHJhTWV0YWRhdGEgPSBzZWxlY3RlZEZhcVF1ZXJ5ID8geyBmYXFfcXVlcnk6IHNlbGVjdGVkRmFxUXVlcnkgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHRleHQsIFtdLCBleHRyYU1ldGFkYXRhLCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlIHF1aWNrIGFjdGlvbiBlcnJvcnMgdG8gYXZvaWQgaW50ZXJydXB0aW5nIHRoZSBmbG93XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNjaGVkdWxlQ29uZmlybSA9IGFzeW5jIChzY2hlZHVsZTogU2NoZWR1bGVJdGVtKSA9PiB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGBTY2hlZHVsZSBjb25maXJtZWQgd2l0aCAke3NjaGVkdWxlLnJlc3RhdXJhbnRzLmxlbmd0aH0gcmVzdGF1cmFudHNgO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZW5kTWVzc2FnZShzdW1tYXJ5LCBbXSwgeyBjb25maXJtU2NoZWR1bGU6IEpTT04uc3RyaW5naWZ5KHNjaGVkdWxlKSB9LCByZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVZvaWNlRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgIG9uRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwbGF5UmVzcG9uc2VBdWRpbyA9IGFzeW5jICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWF1ZGlvU2VydmljZS5jdXJyZW50IHx8IGlzUGxheWluZ0F1ZGlvKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgc2V0SXNQbGF5aW5nQXVkaW8odHJ1ZSk7XG4gICAgICBjb25zdCBhdWRpb0Jsb2IgPSBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC50ZXh0VG9TcGVlY2godGV4dCk7XG4gICAgICBhd2FpdCBhdWRpb1NlcnZpY2UuY3VycmVudC5wbGF5QXVkaW8oYXVkaW9CbG9iKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldElzUGxheWluZ0F1ZGlvKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXVkaW9VcmxCdWlsZGVyID0gdXNlQ2FsbGJhY2soKG1lc3NhZ2VJZDogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9L2FwaS9jb252ZXJzYXRpb25zLyR7Y29udmVyc2F0aW9uSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9hdWRpb2A7XG4gIH0sIFtiYXNlVXJsLCBjb252ZXJzYXRpb25JZF0pO1xuXG4gIGNvbnN0IGF1ZGlvSGVhZGVycyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGg6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd4LWFwaS1rZXknOiBhcGlLZXkgfTtcbiAgICBpZiAodGVuYW50KSBoWyd4LXRlbmFudC1pZCddID0gdGVuYW50O1xuICAgIGlmIChndWVzdFRva2VuKSBoWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7Z3Vlc3RUb2tlbn1gO1xuICAgIHJldHVybiBoO1xuICB9LCBbYXBpS2V5LCB0ZW5hbnQsIGd1ZXN0VG9rZW5dKTtcblxuICBjb25zdCBbYXV0b1BsYXlBdWRpb01lc3NhZ2VJZCwgc2V0QXV0b1BsYXlBdWRpb01lc3NhZ2VJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgcHJldk1lc3NhZ2VDb3VudFJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuICBjb25zdCBpbml0aWFsTG9hZERvbmVSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdXNlQXVkaW8gfHwgIW1lc3NhZ2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHByZXZDb3VudCA9IHByZXZNZXNzYWdlQ291bnRSZWYuY3VycmVudDtcbiAgICBwcmV2TWVzc2FnZUNvdW50UmVmLmN1cnJlbnQgPSBtZXNzYWdlcy5sZW5ndGg7XG4gICAgaWYgKCFpbml0aWFsTG9hZERvbmVSZWYuY3VycmVudCkge1xuICAgICAgaW5pdGlhbExvYWREb25lUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoIDw9IHByZXZDb3VudCkgcmV0dXJuO1xuICAgIGNvbnN0IGxhc3QgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdC5zcGVha2VyID09PSAnYWdlbnQnICYmIGxhc3QudHlwZSA9PT0gJ2F1ZGlvJyAmJiBsYXN0Lm1lc3NhZ2VfaWQpIHtcbiAgICAgIHNldEF1dG9QbGF5QXVkaW9NZXNzYWdlSWQobGFzdC5tZXNzYWdlX2lkKTtcbiAgICB9XG4gIH0sIFttZXNzYWdlcywgdXNlQXVkaW9dKTtcblxuICBjb25zdCBoYW5kbGVRdWVyeUNsaWNrID0gYXN5bmMgKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoaXNBZ2VudFR5cGluZyB8fCBpc0xvYWRpbmcpIHJldHVybjtcblxuICAgIHNldFNlbGVjdGVkRmFxUXVlcnkocXVlcnkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlbmRNZXNzYWdlKHF1ZXJ5LCBbXSwgeyBmYXFfcXVlcnk6IHF1ZXJ5IH0sIHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU3RhcnRDb252ZXJzYXRpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzTG9hZGluZykgcmV0dXJuO1xuXG4gICAgc2V0SW5wdXRWYWx1ZSgnJyk7XG4gICAgY2xlYXJBdHRhY2htZW50cygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN0YXJ0Q29udmVyc2F0aW9uKHJlQ2FwdGNoYVRva2VuUmVmLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyBjb252ZXJzYXRpb24nLCBlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhbmRsZU1lbnVDbGljayA9ICgpID0+IHtcbiAgICBzZXRTaG93TWVudShwcmV2ID0+ICFwcmV2KTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZXNldENsaWNrID0gKCkgPT4ge1xuICAgIHNldFNob3dNZW51KGZhbHNlKTtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbmZpcm1SZXNldCA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRJbnB1dFZhbHVlKCcnKTtcbiAgICBjbGVhckF0dGFjaG1lbnRzKCk7XG5cbiAgICBhd2FpdCByZXNldENvbnZlcnNhdGlvbihyZUNhcHRjaGFUb2tlblJlZi5jdXJyZW50KTtcbiAgICBzZXRTZWxlY3RlZEZhcVF1ZXJ5KG51bGwpO1xuICAgIHNldFN1Ym1pdHRlZEZvcm1zKG5ldyBTZXQoKSk7XG4gICAgc2V0U3VibWl0dGluZ0Zvcm1JbmRleChudWxsKTtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDYW5jZWxSZXNldCA9ICgpID0+IHtcbiAgICBzZXRTaG93UmVzZXRDb25maXJtKGZhbHNlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVMYW5ndWFnZUNoYW5nZSA9IChsYW5nOiBzdHJpbmcpID0+IHtcbiAgICBzZXRTZWxlY3RlZExhbmd1YWdlKGxhbmcpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVJlQ2FwdGNoYVZlcmlmeSA9IHVzZUNhbGxiYWNrKCh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgcmVDYXB0Y2hhVG9rZW5SZWYuY3VycmVudCA9IHRva2VuO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgYWxsTGFuZ3VhZ2VzID0gW1xuICAgIHsgY29kZTogJ2VuJywgbmFtZTogJ0VuZ2xpc2gnIH0sXG4gICAgeyBjb2RlOiAnZXMnLCBuYW1lOiAnRXNwYcOxb2wnIH0sXG4gICAgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LFxuICAgIHsgY29kZTogJ2RlJywgbmFtZTogJ0RldXRzY2gnIH0sXG4gICAgeyBjb2RlOiAnaXQnLCBuYW1lOiAnSXRhbGlhbm8nIH0sXG4gICAgeyBjb2RlOiAncHQnLCBuYW1lOiAnUG9ydHVndcOqcycgfSxcbiAgICB7IGNvZGU6ICd6aCcsIG5hbWU6ICfkuK3mlocnIH0sXG4gIF07XG4gIGNvbnN0IGF2YWlsYWJsZUxhbmd1YWdlcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzKSkge1xuICAgICAgY29uc3QgYWxsb3dlZCA9IG5ldyBTZXQoXG4gICAgICAgIGFnZW50QXZhaWxhYmxlTGFuZ3VhZ2VzLm1hcCgobGFuZykgPT4gbGFuZy50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzLmZpbHRlcigobGFuZykgPT4gYWxsb3dlZC5oYXMobGFuZy5jb2RlKSk7XG4gICAgfVxuICAgIHJldHVybiBhbGxMYW5ndWFnZXM7XG4gIH0sIFthZ2VudEF2YWlsYWJsZUxhbmd1YWdlc10pO1xuICBjb25zdCBoYXNMYW5ndWFnZU9wdGlvbnMgPSBhdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoID4gMDtcblxuICAvLyBSZXNvbHZlIHRoZW1lIHZhbHVlc1xuICBjb25zdCB0aGVtZVBhcmFtcyA9IHJlc29sdmVUaGVtZSh0aGVtZSk7XG4gIGNvbnN0IHsgcHJpbWFyeUNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IsIHRleHRDb2xvciwgZm9udEZhbWlseSwgZm9udFNpemUgfSA9IHRoZW1lUGFyYW1zO1xuICBjb25zdCBmb250U2l6ZU51bWJlciA9IHR5cGVvZiBmb250U2l6ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChmb250U2l6ZSwgMTApIDogKHR5cGVvZiBmb250U2l6ZSA9PT0gJ251bWJlcicgPyBmb250U2l6ZSA6IDE0KTtcblxuICBjb25zdCBwb3NpdGlvbiA9IGZsb2F0aW5nQ29uZmlnLnBvc2l0aW9uIHx8ICdib3R0b20tcmlnaHQnO1xuICBjb25zdCBvZmZzZXQgPSBmbG9hdGluZ0NvbmZpZy5vZmZzZXQgfHwgeyB4OiAyMCwgeTogMjAgfTtcbiAgY29uc3Qgb2Zmc2V0WCA9IG9mZnNldC54IHx8IDIwO1xuICBjb25zdCBvZmZzZXRZID0gb2Zmc2V0LnkgfHwgMjA7XG5cbiAgY29uc3QgaXNGbG9hdGluZ0RvY2tlZCA9IG1vZGUgPT09ICdmbG9hdGluZycgJiYgIWlzRnVsbHNjcmVlbjtcblxuICAvLyBDb21wdXRlZCBzdHlsZXNcbiAgY29uc3QgY29udGFpbmVyU3R5bGUgPSBnZXRDb250YWluZXJTdHlsZSh7IGlzRnVsbHNjcmVlbiwgaXNGbG9hdGluZ0RvY2tlZCwgd2luZG93V2lkdGgsIHQ6IHRoZW1lUGFyYW1zIH0pO1xuICBjb25zdCBoZWFkZXJTdHlsZSA9IGdldEhlYWRlclN0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgaGVhZGVyVGl0bGVTdHlsZSA9IGdldEhlYWRlclRpdGxlU3R5bGUoZm9udEZhbWlseSk7XG4gIGNvbnN0IGhlYWRlclN1YnRpdGxlU3R5bGUgPSBnZXRIZWFkZXJTdWJ0aXRsZVN0eWxlKGZvbnRGYW1pbHkpO1xuICBjb25zdCBtZW51UG9wdXBTdHlsZSA9IGdldE1lbnVQb3B1cFN0eWxlKGJhY2tncm91bmRDb2xvcik7XG4gIGNvbnN0IG1lbnVJdGVtU3R5bGUgPSBnZXRNZW51SXRlbVN0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgY29udGVudENhcmRTdHlsZSA9IGdldENvbnRlbnRDYXJkU3R5bGUoYmFja2dyb3VuZENvbG9yKTtcbiAgY29uc3Qgc2VuZEJ1dHRvblN0eWxlID0gZ2V0U2VuZEJ1dHRvblN0eWxlKHByaW1hcnlDb2xvcik7XG4gIGNvbnN0IHBvc3NpYmxlUXVlcmllc0NvbnRhaW5lclN0eWxlID0gZ2V0UG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGUoZm9udEZhbWlseSk7XG4gIGNvbnN0IHF1ZXJ5QnV0dG9uU3R5bGUgPSBnZXRRdWVyeUJ1dHRvblN0eWxlKHRoZW1lUGFyYW1zKTtcbiAgY29uc3QgY29uZmlybU92ZXJsYXlTdHlsZSA9IGdldENvbmZpcm1PdmVybGF5U3R5bGUoc2hvd1Jlc2V0Q29uZmlybSk7XG4gIGNvbnN0IGNvbmZpcm1EaWFsb2dTdHlsZSA9IGdldENvbmZpcm1EaWFsb2dTdHlsZSh0aGVtZVBhcmFtcyk7XG4gIGNvbnN0IGRpc2NsYWltZXJTdHlsZSA9IGdldERpc2NsYWltZXJTdHlsZShmb250RmFtaWx5KTtcblxuICBjb25zdCB0ZXh0QXJlYUZvbnRTaXplID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHdpbmRvd1dpZHRoIDw9IDc2OCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDE2LCBmb250U2l6ZU51bWJlcikgKyAncHgnO1xuICAgIH1cbiAgICByZXR1cm4gZm9udFNpemU7XG4gIH0sIFt3aW5kb3dXaWR0aCwgZm9udFNpemUsIGZvbnRTaXplTnVtYmVyXSk7XG5cbiAgY29uc3QgdGV4dEFyZWFMaW5lSGVpZ2h0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc2l6ZSA9IHdpbmRvd1dpZHRoIDw9IDc2OCA/IE1hdGgubWF4KDE2LCBmb250U2l6ZU51bWJlcikgOiBmb250U2l6ZU51bWJlcjtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChzaXplICogMS41KTtcbiAgfSwgW3dpbmRvd1dpZHRoLCBmb250U2l6ZU51bWJlcl0pO1xuXG4gIGNvbnN0IHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiB0ZXh0QXJlYUxpbmVIZWlnaHQgKiAzO1xuICB9LCBbdGV4dEFyZWFMaW5lSGVpZ2h0XSk7XG5cbiAgY29uc3QgdGV4dEFyZWFTdHlsZSA9IGdldFRleHRBcmVhU3R5bGUoe1xuICAgIHRleHRBcmVhRm9udFNpemUsXG4gICAgZm9udEZhbWlseSxcbiAgICB0ZXh0QXJlYUxpbmVIZWlnaHQsXG4gICAgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkLFxuICAgIHRleHRDb2xvcixcbiAgfSk7XG5cbiAgY29uc3QgaGFzUGVuZGluZ0Zvcm0gPSBtZXNzYWdlcy5zb21lKChtc2csIGlkeCkgPT4ge1xuICAgIGlmIChtc2cudHlwZSAhPT0gJ2Zvcm1fcmVxdWVzdCcgfHwgbXNnLnNwZWFrZXIgIT09ICdhZ2VudCcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXN1Ym1pdHRlZEZvcm1zLmhhcyhpZHgpO1xuICB9KTtcblxuICBjb25zdCBwZW5kaW5nRm9ybSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBtZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbXNnID0gbWVzc2FnZXNbaV07XG4gICAgICBpZiAobXNnLnR5cGUgPT09ICdmb3JtX3JlcXVlc3QnICYmIG1zZy5zcGVha2VyID09PSAnYWdlbnQnICYmICFzdWJtaXR0ZWRGb3Jtcy5oYXMoaSkpIHtcbiAgICAgICAgdHJ5IHsgcmV0dXJuIHsgc2NoZW1hOiBKU09OLnBhcnNlKG1zZy50ZXh0KSwgaW5kZXg6IGkgfTsgfVxuICAgICAgICBjYXRjaCB7IC8qIHNraXAgKi8gfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW21lc3NhZ2VzLCBzdWJtaXR0ZWRGb3Jtc10pO1xuXG4gIGNvbnN0IGlzU2VuZERpc2FibGVkID0gKGlucHV0VmFsdWUudHJpbSgpID09PSAnJyAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHx8IGlzQWdlbnRUeXBpbmcgfHwgaGFzUGVuZGluZ0Zvcm07XG5cbiAgY29uc3QgYXV0b1Jlc2l6ZVRleHRBcmVhID0gKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gdGV4dEFyZWFSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWluKGVsLnNjcm9sbEhlaWdodCwgdGV4dEFyZWFNYXhIZWlnaHRDYWxjdWxhdGVkKTtcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSBgJHtuZXdIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93WSA9IGVsLnNjcm9sbEhlaWdodCA+IHRleHRBcmVhTWF4SGVpZ2h0Q2FsY3VsYXRlZCA/ICdhdXRvJyA6ICdoaWRkZW4nO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXV0b1Jlc2l6ZVRleHRBcmVhKCk7XG4gIH0sIFtpbnB1dFZhbHVlLCB0ZXh0QXJlYU1heEhlaWdodENhbGN1bGF0ZWRdKTtcblxuICBjb25zdCBzaG93QWdlbnREaXNjbGFpbWVyID0gQm9vbGVhbihpbnB1dERpc2NsYWltZXJIdG1sKTtcbiAgY29uc3QgYWdlbnREaXNjbGFpbWVyQ29udGVudCA9IHNob3dBZ2VudERpc2NsYWltZXIgJiYgKFxuICAgIDxzcGFuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaW5wdXREaXNjbGFpbWVySHRtbCEgfX0gLz5cbiAgKTtcblxuICBjb25zdCBmbG9hdGluZ0NvbnRhaW5lclN0eWxlID0gZ2V0RmxvYXRpbmdDb250YWluZXJTdHlsZSh7XG4gICAgbW9kZSxcbiAgICBpc0Z1bGxzY3JlZW4sXG4gICAgd2luZG93V2lkdGgsXG4gICAgd2luZG93SGVpZ2h0LFxuICAgIHBvc2l0aW9uLFxuICAgIG9mZnNldFgsXG4gICAgb2Zmc2V0WSxcbiAgfSk7XG5cbiAgY29uc3QgcmVuZGVyTGFuZ3VhZ2VTZWxlY3RvciA9ICgpID0+IHtcbiAgICBpZiAoIVNIT1dfQ0hBVF9MQU5HVUFHRV9TRUxFQ1RPUikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNMYW5ndWFnZU9wdGlvbnMgfHwgKGNvbnZlcnNhdGlvbklkICYmICFpc0ZpbmFsaXplZCkgfHwgbWVzc2FnZXMubGVuZ3RoID4gMCB8fCBoYXNVc2VyTWVzc2FnZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPExhbmd1YWdlU2VsZWN0b3JcbiAgICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2VzPXthdmFpbGFibGVMYW5ndWFnZXN9XG4gICAgICAgIHNlbGVjdGVkTGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgIG9uTGFuZ3VhZ2VDaGFuZ2U9e2hhbmRsZUxhbmd1YWdlQ2hhbmdlfVxuICAgICAgICB0cmFuc2xhdGlvbnM9e3RyYW5zbGF0aW9uc31cbiAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHJlbmRlcldpdGhSZUNhcHRjaGEgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXJlQ2FwdGNoYUtleSkge1xuICAgICAgcmV0dXJuIChjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlKSA9PiA8PntjaGlsZHJlbn08Lz47XG4gICAgfVxuXG4gICAgcmV0dXJuIChjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlKSA9PiAoXG4gICAgICA8R29vZ2xlUmVDYXB0Y2hhUHJvdmlkZXIgcmVDYXB0Y2hhS2V5PXtyZUNhcHRjaGFLZXkgfHwgJyd9PlxuICAgICAgICA8R29vZ2xlUmVDYXB0Y2hhXG4gICAgICAgICAgYWN0aW9uPVwiZ2VuYXNzaXN0X2NoYXRcIlxuICAgICAgICAgIG9uVmVyaWZ5PXtoYW5kbGVSZUNhcHRjaGFWZXJpZnl9XG4gICAgICAgICAgcmVmcmVzaFJlQ2FwdGNoYT17ZmFsc2V9XG4gICAgICAgIC8+XG4gICAgICAgIDw+e2NoaWxkcmVufTwvPlxuICAgICAgPC9Hb29nbGVSZUNhcHRjaGFQcm92aWRlcj5cbiAgICApO1xuICB9LCBbcmVDYXB0Y2hhS2V5LCBoYW5kbGVSZUNhcHRjaGFWZXJpZnldKTtcblxuICBjb25zdCByZW5kZXJDaGF0Q29tcG9uZW50ID0gKCkgPT4gKFxuICAgIDxkaXYgc3R5bGU9e2NvbnRhaW5lclN0eWxlfSBkYXRhLWdlbmFzc2lzdC1yb290PVwidHJ1ZVwiPlxuICAgICAgPHN0eWxlPntDU1NfS0VZRlJBTUVTfTwvc3R5bGU+XG4gICAgICA8ZGl2IHN0eWxlPXtoZWFkZXJTdHlsZX0gcmVmPXtoZWFkZXJSZWZ9PlxuICAgICAgICA8ZGl2IHN0eWxlPXtsb2dvQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgIDxpbWcgc3JjPXtsb2dvVXJsPy50cmltKCkgfHwgY2hhdExvZ299IGFsdD1cIkxvZ29cIiBzdHlsZT17bG9nb1N0eWxlfSAvPlxuICAgICAgICAgIDxkaXYgc3R5bGU9e2hlYWRlclRpdGxlQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17aGVhZGVyVGl0bGVTdHlsZX0+e2hlYWRlclRpdGxlfTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17aGVhZGVyU3VidGl0bGVTdHlsZX0+XG4gICAgICAgICAgICAgIHtkZXNjcmlwdGlvbiA/PyB0KCdoZWFkZXIuc3VidGl0bGUnKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGFsaWduSXRlbXM6ICdjZW50ZXInLCBnYXA6ICc4cHgnIH19PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHN0eWxlPXttZW51QnV0dG9uU3R5bGV9XG4gICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVNZW51Q2xpY2t9XG4gICAgICAgICAgICB0aXRsZT17dCgnbWVudS50aXRsZScpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxNb3JlVmVydGljYWwgc2l6ZT17MjR9IGNvbG9yPVwiIzExMTExMVwiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAge21vZGUgPT09ICdmbG9hdGluZycgJiYgKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBzdHlsZT17bWVudUJ1dHRvblN0eWxlfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRJc0Zsb2F0aW5nT3BlbihmYWxzZSl9XG4gICAgICAgICAgICAgIHRpdGxlPVwiQ2xvc2UgY2hhdFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxYIHNpemU9ezI0fSBjb2xvcj1cIiMxMTExMTFcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIHshbm9Db2xvckFuaW1hdGlvbiAmJiBzaG93QmFja2xpZ2h0ICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIHRvcDogTWF0aC5tYXgoMCwgaGVhZGVySGVpZ2h0IC0gMTQpLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MixcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgIG9wYWNpdHk6IGlzQWdlbnRUeXBpbmcgPyAxIDogMCxcbiAgICAgICAgICAgIHRyYW5zaXRpb246ICdvcGFjaXR5IDQyMG1zIGVhc2UtaW4tb3V0JyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgIHRvcDogNixcbiAgICAgICAgICAgICAgaGVpZ2h0OiAzMixcbiAgICAgICAgICAgICAgd2lkdGg6ICc3OCUnLFxuICAgICAgICAgICAgICBmaWx0ZXI6ICdibHVyKDIycHgpJyxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICAgICAgICBgbGluZWFyLWdyYWRpZW50KDkwZGVnLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMCl9IDAlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMzUpfSAxNSUsICR7aGV4VG9SZ2JhKHByaW1hcnlDb2xvciwgMC41NSl9IDUwJSwgJHtoZXhUb1JnYmEocHJpbWFyeUNvbG9yLCAwLjM1KX0gODUlLCAke2hleFRvUmdiYShwcmltYXJ5Q29sb3IsIDAuMCl9IDEwMCUpYCxcbiAgICAgICAgICAgICAgd2lsbENoYW5nZTogJ3RyYW5zZm9ybSwgb3BhY2l0eScsXG4gICAgICAgICAgICAgIGFuaW1hdGlvbjogJ2dhLWJhY2tsaWdodC1zd2VlcDIgMS4ycyBjdWJpYy1iZXppZXIoMC40LDAuMCwwLjIsMSkgaW5maW5pdGUgYWx0ZXJuYXRlLCBnYS1iYWNrbGlnaHQtcHVsc2UgMi40cyBlYXNlLWluLW91dCBpbmZpbml0ZScsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogMTgsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cblxuICAgICAge3Nob3dNZW51ICYmIChcbiAgICAgICAgPGRpdiByZWY9e21lbnVSZWZ9IHN0eWxlPXttZW51UG9wdXBTdHlsZX0+XG4gICAgICAgICAgPGRpdiBzdHlsZT17bWVudUl0ZW1TdHlsZX0gb25DbGljaz17aGFuZGxlUmVzZXRDbGlja30+XG4gICAgICAgICAgICA8UmVmcmVzaEN3IHNpemU9ezE2fSAvPlxuICAgICAgICAgICAge3QoJ21lbnUucmVzZXRDb252ZXJzYXRpb24nKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7bW9kZSAhPT0gJ2Z1bGxzY3JlZW4nICYmIChcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e21lbnVJdGVtU3R5bGV9IG9uQ2xpY2s9e2hhbmRsZUZ1bGxzY3JlZW5Ub2dnbGV9PlxuICAgICAgICAgICAgICB7aXNGdWxsc2NyZWVuID8gPE1pbmltaXplMiBzaXplPXsxNn0gLz4gOiA8TWF4aW1pemUyIHNpemU9ezE2fSAvPn1cbiAgICAgICAgICAgICAge3QoJ21lbnUuZnVsbHNjcmVlbicpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7aGFzTGFuZ3VhZ2VPcHRpb25zICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9e3sgLi4ubWVudUl0ZW1TdHlsZSwgcG9zaXRpb246ICdyZWxhdGl2ZScsIGJvcmRlckJvdHRvbTogJ25vbmUnIH19XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bighc2hvd0xhbmd1YWdlRHJvcGRvd24pO1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8R2xvYmUgc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGZsZXg6IDEgfX0+e3QoJ21lbnUubGFuZ3VhZ2UnKX08L3NwYW4+XG4gICAgICAgICAgICAgIHtzaG93TGFuZ3VhZ2VEcm9wZG93biAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgICAgICB0b3A6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAnNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgICAgICAgICAgICAgICAgIGJveFNoYWRvdzogJzAgMnB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjEpJyxcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6ICcxODBweCcsXG4gICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAnMjAwcHgnLFxuICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleDogMTAwMSxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlTGFuZ3VhZ2VzLm1hcCgobGFuZywgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGtleT17bGFuZy5jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcDogJzhweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTBweCAxNXB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHJlc29sdmVkTGFuZ3VhZ2UgPT09IGxhbmcuY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh0aGVtZT8uc2Vjb25kYXJ5Q29sb3IgfHwgJyNmNWY1ZjUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IGluZGV4IDwgYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCAtIDEgPyAnMXB4IHNvbGlkICNmMGYwZjAnIDogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYmFja2dyb3VuZC1jb2xvciAwLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkTGFuZ3VhZ2UgIT09IGxhbmcuY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhlbWU/LnNlY29uZGFyeUNvbG9yIHx8ICcjZjVmNWY1JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZExhbmd1YWdlICE9PSBsYW5nLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUxhbmd1YWdlQ2hhbmdlKGxhbmcuY29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TGFuZ3VhZ2VEcm9wZG93bihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TWVudShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHtsYW5nLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIDxkaXYgc3R5bGU9e2NvbnRlbnRDYXJkU3R5bGV9PlxuICAgICAgICA8ZGl2IHN0eWxlPXtjaGF0Q29udGFpbmVyU3R5bGV9IHJlZj17Y2hhdENvbnRhaW5lclJlZn0+XG4gICAgICAgICAge3JlbmRlckxhbmd1YWdlU2VsZWN0b3IoKX1cblxuICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2hvd1N5bnRoZXRpY1dlbGNvbWUgPVxuICAgICAgICAgICAgICBzaG93V2VsY29tZUJlZm9yZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICFoYXNVc2VyTWVzc2FnZXMgJiZcbiAgICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgICAoQm9vbGVhbih3ZWxjb21lVGl0bGUpIHx8IEJvb2xlYW4od2VsY29tZUltYWdlVXJsKSB8fCBCb29sZWFuKHdlbGNvbWVNZXNzYWdlKSlcbiAgICAgICAgICAgICAgJiYgY29udmVyc2F0aW9uSWQ7XG5cbiAgICAgICAgICAgIGlmICghc2hvdWxkU2hvd1N5bnRoZXRpY1dlbGNvbWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1dlbGNvbWU6IENoYXRNZXNzYWdlID0ge1xuICAgICAgICAgICAgICBjcmVhdGVfdGltZTogbm93LFxuICAgICAgICAgICAgICBzdGFydF90aW1lOiAwLFxuICAgICAgICAgICAgICBlbmRfdGltZTogMC4wMSxcbiAgICAgICAgICAgICAgc3BlYWtlcjogJ2FnZW50JyxcbiAgICAgICAgICAgICAgdGV4dDogd2VsY29tZU1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Q2hhdE1lc3NhZ2VDb21wb25lbnRcbiAgICAgICAgICAgICAgICBrZXk9XCJfX3N5bnRoZXRpY193ZWxjb21lX19cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2U9e3N5bnRoZXRpY1dlbGNvbWV9XG4gICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgIGlzRmlyc3RNZXNzYWdlPXt0cnVlfVxuICAgICAgICAgICAgICAgIGlzTmV4dFNhbWVTcGVha2VyPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBpc1ByZXZTYW1lU3BlYWtlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgZW5hYmxlVHlwZXdyaXRlcj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgd2VsY29tZUltYWdlVXJsPXt3ZWxjb21lSW1hZ2VVcmwgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgIHdlbGNvbWVUaXRsZT17d2VsY29tZVRpdGxlIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXM9e3Bvc3NpYmxlUXVlcmllc31cbiAgICAgICAgICAgICAgICBvblF1aWNrUXVlcnk9e2hhbmRsZVF1ZXJ5Q2xpY2t9XG4gICAgICAgICAgICAgICAgb25RdWlja0FjdGlvbj17aGFuZGxlUXVpY2tBY3Rpb259XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zPXt0cmFuc2xhdGlvbnN9XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgICAgICAgYWdlbnROYW1lPXthZ2VudE5hbWV9XG4gICAgICAgICAgICAgICAgaXNBZ2VudFR5cGluZz17aXNBZ2VudFR5cGluZ31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgICB7KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QWdlbnRJbmRleCA9IG1lc3NhZ2VzLmZpbmRJbmRleChtID0+IG0uc3BlYWtlciA9PT0gJ2FnZW50Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFwcGx5TWVzc2FnZUZpbHRlciA9IChtZXNzYWdlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UudHlwZSAhPT0gJ2ZpbGUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXMuZmlsdGVyKGFwcGx5TWVzc2FnZUZpbHRlcikubWFwKChtZXNzYWdlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9ybV9yZXF1ZXN0JyAmJiBtZXNzYWdlLnNwZWFrZXIgPT09ICdhZ2VudCcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybVNjaGVtYSA9IEpTT04ucGFyc2UobWVzc2FnZS50ZXh0KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUGVuZGluZyA9ICFzdWJtaXR0ZWRGb3Jtcy5oYXMoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2luZGV4fSBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBtYXhXaWR0aDogJzg1JScsIG1hcmdpbkJvdHRvbTogJzhweCcgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBmb250U2l6ZTogJzE0cHgnLCBjb2xvcjogJyMwMDAwMDAnLCBmb250V2VpZ2h0OiA2MDAsIG1hcmdpbkJvdHRvbTogNCB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthZ2VudE5hbWUgfHwgJ0FnZW50J31cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB7Zm9ybURpc3BsYXkgPT09ICdpbmxpbmUnICYmIGlzUGVuZGluZyA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEeW5hbWljRm9ybU1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hPXtmb3JtU2NoZW1hfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Ym1pdD17KGRhdGEpID0+IGhhbmRsZUZvcm1TdWJtaXQoZGF0YSwgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gaGFuZGxlRm9ybUNhbmNlbChpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VibWl0dGluZz17c3VibWl0dGluZ0Zvcm1JbmRleCA9PT0gaW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yPXtwcmltYXJ5Q29sb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk9e2ZvbnRGYW1pbHl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2YzZjRmNicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMTBweCAxNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6ICcxNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMzc0MTUxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Zm9ybVNjaGVtYS5tZXNzYWdlIHx8ICdQbGVhc2UgZmlsbCB0aGUgZm9ybSBiZWxvdy4nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNQZW5kaW5nICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRTaXplOiAnMTJweCcsIGNvbG9yOiAnIzZiNzI4MCcsIG1hcmdpblRvcDogJzRweCcgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsIHRoZSBmb3JtIGJlbG93IHRvIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIG5vcm1hbCByZW5kZXJpbmcgaWYgSlNPTiBwYXJzZSBmYWlsc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGlzTmV4dFNhbWVTcGVha2VyID0gaW5kZXggPCBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2VzW2luZGV4ICsgMV0uc3BlYWtlciA9PT0gbWVzc2FnZS5zcGVha2VyO1xuICAgICAgICAgICAgICBjb25zdCBpc1ByZXZTYW1lU3BlYWtlciA9IGluZGV4ID4gMCAmJiBtZXNzYWdlc1tpbmRleCAtIDFdLnNwZWFrZXIgPT09IG1lc3NhZ2Uuc3BlYWtlcjtcbiAgICAgICAgICAgICAgY29uc3QgaXNGaXJzdEFnZW50TWVzc2FnZSA9IGluZGV4ID09PSBmaXJzdEFnZW50SW5kZXggJiYgbWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnICYmICFoYXNVc2VyTWVzc2FnZXM7XG4gICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlNZXNzYWdlID1cbiAgICAgICAgICAgICAgICBpc0ZpcnN0QWdlbnRNZXNzYWdlICYmIHdlbGNvbWVNZXNzYWdlXG4gICAgICAgICAgICAgICAgICA/IHsgLi4ubWVzc2FnZSwgdGV4dDogd2VsY29tZU1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgOiBtZXNzYWdlO1xuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPENoYXRNZXNzYWdlQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgbWVzc2FnZT17ZGlzcGxheU1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICB0aGVtZT17dGhlbWV9XG4gICAgICAgICAgICAgICAgICBvblBsYXlBdWRpbz17bWVzc2FnZS5zcGVha2VyID09PSAnYWdlbnQnID8gcGxheVJlc3BvbnNlQXVkaW8gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBpc1BsYXlpbmdBdWRpbz17aXNQbGF5aW5nQXVkaW99XG4gICAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZT17aXNGaXJzdEFnZW50TWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgIGlzTmV4dFNhbWVTcGVha2VyPXtpc05leHRTYW1lU3BlYWtlcn1cbiAgICAgICAgICAgICAgICAgIGlzUHJldlNhbWVTcGVha2VyPXtpc1ByZXZTYW1lU3BlYWtlcn1cbiAgICAgICAgICAgICAgICAgIG9uRmVlZGJhY2s9eyhtZXNzYWdlSWQsIHZhbHVlKSA9PiBhZGRGZWVkYmFjayhtZXNzYWdlSWQsIHZhbHVlKX1cbiAgICAgICAgICAgICAgICAgIGVuYWJsZVR5cGV3cml0ZXI9e2luZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50J31cbiAgICAgICAgICAgICAgICAgIHdlbGNvbWVJbWFnZVVybD17aXNGaXJzdEFnZW50TWVzc2FnZSA/ICh3ZWxjb21lSW1hZ2VVcmwgfHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIHdlbGNvbWVUaXRsZT17aXNGaXJzdEFnZW50TWVzc2FnZSA/ICh3ZWxjb21lVGl0bGUgfHwgdW5kZWZpbmVkKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIHBvc3NpYmxlUXVlcmllcz17aXNGaXJzdEFnZW50TWVzc2FnZSA/IHBvc3NpYmxlUXVlcmllcyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIG9uUXVpY2tRdWVyeT17aGFuZGxlUXVlcnlDbGlja31cbiAgICAgICAgICAgICAgICAgIG9uUXVpY2tBY3Rpb249e2hhbmRsZVF1aWNrQWN0aW9ufVxuICAgICAgICAgICAgICAgICAgb25TY2hlZHVsZUNvbmZpcm09e2hhbmRsZVNjaGVkdWxlQ29uZmlybX1cbiAgICAgICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2U9e2luZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxICYmIG1lc3NhZ2Uuc3BlYWtlciA9PT0gJ2FnZW50J31cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9ucz17dHJhbnNsYXRpb25zfVxuICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9e3Jlc29sdmVkTGFuZ3VhZ2V9XG4gICAgICAgICAgICAgICAgICBhZ2VudE5hbWU9e2FnZW50TmFtZX1cbiAgICAgICAgICAgICAgICAgIGlzQWdlbnRUeXBpbmc9e2lzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgICAgICBhdWRpb1VybEJ1aWxkZXI9e21lc3NhZ2UudHlwZSA9PT0gJ2F1ZGlvJyAmJiB1c2VBdWRpbyA/IGF1ZGlvVXJsQnVpbGRlciA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgIGF1ZGlvSGVhZGVycz17bWVzc2FnZS50eXBlID09PSAnYXVkaW8nICYmIHVzZUF1ZGlvID8gYXVkaW9IZWFkZXJzIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgYXV0b1BsYXlBdWRpb01lc3NhZ2VJZD17YXV0b1BsYXlBdWRpb01lc3NhZ2VJZH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkoKX1cbiAgICAgICAgICB7aXNBZ2VudFR5cGluZyAmJiBjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJywgbWF4V2lkdGg6ICc4MCUnIH19PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGZvbnRTaXplOiAnMTRweCcsIGNvbG9yOiAnIzAwMDAwMCcsIGZvbnRXZWlnaHQ6IDYwMCwgbWFyZ2luQm90dG9tOiA0IH19PnthZ2VudE5hbWUgfHwgdCgnbGFiZWxzLmFnZW50Jyl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtgJHtjdXJyZW50VGhpbmtpbmdQYXJ0SW5kZXh9LSR7Y3VycmVudFRoaW5raW5nUGFydHMuam9pbignfCcpfWB9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246ICdnYS10aGluay1jaGFuZ2UgMjIwbXMgZWFzZScsXG4gICAgICAgICAgICAgICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0sIG9wYWNpdHknLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyM2YjcyODAnLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogJzEzcHgnLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudFRoaW5raW5nUGFydHNbY3VycmVudFRoaW5raW5nUGFydEluZGV4XSB8fCBjdXJyZW50VGhpbmtpbmdQYXJ0c1tjdXJyZW50VGhpbmtpbmdQYXJ0cy5sZW5ndGggLSAxXX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIDxkaXYgcmVmPXttZXNzYWdlc0VuZFJlZn0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtzaG93V2VsY29tZUJlZm9yZVN0YXJ0ICYmICgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2hvd2luZ1N5bnRoZXRpY1dlbGNvbWUgPVxuICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgKEJvb2xlYW4od2VsY29tZVRpdGxlKSB8fCBCb29sZWFuKHdlbGNvbWVJbWFnZVVybCkgfHwgQm9vbGVhbih3ZWxjb21lTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3NzaWJsZVF1ZXJpZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIWhhc1VzZXJNZXNzYWdlcyAmJlxuICAgICAgICAgICAgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCB8fCBtZXNzYWdlc1swXS5zcGVha2VyICE9PSAnYWdlbnQnKSAmJlxuICAgICAgICAgICAgIXNob3dpbmdTeW50aGV0aWNXZWxjb21lXG4gICAgICAgICAgKTtcbiAgICAgICAgfSkoKSAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17cG9zc2libGVRdWVyaWVzQ29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAge3Bvc3NpYmxlUXVlcmllcy5tYXAoKHF1ZXJ5LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBzdHlsZT17cXVlcnlCdXR0b25TdHlsZX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVRdWVyeUNsaWNrKHF1ZXJ5KX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nIHx8IGlzQWdlbnRUeXBpbmd9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cXVlcnl9XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge2ZpbGVFcnJvclRvYXN0ICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBtYXJnaW46ICcwIDE2cHggOHB4JyxcbiAgICAgICAgICAgICAgcGFkZGluZzogJzEwcHggMTRweCcsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkYzRTAnLFxuICAgICAgICAgICAgICBjb2xvcjogJyNFNjUxMDAnLFxuICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxMnB4JyxcbiAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIGdhcDogJzhweCcsXG4gICAgICAgICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8QWxlcnRDaXJjbGUgc2l6ZT17MTh9IHN0eWxlPXt7IGZsZXhTaHJpbms6IDAgfX0gLz5cbiAgICAgICAgICAgIDxzcGFuPntmaWxlRXJyb3JUb2FzdH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAge3VzZUZpbGUgJiYgYXR0YWNobWVudHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17eyBwYWRkaW5nOiAnMCAxNnB4JywgbWFyZ2luQm90dG9tOiAnOHB4JywgZGlzcGxheTogJ2ZsZXgnLCBnYXA6ICc4cHgnLCBmbGV4V3JhcDogJ3dyYXAnIH19PlxuICAgICAgICAgICAge2F0dGFjaG1lbnRzLm1hcCgoYXR0LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8QXR0YWNobWVudFByZXZpZXdcbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIGZpbGU9e2F0dC5maWxlfVxuICAgICAgICAgICAgICAgIG9uUmVtb3ZlPXsoKSA9PiBoYW5kbGVSZW1vdmVBdHRhY2htZW50KGF0dC5maWxlLm5hbWUpfVxuICAgICAgICAgICAgICAgIHVwbG9hZGluZz17dXBsb2FkaW5nRmlsZXMuaGFzKGF0dC5maWxlLm5hbWUpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG5cbiAgICAgICAgeyFjb252ZXJzYXRpb25JZCB8fCBpc0ZpbmFsaXplZCA/IChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXtpbnB1dENvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7Li4uc2VuZEJ1dHRvblN0eWxlLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICc0OHB4JywgYm9yZGVyUmFkaXVzOiAnMTZweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBmb250RmFtaWx5LCBmb250U2l6ZX19XG4gICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVN0YXJ0Q29udmVyc2F0aW9ufVxuICAgICAgICAgICAgICBkaXNhYmxlZD17aXNMb2FkaW5nfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7dCgnYnV0dG9ucy5zdGFydENvbnZlcnNhdGlvbicpfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBwZW5kaW5nRm9ybSAmJiBmb3JtRGlzcGxheSA9PT0gJ2Zvb3RlcicgPyAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgLi4uaW5wdXRDb250YWluZXJTdHlsZSxcbiAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgYm9yZGVyVG9wOiAnMXB4IHNvbGlkICNlNWU3ZWInLFxuICAgICAgICAgIH19PlxuICAgICAgICAgICAgPER5bmFtaWNGb3JtTWVzc2FnZVxuICAgICAgICAgICAgICBzY2hlbWE9e3BlbmRpbmdGb3JtLnNjaGVtYX1cbiAgICAgICAgICAgICAgb25TdWJtaXQ9eyhkYXRhKSA9PiBoYW5kbGVGb3JtU3VibWl0KGRhdGEsIHBlbmRpbmdGb3JtLmluZGV4KX1cbiAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IGhhbmRsZUZvcm1DYW5jZWwocGVuZGluZ0Zvcm0uaW5kZXgpfVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRpbmc9e3N1Ym1pdHRpbmdGb3JtSW5kZXggPT09IHBlbmRpbmdGb3JtLmluZGV4fVxuICAgICAgICAgICAgICBpc1N1Ym1pdHRlZD17ZmFsc2V9XG4gICAgICAgICAgICAgIHByaW1hcnlDb2xvcj17cHJpbWFyeUNvbG9yfVxuICAgICAgICAgICAgICBmb250RmFtaWx5PXtmb250RmFtaWx5fVxuICAgICAgICAgICAgICB2YXJpYW50PVwiZm9vdGVyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ2EtaW5wdXQtZGlzY2xhaW1lclwiIHN0eWxlPXtkaXNjbGFpbWVyU3R5bGV9PlxuICAgICAgICAgICAgICAgIHthZ2VudERpc2NsYWltZXJDb250ZW50fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0gc3R5bGU9e2lucHV0Q29udGFpbmVyU3R5bGV9PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e2lucHV0V3JhcHBlclN0eWxlfT5cbiAgICAgICAgICAgICAge3VzZUZpbGUgJiYgKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17YXR0YWNoQnV0dG9uU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQXR0YWNoXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gZmlsZUlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKCl9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxQYXBlcmNsaXAgc2l6ZT17MjJ9IGNvbG9yPVwiIzc1NzU3NVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnbm9uZScgfX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUZpbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdD17YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCcpIHx8ICcqLyonfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgcmVmPXt0ZXh0QXJlYVJlZn1cbiAgICAgICAgICAgICAgICBzdHlsZT17dGV4dEFyZWFTdHlsZX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJnYS10ZXh0YXJlYS1ub3NiXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17aW5wdXRWYWx1ZX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldElucHV0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoaW5wdXRWYWx1ZS50cmltKCkgIT09ICcnIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA+IDApICYmICFpc0FnZW50VHlwaW5nICYmICFoYXNQZW5kaW5nRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2lucHV0UGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb252ZXJzYXRpb25JZCB8fCBpc0ZpbmFsaXplZCB8fCBoYXNQZW5kaW5nRm9ybX1cbiAgICAgICAgICAgICAgICByb3dzPXsxfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyaWdodEFjdGlvbkNvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICAgICAgICB7ISh1c2VBdWRpbyAmJiBpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSAmJiAoXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyAuLi5zZW5kQnV0dG9uU3R5bGUsIC4uLihpc1NlbmREaXNhYmxlZCA/IHNlbmRCdXR0b25EaXNhYmxlZFN0eWxlIDoge30pIH19XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1NlbmREaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPEFycm93VXAgc2l6ZT17MTh9IHN0cm9rZVdpZHRoPXszfSBjb2xvcj1cIiNmZmZmZmZcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIHt1c2VBdWRpbyAmJiBpbnB1dFZhbHVlLnRyaW0oKSA9PT0gJycgJiYgYXR0YWNobWVudHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8Vm9pY2VJbnB1dFxuICAgICAgICAgICAgICAgICAgb25BdWRpb1JlYWR5PXthc3luYyAoYmxvYjogQmxvYiwgZm9ybWF0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BsYXlpbmdBdWRpbyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzZW5kQXVkaW9NZXNzYWdlKGJsb2IsIGZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGhhbmRsZWQgaW5zaWRlIHNlbmRBdWRpb01lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BsYXlpbmdBdWRpbyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvbkVycm9yPXtoYW5kbGVWb2ljZUVycm9yfVxuICAgICAgICAgICAgICAgICAgdGhlbWU9e3RoZW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAge2FnZW50RGlzY2xhaW1lckNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdhLWlucHV0LWRpc2NsYWltZXJcIiBzdHlsZT17ZGlzY2xhaW1lclN0eWxlfT5cbiAgICAgICAgICAgICAgICB7YWdlbnREaXNjbGFpbWVyQ29udGVudH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9e2NvbmZpcm1PdmVybGF5U3R5bGV9PlxuICAgICAgICA8ZGl2IHN0eWxlPXtjb25maXJtRGlhbG9nU3R5bGV9PlxuICAgICAgICAgIDxoMyBzdHlsZT17e2ZvbnRGYW1pbHksIG1hcmdpblRvcDogMH19Pnt0KCdkaWFsb2cucmVzZXRDb252ZXJzYXRpb24udGl0bGUnKX08L2gzPlxuICAgICAgICAgIDxwIHN0eWxlPXt7Zm9udEZhbWlseSwgZm9udFNpemV9fT57dCgnZGlhbG9nLnJlc2V0Q29udmVyc2F0aW9uLm1lc3NhZ2UnKX08L3A+XG4gICAgICAgICAgPGRpdiBzdHlsZT17Y29uZmlybUJ1dHRvbnNTdHlsZX0+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7Li4uZ2V0Q29uZmlybUJ1dHRvblN0eWxlKGZhbHNlLCB0aGVtZVBhcmFtcyksIGNvbG9yOiB0ZXh0Q29sb3J9fSBvbkNsaWNrPXtoYW5kbGVDYW5jZWxSZXNldH0+e3QoJ2J1dHRvbnMuY2FuY2VsJyl9PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtnZXRDb25maXJtQnV0dG9uU3R5bGUodHJ1ZSwgdGhlbWVQYXJhbXMpfSBvbkNsaWNrPXtoYW5kbGVDb25maXJtUmVzZXR9Pnt0KCdidXR0b25zLnJlc2V0Jyl9PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG5cbiAgaWYgKG1vZGUgPT09ICdmbG9hdGluZycpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgeyFpc0Zsb2F0aW5nT3BlbiAmJiAoXG4gICAgICAgICAgPENoYXRCdWJibGVcbiAgICAgICAgICAgIHNob3dDaGF0PXtpc0Zsb2F0aW5nT3Blbn1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRmxvYXRpbmdPcGVuKHByZXYgPT4gIXByZXYpfVxuICAgICAgICAgICAgcHJpbWFyeUNvbG9yPXtwcmltYXJ5Q29sb3J9XG4gICAgICAgICAgICBzdHlsZT17Z2V0UG9zaXRpb25TdHlsZXMoeyBwb3NpdGlvbiwgb2Zmc2V0WCwgb2Zmc2V0WSB9KX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuXG4gICAgICAgIHtpc0Zsb2F0aW5nT3BlbiAmJiAoXG4gICAgICAgICAgPGRpdiBzdHlsZT17ZmxvYXRpbmdDb250YWluZXJTdHlsZX0gZGF0YS1nZW5hc3Npc3QtY29udGFpbmVyPVwiZmxvYXRpbmdcIj5cbiAgICAgICAgICAgIHtyZW5kZXJXaXRoUmVDYXB0Y2hhKHJlbmRlckNoYXRDb21wb25lbnQoKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8Lz5cbiAgICApO1xuICB9XG5cbiAgaWYgKG1vZGUgPT09ICdmdWxsc2NyZWVuJykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXtmbG9hdGluZ0NvbnRhaW5lclN0eWxlfSBkYXRhLWdlbmFzc2lzdC1jb250YWluZXI9XCJmdWxsc2NyZWVuXCI+XG4gICAgICAgIHtyZW5kZXJXaXRoUmVDYXB0Y2hhKHJlbmRlckNoYXRDb21wb25lbnQoKSl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlcldpdGhSZUNhcHRjaGEocmVuZGVyQ2hhdENvbXBvbmVudCgpKTtcbn07XG4iXX0=