stream-chat-angular 4.33.0 → 4.34.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 +28 -7
- package/bundles/stream-chat-angular.umd.js.map +1 -1
- package/esm2015/assets/version.js +2 -2
- package/esm2015/lib/channel.service.js +4 -1
- package/esm2015/lib/message-list/message-list.component.js +25 -7
- package/fesm2015/stream-chat-angular.js +28 -7
- package/fesm2015/stream-chat-angular.js.map +1 -1
- package/package.json +1 -1
- package/src/assets/version.ts +1 -1
|
@@ -64,14 +64,16 @@ export class MessageListComponent {
|
|
|
64
64
|
this.subscriptions = [];
|
|
65
65
|
this.isLatestMessageInList = true;
|
|
66
66
|
this.subscriptions.push(this.channelService.activeChannel$.subscribe((channel) => {
|
|
67
|
-
var _a, _b, _c, _d;
|
|
67
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
68
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `${(channel === null || channel === void 0 ? void 0 : channel.cid) || 'undefined'} selected`, { tags: `message list ${this.mode}` });
|
|
68
69
|
if (this.channelId !== (channel === null || channel === void 0 ? void 0 : channel.id)) {
|
|
70
|
+
(_e = (_d = (_c = this.chatClientService) === null || _c === void 0 ? void 0 : _c.chatClient) === null || _d === void 0 ? void 0 : _d.logger) === null || _e === void 0 ? void 0 : _e.call(_d, 'info', `new channel is different from prev channel, reseting scroll state`, { tags: `message list ${this.mode}` });
|
|
69
71
|
this.resetScrollState();
|
|
70
72
|
this.channelId = channel === null || channel === void 0 ? void 0 : channel.id;
|
|
71
73
|
if (this.openMessageListAt === 'last-unread-message' &&
|
|
72
74
|
this.mode === 'main') {
|
|
73
75
|
this.lastReadMessageId =
|
|
74
|
-
(
|
|
76
|
+
(_g = channel === null || channel === void 0 ? void 0 : channel.state.read[((_f = this.chatClientService.chatClient.user) === null || _f === void 0 ? void 0 : _f.id) || '']) === null || _g === void 0 ? void 0 : _g.last_read_message_id;
|
|
75
77
|
if (this.lastReadMessageId) {
|
|
76
78
|
this.isJumpingToLatestUnreadMessage = true;
|
|
77
79
|
void this.channelService.jumpToMessage(this.lastReadMessageId);
|
|
@@ -81,11 +83,11 @@ export class MessageListComponent {
|
|
|
81
83
|
this.lastReadMessageId = undefined;
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
|
-
const capabilites = (
|
|
86
|
+
const capabilites = (_h = channel === null || channel === void 0 ? void 0 : channel.data) === null || _h === void 0 ? void 0 : _h.own_capabilities;
|
|
85
87
|
if (capabilites) {
|
|
86
88
|
this.enabledMessageActions = capabilites;
|
|
87
89
|
}
|
|
88
|
-
(
|
|
90
|
+
(_j = this.newMessageSubscription) === null || _j === void 0 ? void 0 : _j.unsubscribe();
|
|
89
91
|
if (channel) {
|
|
90
92
|
this.newMessageSubscription = channel.on('message.new', (event) => {
|
|
91
93
|
// If we display main channel messages and we're switched to an older message set -> use message.new event to update unread count and detect new messages sent by current user
|
|
@@ -136,6 +138,7 @@ export class MessageListComponent {
|
|
|
136
138
|
this.subscriptions.push(this.channelService.jumpToMessage$
|
|
137
139
|
.pipe(filter((config) => !!config.id))
|
|
138
140
|
.subscribe((config) => {
|
|
141
|
+
var _a, _b;
|
|
139
142
|
let messageId = undefined;
|
|
140
143
|
if (this.mode === 'main') {
|
|
141
144
|
messageId = config.parentId || config.id;
|
|
@@ -143,6 +146,7 @@ export class MessageListComponent {
|
|
|
143
146
|
else if (config.parentId) {
|
|
144
147
|
messageId = config.id;
|
|
145
148
|
}
|
|
149
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Jumping to ${messageId || ''}`, { tags: `message list ${this.mode}` });
|
|
146
150
|
if (messageId) {
|
|
147
151
|
if (messageId === 'latest') {
|
|
148
152
|
this.scrollToLatestMessage();
|
|
@@ -155,6 +159,7 @@ export class MessageListComponent {
|
|
|
155
159
|
}));
|
|
156
160
|
}
|
|
157
161
|
ngAfterViewChecked() {
|
|
162
|
+
var _a, _b, _c, _d, _e, _f;
|
|
158
163
|
if (this.highlightedMessageId) {
|
|
159
164
|
// Turn off programatic scroll adjustments while jump to message is in progress
|
|
160
165
|
this.hasNewMessages = false;
|
|
@@ -173,6 +178,7 @@ export class MessageListComponent {
|
|
|
173
178
|
else {
|
|
174
179
|
if (this.hasNewMessages) {
|
|
175
180
|
if (!this.isUserScrolled || this.isNewMessageSentByUser) {
|
|
181
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `User has new messages, and not scrolled or sent new messages, therefore we ${this.isLatestMessageInList ? 'scroll' : 'jump'} to latest message`, { tags: `message list ${this.mode}` });
|
|
176
182
|
this.isLatestMessageInList
|
|
177
183
|
? this.scrollToBottom()
|
|
178
184
|
: this.jumpToLatestMessage();
|
|
@@ -181,6 +187,7 @@ export class MessageListComponent {
|
|
|
181
187
|
this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;
|
|
182
188
|
}
|
|
183
189
|
else if (this.olderMassagesLoaded) {
|
|
190
|
+
(_d = (_c = this.chatClientService.chatClient) === null || _c === void 0 ? void 0 : _c.logger) === null || _d === void 0 ? void 0 : _d.call(_c, 'info', `Older messages are loaded, we preserve the scroll position`, { tags: `message list ${this.mode}` });
|
|
184
191
|
this.preserveScrollbarPosition();
|
|
185
192
|
this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;
|
|
186
193
|
this.olderMassagesLoaded = false;
|
|
@@ -188,6 +195,7 @@ export class MessageListComponent {
|
|
|
188
195
|
else if (this.getScrollPosition() !== 'bottom' &&
|
|
189
196
|
!this.isUserScrolled &&
|
|
190
197
|
!this.highlightedMessageId) {
|
|
198
|
+
(_f = (_e = this.chatClientService.chatClient) === null || _e === void 0 ? void 0 : _e.logger) === null || _f === void 0 ? void 0 : _f.call(_e, 'info', `Container grew and user didn't scroll therefore we ${this.isLatestMessageInList ? 'scroll' : 'jump'} to latest message`, { tags: `message list ${this.mode}` });
|
|
191
199
|
this.isLatestMessageInList
|
|
192
200
|
? this.scrollToBottom()
|
|
193
201
|
: this.jumpToLatestMessage();
|
|
@@ -221,6 +229,7 @@ export class MessageListComponent {
|
|
|
221
229
|
this.scrollContainer.nativeElement.scrollTop = 0;
|
|
222
230
|
}
|
|
223
231
|
scrolled() {
|
|
232
|
+
var _a, _b;
|
|
224
233
|
this.isScrollInProgress = true;
|
|
225
234
|
if (this.scrollEndTimeout) {
|
|
226
235
|
clearTimeout(this.scrollEndTimeout);
|
|
@@ -233,6 +242,7 @@ export class MessageListComponent {
|
|
|
233
242
|
return;
|
|
234
243
|
}
|
|
235
244
|
const scrollPosition = this.getScrollPosition();
|
|
245
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Scrolled - scroll position: ${scrollPosition}`, { tags: `message list ${this.mode}` });
|
|
236
246
|
this.isUserScrolled =
|
|
237
247
|
(this.direction === 'bottom-to-top'
|
|
238
248
|
? scrollPosition !== 'bottom'
|
|
@@ -322,11 +332,18 @@ export class MessageListComponent {
|
|
|
322
332
|
this.messages$ = (this.mode === 'main'
|
|
323
333
|
? this.channelService.activeChannelMessages$
|
|
324
334
|
: this.channelService.activeThreadMessages$).pipe(tap((messages) => {
|
|
335
|
+
var _a, _b, _c, _d;
|
|
325
336
|
this.isLoading = false;
|
|
326
337
|
if (messages.length === 0) {
|
|
338
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Empty messages array, reseting scroll state`, {
|
|
339
|
+
tags: `message list ${this.mode}`,
|
|
340
|
+
});
|
|
327
341
|
this.resetScrollState();
|
|
328
342
|
return;
|
|
329
343
|
}
|
|
344
|
+
(_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`, {
|
|
345
|
+
tags: `message list ${this.mode}`,
|
|
346
|
+
});
|
|
330
347
|
const currentLatestMessage = messages[messages.length - 1];
|
|
331
348
|
this.newMessageReceived(currentLatestMessage);
|
|
332
349
|
const currentOldestMessage = messages[0];
|
|
@@ -410,13 +427,14 @@ export class MessageListComponent {
|
|
|
410
427
|
}
|
|
411
428
|
}
|
|
412
429
|
newMessageReceived(message) {
|
|
413
|
-
var _a, _b, _c, _d;
|
|
430
|
+
var _a, _b, _c, _d, _e, _f;
|
|
414
431
|
if (!this.latestMessage ||
|
|
415
432
|
((_a = this.latestMessage.created_at) === null || _a === void 0 ? void 0 : _a.getTime()) < message.created_at.getTime()) {
|
|
433
|
+
(_c = (_b = this.chatClientService.chatClient) === null || _b === void 0 ? void 0 : _b.logger) === null || _c === void 0 ? void 0 : _c.call(_b, 'info', `Received new message`, { tags: `message list ${this.mode}` });
|
|
416
434
|
this.latestMessage = message;
|
|
417
435
|
this.hasNewMessages = true;
|
|
418
436
|
this.isNewMessageSentByUser =
|
|
419
|
-
((
|
|
437
|
+
((_d = message.user) === null || _d === void 0 ? void 0 : _d.id) === ((_f = (_e = this.chatClientService.chatClient) === null || _e === void 0 ? void 0 : _e.user) === null || _f === void 0 ? void 0 : _f.id);
|
|
420
438
|
if (this.isUserScrolled) {
|
|
421
439
|
this.unreadMessageCount++;
|
|
422
440
|
}
|
|
@@ -458,4 +476,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
|
|
|
458
476
|
type: ViewChild,
|
|
459
477
|
args: ['parentMessageElement']
|
|
460
478
|
}] } });
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFNTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVbEQsT0FBTyxFQUFFLGNBQWMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBRzFDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQStFL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCO1FBSDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFoRnZDOztXQUVHO1FBQ00sU0FBSSxHQUFzQixNQUFNLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxjQUFTLEdBQXNDLGVBQWUsQ0FBQztRQUN4RTs7V0FFRztRQUNNLDBCQUFxQixHQUM1QixhQUFhLENBQUM7UUFFaEI7O1dBRUc7UUFDTSx1Q0FBa0MsR0FBRyxLQUFLLENBQUM7UUFDcEQ7O1dBRUc7UUFDTSx5QkFB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QUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztZQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsc0JBQXNCO2dCQUN6QixDQUFBLE1BQUEsT0FBTyxDQUFDLElBQUksMENBQUUsRUFBRSxPQUFLLE1BQUEsTUFBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSwwQ0FBRSxJQUFJLDBDQUFFLEVBQUUsQ0FBQSxDQUFDO1lBQ25FLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDM0I7U0FDRjtJQUNILENBQUM7O2lIQXpnQlUsb0JBQW9CO3FHQUFwQixvQkFBb0Isa3NCQ3hDakMsMDZTQThSQTsyRkR0UGEsb0JBQW9CO2tCQUxoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFdBQVcsRUFBRSwrQkFBK0I7b0JBQzVDLE1BQU0sRUFBRSxFQUFFO2lCQUNYOzBNQU9VLElBQUk7c0JBQVosS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFNRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBSUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFLRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBSUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQU93QixLQUFLO3NCQUFsQyxXQUFXO3VCQUFDLE9BQU87Z0JBY1osZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBR3BCLG9CQUFvQjtzQkFEM0IsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBNZXNzYWdlQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgU3RyZWFtTWVzc2FnZSxcbiAgVHlwaW5nSW5kaWNhdG9yQ29udGV4dCxcbiAgQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIERhdGVTZXBhcmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0R3JvdXBTdHlsZXMsIEdyb3VwU3R5bGUgfSBmcm9tICcuL2dyb3VwLXN0eWxlcyc7XG5pbXBvcnQgeyBVc2VyUmVzcG9uc2UgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGxpc3RVc2VycyB9IGZyb20gJy4uL2xpc3QtdXNlcnMnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgYE1lc3NhZ2VMaXN0YCBjb21wb25lbnQgcmVuZGVycyBhIHNjcm9sbGFibGUgbGlzdCBvZiBtZXNzYWdlcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1lc3NhZ2UtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlTGlzdENvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbntcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgbGlzdCBzaG91bGQgZGlzcGxheSBjaGFubmVsIG1lc3NhZ2VzIG9yIFt0aHJlYWQgbWVzc2FnZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3RocmVhZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZTogJ21haW4nIHwgJ3RocmVhZCcgPSAnbWFpbic7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgbGlzdCwgYGJvdHRvbS10by10b3BgIG1lYW5zIG5ld2VzdCBtZXNzYWdlIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIG1lc3NhZ2UgbGlzdCBhbmQgdXNlcnMgc2Nyb2xsIHVwd2FyZHMgdG8gbG9hZCBvbGRlciBtZXNzYWdlc1xuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0aW9uOiAnYm90dG9tLXRvLXRvcCcgfCAndG9wLXRvLWJvdHRvbScgPSAnYm90dG9tLXRvLXRvcCc7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoYXQgdHJpZ2dlcnMgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIG1lc3NhZ2Ugb3B0aW9uczogYnkgZGVmYXVsdCB5b3UgY2FuIGhvdmVyIChjbGljayBvbiBtb2JpbGUpIGFueXdoZXJlIGluIHRoZSByb3cgb2YgdGhlIG1lc3NhZ2UgKGBtZXNzYWdlLXJvd2Agb3B0aW9uKSwgb3IgeW91IGNhbiBzZXQgYG1lc3NhZ2UtYnViYmxlYCwgaW4gdGhhdCBjYXNlIG9ubHkgYSBob3ZlciAoY2xpY2sgb24gbW9iaWxlKSBpbiB0aGUgbWVzc2FnZSBidWJibGUgd2lsbCB0cmlnZ2VyIHRoZSBvcHRpb25zIHRvIGFwcGVhci5cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VPcHRpb25zVHJpZ2dlcjogJ21lc3NhZ2Utcm93JyB8ICdtZXNzYWdlLWJ1YmJsZScgPVxuICAgICdtZXNzYWdlLXJvdyc7XG4gIHR5cGluZ0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUeXBpbmdJbmRpY2F0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFlvdSBjYW4gaGlkZSB0aGUgXCJqdW1wIHRvIGxhdGVzdFwiIGJ1dHRvbiB3aGlsZSBzY3JvbGxpbmcuIEEgcG90ZW50aWFsIHVzZS1jYXNlIGZvciB0aGlzIGlucHV0IHdvdWxkIGJlIHRvIFt3b3JrYXJvdW5kIGEga25vd24gaXNzdWUgb24gaU9TIFNhZmFyXShodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvaXNzdWVzLzQxOClcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVKdW1wVG9MYXRlc3RCdXR0b25EdXJpbmdTY3JvbGwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjdXN0b20gbWVzc2FnZSBhY3Rpb25zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWVzc2FnZSBhY3Rpb24gYm94XG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21NZXNzYWdlQWN0aW9uczogQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW08YW55PltdID0gW107XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAgZGF0ZSBzZXBhcmF0b3JzIHdpbGwgYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5RGF0ZVNlcGFyYXRvciA9IHRydWU7XG4gIC8qKlxuICAgKiBJZiBkYXRlIHNlcGFyYXRvcnMgYXJlIGRpc3BsYXllZCwgeW91IGNhbiBzZXQgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGRhdGUgdGV4dC5cbiAgICogSWYgYG9wZW5NZXNzYWdlTGlzdEF0YCBpcyBgbGFzdC11bnJlYWQtbWVzc2FnZWAgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGV4dCBwb3NpdGlvbiBvZiB0aGUgbmV3IG1lc3NhZ2VzIGluZGljYXRvci5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC11bnJlYWQtbWVzc2FnZWAgd2lsbCBvcGVuIHRoZSBsaXN0IGF0IHRoZSBsYXN0IHVucmVhZCBtZXNzYWdlLiBUaGlzIG9wdGlvbiBvbmx5IHdvcmtzIGlmIG1vZGUgaXMgYG1haW5gLlxuICAgKi9cbiAgQElucHV0KCkgb3Blbk1lc3NhZ2VMaXN0QXQ6ICdsYXN0LW1lc3NhZ2UnIHwgJ2xhc3QtdW5yZWFkLW1lc3NhZ2UnID1cbiAgICAnbGFzdC1tZXNzYWdlJztcbiAgbWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RGF0ZVNlcGFyYXRvckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZXMkITogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcml2YXRlIGNsYXNzID1cbiAgICAnc3RyLWNoYXQtYW5ndWxhcl9fbWFpbi1wYW5lbC1pbm5lciBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdCBzdHItY2hhdF9fbWFpbi1wYW5lbC1pbm5lcic7XG4gIHVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBpc1Njcm9sbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgc2Nyb2xsRW5kVGltZW91dDogYW55O1xuICBsYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhcmVudE1lc3NhZ2VFbGVtZW50JylcbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc05ld01lc3NhZ2VzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVyTWFzc2FnZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNOZXdNZXNzYWdlU2VudEJ5VXNlcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIG5ld01lc3NhZ2VTdWJzY3JpcHRpb246IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2U2Nyb2xsVG9wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWwkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWQkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIGlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIHByaXZhdGUgY2hhbm5lbElkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQYXJzZXI6IERhdGVQYXJzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2hhbm5lbElkICE9PSBjaGFubmVsPy5pZCkge1xuICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGxTdGF0ZSgpO1xuICAgICAgICAgIHRoaXMuY2hhbm5lbElkID0gY2hhbm5lbD8uaWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5vcGVuTWVzc2FnZUxpc3RBdCA9PT0gJ2xhc3QtdW5yZWFkLW1lc3NhZ2UnICYmXG4gICAgICAgICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9XG4gICAgICAgICAgICAgIGNoYW5uZWw/LnN0YXRlLnJlYWRbXG4gICAgICAgICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXI/LmlkIHx8ICcnXG4gICAgICAgICAgICAgIF0/Lmxhc3RfcmVhZF9tZXNzYWdlX2lkO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5pc0p1bXBpbmdUb0xhdGVzdFVucmVhZE1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSh0aGlzLmxhc3RSZWFkTWVzc2FnZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsPy5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIGFzIHN0cmluZ1tdO1xuICAgICAgICBpZiAoY2FwYWJpbGl0ZXMpIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZWRNZXNzYWdlQWN0aW9ucyA9IGNhcGFiaWxpdGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGNoYW5uZWwpIHtcbiAgICAgICAgICB0aGlzLm5ld01lc3NhZ2VTdWJzY3JpcHRpb24gPSBjaGFubmVsLm9uKCdtZXNzYWdlLm5ldycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gSWYgd2UgZGlzcGxheSBtYWluIGNoYW5uZWwgbWVzc2FnZXMgYW5kIHdlJ3JlIHN3aXRjaGVkIHRvIGFuIG9sZGVyIG1lc3NhZ2Ugc2V0IC0+IHVzZSBtZXNzYWdlLm5ldyBldmVudCB0byB1cGRhdGUgdW5yZWFkIGNvdW50IGFuZCBkZXRlY3QgbmV3IG1lc3NhZ2VzIHNlbnQgYnkgY3VycmVudCB1c2VyXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFldmVudC5tZXNzYWdlIHx8XG4gICAgICAgICAgICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMgPT09IGNoYW5uZWwuc3RhdGUubGF0ZXN0TWVzc2FnZXMgfHxcbiAgICAgICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVJlY2VpdmVkKHtcbiAgICAgICAgICAgICAgaWQ6IGV2ZW50Lm1lc3NhZ2UuaWQsXG4gICAgICAgICAgICAgIHVzZXI6IGV2ZW50Lm1lc3NhZ2UudXNlcixcbiAgICAgICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoZXZlbnQubWVzc2FnZS5jcmVhdGVkX2F0IHx8ICcnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWxTZXJ2aWNlLmFjdGl2ZVBhcmVudE1lc3NhZ2UkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWVzc2FnZSAmJlxuICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZSAmJlxuICAgICAgICAgIG1lc3NhZ2UuaWQgIT09IHRoaXMucGFyZW50TWVzc2FnZS5pZCAmJlxuICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5tZXNzYWdlVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy5tZXNzYWdlVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmRhdGVTZXBhcmF0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UubmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbW5ld01lc3NhZ2VzSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLnR5cGluZ0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWwkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luQ2hhbm5lbCQ7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UudXNlcnNUeXBpbmdJblRocmVhZCQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldE1lc3NhZ2VzJCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLm1vZGUgfHwgY2hhbmdlcy5kaXJlY3Rpb24pIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZSRcbiAgICAgICAgLnBpcGUoZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnLmlkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdtYWluJykge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gY29uZmlnLnBhcmVudElkIHx8IGNvbmZpZy5pZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5wYXJlbnRJZCkge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gY29uZmlnLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWVzc2FnZUlkKSB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZUlkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkKTtcbiAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZCA9IG1lc3NhZ2VJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICBpZiAodGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZCkge1xuICAgICAgLy8gVHVybiBvZmYgcHJvZ3JhbWF0aWMgc2Nyb2xsIGFkanVzdG1lbnRzIHdoaWxlIGp1bXAgdG8gbWVzc2FnZSBpcyBpbiBwcm9ncmVzc1xuICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3RvcC10by1ib3R0b20nKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgJiZcbiAgICAgICAgKHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciB8fCAhdGhpcy5pc1VzZXJTY3JvbGxlZClcbiAgICAgICkge1xuICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgID8gdGhpcy5zY3JvbGxUb1RvcCgpXG4gICAgICAgICAgOiB0aGlzLmp1bXBUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5oYXNOZXdNZXNzYWdlcykge1xuICAgICAgICBpZiAoIXRoaXMuaXNVc2VyU2Nyb2xsZWQgfHwgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyKSB7XG4gICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgICAgICA6IHRoaXMuanVtcFRvTGF0ZXN0TWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vbGRlck1hc3NhZ2VzTG9hZGVkKSB7XG4gICAgICAgIHRoaXMucHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuZ2V0U2Nyb2xsUG9zaXRpb24oKSAhPT0gJ2JvdHRvbScgJiZcbiAgICAgICAgIXRoaXMuaXNVc2VyU2Nyb2xsZWQgJiZcbiAgICAgICAgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgID8gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgICAgOiB0aGlzLmp1bXBUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB0aGlzLm5ld01lc3NhZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsRW5kVGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeU1lc3NhZ2VJZChpbmRleDogbnVtYmVyLCBpdGVtOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cblxuICB0cmFja0J5VXNlcklkKGluZGV4OiBudW1iZXIsIHVzZXI6IFVzZXJSZXNwb25zZSkge1xuICAgIHJldHVybiB1c2VyLmlkO1xuICB9XG5cbiAganVtcFRvTGF0ZXN0TWVzc2FnZSgpIHtcbiAgICB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UuanVtcFRvTWVzc2FnZShcbiAgICAgICdsYXRlc3QnLFxuICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJyA/IHRoaXMucGFyZW50TWVzc2FnZT8uaWQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICBzY3JvbGxUb1RvcCgpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gIH1cblxuICBzY3JvbGxlZCgpIHtcbiAgICB0aGlzLmlzU2Nyb2xsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsRW5kVGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsRW5kVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pc1Njcm9sbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9LCAxMDApO1xuICAgIGlmIChcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID09PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uKCk7XG5cbiAgICB0aGlzLmlzVXNlclNjcm9sbGVkID1cbiAgICAgICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnXG4gICAgICAgID8gc2Nyb2xsUG9zaXRpb24gIT09ICdib3R0b20nXG4gICAgICAgIDogc2Nyb2xsUG9zaXRpb24gIT09ICd0b3AnKSB8fCAhdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3Q7XG4gICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZExvYWRNb3JlTWVzc2FnZXMoc2Nyb2xsUG9zaXRpb24pKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgbGV0IGRpcmVjdGlvbjogJ25ld2VyJyB8ICdvbGRlcic7XG4gICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJykge1xuICAgICAgICBkaXJlY3Rpb24gPSBzY3JvbGxQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnbmV3ZXInIDogJ29sZGVyJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IHNjcm9sbFBvc2l0aW9uID09PSAndG9wJyA/ICdvbGRlcicgOiAnbmV3ZXInO1xuICAgICAgfVxuICAgICAgdGhpcy5tb2RlID09PSAnbWFpbidcbiAgICAgICAgPyB2b2lkIHRoaXMuY2hhbm5lbFNlcnZpY2UubG9hZE1vcmVNZXNzYWdlcyhkaXJlY3Rpb24pXG4gICAgICAgIDogdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmxvYWRNb3JlVGhyZWFkUmVwbGllcyhkaXJlY3Rpb24pO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnByZXZTY3JvbGxUb3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgfVxuXG4gIGdldFR5cGluZ0luZGljYXRvckNvbnRleHQoKTogVHlwaW5nSW5kaWNhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJzVHlwaW5nJDogdGhpcy51c2Vyc1R5cGluZyQsXG4gICAgfTtcbiAgfVxuXG4gIGdldFR5cGluZ0luZGljYXRvclRleHQodXNlcnM6IFVzZXJSZXNwb25zZVtdKSB7XG4gICAgY29uc3QgdGV4dCA9IGxpc3RVc2Vycyh1c2Vycyk7XG5cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGFyZU9uU2VwYXJhdGVEYXRlcyhtZXNzYWdlPzogU3RyZWFtTWVzc2FnZSwgbmV4dE1lc3NhZ2U/OiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgaWYgKCFtZXNzYWdlIHx8ICFuZXh0TWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jcmVhdGVkX2F0LmdldERhdGUoKSAhPT0gbmV4dE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXREYXRlKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RnVsbFllYXIoKSAhPT1cbiAgICAgICAgbmV4dE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICBtZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0TW9udGgoKSAhPT0gbmV4dE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRNb250aCgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNTZW50QnlDdXJyZW50VXNlcihtZXNzYWdlPzogU3RyZWFtTWVzc2FnZSkge1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXI/LmlkO1xuICB9XG5cbiAgcGFyc2VEYXRlKGRhdGU6IERhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZShkYXRlKTtcbiAgfVxuXG4gIGdldCByZXBseUNvdW50UGFyYW0oKSB7XG4gICAgcmV0dXJuIHsgcmVwbHlDb3VudDogdGhpcy5wYXJlbnRNZXNzYWdlPy5yZXBseV9jb3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVzZXJ2ZVNjcm9sbGJhclBvc2l0aW9uKCkge1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgICh0aGlzLnByZXZTY3JvbGxUb3AgfHwgMCkgK1xuICAgICAgKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5jb250YWluZXJIZWlnaHQhKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2Nyb2xsUG9zaXRpb24oKTogJ3RvcCcgfCAnYm90dG9tJyB8ICdtaWRkbGUnIHtcbiAgICBsZXQgcG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyA9ICdtaWRkbGUnO1xuICAgIGlmIChcbiAgICAgIE1hdGguZmxvb3IodGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3ApIDw9XG4gICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSAmJlxuICAgICAgKHRoaXMucHJldlNjcm9sbFRvcCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMucHJldlNjcm9sbFRvcCA+XG4gICAgICAgICAgKHRoaXMucGFyZW50TWVzc2FnZUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IDApKVxuICAgICkge1xuICAgICAgcG9zaXRpb24gPSAndG9wJztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgTWF0aC5jZWlsKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSArXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ID49XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodFxuICAgICkge1xuICAgICAgcG9zaXRpb24gPSAnYm90dG9tJztcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH1cblxuICBwcml2YXRlIHNob3VsZExvYWRNb3JlTWVzc2FnZXMoc2Nyb2xsUG9zaXRpb246ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJykge1xuICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbiAhPT0gJ21pZGRsZScgJiYgIXRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQ7XG4gIH1cblxuICBwcml2YXRlIHNldE1lc3NhZ2VzJCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VzJCA9IChcbiAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgID8gdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICAgIDogdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVUaHJlYWRNZXNzYWdlcyRcbiAgICApLnBpcGUoXG4gICAgICB0YXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudExhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoY3VycmVudExhdGVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBjdXJyZW50T2xkZXN0TWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMub2xkZXN0TWVzc2FnZSB8fFxuICAgICAgICAgICFtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSB0aGlzLm9sZGVzdE1lc3NhZ2UhLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSBjdXJyZW50T2xkZXN0TWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRUaW1lKCkgPlxuICAgICAgICAgIGN1cnJlbnRPbGRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IGN1cnJlbnRPbGRlc3RNZXNzYWdlO1xuICAgICAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKFxuICAgICAgICAobWVzc2FnZXMpID0+XG4gICAgICAgICAgKHRoaXMubGFzdFNlbnRNZXNzYWdlSWQgPSBbLi4ubWVzc2FnZXNdXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICAgICAgbS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZCAmJlxuICAgICAgICAgICAgICAgIG0uc3RhdHVzICE9PSAnc2VuZGluZydcbiAgICAgICAgICAgICk/LmlkKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPVxuICAgICAgICAgICF0aGlzLmxhdGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICBtZXNzYWdlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXS5pZCA9PT0gdGhpcy5sYXRlc3RNZXNzYWdlLmlkO1xuICAgICAgICBpZiAoIXRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0KSB7XG4gICAgICAgICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPT09IHRoaXMubGF0ZXN0TWVzc2FnZT8uaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PlxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnID8gbWVzc2FnZXMgOiBbLi4ubWVzc2FnZXNdLnJldmVyc2UoKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cFN0eWxlcyA9IG1lc3NhZ2VzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICBnZXRHcm91cFN0eWxlcyhtLCBtZXNzYWdlc1tpIC0gMV0sIG1lc3NhZ2VzW2kgKyAxXSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTY3JvbGxTdGF0ZSgpIHtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldCB1c2Vyc1R5cGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZDogc3RyaW5nLCB3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2VJZCk7XG4gICAgaWYgKCFlbGVtZW50ICYmIHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkLCBmYWxzZSkpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0xhdGVzdE1lc3NhZ2Uod2l0aFJldHJ5ID0gdHJ1ZSkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmxhdGVzdE1lc3NhZ2UhLmlkKSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICA6IHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgICB9IGVsc2UgaWYgKHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoZmFsc2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5ld01lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVzZXI/OiB7IGlkOiBzdHJpbmcgfSB8IG51bGw7XG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdD8uZ2V0VGltZSgpIDwgbWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICkge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSB0cnVlO1xuICAgICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID1cbiAgICAgICAgbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZDtcbiAgICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gICNzY3JvbGxDb250YWluZXJcbiAgZGF0YS10ZXN0aWQ9XCJzY3JvbGwtY29udGFpbmVyXCJcbiAgY2xhc3M9XCJzdHItY2hhdF9fbGlzdFwiXG4gIChzY3JvbGwpPVwic2Nyb2xsZWQoKVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fcmV2ZXJzZS1pbmZpbml0ZS1zY3JvbGwgc3RyLWNoYXRfX21lc3NhZ2UtbGlzdC1zY3JvbGxcIj5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3VsXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zLWluLWJ1YmJsZV09XCJcbiAgICAgICAgbWVzc2FnZU9wdGlvbnNUcmlnZ2VyID09PSAnbWVzc2FnZS1idWJibGUnXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxsaVxuICAgICAgICAjcGFyZW50TWVzc2FnZUVsZW1lbnRcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAndGhyZWFkJyAmJiBwYXJlbnRNZXNzYWdlXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJwYXJlbnQtbWVzc2FnZVwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3BhcmVudC1tZXNzYWdlLWxpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGVDb250YWluZXI7XG4gICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IHBhcmVudE1lc3NhZ2UsIGluZGV4OiAncGFyZW50JyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVwbHktY291bnRcIiBjbGFzcz1cInN0ci1jaGF0X190aHJlYWQtc3RhcnRcIj5cbiAgICAgICAgICB7e3BhcmVudE1lc3NhZ2U/LnJlcGx5X2NvdW50ID09PSAxID8gKCdzdHJlYW1DaGF0LjEgcmVwbHknIHwgdHJhbnNsYXRlKSA6ICgnc3RyZWFtQ2hhdC57eyByZXBseUNvdW50IH19XG4gICAgICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICAgIDxzdHJlYW0tbG9hZGluZy1pbmRpY2F0b3JcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0b3AtbG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAqbmdJZj1cImlzTG9hZGluZyAmJiBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1wiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2Ugb2YgbWVzc2FnZXM7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBmaXJzdDtcbiAgICAgICAgICAgIGxldCBpc0xhc3QgPSBsYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdCksXG4gICAgICAgICAgICAgICAgICBpc05ld01lc3NhZ2U6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19saSBzdHItY2hhdF9fbGktLXt7IGdyb3VwU3R5bGVzW2ldIH19XCJcbiAgICAgICAgICAgIGlkPVwie3sgbWVzc2FnZS5pZCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IG1lc3NhZ2UsIGluZGV4OiBpIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIChsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZS5pZCAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyAmJlxuICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAoIWRpc3BsYXlEYXRlU2VwYXJhdG9yIHx8XG4gICAgICAgICAgICAgICAgICAhYXJlT25TZXBhcmF0ZURhdGVzKG1lc3NhZ2UsIG1lc3NhZ2VzW2kgKyAxXSkpKSB8fFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiZcbiAgICAgICAgICAgICAgICAhaXNMYXN0ICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZSkgJiZcbiAgICAgICAgICAgICAgICBsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZXNbaSArIDFdLmlkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcmVPblNlcGFyYXRlRGF0ZXMobWVzc2FnZSwgbWVzc2FnZXNbaSArIDFdKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQpLFxuICAgICAgICAgICAgICAgICAgaXNOZXdNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID09PSBsYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJiBmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYm90dG9tLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbSdcIlxuICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgIDwvdWw+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VHlwaW5nSW5kaWNhdG9yIGxldC11c2Vyc1R5cGluZyQ9XCJ1c2Vyc1R5cGluZyRcIj5cbiAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9uby1hbnkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJGFueSh1c2Vyc1R5cGluZyQgfCBhc3luYykgYXMgdXNlcnNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidXNlcnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0eXBpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yIHN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yLS10eXBpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0eXBpbmctdXNlcnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fdXNlcnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIHVzZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gKFwic3RyZWFtQ2hhdC51c2VyIGlzIHR5cGluZ1wiXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB1c2VyOiBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzKSB9KVxuICAgICAgICAgICAgICAgIDogKFwic3RyZWFtQ2hhdC51c2VycyBhcmUgdHlwaW5nXCJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHVzZXJzOiBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzKSB9KVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHR5cGluZ0luZGljYXRvclRlbXBsYXRlIHx8IGRlZmF1bHRUeXBpbmdJbmRpY2F0b3I7XG4gICAgICAgIGNvbnRleHQ6IGdldFR5cGluZ0luZGljYXRvckNvbnRleHQoKVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LW1lc3NhZ2VcIj5cbiAgPGJ1dHRvblxuICAgIGRhdGEtdGVzdGlkPVwic2Nyb2xsLXRvLWxhdGVzdFwiXG4gICAgKm5nSWY9XCJcbiAgICAgIGlzVXNlclNjcm9sbGVkICYmXG4gICAgICAoIWlzU2Nyb2xsSW5Qcm9ncmVzcyB8fCAhaGlkZUp1bXBUb0xhdGVzdEJ1dHRvbkR1cmluZ1Njcm9sbClcbiAgICBcIlxuICAgIGNsYXNzPVwiXG4gICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdFxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtcmlnaHRcbiAgICAgIHN0ci1jaGF0X19jaXJjbGUtZmFiXG4gICAgXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwianVtcFRvTGF0ZXN0TWVzc2FnZSgpXCJcbiAgICAoY2xpY2spPVwianVtcFRvTGF0ZXN0TWVzc2FnZSgpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvblxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fanVtcC10by1sYXRlc3QtaWNvbiBzdHItY2hhdF9fY2lyY2xlLWZhYi1pY29uXCJcbiAgICAgIFtpY29uXT1cImRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnID8gJ2Fycm93LWRvd24nIDogJ2Fycm93LXVwJ1wiXG4gICAgPjwvc3RyZWFtLWljb24+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJ1bnJlYWRNZXNzYWdlQ291bnQgPiAwXCJcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvblxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgICAgc3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LXVucmVhZC1jb3VudFxuICAgICAgXCJcbiAgICA+XG4gICAgICB7eyB1bnJlYWRNZXNzYWdlQ291bnQgfX1cbiAgICA8L2Rpdj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlVGVtcGxhdGVDb250YWluZXIgbGV0LW1lc3NhZ2U9XCJtZXNzYWdlXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHRNZXNzYWdlVGVtcGxhdGVcbiAgICBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiXG4gICAgbGV0LWlzTGFzdFNlbnRNZXNzYWdlPVwiaXNMYXN0U2VudE1lc3NhZ2VcIlxuICAgIGxldC1lbmFibGVkTWVzc2FnZUFjdGlvbnM9XCJlbmFibGVkTWVzc2FnZUFjdGlvbnNcIlxuICAgIGxldC1tb2RlPVwibW9kZVwiXG4gICAgbGV0LWlzSGlnaGxpZ2h0ZWQ9XCJpc0hpZ2hsaWdodGVkXCJcbiAgICBsZXQtY3VzdG9tQWN0aW9ucz1cImN1c3RvbUFjdGlvbnNcIlxuICA+XG4gICAgPHN0cmVhbS1tZXNzYWdlXG4gICAgICBbbWVzc2FnZV09XCJtZXNzYWdlSW5wdXRcIlxuICAgICAgW2lzTGFzdFNlbnRNZXNzYWdlXT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICAgIFtlbmFibGVkTWVzc2FnZUFjdGlvbnNdPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgW2lzSGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgICBbY3VzdG9tQWN0aW9uc109XCJjdXN0b21BY3Rpb25zXCJcbiAgICA+PC9zdHJlYW0tbWVzc2FnZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBtZXNzYWdlVGVtcGxhdGUgfHwgZGVmYXVsdE1lc3NhZ2VUZW1wbGF0ZTtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgaXNMYXN0U2VudE1lc3NhZ2U6ICEhKFxuICAgICAgICAgIGxhc3RTZW50TWVzc2FnZUlkICYmIG1lc3NhZ2U/LmlkID09PSBsYXN0U2VudE1lc3NhZ2VJZFxuICAgICAgICApLFxuICAgICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IGVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgICAgbW9kZTogbW9kZSxcbiAgICAgICAgaXNIaWdobGlnaHRlZDpcbiAgICAgICAgICBtZXNzYWdlPy5pZCA9PT0gaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICAhaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlLFxuICAgICAgICBjdXN0b21BY3Rpb25zOiBjdXN0b21NZXNzYWdlQWN0aW9uc1xuICAgICAgfVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGF0ZVNlcGFyYXRvclxuICBsZXQtZGF0ZT1cImRhdGVcIlxuICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICBsZXQtaXNOZXdNZXNzYWdlPVwiaXNOZXdNZXNzYWdlXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlEYXRlU2VwYXJhdG9yXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlIHx8IGRlZmF1bHREYXRlU2VwYXJhdG9yO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZWREYXRlLFxuICAgICAgICAgIGlzTmV3TWVzc2FnZTogaXNOZXdNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdERhdGVTZXBhcmF0b3JcbiAgICBsZXQtZGF0ZT1cImRhdGVcIlxuICAgIGxldC1wYXJzZWREYXRlPVwicGFyc2VkRGF0ZVwiXG4gICAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4gID5cbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZGF0ZS1zZXBhcmF0b3JcIiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvclwiPlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdyaWdodCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgICAgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItZGF0ZVwiPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJpc05ld01lc3NhZ2VcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibmV3LW1lc3NhZ2VzLWluZGljYXRvci1kYXRlLXNlcGFyYXRvclwiXG4gICAgICAgICAgPuKAoiB7eyBcInN0cmVhbUNoYXQuTmV3XCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgICA8aHJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvcj5cbiAgPGRpdiBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3JcIiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvclwiPlxuICAgIDxoclxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdyaWdodCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgLz5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIiB0cmFuc2xhdGU+c3RyZWFtQ2hhdC5OZXc8L2Rpdj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnbGVmdCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
479
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9tZXNzYWdlLWxpc3QvbWVzc2FnZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsV0FBVyxFQUNYLEtBQUssRUFNTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVbEQsT0FBTyxFQUFFLGNBQWMsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7O0FBRzFDOztHQUVHO0FBTUgsTUFBTSxPQUFPLG9CQUFvQjtJQStFL0IsWUFDVSxjQUE4QixFQUM5QixpQkFBb0MsRUFDcEMsc0JBQThDLEVBQzlDLFVBQTZCO1FBSDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFoRnZDOztXQUVHO1FBQ00sU0FBSSxHQUFzQixNQUFNLENBQUM7UUFDMUM7O1dBRUc7UUFDTSxjQUFTLEdBQXNDLGVBQWUsQ0FBQztRQUN4RTs7V0FFRztRQUNNLDBCQUFxQixHQUM1QixhQUFhLENBQUM7UUFFaEI7O1dBRUc7UUFDTSx1Q0FBa0MsR0FBRyxLQUFLLENBQUM7UUFDcEQ7O1dBRUc7UUFDTSx5QkFB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VUFBVSwwQ0FBRSxJQUFJLDBDQUFFLEVBQUUsQ0FBQSxDQUFDO1lBQ25FLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDM0I7U0FDRjtJQUNILENBQUM7O2lIQW5rQlUsb0JBQW9CO3FHQUFwQixvQkFBb0Isa3NCQ3hDakMsMDZTQThSQTsyRkR0UGEsb0JBQW9CO2tCQUxoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFdBQVcsRUFBRSwrQkFBK0I7b0JBQzVDLE1BQU0sRUFBRSxFQUFFO2lCQUNYOzBNQU9VLElBQUk7c0JBQVosS0FBSztnQkFJRyxTQUFTO3NCQUFqQixLQUFLO2dCQUlHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFNRyxrQ0FBa0M7c0JBQTFDLEtBQUs7Z0JBSUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUlHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFLRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBSUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQU93QixLQUFLO3NCQUFsQyxXQUFXO3VCQUFDLE9BQU87Z0JBY1osZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBR3BCLG9CQUFvQjtzQkFEM0IsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFubmVsU2VydmljZSB9IGZyb20gJy4uL2NoYW5uZWwuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBNZXNzYWdlQ29udGV4dCxcbiAgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyxcbiAgU3RyZWFtTWVzc2FnZSxcbiAgVHlwaW5nSW5kaWNhdG9yQ29udGV4dCxcbiAgQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIERhdGVTZXBhcmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSB9IGZyb20gJy4uL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0R3JvdXBTdHlsZXMsIEdyb3VwU3R5bGUgfSBmcm9tICcuL2dyb3VwLXN0eWxlcyc7XG5pbXBvcnQgeyBVc2VyUmVzcG9uc2UgfSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGxpc3RVc2VycyB9IGZyb20gJy4uL2xpc3QtdXNlcnMnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgYE1lc3NhZ2VMaXN0YCBjb21wb25lbnQgcmVuZGVycyBhIHNjcm9sbGFibGUgbGlzdCBvZiBtZXNzYWdlcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLW1lc3NhZ2UtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlTGlzdENvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbntcbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIG1lc3NhZ2UgbGlzdCBzaG91bGQgZGlzcGxheSBjaGFubmVsIG1lc3NhZ2VzIG9yIFt0aHJlYWQgbWVzc2FnZXNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3RocmVhZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZTogJ21haW4nIHwgJ3RocmVhZCcgPSAnbWFpbic7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgbGlzdCwgYGJvdHRvbS10by10b3BgIG1lYW5zIG5ld2VzdCBtZXNzYWdlIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIG1lc3NhZ2UgbGlzdCBhbmQgdXNlcnMgc2Nyb2xsIHVwd2FyZHMgdG8gbG9hZCBvbGRlciBtZXNzYWdlc1xuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0aW9uOiAnYm90dG9tLXRvLXRvcCcgfCAndG9wLXRvLWJvdHRvbScgPSAnYm90dG9tLXRvLXRvcCc7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoYXQgdHJpZ2dlcnMgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIG1lc3NhZ2Ugb3B0aW9uczogYnkgZGVmYXVsdCB5b3UgY2FuIGhvdmVyIChjbGljayBvbiBtb2JpbGUpIGFueXdoZXJlIGluIHRoZSByb3cgb2YgdGhlIG1lc3NhZ2UgKGBtZXNzYWdlLXJvd2Agb3B0aW9uKSwgb3IgeW91IGNhbiBzZXQgYG1lc3NhZ2UtYnViYmxlYCwgaW4gdGhhdCBjYXNlIG9ubHkgYSBob3ZlciAoY2xpY2sgb24gbW9iaWxlKSBpbiB0aGUgbWVzc2FnZSBidWJibGUgd2lsbCB0cmlnZ2VyIHRoZSBvcHRpb25zIHRvIGFwcGVhci5cbiAgICovXG4gIEBJbnB1dCgpIG1lc3NhZ2VPcHRpb25zVHJpZ2dlcjogJ21lc3NhZ2Utcm93JyB8ICdtZXNzYWdlLWJ1YmJsZScgPVxuICAgICdtZXNzYWdlLXJvdyc7XG4gIHR5cGluZ0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUeXBpbmdJbmRpY2F0b3JDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFlvdSBjYW4gaGlkZSB0aGUgXCJqdW1wIHRvIGxhdGVzdFwiIGJ1dHRvbiB3aGlsZSBzY3JvbGxpbmcuIEEgcG90ZW50aWFsIHVzZS1jYXNlIGZvciB0aGlzIGlucHV0IHdvdWxkIGJlIHRvIFt3b3JrYXJvdW5kIGEga25vd24gaXNzdWUgb24gaU9TIFNhZmFyXShodHRwczovL2dpdGh1Yi5jb20vR2V0U3RyZWFtL3N0cmVhbS1jaGF0LWFuZ3VsYXIvaXNzdWVzLzQxOClcbiAgICovXG4gIEBJbnB1dCgpIGhpZGVKdW1wVG9MYXRlc3RCdXR0b25EdXJpbmdTY3JvbGwgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjdXN0b20gbWVzc2FnZSBhY3Rpb25zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWVzc2FnZSBhY3Rpb24gYm94XG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21NZXNzYWdlQWN0aW9uczogQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW08YW55PltdID0gW107XG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAgZGF0ZSBzZXBhcmF0b3JzIHdpbGwgYmUgZGlzcGxheWVkXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5RGF0ZVNlcGFyYXRvciA9IHRydWU7XG4gIC8qKlxuICAgKiBJZiBkYXRlIHNlcGFyYXRvcnMgYXJlIGRpc3BsYXllZCwgeW91IGNhbiBzZXQgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGRhdGUgdGV4dC5cbiAgICogSWYgYG9wZW5NZXNzYWdlTGlzdEF0YCBpcyBgbGFzdC11bnJlYWQtbWVzc2FnZWAgaXQgd2lsbCBhbHNvIHNldCB0aGUgdGV4dCBwb3NpdGlvbiBvZiB0aGUgbmV3IG1lc3NhZ2VzIGluZGljYXRvci5cbiAgICovXG4gIEBJbnB1dCgpIGRhdGVTZXBhcmF0b3JUZXh0UG9zOiAnY2VudGVyJyB8ICdyaWdodCcgfCAnbGVmdCcgPSAnY2VudGVyJztcbiAgLyoqXG4gICAqIGBsYXN0LW1lc3NhZ2VgIG9wdGlvbiB3aWxsIG9wZW4gdGhlIG1lc3NhZ2UgbGlzdCBhdCB0aGUgbGFzdCBtZXNzYWdlLCBgbGFzdC11bnJlYWQtbWVzc2FnZWAgd2lsbCBvcGVuIHRoZSBsaXN0IGF0IHRoZSBsYXN0IHVucmVhZCBtZXNzYWdlLiBUaGlzIG9wdGlvbiBvbmx5IHdvcmtzIGlmIG1vZGUgaXMgYG1haW5gLlxuICAgKi9cbiAgQElucHV0KCkgb3Blbk1lc3NhZ2VMaXN0QXQ6ICdsYXN0LW1lc3NhZ2UnIHwgJ2xhc3QtdW5yZWFkLW1lc3NhZ2UnID1cbiAgICAnbGFzdC1tZXNzYWdlJztcbiAgbWVzc2FnZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxNZXNzYWdlQ29udGV4dD4gfCB1bmRlZmluZWQ7XG4gIGN1c3RvbURhdGVTZXBhcmF0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RGF0ZVNlcGFyYXRvckNvbnRleHQ+IHwgdW5kZWZpbmVkO1xuICBjdXN0b21uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbWVzc2FnZXMkITogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcml2YXRlIGNsYXNzID1cbiAgICAnc3RyLWNoYXQtYW5ndWxhcl9fbWFpbi1wYW5lbC1pbm5lciBzdHItY2hhdC1hbmd1bGFyX19tZXNzYWdlLWxpc3QtaG9zdCBzdHItY2hhdF9fbWFpbi1wYW5lbC1pbm5lcic7XG4gIHVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gIGlzVXNlclNjcm9sbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBncm91cFN0eWxlczogR3JvdXBTdHlsZVtdID0gW107XG4gIGxhc3RTZW50TWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBpc1Njcm9sbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgc2Nyb2xsRW5kVGltZW91dDogYW55O1xuICBsYXN0UmVhZE1lc3NhZ2VJZD86IHN0cmluZztcbiAgaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbENvbnRhaW5lcicpXG4gIHByaXZhdGUgc2Nyb2xsQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhcmVudE1lc3NhZ2VFbGVtZW50JylcbiAgcHJpdmF0ZSBwYXJlbnRNZXNzYWdlRWxlbWVudCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhdGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc05ld01lc3NhZ2VzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRhaW5lckhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVzdE1lc3NhZ2U6IHsgaWQ6IHN0cmluZzsgY3JlYXRlZF9hdDogRGF0ZSB9IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9sZGVyTWFzc2FnZXNMb2FkZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaXNOZXdNZXNzYWdlU2VudEJ5VXNlcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIG5ld01lc3NhZ2VTdWJzY3JpcHRpb246IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBwcmV2U2Nyb2xsVG9wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWwkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWQkITogT2JzZXJ2YWJsZTxcbiAgICBVc2VyUmVzcG9uc2U8RGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcz5bXVxuICA+O1xuICBwcml2YXRlIGlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIHByaXZhdGUgY2hhbm5lbElkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbm5lbFNlcnZpY2U6IENoYW5uZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQYXJzZXI6IERhdGVQYXJzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoKGNoYW5uZWwpID0+IHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYCR7Y2hhbm5lbD8uY2lkIHx8ICd1bmRlZmluZWQnfSBzZWxlY3RlZGAsXG4gICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5jaGFubmVsSWQgIT09IGNoYW5uZWw/LmlkKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgbmV3IGNoYW5uZWwgaXMgZGlmZmVyZW50IGZyb20gcHJldiBjaGFubmVsLCByZXNldGluZyBzY3JvbGwgc3RhdGVgLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgdGhpcy5jaGFubmVsSWQgPSBjaGFubmVsPy5pZDtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLm9wZW5NZXNzYWdlTGlzdEF0ID09PSAnbGFzdC11bnJlYWQtbWVzc2FnZScgJiZcbiAgICAgICAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID1cbiAgICAgICAgICAgICAgY2hhbm5lbD8uc3RhdGUucmVhZFtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQgfHwgJydcbiAgICAgICAgICAgICAgXT8ubGFzdF9yZWFkX21lc3NhZ2VfaWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IHRydWU7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlKHRoaXMubGFzdFJlYWRNZXNzYWdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWFkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYXBhYmlsaXRlcyA9IGNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgICAgIGlmIChjYXBhYmlsaXRlcykge1xuICAgICAgICAgIHRoaXMuZW5hYmxlZE1lc3NhZ2VBY3Rpb25zID0gY2FwYWJpbGl0ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAoY2hhbm5lbCkge1xuICAgICAgICAgIHRoaXMubmV3TWVzc2FnZVN1YnNjcmlwdGlvbiA9IGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBkaXNwbGF5IG1haW4gY2hhbm5lbCBtZXNzYWdlcyBhbmQgd2UncmUgc3dpdGNoZWQgdG8gYW4gb2xkZXIgbWVzc2FnZSBzZXQgLT4gdXNlIG1lc3NhZ2UubmV3IGV2ZW50IHRvIHVwZGF0ZSB1bnJlYWQgY291bnQgYW5kIGRldGVjdCBuZXcgbWVzc2FnZXMgc2VudCBieSBjdXJyZW50IHVzZXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIWV2ZW50Lm1lc3NhZ2UgfHxcbiAgICAgICAgICAgICAgY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyA9PT0gY2hhbm5lbC5zdGF0ZS5sYXRlc3RNZXNzYWdlcyB8fFxuICAgICAgICAgICAgICB0aGlzLm1vZGUgPT09ICd0aHJlYWQnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoe1xuICAgICAgICAgICAgICBpZDogZXZlbnQubWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgdXNlcjogZXZlbnQubWVzc2FnZS51c2VyLFxuICAgICAgICAgICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQgfHwgJycpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlUGFyZW50TWVzc2FnZSQuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlICYmXG4gICAgICAgICAgbWVzc2FnZS5pZCAhPT0gdGhpcy5wYXJlbnRNZXNzYWdlLmlkICYmXG4gICAgICAgICAgdGhpcy5tb2RlID09PSAndGhyZWFkJ1xuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsU3RhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLm1lc3NhZ2VUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLm1lc3NhZ2VUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuZGF0ZVNlcGFyYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlID0gdGVtcGxhdGUpXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzU2VydmljZS5uZXdNZXNzYWdlc0luZGljYXRvclRlbXBsYXRlJC5zdWJzY3JpYmUoXG4gICAgICAgICh0ZW1wbGF0ZSkgPT4gKHRoaXMuY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UudHlwaW5nSW5kaWNhdG9yVGVtcGxhdGUkLnN1YnNjcmliZShcbiAgICAgICAgKHRlbXBsYXRlKSA9PiAodGhpcy50eXBpbmdJbmRpY2F0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkID0gdGhpcy5jaGFubmVsU2VydmljZS51c2Vyc1R5cGluZ0luVGhyZWFkJDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TWVzc2FnZXMkKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMubW9kZSB8fCBjaGFuZ2VzLmRpcmVjdGlvbikge1xuICAgICAgdGhpcy5zZXRNZXNzYWdlcyQoKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuZGlyZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5qdW1wVG9NZXNzYWdlJFxuICAgICAgICAucGlwZShmaWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcuaWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ21haW4nKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcucGFyZW50SWQgfHwgY29uZmlnLmlkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudElkKSB7XG4gICAgICAgICAgICBtZXNzYWdlSWQgPSBjb25maWcuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgSnVtcGluZyB0byAke21lc3NhZ2VJZCB8fCAnJ31gLFxuICAgICAgICAgICAgeyB0YWdzOiBgbWVzc2FnZSBsaXN0ICR7dGhpcy5tb2RlfWAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2VJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZCk7XG4gICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgPSBtZXNzYWdlSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ZWRNZXNzYWdlSWQpIHtcbiAgICAgIC8vIFR1cm4gb2ZmIHByb2dyYW1hdGljIHNjcm9sbCBhZGp1c3RtZW50cyB3aGlsZSBqdW1wIHRvIG1lc3NhZ2UgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJykge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmhhc05ld01lc3NhZ2VzICYmXG4gICAgICAgICh0aGlzLmlzTmV3TWVzc2FnZVNlbnRCeVVzZXIgfHwgIXRoaXMuaXNVc2VyU2Nyb2xsZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Ub3AoKVxuICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaGFzTmV3TWVzc2FnZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGVkIHx8IHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlcikge1xuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgICBgVXNlciBoYXMgbmV3IG1lc3NhZ2VzLCBhbmQgbm90IHNjcm9sbGVkIG9yIHNlbnQgbmV3IG1lc3NhZ2VzLCB0aGVyZWZvcmUgd2UgJHtcbiAgICAgICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPyAnc2Nyb2xsJyA6ICdqdW1wJ1xuICAgICAgICAgICAgfSB0byBsYXRlc3QgbWVzc2FnZWAsXG4gICAgICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdFxuICAgICAgICAgICAgPyB0aGlzLnNjcm9sbFRvQm90dG9tKClcbiAgICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckhlaWdodCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9sZGVyTWFzc2FnZXNMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAnaW5mbycsXG4gICAgICAgICAgYE9sZGVyIG1lc3NhZ2VzIGFyZSBsb2FkZWQsIHdlIHByZXNlcnZlIHRoZSBzY3JvbGwgcG9zaXRpb25gLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVNjcm9sbGJhclBvc2l0aW9uKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpICE9PSAnYm90dG9tJyAmJlxuICAgICAgICAhdGhpcy5pc1VzZXJTY3JvbGxlZCAmJlxuICAgICAgICAhdGhpcy5oaWdobGlnaHRlZE1lc3NhZ2VJZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBDb250YWluZXIgZ3JldyBhbmQgdXNlciBkaWRuJ3Qgc2Nyb2xsIHRoZXJlZm9yZSB3ZSAke1xuICAgICAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPyAnc2Nyb2xsJyA6ICdqdW1wJ1xuICAgICAgICAgIH0gdG8gbGF0ZXN0IG1lc3NhZ2VgLFxuICAgICAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3RcbiAgICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICAgIDogdGhpcy5qdW1wVG9MYXRlc3RNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5uZXdNZXNzYWdlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrQnlNZXNzYWdlSWQoaW5kZXg6IG51bWJlciwgaXRlbTogU3RyZWFtTWVzc2FnZSkge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG5cbiAgdHJhY2tCeVVzZXJJZChpbmRleDogbnVtYmVyLCB1c2VyOiBVc2VyUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gdXNlci5pZDtcbiAgfVxuXG4gIGp1bXBUb0xhdGVzdE1lc3NhZ2UoKSB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmp1bXBUb01lc3NhZ2UoXG4gICAgICAnbGF0ZXN0JyxcbiAgICAgIHRoaXMubW9kZSA9PT0gJ3RocmVhZCcgPyB0aGlzLnBhcmVudE1lc3NhZ2U/LmlkIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICB9XG5cbiAgc2Nyb2xsZWQoKSB7XG4gICAgdGhpcy5pc1Njcm9sbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVvdXQpO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaXNTY3JvbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfSwgMTAwKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA9PT1cbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbigpO1xuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAnaW5mbycsXG4gICAgICBgU2Nyb2xsZWQgLSBzY3JvbGwgcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCxcbiAgICAgIHsgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gIH1cbiAgICApO1xuXG4gICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9XG4gICAgICAodGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHNjcm9sbFBvc2l0aW9uICE9PSAnYm90dG9tJ1xuICAgICAgICA6IHNjcm9sbFBvc2l0aW9uICE9PSAndG9wJykgfHwgIXRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0O1xuICAgIGlmICghdGhpcy5pc1VzZXJTY3JvbGxlZCkge1xuICAgICAgdGhpcy51bnJlYWRNZXNzYWdlQ291bnQgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uKSkge1xuICAgICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgIGxldCBkaXJlY3Rpb246ICduZXdlcicgfCAnb2xkZXInO1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScpIHtcbiAgICAgICAgZGlyZWN0aW9uID0gc2Nyb2xsUG9zaXRpb24gPT09ICd0b3AnID8gJ25ld2VyJyA6ICdvbGRlcic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXJlY3Rpb24gPSBzY3JvbGxQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnb2xkZXInIDogJ25ld2VyJztcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZSA9PT0gJ21haW4nXG4gICAgICAgID8gdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmxvYWRNb3JlTWVzc2FnZXMoZGlyZWN0aW9uKVxuICAgICAgICA6IHZvaWQgdGhpcy5jaGFubmVsU2VydmljZS5sb2FkTW9yZVRocmVhZFJlcGxpZXMoZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JDb250ZXh0KCk6IFR5cGluZ0luZGljYXRvckNvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICB1c2Vyc1R5cGluZyQ6IHRoaXMudXNlcnNUeXBpbmckLFxuICAgIH07XG4gIH1cblxuICBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzOiBVc2VyUmVzcG9uc2VbXSkge1xuICAgIGNvbnN0IHRleHQgPSBsaXN0VXNlcnModXNlcnMpO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBhcmVPblNlcGFyYXRlRGF0ZXMobWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UsIG5leHRNZXNzYWdlPzogU3RyZWFtTWVzc2FnZSkge1xuICAgIGlmICghbWVzc2FnZSB8fCAhbmV4dE1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuY3JlYXRlZF9hdC5nZXREYXRlKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldEZ1bGxZZWFyKCkgIT09XG4gICAgICAgIG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgbWVzc2FnZS5jcmVhdGVkX2F0LmdldE1vbnRoKCkgIT09IG5leHRNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0TW9udGgoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZT86IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2UudXNlcj8uaWQgPT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyPy5pZDtcbiAgfVxuXG4gIHBhcnNlRGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBhcnNlci5wYXJzZURhdGUoZGF0ZSk7XG4gIH1cblxuICBnZXQgcmVwbHlDb3VudFBhcmFtKCkge1xuICAgIHJldHVybiB7IHJlcGx5Q291bnQ6IHRoaXMucGFyZW50TWVzc2FnZT8ucmVwbHlfY291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlc2VydmVTY3JvbGxiYXJQb3NpdGlvbigpIHtcbiAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9XG4gICAgICAodGhpcy5wcmV2U2Nyb2xsVG9wIHx8IDApICtcbiAgICAgICh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMuY29udGFpbmVySGVpZ2h0ISk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjcm9sbFBvc2l0aW9uKCk6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbWlkZGxlJyB7XG4gICAgbGV0IHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScgPSAnbWlkZGxlJztcbiAgICBpZiAoXG4gICAgICBNYXRoLmZsb29yKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKSA8PVxuICAgICAgICAodGhpcy5wYXJlbnRNZXNzYWdlRWxlbWVudD8ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMCkgJiZcbiAgICAgICh0aGlzLnByZXZTY3JvbGxUb3AgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLnByZXZTY3JvbGxUb3AgPlxuICAgICAgICAgICh0aGlzLnBhcmVudE1lc3NhZ2VFbGVtZW50Py5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCB8fCAwKSlcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ3RvcCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE1hdGguY2VpbCh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCkgK1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCA+PVxuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHRcbiAgICApIHtcbiAgICAgIHBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc2l0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZU1lc3NhZ2VzKHNjcm9sbFBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nIHwgJ21pZGRsZScpIHtcbiAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb24gIT09ICdtaWRkbGUnICYmICF0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdlcyQoKSB7XG4gICAgdGhpcy5tZXNzYWdlcyQgPSAoXG4gICAgICB0aGlzLm1vZGUgPT09ICdtYWluJ1xuICAgICAgICA/IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJFxuICAgICAgICA6IHRoaXMuY2hhbm5lbFNlcnZpY2UuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgIGBFbXB0eSBtZXNzYWdlcyBhcnJheSwgcmVzZXRpbmcgc2Nyb2xsIHN0YXRlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbFN0YXRlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudD8ubG9nZ2VyPy4oXG4gICAgICAgICAgJ2luZm8nLFxuICAgICAgICAgIGBSZWNlaXZlZCBvbmUgb3IgbW9yZSBtZXNzYWdlc2AsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFnczogYG1lc3NhZ2UgbGlzdCAke3RoaXMubW9kZX1gLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY3VycmVudExhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlUmVjZWl2ZWQoY3VycmVudExhdGVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBjdXJyZW50T2xkZXN0TWVzc2FnZSA9IG1lc3NhZ2VzWzBdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMub2xkZXN0TWVzc2FnZSB8fFxuICAgICAgICAgICFtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSB0aGlzLm9sZGVzdE1lc3NhZ2UhLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UgPSBjdXJyZW50T2xkZXN0TWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLm9sZGVzdE1lc3NhZ2UuY3JlYXRlZF9hdC5nZXRUaW1lKCkgPlxuICAgICAgICAgIGN1cnJlbnRPbGRlc3RNZXNzYWdlLmNyZWF0ZWRfYXQuZ2V0VGltZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IGN1cnJlbnRPbGRlc3RNZXNzYWdlO1xuICAgICAgICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKFxuICAgICAgICAobWVzc2FnZXMpID0+XG4gICAgICAgICAgKHRoaXMubGFzdFNlbnRNZXNzYWdlSWQgPSBbLi4ubWVzc2FnZXNdXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICAgICAgbS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZCAmJlxuICAgICAgICAgICAgICAgIG0uc3RhdHVzICE9PSAnc2VuZGluZydcbiAgICAgICAgICAgICk/LmlkKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5pc0xhdGVzdE1lc3NhZ2VJbkxpc3QgPVxuICAgICAgICAgICF0aGlzLmxhdGVzdE1lc3NhZ2UgfHxcbiAgICAgICAgICBtZXNzYWdlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXS5pZCA9PT0gdGhpcy5sYXRlc3RNZXNzYWdlLmlkO1xuICAgICAgICBpZiAoIXRoaXMuaXNMYXRlc3RNZXNzYWdlSW5MaXN0KSB7XG4gICAgICAgICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlICYmXG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgIHRoaXMubGFzdFJlYWRNZXNzYWdlSWQgPT09IHRoaXMubGF0ZXN0TWVzc2FnZT8uaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5sYXN0UmVhZE1lc3NhZ2VJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PlxuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnID8gbWVzc2FnZXMgOiBbLi4ubWVzc2FnZXNdLnJldmVyc2UoKVxuICAgICAgKSxcbiAgICAgIHRhcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgdGhpcy5ncm91cFN0eWxlcyA9IG1lc3NhZ2VzLm1hcCgobSwgaSkgPT5cbiAgICAgICAgICBnZXRHcm91cFN0eWxlcyhtLCBtZXNzYWdlc1tpIC0gMV0sIG1lc3NhZ2VzW2kgKyAxXSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRTY3JvbGxTdGF0ZSgpIHtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5oYXNOZXdNZXNzYWdlcyA9IHRydWU7XG4gICAgdGhpcy5pc1VzZXJTY3JvbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2xkZXJNYXNzYWdlc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub2xkZXN0TWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnVucmVhZE1lc3NhZ2VDb3VudCA9IDA7XG4gICAgdGhpcy5wcmV2U2Nyb2xsVG9wID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNOZXdNZXNzYWdlU2VudEJ5VXNlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTGF0ZXN0TWVzc2FnZUluTGlzdCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldCB1c2Vyc1R5cGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3RocmVhZCdcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJDtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsTWVzc2FnZUludG9WaWV3KG1lc3NhZ2VJZDogc3RyaW5nLCB3aXRoUmV0cnkgPSB0cnVlKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1lc3NhZ2VJZCk7XG4gICAgaWYgKCFlbGVtZW50ICYmIHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxNZXNzYWdlSW50b1ZpZXcobWVzc2FnZUlkLCBmYWxzZSkpO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTWVzc2FnZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzSnVtcGluZ1RvTGF0ZXN0VW5yZWFkTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb0xhdGVzdE1lc3NhZ2Uod2l0aFJldHJ5ID0gdHJ1ZSkge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmxhdGVzdE1lc3NhZ2UhLmlkKSkge1xuICAgICAgdGhpcy5kaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1xuICAgICAgICA/IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICA6IHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgICB9IGVsc2UgaWYgKHdpdGhSZXRyeSkge1xuICAgICAgLy8gSWYgdGhlIG1lc3NhZ2Ugd2FzIG5ld2x5IGluc2VydGVkIGludG8gYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW5kZXJlZCBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIC0+IHdhaXQgZm9yIHRoaXMgY3ljbGUgdG8gY29tcGxldGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0xhdGVzdE1lc3NhZ2UoZmFsc2UpLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5ld01lc3NhZ2VSZWNlaXZlZChtZXNzYWdlOiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjcmVhdGVkX2F0OiBEYXRlO1xuICAgIHVzZXI/OiB7IGlkOiBzdHJpbmcgfSB8IG51bGw7XG4gIH0pIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5sYXRlc3RNZXNzYWdlIHx8XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdD8uZ2V0VGltZSgpIDwgbWVzc2FnZS5jcmVhdGVkX2F0LmdldFRpbWUoKVxuICAgICkge1xuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py5sb2dnZXI/LihcbiAgICAgICAgJ2luZm8nLFxuICAgICAgICBgUmVjZWl2ZWQgbmV3IG1lc3NhZ2VgLFxuICAgICAgICB7IHRhZ3M6IGBtZXNzYWdlIGxpc3QgJHt0aGlzLm1vZGV9YCB9XG4gICAgICApO1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIHRoaXMuaGFzTmV3TWVzc2FnZXMgPSB0cnVlO1xuICAgICAgdGhpcy5pc05ld01lc3NhZ2VTZW50QnlVc2VyID1cbiAgICAgICAgbWVzc2FnZS51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50Py51c2VyPy5pZDtcbiAgICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGVkKSB7XG4gICAgICAgIHRoaXMudW5yZWFkTWVzc2FnZUNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gICNzY3JvbGxDb250YWluZXJcbiAgZGF0YS10ZXN0aWQ9XCJzY3JvbGwtY29udGFpbmVyXCJcbiAgY2xhc3M9XCJzdHItY2hhdF9fbGlzdFwiXG4gIChzY3JvbGwpPVwic2Nyb2xsZWQoKVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fcmV2ZXJzZS1pbmZpbml0ZS1zY3JvbGwgc3RyLWNoYXRfX21lc3NhZ2UtbGlzdC1zY3JvbGxcIj5cbiAgICA8dWxcbiAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3VsXCJcbiAgICAgIFtjbGFzcy5zdHItY2hhdF9fbWVzc2FnZS1vcHRpb25zLWluLWJ1YmJsZV09XCJcbiAgICAgICAgbWVzc2FnZU9wdGlvbnNUcmlnZ2VyID09PSAnbWVzc2FnZS1idWJibGUnXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxsaVxuICAgICAgICAjcGFyZW50TWVzc2FnZUVsZW1lbnRcbiAgICAgICAgKm5nSWY9XCJtb2RlID09PSAndGhyZWFkJyAmJiBwYXJlbnRNZXNzYWdlXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJwYXJlbnQtbWVzc2FnZVwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX3BhcmVudC1tZXNzYWdlLWxpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBtZXNzYWdlVGVtcGxhdGVDb250YWluZXI7XG4gICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IHBhcmVudE1lc3NhZ2UsIGluZGV4OiAncGFyZW50JyB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwicmVwbHktY291bnRcIiBjbGFzcz1cInN0ci1jaGF0X190aHJlYWQtc3RhcnRcIj5cbiAgICAgICAgICB7e3BhcmVudE1lc3NhZ2U/LnJlcGx5X2NvdW50ID09PSAxID8gKCdzdHJlYW1DaGF0LjEgcmVwbHknIHwgdHJhbnNsYXRlKSA6ICgnc3RyZWFtQ2hhdC57eyByZXBseUNvdW50IH19XG4gICAgICAgICAgcmVwbGllcycgfCB0cmFuc2xhdGU6cmVwbHlDb3VudFBhcmFtKX19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9saT5cbiAgICAgIDxzdHJlYW0tbG9hZGluZy1pbmRpY2F0b3JcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0b3AtbG9hZGluZy1pbmRpY2F0b3JcIlxuICAgICAgICAqbmdJZj1cImlzTG9hZGluZyAmJiBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJ1wiXG4gICAgICA+PC9zdHJlYW0tbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2Ugb2YgbWVzc2FnZXM7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgICAgICAgbGV0IGlzRmlyc3QgPSBmaXJzdDtcbiAgICAgICAgICAgIGxldCBpc0xhc3QgPSBsYXN0O1xuICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNGaXJzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZS5jcmVhdGVkX2F0LFxuICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0ZTogcGFyc2VEYXRlKG1lc3NhZ2UuY3JlYXRlZF9hdCksXG4gICAgICAgICAgICAgICAgICBpc05ld01lc3NhZ2U6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGNsYXNzPVwibWVzc2FnZVwiXG4gICAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19saSBzdHItY2hhdF9fbGktLXt7IGdyb3VwU3R5bGVzW2ldIH19XCJcbiAgICAgICAgICAgIGlkPVwie3sgbWVzc2FnZS5pZCB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUZW1wbGF0ZUNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IG1lc3NhZ2U6IG1lc3NhZ2UsIGluZGV4OiBpIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIChsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZS5pZCAmJlxuICAgICAgICAgICAgICAgICFpc0xhc3QgJiZcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09ICdib3R0b20tdG8tdG9wJyAmJlxuICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAoIWRpc3BsYXlEYXRlU2VwYXJhdG9yIHx8XG4gICAgICAgICAgICAgICAgICAhYXJlT25TZXBhcmF0ZURhdGVzKG1lc3NhZ2UsIG1lc3NhZ2VzW2kgKyAxXSkpKSB8fFxuICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbScgJiZcbiAgICAgICAgICAgICAgICAhaXNMYXN0ICYmXG4gICAgICAgICAgICAgICAgIWlzU2VudEJ5Q3VycmVudFVzZXIobWVzc2FnZSkgJiZcbiAgICAgICAgICAgICAgICBsYXN0UmVhZE1lc3NhZ2VJZCA9PT0gbWVzc2FnZXNbaSArIDFdLmlkKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY3VzdG9tbmV3TWVzc2FnZXNJbmRpY2F0b3JUZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgIGRlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvclxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcmVPblNlcGFyYXRlRGF0ZXMobWVzc2FnZSwgbWVzc2FnZXNbaSArIDFdKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGRhdGVTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgZGF0ZTogbWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQsXG4gICAgICAgICAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZURhdGUobWVzc2FnZXNbaSArIDFdLmNyZWF0ZWRfYXQpLFxuICAgICAgICAgICAgICAgICAgaXNOZXdNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09PSAnYm90dG9tLXRvLXRvcCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID09PSBsYXN0UmVhZE1lc3NhZ2VJZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFpc1NlbnRCeUN1cnJlbnRVc2VyKG1lc3NhZ2VzW2kgKyAxXSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gPT09ICd0b3AtdG8tYm90dG9tJyAmJiBmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8c3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiYm90dG9tLWxvYWRpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgKm5nSWY9XCJpc0xvYWRpbmcgJiYgZGlyZWN0aW9uID09PSAndG9wLXRvLWJvdHRvbSdcIlxuICAgICAgPjwvc3RyZWFtLWxvYWRpbmctaW5kaWNhdG9yPlxuICAgIDwvdWw+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VHlwaW5nSW5kaWNhdG9yIGxldC11c2Vyc1R5cGluZyQ9XCJ1c2Vyc1R5cGluZyRcIj5cbiAgICAgIDwhLS0gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC90ZW1wbGF0ZS9uby1hbnkgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJGFueSh1c2Vyc1R5cGluZyQgfCBhc3luYykgYXMgdXNlcnNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidXNlcnMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0eXBpbmctaW5kaWNhdG9yXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yIHN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yLS10eXBpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ci1jaGF0X190eXBpbmctaW5kaWNhdG9yX19kb3RcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ0eXBpbmctdXNlcnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fdHlwaW5nLWluZGljYXRvcl9fdXNlcnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIHVzZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gKFwic3RyZWFtQ2hhdC51c2VyIGlzIHR5cGluZ1wiXG4gICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB1c2VyOiBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzKSB9KVxuICAgICAgICAgICAgICAgIDogKFwic3RyZWFtQ2hhdC51c2VycyBhcmUgdHlwaW5nXCJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHVzZXJzOiBnZXRUeXBpbmdJbmRpY2F0b3JUZXh0KHVzZXJzKSB9KVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIHR5cGluZ0luZGljYXRvclRlbXBsYXRlIHx8IGRlZmF1bHRUeXBpbmdJbmRpY2F0b3I7XG4gICAgICAgIGNvbnRleHQ6IGdldFR5cGluZ0luZGljYXRvckNvbnRleHQoKVxuICAgICAgXCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LW1lc3NhZ2VcIj5cbiAgPGJ1dHRvblxuICAgIGRhdGEtdGVzdGlkPVwic2Nyb2xsLXRvLWxhdGVzdFwiXG4gICAgKm5nSWY9XCJcbiAgICAgIGlzVXNlclNjcm9sbGVkICYmXG4gICAgICAoIWlzU2Nyb2xsSW5Qcm9ncmVzcyB8fCAhaGlkZUp1bXBUb0xhdGVzdEJ1dHRvbkR1cmluZ1Njcm9sbClcbiAgICBcIlxuICAgIGNsYXNzPVwiXG4gICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdFxuICAgICAgc3RyLWNoYXRfX21lc3NhZ2Utbm90aWZpY2F0aW9uLXNjcm9sbC10by1sYXRlc3QtcmlnaHRcbiAgICAgIHN0ci1jaGF0X19jaXJjbGUtZmFiXG4gICAgXCJcbiAgICAoa2V5dXAuZW50ZXIpPVwianVtcFRvTGF0ZXN0TWVzc2FnZSgpXCJcbiAgICAoY2xpY2spPVwianVtcFRvTGF0ZXN0TWVzc2FnZSgpXCJcbiAgPlxuICAgIDxzdHJlYW0taWNvblxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fanVtcC10by1sYXRlc3QtaWNvbiBzdHItY2hhdF9fY2lyY2xlLWZhYi1pY29uXCJcbiAgICAgIFtpY29uXT1cImRpcmVjdGlvbiA9PT0gJ2JvdHRvbS10by10b3AnID8gJ2Fycm93LWRvd24nIDogJ2Fycm93LXVwJ1wiXG4gICAgPjwvc3RyZWFtLWljb24+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJ1bnJlYWRNZXNzYWdlQ291bnQgPiAwXCJcbiAgICAgIGNsYXNzPVwiXG4gICAgICAgIHN0ci1jaGF0X19tZXNzYWdlLW5vdGlmaWNhdGlvblxuICAgICAgICBzdHItY2hhdF9fbWVzc2FnZS1ub3RpZmljYXRpb24tc2Nyb2xsLXRvLWxhdGVzdC11bnJlYWQtY291bnRcbiAgICAgICAgc3RyLWNoYXRfX2p1bXAtdG8tbGF0ZXN0LXVucmVhZC1jb3VudFxuICAgICAgXCJcbiAgICA+XG4gICAgICB7eyB1bnJlYWRNZXNzYWdlQ291bnQgfX1cbiAgICA8L2Rpdj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNtZXNzYWdlVGVtcGxhdGVDb250YWluZXIgbGV0LW1lc3NhZ2U9XCJtZXNzYWdlXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cbiAgPG5nLXRlbXBsYXRlXG4gICAgI2RlZmF1bHRNZXNzYWdlVGVtcGxhdGVcbiAgICBsZXQtbWVzc2FnZUlucHV0PVwibWVzc2FnZVwiXG4gICAgbGV0LWlzTGFzdFNlbnRNZXNzYWdlPVwiaXNMYXN0U2VudE1lc3NhZ2VcIlxuICAgIGxldC1lbmFibGVkTWVzc2FnZUFjdGlvbnM9XCJlbmFibGVkTWVzc2FnZUFjdGlvbnNcIlxuICAgIGxldC1tb2RlPVwibW9kZVwiXG4gICAgbGV0LWlzSGlnaGxpZ2h0ZWQ9XCJpc0hpZ2hsaWdodGVkXCJcbiAgICBsZXQtY3VzdG9tQWN0aW9ucz1cImN1c3RvbUFjdGlvbnNcIlxuICA+XG4gICAgPHN0cmVhbS1tZXNzYWdlXG4gICAgICBbbWVzc2FnZV09XCJtZXNzYWdlSW5wdXRcIlxuICAgICAgW2lzTGFzdFNlbnRNZXNzYWdlXT1cImlzTGFzdFNlbnRNZXNzYWdlXCJcbiAgICAgIFtlbmFibGVkTWVzc2FnZUFjdGlvbnNdPVwiZW5hYmxlZE1lc3NhZ2VBY3Rpb25zXCJcbiAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgW2lzSGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZFwiXG4gICAgICBbY3VzdG9tQWN0aW9uc109XCJjdXN0b21BY3Rpb25zXCJcbiAgICA+PC9zdHJlYW0tbWVzc2FnZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBtZXNzYWdlVGVtcGxhdGUgfHwgZGVmYXVsdE1lc3NhZ2VUZW1wbGF0ZTtcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgaXNMYXN0U2VudE1lc3NhZ2U6ICEhKFxuICAgICAgICAgIGxhc3RTZW50TWVzc2FnZUlkICYmIG1lc3NhZ2U/LmlkID09PSBsYXN0U2VudE1lc3NhZ2VJZFxuICAgICAgICApLFxuICAgICAgICBlbmFibGVkTWVzc2FnZUFjdGlvbnM6IGVuYWJsZWRNZXNzYWdlQWN0aW9ucyxcbiAgICAgICAgbW9kZTogbW9kZSxcbiAgICAgICAgaXNIaWdobGlnaHRlZDpcbiAgICAgICAgICBtZXNzYWdlPy5pZCA9PT0gaGlnaGxpZ2h0ZWRNZXNzYWdlSWQgJiZcbiAgICAgICAgICAhaXNKdW1waW5nVG9MYXRlc3RVbnJlYWRNZXNzYWdlLFxuICAgICAgICBjdXN0b21BY3Rpb25zOiBjdXN0b21NZXNzYWdlQWN0aW9uc1xuICAgICAgfVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGF0ZVNlcGFyYXRvclxuICBsZXQtZGF0ZT1cImRhdGVcIlxuICBsZXQtcGFyc2VkRGF0ZT1cInBhcnNlZERhdGVcIlxuICBsZXQtaXNOZXdNZXNzYWdlPVwiaXNOZXdNZXNzYWdlXCJcbj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlEYXRlU2VwYXJhdG9yXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgY3VzdG9tRGF0ZVNlcGFyYXRvclRlbXBsYXRlIHx8IGRlZmF1bHREYXRlU2VwYXJhdG9yO1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgICAgICBwYXJzZWREYXRlOiBwYXJzZWREYXRlLFxuICAgICAgICAgIGlzTmV3TWVzc2FnZTogaXNOZXdNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGVcbiAgICAjZGVmYXVsdERhdGVTZXBhcmF0b3JcbiAgICBsZXQtZGF0ZT1cImRhdGVcIlxuICAgIGxldC1wYXJzZWREYXRlPVwicGFyc2VkRGF0ZVwiXG4gICAgbGV0LWlzTmV3TWVzc2FnZT1cImlzTmV3TWVzc2FnZVwiXG4gID5cbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZGF0ZS1zZXBhcmF0b3JcIiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvclwiPlxuICAgICAgPGhyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdyaWdodCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWxpbmVcIlxuICAgICAgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItZGF0ZVwiPlxuICAgICAgICB7eyBwYXJzZWREYXRlIH19XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJpc05ld01lc3NhZ2VcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibmV3LW1lc3NhZ2VzLWluZGljYXRvci1kYXRlLXNlcGFyYXRvclwiXG4gICAgICAgICAgPuKAoiB7eyBcInN0cmVhbUNoYXQuTmV3XCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgICA8aHJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBkYXRlU2VwYXJhdG9yVGV4dFBvcyA9PT0gJ2xlZnQnIHx8IGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnY2VudGVyJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvci1saW5lXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHROZXdNZXNzYWdlc0luZGljYXRvcj5cbiAgPGRpdiBkYXRhLXRlc3RpZD1cIm5ldy1tZXNzYWdlcy1pbmRpY2F0b3JcIiBjbGFzcz1cInN0ci1jaGF0X19kYXRlLXNlcGFyYXRvclwiPlxuICAgIDxoclxuICAgICAgKm5nSWY9XCJcbiAgICAgICAgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdyaWdodCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgLz5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2RhdGUtc2VwYXJhdG9yLWRhdGVcIiB0cmFuc2xhdGU+c3RyZWFtQ2hhdC5OZXc8L2Rpdj5cbiAgICA8aHJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIGRhdGVTZXBhcmF0b3JUZXh0UG9zID09PSAnbGVmdCcgfHwgZGF0ZVNlcGFyYXRvclRleHRQb3MgPT09ICdjZW50ZXInXG4gICAgICBcIlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fZGF0ZS1zZXBhcmF0b3ItbGluZVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -20,7 +20,7 @@ import transliterate from '@stream-io/transliterate';
|
|
|
20
20
|
import * as i8 from 'angular-mentions';
|
|
21
21
|
import { MentionModule } from 'angular-mentions';
|
|
22
22
|
|
|
23
|
-
const version = '4.
|
|
23
|
+
const version = '4.34.1';
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* The `NotificationService` can be used to add or remove notifications. By default the [`NotificationList`](../components/NotificationListComponent.mdx) component displays the currently active notifications.
|
|
@@ -402,6 +402,9 @@ class ChannelService {
|
|
|
402
402
|
*/
|
|
403
403
|
setAsActiveChannel(channel) {
|
|
404
404
|
const prevActiveChannel = this.activeChannelSubject.getValue();
|
|
405
|
+
if ((prevActiveChannel === null || prevActiveChannel === void 0 ? void 0 : prevActiveChannel.cid) === channel.cid) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
405
408
|
this.stopWatchForActiveChannelEvents(prevActiveChannel);
|
|
406
409
|
this.watchForActiveChannelEvents(channel);
|
|
407
410
|
this.addChannel(channel);
|
|
@@ -5114,14 +5117,16 @@ class MessageListComponent {
|
|
|
5114
5117
|
this.subscriptions = [];
|
|
5115
5118
|
this.isLatestMessageInList = true;
|
|
5116
5119
|
this.subscriptions.push(this.channelService.activeChannel$.subscribe((channel) => {
|
|
5117
|
-
var _a, _b, _c, _d;
|
|
5120
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
5121
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `${(channel === null || channel === void 0 ? void 0 : channel.cid) || 'undefined'} selected`, { tags: `message list ${this.mode}` });
|
|
5118
5122
|
if (this.channelId !== (channel === null || channel === void 0 ? void 0 : channel.id)) {
|
|
5123
|
+
(_e = (_d = (_c = this.chatClientService) === null || _c === void 0 ? void 0 : _c.chatClient) === null || _d === void 0 ? void 0 : _d.logger) === null || _e === void 0 ? void 0 : _e.call(_d, 'info', `new channel is different from prev channel, reseting scroll state`, { tags: `message list ${this.mode}` });
|
|
5119
5124
|
this.resetScrollState();
|
|
5120
5125
|
this.channelId = channel === null || channel === void 0 ? void 0 : channel.id;
|
|
5121
5126
|
if (this.openMessageListAt === 'last-unread-message' &&
|
|
5122
5127
|
this.mode === 'main') {
|
|
5123
5128
|
this.lastReadMessageId =
|
|
5124
|
-
(
|
|
5129
|
+
(_g = channel === null || channel === void 0 ? void 0 : channel.state.read[((_f = this.chatClientService.chatClient.user) === null || _f === void 0 ? void 0 : _f.id) || '']) === null || _g === void 0 ? void 0 : _g.last_read_message_id;
|
|
5125
5130
|
if (this.lastReadMessageId) {
|
|
5126
5131
|
this.isJumpingToLatestUnreadMessage = true;
|
|
5127
5132
|
void this.channelService.jumpToMessage(this.lastReadMessageId);
|
|
@@ -5131,11 +5136,11 @@ class MessageListComponent {
|
|
|
5131
5136
|
this.lastReadMessageId = undefined;
|
|
5132
5137
|
}
|
|
5133
5138
|
}
|
|
5134
|
-
const capabilites = (
|
|
5139
|
+
const capabilites = (_h = channel === null || channel === void 0 ? void 0 : channel.data) === null || _h === void 0 ? void 0 : _h.own_capabilities;
|
|
5135
5140
|
if (capabilites) {
|
|
5136
5141
|
this.enabledMessageActions = capabilites;
|
|
5137
5142
|
}
|
|
5138
|
-
(
|
|
5143
|
+
(_j = this.newMessageSubscription) === null || _j === void 0 ? void 0 : _j.unsubscribe();
|
|
5139
5144
|
if (channel) {
|
|
5140
5145
|
this.newMessageSubscription = channel.on('message.new', (event) => {
|
|
5141
5146
|
// If we display main channel messages and we're switched to an older message set -> use message.new event to update unread count and detect new messages sent by current user
|
|
@@ -5186,6 +5191,7 @@ class MessageListComponent {
|
|
|
5186
5191
|
this.subscriptions.push(this.channelService.jumpToMessage$
|
|
5187
5192
|
.pipe(filter((config) => !!config.id))
|
|
5188
5193
|
.subscribe((config) => {
|
|
5194
|
+
var _a, _b;
|
|
5189
5195
|
let messageId = undefined;
|
|
5190
5196
|
if (this.mode === 'main') {
|
|
5191
5197
|
messageId = config.parentId || config.id;
|
|
@@ -5193,6 +5199,7 @@ class MessageListComponent {
|
|
|
5193
5199
|
else if (config.parentId) {
|
|
5194
5200
|
messageId = config.id;
|
|
5195
5201
|
}
|
|
5202
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Jumping to ${messageId || ''}`, { tags: `message list ${this.mode}` });
|
|
5196
5203
|
if (messageId) {
|
|
5197
5204
|
if (messageId === 'latest') {
|
|
5198
5205
|
this.scrollToLatestMessage();
|
|
@@ -5205,6 +5212,7 @@ class MessageListComponent {
|
|
|
5205
5212
|
}));
|
|
5206
5213
|
}
|
|
5207
5214
|
ngAfterViewChecked() {
|
|
5215
|
+
var _a, _b, _c, _d, _e, _f;
|
|
5208
5216
|
if (this.highlightedMessageId) {
|
|
5209
5217
|
// Turn off programatic scroll adjustments while jump to message is in progress
|
|
5210
5218
|
this.hasNewMessages = false;
|
|
@@ -5223,6 +5231,7 @@ class MessageListComponent {
|
|
|
5223
5231
|
else {
|
|
5224
5232
|
if (this.hasNewMessages) {
|
|
5225
5233
|
if (!this.isUserScrolled || this.isNewMessageSentByUser) {
|
|
5234
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `User has new messages, and not scrolled or sent new messages, therefore we ${this.isLatestMessageInList ? 'scroll' : 'jump'} to latest message`, { tags: `message list ${this.mode}` });
|
|
5226
5235
|
this.isLatestMessageInList
|
|
5227
5236
|
? this.scrollToBottom()
|
|
5228
5237
|
: this.jumpToLatestMessage();
|
|
@@ -5231,6 +5240,7 @@ class MessageListComponent {
|
|
|
5231
5240
|
this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;
|
|
5232
5241
|
}
|
|
5233
5242
|
else if (this.olderMassagesLoaded) {
|
|
5243
|
+
(_d = (_c = this.chatClientService.chatClient) === null || _c === void 0 ? void 0 : _c.logger) === null || _d === void 0 ? void 0 : _d.call(_c, 'info', `Older messages are loaded, we preserve the scroll position`, { tags: `message list ${this.mode}` });
|
|
5234
5244
|
this.preserveScrollbarPosition();
|
|
5235
5245
|
this.containerHeight = this.scrollContainer.nativeElement.scrollHeight;
|
|
5236
5246
|
this.olderMassagesLoaded = false;
|
|
@@ -5238,6 +5248,7 @@ class MessageListComponent {
|
|
|
5238
5248
|
else if (this.getScrollPosition() !== 'bottom' &&
|
|
5239
5249
|
!this.isUserScrolled &&
|
|
5240
5250
|
!this.highlightedMessageId) {
|
|
5251
|
+
(_f = (_e = this.chatClientService.chatClient) === null || _e === void 0 ? void 0 : _e.logger) === null || _f === void 0 ? void 0 : _f.call(_e, 'info', `Container grew and user didn't scroll therefore we ${this.isLatestMessageInList ? 'scroll' : 'jump'} to latest message`, { tags: `message list ${this.mode}` });
|
|
5241
5252
|
this.isLatestMessageInList
|
|
5242
5253
|
? this.scrollToBottom()
|
|
5243
5254
|
: this.jumpToLatestMessage();
|
|
@@ -5271,6 +5282,7 @@ class MessageListComponent {
|
|
|
5271
5282
|
this.scrollContainer.nativeElement.scrollTop = 0;
|
|
5272
5283
|
}
|
|
5273
5284
|
scrolled() {
|
|
5285
|
+
var _a, _b;
|
|
5274
5286
|
this.isScrollInProgress = true;
|
|
5275
5287
|
if (this.scrollEndTimeout) {
|
|
5276
5288
|
clearTimeout(this.scrollEndTimeout);
|
|
@@ -5283,6 +5295,7 @@ class MessageListComponent {
|
|
|
5283
5295
|
return;
|
|
5284
5296
|
}
|
|
5285
5297
|
const scrollPosition = this.getScrollPosition();
|
|
5298
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Scrolled - scroll position: ${scrollPosition}`, { tags: `message list ${this.mode}` });
|
|
5286
5299
|
this.isUserScrolled =
|
|
5287
5300
|
(this.direction === 'bottom-to-top'
|
|
5288
5301
|
? scrollPosition !== 'bottom'
|
|
@@ -5372,11 +5385,18 @@ class MessageListComponent {
|
|
|
5372
5385
|
this.messages$ = (this.mode === 'main'
|
|
5373
5386
|
? this.channelService.activeChannelMessages$
|
|
5374
5387
|
: this.channelService.activeThreadMessages$).pipe(tap((messages) => {
|
|
5388
|
+
var _a, _b, _c, _d;
|
|
5375
5389
|
this.isLoading = false;
|
|
5376
5390
|
if (messages.length === 0) {
|
|
5391
|
+
(_b = (_a = this.chatClientService.chatClient) === null || _a === void 0 ? void 0 : _a.logger) === null || _b === void 0 ? void 0 : _b.call(_a, 'info', `Empty messages array, reseting scroll state`, {
|
|
5392
|
+
tags: `message list ${this.mode}`,
|
|
5393
|
+
});
|
|
5377
5394
|
this.resetScrollState();
|
|
5378
5395
|
return;
|
|
5379
5396
|
}
|
|
5397
|
+
(_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`, {
|
|
5398
|
+
tags: `message list ${this.mode}`,
|
|
5399
|
+
});
|
|
5380
5400
|
const currentLatestMessage = messages[messages.length - 1];
|
|
5381
5401
|
this.newMessageReceived(currentLatestMessage);
|
|
5382
5402
|
const currentOldestMessage = messages[0];
|
|
@@ -5460,13 +5480,14 @@ class MessageListComponent {
|
|
|
5460
5480
|
}
|
|
5461
5481
|
}
|
|
5462
5482
|
newMessageReceived(message) {
|
|
5463
|
-
var _a, _b, _c, _d;
|
|
5483
|
+
var _a, _b, _c, _d, _e, _f;
|
|
5464
5484
|
if (!this.latestMessage ||
|
|
5465
5485
|
((_a = this.latestMessage.created_at) === null || _a === void 0 ? void 0 : _a.getTime()) < message.created_at.getTime()) {
|
|
5486
|
+
(_c = (_b = this.chatClientService.chatClient) === null || _b === void 0 ? void 0 : _b.logger) === null || _c === void 0 ? void 0 : _c.call(_b, 'info', `Received new message`, { tags: `message list ${this.mode}` });
|
|
5466
5487
|
this.latestMessage = message;
|
|
5467
5488
|
this.hasNewMessages = true;
|
|
5468
5489
|
this.isNewMessageSentByUser =
|
|
5469
|
-
((
|
|
5490
|
+
((_d = message.user) === null || _d === void 0 ? void 0 : _d.id) === ((_f = (_e = this.chatClientService.chatClient) === null || _e === void 0 ? void 0 : _e.user) === null || _f === void 0 ? void 0 : _f.id);
|
|
5470
5491
|
if (this.isUserScrolled) {
|
|
5471
5492
|
this.unreadMessageCount++;
|
|
5472
5493
|
}
|