@sinequa/assistant 3.1.1 → 3.2.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/chat/chat-message/chat-message.component.d.ts +3 -0
- package/chat/chat-settings-v3/chat-settings-v3.component.d.ts +8 -3
- package/chat/chat.component.d.ts +174 -146
- package/chat/chat.service.d.ts +31 -917
- package/chat/prompt.component.d.ts +21 -0
- package/chat/public-api.d.ts +1 -0
- package/chat/rest-chat.service.d.ts +5 -2
- package/chat/saved-chats/saved-chats.component.d.ts +4 -3
- package/chat/styles/assistant.scss +21 -1
- package/chat/types.d.ts +284 -866
- package/chat/websocket-chat.service.d.ts +16 -12
- package/esm2020/chat/chat-message/chat-message.component.mjs +25 -3
- package/esm2020/chat/chat-reference/chat-reference.component.mjs +3 -3
- package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +22 -24
- package/esm2020/chat/chat.component.mjs +123 -67
- package/esm2020/chat/chat.service.mjs +68 -24
- package/esm2020/chat/prompt.component.mjs +88 -0
- package/esm2020/chat/public-api.mjs +2 -1
- package/esm2020/chat/rest-chat.service.mjs +73 -26
- package/esm2020/chat/saved-chats/saved-chats.component.mjs +37 -7
- package/esm2020/chat/types.mjs +50 -54
- package/esm2020/chat/websocket-chat.service.mjs +116 -56
- package/fesm2015/sinequa-assistant-chat.mjs +583 -251
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2020/sinequa-assistant-chat.mjs +584 -254
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
- package/package.json +4 -2
|
@@ -3,7 +3,7 @@ import { Action } from "@sinequa/components/action";
|
|
|
3
3
|
import { AbstractFacet } from "@sinequa/components/facet";
|
|
4
4
|
import { SearchService } from "@sinequa/components/search";
|
|
5
5
|
import { PrincipalWebService } from "@sinequa/core/web-services";
|
|
6
|
-
import { BehaviorSubject, Subscription, filter,
|
|
6
|
+
import { BehaviorSubject, Subscription, filter, fromEvent, map, merge, switchMap, tap } from "rxjs";
|
|
7
7
|
import { ChatService } from "./chat.service";
|
|
8
8
|
import { InstanceManagerService } from "./instance-manager.service";
|
|
9
9
|
import { WebSocketChatService } from "./websocket-chat.service";
|
|
@@ -18,14 +18,21 @@ import * as i2 from "@angular/forms";
|
|
|
18
18
|
export class ChatComponent extends AbstractFacet {
|
|
19
19
|
constructor() {
|
|
20
20
|
super();
|
|
21
|
+
this.loginService = inject(LoginService);
|
|
22
|
+
this.websocketService = inject(WebSocketChatService);
|
|
23
|
+
this.restService = inject(RestChatService);
|
|
24
|
+
this.instanceManagerService = inject(InstanceManagerService);
|
|
25
|
+
this.searchService = inject(SearchService);
|
|
26
|
+
this.principalService = inject(PrincipalWebService);
|
|
27
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
28
|
+
/** Define the query to use to fetch answers */
|
|
29
|
+
this.query = this.searchService.query;
|
|
21
30
|
/** Define the protocol to be used for this chat instance*/
|
|
22
31
|
this.protocol = "WEBSOCKET";
|
|
23
32
|
/** Map of listeners overriding default registered ones*/
|
|
24
33
|
this.messageHandlers = new Map();
|
|
25
34
|
/** When the assistant answer a user question, automatically scroll down to the bottom of the discussion */
|
|
26
35
|
this.automaticScrollToLastResponse = false;
|
|
27
|
-
this.enableChat = true;
|
|
28
|
-
this.showCredits = true;
|
|
29
36
|
this.customAssistantIcon = '';
|
|
30
37
|
this.data = new EventEmitter();
|
|
31
38
|
this.referenceClicked = new EventEmitter();
|
|
@@ -38,16 +45,10 @@ export class ChatComponent extends AbstractFacet {
|
|
|
38
45
|
this._actions = [];
|
|
39
46
|
this.sub = new Subscription();
|
|
40
47
|
this.changes$ = new BehaviorSubject(undefined);
|
|
41
|
-
this.
|
|
48
|
+
this.firstChangesHandled = false;
|
|
42
49
|
this.isAtBottom = true;
|
|
43
50
|
this.initializationError = false;
|
|
44
|
-
this.
|
|
45
|
-
this.websocketService = inject(WebSocketChatService);
|
|
46
|
-
this.restService = inject(RestChatService);
|
|
47
|
-
this.instanceManagerService = inject(InstanceManagerService);
|
|
48
|
-
this.searchService = inject(SearchService);
|
|
49
|
-
this.principalService = inject(PrincipalWebService);
|
|
50
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
51
|
+
this.enabledUserInput = false;
|
|
51
52
|
this._actions.push(new Action({
|
|
52
53
|
icon: 'fas fa-sync',
|
|
53
54
|
title: 'Reset chat',
|
|
@@ -57,13 +58,14 @@ export class ChatComponent extends AbstractFacet {
|
|
|
57
58
|
ngOnInit() {
|
|
58
59
|
this.sub.add(this.loginService.events.pipe(filter(e => e.type === 'login-complete'), tap(_ => this.instantiateChatService()), map(_ => this.chatService.initChatConfig()), switchMap(() => this.chatService.initConfig$), filter(initConfig => !!initConfig), switchMap(_ => this.chatService.init()), filter(success => !!success), tap(_ => this.onLoadChat()), switchMap(_ => this.chatService.chatConfig$), tap(config => {
|
|
59
60
|
this.config = config;
|
|
61
|
+
this.enabledUserInput = this.config.modeSettings.enabledUserInput;
|
|
60
62
|
this._config.emit(config);
|
|
61
63
|
try {
|
|
62
64
|
this.updateModelDescription();
|
|
63
|
-
if (!this.
|
|
65
|
+
if (!this.firstChangesHandled) {
|
|
64
66
|
this.handleChanges();
|
|
65
67
|
this.addScrollListener();
|
|
66
|
-
this.
|
|
68
|
+
this.firstChangesHandled = true;
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
71
|
catch (error) {
|
|
@@ -99,12 +101,50 @@ export class ChatComponent extends AbstractFacet {
|
|
|
99
101
|
get actions() { return this._actions; }
|
|
100
102
|
handleChanges() {
|
|
101
103
|
const changes = this.changes$.value;
|
|
104
|
+
// If the chat service is a WebSocketChatService, handle the override of the message handlers if exists
|
|
102
105
|
if (changes?.messageHandlers && this.messageHandlers && this.chatService instanceof WebSocketChatService) {
|
|
103
106
|
this.chatService.overrideMessageHandlers(this.messageHandlers);
|
|
104
107
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Initialize the chat with the provided chat messages if exists, otherwise load the default chat
|
|
110
|
+
* Once the chat is initialized (firstChangesHandled is true), allow opening the chat with the new provided messages (if exists)
|
|
111
|
+
*/
|
|
112
|
+
if (!this.firstChangesHandled || changes?.chat) {
|
|
113
|
+
const openChat = () => {
|
|
114
|
+
if (this.messages$.value && this.config.savedChatSettings.enabled) {
|
|
115
|
+
this.chatService.listSavedChat(); // Refresh the list of saved chats
|
|
116
|
+
}
|
|
117
|
+
this.openChat(this.chat.messages);
|
|
118
|
+
};
|
|
119
|
+
this.chat ? openChat() : this.loadDefaultChat();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* If the chat is initialized, the initialization event is "Query", the query changes and the queryChangeShouldTriggerReload function is provided,
|
|
123
|
+
* then the chat should be reloaded if the function returns true
|
|
124
|
+
* Otherwise, the chat should be reloaded by default
|
|
125
|
+
*/
|
|
126
|
+
if (this.firstChangesHandled && changes?.query && this.config.modeSettings.initialization.event === 'Query') {
|
|
127
|
+
const previousQuery = changes.query.previousValue;
|
|
128
|
+
const currentQuery = changes.query.currentValue;
|
|
129
|
+
if (this.queryChangeShouldTriggerReload ? this.queryChangeShouldTriggerReload(previousQuery, currentQuery) : true) {
|
|
130
|
+
this.triggerReloadAfterQueryChange(currentQuery);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
triggerReloadAfterQueryChange(query) {
|
|
135
|
+
const systemMsg = { role: 'system', content: this.config.defaultValues.systemPrompt, additionalProperties: { display: false } };
|
|
136
|
+
const userMsg = { role: 'user', content: ChatService.formatPrompt(this.config.defaultValues.userPrompt, { principal: this.principalService.principal }), additionalProperties: { display: this.config.modeSettings.displayUserPrompt } };
|
|
137
|
+
/**
|
|
138
|
+
* If the provided query text is not empty, then add the user query message to the chat history and invoke the assistant
|
|
139
|
+
* Otherwise, just start a new chat with a warning message inviting the user to perform a full text search to retrieve some results
|
|
140
|
+
*/
|
|
141
|
+
if (!!this.query.text) {
|
|
142
|
+
const userQueryMsg = { role: 'user', content: this.query.text, additionalProperties: { display: this.config.modeSettings.initialization.displayUserQuery, query: this.query, forcedWorkflow: this.config.modeSettings.initialization.forcedWorkflow, isUserInput: true } };
|
|
143
|
+
this.openChat(this.config.modeSettings.sendUserPrompt ? [systemMsg, userMsg, userQueryMsg] : [systemMsg, userQueryMsg]);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const warningMsg = { role: 'assistant', content: "You must perform a full text search to retrieve some results", additionalProperties: { display: true } };
|
|
147
|
+
this.openChat([warningMsg]);
|
|
108
148
|
}
|
|
109
149
|
}
|
|
110
150
|
addScrollListener() {
|
|
@@ -114,7 +154,7 @@ export class ChatComponent extends AbstractFacet {
|
|
|
114
154
|
}));
|
|
115
155
|
}
|
|
116
156
|
updateModelDescription() {
|
|
117
|
-
this.modelDescription = this.chatService.getModel(this.config.
|
|
157
|
+
this.modelDescription = this.chatService.getModel(this.config.defaultValues.service_id, this.config.defaultValues.model_id);
|
|
118
158
|
this.assistantIcon = !!this.customAssistantIcon ? this.customAssistantIcon : 'sq-sinequa';
|
|
119
159
|
switch (this.modelDescription?.provider) {
|
|
120
160
|
case 'Google':
|
|
@@ -141,17 +181,15 @@ export class ChatComponent extends AbstractFacet {
|
|
|
141
181
|
this.chatService.chatHistory = this.chatService.chatHistory.slice(0, this.messageToEdit);
|
|
142
182
|
this.messageToEdit = undefined;
|
|
143
183
|
}
|
|
144
|
-
// Re-attach the $progress and $attachment of the last response to the last assistant's response in the chat history
|
|
145
|
-
this.chatService.chatHistory.at(-1).additionalProperties.$progress = this.messages$.value.at(-1).additionalProperties.$progress;
|
|
146
|
-
this.chatService.chatHistory.at(-1).additionalProperties.$attachment = this.messages$.value.at(-1).additionalProperties.$attachment;
|
|
147
184
|
// Fetch the answer
|
|
148
185
|
this.fetchAnswer(this.question.trim(), this.chatService.chatHistory);
|
|
149
186
|
// Clear the input value in the UI
|
|
150
187
|
this.questionInput.nativeElement.value = '';
|
|
188
|
+
this.questionInput.nativeElement.style.height = `auto`;
|
|
151
189
|
}
|
|
152
190
|
}
|
|
153
191
|
fetchAnswer(question, conversation) {
|
|
154
|
-
const userMsg = { role: 'user', content: question, additionalProperties: { display: true } };
|
|
192
|
+
const userMsg = { role: 'user', content: question, additionalProperties: { display: true, isUserInput: true } };
|
|
155
193
|
const messages = [...conversation, userMsg];
|
|
156
194
|
this.messages$.next(messages);
|
|
157
195
|
this.fetch(messages);
|
|
@@ -208,22 +246,56 @@ export class ChatComponent extends AbstractFacet {
|
|
|
208
246
|
}
|
|
209
247
|
}, 10);
|
|
210
248
|
}
|
|
249
|
+
/**
|
|
250
|
+
* Start a new chat with the defaultValues settings
|
|
251
|
+
* The savedChatId in the chat service will be reset, so that the upcoming saved chat operations will be performed on the fresh new chat
|
|
252
|
+
* If the savedChat feature is enabled, the list of saved chats will be refreshed
|
|
253
|
+
*/
|
|
211
254
|
newChat() {
|
|
212
|
-
this.chatService.
|
|
255
|
+
this.chatService.setSavedChatId(undefined); // Reset the savedChatId
|
|
256
|
+
if (this.config.savedChatSettings.enabled) {
|
|
257
|
+
this.chatService.listSavedChat(); // Refresh the list of saved chats
|
|
258
|
+
}
|
|
213
259
|
this.loadDefaultChat(); // Start a new chat
|
|
214
260
|
}
|
|
261
|
+
/**
|
|
262
|
+
* Start the default chat with the defaultValues settings
|
|
263
|
+
* If the chat is meant to be initialized with event === "Query", the corresponding user query message will be added to the chat history
|
|
264
|
+
*/
|
|
215
265
|
loadDefaultChat() {
|
|
216
|
-
this.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
266
|
+
const systemMsg = { role: 'system', content: this.config.defaultValues.systemPrompt, additionalProperties: { display: false } };
|
|
267
|
+
const userMsg = { role: 'user', content: ChatService.formatPrompt(this.config.defaultValues.userPrompt, { principal: this.principalService.principal }), additionalProperties: { display: this.config.modeSettings.displayUserPrompt } };
|
|
268
|
+
if (this.config.modeSettings.initialization.event === 'Query') {
|
|
269
|
+
// If the provided query text is not empty, then add the user query message to the chat history and invoke the assistant
|
|
270
|
+
// Otherwise, just start a new chat with a warning message inviting the user to perform a full text search to retrieve some results
|
|
271
|
+
if (!!this.query.text) {
|
|
272
|
+
const userQueryMsg = { role: 'user', content: this.query.text, additionalProperties: { display: this.config.modeSettings.initialization.displayUserQuery, query: this.query, forcedWorkflow: this.config.modeSettings.initialization.forcedWorkflow, isUserInput: true } };
|
|
273
|
+
this.openChat(this.config.modeSettings.sendUserPrompt ? [systemMsg, userMsg, userQueryMsg] : [systemMsg, userQueryMsg]);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
const warningMsg = { role: 'assistant', content: "You must perform a full text search to retrieve some results", additionalProperties: { display: true } };
|
|
277
|
+
this.openChat([warningMsg]);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
this.openChat([systemMsg, userMsg]);
|
|
282
|
+
}
|
|
220
283
|
}
|
|
284
|
+
/**
|
|
285
|
+
* Start/open a new chat with the provided messages and chatId
|
|
286
|
+
* If the last message is from the user, a request to the assistant is made to get an answer
|
|
287
|
+
* If the last message is from the assistant, the conversation is loaded right away
|
|
288
|
+
* @param messages The list of messages of the chat
|
|
289
|
+
* @param chatId The id of the chat. If provided (ie. an existing discussion in the saved chat index), update the savedChatId in the chat service for the upcoming saved chat operations
|
|
290
|
+
*/
|
|
221
291
|
openChat(messages, chatId) {
|
|
222
292
|
if (!messages || !Array.isArray(messages)) {
|
|
223
293
|
console.error('Error occurs while trying to load the chat discussion. Invalid messages received :', messages);
|
|
224
294
|
return;
|
|
225
295
|
}
|
|
226
|
-
|
|
296
|
+
if (chatId) {
|
|
297
|
+
this.chatService.setSavedChatId(chatId);
|
|
298
|
+
}
|
|
227
299
|
this.resetChat();
|
|
228
300
|
this.messages$.next(messages);
|
|
229
301
|
this.chatService.chatHistory = messages;
|
|
@@ -236,6 +308,11 @@ export class ChatComponent extends AbstractFacet {
|
|
|
236
308
|
this.terminateFetch();
|
|
237
309
|
}
|
|
238
310
|
}
|
|
311
|
+
/**
|
|
312
|
+
* Reset the chat by clearing the messages and the chat history
|
|
313
|
+
* The question input will be focused after the chat is reset
|
|
314
|
+
* The fetch subscription will be terminated
|
|
315
|
+
*/
|
|
239
316
|
resetChat() {
|
|
240
317
|
if (this.messages$.value) {
|
|
241
318
|
this.messages$.next(undefined); // Reset chat
|
|
@@ -247,8 +324,7 @@ export class ChatComponent extends AbstractFacet {
|
|
|
247
324
|
onLoadChat() {
|
|
248
325
|
this.loading$.next(true);
|
|
249
326
|
this.sub.add(this.chatService.loadSavedChat$
|
|
250
|
-
.pipe(filter(savedChat => !!savedChat), switchMap(savedChat => this.chatService.getSavedChat(savedChat.id)), filter(savedChatHistory => !!savedChatHistory), tap(savedChatHistory => this.openChat(savedChatHistory.
|
|
251
|
-
).subscribe());
|
|
327
|
+
.pipe(filter(savedChat => !!savedChat), switchMap(savedChat => this.chatService.getSavedChat(savedChat.id)), filter(savedChatHistory => !!savedChatHistory), tap(savedChatHistory => this.openChat(savedChatHistory.history, savedChatHistory.id))).subscribe());
|
|
252
328
|
}
|
|
253
329
|
terminateFetch() {
|
|
254
330
|
this.dataSubscription?.unsubscribe();
|
|
@@ -274,60 +350,44 @@ export class ChatComponent extends AbstractFacet {
|
|
|
274
350
|
}
|
|
275
351
|
onKeyUp(event) {
|
|
276
352
|
switch (event.key) {
|
|
277
|
-
case '
|
|
278
|
-
this.
|
|
279
|
-
break;
|
|
280
|
-
case 'ArrowDown':
|
|
281
|
-
this.navigateMessage(1);
|
|
353
|
+
case 'Backspace':
|
|
354
|
+
this.calculateHeight();
|
|
282
355
|
break;
|
|
283
356
|
case 'Enter':
|
|
284
|
-
|
|
357
|
+
if (!event.shiftKey)
|
|
358
|
+
this.submitQuestion();
|
|
359
|
+
this.calculateHeight();
|
|
285
360
|
break;
|
|
286
361
|
default:
|
|
287
362
|
break;
|
|
288
363
|
}
|
|
289
|
-
// Handle Shift + Enter
|
|
290
|
-
if (event.shiftKey && event.key === 'Enter') {
|
|
291
|
-
this.submitQuestion();
|
|
292
|
-
}
|
|
293
364
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
}
|
|
302
|
-
this.currentMessageIndex = (this.currentMessageIndex ?? userMessages.length) + direction;
|
|
303
|
-
if (this.currentMessageIndex < 0) {
|
|
304
|
-
// If the user presses up arrow on the first message, stay at the first message
|
|
305
|
-
this.currentMessageIndex = 0;
|
|
306
|
-
}
|
|
307
|
-
else if (this.currentMessageIndex >= userMessages.length) {
|
|
308
|
-
// If the user presses down arrow on the last previous message, clear the input
|
|
309
|
-
this.currentMessageIndex = undefined;
|
|
310
|
-
this.question = '';
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
this.question = userMessages[this.currentMessageIndex].content;
|
|
365
|
+
calculateHeight() {
|
|
366
|
+
const maxHeight = 170;
|
|
367
|
+
const el = this.questionInput.nativeElement;
|
|
368
|
+
el.style.maxHeight = `${maxHeight}px`;
|
|
369
|
+
el.style.height = 'auto';
|
|
370
|
+
el.style.height = `${el.scrollHeight}px`;
|
|
371
|
+
el.style.overflowY = el.scrollHeight >= maxHeight ? 'scroll' : 'hidden';
|
|
314
372
|
}
|
|
315
373
|
}
|
|
316
374
|
ChatComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
317
|
-
ChatComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatComponent, isStandalone: true, selector: "sq-chat-v3", inputs: { instanceId: "instanceId", query: "query", protocol: "protocol", messageHandlers: "messageHandlers", automaticScrollToLastResponse: "automaticScrollToLastResponse", chat: "chat",
|
|
375
|
+
ChatComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatComponent, isStandalone: true, selector: "sq-chat-v3", inputs: { instanceId: "instanceId", query: "query", queryChangeShouldTriggerReload: "queryChangeShouldTriggerReload", protocol: "protocol", messageHandlers: "messageHandlers", automaticScrollToLastResponse: "automaticScrollToLastResponse", chat: "chat", customAssistantIcon: "customAssistantIcon" }, outputs: { data: "data", referenceClicked: "referenceClicked", openPreview: "openPreview", loading$: "loading", error: "error", _config: "config" }, providers: [
|
|
318
376
|
RestChatService,
|
|
319
377
|
WebSocketChatService
|
|
320
|
-
], queries: [{ propertyName: "loadingTpl", first: true, predicate: ["loadingTpl"], descendants: true }], viewQueries: [{ propertyName: "messageList", first: true, predicate: ["messageList"], descendants: true }, { propertyName: "questionInput", first: true, predicate: ["questionInput"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "\n<ng-container *ngIf=\"!initializationError\">\n <div *ngIf=\"messages$ | async as messages; else loadingTpl || loadingTplDefault\" class=\"h-100 d-flex flex-column\">\n\n <ul class=\"list-group list-group-flush overflow-auto pb-
|
|
378
|
+
], queries: [{ propertyName: "loadingTpl", first: true, predicate: ["loadingTpl"], descendants: true }], viewQueries: [{ propertyName: "messageList", first: true, predicate: ["messageList"], descendants: true }, { propertyName: "questionInput", first: true, predicate: ["questionInput"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "\n<ng-container *ngIf=\"!initializationError\">\n <div *ngIf=\"messages$ | async as messages; else loadingTpl || loadingTplDefault\" class=\"h-100 d-flex flex-column\">\n\n <ul class=\"list-group list-group-flush overflow-auto pe-2 pb-2\" #messageList>\n <ng-container *ngFor=\"let message of messages; let index = index; let last = last\">\n <!-- Regular messages -->\n <li class=\"list-group-item\" *ngIf=\"message.additionalProperties.display\"\n [class.opacity-50]=\"messageToEdit && messageToEdit < index + 1\">\n <sq-chat-message\n [class.sq-user-message]=\"message.role !== 'assistant'\"\n [message]=\"message\"\n [conversation]=\"messages\"\n [assistantIcon]=\"customAssistantIcon || assistantIcon\"\n [streaming]=\"last && (chatService.streaming$ | async)\"\n [canEdit]=\"(loading$ | async) === false && (chatService.streaming$ | async) === false && messageToEdit === undefined && message.role !== 'assistant'\"\n [canRegenerate]=\"(loading$ | async) === false && (chatService.streaming$ | async) === false && messageToEdit === undefined && message.role === 'assistant' && last\"\n [canCopy]=\"!(last && (chatService.streaming$ | async)) && messageToEdit === undefined && message.role === 'assistant'\"\n (edit)=\"editMessage(index)\" (regenerate)=\"regenerateMessage(index)\"\n (referenceClicked)=\"referenceClicked.emit($event)\"\n (openPreview)=\"openPreview.emit($event)\">\n </sq-chat-message>\n </li>\n </ng-container>\n\n <li class=\"list-group-item\" *ngIf=\"(loading$ | async) === true\">\n <ng-container *ngTemplateOutlet=\"loadingTpl || loadingTplDefault\"></ng-container>\n </li>\n </ul>\n\n <div class=\"user-input mt-auto\" *ngIf=\"enabledUserInput\">\n <div class=\"py-2\">\n <ng-container *ngTemplateOutlet=\"inputTpl\"></ng-container>\n <div class=\"text-end small text-muted px-3\" *ngIf=\"!!config?.globalSettings?.disclaimer\">\n {{ config?.globalSettings?.disclaimer }}\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n\n<!-- NG TEMPLATES-->\n\n<ng-template #loadingTplDefault>\n <div class=\"spinner-grow text-primary d-block mx-auto my-5\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</ng-template>\n\n<ng-template #inputTpl>\n <div class=\"px-3 py-1\">\n <div class=\"ast-input-container\">\n <button disabled class=\"btn btn-light\">\n <i class=\"fas fa-search\"></i>\n </button>\n <textarea #questionInput rows=\"1\"\n type=\"text\" class=\"form-control\"\n placeholder=\"Ask something\" autofocus\n [(ngModel)]=\"question\"\n (keyup)=\"onKeyUp($event)\"\n (keydown)=\"calculateHeight()\"\n [disabled]=\"(loading$ | async) || (chatService.streaming$ | async)\">\n </textarea>\n <button\n *ngIf=\"!(chatService.streaming$ | async) && !(loading$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Send message\"\n (click)=\"submitQuestion()\">\n <i class=\"fas fa-paper-plane\"></i>\n </button>\n <!--<button\n *ngIf=\"(chatService.streaming$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Stop generating\"\n (click)=\"terminateFetch()\">\n <i class=\"fas fa-stop\"></i>\n </button>-->\n <button\n *ngIf=\"messageToEdit\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Cancel edition\"\n (click)=\"messageToEdit = undefined; question = ''\">\n <i class=\"fas fa-undo-alt\"></i>\n </button>\n <div class=\"sq-floating-scroll\" *ngIf=\"!isAtBottom\">\n <button class=\"btn shadow\" (click)=\"scrollDown()\">\n <i class=\"fas fa-angle-double-down\"></i>\n </button>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference,:host ::ng-deep .attachment .reference{position:relative;bottom:var(--ast-reference-bottom, .3em);font-weight:var(--ast-reference-font-weight, bold);padding:var(--ast-reference-padding, 0 .2em);margin:var(--ast-reference-margin, 0 .1em);border-radius:var(--ast-reference-border-radius, .2em);background-color:var(--ast-reference-background-color, lightblue);color:var(--ast-reference-color, black)}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference{font-size:var(--ast-reference-message-font-size, .7em)}:host ::ng-deep .attachment .reference{font-size:var(--ast-reference-attachment-font-size, 13px)}:host{font-size:.875rem}:host>div>.user-input>div:not(.progress),:host>div>ul>li{width:var(--ast-chat-container-width, 100%);max-width:100%;margin-left:auto;margin-right:auto}:host>div>ul{padding-top:var(--ast-chat-padding-top, 0);padding-bottom:var(--ast-chat-padding-bottom, 0)}li.attachment>p{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:3}li.attachment.expanded>p{display:block}.progress{--bs-progress-height: 3px}.progress.disabled{--bs-progress-height: 20px;--bs-progress-bar-bg: var(--bs-danger)}.user-input{z-index:1}.user-input ul.list-group{max-height:30vh}.form-control:disabled{background-color:#ededed}a.disabled{cursor:default;opacity:.5}.no-max-height{max-height:initial!important}.sq-floating-scroll{position:absolute;right:50%;bottom:75px;text-align:center}.sq-floating-scroll .btn{background-color:#fff}.sq-floating-scroll .btn:hover{background-color:#fff;opacity:.9}.ast-input-container{display:flex;align-items:end;background-color:var(--ast-input-bg, #F8F8F8);border-radius:var(--ast-size-3, .75rem)}.ast-input-container>i{padding-left:var(--ast-size-3, .75rem);color:var(--ast-muted-color, rgba(33, 37, 41, .75))}.ast-input-container textarea{padding-left:var(--ast-size-3, .75rem);padding-right:var(--ast-size-3, .75rem);resize:none}.ast-input-container textarea,.ast-input-container button,.ast-input-container button:hover{background-color:transparent;border:0}.ast-input-container button:hover{color:var(--ast-primary-color, #005DA7)}.ast-input-container button:not(:hover){color:var(--ast-muted-color, rgba(33, 37, 41, .75))}sq-chat-message.sq-user-message{float:var(--ast-user-message-float, none)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ChatMessageComponent, selector: "sq-chat-message", inputs: ["message", "conversation", "assistantIcon", "streaming", "canEdit", "canRegenerate", "canCopy"], outputs: ["referenceClicked", "edit", "regenerate", "openPreview"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
321
379
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatComponent, decorators: [{
|
|
322
380
|
type: Component,
|
|
323
381
|
args: [{ selector: 'sq-chat-v3', providers: [
|
|
324
382
|
RestChatService,
|
|
325
383
|
WebSocketChatService
|
|
326
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormsModule, ChatMessageComponent], template: "\n<ng-container *ngIf=\"!initializationError\">\n <div *ngIf=\"messages$ | async as messages; else loadingTpl || loadingTplDefault\" class=\"h-100 d-flex flex-column\">\n\n <ul class=\"list-group list-group-flush overflow-auto pb-
|
|
384
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormsModule, ChatMessageComponent], template: "\n<ng-container *ngIf=\"!initializationError\">\n <div *ngIf=\"messages$ | async as messages; else loadingTpl || loadingTplDefault\" class=\"h-100 d-flex flex-column\">\n\n <ul class=\"list-group list-group-flush overflow-auto pe-2 pb-2\" #messageList>\n <ng-container *ngFor=\"let message of messages; let index = index; let last = last\">\n <!-- Regular messages -->\n <li class=\"list-group-item\" *ngIf=\"message.additionalProperties.display\"\n [class.opacity-50]=\"messageToEdit && messageToEdit < index + 1\">\n <sq-chat-message\n [class.sq-user-message]=\"message.role !== 'assistant'\"\n [message]=\"message\"\n [conversation]=\"messages\"\n [assistantIcon]=\"customAssistantIcon || assistantIcon\"\n [streaming]=\"last && (chatService.streaming$ | async)\"\n [canEdit]=\"(loading$ | async) === false && (chatService.streaming$ | async) === false && messageToEdit === undefined && message.role !== 'assistant'\"\n [canRegenerate]=\"(loading$ | async) === false && (chatService.streaming$ | async) === false && messageToEdit === undefined && message.role === 'assistant' && last\"\n [canCopy]=\"!(last && (chatService.streaming$ | async)) && messageToEdit === undefined && message.role === 'assistant'\"\n (edit)=\"editMessage(index)\" (regenerate)=\"regenerateMessage(index)\"\n (referenceClicked)=\"referenceClicked.emit($event)\"\n (openPreview)=\"openPreview.emit($event)\">\n </sq-chat-message>\n </li>\n </ng-container>\n\n <li class=\"list-group-item\" *ngIf=\"(loading$ | async) === true\">\n <ng-container *ngTemplateOutlet=\"loadingTpl || loadingTplDefault\"></ng-container>\n </li>\n </ul>\n\n <div class=\"user-input mt-auto\" *ngIf=\"enabledUserInput\">\n <div class=\"py-2\">\n <ng-container *ngTemplateOutlet=\"inputTpl\"></ng-container>\n <div class=\"text-end small text-muted px-3\" *ngIf=\"!!config?.globalSettings?.disclaimer\">\n {{ config?.globalSettings?.disclaimer }}\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n\n<!-- NG TEMPLATES-->\n\n<ng-template #loadingTplDefault>\n <div class=\"spinner-grow text-primary d-block mx-auto my-5\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n</ng-template>\n\n<ng-template #inputTpl>\n <div class=\"px-3 py-1\">\n <div class=\"ast-input-container\">\n <button disabled class=\"btn btn-light\">\n <i class=\"fas fa-search\"></i>\n </button>\n <textarea #questionInput rows=\"1\"\n type=\"text\" class=\"form-control\"\n placeholder=\"Ask something\" autofocus\n [(ngModel)]=\"question\"\n (keyup)=\"onKeyUp($event)\"\n (keydown)=\"calculateHeight()\"\n [disabled]=\"(loading$ | async) || (chatService.streaming$ | async)\">\n </textarea>\n <button\n *ngIf=\"!(chatService.streaming$ | async) && !(loading$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Send message\"\n (click)=\"submitQuestion()\">\n <i class=\"fas fa-paper-plane\"></i>\n </button>\n <!--<button\n *ngIf=\"(chatService.streaming$ | async)\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Stop generating\"\n (click)=\"terminateFetch()\">\n <i class=\"fas fa-stop\"></i>\n </button>-->\n <button\n *ngIf=\"messageToEdit\"\n type=\"button\"\n class=\"btn btn-light ms-2\"\n title=\"Cancel edition\"\n (click)=\"messageToEdit = undefined; question = ''\">\n <i class=\"fas fa-undo-alt\"></i>\n </button>\n <div class=\"sq-floating-scroll\" *ngIf=\"!isAtBottom\">\n <button class=\"btn shadow\" (click)=\"scrollDown()\">\n <i class=\"fas fa-angle-double-down\"></i>\n </button>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference,:host ::ng-deep .attachment .reference{position:relative;bottom:var(--ast-reference-bottom, .3em);font-weight:var(--ast-reference-font-weight, bold);padding:var(--ast-reference-padding, 0 .2em);margin:var(--ast-reference-margin, 0 .1em);border-radius:var(--ast-reference-border-radius, .2em);background-color:var(--ast-reference-background-color, lightblue);color:var(--ast-reference-color, black)}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference{font-size:var(--ast-reference-message-font-size, .7em)}:host ::ng-deep .attachment .reference{font-size:var(--ast-reference-attachment-font-size, 13px)}:host{font-size:.875rem}:host>div>.user-input>div:not(.progress),:host>div>ul>li{width:var(--ast-chat-container-width, 100%);max-width:100%;margin-left:auto;margin-right:auto}:host>div>ul{padding-top:var(--ast-chat-padding-top, 0);padding-bottom:var(--ast-chat-padding-bottom, 0)}li.attachment>p{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:3}li.attachment.expanded>p{display:block}.progress{--bs-progress-height: 3px}.progress.disabled{--bs-progress-height: 20px;--bs-progress-bar-bg: var(--bs-danger)}.user-input{z-index:1}.user-input ul.list-group{max-height:30vh}.form-control:disabled{background-color:#ededed}a.disabled{cursor:default;opacity:.5}.no-max-height{max-height:initial!important}.sq-floating-scroll{position:absolute;right:50%;bottom:75px;text-align:center}.sq-floating-scroll .btn{background-color:#fff}.sq-floating-scroll .btn:hover{background-color:#fff;opacity:.9}.ast-input-container{display:flex;align-items:end;background-color:var(--ast-input-bg, #F8F8F8);border-radius:var(--ast-size-3, .75rem)}.ast-input-container>i{padding-left:var(--ast-size-3, .75rem);color:var(--ast-muted-color, rgba(33, 37, 41, .75))}.ast-input-container textarea{padding-left:var(--ast-size-3, .75rem);padding-right:var(--ast-size-3, .75rem);resize:none}.ast-input-container textarea,.ast-input-container button,.ast-input-container button:hover{background-color:transparent;border:0}.ast-input-container button:hover{color:var(--ast-primary-color, #005DA7)}.ast-input-container button:not(:hover){color:var(--ast-muted-color, rgba(33, 37, 41, .75))}sq-chat-message.sq-user-message{float:var(--ast-user-message-float, none)}\n"] }]
|
|
327
385
|
}], ctorParameters: function () { return []; }, propDecorators: { instanceId: [{
|
|
328
386
|
type: Input
|
|
329
387
|
}], query: [{
|
|
330
388
|
type: Input
|
|
389
|
+
}], queryChangeShouldTriggerReload: [{
|
|
390
|
+
type: Input
|
|
331
391
|
}], protocol: [{
|
|
332
392
|
type: Input
|
|
333
393
|
}], messageHandlers: [{
|
|
@@ -336,10 +396,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
336
396
|
type: Input
|
|
337
397
|
}], chat: [{
|
|
338
398
|
type: Input
|
|
339
|
-
}], enableChat: [{
|
|
340
|
-
type: Input
|
|
341
|
-
}], showCredits: [{
|
|
342
|
-
type: Input
|
|
343
399
|
}], customAssistantIcon: [{
|
|
344
400
|
type: Input
|
|
345
401
|
}], data: [{
|
|
@@ -366,4 +422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
366
422
|
type: ContentChild,
|
|
367
423
|
args: ['loadingTpl']
|
|
368
424
|
}] } });
|
|
369
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBOEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFBRSxtQkFBbUIsRUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFP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QkFBcEIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO3VCQUFDLFNBQVM7Z0JBQ1AsS0FBSztzQkFBZCxNQUFNO2dCQUNXLE9BQU87c0JBQXhCLE1BQU07dUJBQUMsUUFBUTtnQkFFVSxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0ksYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUVFLFVBQVU7c0JBQXJDLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL2FjdGlvblwiO1xuaW1wb3J0IHsgQWJzdHJhY3RGYWNldCB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL2ZhY2V0XCI7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvc2VhcmNoXCI7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2FwcC11dGlsc1wiO1xuaW1wb3J0IHsgUHJpbmNpcGFsV2ViU2VydmljZSwgUmVjb3JkIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZmlsdGVyLCBmaW5hbGl6ZSwgZnJvbUV2ZW50LCBtYXAsIG1lcmdlLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gXCIuL2NoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdENvbnRleHRBdHRhY2htZW50LCBDaGF0Q29uZmlnLCBDaGF0TWVzc2FnZSwgR2xsbU1vZGVsRGVzY3JpcHRpb24sIE1lc3NhZ2VIYW5kbGVyLCBSYXdNZXNzYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEluc3RhbmNlTWFuYWdlclNlcnZpY2UgfSBmcm9tIFwiLi9pbnN0YW5jZS1tYW5hZ2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFdlYlNvY2tldENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4vd2Vic29ja2V0LWNoYXQuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2VDb21wb25lbnQgfSBmcm9tIFwiLi9jaGF0LW1lc3NhZ2UvY2hhdC1tZXNzYWdlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IExvZ2luU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb3JlL2xvZ2luXCI7XG5pbXBvcnQgeyBSZXN0Q2hhdFNlcnZpY2UgfSBmcm9tIFwiLi9yZXN0LWNoYXQuc2VydmljZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRDaGF0IHtcbiAgbWVzc2FnZXM6IFJhd01lc3NhZ2VbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3EtY2hhdC12MycsIC8vIG1hbmRhdG9yeSBzaW5jZSBAc2luZXF1YS9jb21wb25lbnRzIGFscmVhZHkgaGFzIHRoZSBzYW1lIHRhZy1uYW1lIFwic3EtY2hhdFwiXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBSZXN0Q2hhdFNlcnZpY2UsXG4gICAgV2ViU29ja2V0Q2hhdFNlcnZpY2VcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBDaGF0TWVzc2FnZUNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0RmFjZXQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqIERlZmluZSB0aGUga2V5IGJhc2VkIG9uIGl0LCB0aGUgY2hhdCBzZXJ2aWNlIGluc3RhbmNlIHdpbGwgYmUgc3RvcmVkICovXG4gIEBJbnB1dCgpIGluc3RhbmNlSWQ6IHN0cmluZztcbiAgLyoqIERlZmluZSB0aGUgcXVlcnkgdG8gdXNlIHRvIGZldGNoIGFuc3dlcnMgKi9cbiAgQElucHV0KCkgcXVlcnk/OiBRdWVyeTtcbiAgLyoqIERlZmluZSB0aGUgcHJvdG9jb2wgdG8gYmUgdXNlZCBmb3IgdGhpcyBjaGF0IGluc3RhbmNlKi9cbiAgQElucHV0KCkgcHJvdG9jb2w6ICdSRVNUJyB8ICdXRUJTT0NLRVQnID0gXCJXRUJTT0NLRVRcIjtcbiAgLyoqIE1hcCBvZiBsaXN0ZW5lcnMgb3ZlcnJpZGluZyBkZWZhdWx0IHJlZ2lzdGVyZWQgb25lcyovXG4gIEBJbnB1dCgpIG1lc3NhZ2VIYW5kbGVyczogTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG4gIC8qKiBXaGVuIHRoZSBhc3Npc3RhbnQgYW5zd2VyIGEgdXNlciBxdWVzdGlvbiwgYXV0b21hdGljYWxseSBzY3JvbGwgZG93biB0byB0aGUgYm90dG9tIG9mIHRoZSBkaXNjdXNzaW9uICovXG4gIEBJbnB1dCgpIGF1dG9tYXRpY1Njcm9sbFRvTGFzdFJlc3BvbnNlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNoYXQ/OiBJbml0Q2hhdDtcbiAgQElucHV0KCkgZW5hYmxlQ2hhdCA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDcmVkaXRzID0gdHJ1ZTtcbiAgQElucHV0KCkgY3VzdG9tQXNzaXN0YW50SWNvbiA9ICcnO1xuICBAT3V0cHV0KCkgZGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2VbXT4oKTtcbiAgQE91dHB1dCgpIHJlZmVyZW5jZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcbiAgQE91dHB1dCgpIG9wZW5QcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIEBPdXRwdXQoXCJsb2FkaW5nXCIpIGxvYWRpbmckID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG4gIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KFwiY29uZmlnXCIpIF9jb25maWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWVzc2FnZUxpc3QnKSBtZXNzYWdlTGlzdD86IEVsZW1lbnRSZWY8SFRNTFVMaXN0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uSW5wdXQnKSBxdWVzdGlvbklucHV0PzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKCdsb2FkaW5nVHBsJykgbG9hZGluZ1RwbD86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBjb25maWc6IENoYXRDb25maWc7XG4gIG1lc3NhZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhdE1lc3NhZ2VbXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBxdWVzdGlvbiA9ICcnO1xuXG4gIF9hY3Rpb25zOiBBY3Rpb25bXSA9IFtdO1xuXG4gIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgZGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBWYXJpYWJsZXMgdGhhdCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgbW9kZWwgaW4gdXNlICovXG4gIG1vZGVsRGVzY3JpcHRpb24/OiBHbGxtTW9kZWxEZXNjcmlwdGlvbjtcbiAgYXNzaXN0YW50SWNvbjogc3RyaW5nO1xuICBwcml2YWN5VXJsOiBzdHJpbmc7XG5cbiAgbWVzc2FnZVRvRWRpdD86IG51bWJlcjtcbiAgY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNpbXBsZUNoYW5nZXMgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGN1cnJlbnRNZXNzYWdlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaGFuZGxlRmlyc3RDaGFuZ2VzID0gZmFsc2U7XG4gIGlzQXRCb3R0b20gPSB0cnVlO1xuICBpbml0aWFsaXphdGlvbkVycm9yID0gZmFsc2U7XG5cbiAgcHVibGljIGxvZ2luU2VydmljZSA9IGluamVjdChMb2dpblNlcnZpY2UpO1xuICBwdWJsaWMgd2Vic29ja2V0U2VydmljZSA9IGluamVjdChXZWJTb2NrZXRDaGF0U2VydmljZSk7XG4gIHB1YmxpYyByZXN0U2VydmljZSA9IGluamVjdChSZXN0Q2hhdFNlcnZpY2UpO1xuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIHNlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gIHB1YmxpYyBwcmluY2lwYWxTZXJ2aWNlID0gaW5qZWN0KFByaW5jaXBhbFdlYlNlcnZpY2UpO1xuICBwdWJsaWMgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWN0aW9ucy5wdXNoKG5ldyBBY3Rpb24oe1xuICAgICAgaWNvbjogJ2ZhcyBmYS1zeW5jJyxcbiAgICAgIHRpdGxlOiAnUmVzZXQgY2hhdCcsXG4gICAgICBhY3Rpb246ICgpID0+IHRoaXMubG9hZERlZmF1bHRDaGF0KClcbiAgICB9KSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Yi5hZGQoXG4gICAgICB0aGlzLmxvZ2luU2VydmljZS5ldmVudHMucGlwZShcbiAgICAgICAgZmlsdGVyKGUgPT4gZS50eXBlID09PSAnbG9naW4tY29tcGxldGUnKSxcbiAgICAgICAgdGFwKF8gPT4gdGhpcy5pbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCkpLFxuICAgICAgICBtYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXRDaGF0Q29uZmlnKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jaGF0U2VydmljZS5pbml0Q29uZmlnJCksXG4gICAgICAgIGZpbHRlcihpbml0Q29uZmlnID0+ICEhaW5pdENvbmZpZyksXG4gICAgICAgIHN3aXRjaE1hcChfID0+IHRoaXMuY2hhdFNlcnZpY2UuaW5pdCgpKSxcbiAgICAgICAgZmlsdGVyKHN1Y2Nlc3MgPT4gISFzdWNjZXNzKSxcbiAgICAgICAgdGFwKF8gPT4gdGhpcy5vbkxvYWRDaGF0KCkpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRDb25maWckKSxcbiAgICAgICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWchO1xuICAgICAgICAgIHRoaXMuX2NvbmZpZy5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZWxEZXNjcmlwdGlvbigpO1xuICAgICAgICAgICAgaWYoIXRoaXMuaGFuZGxlRmlyc3RDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlcygpO1xuICAgICAgICAgICAgICB0aGlzLmFkZFNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmlyc3RDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXphdGlvbkVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5jaGFuZ2VzJC5uZXh0KGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xuICAgICAgY2FzZSAnUkVTVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLnJlc3RTZXJ2aWNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dFQlNPQ0tFVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLndlYnNvY2tldFNlcnZpY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZm91bmQgYSBDaGF0U2VydmljZSBpbXBsZW1lbnRhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBwcm90b2NvbDogJyR7dGhpcy5wcm90b2NvbH0nYCk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0Q2hhdEluc3RhbmNlSWQodGhpcy5pbnN0YW5jZUlkKTtcbiAgICB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2Uuc3RvcmVJbnN0YW5jZSh0aGlzLmluc3RhbmNlSWQsIHRoaXMuY2hhdFNlcnZpY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7IHJldHVybiB0aGlzLl9hY3Rpb25zOyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2VzKCkge1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNoYW5nZXMkLnZhbHVlO1xuICAgIGlmIChjaGFuZ2VzPy5tZXNzYWdlSGFuZGxlcnMgJiYgdGhpcy5tZXNzYWdlSGFuZGxlcnMgJiYgdGhpcy5jaGF0U2VydmljZSBpbnN0YW5jZW9mIFdlYlNvY2tldENoYXRTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLm92ZXJyaWRlTWVzc2FnZUhhbmRsZXJzKHRoaXMubWVzc2FnZUhhbmRsZXJzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VzJC52YWx1ZSB8fCBjaGFuZ2VzPy5jaGF0KSB7XG4gICAgICAvLyBMb2FkIHRoZSBjaGF0XG4gICAgICB0aGlzLmNoYXQgPyB0aGlzLm9wZW5DaGF0KHRoaXMuY2hhdC5tZXNzYWdlcykgOiB0aGlzLmxvYWREZWZhdWx0Q2hhdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU2Nyb2xsTGlzdGVuZXIoKSB7XG4gICAgdGhpcy5zdWIuYWRkKFxuICAgICAgbWVyZ2UodGhpcy5sb2FkaW5nJCwgdGhpcy5tZXNzYWdlcyQsIHRoaXMuY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCwgZnJvbUV2ZW50KHRoaXMubWVzc2FnZUxpc3QhLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0F0Qm90dG9tID0gdGhpcy50b2dnbGVTY3JvbGxCdXR0b25WaXNpYmlsaXR5KCk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZU1vZGVsRGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5tb2RlbERlc2NyaXB0aW9uID0gdGhpcy5jaGF0U2VydmljZS5nZXRNb2RlbCh0aGlzLmNvbmZpZy5zZXJ2aWNlU2V0dGluZ3Muc2VydmljZV9pZCwgdGhpcy5jb25maWcuc2VydmljZVNldHRpbmdzLm1vZGVsX2lkKTtcbiAgICB0aGlzLmFzc2lzdGFudEljb24gPSAhIXRoaXMuY3VzdG9tQXNzaXN0YW50SWNvbiA/IHRoaXMuY3VzdG9tQXNzaXN0YW50SWNvbiA6ICdzcS1zaW5lcXVhJztcbiAgICBzd2l0Y2godGhpcy5tb2RlbERlc2NyaXB0aW9uPy5wcm92aWRlcikge1xuICAgICAgY2FzZSAnR29vZ2xlJzpcbiAgICAgICAgdGhpcy5wcml2YWN5VXJsID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXp1cmVPcGVuQUknOlxuICAgICAgICB0aGlzLnByaXZhY3lVcmwgPSAnaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2xlZ2FsL2NvZ25pdGl2ZS1zZXJ2aWNlcy9vcGVuYWkvZGF0YS1wcml2YWN5JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdPcGVuQUknOlxuICAgICAgICB0aGlzLnByaXZhY3lVcmwgPSAnaHR0cHM6Ly9vcGVuYWkuY29tL2VudGVycHJpc2UtcHJpdmFjeSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQ29oZXJlJzpcbiAgICAgICAgdGhpcy5wcml2YWN5VXJsID0gJ2h0dHBzOi8vY29oZXJlLmNvbS9zZWN1cml0eSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzdWJtaXRRdWVzdGlvbigpIHtcbiAgICBpZih0aGlzLnF1ZXN0aW9uLnRyaW0oKSAmJiB0aGlzLm1lc3NhZ2VzJC52YWx1ZSAmJiB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5KSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlVG9FZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXNzYWdlcyBpbiB0aGUgVUlcbiAgICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dCh0aGlzLm1lc3NhZ2VzJC52YWx1ZS5zbGljZSgwLCB0aGlzLm1lc3NhZ2VUb0VkaXQpKTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSByYXcgbWVzc2FnZXMgaW4gdGhlIGNoYXQgaGlzdG9yeSB3aGljaCBpcyB0aGUgY2xlYW4gdmVyc2lvbiB1c2VkIHRvIG1ha2UgdGhlIG5leHQgcmVxdWVzdFxuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5ID0gdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeS5zbGljZSgwLCB0aGlzLm1lc3NhZ2VUb0VkaXQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBSZS1hdHRhY2ggdGhlICRwcm9ncmVzcyBhbmQgJGF0dGFjaG1lbnQgb2YgdGhlIGxhc3QgcmVzcG9uc2UgdG8gdGhlIGxhc3QgYXNzaXN0YW50J3MgcmVzcG9uc2UgaW4gdGhlIGNoYXQgaGlzdG9yeVxuICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeS5hdCgtMSkhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRwcm9ncmVzcyA9IHRoaXMubWVzc2FnZXMkLnZhbHVlLmF0KC0xKSEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzO1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeS5hdCgtMSkhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRhdHRhY2htZW50ID0gdGhpcy5tZXNzYWdlcyQudmFsdWUuYXQoLTEpIS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudDtcbiAgICAgIC8vIEZldGNoIHRoZSBhbnN3ZXJcbiAgICAgIHRoaXMuZmV0Y2hBbnN3ZXIodGhpcy5xdWVzdGlvbi50cmltKCksIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhKTtcbiAgICAgIC8vIENsZWFyIHRoZSBpbnB1dCB2YWx1ZSBpbiB0aGUgVUlcbiAgICAgIHRoaXMucXVlc3Rpb25JbnB1dCEubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hBbnN3ZXIocXVlc3Rpb246IHN0cmluZywgY29udmVyc2F0aW9uOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgY29uc3QgdXNlck1zZyA9IHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IHF1ZXN0aW9uLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IFsuLi5jb252ZXJzYXRpb24sIHVzZXJNc2ddO1xuICAgIHRoaXMubWVzc2FnZXMkLm5leHQobWVzc2FnZXMpO1xuICAgIHRoaXMuZmV0Y2gobWVzc2FnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgbGlzdCBvZiBtZXNzYWdlcywgZmV0Y2ggdGhlIHNlcnZlciBmb3IgYSBjb250aW51YXRpb24gYW5kIHVwZGF0ZXNcbiAgICogdGhlIGxpc3Qgb2YgbWVzc2FnZXMgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBtZXNzYWdlc1xuICAgKi9cbiAgcHVibGljIGZldGNoKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5jaGF0U2VydmljZS5mZXRjaChtZXNzYWdlcywgdGhpcy5xdWVyeSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiByZXMgPT4gdGhpcy51cGRhdGVEYXRhKHJlcy5oaXN0b3J5KSxcbiAgICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgICAgdGhpcy50ZXJtaW5hdGVGZXRjaCgpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB0aGlzLmVycm9yLmVtaXQoZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYodGhpcy5hdXRvbWF0aWNTY3JvbGxUb0xhc3RSZXNwb25zZSkge1xuICAgICAgdGhpcy5zY3JvbGxEb3duKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgVUkgd2l0aCB0aGUgbmV3IG1lc3NhZ2VzXG4gICAqIEBwYXJhbSBtZXNzYWdlc1xuICAgKi9cbiAgdXBkYXRlRGF0YShtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSkge1xuICAgIHRoaXMubWVzc2FnZXMkLm5leHQobWVzc2FnZXMpO1xuICAgIHRoaXMuZGF0YS5lbWl0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHRoaXMucXVlc3Rpb24gPSAnJztcbiAgICBpZih0aGlzLmF1dG9tYXRpY1Njcm9sbFRvTGFzdFJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnNjcm9sbERvd24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZVNjcm9sbEJ1dHRvblZpc2liaWxpdHkoKTogYm9vbGVhbiB7XG4gICAgaWYodGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgLSB0aGlzLm1lc3NhZ2VMaXN0Py5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAtIDEpIDw9IHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHNjcm9sbERvd24oKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZih0aGlzLm1lc3NhZ2VMaXN0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMubWVzc2FnZUxpc3QubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbiAgbmV3Q2hhdCgpIHtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmxpc3RTYXZlZENoYXQoKTsgLy8gUmVmcmVzaCB0aGUgbGlzdCBvZiBzYXZlZCBjaGF0c1xuICAgIHRoaXMubG9hZERlZmF1bHRDaGF0KCk7IC8vIFN0YXJ0IGEgbmV3IGNoYXRcbiAgfVxuXG4gIGxvYWREZWZhdWx0Q2hhdCgpIHtcbiAgICB0aGlzLm9wZW5DaGF0KFtcbiAgICAgIHtyb2xlOiAnc3lzdGVtJywgY29udGVudDogdGhpcy5jb25maWcudWlTZXR0aW5ncy5zeXN0ZW1Qcm9tcHQsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogZmFsc2V9fSxcbiAgICAgIHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IENoYXRTZXJ2aWNlLmZvcm1hdFByb21wdCh0aGlzLmNvbmZpZy51aVNldHRpbmdzLnVzZXJQcm9tcHQsIHtwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWx9KSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlfX0sXG4gICAgXSk7XG4gIH1cblxuICBvcGVuQ2hhdChtZXNzYWdlczogUmF3TWVzc2FnZVtdLCBjaGF0SWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoIW1lc3NhZ2VzIHx8ICFBcnJheS5pc0FycmF5KG1lc3NhZ2VzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byBsb2FkIHRoZSBjaGF0IGRpc2N1c3Npb24uIEludmFsaWQgbWVzc2FnZXMgcmVjZWl2ZWQgOicsIG1lc3NhZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jaGF0U2VydmljZS5zZXRTYXZlZENoYXRJZChjaGF0SWQgfHwgQ2hhdFNlcnZpY2UuZ2VuZXJhdGVHVUlEKCkpO1xuICAgIHRoaXMucmVzZXRDaGF0KCk7XG4gICAgdGhpcy5tZXNzYWdlcyQubmV4dChtZXNzYWdlcyk7XG4gICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IG1lc3NhZ2VzO1xuICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXMuYXQoLTEpO1xuICAgIGlmKGxhc3RNZXNzYWdlICYmIGxhc3RNZXNzYWdlLnJvbGUgPT09ICd1c2VyJykge1xuICAgICAgdGhpcy5mZXRjaChtZXNzYWdlcyk7IC8vIElmIHRoZSBsYXN0IG1lc3NhZ2UgaWYgZnJvbSBhIHVzZXIsIGFuIGFuc3dlciBmcm9tIHRoZSBhc3Npc3RhbnQgaXMgZXhwZWN0ZWRcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGEobWVzc2FnZXMpOyAvLyBJZiB0aGUgbGFzdCBtZXNzYWdlIGlmIGZyb20gdGhlIGFzc2lzdGFudCwgd2UgY2FuIGxvYWQgdGhlIGNvbnZlcnNhdGlvbiByaWdodCBhd2F5XG4gICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRDaGF0KCkge1xuICAgIGlmKHRoaXMubWVzc2FnZXMkLnZhbHVlKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KHVuZGVmaW5lZCk7IC8vIFJlc2V0IGNoYXRcbiAgICB9XG4gICAgdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSA9IHVuZGVmaW5lZDsgLy8gUmVzZXQgY2hhdCBoaXN0b3J5XG4gICAgdGhpcy5xdWVzdGlvbiA9ICcnO1xuICAgIHRoaXMudGVybWluYXRlRmV0Y2goKTtcbiAgfVxuXG4gIG9uTG9hZENoYXQoKSB7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuc3ViLmFkZChcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UubG9hZFNhdmVkQ2hhdCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKHNhdmVkQ2hhdCA9PiAhIXNhdmVkQ2hhdCksXG4gICAgICAgICAgc3dpdGNoTWFwKHNhdmVkQ2hhdCA9PiB0aGlzLmNoYXRTZXJ2aWNlLmdldFNhdmVkQ2hhdChzYXZlZENoYXQhLmlkKSksXG4gICAgICAgICAgZmlsdGVyKHNhdmVkQ2hhdEhpc3RvcnkgPT4gISFzYXZlZENoYXRIaXN0b3J5KSxcbiAgICAgICAgICB0YXAoc2F2ZWRDaGF0SGlzdG9yeSA9PiB0aGlzLm9wZW5DaGF0KHNhdmVkQ2hhdEhpc3RvcnkhLkhpc3RvcnksIHNhdmVkQ2hhdEhpc3RvcnkhLmlkKSksXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5jaGF0U2VydmljZS5saXN0U2F2ZWRDaGF0KCkpIC8vIFJlZnJlc2ggdGhlIGxpc3Qgb2Ygc2F2ZWQgY2hhdHNcbiAgICAgICAgKS5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICB0ZXJtaW5hdGVGZXRjaCgpIHtcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnF1ZXN0aW9uSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9KVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGVkaXRNZXNzYWdlKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSBpbmRleDtcbiAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSFbaW5kZXhdLmNvbnRlbnQ7XG4gICAgdGhpcy5xdWVzdGlvbklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICByZWdlbmVyYXRlTWVzc2FnZShpbmRleDogbnVtYmVyKSB7XG4gICAgIC8vIERlZmluZSB0aGUgY2hhdCBoaXN0b3J5IGJhc2VkIG9uIHdoaWNoIHRoZSBhc3Npc3RhbnQgd2lsbCBnZW5lcmF0ZSBhIG5ldyBhbnN3ZXJcbiAgICBjb25zdCBzbGljZWRNZXNzYWdlcyA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhLnNsaWNlKDAsIGluZGV4KTtcbiAgICAvLyBBY2NvcmRpbmdseSB1cGRhdGUgdGhlIG1lc3NhZ2VzIGluIHRoZSBVSVxuICAgIHRoaXMubWVzc2FnZXMkLm5leHQoc2xpY2VkTWVzc2FnZXMpO1xuICAgIC8vIEZldGNoIHRoZSBhbnN3ZXJcbiAgICB0aGlzLmZldGNoKHNsaWNlZE1lc3NhZ2VzKTtcbiAgfVxuXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIHRoaXMubmF2aWdhdGVNZXNzYWdlKC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICB0aGlzLm5hdmlnYXRlTWVzc2FnZSgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIHRoaXMuc3VibWl0UXVlc3Rpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgU2hpZnQgKyBFbnRlclxuICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIHRoaXMuc3VibWl0UXVlc3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5hdmlnYXRlTWVzc2FnZShkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeSB8fCB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5Lmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdXNlck1lc3NhZ2VzID0gdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeS5maWx0ZXIobSA9PiBtLnJvbGUgPT09ICd1c2VyJyk7XG5cbiAgICBpZiAodXNlck1lc3NhZ2VzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRNZXNzYWdlSW5kZXggPSAodGhpcy5jdXJyZW50TWVzc2FnZUluZGV4ID8/IHVzZXJNZXNzYWdlcy5sZW5ndGgpICsgZGlyZWN0aW9uO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudE1lc3NhZ2VJbmRleCA8IDApIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHByZXNzZXMgdXAgYXJyb3cgb24gdGhlIGZpcnN0IG1lc3NhZ2UsIHN0YXkgYXQgdGhlIGZpcnN0IG1lc3NhZ2VcbiAgICAgIHRoaXMuY3VycmVudE1lc3NhZ2VJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRNZXNzYWdlSW5kZXggPj0gdXNlck1lc3NhZ2VzLmxlbmd0aCkge1xuICAgICAgLy8gSWYgdGhlIHVzZXIgcHJlc3NlcyBkb3duIGFycm93IG9uIHRoZSBsYXN0IHByZXZpb3VzIG1lc3NhZ2UsIGNsZWFyIHRoZSBpbnB1dFxuICAgICAgdGhpcy5jdXJyZW50TWVzc2FnZUluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5xdWVzdGlvbiA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucXVlc3Rpb24gPSB1c2VyTWVzc2FnZXNbdGhpcy5jdXJyZW50TWVzc2FnZUluZGV4XS5jb250ZW50O1xuICB9XG59XG4iLCJcbjxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5pdGlhbGl6YXRpb25FcnJvclwiPlxuICA8ZGl2ICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXM7IGVsc2UgbG9hZGluZ1RwbCB8fCBsb2FkaW5nVHBsRGVmYXVsdFwiIGNsYXNzPVwiaC0xMDAgZC1mbGV4IGZsZXgtY29sdW1uXCI+XG5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2ggb3ZlcmZsb3ctYXV0byBwYi01XCIgI21lc3NhZ2VMaXN0PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlczsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICA8IS0tIFJlZ3VsYXIgbWVzc2FnZXMgLS0+XG4gICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0lmPVwibWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcy5kaXNwbGF5XCJcbiAgICAgICAgICAgIFtjbGFzcy5vcGFjaXR5LTUwXT1cIm1lc3NhZ2VUb0VkaXQgJiYgbWVzc2FnZVRvRWRpdCA8IGluZGV4ICsgMVwiPlxuICAgICAgICAgIDxzcS1jaGF0LW1lc3NhZ2VcbiAgICAgICAgICAgIFtjbGFzcy5zcS11c2VyLW1lc3NhZ2VdPVwibWVzc2FnZS5yb2xlICE9PSAnYXNzaXN0YW50J1wiXG4gICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgICAgICAgICAgIFtjb252ZXJzYXRpb25dPVwibWVzc2FnZXNcIlxuICAgICAgICAgICAgW2Fzc2lzdGFudEljb25dPVwiY3VzdG9tQXNzaXN0YW50SWNvbiB8fCBhc3Npc3RhbnRJY29uXCJcbiAgICAgICAgICAgIFtzdHJlYW1pbmddPVwibGFzdCAmJiAoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBbY2FuRWRpdF09XCIobG9hZGluZyQgfCBhc3luYykgPT09IGZhbHNlICYmIChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSAmJiBtZXNzYWdlVG9FZGl0ID09PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5yb2xlICE9PSAnYXNzaXN0YW50J1wiXG4gICAgICAgICAgICBbY2FuUmVnZW5lcmF0ZV09XCIobG9hZGluZyQgfCBhc3luYykgPT09IGZhbHNlICYmIChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpID09PSBmYWxzZSAmJiBtZXNzYWdlVG9FZGl0ID09PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50JyAmJiBsYXN0XCJcbiAgICAgICAgICAgIFtjYW5Db3B5XT1cIiEobGFzdCAmJiAoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSkgJiYgbWVzc2FnZVRvRWRpdCA9PT0gdW5kZWZpbmVkICYmIG1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCdcIlxuICAgICAgICAgICAgKGVkaXQpPVwiZWRpdE1lc3NhZ2UoaW5kZXgpXCIgKHJlZ2VuZXJhdGUpPVwicmVnZW5lcmF0ZU1lc3NhZ2UoaW5kZXgpXCJcbiAgICAgICAgICAgIChyZWZlcmVuY2VDbGlja2VkKT1cInJlZmVyZW5jZUNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuUHJldmlldy5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICA8L3NxLWNoYXQtbWVzc2FnZT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIiAqbmdJZj1cIihsb2FkaW5nJCB8IGFzeW5jKSA9PT0gdHJ1ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ1RwbCB8fCBsb2FkaW5nVHBsRGVmYXVsdFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuXG4gICAgPGRpdiBjbGFzcz1cInVzZXItaW5wdXQgbXQtYXV0b1wiICpuZ0lmPVwiZW5hYmxlQ2hhdFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInB5LTJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VHBsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWVuZCBzbWFsbCB0ZXh0LW11dGVkIHB4LTNcIiAqbmdJZj1cInNob3dDcmVkaXRzXCI+XG4gICAgICAgICAgcG93ZXJlZCBieSB7e21vZGVsRGVzY3JpcHRpb24/LmRpc3BsYXlOYW1lfX0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInByaXZhY3lVcmxcIj4gLSA8YSBbaHJlZl09XCJwcml2YWN5VXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCI+cHJpdmFjeSBub3RpY2U8L2E+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gTkcgVEVNUExBVEVTLS0+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ1RwbERlZmF1bHQ+XG4gIDxkaXYgY2xhc3M9XCJzcGlubmVyLWdyb3cgdGV4dC1zdWNjZXNzIGQtYmxvY2sgbXgtYXV0byBteS01XCIgcm9sZT1cInN0YXR1c1wiPlxuICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0VHBsPlxuICA8ZGl2IGNsYXNzPVwicHgtMyBweS0xXCI+XG4gICAgPGRpdiBjbGFzcz1cImFzdC1pbnB1dC1jb250YWluZXJcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaFwiPjwvaT5cbiAgICAgIDxpbnB1dCAjcXVlc3Rpb25JbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJBc2sgc29tZXRoaW5nXCIgYXV0b2ZvY3VzXG4gICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb25cIlxuICAgICAgICAoa2V5dXApPVwib25LZXlVcCgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIihsb2FkaW5nJCB8IGFzeW5jKSB8fCAoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIiEoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKSAmJiAhKGxvYWRpbmckIHwgYXN5bmMpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBtcy0yXCJcbiAgICAgICAgdGl0bGU9XCJTZW5kIG1lc3NhZ2VcIlxuICAgICAgICAoY2xpY2spPVwic3VibWl0UXVlc3Rpb24oKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wYXBlci1wbGFuZVwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPCEtLTxidXR0b25cbiAgICAgICAgKm5nSWY9XCIoY2hhdFNlcnZpY2Uuc3RyZWFtaW5nJCB8IGFzeW5jKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQgbXMtMlwiXG4gICAgICAgIHRpdGxlPVwiU3RvcCBnZW5lcmF0aW5nXCJcbiAgICAgICAgKGNsaWNrKT1cInRlcm1pbmF0ZUZldGNoKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3RvcFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPi0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIm1lc3NhZ2VUb0VkaXRcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1zLTJcIlxuICAgICAgICB0aXRsZT1cIkNhbmNlbCBlZGl0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VUb0VkaXQgPSB1bmRlZmluZWQ7IHF1ZXN0aW9uID0gJydcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdW5kby1hbHRcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzcS1mbG9hdGluZy1zY3JvbGxcIiAqbmdJZj1cIiFpc0F0Qm90dG9tXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gc2hhZG93XCIgKGNsaWNrKT1cInNjcm9sbERvd24oKVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWFuZ2xlLWRvdWJsZS1kb3duXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hc3Npc3RhbnQvY2hhdC9jaGF0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBOEIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFBRSxtQkFBbUIsRUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZ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LEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQU9HLDhCQUE4QjtzQkFBdEMsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsNkJBQTZCO3NCQUFyQyxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUksSUFBSTtzQkFBYixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNZLFFBQVE7c0JBQTFCLE1BQU07dUJBQUMsU0FBUztnQkFDUCxLQUFLO3NCQUFkLE1BQU07Z0JBQ1csT0FBTztzQkFBeEIsTUFBTTt1QkFBQyxRQUFRO2dCQUVVLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDSSxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBRUUsVUFBVTtzQkFBckMsWUFBWTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvYWN0aW9uXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEZhY2V0IH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvZmFjZXRcIjtcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy9zZWFyY2hcIjtcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvYXBwLXV0aWxzXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlLCBSZWNvcmQgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS93ZWItc2VydmljZXNcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBmaWx0ZXIsIGZyb21FdmVudCwgbWFwLCBtZXJnZSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgQ2hhdFNlcnZpY2UgfSBmcm9tIFwiLi9jaGF0LnNlcnZpY2VcIjtcbmltcG9ydCB7IENoYXRDb250ZXh0QXR0YWNobWVudCwgQ2hhdENvbmZpZywgQ2hhdE1lc3NhZ2UsIEdsbG1Nb2RlbERlc2NyaXB0aW9uLCBNZXNzYWdlSGFuZGxlciwgUmF3TWVzc2FnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlIH0gZnJvbSBcIi4vaW5zdGFuY2UtbWFuYWdlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRDaGF0U2VydmljZSB9IGZyb20gXCIuL3dlYnNvY2tldC1jaGF0LnNlcnZpY2VcIjtcbmltcG9ydCB7IENoYXRNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSBcIi4vY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBMb2dpblNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS9sb2dpblwiO1xuaW1wb3J0IHsgUmVzdENoYXRTZXJ2aWNlIH0gZnJvbSBcIi4vcmVzdC1jaGF0LnNlcnZpY2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbml0Q2hhdCB7XG4gIG1lc3NhZ2VzOiBSYXdNZXNzYWdlW107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NxLWNoYXQtdjMnLCAvLyBtYW5kYXRvcnkgc2luY2UgQHNpbmVxdWEvY29tcG9uZW50cyBhbHJlYWR5IGhhcyB0aGUgc2FtZSB0YWctbmFtZSBcInNxLWNoYXRcIlxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoYXQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgUmVzdENoYXRTZXJ2aWNlLFxuICAgIFdlYlNvY2tldENoYXRTZXJ2aWNlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQ2hhdE1lc3NhZ2VDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZhY2V0IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgcHVibGljIGxvZ2luU2VydmljZSA9IGluamVjdChMb2dpblNlcnZpY2UpO1xuICBwdWJsaWMgd2Vic29ja2V0U2VydmljZSA9IGluamVjdChXZWJTb2NrZXRDaGF0U2VydmljZSk7XG4gIHB1YmxpYyByZXN0U2VydmljZSA9IGluamVjdChSZXN0Q2hhdFNlcnZpY2UpO1xuICBwdWJsaWMgaW5zdGFuY2VNYW5hZ2VyU2VydmljZSA9IGluamVjdChJbnN0YW5jZU1hbmFnZXJTZXJ2aWNlKTtcbiAgcHVibGljIHNlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gIHB1YmxpYyBwcmluY2lwYWxTZXJ2aWNlID0gaW5qZWN0KFByaW5jaXBhbFdlYlNlcnZpY2UpO1xuICBwdWJsaWMgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKiogRGVmaW5lIHRoZSBrZXkgYmFzZWQgb24gaXQsIHRoZSBjaGF0IHNlcnZpY2UgaW5zdGFuY2Ugd2lsbCBiZSBzdG9yZWQgKi9cbiAgQElucHV0KCkgaW5zdGFuY2VJZDogc3RyaW5nO1xuICAvKiogRGVmaW5lIHRoZSBxdWVyeSB0byB1c2UgdG8gZmV0Y2ggYW5zd2VycyAqL1xuICBASW5wdXQoKSBxdWVyeTogUXVlcnkgPSB0aGlzLnNlYXJjaFNlcnZpY2UucXVlcnk7XG4gIC8qKiBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgYWZ0ZXIgdGhlIHF1ZXJ5IGNoYW5nZXNcbiAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgY2hhdCB3aWxsIGJlIHJlbG9hZGVkIGJ5IGRlZmF1bHRcbiAgICogQHBhcmFtIHByZXZRdWVyeSBUaGUgcHJldmlvdXMgcXVlcnlcbiAgICogQHBhcmFtIG5ld1F1ZXJ5IFRoZSBuZXcgcXVlcnlcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgQElucHV0KCkgcXVlcnlDaGFuZ2VTaG91bGRUcmlnZ2VyUmVsb2FkOiAocHJldlF1ZXJ5OiBhbnksIG5ld1F1ZXJ5OiBhbnkpID0+IGJvb2xlYW47XG4gIC8qKiBEZWZpbmUgdGhlIHByb3RvY29sIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhdCBpbnN0YW5jZSovXG4gIEBJbnB1dCgpIHByb3RvY29sOiAnUkVTVCcgfCAnV0VCU09DS0VUJyA9IFwiV0VCU09DS0VUXCI7XG4gIC8qKiBNYXAgb2YgbGlzdGVuZXJzIG92ZXJyaWRpbmcgZGVmYXVsdCByZWdpc3RlcmVkIG9uZXMqL1xuICBASW5wdXQoKSBtZXNzYWdlSGFuZGxlcnM6IE1hcDxzdHJpbmcsIE1lc3NhZ2VIYW5kbGVyPGFueT4+ID0gbmV3IE1hcCgpO1xuICAvKiogV2hlbiB0aGUgYXNzaXN0YW50IGFuc3dlciBhIHVzZXIgcXVlc3Rpb24sIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGUgZGlzY3Vzc2lvbiAqL1xuICBASW5wdXQoKSBhdXRvbWF0aWNTY3JvbGxUb0xhc3RSZXNwb25zZSA9IGZhbHNlO1xuICBASW5wdXQoKSBjaGF0PzogSW5pdENoYXQ7XG4gIEBJbnB1dCgpIGN1c3RvbUFzc2lzdGFudEljb24gPSAnJztcblxuICBAT3V0cHV0KCkgZGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2VbXT4oKTtcbiAgQE91dHB1dCgpIHJlZmVyZW5jZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcbiAgQE91dHB1dCgpIG9wZW5QcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIEBPdXRwdXQoXCJsb2FkaW5nXCIpIGxvYWRpbmckID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPihmYWxzZSk7XG4gIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KFwiY29uZmlnXCIpIF9jb25maWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRDb25maWc+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWVzc2FnZUxpc3QnKSBtZXNzYWdlTGlzdD86IEVsZW1lbnRSZWY8SFRNTFVMaXN0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uSW5wdXQnKSBxdWVzdGlvbklucHV0PzogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKCdsb2FkaW5nVHBsJykgbG9hZGluZ1RwbD86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgY2hhdFNlcnZpY2U6IENoYXRTZXJ2aWNlO1xuICBjb25maWc6IENoYXRDb25maWc7XG4gIG1lc3NhZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhdE1lc3NhZ2VbXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBxdWVzdGlvbiA9ICcnO1xuXG4gIF9hY3Rpb25zOiBBY3Rpb25bXSA9IFtdO1xuXG4gIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgZGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBWYXJpYWJsZXMgdGhhdCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgbW9kZWwgaW4gdXNlICovXG4gIG1vZGVsRGVzY3JpcHRpb24/OiBHbGxtTW9kZWxEZXNjcmlwdGlvbjtcbiAgYXNzaXN0YW50SWNvbjogc3RyaW5nO1xuICBwcml2YWN5VXJsOiBzdHJpbmc7XG5cbiAgbWVzc2FnZVRvRWRpdD86IG51bWJlcjtcbiAgY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNpbXBsZUNoYW5nZXMgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGN1cnJlbnRNZXNzYWdlSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZmlyc3RDaGFuZ2VzSGFuZGxlZCA9IGZhbHNlO1xuICBpc0F0Qm90dG9tID0gdHJ1ZTtcbiAgaW5pdGlhbGl6YXRpb25FcnJvciA9IGZhbHNlO1xuICBlbmFibGVkVXNlcklucHV0ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2FjdGlvbnMucHVzaChuZXcgQWN0aW9uKHtcbiAgICAgIGljb246ICdmYXMgZmEtc3luYycsXG4gICAgICB0aXRsZTogJ1Jlc2V0IGNoYXQnLFxuICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLmxvYWREZWZhdWx0Q2hhdCgpXG4gICAgfSkpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWIuYWRkKFxuICAgICAgdGhpcy5sb2dpblNlcnZpY2UuZXZlbnRzLnBpcGUoXG4gICAgICAgIGZpbHRlcihlID0+IGUudHlwZSA9PT0gJ2xvZ2luLWNvbXBsZXRlJyksXG4gICAgICAgIHRhcChfID0+IHRoaXMuaW5zdGFudGlhdGVDaGF0U2VydmljZSgpKSxcbiAgICAgICAgbWFwKF8gPT4gdGhpcy5jaGF0U2VydmljZS5pbml0Q2hhdENvbmZpZygpKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY2hhdFNlcnZpY2UuaW5pdENvbmZpZyQpLFxuICAgICAgICBmaWx0ZXIoaW5pdENvbmZpZyA9PiAhIWluaXRDb25maWcpLFxuICAgICAgICBzd2l0Y2hNYXAoXyA9PiB0aGlzLmNoYXRTZXJ2aWNlLmluaXQoKSksXG4gICAgICAgIGZpbHRlcihzdWNjZXNzID0+ICEhc3VjY2VzcyksXG4gICAgICAgIHRhcChfID0+IHRoaXMub25Mb2FkQ2hhdCgpKSxcbiAgICAgICAgc3dpdGNoTWFwKF8gPT4gdGhpcy5jaGF0U2VydmljZS5jaGF0Q29uZmlnJCksXG4gICAgICAgIHRhcChjb25maWcgPT4ge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnITtcbiAgICAgICAgICB0aGlzLmVuYWJsZWRVc2VySW5wdXQgPSB0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuZW5hYmxlZFVzZXJJbnB1dDtcbiAgICAgICAgICB0aGlzLl9jb25maWcuZW1pdChjb25maWcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsRGVzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIGlmKCF0aGlzLmZpcnN0Q2hhbmdlc0hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgdGhpcy5maXJzdENoYW5nZXNIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXphdGlvbkVycm9yID0gdHJ1ZVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5jaGFuZ2VzJC5uZXh0KGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZUNoYXRTZXJ2aWNlKCk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5wcm90b2NvbCkge1xuICAgICAgY2FzZSAnUkVTVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLnJlc3RTZXJ2aWNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dFQlNPQ0tFVCc6XG4gICAgICAgIHRoaXMuY2hhdFNlcnZpY2UgPSB0aGlzLndlYnNvY2tldFNlcnZpY2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZm91bmQgYSBDaGF0U2VydmljZSBpbXBsZW1lbnRhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBwcm90b2NvbDogJyR7dGhpcy5wcm90b2NvbH0nYCk7XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0Q2hhdEluc3RhbmNlSWQodGhpcy5pbnN0YW5jZUlkKTtcbiAgICB0aGlzLmluc3RhbmNlTWFuYWdlclNlcnZpY2Uuc3RvcmVJbnN0YW5jZSh0aGlzLmluc3RhbmNlSWQsIHRoaXMuY2hhdFNlcnZpY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7IHJldHVybiB0aGlzLl9hY3Rpb25zOyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFuZ2VzKCkge1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNoYW5nZXMkLnZhbHVlO1xuICAgIC8vIElmIHRoZSBjaGF0IHNlcnZpY2UgaXMgYSBXZWJTb2NrZXRDaGF0U2VydmljZSwgaGFuZGxlIHRoZSBvdmVycmlkZSBvZiB0aGUgbWVzc2FnZSBoYW5kbGVycyBpZiBleGlzdHNcbiAgICBpZiAoY2hhbmdlcz8ubWVzc2FnZUhhbmRsZXJzICYmIHRoaXMubWVzc2FnZUhhbmRsZXJzICYmIHRoaXMuY2hhdFNlcnZpY2UgaW5zdGFuY2VvZiBXZWJTb2NrZXRDaGF0U2VydmljZSkge1xuICAgICAgdGhpcy5jaGF0U2VydmljZS5vdmVycmlkZU1lc3NhZ2VIYW5kbGVycyh0aGlzLm1lc3NhZ2VIYW5kbGVycyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNoYXQgd2l0aCB0aGUgcHJvdmlkZWQgY2hhdCBtZXNzYWdlcyBpZiBleGlzdHMsIG90aGVyd2lzZSBsb2FkIHRoZSBkZWZhdWx0IGNoYXRcbiAgICAgKiBPbmNlIHRoZSBjaGF0IGlzIGluaXRpYWxpemVkIChmaXJzdENoYW5nZXNIYW5kbGVkIGlzIHRydWUpLCBhbGxvdyBvcGVuaW5nIHRoZSBjaGF0IHdpdGggdGhlIG5ldyBwcm92aWRlZCBtZXNzYWdlcyAoaWYgZXhpc3RzKVxuICAgICAqL1xuICAgIGlmICghdGhpcy5maXJzdENoYW5nZXNIYW5kbGVkIHx8IGNoYW5nZXM/LmNoYXQpIHtcbiAgICAgIGNvbnN0IG9wZW5DaGF0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcyQudmFsdWUgJiYgdGhpcy5jb25maWcuc2F2ZWRDaGF0U2V0dGluZ3MuZW5hYmxlZCkge1xuICAgICAgICAgIHRoaXMuY2hhdFNlcnZpY2UubGlzdFNhdmVkQ2hhdCgpOyAvLyBSZWZyZXNoIHRoZSBsaXN0IG9mIHNhdmVkIGNoYXRzXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuQ2hhdCh0aGlzLmNoYXQhLm1lc3NhZ2VzKVxuICAgICAgfTtcbiAgICAgIHRoaXMuY2hhdCA/IG9wZW5DaGF0KCkgOiB0aGlzLmxvYWREZWZhdWx0Q2hhdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgY2hhdCBpcyBpbml0aWFsaXplZCwgdGhlIGluaXRpYWxpemF0aW9uIGV2ZW50IGlzIFwiUXVlcnlcIiwgdGhlIHF1ZXJ5IGNoYW5nZXMgYW5kIHRoZSBxdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQsXG4gICAgICogdGhlbiB0aGUgY2hhdCBzaG91bGQgYmUgcmVsb2FkZWQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZVxuICAgICAqIE90aGVyd2lzZSwgdGhlIGNoYXQgc2hvdWxkIGJlIHJlbG9hZGVkIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBpZiAodGhpcy5maXJzdENoYW5nZXNIYW5kbGVkICYmIGNoYW5nZXM/LnF1ZXJ5ICYmIHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5ldmVudCA9PT0gJ1F1ZXJ5Jykge1xuICAgICAgY29uc3QgcHJldmlvdXNRdWVyeSA9IGNoYW5nZXMucXVlcnkucHJldmlvdXNWYWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRRdWVyeSA9IGNoYW5nZXMucXVlcnkuY3VycmVudFZhbHVlO1xuXG4gICAgICBpZiAodGhpcy5xdWVyeUNoYW5nZVNob3VsZFRyaWdnZXJSZWxvYWQgPyB0aGlzLnF1ZXJ5Q2hhbmdlU2hvdWxkVHJpZ2dlclJlbG9hZChwcmV2aW91c1F1ZXJ5LCBjdXJyZW50UXVlcnkpIDogdHJ1ZSkge1xuICAgICAgICB0aGlzLnRyaWdnZXJSZWxvYWRBZnRlclF1ZXJ5Q2hhbmdlKGN1cnJlbnRRdWVyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0cmlnZ2VyUmVsb2FkQWZ0ZXJRdWVyeUNoYW5nZShxdWVyeTogUXVlcnkpIHtcbiAgICBjb25zdCBzeXN0ZW1Nc2cgPSB7cm9sZTogJ3N5c3RlbScsIGNvbnRlbnQ6IHRoaXMuY29uZmlnLmRlZmF1bHRWYWx1ZXMuc3lzdGVtUHJvbXB0LCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IGZhbHNlfX07XG4gICAgY29uc3QgdXNlck1zZyA9IHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IENoYXRTZXJ2aWNlLmZvcm1hdFByb21wdCh0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLnVzZXJQcm9tcHQsIHtwcmluY2lwYWw6IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWx9KSwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuZGlzcGxheVVzZXJQcm9tcHR9fTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcHJvdmlkZWQgcXVlcnkgdGV4dCBpcyBub3QgZW1wdHksIHRoZW4gYWRkIHRoZSB1c2VyIHF1ZXJ5IG1lc3NhZ2UgdG8gdGhlIGNoYXQgaGlzdG9yeSBhbmQgaW52b2tlIHRoZSBhc3Npc3RhbnRcbiAgICAgKiBPdGhlcndpc2UsIGp1c3Qgc3RhcnQgYSBuZXcgY2hhdCB3aXRoIGEgd2FybmluZyBtZXNzYWdlIGludml0aW5nIHRoZSB1c2VyIHRvIHBlcmZvcm0gYSBmdWxsIHRleHQgc2VhcmNoIHRvIHJldHJpZXZlIHNvbWUgcmVzdWx0c1xuICAgICAqL1xuICAgIGlmICghIXRoaXMucXVlcnkudGV4dCkge1xuICAgICAgY29uc3QgdXNlclF1ZXJ5TXNnID0ge3JvbGU6ICd1c2VyJywgY29udGVudDogdGhpcy5xdWVyeS50ZXh0LCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5kaXNwbGF5VXNlclF1ZXJ5LCBxdWVyeTogdGhpcy5xdWVyeSwgZm9yY2VkV29ya2Zsb3c6IHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5mb3JjZWRXb3JrZmxvdywgaXNVc2VySW5wdXQ6IHRydWV9fTtcbiAgICAgIHRoaXMub3BlbkNoYXQodGhpcy5jb25maWcubW9kZVNldHRpbmdzLnNlbmRVc2VyUHJvbXB0ID8gW3N5c3RlbU1zZywgdXNlck1zZywgdXNlclF1ZXJ5TXNnXSA6IFtzeXN0ZW1Nc2csIHVzZXJRdWVyeU1zZ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB3YXJuaW5nTXNnID0ge3JvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBcIllvdSBtdXN0IHBlcmZvcm0gYSBmdWxsIHRleHQgc2VhcmNoIHRvIHJldHJpZXZlIHNvbWUgcmVzdWx0c1wiLCBhZGRpdGlvbmFsUHJvcGVydGllczoge2Rpc3BsYXk6IHRydWV9fTtcbiAgICAgIHRoaXMub3BlbkNoYXQoW3dhcm5pbmdNc2ddKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNjcm9sbExpc3RlbmVyKCkge1xuICAgIHRoaXMuc3ViLmFkZChcbiAgICAgIG1lcmdlKHRoaXMubG9hZGluZyQsIHRoaXMubWVzc2FnZXMkLCB0aGlzLmNoYXRTZXJ2aWNlLnN0cmVhbWluZyQsIGZyb21FdmVudCh0aGlzLm1lc3NhZ2VMaXN0IS5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJykpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNBdEJvdHRvbSA9IHRoaXMudG9nZ2xlU2Nyb2xsQnV0dG9uVmlzaWJpbGl0eSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1cGRhdGVNb2RlbERlc2NyaXB0aW9uKCkge1xuICAgIHRoaXMubW9kZWxEZXNjcmlwdGlvbiA9IHRoaXMuY2hhdFNlcnZpY2UuZ2V0TW9kZWwodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy5zZXJ2aWNlX2lkLCB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLm1vZGVsX2lkKTtcbiAgICB0aGlzLmFzc2lzdGFudEljb24gPSAhIXRoaXMuY3VzdG9tQXNzaXN0YW50SWNvbiA/IHRoaXMuY3VzdG9tQXNzaXN0YW50SWNvbiA6ICdzcS1zaW5lcXVhJztcbiAgICBzd2l0Y2godGhpcy5tb2RlbERlc2NyaXB0aW9uPy5wcm92aWRlcikge1xuICAgICAgY2FzZSAnR29vZ2xlJzpcbiAgICAgICAgdGhpcy5wcml2YWN5VXJsID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXp1cmVPcGVuQUknOlxuICAgICAgICB0aGlzLnByaXZhY3lVcmwgPSAnaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2xlZ2FsL2NvZ25pdGl2ZS1zZXJ2aWNlcy9vcGVuYWkvZGF0YS1wcml2YWN5JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdPcGVuQUknOlxuICAgICAgICB0aGlzLnByaXZhY3lVcmwgPSAnaHR0cHM6Ly9vcGVuYWkuY29tL2VudGVycHJpc2UtcHJpdmFjeSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQ29oZXJlJzpcbiAgICAgICAgdGhpcy5wcml2YWN5VXJsID0gJ2h0dHBzOi8vY29oZXJlLmNvbS9zZWN1cml0eSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzdWJtaXRRdWVzdGlvbigpIHtcbiAgICBpZih0aGlzLnF1ZXN0aW9uLnRyaW0oKSAmJiB0aGlzLm1lc3NhZ2VzJC52YWx1ZSAmJiB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5KSB7XG4gICAgICBpZiAodGhpcy5tZXNzYWdlVG9FZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtZXNzYWdlcyBpbiB0aGUgVUlcbiAgICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dCh0aGlzLm1lc3NhZ2VzJC52YWx1ZS5zbGljZSgwLCB0aGlzLm1lc3NhZ2VUb0VkaXQpKTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSByYXcgbWVzc2FnZXMgaW4gdGhlIGNoYXQgaGlzdG9yeSB3aGljaCBpcyB0aGUgY2xlYW4gdmVyc2lvbiB1c2VkIHRvIG1ha2UgdGhlIG5leHQgcmVxdWVzdFxuICAgICAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5ID0gdGhpcy5jaGF0U2VydmljZS5jaGF0SGlzdG9yeS5zbGljZSgwLCB0aGlzLm1lc3NhZ2VUb0VkaXQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VUb0VkaXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBGZXRjaCB0aGUgYW5zd2VyXG4gICAgICB0aGlzLmZldGNoQW5zd2VyKHRoaXMucXVlc3Rpb24udHJpbSgpLCB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5KTtcbiAgICAgIC8vIENsZWFyIHRoZSBpbnB1dCB2YWx1ZSBpbiB0aGUgVUlcbiAgICAgIHRoaXMucXVlc3Rpb25JbnB1dCEubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgdGhpcy5xdWVzdGlvbklucHV0IS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGBhdXRvYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZldGNoQW5zd2VyKHF1ZXN0aW9uOiBzdHJpbmcsIGNvbnZlcnNhdGlvbjogQ2hhdE1lc3NhZ2VbXSkge1xuICAgIGNvbnN0IHVzZXJNc2cgPSB7cm9sZTogJ3VzZXInLCBjb250ZW50OiBxdWVzdGlvbiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlLCBpc1VzZXJJbnB1dDogdHJ1ZX19O1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gWy4uLmNvbnZlcnNhdGlvbiwgdXNlck1zZ107XG4gICAgdGhpcy5tZXNzYWdlcyQubmV4dChtZXNzYWdlcyk7XG4gICAgdGhpcy5mZXRjaChtZXNzYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBsaXN0IG9mIG1lc3NhZ2VzLCBmZXRjaCB0aGUgc2VydmVyIGZvciBhIGNvbnRpbnVhdGlvbiBhbmQgdXBkYXRlc1xuICAgKiB0aGUgbGlzdCBvZiBtZXNzYWdlcyBhY2NvcmRpbmdseS5cbiAgICogQHBhcmFtIG1lc3NhZ2VzXG4gICAqL1xuICBwdWJsaWMgZmV0Y2gobWVzc2FnZXM6IENoYXRNZXNzYWdlW10pIHtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRhdGFTdWJzY3JpcHRpb24gPSB0aGlzLmNoYXRTZXJ2aWNlLmZldGNoKG1lc3NhZ2VzLCB0aGlzLnF1ZXJ5KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IHJlcyA9PiB0aGlzLnVwZGF0ZURhdGEocmVzLmhpc3RvcnkpLFxuICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChlcnIpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGVybWluYXRlRmV0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZih0aGlzLmF1dG9tYXRpY1Njcm9sbFRvTGFzdFJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnNjcm9sbERvd24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBVSSB3aXRoIHRoZSBuZXcgbWVzc2FnZXNcbiAgICogQHBhcmFtIG1lc3NhZ2VzXG4gICAqL1xuICB1cGRhdGVEYXRhKG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSB7XG4gICAgdGhpcy5tZXNzYWdlcyQubmV4dChtZXNzYWdlcyk7XG4gICAgdGhpcy5kYXRhLmVtaXQobWVzc2FnZXMpO1xuICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5xdWVzdGlvbiA9ICcnO1xuICAgIGlmKHRoaXMuYXV0b21hdGljU2Nyb2xsVG9MYXN0UmVzcG9uc2UpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlU2Nyb2xsQnV0dG9uVmlzaWJpbGl0eSgpOiBib29sZWFuIHtcbiAgICBpZih0aGlzLm1lc3NhZ2VMaXN0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLm1lc3NhZ2VMaXN0Py5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCAtIHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC0gMSkgPD0gdGhpcy5tZXNzYWdlTGlzdD8ubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2Nyb2xsRG93bigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmKHRoaXMubWVzc2FnZUxpc3Q/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMubWVzc2FnZUxpc3QubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgY2hhdCB3aXRoIHRoZSBkZWZhdWx0VmFsdWVzIHNldHRpbmdzXG4gICAqIFRoZSBzYXZlZENoYXRJZCBpbiB0aGUgY2hhdCBzZXJ2aWNlIHdpbGwgYmUgcmVzZXQsIHNvIHRoYXQgdGhlIHVwY29taW5nIHNhdmVkIGNoYXQgb3BlcmF0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBvbiB0aGUgZnJlc2ggbmV3IGNoYXRcbiAgICogSWYgdGhlIHNhdmVkQ2hhdCBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSBsaXN0IG9mIHNhdmVkIGNoYXRzIHdpbGwgYmUgcmVmcmVzaGVkXG4gICAqL1xuICBuZXdDaGF0KCkge1xuICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0U2F2ZWRDaGF0SWQodW5kZWZpbmVkKTsgLy8gUmVzZXQgdGhlIHNhdmVkQ2hhdElkXG4gICAgaWYgKHRoaXMuY29uZmlnLnNhdmVkQ2hhdFNldHRpbmdzLmVuYWJsZWQpIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2UubGlzdFNhdmVkQ2hhdCgpOyAvLyBSZWZyZXNoIHRoZSBsaXN0IG9mIHNhdmVkIGNoYXRzXG4gICAgfVxuICAgIHRoaXMubG9hZERlZmF1bHRDaGF0KCk7IC8vIFN0YXJ0IGEgbmV3IGNoYXRcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0aGUgZGVmYXVsdCBjaGF0IHdpdGggdGhlIGRlZmF1bHRWYWx1ZXMgc2V0dGluZ3NcbiAgICogSWYgdGhlIGNoYXQgaXMgbWVhbnQgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCBldmVudCA9PT0gXCJRdWVyeVwiLCB0aGUgY29ycmVzcG9uZGluZyB1c2VyIHF1ZXJ5IG1lc3NhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgY2hhdCBoaXN0b3J5XG4gICAqL1xuICBsb2FkRGVmYXVsdENoYXQoKSB7XG4gICAgY29uc3Qgc3lzdGVtTXNnID0ge3JvbGU6ICdzeXN0ZW0nLCBjb250ZW50OiB0aGlzLmNvbmZpZy5kZWZhdWx0VmFsdWVzLnN5c3RlbVByb21wdCwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiBmYWxzZX19O1xuICAgIGNvbnN0IHVzZXJNc2cgPSB7cm9sZTogJ3VzZXInLCBjb250ZW50OiBDaGF0U2VydmljZS5mb3JtYXRQcm9tcHQodGhpcy5jb25maWcuZGVmYXVsdFZhbHVlcy51c2VyUHJvbXB0LCB7cHJpbmNpcGFsOiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsfSksIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7ZGlzcGxheTogdGhpcy5jb25maWcubW9kZVNldHRpbmdzLmRpc3BsYXlVc2VyUHJvbXB0fX07XG4gICAgaWYgKHRoaXMuY29uZmlnLm1vZGVTZXR0aW5ncy5pbml0aWFsaXphdGlvbi5ldmVudCA9PT0gJ1F1ZXJ5Jykge1xuICAgICAgLy8gSWYgdGhlIHByb3ZpZGVkIHF1ZXJ5IHRleHQgaXMgbm90IGVtcHR5LCB0aGVuIGFkZCB0aGUgdXNlciBxdWVyeSBtZXNzYWdlIHRvIHRoZSBjaGF0IGhpc3RvcnkgYW5kIGludm9rZSB0aGUgYXNzaXN0YW50XG4gICAgICAvLyBPdGhlcndpc2UsIGp1c3Qgc3RhcnQgYSBuZXcgY2hhdCB3aXRoIGEgd2FybmluZyBtZXNzYWdlIGludml0aW5nIHRoZSB1c2VyIHRvIHBlcmZvcm0gYSBmdWxsIHRleHQgc2VhcmNoIHRvIHJldHJpZXZlIHNvbWUgcmVzdWx0c1xuICAgICAgaWYgKCEhdGhpcy5xdWVyeS50ZXh0KSB7XG4gICAgICAgIGNvbnN0IHVzZXJRdWVyeU1zZyA9IHtyb2xlOiAndXNlcicsIGNvbnRlbnQ6IHRoaXMucXVlcnkudGV4dCwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuaW5pdGlhbGl6YXRpb24uZGlzcGxheVVzZXJRdWVyeSwgcXVlcnk6IHRoaXMucXVlcnksIGZvcmNlZFdvcmtmbG93OiB0aGlzLmNvbmZpZy5tb2RlU2V0dGluZ3MuaW5pdGlhbGl6YXRpb24uZm9yY2VkV29ya2Zsb3csIGlzVXNlcklucHV0OiB0cnVlfX07XG4gICAgICAgIHRoaXMub3BlbkNoYXQodGhpcy5jb25maWcubW9kZVNldHRpbmdzLnNlbmRVc2VyUHJvbXB0ID8gW3N5c3RlbU1zZywgdXNlck1zZywgdXNlclF1ZXJ5TXNnXSA6IFtzeXN0ZW1Nc2csIHVzZXJRdWVyeU1zZ10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ01zZyA9IHtyb2xlOiAnYXNzaXN0YW50JywgY29udGVudDogXCJZb3UgbXVzdCBwZXJmb3JtIGEgZnVsbCB0ZXh0IHNlYXJjaCB0byByZXRyaWV2ZSBzb21lIHJlc3VsdHNcIiwgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtkaXNwbGF5OiB0cnVlfX07XG4gICAgICAgIHRoaXMub3BlbkNoYXQoW3dhcm5pbmdNc2ddKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuQ2hhdChbc3lzdGVtTXNnLCB1c2VyTXNnXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0L29wZW4gYSBuZXcgY2hhdCB3aXRoIHRoZSBwcm92aWRlZCBtZXNzYWdlcyBhbmQgY2hhdElkXG4gICAqIElmIHRoZSBsYXN0IG1lc3NhZ2UgaXMgZnJvbSB0aGUgdXNlciwgYSByZXF1ZXN0IHRvIHRoZSBhc3Npc3RhbnQgaXMgbWFkZSB0byBnZXQgYW4gYW5zd2VyXG4gICAqIElmIHRoZSBsYXN0IG1lc3NhZ2UgaXMgZnJvbSB0aGUgYXNzaXN0YW50LCB0aGUgY29udmVyc2F0aW9uIGlzIGxvYWRlZCByaWdodCBhd2F5XG4gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbGlzdCBvZiBtZXNzYWdlcyBvZiB0aGUgY2hhdFxuICAgKiBAcGFyYW0gY2hhdElkICBUaGUgaWQgb2YgdGhlIGNoYXQuIElmIHByb3ZpZGVkIChpZS4gYW4gZXhpc3RpbmcgZGlzY3Vzc2lvbiBpbiB0aGUgc2F2ZWQgY2hhdCBpbmRleCksIHVwZGF0ZSB0aGUgc2F2ZWRDaGF0SWQgaW4gdGhlIGNoYXQgc2VydmljZSBmb3IgdGhlIHVwY29taW5nIHNhdmVkIGNoYXQgb3BlcmF0aW9uc1xuICAgKi9cbiAgb3BlbkNoYXQobWVzc2FnZXM6IFJhd01lc3NhZ2VbXSwgY2hhdElkPzogc3RyaW5nKSB7XG4gICAgaWYgKCFtZXNzYWdlcyB8fCAhQXJyYXkuaXNBcnJheShtZXNzYWdlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gbG9hZCB0aGUgY2hhdCBkaXNjdXNzaW9uLiBJbnZhbGlkIG1lc3NhZ2VzIHJlY2VpdmVkIDonLCBtZXNzYWdlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjaGF0SWQpIHtcbiAgICAgIHRoaXMuY2hhdFNlcnZpY2Uuc2V0U2F2ZWRDaGF0SWQoY2hhdElkKTtcbiAgICB9XG4gICAgdGhpcy5yZXNldENoYXQoKTtcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KG1lc3NhZ2VzKTtcbiAgICB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5ID0gbWVzc2FnZXM7XG4gICAgY29uc3QgbGFzdE1lc3NhZ2UgPSBtZXNzYWdlcy5hdCgtMSk7XG4gICAgaWYobGFzdE1lc3NhZ2UgJiYgbGFzdE1lc3NhZ2Uucm9sZSA9PT0gJ3VzZXInKSB7XG4gICAgICB0aGlzLmZldGNoKG1lc3NhZ2VzKTsgLy8gSWYgdGhlIGxhc3QgbWVzc2FnZSBpZiBmcm9tIGEgdXNlciwgYW4gYW5zd2VyIGZyb20gdGhlIGFzc2lzdGFudCBpcyBleHBlY3RlZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YShtZXNzYWdlcyk7IC8vIElmIHRoZSBsYXN0IG1lc3NhZ2UgaWYgZnJvbSB0aGUgYXNzaXN0YW50LCB3ZSBjYW4gbG9hZCB0aGUgY29udmVyc2F0aW9uIHJpZ2h0IGF3YXlcbiAgICAgIHRoaXMudGVybWluYXRlRmV0Y2goKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIGNoYXQgYnkgY2xlYXJpbmcgdGhlIG1lc3NhZ2VzIGFuZCB0aGUgY2hhdCBoaXN0b3J5XG4gICAqIFRoZSBxdWVzdGlvbiBpbnB1dCB3aWxsIGJlIGZvY3VzZWQgYWZ0ZXIgdGhlIGNoYXQgaXMgcmVzZXRcbiAgICogVGhlIGZldGNoIHN1YnNjcmlwdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWRcbiAgICovXG4gIHJlc2V0Q2hhdCgpIHtcbiAgICBpZih0aGlzLm1lc3NhZ2VzJC52YWx1ZSkge1xuICAgICAgdGhpcy5tZXNzYWdlcyQubmV4dCh1bmRlZmluZWQpOyAvLyBSZXNldCBjaGF0XG4gICAgfVxuICAgIHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkgPSB1bmRlZmluZWQ7IC8vIFJlc2V0IGNoYXQgaGlzdG9yeVxuICAgIHRoaXMucXVlc3Rpb24gPSAnJztcbiAgICB0aGlzLnRlcm1pbmF0ZUZldGNoKCk7XG4gIH1cblxuICBvbkxvYWRDaGF0KCkge1xuICAgIHRoaXMubG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLnN1Yi5hZGQoXG4gICAgICB0aGlzLmNoYXRTZXJ2aWNlLmxvYWRTYXZlZENoYXQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihzYXZlZENoYXQgPT4gISFzYXZlZENoYXQpLFxuICAgICAgICAgIHN3aXRjaE1hcChzYXZlZENoYXQgPT4gdGhpcy5jaGF0U2VydmljZS5nZXRTYXZlZENoYXQoc2F2ZWRDaGF0IS5pZCkpLFxuICAgICAgICAgIGZpbHRlcihzYXZlZENoYXRIaXN0b3J5ID0+ICEhc2F2ZWRDaGF0SGlzdG9yeSksXG4gICAgICAgICAgdGFwKHNhdmVkQ2hhdEhpc3RvcnkgPT4gdGhpcy5vcGVuQ2hhdChzYXZlZENoYXRIaXN0b3J5IS5oaXN0b3J5LCBzYXZlZENoYXRIaXN0b3J5IS5pZCkpXG4gICAgICAgICkuc3Vic2NyaWJlKClcbiAgICApO1xuICB9XG5cbiAgdGVybWluYXRlRmV0Y2goKSB7XG4gICAgdGhpcy5kYXRhU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGF0YVN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5xdWVzdGlvbklucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSlcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBlZGl0TWVzc2FnZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5tZXNzYWdlVG9FZGl0ID0gaW5kZXg7XG4gICAgdGhpcy5xdWVzdGlvbiA9IHRoaXMuY2hhdFNlcnZpY2UuY2hhdEhpc3RvcnkhW2luZGV4XS5jb250ZW50O1xuICAgIHRoaXMucXVlc3Rpb25JbnB1dD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgcmVnZW5lcmF0ZU1lc3NhZ2UoaW5kZXg6IG51bWJlcikge1xuICAgICAvLyBEZWZpbmUgdGhlIGNoYXQgaGlzdG9yeSBiYXNlZCBvbiB3aGljaCB0aGUgYXNzaXN0YW50IHdpbGwgZ2VuZXJhdGUgYSBuZXcgYW5zd2VyXG4gICAgY29uc3Qgc2xpY2VkTWVzc2FnZXMgPSB0aGlzLmNoYXRTZXJ2aWNlLmNoYXRIaXN0b3J5IS5zbGljZSgwLCBpbmRleCk7XG4gICAgLy8gQWNjb3JkaW5nbHkgdXBkYXRlIHRoZSBtZXNzYWdlcyBpbiB0aGUgVUlcbiAgICB0aGlzLm1lc3NhZ2VzJC5uZXh0KHNsaWNlZE1lc3NhZ2VzKTtcbiAgICAvLyBGZXRjaCB0aGUgYW5zd2VyXG4gICAgdGhpcy5mZXRjaChzbGljZWRNZXNzYWdlcyk7XG4gIH1cblxuICBvbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSGVpZ2h0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5KSB0aGlzLnN1Ym1pdFF1ZXN0aW9uKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlSGVpZ2h0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlSGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1heEhlaWdodCA9IDE3MDtcbiAgICBjb25zdCBlbCA9IHRoaXMucXVlc3Rpb25JbnB1dCEubmF0aXZlRWxlbWVudDtcbiAgICBlbC5zdHlsZS5tYXhIZWlnaHQgPSBgJHttYXhIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICBlbC5zdHlsZS5oZWlnaHQgPSBgJHtlbC5zY3JvbGxIZWlnaHR9cHhgO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93WSA9IGVsLnNjcm9sbEhlaWdodCA+PSBtYXhIZWlnaHQgPyAnc2Nyb2xsJyA6ICdoaWRkZW4nO1xuICB9XG59XG4iLCJcbjxuZy1jb250YWluZXIgKm5nSWY9XCIhaW5pdGlhbGl6YXRpb25FcnJvclwiPlxuICA8ZGl2ICpuZ0lmPVwibWVzc2FnZXMkIHwgYXN5bmMgYXMgbWVzc2FnZXM7IGVsc2UgbG9hZGluZ1RwbCB8fCBsb2FkaW5nVHBsRGVmYXVsdFwiIGNsYXNzPVwiaC0xMDAgZC1mbGV4IGZsZXgtY29sdW1uXCI+XG5cbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2ggb3ZlcmZsb3ctYXV0byBwZS0yIHBiLTJcIiAjbWVzc2FnZUxpc3Q+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtZXNzYWdlIG9mIG1lc3NhZ2VzOyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgIDwhLS0gUmVndWxhciBtZXNzYWdlcyAtLT5cbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nSWY9XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmRpc3BsYXlcIlxuICAgICAgICAgICAgW2NsYXNzLm9wYWNpdHktNTBdPVwibWVzc2FnZVRvRWRpdCAmJiBtZXNzYWdlVG9FZGl0IDwgaW5kZXggKyAxXCI+XG4gICAgICAgICAgPHNxLWNoYXQtbWVzc2FnZVxuICAgICAgICAgICAgW2NsYXNzLnNxLXVzZXItbWVzc2FnZV09XCJtZXNzYWdlLnJvbGUgIT09ICdhc3Npc3RhbnQnXCJcbiAgICAgICAgICAgIFttZXNzYWdlXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgW2NvbnZlcnNhdGlvbl09XCJtZXNzYWdlc1wiXG4gICAgICAgICAgICBbYXNzaXN0YW50SWNvbl09XCJjdXN0b21Bc3Npc3RhbnRJY29uIHx8IGFzc2lzdGFudEljb25cIlxuICAgICAgICAgICAgW3N0cmVhbWluZ109XCJsYXN0ICYmIChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpXCJcbiAgICAgICAgICAgIFtjYW5FZGl0XT1cIihsb2FkaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgJiYgKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgPT09IGZhbHNlICYmIG1lc3NhZ2VUb0VkaXQgPT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlLnJvbGUgIT09ICdhc3Npc3RhbnQnXCJcbiAgICAgICAgICAgIFtjYW5SZWdlbmVyYXRlXT1cIihsb2FkaW5nJCB8IGFzeW5jKSA9PT0gZmFsc2UgJiYgKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYykgPT09IGZhbHNlICYmIG1lc3NhZ2VUb0VkaXQgPT09IHVuZGVmaW5lZCAmJiBtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIGxhc3RcIlxuICAgICAgICAgICAgW2NhbkNvcHldPVwiIShsYXN0ICYmIChjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpKSAmJiBtZXNzYWdlVG9FZGl0ID09PSB1bmRlZmluZWQgJiYgbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50J1wiXG4gICAgICAgICAgICAoZWRpdCk9XCJlZGl0TWVzc2FnZShpbmRleClcIiAocmVnZW5lcmF0ZSk9XCJyZWdlbmVyYXRlTWVzc2FnZShpbmRleClcIlxuICAgICAgICAgICAgKHJlZmVyZW5jZUNsaWNrZWQpPVwicmVmZXJlbmNlQ2xpY2tlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKG9wZW5QcmV2aWV3KT1cIm9wZW5QcmV2aWV3LmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvc3EtY2hhdC1tZXNzYWdlPlxuICAgICAgICA8L2xpPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0lmPVwiKGxvYWRpbmckIHwgYXN5bmMpID09PSB0cnVlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nVHBsIHx8IGxvYWRpbmdUcGxEZWZhdWx0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbnB1dCBtdC1hdXRvXCIgKm5nSWY9XCJlbmFibGVkVXNlcklucHV0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHktMlwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUcGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kIHNtYWxsIHRleHQtbXV0ZWQgcHgtM1wiICpuZ0lmPVwiISFjb25maWc/Lmdsb2JhbFNldHRpbmdzPy5kaXNjbGFpbWVyXCI+XG4gICAgICAgICAge3sgY29uZmlnPy5nbG9iYWxTZXR0aW5ncz8uZGlzY2xhaW1lciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIE5HIFRFTVBMQVRFUy0tPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdUcGxEZWZhdWx0PlxuICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ncm93IHRleHQtcHJpbWFyeSBkLWJsb2NrIG14LWF1dG8gbXktNVwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbnB1dFRwbD5cbiAgPGRpdiBjbGFzcz1cInB4LTMgcHktMVwiPlxuICAgIDxkaXYgY2xhc3M9XCJhc3QtaW5wdXQtY29udGFpbmVyXCI+XG4gICAgICA8YnV0dG9uIGRpc2FibGVkIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zZWFyY2hcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDx0ZXh0YXJlYSAjcXVlc3Rpb25JbnB1dCByb3dzPVwiMVwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkFzayBzb21ldGhpbmdcIiBhdXRvZm9jdXNcbiAgICAgICAgWyhuZ01vZGVsKV09XCJxdWVzdGlvblwiXG4gICAgICAgIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJjYWxjdWxhdGVIZWlnaHQoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIobG9hZGluZyQgfCBhc3luYykgfHwgKGNoYXRTZXJ2aWNlLnN0cmVhbWluZyQgfCBhc3luYylcIj5cbiAgICAgIDwvdGV4dGFyZWE+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiIShjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpICYmICEobG9hZGluZyQgfCBhc3luYylcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1zLTJcIlxuICAgICAgICB0aXRsZT1cIlNlbmQgbWVzc2FnZVwiXG4gICAgICAgIChjbGljayk9XCJzdWJtaXRRdWVzdGlvbigpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBhcGVyLXBsYW5lXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8IS0tPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIihjaGF0U2VydmljZS5zdHJlYW1pbmckIHwgYXN5bmMpXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBtcy0yXCJcbiAgICAgICAgdGl0bGU9XCJTdG9wIGdlbmVyYXRpbmdcIlxuICAgICAgICAoY2xpY2spPVwidGVybWluYXRlRmV0Y2goKVwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zdG9wXCI+PC9pPlxuICAgICAgPC9idXR0b24+LS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwibWVzc2FnZVRvRWRpdFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQgbXMtMlwiXG4gICAgICAgIHRpdGxlPVwiQ2FuY2VsIGVkaXRpb25cIlxuICAgICAgICAoY2xpY2spPVwibWVzc2FnZVRvRWRpdCA9IHVuZGVmaW5lZDsgcXVlc3Rpb24gPSAnJ1wiPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS11bmRvLWFsdFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGRpdiBjbGFzcz1cInNxLWZsb2F0aW5nLXNjcm9sbFwiICpuZ0lmPVwiIWlzQXRCb3R0b21cIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBzaGFkb3dcIiAoY2xpY2spPVwic2Nyb2xsRG93bigpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtYW5nbGUtZG91YmxlLWRvd25cIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|