@hivegpt/hiveai-angular 0.0.609 → 0.0.611

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.
@@ -55,6 +55,11 @@ export class ChatDrawerComponent {
55
55
  this.displayAvatarUrl = 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';
56
56
  /** When true, chat auto-scrolls to bottom when new content is added. Default: false (no auto scroll). */
57
57
  this.autoScrollOnNewMessage = false;
58
+ /** Tracks whether the user has manually scrolled up, suppressing auto-scroll until they scroll back to bottom or send a new message. */
59
+ this.userHasScrolled = false;
60
+ /** Guards against our own programmatic scrolls triggering the userHasScrolled detection. */
61
+ this.isProgrammaticScroll = false;
62
+ this.scrollListenerTimer = null;
58
63
  /** Connections list from host (e.g. from store selectConnectionsList). Each item has userId. When set, used for Connect/Request Sent/Disconnect button state. */
59
64
  this.connectionsList = [];
60
65
  /** Pending sent request user IDs from host (e.g. from store selectPendingConnectionsSentList). When set, used for Request Sent state. */
@@ -328,6 +333,17 @@ export class ChatDrawerComponent {
328
333
  return this.stripHtml(str);
329
334
  return str;
330
335
  }
336
+ /**
337
+ * Booth reps already render jobTitle in its own line;
338
+ * do not fallback to jobTitle again in the description block.
339
+ */
340
+ getBoothRepDescription(rep) {
341
+ const raw = rep?.description ?? rep?.interests ?? '';
342
+ const str = typeof raw === 'string' ? raw.trim() : String(raw ?? '').trim();
343
+ if (str && /<[a-z][\s\S]*>/i.test(str))
344
+ return this.stripHtml(str);
345
+ return str;
346
+ }
331
347
  shouldShowAttendeeReadMore(attendee) {
332
348
  // heuristic: only show toggle for reasonably long text
333
349
  return this.getAttendeeDescription(attendee).length > 90;
@@ -1787,6 +1803,8 @@ export class ChatDrawerComponent {
1787
1803
  if (!this.input || this.loading) {
1788
1804
  return;
1789
1805
  }
1806
+ // Reset auto-scroll suppression when user sends a new message
1807
+ this.userHasScrolled = false;
1790
1808
  this.chatLog.push({
1791
1809
  type: 'user',
1792
1810
  message: this.processMessageForDisplay(this.input),
@@ -1810,6 +1828,8 @@ export class ChatDrawerComponent {
1810
1828
  if (!inputMsg || this.loading) {
1811
1829
  return;
1812
1830
  }
1831
+ // Reset auto-scroll suppression when user sends a new message
1832
+ this.userHasScrolled = false;
1813
1833
  try {
1814
1834
  chat.relatedListItems = [];
1815
1835
  this.cdr.detectChanges();
@@ -2183,30 +2203,41 @@ export class ChatDrawerComponent {
2183
2203
  }
2184
2204
  this.cdr.detectChanges();
2185
2205
  }
2186
- scrollToBottom(force = false) {
2206
+ scrollToBottom(force = false, smooth = true) {
2187
2207
  if (!force && !this.autoScrollOnNewMessage) {
2188
2208
  return;
2189
2209
  }
2210
+ if (this.userHasScrolled) {
2211
+ return;
2212
+ }
2190
2213
  if (!this.chatMain?.nativeElement)
2191
2214
  return;
2192
- let counter = 0;
2193
- const interval = setInterval(() => {
2194
- this.chatMain.nativeElement.scrollTop =
2195
- this.chatMain.nativeElement.scrollHeight;
2196
- if (counter++ > 5)
2197
- clearInterval(interval);
2198
- }, 5);
2215
+ const el = this.chatMain.nativeElement;
2216
+ this.isProgrammaticScroll = true;
2217
+ el.scrollTo({
2218
+ top: el.scrollHeight,
2219
+ behavior: smooth ? 'smooth' : 'auto',
2220
+ });
2221
+ // Release the guard after the smooth scroll settles
2222
+ setTimeout(() => { this.isProgrammaticScroll = false; }, smooth ? 400 : 50);
2199
2223
  }
2200
2224
  /** Scrolls the chat container so the top of the AI message with the given id is visible. */
2201
2225
  scrollToAiMessage(messageId) {
2226
+ if (this.userHasScrolled)
2227
+ return;
2202
2228
  if (!this.chatMain?.nativeElement)
2203
2229
  return;
2204
2230
  const container = this.chatMain.nativeElement;
2205
2231
  const el = container.querySelector(`[data-msg-id="${messageId}"]`);
2206
2232
  if (!el)
2207
2233
  return;
2208
- const offset = el.getBoundingClientRect().top - container.getBoundingClientRect().top;
2209
- container.scrollTop = container.scrollTop + offset - 8;
2234
+ const targetTop = el.getBoundingClientRect().top - container.getBoundingClientRect().top;
2235
+ this.isProgrammaticScroll = true;
2236
+ container.scrollTo({
2237
+ top: container.scrollTop + targetTop - 8,
2238
+ behavior: 'smooth',
2239
+ });
2240
+ setTimeout(() => { this.isProgrammaticScroll = false; }, 400);
2210
2241
  }
2211
2242
  focusOnTextarea() {
2212
2243
  setTimeout(() => {
@@ -2222,6 +2253,21 @@ export class ChatDrawerComponent {
2222
2253
  }
2223
2254
  }
2224
2255
  ngAfterViewInit() {
2256
+ // Detect user manual scroll to suppress auto-scroll (debounced, ignores programmatic scrolls)
2257
+ if (this.chatMain?.nativeElement) {
2258
+ this.chatMain.nativeElement.addEventListener('scroll', () => {
2259
+ if (this.isProgrammaticScroll)
2260
+ return;
2261
+ clearTimeout(this.scrollListenerTimer);
2262
+ this.scrollListenerTimer = setTimeout(() => {
2263
+ const el = this.chatMain?.nativeElement;
2264
+ if (!el)
2265
+ return;
2266
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
2267
+ this.userHasScrolled = !atBottom;
2268
+ }, 100);
2269
+ });
2270
+ }
2225
2271
  // Check if the drawer is initially open and apply overflow hidden to body if so
2226
2272
  if (this.drawer.opened) {
2227
2273
  this.setBodyOverflow();
@@ -3084,7 +3130,7 @@ export class ChatDrawerComponent {
3084
3130
  }
3085
3131
  else {
3086
3132
  this.cdr.markForCheck();
3087
- setTimeout(() => this.scrollToBottom(true), 0);
3133
+ setTimeout(() => this.scrollToBottom(true, false), 0);
3088
3134
  }
3089
3135
  break;
3090
3136
  }
@@ -3115,7 +3161,15 @@ export class ChatDrawerComponent {
3115
3161
  this.showFeedBackIconsIndex = this.chatLog.length - 1;
3116
3162
  this.activeAskMessageId = '';
3117
3163
  this.isChatingWithAi = false;
3118
- this.scrollToBottom();
3164
+ // For card responses (tool results), scroll to the message text bubble
3165
+ // instead of the very bottom — avoids cards pushing the view too far down
3166
+ if (hasCardResponse && messageId) {
3167
+ this.cdr.markForCheck();
3168
+ setTimeout(() => this.scrollToAiMessage(messageId), 30);
3169
+ }
3170
+ else {
3171
+ this.scrollToBottom();
3172
+ }
3119
3173
  this.focusOnTextarea();
3120
3174
  this.cdr.markForCheck();
3121
3175
  break;
@@ -3232,6 +3286,7 @@ export class ChatDrawerComponent {
3232
3286
  return Object.keys(obj).map((key) => ({ key, value: obj[key] }));
3233
3287
  }
3234
3288
  startNewConversation() {
3289
+ this.userHasScrolled = false;
3235
3290
  this.conversationKey = this.conversationService.getKey(this.botId, true, this.eventId);
3236
3291
  this.chatLog = [this.chatLog[0]];
3237
3292
  this.isChatingWithAi = false;
@@ -3636,10 +3691,10 @@ ChatDrawerComponent.WINDOWS_TZ_IANA_MAP = {
3636
3691
  '(UTC-08:00) Pacific Time (US & Canada)': 'America/Los_Angeles',
3637
3692
  };
3638
3693
  ChatDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatDrawerComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BotsService }, { token: i0.ChangeDetectorRef }, { token: i3.HttpClient }, { token: i4.DomSanitizer }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i5.ConversationService }, { token: i6.TranslationService }, { token: i7.VoiceAgentService }, { token: i8.Overlay }, { token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i9.PlatformTokenRefreshService }], target: i0.ɵɵFactoryTarget.Component });
3639
- ChatDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChatDrawerComponent, selector: "hivegpt-chat-drawer-package", inputs: { copilotName: "copilotName", firstName: "firstName", lastName: "lastName", apiKey: "apiKey", bgBubbleAi: "bgBubbleAi", bgBubbleUser: "bgBubbleUser", bgGradient: "bgGradient", botName: "botName", botSkills: "botSkills", botId: "botId", orgId: "orgId", closeButtonColor: "closeButtonColor", closeButtonbgColor: "closeButtonbgColor", credentials: "credentials", dateTimeColor: "dateTimeColor", dateTextColor: "dateTextColor", eventId: "eventId", eventUrl: "eventUrl", eventToken: "eventToken", workspaceToken: "workspaceToken", s27Token: "s27Token", eventName: "eventName", botIcon: "botIcon", userAvatarUrl: "userAvatarUrl", formFieldBgColor: "formFieldBgColor", formFieldTextColor: "formFieldTextColor", fullView: "fullView", gradientColors: "gradientColors", greeting: "greeting", messageTextColorAi: "messageTextColorAi", messageTextColorUser: "messageTextColorUser", rules: "rules", sendButtonColor: "sendButtonColor", sendButtonTextColor: "sendButtonTextColor", showClose: "showClose", thumbsDownMessages: "thumbsDownMessages", thumbsUpMessage: "thumbsUpMessage", timezone: "timezone", unknownResponses: "unknownResponses", useOpenAi: "useOpenAi", userId: "userId", isDev: "isDev", autoScrollOnNewMessage: "autoScrollOnNewMessage", baseUrl: "baseUrl", connectionsList: "connectionsList", pendingSentRequestUserIds: "pendingSentRequestUserIds", isConnectionsEnabled: "isConnectionsEnabled", isUnEvent: "isUnEvent", againButtonColor: "againButtonColor", againButtonTextColor: "againButtonTextColor" }, outputs: { feedbackEvent: "feedbackEvent", onCloseEvent: "onCloseEvent", openPage: "openPage", sessionActions: "sessionActions", sessionActionBlocked: "sessionActionBlocked", closeBot: "closeBot", connectWithUser: "connectWithUser", viewSpeakerProfile: "viewSpeakerProfile", viewBooth: "viewBooth", scheduleMeeting: "scheduleMeeting", refreshToken: "refreshToken", tokensRefreshed: "tokensRefreshed", openSupport: "openSupport" }, viewQueries: [{ propertyName: "chatMain", first: true, predicate: ["chatMain"], descendants: true }, { propertyName: "myInput", first: true, predicate: ["myInput"], descendants: true }, { propertyName: "drawer", first: true, predicate: ["drawer"], descendants: true }, { propertyName: "sourcesDrawer", first: true, predicate: ["sourcesDrawer"], descendants: true }, { propertyName: "editorsDrawer", first: true, predicate: ["editorsDrawer"], descendants: true }, { propertyName: "closePlaygroundButtons", predicate: ["closeplaygroundbutton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <button\n *ngIf=\"isShowEditorButton && !checkForCop29BotId()\"\n (click)=\"openOuterEditor()\"\n class=\"fixed-btn\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n create\n </span>\n Editor\n</button> -->\n\n<button\n *ngIf=\"!isShowEditorButton\"\n (click)=\"onCloseEditor()\"\n class=\"fixed-btn-close\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n close\n </span>\n {{ getTranslation(\"Close\") }}\n</button>\n\n<mat-drawer-container\n class=\"hivegpt-chat-bot-wrapper\"\n [ngClass]=\"{ 'mat-drawer-container-has-open': isDrawerOpen }\"\n [class.ios-device]=\"isIOSDevice\"\n [hasBackdrop]=\"hasBackdropValue\"\n>\n <mat-drawer\n class=\"drawer\"\n #drawer\n [position]=\"'start'\"\n [mode]=\"'over'\"\n opened=\"true\"\n [class.full-width-drawer]=\"fullView\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"chat-main\">\n <!-- <div class=\"chat-header\">\n <h2> -->\n <!-- {{eventName}} -->\n <!-- </h2> -->\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\n <span class=\"material-symbols-outlined\">\n close\n </span>\n </button> -->\n <!-- </div> -->\n\n <div class=\"innerChat\" #chatMain>\n <div (click)=\"startNewConversation()\" class=\"new-conversationbutton2\">\n {{ getTranslation(\"New Chat\") }}\n <span\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14.061\"\n height=\"14.261\"\n viewBox=\"0 0 14.061 14.261\"\n >\n <path\n id=\"Path_164\"\n data-name=\"Path 164\"\n d=\"M10.146,5.075H4.531A1.544,1.544,0,0,0,3,6.631v7.262A1.544,1.544,0,0,0,4.531,15.45h7.146a1.544,1.544,0,0,0,1.531-1.556V8.187m-7.146,4.15L15.25,3m0,0H11.677M15.25,3V6.631\"\n transform=\"translate(-2.25 -1.939)\"\n fill=\"none\"\n stroke=\"#06f\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.5\"\n />\n </svg>\n </span>\n </div>\n <div\n (click)=\"closeBot.emit()\"\n class=\"chat-close-button\"\n role=\"button\"\n [attr.aria-label]=\"getTranslation('Close') || 'Close'\"\n [attr.title]=\"getTranslation('Close') || 'Close'\"\n >\n \n <span class=\"chat-close-button-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div class=\"bot-sticky-header-chat\">\n <div class=\"title_chat\">\n <h2>\n <p>\n {{ getTranslation(botName) }}\n <!-- <svg\n *ngIf=\"!checkForCop29BotId()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"31.499\"\n height=\"31.501\"\n viewBox=\"0 0 31.499 31.501\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M33.685,7.83a1.125,1.125,0,0,0-.925-1.036,49.227,49.227,0,0,1-14.3-4.444,1.125,1.125,0,0,0-.927,0A49.226,49.226,0,0,1,3.24,6.794,1.125,1.125,0,0,0,2.315,7.83a27.621,27.621,0,0,0,1.718,11.9A24.572,24.572,0,0,0,9.07,27.641a25.712,25.712,0,0,0,8.513,6.028,1.125,1.125,0,0,0,.844,0,25.712,25.712,0,0,0,8.513-6.028,24.572,24.572,0,0,0,5.027-7.911,27.621,27.621,0,0,0,1.718-11.9Zm-9.211,5.281-7.791,9a1.125,1.125,0,0,1-.8.389h-.046a1.125,1.125,0,0,1-.788-.322L11.587,18.79a1.125,1.125,0,1,1,1.575-1.607l2.6,2.552,7.01-8.1a1.125,1.125,0,0,1,1.7,1.472Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg> -->\n </p>\n <span *ngIf=\"!checkForCop29BotId()\">\n <p class=\"small-title\">\n {{ getTranslation(\"AI-powered\")\n }}<span>{{ getTranslation(\"copilot\") }}</span>\n </p>\n </span>\n </h2>\n </div>\n <div class=\"chatType\" style=\"display: none\">\n <h4 class=\"labelChat\">Choose a conversation style</h4>\n <ul>\n <li (click)=\"changeTemperature(0)\">\n <button [ngClass]=\"{ active: temperature === 0 }\">\n <span class=\"top-section-title\"> More Creative </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{ active: temperature === 1 }\">\n <span class=\"top-section-title\"> More Balanced </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{ active: temperature === 2 }\">\n <span class=\"top-section-title\"> More Precise </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div\n id=\"botAllChat\"\n class=\"chat\"\n [ngClass]=\"{\n botUser: chat?.type === 'user',\n botAi: chat?.type !== 'user'\n }\"\n [attr.data-msg-id]=\"chat?._id || null\"\n *ngFor=\"let chat of chatLog; let i = index\"\n >\n <div class=\"chat-box\" *ngIf=\"!(i === 0 && botSkills)\">\n <div class=\"message\">\n <div\n class=\"time-cta\"\n [ngClass]=\"{\n 'time-cta din': showFeedBackIconsIndex === i,\n 'time-cta': showFeedBackIconsIndex != i\n }\"\n >\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"chat?.type === 'ai' && !(i === 0 && botSkills)\"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span style=\"color: #000 !important;\">{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"\n chat?.type === 'session_cards' ||\n chat?.type === 'attendee_cards'\n \"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\n <div class=\"user-Box\">\n <div class=\"dateTime\">\n <span>{{ getTranslation(\"You\") }}</span>\n {{ chat?.time }}\n </div>\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"userAvatarUrl\"\n [src]=\"userAvatarUrl\"\n alt=\"You\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!userAvatarUrl\"\n class=\"chat-avatar-initials chat-avatar-initials-user\"\n >{{ getUserIdInitials() }}</span\n >\n </div>\n </div>\n <div class=\"bards\">\n <div\n class=\"bars\"\n *ngIf=\"\n chat?.WorkflowExecutionId ||\n chat?.showWorkflowExecutionLoader\n \"\n >\n <button\n class=\"icon-button\"\n (click)=\"\n showWorkflowHistoryDetails(chat.WorkflowExecutionId)\n \"\n >\n <i class=\"fas fa-bars\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"researchingCard\"\n *ngIf=\"\n (chat?.searchTerms && chat?.searchTerms.length > 0) ||\n (chat?.sourcesList && chat?.sourcesList?.length > 0)\n \"\n >\n <div\n class=\"card-header d-flex align-items-center\"\n (click)=\"toggleCollapse()\"\n >\n <span class=\"icon\"\n ><i class=\"bx bx-plus-circle bx-sm\"></i\n ></span>\n <span class=\"ml-2\"\n >Researching\n <i\n id=\"toggleIcon\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fa-chevron-down': isCollapsed,\n 'fa-chevron-up': !isCollapsed\n }\"\n ></i\n ></span>\n </div>\n <div\n *ngIf=\"chat?.searchTerms && chat?.searchTerms.length > 0\"\n [ngClass]=\"{ collapse: isCollapsed }\"\n >\n <ul class=\"list-group list-group-flush uptList\">\n <li\n *ngFor=\"let term of chat?.searchTerms\"\n class=\"list-group-item\"\n >\n Searching for\n <strong>{{ term }}</strong>\n </li>\n </ul>\n\n <h5\n class=\"mt-2\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <i class=\"bx bx-unite\"></i> Sources\n </h5>\n <div\n class=\"sources-container\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <div\n class=\"source-card\"\n *ngFor=\"\n let source of chat?.displayedSources;\n let i = index\n \"\n >\n <div>\n <div class=\"source-title\">{{ source.title }}</div>\n <div class=\"source-url\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <div class=\"popup\">\n <div\n class=\"source-url\"\n (click)=\"openLinkInNewTab(source.link)\"\n >\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">\n {{ source.title }}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">\n {{ source.desc }}\n </p>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"\n chat?.remainingSources &&\n chat?.remainingSources.length > 0\n \"\n >\n <div\n class=\"source-card\"\n (click)=\"onCardClick(chat?.sourcesList)\"\n >\n <div>\n <div class=\"source-title\">\n <img\n *ngFor=\"\n let source of chat?.remainingSources;\n let i = index\n \"\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n </div>\n <div class=\"source-url\">\n View {{ chat?.remainingSources.length }} more\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Session cards (from get_event_sessions tool, same as React Native) -->\n <div\n class=\"session-cards-section\"\n *ngIf=\"\n chat?.type === 'session_cards' &&\n chat?.sessionCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"session-cards-container\">\n <div\n *ngFor=\"\n let session of getVisibleSessionCards(chat);\n let idx = index\n \"\n class=\"session-card-item\"\n [class.session-card-item-ondemand]=\"isSessionOndemand(session)\"\n >\n <!-- OnDemand design: pill, Available Anytime, title, description -->\n <ng-container *ngIf=\"isSessionOndemand(session)\">\n <span class=\"session-card-ondemand-badge\">{{ getTranslation('ON DEMAND') || 'ON DEMAND' }}</span>\n <div class=\"session-card-ondemand-available\">{{ getTranslation('Available Anytime') || 'Available Anytime' }}</div>\n <div class=\"session-card-title session-card-ondemand-title\">{{ session.title }}</div>\n <div\n class=\"session-card-description session-card-ondemand-desc\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-actions-row\"\n *ngIf=\"session.session && getSessionRoleButtons(session).length > 0\"\n >\n <div class=\"speakers-UIcard\"></div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"role.action === 'join'\"\n [class.session-card-btn-secondary]=\"role.action === 'watch'\"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n <!-- Default (Live/Breakout) design: date badge, room/time, title, meta, description, actions -->\n <ng-container *ngIf=\"!isSessionOndemand(session)\">\n <div class=\"session-card-header\">\n <div class=\"session-card-date-badge\">\n <ng-container *ngIf=\"session.dateDay || session.dateMonth\">\n <span class=\"session-card-date-day\">{{\n session.dateDay\n }}</span>\n <span class=\"session-card-date-month\">{{\n session.dateMonth\n }}</span>\n </ng-container>\n <span\n *ngIf=\"!session.dateDay && !session.dateMonth\"\n class=\"session-card-date-na\"\n >{{ getTranslation('N/A') || 'N/A' }}</span>\n </div>\n <div class=\"session-card-room-time\">\n <div\n class=\"session-card-room\"\n *ngIf=\"session.room\"\n >\n {{ session.room }}\n </div>\n <div\n class=\"session-card-time\"\n *ngIf=\"session.timeRangeWithTz || session.timeRange\"\n >\n {{ session.timeRangeWithTz || session.timeRange }}\n </div>\n </div>\n </div>\n <div class=\"session-card-title\">{{ session.title }}</div>\n <div\n class=\"session-card-meta\"\n *ngIf=\"(session.organizer && session.organizer.length) || (session.meetingType && session.meetingType.length)\"\n >\n <div class=\"session-card-meta-row\" *ngIf=\"session.organizer && session.organizer.length\">\n <span class=\"session-card-meta-label\">{{\n (getTranslation(\"Organizer\") || \"Organizer\") + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.organizer }}</span>\n </div>\n <!-- <div class=\"session-card-meta-row\" *ngIf=\"session.timeZoneDisplay\">\n <span class=\"session-card-meta-label\">{{\n getTranslation(\"Time zone\") || \"Time zone\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.timeZoneDisplay }}</span>\n </div> -->\n <div class=\"session-card-meta-row\" *ngIf=\"session.meetingType && session.meetingType.length\">\n <span class=\"session-card-meta-label\">{{\n getSessionTypeLabel() + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.meetingType }}</span>\n </div>\n </div>\n <div\n class=\"session-card-description\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-status\"\n *ngIf=\"\n (session.statusText && session.statusText.length) &&\n getSessionRoleButtons(session).length > 0\n \"\n >\n <span class=\"session-card-status-bullet\"></span>\n {{ session.statusText }}\n </div>\n <!-- <div\n class=\"session-card-when-disable\"\n *ngIf=\"\n session.session?.sessionRoles?.length > 0 &&\n !isSessionOndemand(session) &&\n !session.session?.isExpire &&\n !canPerformSessionAction(session)\n \"\n >\n {{ getTranslation(\"You can join/watch at the starting time\") || \"You can join/watch at the starting time\" }}\n </div> -->\n \n <div\n class=\"session-card-actions-row\"\n *ngIf=\"\n session.session &&\n (getSessionRoleButtons(session).length > 0 || hasSessionCardSpeakers(session))\n \"\n >\n <div class=\"speakers-UIcard\">\n <ng-container\n *ngIf=\"\n (session?.speakersList || session?.session?.speakersList || []).length\n as _speakerCount\n \"\n >\n <ng-container\n *ngFor=\"\n let sp of (session?.speakersList || session?.session?.speakersList || []);\n let i = index\n \"\n >\n <ng-container *ngIf=\"i < 3\">\n <div class=\"speaker\" *ngIf=\"getSpeakerPhotoUrl(sp); else speakerInitials\">\n <img\n [src]=\"getSpeakerPhotoUrl(sp)!\"\n [alt]=\"getSpeakerDisplayName(sp) || 'Speaker'\"\n />\n </div>\n <ng-template #speakerInitials>\n <div class=\"speaker initials\">\n {{ getSpeakerInitials(sp) }}\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n <div class=\"speaker initials\" *ngIf=\"_speakerCount > 3\">\n +{{ _speakerCount - 3 }}\n </div>\n </ng-container>\n </div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"\n role.action === 'join'\n \"\n [class.session-card-btn-secondary]=\"\n role.action === 'watch'\n \"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL >\n 4 &&\n !expandedSessionCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSessionCards(chat)\"\n >\n Show\n {{\n (chat?.sessionCards?.length || 0) - SESSION_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL ===\n 1\n ? getTranslation(\"session\") || \"session\"\n : getTranslation(\"sessions\") || \"sessions\"\n }}\n </button>\n </div>\n\n <!-- Attendee cards (from get_event_attendees tool, same as React Native) -->\n <div\n class=\"attendee-cards-section\"\n *ngIf=\"\n chat?.type === 'attendee_cards' &&\n chat?.attendeeCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let attendee of getVisibleAttendeeCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(attendee)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(attendee) && attendee.photo\n ? 'url(' + attendee.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(attendee)\">\n <video\n #attendeeVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(attendee) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, attendee)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, attendee, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(attendee)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, attendee)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, attendee)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(attendee) && !attendee.photo\"\n >\n {{ getAttendeeInitials(attendee.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ attendee.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"attendee.company\"\n >\n {{ attendee.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, attendee)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, attendee)\"\n *ngIf=\"getAttendeeDescription(attendee)\"\n >\n {{ getAttendeeDescription(attendee) }}\n </div>\n \n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(attendee.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!attendee.id\"\n [attr.title]=\"\n !attendee.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation(\"View Profile\") || \"View Profile\" }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL >\n 4 &&\n !expandedAttendeeCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandAttendeeCards(chat)\"\n >\n Show\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL\n }}\n more\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL ===\n 1\n ? getTranslation(\"attendee\") || \"attendee\"\n : getTranslation(\"attendees\") || \"attendees\"\n }}\n </button>\n </div>\n\n <!-- Speaker cards (from get_event_speakers tool, same layout/behavior as attendee cards) -->\n <div\n class=\"speaker-cards-section\"\n *ngIf=\"\n chat?.type === 'speaker_cards' &&\n chat?.speakerCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let speaker of getVisibleSpeakerCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(speaker)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(speaker) && speaker.photo\n ? 'url(' + speaker.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(speaker)\">\n <video\n #speakerVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(speaker) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, speaker)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, speaker, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(speaker)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, speaker)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, speaker)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(speaker) && !speaker.photo\"\n >\n {{ getAttendeeInitials(speaker.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ speaker.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.jobTitle\"\n >\n {{ speaker.jobTitle }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.company\"\n >\n {{ speaker.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, speaker)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, speaker)\"\n *ngIf=\"getAttendeeDescription(speaker)\"\n >\n {{ getAttendeeDescription(speaker) }}\n </div>\n \n\n <div class=\"attendee-buttons\">\n \n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!speaker.id\"\n [attr.title]=\"\n !speaker.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n chat?.type === 'speaker_cards'\n ? viewSpeakerProfile.emit({\n speaker,\n speakers: chat.speakerCards || []\n })\n : speaker.id &&\n connectWithUser.emit({\n userId: speaker.id,\n viewProfile: true\n })\n \"\n >\n {{\n getTranslation('View Profile') || 'View Profile'\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL >\n 4 &&\n !expandedSpeakerCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSpeakerCards(chat)\"\n >\n Show\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL\n }}\n more\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL ===\n 1\n ? getTranslation('speaker') || 'speaker'\n : getTranslation('speakers') || 'speakers'\n }}\n </button>\n </div>\n\n <!-- Sponsor cards (from get_event_sponsors tool, booth-rep style) -->\n <div\n class=\"sponsor-cards-section\"\n *ngIf=\"\n chat?.type === 'sponsor_cards' &&\n chat?.sponsorCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"booth-rep-card-grid\">\n <div\n *ngFor=\"\n let sponsor of getVisibleSponsorCards(chat);\n let idx = index\n \"\n class=\"booth-rep-card\"\n >\n <div class=\"booth-rep-card-logo\">\n <span\n class=\"booth-rep-card-logo-placeholder\"\n *ngIf=\"!sponsor.logoUrl\"\n >\n {{ sponsor.boothTitle ? sponsor.boothTitle.charAt(0) : (sponsor.name ? sponsor.name.charAt(0) : '') }}\n </span>\n <img\n *ngIf=\"sponsor.logoUrl\"\n [src]=\"sponsor.logoUrl\"\n [alt]=\"sponsor.boothTitle || sponsor.name\"\n />\n </div>\n <h3 class=\"booth-rep-card-title\">\n {{ sponsor.boothTitle || sponsor.name }}\n </h3>\n <p\n class=\"booth-rep-card-desc\"\n *ngIf=\"sponsor.description\"\n >\n {{ sponsor.description }}\n </p>\n <button\n type=\"button\"\n class=\"booth-rep-card-btn\"\n (click)=\"viewBooth.emit({ boothId: sponsor.boothID, boothUrl: sponsor.url, sponsor })\"\n >\n {{ getTranslation('View Sponsor') || 'View Sponsor' }}\n </button>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL >\n 4 &&\n !expandedSponsorCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSponsorCards(chat)\"\n >\n Show\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL ===\n 1\n ? getTranslation('sponsor') || 'sponsor'\n : getTranslation('sponsors') || 'sponsors'\n }}\n </button>\n </div>\n\n <!-- Booth representative cards (from get_booth_representatives tool, same design as attendee cards) -->\n <div\n class=\"attendee-cards-section booth-rep-cards-section\"\n *ngIf=\"\n chat?.type === 'booth_rep_cards' &&\n chat?.boothRepCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let rep of getVisibleBoothRepCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [style.background-image]=\"rep.photo ? 'url(' + rep.photo + ')' : null\"\n >\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!rep.photo\"\n >\n {{ getAttendeeInitials(rep.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ rep.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.company\"\n >\n {{ rep.company }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.jobTitle\"\n >\n {{ rep.jobTitle }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, rep)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, rep)\"\n *ngIf=\"getAttendeeDescription(rep)\"\n >\n {{ getAttendeeDescription(rep) }}\n </div>\n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(rep.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n *ngIf=\"rep.id\"\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [attr.title]=\"getTranslation('View Profile') || 'View Profile'\"\n (click)=\"\n connectWithUser.emit({\n userId: rep.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation('View Profile') || 'View Profile' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL >\n 4 &&\n !expandedBoothRepCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandBoothRepCards(chat)\"\n >\n Show\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL\n }}\n more\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL ===\n 1\n ? getTranslation('representative') || 'representative'\n : getTranslation('representatives') || 'representatives'\n }}\n </button>\n </div>\n\n <div\n class=\"chat-bubble-wrap\"\n *ngIf=\"\n (chat?.type === 'ai' || chat?.type === 'user') &&\n !(i === 0 && botSkills)\n \"\n [ngStyle]=\"{\n background:\n chat?.type === 'ai'\n ? bgBubbleAi || '#fff'\n : chat?.type === 'user'\n ? bgBubbleUser || '#183988'\n : 'transparent',\n color:\n chat?.type === 'ai'\n ? '#000 !important'\n : '#fff !important'\n }\"\n >\n <div id=\"messageText_{{ i }}\" class=\"chat-bubble-content\">\n <div\n *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\"\n [ngClass]=\"{\n 'SearchTitle ai': chat?.type === 'ai',\n 'SearchTitle user': chat?.type === 'user'\n }\"\n [ngStyle]=\"{\n background: 'transparent',\n color:\n chat?.type === 'ai' && messageTextColorAi\n ? messageTextColorAi\n : chat?.type === 'user'\n ? messageTextColorUser || '#fff'\n : 'defaultColor'\n }\"\n [innerHTML]=\"chat?.message\"\n ></div>\n </div>\n </div>\n\n <div\n class=\"progress-container\"\n *ngIf=\"chat?.showWorkflowExecutionLoader\"\n >\n <div class=\"circular-loader\">\n <div\n class=\"loader-spinner\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n [ngStyle]=\"{\n transform: 'rotate(' + percentage * 3.6 + 'deg)'\n }\"\n ></div>\n <div\n class=\"checkmark\"\n *ngIf=\"currentWorkflowActionProgress == 100\"\n >\n <svg viewBox=\"0 0 52 52\">\n <circle\n class=\"checkmark-circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkmark-check\"\n fill=\"none\"\n d=\"M14 27l7 7 16-16\"\n />\n </svg>\n </div>\n\n <div\n class=\"loader-text\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n >\n {{ currentWorkflowActionProgress }}%\n </div>\n </div>\n <div class=\"loader-label\">{{ currentWorkflowAction }}...</div>\n </div>\n\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.graphs &&\n chat?.graphs.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Graphs\n <i\n (click)=\"toggleCollapseFGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForFGraph,\n 'fas fa-chevron-up': !isCollapsedForFGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.graphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForFGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n <ng-container *ngIf=\"!checkForCop29BotId()\">\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.executionGraphs &&\n chat?.executionGraphs?.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Execution Path Diagram\n For Data Visualization Workflow\n <i\n (click)=\"toggleCollapseGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForGraph,\n 'fas fa-chevron-up': !isCollapsedForGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.executionGraphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n </ng-container>\n <div class=\"cta\" *ngIf=\"chat?.type === 'ai' && i > 0 && i === lastAiMessageIndex\">\n <div\n class=\"copyBox\"\n title=\"Copy\"\n [ngClass]=\"\n showFeedBackIconsIndex == i ? 'show-always' : 'show-hover'\n \"\n >\n <button\n title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\"\n class=\"copy\"\n [class.active]=\"chat?.copied\"\n (click)=\"handleCopyClick(i)\"\n >\n <i *ngIf=\"chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button>\n<!-- \n <button\n *ngIf=\"!checkForCop29BotId()\"\n class=\"up copy\"\n title=\"{{ chat?.isEditor ? 'Added!' : 'Add to editor' }}\"\n (click)=\"handleEditorClick(i)\"\n >\n <svg\n *ngIf=\"!chat?.isEditor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20.152\"\n height=\"20.152\"\n viewBox=\"0 0 20.152 20.152\"\n >\n <g\n id=\"Icon_feather-edit\"\n data-name=\"Icon feather-edit\"\n transform=\"translate(-2.5 -2.166)\"\n >\n <path\n id=\"Path_166\"\n data-name=\"Path 166\"\n d=\"M11.5,6H4.889A1.889,1.889,0,0,0,3,7.889v13.22A1.889,1.889,0,0,0,4.889,23h13.22A1.889,1.889,0,0,0,20,21.108V14.5\"\n transform=\"translate(0 -1.179)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n <path\n id=\"Path_167\"\n data-name=\"Path 167\"\n d=\"M21.915,3.4a2,2,0,0,1,2.833,2.833l-8.971,8.971L12,16.152l.944-3.777Z\"\n transform=\"translate(-3.334 0)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n </g>\n </svg>\n\n <i *ngIf=\"chat?.isEditor\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button> -->\n\n <button\n class=\"up copy\"\n title=\"Like\"\n [class.active]=\"chat?.liked\"\n (click)=\"handleUpClick(i)\"\n >\n <i *ngIf=\"chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\n fill=\"#17235B\"\n />\n <path\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n <i *ngIf=\"!chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n <button\n class=\"down copy\"\n title=\"Dislike\"\n [class.active]=\"chat?.unliked\"\n (click)=\"handleDownClick(i)\"\n >\n <i *ngIf=\"chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\n fill=\"#17235B\"\n />\n\n <path\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n </div>\n </div>\n <div\n class=\"Related mt-2\"\n *ngIf=\"\n showFeedBackIconsIndex === i &&\n !isChatingWithAi &&\n chat?.relatedListItems &&\n chat?.relatedListItems.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-list-check\"></i> Related\n </h5>\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\n <li (click)=\"fetchDataFor(item, chat)\">{{ item }}</li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"cta-faqs quick-prompts-extended\"\n *ngIf=\"i == 0 && quickPrompts?.length\"\n >\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\n (click)=\"sendMessageWithTile(tile.prompt)\">\n Q: {{ tile.text }}\n </div> -->\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let tile of quickPrompts\"\n (click)=\"sendMessageWithTile(tile.prompt)\"\n >\n <ng-container *ngIf=\"tile\">{{ tile.text }}</ng-container>\n </button>\n </div>\n </div>\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n </div>\n <div\n class=\"chat-bubble-wrap\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <div class=\"chat-bubble-content\">\n <div\n class=\"SearchTitle ai\"\n [innerHTML]=\"processMessageForDisplay(botSkills)\"\n ></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.suggestions?.length\">\n <h4 class=\"labelChat\">\n Here are some things EventsGPT Copilot can help you do:\n </h4>\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let suggestion of chat?.suggestions\"\n (click)=\"sendMessageWithTile(suggestion)\"\n >\n <ng-container *ngIf=\"suggestion\">{{\n suggestion\n }}</ng-container>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"\n chat?.action?.section_id == 'company_search' ||\n chat?.action?.section_id == 'user_search' ||\n chat?.action?.section_id == 'industry_company_search'\n \"\n >\n <div class=\"box\">\n <div class=\"tiktokwrapper\">\n <div\n class=\"tiktokshell\"\n *ngFor=\"let user of chat?.action.users\"\n >\n <div class=\"videoPhotobox\">\n <ng-conatiner\n *ngIf=\"user?.photoPath && !user.userVideosModel\"\n >\n <img [src]=\"user?.photoPath\" />\n </ng-conatiner>\n <ng-conatiner *ngIf=\"user.userVideosModel\">\n <app-video-player\n *ngIf=\"user?.userVideosModel\"\n [isDev]=\"isDev\"\n [currentUserId]=\"userId\"\n [videoObj]=\"user?.userVideosModel\"\n [user]=\"user\"\n [eventId]=\"eventId\"\n type=\"1\"\n >\n </app-video-player>\n </ng-conatiner>\n </div>\n\n <div\n class=\"noPhoto\"\n *ngIf=\"!user?.photoPath && !user.userVideosModel\"\n >\n <h3>\n {{ user.firstName | slice: 0 : 1\n }}{{ user.lastName | slice: 0 : 1 }}\n </h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\"></div>\n <div class=\"onshell-content\">\n <div class=\"title-shell\">\n <h3>{{ user.firstName }} {{ user.lastName }}</h3>\n <h3 class=\"companyName\">{{ user.company }}</h3>\n </div>\n <div class=\"button-shell\">\n <button\n class=\"Connectbtn\"\n (click)=\"connectToUser(user.userId)\"\n >\n {{\n canConnect(user.userId)\n ? \"Connect\"\n : canDisconnect(user.userId)\n ? \"Disconnect\"\n : \"Request\n Sent\"\n }}\n </button>\n <button\n class=\"schedulebtn\"\n (click)=\"scheduleMeetingWithUser(user)\"\n >\n Schedule\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.action?.section_id == myUpcomingSessionAction\">\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\n <div class=\"list-view\">\n <div\n class=\"session-detail-wrapper card-background-session\"\n *ngFor=\"let upcomingSession of chat?.action.content\"\n >\n <div class=\"thumbnail\">\n <img\n alt=\"Introduction to the Imaging Radar Academy\"\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\n class=\"\"\n />\n <!---->\n <!---->\n <!----><button\n class=\"play-btn color-primary\"\n title=\"Watch: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n <!---->\n </button>\n <!---->\n <!---->\n </div>\n <!---->\n <!---->\n <div class=\"content p-3\">\n <div\n class=\"d-flex justify-content-between align-items-center\"\n >\n <div class=\"d-flex flex-column\">\n <p class=\"fs-xs mb-0 body-text-color\">\n {{\n upcomingSession.dateTimeRange.start\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n -\n {{\n upcomingSession.dateTimeRange.end\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n {{ upcomingSession.timeZone.id }}\n </p>\n <!---->\n <!---->\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\n <!---->\n </div>\n <div class=\"d-flex align-items-center actions px-2\">\n <!---->\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'view-session'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n remove_red_eye\n </span>\n </button>\n\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'add-to-agenda'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n >\n <span\n class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\"\n >\n event_available\n </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button\n (click)=\"\n performSessionAction(upcomingSession.id, 'play')\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"Copy session link to share\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">\n {{ upcomingSession.title }}\n </h2>\n <div\n class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\"\n ></div>\n <ul\n class=\"speakers grid-2-cols\"\n *ngFor=\"let speakerId of upcomingSession.speakers\"\n >\n <li class=\"\">\n <div class=\"image\" title=\"Blair Wunderlich\">\n <img\n alt=\"Blair Wunderlich\"\n [src]=\"speakers[speakerId]?.photoPath\"\n class=\"\"\n />\n <!---->\n <!---->\n <!---->\n </div>\n <!---->\n <div\n class=\"content pl-3\"\n style=\"text-transform: none\"\n >\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\n {{ speakers[speakerId]?.firstName }}\n {{ speakers[speakerId]?.lastName }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.jobTitle }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.company }}\n </div>\n </div>\n <!---->\n </li>\n </ul>\n <!---->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Initial load: loading dots when fetching chat history (no \"Thinking\") -->\n <div class=\"chat bot chat-thinking chat-loading-dots\" *ngIf=\"loading && !isChatingWithAi\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Loading\") || \"Loading\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n <!-- Thinking: only when user has sent a message and AI is responding -->\n <div class=\"chat bot chat-thinking\" *ngIf=\"isChatingWithAi && !executingWorkflow\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Thinking\") || \"Thinking\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div\n *ngIf=\"openWorkflowInput && selectedWorkflow && !executingWorkflow\"\n class=\"chatFooterWrapper\"\n >\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\">\n <div class=\"agents_note_wrapper\">\n <div>\n <h6>{{ selectedWorkflow?.Name }}</h6>\n {{ selectedWorkflow?.Description }}\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"toggleWorkflows(false)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- here i need to loop through all the input fields selectedWorkflow.Trigger.InputSchema and render the input fields -->\n <!-- Form for Workflow Inputs -->\n <form\n [formGroup]=\"workflowForm\"\n (ngSubmit)=\"onWorkflowSubmit()\"\n class=\"form-container\"\n >\n <div\n *ngFor=\"let input of selectedWorkflow?.Trigger?.InputSchema\"\n class=\"form-group\"\n >\n <label>{{ input.Label }}</label>\n\n <!-- Handle Text Input or Text Area based on requirement -->\n <textarea\n *ngIf=\"input.Type === 'string'\"\n formControlName=\"{{ input.InputId }}\"\n [placeholder]=\"input.Placeholder\"\n [rows]=\"2\"\n [required]=\"input.Required\"\n class=\"form-control\"\n ></textarea>\n\n <!-- Dropdown for Select Options -->\n <select\n *ngIf=\"input.Type === 'select'\"\n formControlName=\"{{ input.InputId }}\"\n class=\"form-control\"\n >\n <option\n *ngFor=\"let option of input.Options\"\n [value]=\"option.Value\"\n >\n {{ option.Label }}\n </option>\n </select>\n </div>\n\n <!-- Submit button aligned to the right -->\n <div class=\"form-group\">\n <button type=\"submit\" class=\"btn btn-primary submit-button\">\n Submit\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n <div *ngIf=\"!openWorkflowInput\" class=\"chatFooterWrapper\">\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\" *ngIf=\"!checkForCop29BotId()\">\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\n <div class=\"dropdown-header\">\n <span>{{ getDropdownHeaderText() }}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <label (click)=\"onSelectAll()\">\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\n All\n </label>\n <label\n *ngFor=\"let agent of agents\"\n (click)=\"onAgentChange(agent)\"\n >\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\n {{ agent.agentName }}\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleWorkflows()\">\n <div class=\"dropdown-header\">\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 256 256\"\n class=\"h-5 w-5\"\n height=\"1.3em\"\n width=\"1.3em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M245.66,74.34l-32-32a8,8,0,0,0-11.32,11.32L220.69,72H192a74.49,74.49,0,0,0-28.35,6.73c-13.62,6.29-30.83,19.71-35.54,48-5.32,31.94-29.1,39.22-41,40.86a40,40,0,1,0,.18,16.06A71.65,71.65,0,0,0,108.13,178C121.75,172,139,158.6,143.89,129.31,150.65,88.77,190.34,88,192,88h28.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,74.34ZM48,200a24,24,0,1,1,24-24A24,24,0,0,1,48,200Z\"\n ></path></svg\n >&nbsp; Workflows\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isWorkflowOpen\">\n <label\n *ngFor=\"let orgWorkflow of orgWorkflows\"\n (click)=\"onWorkflowSelected(orgWorkflow)\"\n >\n {{ orgWorkflow.Name }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n \n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput /> -->\n <textarea\n [disabled]=\"isChatingWithAi\"\n class=\"form-control-1 s27-scroll chat-textarea\"\n placeholder=\"{{ getTranslation('Ask anything') }}\"\n [(ngModel)]=\"input\"\n (keydown)=\"handleKeydown($event)\"\n (input)=\"adjustTextareaHeight($event)\"\n #myInput\n ></textarea>\n\n \n\n <button\n class=\"btn cta-chat rotate\"\n (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n title=\"{{ getTranslation('Send Message') }}\"\n style=\"margin-right: 1px\"\n >\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 512 512\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\"\n ></path>\n </svg>\n <!-- SEND -->\n </button>\n\n <button\n class=\"btn cta-chat mr-1 voice-btn\"\n (click)=\"openVoiceModal()\"\n type=\"button\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n >\n <svg\n class=\"voice-btn-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <rect class=\"vbar vbar-1\" x=\"3\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-2\" x=\"7\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-3\" x=\"11\" y=\"3\" width=\"2\" height=\"18\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-4\" x=\"15\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-5\" x=\"19\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n <span class=\"voice-btn-text\">Voice</span>\n </button>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n\n <div class=\"NoteTxt\">\n <div class=\"note\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12.882\"\n height=\"12.883\"\n viewBox=\"0 0 12.882 12.883\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M15.106,4.532a.46.46,0,0,0-.378-.424A20.132,20.132,0,0,1,8.881,2.291a.46.46,0,0,0-.379,0A20.132,20.132,0,0,1,2.655,4.108a.46.46,0,0,0-.378.424A11.3,11.3,0,0,0,2.98,9.4a10.049,10.049,0,0,0,2.06,3.235A10.516,10.516,0,0,0,8.521,15.1a.46.46,0,0,0,.345,0,10.516,10.516,0,0,0,3.481-2.465A10.049,10.049,0,0,0,14.4,9.4,11.3,11.3,0,0,0,15.106,4.532Zm-3.767,2.16L8.153,10.373a.46.46,0,0,1-.328.159H7.806a.46.46,0,0,1-.322-.131L6.069,9.014a.46.46,0,1,1,.644-.657L7.777,9.4,10.644,6.09a.46.46,0,0,1,.7.6Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg>\n\n <span class=\"text\">{{\n getTranslation(\n \"Your personal or company information is kept private and secure\n within this chat.\"\n )\n }}</span>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #sourcesDrawer\n [position]=\"'end'\"\n [mode]=\"'over'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n <div class=\"container-fluid\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"onCloseSource()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{ currentSourcesList?.length }} Sources</h1>\n <!-- <p>Tell me about latest news from Mistral about AI agents announcement done this month</p> -->\n <hr />\n <ul class=\"sources-list\">\n <li *ngFor=\"let item of currentSourcesList; let si = index\">\n <!-- <input type=\"checkbox\" id=\"source1\"> -->\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\n <label for=\"source1\">\n <span class=\"source-title\"\n ><span class=\"ml-1\">{{ si + 1 }}.</span\n >{{ item.title }}</span\n >\n <span class=\"image-container\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\"\n />\n <span> {{ getDomainName(item.link) }}</span>\n </span>\n <span class=\"source-description\">{{ item.desc }}</span>\n </label>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #editorsDrawer\n [position]=\"'end'\"\n [mode]=\"'push'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <lib-bot-html-editor\n *ngIf=\"isContentLoaded\"\n [editorContent]=\"currentMessageForEditor\"\n [isDocInEditMode]=\"isDocInEditMode\"\n [documentContent]=\"documentContent\"\n [conversationId]=\"conversationId\"\n [botId]=\"botId\"\n ></lib-bot-html-editor>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>\n\n<div *ngIf=\"showWorkflowExecutionDetails\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"close-wrapper\">\n <span class=\"close_pop\" (click)=\"closeModal()\">&times;</span>\n </div>\n <div class=\"titleSection\">\n <!-- Workflow Title -->\n <h2>{{ workflowExecutionDetails.WorkflowName }}</h2>\n <!-- Workflow Title -->\n </div>\n <!-- Inputs Section -->\n <div class=\"inputs-section\">\n <h3>Inputs</h3>\n <ul>\n <li\n *ngFor=\"let input of objectToArray(workflowExecutionDetails.Inputs)\"\n >\n {{ input.key }}: {{ input.value }}\n </li>\n </ul>\n </div>\n\n <!-- Actions Section (Displayed as Timeline) -->\n <div class=\"actions-section\">\n <h3>Agent Actions</h3>\n <div class=\"timeline\">\n <div\n *ngFor=\"let action of workflowExecutionDetails.Actions\"\n class=\"timeline-item\"\n >\n <div class=\"timestamp-section\">\n <h4>{{ action.ActionName || action.Name }}</h4>\n <p><strong></strong> {{ action.InsertTimeStamp }}</p>\n </div>\n <p [innerHTML]=\"processMessageForDisplay(action.Output)\"></p>\n <!-- <pre>{{ action.Output }}</pre> -->\n </div>\n </div>\n </div>\n\n <!-- Insert Timestamp -->\n <div class=\"timestamp-section\">\n <p>\n <strong>Inserted At:</strong>\n {{ workflowExecutionDetails.InsertTimeStamp }}\n </p>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\";.bot-sticky-header-chat{background:#fff;border-bottom:1px solid #ddd;padding:0 0 10px;position:fixed;top:0!important;transition:all 1s;z-index:100;width:100%;padding:10px 15px!important;box-shadow:2px 0 5px #e1e1e1!important;border:none!important}@media (max-width: 768px){.bot-sticky-header-chat{top:0!important}}#botAllChat{padding:0 20px!important}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#e5ccbc}::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-bot-wrapper{position:fixed;height:100%;inset:0;opacity:0;visibility:hidden;z-index:999999;background:transparent!important}.hivegpt-chat-bot-wrapper.mat-drawer-container-has-open{opacity:1;visibility:visible;z-index:999999;transition:all .3s;background:transparent!important}.hivegpt-chat-bot-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-bot-wrapper mat-drawer{width:100%;background-image:none!important;background-color:#f2f2f2}.hivegpt-chat-bot-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-bot-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-bot-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-bot-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;margin:0;font-size:36px;font-weight:500;line-height:108%;letter-spacing:-.72px;text-transform:uppercase}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{position:absolute;top:16px;right:12px;border:none;padding:0;background:transparent;outline:none;width:35px;height:35px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:18px}.hivegpt-chat-bot-wrapper .chat-main{width:100%;flex:1;overflow-y:auto;display:flex;flex-direction:column;justify-content:space-between}.hivegpt-chat-bot-wrapper .chat-main .innerChat{overflow-y:auto;width:100%;padding-top:72px!important}.hivegpt-chat-bot-wrapper .chat-main .ai h3{font-size:1.3rem!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box{width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{min-height:40px;position:relative;margin-top:10px;margin-left:50px}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{margin-left:0}}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p{font-family:Segoe UI,sans-serif;font-weight:400;font-size:14px;font-style:normal;line-height:160%;margin:0;color:#000;text-align:left;color:#525252}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p a{cursor:pointer!important;text-decoration:underline;font-weight:700;color:#17235b!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta{display:flow-root;align-items:end;grid-gap:10px;gap:10px;position:relative;bottom:-7px;right:-10px;z-index:5}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message{margin-left:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:4px 14px 14px;background:#fff;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content{width:100%;max-width:100%;margin:0;padding:0;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{margin:0;padding:0;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div *{max-width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .Icon_TimeSTamp{margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser{text-align:right;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box{margin-left:auto;margin-right:0;width:-moz-fit-content;width:fit-content}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message{margin-left:0;margin-right:0;padding-right:0;width:-moz-fit-content;width:fit-content;max-width:100%;display:flex;flex-direction:column;align-items:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:14px 4px 14px 14px;background:#183988;padding:10px 14px;color:#fff!important;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap p,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message p{text-align:left;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime{text-align:right;margin-left:0;margin-right:10px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime span{margin-left:0;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .time-cta{justify-content:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .Icon_TimeSTamp{justify-content:flex-end;margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{display:flex;justify-content:left;align-content:center;align-items:center;margin:0 -60px;width:auto}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{margin:0}}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime{font-size:15px;font-style:normal;font-weight:300;line-height:140%;color:#333232}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime span{font-size:15px;font-style:normal;font-weight:500;line-height:140%;color:#000;margin-left:15px;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-bot-wrapper .chatFooterWrapper{background:#fff;margin-top:10px!important;box-shadow:2px 0 5px #e1e1e1;width:auto;margin:0 15px 15px;border:2px solid rgba(218,218,218,.5882352941);border-radius:10px;transition:all .5s}.hivegpt-chat-bot-wrapper .chatFooterWrapper:hover{box-shadow:2px 0 4px #ddd;border:2px solid rgba(184,184,184,.5882352941)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .chat-footer-upt{padding:4px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note{display:inline-flex;align-items:center;gap:8px;font-size:12px;line-height:1;margin:0 auto 4px;color:#000;padding:10px 25px;border-radius:15px;background:rgba(27,117,187,.0509803922)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i svg{width:18px;height:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-bot-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:0;position:relative}.hivegpt-chat-bot-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-bot-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;text-align:right;position:absolute;right:15px;margin-bottom:10px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;border:none;border-radius:0;box-shadow:0 1px 2px #1018280d;display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto;background:transparent!important}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-again{border:1px solid #17235b;background:#17235b;color:#fff}.hivegpt-chat-bot-wrapper .cta-faqs{display:flex;align-items:flex-end;flex-direction:column;flex-wrap:wrap;gap:8px;padding:10px 0 0;max-width:80%;margin-left:auto}.hivegpt-chat-bot-wrapper .cta-faqs .cta{font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;color:#333;white-space:pre-line;border-radius:20px 20px 0;background:transparent;padding:12px 20px;min-height:44px;text-decoration:none;transition:all .3s;cursor:pointer;border:1px solid #c9a893;text-align:left}.spinner{display:flex;align-items:center;justify-content:center;gap:2px}.spinner>div{width:5px;height:5px;background-color:#173330;border-radius:100%;display:inline-block;animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.time-cta{display:flex;align-items:center;justify-content:start;gap:8px;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width: 767px){.hivegpt-chat-bot-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{top:8px;right:8px;width:28px;height:28px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-bot-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{background:#17235b;border:#17235b;border-radius:50%;width:50px;height:50px;font-size:24px;color:#fff;display:inline-flex;align-items:center;justify-content:center}textarea{caret-color:#000}.labelChat{margin:0 0 10px;font-weight:400;font-size:14px}.chatType h4{text-align:center;color:#566563}.chatType ul{list-style:none;padding:4px;margin:0 0 20px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px #0000001f,0 1.6px 3.6px #00000029}.chatType ul li{flex:1}.chatType ul li button{width:100%;text-align:center;background:#fff;align-items:center;border:none;padding:.375rem;min-height:48px;border-radius:10px;font-weight:600;text-shadow:1px 0px rgba(0,0,0,.2)}.chatType ul li button.active{box-shadow:0 1px 2px #1018280d;background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);color:#fff}.cta_suggestions{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{color:#1543cd;background:#fff;border:1px solid #174ae4;padding:8px 12px;border-radius:10px;font-size:14px;line-height:1.2;font-weight:600;text-align:left;position:relative;transition:all .3s;box-shadow:#00000021 0 1.6px 3.6px,#0000001a 0 .3px .9px}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.botUser .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #0066ff}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.botUser .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{color:#fff;background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%)}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:20px}.title h2{font-size:22px;margin:0}.title h2 span{color:#000;display:inline-flex;align-items:center;gap:10px}.title h2 i{line-height:1;font-size:30px;color:#000}.title h2 i svg{width:30px;height:30px}.title p{margin:0;font-weight:600}.title p span{color:#000}.agenda-items-wrapper{padding-top:15px;padding-bottom:15px}@media (max-width: 576px){.list-view .session-detail-wrapper{flex-direction:column;border:none}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{font-size:20px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:1;line-clamp:1;-webkit-box-orient:vertical;margin-bottom:8px}.card-background-session .session-description{color:#111!important;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:14px}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{width:160px;height:160px;min-width:160px;position:relative;display:flex;align-items:center;justify-content:center}.thumbnail img{height:100%;width:100%;object-fit:cover}@media (max-width: 576px){.thumbnail{width:100%;min-height:unset;height:160px}}.thumbnail .play-btn{font-size:60px;background-color:transparent;border:0;position:absolute;inset:0;width:100%;display:flex;align-items:center;justify-content:center}.thumbnail .play-btn span{font-size:80px;text-shadow:0px 0px 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{padding:0;margin-top:10px;margin-bottom:0}.speakers li{display:flex;align-items:unset}.speakers li .content{font-size:12px!important}.speakers .image{height:40px;width:40px;min-width:40px;border-radius:100%;overflow:hidden}.speakers img{height:100%;width:100%;object-fit:cover}.grid-2-cols{display:grid;grid-template-columns:calc(55% - 10px) calc(50% - 10px);grid-gap:15px;padding-right:20px}@media (max-width: 768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width: 575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape .s27-scroll::-webkit-scrollbar{width:3px;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{width:100%;height:275px;margin:10px 0;display:table}.tiktokwrapper{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;height:100%}.tiktokwrapper .tiktokshell{width:100%;min-width:160px;height:100%;min-height:275px;position:relative;border-radius:5px;background:#3d2b8f;box-shadow:0 0 6px #494949;border:2px solid #fff}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;position:absolute;z-index:6;bottom:0;left:0;width:100%;height:100%}.tiktokwrapper .videoPhotobox{position:absolute;z-index:6;bottom:0;left:0;width:auto;overflow:hidden;height:272px}.tiktokwrapper .videoPhotobox video{width:100%;height:270px;outline:0;object-fit:cover;border-radius:0;cursor:pointer;transition:.3s ease-in-out}.tiktokwrapper .videoPhotobox img{width:100%;height:100%;object-fit:cover}.tiktokwrapper .playBtn{position:absolute;left:0;right:0;margin:0 auto;z-index:10;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;width:40px;top:105px}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{position:absolute;left:0;right:0;margin:0 auto;z-index:6;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;top:105px}.tiktokwrapper .noPhoto h3{font-size:46px;color:#fff}.tiktokwrapper .onshell-content{position:absolute;bottom:10px;left:5px;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;padding:4px 7px;color:#fff;margin:0 1px;text-transform:capitalize;font-size:11px}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#0066ff 0%,#0066ff 100%)!important}.skeleton-box{display:inline-block;height:1em;position:relative;overflow:hidden;background-color:#dddbdd}.skeleton-box:after{position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,rgba(255,255,255,0) 0,rgba(255,255,255,.2) 20%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0));animation:shimmer 2s infinite;content:\"\";z-index:0}@keyframes shimmer{to{transform:translate(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{font-size:.85em;color:#6b6b6b}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{width:18px;height:18px;fill:#566563}.copyBox{padding:5px 10px;position:relative;border-radius:13px;width:135px;color:#566563;display:flex;gap:12px;float:right;background:#f7f7f7}.copyBox button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{flex-direction:column;justify-content:center;align-items:center;border-top:1px solid #ccc;background-color:#f5f5f5}.chat-footer{display:flex;align-items:center;width:100%;background:#fff;margin-bottom:10px;flex-direction:column}.topinfo-containerbox{display:none;justify-content:space-between;width:100%;background:#f9f9f9;padding:5px 10px 8px;align-items:center;border-bottom:1px solid #efefef;margin:0}@media (max-width: 768px){.topinfo-containerbox{flex-direction:column}}.agents_note_wrapper{display:flex;justify-content:space-around}.bottombox-wrapper{display:flex;width:100%;padding:10px}.dropdown-wrapper{position:relative;margin-right:10px}.dropdown-header{display:flex;align-items:center;cursor:pointer;background:#fff;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid #ddd}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:230px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;padding:5px 15px;font-size:16px}.dropdown-menu label input{width:16px;height:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{width:100%;border:1px solid #ddd;border-radius:5px;padding:10px}.cta-footer{display:flex;align-items:center}.text-left .note-section{width:100%;max-width:800px;background:#fff;border-radius:5px;box-shadow:0 2px 4px #0000001a;padding:10px;display:flex;align-items:center;margin-top:10px}.text-left .note{display:flex;align-items:center;color:#555}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{width:18rem;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px #0000001a;overflow:hidden;background:#fffefe;margin-bottom:10px}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{padding:10px;background-color:#f8f9fa;text-align:center;color:#6c757d}.list-container{list-style:none;padding:0}.list-container li{font-size:13px;margin-bottom:5px;padding:6px 12px;background:#f5f5f5;border-radius:8px}.list-container li:hover{color:#000;cursor:pointer}.session-cards-section,.attendee-cards-section,.speaker-cards-section,.sponsor-cards-section,.booth-rep-cards-section{width:100%;max-width:100%;margin-top:8px;margin-bottom:4px;display:block;visibility:visible;overflow:visible}.session-cards-section{overflow-x:hidden;min-width:0}.card-message-bubble{margin-bottom:20px;border-radius:4px 14px 14px;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word}.card-message-bubble .card-message-text{margin:0}.card-message-text{margin-bottom:0}.session-cards-container{display:grid;grid-template-columns:1fr;gap:20px;width:100%;min-width:0;max-width:100%;overflow:hidden}@media (min-width: 600px){.session-cards-container{grid-template-columns:repeat(2,1fr)}}.session-card-item{background:linear-gradient(135deg,#9f7aea,#805ad5);border:none;border-radius:18px;box-sizing:border-box;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;min-height:220px;min-width:0;max-width:100%;overflow:hidden;padding:25px;position:relative}.session-card-item-ondemand{background:linear-gradient(135deg,#9f7aea,#805ad5);min-height:auto;padding:20px 24px;min-height:220px}.session-card-item-ondemand .session-card-ondemand-badge{display:inline-block;background:#7d69bd;color:#fff;font-size:11px;font-weight:600;letter-spacing:.02em;padding:4px 10px;border-radius:999px;margin-bottom:8px;width:-moz-fit-content;width:fit-content}.session-card-item-ondemand .session-card-ondemand-available{color:#fff;font-size:14px;font-weight:400;margin-bottom:6px}.session-card-item-ondemand .session-card-ondemand-title{font-size:18px;font-weight:700;margin:0 0 8px;line-height:1.3}.session-card-item-ondemand .session-card-ondemand-desc{font-size:14px;font-weight:400;color:#fff;opacity:.95;-webkit-line-clamp:3;line-clamp:3;margin-bottom:12px}.session-card-item-ondemand .session-card-actions-row{margin-top:auto}.session-card-header{margin-bottom:12px;margin-left:80px;min-height:40px;display:flex;align-items:center}.session-card-date-badge{position:absolute;top:20px;left:20px;width:60px;height:60px;background:#000;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-weight:700;font-size:14px}.session-card-date-day{font-size:14px;font-weight:700;color:#fff;line-height:1.2;display:block}.session-card-date-month{font-size:15px;font-weight:700;color:#fff;display:block}.session-card-date-na{font-size:12px;font-weight:700;color:#fff;display:block;line-height:1.2}.session-card-room-time{min-width:0;overflow-wrap:break-word}.session-card-room{font-size:18px;font-weight:600;color:#fff;line-height:1.3}.session-card-time{font-size:13px;opacity:.9;color:#fff;line-height:1.3}.session-card-title{color:#fff;font-size:18px;font-weight:600;line-height:1.35;margin:6px 0 8px;min-width:0;overflow-wrap:break-word}.session-card-meta{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}.session-card-meta-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.35}.session-card-meta-label{font-weight:500;color:#ffffffe6;flex-shrink:0}.session-card-meta-value{font-weight:400;color:#fff;min-width:0}.session-card-description{font-size:14px;line-height:1.4;color:#fff;opacity:.95;flex:1;min-height:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.session-card-status{display:flex;align-items:center;justify-content:flex-end;gap:8px;font-size:13px;font-weight:400;color:#fffffff2;margin-bottom:12px}.session-card-status-bullet{width:6px;height:6px;min-width:6px;border-radius:50%;background:rgba(255,255,255,.9)}.session-card-actions-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto;flex-wrap:nowrap;min-width:0}.session-card-item .speakers-UIcard{display:flex;align-items:center;flex:0 0 auto;min-width:0}.session-card-item .speaker-tooltip-wrap{position:relative;display:inline-block}.session-card-item .speaker-tooltip{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:6px;padding:4px 8px;background:rgba(0,0,0,.85);color:#fff;font-size:12px;font-weight:500;white-space:nowrap;border-radius:4px;pointer-events:none;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility .15s ease;z-index:10}.session-card-item .speaker-tooltip-wrap:hover .speaker-tooltip{visibility:visible;opacity:1}.session-card-item .speaker{width:40px;height:40px;border-radius:50%;overflow:hidden;background:#e6e6e6;display:flex;align-items:center;justify-content:center;font-weight:600;font-family:Arial,sans-serif;color:#333;margin-left:-10px}.session-card-item .speaker:first-child{margin-left:0}.session-card-item .speaker img{width:100%;height:100%;object-fit:cover}.session-card-item .speaker.initials{font-size:14px}.session-card-item .speaker img[src=\"\"],.session-card-item .speaker img:not([src]){opacity:0}.session-card-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:0;justify-content:flex-end;flex:0 0 auto;min-width:0}.session-card-btn{font-size:14px;font-weight:600;padding:8px 20px;min-width:80px;border-radius:8px;cursor:pointer;border:none;transition:opacity .2s}.session-card-btn-primary{background:#000;color:#fff}.session-card-btn-primary:hover{opacity:.9}.session-card-btn-secondary{background:#000;color:#fff;border:none}.session-card-btn-secondary:hover{opacity:.9}.session-card-btn-disabled{opacity:.5;cursor:not-allowed!important;pointer-events:none}.session-card-btn-disabled.session-card-btn-primary,.session-card-btn-disabled.session-card-btn-secondary{background:#000;color:#fff}.session-card-when-disable{font-size:13px;color:#ffffffe6;margin-bottom:10px;font-style:italic}.session-card-meeting-delayed{font-size:13px;color:#fffffff2;margin-bottom:10px}.attendee-cards-container{display:flex;flex-wrap:wrap;gap:20px;width:100%}.attendee-card-item{flex:0 0 calc((100% - 60px)/4);max-width:215px!important}@media (max-width: 1200px){.attendee-card-item{flex:0 0 calc((100% - 40px) / 3)}}@media (max-width: 768px){.attendee-card-item{flex:0 0 calc((100% - 20px)/2)}}@media (max-width: 480px){.attendee-card-item{flex:0 0 100%}}.attendee-card{position:relative;height:320px;min-width:215px;border-radius:8px;overflow:hidden;color:#fff;display:flex;flex-direction:column;justify-content:flex-end;padding:20px;background-color:#5a5a5a;background-size:cover;background-position:center}@media (max-width: 480px){.attendee-card-item{max-width:100%!important}.attendee-card{height:490px}}.attendee-card-has-video{background-image:none!important}.attendee-card-video{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;z-index:1}.attendee-card-play-btn{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;border:1px solid rgba(255,255,255,.35);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:700;line-height:54px;text-align:center;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center;padding:0}.attendee-card-mute-btn{position:absolute;top:10px;right:10px;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:600;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center}.attendee-card-play-btn .material-icons,.attendee-card-mute-btn .material-icons{font-size:28px;line-height:1}.attendee-card-initials{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;background:linear-gradient(135deg,#6b7280 0%,#4b5563 100%);font-size:58px;letter-spacing:-2px;z-index:1;background:linear-gradient(135deg,#6b7280,#4b5563);color:#ffffffe6;font-weight:400;justify-content:center;padding:50px 0}.attendee-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to top,rgba(0,0,0,.85),rgba(0,0,0,.25));z-index:2;pointer-events:none}.attendee-content{position:relative;z-index:3}.attendee-name{font-size:18px;font-weight:600;margin-bottom:4px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-company{font-size:13px;opacity:.85;margin-bottom:8px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc{font-size:14px;margin-bottom:12px;opacity:.95;overflow:hidden}.attendee-desc-collapsed{display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc-expanded{display:block;overflow:visible;margin-bottom:6px}.attendee-read-more{display:inline-block;background:transparent;border:0;padding:0;margin:-6px 0 10px;color:#ffffffe6;font-weight:600;font-size:12px;text-decoration:underline;cursor:pointer}.attendee-buttons{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content}.attendee-buttons .btn{font-size:12px;padding:5px 8px;border-radius:3px;border:none;cursor:pointer;flex:1 1 0;min-width:80px;text-align:center;white-space:nowrap;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}@media (max-width: 480px){.attendee-buttons{flex-wrap:wrap;width:100%!important}.attendee-buttons .btn{flex:1 1 100%;max-width:100%;white-space:normal}}.attendee-card-btn-connect{background:#0d6efd;color:#fff}.attendee-card-btn-connect:hover:not(:disabled){opacity:.9}.attendee-card-btn-view-profile{background:#494949;color:#fff}.attendee-card-btn-view-profile:hover:not(:disabled){opacity:.9}.attendee-card-btn-request-sent{background:#0d6efd;color:#fff;opacity:.5;cursor:not-allowed!important}.attendee-card-btn-disconnect{background:#0d6efd;color:#fff}.attendee-card-btn-disconnect:hover{background:rgba(255,255,255,.3);opacity:.95}.attendee-card-btn:disabled{opacity:.6;cursor:not-allowed!important}.show-more-cards-btn{display:flex;align-items:center;justify-content:center;margin-top:12px;padding:10px 16px;background:#fff;border:1.5px dashed #ccc;border-radius:12px;color:#06f;font-weight:600;font-size:14px;cursor:pointer;width:-moz-fit-content;width:fit-content}.show-more-cards-btn:hover{background:#f8f9fa}.booth-rep-card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}@media (max-width: 1204px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)!important}.booth-rep-card-logo{height:120px!important}.booth-rep-card-logo img{max-height:80px!important;object-fit:contain}}@media (max-width: 768px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)}.booth-rep-card-logo{height:90px!important}.booth-rep-card-logo img{max-height:60px!important;object-fit:contain}}.booth-rep-card{background:linear-gradient(90deg,#9faffc 0%,#a1afff 40%,#adb9ff 100%);padding:18px;border-radius:6px;display:flex;flex-direction:column}.booth-rep-card-logo{width:100%;height:140px;background:#fff;border:1px solid #f7f7f7;display:flex;align-items:center;justify-content:center;margin-bottom:12px;border-radius:4px;box-shadow:0 0 2px #ddd}.booth-rep-card-logo img{max-height:90px;object-fit:contain}.booth-rep-card-logo-placeholder{font-size:48px;font-weight:600;color:#9faffc;text-transform:uppercase}.booth-rep-card-title{font-size:18px;font-weight:600;color:#1d2b4f;margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booth-rep-card-desc{font-size:14px!important;color:#3a3a3a!important;margin-bottom:18px!important;line-height:1.3!important;display:-webkit-box!important;-webkit-line-clamp:3!important;line-clamp:3!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.booth-rep-card-btn{align-self:flex-start;margin-top:auto;background:#494949;color:#fff;border:none;padding:10px 18px;border-radius:6px;font-size:14px;cursor:pointer;transition:.3s}.booth-rep-card-btn:hover{background:#5a5a5a}.collapsible-container{width:100%;margin-bottom:5px;overflow:hidden}.collapsible-header{display:flex;padding:15px;cursor:pointer}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{padding:15px;background-color:#f8f9fa;color:#333;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:5px auto}.card-header{border-bottom:0px;background:#eee;padding:8px 15px;display:flex!important;width:auto;border-radius:8px 8px 0 0}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.uptList{background:rgba(245,222,179,.1411764706);border-radius:0 0 10px 10px;margin-bottom:20px!important}.list-group-item{font-size:15px;color:#0f0f0f;margin:1px 0;padding:0 18px}.sources-container{display:flex;gap:15px;align-items:flex-start}.source-card{position:relative;background-color:#f0f3f5;border-radius:10px;padding:15px;display:flex;flex-direction:column;justify-content:space-between;width:100%;cursor:pointer;transition:box-shadow .3s ease;box-sizing:border-box}.popup{position:absolute;top:100%;left:50%;transform:translate(-50%) translateY(-10px);background-color:#fff;padding:10px;border-radius:5px;white-space:normal;visibility:hidden;opacity:0;transition:opacity .3s ease,transform .3s ease;z-index:10;width:100%;box-shadow:0 4px 8px #0003}.popup h5{font-size:14px;font-weight:600;margin:5px 0 10px;line-height:1.2}.popup p{font-size:12px;margin:0;line-height:1.4}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{text-decoration:none;color:#000}.popup .source-url:hover{text-decoration:underline;color:#007bff;cursor:pointer}.source-card:hover .popup{visibility:visible;opacity:1;transform:translate(-50%) translateY(-15px)}.source-card:hover{box-shadow:0 4px 8px #0000001a;transform:scale(1.05)}.source-title{font-size:14px;font-weight:500;text-align:left;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;height:55px;line-height:1.5}.source-title img{width:20px;margin-left:10px}.source-url{font-size:12px;color:#6c757d;text-align:left;display:flex;align-items:center}.source-url img{width:16px;height:16px;margin-right:5px;border-radius:50%}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{display:flex;align-items:flex-start;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{margin-right:15px;margin-top:8px;flex-shrink:0}.sourceDraweContainer .source-content{flex:1;border:1px solid #ddd;border-radius:8px;padding:12px;background-color:#f5f2f2;box-shadow:0 2px 4px #0000001a;cursor:pointer}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{font-size:1rem;font-weight:500;display:block;margin-bottom:4px;height:auto!important}.sourceDraweContainer .source-description{font-size:.875rem;display:block}.sourceDraweContainer .image-container{display:flex;align-items:center;margin:10px 0}.sourceDraweContainer .image-container img{width:16px;height:16px;margin-right:5px;border-radius:50%;border:1px solid #ddd;object-fit:cover}.sourceDraweContainer .image-container span{font-size:13px;color:#555}.closeButtonEditor{position:absolute;right:10px;top:5px;padding:3px 0 0;height:32px;width:32px;border:0;border-radius:100%}.closeButtonSource{border-color:transparent!important;color:inherit;background:none!important;box-shadow:none!important;transition:color .2s ease-in-out;float:right;margin-top:20px;cursor:pointer}.closeButtonSource.closeplaygroundbutton{display:none!important}.graph-img{width:90%;background:rgba(254,254,254,.231372549);padding:15px;border-radius:15px}.chat-textarea{width:100%;padding:10px;border:none;resize:none;overflow-y:hidden;box-sizing:border-box;font-size:15px;line-height:1.5;background-color:#fff;height:30px;transition:all 1s}.chat-textarea:hover{height:60px}.chat-textarea:focus{height:60px}.chat-textarea:focus{outline:none}.fixed-btn{position:fixed;right:-22px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 12px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn:hover{background-color:#5b5b5b}.fixed-btn-close{position:fixed;right:549px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 16px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn-close:hover{background-color:#5b5b5b}.btn.rotate{transform:rotate(-15deg)}.btn.rotate:hover{transform:rotate(0)}.btn.cta-chat{display:flex;align-items:center;justify-content:center;width:40px!important;height:40px!important;max-width:40px!important;max-height:40px!important;aspect-ratio:1/1;background:#f3f3f3;border:none;border-radius:50%;padding:0;color:#787777;flex-shrink:0}.btn.cta-chat:hover{background:#d7d7d7;color:#666}.btn.cta-chat svg{vertical-align:middle}@keyframes voice-bar-wave{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.btn.cta-chat.voice-btn{overflow:hidden;min-width:40px;width:40px!important;max-width:40px!important;padding-left:11px;padding-right:11px;gap:8px;border-radius:9999px;justify-content:flex-start;flex-shrink:0;transition:max-width .35s ease,width .35s ease,background-color .25s ease,color .25s ease,padding .3s ease,box-shadow .25s ease}.btn.cta-chat.voice-btn .voice-btn-icon{flex-shrink:0;transition:color .25s ease}.btn.cta-chat.voice-btn .vbar{transform-box:fill-box;transform-origin:center}.btn.cta-chat.voice-btn .voice-btn-text{white-space:nowrap;opacity:0;max-width:0;overflow:hidden;font-weight:500;font-size:14px;transform:translate(-4px);transition:opacity .25s ease .1s,max-width .3s ease .05s,transform .3s ease .05s}.btn.cta-chat.voice-btn:hover{width:100px!important;max-width:100px!important;padding-left:14px;padding-right:16px;background:#0d9488!important;color:#fff!important;box-shadow:0 4px 10px #0d948840}.btn.cta-chat.voice-btn:hover .vbar{animation:voice-bar-wave .9s ease-in-out infinite}.btn.cta-chat.voice-btn:hover .vbar-1{animation-delay:0s}.btn.cta-chat.voice-btn:hover .vbar-2{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-3{animation-delay:.3s}.btn.cta-chat.voice-btn:hover .vbar-4{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-5{animation-delay:0s}.btn.cta-chat.voice-btn:hover .voice-btn-text{opacity:1;max-width:4.5em;transform:translate(0)}.chat-footer-upt{padding:4px}.workflowbox{display:flex;align-items:center;cursor:pointer;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid transparent;transition:all .5s}.workflowbox:hover{border:1px solid #ddd;background:#fff}.workflowbox svg{margin:0 10px}.edit-boxDrawer{border-left:1px solid #ddd;box-shadow:1px 1px 15px #ddddddc4!important}.edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}ng-deep .edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}.SearchTitle{font-size:16px!important;text-transform:none}.exicution{margin:30px 0!important;background:#f9f9f9;padding:15px 20px}.new-conversationbutton2{position:absolute;right:88px;top:20px!important;z-index:1000;background:#f5f5f5;padding:6px;border-radius:10px;display:flex;justify-content:space-around;width:120px;align-items:center;font-size:14px;cursor:pointer;border:1px solid #e3e3e3;transition:all .5s}.new-conversationbutton2:hover{background:#eee}@media (max-width: 768px){.new-conversationbutton2{position:fixed!important;top:22px!important;padding:.5px!important;width:90px!important;align-items:center;font-size:11px!important}}.chat-close-button{position:absolute;right:20px;top:25px!important;z-index:1000;display:flex;justify-content:center;align-items:center;gap:6px;font-size:14px;cursor:pointer;transition:all .5s;color:#333}.chat-close-button .chat-close-button-icon{display:inline-flex;align-items:center;justify-content:center}.chat-close-button .chat-close-button-icon svg{display:block}.chat-close-button:hover{background:#eee}@media (max-width: 768px){.chat-close-button{position:fixed!important;top:18px!important;right:12px!important;padding:6px 8px!important;font-size:11px!important}}.NoteTxt{margin:0 auto;margin-bottom:10px!important}.NoteTxt .text{margin:0 5px}.form-container{width:100%}.progress-container{display:flex;align-items:center}.circular-loader{position:relative;width:50px;height:50px;border-radius:50%;border:4px solid rgba(0,0,0,.1);box-sizing:border-box}.loader-spinner{position:absolute;top:0;left:0;width:100%;height:100%;border:2px solid #2196f3;border-top-color:transparent;border-radius:50%;animation:rotate-loader 1s linear infinite;box-sizing:border-box}.loader-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:12px;font-weight:700;color:#333}.loader-label{margin-left:20px;font-size:16px;color:#333}.checkmark{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.checkmark-circle{stroke:#4caf50;stroke-width:4;stroke-dasharray:166;stroke-dashoffset:166;animation:stroke .6s ease-in-out forwards}.checkmark-check{stroke:#4caf50;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:48;stroke-dashoffset:48;animation:stroke-check .4s .4s ease-in-out forwards}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes stroke-check{to{stroke-dashoffset:0}}@keyframes rotate-loader{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes checkmark-animation{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.circular-loader.completed .loader-spinner{animation:none;transform:rotate(360deg)}.icon-button{background-color:transparent;border:none;cursor:pointer;font-size:24px;color:#333}.icon-button:focus{outline:none}.icon-button:hover{color:#007bff}.modal{display:block;position:fixed;z-index:1000001;padding-top:0;left:0;top:0;width:100%;height:100%;background-color:#0006}.modal-content{background-color:#fff;margin:5% auto;padding:20px;border-radius:8px;width:82%;box-shadow:0 4px 8px #0000001a;height:600px;position:relative}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.SearchTitle.botUser{font-size:30px!important;text-transform:none!important}.SearchTitle.botUser h2,.SearchTitle.botUser p{font-size:1.7rem!important}.title_chat{display:flex;margin:0;padding:0}.title_chat h2{font-size:20px;margin:10px 0;display:flex;gap:10px;align-items:center}.title_chat h2 p{display:inline!important}.title_chat h2 span:before{content:\"\"!important}@media (max-width: 768px){.title_chat h2{flex-direction:column;align-items:start;font-size:16px}}.small-title{font-size:12px;margin:2px 0}.titleSection{margin:0}.titleSection h2{font-size:20px;margin:0;color:#000}.inputs-section{background-color:#f7f7f7;padding:10px 15px 0;margin:0 0 10px;border-radius:5px}.inputs-section h3{font-size:16px}.actions-section{background-color:#f9f9f9;padding:15px;margin-bottom:20px;border-radius:5px;height:500px;overflow-y:auto}.timeline{position:relative;padding-left:40px;margin-bottom:20px}.timeline:before{content:\"\";position:absolute;left:19px;height:100%;border-right:2px dashed #cecece}.timeline-item{position:relative;margin-bottom:20px}.timeline-item:before{content:\"\";position:absolute;left:-30px;top:0;width:20px;height:20px;background-color:#007bff;border-radius:50%;z-index:1}.timeline-item h4{margin:0;font-weight:700;font-size:16px;color:#000}.timeline-item pre{background-color:#fff;padding:10px;border:1px solid #ddd;border-radius:5px;white-space:pre-wrap}.timestamp-section{justify-content:space-between;font-style:normal;color:#666}.mic-btn{background-color:#ff4d4d;border:none;border-radius:50%;padding:10px;color:#fff;font-size:1.5em;cursor:pointer}.mic-btn:active{background-color:#f66}.actions-section h3{font-size:16px}.close-wrapper{width:100%;display:flex;justify-content:right;position:absolute;right:22px;top:0}.close_pop{cursor:pointer;display:flex;justify-content:center;align-items:center;color:#aaa;font-size:30px;font-weight:400}.chat-avatar{width:44px;height:44px;min-width:44px;min-height:44px;border-radius:50%;overflow:hidden;background:#fcfcfc;border:1px solid #dfdfdf;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chat-avatar-img{width:100%;height:100%;object-fit:cover}.chat-avatar-initials{font-size:1rem;font-weight:600;color:#555;text-transform:uppercase;-webkit-user-select:none;user-select:none}.chat-avatar-initials-assistant{color:#000}.chat-avatar-initials-user{color:#761c79}.user-Box{display:flex;align-items:center}.bards{position:absolute;right:0;top:20px}::ng-deep .code-container{position:relative;margin:20px 0}::ng-deep .copy-button{position:absolute;top:10px;right:10px;background-color:#007bff;color:#fff;border:none;padding:5px 10px;cursor:pointer;border-radius:4px}::ng-deep .copy-button:hover{background-color:#0056b3}::ng-deep .code_block.diff{background-color:#f8f8f8;border-left:4px solid #ccc;padding:10px;overflow:auto}::ng-deep .heading003{font-size:20px;font-weight:700;color:#000}::ng-deep .listing{list-style:decimal;margin:0 25px;padding:0}.line{display:inline-block;width:15px;height:15px;border-radius:15px;background-color:#e8e8e8}.load-2 .line:nth-last-child(1){animation:loadingB 1.5s 1s infinite;margin:5px 0}.load-2 .line:nth-last-child(2){animation:loadingB 1.5s .5s infinite;margin:5px 0}.load-2 .line:nth-last-child(3){animation:loadingB 1.5s 0s infinite;margin:5px 0}.load-1 .line:nth-last-child(1){animation:loadingA 1.5s 1.2s infinite;margin:5px 0}.load-1 .line:nth-last-child(2){animation:loadingA 1.5s .8s infinite;margin:5px 0}.load-1 .line:nth-last-child(3){animation:loadingA 1.5s .2s infinite;margin:5px 0}@keyframes loadingB{0%{width:65px}50%{width:235px}to{width:65px}}@keyframes loadingA{0%{width:45px}50%{width:205px}to{width:45px}}.chat-thinking{padding-left:20px!important}.chat-thinking .thinking-row{display:flex;align-items:center;gap:8px;margin-top:6px}.chat-thinking .thinking-dots{display:flex;align-items:center;gap:4px}.chat-thinking .thinking-dot{width:6px;height:6px;border-radius:50%;background:#06f;animation:thinking-bounce 1.4s ease-in-out infinite both}.chat-thinking .thinking-dot:nth-child(1){background:#9ca3af;animation-delay:0s}.chat-thinking .thinking-dot:nth-child(2){background:#06f;animation-delay:.2s}.chat-thinking .thinking-dot:nth-child(3){background:#17235b;animation-delay:.4s}.chat-thinking .thinking-text{font-size:14px;font-weight:400;color:#6b7280}@keyframes thinking-bounce{0%,80%,to{transform:scale(.8);opacity:.6}40%{transform:scale(1.1);opacity:1}}.loaderbox{position:relative;margin:10px 0;height:60px}.loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}.loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}.loader--dot:first-child{background-color:#618e93;animation-delay:.5s}.loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}.loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}.loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}.loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}.loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}.loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}.loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}@keyframes loader{15%{transform:translate(230px)}45%{transform:translate(0)}65%{transform:translate(230px)}95%{transform:translate(0)}}@keyframes loading-text{0%{content:\"Loading\"}25%{content:\"Loading.\"}50%{content:\"Loading..\"}75%{content:\"Loading...\"}}::ng-deep .loaderbox{position:relative;margin:10px 0;height:60px}::ng-deep .loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}::ng-deep .loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}::ng-deep .loader--dot:first-child{background-color:#618e93;animation-delay:.5s}::ng-deep .loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}::ng-deep .loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}::ng-deep .loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}::ng-deep .loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}::ng-deep .loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}::ng-deep .loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}::ng-deep .loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}.agents-popwindowbox{width:100%;padding:10px;background:#fff}.agents-popwindowbox h3{font-size:15px;color:#000}.dropdown-menu-agents{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;padding:0;position:absolute;top:auto;width:270px;z-index:1000}.dropdown-menu-agents .scrollerbox{display:flex;flex-direction:column;flex:fit-content;overflow-y:auto;height:215px}.dropdown-menu-agents label{cursor:pointer;display:flex;font-size:13px;justify-content:start;align-items:center;line-height:16px;background:#f9f9f9;padding:7px;margin:2px 0;border-radius:2px}.dropdown-menu-agents label:hover{background:#ebebeb}.dropdown-menu-agents label input{position:absolute;opacity:0}.dropdown-menu-agents .input-check{position:relative;display:inline-block;top:0;width:25px;height:23px;border:2px solid #ccc;border-radius:4px;margin-right:5px;transition:.5s}.dropdown-menu-agents label input:checked~.input-check{background:#06f;border-color:#06f;animation:animate .7s ease}@keyframes animate{0%{transform:scale(1)}40%{transform:scale(1.3,.7)}55%{transform:scale(1)}70%{transform:scale(1.2,.8)}80%{transform:scale(1)}90%{transform:scale(1.1,.9)}to{transform:scale(1)}}.dropdown-menu-agents .input-check:before{content:\"\";position:absolute;top:6px;left:4px;width:15px;height:6px;border-bottom:3px solid #fff;border-left:3px solid #fff;transform:scale(0) rotate(-45deg);transition:.5s}.dropdown-menu-agents label input:checked~.input-check:before{transform:scale(1) rotate(-45deg)}::ng-deep .h1,::ng-deep h1{font-size:1.165rem}::ng-deep .h2,::ng-deep h2{font-size:1.125rem}::ng-deep .h3,::ng-deep h3{font-size:1.125rem}::ng-deep b,::ng-deep strong{font-weight:600}@media (max-width: 768px){.note{width:90%;margin:0 auto;line-height:15px;padding:3px 0 10px}}.show-hover{display:none}.chat.bot:hover .show-hover{display:flex!important}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i12.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i12.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i13.VideoPlayerComponent, selector: "app-video-player", inputs: ["currentUserId", "user", "eventId", "videoObj", "isDev", "type"], outputs: ["connectWithUser", "scheduleMeeting"] }, { kind: "component", type: i14.BotHtmlEditorComponent, selector: "lib-bot-html-editor", inputs: ["editorContent", "isDocInEditMode", "documentContent", "conversationId", "botId"] }, { kind: "pipe", type: i10.SlicePipe, name: "slice" }, { kind: "pipe", type: i10.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3694
+ ChatDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChatDrawerComponent, selector: "hivegpt-chat-drawer-package", inputs: { copilotName: "copilotName", firstName: "firstName", lastName: "lastName", apiKey: "apiKey", bgBubbleAi: "bgBubbleAi", bgBubbleUser: "bgBubbleUser", bgGradient: "bgGradient", botName: "botName", botSkills: "botSkills", botId: "botId", orgId: "orgId", closeButtonColor: "closeButtonColor", closeButtonbgColor: "closeButtonbgColor", credentials: "credentials", dateTimeColor: "dateTimeColor", dateTextColor: "dateTextColor", eventId: "eventId", eventUrl: "eventUrl", eventToken: "eventToken", workspaceToken: "workspaceToken", s27Token: "s27Token", eventName: "eventName", botIcon: "botIcon", userAvatarUrl: "userAvatarUrl", formFieldBgColor: "formFieldBgColor", formFieldTextColor: "formFieldTextColor", fullView: "fullView", gradientColors: "gradientColors", greeting: "greeting", messageTextColorAi: "messageTextColorAi", messageTextColorUser: "messageTextColorUser", rules: "rules", sendButtonColor: "sendButtonColor", sendButtonTextColor: "sendButtonTextColor", showClose: "showClose", thumbsDownMessages: "thumbsDownMessages", thumbsUpMessage: "thumbsUpMessage", timezone: "timezone", unknownResponses: "unknownResponses", useOpenAi: "useOpenAi", userId: "userId", isDev: "isDev", autoScrollOnNewMessage: "autoScrollOnNewMessage", baseUrl: "baseUrl", connectionsList: "connectionsList", pendingSentRequestUserIds: "pendingSentRequestUserIds", isConnectionsEnabled: "isConnectionsEnabled", isUnEvent: "isUnEvent", againButtonColor: "againButtonColor", againButtonTextColor: "againButtonTextColor" }, outputs: { feedbackEvent: "feedbackEvent", onCloseEvent: "onCloseEvent", openPage: "openPage", sessionActions: "sessionActions", sessionActionBlocked: "sessionActionBlocked", closeBot: "closeBot", connectWithUser: "connectWithUser", viewSpeakerProfile: "viewSpeakerProfile", viewBooth: "viewBooth", scheduleMeeting: "scheduleMeeting", refreshToken: "refreshToken", tokensRefreshed: "tokensRefreshed", openSupport: "openSupport" }, viewQueries: [{ propertyName: "chatMain", first: true, predicate: ["chatMain"], descendants: true }, { propertyName: "myInput", first: true, predicate: ["myInput"], descendants: true }, { propertyName: "drawer", first: true, predicate: ["drawer"], descendants: true }, { propertyName: "sourcesDrawer", first: true, predicate: ["sourcesDrawer"], descendants: true }, { propertyName: "editorsDrawer", first: true, predicate: ["editorsDrawer"], descendants: true }, { propertyName: "closePlaygroundButtons", predicate: ["closeplaygroundbutton"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <button\n *ngIf=\"isShowEditorButton && !checkForCop29BotId()\"\n (click)=\"openOuterEditor()\"\n class=\"fixed-btn\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n create\n </span>\n Editor\n</button> -->\n\n<button\n *ngIf=\"!isShowEditorButton\"\n (click)=\"onCloseEditor()\"\n class=\"fixed-btn-close\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n close\n </span>\n {{ getTranslation(\"Close\") }}\n</button>\n\n<mat-drawer-container\n class=\"hivegpt-chat-bot-wrapper\"\n [ngClass]=\"{ 'mat-drawer-container-has-open': isDrawerOpen }\"\n [class.ios-device]=\"isIOSDevice\"\n [hasBackdrop]=\"hasBackdropValue\"\n>\n <mat-drawer\n class=\"drawer\"\n #drawer\n [position]=\"'start'\"\n [mode]=\"'over'\"\n opened=\"true\"\n [class.full-width-drawer]=\"fullView\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"chat-main\">\n <!-- <div class=\"chat-header\">\n <h2> -->\n <!-- {{eventName}} -->\n <!-- </h2> -->\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\n <span class=\"material-symbols-outlined\">\n close\n </span>\n </button> -->\n <!-- </div> -->\n\n <div class=\"innerChat\" #chatMain>\n <div (click)=\"startNewConversation()\" class=\"new-conversationbutton2\">\n {{ getTranslation(\"New Chat\") }}\n <span\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14.061\"\n height=\"14.261\"\n viewBox=\"0 0 14.061 14.261\"\n >\n <path\n id=\"Path_164\"\n data-name=\"Path 164\"\n d=\"M10.146,5.075H4.531A1.544,1.544,0,0,0,3,6.631v7.262A1.544,1.544,0,0,0,4.531,15.45h7.146a1.544,1.544,0,0,0,1.531-1.556V8.187m-7.146,4.15L15.25,3m0,0H11.677M15.25,3V6.631\"\n transform=\"translate(-2.25 -1.939)\"\n fill=\"none\"\n stroke=\"#06f\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.5\"\n />\n </svg>\n </span>\n </div>\n <div\n (click)=\"closeBot.emit()\"\n class=\"chat-close-button\"\n role=\"button\"\n [attr.aria-label]=\"getTranslation('Close') || 'Close'\"\n [attr.title]=\"getTranslation('Close') || 'Close'\"\n >\n \n <span class=\"chat-close-button-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div class=\"bot-sticky-header-chat\">\n <div class=\"title_chat\">\n <h2>\n <p>\n {{ getTranslation(botName) }}\n <!-- <svg\n *ngIf=\"!checkForCop29BotId()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"31.499\"\n height=\"31.501\"\n viewBox=\"0 0 31.499 31.501\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M33.685,7.83a1.125,1.125,0,0,0-.925-1.036,49.227,49.227,0,0,1-14.3-4.444,1.125,1.125,0,0,0-.927,0A49.226,49.226,0,0,1,3.24,6.794,1.125,1.125,0,0,0,2.315,7.83a27.621,27.621,0,0,0,1.718,11.9A24.572,24.572,0,0,0,9.07,27.641a25.712,25.712,0,0,0,8.513,6.028,1.125,1.125,0,0,0,.844,0,25.712,25.712,0,0,0,8.513-6.028,24.572,24.572,0,0,0,5.027-7.911,27.621,27.621,0,0,0,1.718-11.9Zm-9.211,5.281-7.791,9a1.125,1.125,0,0,1-.8.389h-.046a1.125,1.125,0,0,1-.788-.322L11.587,18.79a1.125,1.125,0,1,1,1.575-1.607l2.6,2.552,7.01-8.1a1.125,1.125,0,0,1,1.7,1.472Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg> -->\n </p>\n <span *ngIf=\"!checkForCop29BotId()\">\n <p class=\"small-title\">\n {{ getTranslation(\"AI-powered\")\n }}<span>{{ getTranslation(\"copilot\") }}</span>\n </p>\n </span>\n </h2>\n </div>\n <div class=\"chatType\" style=\"display: none\">\n <h4 class=\"labelChat\">Choose a conversation style</h4>\n <ul>\n <li (click)=\"changeTemperature(0)\">\n <button [ngClass]=\"{ active: temperature === 0 }\">\n <span class=\"top-section-title\"> More Creative </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{ active: temperature === 1 }\">\n <span class=\"top-section-title\"> More Balanced </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{ active: temperature === 2 }\">\n <span class=\"top-section-title\"> More Precise </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div\n id=\"botAllChat\"\n class=\"chat\"\n [ngClass]=\"{\n botUser: chat?.type === 'user',\n botAi: chat?.type !== 'user'\n }\"\n [attr.data-msg-id]=\"chat?._id || null\"\n *ngFor=\"let chat of chatLog; let i = index\"\n >\n <div class=\"chat-box\" *ngIf=\"!(i === 0 && botSkills)\">\n <div class=\"message\">\n <div\n class=\"time-cta\"\n [ngClass]=\"{\n 'time-cta din': showFeedBackIconsIndex === i,\n 'time-cta': showFeedBackIconsIndex != i\n }\"\n >\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"chat?.type === 'ai' && !(i === 0 && botSkills)\"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span style=\"color: #000 !important;\">{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"\n chat?.type === 'session_cards' ||\n chat?.type === 'attendee_cards'\n \"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\n <div class=\"user-Box\">\n <div class=\"dateTime\">\n <span>{{ getTranslation(\"You\") }}</span>\n {{ chat?.time }}\n </div>\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"userAvatarUrl\"\n [src]=\"userAvatarUrl\"\n alt=\"You\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!userAvatarUrl\"\n class=\"chat-avatar-initials chat-avatar-initials-user\"\n >{{ getUserIdInitials() }}</span\n >\n </div>\n </div>\n <div class=\"bards\">\n <div\n class=\"bars\"\n *ngIf=\"\n chat?.WorkflowExecutionId ||\n chat?.showWorkflowExecutionLoader\n \"\n >\n <button\n class=\"icon-button\"\n (click)=\"\n showWorkflowHistoryDetails(chat.WorkflowExecutionId)\n \"\n >\n <i class=\"fas fa-bars\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"researchingCard\"\n *ngIf=\"\n (chat?.searchTerms && chat?.searchTerms.length > 0) ||\n (chat?.sourcesList && chat?.sourcesList?.length > 0)\n \"\n >\n <div\n class=\"card-header d-flex align-items-center\"\n (click)=\"toggleCollapse()\"\n >\n <span class=\"icon\"\n ><i class=\"bx bx-plus-circle bx-sm\"></i\n ></span>\n <span class=\"ml-2\"\n >Researching\n <i\n id=\"toggleIcon\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fa-chevron-down': isCollapsed,\n 'fa-chevron-up': !isCollapsed\n }\"\n ></i\n ></span>\n </div>\n <div\n *ngIf=\"chat?.searchTerms && chat?.searchTerms.length > 0\"\n [ngClass]=\"{ collapse: isCollapsed }\"\n >\n <ul class=\"list-group list-group-flush uptList\">\n <li\n *ngFor=\"let term of chat?.searchTerms\"\n class=\"list-group-item\"\n >\n Searching for\n <strong>{{ term }}</strong>\n </li>\n </ul>\n\n <h5\n class=\"mt-2\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <i class=\"bx bx-unite\"></i> Sources\n </h5>\n <div\n class=\"sources-container\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <div\n class=\"source-card\"\n *ngFor=\"\n let source of chat?.displayedSources;\n let i = index\n \"\n >\n <div>\n <div class=\"source-title\">{{ source.title }}</div>\n <div class=\"source-url\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <div class=\"popup\">\n <div\n class=\"source-url\"\n (click)=\"openLinkInNewTab(source.link)\"\n >\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">\n {{ source.title }}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">\n {{ source.desc }}\n </p>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"\n chat?.remainingSources &&\n chat?.remainingSources.length > 0\n \"\n >\n <div\n class=\"source-card\"\n (click)=\"onCardClick(chat?.sourcesList)\"\n >\n <div>\n <div class=\"source-title\">\n <img\n *ngFor=\"\n let source of chat?.remainingSources;\n let i = index\n \"\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n </div>\n <div class=\"source-url\">\n View {{ chat?.remainingSources.length }} more\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Session cards (from get_event_sessions tool, same as React Native) -->\n <div\n class=\"session-cards-section\"\n *ngIf=\"\n chat?.type === 'session_cards' &&\n chat?.sessionCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"session-cards-container\">\n <div\n *ngFor=\"\n let session of getVisibleSessionCards(chat);\n let idx = index\n \"\n class=\"session-card-item\"\n [class.session-card-item-ondemand]=\"isSessionOndemand(session)\"\n >\n <!-- OnDemand design: pill, Available Anytime, title, description -->\n <ng-container *ngIf=\"isSessionOndemand(session)\">\n <span class=\"session-card-ondemand-badge\">{{ getTranslation('ON DEMAND') || 'ON DEMAND' }}</span>\n <div class=\"session-card-ondemand-available\">{{ getTranslation('Available Anytime') || 'Available Anytime' }}</div>\n <div class=\"session-card-title session-card-ondemand-title\">{{ session.title }}</div>\n <div\n class=\"session-card-description session-card-ondemand-desc\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-actions-row\"\n *ngIf=\"session.session && getSessionRoleButtons(session).length > 0\"\n >\n <div class=\"speakers-UIcard\"></div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"role.action === 'join'\"\n [class.session-card-btn-secondary]=\"role.action === 'watch'\"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n <!-- Default (Live/Breakout) design: date badge, room/time, title, meta, description, actions -->\n <ng-container *ngIf=\"!isSessionOndemand(session)\">\n <div class=\"session-card-header\">\n <div class=\"session-card-date-badge\">\n <ng-container *ngIf=\"session.dateDay || session.dateMonth\">\n <span class=\"session-card-date-day\">{{\n session.dateDay\n }}</span>\n <span class=\"session-card-date-month\">{{\n session.dateMonth\n }}</span>\n </ng-container>\n <span\n *ngIf=\"!session.dateDay && !session.dateMonth\"\n class=\"session-card-date-na\"\n >{{ getTranslation('N/A') || 'N/A' }}</span>\n </div>\n <div class=\"session-card-room-time\">\n <div\n class=\"session-card-room\"\n *ngIf=\"session.room\"\n >\n {{ session.room }}\n </div>\n <div\n class=\"session-card-time\"\n *ngIf=\"session.timeRangeWithTz || session.timeRange\"\n >\n {{ session.timeRangeWithTz || session.timeRange }}\n </div>\n </div>\n </div>\n <div class=\"session-card-title\">{{ session.title }}</div>\n <div\n class=\"session-card-meta\"\n *ngIf=\"(session.organizer && session.organizer.length) || (session.meetingType && session.meetingType.length)\"\n >\n <div class=\"session-card-meta-row\" *ngIf=\"session.organizer && session.organizer.length\">\n <span class=\"session-card-meta-label\">{{\n (getTranslation(\"Organizer\") || \"Organizer\") + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.organizer }}</span>\n </div>\n <!-- <div class=\"session-card-meta-row\" *ngIf=\"session.timeZoneDisplay\">\n <span class=\"session-card-meta-label\">{{\n getTranslation(\"Time zone\") || \"Time zone\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.timeZoneDisplay }}</span>\n </div> -->\n <div class=\"session-card-meta-row\" *ngIf=\"session.meetingType && session.meetingType.length\">\n <span class=\"session-card-meta-label\">{{\n getSessionTypeLabel() + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.meetingType }}</span>\n </div>\n </div>\n <div\n class=\"session-card-description\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-status\"\n *ngIf=\"\n (session.statusText && session.statusText.length) &&\n getSessionRoleButtons(session).length > 0\n \"\n >\n <span class=\"session-card-status-bullet\"></span>\n {{ session.statusText }}\n </div>\n <!-- <div\n class=\"session-card-when-disable\"\n *ngIf=\"\n session.session?.sessionRoles?.length > 0 &&\n !isSessionOndemand(session) &&\n !session.session?.isExpire &&\n !canPerformSessionAction(session)\n \"\n >\n {{ getTranslation(\"You can join/watch at the starting time\") || \"You can join/watch at the starting time\" }}\n </div> -->\n \n <div\n class=\"session-card-actions-row\"\n *ngIf=\"\n session.session &&\n (getSessionRoleButtons(session).length > 0 || hasSessionCardSpeakers(session))\n \"\n >\n <div class=\"speakers-UIcard\">\n <ng-container\n *ngIf=\"\n (session?.speakersList || session?.session?.speakersList || []).length\n as _speakerCount\n \"\n >\n <ng-container\n *ngFor=\"\n let sp of (session?.speakersList || session?.session?.speakersList || []);\n let i = index\n \"\n >\n <ng-container *ngIf=\"i < 3\">\n <div class=\"speaker\" *ngIf=\"getSpeakerPhotoUrl(sp); else speakerInitials\">\n <img\n [src]=\"getSpeakerPhotoUrl(sp)!\"\n [alt]=\"getSpeakerDisplayName(sp) || 'Speaker'\"\n />\n </div>\n <ng-template #speakerInitials>\n <div class=\"speaker initials\">\n {{ getSpeakerInitials(sp) }}\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n <div class=\"speaker initials\" *ngIf=\"_speakerCount > 3\">\n +{{ _speakerCount - 3 }}\n </div>\n </ng-container>\n </div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"\n role.action === 'join'\n \"\n [class.session-card-btn-secondary]=\"\n role.action === 'watch'\n \"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL >\n 4 &&\n !expandedSessionCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSessionCards(chat)\"\n >\n Show\n {{\n (chat?.sessionCards?.length || 0) - SESSION_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL ===\n 1\n ? getTranslation(\"session\") || \"session\"\n : getTranslation(\"sessions\") || \"sessions\"\n }}\n </button>\n </div>\n\n <!-- Attendee cards (from get_event_attendees tool, same as React Native) -->\n <div\n class=\"attendee-cards-section\"\n *ngIf=\"\n chat?.type === 'attendee_cards' &&\n chat?.attendeeCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let attendee of getVisibleAttendeeCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(attendee)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(attendee) && attendee.photo\n ? 'url(' + attendee.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(attendee)\">\n <video\n #attendeeVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(attendee) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, attendee)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, attendee, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(attendee)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, attendee)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, attendee)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(attendee) && !attendee.photo\"\n >\n {{ getAttendeeInitials(attendee.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ attendee.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"attendee.company\"\n >\n {{ attendee.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, attendee)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, attendee)\"\n *ngIf=\"getAttendeeDescription(attendee)\"\n >\n {{ getAttendeeDescription(attendee) }}\n </div>\n \n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(attendee.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!attendee.id\"\n [attr.title]=\"\n !attendee.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation(\"View Profile\") || \"View Profile\" }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL >\n 4 &&\n !expandedAttendeeCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandAttendeeCards(chat)\"\n >\n Show\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL\n }}\n more\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL ===\n 1\n ? getTranslation(\"attendee\") || \"attendee\"\n : getTranslation(\"attendees\") || \"attendees\"\n }}\n </button>\n </div>\n\n <!-- Speaker cards (from get_event_speakers tool, same layout/behavior as attendee cards) -->\n <div\n class=\"speaker-cards-section\"\n *ngIf=\"\n chat?.type === 'speaker_cards' &&\n chat?.speakerCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let speaker of getVisibleSpeakerCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(speaker)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(speaker) && speaker.photo\n ? 'url(' + speaker.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(speaker)\">\n <video\n #speakerVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(speaker) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, speaker)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, speaker, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(speaker)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, speaker)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, speaker)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(speaker) && !speaker.photo\"\n >\n {{ getAttendeeInitials(speaker.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ speaker.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.jobTitle\"\n >\n {{ speaker.jobTitle }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.company\"\n >\n {{ speaker.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, speaker)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, speaker)\"\n *ngIf=\"getAttendeeDescription(speaker)\"\n >\n {{ getAttendeeDescription(speaker) }}\n </div>\n \n\n <div class=\"attendee-buttons\">\n \n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!speaker.id\"\n [attr.title]=\"\n !speaker.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n chat?.type === 'speaker_cards'\n ? viewSpeakerProfile.emit({\n speaker,\n speakers: chat.speakerCards || []\n })\n : speaker.id &&\n connectWithUser.emit({\n userId: speaker.id,\n viewProfile: true\n })\n \"\n >\n {{\n getTranslation('View Profile') || 'View Profile'\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL >\n 4 &&\n !expandedSpeakerCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSpeakerCards(chat)\"\n >\n Show\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL\n }}\n more\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL ===\n 1\n ? getTranslation('speaker') || 'speaker'\n : getTranslation('speakers') || 'speakers'\n }}\n </button>\n </div>\n\n <!-- Sponsor cards (from get_event_sponsors tool, booth-rep style) -->\n <div\n class=\"sponsor-cards-section\"\n *ngIf=\"\n chat?.type === 'sponsor_cards' &&\n chat?.sponsorCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"booth-rep-card-grid\">\n <div\n *ngFor=\"\n let sponsor of getVisibleSponsorCards(chat);\n let idx = index\n \"\n class=\"booth-rep-card\"\n >\n <div class=\"booth-rep-card-logo\">\n <span\n class=\"booth-rep-card-logo-placeholder\"\n *ngIf=\"!sponsor.logoUrl\"\n >\n {{ sponsor.boothTitle ? sponsor.boothTitle.charAt(0) : (sponsor.name ? sponsor.name.charAt(0) : '') }}\n </span>\n <img\n *ngIf=\"sponsor.logoUrl\"\n [src]=\"sponsor.logoUrl\"\n [alt]=\"sponsor.boothTitle || sponsor.name\"\n />\n </div>\n <h3 class=\"booth-rep-card-title\">\n {{ sponsor.boothTitle || sponsor.name }}\n </h3>\n <p\n class=\"booth-rep-card-desc\"\n *ngIf=\"sponsor.description\"\n >\n {{ sponsor.description }}\n </p>\n <button\n type=\"button\"\n class=\"booth-rep-card-btn\"\n (click)=\"viewBooth.emit({ boothId: sponsor.boothID, boothUrl: sponsor.url, sponsor })\"\n >\n {{ getTranslation('View Sponsor') || 'View Sponsor' }}\n </button>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL >\n 4 &&\n !expandedSponsorCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSponsorCards(chat)\"\n >\n Show\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL ===\n 1\n ? getTranslation('sponsor') || 'sponsor'\n : getTranslation('sponsors') || 'sponsors'\n }}\n </button>\n </div>\n\n <!-- Booth representative cards (from get_booth_representatives tool, same design as attendee cards) -->\n <div\n class=\"attendee-cards-section booth-rep-cards-section\"\n *ngIf=\"\n chat?.type === 'booth_rep_cards' &&\n chat?.boothRepCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let rep of getVisibleBoothRepCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [style.background-image]=\"rep.photo ? 'url(' + rep.photo + ')' : null\"\n >\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!rep.photo\"\n >\n {{ getAttendeeInitials(rep.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ rep.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.company\"\n >\n {{ rep.company }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.jobTitle\"\n >\n {{ rep.jobTitle }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, rep)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, rep)\"\n *ngIf=\"getBoothRepDescription(rep)\"\n >\n {{ getBoothRepDescription(rep) }}\n </div>\n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(rep.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n *ngIf=\"rep.id\"\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [attr.title]=\"getTranslation('View Profile') || 'View Profile'\"\n (click)=\"\n connectWithUser.emit({\n userId: rep.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation('View Profile') || 'View Profile' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL >\n 4 &&\n !expandedBoothRepCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandBoothRepCards(chat)\"\n >\n Show\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL\n }}\n more\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL ===\n 1\n ? getTranslation('representative') || 'representative'\n : getTranslation('representatives') || 'representatives'\n }}\n </button>\n </div>\n\n <div\n class=\"chat-bubble-wrap\"\n *ngIf=\"\n (chat?.type === 'ai' || chat?.type === 'user') &&\n !(i === 0 && botSkills)\n \"\n [ngStyle]=\"{\n background:\n chat?.type === 'ai'\n ? bgBubbleAi || '#fff'\n : chat?.type === 'user'\n ? bgBubbleUser || '#183988'\n : 'transparent',\n color:\n chat?.type === 'ai'\n ? '#000 !important'\n : '#fff !important'\n }\"\n >\n <div id=\"messageText_{{ i }}\" class=\"chat-bubble-content\">\n <div\n *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\"\n [ngClass]=\"{\n 'SearchTitle ai': chat?.type === 'ai',\n 'SearchTitle user': chat?.type === 'user'\n }\"\n [ngStyle]=\"{\n background: 'transparent',\n color:\n chat?.type === 'ai' && messageTextColorAi\n ? messageTextColorAi\n : chat?.type === 'user'\n ? messageTextColorUser || '#fff'\n : 'defaultColor'\n }\"\n [innerHTML]=\"chat?.message\"\n ></div>\n </div>\n </div>\n\n <div\n class=\"progress-container\"\n *ngIf=\"chat?.showWorkflowExecutionLoader\"\n >\n <div class=\"circular-loader\">\n <div\n class=\"loader-spinner\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n [ngStyle]=\"{\n transform: 'rotate(' + percentage * 3.6 + 'deg)'\n }\"\n ></div>\n <div\n class=\"checkmark\"\n *ngIf=\"currentWorkflowActionProgress == 100\"\n >\n <svg viewBox=\"0 0 52 52\">\n <circle\n class=\"checkmark-circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkmark-check\"\n fill=\"none\"\n d=\"M14 27l7 7 16-16\"\n />\n </svg>\n </div>\n\n <div\n class=\"loader-text\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n >\n {{ currentWorkflowActionProgress }}%\n </div>\n </div>\n <div class=\"loader-label\">{{ currentWorkflowAction }}...</div>\n </div>\n\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.graphs &&\n chat?.graphs.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Graphs\n <i\n (click)=\"toggleCollapseFGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForFGraph,\n 'fas fa-chevron-up': !isCollapsedForFGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.graphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForFGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n <ng-container *ngIf=\"!checkForCop29BotId()\">\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.executionGraphs &&\n chat?.executionGraphs?.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Execution Path Diagram\n For Data Visualization Workflow\n <i\n (click)=\"toggleCollapseGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForGraph,\n 'fas fa-chevron-up': !isCollapsedForGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.executionGraphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n </ng-container>\n <div class=\"cta\" *ngIf=\"chat?.type === 'ai' && i > 0 && i === lastAiMessageIndex\">\n <div\n class=\"copyBox\"\n title=\"Copy\"\n [ngClass]=\"\n showFeedBackIconsIndex == i ? 'show-always' : 'show-hover'\n \"\n >\n <button\n title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\"\n class=\"copy\"\n [class.active]=\"chat?.copied\"\n (click)=\"handleCopyClick(i)\"\n >\n <i *ngIf=\"chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button>\n<!-- \n <button\n *ngIf=\"!checkForCop29BotId()\"\n class=\"up copy\"\n title=\"{{ chat?.isEditor ? 'Added!' : 'Add to editor' }}\"\n (click)=\"handleEditorClick(i)\"\n >\n <svg\n *ngIf=\"!chat?.isEditor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20.152\"\n height=\"20.152\"\n viewBox=\"0 0 20.152 20.152\"\n >\n <g\n id=\"Icon_feather-edit\"\n data-name=\"Icon feather-edit\"\n transform=\"translate(-2.5 -2.166)\"\n >\n <path\n id=\"Path_166\"\n data-name=\"Path 166\"\n d=\"M11.5,6H4.889A1.889,1.889,0,0,0,3,7.889v13.22A1.889,1.889,0,0,0,4.889,23h13.22A1.889,1.889,0,0,0,20,21.108V14.5\"\n transform=\"translate(0 -1.179)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n <path\n id=\"Path_167\"\n data-name=\"Path 167\"\n d=\"M21.915,3.4a2,2,0,0,1,2.833,2.833l-8.971,8.971L12,16.152l.944-3.777Z\"\n transform=\"translate(-3.334 0)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n </g>\n </svg>\n\n <i *ngIf=\"chat?.isEditor\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button> -->\n\n <button\n class=\"up copy\"\n title=\"Like\"\n [class.active]=\"chat?.liked\"\n (click)=\"handleUpClick(i)\"\n >\n <i *ngIf=\"chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\n fill=\"#17235B\"\n />\n <path\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n <i *ngIf=\"!chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n <button\n class=\"down copy\"\n title=\"Dislike\"\n [class.active]=\"chat?.unliked\"\n (click)=\"handleDownClick(i)\"\n >\n <i *ngIf=\"chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\n fill=\"#17235B\"\n />\n\n <path\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n </div>\n </div>\n <div\n class=\"Related mt-2\"\n *ngIf=\"\n showFeedBackIconsIndex === i &&\n !isChatingWithAi &&\n chat?.relatedListItems &&\n chat?.relatedListItems.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-list-check\"></i> Related\n </h5>\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\n <li (click)=\"fetchDataFor(item, chat)\">{{ item }}</li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"cta-faqs quick-prompts-extended\"\n *ngIf=\"i == 0 && quickPrompts?.length\"\n >\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\n (click)=\"sendMessageWithTile(tile.prompt)\">\n Q: {{ tile.text }}\n </div> -->\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let tile of quickPrompts\"\n (click)=\"sendMessageWithTile(tile.prompt)\"\n >\n <ng-container *ngIf=\"tile\">{{ tile.text }}</ng-container>\n </button>\n </div>\n </div>\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n </div>\n <div\n class=\"chat-bubble-wrap\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <div class=\"chat-bubble-content\">\n <div\n class=\"SearchTitle ai\"\n [innerHTML]=\"processMessageForDisplay(botSkills)\"\n ></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.suggestions?.length\">\n <h4 class=\"labelChat\">\n Here are some things EventsGPT Copilot can help you do:\n </h4>\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let suggestion of chat?.suggestions\"\n (click)=\"sendMessageWithTile(suggestion)\"\n >\n <ng-container *ngIf=\"suggestion\">{{\n suggestion\n }}</ng-container>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"\n chat?.action?.section_id == 'company_search' ||\n chat?.action?.section_id == 'user_search' ||\n chat?.action?.section_id == 'industry_company_search'\n \"\n >\n <div class=\"box\">\n <div class=\"tiktokwrapper\">\n <div\n class=\"tiktokshell\"\n *ngFor=\"let user of chat?.action.users\"\n >\n <div class=\"videoPhotobox\">\n <ng-conatiner\n *ngIf=\"user?.photoPath && !user.userVideosModel\"\n >\n <img [src]=\"user?.photoPath\" />\n </ng-conatiner>\n <ng-conatiner *ngIf=\"user.userVideosModel\">\n <app-video-player\n *ngIf=\"user?.userVideosModel\"\n [isDev]=\"isDev\"\n [currentUserId]=\"userId\"\n [videoObj]=\"user?.userVideosModel\"\n [user]=\"user\"\n [eventId]=\"eventId\"\n type=\"1\"\n >\n </app-video-player>\n </ng-conatiner>\n </div>\n\n <div\n class=\"noPhoto\"\n *ngIf=\"!user?.photoPath && !user.userVideosModel\"\n >\n <h3>\n {{ user.firstName | slice: 0 : 1\n }}{{ user.lastName | slice: 0 : 1 }}\n </h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\"></div>\n <div class=\"onshell-content\">\n <div class=\"title-shell\">\n <h3>{{ user.firstName }} {{ user.lastName }}</h3>\n <h3 class=\"companyName\">{{ user.company }}</h3>\n </div>\n <div class=\"button-shell\">\n <button\n class=\"Connectbtn\"\n (click)=\"connectToUser(user.userId)\"\n >\n {{\n canConnect(user.userId)\n ? \"Connect\"\n : canDisconnect(user.userId)\n ? \"Disconnect\"\n : \"Request\n Sent\"\n }}\n </button>\n <button\n class=\"schedulebtn\"\n (click)=\"scheduleMeetingWithUser(user)\"\n >\n Schedule\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.action?.section_id == myUpcomingSessionAction\">\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\n <div class=\"list-view\">\n <div\n class=\"session-detail-wrapper card-background-session\"\n *ngFor=\"let upcomingSession of chat?.action.content\"\n >\n <div class=\"thumbnail\">\n <img\n alt=\"Introduction to the Imaging Radar Academy\"\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\n class=\"\"\n />\n <!---->\n <!---->\n <!----><button\n class=\"play-btn color-primary\"\n title=\"Watch: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n <!---->\n </button>\n <!---->\n <!---->\n </div>\n <!---->\n <!---->\n <div class=\"content p-3\">\n <div\n class=\"d-flex justify-content-between align-items-center\"\n >\n <div class=\"d-flex flex-column\">\n <p class=\"fs-xs mb-0 body-text-color\">\n {{\n upcomingSession.dateTimeRange.start\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n -\n {{\n upcomingSession.dateTimeRange.end\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n {{ upcomingSession.timeZone.id }}\n </p>\n <!---->\n <!---->\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\n <!---->\n </div>\n <div class=\"d-flex align-items-center actions px-2\">\n <!---->\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'view-session'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n remove_red_eye\n </span>\n </button>\n\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'add-to-agenda'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n >\n <span\n class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\"\n >\n event_available\n </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button\n (click)=\"\n performSessionAction(upcomingSession.id, 'play')\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"Copy session link to share\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">\n {{ upcomingSession.title }}\n </h2>\n <div\n class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\"\n ></div>\n <ul\n class=\"speakers grid-2-cols\"\n *ngFor=\"let speakerId of upcomingSession.speakers\"\n >\n <li class=\"\">\n <div class=\"image\" title=\"Blair Wunderlich\">\n <img\n alt=\"Blair Wunderlich\"\n [src]=\"speakers[speakerId]?.photoPath\"\n class=\"\"\n />\n <!---->\n <!---->\n <!---->\n </div>\n <!---->\n <div\n class=\"content pl-3\"\n style=\"text-transform: none\"\n >\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\n {{ speakers[speakerId]?.firstName }}\n {{ speakers[speakerId]?.lastName }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.jobTitle }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.company }}\n </div>\n </div>\n <!---->\n </li>\n </ul>\n <!---->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Initial load: loading dots when fetching chat history (no \"Thinking\") -->\n <div class=\"chat bot chat-thinking chat-loading-dots\" *ngIf=\"loading && !isChatingWithAi\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Loading\") || \"Loading\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n <!-- Thinking: only when user has sent a message and AI is responding -->\n <div class=\"chat bot chat-thinking\" *ngIf=\"isChatingWithAi && !executingWorkflow\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Thinking\") || \"Thinking\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div\n *ngIf=\"openWorkflowInput && selectedWorkflow && !executingWorkflow\"\n class=\"chatFooterWrapper\"\n >\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\">\n <div class=\"agents_note_wrapper\">\n <div>\n <h6>{{ selectedWorkflow?.Name }}</h6>\n {{ selectedWorkflow?.Description }}\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"toggleWorkflows(false)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- here i need to loop through all the input fields selectedWorkflow.Trigger.InputSchema and render the input fields -->\n <!-- Form for Workflow Inputs -->\n <form\n [formGroup]=\"workflowForm\"\n (ngSubmit)=\"onWorkflowSubmit()\"\n class=\"form-container\"\n >\n <div\n *ngFor=\"let input of selectedWorkflow?.Trigger?.InputSchema\"\n class=\"form-group\"\n >\n <label>{{ input.Label }}</label>\n\n <!-- Handle Text Input or Text Area based on requirement -->\n <textarea\n *ngIf=\"input.Type === 'string'\"\n formControlName=\"{{ input.InputId }}\"\n [placeholder]=\"input.Placeholder\"\n [rows]=\"2\"\n [required]=\"input.Required\"\n class=\"form-control\"\n ></textarea>\n\n <!-- Dropdown for Select Options -->\n <select\n *ngIf=\"input.Type === 'select'\"\n formControlName=\"{{ input.InputId }}\"\n class=\"form-control\"\n >\n <option\n *ngFor=\"let option of input.Options\"\n [value]=\"option.Value\"\n >\n {{ option.Label }}\n </option>\n </select>\n </div>\n\n <!-- Submit button aligned to the right -->\n <div class=\"form-group\">\n <button type=\"submit\" class=\"btn btn-primary submit-button\">\n Submit\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n <div *ngIf=\"!openWorkflowInput\" class=\"chatFooterWrapper\">\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\" *ngIf=\"!checkForCop29BotId()\">\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\n <div class=\"dropdown-header\">\n <span>{{ getDropdownHeaderText() }}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <label (click)=\"onSelectAll()\">\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\n All\n </label>\n <label\n *ngFor=\"let agent of agents\"\n (click)=\"onAgentChange(agent)\"\n >\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\n {{ agent.agentName }}\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleWorkflows()\">\n <div class=\"dropdown-header\">\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 256 256\"\n class=\"h-5 w-5\"\n height=\"1.3em\"\n width=\"1.3em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M245.66,74.34l-32-32a8,8,0,0,0-11.32,11.32L220.69,72H192a74.49,74.49,0,0,0-28.35,6.73c-13.62,6.29-30.83,19.71-35.54,48-5.32,31.94-29.1,39.22-41,40.86a40,40,0,1,0,.18,16.06A71.65,71.65,0,0,0,108.13,178C121.75,172,139,158.6,143.89,129.31,150.65,88.77,190.34,88,192,88h28.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,74.34ZM48,200a24,24,0,1,1,24-24A24,24,0,0,1,48,200Z\"\n ></path></svg\n >&nbsp; Workflows\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isWorkflowOpen\">\n <label\n *ngFor=\"let orgWorkflow of orgWorkflows\"\n (click)=\"onWorkflowSelected(orgWorkflow)\"\n >\n {{ orgWorkflow.Name }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n \n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput /> -->\n <textarea\n [disabled]=\"isChatingWithAi\"\n class=\"form-control-1 s27-scroll chat-textarea\"\n placeholder=\"{{ getTranslation('Ask anything') }}\"\n [(ngModel)]=\"input\"\n (keydown)=\"handleKeydown($event)\"\n (input)=\"adjustTextareaHeight($event)\"\n #myInput\n ></textarea>\n\n \n\n <button\n class=\"btn cta-chat rotate\"\n (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n title=\"{{ getTranslation('Send Message') }}\"\n style=\"margin-right: 1px\"\n >\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 512 512\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\"\n ></path>\n </svg>\n <!-- SEND -->\n </button>\n\n <button\n class=\"btn cta-chat mr-1 voice-btn\"\n (click)=\"openVoiceModal()\"\n type=\"button\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n >\n <svg\n class=\"voice-btn-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <rect class=\"vbar vbar-1\" x=\"3\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-2\" x=\"7\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-3\" x=\"11\" y=\"3\" width=\"2\" height=\"18\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-4\" x=\"15\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-5\" x=\"19\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n <span class=\"voice-btn-text\">Voice</span>\n </button>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n\n <div class=\"NoteTxt\">\n <div class=\"note\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12.882\"\n height=\"12.883\"\n viewBox=\"0 0 12.882 12.883\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M15.106,4.532a.46.46,0,0,0-.378-.424A20.132,20.132,0,0,1,8.881,2.291a.46.46,0,0,0-.379,0A20.132,20.132,0,0,1,2.655,4.108a.46.46,0,0,0-.378.424A11.3,11.3,0,0,0,2.98,9.4a10.049,10.049,0,0,0,2.06,3.235A10.516,10.516,0,0,0,8.521,15.1a.46.46,0,0,0,.345,0,10.516,10.516,0,0,0,3.481-2.465A10.049,10.049,0,0,0,14.4,9.4,11.3,11.3,0,0,0,15.106,4.532Zm-3.767,2.16L8.153,10.373a.46.46,0,0,1-.328.159H7.806a.46.46,0,0,1-.322-.131L6.069,9.014a.46.46,0,1,1,.644-.657L7.777,9.4,10.644,6.09a.46.46,0,0,1,.7.6Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg>\n\n <span class=\"text\">{{\n getTranslation(\n \"Your personal or company information is kept private and secure\n within this chat.\"\n )\n }}</span>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #sourcesDrawer\n [position]=\"'end'\"\n [mode]=\"'over'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n <div class=\"container-fluid\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"onCloseSource()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{ currentSourcesList?.length }} Sources</h1>\n <!-- <p>Tell me about latest news from Mistral about AI agents announcement done this month</p> -->\n <hr />\n <ul class=\"sources-list\">\n <li *ngFor=\"let item of currentSourcesList; let si = index\">\n <!-- <input type=\"checkbox\" id=\"source1\"> -->\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\n <label for=\"source1\">\n <span class=\"source-title\"\n ><span class=\"ml-1\">{{ si + 1 }}.</span\n >{{ item.title }}</span\n >\n <span class=\"image-container\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\"\n />\n <span> {{ getDomainName(item.link) }}</span>\n </span>\n <span class=\"source-description\">{{ item.desc }}</span>\n </label>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #editorsDrawer\n [position]=\"'end'\"\n [mode]=\"'push'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <lib-bot-html-editor\n *ngIf=\"isContentLoaded\"\n [editorContent]=\"currentMessageForEditor\"\n [isDocInEditMode]=\"isDocInEditMode\"\n [documentContent]=\"documentContent\"\n [conversationId]=\"conversationId\"\n [botId]=\"botId\"\n ></lib-bot-html-editor>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>\n\n<div *ngIf=\"showWorkflowExecutionDetails\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"close-wrapper\">\n <span class=\"close_pop\" (click)=\"closeModal()\">&times;</span>\n </div>\n <div class=\"titleSection\">\n <!-- Workflow Title -->\n <h2>{{ workflowExecutionDetails.WorkflowName }}</h2>\n <!-- Workflow Title -->\n </div>\n <!-- Inputs Section -->\n <div class=\"inputs-section\">\n <h3>Inputs</h3>\n <ul>\n <li\n *ngFor=\"let input of objectToArray(workflowExecutionDetails.Inputs)\"\n >\n {{ input.key }}: {{ input.value }}\n </li>\n </ul>\n </div>\n\n <!-- Actions Section (Displayed as Timeline) -->\n <div class=\"actions-section\">\n <h3>Agent Actions</h3>\n <div class=\"timeline\">\n <div\n *ngFor=\"let action of workflowExecutionDetails.Actions\"\n class=\"timeline-item\"\n >\n <div class=\"timestamp-section\">\n <h4>{{ action.ActionName || action.Name }}</h4>\n <p><strong></strong> {{ action.InsertTimeStamp }}</p>\n </div>\n <p [innerHTML]=\"processMessageForDisplay(action.Output)\"></p>\n <!-- <pre>{{ action.Output }}</pre> -->\n </div>\n </div>\n </div>\n\n <!-- Insert Timestamp -->\n <div class=\"timestamp-section\">\n <p>\n <strong>Inserted At:</strong>\n {{ workflowExecutionDetails.InsertTimeStamp }}\n </p>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\";.bot-sticky-header-chat{background:#fff;border-bottom:1px solid #ddd;padding:0 0 10px;position:fixed;top:0!important;transition:all 1s;z-index:100;width:100%;padding:10px 15px!important;box-shadow:2px 0 5px #e1e1e1!important;border:none!important}@media (max-width: 768px){.bot-sticky-header-chat{top:0!important}}#botAllChat{padding:0 20px!important}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#e5ccbc}::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-bot-wrapper{position:fixed;height:100%;inset:0;opacity:0;visibility:hidden;z-index:999999;background:transparent!important}.hivegpt-chat-bot-wrapper.mat-drawer-container-has-open{opacity:1;visibility:visible;z-index:999999;transition:all .3s;background:transparent!important}.hivegpt-chat-bot-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-bot-wrapper mat-drawer{width:100%;background-image:none!important;background-color:#f2f2f2}.hivegpt-chat-bot-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-bot-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-bot-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-bot-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;margin:0;font-size:36px;font-weight:500;line-height:108%;letter-spacing:-.72px;text-transform:uppercase}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{position:absolute;top:16px;right:12px;border:none;padding:0;background:transparent;outline:none;width:35px;height:35px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:18px}.hivegpt-chat-bot-wrapper .chat-main{width:100%;flex:1;overflow-y:auto;display:flex;flex-direction:column;justify-content:space-between}.hivegpt-chat-bot-wrapper .chat-main .innerChat{overflow-y:auto;width:100%;padding-top:72px!important}.hivegpt-chat-bot-wrapper .chat-main .ai h3{font-size:1.3rem!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box{width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{min-height:40px;position:relative;margin-top:10px;margin-left:50px}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{margin-left:0}}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p{font-family:Segoe UI,sans-serif;font-weight:400;font-size:14px;font-style:normal;line-height:160%;margin:0;color:#000;text-align:left;color:#525252}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p a{cursor:pointer!important;text-decoration:underline;font-weight:700;color:#17235b!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta{display:flow-root;align-items:end;grid-gap:10px;gap:10px;position:relative;bottom:-7px;right:-10px;z-index:5}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message{margin-left:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:4px 14px 14px;background:#fff;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content{width:100%;max-width:100%;margin:0;padding:0;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{margin:0;padding:0;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div *{max-width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .Icon_TimeSTamp{margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser{text-align:right;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box{margin-left:auto;margin-right:0;width:-moz-fit-content;width:fit-content}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message{margin-left:0;margin-right:0;padding-right:0;width:-moz-fit-content;width:fit-content;max-width:100%;display:flex;flex-direction:column;align-items:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:14px 4px 14px 14px;background:#183988;padding:10px 14px;color:#fff!important;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap p,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message p{text-align:left;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime{text-align:right;margin-left:0;margin-right:10px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime span{margin-left:0;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .time-cta{justify-content:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .Icon_TimeSTamp{justify-content:flex-end;margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{display:flex;justify-content:left;align-content:center;align-items:center;margin:0 -60px;width:auto}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{margin:0}}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime{font-size:15px;font-style:normal;font-weight:300;line-height:140%;color:#333232}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime span{font-size:15px;font-style:normal;font-weight:500;line-height:140%;color:#000;margin-left:15px;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-bot-wrapper .chatFooterWrapper{background:#fff;margin-top:10px!important;box-shadow:2px 0 5px #e1e1e1;width:auto;margin:0 15px 15px;border:2px solid rgba(218,218,218,.5882352941);border-radius:10px;transition:all .5s}.hivegpt-chat-bot-wrapper .chatFooterWrapper:hover{box-shadow:2px 0 4px #ddd;border:2px solid rgba(184,184,184,.5882352941)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .chat-footer-upt{padding:4px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note{display:inline-flex;align-items:center;gap:8px;font-size:12px;line-height:1;margin:0 auto 4px;color:#000;padding:10px 25px;border-radius:15px;background:rgba(27,117,187,.0509803922)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i svg{width:18px;height:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-bot-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:0;position:relative}.hivegpt-chat-bot-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-bot-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;text-align:right;position:absolute;right:15px;margin-bottom:10px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;border:none;border-radius:0;box-shadow:0 1px 2px #1018280d;display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto;background:transparent!important}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-again{border:1px solid #17235b;background:#17235b;color:#fff}.hivegpt-chat-bot-wrapper .cta-faqs{display:flex;align-items:flex-end;flex-direction:column;flex-wrap:wrap;gap:8px;padding:10px 0 0;max-width:80%;margin-left:auto}.hivegpt-chat-bot-wrapper .cta-faqs .cta{font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;color:#333;white-space:pre-line;border-radius:20px 20px 0;background:transparent;padding:12px 20px;min-height:44px;text-decoration:none;transition:all .3s;cursor:pointer;border:1px solid #c9a893;text-align:left}.spinner{display:flex;align-items:center;justify-content:center;gap:2px}.spinner>div{width:5px;height:5px;background-color:#173330;border-radius:100%;display:inline-block;animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.time-cta{display:flex;align-items:center;justify-content:start;gap:8px;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width: 767px){.hivegpt-chat-bot-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{top:8px;right:8px;width:28px;height:28px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-bot-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{background:#17235b;border:#17235b;border-radius:50%;width:50px;height:50px;font-size:24px;color:#fff;display:inline-flex;align-items:center;justify-content:center}textarea{caret-color:#000}.labelChat{margin:0 0 10px;font-weight:400;font-size:14px}.chatType h4{text-align:center;color:#566563}.chatType ul{list-style:none;padding:4px;margin:0 0 20px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px #0000001f,0 1.6px 3.6px #00000029}.chatType ul li{flex:1}.chatType ul li button{width:100%;text-align:center;background:#fff;align-items:center;border:none;padding:.375rem;min-height:48px;border-radius:10px;font-weight:600;text-shadow:1px 0px rgba(0,0,0,.2)}.chatType ul li button.active{box-shadow:0 1px 2px #1018280d;background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);color:#fff}.cta_suggestions{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{color:#1543cd;background:#fff;border:1px solid #174ae4;padding:8px 12px;border-radius:10px;font-size:14px;line-height:1.2;font-weight:600;text-align:left;position:relative;transition:all .3s;box-shadow:#00000021 0 1.6px 3.6px,#0000001a 0 .3px .9px}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.botUser .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #0066ff}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.botUser .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{color:#fff;background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%)}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:20px}.title h2{font-size:22px;margin:0}.title h2 span{color:#000;display:inline-flex;align-items:center;gap:10px}.title h2 i{line-height:1;font-size:30px;color:#000}.title h2 i svg{width:30px;height:30px}.title p{margin:0;font-weight:600}.title p span{color:#000}.agenda-items-wrapper{padding-top:15px;padding-bottom:15px}@media (max-width: 576px){.list-view .session-detail-wrapper{flex-direction:column;border:none}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{font-size:20px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:1;line-clamp:1;-webkit-box-orient:vertical;margin-bottom:8px}.card-background-session .session-description{color:#111!important;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:14px}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{width:160px;height:160px;min-width:160px;position:relative;display:flex;align-items:center;justify-content:center}.thumbnail img{height:100%;width:100%;object-fit:cover}@media (max-width: 576px){.thumbnail{width:100%;min-height:unset;height:160px}}.thumbnail .play-btn{font-size:60px;background-color:transparent;border:0;position:absolute;inset:0;width:100%;display:flex;align-items:center;justify-content:center}.thumbnail .play-btn span{font-size:80px;text-shadow:0px 0px 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{padding:0;margin-top:10px;margin-bottom:0}.speakers li{display:flex;align-items:unset}.speakers li .content{font-size:12px!important}.speakers .image{height:40px;width:40px;min-width:40px;border-radius:100%;overflow:hidden}.speakers img{height:100%;width:100%;object-fit:cover}.grid-2-cols{display:grid;grid-template-columns:calc(55% - 10px) calc(50% - 10px);grid-gap:15px;padding-right:20px}@media (max-width: 768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width: 575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape .s27-scroll::-webkit-scrollbar{width:3px;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{width:100%;height:275px;margin:10px 0;display:table}.tiktokwrapper{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;height:100%}.tiktokwrapper .tiktokshell{width:100%;min-width:160px;height:100%;min-height:275px;position:relative;border-radius:5px;background:#3d2b8f;box-shadow:0 0 6px #494949;border:2px solid #fff}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;position:absolute;z-index:6;bottom:0;left:0;width:100%;height:100%}.tiktokwrapper .videoPhotobox{position:absolute;z-index:6;bottom:0;left:0;width:auto;overflow:hidden;height:272px}.tiktokwrapper .videoPhotobox video{width:100%;height:270px;outline:0;object-fit:cover;border-radius:0;cursor:pointer;transition:.3s ease-in-out}.tiktokwrapper .videoPhotobox img{width:100%;height:100%;object-fit:cover}.tiktokwrapper .playBtn{position:absolute;left:0;right:0;margin:0 auto;z-index:10;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;width:40px;top:105px}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{position:absolute;left:0;right:0;margin:0 auto;z-index:6;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;top:105px}.tiktokwrapper .noPhoto h3{font-size:46px;color:#fff}.tiktokwrapper .onshell-content{position:absolute;bottom:10px;left:5px;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;padding:4px 7px;color:#fff;margin:0 1px;text-transform:capitalize;font-size:11px}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#0066ff 0%,#0066ff 100%)!important}.skeleton-box{display:inline-block;height:1em;position:relative;overflow:hidden;background-color:#dddbdd}.skeleton-box:after{position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,rgba(255,255,255,0) 0,rgba(255,255,255,.2) 20%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0));animation:shimmer 2s infinite;content:\"\";z-index:0}@keyframes shimmer{to{transform:translate(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{font-size:.85em;color:#6b6b6b}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{width:18px;height:18px;fill:#566563}.copyBox{padding:5px 10px;position:relative;border-radius:13px;width:135px;color:#566563;display:flex;gap:12px;float:right;background:#f7f7f7}.copyBox button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{flex-direction:column;justify-content:center;align-items:center;border-top:1px solid #ccc;background-color:#f5f5f5}.chat-footer{display:flex;align-items:center;width:100%;background:#fff;margin-bottom:10px;flex-direction:column}.topinfo-containerbox{display:none;justify-content:space-between;width:100%;background:#f9f9f9;padding:5px 10px 8px;align-items:center;border-bottom:1px solid #efefef;margin:0}@media (max-width: 768px){.topinfo-containerbox{flex-direction:column}}.agents_note_wrapper{display:flex;justify-content:space-around}.bottombox-wrapper{display:flex;width:100%;padding:10px}.dropdown-wrapper{position:relative;margin-right:10px}.dropdown-header{display:flex;align-items:center;cursor:pointer;background:#fff;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid #ddd}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:230px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;padding:5px 15px;font-size:16px}.dropdown-menu label input{width:16px;height:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{width:100%;border:1px solid #ddd;border-radius:5px;padding:10px}.cta-footer{display:flex;align-items:center}.text-left .note-section{width:100%;max-width:800px;background:#fff;border-radius:5px;box-shadow:0 2px 4px #0000001a;padding:10px;display:flex;align-items:center;margin-top:10px}.text-left .note{display:flex;align-items:center;color:#555}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{width:18rem;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px #0000001a;overflow:hidden;background:#fffefe;margin-bottom:10px}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{padding:10px;background-color:#f8f9fa;text-align:center;color:#6c757d}.list-container{list-style:none;padding:0}.list-container li{font-size:13px;margin-bottom:5px;padding:6px 12px;background:#f5f5f5;border-radius:8px}.list-container li:hover{color:#000;cursor:pointer}.session-cards-section,.attendee-cards-section,.speaker-cards-section,.sponsor-cards-section,.booth-rep-cards-section{width:100%;max-width:100%;margin-top:8px;margin-bottom:4px;display:block;visibility:visible;overflow:visible}.session-cards-section{overflow-x:hidden;min-width:0}.card-message-bubble{margin-bottom:20px;border-radius:4px 14px 14px;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word}.card-message-bubble .card-message-text{margin:0}.card-message-text{margin-bottom:0}.session-cards-container{display:grid;grid-template-columns:1fr;gap:20px;width:100%;min-width:0;max-width:100%;overflow:hidden}@media (min-width: 600px){.session-cards-container{grid-template-columns:repeat(2,1fr)}}.session-card-item{background:linear-gradient(135deg,#9f7aea,#805ad5);border:none;border-radius:18px;box-sizing:border-box;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;min-height:220px;min-width:0;max-width:100%;overflow:hidden;padding:25px;position:relative}.session-card-item-ondemand{background:linear-gradient(135deg,#9f7aea,#805ad5);min-height:auto;padding:20px 24px;min-height:220px}.session-card-item-ondemand .session-card-ondemand-badge{display:inline-block;background:#7d69bd;color:#fff;font-size:11px;font-weight:600;letter-spacing:.02em;padding:4px 10px;border-radius:999px;margin-bottom:8px;width:-moz-fit-content;width:fit-content}.session-card-item-ondemand .session-card-ondemand-available{color:#fff;font-size:14px;font-weight:400;margin-bottom:6px}.session-card-item-ondemand .session-card-ondemand-title{font-size:18px;font-weight:700;margin:0 0 8px;line-height:1.3}.session-card-item-ondemand .session-card-ondemand-desc{font-size:14px;font-weight:400;color:#fff;opacity:.95;-webkit-line-clamp:3;line-clamp:3;margin-bottom:12px}.session-card-item-ondemand .session-card-actions-row{margin-top:auto}.session-card-header{margin-bottom:12px;margin-left:80px;min-height:40px;display:flex;align-items:center}.session-card-date-badge{position:absolute;top:20px;left:20px;width:60px;height:60px;background:#000;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-weight:700;font-size:14px}.session-card-date-day{font-size:14px;font-weight:700;color:#fff;line-height:1.2;display:block}.session-card-date-month{font-size:15px;font-weight:700;color:#fff;display:block}.session-card-date-na{font-size:12px;font-weight:700;color:#fff;display:block;line-height:1.2}.session-card-room-time{min-width:0;overflow-wrap:break-word}.session-card-room{font-size:18px;font-weight:600;color:#fff;line-height:1.3}.session-card-time{font-size:13px;opacity:.9;color:#fff;line-height:1.3}.session-card-title{color:#fff;font-size:18px;font-weight:600;line-height:1.35;margin:6px 0 8px;min-width:0;overflow-wrap:break-word}.session-card-meta{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}.session-card-meta-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.35}.session-card-meta-label{font-weight:500;color:#ffffffe6;flex-shrink:0}.session-card-meta-value{font-weight:400;color:#fff;min-width:0}.session-card-description{font-size:14px;line-height:1.4;color:#fff;opacity:.95;flex:1;min-height:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.session-card-status{display:flex;align-items:center;justify-content:flex-end;gap:8px;font-size:13px;font-weight:400;color:#fffffff2;margin-bottom:12px}.session-card-status-bullet{width:6px;height:6px;min-width:6px;border-radius:50%;background:rgba(255,255,255,.9)}.session-card-actions-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto;flex-wrap:nowrap;min-width:0}.session-card-item .speakers-UIcard{display:flex;align-items:center;flex:0 0 auto;min-width:0}.session-card-item .speaker-tooltip-wrap{position:relative;display:inline-block}.session-card-item .speaker-tooltip{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:6px;padding:4px 8px;background:rgba(0,0,0,.85);color:#fff;font-size:12px;font-weight:500;white-space:nowrap;border-radius:4px;pointer-events:none;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility .15s ease;z-index:10}.session-card-item .speaker-tooltip-wrap:hover .speaker-tooltip{visibility:visible;opacity:1}.session-card-item .speaker{width:40px;height:40px;border-radius:50%;overflow:hidden;background:#e6e6e6;display:flex;align-items:center;justify-content:center;font-weight:600;font-family:Arial,sans-serif;color:#333;margin-left:-10px}.session-card-item .speaker:first-child{margin-left:0}.session-card-item .speaker img{width:100%;height:100%;object-fit:cover}.session-card-item .speaker.initials{font-size:14px}.session-card-item .speaker img[src=\"\"],.session-card-item .speaker img:not([src]){opacity:0}.session-card-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:0;justify-content:flex-end;flex:0 0 auto;min-width:0}.session-card-btn{font-size:14px;font-weight:600;padding:8px 20px;min-width:80px;border-radius:8px;cursor:pointer;border:none;transition:opacity .2s}.session-card-btn-primary{background:#000;color:#fff}.session-card-btn-primary:hover{opacity:.9}.session-card-btn-secondary{background:#000;color:#fff;border:none}.session-card-btn-secondary:hover{opacity:.9}.session-card-btn-disabled{opacity:.5;cursor:not-allowed!important;pointer-events:none}.session-card-btn-disabled.session-card-btn-primary,.session-card-btn-disabled.session-card-btn-secondary{background:#000;color:#fff}.session-card-when-disable{font-size:13px;color:#ffffffe6;margin-bottom:10px;font-style:italic}.session-card-meeting-delayed{font-size:13px;color:#fffffff2;margin-bottom:10px}.attendee-cards-container{display:flex;flex-wrap:wrap;gap:20px;width:100%}.attendee-card-item{flex:0 0 calc((100% - 60px)/4);max-width:215px!important}@media (max-width: 1200px){.attendee-card-item{flex:0 0 calc((100% - 40px) / 3)}}@media (max-width: 768px){.attendee-card-item{flex:0 0 calc((100% - 20px)/2)}}@media (max-width: 480px){.attendee-card-item{flex:0 0 100%}}.attendee-card{position:relative;height:320px;min-width:215px;border-radius:8px;overflow:hidden;color:#fff;display:flex;flex-direction:column;justify-content:flex-end;padding:20px;background-color:#5a5a5a;background-size:cover;background-position:center}@media (max-width: 480px){.attendee-card-item{max-width:100%!important}.attendee-card{height:490px}}.attendee-card-has-video{background-image:none!important}.attendee-card-video{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;z-index:1}.attendee-card-play-btn{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;border:1px solid rgba(255,255,255,.35);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:700;line-height:54px;text-align:center;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center;padding:0}.attendee-card-mute-btn{position:absolute;top:10px;right:10px;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:600;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center}.attendee-card-play-btn .material-icons,.attendee-card-mute-btn .material-icons{font-size:28px;line-height:1}.attendee-card-initials{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;background:linear-gradient(135deg,#6b7280 0%,#4b5563 100%);font-size:58px;letter-spacing:-2px;z-index:1;background:linear-gradient(135deg,#6b7280,#4b5563);color:#ffffffe6;font-weight:400;justify-content:center;padding:50px 0}.attendee-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to top,rgba(0,0,0,.85),rgba(0,0,0,.25));z-index:2;pointer-events:none}.attendee-content{position:relative;z-index:3}.attendee-name{font-size:18px;font-weight:600;margin-bottom:4px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-company{font-size:13px;opacity:.85;margin-bottom:8px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc{font-size:14px;margin-bottom:12px;opacity:.95;overflow:hidden}.attendee-desc-collapsed{display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc-expanded{display:block;overflow:visible;margin-bottom:6px}.attendee-read-more{display:inline-block;background:transparent;border:0;padding:0;margin:-6px 0 10px;color:#ffffffe6;font-weight:600;font-size:12px;text-decoration:underline;cursor:pointer}.attendee-buttons{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content}.attendee-buttons .btn{font-size:12px;padding:5px 8px;border-radius:3px;border:none;cursor:pointer;flex:1 1 0;min-width:80px;text-align:center;white-space:nowrap;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}@media (max-width: 480px){.attendee-buttons{flex-wrap:wrap;width:100%!important}.attendee-buttons .btn{flex:1 1 100%;max-width:100%;white-space:normal}}.attendee-card-btn-connect{background:#0d6efd;color:#fff}.attendee-card-btn-connect:hover:not(:disabled){opacity:.9}.attendee-card-btn-view-profile{background:#494949;color:#fff}.attendee-card-btn-view-profile:hover:not(:disabled){opacity:.9}.attendee-card-btn-request-sent{background:#0d6efd;color:#fff;opacity:.5;cursor:not-allowed!important}.attendee-card-btn-disconnect{background:#0d6efd;color:#fff}.attendee-card-btn-disconnect:hover{background:rgba(255,255,255,.3);opacity:.95}.attendee-card-btn:disabled{opacity:.6;cursor:not-allowed!important}.show-more-cards-btn{display:flex;align-items:center;justify-content:center;margin-top:12px;padding:10px 16px;background:#fff;border:1.5px dashed #ccc;border-radius:12px;color:#06f;font-weight:600;font-size:14px;cursor:pointer;width:-moz-fit-content;width:fit-content}.show-more-cards-btn:hover{background:#f8f9fa}.booth-rep-card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}@media (max-width: 1204px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)!important}.booth-rep-card-logo{height:120px!important}.booth-rep-card-logo img{max-height:80px!important;object-fit:contain}}@media (max-width: 768px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)}.booth-rep-card-logo{height:90px!important}.booth-rep-card-logo img{max-height:60px!important;object-fit:contain}}.booth-rep-card{background:linear-gradient(90deg,#9faffc 0%,#a1afff 40%,#adb9ff 100%);padding:18px;border-radius:6px;display:flex;flex-direction:column}.booth-rep-card-logo{width:100%;height:140px;background:#fff;border:1px solid #f7f7f7;display:flex;align-items:center;justify-content:center;margin-bottom:12px;border-radius:4px;box-shadow:0 0 2px #ddd}.booth-rep-card-logo img{max-height:90px;object-fit:contain}.booth-rep-card-logo-placeholder{font-size:48px;font-weight:600;color:#9faffc;text-transform:uppercase}.booth-rep-card-title{font-size:18px;font-weight:600;color:#1d2b4f;margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booth-rep-card-desc{font-size:14px!important;color:#3a3a3a!important;margin-bottom:18px!important;line-height:1.3!important;display:-webkit-box!important;-webkit-line-clamp:3!important;line-clamp:3!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.booth-rep-card-btn{align-self:flex-start;margin-top:auto;background:#494949;color:#fff;border:none;padding:10px 18px;border-radius:6px;font-size:14px;cursor:pointer;transition:.3s}.booth-rep-card-btn:hover{background:#5a5a5a}.collapsible-container{width:100%;margin-bottom:5px;overflow:hidden}.collapsible-header{display:flex;padding:15px;cursor:pointer}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{padding:15px;background-color:#f8f9fa;color:#333;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:5px auto}.card-header{border-bottom:0px;background:#eee;padding:8px 15px;display:flex!important;width:auto;border-radius:8px 8px 0 0}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.uptList{background:rgba(245,222,179,.1411764706);border-radius:0 0 10px 10px;margin-bottom:20px!important}.list-group-item{font-size:15px;color:#0f0f0f;margin:1px 0;padding:0 18px}.sources-container{display:flex;gap:15px;align-items:flex-start}.source-card{position:relative;background-color:#f0f3f5;border-radius:10px;padding:15px;display:flex;flex-direction:column;justify-content:space-between;width:100%;cursor:pointer;transition:box-shadow .3s ease;box-sizing:border-box}.popup{position:absolute;top:100%;left:50%;transform:translate(-50%) translateY(-10px);background-color:#fff;padding:10px;border-radius:5px;white-space:normal;visibility:hidden;opacity:0;transition:opacity .3s ease,transform .3s ease;z-index:10;width:100%;box-shadow:0 4px 8px #0003}.popup h5{font-size:14px;font-weight:600;margin:5px 0 10px;line-height:1.2}.popup p{font-size:12px;margin:0;line-height:1.4}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{text-decoration:none;color:#000}.popup .source-url:hover{text-decoration:underline;color:#007bff;cursor:pointer}.source-card:hover .popup{visibility:visible;opacity:1;transform:translate(-50%) translateY(-15px)}.source-card:hover{box-shadow:0 4px 8px #0000001a;transform:scale(1.05)}.source-title{font-size:14px;font-weight:500;text-align:left;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;height:55px;line-height:1.5}.source-title img{width:20px;margin-left:10px}.source-url{font-size:12px;color:#6c757d;text-align:left;display:flex;align-items:center}.source-url img{width:16px;height:16px;margin-right:5px;border-radius:50%}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{display:flex;align-items:flex-start;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{margin-right:15px;margin-top:8px;flex-shrink:0}.sourceDraweContainer .source-content{flex:1;border:1px solid #ddd;border-radius:8px;padding:12px;background-color:#f5f2f2;box-shadow:0 2px 4px #0000001a;cursor:pointer}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{font-size:1rem;font-weight:500;display:block;margin-bottom:4px;height:auto!important}.sourceDraweContainer .source-description{font-size:.875rem;display:block}.sourceDraweContainer .image-container{display:flex;align-items:center;margin:10px 0}.sourceDraweContainer .image-container img{width:16px;height:16px;margin-right:5px;border-radius:50%;border:1px solid #ddd;object-fit:cover}.sourceDraweContainer .image-container span{font-size:13px;color:#555}.closeButtonEditor{position:absolute;right:10px;top:5px;padding:3px 0 0;height:32px;width:32px;border:0;border-radius:100%}.closeButtonSource{border-color:transparent!important;color:inherit;background:none!important;box-shadow:none!important;transition:color .2s ease-in-out;float:right;margin-top:20px;cursor:pointer}.closeButtonSource.closeplaygroundbutton{display:none!important}.graph-img{width:90%;background:rgba(254,254,254,.231372549);padding:15px;border-radius:15px}.chat-textarea{width:100%;padding:10px;border:none;resize:none;overflow-y:hidden;box-sizing:border-box;font-size:15px;line-height:1.5;background-color:#fff;height:30px;transition:all 1s}.chat-textarea:hover{height:60px}.chat-textarea:focus{height:60px}.chat-textarea:focus{outline:none}.fixed-btn{position:fixed;right:-22px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 12px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn:hover{background-color:#5b5b5b}.fixed-btn-close{position:fixed;right:549px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 16px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn-close:hover{background-color:#5b5b5b}.btn.rotate{transform:rotate(-15deg)}.btn.rotate:hover{transform:rotate(0)}.btn.cta-chat{display:flex;align-items:center;justify-content:center;width:40px!important;height:40px!important;max-width:40px!important;max-height:40px!important;aspect-ratio:1/1;background:#f3f3f3;border:none;border-radius:50%;padding:0;color:#787777;flex-shrink:0}.btn.cta-chat:hover{background:#d7d7d7;color:#666}.btn.cta-chat svg{vertical-align:middle}@keyframes voice-bar-wave{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.btn.cta-chat.voice-btn{overflow:hidden;min-width:40px;width:40px!important;max-width:40px!important;padding-left:11px;padding-right:11px;gap:8px;border-radius:9999px;justify-content:flex-start;flex-shrink:0;transition:max-width .35s ease,width .35s ease,background-color .25s ease,color .25s ease,padding .3s ease,box-shadow .25s ease}.btn.cta-chat.voice-btn .voice-btn-icon{flex-shrink:0;transition:color .25s ease}.btn.cta-chat.voice-btn .vbar{transform-box:fill-box;transform-origin:center}.btn.cta-chat.voice-btn .voice-btn-text{white-space:nowrap;opacity:0;max-width:0;overflow:hidden;font-weight:500;font-size:14px;transform:translate(-4px);transition:opacity .25s ease .1s,max-width .3s ease .05s,transform .3s ease .05s}.btn.cta-chat.voice-btn:hover{width:100px!important;max-width:100px!important;padding-left:14px;padding-right:16px;background:#0d9488!important;color:#fff!important;box-shadow:0 4px 10px #0d948840}.btn.cta-chat.voice-btn:hover .vbar{animation:voice-bar-wave .9s ease-in-out infinite}.btn.cta-chat.voice-btn:hover .vbar-1{animation-delay:0s}.btn.cta-chat.voice-btn:hover .vbar-2{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-3{animation-delay:.3s}.btn.cta-chat.voice-btn:hover .vbar-4{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-5{animation-delay:0s}.btn.cta-chat.voice-btn:hover .voice-btn-text{opacity:1;max-width:4.5em;transform:translate(0)}.chat-footer-upt{padding:4px}.workflowbox{display:flex;align-items:center;cursor:pointer;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid transparent;transition:all .5s}.workflowbox:hover{border:1px solid #ddd;background:#fff}.workflowbox svg{margin:0 10px}.edit-boxDrawer{border-left:1px solid #ddd;box-shadow:1px 1px 15px #ddddddc4!important}.edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}ng-deep .edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}.SearchTitle{font-size:16px!important;text-transform:none}.exicution{margin:30px 0!important;background:#f9f9f9;padding:15px 20px}.new-conversationbutton2{position:absolute;right:88px;top:20px!important;z-index:1000;background:#f5f5f5;padding:6px;border-radius:10px;display:flex;justify-content:space-around;width:120px;align-items:center;font-size:14px;cursor:pointer;border:1px solid #e3e3e3;transition:all .5s}.new-conversationbutton2:hover{background:#eee}@media (max-width: 768px){.new-conversationbutton2{position:fixed!important;top:22px!important;padding:.5px!important;width:90px!important;align-items:center;font-size:11px!important}}.chat-close-button{position:absolute;right:20px;top:25px!important;z-index:1000;display:flex;justify-content:center;align-items:center;gap:6px;font-size:14px;cursor:pointer;transition:all .5s;color:#333}.chat-close-button .chat-close-button-icon{display:inline-flex;align-items:center;justify-content:center}.chat-close-button .chat-close-button-icon svg{display:block}.chat-close-button:hover{background:#eee}@media (max-width: 768px){.chat-close-button{position:fixed!important;top:18px!important;right:12px!important;padding:6px 8px!important;font-size:11px!important}}.NoteTxt{margin:0 auto;margin-bottom:10px!important}.NoteTxt .text{margin:0 5px}.form-container{width:100%}.progress-container{display:flex;align-items:center}.circular-loader{position:relative;width:50px;height:50px;border-radius:50%;border:4px solid rgba(0,0,0,.1);box-sizing:border-box}.loader-spinner{position:absolute;top:0;left:0;width:100%;height:100%;border:2px solid #2196f3;border-top-color:transparent;border-radius:50%;animation:rotate-loader 1s linear infinite;box-sizing:border-box}.loader-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:12px;font-weight:700;color:#333}.loader-label{margin-left:20px;font-size:16px;color:#333}.checkmark{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.checkmark-circle{stroke:#4caf50;stroke-width:4;stroke-dasharray:166;stroke-dashoffset:166;animation:stroke .6s ease-in-out forwards}.checkmark-check{stroke:#4caf50;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:48;stroke-dashoffset:48;animation:stroke-check .4s .4s ease-in-out forwards}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes stroke-check{to{stroke-dashoffset:0}}@keyframes rotate-loader{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes checkmark-animation{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.circular-loader.completed .loader-spinner{animation:none;transform:rotate(360deg)}.icon-button{background-color:transparent;border:none;cursor:pointer;font-size:24px;color:#333}.icon-button:focus{outline:none}.icon-button:hover{color:#007bff}.modal{display:block;position:fixed;z-index:1000001;padding-top:0;left:0;top:0;width:100%;height:100%;background-color:#0006}.modal-content{background-color:#fff;margin:5% auto;padding:20px;border-radius:8px;width:82%;box-shadow:0 4px 8px #0000001a;height:600px;position:relative}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.SearchTitle.botUser{font-size:30px!important;text-transform:none!important}.SearchTitle.botUser h2,.SearchTitle.botUser p{font-size:1.7rem!important}.title_chat{display:flex;margin:0;padding:0}.title_chat h2{font-size:20px;margin:10px 0;display:flex;gap:10px;align-items:center}.title_chat h2 p{display:inline!important}.title_chat h2 span:before{content:\"\"!important}@media (max-width: 768px){.title_chat h2{flex-direction:column;align-items:start;font-size:16px}}.small-title{font-size:12px;margin:2px 0}.titleSection{margin:0}.titleSection h2{font-size:20px;margin:0;color:#000}.inputs-section{background-color:#f7f7f7;padding:10px 15px 0;margin:0 0 10px;border-radius:5px}.inputs-section h3{font-size:16px}.actions-section{background-color:#f9f9f9;padding:15px;margin-bottom:20px;border-radius:5px;height:500px;overflow-y:auto}.timeline{position:relative;padding-left:40px;margin-bottom:20px}.timeline:before{content:\"\";position:absolute;left:19px;height:100%;border-right:2px dashed #cecece}.timeline-item{position:relative;margin-bottom:20px}.timeline-item:before{content:\"\";position:absolute;left:-30px;top:0;width:20px;height:20px;background-color:#007bff;border-radius:50%;z-index:1}.timeline-item h4{margin:0;font-weight:700;font-size:16px;color:#000}.timeline-item pre{background-color:#fff;padding:10px;border:1px solid #ddd;border-radius:5px;white-space:pre-wrap}.timestamp-section{justify-content:space-between;font-style:normal;color:#666}.mic-btn{background-color:#ff4d4d;border:none;border-radius:50%;padding:10px;color:#fff;font-size:1.5em;cursor:pointer}.mic-btn:active{background-color:#f66}.actions-section h3{font-size:16px}.close-wrapper{width:100%;display:flex;justify-content:right;position:absolute;right:22px;top:0}.close_pop{cursor:pointer;display:flex;justify-content:center;align-items:center;color:#aaa;font-size:30px;font-weight:400}.chat-avatar{width:44px;height:44px;min-width:44px;min-height:44px;border-radius:50%;overflow:hidden;background:#fcfcfc;border:1px solid #dfdfdf;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chat-avatar-img{width:100%;height:100%;object-fit:cover}.chat-avatar-initials{font-size:1rem;font-weight:600;color:#555;text-transform:uppercase;-webkit-user-select:none;user-select:none}.chat-avatar-initials-assistant{color:#000}.chat-avatar-initials-user{color:#761c79}.user-Box{display:flex;align-items:center}.bards{position:absolute;right:0;top:20px}::ng-deep .code-container{position:relative;margin:20px 0}::ng-deep .copy-button{position:absolute;top:10px;right:10px;background-color:#007bff;color:#fff;border:none;padding:5px 10px;cursor:pointer;border-radius:4px}::ng-deep .copy-button:hover{background-color:#0056b3}::ng-deep .code_block.diff{background-color:#f8f8f8;border-left:4px solid #ccc;padding:10px;overflow:auto}::ng-deep .heading003{font-size:20px;font-weight:700;color:#000}::ng-deep .listing{list-style:decimal;margin:0 25px;padding:0}.line{display:inline-block;width:15px;height:15px;border-radius:15px;background-color:#e8e8e8}.load-2 .line:nth-last-child(1){animation:loadingB 1.5s 1s infinite;margin:5px 0}.load-2 .line:nth-last-child(2){animation:loadingB 1.5s .5s infinite;margin:5px 0}.load-2 .line:nth-last-child(3){animation:loadingB 1.5s 0s infinite;margin:5px 0}.load-1 .line:nth-last-child(1){animation:loadingA 1.5s 1.2s infinite;margin:5px 0}.load-1 .line:nth-last-child(2){animation:loadingA 1.5s .8s infinite;margin:5px 0}.load-1 .line:nth-last-child(3){animation:loadingA 1.5s .2s infinite;margin:5px 0}@keyframes loadingB{0%{width:65px}50%{width:235px}to{width:65px}}@keyframes loadingA{0%{width:45px}50%{width:205px}to{width:45px}}.chat-thinking{padding-left:20px!important}.chat-thinking .thinking-row{display:flex;align-items:center;gap:8px;margin-top:6px}.chat-thinking .thinking-dots{display:flex;align-items:center;gap:4px}.chat-thinking .thinking-dot{width:6px;height:6px;border-radius:50%;background:#06f;animation:thinking-bounce 1.4s ease-in-out infinite both}.chat-thinking .thinking-dot:nth-child(1){background:#9ca3af;animation-delay:0s}.chat-thinking .thinking-dot:nth-child(2){background:#06f;animation-delay:.2s}.chat-thinking .thinking-dot:nth-child(3){background:#17235b;animation-delay:.4s}.chat-thinking .thinking-text{font-size:14px;font-weight:400;color:#6b7280}@keyframes thinking-bounce{0%,80%,to{transform:scale(.8);opacity:.6}40%{transform:scale(1.1);opacity:1}}.loaderbox{position:relative;margin:10px 0;height:60px}.loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}.loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}.loader--dot:first-child{background-color:#618e93;animation-delay:.5s}.loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}.loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}.loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}.loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}.loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}.loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}.loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}@keyframes loader{15%{transform:translate(230px)}45%{transform:translate(0)}65%{transform:translate(230px)}95%{transform:translate(0)}}@keyframes loading-text{0%{content:\"Loading\"}25%{content:\"Loading.\"}50%{content:\"Loading..\"}75%{content:\"Loading...\"}}::ng-deep .loaderbox{position:relative;margin:10px 0;height:60px}::ng-deep .loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}::ng-deep .loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}::ng-deep .loader--dot:first-child{background-color:#618e93;animation-delay:.5s}::ng-deep .loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}::ng-deep .loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}::ng-deep .loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}::ng-deep .loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}::ng-deep .loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}::ng-deep .loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}::ng-deep .loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}.agents-popwindowbox{width:100%;padding:10px;background:#fff}.agents-popwindowbox h3{font-size:15px;color:#000}.dropdown-menu-agents{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;padding:0;position:absolute;top:auto;width:270px;z-index:1000}.dropdown-menu-agents .scrollerbox{display:flex;flex-direction:column;flex:fit-content;overflow-y:auto;height:215px}.dropdown-menu-agents label{cursor:pointer;display:flex;font-size:13px;justify-content:start;align-items:center;line-height:16px;background:#f9f9f9;padding:7px;margin:2px 0;border-radius:2px}.dropdown-menu-agents label:hover{background:#ebebeb}.dropdown-menu-agents label input{position:absolute;opacity:0}.dropdown-menu-agents .input-check{position:relative;display:inline-block;top:0;width:25px;height:23px;border:2px solid #ccc;border-radius:4px;margin-right:5px;transition:.5s}.dropdown-menu-agents label input:checked~.input-check{background:#06f;border-color:#06f;animation:animate .7s ease}@keyframes animate{0%{transform:scale(1)}40%{transform:scale(1.3,.7)}55%{transform:scale(1)}70%{transform:scale(1.2,.8)}80%{transform:scale(1)}90%{transform:scale(1.1,.9)}to{transform:scale(1)}}.dropdown-menu-agents .input-check:before{content:\"\";position:absolute;top:6px;left:4px;width:15px;height:6px;border-bottom:3px solid #fff;border-left:3px solid #fff;transform:scale(0) rotate(-45deg);transition:.5s}.dropdown-menu-agents label input:checked~.input-check:before{transform:scale(1) rotate(-45deg)}::ng-deep .h1,::ng-deep h1{font-size:1.165rem}::ng-deep .h2,::ng-deep h2{font-size:1.125rem}::ng-deep .h3,::ng-deep h3{font-size:1.125rem}::ng-deep b,::ng-deep strong{font-weight:600}@media (max-width: 768px){.note{width:90%;margin:0 auto;line-height:15px;padding:3px 0 10px}}.show-hover{display:none}.chat.bot:hover .show-hover{display:flex!important}\n"], dependencies: [{ kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i12.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i12.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i13.VideoPlayerComponent, selector: "app-video-player", inputs: ["currentUserId", "user", "eventId", "videoObj", "isDev", "type"], outputs: ["connectWithUser", "scheduleMeeting"] }, { kind: "component", type: i14.BotHtmlEditorComponent, selector: "lib-bot-html-editor", inputs: ["editorContent", "isDocInEditMode", "documentContent", "conversationId", "botId"] }, { kind: "pipe", type: i10.SlicePipe, name: "slice" }, { kind: "pipe", type: i10.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3640
3695
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatDrawerComponent, decorators: [{
3641
3696
  type: Component,
3642
- args: [{ selector: 'hivegpt-chat-drawer-package', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <button\n *ngIf=\"isShowEditorButton && !checkForCop29BotId()\"\n (click)=\"openOuterEditor()\"\n class=\"fixed-btn\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n create\n </span>\n Editor\n</button> -->\n\n<button\n *ngIf=\"!isShowEditorButton\"\n (click)=\"onCloseEditor()\"\n class=\"fixed-btn-close\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n close\n </span>\n {{ getTranslation(\"Close\") }}\n</button>\n\n<mat-drawer-container\n class=\"hivegpt-chat-bot-wrapper\"\n [ngClass]=\"{ 'mat-drawer-container-has-open': isDrawerOpen }\"\n [class.ios-device]=\"isIOSDevice\"\n [hasBackdrop]=\"hasBackdropValue\"\n>\n <mat-drawer\n class=\"drawer\"\n #drawer\n [position]=\"'start'\"\n [mode]=\"'over'\"\n opened=\"true\"\n [class.full-width-drawer]=\"fullView\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"chat-main\">\n <!-- <div class=\"chat-header\">\n <h2> -->\n <!-- {{eventName}} -->\n <!-- </h2> -->\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\n <span class=\"material-symbols-outlined\">\n close\n </span>\n </button> -->\n <!-- </div> -->\n\n <div class=\"innerChat\" #chatMain>\n <div (click)=\"startNewConversation()\" class=\"new-conversationbutton2\">\n {{ getTranslation(\"New Chat\") }}\n <span\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14.061\"\n height=\"14.261\"\n viewBox=\"0 0 14.061 14.261\"\n >\n <path\n id=\"Path_164\"\n data-name=\"Path 164\"\n d=\"M10.146,5.075H4.531A1.544,1.544,0,0,0,3,6.631v7.262A1.544,1.544,0,0,0,4.531,15.45h7.146a1.544,1.544,0,0,0,1.531-1.556V8.187m-7.146,4.15L15.25,3m0,0H11.677M15.25,3V6.631\"\n transform=\"translate(-2.25 -1.939)\"\n fill=\"none\"\n stroke=\"#06f\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.5\"\n />\n </svg>\n </span>\n </div>\n <div\n (click)=\"closeBot.emit()\"\n class=\"chat-close-button\"\n role=\"button\"\n [attr.aria-label]=\"getTranslation('Close') || 'Close'\"\n [attr.title]=\"getTranslation('Close') || 'Close'\"\n >\n \n <span class=\"chat-close-button-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div class=\"bot-sticky-header-chat\">\n <div class=\"title_chat\">\n <h2>\n <p>\n {{ getTranslation(botName) }}\n <!-- <svg\n *ngIf=\"!checkForCop29BotId()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"31.499\"\n height=\"31.501\"\n viewBox=\"0 0 31.499 31.501\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M33.685,7.83a1.125,1.125,0,0,0-.925-1.036,49.227,49.227,0,0,1-14.3-4.444,1.125,1.125,0,0,0-.927,0A49.226,49.226,0,0,1,3.24,6.794,1.125,1.125,0,0,0,2.315,7.83a27.621,27.621,0,0,0,1.718,11.9A24.572,24.572,0,0,0,9.07,27.641a25.712,25.712,0,0,0,8.513,6.028,1.125,1.125,0,0,0,.844,0,25.712,25.712,0,0,0,8.513-6.028,24.572,24.572,0,0,0,5.027-7.911,27.621,27.621,0,0,0,1.718-11.9Zm-9.211,5.281-7.791,9a1.125,1.125,0,0,1-.8.389h-.046a1.125,1.125,0,0,1-.788-.322L11.587,18.79a1.125,1.125,0,1,1,1.575-1.607l2.6,2.552,7.01-8.1a1.125,1.125,0,0,1,1.7,1.472Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg> -->\n </p>\n <span *ngIf=\"!checkForCop29BotId()\">\n <p class=\"small-title\">\n {{ getTranslation(\"AI-powered\")\n }}<span>{{ getTranslation(\"copilot\") }}</span>\n </p>\n </span>\n </h2>\n </div>\n <div class=\"chatType\" style=\"display: none\">\n <h4 class=\"labelChat\">Choose a conversation style</h4>\n <ul>\n <li (click)=\"changeTemperature(0)\">\n <button [ngClass]=\"{ active: temperature === 0 }\">\n <span class=\"top-section-title\"> More Creative </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{ active: temperature === 1 }\">\n <span class=\"top-section-title\"> More Balanced </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{ active: temperature === 2 }\">\n <span class=\"top-section-title\"> More Precise </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div\n id=\"botAllChat\"\n class=\"chat\"\n [ngClass]=\"{\n botUser: chat?.type === 'user',\n botAi: chat?.type !== 'user'\n }\"\n [attr.data-msg-id]=\"chat?._id || null\"\n *ngFor=\"let chat of chatLog; let i = index\"\n >\n <div class=\"chat-box\" *ngIf=\"!(i === 0 && botSkills)\">\n <div class=\"message\">\n <div\n class=\"time-cta\"\n [ngClass]=\"{\n 'time-cta din': showFeedBackIconsIndex === i,\n 'time-cta': showFeedBackIconsIndex != i\n }\"\n >\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"chat?.type === 'ai' && !(i === 0 && botSkills)\"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span style=\"color: #000 !important;\">{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"\n chat?.type === 'session_cards' ||\n chat?.type === 'attendee_cards'\n \"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\n <div class=\"user-Box\">\n <div class=\"dateTime\">\n <span>{{ getTranslation(\"You\") }}</span>\n {{ chat?.time }}\n </div>\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"userAvatarUrl\"\n [src]=\"userAvatarUrl\"\n alt=\"You\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!userAvatarUrl\"\n class=\"chat-avatar-initials chat-avatar-initials-user\"\n >{{ getUserIdInitials() }}</span\n >\n </div>\n </div>\n <div class=\"bards\">\n <div\n class=\"bars\"\n *ngIf=\"\n chat?.WorkflowExecutionId ||\n chat?.showWorkflowExecutionLoader\n \"\n >\n <button\n class=\"icon-button\"\n (click)=\"\n showWorkflowHistoryDetails(chat.WorkflowExecutionId)\n \"\n >\n <i class=\"fas fa-bars\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"researchingCard\"\n *ngIf=\"\n (chat?.searchTerms && chat?.searchTerms.length > 0) ||\n (chat?.sourcesList && chat?.sourcesList?.length > 0)\n \"\n >\n <div\n class=\"card-header d-flex align-items-center\"\n (click)=\"toggleCollapse()\"\n >\n <span class=\"icon\"\n ><i class=\"bx bx-plus-circle bx-sm\"></i\n ></span>\n <span class=\"ml-2\"\n >Researching\n <i\n id=\"toggleIcon\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fa-chevron-down': isCollapsed,\n 'fa-chevron-up': !isCollapsed\n }\"\n ></i\n ></span>\n </div>\n <div\n *ngIf=\"chat?.searchTerms && chat?.searchTerms.length > 0\"\n [ngClass]=\"{ collapse: isCollapsed }\"\n >\n <ul class=\"list-group list-group-flush uptList\">\n <li\n *ngFor=\"let term of chat?.searchTerms\"\n class=\"list-group-item\"\n >\n Searching for\n <strong>{{ term }}</strong>\n </li>\n </ul>\n\n <h5\n class=\"mt-2\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <i class=\"bx bx-unite\"></i> Sources\n </h5>\n <div\n class=\"sources-container\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <div\n class=\"source-card\"\n *ngFor=\"\n let source of chat?.displayedSources;\n let i = index\n \"\n >\n <div>\n <div class=\"source-title\">{{ source.title }}</div>\n <div class=\"source-url\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <div class=\"popup\">\n <div\n class=\"source-url\"\n (click)=\"openLinkInNewTab(source.link)\"\n >\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">\n {{ source.title }}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">\n {{ source.desc }}\n </p>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"\n chat?.remainingSources &&\n chat?.remainingSources.length > 0\n \"\n >\n <div\n class=\"source-card\"\n (click)=\"onCardClick(chat?.sourcesList)\"\n >\n <div>\n <div class=\"source-title\">\n <img\n *ngFor=\"\n let source of chat?.remainingSources;\n let i = index\n \"\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n </div>\n <div class=\"source-url\">\n View {{ chat?.remainingSources.length }} more\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Session cards (from get_event_sessions tool, same as React Native) -->\n <div\n class=\"session-cards-section\"\n *ngIf=\"\n chat?.type === 'session_cards' &&\n chat?.sessionCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"session-cards-container\">\n <div\n *ngFor=\"\n let session of getVisibleSessionCards(chat);\n let idx = index\n \"\n class=\"session-card-item\"\n [class.session-card-item-ondemand]=\"isSessionOndemand(session)\"\n >\n <!-- OnDemand design: pill, Available Anytime, title, description -->\n <ng-container *ngIf=\"isSessionOndemand(session)\">\n <span class=\"session-card-ondemand-badge\">{{ getTranslation('ON DEMAND') || 'ON DEMAND' }}</span>\n <div class=\"session-card-ondemand-available\">{{ getTranslation('Available Anytime') || 'Available Anytime' }}</div>\n <div class=\"session-card-title session-card-ondemand-title\">{{ session.title }}</div>\n <div\n class=\"session-card-description session-card-ondemand-desc\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-actions-row\"\n *ngIf=\"session.session && getSessionRoleButtons(session).length > 0\"\n >\n <div class=\"speakers-UIcard\"></div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"role.action === 'join'\"\n [class.session-card-btn-secondary]=\"role.action === 'watch'\"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n <!-- Default (Live/Breakout) design: date badge, room/time, title, meta, description, actions -->\n <ng-container *ngIf=\"!isSessionOndemand(session)\">\n <div class=\"session-card-header\">\n <div class=\"session-card-date-badge\">\n <ng-container *ngIf=\"session.dateDay || session.dateMonth\">\n <span class=\"session-card-date-day\">{{\n session.dateDay\n }}</span>\n <span class=\"session-card-date-month\">{{\n session.dateMonth\n }}</span>\n </ng-container>\n <span\n *ngIf=\"!session.dateDay && !session.dateMonth\"\n class=\"session-card-date-na\"\n >{{ getTranslation('N/A') || 'N/A' }}</span>\n </div>\n <div class=\"session-card-room-time\">\n <div\n class=\"session-card-room\"\n *ngIf=\"session.room\"\n >\n {{ session.room }}\n </div>\n <div\n class=\"session-card-time\"\n *ngIf=\"session.timeRangeWithTz || session.timeRange\"\n >\n {{ session.timeRangeWithTz || session.timeRange }}\n </div>\n </div>\n </div>\n <div class=\"session-card-title\">{{ session.title }}</div>\n <div\n class=\"session-card-meta\"\n *ngIf=\"(session.organizer && session.organizer.length) || (session.meetingType && session.meetingType.length)\"\n >\n <div class=\"session-card-meta-row\" *ngIf=\"session.organizer && session.organizer.length\">\n <span class=\"session-card-meta-label\">{{\n (getTranslation(\"Organizer\") || \"Organizer\") + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.organizer }}</span>\n </div>\n <!-- <div class=\"session-card-meta-row\" *ngIf=\"session.timeZoneDisplay\">\n <span class=\"session-card-meta-label\">{{\n getTranslation(\"Time zone\") || \"Time zone\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.timeZoneDisplay }}</span>\n </div> -->\n <div class=\"session-card-meta-row\" *ngIf=\"session.meetingType && session.meetingType.length\">\n <span class=\"session-card-meta-label\">{{\n getSessionTypeLabel() + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.meetingType }}</span>\n </div>\n </div>\n <div\n class=\"session-card-description\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-status\"\n *ngIf=\"\n (session.statusText && session.statusText.length) &&\n getSessionRoleButtons(session).length > 0\n \"\n >\n <span class=\"session-card-status-bullet\"></span>\n {{ session.statusText }}\n </div>\n <!-- <div\n class=\"session-card-when-disable\"\n *ngIf=\"\n session.session?.sessionRoles?.length > 0 &&\n !isSessionOndemand(session) &&\n !session.session?.isExpire &&\n !canPerformSessionAction(session)\n \"\n >\n {{ getTranslation(\"You can join/watch at the starting time\") || \"You can join/watch at the starting time\" }}\n </div> -->\n \n <div\n class=\"session-card-actions-row\"\n *ngIf=\"\n session.session &&\n (getSessionRoleButtons(session).length > 0 || hasSessionCardSpeakers(session))\n \"\n >\n <div class=\"speakers-UIcard\">\n <ng-container\n *ngIf=\"\n (session?.speakersList || session?.session?.speakersList || []).length\n as _speakerCount\n \"\n >\n <ng-container\n *ngFor=\"\n let sp of (session?.speakersList || session?.session?.speakersList || []);\n let i = index\n \"\n >\n <ng-container *ngIf=\"i < 3\">\n <div class=\"speaker\" *ngIf=\"getSpeakerPhotoUrl(sp); else speakerInitials\">\n <img\n [src]=\"getSpeakerPhotoUrl(sp)!\"\n [alt]=\"getSpeakerDisplayName(sp) || 'Speaker'\"\n />\n </div>\n <ng-template #speakerInitials>\n <div class=\"speaker initials\">\n {{ getSpeakerInitials(sp) }}\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n <div class=\"speaker initials\" *ngIf=\"_speakerCount > 3\">\n +{{ _speakerCount - 3 }}\n </div>\n </ng-container>\n </div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"\n role.action === 'join'\n \"\n [class.session-card-btn-secondary]=\"\n role.action === 'watch'\n \"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL >\n 4 &&\n !expandedSessionCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSessionCards(chat)\"\n >\n Show\n {{\n (chat?.sessionCards?.length || 0) - SESSION_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL ===\n 1\n ? getTranslation(\"session\") || \"session\"\n : getTranslation(\"sessions\") || \"sessions\"\n }}\n </button>\n </div>\n\n <!-- Attendee cards (from get_event_attendees tool, same as React Native) -->\n <div\n class=\"attendee-cards-section\"\n *ngIf=\"\n chat?.type === 'attendee_cards' &&\n chat?.attendeeCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let attendee of getVisibleAttendeeCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(attendee)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(attendee) && attendee.photo\n ? 'url(' + attendee.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(attendee)\">\n <video\n #attendeeVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(attendee) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, attendee)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, attendee, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(attendee)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, attendee)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, attendee)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(attendee) && !attendee.photo\"\n >\n {{ getAttendeeInitials(attendee.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ attendee.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"attendee.company\"\n >\n {{ attendee.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, attendee)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, attendee)\"\n *ngIf=\"getAttendeeDescription(attendee)\"\n >\n {{ getAttendeeDescription(attendee) }}\n </div>\n \n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(attendee.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!attendee.id\"\n [attr.title]=\"\n !attendee.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation(\"View Profile\") || \"View Profile\" }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL >\n 4 &&\n !expandedAttendeeCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandAttendeeCards(chat)\"\n >\n Show\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL\n }}\n more\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL ===\n 1\n ? getTranslation(\"attendee\") || \"attendee\"\n : getTranslation(\"attendees\") || \"attendees\"\n }}\n </button>\n </div>\n\n <!-- Speaker cards (from get_event_speakers tool, same layout/behavior as attendee cards) -->\n <div\n class=\"speaker-cards-section\"\n *ngIf=\"\n chat?.type === 'speaker_cards' &&\n chat?.speakerCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let speaker of getVisibleSpeakerCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(speaker)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(speaker) && speaker.photo\n ? 'url(' + speaker.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(speaker)\">\n <video\n #speakerVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(speaker) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, speaker)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, speaker, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(speaker)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, speaker)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, speaker)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(speaker) && !speaker.photo\"\n >\n {{ getAttendeeInitials(speaker.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ speaker.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.jobTitle\"\n >\n {{ speaker.jobTitle }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.company\"\n >\n {{ speaker.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, speaker)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, speaker)\"\n *ngIf=\"getAttendeeDescription(speaker)\"\n >\n {{ getAttendeeDescription(speaker) }}\n </div>\n \n\n <div class=\"attendee-buttons\">\n \n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!speaker.id\"\n [attr.title]=\"\n !speaker.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n chat?.type === 'speaker_cards'\n ? viewSpeakerProfile.emit({\n speaker,\n speakers: chat.speakerCards || []\n })\n : speaker.id &&\n connectWithUser.emit({\n userId: speaker.id,\n viewProfile: true\n })\n \"\n >\n {{\n getTranslation('View Profile') || 'View Profile'\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL >\n 4 &&\n !expandedSpeakerCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSpeakerCards(chat)\"\n >\n Show\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL\n }}\n more\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL ===\n 1\n ? getTranslation('speaker') || 'speaker'\n : getTranslation('speakers') || 'speakers'\n }}\n </button>\n </div>\n\n <!-- Sponsor cards (from get_event_sponsors tool, booth-rep style) -->\n <div\n class=\"sponsor-cards-section\"\n *ngIf=\"\n chat?.type === 'sponsor_cards' &&\n chat?.sponsorCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"booth-rep-card-grid\">\n <div\n *ngFor=\"\n let sponsor of getVisibleSponsorCards(chat);\n let idx = index\n \"\n class=\"booth-rep-card\"\n >\n <div class=\"booth-rep-card-logo\">\n <span\n class=\"booth-rep-card-logo-placeholder\"\n *ngIf=\"!sponsor.logoUrl\"\n >\n {{ sponsor.boothTitle ? sponsor.boothTitle.charAt(0) : (sponsor.name ? sponsor.name.charAt(0) : '') }}\n </span>\n <img\n *ngIf=\"sponsor.logoUrl\"\n [src]=\"sponsor.logoUrl\"\n [alt]=\"sponsor.boothTitle || sponsor.name\"\n />\n </div>\n <h3 class=\"booth-rep-card-title\">\n {{ sponsor.boothTitle || sponsor.name }}\n </h3>\n <p\n class=\"booth-rep-card-desc\"\n *ngIf=\"sponsor.description\"\n >\n {{ sponsor.description }}\n </p>\n <button\n type=\"button\"\n class=\"booth-rep-card-btn\"\n (click)=\"viewBooth.emit({ boothId: sponsor.boothID, boothUrl: sponsor.url, sponsor })\"\n >\n {{ getTranslation('View Sponsor') || 'View Sponsor' }}\n </button>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL >\n 4 &&\n !expandedSponsorCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSponsorCards(chat)\"\n >\n Show\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL ===\n 1\n ? getTranslation('sponsor') || 'sponsor'\n : getTranslation('sponsors') || 'sponsors'\n }}\n </button>\n </div>\n\n <!-- Booth representative cards (from get_booth_representatives tool, same design as attendee cards) -->\n <div\n class=\"attendee-cards-section booth-rep-cards-section\"\n *ngIf=\"\n chat?.type === 'booth_rep_cards' &&\n chat?.boothRepCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let rep of getVisibleBoothRepCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [style.background-image]=\"rep.photo ? 'url(' + rep.photo + ')' : null\"\n >\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!rep.photo\"\n >\n {{ getAttendeeInitials(rep.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ rep.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.company\"\n >\n {{ rep.company }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.jobTitle\"\n >\n {{ rep.jobTitle }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, rep)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, rep)\"\n *ngIf=\"getAttendeeDescription(rep)\"\n >\n {{ getAttendeeDescription(rep) }}\n </div>\n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(rep.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n *ngIf=\"rep.id\"\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [attr.title]=\"getTranslation('View Profile') || 'View Profile'\"\n (click)=\"\n connectWithUser.emit({\n userId: rep.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation('View Profile') || 'View Profile' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL >\n 4 &&\n !expandedBoothRepCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandBoothRepCards(chat)\"\n >\n Show\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL\n }}\n more\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL ===\n 1\n ? getTranslation('representative') || 'representative'\n : getTranslation('representatives') || 'representatives'\n }}\n </button>\n </div>\n\n <div\n class=\"chat-bubble-wrap\"\n *ngIf=\"\n (chat?.type === 'ai' || chat?.type === 'user') &&\n !(i === 0 && botSkills)\n \"\n [ngStyle]=\"{\n background:\n chat?.type === 'ai'\n ? bgBubbleAi || '#fff'\n : chat?.type === 'user'\n ? bgBubbleUser || '#183988'\n : 'transparent',\n color:\n chat?.type === 'ai'\n ? '#000 !important'\n : '#fff !important'\n }\"\n >\n <div id=\"messageText_{{ i }}\" class=\"chat-bubble-content\">\n <div\n *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\"\n [ngClass]=\"{\n 'SearchTitle ai': chat?.type === 'ai',\n 'SearchTitle user': chat?.type === 'user'\n }\"\n [ngStyle]=\"{\n background: 'transparent',\n color:\n chat?.type === 'ai' && messageTextColorAi\n ? messageTextColorAi\n : chat?.type === 'user'\n ? messageTextColorUser || '#fff'\n : 'defaultColor'\n }\"\n [innerHTML]=\"chat?.message\"\n ></div>\n </div>\n </div>\n\n <div\n class=\"progress-container\"\n *ngIf=\"chat?.showWorkflowExecutionLoader\"\n >\n <div class=\"circular-loader\">\n <div\n class=\"loader-spinner\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n [ngStyle]=\"{\n transform: 'rotate(' + percentage * 3.6 + 'deg)'\n }\"\n ></div>\n <div\n class=\"checkmark\"\n *ngIf=\"currentWorkflowActionProgress == 100\"\n >\n <svg viewBox=\"0 0 52 52\">\n <circle\n class=\"checkmark-circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkmark-check\"\n fill=\"none\"\n d=\"M14 27l7 7 16-16\"\n />\n </svg>\n </div>\n\n <div\n class=\"loader-text\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n >\n {{ currentWorkflowActionProgress }}%\n </div>\n </div>\n <div class=\"loader-label\">{{ currentWorkflowAction }}...</div>\n </div>\n\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.graphs &&\n chat?.graphs.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Graphs\n <i\n (click)=\"toggleCollapseFGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForFGraph,\n 'fas fa-chevron-up': !isCollapsedForFGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.graphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForFGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n <ng-container *ngIf=\"!checkForCop29BotId()\">\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.executionGraphs &&\n chat?.executionGraphs?.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Execution Path Diagram\n For Data Visualization Workflow\n <i\n (click)=\"toggleCollapseGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForGraph,\n 'fas fa-chevron-up': !isCollapsedForGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.executionGraphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n </ng-container>\n <div class=\"cta\" *ngIf=\"chat?.type === 'ai' && i > 0 && i === lastAiMessageIndex\">\n <div\n class=\"copyBox\"\n title=\"Copy\"\n [ngClass]=\"\n showFeedBackIconsIndex == i ? 'show-always' : 'show-hover'\n \"\n >\n <button\n title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\"\n class=\"copy\"\n [class.active]=\"chat?.copied\"\n (click)=\"handleCopyClick(i)\"\n >\n <i *ngIf=\"chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button>\n<!-- \n <button\n *ngIf=\"!checkForCop29BotId()\"\n class=\"up copy\"\n title=\"{{ chat?.isEditor ? 'Added!' : 'Add to editor' }}\"\n (click)=\"handleEditorClick(i)\"\n >\n <svg\n *ngIf=\"!chat?.isEditor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20.152\"\n height=\"20.152\"\n viewBox=\"0 0 20.152 20.152\"\n >\n <g\n id=\"Icon_feather-edit\"\n data-name=\"Icon feather-edit\"\n transform=\"translate(-2.5 -2.166)\"\n >\n <path\n id=\"Path_166\"\n data-name=\"Path 166\"\n d=\"M11.5,6H4.889A1.889,1.889,0,0,0,3,7.889v13.22A1.889,1.889,0,0,0,4.889,23h13.22A1.889,1.889,0,0,0,20,21.108V14.5\"\n transform=\"translate(0 -1.179)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n <path\n id=\"Path_167\"\n data-name=\"Path 167\"\n d=\"M21.915,3.4a2,2,0,0,1,2.833,2.833l-8.971,8.971L12,16.152l.944-3.777Z\"\n transform=\"translate(-3.334 0)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n </g>\n </svg>\n\n <i *ngIf=\"chat?.isEditor\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button> -->\n\n <button\n class=\"up copy\"\n title=\"Like\"\n [class.active]=\"chat?.liked\"\n (click)=\"handleUpClick(i)\"\n >\n <i *ngIf=\"chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\n fill=\"#17235B\"\n />\n <path\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n <i *ngIf=\"!chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n <button\n class=\"down copy\"\n title=\"Dislike\"\n [class.active]=\"chat?.unliked\"\n (click)=\"handleDownClick(i)\"\n >\n <i *ngIf=\"chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\n fill=\"#17235B\"\n />\n\n <path\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n </div>\n </div>\n <div\n class=\"Related mt-2\"\n *ngIf=\"\n showFeedBackIconsIndex === i &&\n !isChatingWithAi &&\n chat?.relatedListItems &&\n chat?.relatedListItems.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-list-check\"></i> Related\n </h5>\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\n <li (click)=\"fetchDataFor(item, chat)\">{{ item }}</li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"cta-faqs quick-prompts-extended\"\n *ngIf=\"i == 0 && quickPrompts?.length\"\n >\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\n (click)=\"sendMessageWithTile(tile.prompt)\">\n Q: {{ tile.text }}\n </div> -->\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let tile of quickPrompts\"\n (click)=\"sendMessageWithTile(tile.prompt)\"\n >\n <ng-container *ngIf=\"tile\">{{ tile.text }}</ng-container>\n </button>\n </div>\n </div>\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n </div>\n <div\n class=\"chat-bubble-wrap\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <div class=\"chat-bubble-content\">\n <div\n class=\"SearchTitle ai\"\n [innerHTML]=\"processMessageForDisplay(botSkills)\"\n ></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.suggestions?.length\">\n <h4 class=\"labelChat\">\n Here are some things EventsGPT Copilot can help you do:\n </h4>\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let suggestion of chat?.suggestions\"\n (click)=\"sendMessageWithTile(suggestion)\"\n >\n <ng-container *ngIf=\"suggestion\">{{\n suggestion\n }}</ng-container>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"\n chat?.action?.section_id == 'company_search' ||\n chat?.action?.section_id == 'user_search' ||\n chat?.action?.section_id == 'industry_company_search'\n \"\n >\n <div class=\"box\">\n <div class=\"tiktokwrapper\">\n <div\n class=\"tiktokshell\"\n *ngFor=\"let user of chat?.action.users\"\n >\n <div class=\"videoPhotobox\">\n <ng-conatiner\n *ngIf=\"user?.photoPath && !user.userVideosModel\"\n >\n <img [src]=\"user?.photoPath\" />\n </ng-conatiner>\n <ng-conatiner *ngIf=\"user.userVideosModel\">\n <app-video-player\n *ngIf=\"user?.userVideosModel\"\n [isDev]=\"isDev\"\n [currentUserId]=\"userId\"\n [videoObj]=\"user?.userVideosModel\"\n [user]=\"user\"\n [eventId]=\"eventId\"\n type=\"1\"\n >\n </app-video-player>\n </ng-conatiner>\n </div>\n\n <div\n class=\"noPhoto\"\n *ngIf=\"!user?.photoPath && !user.userVideosModel\"\n >\n <h3>\n {{ user.firstName | slice: 0 : 1\n }}{{ user.lastName | slice: 0 : 1 }}\n </h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\"></div>\n <div class=\"onshell-content\">\n <div class=\"title-shell\">\n <h3>{{ user.firstName }} {{ user.lastName }}</h3>\n <h3 class=\"companyName\">{{ user.company }}</h3>\n </div>\n <div class=\"button-shell\">\n <button\n class=\"Connectbtn\"\n (click)=\"connectToUser(user.userId)\"\n >\n {{\n canConnect(user.userId)\n ? \"Connect\"\n : canDisconnect(user.userId)\n ? \"Disconnect\"\n : \"Request\n Sent\"\n }}\n </button>\n <button\n class=\"schedulebtn\"\n (click)=\"scheduleMeetingWithUser(user)\"\n >\n Schedule\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.action?.section_id == myUpcomingSessionAction\">\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\n <div class=\"list-view\">\n <div\n class=\"session-detail-wrapper card-background-session\"\n *ngFor=\"let upcomingSession of chat?.action.content\"\n >\n <div class=\"thumbnail\">\n <img\n alt=\"Introduction to the Imaging Radar Academy\"\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\n class=\"\"\n />\n <!---->\n <!---->\n <!----><button\n class=\"play-btn color-primary\"\n title=\"Watch: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n <!---->\n </button>\n <!---->\n <!---->\n </div>\n <!---->\n <!---->\n <div class=\"content p-3\">\n <div\n class=\"d-flex justify-content-between align-items-center\"\n >\n <div class=\"d-flex flex-column\">\n <p class=\"fs-xs mb-0 body-text-color\">\n {{\n upcomingSession.dateTimeRange.start\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n -\n {{\n upcomingSession.dateTimeRange.end\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n {{ upcomingSession.timeZone.id }}\n </p>\n <!---->\n <!---->\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\n <!---->\n </div>\n <div class=\"d-flex align-items-center actions px-2\">\n <!---->\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'view-session'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n remove_red_eye\n </span>\n </button>\n\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'add-to-agenda'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n >\n <span\n class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\"\n >\n event_available\n </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button\n (click)=\"\n performSessionAction(upcomingSession.id, 'play')\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"Copy session link to share\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">\n {{ upcomingSession.title }}\n </h2>\n <div\n class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\"\n ></div>\n <ul\n class=\"speakers grid-2-cols\"\n *ngFor=\"let speakerId of upcomingSession.speakers\"\n >\n <li class=\"\">\n <div class=\"image\" title=\"Blair Wunderlich\">\n <img\n alt=\"Blair Wunderlich\"\n [src]=\"speakers[speakerId]?.photoPath\"\n class=\"\"\n />\n <!---->\n <!---->\n <!---->\n </div>\n <!---->\n <div\n class=\"content pl-3\"\n style=\"text-transform: none\"\n >\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\n {{ speakers[speakerId]?.firstName }}\n {{ speakers[speakerId]?.lastName }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.jobTitle }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.company }}\n </div>\n </div>\n <!---->\n </li>\n </ul>\n <!---->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Initial load: loading dots when fetching chat history (no \"Thinking\") -->\n <div class=\"chat bot chat-thinking chat-loading-dots\" *ngIf=\"loading && !isChatingWithAi\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Loading\") || \"Loading\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n <!-- Thinking: only when user has sent a message and AI is responding -->\n <div class=\"chat bot chat-thinking\" *ngIf=\"isChatingWithAi && !executingWorkflow\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Thinking\") || \"Thinking\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div\n *ngIf=\"openWorkflowInput && selectedWorkflow && !executingWorkflow\"\n class=\"chatFooterWrapper\"\n >\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\">\n <div class=\"agents_note_wrapper\">\n <div>\n <h6>{{ selectedWorkflow?.Name }}</h6>\n {{ selectedWorkflow?.Description }}\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"toggleWorkflows(false)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- here i need to loop through all the input fields selectedWorkflow.Trigger.InputSchema and render the input fields -->\n <!-- Form for Workflow Inputs -->\n <form\n [formGroup]=\"workflowForm\"\n (ngSubmit)=\"onWorkflowSubmit()\"\n class=\"form-container\"\n >\n <div\n *ngFor=\"let input of selectedWorkflow?.Trigger?.InputSchema\"\n class=\"form-group\"\n >\n <label>{{ input.Label }}</label>\n\n <!-- Handle Text Input or Text Area based on requirement -->\n <textarea\n *ngIf=\"input.Type === 'string'\"\n formControlName=\"{{ input.InputId }}\"\n [placeholder]=\"input.Placeholder\"\n [rows]=\"2\"\n [required]=\"input.Required\"\n class=\"form-control\"\n ></textarea>\n\n <!-- Dropdown for Select Options -->\n <select\n *ngIf=\"input.Type === 'select'\"\n formControlName=\"{{ input.InputId }}\"\n class=\"form-control\"\n >\n <option\n *ngFor=\"let option of input.Options\"\n [value]=\"option.Value\"\n >\n {{ option.Label }}\n </option>\n </select>\n </div>\n\n <!-- Submit button aligned to the right -->\n <div class=\"form-group\">\n <button type=\"submit\" class=\"btn btn-primary submit-button\">\n Submit\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n <div *ngIf=\"!openWorkflowInput\" class=\"chatFooterWrapper\">\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\" *ngIf=\"!checkForCop29BotId()\">\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\n <div class=\"dropdown-header\">\n <span>{{ getDropdownHeaderText() }}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <label (click)=\"onSelectAll()\">\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\n All\n </label>\n <label\n *ngFor=\"let agent of agents\"\n (click)=\"onAgentChange(agent)\"\n >\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\n {{ agent.agentName }}\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleWorkflows()\">\n <div class=\"dropdown-header\">\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 256 256\"\n class=\"h-5 w-5\"\n height=\"1.3em\"\n width=\"1.3em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M245.66,74.34l-32-32a8,8,0,0,0-11.32,11.32L220.69,72H192a74.49,74.49,0,0,0-28.35,6.73c-13.62,6.29-30.83,19.71-35.54,48-5.32,31.94-29.1,39.22-41,40.86a40,40,0,1,0,.18,16.06A71.65,71.65,0,0,0,108.13,178C121.75,172,139,158.6,143.89,129.31,150.65,88.77,190.34,88,192,88h28.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,74.34ZM48,200a24,24,0,1,1,24-24A24,24,0,0,1,48,200Z\"\n ></path></svg\n >&nbsp; Workflows\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isWorkflowOpen\">\n <label\n *ngFor=\"let orgWorkflow of orgWorkflows\"\n (click)=\"onWorkflowSelected(orgWorkflow)\"\n >\n {{ orgWorkflow.Name }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n \n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput /> -->\n <textarea\n [disabled]=\"isChatingWithAi\"\n class=\"form-control-1 s27-scroll chat-textarea\"\n placeholder=\"{{ getTranslation('Ask anything') }}\"\n [(ngModel)]=\"input\"\n (keydown)=\"handleKeydown($event)\"\n (input)=\"adjustTextareaHeight($event)\"\n #myInput\n ></textarea>\n\n \n\n <button\n class=\"btn cta-chat rotate\"\n (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n title=\"{{ getTranslation('Send Message') }}\"\n style=\"margin-right: 1px\"\n >\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 512 512\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\"\n ></path>\n </svg>\n <!-- SEND -->\n </button>\n\n <button\n class=\"btn cta-chat mr-1 voice-btn\"\n (click)=\"openVoiceModal()\"\n type=\"button\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n >\n <svg\n class=\"voice-btn-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <rect class=\"vbar vbar-1\" x=\"3\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-2\" x=\"7\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-3\" x=\"11\" y=\"3\" width=\"2\" height=\"18\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-4\" x=\"15\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-5\" x=\"19\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n <span class=\"voice-btn-text\">Voice</span>\n </button>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n\n <div class=\"NoteTxt\">\n <div class=\"note\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12.882\"\n height=\"12.883\"\n viewBox=\"0 0 12.882 12.883\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M15.106,4.532a.46.46,0,0,0-.378-.424A20.132,20.132,0,0,1,8.881,2.291a.46.46,0,0,0-.379,0A20.132,20.132,0,0,1,2.655,4.108a.46.46,0,0,0-.378.424A11.3,11.3,0,0,0,2.98,9.4a10.049,10.049,0,0,0,2.06,3.235A10.516,10.516,0,0,0,8.521,15.1a.46.46,0,0,0,.345,0,10.516,10.516,0,0,0,3.481-2.465A10.049,10.049,0,0,0,14.4,9.4,11.3,11.3,0,0,0,15.106,4.532Zm-3.767,2.16L8.153,10.373a.46.46,0,0,1-.328.159H7.806a.46.46,0,0,1-.322-.131L6.069,9.014a.46.46,0,1,1,.644-.657L7.777,9.4,10.644,6.09a.46.46,0,0,1,.7.6Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg>\n\n <span class=\"text\">{{\n getTranslation(\n \"Your personal or company information is kept private and secure\n within this chat.\"\n )\n }}</span>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #sourcesDrawer\n [position]=\"'end'\"\n [mode]=\"'over'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n <div class=\"container-fluid\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"onCloseSource()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{ currentSourcesList?.length }} Sources</h1>\n <!-- <p>Tell me about latest news from Mistral about AI agents announcement done this month</p> -->\n <hr />\n <ul class=\"sources-list\">\n <li *ngFor=\"let item of currentSourcesList; let si = index\">\n <!-- <input type=\"checkbox\" id=\"source1\"> -->\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\n <label for=\"source1\">\n <span class=\"source-title\"\n ><span class=\"ml-1\">{{ si + 1 }}.</span\n >{{ item.title }}</span\n >\n <span class=\"image-container\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\"\n />\n <span> {{ getDomainName(item.link) }}</span>\n </span>\n <span class=\"source-description\">{{ item.desc }}</span>\n </label>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #editorsDrawer\n [position]=\"'end'\"\n [mode]=\"'push'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <lib-bot-html-editor\n *ngIf=\"isContentLoaded\"\n [editorContent]=\"currentMessageForEditor\"\n [isDocInEditMode]=\"isDocInEditMode\"\n [documentContent]=\"documentContent\"\n [conversationId]=\"conversationId\"\n [botId]=\"botId\"\n ></lib-bot-html-editor>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>\n\n<div *ngIf=\"showWorkflowExecutionDetails\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"close-wrapper\">\n <span class=\"close_pop\" (click)=\"closeModal()\">&times;</span>\n </div>\n <div class=\"titleSection\">\n <!-- Workflow Title -->\n <h2>{{ workflowExecutionDetails.WorkflowName }}</h2>\n <!-- Workflow Title -->\n </div>\n <!-- Inputs Section -->\n <div class=\"inputs-section\">\n <h3>Inputs</h3>\n <ul>\n <li\n *ngFor=\"let input of objectToArray(workflowExecutionDetails.Inputs)\"\n >\n {{ input.key }}: {{ input.value }}\n </li>\n </ul>\n </div>\n\n <!-- Actions Section (Displayed as Timeline) -->\n <div class=\"actions-section\">\n <h3>Agent Actions</h3>\n <div class=\"timeline\">\n <div\n *ngFor=\"let action of workflowExecutionDetails.Actions\"\n class=\"timeline-item\"\n >\n <div class=\"timestamp-section\">\n <h4>{{ action.ActionName || action.Name }}</h4>\n <p><strong></strong> {{ action.InsertTimeStamp }}</p>\n </div>\n <p [innerHTML]=\"processMessageForDisplay(action.Output)\"></p>\n <!-- <pre>{{ action.Output }}</pre> -->\n </div>\n </div>\n </div>\n\n <!-- Insert Timestamp -->\n <div class=\"timestamp-section\">\n <p>\n <strong>Inserted At:</strong>\n {{ workflowExecutionDetails.InsertTimeStamp }}\n </p>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\";.bot-sticky-header-chat{background:#fff;border-bottom:1px solid #ddd;padding:0 0 10px;position:fixed;top:0!important;transition:all 1s;z-index:100;width:100%;padding:10px 15px!important;box-shadow:2px 0 5px #e1e1e1!important;border:none!important}@media (max-width: 768px){.bot-sticky-header-chat{top:0!important}}#botAllChat{padding:0 20px!important}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#e5ccbc}::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-bot-wrapper{position:fixed;height:100%;inset:0;opacity:0;visibility:hidden;z-index:999999;background:transparent!important}.hivegpt-chat-bot-wrapper.mat-drawer-container-has-open{opacity:1;visibility:visible;z-index:999999;transition:all .3s;background:transparent!important}.hivegpt-chat-bot-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-bot-wrapper mat-drawer{width:100%;background-image:none!important;background-color:#f2f2f2}.hivegpt-chat-bot-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-bot-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-bot-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-bot-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;margin:0;font-size:36px;font-weight:500;line-height:108%;letter-spacing:-.72px;text-transform:uppercase}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{position:absolute;top:16px;right:12px;border:none;padding:0;background:transparent;outline:none;width:35px;height:35px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:18px}.hivegpt-chat-bot-wrapper .chat-main{width:100%;flex:1;overflow-y:auto;display:flex;flex-direction:column;justify-content:space-between}.hivegpt-chat-bot-wrapper .chat-main .innerChat{overflow-y:auto;width:100%;padding-top:72px!important}.hivegpt-chat-bot-wrapper .chat-main .ai h3{font-size:1.3rem!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box{width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{min-height:40px;position:relative;margin-top:10px;margin-left:50px}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{margin-left:0}}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p{font-family:Segoe UI,sans-serif;font-weight:400;font-size:14px;font-style:normal;line-height:160%;margin:0;color:#000;text-align:left;color:#525252}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p a{cursor:pointer!important;text-decoration:underline;font-weight:700;color:#17235b!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta{display:flow-root;align-items:end;grid-gap:10px;gap:10px;position:relative;bottom:-7px;right:-10px;z-index:5}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message{margin-left:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:4px 14px 14px;background:#fff;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content{width:100%;max-width:100%;margin:0;padding:0;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{margin:0;padding:0;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div *{max-width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .Icon_TimeSTamp{margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser{text-align:right;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box{margin-left:auto;margin-right:0;width:-moz-fit-content;width:fit-content}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message{margin-left:0;margin-right:0;padding-right:0;width:-moz-fit-content;width:fit-content;max-width:100%;display:flex;flex-direction:column;align-items:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:14px 4px 14px 14px;background:#183988;padding:10px 14px;color:#fff!important;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap p,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message p{text-align:left;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime{text-align:right;margin-left:0;margin-right:10px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime span{margin-left:0;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .time-cta{justify-content:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .Icon_TimeSTamp{justify-content:flex-end;margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{display:flex;justify-content:left;align-content:center;align-items:center;margin:0 -60px;width:auto}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{margin:0}}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime{font-size:15px;font-style:normal;font-weight:300;line-height:140%;color:#333232}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime span{font-size:15px;font-style:normal;font-weight:500;line-height:140%;color:#000;margin-left:15px;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-bot-wrapper .chatFooterWrapper{background:#fff;margin-top:10px!important;box-shadow:2px 0 5px #e1e1e1;width:auto;margin:0 15px 15px;border:2px solid rgba(218,218,218,.5882352941);border-radius:10px;transition:all .5s}.hivegpt-chat-bot-wrapper .chatFooterWrapper:hover{box-shadow:2px 0 4px #ddd;border:2px solid rgba(184,184,184,.5882352941)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .chat-footer-upt{padding:4px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note{display:inline-flex;align-items:center;gap:8px;font-size:12px;line-height:1;margin:0 auto 4px;color:#000;padding:10px 25px;border-radius:15px;background:rgba(27,117,187,.0509803922)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i svg{width:18px;height:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-bot-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:0;position:relative}.hivegpt-chat-bot-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-bot-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;text-align:right;position:absolute;right:15px;margin-bottom:10px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;border:none;border-radius:0;box-shadow:0 1px 2px #1018280d;display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto;background:transparent!important}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-again{border:1px solid #17235b;background:#17235b;color:#fff}.hivegpt-chat-bot-wrapper .cta-faqs{display:flex;align-items:flex-end;flex-direction:column;flex-wrap:wrap;gap:8px;padding:10px 0 0;max-width:80%;margin-left:auto}.hivegpt-chat-bot-wrapper .cta-faqs .cta{font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;color:#333;white-space:pre-line;border-radius:20px 20px 0;background:transparent;padding:12px 20px;min-height:44px;text-decoration:none;transition:all .3s;cursor:pointer;border:1px solid #c9a893;text-align:left}.spinner{display:flex;align-items:center;justify-content:center;gap:2px}.spinner>div{width:5px;height:5px;background-color:#173330;border-radius:100%;display:inline-block;animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.time-cta{display:flex;align-items:center;justify-content:start;gap:8px;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width: 767px){.hivegpt-chat-bot-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{top:8px;right:8px;width:28px;height:28px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-bot-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{background:#17235b;border:#17235b;border-radius:50%;width:50px;height:50px;font-size:24px;color:#fff;display:inline-flex;align-items:center;justify-content:center}textarea{caret-color:#000}.labelChat{margin:0 0 10px;font-weight:400;font-size:14px}.chatType h4{text-align:center;color:#566563}.chatType ul{list-style:none;padding:4px;margin:0 0 20px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px #0000001f,0 1.6px 3.6px #00000029}.chatType ul li{flex:1}.chatType ul li button{width:100%;text-align:center;background:#fff;align-items:center;border:none;padding:.375rem;min-height:48px;border-radius:10px;font-weight:600;text-shadow:1px 0px rgba(0,0,0,.2)}.chatType ul li button.active{box-shadow:0 1px 2px #1018280d;background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);color:#fff}.cta_suggestions{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{color:#1543cd;background:#fff;border:1px solid #174ae4;padding:8px 12px;border-radius:10px;font-size:14px;line-height:1.2;font-weight:600;text-align:left;position:relative;transition:all .3s;box-shadow:#00000021 0 1.6px 3.6px,#0000001a 0 .3px .9px}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.botUser .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #0066ff}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.botUser .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{color:#fff;background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%)}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:20px}.title h2{font-size:22px;margin:0}.title h2 span{color:#000;display:inline-flex;align-items:center;gap:10px}.title h2 i{line-height:1;font-size:30px;color:#000}.title h2 i svg{width:30px;height:30px}.title p{margin:0;font-weight:600}.title p span{color:#000}.agenda-items-wrapper{padding-top:15px;padding-bottom:15px}@media (max-width: 576px){.list-view .session-detail-wrapper{flex-direction:column;border:none}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{font-size:20px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:1;line-clamp:1;-webkit-box-orient:vertical;margin-bottom:8px}.card-background-session .session-description{color:#111!important;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:14px}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{width:160px;height:160px;min-width:160px;position:relative;display:flex;align-items:center;justify-content:center}.thumbnail img{height:100%;width:100%;object-fit:cover}@media (max-width: 576px){.thumbnail{width:100%;min-height:unset;height:160px}}.thumbnail .play-btn{font-size:60px;background-color:transparent;border:0;position:absolute;inset:0;width:100%;display:flex;align-items:center;justify-content:center}.thumbnail .play-btn span{font-size:80px;text-shadow:0px 0px 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{padding:0;margin-top:10px;margin-bottom:0}.speakers li{display:flex;align-items:unset}.speakers li .content{font-size:12px!important}.speakers .image{height:40px;width:40px;min-width:40px;border-radius:100%;overflow:hidden}.speakers img{height:100%;width:100%;object-fit:cover}.grid-2-cols{display:grid;grid-template-columns:calc(55% - 10px) calc(50% - 10px);grid-gap:15px;padding-right:20px}@media (max-width: 768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width: 575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape .s27-scroll::-webkit-scrollbar{width:3px;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{width:100%;height:275px;margin:10px 0;display:table}.tiktokwrapper{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;height:100%}.tiktokwrapper .tiktokshell{width:100%;min-width:160px;height:100%;min-height:275px;position:relative;border-radius:5px;background:#3d2b8f;box-shadow:0 0 6px #494949;border:2px solid #fff}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;position:absolute;z-index:6;bottom:0;left:0;width:100%;height:100%}.tiktokwrapper .videoPhotobox{position:absolute;z-index:6;bottom:0;left:0;width:auto;overflow:hidden;height:272px}.tiktokwrapper .videoPhotobox video{width:100%;height:270px;outline:0;object-fit:cover;border-radius:0;cursor:pointer;transition:.3s ease-in-out}.tiktokwrapper .videoPhotobox img{width:100%;height:100%;object-fit:cover}.tiktokwrapper .playBtn{position:absolute;left:0;right:0;margin:0 auto;z-index:10;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;width:40px;top:105px}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{position:absolute;left:0;right:0;margin:0 auto;z-index:6;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;top:105px}.tiktokwrapper .noPhoto h3{font-size:46px;color:#fff}.tiktokwrapper .onshell-content{position:absolute;bottom:10px;left:5px;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;padding:4px 7px;color:#fff;margin:0 1px;text-transform:capitalize;font-size:11px}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#0066ff 0%,#0066ff 100%)!important}.skeleton-box{display:inline-block;height:1em;position:relative;overflow:hidden;background-color:#dddbdd}.skeleton-box:after{position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,rgba(255,255,255,0) 0,rgba(255,255,255,.2) 20%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0));animation:shimmer 2s infinite;content:\"\";z-index:0}@keyframes shimmer{to{transform:translate(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{font-size:.85em;color:#6b6b6b}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{width:18px;height:18px;fill:#566563}.copyBox{padding:5px 10px;position:relative;border-radius:13px;width:135px;color:#566563;display:flex;gap:12px;float:right;background:#f7f7f7}.copyBox button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{flex-direction:column;justify-content:center;align-items:center;border-top:1px solid #ccc;background-color:#f5f5f5}.chat-footer{display:flex;align-items:center;width:100%;background:#fff;margin-bottom:10px;flex-direction:column}.topinfo-containerbox{display:none;justify-content:space-between;width:100%;background:#f9f9f9;padding:5px 10px 8px;align-items:center;border-bottom:1px solid #efefef;margin:0}@media (max-width: 768px){.topinfo-containerbox{flex-direction:column}}.agents_note_wrapper{display:flex;justify-content:space-around}.bottombox-wrapper{display:flex;width:100%;padding:10px}.dropdown-wrapper{position:relative;margin-right:10px}.dropdown-header{display:flex;align-items:center;cursor:pointer;background:#fff;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid #ddd}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:230px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;padding:5px 15px;font-size:16px}.dropdown-menu label input{width:16px;height:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{width:100%;border:1px solid #ddd;border-radius:5px;padding:10px}.cta-footer{display:flex;align-items:center}.text-left .note-section{width:100%;max-width:800px;background:#fff;border-radius:5px;box-shadow:0 2px 4px #0000001a;padding:10px;display:flex;align-items:center;margin-top:10px}.text-left .note{display:flex;align-items:center;color:#555}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{width:18rem;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px #0000001a;overflow:hidden;background:#fffefe;margin-bottom:10px}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{padding:10px;background-color:#f8f9fa;text-align:center;color:#6c757d}.list-container{list-style:none;padding:0}.list-container li{font-size:13px;margin-bottom:5px;padding:6px 12px;background:#f5f5f5;border-radius:8px}.list-container li:hover{color:#000;cursor:pointer}.session-cards-section,.attendee-cards-section,.speaker-cards-section,.sponsor-cards-section,.booth-rep-cards-section{width:100%;max-width:100%;margin-top:8px;margin-bottom:4px;display:block;visibility:visible;overflow:visible}.session-cards-section{overflow-x:hidden;min-width:0}.card-message-bubble{margin-bottom:20px;border-radius:4px 14px 14px;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word}.card-message-bubble .card-message-text{margin:0}.card-message-text{margin-bottom:0}.session-cards-container{display:grid;grid-template-columns:1fr;gap:20px;width:100%;min-width:0;max-width:100%;overflow:hidden}@media (min-width: 600px){.session-cards-container{grid-template-columns:repeat(2,1fr)}}.session-card-item{background:linear-gradient(135deg,#9f7aea,#805ad5);border:none;border-radius:18px;box-sizing:border-box;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;min-height:220px;min-width:0;max-width:100%;overflow:hidden;padding:25px;position:relative}.session-card-item-ondemand{background:linear-gradient(135deg,#9f7aea,#805ad5);min-height:auto;padding:20px 24px;min-height:220px}.session-card-item-ondemand .session-card-ondemand-badge{display:inline-block;background:#7d69bd;color:#fff;font-size:11px;font-weight:600;letter-spacing:.02em;padding:4px 10px;border-radius:999px;margin-bottom:8px;width:-moz-fit-content;width:fit-content}.session-card-item-ondemand .session-card-ondemand-available{color:#fff;font-size:14px;font-weight:400;margin-bottom:6px}.session-card-item-ondemand .session-card-ondemand-title{font-size:18px;font-weight:700;margin:0 0 8px;line-height:1.3}.session-card-item-ondemand .session-card-ondemand-desc{font-size:14px;font-weight:400;color:#fff;opacity:.95;-webkit-line-clamp:3;line-clamp:3;margin-bottom:12px}.session-card-item-ondemand .session-card-actions-row{margin-top:auto}.session-card-header{margin-bottom:12px;margin-left:80px;min-height:40px;display:flex;align-items:center}.session-card-date-badge{position:absolute;top:20px;left:20px;width:60px;height:60px;background:#000;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-weight:700;font-size:14px}.session-card-date-day{font-size:14px;font-weight:700;color:#fff;line-height:1.2;display:block}.session-card-date-month{font-size:15px;font-weight:700;color:#fff;display:block}.session-card-date-na{font-size:12px;font-weight:700;color:#fff;display:block;line-height:1.2}.session-card-room-time{min-width:0;overflow-wrap:break-word}.session-card-room{font-size:18px;font-weight:600;color:#fff;line-height:1.3}.session-card-time{font-size:13px;opacity:.9;color:#fff;line-height:1.3}.session-card-title{color:#fff;font-size:18px;font-weight:600;line-height:1.35;margin:6px 0 8px;min-width:0;overflow-wrap:break-word}.session-card-meta{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}.session-card-meta-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.35}.session-card-meta-label{font-weight:500;color:#ffffffe6;flex-shrink:0}.session-card-meta-value{font-weight:400;color:#fff;min-width:0}.session-card-description{font-size:14px;line-height:1.4;color:#fff;opacity:.95;flex:1;min-height:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.session-card-status{display:flex;align-items:center;justify-content:flex-end;gap:8px;font-size:13px;font-weight:400;color:#fffffff2;margin-bottom:12px}.session-card-status-bullet{width:6px;height:6px;min-width:6px;border-radius:50%;background:rgba(255,255,255,.9)}.session-card-actions-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto;flex-wrap:nowrap;min-width:0}.session-card-item .speakers-UIcard{display:flex;align-items:center;flex:0 0 auto;min-width:0}.session-card-item .speaker-tooltip-wrap{position:relative;display:inline-block}.session-card-item .speaker-tooltip{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:6px;padding:4px 8px;background:rgba(0,0,0,.85);color:#fff;font-size:12px;font-weight:500;white-space:nowrap;border-radius:4px;pointer-events:none;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility .15s ease;z-index:10}.session-card-item .speaker-tooltip-wrap:hover .speaker-tooltip{visibility:visible;opacity:1}.session-card-item .speaker{width:40px;height:40px;border-radius:50%;overflow:hidden;background:#e6e6e6;display:flex;align-items:center;justify-content:center;font-weight:600;font-family:Arial,sans-serif;color:#333;margin-left:-10px}.session-card-item .speaker:first-child{margin-left:0}.session-card-item .speaker img{width:100%;height:100%;object-fit:cover}.session-card-item .speaker.initials{font-size:14px}.session-card-item .speaker img[src=\"\"],.session-card-item .speaker img:not([src]){opacity:0}.session-card-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:0;justify-content:flex-end;flex:0 0 auto;min-width:0}.session-card-btn{font-size:14px;font-weight:600;padding:8px 20px;min-width:80px;border-radius:8px;cursor:pointer;border:none;transition:opacity .2s}.session-card-btn-primary{background:#000;color:#fff}.session-card-btn-primary:hover{opacity:.9}.session-card-btn-secondary{background:#000;color:#fff;border:none}.session-card-btn-secondary:hover{opacity:.9}.session-card-btn-disabled{opacity:.5;cursor:not-allowed!important;pointer-events:none}.session-card-btn-disabled.session-card-btn-primary,.session-card-btn-disabled.session-card-btn-secondary{background:#000;color:#fff}.session-card-when-disable{font-size:13px;color:#ffffffe6;margin-bottom:10px;font-style:italic}.session-card-meeting-delayed{font-size:13px;color:#fffffff2;margin-bottom:10px}.attendee-cards-container{display:flex;flex-wrap:wrap;gap:20px;width:100%}.attendee-card-item{flex:0 0 calc((100% - 60px)/4);max-width:215px!important}@media (max-width: 1200px){.attendee-card-item{flex:0 0 calc((100% - 40px) / 3)}}@media (max-width: 768px){.attendee-card-item{flex:0 0 calc((100% - 20px)/2)}}@media (max-width: 480px){.attendee-card-item{flex:0 0 100%}}.attendee-card{position:relative;height:320px;min-width:215px;border-radius:8px;overflow:hidden;color:#fff;display:flex;flex-direction:column;justify-content:flex-end;padding:20px;background-color:#5a5a5a;background-size:cover;background-position:center}@media (max-width: 480px){.attendee-card-item{max-width:100%!important}.attendee-card{height:490px}}.attendee-card-has-video{background-image:none!important}.attendee-card-video{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;z-index:1}.attendee-card-play-btn{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;border:1px solid rgba(255,255,255,.35);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:700;line-height:54px;text-align:center;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center;padding:0}.attendee-card-mute-btn{position:absolute;top:10px;right:10px;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:600;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center}.attendee-card-play-btn .material-icons,.attendee-card-mute-btn .material-icons{font-size:28px;line-height:1}.attendee-card-initials{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;background:linear-gradient(135deg,#6b7280 0%,#4b5563 100%);font-size:58px;letter-spacing:-2px;z-index:1;background:linear-gradient(135deg,#6b7280,#4b5563);color:#ffffffe6;font-weight:400;justify-content:center;padding:50px 0}.attendee-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to top,rgba(0,0,0,.85),rgba(0,0,0,.25));z-index:2;pointer-events:none}.attendee-content{position:relative;z-index:3}.attendee-name{font-size:18px;font-weight:600;margin-bottom:4px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-company{font-size:13px;opacity:.85;margin-bottom:8px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc{font-size:14px;margin-bottom:12px;opacity:.95;overflow:hidden}.attendee-desc-collapsed{display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc-expanded{display:block;overflow:visible;margin-bottom:6px}.attendee-read-more{display:inline-block;background:transparent;border:0;padding:0;margin:-6px 0 10px;color:#ffffffe6;font-weight:600;font-size:12px;text-decoration:underline;cursor:pointer}.attendee-buttons{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content}.attendee-buttons .btn{font-size:12px;padding:5px 8px;border-radius:3px;border:none;cursor:pointer;flex:1 1 0;min-width:80px;text-align:center;white-space:nowrap;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}@media (max-width: 480px){.attendee-buttons{flex-wrap:wrap;width:100%!important}.attendee-buttons .btn{flex:1 1 100%;max-width:100%;white-space:normal}}.attendee-card-btn-connect{background:#0d6efd;color:#fff}.attendee-card-btn-connect:hover:not(:disabled){opacity:.9}.attendee-card-btn-view-profile{background:#494949;color:#fff}.attendee-card-btn-view-profile:hover:not(:disabled){opacity:.9}.attendee-card-btn-request-sent{background:#0d6efd;color:#fff;opacity:.5;cursor:not-allowed!important}.attendee-card-btn-disconnect{background:#0d6efd;color:#fff}.attendee-card-btn-disconnect:hover{background:rgba(255,255,255,.3);opacity:.95}.attendee-card-btn:disabled{opacity:.6;cursor:not-allowed!important}.show-more-cards-btn{display:flex;align-items:center;justify-content:center;margin-top:12px;padding:10px 16px;background:#fff;border:1.5px dashed #ccc;border-radius:12px;color:#06f;font-weight:600;font-size:14px;cursor:pointer;width:-moz-fit-content;width:fit-content}.show-more-cards-btn:hover{background:#f8f9fa}.booth-rep-card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}@media (max-width: 1204px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)!important}.booth-rep-card-logo{height:120px!important}.booth-rep-card-logo img{max-height:80px!important;object-fit:contain}}@media (max-width: 768px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)}.booth-rep-card-logo{height:90px!important}.booth-rep-card-logo img{max-height:60px!important;object-fit:contain}}.booth-rep-card{background:linear-gradient(90deg,#9faffc 0%,#a1afff 40%,#adb9ff 100%);padding:18px;border-radius:6px;display:flex;flex-direction:column}.booth-rep-card-logo{width:100%;height:140px;background:#fff;border:1px solid #f7f7f7;display:flex;align-items:center;justify-content:center;margin-bottom:12px;border-radius:4px;box-shadow:0 0 2px #ddd}.booth-rep-card-logo img{max-height:90px;object-fit:contain}.booth-rep-card-logo-placeholder{font-size:48px;font-weight:600;color:#9faffc;text-transform:uppercase}.booth-rep-card-title{font-size:18px;font-weight:600;color:#1d2b4f;margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booth-rep-card-desc{font-size:14px!important;color:#3a3a3a!important;margin-bottom:18px!important;line-height:1.3!important;display:-webkit-box!important;-webkit-line-clamp:3!important;line-clamp:3!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.booth-rep-card-btn{align-self:flex-start;margin-top:auto;background:#494949;color:#fff;border:none;padding:10px 18px;border-radius:6px;font-size:14px;cursor:pointer;transition:.3s}.booth-rep-card-btn:hover{background:#5a5a5a}.collapsible-container{width:100%;margin-bottom:5px;overflow:hidden}.collapsible-header{display:flex;padding:15px;cursor:pointer}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{padding:15px;background-color:#f8f9fa;color:#333;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:5px auto}.card-header{border-bottom:0px;background:#eee;padding:8px 15px;display:flex!important;width:auto;border-radius:8px 8px 0 0}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.uptList{background:rgba(245,222,179,.1411764706);border-radius:0 0 10px 10px;margin-bottom:20px!important}.list-group-item{font-size:15px;color:#0f0f0f;margin:1px 0;padding:0 18px}.sources-container{display:flex;gap:15px;align-items:flex-start}.source-card{position:relative;background-color:#f0f3f5;border-radius:10px;padding:15px;display:flex;flex-direction:column;justify-content:space-between;width:100%;cursor:pointer;transition:box-shadow .3s ease;box-sizing:border-box}.popup{position:absolute;top:100%;left:50%;transform:translate(-50%) translateY(-10px);background-color:#fff;padding:10px;border-radius:5px;white-space:normal;visibility:hidden;opacity:0;transition:opacity .3s ease,transform .3s ease;z-index:10;width:100%;box-shadow:0 4px 8px #0003}.popup h5{font-size:14px;font-weight:600;margin:5px 0 10px;line-height:1.2}.popup p{font-size:12px;margin:0;line-height:1.4}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{text-decoration:none;color:#000}.popup .source-url:hover{text-decoration:underline;color:#007bff;cursor:pointer}.source-card:hover .popup{visibility:visible;opacity:1;transform:translate(-50%) translateY(-15px)}.source-card:hover{box-shadow:0 4px 8px #0000001a;transform:scale(1.05)}.source-title{font-size:14px;font-weight:500;text-align:left;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;height:55px;line-height:1.5}.source-title img{width:20px;margin-left:10px}.source-url{font-size:12px;color:#6c757d;text-align:left;display:flex;align-items:center}.source-url img{width:16px;height:16px;margin-right:5px;border-radius:50%}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{display:flex;align-items:flex-start;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{margin-right:15px;margin-top:8px;flex-shrink:0}.sourceDraweContainer .source-content{flex:1;border:1px solid #ddd;border-radius:8px;padding:12px;background-color:#f5f2f2;box-shadow:0 2px 4px #0000001a;cursor:pointer}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{font-size:1rem;font-weight:500;display:block;margin-bottom:4px;height:auto!important}.sourceDraweContainer .source-description{font-size:.875rem;display:block}.sourceDraweContainer .image-container{display:flex;align-items:center;margin:10px 0}.sourceDraweContainer .image-container img{width:16px;height:16px;margin-right:5px;border-radius:50%;border:1px solid #ddd;object-fit:cover}.sourceDraweContainer .image-container span{font-size:13px;color:#555}.closeButtonEditor{position:absolute;right:10px;top:5px;padding:3px 0 0;height:32px;width:32px;border:0;border-radius:100%}.closeButtonSource{border-color:transparent!important;color:inherit;background:none!important;box-shadow:none!important;transition:color .2s ease-in-out;float:right;margin-top:20px;cursor:pointer}.closeButtonSource.closeplaygroundbutton{display:none!important}.graph-img{width:90%;background:rgba(254,254,254,.231372549);padding:15px;border-radius:15px}.chat-textarea{width:100%;padding:10px;border:none;resize:none;overflow-y:hidden;box-sizing:border-box;font-size:15px;line-height:1.5;background-color:#fff;height:30px;transition:all 1s}.chat-textarea:hover{height:60px}.chat-textarea:focus{height:60px}.chat-textarea:focus{outline:none}.fixed-btn{position:fixed;right:-22px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 12px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn:hover{background-color:#5b5b5b}.fixed-btn-close{position:fixed;right:549px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 16px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn-close:hover{background-color:#5b5b5b}.btn.rotate{transform:rotate(-15deg)}.btn.rotate:hover{transform:rotate(0)}.btn.cta-chat{display:flex;align-items:center;justify-content:center;width:40px!important;height:40px!important;max-width:40px!important;max-height:40px!important;aspect-ratio:1/1;background:#f3f3f3;border:none;border-radius:50%;padding:0;color:#787777;flex-shrink:0}.btn.cta-chat:hover{background:#d7d7d7;color:#666}.btn.cta-chat svg{vertical-align:middle}@keyframes voice-bar-wave{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.btn.cta-chat.voice-btn{overflow:hidden;min-width:40px;width:40px!important;max-width:40px!important;padding-left:11px;padding-right:11px;gap:8px;border-radius:9999px;justify-content:flex-start;flex-shrink:0;transition:max-width .35s ease,width .35s ease,background-color .25s ease,color .25s ease,padding .3s ease,box-shadow .25s ease}.btn.cta-chat.voice-btn .voice-btn-icon{flex-shrink:0;transition:color .25s ease}.btn.cta-chat.voice-btn .vbar{transform-box:fill-box;transform-origin:center}.btn.cta-chat.voice-btn .voice-btn-text{white-space:nowrap;opacity:0;max-width:0;overflow:hidden;font-weight:500;font-size:14px;transform:translate(-4px);transition:opacity .25s ease .1s,max-width .3s ease .05s,transform .3s ease .05s}.btn.cta-chat.voice-btn:hover{width:100px!important;max-width:100px!important;padding-left:14px;padding-right:16px;background:#0d9488!important;color:#fff!important;box-shadow:0 4px 10px #0d948840}.btn.cta-chat.voice-btn:hover .vbar{animation:voice-bar-wave .9s ease-in-out infinite}.btn.cta-chat.voice-btn:hover .vbar-1{animation-delay:0s}.btn.cta-chat.voice-btn:hover .vbar-2{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-3{animation-delay:.3s}.btn.cta-chat.voice-btn:hover .vbar-4{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-5{animation-delay:0s}.btn.cta-chat.voice-btn:hover .voice-btn-text{opacity:1;max-width:4.5em;transform:translate(0)}.chat-footer-upt{padding:4px}.workflowbox{display:flex;align-items:center;cursor:pointer;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid transparent;transition:all .5s}.workflowbox:hover{border:1px solid #ddd;background:#fff}.workflowbox svg{margin:0 10px}.edit-boxDrawer{border-left:1px solid #ddd;box-shadow:1px 1px 15px #ddddddc4!important}.edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}ng-deep .edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}.SearchTitle{font-size:16px!important;text-transform:none}.exicution{margin:30px 0!important;background:#f9f9f9;padding:15px 20px}.new-conversationbutton2{position:absolute;right:88px;top:20px!important;z-index:1000;background:#f5f5f5;padding:6px;border-radius:10px;display:flex;justify-content:space-around;width:120px;align-items:center;font-size:14px;cursor:pointer;border:1px solid #e3e3e3;transition:all .5s}.new-conversationbutton2:hover{background:#eee}@media (max-width: 768px){.new-conversationbutton2{position:fixed!important;top:22px!important;padding:.5px!important;width:90px!important;align-items:center;font-size:11px!important}}.chat-close-button{position:absolute;right:20px;top:25px!important;z-index:1000;display:flex;justify-content:center;align-items:center;gap:6px;font-size:14px;cursor:pointer;transition:all .5s;color:#333}.chat-close-button .chat-close-button-icon{display:inline-flex;align-items:center;justify-content:center}.chat-close-button .chat-close-button-icon svg{display:block}.chat-close-button:hover{background:#eee}@media (max-width: 768px){.chat-close-button{position:fixed!important;top:18px!important;right:12px!important;padding:6px 8px!important;font-size:11px!important}}.NoteTxt{margin:0 auto;margin-bottom:10px!important}.NoteTxt .text{margin:0 5px}.form-container{width:100%}.progress-container{display:flex;align-items:center}.circular-loader{position:relative;width:50px;height:50px;border-radius:50%;border:4px solid rgba(0,0,0,.1);box-sizing:border-box}.loader-spinner{position:absolute;top:0;left:0;width:100%;height:100%;border:2px solid #2196f3;border-top-color:transparent;border-radius:50%;animation:rotate-loader 1s linear infinite;box-sizing:border-box}.loader-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:12px;font-weight:700;color:#333}.loader-label{margin-left:20px;font-size:16px;color:#333}.checkmark{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.checkmark-circle{stroke:#4caf50;stroke-width:4;stroke-dasharray:166;stroke-dashoffset:166;animation:stroke .6s ease-in-out forwards}.checkmark-check{stroke:#4caf50;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:48;stroke-dashoffset:48;animation:stroke-check .4s .4s ease-in-out forwards}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes stroke-check{to{stroke-dashoffset:0}}@keyframes rotate-loader{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes checkmark-animation{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.circular-loader.completed .loader-spinner{animation:none;transform:rotate(360deg)}.icon-button{background-color:transparent;border:none;cursor:pointer;font-size:24px;color:#333}.icon-button:focus{outline:none}.icon-button:hover{color:#007bff}.modal{display:block;position:fixed;z-index:1000001;padding-top:0;left:0;top:0;width:100%;height:100%;background-color:#0006}.modal-content{background-color:#fff;margin:5% auto;padding:20px;border-radius:8px;width:82%;box-shadow:0 4px 8px #0000001a;height:600px;position:relative}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.SearchTitle.botUser{font-size:30px!important;text-transform:none!important}.SearchTitle.botUser h2,.SearchTitle.botUser p{font-size:1.7rem!important}.title_chat{display:flex;margin:0;padding:0}.title_chat h2{font-size:20px;margin:10px 0;display:flex;gap:10px;align-items:center}.title_chat h2 p{display:inline!important}.title_chat h2 span:before{content:\"\"!important}@media (max-width: 768px){.title_chat h2{flex-direction:column;align-items:start;font-size:16px}}.small-title{font-size:12px;margin:2px 0}.titleSection{margin:0}.titleSection h2{font-size:20px;margin:0;color:#000}.inputs-section{background-color:#f7f7f7;padding:10px 15px 0;margin:0 0 10px;border-radius:5px}.inputs-section h3{font-size:16px}.actions-section{background-color:#f9f9f9;padding:15px;margin-bottom:20px;border-radius:5px;height:500px;overflow-y:auto}.timeline{position:relative;padding-left:40px;margin-bottom:20px}.timeline:before{content:\"\";position:absolute;left:19px;height:100%;border-right:2px dashed #cecece}.timeline-item{position:relative;margin-bottom:20px}.timeline-item:before{content:\"\";position:absolute;left:-30px;top:0;width:20px;height:20px;background-color:#007bff;border-radius:50%;z-index:1}.timeline-item h4{margin:0;font-weight:700;font-size:16px;color:#000}.timeline-item pre{background-color:#fff;padding:10px;border:1px solid #ddd;border-radius:5px;white-space:pre-wrap}.timestamp-section{justify-content:space-between;font-style:normal;color:#666}.mic-btn{background-color:#ff4d4d;border:none;border-radius:50%;padding:10px;color:#fff;font-size:1.5em;cursor:pointer}.mic-btn:active{background-color:#f66}.actions-section h3{font-size:16px}.close-wrapper{width:100%;display:flex;justify-content:right;position:absolute;right:22px;top:0}.close_pop{cursor:pointer;display:flex;justify-content:center;align-items:center;color:#aaa;font-size:30px;font-weight:400}.chat-avatar{width:44px;height:44px;min-width:44px;min-height:44px;border-radius:50%;overflow:hidden;background:#fcfcfc;border:1px solid #dfdfdf;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chat-avatar-img{width:100%;height:100%;object-fit:cover}.chat-avatar-initials{font-size:1rem;font-weight:600;color:#555;text-transform:uppercase;-webkit-user-select:none;user-select:none}.chat-avatar-initials-assistant{color:#000}.chat-avatar-initials-user{color:#761c79}.user-Box{display:flex;align-items:center}.bards{position:absolute;right:0;top:20px}::ng-deep .code-container{position:relative;margin:20px 0}::ng-deep .copy-button{position:absolute;top:10px;right:10px;background-color:#007bff;color:#fff;border:none;padding:5px 10px;cursor:pointer;border-radius:4px}::ng-deep .copy-button:hover{background-color:#0056b3}::ng-deep .code_block.diff{background-color:#f8f8f8;border-left:4px solid #ccc;padding:10px;overflow:auto}::ng-deep .heading003{font-size:20px;font-weight:700;color:#000}::ng-deep .listing{list-style:decimal;margin:0 25px;padding:0}.line{display:inline-block;width:15px;height:15px;border-radius:15px;background-color:#e8e8e8}.load-2 .line:nth-last-child(1){animation:loadingB 1.5s 1s infinite;margin:5px 0}.load-2 .line:nth-last-child(2){animation:loadingB 1.5s .5s infinite;margin:5px 0}.load-2 .line:nth-last-child(3){animation:loadingB 1.5s 0s infinite;margin:5px 0}.load-1 .line:nth-last-child(1){animation:loadingA 1.5s 1.2s infinite;margin:5px 0}.load-1 .line:nth-last-child(2){animation:loadingA 1.5s .8s infinite;margin:5px 0}.load-1 .line:nth-last-child(3){animation:loadingA 1.5s .2s infinite;margin:5px 0}@keyframes loadingB{0%{width:65px}50%{width:235px}to{width:65px}}@keyframes loadingA{0%{width:45px}50%{width:205px}to{width:45px}}.chat-thinking{padding-left:20px!important}.chat-thinking .thinking-row{display:flex;align-items:center;gap:8px;margin-top:6px}.chat-thinking .thinking-dots{display:flex;align-items:center;gap:4px}.chat-thinking .thinking-dot{width:6px;height:6px;border-radius:50%;background:#06f;animation:thinking-bounce 1.4s ease-in-out infinite both}.chat-thinking .thinking-dot:nth-child(1){background:#9ca3af;animation-delay:0s}.chat-thinking .thinking-dot:nth-child(2){background:#06f;animation-delay:.2s}.chat-thinking .thinking-dot:nth-child(3){background:#17235b;animation-delay:.4s}.chat-thinking .thinking-text{font-size:14px;font-weight:400;color:#6b7280}@keyframes thinking-bounce{0%,80%,to{transform:scale(.8);opacity:.6}40%{transform:scale(1.1);opacity:1}}.loaderbox{position:relative;margin:10px 0;height:60px}.loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}.loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}.loader--dot:first-child{background-color:#618e93;animation-delay:.5s}.loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}.loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}.loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}.loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}.loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}.loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}.loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}@keyframes loader{15%{transform:translate(230px)}45%{transform:translate(0)}65%{transform:translate(230px)}95%{transform:translate(0)}}@keyframes loading-text{0%{content:\"Loading\"}25%{content:\"Loading.\"}50%{content:\"Loading..\"}75%{content:\"Loading...\"}}::ng-deep .loaderbox{position:relative;margin:10px 0;height:60px}::ng-deep .loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}::ng-deep .loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}::ng-deep .loader--dot:first-child{background-color:#618e93;animation-delay:.5s}::ng-deep .loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}::ng-deep .loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}::ng-deep .loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}::ng-deep .loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}::ng-deep .loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}::ng-deep .loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}::ng-deep .loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}.agents-popwindowbox{width:100%;padding:10px;background:#fff}.agents-popwindowbox h3{font-size:15px;color:#000}.dropdown-menu-agents{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;padding:0;position:absolute;top:auto;width:270px;z-index:1000}.dropdown-menu-agents .scrollerbox{display:flex;flex-direction:column;flex:fit-content;overflow-y:auto;height:215px}.dropdown-menu-agents label{cursor:pointer;display:flex;font-size:13px;justify-content:start;align-items:center;line-height:16px;background:#f9f9f9;padding:7px;margin:2px 0;border-radius:2px}.dropdown-menu-agents label:hover{background:#ebebeb}.dropdown-menu-agents label input{position:absolute;opacity:0}.dropdown-menu-agents .input-check{position:relative;display:inline-block;top:0;width:25px;height:23px;border:2px solid #ccc;border-radius:4px;margin-right:5px;transition:.5s}.dropdown-menu-agents label input:checked~.input-check{background:#06f;border-color:#06f;animation:animate .7s ease}@keyframes animate{0%{transform:scale(1)}40%{transform:scale(1.3,.7)}55%{transform:scale(1)}70%{transform:scale(1.2,.8)}80%{transform:scale(1)}90%{transform:scale(1.1,.9)}to{transform:scale(1)}}.dropdown-menu-agents .input-check:before{content:\"\";position:absolute;top:6px;left:4px;width:15px;height:6px;border-bottom:3px solid #fff;border-left:3px solid #fff;transform:scale(0) rotate(-45deg);transition:.5s}.dropdown-menu-agents label input:checked~.input-check:before{transform:scale(1) rotate(-45deg)}::ng-deep .h1,::ng-deep h1{font-size:1.165rem}::ng-deep .h2,::ng-deep h2{font-size:1.125rem}::ng-deep .h3,::ng-deep h3{font-size:1.125rem}::ng-deep b,::ng-deep strong{font-weight:600}@media (max-width: 768px){.note{width:90%;margin:0 auto;line-height:15px;padding:3px 0 10px}}.show-hover{display:none}.chat.bot:hover .show-hover{display:flex!important}\n"] }]
3697
+ args: [{ selector: 'hivegpt-chat-drawer-package', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- <button\n *ngIf=\"isShowEditorButton && !checkForCop29BotId()\"\n (click)=\"openOuterEditor()\"\n class=\"fixed-btn\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n create\n </span>\n Editor\n</button> -->\n\n<button\n *ngIf=\"!isShowEditorButton\"\n (click)=\"onCloseEditor()\"\n class=\"fixed-btn-close\"\n>\n <span style=\"font-size: 12px\" class=\"material-icons notranslate\">\n close\n </span>\n {{ getTranslation(\"Close\") }}\n</button>\n\n<mat-drawer-container\n class=\"hivegpt-chat-bot-wrapper\"\n [ngClass]=\"{ 'mat-drawer-container-has-open': isDrawerOpen }\"\n [class.ios-device]=\"isIOSDevice\"\n [hasBackdrop]=\"hasBackdropValue\"\n>\n <mat-drawer\n class=\"drawer\"\n #drawer\n [position]=\"'start'\"\n [mode]=\"'over'\"\n opened=\"true\"\n [class.full-width-drawer]=\"fullView\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"chat-main\">\n <!-- <div class=\"chat-header\">\n <h2> -->\n <!-- {{eventName}} -->\n <!-- </h2> -->\n <!-- <button class=\"closeIcon\" (click)=\"onClose()\">\n <span class=\"material-symbols-outlined\">\n close\n </span>\n </button> -->\n <!-- </div> -->\n\n <div class=\"innerChat\" #chatMain>\n <div (click)=\"startNewConversation()\" class=\"new-conversationbutton2\">\n {{ getTranslation(\"New Chat\") }}\n <span\n ><svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14.061\"\n height=\"14.261\"\n viewBox=\"0 0 14.061 14.261\"\n >\n <path\n id=\"Path_164\"\n data-name=\"Path 164\"\n d=\"M10.146,5.075H4.531A1.544,1.544,0,0,0,3,6.631v7.262A1.544,1.544,0,0,0,4.531,15.45h7.146a1.544,1.544,0,0,0,1.531-1.556V8.187m-7.146,4.15L15.25,3m0,0H11.677M15.25,3V6.631\"\n transform=\"translate(-2.25 -1.939)\"\n fill=\"none\"\n stroke=\"#06f\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1.5\"\n />\n </svg>\n </span>\n </div>\n <div\n (click)=\"closeBot.emit()\"\n class=\"chat-close-button\"\n role=\"button\"\n [attr.aria-label]=\"getTranslation('Close') || 'Close'\"\n [attr.title]=\"getTranslation('Close') || 'Close'\"\n >\n \n <span class=\"chat-close-button-icon\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </span>\n </div>\n <div class=\"bot-sticky-header-chat\">\n <div class=\"title_chat\">\n <h2>\n <p>\n {{ getTranslation(botName) }}\n <!-- <svg\n *ngIf=\"!checkForCop29BotId()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"31.499\"\n height=\"31.501\"\n viewBox=\"0 0 31.499 31.501\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M33.685,7.83a1.125,1.125,0,0,0-.925-1.036,49.227,49.227,0,0,1-14.3-4.444,1.125,1.125,0,0,0-.927,0A49.226,49.226,0,0,1,3.24,6.794,1.125,1.125,0,0,0,2.315,7.83a27.621,27.621,0,0,0,1.718,11.9A24.572,24.572,0,0,0,9.07,27.641a25.712,25.712,0,0,0,8.513,6.028,1.125,1.125,0,0,0,.844,0,25.712,25.712,0,0,0,8.513-6.028,24.572,24.572,0,0,0,5.027-7.911,27.621,27.621,0,0,0,1.718-11.9Zm-9.211,5.281-7.791,9a1.125,1.125,0,0,1-.8.389h-.046a1.125,1.125,0,0,1-.788-.322L11.587,18.79a1.125,1.125,0,1,1,1.575-1.607l2.6,2.552,7.01-8.1a1.125,1.125,0,0,1,1.7,1.472Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg> -->\n </p>\n <span *ngIf=\"!checkForCop29BotId()\">\n <p class=\"small-title\">\n {{ getTranslation(\"AI-powered\")\n }}<span>{{ getTranslation(\"copilot\") }}</span>\n </p>\n </span>\n </h2>\n </div>\n <div class=\"chatType\" style=\"display: none\">\n <h4 class=\"labelChat\">Choose a conversation style</h4>\n <ul>\n <li (click)=\"changeTemperature(0)\">\n <button [ngClass]=\"{ active: temperature === 0 }\">\n <span class=\"top-section-title\"> More Creative </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(1)\" class=\"fdssfd\">\n <button [ngClass]=\"{ active: temperature === 1 }\">\n <span class=\"top-section-title\"> More Balanced </span>\n </button>\n </li>\n <li (click)=\"changeTemperature(2)\">\n <button [ngClass]=\"{ active: temperature === 2 }\">\n <span class=\"top-section-title\"> More Precise </span>\n </button>\n </li>\n </ul>\n </div>\n </div>\n <!-- chattype -->\n <div\n id=\"botAllChat\"\n class=\"chat\"\n [ngClass]=\"{\n botUser: chat?.type === 'user',\n botAi: chat?.type !== 'user'\n }\"\n [attr.data-msg-id]=\"chat?._id || null\"\n *ngFor=\"let chat of chatLog; let i = index\"\n >\n <div class=\"chat-box\" *ngIf=\"!(i === 0 && botSkills)\">\n <div class=\"message\">\n <div\n class=\"time-cta\"\n [ngClass]=\"{\n 'time-cta din': showFeedBackIconsIndex === i,\n 'time-cta': showFeedBackIconsIndex != i\n }\"\n >\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"chat?.type === 'ai' && !(i === 0 && botSkills)\"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span style=\"color: #000 !important;\">{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div\n class=\"Icon_TimeSTamp\"\n *ngIf=\"\n chat?.type === 'session_cards' ||\n chat?.type === 'attendee_cards'\n \"\n >\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n\n <div class=\"Icon_TimeSTamp\" *ngIf=\"chat?.type === 'user'\">\n <div class=\"user-Box\">\n <div class=\"dateTime\">\n <span>{{ getTranslation(\"You\") }}</span>\n {{ chat?.time }}\n </div>\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"userAvatarUrl\"\n [src]=\"userAvatarUrl\"\n alt=\"You\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!userAvatarUrl\"\n class=\"chat-avatar-initials chat-avatar-initials-user\"\n >{{ getUserIdInitials() }}</span\n >\n </div>\n </div>\n <div class=\"bards\">\n <div\n class=\"bars\"\n *ngIf=\"\n chat?.WorkflowExecutionId ||\n chat?.showWorkflowExecutionLoader\n \"\n >\n <button\n class=\"icon-button\"\n (click)=\"\n showWorkflowHistoryDetails(chat.WorkflowExecutionId)\n \"\n >\n <i class=\"fas fa-bars\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"researchingCard\"\n *ngIf=\"\n (chat?.searchTerms && chat?.searchTerms.length > 0) ||\n (chat?.sourcesList && chat?.sourcesList?.length > 0)\n \"\n >\n <div\n class=\"card-header d-flex align-items-center\"\n (click)=\"toggleCollapse()\"\n >\n <span class=\"icon\"\n ><i class=\"bx bx-plus-circle bx-sm\"></i\n ></span>\n <span class=\"ml-2\"\n >Researching\n <i\n id=\"toggleIcon\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fa-chevron-down': isCollapsed,\n 'fa-chevron-up': !isCollapsed\n }\"\n ></i\n ></span>\n </div>\n <div\n *ngIf=\"chat?.searchTerms && chat?.searchTerms.length > 0\"\n [ngClass]=\"{ collapse: isCollapsed }\"\n >\n <ul class=\"list-group list-group-flush uptList\">\n <li\n *ngFor=\"let term of chat?.searchTerms\"\n class=\"list-group-item\"\n >\n Searching for\n <strong>{{ term }}</strong>\n </li>\n </ul>\n\n <h5\n class=\"mt-2\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <i class=\"bx bx-unite\"></i> Sources\n </h5>\n <div\n class=\"sources-container\"\n *ngIf=\"chat?.sourcesList && chat?.sourcesList.length > 0\"\n >\n <div\n class=\"source-card\"\n *ngFor=\"\n let source of chat?.displayedSources;\n let i = index\n \"\n >\n <div>\n <div class=\"source-title\">{{ source.title }}</div>\n <div class=\"source-url\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <div class=\"popup\">\n <div\n class=\"source-url\"\n (click)=\"openLinkInNewTab(source.link)\"\n >\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n {{ getDomainName(source.link) }}\n </div>\n <h5 (click)=\"openLinkInNewTab(source.link)\">\n {{ source.title }}\n </h5>\n <p (click)=\"openLinkInNewTab(source.link)\">\n {{ source.desc }}\n </p>\n </div>\n </div>\n </div>\n <ng-container\n *ngIf=\"\n chat?.remainingSources &&\n chat?.remainingSources.length > 0\n \"\n >\n <div\n class=\"source-card\"\n (click)=\"onCardClick(chat?.sourcesList)\"\n >\n <div>\n <div class=\"source-title\">\n <img\n *ngFor=\"\n let source of chat?.remainingSources;\n let i = index\n \"\n class=\"relative block\"\n [src]=\"getFaviconUrl(source.link)\"\n [alt]=\"getDomainName(source.link) + ' favicon'\"\n />\n </div>\n <div class=\"source-url\">\n View {{ chat?.remainingSources.length }} more\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n\n <!-- Session cards (from get_event_sessions tool, same as React Native) -->\n <div\n class=\"session-cards-section\"\n *ngIf=\"\n chat?.type === 'session_cards' &&\n chat?.sessionCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"session-cards-container\">\n <div\n *ngFor=\"\n let session of getVisibleSessionCards(chat);\n let idx = index\n \"\n class=\"session-card-item\"\n [class.session-card-item-ondemand]=\"isSessionOndemand(session)\"\n >\n <!-- OnDemand design: pill, Available Anytime, title, description -->\n <ng-container *ngIf=\"isSessionOndemand(session)\">\n <span class=\"session-card-ondemand-badge\">{{ getTranslation('ON DEMAND') || 'ON DEMAND' }}</span>\n <div class=\"session-card-ondemand-available\">{{ getTranslation('Available Anytime') || 'Available Anytime' }}</div>\n <div class=\"session-card-title session-card-ondemand-title\">{{ session.title }}</div>\n <div\n class=\"session-card-description session-card-ondemand-desc\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-actions-row\"\n *ngIf=\"session.session && getSessionRoleButtons(session).length > 0\"\n >\n <div class=\"speakers-UIcard\"></div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"role.action === 'join'\"\n [class.session-card-btn-secondary]=\"role.action === 'watch'\"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n <!-- Default (Live/Breakout) design: date badge, room/time, title, meta, description, actions -->\n <ng-container *ngIf=\"!isSessionOndemand(session)\">\n <div class=\"session-card-header\">\n <div class=\"session-card-date-badge\">\n <ng-container *ngIf=\"session.dateDay || session.dateMonth\">\n <span class=\"session-card-date-day\">{{\n session.dateDay\n }}</span>\n <span class=\"session-card-date-month\">{{\n session.dateMonth\n }}</span>\n </ng-container>\n <span\n *ngIf=\"!session.dateDay && !session.dateMonth\"\n class=\"session-card-date-na\"\n >{{ getTranslation('N/A') || 'N/A' }}</span>\n </div>\n <div class=\"session-card-room-time\">\n <div\n class=\"session-card-room\"\n *ngIf=\"session.room\"\n >\n {{ session.room }}\n </div>\n <div\n class=\"session-card-time\"\n *ngIf=\"session.timeRangeWithTz || session.timeRange\"\n >\n {{ session.timeRangeWithTz || session.timeRange }}\n </div>\n </div>\n </div>\n <div class=\"session-card-title\">{{ session.title }}</div>\n <div\n class=\"session-card-meta\"\n *ngIf=\"(session.organizer && session.organizer.length) || (session.meetingType && session.meetingType.length)\"\n >\n <div class=\"session-card-meta-row\" *ngIf=\"session.organizer && session.organizer.length\">\n <span class=\"session-card-meta-label\">{{\n (getTranslation(\"Organizer\") || \"Organizer\") + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.organizer }}</span>\n </div>\n <!-- <div class=\"session-card-meta-row\" *ngIf=\"session.timeZoneDisplay\">\n <span class=\"session-card-meta-label\">{{\n getTranslation(\"Time zone\") || \"Time zone\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.timeZoneDisplay }}</span>\n </div> -->\n <div class=\"session-card-meta-row\" *ngIf=\"session.meetingType && session.meetingType.length\">\n <span class=\"session-card-meta-label\">{{\n getSessionTypeLabel() + \":\"\n }}</span>\n <span class=\"session-card-meta-value\">{{ session.meetingType }}</span>\n </div>\n </div>\n <div\n class=\"session-card-description\"\n *ngIf=\"session.description\"\n >\n {{ session.description }}\n </div>\n <div\n class=\"session-card-status\"\n *ngIf=\"\n (session.statusText && session.statusText.length) &&\n getSessionRoleButtons(session).length > 0\n \"\n >\n <span class=\"session-card-status-bullet\"></span>\n {{ session.statusText }}\n </div>\n <!-- <div\n class=\"session-card-when-disable\"\n *ngIf=\"\n session.session?.sessionRoles?.length > 0 &&\n !isSessionOndemand(session) &&\n !session.session?.isExpire &&\n !canPerformSessionAction(session)\n \"\n >\n {{ getTranslation(\"You can join/watch at the starting time\") || \"You can join/watch at the starting time\" }}\n </div> -->\n \n <div\n class=\"session-card-actions-row\"\n *ngIf=\"\n session.session &&\n (getSessionRoleButtons(session).length > 0 || hasSessionCardSpeakers(session))\n \"\n >\n <div class=\"speakers-UIcard\">\n <ng-container\n *ngIf=\"\n (session?.speakersList || session?.session?.speakersList || []).length\n as _speakerCount\n \"\n >\n <ng-container\n *ngFor=\"\n let sp of (session?.speakersList || session?.session?.speakersList || []);\n let i = index\n \"\n >\n <ng-container *ngIf=\"i < 3\">\n <div class=\"speaker\" *ngIf=\"getSpeakerPhotoUrl(sp); else speakerInitials\">\n <img\n [src]=\"getSpeakerPhotoUrl(sp)!\"\n [alt]=\"getSpeakerDisplayName(sp) || 'Speaker'\"\n />\n </div>\n <ng-template #speakerInitials>\n <div class=\"speaker initials\">\n {{ getSpeakerInitials(sp) }}\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n <div class=\"speaker initials\" *ngIf=\"_speakerCount > 3\">\n +{{ _speakerCount - 3 }}\n </div>\n </ng-container>\n </div>\n <div class=\"session-card-actions\">\n <button\n *ngFor=\"let role of getSessionRoleButtons(session)\"\n type=\"button\"\n class=\"btn session-card-btn\"\n [class.session-card-btn-primary]=\"\n role.action === 'join'\n \"\n [class.session-card-btn-secondary]=\"\n role.action === 'watch'\n \"\n [class.session-card-btn-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [attr.aria-disabled]=\"isUnEvent && !canPerformSessionAction(session)\"\n [disabled]=\"!canPerformSessionAction(session)\"\n (click)=\"onSessionCardAction(session, role)\"\n >\n {{ role.label }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL >\n 4 &&\n !expandedSessionCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSessionCards(chat)\"\n >\n Show\n {{\n (chat?.sessionCards?.length || 0) - SESSION_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sessionCards?.length || 0) -\n SESSION_CARDS_INITIAL ===\n 1\n ? getTranslation(\"session\") || \"session\"\n : getTranslation(\"sessions\") || \"sessions\"\n }}\n </button>\n </div>\n\n <!-- Attendee cards (from get_event_attendees tool, same as React Native) -->\n <div\n class=\"attendee-cards-section\"\n *ngIf=\"\n chat?.type === 'attendee_cards' &&\n chat?.attendeeCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let attendee of getVisibleAttendeeCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(attendee)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(attendee) && attendee.photo\n ? 'url(' + attendee.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(attendee)\">\n <video\n #attendeeVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(attendee) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, attendee)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, attendee, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, attendee, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(attendee)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, attendee)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, attendee)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, attendee, attendeeVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, attendee)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, attendee)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(attendee) && !attendee.photo\"\n >\n {{ getAttendeeInitials(attendee.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ attendee.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"attendee.company\"\n >\n {{ attendee.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, attendee)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, attendee)\"\n *ngIf=\"getAttendeeDescription(attendee)\"\n >\n {{ getAttendeeDescription(attendee) }}\n </div>\n \n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(attendee.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n attendee.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(attendee)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!attendee.id\"\n [attr.title]=\"\n !attendee.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n attendee.id &&\n connectWithUser.emit({\n userId: attendee.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation(\"View Profile\") || \"View Profile\" }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL >\n 4 &&\n !expandedAttendeeCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandAttendeeCards(chat)\"\n >\n Show\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL\n }}\n more\n {{\n (chat?.attendeeCards?.length || 0) -\n ATTENDEE_CARDS_INITIAL ===\n 1\n ? getTranslation(\"attendee\") || \"attendee\"\n : getTranslation(\"attendees\") || \"attendees\"\n }}\n </button>\n </div>\n\n <!-- Speaker cards (from get_event_speakers tool, same layout/behavior as attendee cards) -->\n <div\n class=\"speaker-cards-section\"\n *ngIf=\"\n chat?.type === 'speaker_cards' &&\n chat?.speakerCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let speaker of getVisibleSpeakerCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [class.attendee-card-has-video]=\"!!getAttendeeVideoUrl(speaker)\"\n [style.background-image]=\"\n !getAttendeeVideoUrl(speaker) && speaker.photo\n ? 'url(' + speaker.photo + ')'\n : null\n \"\n >\n <ng-container *ngIf=\"getAttendeeVideoUrl(speaker)\">\n <video\n #speakerVideo\n class=\"attendee-card-video\"\n [attr.poster]=\"getAttendeeVideoPoster(speaker) || null\"\n [muted]=\"isAttendeeVideoMuted(chat, speaker)\"\n playsinline\n preload=\"metadata\"\n (play)=\"onAttendeeVideoPlayState(chat, speaker, true)\"\n (pause)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (ended)=\"onAttendeeVideoPlayState(chat, speaker, false)\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n >\n <source\n [attr.src]=\"getAttendeeVideoUrl(speaker)\"\n type=\"video/webm\"\n />\n </video>\n\n <button\n type=\"button\"\n class=\"attendee-card-mute-btn\"\n (click)=\"toggleAttendeeVideoMute(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoMuted(chat, speaker)\n ? (getTranslation('Unmute') || 'Unmute')\n : (getTranslation('Mute') || 'Mute')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoMuted(chat, speaker)\n ? \"volume_off\"\n : \"volume_up\"\n }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"attendee-card-play-btn\"\n (click)=\"toggleAttendeeVideoPlay(chat, speaker, speakerVideo, $event)\"\n [attr.title]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n [attr.aria-label]=\"\n isAttendeeVideoPlaying(chat, speaker)\n ? (getTranslation('Pause') || 'Pause')\n : (getTranslation('Play') || 'Play')\n \"\n >\n <span class=\"material-icons notranslate\">\n {{\n isAttendeeVideoPlaying(chat, speaker)\n ? \"pause\"\n : \"play_arrow\"\n }}\n </span>\n </button>\n </ng-container>\n\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!getAttendeeVideoUrl(speaker) && !speaker.photo\"\n >\n {{ getAttendeeInitials(speaker.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ speaker.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.jobTitle\"\n >\n {{ speaker.jobTitle }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"speaker.company\"\n >\n {{ speaker.company }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, speaker)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, speaker)\"\n *ngIf=\"getAttendeeDescription(speaker)\"\n >\n {{ getAttendeeDescription(speaker) }}\n </div>\n \n\n <div class=\"attendee-buttons\">\n \n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [disabled]=\"!speaker.id\"\n [attr.title]=\"\n !speaker.id\n ? getTranslation('Profile not available') ||\n 'Profile not available'\n : (getTranslation('View Profile') || 'View Profile')\n \"\n (click)=\"\n chat?.type === 'speaker_cards'\n ? viewSpeakerProfile.emit({\n speaker,\n speakers: chat.speakerCards || []\n })\n : speaker.id &&\n connectWithUser.emit({\n userId: speaker.id,\n viewProfile: true\n })\n \"\n >\n {{\n getTranslation('View Profile') || 'View Profile'\n }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL >\n 4 &&\n !expandedSpeakerCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSpeakerCards(chat)\"\n >\n Show\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL\n }}\n more\n {{\n (chat?.speakerCards?.length || 0) -\n SPEAKER_CARDS_INITIAL ===\n 1\n ? getTranslation('speaker') || 'speaker'\n : getTranslation('speakers') || 'speakers'\n }}\n </button>\n </div>\n\n <!-- Sponsor cards (from get_event_sponsors tool, booth-rep style) -->\n <div\n class=\"sponsor-cards-section\"\n *ngIf=\"\n chat?.type === 'sponsor_cards' &&\n chat?.sponsorCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"booth-rep-card-grid\">\n <div\n *ngFor=\"\n let sponsor of getVisibleSponsorCards(chat);\n let idx = index\n \"\n class=\"booth-rep-card\"\n >\n <div class=\"booth-rep-card-logo\">\n <span\n class=\"booth-rep-card-logo-placeholder\"\n *ngIf=\"!sponsor.logoUrl\"\n >\n {{ sponsor.boothTitle ? sponsor.boothTitle.charAt(0) : (sponsor.name ? sponsor.name.charAt(0) : '') }}\n </span>\n <img\n *ngIf=\"sponsor.logoUrl\"\n [src]=\"sponsor.logoUrl\"\n [alt]=\"sponsor.boothTitle || sponsor.name\"\n />\n </div>\n <h3 class=\"booth-rep-card-title\">\n {{ sponsor.boothTitle || sponsor.name }}\n </h3>\n <p\n class=\"booth-rep-card-desc\"\n *ngIf=\"sponsor.description\"\n >\n {{ sponsor.description }}\n </p>\n <button\n type=\"button\"\n class=\"booth-rep-card-btn\"\n (click)=\"viewBooth.emit({ boothId: sponsor.boothID, boothUrl: sponsor.url, sponsor })\"\n >\n {{ getTranslation('View Sponsor') || 'View Sponsor' }}\n </button>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL >\n 4 &&\n !expandedSponsorCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandSponsorCards(chat)\"\n >\n Show\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL\n }}\n more\n {{\n (chat?.sponsorCards?.length || 0) -\n SPONSOR_CARDS_INITIAL ===\n 1\n ? getTranslation('sponsor') || 'sponsor'\n : getTranslation('sponsors') || 'sponsors'\n }}\n </button>\n </div>\n\n <!-- Booth representative cards (from get_booth_representatives tool, same design as attendee cards) -->\n <div\n class=\"attendee-cards-section booth-rep-cards-section\"\n *ngIf=\"\n chat?.type === 'booth_rep_cards' &&\n chat?.boothRepCards?.length > 0\n \"\n >\n <div\n *ngIf=\"chat?.message\"\n class=\"card-message-bubble\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <p\n class=\"SearchTitle ai card-message-text\"\n [innerHTML]=\"chat?.message\"\n ></p>\n </div>\n <div class=\"attendee-cards-container\">\n <div\n *ngFor=\"\n let rep of getVisibleBoothRepCards(chat);\n let idx = index\n \"\n class=\"attendee-card-item\"\n >\n <div\n class=\"attendee-card\"\n [style.background-image]=\"rep.photo ? 'url(' + rep.photo + ')' : null\"\n >\n <div\n class=\"attendee-card-initials\"\n *ngIf=\"!rep.photo\"\n >\n {{ getAttendeeInitials(rep.name) }}\n </div>\n <div class=\"attendee-overlay\"></div>\n <div class=\"attendee-content\">\n <div class=\"attendee-name\">{{ rep.name }}</div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.company\"\n >\n {{ rep.company }}\n </div>\n <div\n class=\"attendee-company\"\n *ngIf=\"rep.jobTitle\"\n >\n {{ rep.jobTitle }}\n </div>\n <div\n class=\"attendee-desc\"\n [class.attendee-desc-collapsed]=\"!isAttendeeDescriptionExpanded(chat, rep)\"\n [class.attendee-desc-expanded]=\"isAttendeeDescriptionExpanded(chat, rep)\"\n *ngIf=\"getBoothRepDescription(rep)\"\n >\n {{ getBoothRepDescription(rep) }}\n </div>\n <div class=\"attendee-buttons\">\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n checkPendingSentRequest(rep.id)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-request-sent\"\n disabled\n [attr.title]=\"\n getTranslation('Request Sent') || 'Request Sent'\n \"\n >\n {{\n getTranslation(\"Request Sent\") || \"Request Sent\"\n }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canFollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-connect\"\n [attr.title]=\"\n getTranslation('Connect') || 'Connect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n connect: true\n })\n \"\n >\n {{ getTranslation(\"Connect\") || \"Connect\" }}\n </button>\n </ng-container>\n <ng-container\n *ngIf=\"\n rep.id !== userId &&\n isConnectionsEnabled &&\n canUnfollowUser(rep)\n \"\n >\n <button\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-disconnect\"\n [attr.title]=\"\n getTranslation('Disconnect') || 'Disconnect'\n \"\n (click)=\"\n rep.id &&\n connectWithUser.emit({\n userId: rep.id,\n disconnect: true\n })\n \"\n >\n {{\n getTranslation(\"Disconnect\") || \"Disconnect\"\n }}\n </button>\n </ng-container>\n <button\n *ngIf=\"rep.id\"\n type=\"button\"\n class=\"btn attendee-card-btn attendee-card-btn-view-profile\"\n [attr.title]=\"getTranslation('View Profile') || 'View Profile'\"\n (click)=\"\n connectWithUser.emit({\n userId: rep.id,\n viewProfile: true\n })\n \"\n >\n {{ getTranslation('View Profile') || 'View Profile' }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button\n *ngIf=\"\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL >\n 4 &&\n !expandedBoothRepCardIds[chat?._id]\n \"\n type=\"button\"\n class=\"show-more-cards-btn\"\n (click)=\"expandBoothRepCards(chat)\"\n >\n Show\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL\n }}\n more\n {{\n (chat?.boothRepCards?.length || 0) -\n BOOTH_REP_CARDS_INITIAL ===\n 1\n ? getTranslation('representative') || 'representative'\n : getTranslation('representatives') || 'representatives'\n }}\n </button>\n </div>\n\n <div\n class=\"chat-bubble-wrap\"\n *ngIf=\"\n (chat?.type === 'ai' || chat?.type === 'user') &&\n !(i === 0 && botSkills)\n \"\n [ngStyle]=\"{\n background:\n chat?.type === 'ai'\n ? bgBubbleAi || '#fff'\n : chat?.type === 'user'\n ? bgBubbleUser || '#183988'\n : 'transparent',\n color:\n chat?.type === 'ai'\n ? '#000 !important'\n : '#fff !important'\n }\"\n >\n <div id=\"messageText_{{ i }}\" class=\"chat-bubble-content\">\n <div\n *ngIf=\"chat?.type === 'ai' || chat?.type === 'user'\"\n [ngClass]=\"{\n 'SearchTitle ai': chat?.type === 'ai',\n 'SearchTitle user': chat?.type === 'user'\n }\"\n [ngStyle]=\"{\n background: 'transparent',\n color:\n chat?.type === 'ai' && messageTextColorAi\n ? messageTextColorAi\n : chat?.type === 'user'\n ? messageTextColorUser || '#fff'\n : 'defaultColor'\n }\"\n [innerHTML]=\"chat?.message\"\n ></div>\n </div>\n </div>\n\n <div\n class=\"progress-container\"\n *ngIf=\"chat?.showWorkflowExecutionLoader\"\n >\n <div class=\"circular-loader\">\n <div\n class=\"loader-spinner\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n [ngStyle]=\"{\n transform: 'rotate(' + percentage * 3.6 + 'deg)'\n }\"\n ></div>\n <div\n class=\"checkmark\"\n *ngIf=\"currentWorkflowActionProgress == 100\"\n >\n <svg viewBox=\"0 0 52 52\">\n <circle\n class=\"checkmark-circle\"\n cx=\"26\"\n cy=\"26\"\n r=\"25\"\n fill=\"none\"\n />\n <path\n class=\"checkmark-check\"\n fill=\"none\"\n d=\"M14 27l7 7 16-16\"\n />\n </svg>\n </div>\n\n <div\n class=\"loader-text\"\n *ngIf=\"currentWorkflowActionProgress < 100\"\n >\n {{ currentWorkflowActionProgress }}%\n </div>\n </div>\n <div class=\"loader-label\">{{ currentWorkflowAction }}...</div>\n </div>\n\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.graphs &&\n chat?.graphs.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Graphs\n <i\n (click)=\"toggleCollapseFGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForFGraph,\n 'fas fa-chevron-up': !isCollapsedForFGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.graphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForFGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n <ng-container *ngIf=\"!checkForCop29BotId()\">\n <div\n class=\"exicution mt-2\"\n *ngIf=\"\n chat?.type === 'ai' &&\n chat?.executionGraphs &&\n chat?.executionGraphs?.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-network-chart\"></i> Execution Path Diagram\n For Data Visualization Workflow\n <i\n (click)=\"toggleCollapseGraph()\"\n class=\"toggle-icon ml-2 fa\"\n [ngClass]=\"{\n 'fas fa-chevron-down': isCollapsedForGraph,\n 'fas fa-chevron-up': !isCollapsedForGraph\n }\"\n ></i>\n </h5>\n <img\n *ngFor=\"let image of chat?.executionGraphs\"\n class=\"graph-img\"\n [ngClass]=\"{ collapse: isCollapsedForGraph }\"\n [src]=\"image\"\n alt=\"\"\n />\n </div>\n </ng-container>\n <div class=\"cta\" *ngIf=\"chat?.type === 'ai' && i > 0 && i === lastAiMessageIndex\">\n <div\n class=\"copyBox\"\n title=\"Copy\"\n [ngClass]=\"\n showFeedBackIconsIndex == i ? 'show-always' : 'show-hover'\n \"\n >\n <button\n title=\"{{ chat?.copied ? 'Copied!' : 'Copy' }}\"\n class=\"copy\"\n [class.active]=\"chat?.copied\"\n (click)=\"handleCopyClick(i)\"\n >\n <i *ngIf=\"chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.copied\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M19.24 2H8.84C8.14 2 7.58 2.56 7.58 3.26V16.84C7.58 17.54 8.14 18.1 8.84 18.1H19.24C19.94 18.1 20.5 17.54 20.5 16.84V3.26C20.5 2.56 19.94 2 19.24 2ZM19.24 16.84H8.84V3.26H19.24V16.84ZM4.74 6.52C4.04 6.52 3.48 7.08 3.48 7.78V20.36C3.48 21.06 4.04 21.62 4.74 21.62H15.14C15.84 21.62 16.4 21.06 16.4 20.36V18.88H14.96V20.36H4.74V7.78H6.18V6.52H4.74Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button>\n<!-- \n <button\n *ngIf=\"!checkForCop29BotId()\"\n class=\"up copy\"\n title=\"{{ chat?.isEditor ? 'Added!' : 'Add to editor' }}\"\n (click)=\"handleEditorClick(i)\"\n >\n <svg\n *ngIf=\"!chat?.isEditor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20.152\"\n height=\"20.152\"\n viewBox=\"0 0 20.152 20.152\"\n >\n <g\n id=\"Icon_feather-edit\"\n data-name=\"Icon feather-edit\"\n transform=\"translate(-2.5 -2.166)\"\n >\n <path\n id=\"Path_166\"\n data-name=\"Path 166\"\n d=\"M11.5,6H4.889A1.889,1.889,0,0,0,3,7.889v13.22A1.889,1.889,0,0,0,4.889,23h13.22A1.889,1.889,0,0,0,20,21.108V14.5\"\n transform=\"translate(0 -1.179)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n <path\n id=\"Path_167\"\n data-name=\"Path 167\"\n d=\"M21.915,3.4a2,2,0,0,1,2.833,2.833l-8.971,8.971L12,16.152l.944-3.777Z\"\n transform=\"translate(-3.334 0)\"\n fill=\"none\"\n stroke=\"#393939\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"1\"\n />\n </g>\n </svg>\n\n <i *ngIf=\"chat?.isEditor\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12L3.41 13.41L9 19L21 7L19.59 5.59L9 16.17Z\"\n fill=\"#566563\"\n />\n </svg>\n </i>\n </button> -->\n\n <button\n class=\"up copy\"\n title=\"Like\"\n [class.active]=\"chat?.liked\"\n (click)=\"handleUpClick(i)\"\n >\n <i *ngIf=\"chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.38989 18.4902V8.33022C8.38989 7.93022 8.50989 7.54022 8.72989 7.21022L11.4599 3.15022C11.8899 2.50022 12.9599 2.04022 13.8699 2.38022C14.8499 2.71022 15.4999 3.81022 15.2899 4.79022L14.7699 8.06022C14.7299 8.36022 14.8099 8.63022 14.9799 8.84022C15.1499 9.03022 15.3999 9.15022 15.6699 9.15022H19.7799C20.5699 9.15022 21.2499 9.47022 21.6499 10.0302C22.0299 10.5702 22.0999 11.2702 21.8499 11.9802L19.3899 19.4702C19.0799 20.7102 17.7299 21.7202 16.3899 21.7202H12.4899C11.8199 21.7202 10.8799 21.4902 10.4499 21.0602L9.16989 20.0702C8.67989 19.7002 8.38989 19.1102 8.38989 18.4902Z\"\n fill=\"#17235B\"\n />\n <path\n d=\"M5.21 6.37988H4.18C2.63 6.37988 2 6.97988 2 8.45988V18.5199C2 19.9999 2.63 20.5999 4.18 20.5999H5.21C6.76 20.5999 7.39 19.9999 7.39 18.5199V8.45988C7.39 6.97988 6.76 6.37988 5.21 6.37988Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n <i *ngIf=\"!chat?.liked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.4037 20.9264L10.381 20.9038L10.3557 20.8843L7.72165 18.85L8.02965 18.4516L10.7161 20.5315C10.9228 20.7195 11.2181 20.8517 11.4962 20.9377C11.7978 21.0309 12.1451 21.09 12.4801 21.09H16.2801C16.8572 21.09 17.4266 20.8625 17.8751 20.5306C18.3159 20.2044 18.6912 19.7385 18.8305 19.1997L21.2428 11.8732C21.4379 11.3309 21.4287 10.749 21.0965 10.2887C20.7583 9.81377 20.1844 9.58999 19.5801 9.58999H15.5801C15.2031 9.58999 14.8615 9.43143 14.6276 9.16215L14.627 9.16142C14.3873 8.88649 14.2756 8.51549 14.3345 8.11501L14.8322 4.9195C14.9978 4.1052 14.4664 3.24596 13.7053 2.98804C13.3277 2.85165 12.9297 2.89129 12.61 2.99839C12.2949 3.10396 11.9772 3.30172 11.7881 3.57673L11.7881 3.57671L11.7851 3.58107L7.96352 9.26689L7.55454 8.99314L11.3751 3.30891L11.3755 3.30836C11.8763 2.56103 13.0109 2.19028 13.8726 2.51744L13.8834 2.52151L13.8943 2.52509C14.9044 2.8564 15.556 3.98765 15.3317 5.01314L15.3284 5.02805L15.326 5.04314L14.836 8.19314L14.836 8.19313L14.8351 8.19928C14.8184 8.31642 14.7981 8.60268 15.0138 8.84924L15.0248 8.86177L15.0366 8.87354C15.1833 9.02026 15.3817 9.09999 15.5901 9.09999H19.5901C20.4308 9.09999 21.1176 9.44886 21.5113 10.0079L21.5124 10.0095C21.8964 10.5502 21.9908 11.2849 21.7202 12.0291L21.7175 12.0365L21.7151 12.044L19.3251 19.324L19.3198 19.34L19.3156 19.3564C19.0058 20.5707 17.6766 21.6 16.2801 21.6H12.4801C12.2411 21.6 11.8403 21.5625 11.4297 21.4512C11.0123 21.338 10.6406 21.1633 10.4037 20.9264Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M5.37988 20.4999H4.37988C3.52442 20.4999 2.98559 20.2982 2.65822 19.9825C2.33437 19.6702 2.12988 19.1614 2.12988 18.3499V8.5499C2.12988 7.73843 2.33437 7.22962 2.65822 6.91731C2.98559 6.6016 3.52442 6.3999 4.37988 6.3999H5.37988C6.23534 6.3999 6.77418 6.6016 7.10155 6.91731C7.4254 7.22962 7.62988 7.73843 7.62988 8.5499V18.3499C7.62988 19.1614 7.4254 19.6702 7.10155 19.9825C6.77418 20.2982 6.23534 20.4999 5.37988 20.4999ZM4.37988 6.8999C4.0934 6.8999 3.83578 6.9164 3.61382 6.96689C3.38745 7.01838 3.16822 7.11196 2.99258 7.2876C2.81559 7.46459 2.72807 7.67966 2.68301 7.89002C2.63948 8.09318 2.62988 8.31967 2.62988 8.5499V18.3499C2.62988 18.5801 2.63948 18.8066 2.68301 19.0098C2.72807 19.2201 2.81559 19.4352 2.99258 19.6122C3.16822 19.7878 3.38745 19.8814 3.61382 19.9329C3.83578 19.9834 4.0934 19.9999 4.37988 19.9999H5.37988C5.66637 19.9999 5.92398 19.9834 6.14595 19.9329C6.37232 19.8814 6.59155 19.7878 6.76719 19.6122C6.94418 19.4352 7.0317 19.2201 7.07676 19.0098C7.12028 18.8066 7.12988 18.5801 7.12988 18.3499V8.5499C7.12988 8.31967 7.12028 8.09318 7.07676 7.89002C7.0317 7.67966 6.94418 7.46459 6.76719 7.2876C6.59155 7.11196 6.37232 7.01838 6.14595 6.96689C5.92398 6.9164 5.66637 6.8999 5.37988 6.8999H4.37988Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n <button\n class=\"down copy\"\n title=\"Dislike\"\n [class.active]=\"chat?.unliked\"\n (click)=\"handleDownClick(i)\"\n >\n <i *ngIf=\"chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.61 5.50002V15.66C15.61 16.06 15.49 16.45 15.27 16.78L12.54 20.84C12.11 21.49 11.04 21.95 10.13 21.61C9.15002 21.28 8.50002 20.18 8.71002 19.2L9.23002 15.93C9.27002 15.63 9.19002 15.36 9.02002 15.15C8.85002 14.96 8.60002 14.84 8.33002 14.84H4.22002C3.43002 14.84 2.75002 14.52 2.35002 13.96C1.97002 13.42 1.90002 12.72 2.15002 12.01L4.61002 4.52002C4.92002 3.28002 6.27002 2.27002 7.61002 2.27002H11.51C12.18 2.27002 13.12 2.50002 13.55 2.93002L14.83 3.92002C15.32 4.30002 15.61 4.88002 15.61 5.50002Z\"\n fill=\"#17235B\"\n />\n\n <path\n d=\"M18.7901 17.6099H19.8201C21.3701 17.6099 22.0001 17.0099 22.0001 15.5299V5.4799C22.0001 3.9999 21.3701 3.3999 19.8201 3.3999H18.7901C17.2401 3.3999 16.6101 3.9999 16.6101 5.4799V15.5399C16.6101 17.0099 17.2401 17.6099 18.7901 17.6099Z\"\n fill=\"#17235B\"\n />\n </svg>\n </i>\n\n <i *ngIf=\"!chat?.unliked\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.1237 21.481L10.1148 21.4778L10.1059 21.4748C9.09577 21.1435 8.44416 20.0122 8.66849 18.9867L8.67175 18.9718L8.6741 18.9568L9.1641 15.8068L9.16413 15.8068L9.16501 15.8006C9.18175 15.6835 9.20207 15.3972 8.98633 15.1507L8.97536 15.1381L8.96359 15.1263C8.81687 14.9796 8.61841 14.8999 8.41004 14.8999H4.41004C3.56937 14.8999 2.88252 14.551 2.48884 13.992L2.4877 13.9904C2.10371 13.4497 2.00931 12.715 2.27994 11.9708L2.28263 11.9634L2.28509 11.9559L4.67509 4.67586L4.68035 4.65985L4.68451 4.64353C4.99418 3.42996 6.33271 2.3999 7.72004 2.3999H11.52C11.7591 2.3999 12.1599 2.43736 12.5704 2.54872C12.9878 2.66194 13.3596 2.83655 13.5965 3.07346L13.6191 3.09608L13.6444 3.11563L16.2785 5.14986L15.9705 5.54825L13.2875 3.47111C13.0799 3.2763 12.7837 3.1413 12.5061 3.05412C12.2031 2.95897 11.8551 2.8999 11.52 2.8999H7.72004C7.1429 2.8999 6.57353 3.12735 6.12508 3.45926C5.68428 3.78551 5.30892 4.25142 5.16963 4.79019L2.75738 12.1167C2.56223 12.659 2.57147 13.2409 2.90366 13.7012C3.24183 14.1761 3.81578 14.3999 4.42004 14.3999H8.42004C8.79702 14.3999 9.13867 14.5585 9.37252 14.8277L9.37315 14.8285C9.61286 15.1034 9.72457 15.4745 9.66568 15.875C9.6656 15.8755 9.66552 15.8761 9.66544 15.8766L9.16795 19.0704C9.00242 19.8841 9.53299 20.7428 10.2933 21.0013C10.6685 21.1391 11.0675 21.0978 11.3857 20.9917C11.7001 20.8869 12.0218 20.6898 12.2121 20.4132L12.2121 20.4132L12.215 20.4088L16.0351 14.7253L16.4472 15.0045L12.6251 20.691L12.6249 20.6912C12.259 21.2361 11.5347 21.5999 10.8 21.5999C10.5668 21.5999 10.3358 21.5596 10.1237 21.481Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n <path\n d=\"M19.6201 17.6H18.6201C17.7647 17.6 17.2258 17.3983 16.8985 17.0826C16.5746 16.7703 16.3701 16.2615 16.3701 15.45V5.65C16.3701 4.83853 16.5746 4.32972 16.8985 4.0174C17.2258 3.7017 17.7647 3.5 18.6201 3.5H19.6201C20.4756 3.5 21.0144 3.7017 21.3418 4.0174C21.6656 4.32972 21.8701 4.83853 21.8701 5.65V15.45C21.8701 16.2615 21.6656 16.7703 21.3418 17.0826C21.0144 17.3983 20.4756 17.6 19.6201 17.6ZM18.6201 4C18.3336 4 18.076 4.01649 17.8541 4.06699C17.6277 4.11848 17.4085 4.21206 17.2328 4.3877C17.0558 4.56469 16.9683 4.77976 16.9232 4.99011C16.8797 5.19328 16.8701 5.41977 16.8701 5.65V15.45C16.8701 15.6802 16.8797 15.9067 16.9232 16.1099C16.9683 16.3202 17.0558 16.5353 17.2328 16.7123C17.4085 16.8879 17.6277 16.9815 17.8541 17.033C18.076 17.0835 18.3336 17.1 18.6201 17.1H19.6201C19.9066 17.1 20.1642 17.0835 20.3862 17.033C20.6126 16.9815 20.8318 16.8879 21.0074 16.7123C21.1844 16.5353 21.2719 16.3202 21.317 16.1099C21.3605 15.9067 21.3701 15.6802 21.3701 15.45V5.65C21.3701 5.41977 21.3605 5.19328 21.317 4.99011C21.2719 4.77976 21.1844 4.56469 21.0074 4.3877C20.8318 4.21206 20.6126 4.11848 20.3862 4.06699C20.1642 4.01649 19.9066 4 19.6201 4H18.6201Z\"\n fill=\"#566563\"\n stroke=\"#566563\"\n />\n </svg>\n </i>\n </button>\n </div>\n </div>\n <div\n class=\"Related mt-2\"\n *ngIf=\"\n showFeedBackIconsIndex === i &&\n !isChatingWithAi &&\n chat?.relatedListItems &&\n chat?.relatedListItems.length > 0\n \"\n >\n <h5 *ngIf=\"chat?.type === 'ai'\">\n <i class=\"bx bx-list-check\"></i> Related\n </h5>\n <div class=\"card-container\" *ngIf=\"chat?.type === 'ai'\">\n <ul class=\"list-container\">\n <ng-container *ngFor=\"let item of chat?.relatedListItems\">\n <li (click)=\"fetchDataFor(item, chat)\">{{ item }}</li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div\n class=\"cta-faqs quick-prompts-extended\"\n *ngIf=\"i == 0 && quickPrompts?.length\"\n >\n <!-- <div *ngFor=\"let tile of quickPrompts\" class=\"cta\"\n (click)=\"sendMessageWithTile(tile.prompt)\">\n Q: {{ tile.text }}\n </div> -->\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let tile of quickPrompts\"\n (click)=\"sendMessageWithTile(tile.prompt)\"\n >\n <ng-container *ngIf=\"tile\">{{ tile.text }}</ng-container>\n </button>\n </div>\n </div>\n <div class=\"chat bot\" *ngIf=\"i == 0 && botSkills\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img\n *ngIf=\"displayAvatarUrl || botIcon\"\n [src]=\"displayAvatarUrl || botIcon\"\n alt=\"Assistant\"\n class=\"chat-avatar-img\"\n />\n <span\n *ngIf=\"!(displayAvatarUrl || botIcon)\"\n class=\"chat-avatar-initials chat-avatar-initials-assistant\"\n >A</span\n >\n </div>\n <div\n class=\"dateTime\"\n [style.color]=\"dateTimeColor ? '' : ''\"\n >\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ chat?.time }}\n </div>\n </div>\n </div>\n <div\n class=\"chat-bubble-wrap\"\n [ngStyle]=\"{ background: bgBubbleAi || '#fff' }\"\n >\n <div class=\"chat-bubble-content\">\n <div\n class=\"SearchTitle ai\"\n [innerHTML]=\"processMessageForDisplay(botSkills)\"\n ></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.suggestions?.length\">\n <h4 class=\"labelChat\">\n Here are some things EventsGPT Copilot can help you do:\n </h4>\n <div class=\"cta_suggestions\">\n <button\n *ngFor=\"let suggestion of chat?.suggestions\"\n (click)=\"sendMessageWithTile(suggestion)\"\n >\n <ng-container *ngIf=\"suggestion\">{{\n suggestion\n }}</ng-container>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"\n chat?.action?.section_id == 'company_search' ||\n chat?.action?.section_id == 'user_search' ||\n chat?.action?.section_id == 'industry_company_search'\n \"\n >\n <div class=\"box\">\n <div class=\"tiktokwrapper\">\n <div\n class=\"tiktokshell\"\n *ngFor=\"let user of chat?.action.users\"\n >\n <div class=\"videoPhotobox\">\n <ng-conatiner\n *ngIf=\"user?.photoPath && !user.userVideosModel\"\n >\n <img [src]=\"user?.photoPath\" />\n </ng-conatiner>\n <ng-conatiner *ngIf=\"user.userVideosModel\">\n <app-video-player\n *ngIf=\"user?.userVideosModel\"\n [isDev]=\"isDev\"\n [currentUserId]=\"userId\"\n [videoObj]=\"user?.userVideosModel\"\n [user]=\"user\"\n [eventId]=\"eventId\"\n type=\"1\"\n >\n </app-video-player>\n </ng-conatiner>\n </div>\n\n <div\n class=\"noPhoto\"\n *ngIf=\"!user?.photoPath && !user.userVideosModel\"\n >\n <h3>\n {{ user.firstName | slice: 0 : 1\n }}{{ user.lastName | slice: 0 : 1 }}\n </h3>\n </div>\n <div class=\"overlymask\" *ngIf=\"!user.userVideosModel\"></div>\n <div class=\"onshell-content\">\n <div class=\"title-shell\">\n <h3>{{ user.firstName }} {{ user.lastName }}</h3>\n <h3 class=\"companyName\">{{ user.company }}</h3>\n </div>\n <div class=\"button-shell\">\n <button\n class=\"Connectbtn\"\n (click)=\"connectToUser(user.userId)\"\n >\n {{\n canConnect(user.userId)\n ? \"Connect\"\n : canDisconnect(user.userId)\n ? \"Disconnect\"\n : \"Request\n Sent\"\n }}\n </button>\n <button\n class=\"schedulebtn\"\n (click)=\"scheduleMeetingWithUser(user)\"\n >\n Schedule\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"chat?.action?.section_id == myUpcomingSessionAction\">\n <div class=\"agenda-items-wrapper\" class=\"agenda-items-wrapper\">\n <div class=\"list-view\">\n <div\n class=\"session-detail-wrapper card-background-session\"\n *ngFor=\"let upcomingSession of chat?.action.content\"\n >\n <div class=\"thumbnail\">\n <img\n alt=\"Introduction to the Imaging Radar Academy\"\n src=\"https://s27media.azureedge.net/8008/profile_pic/453cea2c-feba-11ed-8c0b-00155d025b0a.png\"\n class=\"\"\n />\n <!---->\n <!---->\n <!----><button\n class=\"play-btn color-primary\"\n title=\"Watch: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n <!---->\n </button>\n <!---->\n <!---->\n </div>\n <!---->\n <!---->\n <div class=\"content p-3\">\n <div\n class=\"d-flex justify-content-between align-items-center\"\n >\n <div class=\"d-flex flex-column\">\n <p class=\"fs-xs mb-0 body-text-color\">\n {{\n upcomingSession.dateTimeRange.start\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n -\n {{\n upcomingSession.dateTimeRange.end\n | date\n : \"MM-dd-yyyy HH:mm\"\n : getSessionIanaTimeZone(upcomingSession)\n }}\n {{ upcomingSession.timeZone.id }}\n </p>\n <!---->\n <!---->\n <!-- <p class=\"fs-xs mb-2 color-secondary\" title=\"Session Type: Generative AI\">Generative AI </p> -->\n <!---->\n </div>\n <div class=\"d-flex align-items-center actions px-2\">\n <!---->\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'view-session'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"View Session Information: Introduction to the Imaging Radar Academy\"\n >\n <span class=\"material-icons notranslate\">\n remove_red_eye\n </span>\n </button>\n\n <button\n (click)=\"\n performSessionAction(\n upcomingSession.id,\n 'add-to-agenda'\n )\n \"\n class=\"s27-btn-icon body-text-color\"\n >\n <span\n class=\"material-icons notranslate\"\n title=\"Add Session: Introduction to the Imaging Radar Academy to My agendaa\"\n >\n event_available\n </span>\n </button>\n <!---->\n <!---->\n <!---->\n <!---->\n\n <button\n (click)=\"\n performSessionAction(upcomingSession.id, 'play')\n \"\n class=\"s27-btn-icon body-text-color\"\n title=\"Copy session link to share\"\n >\n <span class=\"material-icons notranslate\">\n play_circle_outline\n </span>\n </button>\n <!---->\n </div>\n </div>\n <h2 class=\"body-text-color\">\n {{ upcomingSession.title }}\n </h2>\n <div\n class=\"session-description color-secondary\"\n [innerHTML]=\"sanitizeHtml(upcomingSession.description)\"\n ></div>\n <ul\n class=\"speakers grid-2-cols\"\n *ngFor=\"let speakerId of upcomingSession.speakers\"\n >\n <li class=\"\">\n <div class=\"image\" title=\"Blair Wunderlich\">\n <img\n alt=\"Blair Wunderlich\"\n [src]=\"speakers[speakerId]?.photoPath\"\n class=\"\"\n />\n <!---->\n <!---->\n <!---->\n </div>\n <!---->\n <div\n class=\"content pl-3\"\n style=\"text-transform: none\"\n >\n <div class=\"mb-0 body-text-color fs-xs fw-500\">\n {{ speakers[speakerId]?.firstName }}\n {{ speakers[speakerId]?.lastName }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.jobTitle }}\n </div>\n <div class=\"color-secondary fs-xxs\">\n {{ speakers[speakerId]?.company }}\n </div>\n </div>\n <!---->\n </li>\n </ul>\n <!---->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Initial load: loading dots when fetching chat history (no \"Thinking\") -->\n <div class=\"chat bot chat-thinking chat-loading-dots\" *ngIf=\"loading && !isChatingWithAi\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Loading\") || \"Loading\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n <!-- Thinking: only when user has sent a message and AI is responding -->\n <div class=\"chat bot chat-thinking\" *ngIf=\"isChatingWithAi && !executingWorkflow\">\n <div class=\"chat-box\">\n <div class=\"message\">\n <div class=\"time-cta\">\n <div class=\"Icon_TimeSTamp\">\n <div class=\"chat-avatar\">\n <img *ngIf=\"displayAvatarUrl || botIcon\" [src]=\"displayAvatarUrl || botIcon\" alt=\"Assistant\" class=\"chat-avatar-img\" />\n <span *ngIf=\"!(displayAvatarUrl || botIcon)\" class=\"chat-avatar-initials chat-avatar-initials-assistant\">A</span>\n </div>\n <div class=\"dateTime\" [style.color]=\"dateTimeColor ? '' : ''\">\n <span>{{ getTranslation(\"Assistant\") }}</span>\n {{ getLoadingTime() }}\n </div>\n </div>\n </div>\n <div class=\"thinking-row\">\n <div class=\"thinking-dots\">\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n <span class=\"thinking-dot\"></span>\n </div>\n <span class=\"thinking-text\">{{ getTranslation(\"Thinking\") || \"Thinking\" }}...</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- <div #chatMain></div> -->\n <div\n *ngIf=\"openWorkflowInput && selectedWorkflow && !executingWorkflow\"\n class=\"chatFooterWrapper\"\n >\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\">\n <div class=\"agents_note_wrapper\">\n <div>\n <h6>{{ selectedWorkflow?.Name }}</h6>\n {{ selectedWorkflow?.Description }}\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"toggleWorkflows(false)\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- here i need to loop through all the input fields selectedWorkflow.Trigger.InputSchema and render the input fields -->\n <!-- Form for Workflow Inputs -->\n <form\n [formGroup]=\"workflowForm\"\n (ngSubmit)=\"onWorkflowSubmit()\"\n class=\"form-container\"\n >\n <div\n *ngFor=\"let input of selectedWorkflow?.Trigger?.InputSchema\"\n class=\"form-group\"\n >\n <label>{{ input.Label }}</label>\n\n <!-- Handle Text Input or Text Area based on requirement -->\n <textarea\n *ngIf=\"input.Type === 'string'\"\n formControlName=\"{{ input.InputId }}\"\n [placeholder]=\"input.Placeholder\"\n [rows]=\"2\"\n [required]=\"input.Required\"\n class=\"form-control\"\n ></textarea>\n\n <!-- Dropdown for Select Options -->\n <select\n *ngIf=\"input.Type === 'select'\"\n formControlName=\"{{ input.InputId }}\"\n class=\"form-control\"\n >\n <option\n *ngFor=\"let option of input.Options\"\n [value]=\"option.Value\"\n >\n {{ option.Label }}\n </option>\n </select>\n </div>\n\n <!-- Submit button aligned to the right -->\n <div class=\"form-group\">\n <button type=\"submit\" class=\"btn btn-primary submit-button\">\n Submit\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n <div *ngIf=\"!openWorkflowInput\" class=\"chatFooterWrapper\">\n <!-- new UI for Chat Message Section by Amit -->\n <div class=\"chat-footer-upt\">\n <div class=\"topinfo-containerbox\" *ngIf=\"!checkForCop29BotId()\">\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleDropdown()\">\n <div class=\"dropdown-header\">\n <span>{{ getDropdownHeaderText() }}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen\">\n <label (click)=\"onSelectAll()\">\n <input type=\"checkbox\" [checked]=\"areAllSelected()\" />\n All\n </label>\n <label\n *ngFor=\"let agent of agents\"\n (click)=\"onAgentChange(agent)\"\n >\n <input type=\"checkbox\" [(ngModel)]=\"agent.selected\" />\n {{ agent.agentName }}\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"agents_note_wrapper\">\n <div class=\"agents-dropdown-wrapper\">\n <div class=\"dropdown-wrapper\" (click)=\"toggleWorkflows()\">\n <div class=\"dropdown-header\">\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 256 256\"\n class=\"h-5 w-5\"\n height=\"1.3em\"\n width=\"1.3em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M245.66,74.34l-32-32a8,8,0,0,0-11.32,11.32L220.69,72H192a74.49,74.49,0,0,0-28.35,6.73c-13.62,6.29-30.83,19.71-35.54,48-5.32,31.94-29.1,39.22-41,40.86a40,40,0,1,0,.18,16.06A71.65,71.65,0,0,0,108.13,178C121.75,172,139,158.6,143.89,129.31,150.65,88.77,190.34,88,192,88h28.69l-18.35,18.34a8,8,0,0,0,11.32,11.32l32-32A8,8,0,0,0,245.66,74.34ZM48,200a24,24,0,1,1,24-24A24,24,0,0,1,48,200Z\"\n ></path></svg\n >&nbsp; Workflows\n </div>\n <div class=\"dropdown-menu\" *ngIf=\"isWorkflowOpen\">\n <label\n *ngFor=\"let orgWorkflow of orgWorkflows\"\n (click)=\"onWorkflowSelected(orgWorkflow)\"\n >\n {{ orgWorkflow.Name }}\n </label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"bottombox-wrapper\">\n <!-- <input [disabled]=\"isChatingWithAi\" type=\"text\" class=\"form-control-1 s27-scroll\"\n \n placeholder=\"Ask anything...\" [style.background]=\"formFieldBgColor ? formFieldBgColor : ''\"\n [style.color]=\"formFieldTextColor ? formFieldTextColor : ''\" [(ngModel)]=\"input\"\n (keyup.enter)=\"handleSubmit()\" #myInput /> -->\n <textarea\n [disabled]=\"isChatingWithAi\"\n class=\"form-control-1 s27-scroll chat-textarea\"\n placeholder=\"{{ getTranslation('Ask anything') }}\"\n [(ngModel)]=\"input\"\n (keydown)=\"handleKeydown($event)\"\n (input)=\"adjustTextareaHeight($event)\"\n #myInput\n ></textarea>\n\n \n\n <button\n class=\"btn cta-chat rotate\"\n (click)=\"handleSubmit()\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n title=\"{{ getTranslation('Send Message') }}\"\n style=\"margin-right: 1px\"\n >\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n stroke-width=\"0\"\n viewBox=\"0 0 512 512\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M476.59 227.05l-.16-.07L49.35 49.84A23.56 23.56 0 0027.14 52 24.65 24.65 0 0016 72.59v113.29a24 24 0 0019.52 23.57l232.93 43.07a4 4 0 010 7.86L35.53 303.45A24 24 0 0016 327v113.31A23.57 23.57 0 0026.59 460a23.94 23.94 0 0013.22 4 24.55 24.55 0 009.52-1.93L476.4 285.94l.19-.09a32 32 0 000-58.8z\"\n ></path>\n </svg>\n <!-- SEND -->\n </button>\n\n <button\n class=\"btn cta-chat mr-1 voice-btn\"\n (click)=\"openVoiceModal()\"\n type=\"button\"\n [style.background]=\"sendButtonColor ? sendButtonColor : ''\"\n [style.color]=\"sendButtonTextColor ? sendButtonTextColor : ''\"\n >\n <svg\n class=\"voice-btn-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <rect class=\"vbar vbar-1\" x=\"3\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-2\" x=\"7\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-3\" x=\"11\" y=\"3\" width=\"2\" height=\"18\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-4\" x=\"15\" y=\"6\" width=\"2\" height=\"12\" rx=\"1\" fill=\"currentColor\"/>\n <rect class=\"vbar vbar-5\" x=\"19\" y=\"9\" width=\"2\" height=\"6\" rx=\"1\" fill=\"currentColor\"/>\n </svg>\n <span class=\"voice-btn-text\">Voice</span>\n </button>\n </div>\n </div>\n\n <!-- new UI for Chat Message Section by Amit -->\n </div>\n\n <div class=\"NoteTxt\">\n <div class=\"note\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12.882\"\n height=\"12.883\"\n viewBox=\"0 0 12.882 12.883\"\n >\n <path\n id=\"Icon_ion-shield-checkmark\"\n data-name=\"Icon ion-shield-checkmark\"\n d=\"M15.106,4.532a.46.46,0,0,0-.378-.424A20.132,20.132,0,0,1,8.881,2.291a.46.46,0,0,0-.379,0A20.132,20.132,0,0,1,2.655,4.108a.46.46,0,0,0-.378.424A11.3,11.3,0,0,0,2.98,9.4a10.049,10.049,0,0,0,2.06,3.235A10.516,10.516,0,0,0,8.521,15.1a.46.46,0,0,0,.345,0,10.516,10.516,0,0,0,3.481-2.465A10.049,10.049,0,0,0,14.4,9.4,11.3,11.3,0,0,0,15.106,4.532Zm-3.767,2.16L8.153,10.373a.46.46,0,0,1-.328.159H7.806a.46.46,0,0,1-.322-.131L6.069,9.014a.46.46,0,1,1,.644-.657L7.777,9.4,10.644,6.09a.46.46,0,0,1,.7.6Z\"\n transform=\"translate(-2.25 -2.25)\"\n fill=\"#06f\"\n />\n </svg>\n\n <span class=\"text\">{{\n getTranslation(\n \"Your personal or company information is kept private and secure\n within this chat.\"\n )\n }}</span>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #sourcesDrawer\n [position]=\"'end'\"\n [mode]=\"'over'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <div class=\"sourceDraweContainer\">\n <div class=\"container-fluid\">\n <button\n mat-icon-button\n class=\"closeButtonSource\"\n (click)=\"onCloseSource()\"\n >\n <mat-icon>close</mat-icon>\n </button>\n <h1>{{ currentSourcesList?.length }} Sources</h1>\n <!-- <p>Tell me about latest news from Mistral about AI agents announcement done this month</p> -->\n <hr />\n <ul class=\"sources-list\">\n <li *ngFor=\"let item of currentSourcesList; let si = index\">\n <!-- <input type=\"checkbox\" id=\"source1\"> -->\n <div class=\"source-content\" (click)=\"openLinkInNewTab(item.link)\">\n <label for=\"source1\">\n <span class=\"source-title\"\n ><span class=\"ml-1\">{{ si + 1 }}.</span\n >{{ item.title }}</span\n >\n <span class=\"image-container\">\n <img\n class=\"relative block\"\n [src]=\"getFaviconUrl(item.link)\"\n [alt]=\"getDomainName(item.link) + ' favicon'\"\n />\n <span> {{ getDomainName(item.link) }}</span>\n </span>\n <span class=\"source-description\">{{ item.desc }}</span>\n </label>\n </div>\n </li>\n </ul>\n </div>\n </div>\n </mat-drawer-content>\n </mat-drawer>\n <mat-drawer\n class=\"drawer edit-boxDrawer\"\n style=\"width: 45%\"\n #editorsDrawer\n [position]=\"'end'\"\n [mode]=\"'push'\"\n [style.background]=\"\n 'linear-gradient(' + (bgGradient ? bgGradient.join(', ') : '') + ')'\n \"\n >\n <mat-drawer-content>\n <lib-bot-html-editor\n *ngIf=\"isContentLoaded\"\n [editorContent]=\"currentMessageForEditor\"\n [isDocInEditMode]=\"isDocInEditMode\"\n [documentContent]=\"documentContent\"\n [conversationId]=\"conversationId\"\n [botId]=\"botId\"\n ></lib-bot-html-editor>\n </mat-drawer-content>\n </mat-drawer>\n</mat-drawer-container>\n\n<div *ngIf=\"showWorkflowExecutionDetails\" class=\"modal\">\n <div class=\"modal-content\">\n <div class=\"close-wrapper\">\n <span class=\"close_pop\" (click)=\"closeModal()\">&times;</span>\n </div>\n <div class=\"titleSection\">\n <!-- Workflow Title -->\n <h2>{{ workflowExecutionDetails.WorkflowName }}</h2>\n <!-- Workflow Title -->\n </div>\n <!-- Inputs Section -->\n <div class=\"inputs-section\">\n <h3>Inputs</h3>\n <ul>\n <li\n *ngFor=\"let input of objectToArray(workflowExecutionDetails.Inputs)\"\n >\n {{ input.key }}: {{ input.value }}\n </li>\n </ul>\n </div>\n\n <!-- Actions Section (Displayed as Timeline) -->\n <div class=\"actions-section\">\n <h3>Agent Actions</h3>\n <div class=\"timeline\">\n <div\n *ngFor=\"let action of workflowExecutionDetails.Actions\"\n class=\"timeline-item\"\n >\n <div class=\"timestamp-section\">\n <h4>{{ action.ActionName || action.Name }}</h4>\n <p><strong></strong> {{ action.InsertTimeStamp }}</p>\n </div>\n <p [innerHTML]=\"processMessageForDisplay(action.Output)\"></p>\n <!-- <pre>{{ action.Output }}</pre> -->\n </div>\n </div>\n </div>\n\n <!-- Insert Timestamp -->\n <div class=\"timestamp-section\">\n <p>\n <strong>Inserted At:</strong>\n {{ workflowExecutionDetails.InsertTimeStamp }}\n </p>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";@import\"https://e1cdn.social27.com/digitalevents/liteversion/fonts/segoe-ui/stylesheet.css\";.bot-sticky-header-chat{background:#fff;border-bottom:1px solid #ddd;padding:0 0 10px;position:fixed;top:0!important;transition:all 1s;z-index:100;width:100%;padding:10px 15px!important;box-shadow:2px 0 5px #e1e1e1!important;border:none!important}@media (max-width: 768px){.bot-sticky-header-chat{top:0!important}}#botAllChat{padding:0 20px!important}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#e5ccbc}::-webkit-scrollbar-thumb:hover{background:#e5ccbc}body{overflow:hidden}.ios-device .drawer .chat-footer .form-control{font-size:16px}.hivegpt-chat-bot-wrapper{position:fixed;height:100%;inset:0;opacity:0;visibility:hidden;z-index:999999;background:transparent!important}.hivegpt-chat-bot-wrapper.mat-drawer-container-has-open{opacity:1;visibility:visible;z-index:999999;transition:all .3s;background:transparent!important}.hivegpt-chat-bot-wrapper .mat-drawer:not(.mat-drawer-side){box-shadow:none}.hivegpt-chat-bot-wrapper mat-drawer{width:100%;background-image:none!important;background-color:#f2f2f2}.hivegpt-chat-bot-wrapper mat-drawer.full-width-drawer{max-width:100%}.hivegpt-chat-bot-wrapper .mat-drawer-content{display:flex;flex-direction:column}.hivegpt-chat-bot-wrapper .chat-header{padding:16px 40px;width:100%}.hivegpt-chat-bot-wrapper .chat-header h2{font-family:Segoe UI,sans-serif;margin:0;font-size:36px;font-weight:500;line-height:108%;letter-spacing:-.72px;text-transform:uppercase}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{position:absolute;top:16px;right:12px;border:none;padding:0;background:transparent;outline:none;width:35px;height:35px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:18px}.hivegpt-chat-bot-wrapper .chat-main{width:100%;flex:1;overflow-y:auto;display:flex;flex-direction:column;justify-content:space-between}.hivegpt-chat-bot-wrapper .chat-main .innerChat{overflow-y:auto;width:100%;padding-top:72px!important}.hivegpt-chat-bot-wrapper .chat-main .ai h3{font-size:1.3rem!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box{width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{min-height:40px;position:relative;margin-top:10px;margin-left:50px}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat-box .message{margin-left:0}}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p{font-family:Segoe UI,sans-serif;font-weight:400;font-size:14px;font-style:normal;line-height:160%;margin:0;color:#000;text-align:left;color:#525252}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message p a{cursor:pointer!important;text-decoration:underline;font-weight:700;color:#17235b!important}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta{display:flow-root;align-items:end;grid-gap:10px;gap:10px;position:relative;bottom:-7px;right:-10px;z-index:5}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button i{display:inline-block}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button:hover{color:#17235b}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat-box .message .cta button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.hivegpt-chat-bot-wrapper .chat-main .chat{margin-bottom:20px}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message{margin-left:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:4px 14px 14px;background:#fff;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content{width:100%;max-width:100%;margin:0;padding:0;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{margin:0;padding:0;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .chat-box .message .chat-bubble-wrap .chat-bubble-content>div *{max-width:100%}.hivegpt-chat-bot-wrapper .chat-main .chat.botAi .Icon_TimeSTamp{margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser{text-align:right;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box{margin-left:auto;margin-right:0;width:-moz-fit-content;width:fit-content}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message{margin-left:0;margin-right:0;padding-right:0;width:-moz-fit-content;width:fit-content;max-width:100%;display:flex;flex-direction:column;align-items:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap{margin-top:6px;border-radius:14px 4px 14px 14px;background:#183988;padding:10px 14px;color:#fff!important;max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap .chat-bubble-content>div{max-width:100%;overflow-wrap:break-word;word-break:break-word}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message .chat-bubble-wrap p,.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .chat-box .message p{text-align:left;color:#fff!important}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime{text-align:right;margin-left:0;margin-right:10px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .dateTime span{margin-left:0;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .time-cta{justify-content:flex-end}.hivegpt-chat-bot-wrapper .chat-main .chat.botUser .Icon_TimeSTamp{justify-content:flex-end;margin:0}.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{display:flex;justify-content:left;align-content:center;align-items:center;margin:0 -60px;width:auto}@media (max-width: 768px){.hivegpt-chat-bot-wrapper .chat-main .chat .Icon_TimeSTamp{margin:0}}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime{font-size:15px;font-style:normal;font-weight:300;line-height:140%;color:#333232}.hivegpt-chat-bot-wrapper .chat-main .chat .dateTime span{font-size:15px;font-style:normal;font-weight:500;line-height:140%;color:#000;margin-left:15px;margin-right:5px}.hivegpt-chat-bot-wrapper .chat-main .chat:last-of-type{margin-bottom:0}.hivegpt-chat-bot-wrapper .chatFooterWrapper{background:#fff;margin-top:10px!important;box-shadow:2px 0 5px #e1e1e1;width:auto;margin:0 15px 15px;border:2px solid rgba(218,218,218,.5882352941);border-radius:10px;transition:all .5s}.hivegpt-chat-bot-wrapper .chatFooterWrapper:hover{box-shadow:2px 0 4px #ddd;border:2px solid rgba(184,184,184,.5882352941)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .chat-footer-upt{padding:4px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note{display:inline-flex;align-items:center;gap:8px;font-size:12px;line-height:1;margin:0 auto 4px;color:#000;padding:10px 25px;border-radius:15px;background:rgba(27,117,187,.0509803922)}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note a{text-transform:capitalize}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i{font-size:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note i svg{width:18px;height:18px}.hivegpt-chat-bot-wrapper .chatFooterWrapper .note span{flex:1;gap:4px;line-height:1.3}.hivegpt-chat-bot-wrapper .chat-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;padding:0;position:relative}.hivegpt-chat-bot-wrapper .chat-footer .form-control{background:#fff!important;border:0;line-height:21px;outline:0;padding:10px;position:relative;width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control::placeholder{color:#6c7a78}.hivegpt-chat-bot-wrapper .chat-footer .form-control:focus{border-color:#e5ccbc}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer{align-items:center;display:flex;gap:8px;justify-content:space-between;text-align:right;position:absolute;right:15px;margin-bottom:10px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .btn{color:#000;font-weight:500;gap:8px;max-width:150px;padding:0}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{align-items:center;border:none;border-radius:0;box-shadow:0 1px 2px #1018280d;display:inline-flex;font-size:20px;height:auto;justify-content:center;width:auto;background:transparent!important}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat:hover{opacity:.8}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-again{border:1px solid #17235b;background:#17235b;color:#fff}.hivegpt-chat-bot-wrapper .cta-faqs{display:flex;align-items:flex-end;flex-direction:column;flex-wrap:wrap;gap:8px;padding:10px 0 0;max-width:80%;margin-left:auto}.hivegpt-chat-bot-wrapper .cta-faqs .cta{font-family:Segoe UI,sans-serif;font-size:14px;font-style:normal;font-weight:500;line-height:160%;margin:0;color:#333;white-space:pre-line;border-radius:20px 20px 0;background:transparent;padding:12px 20px;min-height:44px;text-decoration:none;transition:all .3s;cursor:pointer;border:1px solid #c9a893;text-align:left}.spinner{display:flex;align-items:center;justify-content:center;gap:2px}.spinner>div{width:5px;height:5px;background-color:#173330;border-radius:100%;display:inline-block;animation:bouncedelay 1.4s ease-in-out infinite;animation-fill-mode:both}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes bouncedelay{0%,80%,to{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.time-cta{display:flex;align-items:center;justify-content:start;gap:8px;margin-top:5px}@keyframes thumbsUpAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes thumbsDownAnimation{0%,to{transform:translateY(0)}50%{transform:translateY(3px)}}@media (max-width: 767px){.hivegpt-chat-bot-wrapper .chat-footer{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-footer .cta-footer .cta-chat{max-width:100%}.hivegpt-chat-bot-wrapper .chat-footer .form-control{height:80px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon{top:8px;right:8px;width:28px;height:28px}.hivegpt-chat-bot-wrapper .chat-header .closeIcon span{font-size:14px}.hivegpt-chat-bot-wrapper .chat-header{padding:10px 24px}.hivegpt-chat-bot-wrapper .chat-header h2{font-size:20px}.cta-faqs{padding:10px 0 0}}.body-overflow-hidden{overflow:hidden}.chat-button{background:#17235b;border:#17235b;border-radius:50%;width:50px;height:50px;font-size:24px;color:#fff;display:inline-flex;align-items:center;justify-content:center}textarea{caret-color:#000}.labelChat{margin:0 0 10px;font-weight:400;font-size:14px}.chatType h4{text-align:center;color:#566563}.chatType ul{list-style:none;padding:4px;margin:0 0 20px;display:flex;align-items:center;justify-content:center;background:#fff;border-radius:10px;box-shadow:0 .3px .9px #0000001f,0 1.6px 3.6px #00000029}.chatType ul li{flex:1}.chatType ul li button{width:100%;text-align:center;background:#fff;align-items:center;border:none;padding:.375rem;min-height:48px;border-radius:10px;font-weight:600;text-shadow:1px 0px rgba(0,0,0,.2)}.chatType ul li button.active{box-shadow:0 1px 2px #1018280d;background:linear-gradient(96deg,#761c79 -10.61%,#761c79 84.59%);color:#fff}.cta_suggestions{display:flex;align-items:center;flex-wrap:wrap;gap:.5rem;margin-bottom:20px}.cta_suggestions button{color:#1543cd;background:#fff;border:1px solid #174ae4;padding:8px 12px;border-radius:10px;font-size:14px;line-height:1.2;font-weight:600;text-align:left;position:relative;transition:all .3s;box-shadow:#00000021 0 1.6px 3.6px,#0000001a 0 .3px .9px}.cta_suggestions button:hover{background:#eff3ff}.balanced .chat-footer .cta-footer .cta-chat,.balanced .chat-main .chat.botUser .chat-box .message,.balanced .chatType ul li button.active{color:#000}.balanced .chat-main .innerChat .title p span{color:#06f}.balanced mat-drawer{background-image:linear-gradient(180deg,rgba(88,190,251,.05) 60%,rgba(0,102,255,.2) 96.27%)}.balanced .cta_suggestions button:hover{border:1px solid #0066ff}.precise .chat-footer .cta-footer .cta-chat,.precise .chat-main .chat.botUser .chat-box .message{background:linear-gradient(96deg,#69ca6d -10.61%,#4caf50 84.59%)}.precise .chatType ul li button.active{color:#fff;background:linear-gradient(96deg,#4caf50 -10.61%,#4caf50 84.59%)}.precise .chat-main .innerChat .title p span{color:#4caf50}.precise mat-drawer{background-image:linear-gradient(180deg,rgba(76,175,80,.05) 60%,rgba(76,175,80,.3) 96.27%)}.precise .cta_suggestions button:hover{border:1px solid #4caf50}.title{margin-bottom:20px}.title h2{font-size:22px;margin:0}.title h2 span{color:#000;display:inline-flex;align-items:center;gap:10px}.title h2 i{line-height:1;font-size:30px;color:#000}.title h2 i svg{width:30px;height:30px}.title p{margin:0;font-weight:600}.title p span{color:#000}.agenda-items-wrapper{padding-top:15px;padding-bottom:15px}@media (max-width: 576px){.list-view .session-detail-wrapper{flex-direction:column;border:none}}.card-background-session{background:#fff;border-radius:8px}.card-background-session .body-text-color{color:#111!important}.card-background-session h2{font-size:20px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:1;line-clamp:1;-webkit-box-orient:vertical;margin-bottom:8px}.card-background-session .session-description{color:#111!important;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:14px}.card-background-session .color-secondary{color:#111!important}.card-background-session p{font-size:14px}.list-view .session-detail-wrapper .s27-btn-icon{background:transparent;border:transparent}.list-view .session-detail-wrapper{border-left:3px solid transparent;display:flex;margin-bottom:16px}.thumbnail{width:160px;height:160px;min-width:160px;position:relative;display:flex;align-items:center;justify-content:center}.thumbnail img{height:100%;width:100%;object-fit:cover}@media (max-width: 576px){.thumbnail{width:100%;min-height:unset;height:160px}}.thumbnail .play-btn{font-size:60px;background-color:transparent;border:0;position:absolute;inset:0;width:100%;display:flex;align-items:center;justify-content:center}.thumbnail .play-btn span{font-size:80px;text-shadow:0px 0px 14px rgba(74,74,74,.45)}.content{flex-grow:1}.actions{background-color:transparent!important}.speakers{padding:0;margin-top:10px;margin-bottom:0}.speakers li{display:flex;align-items:unset}.speakers li .content{font-size:12px!important}.speakers .image{height:40px;width:40px;min-width:40px;border-radius:100%;overflow:hidden}.speakers img{height:100%;width:100%;object-fit:cover}.grid-2-cols{display:grid;grid-template-columns:calc(55% - 10px) calc(50% - 10px);grid-gap:15px;padding-right:20px}@media (max-width: 768px){.grid-2-cols{grid-template-columns:calc(50% - 10px) calc(50% - 10px)}}@media (max-width: 575px){.grid-3-cols{grid-template-columns:100%}}.quick-prompts-extended{align-items:flex-start!important;margin-left:0!important}.border-shape .s27-scroll::-webkit-scrollbar{width:3px;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-track{background:#f1f1f1;border-radius:30px}.border-shape .s27-scroll::-webkit-scrollbar-thumb{background:#888;border-radius:30px}.box{width:100%;height:275px;margin:10px 0;display:table}.tiktokwrapper{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;height:100%}.tiktokwrapper .tiktokshell{width:100%;min-width:160px;height:100%;min-height:275px;position:relative;border-radius:5px;background:#3d2b8f;box-shadow:0 0 6px #494949;border:2px solid #fff}.tiktokwrapper .overlymask{background-image:url(https://e1cdn.social27.com/digitalevents/HiveGpt/screen-overlay.png);background-position:0 0;position:absolute;z-index:6;bottom:0;left:0;width:100%;height:100%}.tiktokwrapper .videoPhotobox{position:absolute;z-index:6;bottom:0;left:0;width:auto;overflow:hidden;height:272px}.tiktokwrapper .videoPhotobox video{width:100%;height:270px;outline:0;object-fit:cover;border-radius:0;cursor:pointer;transition:.3s ease-in-out}.tiktokwrapper .videoPhotobox img{width:100%;height:100%;object-fit:cover}.tiktokwrapper .playBtn{position:absolute;left:0;right:0;margin:0 auto;z-index:10;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;width:40px;top:105px}.tiktokwrapper .playBtn:hover{transform:scale(1.2)}.tiktokwrapper .noPhoto{position:absolute;left:0;right:0;margin:0 auto;z-index:6;height:40px;display:flex;align-items:center;justify-content:center;transition:all 1s;cursor:pointer;border:none;top:105px}.tiktokwrapper .noPhoto h3{font-size:46px;color:#fff}.tiktokwrapper .onshell-content{position:absolute;bottom:10px;left:5px;z-index:10}.tiktokwrapper .onshell-content .title-shell{margin:0 10px}.tiktokwrapper .onshell-content h3{color:#fff;font-size:13px;font-weight:500}.tiktokwrapper .onshell-content .companyName{color:#eaeaea;font-size:12px;font-weight:400}.tiktokwrapper .onshell-content .button-shell button{background:#4e4e4e;border:none;border-radius:2px;padding:4px 7px;color:#fff;margin:0 1px;text-transform:capitalize;font-size:11px}.tiktokwrapper .onshell-content .Connectbtn{background:linear-gradient(149deg,#0066ff 0%,#0066ff 100%)!important}.skeleton-box{display:inline-block;height:1em;position:relative;overflow:hidden;background-color:#dddbdd}.skeleton-box:after{position:absolute;inset:0;transform:translate(-100%);background-image:linear-gradient(90deg,rgba(255,255,255,0) 0,rgba(255,255,255,.2) 20%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0));animation:shimmer 2s infinite;content:\"\";z-index:0}@keyframes shimmer{to{transform:translate(100%)}}.blog-post__headline{font-size:1.25em;font-weight:700}.blog-post__meta{font-size:.85em;color:#6b6b6b}.o-media{display:flex}.o-media__body{flex-grow:1;margin-left:1em}.o-vertical-spacing>*+*{margin-top:.75em}.o-vertical-spacing--l>*+*{margin-top:2em}.copy{background:none;border:none;cursor:pointer;padding:5px;transition:transform .2s ease}.copy.active{transform:scale(1.1)}.copy svg{width:18px;height:18px;fill:#566563}.copyBox{padding:5px 10px;position:relative;border-radius:13px;width:135px;color:#566563;display:flex;gap:12px;float:right;background:#f7f7f7}.copyBox button{background:transparent;border:none;color:#566563;padding:0;cursor:pointer;transition:all .3s}.copyBox button i{display:inline-block}.copyBox button:hover{color:#17235b}.copyBox button.up:hover i{animation:thumbsUpAnimation .5s ease-in-out;animation-fill-mode:forwards}.copyBox button.down:hover i{animation:thumbsDownAnimation .5s ease-in-out;animation-fill-mode:forwards}.din{display:inline-flex}.chatFooterWrapper{flex-direction:column;justify-content:center;align-items:center;border-top:1px solid #ccc;background-color:#f5f5f5}.chat-footer{display:flex;align-items:center;width:100%;background:#fff;margin-bottom:10px;flex-direction:column}.topinfo-containerbox{display:none;justify-content:space-between;width:100%;background:#f9f9f9;padding:5px 10px 8px;align-items:center;border-bottom:1px solid #efefef;margin:0}@media (max-width: 768px){.topinfo-containerbox{flex-direction:column}}.agents_note_wrapper{display:flex;justify-content:space-around}.bottombox-wrapper{display:flex;width:100%;padding:10px}.dropdown-wrapper{position:relative;margin-right:10px}.dropdown-header{display:flex;align-items:center;cursor:pointer;background:#fff;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid #ddd}.dropdown-header span{margin-right:8px}.dropdown-menu{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;max-height:200px;overflow-y:auto;padding:0;position:absolute;top:auto;width:230px;z-index:1000}.dropdown-menu label{cursor:pointer;display:block;padding:5px 15px;font-size:16px}.dropdown-menu label input{width:16px;height:16px}.dropdown-menu label:hover{background-color:#f0f0f0}.border-shape{flex-grow:1}.form-control-1{width:100%;border:1px solid #ddd;border-radius:5px;padding:10px}.cta-footer{display:flex;align-items:center}.text-left .note-section{width:100%;max-width:800px;background:#fff;border-radius:5px;box-shadow:0 2px 4px #0000001a;padding:10px;display:flex;align-items:center;margin-top:10px}.text-left .note{display:flex;align-items:center;color:#555}.text-left .note i{margin-right:8px}.text-left .note .text{font-size:14px}.card-container{display:flex;gap:15px}.custom-card{width:18rem;border:1px solid #ddd;border-radius:.25rem;box-shadow:0 4px 8px #0000001a;overflow:hidden;background:#fffefe;margin-bottom:10px}.custom-card .card-body{padding:10px}.custom-card .card-title{font-size:1.25rem;font-weight:700}.custom-card .card-text{font-size:1rem;text-align:left}.custom-card .btn-primary{background-color:#007bff;border:none;border-radius:.25rem}.custom-card .card-footer{padding:10px;background-color:#f8f9fa;text-align:center;color:#6c757d}.list-container{list-style:none;padding:0}.list-container li{font-size:13px;margin-bottom:5px;padding:6px 12px;background:#f5f5f5;border-radius:8px}.list-container li:hover{color:#000;cursor:pointer}.session-cards-section,.attendee-cards-section,.speaker-cards-section,.sponsor-cards-section,.booth-rep-cards-section{width:100%;max-width:100%;margin-top:8px;margin-bottom:4px;display:block;visibility:visible;overflow:visible}.session-cards-section{overflow-x:hidden;min-width:0}.card-message-bubble{margin-bottom:20px;border-radius:4px 14px 14px;padding:10px 14px 10px 26px;width:100%;max-width:100%;box-sizing:border-box;overflow-wrap:break-word}.card-message-bubble .card-message-text{margin:0}.card-message-text{margin-bottom:0}.session-cards-container{display:grid;grid-template-columns:1fr;gap:20px;width:100%;min-width:0;max-width:100%;overflow:hidden}@media (min-width: 600px){.session-cards-container{grid-template-columns:repeat(2,1fr)}}.session-card-item{background:linear-gradient(135deg,#9f7aea,#805ad5);border:none;border-radius:18px;box-sizing:border-box;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;min-height:220px;min-width:0;max-width:100%;overflow:hidden;padding:25px;position:relative}.session-card-item-ondemand{background:linear-gradient(135deg,#9f7aea,#805ad5);min-height:auto;padding:20px 24px;min-height:220px}.session-card-item-ondemand .session-card-ondemand-badge{display:inline-block;background:#7d69bd;color:#fff;font-size:11px;font-weight:600;letter-spacing:.02em;padding:4px 10px;border-radius:999px;margin-bottom:8px;width:-moz-fit-content;width:fit-content}.session-card-item-ondemand .session-card-ondemand-available{color:#fff;font-size:14px;font-weight:400;margin-bottom:6px}.session-card-item-ondemand .session-card-ondemand-title{font-size:18px;font-weight:700;margin:0 0 8px;line-height:1.3}.session-card-item-ondemand .session-card-ondemand-desc{font-size:14px;font-weight:400;color:#fff;opacity:.95;-webkit-line-clamp:3;line-clamp:3;margin-bottom:12px}.session-card-item-ondemand .session-card-actions-row{margin-top:auto}.session-card-header{margin-bottom:12px;margin-left:80px;min-height:40px;display:flex;align-items:center}.session-card-date-badge{position:absolute;top:20px;left:20px;width:60px;height:60px;background:#000;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-weight:700;font-size:14px}.session-card-date-day{font-size:14px;font-weight:700;color:#fff;line-height:1.2;display:block}.session-card-date-month{font-size:15px;font-weight:700;color:#fff;display:block}.session-card-date-na{font-size:12px;font-weight:700;color:#fff;display:block;line-height:1.2}.session-card-room-time{min-width:0;overflow-wrap:break-word}.session-card-room{font-size:18px;font-weight:600;color:#fff;line-height:1.3}.session-card-time{font-size:13px;opacity:.9;color:#fff;line-height:1.3}.session-card-title{color:#fff;font-size:18px;font-weight:600;line-height:1.35;margin:6px 0 8px;min-width:0;overflow-wrap:break-word}.session-card-meta{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}.session-card-meta-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.35}.session-card-meta-label{font-weight:500;color:#ffffffe6;flex-shrink:0}.session-card-meta-value{font-weight:400;color:#fff;min-width:0}.session-card-description{font-size:14px;line-height:1.4;color:#fff;opacity:.95;flex:1;min-height:0;display:-webkit-box;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.session-card-status{display:flex;align-items:center;justify-content:flex-end;gap:8px;font-size:13px;font-weight:400;color:#fffffff2;margin-bottom:12px}.session-card-status-bullet{width:6px;height:6px;min-width:6px;border-radius:50%;background:rgba(255,255,255,.9)}.session-card-actions-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:auto;flex-wrap:nowrap;min-width:0}.session-card-item .speakers-UIcard{display:flex;align-items:center;flex:0 0 auto;min-width:0}.session-card-item .speaker-tooltip-wrap{position:relative;display:inline-block}.session-card-item .speaker-tooltip{position:absolute;bottom:100%;left:50%;transform:translate(-50%);margin-bottom:6px;padding:4px 8px;background:rgba(0,0,0,.85);color:#fff;font-size:12px;font-weight:500;white-space:nowrap;border-radius:4px;pointer-events:none;visibility:hidden;opacity:0;transition:opacity .15s ease,visibility .15s ease;z-index:10}.session-card-item .speaker-tooltip-wrap:hover .speaker-tooltip{visibility:visible;opacity:1}.session-card-item .speaker{width:40px;height:40px;border-radius:50%;overflow:hidden;background:#e6e6e6;display:flex;align-items:center;justify-content:center;font-weight:600;font-family:Arial,sans-serif;color:#333;margin-left:-10px}.session-card-item .speaker:first-child{margin-left:0}.session-card-item .speaker img{width:100%;height:100%;object-fit:cover}.session-card-item .speaker.initials{font-size:14px}.session-card-item .speaker img[src=\"\"],.session-card-item .speaker img:not([src]){opacity:0}.session-card-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:0;justify-content:flex-end;flex:0 0 auto;min-width:0}.session-card-btn{font-size:14px;font-weight:600;padding:8px 20px;min-width:80px;border-radius:8px;cursor:pointer;border:none;transition:opacity .2s}.session-card-btn-primary{background:#000;color:#fff}.session-card-btn-primary:hover{opacity:.9}.session-card-btn-secondary{background:#000;color:#fff;border:none}.session-card-btn-secondary:hover{opacity:.9}.session-card-btn-disabled{opacity:.5;cursor:not-allowed!important;pointer-events:none}.session-card-btn-disabled.session-card-btn-primary,.session-card-btn-disabled.session-card-btn-secondary{background:#000;color:#fff}.session-card-when-disable{font-size:13px;color:#ffffffe6;margin-bottom:10px;font-style:italic}.session-card-meeting-delayed{font-size:13px;color:#fffffff2;margin-bottom:10px}.attendee-cards-container{display:flex;flex-wrap:wrap;gap:20px;width:100%}.attendee-card-item{flex:0 0 calc((100% - 60px)/4);max-width:215px!important}@media (max-width: 1200px){.attendee-card-item{flex:0 0 calc((100% - 40px) / 3)}}@media (max-width: 768px){.attendee-card-item{flex:0 0 calc((100% - 20px)/2)}}@media (max-width: 480px){.attendee-card-item{flex:0 0 100%}}.attendee-card{position:relative;height:320px;min-width:215px;border-radius:8px;overflow:hidden;color:#fff;display:flex;flex-direction:column;justify-content:flex-end;padding:20px;background-color:#5a5a5a;background-size:cover;background-position:center}@media (max-width: 480px){.attendee-card-item{max-width:100%!important}.attendee-card{height:490px}}.attendee-card-has-video{background-image:none!important}.attendee-card-video{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;z-index:1}.attendee-card-play-btn{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;border:1px solid rgba(255,255,255,.35);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:700;line-height:54px;text-align:center;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center;padding:0}.attendee-card-mute-btn{position:absolute;top:10px;right:10px;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(0,0,0,.45);color:#fff;font-size:0;font-weight:600;cursor:pointer;z-index:4;display:flex;align-items:center;justify-content:center}.attendee-card-play-btn .material-icons,.attendee-card-mute-btn .material-icons{font-size:28px;line-height:1}.attendee-card-initials{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;background:linear-gradient(135deg,#6b7280 0%,#4b5563 100%);font-size:58px;letter-spacing:-2px;z-index:1;background:linear-gradient(135deg,#6b7280,#4b5563);color:#ffffffe6;font-weight:400;justify-content:center;padding:50px 0}.attendee-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to top,rgba(0,0,0,.85),rgba(0,0,0,.25));z-index:2;pointer-events:none}.attendee-content{position:relative;z-index:3}.attendee-name{font-size:18px;font-weight:600;margin-bottom:4px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-company{font-size:13px;opacity:.85;margin-bottom:8px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc{font-size:14px;margin-bottom:12px;opacity:.95;overflow:hidden}.attendee-desc-collapsed{display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.attendee-desc-expanded{display:block;overflow:visible;margin-bottom:6px}.attendee-read-more{display:inline-block;background:transparent;border:0;padding:0;margin:-6px 0 10px;color:#ffffffe6;font-weight:600;font-size:12px;text-decoration:underline;cursor:pointer}.attendee-buttons{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content}.attendee-buttons .btn{font-size:12px;padding:5px 8px;border-radius:3px;border:none;cursor:pointer;flex:1 1 0;min-width:80px;text-align:center;white-space:nowrap;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}@media (max-width: 480px){.attendee-buttons{flex-wrap:wrap;width:100%!important}.attendee-buttons .btn{flex:1 1 100%;max-width:100%;white-space:normal}}.attendee-card-btn-connect{background:#0d6efd;color:#fff}.attendee-card-btn-connect:hover:not(:disabled){opacity:.9}.attendee-card-btn-view-profile{background:#494949;color:#fff}.attendee-card-btn-view-profile:hover:not(:disabled){opacity:.9}.attendee-card-btn-request-sent{background:#0d6efd;color:#fff;opacity:.5;cursor:not-allowed!important}.attendee-card-btn-disconnect{background:#0d6efd;color:#fff}.attendee-card-btn-disconnect:hover{background:rgba(255,255,255,.3);opacity:.95}.attendee-card-btn:disabled{opacity:.6;cursor:not-allowed!important}.show-more-cards-btn{display:flex;align-items:center;justify-content:center;margin-top:12px;padding:10px 16px;background:#fff;border:1.5px dashed #ccc;border-radius:12px;color:#06f;font-weight:600;font-size:14px;cursor:pointer;width:-moz-fit-content;width:fit-content}.show-more-cards-btn:hover{background:#f8f9fa}.booth-rep-card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}@media (max-width: 1204px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)!important}.booth-rep-card-logo{height:120px!important}.booth-rep-card-logo img{max-height:80px!important;object-fit:contain}}@media (max-width: 768px){.booth-rep-card-grid{grid-template-columns:repeat(2,1fr)}.booth-rep-card-logo{height:90px!important}.booth-rep-card-logo img{max-height:60px!important;object-fit:contain}}.booth-rep-card{background:linear-gradient(90deg,#9faffc 0%,#a1afff 40%,#adb9ff 100%);padding:18px;border-radius:6px;display:flex;flex-direction:column}.booth-rep-card-logo{width:100%;height:140px;background:#fff;border:1px solid #f7f7f7;display:flex;align-items:center;justify-content:center;margin-bottom:12px;border-radius:4px;box-shadow:0 0 2px #ddd}.booth-rep-card-logo img{max-height:90px;object-fit:contain}.booth-rep-card-logo-placeholder{font-size:48px;font-weight:600;color:#9faffc;text-transform:uppercase}.booth-rep-card-title{font-size:18px;font-weight:600;color:#1d2b4f;margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.booth-rep-card-desc{font-size:14px!important;color:#3a3a3a!important;margin-bottom:18px!important;line-height:1.3!important;display:-webkit-box!important;-webkit-line-clamp:3!important;line-clamp:3!important;-webkit-box-orient:vertical!important;overflow:hidden!important}.booth-rep-card-btn{align-self:flex-start;margin-top:auto;background:#494949;color:#fff;border:none;padding:10px 18px;border-radius:6px;font-size:14px;cursor:pointer;transition:.3s}.booth-rep-card-btn:hover{background:#5a5a5a}.collapsible-container{width:100%;margin-bottom:5px;overflow:hidden}.collapsible-header{display:flex;padding:15px;cursor:pointer}.collapsible-header .header-icon{font-size:20px;margin-right:10px}.collapsible-header .header-title{flex:1;font-size:18px}.collapsible-header .toggle-icon{font-size:18px;margin-left:18px}.collapsible-content{padding:15px;background-color:#f8f9fa;color:#333;width:100%}.collapsible-content.show{display:block}.researchingCard{margin:5px auto}.card-header{border-bottom:0px;background:#eee;padding:8px 15px;display:flex!important;width:auto;border-radius:8px 8px 0 0}.icon{font-size:20px;line-height:5px}.rotate{transform:rotate(180deg)}.collapse{display:none}.uptList{background:rgba(245,222,179,.1411764706);border-radius:0 0 10px 10px;margin-bottom:20px!important}.list-group-item{font-size:15px;color:#0f0f0f;margin:1px 0;padding:0 18px}.sources-container{display:flex;gap:15px;align-items:flex-start}.source-card{position:relative;background-color:#f0f3f5;border-radius:10px;padding:15px;display:flex;flex-direction:column;justify-content:space-between;width:100%;cursor:pointer;transition:box-shadow .3s ease;box-sizing:border-box}.popup{position:absolute;top:100%;left:50%;transform:translate(-50%) translateY(-10px);background-color:#fff;padding:10px;border-radius:5px;white-space:normal;visibility:hidden;opacity:0;transition:opacity .3s ease,transform .3s ease;z-index:10;width:100%;box-shadow:0 4px 8px #0003}.popup h5{font-size:14px;font-weight:600;margin:5px 0 10px;line-height:1.2}.popup p{font-size:12px;margin:0;line-height:1.4}.popup h5:hover{color:#007bff;cursor:pointer}.popup .source-url{text-decoration:none;color:#000}.popup .source-url:hover{text-decoration:underline;color:#007bff;cursor:pointer}.source-card:hover .popup{visibility:visible;opacity:1;transform:translate(-50%) translateY(-15px)}.source-card:hover{box-shadow:0 4px 8px #0000001a;transform:scale(1.05)}.source-title{font-size:14px;font-weight:500;text-align:left;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;height:55px;line-height:1.5}.source-title img{width:20px;margin-left:10px}.source-url{font-size:12px;color:#6c757d;text-align:left;display:flex;align-items:center}.source-url img{width:16px;height:16px;margin-right:5px;border-radius:50%}.sourceDraweContainer .container{background-color:#fff;padding:20px}.sourceDraweContainer .sources-list{list-style:none;padding:0}.sourceDraweContainer .sources-list li{display:flex;align-items:flex-start;margin-bottom:15px}.sourceDraweContainer .sources-list input[type=checkbox]{margin-right:15px;margin-top:8px;flex-shrink:0}.sourceDraweContainer .source-content{flex:1;border:1px solid #ddd;border-radius:8px;padding:12px;background-color:#f5f2f2;box-shadow:0 2px 4px #0000001a;cursor:pointer}.sourceDraweContainer .source-content:hover{background:#ccc}.sourceDraweContainer .source-title{font-size:1rem;font-weight:500;display:block;margin-bottom:4px;height:auto!important}.sourceDraweContainer .source-description{font-size:.875rem;display:block}.sourceDraweContainer .image-container{display:flex;align-items:center;margin:10px 0}.sourceDraweContainer .image-container img{width:16px;height:16px;margin-right:5px;border-radius:50%;border:1px solid #ddd;object-fit:cover}.sourceDraweContainer .image-container span{font-size:13px;color:#555}.closeButtonEditor{position:absolute;right:10px;top:5px;padding:3px 0 0;height:32px;width:32px;border:0;border-radius:100%}.closeButtonSource{border-color:transparent!important;color:inherit;background:none!important;box-shadow:none!important;transition:color .2s ease-in-out;float:right;margin-top:20px;cursor:pointer}.closeButtonSource.closeplaygroundbutton{display:none!important}.graph-img{width:90%;background:rgba(254,254,254,.231372549);padding:15px;border-radius:15px}.chat-textarea{width:100%;padding:10px;border:none;resize:none;overflow-y:hidden;box-sizing:border-box;font-size:15px;line-height:1.5;background-color:#fff;height:30px;transition:all 1s}.chat-textarea:hover{height:60px}.chat-textarea:focus{height:60px}.chat-textarea:focus{outline:none}.fixed-btn{position:fixed;right:-22px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 12px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn:hover{background-color:#5b5b5b}.fixed-btn-close{position:fixed;right:549px;top:46%;transform:translateY(-50%) rotate(270deg);background-color:#000;color:#fff;border:none;padding:5px 16px;cursor:pointer;transform-origin:center;z-index:1000000;border-radius:8px 8px 0 0;font-size:16px;transition:all .5s}.fixed-btn-close:hover{background-color:#5b5b5b}.btn.rotate{transform:rotate(-15deg)}.btn.rotate:hover{transform:rotate(0)}.btn.cta-chat{display:flex;align-items:center;justify-content:center;width:40px!important;height:40px!important;max-width:40px!important;max-height:40px!important;aspect-ratio:1/1;background:#f3f3f3;border:none;border-radius:50%;padding:0;color:#787777;flex-shrink:0}.btn.cta-chat:hover{background:#d7d7d7;color:#666}.btn.cta-chat svg{vertical-align:middle}@keyframes voice-bar-wave{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.btn.cta-chat.voice-btn{overflow:hidden;min-width:40px;width:40px!important;max-width:40px!important;padding-left:11px;padding-right:11px;gap:8px;border-radius:9999px;justify-content:flex-start;flex-shrink:0;transition:max-width .35s ease,width .35s ease,background-color .25s ease,color .25s ease,padding .3s ease,box-shadow .25s ease}.btn.cta-chat.voice-btn .voice-btn-icon{flex-shrink:0;transition:color .25s ease}.btn.cta-chat.voice-btn .vbar{transform-box:fill-box;transform-origin:center}.btn.cta-chat.voice-btn .voice-btn-text{white-space:nowrap;opacity:0;max-width:0;overflow:hidden;font-weight:500;font-size:14px;transform:translate(-4px);transition:opacity .25s ease .1s,max-width .3s ease .05s,transform .3s ease .05s}.btn.cta-chat.voice-btn:hover{width:100px!important;max-width:100px!important;padding-left:14px;padding-right:16px;background:#0d9488!important;color:#fff!important;box-shadow:0 4px 10px #0d948840}.btn.cta-chat.voice-btn:hover .vbar{animation:voice-bar-wave .9s ease-in-out infinite}.btn.cta-chat.voice-btn:hover .vbar-1{animation-delay:0s}.btn.cta-chat.voice-btn:hover .vbar-2{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-3{animation-delay:.3s}.btn.cta-chat.voice-btn:hover .vbar-4{animation-delay:.15s}.btn.cta-chat.voice-btn:hover .vbar-5{animation-delay:0s}.btn.cta-chat.voice-btn:hover .voice-btn-text{opacity:1;max-width:4.5em;transform:translate(0)}.chat-footer-upt{padding:4px}.workflowbox{display:flex;align-items:center;cursor:pointer;border-radius:48px;padding:.5rem 1.5rem;margin-bottom:0;font-size:14px;color:#414141!important;white-space:nowrap;border:1px solid transparent;transition:all .5s}.workflowbox:hover{border:1px solid #ddd;background:#fff}.workflowbox svg{margin:0 10px}.edit-boxDrawer{border-left:1px solid #ddd;box-shadow:1px 1px 15px #ddddddc4!important}.edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}ng-deep .edit-boxDrawer mat-drawer-content{margin-left:0!important;margin-right:0!important}.SearchTitle{font-size:16px!important;text-transform:none}.exicution{margin:30px 0!important;background:#f9f9f9;padding:15px 20px}.new-conversationbutton2{position:absolute;right:88px;top:20px!important;z-index:1000;background:#f5f5f5;padding:6px;border-radius:10px;display:flex;justify-content:space-around;width:120px;align-items:center;font-size:14px;cursor:pointer;border:1px solid #e3e3e3;transition:all .5s}.new-conversationbutton2:hover{background:#eee}@media (max-width: 768px){.new-conversationbutton2{position:fixed!important;top:22px!important;padding:.5px!important;width:90px!important;align-items:center;font-size:11px!important}}.chat-close-button{position:absolute;right:20px;top:25px!important;z-index:1000;display:flex;justify-content:center;align-items:center;gap:6px;font-size:14px;cursor:pointer;transition:all .5s;color:#333}.chat-close-button .chat-close-button-icon{display:inline-flex;align-items:center;justify-content:center}.chat-close-button .chat-close-button-icon svg{display:block}.chat-close-button:hover{background:#eee}@media (max-width: 768px){.chat-close-button{position:fixed!important;top:18px!important;right:12px!important;padding:6px 8px!important;font-size:11px!important}}.NoteTxt{margin:0 auto;margin-bottom:10px!important}.NoteTxt .text{margin:0 5px}.form-container{width:100%}.progress-container{display:flex;align-items:center}.circular-loader{position:relative;width:50px;height:50px;border-radius:50%;border:4px solid rgba(0,0,0,.1);box-sizing:border-box}.loader-spinner{position:absolute;top:0;left:0;width:100%;height:100%;border:2px solid #2196f3;border-top-color:transparent;border-radius:50%;animation:rotate-loader 1s linear infinite;box-sizing:border-box}.loader-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:12px;font-weight:700;color:#333}.loader-label{margin-left:20px;font-size:16px;color:#333}.checkmark{display:flex;justify-content:center;align-items:center;width:100%;height:100%}.checkmark-circle{stroke:#4caf50;stroke-width:4;stroke-dasharray:166;stroke-dashoffset:166;animation:stroke .6s ease-in-out forwards}.checkmark-check{stroke:#4caf50;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:48;stroke-dashoffset:48;animation:stroke-check .4s .4s ease-in-out forwards}@keyframes stroke{to{stroke-dashoffset:0}}@keyframes stroke-check{to{stroke-dashoffset:0}}@keyframes rotate-loader{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes checkmark-animation{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}.circular-loader.completed .loader-spinner{animation:none;transform:rotate(360deg)}.icon-button{background-color:transparent;border:none;cursor:pointer;font-size:24px;color:#333}.icon-button:focus{outline:none}.icon-button:hover{color:#007bff}.modal{display:block;position:fixed;z-index:1000001;padding-top:0;left:0;top:0;width:100%;height:100%;background-color:#0006}.modal-content{background-color:#fff;margin:5% auto;padding:20px;border-radius:8px;width:82%;box-shadow:0 4px 8px #0000001a;height:600px;position:relative}.close{color:#aaa;float:right;font-size:28px;font-weight:700}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer}.SearchTitle.botUser{font-size:30px!important;text-transform:none!important}.SearchTitle.botUser h2,.SearchTitle.botUser p{font-size:1.7rem!important}.title_chat{display:flex;margin:0;padding:0}.title_chat h2{font-size:20px;margin:10px 0;display:flex;gap:10px;align-items:center}.title_chat h2 p{display:inline!important}.title_chat h2 span:before{content:\"\"!important}@media (max-width: 768px){.title_chat h2{flex-direction:column;align-items:start;font-size:16px}}.small-title{font-size:12px;margin:2px 0}.titleSection{margin:0}.titleSection h2{font-size:20px;margin:0;color:#000}.inputs-section{background-color:#f7f7f7;padding:10px 15px 0;margin:0 0 10px;border-radius:5px}.inputs-section h3{font-size:16px}.actions-section{background-color:#f9f9f9;padding:15px;margin-bottom:20px;border-radius:5px;height:500px;overflow-y:auto}.timeline{position:relative;padding-left:40px;margin-bottom:20px}.timeline:before{content:\"\";position:absolute;left:19px;height:100%;border-right:2px dashed #cecece}.timeline-item{position:relative;margin-bottom:20px}.timeline-item:before{content:\"\";position:absolute;left:-30px;top:0;width:20px;height:20px;background-color:#007bff;border-radius:50%;z-index:1}.timeline-item h4{margin:0;font-weight:700;font-size:16px;color:#000}.timeline-item pre{background-color:#fff;padding:10px;border:1px solid #ddd;border-radius:5px;white-space:pre-wrap}.timestamp-section{justify-content:space-between;font-style:normal;color:#666}.mic-btn{background-color:#ff4d4d;border:none;border-radius:50%;padding:10px;color:#fff;font-size:1.5em;cursor:pointer}.mic-btn:active{background-color:#f66}.actions-section h3{font-size:16px}.close-wrapper{width:100%;display:flex;justify-content:right;position:absolute;right:22px;top:0}.close_pop{cursor:pointer;display:flex;justify-content:center;align-items:center;color:#aaa;font-size:30px;font-weight:400}.chat-avatar{width:44px;height:44px;min-width:44px;min-height:44px;border-radius:50%;overflow:hidden;background:#fcfcfc;border:1px solid #dfdfdf;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chat-avatar-img{width:100%;height:100%;object-fit:cover}.chat-avatar-initials{font-size:1rem;font-weight:600;color:#555;text-transform:uppercase;-webkit-user-select:none;user-select:none}.chat-avatar-initials-assistant{color:#000}.chat-avatar-initials-user{color:#761c79}.user-Box{display:flex;align-items:center}.bards{position:absolute;right:0;top:20px}::ng-deep .code-container{position:relative;margin:20px 0}::ng-deep .copy-button{position:absolute;top:10px;right:10px;background-color:#007bff;color:#fff;border:none;padding:5px 10px;cursor:pointer;border-radius:4px}::ng-deep .copy-button:hover{background-color:#0056b3}::ng-deep .code_block.diff{background-color:#f8f8f8;border-left:4px solid #ccc;padding:10px;overflow:auto}::ng-deep .heading003{font-size:20px;font-weight:700;color:#000}::ng-deep .listing{list-style:decimal;margin:0 25px;padding:0}.line{display:inline-block;width:15px;height:15px;border-radius:15px;background-color:#e8e8e8}.load-2 .line:nth-last-child(1){animation:loadingB 1.5s 1s infinite;margin:5px 0}.load-2 .line:nth-last-child(2){animation:loadingB 1.5s .5s infinite;margin:5px 0}.load-2 .line:nth-last-child(3){animation:loadingB 1.5s 0s infinite;margin:5px 0}.load-1 .line:nth-last-child(1){animation:loadingA 1.5s 1.2s infinite;margin:5px 0}.load-1 .line:nth-last-child(2){animation:loadingA 1.5s .8s infinite;margin:5px 0}.load-1 .line:nth-last-child(3){animation:loadingA 1.5s .2s infinite;margin:5px 0}@keyframes loadingB{0%{width:65px}50%{width:235px}to{width:65px}}@keyframes loadingA{0%{width:45px}50%{width:205px}to{width:45px}}.chat-thinking{padding-left:20px!important}.chat-thinking .thinking-row{display:flex;align-items:center;gap:8px;margin-top:6px}.chat-thinking .thinking-dots{display:flex;align-items:center;gap:4px}.chat-thinking .thinking-dot{width:6px;height:6px;border-radius:50%;background:#06f;animation:thinking-bounce 1.4s ease-in-out infinite both}.chat-thinking .thinking-dot:nth-child(1){background:#9ca3af;animation-delay:0s}.chat-thinking .thinking-dot:nth-child(2){background:#06f;animation-delay:.2s}.chat-thinking .thinking-dot:nth-child(3){background:#17235b;animation-delay:.4s}.chat-thinking .thinking-text{font-size:14px;font-weight:400;color:#6b7280}@keyframes thinking-bounce{0%,80%,to{transform:scale(.8);opacity:.6}40%{transform:scale(1.1);opacity:1}}.loaderbox{position:relative;margin:10px 0;height:60px}.loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}.loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}.loader--dot:first-child{background-color:#618e93;animation-delay:.5s}.loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}.loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}.loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}.loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}.loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}.loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}.loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}@keyframes loader{15%{transform:translate(230px)}45%{transform:translate(0)}65%{transform:translate(230px)}95%{transform:translate(0)}}@keyframes loading-text{0%{content:\"Loading\"}25%{content:\"Loading.\"}50%{content:\"Loading..\"}75%{content:\"Loading...\"}}::ng-deep .loaderbox{position:relative;margin:10px 0;height:60px}::ng-deep .loader-pkg{height:20px;width:250px;position:absolute;top:0;bottom:0;left:0;margin:0}::ng-deep .loader--dot{animation-name:loader;animation-timing-function:ease-in-out;animation-duration:3s;animation-iteration-count:infinite;height:20px;width:20px;border-radius:100%;background-color:#1a6774;position:absolute}::ng-deep .loader--dot:first-child{background-color:#618e93;animation-delay:.5s}::ng-deep .loader--dot:nth-child(5){background-color:#3fb0c3;animation-delay:.4s}::ng-deep .loader--dot:nth-child(4){background-color:#40b8cd;animation-delay:.3s}::ng-deep .loader--dot:nth-child(3){background-color:#ec8828;animation-delay:.2s}::ng-deep .loader--dot:nth-child(2){background-color:#fdc25d;animation-delay:.1s}::ng-deep .loader--dot:nth-child(1){background-color:#f4e3be;animation-delay:0s}::ng-deep .loader--text{position:absolute;top:200%;left:0;width:4rem;margin:0}::ng-deep .loader--text:after{content:\"Loading\";font-weight:700;animation-name:loading-text;animation-duration:3s;animation-iteration-count:infinite}.agents-popwindowbox{width:100%;padding:10px;background:#fff}.agents-popwindowbox h3{font-size:15px;color:#000}.dropdown-menu-agents{background-color:#fff;border:1px solid #ededed;border-radius:5px;bottom:100%!important;box-shadow:0 2px 4px #0000001a;display:block;left:0;margin-bottom:10px;padding:0;position:absolute;top:auto;width:270px;z-index:1000}.dropdown-menu-agents .scrollerbox{display:flex;flex-direction:column;flex:fit-content;overflow-y:auto;height:215px}.dropdown-menu-agents label{cursor:pointer;display:flex;font-size:13px;justify-content:start;align-items:center;line-height:16px;background:#f9f9f9;padding:7px;margin:2px 0;border-radius:2px}.dropdown-menu-agents label:hover{background:#ebebeb}.dropdown-menu-agents label input{position:absolute;opacity:0}.dropdown-menu-agents .input-check{position:relative;display:inline-block;top:0;width:25px;height:23px;border:2px solid #ccc;border-radius:4px;margin-right:5px;transition:.5s}.dropdown-menu-agents label input:checked~.input-check{background:#06f;border-color:#06f;animation:animate .7s ease}@keyframes animate{0%{transform:scale(1)}40%{transform:scale(1.3,.7)}55%{transform:scale(1)}70%{transform:scale(1.2,.8)}80%{transform:scale(1)}90%{transform:scale(1.1,.9)}to{transform:scale(1)}}.dropdown-menu-agents .input-check:before{content:\"\";position:absolute;top:6px;left:4px;width:15px;height:6px;border-bottom:3px solid #fff;border-left:3px solid #fff;transform:scale(0) rotate(-45deg);transition:.5s}.dropdown-menu-agents label input:checked~.input-check:before{transform:scale(1) rotate(-45deg)}::ng-deep .h1,::ng-deep h1{font-size:1.165rem}::ng-deep .h2,::ng-deep h2{font-size:1.125rem}::ng-deep .h3,::ng-deep h3{font-size:1.125rem}::ng-deep b,::ng-deep strong{font-weight:600}@media (max-width: 768px){.note{width:90%;margin:0 auto;line-height:15px;padding:3px 0 10px}}.show-hover{display:none}.chat.bot:hover .show-hover{display:flex!important}\n"] }]
3643
3698
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.BotsService }, { type: i0.ChangeDetectorRef }, { type: i3.HttpClient }, { type: i4.DomSanitizer }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i5.ConversationService }, { type: i6.TranslationService }, { type: i7.VoiceAgentService }, { type: i8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i9.PlatformTokenRefreshService }]; }, propDecorators: { chatMain: [{
3644
3699
  type: ViewChild,
3645
3700
  args: ['chatMain']
@@ -3785,4 +3840,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
3785
3840
  }], openSupport: [{
3786
3841
  type: Output
3787
3842
  }] } });
3788
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUcvRCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLFFBQVEsRUFDUixLQUFLLEVBSUwsTUFBTSxFQUlOLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBYSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUNMLGVBQWUsRUFDZixnQkFBZ0IsR0FDakIsTUFBTSxtQ0FBbUMsQ0FBQztBQUkzQyxPQUFPLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx3Q0FBd0MsQ0FBQztBQUVwRSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxPQUFP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QUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUtHLFNBQVM7c0JBQWxCLE1BQU07Z0JBS0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdHJhbnNsYXRpb25zL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RHJhd2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUGxhdGZvcm1Ub2tlblJlZnJlc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGxhdGZvcm0tdG9rZW4tcmVmcmVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IGZvcm1hdE5vdywgZm9ybWF0VGltZVN0YW1wcyB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7XG4gIGRldl9lbnZpcm9ubWVudCxcbiAgcHJvZF9lbnZpcm9ubWVudCxcbn0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7IENvbnZlcnNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb252ZXJzYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgU3BlZWNoU0RLIGZyb20gJ21pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrJztcbmltcG9ydCB7IEJvdHNTZXJ2aWNlIH0gZnJvbSAnLi4vYm90LnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgbWFya2VkIGZyb20gJ21hcmtlZCc7XG5pbXBvcnQgeyBWb2ljZUFnZW50U2VydmljZSB9IGZyb20gJy4uL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vdm9pY2UtYWdlbnQvY29tcG9uZW50cy92b2ljZS1hZ2VudC1tb2RhbC92b2ljZS1hZ2VudC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgVk9JQ0VfTU9EQUxfQ09ORklHLFxuICBWT0lDRV9NT0RBTF9DTE9TRV9DQUxMQkFDSyxcbiAgVm9pY2VNb2RhbENvbmZpZyxcbn0gZnJvbSAnLi4vdm9pY2UtYWdlbnQvdm9pY2UtbW9kYWwtdG9rZW5zJztcblxuZXhwb3J0IGVudW0gZUNsYXNzaWZpY2F0aW9uVHlwZSB7XG4gIExpdmUgPSAnNjA0MGRjZTU3NjE1ZjA3NzBhZjE0MjU2JyxcbiAgT25EZW1hbmQgPSAnNjA0MGRjZTU3NjE1ZjA3NzBhZjE0MjU3JyxcbiAgQnJlYWtvdXQgPSAnNjA0MGRjZTU3NjE1ZjA3NzBhZjE0MjU4Jyxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGl2ZWdwdC1jaGF0LWRyYXdlci1wYWNrYWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENoYXREcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnY2hhdE1haW4nKSBwcml2YXRlIGNoYXRNYWluOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdteUlucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIG15SW5wdXQhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+OyAvLyBSZWZlcmVuY2UgdG8gdGhlIHRleHRhcmVhXG4gIEBWaWV3Q2hpbGRyZW4oJ2Nsb3NlcGxheWdyb3VuZGJ1dHRvbicpXG4gIGNsb3NlUGxheWdyb3VuZEJ1dHRvbnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnZHJhd2VyJykgZHJhd2VyITogTWF0RHJhd2VyO1xuICBAVmlld0NoaWxkKCdzb3VyY2VzRHJhd2VyJykgc291cmNlc0RyYXdlciE6IE1hdERyYXdlcjtcbiAgQFZpZXdDaGlsZCgnZWRpdG9yc0RyYXdlcicpIGVkaXRvcnNEcmF3ZXIhOiBNYXREcmF3ZXI7XG4gIHByaXZhdGUgYm9keU92ZXJmbG93Q2xhc3MgPSAnYm9keS1vdmVyZmxvdy1oaWRkZW4nO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgaXNDb2xsYXBzZWRUcnVlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNvcGlsb3ROYW1lOiBzdHJpbmcgPSAnSGl2ZVhHUFQnO1xuICBASW5wdXQoKSBmaXJzdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxhc3ROYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlLZXkhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJnQnViYmxlQWkhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJnQnViYmxlVXNlciE6IHN0cmluZztcbiAgQElucHV0KCkgYmdHcmFkaWVudCE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBib3ROYW1lITogc3RyaW5nO1xuICBASW5wdXQoKSBib3RTa2lsbHMhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdElkITogc3RyaW5nO1xuICBASW5wdXQoKSBvcmdJZCE6IHN0cmluZztcbiAgQElucHV0KCkgY2xvc2VCdXR0b25Db2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgY2xvc2VCdXR0b25iZ0NvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBjcmVkZW50aWFscyE6IFtdO1xuICBASW5wdXQoKSBkYXRlVGltZUNvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBkYXRlVGV4dENvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudElkITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudFVybCE6IHN0cmluZztcbiAgQElucHV0KCkgZXZlbnRUb2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgd29ya3NwYWNlVG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHMyN1Rva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdEljb24hOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc3BsYXlBdmF0YXJVcmwgPVxuICAgICdodHRwczovL3d3dy5qb3Rmb3JtLmNvbS91cGxvYWRzL21laG1ldGthcmFrYXNsaS9mb3JtX2ZpbGVzLzE1NjQ1OTM2Njc2NzZhOGU4NWYyMzc1OC44Njk0NTUzN19pY29uLnBuZyc7XG4gIC8qKiBVc2VyIHByb2ZpbGUgaW1hZ2UgVVJMLiBGYWxscyBiYWNrIHRvIGluaXRpYWxzIChnZXRVc2VySWRJbml0aWFscygpKSBpZiBub3Qgc2V0LiAqL1xuICBASW5wdXQoKSB1c2VyQXZhdGFyVXJsPzogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtRmllbGRCZ0NvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBmb3JtRmllbGRUZXh0Q29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZ1bGxWaWV3ITogYm9vbGVhbjtcbiAgQElucHV0KCkgZ3JhZGllbnRDb2xvcnMhOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZ3JlZXRpbmchOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1lc3NhZ2VUZXh0Q29sb3JBaSE6IHN0cmluZztcbiAgQElucHV0KCkgbWVzc2FnZVRleHRDb2xvclVzZXIhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHJ1bGVzITogc3RyaW5nO1xuICBASW5wdXQoKSBzZW5kQnV0dG9uQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbmRCdXR0b25UZXh0Q29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dDbG9zZSE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRodW1ic0Rvd25NZXNzYWdlcyE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSB0aHVtYnNVcE1lc3NhZ2UhOiBzdHJpbmc7XG4gIC8qKiBVc2VyJ3Mgc2VsZWN0ZWQgdGltZXpvbmUgKGUuZy4gJ0FtZXJpY2EvTmV3X1lvcmsnKTsgdXNlZCBmb3IgdGltZXN0YW1wcyBhbmQgc2Vzc2lvbiBjYXJkIHRpbWVzLiBXaGVuIG5vdCBzZXQsIHNlc3Npb24gZGF0YSBvciBsb2NhbCB0aW1lIGlzIHVzZWQuICovXG4gIEBJbnB1dCgpIHRpbWV6b25lPzogc3RyaW5nO1xuICBASW5wdXQoKSB1bmtub3duUmVzcG9uc2VzITogW107XG4gIEBJbnB1dCgpIHVzZU9wZW5BaSE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHVzZXJJZCE6IHN0cmluZztcbiAgQElucHV0KCkgaXNEZXYhOiBib29sZWFuO1xuICAvKiogV2hlbiB0cnVlLCBjaGF0IGF1dG8tc2Nyb2xscyB0byBib3R0b20gd2hlbiBuZXcgY29udGVudCBpcyBhZGRlZC4gRGVmYXVsdDogZmFsc2UgKG5vIGF1dG8gc2Nyb2xsKS4gKi9cbiAgQElucHV0KCkgYXV0b1Njcm9sbE9uTmV3TWVzc2FnZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKiogT3B0aW9uYWwgQVBJIGJhc2UgVVJMIChlLmcuIG5ncm9rIHR1bm5lbCkuIFdoZW4gc2V0LCBhbGwgY2hhdC92b2ljZSByZXF1ZXN0cyB1c2UgdGhpcyBpbnN0ZWFkIG9mIGRldi9wcm9kIGRlZmF1bHQuICovXG4gIEBJbnB1dCgpIGJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKiBDb25uZWN0aW9ucyBsaXN0IGZyb20gaG9zdCAoZS5nLiBmcm9tIHN0b3JlIHNlbGVjdENvbm5lY3Rpb25zTGlzdCkuIEVhY2ggaXRlbSBoYXMgdXNlcklkLiBXaGVuIHNldCwgdXNlZCBmb3IgQ29ubmVjdC9SZXF1ZXN0IFNlbnQvRGlzY29ubmVjdCBidXR0b24gc3RhdGUuICovXG4gIEBJbnB1dCgpIGNvbm5lY3Rpb25zTGlzdDogYW55W10gPSBbXTtcbiAgLyoqIFBlbmRpbmcgc2VudCByZXF1ZXN0IHVzZXIgSURzIGZyb20gaG9zdCAoZS5nLiBmcm9tIHN0b3JlIHNlbGVjdFBlbmRpbmdDb25uZWN0aW9uc1NlbnRMaXN0KS4gV2hlbiBzZXQsIHVzZWQgZm9yIFJlcXVlc3QgU2VudCBzdGF0ZS4gKi9cbiAgQElucHV0KCkgcGVuZGluZ1NlbnRSZXF1ZXN0VXNlcklkczogYW55W10gPSBbXTtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyBDb25uZWN0IC8gUmVxdWVzdCBTZW50IC8gRGlzY29ubmVjdCBidXR0b25zIG9uIGF0dGVuZGVlIGNhcmRzIChlLmcuIGZyb20gdXNlclNldHRpbmdzPy5pc0Nvbm5lY3Rpb25zRW5hYmxlZCkuICovXG4gIEBJbnB1dCgpIGlzQ29ubmVjdGlvbnNFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIFdoZW4gdHJ1ZSAoVU4vQ09QIGV2ZW50cyk6IHNlc3Npb24gY2FyZCBzaG93cyBcIlNlc3Npb24gdHlwZVwiIGxhYmVsIGFuZCBKb2luL1dhdGNoIGJ1dHRvbnMuIFdoZW4gZmFsc2U6IHNob3dzIFwiTWVldGluZyB0eXBlXCIgbGFiZWwgYW5kIHNpbmdsZSBQbGF5IGJ1dHRvbiAoc2FtZSBhcyB0ZW1wbGF0ZTIpLiAqL1xuICBASW5wdXQoKSBpc1VuRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBhZ2FpbkJ1dHRvbkNvbG9yITogc3RyaW5nW107XG4gIEBJbnB1dCgpIGFnYWluQnV0dG9uVGV4dENvbG9yITogc3RyaW5nW107XG4gIEBPdXRwdXQoKSBmZWVkYmFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBvbkNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBvcGVuUGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc2Vzc2lvbkFjdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBKb2luL1dhdGNoIGJ1dCBhY3Rpb24gaXMgbm90IHlldCBhdmFpbGFibGUgKGUuZy4gc2Vzc2lvbiBub3Qgc3RhcnRlZCkuIEhvc3QgY2FuIHNob3cgdG9hc3RlciB3aXRoIHRoZSBtZXNzYWdlLiAqL1xuICBAT3V0cHV0KCkgc2Vzc2lvbkFjdGlvbkJsb2NrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNsb3NlQm90ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjb25uZWN0V2l0aFVzZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB1c2VyIGNsaWNrcyBWaWV3IHByb2ZpbGUgb24gYSBzcGVha2VyIGNhcmQgKGdldF9ldmVudF9zcGVha2VycykuIEhvc3Qgc2hvdWxkIG9wZW4gc3BlYWtlciBkZXRhaWwgZHJhd2VyIHNhbWUgYXMgL2V2ZW50cy86aWQvc3BlYWtlcnMuICovXG4gIEBPdXRwdXQoKSB2aWV3U3BlYWtlclByb2ZpbGUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBzcGVha2VyOiBhbnk7XG4gICAgc3BlYWtlcnM6IGFueVtdO1xuICB9PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFZpZXcgQm9vdGggb24gYSBzcG9uc29yL2Jvb3RoIGNhcmQgKGdldF9ldmVudF9zcG9uc29ycywgZ2V0X2V2ZW50X2Jvb3RocykuIEhvc3Qgc2hvdWxkIG5hdmlnYXRlIHRvIGV2ZW50cy86ZXZlbnRVcmwvc3BvbnNvcnMvYm9vdGhzLzpib290aFVybC4gKi9cbiAgQE91dHB1dCgpIHZpZXdCb290aCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGJvb3RoSWQ/OiBzdHJpbmc7XG4gICAgYm9vdGhVcmw/OiBzdHJpbmc7XG4gICAgc3BvbnNvcj86IGFueTtcbiAgfT4oKTtcbiAgQE91dHB1dCgpIHNjaGVkdWxlTWVldGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcmVmcmVzaFRva2VuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKiBFbWl0dGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBgdXNlci90b2tlblJlZnJlc2hgIHNvIHRoZSBob3N0IGNhbiBkaXNwYXRjaCBMb2dpbiAvIGBzYXZlVG9rZW5BbmRMb2dpblVzZXJgLiAqL1xuICBAT3V0cHV0KCkgdG9rZW5zUmVmcmVzaGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvcGVuU3VwcG9ydCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGF1dG9nZW5LZXkgPSAnQXV0b2dlbl9lREpUdEVVLU5CMFJ0SXB6cTF3JztcbiAgYWRkVG9NeUFnZW5kYUFjdGlvbiA9ICdhZGRfdG9fbXlfYWdlbmRhJztcbiAgbXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24gPSAnbXlfdXBjb21pbmdfc2Vzc2lvbic7XG4gIGNvbm5lY3RPckZvbGxvd0FjdGlvbiA9ICdjb25uZWN0X29yX2ZvbGxvdyc7XG4gIGFpUmVzcG9uc2U6IHN0cmluZyA9ICcnO1xuICBjaGF0TG9nOiBhbnlbXSA9IFtdO1xuICBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGZlZWRiYWNrRG9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICBncmVldGluZ01zZzogc3RyaW5nID0gJyc7XG4gIGhhc0JhY2tkcm9wVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaW5wdXQ6IHN0cmluZyA9ICcnO1xuICBsaXN0ZW5lckFkZGVkID0gZmFsc2U7XG4gIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbW9kZTogc3RyaW5nID0gJ292ZXInO1xuICBxdWlja1Byb21wdHM6IGFueVtdID0gW107XG4gIHRodW1ic0Rvd25Nc2dJbmRleCA9IDA7XG4gIHVzZXJOYW1lOiBzdHJpbmcgPSAnJztcbiAgc2hvd1N0YXJ0QWdhaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNJT1NEZXZpY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0ZlZWRCYWNrSWNvbnNJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHRlbXBlcmF0dXJlOiBudW1iZXIgPSAxO1xuICAvKiogU3BlYWtlciBjYWNoZSBieSBzdGFmZiBpZCAoZmlsbGVkIHZpYSBnZXQtYnktc3RhZmYtaWRzKS4gKi9cbiAgc3BlYWtlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgLyoqIFByZXZlbnQgZHVwbGljYXRlIHNwZWFrZXIgZmV0Y2hlcyBhY3Jvc3MgbWVzc2FnZXMuICovXG4gIHByaXZhdGUgcmVxdWVzdGVkU3BlYWtlcklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBlbnZpcm9ubWVudDoge1xuICAgIFVTRVJTX0FQSTtcbiAgICBCQVNFX1VSTDtcbiAgICBBR0VOVFNfQVBJO1xuICB9O1xuICBwZW5kaW5nUmVxdWVzdHM6IGFueTtcbiAgbXlDb25uZWN0aW9uczogYW55O1xuICBjb252ZXJzYXRpb25LZXk6IHN0cmluZztcbiAgY29uU2Vzc2lvbktleTogc3RyaW5nID0gJyc7XG4gIGlzRmV0Y2hEYXRhRm9yOiBib29sZWFuO1xuICBpczQwMTogYm9vbGVhbjtcbiAgbXNnOiBhbnk7XG4gIGNoYXQ6IGFueTtcbiAgaXNXb3JrZmxvd09wZW46IGJvb2xlYW47XG4gIG9yZ1dvcmtmbG93czogYW55O1xuICBvcGVuV29ya2Zsb3dJbnB1dDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRXb3JrZmxvdzogYW55O1xuICB3b3JrZmxvd0Zvcm06IGFueTtcbiAgY3VycmVudFdvcmtmbG93QWN0aW9uUHJvZ3Jlc3M6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRXb3JrZmxvd0FjdGlvbjogc3RyaW5nID0gJyc7XG4gIGV4ZWN1dGluZ1dvcmtmbG93OiBib29sZWFuO1xuICB3b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM6IGFueTtcbiAgc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlsczogYW55O1xuICBjdXJyZW50V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzOiBhbnk7XG5cbiAgc3BlZWNoQ29uZmlnOiBTcGVlY2hTREsuU3BlZWNoQ29uZmlnO1xuICByZWNvZ25pemVyOiBTcGVlY2hTREsuU3BlZWNoUmVjb2duaXplcjtcbiAgcmVjb2duaXplZFRleHQ6IHN0cmluZyA9ICcnO1xuICBhdXRob3JpemF0aW9uVG9rZW46IHN0cmluZyA9ICcnO1xuICByZWdpb246IHN0cmluZyA9ICd3ZXN0ZXVyb3BlJzsgLy8gU2V0IHlvdXIgQXp1cmUgcmVnaW9uIGhlcmVcbiAgaXNSZWNvcmRpbmc6IGJvb2xlYW47XG4gIGlzVm9pY2VNb2RhbE9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB2b2ljZU1vZGFsT3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZvaWNlVHJhbnNjcmlwdFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBib3RTZXJ2aWNlOiBCb3RzU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGNvbnZlcnNhdGlvblNlcnZpY2U6IENvbnZlcnNhdGlvblNlcnZpY2UsIC8vIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHZvaWNlQWdlbnRTZXJ2aWNlOiBWb2ljZUFnZW50U2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgcGxhdGZvcm1Ub2tlblJlZnJlc2g6IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5jaGF0TWFpbiA9IG5ldyBFbGVtZW50UmVmKG51bGwpO1xuXG4gICAgLy8gaWYgKHRoaXMucGxhdGZvcm0uSU9TKSB7XG4gICAgLy8gICB0aGlzLmlzSU9TRGV2aWNlID0gdHJ1ZTtcbiAgICAvLyB9XG4gIH1cbiAgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZ2V0VHJhbnNsYXRpb24oa2V5KTtcbiAgfVxuXG4gIC8qKiBUaW1lIHNob3duIG5leHQgdG8gXCJBc3Npc3RhbnRcIiB3aGVuIGluIHRoaW5raW5nL2xvYWRpbmcgc3RhdGUuICovXG4gIGdldExvYWRpbmdUaW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKTtcbiAgfVxuXG4gIC8qKiBVc2VyIGluaXRpYWxzIGZvciBhdmF0YXIgZmFsbGJhY2sgKGUuZy4gXCJKRFwiIGZyb20gZmlyc3ROYW1lICsgbGFzdE5hbWUpLiAqL1xuICBnZXRVc2VySWRJbml0aWFscygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0ID0gKHRoaXMuZmlyc3ROYW1lIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGFzdCA9ICh0aGlzLmxhc3ROYW1lIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKGZpcnN0ICYmIGxhc3QpIHJldHVybiAoZmlyc3RbMF0gKyBsYXN0WzBdKS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChmaXJzdCkgcmV0dXJuIGZpcnN0LnNsaWNlKDAsIDIpLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGxhc3QpIHJldHVybiBsYXN0LnNsaWNlKDAsIDIpLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuICdVJztcbiAgfVxuXG4gIC8qKiBBdHRlbmRlZSBpbml0aWFscyBmb3IgY2FyZCB3aGVuIG5vIHBob3RvIChlLmcuIFwiVmlqYXkgUGFsaXdhbFwiIC0+IFwiVlBcIiwgXCJKaW1cIiAtPiBcIkpcIikuICovXG4gIGdldEF0dGVuZGVlSW5pdGlhbHMobmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykgcmV0dXJuICc/JztcbiAgICBjb25zdCBwYXJ0cyA9IG5hbWUudHJpbSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMilcbiAgICAgIHJldHVybiAocGFydHNbMF1bMF0gKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVswXSkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAxKSByZXR1cm4gcGFydHNbMF0uc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gJz8nO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBldmVudElkIGNoYW5nZXMgdG8gdXBkYXRlIHRyYW5zbGF0aW9uIHNlcnZpY2VcbiAgICBpZiAoY2hhbmdlcy5ldmVudElkICYmIGNoYW5nZXMuZXZlbnRJZC5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldEV2ZW50SWQoY2hhbmdlcy5ldmVudElkLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuczI3VG9rZW4pIHtcbiAgICAgIGlmIChjaGFuZ2VzLnMyN1Rva2VuLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLnMyN1Rva2VuLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5zMjdUb2tlbiA9IGNoYW5nZXMuczI3VG9rZW4uY3VycmVudFZhbHVlO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdpc0ZldGNoRGF0YUZvcjogJywgdGhpcy5pc0ZldGNoRGF0YUZvcik7XG4gICAgICAgIGNvbnNvbGUubG9nKCdtc2c6ICcsIHRoaXMubXNnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2NoYXQ6ICcsIHRoaXMuY2hhdCk7XG4gICAgICAgIGlmICh0aGlzLmlzNDAxKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNGZXRjaERhdGFGb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhRm9yKHRoaXMubXNnLCB0aGlzLmNoYXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoRGF0YSh0aGlzLm1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuYmFzZVVybCAmJiB0aGlzLmVudmlyb25tZW50KSB7XG4gICAgICB0aGlzLmFwcGx5QmFzZVVybE92ZXJyaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZW4gYmFzZVVybCBpbnB1dCBpcyBzZXQsIG92ZXJyaWRlIGVudmlyb25tZW50LkJBU0VfVVJMIHNvIGFsbCBjaGF0L3ZvaWNlIHNlcnZpY2VzIHVzZSBpdCAoc3VwcG9ydHMgbmdyb2sgZXRjLikuICovXG4gIHByaXZhdGUgYXBwbHlCYXNlVXJsT3ZlcnJpZGUoKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdEVudiA9IHRoaXMuaXNEZXYgPyBkZXZfZW52aXJvbm1lbnQgOiBwcm9kX2Vudmlyb25tZW50O1xuICAgIGlmICh0aGlzLmJhc2VVcmwgJiYgdHlwZW9mIHRoaXMuYmFzZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybC50cmltKCkucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB7IC4uLmRlZmF1bHRFbnYsIEJBU0VfVVJMOiB1cmwgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVudmlyb25tZW50ID0gZGVmYXVsdEVudjtcbiAgfVxuXG4gIGRvbWFpbkF1dGhvcml0eVZhbHVlOiBhbnkgPSAncHJvZC1saXRlJztcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIGV2ZW50SWQgaW4gdHJhbnNsYXRpb24gc2VydmljZSB0byBnZXQgdGhlIGNvcnJlY3QgbGFuZ3VhZ2UgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBpZiAodGhpcy5ldmVudElkKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRFdmVudElkKHRoaXMuZXZlbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBseUJhc2VVcmxPdmVycmlkZSgpO1xuXG4gICAgY29uc3QgZG9tYWluID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBoZWFkZXIgdmFsdWUgYmFzZWQgb24gdGhlIGRvbWFpblxuXG4gICAgaWYgKGRvbWFpbi5pbmNsdWRlcygncHJlLWFwcC5zb2NpYWwyNy5jb20nKSkge1xuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA9ICdwcmUtcHJvZC1saXRlJztcbiAgICB9IGVsc2UgaWYgKGRvbWFpbi5pbmNsdWRlcygnYXBwLnNvY2lhbDI3LmNvbScpKSB7XG4gICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlID0gJ3Byb2QtbGl0ZSc7XG4gICAgfSBlbHNlIGlmIChkb21haW4uaW5jbHVkZXMoJ2hpdmVncHQuaW8nKSkge1xuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA9ICdoaXZlZ3B0JztcbiAgICB9XG5cbiAgICAvLyB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgpO1xuICAgIC8vIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuY2hhbmdlVGVtcGVyYXR1cmUodGhpcy50ZW1wZXJhdHVyZSk7XG4gICAgdGhpcy5mZXRjaEJvdENvbmZpZygpLnN1YnNjcmliZShcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgdGhpcy5mZXRjaENoYXRIaXN0b3J5KCkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm1hcENoYXRIaXN0b3J5KHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTonLCBlcnIpO1xuICAgICAgfSxcbiAgICApO1xuICAgIC8vIHRoaXMuZmV0Y2hBZ2VudHMoKTtcbiAgICAvLyB0aGlzLmZldGNoRWRpdG9yQ29udGVudCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuYm90U2VydmljZVxuICAgICAgLmZldGNoU3BlZWNoQXV0aG9yaXphdGlvblRva2VuKFxuICAgICAgICB0aGlzLmJvdElkLFxuICAgICAgICB0aGlzLmFwaUtleSxcbiAgICAgICAgdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHRva2VuKSA9PiB7XG4gICAgICAgIHRoaXMuYXV0aG9yaXphdGlvblRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNwZWVjaFJlY29nbml6ZXIodG9rZW4pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogTmF0aXZlIFdlYlNvY2tldCB1c2VkIGJ5IGAvYXNrLW5ld2AgY2hhdCBmbG93LiAqL1xuICBwcml2YXRlIGFza1dlYlNvY2tldDogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXNrV2ViU29ja2V0Q29ubmVjdGlvbktleSA9ICcnO1xuICBwcml2YXRlIGFjdGl2ZUFza01lc3NhZ2VJZCA9ICcnO1xuXG4gIC8qKiBJbml0aWFsIG51bWJlciBvZiBzZXNzaW9uL2F0dGVuZGVlIGNhcmRzIHNob3duIGJlZm9yZSBcIlNob3cgWCBtb3JlXCIuICovXG4gIHJlYWRvbmx5IFNFU1NJT05fQ0FSRFNfSU5JVElBTCA9IDY7XG4gIHJlYWRvbmx5IEFUVEVOREVFX0NBUkRTX0lOSVRJQUwgPSA5O1xuICByZWFkb25seSBTUEVBS0VSX0NBUkRTX0lOSVRJQUwgPSA5O1xuICByZWFkb25seSBTUE9OU09SX0NBUkRTX0lOSVRJQUwgPSA5O1xuICByZWFkb25seSBCT09USF9SRVBfQ0FSRFNfSU5JVElBTCA9IDk7XG4gIC8qKiBNZXNzYWdlIGlkIC0+IHRydWUgd2hlbiB1c2VyIGV4cGFuZGVkIFwiU2hvdyBtb3JlXCIgZm9yIHNlc3Npb25zL2F0dGVuZGVlcy4gKi9cbiAgZXhwYW5kZWRTZXNzaW9uQ2FyZElkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgZXhwYW5kZWRBdHRlbmRlZUNhcmRJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIGV4cGFuZGVkU3BlYWtlckNhcmRJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIGV4cGFuZGVkU3BvbnNvckNhcmRJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIGV4cGFuZGVkQm9vdGhSZXBDYXJkSWRzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAvKioga2V5OiBgJHttZXNzYWdlSWR9OiR7YXR0ZW5kZWVJZH1gIC0+IHRydWUgd2hlbiBkZXNjcmlwdGlvbiBleHBhbmRlZCAqL1xuICBleHBhbmRlZEF0dGVuZGVlRGVzY3JpcHRpb25JZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIC8qKiBrZXk6IGAke21lc3NhZ2VJZH06JHthdHRlbmRlZUlkfWAgLT4gdHJ1ZSB3aGVuIHZpZGVvIGlzIHBsYXlpbmcgKi9cbiAgYXR0ZW5kZWVWaWRlb1BsYXlpbmdJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIC8qKiBrZXk6IGAke21lc3NhZ2VJZH06JHthdHRlbmRlZUlkfWAgLT4gdHJ1ZSB3aGVuIHZpZGVvIGlzIG11dGVkIChkZWZhdWx0IHRydWUpICovXG4gIGF0dGVuZGVlVmlkZW9NdXRlZElkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuICAvKiogU3RyaXAgSFRNTCB0YWdzIHRvIHBsYWluIHRleHQgKGUuZy4gZm9yIHNwZWFrZXIvYXR0ZW5kZWUgZGVzY3JpcHRpb24gZnJvbSBBUEkpLiAqL1xuICBzdHJpcEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwgfHwgdHlwZW9mIGh0bWwgIT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgY29uc3QgdGV4dCA9IGRvYy5ib2R5Py50ZXh0Q29udGVudCA/PyAnJztcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuICB9XG5cbiAgZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihhdHRlbmRlZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCByYXcgPVxuICAgICAgYXR0ZW5kZWU/LmRlc2NyaXB0aW9uID8/IGF0dGVuZGVlPy5pbnRlcmVzdHMgPz8gYXR0ZW5kZWU/LmpvYlRpdGxlID8/ICcnO1xuICAgIGNvbnN0IHN0ciA9IHR5cGVvZiByYXcgPT09ICdzdHJpbmcnID8gcmF3LnRyaW0oKSA6IFN0cmluZyhyYXcgPz8gJycpLnRyaW0oKTtcbiAgICAvLyBJZiBpdCBsb29rcyBsaWtlIEhUTUwsIHN0cmlwIHRhZ3Mgc28gY2FyZCBzaG93cyBwbGFpbiB0ZXh0XG4gICAgaWYgKHN0ciAmJiAvPFthLXpdW1xcc1xcU10qPi9pLnRlc3Qoc3RyKSkgcmV0dXJuIHRoaXMuc3RyaXBIdG1sKHN0cik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHNob3VsZFNob3dBdHRlbmRlZVJlYWRNb3JlKGF0dGVuZGVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBoZXVyaXN0aWM6IG9ubHkgc2hvdyB0b2dnbGUgZm9yIHJlYXNvbmFibHkgbG9uZyB0ZXh0XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihhdHRlbmRlZSkubGVuZ3RoID4gOTA7XG4gIH1cblxuICBwcml2YXRlIGdldEF0dGVuZGVlRGVzY0tleShjaGF0OiBhbnksIGF0dGVuZGVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBtc2dJZCA9IGNoYXQ/Ll9pZDtcbiAgICBjb25zdCBhdHRlbmRlZUlkID0gYXR0ZW5kZWU/LmlkID8/IGF0dGVuZGVlPy5faWQgPz8gYXR0ZW5kZWU/LnVzZXJJZDtcbiAgICBpZiAoIW1zZ0lkIHx8ICFhdHRlbmRlZUlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYCR7bXNnSWR9OiR7YXR0ZW5kZWVJZH1gO1xuICB9XG5cbiAgaXNBdHRlbmRlZURlc2NyaXB0aW9uRXhwYW5kZWQoY2hhdDogYW55LCBhdHRlbmRlZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBdHRlbmRlZURlc2NLZXkoY2hhdCwgYXR0ZW5kZWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZEF0dGVuZGVlRGVzY3JpcHRpb25JZHNba2V5XTtcbiAgfVxuXG4gIHRvZ2dsZUF0dGVuZGVlRGVzY3JpcHRpb24oY2hhdDogYW55LCBhdHRlbmRlZTogYW55LCBldj86IEV2ZW50KTogdm9pZCB7XG4gICAgZXY/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBdHRlbmRlZURlc2NLZXkoY2hhdCwgYXR0ZW5kZWUpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9ICF0aGlzLmV4cGFuZGVkQXR0ZW5kZWVEZXNjcmlwdGlvbklkc1trZXldO1xuICAgIHRoaXMuZXhwYW5kZWRBdHRlbmRlZURlc2NyaXB0aW9uSWRzID0ge1xuICAgICAgLi4udGhpcy5leHBhbmRlZEF0dGVuZGVlRGVzY3JpcHRpb25JZHMsXG4gICAgICBba2V5XTogbmV4dCxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0QXR0ZW5kZWVWaWRlb1VybChhdHRlbmRlZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPSBhdHRlbmRlZT8udXNlclZpZGVvc01vZGVsPy51cmw7XG4gICAgcmV0dXJuIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnID8gdXJsLnRyaW0oKSA6ICcnO1xuICB9XG5cbiAgZ2V0QXR0ZW5kZWVWaWRlb1Bvc3RlcihhdHRlbmRlZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3N0ZXIgPSBhdHRlbmRlZT8udXNlclZpZGVvc01vZGVsPy50aHVtYm5haWw7XG4gICAgcmV0dXJuIHR5cGVvZiBwb3N0ZXIgPT09ICdzdHJpbmcnID8gcG9zdGVyLnRyaW0oKSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHRlbmRlZU1lZGlhS2V5KGNoYXQ6IGFueSwgYXR0ZW5kZWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IG1zZ0lkID0gY2hhdD8uX2lkO1xuICAgIGNvbnN0IGF0dGVuZGVlSWQgPSBhdHRlbmRlZT8uaWQgPz8gYXR0ZW5kZWU/Ll9pZCA/PyBhdHRlbmRlZT8udXNlcklkO1xuICAgIGlmICghbXNnSWQgfHwgIWF0dGVuZGVlSWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBgJHttc2dJZH06JHthdHRlbmRlZUlkfWA7XG4gIH1cblxuICBpc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0OiBhbnksIGF0dGVuZGVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEF0dGVuZGVlTWVkaWFLZXkoY2hhdCwgYXR0ZW5kZWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBkZWZhdWx0IHRydWUgKG11dGVkKSB1bmxlc3MgZXhwbGljaXRseSBzZXQgdG8gZmFsc2VcbiAgICByZXR1cm4gdGhpcy5hdHRlbmRlZVZpZGVvTXV0ZWRJZHNba2V5XSAhPT0gZmFsc2U7XG4gIH1cblxuICBpc0F0dGVuZGVlVmlkZW9QbGF5aW5nKGNoYXQ6IGFueSwgYXR0ZW5kZWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXR0ZW5kZWVNZWRpYUtleShjaGF0LCBhdHRlbmRlZSk7XG4gICAgaWYgKCFrZXkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISF0aGlzLmF0dGVuZGVlVmlkZW9QbGF5aW5nSWRzW2tleV07XG4gIH1cblxuICB0b2dnbGVBdHRlbmRlZVZpZGVvTXV0ZShcbiAgICBjaGF0OiBhbnksXG4gICAgYXR0ZW5kZWU6IGFueSxcbiAgICB2aWRlb0VsPzogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwsXG4gICAgZXY/OiBFdmVudCxcbiAgKTogdm9pZCB7XG4gICAgZXY/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBdHRlbmRlZU1lZGlhS2V5KGNoYXQsIGF0dGVuZGVlKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5pc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0LCBhdHRlbmRlZSk7XG4gICAgdGhpcy5hdHRlbmRlZVZpZGVvTXV0ZWRJZHMgPSB7IC4uLnRoaXMuYXR0ZW5kZWVWaWRlb011dGVkSWRzLCBba2V5XTogbmV4dCB9O1xuICAgIGlmICh2aWRlb0VsKSB7XG4gICAgICB2aWRlb0VsLm11dGVkID0gbmV4dDtcbiAgICAgIC8vIFNvbWUgYnJvd3NlcnMgcmVxdWlyZSB2b2x1bWUgdG8gYmUgPjAgd2hlbiB1bm11dGluZ1xuICAgICAgaWYgKCFuZXh0ICYmICh2aWRlb0VsLnZvbHVtZSA9PSBudWxsIHx8IHZpZGVvRWwudm9sdW1lID09PSAwKSkge1xuICAgICAgICB2aWRlb0VsLnZvbHVtZSA9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlQXR0ZW5kZWVWaWRlb1BsYXkoXG4gICAgY2hhdDogYW55LFxuICAgIGF0dGVuZGVlOiBhbnksXG4gICAgdmlkZW9FbD86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsLFxuICAgIGV2PzogRXZlbnQsXG4gICk6IHZvaWQge1xuICAgIGV2Py5zdG9wUHJvcGFnYXRpb24/LigpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXR0ZW5kZWVNZWRpYUtleShjaGF0LCBhdHRlbmRlZSk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gIXRoaXMuaXNBdHRlbmRlZVZpZGVvUGxheWluZyhjaGF0LCBhdHRlbmRlZSk7XG4gICAgdGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkcyA9IHtcbiAgICAgIC4uLnRoaXMuYXR0ZW5kZWVWaWRlb1BsYXlpbmdJZHMsXG4gICAgICBba2V5XTogbmV4dCxcbiAgICB9O1xuICAgIGlmICh2aWRlb0VsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgIGNvbnN0IHAgPSB2aWRlb0VsLnBsYXkoKTtcbiAgICAgICAgICBpZiAocCAmJiB0eXBlb2YgKHAgYXMgYW55KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHAgYXMgYW55KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIElmIHBsYXkgZmFpbHMsIHJlZmxlY3QgcGF1c2VkIHN0YXRlXG4gICAgICAgICAgICAgIHRoaXMuYXR0ZW5kZWVWaWRlb1BsYXlpbmdJZHMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkcyxcbiAgICAgICAgICAgICAgICBba2V5XTogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZGVvRWwucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQXR0ZW5kZWVWaWRlb1BsYXlTdGF0ZShjaGF0OiBhbnksIGF0dGVuZGVlOiBhbnksIGlzUGxheWluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXR0ZW5kZWVNZWRpYUtleShjaGF0LCBhdHRlbmRlZSk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBpZiAodGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkc1trZXldID09PSBpc1BsYXlpbmcpIHJldHVybjtcbiAgICB0aGlzLmF0dGVuZGVlVmlkZW9QbGF5aW5nSWRzID0ge1xuICAgICAgLi4udGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkcyxcbiAgICAgIFtrZXldOiBpc1BsYXlpbmcsXG4gICAgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgc2Vzc2lvbiBkYXRlL3RpbWUgZm9yIGRpc3BsYXkuXG4gICAqIEBwYXJhbSBkYXRlVGltZVJhbmdlIFNlc3Npb24gc3RhcnQvZW5kIChvYmplY3Qgd2l0aCBzdGFydC9lbmQgb3Igc3RyaW5nIHdpdGggXCJTdGFydDogLi4uIEVuZDogLi4uXCIpXG4gICAqIEBwYXJhbSBkaXNwbGF5VGltZVpvbmUgT3B0aW9uYWwgdXNlci1zZWxlY3RlZCB0aW1lem9uZSAoZS5nLiAnQW1lcmljYS9OZXdfWW9yaycpOyB3aGVuIHNldCwgdGltZXMgYXJlIHNob3duIGluIHRoaXMgem9uZS5cbiAgICovXG4gIGZvcm1hdFNlc3Npb25XaGVuKFxuICAgIGRhdGVUaW1lUmFuZ2U6IHN0cmluZyB8IHsgc3RhcnQ/OiBzdHJpbmc7IGVuZD86IHN0cmluZyB9IHwgbnVsbCxcbiAgICBkaXNwbGF5VGltZVpvbmU/OiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlT3B0cyA9IGRpc3BsYXlUaW1lWm9uZSA/IHsgdGltZVpvbmU6IGRpc3BsYXlUaW1lWm9uZSB9IDoge307XG4gICAgaWYgKCFkYXRlVGltZVJhbmdlKSByZXR1cm4gJyc7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGVUaW1lUmFuZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICBkYXRlVGltZVJhbmdlPy5zdGFydCAmJlxuICAgICAgZGF0ZVRpbWVSYW5nZT8uZW5kXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGFydER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5lbmQpO1xuICAgICAgICBjb25zdCBkYXRlRm9ybWF0dGVkID0gc3RhcnREdC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gc3RhcnREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICAgIC4uLmxvY2FsZU9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gZW5kRHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGAke2RhdGVGb3JtYXR0ZWR9IHwgJHtzdGFydFRpbWV9IC0gJHtlbmRUaW1lfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGVUaW1lUmFuZ2UgIT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gICAgY29uc3Qgc3RhcnRNYXRjaCA9IGRhdGVUaW1lUmFuZ2UubWF0Y2goXG4gICAgICAvU3RhcnQ6XFxzKihcXGR7NH0tXFxkezJ9LVxcZHsyfVxccytcXGR7Mn06XFxkezJ9OlxcZHsyfSkvLFxuICAgICk7XG4gICAgY29uc3QgZW5kTWF0Y2ggPSBkYXRlVGltZVJhbmdlLm1hdGNoKFxuICAgICAgL0VuZDpcXHMqKFxcZHs0fS1cXGR7Mn0tXFxkezJ9XFxzK1xcZHsyfTpcXGR7Mn06XFxkezJ9KS8sXG4gICAgKTtcbiAgICBpZiAoIXN0YXJ0TWF0Y2ggfHwgIWVuZE1hdGNoKSByZXR1cm4gZGF0ZVRpbWVSYW5nZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTdHIgPSBzdGFydE1hdGNoWzFdO1xuICAgICAgY29uc3QgZW5kU3RyID0gZW5kTWF0Y2hbMV07XG4gICAgICBjb25zdCBzdGFydER0ID0gbmV3IERhdGUoc3RhcnRTdHIucmVwbGFjZSgnICcsICdUJykgKyAnWicpO1xuICAgICAgY29uc3QgZW5kRHQgPSBuZXcgRGF0ZShlbmRTdHIucmVwbGFjZSgnICcsICdUJykgKyAnWicpO1xuICAgICAgY29uc3QgZGF0ZUZvcm1hdHRlZCA9IHN0YXJ0RHQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIC4uLmxvY2FsZU9wdHMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZVNob3J0ID0gc3RhcnREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmRUaW1lU2hvcnQgPSBlbmREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYCR7ZGF0ZUZvcm1hdHRlZH0gfCAke3N0YXJ0VGltZVNob3J0fSAtICR7ZW5kVGltZVNob3J0fWA7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGF0ZVRpbWVSYW5nZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGUgYmFkZ2UgKGRheSArIG1vbnRoKSBmb3Igc2Vzc2lvbiBjYXJkIGZyb20gZGF0ZVRpbWVSYW5nZS5cbiAgICogSGFuZGxlcyBkYXRlVGltZVJhbmdlIGFzIHN0cmluZyAoXCJTdGFydDogMjAyNi0wMi0yMCAwMTowNTowMCwgRW5kOiAuLi5cIikgb3Igb2JqZWN0IHsgc3RhcnQsIGVuZCB9LlxuICAgKiBVc2VzIGRpc3BsYXlUaW1lWm9uZSBvbmx5IHdoZW4gaXQgaXMgYSB2YWxpZCBJQU5BIGlkZW50aWZpZXI7IG90aGVyd2lzZSBmb3JtYXRzIGluIGxvY2FsIHRpbWUuXG4gICAqL1xuICBnZXRTZXNzaW9uRGF0ZUJhZGdlKFxuICAgIGRhdGVUaW1lUmFuZ2U6IHN0cmluZyB8IHsgc3RhcnQ/OiBzdHJpbmc7IGVuZD86IHN0cmluZyB9IHwgbnVsbCxcbiAgICBkaXNwbGF5VGltZVpvbmU/OiBzdHJpbmcsXG4gICk6IHsgZGF5OiBzdHJpbmc7IG1vbnRoOiBzdHJpbmcgfSB7XG4gICAgaWYgKCFkYXRlVGltZVJhbmdlKSByZXR1cm4geyBkYXk6ICcnLCBtb250aDogJycgfTtcbiAgICB0cnkge1xuICAgICAgbGV0IHN0YXJ0RHQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgZGF0ZVRpbWVSYW5nZSA9PT0gJ29iamVjdCcgJiYgZGF0ZVRpbWVSYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgc3RhcnREdCA9IG5ldyBEYXRlKGRhdGVUaW1lUmFuZ2Uuc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZVRpbWVSYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXRjaCA9IGRhdGVUaW1lUmFuZ2UubWF0Y2goXG4gICAgICAgICAgL1N0YXJ0OlxccyooXFxkezR9LVxcZHsyfS1cXGR7Mn1cXHMrXFxkezJ9OlxcZHsyfTpcXGR7Mn0pLyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0YXJ0TWF0Y2gpXG4gICAgICAgICAgc3RhcnREdCA9IG5ldyBEYXRlKHN0YXJ0TWF0Y2hbMV0ucmVwbGFjZSgnICcsICdUJykgKyAnWicpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdGFydER0IHx8IGlzTmFOKHN0YXJ0RHQuZ2V0VGltZSgpKSkgcmV0dXJuIHsgZGF5OiAnJywgbW9udGg6ICcnIH07XG4gICAgICBjb25zdCBsb2NhbGVPcHRzID0gZGlzcGxheVRpbWVab25lID8geyB0aW1lWm9uZTogZGlzcGxheVRpbWVab25lIH0gOiB7fTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRheSA9IHN0YXJ0RHQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbW9udGggPSBzdGFydER0LnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgLi4ubG9jYWxlT3B0cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGRheSwgbW9udGggfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkaXNwbGF5VGltZVpvbmUgbWF5IGJlIG5vbi1JQU5BIChlLmcuIFwiKFVUQy0wMzowMCkgQnJhc2lsaWFcIik7IGZvcm1hdCB3aXRob3V0IHRpbWVab25lXG4gICAgICAgIGNvbnN0IGRheSA9IHN0YXJ0RHQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHsgZGF5OiAnbnVtZXJpYycgfSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gc3RhcnREdC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JyB9KTtcbiAgICAgICAgcmV0dXJuIHsgZGF5LCBtb250aCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgZGF5OiAnJywgbW9udGg6ICcnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aW1lIHJhbmdlIG9ubHkgKGUuZy4gXCI5OjAwIEFNIC0gMTA6MzAgQU1cIikgZm9yIHNlc3Npb24gY2FyZC5cbiAgICogRmFsbHMgYmFjayB0byBmb3JtYXR0aW5nIHdpdGhvdXQgdGltZVpvbmUgd2hlbiBkaXNwbGF5VGltZVpvbmUgaXMgbm90IGEgdmFsaWQgSUFOQSBpZGVudGlmaWVyLlxuICAgKi9cbiAgZm9ybWF0U2Vzc2lvblRpbWVSYW5nZShcbiAgICBkYXRlVGltZVJhbmdlOiBzdHJpbmcgfCB7IHN0YXJ0Pzogc3RyaW5nOyBlbmQ/OiBzdHJpbmcgfSB8IG51bGwsXG4gICAgZGlzcGxheVRpbWVab25lPzogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZVRpbWVSYW5nZSkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBsZXQgc3RhcnREdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVuZER0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBkYXRlVGltZVJhbmdlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBkYXRlVGltZVJhbmdlPy5zdGFydCAmJlxuICAgICAgICBkYXRlVGltZVJhbmdlPy5lbmRcbiAgICAgICkge1xuICAgICAgICBzdGFydER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5zdGFydCk7XG4gICAgICAgIGVuZER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5lbmQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZVRpbWVSYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXRjaCA9IGRhdGVUaW1lUmFuZ2UubWF0Y2goXG4gICAgICAgICAgL1N0YXJ0OlxccyooXFxkezR9LVxcZHsyfS1cXGR7Mn1cXHMrXFxkezJ9OlxcZHsyfTpcXGR7Mn0pLyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZW5kTWF0Y2ggPSBkYXRlVGltZVJhbmdlLm1hdGNoKFxuICAgICAgICAgIC9FbmQ6XFxzKihcXGR7NH0tXFxkezJ9LVxcZHsyfVxccytcXGR7Mn06XFxkezJ9OlxcZHsyfSkvLFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RhcnRNYXRjaClcbiAgICAgICAgICBzdGFydER0ID0gbmV3IERhdGUoc3RhcnRNYXRjaFsxXS5yZXBsYWNlKCcgJywgJ1QnKSArICdaJyk7XG4gICAgICAgIGlmIChlbmRNYXRjaCkgZW5kRHQgPSBuZXcgRGF0ZShlbmRNYXRjaFsxXS5yZXBsYWNlKCcgJywgJ1QnKSArICdaJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0YXJ0RHQgfHwgaXNOYU4oc3RhcnREdC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gICAgICBjb25zdCBsb2NhbGVPcHRzID0gZGlzcGxheVRpbWVab25lID8geyB0aW1lWm9uZTogZGlzcGxheVRpbWVab25lIH0gOiB7fTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHN0YXJ0RHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgaG91cjEyOiB0cnVlLFxuICAgICAgICAgIC4uLmxvY2FsZU9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmRUaW1lID1cbiAgICAgICAgICBlbmREdCAmJiAhaXNOYU4oZW5kRHQuZ2V0VGltZSgpKVxuICAgICAgICAgICAgPyBlbmREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBob3VyMTI6IHRydWUsXG4gICAgICAgICAgICAgICAgLi4ubG9jYWxlT3B0cyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiBlbmRUaW1lID8gYCR7c3RhcnRUaW1lfSAtICR7ZW5kVGltZX1gIDogc3RhcnRUaW1lO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHN0YXJ0RHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgaG91cjEyOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9XG4gICAgICAgICAgZW5kRHQgJiYgIWlzTmFOKGVuZER0LmdldFRpbWUoKSlcbiAgICAgICAgICAgID8gZW5kRHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgaG91cjEyOiB0cnVlLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIGVuZFRpbWUgPyBgJHtzdGFydFRpbWV9IC0gJHtlbmRUaW1lfWAgOiBzdGFydFRpbWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElBTkEgdGltZXpvbmUgSUQgLT4gYWJicmV2aWF0aW9uIG1hcCAobWF0Y2hlcyBwYXJlbnQgYXBwIHNlc3Npb24tbGF5b3V0cyAvIHRpbWV6b25lcy5lbnVtIFRpbWVab25lcykuXG4gICAqIFVzZWQgc28gc2Vzc2lvbiBjYXJkcyBzaG93IFNBU1QsIEVFU1QsIFNBV1NULCBFU0FTVCwgZXRjLiBpbnN0ZWFkIG9mIEdNVCsxLCBHTVQrMi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRaX0FCQlJfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdQYWNpZmljL0tpcml0aW1hdGknOiAnTElOVCcsXG4gICAgJ1BhY2lmaWMvQXBpYSc6ICdTU1QnLFxuICAgICdQYWNpZmljL1RvbmdhdGFwdSc6ICdUU1QnLFxuICAgICdFdGMvR01ULTEzJzogJ1VUQycsXG4gICAgJ1BhY2lmaWMvQ2hhdGhhbSc6ICdDSEFEVCcsXG4gICAgJ0FzaWEvS2FtY2hhdGthJzogJ0FOQVQnLFxuICAgICdQYWNpZmljL0ZpamknOiAnRkpUJyxcbiAgICAnRXRjL0dNVC0xMic6ICdVJyxcbiAgICAnUGFjaWZpYy9BdWNrbGFuZCc6ICdOWlNUJyxcbiAgICAnUGFjaWZpYy9HdWFkYWxjYW5hbCc6ICdDUFNUJyxcbiAgICAnQXNpYS9TYWtoYWxpbic6ICdTQUtUJyxcbiAgICAnUGFjaWZpYy9Ob3Jmb2xrJzogJ05GVCcsXG4gICAgJ0FzaWEvTWFnYWRhbic6ICdNQUdUJyxcbiAgICAnQXNpYS9TcmVkbmVrb2x5bXNrJzogJ1NSRVQnLFxuICAgICdQYWNpZmljL0JvdWdhaW52aWxsZSc6ICdCU1QnLFxuICAgICdBdXN0cmFsaWEvTG9yZF9Ib3dlJzogJ0xIU1QnLFxuICAgICdBc2lhL1ZsYWRpdm9zdG9rJzogJ1ZMQVQnLFxuICAgICdBdXN0cmFsaWEvSG9iYXJ0JzogJ0FFU1QnLFxuICAgICdQYWNpZmljL1BvcnRfTW9yZXNieSc6ICdDaFNUJyxcbiAgICAnQXVzdHJhbGlhL1N5ZG5leSc6ICdBRVNUJyxcbiAgICAnQXVzdHJhbGlhL0JyaXNiYW5lJzogJ0FXU1QnLFxuICAgICdBdXN0cmFsaWEvRGFyd2luJzogJ0FDU1QnLFxuICAgICdBdXN0cmFsaWEvQWRlbGFpZGUnOiAnQUNTVCcsXG4gICAgJ0FzaWEvWWFrdXRzayc6ICdZQUtUJyxcbiAgICAnQXNpYS9TZW91bCc6ICdLU1QnLFxuICAgICdBc2lhL1B5b25neWFuZyc6ICdLU1QnLFxuICAgICdBc2lhL1Rva3lvJzogJ1RTVCcsXG4gICAgJ0FzaWEvQ2hpdGEnOiAnWUFLVCcsXG4gICAgJ0F1c3RyYWxpYS9FdWNsYSc6ICdBQ1dTVCcsXG4gICAgJ0FzaWEvVWxhYW5iYWF0YXInOiAnRlNUJyxcbiAgICAnQXNpYS9UYWlwZWknOiAnVUxBVCcsXG4gICAgJ0F1c3RyYWxpYS9QZXJ0aCc6ICdBV1NUJyxcbiAgICAnQXNpYS9TaW5nYXBvcmUnOiAnU05TVCcsXG4gICAgJ0FzaWEvSXJrdXRzayc6ICdJUktUJyxcbiAgICAnQXNpYS9TaGFuZ2hhaSc6ICdDU1QnLFxuICAgICdBc2lhL1RvbXNrJzogJ01TRCcsXG4gICAgJ0FzaWEvTm92b3NpYmlyc2snOiAnTk9WVCcsXG4gICAgJ0FzaWEvS3Jhc25veWFyc2snOiAnS1JBVCcsXG4gICAgJ0FzaWEvSG92ZCc6ICdTQVNUJyxcbiAgICAnQXNpYS9CYXJuYXVsJzogJ01TSycsXG4gICAgJ0FzaWEvQmFuZ2tvayc6ICdUSEEnLFxuICAgICdBc2lhL1lhbmdvbic6ICdNWVNUJyxcbiAgICAnQXNpYS9PbXNrJzogJ09NU1QnLFxuICAgICdBc2lhL0RoYWthJzogJ0JTVCcsXG4gICAgJ0FzaWEvQWxtYXR5JzogJ05DQVNUJyxcbiAgICAnQXNpYS9LYXRobWFuZHUnOiAnTlBUJyxcbiAgICAnQXNpYS9Db2xvbWJvJzogJ1NMVCcsXG4gICAgJ0FzaWEvS29sa2F0YSc6ICdJU1QnLFxuICAgICdBc2lhL0NhbGN1dHRhJzogJ0lTVCcsXG4gICAgJ0FzaWEvUXl6eWxvcmRhJzogJ0NBU1QnLFxuICAgICdBc2lhL0thcmFjaGknOiAnUEtUJyxcbiAgICAnQXNpYS9ZZWthdGVyaW5idXJnJzogJ1lFS1QnLFxuICAgICdBc2lhL1Rhc2hrZW50JzogJ1dBU1QnLFxuICAgICdBc2lhL0thYnVsJzogJ0FGVCcsXG4gICAgJ0FzaWEvWWVyZXZhbic6ICdBTVQnLFxuICAgICdFdXJvcGUvVm9sZ29ncmFkJzogJ1ZTVCcsXG4gICAgJ0FzaWEvVGJpbGlzaSc6ICdHRVQnLFxuICAgICdFdXJvcGUvU2FyYXRvdic6ICdTTFQnLFxuICAgICdJbmRpYW4vTWF1cml0aXVzJzogJ01VVCcsXG4gICAgJ0V1cm9wZS9TYW1hcmEnOiAnU0FNVCcsXG4gICAgJ0FzaWEvQmFrdSc6ICdBWlQnLFxuICAgICdFdXJvcGUvQXN0cmFraGFuJzogJ1NBTVQnLFxuICAgICdBc2lhL0R1YmFpJzogJ0FSQlNUJyxcbiAgICAnQXNpYS9UZWhyYW4nOiAnSURUJyxcbiAgICAnQWZyaWNhL05haXJvYmknOiAnRUFTVCcsXG4gICAgJ0V1cm9wZS9Nb3Njb3cnOiAnTVNLJyxcbiAgICAnRXVyb3BlL01pbnNrJzogJ01TSycsXG4gICAgJ0FzaWEvUml5YWRoJzogJ0FTVCcsXG4gICAgJ0V1cm9wZS9Jc3RhbmJ1bCc6ICdURFQnLFxuICAgICdBc2lhL0JhZ2hkYWQnOiAnQVNUJyxcbiAgICAnQWZyaWNhL1dpbmRob2VrJzogJ05TVCcsXG4gICAgJ0FmcmljYS9Ucmlwb2xpJzogJ0xTVCcsXG4gICAgJ0FmcmljYS9LaGFydG91bSc6ICdFQVNUJyxcbiAgICAnRXVyb3BlL0thbGluaW5ncmFkJzogJ0tTVCcsXG4gICAgJ0FzaWEvSmVydXNhbGVtJzogJ0pEVCcsXG4gICAgJ0V1cm9wZS9LaWV2JzogJ0VFRFQnLFxuICAgICdBZnJpY2EvSm9oYW5uZXNidXJnJzogJ1NBU1QnLFxuICAgICdBc2lhL0hlYnJvbic6ICdFRVQnLFxuICAgICdBc2lhL0RhbWFzY3VzJzogJ1NEVCcsXG4gICAgJ0V1cm9wZS9DaGlzaW5hdSc6ICdHRFQnLFxuICAgICdBZnJpY2EvQ2Fpcm8nOiAnRVNUJyxcbiAgICAnQXNpYS9CZWlydXQnOiAnTUVEVCcsXG4gICAgJ0V1cm9wZS9CdWNoYXJlc3QnOiAnR0RUJyxcbiAgICAnQXNpYS9BbW1hbic6ICdKU1QnLFxuICAgICdBZnJpY2EvTGFnb3MnOiAnRUNUJyxcbiAgICAnRXVyb3BlL1dhcnNhdyc6ICdDRURUJyxcbiAgICAnQWZyaWNhL0Nhc2FibGFuY2EnOiAnTURUJyxcbiAgICAnRXVyb3BlL1BhcmlzJzogJ0NFU1QnLFxuICAgICdFdXJvcGUvQnVkYXBlc3QnOiAnQ0VEVCcsXG4gICAgJ0V1cm9wZS9CZXJsaW4nOiAnV0VEVCcsXG4gICAgJ0FmcmljYS9TYW9fVG9tZSc6ICdHU1QnLFxuICAgICdBdGxhbnRpYy9SZXlramF2aWsnOiAnR1NUJyxcbiAgICAnRXVyb3BlL0xvbmRvbic6ICdHRFQnLFxuICAgICdFdGMvVVRDJzogJ1VUQycsXG4gICAgJ0F0bGFudGljL0F6b3Jlcyc6ICdBRFQnLFxuICAgICdBdGxhbnRpYy9DYXBlX1ZlcmRlJzogJ0NWU1QnLFxuICAgICdFdGMvR01UKzInOiAnTVNUJyxcbiAgICAnQW1lcmljYS9BcmFndWFpbmEnOiAnU0VTVCcsXG4gICAgJ0FtZXJpY2EvU2FvX1BhdWxvJzogJ0VTQVNUJyxcbiAgICAnQW1lcmljYS9DYXllbm5lJzogJ1NFU1QnLFxuICAgICdBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMnOiAnQVNUJyxcbiAgICAnQW1lcmljYS9OdXVrJzogJ1dHVCcsXG4gICAgJ0FtZXJpY2EvTW9udGV2aWRlbyc6ICdNU1QnLFxuICAgICdBbWVyaWNhL1B1bnRhX0FyZW5hcyc6ICdDTFNUJyxcbiAgICAnQW1lcmljYS9NaXF1ZWxvbic6ICdQTVNUJyxcbiAgICAnQW1lcmljYS9CYWhpYSc6ICdCU1QnLFxuICAgICdBbWVyaWNhL1N0X0pvaG5zJzogJ05TVCcsXG4gICAgJ0FtZXJpY2EvQXN1bmNpb24nOiAnUFJTVCcsXG4gICAgJ0FtZXJpY2EvSGFsaWZheCc6ICdBU1QnLFxuICAgICdBbWVyaWNhL0NhcmFjYXMnOiAnVlNUJyxcbiAgICAnQW1lcmljYS9DdWlhYmEnOiAnQ0JTVCcsXG4gICAgJ0FtZXJpY2EvTGFfUGF6JzogJ1NBV1NUJyxcbiAgICAnQW1lcmljYS9TYW50aWFnbyc6ICdQU1NUJyxcbiAgICAnQW1lcmljYS9Cb2dvdGEnOiAnU1BTVCcsXG4gICAgJ0FtZXJpY2EvQ2FuY3VuJzogJ0VTVCcsXG4gICAgJ0FtZXJpY2EvTmV3X1lvcmsnOiAnRVQnLFxuICAgICdBbWVyaWNhL1BvcnQtYXUtUHJpbmNlJzogJ0VEVCcsXG4gICAgJ0FtZXJpY2EvSGF2YW5hJzogJ0VEVCcsXG4gICAgJ0FtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMnOiAnRVNUJyxcbiAgICAnQW1lcmljYS9HcmFuZF9UdXJrJzogJ0VTVCcsXG4gICAgJ0FtZXJpY2EvR3VhdGVtYWxhJzogJ0NBU1QnLFxuICAgICdBbWVyaWNhL0NoaWNhZ28nOiAnQ1QnLFxuICAgICdQYWNpZmljL0Vhc3Rlcic6ICdFQVNUJyxcbiAgICAnQW1lcmljYS9NZXhpY29fQ2l0eSc6ICdDU1QnLFxuICAgICdBbWVyaWNhL1JlZ2luYSc6ICdDQ1NUJyxcbiAgICAnQW1lcmljYS9QaG9lbml4JzogJ01UJyxcbiAgICAnQW1lcmljYS9DaGlodWFodWEnOiAnTURUJyxcbiAgICAnQW1lcmljYS9EZW52ZXInOiAnTVQnLFxuICAgICdBbWVyaWNhL1doaXRlaG9yc2UnOiAnWVNUJyxcbiAgICAnQW1lcmljYS9UaWp1YW5hJzogJ1BTVCcsXG4gICAgJ0V0Yy9HTVQrOCc6ICdVVEMtMDgnLFxuICAgICdBbWVyaWNhL0xvc19BbmdlbGVzJzogJ1BUJyxcbiAgICAnQW1lcmljYS9BbmNob3JhZ2UnOiAnQUsnLFxuICAgICdFdGMvR01UKzknOiAnVVRDLTA5JyxcbiAgICAnUGFjaWZpYy9NYXJxdWVzYXMnOiAnTVNUJyxcbiAgICAnQW1lcmljYS9BZGFrJzogJ0hTVCcsXG4gICAgJ1BhY2lmaWMvSG9ub2x1bHUnOiAnSEFTVCcsXG4gICAgJ0V0Yy9HTVQrMTEnOiAnVVRDLTExJyxcbiAgICAnRXRjL0dNVCsxMic6ICdCSVQnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBXaW5kb3dzLXN0eWxlIFwiKFVUQ8KxSEg6TU0pIFBsYWNlXCIgLT4gc2hvcnQgbmFtZSAoSVNULCBCUlQsIGV0Yy4pIHNvIHdlIHNob3cgXCJJU1RcIiBub3QgXCIoKFVUQyswNTozMCkgSW5kaWEpXCIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBXSU5ET1dTX1RaX0FCQlJfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICcoVVRDLTAzOjAwKSBCcmFzaWxpYSc6ICdCUlQnLFxuICAgICcoVVRDLTAzOjAwKSBCdWVub3MgQWlyZXMnOiAnQVJUJyxcbiAgICAnKFVUQyswNTozMCkgSW5kaWEnOiAnSVNUJyxcbiAgICAnKFVUQyswNTozMCkgQ2hlbm5haSwgS29sa2F0YSwgTXVtYmFpLCBOZXcgRGVsaGknOiAnSVNUJyxcbiAgICAnKFVUQyswMDowMCkgRHVibGluLCBFZGluYnVyZ2gsIExvbmRvbic6ICdHTVQnLFxuICAgICcoVVRDKzAwOjAwKSBNb25yb3ZpYSwgUmV5a2phdmlrJzogJ0dNVCcsXG4gICAgJyhVVEMrMDE6MDApIEFtc3RlcmRhbSwgQmVybGluLCBSb21lLCBTdG9ja2hvbG0nOiAnQ0VUJyxcbiAgICAnKFVUQyswMTowMCkgQnJ1c3NlbHMsIENvcGVuaGFnZW4sIE1hZHJpZCwgUGFyaXMnOiAnQ0VUJyxcbiAgICAnKFVUQyswMjowMCkgQXRoZW5zLCBJc3RhbmJ1bCwgTWluc2snOiAnRUVUJyxcbiAgICAnKFVUQyswMjowMCkgQ2Fpcm8nOiAnRUVUJyxcbiAgICAnKFVUQyswMjowMCkgSmVydXNhbGVtJzogJ0lTVCcsXG4gICAgJyhVVEMrMDM6MDApIE1vc2NvdywgU3QuIFBldGVyc2J1cmcnOiAnTVNLJyxcbiAgICAnKFVUQyswMzowMCkgTmFpcm9iaSc6ICdFQVQnLFxuICAgICcoVVRDKzA0OjAwKSBEdWJhaSc6ICdHU1QnLFxuICAgICcoVVRDKzA1OjAwKSBJc2xhbWFiYWQsIEthcmFjaGknOiAnUEtUJyxcbiAgICAnKFVUQyswNTo0NSkgS2F0aG1hbmR1JzogJ05QVCcsXG4gICAgJyhVVEMrMDY6MDApIERoYWthJzogJ0JTVCcsXG4gICAgJyhVVEMrMDY6MzApIFlhbmdvbiAoUmFuZ29vbiknOiAnTU1UJyxcbiAgICAnKFVUQyswNzowMCkgQmFuZ2tvaywgSGFub2ksIEpha2FydGEnOiAnSUNUJyxcbiAgICAnKFVUQyswODowMCkgQmVpamluZywgQ2hvbmdxaW5nLCBIb25nIEtvbmcsIFVydW1xaSc6ICdDU1QnLFxuICAgICcoVVRDKzA4OjAwKSBLdWFsYSBMdW1wdXIsIFNpbmdhcG9yZSc6ICdTR1QnLFxuICAgICcoVVRDKzA5OjAwKSBPc2FrYSwgU2FwcG9ybywgVG9reW8nOiAnSlNUJyxcbiAgICAnKFVUQyswOTozMCkgQWRlbGFpZGUnOiAnQUNTVCcsXG4gICAgJyhVVEMrMTA6MDApIEJyaXNiYW5lJzogJ0FFU1QnLFxuICAgICcoVVRDKzEwOjAwKSBDYW5iZXJyYSwgTWVsYm91cm5lLCBTeWRuZXknOiAnQUVTVCcsXG4gICAgJyhVVEMrMTI6MDApIEF1Y2tsYW5kLCBXZWxsaW5ndG9uJzogJ05aU1QnLFxuICAgICcoVVRDLTA1OjAwKSBFYXN0ZXJuIFRpbWUgKFVTICYgQ2FuYWRhKSc6ICdFVCcsXG4gICAgJyhVVEMtMDY6MDApIENlbnRyYWwgVGltZSAoVVMgJiBDYW5hZGEpJzogJ0NUJyxcbiAgICAnKFVUQy0wNzowMCkgTW91bnRhaW4gVGltZSAoVVMgJiBDYW5hZGEpJzogJ01UJyxcbiAgICAnKFVUQy0wODowMCkgUGFjaWZpYyBUaW1lIChVUyAmIENhbmFkYSknOiAnUFQnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBXaW5kb3dzLXN0eWxlIFwiKFVUQ8KxSEg6TU0pIFBsYWNlXCIgLT4gSUFOQSB0aW1lem9uZS5cbiAgICogVGhpcyBwcmV2ZW50cyBJbnRsL0RhdGVQaXBlIGZyb20gZmFsbGluZyBiYWNrIHRvIGJyb3dzZXIgbG9jYWwgdGltZSB3aGVuIGEgV2luZG93cyBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgV0lORE9XU19UWl9JQU5BX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnKFVUQy0wMzowMCkgQnJhc2lsaWEnOiAnQW1lcmljYS9TYW9fUGF1bG8nLFxuICAgICcoVVRDLTAzOjAwKSBCdWVub3MgQWlyZXMnOiAnQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzJyxcbiAgICAnKFVUQyswNTozMCkgSW5kaWEnOiAnQXNpYS9Lb2xrYXRhJyxcbiAgICAnKFVUQyswNTozMCkgQ2hlbm5haSwgS29sa2F0YSwgTXVtYmFpLCBOZXcgRGVsaGknOiAnQXNpYS9Lb2xrYXRhJyxcbiAgICAnKFVUQyswMDowMCkgRHVibGluLCBFZGluYnVyZ2gsIExvbmRvbic6ICdFdXJvcGUvTG9uZG9uJyxcbiAgICAnKFVUQyswMDowMCkgTW9ucm92aWEsIFJleWtqYXZpayc6ICdFdGMvVVRDJyxcbiAgICAnKFVUQyswMTowMCkgQW1zdGVyZGFtLCBCZXJsaW4sIFJvbWUsIFN0b2NraG9sbSc6ICdFdXJvcGUvQmVybGluJyxcbiAgICAnKFVUQyswMTowMCkgQnJ1c3NlbHMsIENvcGVuaGFnZW4sIE1hZHJpZCwgUGFyaXMnOiAnRXVyb3BlL1BhcmlzJyxcbiAgICAnKFVUQyswMjowMCkgQXRoZW5zLCBJc3RhbmJ1bCwgTWluc2snOiAnRXVyb3BlL0F0aGVucycsXG4gICAgJyhVVEMrMDI6MDApIENhaXJvJzogJ0FmcmljYS9DYWlybycsXG4gICAgJyhVVEMrMDI6MDApIEplcnVzYWxlbSc6ICdBc2lhL0plcnVzYWxlbScsXG4gICAgJyhVVEMrMDM6MDApIE1vc2NvdywgU3QuIFBldGVyc2J1cmcnOiAnRXVyb3BlL01vc2NvdycsXG4gICAgJyhVVEMrMDM6MDApIE5haXJvYmknOiAnQWZyaWNhL05haXJvYmknLFxuICAgICcoVVRDKzA0OjAwKSBEdWJhaSc6ICdBc2lhL0R1YmFpJyxcbiAgICAnKFVUQyswNTowMCkgSXNsYW1hYmFkLCBLYXJhY2hpJzogJ0FzaWEvS2FyYWNoaScsXG4gICAgJyhVVEMrMDU6NDUpIEthdGhtYW5kdSc6ICdBc2lhL0thdGhtYW5kdScsXG4gICAgJyhVVEMrMDY6MDApIERoYWthJzogJ0FzaWEvRGhha2EnLFxuICAgICcoVVRDKzA2OjMwKSBZYW5nb24gKFJhbmdvb24pJzogJ0FzaWEvWWFuZ29uJyxcbiAgICAnKFVUQyswNzowMCkgQmFuZ2tvaywgSGFub2ksIEpha2FydGEnOiAnQXNpYS9CYW5na29rJyxcbiAgICAnKFVUQyswODowMCkgQmVpamluZywgQ2hvbmdxaW5nLCBIb25nIEtvbmcsIFVydW1xaSc6ICdBc2lhL1NoYW5naGFpJyxcbiAgICAnKFVUQyswODowMCkgS3VhbGEgTHVtcHVyLCBTaW5nYXBvcmUnOiAnQXNpYS9TaW5nYXBvcmUnLFxuICAgICcoVVRDKzA5OjAwKSBPc2FrYSwgU2FwcG9ybywgVG9reW8nOiAnQXNpYS9Ub2t5bycsXG4gICAgJyhVVEMrMDk6MzApIEFkZWxhaWRlJzogJ0F1c3RyYWxpYS9BZGVsYWlkZScsXG4gICAgJyhVVEMrMTA6MDApIEJyaXNiYW5lJzogJ0F1c3RyYWxpYS9CcmlzYmFuZScsXG4gICAgJyhVVEMrMTA6MDApIENhbmJlcnJhLCBNZWxib3VybmUsIFN5ZG5leSc6ICdBdXN0cmFsaWEvU3lkbmV5JyxcbiAgICAnKFVUQysxMjowMCkgQXVja2xhbmQsIFdlbGxpbmd0b24nOiAnUGFjaWZpYy9BdWNrbGFuZCcsXG4gICAgJyhVVEMtMDU6MDApIEVhc3Rlcm4gVGltZSAoVVMgJiBDYW5hZGEpJzogJ0FtZXJpY2EvTmV3X1lvcmsnLFxuICAgICcoVVRDLTA2OjAwKSBDZW50cmFsIFRpbWUgKFVTICYgQ2FuYWRhKSc6ICdBbWVyaWNhL0NoaWNhZ28nLFxuICAgICcoVVRDLTA3OjAwKSBNb3VudGFpbiBUaW1lIChVUyAmIENhbmFkYSknOiAnQW1lcmljYS9EZW52ZXInLFxuICAgICcoVVRDLTA4OjAwKSBQYWNpZmljIFRpbWUgKFVTICYgQ2FuYWRhKSc6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyxcbiAgfTtcblxuICBwcml2YXRlIG5vcm1hbGl6ZVRvSWFuYVRpbWVab25lKFxuICAgIHR6OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2Vzc2lvbklhbmFUaW1lWm9uZT86IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByYXcgPSAodHogPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIHNlc3Npb25JYW5hVGltZVpvbmUgfHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdXNlciBwYXNzZXMgdGhlIHNlc3Npb24ncyBXaW5kb3dzIGlkL25hbWUsIHByZWZlciB0aGUgc2Vzc2lvbidzIGtub3duIElBTkEgem9uZS5cbiAgICBpZiAoXG4gICAgICBzZXNzaW9uSWFuYVRpbWVab25lICYmXG4gICAgICByYXcudG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKHNlc3Npb25JYW5hVGltZVpvbmUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gc2Vzc2lvbklhbmFUaW1lWm9uZTtcbiAgICB9XG5cbiAgICBpZiAocmF3LnN0YXJ0c1dpdGgoJyhVVEMnKSB8fCByYXcuc3RhcnRzV2l0aCgnKHV0YycpKSB7XG4gICAgICBjb25zdCBtYXAgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ2hhdERyYXdlckNvbXBvbmVudClcbiAgICAgICAgLldJTkRPV1NfVFpfSUFOQV9NQVA7XG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhtYXApLmZpbmQoXG4gICAgICAgIChrKSA9PiBrLnRvTG93ZXJDYXNlKCkgPT09IHJhdy50b0xvd2VyQ2FzZSgpLFxuICAgICAgKTtcbiAgICAgIGlmIChrZXkpIHJldHVybiBtYXBba2V5XTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgYXNzdW1lIGl0IG1heSBhbHJlYWR5IGJlIElBTkEgKGUuZy4gXCJBbWVyaWNhL1Nhb19QYXVsb1wiKVxuICAgIHJldHVybiByYXc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRpbWV6b25lIGFiYnJldmlhdGlvbiAoZS5nLiBJU1QsIEJSVCwgU0FTVCkgZm9yIGRpc3BsYXkgYWZ0ZXIgdGhlIHRpbWUuXG4gICAqIFVzZXMgSUFOQSBtYXAgYW5kIFdpbmRvd3Mtc3R5bGUgbWFwIHNvIHdlIHNob3cgXCJCUlRcIiAvIFwiSVNUXCIgaW5zdGVhZCBvZiBcIigoVVRDLTAzOjAwKSBCcmFzaWxpYSlcIi5cbiAgICogT25seSBjb25zdWx0cyBXaW5kb3dzIG1hcCB3aGVuIGlucHV0IGxvb2tzIGxpa2UgXCIoVVRDLi4uKVwiIHNvIGV4aXN0aW5nIElBTkEvSW50bCBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBnZXRUaW1lem9uZUFiYnJldmlhdGlvbih0ejogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXR6IHx8ICFTdHJpbmcodHopLnRyaW0oKSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHR6SWQgPSBTdHJpbmcodHopLnRyaW0oKTtcbiAgICBpZiAodHpJZC5zdGFydHNXaXRoKCcoVVRDJykgfHwgdHpJZC5zdGFydHNXaXRoKCcodXRjJykpIHtcbiAgICAgIGNvbnN0IHdpbk1hcCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDaGF0RHJhd2VyQ29tcG9uZW50KVxuICAgICAgICAuV0lORE9XU19UWl9BQkJSX01BUDtcbiAgICAgIGNvbnN0IHdpbktleSA9IE9iamVjdC5rZXlzKHdpbk1hcCkuZmluZChcbiAgICAgICAgKGspID0+IGsudG9Mb3dlckNhc2UoKSA9PT0gdHpJZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgKTtcbiAgICAgIGlmICh3aW5LZXkpIHJldHVybiB3aW5NYXBbd2luS2V5XTtcbiAgICB9XG4gICAgY29uc3QgbWFwID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENoYXREcmF3ZXJDb21wb25lbnQpLlRaX0FCQlJfTUFQO1xuICAgIGxldCBtYXBwZWQgPSBtYXBbdHpJZF07XG4gICAgaWYgKCFtYXBwZWQpIHtcbiAgICAgIGNvbnN0IGtleUxvd2VyID0gdHpJZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZW50cnkgPSBPYmplY3QuZW50cmllcyhtYXApLmZpbmQoXG4gICAgICAgIChba10pID0+IGsudG9Mb3dlckNhc2UoKSA9PT0ga2V5TG93ZXIsXG4gICAgICApO1xuICAgICAgaWYgKGVudHJ5KSBtYXBwZWQgPSBlbnRyeVsxXTtcbiAgICB9XG4gICAgaWYgKG1hcHBlZCkgcmV0dXJuIG1hcHBlZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICB0aW1lWm9uZTogdHpJZCxcbiAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlci5mb3JtYXRUb1BhcnRzKG5ldyBEYXRlKCkpO1xuICAgICAgY29uc3QgdHpQYXJ0ID0gcGFydHMuZmluZCgocCkgPT4gcC50eXBlID09PSAndGltZVpvbmVOYW1lJyk7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0elBhcnQ/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBpZiAodmFsdWUgJiYgL15HTVRbKy1dXFxkLy50ZXN0KHZhbHVlKSkgcmV0dXJuICcnO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRGcm9tU2Vzc2lvblJvbGVzKHNlc3Npb25Sb2xlczogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2Vzc2lvblJvbGVzKSB8fCBzZXNzaW9uUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbignJykgfHwgJyc7XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0ID0gc2Vzc2lvblJvbGVzWzBdO1xuICAgIGlmICh0eXBlb2YgZmlyc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGZpcnN0KVxuICAgICAgICAucmVwbGFjZSgvXlxccyotXFxzKi8sICcnKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cbiAgICBpZiAoZmlyc3QgJiYgdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiAoZmlyc3QgYXMgYW55KS5kZXNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIFN0cmluZygoZmlyc3QgYXMgYW55KS5kZXNjcmlwdGlvbikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbignJykgfHwgJyc7XG4gIH1cblxuICBtYXBTZXNzaW9uc1RvQ2FyZERhdGEoc2Vzc2lvbnM6IGFueVtdKTogYW55W10ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZXNzaW9ucykpIHJldHVybiBbXTtcbiAgICBjb25zdCB1c2VyVGltZXpvbmUgPVxuICAgICAgdGhpcy50aW1lem9uZSAmJiBTdHJpbmcodGhpcy50aW1lem9uZSkudHJpbSgpXG4gICAgICAgID8gU3RyaW5nKHRoaXMudGltZXpvbmUpLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc2Vzc2lvbnMubWFwKChyYXc6IGFueSkgPT4ge1xuICAgICAgLy8gZ2V0X215X2FnZW5kYSByZXR1cm5zIHdyYXBwZXIgeyBpZCwgc2NoZWR1bGUsIGlzU2Vzc2lvbiB9OyBub3JtYWxpemUgdG8gaW5uZXIgc2NoZWR1bGUgb2JqZWN0XG4gICAgICBjb25zdCBzID0gcmF3ICYmIHJhdy5zY2hlZHVsZSA/IHJhdy5zY2hlZHVsZSA6IHJhdztcbiAgICAgIGNvbnN0IHNlc3Npb25Uek9iaiA9XG4gICAgICAgIHMgJiYgdHlwZW9mIHMgPT09ICdvYmplY3QnID8gKHMgYXMgYW55KS50aW1lWm9uZSA6IG51bGw7XG4gICAgICBjb25zdCBzZXNzaW9uSWFuYVRpbWVab25lID1cbiAgICAgICAgc2Vzc2lvblR6T2JqICYmIHR5cGVvZiBzZXNzaW9uVHpPYmogPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBTdHJpbmcoc2Vzc2lvblR6T2JqLnN1YlRpbWVab25lID8/ICcnKS50cmltKClcbiAgICAgICAgICA6ICcnO1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGRhdGVUaW1lUmFuZ2UgKHN0cmluZykgYW5kIGFjdHVhbERhdGVUaW1lUmFuZ2UgKG9iamVjdCB3aXRoIHN0YXJ0L2VuZClcbiAgICAgIGNvbnN0IHdoZW5SYXcgPSBzLmRhdGVUaW1lUmFuZ2UgPz8gcy5hY3R1YWxEYXRlVGltZVJhbmdlID8/ICcnO1xuICAgICAgLy8gUHJlZmVyIHVzZXIncyBzZWxlY3RlZCB0aW1lem9uZTsgb3RoZXJ3aXNlIHVzZSBzZXNzaW9uJ3MgSUFOQSB6b25lIChzdWJUaW1lWm9uZSkgZm9yIGNvcnJlY3QgZGF0ZS9kYXkuXG4gICAgICBjb25zdCBmb3JtYXR0aW5nVGltZVpvbmUgPSB0aGlzLm5vcm1hbGl6ZVRvSWFuYVRpbWVab25lKFxuICAgICAgICB1c2VyVGltZXpvbmUsXG4gICAgICAgIHNlc3Npb25JYW5hVGltZVpvbmUsXG4gICAgICApO1xuICAgICAgY29uc3Qgd2hlbkZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U2Vzc2lvbldoZW4oXG4gICAgICAgIHdoZW5SYXcsXG4gICAgICAgIGZvcm1hdHRpbmdUaW1lWm9uZSB8fCB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgLy8gT25seSBzZXQgc3RhdHVzVGV4dCB3aGVuIHNlc3Npb24gaGFzIGpvaW4vd2F0Y2ggcm9sZXMgKHNvIHdlIGRvbid0IHNob3cgXCJZb3UgY2FuIGpvaW4gdGhpcyBtZWV0aW5nXCIgd2hlbiB0aGVyZSBhcmUgbm8gYnV0dG9ucylcbiAgICAgIGNvbnN0IGhhc0pvaW5XYXRjaFJvbGUgPVxuICAgICAgICBBcnJheS5pc0FycmF5KHMuc2Vzc2lvblJvbGVzKSAmJlxuICAgICAgICBzLnNlc3Npb25Sb2xlcy5zb21lKChyOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgICAgIHIgJiYgdHlwZW9mIHIgPT09ICdvYmplY3QnICYmIHIuc2Vzc2lvblJvbGVOYW1lXG4gICAgICAgICAgICAgID8gU3RyaW5nKHIuc2Vzc2lvblJvbGVOYW1lKS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IFN0cmluZyhyID8/ICcnKVxuICAgICAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICdqb2luJyB8fCBuYW1lID09PSAnd2F0Y2gnO1xuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXR1c1RleHQgPSBoYXNKb2luV2F0Y2hSb2xlXG4gICAgICAgID8gdGhpcy5nZXRTdGF0dXNUZXh0RnJvbVNlc3Npb25Sb2xlcyhzLnNlc3Npb25Sb2xlcylcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNlc3Npb25UaW1lWm9uZUxhYmVsID1cbiAgICAgICAgc2Vzc2lvblR6T2JqICE9IG51bGxcbiAgICAgICAgICA/IHR5cGVvZiBzZXNzaW9uVHpPYmogPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IFN0cmluZyhcbiAgICAgICAgICAgICAgICBzZXNzaW9uVHpPYmoubmFtZSA/P1xuICAgICAgICAgICAgICAgICAgc2Vzc2lvblR6T2JqLmlkID8/XG4gICAgICAgICAgICAgICAgICBzZXNzaW9uVHpPYmouc3ViVGltZVpvbmUgPz9cbiAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICApLnRyaW0oKVxuICAgICAgICAgICAgOiBTdHJpbmcoc2Vzc2lvblR6T2JqKS50cmltKClcbiAgICAgICAgICA6ICcnO1xuICAgICAgLy8gVXNlIGFuIElBTkEgdGltZXpvbmUgZm9yIGZvcm1hdHRpbmc7IHVzZSBhIHNlcGFyYXRlIGxhYmVsIGZvciBVSSBkaXNwbGF5LlxuICAgICAgY29uc3QgZGlzcGxheVRpbWVab25lRm9yRm9ybWF0ID0gZm9ybWF0dGluZ1RpbWVab25lO1xuICAgICAgY29uc3QgZGlzcGxheVRpbWVab25lTGFiZWwgPSAoXG4gICAgICAgIHVzZXJUaW1lem9uZSB8fFxuICAgICAgICBzZXNzaW9uVGltZVpvbmVMYWJlbCB8fFxuICAgICAgICAnJ1xuICAgICAgKS50cmltKCk7XG4gICAgICBjb25zdCB0ekFiYnIgPSBkaXNwbGF5VGltZVpvbmVGb3JGb3JtYXRcbiAgICAgICAgPyB0aGlzLmdldFRpbWV6b25lQWJicmV2aWF0aW9uKGRpc3BsYXlUaW1lWm9uZUZvckZvcm1hdClcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHdoZW5XaXRoVHogPVxuICAgICAgICB3aGVuRm9ybWF0dGVkIHx8ICh0eXBlb2Ygd2hlblJhdyA9PT0gJ29iamVjdCcgPyAnJyA6IFN0cmluZyh3aGVuUmF3KSk7XG4gICAgICBjb25zdCB3aGVuRGlzcGxheSA9IHR6QWJiclxuICAgICAgICA/IGAke3doZW5XaXRoVHp9ICgke3R6QWJicn0pYC50cmltKClcbiAgICAgICAgOiB3aGVuV2l0aFR6O1xuICAgICAgY29uc3QgZGF0ZUJhZGdlID0gdGhpcy5nZXRTZXNzaW9uRGF0ZUJhZGdlKFxuICAgICAgICB3aGVuUmF3LFxuICAgICAgICBkaXNwbGF5VGltZVpvbmVGb3JGb3JtYXQgfHwgdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIGxldCB0aW1lUmFuZ2UgPSB0aGlzLmZvcm1hdFNlc3Npb25UaW1lUmFuZ2UoXG4gICAgICAgIHdoZW5SYXcsXG4gICAgICAgIGRpc3BsYXlUaW1lWm9uZUZvckZvcm1hdCB8fCB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBTdHJpbmcocy5kZXNjcmlwdGlvbiA/PyBzLmFic3RyYWN0ID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBzZXNzaW9uVHlwZVJhdyA9XG4gICAgICAgIHMuc2Vzc2lvblR5cGUgIT0gbnVsbFxuICAgICAgICAgID8gdHlwZW9mIHMuc2Vzc2lvblR5cGUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IChzLnNlc3Npb25UeXBlLm5hbWUgPz8gcy5zZXNzaW9uVHlwZS50aXRsZSA/PyAnJylcbiAgICAgICAgICAgIDogcy5zZXNzaW9uVHlwZVxuICAgICAgICAgIDogJyc7XG4gICAgICBjb25zdCBtZWV0aW5nVHlwZSA9IFN0cmluZyhcbiAgICAgICAgc2Vzc2lvblR5cGVSYXcgPz8gcy50eXBlID8/IHMubWVldGluZ1R5cGUgPz8gJycsXG4gICAgICApLnRyaW0oKTtcbiAgICAgIGNvbnN0IHNlc3Npb25UeXBlTGFiZWwgPSB0aGlzLmlzVW5FdmVudFxuICAgICAgICA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ01lZXRpbmcgdHlwZScpIHx8ICdNZWV0aW5nIHR5cGUnXG4gICAgICAgIDogdGhpcy5nZXRUcmFuc2xhdGlvbignU2Vzc2lvbiB0eXBlJykgfHwgJ1Nlc3Npb24gdHlwZSc7XG4gICAgICAvLyBTYW1lIGxvZ2ljIGFzIGJlZm9yZSBkZXNpZ24gdXBkYXRlOiBwcmVmZXIgdHogYWJicmV2aWF0aW9uIChlLmcuIEVTVCksIGVsc2Ugc2hvdyBkaXNwbGF5IHRpbWV6b25lIHN0cmluZyAoZS5nLiBcIihVVEMtMDM6MDApIEJyYXNpbGlhKVwiKVxuICAgICAgY29uc3QgdGltZVpvbmVEaXNwbGF5ID0gdHpBYmJyIHx8IGRpc3BsYXlUaW1lWm9uZUxhYmVsIHx8ICcnO1xuICAgICAgLy8gV2hlbiBBUEkgcmV0dXJucyBcIlN0YXJ0OiBOL0EsIEVuZDogTi9BLCBUaW1lWm9uZTogLi4uXCIgKHN0cmluZyksIHNob3cgYXQgbGVhc3QgdGltZXpvbmVcbiAgICAgIGlmICghdGltZVJhbmdlICYmIChkaXNwbGF5VGltZVpvbmVGb3JGb3JtYXQgfHwgZGlzcGxheVRpbWVab25lTGFiZWwpKSB7XG4gICAgICAgIHRpbWVSYW5nZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ05vdCBzcGVjaWZpZWQnKSB8fCAnTm90IHNwZWNpZmllZCc7XG4gICAgICB9XG4gICAgICAvLyBUaW1lIHJhbmdlIHdpdGggdGltZXpvbmUgaW4gcGFyZW50aGVzZXMgd2hlbiBhdmFpbGFibGUgKHNhbWUgYXMgb2xkIHdoZW5EaXNwbGF5IGZvcm1hdClcbiAgICAgIGNvbnN0IHRpbWVSYW5nZVdpdGhUeiA9IHRpbWVab25lRGlzcGxheVxuICAgICAgICA/IGAke3RpbWVSYW5nZX0gKCR7dGltZVpvbmVEaXNwbGF5fSlgLnRyaW0oKVxuICAgICAgICA6IHRpbWVSYW5nZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiBTdHJpbmcocy50aXRsZSA/PyAnJykudHJpbSgpLFxuICAgICAgICBvcmdhbml6ZXI6IFN0cmluZyhzLm9yZ2FuaXplciA/PyAnJykudHJpbSgpLFxuICAgICAgICByb29tOiBTdHJpbmcocy5yb29tTmFtZSA/PyAnJykudHJpbSgpLFxuICAgICAgICB3aGVuOiB3aGVuRGlzcGxheSxcbiAgICAgICAgdGltZVJhbmdlLFxuICAgICAgICB0aW1lUmFuZ2VXaXRoVHo6IHRpbWVSYW5nZSA/IHRpbWVSYW5nZVdpdGhUeiA6IHRpbWVab25lRGlzcGxheSB8fCAnJyxcbiAgICAgICAgZGF0ZURheTogZGF0ZUJhZGdlLmRheSxcbiAgICAgICAgZGF0ZU1vbnRoOiBkYXRlQmFkZ2UubW9udGgsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB0aW1lWm9uZTogZGlzcGxheVRpbWVab25lRm9yRm9ybWF0IHx8IGRpc3BsYXlUaW1lWm9uZUxhYmVsLFxuICAgICAgICB0aW1lWm9uZURpc3BsYXksXG4gICAgICAgIG1lZXRpbmdUeXBlLFxuICAgICAgICBzZXNzaW9uVHlwZUxhYmVsLFxuICAgICAgICBzdGF0dXNUZXh0LFxuICAgICAgICBzZXNzaW9uOiBzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNlc3Npb25JYW5hVGltZVpvbmUoc2Vzc2lvbjogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBzID0gc2Vzc2lvbiAmJiBzZXNzaW9uLnNjaGVkdWxlID8gc2Vzc2lvbi5zY2hlZHVsZSA6IHNlc3Npb247XG4gICAgY29uc3QgdHpPYmogPSBzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0JyA/IChzIGFzIGFueSkudGltZVpvbmUgOiBudWxsO1xuICAgIGNvbnN0IHNlc3Npb25JYW5hID1cbiAgICAgIHR6T2JqICYmIHR5cGVvZiB0ek9iaiA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBTdHJpbmcodHpPYmouc3ViVGltZVpvbmUgPz8gJycpLnRyaW0oKVxuICAgICAgICA6ICcnO1xuICAgIGNvbnN0IHVzZXJUeiA9XG4gICAgICB0aGlzLnRpbWV6b25lICYmIFN0cmluZyh0aGlzLnRpbWV6b25lKS50cmltKClcbiAgICAgICAgPyBTdHJpbmcodGhpcy50aW1lem9uZSkudHJpbSgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVRvSWFuYVRpbWVab25lKHVzZXJUeiwgc2Vzc2lvbklhbmEpIHx8ICdVVEMnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0U3BlYWtlcklkc0Zyb21TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2Vzc2lvbkNhcmRzKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNhcmQgb2Ygc2Vzc2lvbkNhcmRzKSB7XG4gICAgICBjb25zdCByYXcgPSBjYXJkPy5zZXNzaW9uPy5zcGVha2VycztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiByYXcpIHtcbiAgICAgICAgICBjb25zdCBzaWQgPSBTdHJpbmcoaWQgPz8gJycpLnRyaW0oKTtcbiAgICAgICAgICBpZiAoc2lkKSBpZHMucHVzaChzaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaWRzKSk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFNwZWFrZXJzVG9TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZXNzaW9uQ2FyZHMpKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBjYXJkIG9mIHNlc3Npb25DYXJkcykge1xuICAgICAgY29uc3Qgc3BlYWtlcklkczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGNhcmQ/LnNlc3Npb24/LnNwZWFrZXJzKVxuICAgICAgICA/IGNhcmQuc2Vzc2lvbi5zcGVha2Vyc1xuICAgICAgICAgICAgLm1hcCgoeDogYW55KSA9PiBTdHJpbmcoeCA/PyAnJykudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICA6IFtdO1xuICAgICAgY29uc3Qgc3BlYWtlcnNMaXN0ID0gc3BlYWtlcklkc1xuICAgICAgICAubWFwKChpZCkgPT4gdGhpcy5zcGVha2Vyc1tpZF0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjYXJkLnNwZWFrZXJzTGlzdCA9IHNwZWFrZXJzTGlzdDtcbiAgICAgIGlmIChjYXJkPy5zZXNzaW9uICYmIHR5cGVvZiBjYXJkLnNlc3Npb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNhcmQuc2Vzc2lvbi5zcGVha2Vyc0xpc3QgPSBzcGVha2Vyc0xpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTcGVha2Vyc0ZvclNlc3Npb25DYXJkcyhzZXNzaW9uQ2FyZHM6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgaWRzID0gdGhpcy5jb2xsZWN0U3BlYWtlcklkc0Zyb21TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzKTtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWlzc2luZyA9IGlkcy5maWx0ZXIoXG4gICAgICAoaWQpID0+ICF0aGlzLnNwZWFrZXJzW2lkXSAmJiAhdGhpcy5yZXF1ZXN0ZWRTcGVha2VySWRzLmhhcyhpZCksXG4gICAgKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYXR0YWNoU3BlYWtlcnNUb1Nlc3Npb25DYXJkcyhzZXNzaW9uQ2FyZHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtaXNzaW5nLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlcXVlc3RlZFNwZWFrZXJJZHMuYWRkKGlkKSk7XG4gICAgdGhpcy5nZXRTcGVha2Vyc0J5U3RhZmZJZHMobWlzc2luZykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5hdHRhY2hTcGVha2Vyc1RvU2Vzc2lvbkNhcmRzKHNlc3Npb25DYXJkcyk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEJlc3QgZWZmb3J0OiBzdGlsbCBhdHRhY2ggd2hhdCB3ZSBoYXZlIGNhY2hlZFxuICAgICAgICB0aGlzLmF0dGFjaFNwZWFrZXJzVG9TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3BlYWtlclBob3RvVXJsKHNwZWFrZXI6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghc3BlYWtlcikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICAgIHNwZWFrZXIucGhvdG8sXG4gICAgICBzcGVha2VyLnBob3RvUGF0aCxcbiAgICAgIHNwZWFrZXIuYXZhdGFyVXJsLFxuICAgICAgc3BlYWtlci5wcm9maWxlSW1hZ2VVcmwsXG4gICAgICBzcGVha2VyLnByb2ZpbGVJbWFnZSxcbiAgICAgIHNwZWFrZXIucHJvZmlsZVBpY3R1cmUsXG4gICAgICBzcGVha2VyLmltYWdlVXJsLFxuICAgICAgc3BlYWtlci5pbWFnZSxcbiAgICBdO1xuICAgIGNvbnN0IHVybCA9IGNhbmRpZGF0ZXMuZmluZCgodikgPT4gdiAhPSBudWxsICYmIFN0cmluZyh2KS50cmltKCkgIT09ICcnKTtcbiAgICByZXR1cm4gdXJsID8gU3RyaW5nKHVybCkudHJpbSgpIDogbnVsbDtcbiAgfVxuXG4gIGhhc1Nlc3Npb25DYXJkU3BlYWtlcnMoc2Vzc2lvbkNhcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxpc3QgPVxuICAgICAgc2Vzc2lvbkNhcmQ/LnNwZWFrZXJzTGlzdCB8fCBzZXNzaW9uQ2FyZD8uc2Vzc2lvbj8uc3BlYWtlcnNMaXN0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpICYmIGxpc3QubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgaWRzID0gc2Vzc2lvbkNhcmQ/LnNlc3Npb24/LnNwZWFrZXJzO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlkcykgJiYgaWRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXRTcGVha2VyRGlzcGxheU5hbWUoc3BlYWtlcjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXNwZWFrZXIpIHJldHVybiAnJztcbiAgICBpZiAoc3BlYWtlci5uYW1lICE9IG51bGwgJiYgU3RyaW5nKHNwZWFrZXIubmFtZSkudHJpbSgpICE9PSAnJylcbiAgICAgIHJldHVybiBTdHJpbmcoc3BlYWtlci5uYW1lKS50cmltKCk7XG4gICAgY29uc3QgZmlyc3QgPVxuICAgICAgc3BlYWtlci5maXJzdE5hbWUgIT0gbnVsbCA/IFN0cmluZyhzcGVha2VyLmZpcnN0TmFtZSkudHJpbSgpIDogJyc7XG4gICAgY29uc3QgbGFzdCA9XG4gICAgICBzcGVha2VyLmxhc3ROYW1lICE9IG51bGwgPyBTdHJpbmcoc3BlYWtlci5sYXN0TmFtZSkudHJpbSgpIDogJyc7XG4gICAgcmV0dXJuIGAke2ZpcnN0fSAke2xhc3R9YC50cmltKCk7XG4gIH1cblxuICBnZXRTcGVha2VySW5pdGlhbHMoc3BlYWtlcjogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRTcGVha2VyRGlzcGxheU5hbWUoc3BlYWtlcik7XG4gICAgaWYgKG5hbWUpIHJldHVybiB0aGlzLmdldEF0dGVuZGVlSW5pdGlhbHMobmFtZSk7XG4gICAgY29uc3QgaWQgPSBzcGVha2VyPy5pZCAhPSBudWxsID8gU3RyaW5nKHNwZWFrZXIuaWQpIDogJyc7XG4gICAgcmV0dXJuIGlkID8gaWQuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKSA6ICc/JztcbiAgfVxuXG4gIG1hcEF0dGVuZGVlc1RvQ2FyZERhdGEoYXR0ZW5kZWVzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXR0ZW5kZWVzKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhdHRlbmRlZXMubWFwKChhOiBhbnkpID0+ICh7XG4gICAgICBuYW1lOiBTdHJpbmcoYS5uYW1lID8/ICcnKS50cmltKCksXG4gICAgICBjb21wYW55OlxuICAgICAgICBhLmNvbXBhbnkgIT0gbnVsbCAmJiBTdHJpbmcoYS5jb21wYW55KS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYS5jb21wYW55KS50cmltKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBqb2JUaXRsZTpcbiAgICAgICAgYS5qb2JUaXRsZSAhPSBudWxsICYmIFN0cmluZyhhLmpvYlRpdGxlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYS5qb2JUaXRsZSkudHJpbSgpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgcGhvdG86XG4gICAgICAgIGEucGhvdG8gIT0gbnVsbCAmJiBTdHJpbmcoYS5waG90bykudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKGEucGhvdG8pLnRyaW0oKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIGlkOiBhLmlkID8/IGEudXNlcklkID8/IGEuX2lkID8/IGEuYXR0ZW5kZWVJZCA/PyB1bmRlZmluZWQsXG4gICAgICBpbnRlcmVzdHM6XG4gICAgICAgIGEuaW50ZXJlc3RzICE9IG51bGwgJiYgU3RyaW5nKGEuaW50ZXJlc3RzKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYS5pbnRlcmVzdHMpLnRyaW0oKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBhLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKGEuZGVzY3JpcHRpb24pLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICA/IFN0cmluZyhhLmRlc2NyaXB0aW9uKS50cmltKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB1c2VyVmlkZW9zTW9kZWw6IGEudXNlclZpZGVvc01vZGVsXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdXJsOlxuICAgICAgICAgICAgICBhLnVzZXJWaWRlb3NNb2RlbD8udXJsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnVybCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgID8gU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnVybCkudHJpbSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOlxuICAgICAgICAgICAgICBhLnVzZXJWaWRlb3NNb2RlbD8udGh1bWJuYWlsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnRodW1ibmFpbCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgID8gU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnRodW1ibmFpbCkudHJpbSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgIH0pKTtcbiAgfVxuXG4gIG1hcFNwZWFrZXJzVG9DYXJkRGF0YShzcGVha2VyczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNwZWFrZXJzKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBzcGVha2Vycy5tYXAoKHM6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcmF3RGVzYyA9XG4gICAgICAgIHMuZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBTdHJpbmcocy5kZXNjcmlwdGlvbikudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHMuZGVzY3JpcHRpb24pLnRyaW0oKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcmF3RGVzY1xuICAgICAgICA/IC88W2Etel1bXFxzXFxTXSo+L2kudGVzdChyYXdEZXNjKVxuICAgICAgICAgID8gdGhpcy5zdHJpcEh0bWwocmF3RGVzYylcbiAgICAgICAgICA6IHJhd0Rlc2NcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3QgcmF3VGl0bGUgPSBzLnRpdGxlID8/IHMuam9iVGl0bGU7XG4gICAgICBjb25zdCBqb2JUaXRsZSA9XG4gICAgICAgIHJhd1RpdGxlICE9IG51bGwgJiYgU3RyaW5nKHJhd1RpdGxlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcocmF3VGl0bGUpLnRyaW0oKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHRoaXMuZ2V0U3BlYWtlckRpc3BsYXlOYW1lKHMpLFxuICAgICAgICBjb21wYW55OlxuICAgICAgICAgIHMuY29tcGFueSAhPSBudWxsICYmIFN0cmluZyhzLmNvbXBhbnkpLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKHMuY29tcGFueSkudHJpbSgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGpvYlRpdGxlLFxuICAgICAgICBwaG90bzogdGhpcy5nZXRTcGVha2VyUGhvdG9VcmwocyksXG4gICAgICAgIGlkOiBzLmlkID8/IHMudXNlcklkID8/IHMuX2lkID8/IHMuc3BlYWtlcklkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJlc3RzOlxuICAgICAgICAgIHMuaW50ZXJlc3RzICE9IG51bGwgJiYgU3RyaW5nKHMuaW50ZXJlc3RzKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IFN0cmluZyhzLmludGVyZXN0cykudHJpbSgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB1c2VyVmlkZW9zTW9kZWw6IHMudXNlclZpZGVvc01vZGVsXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHVybDpcbiAgICAgICAgICAgICAgICBzLnVzZXJWaWRlb3NNb2RlbD8udXJsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBTdHJpbmcocy51c2VyVmlkZW9zTW9kZWwudXJsKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICAgICAgICA/IFN0cmluZyhzLnVzZXJWaWRlb3NNb2RlbC51cmwpLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICB0aHVtYm5haWw6XG4gICAgICAgICAgICAgICAgcy51c2VyVmlkZW9zTW9kZWw/LnRodW1ibmFpbCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgU3RyaW5nKHMudXNlclZpZGVvc01vZGVsLnRodW1ibmFpbCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgPyBTdHJpbmcocy51c2VyVmlkZW9zTW9kZWwudGh1bWJuYWlsKS50cmltKClcbiAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgbWFwU3BvbnNvcnNUb0NhcmREYXRhKHNwb25zb3JzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3BvbnNvcnMpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHNwb25zb3JzLm1hcCgoczogYW55KSA9PiB7XG4gICAgICBjb25zdCByYXdEZXNjID1cbiAgICAgICAgcy5ib290aERlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKHMuYm9vdGhEZXNjcmlwdGlvbikudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHMuYm9vdGhEZXNjcmlwdGlvbikudHJpbSgpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSByYXdEZXNjXG4gICAgICAgID8gLzxbYS16XVtcXHNcXFNdKj4vaS50ZXN0KHJhd0Rlc2MpXG4gICAgICAgICAgPyB0aGlzLnN0cmlwSHRtbChyYXdEZXNjKVxuICAgICAgICAgIDogcmF3RGVzY1xuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCB1cmxTbHVnID1cbiAgICAgICAgcy51cmwgPz9cbiAgICAgICAgcy5ib290aFVybCA/P1xuICAgICAgICAocy5ib290aElEICE9IG51bGwgPyBTdHJpbmcocy5ib290aElEKSA6IG51bGwpID8/XG4gICAgICAgIChzLmJvb3RoSWQgIT0gbnVsbCA/IFN0cmluZyhzLmJvb3RoSWQpIDogbnVsbCk7XG4gICAgICBjb25zdCBsb2dvVXJsID1cbiAgICAgICAgcy5sb2dvVXJsICE9IG51bGwgJiYgU3RyaW5nKHMubG9nb1VybCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHMubG9nb1VybCkudHJpbSgpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lICE9IG51bGwgPyBTdHJpbmcocy5uYW1lKS50cmltKCkgOiAnJyxcbiAgICAgICAgd2Vic2l0ZTpcbiAgICAgICAgICBzLndlYnNpdGUgIT0gbnVsbCAmJiBTdHJpbmcocy53ZWJzaXRlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IFN0cmluZyhzLndlYnNpdGUpLnRyaW0oKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBjYXRlZ29yeTogcy5jYXRlZ29yeSAhPSBudWxsID8gU3RyaW5nKHMuY2F0ZWdvcnkpLnRyaW0oKSA6IG51bGwsXG4gICAgICAgIGJvb3RoSUQ6IHMuYm9vdGhJRCA/PyBzLmJvb3RoSWQgPz8gbnVsbCxcbiAgICAgICAgYm9vdGhUaXRsZTogcy5ib290aFRpdGxlICE9IG51bGwgPyBTdHJpbmcocy5ib290aFRpdGxlKS50cmltKCkgOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgICAgIC8qKiBCb290aCBVUkwgc2x1ZyBmb3Igcm91dGluZyB0byBkZXRhaWwgcGFnZSAoZS5nLiBldmVudHMvOmV2ZW50VXJsL3Nwb25zb3JzL2Jvb3Rocy86dXJsKS4gKi9cbiAgICAgICAgdXJsOiB1cmxTbHVnICE9IG51bGwgPyBTdHJpbmcodXJsU2x1ZykudHJpbSgpIDogbnVsbCxcbiAgICAgICAgbG9nb1VybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGdldF9ldmVudF9ib290aHMgcmVzdWx0cyBpbnRvIHRoZSBzYW1lIHNoYXBlIHVzZWQgYnkgc3BvbnNvciBjYXJkcy5cbiAgICovXG4gIG1hcEJvb3Roc1RvQ2FyZERhdGEoYm9vdGhzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYm9vdGhzKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBib290aHMubWFwKChiOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHJhd0Rlc2MgPVxuICAgICAgICBiLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKGIuZGVzY3JpcHRpb24pLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICA/IFN0cmluZyhiLmRlc2NyaXB0aW9uKS50cmltKClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHJhd0Rlc2NcbiAgICAgICAgPyAvPFthLXpdW1xcc1xcU10qPi9pLnRlc3QocmF3RGVzYylcbiAgICAgICAgICA/IHRoaXMuc3RyaXBIdG1sKHJhd0Rlc2MpXG4gICAgICAgICAgOiByYXdEZXNjXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IHVybFNsdWcgPVxuICAgICAgICBiLnVybCA/P1xuICAgICAgICBiLmJvb3RoVXJsID8/XG4gICAgICAgIChiLmJvb3RoSWQgIT0gbnVsbCA/IFN0cmluZyhiLmJvb3RoSWQpIDogbnVsbCkgPz9cbiAgICAgICAgKGIuYm9vdGhJRCAhPSBudWxsID8gU3RyaW5nKGIuYm9vdGhJRCkgOiBudWxsKTtcbiAgICAgIGNvbnN0IGxvZ29VcmwgPVxuICAgICAgICBiLmxvZ29VcmwgIT0gbnVsbCAmJiBTdHJpbmcoYi5sb2dvVXJsKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYi5sb2dvVXJsKS50cmltKClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBiLmNvbXBhbnkgIT0gbnVsbCA/IFN0cmluZyhiLmNvbXBhbnkpLnRyaW0oKSA6ICcnLFxuICAgICAgICB3ZWJzaXRlOlxuICAgICAgICAgIGIud2Vic2l0ZSAhPSBudWxsICYmIFN0cmluZyhiLndlYnNpdGUpLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKGIud2Vic2l0ZSkudHJpbSgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGNhdGVnb3J5OiBudWxsLFxuICAgICAgICBib290aElEOiBiLmJvb3RoSWQgPz8gYi5ib290aElEID8/IG51bGwsXG4gICAgICAgIGJvb3RoVGl0bGU6IGIuYm9vdGhUaXRsZSAhPSBudWxsID8gU3RyaW5nKGIuYm9vdGhUaXRsZSkudHJpbSgpIDogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICAvKiogQm9vdGggVVJMIHNsdWcgZm9yIHJvdXRpbmcgdG8gZGV0YWlsIHBhZ2UgKGUuZy4gZXZlbnRzLzpldmVudFVybC9zcG9uc29ycy9ib290aHMvOnVybCkuICovXG4gICAgICAgIHVybDogdXJsU2x1ZyAhPSBudWxsID8gU3RyaW5nKHVybFNsdWcpLnRyaW0oKSA6IG51bGwsXG4gICAgICAgIGxvZ29VcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBnZXRfYm9vdGhfcmVwcmVzZW50YXRpdmVzIHJlc3VsdHMgaW50byB0aGUgc2FtZSBzaGFwZSBhcyBhdHRlbmRlZSBjYXJkcyAoZm9yIHJldXNlIG9mIGF0dGVuZGVlIGRlc2lnbikuXG4gICAqL1xuICBtYXBCb290aFJlcHNUb0NhcmREYXRhKHJlcHJlc2VudGF0aXZlczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcHJlc2VudGF0aXZlcykpIHJldHVybiBbXTtcbiAgICByZXR1cm4gcmVwcmVzZW50YXRpdmVzLm1hcCgocjogYW55KSA9PiB7XG4gICAgICBjb25zdCBmaXJzdCA9IHIuZmlyc3ROYW1lICE9IG51bGwgPyBTdHJpbmcoci5maXJzdE5hbWUpLnRyaW0oKSA6ICcnO1xuICAgICAgY29uc3QgbGFzdCA9IHIubGFzdE5hbWUgIT0gbnVsbCA/IFN0cmluZyhyLmxhc3ROYW1lKS50cmltKCkgOiAnJztcbiAgICAgIGNvbnN0IG5hbWUgPSBbZmlyc3QsIGxhc3RdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJyc7XG4gICAgICBjb25zdCB1c2VySWQgPVxuICAgICAgICByLnVzZXJJZCAhPSBudWxsICYmIFN0cmluZyhyLnVzZXJJZCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHIudXNlcklkKS50cmltKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNvbXBhbnk6XG4gICAgICAgICAgci5jb21wYW55ICE9IG51bGwgJiYgU3RyaW5nKHIuY29tcGFueSkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgPyBTdHJpbmcoci5jb21wYW55KS50cmltKClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgam9iVGl0bGU6XG4gICAgICAgICAgci5qb2JUaXRsZSAhPSBudWxsICYmIFN0cmluZyhyLmpvYlRpdGxlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IFN0cmluZyhyLmpvYlRpdGxlKS50cmltKClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgcGhvdG86XG4gICAgICAgICAgci5waG90b1BhdGggIT0gbnVsbCAmJiBTdHJpbmcoci5waG90b1BhdGgpLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKHIucGhvdG9QYXRoKS50cmltKClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgaW50ZXJlc3RzOiBudWxsLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICByLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKHIuZGVzY3JpcHRpb24pLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKHIuZGVzY3JpcHRpb24pLnRyaW0oKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB1c2VyVmlkZW9zTW9kZWw6IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGdldF9ldmVudF9zZXNzaW9uc192MiBwbGFpbi10ZXh0IGNvbnRlbnQgaW50byBzZXNzaW9uIG9iamVjdHMgZm9yIGNhcmRzLlxuICAgKiBGb3JtYXQ6IFwiRm91bmQgTiBzZXNzaW9uczpcXG4xLiA8dGl0bGU+XFxuICAgLSBUaW1lOiBTdGFydDogLi4uLCBFbmQ6IC4uLiwgVGltZVpvbmU6IC4uLlxcbiAgIC0gUm9vbTogLi4uXFxuICAgLSBUeXBlOiAuLi5cXG4yLiAuLi5cIlxuICAgKi9cbiAgcGFyc2VTZXNzaW9uQ29udGVudFYyKGNvbnRlbnQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSByZXR1cm4gW107XG4gICAgY29uc3Qgc2Vzc2lvbnM6IGFueVtdID0gW107XG4gICAgLy8gU3BsaXQgaW50byBibG9ja3MgYnkgXCIxLiBcIiwgXCIyLiBcIiwgZXRjLiAobnVtYmVyICsgZG90ICsgc3BhY2UgYXQgbGluZSBzdGFydClcbiAgICBjb25zdCBibG9ja1JlZ2V4ID0gL1xcblxcZCtcXC5cXHMrLztcbiAgICBjb25zdCBwYXJ0cyA9IGNvbnRlbnQuc3BsaXQoYmxvY2tSZWdleCk7XG4gICAgLy8gRmlyc3QgcGFydCBtYXkgYmUgXCJGb3VuZCBOIHNlc3Npb25zOlwiIG9yIHNpbWlsYXI7IHNraXAgaWYgaXQgZG9lc24ndCBsb29rIGxpa2UgYSBzZXNzaW9uIHRpdGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYmxvY2sgPSBwYXJ0c1tpXS50cmltKCk7XG4gICAgICBpZiAoIWJsb2NrKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGxpbmVzID0gYmxvY2tcbiAgICAgICAgLnNwbGl0KC9cXG4vKVxuICAgICAgICAubWFwKChsKSA9PiBsLnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gbGluZXNbMF0gfHwgJyc7XG4gICAgICBpZiAoIXRpdGxlIHx8IC9eRm91bmRcXHMrXFxkK1xccytzZXNzaW9ucy9pLnRlc3QodGl0bGUpKSBjb250aW51ZTtcbiAgICAgIGxldCBkYXRlVGltZVJhbmdlID0gJyc7XG4gICAgICBsZXQgcm9vbU5hbWUgPSAnJztcbiAgICAgIGxldCBzZXNzaW9uVHlwZSA9ICcnO1xuICAgICAgbGV0IHRpbWVab25lID0gJyc7XG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tqXTtcbiAgICAgICAgY29uc3QgdGltZU1hdGNoID0gbGluZS5tYXRjaCgvVGltZTpcXHMqKC4rKS9pKTtcbiAgICAgICAgaWYgKHRpbWVNYXRjaCkge1xuICAgICAgICAgIGRhdGVUaW1lUmFuZ2UgPSB0aW1lTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHR6TWF0Y2ggPSBkYXRlVGltZVJhbmdlLm1hdGNoKC9UaW1lWm9uZTpcXHMqKFteLFxcbl0rKS9pKTtcbiAgICAgICAgICBpZiAodHpNYXRjaCkgdGltZVpvbmUgPSB0ek1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb29tTWF0Y2ggPSBsaW5lLm1hdGNoKC9Sb29tOlxccyooLispL2kpO1xuICAgICAgICBpZiAocm9vbU1hdGNoKSB7XG4gICAgICAgICAgcm9vbU5hbWUgPSByb29tTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGVNYXRjaCA9IGxpbmUubWF0Y2goL1R5cGU6XFxzKiguKykvaSk7XG4gICAgICAgIGlmICh0eXBlTWF0Y2gpIHtcbiAgICAgICAgICBzZXNzaW9uVHlwZSA9IHR5cGVNYXRjaFsxXS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHpMaW5lTWF0Y2ggPSBsaW5lLm1hdGNoKC9UaW1lWm9uZTpcXHMqKC4rKS9pKTtcbiAgICAgICAgaWYgKHR6TGluZU1hdGNoICYmICF0aW1lWm9uZSkgdGltZVpvbmUgPSB0ekxpbmVNYXRjaFsxXS50cmltKCk7XG4gICAgICB9XG4gICAgICBzZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIHJvb21OYW1lOiByb29tTmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVUaW1lUmFuZ2U6IGRhdGVUaW1lUmFuZ2UgfHwgdW5kZWZpbmVkLFxuICAgICAgICBzZXNzaW9uVHlwZTogc2Vzc2lvblR5cGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICB0aW1lWm9uZTogdGltZVpvbmUgfHwgdW5kZWZpbmVkLFxuICAgICAgICBzZXNzaW9uUm9sZXM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzZXNzaW9ucztcbiAgfVxuXG4gIGdldFZpc2libGVTZXNzaW9uQ2FyZHMoY2hhdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGxpc3QgPSBjaGF0Py5zZXNzaW9uQ2FyZHMgPz8gW107XG4gICAgY29uc3QgdG90YWwgPSBsaXN0Lmxlbmd0aDtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRTZXNzaW9uQ2FyZElkc1tjaGF0Py5faWRdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHRvdGFsIC0gdGhpcy5TRVNTSU9OX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLlNFU1NJT05fQ0FSRFNfSU5JVElBTCk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgZ2V0VmlzaWJsZUF0dGVuZGVlQ2FyZHMoY2hhdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGxpc3QgPSBjaGF0Py5hdHRlbmRlZUNhcmRzID8/IFtdO1xuICAgIGNvbnN0IHRvdGFsID0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkQXR0ZW5kZWVDYXJkSWRzW2NoYXQ/Ll9pZF07XG4gICAgY29uc3QgcmVtYWluaW5nID0gdG90YWwgLSB0aGlzLkFUVEVOREVFX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLkFUVEVOREVFX0NBUkRTX0lOSVRJQUwpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGdldFZpc2libGVTcGVha2VyQ2FyZHMoY2hhdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGxpc3QgPSBjaGF0Py5zcGVha2VyQ2FyZHMgPz8gW107XG4gICAgY29uc3QgdG90YWwgPSBsaXN0Lmxlbmd0aDtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRTcGVha2VyQ2FyZElkc1tjaGF0Py5faWRdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHRvdGFsIC0gdGhpcy5TUEVBS0VSX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLlNQRUFLRVJfQ0FSRFNfSU5JVElBTCk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgZ2V0VmlzaWJsZVNwb25zb3JDYXJkcyhjaGF0OiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgbGlzdCA9IGNoYXQ/LnNwb25zb3JDYXJkcyA/PyBbXTtcbiAgICBjb25zdCB0b3RhbCA9IGxpc3QubGVuZ3RoO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZFNwb25zb3JDYXJkSWRzW2NoYXQ/Ll9pZF07XG4gICAgY29uc3QgcmVtYWluaW5nID0gdG90YWwgLSB0aGlzLlNQT05TT1JfQ0FSRFNfSU5JVElBTDtcbiAgICBpZiAocmVtYWluaW5nID4gNCAmJiAhZXhwYW5kZWQpIHtcbiAgICAgIHJldHVybiBsaXN0LnNsaWNlKDAsIHRoaXMuU1BPTlNPUl9DQVJEU19JTklUSUFMKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBnZXRWaXNpYmxlQm9vdGhSZXBDYXJkcyhjaGF0OiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgbGlzdCA9IGNoYXQ/LmJvb3RoUmVwQ2FyZHMgPz8gW107XG4gICAgY29uc3QgdG90YWwgPSBsaXN0Lmxlbmd0aDtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRCb290aFJlcENhcmRJZHNbY2hhdD8uX2lkXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSB0b3RhbCAtIHRoaXMuQk9PVEhfUkVQX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLkJPT1RIX1JFUF9DQVJEU19JTklUSUFMKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBleHBhbmRTZXNzaW9uQ2FyZHMoY2hhdDogYW55KTogdm9pZCB7XG4gICAgaWYgKGNoYXQ/Ll9pZCkge1xuICAgICAgdGhpcy5leHBhbmRlZFNlc3Npb25DYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkU2Vzc2lvbkNhcmRJZHMsXG4gICAgICAgIFtjaGF0Ll9pZF06IHRydWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kQXR0ZW5kZWVDYXJkcyhjaGF0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhdD8uX2lkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQXR0ZW5kZWVDYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkQXR0ZW5kZWVDYXJkSWRzLFxuICAgICAgICBbY2hhdC5faWRdOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGV4cGFuZFNwZWFrZXJDYXJkcyhjaGF0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhdD8uX2lkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkU3BlYWtlckNhcmRJZHMgPSB7XG4gICAgICAgIC4uLnRoaXMuZXhwYW5kZWRTcGVha2VyQ2FyZElkcyxcbiAgICAgICAgW2NoYXQuX2lkXTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBleHBhbmRTcG9uc29yQ2FyZHMoY2hhdDogYW55KTogdm9pZCB7XG4gICAgaWYgKGNoYXQ/Ll9pZCkge1xuICAgICAgdGhpcy5leHBhbmRlZFNwb25zb3JDYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkU3BvbnNvckNhcmRJZHMsXG4gICAgICAgIFtjaGF0Ll9pZF06IHRydWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kQm9vdGhSZXBDYXJkcyhjaGF0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhdD8uX2lkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQm9vdGhSZXBDYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkQm9vdGhSZXBDYXJkSWRzLFxuICAgICAgICBbY2hhdC5faWRdOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3Igc2Vzc2lvbiB0eXBlIG9uIGNhcmRzOiBcIlNlc3Npb24gdHlwZVwiIHdoZW4gaXNVbkV2ZW50LCBlbHNlIFwiTWVldGluZyB0eXBlXCIuXG4gICAqL1xuICBnZXRTZXNzaW9uVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNVbkV2ZW50XG4gICAgICA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ01lZXRpbmcgdHlwZScpIHx8ICdNZWV0aW5nIHR5cGUnXG4gICAgICA6IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ1Nlc3Npb24gdHlwZScpIHx8ICdTZXNzaW9uIHR5cGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBKb2luL1dhdGNoIHJvbGUgYnV0dG9ucyBmcm9tIHNlc3Npb24uc2Vzc2lvblJvbGVzIGZvciBzZXNzaW9uIGNhcmRzLlxuICAgKiBXaGVuIGlzVW5FdmVudCBpcyBmYWxzZSwgcmV0dXJucyBzaW5nbGUgXCJXYXRjaFwiIGJ1dHRvbiAoc2FtZSBhcyB0ZW1wbGF0ZTIpLiBXaGVuIHRydWUsIHJldHVybnMgSm9pbi9XYXRjaCBmcm9tIHNlc3Npb25Sb2xlcy5cbiAgICovXG4gIGdldFNlc3Npb25Sb2xlQnV0dG9ucyhzZXNzaW9uQ2FyZDogYW55KTogeyBhY3Rpb246IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10ge1xuICAgIGlmICh0aGlzLmlzVW5FdmVudCA9PT0gZmFsc2UgJiYgc2Vzc2lvbkNhcmQ/LnNlc3Npb24pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246ICdqb2luJyxcbiAgICAgICAgICBsYWJlbDogdGhpcy5nZXRUcmFuc2xhdGlvbignV2F0Y2gnKSB8fCAnV2F0Y2gnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gc2Vzc2lvbkNhcmQ/LnNlc3Npb24/LnNlc3Npb25Sb2xlcztcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3KSB8fCByYXcubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3Qgcm9sZXM6IHsgYWN0aW9uOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHJhdykge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIHR5cGVvZiByID09PSAnb2JqZWN0JyAmJiByICE9IG51bGwgJiYgci5zZXNzaW9uUm9sZU5hbWVcbiAgICAgICAgICA/IFN0cmluZyhyLnNlc3Npb25Sb2xlTmFtZSkudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IFN0cmluZyhyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChuYW1lID09PSAnam9pbicgfHwgbmFtZSA9PT0gJ3dhdGNoJykge1xuICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgbmFtZSA9PT0gJ2pvaW4nXG4gICAgICAgICAgICA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ0pvaW4nKSB8fCAnSm9pbidcbiAgICAgICAgICAgIDogdGhpcy5nZXRUcmFuc2xhdGlvbignV2F0Y2gnKSB8fCAnV2F0Y2gnO1xuICAgICAgICByb2xlcy5wdXNoKHsgYWN0aW9uOiBuYW1lLCBsYWJlbCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNlc3Npb24gaXMgb24tZGVtYW5kIChjbGFzc2lmaWNhdGlvbklkID09PSBlQ2xhc3NpZmljYXRpb25UeXBlLk9uRGVtYW5kKS5cbiAgICogV2hlbiB0cnVlLCBKb2luL1dhdGNoIGFyZSBhbHdheXMgYWN0aW9uYWJsZSBhbmQgY2FyZCB1c2VzIE9uRGVtYW5kIGRlc2lnbi5cbiAgICovXG4gIGlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb25DYXJkOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBpZCA9XG4gICAgICBzZXNzaW9uQ2FyZD8uc2Vzc2lvbj8uY2xhc3NpZmljYXRpb25JZCA/PyBzZXNzaW9uQ2FyZD8uY2xhc3NpZmljYXRpb25JZDtcbiAgICBpZiAoaWQgPT0gbnVsbCB8fCBpZCA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gU3RyaW5nKGlkKSA9PT0gZUNsYXNzaWZpY2F0aW9uVHlwZS5PbkRlbWFuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEpvaW4vV2F0Y2ggYWN0aW9uIGlzIHBvc3NpYmxlIChzYW1lIGxvZ2ljIGFzIGFwcCB0ZW1wbGF0ZTgpLlxuICAgKiBBY3Rpb24gaXMgYWxsb3dlZCB3aGVuOiBvbi1kZW1hbmQgc2Vzc2lvbiBPUiBpc0J1dHRvbkFjdGl2YXRlZCAoc2Vzc2lvbiBoYXMgc3RhcnRlZCkuXG4gICAqL1xuICBjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uQ2FyZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzZXNzaW9uQ2FyZD8uc2Vzc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHMgPSBzZXNzaW9uQ2FyZC5zZXNzaW9uO1xuICAgIGlmICh0aGlzLmlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb25DYXJkKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhcy5pc0J1dHRvbkFjdGl2YXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1lIGxvZ2ljIGFzIGFwcCB0ZW1wbGF0ZTg6IGRlbGF5IGluIG1pbnV0ZXMgKHNjaGVkdWxlZCBzdGFydCAtIGFjdHVhbCBzdGFydCkuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIGVpdGhlciBkYXRlIG1pc3Npbmc7ID4gMCB3aGVuIG1lZXRpbmcgaXMgZGVsYXllZC5cbiAgICovXG4gIGdldE1lZXRpbmdEZWxheU1pbnV0ZXMoc2Vzc2lvbkNhcmQ6IGFueSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcyA9IHNlc3Npb25DYXJkPy5zZXNzaW9uO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGFydERhdGUgPSBzLmRhdGVUaW1lUmFuZ2U/LnN0YXJ0O1xuICAgIGNvbnN0IGFjdHVhbFN0YXJ0ID0gcy5hY3R1YWxEYXRlVGltZVJhbmdlPy5zdGFydDtcbiAgICBpZiAoIXN0YXJ0RGF0ZSB8fCAhYWN0dWFsU3RhcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRpZmZNcyA9XG4gICAgICAgIG5ldyBEYXRlKHN0YXJ0RGF0ZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYWN0dWFsU3RhcnQpLmdldFRpbWUoKTtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGRpZmZNcyAvICgxMDAwICogNjApKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBtZWV0aW5nIGlzIGRlbGF5ZWQgKHNhbWUgY29uZGl0aW9uIGFzIHRlbXBsYXRlODogZGVsYXkgbWludXRlcyA+IDAsIG5vdCBvbi1kZW1hbmQsIGJ1dHRvbiBub3QgYWN0aXZhdGVkKS4gKi9cbiAgaXNNZWV0aW5nRGVsYXllZChzZXNzaW9uQ2FyZDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLmdldE1lZXRpbmdEZWxheU1pbnV0ZXMoc2Vzc2lvbkNhcmQpO1xuICAgIGlmIChkZWxheSA9PSBudWxsIHx8IGRlbGF5IDw9IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1Nlc3Npb25PbmRlbWFuZChzZXNzaW9uQ2FyZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoc2Vzc2lvbkNhcmQ/LnNlc3Npb24/LmlzQnV0dG9uQWN0aXZhdGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblNlc3Npb25DYXJkQWN0aW9uKFxuICAgIHNlc3Npb25DYXJkOiBhbnksXG4gICAgcm9sZTogeyBhY3Rpb246IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXNlc3Npb25DYXJkPy5zZXNzaW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNVbkV2ZW50ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZXNzaW9uQWN0aW9ucy5lbWl0KHtcbiAgICAgICAgdHlwZTogJ3Nlc3Npb24nLFxuICAgICAgICBhY3Rpb246IHJvbGUuYWN0aW9uLFxuICAgICAgICBzZXNzaW9uOiBzZXNzaW9uQ2FyZC5zZXNzaW9uLFxuICAgICAgICBzZXNzaW9uQ2FyZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbG9zZUNoYXREcmF3ZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhblBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb25DYXJkKSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIHRoaXMuZ2V0VHJhbnNsYXRpb24oJ1lvdSBjYW4gam9pbi93YXRjaCBhdCB0aGUgc3RhcnRpbmcgdGltZScpIHx8XG4gICAgICAgICdZb3UgY2FuIGpvaW4vd2F0Y2ggYXQgdGhlIHN0YXJ0aW5nIHRpbWUnO1xuICAgICAgdGhpcy5zZXNzaW9uQWN0aW9uQmxvY2tlZC5lbWl0KG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlc3Npb25BY3Rpb25zLmVtaXQoe1xuICAgICAgdHlwZTogJ3Nlc3Npb24nLFxuICAgICAgYWN0aW9uOiByb2xlLmFjdGlvbixcbiAgICAgIHNlc3Npb246IHNlc3Npb25DYXJkLnNlc3Npb24sXG4gICAgICBzZXNzaW9uQ2FyZCxcbiAgICB9KTtcbiAgICB0aGlzLmNsb3NlQ2hhdERyYXdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUNoYXREcmF3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRyYXdlcj8uY2xvc2UoKTtcbiAgICAgIHRoaXMuc291cmNlc0RyYXdlcj8uY2xvc2UoKTtcbiAgICAgIHRoaXMuZWRpdG9yc0RyYXdlcj8uY2xvc2UoKTtcbiAgICB9IGNhdGNoIHt9XG4gICAgdGhpcy5jbG9zZUJvdC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy52b2ljZVRyYW5zY3JpcHRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuZGlzY29ubmVjdEFza1dlYlNvY2tldCgpO1xuICB9XG4gIGNoYW5nZVRlbXBlcmF0dXJlKG5ld1RlbXBlcmF0dXJlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy50ZW1wZXJhdHVyZSA9IG5ld1RlbXBlcmF0dXJlO1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGl2ZWdwdC1jaGF0LWJvdC13cmFwcGVyJyk7XG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHRoZW1lIGNsYXNzZXMgZnJvbSBib2R5XG4gICAgd3JhcHBlcj8uY2xhc3NMaXN0LnJlbW92ZSgnY3JlYXRpdmUnLCAnYmFsYW5jZWQnLCAncHJlY2lzZScpO1xuXG4gICAgc3dpdGNoIChuZXdUZW1wZXJhdHVyZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdjcmVhdGl2ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgnYmFsYW5jZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ3ByZWNpc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN0YXJ0QWdhaW4oKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSBmYWxzZTtcbiAgICB0aGlzLmNoYXRMb2cgPSBbXTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTogdGhpcy5ncmVldGluZ01zZyxcblxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgIH0pO1xuICAgIHRoaXMuYXJjaGl2ZU1lc3NhZ2VzKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhcmNoaXZlTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSxcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3QvY2xlYXItaGlzdG9yeS8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCB7fSwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgdHJpZ2dlclN1cHBvcnQoKSB7XG4gICAgdGhpcy5vcGVuU3VwcG9ydC5lbWl0KCk7XG4gIH1cbiAgZmV0Y2hCb3RDb25maWcoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90cz9ib3RfaWQ9JHt0aGlzLmJvdElkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ib3ROYW1lID0gdGhpcy5nZXRUcmFuc2xhdGlvbihyZXMuTmFtZSk7XG4gICAgICAgIHRoaXMuYm90SWNvbiA9IHJlcy5JY29uO1xuICAgICAgICB0aGlzLmJvdFNraWxscyA9IHJlcz8uU2tpbGxzO1xuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnID0gcmVzLkdyZWV0aW5nXG4gICAgICAgICAgPyAodGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkocmVzLkdyZWV0aW5nKSBhcyBhbnkpXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICB0aGlzLnRodW1ic0Rvd25NZXNzYWdlcyA9IHJlcz8uTmVnYXRpdmVSZXNwb25zZXM/Lmxlbmd0aFxuICAgICAgICAgID8gcmVzLk5lZ2F0aXZlUmVzcG9uc2VzXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VHJhbnNsYXRpb24oXG4gICAgICAgICAgICAgICAgYFdlIGFyZSBzb3JyeSB3ZSd2ZSBub3QgYmVlbiBhYmxlIHRvIGFuc3dlciB5b3VyIHF1ZXN0aW9uYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIHRoaXMucXVpY2tQcm9tcHRzID0gcmVzLlF1aWNrUHJvbXB0cztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmZXRjaENoYXRIaXN0b3J5KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleShcbiAgICAgIHRoaXMuYm90SWQsXG4gICAgICBmYWxzZSxcbiAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICApO1xuICAgIHRoaXMuY29uU2Vzc2lvbktleSA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRTZXNzaW9uS2V5KFxuICAgICAgdGhpcy5ib3RJZCxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhpcy5ldmVudElkLFxuICAgICk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uS2V5fT9zZXNzaW9uX2lkPSR7dGhpcy5jb25TZXNzaW9uS2V5fWA7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KHVybCwgeyBoZWFkZXJzIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3I8YW55PignZmV0Y2hDb252ZXJzYXRpb24nKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcjxUPihvcGVyYXRpb24gPSAnb3BlcmF0aW9uJywgcmVzdWx0PzogVCkge1xuICAgIHJldHVybiAoZXJyb3I6IGFueSk6IE9ic2VydmFibGU8VD4gPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIG9mKHJlc3VsdCBhcyBUKTtcbiAgICB9O1xuICB9XG4gIC8vIGZldGNoQ2hhdEhpc3RvcnkoKSB7XG4gIC8vICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgLy8gICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gIC8vICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gIC8vICAgfSk7XG4gIC8vICAgcmV0dXJuIHRoaXMuaHR0cFxuICAvLyAgICAgLmdldChgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25LZXl9YCwgeyBoZWFkZXJzIH0pXG4gIC8vICAgICAucGlwZShcbiAgLy8gICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAvLyAgICAgICAgIHJldHVybiBvZihyZXMpO1xuICAvLyAgICAgICB9KSxcbiAgLy8gICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTogJywgZXJyb3IpO1xuICAvLyAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAvLyAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgLy8gICAgICAgfSlcbiAgLy8gICAgICk7XG4gIC8vIH1cblxuICAvKiogUHVzaCBhIHN0YW5kYXJkIEFJIG1lc3NhZ2UgZnJvbSBoaXN0b3J5IChzb3VyY2VzLCBncmFwaHMsIGV0Yy4pLiBVc2VkIHdoZW4gbm90IGNvbnZlcnRpbmcgdG8gc2Vzc2lvbl9jYXJkcy4gKi9cbiAgcHJpdmF0ZSBwdXNoQWlNZXNzYWdlRnJvbUhpc3RvcnkoY2hhdDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlc0xpc3QgPSBjaGF0LldlYkxpbmtzIHx8IFtdO1xuICAgIGNvbnN0IGRpc3BsYXllZFNvdXJjZXMgPSAoY2hhdC5XZWJMaW5rcyB8fCBbXSkuc2xpY2UoMCwgMyk7XG4gICAgY29uc3QgcmVtYWluaW5nU291cmNlcyA9IChjaGF0LldlYkxpbmtzIHx8IFtdKS5zbGljZSgzKTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KSxcbiAgICAgIGV4ZWN1dGlvbkdyYXBoczogY2hhdC5FeGVjdXRpb25HcmFwaHMsXG4gICAgICBncmFwaHM6IGNoYXQuR3JhcGhzLFxuICAgICAgc2VhcmNoVGVybXM6IGNoYXQuU2VhcmNoVGVybXMsXG4gICAgICBzb3VyY2VzTGlzdDogc291cmNlc0xpc3QsXG4gICAgICBkaXNwbGF5ZWRTb3VyY2VzOiBkaXNwbGF5ZWRTb3VyY2VzLFxuICAgICAgcmVtYWluaW5nU291cmNlczogcmVtYWluaW5nU291cmNlcyxcbiAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgIH0pO1xuICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICB9XG5cbiAgbWFwQ2hhdEhpc3RvcnkoY2hhdHM6IGFueSkge1xuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICdhaScsXG4gICAgICBtZXNzYWdlOiB0aGlzLmdyZWV0aW5nTXNnLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgIH0pO1xuICAgIGlmIChjaGF0cyAmJiBjaGF0cz8uTWVzc2FnZXM/Lmxlbmd0aCkge1xuICAgICAgY2hhdHM/Lk1lc3NhZ2VzLmZvckVhY2goKGNoYXQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2hhdC5UeXBlID09ICd1c2VyJykge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dCksXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIGNoYXQuSW5zZXJ0VGltZXN0YW1wKSxcbiAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICAgICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxuICAgICAgICAgICAgV29ya2Zsb3dFeGVjdXRpb25JZDogY2hhdC5Xb3JrZmxvd0V4ZWN1dGlvbklkLFxuICAgICAgICAgICAgX2lkOiBjaGF0Ll9pZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdC5UeXBlID09ICdhaScpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIEFJIG1lc3NhZ2UgY2FtZSBmcm9tIHNlc3Npb24gdG9vbHMsIHNob3cgc2Vzc2lvbiBjYXJkcyBpbnN0ZWFkIG9mIHBsYWluIHRleHRcbiAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IGNoYXQudG9vbHJlc3VsdHM/LnRvb2xfbmFtZTtcbiAgICAgICAgICBjb25zdCBpc1Nlc3Npb25Ub29sID1cbiAgICAgICAgICAgIHRvb2xOYW1lID09PSAnZ2V0X2V2ZW50X3Nlc3Npb25zJyB8fFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc2Vzc2lvbnNfdjInIHx8XG4gICAgICAgICAgICB0b29sTmFtZSA9PT0gJ2dldF9zZXNzaW9uc19ieV9pbnRlcmVzdCcgfHxcbiAgICAgICAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3Nlc3Npb25zX2J5X3RyYWNrJyB8fFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfc3BlYWtlcl9zZXNzaW9ucycgfHxcbiAgICAgICAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3VwY29taW5nX3Nlc3Npb25zJyB8fFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfbXlfYWdlbmRhJztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1Nlc3Npb25Ub29sICYmXG4gICAgICAgICAgICBjaGF0LnRvb2xyZXN1bHRzPy50b29sX3Jlc3VsdD8ubWVzc2FnZXM/LlswXT8uY29udGVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudFN0ciA9IGNoYXQudG9vbHJlc3VsdHMudG9vbF9yZXN1bHQubWVzc2FnZXNbMF0uY29udGVudDtcbiAgICAgICAgICAgIGxldCBzZXNzaW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgICAgICAgIHNlc3Npb25zID0gcGFyc2VkPy5zZXNzaW9ucyA/PyBbXTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbnMgPSB0aGlzLnBhcnNlU2Vzc2lvbkNvbnRlbnRWMihjb250ZW50U3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwU2Vzc2lvbnNUb0NhcmREYXRhKHNlc3Npb25zKTtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU3BlYWtlcnNGb3JTZXNzaW9uQ2FyZHMobWFwcGVkKTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgX2lkOiBjaGF0Ll9pZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2Vzc2lvbl9jYXJkcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dClcbiAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgc2Vzc2lvbkNhcmRzOiBtYXBwZWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9hdHRlbmRlZXMnICYmXG4gICAgICAgICAgICBjaGF0LnRvb2xyZXN1bHRzPy50b29sX3Jlc3VsdD8ubWVzc2FnZXM/LlswXT8uY29udGVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBBSSBtZXNzYWdlIGNhbWUgZnJvbSBnZXRfZXZlbnRfYXR0ZW5kZWVzLCBzaG93IGF0dGVuZGVlIGNhcmRzIG9uIGluaXRpYWwgaGlzdG9yeSBsb2FkXG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3RyID0gY2hhdC50b29scmVzdWx0cy50b29sX3Jlc3VsdC5tZXNzYWdlc1swXS5jb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW5kZWVzID0gcGFyc2VkPy5hdHRlbmRlZXMgPz8gW107XG4gICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwQXR0ZW5kZWVzVG9DYXJkRGF0YShhdHRlbmRlZXMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2F0dGVuZGVlX2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoYXQuVGV4dFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dClcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVDYXJkczogbWFwcGVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9zcGVha2VycycgJiZcbiAgICAgICAgICAgIGNoYXQudG9vbHJlc3VsdHM/LnRvb2xfcmVzdWx0Py5tZXNzYWdlcz8uWzBdPy5jb250ZW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIEFJIG1lc3NhZ2UgY2FtZSBmcm9tIGdldF9ldmVudF9zcGVha2Vycywgc2hvdyBzcGVha2VyIGNhcmRzIG9uIGluaXRpYWwgaGlzdG9yeSBsb2FkXG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3RyID0gY2hhdC50b29scmVzdWx0cy50b29sX3Jlc3VsdC5tZXNzYWdlc1swXS5jb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgICAgICAgY29uc3Qgc3BlYWtlcnMgPSBwYXJzZWQ/LnNwZWFrZXJzID8/IHBhcnNlZD8uc3BlYWtlciA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTcGVha2Vyc1RvQ2FyZERhdGEoc3BlYWtlcnMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3NwZWFrZXJfY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgICBzcGVha2VyQ2FyZHM6IG1hcHBlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc3BvbnNvcnMnICYmXG4gICAgICAgICAgICBjaGF0LnRvb2xyZXN1bHRzPy50b29sX3Jlc3VsdD8ubWVzc2FnZXM/LlswXT8uY29udGVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBBSSBtZXNzYWdlIGNhbWUgZnJvbSBnZXRfZXZlbnRfc3BvbnNvcnMsIHNob3cgc3BvbnNvciBjYXJkcyBvbiBpbml0aWFsIGhpc3RvcnkgbG9hZFxuICAgICAgICAgICAgY29uc3QgY29udGVudFN0ciA9IGNoYXQudG9vbHJlc3VsdHMudG9vbF9yZXN1bHQubWVzc2FnZXNbMF0uY29udGVudDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgICAgICAgIGNvbnN0IHNwb25zb3JzID0gcGFyc2VkPy5zcG9uc29ycyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTcG9uc29yc1RvQ2FyZERhdGEoc3BvbnNvcnMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Nwb25zb3JfY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgICBzcG9uc29yQ2FyZHM6IG1hcHBlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfYm9vdGhzJyAmJlxuICAgICAgICAgICAgY2hhdC50b29scmVzdWx0cz8udG9vbF9yZXN1bHQ/Lm1lc3NhZ2VzPy5bMF0/LmNvbnRlbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgQUkgbWVzc2FnZSBjYW1lIGZyb20gZ2V0X2V2ZW50X2Jvb3Rocywgc2hvdyBib290aCBjYXJkcyB1c2luZyBzcG9uc29yIGNhcmQgZGVzaWduXG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3RyID0gY2hhdC50b29scmVzdWx0cy50b29sX3Jlc3VsdC5tZXNzYWdlc1swXS5jb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgICAgICAgY29uc3QgYm9vdGhzID0gcGFyc2VkPy5ib290aHMgPz8gW107XG4gICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwQm9vdGhzVG9DYXJkRGF0YShib290aHMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Nwb25zb3JfY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgICBzcG9uc29yQ2FyZHM6IG1hcHBlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfYm9vdGhfcmVwcmVzZW50YXRpdmVzJyAmJlxuICAgICAgICAgICAgY2hhdC50b29scmVzdWx0cz8udG9vbF9yZXN1bHQ/Lm1lc3NhZ2VzPy5bMF0/LmNvbnRlbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgQUkgbWVzc2FnZSBjYW1lIGZyb20gZ2V0X2Jvb3RoX3JlcHJlc2VudGF0aXZlcywgc2hvdyBib290aCByZXAgY2FyZHMgKGF0dGVuZGVlIGRlc2lnbilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdHIgPSBjaGF0LnRvb2xyZXN1bHRzLnRvb2xfcmVzdWx0Lm1lc3NhZ2VzWzBdLmNvbnRlbnQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRTdHIpO1xuICAgICAgICAgICAgICBjb25zdCByZXByZXNlbnRhdGl2ZXMgPSBwYXJzZWQ/LnJlcHJlc2VudGF0aXZlcyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBCb290aFJlcHNUb0NhcmREYXRhKHJlcHJlc2VudGF0aXZlcyk7XG4gICAgICAgICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIF9pZDogY2hhdC5faWQsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vdGhfcmVwX2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoYXQuVGV4dFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dClcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgICAgICAgICAgICAgYm9vdGhSZXBDYXJkczogbWFwcGVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIShtZXNzYWdlPy5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdoZXJlIGlzIG15IG1lc3NhZ2UnKVxuICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UudHJpbSgpO1xuXG4gICAgY29uc3QgbWFya2Rvd25MaW5rUmVnZXggPSAvXFxbKFteW10rKV1cXCgoW14pXSspXFwpL2c7XG4gICAgY29uc3QgdXJsUmVnZXggPSAvKD88IWhyZWY9XCIpXFxiaHR0cHM/OlxcL1xcL1xcUysoPzwhWy4sXSkvZ2k7XG5cbiAgICBpZiAobWFya2Rvd25MaW5rUmVnZXgudGVzdChtZXNzYWdlKSkge1xuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgICAgbWFya2Rvd25MaW5rUmVnZXgsXG4gICAgICAgICc8YSBocmVmPVwiJDJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nLFxuICAgICAgKTtcbiAgICAgIC8vY29uc29sZS5sb2coJ1Nhbml0aXplZCBtZXNzYWdlOiAnLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplSHRtbChodG1sKTtcbiAgICB9XG5cbiAgICBpZiAodXJsUmVnZXgudGVzdChtZXNzYWdlKSkge1xuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgICAgdXJsUmVnZXgsXG4gICAgICAgICc8YSBocmVmPVwiJCZcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kJjwvYT4nLFxuICAgICAgKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdTYW5pdGl6ZWQgbWVzc2FnZTogJywgbWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XG4gICAgfVxuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csICc8YnI+Jyk7XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyB0byBIVE1MIGhlYWRlcnNcbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBjb25zdCBzYW5pdGl6ZWRNZXNzYWdlID0gdGhpcy5zYW5pdGl6ZUh0bWwobWVzc2FnZSk7XG4gICAgcmV0dXJuIHNhbml0aXplZE1lc3NhZ2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgY29uc3QgZmVlZGJhY2tMaW5rcyA9XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmVlZGJhY2stbGluaycpO1xuICAgIGZlZWRiYWNrTGlua3MuZm9yRWFjaCgobGluazogYW55KSA9PiB7XG4gICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdjbGljaycsXG4gICAgICAgIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjay1saW5rJykpIHtcbiAgICAvLyAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XG4gICAgLy8gICAgIC5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2stbGluaycpXG4gICAgLy8gICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSk7XG4gICAgLy8gfVxuICB9XG5cbiAgc2FuaXRpemVIdG1sKGh0bWw6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbCk7XG4gIH1cblxuICBvbkZlZWRiYWNrQ2xpY2sodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZmVlZGJhY2tFdmVudC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgICB0aGlzLm9uQ2xvc2VFdmVudC5lbWl0KCk7XG4gIH1cblxuICBzZW5kTWVzc2FnZVdpdGhUaWxlKHByb21wdDogc3RyaW5nKSB7XG4gICAgdGhpcy5pbnB1dCA9IHByb21wdDtcbiAgICB0aGlzLmZldGNoRGF0YSgpO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgfVxuICBpc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgZmV0Y2hEYXRhKG1zZyA9IG51bGwpIHtcbiAgICB0aGlzLmlucHV0ID0gbXNnIHx8IHRoaXMuaW5wdXQ/LnRyaW0oKTtcbiAgICB0aGlzLm1zZyA9IHRoaXMuaW5wdXQ7XG4gICAgaWYgKCF0aGlzLmlucHV0IHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KHRoaXMuaW5wdXQpLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdoaWRkZW4nOyAvLyBSZXNldCB0aGUgaGVpZ2h0XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBgNjJweGA7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG5cbiAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KHRoaXMuaW5wdXQsIHRoaXMuYWdlbnRzLCB0aGlzLmNvbnZlcnNhdGlvbktleSk7XG4gIH1cbiAgZmV0Y2hEYXRhRm9yKG1zZywgY2hhdCkge1xuICAgIGNvbnN0IGlucHV0TXNnID0gbXNnPy50cmltKCk7XG4gICAgaWYgKCFpbnB1dE1zZyB8fCB0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNoYXQucmVsYXRlZExpc3RJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGlucHV0TXNnKSxcbiAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG5cbiAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KGlucHV0TXNnLCB0aGlzLmFnZW50cywgdGhpcy5jb252ZXJzYXRpb25LZXksIG1zZywgY2hhdCk7XG4gIH1cbiAgZmV0Y2hTbWFsbFRhbGsoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2JvdC9zbWFsbC10YWxrLyR7dGhpcy5ib3RJZH0vJHt0aGlzLnVzZXJJZH1gO1xuXG4gICAgdGhpcy5odHRwXG4gICAgICAuZ2V0PHsgc21hbGxUYWxrOiBzdHJpbmcgfT4odXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2hpbGUgZmV0Y2hpbmcgc21hbGwgdGFsazonLCBlcnJvcik7XG5cbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc21hbGxUYWxrKSB7XG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2UocmVzcG9uc2Uuc21hbGxUYWxrKSxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDI7XG4gICAgICAgICAgLy8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlYWRBbGxDaHVua3MgPSAoc3RyZWFtOiBhbnkpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgY29uc3QgYWxsU3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWFkZXIuY2xvc2VkLmNhdGNoKChlcnI6IGFueSkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWFkaW5nIHN0cmVhbTogJywgZXJyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgc3RhcnQ6IChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1bXAoY29udHJvbGxlciwgcmVhZGVyLCBhbGxTdWdnZXN0aW9ucyk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHB1bXAoY29udHJvbGxlcjogYW55LCByZWFkZXI6IGFueSwgYWxsU3VnZ2VzdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgcmVhZGVyLnJlYWQoKS50aGVuKCh7IGRvbmUsIHZhbHVlIH06IGFueSkgPT4ge1xuICAgICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLmNoYXRMb2dbdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBsYXN0SXRlbS5tZXNzYWdlID0gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkobGFzdEl0ZW0ubWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY2hhdExvZy5wb3AoKTtcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2gobGFzdEl0ZW0pO1xuICAgICAgICBpZiAoYWxsU3VnZ2VzdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdzdWdnZXN0aW9ucycsXG4gICAgICAgICAgICBzdWdnZXN0aW9uczogYWxsU3VnZ2VzdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSB0cnVlO1xuXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgIHRoaXMuZmV0Y2hTbWFsbFRhbGsoKTtcbiAgICAgICAgLy8gfSwxMDAwKVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkZWNvZGVkQ2h1bmsgPSB0aGlzLmRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuYWlSZXNwb25zZSArPSBkZWNvZGVkQ2h1bms7XG4gICAgICBpZiAobGFzdEl0ZW0udHlwZSA9PT0gJ2FpJykge1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9uc01hdGNoID0gdGhpcy5haVJlc3BvbnNlLm1hdGNoKC88c3VnPiguKj8pPFxcL3N1Zz4vZyk7XG4gICAgICAgIGlmIChzdWdnZXN0aW9uc01hdGNoKSB7XG4gICAgICAgICAgc3VnZ2VzdGlvbnNNYXRjaC5mb3JFYWNoKChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5haVJlc3BvbnNlID0gdGhpcy5haVJlc3BvbnNlLnJlcGxhY2UobWF0Y2gsICcnKTtcbiAgICAgICAgICAgIGFsbFN1Z2dlc3Rpb25zLnB1c2gobWF0Y2g/LnJlcGxhY2UoLzxcXC8/c3VnPi9nLCAnJykpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdEl0ZW0ubWVzc2FnZSA9IHRoaXMuYWlSZXNwb25zZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuXG4gICAgICAgIGxldCBhaUZvcm1hdHRlZERhdGE6IGFueTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gJyk7XG4gICAgICAgICAgYWlGb3JtYXR0ZWREYXRhID0gSlNPTi5wYXJzZShKU09OLnBhcnNlKHRoaXMuYWlSZXNwb25zZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXJzaW5nIGpzb24gMicpO1xuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhID0gSlNPTi5wYXJzZSh0aGlzLmFpUmVzcG9uc2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uIGRvbmUnKTtcblxuICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhICYmIGFpRm9ybWF0dGVkRGF0YT8uc2VjdGlvbl9pZD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICdjb21wYW55X3NlYXJjaCcgfHxcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICd1c2VyX3NlYXJjaCcgfHxcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09ICdpbmR1c3RyeV9jb21wYW55X3NlYXJjaCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkID09IHRoaXMubXlVcGNvbWluZ1Nlc3Npb25BY3Rpb24pIHtcbiAgICAgICAgICAgIHZhciBzcGVha2VySWRzID0gW107XG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuY29udGVudD8uZm9yRWFjaCgoc2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgICBzcGVha2VySWRzID0gWy4uLnNwZWFrZXJJZHMsIC4uLnNlc3Npb24uc3BlYWtlcnNdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChzcGVha2VySWRzPy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICB0aGlzLmdldFNwZWFrZXJzQnlTdGFmZklkcyhzcGVha2VySWRzKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmFkZFRvTXlBZ2VuZGFBY3Rpb24gJiZcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xuICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxuICAgICAgICAgICAgICBzZXNzaW9uSWRzOiBhaUZvcm1hdHRlZERhdGEuY29udGVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLmNvbm5lY3RPckZvbGxvd0FjdGlvbikge1xuICAgICAgICAgICAgbGV0IHVzZXJzTGVuID0gYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh1c2Vyc0xlbiA+IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQ6ICdvcGVuX25ldHdvcmtpbmdfZHJhd2VyJyxcbiAgICAgICAgICAgICAgICBzZWFyY2g6IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlcnNMZW4gPT0gMSkge1xuICAgICAgICAgICAgICB0aGlzLm9wZW5QYWdlLm5leHQoe1xuICAgICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXG4gICAgICAgICAgICAgICAgY29ubmV0VXNlcklkczogW2FpRm9ybWF0dGVkRGF0YS5jb250ZW50WzBdLnVzZXJJZF0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuaXNfb3Blbl9wYWdlID09ICd0cnVlJykge1xuICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcbiAgICAgICAgICAgICAgc2VjdGlvbklkOiBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCxcbiAgICAgICAgICAgICAgc2VhcmNoOiBhaUZvcm1hdHRlZERhdGEuY29udGVudCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZUJyb3dzZXIoKSkge1xuICAgICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEubWVzc2FnZSArPVxuICAgICAgICAgICAgICAgICdcXG5cXG4nICsgJzxhIGlkPVwiY2xvc2VCb3ROb3dcIj5DbGljayBIZXJlPC9hPiB0byBzZWUgcmVzdWx0cy4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICBtZXNzYWdlOiBhaUZvcm1hdHRlZERhdGEubWVzc2FnZSxcbiAgICAgICAgICAgIGFjdGlvbjogYWlGb3JtYXR0ZWREYXRhLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVCcm93c2VyKCkpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmFkZENsb3NlQm90Q2xpY2tFdmVudCgpO1xuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5haVJlc3BvbnNlLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG5cbiAgICAgIC8vIEVucXVldWUgdGhlIG5leHQgZGF0YSBjaHVuayBpbnRvIG91ciB0YXJnZXQgc3RyZWFtXG4gICAgICBjb250cm9sbGVyLmVucXVldWUodmFsdWUpO1xuICAgICAgdGhpcy5wdW1wKGNvbnRyb2xsZXIsIHJlYWRlciwgYWxsU3VnZ2VzdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgc3VibWl0RmVlZGJhY2soZmxhZzogYm9vbGVhbiwgbWVzc2FnZSkge1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXG4gICAgdGhpcy5mZWVkYmFja0RvbmUgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgY29uc3QgY29udmVyc2F0aW9uX2lkID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleShcbiAgICAgIHRoaXMuYm90SWQsXG4gICAgICBmYWxzZSxcbiAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICApO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQUdFTlRTX0FQSX0vQ29udmVyc2F0aW9uL2NvUGlsb3QvJHt0aGlzLmJvdElkfS9jb252ZXJzYXRpb24vJHtjb252ZXJzYXRpb25faWR9L2hlbHBmdWwtcmVzcG9uc2VgO1xuICAgIGZldGNoKHVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIGFwaUtleTogJ0NvbnZlcnNhdGlvbl9XSXovcUFtK0VFbWZPa0ZhVUEvd2VBPT0nLFxuICAgICAgICAnaGl2ZS1ib3QtaWQnOiB0aGlzLmJvdElkLFxuICAgICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlSWQ6IG1lc3NhZ2UuX2lkLCBpc0hlbHBmdWw6IGZsYWcgfSksXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoZmxhZykge1xuICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgdGhpcy50aHVtYnNVcE1lc3NhZ2UgfHxcbiAgICAgICAgICAgIHRoaXMuZ2V0VHJhbnNsYXRpb24oJ01heSBJIGFzc2lzdCB5b3Ugd2l0aCBhbnl0aGluZyBlbHNlJyksXG4gICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgIGlzRmVlZGJhY2tNc2c6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZmVlZGJhY2tEb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKFxuICAgICAgICAgIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzW3RoaXMudGh1bWJzRG93bk1zZ0luZGV4XSxcbiAgICAgICAgKSxcbiAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnRodW1ic0Rvd25Nc2dJbmRleCA9XG4gICAgICAgICh0aGlzLnRodW1ic0Rvd25Nc2dJbmRleCArIDEpICUgdGhpcy50aHVtYnNEb3duTWVzc2FnZXMubGVuZ3RoO1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VwcG9ydExpbms4OCcpO1xuICAgICAgICBpZiAoc3VwcG9ydExpbmspIHtcbiAgICAgICAgICBzdXBwb3J0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudHJpZ2dlclN1cHBvcnQuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMCk7XG4gICAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gbnVsbDtcbiAgICB9KTtcbiAgfVxuICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIC8vIFByZXZlbnQgZGVmYXVsdCBiZWhhdmlvciAobmV3IGxpbmUpXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gQ2FsbCB5b3VyIHN1Ym1pdCBmdW5jdGlvblxuICAgICAgdGhpcy5oYW5kbGVTdWJtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVTdWJtaXQoZXZlbnQpIHtcbiAgICB0aGlzLmZldGNoRGF0YSgpO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgfVxuXG4gIC8qKiBJbmRleCBvZiB0aGUgbGFzdCBBSSBtZXNzYWdlIGluIGNoYXRMb2c7IC0xIGlmIG5vbmUuICovXG4gIGdldCBsYXN0QWlNZXNzYWdlSW5kZXgoKTogbnVtYmVyIHtcbiAgICBmb3IgKGxldCBqID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICBpZiAodGhpcy5jaGF0TG9nW2pdPy50eXBlID09PSAnYWknKSByZXR1cm4gajtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgaGFuZGxlVXBDbGljayhpZHg6IGFueSkge1xuICAgIGlmICh0aGlzLmZlZWRiYWNrRG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3VibWl0RmVlZGJhY2sodHJ1ZSwgdGhpcy5jaGF0TG9nW2lkeF0pO1xuICAgIHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkO1xuXG4gICAgaWYgKHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQpIHtcbiAgICAgIHRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZDtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGhhbmRsZURvd25DbGljayhpZHg6IGFueSkge1xuICAgIGlmICh0aGlzLmZlZWRiYWNrRG9uZSkgcmV0dXJuO1xuICAgIHRoaXMuc3VibWl0RmVlZGJhY2soZmFsc2UsIHRoaXMuY2hhdExvZ1tpZHhdKTtcbiAgICB0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQ7XG4gICAgaWYgKHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkKVxuICAgICAgdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQgPSAhdGhpcy5jaGF0TG9nW2lkeF0ubGlrZWQ7XG4gIH1cbiAgLy8gaGFuZGxlQ29weUNsaWNrKGluZGV4OiBhbnkpIHtcbiAgLy8gICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcbiAgLy8gICBjb25zdCBjb250ZW50VG9Db3B5ID0gdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlO1xuICAvLyAgIGNvbnNvbGUubG9nKCdjb250ZW50VG9Db3B5Jyk7XG4gIC8vICAgY29uc29sZS5sb2coY29udGVudFRvQ29weSk7XG4gIC8vICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29udGVudFRvQ29weSkudGhlbigoKSA9PiB7XG4gIC8vICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBtZXNzYWdlIHdhcyBjb3BpZWRcbiAgLy8gICAgIHRoaXMuY2hhdExvZ1tpbmRleF0uY29waWVkID0gdHJ1ZTtcbiAgLy8gICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgLy8gICAgIC8vIFJlc2V0IHRoZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBkZWxheVxuICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgIHRoaXMuY2hhdExvZ1tpbmRleF0uY29waWVkID0gZmFsc2U7XG4gIC8vICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgLy8gICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcbiAgLy8gICB9KTtcbiAgLy8gfVxuICBjb3B5VGV4dChpZCwgaW5kZXgpIHtcbiAgICAvLyBHZXQgdGhlIHRleHQgZWxlbWVudFxuICAgIHZhciB0ZXh0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcblxuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSB0ZXh0YXJlYSBlbGVtZW50IHRvIGNvcHkgdGhlIHRleHRcbiAgICB2YXIgdGVtcFRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICB0ZW1wVGV4dEFyZWEudmFsdWUgPSB0ZXh0RWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAvLyBBcHBlbmQgdGhlIHRleHRhcmVhIHRvIHRoZSBib2R5IChuZWNlc3NhcnkgZm9yIHRoZSBleGVjQ29tbWFuZCB0byB3b3JrKVxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFRleHRBcmVhKTtcblxuICAgIC8vIFNlbGVjdCB0aGUgdGV4dCBpbnNpZGUgdGhlIHRleHRhcmVhXG4gICAgdGVtcFRleHRBcmVhLnNlbGVjdCgpO1xuXG4gICAgLy8gQ29weSB0aGUgdGV4dCB0byB0aGUgY2xpcGJvYXJkXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IHRleHRhcmVhXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZW1wVGV4dEFyZWEpO1xuXG4gICAgLy8gT3B0aW9uYWxseSwgeW91IGNhbiBhbGVydCB0aGUgdXNlciBvciBjaGFuZ2UgdGhlIGJ1dHRvbiB0ZXh0IHRvIGluZGljYXRlIHRoZSBjb3B5IHdhcyBzdWNjZXNzZnVsXG4gICAgLy8gYWxlcnQoJ1RleHQgY29waWVkIHRvIGNsaXBib2FyZCEnKTtcblxuICAgIHRoaXMuY2hhdExvZ1tpbmRleF0uY29waWVkID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgLy8gUmVzZXQgdGhlIGNvcGllZCBzdGF0ZSBhZnRlciBhIGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcbiAgfVxuICBoYW5kbGVDb3B5Q2xpY2soaW5kZXg6IGFueSkge1xuICAgIC8vIENvcHkgdGhlIG1lc3NhZ2UgdG8gdGhlIGNsaXBib2FyZFxuICAgIGNvbnN0IGNvbnRlbnRUb0NvcHkgPSB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2U7XG4gICAgY29uc3QgcmVzdXRsdCA9IHRoaXMuY29weVRleHQoJ21lc3NhZ2VUZXh0XycgKyBpbmRleCwgaW5kZXgpO1xuICB9XG5cbiAgc2FuaXRpemVIVE1MKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgZG9jdW1lbnQgZnJhZ21lbnQgdG8gaG9sZCB0aGUgc2ltcGxpZmllZCBjb250ZW50XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICAvLyBBcHBlbmQgdGhlIGNoaWxkcmVuIG9mIHRoZSBib2R5IG9mIHRoZSBwYXJzZWQgZG9jdW1lbnQgdG8gdGhlIGZyYWdtZW50XG4gICAgQXJyYXkuZnJvbShkb2MuYm9keS5jaGlsZE5vZGVzKS5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgZGl2IGVsZW1lbnQgdG8gaG9sZCB0aGUgc2ltcGxpZmllZCBIVE1MXG4gICAgY29uc3Qgc2ltcGxpZmllZERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNpbXBsaWZpZWREaXYuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuXG4gICAgLy8gUmVtb3ZlIGNvbXBsZXggdGFncyBvciBhdHRyaWJ1dGVzIGFzIG5lZWRlZFxuICAgIC8vIEV4YW1wbGU6IHJlbW92ZSBzY3JpcHRzXG4gICAgc2ltcGxpZmllZERpdlxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXG4gICAgICAuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBzaW1wbGlmaWVkIEhUTUwgYXMgYSBzdHJpbmdcbiAgICByZXR1cm4gc2ltcGxpZmllZERpdi5pbm5lckhUTUw7XG4gIH1cblxuICBjdXJyZW50TWVzc2FnZUZvckVkaXRvcjogYW55ID0gJyc7XG4gIGN1cnJlbnRJbmRleEZvckVkaXRvcjogYW55ID0gLTE7XG4gIGhhbmRsZUVkaXRvckNsaWNrKGluZGV4OiBhbnkpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhGb3JFZGl0b3IgPT0gLTEpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID0gaW5kZXg7XG4gICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5zYW5pdGl6ZUhUTUwoXG4gICAgICAgIHRoaXMuY2hhdExvZ1tpbmRleF0ubWVzc2FnZSxcbiAgICAgICk7XG4gICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvci5yZXBsYWNlKFxuICAgICAgICAvLyAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxuICAgICAgICAnJyxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID09IGluZGV4KSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IgKz0gdGhpcy5zYW5pdGl6ZUhUTUwoXG4gICAgICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvci5yZXBsYWNlKFxuICAgICAgICAgIC8vICdTYWZlVmFsdWUgbXVzdCB1c2UgW3Byb3BlcnR5XT1iaW5kaW5nOicsXG4gICAgICAgICAgJycsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID0gaW5kZXg7XG4gICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IgPSB0aGlzLnNhbml0aXplSFRNTChcbiAgICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2UsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IgPSB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yLnJlcGxhY2UoXG4gICAgICAgICAgLy8gJ1NhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmlzRWRpdG9yID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgLy8gUmVzZXQgdGhlIGNvcGllZCBzdGF0ZSBhZnRlciBhIGRlbGF5XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmlzRWRpdG9yID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSwgMjAwMCk7IC8vIFJlc2V0IGFmdGVyIDIgc2Vjb25kc1xuICAgIHRoaXMuZWRpdG9yc0RyYXdlci5vcGVuKCk7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgc2Nyb2xsVG9Cb3R0b20oZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICghZm9yY2UgJiYgIXRoaXMuYXV0b1Njcm9sbE9uTmV3TWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY2hhdE1haW4/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICAgdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIGlmIChjb3VudGVyKysgPiA1KSBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICB9LCA1KTtcbiAgfVxuXG4gIC8qKiBTY3JvbGxzIHRoZSBjaGF0IGNvbnRhaW5lciBzbyB0aGUgdG9wIG9mIHRoZSBBSSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIGlkIGlzIHZpc2libGUuICovXG4gIHNjcm9sbFRvQWlNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoYXRNYWluPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHRoaXMuY2hhdE1haW4ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2RhdGEtbXNnLWlkPVwiJHttZXNzYWdlSWR9XCJdYCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IG9mZnNldCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3AgKyBvZmZzZXQgLSA4O1xuICB9XG5cbiAgZm9jdXNPblRleHRhcmVhKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubXlJbnB1dCAmJiB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBoYW5kbGVBY3Rpb24oYWN0aW9uOiBhbnkpIHtcbiAgICBjb25zb2xlLmluZm8oJ2luY29taW5nIGFjdGlvbiBmcm9tIHRoZSBjaGF0Ym90IEFJJyk7XG4gICAgY29uc29sZS5pbmZvKGFjdGlvbik7XG5cbiAgICBpZiAoYWN0aW9uPy5jb250ZW50KSB7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBkcmF3ZXIgaXMgaW5pdGlhbGx5IG9wZW4gYW5kIGFwcGx5IG92ZXJmbG93IGhpZGRlbiB0byBib2R5IGlmIHNvXG4gICAgaWYgKHRoaXMuZHJhd2VyLm9wZW5lZCkge1xuICAgICAgdGhpcy5zZXRCb2R5T3ZlcmZsb3coKTtcbiAgICB9XG5cbiAgICAvLyBMaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUgZHJhd2VyIGJlaW5nIG9wZW5lZCBvciBjbG9zZWRcbiAgICB0aGlzLmRyYXdlci5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKChvcGVuZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgdGhpcy5zZXRCb2R5T3ZlcmZsb3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQm9keU92ZXJmbG93KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRyYXdlci5vcGVuZWRDaGFuZ2Uuc3Vic2NyaWJlKChvcGVuZWQpID0+IHtcbiAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubXlJbnB1dCAmJiB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5teUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsgLy8gRm9jdXMgb24gdGhlIHRleHRhcmVhXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Qm9keU92ZXJmbG93KCkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5ib2R5T3ZlcmZsb3dDbGFzcyk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUJvZHlPdmVyZmxvdygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xuICB9XG5cbiAgZ2V0U3BlYWtlcnNCeVN0YWZmSWRzKGlkczogYW55W10pOiBPYnNlcnZhYmxlPGFueVtdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L3VzZXJzL2dldC1ieS1zdGFmZi1pZHNgO1xuICAgIGNvbnN0IGNsZWFuSWRzID0gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoKGlkcyB8fCBbXSkubWFwKCh4KSA9PiBTdHJpbmcoeCA/PyAnJykudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikpLFxuICAgICk7XG4gICAgaWYgKGNsZWFuSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG9mKG51bGwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55W10+KHVybCwgY2xlYW5JZHMsIHsgaGVhZGVycyB9KS5waXBlKFxuICAgICAgdGFwKChkYXRhOiBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkYXRhLmZvckVhY2goKHNwZWFrZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gU3RyaW5nKHNwZWFrZXI/LmlkID8/ICcnKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3BlYWtlcnNbaWRdID0gc3BlYWtlcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc3BlYWtlcnM6JywgZXJyKTtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb25JZCwgYWN0aW9uKSB7XG4gICAgdGhpcy5zZXNzaW9uQWN0aW9ucy5uZXh0KHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGFjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIGFkZENsb3NlQm90Q2xpY2tFdmVudCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2Nsb3NlQm90Tm93Jyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKGVsZW1lbnQsICdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZUJvdC5uZXh0KG51bGwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNNb2JpbGVCcm93c2VyKCkge1xuICAgIHJldHVybiAvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QoXG4gICAgICBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICk7XG4gIH1cblxuICBjb25uZWN0VG9Vc2VyKHVzZXJJZCkge1xuICAgIHRoaXMuY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgY29ubmVjdDogIXRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpLFxuICAgICAgdXNlcklkLFxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZldGNoUGVuZGluZ1JlcXVlc3RzKCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgc2NoZWR1bGVNZWV0aW5nV2l0aFVzZXIodXNlcikge1xuICAgIHRoaXMuc2NoZWR1bGVNZWV0aW5nLmVtaXQodXNlcik7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgZ2l2ZW4gdXNlcklkIGhhcyBhIHBlbmRpbmcgY29ubmVjdGlvbiByZXF1ZXN0IHNlbnQgKHNob3cgXCJSZXF1ZXN0IFNlbnRcIiBkaXNhYmxlZCkuICovXG4gIGNoZWNrUGVuZGluZ1NlbnRSZXF1ZXN0KHVzZXJJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmICh1c2VySWQgPT0gbnVsbCB8fCB1c2VySWQgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1NlbnRSZXF1ZXN0VXNlcklkcz8ubGVuZ3RoXG4gICAgICA/IHRoaXMucGVuZGluZ1NlbnRSZXF1ZXN0VXNlcklkc1xuICAgICAgOiB0aGlzLnBlbmRpbmdSZXF1ZXN0cztcbiAgICByZXR1cm4gISFwZW5kaW5nPy5maW5kKChhOiBhbnkpID0+IGEgPT0gdXNlcklkKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgYXR0ZW5kZWUgY2FuIGJlIGZvbGxvd2VkIChzaG93IFwiQ29ubmVjdFwiIGJ1dHRvbikuIE5vdCBjb25uZWN0ZWQgYW5kIG5vIHBlbmRpbmcgc2VudCByZXF1ZXN0LiAqL1xuICBjYW5Gb2xsb3dVc2VyKGF0dGVuZGVlOiB7IGlkPzogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgICBjb25zdCB1aWQgPSBhdHRlbmRlZT8uaWQ7XG4gICAgaWYgKHVpZCA9PSBudWxsIHx8IHVpZCA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5jYW5VbmZvbGxvd1VzZXIoYXR0ZW5kZWUpIHx8IHRoaXMuY2hlY2tQZW5kaW5nU2VudFJlcXVlc3QodWlkKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgYXR0ZW5kZWUgaXMgYWxyZWFkeSBjb25uZWN0ZWQgKHNob3cgXCJEaXNjb25uZWN0XCIgYnV0dG9uKS4gKi9cbiAgY2FuVW5mb2xsb3dVc2VyKGF0dGVuZGVlOiB7IGlkPzogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgICBjb25zdCB1aWQgPSBhdHRlbmRlZT8uaWQ7XG4gICAgaWYgKHVpZCA9PSBudWxsIHx8IHVpZCA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5jb25uZWN0aW9uc0xpc3Q/Lmxlbmd0aFxuICAgICAgPyB0aGlzLmNvbm5lY3Rpb25zTGlzdFxuICAgICAgOiB0aGlzLm15Q29ubmVjdGlvbnM7XG4gICAgcmV0dXJuICEhbGlzdD8uZmluZCgoYzogYW55KSA9PiAoYy51c2VySWQgPz8gYy5pZCkgPT0gdWlkKTtcbiAgfVxuXG4gIGNhbkNvbm5lY3QodXNlcklkKSB7XG4gICAgcmV0dXJuICEoXG4gICAgICB0aGlzLmNhbkRpc2Nvbm5lY3QodXNlcklkKSB8fFxuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZmluZCgoYSkgPT4gYSA9PSB1c2VySWQpXG4gICAgKTtcbiAgfVxuXG4gIGNhbkRpc2Nvbm5lY3QodXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMubXlDb25uZWN0aW9ucy5maW5kKChjb25uKSA9PiBjb25uLnVzZXJJZCA9PSB1c2VySWQpO1xuICB9XG5cbiAgZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQoXG4gICAgICAgIGAke3RoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJfS9ldmVudHMvJHt0aGlzLmV2ZW50SWR9L2Nvbm5lY3Rpb24tcmVxdWVzdHMvYXV0b2dlbi9wZW5kaW5nLXNlbnQtcmVxdWVzdHM/dXNlcklkPSR7dGhpcy51c2VySWR9YCxcbiAgICAgICAgeyBoZWFkZXJzIH0sXG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0gcmVzO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHBlbmRpbmcgcmVxdWVzdHM6ICcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIGZldGNoTXlDb25uZWN0aW9ucygpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldChcbiAgICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMtY29ubmVjdGlvbnMvYXV0b2dlbj91c2VySWQ9JHt0aGlzLnVzZXJJZH1gLFxuICAgICAgICB7IGhlYWRlcnMgfSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5teUNvbm5lY3Rpb25zID0gcmVzO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHBlbmRpbmcgcmVxdWVzdHM6ICcsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIGlzRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGFnZW50czogYW55O1xuICBzZWxlY3RlZEFnZW50cyA9IFtdO1xuICBhbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAvLyBUb2dnbGUgdGhlIGRyb3Bkb3duIHZpc2liaWxpdHlcbiAgdG9nZ2xlRHJvcGRvd24oKSB7XG4gICAgaWYgKCF0aGlzLmFnZW50cykgdGhpcy5mZXRjaEFnZW50cygpO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvblNlbGVjdEFsbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmFnZW50cz8uZm9yRWFjaCgoYWdlbnQpID0+IChhZ2VudC5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25BZ2VudENoYW5nZShhZ2VudDogYW55KTogdm9pZCB7XG4gICAgLy9hZ2VudC5zZWxlY3RlZCA9ICFhZ2VudC5zZWxlY3RlZDtcbiAgICAvL2NvbnNvbGUubG9nKGFnZW50KTtcbiAgICBsZXQgYWdlbnRGb3VuZCA9IHRoaXMuYWdlbnRzLmZpbHRlcigocCkgPT4gcC5pZCA9PSBhZ2VudC5pZCk7XG4gICAgaWYgKGFnZW50Rm91bmQgJiYgYWdlbnRGb3VuZC5sZW5ndGggPiAwKSB7XG4gICAgICBhZ2VudEZvdW5kWzBdLnNlbGVjdGVkID0gIWFnZW50Rm91bmRbMF0uc2VsZWN0ZWQ7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGFyZUFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFnZW50cz8uZXZlcnkoKGFnZW50KSA9PiAhYWdlbnQuc2VsZWN0ZWQpO1xuICB9XG5cbiAgZ2V0RHJvcGRvd25IZWFkZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZWN0ZWRBZ2VudHMgPSB0aGlzLmFnZW50cz8uZmlsdGVyKChhZ2VudCkgPT4gYWdlbnQuc2VsZWN0ZWQpO1xuICAgIGlmICghc2VsZWN0ZWRBZ2VudHMpIHtcbiAgICAgIHJldHVybiAnQWxsIEFnZW50cyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzZWxlY3RlZEFnZW50cyAmJiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnQWxsIEFnZW50cyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aCA+IDFcbiAgICAgICAgICA/IGAke3NlbGVjdGVkQWdlbnRzPy5sZW5ndGh9IEFnZW50cyBTZWxlY3RlZGBcbiAgICAgICAgICA6IGAke3NlbGVjdGVkQWdlbnRzPy5sZW5ndGh9IEFnZW50IFNlbGVjdGVkYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZmV0Y2hBZ2VudHNfaHR0cCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQUdFTlRTX0FQSX0vQ29QaWxvdC8ke3RoaXMuYm90SWR9L2FjdGl2ZS1hZ2VudHNgO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIHt9LCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIHRoaXMuYWdlbnRzID0gcmVzLm1hcCgoYWdlbnQpID0+ICh7XG4gICAgICAgICAgICAuLi5hZ2VudCxcbiAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXRib3QgY29uZmlnOiAnLCBlcnJvcik7XG5cbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBpc0RvY0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgZG9jdW1lbnRDb250ZW50OiBhbnk7XG5cbiAgY29udmVyc2F0aW9uSWQ6IGFueTtcbiAgaXNDb250ZW50TG9hZGVkID0gZmFsc2U7XG5cbiAgZmV0Y2hDb250ZW50X2h0dHAoKSB7XG4gICAgdGhpcy5pc0RvY0luRWRpdE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ29udGVudExvYWRlZCA9IGZhbHNlO1xuICAgIGNvbnNvbGUubG9nKCdBUEkgY2FsbCBmdW5jdGlvbicpO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgY29udmVyc2F0aW9uX2lkID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleShcbiAgICAgIHRoaXMuYm90SWQsXG4gICAgICBmYWxzZSxcbiAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICApO1xuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25faWQ7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5BR0VOVFNfQVBJfS9Db252ZXJzYXRpb25Eb2N1bWVudHM/Y29udmVyc2F0aW9uSWQ9JHtjb252ZXJzYXRpb25faWR9JmJvdElkPSR7dGhpcy5ib3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIGFwaUtleTogJ1dJei9xQW0rRUVtZk9rRmFVQS93ZUE9PScsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwsIHsgaGVhZGVycyB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5pc0RvY0luRWRpdE1vZGUgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRDb250ZW50ID0gcmVzO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXQgQVBJIGNhbGxsZWQgc3VjY2VzcycpO1xuICAgICAgICAgIHRoaXMuaXNDb250ZW50TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0Ym90IGNvbmZpZyBESjogJywgZXJyb3IpO1xuICAgICAgICB0aGlzLmlzRG9jSW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQ29udGVudExvYWRlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGVycm9yPy5zdGF0dXMgPT0gNDA0KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2Rhc2gnKTtcbiAgICAgICAgICB0aGlzLmlzRG9jSW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNDb250ZW50TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgZmV0Y2hBZ2VudHMoKSB7XG4gICAgdGhpcy5mZXRjaEFnZW50c19odHRwKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBmZXRjaEVkaXRvckNvbnRlbnQoKSB7XG4gICAgdGhpcy5mZXRjaENvbnRlbnRfaHR0cCgpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnMtY29ubmVjdGlvbnNcbiAgcHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KG1hcmtkb3duOiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIGN1c3RvbSByZW5kZXJlciB0byBtb2RpZnkgPGE+IHRhZ3NcbiAgICAgIGNvbnN0IHJlbmRlcmVyID0gbmV3IG1hcmtlZC5SZW5kZXJlcigpO1xuXG4gICAgICAvLyBDdXN0b21pemUgYW5jaG9yIHRhZ3MgdG8gaW5jbHVkZSB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgcmVuZGVyZXIubGluayA9IChocmVmOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYDxhIGhyZWY9XCIke2hyZWZ9XCIgdGl0bGU9XCIke1xuICAgICAgICAgIHRpdGxlIHx8ICcnXG4gICAgICAgIH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke3RleHR9PC9hPmA7XG4gICAgICB9O1xuXG4gICAgICAvLyBQYXJzZSB0aGUgbWFya2Rvd24gY29udGVudCB0byBIVE1MIHVzaW5nIG1hcmtlZCB3aXRoIHRoZSBjdXN0b20gcmVuZGVyZXJcbiAgICAgIGNvbnN0IG1hcmtkb3duQ29udGVudCA9IG1hcmtlZC5wYXJzZShtYXJrZG93biwgeyByZW5kZXJlcjogcmVuZGVyZXIgfSk7XG5cbiAgICAgIC8vIFNhbml0aXplIHRoZSBwYXJzZWQgSFRNTCB1c2luZyBBbmd1bGFyJ3MgRG9tU2FuaXRpemVyXG4gICAgICBjb25zdCBzYW5pdGl6ZWRIdG1sID1cbiAgICAgICAgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwobWFya2Rvd25Db250ZW50KTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBzYWZlIEhUTUwgY29udGVudCBmb3IgZGlzcGxheVxuICAgICAgcmV0dXJuIHNhbml0aXplZEh0bWw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgbWFya2Rvd246JywgZXJyb3IpO1xuICAgICAgcmV0dXJuICcnOyAvLyBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIG9yIGhhbmRsZSB0aGUgZXJyb3IgYXBwcm9wcmlhdGVseVxuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVIdG1sKG1hcmtkb3duOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbWFya2Rvd24gfHwgIShtYXJrZG93bi5sZW5ndGggPiAwKSkge1xuICAgICAgY29uc29sZS5lcnJvcignSW5wdXQgTWFya2Rvd24gaXMgbnVsbCBvciBlbXB0eScpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyAoIyMjIG9yICMjKSB0byA8c3Ryb25nPiBmb3IgYm9sZCBoZWFkaW5nc1xuICAgIGxldCBodG1sID0gbWFya2Rvd24ucmVwbGFjZShcbiAgICAgIC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sXG4gICAgICAobWF0Y2gsIGhhc2hlcywgdGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gMykge1xuICAgICAgICAgIHJldHVybiBgPGgzPjxzdHJvbmc+JHt0ZXh0fTwvc3Ryb25nPjwvaDM+YDtcbiAgICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PT0gNCkge1xuICAgICAgICAgIHJldHVybiBgPGg0PjxzdHJvbmc+JHt0ZXh0fTwvc3Ryb25nPjwvaDQ+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDxzdHJvbmc+JHt0ZXh0fTwvc3Ryb25nPmA7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGNvZGUgYmxvY2tzIHdpdGggbGFuZ3VhZ2UgdG8gcHJlZm9ybWF0dGVkIEhUTUxcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gYGAoXFx3Kyk/XFxuKFtcXHNcXFNdKj8pYGBgL2csIChtYXRjaCwgbGFuZywgY29kZSkgPT4ge1xuICAgICAgY29uc3QgZXNjYXBlZENvZGUgPSB0aGlzLmVzY2FwZUh0bWwoY29kZSk7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IGxhbmcgfHwgJ3BsYWludGV4dCc7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgYnV0dG9uIGZvciB0aGUgY29kZSBibG9ja1xuICAgICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2RlLWNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY29weS1idXR0b25cIiBjbGFzcz1cImNvcHktYnV0dG9uXCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZCgnXFxgJHtlc2NhcGVkQ29kZX1cXGAnKVwiPiR7dGhpcy5nZXRUcmFuc2xhdGlvbihcbiAgICAgICAgICAnQ29weScsXG4gICAgICAgICl9PC9idXR0b24+XG4gICAgICAgIDxwcmUgY2xhc3M9XCJjb2RlX2Jsb2NrIGRpZmZcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7bGFuZ3VhZ2V9XCI+JHtlc2NhcGVkQ29kZX08L2NvZGU+PC9wcmU+XG4gICAgICA8L2Rpdj5gO1xuICAgIH0pO1xuXG4gICAgLy8gQ29udmVydCBpbmxpbmUgY29kZSAod3JhcHBlZCBpbiBgYmFja3RpY2tzYCkgdG8gaW5saW5lIDxjb2RlPiB0YWdzXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvYChbXmBdKylgL2csICc8Y29kZT4kMTwvY29kZT4nKTtcblxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gYm9sZCB0byBIVE1MIDxzdHJvbmc+XG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKTtcblxuICAgIC8vIENvbnZlcnQgbnVtYmVyZWQgbGlzdHNcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9eXFxkK1xcLlxccysoLiopJC9nbSwgJzxsaT4kMTwvbGk+Jyk7XG5cbiAgICAvLyBDb252ZXJ0IGJ1bGxldCBwb2ludCBsaXN0c1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL15cXC1cXHMrKC4qKSQvZ20sICc8bGk+JDE8L2xpPicpO1xuXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBsaW5rcyB0byBIVE1MIGxpbmtzXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZShcbiAgICAgIC9cXFsoW15cXF1dKyldXFwoKFteKV0rKVxcKS9nLFxuICAgICAgJzxhIGhyZWY9XCIkMlwiIHRhcmdldD1cIl9ibGFua1wiPiQxPC9hPicsXG4gICAgKTtcblxuICAgIC8vIENvbnZlcnQgbmV3IGxpbmVzIHRvIDxicj4gdGFncyBmb3IgcGFyYWdyYXBoc1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCAnPGJyPicpO1xuXG4gICAgcmV0dXJuIGh0bWw7XG4gIH1cblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXNjYXBlIEhUTUwgY2hhcmFjdGVycyBmb3IgY29kZSBibG9ja3NcbiAgZXNjYXBlSHRtbChjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2RlXG4gICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgICAgLnJlcGxhY2UoLycvZywgJyYjMDM5OycpO1xuICB9XG5cbiAgLy8gRnVuY3Rpb24gdG8gY29weSB0ZXh0IHRvIGNsaXBib2FyZFxuICBwdWJsaWMgY29weVRvQ2xpcGJvYXJkKHRleHQ6IHN0cmluZykge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGFsZXJ0KCdDb2RlIGNvcGllZCB0byBjbGlwYm9hcmQhJyk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgY29weSB0ZXh0OiAnLCBlcnIpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgaXNDb2xsYXBzZWQgPSBmYWxzZTtcbiAgaXNDb2xsYXBzZWRGb3JHcmFwaCA9IGZhbHNlO1xuICBpc0NvbGxhcHNlZEZvckZHcmFwaCA9IGZhbHNlO1xuICB0b2dnbGVDb2xsYXBzZSgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgdG9nZ2xlQ29sbGFwc2VHcmFwaCgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkRm9yR3JhcGggPSAhdGhpcy5pc0NvbGxhcHNlZEZvckdyYXBoO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICB0b2dnbGVDb2xsYXBzZUZHcmFwaCgpIHtcbiAgICB0aGlzLmlzQ29sbGFwc2VkRm9yRkdyYXBoID0gIXRoaXMuaXNDb2xsYXBzZWRGb3JGR3JhcGg7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIC8vICAgW1xuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJBSSBOZXdzIEphbnVhcnkgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIkVhY2ggbW9udGgsIHdlIGNvbXBpbGUgc2lnbmlmaWNhbnQgbmV3cywgdHJlbmRzLCBhbmQgaGFwcGVuaW5ncyBpbiBBSSwgcHJvdmlkaW5nIGRldGFpbGVkIHN1bW1hcmllcyB3aXRoIGtleSBwb2ludHMgaW4gYnVsbGV0IGZvcm0gZm9yIGNvbmNpc2UgeWV0IGNvbXBsZXRlIHVuZGVyc3RhbmRpbmcuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3RoZWFpdHJhY2suY29tL2FpLW5ld3MtamFudWFyeS0yMDI0L1wiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiVG9wIEFJIE5ld3MsIEphbnVhcnkgMjAyNCAtIEV2ZXJ5cGl4ZWwgSm91cm5hbFwiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiSW4gdGhpcyBtb250aGx5IHJvdW5kdXAsIHdlIHNwb3RsaWdodCB0aGUgdG9wIEFJIG5ld3Mgc3RvcmllcyBmcm9tIEphbnVhcnksIGluY2x1ZGluZyB0aGUgT3BlbkFJIHZzLiBUaGUgTmV3IFlvcmsgVGltZXMgTGF3c3VpdC5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vam91cm5hbC5ldmVyeXBpeGVsLmNvbS90b3AtYWktbmV3cy1qYW51YXJ5LTIwMjRcIlxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgSnVseSAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiVGhpcyBwYWdlIGZlYXR1cmVzIEFJIE5ld3MgZm9yIEp1bHkgMjAyNCwgaGlnaGxpZ2h0aW5nIHNpZ25pZmljYW50IGV2ZW50cyBzdWNoIGFzIENhbnZhIGFjcXVpcmluZyBMZW9uYXJkbyBBSS5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1qdWx5LTIwMjQtaW4tZGVwdGgtYW5kLWNvbmNpc2UvXCJcbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJKYW51YXJ5IG5ld3Mgcm91bmR1cDogV2hhdCdzIG5ldyBpbiB0aGUgd29ybGQgb2YgQUk/IC0gUGx1cmFsc2lnaHRcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIk9wZW5BSeKAmXMgbmV3IEdQVCBzdG9yZSwgYnVzaW5lc3MtcmVhZHkgQ2hhdEdQVCBwbGFucywgYW5kIGEgcHJlZGljdGVkIHJpc2UgaW4gQUktcG93ZXJlZCBjeWJlcmNyaW1lLlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly93d3cucGx1cmFsc2lnaHQuY29tL3Jlc291cmNlcy9ibG9nL2RhdGEvYWktdGhpcy1tb250aC1qYW51YXJ5LTIwMjRcIlxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgQXVndXN0IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJUaGlzIHBhZ2UgZmVhdHVyZXMgQUkgTmV3cyBmb3IgQXVndXN0IDIwMjQsIHdpdGggaGlnaGxpZ2h0cyBzdWNoIGFzIE52aWRpYSBkZWxheWluZyB0aGUg4oCcQmxhY2t3ZWxs4oCdIEIyMDAgQUkgY2hpcHMgZGVsaXZlcnkuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3RoZWFpdHJhY2suY29tL2FpLW5ld3MtYXVndXN0LTIwMjQtaW4tZGVwdGgtYW5kLWNvbmNpc2UtZHVwbGljYXRlL1wiXG4gIC8vICAgfVxuICAvLyBdXG4gIGRhdGVUaW1lID0geyBub3c6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9O1xuICAvLyBFeHRyYWN0cyB0aGUgZG9tYWluIGZyb20gYSBVUkxcbiAgZ2V0RG9tYWluTmFtZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgaG9zdG5hbWUgfSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIHJldHVybiBob3N0bmFtZS5yZXBsYWNlKC9ed3d3XFwuLywgJycpOyAvLyBSZW1vdmUgJ3d3dy4nIGlmIHByZXNlbnRcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgfVxuICB9XG5cbiAgLy8gR2VuZXJhdGVzIHRoZSBmYXZpY29uIFVSTFxuICBnZXRGYXZpY29uVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkb21haW4gPSB0aGlzLmdldERvbWFpbk5hbWUodXJsKTtcbiAgICByZXR1cm4gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vczIvZmF2aWNvbnM/c3o9MTI4JmRvbWFpbj0ke2RvbWFpbn1gO1xuICB9XG4gIGN1cnJlbnRTb3VyY2VzTGlzdDogYW55ID0gW107XG4gIG9uQ2FyZENsaWNrKHNvdXJjZXMpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTb3VyY2VzTGlzdCA9IHNvdXJjZXM7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc291cmNlc0RyYXdlci5vcGVuKCk7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xuICAgIGlmIChidXR0b24pIHtcbiAgICAgIGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfVxuXG4gIGlzU2hvd0VkaXRvckJ1dHRvbiA9IHRydWU7XG5cbiAgb3Blbk91dGVyRWRpdG9yKCkge1xuICAgIHRoaXMuZmV0Y2hFZGl0b3JDb250ZW50KCk7XG4gICAgdGhpcy5lZGl0b3JzRHJhd2VyLm9wZW4oKTtcbiAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IHRydWU7XG4gICAgdGhpcy5pc1Nob3dFZGl0b3JCdXR0b24gPSBmYWxzZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90Y2xvc2VwbGF5Z3JvdW5kYnV0dG9uJyk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZUVkaXRvcigpIHtcbiAgICB0aGlzLmVkaXRvcnNEcmF3ZXIuY2xvc2UoKTtcbiAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuaXNTaG93RWRpdG9yQnV0dG9uID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcbiAgICB0aGlzLm9uRHJhd2VyQ2xvc2VkKCk7XG4gIH1cblxuICBvbkNsb3NlU291cmNlKCkge1xuICAgIHRoaXMuc291cmNlc0RyYXdlci5jbG9zZSgpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVlZGVkXG4gICAgdGhpcy5vbkRyYXdlckNsb3NlZCgpO1xuICB9XG4gIG9uRHJhd2VyQ2xvc2VkKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gaWYgbmVlZGVkXG4gICAgICAvLyBVc2UgbmdDbGFzcyB0byBkeW5hbWljYWxseSBhcHBseSB0aGUgY2xhc3NcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICAgIGlmIChidXR0b24pIHtcbiAgICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfVxuICAgIH0sIDgwMCk7XG4gIH1cbiAgaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcblxuICB0b2dnbGVEcmF3ZXIodG9kbykge1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdG9kbztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy51cGRhdGVCdXR0b25WaXNpYmlsaXR5KCk7XG4gIH1cbiAgdXBkYXRlQnV0dG9uVmlzaWJpbGl0eSgpIHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90Y2xvc2VwbGF5Z3JvdW5kYnV0dG9uJyk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmlzRHJhd2VyT3BlbiA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfVxuICB9XG4gIG9wZW5MaW5rSW5OZXdUYWIobGluazogc3RyaW5nKTogdm9pZCB7XG4gICAgd2luZG93Lm9wZW4obGluaywgJ19ibGFuaycpO1xuICB9XG4gIGFkanVzdFRleHRhcmVhSGVpZ2h0KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgLy8gUHJldmVudHMgYSBuZXcgbGluZSBmcm9tIGJlaW5nIGFkZGVkXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgY29uc3QgdGV4dGFyZWEgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcbiAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7IC8vIFJlc2V0IHRoZSBoZWlnaHRcbiAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBgJHt0ZXh0YXJlYS5zY3JvbGxIZWlnaHR9cHhgOyAvLyBBZGp1c3QgaGVpZ2h0IHRvIG1hdGNoIGNvbnRlbnRcbiAgICAvLyBFbnN1cmUgdGhlIGhlaWdodCBkb2Vzbid0IGV4Y2VlZCB0aGUgbWF4LWhlaWdodCBzZXQgaW4gQ1NTXG4gICAgaWYgKHRleHRhcmVhLnNjcm9sbEhlaWdodCA+IDE1MCkge1xuICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYDE1MHB4YDsgLy8gQWRqdXN0IGhlaWdodCB0byBtYXRjaCBjb250ZW50XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7IC8vIEVuYWJsZSBzY3JvbGxpbmcgaWYgY29udGVudCBleGNlZWRzIDQwMHB4XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHRhcmVhLnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nOyAvLyBIaWRlIHNjcm9sbGJhciBpZiBjb250ZW50IGlzIHdpdGhpbiBsaW1pdHNcbiAgICB9XG4gIH1cblxuICB0b2dnbGVXb3JrZmxvd3ModmFsdWUgPSBudWxsKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrRm9yQ29wMjlCb3RJZCgpKSB7XG4gICAgICB0aGlzLmJvdFNlcnZpY2UuZ2V0V29ya2Zsb3dzQnlPcmdJZCh0aGlzLm9yZ0lkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLm9yZ1dvcmtmbG93cyA9IHJlcztcbiAgICAgICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IHZhbHVlID09IG51bGwgPyAhdGhpcy5pc1dvcmtmbG93T3BlbiA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1dvcmtmbG93T3Blbikge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbGl6ZUZvcm0oKSB7XG4gICAgLy8gQ3JlYXRlIGZvcm0gY29udHJvbHMgZHluYW1pY2FsbHkgYmFzZWQgb24gc2VsZWN0ZWRXb3JrZmxvdy5UcmlnZ2VyLklucHV0U2NoZW1hXG4gICAgY29uc3QgZm9ybUNvbnRyb2xzID0ge307XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRXb3JrZmxvdz8uVHJpZ2dlcj8uSW5wdXRTY2hlbWEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5UcmlnZ2VyLklucHV0U2NoZW1hLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICAgIGZvcm1Db250cm9sc1tpbnB1dC5JbnB1dElkXSA9IFtcbiAgICAgICAgICBpbnB1dC5WYWx1ZSB8fCAnJyxcbiAgICAgICAgICBpbnB1dC5SZXF1aXJlZCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBudWxsLFxuICAgICAgICBdO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZm9ybVxuICAgIHRoaXMud29ya2Zsb3dGb3JtID0gdGhpcy5mYi5ncm91cChmb3JtQ29udHJvbHMpO1xuICB9XG5cbiAgb25Xb3JrZmxvd1NlbGVjdGVkKHdvcmtmbG93KSB7XG4gICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93ID0gd29ya2Zsb3c7XG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICAgIHRoaXMuaXNXb3JrZmxvd09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Xb3JrZmxvd0lucHV0ID0gdHJ1ZTtcbiAgfVxuXG4gIG9uV29ya2Zsb3dTdWJtaXQoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdEFsbENoYXQnKTtcbiAgICBpZiAodGhpcy53b3JrZmxvd0Zvcm0udmFsaWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlKTtcblxuICAgICAgdmFyIGlucHV0ID0gdGhpcy5wcmVwYXJlSHRtbChcbiAgICAgICAgdGhpcy5nZW5lcmF0ZU1hcmtkb3duKFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5OYW1lLFxuICAgICAgICAgIHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgLy8gdXBkYXRlIGxhc3QgdHdvIGNoYXRMb2cgZW50cmllcywgc2V0IHNob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlciA9IGZhbHNlXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNoYXRMb2dbdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDFdWydzaG93V29ya2Zsb3dFeGVjdXRpb25Mb2FkZXInXSA9XG4gICAgICAgICAgZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMl1bJ3Nob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlciddID1cbiAgICAgICAgICBmYWxzZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgICAgbWVzc2FnZTogaW5wdXQsXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcbiAgICAgICAgc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKGlucHV0KTtcblxuICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRXb3JrZmxvd0FjdGlvbiA9XG4gICAgICAgICdFeGVjdXRpbmcgJyArIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5BY3Rpb25zWzBdLk5hbWU7XG4gICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG4gICAgICB0aGlzLmV4ZWN1dGluZ1dvcmtmbG93ID0gdHJ1ZTtcbiAgICAgIHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0ge1xuICAgICAgICBBY3Rpb25zOiB0aGlzLnNlbGVjdGVkV29ya2Zsb3cuQWN0aW9ucyxcbiAgICAgICAgSW5wdXRzOiB0aGlzLndvcmtmbG93Rm9ybS52YWx1ZSxcbiAgICAgICAgd29ya2Zsb3dJbnB1dHM6IHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlLFxuICAgICAgICBXb3JrZmxvd05hbWU6IHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5OYW1lLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY3VycmVudFdvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRoaXMud29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzO1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIGV4ZWN1dGUgdGhlIGFzayBlbmRwb2ludCB3aXRoIHdvcmtmbG93IGlucHV0XG4gICAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgdGhpcy5hZ2VudHMsXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uS2V5LFxuICAgICAgICAnJyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93WydfaWQnXSxcbiAgICAgICAgdGhpcy53b3JrZmxvd0Zvcm0udmFsdWUsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG1ha2VBc2tSZXF1ZXN0KFxuICAgIGlucHV0TXNnOiBzdHJpbmcsXG4gICAgYWdlbnRzOiBhbnlbXSxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIG1zZz86IGFueSxcbiAgICBjaGF0PzogYW55LFxuICAgIHdvcmtmbG93SWQ/OiBzdHJpbmcsXG4gICAgd29ya2Zsb3dfaW5wdXRzPzogYW55LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgdXNlcl9xdWVzdGlvbjogaW5wdXRNc2csXG4gICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcbiAgICAgIGJvdF9pZDogdGhpcy5ib3RJZCxcbiAgICAgIG1lc3NhZ2VfaWQ6IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZW5lcmF0ZUtleSgpLFxuICAgICAgc2Vzc2lvbl9pZDogdGhpcy5jb25TZXNzaW9uS2V5LFxuICAgICAgYWdlbnRzOiBhZ2VudHM/LmZpbHRlcigocCkgPT4gcC5zZWxlY3RlZCkubWFwKChwKSA9PiBwLmlkKSA/PyBbXSxcbiAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgICBmaXJzdF9uYW1lOiB0aGlzLmZpcnN0TmFtZSxcbiAgICAgIGxhc3RfbmFtZTogdGhpcy5sYXN0TmFtZSxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtmbG93SWQpIHtcbiAgICAgIGJvZHlbJ3dvcmtmbG93X2lkJ10gPSB3b3JrZmxvd0lkO1xuICAgICAgYm9keVsnd29ya2Zsb3dfaW5wdXRzJ10gPSB3b3JrZmxvd19pbnB1dHM7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcnNBcGkgPSB0aGlzLmVudmlyb25tZW50LlVTRVJTX0FQSTtcbiAgICB0aGlzLnBsYXRmb3JtVG9rZW5SZWZyZXNoXG4gICAgICAuZW5zdXJlVmFsaWRBY2Nlc3NUb2tlbih0aGlzLnMyN1Rva2VuLCB1c2Vyc0FwaSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGVuc3VyZWQpID0+IHtcbiAgICAgICAgICBsZXQgYmVhcmVyID0gZW5zdXJlZC5hY2Nlc3NUb2tlbiB8fCB0aGlzLnMyN1Rva2VuIHx8ICcnO1xuICAgICAgICAgIGlmIChlbnN1cmVkLnJlZnJlc2hlZCAmJiBlbnN1cmVkLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnMyN1Rva2VuID0gZW5zdXJlZC5hY2Nlc3NUb2tlbjtcbiAgICAgICAgICAgIGlmIChlbnN1cmVkLmF1dGhSZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLnRva2Vuc1JlZnJlc2hlZC5lbWl0KGVuc3VyZWQuYXV0aFJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZW5kQXNrTWVzc2FnZU92ZXJXZWJTb2NrZXQoYm9keSwgYmVhcmVyLCBtc2csIGNoYXQpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXM0MDEgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuLmVtaXQoKTtcbiAgICAgICAgICBpZiAobXNnICYmIGNoYXQpIHtcbiAgICAgICAgICAgIHRoaXMubXNnID0gbXNnO1xuICAgICAgICAgICAgdGhpcy5jaGF0ID0gY2hhdDtcbiAgICAgICAgICAgIHRoaXMuaXNGZXRjaERhdGFGb3IgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICB0aGlzLmlucHV0ID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93ID0gbnVsbDtcbiAgICB0aGlzLm9wZW5Xb3JrZmxvd0lucHV0ID0gZmFsc2U7XG4gICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRBc2tIZWFkZXJzKGJlYXJlclRva2VuOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGhlYWRlcnM6IGFueSA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICBBdXRob3JpemF0aW9uOiAnQmVhcmVyICcgKyBiZWFyZXJUb2tlbixcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmV2ZW50VXJsKSB7XG4gICAgICBoZWFkZXJzWydldmVudHVybCddID0gdGhpcy5ldmVudFVybDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXZlbnRJZCkge1xuICAgICAgaGVhZGVyc1snZXZlbnRpZCddID0gdGhpcy5ldmVudElkO1xuICAgIH1cbiAgICBpZiAodGhpcy5ldmVudFRva2VuKSB7XG4gICAgICBoZWFkZXJzWydldmVudHRva2VuJ10gPSB0aGlzLmV2ZW50VG9rZW47XG4gICAgfVxuICAgIGlmICh0aGlzLndvcmtzcGFjZVRva2VuKSB7XG4gICAgICBoZWFkZXJzWyd3b3Jrc3BhY2VUb2tlbiddID0gdGhpcy53b3Jrc3BhY2VUb2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUFza1VuYXV0aG9yaXplZChtc2c/OiBhbnksIGNoYXQ/OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmlzNDAxID0gdHJ1ZTtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbi5lbWl0KCk7XG4gICAgaWYgKG1zZyAmJiBjaGF0KSB7XG4gICAgICB0aGlzLm1zZyA9IG1zZztcbiAgICAgIHRoaXMuY2hhdCA9IGNoYXQ7XG4gICAgICB0aGlzLmlzRmV0Y2hEYXRhRm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzY29ubmVjdEFza1dlYlNvY2tldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hc2tXZWJTb2NrZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuYXNrV2ViU29ja2V0LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgIHRoaXMuYXNrV2ViU29ja2V0ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5hc2tXZWJTb2NrZXRDb25uZWN0aW9uS2V5ID0gJyc7XG4gICAgdGhpcy5hY3RpdmVBc2tNZXNzYWdlSWQgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQXNrV2ViU29ja2V0KFxuICAgIGJlYXJlclRva2VuOiBzdHJpbmcsXG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBtc2c/OiBhbnksXG4gICAgY2hhdD86IGFueSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29ubmVjdGlvbktleSA9IGAke2NvbnZlcnNhdGlvbklkfToke3Nlc3Npb25JZH1gO1xuICAgIGlmIChcbiAgICAgIHRoaXMuYXNrV2ViU29ja2V0ICYmXG4gICAgICB0aGlzLmFza1dlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTiAmJlxuICAgICAgdGhpcy5hc2tXZWJTb2NrZXRDb25uZWN0aW9uS2V5ID09PSBjb25uZWN0aW9uS2V5XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNjb25uZWN0QXNrV2ViU29ja2V0KCk7XG5cbiAgICBjb25zdCBhc2tOZXdVcmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9haS9hc2stYWlgO1xuICAgIGNvbnN0IGNvbm5lY3RCb2R5ID0ge1xuICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxuICAgICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgICAgIHNlc3Npb25faWQ6IHNlc3Npb25JZCxcbiAgICAgIG1jcF9lbmFibGU6IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFza05ld1VybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB0aGlzLmJ1aWxkQXNrSGVhZGVycyhiZWFyZXJUb2tlbiksXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25uZWN0Qm9keSksXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHRoaXMuaGFuZGxlQXNrVW5hdXRob3JpemVkKG1zZywgY2hhdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYXV0aG9yaXplZCB3aGlsZSBjb25uZWN0aW5nIGFzayB3ZWJzb2NrZXQgKCR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhc2sgd2Vic29ja2V0ICgke3Jlc3BvbnNlLnN0YXR1c30pOiAke3Jlc3BvbnNlVGV4dH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnN0IHdzVXJsID0gZGF0YT8ud3NfdXJsO1xuICAgIGlmICghd3NVcmwgfHwgdHlwZW9mIHdzVXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhc2stbmV3IHJlc3BvbnNlIG1pc3Npbmcgd3NfdXJsJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIHdzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuYXNrV2ViU29ja2V0ID0gd3M7XG4gICAgICAgIHRoaXMuYXNrV2ViU29ja2V0Q29ubmVjdGlvbktleSA9IGNvbm5lY3Rpb25LZXk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIHdzLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUFza1dlYlNvY2tldE1lc3NhZ2UoZXZlbnQ/LmRhdGEpO1xuICAgICAgfTtcblxuICAgICAgd3Mub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0FzayB3ZWJzb2NrZXQgY29ubmVjdGlvbiBlcnJvcicpKTtcbiAgICAgIH07XG5cbiAgICAgIHdzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0FzayB3ZWJzb2NrZXQgY2xvc2VkIGJlZm9yZSBvcGVuaW5nJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFza1dlYlNvY2tldCA9IG51bGw7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cHNlcnRBaUNoYXRNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgY3VycmVudENoYXRNZXNzYWdlID0gdGhpcy5jaGF0TG9nLmZpbmQoKHApID0+IHAuX2lkID09IG1lc3NhZ2VJZCk7XG4gICAgaWYgKCFjdXJyZW50Q2hhdE1lc3NhZ2UpIHtcbiAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZSA9IHtcbiAgICAgICAgX2lkOiBtZXNzYWdlSWQsXG4gICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICB9O1xuICAgICAgdGhpcy5jaGF0TG9nLnB1c2goY3VycmVudENoYXRNZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRDaGF0TWVzc2FnZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9vbENvbnRlbnRTdHJpbmcodG9vbFJlc3VsdDogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIHRvb2xSZXN1bHQ/LnRvb2xfcmVzdWx0Py5tZXNzYWdlcz8uWzBdPy5jb250ZW50ID8/XG4gICAgICB0b29sUmVzdWx0Py5tZXNzYWdlcz8uWzBdPy5jb250ZW50ID8/XG4gICAgICB0b29sUmVzdWx0Py5jb250ZW50ID8/XG4gICAgICAnJztcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSByZXR1cm4gY29udGVudDtcbiAgICBpZiAoY29udGVudCA9PSBudWxsKSByZXR1cm4gJyc7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjb250ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJpbWFyeVRvb2xSZXN1bHQodG9vbFJlc3VsdHM6IGFueSk6IHtcbiAgICB0b29sTmFtZTogc3RyaW5nO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgfSB8IG51bGwge1xuICAgIGlmICghdG9vbFJlc3VsdHMpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY2FuZGlkYXRlczogYW55W10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0b29sUmVzdWx0cykpIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCguLi50b29sUmVzdWx0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh0b29sUmVzdWx0cyk7XG4gICAgICBpZiAodG9vbFJlc3VsdHM/LnNlcmlhbGl6YWJsZV90b19yZXR1cm4pIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHRvb2xSZXN1bHRzLnNlcmlhbGl6YWJsZV90b19yZXR1cm4pO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0b29sUmVzdWx0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXModG9vbFJlc3VsdHMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjb25zdCB2OiBhbnkgPSB2YWx1ZTtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7IC4uLnYsIHRvb2xfbmFtZTogdj8udG9vbF9uYW1lIHx8IGtleSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHRvb2xOYW1lID0gY2FuZGlkYXRlPy50b29sX25hbWU7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRUb29sQ29udGVudFN0cmluZyhjYW5kaWRhdGUpO1xuICAgICAgaWYgKHRvb2xOYW1lICYmIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgdG9vbE5hbWUsIGNvbnRlbnQgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUb29sUmVzdWx0Q2FyZE1lc3NhZ2UoXG4gICAgY3VycmVudENoYXRNZXNzYWdlOiBhbnksXG4gICAgbWVzc2FnZUlkOiBzdHJpbmcsXG4gICAgYW5zd2VyVGV4dDogc3RyaW5nLFxuICAgIHRvb2xSZXN1bHRzOiBhbnksXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByaW1hcnlUb29sID0gdGhpcy5nZXRQcmltYXJ5VG9vbFJlc3VsdCh0b29sUmVzdWx0cyk7XG4gICAgaWYgKCFwcmltYXJ5VG9vbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdG9vbE5hbWUgPSBwcmltYXJ5VG9vbC50b29sTmFtZTtcbiAgICBjb25zdCBjb250ZW50U3RyID0gcHJpbWFyeVRvb2wuY29udGVudDtcblxuICAgIGNvbnN0IHNldEJhc2UgPSAodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuX2lkID0gbWVzc2FnZUlkO1xuICAgICAgY3VycmVudENoYXRNZXNzYWdlLnR5cGUgPSB0eXBlO1xuICAgICAgY3VycmVudENoYXRNZXNzYWdlLm1lc3NhZ2UgPSBhbnN3ZXJUZXh0XG4gICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoYW5zd2VyVGV4dClcbiAgICAgICAgOiAnJztcbiAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS50aW1lID0gY3VycmVudENoYXRNZXNzYWdlLnRpbWUgfHwgZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpO1xuICAgIH07XG5cbiAgICBjb25zdCBpc1Nlc3Npb25Ub29sID1cbiAgICAgIHRvb2xOYW1lID09PSAnZ2V0X2V2ZW50X3Nlc3Npb25zJyB8fFxuICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc2Vzc2lvbnNfdjInIHx8XG4gICAgICB0b29sTmFtZSA9PT0gJ2dldF9zZXNzaW9uc19ieV9pbnRlcmVzdCcgfHxcbiAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3Nlc3Npb25zX2J5X3RyYWNrJyB8fFxuICAgICAgdG9vbE5hbWUgPT09ICdnZXRfc3BlYWtlcl9zZXNzaW9ucycgfHxcbiAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3VwY29taW5nX3Nlc3Npb25zJyB8fFxuICAgICAgdG9vbE5hbWUgPT09ICdnZXRfbXlfYWdlbmRhJztcblxuICAgIGlmIChpc1Nlc3Npb25Ub29sKSB7XG4gICAgICBsZXQgc2Vzc2lvbnM6IGFueVtdID0gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRTdHIpO1xuICAgICAgICBzZXNzaW9ucyA9IHBhcnNlZD8uc2Vzc2lvbnMgPz8gW107XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBzZXNzaW9ucyA9IHRoaXMucGFyc2VTZXNzaW9uQ29udGVudFYyKGNvbnRlbnRTdHIpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTZXNzaW9uc1RvQ2FyZERhdGEoc2Vzc2lvbnMpO1xuICAgICAgdGhpcy5lbnN1cmVTcGVha2Vyc0ZvclNlc3Npb25DYXJkcyhtYXBwZWQpO1xuICAgICAgaWYgKG1hcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldEJhc2UoJ3Nlc3Npb25fY2FyZHMnKTtcbiAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnNlc3Npb25DYXJkcyA9IG1hcHBlZDtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRvb2xOYW1lID09PSAnZ2V0X2V2ZW50X2F0dGVuZGVlcycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwQXR0ZW5kZWVzVG9DYXJkRGF0YShwYXJzZWQ/LmF0dGVuZGVlcyA/PyBbXSk7XG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldEJhc2UoJ2F0dGVuZGVlX2NhcmRzJyk7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLmF0dGVuZGVlQ2FyZHMgPSBtYXBwZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9zcGVha2VycycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwU3BlYWtlcnNUb0NhcmREYXRhKFxuICAgICAgICAgIHBhcnNlZD8uc3BlYWtlcnMgPz8gcGFyc2VkPy5zcGVha2VyID8/IFtdLFxuICAgICAgICApO1xuICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRCYXNlKCdzcGVha2VyX2NhcmRzJyk7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnNwZWFrZXJDYXJkcyA9IG1hcHBlZDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRvb2xOYW1lID09PSAnZ2V0X2V2ZW50X3Nwb25zb3JzJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTcG9uc29yc1RvQ2FyZERhdGEocGFyc2VkPy5zcG9uc29ycyA/PyBbXSk7XG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldEJhc2UoJ3Nwb25zb3JfY2FyZHMnKTtcbiAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc3BvbnNvckNhcmRzID0gbWFwcGVkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfYm9vdGhzJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBCb290aHNUb0NhcmREYXRhKHBhcnNlZD8uYm9vdGhzID8/IFtdKTtcbiAgICAgICAgaWYgKG1hcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0QmFzZSgnc3BvbnNvcl9jYXJkcycpO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5zcG9uc29yQ2FyZHMgPSBtYXBwZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0b29sTmFtZSA9PT0gJ2dldF9ib290aF9yZXByZXNlbnRhdGl2ZXMnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRTdHIpO1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0aGlzLm1hcEJvb3RoUmVwc1RvQ2FyZERhdGEocGFyc2VkPy5yZXByZXNlbnRhdGl2ZXMgPz8gW10pO1xuICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRCYXNlKCdib290aF9yZXBfY2FyZHMnKTtcbiAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuYm9vdGhSZXBDYXJkcyA9IG1hcHBlZDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBc2tXZWJTb2NrZXRNZXNzYWdlKHJhd01lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgIGlmICghcmF3TWVzc2FnZSkgcmV0dXJuO1xuXG4gICAgbGV0IHBhcnNlZDogYW55ID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID1cbiAgICAgICAgdHlwZW9mIHJhd01lc3NhZ2UgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyYXdNZXNzYWdlKSA6IHJhd01lc3NhZ2UgPz8gbnVsbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbQXNrTmV3IFdTXSBOb24tSlNPTiBwYXlsb2FkOicsIHJhd01lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHBhcnNlZD8uZGF0YSA/PyB7fTtcbiAgICBjb25zdCBtZXNzYWdlSWQgPVxuICAgICAgcGF5bG9hZD8ubWVzc2FnZV9pZCB8fCBwYXJzZWQ/Lm1lc3NhZ2VfaWQgfHwgdGhpcy5hY3RpdmVBc2tNZXNzYWdlSWQgfHwgJyc7XG5cbiAgICBzd2l0Y2ggKHBhcnNlZD8udHlwZSkge1xuICAgICAgY2FzZSAnY2h1bmsnOiB7XG4gICAgICAgIGlmICghbWVzc2FnZUlkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGlzTmV3QWlNZXNzYWdlID0gIXRoaXMuY2hhdExvZy5maW5kKChwKSA9PiBwLl9pZCA9PSBtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBjdXJyZW50Q2hhdE1lc3NhZ2UgPSB0aGlzLnVwc2VydEFpQ2hhdE1lc3NhZ2UobWVzc2FnZUlkKTtcbiAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLm1lc3NhZ2UgPSBgJHtjdXJyZW50Q2hhdE1lc3NhZ2UubWVzc2FnZSB8fCAnJ30ke3BheWxvYWQ/LnRleHQgfHwgJyd9YDtcbiAgICAgICAgaWYgKGlzTmV3QWlNZXNzYWdlKSB7XG4gICAgICAgICAgLy8gRmlyc3QgY2h1bms6IGhpZGUgVGhpbmtpbmcgaW5kaWNhdG9yIGFuZCBzY3JvbGwgdG8gdGhlIG1lc3NhZ2Ugc3RhcnRcbiAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0FpTWVzc2FnZShtZXNzYWdlSWQpLCAzMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQm90dG9tKHRydWUpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Fuc3dlcic6IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDaGF0TWVzc2FnZSA9IHRoaXMudXBzZXJ0QWlDaGF0TWVzc2FnZShtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBmaW5hbEFuc3dlciA9IHBheWxvYWQ/LnRleHQgPz8gY3VycmVudENoYXRNZXNzYWdlLm1lc3NhZ2UgPz8gJyc7XG4gICAgICAgIGNvbnN0IGhhc0NhcmRSZXNwb25zZSA9IHRoaXMuYXBwbHlUb29sUmVzdWx0Q2FyZE1lc3NhZ2UoXG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICBmaW5hbEFuc3dlcixcbiAgICAgICAgICBwYXlsb2FkPy50b29sX3Jlc3VsdHMsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzQ2FyZFJlc3BvbnNlKSB7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnR5cGUgPSAnYWknO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5tZXNzYWdlID0gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoZmluYWxBbnN3ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQ/LnN1Z2dlc3Rpb25zKSkge1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5yZWxhdGVkTGlzdEl0ZW1zID0gcGF5bG9hZC5zdWdnZXN0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkPy53ZWJfcmVzdWx0cykpIHtcbiAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc291cmNlc0xpc3QgPSBwYXlsb2FkLndlYl9yZXN1bHRzO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5kaXNwbGF5ZWRTb3VyY2VzID0gcGF5bG9hZC53ZWJfcmVzdWx0cz8uc2xpY2UoMCwgMyk7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnJlbWFpbmluZ1NvdXJjZXMgPSBwYXlsb2FkLndlYl9yZXN1bHRzPy5zbGljZSgzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZD8udG9vbF9yZXN1bHRzKSB7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnRvb2xSZXN1bHRzID0gcGF5bG9hZC50b29sX3Jlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuYWN0aXZlQXNrTWVzc2FnZUlkID0gJyc7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgdGhpcy5mb2N1c09uVGV4dGFyZWEoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHRoaXMuYWN0aXZlQXNrTWVzc2FnZUlkID0gJyc7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0YXR1cyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbmRBc2tNZXNzYWdlT3ZlcldlYlNvY2tldChcbiAgICBib2R5OiBhbnksXG4gICAgYmVhcmVyVG9rZW46IHN0cmluZyxcbiAgICBtc2c/OiBhbnksXG4gICAgY2hhdD86IGFueSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY29udmVyc2F0aW9uSWQgPSBib2R5Py5jb252ZXJzYXRpb25faWQgfHwgdGhpcy5jb252ZXJzYXRpb25LZXkgfHwgJyc7XG4gICAgY29uc3Qgc2Vzc2lvbklkID0gYm9keT8uc2Vzc2lvbl9pZCB8fCB0aGlzLmNvblNlc3Npb25LZXkgfHwgJyc7XG4gICAgaWYgKCFjb252ZXJzYXRpb25JZCB8fCAhc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW5zdXJlQXNrV2ViU29ja2V0KGJlYXJlclRva2VuLCBjb252ZXJzYXRpb25JZCwgc2Vzc2lvbklkLCBtc2csIGNoYXQpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hc2tXZWJTb2NrZXQgfHwgdGhpcy5hc2tXZWJTb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzayB3ZWJzb2NrZXQgaXMgbm90IG9wZW4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUFza01lc3NhZ2VJZCA9IGJvZHk/Lm1lc3NhZ2VfaWQgfHwgJyc7XG4gICAgICAgIHRoaXMuYXNrV2ViU29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgICAgICB0aGlzLmlzNDAxID0gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VuZGluZyBhc2stbmV3IHdlYnNvY2tldCBtZXNzYWdlOicsIGVycik7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBtYWtlQXNrUmVxdWVzdG9sZChcbiAgICBpbnB1dE1zZzogc3RyaW5nLFxuICAgIGFnZW50czogYW55W10sXG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyxcbiAgICBtc2c/OiBhbnksXG4gICAgY2hhdD86IGFueSxcbiAgICB3b3JrZmxvd0lkPzogc3RyaW5nLFxuICAgIHdvcmtmbG93X2lucHV0cz86IGFueSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYWkvYXNrYDtcblxuICAgIGNvbnN0IGJvZHk6IGFueSA9IHtcbiAgICAgIHVzZXJfcXVlc3Rpb246IGlucHV0TXNnLFxuICAgICAgdXNlcl9pZDogdGhpcy51c2VySWQsXG4gICAgICBib3RfaWQ6IHRoaXMuYm90SWQsXG4gICAgICBtZXNzYWdlX2lkOiB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2VuZXJhdGVLZXkoKSxcbiAgICAgIGFnZW50czogYWdlbnRzPy5maWx0ZXIoKHApID0+IHAuc2VsZWN0ZWQpLm1hcCgocCkgPT4gcC5pZCkgPz8gW10sXG4gICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgZmlyc3RfbmFtZTogdGhpcy5maXJzdE5hbWUsXG4gICAgICBsYXN0X25hbWU6IHRoaXMubGFzdE5hbWUsXG4gICAgfTtcblxuICAgIGlmICh3b3JrZmxvd0lkKSB7XG4gICAgICBib2R5Wyd3b3JrZmxvd19pZCddID0gd29ya2Zsb3dJZDtcbiAgICAgIGJvZHlbJ3dvcmtmbG93X2lucHV0cyddID0gd29ya2Zsb3dfaW5wdXRzO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgICBldmVudElkOiB0aGlzLmV2ZW50SWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmh0dHAucG9zdCh1cmwsIGJvZHksIHsgaGVhZGVycyB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZGF0YSk7XG4gICAgICAgIC8vIEFkZGl0aW9uYWwgcmVzcG9uc2UgaGFuZGxpbmcgaWYgbmVlZGVkXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICcsIGVycik7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbnB1dCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvdyA9IG51bGw7XG4gICAgdGhpcy5vcGVuV29ya2Zsb3dJbnB1dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXb3JrZmxvd09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZW5lcmF0ZU1hcmtkb3duKHRpdGxlLCBvYmopIHtcbiAgICAvLyBJbml0aWFsaXplIG1hcmtkb3duIHdpdGggdGhlIHRpdGxlXG4gICAgbGV0IG1hcmtkb3duID0gYCMjICR7dGl0bGV9XFxuYDtcblxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgb2JqZWN0IGFuZCBhcHBlbmQgdGhlIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICB2YXIga2V5X2xhYmVsID1cbiAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93LlRyaWdnZXIuSW5wdXRTY2hlbWEuZmluZChcbiAgICAgICAgICAoaW5wdXQpID0+IGlucHV0LklucHV0SWQgPT09IGtleSxcbiAgICAgICAgKT8uTGFiZWwgfHwga2V5O1xuICAgICAgbWFya2Rvd24gKz0gYC0gKioke2tleV9sYWJlbH0qKjogJHt2YWx1ZX1cXG5gO1xuICAgIH1cblxuICAgIHJldHVybiBtYXJrZG93bjtcbiAgfVxuXG4gIHNob3dXb3JrZmxvd0hpc3RvcnlEZXRhaWxzKHdvcmtmbG93X2lkKSB7XG4gICAgaWYgKCF3b3JrZmxvd19pZCkge1xuICAgICAgdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB0aGlzLmN1cnJlbnRXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM7XG4gICAgICB0aGlzLnNob3dXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYm90U2VydmljZS5nZXRXb3JrZmxvd0V4ZWN1dGlvbkJ5SWQod29ya2Zsb3dfaWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcy5BY3Rpb25zICYmIEFycmF5LmlzQXJyYXkocmVzLkFjdGlvbnMpKSB7XG4gICAgICAgIHJlcy5BY3Rpb25zID0gcmVzLkFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLkluc2VydFRpbWVTdGFtcCkge1xuICAgICAgICAgICAgYWN0aW9uLkluc2VydFRpbWVTdGFtcCA9IGZvcm1hdFRpbWVTdGFtcHMoXG4gICAgICAgICAgICAgIHRoaXMudGltZXpvbmUsXG4gICAgICAgICAgICAgIGFjdGlvbi5JbnNlcnRUaW1lU3RhbXAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmVzLkluc2VydFRpbWVTdGFtcCA9IGZvcm1hdFRpbWVTdGFtcHMoXG4gICAgICAgIHRoaXMudGltZXpvbmUsXG4gICAgICAgIHJlcy5JbnNlcnRUaW1lU3RhbXAsXG4gICAgICApO1xuICAgICAgdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSByZXM7XG4gICAgICB0aGlzLnNob3dXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB0cnVlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VNb2RhbCgpIHtcbiAgICB0aGlzLnNob3dXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSBmYWxzZTtcbiAgfVxuXG4gIG9iamVjdFRvQXJyYXkob2JqOiBhbnkpOiBhbnlbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubWFwKChrZXkpID0+ICh7IGtleSwgdmFsdWU6IG9ialtrZXldIH0pKTtcbiAgfVxuXG4gIHN0YXJ0TmV3Q29udmVyc2F0aW9uKCkge1xuICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleShcbiAgICAgIHRoaXMuYm90SWQsXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5ldmVudElkLFxuICAgICk7XG4gICAgdGhpcy5jaGF0TG9nID0gW3RoaXMuY2hhdExvZ1swXV07XG4gICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RBc2tXZWJTb2NrZXQoKTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVNwZWVjaFJlY29nbml6ZXIodG9rZW46IHN0cmluZykge1xuICAgIHRoaXMuc3BlZWNoQ29uZmlnID0gU3BlZWNoU0RLLlNwZWVjaENvbmZpZy5mcm9tQXV0aG9yaXphdGlvblRva2VuKFxuICAgICAgdG9rZW4sXG4gICAgICB0aGlzLnJlZ2lvbixcbiAgICApO1xuICAgIGNvbnN0IGF1ZGlvQ29uZmlnID0gU3BlZWNoU0RLLkF1ZGlvQ29uZmlnLmZyb21EZWZhdWx0TWljcm9waG9uZUlucHV0KCk7XG4gICAgdGhpcy5yZWNvZ25pemVyID0gbmV3IFNwZWVjaFNESy5TcGVlY2hSZWNvZ25pemVyKFxuICAgICAgdGhpcy5zcGVlY2hDb25maWcsXG4gICAgICBhdWRpb0NvbmZpZyxcbiAgICApO1xuXG4gICAgdGhpcy5yZWNvZ25pemVyLnJlY29nbml6aW5nID0gKHMsIGUpID0+IHtcbiAgICAgIGlmIChlLnJlc3VsdC5yZWFzb24gPT09IFNwZWVjaFNESy5SZXN1bHRSZWFzb24uUmVjb2duaXppbmdTcGVlY2gpIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGUucmVzdWx0LnRleHQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvZ25pemluZzogJHtlLnJlc3VsdC50ZXh0fWApO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZWNvZ25pemVyLnJlY29nbml6ZWQgPSAocywgZSkgPT4ge1xuICAgICAgaWYgKGUucmVzdWx0LnJlYXNvbiA9PT0gU3BlZWNoU0RLLlJlc3VsdFJlYXNvbi5SZWNvZ25pemVkU3BlZWNoKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBlLnJlc3VsdC50ZXh0O1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVjb2duaXplZDogJHtlLnJlc3VsdC50ZXh0fWApO1xuICAgICAgICB0aGlzLnRvZ2dsZVJlY29yZGluZygpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yZWNvZ25pemVyLmNhbmNlbGVkID0gKHMsIGUpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NhbmNlbGVkOiAnLCBlLmVycm9yRGV0YWlscyk7XG4gICAgfTtcblxuICAgIHRoaXMucmVjb2duaXplci5zZXNzaW9uU3RvcHBlZCA9IChzLCBlKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnU2Vzc2lvbiBzdG9wcGVkLicpO1xuICAgICAgdGhpcy5yZWNvZ25pemVyLnN0b3BDb250aW51b3VzUmVjb2duaXRpb25Bc3luYygpO1xuICAgICAgdGhpcy5mZXRjaERhdGEoKTtcbiAgICB9O1xuICB9XG5cbiAgdG9nZ2xlUmVjb3JkaW5nKCkge1xuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSAhdGhpcy5pc1JlY29yZGluZztcblxuICAgIGlmICh0aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICB0aGlzLnN0YXJ0UmVjb2duaXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdG9wUmVjb2duaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBzdGFydFJlY29nbml0aW9uKCkge1xuICAgIHRoaXMucmVjb2duaXplci5zdGFydENvbnRpbnVvdXNSZWNvZ25pdGlvbkFzeW5jKCk7XG4gIH1cblxuICBzdG9wUmVjb2duaXRpb24oKSB7XG4gICAgdGhpcy5yZWNvZ25pemVyLnN0b3BDb250aW51b3VzUmVjb2duaXRpb25Bc3luYygpO1xuICB9XG5cbiAgY2hlY2tGb3JDb3AyOUJvdElkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmJvdElkID09ICc2NmZhM2YyNzZjNWQ3MWUyNzE3YmZlYTgnIHx8XG4gICAgICB0aGlzLmJvdElkID09ICc2NzE2MzM1NDU2NTJkZDc4ZWZlYzg0OGQnXG4gICAgKTtcbiAgfVxuXG4gIGdldExhdGVzdFRpbWUodGltZSk6IHN0cmluZyB7XG4gICAgaWYgKHRpbWUpIHtcbiAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHtcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIH0pOyAvLyByZXR1cm5zIGN1cnJlbnQgdGltZSBpbiAnc2hvcnRUaW1lJyBmb3JtYXRcbiAgfVxuXG4gIC8qKiBVc2VkIGJ5IHRoZSB2b2ljZSBtb2RhbCB3aGVuIG9wZW5lZCBmcm9tIHRoaXMgZHJhd2VyLiAqL1xuICB2b2ljZU1vZGFsQ29udmVyc2F0aW9uSWQ6IHN0cmluZyA9ICcnO1xuXG4gIG9wZW5Wb2ljZU1vZGFsKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbklkID1cbiAgICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID8/XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KHRoaXMuYm90SWQsIGZhbHNlLCB0aGlzLmV2ZW50SWQpID8/XG4gICAgICAnJztcbiAgICB0aGlzLnZvaWNlTW9kYWxDb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgIHRoaXMuc2V0dXBWb2ljZVRyYW5zY3JpcHRzKCk7XG5cbiAgICAvLyBDbG9zZSBleGlzdGluZyBvdmVybGF5IGlmIGFueVxuICAgIGlmICh0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWc6IFZvaWNlTW9kYWxDb25maWcgPSB7XG4gICAgICBhcGlVcmw6IHRoaXMuZW52aXJvbm1lbnQ/LkJBU0VfVVJMID8/ICcnLFxuICAgICAgdG9rZW46IHRoaXMuczI3VG9rZW4gPz8gJycsXG4gICAgICBib3RJZDogdGhpcy5ib3RJZCA/PyAnJyxcbiAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgYXBpS2V5OiB0aGlzLmFwaUtleSA/PyAnJyxcbiAgICAgIGV2ZW50VG9rZW46IHRoaXMuZXZlbnRUb2tlbiA/PyAnJyxcbiAgICAgIGV2ZW50SWQ6IHRoaXMuZXZlbnRJZCxcbiAgICAgIGV2ZW50VXJsOiB0aGlzLmV2ZW50VXJsID8/ICcnLFxuICAgICAgZG9tYWluQXV0aG9yaXR5OiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlID8/ICdwcm9kLWxpdGUnLFxuICAgICAgYWdlbnROYW1lOiB0aGlzLmJvdE5hbWUgfHwgJ0FJIEFzc2lzdGFudCcsXG4gICAgICBhZ2VudFJvbGU6IHRoaXMuYm90U2tpbGxzIHx8ICdBSSBBZ2VudCBTcGVjaWFsaXN0JyxcbiAgICAgIGFnZW50QXZhdGFyOiB0aGlzLmJvdEljb24sXG4gICAgICB1c2Vyc0FwaVVybDogdGhpcy5lbnZpcm9ubWVudD8uVVNFUlNfQVBJID8/ICcnLFxuICAgIH07XG5cbiAgICBjb25zdCBjbG9zZUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYpIHtcbiAgICAgICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5jbG9zZVZvaWNlTW9kYWwoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoXG4gICAgICBbXG4gICAgICAgIHsgcHJvdmlkZTogVk9JQ0VfTU9EQUxfQ09ORklHLCB1c2VWYWx1ZTogY29uZmlnIH0sXG4gICAgICAgIHsgcHJvdmlkZTogVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIHVzZVZhbHVlOiBjbG9zZUNhbGxiYWNrIH0sXG4gICAgICBdLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICApO1xuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoe1xuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLmJsb2NrKCksXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlcbiAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgLmdsb2JhbCgpXG4gICAgICAgIC5ib3R0b20oJzAnKVxuICAgICAgICAucmlnaHQoJzAnKVxuICAgICAgICAubGVmdCgnMCcpXG4gICAgICAgIC50b3AoJzAnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoXG4gICAgICBWb2ljZUFnZW50TW9kYWxDb21wb25lbnQsXG4gICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYsXG4gICAgICBpbmplY3RvcixcbiAgICApO1xuICAgIG92ZXJsYXlSZWYuYXR0YWNoKHBvcnRhbCk7XG4gICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZiA9IG92ZXJsYXlSZWY7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjbG9zZVZvaWNlTW9kYWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICB0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmlzVm9pY2VNb2RhbE9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIFJlbG9hZCBjaGF0IGhpc3Rvcnkgd2hlbiB2b2ljZSBtb2RhbCBjbG9zZXMgKHNhbWUgYXMgaW5pdGlhbCBsb2FkKVxuICAgIHRoaXMuY2hhdExvZyA9IFtdO1xuICAgIHRoaXMuZmV0Y2hDaGF0SGlzdG9yeSgpLnN1YnNjcmliZShcbiAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXBDaGF0SGlzdG9yeShyZXNwb25zZSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3RvcnkgYWZ0ZXIgdm9pY2UgbW9kYWwgY2xvc2U6JyxcbiAgICAgICAgICBlcnIsXG4gICAgICAgICk7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBzaG93IGdyZWV0aW5nIHNvIGNoYXQgaXMgbm90IGVtcHR5XG4gICAgICAgIGlmICh0aGlzLmNoYXRMb2cubGVuZ3RoID09PSAwICYmIHRoaXMuZ3JlZXRpbmdNc2cpIHtcbiAgICAgICAgICB0aGlzLm1hcENoYXRIaXN0b3J5KHsgTWVzc2FnZXM6IFtdIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwVm9pY2VUcmFuc2NyaXB0cygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBleGlzdGluZyBzdWJzY3JpcHRpb25zXG4gICAgdGhpcy52b2ljZVRyYW5zY3JpcHRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMudm9pY2VUcmFuc2NyaXB0U3Vic2NyaXB0aW9ucyA9IFtdO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHVzZXIgdHJhbnNjcmlwdHNcbiAgICBjb25zdCB1c2VyU3ViID0gdGhpcy52b2ljZUFnZW50U2VydmljZS51c2VyVHJhbnNjcmlwdCQuc3Vic2NyaWJlKFxuICAgICAgKHRyYW5zY3JpcHQpID0+IHtcbiAgICAgICAgaWYgKHRyYW5zY3JpcHQuZmluYWwgJiYgdHJhbnNjcmlwdC50ZXh0LnRyaW0oKSkge1xuICAgICAgICAgIC8vIEFkZCB1c2VyIG1lc3NhZ2UgdG8gY2hhdFxuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KHRyYW5zY3JpcHQudGV4dCksXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBib3QgdHJhbnNjcmlwdHNcbiAgICBjb25zdCBib3RTdWIgPSB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmJvdFRyYW5zY3JpcHQkLnN1YnNjcmliZShcbiAgICAgICh0cmFuc2NyaXB0KSA9PiB7XG4gICAgICAgIGlmICh0cmFuc2NyaXB0ICYmIHRyYW5zY3JpcHQudHJpbSgpKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgbGFzdCBtZXNzYWdlIGlzIGZyb20gYm90LCB1cGRhdGUgaXQsIG90aGVyd2lzZSBhZGQgbmV3XG4gICAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2UgPSB0aGlzLmNoYXRMb2dbdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDFdO1xuICAgICAgICAgIGlmIChsYXN0TWVzc2FnZSAmJiBsYXN0TWVzc2FnZS50eXBlID09PSAnYWknKSB7XG4gICAgICAgICAgICBsYXN0TWVzc2FnZS5tZXNzYWdlID0gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkodHJhbnNjcmlwdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkodHJhbnNjcmlwdCksXG4gICAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy52b2ljZVRyYW5zY3JpcHRTdWJzY3JpcHRpb25zLnB1c2godXNlclN1YiwgYm90U3ViKTtcbiAgfVxufVxuXG5leHBvcnQgeyBWb2ljZU1vZGFsQ29uZmlnIH0gZnJvbSAnLi4vdm9pY2UtYWdlbnQvdm9pY2UtbW9kYWwtdG9rZW5zJztcbiIsIjwhLS0gPGJ1dHRvblxuICAqbmdJZj1cImlzU2hvd0VkaXRvckJ1dHRvbiAmJiAhY2hlY2tGb3JDb3AyOUJvdElkKClcIlxuICAoY2xpY2spPVwib3Blbk91dGVyRWRpdG9yKClcIlxuICBjbGFzcz1cImZpeGVkLWJ0blwiXG4+XG4gIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4XCIgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZVwiPlxuICAgIGNyZWF0ZVxuICA8L3NwYW4+XG4gIEVkaXRvclxuPC9idXR0b24+IC0tPlxuXG48YnV0dG9uXG4gICpuZ0lmPVwiIWlzU2hvd0VkaXRvckJ1dHRvblwiXG4gIChjbGljayk9XCJvbkNsb3NlRWRpdG9yKClcIlxuICBjbGFzcz1cImZpeGVkLWJ0bi1jbG9zZVwiXG4+XG4gIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4XCIgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZVwiPlxuICAgIGNsb3NlXG4gIDwvc3Bhbj5cbiAge3sgZ2V0VHJhbnNsYXRpb24oXCJDbG9zZVwiKSB9fVxuPC9idXR0b24+XG5cbjxtYXQtZHJhd2VyLWNvbnRhaW5lclxuICBjbGFzcz1cImhpdmVncHQtY2hhdC1ib3Qtd3JhcHBlclwiXG4gIFtuZ0NsYXNzXT1cInsgJ21hdC1kcmF3ZXItY29udGFpbmVyLWhhcy1vcGVuJzogaXNEcmF3ZXJPcGVuIH1cIlxuICBbY2xhc3MuaW9zLWRldmljZV09XCJpc0lPU0RldmljZVwiXG4gIFtoYXNCYWNrZHJvcF09XCJoYXNCYWNrZHJvcFZhbHVlXCJcbj5cbiAgPG1hdC1kcmF3ZXJcbiAgICBjbGFzcz1cImRyYXdlclwiXG4gICAgI2RyYXdlclxuICAgIFtwb3NpdGlvbl09XCInc3RhcnQnXCJcbiAgICBbbW9kZV09XCInb3ZlcidcIlxuICAgIG9wZW5lZD1cInRydWVcIlxuICAgIFtjbGFzcy5mdWxsLXdpZHRoLWRyYXdlcl09XCJmdWxsVmlld1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmRdPVwiXG4gICAgICAnbGluZWFyLWdyYWRpZW50KCcgKyAoYmdHcmFkaWVudCA/IGJnR3JhZGllbnQuam9pbignLCAnKSA6ICcnKSArICcpJ1xuICAgIFwiXG4gID5cbiAgICA8bWF0LWRyYXdlci1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cImNoYXQtbWFpblwiPlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjaGF0LWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8aDI+IC0tPlxuICAgICAgICA8IS0tIHt7ZXZlbnROYW1lfX0gLS0+XG4gICAgICAgIDwhLS0gPC9oMj4gLS0+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImNsb3NlSWNvblwiIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyQ2hhdFwiICNjaGF0TWFpbj5cbiAgICAgICAgICA8ZGl2IChjbGljayk9XCJzdGFydE5ld0NvbnZlcnNhdGlvbigpXCIgY2xhc3M9XCJuZXctY29udmVyc2F0aW9uYnV0dG9uMlwiPlxuICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oXCJOZXcgQ2hhdFwiKSB9fVxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgPjxzdmdcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjE0LjA2MVwiXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTQuMjYxXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE0LjA2MSAxNC4yNjFcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGlkPVwiUGF0aF8xNjRcIlxuICAgICAgICAgICAgICAgICAgZGF0YS1uYW1lPVwiUGF0aCAxNjRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMC4xNDYsNS4wNzVINC41MzFBMS41NDQsMS41NDQsMCwwLDAsMyw2LjYzMXY3LjI2MkExLjU0NCwxLjU0NCwwLDAsMCw0LjUzMSwxNS40NWg3LjE0NmExLjU0NCwxLjU0NCwwLDAsMCwxLjUzMS0xLjU1NlY4LjE4N20tNy4xNDYsNC4xNUwxNS4yNSwzbTAsMEgxMS42NzdNMTUuMjUsM1Y2LjYzMVwiXG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuMjUgLTEuOTM5KVwiXG4gICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDZmXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAoY2xpY2spPVwiY2xvc2VCb3QuZW1pdCgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1jbG9zZS1idXR0b25cIlxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImdldFRyYW5zbGF0aW9uKCdDbG9zZScpIHx8ICdDbG9zZSdcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiZ2V0VHJhbnNsYXRpb24oJ0Nsb3NlJykgfHwgJ0Nsb3NlJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYXQtY2xvc2UtYnV0dG9uLWljb25cIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4IDZMNiAxOE02IDZsMTIgMTJcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90LXN0aWNreS1oZWFkZXItY2hhdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlX2NoYXRcIj5cbiAgICAgICAgICAgICAgPGgyPlxuICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oYm90TmFtZSkgfX1cbiAgICAgICAgICAgICAgICAgIDwhLS0gPHN2Z1xuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjaGVja0ZvckNvcDI5Qm90SWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjMxLjQ5OVwiXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjMxLjUwMVwiXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMzEuNDk5IDMxLjUwMVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJJY29uX2lvbi1zaGllbGQtY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5hbWU9XCJJY29uIGlvbi1zaGllbGQtY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgICAgICAgICBkPVwiTTMzLjY4NSw3LjgzYTEuMTI1LDEuMTI1LDAsMCwwLS45MjUtMS4wMzYsNDkuMjI3LDQ5LjIyNywwLDAsMS0xNC4zLTQuNDQ0LDEuMTI1LDEuMTI1LDAsMCwwLS45MjcsMEE0OS4yMjYsNDkuMjI2LDAsMCwxLDMuMjQsNi43OTQsMS4xMjUsMS4xMjUsMCwwLDAsMi4zMTUsNy44M2EyNy42MjEsMjcuNjIxLDAsMCwwLDEuNzE4LDExLjlBMjQuNTcyLDI0LjU3MiwwLDAsMCw5LjA3LDI3LjY0MWEyNS43MTIsMjUuNzEyLDAsMCwwLDguNTEzLDYuMDI4LDEuMTI1LDEuMTI1LDAsMCwwLC44NDQsMCwyNS43MTIsMjUuNzEyLDAsMCwwLDguNTEzLTYuMDI4LDI0LjU3MiwyNC41NzIsMCwwLDAsNS4wMjctNy45MTEsMjcuNjIxLDI3LjYyMSwwLDAsMCwxLjcxOC0xMS45Wm0tOS4yMTEsNS4yODEtNy43OTEsOWExLjEyNSwxLjEyNSwwLDAsMS0uOC4zODloLS4wNDZhMS4xMjUsMS4xMjUsMCwwLDEtLjc4OC0uMzIyTDExLjU4NywxOC43OWExLjEyNSwxLjEyNSwwLDEsMSwxLjU3NS0xLjYwN2wyLjYsMi41NTIsNy4wMS04LjFhMS4xMjUsMS4xMjUsMCwwLDEsMS43LDEuNDcyWlwiXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjI1IC0yLjI1KVwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMwNmZcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9zdmc+IC0tPlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjaGVja0ZvckNvcDI5Qm90SWQoKVwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzbWFsbC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGlvbihcIkFJLXBvd2VyZWRcIilcbiAgICAgICAgICAgICAgICAgICAgfX08c3Bhbj57eyBnZXRUcmFuc2xhdGlvbihcImNvcGlsb3RcIikgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdFR5cGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibGFiZWxDaGF0XCI+Q2hvb3NlIGEgY29udmVyc2F0aW9uIHN0eWxlPC9oND5cbiAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiY2hhbmdlVGVtcGVyYXR1cmUoMClcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRlbXBlcmF0dXJlID09PSAwIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3Atc2VjdGlvbi10aXRsZVwiPiBNb3JlIENyZWF0aXZlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIChjbGljayk9XCJjaGFuZ2VUZW1wZXJhdHVyZSgxKVwiIGNsYXNzPVwiZmRzc2ZkXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiB0ZW1wZXJhdHVyZSA9PT0gMSB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9wLXNlY3Rpb24tdGl0bGVcIj4gTW9yZSBCYWxhbmNlZCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiY2hhbmdlVGVtcGVyYXR1cmUoMilcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRlbXBlcmF0dXJlID09PSAyIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b3Atc2VjdGlvbi10aXRsZVwiPiBNb3JlIFByZWNpc2UgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwhLS0gY2hhdHR5cGUgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgaWQ9XCJib3RBbGxDaGF0XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2hhdFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgIGJvdFVzZXI6IGNoYXQ/LnR5cGUgPT09ICd1c2VyJyxcbiAgICAgICAgICAgICAgYm90QWk6IGNoYXQ/LnR5cGUgIT09ICd1c2VyJ1xuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1zZy1pZF09XCJjaGF0Py5faWQgfHwgbnVsbFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hhdCBvZiBjaGF0TG9nOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1ib3hcIiAqbmdJZj1cIiEoaSA9PT0gMCAmJiBib3RTa2lsbHMpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWN0YVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICd0aW1lLWN0YSBkaW4nOiBzaG93RmVlZEJhY2tJY29uc0luZGV4ID09PSBpLFxuICAgICAgICAgICAgICAgICAgICAndGltZS1jdGEnOiBzaG93RmVlZEJhY2tJY29uc0luZGV4ICE9IGlcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJJY29uX1RpbWVTVGFtcFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8udHlwZSA9PT0gJ2FpJyAmJiAhKGkgPT09IDAgJiYgYm90U2tpbGxzKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkFzc2lzdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYXZhdGFyLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKGRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWF2YXRhci1pbml0aWFscyBjaGF0LWF2YXRhci1pbml0aWFscy1hc3Npc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPkE8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlVGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGVUaW1lQ29sb3IgPyAnJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICMwMDAgIWltcG9ydGFudDtcIj57eyBnZXRUcmFuc2xhdGlvbihcIkFzc2lzdGFudFwiKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGF0Py50aW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJJY29uX1RpbWVTVGFtcFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ3Nlc3Npb25fY2FyZHMnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ2F0dGVuZGVlX2NhcmRzJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJBc3Npc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWF2YXRhci1pbWdcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIShkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1hdmF0YXItaW5pdGlhbHMgY2hhdC1hdmF0YXItaW5pdGlhbHMtYXNzaXN0YW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5BPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRlVGltZUNvbG9yID8gJycgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRUcmFuc2xhdGlvbihcIkFzc2lzdGFudFwiKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBjaGF0Py50aW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJY29uX1RpbWVTVGFtcFwiICpuZ0lmPVwiY2hhdD8udHlwZSA9PT0gJ3VzZXInXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLUJveFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlVGltZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0VHJhbnNsYXRpb24oXCJZb3VcIikgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBjaGF0Py50aW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidXNlckF2YXRhclVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwidXNlckF2YXRhclVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIllvdVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1hdmF0YXItaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiF1c2VyQXZhdGFyVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWF2YXRhci1pbml0aWFscyBjaGF0LWF2YXRhci1pbml0aWFscy11c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGdldFVzZXJJZEluaXRpYWxzKCkgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXJkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmFyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0Py5Xb3JrZmxvd0V4ZWN1dGlvbklkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnNob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1dvcmtmbG93SGlzdG9yeURldGFpbHMoY2hhdC5Xb3JrZmxvd0V4ZWN1dGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1iYXJzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZXNlYXJjaGluZ0NhcmRcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LnNlYXJjaFRlcm1zICYmIGNoYXQ/LnNlYXJjaFRlcm1zLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGF0Py5zb3VyY2VzTGlzdCAmJiBjaGF0Py5zb3VyY2VzTGlzdD8ubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29sbGFwc2UoKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgPjxpIGNsYXNzPVwiYnggYngtcGx1cy1jaXJjbGUgYngtc21cIj48L2lcbiAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICA+UmVzZWFyY2hpbmdcbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ0b2dnbGVJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWljb24gbWwtMiBmYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1jaGV2cm9uLWRvd24nOiBpc0NvbGxhcHNlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhLWNoZXZyb24tdXAnOiAhaXNDb2xsYXBzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID48L2lcbiAgICAgICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/LnNlYXJjaFRlcm1zICYmIGNoYXQ/LnNlYXJjaFRlcm1zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGNvbGxhcHNlOiBpc0NvbGxhcHNlZCB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoIHVwdExpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGNoYXQ/LnNlYXJjaFRlcm1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2hpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHRlcm0gfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxoNVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py5zb3VyY2VzTGlzdCAmJiBjaGF0Py5zb3VyY2VzTGlzdC5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYnggYngtdW5pdGVcIj48L2k+IFNvdXJjZXNcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic291cmNlcy1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8uc291cmNlc0xpc3QgJiYgY2hhdD8uc291cmNlc0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvdXJjZS1jYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlIG9mIGNoYXQ/LmRpc3BsYXllZFNvdXJjZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS10aXRsZVwiPnt7IHNvdXJjZS50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic291cmNlLXVybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRGYXZpY29uVXJsKHNvdXJjZS5saW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cImdldERvbWFpbk5hbWUoc291cmNlLmxpbmspICsgJyBmYXZpY29uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREb21haW5OYW1lKHNvdXJjZS5saW5rKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtdXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTGlua0luTmV3VGFiKHNvdXJjZS5saW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRGYXZpY29uVXJsKHNvdXJjZS5saW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwiZ2V0RG9tYWluTmFtZShzb3VyY2UubGluaykgKyAnIGZhdmljb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREb21haW5OYW1lKHNvdXJjZS5saW5rKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSAoY2xpY2spPVwib3BlbkxpbmtJbk5ld1RhYihzb3VyY2UubGluaylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNvdXJjZS50aXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgKGNsaWNrKT1cIm9wZW5MaW5rSW5OZXdUYWIoc291cmNlLmxpbmspXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzb3VyY2UuZGVzYyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0Py5yZW1haW5pbmdTb3VyY2VzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnJlbWFpbmluZ1NvdXJjZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic291cmNlLWNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYXJkQ2xpY2soY2hhdD8uc291cmNlc0xpc3QpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic291cmNlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2Ugb2YgY2hhdD8ucmVtYWluaW5nU291cmNlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImdldEZhdmljb25Vcmwoc291cmNlLmxpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJnZXREb21haW5OYW1lKHNvdXJjZS5saW5rKSArICcgZmF2aWNvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic291cmNlLXVybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyB7eyBjaGF0Py5yZW1haW5pbmdTb3VyY2VzLmxlbmd0aCB9fSBtb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNlc3Npb24gY2FyZHMgKGZyb20gZ2V0X2V2ZW50X3Nlc3Npb25zIHRvb2wsIHNhbWUgYXMgUmVhY3QgTmF0aXZlKSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZHMtc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnc2Vzc2lvbl9jYXJkcycgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8uc2Vzc2lvbkNhcmRzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLW1lc3NhZ2UtYnViYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBiZ0J1YmJsZUFpIHx8ICcjZmZmJyB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlNlYXJjaFRpdGxlIGFpIGNhcmQtbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlc3Npb24gb2YgZ2V0VmlzaWJsZVNlc3Npb25DYXJkcyhjaGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlc3Npb24tY2FyZC1pdGVtLW9uZGVtYW5kXT1cImlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb24pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT25EZW1hbmQgZGVzaWduOiBwaWxsLCBBdmFpbGFibGUgQW55dGltZSwgdGl0bGUsIGRlc2NyaXB0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1Nlc3Npb25PbmRlbWFuZChzZXNzaW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtb25kZW1hbmQtYmFkZ2VcIj57eyBnZXRUcmFuc2xhdGlvbignT04gREVNQU5EJykgfHwgJ09OIERFTUFORCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLW9uZGVtYW5kLWF2YWlsYWJsZVwiPnt7IGdldFRyYW5zbGF0aW9uKCdBdmFpbGFibGUgQW55dGltZScpIHx8ICdBdmFpbGFibGUgQW55dGltZScgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtdGl0bGUgc2Vzc2lvbi1jYXJkLW9uZGVtYW5kLXRpdGxlXCI+e3sgc2Vzc2lvbi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZC1kZXNjcmlwdGlvbiBzZXNzaW9uLWNhcmQtb25kZW1hbmQtZGVzY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2Vzc2lvbi5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlc3Npb24uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZC1hY3Rpb25zLXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2Vzc2lvbi5zZXNzaW9uICYmIGdldFNlc3Npb25Sb2xlQnV0dG9ucyhzZXNzaW9uKS5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwZWFrZXJzLVVJY2FyZFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcm9sZSBvZiBnZXRTZXNzaW9uUm9sZUJ1dHRvbnMoc2Vzc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBzZXNzaW9uLWNhcmQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZXNzaW9uLWNhcmQtYnRuLXByaW1hcnldPVwicm9sZS5hY3Rpb24gPT09ICdqb2luJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2Vzc2lvbi1jYXJkLWJ0bi1zZWNvbmRhcnldPVwicm9sZS5hY3Rpb24gPT09ICd3YXRjaCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlc3Npb24tY2FyZC1idG4tZGlzYWJsZWRdPVwiaXNVbkV2ZW50ICYmICFjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImlzVW5FdmVudCAmJiAhY2FuUGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZXNzaW9uQ2FyZEFjdGlvbihzZXNzaW9uLCByb2xlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm9sZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVmYXVsdCAoTGl2ZS9CcmVha291dCkgZGVzaWduOiBkYXRlIGJhZGdlLCByb29tL3RpbWUsIHRpdGxlLCBtZXRhLCBkZXNjcmlwdGlvbiwgYWN0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtZGF0ZS1iYWRnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2Vzc2lvbi5kYXRlRGF5IHx8IHNlc3Npb24uZGF0ZU1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtZGF0ZS1kYXlcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5kYXRlRGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtZGF0ZS1tb250aFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmRhdGVNb250aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzZXNzaW9uLmRhdGVEYXkgJiYgIXNlc3Npb24uZGF0ZU1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZC1kYXRlLW5hXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3sgZ2V0VHJhbnNsYXRpb24oJ04vQScpIHx8ICdOL0EnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLXJvb20tdGltZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtcm9vbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZXNzaW9uLnJvb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2Vzc2lvbi5yb29tIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtdGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZXNzaW9uLnRpbWVSYW5nZVdpdGhUeiB8fCBzZXNzaW9uLnRpbWVSYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzZXNzaW9uLnRpbWVSYW5nZVdpdGhUeiB8fCBzZXNzaW9uLnRpbWVSYW5nZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtdGl0bGVcIj57eyBzZXNzaW9uLnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihzZXNzaW9uLm9yZ2FuaXplciAmJiBzZXNzaW9uLm9yZ2FuaXplci5sZW5ndGgpIHx8IChzZXNzaW9uLm1lZXRpbmdUeXBlICYmIHNlc3Npb24ubWVldGluZ1R5cGUubGVuZ3RoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1tZXRhLXJvd1wiICpuZ0lmPVwic2Vzc2lvbi5vcmdhbml6ZXIgJiYgc2Vzc2lvbi5vcmdhbml6ZXIubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLW1ldGEtbGFiZWxcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRUcmFuc2xhdGlvbihcIk9yZ2FuaXplclwiKSB8fCBcIk9yZ2FuaXplclwiKSArIFwiOlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tY2FyZC1tZXRhLXZhbHVlXCI+e3sgc2Vzc2lvbi5vcmdhbml6ZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1tZXRhLXJvd1wiICpuZ0lmPVwic2Vzc2lvbi50aW1lWm9uZURpc3BsYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS1sYWJlbFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oXCJUaW1lIHpvbmVcIikgfHwgXCJUaW1lIHpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS12YWx1ZVwiPnt7IHNlc3Npb24udGltZVpvbmVEaXNwbGF5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1tZXRhLXJvd1wiICpuZ0lmPVwic2Vzc2lvbi5tZWV0aW5nVHlwZSAmJiBzZXNzaW9uLm1lZXRpbmdUeXBlLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tY2FyZC1tZXRhLWxhYmVsXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uVHlwZUxhYmVsKCkgKyBcIjpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS12YWx1ZVwiPnt7IHNlc3Npb24ubWVldGluZ1R5cGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZC1kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlc3Npb24uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlc3Npb24uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZC1zdGF0dXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlc3Npb24uc3RhdHVzVGV4dCAmJiBzZXNzaW9uLnN0YXR1c1RleHQubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXNzaW9uUm9sZUJ1dHRvbnMoc2Vzc2lvbikubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tY2FyZC1zdGF0dXMtYnVsbGV0XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc2Vzc2lvbi5zdGF0dXNUZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tY2FyZC13aGVuLWRpc2FibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXNzaW9uPy5zZXNzaW9uUm9sZXM/Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb24pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzZXNzaW9uLnNlc3Npb24/LmlzRXhwaXJlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGlvbihcIllvdSBjYW4gam9pbi93YXRjaCBhdCB0aGUgc3RhcnRpbmcgdGltZVwiKSB8fCBcIllvdSBjYW4gam9pbi93YXRjaCBhdCB0aGUgc3RhcnRpbmcgdGltZVwiIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtYWN0aW9ucy1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRTZXNzaW9uUm9sZUJ1dHRvbnMoc2Vzc2lvbikubGVuZ3RoID4gMCB8fCBoYXNTZXNzaW9uQ2FyZFNwZWFrZXJzKHNlc3Npb24pKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BlYWtlcnMtVUljYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlc3Npb24/LnNwZWFrZXJzTGlzdCB8fCBzZXNzaW9uPy5zZXNzaW9uPy5zcGVha2Vyc0xpc3QgfHwgW10pLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBfc3BlYWtlckNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3Agb2YgKHNlc3Npb24/LnNwZWFrZXJzTGlzdCB8fCBzZXNzaW9uPy5zZXNzaW9uPy5zcGVha2Vyc0xpc3QgfHwgW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaSA8IDNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGVha2VyXCIgKm5nSWY9XCJnZXRTcGVha2VyUGhvdG9Vcmwoc3ApOyBlbHNlIHNwZWFrZXJJbml0aWFsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRTcGVha2VyUGhvdG9Vcmwoc3ApIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJnZXRTcGVha2VyRGlzcGxheU5hbWUoc3ApIHx8ICdTcGVha2VyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3BlYWtlckluaXRpYWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BlYWtlciBpbml0aWFsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFNwZWFrZXJJbml0aWFscyhzcCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwZWFrZXIgaW5pdGlhbHNcIiAqbmdJZj1cIl9zcGVha2VyQ291bnQgPiAzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgK3t7IF9zcGVha2VyQ291bnQgLSAzIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcm9sZSBvZiBnZXRTZXNzaW9uUm9sZUJ1dHRvbnMoc2Vzc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIHNlc3Npb24tY2FyZC1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZXNzaW9uLWNhcmQtYnRuLXByaW1hcnldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLmFjdGlvbiA9PT0gJ2pvaW4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2Vzc2lvbi1jYXJkLWJ0bi1zZWNvbmRhcnldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLmFjdGlvbiA9PT0gJ3dhdGNoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlc3Npb24tY2FyZC1idG4tZGlzYWJsZWRdPVwiaXNVbkV2ZW50ICYmICFjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc1VuRXZlbnQgJiYgIWNhblBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZXNzaW9uQ2FyZEFjdGlvbihzZXNzaW9uLCByb2xlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb2xlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LnNlc3Npb25DYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIFNFU1NJT05fQ0FSRFNfSU5JVElBTCA+XG4gICAgICAgICAgICAgICAgICAgICAgICA0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWV4cGFuZGVkU2Vzc2lvbkNhcmRJZHNbY2hhdD8uX2lkXVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY2FyZHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZFNlc3Npb25DYXJkcyhjaGF0KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFNob3dcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc2Vzc2lvbkNhcmRzPy5sZW5ndGggfHwgMCkgLSBTRVNTSU9OX0NBUkRTX0lOSVRJQUxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgbW9yZVxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5zZXNzaW9uQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTRVNTSU9OX0NBUkRTX0lOSVRJQUwgPT09XG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbihcInNlc3Npb25cIikgfHwgXCJzZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VHJhbnNsYXRpb24oXCJzZXNzaW9uc1wiKSB8fCBcInNlc3Npb25zXCJcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBBdHRlbmRlZSBjYXJkcyAoZnJvbSBnZXRfZXZlbnRfYXR0ZW5kZWVzIHRvb2wsIHNhbWUgYXMgUmVhY3QgTmF0aXZlKSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmRzLXNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ2F0dGVuZGVlX2NhcmRzJyAmJlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py5hdHRlbmRlZUNhcmRzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLW1lc3NhZ2UtYnViYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBiZ0J1YmJsZUFpIHx8ICcjZmZmJyB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlNlYXJjaFRpdGxlIGFpIGNhcmQtbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtY2FyZHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRlbmRlZSBvZiBnZXRWaXNpYmxlQXR0ZW5kZWVDYXJkcyhjaGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hdHRlbmRlZS1jYXJkLWhhcy12aWRlb109XCIhIWdldEF0dGVuZGVlVmlkZW9VcmwoYXR0ZW5kZWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZ2V0QXR0ZW5kZWVWaWRlb1VybChhdHRlbmRlZSkgJiYgYXR0ZW5kZWUucGhvdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd1cmwoJyArIGF0dGVuZGVlLnBob3RvICsgJyknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRBdHRlbmRlZVZpZGVvVXJsKGF0dGVuZGVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYXR0ZW5kZWVWaWRlb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC12aWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucG9zdGVyXT1cImdldEF0dGVuZGVlVmlkZW9Qb3N0ZXIoYXR0ZW5kZWUpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdXRlZF09XCJpc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0LCBhdHRlbmRlZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlzaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZD1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheSk9XCJvbkF0dGVuZGVlVmlkZW9QbGF5U3RhdGUoY2hhdCwgYXR0ZW5kZWUsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF1c2UpPVwib25BdHRlbmRlZVZpZGVvUGxheVN0YXRlKGNoYXQsIGF0dGVuZGVlLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmRlZCk9XCJvbkF0dGVuZGVlVmlkZW9QbGF5U3RhdGUoY2hhdCwgYXR0ZW5kZWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUF0dGVuZGVlVmlkZW9QbGF5KGNoYXQsIGF0dGVuZGVlLCBhdHRlbmRlZVZpZGVvLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnNyY109XCJnZXRBdHRlbmRlZVZpZGVvVXJsKGF0dGVuZGVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC92aWRlbz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLW11dGUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXR0ZW5kZWVWaWRlb011dGUoY2hhdCwgYXR0ZW5kZWUsIGF0dGVuZGVlVmlkZW8sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvTXV0ZWQoY2hhdCwgYXR0ZW5kZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdVbm11dGUnKSB8fCAnVW5tdXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ011dGUnKSB8fCAnTXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvTXV0ZWQoY2hhdCwgYXR0ZW5kZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdVbm11dGUnKSB8fCAnVW5tdXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ011dGUnKSB8fCAnTXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIGF0dGVuZGVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJ2b2x1bWVfb2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwidm9sdW1lX3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLXBsYXktYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXR0ZW5kZWVWaWRlb1BsYXkoY2hhdCwgYXR0ZW5kZWUsIGF0dGVuZGVlVmlkZW8sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvUGxheWluZyhjaGF0LCBhdHRlbmRlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZ2V0VHJhbnNsYXRpb24oJ1BhdXNlJykgfHwgJ1BhdXNlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ1BsYXknKSB8fCAnUGxheScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvUGxheWluZyhjaGF0LCBhdHRlbmRlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZ2V0VHJhbnNsYXRpb24oJ1BhdXNlJykgfHwgJ1BhdXNlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ1BsYXknKSB8fCAnUGxheScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb1BsYXlpbmcoY2hhdCwgYXR0ZW5kZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcInBhdXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmQtaW5pdGlhbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFnZXRBdHRlbmRlZVZpZGVvVXJsKGF0dGVuZGVlKSAmJiAhYXR0ZW5kZWUucGhvdG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRBdHRlbmRlZUluaXRpYWxzKGF0dGVuZGVlLm5hbWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1vdmVybGF5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtbmFtZVwiPnt7IGF0dGVuZGVlLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhdHRlbmRlZS5jb21wYW55XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGF0dGVuZGVlLmNvbXBhbnkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWRlc2NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hdHRlbmRlZS1kZXNjLWNvbGxhcHNlZF09XCIhaXNBdHRlbmRlZURlc2NyaXB0aW9uRXhwYW5kZWQoY2hhdCwgYXR0ZW5kZWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtZGVzYy1leHBhbmRlZF09XCJpc0F0dGVuZGVlRGVzY3JpcHRpb25FeHBhbmRlZChjaGF0LCBhdHRlbmRlZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihhdHRlbmRlZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihhdHRlbmRlZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVuZGVlLmlkICE9PSB1c2VySWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0aW9uc0VuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQZW5kaW5nU2VudFJlcXVlc3QoYXR0ZW5kZWUuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGF0dGVuZGVlLWNhcmQtYnRuIGF0dGVuZGVlLWNhcmQtYnRuLXJlcXVlc3Qtc2VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdSZXF1ZXN0IFNlbnQnKSB8fCAnUmVxdWVzdCBTZW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKFwiUmVxdWVzdCBTZW50XCIpIHx8IFwiUmVxdWVzdCBTZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVuZGVlLmlkICE9PSB1c2VySWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0aW9uc0VuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuRm9sbG93VXNlcihhdHRlbmRlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYXR0ZW5kZWUtY2FyZC1idG4gYXR0ZW5kZWUtY2FyZC1idG4tY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdDb25uZWN0JykgfHwgJ0Nvbm5lY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZS5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IGF0dGVuZGVlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGlvbihcIkNvbm5lY3RcIikgfHwgXCJDb25uZWN0XCIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVuZGVlLmlkICE9PSB1c2VySWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0aW9uc0VuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVW5mb2xsb3dVc2VyKGF0dGVuZGVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi1kaXNjb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oJ0Rpc2Nvbm5lY3QnKSB8fCAnRGlzY29ubmVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVuZGVlLmlkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0V2l0aFVzZXIuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogYXR0ZW5kZWUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oXCJEaXNjb25uZWN0XCIpIHx8IFwiRGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGF0dGVuZGVlLWNhcmQtYnRuIGF0dGVuZGVlLWNhcmQtYnRuLXZpZXctcHJvZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWF0dGVuZGVlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYXR0ZW5kZWUuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGdldFRyYW5zbGF0aW9uKCdQcm9maWxlIG5vdCBhdmFpbGFibGUnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb2ZpbGUgbm90IGF2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChnZXRUcmFuc2xhdGlvbignVmlldyBQcm9maWxlJykgfHwgJ1ZpZXcgUHJvZmlsZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZS5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RXaXRoVXNlci5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogYXR0ZW5kZWUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3UHJvZmlsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFRyYW5zbGF0aW9uKFwiVmlldyBQcm9maWxlXCIpIHx8IFwiVmlldyBQcm9maWxlXCIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uYXR0ZW5kZWVDYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIEFUVEVOREVFX0NBUkRTX0lOSVRJQUwgPlxuICAgICAgICAgICAgICAgICAgICAgICAgNCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFleHBhbmRlZEF0dGVuZGVlQ2FyZElkc1tjaGF0Py5faWRdXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jYXJkcy1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kQXR0ZW5kZWVDYXJkcyhjaGF0KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFNob3dcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uYXR0ZW5kZWVDYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIEFUVEVOREVFX0NBUkRTX0lOSVRJQUxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgbW9yZVxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5hdHRlbmRlZUNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgQVRURU5ERUVfQ0FSRFNfSU5JVElBTCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldFRyYW5zbGF0aW9uKFwiYXR0ZW5kZWVcIikgfHwgXCJhdHRlbmRlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdldFRyYW5zbGF0aW9uKFwiYXR0ZW5kZWVzXCIpIHx8IFwiYXR0ZW5kZWVzXCJcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBTcGVha2VyIGNhcmRzIChmcm9tIGdldF9ldmVudF9zcGVha2VycyB0b29sLCBzYW1lIGxheW91dC9iZWhhdmlvciBhcyBhdHRlbmRlZSBjYXJkcykgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcGVha2VyLWNhcmRzLXNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ3NwZWFrZXJfY2FyZHMnICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnNwZWFrZXJDYXJkcz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8ubWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogYmdCdWJibGVBaSB8fCAnI2ZmZicgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJTZWFyY2hUaXRsZSBhaSBjYXJkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLWNhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BlYWtlciBvZiBnZXRWaXNpYmxlU3BlYWtlckNhcmRzKGNoYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmF0dGVuZGVlLWNhcmQtaGFzLXZpZGVvXT1cIiEhZ2V0QXR0ZW5kZWVWaWRlb1VybChzcGVha2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWdldEF0dGVuZGVlVmlkZW9Vcmwoc3BlYWtlcikgJiYgc3BlYWtlci5waG90b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3VybCgnICsgc3BlYWtlci5waG90byArICcpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0QXR0ZW5kZWVWaWRlb1VybChzcGVha2VyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc3BlYWtlclZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLXZpZGVvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5wb3N0ZXJdPVwiZ2V0QXR0ZW5kZWVWaWRlb1Bvc3RlcihzcGVha2VyKSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXV0ZWRdPVwiaXNBdHRlbmRlZVZpZGVvTXV0ZWQoY2hhdCwgc3BlYWtlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlzaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZD1cIm1ldGFkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxheSk9XCJvbkF0dGVuZGVlVmlkZW9QbGF5U3RhdGUoY2hhdCwgc3BlYWtlciwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXVzZSk9XCJvbkF0dGVuZGVlVmlkZW9QbGF5U3RhdGUoY2hhdCwgc3BlYWtlciwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5kZWQpPVwib25BdHRlbmRlZVZpZGVvUGxheVN0YXRlKGNoYXQsIHNwZWFrZXIsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUF0dGVuZGVlVmlkZW9QbGF5KGNoYXQsIHNwZWFrZXIsIHNwZWFrZXJWaWRlbywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zcmNdPVwiZ2V0QXR0ZW5kZWVWaWRlb1VybChzcGVha2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidmlkZW8vd2VibVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC92aWRlbz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLW11dGUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQXR0ZW5kZWVWaWRlb011dGUoY2hhdCwgc3BlYWtlciwgc3BlYWtlclZpZGVvLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIHNwZWFrZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdVbm11dGUnKSB8fCAnVW5tdXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ011dGUnKSB8fCAnTXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvTXV0ZWQoY2hhdCwgc3BlYWtlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZ2V0VHJhbnNsYXRpb24oJ1VubXV0ZScpIHx8ICdVbm11dGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChnZXRUcmFuc2xhdGlvbignTXV0ZScpIHx8ICdNdXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvTXV0ZWQoY2hhdCwgc3BlYWtlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwidm9sdW1lX29mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInZvbHVtZV91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1wbGF5LWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUF0dGVuZGVlVmlkZW9QbGF5KGNoYXQsIHNwZWFrZXIsIHNwZWFrZXJWaWRlbywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dGVuZGVlVmlkZW9QbGF5aW5nKGNoYXQsIHNwZWFrZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdQYXVzZScpIHx8ICdQYXVzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdQbGF5JykgfHwgJ1BsYXknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb1BsYXlpbmcoY2hhdCwgc3BlYWtlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZ2V0VHJhbnNsYXRpb24oJ1BhdXNlJykgfHwgJ1BhdXNlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ1BsYXknKSB8fCAnUGxheScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb1BsYXlpbmcoY2hhdCwgc3BlYWtlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwicGF1c2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJwbGF5X2Fycm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1pbml0aWFsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWdldEF0dGVuZGVlVmlkZW9Vcmwoc3BlYWtlcikgJiYgIXNwZWFrZXIucGhvdG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRBdHRlbmRlZUluaXRpYWxzKHNwZWFrZXIubmFtZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLW92ZXJsYXlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1uYW1lXCI+e3sgc3BlYWtlci5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3BlYWtlci5qb2JUaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGVha2VyLmpvYlRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jb21wYW55XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwZWFrZXIuY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGVha2VyLmNvbXBhbnkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWRlc2NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hdHRlbmRlZS1kZXNjLWNvbGxhcHNlZF09XCIhaXNBdHRlbmRlZURlc2NyaXB0aW9uRXhwYW5kZWQoY2hhdCwgc3BlYWtlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hdHRlbmRlZS1kZXNjLWV4cGFuZGVkXT1cImlzQXR0ZW5kZWVEZXNjcmlwdGlvbkV4cGFuZGVkKGNoYXQsIHNwZWFrZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEF0dGVuZGVlRGVzY3JpcHRpb24oc3BlYWtlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihzcGVha2VyKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi12aWV3LXByb2ZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzcGVha2VyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3BlYWtlci5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0VHJhbnNsYXRpb24oJ1Byb2ZpbGUgbm90IGF2YWlsYWJsZScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJvZmlsZSBub3QgYXZhaWxhYmxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdWaWV3IFByb2ZpbGUnKSB8fCAnVmlldyBQcm9maWxlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdzcGVha2VyX2NhcmRzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdmlld1NwZWFrZXJQcm9maWxlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVha2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVha2VyczogY2hhdC5zcGVha2VyQ2FyZHMgfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcGVha2VyLmlkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0V2l0aFVzZXIuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogc3BlYWtlci5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1Byb2ZpbGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdWaWV3IFByb2ZpbGUnKSB8fCAnVmlldyBQcm9maWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc3BlYWtlckNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU1BFQUtFUl9DQVJEU19JTklUSUFMID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZXhwYW5kZWRTcGVha2VyQ2FyZElkc1tjaGF0Py5faWRdXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jYXJkcy1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kU3BlYWtlckNhcmRzKGNoYXQpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgU2hvd1xuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5zcGVha2VyQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTUEVBS0VSX0NBUkRTX0lOSVRJQUxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgbW9yZVxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5zcGVha2VyQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTUEVBS0VSX0NBUkRTX0lOSVRJQUwgPT09XG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbignc3BlYWtlcicpIHx8ICdzcGVha2VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRUcmFuc2xhdGlvbignc3BlYWtlcnMnKSB8fCAnc3BlYWtlcnMnXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gU3BvbnNvciBjYXJkcyAoZnJvbSBnZXRfZXZlbnRfc3BvbnNvcnMgdG9vbCwgYm9vdGgtcmVwIHN0eWxlKSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNwb25zb3ItY2FyZHMtc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnc3BvbnNvcl9jYXJkcycgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8uc3BvbnNvckNhcmRzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLW1lc3NhZ2UtYnViYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBiZ0J1YmJsZUFpIHx8ICcjZmZmJyB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlNlYXJjaFRpdGxlIGFpIGNhcmQtbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9vdGgtcmVwLWNhcmQtZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BvbnNvciBvZiBnZXRWaXNpYmxlU3BvbnNvckNhcmRzKGNoYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvb3RoLXJlcC1jYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib290aC1yZXAtY2FyZC1sb2dvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvb3RoLXJlcC1jYXJkLWxvZ28tcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzcG9uc29yLmxvZ29VcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcG9uc29yLmJvb3RoVGl0bGUgPyBzcG9uc29yLmJvb3RoVGl0bGUuY2hhckF0KDApIDogKHNwb25zb3IubmFtZSA/IHNwb25zb3IubmFtZS5jaGFyQXQoMCkgOiAnJykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzcG9uc29yLmxvZ29VcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cInNwb25zb3IubG9nb1VybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwic3BvbnNvci5ib290aFRpdGxlIHx8IHNwb25zb3IubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImJvb3RoLXJlcC1jYXJkLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzcG9uc29yLmJvb3RoVGl0bGUgfHwgc3BvbnNvci5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib290aC1yZXAtY2FyZC1kZXNjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3BvbnNvci5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BvbnNvci5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9vdGgtcmVwLWNhcmQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3Qm9vdGguZW1pdCh7IGJvb3RoSWQ6IHNwb25zb3IuYm9vdGhJRCwgYm9vdGhVcmw6IHNwb25zb3IudXJsLCBzcG9uc29yIH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGlvbignVmlldyBTcG9uc29yJykgfHwgJ1ZpZXcgU3BvbnNvcicgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc3BvbnNvckNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU1BPTlNPUl9DQVJEU19JTklUSUFMID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZXhwYW5kZWRTcG9uc29yQ2FyZElkc1tjaGF0Py5faWRdXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNob3ctbW9yZS1jYXJkcy1idG5cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhwYW5kU3BvbnNvckNhcmRzKGNoYXQpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgU2hvd1xuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5zcG9uc29yQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTUE9OU09SX0NBUkRTX0lOSVRJQUxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgbW9yZVxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5zcG9uc29yQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTUE9OU09SX0NBUkRTX0lOSVRJQUwgPT09XG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbignc3BvbnNvcicpIHx8ICdzcG9uc29yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRUcmFuc2xhdGlvbignc3BvbnNvcnMnKSB8fCAnc3BvbnNvcnMnXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQm9vdGggcmVwcmVzZW50YXRpdmUgY2FyZHMgKGZyb20gZ2V0X2Jvb3RoX3JlcHJlc2VudGF0aXZlcyB0b29sLCBzYW1lIGRlc2lnbiBhcyBhdHRlbmRlZSBjYXJkcykgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkcy1zZWN0aW9uIGJvb3RoLXJlcC1jYXJkcy1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdib290aF9yZXBfY2FyZHMnICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LmJvb3RoUmVwQ2FyZHM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGJnQnViYmxlQWkgfHwgJyNmZmYnIH1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiU2VhcmNoVGl0bGUgYWkgY2FyZC1tZXNzYWdlLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiY2hhdD8ubWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1jYXJkcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcCBvZiBnZXRWaXNpYmxlQm9vdGhSZXBDYXJkcyhjaGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cInJlcC5waG90byA/ICd1cmwoJyArIHJlcC5waG90byArICcpJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLWluaXRpYWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVwLnBob3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0QXR0ZW5kZWVJbml0aWFscyhyZXAubmFtZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLW92ZXJsYXlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1uYW1lXCI+e3sgcmVwLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXAuY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByZXAuY29tcGFueSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZXAuam9iVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmVwLmpvYlRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1kZXNjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtZGVzYy1jb2xsYXBzZWRdPVwiIWlzQXR0ZW5kZWVEZXNjcmlwdGlvbkV4cGFuZGVkKGNoYXQsIHJlcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hdHRlbmRlZS1kZXNjLWV4cGFuZGVkXT1cImlzQXR0ZW5kZWVEZXNjcmlwdGlvbkV4cGFuZGVkKGNoYXQsIHJlcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihyZXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEF0dGVuZGVlRGVzY3JpcHRpb24ocmVwKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAuaWQgIT09IHVzZXJJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Nvbm5lY3Rpb25zRW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1BlbmRpbmdTZW50UmVxdWVzdChyZXAuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGF0dGVuZGVlLWNhcmQtYnRuIGF0dGVuZGVlLWNhcmQtYnRuLXJlcXVlc3Qtc2VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdSZXF1ZXN0IFNlbnQnKSB8fCAnUmVxdWVzdCBTZW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKFwiUmVxdWVzdCBTZW50XCIpIHx8IFwiUmVxdWVzdCBTZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcC5pZCAhPT0gdXNlcklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29ubmVjdGlvbnNFbmFibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkZvbGxvd1VzZXIocmVwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi1jb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oJ0Nvbm5lY3QnKSB8fCAnQ29ubmVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcC5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHJlcC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oXCJDb25uZWN0XCIpIHx8IFwiQ29ubmVjdFwiIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAuaWQgIT09IHVzZXJJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Nvbm5lY3Rpb25zRW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5VbmZvbGxvd1VzZXIocmVwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi1kaXNjb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oJ0Rpc2Nvbm5lY3QnKSB8fCAnRGlzY29ubmVjdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcC5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHJlcC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbihcIkRpc2Nvbm5lY3RcIikgfHwgXCJEaXNjb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYXR0ZW5kZWUtY2FyZC1idG4gYXR0ZW5kZWUtY2FyZC1idG4tdmlldy1wcm9maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImdldFRyYW5zbGF0aW9uKCdWaWV3IFByb2ZpbGUnKSB8fCAnVmlldyBQcm9maWxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RXaXRoVXNlci5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHJlcC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3UHJvZmlsZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGlvbignVmlldyBQcm9maWxlJykgfHwgJ1ZpZXcgUHJvZmlsZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uYm9vdGhSZXBDYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIEJPT1RIX1JFUF9DQVJEU19JTklUSUFMID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZXhwYW5kZWRCb290aFJlcENhcmRJZHNbY2hhdD8uX2lkXVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY2FyZHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZEJvb3RoUmVwQ2FyZHMoY2hhdClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBTaG93XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LmJvb3RoUmVwQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBCT09USF9SRVBfQ0FSRFNfSU5JVElBTFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBtb3JlXG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LmJvb3RoUmVwQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBCT09USF9SRVBfQ0FSRFNfSU5JVElBTCA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldFRyYW5zbGF0aW9uKCdyZXByZXNlbnRhdGl2ZScpIHx8ICdyZXByZXNlbnRhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VHJhbnNsYXRpb24oJ3JlcHJlc2VudGF0aXZlcycpIHx8ICdyZXByZXNlbnRhdGl2ZXMnXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1idWJibGUtd3JhcFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAoY2hhdD8udHlwZSA9PT0gJ2FpJyB8fCBjaGF0Py50eXBlID09PSAndXNlcicpICYmXG4gICAgICAgICAgICAgICAgICAgICEoaSA9PT0gMCAmJiBib3RTa2lsbHMpXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhaSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYmdCdWJibGVBaSB8fCAnI2ZmZidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogY2hhdD8udHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYmdCdWJibGVVc2VyIHx8ICcjMTgzOTg4J1xuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhaSdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJyMwMDAgIWltcG9ydGFudCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyNmZmYgIWltcG9ydGFudCdcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJtZXNzYWdlVGV4dF97eyBpIH19XCIgY2xhc3M9XCJjaGF0LWJ1YmJsZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICdhaScgfHwgY2hhdD8udHlwZSA9PT0gJ3VzZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAnU2VhcmNoVGl0bGUgYWknOiBjaGF0Py50eXBlID09PSAnYWknLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlYXJjaFRpdGxlIHVzZXInOiBjaGF0Py50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhaScgJiYgbWVzc2FnZVRleHRDb2xvckFpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlVGV4dENvbG9yQWlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNoYXQ/LnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtZXNzYWdlVGV4dENvbG9yVXNlciB8fCAnI2ZmZidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2RlZmF1bHRDb2xvcidcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZ3Jlc3MtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8uc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2lyY3VsYXItbG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci1zcGlubmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzIDwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoJyArIHBlcmNlbnRhZ2UgKiAzLjYgKyAnZGVnKSdcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja21hcmtcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFdvcmtmbG93QWN0aW9uUHJvZ3Jlc3MgPT0gMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCA1MiA1MlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjI2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3k9XCIyNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHI9XCIyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrbWFyay1jaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNCAyN2w3IDcgMTYtMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9hZGVyLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFdvcmtmbG93QWN0aW9uUHJvZ3Jlc3MgPCAxMDBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudFdvcmtmbG93QWN0aW9uUHJvZ3Jlc3MgfX0lXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGVyLWxhYmVsXCI+e3sgY3VycmVudFdvcmtmbG93QWN0aW9uIH19Li4uPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImV4aWN1dGlvbiBtdC0yXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhaScgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8uZ3JhcGhzICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LmdyYXBocy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICdhaSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJieCBieC1uZXR3b3JrLWNoYXJ0XCI+PC9pPiBHcmFwaHNcbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29sbGFwc2VGR3JhcGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtaWNvbiBtbC0yIGZhXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAnZmFzIGZhLWNoZXZyb24tZG93bic6IGlzQ29sbGFwc2VkRm9yRkdyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhcyBmYS1jaGV2cm9uLXVwJzogIWlzQ29sbGFwc2VkRm9yRkdyYXBoXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgY2hhdD8uZ3JhcGhzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmFwaC1pbWdcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGNvbGxhcHNlOiBpc0NvbGxhcHNlZEZvckZHcmFwaCB9XCJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY2hlY2tGb3JDb3AyOUJvdElkKClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJleGljdXRpb24gbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ2FpJyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LmV4ZWN1dGlvbkdyYXBocyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LmV4ZWN1dGlvbkdyYXBocz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjaGF0Py50eXBlID09PSAnYWknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJieCBieC1uZXR3b3JrLWNoYXJ0XCI+PC9pPiBFeGVjdXRpb24gUGF0aCBEaWFncmFtXG4gICAgICAgICAgICAgICAgICAgICAgRm9yIERhdGEgVmlzdWFsaXphdGlvbiBXb3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ29sbGFwc2VHcmFwaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWljb24gbWwtMiBmYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdmYXMgZmEtY2hldnJvbi1kb3duJzogaXNDb2xsYXBzZWRGb3JHcmFwaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhcyBmYS1jaGV2cm9uLXVwJzogIWlzQ29sbGFwc2VkRm9yR3JhcGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW1hZ2Ugb2YgY2hhdD8uZXhlY3V0aW9uR3JhcGhzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyYXBoLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBjb2xsYXBzZTogaXNDb2xsYXBzZWRGb3JHcmFwaCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN0YVwiICpuZ0lmPVwiY2hhdD8udHlwZSA9PT0gJ2FpJyAmJiBpID4gMCAmJiBpID09PSBsYXN0QWlNZXNzYWdlSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb3B5Qm94XCJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDb3B5XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9PSBpID8gJ3Nob3ctYWx3YXlzJyA6ICdzaG93LWhvdmVyJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBjaGF0Py5jb3BpZWQgPyAnQ29waWVkIScgOiAnQ29weScgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29weVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjaGF0Py5jb3BpZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDb3B5Q2xpY2soaSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjaGF0Py5jb3BpZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDE2LjE3TDQuODMgMTJMMy40MSAxMy40MUw5IDE5TDIxIDdMMTkuNTkgNS41OUw5IDE2LjE3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9pPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCIhY2hhdD8uY29waWVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTkuMjQgMkg4Ljg0QzguMTQgMiA3LjU4IDIuNTYgNy41OCAzLjI2VjE2Ljg0QzcuNTggMTcuNTQgOC4xNCAxOC4xIDguODQgMTguMUgxOS4yNEMxOS45NCAxOC4xIDIwLjUgMTcuNTQgMjAuNSAxNi44NFYzLjI2QzIwLjUgMi41NiAxOS45NCAyIDE5LjI0IDJaTTE5LjI0IDE2Ljg0SDguODRWMy4yNkgxOS4yNFYxNi44NFpNNC43NCA2LjUyQzQuMDQgNi41MiAzLjQ4IDcuMDggMy40OCA3Ljc4VjIwLjM2QzMuNDggMjEuMDYgNC4wNCAyMS42MiA0Ljc0IDIxLjYySDE1LjE0QzE1Ljg0IDIxLjYyIDE2LjQgMjEuMDYgMTYuNCAyMC4zNlYxOC44OEgxNC45NlYyMC4zNkg0Ljc0VjcuNzhINi4xOFY2LjUySDQuNzRaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzU2NjU2M1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuPCEtLSBcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNoZWNrRm9yQ29wMjlCb3RJZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVwIGNvcHlcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgY2hhdD8uaXNFZGl0b3IgPyAnQWRkZWQhJyA6ICdBZGQgdG8gZWRpdG9yJyB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUVkaXRvckNsaWNrKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNoYXQ/LmlzRWRpdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyMC4xNTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjAuMTUyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAuMTUyIDIwLjE1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJJY29uX2ZlYXRoZXItZWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmFtZT1cIkljb24gZmVhdGhlci1lZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjUgLTIuMTY2KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJQYXRoXzE2NlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uYW1lPVwiUGF0aCAxNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuNSw2SDQuODg5QTEuODg5LDEuODg5LDAsMCwwLDMsNy44ODl2MTMuMjJBMS44ODksMS44ODksMCwwLDAsNC44ODksMjNoMTMuMjJBMS44ODksMS44ODksMCwwLDAsMjAsMjEuMTA4VjE0LjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwIC0xLjE3OSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzkzOTM5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJQYXRoXzE2N1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1uYW1lPVwiUGF0aCAxNjdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjEuOTE1LDMuNGEyLDIsMCwwLDEsMi44MzMsMi44MzNsLTguOTcxLDguOTcxTDEyLDE2LjE1MmwuOTQ0LTMuNzc3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0zLjMzNCAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzOTM5MzlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2hhdD8uaXNFZGl0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk05IDE2LjE3TDQuODMgMTJMMy40MSAxMy40MUw5IDE5TDIxIDdMMTkuNTkgNS41OUw5IDE2LjE3WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidXAgY29weVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJMaWtlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImNoYXQ/Lmxpa2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVXBDbGljayhpKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImNoYXQ/Lmxpa2VkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOC4zODk4OSAxOC40OTAyVjguMzMwMjJDOC4zODk4OSA3LjkzMDIyIDguNTA5ODkgNy41NDAyMiA4LjcyOTg5IDcuMjEwMjJMMTEuNDU5OSAzLjE1MDIyQzExLjg4OTkgMi41MDAyMiAxMi45NTk5IDIuMDQwMjIgMTMuODY5OSAyLjM4MDIyQzE0Ljg0OTkgMi43MTAyMiAxNS40OTk5IDMuODEwMjIgMTUuMjg5OSA0Ljc5MDIyTDE0Ljc2OTkgOC4wNjAyMkMxNC43Mjk5IDguMzYwMjIgMTQuODA5OSA4LjYzMDIyIDE0Ljk3OTkgOC44NDAyMkMxNS4xNDk5IDkuMDMwMjIgMTUuMzk5OSA5LjE1MDIyIDE1LjY2OTkgOS4xNTAyMkgxOS43Nzk5QzIwLjU2OTkgOS4xNTAyMiAyMS4yNDk5IDkuNDcwMjIgMjEuNjQ5OSAxMC4wMzAyQzIyLjAyOTkgMTAuNTcwMiAyMi4wOTk5IDExLjI3MDIgMjEuODQ5OSAxMS45ODAyTDE5LjM4OTkgMTkuNDcwMkMxOS4wNzk5IDIwLjcxMDIgMTcuNzI5OSAyMS43MjAyIDE2LjM4OTkgMjEuNzIwMkgxMi40ODk5QzExLjgxOTkgMjEuNzIwMiAxMC44Nzk5IDIxLjQ5MDIgMTAuNDQ5OSAyMS4wNjAyTDkuMTY5ODkgMjAuMDcwMkM4LjY3OTg5IDE5LjcwMDIgOC4zODk4OSAxOS4xMTAyIDguMzg5ODkgMTguNDkwMlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTcyMzVCXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTUuMjEgNi4zNzk4OEg0LjE4QzIuNjMgNi4zNzk4OCAyIDYuOTc5ODggMiA4LjQ1OTg4VjE4LjUxOTlDMiAxOS45OTk5IDIuNjMgMjAuNTk5OSA0LjE4IDIwLjU5OTlINS4yMUM2Ljc2IDIwLjU5OTkgNy4zOSAxOS45OTk5IDcuMzkgMTguNTE5OVY4LjQ1OTg4QzcuMzkgNi45Nzk4OCA2Ljc2IDYuMzc5ODggNS4yMSA2LjM3OTg4WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxNzIzNUJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiIWNoYXQ/Lmxpa2VkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuNDAzNyAyMC45MjY0TDEwLjM4MSAyMC45MDM4TDEwLjM1NTcgMjAuODg0M0w3LjcyMTY1IDE4Ljg1TDguMDI5NjUgMTguNDUxNkwxMC43MTYxIDIwLjUzMTVDMTAuOTIyOCAyMC43MTk1IDExLjIxODEgMjAuODUxNyAxMS40OTYyIDIwLjkzNzdDMTEuNzk3OCAyMS4wMzA5IDEyLjE0NTEgMjEuMDkgMTIuNDgwMSAyMS4wOUgxNi4yODAxQzE2Ljg1NzIgMjEuMDkgMTcuNDI2NiAyMC44NjI1IDE3Ljg3NTEgMjAuNTMwNkMxOC4zMTU5IDIwLjIwNDQgMTguNjkxMiAxOS43Mzg1IDE4LjgzMDUgMTkuMTk5N0wyMS4yNDI4IDExLjg3MzJDMjEuNDM3OSAxMS4zMzA5IDIxLjQyODcgMTAuNzQ5IDIxLjA5NjUgMTAuMjg4N0MyMC43NTgzIDkuODEzNzcgMjAuMTg0NCA5LjU4OTk5IDE5LjU4MDEgOS41ODk5OUgxNS41ODAxQzE1LjIwMzEgOS41ODk5OSAxNC44NjE1IDkuNDMxNDMgMTQuNjI3NiA5LjE2MjE1TDE0LjYyNyA5LjE2MTQyQzE0LjM4NzMgOC44ODY0OSAxNC4yNzU2IDguNTE1NDkgMTQuMzM0NSA4LjExNTAxTDE0LjgzMjIgNC45MTk1QzE0Ljk5NzggNC4xMDUyIDE0LjQ2NjQgMy4yNDU5NiAxMy43MDUzIDIuOTg4MDRDMTMuMzI3NyAyLjg1MTY1IDEyLjkyOTcgMi44OTEyOSAxMi42MSAyLjk5ODM5QzEyLjI5NDkgMy4xMDM5NiAxMS45NzcyIDMuMzAxNzIgMTEuNzg4MSAzLjU3NjczTDExLjc4ODEgMy41NzY3MUwxMS43ODUxIDMuNTgxMDdMNy45NjM1MiA5LjI2Njg5TDcuNTU0NTQgOC45OTMxNEwxMS4zNzUxIDMuMzA4OTFMMTEuMzc1NSAzLjMwODM2QzExLjg3NjMgMi41NjEwMyAxMy4wMTA5IDIuMTkwMjggMTMuODcyNiAyLjUxNzQ0TDEzLjg4MzQgMi41MjE1MUwxMy44OTQzIDIuNTI1MDlDMTQuOTA0NCAyLjg1NjQgMTUuNTU2IDMuOTg3NjUgMTUuMzMxNyA1LjAxMzE0TDE1LjMyODQgNS4wMjgwNUwxNS4zMjYgNS4wNDMxNEwxNC44MzYgOC4xOTMxNEwxNC44MzYgOC4xOTMxM0wxNC44MzUxIDguMTk5MjhDMTQuODE4NCA4LjMxNjQyIDE0Ljc5ODEgOC42MDI2OCAxNS4wMTM4IDguODQ5MjRMMTUuMDI0OCA4Ljg2MTc3TDE1LjAzNjYgOC44NzM1NEMxNS4xODMzIDkuMDIwMjYgMTUuMzgxNyA5LjA5OTk5IDE1LjU5MDEgOS4wOTk5OUgxOS41OTAxQzIwLjQzMDggOS4wOTk5OSAyMS4xMTc2IDkuNDQ4ODYgMjEuNTExMyAxMC4wMDc5TDIxLjUxMjQgMTAuMDA5NUMyMS44OTY0IDEwLjU1MDIgMjEuOTkwOCAxMS4yODQ5IDIxLjcyMDIgMTIuMDI5MUwyMS43MTc1IDEyLjAzNjVMMjEuNzE1MSAxMi4wNDRMMTkuMzI1MSAxOS4zMjRMMTkuMzE5OCAxOS4zNEwxOS4zMTU2IDE5LjM1NjRDMTkuMDA1OCAyMC41NzA3IDE3LjY3NjYgMjEuNiAxNi4yODAxIDIxLjZIMTIuNDgwMUMxMi4yNDExIDIxLjYgMTEuODQwMyAyMS41NjI1IDExLjQyOTcgMjEuNDUxMkMxMS4wMTIzIDIxLjMzOCAxMC42NDA2IDIxLjE2MzMgMTAuNDAzNyAyMC45MjY0WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNS4zNzk4OCAyMC40OTk5SDQuMzc5ODhDMy41MjQ0MiAyMC40OTk5IDIuOTg1NTkgMjAuMjk4MiAyLjY1ODIyIDE5Ljk4MjVDMi4zMzQzNyAxOS42NzAyIDIuMTI5ODggMTkuMTYxNCAyLjEyOTg4IDE4LjM0OTlWOC41NDk5QzIuMTI5ODggNy43Mzg0MyAyLjMzNDM3IDcuMjI5NjIgMi42NTgyMiA2LjkxNzMxQzIuOTg1NTkgNi42MDE2IDMuNTI0NDIgNi4zOTk5IDQuMzc5ODggNi4zOTk5SDUuMzc5ODhDNi4yMzUzNCA2LjM5OTkgNi43NzQxOCA2LjYwMTYgNy4xMDE1NSA2LjkxNzMxQzcuNDI1NCA3LjIyOTYyIDcuNjI5ODggNy43Mzg0MyA3LjYyOTg4IDguNTQ5OVYxOC4zNDk5QzcuNjI5ODggMTkuMTYxNCA3LjQyNTQgMTkuNjcwMiA3LjEwMTU1IDE5Ljk4MjVDNi43NzQxOCAyMC4yOTgyIDYuMjM1MzQgMjAuNDk5OSA1LjM3OTg4IDIwLjQ5OTlaTTQuMzc5ODggNi44OTk5QzQuMDkzNCA2Ljg5OTkgMy44MzU3OCA2LjkxNjQgMy42MTM4MiA2Ljk2Njg5QzMuMzg3NDUgNy4wMTgzOCAzLjE2ODIyIDcuMTExOTYgMi45OTI1OCA3LjI4NzZDMi44MTU1OSA3LjQ2NDU5IDIuNzI4MDcgNy42Nzk2NiAyLjY4MzAxIDcuODkwMDJDMi42Mzk0OCA4LjA5MzE4IDIuNjI5ODggOC4zMTk2NyAyLjYyOTg4IDguNTQ5OVYxOC4zNDk5QzIuNjI5ODggMTguNTgwMSAyLjYzOTQ4IDE4LjgwNjYgMi42ODMwMSAxOS4wMDk4QzIuNzI4MDcgMTkuMjIwMSAyLjgxNTU5IDE5LjQzNTIgMi45OTI1OCAxOS42MTIyQzMuMTY4MjIgMTkuNzg3OCAzLjM4NzQ1IDE5Ljg4MTQgMy42MTM4MiAxOS45MzI5QzMuODM1NzggMTkuOTgzNCA0LjA5MzQgMTkuOTk5OSA0LjM3OTg4IDE5Ljk5OTlINS4zNzk4OEM1LjY2NjM3IDE5Ljk5OTkgNS45MjM5OCAxOS45ODM0IDYuMTQ1OTUgMTkuOTMyOUM2LjM3MjMyIDE5Ljg4MTQgNi41OTE1NSAxOS43ODc4IDYuNzY3MTkgMTkuNjEyMkM2Ljk0NDE4IDE5LjQzNTIgNy4wMzE3IDE5LjIyMDEgNy4wNzY3NiAxOS4wMDk4QzcuMTIwMjggMTguODA2NiA3LjEyOTg4IDE4LjU4MDEgNy4xMjk4OCAxOC4zNDk5VjguNTQ5OUM3LjEyOTg4IDguMzE5NjcgNy4xMjAyOCA4LjA5MzE4IDcuMDc2NzYgNy44OTAwMkM3LjAzMTcgNy42Nzk2NiA2Ljk0NDE4IDcuNDY0NTkgNi43NjcxOSA3LjI4NzZDNi41OTE1NSA3LjExMTk2IDYuMzcyMzIgNy4wMTgzOCA2LjE0NTk1IDYuOTY2ODlDNS45MjM5OCA2LjkxNjQgNS42NjYzNyA2Ljg5OTkgNS4zNzk4OCA2Ljg5OTlINC4zNzk4OFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRvd24gY29weVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEaXNsaWtlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImNoYXQ/LnVubGlrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVEb3duQ2xpY2soaSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjaGF0Py51bmxpa2VkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTUuNjEgNS41MDAwMlYxNS42NkMxNS42MSAxNi4wNiAxNS40OSAxNi40NSAxNS4yNyAxNi43OEwxMi41NCAyMC44NEMxMi4xMSAyMS40OSAxMS4wNCAyMS45NSAxMC4xMyAyMS42MUM5LjE1MDAyIDIxLjI4IDguNTAwMDIgMjAuMTggOC43MTAwMiAxOS4yTDkuMjMwMDIgMTUuOTNDOS4yNzAwMiAxNS42MyA5LjE5MDAyIDE1LjM2IDkuMDIwMDIgMTUuMTVDOC44NTAwMiAxNC45NiA4LjYwMDAyIDE0Ljg0IDguMzMwMDIgMTQuODRINC4yMjAwMkMzLjQzMDAyIDE0Ljg0IDIuNzUwMDIgMTQuNTIgMi4zNTAwMiAxMy45NkMxLjk3MDAyIDEzLjQyIDEuOTAwMDIgMTIuNzIgMi4xNTAwMiAxMi4wMUw0LjYxMDAyIDQuNTIwMDJDNC45MjAwMiAzLjI4MDAyIDYuMjcwMDIgMi4yNzAwMiA3LjYxMDAyIDIuMjcwMDJIMTEuNTFDMTIuMTggMi4yNzAwMiAxMy4xMiAyLjUwMDAyIDEzLjU1IDIuOTMwMDJMMTQuODMgMy45MjAwMkMxNS4zMiA0LjMwMDAyIDE1LjYxIDQuODgwMDIgMTUuNjEgNS41MDAwMlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTcyMzVCXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTguNzkwMSAxNy42MDk5SDE5LjgyMDFDMjEuMzcwMSAxNy42MDk5IDIyLjAwMDEgMTcuMDA5OSAyMi4wMDAxIDE1LjUyOTlWNS40Nzk5QzIyLjAwMDEgMy45OTk5IDIxLjM3MDEgMy4zOTk5IDE5LjgyMDEgMy4zOTk5SDE4Ljc5MDFDMTcuMjQwMSAzLjM5OTkgMTYuNjEwMSAzLjk5OTkgMTYuNjEwMSA1LjQ3OTlWMTUuNTM5OUMxNi42MTAxIDE3LjAwOTkgMTcuMjQwMSAxNy42MDk5IDE4Ljc5MDEgMTcuNjA5OVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTcyMzVCXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaT5cblxuICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiIWNoYXQ/LnVubGlrZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC4xMjM3IDIxLjQ4MUwxMC4xMTQ4IDIxLjQ3NzhMMTAuMTA1OSAyMS40NzQ4QzkuMDk1NzcgMjEuMTQzNSA4LjQ0NDE2IDIwLjAxMjIgOC42Njg0OSAxOC45ODY3TDguNjcxNzUgMTguOTcxOEw4LjY3NDEgMTguOTU2OEw5LjE2NDEgMTUuODA2OEw5LjE2NDEzIDE1LjgwNjhMOS4xNjUwMSAxNS44MDA2QzkuMTgxNzUgMTUuNjgzNSA5LjIwMjA3IDE1LjM5NzIgOC45ODYzMyAxNS4xNTA3TDguOTc1MzYgMTUuMTM4MUw4Ljk2MzU5IDE1LjEyNjNDOC44MTY4NyAxNC45Nzk2IDguNjE4NDEgMTQuODk5OSA4LjQxMDA0IDE0Ljg5OTlINC40MTAwNEMzLjU2OTM3IDE0Ljg5OTkgMi44ODI1MiAxNC41NTEgMi40ODg4NCAxMy45OTJMMi40ODc3IDEzLjk5MDRDMi4xMDM3MSAxMy40NDk3IDIuMDA5MzEgMTIuNzE1IDIuMjc5OTQgMTEuOTcwOEwyLjI4MjYzIDExLjk2MzRMMi4yODUwOSAxMS45NTU5TDQuNjc1MDkgNC42NzU4Nkw0LjY4MDM1IDQuNjU5ODVMNC42ODQ1MSA0LjY0MzUzQzQuOTk0MTggMy40Mjk5NiA2LjMzMjcxIDIuMzk5OSA3LjcyMDA0IDIuMzk5OUgxMS41MkMxMS43NTkxIDIuMzk5OSAxMi4xNTk5IDIuNDM3MzYgMTIuNTcwNCAyLjU0ODcyQzEyLjk4NzggMi42NjE5NCAxMy4zNTk2IDIuODM2NTUgMTMuNTk2NSAzLjA3MzQ2TDEzLjYxOTEgMy4wOTYwOEwxMy42NDQ0IDMuMTE1NjNMMTYuMjc4NSA1LjE0OTg2TDE1Ljk3MDUgNS41NDgyNUwxMy4yODc1IDMuNDcxMTFDMTMuMDc5OSAzLjI3NjMgMTIuNzgzNyAzLjE0MTMgMTIuNTA2MSAzLjA1NDEyQzEyLjIwMzEgMi45NTg5NyAxMS44NTUxIDIuODk5OSAxMS41MiAyLjg5OTlINy43MjAwNEM3LjE0MjkgMi44OTk5IDYuNTczNTMgMy4xMjczNSA2LjEyNTA4IDMuNDU5MjZDNS42ODQyOCAzLjc4NTUxIDUuMzA4OTIgNC4yNTE0MiA1LjE2OTYzIDQuNzkwMTlMMi43NTczOCAxMi4xMTY3QzIuNTYyMjMgMTIuNjU5IDIuNTcxNDcgMTMuMjQwOSAyLjkwMzY2IDEzLjcwMTJDMy4yNDE4MyAxNC4xNzYxIDMuODE1NzggMTQuMzk5OSA0LjQyMDA0IDE0LjM5OTlIOC40MjAwNEM4Ljc5NzAyIDE0LjM5OTkgOS4xMzg2NyAxNC41NTg1IDkuMzcyNTIgMTQuODI3N0w5LjM3MzE1IDE0LjgyODVDOS42MTI4NiAxNS4xMDM0IDkuNzI0NTcgMTUuNDc0NSA5LjY2NTY4IDE1Ljg3NUM5LjY2NTYgMTUuODc1NSA5LjY2NTUyIDE1Ljg3NjEgOS42NjU0NCAxNS44NzY2TDkuMTY3OTUgMTkuMDcwNEM5LjAwMjQyIDE5Ljg4NDEgOS41MzI5OSAyMC43NDI4IDEwLjI5MzMgMjEuMDAxM0MxMC42Njg1IDIxLjEzOTEgMTEuMDY3NSAyMS4wOTc4IDExLjM4NTcgMjAuOTkxN0MxMS43MDAxIDIwLjg4NjkgMTIuMDIxOCAyMC42ODk4IDEyLjIxMjEgMjAuNDEzMkwxMi4yMTIxIDIwLjQxMzJMMTIuMjE1IDIwLjQwODhMMTYuMDM1MSAxNC43MjUzTDE2LjQ0NzIgMTUuMDA0NUwxMi42MjUxIDIwLjY5MUwxMi42MjQ5IDIwLjY5MTJDMTIuMjU5IDIxLjIzNjEgMTEuNTM0NyAyMS41OTk5IDEwLjggMjEuNTk5OUMxMC41NjY4IDIxLjU5OTkgMTAuMzM1OCAyMS41NTk2IDEwLjEyMzcgMjEuNDgxWlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTkuNjIwMSAxNy42SDE4LjYyMDFDMTcuNzY0NyAxNy42IDE3LjIyNTggMTcuMzk4MyAxNi44OTg1IDE3LjA4MjZDMTYuNTc0NiAxNi43NzAzIDE2LjM3MDEgMTYuMjYxNSAxNi4zNzAxIDE1LjQ1VjUuNjVDMTYuMzcwMSA0LjgzODUzIDE2LjU3NDYgNC4zMjk3MiAxNi44OTg1IDQuMDE3NEMxNy4yMjU4IDMuNzAxNyAxNy43NjQ3IDMuNSAxOC42MjAxIDMuNUgxOS42MjAxQzIwLjQ3NTYgMy41IDIxLjAxNDQgMy43MDE3IDIxLjM0MTggNC4wMTc0QzIxLjY2NTYgNC4zMjk3MiAyMS44NzAxIDQuODM4NTMgMjEuODcwMSA1LjY1VjE1LjQ1QzIxLjg3MDEgMTYuMjYxNSAyMS42NjU2IDE2Ljc3MDMgMjEuMzQxOCAxNy4wODI2QzIxLjAxNDQgMTcuMzk4MyAyMC40NzU2IDE3LjYgMTkuNjIwMSAxNy42Wk0xOC42MjAxIDRDMTguMzMzNiA0IDE4LjA3NiA0LjAxNjQ5IDE3Ljg1NDEgNC4wNjY5OUMxNy42Mjc3IDQuMTE4NDggMTcuNDA4NSA0LjIxMjA2IDE3LjIzMjggNC4zODc3QzE3LjA1NTggNC41NjQ2OSAxNi45NjgzIDQuNzc5NzYgMTYuOTIzMiA0Ljk5MDExQzE2Ljg3OTcgNS4xOTMyOCAxNi44NzAxIDUuNDE5NzcgMTYuODcwMSA1LjY1VjE1LjQ1QzE2Ljg3MDEgMTUuNjgwMiAxNi44Nzk3IDE1LjkwNjcgMTYuOTIzMiAxNi4xMDk5QzE2Ljk2ODMgMTYuMzIwMiAxNy4wNTU4IDE2LjUzNTMgMTcuMjMyOCAxNi43MTIzQzE3LjQwODUgMTYuODg3OSAxNy42Mjc3IDE2Ljk4MTUgMTcuODU0MSAxNy4wMzNDMTguMDc2IDE3LjA4MzUgMTguMzMzNiAxNy4xIDE4LjYyMDEgMTcuMUgxOS42MjAxQzE5LjkwNjYgMTcuMSAyMC4xNjQyIDE3LjA4MzUgMjAuMzg2MiAxNy4wMzNDMjAuNjEyNiAxNi45ODE1IDIwLjgzMTggMTYuODg3OSAyMS4wMDc0IDE2LjcxMjNDMjEuMTg0NCAxNi41MzUzIDIxLjI3MTkgMTYuMzIwMiAyMS4zMTcgMTYuMTA5OUMyMS4zNjA1IDE1LjkwNjcgMjEuMzcwMSAxNS42ODAyIDIxLjM3MDEgMTUuNDVWNS42NUMyMS4zNzAxIDUuNDE5NzcgMjEuMzYwNSA1LjE5MzI4IDIxLjMxNyA0Ljk5MDExQzIxLjI3MTkgNC43Nzk3NiAyMS4xODQ0IDQuNTY0NjkgMjEuMDA3NCA0LjM4NzdDMjAuODMxOCA0LjIxMjA2IDIwLjYxMjYgNC4xMTg0OCAyMC4zODYyIDQuMDY2OTlDMjAuMTY0MiA0LjAxNjQ5IDE5LjkwNjYgNCAxOS42MjAxIDRIMTguNjIwMVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIlJlbGF0ZWQgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBzaG93RmVlZEJhY2tJY29uc0luZGV4ID09PSBpICYmXG4gICAgICAgICAgICAgICAgICAgICFpc0NoYXRpbmdXaXRoQWkgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8ucmVsYXRlZExpc3RJdGVtcyAmJlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py5yZWxhdGVkTGlzdEl0ZW1zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiY2hhdD8udHlwZSA9PT0gJ2FpJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJ4IGJ4LWxpc3QtY2hlY2tcIj48L2k+IFJlbGF0ZWRcbiAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250YWluZXJcIiAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICdhaSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNoYXQ/LnJlbGF0ZWRMaXN0SXRlbXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiZmV0Y2hEYXRhRm9yKGl0ZW0sIGNoYXQpXCI+e3sgaXRlbSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImN0YS1mYXFzIHF1aWNrLXByb21wdHMtZXh0ZW5kZWRcIlxuICAgICAgICAgICAgICAqbmdJZj1cImkgPT0gMCAmJiBxdWlja1Byb21wdHM/Lmxlbmd0aFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdGb3I9XCJsZXQgdGlsZSBvZiBxdWlja1Byb21wdHNcIiBjbGFzcz1cImN0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZW5kTWVzc2FnZVdpdGhUaWxlKHRpbGUucHJvbXB0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBROiB7eyB0aWxlLnRleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdGFfc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGlsZSBvZiBxdWlja1Byb21wdHNcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRNZXNzYWdlV2l0aFRpbGUodGlsZS5wcm9tcHQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGlsZVwiPnt7IHRpbGUudGV4dCB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQgYm90XCIgKm5nSWY9XCJpID09IDAgJiYgYm90U2tpbGxzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWJveFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkljb25fVGltZVNUYW1wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJBc3Npc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYXZhdGFyLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKGRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYXZhdGFyLWluaXRpYWxzIGNoYXQtYXZhdGFyLWluaXRpYWxzLWFzc2lzdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5BPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXRlVGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0ZVRpbWVDb2xvciA/ICcnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGdldFRyYW5zbGF0aW9uKFwiQXNzaXN0YW50XCIpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hhdD8udGltZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYnViYmxlLXdyYXBcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGJnQnViYmxlQWkgfHwgJyNmZmYnIH1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1idWJibGUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiU2VhcmNoVGl0bGUgYWlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJwcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoYm90U2tpbGxzKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYXQ/LnN1Z2dlc3Rpb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibGFiZWxDaGF0XCI+XG4gICAgICAgICAgICAgICAgSGVyZSBhcmUgc29tZSB0aGluZ3MgRXZlbnRzR1BUIENvcGlsb3QgY2FuIGhlbHAgeW91IGRvOlxuICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3RhX3N1Z2dlc3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHN1Z2dlc3Rpb24gb2YgY2hhdD8uc3VnZ2VzdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRNZXNzYWdlV2l0aFRpbGUoc3VnZ2VzdGlvbilcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWdnZXN0aW9uXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvblxuICAgICAgICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBjaGF0Py5hY3Rpb24/LnNlY3Rpb25faWQgPT0gJ2NvbXBhbnlfc2VhcmNoJyB8fFxuICAgICAgICAgICAgICAgIGNoYXQ/LmFjdGlvbj8uc2VjdGlvbl9pZCA9PSAndXNlcl9zZWFyY2gnIHx8XG4gICAgICAgICAgICAgICAgY2hhdD8uYWN0aW9uPy5zZWN0aW9uX2lkID09ICdpbmR1c3RyeV9jb21wYW55X3NlYXJjaCdcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aWt0b2t3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGlrdG9rc2hlbGxcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdXNlciBvZiBjaGF0Py5hY3Rpb24udXNlcnNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlkZW9QaG90b2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb25hdGluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidXNlcj8ucGhvdG9QYXRoICYmICF1c2VyLnVzZXJWaWRlb3NNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInVzZXI/LnBob3RvUGF0aFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb25hdGluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbmF0aW5lciAqbmdJZj1cInVzZXIudXNlclZpZGVvc01vZGVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXZpZGVvLXBsYXllclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXI/LnVzZXJWaWRlb3NNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpc0Rldl09XCJpc0RldlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50VXNlcklkXT1cInVzZXJJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2aWRlb09ial09XCJ1c2VyPy51c2VyVmlkZW9zTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlcl09XCJ1c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2ZW50SWRdPVwiZXZlbnRJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLXZpZGVvLXBsYXllcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbmF0aW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9QaG90b1wiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhdXNlcj8ucGhvdG9QYXRoICYmICF1c2VyLnVzZXJWaWRlb3NNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aDM+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB1c2VyLmZpcnN0TmFtZSB8IHNsaWNlOiAwIDogMVxuICAgICAgICAgICAgICAgICAgICAgICAgfX17eyB1c2VyLmxhc3ROYW1lIHwgc2xpY2U6IDAgOiAxIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybHltYXNrXCIgKm5nSWY9XCIhdXNlci51c2VyVmlkZW9zTW9kZWxcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uc2hlbGwtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1zaGVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPnt7IHVzZXIuZmlyc3ROYW1lIH19IHt7IHVzZXIubGFzdE5hbWUgfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY29tcGFueU5hbWVcIj57eyB1c2VyLmNvbXBhbnkgfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tc2hlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJDb25uZWN0YnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbm5lY3RUb1VzZXIodXNlci51c2VySWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Db25uZWN0KHVzZXIudXNlcklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIkNvbm5lY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjYW5EaXNjb25uZWN0KHVzZXIudXNlcklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiRGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJSZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFNlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2NoZWR1bGVidG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2NoZWR1bGVNZWV0aW5nV2l0aFVzZXIodXNlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY2hhdD8uYWN0aW9uPy5zZWN0aW9uX2lkID09IG15VXBjb21pbmdTZXNzaW9uQWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VuZGEtaXRlbXMtd3JhcHBlclwiIGNsYXNzPVwiYWdlbmRhLWl0ZW1zLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC12aWV3XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1kZXRhaWwtd3JhcHBlciBjYXJkLWJhY2tncm91bmQtc2Vzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB1cGNvbWluZ1Nlc3Npb24gb2YgY2hhdD8uYWN0aW9uLmNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiSW50cm9kdWN0aW9uIHRvIHRoZSBJbWFnaW5nIFJhZGFyIEFjYWRlbXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9zMjdtZWRpYS5henVyZWVkZ2UubmV0LzgwMDgvcHJvZmlsZV9waWMvNDUzY2VhMmMtZmViYS0xMWVkLThjMGItMDAxNTVkMDI1YjBhLnBuZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT48YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBsYXktYnRuIGNvbG9yLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJXYXRjaDogSW50cm9kdWN0aW9uIHRvIHRoZSBJbWFnaW5nIFJhZGFyIEFjYWRlbXlcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheV9jaXJjbGVfb3V0bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQgcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZnMteHMgbWItMCBib2R5LXRleHQtY29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBjb21pbmdTZXNzaW9uLmRhdGVUaW1lUmFuZ2Uuc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk1NLWRkLXl5eXkgSEg6bW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0U2Vzc2lvbklhbmFUaW1lWm9uZSh1cGNvbWluZ1Nlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwY29taW5nU2Vzc2lvbi5kYXRlVGltZVJhbmdlLmVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiTU0tZGQteXl5eSBISDptbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRTZXNzaW9uSWFuYVRpbWVab25lKHVwY29taW5nU2Vzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHVwY29taW5nU2Vzc2lvbi50aW1lWm9uZS5pZCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxwIGNsYXNzPVwiZnMteHMgbWItMiBjb2xvci1zZWNvbmRhcnlcIiB0aXRsZT1cIlNlc3Npb24gVHlwZTogR2VuZXJhdGl2ZSBBSVwiPkdlbmVyYXRpdmUgQUkgPC9wPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBhY3Rpb25zIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwY29taW5nU2Vzc2lvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZXctc2Vzc2lvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiczI3LWJ0bi1pY29uIGJvZHktdGV4dC1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJWaWV3IFNlc3Npb24gSW5mb3JtYXRpb246IEludHJvZHVjdGlvbiB0byB0aGUgSW1hZ2luZyBSYWRhciBBY2FkZW15XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9yZWRfZXllXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwY29taW5nU2Vzc2lvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZC10by1hZ2VuZGEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInMyNy1idG4taWNvbiBib2R5LXRleHQtY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgU2Vzc2lvbjogSW50cm9kdWN0aW9uIHRvIHRoZSBJbWFnaW5nIFJhZGFyIEFjYWRlbXkgdG8gTXkgYWdlbmRhYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbih1cGNvbWluZ1Nlc3Npb24uaWQsICdwbGF5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiczI3LWJ0bi1pY29uIGJvZHktdGV4dC1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDb3B5IHNlc3Npb24gbGluayB0byBzaGFyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2NpcmNsZV9vdXRsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwiYm9keS10ZXh0LWNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB1cGNvbWluZ1Nlc3Npb24udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1kZXNjcmlwdGlvbiBjb2xvci1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwodXBjb21pbmdTZXNzaW9uLmRlc2NyaXB0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcGVha2VycyBncmlkLTItY29sc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgc3BlYWtlcklkIG9mIHVwY29taW5nU2Vzc2lvbi5zcGVha2Vyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZVwiIHRpdGxlPVwiQmxhaXIgV3VuZGVybGljaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkJsYWlyIFd1bmRlcmxpY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJzcGVha2Vyc1tzcGVha2VySWRdPy5waG90b1BhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnQgcGwtM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LXRyYW5zZm9ybTogbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMCBib2R5LXRleHQtY29sb3IgZnMteHMgZnctNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGVha2Vyc1tzcGVha2VySWRdPy5maXJzdE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwZWFrZXJzW3NwZWFrZXJJZF0/Lmxhc3ROYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLXNlY29uZGFyeSBmcy14eHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwZWFrZXJzW3NwZWFrZXJJZF0/LmpvYlRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLXNlY29uZGFyeSBmcy14eHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwZWFrZXJzW3NwZWFrZXJJZF0/LmNvbXBhbnkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIEluaXRpYWwgbG9hZDogbG9hZGluZyBkb3RzIHdoZW4gZmV0Y2hpbmcgY2hhdCBoaXN0b3J5IChubyBcIlRoaW5raW5nXCIpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdCBib3QgY2hhdC10aGlua2luZyBjaGF0LWxvYWRpbmctZG90c1wiICpuZ0lmPVwibG9hZGluZyAmJiAhaXNDaGF0aW5nV2l0aEFpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiSWNvbl9UaW1lU1RhbXBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCIgW3NyY109XCJkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb25cIiBhbHQ9XCJBc3Npc3RhbnRcIiBjbGFzcz1cImNoYXQtYXZhdGFyLWltZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIShkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb24pXCIgY2xhc3M9XCJjaGF0LWF2YXRhci1pbml0aWFscyBjaGF0LWF2YXRhci1pbml0aWFscy1hc3Npc3RhbnRcIj5BPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZVRpbWVcIiBbc3R5bGUuY29sb3JdPVwiZGF0ZVRpbWVDb2xvciA/ICcnIDogJydcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0VHJhbnNsYXRpb24oXCJBc3Npc3RhbnRcIikgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIHt7IGdldExvYWRpbmdUaW1lKCkgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoaW5raW5nLXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGlua2luZy1kb3RzXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRoaW5raW5nLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGhpbmtpbmctZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aGlua2luZy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aGlua2luZy10ZXh0XCI+e3sgZ2V0VHJhbnNsYXRpb24oXCJMb2FkaW5nXCIpIHx8IFwiTG9hZGluZ1wiIH19Li4uPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBUaGlua2luZzogb25seSB3aGVuIHVzZXIgaGFzIHNlbnQgYSBtZXNzYWdlIGFuZCBBSSBpcyByZXNwb25kaW5nIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdCBib3QgY2hhdC10aGlua2luZ1wiICpuZ0lmPVwiaXNDaGF0aW5nV2l0aEFpICYmICFleGVjdXRpbmdXb3JrZmxvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtY3RhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkljb25fVGltZVNUYW1wXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiIFtzcmNdPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCIgYWx0PVwiQXNzaXN0YW50XCIgY2xhc3M9XCJjaGF0LWF2YXRhci1pbWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEoZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uKVwiIGNsYXNzPVwiY2hhdC1hdmF0YXItaW5pdGlhbHMgY2hhdC1hdmF0YXItaW5pdGlhbHMtYXNzaXN0YW50XCI+QTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVUaW1lXCIgW3N0eWxlLmNvbG9yXT1cImRhdGVUaW1lQ29sb3IgPyAnJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGdldFRyYW5zbGF0aW9uKFwiQXNzaXN0YW50XCIpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRMb2FkaW5nVGltZSgpIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGlua2luZy1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhpbmtpbmctZG90c1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aGlua2luZy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRoaW5raW5nLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGhpbmtpbmctZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGhpbmtpbmctdGV4dFwiPnt7IGdldFRyYW5zbGF0aW9uKFwiVGhpbmtpbmdcIikgfHwgXCJUaGlua2luZ1wiIH19Li4uPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSA8ZGl2ICNjaGF0TWFpbj48L2Rpdj4gLS0+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwib3BlbldvcmtmbG93SW5wdXQgJiYgc2VsZWN0ZWRXb3JrZmxvdyAmJiAhZXhlY3V0aW5nV29ya2Zsb3dcIlxuICAgICAgICBjbGFzcz1cImNoYXRGb290ZXJXcmFwcGVyXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBuZXcgVUkgZm9yIENoYXQgTWVzc2FnZSBTZWN0aW9uIGJ5IEFtaXQgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWZvb3Rlci11cHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9waW5mby1jb250YWluZXJib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHNfbm90ZV93cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGg2Pnt7IHNlbGVjdGVkV29ya2Zsb3c/Lk5hbWUgfX08L2g2PlxuICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkV29ya2Zsb3c/LkRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHNfbm90ZV93cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsb3NlQnV0dG9uU291cmNlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlV29ya2Zsb3dzKGZhbHNlKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b21ib3gtd3JhcHBlclwiPlxuICAgICAgICAgICAgPCEtLSBoZXJlIGkgbmVlZCB0byBsb29wIHRocm91Z2ggYWxsIHRoZSBpbnB1dCBmaWVsZHMgc2VsZWN0ZWRXb3JrZmxvdy5UcmlnZ2VyLklucHV0U2NoZW1hIGFuZCByZW5kZXIgdGhlIGlucHV0IGZpZWxkcyAtLT5cbiAgICAgICAgICAgIDwhLS0gRm9ybSBmb3IgV29ya2Zsb3cgSW5wdXRzIC0tPlxuICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJ3b3JrZmxvd0Zvcm1cIlxuICAgICAgICAgICAgICAobmdTdWJtaXQpPVwib25Xb3JrZmxvd1N1Ym1pdCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW5wdXQgb2Ygc2VsZWN0ZWRXb3JrZmxvdz8uVHJpZ2dlcj8uSW5wdXRTY2hlbWFcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgaW5wdXQuTGFiZWwgfX08L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIYW5kbGUgVGV4dCBJbnB1dCBvciBUZXh0IEFyZWEgYmFzZWQgb24gcmVxdWlyZW1lbnQgLS0+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImlucHV0LlR5cGUgPT09ICdzdHJpbmcnXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGlucHV0LklucHV0SWQgfX1cIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImlucHV0LlBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImlucHV0LlJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cblxuICAgICAgICAgICAgICAgIDwhLS0gRHJvcGRvd24gZm9yIFNlbGVjdCBPcHRpb25zIC0tPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW5wdXQuVHlwZSA9PT0gJ3NlbGVjdCdcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgaW5wdXQuSW5wdXRJZCB9fVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGlucHV0Lk9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLlZhbHVlXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLkxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBTdWJtaXQgYnV0dG9uIGFsaWduZWQgdG8gdGhlIHJpZ2h0IC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHN1Ym1pdC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgIFN1Ym1pdFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBuZXcgVUkgZm9yIENoYXQgTWVzc2FnZSBTZWN0aW9uIGJ5IEFtaXQgLS0+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhb3BlbldvcmtmbG93SW5wdXRcIiBjbGFzcz1cImNoYXRGb290ZXJXcmFwcGVyXCI+XG4gICAgICAgIDwhLS0gbmV3IFVJIGZvciBDaGF0IE1lc3NhZ2UgU2VjdGlvbiBieSBBbWl0IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1mb290ZXItdXB0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvcGluZm8tY29udGFpbmVyYm94XCIgKm5nSWY9XCIhY2hlY2tGb3JDb3AyOUJvdElkKClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHNfbm90ZV93cmFwcGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHMtZHJvcGRvd24td3JhcHBlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi13cmFwcGVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0RHJvcGRvd25IZWFkZXJUZXh0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE5IDlsLTcgNy03LTdcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzRHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCAoY2xpY2spPVwib25TZWxlY3RBbGwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJhcmVBbGxTZWxlY3RlZCgpXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICBBbGxcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFnZW50IG9mIGFnZW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWdlbnRDaGFuZ2UoYWdlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImFnZW50LnNlbGVjdGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBhZ2VudC5hZ2VudE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzX25vdGVfd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLWRyb3Bkb3duLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24td3JhcHBlclwiIChjbGljayk9XCJ0b2dnbGVXb3JrZmxvd3MoKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI1NiAyNTZcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01IHctNVwiXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMS4zZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMS4zZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjQ1LjY2LDc0LjM0bC0zMi0zMmE4LDgsMCwwLDAtMTEuMzIsMTEuMzJMMjIwLjY5LDcySDE5MmE3NC40OSw3NC40OSwwLDAsMC0yOC4zNSw2LjczYy0xMy42Miw2LjI5LTMwLjgzLDE5LjcxLTM1LjU0LDQ4LTUuMzIsMzEuOTQtMjkuMSwzOS4yMi00MSw0MC44NmE0MCw0MCwwLDEsMCwuMTgsMTYuMDZBNzEuNjUsNzEuNjUsMCwwLDAsMTA4LjEzLDE3OEMxMjEuNzUsMTcyLDEzOSwxNTguNiwxNDMuODksMTI5LjMxLDE1MC42NSw4OC43NywxOTAuMzQsODgsMTkyLDg4aDI4LjY5bC0xOC4zNSwxOC4zNGE4LDgsMCwwLDAsMTEuMzIsMTEuMzJsMzItMzJBOCw4LDAsMCwwLDI0NS42Niw3NC4zNFpNNDgsMjAwYTI0LDI0LDAsMSwxLDI0LTI0QTI0LDI0LDAsMCwxLDQ4LDIwMFpcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3BhdGg+PC9zdmdcbiAgICAgICAgICAgICAgICAgICAgPiZuYnNwOyBXb3JrZmxvd3NcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImlzV29ya2Zsb3dPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcmdXb3JrZmxvdyBvZiBvcmdXb3JrZmxvd3NcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbldvcmtmbG93U2VsZWN0ZWQob3JnV29ya2Zsb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZ1dvcmtmbG93Lk5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3R0b21ib3gtd3JhcHBlclwiPlxuICAgICAgICAgICAgPCEtLSA8aW5wdXQgW2Rpc2FibGVkXT1cImlzQ2hhdGluZ1dpdGhBaVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wtMSBzMjctc2Nyb2xsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFzayBhbnl0aGluZy4uLlwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImZvcm1GaWVsZEJnQ29sb3IgPyBmb3JtRmllbGRCZ0NvbG9yIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJmb3JtRmllbGRUZXh0Q29sb3IgPyBmb3JtRmllbGRUZXh0Q29sb3IgOiAnJ1wiIFsobmdNb2RlbCldPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJoYW5kbGVTdWJtaXQoKVwiICNteUlucHV0IC8+IC0tPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NoYXRpbmdXaXRoQWlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbC0xIHMyNy1zY3JvbGwgY2hhdC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgZ2V0VHJhbnNsYXRpb24oJ0FzayBhbnl0aGluZycpIH19XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJhZGp1c3RUZXh0YXJlYUhlaWdodCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgI215SW5wdXRcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxuXG4gICAgICAgICAgICBcblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBjdGEtY2hhdCByb3RhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU3VibWl0KClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzZW5kQnV0dG9uQ29sb3IgPyBzZW5kQnV0dG9uQ29sb3IgOiAnJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZW5kQnV0dG9uVGV4dENvbG9yID8gc2VuZEJ1dHRvblRleHRDb2xvciA6ICcnXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBnZXRUcmFuc2xhdGlvbignU2VuZCBNZXNzYWdlJykgfX1cIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogMXB4XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMFwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCA1MTIgNTEyXCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxZW1cIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMWVtXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBkPVwiTTQ3Ni41OSAyMjcuMDVsLS4xNi0uMDdMNDkuMzUgNDkuODRBMjMuNTYgMjMuNTYgMCAwMDI3LjE0IDUyIDI0LjY1IDI0LjY1IDAgMDAxNiA3Mi41OXYxMTMuMjlhMjQgMjQgMCAwMDE5LjUyIDIzLjU3bDIzMi45MyA0My4wN2E0IDQgMCAwMTAgNy44NkwzNS41MyAzMDMuNDVBMjQgMjQgMCAwMDE2IDMyN3YxMTMuMzFBMjMuNTcgMjMuNTcgMCAwMDI2LjU5IDQ2MGEyMy45NCAyMy45NCAwIDAwMTMuMjIgNCAyNC41NSAyNC41NSAwIDAwOS41Mi0xLjkzTDQ3Ni40IDI4NS45NGwuMTktLjA5YTMyIDMyIDAgMDAwLTU4Ljh6XCJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPCEtLSBTRU5EIC0tPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gY3RhLWNoYXQgbXItMSB2b2ljZS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblZvaWNlTW9kYWwoKVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzZW5kQnV0dG9uQ29sb3IgPyBzZW5kQnV0dG9uQ29sb3IgOiAnJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZW5kQnV0dG9uVGV4dENvbG9yID8gc2VuZEJ1dHRvblRleHRDb2xvciA6ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGNsYXNzPVwidm9pY2UtYnRuLWljb25cIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cInZiYXIgdmJhci0xXCIgeD1cIjNcIiAgeT1cIjlcIiAgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiNlwiICByeD1cIjFcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgICAgIDxyZWN0IGNsYXNzPVwidmJhciB2YmFyLTJcIiB4PVwiN1wiICB5PVwiNlwiICB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxMlwiIHJ4PVwiMVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICAgICAgPHJlY3QgY2xhc3M9XCJ2YmFyIHZiYXItM1wiIHg9XCIxMVwiIHk9XCIzXCIgIHdpZHRoPVwiMlwiIGhlaWdodD1cIjE4XCIgcng9XCIxXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cInZiYXIgdmJhci00XCIgeD1cIjE1XCIgeT1cIjZcIiAgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMTJcIiByeD1cIjFcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgICAgIDxyZWN0IGNsYXNzPVwidmJhciB2YmFyLTVcIiB4PVwiMTlcIiB5PVwiOVwiICB3aWR0aD1cIjJcIiBoZWlnaHQ9XCI2XCIgIHJ4PVwiMVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvaWNlLWJ0bi10ZXh0XCI+Vm9pY2U8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBuZXcgVUkgZm9yIENoYXQgTWVzc2FnZSBTZWN0aW9uIGJ5IEFtaXQgLS0+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIk5vdGVUeHRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGVcIj5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIHdpZHRoPVwiMTIuODgyXCJcbiAgICAgICAgICAgIGhlaWdodD1cIjEyLjg4M1wiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEyLjg4MiAxMi44ODNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGlkPVwiSWNvbl9pb24tc2hpZWxkLWNoZWNrbWFya1wiXG4gICAgICAgICAgICAgIGRhdGEtbmFtZT1cIkljb24gaW9uLXNoaWVsZC1jaGVja21hcmtcIlxuICAgICAgICAgICAgICBkPVwiTTE1LjEwNiw0LjUzMmEuNDYuNDYsMCwwLDAtLjM3OC0uNDI0QTIwLjEzMiwyMC4xMzIsMCwwLDEsOC44ODEsMi4yOTFhLjQ2LjQ2LDAsMCwwLS4zNzksMEEyMC4xMzIsMjAuMTMyLDAsMCwxLDIuNjU1LDQuMTA4YS40Ni40NiwwLDAsMC0uMzc4LjQyNEExMS4zLDExLjMsMCwwLDAsMi45OCw5LjRhMTAuMDQ5LDEwLjA0OSwwLDAsMCwyLjA2LDMuMjM1QTEwLjUxNiwxMC41MTYsMCwwLDAsOC41MjEsMTUuMWEuNDYuNDYsMCwwLDAsLjM0NSwwLDEwLjUxNiwxMC41MTYsMCwwLDAsMy40ODEtMi40NjVBMTAuMDQ5LDEwLjA0OSwwLDAsMCwxNC40LDkuNCwxMS4zLDExLjMsMCwwLDAsMTUuMTA2LDQuNTMyWm0tMy43NjcsMi4xNkw4LjE1MywxMC4zNzNhLjQ2LjQ2LDAsMCwxLS4zMjguMTU5SDcuODA2YS40Ni40NiwwLDAsMS0uMzIyLS4xMzFMNi4wNjksOS4wMTRhLjQ2LjQ2LDAsMSwxLC42NDQtLjY1N0w3Ljc3Nyw5LjQsMTAuNjQ0LDYuMDlhLjQ2LjQ2LDAsMCwxLC43LjZaXCJcbiAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjI1IC0yLjI1KVwiXG4gICAgICAgICAgICAgIGZpbGw9XCIjMDZmXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHRcIj57e1xuICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oXG4gICAgICAgICAgICAgIFwiWW91ciBwZXJzb25hbCBvciBjb21wYW55IGluZm9ybWF0aW9uIGlzIGtlcHQgcHJpdmF0ZSBhbmQgc2VjdXJlXG4gICAgICAgICAgICB3aXRoaW4gdGhpcyBjaGF0LlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZHJhd2VyLWNvbnRlbnQ+XG4gIDwvbWF0LWRyYXdlcj5cbiAgPG1hdC1kcmF3ZXJcbiAgICBjbGFzcz1cImRyYXdlciBlZGl0LWJveERyYXdlclwiXG4gICAgc3R5bGU9XCJ3aWR0aDogNDUlXCJcbiAgICAjc291cmNlc0RyYXdlclxuICAgIFtwb3NpdGlvbl09XCInZW5kJ1wiXG4gICAgW21vZGVdPVwiJ292ZXInXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJcbiAgICAgICdsaW5lYXItZ3JhZGllbnQoJyArIChiZ0dyYWRpZW50ID8gYmdHcmFkaWVudC5qb2luKCcsICcpIDogJycpICsgJyknXG4gICAgXCJcbiAgPlxuICAgIDxtYXQtZHJhd2VyLWNvbnRlbnQ+XG4gICAgICA8ZGl2IGNsYXNzPVwic291cmNlRHJhd2VDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJjbG9zZUJ1dHRvblNvdXJjZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25DbG9zZVNvdXJjZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxoMT57eyBjdXJyZW50U291cmNlc0xpc3Q/Lmxlbmd0aCB9fSBTb3VyY2VzPC9oMT5cbiAgICAgICAgICA8IS0tIDxwPlRlbGwgbWUgYWJvdXQgbGF0ZXN0IG5ld3MgZnJvbSBNaXN0cmFsIGFib3V0IEFJIGFnZW50cyBhbm5vdW5jZW1lbnQgZG9uZSB0aGlzIG1vbnRoPC9wPiAtLT5cbiAgICAgICAgICA8aHIgLz5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJzb3VyY2VzLWxpc3RcIj5cbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjdXJyZW50U291cmNlc0xpc3Q7IGxldCBzaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic291cmNlMVwiPiAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS1jb250ZW50XCIgKGNsaWNrKT1cIm9wZW5MaW5rSW5OZXdUYWIoaXRlbS5saW5rKVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzb3VyY2UxXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvdXJjZS10aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgID48c3BhbiBjbGFzcz1cIm1sLTFcIj57eyBzaSArIDEgfX0uPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID57eyBpdGVtLnRpdGxlIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRGYXZpY29uVXJsKGl0ZW0ubGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwiZ2V0RG9tYWluTmFtZShpdGVtLmxpbmspICsgJyBmYXZpY29uJ1wiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBnZXREb21haW5OYW1lKGl0ZW0ubGluaykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvdXJjZS1kZXNjcmlwdGlvblwiPnt7IGl0ZW0uZGVzYyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L21hdC1kcmF3ZXItY29udGVudD5cbiAgPC9tYXQtZHJhd2VyPlxuICA8bWF0LWRyYXdlclxuICAgIGNsYXNzPVwiZHJhd2VyIGVkaXQtYm94RHJhd2VyXCJcbiAgICBzdHlsZT1cIndpZHRoOiA0NSVcIlxuICAgICNlZGl0b3JzRHJhd2VyXG4gICAgW3Bvc2l0aW9uXT1cIidlbmQnXCJcbiAgICBbbW9kZV09XCIncHVzaCdcIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIlxuICAgICAgJ2xpbmVhci1ncmFkaWVudCgnICsgKGJnR3JhZGllbnQgPyBiZ0dyYWRpZW50LmpvaW4oJywgJykgOiAnJykgKyAnKSdcbiAgICBcIlxuICA+XG4gICAgPG1hdC1kcmF3ZXItY29udGVudD5cbiAgICAgIDxsaWItYm90LWh0bWwtZWRpdG9yXG4gICAgICAgICpuZ0lmPVwiaXNDb250ZW50TG9hZGVkXCJcbiAgICAgICAgW2VkaXRvckNvbnRlbnRdPVwiY3VycmVudE1lc3NhZ2VGb3JFZGl0b3JcIlxuICAgICAgICBbaXNEb2NJbkVkaXRNb2RlXT1cImlzRG9jSW5FZGl0TW9kZVwiXG4gICAgICAgIFtkb2N1bWVudENvbnRlbnRdPVwiZG9jdW1lbnRDb250ZW50XCJcbiAgICAgICAgW2NvbnZlcnNhdGlvbklkXT1cImNvbnZlcnNhdGlvbklkXCJcbiAgICAgICAgW2JvdElkXT1cImJvdElkXCJcbiAgICAgID48L2xpYi1ib3QtaHRtbC1lZGl0b3I+XG4gICAgPC9tYXQtZHJhd2VyLWNvbnRlbnQ+XG4gIDwvbWF0LWRyYXdlcj5cbjwvbWF0LWRyYXdlci1jb250YWluZXI+XG5cbjxkaXYgKm5nSWY9XCJzaG93V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzXCIgY2xhc3M9XCJtb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjbG9zZS13cmFwcGVyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImNsb3NlX3BvcFwiIChjbGljayk9XCJjbG9zZU1vZGFsKClcIj4mdGltZXM7PC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVNlY3Rpb25cIj5cbiAgICAgIDwhLS0gV29ya2Zsb3cgVGl0bGUgLS0+XG4gICAgICA8aDI+e3sgd29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLldvcmtmbG93TmFtZSB9fTwvaDI+XG4gICAgICA8IS0tIFdvcmtmbG93IFRpdGxlIC0tPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gSW5wdXRzIFNlY3Rpb24gLS0+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0cy1zZWN0aW9uXCI+XG4gICAgICA8aDM+SW5wdXRzPC9oMz5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGlucHV0IG9mIG9iamVjdFRvQXJyYXkod29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLklucHV0cylcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgaW5wdXQua2V5IH19OiB7eyBpbnB1dC52YWx1ZSB9fVxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQWN0aW9ucyBTZWN0aW9uIChEaXNwbGF5ZWQgYXMgVGltZWxpbmUpIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLXNlY3Rpb25cIj5cbiAgICAgIDxoMz5BZ2VudCBBY3Rpb25zPC9oMz5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lbGluZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiB3b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMuQWN0aW9uc1wiXG4gICAgICAgICAgY2xhc3M9XCJ0aW1lbGluZS1pdGVtXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lc3RhbXAtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGg0Pnt7IGFjdGlvbi5BY3Rpb25OYW1lIHx8IGFjdGlvbi5OYW1lIH19PC9oND5cbiAgICAgICAgICAgIDxwPjxzdHJvbmc+PC9zdHJvbmc+IHt7IGFjdGlvbi5JbnNlcnRUaW1lU3RhbXAgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAgW2lubmVySFRNTF09XCJwcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoYWN0aW9uLk91dHB1dClcIj48L3A+XG4gICAgICAgICAgPCEtLSA8cHJlPnt7IGFjdGlvbi5PdXRwdXQgfX08L3ByZT4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEluc2VydCBUaW1lc3RhbXAgLS0+XG4gICAgPGRpdiBjbGFzcz1cInRpbWVzdGFtcC1zZWN0aW9uXCI+XG4gICAgICA8cD5cbiAgICAgICAgPHN0cm9uZz5JbnNlcnRlZCBBdDo8L3N0cm9uZz5cbiAgICAgICAge3sgd29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkluc2VydFRpbWVTdGFtcCB9fVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
3843
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1kcmF3ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaGl2ZWdwdC9ldmVudHNncHQtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC1kcmF3ZXIvY2hhdC1kcmF3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUcvRCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUVaLFFBQVEsRUFDUixLQUFLLEVBSUwsTUFBTSxFQUlOLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBYSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUNMLGVBQWUsRUFDZixnQkFBZ0IsR0FDakIsTUFBTSxtQ0FBbUMsQ0FBQztBQUkzQyxPQUFPLEVBQWUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx3Q0FBd0MsQ0FBQztBQUVwRSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxPQUFP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QXhCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBS0csU0FBUztzQkFBbEIsTUFBTTtnQkFLRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi90cmFuc2xhdGlvbnMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREcmF3ZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQbGF0Zm9ybVRva2VuUmVmcmVzaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wbGF0Zm9ybS10b2tlbi1yZWZyZXNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgZm9ybWF0Tm93LCBmb3JtYXRUaW1lU3RhbXBzIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGV2X2Vudmlyb25tZW50LFxuICBwcm9kX2Vudmlyb25tZW50LFxufSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uU2VydmljZSB9IGZyb20gJy4uL2NvbnZlcnNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgKiBhcyBTcGVlY2hTREsgZnJvbSAnbWljcm9zb2Z0LWNvZ25pdGl2ZXNlcnZpY2VzLXNwZWVjaC1zZGsnO1xuaW1wb3J0IHsgQm90c1NlcnZpY2UgfSBmcm9tICcuLi9ib3Quc2VydmljZSc7XG5pbXBvcnQgKiBhcyBtYXJrZWQgZnJvbSAnbWFya2VkJztcbmltcG9ydCB7IFZvaWNlQWdlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vdm9pY2UtYWdlbnQvc2VydmljZXMvdm9pY2UtYWdlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBWb2ljZUFnZW50TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi92b2ljZS1hZ2VudC9jb21wb25lbnRzL3ZvaWNlLWFnZW50LW1vZGFsL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBWT0lDRV9NT0RBTF9DT05GSUcsXG4gIFZPSUNFX01PREFMX0NMT1NFX0NBTExCQUNLLFxuICBWb2ljZU1vZGFsQ29uZmlnLFxufSBmcm9tICcuLi92b2ljZS1hZ2VudC92b2ljZS1tb2RhbC10b2tlbnMnO1xuXG5leHBvcnQgZW51bSBlQ2xhc3NpZmljYXRpb25UeXBlIHtcbiAgTGl2ZSA9ICc2MDQwZGNlNTc2MTVmMDc3MGFmMTQyNTYnLFxuICBPbkRlbWFuZCA9ICc2MDQwZGNlNTc2MTVmMDc3MGFmMTQyNTcnLFxuICBCcmVha291dCA9ICc2MDQwZGNlNTc2MTVmMDc3MGFmMTQyNTgnLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LWNoYXQtZHJhd2VyLXBhY2thZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LWRyYXdlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdjaGF0TWFpbicpIHByaXZhdGUgY2hhdE1haW46IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ215SW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgbXlJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47IC8vIFJlZmVyZW5jZSB0byB0aGUgdGV4dGFyZWFcbiAgQFZpZXdDaGlsZHJlbignY2xvc2VwbGF5Z3JvdW5kYnV0dG9uJylcbiAgY2xvc2VQbGF5Z3JvdW5kQnV0dG9uczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkKCdkcmF3ZXInKSBkcmF3ZXIhOiBNYXREcmF3ZXI7XG4gIEBWaWV3Q2hpbGQoJ3NvdXJjZXNEcmF3ZXInKSBzb3VyY2VzRHJhd2VyITogTWF0RHJhd2VyO1xuICBAVmlld0NoaWxkKCdlZGl0b3JzRHJhd2VyJykgZWRpdG9yc0RyYXdlciE6IE1hdERyYXdlcjtcbiAgcHJpdmF0ZSBib2R5T3ZlcmZsb3dDbGFzcyA9ICdib2R5LW92ZXJmbG93LWhpZGRlbic7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBpc0NvbGxhcHNlZFRydWUgPSBmYWxzZTtcbiAgQElucHV0KCkgY29waWxvdE5hbWU6IHN0cmluZyA9ICdIaXZlWEdQVCc7XG4gIEBJbnB1dCgpIGZpcnN0TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgbGFzdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaUtleSE6IHN0cmluZztcbiAgQElucHV0KCkgYmdCdWJibGVBaSE6IHN0cmluZztcbiAgQElucHV0KCkgYmdCdWJibGVVc2VyITogc3RyaW5nO1xuICBASW5wdXQoKSBiZ0dyYWRpZW50ITogc3RyaW5nW107XG4gIEBJbnB1dCgpIGJvdE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJvdFNraWxscyE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG9yZ0lkITogc3RyaW5nO1xuICBASW5wdXQoKSBjbG9zZUJ1dHRvbkNvbG9yITogc3RyaW5nO1xuICBASW5wdXQoKSBjbG9zZUJ1dHRvbmJnQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNyZWRlbnRpYWxzITogW107XG4gIEBJbnB1dCgpIGRhdGVUaW1lQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRhdGVUZXh0Q29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGV2ZW50SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGV2ZW50VXJsITogc3RyaW5nO1xuICBASW5wdXQoKSBldmVudFRva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSB3b3Jrc3BhY2VUb2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgczI3VG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGV2ZW50TmFtZSE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWNvbiE6IHN0cmluZztcbiAgcmVhZG9ubHkgZGlzcGxheUF2YXRhclVybCA9XG4gICAgJ2h0dHBzOi8vd3d3LmpvdGZvcm0uY29tL3VwbG9hZHMvbWVobWV0a2FyYWthc2xpL2Zvcm1fZmlsZXMvMTU2NDU5MzY2NzY3NmE4ZTg1ZjIzNzU4Ljg2OTQ1NTM3X2ljb24ucG5nJztcbiAgLyoqIFVzZXIgcHJvZmlsZSBpbWFnZSBVUkwuIEZhbGxzIGJhY2sgdG8gaW5pdGlhbHMgKGdldFVzZXJJZEluaXRpYWxzKCkpIGlmIG5vdCBzZXQuICovXG4gIEBJbnB1dCgpIHVzZXJBdmF0YXJVcmw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZEJnQ29sb3IhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZvcm1GaWVsZFRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgZnVsbFZpZXchOiBib29sZWFuO1xuICBASW5wdXQoKSBncmFkaWVudENvbG9ycyE6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBncmVldGluZyE6IHN0cmluZztcbiAgQElucHV0KCkgbWVzc2FnZVRleHRDb2xvckFpITogc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlVGV4dENvbG9yVXNlciE6IHN0cmluZztcbiAgQElucHV0KCkgcnVsZXMhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbmRCdXR0b25Db2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgc2VuZEJ1dHRvblRleHRDb2xvciE6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0Nsb3NlITogYm9vbGVhbjtcbiAgQElucHV0KCkgdGh1bWJzRG93bk1lc3NhZ2VzITogc3RyaW5nW107XG4gIEBJbnB1dCgpIHRodW1ic1VwTWVzc2FnZSE6IHN0cmluZztcbiAgLyoqIFVzZXIncyBzZWxlY3RlZCB0aW1lem9uZSAoZS5nLiAnQW1lcmljYS9OZXdfWW9yaycpOyB1c2VkIGZvciB0aW1lc3RhbXBzIGFuZCBzZXNzaW9uIGNhcmQgdGltZXMuIFdoZW4gbm90IHNldCwgc2Vzc2lvbiBkYXRhIG9yIGxvY2FsIHRpbWUgaXMgdXNlZC4gKi9cbiAgQElucHV0KCkgdGltZXpvbmU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVua25vd25SZXNwb25zZXMhOiBbXTtcbiAgQElucHV0KCkgdXNlT3BlbkFpITogYm9vbGVhbjtcbiAgQElucHV0KCkgdXNlcklkITogc3RyaW5nO1xuICBASW5wdXQoKSBpc0RldiE6IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIGNoYXQgYXV0by1zY3JvbGxzIHRvIGJvdHRvbSB3aGVuIG5ldyBjb250ZW50IGlzIGFkZGVkLiBEZWZhdWx0OiBmYWxzZSAobm8gYXV0byBzY3JvbGwpLiAqL1xuICBASW5wdXQoKSBhdXRvU2Nyb2xsT25OZXdNZXNzYWdlOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBUcmFja3Mgd2hldGhlciB0aGUgdXNlciBoYXMgbWFudWFsbHkgc2Nyb2xsZWQgdXAsIHN1cHByZXNzaW5nIGF1dG8tc2Nyb2xsIHVudGlsIHRoZXkgc2Nyb2xsIGJhY2sgdG8gYm90dG9tIG9yIHNlbmQgYSBuZXcgbWVzc2FnZS4gKi9cbiAgcHJpdmF0ZSB1c2VySGFzU2Nyb2xsZWQgPSBmYWxzZTtcbiAgLyoqIEd1YXJkcyBhZ2FpbnN0IG91ciBvd24gcHJvZ3JhbW1hdGljIHNjcm9sbHMgdHJpZ2dlcmluZyB0aGUgdXNlckhhc1Njcm9sbGVkIGRldGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBpc1Byb2dyYW1tYXRpY1Njcm9sbCA9IGZhbHNlO1xuICBwcml2YXRlIHNjcm9sbExpc3RlbmVyVGltZXI6IGFueSA9IG51bGw7XG4gIC8qKiBPcHRpb25hbCBBUEkgYmFzZSBVUkwgKGUuZy4gbmdyb2sgdHVubmVsKS4gV2hlbiBzZXQsIGFsbCBjaGF0L3ZvaWNlIHJlcXVlc3RzIHVzZSB0aGlzIGluc3RlYWQgb2YgZGV2L3Byb2QgZGVmYXVsdC4gKi9cbiAgQElucHV0KCkgYmFzZVVybD86IHN0cmluZztcbiAgLyoqIENvbm5lY3Rpb25zIGxpc3QgZnJvbSBob3N0IChlLmcuIGZyb20gc3RvcmUgc2VsZWN0Q29ubmVjdGlvbnNMaXN0KS4gRWFjaCBpdGVtIGhhcyB1c2VySWQuIFdoZW4gc2V0LCB1c2VkIGZvciBDb25uZWN0L1JlcXVlc3QgU2VudC9EaXNjb25uZWN0IGJ1dHRvbiBzdGF0ZS4gKi9cbiAgQElucHV0KCkgY29ubmVjdGlvbnNMaXN0OiBhbnlbXSA9IFtdO1xuICAvKiogUGVuZGluZyBzZW50IHJlcXVlc3QgdXNlciBJRHMgZnJvbSBob3N0IChlLmcuIGZyb20gc3RvcmUgc2VsZWN0UGVuZGluZ0Nvbm5lY3Rpb25zU2VudExpc3QpLiBXaGVuIHNldCwgdXNlZCBmb3IgUmVxdWVzdCBTZW50IHN0YXRlLiAqL1xuICBASW5wdXQoKSBwZW5kaW5nU2VudFJlcXVlc3RVc2VySWRzOiBhbnlbXSA9IFtdO1xuICAvKiogV2hldGhlciB0byBzaG93IENvbm5lY3QgLyBSZXF1ZXN0IFNlbnQgLyBEaXNjb25uZWN0IGJ1dHRvbnMgb24gYXR0ZW5kZWUgY2FyZHMgKGUuZy4gZnJvbSB1c2VyU2V0dGluZ3M/LmlzQ29ubmVjdGlvbnNFbmFibGVkKS4gKi9cbiAgQElucHV0KCkgaXNDb25uZWN0aW9uc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChVTi9DT1AgZXZlbnRzKTogc2Vzc2lvbiBjYXJkIHNob3dzIFwiU2Vzc2lvbiB0eXBlXCIgbGFiZWwgYW5kIEpvaW4vV2F0Y2ggYnV0dG9ucy4gV2hlbiBmYWxzZTogc2hvd3MgXCJNZWV0aW5nIHR5cGVcIiBsYWJlbCBhbmQgc2luZ2xlIFBsYXkgYnV0dG9uIChzYW1lIGFzIHRlbXBsYXRlMikuICovXG4gIEBJbnB1dCgpIGlzVW5FdmVudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGFnYWluQnV0dG9uQ29sb3IhOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgYWdhaW5CdXR0b25UZXh0Q29sb3IhOiBzdHJpbmdbXTtcbiAgQE91dHB1dCgpIGZlZWRiYWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9uQ2xvc2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9wZW5QYWdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzZXNzaW9uQWN0aW9ucyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIEpvaW4vV2F0Y2ggYnV0IGFjdGlvbiBpcyBub3QgeWV0IGF2YWlsYWJsZSAoZS5nLiBzZXNzaW9uIG5vdCBzdGFydGVkKS4gSG9zdCBjYW4gc2hvdyB0b2FzdGVyIHdpdGggdGhlIG1lc3NhZ2UuICovXG4gIEBPdXRwdXQoKSBzZXNzaW9uQWN0aW9uQmxvY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2xvc2VCb3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGNvbm5lY3RXaXRoVXNlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHVzZXIgY2xpY2tzIFZpZXcgcHJvZmlsZSBvbiBhIHNwZWFrZXIgY2FyZCAoZ2V0X2V2ZW50X3NwZWFrZXJzKS4gSG9zdCBzaG91bGQgb3BlbiBzcGVha2VyIGRldGFpbCBkcmF3ZXIgc2FtZSBhcyAvZXZlbnRzLzppZC9zcGVha2Vycy4gKi9cbiAgQE91dHB1dCgpIHZpZXdTcGVha2VyUHJvZmlsZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHNwZWFrZXI6IGFueTtcbiAgICBzcGVha2VyczogYW55W107XG4gIH0+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdXNlciBjbGlja3MgVmlldyBCb290aCBvbiBhIHNwb25zb3IvYm9vdGggY2FyZCAoZ2V0X2V2ZW50X3Nwb25zb3JzLCBnZXRfZXZlbnRfYm9vdGhzKS4gSG9zdCBzaG91bGQgbmF2aWdhdGUgdG8gZXZlbnRzLzpldmVudFVybC9zcG9uc29ycy9ib290aHMvOmJvb3RoVXJsLiAqL1xuICBAT3V0cHV0KCkgdmlld0Jvb3RoID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgYm9vdGhJZD86IHN0cmluZztcbiAgICBib290aFVybD86IHN0cmluZztcbiAgICBzcG9uc29yPzogYW55O1xuICB9PigpO1xuICBAT3V0cHV0KCkgc2NoZWR1bGVNZWV0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByZWZyZXNoVG9rZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqIEVtaXR0ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGB1c2VyL3Rva2VuUmVmcmVzaGAgc28gdGhlIGhvc3QgY2FuIGRpc3BhdGNoIExvZ2luIC8gYHNhdmVUb2tlbkFuZExvZ2luVXNlcmAuICovXG4gIEBPdXRwdXQoKSB0b2tlbnNSZWZyZXNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9wZW5TdXBwb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgYXV0b2dlbktleSA9ICdBdXRvZ2VuX2VESlR0RVUtTkIwUnRJcHpxMXcnO1xuICBhZGRUb015QWdlbmRhQWN0aW9uID0gJ2FkZF90b19teV9hZ2VuZGEnO1xuICBteVVwY29taW5nU2Vzc2lvbkFjdGlvbiA9ICdteV91cGNvbWluZ19zZXNzaW9uJztcbiAgY29ubmVjdE9yRm9sbG93QWN0aW9uID0gJ2Nvbm5lY3Rfb3JfZm9sbG93JztcbiAgYWlSZXNwb25zZTogc3RyaW5nID0gJyc7XG4gIGNoYXRMb2c6IGFueVtdID0gW107XG4gIGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgZmVlZGJhY2tEb25lOiBib29sZWFuID0gZmFsc2U7XG4gIGdyZWV0aW5nTXNnOiBzdHJpbmcgPSAnJztcbiAgaGFzQmFja2Ryb3BWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpbnB1dDogc3RyaW5nID0gJyc7XG4gIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTtcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBtb2RlOiBzdHJpbmcgPSAnb3Zlcic7XG4gIHF1aWNrUHJvbXB0czogYW55W10gPSBbXTtcbiAgdGh1bWJzRG93bk1zZ0luZGV4ID0gMDtcbiAgdXNlck5hbWU6IHN0cmluZyA9ICcnO1xuICBzaG93U3RhcnRBZ2FpbjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0lPU0RldmljZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93RmVlZEJhY2tJY29uc0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgdGVtcGVyYXR1cmU6IG51bWJlciA9IDE7XG4gIC8qKiBTcGVha2VyIGNhY2hlIGJ5IHN0YWZmIGlkIChmaWxsZWQgdmlhIGdldC1ieS1zdGFmZi1pZHMpLiAqL1xuICBzcGVha2VyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAvKiogUHJldmVudCBkdXBsaWNhdGUgc3BlYWtlciBmZXRjaGVzIGFjcm9zcyBtZXNzYWdlcy4gKi9cbiAgcHJpdmF0ZSByZXF1ZXN0ZWRTcGVha2VySWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGVudmlyb25tZW50OiB7XG4gICAgVVNFUlNfQVBJO1xuICAgIEJBU0VfVVJMO1xuICAgIEFHRU5UU19BUEk7XG4gIH07XG4gIHBlbmRpbmdSZXF1ZXN0czogYW55O1xuICBteUNvbm5lY3Rpb25zOiBhbnk7XG4gIGNvbnZlcnNhdGlvbktleTogc3RyaW5nO1xuICBjb25TZXNzaW9uS2V5OiBzdHJpbmcgPSAnJztcbiAgaXNGZXRjaERhdGFGb3I6IGJvb2xlYW47XG4gIGlzNDAxOiBib29sZWFuO1xuICBtc2c6IGFueTtcbiAgY2hhdDogYW55O1xuICBpc1dvcmtmbG93T3BlbjogYm9vbGVhbjtcbiAgb3JnV29ya2Zsb3dzOiBhbnk7XG4gIG9wZW5Xb3JrZmxvd0lucHV0OiBib29sZWFuO1xuICBzZWxlY3RlZFdvcmtmbG93OiBhbnk7XG4gIHdvcmtmbG93Rm9ybTogYW55O1xuICBjdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzczogbnVtYmVyID0gMDtcbiAgY3VycmVudFdvcmtmbG93QWN0aW9uOiBzdHJpbmcgPSAnJztcbiAgZXhlY3V0aW5nV29ya2Zsb3c6IGJvb2xlYW47XG4gIHdvcmtmbG93RXhlY3V0aW9uRGV0YWlsczogYW55O1xuICBzaG93V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzOiBhbnk7XG4gIGN1cnJlbnRXb3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM6IGFueTtcblxuICBzcGVlY2hDb25maWc6IFNwZWVjaFNESy5TcGVlY2hDb25maWc7XG4gIHJlY29nbml6ZXI6IFNwZWVjaFNESy5TcGVlY2hSZWNvZ25pemVyO1xuICByZWNvZ25pemVkVGV4dDogc3RyaW5nID0gJyc7XG4gIGF1dGhvcml6YXRpb25Ub2tlbjogc3RyaW5nID0gJyc7XG4gIHJlZ2lvbjogc3RyaW5nID0gJ3dlc3RldXJvcGUnOyAvLyBTZXQgeW91ciBBenVyZSByZWdpb24gaGVyZVxuICBpc1JlY29yZGluZzogYm9vbGVhbjtcbiAgaXNWb2ljZU1vZGFsT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHZvaWNlTW9kYWxPdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdm9pY2VUcmFuc2NyaXB0U3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGJvdFNlcnZpY2U6IEJvdHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgY29udmVyc2F0aW9uU2VydmljZTogQ29udmVyc2F0aW9uU2VydmljZSwgLy8gcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm1cbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgdm9pY2VBZ2VudFNlcnZpY2U6IFZvaWNlQWdlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybVRva2VuUmVmcmVzaDogUGxhdGZvcm1Ub2tlblJlZnJlc2hTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLmNoYXRNYWluID0gbmV3IEVsZW1lbnRSZWYobnVsbCk7XG5cbiAgICAvLyBpZiAodGhpcy5wbGF0Zm9ybS5JT1MpIHtcbiAgICAvLyAgIHRoaXMuaXNJT1NEZXZpY2UgPSB0cnVlO1xuICAgIC8vIH1cbiAgfVxuICBnZXRUcmFuc2xhdGlvbihrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5nZXRUcmFuc2xhdGlvbihrZXkpO1xuICB9XG5cbiAgLyoqIFRpbWUgc2hvd24gbmV4dCB0byBcIkFzc2lzdGFudFwiIHdoZW4gaW4gdGhpbmtpbmcvbG9hZGluZyBzdGF0ZS4gKi9cbiAgZ2V0TG9hZGluZ1RpbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpO1xuICB9XG5cbiAgLyoqIFVzZXIgaW5pdGlhbHMgZm9yIGF2YXRhciBmYWxsYmFjayAoZS5nLiBcIkpEXCIgZnJvbSBmaXJzdE5hbWUgKyBsYXN0TmFtZSkuICovXG4gIGdldFVzZXJJZEluaXRpYWxzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlyc3QgPSAodGhpcy5maXJzdE5hbWUgfHwgJycpLnRyaW0oKTtcbiAgICBjb25zdCBsYXN0ID0gKHRoaXMubGFzdE5hbWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoZmlyc3QgJiYgbGFzdCkgcmV0dXJuIChmaXJzdFswXSArIGxhc3RbMF0pLnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGZpcnN0KSByZXR1cm4gZmlyc3Quc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKTtcbiAgICBpZiAobGFzdCkgcmV0dXJuIGxhc3Quc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKTtcbiAgICByZXR1cm4gJ1UnO1xuICB9XG5cbiAgLyoqIEF0dGVuZGVlIGluaXRpYWxzIGZvciBjYXJkIHdoZW4gbm8gcGhvdG8gKGUuZy4gXCJWaWpheSBQYWxpd2FsXCIgLT4gXCJWUFwiLCBcIkppbVwiIC0+IFwiSlwiKS4gKi9cbiAgZ2V0QXR0ZW5kZWVJbml0aWFscyhuYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSByZXR1cm4gJz8nO1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKVxuICAgICAgcmV0dXJuIChwYXJ0c1swXVswXSArIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdWzBdKS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHJldHVybiBwYXJ0c1swXS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpO1xuICAgIHJldHVybiAnPyc7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gSGFuZGxlIGV2ZW50SWQgY2hhbmdlcyB0byB1cGRhdGUgdHJhbnNsYXRpb24gc2VydmljZVxuICAgIGlmIChjaGFuZ2VzLmV2ZW50SWQgJiYgY2hhbmdlcy5ldmVudElkLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0RXZlbnRJZChjaGFuZ2VzLmV2ZW50SWQuY3VycmVudFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5zMjdUb2tlbikge1xuICAgICAgaWYgKGNoYW5nZXMuczI3VG9rZW4uY3VycmVudFZhbHVlICE9IGNoYW5nZXMuczI3VG9rZW4ucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICB0aGlzLnMyN1Rva2VuID0gY2hhbmdlcy5zMjdUb2tlbi5jdXJyZW50VmFsdWU7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2lzRmV0Y2hEYXRhRm9yOiAnLCB0aGlzLmlzRmV0Y2hEYXRhRm9yKTtcbiAgICAgICAgY29uc29sZS5sb2coJ21zZzogJywgdGhpcy5tc2cpO1xuICAgICAgICBjb25zb2xlLmxvZygnY2hhdDogJywgdGhpcy5jaGF0KTtcbiAgICAgICAgaWYgKHRoaXMuaXM0MDEpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0ZldGNoRGF0YUZvcikge1xuICAgICAgICAgICAgdGhpcy5mZXRjaERhdGFGb3IodGhpcy5tc2csIHRoaXMuY2hhdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hEYXRhKHRoaXMubXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5iYXNlVXJsICYmIHRoaXMuZW52aXJvbm1lbnQpIHtcbiAgICAgIHRoaXMuYXBwbHlCYXNlVXJsT3ZlcnJpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hlbiBiYXNlVXJsIGlucHV0IGlzIHNldCwgb3ZlcnJpZGUgZW52aXJvbm1lbnQuQkFTRV9VUkwgc28gYWxsIGNoYXQvdm9pY2Ugc2VydmljZXMgdXNlIGl0IChzdXBwb3J0cyBuZ3JvayBldGMuKS4gKi9cbiAgcHJpdmF0ZSBhcHBseUJhc2VVcmxPdmVycmlkZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0RW52ID0gdGhpcy5pc0RldiA/IGRldl9lbnZpcm9ubWVudCA6IHByb2RfZW52aXJvbm1lbnQ7XG4gICAgaWYgKHRoaXMuYmFzZVVybCAmJiB0eXBlb2YgdGhpcy5iYXNlVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlVXJsLnRyaW0oKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHsgLi4uZGVmYXVsdEVudiwgQkFTRV9VUkw6IHVybCB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBkZWZhdWx0RW52O1xuICB9XG5cbiAgZG9tYWluQXV0aG9yaXR5VmFsdWU6IGFueSA9ICdwcm9kLWxpdGUnO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNldCB0aGUgZXZlbnRJZCBpbiB0cmFuc2xhdGlvbiBzZXJ2aWNlIHRvIGdldCB0aGUgY29ycmVjdCBsYW5ndWFnZSBmcm9tIGxvY2FsU3RvcmFnZVxuICAgIGlmICh0aGlzLmV2ZW50SWQpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldEV2ZW50SWQodGhpcy5ldmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5QmFzZVVybE92ZXJyaWRlKCk7XG5cbiAgICBjb25zdCBkb21haW4gPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIGhlYWRlciB2YWx1ZSBiYXNlZCBvbiB0aGUgZG9tYWluXG5cbiAgICBpZiAoZG9tYWluLmluY2x1ZGVzKCdwcmUtYXBwLnNvY2lhbDI3LmNvbScpKSB7XG4gICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlID0gJ3ByZS1wcm9kLWxpdGUnO1xuICAgIH0gZWxzZSBpZiAoZG9tYWluLmluY2x1ZGVzKCdhcHAuc29jaWFsMjcuY29tJykpIHtcbiAgICAgIHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUgPSAncHJvZC1saXRlJztcbiAgICB9IGVsc2UgaWYgKGRvbWFpbi5pbmNsdWRlcygnaGl2ZWdwdC5pbycpKSB7XG4gICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlID0gJ2hpdmVncHQnO1xuICAgIH1cblxuICAgIC8vIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKCk7XG4gICAgLy8gdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5jaGFuZ2VUZW1wZXJhdHVyZSh0aGlzLnRlbXBlcmF0dXJlKTtcbiAgICB0aGlzLmZldGNoQm90Q29uZmlnKCkuc3Vic2NyaWJlKFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLmZldGNoQ2hhdEhpc3RvcnkoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubWFwQ2hhdEhpc3RvcnkocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBjaGF0IGhpc3Rvcnk6JywgZXJyKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5OicsIGVycik7XG4gICAgICB9LFxuICAgICk7XG4gICAgLy8gdGhpcy5mZXRjaEFnZW50cygpO1xuICAgIC8vIHRoaXMuZmV0Y2hFZGl0b3JDb250ZW50KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5ib3RTZXJ2aWNlXG4gICAgICAuZmV0Y2hTcGVlY2hBdXRob3JpemF0aW9uVG9rZW4oXG4gICAgICAgIHRoaXMuYm90SWQsXG4gICAgICAgIHRoaXMuYXBpS2V5LFxuICAgICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodG9rZW4pID0+IHtcbiAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplU3BlZWNoUmVjb2duaXplcih0b2tlbik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBOYXRpdmUgV2ViU29ja2V0IHVzZWQgYnkgYC9hc2stbmV3YCBjaGF0IGZsb3cuICovXG4gIHByaXZhdGUgYXNrV2ViU29ja2V0OiBXZWJTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhc2tXZWJTb2NrZXRDb25uZWN0aW9uS2V5ID0gJyc7XG4gIHByaXZhdGUgYWN0aXZlQXNrTWVzc2FnZUlkID0gJyc7XG5cbiAgLyoqIEluaXRpYWwgbnVtYmVyIG9mIHNlc3Npb24vYXR0ZW5kZWUgY2FyZHMgc2hvd24gYmVmb3JlIFwiU2hvdyBYIG1vcmVcIi4gKi9cbiAgcmVhZG9ubHkgU0VTU0lPTl9DQVJEU19JTklUSUFMID0gNjtcbiAgcmVhZG9ubHkgQVRURU5ERUVfQ0FSRFNfSU5JVElBTCA9IDk7XG4gIHJlYWRvbmx5IFNQRUFLRVJfQ0FSRFNfSU5JVElBTCA9IDk7XG4gIHJlYWRvbmx5IFNQT05TT1JfQ0FSRFNfSU5JVElBTCA9IDk7XG4gIHJlYWRvbmx5IEJPT1RIX1JFUF9DQVJEU19JTklUSUFMID0gOTtcbiAgLyoqIE1lc3NhZ2UgaWQgLT4gdHJ1ZSB3aGVuIHVzZXIgZXhwYW5kZWQgXCJTaG93IG1vcmVcIiBmb3Igc2Vzc2lvbnMvYXR0ZW5kZWVzLiAqL1xuICBleHBhbmRlZFNlc3Npb25DYXJkSWRzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICBleHBhbmRlZEF0dGVuZGVlQ2FyZElkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgZXhwYW5kZWRTcGVha2VyQ2FyZElkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgZXhwYW5kZWRTcG9uc29yQ2FyZElkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgZXhwYW5kZWRCb290aFJlcENhcmRJZHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIC8qKiBrZXk6IGAke21lc3NhZ2VJZH06JHthdHRlbmRlZUlkfWAgLT4gdHJ1ZSB3aGVuIGRlc2NyaXB0aW9uIGV4cGFuZGVkICovXG4gIGV4cGFuZGVkQXR0ZW5kZWVEZXNjcmlwdGlvbklkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgLyoqIGtleTogYCR7bWVzc2FnZUlkfToke2F0dGVuZGVlSWR9YCAtPiB0cnVlIHdoZW4gdmlkZW8gaXMgcGxheWluZyAqL1xuICBhdHRlbmRlZVZpZGVvUGxheWluZ0lkczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgLyoqIGtleTogYCR7bWVzc2FnZUlkfToke2F0dGVuZGVlSWR9YCAtPiB0cnVlIHdoZW4gdmlkZW8gaXMgbXV0ZWQgKGRlZmF1bHQgdHJ1ZSkgKi9cbiAgYXR0ZW5kZWVWaWRlb011dGVkSWRzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gIC8qKiBTdHJpcCBIVE1MIHRhZ3MgdG8gcGxhaW4gdGV4dCAoZS5nLiBmb3Igc3BlYWtlci9hdHRlbmRlZSBkZXNjcmlwdGlvbiBmcm9tIEFQSSkuICovXG4gIHN0cmlwSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaHRtbCB8fCB0eXBlb2YgaHRtbCAhPT0gJ3N0cmluZycpIHJldHVybiAnJztcbiAgICBjb25zdCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCB0ZXh0ID0gZG9jLmJvZHk/LnRleHRDb250ZW50ID8/ICcnO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG4gIH1cblxuICBnZXRBdHRlbmRlZURlc2NyaXB0aW9uKGF0dGVuZGVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJhdyA9XG4gICAgICBhdHRlbmRlZT8uZGVzY3JpcHRpb24gPz8gYXR0ZW5kZWU/LmludGVyZXN0cyA/PyBhdHRlbmRlZT8uam9iVGl0bGUgPz8gJyc7XG4gICAgY29uc3Qgc3RyID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyByYXcudHJpbSgpIDogU3RyaW5nKHJhdyA/PyAnJykudHJpbSgpO1xuICAgIC8vIElmIGl0IGxvb2tzIGxpa2UgSFRNTCwgc3RyaXAgdGFncyBzbyBjYXJkIHNob3dzIHBsYWluIHRleHRcbiAgICBpZiAoc3RyICYmIC88W2Etel1bXFxzXFxTXSo+L2kudGVzdChzdHIpKSByZXR1cm4gdGhpcy5zdHJpcEh0bWwoc3RyKTtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLyoqXG4gICAqIEJvb3RoIHJlcHMgYWxyZWFkeSByZW5kZXIgam9iVGl0bGUgaW4gaXRzIG93biBsaW5lO1xuICAgKiBkbyBub3QgZmFsbGJhY2sgdG8gam9iVGl0bGUgYWdhaW4gaW4gdGhlIGRlc2NyaXB0aW9uIGJsb2NrLlxuICAgKi9cbiAgZ2V0Qm9vdGhSZXBEZXNjcmlwdGlvbihyZXA6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmF3ID0gcmVwPy5kZXNjcmlwdGlvbiA/PyByZXA/LmludGVyZXN0cyA/PyAnJztcbiAgICBjb25zdCBzdHIgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyA/IHJhdy50cmltKCkgOiBTdHJpbmcocmF3ID8/ICcnKS50cmltKCk7XG4gICAgaWYgKHN0ciAmJiAvPFthLXpdW1xcc1xcU10qPi9pLnRlc3Qoc3RyKSkgcmV0dXJuIHRoaXMuc3RyaXBIdG1sKHN0cik7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHNob3VsZFNob3dBdHRlbmRlZVJlYWRNb3JlKGF0dGVuZGVlOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyBoZXVyaXN0aWM6IG9ubHkgc2hvdyB0b2dnbGUgZm9yIHJlYXNvbmFibHkgbG9uZyB0ZXh0XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0ZW5kZWVEZXNjcmlwdGlvbihhdHRlbmRlZSkubGVuZ3RoID4gOTA7XG4gIH1cblxuICBwcml2YXRlIGdldEF0dGVuZGVlRGVzY0tleShjaGF0OiBhbnksIGF0dGVuZGVlOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBtc2dJZCA9IGNoYXQ/Ll9pZDtcbiAgICBjb25zdCBhdHRlbmRlZUlkID0gYXR0ZW5kZWU/LmlkID8/IGF0dGVuZGVlPy5faWQgPz8gYXR0ZW5kZWU/LnVzZXJJZDtcbiAgICBpZiAoIW1zZ0lkIHx8ICFhdHRlbmRlZUlkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYCR7bXNnSWR9OiR7YXR0ZW5kZWVJZH1gO1xuICB9XG5cbiAgaXNBdHRlbmRlZURlc2NyaXB0aW9uRXhwYW5kZWQoY2hhdDogYW55LCBhdHRlbmRlZTogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBdHRlbmRlZURlc2NLZXkoY2hhdCwgYXR0ZW5kZWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZEF0dGVuZGVlRGVzY3JpcHRpb25JZHNba2V5XTtcbiAgfVxuXG4gIHRvZ2dsZUF0dGVuZGVlRGVzY3JpcHRpb24oY2hhdDogYW55LCBhdHRlbmRlZTogYW55LCBldj86IEV2ZW50KTogdm9pZCB7XG4gICAgZXY/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBdHRlbmRlZURlc2NLZXkoY2hhdCwgYXR0ZW5kZWUpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9ICF0aGlzLmV4cGFuZGVkQXR0ZW5kZWVEZXNjcmlwdGlvbklkc1trZXldO1xuICAgIHRoaXMuZXhwYW5kZWRBdHRlbmRlZURlc2NyaXB0aW9uSWRzID0ge1xuICAgICAgLi4udGhpcy5leHBhbmRlZEF0dGVuZGVlRGVzY3JpcHRpb25JZHMsXG4gICAgICBba2V5XTogbmV4dCxcbiAgICB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0QXR0ZW5kZWVWaWRlb1VybChhdHRlbmRlZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmwgPSBhdHRlbmRlZT8udXNlclZpZGVvc01vZGVsPy51cmw7XG4gICAgcmV0dXJuIHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnID8gdXJsLnRyaW0oKSA6ICcnO1xuICB9XG5cbiAgZ2V0QXR0ZW5kZWVWaWRlb1Bvc3RlcihhdHRlbmRlZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3N0ZXIgPSBhdHRlbmRlZT8udXNlclZpZGVvc01vZGVsPy50aHVtYm5haWw7XG4gICAgcmV0dXJuIHR5cGVvZiBwb3N0ZXIgPT09ICdzdHJpbmcnID8gcG9zdGVyLnRyaW0oKSA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHRlbmRlZU1lZGlhS2V5KGNoYXQ6IGFueSwgYXR0ZW5kZWU6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IG1zZ0lkID0gY2hhdD8uX2lkO1xuICAgIGNvbnN0IGF0dGVuZGVlSWQgPSBhdHRlbmRlZT8uaWQgPz8gYXR0ZW5kZWU/Ll9pZCA/PyBhdHRlbmRlZT8udXNlcklkO1xuICAgIGlmICghbXNnSWQgfHwgIWF0dGVuZGVlSWQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBgJHttc2dJZH06JHthdHRlbmRlZUlkfWA7XG4gIH1cblxuICBpc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0OiBhbnksIGF0dGVuZGVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdldEF0dGVuZGVlTWVkaWFLZXkoY2hhdCwgYXR0ZW5kZWUpO1xuICAgIGlmICgha2V5KSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBkZWZhdWx0IHRydWUgKG11dGVkKSB1bmxlc3MgZXhwbGljaXRseSBzZXQgdG8gZmFsc2VcbiAgICByZXR1cm4gdGhpcy5hdHRlbmRlZVZpZGVvTXV0ZWRJZHNba2V5XSAhPT0gZmFsc2U7XG4gIH1cblxuICBpc0F0dGVuZGVlVmlkZW9QbGF5aW5nKGNoYXQ6IGFueSwgYXR0ZW5kZWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXR0ZW5kZWVNZWRpYUtleShjaGF0LCBhdHRlbmRlZSk7XG4gICAgaWYgKCFrZXkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISF0aGlzLmF0dGVuZGVlVmlkZW9QbGF5aW5nSWRzW2tleV07XG4gIH1cblxuICB0b2dnbGVBdHRlbmRlZVZpZGVvTXV0ZShcbiAgICBjaGF0OiBhbnksXG4gICAgYXR0ZW5kZWU6IGFueSxcbiAgICB2aWRlb0VsPzogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwsXG4gICAgZXY/OiBFdmVudCxcbiAgKTogdm9pZCB7XG4gICAgZXY/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBdHRlbmRlZU1lZGlhS2V5KGNoYXQsIGF0dGVuZGVlKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5pc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0LCBhdHRlbmRlZSk7XG4gICAgdGhpcy5hdHRlbmRlZVZpZGVvTXV0ZWRJZHMgPSB7IC4uLnRoaXMuYXR0ZW5kZWVWaWRlb011dGVkSWRzLCBba2V5XTogbmV4dCB9O1xuICAgIGlmICh2aWRlb0VsKSB7XG4gICAgICB2aWRlb0VsLm11dGVkID0gbmV4dDtcbiAgICAgIC8vIFNvbWUgYnJvd3NlcnMgcmVxdWlyZSB2b2x1bWUgdG8gYmUgPjAgd2hlbiB1bm11dGluZ1xuICAgICAgaWYgKCFuZXh0ICYmICh2aWRlb0VsLnZvbHVtZSA9PSBudWxsIHx8IHZpZGVvRWwudm9sdW1lID09PSAwKSkge1xuICAgICAgICB2aWRlb0VsLnZvbHVtZSA9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlQXR0ZW5kZWVWaWRlb1BsYXkoXG4gICAgY2hhdDogYW55LFxuICAgIGF0dGVuZGVlOiBhbnksXG4gICAgdmlkZW9FbD86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsLFxuICAgIGV2PzogRXZlbnQsXG4gICk6IHZvaWQge1xuICAgIGV2Py5zdG9wUHJvcGFnYXRpb24/LigpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXR0ZW5kZWVNZWRpYUtleShjaGF0LCBhdHRlbmRlZSk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gIXRoaXMuaXNBdHRlbmRlZVZpZGVvUGxheWluZyhjaGF0LCBhdHRlbmRlZSk7XG4gICAgdGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkcyA9IHtcbiAgICAgIC4uLnRoaXMuYXR0ZW5kZWVWaWRlb1BsYXlpbmdJZHMsXG4gICAgICBba2V5XTogbmV4dCxcbiAgICB9O1xuICAgIGlmICh2aWRlb0VsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgIGNvbnN0IHAgPSB2aWRlb0VsLnBsYXkoKTtcbiAgICAgICAgICBpZiAocCAmJiB0eXBlb2YgKHAgYXMgYW55KS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHAgYXMgYW55KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIElmIHBsYXkgZmFpbHMsIHJlZmxlY3QgcGF1c2VkIHN0YXRlXG4gICAgICAgICAgICAgIHRoaXMuYXR0ZW5kZWVWaWRlb1BsYXlpbmdJZHMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkcyxcbiAgICAgICAgICAgICAgICBba2V5XTogZmFsc2UsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpZGVvRWwucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQXR0ZW5kZWVWaWRlb1BsYXlTdGF0ZShjaGF0OiBhbnksIGF0dGVuZGVlOiBhbnksIGlzUGxheWluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXR0ZW5kZWVNZWRpYUtleShjaGF0LCBhdHRlbmRlZSk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBpZiAodGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkc1trZXldID09PSBpc1BsYXlpbmcpIHJldHVybjtcbiAgICB0aGlzLmF0dGVuZGVlVmlkZW9QbGF5aW5nSWRzID0ge1xuICAgICAgLi4udGhpcy5hdHRlbmRlZVZpZGVvUGxheWluZ0lkcyxcbiAgICAgIFtrZXldOiBpc1BsYXlpbmcsXG4gICAgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgc2Vzc2lvbiBkYXRlL3RpbWUgZm9yIGRpc3BsYXkuXG4gICAqIEBwYXJhbSBkYXRlVGltZVJhbmdlIFNlc3Npb24gc3RhcnQvZW5kIChvYmplY3Qgd2l0aCBzdGFydC9lbmQgb3Igc3RyaW5nIHdpdGggXCJTdGFydDogLi4uIEVuZDogLi4uXCIpXG4gICAqIEBwYXJhbSBkaXNwbGF5VGltZVpvbmUgT3B0aW9uYWwgdXNlci1zZWxlY3RlZCB0aW1lem9uZSAoZS5nLiAnQW1lcmljYS9OZXdfWW9yaycpOyB3aGVuIHNldCwgdGltZXMgYXJlIHNob3duIGluIHRoaXMgem9uZS5cbiAgICovXG4gIGZvcm1hdFNlc3Npb25XaGVuKFxuICAgIGRhdGVUaW1lUmFuZ2U6IHN0cmluZyB8IHsgc3RhcnQ/OiBzdHJpbmc7IGVuZD86IHN0cmluZyB9IHwgbnVsbCxcbiAgICBkaXNwbGF5VGltZVpvbmU/OiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9jYWxlT3B0cyA9IGRpc3BsYXlUaW1lWm9uZSA/IHsgdGltZVpvbmU6IGRpc3BsYXlUaW1lWm9uZSB9IDoge307XG4gICAgaWYgKCFkYXRlVGltZVJhbmdlKSByZXR1cm4gJyc7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGVUaW1lUmFuZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICBkYXRlVGltZVJhbmdlPy5zdGFydCAmJlxuICAgICAgZGF0ZVRpbWVSYW5nZT8uZW5kXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGFydER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5lbmQpO1xuICAgICAgICBjb25zdCBkYXRlRm9ybWF0dGVkID0gc3RhcnREdC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gc3RhcnREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICAgIC4uLmxvY2FsZU9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gZW5kRHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgaG91cjEyOiBmYWxzZSxcbiAgICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGAke2RhdGVGb3JtYXR0ZWR9IHwgJHtzdGFydFRpbWV9IC0gJHtlbmRUaW1lfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGVUaW1lUmFuZ2UgIT09ICdzdHJpbmcnKSByZXR1cm4gJyc7XG4gICAgY29uc3Qgc3RhcnRNYXRjaCA9IGRhdGVUaW1lUmFuZ2UubWF0Y2goXG4gICAgICAvU3RhcnQ6XFxzKihcXGR7NH0tXFxkezJ9LVxcZHsyfVxccytcXGR7Mn06XFxkezJ9OlxcZHsyfSkvLFxuICAgICk7XG4gICAgY29uc3QgZW5kTWF0Y2ggPSBkYXRlVGltZVJhbmdlLm1hdGNoKFxuICAgICAgL0VuZDpcXHMqKFxcZHs0fS1cXGR7Mn0tXFxkezJ9XFxzK1xcZHsyfTpcXGR7Mn06XFxkezJ9KS8sXG4gICAgKTtcbiAgICBpZiAoIXN0YXJ0TWF0Y2ggfHwgIWVuZE1hdGNoKSByZXR1cm4gZGF0ZVRpbWVSYW5nZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTdHIgPSBzdGFydE1hdGNoWzFdO1xuICAgICAgY29uc3QgZW5kU3RyID0gZW5kTWF0Y2hbMV07XG4gICAgICBjb25zdCBzdGFydER0ID0gbmV3IERhdGUoc3RhcnRTdHIucmVwbGFjZSgnICcsICdUJykgKyAnWicpO1xuICAgICAgY29uc3QgZW5kRHQgPSBuZXcgRGF0ZShlbmRTdHIucmVwbGFjZSgnICcsICdUJykgKyAnWicpO1xuICAgICAgY29uc3QgZGF0ZUZvcm1hdHRlZCA9IHN0YXJ0RHQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgIC4uLmxvY2FsZU9wdHMsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZVNob3J0ID0gc3RhcnREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmRUaW1lU2hvcnQgPSBlbmREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgICBob3VyMTI6IGZhbHNlLFxuICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYCR7ZGF0ZUZvcm1hdHRlZH0gfCAke3N0YXJ0VGltZVNob3J0fSAtICR7ZW5kVGltZVNob3J0fWA7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGF0ZVRpbWVSYW5nZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGUgYmFkZ2UgKGRheSArIG1vbnRoKSBmb3Igc2Vzc2lvbiBjYXJkIGZyb20gZGF0ZVRpbWVSYW5nZS5cbiAgICogSGFuZGxlcyBkYXRlVGltZVJhbmdlIGFzIHN0cmluZyAoXCJTdGFydDogMjAyNi0wMi0yMCAwMTowNTowMCwgRW5kOiAuLi5cIikgb3Igb2JqZWN0IHsgc3RhcnQsIGVuZCB9LlxuICAgKiBVc2VzIGRpc3BsYXlUaW1lWm9uZSBvbmx5IHdoZW4gaXQgaXMgYSB2YWxpZCBJQU5BIGlkZW50aWZpZXI7IG90aGVyd2lzZSBmb3JtYXRzIGluIGxvY2FsIHRpbWUuXG4gICAqL1xuICBnZXRTZXNzaW9uRGF0ZUJhZGdlKFxuICAgIGRhdGVUaW1lUmFuZ2U6IHN0cmluZyB8IHsgc3RhcnQ/OiBzdHJpbmc7IGVuZD86IHN0cmluZyB9IHwgbnVsbCxcbiAgICBkaXNwbGF5VGltZVpvbmU/OiBzdHJpbmcsXG4gICk6IHsgZGF5OiBzdHJpbmc7IG1vbnRoOiBzdHJpbmcgfSB7XG4gICAgaWYgKCFkYXRlVGltZVJhbmdlKSByZXR1cm4geyBkYXk6ICcnLCBtb250aDogJycgfTtcbiAgICB0cnkge1xuICAgICAgbGV0IHN0YXJ0RHQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgZGF0ZVRpbWVSYW5nZSA9PT0gJ29iamVjdCcgJiYgZGF0ZVRpbWVSYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgc3RhcnREdCA9IG5ldyBEYXRlKGRhdGVUaW1lUmFuZ2Uuc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZVRpbWVSYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXRjaCA9IGRhdGVUaW1lUmFuZ2UubWF0Y2goXG4gICAgICAgICAgL1N0YXJ0OlxccyooXFxkezR9LVxcZHsyfS1cXGR7Mn1cXHMrXFxkezJ9OlxcZHsyfTpcXGR7Mn0pLyxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0YXJ0TWF0Y2gpXG4gICAgICAgICAgc3RhcnREdCA9IG5ldyBEYXRlKHN0YXJ0TWF0Y2hbMV0ucmVwbGFjZSgnICcsICdUJykgKyAnWicpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdGFydER0IHx8IGlzTmFOKHN0YXJ0RHQuZ2V0VGltZSgpKSkgcmV0dXJuIHsgZGF5OiAnJywgbW9udGg6ICcnIH07XG4gICAgICBjb25zdCBsb2NhbGVPcHRzID0gZGlzcGxheVRpbWVab25lID8geyB0aW1lWm9uZTogZGlzcGxheVRpbWVab25lIH0gOiB7fTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRheSA9IHN0YXJ0RHQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgICAuLi5sb2NhbGVPcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbW9udGggPSBzdGFydER0LnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7XG4gICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgLi4ubG9jYWxlT3B0cyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGRheSwgbW9udGggfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkaXNwbGF5VGltZVpvbmUgbWF5IGJlIG5vbi1JQU5BIChlLmcuIFwiKFVUQy0wMzowMCkgQnJhc2lsaWFcIik7IGZvcm1hdCB3aXRob3V0IHRpbWVab25lXG4gICAgICAgIGNvbnN0IGRheSA9IHN0YXJ0RHQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHsgZGF5OiAnbnVtZXJpYycgfSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gc3RhcnREdC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JyB9KTtcbiAgICAgICAgcmV0dXJuIHsgZGF5LCBtb250aCB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgZGF5OiAnJywgbW9udGg6ICcnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aW1lIHJhbmdlIG9ubHkgKGUuZy4gXCI5OjAwIEFNIC0gMTA6MzAgQU1cIikgZm9yIHNlc3Npb24gY2FyZC5cbiAgICogRmFsbHMgYmFjayB0byBmb3JtYXR0aW5nIHdpdGhvdXQgdGltZVpvbmUgd2hlbiBkaXNwbGF5VGltZVpvbmUgaXMgbm90IGEgdmFsaWQgSUFOQSBpZGVudGlmaWVyLlxuICAgKi9cbiAgZm9ybWF0U2Vzc2lvblRpbWVSYW5nZShcbiAgICBkYXRlVGltZVJhbmdlOiBzdHJpbmcgfCB7IHN0YXJ0Pzogc3RyaW5nOyBlbmQ/OiBzdHJpbmcgfSB8IG51bGwsXG4gICAgZGlzcGxheVRpbWVab25lPzogc3RyaW5nLFxuICApOiBzdHJpbmcge1xuICAgIGlmICghZGF0ZVRpbWVSYW5nZSkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBsZXQgc3RhcnREdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVuZER0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBkYXRlVGltZVJhbmdlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBkYXRlVGltZVJhbmdlPy5zdGFydCAmJlxuICAgICAgICBkYXRlVGltZVJhbmdlPy5lbmRcbiAgICAgICkge1xuICAgICAgICBzdGFydER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5zdGFydCk7XG4gICAgICAgIGVuZER0ID0gbmV3IERhdGUoZGF0ZVRpbWVSYW5nZS5lbmQpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0ZVRpbWVSYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXRjaCA9IGRhdGVUaW1lUmFuZ2UubWF0Y2goXG4gICAgICAgICAgL1N0YXJ0OlxccyooXFxkezR9LVxcZHsyfS1cXGR7Mn1cXHMrXFxkezJ9OlxcZHsyfTpcXGR7Mn0pLyxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZW5kTWF0Y2ggPSBkYXRlVGltZVJhbmdlLm1hdGNoKFxuICAgICAgICAgIC9FbmQ6XFxzKihcXGR7NH0tXFxkezJ9LVxcZHsyfVxccytcXGR7Mn06XFxkezJ9OlxcZHsyfSkvLFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3RhcnRNYXRjaClcbiAgICAgICAgICBzdGFydER0ID0gbmV3IERhdGUoc3RhcnRNYXRjaFsxXS5yZXBsYWNlKCcgJywgJ1QnKSArICdaJyk7XG4gICAgICAgIGlmIChlbmRNYXRjaCkgZW5kRHQgPSBuZXcgRGF0ZShlbmRNYXRjaFsxXS5yZXBsYWNlKCcgJywgJ1QnKSArICdaJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0YXJ0RHQgfHwgaXNOYU4oc3RhcnREdC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gICAgICBjb25zdCBsb2NhbGVPcHRzID0gZGlzcGxheVRpbWVab25lID8geyB0aW1lWm9uZTogZGlzcGxheVRpbWVab25lIH0gOiB7fTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHN0YXJ0RHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgaG91cjEyOiB0cnVlLFxuICAgICAgICAgIC4uLmxvY2FsZU9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmRUaW1lID1cbiAgICAgICAgICBlbmREdCAmJiAhaXNOYU4oZW5kRHQuZ2V0VGltZSgpKVxuICAgICAgICAgICAgPyBlbmREdC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywge1xuICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgICAgICBob3VyMTI6IHRydWUsXG4gICAgICAgICAgICAgICAgLi4ubG9jYWxlT3B0cyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiBlbmRUaW1lID8gYCR7c3RhcnRUaW1lfSAtICR7ZW5kVGltZX1gIDogc3RhcnRUaW1lO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHN0YXJ0RHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgaG91cjEyOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9XG4gICAgICAgICAgZW5kRHQgJiYgIWlzTmFOKGVuZER0LmdldFRpbWUoKSlcbiAgICAgICAgICAgID8gZW5kRHQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgICAgICAgICAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgaG91cjEyOiB0cnVlLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgcmV0dXJuIGVuZFRpbWUgPyBgJHtzdGFydFRpbWV9IC0gJHtlbmRUaW1lfWAgOiBzdGFydFRpbWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElBTkEgdGltZXpvbmUgSUQgLT4gYWJicmV2aWF0aW9uIG1hcCAobWF0Y2hlcyBwYXJlbnQgYXBwIHNlc3Npb24tbGF5b3V0cyAvIHRpbWV6b25lcy5lbnVtIFRpbWVab25lcykuXG4gICAqIFVzZWQgc28gc2Vzc2lvbiBjYXJkcyBzaG93IFNBU1QsIEVFU1QsIFNBV1NULCBFU0FTVCwgZXRjLiBpbnN0ZWFkIG9mIEdNVCsxLCBHTVQrMi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRaX0FCQlJfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICdQYWNpZmljL0tpcml0aW1hdGknOiAnTElOVCcsXG4gICAgJ1BhY2lmaWMvQXBpYSc6ICdTU1QnLFxuICAgICdQYWNpZmljL1RvbmdhdGFwdSc6ICdUU1QnLFxuICAgICdFdGMvR01ULTEzJzogJ1VUQycsXG4gICAgJ1BhY2lmaWMvQ2hhdGhhbSc6ICdDSEFEVCcsXG4gICAgJ0FzaWEvS2FtY2hhdGthJzogJ0FOQVQnLFxuICAgICdQYWNpZmljL0ZpamknOiAnRkpUJyxcbiAgICAnRXRjL0dNVC0xMic6ICdVJyxcbiAgICAnUGFjaWZpYy9BdWNrbGFuZCc6ICdOWlNUJyxcbiAgICAnUGFjaWZpYy9HdWFkYWxjYW5hbCc6ICdDUFNUJyxcbiAgICAnQXNpYS9TYWtoYWxpbic6ICdTQUtUJyxcbiAgICAnUGFjaWZpYy9Ob3Jmb2xrJzogJ05GVCcsXG4gICAgJ0FzaWEvTWFnYWRhbic6ICdNQUdUJyxcbiAgICAnQXNpYS9TcmVkbmVrb2x5bXNrJzogJ1NSRVQnLFxuICAgICdQYWNpZmljL0JvdWdhaW52aWxsZSc6ICdCU1QnLFxuICAgICdBdXN0cmFsaWEvTG9yZF9Ib3dlJzogJ0xIU1QnLFxuICAgICdBc2lhL1ZsYWRpdm9zdG9rJzogJ1ZMQVQnLFxuICAgICdBdXN0cmFsaWEvSG9iYXJ0JzogJ0FFU1QnLFxuICAgICdQYWNpZmljL1BvcnRfTW9yZXNieSc6ICdDaFNUJyxcbiAgICAnQXVzdHJhbGlhL1N5ZG5leSc6ICdBRVNUJyxcbiAgICAnQXVzdHJhbGlhL0JyaXNiYW5lJzogJ0FXU1QnLFxuICAgICdBdXN0cmFsaWEvRGFyd2luJzogJ0FDU1QnLFxuICAgICdBdXN0cmFsaWEvQWRlbGFpZGUnOiAnQUNTVCcsXG4gICAgJ0FzaWEvWWFrdXRzayc6ICdZQUtUJyxcbiAgICAnQXNpYS9TZW91bCc6ICdLU1QnLFxuICAgICdBc2lhL1B5b25neWFuZyc6ICdLU1QnLFxuICAgICdBc2lhL1Rva3lvJzogJ1RTVCcsXG4gICAgJ0FzaWEvQ2hpdGEnOiAnWUFLVCcsXG4gICAgJ0F1c3RyYWxpYS9FdWNsYSc6ICdBQ1dTVCcsXG4gICAgJ0FzaWEvVWxhYW5iYWF0YXInOiAnRlNUJyxcbiAgICAnQXNpYS9UYWlwZWknOiAnVUxBVCcsXG4gICAgJ0F1c3RyYWxpYS9QZXJ0aCc6ICdBV1NUJyxcbiAgICAnQXNpYS9TaW5nYXBvcmUnOiAnU05TVCcsXG4gICAgJ0FzaWEvSXJrdXRzayc6ICdJUktUJyxcbiAgICAnQXNpYS9TaGFuZ2hhaSc6ICdDU1QnLFxuICAgICdBc2lhL1RvbXNrJzogJ01TRCcsXG4gICAgJ0FzaWEvTm92b3NpYmlyc2snOiAnTk9WVCcsXG4gICAgJ0FzaWEvS3Jhc25veWFyc2snOiAnS1JBVCcsXG4gICAgJ0FzaWEvSG92ZCc6ICdTQVNUJyxcbiAgICAnQXNpYS9CYXJuYXVsJzogJ01TSycsXG4gICAgJ0FzaWEvQmFuZ2tvayc6ICdUSEEnLFxuICAgICdBc2lhL1lhbmdvbic6ICdNWVNUJyxcbiAgICAnQXNpYS9PbXNrJzogJ09NU1QnLFxuICAgICdBc2lhL0RoYWthJzogJ0JTVCcsXG4gICAgJ0FzaWEvQWxtYXR5JzogJ05DQVNUJyxcbiAgICAnQXNpYS9LYXRobWFuZHUnOiAnTlBUJyxcbiAgICAnQXNpYS9Db2xvbWJvJzogJ1NMVCcsXG4gICAgJ0FzaWEvS29sa2F0YSc6ICdJU1QnLFxuICAgICdBc2lhL0NhbGN1dHRhJzogJ0lTVCcsXG4gICAgJ0FzaWEvUXl6eWxvcmRhJzogJ0NBU1QnLFxuICAgICdBc2lhL0thcmFjaGknOiAnUEtUJyxcbiAgICAnQXNpYS9ZZWthdGVyaW5idXJnJzogJ1lFS1QnLFxuICAgICdBc2lhL1Rhc2hrZW50JzogJ1dBU1QnLFxuICAgICdBc2lhL0thYnVsJzogJ0FGVCcsXG4gICAgJ0FzaWEvWWVyZXZhbic6ICdBTVQnLFxuICAgICdFdXJvcGUvVm9sZ29ncmFkJzogJ1ZTVCcsXG4gICAgJ0FzaWEvVGJpbGlzaSc6ICdHRVQnLFxuICAgICdFdXJvcGUvU2FyYXRvdic6ICdTTFQnLFxuICAgICdJbmRpYW4vTWF1cml0aXVzJzogJ01VVCcsXG4gICAgJ0V1cm9wZS9TYW1hcmEnOiAnU0FNVCcsXG4gICAgJ0FzaWEvQmFrdSc6ICdBWlQnLFxuICAgICdFdXJvcGUvQXN0cmFraGFuJzogJ1NBTVQnLFxuICAgICdBc2lhL0R1YmFpJzogJ0FSQlNUJyxcbiAgICAnQXNpYS9UZWhyYW4nOiAnSURUJyxcbiAgICAnQWZyaWNhL05haXJvYmknOiAnRUFTVCcsXG4gICAgJ0V1cm9wZS9Nb3Njb3cnOiAnTVNLJyxcbiAgICAnRXVyb3BlL01pbnNrJzogJ01TSycsXG4gICAgJ0FzaWEvUml5YWRoJzogJ0FTVCcsXG4gICAgJ0V1cm9wZS9Jc3RhbmJ1bCc6ICdURFQnLFxuICAgICdBc2lhL0JhZ2hkYWQnOiAnQVNUJyxcbiAgICAnQWZyaWNhL1dpbmRob2VrJzogJ05TVCcsXG4gICAgJ0FmcmljYS9Ucmlwb2xpJzogJ0xTVCcsXG4gICAgJ0FmcmljYS9LaGFydG91bSc6ICdFQVNUJyxcbiAgICAnRXVyb3BlL0thbGluaW5ncmFkJzogJ0tTVCcsXG4gICAgJ0FzaWEvSmVydXNhbGVtJzogJ0pEVCcsXG4gICAgJ0V1cm9wZS9LaWV2JzogJ0VFRFQnLFxuICAgICdBZnJpY2EvSm9oYW5uZXNidXJnJzogJ1NBU1QnLFxuICAgICdBc2lhL0hlYnJvbic6ICdFRVQnLFxuICAgICdBc2lhL0RhbWFzY3VzJzogJ1NEVCcsXG4gICAgJ0V1cm9wZS9DaGlzaW5hdSc6ICdHRFQnLFxuICAgICdBZnJpY2EvQ2Fpcm8nOiAnRVNUJyxcbiAgICAnQXNpYS9CZWlydXQnOiAnTUVEVCcsXG4gICAgJ0V1cm9wZS9CdWNoYXJlc3QnOiAnR0RUJyxcbiAgICAnQXNpYS9BbW1hbic6ICdKU1QnLFxuICAgICdBZnJpY2EvTGFnb3MnOiAnRUNUJyxcbiAgICAnRXVyb3BlL1dhcnNhdyc6ICdDRURUJyxcbiAgICAnQWZyaWNhL0Nhc2FibGFuY2EnOiAnTURUJyxcbiAgICAnRXVyb3BlL1BhcmlzJzogJ0NFU1QnLFxuICAgICdFdXJvcGUvQnVkYXBlc3QnOiAnQ0VEVCcsXG4gICAgJ0V1cm9wZS9CZXJsaW4nOiAnV0VEVCcsXG4gICAgJ0FmcmljYS9TYW9fVG9tZSc6ICdHU1QnLFxuICAgICdBdGxhbnRpYy9SZXlramF2aWsnOiAnR1NUJyxcbiAgICAnRXVyb3BlL0xvbmRvbic6ICdHRFQnLFxuICAgICdFdGMvVVRDJzogJ1VUQycsXG4gICAgJ0F0bGFudGljL0F6b3Jlcyc6ICdBRFQnLFxuICAgICdBdGxhbnRpYy9DYXBlX1ZlcmRlJzogJ0NWU1QnLFxuICAgICdFdGMvR01UKzInOiAnTVNUJyxcbiAgICAnQW1lcmljYS9BcmFndWFpbmEnOiAnU0VTVCcsXG4gICAgJ0FtZXJpY2EvU2FvX1BhdWxvJzogJ0VTQVNUJyxcbiAgICAnQW1lcmljYS9DYXllbm5lJzogJ1NFU1QnLFxuICAgICdBbWVyaWNhL0FyZ2VudGluYS9CdWVub3NfQWlyZXMnOiAnQVNUJyxcbiAgICAnQW1lcmljYS9OdXVrJzogJ1dHVCcsXG4gICAgJ0FtZXJpY2EvTW9udGV2aWRlbyc6ICdNU1QnLFxuICAgICdBbWVyaWNhL1B1bnRhX0FyZW5hcyc6ICdDTFNUJyxcbiAgICAnQW1lcmljYS9NaXF1ZWxvbic6ICdQTVNUJyxcbiAgICAnQW1lcmljYS9CYWhpYSc6ICdCU1QnLFxuICAgICdBbWVyaWNhL1N0X0pvaG5zJzogJ05TVCcsXG4gICAgJ0FtZXJpY2EvQXN1bmNpb24nOiAnUFJTVCcsXG4gICAgJ0FtZXJpY2EvSGFsaWZheCc6ICdBU1QnLFxuICAgICdBbWVyaWNhL0NhcmFjYXMnOiAnVlNUJyxcbiAgICAnQW1lcmljYS9DdWlhYmEnOiAnQ0JTVCcsXG4gICAgJ0FtZXJpY2EvTGFfUGF6JzogJ1NBV1NUJyxcbiAgICAnQW1lcmljYS9TYW50aWFnbyc6ICdQU1NUJyxcbiAgICAnQW1lcmljYS9Cb2dvdGEnOiAnU1BTVCcsXG4gICAgJ0FtZXJpY2EvQ2FuY3VuJzogJ0VTVCcsXG4gICAgJ0FtZXJpY2EvTmV3X1lvcmsnOiAnRVQnLFxuICAgICdBbWVyaWNhL1BvcnQtYXUtUHJpbmNlJzogJ0VEVCcsXG4gICAgJ0FtZXJpY2EvSGF2YW5hJzogJ0VEVCcsXG4gICAgJ0FtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMnOiAnRVNUJyxcbiAgICAnQW1lcmljYS9HcmFuZF9UdXJrJzogJ0VTVCcsXG4gICAgJ0FtZXJpY2EvR3VhdGVtYWxhJzogJ0NBU1QnLFxuICAgICdBbWVyaWNhL0NoaWNhZ28nOiAnQ1QnLFxuICAgICdQYWNpZmljL0Vhc3Rlcic6ICdFQVNUJyxcbiAgICAnQW1lcmljYS9NZXhpY29fQ2l0eSc6ICdDU1QnLFxuICAgICdBbWVyaWNhL1JlZ2luYSc6ICdDQ1NUJyxcbiAgICAnQW1lcmljYS9QaG9lbml4JzogJ01UJyxcbiAgICAnQW1lcmljYS9DaGlodWFodWEnOiAnTURUJyxcbiAgICAnQW1lcmljYS9EZW52ZXInOiAnTVQnLFxuICAgICdBbWVyaWNhL1doaXRlaG9yc2UnOiAnWVNUJyxcbiAgICAnQW1lcmljYS9UaWp1YW5hJzogJ1BTVCcsXG4gICAgJ0V0Yy9HTVQrOCc6ICdVVEMtMDgnLFxuICAgICdBbWVyaWNhL0xvc19BbmdlbGVzJzogJ1BUJyxcbiAgICAnQW1lcmljYS9BbmNob3JhZ2UnOiAnQUsnLFxuICAgICdFdGMvR01UKzknOiAnVVRDLTA5JyxcbiAgICAnUGFjaWZpYy9NYXJxdWVzYXMnOiAnTVNUJyxcbiAgICAnQW1lcmljYS9BZGFrJzogJ0hTVCcsXG4gICAgJ1BhY2lmaWMvSG9ub2x1bHUnOiAnSEFTVCcsXG4gICAgJ0V0Yy9HTVQrMTEnOiAnVVRDLTExJyxcbiAgICAnRXRjL0dNVCsxMic6ICdCSVQnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBXaW5kb3dzLXN0eWxlIFwiKFVUQ8KxSEg6TU0pIFBsYWNlXCIgLT4gc2hvcnQgbmFtZSAoSVNULCBCUlQsIGV0Yy4pIHNvIHdlIHNob3cgXCJJU1RcIiBub3QgXCIoKFVUQyswNTozMCkgSW5kaWEpXCIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBXSU5ET1dTX1RaX0FCQlJfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICcoVVRDLTAzOjAwKSBCcmFzaWxpYSc6ICdCUlQnLFxuICAgICcoVVRDLTAzOjAwKSBCdWVub3MgQWlyZXMnOiAnQVJUJyxcbiAgICAnKFVUQyswNTozMCkgSW5kaWEnOiAnSVNUJyxcbiAgICAnKFVUQyswNTozMCkgQ2hlbm5haSwgS29sa2F0YSwgTXVtYmFpLCBOZXcgRGVsaGknOiAnSVNUJyxcbiAgICAnKFVUQyswMDowMCkgRHVibGluLCBFZGluYnVyZ2gsIExvbmRvbic6ICdHTVQnLFxuICAgICcoVVRDKzAwOjAwKSBNb25yb3ZpYSwgUmV5a2phdmlrJzogJ0dNVCcsXG4gICAgJyhVVEMrMDE6MDApIEFtc3RlcmRhbSwgQmVybGluLCBSb21lLCBTdG9ja2hvbG0nOiAnQ0VUJyxcbiAgICAnKFVUQyswMTowMCkgQnJ1c3NlbHMsIENvcGVuaGFnZW4sIE1hZHJpZCwgUGFyaXMnOiAnQ0VUJyxcbiAgICAnKFVUQyswMjowMCkgQXRoZW5zLCBJc3RhbmJ1bCwgTWluc2snOiAnRUVUJyxcbiAgICAnKFVUQyswMjowMCkgQ2Fpcm8nOiAnRUVUJyxcbiAgICAnKFVUQyswMjowMCkgSmVydXNhbGVtJzogJ0lTVCcsXG4gICAgJyhVVEMrMDM6MDApIE1vc2NvdywgU3QuIFBldGVyc2J1cmcnOiAnTVNLJyxcbiAgICAnKFVUQyswMzowMCkgTmFpcm9iaSc6ICdFQVQnLFxuICAgICcoVVRDKzA0OjAwKSBEdWJhaSc6ICdHU1QnLFxuICAgICcoVVRDKzA1OjAwKSBJc2xhbWFiYWQsIEthcmFjaGknOiAnUEtUJyxcbiAgICAnKFVUQyswNTo0NSkgS2F0aG1hbmR1JzogJ05QVCcsXG4gICAgJyhVVEMrMDY6MDApIERoYWthJzogJ0JTVCcsXG4gICAgJyhVVEMrMDY6MzApIFlhbmdvbiAoUmFuZ29vbiknOiAnTU1UJyxcbiAgICAnKFVUQyswNzowMCkgQmFuZ2tvaywgSGFub2ksIEpha2FydGEnOiAnSUNUJyxcbiAgICAnKFVUQyswODowMCkgQmVpamluZywgQ2hvbmdxaW5nLCBIb25nIEtvbmcsIFVydW1xaSc6ICdDU1QnLFxuICAgICcoVVRDKzA4OjAwKSBLdWFsYSBMdW1wdXIsIFNpbmdhcG9yZSc6ICdTR1QnLFxuICAgICcoVVRDKzA5OjAwKSBPc2FrYSwgU2FwcG9ybywgVG9reW8nOiAnSlNUJyxcbiAgICAnKFVUQyswOTozMCkgQWRlbGFpZGUnOiAnQUNTVCcsXG4gICAgJyhVVEMrMTA6MDApIEJyaXNiYW5lJzogJ0FFU1QnLFxuICAgICcoVVRDKzEwOjAwKSBDYW5iZXJyYSwgTWVsYm91cm5lLCBTeWRuZXknOiAnQUVTVCcsXG4gICAgJyhVVEMrMTI6MDApIEF1Y2tsYW5kLCBXZWxsaW5ndG9uJzogJ05aU1QnLFxuICAgICcoVVRDLTA1OjAwKSBFYXN0ZXJuIFRpbWUgKFVTICYgQ2FuYWRhKSc6ICdFVCcsXG4gICAgJyhVVEMtMDY6MDApIENlbnRyYWwgVGltZSAoVVMgJiBDYW5hZGEpJzogJ0NUJyxcbiAgICAnKFVUQy0wNzowMCkgTW91bnRhaW4gVGltZSAoVVMgJiBDYW5hZGEpJzogJ01UJyxcbiAgICAnKFVUQy0wODowMCkgUGFjaWZpYyBUaW1lIChVUyAmIENhbmFkYSknOiAnUFQnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBXaW5kb3dzLXN0eWxlIFwiKFVUQ8KxSEg6TU0pIFBsYWNlXCIgLT4gSUFOQSB0aW1lem9uZS5cbiAgICogVGhpcyBwcmV2ZW50cyBJbnRsL0RhdGVQaXBlIGZyb20gZmFsbGluZyBiYWNrIHRvIGJyb3dzZXIgbG9jYWwgdGltZSB3aGVuIGEgV2luZG93cyBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgV0lORE9XU19UWl9JQU5BX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnKFVUQy0wMzowMCkgQnJhc2lsaWEnOiAnQW1lcmljYS9TYW9fUGF1bG8nLFxuICAgICcoVVRDLTAzOjAwKSBCdWVub3MgQWlyZXMnOiAnQW1lcmljYS9BcmdlbnRpbmEvQnVlbm9zX0FpcmVzJyxcbiAgICAnKFVUQyswNTozMCkgSW5kaWEnOiAnQXNpYS9Lb2xrYXRhJyxcbiAgICAnKFVUQyswNTozMCkgQ2hlbm5haSwgS29sa2F0YSwgTXVtYmFpLCBOZXcgRGVsaGknOiAnQXNpYS9Lb2xrYXRhJyxcbiAgICAnKFVUQyswMDowMCkgRHVibGluLCBFZGluYnVyZ2gsIExvbmRvbic6ICdFdXJvcGUvTG9uZG9uJyxcbiAgICAnKFVUQyswMDowMCkgTW9ucm92aWEsIFJleWtqYXZpayc6ICdFdGMvVVRDJyxcbiAgICAnKFVUQyswMTowMCkgQW1zdGVyZGFtLCBCZXJsaW4sIFJvbWUsIFN0b2NraG9sbSc6ICdFdXJvcGUvQmVybGluJyxcbiAgICAnKFVUQyswMTowMCkgQnJ1c3NlbHMsIENvcGVuaGFnZW4sIE1hZHJpZCwgUGFyaXMnOiAnRXVyb3BlL1BhcmlzJyxcbiAgICAnKFVUQyswMjowMCkgQXRoZW5zLCBJc3RhbmJ1bCwgTWluc2snOiAnRXVyb3BlL0F0aGVucycsXG4gICAgJyhVVEMrMDI6MDApIENhaXJvJzogJ0FmcmljYS9DYWlybycsXG4gICAgJyhVVEMrMDI6MDApIEplcnVzYWxlbSc6ICdBc2lhL0plcnVzYWxlbScsXG4gICAgJyhVVEMrMDM6MDApIE1vc2NvdywgU3QuIFBldGVyc2J1cmcnOiAnRXVyb3BlL01vc2NvdycsXG4gICAgJyhVVEMrMDM6MDApIE5haXJvYmknOiAnQWZyaWNhL05haXJvYmknLFxuICAgICcoVVRDKzA0OjAwKSBEdWJhaSc6ICdBc2lhL0R1YmFpJyxcbiAgICAnKFVUQyswNTowMCkgSXNsYW1hYmFkLCBLYXJhY2hpJzogJ0FzaWEvS2FyYWNoaScsXG4gICAgJyhVVEMrMDU6NDUpIEthdGhtYW5kdSc6ICdBc2lhL0thdGhtYW5kdScsXG4gICAgJyhVVEMrMDY6MDApIERoYWthJzogJ0FzaWEvRGhha2EnLFxuICAgICcoVVRDKzA2OjMwKSBZYW5nb24gKFJhbmdvb24pJzogJ0FzaWEvWWFuZ29uJyxcbiAgICAnKFVUQyswNzowMCkgQmFuZ2tvaywgSGFub2ksIEpha2FydGEnOiAnQXNpYS9CYW5na29rJyxcbiAgICAnKFVUQyswODowMCkgQmVpamluZywgQ2hvbmdxaW5nLCBIb25nIEtvbmcsIFVydW1xaSc6ICdBc2lhL1NoYW5naGFpJyxcbiAgICAnKFVUQyswODowMCkgS3VhbGEgTHVtcHVyLCBTaW5nYXBvcmUnOiAnQXNpYS9TaW5nYXBvcmUnLFxuICAgICcoVVRDKzA5OjAwKSBPc2FrYSwgU2FwcG9ybywgVG9reW8nOiAnQXNpYS9Ub2t5bycsXG4gICAgJyhVVEMrMDk6MzApIEFkZWxhaWRlJzogJ0F1c3RyYWxpYS9BZGVsYWlkZScsXG4gICAgJyhVVEMrMTA6MDApIEJyaXNiYW5lJzogJ0F1c3RyYWxpYS9CcmlzYmFuZScsXG4gICAgJyhVVEMrMTA6MDApIENhbmJlcnJhLCBNZWxib3VybmUsIFN5ZG5leSc6ICdBdXN0cmFsaWEvU3lkbmV5JyxcbiAgICAnKFVUQysxMjowMCkgQXVja2xhbmQsIFdlbGxpbmd0b24nOiAnUGFjaWZpYy9BdWNrbGFuZCcsXG4gICAgJyhVVEMtMDU6MDApIEVhc3Rlcm4gVGltZSAoVVMgJiBDYW5hZGEpJzogJ0FtZXJpY2EvTmV3X1lvcmsnLFxuICAgICcoVVRDLTA2OjAwKSBDZW50cmFsIFRpbWUgKFVTICYgQ2FuYWRhKSc6ICdBbWVyaWNhL0NoaWNhZ28nLFxuICAgICcoVVRDLTA3OjAwKSBNb3VudGFpbiBUaW1lIChVUyAmIENhbmFkYSknOiAnQW1lcmljYS9EZW52ZXInLFxuICAgICcoVVRDLTA4OjAwKSBQYWNpZmljIFRpbWUgKFVTICYgQ2FuYWRhKSc6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyxcbiAgfTtcblxuICBwcml2YXRlIG5vcm1hbGl6ZVRvSWFuYVRpbWVab25lKFxuICAgIHR6OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2Vzc2lvbklhbmFUaW1lWm9uZT86IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByYXcgPSAodHogPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoIXJhdykgcmV0dXJuIHNlc3Npb25JYW5hVGltZVpvbmUgfHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdXNlciBwYXNzZXMgdGhlIHNlc3Npb24ncyBXaW5kb3dzIGlkL25hbWUsIHByZWZlciB0aGUgc2Vzc2lvbidzIGtub3duIElBTkEgem9uZS5cbiAgICBpZiAoXG4gICAgICBzZXNzaW9uSWFuYVRpbWVab25lICYmXG4gICAgICByYXcudG9Mb3dlckNhc2UoKSA9PT0gU3RyaW5nKHNlc3Npb25JYW5hVGltZVpvbmUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gc2Vzc2lvbklhbmFUaW1lWm9uZTtcbiAgICB9XG5cbiAgICBpZiAocmF3LnN0YXJ0c1dpdGgoJyhVVEMnKSB8fCByYXcuc3RhcnRzV2l0aCgnKHV0YycpKSB7XG4gICAgICBjb25zdCBtYXAgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ2hhdERyYXdlckNvbXBvbmVudClcbiAgICAgICAgLldJTkRPV1NfVFpfSUFOQV9NQVA7XG4gICAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhtYXApLmZpbmQoXG4gICAgICAgIChrKSA9PiBrLnRvTG93ZXJDYXNlKCkgPT09IHJhdy50b0xvd2VyQ2FzZSgpLFxuICAgICAgKTtcbiAgICAgIGlmIChrZXkpIHJldHVybiBtYXBba2V5XTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgYXNzdW1lIGl0IG1heSBhbHJlYWR5IGJlIElBTkEgKGUuZy4gXCJBbWVyaWNhL1Nhb19QYXVsb1wiKVxuICAgIHJldHVybiByYXc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRpbWV6b25lIGFiYnJldmlhdGlvbiAoZS5nLiBJU1QsIEJSVCwgU0FTVCkgZm9yIGRpc3BsYXkgYWZ0ZXIgdGhlIHRpbWUuXG4gICAqIFVzZXMgSUFOQSBtYXAgYW5kIFdpbmRvd3Mtc3R5bGUgbWFwIHNvIHdlIHNob3cgXCJCUlRcIiAvIFwiSVNUXCIgaW5zdGVhZCBvZiBcIigoVVRDLTAzOjAwKSBCcmFzaWxpYSlcIi5cbiAgICogT25seSBjb25zdWx0cyBXaW5kb3dzIG1hcCB3aGVuIGlucHV0IGxvb2tzIGxpa2UgXCIoVVRDLi4uKVwiIHNvIGV4aXN0aW5nIElBTkEvSW50bCBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBnZXRUaW1lem9uZUFiYnJldmlhdGlvbih0ejogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXR6IHx8ICFTdHJpbmcodHopLnRyaW0oKSkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHR6SWQgPSBTdHJpbmcodHopLnRyaW0oKTtcbiAgICBpZiAodHpJZC5zdGFydHNXaXRoKCcoVVRDJykgfHwgdHpJZC5zdGFydHNXaXRoKCcodXRjJykpIHtcbiAgICAgIGNvbnN0IHdpbk1hcCA9ICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDaGF0RHJhd2VyQ29tcG9uZW50KVxuICAgICAgICAuV0lORE9XU19UWl9BQkJSX01BUDtcbiAgICAgIGNvbnN0IHdpbktleSA9IE9iamVjdC5rZXlzKHdpbk1hcCkuZmluZChcbiAgICAgICAgKGspID0+IGsudG9Mb3dlckNhc2UoKSA9PT0gdHpJZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgKTtcbiAgICAgIGlmICh3aW5LZXkpIHJldHVybiB3aW5NYXBbd2luS2V5XTtcbiAgICB9XG4gICAgY29uc3QgbWFwID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENoYXREcmF3ZXJDb21wb25lbnQpLlRaX0FCQlJfTUFQO1xuICAgIGxldCBtYXBwZWQgPSBtYXBbdHpJZF07XG4gICAgaWYgKCFtYXBwZWQpIHtcbiAgICAgIGNvbnN0IGtleUxvd2VyID0gdHpJZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZW50cnkgPSBPYmplY3QuZW50cmllcyhtYXApLmZpbmQoXG4gICAgICAgIChba10pID0+IGsudG9Mb3dlckNhc2UoKSA9PT0ga2V5TG93ZXIsXG4gICAgICApO1xuICAgICAgaWYgKGVudHJ5KSBtYXBwZWQgPSBlbnRyeVsxXTtcbiAgICB9XG4gICAgaWYgKG1hcHBlZCkgcmV0dXJuIG1hcHBlZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoJ2VuLVVTJywge1xuICAgICAgICB0aW1lWm9uZTogdHpJZCxcbiAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXJ0cyA9IGZvcm1hdHRlci5mb3JtYXRUb1BhcnRzKG5ldyBEYXRlKCkpO1xuICAgICAgY29uc3QgdHpQYXJ0ID0gcGFydHMuZmluZCgocCkgPT4gcC50eXBlID09PSAndGltZVpvbmVOYW1lJyk7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0elBhcnQ/LnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgICBpZiAodmFsdWUgJiYgL15HTVRbKy1dXFxkLy50ZXN0KHZhbHVlKSkgcmV0dXJuICcnO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGdldFN0YXR1c1RleHRGcm9tU2Vzc2lvblJvbGVzKHNlc3Npb25Sb2xlczogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2Vzc2lvblJvbGVzKSB8fCBzZXNzaW9uUm9sZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbignJykgfHwgJyc7XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0ID0gc2Vzc2lvblJvbGVzWzBdO1xuICAgIGlmICh0eXBlb2YgZmlyc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGZpcnN0KVxuICAgICAgICAucmVwbGFjZSgvXlxccyotXFxzKi8sICcnKVxuICAgICAgICAudHJpbSgpO1xuICAgIH1cbiAgICBpZiAoZmlyc3QgJiYgdHlwZW9mIGZpcnN0ID09PSAnb2JqZWN0JyAmJiAoZmlyc3QgYXMgYW55KS5kZXNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIFN0cmluZygoZmlyc3QgYXMgYW55KS5kZXNjcmlwdGlvbikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2xhdGlvbignJykgfHwgJyc7XG4gIH1cblxuICBtYXBTZXNzaW9uc1RvQ2FyZERhdGEoc2Vzc2lvbnM6IGFueVtdKTogYW55W10ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZXNzaW9ucykpIHJldHVybiBbXTtcbiAgICBjb25zdCB1c2VyVGltZXpvbmUgPVxuICAgICAgdGhpcy50aW1lem9uZSAmJiBTdHJpbmcodGhpcy50aW1lem9uZSkudHJpbSgpXG4gICAgICAgID8gU3RyaW5nKHRoaXMudGltZXpvbmUpLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc2Vzc2lvbnMubWFwKChyYXc6IGFueSkgPT4ge1xuICAgICAgLy8gZ2V0X215X2FnZW5kYSByZXR1cm5zIHdyYXBwZXIgeyBpZCwgc2NoZWR1bGUsIGlzU2Vzc2lvbiB9OyBub3JtYWxpemUgdG8gaW5uZXIgc2NoZWR1bGUgb2JqZWN0XG4gICAgICBjb25zdCBzID0gcmF3ICYmIHJhdy5zY2hlZHVsZSA/IHJhdy5zY2hlZHVsZSA6IHJhdztcbiAgICAgIGNvbnN0IHNlc3Npb25Uek9iaiA9XG4gICAgICAgIHMgJiYgdHlwZW9mIHMgPT09ICdvYmplY3QnID8gKHMgYXMgYW55KS50aW1lWm9uZSA6IG51bGw7XG4gICAgICBjb25zdCBzZXNzaW9uSWFuYVRpbWVab25lID1cbiAgICAgICAgc2Vzc2lvblR6T2JqICYmIHR5cGVvZiBzZXNzaW9uVHpPYmogPT09ICdvYmplY3QnXG4gICAgICAgICAgPyBTdHJpbmcoc2Vzc2lvblR6T2JqLnN1YlRpbWVab25lID8/ICcnKS50cmltKClcbiAgICAgICAgICA6ICcnO1xuICAgICAgLy8gU3VwcG9ydCBib3RoIGRhdGVUaW1lUmFuZ2UgKHN0cmluZykgYW5kIGFjdHVhbERhdGVUaW1lUmFuZ2UgKG9iamVjdCB3aXRoIHN0YXJ0L2VuZClcbiAgICAgIGNvbnN0IHdoZW5SYXcgPSBzLmRhdGVUaW1lUmFuZ2UgPz8gcy5hY3R1YWxEYXRlVGltZVJhbmdlID8/ICcnO1xuICAgICAgLy8gUHJlZmVyIHVzZXIncyBzZWxlY3RlZCB0aW1lem9uZTsgb3RoZXJ3aXNlIHVzZSBzZXNzaW9uJ3MgSUFOQSB6b25lIChzdWJUaW1lWm9uZSkgZm9yIGNvcnJlY3QgZGF0ZS9kYXkuXG4gICAgICBjb25zdCBmb3JtYXR0aW5nVGltZVpvbmUgPSB0aGlzLm5vcm1hbGl6ZVRvSWFuYVRpbWVab25lKFxuICAgICAgICB1c2VyVGltZXpvbmUsXG4gICAgICAgIHNlc3Npb25JYW5hVGltZVpvbmUsXG4gICAgICApO1xuICAgICAgY29uc3Qgd2hlbkZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0U2Vzc2lvbldoZW4oXG4gICAgICAgIHdoZW5SYXcsXG4gICAgICAgIGZvcm1hdHRpbmdUaW1lWm9uZSB8fCB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgLy8gT25seSBzZXQgc3RhdHVzVGV4dCB3aGVuIHNlc3Npb24gaGFzIGpvaW4vd2F0Y2ggcm9sZXMgKHNvIHdlIGRvbid0IHNob3cgXCJZb3UgY2FuIGpvaW4gdGhpcyBtZWV0aW5nXCIgd2hlbiB0aGVyZSBhcmUgbm8gYnV0dG9ucylcbiAgICAgIGNvbnN0IGhhc0pvaW5XYXRjaFJvbGUgPVxuICAgICAgICBBcnJheS5pc0FycmF5KHMuc2Vzc2lvblJvbGVzKSAmJlxuICAgICAgICBzLnNlc3Npb25Sb2xlcy5zb21lKChyOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBuYW1lID1cbiAgICAgICAgICAgIHIgJiYgdHlwZW9mIHIgPT09ICdvYmplY3QnICYmIHIuc2Vzc2lvblJvbGVOYW1lXG4gICAgICAgICAgICAgID8gU3RyaW5nKHIuc2Vzc2lvblJvbGVOYW1lKS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICA6IFN0cmluZyhyID8/ICcnKVxuICAgICAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICdqb2luJyB8fCBuYW1lID09PSAnd2F0Y2gnO1xuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YXR1c1RleHQgPSBoYXNKb2luV2F0Y2hSb2xlXG4gICAgICAgID8gdGhpcy5nZXRTdGF0dXNUZXh0RnJvbVNlc3Npb25Sb2xlcyhzLnNlc3Npb25Sb2xlcylcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNlc3Npb25UaW1lWm9uZUxhYmVsID1cbiAgICAgICAgc2Vzc2lvblR6T2JqICE9IG51bGxcbiAgICAgICAgICA/IHR5cGVvZiBzZXNzaW9uVHpPYmogPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IFN0cmluZyhcbiAgICAgICAgICAgICAgICBzZXNzaW9uVHpPYmoubmFtZSA/P1xuICAgICAgICAgICAgICAgICAgc2Vzc2lvblR6T2JqLmlkID8/XG4gICAgICAgICAgICAgICAgICBzZXNzaW9uVHpPYmouc3ViVGltZVpvbmUgPz9cbiAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICApLnRyaW0oKVxuICAgICAgICAgICAgOiBTdHJpbmcoc2Vzc2lvblR6T2JqKS50cmltKClcbiAgICAgICAgICA6ICcnO1xuICAgICAgLy8gVXNlIGFuIElBTkEgdGltZXpvbmUgZm9yIGZvcm1hdHRpbmc7IHVzZSBhIHNlcGFyYXRlIGxhYmVsIGZvciBVSSBkaXNwbGF5LlxuICAgICAgY29uc3QgZGlzcGxheVRpbWVab25lRm9yRm9ybWF0ID0gZm9ybWF0dGluZ1RpbWVab25lO1xuICAgICAgY29uc3QgZGlzcGxheVRpbWVab25lTGFiZWwgPSAoXG4gICAgICAgIHVzZXJUaW1lem9uZSB8fFxuICAgICAgICBzZXNzaW9uVGltZVpvbmVMYWJlbCB8fFxuICAgICAgICAnJ1xuICAgICAgKS50cmltKCk7XG4gICAgICBjb25zdCB0ekFiYnIgPSBkaXNwbGF5VGltZVpvbmVGb3JGb3JtYXRcbiAgICAgICAgPyB0aGlzLmdldFRpbWV6b25lQWJicmV2aWF0aW9uKGRpc3BsYXlUaW1lWm9uZUZvckZvcm1hdClcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHdoZW5XaXRoVHogPVxuICAgICAgICB3aGVuRm9ybWF0dGVkIHx8ICh0eXBlb2Ygd2hlblJhdyA9PT0gJ29iamVjdCcgPyAnJyA6IFN0cmluZyh3aGVuUmF3KSk7XG4gICAgICBjb25zdCB3aGVuRGlzcGxheSA9IHR6QWJiclxuICAgICAgICA/IGAke3doZW5XaXRoVHp9ICgke3R6QWJicn0pYC50cmltKClcbiAgICAgICAgOiB3aGVuV2l0aFR6O1xuICAgICAgY29uc3QgZGF0ZUJhZGdlID0gdGhpcy5nZXRTZXNzaW9uRGF0ZUJhZGdlKFxuICAgICAgICB3aGVuUmF3LFxuICAgICAgICBkaXNwbGF5VGltZVpvbmVGb3JGb3JtYXQgfHwgdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIGxldCB0aW1lUmFuZ2UgPSB0aGlzLmZvcm1hdFNlc3Npb25UaW1lUmFuZ2UoXG4gICAgICAgIHdoZW5SYXcsXG4gICAgICAgIGRpc3BsYXlUaW1lWm9uZUZvckZvcm1hdCB8fCB1bmRlZmluZWQsXG4gICAgICApO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBTdHJpbmcocy5kZXNjcmlwdGlvbiA/PyBzLmFic3RyYWN0ID8/ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBzZXNzaW9uVHlwZVJhdyA9XG4gICAgICAgIHMuc2Vzc2lvblR5cGUgIT0gbnVsbFxuICAgICAgICAgID8gdHlwZW9mIHMuc2Vzc2lvblR5cGUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IChzLnNlc3Npb25UeXBlLm5hbWUgPz8gcy5zZXNzaW9uVHlwZS50aXRsZSA/PyAnJylcbiAgICAgICAgICAgIDogcy5zZXNzaW9uVHlwZVxuICAgICAgICAgIDogJyc7XG4gICAgICBjb25zdCBtZWV0aW5nVHlwZSA9IFN0cmluZyhcbiAgICAgICAgc2Vzc2lvblR5cGVSYXcgPz8gcy50eXBlID8/IHMubWVldGluZ1R5cGUgPz8gJycsXG4gICAgICApLnRyaW0oKTtcbiAgICAgIGNvbnN0IHNlc3Npb25UeXBlTGFiZWwgPSB0aGlzLmlzVW5FdmVudFxuICAgICAgICA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ01lZXRpbmcgdHlwZScpIHx8ICdNZWV0aW5nIHR5cGUnXG4gICAgICAgIDogdGhpcy5nZXRUcmFuc2xhdGlvbignU2Vzc2lvbiB0eXBlJykgfHwgJ1Nlc3Npb24gdHlwZSc7XG4gICAgICAvLyBTYW1lIGxvZ2ljIGFzIGJlZm9yZSBkZXNpZ24gdXBkYXRlOiBwcmVmZXIgdHogYWJicmV2aWF0aW9uIChlLmcuIEVTVCksIGVsc2Ugc2hvdyBkaXNwbGF5IHRpbWV6b25lIHN0cmluZyAoZS5nLiBcIihVVEMtMDM6MDApIEJyYXNpbGlhKVwiKVxuICAgICAgY29uc3QgdGltZVpvbmVEaXNwbGF5ID0gdHpBYmJyIHx8IGRpc3BsYXlUaW1lWm9uZUxhYmVsIHx8ICcnO1xuICAgICAgLy8gV2hlbiBBUEkgcmV0dXJucyBcIlN0YXJ0OiBOL0EsIEVuZDogTi9BLCBUaW1lWm9uZTogLi4uXCIgKHN0cmluZyksIHNob3cgYXQgbGVhc3QgdGltZXpvbmVcbiAgICAgIGlmICghdGltZVJhbmdlICYmIChkaXNwbGF5VGltZVpvbmVGb3JGb3JtYXQgfHwgZGlzcGxheVRpbWVab25lTGFiZWwpKSB7XG4gICAgICAgIHRpbWVSYW5nZSA9IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ05vdCBzcGVjaWZpZWQnKSB8fCAnTm90IHNwZWNpZmllZCc7XG4gICAgICB9XG4gICAgICAvLyBUaW1lIHJhbmdlIHdpdGggdGltZXpvbmUgaW4gcGFyZW50aGVzZXMgd2hlbiBhdmFpbGFibGUgKHNhbWUgYXMgb2xkIHdoZW5EaXNwbGF5IGZvcm1hdClcbiAgICAgIGNvbnN0IHRpbWVSYW5nZVdpdGhUeiA9IHRpbWVab25lRGlzcGxheVxuICAgICAgICA/IGAke3RpbWVSYW5nZX0gKCR7dGltZVpvbmVEaXNwbGF5fSlgLnRyaW0oKVxuICAgICAgICA6IHRpbWVSYW5nZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlOiBTdHJpbmcocy50aXRsZSA/PyAnJykudHJpbSgpLFxuICAgICAgICBvcmdhbml6ZXI6IFN0cmluZyhzLm9yZ2FuaXplciA/PyAnJykudHJpbSgpLFxuICAgICAgICByb29tOiBTdHJpbmcocy5yb29tTmFtZSA/PyAnJykudHJpbSgpLFxuICAgICAgICB3aGVuOiB3aGVuRGlzcGxheSxcbiAgICAgICAgdGltZVJhbmdlLFxuICAgICAgICB0aW1lUmFuZ2VXaXRoVHo6IHRpbWVSYW5nZSA/IHRpbWVSYW5nZVdpdGhUeiA6IHRpbWVab25lRGlzcGxheSB8fCAnJyxcbiAgICAgICAgZGF0ZURheTogZGF0ZUJhZGdlLmRheSxcbiAgICAgICAgZGF0ZU1vbnRoOiBkYXRlQmFkZ2UubW9udGgsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB0aW1lWm9uZTogZGlzcGxheVRpbWVab25lRm9yRm9ybWF0IHx8IGRpc3BsYXlUaW1lWm9uZUxhYmVsLFxuICAgICAgICB0aW1lWm9uZURpc3BsYXksXG4gICAgICAgIG1lZXRpbmdUeXBlLFxuICAgICAgICBzZXNzaW9uVHlwZUxhYmVsLFxuICAgICAgICBzdGF0dXNUZXh0LFxuICAgICAgICBzZXNzaW9uOiBzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNlc3Npb25JYW5hVGltZVpvbmUoc2Vzc2lvbjogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBzID0gc2Vzc2lvbiAmJiBzZXNzaW9uLnNjaGVkdWxlID8gc2Vzc2lvbi5zY2hlZHVsZSA6IHNlc3Npb247XG4gICAgY29uc3QgdHpPYmogPSBzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0JyA/IChzIGFzIGFueSkudGltZVpvbmUgOiBudWxsO1xuICAgIGNvbnN0IHNlc3Npb25JYW5hID1cbiAgICAgIHR6T2JqICYmIHR5cGVvZiB0ek9iaiA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBTdHJpbmcodHpPYmouc3ViVGltZVpvbmUgPz8gJycpLnRyaW0oKVxuICAgICAgICA6ICcnO1xuICAgIGNvbnN0IHVzZXJUeiA9XG4gICAgICB0aGlzLnRpbWV6b25lICYmIFN0cmluZyh0aGlzLnRpbWV6b25lKS50cmltKClcbiAgICAgICAgPyBTdHJpbmcodGhpcy50aW1lem9uZSkudHJpbSgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVRvSWFuYVRpbWVab25lKHVzZXJUeiwgc2Vzc2lvbklhbmEpIHx8ICdVVEMnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0U3BlYWtlcklkc0Zyb21TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzOiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2Vzc2lvbkNhcmRzKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNhcmQgb2Ygc2Vzc2lvbkNhcmRzKSB7XG4gICAgICBjb25zdCByYXcgPSBjYXJkPy5zZXNzaW9uPy5zcGVha2VycztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiByYXcpIHtcbiAgICAgICAgICBjb25zdCBzaWQgPSBTdHJpbmcoaWQgPz8gJycpLnRyaW0oKTtcbiAgICAgICAgICBpZiAoc2lkKSBpZHMucHVzaChzaWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaWRzKSk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFNwZWFrZXJzVG9TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzZXNzaW9uQ2FyZHMpKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBjYXJkIG9mIHNlc3Npb25DYXJkcykge1xuICAgICAgY29uc3Qgc3BlYWtlcklkczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KGNhcmQ/LnNlc3Npb24/LnNwZWFrZXJzKVxuICAgICAgICA/IGNhcmQuc2Vzc2lvbi5zcGVha2Vyc1xuICAgICAgICAgICAgLm1hcCgoeDogYW55KSA9PiBTdHJpbmcoeCA/PyAnJykudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICA6IFtdO1xuICAgICAgY29uc3Qgc3BlYWtlcnNMaXN0ID0gc3BlYWtlcklkc1xuICAgICAgICAubWFwKChpZCkgPT4gdGhpcy5zcGVha2Vyc1tpZF0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjYXJkLnNwZWFrZXJzTGlzdCA9IHNwZWFrZXJzTGlzdDtcbiAgICAgIGlmIChjYXJkPy5zZXNzaW9uICYmIHR5cGVvZiBjYXJkLnNlc3Npb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNhcmQuc2Vzc2lvbi5zcGVha2Vyc0xpc3QgPSBzcGVha2Vyc0xpc3Q7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTcGVha2Vyc0ZvclNlc3Npb25DYXJkcyhzZXNzaW9uQ2FyZHM6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgaWRzID0gdGhpcy5jb2xsZWN0U3BlYWtlcklkc0Zyb21TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzKTtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWlzc2luZyA9IGlkcy5maWx0ZXIoXG4gICAgICAoaWQpID0+ICF0aGlzLnNwZWFrZXJzW2lkXSAmJiAhdGhpcy5yZXF1ZXN0ZWRTcGVha2VySWRzLmhhcyhpZCksXG4gICAgKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYXR0YWNoU3BlYWtlcnNUb1Nlc3Npb25DYXJkcyhzZXNzaW9uQ2FyZHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtaXNzaW5nLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlcXVlc3RlZFNwZWFrZXJJZHMuYWRkKGlkKSk7XG4gICAgdGhpcy5nZXRTcGVha2Vyc0J5U3RhZmZJZHMobWlzc2luZykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5hdHRhY2hTcGVha2Vyc1RvU2Vzc2lvbkNhcmRzKHNlc3Npb25DYXJkcyk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIC8vIEJlc3QgZWZmb3J0OiBzdGlsbCBhdHRhY2ggd2hhdCB3ZSBoYXZlIGNhY2hlZFxuICAgICAgICB0aGlzLmF0dGFjaFNwZWFrZXJzVG9TZXNzaW9uQ2FyZHMoc2Vzc2lvbkNhcmRzKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3BlYWtlclBob3RvVXJsKHNwZWFrZXI6IGFueSk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghc3BlYWtlcikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICAgIHNwZWFrZXIucGhvdG8sXG4gICAgICBzcGVha2VyLnBob3RvUGF0aCxcbiAgICAgIHNwZWFrZXIuYXZhdGFyVXJsLFxuICAgICAgc3BlYWtlci5wcm9maWxlSW1hZ2VVcmwsXG4gICAgICBzcGVha2VyLnByb2ZpbGVJbWFnZSxcbiAgICAgIHNwZWFrZXIucHJvZmlsZVBpY3R1cmUsXG4gICAgICBzcGVha2VyLmltYWdlVXJsLFxuICAgICAgc3BlYWtlci5pbWFnZSxcbiAgICBdO1xuICAgIGNvbnN0IHVybCA9IGNhbmRpZGF0ZXMuZmluZCgodikgPT4gdiAhPSBudWxsICYmIFN0cmluZyh2KS50cmltKCkgIT09ICcnKTtcbiAgICByZXR1cm4gdXJsID8gU3RyaW5nKHVybCkudHJpbSgpIDogbnVsbDtcbiAgfVxuXG4gIGhhc1Nlc3Npb25DYXJkU3BlYWtlcnMoc2Vzc2lvbkNhcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxpc3QgPVxuICAgICAgc2Vzc2lvbkNhcmQ/LnNwZWFrZXJzTGlzdCB8fCBzZXNzaW9uQ2FyZD8uc2Vzc2lvbj8uc3BlYWtlcnNMaXN0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3QpICYmIGxpc3QubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgaWRzID0gc2Vzc2lvbkNhcmQ/LnNlc3Npb24/LnNwZWFrZXJzO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGlkcykgJiYgaWRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXRTcGVha2VyRGlzcGxheU5hbWUoc3BlYWtlcjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXNwZWFrZXIpIHJldHVybiAnJztcbiAgICBpZiAoc3BlYWtlci5uYW1lICE9IG51bGwgJiYgU3RyaW5nKHNwZWFrZXIubmFtZSkudHJpbSgpICE9PSAnJylcbiAgICAgIHJldHVybiBTdHJpbmcoc3BlYWtlci5uYW1lKS50cmltKCk7XG4gICAgY29uc3QgZmlyc3QgPVxuICAgICAgc3BlYWtlci5maXJzdE5hbWUgIT0gbnVsbCA/IFN0cmluZyhzcGVha2VyLmZpcnN0TmFtZSkudHJpbSgpIDogJyc7XG4gICAgY29uc3QgbGFzdCA9XG4gICAgICBzcGVha2VyLmxhc3ROYW1lICE9IG51bGwgPyBTdHJpbmcoc3BlYWtlci5sYXN0TmFtZSkudHJpbSgpIDogJyc7XG4gICAgcmV0dXJuIGAke2ZpcnN0fSAke2xhc3R9YC50cmltKCk7XG4gIH1cblxuICBnZXRTcGVha2VySW5pdGlhbHMoc3BlYWtlcjogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRTcGVha2VyRGlzcGxheU5hbWUoc3BlYWtlcik7XG4gICAgaWYgKG5hbWUpIHJldHVybiB0aGlzLmdldEF0dGVuZGVlSW5pdGlhbHMobmFtZSk7XG4gICAgY29uc3QgaWQgPSBzcGVha2VyPy5pZCAhPSBudWxsID8gU3RyaW5nKHNwZWFrZXIuaWQpIDogJyc7XG4gICAgcmV0dXJuIGlkID8gaWQuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKSA6ICc/JztcbiAgfVxuXG4gIG1hcEF0dGVuZGVlc1RvQ2FyZERhdGEoYXR0ZW5kZWVzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXR0ZW5kZWVzKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhdHRlbmRlZXMubWFwKChhOiBhbnkpID0+ICh7XG4gICAgICBuYW1lOiBTdHJpbmcoYS5uYW1lID8/ICcnKS50cmltKCksXG4gICAgICBjb21wYW55OlxuICAgICAgICBhLmNvbXBhbnkgIT0gbnVsbCAmJiBTdHJpbmcoYS5jb21wYW55KS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYS5jb21wYW55KS50cmltKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICBqb2JUaXRsZTpcbiAgICAgICAgYS5qb2JUaXRsZSAhPSBudWxsICYmIFN0cmluZyhhLmpvYlRpdGxlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYS5qb2JUaXRsZSkudHJpbSgpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgcGhvdG86XG4gICAgICAgIGEucGhvdG8gIT0gbnVsbCAmJiBTdHJpbmcoYS5waG90bykudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKGEucGhvdG8pLnRyaW0oKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIGlkOiBhLmlkID8/IGEudXNlcklkID8/IGEuX2lkID8/IGEuYXR0ZW5kZWVJZCA/PyB1bmRlZmluZWQsXG4gICAgICBpbnRlcmVzdHM6XG4gICAgICAgIGEuaW50ZXJlc3RzICE9IG51bGwgJiYgU3RyaW5nKGEuaW50ZXJlc3RzKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYS5pbnRlcmVzdHMpLnRyaW0oKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBhLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKGEuZGVzY3JpcHRpb24pLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICA/IFN0cmluZyhhLmRlc2NyaXB0aW9uKS50cmltKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB1c2VyVmlkZW9zTW9kZWw6IGEudXNlclZpZGVvc01vZGVsXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdXJsOlxuICAgICAgICAgICAgICBhLnVzZXJWaWRlb3NNb2RlbD8udXJsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnVybCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgID8gU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnVybCkudHJpbSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgdGh1bWJuYWlsOlxuICAgICAgICAgICAgICBhLnVzZXJWaWRlb3NNb2RlbD8udGh1bWJuYWlsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnRodW1ibmFpbCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgID8gU3RyaW5nKGEudXNlclZpZGVvc01vZGVsLnRodW1ibmFpbCkudHJpbSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgIH0pKTtcbiAgfVxuXG4gIG1hcFNwZWFrZXJzVG9DYXJkRGF0YShzcGVha2VyczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNwZWFrZXJzKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBzcGVha2Vycy5tYXAoKHM6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcmF3RGVzYyA9XG4gICAgICAgIHMuZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBTdHJpbmcocy5kZXNjcmlwdGlvbikudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHMuZGVzY3JpcHRpb24pLnRyaW0oKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcmF3RGVzY1xuICAgICAgICA/IC88W2Etel1bXFxzXFxTXSo+L2kudGVzdChyYXdEZXNjKVxuICAgICAgICAgID8gdGhpcy5zdHJpcEh0bWwocmF3RGVzYylcbiAgICAgICAgICA6IHJhd0Rlc2NcbiAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3QgcmF3VGl0bGUgPSBzLnRpdGxlID8/IHMuam9iVGl0bGU7XG4gICAgICBjb25zdCBqb2JUaXRsZSA9XG4gICAgICAgIHJhd1RpdGxlICE9IG51bGwgJiYgU3RyaW5nKHJhd1RpdGxlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcocmF3VGl0bGUpLnRyaW0oKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHRoaXMuZ2V0U3BlYWtlckRpc3BsYXlOYW1lKHMpLFxuICAgICAgICBjb21wYW55OlxuICAgICAgICAgIHMuY29tcGFueSAhPSBudWxsICYmIFN0cmluZyhzLmNvbXBhbnkpLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKHMuY29tcGFueSkudHJpbSgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGpvYlRpdGxlLFxuICAgICAgICBwaG90bzogdGhpcy5nZXRTcGVha2VyUGhvdG9VcmwocyksXG4gICAgICAgIGlkOiBzLmlkID8/IHMudXNlcklkID8/IHMuX2lkID8/IHMuc3BlYWtlcklkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJlc3RzOlxuICAgICAgICAgIHMuaW50ZXJlc3RzICE9IG51bGwgJiYgU3RyaW5nKHMuaW50ZXJlc3RzKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IFN0cmluZyhzLmludGVyZXN0cykudHJpbSgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB1c2VyVmlkZW9zTW9kZWw6IHMudXNlclZpZGVvc01vZGVsXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHVybDpcbiAgICAgICAgICAgICAgICBzLnVzZXJWaWRlb3NNb2RlbD8udXJsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBTdHJpbmcocy51c2VyVmlkZW9zTW9kZWwudXJsKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICAgICAgICA/IFN0cmluZyhzLnVzZXJWaWRlb3NNb2RlbC51cmwpLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICB0aHVtYm5haWw6XG4gICAgICAgICAgICAgICAgcy51c2VyVmlkZW9zTW9kZWw/LnRodW1ibmFpbCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgU3RyaW5nKHMudXNlclZpZGVvc01vZGVsLnRodW1ibmFpbCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgPyBTdHJpbmcocy51c2VyVmlkZW9zTW9kZWwudGh1bWJuYWlsKS50cmltKClcbiAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgbWFwU3BvbnNvcnNUb0NhcmREYXRhKHNwb25zb3JzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3BvbnNvcnMpKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHNwb25zb3JzLm1hcCgoczogYW55KSA9PiB7XG4gICAgICBjb25zdCByYXdEZXNjID1cbiAgICAgICAgcy5ib290aERlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKHMuYm9vdGhEZXNjcmlwdGlvbikudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHMuYm9vdGhEZXNjcmlwdGlvbikudHJpbSgpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSByYXdEZXNjXG4gICAgICAgID8gLzxbYS16XVtcXHNcXFNdKj4vaS50ZXN0KHJhd0Rlc2MpXG4gICAgICAgICAgPyB0aGlzLnN0cmlwSHRtbChyYXdEZXNjKVxuICAgICAgICAgIDogcmF3RGVzY1xuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCB1cmxTbHVnID1cbiAgICAgICAgcy51cmwgPz9cbiAgICAgICAgcy5ib290aFVybCA/P1xuICAgICAgICAocy5ib290aElEICE9IG51bGwgPyBTdHJpbmcocy5ib290aElEKSA6IG51bGwpID8/XG4gICAgICAgIChzLmJvb3RoSWQgIT0gbnVsbCA/IFN0cmluZyhzLmJvb3RoSWQpIDogbnVsbCk7XG4gICAgICBjb25zdCBsb2dvVXJsID1cbiAgICAgICAgcy5sb2dvVXJsICE9IG51bGwgJiYgU3RyaW5nKHMubG9nb1VybCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHMubG9nb1VybCkudHJpbSgpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogcy5uYW1lICE9IG51bGwgPyBTdHJpbmcocy5uYW1lKS50cmltKCkgOiAnJyxcbiAgICAgICAgd2Vic2l0ZTpcbiAgICAgICAgICBzLndlYnNpdGUgIT0gbnVsbCAmJiBTdHJpbmcocy53ZWJzaXRlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IFN0cmluZyhzLndlYnNpdGUpLnRyaW0oKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBjYXRlZ29yeTogcy5jYXRlZ29yeSAhPSBudWxsID8gU3RyaW5nKHMuY2F0ZWdvcnkpLnRyaW0oKSA6IG51bGwsXG4gICAgICAgIGJvb3RoSUQ6IHMuYm9vdGhJRCA/PyBzLmJvb3RoSWQgPz8gbnVsbCxcbiAgICAgICAgYm9vdGhUaXRsZTogcy5ib290aFRpdGxlICE9IG51bGwgPyBTdHJpbmcocy5ib290aFRpdGxlKS50cmltKCkgOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgICAgIC8qKiBCb290aCBVUkwgc2x1ZyBmb3Igcm91dGluZyB0byBkZXRhaWwgcGFnZSAoZS5nLiBldmVudHMvOmV2ZW50VXJsL3Nwb25zb3JzL2Jvb3Rocy86dXJsKS4gKi9cbiAgICAgICAgdXJsOiB1cmxTbHVnICE9IG51bGwgPyBTdHJpbmcodXJsU2x1ZykudHJpbSgpIDogbnVsbCxcbiAgICAgICAgbG9nb1VybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGdldF9ldmVudF9ib290aHMgcmVzdWx0cyBpbnRvIHRoZSBzYW1lIHNoYXBlIHVzZWQgYnkgc3BvbnNvciBjYXJkcy5cbiAgICovXG4gIG1hcEJvb3Roc1RvQ2FyZERhdGEoYm9vdGhzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYm9vdGhzKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBib290aHMubWFwKChiOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHJhd0Rlc2MgPVxuICAgICAgICBiLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKGIuZGVzY3JpcHRpb24pLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICA/IFN0cmluZyhiLmRlc2NyaXB0aW9uKS50cmltKClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHJhd0Rlc2NcbiAgICAgICAgPyAvPFthLXpdW1xcc1xcU10qPi9pLnRlc3QocmF3RGVzYylcbiAgICAgICAgICA/IHRoaXMuc3RyaXBIdG1sKHJhd0Rlc2MpXG4gICAgICAgICAgOiByYXdEZXNjXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGNvbnN0IHVybFNsdWcgPVxuICAgICAgICBiLnVybCA/P1xuICAgICAgICBiLmJvb3RoVXJsID8/XG4gICAgICAgIChiLmJvb3RoSWQgIT0gbnVsbCA/IFN0cmluZyhiLmJvb3RoSWQpIDogbnVsbCkgPz9cbiAgICAgICAgKGIuYm9vdGhJRCAhPSBudWxsID8gU3RyaW5nKGIuYm9vdGhJRCkgOiBudWxsKTtcbiAgICAgIGNvbnN0IGxvZ29VcmwgPVxuICAgICAgICBiLmxvZ29VcmwgIT0gbnVsbCAmJiBTdHJpbmcoYi5sb2dvVXJsKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgPyBTdHJpbmcoYi5sb2dvVXJsKS50cmltKClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBiLmNvbXBhbnkgIT0gbnVsbCA/IFN0cmluZyhiLmNvbXBhbnkpLnRyaW0oKSA6ICcnLFxuICAgICAgICB3ZWJzaXRlOlxuICAgICAgICAgIGIud2Vic2l0ZSAhPSBudWxsICYmIFN0cmluZyhiLndlYnNpdGUpLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKGIud2Vic2l0ZSkudHJpbSgpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGNhdGVnb3J5OiBudWxsLFxuICAgICAgICBib290aElEOiBiLmJvb3RoSWQgPz8gYi5ib290aElEID8/IG51bGwsXG4gICAgICAgIGJvb3RoVGl0bGU6IGIuYm9vdGhUaXRsZSAhPSBudWxsID8gU3RyaW5nKGIuYm9vdGhUaXRsZSkudHJpbSgpIDogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICAvKiogQm9vdGggVVJMIHNsdWcgZm9yIHJvdXRpbmcgdG8gZGV0YWlsIHBhZ2UgKGUuZy4gZXZlbnRzLzpldmVudFVybC9zcG9uc29ycy9ib290aHMvOnVybCkuICovXG4gICAgICAgIHVybDogdXJsU2x1ZyAhPSBudWxsID8gU3RyaW5nKHVybFNsdWcpLnRyaW0oKSA6IG51bGwsXG4gICAgICAgIGxvZ29VcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBnZXRfYm9vdGhfcmVwcmVzZW50YXRpdmVzIHJlc3VsdHMgaW50byB0aGUgc2FtZSBzaGFwZSBhcyBhdHRlbmRlZSBjYXJkcyAoZm9yIHJldXNlIG9mIGF0dGVuZGVlIGRlc2lnbikuXG4gICAqL1xuICBtYXBCb290aFJlcHNUb0NhcmREYXRhKHJlcHJlc2VudGF0aXZlczogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcHJlc2VudGF0aXZlcykpIHJldHVybiBbXTtcbiAgICByZXR1cm4gcmVwcmVzZW50YXRpdmVzLm1hcCgocjogYW55KSA9PiB7XG4gICAgICBjb25zdCBmaXJzdCA9IHIuZmlyc3ROYW1lICE9IG51bGwgPyBTdHJpbmcoci5maXJzdE5hbWUpLnRyaW0oKSA6ICcnO1xuICAgICAgY29uc3QgbGFzdCA9IHIubGFzdE5hbWUgIT0gbnVsbCA/IFN0cmluZyhyLmxhc3ROYW1lKS50cmltKCkgOiAnJztcbiAgICAgIGNvbnN0IG5hbWUgPSBbZmlyc3QsIGxhc3RdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfHwgJyc7XG4gICAgICBjb25zdCB1c2VySWQgPVxuICAgICAgICByLnVzZXJJZCAhPSBudWxsICYmIFN0cmluZyhyLnVzZXJJZCkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgID8gU3RyaW5nKHIudXNlcklkKS50cmltKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNvbXBhbnk6XG4gICAgICAgICAgci5jb21wYW55ICE9IG51bGwgJiYgU3RyaW5nKHIuY29tcGFueSkudHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgPyBTdHJpbmcoci5jb21wYW55KS50cmltKClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgam9iVGl0bGU6XG4gICAgICAgICAgci5qb2JUaXRsZSAhPSBudWxsICYmIFN0cmluZyhyLmpvYlRpdGxlKS50cmltKCkgIT09ICcnXG4gICAgICAgICAgICA/IFN0cmluZyhyLmpvYlRpdGxlKS50cmltKClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgcGhvdG86XG4gICAgICAgICAgci5waG90b1BhdGggIT0gbnVsbCAmJiBTdHJpbmcoci5waG90b1BhdGgpLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKHIucGhvdG9QYXRoKS50cmltKClcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgICAgaW50ZXJlc3RzOiBudWxsLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICByLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgU3RyaW5nKHIuZGVzY3JpcHRpb24pLnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgID8gU3RyaW5nKHIuZGVzY3JpcHRpb24pLnRyaW0oKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB1c2VyVmlkZW9zTW9kZWw6IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGdldF9ldmVudF9zZXNzaW9uc192MiBwbGFpbi10ZXh0IGNvbnRlbnQgaW50byBzZXNzaW9uIG9iamVjdHMgZm9yIGNhcmRzLlxuICAgKiBGb3JtYXQ6IFwiRm91bmQgTiBzZXNzaW9uczpcXG4xLiA8dGl0bGU+XFxuICAgLSBUaW1lOiBTdGFydDogLi4uLCBFbmQ6IC4uLiwgVGltZVpvbmU6IC4uLlxcbiAgIC0gUm9vbTogLi4uXFxuICAgLSBUeXBlOiAuLi5cXG4yLiAuLi5cIlxuICAgKi9cbiAgcGFyc2VTZXNzaW9uQ29udGVudFYyKGNvbnRlbnQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSByZXR1cm4gW107XG4gICAgY29uc3Qgc2Vzc2lvbnM6IGFueVtdID0gW107XG4gICAgLy8gU3BsaXQgaW50byBibG9ja3MgYnkgXCIxLiBcIiwgXCIyLiBcIiwgZXRjLiAobnVtYmVyICsgZG90ICsgc3BhY2UgYXQgbGluZSBzdGFydClcbiAgICBjb25zdCBibG9ja1JlZ2V4ID0gL1xcblxcZCtcXC5cXHMrLztcbiAgICBjb25zdCBwYXJ0cyA9IGNvbnRlbnQuc3BsaXQoYmxvY2tSZWdleCk7XG4gICAgLy8gRmlyc3QgcGFydCBtYXkgYmUgXCJGb3VuZCBOIHNlc3Npb25zOlwiIG9yIHNpbWlsYXI7IHNraXAgaWYgaXQgZG9lc24ndCBsb29rIGxpa2UgYSBzZXNzaW9uIHRpdGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYmxvY2sgPSBwYXJ0c1tpXS50cmltKCk7XG4gICAgICBpZiAoIWJsb2NrKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGxpbmVzID0gYmxvY2tcbiAgICAgICAgLnNwbGl0KC9cXG4vKVxuICAgICAgICAubWFwKChsKSA9PiBsLnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gbGluZXNbMF0gfHwgJyc7XG4gICAgICBpZiAoIXRpdGxlIHx8IC9eRm91bmRcXHMrXFxkK1xccytzZXNzaW9ucy9pLnRlc3QodGl0bGUpKSBjb250aW51ZTtcbiAgICAgIGxldCBkYXRlVGltZVJhbmdlID0gJyc7XG4gICAgICBsZXQgcm9vbU5hbWUgPSAnJztcbiAgICAgIGxldCBzZXNzaW9uVHlwZSA9ICcnO1xuICAgICAgbGV0IHRpbWVab25lID0gJyc7XG4gICAgICBmb3IgKGxldCBqID0gMTsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tqXTtcbiAgICAgICAgY29uc3QgdGltZU1hdGNoID0gbGluZS5tYXRjaCgvVGltZTpcXHMqKC4rKS9pKTtcbiAgICAgICAgaWYgKHRpbWVNYXRjaCkge1xuICAgICAgICAgIGRhdGVUaW1lUmFuZ2UgPSB0aW1lTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHR6TWF0Y2ggPSBkYXRlVGltZVJhbmdlLm1hdGNoKC9UaW1lWm9uZTpcXHMqKFteLFxcbl0rKS9pKTtcbiAgICAgICAgICBpZiAodHpNYXRjaCkgdGltZVpvbmUgPSB0ek1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb29tTWF0Y2ggPSBsaW5lLm1hdGNoKC9Sb29tOlxccyooLispL2kpO1xuICAgICAgICBpZiAocm9vbU1hdGNoKSB7XG4gICAgICAgICAgcm9vbU5hbWUgPSByb29tTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGVNYXRjaCA9IGxpbmUubWF0Y2goL1R5cGU6XFxzKiguKykvaSk7XG4gICAgICAgIGlmICh0eXBlTWF0Y2gpIHtcbiAgICAgICAgICBzZXNzaW9uVHlwZSA9IHR5cGVNYXRjaFsxXS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHpMaW5lTWF0Y2ggPSBsaW5lLm1hdGNoKC9UaW1lWm9uZTpcXHMqKC4rKS9pKTtcbiAgICAgICAgaWYgKHR6TGluZU1hdGNoICYmICF0aW1lWm9uZSkgdGltZVpvbmUgPSB0ekxpbmVNYXRjaFsxXS50cmltKCk7XG4gICAgICB9XG4gICAgICBzZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIHJvb21OYW1lOiByb29tTmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVUaW1lUmFuZ2U6IGRhdGVUaW1lUmFuZ2UgfHwgdW5kZWZpbmVkLFxuICAgICAgICBzZXNzaW9uVHlwZTogc2Vzc2lvblR5cGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICB0aW1lWm9uZTogdGltZVpvbmUgfHwgdW5kZWZpbmVkLFxuICAgICAgICBzZXNzaW9uUm9sZXM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzZXNzaW9ucztcbiAgfVxuXG4gIGdldFZpc2libGVTZXNzaW9uQ2FyZHMoY2hhdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGxpc3QgPSBjaGF0Py5zZXNzaW9uQ2FyZHMgPz8gW107XG4gICAgY29uc3QgdG90YWwgPSBsaXN0Lmxlbmd0aDtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRTZXNzaW9uQ2FyZElkc1tjaGF0Py5faWRdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHRvdGFsIC0gdGhpcy5TRVNTSU9OX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLlNFU1NJT05fQ0FSRFNfSU5JVElBTCk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgZ2V0VmlzaWJsZUF0dGVuZGVlQ2FyZHMoY2hhdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGxpc3QgPSBjaGF0Py5hdHRlbmRlZUNhcmRzID8/IFtdO1xuICAgIGNvbnN0IHRvdGFsID0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkQXR0ZW5kZWVDYXJkSWRzW2NoYXQ/Ll9pZF07XG4gICAgY29uc3QgcmVtYWluaW5nID0gdG90YWwgLSB0aGlzLkFUVEVOREVFX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLkFUVEVOREVFX0NBUkRTX0lOSVRJQUwpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGdldFZpc2libGVTcGVha2VyQ2FyZHMoY2hhdDogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGxpc3QgPSBjaGF0Py5zcGVha2VyQ2FyZHMgPz8gW107XG4gICAgY29uc3QgdG90YWwgPSBsaXN0Lmxlbmd0aDtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRTcGVha2VyQ2FyZElkc1tjaGF0Py5faWRdO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IHRvdGFsIC0gdGhpcy5TUEVBS0VSX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLlNQRUFLRVJfQ0FSRFNfSU5JVElBTCk7XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgZ2V0VmlzaWJsZVNwb25zb3JDYXJkcyhjaGF0OiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgbGlzdCA9IGNoYXQ/LnNwb25zb3JDYXJkcyA/PyBbXTtcbiAgICBjb25zdCB0b3RhbCA9IGxpc3QubGVuZ3RoO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZFNwb25zb3JDYXJkSWRzW2NoYXQ/Ll9pZF07XG4gICAgY29uc3QgcmVtYWluaW5nID0gdG90YWwgLSB0aGlzLlNQT05TT1JfQ0FSRFNfSU5JVElBTDtcbiAgICBpZiAocmVtYWluaW5nID4gNCAmJiAhZXhwYW5kZWQpIHtcbiAgICAgIHJldHVybiBsaXN0LnNsaWNlKDAsIHRoaXMuU1BPTlNPUl9DQVJEU19JTklUSUFMKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBnZXRWaXNpYmxlQm9vdGhSZXBDYXJkcyhjaGF0OiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgbGlzdCA9IGNoYXQ/LmJvb3RoUmVwQ2FyZHMgPz8gW107XG4gICAgY29uc3QgdG90YWwgPSBsaXN0Lmxlbmd0aDtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRCb290aFJlcENhcmRJZHNbY2hhdD8uX2lkXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSB0b3RhbCAtIHRoaXMuQk9PVEhfUkVQX0NBUkRTX0lOSVRJQUw7XG4gICAgaWYgKHJlbWFpbmluZyA+IDQgJiYgIWV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLkJPT1RIX1JFUF9DQVJEU19JTklUSUFMKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICBleHBhbmRTZXNzaW9uQ2FyZHMoY2hhdDogYW55KTogdm9pZCB7XG4gICAgaWYgKGNoYXQ/Ll9pZCkge1xuICAgICAgdGhpcy5leHBhbmRlZFNlc3Npb25DYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkU2Vzc2lvbkNhcmRJZHMsXG4gICAgICAgIFtjaGF0Ll9pZF06IHRydWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kQXR0ZW5kZWVDYXJkcyhjaGF0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhdD8uX2lkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQXR0ZW5kZWVDYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkQXR0ZW5kZWVDYXJkSWRzLFxuICAgICAgICBbY2hhdC5faWRdOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGV4cGFuZFNwZWFrZXJDYXJkcyhjaGF0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhdD8uX2lkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkU3BlYWtlckNhcmRJZHMgPSB7XG4gICAgICAgIC4uLnRoaXMuZXhwYW5kZWRTcGVha2VyQ2FyZElkcyxcbiAgICAgICAgW2NoYXQuX2lkXTogdHJ1ZSxcbiAgICAgIH07XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBleHBhbmRTcG9uc29yQ2FyZHMoY2hhdDogYW55KTogdm9pZCB7XG4gICAgaWYgKGNoYXQ/Ll9pZCkge1xuICAgICAgdGhpcy5leHBhbmRlZFNwb25zb3JDYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkU3BvbnNvckNhcmRJZHMsXG4gICAgICAgIFtjaGF0Ll9pZF06IHRydWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kQm9vdGhSZXBDYXJkcyhjaGF0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoY2hhdD8uX2lkKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQm9vdGhSZXBDYXJkSWRzID0ge1xuICAgICAgICAuLi50aGlzLmV4cGFuZGVkQm9vdGhSZXBDYXJkSWRzLFxuICAgICAgICBbY2hhdC5faWRdOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3Igc2Vzc2lvbiB0eXBlIG9uIGNhcmRzOiBcIlNlc3Npb24gdHlwZVwiIHdoZW4gaXNVbkV2ZW50LCBlbHNlIFwiTWVldGluZyB0eXBlXCIuXG4gICAqL1xuICBnZXRTZXNzaW9uVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNVbkV2ZW50XG4gICAgICA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ01lZXRpbmcgdHlwZScpIHx8ICdNZWV0aW5nIHR5cGUnXG4gICAgICA6IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ1Nlc3Npb24gdHlwZScpIHx8ICdTZXNzaW9uIHR5cGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBKb2luL1dhdGNoIHJvbGUgYnV0dG9ucyBmcm9tIHNlc3Npb24uc2Vzc2lvblJvbGVzIGZvciBzZXNzaW9uIGNhcmRzLlxuICAgKiBXaGVuIGlzVW5FdmVudCBpcyBmYWxzZSwgcmV0dXJucyBzaW5nbGUgXCJXYXRjaFwiIGJ1dHRvbiAoc2FtZSBhcyB0ZW1wbGF0ZTIpLiBXaGVuIHRydWUsIHJldHVybnMgSm9pbi9XYXRjaCBmcm9tIHNlc3Npb25Sb2xlcy5cbiAgICovXG4gIGdldFNlc3Npb25Sb2xlQnV0dG9ucyhzZXNzaW9uQ2FyZDogYW55KTogeyBhY3Rpb246IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10ge1xuICAgIGlmICh0aGlzLmlzVW5FdmVudCA9PT0gZmFsc2UgJiYgc2Vzc2lvbkNhcmQ/LnNlc3Npb24pIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246ICdqb2luJyxcbiAgICAgICAgICBsYWJlbDogdGhpcy5nZXRUcmFuc2xhdGlvbignV2F0Y2gnKSB8fCAnV2F0Y2gnLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gc2Vzc2lvbkNhcmQ/LnNlc3Npb24/LnNlc3Npb25Sb2xlcztcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmF3KSB8fCByYXcubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3Qgcm9sZXM6IHsgYWN0aW9uOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHJhdykge1xuICAgICAgY29uc3QgbmFtZSA9XG4gICAgICAgIHR5cGVvZiByID09PSAnb2JqZWN0JyAmJiByICE9IG51bGwgJiYgci5zZXNzaW9uUm9sZU5hbWVcbiAgICAgICAgICA/IFN0cmluZyhyLnNlc3Npb25Sb2xlTmFtZSkudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IFN0cmluZyhyKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChuYW1lID09PSAnam9pbicgfHwgbmFtZSA9PT0gJ3dhdGNoJykge1xuICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgbmFtZSA9PT0gJ2pvaW4nXG4gICAgICAgICAgICA/IHRoaXMuZ2V0VHJhbnNsYXRpb24oJ0pvaW4nKSB8fCAnSm9pbidcbiAgICAgICAgICAgIDogdGhpcy5nZXRUcmFuc2xhdGlvbignV2F0Y2gnKSB8fCAnV2F0Y2gnO1xuICAgICAgICByb2xlcy5wdXNoKHsgYWN0aW9uOiBuYW1lLCBsYWJlbCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHNlc3Npb24gaXMgb24tZGVtYW5kIChjbGFzc2lmaWNhdGlvbklkID09PSBlQ2xhc3NpZmljYXRpb25UeXBlLk9uRGVtYW5kKS5cbiAgICogV2hlbiB0cnVlLCBKb2luL1dhdGNoIGFyZSBhbHdheXMgYWN0aW9uYWJsZSBhbmQgY2FyZCB1c2VzIE9uRGVtYW5kIGRlc2lnbi5cbiAgICovXG4gIGlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb25DYXJkOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCBpZCA9XG4gICAgICBzZXNzaW9uQ2FyZD8uc2Vzc2lvbj8uY2xhc3NpZmljYXRpb25JZCA/PyBzZXNzaW9uQ2FyZD8uY2xhc3NpZmljYXRpb25JZDtcbiAgICBpZiAoaWQgPT0gbnVsbCB8fCBpZCA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gU3RyaW5nKGlkKSA9PT0gZUNsYXNzaWZpY2F0aW9uVHlwZS5PbkRlbWFuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEpvaW4vV2F0Y2ggYWN0aW9uIGlzIHBvc3NpYmxlIChzYW1lIGxvZ2ljIGFzIGFwcCB0ZW1wbGF0ZTgpLlxuICAgKiBBY3Rpb24gaXMgYWxsb3dlZCB3aGVuOiBvbi1kZW1hbmQgc2Vzc2lvbiBPUiBpc0J1dHRvbkFjdGl2YXRlZCAoc2Vzc2lvbiBoYXMgc3RhcnRlZCkuXG4gICAqL1xuICBjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uQ2FyZDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzZXNzaW9uQ2FyZD8uc2Vzc2lvbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHMgPSBzZXNzaW9uQ2FyZC5zZXNzaW9uO1xuICAgIGlmICh0aGlzLmlzU2Vzc2lvbk9uZGVtYW5kKHNlc3Npb25DYXJkKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhcy5pc0J1dHRvbkFjdGl2YXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1lIGxvZ2ljIGFzIGFwcCB0ZW1wbGF0ZTg6IGRlbGF5IGluIG1pbnV0ZXMgKHNjaGVkdWxlZCBzdGFydCAtIGFjdHVhbCBzdGFydCkuXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIGVpdGhlciBkYXRlIG1pc3Npbmc7ID4gMCB3aGVuIG1lZXRpbmcgaXMgZGVsYXllZC5cbiAgICovXG4gIGdldE1lZXRpbmdEZWxheU1pbnV0ZXMoc2Vzc2lvbkNhcmQ6IGFueSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcyA9IHNlc3Npb25DYXJkPy5zZXNzaW9uO1xuICAgIGlmICghcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGFydERhdGUgPSBzLmRhdGVUaW1lUmFuZ2U/LnN0YXJ0O1xuICAgIGNvbnN0IGFjdHVhbFN0YXJ0ID0gcy5hY3R1YWxEYXRlVGltZVJhbmdlPy5zdGFydDtcbiAgICBpZiAoIXN0YXJ0RGF0ZSB8fCAhYWN0dWFsU3RhcnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRpZmZNcyA9XG4gICAgICAgIG5ldyBEYXRlKHN0YXJ0RGF0ZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYWN0dWFsU3RhcnQpLmdldFRpbWUoKTtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKGRpZmZNcyAvICgxMDAwICogNjApKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBtZWV0aW5nIGlzIGRlbGF5ZWQgKHNhbWUgY29uZGl0aW9uIGFzIHRlbXBsYXRlODogZGVsYXkgbWludXRlcyA+IDAsIG5vdCBvbi1kZW1hbmQsIGJ1dHRvbiBub3QgYWN0aXZhdGVkKS4gKi9cbiAgaXNNZWV0aW5nRGVsYXllZChzZXNzaW9uQ2FyZDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLmdldE1lZXRpbmdEZWxheU1pbnV0ZXMoc2Vzc2lvbkNhcmQpO1xuICAgIGlmIChkZWxheSA9PSBudWxsIHx8IGRlbGF5IDw9IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc1Nlc3Npb25PbmRlbWFuZChzZXNzaW9uQ2FyZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoc2Vzc2lvbkNhcmQ/LnNlc3Npb24/LmlzQnV0dG9uQWN0aXZhdGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblNlc3Npb25DYXJkQWN0aW9uKFxuICAgIHNlc3Npb25DYXJkOiBhbnksXG4gICAgcm9sZTogeyBhY3Rpb246IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9LFxuICApOiB2b2lkIHtcbiAgICBpZiAoIXNlc3Npb25DYXJkPy5zZXNzaW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNVbkV2ZW50ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZXNzaW9uQWN0aW9ucy5lbWl0KHtcbiAgICAgICAgdHlwZTogJ3Nlc3Npb24nLFxuICAgICAgICBhY3Rpb246IHJvbGUuYWN0aW9uLFxuICAgICAgICBzZXNzaW9uOiBzZXNzaW9uQ2FyZC5zZXNzaW9uLFxuICAgICAgICBzZXNzaW9uQ2FyZCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jbG9zZUNoYXREcmF3ZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNhblBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb25DYXJkKSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIHRoaXMuZ2V0VHJhbnNsYXRpb24oJ1lvdSBjYW4gam9pbi93YXRjaCBhdCB0aGUgc3RhcnRpbmcgdGltZScpIHx8XG4gICAgICAgICdZb3UgY2FuIGpvaW4vd2F0Y2ggYXQgdGhlIHN0YXJ0aW5nIHRpbWUnO1xuICAgICAgdGhpcy5zZXNzaW9uQWN0aW9uQmxvY2tlZC5lbWl0KG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlc3Npb25BY3Rpb25zLmVtaXQoe1xuICAgICAgdHlwZTogJ3Nlc3Npb24nLFxuICAgICAgYWN0aW9uOiByb2xlLmFjdGlvbixcbiAgICAgIHNlc3Npb246IHNlc3Npb25DYXJkLnNlc3Npb24sXG4gICAgICBzZXNzaW9uQ2FyZCxcbiAgICB9KTtcbiAgICB0aGlzLmNsb3NlQ2hhdERyYXdlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZUNoYXREcmF3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYm9keU92ZXJmbG93Q2xhc3MpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRyYXdlcj8uY2xvc2UoKTtcbiAgICAgIHRoaXMuc291cmNlc0RyYXdlcj8uY2xvc2UoKTtcbiAgICAgIHRoaXMuZWRpdG9yc0RyYXdlcj8uY2xvc2UoKTtcbiAgICB9IGNhdGNoIHt9XG4gICAgdGhpcy5jbG9zZUJvdC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy52b2ljZVRyYW5zY3JpcHRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuZGlzY29ubmVjdEFza1dlYlNvY2tldCgpO1xuICB9XG4gIGNoYW5nZVRlbXBlcmF0dXJlKG5ld1RlbXBlcmF0dXJlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy50ZW1wZXJhdHVyZSA9IG5ld1RlbXBlcmF0dXJlO1xuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGl2ZWdwdC1jaGF0LWJvdC13cmFwcGVyJyk7XG4gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHRoZW1lIGNsYXNzZXMgZnJvbSBib2R5XG4gICAgd3JhcHBlcj8uY2xhc3NMaXN0LnJlbW92ZSgnY3JlYXRpdmUnLCAnYmFsYW5jZWQnLCAncHJlY2lzZScpO1xuXG4gICAgc3dpdGNoIChuZXdUZW1wZXJhdHVyZSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICB3cmFwcGVyPy5jbGFzc0xpc3QuYWRkKCdjcmVhdGl2ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgd3JhcHBlcj8uY2xhc3NMaXN0LmFkZCgnYmFsYW5jZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHdyYXBwZXI/LmNsYXNzTGlzdC5hZGQoJ3ByZWNpc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblN0YXJ0QWdhaW4oKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIHRoaXMuc2hvd1N0YXJ0QWdhaW4gPSBmYWxzZTtcbiAgICB0aGlzLmNoYXRMb2cgPSBbXTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTogdGhpcy5ncmVldGluZ01zZyxcblxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgIH0pO1xuICAgIHRoaXMuYXJjaGl2ZU1lc3NhZ2VzKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhcmNoaXZlTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSxcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3QvY2xlYXItaGlzdG9yeS8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCB7fSwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBvZihyZXMpO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgdHJpZ2dlclN1cHBvcnQoKSB7XG4gICAgdGhpcy5vcGVuU3VwcG9ydC5lbWl0KCk7XG4gIH1cbiAgZmV0Y2hCb3RDb25maWcoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vYm90cz9ib3RfaWQ9JHt0aGlzLmJvdElkfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IGhlYWRlcnMgfSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ib3ROYW1lID0gdGhpcy5nZXRUcmFuc2xhdGlvbihyZXMuTmFtZSk7XG4gICAgICAgIHRoaXMuYm90SWNvbiA9IHJlcy5JY29uO1xuICAgICAgICB0aGlzLmJvdFNraWxscyA9IHJlcz8uU2tpbGxzO1xuICAgICAgICB0aGlzLmdyZWV0aW5nTXNnID0gcmVzLkdyZWV0aW5nXG4gICAgICAgICAgPyAodGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkocmVzLkdyZWV0aW5nKSBhcyBhbnkpXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICB0aGlzLnRodW1ic0Rvd25NZXNzYWdlcyA9IHJlcz8uTmVnYXRpdmVSZXNwb25zZXM/Lmxlbmd0aFxuICAgICAgICAgID8gcmVzLk5lZ2F0aXZlUmVzcG9uc2VzXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VHJhbnNsYXRpb24oXG4gICAgICAgICAgICAgICAgYFdlIGFyZSBzb3JyeSB3ZSd2ZSBub3QgYmVlbiBhYmxlIHRvIGFuc3dlciB5b3VyIHF1ZXN0aW9uYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIHRoaXMucXVpY2tQcm9tcHRzID0gcmVzLlF1aWNrUHJvbXB0cztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmZXRjaENoYXRIaXN0b3J5KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuY29udmVyc2F0aW9uS2V5ID0gdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleShcbiAgICAgIHRoaXMuYm90SWQsXG4gICAgICBmYWxzZSxcbiAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICApO1xuICAgIHRoaXMuY29uU2Vzc2lvbktleSA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRTZXNzaW9uS2V5KFxuICAgICAgdGhpcy5ib3RJZCxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhpcy5ldmVudElkLFxuICAgICk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5CQVNFX1VSTH0vY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uS2V5fT9zZXNzaW9uX2lkPSR7dGhpcy5jb25TZXNzaW9uS2V5fWA7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAnZG9tYWluLWF1dGhvcml0eSc6IHRoaXMuZG9tYWluQXV0aG9yaXR5VmFsdWUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KHVybCwgeyBoZWFkZXJzIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3I8YW55PignZmV0Y2hDb252ZXJzYXRpb24nKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcjxUPihvcGVyYXRpb24gPSAnb3BlcmF0aW9uJywgcmVzdWx0PzogVCkge1xuICAgIHJldHVybiAoZXJyb3I6IGFueSk6IE9ic2VydmFibGU8VD4gPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihgJHtvcGVyYXRpb259IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIG9mKHJlc3VsdCBhcyBUKTtcbiAgICB9O1xuICB9XG4gIC8vIGZldGNoQ2hhdEhpc3RvcnkoKSB7XG4gIC8vICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgLy8gICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gIC8vICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gIC8vICAgfSk7XG4gIC8vICAgcmV0dXJuIHRoaXMuaHR0cFxuICAvLyAgICAgLmdldChgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25LZXl9YCwgeyBoZWFkZXJzIH0pXG4gIC8vICAgICAucGlwZShcbiAgLy8gICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAvLyAgICAgICAgIHJldHVybiBvZihyZXMpO1xuICAvLyAgICAgICB9KSxcbiAgLy8gICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAvLyAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXQgaGlzdG9yeTogJywgZXJyb3IpO1xuICAvLyAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAvLyAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgLy8gICAgICAgfSlcbiAgLy8gICAgICk7XG4gIC8vIH1cblxuICAvKiogUHVzaCBhIHN0YW5kYXJkIEFJIG1lc3NhZ2UgZnJvbSBoaXN0b3J5IChzb3VyY2VzLCBncmFwaHMsIGV0Yy4pLiBVc2VkIHdoZW4gbm90IGNvbnZlcnRpbmcgdG8gc2Vzc2lvbl9jYXJkcy4gKi9cbiAgcHJpdmF0ZSBwdXNoQWlNZXNzYWdlRnJvbUhpc3RvcnkoY2hhdDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc291cmNlc0xpc3QgPSBjaGF0LldlYkxpbmtzIHx8IFtdO1xuICAgIGNvbnN0IGRpc3BsYXllZFNvdXJjZXMgPSAoY2hhdC5XZWJMaW5rcyB8fCBbXSkuc2xpY2UoMCwgMyk7XG4gICAgY29uc3QgcmVtYWluaW5nU291cmNlcyA9IChjaGF0LldlYkxpbmtzIHx8IFtdKS5zbGljZSgzKTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAnYWknLFxuICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KSxcbiAgICAgIGV4ZWN1dGlvbkdyYXBoczogY2hhdC5FeGVjdXRpb25HcmFwaHMsXG4gICAgICBncmFwaHM6IGNoYXQuR3JhcGhzLFxuICAgICAgc2VhcmNoVGVybXM6IGNoYXQuU2VhcmNoVGVybXMsXG4gICAgICBzb3VyY2VzTGlzdDogc291cmNlc0xpc3QsXG4gICAgICBkaXNwbGF5ZWRTb3VyY2VzOiBkaXNwbGF5ZWRTb3VyY2VzLFxuICAgICAgcmVtYWluaW5nU291cmNlczogcmVtYWluaW5nU291cmNlcyxcbiAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgIH0pO1xuICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICB9XG5cbiAgbWFwQ2hhdEhpc3RvcnkoY2hhdHM6IGFueSkge1xuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICdhaScsXG4gICAgICBtZXNzYWdlOiB0aGlzLmdyZWV0aW5nTXNnLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgIH0pO1xuICAgIGlmIChjaGF0cyAmJiBjaGF0cz8uTWVzc2FnZXM/Lmxlbmd0aCkge1xuICAgICAgY2hhdHM/Lk1lc3NhZ2VzLmZvckVhY2goKGNoYXQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2hhdC5UeXBlID09ICd1c2VyJykge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dCksXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXRUaW1lU3RhbXBzKHRoaXMudGltZXpvbmUsIGNoYXQuSW5zZXJ0VGltZXN0YW1wKSxcbiAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICAgICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxuICAgICAgICAgICAgV29ya2Zsb3dFeGVjdXRpb25JZDogY2hhdC5Xb3JrZmxvd0V4ZWN1dGlvbklkLFxuICAgICAgICAgICAgX2lkOiBjaGF0Ll9pZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhdC5UeXBlID09ICdhaScpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIEFJIG1lc3NhZ2UgY2FtZSBmcm9tIHNlc3Npb24gdG9vbHMsIHNob3cgc2Vzc2lvbiBjYXJkcyBpbnN0ZWFkIG9mIHBsYWluIHRleHRcbiAgICAgICAgICBjb25zdCB0b29sTmFtZSA9IGNoYXQudG9vbHJlc3VsdHM/LnRvb2xfbmFtZTtcbiAgICAgICAgICBjb25zdCBpc1Nlc3Npb25Ub29sID1cbiAgICAgICAgICAgIHRvb2xOYW1lID09PSAnZ2V0X2V2ZW50X3Nlc3Npb25zJyB8fFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc2Vzc2lvbnNfdjInIHx8XG4gICAgICAgICAgICB0b29sTmFtZSA9PT0gJ2dldF9zZXNzaW9uc19ieV9pbnRlcmVzdCcgfHxcbiAgICAgICAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3Nlc3Npb25zX2J5X3RyYWNrJyB8fFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfc3BlYWtlcl9zZXNzaW9ucycgfHxcbiAgICAgICAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3VwY29taW5nX3Nlc3Npb25zJyB8fFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfbXlfYWdlbmRhJztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1Nlc3Npb25Ub29sICYmXG4gICAgICAgICAgICBjaGF0LnRvb2xyZXN1bHRzPy50b29sX3Jlc3VsdD8ubWVzc2FnZXM/LlswXT8uY29udGVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudFN0ciA9IGNoYXQudG9vbHJlc3VsdHMudG9vbF9yZXN1bHQubWVzc2FnZXNbMF0uY29udGVudDtcbiAgICAgICAgICAgIGxldCBzZXNzaW9uczogYW55W10gPSBbXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgICAgICAgIHNlc3Npb25zID0gcGFyc2VkPy5zZXNzaW9ucyA/PyBbXTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbnMgPSB0aGlzLnBhcnNlU2Vzc2lvbkNvbnRlbnRWMihjb250ZW50U3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwU2Vzc2lvbnNUb0NhcmREYXRhKHNlc3Npb25zKTtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU3BlYWtlcnNGb3JTZXNzaW9uQ2FyZHMobWFwcGVkKTtcbiAgICAgICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgX2lkOiBjaGF0Ll9pZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2Vzc2lvbl9jYXJkcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dClcbiAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgc2Vzc2lvbkNhcmRzOiBtYXBwZWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9hdHRlbmRlZXMnICYmXG4gICAgICAgICAgICBjaGF0LnRvb2xyZXN1bHRzPy50b29sX3Jlc3VsdD8ubWVzc2FnZXM/LlswXT8uY29udGVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBBSSBtZXNzYWdlIGNhbWUgZnJvbSBnZXRfZXZlbnRfYXR0ZW5kZWVzLCBzaG93IGF0dGVuZGVlIGNhcmRzIG9uIGluaXRpYWwgaGlzdG9yeSBsb2FkXG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3RyID0gY2hhdC50b29scmVzdWx0cy50b29sX3Jlc3VsdC5tZXNzYWdlc1swXS5jb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW5kZWVzID0gcGFyc2VkPy5hdHRlbmRlZXMgPz8gW107XG4gICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwQXR0ZW5kZWVzVG9DYXJkRGF0YShhdHRlbmRlZXMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2F0dGVuZGVlX2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoYXQuVGV4dFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dClcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVDYXJkczogbWFwcGVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9zcGVha2VycycgJiZcbiAgICAgICAgICAgIGNoYXQudG9vbHJlc3VsdHM/LnRvb2xfcmVzdWx0Py5tZXNzYWdlcz8uWzBdPy5jb250ZW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIEFJIG1lc3NhZ2UgY2FtZSBmcm9tIGdldF9ldmVudF9zcGVha2Vycywgc2hvdyBzcGVha2VyIGNhcmRzIG9uIGluaXRpYWwgaGlzdG9yeSBsb2FkXG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3RyID0gY2hhdC50b29scmVzdWx0cy50b29sX3Jlc3VsdC5tZXNzYWdlc1swXS5jb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgICAgICAgY29uc3Qgc3BlYWtlcnMgPSBwYXJzZWQ/LnNwZWFrZXJzID8/IHBhcnNlZD8uc3BlYWtlciA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTcGVha2Vyc1RvQ2FyZERhdGEoc3BlYWtlcnMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3NwZWFrZXJfY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgICBzcGVha2VyQ2FyZHM6IG1hcHBlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc3BvbnNvcnMnICYmXG4gICAgICAgICAgICBjaGF0LnRvb2xyZXN1bHRzPy50b29sX3Jlc3VsdD8ubWVzc2FnZXM/LlswXT8uY29udGVudFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBBSSBtZXNzYWdlIGNhbWUgZnJvbSBnZXRfZXZlbnRfc3BvbnNvcnMsIHNob3cgc3BvbnNvciBjYXJkcyBvbiBpbml0aWFsIGhpc3RvcnkgbG9hZFxuICAgICAgICAgICAgY29uc3QgY29udGVudFN0ciA9IGNoYXQudG9vbHJlc3VsdHMudG9vbF9yZXN1bHQubWVzc2FnZXNbMF0uY29udGVudDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgICAgICAgIGNvbnN0IHNwb25zb3JzID0gcGFyc2VkPy5zcG9uc29ycyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTcG9uc29yc1RvQ2FyZERhdGEoc3BvbnNvcnMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Nwb25zb3JfY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgICBzcG9uc29yQ2FyZHM6IG1hcHBlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfYm9vdGhzJyAmJlxuICAgICAgICAgICAgY2hhdC50b29scmVzdWx0cz8udG9vbF9yZXN1bHQ/Lm1lc3NhZ2VzPy5bMF0/LmNvbnRlbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgQUkgbWVzc2FnZSBjYW1lIGZyb20gZ2V0X2V2ZW50X2Jvb3Rocywgc2hvdyBib290aCBjYXJkcyB1c2luZyBzcG9uc29yIGNhcmQgZGVzaWduXG4gICAgICAgICAgICBjb25zdCBjb250ZW50U3RyID0gY2hhdC50b29scmVzdWx0cy50b29sX3Jlc3VsdC5tZXNzYWdlc1swXS5jb250ZW50O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgICAgICAgY29uc3QgYm9vdGhzID0gcGFyc2VkPy5ib290aHMgPz8gW107XG4gICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwQm9vdGhzVG9DYXJkRGF0YShib290aHMpO1xuICAgICAgICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IGNoYXQuX2lkLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Nwb25zb3JfY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hhdC5UZXh0XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoY2hhdC5UZXh0KVxuICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgICAgdGltZTogZm9ybWF0VGltZVN0YW1wcyh0aGlzLnRpbWV6b25lLCBjaGF0Lkluc2VydFRpbWVzdGFtcCksXG4gICAgICAgICAgICAgICAgICBzcG9uc29yQ2FyZHM6IG1hcHBlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSB0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdG9vbE5hbWUgPT09ICdnZXRfYm9vdGhfcmVwcmVzZW50YXRpdmVzJyAmJlxuICAgICAgICAgICAgY2hhdC50b29scmVzdWx0cz8udG9vbF9yZXN1bHQ/Lm1lc3NhZ2VzPy5bMF0/LmNvbnRlbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgQUkgbWVzc2FnZSBjYW1lIGZyb20gZ2V0X2Jvb3RoX3JlcHJlc2VudGF0aXZlcywgc2hvdyBib290aCByZXAgY2FyZHMgKGF0dGVuZGVlIGRlc2lnbilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdHIgPSBjaGF0LnRvb2xyZXN1bHRzLnRvb2xfcmVzdWx0Lm1lc3NhZ2VzWzBdLmNvbnRlbnQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRTdHIpO1xuICAgICAgICAgICAgICBjb25zdCByZXByZXNlbnRhdGl2ZXMgPSBwYXJzZWQ/LnJlcHJlc2VudGF0aXZlcyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBCb290aFJlcHNUb0NhcmREYXRhKHJlcHJlc2VudGF0aXZlcyk7XG4gICAgICAgICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIF9pZDogY2hhdC5faWQsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vdGhfcmVwX2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoYXQuVGV4dFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGNoYXQuVGV4dClcbiAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICAgICAgIHRpbWU6IGZvcm1hdFRpbWVTdGFtcHModGhpcy50aW1lem9uZSwgY2hhdC5JbnNlcnRUaW1lc3RhbXApLFxuICAgICAgICAgICAgICAgICAgYm9vdGhSZXBDYXJkczogbWFwcGVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRoaXMucHVzaEFpTWVzc2FnZUZyb21IaXN0b3J5KGNoYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnB1c2hBaU1lc3NhZ2VGcm9tSGlzdG9yeShjaGF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5zaG93U3RhcnRBZ2FpbiA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIShtZXNzYWdlPy5sZW5ndGggPiAwKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIGNvbnNvbGUubG9nKCdoZXJlIGlzIG15IG1lc3NhZ2UnKVxuICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UudHJpbSgpO1xuXG4gICAgY29uc3QgbWFya2Rvd25MaW5rUmVnZXggPSAvXFxbKFteW10rKV1cXCgoW14pXSspXFwpL2c7XG4gICAgY29uc3QgdXJsUmVnZXggPSAvKD88IWhyZWY9XCIpXFxiaHR0cHM/OlxcL1xcL1xcUysoPzwhWy4sXSkvZ2k7XG5cbiAgICBpZiAobWFya2Rvd25MaW5rUmVnZXgudGVzdChtZXNzYWdlKSkge1xuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgICAgbWFya2Rvd25MaW5rUmVnZXgsXG4gICAgICAgICc8YSBocmVmPVwiJDJcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kMTwvYT4nLFxuICAgICAgKTtcbiAgICAgIC8vY29uc29sZS5sb2coJ1Nhbml0aXplZCBtZXNzYWdlOiAnLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplSHRtbChodG1sKTtcbiAgICB9XG5cbiAgICBpZiAodXJsUmVnZXgudGVzdChtZXNzYWdlKSkge1xuICAgICAgY29uc3QgaHRtbCA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgICAgdXJsUmVnZXgsXG4gICAgICAgICc8YSBocmVmPVwiJCZcIiB0YXJnZXQ9XCJfYmxhbmtcIj4kJjwvYT4nLFxuICAgICAgKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdTYW5pdGl6ZWQgbWVzc2FnZTogJywgbWVzc2FnZSk7XG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZUh0bWwoaHRtbCk7XG4gICAgfVxuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csICc8YnI+Jyk7XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gaGVhZGVycyB0byBIVE1MIGhlYWRlcnNcbiAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9eKCN7MSw2fSlcXHMrKC4qKSQvZ20sIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsZXZlbCA9IGhhc2hlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gYDxoJHtsZXZlbH0+JHt0ZXh0fTwvaCR7bGV2ZWx9PmA7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBjb25zdCBzYW5pdGl6ZWRNZXNzYWdlID0gdGhpcy5zYW5pdGl6ZUh0bWwobWVzc2FnZSk7XG4gICAgcmV0dXJuIHNhbml0aXplZE1lc3NhZ2U7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgY29uc3QgZmVlZGJhY2tMaW5rcyA9XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmVlZGJhY2stbGluaycpO1xuICAgIGZlZWRiYWNrTGlua3MuZm9yRWFjaCgobGluazogYW55KSA9PiB7XG4gICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdjbGljaycsXG4gICAgICAgIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjay1saW5rJykpIHtcbiAgICAvLyAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XG4gICAgLy8gICAgIC5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2stbGluaycpXG4gICAgLy8gICAgIC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25GZWVkYmFja0NsaWNrLmJpbmQodGhpcywgJ3plbmRlc2snKSk7XG4gICAgLy8gfVxuICB9XG5cbiAgc2FuaXRpemVIdG1sKGh0bWw6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbCk7XG4gIH1cblxuICBvbkZlZWRiYWNrQ2xpY2sodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZmVlZGJhY2tFdmVudC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgICB0aGlzLm9uQ2xvc2VFdmVudC5lbWl0KCk7XG4gIH1cblxuICBzZW5kTWVzc2FnZVdpdGhUaWxlKHByb21wdDogc3RyaW5nKSB7XG4gICAgdGhpcy5pbnB1dCA9IHByb21wdDtcbiAgICB0aGlzLmZldGNoRGF0YSgpO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgfVxuICBpc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgZmV0Y2hEYXRhKG1zZyA9IG51bGwpIHtcbiAgICB0aGlzLmlucHV0ID0gbXNnIHx8IHRoaXMuaW5wdXQ/LnRyaW0oKTtcbiAgICB0aGlzLm1zZyA9IHRoaXMuaW5wdXQ7XG4gICAgaWYgKCF0aGlzLmlucHV0IHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGF1dG8tc2Nyb2xsIHN1cHByZXNzaW9uIHdoZW4gdXNlciBzZW5kcyBhIG5ldyBtZXNzYWdlXG4gICAgdGhpcy51c2VySGFzU2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgIHR5cGU6ICd1c2VyJyxcbiAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KHRoaXMuaW5wdXQpLFxuICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdoaWRkZW4nOyAvLyBSZXNldCB0aGUgaGVpZ2h0XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBgNjJweGA7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLmFpUmVzcG9uc2UgPSAnJztcbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IHRydWU7XG5cbiAgICB0aGlzLm1ha2VBc2tSZXF1ZXN0KHRoaXMuaW5wdXQsIHRoaXMuYWdlbnRzLCB0aGlzLmNvbnZlcnNhdGlvbktleSk7XG4gIH1cbiAgZmV0Y2hEYXRhRm9yKG1zZywgY2hhdCkge1xuICAgIGNvbnN0IGlucHV0TXNnID0gbXNnPy50cmltKCk7XG4gICAgaWYgKCFpbnB1dE1zZyB8fCB0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUmVzZXQgYXV0by1zY3JvbGwgc3VwcHJlc3Npb24gd2hlbiB1c2VyIHNlbmRzIGEgbmV3IG1lc3NhZ2VcbiAgICB0aGlzLnVzZXJIYXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjaGF0LnJlbGF0ZWRMaXN0SXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge31cblxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICB0eXBlOiAndXNlcicsXG4gICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShpbnB1dE1zZyksXG4gICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgaXNDb2xsYXBzZWRUcnVlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XG4gICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSB0cnVlO1xuXG4gICAgdGhpcy5tYWtlQXNrUmVxdWVzdChpbnB1dE1zZywgdGhpcy5hZ2VudHMsIHRoaXMuY29udmVyc2F0aW9uS2V5LCBtc2csIGNoYXQpO1xuICB9XG4gIGZldGNoU21hbGxUYWxrKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9ib3Qvc21hbGwtdGFsay8ke3RoaXMuYm90SWR9LyR7dGhpcy51c2VySWR9YDtcblxuICAgIHRoaXMuaHR0cFxuICAgICAgLmdldDx7IHNtYWxsVGFsazogc3RyaW5nIH0+KHVybCwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgICAgICdoaXZlLWJvdC1pZCc6IHRoaXMuYm90SWQsXG4gICAgICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHdoaWxlIGZldGNoaW5nIHNtYWxsIHRhbGs6JywgZXJyb3IpO1xuXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnNtYWxsVGFsaykge1xuICAgICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlKHJlc3BvbnNlLnNtYWxsVGFsayksXG4gICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAyO1xuICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICByZWFkQWxsQ2h1bmtzID0gKHN0cmVhbTogYW55KSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmVhZGVyLmNsb3NlZC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBzdHJlYW06ICcsIGVycik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICAgIHN0YXJ0OiAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wdW1wKGNvbnRyb2xsZXIsIHJlYWRlciwgYWxsU3VnZ2VzdGlvbnMpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBwdW1wKGNvbnRyb2xsZXI6IGFueSwgcmVhZGVyOiBhbnksIGFsbFN1Z2dlc3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHJlYWRlci5yZWFkKCkudGhlbigoeyBkb25lLCB2YWx1ZSB9OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGxhc3RJdGVtID0gdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAxXTtcblxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgbGFzdEl0ZW0ubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGxhc3RJdGVtLm1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNoYXRMb2cucG9wKCk7XG4gICAgICAgIHRoaXMuY2hhdExvZy5wdXNoKGxhc3RJdGVtKTtcbiAgICAgICAgaWYgKGFsbFN1Z2dlc3Rpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnc3VnZ2VzdGlvbnMnLFxuICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGFsbFN1Z2dlc3Rpb25zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLnNob3dTdGFydEFnYWluID0gdHJ1ZTtcblxuICAgICAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gICB0aGlzLmZldGNoU21hbGxUYWxrKCk7XG4gICAgICAgIC8vIH0sMTAwMClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVjb2RlZENodW5rID0gdGhpcy5kZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICB0aGlzLmFpUmVzcG9uc2UgKz0gZGVjb2RlZENodW5rO1xuICAgICAgaWYgKGxhc3RJdGVtLnR5cGUgPT09ICdhaScpIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNNYXRjaCA9IHRoaXMuYWlSZXNwb25zZS5tYXRjaCgvPHN1Zz4oLio/KTxcXC9zdWc+L2cpO1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbnNNYXRjaCkge1xuICAgICAgICAgIHN1Z2dlc3Rpb25zTWF0Y2guZm9yRWFjaCgobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWlSZXNwb25zZSA9IHRoaXMuYWlSZXNwb25zZS5yZXBsYWNlKG1hdGNoLCAnJyk7XG4gICAgICAgICAgICBhbGxTdWdnZXN0aW9ucy5wdXNoKG1hdGNoPy5yZXBsYWNlKC88XFwvP3N1Zz4vZywgJycpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RJdGVtLm1lc3NhZ2UgPSB0aGlzLmFpUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcblxuICAgICAgICBsZXQgYWlGb3JtYXR0ZWREYXRhOiBhbnk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uICcpO1xuICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5wYXJzZSh0aGlzLmFpUmVzcG9uc2UpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncGFyc2luZyBqc29uIDInKTtcbiAgICAgICAgICAgIGFpRm9ybWF0dGVkRGF0YSA9IEpTT04ucGFyc2UodGhpcy5haVJlc3BvbnNlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3BhcnNpbmcganNvbiBkb25lJyk7XG5cbiAgICAgICAgaWYgKGFpRm9ybWF0dGVkRGF0YSAmJiBhaUZvcm1hdHRlZERhdGE/LnNlY3Rpb25faWQ/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAnY29tcGFueV9zZWFyY2gnIHx8XG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAndXNlcl9zZWFyY2gnIHx8XG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSAnaW5kdXN0cnlfY29tcGFueV9zZWFyY2gnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoTXlDb25uZWN0aW9ucygpLnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5mZXRjaFBlbmRpbmdSZXF1ZXN0cygpLnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCA9PSB0aGlzLm15VXBjb21pbmdTZXNzaW9uQWN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc3BlYWtlcklkcyA9IFtdO1xuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQ/LmZvckVhY2goKHNlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgc3BlYWtlcklkcyA9IFsuLi5zcGVha2VySWRzLCAuLi5zZXNzaW9uLnNwZWFrZXJzXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoc3BlYWtlcklkcz8ubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgdGhpcy5nZXRTcGVha2Vyc0J5U3RhZmZJZHMoc3BlYWtlcklkcykuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5hZGRUb015QWdlbmRhQWN0aW9uICYmXG4gICAgICAgICAgICBhaUZvcm1hdHRlZERhdGEuY29udGVudD8ubGVuZ3RoID4gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcbiAgICAgICAgICAgICAgc2VjdGlvbklkOiBhaUZvcm1hdHRlZERhdGEuc2VjdGlvbl9pZCxcbiAgICAgICAgICAgICAgc2Vzc2lvbklkczogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQgPT0gdGhpcy5jb25uZWN0T3JGb2xsb3dBY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCB1c2Vyc0xlbiA9IGFpRm9ybWF0dGVkRGF0YS5jb250ZW50Py5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodXNlcnNMZW4gPiAxKSB7XG4gICAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgICAgc2VjdGlvbklkOiAnb3Blbl9uZXR3b3JraW5nX2RyYXdlcicsXG4gICAgICAgICAgICAgICAgc2VhcmNoOiBhaUZvcm1hdHRlZERhdGEuY29udGVudCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHVzZXJzTGVuID09IDEpIHtcbiAgICAgICAgICAgICAgdGhpcy5vcGVuUGFnZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uSWQ6IGFpRm9ybWF0dGVkRGF0YS5zZWN0aW9uX2lkLFxuICAgICAgICAgICAgICAgIGNvbm5ldFVzZXJJZHM6IFthaUZvcm1hdHRlZERhdGEuY29udGVudFswXS51c2VySWRdLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoYWlGb3JtYXR0ZWREYXRhLmlzX29wZW5fcGFnZSA9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHRoaXMub3BlblBhZ2UubmV4dCh7XG4gICAgICAgICAgICAgIHNlY3Rpb25JZDogYWlGb3JtYXR0ZWREYXRhLnNlY3Rpb25faWQsXG4gICAgICAgICAgICAgIHNlYXJjaDogYWlGb3JtYXR0ZWREYXRhLmNvbnRlbnQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVCcm93c2VyKCkpIHtcbiAgICAgICAgICAgICAgYWlGb3JtYXR0ZWREYXRhLm1lc3NhZ2UgKz1cbiAgICAgICAgICAgICAgICAnXFxuXFxuJyArICc8YSBpZD1cImNsb3NlQm90Tm93XCI+Q2xpY2sgSGVyZTwvYT4gdG8gc2VlIHJlc3VsdHMuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYWknLFxuICAgICAgICAgICAgbWVzc2FnZTogYWlGb3JtYXR0ZWREYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICBhY3Rpb246IGFpRm9ybWF0dGVkRGF0YSxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlQnJvd3NlcigpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRDbG9zZUJvdENsaWNrRXZlbnQoKTtcbiAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5haVJlc3BvbnNlID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuYWlSZXNwb25zZSxcbiAgICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuXG4gICAgICAvLyBFbnF1ZXVlIHRoZSBuZXh0IGRhdGEgY2h1bmsgaW50byBvdXIgdGFyZ2V0IHN0cmVhbVxuICAgICAgY29udHJvbGxlci5lbnF1ZXVlKHZhbHVlKTtcbiAgICAgIHRoaXMucHVtcChjb250cm9sbGVyLCByZWFkZXIsIGFsbFN1Z2dlc3Rpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdEZlZWRiYWNrKGZsYWc6IGJvb2xlYW4sIG1lc3NhZ2UpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcblxuICAgIHRoaXMuZmVlZGJhY2tEb25lID0gdHJ1ZTtcbiAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSBudWxsO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbl9pZCA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkoXG4gICAgICB0aGlzLmJvdElkLFxuICAgICAgZmFsc2UsXG4gICAgICB0aGlzLmV2ZW50SWQsXG4gICAgKTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkFHRU5UU19BUEl9L0NvbnZlcnNhdGlvbi9jb1BpbG90LyR7dGhpcy5ib3RJZH0vY29udmVyc2F0aW9uLyR7Y29udmVyc2F0aW9uX2lkfS9oZWxwZnVsLXJlc3BvbnNlYDtcbiAgICBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICBhcGlLZXk6ICdDb252ZXJzYXRpb25fV0l6L3FBbStFRW1mT2tGYVVBL3dlQT09JyxcbiAgICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICAgJ2RvbWFpbi1hdXRob3JpdHknOiB0aGlzLmRvbWFpbkF1dGhvcml0eVZhbHVlLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZUlkOiBtZXNzYWdlLl9pZCwgaXNIZWxwZnVsOiBmbGFnIH0pLFxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgdGhpcy5jaGF0TG9nLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgIHRoaXMudGh1bWJzVXBNZXNzYWdlIHx8XG4gICAgICAgICAgICB0aGlzLmdldFRyYW5zbGF0aW9uKCdNYXkgSSBhc3Npc3QgeW91IHdpdGggYW55dGhpbmcgZWxzZScpLFxuICAgICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgICBpc0ZlZWRiYWNrTXNnOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB0aGlzLmZlZWRiYWNrRG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dGZWVkQmFja0ljb25zSW5kZXggPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgbWVzc2FnZTogdGhpcy5wcm9jZXNzTWVzc2FnZShcbiAgICAgICAgICB0aGlzLnRodW1ic0Rvd25NZXNzYWdlc1t0aGlzLnRodW1ic0Rvd25Nc2dJbmRleF0sXG4gICAgICAgICksXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgICAgaXNGZWVkYmFja01zZzogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy50aHVtYnNEb3duTXNnSW5kZXggPVxuICAgICAgICAodGhpcy50aHVtYnNEb3duTXNnSW5kZXggKyAxKSAlIHRoaXMudGh1bWJzRG93bk1lc3NhZ2VzLmxlbmd0aDtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1cHBvcnRMaW5rODgnKTtcbiAgICAgICAgaWYgKHN1cHBvcnRMaW5rKSB7XG4gICAgICAgICAgc3VwcG9ydExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnRyaWdnZXJTdXBwb3J0LmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgICAgdGhpcy5mZWVkYmFja0RvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IG51bGw7XG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IgKG5ldyBsaW5lKVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIENhbGwgeW91ciBzdWJtaXQgZnVuY3Rpb25cbiAgICAgIHRoaXMuaGFuZGxlU3VibWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlU3VibWl0KGV2ZW50KSB7XG4gICAgdGhpcy5mZXRjaERhdGEoKTtcbiAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gIH1cblxuICAvKiogSW5kZXggb2YgdGhlIGxhc3QgQUkgbWVzc2FnZSBpbiBjaGF0TG9nOyAtMSBpZiBub25lLiAqL1xuICBnZXQgbGFzdEFpTWVzc2FnZUluZGV4KCk6IG51bWJlciB7XG4gICAgZm9yIChsZXQgaiA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgaWYgKHRoaXMuY2hhdExvZ1tqXT8udHlwZSA9PT0gJ2FpJykgcmV0dXJuIGo7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIGhhbmRsZVVwQ2xpY2soaWR4OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKHRydWUsIHRoaXMuY2hhdExvZ1tpZHhdKTtcbiAgICB0aGlzLmNoYXRMb2dbaWR4XS5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS5saWtlZDtcblxuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkKSB7XG4gICAgICB0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLnVubGlrZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBoYW5kbGVEb3duQ2xpY2soaWR4OiBhbnkpIHtcbiAgICBpZiAodGhpcy5mZWVkYmFja0RvbmUpIHJldHVybjtcbiAgICB0aGlzLnN1Ym1pdEZlZWRiYWNrKGZhbHNlLCB0aGlzLmNoYXRMb2dbaWR4XSk7XG4gICAgdGhpcy5jaGF0TG9nW2lkeF0udW5saWtlZCA9ICF0aGlzLmNoYXRMb2dbaWR4XS51bmxpa2VkO1xuICAgIGlmICh0aGlzLmNoYXRMb2dbaWR4XS5saWtlZClcbiAgICAgIHRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkID0gIXRoaXMuY2hhdExvZ1tpZHhdLmxpa2VkO1xuICB9XG4gIC8vIGhhbmRsZUNvcHlDbGljayhpbmRleDogYW55KSB7XG4gIC8vICAgLy8gQ29weSB0aGUgbWVzc2FnZSB0byB0aGUgY2xpcGJvYXJkXG4gIC8vICAgY29uc3QgY29udGVudFRvQ29weSA9IHRoaXMuY2hhdExvZ1tpbmRleF0ubWVzc2FnZTtcbiAgLy8gICBjb25zb2xlLmxvZygnY29udGVudFRvQ29weScpO1xuICAvLyAgIGNvbnNvbGUubG9nKGNvbnRlbnRUb0NvcHkpO1xuICAvLyAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbnRlbnRUb0NvcHkpLnRoZW4oKCkgPT4ge1xuICAvLyAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSB3YXMgY29waWVkXG4gIC8vICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IHRydWU7XG4gIC8vICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIC8vICAgICAvLyBSZXNldCB0aGUgY29waWVkIHN0YXRlIGFmdGVyIGEgZGVsYXlcbiAgLy8gICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IGZhbHNlO1xuICAvLyAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIC8vICAgICB9LCAyMDAwKTsgLy8gUmVzZXQgYWZ0ZXIgMiBzZWNvbmRzXG4gIC8vICAgfSk7XG4gIC8vIH1cbiAgY29weVRleHQoaWQsIGluZGV4KSB7XG4gICAgLy8gR2V0IHRoZSB0ZXh0IGVsZW1lbnRcbiAgICB2YXIgdGV4dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG5cbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgdGV4dGFyZWEgZWxlbWVudCB0byBjb3B5IHRoZSB0ZXh0XG4gICAgdmFyIHRlbXBUZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGVtcFRleHRBcmVhLnZhbHVlID0gdGV4dEVsZW1lbnQuaW5uZXJUZXh0O1xuXG4gICAgLy8gQXBwZW5kIHRoZSB0ZXh0YXJlYSB0byB0aGUgYm9keSAobmVjZXNzYXJ5IGZvciB0aGUgZXhlY0NvbW1hbmQgdG8gd29yaylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBUZXh0QXJlYSk7XG5cbiAgICAvLyBTZWxlY3QgdGhlIHRleHQgaW5zaWRlIHRoZSB0ZXh0YXJlYVxuICAgIHRlbXBUZXh0QXJlYS5zZWxlY3QoKTtcblxuICAgIC8vIENvcHkgdGhlIHRleHQgdG8gdGhlIGNsaXBib2FyZFxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSB0ZXh0YXJlYVxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcFRleHRBcmVhKTtcblxuICAgIC8vIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxlcnQgdGhlIHVzZXIgb3IgY2hhbmdlIHRoZSBidXR0b24gdGV4dCB0byBpbmRpY2F0ZSB0aGUgY29weSB3YXMgc3VjY2Vzc2Z1bFxuICAgIC8vIGFsZXJ0KCdUZXh0IGNvcGllZCB0byBjbGlwYm9hcmQhJyk7XG5cbiAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLmNvcGllZCA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vIFJlc2V0IHRoZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5jb3BpZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9LCAyMDAwKTsgLy8gUmVzZXQgYWZ0ZXIgMiBzZWNvbmRzXG4gIH1cbiAgaGFuZGxlQ29weUNsaWNrKGluZGV4OiBhbnkpIHtcbiAgICAvLyBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBjbGlwYm9hcmRcbiAgICBjb25zdCBjb250ZW50VG9Db3B5ID0gdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlO1xuICAgIGNvbnN0IHJlc3V0bHQgPSB0aGlzLmNvcHlUZXh0KCdtZXNzYWdlVGV4dF8nICsgaW5kZXgsIGluZGV4KTtcbiAgfVxuXG4gIHNhbml0aXplSFRNTChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRvY3VtZW50IGZyYWdtZW50IHRvIGhvbGQgdGhlIHNpbXBsaWZpZWQgY29udGVudFxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgLy8gQXBwZW5kIHRoZSBjaGlsZHJlbiBvZiB0aGUgYm9keSBvZiB0aGUgcGFyc2VkIGRvY3VtZW50IHRvIHRoZSBmcmFnbWVudFxuICAgIEFycmF5LmZyb20oZG9jLmJvZHkuY2hpbGROb2RlcykuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGRpdiBlbGVtZW50IHRvIGhvbGQgdGhlIHNpbXBsaWZpZWQgSFRNTFxuICAgIGNvbnN0IHNpbXBsaWZpZWREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzaW1wbGlmaWVkRGl2LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcblxuICAgIC8vIFJlbW92ZSBjb21wbGV4IHRhZ3Mgb3IgYXR0cmlidXRlcyBhcyBuZWVkZWRcbiAgICAvLyBFeGFtcGxlOiByZW1vdmUgc2NyaXB0c1xuICAgIHNpbXBsaWZpZWREaXZcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKVxuICAgICAgLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKTtcblxuICAgIC8vIFJldHVybiB0aGUgc2ltcGxpZmllZCBIVE1MIGFzIGEgc3RyaW5nXG4gICAgcmV0dXJuIHNpbXBsaWZpZWREaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgY3VycmVudE1lc3NhZ2VGb3JFZGl0b3I6IGFueSA9ICcnO1xuICBjdXJyZW50SW5kZXhGb3JFZGl0b3I6IGFueSA9IC0xO1xuICBoYW5kbGVFZGl0b3JDbGljayhpbmRleDogYW55KSB7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4Rm9yRWRpdG9yID09IC0xKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleEZvckVkaXRvciA9IGluZGV4O1xuICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuc2FuaXRpemVIVE1MKFxuICAgICAgICB0aGlzLmNoYXRMb2dbaW5kZXhdLm1lc3NhZ2UsXG4gICAgICApO1xuICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IucmVwbGFjZShcbiAgICAgICAgLy8gJ1NhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6JyxcbiAgICAgICAgJycsXG4gICAgICApO1xuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleEZvckVkaXRvciA9PSBpbmRleCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yICs9IHRoaXMuc2FuaXRpemVIVE1MKFxuICAgICAgICAgIHRoaXMuY2hhdExvZ1tpbmRleF0ubWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvciA9IHRoaXMuY3VycmVudE1lc3NhZ2VGb3JFZGl0b3IucmVwbGFjZShcbiAgICAgICAgICAvLyAnU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzonLFxuICAgICAgICAgICcnLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleEZvckVkaXRvciA9IGluZGV4O1xuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5zYW5pdGl6ZUhUTUwoXG4gICAgICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5tZXNzYWdlLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yID0gdGhpcy5jdXJyZW50TWVzc2FnZUZvckVkaXRvci5yZXBsYWNlKFxuICAgICAgICAgIC8vICdTYWZlVmFsdWUgbXVzdCB1c2UgW3Byb3BlcnR5XT1iaW5kaW5nOicsXG4gICAgICAgICAgJycsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGF0TG9nW2luZGV4XS5pc0VkaXRvciA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIC8vIFJlc2V0IHRoZSBjb3BpZWQgc3RhdGUgYWZ0ZXIgYSBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jaGF0TG9nW2luZGV4XS5pc0VkaXRvciA9IGZhbHNlO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0sIDIwMDApOyAvLyBSZXNldCBhZnRlciAyIHNlY29uZHNcbiAgICB0aGlzLmVkaXRvcnNEcmF3ZXIub3BlbigpO1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIHNjcm9sbFRvQm90dG9tKGZvcmNlID0gZmFsc2UsIHNtb290aCA9IHRydWUpIHtcbiAgICBpZiAoIWZvcmNlICYmICF0aGlzLmF1dG9TY3JvbGxPbk5ld01lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudXNlckhhc1Njcm9sbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jaGF0TWFpbj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGVsID0gdGhpcy5jaGF0TWFpbi5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuaXNQcm9ncmFtbWF0aWNTY3JvbGwgPSB0cnVlO1xuICAgIGVsLnNjcm9sbFRvKHtcbiAgICAgIHRvcDogZWwuc2Nyb2xsSGVpZ2h0LFxuICAgICAgYmVoYXZpb3I6IHNtb290aCA/ICdzbW9vdGgnIDogJ2F1dG8nLFxuICAgIH0pO1xuICAgIC8vIFJlbGVhc2UgdGhlIGd1YXJkIGFmdGVyIHRoZSBzbW9vdGggc2Nyb2xsIHNldHRsZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5pc1Byb2dyYW1tYXRpY1Njcm9sbCA9IGZhbHNlOyB9LCBzbW9vdGggPyA0MDAgOiA1MCk7XG4gIH1cblxuICAvKiogU2Nyb2xscyB0aGUgY2hhdCBjb250YWluZXIgc28gdGhlIHRvcCBvZiB0aGUgQUkgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBpZCBpcyB2aXNpYmxlLiAqL1xuICBzY3JvbGxUb0FpTWVzc2FnZShtZXNzYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZXJIYXNTY3JvbGxlZCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jaGF0TWFpbj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLW1zZy1pZD1cIiR7bWVzc2FnZUlkfVwiXWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRUb3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIHRoaXMuaXNQcm9ncmFtbWF0aWNTY3JvbGwgPSB0cnVlO1xuICAgIGNvbnRhaW5lci5zY3JvbGxUbyh7XG4gICAgICB0b3A6IGNvbnRhaW5lci5zY3JvbGxUb3AgKyB0YXJnZXRUb3AgLSA4LFxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmlzUHJvZ3JhbW1hdGljU2Nyb2xsID0gZmFsc2U7IH0sIDQwMCk7XG4gIH1cblxuICBmb2N1c09uVGV4dGFyZWEoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5teUlucHV0ICYmIHRoaXMubXlJbnB1dC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMubXlJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGhhbmRsZUFjdGlvbihhY3Rpb246IGFueSkge1xuICAgIGNvbnNvbGUuaW5mbygnaW5jb21pbmcgYWN0aW9uIGZyb20gdGhlIGNoYXRib3QgQUknKTtcbiAgICBjb25zb2xlLmluZm8oYWN0aW9uKTtcblxuICAgIGlmIChhY3Rpb24/LmNvbnRlbnQpIHtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gRGV0ZWN0IHVzZXIgbWFudWFsIHNjcm9sbCB0byBzdXBwcmVzcyBhdXRvLXNjcm9sbCAoZGVib3VuY2VkLCBpZ25vcmVzIHByb2dyYW1tYXRpYyBzY3JvbGxzKVxuICAgIGlmICh0aGlzLmNoYXRNYWluPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmNoYXRNYWluLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Byb2dyYW1tYXRpY1Njcm9sbCkgcmV0dXJuO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxMaXN0ZW5lclRpbWVyKTtcbiAgICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5lclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWwgPSB0aGlzLmNoYXRNYWluPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBhdEJvdHRvbSA9IGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8IDgwO1xuICAgICAgICAgIHRoaXMudXNlckhhc1Njcm9sbGVkID0gIWF0Qm90dG9tO1xuICAgICAgICB9LCAxMDApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRyYXdlciBpcyBpbml0aWFsbHkgb3BlbiBhbmQgYXBwbHkgb3ZlcmZsb3cgaGlkZGVuIHRvIGJvZHkgaWYgc29cbiAgICBpZiAodGhpcy5kcmF3ZXIub3BlbmVkKSB7XG4gICAgICB0aGlzLnNldEJvZHlPdmVyZmxvdygpO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSBkcmF3ZXIgYmVpbmcgb3BlbmVkIG9yIGNsb3NlZFxuICAgIHRoaXMuZHJhd2VyLm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoKG9wZW5lZDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKG9wZW5lZCkge1xuICAgICAgICB0aGlzLnNldEJvZHlPdmVyZmxvdygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVCb2R5T3ZlcmZsb3coKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZHJhd2VyLm9wZW5lZENoYW5nZS5zdWJzY3JpYmUoKG9wZW5lZCkgPT4ge1xuICAgICAgaWYgKG9wZW5lZCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5teUlucHV0ICYmIHRoaXMubXlJbnB1dC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLm15SW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpOyAvLyBGb2N1cyBvbiB0aGUgdGV4dGFyZWFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRCb2R5T3ZlcmZsb3coKSB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCB0aGlzLmJvZHlPdmVyZmxvd0NsYXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQm9keU92ZXJmbG93KCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgdGhpcy5ib2R5T3ZlcmZsb3dDbGFzcyk7XG4gIH1cblxuICBnZXRTcGVha2Vyc0J5U3RhZmZJZHMoaWRzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55W10gfCBudWxsPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vdXNlcnMvZ2V0LWJ5LXN0YWZmLWlkc2A7XG4gICAgY29uc3QgY2xlYW5JZHMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldCgoaWRzIHx8IFtdKS5tYXAoKHgpID0+IFN0cmluZyh4ID8/ICcnKS50cmltKCkpLmZpbHRlcihCb29sZWFuKSksXG4gICAgKTtcbiAgICBpZiAoY2xlYW5JZHMubGVuZ3RoID09PSAwKSByZXR1cm4gb2YobnVsbCk7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnlbXT4odXJsLCBjbGVhbklkcywgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICB0YXAoKGRhdGE6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRhdGEuZm9yRWFjaCgoc3BlYWtlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcoc3BlYWtlcj8uaWQgPz8gJycpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChpZCkgdGhpcy5zcGVha2Vyc1tpZF0gPSBzcGVha2VyO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBzcGVha2VyczonLCBlcnIpO1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbklkLCBhY3Rpb24pIHtcbiAgICB0aGlzLnNlc3Npb25BY3Rpb25zLm5leHQoe1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgYWN0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkQ2xvc2VCb3RDbGlja0V2ZW50KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY2xvc2VCb3ROb3cnKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oZWxlbWVudCwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlQm90Lm5leHQobnVsbCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc01vYmlsZUJyb3dzZXIoKSB7XG4gICAgcmV0dXJuIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChcbiAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgKTtcbiAgfVxuXG4gIGNvbm5lY3RUb1VzZXIodXNlcklkKSB7XG4gICAgdGhpcy5jb25uZWN0V2l0aFVzZXIuZW1pdCh7XG4gICAgICBjb25uZWN0OiAhdGhpcy5jYW5EaXNjb25uZWN0KHVzZXJJZCksXG4gICAgICB1c2VySWQsXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hNeUNvbm5lY3Rpb25zKCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmV0Y2hQZW5kaW5nUmVxdWVzdHMoKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICBzY2hlZHVsZU1lZXRpbmdXaXRoVXNlcih1c2VyKSB7XG4gICAgdGhpcy5zY2hlZHVsZU1lZXRpbmcuZW1pdCh1c2VyKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBnaXZlbiB1c2VySWQgaGFzIGEgcGVuZGluZyBjb25uZWN0aW9uIHJlcXVlc3Qgc2VudCAoc2hvdyBcIlJlcXVlc3QgU2VudFwiIGRpc2FibGVkKS4gKi9cbiAgY2hlY2tQZW5kaW5nU2VudFJlcXVlc3QodXNlcklkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHVzZXJJZCA9PSBudWxsIHx8IHVzZXJJZCA9PT0gJycpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nU2VudFJlcXVlc3RVc2VySWRzPy5sZW5ndGhcbiAgICAgID8gdGhpcy5wZW5kaW5nU2VudFJlcXVlc3RVc2VySWRzXG4gICAgICA6IHRoaXMucGVuZGluZ1JlcXVlc3RzO1xuICAgIHJldHVybiAhIXBlbmRpbmc/LmZpbmQoKGE6IGFueSkgPT4gYSA9PSB1c2VySWQpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBhdHRlbmRlZSBjYW4gYmUgZm9sbG93ZWQgKHNob3cgXCJDb25uZWN0XCIgYnV0dG9uKS4gTm90IGNvbm5lY3RlZCBhbmQgbm8gcGVuZGluZyBzZW50IHJlcXVlc3QuICovXG4gIGNhbkZvbGxvd1VzZXIoYXR0ZW5kZWU6IHsgaWQ/OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVpZCA9IGF0dGVuZGVlPy5pZDtcbiAgICBpZiAodWlkID09IG51bGwgfHwgdWlkID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNhblVuZm9sbG93VXNlcihhdHRlbmRlZSkgfHwgdGhpcy5jaGVja1BlbmRpbmdTZW50UmVxdWVzdCh1aWQpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBhdHRlbmRlZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCAoc2hvdyBcIkRpc2Nvbm5lY3RcIiBidXR0b24pLiAqL1xuICBjYW5VbmZvbGxvd1VzZXIoYXR0ZW5kZWU6IHsgaWQ/OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVpZCA9IGF0dGVuZGVlPy5pZDtcbiAgICBpZiAodWlkID09IG51bGwgfHwgdWlkID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmNvbm5lY3Rpb25zTGlzdD8ubGVuZ3RoXG4gICAgICA/IHRoaXMuY29ubmVjdGlvbnNMaXN0XG4gICAgICA6IHRoaXMubXlDb25uZWN0aW9ucztcbiAgICByZXR1cm4gISFsaXN0Py5maW5kKChjOiBhbnkpID0+IChjLnVzZXJJZCA/PyBjLmlkKSA9PSB1aWQpO1xuICB9XG5cbiAgY2FuQ29ubmVjdCh1c2VySWQpIHtcbiAgICByZXR1cm4gIShcbiAgICAgIHRoaXMuY2FuRGlzY29ubmVjdCh1c2VySWQpIHx8XG4gICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cy5maW5kKChhKSA9PiBhID09IHVzZXJJZClcbiAgICApO1xuICB9XG5cbiAgY2FuRGlzY29ubmVjdCh1c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5teUNvbm5lY3Rpb25zLmZpbmQoKGNvbm4pID0+IGNvbm4udXNlcklkID09IHVzZXJJZCk7XG4gIH1cblxuICBmZXRjaFBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAneC1hcGkta2V5JzogdGhpcy5hcGlLZXksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLmdldChcbiAgICAgICAgYCR7dGhpcy5lbnZpcm9ubWVudC5VU0VSU19BUEl9L2V2ZW50cy8ke3RoaXMuZXZlbnRJZH0vY29ubmVjdGlvbi1yZXF1ZXN0cy9hdXRvZ2VuL3BlbmRpbmctc2VudC1yZXF1ZXN0cz91c2VySWQ9JHt0aGlzLnVzZXJJZH1gLFxuICAgICAgICB7IGhlYWRlcnMgfSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSByZXM7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgZmV0Y2hNeUNvbm5lY3Rpb25zKCkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICd4LWFwaS1rZXknOiB0aGlzLmFwaUtleSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0KFxuICAgICAgICBgJHt0aGlzLmVudmlyb25tZW50LlVTRVJTX0FQSX0vZXZlbnRzLyR7dGhpcy5ldmVudElkfS91c2Vycy1jb25uZWN0aW9ucy9hdXRvZ2VuP3VzZXJJZD0ke3RoaXMudXNlcklkfWAsXG4gICAgICAgIHsgaGVhZGVycyB9LFxuICAgICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLm15Q29ubmVjdGlvbnMgPSByZXM7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGVuZGluZyByZXF1ZXN0czogJywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgaXNEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgYWdlbnRzOiBhbnk7XG4gIHNlbGVjdGVkQWdlbnRzID0gW107XG4gIGFsbFNlbGVjdGVkID0gZmFsc2U7XG4gIC8vIFRvZ2dsZSB0aGUgZHJvcGRvd24gdmlzaWJpbGl0eVxuICB0b2dnbGVEcm9wZG93bigpIHtcbiAgICBpZiAoIXRoaXMuYWdlbnRzKSB0aGlzLmZldGNoQWdlbnRzKCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmlzRHJvcGRvd25PcGVuO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYWdlbnRzPy5mb3JFYWNoKChhZ2VudCkgPT4gKGFnZW50LnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkFnZW50Q2hhbmdlKGFnZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvL2FnZW50LnNlbGVjdGVkID0gIWFnZW50LnNlbGVjdGVkO1xuICAgIC8vY29uc29sZS5sb2coYWdlbnQpO1xuICAgIGxldCBhZ2VudEZvdW5kID0gdGhpcy5hZ2VudHMuZmlsdGVyKChwKSA9PiBwLmlkID09IGFnZW50LmlkKTtcbiAgICBpZiAoYWdlbnRGb3VuZCAmJiBhZ2VudEZvdW5kLmxlbmd0aCA+IDApIHtcbiAgICAgIGFnZW50Rm91bmRbMF0uc2VsZWN0ZWQgPSAhYWdlbnRGb3VuZFswXS5zZWxlY3RlZDtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgYXJlQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWdlbnRzPy5ldmVyeSgoYWdlbnQpID0+ICFhZ2VudC5zZWxlY3RlZCk7XG4gIH1cblxuICBnZXREcm9wZG93bkhlYWRlclRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3RlZEFnZW50cyA9IHRoaXMuYWdlbnRzPy5maWx0ZXIoKGFnZW50KSA9PiBhZ2VudC5zZWxlY3RlZCk7XG4gICAgaWYgKCFzZWxlY3RlZEFnZW50cykge1xuICAgICAgcmV0dXJuICdBbGwgQWdlbnRzJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNlbGVjdGVkQWdlbnRzICYmIHNlbGVjdGVkQWdlbnRzPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdBbGwgQWdlbnRzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RlZEFnZW50cz8ubGVuZ3RoID4gMVxuICAgICAgICAgID8gYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnRzIFNlbGVjdGVkYFxuICAgICAgICAgIDogYCR7c2VsZWN0ZWRBZ2VudHM/Lmxlbmd0aH0gQWdlbnQgU2VsZWN0ZWRgO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmZXRjaEFnZW50c19odHRwKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbnZpcm9ubWVudC5BR0VOVFNfQVBJfS9Db1BpbG90LyR7dGhpcy5ib3RJZH0vYWN0aXZlLWFnZW50c2A7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwge30sIHsgaGVhZGVycyB9KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy5hZ2VudHMgPSByZXMubWFwKChhZ2VudCkgPT4gKHtcbiAgICAgICAgICAgIC4uLmFnZW50LFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICByZXR1cm4gb2YocmVzKTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgY2hhdGJvdCBjb25maWc6ICcsIGVycm9yKTtcblxuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIGlzRG9jSW5FZGl0TW9kZSA9IGZhbHNlO1xuICBkb2N1bWVudENvbnRlbnQ6IGFueTtcblxuICBjb252ZXJzYXRpb25JZDogYW55O1xuICBpc0NvbnRlbnRMb2FkZWQgPSBmYWxzZTtcblxuICBmZXRjaENvbnRlbnRfaHR0cCgpIHtcbiAgICB0aGlzLmlzRG9jSW5FZGl0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDb250ZW50TG9hZGVkID0gZmFsc2U7XG4gICAgY29uc29sZS5sb2coJ0FQSSBjYWxsIGZ1bmN0aW9uJyk7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBjb252ZXJzYXRpb25faWQgPSB0aGlzLmNvbnZlcnNhdGlvblNlcnZpY2UuZ2V0S2V5KFxuICAgICAgdGhpcy5ib3RJZCxcbiAgICAgIGZhbHNlLFxuICAgICAgdGhpcy5ldmVudElkLFxuICAgICk7XG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbl9pZDtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkFHRU5UU19BUEl9L0NvbnZlcnNhdGlvbkRvY3VtZW50cz9jb252ZXJzYXRpb25JZD0ke2NvbnZlcnNhdGlvbl9pZH0mYm90SWQ9JHt0aGlzLmJvdElkfWA7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgYXBpS2V5OiAnV0l6L3FBbStFRW1mT2tGYVVBL3dlQT09JyxcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyBoZWFkZXJzIH0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLmlzRG9jSW5FZGl0TW9kZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5kb2N1bWVudENvbnRlbnQgPSByZXM7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0dldCBBUEkgY2FsbGxlZCBzdWNjZXNzJyk7XG4gICAgICAgICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHJlcyk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGNoYXRib3QgY29uZmlnIERKOiAnLCBlcnJvcik7XG4gICAgICAgIHRoaXMuaXNEb2NJbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNDb250ZW50TG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PSA0MDQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnZGFzaCcpO1xuICAgICAgICAgIHRoaXMuaXNEb2NJbkVkaXRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pc0NvbnRlbnRMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBmZXRjaEFnZW50cygpIHtcbiAgICB0aGlzLmZldGNoQWdlbnRzX2h0dHAoKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGZldGNoRWRpdG9yQ29udGVudCgpIHtcbiAgICB0aGlzLmZldGNoQ29udGVudF9odHRwKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBldmVudHMvJHtldmVudElkfS91c2Vycy1jb25uZWN0aW9uc1xuICBwcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkobWFya2Rvd246IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgY3VzdG9tIHJlbmRlcmVyIHRvIG1vZGlmeSA8YT4gdGFnc1xuICAgICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgbWFya2VkLlJlbmRlcmVyKCk7XG5cbiAgICAgIC8vIEN1c3RvbWl6ZSBhbmNob3IgdGFncyB0byBpbmNsdWRlIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICByZW5kZXJlci5saW5rID0gKGhyZWY6IHN0cmluZywgdGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBgPGEgaHJlZj1cIiR7aHJlZn1cIiB0aXRsZT1cIiR7XG4gICAgICAgICAgdGl0bGUgfHwgJydcbiAgICAgICAgfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGV4dH08L2E+YDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFBhcnNlIHRoZSBtYXJrZG93biBjb250ZW50IHRvIEhUTUwgdXNpbmcgbWFya2VkIHdpdGggdGhlIGN1c3RvbSByZW5kZXJlclxuICAgICAgY29uc3QgbWFya2Rvd25Db250ZW50ID0gbWFya2VkLnBhcnNlKG1hcmtkb3duLCB7IHJlbmRlcmVyOiByZW5kZXJlciB9KTtcblxuICAgICAgLy8gU2FuaXRpemUgdGhlIHBhcnNlZCBIVE1MIHVzaW5nIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXJcbiAgICAgIGNvbnN0IHNhbml0aXplZEh0bWwgPVxuICAgICAgICB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChtYXJrZG93bkNvbnRlbnQpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIHNhZmUgSFRNTCBjb250ZW50IGZvciBkaXNwbGF5XG4gICAgICByZXR1cm4gc2FuaXRpemVkSHRtbDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBtYXJrZG93bjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gJyc7IC8vIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgb3IgaGFuZGxlIHRoZSBlcnJvciBhcHByb3ByaWF0ZWx5XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZUh0bWwobWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFtYXJrZG93biB8fCAhKG1hcmtkb3duLmxlbmd0aCA+IDApKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnB1dCBNYXJrZG93biBpcyBudWxsIG9yIGVtcHR5Jyk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBoZWFkZXJzICgjIyMgb3IgIyMpIHRvIDxzdHJvbmc+IGZvciBib2xkIGhlYWRpbmdzXG4gICAgbGV0IGh0bWwgPSBtYXJrZG93bi5yZXBsYWNlKFxuICAgICAgL14oI3sxLDZ9KVxccysoLiopJC9nbSxcbiAgICAgIChtYXRjaCwgaGFzaGVzLCB0ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IGxldmVsID0gaGFzaGVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxldmVsID09PSAzKSB7XG4gICAgICAgICAgcmV0dXJuIGA8aDM+PHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+PC9oMz5gO1xuICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSA0KSB7XG4gICAgICAgICAgcmV0dXJuIGA8aDQ+PHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+PC9oND5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+YDtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIENvbnZlcnQgTWFya2Rvd24gY29kZSBibG9ja3Mgd2l0aCBsYW5ndWFnZSB0byBwcmVmb3JtYXR0ZWQgSFRNTFxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL2BgYChcXHcrKT9cXG4oW1xcc1xcU10qPylgYGAvZywgKG1hdGNoLCBsYW5nLCBjb2RlKSA9PiB7XG4gICAgICBjb25zdCBlc2NhcGVkQ29kZSA9IHRoaXMuZXNjYXBlSHRtbChjb2RlKTtcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gbGFuZyB8fCAncGxhaW50ZXh0JztcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBidXR0b24gZm9yIHRoZSBjb2RlIGJsb2NrXG4gICAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cImNvZGUtY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJjb3B5LWJ1dHRvblwiIGNsYXNzPVwiY29weS1idXR0b25cIiAoY2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKCdcXGAke2VzY2FwZWRDb2RlfVxcYCcpXCI+JHt0aGlzLmdldFRyYW5zbGF0aW9uKFxuICAgICAgICAgICdDb3B5JyxcbiAgICAgICAgKX08L2J1dHRvbj5cbiAgICAgICAgPHByZSBjbGFzcz1cImNvZGVfYmxvY2sgZGlmZlwiPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJHtsYW5ndWFnZX1cIj4ke2VzY2FwZWRDb2RlfTwvY29kZT48L3ByZT5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IGlubGluZSBjb2RlICh3cmFwcGVkIGluIGBiYWNrdGlja3NgKSB0byBpbmxpbmUgPGNvZGU+IHRhZ3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpO1xuXG4gICAgLy8gQ29udmVydCBNYXJrZG93biBib2xkIHRvIEhUTUwgPHN0cm9uZz5cbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC9cXCpcXCooLio/KVxcKlxcKi9nLCAnPHN0cm9uZz4kMTwvc3Ryb25nPicpO1xuXG4gICAgLy8gQ29udmVydCBudW1iZXJlZCBsaXN0c1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL15cXGQrXFwuXFxzKyguKikkL2dtLCAnPGxpPiQxPC9saT4nKTtcblxuICAgIC8vIENvbnZlcnQgYnVsbGV0IHBvaW50IGxpc3RzXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXlxcLVxccysoLiopJC9nbSwgJzxsaT4kMTwvbGk+Jyk7XG5cbiAgICAvLyBDb252ZXJ0IE1hcmtkb3duIGxpbmtzIHRvIEhUTUwgbGlua3NcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKFxuICAgICAgL1xcWyhbXlxcXV0rKV1cXCgoW14pXSspXFwpL2csXG4gICAgICAnPGEgaHJlZj1cIiQyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+JDE8L2E+JyxcbiAgICApO1xuXG4gICAgLy8gQ29udmVydCBuZXcgbGluZXMgdG8gPGJyPiB0YWdzIGZvciBwYXJhZ3JhcGhzXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csICc8YnI+Jyk7XG5cbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBlc2NhcGUgSFRNTCBjaGFyYWN0ZXJzIGZvciBjb2RlIGJsb2Nrc1xuICBlc2NhcGVIdG1sKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvZGVcbiAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZSgvJy9nLCAnJiMwMzk7Jyk7XG4gIH1cblxuICAvLyBGdW5jdGlvbiB0byBjb3B5IHRleHQgdG8gY2xpcGJvYXJkXG4gIHB1YmxpYyBjb3B5VG9DbGlwYm9hcmQodGV4dDogc3RyaW5nKSB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgYWxlcnQoJ0NvZGUgY29waWVkIHRvIGNsaXBib2FyZCEnKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBjb3B5IHRleHQ6ICcsIGVycik7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBpc0NvbGxhcHNlZCA9IGZhbHNlO1xuICBpc0NvbGxhcHNlZEZvckdyYXBoID0gZmFsc2U7XG4gIGlzQ29sbGFwc2VkRm9yRkdyYXBoID0gZmFsc2U7XG4gIHRvZ2dsZUNvbGxhcHNlKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWQgPSAhdGhpcy5pc0NvbGxhcHNlZDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB0b2dnbGVDb2xsYXBzZUdyYXBoKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWRGb3JHcmFwaCA9ICF0aGlzLmlzQ29sbGFwc2VkRm9yR3JhcGg7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIHRvZ2dsZUNvbGxhcHNlRkdyYXBoKCkge1xuICAgIHRoaXMuaXNDb2xsYXBzZWRGb3JGR3JhcGggPSAhdGhpcy5pc0NvbGxhcHNlZEZvckZHcmFwaDtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cbiAgLy8gICBbXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkFJIE5ld3MgSmFudWFyeSAyMDI0OiBJbi1EZXB0aCBhbmQgQ29uY2lzZSAtIFRoZSBBSSBUcmFja1wiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiRWFjaCBtb250aCwgd2UgY29tcGlsZSBzaWduaWZpY2FudCBuZXdzLCB0cmVuZHMsIGFuZCBoYXBwZW5pbmdzIGluIEFJLCBwcm92aWRpbmcgZGV0YWlsZWQgc3VtbWFyaWVzIHdpdGgga2V5IHBvaW50cyBpbiBidWxsZXQgZm9ybSBmb3IgY29uY2lzZSB5ZXQgY29tcGxldGUgdW5kZXJzdGFuZGluZy5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1qYW51YXJ5LTIwMjQvXCJcbiAgLy8gICB9LFxuICAvLyAgIHtcbiAgLy8gICAgIFwidGl0bGVcIjogXCJUb3AgQUkgTmV3cywgSmFudWFyeSAyMDI0IC0gRXZlcnlwaXhlbCBKb3VybmFsXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJJbiB0aGlzIG1vbnRobHkgcm91bmR1cCwgd2Ugc3BvdGxpZ2h0IHRoZSB0b3AgQUkgbmV3cyBzdG9yaWVzIGZyb20gSmFudWFyeSwgaW5jbHVkaW5nIHRoZSBPcGVuQUkgdnMuIFRoZSBOZXcgWW9yayBUaW1lcyBMYXdzdWl0LlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly9qb3VybmFsLmV2ZXJ5cGl4ZWwuY29tL3RvcC1haS1uZXdzLWphbnVhcnktMjAyNFwiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBKdWx5IDIwMjQ6IEluLURlcHRoIGFuZCBDb25jaXNlIC0gVGhlIEFJIFRyYWNrXCIsXG4gIC8vICAgICBcImRlc2NcIjogXCJUaGlzIHBhZ2UgZmVhdHVyZXMgQUkgTmV3cyBmb3IgSnVseSAyMDI0LCBoaWdobGlnaHRpbmcgc2lnbmlmaWNhbnQgZXZlbnRzIHN1Y2ggYXMgQ2FudmEgYWNxdWlyaW5nIExlb25hcmRvIEFJLlwiLFxuICAvLyAgICAgXCJsaW5rXCI6IFwiaHR0cHM6Ly90aGVhaXRyYWNrLmNvbS9haS1uZXdzLWp1bHktMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS9cIlxuICAvLyAgIH0sXG4gIC8vICAge1xuICAvLyAgICAgXCJ0aXRsZVwiOiBcIkphbnVhcnkgbmV3cyByb3VuZHVwOiBXaGF0J3MgbmV3IGluIHRoZSB3b3JsZCBvZiBBST8gLSBQbHVyYWxzaWdodFwiLFxuICAvLyAgICAgXCJkZXNjXCI6IFwiT3BlbkFJ4oCZcyBuZXcgR1BUIHN0b3JlLCBidXNpbmVzcy1yZWFkeSBDaGF0R1BUIHBsYW5zLCBhbmQgYSBwcmVkaWN0ZWQgcmlzZSBpbiBBSS1wb3dlcmVkIGN5YmVyY3JpbWUuXCIsXG4gIC8vICAgICBcImxpbmtcIjogXCJodHRwczovL3d3dy5wbHVyYWxzaWdodC5jb20vcmVzb3VyY2VzL2Jsb2cvZGF0YS9haS10aGlzLW1vbnRoLWphbnVhcnktMjAyNFwiXG4gIC8vICAgfSxcbiAgLy8gICB7XG4gIC8vICAgICBcInRpdGxlXCI6IFwiQUkgTmV3cyBBdWd1c3QgMjAyNDogSW4tRGVwdGggYW5kIENvbmNpc2UgLSBUaGUgQUkgVHJhY2tcIixcbiAgLy8gICAgIFwiZGVzY1wiOiBcIlRoaXMgcGFnZSBmZWF0dXJlcyBBSSBOZXdzIGZvciBBdWd1c3QgMjAyNCwgd2l0aCBoaWdobGlnaHRzIHN1Y2ggYXMgTnZpZGlhIGRlbGF5aW5nIHRoZSDigJxCbGFja3dlbGzigJ0gQjIwMCBBSSBjaGlwcyBkZWxpdmVyeS5cIixcbiAgLy8gICAgIFwibGlua1wiOiBcImh0dHBzOi8vdGhlYWl0cmFjay5jb20vYWktbmV3cy1hdWd1c3QtMjAyNC1pbi1kZXB0aC1hbmQtY29uY2lzZS1kdXBsaWNhdGUvXCJcbiAgLy8gICB9XG4gIC8vIF1cbiAgZGF0ZVRpbWUgPSB7IG5vdzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07XG4gIC8vIEV4dHJhY3RzIHRoZSBkb21haW4gZnJvbSBhIFVSTFxuICBnZXREb21haW5OYW1lKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBob3N0bmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xuICAgICAgcmV0dXJuIGhvc3RuYW1lLnJlcGxhY2UoL153d3dcXC4vLCAnJyk7IC8vIFJlbW92ZSAnd3d3LicgaWYgcHJlc2VudFxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICd1bmtub3duJztcbiAgICB9XG4gIH1cblxuICAvLyBHZW5lcmF0ZXMgdGhlIGZhdmljb24gVVJMXG4gIGdldEZhdmljb25VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZ2V0RG9tYWluTmFtZSh1cmwpO1xuICAgIHJldHVybiBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej0xMjgmZG9tYWluPSR7ZG9tYWlufWA7XG4gIH1cbiAgY3VycmVudFNvdXJjZXNMaXN0OiBhbnkgPSBbXTtcbiAgb25DYXJkQ2xpY2soc291cmNlcyk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNvdXJjZXNMaXN0ID0gc291cmNlcztcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5zb3VyY2VzRHJhd2VyLm9wZW4oKTtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90Y2xvc2VwbGF5Z3JvdW5kYnV0dG9uJyk7XG4gICAgaWYgKGJ1dHRvbikge1xuICAgICAgYnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgaXNTaG93RWRpdG9yQnV0dG9uID0gdHJ1ZTtcblxuICBvcGVuT3V0ZXJFZGl0b3IoKSB7XG4gICAgdGhpcy5mZXRjaEVkaXRvckNvbnRlbnQoKTtcbiAgICB0aGlzLmVkaXRvcnNEcmF3ZXIub3BlbigpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmlzU2hvd0VkaXRvckJ1dHRvbiA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICBvbkNsb3NlRWRpdG9yKCkge1xuICAgIHRoaXMuZWRpdG9yc0RyYXdlci5jbG9zZSgpO1xuICAgIHRoaXMuaXNEcmF3ZXJPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5pc1Nob3dFZGl0b3JCdXR0b24gPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGlmIG5lZWRlZFxuICAgIHRoaXMub25EcmF3ZXJDbG9zZWQoKTtcbiAgfVxuXG4gIG9uQ2xvc2VTb3VyY2UoKSB7XG4gICAgdGhpcy5zb3VyY2VzRHJhd2VyLmNsb3NlKCk7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcbiAgICB0aGlzLm9uRHJhd2VyQ2xvc2VkKCk7XG4gIH1cbiAgb25EcmF3ZXJDbG9zZWQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzRHJhd2VyT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7IC8vIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiBpZiBuZWVkZWRcbiAgICAgIC8vIFVzZSBuZ0NsYXNzIHRvIGR5bmFtaWNhbGx5IGFwcGx5IHRoZSBjbGFzc1xuICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JvdGNsb3NlcGxheWdyb3VuZGJ1dHRvbicpO1xuICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSwgODAwKTtcbiAgfVxuICBpc0RyYXdlck9wZW4gPSB0cnVlO1xuXG4gIHRvZ2dsZURyYXdlcih0b2RvKSB7XG4gICAgdGhpcy5pc0RyYXdlck9wZW4gPSB0b2RvO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblZpc2liaWxpdHkoKTtcbiAgfVxuICB1cGRhdGVCdXR0b25WaXNpYmlsaXR5KCkge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdib3RjbG9zZXBsYXlncm91bmRidXR0b24nKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24uc3R5bGUuZGlzcGxheSA9IHRoaXMuaXNEcmF3ZXJPcGVuID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB9XG4gIH1cbiAgb3BlbkxpbmtJbk5ld1RhYihsaW5rOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cub3BlbihsaW5rLCAnX2JsYW5rJyk7XG4gIH1cbiAgYWRqdXN0VGV4dGFyZWFIZWlnaHQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAvLyBQcmV2ZW50cyBhIG5ldyBsaW5lIGZyb20gYmVpbmcgYWRkZWRcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICBjb25zdCB0ZXh0YXJlYSA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsgLy8gUmVzZXQgdGhlIGhlaWdodFxuICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9IGAke3RleHRhcmVhLnNjcm9sbEhlaWdodH1weGA7IC8vIEFkanVzdCBoZWlnaHQgdG8gbWF0Y2ggY29udGVudFxuICAgIC8vIEVuc3VyZSB0aGUgaGVpZ2h0IGRvZXNuJ3QgZXhjZWVkIHRoZSBtYXgtaGVpZ2h0IHNldCBpbiBDU1NcbiAgICBpZiAodGV4dGFyZWEuc2Nyb2xsSGVpZ2h0ID4gMTUwKSB7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBgMTUwcHhgOyAvLyBBZGp1c3QgaGVpZ2h0IHRvIG1hdGNoIGNvbnRlbnRcbiAgICAgIHRleHRhcmVhLnN0eWxlLm92ZXJmbG93WSA9ICdhdXRvJzsgLy8gRW5hYmxlIHNjcm9sbGluZyBpZiBjb250ZW50IGV4Y2VlZHMgNDAwcHhcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dGFyZWEuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbic7IC8vIEhpZGUgc2Nyb2xsYmFyIGlmIGNvbnRlbnQgaXMgd2l0aGluIGxpbWl0c1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVdvcmtmbG93cyh2YWx1ZSA9IG51bGwpIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tGb3JDb3AyOUJvdElkKCkpIHtcbiAgICAgIHRoaXMuYm90U2VydmljZS5nZXRXb3JrZmxvd3NCeU9yZ0lkKHRoaXMub3JnSWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHRoaXMub3JnV29ya2Zsb3dzID0gcmVzO1xuICAgICAgICB0aGlzLmlzV29ya2Zsb3dPcGVuID0gdmFsdWUgPT0gbnVsbCA/ICF0aGlzLmlzV29ya2Zsb3dPcGVuIDogdmFsdWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzV29ya2Zsb3dPcGVuKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLm9wZW5Xb3JrZmxvd0lucHV0ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplRm9ybSgpIHtcbiAgICAvLyBDcmVhdGUgZm9ybSBjb250cm9scyBkeW5hbWljYWxseSBiYXNlZCBvbiBzZWxlY3RlZFdvcmtmbG93LlRyaWdnZXIuSW5wdXRTY2hlbWFcbiAgICBjb25zdCBmb3JtQ29udHJvbHMgPSB7fTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFdvcmtmbG93Py5UcmlnZ2VyPy5JbnB1dFNjaGVtYSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93LlRyaWdnZXIuSW5wdXRTY2hlbWEuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgZm9ybUNvbnRyb2xzW2lucHV0LklucHV0SWRdID0gW1xuICAgICAgICAgIGlucHV0LlZhbHVlIHx8ICcnLFxuICAgICAgICAgIGlucHV0LlJlcXVpcmVkID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IG51bGwsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBmb3JtXG4gICAgdGhpcy53b3JrZmxvd0Zvcm0gPSB0aGlzLmZiLmdyb3VwKGZvcm1Db250cm9scyk7XG4gIH1cblxuICBvbldvcmtmbG93U2VsZWN0ZWQod29ya2Zsb3cpIHtcbiAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cgPSB3b3JrZmxvdztcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbldvcmtmbG93SW5wdXQgPSB0cnVlO1xuICB9XG5cbiAgb25Xb3JrZmxvd1N1Ym1pdCgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYm90QWxsQ2hhdCcpO1xuICAgIGlmICh0aGlzLndvcmtmbG93Rm9ybS52YWxpZCkge1xuICAgICAgY29uc29sZS5sb2codGhpcy53b3JrZmxvd0Zvcm0udmFsdWUpO1xuXG4gICAgICB2YXIgaW5wdXQgPSB0aGlzLnByZXBhcmVIdG1sKFxuICAgICAgICB0aGlzLmdlbmVyYXRlTWFya2Rvd24oXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93Lk5hbWUsXG4gICAgICAgICAgdGhpcy53b3JrZmxvd0Zvcm0udmFsdWUsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgICAvLyB1cGRhdGUgbGFzdCB0d28gY2hhdExvZyBlbnRyaWVzLCBzZXQgc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyID0gZmFsc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuY2hhdExvZ1t0aGlzLmNoYXRMb2cubGVuZ3RoIC0gMV1bJ3Nob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlciddID1cbiAgICAgICAgICBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAyXVsnc2hvd1dvcmtmbG93RXhlY3V0aW9uTG9hZGVyJ10gPVxuICAgICAgICAgIGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG5cbiAgICAgIHRoaXMuY2hhdExvZy5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3VzZXInLFxuICAgICAgICBtZXNzYWdlOiBpbnB1dCxcbiAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICBjb3BpZWQ6IGZhbHNlLFxuICAgICAgICBpc0NvbGxhcHNlZFRydWU6IGZhbHNlLFxuICAgICAgICBzaG93V29ya2Zsb3dFeGVjdXRpb25Mb2FkZXI6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coaW5wdXQpO1xuXG4gICAgICB0aGlzLmN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzID0gMDtcbiAgICAgIHRoaXMuY3VycmVudFdvcmtmbG93QWN0aW9uID1cbiAgICAgICAgJ0V4ZWN1dGluZyAnICsgdGhpcy5zZWxlY3RlZFdvcmtmbG93LkFjdGlvbnNbMF0uTmFtZTtcbiAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gdHJ1ZTtcbiAgICAgIHRoaXMuZXhlY3V0aW5nV29ya2Zsb3cgPSB0cnVlO1xuICAgICAgdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHMgPSB7XG4gICAgICAgIEFjdGlvbnM6IHRoaXMuc2VsZWN0ZWRXb3JrZmxvdy5BY3Rpb25zLFxuICAgICAgICBJbnB1dHM6IHRoaXMud29ya2Zsb3dGb3JtLnZhbHVlLFxuICAgICAgICB3b3JrZmxvd0lucHV0czogdGhpcy53b3JrZmxvd0Zvcm0udmFsdWUsXG4gICAgICAgIFdvcmtmbG93TmFtZTogdGhpcy5zZWxlY3RlZFdvcmtmbG93Lk5hbWUsXG4gICAgICB9O1xuICAgICAgdGhpcy5jdXJyZW50V29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzID0gdGhpcy53b3JrZmxvd0V4ZWN1dGlvbkRldGFpbHM7XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG5cbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgLy8gZXhlY3V0ZSB0aGUgYXNrIGVuZHBvaW50IHdpdGggd29ya2Zsb3cgaW5wdXRcbiAgICAgIHRoaXMubWFrZUFza1JlcXVlc3QoXG4gICAgICAgIGlucHV0LFxuICAgICAgICB0aGlzLmFnZW50cyxcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25LZXksXG4gICAgICAgICcnLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3dbJ19pZCddLFxuICAgICAgICB0aGlzLndvcmtmbG93Rm9ybS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbWFrZUFza1JlcXVlc3QoXG4gICAgaW5wdXRNc2c6IHN0cmluZyxcbiAgICBhZ2VudHM6IGFueVtdLFxuICAgIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcsXG4gICAgbXNnPzogYW55LFxuICAgIGNoYXQ/OiBhbnksXG4gICAgd29ya2Zsb3dJZD86IHN0cmluZyxcbiAgICB3b3JrZmxvd19pbnB1dHM/OiBhbnksXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICB1c2VyX3F1ZXN0aW9uOiBpbnB1dE1zZyxcbiAgICAgIHVzZXJfaWQ6IHRoaXMudXNlcklkLFxuICAgICAgYm90X2lkOiB0aGlzLmJvdElkLFxuICAgICAgbWVzc2FnZV9pZDogdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdlbmVyYXRlS2V5KCksXG4gICAgICBzZXNzaW9uX2lkOiB0aGlzLmNvblNlc3Npb25LZXksXG4gICAgICBhZ2VudHM6IGFnZW50cz8uZmlsdGVyKChwKSA9PiBwLnNlbGVjdGVkKS5tYXAoKHApID0+IHAuaWQpID8/IFtdLFxuICAgICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgICAgIGZpcnN0X25hbWU6IHRoaXMuZmlyc3ROYW1lLFxuICAgICAgbGFzdF9uYW1lOiB0aGlzLmxhc3ROYW1lLFxuICAgIH07XG5cbiAgICBpZiAod29ya2Zsb3dJZCkge1xuICAgICAgYm9keVsnd29ya2Zsb3dfaWQnXSA9IHdvcmtmbG93SWQ7XG4gICAgICBib2R5Wyd3b3JrZmxvd19pbnB1dHMnXSA9IHdvcmtmbG93X2lucHV0cztcbiAgICB9XG5cbiAgICBjb25zdCB1c2Vyc0FwaSA9IHRoaXMuZW52aXJvbm1lbnQuVVNFUlNfQVBJO1xuICAgIHRoaXMucGxhdGZvcm1Ub2tlblJlZnJlc2hcbiAgICAgIC5lbnN1cmVWYWxpZEFjY2Vzc1Rva2VuKHRoaXMuczI3VG9rZW4sIHVzZXJzQXBpKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZW5zdXJlZCkgPT4ge1xuICAgICAgICAgIGxldCBiZWFyZXIgPSBlbnN1cmVkLmFjY2Vzc1Rva2VuIHx8IHRoaXMuczI3VG9rZW4gfHwgJyc7XG4gICAgICAgICAgaWYgKGVuc3VyZWQucmVmcmVzaGVkICYmIGVuc3VyZWQuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuczI3VG9rZW4gPSBlbnN1cmVkLmFjY2Vzc1Rva2VuO1xuICAgICAgICAgICAgaWYgKGVuc3VyZWQuYXV0aFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHRoaXMudG9rZW5zUmVmcmVzaGVkLmVtaXQoZW5zdXJlZC5hdXRoUmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNlbmRBc2tNZXNzYWdlT3ZlcldlYlNvY2tldChib2R5LCBiZWFyZXIsIG1zZywgY2hhdCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pczQwMSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4uZW1pdCgpO1xuICAgICAgICAgIGlmIChtc2cgJiYgY2hhdCkge1xuICAgICAgICAgICAgdGhpcy5tc2cgPSBtc2c7XG4gICAgICAgICAgICB0aGlzLmNoYXQgPSBjaGF0O1xuICAgICAgICAgICAgdGhpcy5pc0ZldGNoRGF0YUZvciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgIHRoaXMuaW5wdXQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cgPSBudWxsO1xuICAgIHRoaXMub3BlbldvcmtmbG93SW5wdXQgPSBmYWxzZTtcbiAgICB0aGlzLmlzV29ya2Zsb3dPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEFza0hlYWRlcnMoYmVhcmVyVG9rZW46IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgaGVhZGVyczogYW55ID0ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIEF1dGhvcml6YXRpb246ICdCZWFyZXIgJyArIGJlYXJlclRva2VuLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZXZlbnRVcmwpIHtcbiAgICAgIGhlYWRlcnNbJ2V2ZW50dXJsJ10gPSB0aGlzLmV2ZW50VXJsO1xuICAgIH1cbiAgICBpZiAodGhpcy5ldmVudElkKSB7XG4gICAgICBoZWFkZXJzWydldmVudGlkJ10gPSB0aGlzLmV2ZW50SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmV2ZW50VG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbJ2V2ZW50dG9rZW4nXSA9IHRoaXMuZXZlbnRUb2tlbjtcbiAgICB9XG4gICAgaWYgKHRoaXMud29ya3NwYWNlVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbJ3dvcmtzcGFjZVRva2VuJ10gPSB0aGlzLndvcmtzcGFjZVRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXNrVW5hdXRob3JpemVkKG1zZz86IGFueSwgY2hhdD86IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaXM0MDEgPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaFRva2VuLmVtaXQoKTtcbiAgICBpZiAobXNnICYmIGNoYXQpIHtcbiAgICAgIHRoaXMubXNnID0gbXNnO1xuICAgICAgdGhpcy5jaGF0ID0gY2hhdDtcbiAgICAgIHRoaXMuaXNGZXRjaERhdGFGb3IgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNjb25uZWN0QXNrV2ViU29ja2V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFza1dlYlNvY2tldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5hc2tXZWJTb2NrZXQuY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgdGhpcy5hc2tXZWJTb2NrZXQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmFza1dlYlNvY2tldENvbm5lY3Rpb25LZXkgPSAnJztcbiAgICB0aGlzLmFjdGl2ZUFza01lc3NhZ2VJZCA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBc2tXZWJTb2NrZXQoXG4gICAgYmVhcmVyVG9rZW46IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIG1zZz86IGFueSxcbiAgICBjaGF0PzogYW55LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25uZWN0aW9uS2V5ID0gYCR7Y29udmVyc2F0aW9uSWR9OiR7c2Vzc2lvbklkfWA7XG4gICAgaWYgKFxuICAgICAgdGhpcy5hc2tXZWJTb2NrZXQgJiZcbiAgICAgIHRoaXMuYXNrV2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOICYmXG4gICAgICB0aGlzLmFza1dlYlNvY2tldENvbm5lY3Rpb25LZXkgPT09IGNvbm5lY3Rpb25LZXlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nvbm5lY3RBc2tXZWJTb2NrZXQoKTtcblxuICAgIGNvbnN0IGFza05ld1VybCA9IGAke3RoaXMuZW52aXJvbm1lbnQuQkFTRV9VUkx9L2FpL2Fzay1haWA7XG4gICAgY29uc3QgY29ubmVjdEJvZHkgPSB7XG4gICAgICBib3RfaWQ6IHRoaXMuYm90SWQsXG4gICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLFxuICAgICAgbWNwX2VuYWJsZTogZmFsc2UsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYXNrTmV3VXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHRoaXMuYnVpbGRBc2tIZWFkZXJzKGJlYXJlclRva2VuKSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbm5lY3RCb2R5KSxcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgdGhpcy5oYW5kbGVBc2tVbmF1dGhvcml6ZWQobXNnLCBjaGF0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hdXRob3JpemVkIHdoaWxlIGNvbm5lY3RpbmcgYXNrIHdlYnNvY2tldCAoJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBpbml0aWFsaXplIGFzayB3ZWJzb2NrZXQgKCR7cmVzcG9uc2Uuc3RhdHVzfSk6ICR7cmVzcG9uc2VUZXh0fWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgY29uc3Qgd3NVcmwgPSBkYXRhPy53c191cmw7XG4gICAgaWYgKCF3c1VybCB8fCB0eXBlb2Ygd3NVcmwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Fzay1uZXcgcmVzcG9uc2UgbWlzc2luZyB3c191cmwnKTtcbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcblxuICAgICAgd3Mub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hc2tXZWJTb2NrZXQgPSB3cztcbiAgICAgICAgdGhpcy5hc2tXZWJTb2NrZXRDb25uZWN0aW9uS2V5ID0gY29ubmVjdGlvbktleTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgd3Mub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlQXNrV2ViU29ja2V0TWVzc2FnZShldmVudD8uZGF0YSk7XG4gICAgICB9O1xuXG4gICAgICB3cy5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQXNrIHdlYnNvY2tldCBjb25uZWN0aW9uIGVycm9yJykpO1xuICAgICAgfTtcblxuICAgICAgd3Mub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQXNrIHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIG9wZW5pbmcnKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNrV2ViU29ja2V0ID0gbnVsbDtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwc2VydEFpQ2hhdE1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCBjdXJyZW50Q2hhdE1lc3NhZ2UgPSB0aGlzLmNoYXRMb2cuZmluZCgocCkgPT4gcC5faWQgPT0gbWVzc2FnZUlkKTtcbiAgICBpZiAoIWN1cnJlbnRDaGF0TWVzc2FnZSkge1xuICAgICAgY3VycmVudENoYXRNZXNzYWdlID0ge1xuICAgICAgICBfaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgdHlwZTogJ2FpJyxcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIHRpbWU6IGZvcm1hdE5vdyh0aGlzLnRpbWV6b25lKSxcbiAgICAgIH07XG4gICAgICB0aGlzLmNoYXRMb2cucHVzaChjdXJyZW50Q2hhdE1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudENoYXRNZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb29sQ29udGVudFN0cmluZyh0b29sUmVzdWx0OiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgdG9vbFJlc3VsdD8udG9vbF9yZXN1bHQ/Lm1lc3NhZ2VzPy5bMF0/LmNvbnRlbnQgPz9cbiAgICAgIHRvb2xSZXN1bHQ/Lm1lc3NhZ2VzPy5bMF0/LmNvbnRlbnQgPz9cbiAgICAgIHRvb2xSZXN1bHQ/LmNvbnRlbnQgPz9cbiAgICAgICcnO1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHJldHVybiBjb250ZW50O1xuICAgIGlmIChjb250ZW50ID09IG51bGwpIHJldHVybiAnJztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcmltYXJ5VG9vbFJlc3VsdCh0b29sUmVzdWx0czogYW55KToge1xuICAgIHRvb2xOYW1lOiBzdHJpbmc7XG4gICAgY29udGVudDogc3RyaW5nO1xuICB9IHwgbnVsbCB7XG4gICAgaWYgKCF0b29sUmVzdWx0cykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjYW5kaWRhdGVzOiBhbnlbXSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRvb2xSZXN1bHRzKSkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKC4uLnRvb2xSZXN1bHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHRvb2xSZXN1bHRzKTtcbiAgICAgIGlmICh0b29sUmVzdWx0cz8uc2VyaWFsaXphYmxlX3RvX3JldHVybikge1xuICAgICAgICBjYW5kaWRhdGVzLnB1c2godG9vbFJlc3VsdHMuc2VyaWFsaXphYmxlX3RvX3JldHVybik7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRvb2xSZXN1bHRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBPYmplY3QuZW50cmllcyh0b29sUmVzdWx0cykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHY6IGFueSA9IHZhbHVlO1xuICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHsgLi4udiwgdG9vbF9uYW1lOiB2Py50b29sX25hbWUgfHwga2V5IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3QgdG9vbE5hbWUgPSBjYW5kaWRhdGU/LnRvb2xfbmFtZTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldFRvb2xDb250ZW50U3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgICBpZiAodG9vbE5hbWUgJiYgY29udGVudCkge1xuICAgICAgICByZXR1cm4geyB0b29sTmFtZSwgY29udGVudCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRvb2xSZXN1bHRDYXJkTWVzc2FnZShcbiAgICBjdXJyZW50Q2hhdE1lc3NhZ2U6IGFueSxcbiAgICBtZXNzYWdlSWQ6IHN0cmluZyxcbiAgICBhbnN3ZXJUZXh0OiBzdHJpbmcsXG4gICAgdG9vbFJlc3VsdHM6IGFueSxcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJpbWFyeVRvb2wgPSB0aGlzLmdldFByaW1hcnlUb29sUmVzdWx0KHRvb2xSZXN1bHRzKTtcbiAgICBpZiAoIXByaW1hcnlUb29sKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB0b29sTmFtZSA9IHByaW1hcnlUb29sLnRvb2xOYW1lO1xuICAgIGNvbnN0IGNvbnRlbnRTdHIgPSBwcmltYXJ5VG9vbC5jb250ZW50O1xuXG4gICAgY29uc3Qgc2V0QmFzZSA9ICh0eXBlOiBzdHJpbmcpID0+IHtcbiAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5faWQgPSBtZXNzYWdlSWQ7XG4gICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UudHlwZSA9IHR5cGU7XG4gICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UubWVzc2FnZSA9IGFuc3dlclRleHRcbiAgICAgICAgPyB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheShhbnN3ZXJUZXh0KVxuICAgICAgICA6ICcnO1xuICAgICAgY3VycmVudENoYXRNZXNzYWdlLnRpbWUgPSBjdXJyZW50Q2hhdE1lc3NhZ2UudGltZSB8fCBmb3JtYXROb3codGhpcy50aW1lem9uZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGlzU2Vzc2lvblRvb2wgPVxuICAgICAgdG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc2Vzc2lvbnMnIHx8XG4gICAgICB0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9zZXNzaW9uc192MicgfHxcbiAgICAgIHRvb2xOYW1lID09PSAnZ2V0X3Nlc3Npb25zX2J5X2ludGVyZXN0JyB8fFxuICAgICAgdG9vbE5hbWUgPT09ICdnZXRfc2Vzc2lvbnNfYnlfdHJhY2snIHx8XG4gICAgICB0b29sTmFtZSA9PT0gJ2dldF9zcGVha2VyX3Nlc3Npb25zJyB8fFxuICAgICAgdG9vbE5hbWUgPT09ICdnZXRfdXBjb21pbmdfc2Vzc2lvbnMnIHx8XG4gICAgICB0b29sTmFtZSA9PT0gJ2dldF9teV9hZ2VuZGEnO1xuXG4gICAgaWYgKGlzU2Vzc2lvblRvb2wpIHtcbiAgICAgIGxldCBzZXNzaW9uczogYW55W10gPSBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgIHNlc3Npb25zID0gcGFyc2VkPy5zZXNzaW9ucyA/PyBbXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNlc3Npb25zID0gdGhpcy5wYXJzZVNlc3Npb25Db250ZW50VjIoY29udGVudFN0cik7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXBwZWQgPSB0aGlzLm1hcFNlc3Npb25zVG9DYXJkRGF0YShzZXNzaW9ucyk7XG4gICAgICB0aGlzLmVuc3VyZVNwZWFrZXJzRm9yU2Vzc2lvbkNhcmRzKG1hcHBlZCk7XG4gICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0QmFzZSgnc2Vzc2lvbl9jYXJkcycpO1xuICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc2Vzc2lvbkNhcmRzID0gbWFwcGVkO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfYXR0ZW5kZWVzJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBBdHRlbmRlZXNUb0NhcmREYXRhKHBhcnNlZD8uYXR0ZW5kZWVzID8/IFtdKTtcbiAgICAgICAgaWYgKG1hcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0QmFzZSgnYXR0ZW5kZWVfY2FyZHMnKTtcbiAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UuYXR0ZW5kZWVDYXJkcyA9IG1hcHBlZDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRvb2xOYW1lID09PSAnZ2V0X2V2ZW50X3NwZWFrZXJzJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50U3RyKTtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gdGhpcy5tYXBTcGVha2Vyc1RvQ2FyZERhdGEoXG4gICAgICAgICAgcGFyc2VkPy5zcGVha2VycyA/PyBwYXJzZWQ/LnNwZWFrZXIgPz8gW10sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldEJhc2UoJ3NwZWFrZXJfY2FyZHMnKTtcbiAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc3BlYWtlckNhcmRzID0gbWFwcGVkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodG9vbE5hbWUgPT09ICdnZXRfZXZlbnRfc3BvbnNvcnMnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRTdHIpO1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0aGlzLm1hcFNwb25zb3JzVG9DYXJkRGF0YShwYXJzZWQ/LnNwb25zb3JzID8/IFtdKTtcbiAgICAgICAgaWYgKG1hcHBlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2V0QmFzZSgnc3BvbnNvcl9jYXJkcycpO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5zcG9uc29yQ2FyZHMgPSBtYXBwZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0b29sTmFtZSA9PT0gJ2dldF9ldmVudF9ib290aHMnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnRTdHIpO1xuICAgICAgICBjb25zdCBtYXBwZWQgPSB0aGlzLm1hcEJvb3Roc1RvQ2FyZERhdGEocGFyc2VkPy5ib290aHMgPz8gW10pO1xuICAgICAgICBpZiAobWFwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzZXRCYXNlKCdzcG9uc29yX2NhcmRzJyk7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnNwb25zb3JDYXJkcyA9IG1hcHBlZDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRvb2xOYW1lID09PSAnZ2V0X2Jvb3RoX3JlcHJlc2VudGF0aXZlcycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudFN0cik7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IHRoaXMubWFwQm9vdGhSZXBzVG9DYXJkRGF0YShwYXJzZWQ/LnJlcHJlc2VudGF0aXZlcyA/PyBbXSk7XG4gICAgICAgIGlmIChtYXBwZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldEJhc2UoJ2Jvb3RoX3JlcF9jYXJkcycpO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5ib290aFJlcENhcmRzID0gbWFwcGVkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge31cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUFza1dlYlNvY2tldE1lc3NhZ2UocmF3TWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFyYXdNZXNzYWdlKSByZXR1cm47XG5cbiAgICBsZXQgcGFyc2VkOiBhbnkgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPVxuICAgICAgICB0eXBlb2YgcmF3TWVzc2FnZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHJhd01lc3NhZ2UpIDogcmF3TWVzc2FnZSA/PyBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tBc2tOZXcgV1NdIE5vbi1KU09OIHBheWxvYWQ6JywgcmF3TWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXlsb2FkID0gcGFyc2VkPy5kYXRhID8/IHt9O1xuICAgIGNvbnN0IG1lc3NhZ2VJZCA9XG4gICAgICBwYXlsb2FkPy5tZXNzYWdlX2lkIHx8IHBhcnNlZD8ubWVzc2FnZV9pZCB8fCB0aGlzLmFjdGl2ZUFza01lc3NhZ2VJZCB8fCAnJztcblxuICAgIHN3aXRjaCAocGFyc2VkPy50eXBlKSB7XG4gICAgICBjYXNlICdjaHVuayc6IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlSWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgaXNOZXdBaU1lc3NhZ2UgPSAhdGhpcy5jaGF0TG9nLmZpbmQoKHApID0+IHAuX2lkID09IG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDaGF0TWVzc2FnZSA9IHRoaXMudXBzZXJ0QWlDaGF0TWVzc2FnZShtZXNzYWdlSWQpO1xuICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2UubWVzc2FnZSA9IGAke2N1cnJlbnRDaGF0TWVzc2FnZS5tZXNzYWdlIHx8ICcnfSR7cGF5bG9hZD8udGV4dCB8fCAnJ31gO1xuICAgICAgICBpZiAoaXNOZXdBaU1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBGaXJzdCBjaHVuazogaGlkZSBUaGlua2luZyBpbmRpY2F0b3IgYW5kIHNjcm9sbCB0byB0aGUgbWVzc2FnZSBzdGFydFxuICAgICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQWlNZXNzYWdlKG1lc3NhZ2VJZCksIDMwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20odHJ1ZSwgZmFsc2UpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Fuc3dlcic6IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlSWQpIHtcbiAgICAgICAgICB0aGlzLmlzQ2hhdGluZ1dpdGhBaSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDaGF0TWVzc2FnZSA9IHRoaXMudXBzZXJ0QWlDaGF0TWVzc2FnZShtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBmaW5hbEFuc3dlciA9IHBheWxvYWQ/LnRleHQgPz8gY3VycmVudENoYXRNZXNzYWdlLm1lc3NhZ2UgPz8gJyc7XG4gICAgICAgIGNvbnN0IGhhc0NhcmRSZXNwb25zZSA9IHRoaXMuYXBwbHlUb29sUmVzdWx0Q2FyZE1lc3NhZ2UoXG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICBmaW5hbEFuc3dlcixcbiAgICAgICAgICBwYXlsb2FkPy50b29sX3Jlc3VsdHMsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzQ2FyZFJlc3BvbnNlKSB7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnR5cGUgPSAnYWknO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5tZXNzYWdlID0gdGhpcy5wcm9jZXNzTWVzc2FnZUZvckRpc3BsYXkoZmluYWxBbnN3ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBheWxvYWQ/LnN1Z2dlc3Rpb25zKSkge1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5yZWxhdGVkTGlzdEl0ZW1zID0gcGF5bG9hZC5zdWdnZXN0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkPy53ZWJfcmVzdWx0cykpIHtcbiAgICAgICAgICBjdXJyZW50Q2hhdE1lc3NhZ2Uuc291cmNlc0xpc3QgPSBwYXlsb2FkLndlYl9yZXN1bHRzO1xuICAgICAgICAgIGN1cnJlbnRDaGF0TWVzc2FnZS5kaXNwbGF5ZWRTb3VyY2VzID0gcGF5bG9hZC53ZWJfcmVzdWx0cz8uc2xpY2UoMCwgMyk7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnJlbWFpbmluZ1NvdXJjZXMgPSBwYXlsb2FkLndlYl9yZXN1bHRzPy5zbGljZSgzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF5bG9hZD8udG9vbF9yZXN1bHRzKSB7XG4gICAgICAgICAgY3VycmVudENoYXRNZXNzYWdlLnRvb2xSZXN1bHRzID0gcGF5bG9hZC50b29sX3Jlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93RmVlZEJhY2tJY29uc0luZGV4ID0gdGhpcy5jaGF0TG9nLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuYWN0aXZlQXNrTWVzc2FnZUlkID0gJyc7XG4gICAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICAgIC8vIEZvciBjYXJkIHJlc3BvbnNlcyAodG9vbCByZXN1bHRzKSwgc2Nyb2xsIHRvIHRoZSBtZXNzYWdlIHRleHQgYnViYmxlXG4gICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHZlcnkgYm90dG9tIOKAlCBhdm9pZHMgY2FyZHMgcHVzaGluZyB0aGUgdmlldyB0b28gZmFyIGRvd25cbiAgICAgICAgaWYgKGhhc0NhcmRSZXNwb25zZSAmJiBtZXNzYWdlSWQpIHtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9BaU1lc3NhZ2UobWVzc2FnZUlkKSwgMzApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzT25UZXh0YXJlYSgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgdGhpcy5hY3RpdmVBc2tNZXNzYWdlSWQgPSAnJztcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RhdHVzJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZEFza01lc3NhZ2VPdmVyV2ViU29ja2V0KFxuICAgIGJvZHk6IGFueSxcbiAgICBiZWFyZXJUb2tlbjogc3RyaW5nLFxuICAgIG1zZz86IGFueSxcbiAgICBjaGF0PzogYW55LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9IGJvZHk/LmNvbnZlcnNhdGlvbl9pZCB8fCB0aGlzLmNvbnZlcnNhdGlvbktleSB8fCAnJztcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBib2R5Py5zZXNzaW9uX2lkIHx8IHRoaXMuY29uU2Vzc2lvbktleSB8fCAnJztcbiAgICBpZiAoIWNvbnZlcnNhdGlvbklkIHx8ICFzZXNzaW9uSWQpIHtcbiAgICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnN1cmVBc2tXZWJTb2NrZXQoYmVhcmVyVG9rZW4sIGNvbnZlcnNhdGlvbklkLCBzZXNzaW9uSWQsIG1zZywgY2hhdClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFza1dlYlNvY2tldCB8fCB0aGlzLmFza1dlYlNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXNrIHdlYnNvY2tldCBpcyBub3Qgb3BlbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlQXNrTWVzc2FnZUlkID0gYm9keT8ubWVzc2FnZV9pZCB8fCAnJztcbiAgICAgICAgdGhpcy5hc2tXZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgICAgIHRoaXMuaXM0MDEgPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzZW5kaW5nIGFzay1uZXcgd2Vic29ja2V0IG1lc3NhZ2U6JywgZXJyKTtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG1ha2VBc2tSZXF1ZXN0b2xkKFxuICAgIGlucHV0TXNnOiBzdHJpbmcsXG4gICAgYWdlbnRzOiBhbnlbXSxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIG1zZz86IGFueSxcbiAgICBjaGF0PzogYW55LFxuICAgIHdvcmtmbG93SWQ/OiBzdHJpbmcsXG4gICAgd29ya2Zsb3dfaW5wdXRzPzogYW55LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmVudmlyb25tZW50LkJBU0VfVVJMfS9haS9hc2tgO1xuXG4gICAgY29uc3QgYm9keTogYW55ID0ge1xuICAgICAgdXNlcl9xdWVzdGlvbjogaW5wdXRNc2csXG4gICAgICB1c2VyX2lkOiB0aGlzLnVzZXJJZCxcbiAgICAgIGJvdF9pZDogdGhpcy5ib3RJZCxcbiAgICAgIG1lc3NhZ2VfaWQ6IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZW5lcmF0ZUtleSgpLFxuICAgICAgYWdlbnRzOiBhZ2VudHM/LmZpbHRlcigocCkgPT4gcC5zZWxlY3RlZCkubWFwKChwKSA9PiBwLmlkKSA/PyBbXSxcbiAgICAgIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uSWQsXG4gICAgICBmaXJzdF9uYW1lOiB0aGlzLmZpcnN0TmFtZSxcbiAgICAgIGxhc3RfbmFtZTogdGhpcy5sYXN0TmFtZSxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtmbG93SWQpIHtcbiAgICAgIGJvZHlbJ3dvcmtmbG93X2lkJ10gPSB3b3JrZmxvd0lkO1xuICAgICAgYm9keVsnd29ya2Zsb3dfaW5wdXRzJ10gPSB3b3JrZmxvd19pbnB1dHM7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgJ2hpdmUtYm90LWlkJzogdGhpcy5ib3RJZCxcbiAgICAgICdkb21haW4tYXV0aG9yaXR5JzogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSxcbiAgICAgIGV2ZW50SWQ6IHRoaXMuZXZlbnRJZCxcbiAgICB9KTtcblxuICAgIHRoaXMuaHR0cC5wb3N0KHVybCwgYm9keSwgeyBoZWFkZXJzIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgLy8gQWRkaXRpb25hbCByZXNwb25zZSBoYW5kbGluZyBpZiBuZWVkZWRcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogJywgZXJyKTtcbiAgICAgICAgdGhpcy5pc0NoYXRpbmdXaXRoQWkgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmlucHV0ID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFdvcmtmbG93ID0gbnVsbDtcbiAgICB0aGlzLm9wZW5Xb3JrZmxvd0lucHV0ID0gZmFsc2U7XG4gICAgdGhpcy5pc1dvcmtmbG93T3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdlbmVyYXRlTWFya2Rvd24odGl0bGUsIG9iaikge1xuICAgIC8vIEluaXRpYWxpemUgbWFya2Rvd24gd2l0aCB0aGUgdGl0bGVcbiAgICBsZXQgbWFya2Rvd24gPSBgIyMgJHt0aXRsZX1cXG5gO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBvYmplY3QgYW5kIGFwcGVuZCB0aGUgZmllbGQgbmFtZXMgYW5kIHZhbHVlc1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIHZhciBrZXlfbGFiZWwgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3cuVHJpZ2dlci5JbnB1dFNjaGVtYS5maW5kKFxuICAgICAgICAgIChpbnB1dCkgPT4gaW5wdXQuSW5wdXRJZCA9PT0ga2V5LFxuICAgICAgICApPy5MYWJlbCB8fCBrZXk7XG4gICAgICBtYXJrZG93biArPSBgLSAqKiR7a2V5X2xhYmVsfSoqOiAke3ZhbHVlfVxcbmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmtkb3duO1xuICB9XG5cbiAgc2hvd1dvcmtmbG93SGlzdG9yeURldGFpbHMod29ya2Zsb3dfaWQpIHtcbiAgICBpZiAoIXdvcmtmbG93X2lkKSB7XG4gICAgICB0aGlzLndvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRoaXMuY3VycmVudFdvcmtmbG93RXhlY3V0aW9uRGV0YWlscztcbiAgICAgIHRoaXMuc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ib3RTZXJ2aWNlLmdldFdvcmtmbG93RXhlY3V0aW9uQnlJZCh3b3JrZmxvd19pZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIGlmIChyZXMgJiYgcmVzLkFjdGlvbnMgJiYgQXJyYXkuaXNBcnJheShyZXMuQWN0aW9ucykpIHtcbiAgICAgICAgcmVzLkFjdGlvbnMgPSByZXMuQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICAgIGlmIChhY3Rpb24uSW5zZXJ0VGltZVN0YW1wKSB7XG4gICAgICAgICAgICBhY3Rpb24uSW5zZXJ0VGltZVN0YW1wID0gZm9ybWF0VGltZVN0YW1wcyhcbiAgICAgICAgICAgICAgdGhpcy50aW1lem9uZSxcbiAgICAgICAgICAgICAgYWN0aW9uLkluc2VydFRpbWVTdGFtcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXMuSW5zZXJ0VGltZVN0YW1wID0gZm9ybWF0VGltZVN0YW1wcyhcbiAgICAgICAgdGhpcy50aW1lem9uZSxcbiAgICAgICAgcmVzLkluc2VydFRpbWVTdGFtcCxcbiAgICAgICk7XG4gICAgICB0aGlzLndvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHJlcztcbiAgICAgIHRoaXMuc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IHRydWU7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBjbG9zZU1vZGFsKCkge1xuICAgIHRoaXMuc2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlscyA9IGZhbHNlO1xuICB9XG5cbiAgb2JqZWN0VG9BcnJheShvYmo6IGFueSk6IGFueVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5tYXAoKGtleSkgPT4gKHsga2V5LCB2YWx1ZTogb2JqW2tleV0gfSkpO1xuICB9XG5cbiAgc3RhcnROZXdDb252ZXJzYXRpb24oKSB7XG4gICAgdGhpcy51c2VySGFzU2Nyb2xsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbktleSA9IHRoaXMuY29udmVyc2F0aW9uU2VydmljZS5nZXRLZXkoXG4gICAgICB0aGlzLmJvdElkLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICApO1xuICAgIHRoaXMuY2hhdExvZyA9IFt0aGlzLmNoYXRMb2dbMF1dO1xuICAgIHRoaXMuaXNDaGF0aW5nV2l0aEFpID0gZmFsc2U7XG4gICAgdGhpcy5kaXNjb25uZWN0QXNrV2ViU29ja2V0KCk7XG4gICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGluaXRpYWxpemVTcGVlY2hSZWNvZ25pemVyKHRva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNwZWVjaENvbmZpZyA9IFNwZWVjaFNESy5TcGVlY2hDb25maWcuZnJvbUF1dGhvcml6YXRpb25Ub2tlbihcbiAgICAgIHRva2VuLFxuICAgICAgdGhpcy5yZWdpb24sXG4gICAgKTtcbiAgICBjb25zdCBhdWRpb0NvbmZpZyA9IFNwZWVjaFNESy5BdWRpb0NvbmZpZy5mcm9tRGVmYXVsdE1pY3JvcGhvbmVJbnB1dCgpO1xuICAgIHRoaXMucmVjb2duaXplciA9IG5ldyBTcGVlY2hTREsuU3BlZWNoUmVjb2duaXplcihcbiAgICAgIHRoaXMuc3BlZWNoQ29uZmlnLFxuICAgICAgYXVkaW9Db25maWcsXG4gICAgKTtcblxuICAgIHRoaXMucmVjb2duaXplci5yZWNvZ25pemluZyA9IChzLCBlKSA9PiB7XG4gICAgICBpZiAoZS5yZXN1bHQucmVhc29uID09PSBTcGVlY2hTREsuUmVzdWx0UmVhc29uLlJlY29nbml6aW5nU3BlZWNoKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBlLnJlc3VsdC50ZXh0O1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVjb2duaXppbmc6ICR7ZS5yZXN1bHQudGV4dH1gKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucmVjb2duaXplci5yZWNvZ25pemVkID0gKHMsIGUpID0+IHtcbiAgICAgIGlmIChlLnJlc3VsdC5yZWFzb24gPT09IFNwZWVjaFNESy5SZXN1bHRSZWFzb24uUmVjb2duaXplZFNwZWVjaCkge1xuICAgICAgICB0aGlzLmlucHV0ID0gZS5yZXN1bHQudGV4dDtcbiAgICAgICAgY29uc29sZS5sb2coYFJlY29nbml6ZWQ6ICR7ZS5yZXN1bHQudGV4dH1gKTtcbiAgICAgICAgdGhpcy50b2dnbGVSZWNvcmRpbmcoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMucmVjb2duaXplci5jYW5jZWxlZCA9IChzLCBlKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDYW5jZWxlZDogJywgZS5lcnJvckRldGFpbHMpO1xuICAgIH07XG5cbiAgICB0aGlzLnJlY29nbml6ZXIuc2Vzc2lvblN0b3BwZWQgPSAocywgZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ1Nlc3Npb24gc3RvcHBlZC4nKTtcbiAgICAgIHRoaXMucmVjb2duaXplci5zdG9wQ29udGludW91c1JlY29nbml0aW9uQXN5bmMoKTtcbiAgICAgIHRoaXMuZmV0Y2hEYXRhKCk7XG4gICAgfTtcbiAgfVxuXG4gIHRvZ2dsZVJlY29yZGluZygpIHtcbiAgICB0aGlzLmlzUmVjb3JkaW5nID0gIXRoaXMuaXNSZWNvcmRpbmc7XG5cbiAgICBpZiAodGhpcy5pc1JlY29yZGluZykge1xuICAgICAgdGhpcy5zdGFydFJlY29nbml0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcFJlY29nbml0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhcnRSZWNvZ25pdGlvbigpIHtcbiAgICB0aGlzLnJlY29nbml6ZXIuc3RhcnRDb250aW51b3VzUmVjb2duaXRpb25Bc3luYygpO1xuICB9XG5cbiAgc3RvcFJlY29nbml0aW9uKCkge1xuICAgIHRoaXMucmVjb2duaXplci5zdG9wQ29udGludW91c1JlY29nbml0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIGNoZWNrRm9yQ29wMjlCb3RJZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5ib3RJZCA9PSAnNjZmYTNmMjc2YzVkNzFlMjcxN2JmZWE4JyB8fFxuICAgICAgdGhpcy5ib3RJZCA9PSAnNjcxNjMzNTQ1NjUyZGQ3OGVmZWM4NDhkJ1xuICAgICk7XG4gIH1cblxuICBnZXRMYXRlc3RUaW1lKHRpbWUpOiBzdHJpbmcge1xuICAgIGlmICh0aW1lKSB7XG4gICAgICByZXR1cm4gdGltZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7XG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICB9KTsgLy8gcmV0dXJucyBjdXJyZW50IHRpbWUgaW4gJ3Nob3J0VGltZScgZm9ybWF0XG4gIH1cblxuICAvKiogVXNlZCBieSB0aGUgdm9pY2UgbW9kYWwgd2hlbiBvcGVuZWQgZnJvbSB0aGlzIGRyYXdlci4gKi9cbiAgdm9pY2VNb2RhbENvbnZlcnNhdGlvbklkOiBzdHJpbmcgPSAnJztcblxuICBvcGVuVm9pY2VNb2RhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb252ZXJzYXRpb25JZCA9XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbktleSA/P1xuICAgICAgdGhpcy5jb252ZXJzYXRpb25TZXJ2aWNlLmdldEtleSh0aGlzLmJvdElkLCBmYWxzZSwgdGhpcy5ldmVudElkKSA/P1xuICAgICAgJyc7XG4gICAgdGhpcy52b2ljZU1vZGFsQ29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICB0aGlzLnNldHVwVm9pY2VUcmFuc2NyaXB0cygpO1xuXG4gICAgLy8gQ2xvc2UgZXhpc3Rpbmcgb3ZlcmxheSBpZiBhbnlcbiAgICBpZiAodGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZikge1xuICAgICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBWb2ljZU1vZGFsQ29uZmlnID0ge1xuICAgICAgYXBpVXJsOiB0aGlzLmVudmlyb25tZW50Py5CQVNFX1VSTCA/PyAnJyxcbiAgICAgIHRva2VuOiB0aGlzLnMyN1Rva2VuID8/ICcnLFxuICAgICAgYm90SWQ6IHRoaXMuYm90SWQgPz8gJycsXG4gICAgICBjb252ZXJzYXRpb25JZCxcbiAgICAgIGFwaUtleTogdGhpcy5hcGlLZXkgPz8gJycsXG4gICAgICBldmVudFRva2VuOiB0aGlzLmV2ZW50VG9rZW4gPz8gJycsXG4gICAgICBldmVudElkOiB0aGlzLmV2ZW50SWQsXG4gICAgICBldmVudFVybDogdGhpcy5ldmVudFVybCA/PyAnJyxcbiAgICAgIGRvbWFpbkF1dGhvcml0eTogdGhpcy5kb21haW5BdXRob3JpdHlWYWx1ZSA/PyAncHJvZC1saXRlJyxcbiAgICAgIGFnZW50TmFtZTogdGhpcy5ib3ROYW1lIHx8ICdBSSBBc3Npc3RhbnQnLFxuICAgICAgYWdlbnRSb2xlOiB0aGlzLmJvdFNraWxscyB8fCAnQUkgQWdlbnQgU3BlY2lhbGlzdCcsXG4gICAgICBhZ2VudEF2YXRhcjogdGhpcy5ib3RJY29uLFxuICAgICAgdXNlcnNBcGlVcmw6IHRoaXMuZW52aXJvbm1lbnQ/LlVTRVJTX0FQSSA/PyAnJyxcbiAgICB9O1xuXG4gICAgY29uc3QgY2xvc2VDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmKSB7XG4gICAgICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvc2VWb2ljZU1vZGFsKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKFxuICAgICAgW1xuICAgICAgICB7IHByb3ZpZGU6IFZPSUNFX01PREFMX0NPTkZJRywgdXNlVmFsdWU6IGNvbmZpZyB9LFxuICAgICAgICB7IHByb3ZpZGU6IFZPSUNFX01PREFMX0NMT1NFX0NBTExCQUNLLCB1c2VWYWx1ZTogY2xvc2VDYWxsYmFjayB9LFxuICAgICAgXSxcbiAgICAgIHRoaXMuaW5qZWN0b3IsXG4gICAgKTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpLFxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5XG4gICAgICAgIC5wb3NpdGlvbigpXG4gICAgICAgIC5nbG9iYWwoKVxuICAgICAgICAuYm90dG9tKCcwJylcbiAgICAgICAgLnJpZ2h0KCcwJylcbiAgICAgICAgLmxlZnQoJzAnKVxuICAgICAgICAudG9wKCcwJyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgVm9pY2VBZ2VudE1vZGFsQ29tcG9uZW50LFxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgaW5qZWN0b3IsXG4gICAgKTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChwb3J0YWwpO1xuICAgIHRoaXMudm9pY2VNb2RhbE92ZXJsYXlSZWYgPSBvdmVybGF5UmVmO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2xvc2VWb2ljZU1vZGFsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgdGhpcy52b2ljZU1vZGFsT3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLnZvaWNlTW9kYWxPdmVybGF5UmVmID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5pc1ZvaWNlTW9kYWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBSZWxvYWQgY2hhdCBoaXN0b3J5IHdoZW4gdm9pY2UgbW9kYWwgY2xvc2VzIChzYW1lIGFzIGluaXRpYWwgbG9hZClcbiAgICB0aGlzLmNoYXRMb2cgPSBbXTtcbiAgICB0aGlzLmZldGNoQ2hhdEhpc3RvcnkoKS5zdWJzY3JpYmUoXG4gICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWFwQ2hhdEhpc3RvcnkocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnRXJyb3IgZmV0Y2hpbmcgY2hhdCBoaXN0b3J5IGFmdGVyIHZvaWNlIG1vZGFsIGNsb3NlOicsXG4gICAgICAgICAgZXJyLFxuICAgICAgICApO1xuICAgICAgICAvLyBGYWxsYmFjazogc2hvdyBncmVldGluZyBzbyBjaGF0IGlzIG5vdCBlbXB0eVxuICAgICAgICBpZiAodGhpcy5jaGF0TG9nLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmdyZWV0aW5nTXNnKSB7XG4gICAgICAgICAgdGhpcy5tYXBDaGF0SGlzdG9yeSh7IE1lc3NhZ2VzOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFZvaWNlVHJhbnNjcmlwdHMoKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgc3Vic2NyaXB0aW9uc1xuICAgIHRoaXMudm9pY2VUcmFuc2NyaXB0U3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLnZvaWNlVHJhbnNjcmlwdFN1YnNjcmlwdGlvbnMgPSBbXTtcblxuICAgIC8vIFN1YnNjcmliZSB0byB1c2VyIHRyYW5zY3JpcHRzXG4gICAgY29uc3QgdXNlclN1YiA9IHRoaXMudm9pY2VBZ2VudFNlcnZpY2UudXNlclRyYW5zY3JpcHQkLnN1YnNjcmliZShcbiAgICAgICh0cmFuc2NyaXB0KSA9PiB7XG4gICAgICAgIGlmICh0cmFuc2NyaXB0LmZpbmFsICYmIHRyYW5zY3JpcHQudGV4dC50cmltKCkpIHtcbiAgICAgICAgICAvLyBBZGQgdXNlciBtZXNzYWdlIHRvIGNoYXRcbiAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAndXNlcicsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnByb2Nlc3NNZXNzYWdlRm9yRGlzcGxheSh0cmFuc2NyaXB0LnRleHQpLFxuICAgICAgICAgICAgdGltZTogZm9ybWF0Tm93KHRoaXMudGltZXpvbmUpLFxuICAgICAgICAgICAgY29waWVkOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYm90IHRyYW5zY3JpcHRzXG4gICAgY29uc3QgYm90U3ViID0gdGhpcy52b2ljZUFnZW50U2VydmljZS5ib3RUcmFuc2NyaXB0JC5zdWJzY3JpYmUoXG4gICAgICAodHJhbnNjcmlwdCkgPT4ge1xuICAgICAgICBpZiAodHJhbnNjcmlwdCAmJiB0cmFuc2NyaXB0LnRyaW0oKSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIGxhc3QgbWVzc2FnZSBpcyBmcm9tIGJvdCwgdXBkYXRlIGl0LCBvdGhlcndpc2UgYWRkIG5ld1xuICAgICAgICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gdGhpcy5jaGF0TG9nW3RoaXMuY2hhdExvZy5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdE1lc3NhZ2UgJiYgbGFzdE1lc3NhZ2UudHlwZSA9PT0gJ2FpJykge1xuICAgICAgICAgICAgbGFzdE1lc3NhZ2UubWVzc2FnZSA9IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KHRyYW5zY3JpcHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoYXRMb2cucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdhaScsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KHRyYW5zY3JpcHQpLFxuICAgICAgICAgICAgICB0aW1lOiBmb3JtYXROb3codGhpcy50aW1lem9uZSksXG4gICAgICAgICAgICAgIGNvcGllZDogZmFsc2UsXG4gICAgICAgICAgICAgIGlzQ29sbGFwc2VkVHJ1ZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9IHRoaXMuY2hhdExvZy5sZW5ndGggLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMudm9pY2VUcmFuc2NyaXB0U3Vic2NyaXB0aW9ucy5wdXNoKHVzZXJTdWIsIGJvdFN1Yik7XG4gIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VNb2RhbENvbmZpZyB9IGZyb20gJy4uL3ZvaWNlLWFnZW50L3ZvaWNlLW1vZGFsLXRva2Vucyc7XG4iLCI8IS0tIDxidXR0b25cbiAgKm5nSWY9XCJpc1Nob3dFZGl0b3JCdXR0b24gJiYgIWNoZWNrRm9yQ29wMjlCb3RJZCgpXCJcbiAgKGNsaWNrKT1cIm9wZW5PdXRlckVkaXRvcigpXCJcbiAgY2xhc3M9XCJmaXhlZC1idG5cIlxuPlxuICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweFwiIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICBjcmVhdGVcbiAgPC9zcGFuPlxuICBFZGl0b3JcbjwvYnV0dG9uPiAtLT5cblxuPGJ1dHRvblxuICAqbmdJZj1cIiFpc1Nob3dFZGl0b3JCdXR0b25cIlxuICAoY2xpY2spPVwib25DbG9zZUVkaXRvcigpXCJcbiAgY2xhc3M9XCJmaXhlZC1idG4tY2xvc2VcIlxuPlxuICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweFwiIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICBjbG9zZVxuICA8L3NwYW4+XG4gIHt7IGdldFRyYW5zbGF0aW9uKFwiQ2xvc2VcIikgfX1cbjwvYnV0dG9uPlxuXG48bWF0LWRyYXdlci1jb250YWluZXJcbiAgY2xhc3M9XCJoaXZlZ3B0LWNoYXQtYm90LXdyYXBwZXJcIlxuICBbbmdDbGFzc109XCJ7ICdtYXQtZHJhd2VyLWNvbnRhaW5lci1oYXMtb3Blbic6IGlzRHJhd2VyT3BlbiB9XCJcbiAgW2NsYXNzLmlvcy1kZXZpY2VdPVwiaXNJT1NEZXZpY2VcIlxuICBbaGFzQmFja2Ryb3BdPVwiaGFzQmFja2Ryb3BWYWx1ZVwiXG4+XG4gIDxtYXQtZHJhd2VyXG4gICAgY2xhc3M9XCJkcmF3ZXJcIlxuICAgICNkcmF3ZXJcbiAgICBbcG9zaXRpb25dPVwiJ3N0YXJ0J1wiXG4gICAgW21vZGVdPVwiJ292ZXInXCJcbiAgICBvcGVuZWQ9XCJ0cnVlXCJcbiAgICBbY2xhc3MuZnVsbC13aWR0aC1kcmF3ZXJdPVwiZnVsbFZpZXdcIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIlxuICAgICAgJ2xpbmVhci1ncmFkaWVudCgnICsgKGJnR3JhZGllbnQgPyBiZ0dyYWRpZW50LmpvaW4oJywgJykgOiAnJykgKyAnKSdcbiAgICBcIlxuICA+XG4gICAgPG1hdC1kcmF3ZXItY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LW1haW5cIj5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY2hhdC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgyPiAtLT5cbiAgICAgICAgPCEtLSB7e2V2ZW50TmFtZX19IC0tPlxuICAgICAgICA8IS0tIDwvaDI+IC0tPlxuICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJjbG9zZUljb25cIiAoY2xpY2spPVwib25DbG9zZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICAgIDwhLS0gPC9kaXY+IC0tPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbm5lckNoYXRcIiAjY2hhdE1haW4+XG4gICAgICAgICAgPGRpdiAoY2xpY2spPVwic3RhcnROZXdDb252ZXJzYXRpb24oKVwiIGNsYXNzPVwibmV3LWNvbnZlcnNhdGlvbmJ1dHRvbjJcIj5cbiAgICAgICAgICAgIHt7IGdldFRyYW5zbGF0aW9uKFwiTmV3IENoYXRcIikgfX1cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgID48c3ZnXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgd2lkdGg9XCIxNC4wNjFcIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjE0LjI2MVwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNC4wNjEgMTQuMjYxXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBpZD1cIlBhdGhfMTY0XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtbmFtZT1cIlBhdGggMTY0XCJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuMTQ2LDUuMDc1SDQuNTMxQTEuNTQ0LDEuNTQ0LDAsMCwwLDMsNi42MzF2Ny4yNjJBMS41NDQsMS41NDQsMCwwLDAsNC41MzEsMTUuNDVoNy4xNDZhMS41NDQsMS41NDQsMCwwLDAsMS41MzEtMS41NTZWOC4xODdtLTcuMTQ2LDQuMTVMMTUuMjUsM20wLDBIMTEuNjc3TTE1LjI1LDNWNi42MzFcIlxuICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjI1IC0xLjkzOSlcIlxuICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzA2ZlwiXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlQm90LmVtaXQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImNoYXQtY2xvc2UtYnV0dG9uXCJcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRUcmFuc2xhdGlvbignQ2xvc2UnKSB8fCAnQ2xvc2UnXCJcbiAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cImdldFRyYW5zbGF0aW9uKCdDbG9zZScpIHx8ICdDbG9zZSdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGF0LWNsb3NlLWJ1dHRvbi1pY29uXCI+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOCA2TDYgMThNNiA2bDEyIDEyXCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJvdC1zdGlja3ktaGVhZGVyLWNoYXRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZV9jaGF0XCI+XG4gICAgICAgICAgICAgIDxoMj5cbiAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgIHt7IGdldFRyYW5zbGF0aW9uKGJvdE5hbWUpIH19XG4gICAgICAgICAgICAgICAgICA8IS0tIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhY2hlY2tGb3JDb3AyOUJvdElkKClcIlxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIzMS40OTlcIlxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIzMS41MDFcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDMxLjQ5OSAzMS41MDFcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwiSWNvbl9pb24tc2hpZWxkLWNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1uYW1lPVwiSWNvbiBpb24tc2hpZWxkLWNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMy42ODUsNy44M2ExLjEyNSwxLjEyNSwwLDAsMC0uOTI1LTEuMDM2LDQ5LjIyNyw0OS4yMjcsMCwwLDEtMTQuMy00LjQ0NCwxLjEyNSwxLjEyNSwwLDAsMC0uOTI3LDBBNDkuMjI2LDQ5LjIyNiwwLDAsMSwzLjI0LDYuNzk0LDEuMTI1LDEuMTI1LDAsMCwwLDIuMzE1LDcuODNhMjcuNjIxLDI3LjYyMSwwLDAsMCwxLjcxOCwxMS45QTI0LjU3MiwyNC41NzIsMCwwLDAsOS4wNywyNy42NDFhMjUuNzEyLDI1LjcxMiwwLDAsMCw4LjUxMyw2LjAyOCwxLjEyNSwxLjEyNSwwLDAsMCwuODQ0LDAsMjUuNzEyLDI1LjcxMiwwLDAsMCw4LjUxMy02LjAyOCwyNC41NzIsMjQuNTcyLDAsMCwwLDUuMDI3LTcuOTExLDI3LjYyMSwyNy42MjEsMCwwLDAsMS43MTgtMTEuOVptLTkuMjExLDUuMjgxLTcuNzkxLDlhMS4xMjUsMS4xMjUsMCwwLDEtLjguMzg5aC0uMDQ2YTEuMTI1LDEuMTI1LDAsMCwxLS43ODgtLjMyMkwxMS41ODcsMTguNzlhMS4xMjUsMS4xMjUsMCwxLDEsMS41NzUtMS42MDdsMi42LDIuNTUyLDcuMDEtOC4xYTEuMTI1LDEuMTI1LDAsMCwxLDEuNywxLjQ3MlpcIlxuICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi4yNSAtMi4yNSlcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMDZmXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvc3ZnPiAtLT5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY2hlY2tGb3JDb3AyOUJvdElkKClcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic21hbGwtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oXCJBSS1wb3dlcmVkXCIpXG4gICAgICAgICAgICAgICAgICAgIH19PHNwYW4+e3sgZ2V0VHJhbnNsYXRpb24oXCJjb3BpbG90XCIpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXRUeXBlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lXCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cImxhYmVsQ2hhdFwiPkNob29zZSBhIGNvbnZlcnNhdGlvbiBzdHlsZTwvaDQ+XG4gICAgICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cImNoYW5nZVRlbXBlcmF0dXJlKDApXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiB0ZW1wZXJhdHVyZSA9PT0gMCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9wLXNlY3Rpb24tdGl0bGVcIj4gTW9yZSBDcmVhdGl2ZSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSAoY2xpY2spPVwiY2hhbmdlVGVtcGVyYXR1cmUoMSlcIiBjbGFzcz1cImZkc3NmZFwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogdGVtcGVyYXR1cmUgPT09IDEgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvcC1zZWN0aW9uLXRpdGxlXCI+IE1vcmUgQmFsYW5jZWQgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cImNoYW5nZVRlbXBlcmF0dXJlKDIpXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiB0ZW1wZXJhdHVyZSA9PT0gMiB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9wLXNlY3Rpb24tdGl0bGVcIj4gTW9yZSBQcmVjaXNlIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8IS0tIGNoYXR0eXBlIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGlkPVwiYm90QWxsQ2hhdFwiXG4gICAgICAgICAgICBjbGFzcz1cImNoYXRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICBib3RVc2VyOiBjaGF0Py50eXBlID09PSAndXNlcicsXG4gICAgICAgICAgICAgIGJvdEFpOiBjaGF0Py50eXBlICE9PSAndXNlcidcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1tc2ctaWRdPVwiY2hhdD8uX2lkIHx8IG51bGxcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoYXQgb2YgY2hhdExvZzsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYm94XCIgKm5nSWY9XCIhKGkgPT09IDAgJiYgYm90U2tpbGxzKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1jdGFcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAndGltZS1jdGEgZGluJzogc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9PT0gaSxcbiAgICAgICAgICAgICAgICAgICAgJ3RpbWUtY3RhJzogc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCAhPSBpXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiSWNvbl9UaW1lU1RhbXBcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICdhaScgJiYgIShpID09PSAwICYmIGJvdFNraWxscylcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJBc3Npc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWF2YXRhci1pbWdcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIShkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1hdmF0YXItaW5pdGlhbHMgY2hhdC1hdmF0YXItaW5pdGlhbHMtYXNzaXN0YW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5BPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJkYXRlVGltZUNvbG9yID8gJycgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7XCI+e3sgZ2V0VHJhbnNsYXRpb24oXCJBc3Npc3RhbnRcIikgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3sgY2hhdD8udGltZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiSWNvbl9UaW1lU1RhbXBcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdzZXNzaW9uX2NhcmRzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhdHRlbmRlZV9jYXJkcydcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiQXNzaXN0YW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1hdmF0YXItaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYXZhdGFyLWluaXRpYWxzIGNoYXQtYXZhdGFyLWluaXRpYWxzLWFzc2lzdGFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+QTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGVUaW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZGF0ZVRpbWVDb2xvciA/ICcnIDogJydcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0VHJhbnNsYXRpb24oXCJBc3Npc3RhbnRcIikgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAge3sgY2hhdD8udGltZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiSWNvbl9UaW1lU1RhbXBcIiAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICd1c2VyJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1Cb3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZVRpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGdldFRyYW5zbGF0aW9uKFwiWW91XCIpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hhdD8udGltZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXJBdmF0YXJVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cInVzZXJBdmF0YXJVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJZb3VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYXZhdGFyLWltZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhdXNlckF2YXRhclVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hhdC1hdmF0YXItaW5pdGlhbHMgY2hhdC1hdmF0YXItaW5pdGlhbHMtdXNlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID57eyBnZXRVc2VySWRJbml0aWFscygpIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFyZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJhcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdD8uV29ya2Zsb3dFeGVjdXRpb25JZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0Py5zaG93V29ya2Zsb3dFeGVjdXRpb25Mb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dXb3JrZmxvd0hpc3RvcnlEZXRhaWxzKGNoYXQuV29ya2Zsb3dFeGVjdXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYmFyc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVzZWFyY2hpbmdDYXJkXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGF0Py5zZWFyY2hUZXJtcyAmJiBjaGF0Py5zZWFyY2hUZXJtcy5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc291cmNlc0xpc3QgJiYgY2hhdD8uc291cmNlc0xpc3Q/Lmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbGxhcHNlKClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIlxuICAgICAgICAgICAgICAgICAgICAgID48aSBjbGFzcz1cImJ4IGJ4LXBsdXMtY2lyY2xlIGJ4LXNtXCI+PC9pXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgPlJlc2VhcmNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwidG9nZ2xlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1pY29uIG1sLTIgZmFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnZmEtY2hldnJvbi1kb3duJzogaXNDb2xsYXBzZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdmYS1jaGV2cm9uLXVwJzogIWlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py5zZWFyY2hUZXJtcyAmJiBjaGF0Py5zZWFyY2hUZXJtcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBjb2xsYXBzZTogaXNDb2xsYXBzZWQgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCB1cHRMaXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGVybSBvZiBjaGF0Py5zZWFyY2hUZXJtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoaW5nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57eyB0ZXJtIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cblxuICAgICAgICAgICAgICAgICAgICA8aDVcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8uc291cmNlc0xpc3QgJiYgY2hhdD8uc291cmNlc0xpc3QubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImJ4IGJ4LXVuaXRlXCI+PC9pPiBTb3VyY2VzXG4gICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvdXJjZXMtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/LnNvdXJjZXNMaXN0ICYmIGNoYXQ/LnNvdXJjZXNMaXN0Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3VyY2UtY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSBvZiBjaGF0Py5kaXNwbGF5ZWRTb3VyY2VzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3VyY2UtdGl0bGVcIj57eyBzb3VyY2UudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS11cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0RmF2aWNvblVybChzb3VyY2UubGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJnZXREb21haW5OYW1lKHNvdXJjZS5saW5rKSArICcgZmF2aWNvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RG9tYWluTmFtZShzb3VyY2UubGluaykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic291cmNlLXVybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkxpbmtJbk5ld1RhYihzb3VyY2UubGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0RmF2aWNvblVybChzb3VyY2UubGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cImdldERvbWFpbk5hbWUoc291cmNlLmxpbmspICsgJyBmYXZpY29uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RG9tYWluTmFtZShzb3VyY2UubGluaykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgKGNsaWNrKT1cIm9wZW5MaW5rSW5OZXdUYWIoc291cmNlLmxpbmspXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzb3VyY2UudGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIChjbGljayk9XCJvcGVuTGlua0luTmV3VGFiKHNvdXJjZS5saW5rKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc291cmNlLmRlc2MgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdD8ucmVtYWluaW5nU291cmNlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0Py5yZW1haW5pbmdTb3VyY2VzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvdXJjZS1jYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FyZENsaWNrKGNoYXQ/LnNvdXJjZXNMaXN0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlIG9mIGNoYXQ/LnJlbWFpbmluZ1NvdXJjZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJsb2NrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJnZXRGYXZpY29uVXJsKHNvdXJjZS5saW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwiZ2V0RG9tYWluTmFtZShzb3VyY2UubGluaykgKyAnIGZhdmljb24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZS11cmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcge3sgY2hhdD8ucmVtYWluaW5nU291cmNlcy5sZW5ndGggfX0gbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBTZXNzaW9uIGNhcmRzIChmcm9tIGdldF9ldmVudF9zZXNzaW9ucyB0b29sLCBzYW1lIGFzIFJlYWN0IE5hdGl2ZSkgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmRzLXNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ3Nlc3Npb25fY2FyZHMnICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnNlc3Npb25DYXJkcz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8ubWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogYmdCdWJibGVBaSB8fCAnI2ZmZicgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJTZWFyY2hUaXRsZSBhaSBjYXJkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXNzaW9uIG9mIGdldFZpc2libGVTZXNzaW9uQ2FyZHMoY2hhdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1jYXJkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZXNzaW9uLWNhcmQtaXRlbS1vbmRlbWFuZF09XCJpc1Nlc3Npb25PbmRlbWFuZChzZXNzaW9uKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9uRGVtYW5kIGRlc2lnbjogcGlsbCwgQXZhaWxhYmxlIEFueXRpbWUsIHRpdGxlLCBkZXNjcmlwdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTZXNzaW9uT25kZW1hbmQoc2Vzc2lvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLW9uZGVtYW5kLWJhZGdlXCI+e3sgZ2V0VHJhbnNsYXRpb24oJ09OIERFTUFORCcpIHx8ICdPTiBERU1BTkQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1vbmRlbWFuZC1hdmFpbGFibGVcIj57eyBnZXRUcmFuc2xhdGlvbignQXZhaWxhYmxlIEFueXRpbWUnKSB8fCAnQXZhaWxhYmxlIEFueXRpbWUnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLXRpdGxlIHNlc3Npb24tY2FyZC1vbmRlbWFuZC10aXRsZVwiPnt7IHNlc3Npb24udGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtZGVzY3JpcHRpb24gc2Vzc2lvbi1jYXJkLW9uZGVtYW5kLWRlc2NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlc3Npb24uZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzZXNzaW9uLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtYWN0aW9ucy1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNlc3Npb24uc2Vzc2lvbiAmJiBnZXRTZXNzaW9uUm9sZUJ1dHRvbnMoc2Vzc2lvbikubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGVha2Vycy1VSWNhcmRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvbGUgb2YgZ2V0U2Vzc2lvblJvbGVCdXR0b25zKHNlc3Npb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gc2Vzc2lvbi1jYXJkLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2Vzc2lvbi1jYXJkLWJ0bi1wcmltYXJ5XT1cInJvbGUuYWN0aW9uID09PSAnam9pbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlc3Npb24tY2FyZC1idG4tc2Vjb25kYXJ5XT1cInJvbGUuYWN0aW9uID09PSAnd2F0Y2gnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZXNzaW9uLWNhcmQtYnRuLWRpc2FibGVkXT1cImlzVW5FdmVudCAmJiAhY2FuUGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc1VuRXZlbnQgJiYgIWNhblBlcmZvcm1TZXNzaW9uQWN0aW9uKHNlc3Npb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2Vzc2lvbkNhcmRBY3Rpb24oc2Vzc2lvbiwgcm9sZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvbGUubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlZmF1bHQgKExpdmUvQnJlYWtvdXQpIGRlc2lnbjogZGF0ZSBiYWRnZSwgcm9vbS90aW1lLCB0aXRsZSwgbWV0YSwgZGVzY3JpcHRpb24sIGFjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1Nlc3Npb25PbmRlbWFuZChzZXNzaW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLWRhdGUtYmFkZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlc3Npb24uZGF0ZURheSB8fCBzZXNzaW9uLmRhdGVNb250aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLWRhdGUtZGF5XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZGF0ZURheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLWRhdGUtbW9udGhcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5kYXRlTW9udGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2Vzc2lvbi5kYXRlRGF5ICYmICFzZXNzaW9uLmRhdGVNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtZGF0ZS1uYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGdldFRyYW5zbGF0aW9uKCdOL0EnKSB8fCAnTi9BJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlc3Npb24tY2FyZC1yb29tLXRpbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1jYXJkLXJvb21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2Vzc2lvbi5yb29tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlc3Npb24ucm9vbSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1jYXJkLXRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2Vzc2lvbi50aW1lUmFuZ2VXaXRoVHogfHwgc2Vzc2lvbi50aW1lUmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2Vzc2lvbi50aW1lUmFuZ2VXaXRoVHogfHwgc2Vzc2lvbi50aW1lUmFuZ2UgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vzc2lvbi1jYXJkLXRpdGxlXCI+e3sgc2Vzc2lvbi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1jYXJkLW1ldGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIoc2Vzc2lvbi5vcmdhbml6ZXIgJiYgc2Vzc2lvbi5vcmdhbml6ZXIubGVuZ3RoKSB8fCAoc2Vzc2lvbi5tZWV0aW5nVHlwZSAmJiBzZXNzaW9uLm1lZXRpbmdUeXBlLmxlbmd0aClcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS1yb3dcIiAqbmdJZj1cInNlc3Npb24ub3JnYW5pemVyICYmIHNlc3Npb24ub3JnYW5pemVyLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlc3Npb24tY2FyZC1tZXRhLWxhYmVsXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0VHJhbnNsYXRpb24oXCJPcmdhbml6ZXJcIikgfHwgXCJPcmdhbml6ZXJcIikgKyBcIjpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS12YWx1ZVwiPnt7IHNlc3Npb24ub3JnYW5pemVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS1yb3dcIiAqbmdJZj1cInNlc3Npb24udGltZVpvbmVEaXNwbGF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLW1ldGEtbGFiZWxcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKFwiVGltZSB6b25lXCIpIHx8IFwiVGltZSB6b25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLW1ldGEtdmFsdWVcIj57eyBzZXNzaW9uLnRpbWVab25lRGlzcGxheSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS1yb3dcIiAqbmdJZj1cInNlc3Npb24ubWVldGluZ1R5cGUgJiYgc2Vzc2lvbi5tZWV0aW5nVHlwZS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtbWV0YS1sYWJlbFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvblR5cGVMYWJlbCgpICsgXCI6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2Vzc2lvbi1jYXJkLW1ldGEtdmFsdWVcIj57eyBzZXNzaW9uLm1lZXRpbmdUeXBlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZXNzaW9uLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzZXNzaW9uLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtc3RhdHVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLnN0YXR1c1RleHQgJiYgc2Vzc2lvbi5zdGF0dXNUZXh0Lmxlbmd0aCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2Vzc2lvblJvbGVCdXR0b25zKHNlc3Npb24pLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXNzaW9uLWNhcmQtc3RhdHVzLWJ1bGxldFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNlc3Npb24uc3RhdHVzVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZXNzaW9uLWNhcmQtd2hlbi1kaXNhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2Vzc2lvbj8uc2Vzc2lvblJvbGVzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFpc1Nlc3Npb25PbmRlbWFuZChzZXNzaW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc2Vzc2lvbi5zZXNzaW9uPy5pc0V4cGlyZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhY2FuUGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oXCJZb3UgY2FuIGpvaW4vd2F0Y2ggYXQgdGhlIHN0YXJ0aW5nIHRpbWVcIikgfHwgXCJZb3UgY2FuIGpvaW4vd2F0Y2ggYXQgdGhlIHN0YXJ0aW5nIHRpbWVcIiB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2Vzc2lvbi1jYXJkLWFjdGlvbnMtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uc2Vzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0U2Vzc2lvblJvbGVCdXR0b25zKHNlc3Npb24pLmxlbmd0aCA+IDAgfHwgaGFzU2Vzc2lvbkNhcmRTcGVha2VycyhzZXNzaW9uKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwZWFrZXJzLVVJY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uPy5zcGVha2Vyc0xpc3QgfHwgc2Vzc2lvbj8uc2Vzc2lvbj8uc3BlYWtlcnNMaXN0IHx8IFtdKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgX3NwZWFrZXJDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwIG9mIChzZXNzaW9uPy5zcGVha2Vyc0xpc3QgfHwgc2Vzc2lvbj8uc2Vzc2lvbj8uc3BlYWtlcnNMaXN0IHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPCAzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BlYWtlclwiICpuZ0lmPVwiZ2V0U3BlYWtlclBob3RvVXJsKHNwKTsgZWxzZSBzcGVha2VySW5pdGlhbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0U3BlYWtlclBob3RvVXJsKHNwKSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwiZ2V0U3BlYWtlckRpc3BsYXlOYW1lKHNwKSB8fCAnU3BlYWtlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NwZWFrZXJJbml0aWFscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwZWFrZXIgaW5pdGlhbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRTcGVha2VySW5pdGlhbHMoc3ApIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGVha2VyIGluaXRpYWxzXCIgKm5nSWY9XCJfc3BlYWtlckNvdW50ID4gM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICt7eyBfc3BlYWtlckNvdW50IC0gMyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXNzaW9uLWNhcmQtYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvbGUgb2YgZ2V0U2Vzc2lvblJvbGVCdXR0b25zKHNlc3Npb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBzZXNzaW9uLWNhcmQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2Vzc2lvbi1jYXJkLWJ0bi1wcmltYXJ5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5hY3Rpb24gPT09ICdqb2luJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlc3Npb24tY2FyZC1idG4tc2Vjb25kYXJ5XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZS5hY3Rpb24gPT09ICd3YXRjaCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZXNzaW9uLWNhcmQtYnRuLWRpc2FibGVkXT1cImlzVW5FdmVudCAmJiAhY2FuUGVyZm9ybVNlc3Npb25BY3Rpb24oc2Vzc2lvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNVbkV2ZW50ICYmICFjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5QZXJmb3JtU2Vzc2lvbkFjdGlvbihzZXNzaW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU2Vzc2lvbkNhcmRBY3Rpb24oc2Vzc2lvbiwgcm9sZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcm9sZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5zZXNzaW9uQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTRVNTSU9OX0NBUkRTX0lOSVRJQUwgPlxuICAgICAgICAgICAgICAgICAgICAgICAgNCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFleHBhbmRlZFNlc3Npb25DYXJkSWRzW2NoYXQ/Ll9pZF1cbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hvdy1tb3JlLWNhcmRzLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRTZXNzaW9uQ2FyZHMoY2hhdClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBTaG93XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LnNlc3Npb25DYXJkcz8ubGVuZ3RoIHx8IDApIC0gU0VTU0lPTl9DQVJEU19JTklUSUFMXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG1vcmVcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc2Vzc2lvbkNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU0VTU0lPTl9DQVJEU19JTklUSUFMID09PVxuICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0VHJhbnNsYXRpb24oXCJzZXNzaW9uXCIpIHx8IFwic2Vzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdldFRyYW5zbGF0aW9uKFwic2Vzc2lvbnNcIikgfHwgXCJzZXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQXR0ZW5kZWUgY2FyZHMgKGZyb20gZ2V0X2V2ZW50X2F0dGVuZGVlcyB0b29sLCBzYW1lIGFzIFJlYWN0IE5hdGl2ZSkgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkcy1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhdHRlbmRlZV9jYXJkcycgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8uYXR0ZW5kZWVDYXJkcz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8ubWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogYmdCdWJibGVBaSB8fCAnI2ZmZicgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJTZWFyY2hUaXRsZSBhaSBjYXJkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLWNhcmRzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0ZW5kZWUgb2YgZ2V0VmlzaWJsZUF0dGVuZGVlQ2FyZHMoY2hhdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtY2FyZC1oYXMtdmlkZW9dPVwiISFnZXRBdHRlbmRlZVZpZGVvVXJsKGF0dGVuZGVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWdldEF0dGVuZGVlVmlkZW9VcmwoYXR0ZW5kZWUpICYmIGF0dGVuZGVlLnBob3RvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndXJsKCcgKyBhdHRlbmRlZS5waG90byArICcpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0QXR0ZW5kZWVWaWRlb1VybChhdHRlbmRlZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI2F0dGVuZGVlVmlkZW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmQtdmlkZW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnBvc3Rlcl09XCJnZXRBdHRlbmRlZVZpZGVvUG9zdGVyKGF0dGVuZGVlKSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXV0ZWRdPVwiaXNBdHRlbmRlZVZpZGVvTXV0ZWQoY2hhdCwgYXR0ZW5kZWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsYXkpPVwib25BdHRlbmRlZVZpZGVvUGxheVN0YXRlKGNoYXQsIGF0dGVuZGVlLCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdXNlKT1cIm9uQXR0ZW5kZWVWaWRlb1BsYXlTdGF0ZShjaGF0LCBhdHRlbmRlZSwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5kZWQpPVwib25BdHRlbmRlZVZpZGVvUGxheVN0YXRlKGNoYXQsIGF0dGVuZGVlLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBdHRlbmRlZVZpZGVvUGxheShjaGF0LCBhdHRlbmRlZSwgYXR0ZW5kZWVWaWRlbywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zcmNdPVwiZ2V0QXR0ZW5kZWVWaWRlb1VybChhdHRlbmRlZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInZpZGVvL3dlYm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmlkZW8+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1tdXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUF0dGVuZGVlVmlkZW9NdXRlKGNoYXQsIGF0dGVuZGVlLCBhdHRlbmRlZVZpZGVvLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIGF0dGVuZGVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChnZXRUcmFuc2xhdGlvbignVW5tdXRlJykgfHwgJ1VubXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdNdXRlJykgfHwgJ011dGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIGF0dGVuZGVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChnZXRUcmFuc2xhdGlvbignVW5tdXRlJykgfHwgJ1VubXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdNdXRlJykgfHwgJ011dGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0LCBhdHRlbmRlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwidm9sdW1lX29mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInZvbHVtZV91cFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1wbGF5LWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUF0dGVuZGVlVmlkZW9QbGF5KGNoYXQsIGF0dGVuZGVlLCBhdHRlbmRlZVZpZGVvLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb1BsYXlpbmcoY2hhdCwgYXR0ZW5kZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdQYXVzZScpIHx8ICdQYXVzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdQbGF5JykgfHwgJ1BsYXknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb1BsYXlpbmcoY2hhdCwgYXR0ZW5kZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdQYXVzZScpIHx8ICdQYXVzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdQbGF5JykgfHwgJ1BsYXknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dGVuZGVlVmlkZW9QbGF5aW5nKGNoYXQsIGF0dGVuZGVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwYXVzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcInBsYXlfYXJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLWluaXRpYWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZ2V0QXR0ZW5kZWVWaWRlb1VybChhdHRlbmRlZSkgJiYgIWF0dGVuZGVlLnBob3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0QXR0ZW5kZWVJbml0aWFscyhhdHRlbmRlZS5uYW1lKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtb3ZlcmxheVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLW5hbWVcIj57eyBhdHRlbmRlZS5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYXR0ZW5kZWUuY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhdHRlbmRlZS5jb21wYW55IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1kZXNjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtZGVzYy1jb2xsYXBzZWRdPVwiIWlzQXR0ZW5kZWVEZXNjcmlwdGlvbkV4cGFuZGVkKGNoYXQsIGF0dGVuZGVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmF0dGVuZGVlLWRlc2MtZXhwYW5kZWRdPVwiaXNBdHRlbmRlZURlc2NyaXB0aW9uRXhwYW5kZWQoY2hhdCwgYXR0ZW5kZWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEF0dGVuZGVlRGVzY3JpcHRpb24oYXR0ZW5kZWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEF0dGVuZGVlRGVzY3JpcHRpb24oYXR0ZW5kZWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF0dGVuZGVlLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZS5pZCAhPT0gdXNlcklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29ubmVjdGlvbnNFbmFibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGVuZGluZ1NlbnRSZXF1ZXN0KGF0dGVuZGVlLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi1yZXF1ZXN0LXNlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbignUmVxdWVzdCBTZW50JykgfHwgJ1JlcXVlc3QgU2VudCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbihcIlJlcXVlc3QgU2VudFwiKSB8fCBcIlJlcXVlc3QgU2VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZS5pZCAhPT0gdXNlcklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29ubmVjdGlvbnNFbmFibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkZvbGxvd1VzZXIoYXR0ZW5kZWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGF0dGVuZGVlLWNhcmQtYnRuIGF0dGVuZGVlLWNhcmQtYnRuLWNvbm5lY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbignQ29ubmVjdCcpIHx8ICdDb25uZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWUuaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RXaXRoVXNlci5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBhdHRlbmRlZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oXCJDb25uZWN0XCIpIHx8IFwiQ29ubmVjdFwiIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZS5pZCAhPT0gdXNlcklkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29ubmVjdGlvbnNFbmFibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhblVuZm9sbG93VXNlcihhdHRlbmRlZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYXR0ZW5kZWUtY2FyZC1idG4gYXR0ZW5kZWUtY2FyZC1idG4tZGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdEaXNjb25uZWN0JykgfHwgJ0Rpc2Nvbm5lY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZS5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IGF0dGVuZGVlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKFwiRGlzY29ubmVjdFwiKSB8fCBcIkRpc2Nvbm5lY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi12aWV3LXByb2ZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhdHRlbmRlZS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWF0dGVuZGVlLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbignUHJvZmlsZSBub3QgYXZhaWxhYmxlJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm9maWxlIG5vdCBhdmFpbGFibGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ1ZpZXcgUHJvZmlsZScpIHx8ICdWaWV3IFByb2ZpbGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWUuaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0V2l0aFVzZXIuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IGF0dGVuZGVlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1Byb2ZpbGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRUcmFuc2xhdGlvbihcIlZpZXcgUHJvZmlsZVwiKSB8fCBcIlZpZXcgUHJvZmlsZVwiIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LmF0dGVuZGVlQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBBVFRFTkRFRV9DQVJEU19JTklUSUFMID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhZXhwYW5kZWRBdHRlbmRlZUNhcmRJZHNbY2hhdD8uX2lkXVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY2FyZHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZEF0dGVuZGVlQ2FyZHMoY2hhdClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBTaG93XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LmF0dGVuZGVlQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBBVFRFTkRFRV9DQVJEU19JTklUSUFMXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG1vcmVcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uYXR0ZW5kZWVDYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIEFUVEVOREVFX0NBUkRTX0lOSVRJQUwgPT09XG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbihcImF0dGVuZGVlXCIpIHx8IFwiYXR0ZW5kZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRUcmFuc2xhdGlvbihcImF0dGVuZGVlc1wiKSB8fCBcImF0dGVuZGVlc1wiXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gU3BlYWtlciBjYXJkcyAoZnJvbSBnZXRfZXZlbnRfc3BlYWtlcnMgdG9vbCwgc2FtZSBsYXlvdXQvYmVoYXZpb3IgYXMgYXR0ZW5kZWUgY2FyZHMpIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3BlYWtlci1jYXJkcy1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdzcGVha2VyX2NhcmRzJyAmJlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py5zcGVha2VyQ2FyZHM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNhcmQtbWVzc2FnZS1idWJibGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGJnQnViYmxlQWkgfHwgJyNmZmYnIH1cIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiU2VhcmNoVGl0bGUgYWkgY2FyZC1tZXNzYWdlLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiY2hhdD8ubWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3A+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1jYXJkcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWFrZXIgb2YgZ2V0VmlzaWJsZVNwZWFrZXJDYXJkcyhjaGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hdHRlbmRlZS1jYXJkLWhhcy12aWRlb109XCIhIWdldEF0dGVuZGVlVmlkZW9Vcmwoc3BlYWtlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFnZXRBdHRlbmRlZVZpZGVvVXJsKHNwZWFrZXIpICYmIHNwZWFrZXIucGhvdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICd1cmwoJyArIHNwZWFrZXIucGhvdG8gKyAnKSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEF0dGVuZGVlVmlkZW9Vcmwoc3BlYWtlcilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NwZWFrZXJWaWRlb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC12aWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucG9zdGVyXT1cImdldEF0dGVuZGVlVmlkZW9Qb3N0ZXIoc3BlYWtlcikgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW211dGVkXT1cImlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIHNwZWFrZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsYXkpPVwib25BdHRlbmRlZVZpZGVvUGxheVN0YXRlKGNoYXQsIHNwZWFrZXIsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF1c2UpPVwib25BdHRlbmRlZVZpZGVvUGxheVN0YXRlKGNoYXQsIHNwZWFrZXIsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uQXR0ZW5kZWVWaWRlb1BsYXlTdGF0ZShjaGF0LCBzcGVha2VyLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBdHRlbmRlZVZpZGVvUGxheShjaGF0LCBzcGVha2VyLCBzcGVha2VyVmlkZW8sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3JjXT1cImdldEF0dGVuZGVlVmlkZW9Vcmwoc3BlYWtlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInZpZGVvL3dlYm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmlkZW8+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1tdXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUF0dGVuZGVlVmlkZW9NdXRlKGNoYXQsIHNwZWFrZXIsIHNwZWFrZXJWaWRlbywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dGVuZGVlVmlkZW9NdXRlZChjaGF0LCBzcGVha2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChnZXRUcmFuc2xhdGlvbignVW5tdXRlJykgfHwgJ1VubXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdNdXRlJykgfHwgJ011dGUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIHNwZWFrZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdVbm11dGUnKSB8fCAnVW5tdXRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZ2V0VHJhbnNsYXRpb24oJ011dGUnKSB8fCAnTXV0ZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbm90cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0ZW5kZWVWaWRlb011dGVkKGNoYXQsIHNwZWFrZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcInZvbHVtZV9vZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ2b2x1bWVfdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmQtcGxheS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBdHRlbmRlZVZpZGVvUGxheShjaGF0LCBzcGVha2VyLCBzcGVha2VyVmlkZW8sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdHRlbmRlZVZpZGVvUGxheWluZyhjaGF0LCBzcGVha2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChnZXRUcmFuc2xhdGlvbignUGF1c2UnKSB8fCAnUGF1c2UnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChnZXRUcmFuc2xhdGlvbignUGxheScpIHx8ICdQbGF5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dGVuZGVlVmlkZW9QbGF5aW5nKGNoYXQsIHNwZWFrZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGdldFRyYW5zbGF0aW9uKCdQYXVzZScpIHx8ICdQYXVzZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGdldFRyYW5zbGF0aW9uKCdQbGF5JykgfHwgJ1BsYXknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F0dGVuZGVlVmlkZW9QbGF5aW5nKGNoYXQsIHNwZWFrZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcInBhdXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNhcmQtaW5pdGlhbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFnZXRBdHRlbmRlZVZpZGVvVXJsKHNwZWFrZXIpICYmICFzcGVha2VyLnBob3RvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0QXR0ZW5kZWVJbml0aWFscyhzcGVha2VyLm5hbWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1vdmVybGF5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtbmFtZVwiPnt7IHNwZWFrZXIubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1jb21wYW55XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwZWFrZXIuam9iVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BlYWtlci5qb2JUaXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY29tcGFueVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzcGVha2VyLmNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BlYWtlci5jb21wYW55IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbmRlZS1kZXNjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtZGVzYy1jb2xsYXBzZWRdPVwiIWlzQXR0ZW5kZWVEZXNjcmlwdGlvbkV4cGFuZGVkKGNoYXQsIHNwZWFrZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtZGVzYy1leHBhbmRlZF09XCJpc0F0dGVuZGVlRGVzY3JpcHRpb25FeHBhbmRlZChjaGF0LCBzcGVha2VyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRBdHRlbmRlZURlc2NyaXB0aW9uKHNwZWFrZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEF0dGVuZGVlRGVzY3JpcHRpb24oc3BlYWtlcikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYXR0ZW5kZWUtY2FyZC1idG4gYXR0ZW5kZWUtY2FyZC1idG4tdmlldy1wcm9maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3BlYWtlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNwZWFrZXIuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGdldFRyYW5zbGF0aW9uKCdQcm9maWxlIG5vdCBhdmFpbGFibGUnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb2ZpbGUgbm90IGF2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChnZXRUcmFuc2xhdGlvbignVmlldyBQcm9maWxlJykgfHwgJ1ZpZXcgUHJvZmlsZScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnc3BlYWtlcl9jYXJkcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZpZXdTcGVha2VyUHJvZmlsZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYWtlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYWtlcnM6IGNoYXQuc3BlYWtlckNhcmRzIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3BlYWtlci5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdpdGhVc2VyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHNwZWFrZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdQcm9maWxlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbignVmlldyBQcm9maWxlJykgfHwgJ1ZpZXcgUHJvZmlsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LnNwZWFrZXJDYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIFNQRUFLRVJfQ0FSRFNfSU5JVElBTCA+XG4gICAgICAgICAgICAgICAgICAgICAgICA0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWV4cGFuZGVkU3BlYWtlckNhcmRJZHNbY2hhdD8uX2lkXVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY2FyZHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZFNwZWFrZXJDYXJkcyhjaGF0KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFNob3dcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc3BlYWtlckNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU1BFQUtFUl9DQVJEU19JTklUSUFMXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG1vcmVcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc3BlYWtlckNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU1BFQUtFUl9DQVJEU19JTklUSUFMID09PVxuICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0VHJhbnNsYXRpb24oJ3NwZWFrZXInKSB8fCAnc3BlYWtlcidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VHJhbnNsYXRpb24oJ3NwZWFrZXJzJykgfHwgJ3NwZWFrZXJzJ1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFNwb25zb3IgY2FyZHMgKGZyb20gZ2V0X2V2ZW50X3Nwb25zb3JzIHRvb2wsIGJvb3RoLXJlcCBzdHlsZSkgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzcG9uc29yLWNhcmRzLXNlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8udHlwZSA9PT0gJ3Nwb25zb3JfY2FyZHMnICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnNwb25zb3JDYXJkcz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hhdD8ubWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1tZXNzYWdlLWJ1YmJsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogYmdCdWJibGVBaSB8fCAnI2ZmZicgfVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJTZWFyY2hUaXRsZSBhaSBjYXJkLW1lc3NhZ2UtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb3RoLXJlcC1jYXJkLWdyaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwb25zb3Igb2YgZ2V0VmlzaWJsZVNwb25zb3JDYXJkcyhjaGF0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBpbmRleFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib290aC1yZXAtY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9vdGgtcmVwLWNhcmQtbG9nb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib290aC1yZXAtY2FyZC1sb2dvLXBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc3BvbnNvci5sb2dvVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BvbnNvci5ib290aFRpdGxlID8gc3BvbnNvci5ib290aFRpdGxlLmNoYXJBdCgwKSA6IChzcG9uc29yLm5hbWUgPyBzcG9uc29yLm5hbWUuY2hhckF0KDApIDogJycpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3BvbnNvci5sb2dvVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJzcG9uc29yLmxvZ29VcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cInNwb25zb3IuYm9vdGhUaXRsZSB8fCBzcG9uc29yLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJib290aC1yZXAtY2FyZC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BvbnNvci5ib290aFRpdGxlIHx8IHNwb25zb3IubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9vdGgtcmVwLWNhcmQtZGVzY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwb25zb3IuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwb25zb3IuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJvb3RoLXJlcC1jYXJkLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld0Jvb3RoLmVtaXQoeyBib290aElkOiBzcG9uc29yLmJvb3RoSUQsIGJvb3RoVXJsOiBzcG9uc29yLnVybCwgc3BvbnNvciB9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oJ1ZpZXcgU3BvbnNvcicpIHx8ICdWaWV3IFNwb25zb3InIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LnNwb25zb3JDYXJkcz8ubGVuZ3RoIHx8IDApIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIFNQT05TT1JfQ0FSRFNfSU5JVElBTCA+XG4gICAgICAgICAgICAgICAgICAgICAgICA0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWV4cGFuZGVkU3BvbnNvckNhcmRJZHNbY2hhdD8uX2lkXVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaG93LW1vcmUtY2FyZHMtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGFuZFNwb25zb3JDYXJkcyhjaGF0KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFNob3dcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc3BvbnNvckNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU1BPTlNPUl9DQVJEU19JTklUSUFMXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG1vcmVcbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhdD8uc3BvbnNvckNhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU1BPTlNPUl9DQVJEU19JTklUSUFMID09PVxuICAgICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0VHJhbnNsYXRpb24oJ3Nwb25zb3InKSB8fCAnc3BvbnNvcidcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0VHJhbnNsYXRpb24oJ3Nwb25zb3JzJykgfHwgJ3Nwb25zb3JzJ1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEJvb3RoIHJlcHJlc2VudGF0aXZlIGNhcmRzIChmcm9tIGdldF9ib290aF9yZXByZXNlbnRhdGl2ZXMgdG9vbCwgc2FtZSBkZXNpZ24gYXMgYXR0ZW5kZWUgY2FyZHMpIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZHMtc2VjdGlvbiBib290aC1yZXAtY2FyZHMtc2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnYm9vdGhfcmVwX2NhcmRzJyAmJlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py5ib290aFJlcENhcmRzPy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJkLW1lc3NhZ2UtYnViYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBiZ0J1YmJsZUFpIHx8ICcjZmZmJyB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlNlYXJjaFRpdGxlIGFpIGNhcmQtbWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cImNoYXQ/Lm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtY2FyZHMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXAgb2YgZ2V0VmlzaWJsZUJvb3RoUmVwQ2FyZHMoY2hhdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJyZXAucGhvdG8gPyAndXJsKCcgKyByZXAucGhvdG8gKyAnKScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtY2FyZC1pbml0aWFsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJlcC5waG90b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEF0dGVuZGVlSW5pdGlhbHMocmVwLm5hbWUpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1vdmVybGF5XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXR0ZW5kZWUtbmFtZVwiPnt7IHJlcC5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwLmNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcmVwLmNvbXBhbnkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImF0dGVuZGVlLWNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVwLmpvYlRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJlcC5qb2JUaXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW5kZWUtZGVzY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmF0dGVuZGVlLWRlc2MtY29sbGFwc2VkXT1cIiFpc0F0dGVuZGVlRGVzY3JpcHRpb25FeHBhbmRlZChjaGF0LCByZXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXR0ZW5kZWUtZGVzYy1leHBhbmRlZF09XCJpc0F0dGVuZGVlRGVzY3JpcHRpb25FeHBhbmRlZChjaGF0LCByZXApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEJvb3RoUmVwRGVzY3JpcHRpb24ocmVwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRCb290aFJlcERlc2NyaXB0aW9uKHJlcCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdHRlbmRlZS1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwLmlkICE9PSB1c2VySWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0aW9uc0VuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQZW5kaW5nU2VudFJlcXVlc3QocmVwLmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBhdHRlbmRlZS1jYXJkLWJ0biBhdHRlbmRlZS1jYXJkLWJ0bi1yZXF1ZXN0LXNlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbignUmVxdWVzdCBTZW50JykgfHwgJ1JlcXVlc3QgU2VudCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2xhdGlvbihcIlJlcXVlc3QgU2VudFwiKSB8fCBcIlJlcXVlc3QgU2VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAuaWQgIT09IHVzZXJJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Nvbm5lY3Rpb25zRW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Gb2xsb3dVc2VyKHJlcClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYXR0ZW5kZWUtY2FyZC1idG4gYXR0ZW5kZWUtY2FyZC1idG4tY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdDb25uZWN0JykgfHwgJ0Nvbm5lY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAuaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RXaXRoVXNlci5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiByZXAuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFRyYW5zbGF0aW9uKFwiQ29ubmVjdFwiKSB8fCBcIkNvbm5lY3RcIiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwLmlkICE9PSB1c2VySWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb25uZWN0aW9uc0VuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVW5mb2xsb3dVc2VyKHJlcClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYXR0ZW5kZWUtY2FyZC1idG4gYXR0ZW5kZWUtY2FyZC1idG4tZGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKCdEaXNjb25uZWN0JykgfHwgJ0Rpc2Nvbm5lY3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAuaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RXaXRoVXNlci5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiByZXAuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNsYXRpb24oXCJEaXNjb25uZWN0XCIpIHx8IFwiRGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJlcC5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGF0dGVuZGVlLWNhcmQtYnRuIGF0dGVuZGVlLWNhcmQtYnRuLXZpZXctcHJvZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJnZXRUcmFuc2xhdGlvbignVmlldyBQcm9maWxlJykgfHwgJ1ZpZXcgUHJvZmlsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0V2l0aFVzZXIuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiByZXAuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1Byb2ZpbGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VHJhbnNsYXRpb24oJ1ZpZXcgUHJvZmlsZScpIHx8ICdWaWV3IFByb2ZpbGUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LmJvb3RoUmVwQ2FyZHM/Lmxlbmd0aCB8fCAwKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICBCT09USF9SRVBfQ0FSRFNfSU5JVElBTCA+XG4gICAgICAgICAgICAgICAgICAgICAgICA0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWV4cGFuZGVkQm9vdGhSZXBDYXJkSWRzW2NoYXQ/Ll9pZF1cbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hvdy1tb3JlLWNhcmRzLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBhbmRCb290aFJlcENhcmRzKGNoYXQpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgU2hvd1xuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5ib290aFJlcENhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgQk9PVEhfUkVQX0NBUkRTX0lOSVRJQUxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgbW9yZVxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIChjaGF0Py5ib290aFJlcENhcmRzPy5sZW5ndGggfHwgMCkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgQk9PVEhfUkVQX0NBUkRTX0lOSVRJQUwgPT09XG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXRUcmFuc2xhdGlvbigncmVwcmVzZW50YXRpdmUnKSB8fCAncmVwcmVzZW50YXRpdmUnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdldFRyYW5zbGF0aW9uKCdyZXByZXNlbnRhdGl2ZXMnKSB8fCAncmVwcmVzZW50YXRpdmVzJ1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNoYXQtYnViYmxlLXdyYXBcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYXQ/LnR5cGUgPT09ICdhaScgfHwgY2hhdD8udHlwZSA9PT0gJ3VzZXInKSAmJlxuICAgICAgICAgICAgICAgICAgICAhKGkgPT09IDAgJiYgYm90U2tpbGxzKVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnYWknXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGJnQnViYmxlQWkgfHwgJyNmZmYnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNoYXQ/LnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJnQnViYmxlVXNlciB8fCAnIzE4Mzk4OCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjpcbiAgICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnYWknXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcjMDAwICFpbXBvcnRhbnQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcjZmZmICFpbXBvcnRhbnQnXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwibWVzc2FnZVRleHRfe3sgaSB9fVwiIGNsYXNzPVwiY2hhdC1idWJibGUtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGF0Py50eXBlID09PSAnYWknIHx8IGNoYXQ/LnR5cGUgPT09ICd1c2VyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlYXJjaFRpdGxlIGFpJzogY2hhdD8udHlwZSA9PT0gJ2FpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWFyY2hUaXRsZSB1c2VyJzogY2hhdD8udHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnYWknICYmIG1lc3NhZ2VUZXh0Q29sb3JBaVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZVRleHRDb2xvckFpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjaGF0Py50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWVzc2FnZVRleHRDb2xvclVzZXIgfHwgJyNmZmYnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdkZWZhdWx0Q29sb3InXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJjaGF0Py5tZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNoYXQ/LnNob3dXb3JrZmxvd0V4ZWN1dGlvbkxvYWRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNpcmN1bGFyLWxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsb2FkZXItc3Bpbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50V29ya2Zsb3dBY3Rpb25Qcm9ncmVzcyA8IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKCcgKyBwZXJjZW50YWdlICogMy42ICsgJ2RlZyknXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzID09IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgNTIgNTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja21hcmstY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3g9XCIyNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN5PVwiMjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByPVwiMjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja21hcmstY2hlY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQgMjdsNyA3IDE2LTE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvYWRlci10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzIDwgMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRXb3JrZmxvd0FjdGlvblByb2dyZXNzIH19JVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlci1sYWJlbFwiPnt7IGN1cnJlbnRXb3JrZmxvd0FjdGlvbiB9fS4uLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJleGljdXRpb24gbXQtMlwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py50eXBlID09PSAnYWknICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LmdyYXBocyAmJlxuICAgICAgICAgICAgICAgICAgICBjaGF0Py5ncmFwaHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aDUgKm5nSWY9XCJjaGF0Py50eXBlID09PSAnYWknXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYnggYngtbmV0d29yay1jaGFydFwiPjwvaT4gR3JhcGhzXG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbGxhcHNlRkdyYXBoKClcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWljb24gbWwtMiBmYVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhcyBmYS1jaGV2cm9uLWRvd24nOiBpc0NvbGxhcHNlZEZvckZHcmFwaCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYXMgZmEtY2hldnJvbi11cCc6ICFpc0NvbGxhcHNlZEZvckZHcmFwaFxuICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGltYWdlIG9mIGNoYXQ/LmdyYXBoc1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JhcGgtaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBjb2xsYXBzZTogaXNDb2xsYXBzZWRGb3JGR3JhcGggfVwiXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNoZWNrRm9yQ29wMjlCb3RJZCgpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhpY3V0aW9uIG10LTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNoYXQ/LnR5cGUgPT09ICdhaScgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjaGF0Py5leGVjdXRpb25HcmFwaHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjaGF0Py5leGVjdXRpb25HcmFwaHM/Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGg1ICpuZ0lmPVwiY2hhdD8udHlwZSA9PT0gJ2FpJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYnggYngtbmV0d29yay1jaGFydFwiPjwvaT4gRXhlY3V0aW9uIFBhdGggRGlhZ3JhbVxuICAgICAgICAgICAgICAgICAgICAgIEZvciBEYXRhIFZpc3VhbGl6YXRpb24gV29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbGxhcHNlR3JhcGgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1pY29uIG1sLTIgZmFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFzIGZhLWNoZXZyb24tZG93bic6IGlzQ29sbGFwc2VkRm9yR3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdmYXMgZmEtY2hldnJvbi11cCc6ICFpc0NvbGxhcHNlZEZvckdyYXBoXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGltYWdlIG9mIGNoYXQ/LmV4ZWN1dGlvbkdyYXBoc1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmFwaC1pbWdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgY29sbGFwc2U6IGlzQ29sbGFwc2VkRm9yR3JhcGggfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJpbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdGFcIiAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICdhaScgJiYgaSA+IDAgJiYgaSA9PT0gbGFzdEFpTWVzc2FnZUluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29weUJveFwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ29weVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIHNob3dGZWVkQmFja0ljb25zSW5kZXggPT0gaSA/ICdzaG93LWFsd2F5cycgOiAnc2hvdy1ob3ZlcidcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgY2hhdD8uY29waWVkID8gJ0NvcGllZCEnIDogJ0NvcHknIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvcHlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiY2hhdD8uY29waWVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ29weUNsaWNrKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2hhdD8uY29waWVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSAxNi4xN0w0LjgzIDEyTDMuNDEgMTMuNDFMOSAxOUwyMSA3TDE5LjU5IDUuNTlMOSAxNi4xN1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaT5cblxuICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiIWNoYXQ/LmNvcGllZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE5LjI0IDJIOC44NEM4LjE0IDIgNy41OCAyLjU2IDcuNTggMy4yNlYxNi44NEM3LjU4IDE3LjU0IDguMTQgMTguMSA4Ljg0IDE4LjFIMTkuMjRDMTkuOTQgMTguMSAyMC41IDE3LjU0IDIwLjUgMTYuODRWMy4yNkMyMC41IDIuNTYgMTkuOTQgMiAxOS4yNCAyWk0xOS4yNCAxNi44NEg4Ljg0VjMuMjZIMTkuMjRWMTYuODRaTTQuNzQgNi41MkM0LjA0IDYuNTIgMy40OCA3LjA4IDMuNDggNy43OFYyMC4zNkMzLjQ4IDIxLjA2IDQuMDQgMjEuNjIgNC43NCAyMS42MkgxNS4xNEMxNS44NCAyMS42MiAxNi40IDIxLjA2IDE2LjQgMjAuMzZWMTguODhIMTQuOTZWMjAuMzZINC43NFY3Ljc4SDYuMThWNi41Mkg0Ljc0WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NjY1NjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbjwhLS0gXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjaGVja0ZvckNvcDI5Qm90SWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1cCBjb3B5XCJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGNoYXQ/LmlzRWRpdG9yID8gJ0FkZGVkIScgOiAnQWRkIHRvIGVkaXRvcicgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVFZGl0b3JDbGljayhpKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFjaGF0Py5pc0VkaXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjAuMTUyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwLjE1MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwLjE1MiAyMC4xNTJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiSWNvbl9mZWF0aGVyLWVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW5hbWU9XCJJY29uIGZlYXRoZXItZWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi41IC0yLjE2NilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiUGF0aF8xNjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmFtZT1cIlBhdGggMTY2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjUsNkg0Ljg4OUExLjg4OSwxLjg4OSwwLDAsMCwzLDcuODg5djEzLjIyQTEuODg5LDEuODg5LDAsMCwwLDQuODg5LDIzaDEzLjIyQTEuODg5LDEuODg5LDAsMCwwLDIwLDIxLjEwOFYxNC41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMCAtMS4xNzkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM5MzkzOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiUGF0aF8xNjdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbmFtZT1cIlBhdGggMTY3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTIxLjkxNSwzLjRhMiwyLDAsMCwxLDIuODMzLDIuODMzbC04Ljk3MSw4Ljk3MUwxMiwxNi4xNTJsLjk0NC0zLjc3N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMy4zMzQgMClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzkzOTM5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImNoYXQ/LmlzRWRpdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSAxNi4xN0w0LjgzIDEyTDMuNDEgMTMuNDFMOSAxOUwyMSA3TDE5LjU5IDUuNTlMOSAxNi4xN1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVwIGNvcHlcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiTGlrZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjaGF0Py5saWtlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVVwQ2xpY2soaSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjaGF0Py5saWtlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMzg5ODkgMTguNDkwMlY4LjMzMDIyQzguMzg5ODkgNy45MzAyMiA4LjUwOTg5IDcuNTQwMjIgOC43Mjk4OSA3LjIxMDIyTDExLjQ1OTkgMy4xNTAyMkMxMS44ODk5IDIuNTAwMjIgMTIuOTU5OSAyLjA0MDIyIDEzLjg2OTkgMi4zODAyMkMxNC44NDk5IDIuNzEwMjIgMTUuNDk5OSAzLjgxMDIyIDE1LjI4OTkgNC43OTAyMkwxNC43Njk5IDguMDYwMjJDMTQuNzI5OSA4LjM2MDIyIDE0LjgwOTkgOC42MzAyMiAxNC45Nzk5IDguODQwMjJDMTUuMTQ5OSA5LjAzMDIyIDE1LjM5OTkgOS4xNTAyMiAxNS42Njk5IDkuMTUwMjJIMTkuNzc5OUMyMC41Njk5IDkuMTUwMjIgMjEuMjQ5OSA5LjQ3MDIyIDIxLjY0OTkgMTAuMDMwMkMyMi4wMjk5IDEwLjU3MDIgMjIuMDk5OSAxMS4yNzAyIDIxLjg0OTkgMTEuOTgwMkwxOS4zODk5IDE5LjQ3MDJDMTkuMDc5OSAyMC43MTAyIDE3LjcyOTkgMjEuNzIwMiAxNi4zODk5IDIxLjcyMDJIMTIuNDg5OUMxMS44MTk5IDIxLjcyMDIgMTAuODc5OSAyMS40OTAyIDEwLjQ0OTkgMjEuMDYwMkw5LjE2OTg5IDIwLjA3MDJDOC42Nzk4OSAxOS43MDAyIDguMzg5ODkgMTkuMTEwMiA4LjM4OTg5IDE4LjQ5MDJaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzE3MjM1QlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01LjIxIDYuMzc5ODhINC4xOEMyLjYzIDYuMzc5ODggMiA2Ljk3OTg4IDIgOC40NTk4OFYxOC41MTk5QzIgMTkuOTk5OSAyLjYzIDIwLjU5OTkgNC4xOCAyMC41OTk5SDUuMjFDNi43NiAyMC41OTk5IDcuMzkgMTkuOTk5OSA3LjM5IDE4LjUxOTlWOC40NTk4OEM3LjM5IDYuOTc5ODggNi43NiA2LjM3OTg4IDUuMjEgNi4zNzk4OFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMTcyMzVCXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjaGF0Py5saWtlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjQwMzcgMjAuOTI2NEwxMC4zODEgMjAuOTAzOEwxMC4zNTU3IDIwLjg4NDNMNy43MjE2NSAxOC44NUw4LjAyOTY1IDE4LjQ1MTZMMTAuNzE2MSAyMC41MzE1QzEwLjkyMjggMjAuNzE5NSAxMS4yMTgxIDIwLjg1MTcgMTEuNDk2MiAyMC45Mzc3QzExLjc5NzggMjEuMDMwOSAxMi4xNDUxIDIxLjA5IDEyLjQ4MDEgMjEuMDlIMTYuMjgwMUMxNi44NTcyIDIxLjA5IDE3LjQyNjYgMjAuODYyNSAxNy44NzUxIDIwLjUzMDZDMTguMzE1OSAyMC4yMDQ0IDE4LjY5MTIgMTkuNzM4NSAxOC44MzA1IDE5LjE5OTdMMjEuMjQyOCAxMS44NzMyQzIxLjQzNzkgMTEuMzMwOSAyMS40Mjg3IDEwLjc0OSAyMS4wOTY1IDEwLjI4ODdDMjAuNzU4MyA5LjgxMzc3IDIwLjE4NDQgOS41ODk5OSAxOS41ODAxIDkuNTg5OTlIMTUuNTgwMUMxNS4yMDMxIDkuNTg5OTkgMTQuODYxNSA5LjQzMTQzIDE0LjYyNzYgOS4xNjIxNUwxNC42MjcgOS4xNjE0MkMxNC4zODczIDguODg2NDkgMTQuMjc1NiA4LjUxNTQ5IDE0LjMzNDUgOC4xMTUwMUwxNC44MzIyIDQuOTE5NUMxNC45OTc4IDQuMTA1MiAxNC40NjY0IDMuMjQ1OTYgMTMuNzA1MyAyLjk4ODA0QzEzLjMyNzcgMi44NTE2NSAxMi45Mjk3IDIuODkxMjkgMTIuNjEgMi45OTgzOUMxMi4yOTQ5IDMuMTAzOTYgMTEuOTc3MiAzLjMwMTcyIDExLjc4ODEgMy41NzY3M0wxMS43ODgxIDMuNTc2NzFMMTEuNzg1MSAzLjU4MTA3TDcuOTYzNTIgOS4yNjY4OUw3LjU1NDU0IDguOTkzMTRMMTEuMzc1MSAzLjMwODkxTDExLjM3NTUgMy4zMDgzNkMxMS44NzYzIDIuNTYxMDMgMTMuMDEwOSAyLjE5MDI4IDEzLjg3MjYgMi41MTc0NEwxMy44ODM0IDIuNTIxNTFMMTMuODk0MyAyLjUyNTA5QzE0LjkwNDQgMi44NTY0IDE1LjU1NiAzLjk4NzY1IDE1LjMzMTcgNS4wMTMxNEwxNS4zMjg0IDUuMDI4MDVMMTUuMzI2IDUuMDQzMTRMMTQuODM2IDguMTkzMTRMMTQuODM2IDguMTkzMTNMMTQuODM1MSA4LjE5OTI4QzE0LjgxODQgOC4zMTY0MiAxNC43OTgxIDguNjAyNjggMTUuMDEzOCA4Ljg0OTI0TDE1LjAyNDggOC44NjE3N0wxNS4wMzY2IDguODczNTRDMTUuMTgzMyA5LjAyMDI2IDE1LjM4MTcgOS4wOTk5OSAxNS41OTAxIDkuMDk5OTlIMTkuNTkwMUMyMC40MzA4IDkuMDk5OTkgMjEuMTE3NiA5LjQ0ODg2IDIxLjUxMTMgMTAuMDA3OUwyMS41MTI0IDEwLjAwOTVDMjEuODk2NCAxMC41NTAyIDIxLjk5MDggMTEuMjg0OSAyMS43MjAyIDEyLjAyOTFMMjEuNzE3NSAxMi4wMzY1TDIxLjcxNTEgMTIuMDQ0TDE5LjMyNTEgMTkuMzI0TDE5LjMxOTggMTkuMzRMMTkuMzE1NiAxOS4zNTY0QzE5LjAwNTggMjAuNTcwNyAxNy42NzY2IDIxLjYgMTYuMjgwMSAyMS42SDEyLjQ4MDFDMTIuMjQxMSAyMS42IDExLjg0MDMgMjEuNTYyNSAxMS40Mjk3IDIxLjQ1MTJDMTEuMDEyMyAyMS4zMzggMTAuNjQwNiAyMS4xNjMzIDEwLjQwMzcgMjAuOTI2NFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTUuMzc5ODggMjAuNDk5OUg0LjM3OTg4QzMuNTI0NDIgMjAuNDk5OSAyLjk4NTU5IDIwLjI5ODIgMi42NTgyMiAxOS45ODI1QzIuMzM0MzcgMTkuNjcwMiAyLjEyOTg4IDE5LjE2MTQgMi4xMjk4OCAxOC4zNDk5VjguNTQ5OUMyLjEyOTg4IDcuNzM4NDMgMi4zMzQzNyA3LjIyOTYyIDIuNjU4MjIgNi45MTczMUMyLjk4NTU5IDYuNjAxNiAzLjUyNDQyIDYuMzk5OSA0LjM3OTg4IDYuMzk5OUg1LjM3OTg4QzYuMjM1MzQgNi4zOTk5IDYuNzc0MTggNi42MDE2IDcuMTAxNTUgNi45MTczMUM3LjQyNTQgNy4yMjk2MiA3LjYyOTg4IDcuNzM4NDMgNy42Mjk4OCA4LjU0OTlWMTguMzQ5OUM3LjYyOTg4IDE5LjE2MTQgNy40MjU0IDE5LjY3MDIgNy4xMDE1NSAxOS45ODI1QzYuNzc0MTggMjAuMjk4MiA2LjIzNTM0IDIwLjQ5OTkgNS4zNzk4OCAyMC40OTk5Wk00LjM3OTg4IDYuODk5OUM0LjA5MzQgNi44OTk5IDMuODM1NzggNi45MTY0IDMuNjEzODIgNi45NjY4OUMzLjM4NzQ1IDcuMDE4MzggMy4xNjgyMiA3LjExMTk2IDIuOTkyNTggNy4yODc2QzIuODE1NTkgNy40NjQ1OSAyLjcyODA3IDcuNjc5NjYgMi42ODMwMSA3Ljg5MDAyQzIuNjM5NDggOC4wOTMxOCAyLjYyOTg4IDguMzE5NjcgMi42Mjk4OCA4LjU0OTlWMTguMzQ5OUMyLjYyOTg4IDE4LjU4MDEgMi42Mzk0OCAxOC44MDY2IDIuNjgzMDEgMTkuMDA5OEMyLjcyODA3IDE5LjIyMDEgMi44MTU1OSAxOS40MzUyIDIuOTkyNTggMTkuNjEyMkMzLjE2ODIyIDE5Ljc4NzggMy4zODc0NSAxOS44ODE0IDMuNjEzODIgMTkuOTMyOUMzLjgzNTc4IDE5Ljk4MzQgNC4wOTM0IDE5Ljk5OTkgNC4zNzk4OCAxOS45OTk5SDUuMzc5ODhDNS42NjYzNyAxOS45OTk5IDUuOTIzOTggMTkuOTgzNCA2LjE0NTk1IDE5LjkzMjlDNi4zNzIzMiAxOS44ODE0IDYuNTkxNTUgMTkuNzg3OCA2Ljc2NzE5IDE5LjYxMjJDNi45NDQxOCAxOS40MzUyIDcuMDMxNyAxOS4yMjAxIDcuMDc2NzYgMTkuMDA5OEM3LjEyMDI4IDE4LjgwNjYgNy4xMjk4OCAxOC41ODAxIDcuMTI5ODggMTguMzQ5OVY4LjU0OTlDNy4xMjk4OCA4LjMxOTY3IDcuMTIwMjggOC4wOTMxOCA3LjA3Njc2IDcuODkwMDJDNy4wMzE3IDcuNjc5NjYgNi45NDQxOCA3LjQ2NDU5IDYuNzY3MTkgNy4yODc2QzYuNTkxNTUgNy4xMTE5NiA2LjM3MjMyIDcuMDE4MzggNi4xNDU5NSA2Ljk2Njg5QzUuOTIzOTggNi45MTY0IDUuNjY2MzcgNi44OTk5IDUuMzc5ODggNi44OTk5SDQuMzc5ODhaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzU2NjU2M1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzU2NjU2M1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkb3duIGNvcHlcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRGlzbGlrZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJjaGF0Py51bmxpa2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRG93bkNsaWNrKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2hhdD8udW5saWtlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE1LjYxIDUuNTAwMDJWMTUuNjZDMTUuNjEgMTYuMDYgMTUuNDkgMTYuNDUgMTUuMjcgMTYuNzhMMTIuNTQgMjAuODRDMTIuMTEgMjEuNDkgMTEuMDQgMjEuOTUgMTAuMTMgMjEuNjFDOS4xNTAwMiAyMS4yOCA4LjUwMDAyIDIwLjE4IDguNzEwMDIgMTkuMkw5LjIzMDAyIDE1LjkzQzkuMjcwMDIgMTUuNjMgOS4xOTAwMiAxNS4zNiA5LjAyMDAyIDE1LjE1QzguODUwMDIgMTQuOTYgOC42MDAwMiAxNC44NCA4LjMzMDAyIDE0Ljg0SDQuMjIwMDJDMy40MzAwMiAxNC44NCAyLjc1MDAyIDE0LjUyIDIuMzUwMDIgMTMuOTZDMS45NzAwMiAxMy40MiAxLjkwMDAyIDEyLjcyIDIuMTUwMDIgMTIuMDFMNC42MTAwMiA0LjUyMDAyQzQuOTIwMDIgMy4yODAwMiA2LjI3MDAyIDIuMjcwMDIgNy42MTAwMiAyLjI3MDAySDExLjUxQzEyLjE4IDIuMjcwMDIgMTMuMTIgMi41MDAwMiAxMy41NSAyLjkzMDAyTDE0LjgzIDMuOTIwMDJDMTUuMzIgNC4zMDAwMiAxNS42MSA0Ljg4MDAyIDE1LjYxIDUuNTAwMDJaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzE3MjM1QlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE4Ljc5MDEgMTcuNjA5OUgxOS44MjAxQzIxLjM3MDEgMTcuNjA5OSAyMi4wMDAxIDE3LjAwOTkgMjIuMDAwMSAxNS41Mjk5VjUuNDc5OUMyMi4wMDAxIDMuOTk5OSAyMS4zNzAxIDMuMzk5OSAxOS44MjAxIDMuMzk5OUgxOC43OTAxQzE3LjI0MDEgMy4zOTk5IDE2LjYxMDEgMy45OTk5IDE2LjYxMDEgNS40Nzk5VjE1LjUzOTlDMTYuNjEwMSAxNy4wMDk5IDE3LjI0MDEgMTcuNjA5OSAxOC43OTAxIDE3LjYwOTlaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzE3MjM1QlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2k+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8aSAqbmdJZj1cIiFjaGF0Py51bmxpa2VkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAuMTIzNyAyMS40ODFMMTAuMTE0OCAyMS40Nzc4TDEwLjEwNTkgMjEuNDc0OEM5LjA5NTc3IDIxLjE0MzUgOC40NDQxNiAyMC4wMTIyIDguNjY4NDkgMTguOTg2N0w4LjY3MTc1IDE4Ljk3MThMOC42NzQxIDE4Ljk1NjhMOS4xNjQxIDE1LjgwNjhMOS4xNjQxMyAxNS44MDY4TDkuMTY1MDEgMTUuODAwNkM5LjE4MTc1IDE1LjY4MzUgOS4yMDIwNyAxNS4zOTcyIDguOTg2MzMgMTUuMTUwN0w4Ljk3NTM2IDE1LjEzODFMOC45NjM1OSAxNS4xMjYzQzguODE2ODcgMTQuOTc5NiA4LjYxODQxIDE0Ljg5OTkgOC40MTAwNCAxNC44OTk5SDQuNDEwMDRDMy41NjkzNyAxNC44OTk5IDIuODgyNTIgMTQuNTUxIDIuNDg4ODQgMTMuOTkyTDIuNDg3NyAxMy45OTA0QzIuMTAzNzEgMTMuNDQ5NyAyLjAwOTMxIDEyLjcxNSAyLjI3OTk0IDExLjk3MDhMMi4yODI2MyAxMS45NjM0TDIuMjg1MDkgMTEuOTU1OUw0LjY3NTA5IDQuNjc1ODZMNC42ODAzNSA0LjY1OTg1TDQuNjg0NTEgNC42NDM1M0M0Ljk5NDE4IDMuNDI5OTYgNi4zMzI3MSAyLjM5OTkgNy43MjAwNCAyLjM5OTlIMTEuNTJDMTEuNzU5MSAyLjM5OTkgMTIuMTU5OSAyLjQzNzM2IDEyLjU3MDQgMi41NDg3MkMxMi45ODc4IDIuNjYxOTQgMTMuMzU5NiAyLjgzNjU1IDEzLjU5NjUgMy4wNzM0NkwxMy42MTkxIDMuMDk2MDhMMTMuNjQ0NCAzLjExNTYzTDE2LjI3ODUgNS4xNDk4NkwxNS45NzA1IDUuNTQ4MjVMMTMuMjg3NSAzLjQ3MTExQzEzLjA3OTkgMy4yNzYzIDEyLjc4MzcgMy4xNDEzIDEyLjUwNjEgMy4wNTQxMkMxMi4yMDMxIDIuOTU4OTcgMTEuODU1MSAyLjg5OTkgMTEuNTIgMi44OTk5SDcuNzIwMDRDNy4xNDI5IDIuODk5OSA2LjU3MzUzIDMuMTI3MzUgNi4xMjUwOCAzLjQ1OTI2QzUuNjg0MjggMy43ODU1MSA1LjMwODkyIDQuMjUxNDIgNS4xNjk2MyA0Ljc5MDE5TDIuNzU3MzggMTIuMTE2N0MyLjU2MjIzIDEyLjY1OSAyLjU3MTQ3IDEzLjI0MDkgMi45MDM2NiAxMy43MDEyQzMuMjQxODMgMTQuMTc2MSAzLjgxNTc4IDE0LjM5OTkgNC40MjAwNCAxNC4zOTk5SDguNDIwMDRDOC43OTcwMiAxNC4zOTk5IDkuMTM4NjcgMTQuNTU4NSA5LjM3MjUyIDE0LjgyNzdMOS4zNzMxNSAxNC44Mjg1QzkuNjEyODYgMTUuMTAzNCA5LjcyNDU3IDE1LjQ3NDUgOS42NjU2OCAxNS44NzVDOS42NjU2IDE1Ljg3NTUgOS42NjU1MiAxNS44NzYxIDkuNjY1NDQgMTUuODc2Nkw5LjE2Nzk1IDE5LjA3MDRDOS4wMDI0MiAxOS44ODQxIDkuNTMyOTkgMjAuNzQyOCAxMC4yOTMzIDIxLjAwMTNDMTAuNjY4NSAyMS4xMzkxIDExLjA2NzUgMjEuMDk3OCAxMS4zODU3IDIwLjk5MTdDMTEuNzAwMSAyMC44ODY5IDEyLjAyMTggMjAuNjg5OCAxMi4yMTIxIDIwLjQxMzJMMTIuMjEyMSAyMC40MTMyTDEyLjIxNSAyMC40MDg4TDE2LjAzNTEgMTQuNzI1M0wxNi40NDcyIDE1LjAwNDVMMTIuNjI1MSAyMC42OTFMMTIuNjI0OSAyMC42OTEyQzEyLjI1OSAyMS4yMzYxIDExLjUzNDcgMjEuNTk5OSAxMC44IDIxLjU5OTlDMTAuNTY2OCAyMS41OTk5IDEwLjMzNTggMjEuNTU5NiAxMC4xMjM3IDIxLjQ4MVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNTY2NTYzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE5LjYyMDEgMTcuNkgxOC42MjAxQzE3Ljc2NDcgMTcuNiAxNy4yMjU4IDE3LjM5ODMgMTYuODk4NSAxNy4wODI2QzE2LjU3NDYgMTYuNzcwMyAxNi4zNzAxIDE2LjI2MTUgMTYuMzcwMSAxNS40NVY1LjY1QzE2LjM3MDEgNC44Mzg1MyAxNi41NzQ2IDQuMzI5NzIgMTYuODk4NSA0LjAxNzRDMTcuMjI1OCAzLjcwMTcgMTcuNzY0NyAzLjUgMTguNjIwMSAzLjVIMTkuNjIwMUMyMC40NzU2IDMuNSAyMS4wMTQ0IDMuNzAxNyAyMS4zNDE4IDQuMDE3NEMyMS42NjU2IDQuMzI5NzIgMjEuODcwMSA0LjgzODUzIDIxLjg3MDEgNS42NVYxNS40NUMyMS44NzAxIDE2LjI2MTUgMjEuNjY1NiAxNi43NzAzIDIxLjM0MTggMTcuMDgyNkMyMS4wMTQ0IDE3LjM5ODMgMjAuNDc1NiAxNy42IDE5LjYyMDEgMTcuNlpNMTguNjIwMSA0QzE4LjMzMzYgNCAxOC4wNzYgNC4wMTY0OSAxNy44NTQxIDQuMDY2OTlDMTcuNjI3NyA0LjExODQ4IDE3LjQwODUgNC4yMTIwNiAxNy4yMzI4IDQuMzg3N0MxNy4wNTU4IDQuNTY0NjkgMTYuOTY4MyA0Ljc3OTc2IDE2LjkyMzIgNC45OTAxMUMxNi44Nzk3IDUuMTkzMjggMTYuODcwMSA1LjQxOTc3IDE2Ljg3MDEgNS42NVYxNS40NUMxNi44NzAxIDE1LjY4MDIgMTYuODc5NyAxNS45MDY3IDE2LjkyMzIgMTYuMTA5OUMxNi45NjgzIDE2LjMyMDIgMTcuMDU1OCAxNi41MzUzIDE3LjIzMjggMTYuNzEyM0MxNy40MDg1IDE2Ljg4NzkgMTcuNjI3NyAxNi45ODE1IDE3Ljg1NDEgMTcuMDMzQzE4LjA3NiAxNy4wODM1IDE4LjMzMzYgMTcuMSAxOC42MjAxIDE3LjFIMTkuNjIwMUMxOS45MDY2IDE3LjEgMjAuMTY0MiAxNy4wODM1IDIwLjM4NjIgMTcuMDMzQzIwLjYxMjYgMTYuOTgxNSAyMC44MzE4IDE2Ljg4NzkgMjEuMDA3NCAxNi43MTIzQzIxLjE4NDQgMTYuNTM1MyAyMS4yNzE5IDE2LjMyMDIgMjEuMzE3IDE2LjEwOTlDMjEuMzYwNSAxNS45MDY3IDIxLjM3MDEgMTUuNjgwMiAyMS4zNzAxIDE1LjQ1VjUuNjVDMjEuMzcwMSA1LjQxOTc3IDIxLjM2MDUgNS4xOTMyOCAyMS4zMTcgNC45OTAxMUMyMS4yNzE5IDQuNzc5NzYgMjEuMTg0NCA0LjU2NDY5IDIxLjAwNzQgNC4zODc3QzIwLjgzMTggNC4yMTIwNiAyMC42MTI2IDQuMTE4NDggMjAuMzg2MiA0LjA2Njk5QzIwLjE2NDIgNC4wMTY0OSAxOS45MDY2IDQgMTkuNjIwMSA0SDE4LjYyMDFaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzU2NjU2M1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzU2NjU2M1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJSZWxhdGVkIG10LTJcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgc2hvd0ZlZWRCYWNrSWNvbnNJbmRleCA9PT0gaSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNDaGF0aW5nV2l0aEFpICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYXQ/LnJlbGF0ZWRMaXN0SXRlbXMgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hhdD8ucmVsYXRlZExpc3RJdGVtcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxoNSAqbmdJZj1cImNoYXQ/LnR5cGUgPT09ICdhaSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJieCBieC1saXN0LWNoZWNrXCI+PC9pPiBSZWxhdGVkXG4gICAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGFpbmVyXCIgKm5nSWY9XCJjaGF0Py50eXBlID09PSAnYWknXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjaGF0Py5yZWxhdGVkTGlzdEl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgKGNsaWNrKT1cImZldGNoRGF0YUZvcihpdGVtLCBjaGF0KVwiPnt7IGl0ZW0gfX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdGEtZmFxcyBxdWljay1wcm9tcHRzLWV4dGVuZGVkXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpID09IDAgJiYgcXVpY2tQcm9tcHRzPy5sZW5ndGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IHRpbGUgb2YgcXVpY2tQcm9tcHRzXCIgY2xhc3M9XCJjdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VuZE1lc3NhZ2VXaXRoVGlsZSh0aWxlLnByb21wdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUToge3sgdGlsZS50ZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3RhX3N1Z2dlc3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHRpbGUgb2YgcXVpY2tQcm9tcHRzXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZW5kTWVzc2FnZVdpdGhUaWxlKHRpbGUucHJvbXB0KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRpbGVcIj57eyB0aWxlLnRleHQgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0IGJvdFwiICpuZ0lmPVwiaSA9PSAwICYmIGJvdFNraWxsc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1ib3hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtY3RhXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJY29uX1RpbWVTVGFtcFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiQXNzaXN0YW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWF2YXRhci1pbWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIShkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWF2YXRhci1pbml0aWFscyBjaGF0LWF2YXRhci1pbml0aWFscy1hc3Npc3RhbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+QTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImRhdGVUaW1lQ29sb3IgPyAnJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRUcmFuc2xhdGlvbihcIkFzc2lzdGFudFwiKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoYXQ/LnRpbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGF0LWJ1YmJsZS13cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBiZ0J1YmJsZUFpIHx8ICcjZmZmJyB9XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYnViYmxlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlNlYXJjaFRpdGxlIGFpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGJvdFNraWxscylcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjaGF0Py5zdWdnZXN0aW9ucz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxoNCBjbGFzcz1cImxhYmVsQ2hhdFwiPlxuICAgICAgICAgICAgICAgIEhlcmUgYXJlIHNvbWUgdGhpbmdzIEV2ZW50c0dQVCBDb3BpbG90IGNhbiBoZWxwIHlvdSBkbzpcbiAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN0YV9zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdWdnZXN0aW9uIG9mIGNoYXQ/LnN1Z2dlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZW5kTWVzc2FnZVdpdGhUaWxlKHN1Z2dlc3Rpb24pXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3VnZ2VzdGlvblwiPnt7XG4gICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25cbiAgICAgICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgY2hhdD8uYWN0aW9uPy5zZWN0aW9uX2lkID09ICdjb21wYW55X3NlYXJjaCcgfHxcbiAgICAgICAgICAgICAgICBjaGF0Py5hY3Rpb24/LnNlY3Rpb25faWQgPT0gJ3VzZXJfc2VhcmNoJyB8fFxuICAgICAgICAgICAgICAgIGNoYXQ/LmFjdGlvbj8uc2VjdGlvbl9pZCA9PSAnaW5kdXN0cnlfY29tcGFueV9zZWFyY2gnXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGlrdG9rd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpa3Rva3NoZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVzZXIgb2YgY2hhdD8uYWN0aW9uLnVzZXJzXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvUGhvdG9ib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29uYXRpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInVzZXI/LnBob3RvUGF0aCAmJiAhdXNlci51c2VyVmlkZW9zTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJ1c2VyPy5waG90b1BhdGhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29uYXRpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb25hdGluZXIgKm5nSWY9XCJ1c2VyLnVzZXJWaWRlb3NNb2RlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC12aWRlby1wbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1c2VyPy51c2VyVmlkZW9zTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNEZXZdPVwiaXNEZXZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVudFVzZXJJZF09XCJ1c2VySWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlkZW9PYmpdPVwidXNlcj8udXNlclZpZGVvc01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZXJdPVwidXNlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtldmVudElkXT1cImV2ZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC12aWRlby1wbGF5ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb25hdGluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vUGhvdG9cIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXVzZXI/LnBob3RvUGF0aCAmJiAhdXNlci51c2VyVmlkZW9zTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGgzPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdXNlci5maXJzdE5hbWUgfCBzbGljZTogMCA6IDFcbiAgICAgICAgICAgICAgICAgICAgICAgIH19e3sgdXNlci5sYXN0TmFtZSB8IHNsaWNlOiAwIDogMSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3Zlcmx5bWFza1wiICpuZ0lmPVwiIXVzZXIudXNlclZpZGVvc01vZGVsXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbnNoZWxsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtc2hlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz57eyB1c2VyLmZpcnN0TmFtZSB9fSB7eyB1c2VyLmxhc3ROYW1lIH19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNvbXBhbnlOYW1lXCI+e3sgdXNlci5jb21wYW55IH19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXNoZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiQ29ubmVjdGJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25uZWN0VG9Vc2VyKHVzZXIudXNlcklkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQ29ubmVjdCh1c2VyLnVzZXJJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJDb25uZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2FuRGlzY29ubmVjdCh1c2VyLnVzZXJJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcIkRpc2Nvbm5lY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiUmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBTZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNjaGVkdWxlYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNjaGVkdWxlTWVldGluZ1dpdGhVc2VyKHVzZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNoYXQ/LmFjdGlvbj8uc2VjdGlvbl9pZCA9PSBteVVwY29taW5nU2Vzc2lvbkFjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbmRhLWl0ZW1zLXdyYXBwZXJcIiBjbGFzcz1cImFnZW5kYS1pdGVtcy13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3Qtdmlld1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tZGV0YWlsLXdyYXBwZXIgY2FyZC1iYWNrZ3JvdW5kLXNlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdXBjb21pbmdTZXNzaW9uIG9mIGNoYXQ/LmFjdGlvbi5jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRodW1ibmFpbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkludHJvZHVjdGlvbiB0byB0aGUgSW1hZ2luZyBSYWRhciBBY2FkZW15XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vczI3bWVkaWEuYXp1cmVlZGdlLm5ldC84MDA4L3Byb2ZpbGVfcGljLzQ1M2NlYTJjLWZlYmEtMTFlZC04YzBiLTAwMTU1ZDAyNWIwYS5wbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+PGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwbGF5LWJ0biBjb2xvci1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiV2F0Y2g6IEludHJvZHVjdGlvbiB0byB0aGUgSW1hZ2luZyBSYWRhciBBY2FkZW15XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlfY2lyY2xlX291dGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IHAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZzLXhzIG1iLTAgYm9keS10ZXh0LWNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwY29taW5nU2Vzc2lvbi5kYXRlVGltZVJhbmdlLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJNTS1kZC15eXl5IEhIOm1tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFNlc3Npb25JYW5hVGltZVpvbmUodXBjb21pbmdTZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGNvbWluZ1Nlc3Npb24uZGF0ZVRpbWVSYW5nZS5lbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk1NLWRkLXl5eXkgSEg6bW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0U2Vzc2lvbklhbmFUaW1lWm9uZSh1cGNvbWluZ1Nlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB1cGNvbWluZ1Nlc3Npb24udGltZVpvbmUuaWQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8cCBjbGFzcz1cImZzLXhzIG1iLTIgY29sb3Itc2Vjb25kYXJ5XCIgdGl0bGU9XCJTZXNzaW9uIFR5cGU6IEdlbmVyYXRpdmUgQUlcIj5HZW5lcmF0aXZlIEFJIDwvcD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYWN0aW9ucyBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGNvbWluZ1Nlc3Npb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWV3LXNlc3Npb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInMyNy1idG4taWNvbiBib2R5LXRleHQtY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiVmlldyBTZXNzaW9uIEluZm9ybWF0aW9uOiBJbnRyb2R1Y3Rpb24gdG8gdGhlIEltYWdpbmcgUmFkYXIgQWNhZGVteVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfcmVkX2V5ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGNvbWluZ1Nlc3Npb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGQtdG8tYWdlbmRhJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzMjctYnRuLWljb24gYm9keS10ZXh0LWNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zIG5vdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWRkIFNlc3Npb246IEludHJvZHVjdGlvbiB0byB0aGUgSW1hZ2luZyBSYWRhciBBY2FkZW15IHRvIE15IGFnZW5kYWFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2F2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24odXBjb21pbmdTZXNzaW9uLmlkLCAncGxheScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInMyNy1idG4taWNvbiBib2R5LXRleHQtY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ29weSBzZXNzaW9uIGxpbmsgdG8gc2hhcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBub3RyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheV9jaXJjbGVfb3V0bGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cImJvZHktdGV4dC1jb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdXBjb21pbmdTZXNzaW9uLnRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlc3Npb24tZGVzY3JpcHRpb24gY29sb3Itc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKHVwY29taW5nU2Vzc2lvbi5kZXNjcmlwdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3BlYWtlcnMgZ3JpZC0yLWNvbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNwZWFrZXJJZCBvZiB1cGNvbWluZ1Nlc3Npb24uc3BlYWtlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VcIiB0aXRsZT1cIkJsYWlyIFd1bmRlcmxpY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJCbGFpciBXdW5kZXJsaWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwic3BlYWtlcnNbc3BlYWtlcklkXT8ucGhvdG9QYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50IHBsLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IG5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTAgYm9keS10ZXh0LWNvbG9yIGZzLXhzIGZ3LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BlYWtlcnNbc3BlYWtlcklkXT8uZmlyc3ROYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGVha2Vyc1tzcGVha2VySWRdPy5sYXN0TmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1zZWNvbmRhcnkgZnMteHhzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGVha2Vyc1tzcGVha2VySWRdPy5qb2JUaXRsZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xvci1zZWNvbmRhcnkgZnMteHhzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGVha2Vyc1tzcGVha2VySWRdPy5jb21wYW55IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLS0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBJbml0aWFsIGxvYWQ6IGxvYWRpbmcgZG90cyB3aGVuIGZldGNoaW5nIGNoYXQgaGlzdG9yeSAobm8gXCJUaGlua2luZ1wiKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQgYm90IGNoYXQtdGhpbmtpbmcgY2hhdC1sb2FkaW5nLWRvdHNcIiAqbmdJZj1cImxvYWRpbmcgJiYgIWlzQ2hhdGluZ1dpdGhBaVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWJveFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtY3RhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkljb25fVGltZVNUYW1wXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1hdmF0YXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiIFtzcmNdPVwiZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uXCIgYWx0PVwiQXNzaXN0YW50XCIgY2xhc3M9XCJjaGF0LWF2YXRhci1pbWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiEoZGlzcGxheUF2YXRhclVybCB8fCBib3RJY29uKVwiIGNsYXNzPVwiY2hhdC1hdmF0YXItaW5pdGlhbHMgY2hhdC1hdmF0YXItaW5pdGlhbHMtYXNzaXN0YW50XCI+QTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVUaW1lXCIgW3N0eWxlLmNvbG9yXT1cImRhdGVUaW1lQ29sb3IgPyAnJyA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGdldFRyYW5zbGF0aW9uKFwiQXNzaXN0YW50XCIpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7eyBnZXRMb2FkaW5nVGltZSgpIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGlua2luZy1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhpbmtpbmctZG90c1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aGlua2luZy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRoaW5raW5nLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGhpbmtpbmctZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGhpbmtpbmctdGV4dFwiPnt7IGdldFRyYW5zbGF0aW9uKFwiTG9hZGluZ1wiKSB8fCBcIkxvYWRpbmdcIiB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gVGhpbmtpbmc6IG9ubHkgd2hlbiB1c2VyIGhhcyBzZW50IGEgbWVzc2FnZSBhbmQgQUkgaXMgcmVzcG9uZGluZyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQgYm90IGNoYXQtdGhpbmtpbmdcIiAqbmdJZj1cImlzQ2hhdGluZ1dpdGhBaSAmJiAhZXhlY3V0aW5nV29ya2Zsb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1ib3hcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWN0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJY29uX1RpbWVTVGFtcFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtYXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJkaXNwbGF5QXZhdGFyVXJsIHx8IGJvdEljb25cIiBbc3JjXT1cImRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvblwiIGFsdD1cIkFzc2lzdGFudFwiIGNsYXNzPVwiY2hhdC1hdmF0YXItaW1nXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhKGRpc3BsYXlBdmF0YXJVcmwgfHwgYm90SWNvbilcIiBjbGFzcz1cImNoYXQtYXZhdGFyLWluaXRpYWxzIGNoYXQtYXZhdGFyLWluaXRpYWxzLWFzc2lzdGFudFwiPkE8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlVGltZVwiIFtzdHlsZS5jb2xvcl09XCJkYXRlVGltZUNvbG9yID8gJycgOiAnJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRUcmFuc2xhdGlvbihcIkFzc2lzdGFudFwiKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3sgZ2V0TG9hZGluZ1RpbWUoKSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhpbmtpbmctcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoaW5raW5nLWRvdHNcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGhpbmtpbmctZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0aGlua2luZy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRoaW5raW5nLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRoaW5raW5nLXRleHRcIj57eyBnZXRUcmFuc2xhdGlvbihcIlRoaW5raW5nXCIpIHx8IFwiVGhpbmtpbmdcIiB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gPGRpdiAjY2hhdE1haW4+PC9kaXY+IC0tPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIm9wZW5Xb3JrZmxvd0lucHV0ICYmIHNlbGVjdGVkV29ya2Zsb3cgJiYgIWV4ZWN1dGluZ1dvcmtmbG93XCJcbiAgICAgICAgY2xhc3M9XCJjaGF0Rm9vdGVyV3JhcHBlclwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gbmV3IFVJIGZvciBDaGF0IE1lc3NhZ2UgU2VjdGlvbiBieSBBbWl0IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhdC1mb290ZXItdXB0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRvcGluZm8tY29udGFpbmVyYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzX25vdGVfd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxoNj57eyBzZWxlY3RlZFdvcmtmbG93Py5OYW1lIH19PC9oNj5cbiAgICAgICAgICAgICAgICB7eyBzZWxlY3RlZFdvcmtmbG93Py5EZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzX25vdGVfd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9zZUJ1dHRvblNvdXJjZVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVdvcmtmbG93cyhmYWxzZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tYm94LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDwhLS0gaGVyZSBpIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgZmllbGRzIHNlbGVjdGVkV29ya2Zsb3cuVHJpZ2dlci5JbnB1dFNjaGVtYSBhbmQgcmVuZGVyIHRoZSBpbnB1dCBmaWVsZHMgLS0+XG4gICAgICAgICAgICA8IS0tIEZvcm0gZm9yIFdvcmtmbG93IElucHV0cyAtLT5cbiAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwid29ya2Zsb3dGb3JtXCJcbiAgICAgICAgICAgICAgKG5nU3VibWl0KT1cIm9uV29ya2Zsb3dTdWJtaXQoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGlucHV0IG9mIHNlbGVjdGVkV29ya2Zsb3c/LlRyaWdnZXI/LklucHV0U2NoZW1hXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZ3JvdXBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGlucHV0LkxhYmVsIH19PC9sYWJlbD5cblxuICAgICAgICAgICAgICAgIDwhLS0gSGFuZGxlIFRleHQgSW5wdXQgb3IgVGV4dCBBcmVhIGJhc2VkIG9uIHJlcXVpcmVtZW50IC0tPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbnB1dC5UeXBlID09PSAnc3RyaW5nJ1wiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpbnB1dC5JbnB1dElkIH19XCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJpbnB1dC5QbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICBbcm93c109XCIyXCJcbiAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJpbnB1dC5SZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG5cbiAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIGZvciBTZWxlY3QgT3B0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImlucHV0LlR5cGUgPT09ICdzZWxlY3QnXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGlucHV0LklucHV0SWQgfX1cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBpbnB1dC5PcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi5WYWx1ZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5MYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gU3VibWl0IGJ1dHRvbiBhbGlnbmVkIHRvIHRoZSByaWdodCAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBzdWJtaXQtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICBTdWJtaXRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gbmV3IFVJIGZvciBDaGF0IE1lc3NhZ2UgU2VjdGlvbiBieSBBbWl0IC0tPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiIW9wZW5Xb3JrZmxvd0lucHV0XCIgY2xhc3M9XCJjaGF0Rm9vdGVyV3JhcHBlclwiPlxuICAgICAgICA8IS0tIG5ldyBVSSBmb3IgQ2hhdCBNZXNzYWdlIFNlY3Rpb24gYnkgQW1pdCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXQtZm9vdGVyLXVwdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BpbmZvLWNvbnRhaW5lcmJveFwiICpuZ0lmPVwiIWNoZWNrRm9yQ29wMjlCb3RJZCgpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzX25vdGVfd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLWRyb3Bkb3duLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24td3JhcHBlclwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGdldERyb3Bkb3duSGVhZGVyVGV4dCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xOSA5bC03IDctNy03XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgKm5nSWY9XCJpc0Ryb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKGNsaWNrKT1cIm9uU2VsZWN0QWxsKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiYXJlQWxsU2VsZWN0ZWQoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgQWxsXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhZ2VudCBvZiBhZ2VudHNcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFnZW50Q2hhbmdlKGFnZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJhZ2VudC5zZWxlY3RlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAge3sgYWdlbnQuYWdlbnROYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50c19ub3RlX3dyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy1kcm9wZG93bi13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLXdyYXBwZXJcIiAoY2xpY2spPVwidG9nZ2xlV29ya2Zsb3dzKClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNTYgMjU2XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtNSB3LTVcIlxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjEuM2VtXCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEuM2VtXCJcbiAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTI0NS42Niw3NC4zNGwtMzItMzJhOCw4LDAsMCwwLTExLjMyLDExLjMyTDIyMC42OSw3MkgxOTJhNzQuNDksNzQuNDksMCwwLDAtMjguMzUsNi43M2MtMTMuNjIsNi4yOS0zMC44MywxOS43MS0zNS41NCw0OC01LjMyLDMxLjk0LTI5LjEsMzkuMjItNDEsNDAuODZhNDAsNDAsMCwxLDAsLjE4LDE2LjA2QTcxLjY1LDcxLjY1LDAsMCwwLDEwOC4xMywxNzhDMTIxLjc1LDE3MiwxMzksMTU4LjYsMTQzLjg5LDEyOS4zMSwxNTAuNjUsODguNzcsMTkwLjM0LDg4LDE5Miw4OGgyOC42OWwtMTguMzUsMTguMzRhOCw4LDAsMCwwLDExLjMyLDExLjMybDMyLTMyQTgsOCwwLDAsMCwyNDUuNjYsNzQuMzRaTTQ4LDIwMGEyNCwyNCwwLDEsMSwyNC0yNEEyNCwyNCwwLDAsMSw0OCwyMDBaXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPjwvc3ZnXG4gICAgICAgICAgICAgICAgICAgID4mbmJzcDsgV29ya2Zsb3dzXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgKm5nSWY9XCJpc1dvcmtmbG93T3BlblwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3JnV29ya2Zsb3cgb2Ygb3JnV29ya2Zsb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Xb3JrZmxvd1NlbGVjdGVkKG9yZ1dvcmtmbG93KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBvcmdXb3JrZmxvdy5OYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm90dG9tYm94LXdyYXBwZXJcIj5cbiAgICAgICAgICAgIDwhLS0gPGlucHV0IFtkaXNhYmxlZF09XCJpc0NoYXRpbmdXaXRoQWlcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sLTEgczI3LXNjcm9sbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBc2sgYW55dGhpbmcuLi5cIiBbc3R5bGUuYmFja2dyb3VuZF09XCJmb3JtRmllbGRCZ0NvbG9yID8gZm9ybUZpZWxkQmdDb2xvciA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZm9ybUZpZWxkVGV4dENvbG9yID8gZm9ybUZpZWxkVGV4dENvbG9yIDogJydcIiBbKG5nTW9kZWwpXT1cImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaGFuZGxlU3VibWl0KClcIiAjbXlJbnB1dCAvPiAtLT5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNDaGF0aW5nV2l0aEFpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wtMSBzMjctc2Nyb2xsIGNoYXQtdGV4dGFyZWFcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IGdldFRyYW5zbGF0aW9uKCdBc2sgYW55dGhpbmcnKSB9fVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwiYWRqdXN0VGV4dGFyZWFIZWlnaHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICNteUlucHV0XG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cblxuICAgICAgICAgICAgXG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gY3RhLWNoYXQgcm90YXRlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVN1Ym1pdCgpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2VuZEJ1dHRvbkNvbG9yID8gc2VuZEJ1dHRvbkNvbG9yIDogJydcIlxuICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VuZEJ1dHRvblRleHRDb2xvciA/IHNlbmRCdXR0b25UZXh0Q29sb3IgOiAnJ1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgZ2V0VHJhbnNsYXRpb24oJ1NlbmQgTWVzc2FnZScpIH19XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDFweFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgNTEyIDUxMlwiXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiMWVtXCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjFlbVwiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgZD1cIk00NzYuNTkgMjI3LjA1bC0uMTYtLjA3TDQ5LjM1IDQ5Ljg0QTIzLjU2IDIzLjU2IDAgMDAyNy4xNCA1MiAyNC42NSAyNC42NSAwIDAwMTYgNzIuNTl2MTEzLjI5YTI0IDI0IDAgMDAxOS41MiAyMy41N2wyMzIuOTMgNDMuMDdhNCA0IDAgMDEwIDcuODZMMzUuNTMgMzAzLjQ1QTI0IDI0IDAgMDAxNiAzMjd2MTEzLjMxQTIzLjU3IDIzLjU3IDAgMDAyNi41OSA0NjBhMjMuOTQgMjMuOTQgMCAwMDEzLjIyIDQgMjQuNTUgMjQuNTUgMCAwMDkuNTItMS45M0w0NzYuNCAyODUuOTRsLjE5LS4wOWEzMiAzMiAwIDAwMC01OC44elwiXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwhLS0gU0VORCAtLT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGN0YS1jaGF0IG1yLTEgdm9pY2UtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Wb2ljZU1vZGFsKClcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2VuZEJ1dHRvbkNvbG9yID8gc2VuZEJ1dHRvbkNvbG9yIDogJydcIlxuICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VuZEJ1dHRvblRleHRDb2xvciA/IHNlbmRCdXR0b25UZXh0Q29sb3IgOiAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZvaWNlLWJ0bi1pY29uXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjE4XCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxOFwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJlY3QgY2xhc3M9XCJ2YmFyIHZiYXItMVwiIHg9XCIzXCIgIHk9XCI5XCIgIHdpZHRoPVwiMlwiIGhlaWdodD1cIjZcIiAgcng9XCIxXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cInZiYXIgdmJhci0yXCIgeD1cIjdcIiAgeT1cIjZcIiAgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiMTJcIiByeD1cIjFcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgICAgIDxyZWN0IGNsYXNzPVwidmJhciB2YmFyLTNcIiB4PVwiMTFcIiB5PVwiM1wiICB3aWR0aD1cIjJcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMVwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIi8+XG4gICAgICAgICAgICAgICAgPHJlY3QgY2xhc3M9XCJ2YmFyIHZiYXItNFwiIHg9XCIxNVwiIHk9XCI2XCIgIHdpZHRoPVwiMlwiIGhlaWdodD1cIjEyXCIgcng9XCIxXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiLz5cbiAgICAgICAgICAgICAgICA8cmVjdCBjbGFzcz1cInZiYXIgdmJhci01XCIgeD1cIjE5XCIgeT1cIjlcIiAgd2lkdGg9XCIyXCIgaGVpZ2h0PVwiNlwiICByeD1cIjFcIiBmaWxsPVwiY3VycmVudENvbG9yXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2b2ljZS1idG4tdGV4dFwiPlZvaWNlPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gbmV3IFVJIGZvciBDaGF0IE1lc3NhZ2UgU2VjdGlvbiBieSBBbWl0IC0tPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJOb3RlVHh0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlXCI+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICB3aWR0aD1cIjEyLjg4MlwiXG4gICAgICAgICAgICBoZWlnaHQ9XCIxMi44ODNcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMi44ODIgMTIuODgzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBpZD1cIkljb25faW9uLXNoaWVsZC1jaGVja21hcmtcIlxuICAgICAgICAgICAgICBkYXRhLW5hbWU9XCJJY29uIGlvbi1zaGllbGQtY2hlY2ttYXJrXCJcbiAgICAgICAgICAgICAgZD1cIk0xNS4xMDYsNC41MzJhLjQ2LjQ2LDAsMCwwLS4zNzgtLjQyNEEyMC4xMzIsMjAuMTMyLDAsMCwxLDguODgxLDIuMjkxYS40Ni40NiwwLDAsMC0uMzc5LDBBMjAuMTMyLDIwLjEzMiwwLDAsMSwyLjY1NSw0LjEwOGEuNDYuNDYsMCwwLDAtLjM3OC40MjRBMTEuMywxMS4zLDAsMCwwLDIuOTgsOS40YTEwLjA0OSwxMC4wNDksMCwwLDAsMi4wNiwzLjIzNUExMC41MTYsMTAuNTE2LDAsMCwwLDguNTIxLDE1LjFhLjQ2LjQ2LDAsMCwwLC4zNDUsMCwxMC41MTYsMTAuNTE2LDAsMCwwLDMuNDgxLTIuNDY1QTEwLjA0OSwxMC4wNDksMCwwLDAsMTQuNCw5LjQsMTEuMywxMS4zLDAsMCwwLDE1LjEwNiw0LjUzMlptLTMuNzY3LDIuMTZMOC4xNTMsMTAuMzczYS40Ni40NiwwLDAsMS0uMzI4LjE1OUg3LjgwNmEuNDYuNDYsMCwwLDEtLjMyMi0uMTMxTDYuMDY5LDkuMDE0YS40Ni40NiwwLDEsMSwuNjQ0LS42NTdMNy43NzcsOS40LDEwLjY0NCw2LjA5YS40Ni40NiwwLDAsMSwuNy42WlwiXG4gICAgICAgICAgICAgIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi4yNSAtMi4yNSlcIlxuICAgICAgICAgICAgICBmaWxsPVwiIzA2ZlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0XCI+e3tcbiAgICAgICAgICAgIGdldFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgICBcIllvdXIgcGVyc29uYWwgb3IgY29tcGFueSBpbmZvcm1hdGlvbiBpcyBrZXB0IHByaXZhdGUgYW5kIHNlY3VyZVxuICAgICAgICAgICAgd2l0aGluIHRoaXMgY2hhdC5cIlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWRyYXdlci1jb250ZW50PlxuICA8L21hdC1kcmF3ZXI+XG4gIDxtYXQtZHJhd2VyXG4gICAgY2xhc3M9XCJkcmF3ZXIgZWRpdC1ib3hEcmF3ZXJcIlxuICAgIHN0eWxlPVwid2lkdGg6IDQ1JVwiXG4gICAgI3NvdXJjZXNEcmF3ZXJcbiAgICBbcG9zaXRpb25dPVwiJ2VuZCdcIlxuICAgIFttb2RlXT1cIidvdmVyJ1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmRdPVwiXG4gICAgICAnbGluZWFyLWdyYWRpZW50KCcgKyAoYmdHcmFkaWVudCA/IGJnR3JhZGllbnQuam9pbignLCAnKSA6ICcnKSArICcpJ1xuICAgIFwiXG4gID5cbiAgICA8bWF0LWRyYXdlci1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cInNvdXJjZURyYXdlQ29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiY2xvc2VCdXR0b25Tb3VyY2VcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2VTb3VyY2UoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8aDE+e3sgY3VycmVudFNvdXJjZXNMaXN0Py5sZW5ndGggfX0gU291cmNlczwvaDE+XG4gICAgICAgICAgPCEtLSA8cD5UZWxsIG1lIGFib3V0IGxhdGVzdCBuZXdzIGZyb20gTWlzdHJhbCBhYm91dCBBSSBhZ2VudHMgYW5ub3VuY2VtZW50IGRvbmUgdGhpcyBtb250aDwvcD4gLS0+XG4gICAgICAgICAgPGhyIC8+XG4gICAgICAgICAgPHVsIGNsYXNzPVwic291cmNlcy1saXN0XCI+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY3VycmVudFNvdXJjZXNMaXN0OyBsZXQgc2kgPSBpbmRleFwiPlxuICAgICAgICAgICAgICA8IS0tIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNvdXJjZTFcIj4gLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb3VyY2UtY29udGVudFwiIChjbGljayk9XCJvcGVuTGlua0luTmV3VGFiKGl0ZW0ubGluaylcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic291cmNlMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3VyY2UtdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICA+PHNwYW4gY2xhc3M9XCJtbC0xXCI+e3sgc2kgKyAxIH19Ljwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+e3sgaXRlbS50aXRsZSB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0RmF2aWNvblVybChpdGVtLmxpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cImdldERvbWFpbk5hbWUoaXRlbS5saW5rKSArICcgZmF2aWNvbidcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgZ2V0RG9tYWluTmFtZShpdGVtLmxpbmspIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3VyY2UtZGVzY3JpcHRpb25cIj57eyBpdGVtLmRlc2MgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZHJhd2VyLWNvbnRlbnQ+XG4gIDwvbWF0LWRyYXdlcj5cbiAgPG1hdC1kcmF3ZXJcbiAgICBjbGFzcz1cImRyYXdlciBlZGl0LWJveERyYXdlclwiXG4gICAgc3R5bGU9XCJ3aWR0aDogNDUlXCJcbiAgICAjZWRpdG9yc0RyYXdlclxuICAgIFtwb3NpdGlvbl09XCInZW5kJ1wiXG4gICAgW21vZGVdPVwiJ3B1c2gnXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJcbiAgICAgICdsaW5lYXItZ3JhZGllbnQoJyArIChiZ0dyYWRpZW50ID8gYmdHcmFkaWVudC5qb2luKCcsICcpIDogJycpICsgJyknXG4gICAgXCJcbiAgPlxuICAgIDxtYXQtZHJhd2VyLWNvbnRlbnQ+XG4gICAgICA8bGliLWJvdC1odG1sLWVkaXRvclxuICAgICAgICAqbmdJZj1cImlzQ29udGVudExvYWRlZFwiXG4gICAgICAgIFtlZGl0b3JDb250ZW50XT1cImN1cnJlbnRNZXNzYWdlRm9yRWRpdG9yXCJcbiAgICAgICAgW2lzRG9jSW5FZGl0TW9kZV09XCJpc0RvY0luRWRpdE1vZGVcIlxuICAgICAgICBbZG9jdW1lbnRDb250ZW50XT1cImRvY3VtZW50Q29udGVudFwiXG4gICAgICAgIFtjb252ZXJzYXRpb25JZF09XCJjb252ZXJzYXRpb25JZFwiXG4gICAgICAgIFtib3RJZF09XCJib3RJZFwiXG4gICAgICA+PC9saWItYm90LWh0bWwtZWRpdG9yPlxuICAgIDwvbWF0LWRyYXdlci1jb250ZW50PlxuICA8L21hdC1kcmF3ZXI+XG48L21hdC1kcmF3ZXItY29udGFpbmVyPlxuXG48ZGl2ICpuZ0lmPVwic2hvd1dvcmtmbG93RXhlY3V0aW9uRGV0YWlsc1wiIGNsYXNzPVwibW9kYWxcIj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2xvc2Utd3JhcHBlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zZV9wb3BcIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidGl0bGVTZWN0aW9uXCI+XG4gICAgICA8IS0tIFdvcmtmbG93IFRpdGxlIC0tPlxuICAgICAgPGgyPnt7IHdvcmtmbG93RXhlY3V0aW9uRGV0YWlscy5Xb3JrZmxvd05hbWUgfX08L2gyPlxuICAgICAgPCEtLSBXb3JrZmxvdyBUaXRsZSAtLT5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIElucHV0cyBTZWN0aW9uIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dHMtc2VjdGlvblwiPlxuICAgICAgPGgzPklucHV0czwvaDM+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpbnB1dCBvZiBvYmplY3RUb0FycmF5KHdvcmtmbG93RXhlY3V0aW9uRGV0YWlscy5JbnB1dHMpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGlucHV0LmtleSB9fToge3sgaW5wdXQudmFsdWUgfX1cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbnMgU2VjdGlvbiAoRGlzcGxheWVkIGFzIFRpbWVsaW5lKSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1zZWN0aW9uXCI+XG4gICAgICA8aDM+QWdlbnQgQWN0aW9uczwvaDM+XG4gICAgICA8ZGl2IGNsYXNzPVwidGltZWxpbmVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2Ygd29ya2Zsb3dFeGVjdXRpb25EZXRhaWxzLkFjdGlvbnNcIlxuICAgICAgICAgIGNsYXNzPVwidGltZWxpbmUtaXRlbVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZXN0YW1wLXNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoND57eyBhY3Rpb24uQWN0aW9uTmFtZSB8fCBhY3Rpb24uTmFtZSB9fTwvaDQ+XG4gICAgICAgICAgICA8cD48c3Ryb25nPjwvc3Ryb25nPiB7eyBhY3Rpb24uSW5zZXJ0VGltZVN0YW1wIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwIFtpbm5lckhUTUxdPVwicHJvY2Vzc01lc3NhZ2VGb3JEaXNwbGF5KGFjdGlvbi5PdXRwdXQpXCI+PC9wPlxuICAgICAgICAgIDwhLS0gPHByZT57eyBhY3Rpb24uT3V0cHV0IH19PC9wcmU+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBJbnNlcnQgVGltZXN0YW1wIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ0aW1lc3RhbXAtc2VjdGlvblwiPlxuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+SW5zZXJ0ZWQgQXQ6PC9zdHJvbmc+XG4gICAgICAgIHt7IHdvcmtmbG93RXhlY3V0aW9uRGV0YWlscy5JbnNlcnRUaW1lU3RhbXAgfX1cbiAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==