chat4app-client-angular 1.0.7 → 1.0.9

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.
@@ -1,679 +1,720 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { HttpClient, HttpHeaders } from '@angular/common/http';
4
- import * as NATS from './nats.min.js';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- //declare let nats_min: any;
8
- export class Chat4appClientAngularService {
9
- constructor(http) {
10
- this.http = http;
11
- this.chatServer = "";
12
- this.chatUrl = "";
13
- this.debug = false;
14
- this.chatUserExternalId = "";
15
- this.timeoutReconnect = 500;
16
- }
17
- ngOnInit() {
18
- }
19
- config(chat4AppConfig) {
20
- this.chatServer = chat4AppConfig.endpoint;
21
- this.chatUrl = chat4AppConfig.endpoint + "/api/v1/";
22
- this.debug = chat4AppConfig.debug;
23
- }
24
- init(securityChatToken, callback, chatCallback, connectionClientId) {
25
- if (!this.chatServer || this.chatServer.trim().length == 0) {
26
- throw new Error("Endpoint is empty");
27
- }
28
- if (!securityChatToken || securityChatToken.trim().length == 0) {
29
- throw new Error("SecurityChatToken is empty");
30
- }
31
- this.setTokenChat4app(securityChatToken);
32
- if (chatCallback && connectionClientId) {
33
- this.connectWebsocket(chatCallback, connectionClientId);
34
- }
35
- callback(securityChatToken);
36
- }
37
- getChatUrlDownload(messageFileId) {
38
- return this.chatUrl + "chatmessage/getFile?messageFileId=" + messageFileId + "&token=" + this.getBearerToken();
39
- }
40
- getMessageChat(chatId, fromId, toId) {
41
- let url = this.chatUrl + "chatmessage/" + chatId + "/" + fromId + "/" + toId;
42
- return this.http.get(url, {
43
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
44
- });
45
- }
46
- getMessageChatByGrop(chatId, groupId, fromId) {
47
- let url = this.chatUrl + "chatmessage/byGroup/" + chatId + "/" + groupId + "/" + fromId;
48
- return this.http.get(url, {
49
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
50
- });
51
- }
52
- addMessageChat(chatMessage4App) {
53
- let url = this.chatUrl + "chatmessage/" + chatMessage4App.chatId;
54
- return this.http.post(url, chatMessage4App, {
55
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
56
- });
57
- }
58
- props(chatFilterRequest4App) {
59
- let url = this.chatUrl + "chatmessage/props";
60
- return this.http.post(url, chatFilterRequest4App, {
61
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
62
- });
63
- }
64
- removeUsersChat(chatId, chatUsersId, chatUsersExternalId) {
65
- let params = new Array();
66
- if (chatUsersId && chatUsersId.length > 0) {
67
- chatUsersId.forEach(cui => {
68
- params.push("chatUserId=" + cui);
69
- });
70
- }
71
- else if (chatUsersExternalId && chatUsersExternalId.length > 0) {
72
- chatUsersExternalId.forEach(cuei => {
73
- params.push("chatUserExternalId=" + cuei);
74
- });
75
- }
76
- let url = this.chatUrl + "chatuser/" + chatId + "?" + params.join("&");
77
- return this.http.delete(url, {
78
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
79
- });
80
- }
81
- removeUserChat(chatId, chatUserId, chatUserExternalId) {
82
- let param = "";
83
- if (chatUserId) {
84
- param = "chatUserId=" + chatUserId;
85
- }
86
- else {
87
- param = "chatUserExternalId=" + chatUserExternalId;
88
- }
89
- let url = this.chatUrl + "chatuser/" + chatId + "?" + param;
90
- return this.http.delete(url, {
91
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
92
- });
93
- }
94
- updateUserChat(chatId, charUser4AppUpdate) {
95
- let url = this.chatUrl + "chatuser/" + chatId;
96
- return this.http.put(url, charUser4AppUpdate, {
97
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
98
- });
99
- }
100
- createUserChat(chatId, chatUser4App) {
101
- let url = this.chatUrl + "chatuser/" + chatId;
102
- return this.http.post(url, chatUser4App, {
103
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
104
- });
105
- }
106
- createUsersChat(chatId, chatUser4App) {
107
- let url = this.chatUrl + "chatuser/users/" + chatId;
108
- return this.http.post(url, chatUser4App, {
109
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
110
- });
111
- }
112
- createChat(chat4app) {
113
- let url = this.chatUrl + "chat";
114
- return this.http.post(url, chat4app, {
115
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
116
- });
117
- }
118
- createUpdateChat(chat4app) {
119
- let url = this.chatUrl + "chat";
120
- return this.http.put(url, chat4app, {
121
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
122
- });
123
- }
124
- getLastMessageGroup(chatExternalId, groupId) {
125
- let url = this.chatUrl + "chatmessage/lastMessageGroup?chatExternalId=" + chatExternalId + "&groupId=" + groupId;
126
- return this.http.get(url, {
127
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
128
- });
129
- }
130
- getLastMessage(chatExternalId, chatUserExternalId) {
131
- let url = this.chatUrl + "chatmessage/lastMessage?chatExternalId=" + chatExternalId + "&chatUserExternalId=" + chatUserExternalId;
132
- return this.http.get(url, {
133
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
134
- });
135
- }
136
- countNotReadMessages(chatUserExternalId, chatExternalId, groupId, fromId) {
137
- let url = this.chatUrl + "chatmessage/countNotReadMessages?chatUserExternalId=" + chatUserExternalId;
138
- if (chatExternalId && chatExternalId.length > 0) {
139
- url += "&chatExternalId=" + chatExternalId;
140
- }
141
- if (groupId && groupId.length > 0) {
142
- url += "&groupId=" + groupId;
143
- }
144
- if (fromId && fromId.length > 0) {
145
- url += "&fromId=" + groupId;
146
- }
147
- return this.http.get(url, {
148
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
149
- });
150
- }
151
- getChatByExternalId(externalId) {
152
- let url = this.chatUrl + "chat?externalId=" + externalId;
153
- return this.http.get(url, {
154
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
155
- });
156
- }
157
- getChatById(id) {
158
- let url = this.chatUrl + "chat?chatId=" + id;
159
- return this.http.get(url, {
160
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
161
- });
162
- }
163
- listChatByUser(externalUserId, userId, chatStatus) {
164
- let url = this.chatUrl + "chat/listChatByUser/?externalUserId=" + externalUserId
165
- + "&userId=" + userId
166
- + "&chatStatus=" + chatStatus;
167
- return this.http.get(url, {
168
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
169
- });
170
- }
171
- closeChat(chatId, chatExternalId) {
172
- let url = this.chatUrl;
173
- if (chatId && chatId.length > 0) {
174
- url += "chat?chatId=" + chatId;
175
- }
176
- if (chatExternalId && chatExternalId.length > 0) {
177
- url += "chat?externalId=" + chatExternalId;
178
- }
179
- return this.http.delete(url, {
180
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
181
- });
182
- }
183
- readMessage(chatMessageId, toId) {
184
- let url = this.chatUrl + "chatmessage/read/" + chatMessageId;
185
- if (toId && toId.length > 0) {
186
- url += "/" + toId;
187
- }
188
- return this.http.put(url, null, {
189
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
190
- });
191
- }
192
- online(chatId) {
193
- let url = this.chatUrl + "chatmessage/online/" + chatId;
194
- return this.http.get(url, {
195
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
196
- });
197
- }
198
- setOffLine(chatUserExternalIdId) {
199
- let url = this.chatUrl + "chatmessage/set-offline/" + chatUserExternalIdId;
200
- return this.http.put(url, null, {
201
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
202
- });
203
- }
204
- sendFile(chatId, fromId, toId, fileToUpload) {
205
- const endpoint = this.chatUrl + "chatmessage/sendFile/" + chatId + "/" + fromId + "/" + toId;
206
- const formData = new FormData();
207
- formData.append('file', fileToUpload);
208
- return this.http
209
- .post(endpoint, formData, {
210
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
211
- });
212
- }
213
- sendFileGroup(chatId, fromId, groupId, fileToUpload) {
214
- const endpoint = this.chatUrl + "chatmessage/sendFileGroup/" + chatId + "/" + fromId + "/" + groupId;
215
- const formData = new FormData();
216
- formData.append('file', fileToUpload);
217
- return this.http
218
- .post(endpoint, formData, {
219
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
220
- });
221
- }
222
- translateMessage(chatMessageId, languageTarget) {
223
- let url = this.chatUrl + "chatmessage/translate/" + chatMessageId + "/" + languageTarget;
224
- return this.http.get(url, {
225
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
226
- });
227
- }
228
- startTyping(chatId, fromId, toId) {
229
- let url = this.chatUrl + "chatmessage/startTyping/" + chatId + "/" + fromId + "/" + toId;
230
- return this.http.put(url, null, {
231
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
232
- });
233
- }
234
- startTypingGroup(chatId, fromId, groupId) {
235
- let url = this.chatUrl + "chatmessage/startTypingGroup/" + chatId + "/" + fromId + "/" + groupId;
236
- return this.http.put(url, null, {
237
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
238
- });
239
- }
240
- stopTyping(chatId, fromId, toId) {
241
- let url = this.chatUrl + "chatmessage/stopTyping/" + chatId + "/" + fromId + "/" + toId;
242
- return this.http.put(url, null, {
243
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
244
- });
245
- }
246
- stopTypingGroup(chatId, fromId, groupId) {
247
- let url = this.chatUrl + "chatmessage/stopTypingGroup/" + chatId + "/" + fromId + "/" + groupId;
248
- return this.http.put(url, null, {
249
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
250
- });
251
- }
252
- createGroup(group) {
253
- let url = this.chatUrl + "/group";
254
- return this.http.post(url, group, {
255
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
256
- });
257
- }
258
- getGroup(chatId, groupId) {
259
- let url = this.chatUrl + "/group/" + groupId + "/" + chatId;
260
- return this.http.get(url, {
261
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
262
- });
263
- }
264
- listGroups(chatId, externalId) {
265
- let url = this.chatUrl + "/group/";
266
- if (chatId && chatId.length > 0) {
267
- url += "&chatId=" + chatId;
268
- }
269
- if (externalId && externalId.length > 0) {
270
- url += "&externalId=" + externalId;
271
- }
272
- return this.http.get(url, {
273
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
274
- });
275
- }
276
- listFilesGroup(chatId, groupId) {
277
- let url = this.chatUrl + "/group/" + chatId;
278
- if (groupId && groupId.length > 0) {
279
- url += "&groupId=" + chatId;
280
- }
281
- return this.http.get(url, {
282
- headers: new HttpHeaders().set('Authorization', this.getBearerToken())
283
- });
284
- }
285
- /* Token */
286
- getBearerToken() {
287
- let ret = "Bearer " + window.sessionStorage.getItem("chat4AppSessionToken");
288
- return ret;
289
- }
290
- setTokenChat4app(chat4AppSessionToken) {
291
- window.sessionStorage.setItem("chat4AppSessionToken", chat4AppSessionToken);
292
- }
293
- /* Connection */
294
- onMessageFirebaseReceived(data, chatCallback) {
295
- //alert("onMessageReceived connectFirebase");
296
- if (data.type == "msg") {
297
- let chat4appMessage = new Chat4AppMessageReceive();
298
- chat4appMessage.data.chatId = data.chatId;
299
- chat4appMessage.data.chatMessageId = data.chatMessageId;
300
- chat4appMessage.data.externalId = data.externalId;
301
- chat4appMessage.data.fromId = data.fromId;
302
- chat4appMessage.data.toId = data.toId;
303
- chat4appMessage.data.groupId = data.groupId;
304
- chat4appMessage.data.dateHour = data.dateHour;
305
- chat4appMessage.data.type = data.type;
306
- chat4appMessage.notification.body = data.body;
307
- if (data.fileId && data.fileId.length > 0) {
308
- chat4appMessage.data.fileId = data.fileId;
309
- chat4appMessage.data.fileName = data.fileName;
310
- chat4appMessage.data.fileSize = data.fileSize;
311
- chat4appMessage.data.fileType = data.fileType;
312
- }
313
- let datTmp = new Map();
314
- for (let key in data) {
315
- datTmp.set(key, data[key]);
316
- }
317
- chat4appMessage.data.all = datTmp;
318
- chatCallback.onMessage(chat4appMessage);
319
- }
320
- else if ((data.type == "on" || data.type == "off")) {
321
- let chat4appMessage = new Chat4AppMessageReceive();
322
- chat4appMessage.data.chatId = data.chatId;
323
- chat4appMessage.data.chatMessageId = data.chatMessageId;
324
- chat4appMessage.data.externalId = data.externalId;
325
- chat4appMessage.data.fromId = data.fromId;
326
- chat4appMessage.data.toId = data.toId;
327
- chat4appMessage.data.groupId = data.groupId;
328
- chat4appMessage.data.dateHour = data.dateHour;
329
- chat4appMessage.data.type = data.type;
330
- let datTmp = new Map();
331
- for (let key in data) {
332
- datTmp.set(key, data[key]);
333
- }
334
- chat4appMessage.data.all = datTmp;
335
- chatCallback.onOffline(chat4appMessage);
336
- }
337
- else if (data.type == "read") {
338
- let chat4appMessage = new Chat4AppMessageReceive();
339
- chat4appMessage.data.chatId = data.chatId;
340
- chat4appMessage.data.chatMessageId = data.chatMessageId;
341
- chat4appMessage.data.externalId = data.externalId;
342
- chat4appMessage.data.fromId = data.fromId;
343
- chat4appMessage.data.toId = data.toId;
344
- chat4appMessage.data.groupId = data.groupId;
345
- chat4appMessage.data.dateHour = data.dateHour;
346
- chat4appMessage.data.type = data.type;
347
- let datTmp = new Map();
348
- for (let key in data) {
349
- datTmp.set(key, data[key]);
350
- }
351
- chat4appMessage.data.all = datTmp;
352
- chatCallback.onRead(chat4appMessage);
353
- }
354
- else if (data.type == "startTyping" || data.type == "stopTyping") {
355
- let chat4appMessage = new Chat4AppMessageReceive();
356
- chat4appMessage.data.chatId = data.chatId;
357
- chat4appMessage.data.chatMessageId = data.chatMessageId;
358
- chat4appMessage.data.externalId = data.externalId;
359
- chat4appMessage.data.fromId = data.fromId;
360
- chat4appMessage.data.toId = data.toId;
361
- chat4appMessage.data.groupId = data.groupId;
362
- chat4appMessage.data.dateHour = data.dateHour;
363
- chat4appMessage.data.type = data.type;
364
- let datTmp = new Map();
365
- for (let key in data) {
366
- datTmp.set(key, data[key]);
367
- }
368
- chat4appMessage.data.all = datTmp;
369
- chatCallback.onStartStopTyping(chat4appMessage);
370
- }
371
- else if (data.type == "new_user") {
372
- let chat4appMessage = new Chat4AppMessageReceive();
373
- chat4appMessage.data.chatId = data.chatId;
374
- chat4appMessage.data.chatMessageId = data.chatMessageId;
375
- chat4appMessage.data.externalId = data.externalId;
376
- chat4appMessage.data.fromId = data.fromId;
377
- chat4appMessage.data.toId = data.toId;
378
- chat4appMessage.data.groupId = data.groupId;
379
- chat4appMessage.data.dateHour = data.dateHour;
380
- chat4appMessage.data.type = data.type;
381
- let datTmp = new Map();
382
- for (let key in data) {
383
- datTmp.set(key, data[key]);
384
- }
385
- chat4appMessage.data.all = datTmp;
386
- chatCallback.onNewUser(chat4appMessage);
387
- }
388
- else if (data.type == "remove_user") {
389
- let chat4appMessage = new Chat4AppMessageReceive();
390
- chat4appMessage.data.chatId = data.chatId;
391
- chat4appMessage.data.chatMessageId = data.chatMessageId;
392
- chat4appMessage.data.externalId = data.externalId;
393
- chat4appMessage.data.fromId = data.fromId;
394
- chat4appMessage.data.toId = data.toId;
395
- chat4appMessage.data.groupId = data.groupId;
396
- chat4appMessage.data.dateHour = data.dateHour;
397
- chat4appMessage.data.type = data.type;
398
- let datTmp = new Map();
399
- for (let key in data) {
400
- datTmp.set(key, data[key]);
401
- }
402
- chat4appMessage.data.all = datTmp;
403
- chatCallback.onRemoveUser(chat4appMessage);
404
- }
405
- else if (data.type == "chat_closed") {
406
- let chat4appMessage = new Chat4AppMessageReceive();
407
- chat4appMessage.data.chatId = data.chatId;
408
- chat4appMessage.data.chatMessageId = data.chatMessageId;
409
- chat4appMessage.data.externalId = data.externalId;
410
- chat4appMessage.data.fromId = data.fromId;
411
- chat4appMessage.data.toId = data.toId;
412
- chat4appMessage.data.groupId = data.groupId;
413
- chat4appMessage.data.dateHour = data.dateHour;
414
- chat4appMessage.data.type = data.type;
415
- let datTmp = new Map();
416
- for (let key in data) {
417
- datTmp.set(key, data[key]);
418
- }
419
- chat4appMessage.data.all = datTmp;
420
- chatCallback.onChatClosed(chat4appMessage);
421
- }
422
- else if (data.type == "count_notread") {
423
- let chat4appMessage = new Chat4AppMessageReceive();
424
- chat4appMessage.data.chatId = data.chatId;
425
- chat4appMessage.data.chatMessageId = data.chatMessageId;
426
- chat4appMessage.data.externalId = data.externalId;
427
- chat4appMessage.data.fromId = data.fromId;
428
- chat4appMessage.data.toId = data.toId;
429
- chat4appMessage.data.groupId = data.groupId;
430
- chat4appMessage.data.dateHour = data.dateHour;
431
- chat4appMessage.data.type = data.type;
432
- let datTmp = new Map();
433
- for (let key in data) {
434
- datTmp.set(key, data[key]);
435
- }
436
- chat4appMessage.data.all = datTmp;
437
- chatCallback.onCountNotRead(chat4appMessage);
438
- }
439
- }
440
- ensureConn(chatUserExternalId) {
441
- return __awaiter(this, void 0, void 0, function* () {
442
- if (this.debug) {
443
- console.log(`chatServer: ${this.chatServer}`);
444
- console.log(`userId: ${chatUserExternalId}`);
445
- console.log(`getBearerToken: ${this.getBearerToken()}`);
446
- }
447
- const that = this;
448
- let uriStep1 = this.chatServer.replace(/^https/, 'wss');
449
- let server = uriStep1.replace(/(\/\/.*?)\//, '$1\/ws/');
450
- if (this.debug) {
451
- console.log(`ws server: ${server}`);
452
- }
453
- if (!this.nc || (this.nc.isClose && this.nc.isClose())) {
454
- that.nc = yield NATS.connect({ url: server, user: chatUserExternalId, pass: this.getBearerToken(), reconnect: true });
455
- }
456
- this.chatUserExternalId = chatUserExternalId;
457
- return that.nc;
458
- });
459
- }
460
- disconnect() {
461
- return __awaiter(this, void 0, void 0, function* () {
462
- // Check how we can disconnect
463
- if (this.interval) {
464
- try {
465
- clearInterval(this.interval);
466
- }
467
- catch (e) {
468
- }
469
- }
470
- if (this.nc && this.chatUserExternalId && this.chatUserExternalId.length > 0 && this.getBearerToken() && this.getBearerToken().length > 0) {
471
- this.setOffLine(this.chatUserExternalId).subscribe(() => {
472
- if (this.debug) {
473
- console.log("had set offline");
474
- }
475
- });
476
- }
477
- if (this.nc) {
478
- try {
479
- yield this.nc.close();
480
- }
481
- catch (e) {
482
- if (this.debug) {
483
- console.error(e);
484
- }
485
- }
486
- this.nc = undefined;
487
- }
488
- if (this.debug) {
489
- console.log("disconect");
490
- }
491
- });
492
- }
493
- processAndCallback(msgObj, chatCallback) {
494
- if (this.debug && msgObj) {
495
- console.log("Msg Received: " + JSON.stringify(msgObj));
496
- }
497
- //if (!chatCallback.isTokenFirebaseActive()) {
498
- let datTmp = new Map();
499
- for (let key in msgObj.data) {
500
- datTmp.set(key, msgObj.data[key]);
501
- }
502
- msgObj.data.all = datTmp;
503
- if (msgObj.data.type == "msg") {
504
- chatCallback.onMessage(msgObj);
505
- }
506
- else if ((msgObj.data.type == "on" || msgObj.data.type == "off")) {
507
- chatCallback.onOffline(msgObj);
508
- }
509
- else if (msgObj.data.type == "read") {
510
- chatCallback.onRead(msgObj);
511
- }
512
- else if (msgObj.data.type == "startTyping" || msgObj.data.type == "stopTyping") {
513
- chatCallback.onStartStopTyping(msgObj);
514
- }
515
- else if (msgObj.data.type == "new_user") {
516
- chatCallback.onNewUser(msgObj);
517
- }
518
- else if (msgObj.data.type == "remove_user") {
519
- chatCallback.onRemoveUser(msgObj);
520
- }
521
- else if (msgObj.data.type == "chat_closed") {
522
- chatCallback.onChatClosed(msgObj);
523
- }
524
- else if (msgObj.data.type == "count_notread") {
525
- chatCallback.onCountNotRead(msgObj);
526
- }
527
- //}
528
- }
529
- connectWebsocket(chatCallback, userId) {
530
- return __awaiter(this, void 0, void 0, function* () {
531
- const that = this;
532
- this.disconnect();
533
- let securityToken = this.getBearerToken();
534
- let tokenAuth = "";
535
- if (securityToken && securityToken.startsWith("Bearer ")) {
536
- tokenAuth = securityToken;
537
- }
538
- else {
539
- tokenAuth = "Bearer " + securityToken;
540
- }
541
- const configId = this.chatServer.split("/")[3];
542
- const nc = yield this.ensureConn(userId);
543
- //TODO Get the user id from jwt
544
- const subject = `chat4app.config.${configId}.user.${userId}`;
545
- const sub = nc.subscribe(subject, (msg) => {
546
- if (this.debug) {
547
- console.log(msg);
548
- }
549
- this.processAndCallback(JSON.parse(msg.data), chatCallback);
550
- });
551
- if (this.interval) {
552
- try {
553
- clearInterval(this.interval);
554
- }
555
- catch (e) {
556
- }
557
- }
558
- that.interval = setInterval(() => {
559
- if (that.debug) {
560
- console.log(`publish chat4app.user.online ${userId} `);
561
- }
562
- that.nc.publish(`chat4app.user.online`, userId);
563
- }, 1000);
564
- if (this.debug) {
565
- console.log(`Subscribe online chat4app.user.${userId}.online`);
566
- }
567
- });
568
- }
569
- /*
570
- disconnect() {
571
- // console.log("disconnect")
572
- try {
573
- if (this.stompClient) {
574
- this.stompClient.disconnect();
575
- }
576
-
577
- } catch (e) {
578
- console.log(e);
579
- }
580
- }
581
- */
582
- convertChat4AppMessageReceiveToChatMessage4App(msg) {
583
- var _a;
584
- let message = new ChatMessage4App();
585
- message.body = (_a = msg === null || msg === void 0 ? void 0 : msg.notification) === null || _a === void 0 ? void 0 : _a.body;
586
- message.chatId = msg.data.chatId;
587
- message.fromId = msg.data.fromId;
588
- message.toId = msg.data.toId;
589
- message.groupId = msg.data.groupId;
590
- message.replyFrom = msg.data.replyFrom;
591
- if (msg.data.dateHour && msg.data.dateHour.length > 0) {
592
- message.dateHourIncluded = msg.data.dateHour.substring(6, 10) + "-"
593
- + msg.data.dateHour.substring(3, 5) + "-"
594
- + msg.data.dateHour.substring(0, 2)
595
- + msg.data.dateHour.substring(10);
596
- }
597
- message.id = msg.data.chatMessageId;
598
- if (msg.data.fileId && msg.data.fileId.length > 0) {
599
- let messageFile = new ChatMessageFile4App();
600
- messageFile.id = msg.data.fileId;
601
- messageFile.name = msg.data.fileName;
602
- messageFile.size = msg.data.fileSize;
603
- messageFile.type = msg.data.fileType;
604
- message.chatMessageFile = messageFile;
605
- }
606
- if (msg.data.vFileId && msg.data.vFileId.length > 0) {
607
- let messageFile = new ChatMessageFile4App();
608
- messageFile.id = msg.data.vFileId;
609
- messageFile.name = msg.data.vFileName;
610
- messageFile.size = msg.data.vFileSize;
611
- messageFile.type = msg.data.vFileType;
612
- message.chatVoiceFile = messageFile;
613
- }
614
- return message;
615
- }
616
- }
617
- Chat4appClientAngularService.ɵprov = i0.ɵɵdefineInjectable({ factory: function Chat4appClientAngularService_Factory() { return new Chat4appClientAngularService(i0.ɵɵinject(i1.HttpClient)); }, token: Chat4appClientAngularService, providedIn: "root" });
618
- Chat4appClientAngularService.decorators = [
619
- { type: Injectable, args: [{
620
- providedIn: 'root'
621
- },] }
622
- ];
623
- Chat4appClientAngularService.ctorParameters = () => [
624
- { type: HttpClient }
625
- ];
626
- export class Chat4App {
627
- }
628
- export class ChatUser4App {
629
- }
630
- export class ChatMessage4App {
631
- }
632
- export class ChatMessageFile4App {
633
- }
634
- export class ChatMessageMeta4App {
635
- }
636
- export class Chat4AppMessageReceive {
637
- constructor() {
638
- this.data = new Chat4AppMessageReceiveData();
639
- this.notification = new Chat4AppMessageReceiveNotification();
640
- }
641
- }
642
- export class Chat4AppMessageReceiveData {
643
- }
644
- export class Chat4AppMessageReceiveNotification {
645
- }
646
- export class ChatUserResponse4App {
647
- }
648
- export class ChatFilterRequest4App {
649
- }
650
- export class Chat4AppConfig {
651
- constructor(endpoint, debug) {
652
- this.endpoint = endpoint;
653
- this.debug = debug;
654
- }
655
- }
656
- export class Chat4AppTranslate {
657
- }
658
- export class ChatGroupApp {
659
- }
660
- export var ChatStatus4App;
661
- (function (ChatStatus4App) {
662
- ChatStatus4App["CREATED"] = "CREATED";
663
- ChatStatus4App["CLOSED"] = "CLOSED";
664
- })(ChatStatus4App || (ChatStatus4App = {}));
665
- export var ChatUserStatus4App;
666
- (function (ChatUserStatus4App) {
667
- ChatUserStatus4App["REMOVED"] = "REMOVED";
668
- })(ChatUserStatus4App || (ChatUserStatus4App = {}));
669
- export var ChatFilterType;
670
- (function (ChatFilterType) {
671
- ChatFilterType[ChatFilterType["COUNT_NOT_READ"] = 1] = "COUNT_NOT_READ";
672
- ChatFilterType[ChatFilterType["LAST_MESSAGE"] = 2] = "LAST_MESSAGE";
673
- })(ChatFilterType || (ChatFilterType = {}));
674
- export var GroupStatus4App;
675
- (function (GroupStatus4App) {
676
- GroupStatus4App["CREATED"] = "CREATED";
677
- GroupStatus4App["CLOSED"] = "REMOVED";
678
- })(GroupStatus4App || (GroupStatus4App = {}));
679
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQ0YXBwLWNsaWVudC1hbmd1bGFyL3NyYy9saWIvY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDOzs7QUFHdEMsNEJBQTRCO0FBSzVCLE1BQU0sT0FBTyw0QkFBNEI7SUFhckMsWUFBcUIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVRyQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXhCLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztJQU12QixDQUFDO0lBQ0QsUUFBUTtJQUNSLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBOEI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUU7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLENBQUMsaUJBQXlCLEVBQUUsUUFBYSxFQUFFLFlBQTRCLEVBQUUsa0JBQTJCO1FBRXBHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBQztZ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QUFFbkIsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBQ0QsTUFBTSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1Qix5Q0FBbUIsQ0FBQTtBQUVyQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QjtBQUNELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsdUVBQWtCLENBQUE7SUFDbEIsbUVBQWdCLENBQUE7QUFDbEIsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBRUQsTUFBTSxDQUFOLElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUN6QixzQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBa0IsQ0FBQTtBQUNwQixDQUFDLEVBSFcsZUFBZSxLQUFmLGVBQWUsUUFHMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgTkFUUyBmcm9tICcuL25hdHMubWluLmpzJztcblxuXG4vL2RlY2xhcmUgbGV0IG5hdHNfbWluOiBhbnk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENoYXQ0YXBwQ2xpZW50QW5ndWxhclNlcnZpY2UgaW1wbGVtZW50cyBPbkluaXQgIHtcblxuICAgIG5jOiBhbnk7XG5cbiAgICBjaGF0U2VydmVyID0gXCJcIjtcbiAgICBjaGF0VXJsID0gXCJcIjtcbiAgICBkZWJ1ZyA9IGZhbHNlO1xuICAgIGNoYXRVc2VyRXh0ZXJuYWxJZCA9IFwiXCI7XG4gICAgXG4gICAgdGltZW91dFJlY29ubmVjdCA9IDUwMDtcblxuICAgIGludGVydmFsO1xuXG4gICAgY29uc3RydWN0b3IoIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICBcbiAgICB9XG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgY29uZmlnKGNoYXQ0QXBwQ29uZmlnOiBDaGF0NEFwcENvbmZpZykge1xuICAgICAgdGhpcy5jaGF0U2VydmVyID0gY2hhdDRBcHBDb25maWcuZW5kcG9pbnQ7XG4gICAgICB0aGlzLmNoYXRVcmwgPSBjaGF0NEFwcENvbmZpZy5lbmRwb2ludCArIFwiL2FwaS92MS9cIiA7XG4gICAgICB0aGlzLmRlYnVnID0gY2hhdDRBcHBDb25maWcuZGVidWc7XG4gICAgfVxuICBcbiAgICBpbml0KHNlY3VyaXR5Q2hhdFRva2VuOiBzdHJpbmcsIGNhbGxiYWNrOiBhbnksIGNoYXRDYWxsYmFjaz86IElDaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZD86IHN0cmluZykge1xuXG4gICAgICAgIGlmICghdGhpcy5jaGF0U2VydmVyIHx8IHRoaXMuY2hhdFNlcnZlci50cmltKCkubGVuZ3RoID09IDApe1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZHBvaW50IGlzIGVtcHR5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2VjdXJpdHlDaGF0VG9rZW4gfHwgc2VjdXJpdHlDaGF0VG9rZW4udHJpbSgpLmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWN1cml0eUNoYXRUb2tlbiBpcyBlbXB0eVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VG9rZW5DaGF0NGFwcChzZWN1cml0eUNoYXRUb2tlbik7XG4gIFxuICAgICAgICBpZiAoY2hhdENhbGxiYWNrICYmIGNvbm5lY3Rpb25DbGllbnRJZCkge1xuICAgICAgICAgIHRoaXMuY29ubmVjdFdlYnNvY2tldChjaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZCk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNhbGxiYWNrKHNlY3VyaXR5Q2hhdFRva2VuKTtcbiAgICB9XG4gIFxuICAgIGdldENoYXRVcmxEb3dubG9hZChtZXNzYWdlRmlsZUlkOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2dldEZpbGU/bWVzc2FnZUZpbGVJZD1cIiArIG1lc3NhZ2VGaWxlSWQgKyBcIiZ0b2tlbj1cIiArIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKTtcbiAgICB9XG4gIFxuICBcbiAgICBnZXRNZXNzYWdlQ2hhdChjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxDaGF0TWVzc2FnZTRBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gIFxuICAgIH1cbiAgICBnZXRNZXNzYWdlQ2hhdEJ5R3JvcChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvYnlHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZ3JvdXBJZCArIFwiL1wiICsgZnJvbUlkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlNEFwcD4+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgXG4gICAgfVxuICBcbiAgXG4gICAgYWRkTWVzc2FnZUNoYXQoY2hhdE1lc3NhZ2U0QXBwOiBDaGF0TWVzc2FnZTRBcHApOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlNEFwcD4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvXCIgKyBjaGF0TWVzc2FnZTRBcHAuY2hhdElkO1xuXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdE1lc3NhZ2U0QXBwPih1cmwsIGNoYXRNZXNzYWdlNEFwcCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgXG4gICAgfVxuICAgIHByb3BzKGNoYXRGaWx0ZXJSZXF1ZXN0NEFwcDogQXJyYXk8Q2hhdEZpbHRlclJlcXVlc3Q0QXBwPik6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHBbXT4ge1xuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvcHJvcHNcIjtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXJSZXNwb25zZTRBcHBbXT4odXJsLCBjaGF0RmlsdGVyUmVxdWVzdDRBcHAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gIFxuICAgIH1cbiAgXG4gIFxuICAgIHJlbW92ZVVzZXJzQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXJzSWQ/OiBzdHJpbmdbXSwgY2hhdFVzZXJzRXh0ZXJuYWxJZD86IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxDaGF0VXNlcjRBcHBbXT4ge1xuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBBcnJheSgpO1xuICAgICAgaWYgKGNoYXRVc2Vyc0lkICYmIGNoYXRVc2Vyc0lkLmxlbmd0aCA+IDApIHtcbiAgXG4gICAgICAgIGNoYXRVc2Vyc0lkLmZvckVhY2goY3VpID0+IHtcbiAgICAgICAgICBwYXJhbXMucHVzaChcImNoYXRVc2VySWQ9XCIgKyBjdWkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhdFVzZXJzRXh0ZXJuYWxJZCAmJiBjaGF0VXNlcnNFeHRlcm5hbElkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2hhdFVzZXJzRXh0ZXJuYWxJZC5mb3JFYWNoKGN1ZWkgPT4ge1xuICAgICAgICAgIHBhcmFtcy5wdXNoKFwiY2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY3VlaSk7XG4gICAgICAgIH0pXG4gIFxuICAgICAgfVxuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkICsgXCI/XCIgKyBwYXJhbXMuam9pbihcIiZcIik7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q2hhdFVzZXI0QXBwW10+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICAgIHJlbW92ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcklkPzogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xuICAgICAgbGV0IHBhcmFtID0gXCJcIjtcbiAgICAgIGlmIChjaGF0VXNlcklkKSB7XG4gICAgICAgIHBhcmFtID0gXCJjaGF0VXNlcklkPVwiICsgY2hhdFVzZXJJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtID0gXCJjaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjaGF0VXNlckV4dGVybmFsSWQ7XG4gICAgICB9XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvXCIgKyBjaGF0SWQgKyBcIj9cIiArIHBhcmFtO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPENoYXRVc2VyNEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgXG4gICAgdXBkYXRlVXNlckNoYXQoY2hhdElkOiBzdHJpbmcsIGNoYXJVc2VyNEFwcFVwZGF0ZTogQ2hhdFVzZXI0QXBwKTogT2JzZXJ2YWJsZTxDaGF0VXNlcjRBcHA+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDaGF0VXNlcjRBcHA+KHVybCwgY2hhclVzZXI0QXBwVXBkYXRlLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgXG4gIFxuICAgIGNyZWF0ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcjRBcHA6IENoYXRVc2VyNEFwcCk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwPiB7XG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXI0QXBwPih1cmwsIGNoYXRVc2VyNEFwcCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICAgIGNyZWF0ZVVzZXJzQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXI0QXBwOiBDaGF0VXNlcjRBcHBbXSk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwW10+IHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL3VzZXJzL1wiICsgY2hhdElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0VXNlcjRBcHBbXT4odXJsLCBjaGF0VXNlcjRBcHAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICBcbiAgXG4gICAgY3JlYXRlQ2hhdChjaGF0NGFwcDogQ2hhdDRBcHApOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0XCI7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXQ0QXBwPih1cmwsIGNoYXQ0YXBwLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBjcmVhdGVVcGRhdGVDaGF0KGNoYXQ0YXBwOiBDaGF0NEFwcCk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRcIjtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDaGF0NEFwcD4odXJsLCBjaGF0NGFwcCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICBcbiAgICBnZXRMYXN0TWVzc2FnZUdyb3VwKGNoYXRFeHRlcm5hbElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9sYXN0TWVzc2FnZUdyb3VwP2NoYXRFeHRlcm5hbElkPVwiICsgY2hhdEV4dGVybmFsSWQgKyBcIiZncm91cElkPVwiICsgZ3JvdXBJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0VXNlclJlc3BvbnNlNEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBnZXRMYXN0TWVzc2FnZShjaGF0RXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9sYXN0TWVzc2FnZT9jaGF0RXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkICsgXCImY2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGNvdW50Tm90UmVhZE1lc3NhZ2VzKGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZD86IHN0cmluZywgZ3JvdXBJZD86IHN0cmluZywgZnJvbUlkPzpzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvY291bnROb3RSZWFkTWVzc2FnZXM/Y2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkO1xuICBcbiAgICAgIGlmIChjaGF0RXh0ZXJuYWxJZCAmJiBjaGF0RXh0ZXJuYWxJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSBcIiZjaGF0RXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkO1xuICAgICAgfVxuICBcbiAgICAgIGlmIChncm91cElkICYmIGdyb3VwSWQubGVuZ3RoID4gMCkge1xuICAgICAgICB1cmwgKz0gXCImZ3JvdXBJZD1cIiArIGdyb3VwSWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcm9tSWQgJiYgZnJvbUlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdXJsICs9IFwiJmZyb21JZD1cIiArIGdyb3VwSWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICBcbiAgXG4gICAgZ2V0Q2hhdEJ5RXh0ZXJuYWxJZChleHRlcm5hbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9leHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0NEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldENoYXRCeUlkKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9jaGF0SWQ9XCIgKyBpZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0NEFwcD4odXJsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGxpc3RDaGF0QnlVc2VyKGV4dGVybmFsVXNlcklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBjaGF0U3RhdHVzOiBDaGF0U3RhdHVzNEFwcCApOiBPYnNlcnZhYmxlPEFycmF5PCBDaGF0NEFwcD4+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0L2xpc3RDaGF0QnlVc2VyLz9leHRlcm5hbFVzZXJJZD1cIiArIGV4dGVybmFsVXNlcklkIFxuICAgICAgKyBcIiZ1c2VySWQ9XCIgKyB1c2VySWRcbiAgICAgICsgXCImY2hhdFN0YXR1cz1cIiArIGNoYXRTdGF0dXM7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdDRBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY2xvc2VDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCA7XG5cbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aCA+IDApe1xuICAgICAgICB1cmwrPSBcImNoYXQ/Y2hhdElkPVwiICsgY2hhdElkOyBcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNoYXRFeHRlcm5hbElkICYmIGNoYXRFeHRlcm5hbElkLmxlbmd0aCA+IDApe1xuICAgICAgICB1cmwrPSBcImNoYXQ/ZXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkOyBcbiAgICAgIH1cbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVhZE1lc3NhZ2UoY2hhdE1lc3NhZ2VJZDogc3RyaW5nLCB0b0lkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvcmVhZC9cIiArIGNoYXRNZXNzYWdlSWQ7XG4gIFxuICAgICAgaWYgKHRvSWQgJiYgdG9JZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSBcIi9cIiArIHRvSWQ7XG4gICAgICB9XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICB9KVxuICAgIH1cbiAgICBvbmxpbmUoY2hhdElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL29ubGluZS9cIiArIGNoYXRJZCA7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8bnVtYmVyPih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIHNldE9mZkxpbmUoY2hhdFVzZXJFeHRlcm5hbElkSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2V0LW9mZmxpbmUvXCIgKyBjaGF0VXNlckV4dGVybmFsSWRJZCA7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8bnVtYmVyPih1cmwsIG51bGwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICBzZW5kRmlsZShjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2VuZEZpbGUvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcbiAgXG4gICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVUb1VwbG9hZCk7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAucG9zdDxDaGF0TWVzc2FnZUZpbGU0QXBwPihlbmRwb2ludCwgZm9ybURhdGEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxuICAgICAgICAgIH0pO1xuICAgIH1cbiAgXG4gICAgc2VuZEZpbGVHcm91cChjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2VuZEZpbGVHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xuICBcbiAgICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZVRvVXBsb2FkKTtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgIC5wb3N0PENoYXRNZXNzYWdlRmlsZTRBcHA+KGVuZHBvaW50LCBmb3JtRGF0YSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJhbnNsYXRlTWVzc2FnZShjaGF0TWVzc2FnZUlkOiBzdHJpbmcsIGxhbmd1YWdlVGFyZ2V0OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwVHJhbnNsYXRlPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvdHJhbnNsYXRlL1wiICsgY2hhdE1lc3NhZ2VJZCArIFwiL1wiICsgbGFuZ3VhZ2VUYXJnZXQ7XG4gIFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHBUcmFuc2xhdGU+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdGFydFR5cGluZyhjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RhcnRUeXBpbmcvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RhcnRUeXBpbmdHcm91cChjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RhcnRUeXBpbmdHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG4gICAgc3RvcFR5cGluZyhjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gIFxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RvcFR5cGluZy9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzdG9wVHlwaW5nR3JvdXAoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0b3BUeXBpbmdHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjcmVhdGVHcm91cChncm91cDogQ2hhdEdyb3VwQXBwKTogT2JzZXJ2YWJsZTxDaGF0R3JvdXBBcHA+IHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcIi9ncm91cFwiO1xuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0R3JvdXBBcHA+KHVybCwgZ3JvdXAsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICAgIGdldEdyb3VwKGNoYXRJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRHcm91cEFwcD4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcIi9ncm91cC9cIiArIGdyb3VwSWQgKyBcIi9cIiArIGNoYXRJZDtcbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0R3JvdXBBcHA+KHVybCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBsaXN0R3JvdXBzKGNoYXRJZD86IHN0cmluZywgZXh0ZXJuYWxJZD86IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdEdyb3VwQXBwPj4ge1xuICBcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcIi9ncm91cC9cIiA7XG5cbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aD4wKSB7XG4gICAgICAgIHVybCArPSBcIiZjaGF0SWQ9XCIgKyBjaGF0SWQ7XG4gICAgICB9XG4gICAgICBpZiAoZXh0ZXJuYWxJZCAmJiBleHRlcm5hbElkLmxlbmd0aD4wKSB7XG4gICAgICAgIHVybCArPSBcIiZleHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcbiAgICAgIH1cbiAgXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxDaGF0R3JvdXBBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgbGlzdEZpbGVzR3JvdXAoY2hhdElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4+IHtcbiAgXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCIvZ3JvdXAvXCIgKyBjaGF0SWQgO1xuXG4gICAgICBpZiAoZ3JvdXBJZCAmJiBncm91cElkLmxlbmd0aD4wKSB7XG4gICAgICAgIHVybCArPSBcIiZncm91cElkPVwiICsgY2hhdElkO1xuICAgICAgfVxuICBcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlRmlsZTRBcHA+Pih1cmwsXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXG4gICAgICAgIH0pXG4gICAgfVxuICBcbiAgICAvKiBUb2tlbiAqL1xuICAgIGdldEJlYXJlclRva2VuKCk6IHN0cmluZyB7XG4gIFxuICAgICAgbGV0IHJldCA9IFwiQmVhcmVyIFwiICsgd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJjaGF0NEFwcFNlc3Npb25Ub2tlblwiKTtcbiAgXG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgXG4gIFxuICAgIHNldFRva2VuQ2hhdDRhcHAoY2hhdDRBcHBTZXNzaW9uVG9rZW46IHN0cmluZykge1xuICBcbiAgXG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImNoYXQ0QXBwU2Vzc2lvblRva2VuXCIsIGNoYXQ0QXBwU2Vzc2lvblRva2VuKTtcbiAgICB9XG4gIFxuICBcbiAgICAvKiBDb25uZWN0aW9uICovXG4gIFxuICAgIG9uTWVzc2FnZUZpcmViYXNlUmVjZWl2ZWQoZGF0YTogYW55LCBjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2spIHtcbiAgXG4gIFxuICAgICAgLy9hbGVydChcIm9uTWVzc2FnZVJlY2VpdmVkIGNvbm5lY3RGaXJlYmFzZVwiKTtcbiAgXG4gICAgICBpZiAoZGF0YS50eXBlID09IFwibXNnXCIpIHtcbiAgXG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLm5vdGlmaWNhdGlvbi5ib2R5ID0gZGF0YS5ib2R5O1xuICBcbiAgICAgICAgaWYgKGRhdGEuZmlsZUlkICYmIGRhdGEuZmlsZUlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlSWQgPSBkYXRhLmZpbGVJZDtcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlTmFtZSA9IGRhdGEuZmlsZU5hbWU7XG4gICAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZmlsZVNpemUgPSBkYXRhLmZpbGVTaXplO1xuICAgICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZpbGVUeXBlID0gZGF0YS5maWxlVHlwZTtcbiAgXG4gICAgICAgIH1cbiAgXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uTWVzc2FnZShjaGF0NGFwcE1lc3NhZ2UpO1xuICBcbiAgICAgIH0gZWxzZSBpZiAoKGRhdGEudHlwZSA9PSBcIm9uXCIgfHwgZGF0YS50eXBlID09IFwib2ZmXCIpKSB7XG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcbiAgXG4gICAgICAgIGNoYXRDYWxsYmFjay5vbk9mZmxpbmUoY2hhdDRhcHBNZXNzYWdlKTtcblxuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJyZWFkXCIgKSB7XG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcbiAgXG4gICAgICAgIGNoYXRDYWxsYmFjay5vblJlYWQoY2hhdDRhcHBNZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwic3RhcnRUeXBpbmdcIiB8fCBkYXRhLnR5cGUgPT0gXCJzdG9wVHlwaW5nXCIgKSB7XG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcblxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcbiAgXG4gICAgICAgIGNoYXRDYWxsYmFjay5vblN0YXJ0U3RvcFR5cGluZyhjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJuZXdfdXNlclwiICApIHtcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uTmV3VXNlcihjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJyZW1vdmVfdXNlclwiICApIHtcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uUmVtb3ZlVXNlcihjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJjaGF0X2Nsb3NlZFwiICApIHtcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xuICBcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uQ2hhdENsb3NlZChjaGF0NGFwcE1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJjb3VudF9ub3RyZWFkXCIgICkge1xuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRNZXNzYWdlSWQgPSBkYXRhLmNoYXRNZXNzYWdlSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50b0lkID0gZGF0YS50b0lkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIFxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xuICAgICAgICB9XG4gIFxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XG4gIFxuICAgICAgICBjaGF0Q2FsbGJhY2sub25Db3VudE5vdFJlYWQoY2hhdDRhcHBNZXNzYWdlKTtcbiAgICAgIH1cblxuICBcbiAgICB9XG5cbiAgICBhc3luYyBlbnN1cmVDb25uKGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nKSB7XG5cbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBjaGF0U2VydmVyOiAke3RoaXMuY2hhdFNlcnZlcn1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYHVzZXJJZDogJHtjaGF0VXNlckV4dGVybmFsSWR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBnZXRCZWFyZXJUb2tlbjogJHsgdGhpcy5nZXRCZWFyZXJUb2tlbigpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgbGV0IHVyaVN0ZXAxOiBzdHJpbmcgPSB0aGlzLmNoYXRTZXJ2ZXIucmVwbGFjZSgvXmh0dHBzLywgJ3dzcycpO1xuXG4gICAgICBsZXQgc2VydmVyOiBzdHJpbmcgPSB1cmlTdGVwMS5yZXBsYWNlKC8oXFwvXFwvLio/KVxcLy8sICckMVxcL3dzLycpO1xuXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhgd3Mgc2VydmVyOiAke3NlcnZlcn1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm5jIHx8ICh0aGlzLm5jLmlzQ2xvc2UgJiYgdGhpcy5uYy5pc0Nsb3NlKCkpKSB7XG4gICAgICAgIFxuICAgICAgICB0aGF0Lm5jID0gYXdhaXQgTkFUUy5jb25uZWN0KHsgdXJsOiBzZXJ2ZXIsIHVzZXI6IGNoYXRVc2VyRXh0ZXJuYWxJZCwgcGFzczogdGhpcy5nZXRCZWFyZXJUb2tlbigpLCByZWNvbm5lY3Q6IHRydWV9KTtcblxuICAgICAgfVxuXG4gICAgICB0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZCA9IGNoYXRVc2VyRXh0ZXJuYWxJZDtcblxuICAgICAgcmV0dXJuIHRoYXQubmM7XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzY29ubmVjdCgpIHtcblxuICAgICAgLy8gQ2hlY2sgaG93IHdlIGNhbiBkaXNjb25uZWN0XG5cbiAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm5jICYmIHRoaXMuY2hhdFVzZXJFeHRlcm5hbElkICYmIHRoaXMuY2hhdFVzZXJFeHRlcm5hbElkLmxlbmd0aCA+IDAgJiYgdGhpcy5nZXRCZWFyZXJUb2tlbigpICYmIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2V0T2ZmTGluZSh0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZCkuc3Vic2NyaWJlKCgpPT57XG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJoYWQgc2V0IG9mZmxpbmVcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubmMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm5jLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5kZWJ1Zyl7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5jID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kZWJ1Zyl7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZGlzY29uZWN0XCIpXG4gICAgICB9XG4gICAgICBcbiAgICB9XG5cbiAgICBwcm9jZXNzQW5kQ2FsbGJhY2sobXNnT2JqOiBhbnksIGNoYXRDYWxsYmFjazogSUNoYXRDYWxsYmFjaykge1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnICYmIG1zZ09iaikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTXNnIFJlY2VpdmVkOiBcIiArIEpTT04uc3RyaW5naWZ5KG1zZ09iaikpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL2lmICghY2hhdENhbGxiYWNrLmlzVG9rZW5GaXJlYmFzZUFjdGl2ZSgpKSB7XG5cbiAgICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBtc2dPYmouZGF0YSkge1xuICAgICAgICAgICAgZGF0VG1wLnNldChrZXksIG1zZ09iai5kYXRhW2tleV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1zZ09iai5kYXRhLmFsbCA9IGRhdFRtcDtcblxuICAgICAgICAgIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwibXNnXCIpIHtcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vbk1lc3NhZ2UobXNnT2JqKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChtc2dPYmouZGF0YS50eXBlID09IFwib25cIiB8fCBtc2dPYmouZGF0YS50eXBlID09IFwib2ZmXCIpKSB7XG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25PZmZsaW5lKG1zZ09iaik7XG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwicmVhZFwiICkge1xuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uUmVhZChtc2dPYmopO1xuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcInN0YXJ0VHlwaW5nXCIgfHwgIG1zZ09iai5kYXRhLnR5cGUgPT0gXCJzdG9wVHlwaW5nXCIpIHtcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vblN0YXJ0U3RvcFR5cGluZyhtc2dPYmopO1xuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcIm5ld191c2VyXCIpIHtcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vbk5ld1VzZXIobXNnT2JqKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJyZW1vdmVfdXNlclwiKSB7XG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25SZW1vdmVVc2VyKG1zZ09iaik7XG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwiY2hhdF9jbG9zZWRcIikge1xuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uQ2hhdENsb3NlZChtc2dPYmopO1xuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcImNvdW50X25vdHJlYWRcIikge1xuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uQ291bnROb3RSZWFkKG1zZ09iaik7XG5cbiAgICAgICAgICB9XG4gICAgICAgIC8vfVxuXG4gICAgfVxuXG4gICAgYXN5bmMgY29ubmVjdFdlYnNvY2tldChjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2ssIHVzZXJJZDogc3RyaW5nKSB7XG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICBcbiAgICAgIGxldCBzZWN1cml0eVRva2VuID0gdGhpcy5nZXRCZWFyZXJUb2tlbigpO1xuXG4gICAgICBsZXQgdG9rZW5BdXRoID0gXCJcIjtcblxuICAgICAgaWYgKHNlY3VyaXR5VG9rZW4gJiYgc2VjdXJpdHlUb2tlbi5zdGFydHNXaXRoKFwiQmVhcmVyIFwiKSl7XG4gICAgICAgIHRva2VuQXV0aCA9IHNlY3VyaXR5VG9rZW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b2tlbkF1dGggPSBcIkJlYXJlciBcIiArIHNlY3VyaXR5VG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbmZpZ0lkID0gdGhpcy5jaGF0U2VydmVyLnNwbGl0KFwiL1wiKVszXTtcblxuICAgICAgY29uc3QgbmMgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm4odXNlcklkKTtcblxuICAgICAgLy9UT0RPIEdldCB0aGUgdXNlciBpZCBmcm9tIGp3dFxuICAgICAgY29uc3Qgc3ViamVjdCA9IGBjaGF0NGFwcC5jb25maWcuJHtjb25maWdJZH0udXNlci4ke3VzZXJJZH1gOyBcblxuICAgICAgY29uc3Qgc3ViID0gbmMuc3Vic2NyaWJlKHN1YmplY3QsIChtc2cpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzQW5kQ2FsbGJhY2soSlNPTi5wYXJzZShtc2cuZGF0YSksIGNoYXRDYWxsYmFjaykgIDtcbiAgICAgICAgXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgICB0aGF0LmludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PntcbiAgICAgICAgaWYgKHRoYXQuZGVidWcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcHVibGlzaCBjaGF0NGFwcC51c2VyLm9ubGluZSAke3VzZXJJZH0gYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5uYy5wdWJsaXNoKGBjaGF0NGFwcC51c2VyLm9ubGluZWAsIHVzZXJJZCkgO1xuICAgICAgfSwxMDAwKTtcblxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFN1YnNjcmliZSBvbmxpbmUgY2hhdDRhcHAudXNlci4ke3VzZXJJZH0ub25saW5lYCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgZGlzY29ubmVjdCgpIHtcbi8vICAgICAgY29uc29sZS5sb2coXCJkaXNjb25uZWN0XCIpXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy5zdG9tcENsaWVudCkge1xuICAgICAgICAgIHRoaXMuc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gIFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgKi9cblxuICAgIGNvbnZlcnRDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlVG9DaGF0TWVzc2FnZTRBcHAobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogQ2hhdE1lc3NhZ2U0QXBwe1xuICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgQ2hhdE1lc3NhZ2U0QXBwKCk7XG4gICAgICBtZXNzYWdlLmJvZHkgPSBtc2c/Lm5vdGlmaWNhdGlvbj8uYm9keTtcbiAgICAgIG1lc3NhZ2UuY2hhdElkID0gbXNnLmRhdGEuY2hhdElkO1xuICAgICAgbWVzc2FnZS5mcm9tSWQgPSBtc2cuZGF0YS5mcm9tSWQ7XG4gICAgICBtZXNzYWdlLnRvSWQgPSBtc2cuZGF0YS50b0lkO1xuICAgICAgbWVzc2FnZS5ncm91cElkID0gbXNnLmRhdGEuZ3JvdXBJZDtcbiAgICAgIG1lc3NhZ2UucmVwbHlGcm9tID0gbXNnLmRhdGEucmVwbHlGcm9tO1xuICAgICAgaWYgKG1zZy5kYXRhLmRhdGVIb3VyICYmIG1zZy5kYXRhLmRhdGVIb3VyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWVzc2FnZS5kYXRlSG91ckluY2x1ZGVkID0gbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDYsMTApICsgXCItXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5kYXRhLmRhdGVIb3VyLnN1YnN0cmluZygzLDUpICsgXCItXCIgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoMCwyKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDEwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcbiAgICAgIH1cbiAgICAgIG1lc3NhZ2UuaWQgPSBtc2cuZGF0YS5jaGF0TWVzc2FnZUlkO1xuXG4gICAgICBpZiAobXNnLmRhdGEuZmlsZUlkICYmIG1zZy5kYXRhLmZpbGVJZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBtZXNzYWdlRmlsZSA9IG5ldyBDaGF0TWVzc2FnZUZpbGU0QXBwKCk7XG4gICAgICAgIFxuICAgICAgICBtZXNzYWdlRmlsZS5pZCA9IG1zZy5kYXRhLmZpbGVJZDtcbiAgICAgICAgbWVzc2FnZUZpbGUubmFtZSA9IG1zZy5kYXRhLmZpbGVOYW1lO1xuICAgICAgICBtZXNzYWdlRmlsZS5zaXplID0gbXNnLmRhdGEuZmlsZVNpemU7XG4gICAgICAgIG1lc3NhZ2VGaWxlLnR5cGUgPSBtc2cuZGF0YS5maWxlVHlwZTtcblxuICAgICAgICBtZXNzYWdlLmNoYXRNZXNzYWdlRmlsZSA9IG1lc3NhZ2VGaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAobXNnLmRhdGEudkZpbGVJZCAmJiBtc2cuZGF0YS52RmlsZUlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VGaWxlID0gbmV3IENoYXRNZXNzYWdlRmlsZTRBcHAoKTtcbiAgICAgICAgXG4gICAgICAgIG1lc3NhZ2VGaWxlLmlkID0gbXNnLmRhdGEudkZpbGVJZDtcbiAgICAgICAgbWVzc2FnZUZpbGUubmFtZSA9IG1zZy5kYXRhLnZGaWxlTmFtZTtcbiAgICAgICAgbWVzc2FnZUZpbGUuc2l6ZSA9IG1zZy5kYXRhLnZGaWxlU2l6ZTtcbiAgICAgICAgbWVzc2FnZUZpbGUudHlwZSA9IG1zZy5kYXRhLnZGaWxlVHlwZTtcblxuICAgICAgICBtZXNzYWdlLmNoYXRWb2ljZUZpbGUgPSBtZXNzYWdlRmlsZTtcbiAgICAgIH1cblxuXG4gICAgICByZXR1cm4gbWVzc2FnZTtcblxuICAgIH1cbiAgXG4gIH1cbiAgXG4gIFxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29uZmlnSWQ6IHN0cmluZztcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBzdGF0dXM6IENoYXRTdGF0dXM0QXBwO1xuICAgIHVzZXJzOiBBcnJheTxDaGF0VXNlcjRBcHA+O1xuXG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XG4gIFxuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0VXNlcjRBcHAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNsaWVudFRva2VuOiBzdHJpbmc7XG4gICAgcGljdHVyZVBhdGg6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xuICAgIG1ldGE6IEFycmF5PENoYXRNZXNzYWdlTWV0YTRBcHA+O1xuICAgIHN0YXR1czogQ2hhdFVzZXJTdGF0dXM0QXBwO1xuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZTRBcHAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZnJvbUlkOiBzdHJpbmc7XG4gICAgdG9JZDogc3RyaW5nO1xuICAgIGNoYXRJZDogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgYm9keTogc3RyaW5nO1xuICAgIG1ldGE6IEFycmF5PENoYXRNZXNzYWdlTWV0YTRBcHA+O1xuICAgIGdyb3VwSWQ6IHN0cmluZztcbiAgICByZWFkOiBCb29sZWFuO1xuICAgIHJlcGx5RnJvbTogc3RyaW5nO1xuICAgIGRhdGVIb3VySW5jbHVkZWQ6IHN0cmluZztcbiAgICBnVG9JZFJlYWQ6IHN0cmluZ1tdO1xuICAgIGNoYXRNZXNzYWdlRmlsZTogQ2hhdE1lc3NhZ2VGaWxlNEFwcDtcbiAgICBjaGF0Vm9pY2VGaWxlOiBDaGF0TWVzc2FnZUZpbGU0QXBwO1xuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZUZpbGU0QXBwIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIGZ1bGxQYXRoOiBzdHJpbmc7XG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlTWV0YTRBcHAge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlIHtcbiAgICBkYXRhOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlRGF0YSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlRGF0YSgpO1xuICAgIG5vdGlmaWNhdGlvbjogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZU5vdGlmaWNhdGlvbiA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlTm90aWZpY2F0aW9uKCk7XG4gICAgdG9rZW46IHN0cmluZztcbiAgfVxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZURhdGEge1xuICAgIHRvSWQ6IHN0cmluZztcbiAgICBjaGF0SWQ6IHN0cmluZztcbiAgICBkYXRlSG91cjogc3RyaW5nO1xuICAgIGNoYXRNZXNzYWdlSWQ6IHN0cmluZztcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGZyb21JZDogc3RyaW5nO1xuICAgIHJlcGx5RnJvbTogc3RyaW5nO1xuICAgIGdyb3VwSWQ6IHN0cmluZztcbiAgICBmaWxlSWQ6IHN0cmluZztcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xuICAgIGZpbGVTaXplOiBudW1iZXI7XG4gICAgZmlsZVR5cGU6IHN0cmluZztcbiAgICB2RmlsZUlkOiBzdHJpbmc7XG4gICAgdkZpbGVOYW1lOiBzdHJpbmc7XG4gICAgdkZpbGVTaXplOiBudW1iZXI7XG4gICAgdkZpbGVUeXBlOiBzdHJpbmc7XG5cbiAgICBhbGw6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIH1cbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVOb3RpZmljYXRpb24ge1xuICAgIGJvZHk6IHN0cmluZztcbiAgfVxuICBcbiAgZXhwb3J0IGNsYXNzIENoYXRVc2VyUmVzcG9uc2U0QXBwIHtcbiAgICB0b3RhbE1lc3NhZ2VzOiBudW1iZXI7XG4gICAgY2hhdDogQ2hhdDRBcHA7XG4gICAgY2hhdE1lc3NhZ2U6IENoYXRNZXNzYWdlNEFwcDtcbiAgICBjaGF0czogQ2hhdFVzZXJSZXNwb25zZTRBcHBbXTtcbiAgfVxuICBleHBvcnQgY2xhc3MgQ2hhdEZpbHRlclJlcXVlc3Q0QXBwIHtcbiAgICB0eXBlOiBDaGF0RmlsdGVyVHlwZTtcbiAgICBjaGF0RXh0ZXJuYWxJZDogc3RyaW5nO1xuICAgIGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nO1xuICAgIGNoYXRVc2VyRXh0ZXJuYWxUb0lkOiBzdHJpbmc7XG4gICAgZ3JvdXBJZDogc3RyaW5nO1xuICAgIGZyb21JZDogc3RyaW5nO1xuICB9XG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGVuZHBvaW50OiBzdHJpbmcsIHB1YmxpYyBkZWJ1Zz86IGJvb2xlYW4pIHtcbiAgICAgIFxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcFRyYW5zbGF0ZSB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHRyYW5zbGF0ZWRUZXh0OiBzdHJpbmc7XG4gICAgb3JpZ2luYWxTb3VyY2VMYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBzb3VyY2VMYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICB0YXJnZXRMYW5ndWFnZUNvZGU6IHN0cmluZztcbiAgICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBDaGF0R3JvdXBBcHAge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY2hhdElkOiBzdHJpbmc7XG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICB1c2VyczogQXJyYXk8c3RyaW5nPjtcbiAgICBmaWxlczogQXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD47XG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XG4gICAgc3RhdHVzOiBHcm91cFN0YXR1czRBcHA7XG4gIH1cblxuICBcbiAgZXhwb3J0IGVudW0gQ2hhdFN0YXR1czRBcHAge1xuICAgIENSRUFURUQgPSBcIkNSRUFURURcIixcbiAgICBDTE9TRUQgPSBcIkNMT1NFRFwiXG4gIFxuICB9XG4gIGV4cG9ydCBlbnVtIENoYXRVc2VyU3RhdHVzNEFwcCB7XG4gICAgUkVNT1ZFRCA9IFwiUkVNT1ZFRFwiXG4gIFxuICB9XG4gIGV4cG9ydCBlbnVtIENoYXRGaWx0ZXJUeXBlIHtcbiAgICBDT1VOVF9OT1RfUkVBRCA9IDEsXG4gICAgTEFTVF9NRVNTQUdFID0gMlxuICB9XG5cbiAgZXhwb3J0IGVudW0gR3JvdXBTdGF0dXM0QXBwIHtcbiAgICBDUkVBVEVEID0gXCJDUkVBVEVEXCIsXG4gICAgQ0xPU0VEID0gXCJSRU1PVkVEXCJcbiAgfVxuXG4gIFxuICBleHBvcnQgaW50ZXJmYWNlIElDaGF0Q2FsbGJhY2sge1xuICAgIGlzVG9rZW5GaXJlYmFzZUFjdGl2ZSgpOiBCb29sZWFuO1xuICAgIG9uTWVzc2FnZShtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xuICAgIG9uT2ZmbGluZShtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xuICAgIG9uUmVhZChtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xuICAgIG9uU3RhcnRTdG9wVHlwaW5nKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25OZXdVc2VyKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25SZW1vdmVVc2VyKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25DaGF0Q2xvc2VkKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XG4gICAgb25Db3VudE5vdFJlYWQobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcbiAgfVxuICAiXX0=
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
4
+ import * as NATS from './nats.min.js';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ //declare let nats_min: any;
8
+ export class Chat4appClientAngularService {
9
+ constructor(http) {
10
+ this.http = http;
11
+ this.chatServer = "";
12
+ this.chatUrl = "";
13
+ this.debug = false;
14
+ this.chatUserExternalId = "";
15
+ this.timeoutReconnect = 500;
16
+ }
17
+ ngOnInit() {
18
+ }
19
+ config(chat4AppConfig) {
20
+ this.chatServer = chat4AppConfig.endpoint;
21
+ this.chatUrl = chat4AppConfig.endpoint + "/api/v1/";
22
+ this.debug = chat4AppConfig.debug;
23
+ }
24
+ init(securityChatToken, callback, chatCallback, connectionClientId) {
25
+ if (!this.chatServer || this.chatServer.trim().length == 0) {
26
+ throw new Error("Endpoint is empty");
27
+ }
28
+ if (!securityChatToken || securityChatToken.trim().length == 0) {
29
+ throw new Error("SecurityChatToken is empty");
30
+ }
31
+ this.setTokenChat4app(securityChatToken);
32
+ if (chatCallback && connectionClientId) {
33
+ this.connectWebsocket(chatCallback, connectionClientId);
34
+ }
35
+ callback(securityChatToken);
36
+ }
37
+ getChatUrlDownload(messageFileId) {
38
+ return this.chatUrl + "chatmessage/getFile?messageFileId=" + messageFileId + "&token=" + this.getBearerToken();
39
+ }
40
+ getMessageChat(chatId, fromId, toId) {
41
+ let url = this.chatUrl + "chatmessage/" + chatId + "/" + fromId + "/" + toId;
42
+ return this.http.get(url, {
43
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
44
+ });
45
+ }
46
+ getMessageChatByGrop(chatId, groupId, fromId) {
47
+ let url = this.chatUrl + "chatmessage/byGroup/" + chatId + "/" + groupId + "/" + fromId;
48
+ return this.http.get(url, {
49
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
50
+ });
51
+ }
52
+ addMessageChat(chatMessage4App) {
53
+ let url = this.chatUrl + "chatmessage/" + chatMessage4App.chatId;
54
+ return this.http.post(url, chatMessage4App, {
55
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
56
+ });
57
+ }
58
+ /*
59
+ props(chatFilterRequest4App: Array<ChatFilterRequest4App>): Observable<ChatUserResponse4App[]> {
60
+ let url = this.chatUrl + "chatmessage/props";
61
+
62
+ return this.http.post<ChatUserResponse4App[]>(url, chatFilterRequest4App,
63
+ {
64
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
65
+ })
66
+
67
+ }
68
+ */
69
+ removeUsersChat(chatId, chatUsersId, chatUsersExternalId) {
70
+ let params = new Array();
71
+ if (chatUsersId && chatUsersId.length > 0) {
72
+ chatUsersId.forEach(cui => {
73
+ params.push("chatUserId=" + cui);
74
+ });
75
+ }
76
+ else if (chatUsersExternalId && chatUsersExternalId.length > 0) {
77
+ chatUsersExternalId.forEach(cuei => {
78
+ params.push("chatUserExternalId=" + cuei);
79
+ });
80
+ }
81
+ let url = this.chatUrl + "chatuser/" + chatId + "?" + params.join("&");
82
+ return this.http.delete(url, {
83
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
84
+ });
85
+ }
86
+ removeUserChat(chatId, chatUserId, chatUserExternalId) {
87
+ let param = "";
88
+ if (chatUserId) {
89
+ param = "chatUserId=" + chatUserId;
90
+ }
91
+ else {
92
+ param = "chatUserExternalId=" + chatUserExternalId;
93
+ }
94
+ let url = this.chatUrl + "chatuser/" + chatId + "?" + param;
95
+ return this.http.delete(url, {
96
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
97
+ });
98
+ }
99
+ updateUserChat(chatId, charUser4AppUpdate) {
100
+ let url = this.chatUrl + "chatuser/" + chatId;
101
+ return this.http.put(url, charUser4AppUpdate, {
102
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
103
+ });
104
+ }
105
+ createUserChat(chatId, chatUser4App) {
106
+ let url = this.chatUrl + "chatuser/" + chatId;
107
+ return this.http.post(url, chatUser4App, {
108
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
109
+ });
110
+ }
111
+ createUsersChat(chatId, chatUser4App) {
112
+ let url = this.chatUrl + "chatuser/users/" + chatId;
113
+ return this.http.post(url, chatUser4App, {
114
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
115
+ });
116
+ }
117
+ createChat(chat4app) {
118
+ let url = this.chatUrl + "chat";
119
+ return this.http.post(url, chat4app, {
120
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
121
+ });
122
+ }
123
+ createUpdateChat(chat4app) {
124
+ let url = this.chatUrl + "chat";
125
+ return this.http.put(url, chat4app, {
126
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
127
+ });
128
+ }
129
+ /*
130
+ getLastMessageGroup(chatExternalId: string, groupId: string): Observable<ChatUserResponse4App> {
131
+
132
+ let url = this.chatUrl + "chatmessage/lastMessageGroup?chatExternalId=" + chatExternalId + "&groupId=" + groupId;
133
+
134
+ return this.http.get<ChatUserResponse4App>(url,
135
+ {
136
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
137
+ })
138
+ }
139
+ getLastMessage(chatExternalId: string, chatUserExternalId: string): Observable<ChatUserResponse4App> {
140
+
141
+ let url = this.chatUrl + "chatmessage/lastMessage?chatExternalId=" + chatExternalId + "&chatUserExternalId=" + chatUserExternalId;
142
+
143
+ return this.http.get<ChatUserResponse4App>(url,
144
+ {
145
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
146
+ })
147
+ }
148
+
149
+ countNotReadMessages(chatUserExternalId: string, chatExternalId?: string, groupId?: string, fromId?:string): Observable<ChatUserResponse4App> {
150
+
151
+ let url = this.chatUrl + "chatmessage/countNotReadMessages?chatUserExternalId=" + chatUserExternalId;
152
+
153
+ if (chatExternalId && chatExternalId.length > 0) {
154
+ url += "&chatExternalId=" + chatExternalId;
155
+ }
156
+
157
+ if (groupId && groupId.length > 0) {
158
+ url += "&groupId=" + groupId;
159
+ }
160
+
161
+ if (fromId && fromId.length > 0) {
162
+ url += "&fromId=" + groupId;
163
+ }
164
+
165
+ return this.http.get<ChatUserResponse4App>(url,
166
+ {
167
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
168
+ })
169
+ }
170
+ */
171
+ getChatByExternalId(externalId) {
172
+ let url = this.chatUrl + "chat?externalId=" + externalId;
173
+ return this.http.get(url, {
174
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
175
+ });
176
+ }
177
+ getChatById(id) {
178
+ let url = this.chatUrl + "chat?chatId=" + id;
179
+ return this.http.get(url, {
180
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
181
+ });
182
+ }
183
+ listChatByUser(externalUserId, userId, chatStatus) {
184
+ let url = this.chatUrl + "chat/listChatByUser/?externalUserId=" + externalUserId
185
+ + "&userId=" + userId
186
+ + "&chatStatus=" + chatStatus;
187
+ return this.http.get(url, {
188
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
189
+ });
190
+ }
191
+ closeChat(chatId, chatExternalId) {
192
+ let url = this.chatUrl;
193
+ if (chatId && chatId.length > 0) {
194
+ url += "chat?chatId=" + chatId;
195
+ }
196
+ if (chatExternalId && chatExternalId.length > 0) {
197
+ url += "chat?externalId=" + chatExternalId;
198
+ }
199
+ return this.http.delete(url, {
200
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
201
+ });
202
+ }
203
+ readMessage(chatMessageId, toId) {
204
+ let url = this.chatUrl + "chatmessage/read/" + chatMessageId;
205
+ if (toId && toId.length > 0) {
206
+ url += "/" + toId;
207
+ }
208
+ return this.http.put(url, null, {
209
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
210
+ });
211
+ }
212
+ online(chatId) {
213
+ let url = this.chatUrl + "chatmessage/online/" + chatId;
214
+ return this.http.get(url, {
215
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
216
+ });
217
+ }
218
+ setOffLine(chatUserExternalIdId) {
219
+ let url = this.chatUrl + "chatmessage/set-offline/" + chatUserExternalIdId;
220
+ return this.http.put(url, null, {
221
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
222
+ });
223
+ }
224
+ sendFile(chatId, fromId, toId, fileToUpload) {
225
+ const endpoint = this.chatUrl + "chatmessage/sendFile/" + chatId + "/" + fromId + "/" + toId;
226
+ const formData = new FormData();
227
+ formData.append('file', fileToUpload);
228
+ return this.http
229
+ .post(endpoint, formData, {
230
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
231
+ });
232
+ }
233
+ sendFileGroup(chatId, fromId, groupId, fileToUpload) {
234
+ const endpoint = this.chatUrl + "chatmessage/sendFileGroup/" + chatId + "/" + fromId + "/" + groupId;
235
+ const formData = new FormData();
236
+ formData.append('file', fileToUpload);
237
+ return this.http
238
+ .post(endpoint, formData, {
239
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
240
+ });
241
+ }
242
+ /*
243
+ translateMessage(chatMessageId: string, languageTarget: string): Observable<Chat4AppTranslate> {
244
+
245
+ let url = this.chatUrl + "chatmessage/translate/" + chatMessageId + "/" + languageTarget;
246
+
247
+ return this.http.get<Chat4AppTranslate>(url,
248
+ {
249
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
250
+ })
251
+ }
252
+ */
253
+ startTyping(chatId, fromId, toId) {
254
+ let url = this.chatUrl + "chatmessage/startTyping/" + chatId + "/" + fromId + "/" + toId;
255
+ return this.http.put(url, null, {
256
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
257
+ });
258
+ }
259
+ startTypingGroup(chatId, fromId, groupId) {
260
+ let url = this.chatUrl + "chatmessage/startTypingGroup/" + chatId + "/" + fromId + "/" + groupId;
261
+ return this.http.put(url, null, {
262
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
263
+ });
264
+ }
265
+ stopTyping(chatId, fromId, toId) {
266
+ let url = this.chatUrl + "chatmessage/stopTyping/" + chatId + "/" + fromId + "/" + toId;
267
+ return this.http.put(url, null, {
268
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
269
+ });
270
+ }
271
+ stopTypingGroup(chatId, fromId, groupId) {
272
+ let url = this.chatUrl + "chatmessage/stopTypingGroup/" + chatId + "/" + fromId + "/" + groupId;
273
+ return this.http.put(url, null, {
274
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
275
+ });
276
+ }
277
+ createGroup(group) {
278
+ let url = this.chatUrl + "group";
279
+ return this.http.post(url, group, {
280
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
281
+ });
282
+ }
283
+ getGroup(chatId, groupId) {
284
+ let url = this.chatUrl + "group/" + groupId + "/" + chatId;
285
+ return this.http.get(url, {
286
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
287
+ });
288
+ }
289
+ listGroups(chatId, externalId) {
290
+ let url = this.chatUrl + "group/";
291
+ if (chatId && chatId.length > 0) {
292
+ url += "&chatId=" + chatId;
293
+ }
294
+ if (externalId && externalId.length > 0) {
295
+ url += "&externalId=" + externalId;
296
+ }
297
+ return this.http.get(url, {
298
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
299
+ });
300
+ }
301
+ listFilesGroup(chatId, groupId) {
302
+ let url = this.chatUrl + "group/" + chatId;
303
+ if (groupId && groupId.length > 0) {
304
+ url += "&groupId=" + chatId;
305
+ }
306
+ return this.http.get(url, {
307
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
308
+ });
309
+ }
310
+ event(eventName, chatUserExternalId) {
311
+ let url = this.chatUrl + "event/" + eventName + "?chatUserExternalId=" + chatUserExternalId;
312
+ return this.http.put(url, null, {
313
+ headers: new HttpHeaders().set('Authorization', this.getBearerToken())
314
+ });
315
+ }
316
+ /* Token */
317
+ getBearerToken() {
318
+ let ret = "Bearer " + window.sessionStorage.getItem("chat4AppSessionToken");
319
+ return ret;
320
+ }
321
+ setTokenChat4app(chat4AppSessionToken) {
322
+ window.sessionStorage.setItem("chat4AppSessionToken", chat4AppSessionToken);
323
+ }
324
+ /* Connection */
325
+ onMessageFirebaseReceived(data, chatCallback) {
326
+ //alert("onMessageReceived connectFirebase");
327
+ if (data.type == "msg") {
328
+ let chat4appMessage = new Chat4AppMessageReceive();
329
+ chat4appMessage.data.chatId = data.chatId;
330
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
331
+ chat4appMessage.data.externalId = data.externalId;
332
+ chat4appMessage.data.fromId = data.fromId;
333
+ chat4appMessage.data.toId = data.toId;
334
+ chat4appMessage.data.groupId = data.groupId;
335
+ chat4appMessage.data.dateHour = data.dateHour;
336
+ chat4appMessage.data.type = data.type;
337
+ chat4appMessage.notification.body = data.body;
338
+ if (data.fileId && data.fileId.length > 0) {
339
+ chat4appMessage.data.fileId = data.fileId;
340
+ chat4appMessage.data.fileName = data.fileName;
341
+ chat4appMessage.data.fileSize = data.fileSize;
342
+ chat4appMessage.data.fileType = data.fileType;
343
+ }
344
+ let datTmp = new Map();
345
+ for (let key in data) {
346
+ datTmp.set(key, data[key]);
347
+ }
348
+ chat4appMessage.data.all = datTmp;
349
+ chatCallback.onMessage(chat4appMessage);
350
+ }
351
+ else if ((data.type == "on" || data.type == "off")) {
352
+ let chat4appMessage = new Chat4AppMessageReceive();
353
+ chat4appMessage.data.chatId = data.chatId;
354
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
355
+ chat4appMessage.data.externalId = data.externalId;
356
+ chat4appMessage.data.fromId = data.fromId;
357
+ chat4appMessage.data.toId = data.toId;
358
+ chat4appMessage.data.groupId = data.groupId;
359
+ chat4appMessage.data.dateHour = data.dateHour;
360
+ chat4appMessage.data.type = data.type;
361
+ let datTmp = new Map();
362
+ for (let key in data) {
363
+ datTmp.set(key, data[key]);
364
+ }
365
+ chat4appMessage.data.all = datTmp;
366
+ chatCallback.onOffline(chat4appMessage);
367
+ }
368
+ else if (data.type == "read") {
369
+ let chat4appMessage = new Chat4AppMessageReceive();
370
+ chat4appMessage.data.chatId = data.chatId;
371
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
372
+ chat4appMessage.data.externalId = data.externalId;
373
+ chat4appMessage.data.fromId = data.fromId;
374
+ chat4appMessage.data.toId = data.toId;
375
+ chat4appMessage.data.groupId = data.groupId;
376
+ chat4appMessage.data.dateHour = data.dateHour;
377
+ chat4appMessage.data.type = data.type;
378
+ let datTmp = new Map();
379
+ for (let key in data) {
380
+ datTmp.set(key, data[key]);
381
+ }
382
+ chat4appMessage.data.all = datTmp;
383
+ chatCallback.onRead(chat4appMessage);
384
+ }
385
+ else if (data.type == "startTyping" || data.type == "stopTyping") {
386
+ let chat4appMessage = new Chat4AppMessageReceive();
387
+ chat4appMessage.data.chatId = data.chatId;
388
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
389
+ chat4appMessage.data.externalId = data.externalId;
390
+ chat4appMessage.data.fromId = data.fromId;
391
+ chat4appMessage.data.toId = data.toId;
392
+ chat4appMessage.data.groupId = data.groupId;
393
+ chat4appMessage.data.dateHour = data.dateHour;
394
+ chat4appMessage.data.type = data.type;
395
+ let datTmp = new Map();
396
+ for (let key in data) {
397
+ datTmp.set(key, data[key]);
398
+ }
399
+ chat4appMessage.data.all = datTmp;
400
+ chatCallback.onStartStopTyping(chat4appMessage);
401
+ }
402
+ else if (data.type == "new_user") {
403
+ let chat4appMessage = new Chat4AppMessageReceive();
404
+ chat4appMessage.data.chatId = data.chatId;
405
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
406
+ chat4appMessage.data.externalId = data.externalId;
407
+ chat4appMessage.data.fromId = data.fromId;
408
+ chat4appMessage.data.toId = data.toId;
409
+ chat4appMessage.data.groupId = data.groupId;
410
+ chat4appMessage.data.dateHour = data.dateHour;
411
+ chat4appMessage.data.type = data.type;
412
+ let datTmp = new Map();
413
+ for (let key in data) {
414
+ datTmp.set(key, data[key]);
415
+ }
416
+ chat4appMessage.data.all = datTmp;
417
+ chatCallback.onNewUser(chat4appMessage);
418
+ }
419
+ else if (data.type == "remove_user") {
420
+ let chat4appMessage = new Chat4AppMessageReceive();
421
+ chat4appMessage.data.chatId = data.chatId;
422
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
423
+ chat4appMessage.data.externalId = data.externalId;
424
+ chat4appMessage.data.fromId = data.fromId;
425
+ chat4appMessage.data.toId = data.toId;
426
+ chat4appMessage.data.groupId = data.groupId;
427
+ chat4appMessage.data.dateHour = data.dateHour;
428
+ chat4appMessage.data.type = data.type;
429
+ let datTmp = new Map();
430
+ for (let key in data) {
431
+ datTmp.set(key, data[key]);
432
+ }
433
+ chat4appMessage.data.all = datTmp;
434
+ chatCallback.onRemoveUser(chat4appMessage);
435
+ }
436
+ else if (data.type == "chat_closed") {
437
+ let chat4appMessage = new Chat4AppMessageReceive();
438
+ chat4appMessage.data.chatId = data.chatId;
439
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
440
+ chat4appMessage.data.externalId = data.externalId;
441
+ chat4appMessage.data.fromId = data.fromId;
442
+ chat4appMessage.data.toId = data.toId;
443
+ chat4appMessage.data.groupId = data.groupId;
444
+ chat4appMessage.data.dateHour = data.dateHour;
445
+ chat4appMessage.data.type = data.type;
446
+ let datTmp = new Map();
447
+ for (let key in data) {
448
+ datTmp.set(key, data[key]);
449
+ }
450
+ chat4appMessage.data.all = datTmp;
451
+ chatCallback.onChatClosed(chat4appMessage);
452
+ }
453
+ else if (data.type == "count_notread") {
454
+ console.log("count_notread");
455
+ console.log(data);
456
+ let chat4appMessage = new Chat4AppMessageReceive();
457
+ chat4appMessage.data.chatId = data.chatId;
458
+ chat4appMessage.data.chatMessageId = data.chatMessageId;
459
+ chat4appMessage.data.externalId = data.externalId;
460
+ chat4appMessage.data.fromId = data.fromId;
461
+ chat4appMessage.data.toId = data.toId;
462
+ chat4appMessage.data.groupId = data.groupId;
463
+ chat4appMessage.data.dateHour = data.dateHour;
464
+ chat4appMessage.data.type = data.type;
465
+ let datTmp = new Map();
466
+ for (let key in data) {
467
+ datTmp.set(key, data[key]);
468
+ }
469
+ chat4appMessage.data.all = datTmp;
470
+ chatCallback.onCountNotRead(chat4appMessage);
471
+ }
472
+ }
473
+ ensureConn(chatUserExternalId) {
474
+ return __awaiter(this, void 0, void 0, function* () {
475
+ if (this.debug) {
476
+ console.log(`chatServer: ${this.chatServer}`);
477
+ console.log(`userId: ${chatUserExternalId}`);
478
+ console.log(`getBearerToken: ${this.getBearerToken()}`);
479
+ }
480
+ const that = this;
481
+ let uriStep1 = this.chatServer.replace(/^https/, 'wss');
482
+ let server = uriStep1.replace(/(\/\/.*?)\//, '$1\/ws/');
483
+ if (this.debug) {
484
+ console.log(`ws server: ${server}`);
485
+ }
486
+ if (!this.nc || (this.nc.isClose && this.nc.isClose())) {
487
+ that.nc = yield NATS.connect({ url: server, user: chatUserExternalId, pass: this.getBearerToken(), reconnect: true });
488
+ }
489
+ this.chatUserExternalId = chatUserExternalId;
490
+ return that.nc;
491
+ });
492
+ }
493
+ disconnect() {
494
+ return __awaiter(this, void 0, void 0, function* () {
495
+ // Check how we can disconnect
496
+ if (this.interval) {
497
+ try {
498
+ clearInterval(this.interval);
499
+ }
500
+ catch (e) {
501
+ }
502
+ }
503
+ if (this.nc && this.chatUserExternalId && this.chatUserExternalId.length > 0 && this.getBearerToken() && this.getBearerToken().length > 0) {
504
+ this.setOffLine(this.chatUserExternalId).subscribe(() => {
505
+ if (this.debug) {
506
+ console.log("had set offline");
507
+ }
508
+ });
509
+ }
510
+ if (this.nc) {
511
+ try {
512
+ yield this.nc.close();
513
+ }
514
+ catch (e) {
515
+ if (this.debug) {
516
+ console.error(e);
517
+ }
518
+ }
519
+ this.nc = undefined;
520
+ }
521
+ if (this.debug) {
522
+ console.log("disconect");
523
+ }
524
+ });
525
+ }
526
+ processAndCallback(msgObj, chatCallback) {
527
+ if (this.debug && msgObj) {
528
+ console.log("Msg Received: " + JSON.stringify(msgObj));
529
+ }
530
+ //if (!chatCallback.isTokenFirebaseActive()) {
531
+ let datTmp = new Map();
532
+ for (let key in msgObj.data) {
533
+ datTmp.set(key, msgObj.data[key]);
534
+ }
535
+ msgObj.data.all = datTmp;
536
+ if (msgObj.data.type == "msg") {
537
+ chatCallback.onMessage(msgObj);
538
+ }
539
+ else if ((msgObj.data.type == "on" || msgObj.data.type == "off")) {
540
+ chatCallback.onOffline(msgObj);
541
+ }
542
+ else if (msgObj.data.type == "read") {
543
+ chatCallback.onRead(msgObj);
544
+ }
545
+ else if (msgObj.data.type == "startTyping" || msgObj.data.type == "stopTyping") {
546
+ chatCallback.onStartStopTyping(msgObj);
547
+ }
548
+ else if (msgObj.data.type == "new_user") {
549
+ chatCallback.onNewUser(msgObj);
550
+ }
551
+ else if (msgObj.data.type == "remove_user") {
552
+ chatCallback.onRemoveUser(msgObj);
553
+ }
554
+ else if (msgObj.data.type == "chat_closed") {
555
+ chatCallback.onChatClosed(msgObj);
556
+ }
557
+ else if (msgObj.data.type == "count_notread") {
558
+ chatCallback.onCountNotRead(msgObj);
559
+ }
560
+ //}
561
+ }
562
+ connectWebsocket(chatCallback, userId) {
563
+ return __awaiter(this, void 0, void 0, function* () {
564
+ const that = this;
565
+ this.disconnect();
566
+ let securityToken = this.getBearerToken();
567
+ let tokenAuth = "";
568
+ if (securityToken && securityToken.startsWith("Bearer ")) {
569
+ tokenAuth = securityToken;
570
+ }
571
+ else {
572
+ tokenAuth = "Bearer " + securityToken;
573
+ }
574
+ const configId = this.chatServer.split("/")[3];
575
+ const nc = yield this.ensureConn(userId);
576
+ //TODO Get the user id from jwt
577
+ const subject = `chat4app.config.${configId}.user.${userId}`;
578
+ const sub = nc.subscribe(subject, (msg) => {
579
+ if (this.debug) {
580
+ console.log(msg);
581
+ }
582
+ this.processAndCallback(JSON.parse(msg.data), chatCallback);
583
+ });
584
+ if (this.interval) {
585
+ try {
586
+ clearInterval(this.interval);
587
+ }
588
+ catch (e) {
589
+ }
590
+ }
591
+ that.interval = setInterval(() => {
592
+ if (that.debug) {
593
+ console.log(`publish chat4app.user.online ${userId} `);
594
+ }
595
+ try {
596
+ that.nc.publish(`chat4app.user.online`, userId);
597
+ }
598
+ catch (e) {
599
+ if (this.debug) {
600
+ console.log("try reconnect...");
601
+ }
602
+ this.ensureConn(userId);
603
+ }
604
+ }, 1000);
605
+ if (this.debug) {
606
+ console.log(`Subscribe online chat4app.user.${userId}.online`);
607
+ }
608
+ });
609
+ }
610
+ /*
611
+ disconnect() {
612
+ // console.log("disconnect")
613
+ try {
614
+ if (this.stompClient) {
615
+ this.stompClient.disconnect();
616
+ }
617
+
618
+ } catch (e) {
619
+ console.log(e);
620
+ }
621
+ }
622
+ */
623
+ convertChat4AppMessageReceiveToChatMessage4App(msg) {
624
+ var _a;
625
+ let message = new ChatMessage4App();
626
+ message.body = (_a = msg === null || msg === void 0 ? void 0 : msg.notification) === null || _a === void 0 ? void 0 : _a.body;
627
+ message.chatId = msg.data.chatId;
628
+ message.fromId = msg.data.fromId;
629
+ message.toId = msg.data.toId;
630
+ message.groupId = msg.data.groupId;
631
+ message.replyFrom = msg.data.replyFrom;
632
+ if (msg.data.dateHour && msg.data.dateHour.length > 0) {
633
+ message.dateHourIncluded = msg.data.dateHour.substring(6, 10) + "-"
634
+ + msg.data.dateHour.substring(3, 5) + "-"
635
+ + msg.data.dateHour.substring(0, 2)
636
+ + msg.data.dateHour.substring(10);
637
+ }
638
+ message.id = msg.data.chatMessageId;
639
+ if (msg.data.fileId && msg.data.fileId.length > 0) {
640
+ let messageFile = new ChatMessageFile4App();
641
+ messageFile.id = msg.data.fileId;
642
+ messageFile.name = msg.data.fileName;
643
+ messageFile.size = msg.data.fileSize;
644
+ messageFile.type = msg.data.fileType;
645
+ message.chatMessageFile = messageFile;
646
+ }
647
+ if (msg.data.vFileId && msg.data.vFileId.length > 0) {
648
+ let messageFile = new ChatMessageFile4App();
649
+ messageFile.id = msg.data.vFileId;
650
+ messageFile.name = msg.data.vFileName;
651
+ messageFile.size = msg.data.vFileSize;
652
+ messageFile.type = msg.data.vFileType;
653
+ message.chatVoiceFile = messageFile;
654
+ }
655
+ return message;
656
+ }
657
+ }
658
+ Chat4appClientAngularService.ɵprov = i0.ɵɵdefineInjectable({ factory: function Chat4appClientAngularService_Factory() { return new Chat4appClientAngularService(i0.ɵɵinject(i1.HttpClient)); }, token: Chat4appClientAngularService, providedIn: "root" });
659
+ Chat4appClientAngularService.decorators = [
660
+ { type: Injectable, args: [{
661
+ providedIn: 'root'
662
+ },] }
663
+ ];
664
+ Chat4appClientAngularService.ctorParameters = () => [
665
+ { type: HttpClient }
666
+ ];
667
+ export class Chat4App {
668
+ }
669
+ export class ChatUser4App {
670
+ }
671
+ export class ChatMessage4App {
672
+ }
673
+ export class ChatMessageFile4App {
674
+ }
675
+ export class ChatMessageMeta4App {
676
+ }
677
+ export class Chat4AppMessageReceive {
678
+ constructor() {
679
+ this.data = new Chat4AppMessageReceiveData();
680
+ this.notification = new Chat4AppMessageReceiveNotification();
681
+ }
682
+ }
683
+ export class Chat4AppMessageReceiveData {
684
+ }
685
+ export class Chat4AppMessageReceiveNotification {
686
+ }
687
+ export class ChatUserResponse4App {
688
+ }
689
+ export class ChatFilterRequest4App {
690
+ }
691
+ export class Chat4AppConfig {
692
+ constructor(endpoint, debug) {
693
+ this.endpoint = endpoint;
694
+ this.debug = debug;
695
+ }
696
+ }
697
+ export class Chat4AppTranslate {
698
+ }
699
+ export class ChatGroupApp {
700
+ }
701
+ export var ChatStatus4App;
702
+ (function (ChatStatus4App) {
703
+ ChatStatus4App["CREATED"] = "CREATED";
704
+ ChatStatus4App["CLOSED"] = "CLOSED";
705
+ })(ChatStatus4App || (ChatStatus4App = {}));
706
+ export var ChatUserStatus4App;
707
+ (function (ChatUserStatus4App) {
708
+ ChatUserStatus4App["REMOVED"] = "REMOVED";
709
+ })(ChatUserStatus4App || (ChatUserStatus4App = {}));
710
+ export var ChatFilterType;
711
+ (function (ChatFilterType) {
712
+ ChatFilterType[ChatFilterType["COUNT_NOT_READ"] = 1] = "COUNT_NOT_READ";
713
+ ChatFilterType[ChatFilterType["LAST_MESSAGE"] = 2] = "LAST_MESSAGE";
714
+ })(ChatFilterType || (ChatFilterType = {}));
715
+ export var GroupStatus4App;
716
+ (function (GroupStatus4App) {
717
+ GroupStatus4App["CREATED"] = "CREATED";
718
+ GroupStatus4App["CLOSED"] = "REMOVED";
719
+ })(GroupStatus4App || (GroupStatus4App = {}));
720
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQ0YXBwLWNsaWVudC1hbmd1bGFyL3NyYy9saWIvY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDOzs7QUFHdEMsNEJBQTRCO0FBSzVCLE1BQU0sT0FBTyw0QkFBNEI7SUFhckMsWUFBcUIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVRyQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2QsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBRXhCLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztJQU12QixDQUFDO0lBQ0QsUUFBUTtJQUNSLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBOEI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUU7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLENBQUMsaUJBQXlCLEVBQUUsUUFBYSxFQUFFLFlBQTRCLEVBQUUsa0JBQTJCO1FBRXBHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLElBQUksaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBQztZQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDL0M7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV6QyxJQUFJLFlBQVksSUFBSSxrQkFBa0IsRUFBRTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDekQ7UUFFRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsYUFBcUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLG9DQUFvQyxHQUFHLGFBQWEsR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ2pILENBQUM7SUFHRCxjQUFjLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxJQUFZO1FBQ3pELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFFN0UsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBeUIsR0FBRyxFQUM5QztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUVOLENBQUM7SUFDRCxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsT0FBZSxFQUFFLE1BQWM7UUFDbEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzQkFBc0IsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBRXhGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXlCLEdBQUcsRUFDOUM7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFFTixDQUFDO0lBR0QsY0FBYyxDQUFDLGVBQWdDO1FBQzdDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFFakUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBa0IsR0FBRyxFQUFFLGVBQWUsRUFDekQ7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFFTixDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7TUFVRTtJQUdGLGVBQWUsQ0FBQyxNQUFjLEVBQUUsV0FBc0IsRUFBRSxtQkFBOEI7UUFDcEYsSUFBSSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUV6QyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxtQkFBbUIsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2hFLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQTtTQUVIO1FBRUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQWlCLEdBQUcsRUFDekM7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWMsRUFBRSxVQUFtQixFQUFFLGtCQUEyQjtRQUM3RSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLFVBQVUsRUFBRTtZQUNkLEtBQUssR0FBRyxhQUFhLEdBQUcsVUFBVSxDQUFDO1NBQ3BDO2FBQU07WUFDTCxLQUFLLEdBQUcscUJBQXFCLEdBQUcsa0JBQWtCLENBQUM7U0FDcEQ7UUFFRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUU1RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFlLEdBQUcsRUFDdkM7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQWMsRUFBRSxrQkFBZ0M7UUFFN0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRTlDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWUsR0FBRyxFQUFFLGtCQUFrQixFQUN4RDtZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFHRCxjQUFjLENBQUMsTUFBYyxFQUFFLFlBQTBCO1FBQ3ZELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUU5QyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFlLEdBQUcsRUFBRSxZQUFZLEVBQ25EO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFjLEVBQUUsWUFBNEI7UUFDMUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBaUIsR0FBRyxFQUFFLFlBQVksRUFDckQ7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBR0QsVUFBVSxDQUFDLFFBQWtCO1FBQzNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQVcsR0FBRyxFQUFFLFFBQVEsRUFDM0M7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsUUFBa0I7UUFDakMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFaEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBVyxHQUFHLEVBQUUsUUFBUSxFQUMxQztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF5Q0U7SUFFRixtQkFBbUIsQ0FBQyxVQUFrQjtRQUVwQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztRQUV6RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLEdBQUcsRUFDaEM7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQVU7UUFFcEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRTdDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVcsR0FBRyxFQUNoQztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxjQUFjLENBQUMsY0FBc0IsRUFBRSxNQUFjLEVBQUUsVUFBMEI7UUFFL0UsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxzQ0FBc0MsR0FBRyxjQUFjO2NBQzlFLFVBQVUsR0FBRyxNQUFNO2NBQ25CLGNBQWMsR0FBRyxVQUFVLENBQUM7UUFFOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBa0IsR0FBRyxFQUN2QztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLGNBQXNCO1FBRTlDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUU7UUFFeEIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7WUFDOUIsR0FBRyxJQUFHLGNBQWMsR0FBRyxNQUFNLENBQUM7U0FDL0I7UUFFRCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztZQUM5QyxHQUFHLElBQUcsa0JBQWtCLEdBQUcsY0FBYyxDQUFDO1NBQzNDO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBTyxHQUFHLEVBQy9CO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELFdBQVcsQ0FBQyxhQUFxQixFQUFFLElBQWE7UUFFOUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQkFBbUIsR0FBRyxhQUFhLENBQUM7UUFFN0QsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFPLEdBQUcsRUFBRSxJQUFJLEVBQ2xDO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFjO1FBRW5CLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcscUJBQXFCLEdBQUcsTUFBTSxDQUFFO1FBRXpELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVMsR0FBRyxFQUM5QjtZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDRCxVQUFVLENBQUMsb0JBQTRCO1FBRXJDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsMEJBQTBCLEdBQUcsb0JBQW9CLENBQUU7UUFFNUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBUyxHQUFHLEVBQUUsSUFBSSxFQUNwQztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFHRCxRQUFRLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsWUFBa0I7UUFDdkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyx1QkFBdUIsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBRTdGLE1BQU0sUUFBUSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7UUFDMUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFdEMsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLElBQUksQ0FBc0IsUUFBUSxFQUFFLFFBQVEsRUFDM0M7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsT0FBZSxFQUFFLFlBQWtCO1FBQy9FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsNEJBQTRCLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUVyRyxNQUFNLFFBQVEsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixJQUFJLENBQXNCLFFBQVEsRUFBRSxRQUFRLEVBQzNDO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUNEOzs7Ozs7Ozs7O01BVUU7SUFFRixXQUFXLENBQUMsTUFBYyxFQUFDLE1BQWMsRUFBRSxJQUFZO1FBRXJELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsMEJBQTBCLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUV6RixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFPLEdBQUcsRUFBRSxJQUFJLEVBQ2xDO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGdCQUFnQixDQUFDLE1BQWMsRUFBQyxNQUFjLEVBQUUsT0FBZTtRQUU3RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLCtCQUErQixHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7UUFFakcsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBTyxHQUFHLEVBQUUsSUFBSSxFQUNsQztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDRCxVQUFVLENBQUMsTUFBYyxFQUFDLE1BQWMsRUFBRSxJQUFZO1FBRXBELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcseUJBQXlCLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUV4RixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFPLEdBQUcsRUFBRSxJQUFJLEVBQ2xDO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFjLEVBQUMsTUFBYyxFQUFFLE9BQWU7UUFFNUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyw4QkFBOEIsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDO1FBRWhHLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU8sR0FBRyxFQUFFLElBQUksRUFDbEM7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQW1CO1FBQzdCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRWpDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWUsR0FBRyxFQUFFLEtBQUssRUFDNUM7WUFDRSxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2RSxDQUFDLENBQUE7SUFDTixDQUFDO0lBQ0QsUUFBUSxDQUFDLE1BQWMsRUFBRSxPQUFlO1FBRXRDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBRTNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWUsR0FBRyxFQUNwQztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBZSxFQUFFLFVBQW1CO1FBRTdDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFFO1FBRW5DLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUU7WUFDckMsR0FBRyxJQUFJLGNBQWMsR0FBRyxVQUFVLENBQUM7U0FDcEM7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFzQixHQUFHLEVBQzNDO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjLEVBQUUsT0FBZTtRQUU1QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUU7UUFFNUMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUU7WUFDL0IsR0FBRyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUM7U0FDN0I7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUE2QixHQUFHLEVBQ2xEO1lBQ0UsT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkUsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFpQixFQUFFLGtCQUEwQjtRQUVqRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0JBQXNCLEdBQUcsa0JBQWtCLENBQUU7UUFFN0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBTyxHQUFHLEVBQUUsSUFBSSxFQUNsQztZQUNFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZFLENBQUMsQ0FBQTtJQUVOLENBQUM7SUFFRCxXQUFXO0lBQ1gsY0FBYztRQUVaLElBQUksR0FBRyxHQUFHLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTVFLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUdELGdCQUFnQixDQUFDLG9CQUE0QjtRQUczQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFHRCxnQkFBZ0I7SUFFaEIseUJBQXlCLENBQUMsSUFBUyxFQUFFLFlBQTJCO1FBRzlELDZDQUE2QztRQUU3QyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFFO1lBRXRCLElBQUksZUFBZSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEQsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNsRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUU5QyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM5QyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUM5QyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBRS9DO1lBRUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFFdkMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBRWxDLFlBQVksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7U0FFekM7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNwRCxJQUFJLGVBQWUsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3hELGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDbEQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXRDLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBRXZDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM1QjtZQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUVsQyxZQUFZLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBRXpDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRztZQUMvQixJQUFJLGVBQWUsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3hELGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDbEQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXRDLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBRXZDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM1QjtZQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUVsQyxZQUFZLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3RDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRztZQUNuRSxJQUFJLGVBQWUsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3hELGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDbEQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXRDLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBRXZDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM1QjtZQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUVsQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDakQ7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFJO1lBQ3BDLElBQUksZUFBZSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEQsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNsRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFFdkMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBRWxDLFlBQVksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDekM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFJO1lBQ3ZDLElBQUksZUFBZSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEQsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNsRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFFdkMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBRWxDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDNUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFJO1lBQ3ZDLElBQUksZUFBZSxHQUFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUNuRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEQsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNsRCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdEMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzlDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFFdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7WUFFdkMsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1lBRWxDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDNUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFJO1lBRXpDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVqQixJQUFJLGVBQWUsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3hELGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDbEQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDNUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXRDLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1lBRXZDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM1QjtZQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUVsQyxZQUFZLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzlDO0lBR0gsQ0FBQztJQUVLLFVBQVUsQ0FBQyxrQkFBMEI7O1lBRXpDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW9CLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDMUQ7WUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7WUFFbEIsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRWhFLElBQUksTUFBTSxHQUFXLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsTUFBTSxFQUFFLENBQUMsQ0FBQzthQUNyQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO2dCQUV0RCxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7YUFFdEg7WUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7WUFFN0MsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pCLENBQUM7S0FBQTtJQUVLLFVBQVU7O1lBRWQsOEJBQThCO1lBRTlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsSUFBSTtvQkFDRixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QjtnQkFBQyxPQUFPLENBQUMsRUFBRTtpQkFFWDthQUNGO1lBRUQsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUUsRUFBRTtvQkFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFDO3dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDaEM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJO29CQUNGLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDdkI7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFDO3dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ2xCO2lCQUNGO2dCQUNELElBQUksQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDO2FBQ3JCO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFDO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7YUFDekI7UUFFSCxDQUFDO0tBQUE7SUFFRCxrQkFBa0IsQ0FBQyxNQUFXLEVBQUUsWUFBMkI7UUFFdkQsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RDtRQUVELDhDQUE4QztRQUU1QyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUV2QyxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDO1FBRXpCLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFFO1lBQzdCLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ2xFLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRztZQUN0QyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdCO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxhQUFhLElBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFO1lBQ2pGLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QzthQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFO1lBQ3pDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRTtZQUM1QyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ25DO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUU7WUFDNUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQzthQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFO1lBQzlDLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FFckM7UUFDSCxHQUFHO0lBRVAsQ0FBQztJQUVLLGdCQUFnQixDQUFDLFlBQTJCLEVBQUUsTUFBYzs7WUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUVsQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFMUMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBRW5CLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUM7Z0JBQ3ZELFNBQVMsR0FBRyxhQUFhLENBQUM7YUFDM0I7aUJBQU07Z0JBQ0wsU0FBUyxHQUFHLFNBQVMsR0FBRyxhQUFhLENBQUM7YUFDdkM7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvQyxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFekMsK0JBQStCO1lBQy9CLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixRQUFRLFNBQVMsTUFBTSxFQUFFLENBQUM7WUFFN0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2xCO2dCQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBRztZQUVoRSxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDakIsSUFBSTtvQkFDRixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUM5QjtnQkFBQyxPQUFPLENBQUMsRUFBRTtpQkFFWDthQUNGO1lBR0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRSxFQUFFO2dCQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDeEQ7Z0JBQ0QsSUFBSTtvQkFDRixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsQ0FBRTtpQkFDbEQ7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztxQkFDakM7b0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDekI7WUFFSCxDQUFDLEVBQUMsSUFBSSxDQUFDLENBQUM7WUFFUixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsTUFBTSxTQUFTLENBQUMsQ0FBQzthQUNoRTtRQUNILENBQUM7S0FBQTtJQUNEOzs7Ozs7Ozs7Ozs7TUFZRTtJQUVGLDhDQUE4QyxDQUFDLEdBQTJCOztRQUN4RSxJQUFJLE9BQU8sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxJQUFJLFNBQUcsR0FBRyxhQUFILEdBQUcsdUJBQUgsR0FBRyxDQUFFLFlBQVksMENBQUUsSUFBSSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakMsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNqQyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDbkMsT0FBTyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2QyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckQsT0FBTyxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRztrQkFDcEMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsR0FBRyxHQUFHO2tCQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztrQkFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUNoQztTQUM5QjtRQUNELE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFcEMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELElBQUksV0FBVyxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUU1QyxXQUFXLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2pDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDckMsV0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRXJDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25ELElBQUksV0FBVyxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUU1QyxXQUFXLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDdEMsV0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN0QyxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRXRDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO1NBQ3JDO1FBR0QsT0FBTyxPQUFPLENBQUM7SUFFakIsQ0FBQzs7OztZQTkxQkosVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUFUUSxVQUFVOztBQTAyQmpCLE1BQU0sT0FBTyxRQUFRO0NBVXBCO0FBQ0QsTUFBTSxPQUFPLFlBQVk7Q0FVeEI7QUFDRCxNQUFNLE9BQU8sZUFBZTtDQWUzQjtBQUNELE1BQU0sT0FBTyxtQkFBbUI7Q0FNL0I7QUFDRCxNQUFNLE9BQU8sbUJBQW1CO0NBRy9CO0FBQ0QsTUFBTSxPQUFPLHNCQUFzQjtJQUFuQztRQUNFLFNBQUksR0FBK0IsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1FBQ3BFLGlCQUFZLEdBQXVDLElBQUksa0NBQWtDLEVBQUUsQ0FBQztJQUU5RixDQUFDO0NBQUE7QUFDRCxNQUFNLE9BQU8sMEJBQTBCO0NBb0J0QztBQUNELE1BQU0sT0FBTyxrQ0FBa0M7Q0FFOUM7QUFFRCxNQUFNLE9BQU8sb0JBQW9CO0NBS2hDO0FBQ0QsTUFBTSxPQUFPLHFCQUFxQjtDQU9qQztBQUNELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQW1CLFFBQWdCLEVBQVMsS0FBZTtRQUF4QyxhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBVTtJQUUzRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0NBTzdCO0FBRUQsTUFBTSxPQUFPLFlBQVk7Q0FVeEI7QUFHRCxNQUFNLENBQU4sSUFBWSxjQUlYO0FBSkQsV0FBWSxjQUFjO0lBQ3hCLHFDQUFtQixDQUFBO0lBQ25CLG1DQUFpQixDQUFBO0FBRW5CLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQUNELE1BQU0sQ0FBTixJQUFZLGtCQUdYO0FBSEQsV0FBWSxrQkFBa0I7SUFDNUIseUNBQW1CLENBQUE7QUFFckIsQ0FBQyxFQUhXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFHN0I7QUFDRCxNQUFNLENBQU4sSUFBWSxjQUdYO0FBSEQsV0FBWSxjQUFjO0lBQ3hCLHVFQUFrQixDQUFBO0lBQ2xCLG1FQUFnQixDQUFBO0FBQ2xCLENBQUMsRUFIVyxjQUFjLEtBQWQsY0FBYyxRQUd6QjtBQUVELE1BQU0sQ0FBTixJQUFZLGVBR1g7QUFIRCxXQUFZLGVBQWU7SUFDekIsc0NBQW1CLENBQUE7SUFDbkIscUNBQWtCLENBQUE7QUFDcEIsQ0FBQyxFQUhXLGVBQWUsS0FBZixlQUFlLFFBRzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIE5BVFMgZnJvbSAnLi9uYXRzLm1pbi5qcyc7XHJcblxyXG5cclxuLy9kZWNsYXJlIGxldCBuYXRzX21pbjogYW55O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hhdDRhcHBDbGllbnRBbmd1bGFyU2VydmljZSBpbXBsZW1lbnRzIE9uSW5pdCAge1xyXG5cclxuICAgIG5jOiBhbnk7XHJcblxyXG4gICAgY2hhdFNlcnZlciA9IFwiXCI7XHJcbiAgICBjaGF0VXJsID0gXCJcIjtcclxuICAgIGRlYnVnID0gZmFsc2U7XHJcbiAgICBjaGF0VXNlckV4dGVybmFsSWQgPSBcIlwiO1xyXG4gICAgXHJcbiAgICB0aW1lb3V0UmVjb25uZWN0ID0gNTAwO1xyXG5cclxuICAgIGludGVydmFsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICBcclxuICAgIH1cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpZyhjaGF0NEFwcENvbmZpZzogQ2hhdDRBcHBDb25maWcpIHtcclxuICAgICAgdGhpcy5jaGF0U2VydmVyID0gY2hhdDRBcHBDb25maWcuZW5kcG9pbnQ7XHJcbiAgICAgIHRoaXMuY2hhdFVybCA9IGNoYXQ0QXBwQ29uZmlnLmVuZHBvaW50ICsgXCIvYXBpL3YxL1wiIDtcclxuICAgICAgdGhpcy5kZWJ1ZyA9IGNoYXQ0QXBwQ29uZmlnLmRlYnVnO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgaW5pdChzZWN1cml0eUNoYXRUb2tlbjogc3RyaW5nLCBjYWxsYmFjazogYW55LCBjaGF0Q2FsbGJhY2s/OiBJQ2hhdENhbGxiYWNrLCBjb25uZWN0aW9uQ2xpZW50SWQ/OiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmNoYXRTZXJ2ZXIgfHwgdGhpcy5jaGF0U2VydmVyLnRyaW0oKS5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmRwb2ludCBpcyBlbXB0eVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWN1cml0eUNoYXRUb2tlbiB8fCBzZWN1cml0eUNoYXRUb2tlbi50cmltKCkubGVuZ3RoID09IDApe1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VjdXJpdHlDaGF0VG9rZW4gaXMgZW1wdHlcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFRva2VuQ2hhdDRhcHAoc2VjdXJpdHlDaGF0VG9rZW4pO1xyXG4gIFxyXG4gICAgICAgIGlmIChjaGF0Q2FsbGJhY2sgJiYgY29ubmVjdGlvbkNsaWVudElkKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbm5lY3RXZWJzb2NrZXQoY2hhdENhbGxiYWNrLCBjb25uZWN0aW9uQ2xpZW50SWQpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjYWxsYmFjayhzZWN1cml0eUNoYXRUb2tlbik7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBnZXRDaGF0VXJsRG93bmxvYWQobWVzc2FnZUZpbGVJZDogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2dldEZpbGU/bWVzc2FnZUZpbGVJZD1cIiArIG1lc3NhZ2VGaWxlSWQgKyBcIiZ0b2tlbj1cIiArIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKTtcclxuICAgIH1cclxuICBcclxuICBcclxuICAgIGdldE1lc3NhZ2VDaGF0KGNoYXRJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0TWVzc2FnZTRBcHA+PiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL1wiICsgY2hhdElkICsgXCIvXCIgKyBmcm9tSWQgKyBcIi9cIiArIHRvSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlNEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICBcclxuICAgIH1cclxuICAgIGdldE1lc3NhZ2VDaGF0QnlHcm9wKGNoYXRJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcsIGZyb21JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0TWVzc2FnZTRBcHA+PiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2J5R3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGdyb3VwSWQgKyBcIi9cIiArIGZyb21JZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gIFxyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgYWRkTWVzc2FnZUNoYXQoY2hhdE1lc3NhZ2U0QXBwOiBDaGF0TWVzc2FnZTRBcHApOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlNEFwcD4ge1xyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9cIiArIGNoYXRNZXNzYWdlNEFwcC5jaGF0SWQ7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdE1lc3NhZ2U0QXBwPih1cmwsIGNoYXRNZXNzYWdlNEFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICBcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICBwcm9wcyhjaGF0RmlsdGVyUmVxdWVzdDRBcHA6IEFycmF5PENoYXRGaWx0ZXJSZXF1ZXN0NEFwcD4pOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwW10+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvcHJvcHNcIjtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXRVc2VyUmVzcG9uc2U0QXBwW10+KHVybCwgY2hhdEZpbHRlclJlcXVlc3Q0QXBwLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gIFxyXG4gICAgfVxyXG4gICAgKi8gICAgXHJcbiAgXHJcbiAgXHJcbiAgICByZW1vdmVVc2Vyc0NoYXQoY2hhdElkOiBzdHJpbmcsIGNoYXRVc2Vyc0lkPzogc3RyaW5nW10sIGNoYXRVc2Vyc0V4dGVybmFsSWQ/OiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwW10+IHtcclxuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBpZiAoY2hhdFVzZXJzSWQgJiYgY2hhdFVzZXJzSWQubGVuZ3RoID4gMCkge1xyXG4gIFxyXG4gICAgICAgIGNoYXRVc2Vyc0lkLmZvckVhY2goY3VpID0+IHtcclxuICAgICAgICAgIHBhcmFtcy5wdXNoKFwiY2hhdFVzZXJJZD1cIiArIGN1aSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hhdFVzZXJzRXh0ZXJuYWxJZCAmJiBjaGF0VXNlcnNFeHRlcm5hbElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjaGF0VXNlcnNFeHRlcm5hbElkLmZvckVhY2goY3VlaSA9PiB7XHJcbiAgICAgICAgICBwYXJhbXMucHVzaChcImNoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGN1ZWkpO1xyXG4gICAgICAgIH0pXHJcbiAgXHJcbiAgICAgIH1cclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvXCIgKyBjaGF0SWQgKyBcIj9cIiArIHBhcmFtcy5qb2luKFwiJlwiKTtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q2hhdFVzZXI0QXBwW10+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICAgIHJlbW92ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcklkPzogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xyXG4gICAgICBsZXQgcGFyYW0gPSBcIlwiO1xyXG4gICAgICBpZiAoY2hhdFVzZXJJZCkge1xyXG4gICAgICAgIHBhcmFtID0gXCJjaGF0VXNlcklkPVwiICsgY2hhdFVzZXJJZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbSA9IFwiY2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkICsgXCI/XCIgKyBwYXJhbTtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q2hhdFVzZXI0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgICB1cGRhdGVVc2VyQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhclVzZXI0QXBwVXBkYXRlOiBDaGF0VXNlcjRBcHApOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8Q2hhdFVzZXI0QXBwPih1cmwsIGNoYXJVc2VyNEFwcFVwZGF0ZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICBcclxuICAgIGNyZWF0ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcjRBcHA6IENoYXRVc2VyNEFwcCk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXI0QXBwPih1cmwsIGNoYXRVc2VyNEFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICAgIGNyZWF0ZVVzZXJzQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXI0QXBwOiBDaGF0VXNlcjRBcHBbXSk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwW10+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvdXNlcnMvXCIgKyBjaGF0SWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0VXNlcjRBcHBbXT4odXJsLCBjaGF0VXNlcjRBcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICBjcmVhdGVDaGF0KGNoYXQ0YXBwOiBDaGF0NEFwcCk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdFwiO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdDRBcHA+KHVybCwgY2hhdDRhcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjcmVhdGVVcGRhdGVDaGF0KGNoYXQ0YXBwOiBDaGF0NEFwcCk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdFwiO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDaGF0NEFwcD4odXJsLCBjaGF0NGFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICAgIC8qXHJcbiAgICBnZXRMYXN0TWVzc2FnZUdyb3VwKGNoYXRFeHRlcm5hbElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvbGFzdE1lc3NhZ2VHcm91cD9jaGF0RXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkICsgXCImZ3JvdXBJZD1cIiArIGdyb3VwSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBnZXRMYXN0TWVzc2FnZShjaGF0RXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvbGFzdE1lc3NhZ2U/Y2hhdEV4dGVybmFsSWQ9XCIgKyBjaGF0RXh0ZXJuYWxJZCArIFwiJmNoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGNoYXRVc2VyRXh0ZXJuYWxJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdFVzZXJSZXNwb25zZTRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICAgICBcclxuICAgIGNvdW50Tm90UmVhZE1lc3NhZ2VzKGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZD86IHN0cmluZywgZ3JvdXBJZD86IHN0cmluZywgZnJvbUlkPzpzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2NvdW50Tm90UmVhZE1lc3NhZ2VzP2NoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGNoYXRVc2VyRXh0ZXJuYWxJZDtcclxuICBcclxuICAgICAgaWYgKGNoYXRFeHRlcm5hbElkICYmIGNoYXRFeHRlcm5hbElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCImY2hhdEV4dGVybmFsSWQ9XCIgKyBjaGF0RXh0ZXJuYWxJZDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAoZ3JvdXBJZCAmJiBncm91cElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCImZ3JvdXBJZD1cIiArIGdyb3VwSWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmcm9tSWQgJiYgZnJvbUlkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCImZnJvbUlkPVwiICsgZ3JvdXBJZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdFVzZXJSZXNwb25zZTRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICovXHJcbiAgXHJcbiAgICBnZXRDaGF0QnlFeHRlcm5hbElkKGV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9leHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGF0QnlJZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0NEFwcD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0P2NoYXRJZD1cIiArIGlkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0NEFwcD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpc3RDaGF0QnlVc2VyKGV4dGVybmFsVXNlcklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBjaGF0U3RhdHVzOiBDaGF0U3RhdHVzNEFwcCApOiBPYnNlcnZhYmxlPEFycmF5PCBDaGF0NEFwcD4+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdC9saXN0Q2hhdEJ5VXNlci8/ZXh0ZXJuYWxVc2VySWQ9XCIgKyBleHRlcm5hbFVzZXJJZCBcclxuICAgICAgKyBcIiZ1c2VySWQ9XCIgKyB1c2VySWRcclxuICAgICAgKyBcIiZjaGF0U3RhdHVzPVwiICsgY2hhdFN0YXR1cztcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdDRBcHA+Pih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgO1xyXG5cclxuICAgICAgaWYgKGNoYXRJZCAmJiBjaGF0SWQubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgdXJsKz0gXCJjaGF0P2NoYXRJZD1cIiArIGNoYXRJZDsgXHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChjaGF0RXh0ZXJuYWxJZCAmJiBjaGF0RXh0ZXJuYWxJZC5sZW5ndGggPiAwKXtcclxuICAgICAgICB1cmwrPSBcImNoYXQ/ZXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkOyBcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVhZE1lc3NhZ2UoY2hhdE1lc3NhZ2VJZDogc3RyaW5nLCB0b0lkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3JlYWQvXCIgKyBjaGF0TWVzc2FnZUlkO1xyXG4gIFxyXG4gICAgICBpZiAodG9JZCAmJiB0b0lkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCIvXCIgKyB0b0lkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIG9ubGluZShjaGF0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL29ubGluZS9cIiArIGNoYXRJZCA7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgc2V0T2ZmTGluZShjaGF0VXNlckV4dGVybmFsSWRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2V0LW9mZmxpbmUvXCIgKyBjaGF0VXNlckV4dGVybmFsSWRJZCA7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PG51bWJlcj4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzZW5kRmlsZShjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XHJcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zZW5kRmlsZS9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xyXG4gIFxyXG4gICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZVRvVXBsb2FkKTtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgIC5wb3N0PENoYXRNZXNzYWdlRmlsZTRBcHA+KGVuZHBvaW50LCBmb3JtRGF0YSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBzZW5kRmlsZUdyb3VwKGNoYXRJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBmaWxlVG9VcGxvYWQ6IEZpbGUpOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlRmlsZTRBcHA+IHtcclxuICAgICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3NlbmRGaWxlR3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgZ3JvdXBJZDtcclxuICBcclxuICAgICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVUb1VwbG9hZCk7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgICAucG9zdDxDaGF0TWVzc2FnZUZpbGU0QXBwPihlbmRwb2ludCwgZm9ybURhdGEsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLypcclxuICAgIHRyYW5zbGF0ZU1lc3NhZ2UoY2hhdE1lc3NhZ2VJZDogc3RyaW5nLCBsYW5ndWFnZVRhcmdldDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0NEFwcFRyYW5zbGF0ZT4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS90cmFuc2xhdGUvXCIgKyBjaGF0TWVzc2FnZUlkICsgXCIvXCIgKyBsYW5ndWFnZVRhcmdldDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHBUcmFuc2xhdGU+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICovXHJcblxyXG4gICAgc3RhcnRUeXBpbmcoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zdGFydFR5cGluZy9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRUeXBpbmdHcm91cChjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0YXJ0VHlwaW5nR3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgZ3JvdXBJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgc3RvcFR5cGluZyhjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0b3BUeXBpbmcvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0b3BUeXBpbmdHcm91cChjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0b3BUeXBpbmdHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlR3JvdXAoZ3JvdXA6IENoYXRHcm91cEFwcCk6IE9ic2VydmFibGU8Q2hhdEdyb3VwQXBwPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImdyb3VwXCI7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0R3JvdXBBcHA+KHVybCwgZ3JvdXAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBnZXRHcm91cChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0R3JvdXBBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiZ3JvdXAvXCIgKyBncm91cElkICsgXCIvXCIgKyBjaGF0SWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRHcm91cEFwcD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpc3RHcm91cHMoY2hhdElkPzogc3RyaW5nLCBleHRlcm5hbElkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0R3JvdXBBcHA+PiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImdyb3VwL1wiIDtcclxuXHJcbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmNoYXRJZD1cIiArIGNoYXRJZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0ZXJuYWxJZCAmJiBleHRlcm5hbElkLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmV4dGVybmFsSWQ9XCIgKyBleHRlcm5hbElkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRHcm91cEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBsaXN0RmlsZXNHcm91cChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0TWVzc2FnZUZpbGU0QXBwPj4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJncm91cC9cIiArIGNoYXRJZCA7XHJcblxyXG4gICAgICBpZiAoZ3JvdXBJZCAmJiBncm91cElkLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmdyb3VwSWQ9XCIgKyBjaGF0SWQ7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBldmVudChldmVudE5hbWU6IHN0cmluZywgY2hhdFVzZXJFeHRlcm5hbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiZXZlbnQvXCIgKyBldmVudE5hbWUgKyBcIj9jaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjaGF0VXNlckV4dGVybmFsSWQgO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KSAgICAgIFxyXG5cclxuICAgIH1cclxuICBcclxuICAgIC8qIFRva2VuICovXHJcbiAgICBnZXRCZWFyZXJUb2tlbigpOiBzdHJpbmcge1xyXG4gIFxyXG4gICAgICBsZXQgcmV0ID0gXCJCZWFyZXIgXCIgKyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcImNoYXQ0QXBwU2Vzc2lvblRva2VuXCIpO1xyXG4gIFxyXG4gICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgc2V0VG9rZW5DaGF0NGFwcChjaGF0NEFwcFNlc3Npb25Ub2tlbjogc3RyaW5nKSB7XHJcbiAgXHJcbiAgXHJcbiAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiY2hhdDRBcHBTZXNzaW9uVG9rZW5cIiwgY2hhdDRBcHBTZXNzaW9uVG9rZW4pO1xyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgLyogQ29ubmVjdGlvbiAqL1xyXG4gIFxyXG4gICAgb25NZXNzYWdlRmlyZWJhc2VSZWNlaXZlZChkYXRhOiBhbnksIGNoYXRDYWxsYmFjazogSUNoYXRDYWxsYmFjaykge1xyXG4gIFxyXG4gIFxyXG4gICAgICAvL2FsZXJ0KFwib25NZXNzYWdlUmVjZWl2ZWQgY29ubmVjdEZpcmViYXNlXCIpO1xyXG4gIFxyXG4gICAgICBpZiAoZGF0YS50eXBlID09IFwibXNnXCIpIHtcclxuICBcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5ub3RpZmljYXRpb24uYm9keSA9IGRhdGEuYm9keTtcclxuICBcclxuICAgICAgICBpZiAoZGF0YS5maWxlSWQgJiYgZGF0YS5maWxlSWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZmlsZUlkID0gZGF0YS5maWxlSWQ7XHJcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlTmFtZSA9IGRhdGEuZmlsZU5hbWU7XHJcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlU2l6ZSA9IGRhdGEuZmlsZVNpemU7XHJcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlVHlwZSA9IGRhdGEuZmlsZVR5cGU7XHJcbiAgXHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gIFxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xyXG4gIFxyXG4gICAgICAgIGNoYXRDYWxsYmFjay5vbk1lc3NhZ2UoY2hhdDRhcHBNZXNzYWdlKTtcclxuICBcclxuICAgICAgfSBlbHNlIGlmICgoZGF0YS50eXBlID09IFwib25cIiB8fCBkYXRhLnR5cGUgPT0gXCJvZmZcIikpIHtcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG5cclxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICBcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcclxuICBcclxuICAgICAgICBjaGF0Q2FsbGJhY2sub25PZmZsaW5lKGNoYXQ0YXBwTWVzc2FnZSk7XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcInJlYWRcIiApIHtcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG5cclxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICBcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcclxuICBcclxuICAgICAgICBjaGF0Q2FsbGJhY2sub25SZWFkKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwic3RhcnRUeXBpbmdcIiB8fCBkYXRhLnR5cGUgPT0gXCJzdG9wVHlwaW5nXCIgKSB7XHJcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XHJcbiAgXHJcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uU3RhcnRTdG9wVHlwaW5nKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwibmV3X3VzZXJcIiAgKSB7XHJcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XHJcbiAgXHJcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uTmV3VXNlcihjaGF0NGFwcE1lc3NhZ2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcInJlbW92ZV91c2VyXCIgICkge1xyXG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRNZXNzYWdlSWQgPSBkYXRhLmNoYXRNZXNzYWdlSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50b0lkID0gZGF0YS50b0lkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnR5cGUgPSBkYXRhLnR5cGU7XHJcblxyXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gIFxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xyXG4gIFxyXG4gICAgICAgIGNoYXRDYWxsYmFjay5vblJlbW92ZVVzZXIoY2hhdDRhcHBNZXNzYWdlKTtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJjaGF0X2Nsb3NlZFwiICApIHtcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG5cclxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICBcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcclxuICBcclxuICAgICAgICBjaGF0Q2FsbGJhY2sub25DaGF0Q2xvc2VkKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwiY291bnRfbm90cmVhZFwiICApIHtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjb3VudF9ub3RyZWFkXCIpXHJcbiAgICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuXHJcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XHJcbiAgXHJcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uQ291bnROb3RSZWFkKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5zdXJlQ29ubihjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgY2hhdFNlcnZlcjogJHt0aGlzLmNoYXRTZXJ2ZXJ9YCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYHVzZXJJZDogJHtjaGF0VXNlckV4dGVybmFsSWR9YCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGdldEJlYXJlclRva2VuOiAkeyB0aGlzLmdldEJlYXJlclRva2VuKCl9YCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHVyaVN0ZXAxOiBzdHJpbmcgPSB0aGlzLmNoYXRTZXJ2ZXIucmVwbGFjZSgvXmh0dHBzLywgJ3dzcycpO1xyXG5cclxuICAgICAgbGV0IHNlcnZlcjogc3RyaW5nID0gdXJpU3RlcDEucmVwbGFjZSgvKFxcL1xcLy4qPylcXC8vLCAnJDFcXC93cy8nKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYHdzIHNlcnZlcjogJHtzZXJ2ZXJ9YCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5uYyB8fCAodGhpcy5uYy5pc0Nsb3NlICYmIHRoaXMubmMuaXNDbG9zZSgpKSkge1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoYXQubmMgPSBhd2FpdCBOQVRTLmNvbm5lY3QoeyB1cmw6IHNlcnZlciwgdXNlcjogY2hhdFVzZXJFeHRlcm5hbElkLCBwYXNzOiB0aGlzLmdldEJlYXJlclRva2VuKCksIHJlY29ubmVjdDogdHJ1ZX0pO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQgPSBjaGF0VXNlckV4dGVybmFsSWQ7XHJcblxyXG4gICAgICByZXR1cm4gdGhhdC5uYztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNjb25uZWN0KCkge1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaG93IHdlIGNhbiBkaXNjb25uZWN0XHJcblxyXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubmMgJiYgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQgJiYgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQubGVuZ3RoID4gMCAmJiB0aGlzLmdldEJlYXJlclRva2VuKCkgJiYgdGhpcy5nZXRCZWFyZXJUb2tlbigpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnNldE9mZkxpbmUodGhpcy5jaGF0VXNlckV4dGVybmFsSWQpLnN1YnNjcmliZSgoKT0+e1xyXG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcImhhZCBzZXQgb2ZmbGluZVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMubmMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5uYy5jbG9zZSgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5uYyA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpe1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZGlzY29uZWN0XCIpXHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc0FuZENhbGxiYWNrKG1zZ09iajogYW55LCBjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2spIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWcgJiYgbXNnT2JqKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIk1zZyBSZWNlaXZlZDogXCIgKyBKU09OLnN0cmluZ2lmeShtc2dPYmopKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy9pZiAoIWNoYXRDYWxsYmFjay5pc1Rva2VuRmlyZWJhc2VBY3RpdmUoKSkge1xyXG5cclxuICAgICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGtleSBpbiBtc2dPYmouZGF0YSkge1xyXG4gICAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgbXNnT2JqLmRhdGFba2V5XSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbXNnT2JqLmRhdGEuYWxsID0gZGF0VG1wO1xyXG5cclxuICAgICAgICAgIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwibXNnXCIpIHtcclxuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uTWVzc2FnZShtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICgobXNnT2JqLmRhdGEudHlwZSA9PSBcIm9uXCIgfHwgbXNnT2JqLmRhdGEudHlwZSA9PSBcIm9mZlwiKSkge1xyXG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25PZmZsaW5lKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJyZWFkXCIgKSB7XHJcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vblJlYWQobXNnT2JqKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcInN0YXJ0VHlwaW5nXCIgfHwgIG1zZ09iai5kYXRhLnR5cGUgPT0gXCJzdG9wVHlwaW5nXCIpIHtcclxuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uU3RhcnRTdG9wVHlwaW5nKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJuZXdfdXNlclwiKSB7XHJcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vbk5ld1VzZXIobXNnT2JqKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcInJlbW92ZV91c2VyXCIpIHtcclxuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uUmVtb3ZlVXNlcihtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwiY2hhdF9jbG9zZWRcIikge1xyXG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25DaGF0Q2xvc2VkKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJjb3VudF9ub3RyZWFkXCIpIHtcclxuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uQ291bnROb3RSZWFkKG1zZ09iaik7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb25uZWN0V2Vic29ja2V0KGNoYXRDYWxsYmFjazogSUNoYXRDYWxsYmFjaywgdXNlcklkOiBzdHJpbmcpIHtcclxuICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gIFxyXG4gICAgICBsZXQgc2VjdXJpdHlUb2tlbiA9IHRoaXMuZ2V0QmVhcmVyVG9rZW4oKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbkF1dGggPSBcIlwiO1xyXG5cclxuICAgICAgaWYgKHNlY3VyaXR5VG9rZW4gJiYgc2VjdXJpdHlUb2tlbi5zdGFydHNXaXRoKFwiQmVhcmVyIFwiKSl7XHJcbiAgICAgICAgdG9rZW5BdXRoID0gc2VjdXJpdHlUb2tlbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b2tlbkF1dGggPSBcIkJlYXJlciBcIiArIHNlY3VyaXR5VG9rZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbmZpZ0lkID0gdGhpcy5jaGF0U2VydmVyLnNwbGl0KFwiL1wiKVszXTtcclxuXHJcbiAgICAgIGNvbnN0IG5jID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uKHVzZXJJZCk7XHJcblxyXG4gICAgICAvL1RPRE8gR2V0IHRoZSB1c2VyIGlkIGZyb20gand0XHJcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBgY2hhdDRhcHAuY29uZmlnLiR7Y29uZmlnSWR9LnVzZXIuJHt1c2VySWR9YDsgXHJcblxyXG4gICAgICBjb25zdCBzdWIgPSBuYy5zdWJzY3JpYmUoc3ViamVjdCwgKG1zZykgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQW5kQ2FsbGJhY2soSlNPTi5wYXJzZShtc2cuZGF0YSksIGNoYXRDYWxsYmFjaykgIDtcclxuICAgICAgICBcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHRoYXQuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKT0+e1xyXG4gICAgICAgIGlmICh0aGF0LmRlYnVnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhgcHVibGlzaCBjaGF0NGFwcC51c2VyLm9ubGluZSAke3VzZXJJZH0gYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGF0Lm5jLnB1Ymxpc2goYGNoYXQ0YXBwLnVzZXIub25saW5lYCwgdXNlcklkKSA7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0cnkgcmVjb25uZWN0Li4uXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5lbnN1cmVDb25uKHVzZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICB9LDEwMDApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgU3Vic2NyaWJlIG9ubGluZSBjaGF0NGFwcC51c2VyLiR7dXNlcklkfS5vbmxpbmVgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLypcclxuICAgIGRpc2Nvbm5lY3QoKSB7XHJcbi8vICAgICAgY29uc29sZS5sb2coXCJkaXNjb25uZWN0XCIpXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RvbXBDbGllbnQpIHtcclxuICAgICAgICAgIHRoaXMuc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAqL1xyXG5cclxuICAgIGNvbnZlcnRDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlVG9DaGF0TWVzc2FnZTRBcHAobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogQ2hhdE1lc3NhZ2U0QXBwe1xyXG4gICAgICBsZXQgbWVzc2FnZSA9IG5ldyBDaGF0TWVzc2FnZTRBcHAoKTtcclxuICAgICAgbWVzc2FnZS5ib2R5ID0gbXNnPy5ub3RpZmljYXRpb24/LmJvZHk7XHJcbiAgICAgIG1lc3NhZ2UuY2hhdElkID0gbXNnLmRhdGEuY2hhdElkO1xyXG4gICAgICBtZXNzYWdlLmZyb21JZCA9IG1zZy5kYXRhLmZyb21JZDtcclxuICAgICAgbWVzc2FnZS50b0lkID0gbXNnLmRhdGEudG9JZDtcclxuICAgICAgbWVzc2FnZS5ncm91cElkID0gbXNnLmRhdGEuZ3JvdXBJZDtcclxuICAgICAgbWVzc2FnZS5yZXBseUZyb20gPSBtc2cuZGF0YS5yZXBseUZyb207XHJcbiAgICAgIGlmIChtc2cuZGF0YS5kYXRlSG91ciAmJiBtc2cuZGF0YS5kYXRlSG91ci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbWVzc2FnZS5kYXRlSG91ckluY2x1ZGVkID0gbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDYsMTApICsgXCItXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDMsNSkgKyBcIi1cIiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDAsMikgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLmRhdGEuZGF0ZUhvdXIuc3Vic3RyaW5nKDEwKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO1xyXG4gICAgICB9XHJcbiAgICAgIG1lc3NhZ2UuaWQgPSBtc2cuZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG5cclxuICAgICAgaWYgKG1zZy5kYXRhLmZpbGVJZCAmJiBtc2cuZGF0YS5maWxlSWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlRmlsZSA9IG5ldyBDaGF0TWVzc2FnZUZpbGU0QXBwKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbWVzc2FnZUZpbGUuaWQgPSBtc2cuZGF0YS5maWxlSWQ7XHJcbiAgICAgICAgbWVzc2FnZUZpbGUubmFtZSA9IG1zZy5kYXRhLmZpbGVOYW1lO1xyXG4gICAgICAgIG1lc3NhZ2VGaWxlLnNpemUgPSBtc2cuZGF0YS5maWxlU2l6ZTtcclxuICAgICAgICBtZXNzYWdlRmlsZS50eXBlID0gbXNnLmRhdGEuZmlsZVR5cGU7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhdE1lc3NhZ2VGaWxlID0gbWVzc2FnZUZpbGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtc2cuZGF0YS52RmlsZUlkICYmIG1zZy5kYXRhLnZGaWxlSWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlRmlsZSA9IG5ldyBDaGF0TWVzc2FnZUZpbGU0QXBwKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbWVzc2FnZUZpbGUuaWQgPSBtc2cuZGF0YS52RmlsZUlkO1xyXG4gICAgICAgIG1lc3NhZ2VGaWxlLm5hbWUgPSBtc2cuZGF0YS52RmlsZU5hbWU7XHJcbiAgICAgICAgbWVzc2FnZUZpbGUuc2l6ZSA9IG1zZy5kYXRhLnZGaWxlU2l6ZTtcclxuICAgICAgICBtZXNzYWdlRmlsZS50eXBlID0gbXNnLmRhdGEudkZpbGVUeXBlO1xyXG5cclxuICAgICAgICBtZXNzYWdlLmNoYXRWb2ljZUZpbGUgPSBtZXNzYWdlRmlsZTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHJldHVybiBtZXNzYWdlO1xyXG5cclxuICAgIH1cclxuICBcclxuICB9XHJcbiAgXHJcbiAgXHJcbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBjb25maWdJZDogc3RyaW5nO1xyXG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIHN0YXR1czogQ2hhdFN0YXR1czRBcHA7XHJcbiAgICB1c2VyczogQXJyYXk8Q2hhdFVzZXI0QXBwPjtcclxuXHJcbiAgICBtZXRhOiBBcnJheTxDaGF0TWVzc2FnZU1ldGE0QXBwPjtcclxuICBcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXRVc2VyNEFwcCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgY2xpZW50VG9rZW46IHN0cmluZztcclxuICAgIHBpY3R1cmVQYXRoOiBzdHJpbmc7XHJcbiAgICBlbWFpbDogc3RyaW5nO1xyXG4gICAgcGhvbmVOdW1iZXI6IHN0cmluZztcclxuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcclxuICAgIG1ldGE6IEFycmF5PENoYXRNZXNzYWdlTWV0YTRBcHA+O1xyXG4gICAgc3RhdHVzOiBDaGF0VXNlclN0YXR1czRBcHA7XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZTRBcHAge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGZyb21JZDogc3RyaW5nO1xyXG4gICAgdG9JZDogc3RyaW5nO1xyXG4gICAgY2hhdElkOiBzdHJpbmc7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgYm9keTogc3RyaW5nO1xyXG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XHJcbiAgICBncm91cElkOiBzdHJpbmc7XHJcbiAgICByZWFkOiBCb29sZWFuO1xyXG4gICAgcmVwbHlGcm9tOiBzdHJpbmc7XHJcbiAgICBkYXRlSG91ckluY2x1ZGVkOiBzdHJpbmc7XHJcbiAgICBnVG9JZFJlYWQ6IHN0cmluZ1tdO1xyXG4gICAgY2hhdE1lc3NhZ2VGaWxlOiBDaGF0TWVzc2FnZUZpbGU0QXBwO1xyXG4gICAgY2hhdFZvaWNlRmlsZTogQ2hhdE1lc3NhZ2VGaWxlNEFwcDtcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlRmlsZTRBcHAge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIHNpemU6IG51bWJlcjtcclxuICAgIGZ1bGxQYXRoOiBzdHJpbmc7XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZU1ldGE0QXBwIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlIHtcclxuICAgIGRhdGE6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVEYXRhID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVEYXRhKCk7XHJcbiAgICBub3RpZmljYXRpb246IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVOb3RpZmljYXRpb24gPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZU5vdGlmaWNhdGlvbigpO1xyXG4gICAgdG9rZW46IHN0cmluZztcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVEYXRhIHtcclxuICAgIHRvSWQ6IHN0cmluZztcclxuICAgIGNoYXRJZDogc3RyaW5nO1xyXG4gICAgZGF0ZUhvdXI6IHN0cmluZztcclxuICAgIGNoYXRNZXNzYWdlSWQ6IHN0cmluZztcclxuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcclxuICAgIHR5cGU6IHN0cmluZztcclxuICAgIGZyb21JZDogc3RyaW5nO1xyXG4gICAgcmVwbHlGcm9tOiBzdHJpbmc7XHJcbiAgICBncm91cElkOiBzdHJpbmc7XHJcbiAgICBmaWxlSWQ6IHN0cmluZztcclxuICAgIGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICBmaWxlU2l6ZTogbnVtYmVyO1xyXG4gICAgZmlsZVR5cGU6IHN0cmluZztcclxuICAgIHZGaWxlSWQ6IHN0cmluZztcclxuICAgIHZGaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgdkZpbGVTaXplOiBudW1iZXI7XHJcbiAgICB2RmlsZVR5cGU6IHN0cmluZztcclxuXHJcbiAgICBhbGw6IE1hcDxzdHJpbmcsIHN0cmluZz47XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlTm90aWZpY2F0aW9uIHtcclxuICAgIGJvZHk6IHN0cmluZztcclxuICB9XHJcbiAgXHJcbiAgZXhwb3J0IGNsYXNzIENoYXRVc2VyUmVzcG9uc2U0QXBwIHtcclxuICAgIHRvdGFsTWVzc2FnZXM6IG51bWJlcjtcclxuICAgIGNoYXQ6IENoYXQ0QXBwO1xyXG4gICAgY2hhdE1lc3NhZ2U6IENoYXRNZXNzYWdlNEFwcDtcclxuICAgIGNoYXRzOiBDaGF0VXNlclJlc3BvbnNlNEFwcFtdO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdEZpbHRlclJlcXVlc3Q0QXBwIHtcclxuICAgIHR5cGU6IENoYXRGaWx0ZXJUeXBlO1xyXG4gICAgY2hhdEV4dGVybmFsSWQ6IHN0cmluZztcclxuICAgIGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nO1xyXG4gICAgY2hhdFVzZXJFeHRlcm5hbFRvSWQ6IHN0cmluZztcclxuICAgIGdyb3VwSWQ6IHN0cmluZztcclxuICAgIGZyb21JZDogc3RyaW5nO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBDb25maWcge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIGVuZHBvaW50OiBzdHJpbmcsIHB1YmxpYyBkZWJ1Zz86IGJvb2xlYW4pIHtcclxuICAgICAgXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBUcmFuc2xhdGUge1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gICAgdHJhbnNsYXRlZFRleHQ6IHN0cmluZztcclxuICAgIG9yaWdpbmFsU291cmNlTGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XHJcbiAgICBzb3VyY2VMYW5ndWFnZUNvZGU6IHN0cmluZztcclxuICAgIHRhcmdldExhbmd1YWdlQ29kZTogc3RyaW5nO1xyXG4gICAgbWVzc2FnZUlkOiBzdHJpbmc7XHJcbiAgfVxyXG5cclxuICBleHBvcnQgY2xhc3MgQ2hhdEdyb3VwQXBwIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBjaGF0SWQ6IHN0cmluZztcclxuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgdXNlcnM6IEFycmF5PHN0cmluZz47XHJcbiAgICBmaWxlczogQXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD47XHJcbiAgICBtZXRhOiBBcnJheTxDaGF0TWVzc2FnZU1ldGE0QXBwPjtcclxuICAgIHN0YXR1czogR3JvdXBTdGF0dXM0QXBwO1xyXG4gIH1cclxuXHJcbiAgXHJcbiAgZXhwb3J0IGVudW0gQ2hhdFN0YXR1czRBcHAge1xyXG4gICAgQ1JFQVRFRCA9IFwiQ1JFQVRFRFwiLFxyXG4gICAgQ0xPU0VEID0gXCJDTE9TRURcIlxyXG4gIFxyXG4gIH1cclxuICBleHBvcnQgZW51bSBDaGF0VXNlclN0YXR1czRBcHAge1xyXG4gICAgUkVNT1ZFRCA9IFwiUkVNT1ZFRFwiXHJcbiAgXHJcbiAgfVxyXG4gIGV4cG9ydCBlbnVtIENoYXRGaWx0ZXJUeXBlIHtcclxuICAgIENPVU5UX05PVF9SRUFEID0gMSxcclxuICAgIExBU1RfTUVTU0FHRSA9IDJcclxuICB9XHJcblxyXG4gIGV4cG9ydCBlbnVtIEdyb3VwU3RhdHVzNEFwcCB7XHJcbiAgICBDUkVBVEVEID0gXCJDUkVBVEVEXCIsXHJcbiAgICBDTE9TRUQgPSBcIlJFTU9WRURcIlxyXG4gIH1cclxuXHJcbiAgXHJcbiAgZXhwb3J0IGludGVyZmFjZSBJQ2hhdENhbGxiYWNrIHtcclxuICAgIGlzVG9rZW5GaXJlYmFzZUFjdGl2ZSgpOiBCb29sZWFuO1xyXG4gICAgb25NZXNzYWdlKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvbk9mZmxpbmUobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uUmVhZChtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25TdGFydFN0b3BUeXBpbmcobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uTmV3VXNlcihtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25SZW1vdmVVc2VyKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvbkNoYXRDbG9zZWQobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uQ291bnROb3RSZWFkKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgfVxyXG4gICJdfQ==