stream-chat-angular 4.46.0 → 4.47.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/version.d.ts +1 -1
- package/bundles/stream-chat-angular.umd.js +56 -10
- package/bundles/stream-chat-angular.umd.js.map +1 -1
- package/esm2015/assets/version.js +2 -2
- package/esm2015/lib/channel.service.js +2 -2
- package/esm2015/lib/custom-templates.service.js +9 -1
- package/esm2015/lib/message-list/message-list.component.js +39 -9
- package/fesm2015/stream-chat-angular.js +48 -10
- package/fesm2015/stream-chat-angular.js.map +1 -1
- package/lib/channel.service.d.ts +2 -0
- package/lib/custom-templates.service.d.ts +8 -0
- package/lib/message-list/message-list.component.d.ts +8 -3
- package/package.json +1 -1
- package/src/assets/version.ts +1 -1
|
@@ -16,12 +16,13 @@ import * as i9 from "@ngx-translate/core";
|
|
|
16
16
|
* The `MessageList` component renders a scrollable list of messages.
|
|
17
17
|
*/
|
|
18
18
|
export class MessageListComponent {
|
|
19
|
-
constructor(channelService, chatClientService, customTemplatesService, dateParser, ngZone) {
|
|
19
|
+
constructor(channelService, chatClientService, customTemplatesService, dateParser, ngZone, cdRef) {
|
|
20
20
|
this.channelService = channelService;
|
|
21
21
|
this.chatClientService = chatClientService;
|
|
22
22
|
this.customTemplatesService = customTemplatesService;
|
|
23
23
|
this.dateParser = dateParser;
|
|
24
24
|
this.ngZone = ngZone;
|
|
25
|
+
this.cdRef = cdRef;
|
|
25
26
|
/**
|
|
26
27
|
* Determines if the message list should display channel messages or [thread messages](https://getstream.io/chat/docs/javascript/threads/?language=javascript).
|
|
27
28
|
*/
|
|
@@ -61,8 +62,10 @@ export class MessageListComponent {
|
|
|
61
62
|
* You can turn on and off the loading indicator that signals to users that more messages are being loaded to the message list
|
|
62
63
|
*/
|
|
63
64
|
this.displayLoadingIndicator = true;
|
|
65
|
+
this.emptyMainMessageListTemplate = null;
|
|
66
|
+
this.emptyThreadMessageListTemplate = null;
|
|
64
67
|
this.enabledMessageActions = [];
|
|
65
|
-
this.
|
|
68
|
+
this.isEmpty = true;
|
|
66
69
|
this.unreadMessageCount = 0;
|
|
67
70
|
this.groupStyles = [];
|
|
68
71
|
this.isNextMessageOnSeparateDate = [];
|
|
@@ -129,6 +132,9 @@ export class MessageListComponent {
|
|
|
129
132
|
this.usersTypingInChannel$ = this.channelService.usersTypingInChannel$;
|
|
130
133
|
this.usersTypingInThread$ = this.channelService.usersTypingInThread$;
|
|
131
134
|
}
|
|
135
|
+
get class() {
|
|
136
|
+
return `str-chat-angular__main-panel-inner str-chat-angular__message-list-host str-chat__main-panel-inner ${this.isEmpty ? 'str-chat-angular__message-list-host--empty' : ''}`;
|
|
137
|
+
}
|
|
132
138
|
ngOnInit() {
|
|
133
139
|
this.setMessages$();
|
|
134
140
|
}
|
|
@@ -169,6 +175,20 @@ export class MessageListComponent {
|
|
|
169
175
|
}
|
|
170
176
|
}
|
|
171
177
|
}));
|
|
178
|
+
this.subscriptions.push(this.customTemplatesService.emptyMainMessageListPlaceholder$.subscribe((template) => {
|
|
179
|
+
const isChanged = this.emptyMainMessageListTemplate !== template;
|
|
180
|
+
this.emptyMainMessageListTemplate = template || null;
|
|
181
|
+
if (isChanged) {
|
|
182
|
+
this.cdRef.detectChanges();
|
|
183
|
+
}
|
|
184
|
+
}));
|
|
185
|
+
this.subscriptions.push(this.customTemplatesService.emptyThreadMessageListPlaceholder$.subscribe((template) => {
|
|
186
|
+
const isChanged = this.emptyThreadMessageListTemplate !== template;
|
|
187
|
+
this.emptyThreadMessageListTemplate = template || null;
|
|
188
|
+
if (isChanged) {
|
|
189
|
+
this.cdRef.detectChanges();
|
|
190
|
+
}
|
|
191
|
+
}));
|
|
172
192
|
}
|
|
173
193
|
ngAfterViewChecked() {
|
|
174
194
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -310,6 +330,11 @@ export class MessageListComponent {
|
|
|
310
330
|
var _a;
|
|
311
331
|
return { replyCount: (_a = this.parentMessage) === null || _a === void 0 ? void 0 : _a.reply_count };
|
|
312
332
|
}
|
|
333
|
+
get emptyListTemplate() {
|
|
334
|
+
return this.mode === 'main'
|
|
335
|
+
? this.emptyMainMessageListTemplate
|
|
336
|
+
: this.emptyThreadMessageListTemplate;
|
|
337
|
+
}
|
|
313
338
|
preserveScrollbarPosition() {
|
|
314
339
|
this.scrollContainer.nativeElement.scrollTop =
|
|
315
340
|
(this.prevScrollTop || 0) +
|
|
@@ -354,6 +379,10 @@ export class MessageListComponent {
|
|
|
354
379
|
this.resetScrollState();
|
|
355
380
|
return;
|
|
356
381
|
}
|
|
382
|
+
if (this.isEmpty) {
|
|
383
|
+
// cdRef.detectChanges() isn't enough here, test will fail
|
|
384
|
+
setTimeout(() => (this.isEmpty = false), 0);
|
|
385
|
+
}
|
|
357
386
|
(_d = (_c = this.chatClientService.chatClient) === null || _c === void 0 ? void 0 : _c.logger) === null || _d === void 0 ? void 0 : _d.call(_c, 'info', `Received one or more messages`, {
|
|
358
387
|
tags: `message list ${this.mode}`,
|
|
359
388
|
});
|
|
@@ -399,6 +428,7 @@ export class MessageListComponent {
|
|
|
399
428
|
}));
|
|
400
429
|
}
|
|
401
430
|
resetScrollState() {
|
|
431
|
+
this.isEmpty = true;
|
|
402
432
|
this.latestMessage = undefined;
|
|
403
433
|
this.hasNewMessages = true;
|
|
404
434
|
this.isUserScrolled = false;
|
|
@@ -471,8 +501,8 @@ export class MessageListComponent {
|
|
|
471
501
|
return false;
|
|
472
502
|
}
|
|
473
503
|
}
|
|
474
|
-
MessageListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, deps: [{ token: i1.ChannelService }, { token: i2.ChatClientService }, { token: i3.CustomTemplatesService }, { token: i4.DateParserService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
475
|
-
MessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { mode: "mode", direction: "direction", messageOptionsTrigger: "messageOptionsTrigger", hideJumpToLatestButtonDuringScroll: "hideJumpToLatestButtonDuringScroll", customMessageActions: "customMessageActions", displayDateSeparator: "displayDateSeparator", dateSeparatorTextPos: "dateSeparatorTextPos", openMessageListAt: "openMessageListAt", displayLoadingIndicator: "displayLoadingIndicator" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n style=\"overscroll-behavior: none\"\n>\n <div class=\"str-chat__reverse-infinite-scroll str-chat__message-list-scroll\">\n <ul\n class=\"str-chat__ul\"\n [class.str-chat__message-options-in-bubble]=\"\n messageOptionsTrigger === 'message-bubble'\n \"\n >\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread' && parentMessage\"\n data-testid=\"parent-message\"\n class=\"str-chat__parent-message-li\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage, index: 'parent' }\n \"\n ></ng-container>\n <div data-testid=\"reply-count\" class=\"str-chat__thread-start\">\n {{parentMessage?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </div>\n </li>\n <stream-loading-indicator\n data-testid=\"top-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'bottom-to-top' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n <ng-container *ngIf=\"messages$ | async as messages\">\n <ng-container\n *ngFor=\"\n let message of messages;\n let i = index;\n let isFirst = first;\n let isLast = last;\n trackBy: trackByMessageId\n \"\n >\n <ng-container *ngIf=\"isFirst\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: message.created_at,\n parsedDate: parseDate(message.created_at),\n isNewMessage: false\n }\n \"\n ></ng-container>\n </ng-container>\n <li\n tabindex=\"0\"\n data-testclass=\"message\"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n id=\"{{ message.id }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message, index: i }\n \"\n ></ng-container>\n </li>\n <ng-container\n *ngIf=\"\n (lastReadMessageId === message.id &&\n !isLast &&\n direction === 'bottom-to-top' &&\n !isSentByCurrentUser(messages[i + 1]) &&\n (!displayDateSeparator || !isNextMessageOnSeparateDate[i])) ||\n (direction === 'top-to-bottom' &&\n !isLast &&\n !isSentByCurrentUser(message) &&\n lastReadMessageId === messages[i + 1].id)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesIndicatorTemplate ||\n defaultNewMessagesIndicator\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isNextMessageOnSeparateDate[i]\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: messages[i + 1].created_at,\n parsedDate: parseDate(messages[i + 1].created_at),\n isNewMessage:\n (direction === 'bottom-to-top' &&\n message.id === lastReadMessageId &&\n !isSentByCurrentUser(messages[i + 1])) ||\n (direction === 'top-to-bottom' && false)\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"bottom-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'top-to-bottom' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n </ul>\n <ng-template #defaultTypingIndicator let-usersTyping$=\"usersTyping$\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <ng-container *ngIf=\"$any(usersTyping$ | async) as users\">\n <div\n *ngIf=\"users.length > 0\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n <div\n data-testid=\"typing-users\"\n class=\"str-chat__typing-indicator__users\"\n >\n {{\n users.length === 1\n ? (\"streamChat.user is typing\"\n | translate: { user: getTypingIndicatorText(users) })\n : (\"streamChat.users are typing\"\n | translate: { users: getTypingIndicatorText(users) })\n }}\n </div>\n </div>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate || defaultTypingIndicator;\n context: getTypingIndicatorContext()\n \"\n ></ng-container>\n </div>\n</div>\n<div class=\"str-chat__jump-to-latest-message\">\n <button\n data-testid=\"scroll-to-latest\"\n *ngIf=\"isUserScrolled\"\n class=\"\n str-chat__message-notification-scroll-to-latest\n str-chat__message-notification-scroll-to-latest-right\n str-chat__circle-fab\n \"\n (keyup.enter)=\"jumpToLatestMessage()\"\n (click)=\"jumpToLatestMessage()\"\n >\n <stream-icon\n class=\"str-chat__jump-to-latest-icon str-chat__circle-fab-icon\"\n [icon]=\"direction === 'bottom-to-top' ? 'arrow-down' : 'arrow-up'\"\n ></stream-icon>\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-to-latest-unread-count\n str-chat__jump-to-latest-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\" let-index=\"index\">\n <ng-template\n #defaultMessageTemplate\n let-messageInput=\"message\"\n let-isLastSentMessage=\"isLastSentMessage\"\n let-enabledMessageActions=\"enabledMessageActions\"\n let-mode=\"mode\"\n let-isHighlighted=\"isHighlighted\"\n let-customActions=\"customActions\"\n >\n <stream-message\n [message]=\"messageInput\"\n [isLastSentMessage]=\"isLastSentMessage\"\n [enabledMessageActions]=\"enabledMessageActions\"\n [mode]=\"mode\"\n [isHighlighted]=\"isHighlighted\"\n [customActions]=\"customActions\"\n ></stream-message>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate || defaultMessageTemplate;\n context: {\n message: message,\n isLastSentMessage: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n enabledMessageActions: enabledMessageActions,\n mode: mode,\n isHighlighted:\n message?.id === highlightedMessageId &&\n !isJumpingToLatestUnreadMessage,\n customActions: customMessageActions\n }\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #dateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n let-isNewMessage=\"isNewMessage\"\n>\n <ng-container *ngIf=\"displayDateSeparator\">\n <ng-container\n *ngTemplateOutlet=\"\n customDateSeparatorTemplate || defaultDateSeparator;\n context: {\n date: date,\n parsedDate: parsedDate,\n isNewMessage: isNewMessage\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template\n #defaultDateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n let-isNewMessage=\"isNewMessage\"\n >\n <div data-testid=\"date-separator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\">\n {{ parsedDate }}\n <span\n *ngIf=\"isNewMessage\"\n data-testid=\"new-messages-indicator-date-separator\"\n >\u2022 {{ \"streamChat.New\" | translate }}</span\n >\n </div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #defaultNewMessagesIndicator>\n <div data-testid=\"new-messages-indicator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\" translate>streamChat.New</div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n</ng-template>\n", components: [{ type: i5.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { type: i6.IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: i7.MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode", "isHighlighted", "customActions"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i9.TranslatePipe, "async": i8.AsyncPipe } });
|
|
504
|
+
MessageListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, deps: [{ token: i1.ChannelService }, { token: i2.ChatClientService }, { token: i3.CustomTemplatesService }, { token: i4.DateParserService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
505
|
+
MessageListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.5", type: MessageListComponent, selector: "stream-message-list", inputs: { mode: "mode", direction: "direction", messageOptionsTrigger: "messageOptionsTrigger", hideJumpToLatestButtonDuringScroll: "hideJumpToLatestButtonDuringScroll", customMessageActions: "customMessageActions", displayDateSeparator: "displayDateSeparator", dateSeparatorTextPos: "dateSeparatorTextPos", openMessageListAt: "openMessageListAt", displayLoadingIndicator: "displayLoadingIndicator" }, host: { properties: { "class": "this.class" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "parentMessageElement", first: true, predicate: ["parentMessageElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n #scrollContainer\n data-testid=\"scroll-container\"\n class=\"str-chat__list\"\n style=\"overscroll-behavior: none\"\n>\n <ng-container *ngIf=\"mode === 'main' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <div class=\"str-chat__reverse-infinite-scroll str-chat__message-list-scroll\">\n <ul\n class=\"str-chat__ul\"\n [class.str-chat__message-options-in-bubble]=\"\n messageOptionsTrigger === 'message-bubble'\n \"\n >\n <li\n #parentMessageElement\n *ngIf=\"mode === 'thread' && parentMessage\"\n data-testid=\"parent-message\"\n class=\"str-chat__parent-message-li\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: parentMessage, index: 'parent' }\n \"\n ></ng-container>\n <div data-testid=\"reply-count\" class=\"str-chat__thread-start\">\n {{parentMessage?.reply_count === 1 ? ('streamChat.1 reply' | translate) : ('streamChat.{{ replyCount }}\n replies' | translate:replyCountParam)}}\n </div>\n </li>\n <ng-container *ngIf=\"mode === 'thread' && isEmpty && emptyListTemplate\">\n <ng-container *ngTemplateOutlet=\"emptyListTemplate\"></ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"top-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'bottom-to-top' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n <ng-container *ngIf=\"messages$ | async as messages\">\n <ng-container\n *ngFor=\"\n let message of messages;\n let i = index;\n let isFirst = first;\n let isLast = last;\n trackBy: trackByMessageId\n \"\n >\n <ng-container *ngIf=\"isFirst\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: message.created_at,\n parsedDate: parseDate(message.created_at),\n isNewMessage: false\n }\n \"\n ></ng-container>\n </ng-container>\n <li\n tabindex=\"0\"\n data-testclass=\"message\"\n class=\"str-chat__li str-chat__li--{{ groupStyles[i] }}\"\n id=\"{{ message.id }}\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplateContainer;\n context: { message: message, index: i }\n \"\n ></ng-container>\n </li>\n <ng-container\n *ngIf=\"\n (lastReadMessageId === message.id &&\n !isLast &&\n direction === 'bottom-to-top' &&\n !isSentByCurrentUser(messages[i + 1]) &&\n (!displayDateSeparator || !isNextMessageOnSeparateDate[i])) ||\n (direction === 'top-to-bottom' &&\n !isLast &&\n !isSentByCurrentUser(message) &&\n lastReadMessageId === messages[i + 1].id)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n customnewMessagesIndicatorTemplate ||\n defaultNewMessagesIndicator\n \"\n ></ng-container>\n </ng-container>\n <ng-container *ngIf=\"isNextMessageOnSeparateDate[i]\">\n <ng-container\n *ngTemplateOutlet=\"\n dateSeparator;\n context: {\n date: messages[i + 1].created_at,\n parsedDate: parseDate(messages[i + 1].created_at),\n isNewMessage:\n (direction === 'bottom-to-top' &&\n message.id === lastReadMessageId &&\n !isSentByCurrentUser(messages[i + 1])) ||\n (direction === 'top-to-bottom' && false)\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n <stream-loading-indicator\n data-testid=\"bottom-loading-indicator\"\n *ngIf=\"\n isLoading && direction === 'top-to-bottom' && displayLoadingIndicator\n \"\n ></stream-loading-indicator>\n </ul>\n <ng-template #defaultTypingIndicator let-usersTyping$=\"usersTyping$\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <ng-container *ngIf=\"$any(usersTyping$ | async) as users\">\n <div\n *ngIf=\"users.length > 0\"\n data-testid=\"typing-indicator\"\n class=\"str-chat__typing-indicator str-chat__typing-indicator--typing\"\n >\n <div class=\"str-chat__typing-indicator__dots\">\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n <span class=\"str-chat__typing-indicator__dot\"></span>\n </div>\n <div\n data-testid=\"typing-users\"\n class=\"str-chat__typing-indicator__users\"\n >\n {{\n users.length === 1\n ? (\"streamChat.user is typing\"\n | translate: { user: getTypingIndicatorText(users) })\n : (\"streamChat.users are typing\"\n | translate: { users: getTypingIndicatorText(users) })\n }}\n </div>\n </div>\n </ng-container>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n typingIndicatorTemplate || defaultTypingIndicator;\n context: getTypingIndicatorContext()\n \"\n ></ng-container>\n </div>\n</div>\n<div class=\"str-chat__jump-to-latest-message\">\n <button\n data-testid=\"scroll-to-latest\"\n *ngIf=\"isUserScrolled\"\n class=\"\n str-chat__message-notification-scroll-to-latest\n str-chat__message-notification-scroll-to-latest-right\n str-chat__circle-fab\n \"\n (keyup.enter)=\"jumpToLatestMessage()\"\n (click)=\"jumpToLatestMessage()\"\n >\n <stream-icon\n class=\"str-chat__jump-to-latest-icon str-chat__circle-fab-icon\"\n [icon]=\"direction === 'bottom-to-top' ? 'arrow-down' : 'arrow-up'\"\n ></stream-icon>\n <div\n *ngIf=\"unreadMessageCount > 0\"\n class=\"\n str-chat__message-notification\n str-chat__message-notification-scroll-to-latest-unread-count\n str-chat__jump-to-latest-unread-count\n \"\n >\n {{ unreadMessageCount }}\n </div>\n </button>\n</div>\n\n<ng-template #messageTemplateContainer let-message=\"message\" let-index=\"index\">\n <ng-template\n #defaultMessageTemplate\n let-messageInput=\"message\"\n let-isLastSentMessage=\"isLastSentMessage\"\n let-enabledMessageActions=\"enabledMessageActions\"\n let-mode=\"mode\"\n let-isHighlighted=\"isHighlighted\"\n let-customActions=\"customActions\"\n >\n <stream-message\n [message]=\"messageInput\"\n [isLastSentMessage]=\"isLastSentMessage\"\n [enabledMessageActions]=\"enabledMessageActions\"\n [mode]=\"mode\"\n [isHighlighted]=\"isHighlighted\"\n [customActions]=\"customActions\"\n ></stream-message>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n messageTemplate || defaultMessageTemplate;\n context: {\n message: message,\n isLastSentMessage: !!(\n lastSentMessageId && message?.id === lastSentMessageId\n ),\n enabledMessageActions: enabledMessageActions,\n mode: mode,\n isHighlighted:\n message?.id === highlightedMessageId &&\n !isJumpingToLatestUnreadMessage,\n customActions: customMessageActions\n }\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #dateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n let-isNewMessage=\"isNewMessage\"\n>\n <ng-container *ngIf=\"displayDateSeparator\">\n <ng-container\n *ngTemplateOutlet=\"\n customDateSeparatorTemplate || defaultDateSeparator;\n context: {\n date: date,\n parsedDate: parsedDate,\n isNewMessage: isNewMessage\n }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template\n #defaultDateSeparator\n let-date=\"date\"\n let-parsedDate=\"parsedDate\"\n let-isNewMessage=\"isNewMessage\"\n >\n <div data-testid=\"date-separator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\">\n {{ parsedDate }}\n <span\n *ngIf=\"isNewMessage\"\n data-testid=\"new-messages-indicator-date-separator\"\n >\u2022 {{ \"streamChat.New\" | translate }}</span\n >\n </div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #defaultNewMessagesIndicator>\n <div data-testid=\"new-messages-indicator\" class=\"str-chat__date-separator\">\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'right' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n <div class=\"str-chat__date-separator-date\" translate>streamChat.New</div>\n <hr\n *ngIf=\"\n dateSeparatorTextPos === 'left' || dateSeparatorTextPos === 'center'\n \"\n class=\"str-chat__date-separator-line\"\n />\n </div>\n</ng-template>\n", components: [{ type: i5.LoadingIndicatorComponent, selector: "stream-loading-indicator", inputs: ["size", "color"] }, { type: i6.IconComponent, selector: "stream-icon", inputs: ["icon", "size"] }, { type: i7.MessageComponent, selector: "stream-message", inputs: ["message", "enabledMessageActions", "isLastSentMessage", "mode", "isHighlighted", "customActions"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], pipes: { "translate": i9.TranslatePipe, "async": i8.AsyncPipe } });
|
|
476
506
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImport: i0, type: MessageListComponent, decorators: [{
|
|
477
507
|
type: Component,
|
|
478
508
|
args: [{
|
|
@@ -480,7 +510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
480
510
|
templateUrl: './message-list.component.html',
|
|
481
511
|
styles: [],
|
|
482
512
|
}]
|
|
483
|
-
}], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.ChatClientService }, { type: i3.CustomTemplatesService }, { type: i4.DateParserService }, { type: i0.NgZone }]; }, propDecorators: { mode: [{
|
|
513
|
+
}], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i2.ChatClientService }, { type: i3.CustomTemplatesService }, { type: i4.DateParserService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { mode: [{
|
|
484
514
|
type: Input
|
|
485
515
|
}], direction: [{
|
|
486
516
|
type: Input
|
|
@@ -498,14 +528,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
498
528
|
type: Input
|
|
499
529
|
}], displayLoadingIndicator: [{
|
|
500
530
|
type: Input
|
|
501
|
-
}], class: [{
|
|
502
|
-
type: HostBinding,
|
|
503
|
-
args: ['class']
|
|
504
531
|
}], scrollContainer: [{
|
|
505
532
|
type: ViewChild,
|
|
506
533
|
args: ['scrollContainer']
|
|
507
534
|
}], parentMessageElement: [{
|
|
508
535
|
type: ViewChild,
|
|
509
536
|
args: ['parentMessageElement']
|
|
537
|
+
}], class: [{
|
|
538
|
+
type: HostBinding,
|
|
539
|
+
args: ['class']
|
|
510
540
|
}] } });
|
|
511
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFPTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVbEQsT0FBTyxFQUFFLGNBQWMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBRzFDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQXNGL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCLEVBQzdCLE1BQWM7UUFKZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUF4RnhCOztXQUVHO1FBQ00sU0FBSSxHQUFzQixNQUFNLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxjQUFTLEdBQXNDLGVBQWUsQ0FBQztRQUN4RTs7V0FFRztRQUNNLDBCQUFxQixHQUM1QixhQUFhLENBQUM7UUFDaEI7Ozs7V0FJRztRQUNNLHVDQUFr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TyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTSxJQUNMLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQzlCLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFDbkU7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztpSEE3bUJVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLHN2QkN6Q2pDLG81U0E4UkE7MkZEclBhLG9CQUFvQjtrQkFMaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixXQUFXLEVBQUUsK0JBQStCO29CQUM1QyxNQUFNLEVBQUUsRUFBRTtpQkFDWDsrTkFPVSxJQUFJO3NCQUFaLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFJRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBT0csa0NBQWtDO3NCQUExQyxLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFJRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBS0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFLRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBT3dCLEtBQUs7c0JBQWxDLFdBQVc7dUJBQUMsT0FBTztnQkFjWixlQUFlO3NCQUR0QixTQUFTO3VCQUFDLGlCQUFpQjtnQkFHcEIsb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgTWVzc2FnZUNvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIFR5cGluZ0luZGljYXRvckNvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBEYXRlU2VwYXJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEdyb3VwU3R5bGVzLCBHcm91cFN0eWxlIH0gZnJvbSAnLi9ncm91cC1zdHlsZXMnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlTGlzdGAgY29tcG9uZW50IHJlbmRlcnMgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgbWVzc2FnZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUxpc3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGxpc3Qgc2hvdWxkIGRpc3BsYXkgY2hhbm5lbCBtZXNzYWdlcyBvciBbdGhyZWFkIG1lc3NhZ2VzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICdtYWluJyB8ICd0aHJlYWQnID0gJ21haW4nO1xuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QsIGBib3R0b20tdG8tdG9wYCBtZWFucyBuZXdlc3QgbWVzc2FnZSBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBtZXNzYWdlIGxpc3QgYW5kIHVzZXJzIHNjcm9sbCB1cHdhcmRzIHRvIGxvYWQgb2xkZXIgbWVzc2FnZXNcbiAgICovXG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogJ2JvdHRvbS10by10b3AnIHwgJ3RvcC10by1ib3R0b20nID0gJ2JvdHRvbS10by10b3AnO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGF0IHRyaWdnZXJzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBtZXNzYWdlIG9wdGlvbnM6IGJ5IGRlZmF1bHQgeW91IGNhbiBob3ZlciAoY2xpY2sgb24gbW9iaWxlKSBhbnl3aGVyZSBpbiB0aGUgcm93IG9mIHRoZSBtZXNzYWdlIChgbWVzc2FnZS1yb3dgIG9wdGlvbiksIG9yIHlvdSBjYW4gc2V0IGBtZXNzYWdlLWJ1YmJsZWAsIGluIHRoYXQgY2FzZSBvbmx5IGEgaG92ZXIgKGNsaWNrIG9uIG1vYmlsZSkgaW4gdGhlIG1lc3NhZ2UgYnViYmxlIHdpbGwgdHJpZ2dlciB0aGUgb3B0aW9ucyB0byBhcHBlYXIuXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlT3B0aW9uc1RyaWdnZXI6ICdtZXNzYWdlLXJvdycgfCAnbWVzc2FnZS1idWJibGUnID1cbiAgICAnbWVzc2FnZS1yb3cnO1xuICAvKipcbiAgICogWW91IGNhbiBoaWRlIHRoZSBcImp1bXAgdG8gbGF0ZXN0XCIgYnV0dG9uIHdoaWxlIHNjcm9sbGluZy4gQSBwb3RlbnRpYWwgdXNlLWNhc2UgZm9yIHRoaXMgaW5wdXQgd291bGQgYmUgdG8gW3dvcmthcm91bmQgYSBrbm93biBpc3N1ZSBvbiBpT1MgU2FmYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci9pc3N1ZXMvNDE4KVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHNjcm9sbCBpc3N1ZSBoYXMgYmVlbiByZXNvbHZlZCwgbm8gbmVlZCB0byB1c2UgdGhpcyAgd29ya2Fyb3VuZCBhbnltb3JlLlxuICAgKi9cbiAgQElucHV0KCkgaGlkZUp1bXBUb0xhdGVzdEJ1dHRvbkR1cmluZ1Njcm9sbCA9IGZhbHNlO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGN1c3RvbSBtZXNzYWdlIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBtZXNzYWdlIGFjdGlvbiBib3hcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbU1lc3NhZ2VBY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbTxhbnk+W10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCBkYXRlIHNlcGFyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlEYXRlU2VwYXJhdG9yID0gdHJ1ZTtcbiAgLyoqXG4gICAqIElmIGRhdGUgc2VwYXJhdG9ycyBhcmUgZGlzcGxheWVkLCB5b3UgY2FuIHNldCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgZGF0ZSB0ZXh0LlxuICAgKiBJZiBgb3Blbk1lc3NhZ2VMaXN0QXRgIGlzIGBsYXN0LXJlYWQtbWVzc2FnZWAgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGV4dCBwb3NpdGlvbiBvZiB0aGUgbmV3IG1lc3NhZ2VzIGluZGljYXRvci5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC1yZWFkLW1lc3NhZ2VgIHdpbGwgb3BlbiB0aGUgbGlzdCBhdCB0aGUgbGFzdCB1bnJlYWQgbWVzc2FnZS4gVGhpcyBvcHRpb24gb25seSB3b3JrcyBpZiBtb2RlIGlzIGBtYWluYC5cbiAgICovXG4gIEBJbnB1dCgpIG9wZW5NZXNzYWdlTGlzdEF0OiAnbGFzdC1tZXNzYWdlJyB8ICdsYXN0LXJlYWQtbWVzc2FnZScgPVxuICAgICdsYXN0LW1lc3NhZ2UnO1xuICAvKipcbiAgICogWW91IGNhbiB0dXJuIG9uIGFuZCBvZmYgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHRoYXQgc2lnbmFscyB0byB1c2VycyB0aGF0IG1vcmUgbWVzc2FnZXMgYXJlIGJlaW5nIGxvYWRlZCB0byB0aGUgbWVzc2FnZSBsaXN0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TG9hZGluZ0luZGljYXRvciA9IHRydWU7XG4gIHR5cGluZ0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUeXBpbmdJbmRpY2F0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RGF0ZVNlcGFyYXRvckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZXMkITogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcml2YXRlIGNsYXNzID1cbiAgICAnc3RyLWNoYXQtYW5ndWxhcl9fbWFpbi1wYW5lbC1pbm5lciBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdCBzdHItY2hhdF9fbWFpbi1wYW5lbC1pbm5lcic7XG4gIHVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZTogYm9vbGVhbltdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBzY3JvbGxFbmRUaW1lb3V0OiBhbnk7XG4gIGxhc3RSZWFkTWVzc2FnZUlkPzogc3RyaW5nO1xuICBpc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJylcbiAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncGFyZW50TWVzc2FnZUVsZW1lbnQnKVxuICBwcml2YXRlIHBhcmVudE1lc3NhZ2VFbGVtZW50ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByaXZhdGUgbGF0ZXN0TWVzc2FnZTogeyBpZDogc3RyaW5nOyBjcmVhdGVkX2F0OiBEYXRlIH0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaGFzTmV3TWVzc2FnZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY29udGFpbmVySGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb2xkZXN0TWVzc2FnZTogeyBpZDogc3RyaW5nOyBjcmVhdGVkX2F0OiBEYXRlIH0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb2xkZXJNYXNzYWdlc0xvYWRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc05ld01lc3NhZ2VTZW50QnlVc2VyOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgbmV3TWVzc2FnZVN1YnNjcmlwdGlvbjogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXZTY3JvbGxUb3A6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luQ2hhbm5lbCQhOiBPYnNlcnZhYmxlPFxuICAgIFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdXG4gID47XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJblRocmVhZCQhOiBPYnNlcnZhYmxlPFxuICAgIFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdXG4gID47XG4gIHByaXZhdGUgaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID0gdHJ1ZTtcbiAgcHJpdmF0ZSBjaGFubmVsSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcGFyc2VkRGF0ZXMgPSBuZXcgTWFwPERhdGUsIHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlUGFyc2VyOiBEYXRlUGFyc2VyU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYCR7Y2hhbm5lbD8uY2lkIHx8ICd1bmRlZmluZWQnfSBzZWxlY3RlZGAsXG4gICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsSWQgIT09IGNoYW5uZWw/LmlkKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgbmV3IGNoYW5uZWwgaXMgZGlmZmVyZW50IGZyb20gcHJldiBjaGFubmVsLCByZXNldGluZyBzY3JvbGwgc3RhdGVgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5wYXJzZWREYXRlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgICB0aGlzLmNoYW5uZWxJZCA9IGNoYW5uZWw/LmlkO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMub3Blbk1lc3NhZ2VMaXN0QXQgPT09ICdsYXN0LXJlYWQtbWVzc2FnZScgJiZcbiAgICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID1cbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IHRydWU7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYXBhYmlsaXRlcyA9IGNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgICAgIGlmIChjYXBhYmlsaXRlcykge1xuICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zID0gY2FwYWJpbGl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbiA9IGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBkaXNwbGF5IG1haW4gY2hhbm5lbCBtZXNzYWdlcyBhbmQgd2UncmUgc3dpdGNoZWQgdG8gYW4gb2xkZXIgbWVzc2FnZSBzZXQgLT4gdXNlIG1lc3NhZ2UubmV3IGV2ZW50IHRvIHVwZGF0ZSB1bnJlYWQgY291bnQgYW5kIGRldGVjdCBuZXcgbWVzc2FnZXMgc2VudCBieSBjdXJyZW50IHVzZXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIWV2ZW50Lm1lc3NhZ2UgfHxcbiAgICAgICAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9PT0gY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcyB8fFxuICAgICAgICAgICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoe1xuICAgICAgICAgICAgICBpZDogZXZlbnQubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgdXNlcjogZXZlbnQubWVzc2FnZS51c2VyLFxuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQgfHwgJycpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlUGFyZW50TWVzc2FnZSQuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlICYmXG4gICAgICAgICAgbWVzc2FnZS5pZCAhPT0gdGhpcy5wYXJlbnRNZXNzYWdlLmlkICYmXG4gICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLm1lc3NhZ2VUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZGF0ZVNlcGFyYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy50eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luVGhyZWFkJDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgdGhpcy5zZXRNZXNzYWdlcyQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuZGlyZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT5cbiAgICAgICAgdGhpcy5zY3JvbGxlZCgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlJFxuICAgICAgICAucGlwZShmaWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcuaWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ21haW4nKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcucGFyZW50SWQgfHwgY29uZmlnLmlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudElkKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgSnVtcGluZyB0byAke21lc3NhZ2VJZCB8fCAnJ31gLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2VJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZCk7XG4gICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgPSBtZXNzYWdlSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQpIHtcbiAgICAgIC8vIFR1cm4gb2ZmIHByb2dyYW1hdGljIHNjcm9sbCBhZGp1c3RtZW50cyB3aGlsZSBqdW1wIHRvIG1lc3NhZ2UgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzICYmXG4gICAgICAgICh0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgfHwgIXRoaXMuaXNVc2VyU2Nyb2xsZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Ub3AoKVxuICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaGFzTmV3TWVzc2FnZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGVkIHx8IHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlcikge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgVXNlciBoYXMgbmV3IG1lc3NhZ2VzLCBhbmQgbm90IHNjcm9sbGVkIG9yIHNlbnQgbmV3IG1lc3NhZ2VzLCB0aGVyZWZvcmUgd2UgJHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPyAnc2Nyb2xsJyA6ICdqdW1wJ1xuICAgICAgICAgICAgfSB0byBsYXRlc3QgbWVzc2FnZWAsXG4gICAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYE9sZGVyIG1lc3NhZ2VzIGFyZSBsb2FkZWQsIHdlIHByZXNlcnZlIHRoZSBzY3JvbGwgcG9zaXRpb25gLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNjcm9sbGJhclBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpICE9PSAnYm90dG9tJyAmJlxuICAgICAgICAhdGhpcy5pc1VzZXJTY3JvbGxlZCAmJlxuICAgICAgICAhdGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBDb250YWluZXIgZ3JldyBhbmQgdXNlciBkaWRuJ3Qgc2Nyb2xsIHRoZXJlZm9yZSB3ZSAke1xuICAgICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPyAnc2Nyb2xsJyA6ICdqdW1wJ1xuICAgICAgICAgIH0gdG8gbGF0ZXN0IG1lc3NhZ2VgLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlNZXNzYWdlSWQoaW5kZXg6IG51bWJlciwgaXRlbTogU3RyZWFtTWVzc2FnZSkge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG5cbiAgdHJhY2tCeVVzZXJJZChpbmRleDogbnVtYmVyLCB1c2VyOiBVc2VyUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gdXNlci5pZDtcbiAgfVxuXG4gIGp1bXBUb0xhdGVzdE1lc3NhZ2UoKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UoXG4gICAgICAnbGF0ZXN0JyxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgPyB0aGlzLnBhcmVudE1lc3NhZ2U/LmlkIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgIHRoaXMuZm9yY2VSZXBhaW50KCk7XG4gIH1cblxuICBzY3JvbGxUb1RvcCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gIH1cblxuICBzY3JvbGxlZCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA9PT1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAnaW5mbycsXG4gICAgICBgU2Nyb2xsZWQgLSBzY3JvbGwgcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259LCBjb250YWluZXIgaGVpZ2h0OiAke3RoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0fWAsXG4gICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgKTtcblxuICAgIGNvbnN0IGlzVXNlclNjcm9sbGVkID1cbiAgICAgICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnXG4gICAgICAgID8gc2Nyb2xsUG9zaXRpb24gIT09ICdib3R0b20nXG4gICAgICAgIDogc2Nyb2xsUG9zaXRpb24gIT09ICd0b3AnKSB8fCAhdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3Q7XG4gICAgaWYgKHRoaXMuaXNVc2VyU2Nyb2xsZWQgIT09IGlzVXNlclNjcm9sbGVkKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmlzVXNlclNjcm9sbGVkID0gaXNVc2VyU2Nyb2xsZWQ7XG4gICAgICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxlZCkge1xuICAgICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50ID0gMDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkTG9hZE1vcmVNZXNzYWdlcyhzY3JvbGxQb3NpdGlvbikpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIGxldCBkaXJlY3Rpb246ICduZXdlcicgfCAnb2xkZXInO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJykge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHNjcm9sbFBvc2l0aW9uID09PSAndG9wJyA/ICduZXdlcicgOiAnb2xkZXInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRpcmVjdGlvbiA9IHNjcm9sbFBvc2l0aW9uID09PSAndG9wJyA/ICdvbGRlcicgOiAnbmV3ZXInO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgdGhpcy5tb2RlID09PSAnbWFpbidcbiAgICAgICAgICAgID8gdGhpcy5jaGFubmVsU2VydmljZS5sb2FkTW9yZU1lc3NhZ2VzKGRpcmVjdGlvbilcbiAgICAgICAgICAgIDogdGhpcy5jaGFubmVsU2VydmljZS5sb2FkTW9yZVRocmVhZFJlcGxpZXMoZGlyZWN0aW9uKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgRGlzcGxheWluZyBsb2FkaW5nIGluZGljYXRvcmAsXG4gICAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnByZXZTY3JvbGxUb3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgfVxuXG4gIGdldFR5cGluZ0luZGljYXRvckNvbnRleHQoKTogVHlwaW5nSW5kaWNhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJzVHlwaW5nJDogdGhpcy51c2Vyc1R5cGluZyQsXG4gICAgfTtcbiAgfVxuXG4gIGdldFR5cGluZ0luZGljYXRvclRleHQodXNlcnM6IFVzZXJSZXNwb25zZVtdKSB7XG4gICAgY29uc3QgdGV4dCA9IGxpc3RVc2Vycyh1c2Vycyk7XG5cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2UudXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZDtcbiAgfVxuXG4gIHBhcnNlRGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMucGFyc2VkRGF0ZXMuaGFzKGRhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZWREYXRlcy5nZXQoZGF0ZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLmRhdGVQYXJzZXIucGFyc2VEYXRlKGRhdGUpO1xuICAgIHRoaXMucGFyc2VkRGF0ZXMuc2V0KGRhdGUsIHBhcnNlZERhdGUpO1xuICAgIHJldHVybiBwYXJzZWREYXRlO1xuICB9XG5cbiAgZ2V0IHJlcGx5Q291bnRQYXJhbSgpIHtcbiAgICByZXR1cm4geyByZXBseUNvdW50OiB0aGlzLnBhcmVudE1lc3NhZ2U/LnJlcGx5X2NvdW50IH07XG4gIH1cblxuICBwcml2YXRlIHByZXNlcnZlU2Nyb2xsYmFyUG9zaXRpb24oKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPVxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCB8fCAwKSArXG4gICAgICAodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0aGlzLmNvbnRhaW5lckhlaWdodCEpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JjZVJlcGFpbnQoKSB7XG4gICAgLy8gU29sdmVzIHRoZSBpc3N1ZSBvZiBlbXB0eSBzY3JlZW4gb24gU2FmYXJpIHdoZW4gc2Nyb2xsaW5nXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBubyBuZWVkIHRvIHN0b3JlIHRoaXMgYW55d2hlcmUsIHRoZSByZWZlcmVuY2UgaXMgZW5vdWdoXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uKCk6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyB7XG4gICAgbGV0IHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScgPSAnbWlkZGxlJztcbiAgICBpZiAoXG4gICAgICBNYXRoLmZsb29yKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSA8PVxuICAgICAgICAodGhpcy5wYXJlbnRNZXNzYWdlRWxlbWVudD8ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMCkgJiZcbiAgICAgICh0aGlzLnByZXZTY3JvbGxUb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLnByZXZTY3JvbGxUb3AgPlxuICAgICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSlcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ3RvcCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCkgK1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHRcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScpIHtcbiAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gIT09ICdtaWRkbGUnICYmICF0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdlcyQoKSB7XG4gICAgdGhpcy5tZXNzYWdlcyQgPSAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBFbXB0eSBtZXNzYWdlcyBhcnJheSwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBSZWNlaXZlZCBvbmUgb3IgbW9yZSBtZXNzYWdlc2AsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY3VycmVudExhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoY3VycmVudExhdGVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBjdXJyZW50T2xkZXN0TWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMub2xkZXN0TWVzc2FnZSB8fFxuICAgICAgICAgICFtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSB0aGlzLm9sZGVzdE1lc3NhZ2UhLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSBjdXJyZW50T2xkZXN0TWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRUaW1lKCkgPlxuICAgICAgICAgIGN1cnJlbnRPbGRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IGN1cnJlbnRPbGRlc3RNZXNzYWdlO1xuICAgICAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKFxuICAgICAgICAobWVzc2FnZXMpID0+XG4gICAgICAgICAgKHRoaXMubGFzdFNlbnRNZXNzYWdlSWQgPSBbLi4ubWVzc2FnZXNdXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICAgICAgbS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZCAmJlxuICAgICAgICAgICAgICAgIG0uc3RhdHVzICE9PSAnc2VuZGluZydcbiAgICAgICAgICAgICk/LmlkKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPVxuICAgICAgICAgICF0aGlzLmxhdGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICBtZXNzYWdlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXS5pZCA9PT0gdGhpcy5sYXRlc3RNZXNzYWdlLmlkO1xuICAgICAgICBpZiAoIXRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0KSB7XG4gICAgICAgICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPT09IHRoaXMubGF0ZXN0TWVzc2FnZT8uaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PlxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnID8gbWVzc2FnZXMgOiBbLi4ubWVzc2FnZXNdLnJldmVyc2UoKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cFN0eWxlcyA9IG1lc3NhZ2VzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICBnZXRHcm91cFN0eWxlcyhtLCBtZXNzYWdlc1tpIC0gMV0sIG1lc3NhZ2VzW2kgKyAxXSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGUgPSBtZXNzYWdlcy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgdGhpcy5jaGVja0lmT25TZXBhcmF0ZURhdGVzKG0sIG1lc3NhZ2VzW2kgKyAxXSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTY3JvbGxTdGF0ZSgpIHtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldCB1c2Vyc1R5cGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZDogc3RyaW5nLCB3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2VJZCk7XG4gICAgaWYgKCFlbGVtZW50ICYmIHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkLCBmYWxzZSkpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJsb2NrOiBtZXNzYWdlSWQgPT09IHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPyAnc3RhcnQnIDogJ2NlbnRlcicsXG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0xhdGVzdE1lc3NhZ2Uod2l0aFJldHJ5ID0gdHJ1ZSkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmxhdGVzdE1lc3NhZ2UhLmlkKSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICA6IHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgICB9IGVsc2UgaWYgKHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoZmFsc2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5ld01lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVzZXI/OiB7IGlkOiBzdHJpbmcgfSB8IG51bGw7XG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdD8uZ2V0VGltZSgpIDwgbWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICkge1xuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICBgUmVjZWl2ZWQgbmV3IG1lc3NhZ2VgLFxuICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICApO1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSB0cnVlO1xuICAgICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID1cbiAgICAgICAgbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZDtcbiAgICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmT25TZXBhcmF0ZURhdGVzKFxuICAgIG1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlLFxuICAgIG5leHRNZXNzYWdlPzogU3RyZWFtTWVzc2FnZVxuICApIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIW5leHRNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RGF0ZSgpICE9PSBuZXh0TWVzc2FnZS5jcmVhdGVkX2F0LmdldERhdGUoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRGdWxsWWVhcigpICE9PVxuICAgICAgICBuZXh0TWVzc2FnZS5jcmVhdGVkX2F0LmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgIG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRNb250aCgpICE9PSBuZXh0TWVzc2FnZS5jcmVhdGVkX2F0LmdldE1vbnRoKClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI3Njcm9sbENvbnRhaW5lclxuICBkYXRhLXRlc3RpZD1cInNjcm9sbC1jb250YWluZXJcIlxuICBjbGFzcz1cInN0ci1jaGF0X19saXN0XCJcbiAgc3R5bGU9XCJvdmVyc2Nyb2xsLWJlaGF2aW9yOiBub25lXCJcbj5cbiAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19yZXZlcnNlLWluZmluaXRlLXNjcm9sbCBzdHItY2hhdF9fbWVzc2FnZS1saXN0LXNjcm9sbFwiPlxuICAgIDx1bFxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdWxcIlxuICAgICAgW2NsYXNzLnN0ci1jaGF0X19tZXNzYWdlLW9wdGlvbnMtaW4tYnViYmxlXT1cIlxuICAgICAgICBtZXNzYWdlT3B0aW9uc1RyaWdnZXIgPT09ICdtZXNzYWdlLWJ1YmJsZSdcbiAgICAgIFwiXG4gICAgPlxuICAgICAgPGxpXG4gICAgICAgICNwYXJlbnRNZXNzYWdlRWxlbWVudFxuICAgICAgICAqbmdJZj1cIm1vZGUgPT09ICd0aHJlYWQnICYmIHBhcmVudE1lc3NhZ2VcIlxuICAgICAgICBkYXRhLXRlc3RpZD1cInBhcmVudC1tZXNzYWdlXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fcGFyZW50LW1lc3NhZ2UtbGlcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgbWVzc2FnZTogcGFyZW50TWVzc2FnZSwgaW5kZXg6ICdwYXJlbnQnIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJyZXBseS1jb3VudFwiIGNsYXNzPVwic3RyLWNoYXRfX3RocmVhZC1zdGFydFwiPlxuICAgICAgICAgIHt7cGFyZW50TWVzc2FnZT8ucmVwbHlfY291bnQgPT09IDEgPyAoJ3N0cmVhbUNoYXQuMSByZXBseScgfCB0cmFuc2xhdGUpIDogKCdzdHJlYW1DaGF0Lnt7IHJlcGx5Q291bnQgfX1cbiAgICAgICAgICByZXBsaWVzJyB8IHRyYW5zbGF0ZTpyZXBseUNvdW50UGFyYW0pfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2xpPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICBkYXRhLXRlc3RpZD1cInRvcC1sb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaXNMb2FkaW5nICYmIGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmIGRpc3BsYXlMb2FkaW5nSW5kaWNhdG9yXG4gICAgICAgIFwiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2Ugb2YgbWVzc2FnZXM7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBmaXJzdDtcbiAgICAgICAgICAgIGxldCBpc0xhc3QgPSBsYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdCksXG4gICAgICAgICAgICAgICAgICBpc05ld01lc3NhZ2U6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19saSBzdHItY2hhdF9fbGktLXt7IGdyb3VwU3R5bGVzW2ldIH19XCJcbiAgICAgICAgICAgIGlkPVwie3sgbWVzc2FnZS5pZCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IG1lc3NhZ2UsIGluZGV4OiBpIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIChsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZS5pZCAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyAmJlxuICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAoIWRpc3BsYXlEYXRlU2VwYXJhdG9yIHx8ICFpc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGVbaV0pKSB8fFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiZcbiAgICAgICAgICAgICAgICAhaXNMYXN0ICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZSkgJiZcbiAgICAgICAgICAgICAgICBsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZXNbaSArIDFdLmlkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGVbaV1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBkYXRlU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIGRhdGU6IG1lc3NhZ2VzW2kgKyAxXS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2VzW2kgKyAxXS5jcmVhdGVkX2F0KSxcbiAgICAgICAgICAgICAgICAgIGlzTmV3TWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZCA9PT0gbGFzdFJlYWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhaXNTZW50QnlDdXJyZW50VXNlcihtZXNzYWdlc1tpICsgMV0pKSB8fFxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiYgZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICBkYXRhLXRlc3RpZD1cImJvdHRvbS1sb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaXNMb2FkaW5nICYmIGRpcmVjdGlvbiA9PT0gJ3RvcC10by1ib3R0b20nICYmIGRpc3BsYXlMb2FkaW5nSW5kaWNhdG9yXG4gICAgICAgIFwiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgPC91bD5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUeXBpbmdJbmRpY2F0b3IgbGV0LXVzZXJzVHlwaW5nJD1cInVzZXJzVHlwaW5nJFwiPlxuICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL25vLWFueSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIkYW55KHVzZXJzVHlwaW5nJCB8IGFzeW5jKSBhcyB1c2Vyc1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ1c2Vycy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInR5cGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3Igc3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3ItLXR5cGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInR5cGluZy11c2Vyc1wiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX191c2Vyc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgdXNlcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgPyAoXCJzdHJlYW1DaGF0LnVzZXIgaXMgdHlwaW5nXCJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHVzZXI6IGdldFR5cGluZ0luZGljYXRvclRleHQodXNlcnMpIH0pXG4gICAgICAgICAgICAgICAgOiAoXCJzdHJlYW1DaGF0LnVzZXJzIGFyZSB0eXBpbmdcIlxuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdXNlcnM6IGdldFR5cGluZ0luZGljYXRvclRleHQodXNlcnMpIH0pXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgdHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgfHwgZGVmYXVsdFR5cGluZ0luZGljYXRvcjtcbiAgICAgICAgY29udGV4dDogZ2V0VHlwaW5nSW5kaWNhdG9yQ29udGV4dCgpXG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJzdHItY2hhdF9fanVtcC10by1sYXRlc3QtbWVzc2FnZVwiPlxuICA8YnV0dG9uXG4gICAgZGF0YS10ZXN0aWQ9XCJzY3JvbGwtdG8tbGF0ZXN0XCJcbiAgICAqbmdJZj1cImlzVXNlclNjcm9sbGVkXCJcbiAgICBjbGFzcz1cIlxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3RcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvbi1zY3JvbGwtdG8tbGF0ZXN0LXJpZ2h0XG4gICAgICBzdHItY2hhdF9fY2lyY2xlLWZhYlxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gICAgKGNsaWNrKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gID5cbiAgICA8c3RyZWFtLWljb25cbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LWljb24gc3RyLWNoYXRfX2NpcmNsZS1mYWItaWNvblwiXG4gICAgICBbaWNvbl09XCJkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/ICdhcnJvdy1kb3duJyA6ICdhcnJvdy11cCdcIlxuICAgID48L3N0cmVhbS1pY29uPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidW5yZWFkTWVzc2FnZUNvdW50ID4gMFwiXG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb25cbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtdW5yZWFkLWNvdW50XG4gICAgICAgIHN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgIFwiXG4gICAgPlxuICAgICAge3sgdW5yZWFkTWVzc2FnZUNvdW50IH19XG4gICAgPC9kaXY+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyIGxldC1tZXNzYWdlPVwibWVzc2FnZVwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgICNkZWZhdWx0TWVzc2FnZVRlbXBsYXRlXG4gICAgbGV0LW1lc3NhZ2VJbnB1dD1cIm1lc3NhZ2VcIlxuICAgIGxldC1pc0xhc3RTZW50TWVzc2FnZT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICBsZXQtZW5hYmxlZE1lc3NhZ2VBY3Rpb25zPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICBsZXQtbW9kZT1cIm1vZGVcIlxuICAgIGxldC1pc0hpZ2hsaWdodGVkPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgbGV0LWN1c3RvbUFjdGlvbnM9XCJjdXN0b21BY3Rpb25zXCJcbiAgPlxuICAgIDxzdHJlYW0tbWVzc2FnZVxuICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZUlucHV0XCJcbiAgICAgIFtpc0xhc3RTZW50TWVzc2FnZV09XCJpc0xhc3RTZW50TWVzc2FnZVwiXG4gICAgICBbZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXT1cImVuYWJsZWRNZXNzYWdlQWN0aW9uc1wiXG4gICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgIFtpc0hpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWRcIlxuICAgICAgW2N1c3RvbUFjdGlvbnNdPVwiY3VzdG9tQWN0aW9uc1wiXG4gICAgPjwvc3RyZWFtLW1lc3NhZ2U+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgbWVzc2FnZVRlbXBsYXRlIHx8IGRlZmF1bHRNZXNzYWdlVGVtcGxhdGU7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIGlzTGFzdFNlbnRNZXNzYWdlOiAhIShcbiAgICAgICAgICBsYXN0U2VudE1lc3NhZ2VJZCAmJiBtZXNzYWdlPy5pZCA9PT0gbGFzdFNlbnRNZXNzYWdlSWRcbiAgICAgICAgKSxcbiAgICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBlbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgIGlzSGlnaGxpZ2h0ZWQ6XG4gICAgICAgICAgbWVzc2FnZT8uaWQgPT09IGhpZ2hsaWdodGVkTWVzc2FnZUlkICYmXG4gICAgICAgICAgIWlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSxcbiAgICAgICAgY3VzdG9tQWN0aW9uczogY3VzdG9tTWVzc2FnZUFjdGlvbnNcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2RhdGVTZXBhcmF0b3JcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgbGV0LXBhcnNlZERhdGU9XCJwYXJzZWREYXRlXCJcbiAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5RGF0ZVNlcGFyYXRvclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0RGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VkRGF0ZSxcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IGlzTmV3TWVzc2FnZVxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHREYXRlU2VwYXJhdG9yXG4gICAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICAgIGxldC1pc05ld01lc3NhZ2U9XCJpc05ld01lc3NhZ2VcIlxuICA+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImRhdGUtc2VwYXJhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICAgIDxoclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIj5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiaXNOZXdNZXNzYWdlXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3ItZGF0ZS1zZXBhcmF0b3JcIlxuICAgICAgICAgID7igKIge3sgXCJzdHJlYW1DaGF0Lk5ld1wiIHwgdHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdsZWZ0JyB8fCBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2NlbnRlcidcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TmV3TWVzc2FnZXNJbmRpY2F0b3I+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJuZXctbWVzc2FnZXMtaW5kaWNhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1kYXRlXCIgdHJhbnNsYXRlPnN0cmVhbUNoYXQuTmV3PC9kaXY+XG4gICAgPGhyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
541
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFJTCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFPTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVbEQsT0FBTyxFQUFFLGNBQWMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBRzFDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQThGL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCLEVBQzdCLE1BQWMsRUFDZCxLQUF3QjtRQUx4QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQWpHbEM7O1dBRUc7UUFDTSxTQUFJLEdBQXNCLE1BQU0sQ0FBQztRQUMxQzs7V0FFRztRQUNNLGNBQVMsR0FBc0MsZUFBZSxDQUFDO1FBQ3hFOztXQUVHO1FBQ00sMEJBQXFCLEdB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LEtBQUs7Z0JBc0JFLGVBQWU7c0JBRHRCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUdwQixvQkFBb0I7c0JBRDNCLFNBQVM7dUJBQUMsc0JBQXNCO2dCQXNCckIsS0FBSztzQkFEaEIsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgTWVzc2FnZUNvbnRleHQsXG4gIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MsXG4gIFN0cmVhbU1lc3NhZ2UsXG4gIFR5cGluZ0luZGljYXRvckNvbnRleHQsXG4gIEN1c3RvbU1lc3NhZ2VBY3Rpb25JdGVtLFxuICBEYXRlU2VwYXJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENsaWVudFNlcnZpY2UgfSBmcm9tICcuLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEdyb3VwU3R5bGVzLCBHcm91cFN0eWxlIH0gZnJvbSAnLi9ncm91cC1zdHlsZXMnO1xuaW1wb3J0IHsgVXNlclJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBsaXN0VXNlcnMgfSBmcm9tICcuLi9saXN0LXVzZXJzJztcbmltcG9ydCB7IERhdGVQYXJzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGF0ZS1wYXJzZXIuc2VydmljZSc7XG5cbi8qKlxuICogVGhlIGBNZXNzYWdlTGlzdGAgY29tcG9uZW50IHJlbmRlcnMgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgbWVzc2FnZXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0cmVhbS1tZXNzYWdlLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUxpc3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0XG57XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBtZXNzYWdlIGxpc3Qgc2hvdWxkIGRpc3BsYXkgY2hhbm5lbCBtZXNzYWdlcyBvciBbdGhyZWFkIG1lc3NhZ2VzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC90aHJlYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU6ICdtYWluJyB8ICd0aHJlYWQnID0gJ21haW4nO1xuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QsIGBib3R0b20tdG8tdG9wYCBtZWFucyBuZXdlc3QgbWVzc2FnZSBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBtZXNzYWdlIGxpc3QgYW5kIHVzZXJzIHNjcm9sbCB1cHdhcmRzIHRvIGxvYWQgb2xkZXIgbWVzc2FnZXNcbiAgICovXG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogJ2JvdHRvbS10by10b3AnIHwgJ3RvcC10by1ib3R0b20nID0gJ2JvdHRvbS10by10b3AnO1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGF0IHRyaWdnZXJzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBtZXNzYWdlIG9wdGlvbnM6IGJ5IGRlZmF1bHQgeW91IGNhbiBob3ZlciAoY2xpY2sgb24gbW9iaWxlKSBhbnl3aGVyZSBpbiB0aGUgcm93IG9mIHRoZSBtZXNzYWdlIChgbWVzc2FnZS1yb3dgIG9wdGlvbiksIG9yIHlvdSBjYW4gc2V0IGBtZXNzYWdlLWJ1YmJsZWAsIGluIHRoYXQgY2FzZSBvbmx5IGEgaG92ZXIgKGNsaWNrIG9uIG1vYmlsZSkgaW4gdGhlIG1lc3NhZ2UgYnViYmxlIHdpbGwgdHJpZ2dlciB0aGUgb3B0aW9ucyB0byBhcHBlYXIuXG4gICAqL1xuICBASW5wdXQoKSBtZXNzYWdlT3B0aW9uc1RyaWdnZXI6ICdtZXNzYWdlLXJvdycgfCAnbWVzc2FnZS1idWJibGUnID1cbiAgICAnbWVzc2FnZS1yb3cnO1xuICAvKipcbiAgICogWW91IGNhbiBoaWRlIHRoZSBcImp1bXAgdG8gbGF0ZXN0XCIgYnV0dG9uIHdoaWxlIHNjcm9sbGluZy4gQSBwb3RlbnRpYWwgdXNlLWNhc2UgZm9yIHRoaXMgaW5wdXQgd291bGQgYmUgdG8gW3dvcmthcm91bmQgYSBrbm93biBpc3N1ZSBvbiBpT1MgU2FmYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9HZXRTdHJlYW0vc3RyZWFtLWNoYXQtYW5ndWxhci9pc3N1ZXMvNDE4KVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIHNjcm9sbCBpc3N1ZSBoYXMgYmVlbiByZXNvbHZlZCwgbm8gbmVlZCB0byB1c2UgdGhpcyAgd29ya2Fyb3VuZCBhbnltb3JlLlxuICAgKi9cbiAgQElucHV0KCkgaGlkZUp1bXBUb0xhdGVzdEJ1dHRvbkR1cmluZ1Njcm9sbCA9IGZhbHNlO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGN1c3RvbSBtZXNzYWdlIGFjdGlvbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBtZXNzYWdlIGFjdGlvbiBib3hcbiAgICovXG4gIEBJbnB1dCgpIGN1c3RvbU1lc3NhZ2VBY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbTxhbnk+W10gPSBbXTtcbiAgLyoqXG4gICAqIElmIGB0cnVlYCBkYXRlIHNlcGFyYXRvcnMgd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlEYXRlU2VwYXJhdG9yID0gdHJ1ZTtcbiAgLyoqXG4gICAqIElmIGRhdGUgc2VwYXJhdG9ycyBhcmUgZGlzcGxheWVkLCB5b3UgY2FuIHNldCB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgZGF0ZSB0ZXh0LlxuICAgKiBJZiBgb3Blbk1lc3NhZ2VMaXN0QXRgIGlzIGBsYXN0LXJlYWQtbWVzc2FnZWAgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGV4dCBwb3NpdGlvbiBvZiB0aGUgbmV3IG1lc3NhZ2VzIGluZGljYXRvci5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC1yZWFkLW1lc3NhZ2VgIHdpbGwgb3BlbiB0aGUgbGlzdCBhdCB0aGUgbGFzdCB1bnJlYWQgbWVzc2FnZS4gVGhpcyBvcHRpb24gb25seSB3b3JrcyBpZiBtb2RlIGlzIGBtYWluYC5cbiAgICovXG4gIEBJbnB1dCgpIG9wZW5NZXNzYWdlTGlzdEF0OiAnbGFzdC1tZXNzYWdlJyB8ICdsYXN0LXJlYWQtbWVzc2FnZScgPVxuICAgICdsYXN0LW1lc3NhZ2UnO1xuICAvKipcbiAgICogWW91IGNhbiB0dXJuIG9uIGFuZCBvZmYgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHRoYXQgc2lnbmFscyB0byB1c2VycyB0aGF0IG1vcmUgbWVzc2FnZXMgYXJlIGJlaW5nIGxvYWRlZCB0byB0aGUgbWVzc2FnZSBsaXN0XG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TG9hZGluZ0luZGljYXRvciA9IHRydWU7XG4gIHR5cGluZ0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUeXBpbmdJbmRpY2F0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RGF0ZVNlcGFyYXRvckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgZW1wdHlNYWluTWVzc2FnZUxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgZW1wdHlUaHJlYWRNZXNzYWdlTGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBtZXNzYWdlcyQhOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2VbXT47XG4gIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgaXNFbXB0eSA9IHRydWU7XG4gIHVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGlzTmV4dE1lc3NhZ2VPblNlcGFyYXRlRGF0ZTogYm9vbGVhbltdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBzY3JvbGxFbmRUaW1lb3V0OiBhbnk7XG4gIGxhc3RSZWFkTWVzc2FnZUlkPzogc3RyaW5nO1xuICBpc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJylcbiAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncGFyZW50TWVzc2FnZUVsZW1lbnQnKVxuICBwcml2YXRlIHBhcmVudE1lc3NhZ2VFbGVtZW50ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByaXZhdGUgbGF0ZXN0TWVzc2FnZTogeyBpZDogc3RyaW5nOyBjcmVhdGVkX2F0OiBEYXRlIH0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaGFzTmV3TWVzc2FnZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY29udGFpbmVySGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb2xkZXN0TWVzc2FnZTogeyBpZDogc3RyaW5nOyBjcmVhdGVkX2F0OiBEYXRlIH0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb2xkZXJNYXNzYWdlc0xvYWRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpc05ld01lc3NhZ2VTZW50QnlVc2VyOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIHByaXZhdGUgbmV3TWVzc2FnZVN1YnNjcmlwdGlvbjogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXZTY3JvbGxUb3A6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luQ2hhbm5lbCQhOiBPYnNlcnZhYmxlPFxuICAgIFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdXG4gID47XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJblRocmVhZCQhOiBPYnNlcnZhYmxlPFxuICAgIFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdXG4gID47XG4gIHByaXZhdGUgaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID0gdHJ1ZTtcbiAgcHJpdmF0ZSBjaGFubmVsSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcGFyc2VkRGF0ZXMgPSBuZXcgTWFwPERhdGUsIHN0cmluZz4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgcHJpdmF0ZSBnZXQgY2xhc3MoKSB7XG4gICAgcmV0dXJuIGBzdHItY2hhdC1hbmd1bGFyX19tYWluLXBhbmVsLWlubmVyIHN0ci1jaGF0LWFuZ3VsYXJfX21lc3NhZ2UtbGlzdC1ob3N0IHN0ci1jaGF0X19tYWluLXBhbmVsLWlubmVyICR7XG4gICAgICB0aGlzLmlzRW1wdHkgPyAnc3RyLWNoYXQtYW5ndWxhcl9fbWVzc2FnZS1saXN0LWhvc3QtLWVtcHR5JyA6ICcnXG4gICAgfWA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIGN1c3RvbVRlbXBsYXRlc1NlcnZpY2U6IEN1c3RvbVRlbXBsYXRlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlUGFyc2VyOiBEYXRlUGFyc2VyU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYCR7Y2hhbm5lbD8uY2lkIHx8ICd1bmRlZmluZWQnfSBzZWxlY3RlZGAsXG4gICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsSWQgIT09IGNoYW5uZWw/LmlkKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgbmV3IGNoYW5uZWwgaXMgZGlmZmVyZW50IGZyb20gcHJldiBjaGFubmVsLCByZXNldGluZyBzY3JvbGwgc3RhdGVgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5wYXJzZWREYXRlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgICB0aGlzLmNoYW5uZWxJZCA9IGNoYW5uZWw/LmlkO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMub3Blbk1lc3NhZ2VMaXN0QXQgPT09ICdsYXN0LXJlYWQtbWVzc2FnZScgJiZcbiAgICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID1cbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsTGFzdFJlYWRNZXNzYWdlSWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IHRydWU7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYXBhYmlsaXRlcyA9IGNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgICAgIGlmIChjYXBhYmlsaXRlcykge1xuICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zID0gY2FwYWJpbGl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbiA9IGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBkaXNwbGF5IG1haW4gY2hhbm5lbCBtZXNzYWdlcyBhbmQgd2UncmUgc3dpdGNoZWQgdG8gYW4gb2xkZXIgbWVzc2FnZSBzZXQgLT4gdXNlIG1lc3NhZ2UubmV3IGV2ZW50IHRvIHVwZGF0ZSB1bnJlYWQgY291bnQgYW5kIGRldGVjdCBuZXcgbWVzc2FnZXMgc2VudCBieSBjdXJyZW50IHVzZXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIWV2ZW50Lm1lc3NhZ2UgfHxcbiAgICAgICAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9PT0gY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcyB8fFxuICAgICAgICAgICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoe1xuICAgICAgICAgICAgICBpZDogZXZlbnQubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgdXNlcjogZXZlbnQubWVzc2FnZS51c2VyLFxuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQgfHwgJycpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlUGFyZW50TWVzc2FnZSQuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlICYmXG4gICAgICAgICAgbWVzc2FnZS5pZCAhPT0gdGhpcy5wYXJlbnRNZXNzYWdlLmlkICYmXG4gICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLm1lc3NhZ2VUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZGF0ZVNlcGFyYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy50eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luVGhyZWFkJDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgdGhpcy5zZXRNZXNzYWdlcyQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuZGlyZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT5cbiAgICAgICAgdGhpcy5zY3JvbGxlZCgpXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlJFxuICAgICAgICAucGlwZShmaWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcuaWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ21haW4nKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcucGFyZW50SWQgfHwgY29uZmlnLmlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudElkKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgSnVtcGluZyB0byAke21lc3NhZ2VJZCB8fCAnJ31gLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2VJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZCk7XG4gICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgPSBtZXNzYWdlSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZW1wdHlNYWluTWVzc2FnZUxpc3RQbGFjZWhvbGRlciQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NoYW5nZWQgPSB0aGlzLmVtcHR5TWFpbk1lc3NhZ2VMaXN0VGVtcGxhdGUgIT09IHRlbXBsYXRlO1xuICAgICAgICAgIHRoaXMuZW1wdHlNYWluTWVzc2FnZUxpc3RUZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IG51bGw7XG4gICAgICAgICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0UGxhY2Vob2xkZXIkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNDaGFuZ2VkID0gdGhpcy5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0VGVtcGxhdGUgIT09IHRlbXBsYXRlO1xuICAgICAgICAgIHRoaXMuZW1wdHlUaHJlYWRNZXNzYWdlTGlzdFRlbXBsYXRlID0gdGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkKSB7XG4gICAgICAvLyBUdXJuIG9mZiBwcm9ncmFtYXRpYyBzY3JvbGwgYWRqdXN0bWVudHMgd2hpbGUganVtcCB0byBtZXNzYWdlIGlzIGluIHByb2dyZXNzXG4gICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyAmJlxuICAgICAgICAodGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyIHx8ICF0aGlzLmlzVXNlclNjcm9sbGVkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgPyB0aGlzLnNjcm9sbFRvVG9wKClcbiAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmhhc05ld01lc3NhZ2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxlZCB8fCB0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIpIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYFVzZXIgaGFzIG5ldyBtZXNzYWdlcywgYW5kIG5vdCBzY3JvbGxlZCBvciBzZW50IG5ldyBtZXNzYWdlcywgdGhlcmVmb3JlIHdlICR7XG4gICAgICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID8gJ3Njcm9sbCcgOiAnanVtcCdcbiAgICAgICAgICAgIH0gdG8gbGF0ZXN0IG1lc3NhZ2VgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBPbGRlciBtZXNzYWdlcyBhcmUgbG9hZGVkLCB3ZSBwcmVzZXJ2ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uYCxcbiAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKSAhPT0gJ2JvdHRvbScgJiZcbiAgICAgICAgIXRoaXMuaXNVc2VyU2Nyb2xsZWQgJiZcbiAgICAgICAgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgQ29udGFpbmVyIGdyZXcgYW5kIHVzZXIgZGlkbid0IHNjcm9sbCB0aGVyZWZvcmUgd2UgJHtcbiAgICAgICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID8gJ3Njcm9sbCcgOiAnanVtcCdcbiAgICAgICAgICB9IHRvIGxhdGVzdCBtZXNzYWdlYCxcbiAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0XG4gICAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxFbmRUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICB0cmFja0J5TWVzc2FnZUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIHRyYWNrQnlVc2VySWQoaW5kZXg6IG51bWJlciwgdXNlcjogVXNlclJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHVzZXIuaWQ7XG4gIH1cblxuICBqdW1wVG9MYXRlc3RNZXNzYWdlKCkge1xuICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKFxuICAgICAgJ2xhdGVzdCcsXG4gICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnID8gdGhpcy5wYXJlbnRNZXNzYWdlPy5pZCA6IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBzY3JvbGxUb0JvdHRvbSgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICB0aGlzLmZvcmNlUmVwYWludCgpO1xuICB9XG5cbiAgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG5cbiAgc2Nyb2xsZWQoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgPT09XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgJ2luZm8nLFxuICAgICAgYFNjcm9sbGVkIC0gc2Nyb2xsIHBvc2l0aW9uOiAke3Njcm9sbFBvc2l0aW9ufSwgY29udGFpbmVyIGhlaWdodDogJHt0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodH1gLFxuICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICk7XG5cbiAgICBjb25zdCBpc1VzZXJTY3JvbGxlZCA9XG4gICAgICAodGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHNjcm9sbFBvc2l0aW9uICE9PSAnYm90dG9tJ1xuICAgICAgICA6IHNjcm9sbFBvc2l0aW9uICE9PSAndG9wJykgfHwgIXRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0O1xuICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGVkICE9PSBpc1VzZXJTY3JvbGxlZCkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IGlzVXNlclNjcm9sbGVkO1xuICAgICAgICBpZiAoIXRoaXMuaXNVc2VyU2Nyb2xsZWQpIHtcbiAgICAgICAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZExvYWRNb3JlTWVzc2FnZXMoc2Nyb2xsUG9zaXRpb24pKSB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICBsZXQgZGlyZWN0aW9uOiAnbmV3ZXInIHwgJ29sZGVyJztcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScpIHtcbiAgICAgICAgICBkaXJlY3Rpb24gPSBzY3JvbGxQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnbmV3ZXInIDogJ29sZGVyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXJlY3Rpb24gPSBzY3JvbGxQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnb2xkZXInIDogJ25ld2VyJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UubG9hZE1vcmVNZXNzYWdlcyhkaXJlY3Rpb24pXG4gICAgICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UubG9hZE1vcmVUaHJlYWRSZXBsaWVzKGRpcmVjdGlvbik7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgICAgYERpc3BsYXlpbmcgbG9hZGluZyBpbmRpY2F0b3JgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KCk6IFR5cGluZ0luZGljYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB1c2Vyc1R5cGluZyQ6IHRoaXMudXNlcnNUeXBpbmckLFxuICAgIH07XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGNvbnN0IHRleHQgPSBsaXN0VXNlcnModXNlcnMpO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlLnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQ7XG4gIH1cblxuICBwYXJzZURhdGUoZGF0ZTogRGF0ZSkge1xuICAgIGlmICh0aGlzLnBhcnNlZERhdGVzLmhhcyhkYXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VkRGF0ZXMuZ2V0KGRhdGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZShkYXRlKTtcbiAgICB0aGlzLnBhcnNlZERhdGVzLnNldChkYXRlLCBwYXJzZWREYXRlKTtcbiAgICByZXR1cm4gcGFyc2VkRGF0ZTtcbiAgfVxuXG4gIGdldCByZXBseUNvdW50UGFyYW0oKSB7XG4gICAgcmV0dXJuIHsgcmVwbHlDb3VudDogdGhpcy5wYXJlbnRNZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICB9XG5cbiAgZ2V0IGVtcHR5TGlzdFRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgPyB0aGlzLmVtcHR5TWFpbk1lc3NhZ2VMaXN0VGVtcGxhdGVcbiAgICAgIDogdGhpcy5lbXB0eVRocmVhZE1lc3NhZ2VMaXN0VGVtcGxhdGU7XG4gIH1cblxuICBwcml2YXRlIHByZXNlcnZlU2Nyb2xsYmFyUG9zaXRpb24oKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPVxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCB8fCAwKSArXG4gICAgICAodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0aGlzLmNvbnRhaW5lckhlaWdodCEpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JjZVJlcGFpbnQoKSB7XG4gICAgLy8gU29sdmVzIHRoZSBpc3N1ZSBvZiBlbXB0eSBzY3JlZW4gb24gU2FmYXJpIHdoZW4gc2Nyb2xsaW5nXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0OyAvLyBubyBuZWVkIHRvIHN0b3JlIHRoaXMgYW55d2hlcmUsIHRoZSByZWZlcmVuY2UgaXMgZW5vdWdoXG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uKCk6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyB7XG4gICAgbGV0IHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScgPSAnbWlkZGxlJztcbiAgICBpZiAoXG4gICAgICBNYXRoLmZsb29yKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSA8PVxuICAgICAgICAodGhpcy5wYXJlbnRNZXNzYWdlRWxlbWVudD8ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMCkgJiZcbiAgICAgICh0aGlzLnByZXZTY3JvbGxUb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLnByZXZTY3JvbGxUb3AgPlxuICAgICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSlcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ3RvcCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCkgK1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHRcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScpIHtcbiAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gIT09ICdtaWRkbGUnICYmICF0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdlcyQoKSB7XG4gICAgdGhpcy5tZXNzYWdlcyQgPSAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBFbXB0eSBtZXNzYWdlcyBhcnJheSwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkpIHtcbiAgICAgICAgICAvLyBjZFJlZi5kZXRlY3RDaGFuZ2VzKCkgaXNuJ3QgZW5vdWdoIGhlcmUsIHRlc3Qgd2lsbCBmYWlsXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5pc0VtcHR5ID0gZmFsc2UpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQ/LmxvZ2dlcj8uKFxuICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICBgUmVjZWl2ZWQgb25lIG9yIG1vcmUgbWVzc2FnZXNgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMYXRlc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKGN1cnJlbnRMYXRlc3RNZXNzYWdlKTtcbiAgICAgICAgY29uc3QgY3VycmVudE9sZGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1swXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLm9sZGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICAhbWVzc2FnZXMuZmluZCgobSkgPT4gbS5pZCA9PT0gdGhpcy5vbGRlc3RNZXNzYWdlIS5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlID0gY3VycmVudE9sZGVzdE1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5vbGRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpID5cbiAgICAgICAgICBjdXJyZW50T2xkZXN0TWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSBjdXJyZW50T2xkZXN0TWVzc2FnZTtcbiAgICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRhcChcbiAgICAgICAgKG1lc3NhZ2VzKSA9PlxuICAgICAgICAgICh0aGlzLmxhc3RTZW50TWVzc2FnZUlkID0gWy4uLm1lc3NhZ2VzXVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgICAgIG0udXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8udXNlcj8uaWQgJiZcbiAgICAgICAgICAgICAgICBtLnN0YXR1cyAhPT0gJ3NlbmRpbmcnXG4gICAgICAgICAgICApPy5pZClcbiAgICAgICksXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0ID1cbiAgICAgICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICAgICAgbWVzc2FnZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0uaWQgPT09IHRoaXMubGF0ZXN0TWVzc2FnZS5pZDtcbiAgICAgICAgaWYgKCF0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCkge1xuICAgICAgICAgIHRoaXMuaXNVc2VyU2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID09PSB0aGlzLmxhdGVzdE1lc3NhZ2U/LmlkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbWFwKChtZXNzYWdlcykgPT5cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/IG1lc3NhZ2VzIDogWy4uLm1lc3NhZ2VzXS5yZXZlcnNlKClcbiAgICAgICksXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuZ3JvdXBTdHlsZXMgPSBtZXNzYWdlcy5tYXAoKG0sIGkpID0+XG4gICAgICAgICAgZ2V0R3JvdXBTdHlsZXMobSwgbWVzc2FnZXNbaSAtIDFdLCBtZXNzYWdlc1tpICsgMV0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNOZXh0TWVzc2FnZU9uU2VwYXJhdGVEYXRlID0gbWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgIHRoaXMuY2hlY2tJZk9uU2VwYXJhdGVEYXRlcyhtLCBtZXNzYWdlc1tpICsgMV0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0U2Nyb2xsU3RhdGUoKSB7XG4gICAgdGhpcy5pc0VtcHR5ID0gdHJ1ZTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldCB1c2Vyc1R5cGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZDogc3RyaW5nLCB3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2VJZCk7XG4gICAgaWYgKCFlbGVtZW50ICYmIHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkLCBmYWxzZSkpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgIGJsb2NrOiBtZXNzYWdlSWQgPT09IHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPyAnc3RhcnQnIDogJ2NlbnRlcicsXG4gICAgICB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0xhdGVzdE1lc3NhZ2Uod2l0aFJldHJ5ID0gdHJ1ZSkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmxhdGVzdE1lc3NhZ2UhLmlkKSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICA6IHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgICB9IGVsc2UgaWYgKHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoZmFsc2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5ld01lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVzZXI/OiB7IGlkOiBzdHJpbmcgfSB8IG51bGw7XG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdD8uZ2V0VGltZSgpIDwgbWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICkge1xuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICBgUmVjZWl2ZWQgbmV3IG1lc3NhZ2VgLFxuICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICApO1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSB0cnVlO1xuICAgICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID1cbiAgICAgICAgbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZDtcbiAgICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmT25TZXBhcmF0ZURhdGVzKFxuICAgIG1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlLFxuICAgIG5leHRNZXNzYWdlPzogU3RyZWFtTWVzc2FnZVxuICApIHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgIW5leHRNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RGF0ZSgpICE9PSBuZXh0TWVzc2FnZS5jcmVhdGVkX2F0LmdldERhdGUoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRGdWxsWWVhcigpICE9PVxuICAgICAgICBuZXh0TWVzc2FnZS5jcmVhdGVkX2F0LmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgIG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRNb250aCgpICE9PSBuZXh0TWVzc2FnZS5jcmVhdGVkX2F0LmdldE1vbnRoKClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI3Njcm9sbENvbnRhaW5lclxuICBkYXRhLXRlc3RpZD1cInNjcm9sbC1jb250YWluZXJcIlxuICBjbGFzcz1cInN0ci1jaGF0X19saXN0XCJcbiAgc3R5bGU9XCJvdmVyc2Nyb2xsLWJlaGF2aW9yOiBub25lXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGUgPT09ICdtYWluJyAmJiBpc0VtcHR5ICYmIGVtcHR5TGlzdFRlbXBsYXRlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImVtcHR5TGlzdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3JldmVyc2UtaW5maW5pdGUtc2Nyb2xsIHN0ci1jaGF0X19tZXNzYWdlLWxpc3Qtc2Nyb2xsXCI+XG4gICAgPHVsXG4gICAgICBjbGFzcz1cInN0ci1jaGF0X191bFwiXG4gICAgICBbY2xhc3Muc3RyLWNoYXRfX21lc3NhZ2Utb3B0aW9ucy1pbi1idWJibGVdPVwiXG4gICAgICAgIG1lc3NhZ2VPcHRpb25zVHJpZ2dlciA9PT0gJ21lc3NhZ2UtYnViYmxlJ1xuICAgICAgXCJcbiAgICA+XG4gICAgICA8bGlcbiAgICAgICAgI3BhcmVudE1lc3NhZ2VFbGVtZW50XG4gICAgICAgICpuZ0lmPVwibW9kZSA9PT0gJ3RocmVhZCcgJiYgcGFyZW50TWVzc2FnZVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwicGFyZW50LW1lc3NhZ2VcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19wYXJlbnQtbWVzc2FnZS1saVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyO1xuICAgICAgICAgICAgY29udGV4dDogeyBtZXNzYWdlOiBwYXJlbnRNZXNzYWdlLCBpbmRleDogJ3BhcmVudCcgfVxuICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cInJlcGx5LWNvdW50XCIgY2xhc3M9XCJzdHItY2hhdF9fdGhyZWFkLXN0YXJ0XCI+XG4gICAgICAgICAge3twYXJlbnRNZXNzYWdlPy5yZXBseV9jb3VudCA9PT0gMSA/ICgnc3RyZWFtQ2hhdC4xIHJlcGx5JyB8IHRyYW5zbGF0ZSkgOiAoJ3N0cmVhbUNoYXQue3sgcmVwbHlDb3VudCB9fVxuICAgICAgICAgIHJlcGxpZXMnIHwgdHJhbnNsYXRlOnJlcGx5Q291bnRQYXJhbSl9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbGk+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSA9PT0gJ3RocmVhZCcgJiYgaXNFbXB0eSAmJiBlbXB0eUxpc3RUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlMaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICBkYXRhLXRlc3RpZD1cInRvcC1sb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaXNMb2FkaW5nICYmIGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmIGRpc3BsYXlMb2FkaW5nSW5kaWNhdG9yXG4gICAgICAgIFwiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2Ugb2YgbWVzc2FnZXM7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBmaXJzdDtcbiAgICAgICAgICAgIGxldCBpc0xhc3QgPSBsYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdCksXG4gICAgICAgICAgICAgICAgICBpc05ld01lc3NhZ2U6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19saSBzdHItY2hhdF9fbGktLXt7IGdyb3VwU3R5bGVzW2ldIH19XCJcbiAgICAgICAgICAgIGlkPVwie3sgbWVzc2FnZS5pZCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IG1lc3NhZ2UsIGluZGV4OiBpIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIChsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZS5pZCAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyAmJlxuICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAoIWRpc3BsYXlEYXRlU2VwYXJhdG9yIHx8ICFpc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGVbaV0pKSB8fFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiZcbiAgICAgICAgICAgICAgICAhaXNMYXN0ICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZSkgJiZcbiAgICAgICAgICAgICAgICBsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZXNbaSArIDFdLmlkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc05leHRNZXNzYWdlT25TZXBhcmF0ZURhdGVbaV1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBkYXRlU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgIGRhdGU6IG1lc3NhZ2VzW2kgKyAxXS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2VzW2kgKyAxXS5jcmVhdGVkX2F0KSxcbiAgICAgICAgICAgICAgICAgIGlzTmV3TWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnICYmXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZCA9PT0gbGFzdFJlYWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhaXNTZW50QnlDdXJyZW50VXNlcihtZXNzYWdlc1tpICsgMV0pKSB8fFxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiYgZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHN0cmVhbS1sb2FkaW5nLWluZGljYXRvclxuICAgICAgICBkYXRhLXRlc3RpZD1cImJvdHRvbS1sb2FkaW5nLWluZGljYXRvclwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaXNMb2FkaW5nICYmIGRpcmVjdGlvbiA9PT0gJ3RvcC10by1ib3R0b20nICYmIGRpc3BsYXlMb2FkaW5nSW5kaWNhdG9yXG4gICAgICAgIFwiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgPC91bD5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUeXBpbmdJbmRpY2F0b3IgbGV0LXVzZXJzVHlwaW5nJD1cInVzZXJzVHlwaW5nJFwiPlxuICAgICAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L3RlbXBsYXRlL25vLWFueSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIkYW55KHVzZXJzVHlwaW5nJCB8IGFzeW5jKSBhcyB1c2Vyc1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ1c2Vycy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cInR5cGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3Igc3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3ItLXR5cGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdHNcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RyLWNoYXRfX3R5cGluZy1pbmRpY2F0b3JfX2RvdFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cInR5cGluZy11c2Vyc1wiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX191c2Vyc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgdXNlcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgPyAoXCJzdHJlYW1DaGF0LnVzZXIgaXMgdHlwaW5nXCJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHVzZXI6IGdldFR5cGluZ0luZGljYXRvclRleHQodXNlcnMpIH0pXG4gICAgICAgICAgICAgICAgOiAoXCJzdHJlYW1DaGF0LnVzZXJzIGFyZSB0eXBpbmdcIlxuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdXNlcnM6IGdldFR5cGluZ0luZGljYXRvclRleHQodXNlcnMpIH0pXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgdHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgfHwgZGVmYXVsdFR5cGluZ0luZGljYXRvcjtcbiAgICAgICAgY29udGV4dDogZ2V0VHlwaW5nSW5kaWNhdG9yQ29udGV4dCgpXG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJzdHItY2hhdF9fanVtcC10by1sYXRlc3QtbWVzc2FnZVwiPlxuICA8YnV0dG9uXG4gICAgZGF0YS10ZXN0aWQ9XCJzY3JvbGwtdG8tbGF0ZXN0XCJcbiAgICAqbmdJZj1cImlzVXNlclNjcm9sbGVkXCJcbiAgICBjbGFzcz1cIlxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3RcbiAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvbi1zY3JvbGwtdG8tbGF0ZXN0LXJpZ2h0XG4gICAgICBzdHItY2hhdF9fY2lyY2xlLWZhYlxuICAgIFwiXG4gICAgKGtleXVwLmVudGVyKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gICAgKGNsaWNrKT1cImp1bXBUb0xhdGVzdE1lc3NhZ2UoKVwiXG4gID5cbiAgICA8c3RyZWFtLWljb25cbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LWljb24gc3RyLWNoYXRfX2NpcmNsZS1mYWItaWNvblwiXG4gICAgICBbaWNvbl09XCJkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyA/ICdhcnJvdy1kb3duJyA6ICdhcnJvdy11cCdcIlxuICAgID48L3N0cmVhbS1pY29uPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidW5yZWFkTWVzc2FnZUNvdW50ID4gMFwiXG4gICAgICBjbGFzcz1cIlxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb25cbiAgICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtdW5yZWFkLWNvdW50XG4gICAgICAgIHN0ci1jaGF0X19qdW1wLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgIFwiXG4gICAgPlxuICAgICAge3sgdW5yZWFkTWVzc2FnZUNvdW50IH19XG4gICAgPC9kaXY+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbWVzc2FnZVRlbXBsYXRlQ29udGFpbmVyIGxldC1tZXNzYWdlPVwibWVzc2FnZVwiIGxldC1pbmRleD1cImluZGV4XCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgICNkZWZhdWx0TWVzc2FnZVRlbXBsYXRlXG4gICAgbGV0LW1lc3NhZ2VJbnB1dD1cIm1lc3NhZ2VcIlxuICAgIGxldC1pc0xhc3RTZW50TWVzc2FnZT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICBsZXQtZW5hYmxlZE1lc3NhZ2VBY3Rpb25zPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICBsZXQtbW9kZT1cIm1vZGVcIlxuICAgIGxldC1pc0hpZ2hsaWdodGVkPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgbGV0LWN1c3RvbUFjdGlvbnM9XCJjdXN0b21BY3Rpb25zXCJcbiAgPlxuICAgIDxzdHJlYW0tbWVzc2FnZVxuICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZUlucHV0XCJcbiAgICAgIFtpc0xhc3RTZW50TWVzc2FnZV09XCJpc0xhc3RTZW50TWVzc2FnZVwiXG4gICAgICBbZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXT1cImVuYWJsZWRNZXNzYWdlQWN0aW9uc1wiXG4gICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgIFtpc0hpZ2hsaWdodGVkXT1cImlzSGlnaGxpZ2h0ZWRcIlxuICAgICAgW2N1c3RvbUFjdGlvbnNdPVwiY3VzdG9tQWN0aW9uc1wiXG4gICAgPjwvc3RyZWFtLW1lc3NhZ2U+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgbWVzc2FnZVRlbXBsYXRlIHx8IGRlZmF1bHRNZXNzYWdlVGVtcGxhdGU7XG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgIGlzTGFzdFNlbnRNZXNzYWdlOiAhIShcbiAgICAgICAgICBsYXN0U2VudE1lc3NhZ2VJZCAmJiBtZXNzYWdlPy5pZCA9PT0gbGFzdFNlbnRNZXNzYWdlSWRcbiAgICAgICAgKSxcbiAgICAgICAgZW5hYmxlZE1lc3NhZ2VBY3Rpb25zOiBlbmFibGVkTWVzc2FnZUFjdGlvbnMsXG4gICAgICAgIG1vZGU6IG1vZGUsXG4gICAgICAgIGlzSGlnaGxpZ2h0ZWQ6XG4gICAgICAgICAgbWVzc2FnZT8uaWQgPT09IGhpZ2hsaWdodGVkTWVzc2FnZUlkICYmXG4gICAgICAgICAgIWlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSxcbiAgICAgICAgY3VzdG9tQWN0aW9uczogY3VzdG9tTWVzc2FnZUFjdGlvbnNcbiAgICAgIH1cbiAgICBcIlxuICA+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2RhdGVTZXBhcmF0b3JcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgbGV0LXBhcnNlZERhdGU9XCJwYXJzZWREYXRlXCJcbiAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5RGF0ZVNlcGFyYXRvclwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSB8fCBkZWZhdWx0RGF0ZVNlcGFyYXRvcjtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGRhdGU6IGRhdGUsXG4gICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VkRGF0ZSxcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IGlzTmV3TWVzc2FnZVxuICAgICAgICB9XG4gICAgICBcIlxuICAgID48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHREYXRlU2VwYXJhdG9yXG4gICAgbGV0LWRhdGU9XCJkYXRlXCJcbiAgICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICAgIGxldC1pc05ld01lc3NhZ2U9XCJpc05ld01lc3NhZ2VcIlxuICA+XG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cImRhdGUtc2VwYXJhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICAgIDxoclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIj5cbiAgICAgICAge3sgcGFyc2VkRGF0ZSB9fVxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiaXNOZXdNZXNzYWdlXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3ItZGF0ZS1zZXBhcmF0b3JcIlxuICAgICAgICAgID7igKIge3sgXCJzdHJlYW1DaGF0Lk5ld1wiIHwgdHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdsZWZ0JyB8fCBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2NlbnRlcidcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TmV3TWVzc2FnZXNJbmRpY2F0b3I+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJuZXctbWVzc2FnZXMtaW5kaWNhdG9yXCIgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3JcIj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAncmlnaHQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1kYXRlXCIgdHJhbnNsYXRlPnN0cmVhbUNoYXQuTmV3PC9kaXY+XG4gICAgPGhyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgXCJcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|