@banta/sdk 5.8.3 → 5.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/comments/comment-view/comment-view.component.mjs +29 -16
- package/fesm2022/banta-sdk.mjs +28 -15
- package/fesm2022/banta-sdk.mjs.map +1 -1
- package/lib/banta/banta.component.d.ts +1 -1
- package/lib/chat-source.d.ts +3 -3
- package/lib/comments/banta-comments/banta-comments.component.d.ts +1 -1
- package/lib/comments/comment-view/comment-view.component.d.ts +7 -3
- package/lib/static-chat-source.d.ts +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@ import * as i3 from "@angular/material/icon";
|
|
|
9
9
|
import * as i4 from "@angular/material/button";
|
|
10
10
|
import * as i5 from "@angular/material/progress-spinner";
|
|
11
11
|
import * as i6 from "../comment/comment.component";
|
|
12
|
+
const DEFAULT_MAX_MESSAGES = 2000;
|
|
13
|
+
const DEFAULT_MAX_VISIBLE_MESSAGES = 200;
|
|
12
14
|
export class CommentViewComponent {
|
|
13
15
|
constructor(backend, elementRef) {
|
|
14
16
|
this.backend = backend;
|
|
@@ -28,7 +30,7 @@ export class CommentViewComponent {
|
|
|
28
30
|
* While this is called "new" messages, it really represents the messages that would be visible *at the beginning
|
|
29
31
|
* of the sort order*, which can be flipped by the newestLast feature (used for replies mode).
|
|
30
32
|
*
|
|
31
|
-
* So, when newestLast is false, regardless of the current sortOrder, newMessages are conceptually
|
|
33
|
+
* So, when newestLast is false (top-level comments), regardless of the current sortOrder, newMessages are conceptually
|
|
32
34
|
* *above* the visible set of messages.
|
|
33
35
|
*
|
|
34
36
|
* When newestLast is true (as in replies mode), regardless of the current sortOrder, newMessages are conceptually
|
|
@@ -46,10 +48,6 @@ export class CommentViewComponent {
|
|
|
46
48
|
* *above* the visible set of messages.
|
|
47
49
|
*/
|
|
48
50
|
this.olderMessages = [];
|
|
49
|
-
//#endregion
|
|
50
|
-
//#region Inputs
|
|
51
|
-
this.maxMessages = 2000;
|
|
52
|
-
this.maxVisibleMessages = 200;
|
|
53
51
|
this.newestLast = false;
|
|
54
52
|
this.holdNewMessages = false;
|
|
55
53
|
this.showEmptyState = true;
|
|
@@ -89,6 +87,10 @@ export class CommentViewComponent {
|
|
|
89
87
|
set source(value) { this.setSource(value); }
|
|
90
88
|
get previousMessages() { return this.newestLast ? this.olderMessages : this.newMessages; }
|
|
91
89
|
get nextMessages() { return this.newestLast ? this.newMessages : this.olderMessages; }
|
|
90
|
+
set maxMessages(value) { this._maxMessages = value; }
|
|
91
|
+
get maxMessages() { return this._maxMessages ?? DEFAULT_MAX_MESSAGES; }
|
|
92
|
+
set maxVisibleMessages(value) { this._maxVisibleMessages = value; }
|
|
93
|
+
get maxVisibleMessages() { return this._maxVisibleMessages ?? DEFAULT_MAX_VISIBLE_MESSAGES; }
|
|
92
94
|
get comments() { return Array.from(this.commentsQuery); }
|
|
93
95
|
//#endregion
|
|
94
96
|
/**
|
|
@@ -111,16 +113,15 @@ export class CommentViewComponent {
|
|
|
111
113
|
console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);
|
|
112
114
|
return false;
|
|
113
115
|
}
|
|
114
|
-
let pageSize = this.maxVisibleMessages;
|
|
115
116
|
let items = [].concat(this.olderMessages, this.messages, this.newMessages);
|
|
116
117
|
let index = items.findIndex(x => x.id === message.id);
|
|
117
118
|
if (index < 0) {
|
|
118
119
|
console.error(`Error while loading message in context: Message was not present in message list!`);
|
|
119
120
|
return false;
|
|
120
121
|
}
|
|
121
|
-
let startIndex = Math.max(0, index -
|
|
122
|
+
let startIndex = Math.max(0, index - this.maxVisibleMessages / 2);
|
|
122
123
|
this.newMessages = items.splice(0, startIndex);
|
|
123
|
-
this.messages = items.splice(0,
|
|
124
|
+
this.messages = items.splice(0, this.maxVisibleMessages);
|
|
124
125
|
this.olderMessages = items;
|
|
125
126
|
this.isViewingMore = true;
|
|
126
127
|
}
|
|
@@ -358,12 +359,14 @@ export class CommentViewComponent {
|
|
|
358
359
|
return this.previousMessages.length > 0;
|
|
359
360
|
}
|
|
360
361
|
get pageSize() {
|
|
361
|
-
return Math.min(20, this.maxVisibleMessages);
|
|
362
|
+
return Math.min(20, this.maxVisibleMessages || 20);
|
|
362
363
|
}
|
|
363
364
|
async showPrevious() {
|
|
364
365
|
this.isViewingMore = true;
|
|
365
366
|
let nextPageSize = this.pageSize;
|
|
366
367
|
this.isLoadingMore = false;
|
|
368
|
+
if (isNaN(nextPageSize))
|
|
369
|
+
throw new Error(`Not safe to load more with NaN page size`);
|
|
367
370
|
if (this.previousMessages.length > 0) {
|
|
368
371
|
const storedMessages = this.previousMessages.splice(Math.max(0, this.previousMessages.length - nextPageSize), nextPageSize);
|
|
369
372
|
this.messages = [...storedMessages, ...this.messages];
|
|
@@ -431,6 +434,8 @@ export class CommentViewComponent {
|
|
|
431
434
|
async showNext() {
|
|
432
435
|
this.isViewingMore = true;
|
|
433
436
|
let nextPageSize = this.pageSize;
|
|
437
|
+
if (isNaN(nextPageSize))
|
|
438
|
+
throw new Error(`Not safe to load more with NaN page size`);
|
|
434
439
|
this.isLoadingMore = false;
|
|
435
440
|
if (this.nextMessages.length > 0) {
|
|
436
441
|
const storedMessages = this.nextMessages.splice(0, nextPageSize);
|
|
@@ -471,6 +476,8 @@ export class CommentViewComponent {
|
|
|
471
476
|
async showMore() {
|
|
472
477
|
this.isViewingMore = true;
|
|
473
478
|
let nextPageSize = this.pageSize;
|
|
479
|
+
if (isNaN(nextPageSize))
|
|
480
|
+
throw new Error(`Not safe to load more with NaN page size`);
|
|
474
481
|
this.isLoadingMore = false;
|
|
475
482
|
if (this.olderMessages.length > 0) {
|
|
476
483
|
const storedMessages = this.olderMessages.splice(0, nextPageSize);
|
|
@@ -514,14 +521,20 @@ export class CommentViewComponent {
|
|
|
514
521
|
// Extract the messages that do not fit in the maxVisibleMessages buffer.
|
|
515
522
|
if (this.messages.length > this.maxVisibleMessages) {
|
|
516
523
|
let overflow = [];
|
|
517
|
-
|
|
524
|
+
// Move overflowing messages into newMessages.
|
|
525
|
+
// Regardless of the order (newestLast), newMessages represents the direction that is being loaded,
|
|
526
|
+
// since it's definition depends on that order.
|
|
527
|
+
if (this.newestLast) {
|
|
518
528
|
overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);
|
|
519
|
-
|
|
529
|
+
this.newMessages = overflow.concat(this.newMessages);
|
|
530
|
+
this.newMessages.splice(this.maxMessages - this.maxVisibleMessages, this.newMessages.length);
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
520
533
|
overflow = this.messages.splice(0, this.messages.length - this.maxVisibleMessages);
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
534
|
+
this.newMessages.push(...overflow);
|
|
535
|
+
if (this.newMessages.length > this.maxMessages - this.maxVisibleMessages)
|
|
536
|
+
this.newMessages.splice(0, this.newMessages.length - (this.maxMessages - this.maxVisibleMessages));
|
|
537
|
+
}
|
|
525
538
|
}
|
|
526
539
|
}
|
|
527
540
|
addMessage(message) {
|
|
@@ -712,4 +725,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
712
725
|
type: ViewChild,
|
|
713
726
|
args: ['messageContainer']
|
|
714
727
|
}] } });
|
|
715
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2NvbW1lbnQtdmlldy9jb21tZW50LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvY29tbWVudC12aWV3L2NvbW1lbnQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFxQixhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7OztBQVloRSxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFlBQ1ksT0FBd0IsRUFDeEIsVUFBbUM7UUFEbkMsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFVL0MsWUFBWTtRQUNaLGdCQUFnQjtRQUVSLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QyxnQkFBVyxHQUFnQixJQUFJLENBQUM7UUFDaEMsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFFN0Isc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGlCQUFZLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsa0JBQWEs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QUM7OEdBanpCUSxvQkFBb0I7a0dBQXBCLG9CQUFvQiw0aENBdUdmLGdCQUFnQixnREN6SGxDLHV1SUF1R0E7OzJGRHJGYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0ksb0JBQW9COzZHQWNqQixNQUFNO3NCQUFsQixLQUFLO2dCQWdERyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDc0MsV0FBVztzQkFBdEQsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyxvQkFBb0I7Z0JBQ2pDLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQWtCYSxZQUFZO3NCQUE5QixNQUFNO2dCQUNZLFFBQVE7c0JBQTFCLE1BQU07Z0JBQ1ksS0FBSztzQkFBdkIsTUFBTTtnQkFDWSxPQUFPO3NCQUF6QixNQUFNO2dCQUNZLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxjQUFjO3NCQUFoQyxNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLGFBQWE7c0JBQS9CLE1BQU07Z0JBQ1ksZ0JBQWdCO3NCQUFsQyxNQUFNO2dCQUNZLGlCQUFpQjtzQkFBbkMsTUFBTTtnQkFLeUIsYUFBYTtzQkFBNUMsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBQ0MsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT3V0cHV0LCBIb3N0QmluZGluZywgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBVc2VyLCBDaGF0TWVzc2FnZSwgQ29tbWVudHNPcmRlciwgRmlsdGVyTW9kZSB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmRCYXNlIH0gZnJvbSBcIi4uLy4uL2NoYXQtYmFja2VuZC1iYXNlXCI7XHJcbmltcG9ydCB7IENoYXRTb3VyY2VCYXNlIH0gZnJvbSBcIi4uLy4uL2NoYXQtc291cmNlLWJhc2VcIjtcclxuaW1wb3J0IHsgTWVzc2FnZU1lbnVJdGVtIH0gZnJvbSBcIi4uLy4uL21lc3NhZ2UtbWVudS1pdGVtXCI7XHJcbmltcG9ydCB7IENvbW1lbnRDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tbWVudC9jb21tZW50LmNvbXBvbmVudFwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFZGl0RXZlbnQge1xyXG4gICAgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcbiAgICBuZXdNZXNzYWdlOiBzdHJpbmc7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS1jb21tZW50LXZpZXcnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnQtdmlldy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb21tZW50LXZpZXcuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbWVudFZpZXdDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBiYWNrZW5kOiBDaGF0QmFja2VuZEJhc2UsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLy8jcmVnaW9uIFNvdXJjZVxyXG5cclxuICAgIHByaXZhdGUgX3NvdXJjZTogQ2hhdFNvdXJjZUJhc2U7XHJcbiAgICBASW5wdXQoKSBnZXQgc291cmNlKCkgeyByZXR1cm4gdGhpcy5fc291cmNlOyB9XHJcbiAgICBzZXQgc291cmNlKHZhbHVlKSB7IHRoaXMuc2V0U291cmNlKHZhbHVlKTsgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIEZpZWxkc1xyXG5cclxuICAgIHByaXZhdGUgX3NvdXJjZVN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBtZW51TWVzc2FnZTogQ2hhdE1lc3NhZ2UgPSBudWxsO1xyXG4gICAgbWVzc2FnZXM6IENoYXRNZXNzYWdlW10gPSBbXTtcclxuICAgIGN1cnJlbnRVc2VyOiBVc2VyO1xyXG4gICAgY3VzdG9tU29ydEVuYWJsZWQgPSBmYWxzZTtcclxuICAgIG1hcmtTb3VyY2VMb2FkZWQ6ICgpID0+IHZvaWQ7XHJcbiAgICBzb3VyY2VMb2FkZWQgPSBuZXcgUHJvbWlzZTx2b2lkPihyID0+IHRoaXMubWFya1NvdXJjZUxvYWRlZCA9IHIpO1xyXG4gICAgaXNWaWV3aW5nTW9yZSA9IGZhbHNlO1xyXG4gICAgaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gICAgaGFzTW9yZSA9IGZhbHNlO1xyXG4gICAgbWVzc2FnZUNsaWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgcHJldmlvdXNNZXNzYWdlcygpIHsgcmV0dXJuIHRoaXMubmV3ZXN0TGFzdCA/IHRoaXMub2xkZXJNZXNzYWdlcyA6IHRoaXMubmV3TWVzc2FnZXM7IH1cclxuICAgIGdldCBuZXh0TWVzc2FnZXMoKSB7IHJldHVybiB0aGlzLm5ld2VzdExhc3QgPyB0aGlzLm5ld01lc3NhZ2VzIDogdGhpcy5vbGRlck1lc3NhZ2VzOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGlsZSB0aGlzIGlzIGNhbGxlZCBcIm5ld1wiIG1lc3NhZ2VzLCBpdCByZWFsbHkgcmVwcmVzZW50cyB0aGUgbWVzc2FnZXMgdGhhdCB3b3VsZCBiZSB2aXNpYmxlICphdCB0aGUgYmVnaW5uaW5nIFxyXG4gICAgICogb2YgdGhlIHNvcnQgb3JkZXIqLCB3aGljaCBjYW4gYmUgZmxpcHBlZCBieSB0aGUgbmV3ZXN0TGFzdCBmZWF0dXJlICh1c2VkIGZvciByZXBsaWVzIG1vZGUpLiBcclxuICAgICAqIFxyXG4gICAgICogU28sIHdoZW4gbmV3ZXN0TGFzdCBpcyBmYWxzZSwgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzb3J0T3JkZXIsIG5ld01lc3NhZ2VzIGFyZSBjb25jZXB0dWFsbHkgXHJcbiAgICAgKiAqYWJvdmUqIHRoZSB2aXNpYmxlIHNldCBvZiBtZXNzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiBuZXdlc3RMYXN0IGlzIHRydWUgKGFzIGluIHJlcGxpZXMgbW9kZSksIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgc29ydE9yZGVyLCBuZXdNZXNzYWdlcyBhcmUgY29uY2VwdHVhbGx5IFxyXG4gICAgICogKmJlbG93KiB0aGUgdmlzaWJsZSBzZXQgb2YgbWVzc2FnZXMuXHJcbiAgICAgKi9cclxuICAgIG5ld01lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGlsZSB0aGlzIGlzIGNhbGxlZCBcIm9sZGVyXCIgbWVzc2FnZXMsIGl0IHJlYWxseSByZXByZXNlbnRzIHRoZSBtZXNzYWdlcyB0aGF0IHdvdWxkIGJlIHZpc2libGUgKmF0IHRoZSBlbmQgb2YgdGhlIFxyXG4gICAgICogc29ydCBvcmRlciosIHdoaWNoIGNhbiBiZSBmbGlwcGVkIGJ5IHRoZSBuZXdlc3RMYXN0IGZlYXR1cmUgKHVzZWRzIGZvciByZXBsaWVzIG1vZGUpLlxyXG4gICAgICogXHJcbiAgICAgKiBTbywgd2hlbiBuZXdlc3RMYXN0IGlzIGZhbHNlLCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IHNvcnRPcmRlciwgb2xkZXJNZXNzYWdlcyBhcmUgY29uY2VwdHVhbGx5ICpiZWxvdypcclxuICAgICAqIHRoZSB2aXNpYmxlIHNldCBvZiBtZXNzYWdlcy5cclxuICAgICAqIFxyXG4gICAgICogV2hlbiBuZXdlc3RMYXN0IGlzIHRydWUgKGFzIGluIHJlcGxpZXMgbW9kZSksIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgc29ydE9yZGVyLCBvbGRlck1lc3NhZ2VzIGFyZSBjb25jZXB0dWFsbHlcclxuICAgICAqICphYm92ZSogdGhlIHZpc2libGUgc2V0IG9mIG1lc3NhZ2VzLlxyXG4gICAgICovXHJcbiAgICBvbGRlck1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICAvLyNyZWdpb24gSW5wdXRzXHJcblxyXG4gICAgQElucHV0KCkgbWF4TWVzc2FnZXMgPSAyMDAwO1xyXG4gICAgQElucHV0KCkgbWF4VmlzaWJsZU1lc3NhZ2VzOiBudW1iZXIgPSAyMDA7XHJcbiAgICBASW5wdXQoKSBuZXdlc3RMYXN0ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBob2xkTmV3TWVzc2FnZXMgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHNob3dFbXB0eVN0YXRlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGFsbG93UmVwbGllcyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBlbmFibGVIb2xkT25DbGljayA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgZW5hYmxlSG9sZE9uU2Nyb2xsID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGN1c3RvbU1lbnVJdGVtczogTWVzc2FnZU1lbnVJdGVtW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MuZml4ZWQtaGVpZ2h0JykgZml4ZWRIZWlnaHQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZE1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgQElucHV0KCkgZ2VuZXJpY0F2YXRhclVybDogc3RyaW5nO1xyXG4gICAgXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIC8vI3JlZ2lvbiBPdXRwdXRzXHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX2xpa2VkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91bmxpa2VkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VybmFtZVNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuICAgIHByaXZhdGUgX2F2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuICAgIHByaXZhdGUgX3NoYXJlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfZGVsZXRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUVkaXRlZCA9IG5ldyBTdWJqZWN0PEVkaXRFdmVudD4oKTtcclxuICAgIHByaXZhdGUgX3NvcnRPcmRlckNoYW5nZWQgPSBuZXcgU3ViamVjdDxDb21tZW50c09yZGVyPigpO1xyXG4gICAgcHJpdmF0ZSBfZmlsdGVyTW9kZUNoYW5nZWQgPSBuZXcgU3ViamVjdDxGaWx0ZXJNb2RlPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKSByZWFkb25seSB1c2VyU2VsZWN0ZWQgPSB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVwb3J0ZWQgPSB0aGlzLl9yZXBvcnRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBsaWtlZCA9IHRoaXMuX2xpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVubGlrZWQgPSB0aGlzLl91bmxpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVzZXJuYW1lU2VsZWN0ZWQgPSB0aGlzLl91c2VybmFtZVNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGF2YXRhclNlbGVjdGVkID0gdGhpcy5fYXZhdGFyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2hhcmVkID0gdGhpcy5fc2hhcmVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGRlbGV0ZWQgPSB0aGlzLl9kZWxldGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgbWVzc2FnZUVkaXRlZCA9IHRoaXMuX21lc3NhZ2VFZGl0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc29ydE9yZGVyQ2hhbmdlZCA9IHRoaXMuX3NvcnRPcmRlckNoYW5nZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZmlsdGVyTW9kZUNoYW5nZWQgPSB0aGlzLl9maWx0ZXJNb2RlQ2hhbmdlZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICAvLyNlbmRyZWdpb24gXHJcbiAgICAvLyNyZWdpb24gVUkgQmluZGluZ3NcclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKENvbW1lbnRDb21wb25lbnQpIGNvbW1lbnRzUXVlcnk6IFF1ZXJ5TGlzdDxDb21tZW50Q29tcG9uZW50PjtcclxuICAgIEBWaWV3Q2hpbGQoJ21lc3NhZ2VDb250YWluZXInKSBtZXNzYWdlQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAgIGdldCBjb21tZW50cygpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb21tZW50c1F1ZXJ5KTsgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbWVzc2FnZSBjYW4gYmUgZm91bmQgd2l0aGluIG9uZSBvZiB0aGUgbWVzc2FnZSBidWZmZXJzIChvbGRlciwgY3VycmVudCwgbmV3ZXIpXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBcclxuICAgICAqL1xyXG4gICAgaXNNZXNzYWdlTG9hZGVkSW5Db250ZXh0KG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub2xkZXJNZXNzYWdlcy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZClcclxuICAgICAgICAgICAgfHwgdGhpcy5tZXNzYWdlcy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZClcclxuICAgICAgICAgICAgfHwgdGhpcy5uZXdNZXNzYWdlcy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE1lc3NhZ2VJbkNvbnRleHQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZUxvYWRlZDtcclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBtZXNzYWdlICR7bWVzc2FnZS5pZH0gaW4gY29udGV4dC4uLmApO1xyXG4gICAgICAgIHdoaWxlICh0aGlzLmhhc01vcmUgJiYgIXRoaXMuaXNNZXNzYWdlTG9hZGVkSW5Db250ZXh0KG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAuLi5OZWVkIHRvIGxvYWQgbW9yZSBjb21tZW50cyB0byBmaW5kICR7bWVzc2FnZS5pZH1gKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93TW9yZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWVzc2FnZUxvYWRlZEluQ29udGV4dChtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGlsZSBsb2FkaW5nIG1lc3NhZ2UgaW4gY29udGV4dDogRmFpbGVkIHRvIGZpbmQgbWVzc2FnZSAke21lc3NhZ2UuaWR9LCBtYXliZSBpdCB3YXMgZGVsZXRlZCFgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHBhZ2VTaXplID0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXM7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW10uY29uY2F0KHRoaXMub2xkZXJNZXNzYWdlcywgdGhpcy5tZXNzYWdlcywgdGhpcy5uZXdNZXNzYWdlcyk7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KHggPT4geC5pZCA9PT0gbWVzc2FnZS5pZCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3Igd2hpbGUgbG9hZGluZyBtZXNzYWdlIGluIGNvbnRleHQ6IE1lc3NhZ2Ugd2FzIG5vdCBwcmVzZW50IGluIG1lc3NhZ2UgbGlzdCFgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCBpbmRleCAtIHBhZ2VTaXplIC8gMik7ICAgICAgICBcclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2VzID0gaXRlbXMuc3BsaWNlKDAsIHN0YXJ0SW5kZXgpO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBpdGVtcy5zcGxpY2UoMCwgcGFnZVNpemUpO1xyXG4gICAgICAgIHRoaXMub2xkZXJNZXNzYWdlcyA9IGl0ZW1zO1xyXG4gICAgICAgIHRoaXMuaXNWaWV3aW5nTW9yZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNob3VsZFNob3dOZXdNZXNzYWdlSW5kaWNhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmlld2luZ01vcmUgXHJcbiAgICAgICAgICAgIHx8IHRoaXMuY3VzdG9tU29ydEVuYWJsZWQgXHJcbiAgICAgICAgICAgIHx8IHRoaXMuc291cmNlRmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5BTExcclxuICAgICAgICAgICAgfHwgdGhpcy5oZWxkTWVzc2FnZXMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkSG9sZE5ld01lc3NhZ2VzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVNvcnRFbmFibGVkKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5ob2xkTmV3TWVzc2FnZXMgfHwgdGhpcy5pc1ZpZXdpbmdNb3JlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBob2xkaW5nIGR1ZSB0byBzZXR0aW5nc2ApO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUhvbGRPbkNsaWNrICYmIHRoaXMubWVzc2FnZUNsaWNrZWQpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbmFibGVIb2xkT25TY3JvbGwpIHtcclxuICAgICAgICAgICAgbGV0IGtleU1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdClcclxuICAgICAgICAgICAgICAgIGtleU1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW3RoaXMubWVzc2FnZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGtleU1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzWzBdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGtleU1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50Rm9yQ29tbWVudChrZXlNZXNzYWdlLmlkKTtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VsZW1lbnRWaXNpYmxlKG1lc3NhZ2VFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhga2V5IGVsZW1lbnQgaXMgbm90IHZpc2libGVgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGtleSBlbGVtZW50IGlzIHZpc2libGVgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBjb3VsZCBub3QgZmluZCBrZXkgZWxlbWVudGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGNvdWxkIG5vdCBmaW5kIGtleSBtZXNzYWdlYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzRWxlbWVudFZpc2libGUoZWxlbWVudDogRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICByZXR1cm4gISFlbGVtZW50UmVjdCBcclxuICAgICAgICAgICAgJiYgZWxlbWVudFJlY3QuYm90dG9tID49IDBcclxuICAgICAgICAgICAgJiYgZWxlbWVudFJlY3QucmlnaHQgPj0gMFxyXG4gICAgICAgICAgICAmJiBlbGVtZW50UmVjdC5sZWZ0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aFxyXG4gICAgICAgICAgICAmJiBlbGVtZW50UmVjdC50b3AgPD0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgQ29tbWVudENvbXBvbmVudCBpbnN0YW50aWF0ZWQgZm9yIHRoZSBnaXZlbiBDaGF0TWVzc2FnZSxcclxuICAgICAqIGlmIGl0IGV4aXN0cyBpbiB0aGUgY3VycmVudCB2aWV3LiBOb3RlIHRoYXQgbWVzc2FnZXMgd2hpY2ggYXJlIG5vdCBcclxuICAgICAqIGN1cnJlbnRseSBzaG93biB0byB0aGUgdXNlciB3aWxsIG5vdCByZXR1cm4gYSBDb21tZW50Q29tcG9uZW50LlxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tbWVudENvbXBvbmVudEZvck1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIW1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIHZhbGlkIENoYXRNZXNzYWdlYCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudHMuZmluZCh4ID0+IHgubWVzc2FnZT8uaWQgPT09IG1lc3NhZ2UuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVFZGl0KG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBuZXdNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlRWRpdGVkLm5leHQoeyBtZXNzYWdlLCBuZXdNZXNzYWdlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxpa2VNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fbGlrZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmxpa2VNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fdW5saWtlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcG9ydE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdE1lc3NhZ2VVc2VyKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlbGVjdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VXNlcm5hbWUodXNlcjogVXNlcikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQubmV4dCh1c2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBdmF0YXIodXNlcjogVXNlcikge1xyXG4gICAgICAgIHRoaXMuX2F2YXRhclNlbGVjdGVkLm5leHQodXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgc2hhcmVkTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3NoYXJlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RWRpdGluZyhtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMuZm9yRWFjaChtID0+IG0udHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9kZWxldGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRTb3VyY2UodmFsdWU6IENoYXRTb3VyY2VCYXNlKSB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21Tb3J0RW5hYmxlZCA9ICh2YWx1ZT8uc29ydE9yZGVyID8/IENvbW1lbnRzT3JkZXIuTkVXRVNUKSAhPT0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMub2xkZXJNZXNzYWdlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuaGVsZE1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5iYW50YVNvdXJjZURlYnVnID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VTdWJzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnMudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3VicyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSAodmFsdWUubWVzc2FnZXMgfHwgW10pLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcclxuICAgICAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCBtZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLmhhc01vcmUgPSB0cnVlOyAvL3RoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VSZWNlaXZlZC5zdWJzY3JpYmUobXNnID0+IHRoaXMubWVzc2FnZVJlY2VpdmVkKG1zZykpKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VTZW50LnN1YnNjcmliZShtc2cgPT4gdGhpcy5tZXNzYWdlU2VudChtc2cpKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzLmFkZChcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZC51c2VyQ2hhbmdlZC5zdWJzY3JpYmUodXNlciA9PiB0aGlzLmN1cnJlbnRVc2VyID0gdXNlcilcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5pdGlhbE1lc3NhZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW5pdGlhbE1lc3NhZ2VzKCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IChhd2FpdCB0aGlzLl9zb3VyY2UuZ2V0RXhpc3RpbmdNZXNzYWdlcygpKTtcclxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKG0gPT4gbS50cmFuc2llbnRTdGF0ZSA/Pz0ge30pO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm5ld2VzdExhc3QgPyBtZXNzYWdlcy5zbGljZSgpLnJldmVyc2UoKSA6IG1lc3NhZ2VzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcy5sZW5ndGggPiB0aGlzLm1heFZpc2libGVNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzTWVzc2FnZXMucHVzaCguLi50aGlzLm1lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRNZXNzYWdlcy51bnNoaWZ0KC4uLnRoaXMubWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRlYnVnTWVzc2FnZXMoKTtcclxuICAgICAgICB0aGlzLnNvcnRNZXNzYWdlcygpO1xyXG4gICAgICAgIGlmICh0aGlzLm1hcmtTb3VyY2VMb2FkZWQpXHJcbiAgICAgICAgICAgIHRoaXMubWFya1NvdXJjZUxvYWRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnTWVzc2FnZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3dEZWJ1ZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFsgXHJcbiAgICAgICAgLy8gICAgIC4uLnRoaXMucHJldmlvdXNNZXNzYWdlcy5tYXAoeCA9PiB4Lm1lc3NhZ2UpLCBcclxuICAgICAgICAvLyAgICAgJ1tbJyxcclxuICAgICAgICAvLyAgICAgLi4udGhpcy5tZXNzYWdlcy5tYXAoeCA9PiB4Lm1lc3NhZ2UpLFxyXG4gICAgICAgIC8vICAgICAnXV0nLFxyXG4gICAgICAgIC8vICAgICAuLi50aGlzLm5leHRNZXNzYWdlcy5tYXAoeCA9PiB4Lm1lc3NhZ2UpIFxyXG4gICAgICAgIC8vIF0ubWFwKHggPT4gL1xcZCsvLnRlc3QoeCkgPyB0aGlzLnplcm9QYWQoeCwgMikgOiB4KS5qb2luKFwiIFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgemVyb1BhZChudW1iZXI6IG51bWJlciB8IHN0cmluZywgY291bnQ6IG51bWJlciA9IDIpIHtcclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmc7XHJcbiAgICBcclxuICAgICAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgIHN0ciA9IFN0cmluZyhudW1iZXIpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgc3RyID0gbnVtYmVyO1xyXG4gICAgXHJcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBjb3VudClcclxuICAgICAgICAgICAgc3RyID0gJzAnICsgc3RyO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIGxlZnRQYWQoc3RyOiBzdHJpbmcsIGNvdW50OiBudW1iZXIgPSAyKSB7XHJcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBjb3VudClcclxuICAgICAgICAgICAgc3RyID0gJyAnICsgc3RyO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbWVzc2FnZUlkZW50aXR5KGluZGV4OiBudW1iZXIsIGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiBjaGF0TWVzc2FnZS5pZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc291cmNlU29ydE9yZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZT8uc29ydE9yZGVyID8/IENvbW1lbnRzT3JkZXIuTkVXRVNUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VGaWx0ZXJNb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZT8uZmlsdGVyTW9kZSA/PyBGaWx0ZXJNb2RlLkFMTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgdGhlIG5ld2VzdCBjb250ZW50LlxyXG4gICAgICogLSBJZiBhbiB1bm5hdHVyYWwgc29ydCBvcmRlciBpcyBhY3RpdmUgKGllIE9sZGVzdCBvciBMaWtlcyksIGl0IHdpbGwgYmUgY2hhbmdlZCB0byBOZXdlc3QuXHJcbiAgICAgKiAtIFRoZSBuZXcgY29udGVudCB3aWxsIGJlIHBsYWNlZCB3aGVyZSBuZXcgY29udGVudCBnb2VzIGJhc2VkIG9uIG5ld2VzdExhc3QgKHJlcGxpZXMgbW9kZSksIHNvIGlmIGl0IGlzIHRydWUsIHRoZSBjb250ZW50IGlzIFxyXG4gICAgICogICBwbGFjZWQgYXQgdGhlIGVuZCwgb3RoZXJ3aXNlIGl0IGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2hvd05ld2VzdChldmVudDogTW91c2VFdmVudCkge1xyXG5cclxuICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIGhvdyB3ZSBoYW5kbGUgdGhpcywgY2xlYXIgb3V0IG91ciBoZWxkIG1lc3NhZ2VzXHJcblxyXG4gICAgICAgIHRoaXMuaGVsZE1lc3NhZ2VzID0gW107XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQ2xpY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgc29ydCBvcmRlciBpcyBub3QgYWxyZWFkeSBOZXdlc3QsIHN3aXRjaCB0byBOZXdlc3QgYW5kIHN0b3AuXHJcbiAgICAgICAgLy8gVGhlIGFjdCBvZiBjaGFuZ2luZyB0aGUgc29ydCBvcmRlciB3aWxsIGNhdXNlIHRoZSBuZXdlc3QgY29udGVudCB0byBiZSBsb2FkZWQuXHJcblxyXG4gICAgICAgIGxldCBuYXR1cmFsT3JkZXIgPSBDb21tZW50c09yZGVyLk5FV0VTVDtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgIT09IG5hdHVyYWxPcmRlciB8fCB0aGlzLnNvdXJjZUZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUuQUxMKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVNvcnRPcmRlciAhPT0gbmF0dXJhbE9yZGVyKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydE9yZGVyQ2hhbmdlZC5uZXh0KG5hdHVyYWxPcmRlcik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUuQUxMKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyTW9kZUNoYW5nZWQubmV4dChGaWx0ZXJNb2RlLkFMTCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE9uIHRoaXMgcGF0aCwgd2UgYXJlIGFscmVhZHkgb24gTmV3ZXN0LCBidXQgdGhlcmUgaXMgbmV3ZXIgY29udGVudCBhdmFpbGFibGUgKHN1Y2ggYXMgd2hlbiBuZXcgY29udGVudCBpcyBcclxuICAgICAgICAvLyBiZWluZyBidWZmZXJlZCBkdWUgdG8gdXNlciBlbmdhZ2VtZW50IG9uIGEgY29tbWVudClcclxuXHJcbiAgICAgICAgdGhpcy5pc1ZpZXdpbmdNb3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIE1vdmUgYWxsIG5ld2VyTWVzc2FnZXMgaW50byBtZXNzYWdlcywgcmVzcGVjdGluZyB0aGUgbmV3ZXN0TGFzdCBkaXJlY3Rpb24gKG5vcm1hbCBvciByZXBsaWVzIG1vZGUpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmNvbmNhdCh0aGlzLm5ld01lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm5ld01lc3NhZ2VzLmxlbmd0aCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHRoaXMubmV3TWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMubmV3TWVzc2FnZXMubGVuZ3RoKS5jb25jYXQodGhpcy5tZXNzYWdlcyk7XHJcblxyXG4gICAgICAgIGxldCBvdmVyZmxvdyA9IHRoaXMubWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzID0gb3ZlcmZsb3cuY29uY2F0KHRoaXMub2xkZXJNZXNzYWdlcyk7XHJcbiAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzLnNwbGljZSh0aGlzLm1heE1lc3NhZ2VzIC0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIHRoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuaGFzTW9yZSA9IHRoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIG5ld2VzdCBjb21tZW50LlxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0NvbW1lbnQodGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdLmlkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db21tZW50KHRoaXMubWVzc2FnZXNbMF0uaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaG93RGVidWcoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2VbJ2JhbnRhOmRlYnVnJ10gPT09ICcxJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkU2hvd05leHQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzTW9yZSB8fCB0aGlzLm5leHRNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dE1lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNob3VsZFNob3dQcmV2aW91cygpIHtcclxuICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc01vcmUgfHwgdGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhZ2VTaXplKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbigyMCwgdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dQcmV2aW91cygpIHtcclxuICAgICAgICB0aGlzLmlzVmlld2luZ01vcmUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBuZXh0UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTWVzc2FnZXMgPSB0aGlzLnByZXZpb3VzTWVzc2FnZXMuc3BsaWNlKE1hdGgubWF4KDAsIHRoaXMucHJldmlvdXNNZXNzYWdlcy5sZW5ndGggLSBuZXh0UGFnZVNpemUpLCBuZXh0UGFnZVNpemUpO1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gWy4uLnN0b3JlZE1lc3NhZ2VzLCAuLi50aGlzLm1lc3NhZ2VzXTtcclxuICAgICAgICAgICAgbmV4dFBhZ2VTaXplIC09IHN0b3JlZE1lc3NhZ2VzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyBMb2FkIG1vcmUgZnJvbSBiYWNrZW5kIGlmIG5lZWRlZFxyXG4gICAgICAgIC8vIE5vdGU6IEJhY2tlbmQgb25seSBzdXBwb3J0cyBmZXRjaGluZyBtb3JlIGNvbnRlbnQgaW4gb25lIGRpcmVjdGlvbi5cclxuXHJcbiAgICAgICAgbGV0IGxhc3RNZXNzYWdlID0gdGhpcy5wcmV2aW91c01lc3NhZ2VzWzBdID8/IHRoaXMubWVzc2FnZXNbMF07XHJcblxyXG4gICAgICAgIGlmIChuZXh0UGFnZVNpemUgPiAwICYmIHRoaXMubmV3ZXN0TGFzdCAmJiBsYXN0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy5zb3VyY2UubG9hZEFmdGVyKGxhc3RNZXNzYWdlLCBuZXh0UGFnZVNpemUpO1xyXG5cclxuICAgICAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlcy5zbGljZSgpLnJldmVyc2UoKTsgLy8gYmVjYXVzZSBuZXdlc3RMYXN0ID09PSB0cnVlXHJcbiAgICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobSA9PiBtLnRyYW5zaWVudFN0YXRlID8/PSB7fSk7XHJcblxyXG4gICAgICAgICAgICAvLyBJbiByZXBsaWVzIG1vZGUgKG5ld2VzdExhc3QpLCB3ZSB3YW50IHRvIHB1dCB0aGVzZSBuZXcgbWVzc2FnZXMgb250byB0aGUgKnRvcCogb2YgdGhlIHNldCBvZiB2aXNpYmxlIG1lc3NhZ2VzLlxyXG4gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugd2FudCB0byBwdXQgdGhlbSBvbiB0aGUgKmJvdHRvbSouXHJcblxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gWy4uLm1lc3NhZ2VzLCAuLi50aGlzLm1lc3NhZ2VzXTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlIGFueSBtZXNzYWdlcyBhdCBhbGwsIHRoZXJlJ3Mgbm8gbW9yZSB0byBmZXRjaC5cclxuXHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc01vcmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBtZXNzYWdlcyB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIG1heFZpc2libGVNZXNzYWdlcyBidWZmZXIuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIGxldCBvdmVyZmxvdyA9IHRoaXMubWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIHRoaXMubmV4dE1lc3NhZ2VzLnVuc2hpZnQoLi4ub3ZlcmZsb3cpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhNZXNzYWdlcylcclxuICAgICAgICAgICAgICAgIHRoaXMubmV4dE1lc3NhZ2VzLnNwbGljZSh0aGlzLm1heE1lc3NhZ2VzLCB0aGlzLm5leHRNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kZWJ1Z01lc3NhZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnROZXh0TGFiZWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlU29ydE9yZGVyID09PSAnbmV3ZXN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ09sZGVyJztcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc291cmNlU29ydE9yZGVyID09PSAnb2xkZXN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ05ld2VyJztcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc291cmNlU29ydE9yZGVyID09PSAnbGlrZXMnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnTGVzcyBMaWtlcyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ01vcmUnO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3J0UHJldmlvdXNMYWJlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgPT09ICduZXdlc3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnTmV3ZXInO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgPT09ICdvbGRlc3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnT2xkZXInO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgPT09ICdsaWtlcycpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdNb3JlIExpa2VzJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnTW9yZSc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5leHRMYWJlbCgpIHsgcmV0dXJuIHRoaXMubmV3ZXN0TGFzdCA/IHRoaXMuc29ydFByZXZpb3VzTGFiZWwgOiB0aGlzLnNvcnROZXh0TGFiZWw7IH1cclxuICAgIGdldCBwcmV2aW91c0xhYmVsKCkgeyByZXR1cm4gdGhpcy5uZXdlc3RMYXN0ID8gdGhpcy5zb3J0TmV4dExhYmVsIDogdGhpcy5zb3J0UHJldmlvdXNMYWJlbDsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBtb3JlIGNvbnRlbnRcclxuICAgICAqIC0gV2hlbiBpbiByZXBsaWVzIG1vZGUgKG5ld2VzdExhc3QpLCB0aGUgY29udGVudCBpcyBhZGRlZCBhdCB0aGUgdG9wXHJcbiAgICAgKiAtIFdoZW4gaW4gbm9ybWFsIG1vZGUsIHRoZSBjb250ZW50IGlzIGFkZGVkIGF0IHRoZSBib3R0b21cclxuICAgICAqIC0gVGhlIGN1cnJlbnQgc29ydCBvcmRlciBkb2VzICpub3QqIGZhY3RvciBpbiBoZXJlLCB3aGljaCBpcyB3aHkgaXQgaXMgc2hvd01vcmUoKSBub3Qgc2hvd0VhcmxpZXIoKS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNob3dOZXh0KCkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3aW5nTW9yZSA9IHRydWU7XHJcblxyXG4gICAgICAgIGxldCBuZXh0UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG5cclxuICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmV4dE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTWVzc2FnZXMgPSB0aGlzLm5leHRNZXNzYWdlcy5zcGxpY2UoMCwgbmV4dFBhZ2VTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IFsgLi4udGhpcy5tZXNzYWdlcywgLi4uc3RvcmVkTWVzc2FnZXMgXTtcclxuICAgICAgICAgICAgbmV4dFBhZ2VTaXplIC09IHN0b3JlZE1lc3NhZ2VzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gdGhpcy5vbGRlck1lc3NhZ2VzW3RoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggLSAxXSA/PyB0aGlzLm1lc3NhZ2VzW3RoaXMubWVzc2FnZXMubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgICAgIGlmIChuZXh0UGFnZVNpemUgPiAwICYmICF0aGlzLm5ld2VzdExhc3QgJiYgbGFzdE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgLy8gTG9hZCBtb3JlIGZyb20gYmFja2VuZFxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuc291cmNlLmxvYWRBZnRlcihsYXN0TWVzc2FnZSwgbmV4dFBhZ2VTaXplKTtcclxuICAgICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtID0+IG0udHJhbnNpZW50U3RhdGUgPz89IHt9KTtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IFsgLi4udGhpcy5tZXNzYWdlcywgLi4ubWVzc2FnZXMgXTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCByZWNlaXZlIGFueSBtZXNzYWdlcyBhdCBhbGwsIHRoZXJlJ3Mgbm8gbW9yZSB0byBmZXRjaC5cclxuXHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc01vcmUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbWVzc2FnZXMgdGhhdCBkbyBub3QgZml0IGluIHRoZSBtYXhWaXNpYmxlTWVzc2FnZXMgYnVmZmVyLlxyXG5cclxuICAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcy5sZW5ndGggPiB0aGlzLm1heFZpc2libGVNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBsZXQgb3ZlcmZsb3cgPSB0aGlzLm1lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIChuZXdlc3RMYXN0KSwgbmV3TWVzc2FnZXMgcmVwcmVzZW50cyB0aGUgZGlyZWN0aW9uIHRoYXQgaXMgYmVpbmcgcHVzaGVkLCBzaW5jZSBpdCdzIGRlZmluaXRpb25cclxuICAgICAgICAgICAgLy8gZGVwZW5kcyBvbiB0aGF0IG9yZGVyLiBNb3ZlIG92ZXJmbG93aW5nIG1lc3NhZ2VzIGludG8gbmV3TWVzc2FnZXMuXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzTWVzc2FnZXMucHVzaCguLi5vdmVyZmxvdyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzTWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhNZXNzYWdlcylcclxuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNNZXNzYWdlcy5zcGxpY2UoMCwgdGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCAtIHRoaXMubWF4TWVzc2FnZXMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kZWJ1Z01lc3NhZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IG1vcmUgY29udGVudFxyXG4gICAgICogLSBXaGVuIGluIHJlcGxpZXMgbW9kZSAobmV3ZXN0TGFzdCksIHRoZSBjb250ZW50IGlzIGFkZGVkIGF0IHRoZSB0b3BcclxuICAgICAqIC0gV2hlbiBpbiBub3JtYWwgbW9kZSwgdGhlIGNvbnRlbnQgaXMgYWRkZWQgYXQgdGhlIGJvdHRvbVxyXG4gICAgICogLSBUaGUgY3VycmVudCBzb3J0IG9yZGVyIGRvZXMgKm5vdCogZmFjdG9yIGluIGhlcmUsIHdoaWNoIGlzIHdoeSBpdCBpcyBzaG93TW9yZSgpIG5vdCBzaG93RWFybGllcigpLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2hvd01vcmUoKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdpbmdNb3JlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IG5leHRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcblxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vbGRlck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTWVzc2FnZXMgPSB0aGlzLm9sZGVyTWVzc2FnZXMuc3BsaWNlKDAsIG5leHRQYWdlU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmNvbmNhdChzdG9yZWRNZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIG5leHRQYWdlU2l6ZSAtPSBzdG9yZWRNZXNzYWdlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzTW9yZSA9IHRoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBsYXN0TWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0TWVzc2FnZSA9IHRoaXMub2xkZXJNZXNzYWdlc1swXSA/PyB0aGlzLm1lc3NhZ2VzWzBdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGFzdE1lc3NhZ2UgPSB0aGlzLm9sZGVyTWVzc2FnZXNbdGhpcy5vbGRlck1lc3NhZ2VzLmxlbmd0aCAtIDFdID8/IHRoaXMubWVzc2FnZXNbdGhpcy5tZXNzYWdlcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobmV4dFBhZ2VTaXplID4gMCAmJiBsYXN0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAvLyBMb2FkIG1vcmUgZnJvbSBiYWNrZW5kXHJcblxyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGlmICghbGFzdE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuc291cmNlLmxvYWRBZnRlcihsYXN0TWVzc2FnZSwgbmV4dFBhZ2VTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtID0+IG0udHJhbnNpZW50U3RhdGUgPz89IHt9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEluIHJlcGxpZXMgbW9kZSAobmV3ZXN0TGFzdCksIHdlIHdhbnQgdG8gcHV0IHRoZXNlIG5ldyBtZXNzYWdlcyBvbnRvIHRoZSAqdG9wKiBvZiB0aGUgc2V0IG9mIHZpc2libGUgbWVzc2FnZXMuXHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSB3YW50IHRvIHB1dCB0aGVtIG9uIHRoZSAqYm90dG9tKi5cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcy5jb25jYXQodGhpcy5tZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcy5jb25jYXQobWVzc2FnZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYXQgYWxsLCB0aGVyZSdzIG5vIG1vcmUgdG8gZmV0Y2guXHJcblxyXG4gICAgICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc01vcmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBtZXNzYWdlcyB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIG1heFZpc2libGVNZXNzYWdlcyBidWZmZXIuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIGxldCBvdmVyZmxvdzogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KVxyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0aGlzLm1lc3NhZ2VzLnNwbGljZSh0aGlzLm1heFZpc2libGVNZXNzYWdlcywgdGhpcy5tZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IHRoaXMubWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMubWVzc2FnZXMubGVuZ3RoIC0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVnYXJkbGVzcyBvZiB0aGUgb3JkZXIgKG5ld2VzdExhc3QpLCBuZXdNZXNzYWdlcyByZXByZXNlbnRzIHRoZSBkaXJlY3Rpb24gdGhhdCBpcyBiZWluZyBwdXNoZWQsIHNpbmNlIGl0J3MgZGVmaW5pdGlvblxyXG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIHRoYXQgb3JkZXIuIE1vdmUgb3ZlcmZsb3dpbmcgbWVzc2FnZXMgaW50byBuZXdNZXNzYWdlcy5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZXMgPSBvdmVyZmxvdy5jb25jYXQodGhpcy5uZXdNZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4TWVzc2FnZXMgLSB0aGlzLm1heFZpc2libGVNZXNzYWdlcywgdGhpcy5uZXdNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhlbGRNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgYWRkTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG5cclxuICAgICAgICBpZiAoIW1lc3NhZ2UudHJhbnNpZW50U3RhdGUpXHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUgPz89IHt9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBkZXN0aW5hdGlvbiA9IHRoaXMubWVzc2FnZXM7XHJcbiAgICAgICAgbGV0IGJ1Y2tldCA9IHRoaXMub2xkZXJNZXNzYWdlcztcclxuICAgICAgICBsZXQgbmV3ZXN0TGFzdCA9IHRoaXMubmV3ZXN0TGFzdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkSG9sZE5ld01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVsZE1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gdGhpcy5uZXdNZXNzYWdlcztcclxuICAgICAgICAgICAgYnVja2V0ID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCBvbiB0aGUgbmV3ZXN0IHNvcnQgb3JkZXIsIG5ldyBtZXNzYWdlcyBzaG91bGRuJ3QgYmUgYWRkZWQgYXQgYWxsXHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlU29ydE9yZGVyICE9PSBDb21tZW50c09yZGVyLk5FV0VTVClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBcclxuICAgICAgICBpZiAobmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5wdXNoKG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG92ZXJmbG93ID0gZGVzdGluYXRpb24uc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCBkZXN0aW5hdGlvbi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgYnVja2V0Py5wdXNoKC4uLm92ZXJmbG93KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLnVuc2hpZnQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3ZlcmZsb3cgPSBkZXN0aW5hdGlvbi5zcGxpY2UodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIGRlc3RpbmF0aW9uLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBidWNrZXQ/LnVuc2hpZnQoLi4ub3ZlcmZsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYnVja2V0Py5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB0aGlzLmhhc01vcmUgPSB0cnVlO1xyXG5cclxuICAgICAgICBtZXNzYWdlLnBhZ2luZ0N1cnNvciA9IFN0cmluZyh0aGlzLmluY3JlbWVudFBhZ2luZ0N1cnNvcnMoKSk7XHJcbiAgICAgICAgdGhpcy5zb3J0TWVzc2FnZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluY3JlbWVudFBhZ2luZ0N1cnNvcnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlLnNvcnRPcmRlciAhPT0gQ29tbWVudHNPcmRlci5ORVdFU1QpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgbWF4UGFnaW5nQ3Vyc29yID0gMDtcclxuICAgICAgICBmb3IgKGxldCBncm91cCBvZiBbdGhpcy5tZXNzYWdlcywgdGhpcy5vbGRlck1lc3NhZ2VzLCB0aGlzLm5ld01lc3NhZ2VzXSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBtZXNzYWdlIG9mIGdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5wYWdpbmdDdXJzb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnaW5nQ3Vyc29yID0gTnVtYmVyKG1lc3NhZ2UucGFnaW5nQ3Vyc29yKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2luZ0N1cnNvciA+IG1heFBhZ2luZ0N1cnNvcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGFnaW5nQ3Vyc29yID0gcGFnaW5nQ3Vyc29yO1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGFnaW5nQ3Vyc29yID0gU3RyaW5nKHBhZ2luZ0N1cnNvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtYXhQYWdpbmdDdXJzb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXYWl0IGZvciBhbGwgY3VycmVudGx5IHZpc2libGUgY29tbWVudHMgdG8gYmUgZnVsbHkgbG9hZGVkLCBpbmNsdWRpbmcgYWxsIGF0dGFjaG1lbnRzLlxyXG4gICAgICogRG9pbmcgdGhpcyB3aWxsIHByZXZlbnQgbGF5b3V0IHNoaWZ0IHdoZW4gc2Nyb2xsaW5nIHRvIGEgc3BlY2lmaWMgY29tbWVudC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvckFsbENvbW1lbnRzVG9Mb2FkKCkge1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxMDApKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZUxvYWRlZDtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmNvbW1lbnRzLm1hcCh4ID0+IHgud2FpdEZvckxvYWQoKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc29ydE1lc3NhZ2VzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zb3VyY2UpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgc29ydGVyOiAoYTogQ2hhdE1lc3NhZ2UsIGI6IENoYXRNZXNzYWdlKSA9PiBudW1iZXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZS5zb3J0T3JkZXIgPT09IENvbW1lbnRzT3JkZXIuTElLRVMpXHJcbiAgICAgICAgICAgIHNvcnRlciA9IChhLCBiKSA9PiBiLmxpa2VzIC0gYS5saWtlcztcclxuICAgICAgICBlbHNlIGlmICh0aGlzLnNvdXJjZS5zb3J0T3JkZXIgPT09IENvbW1lbnRzT3JkZXIuTkVXRVNUKVxyXG4gICAgICAgICAgICBzb3J0ZXIgPSAoYSwgYikgPT4gKGIuc2VudEF0IC0gYS5zZW50QXQpICogKHRoaXMubmV3ZXN0TGFzdCA/IC0xIDogMSk7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyID09PSBDb21tZW50c09yZGVyLk9MREVTVClcclxuICAgICAgICAgICAgc29ydGVyID0gKGEsIGIpID0+IChhLnNlbnRBdCAtIGIuc2VudEF0KSAqICh0aGlzLm5ld2VzdExhc3QgPyAtMSA6IDEpO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2VzLnNvcnQoc29ydGVyKTtcclxuICAgICAgICB0aGlzLm9sZGVyTWVzc2FnZXMuc29ydChzb3J0ZXIpO1xyXG4gICAgICAgIHRoaXMubmV3TWVzc2FnZXMuc29ydChzb3J0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2Nyb2xsZWRUb0xhdGVzdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUNvbnRhaW5lcilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMubWVzc2FnZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTY3JvbGwgPSBlbC5zY3JvbGxUb3A7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFRvdGFsID0gZWwuc2Nyb2xsSGVpZ2h0IC0gZWwub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNjcm9sbCA+IGN1cnJlbnRUb3RhbCAtIDEwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWVzc2FnZVNlbnQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlQ29udGFpbmVyKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9MYXRlc3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb0xhdGVzdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbCA9IHRoaXMubWVzc2FnZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnIH0pO1xyXG4gICAgICAgIC8vZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzY3JvbGxUb0NvbW1lbnQoY29tbWVudElkOiBDaGF0TWVzc2FnZVsnaWQnXSkge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFsbENvbW1lbnRzVG9Mb2FkKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmdldEVsZW1lbnRGb3JDb21tZW50KGNvbW1lbnRJZCk7XHJcbiAgICAgICAgaWYgKGNvbW1lbnQpIHtcclxuICAgICAgICAgICAgY29tbWVudC5zY3JvbGxJbnRvVmlldyh7XHJcbiAgICAgICAgICAgICAgICBpbmxpbmU6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgYmxvY2s6ICdjZW50ZXInXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRFbGVtZW50Rm9yQ29tbWVudChjb21tZW50SWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtY29tbWVudC1pZD1cIiR7Y29tbWVudElkfVwiXWApO1xyXG4gICAgfVxyXG5cclxuICAgIG1lbnRpb25zTWUobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZS5pbmNsdWRlcyhgQCR7dGhpcy5jdXJyZW50VXNlci51c2VybmFtZX1gKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYmFudGEtbWVzc2FnZS1jb250YWluZXJcIiAjbWVzc2FnZUNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltkYXRhLWJlZm9yZV1cIj48L25nLWNvbnRlbnQ+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImJhbnRhLXRvcC1zdGlja3lcIj5cclxuICAgICAgICBAaWYgKCFuZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJiYW50YS1uYXZcIiBcclxuICAgICAgICAgICAgICAgIFtjbGFzcy52aXNpYmxlXT1cInNob3VsZFNob3dOZXdNZXNzYWdlSW5kaWNhdG9yXCIgXHJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd05ld2VzdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maWxlX3VwbG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICBOZXdlc3RcclxuICAgICAgICAgICAgICAgIEBpZiAoaGVsZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50XCI+e3sgaGVsZE1lc3NhZ2VzLmxlbmd0aCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwicGFnZXJcIiAoY2xpY2spPVwic2hvd1ByZXZpb3VzKClcIiBbY2xhc3MudmlzaWJsZV09XCJzaG91bGRTaG93UHJldmlvdXNcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nTW9yZVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbGVzczwvbWF0LWljb24+XHJcbiAgICAgICAge3sgcHJldmlvdXNMYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgQGZvciAobWVzc2FnZSBvZiBtZXNzYWdlczsgdHJhY2sgbWVzc2FnZS5pZCkge1xyXG4gICAgICAgIEBpZiAoIW1lc3NhZ2UuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgIDxiYW50YS1jb21tZW50XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFiYnJldmlhdGVkXCJcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgW2N1c3RvbU1lbnVJdGVtc109XCJjdXN0b21NZW51SXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgW21lc3NhZ2VdPVwibWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICBbbWluZV09XCJjdXJyZW50VXNlcj8uaWQgPT09IG1lc3NhZ2UudXNlcj8uaWRcIlxyXG4gICAgICAgICAgICAgICAgW3Blcm1pc3Npb25zXT1cInNvdXJjZT8ucGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dSZXBseUFjdGlvbl09XCJhbGxvd1JlcGxpZXNcIlxyXG4gICAgICAgICAgICAgICAgW2VkaXRpbmddPVwibWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nXCJcclxuICAgICAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNvdXJjZT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1lc3NhZ2VDbGlja2VkID0gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAoZWRpdFN0YXJ0ZWQpPVwic3RhcnRFZGl0aW5nKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgIChkZWxldGVkKT1cImRlbGV0ZU1lc3NhZ2UobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgKGVkaXRFbmRlZCk9XCJtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAoZWRpdGVkKT1cInNhdmVFZGl0KG1lc3NhZ2UsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHVzZXJTZWxlY3RlZCk9XCJzZWxlY3RNZXNzYWdlVXNlcihtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAoYXZhdGFyU2VsZWN0ZWQpPVwic2VsZWN0QXZhdGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHVzZXJuYW1lU2VsZWN0ZWQpPVwic2VsZWN0VXNlcm5hbWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAobGlrZWQpPVwibGlrZU1lc3NhZ2UobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgKHVubGlrZWQpPVwidW5saWtlTWVzc2FnZShtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAocmVwb3J0ZWQpPVwicmVwb3J0TWVzc2FnZShtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0TWVzc2FnZShtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAoc2hhcmVkKT1cInNoYXJlZE1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtaW5saW5lLXJlcGxpZXMtY29udGFpbmVyXCIgKm5nSWY9XCJzZWxlY3RlZE1lc3NhZ2UgPT09IG1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIi5pbmxpbmUtcmVwbGllc1wiPjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgfSBAZW1wdHkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYW50YS1lbXB0eS1zdGF0ZVwiICpuZ0lmPVwic2hvd0VtcHR5U3RhdGVcIj5cclxuICAgICAgICAgICAgQmUgdGhlIGZpcnN0IHRvIGNvbW1lbnQhXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwicGFnZXJcIiAoY2xpY2spPVwic2hvd05leHQoKVwiIFtjbGFzcy52aXNpYmxlXT1cInNob3VsZFNob3dOZXh0XCIgW2Rpc2FibGVkXT1cImlzTG9hZGluZ01vcmVcIj5cclxuICAgICAgICA8bWF0LWljb24+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICAgIHt7IG5leHRMYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImJhbnRhLW5hdi1wb2ludCBiYW50YS1ib3R0b20tc3RpY2t5XCI+XHJcbiAgICAgICAgQGlmIChuZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwiMTBcIiBtYXRCYWRnZU92ZXJsYXA9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBtYXRCYWRnZVBvc2l0aW9uPVwiYWZ0ZXJcIiBtYXRCYWRnZVNpemU9XCJsYXJnZVwiIFxyXG4gICAgICAgICAgICAgICAgbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYmFudGEtbmF2XCIgXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudmlzaWJsZV09XCJzaG91bGRTaG93TmV3TWVzc2FnZUluZGljYXRvclwiIFxyXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6O1wiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dOZXdlc3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZmlsZV9kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICBOZXdlc3RcclxuICAgICAgICAgICAgICAgIEBpZiAoaGVsZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50XCI+e3sgaGVsZE1lc3NhZ2VzLmxlbmd0aCB8IG51bWJlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImJhbnRhLWxvYWRpbmctbW9yZVwiICpuZ0lmPVwiaXNMb2FkaW5nTW9yZVwiPlxyXG4gICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChzaG93RGVidWcpIHtcclxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6ICM2NjZcIj5cclxuICAgICAgICAgICAgKHt7IHByZXZpb3VzTWVzc2FnZXMubGVuZ3RoIH19IC4uIHt7IG1lc3NhZ2VzLmxlbmd0aCB9fSAuLiB7eyBuZXh0TWVzc2FnZXMubGVuZ3RoIH19KVxyXG5cclxuICAgICAgICAgICAgZGlyPXt7bmV3ZXN0TGFzdCA/ICctMScgOiAnMSd9fVxyXG4gICAgICAgICAgICB2PXt7bWF4VmlzaWJsZU1lc3NhZ2VzfX0sIE09e3ttYXhNZXNzYWdlc319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiOm5vdChbZGF0YS1iZWZvcmVdKTpub3QoLmlubGluZS1yZXBsaWVzKVwiPjwvbmctY29udGVudD5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
728
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay9zcmMvbGliL2NvbW1lbnRzL2NvbW1lbnQtdmlldy9jb21tZW50LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvY29tbWVudC12aWV3L2NvbW1lbnQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFxQixhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7OztBQU9oRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUNsQyxNQUFNLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztBQU96QyxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFlBQ1ksT0FBd0IsRUFDeEIsVUFBbUM7UUFEbkMsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFVL0MsWUFBWTtRQUNaLGdCQUFnQjtRQUVSLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QyxnQkFBVyxHQUFnQixJQUFJLENBQUM7UUFDaEMsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFFN0Isc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGlCQUFZLEdBQUcsSUFBSSxPQUFPLENBQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMs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U0FBUzsrQkFDSSxvQkFBb0I7NkdBY2pCLE1BQU07c0JBQWxCLEtBQUs7Z0JBa0RGLFdBQVc7c0JBRGQsS0FBSztnQkFNRixrQkFBa0I7c0JBRHJCLEtBQUs7Z0JBSUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ3NDLFdBQVc7c0JBQXRELEtBQUs7O3NCQUFJLFdBQVc7dUJBQUMsb0JBQW9CO2dCQUNqQyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFrQmEsWUFBWTtzQkFBOUIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLEtBQUs7c0JBQXZCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFDWSxnQkFBZ0I7c0JBQWxDLE1BQU07Z0JBQ1ksY0FBYztzQkFBaEMsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFDWSxhQUFhO3NCQUEvQixNQUFNO2dCQUNZLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxpQkFBaUI7c0JBQW5DLE1BQU07Z0JBS3lCLGFBQWE7c0JBQTVDLFlBQVk7dUJBQUMsZ0JBQWdCO2dCQUNDLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIE91dHB1dCwgSG9zdEJpbmRpbmcsIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgVXNlciwgQ2hhdE1lc3NhZ2UsIENvbW1lbnRzT3JkZXIsIEZpbHRlck1vZGUgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRCYWNrZW5kQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LWJhY2tlbmQtYmFzZVwiO1xyXG5pbXBvcnQgeyBDaGF0U291cmNlQmFzZSB9IGZyb20gXCIuLi8uLi9jaGF0LXNvdXJjZS1iYXNlXCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VNZW51SXRlbSB9IGZyb20gXCIuLi8uLi9tZXNzYWdlLW1lbnUtaXRlbVwiO1xyXG5pbXBvcnQgeyBDb21tZW50Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbW1lbnQvY29tbWVudC5jb21wb25lbnRcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEV2ZW50IHtcclxuICAgIG1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgbmV3TWVzc2FnZTogc3RyaW5nO1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX01BWF9NRVNTQUdFUyA9IDIwMDA7XHJcbmNvbnN0IERFRkFVTFRfTUFYX1ZJU0lCTEVfTUVTU0FHRVMgPSAyMDA7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY29tbWVudC12aWV3JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tbWVudC12aWV3LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1lbnRWaWV3Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYmFja2VuZDogQ2hhdEJhY2tlbmRCYXNlLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBTb3VyY2VcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2U6IENoYXRTb3VyY2VCYXNlO1xyXG4gICAgQElucHV0KCkgZ2V0IHNvdXJjZSgpIHsgcmV0dXJuIHRoaXMuX3NvdXJjZTsgfVxyXG4gICAgc2V0IHNvdXJjZSh2YWx1ZSkgeyB0aGlzLnNldFNvdXJjZSh2YWx1ZSk7IH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIC8vI3JlZ2lvbiBGaWVsZHNcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2VTdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gICAgbWVudU1lc3NhZ2U6IENoYXRNZXNzYWdlID0gbnVsbDtcclxuICAgIG1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcbiAgICBjdXJyZW50VXNlcjogVXNlcjtcclxuICAgIGN1c3RvbVNvcnRFbmFibGVkID0gZmFsc2U7XHJcbiAgICBtYXJrU291cmNlTG9hZGVkOiAoKSA9PiB2b2lkO1xyXG4gICAgc291cmNlTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4ociA9PiB0aGlzLm1hcmtTb3VyY2VMb2FkZWQgPSByKTtcclxuICAgIGlzVmlld2luZ01vcmUgPSBmYWxzZTtcclxuICAgIGlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuICAgIGhhc01vcmUgPSBmYWxzZTtcclxuICAgIG1lc3NhZ2VDbGlja2VkID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IHByZXZpb3VzTWVzc2FnZXMoKSB7IHJldHVybiB0aGlzLm5ld2VzdExhc3QgPyB0aGlzLm9sZGVyTWVzc2FnZXMgOiB0aGlzLm5ld01lc3NhZ2VzOyB9XHJcbiAgICBnZXQgbmV4dE1lc3NhZ2VzKCkgeyByZXR1cm4gdGhpcy5uZXdlc3RMYXN0ID8gdGhpcy5uZXdNZXNzYWdlcyA6IHRoaXMub2xkZXJNZXNzYWdlczsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hpbGUgdGhpcyBpcyBjYWxsZWQgXCJuZXdcIiBtZXNzYWdlcywgaXQgcmVhbGx5IHJlcHJlc2VudHMgdGhlIG1lc3NhZ2VzIHRoYXQgd291bGQgYmUgdmlzaWJsZSAqYXQgdGhlIGJlZ2lubmluZyBcclxuICAgICAqIG9mIHRoZSBzb3J0IG9yZGVyKiwgd2hpY2ggY2FuIGJlIGZsaXBwZWQgYnkgdGhlIG5ld2VzdExhc3QgZmVhdHVyZSAodXNlZCBmb3IgcmVwbGllcyBtb2RlKS4gXHJcbiAgICAgKiBcclxuICAgICAqIFNvLCB3aGVuIG5ld2VzdExhc3QgaXMgZmFsc2UgKHRvcC1sZXZlbCBjb21tZW50cyksIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgc29ydE9yZGVyLCBuZXdNZXNzYWdlcyBhcmUgY29uY2VwdHVhbGx5IFxyXG4gICAgICogKmFib3ZlKiB0aGUgdmlzaWJsZSBzZXQgb2YgbWVzc2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gbmV3ZXN0TGFzdCBpcyB0cnVlIChhcyBpbiByZXBsaWVzIG1vZGUpLCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IHNvcnRPcmRlciwgbmV3TWVzc2FnZXMgYXJlIGNvbmNlcHR1YWxseSBcclxuICAgICAqICpiZWxvdyogdGhlIHZpc2libGUgc2V0IG9mIG1lc3NhZ2VzLlxyXG4gICAgICovXHJcbiAgICBuZXdNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hpbGUgdGhpcyBpcyBjYWxsZWQgXCJvbGRlclwiIG1lc3NhZ2VzLCBpdCByZWFsbHkgcmVwcmVzZW50cyB0aGUgbWVzc2FnZXMgdGhhdCB3b3VsZCBiZSB2aXNpYmxlICphdCB0aGUgZW5kIG9mIHRoZSBcclxuICAgICAqIHNvcnQgb3JkZXIqLCB3aGljaCBjYW4gYmUgZmxpcHBlZCBieSB0aGUgbmV3ZXN0TGFzdCBmZWF0dXJlICh1c2VkcyBmb3IgcmVwbGllcyBtb2RlKS5cclxuICAgICAqIFxyXG4gICAgICogU28sIHdoZW4gbmV3ZXN0TGFzdCBpcyBmYWxzZSwgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzb3J0T3JkZXIsIG9sZGVyTWVzc2FnZXMgYXJlIGNvbmNlcHR1YWxseSAqYmVsb3cqXHJcbiAgICAgKiB0aGUgdmlzaWJsZSBzZXQgb2YgbWVzc2FnZXMuXHJcbiAgICAgKiBcclxuICAgICAqIFdoZW4gbmV3ZXN0TGFzdCBpcyB0cnVlIChhcyBpbiByZXBsaWVzIG1vZGUpLCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IHNvcnRPcmRlciwgb2xkZXJNZXNzYWdlcyBhcmUgY29uY2VwdHVhbGx5XHJcbiAgICAgKiAqYWJvdmUqIHRoZSB2aXNpYmxlIHNldCBvZiBtZXNzYWdlcy5cclxuICAgICAqL1xyXG4gICAgb2xkZXJNZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIElucHV0c1xyXG5cclxuICAgIHByaXZhdGUgX21heE1lc3NhZ2VzOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IG1heE1lc3NhZ2VzKHZhbHVlKSB7IHRoaXMuX21heE1lc3NhZ2VzID0gdmFsdWU7IH1cclxuICAgIGdldCBtYXhNZXNzYWdlcygpIHsgcmV0dXJuIHRoaXMuX21heE1lc3NhZ2VzID8/IERFRkFVTFRfTUFYX01FU1NBR0VTOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWF4VmlzaWJsZU1lc3NhZ2VzOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBcclxuICAgIHNldCBtYXhWaXNpYmxlTWVzc2FnZXModmFsdWUpIHsgdGhpcy5fbWF4VmlzaWJsZU1lc3NhZ2VzID0gdmFsdWU7IH1cclxuICAgIGdldCBtYXhWaXNpYmxlTWVzc2FnZXMoKSB7IHJldHVybiB0aGlzLl9tYXhWaXNpYmxlTWVzc2FnZXMgPz8gREVGQVVMVF9NQVhfVklTSUJMRV9NRVNTQUdFUzsgfVxyXG5cclxuICAgIEBJbnB1dCgpIG5ld2VzdExhc3QgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhvbGROZXdNZXNzYWdlcyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgc2hvd0VtcHR5U3RhdGUgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgYWxsb3dSZXBsaWVzID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGVuYWJsZUhvbGRPbkNsaWNrID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBlbmFibGVIb2xkT25TY3JvbGwgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgY3VzdG9tTWVudUl0ZW1zOiBNZXNzYWdlTWVudUl0ZW1bXSA9IFtdO1xyXG4gICAgQElucHV0KCkgQEhvc3RCaW5kaW5nKCdjbGFzcy5maXhlZC1oZWlnaHQnKSBmaXhlZEhlaWdodDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkTWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcbiAgICBASW5wdXQoKSBnZW5lcmljQXZhdGFyVXJsOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIE91dHB1dHNcclxuXHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfbGlrZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3VubGlrZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3VzZXJuYW1lU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfYXZhdGFyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfc2hhcmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9kZWxldGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlRWRpdGVkID0gbmV3IFN1YmplY3Q8RWRpdEV2ZW50PigpO1xyXG4gICAgcHJpdmF0ZSBfc29ydE9yZGVyQ2hhbmdlZCA9IG5ldyBTdWJqZWN0PENvbW1lbnRzT3JkZXI+KCk7XHJcbiAgICBwcml2YXRlIF9maWx0ZXJNb2RlQ2hhbmdlZCA9IG5ldyBTdWJqZWN0PEZpbHRlck1vZGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVzZXJTZWxlY3RlZCA9IHRoaXMuX3VzZXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSByZXBvcnRlZCA9IHRoaXMuX3JlcG9ydGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGxpa2VkID0gdGhpcy5fbGlrZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdW5saWtlZCA9IHRoaXMuX3VubGlrZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdXNlcm5hbWVTZWxlY3RlZCA9IHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgYXZhdGFyU2VsZWN0ZWQgPSB0aGlzLl9hdmF0YXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBzaGFyZWQgPSB0aGlzLl9zaGFyZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZGVsZXRlZCA9IHRoaXMuX2RlbGV0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBtZXNzYWdlRWRpdGVkID0gdGhpcy5fbWVzc2FnZUVkaXRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBzb3J0T3JkZXJDaGFuZ2VkID0gdGhpcy5fc29ydE9yZGVyQ2hhbmdlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBmaWx0ZXJNb2RlQ2hhbmdlZCA9IHRoaXMuX2ZpbHRlck1vZGVDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvbiBcclxuICAgIC8vI3JlZ2lvbiBVSSBCaW5kaW5nc1xyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oQ29tbWVudENvbXBvbmVudCkgY29tbWVudHNRdWVyeTogUXVlcnlMaXN0PENvbW1lbnRDb21wb25lbnQ+O1xyXG4gICAgQFZpZXdDaGlsZCgnbWVzc2FnZUNvbnRhaW5lcicpIG1lc3NhZ2VDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gICAgZ2V0IGNvbW1lbnRzKCkgeyByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNvbW1lbnRzUXVlcnkpOyB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZXNzYWdlIGNhbiBiZSBmb3VuZCB3aXRoaW4gb25lIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlcnMgKG9sZGVyLCBjdXJyZW50LCBuZXdlcilcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFxyXG4gICAgICovXHJcbiAgICBpc01lc3NhZ2VMb2FkZWRJbkNvbnRleHQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vbGRlck1lc3NhZ2VzLmZpbmQoeCA9PiB4LmlkID09PSBtZXNzYWdlLmlkKVxyXG4gICAgICAgICAgICB8fCB0aGlzLm1lc3NhZ2VzLmZpbmQoeCA9PiB4LmlkID09PSBtZXNzYWdlLmlkKVxyXG4gICAgICAgICAgICB8fCB0aGlzLm5ld01lc3NhZ2VzLmZpbmQoeCA9PiB4LmlkID09PSBtZXNzYWdlLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkTWVzc2FnZUluQ29udGV4dChtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlTG9hZGVkO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIG1lc3NhZ2UgJHttZXNzYWdlLmlkfSBpbiBjb250ZXh0Li4uYCk7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuaGFzTW9yZSAmJiAhdGhpcy5pc01lc3NhZ2VMb2FkZWRJbkNvbnRleHQobWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYC4uLk5lZWQgdG8gbG9hZCBtb3JlIGNvbW1lbnRzIHRvIGZpbmQgJHttZXNzYWdlLmlkfWApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dNb3JlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNNZXNzYWdlTG9hZGVkSW5Db250ZXh0KG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHdoaWxlIGxvYWRpbmcgbWVzc2FnZSBpbiBjb250ZXh0OiBGYWlsZWQgdG8gZmluZCBtZXNzYWdlICR7bWVzc2FnZS5pZH0sIG1heWJlIGl0IHdhcyBkZWxldGVkIWApO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaXRlbXMgPSBbXS5jb25jYXQodGhpcy5vbGRlck1lc3NhZ2VzLCB0aGlzLm1lc3NhZ2VzLCB0aGlzLm5ld01lc3NhZ2VzKTtcclxuICAgICAgICBsZXQgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoeCA9PiB4LmlkID09PSBtZXNzYWdlLmlkKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGlsZSBsb2FkaW5nIG1lc3NhZ2UgaW4gY29udGV4dDogTWVzc2FnZSB3YXMgbm90IHByZXNlbnQgaW4gbWVzc2FnZSBsaXN0IWApO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhcnRJbmRleCA9IE1hdGgubWF4KDAsIGluZGV4IC0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMgLyAyKTtcclxuICAgICAgICB0aGlzLm5ld01lc3NhZ2VzID0gaXRlbXMuc3BsaWNlKDAsIHN0YXJ0SW5kZXgpO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBpdGVtcy5zcGxpY2UoMCwgdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMpO1xyXG4gICAgICAgIHRoaXMub2xkZXJNZXNzYWdlcyA9IGl0ZW1zO1xyXG4gICAgICAgIHRoaXMuaXNWaWV3aW5nTW9yZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNob3VsZFNob3dOZXdNZXNzYWdlSW5kaWNhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmlld2luZ01vcmUgXHJcbiAgICAgICAgICAgIHx8IHRoaXMuY3VzdG9tU29ydEVuYWJsZWQgXHJcbiAgICAgICAgICAgIHx8IHRoaXMuc291cmNlRmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5BTExcclxuICAgICAgICAgICAgfHwgdGhpcy5oZWxkTWVzc2FnZXMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkSG9sZE5ld01lc3NhZ2VzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVNvcnRFbmFibGVkKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5ob2xkTmV3TWVzc2FnZXMgfHwgdGhpcy5pc1ZpZXdpbmdNb3JlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBob2xkaW5nIGR1ZSB0byBzZXR0aW5nc2ApO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmVuYWJsZUhvbGRPbkNsaWNrICYmIHRoaXMubWVzc2FnZUNsaWNrZWQpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lbmFibGVIb2xkT25TY3JvbGwpIHtcclxuICAgICAgICAgICAgbGV0IGtleU1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdClcclxuICAgICAgICAgICAgICAgIGtleU1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW3RoaXMubWVzc2FnZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIGtleU1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzWzBdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGtleU1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50Rm9yQ29tbWVudChrZXlNZXNzYWdlLmlkKTtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VsZW1lbnRWaXNpYmxlKG1lc3NhZ2VFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhga2V5IGVsZW1lbnQgaXMgbm90IHZpc2libGVgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGtleSBlbGVtZW50IGlzIHZpc2libGVgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBjb3VsZCBub3QgZmluZCBrZXkgZWxlbWVudGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGNvdWxkIG5vdCBmaW5kIGtleSBtZXNzYWdlYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzRWxlbWVudFZpc2libGUoZWxlbWVudDogRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICByZXR1cm4gISFlbGVtZW50UmVjdCBcclxuICAgICAgICAgICAgJiYgZWxlbWVudFJlY3QuYm90dG9tID49IDBcclxuICAgICAgICAgICAgJiYgZWxlbWVudFJlY3QucmlnaHQgPj0gMFxyXG4gICAgICAgICAgICAmJiBlbGVtZW50UmVjdC5sZWZ0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aFxyXG4gICAgICAgICAgICAmJiBlbGVtZW50UmVjdC50b3AgPD0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgQ29tbWVudENvbXBvbmVudCBpbnN0YW50aWF0ZWQgZm9yIHRoZSBnaXZlbiBDaGF0TWVzc2FnZSxcclxuICAgICAqIGlmIGl0IGV4aXN0cyBpbiB0aGUgY3VycmVudCB2aWV3LiBOb3RlIHRoYXQgbWVzc2FnZXMgd2hpY2ggYXJlIG5vdCBcclxuICAgICAqIGN1cnJlbnRseSBzaG93biB0byB0aGUgdXNlciB3aWxsIG5vdCByZXR1cm4gYSBDb21tZW50Q29tcG9uZW50LlxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tbWVudENvbXBvbmVudEZvck1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIW1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgWW91IG11c3QgcGFzcyBhIHZhbGlkIENoYXRNZXNzYWdlYCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudHMuZmluZCh4ID0+IHgubWVzc2FnZT8uaWQgPT09IG1lc3NhZ2UuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVFZGl0KG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBuZXdNZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlRWRpdGVkLm5leHQoeyBtZXNzYWdlLCBuZXdNZXNzYWdlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxpa2VNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fbGlrZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICB1bmxpa2VNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fdW5saWtlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcG9ydE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdE1lc3NhZ2VVc2VyKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlclNlbGVjdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VXNlcm5hbWUodXNlcjogVXNlcikge1xyXG4gICAgICAgIHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQubmV4dCh1c2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBdmF0YXIodXNlcjogVXNlcikge1xyXG4gICAgICAgIHRoaXMuX2F2YXRhclNlbGVjdGVkLm5leHQodXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgc2hhcmVkTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3NoYXJlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RWRpdGluZyhtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMuZm9yRWFjaChtID0+IG0udHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9kZWxldGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRTb3VyY2UodmFsdWU6IENoYXRTb3VyY2VCYXNlKSB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21Tb3J0RW5hYmxlZCA9ICh2YWx1ZT8uc29ydE9yZGVyID8/IENvbW1lbnRzT3JkZXIuTkVXRVNUKSAhPT0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMub2xkZXJNZXNzYWdlcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuaGVsZE1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgICAgICh3aW5kb3cgYXMgYW55KS5iYW50YVNvdXJjZURlYnVnID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VTdWJzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnMudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3VicyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSAodmFsdWUubWVzc2FnZXMgfHwgW10pLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcclxuICAgICAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzID0gbWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCBtZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB0aGlzLmhhc01vcmUgPSB0cnVlOyAvL3RoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VSZWNlaXZlZC5zdWJzY3JpYmUobXNnID0+IHRoaXMubWVzc2FnZVJlY2VpdmVkKG1zZykpKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vicy5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VTZW50LnN1YnNjcmliZShtc2cgPT4gdGhpcy5tZXNzYWdlU2VudChtc2cpKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzLmFkZChcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja2VuZC51c2VyQ2hhbmdlZC5zdWJzY3JpYmUodXNlciA9PiB0aGlzLmN1cnJlbnRVc2VyID0gdXNlcilcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5pdGlhbE1lc3NhZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0SW5pdGlhbE1lc3NhZ2VzKCkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlcyA9IChhd2FpdCB0aGlzLl9zb3VyY2UuZ2V0RXhpc3RpbmdNZXNzYWdlcygpKTtcclxuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKG0gPT4gbS50cmFuc2llbnRTdGF0ZSA/Pz0ge30pO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm5ld2VzdExhc3QgPyBtZXNzYWdlcy5zbGljZSgpLnJldmVyc2UoKSA6IG1lc3NhZ2VzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlcy5sZW5ndGggPiB0aGlzLm1heFZpc2libGVNZXNzYWdlcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzTWVzc2FnZXMucHVzaCguLi50aGlzLm1lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRNZXNzYWdlcy51bnNoaWZ0KC4uLnRoaXMubWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRlYnVnTWVzc2FnZXMoKTtcclxuICAgICAgICB0aGlzLnNvcnRNZXNzYWdlcygpO1xyXG4gICAgICAgIGlmICh0aGlzLm1hcmtTb3VyY2VMb2FkZWQpXHJcbiAgICAgICAgICAgIHRoaXMubWFya1NvdXJjZUxvYWRlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnTWVzc2FnZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNob3dEZWJ1ZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFsgXHJcbiAgICAgICAgLy8gICAgIC4uLnRoaXMucHJldmlvdXNNZXNzYWdlcy5tYXAoeCA9PiB4Lm1lc3NhZ2UpLCBcclxuICAgICAgICAvLyAgICAgJ1tbJyxcclxuICAgICAgICAvLyAgICAgLi4udGhpcy5tZXNzYWdlcy5tYXAoeCA9PiB4Lm1lc3NhZ2UpLFxyXG4gICAgICAgIC8vICAgICAnXV0nLFxyXG4gICAgICAgIC8vICAgICAuLi50aGlzLm5leHRNZXNzYWdlcy5tYXAoeCA9PiB4Lm1lc3NhZ2UpIFxyXG4gICAgICAgIC8vIF0ubWFwKHggPT4gL1xcZCsvLnRlc3QoeCkgPyB0aGlzLnplcm9QYWQoeCwgMikgOiB4KS5qb2luKFwiIFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgemVyb1BhZChudW1iZXI6IG51bWJlciB8IHN0cmluZywgY291bnQ6IG51bWJlciA9IDIpIHtcclxuICAgICAgICBsZXQgc3RyOiBzdHJpbmc7XHJcbiAgICBcclxuICAgICAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpXHJcbiAgICAgICAgICAgIHN0ciA9IFN0cmluZyhudW1iZXIpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgc3RyID0gbnVtYmVyO1xyXG4gICAgXHJcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBjb3VudClcclxuICAgICAgICAgICAgc3RyID0gJzAnICsgc3RyO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIGxlZnRQYWQoc3RyOiBzdHJpbmcsIGNvdW50OiBudW1iZXIgPSAyKSB7XHJcbiAgICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBjb3VudClcclxuICAgICAgICAgICAgc3RyID0gJyAnICsgc3RyO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbWVzc2FnZUlkZW50aXR5KGluZGV4OiBudW1iZXIsIGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiBjaGF0TWVzc2FnZS5pZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc291cmNlU29ydE9yZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZT8uc29ydE9yZGVyID8/IENvbW1lbnRzT3JkZXIuTkVXRVNUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VGaWx0ZXJNb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZT8uZmlsdGVyTW9kZSA/PyBGaWx0ZXJNb2RlLkFMTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgdGhlIG5ld2VzdCBjb250ZW50LlxyXG4gICAgICogLSBJZiBhbiB1bm5hdHVyYWwgc29ydCBvcmRlciBpcyBhY3RpdmUgKGllIE9sZGVzdCBvciBMaWtlcyksIGl0IHdpbGwgYmUgY2hhbmdlZCB0byBOZXdlc3QuXHJcbiAgICAgKiAtIFRoZSBuZXcgY29udGVudCB3aWxsIGJlIHBsYWNlZCB3aGVyZSBuZXcgY29udGVudCBnb2VzIGJhc2VkIG9uIG5ld2VzdExhc3QgKHJlcGxpZXMgbW9kZSksIHNvIGlmIGl0IGlzIHRydWUsIHRoZSBjb250ZW50IGlzIFxyXG4gICAgICogICBwbGFjZWQgYXQgdGhlIGVuZCwgb3RoZXJ3aXNlIGl0IGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2hvd05ld2VzdChldmVudDogTW91c2VFdmVudCkge1xyXG5cclxuICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIGhvdyB3ZSBoYW5kbGUgdGhpcywgY2xlYXIgb3V0IG91ciBoZWxkIG1lc3NhZ2VzXHJcblxyXG4gICAgICAgIHRoaXMuaGVsZE1lc3NhZ2VzID0gW107XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQ2xpY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgc29ydCBvcmRlciBpcyBub3QgYWxyZWFkeSBOZXdlc3QsIHN3aXRjaCB0byBOZXdlc3QgYW5kIHN0b3AuXHJcbiAgICAgICAgLy8gVGhlIGFjdCBvZiBjaGFuZ2luZyB0aGUgc29ydCBvcmRlciB3aWxsIGNhdXNlIHRoZSBuZXdlc3QgY29udGVudCB0byBiZSBsb2FkZWQuXHJcblxyXG4gICAgICAgIGxldCBuYXR1cmFsT3JkZXIgPSBDb21tZW50c09yZGVyLk5FV0VTVDtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgIT09IG5hdHVyYWxPcmRlciB8fCB0aGlzLnNvdXJjZUZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUuQUxMKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVNvcnRPcmRlciAhPT0gbmF0dXJhbE9yZGVyKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydE9yZGVyQ2hhbmdlZC5uZXh0KG5hdHVyYWxPcmRlcik7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUuQUxMKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyTW9kZUNoYW5nZWQubmV4dChGaWx0ZXJNb2RlLkFMTCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE9uIHRoaXMgcGF0aCwgd2UgYXJlIGFscmVhZHkgb24gTmV3ZXN0LCBidXQgdGhlcmUgaXMgbmV3ZXIgY29udGVudCBhdmFpbGFibGUgKHN1Y2ggYXMgd2hlbiBuZXcgY29udGVudCBpcyBcclxuICAgICAgICAvLyBiZWluZyBidWZmZXJlZCBkdWUgdG8gdXNlciBlbmdhZ2VtZW50IG9uIGEgY29tbWVudClcclxuXHJcbiAgICAgICAgdGhpcy5pc1ZpZXdpbmdNb3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIE1vdmUgYWxsIG5ld2VyTWVzc2FnZXMgaW50byBtZXNzYWdlcywgcmVzcGVjdGluZyB0aGUgbmV3ZXN0TGFzdCBkaXJlY3Rpb24gKG5vcm1hbCBvciByZXBsaWVzIG1vZGUpXHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmNvbmNhdCh0aGlzLm5ld01lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm5ld01lc3NhZ2VzLmxlbmd0aCkpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IHRoaXMubmV3TWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMubmV3TWVzc2FnZXMubGVuZ3RoKS5jb25jYXQodGhpcy5tZXNzYWdlcyk7XHJcblxyXG4gICAgICAgIGxldCBvdmVyZmxvdyA9IHRoaXMubWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzID0gb3ZlcmZsb3cuY29uY2F0KHRoaXMub2xkZXJNZXNzYWdlcyk7XHJcbiAgICAgICAgdGhpcy5vbGRlck1lc3NhZ2VzLnNwbGljZSh0aGlzLm1heE1lc3NhZ2VzIC0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIHRoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgIHRoaXMuaGFzTW9yZSA9IHRoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG5cclxuICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIG5ld2VzdCBjb21tZW50LlxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0NvbW1lbnQodGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdLmlkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Db21tZW50KHRoaXMubWVzc2FnZXNbMF0uaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaG93RGVidWcoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2VbJ2JhbnRhOmRlYnVnJ10gPT09ICcxJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2hvdWxkU2hvd05leHQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzTW9yZSB8fCB0aGlzLm5leHRNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dE1lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNob3VsZFNob3dQcmV2aW91cygpIHtcclxuICAgICAgICBpZiAodGhpcy5uZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc01vcmUgfHwgdGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBhZ2VTaXplKCkge1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1pbigyMCwgdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMgfHwgMjApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dQcmV2aW91cygpIHtcclxuICAgICAgICB0aGlzLmlzVmlld2luZ01vcmUgPSB0cnVlO1xyXG4gICAgICAgIGxldCBuZXh0UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoaXNOYU4obmV4dFBhZ2VTaXplKSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3Qgc2FmZSB0byBsb2FkIG1vcmUgd2l0aCBOYU4gcGFnZSBzaXplYCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzTWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRNZXNzYWdlcyA9IHRoaXMucHJldmlvdXNNZXNzYWdlcy5zcGxpY2UoTWF0aC5tYXgoMCwgdGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCAtIG5leHRQYWdlU2l6ZSksIG5leHRQYWdlU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBbLi4uc3RvcmVkTWVzc2FnZXMsIC4uLnRoaXMubWVzc2FnZXNdO1xyXG4gICAgICAgICAgICBuZXh0UGFnZVNpemUgLT0gc3RvcmVkTWVzc2FnZXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8vIExvYWQgbW9yZSBmcm9tIGJhY2tlbmQgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gTm90ZTogQmFja2VuZCBvbmx5IHN1cHBvcnRzIGZldGNoaW5nIG1vcmUgY29udGVudCBpbiBvbmUgZGlyZWN0aW9uLlxyXG5cclxuICAgICAgICBsZXQgbGFzdE1lc3NhZ2UgPSB0aGlzLnByZXZpb3VzTWVzc2FnZXNbMF0gPz8gdGhpcy5tZXNzYWdlc1swXTtcclxuXHJcbiAgICAgICAgaWYgKG5leHRQYWdlU2l6ZSA+IDAgJiYgdGhpcy5uZXdlc3RMYXN0ICYmIGxhc3RNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZXMgPSBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQWZ0ZXIobGFzdE1lc3NhZ2UsIG5leHRQYWdlU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKCkucmV2ZXJzZSgpOyAvLyBiZWNhdXNlIG5ld2VzdExhc3QgPT09IHRydWVcclxuICAgICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtID0+IG0udHJhbnNpZW50U3RhdGUgPz89IHt9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEluIHJlcGxpZXMgbW9kZSAobmV3ZXN0TGFzdCksIHdlIHdhbnQgdG8gcHV0IHRoZXNlIG5ldyBtZXNzYWdlcyBvbnRvIHRoZSAqdG9wKiBvZiB0aGUgc2V0IG9mIHZpc2libGUgbWVzc2FnZXMuXHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSB3YW50IHRvIHB1dCB0aGVtIG9uIHRoZSAqYm90dG9tKi5cclxuXHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBbLi4ubWVzc2FnZXMsIC4uLnRoaXMubWVzc2FnZXNdO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IHJlY2VpdmUgYW55IG1lc3NhZ2VzIGF0IGFsbCwgdGhlcmUncyBubyBtb3JlIHRvIGZldGNoLlxyXG5cclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFzTW9yZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG1lc3NhZ2VzIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgbWF4VmlzaWJsZU1lc3NhZ2VzIGJ1ZmZlci5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgbGV0IG92ZXJmbG93ID0gdGhpcy5tZXNzYWdlcy5zcGxpY2UodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIHRoaXMubWVzc2FnZXMubGVuZ3RoKTtcclxuICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZXMudW5zaGlmdCguLi5vdmVyZmxvdyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHRNZXNzYWdlcy5sZW5ndGggPiB0aGlzLm1heE1lc3NhZ2VzKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4TWVzc2FnZXMsIHRoaXMubmV4dE1lc3NhZ2VzLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRlYnVnTWVzc2FnZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc29ydE5leHRMYWJlbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgPT09ICduZXdlc3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnT2xkZXInO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgPT09ICdvbGRlc3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnTmV3ZXInO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgPT09ICdsaWtlcycpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdMZXNzIExpa2VzJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnTW9yZSc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRQcmV2aW91c0xhYmVsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZVNvcnRPcmRlciA9PT0gJ25ld2VzdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdOZXdlcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNvdXJjZVNvcnRPcmRlciA9PT0gJ29sZGVzdCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdPbGRlcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNvdXJjZVNvcnRPcmRlciA9PT0gJ2xpa2VzJykge1xyXG4gICAgICAgICAgICByZXR1cm4gJ01vcmUgTGlrZXMnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICdNb3JlJztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmV4dExhYmVsKCkgeyByZXR1cm4gdGhpcy5uZXdlc3RMYXN0ID8gdGhpcy5zb3J0UHJldmlvdXNMYWJlbCA6IHRoaXMuc29ydE5leHRMYWJlbDsgfVxyXG4gICAgZ2V0IHByZXZpb3VzTGFiZWwoKSB7IHJldHVybiB0aGlzLm5ld2VzdExhc3QgPyB0aGlzLnNvcnROZXh0TGFiZWwgOiB0aGlzLnNvcnRQcmV2aW91c0xhYmVsOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IG1vcmUgY29udGVudFxyXG4gICAgICogLSBXaGVuIGluIHJlcGxpZXMgbW9kZSAobmV3ZXN0TGFzdCksIHRoZSBjb250ZW50IGlzIGFkZGVkIGF0IHRoZSB0b3BcclxuICAgICAqIC0gV2hlbiBpbiBub3JtYWwgbW9kZSwgdGhlIGNvbnRlbnQgaXMgYWRkZWQgYXQgdGhlIGJvdHRvbVxyXG4gICAgICogLSBUaGUgY3VycmVudCBzb3J0IG9yZGVyIGRvZXMgKm5vdCogZmFjdG9yIGluIGhlcmUsIHdoaWNoIGlzIHdoeSBpdCBpcyBzaG93TW9yZSgpIG5vdCBzaG93RWFybGllcigpLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2hvd05leHQoKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdpbmdNb3JlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgbGV0IG5leHRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XHJcblxyXG4gICAgICAgIGlmIChpc05hTihuZXh0UGFnZVNpemUpKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBzYWZlIHRvIGxvYWQgbW9yZSB3aXRoIE5hTiBwYWdlIHNpemVgKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5leHRNZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZE1lc3NhZ2VzID0gdGhpcy5uZXh0TWVzc2FnZXMuc3BsaWNlKDAsIG5leHRQYWdlU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBbIC4uLnRoaXMubWVzc2FnZXMsIC4uLnN0b3JlZE1lc3NhZ2VzIF07XHJcbiAgICAgICAgICAgIG5leHRQYWdlU2l6ZSAtPSBzdG9yZWRNZXNzYWdlcy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsYXN0TWVzc2FnZSA9IHRoaXMub2xkZXJNZXNzYWdlc1t0aGlzLm9sZGVyTWVzc2FnZXMubGVuZ3RoIC0gMV0gPz8gdGhpcy5tZXNzYWdlc1t0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICBpZiAobmV4dFBhZ2VTaXplID4gMCAmJiAhdGhpcy5uZXdlc3RMYXN0ICYmIGxhc3RNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIC8vIExvYWQgbW9yZSBmcm9tIGJhY2tlbmRcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgbWVzc2FnZXMgPSBhd2FpdCB0aGlzLnNvdXJjZS5sb2FkQWZ0ZXIobGFzdE1lc3NhZ2UsIG5leHRQYWdlU2l6ZSk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobSA9PiBtLnRyYW5zaWVudFN0YXRlID8/PSB7fSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBbIC4uLnRoaXMubWVzc2FnZXMsIC4uLm1lc3NhZ2VzIF07XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYXQgYWxsLCB0aGVyZSdzIG5vIG1vcmUgdG8gZmV0Y2guXHJcblxyXG4gICAgICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNNb3JlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG1lc3NhZ2VzIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgbWF4VmlzaWJsZU1lc3NhZ2VzIGJ1ZmZlci5cclxuXHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXMubGVuZ3RoID4gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgbGV0IG92ZXJmbG93ID0gdGhpcy5tZXNzYWdlcy5zcGxpY2UoMCwgdGhpcy5tZXNzYWdlcy5sZW5ndGggLSB0aGlzLm1heFZpc2libGVNZXNzYWdlcyk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIHRoZSBvcmRlciAobmV3ZXN0TGFzdCksIG5ld01lc3NhZ2VzIHJlcHJlc2VudHMgdGhlIGRpcmVjdGlvbiB0aGF0IGlzIGJlaW5nIHB1c2hlZCwgc2luY2UgaXQncyBkZWZpbml0aW9uXHJcbiAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gdGhhdCBvcmRlci4gTW92ZSBvdmVyZmxvd2luZyBtZXNzYWdlcyBpbnRvIG5ld01lc3NhZ2VzLlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5wcmV2aW91c01lc3NhZ2VzLnB1c2goLi4ub3ZlcmZsb3cpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c01lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4TWVzc2FnZXMpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzTWVzc2FnZXMuc3BsaWNlKDAsIHRoaXMucHJldmlvdXNNZXNzYWdlcy5sZW5ndGggLSB0aGlzLm1heE1lc3NhZ2VzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGVidWdNZXNzYWdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvdyBtb3JlIGNvbnRlbnRcclxuICAgICAqIC0gV2hlbiBpbiByZXBsaWVzIG1vZGUgKG5ld2VzdExhc3QpLCB0aGUgY29udGVudCBpcyBhZGRlZCBhdCB0aGUgdG9wXHJcbiAgICAgKiAtIFdoZW4gaW4gbm9ybWFsIG1vZGUsIHRoZSBjb250ZW50IGlzIGFkZGVkIGF0IHRoZSBib3R0b21cclxuICAgICAqIC0gVGhlIGN1cnJlbnQgc29ydCBvcmRlciBkb2VzICpub3QqIGZhY3RvciBpbiBoZXJlLCB3aGljaCBpcyB3aHkgaXQgaXMgc2hvd01vcmUoKSBub3Qgc2hvd0VhcmxpZXIoKS5cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNob3dNb3JlKCkge1xyXG4gICAgICAgIHRoaXMuaXNWaWV3aW5nTW9yZSA9IHRydWU7XHJcblxyXG4gICAgICAgIGxldCBuZXh0UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xyXG5cclxuICAgICAgICBpZiAoaXNOYU4obmV4dFBhZ2VTaXplKSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3Qgc2FmZSB0byBsb2FkIG1vcmUgd2l0aCBOYU4gcGFnZSBzaXplYCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5vbGRlck1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTWVzc2FnZXMgPSB0aGlzLm9sZGVyTWVzc2FnZXMuc3BsaWNlKDAsIG5leHRQYWdlU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLmNvbmNhdChzdG9yZWRNZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIG5leHRQYWdlU2l6ZSAtPSBzdG9yZWRNZXNzYWdlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuaGFzTW9yZSA9IHRoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggPiAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGxhc3RNZXNzYWdlOiBDaGF0TWVzc2FnZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICBsYXN0TWVzc2FnZSA9IHRoaXMub2xkZXJNZXNzYWdlc1swXSA/PyB0aGlzLm1lc3NhZ2VzWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxhc3RNZXNzYWdlID0gdGhpcy5vbGRlck1lc3NhZ2VzW3RoaXMub2xkZXJNZXNzYWdlcy5sZW5ndGggLSAxXSA/PyB0aGlzLm1lc3NhZ2VzW3RoaXMubWVzc2FnZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobmV4dFBhZ2VTaXplID4gMCAmJiBsYXN0TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAvLyBMb2FkIG1vcmUgZnJvbSBiYWNrZW5kXHJcblxyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmUgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGlmICghbGFzdE1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYXNNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuc291cmNlLmxvYWRBZnRlcihsYXN0TWVzc2FnZSwgbmV4dFBhZ2VTaXplKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IG1lc3NhZ2VzLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtID0+IG0udHJhbnNpZW50U3RhdGUgPz89IHt9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEluIHJlcGxpZXMgbW9kZSAobmV3ZXN0TGFzdCksIHdlIHdhbnQgdG8gcHV0IHRoZXNlIG5ldyBtZXNzYWdlcyBvbnRvIHRoZSAqdG9wKiBvZiB0aGUgc2V0IG9mIHZpc2libGUgbWVzc2FnZXMuXHJcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSB3YW50IHRvIHB1dCB0aGVtIG9uIHRoZSAqYm90dG9tKi5cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcy5jb25jYXQodGhpcy5tZXNzYWdlcyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcy5jb25jYXQobWVzc2FnZXMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgbWVzc2FnZXMgYXQgYWxsLCB0aGVyZSdzIG5vIG1vcmUgdG8gZmV0Y2guXHJcblxyXG4gICAgICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc01vcmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBFeHRyYWN0IHRoZSBtZXNzYWdlcyB0aGF0IGRvIG5vdCBmaXQgaW4gdGhlIG1heFZpc2libGVNZXNzYWdlcyBidWZmZXIuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzLmxlbmd0aCA+IHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIGxldCBvdmVyZmxvdzogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gTW92ZSBvdmVyZmxvd2luZyBtZXNzYWdlcyBpbnRvIG5ld01lc3NhZ2VzLlxyXG4gICAgICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIHRoZSBvcmRlciAobmV3ZXN0TGFzdCksIG5ld01lc3NhZ2VzIHJlcHJlc2VudHMgdGhlIGRpcmVjdGlvbiB0aGF0IGlzIGJlaW5nIGxvYWRlZCwgXHJcbiAgICAgICAgICAgIC8vIHNpbmNlIGl0J3MgZGVmaW5pdGlvbiBkZXBlbmRzIG9uIHRoYXQgb3JkZXIuIFxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMubmV3ZXN0TGFzdCkge1xyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0aGlzLm1lc3NhZ2VzLnNwbGljZSh0aGlzLm1heFZpc2libGVNZXNzYWdlcywgdGhpcy5tZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXdNZXNzYWdlcyA9IG92ZXJmbG93LmNvbmNhdCh0aGlzLm5ld01lc3NhZ2VzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZXMuc3BsaWNlKHRoaXMubWF4TWVzc2FnZXMgLSB0aGlzLm1heFZpc2libGVNZXNzYWdlcywgdGhpcy5uZXdNZXNzYWdlcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0aGlzLm1lc3NhZ2VzLnNwbGljZSgwLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCAtIHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubmV3TWVzc2FnZXMucHVzaCguLi5vdmVyZmxvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXdNZXNzYWdlcy5sZW5ndGggPiB0aGlzLm1heE1lc3NhZ2VzIC0gdGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdNZXNzYWdlcy5zcGxpY2UoMCwgdGhpcy5uZXdNZXNzYWdlcy5sZW5ndGggLSAodGhpcy5tYXhNZXNzYWdlcyAtIHRoaXMubWF4VmlzaWJsZU1lc3NhZ2VzKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGVsZE1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcblxyXG4gICAgICAgIGlmICghbWVzc2FnZS50cmFuc2llbnRTdGF0ZSlcclxuICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGRlc3RpbmF0aW9uID0gdGhpcy5tZXNzYWdlcztcclxuICAgICAgICBsZXQgYnVja2V0ID0gdGhpcy5vbGRlck1lc3NhZ2VzO1xyXG4gICAgICAgIGxldCBuZXdlc3RMYXN0ID0gdGhpcy5uZXdlc3RMYXN0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG91bGRIb2xkTmV3TWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWxkTWVzc2FnZXMucHVzaChtZXNzYWdlKTtcclxuICAgICAgICAgICAgZGVzdGluYXRpb24gPSB0aGlzLm5ld01lc3NhZ2VzO1xyXG4gICAgICAgICAgICBidWNrZXQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IG9uIHRoZSBuZXdlc3Qgc29ydCBvcmRlciwgbmV3IG1lc3NhZ2VzIHNob3VsZG4ndCBiZSBhZGRlZCBhdCBhbGxcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2VTb3J0T3JkZXIgIT09IENvbW1lbnRzT3JkZXIuTkVXRVNUKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChuZXdlc3RMYXN0KSB7XHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLnB1c2gobWVzc2FnZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3ZlcmZsb3cgPSBkZXN0aW5hdGlvbi5zcGxpY2UodGhpcy5tYXhWaXNpYmxlTWVzc2FnZXMsIGRlc3RpbmF0aW9uLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBidWNrZXQ/LnB1c2goLi4ub3ZlcmZsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGVzdGluYXRpb24udW5zaGlmdChtZXNzYWdlKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1heFZpc2libGVNZXNzYWdlcyA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBvdmVyZmxvdyA9IGRlc3RpbmF0aW9uLnNwbGljZSh0aGlzLm1heFZpc2libGVNZXNzYWdlcywgZGVzdGluYXRpb24ubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGJ1Y2tldD8udW5zaGlmdCguLi5vdmVyZmxvdyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChidWNrZXQ/Lmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHRoaXMuaGFzTW9yZSA9IHRydWU7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UucGFnaW5nQ3Vyc29yID0gU3RyaW5nKHRoaXMuaW5jcmVtZW50UGFnaW5nQ3Vyc29ycygpKTtcclxuICAgICAgICB0aGlzLnNvcnRNZXNzYWdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5jcmVtZW50UGFnaW5nQ3Vyc29ycygpIHtcclxuICAgICAgICBpZiAodGhpcy5zb3VyY2Uuc29ydE9yZGVyICE9PSBDb21tZW50c09yZGVyLk5FV0VTVClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBtYXhQYWdpbmdDdXJzb3IgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGdyb3VwIG9mIFt0aGlzLm1lc3NhZ2VzLCB0aGlzLm9sZGVyTWVzc2FnZXMsIHRoaXMubmV3TWVzc2FnZXNdKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG1lc3NhZ2Ugb2YgZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhZ2luZ0N1cnNvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdpbmdDdXJzb3IgPSBOdW1iZXIobWVzc2FnZS5wYWdpbmdDdXJzb3IpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFnaW5nQ3Vyc29yID4gbWF4UGFnaW5nQ3Vyc29yKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhQYWdpbmdDdXJzb3IgPSBwYWdpbmdDdXJzb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wYWdpbmdDdXJzb3IgPSBTdHJpbmcocGFnaW5nQ3Vyc29yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1heFBhZ2luZ0N1cnNvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgdmlzaWJsZSBjb21tZW50cyB0byBiZSBmdWxseSBsb2FkZWQsIGluY2x1ZGluZyBhbGwgYXR0YWNobWVudHMuXHJcbiAgICAgKiBEb2luZyB0aGlzIHdpbGwgcHJldmVudCBsYXlvdXQgc2hpZnQgd2hlbiBzY3JvbGxpbmcgdG8gYSBzcGVjaWZpYyBjb21tZW50LlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yQWxsQ29tbWVudHNUb0xvYWQoKSB7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDEwMCkpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc291cmNlTG9hZGVkO1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuY29tbWVudHMubWFwKHggPT4geC53YWl0Rm9yTG9hZCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0TWVzc2FnZXMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBzb3J0ZXI6IChhOiBDaGF0TWVzc2FnZSwgYjogQ2hhdE1lc3NhZ2UpID0+IG51bWJlcjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlLnNvcnRPcmRlciA9PT0gQ29tbWVudHNPcmRlci5MSUtFUylcclxuICAgICAgICAgICAgc29ydGVyID0gKGEsIGIpID0+IGIubGlrZXMgLSBhLmxpa2VzO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc291cmNlLnNvcnRPcmRlciA9PT0gQ29tbWVudHNPcmRlci5ORVdFU1QpXHJcbiAgICAgICAgICAgIHNvcnRlciA9IChhLCBiKSA9PiAoYi5zZW50QXQgLSBhLnNlbnRBdCkgKiAodGhpcy5uZXdlc3RMYXN0ID8gLTEgOiAxKTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLnNvdXJjZS5zb3J0T3JkZXIgPT09IENvbW1lbnRzT3JkZXIuT0xERVNUKVxyXG4gICAgICAgICAgICBzb3J0ZXIgPSAoYSwgYikgPT4gKGEuc2VudEF0IC0gYi5zZW50QXQpICogKHRoaXMubmV3ZXN0TGFzdCA/IC0xIDogMSk7XHJcblxyXG4gICAgICAgIHRoaXMubWVzc2FnZXMuc29ydChzb3J0ZXIpO1xyXG4gICAgICAgIHRoaXMub2xkZXJNZXNzYWdlcy5zb3J0KHNvcnRlcik7XHJcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlcy5zb3J0KHNvcnRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlUmVjZWl2ZWQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNTY3JvbGxlZFRvTGF0ZXN0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlQ29udGFpbmVyKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5tZXNzYWdlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFNjcm9sbCA9IGVsLnNjcm9sbFRvcDtcclxuICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBlbC5zY3JvbGxIZWlnaHQgLSBlbC5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2Nyb2xsID4gY3VycmVudFRvdGFsIC0gMTA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VudChtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuYWRkTWVzc2FnZShtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VDb250YWluZXIpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb0xhdGVzdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbFRvTGF0ZXN0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5tZXNzYWdlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcgfSk7XHJcbiAgICAgICAgLy9lbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNjcm9sbFRvQ29tbWVudChjb21tZW50SWQ6IENoYXRNZXNzYWdlWydpZCddKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgXHJcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWxsQ29tbWVudHNUb0xvYWQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuZ2V0RWxlbWVudEZvckNvbW1lbnQoY29tbWVudElkKTtcclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgICBjb21tZW50LnNjcm9sbEludG9WaWV3KHtcclxuICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEVsZW1lbnRGb3JDb21tZW50KGNvbW1lbnRJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1jb21tZW50LWlkPVwiJHtjb21tZW50SWR9XCJdYCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWVudGlvbnNNZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50VXNlcilcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlLmluY2x1ZGVzKGBAJHt0aGlzLmN1cnJlbnRVc2VyLnVzZXJuYW1lfWApKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJiYW50YS1tZXNzYWdlLWNvbnRhaW5lclwiICNtZXNzYWdlQ29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtYmVmb3JlXVwiPjwvbmctY29udGVudD5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFudGEtdG9wLXN0aWNreVwiPlxyXG4gICAgICAgIEBpZiAoIW5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgIG1hdC1idXR0b24gXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJhbnRhLW5hdlwiIFxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnZpc2libGVdPVwic2hvdWxkU2hvd05ld01lc3NhZ2VJbmRpY2F0b3JcIiBcclxuICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93TmV3ZXN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZpbGVfdXBsb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIE5ld2VzdFxyXG4gICAgICAgICAgICAgICAgQGlmIChoZWxkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRcIj57eyBoZWxkTWVzc2FnZXMubGVuZ3RoIHwgbnVtYmVyIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJwYWdlclwiIChjbGljayk9XCJzaG93UHJldmlvdXMoKVwiIFtjbGFzcy52aXNpYmxlXT1cInNob3VsZFNob3dQcmV2aW91c1wiIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdNb3JlXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmV4cGFuZF9sZXNzPC9tYXQtaWNvbj5cclxuICAgICAgICB7eyBwcmV2aW91c0xhYmVsIH19XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICBAZm9yIChtZXNzYWdlIG9mIG1lc3NhZ2VzOyB0cmFjayBtZXNzYWdlLmlkKSB7XHJcbiAgICAgICAgQGlmICghbWVzc2FnZS5oaWRkZW4pIHtcclxuICAgICAgICAgICAgPGJhbnRhLWNvbW1lbnRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJicmV2aWF0ZWRcIlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBbY3VzdG9tTWVudUl0ZW1zXT1cImN1c3RvbU1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgIFttaW5lXT1cImN1cnJlbnRVc2VyPy5pZCA9PT0gbWVzc2FnZS51c2VyPy5pZFwiXHJcbiAgICAgICAgICAgICAgICBbcGVybWlzc2lvbnNdPVwic291cmNlPy5wZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgICAgICBbc2hvd1JlcGx5QWN0aW9uXT1cImFsbG93UmVwbGllc1wiXHJcbiAgICAgICAgICAgICAgICBbZWRpdGluZ109XCJtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmdcIlxyXG4gICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwic291cmNlPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZUNsaWNrZWQgPSB0cnVlXCJcclxuICAgICAgICAgICAgICAgIChlZGl0U3RhcnRlZCk9XCJzdGFydEVkaXRpbmcobWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgKGRlbGV0ZWQpPVwiZGVsZXRlTWVzc2FnZShtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAoZWRpdEVuZGVkKT1cIm1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIChlZGl0ZWQpPVwic2F2ZUVkaXQobWVzc2FnZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAodXNlclNlbGVjdGVkKT1cInNlbGVjdE1lc3NhZ2VVc2VyKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgIChhdmF0YXJTZWxlY3RlZCk9XCJzZWxlY3RBdmF0YXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAodXNlcm5hbWVTZWxlY3RlZCk9XCJzZWxlY3RVc2VybmFtZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChsaWtlZCk9XCJsaWtlTWVzc2FnZShtZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAodW5saWtlZCk9XCJ1bmxpa2VNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RNZXNzYWdlKG1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgIChzaGFyZWQpPVwic2hhcmVkTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYW50YS1pbmxpbmUtcmVwbGllcy1jb250YWluZXJcIiAqbmdJZj1cInNlbGVjdGVkTWVzc2FnZSA9PT0gbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLmlubGluZS1yZXBsaWVzXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICB9IEBlbXB0eSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJhbnRhLWVtcHR5LXN0YXRlXCIgKm5nSWY9XCJzaG93RW1wdHlTdGF0ZVwiPlxyXG4gICAgICAgICAgICBCZSB0aGUgZmlyc3QgdG8gY29tbWVudCFcclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJwYWdlclwiIChjbGljayk9XCJzaG93TmV4dCgpXCIgW2NsYXNzLnZpc2libGVdPVwic2hvdWxkU2hvd05leHRcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nTW9yZVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgICAge3sgbmV4dExhYmVsIH19XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFudGEtbmF2LXBvaW50IGJhbnRhLWJvdHRvbS1zdGlja3lcIj5cclxuICAgICAgICBAaWYgKG5ld2VzdExhc3QpIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCIxMFwiIG1hdEJhZGdlT3ZlcmxhcD1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIG1hdEJhZGdlUG9zaXRpb249XCJhZnRlclwiIG1hdEJhZGdlU2l6ZT1cImxhcmdlXCIgXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJiYW50YS1uYXZcIiBcclxuICAgICAgICAgICAgICAgIFtjbGFzcy52aXNpYmxlXT1cInNob3VsZFNob3dOZXdNZXNzYWdlSW5kaWNhdG9yXCIgXHJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd05ld2VzdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maWxlX2Rvd25sb2FkPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIE5ld2VzdFxyXG4gICAgICAgICAgICAgICAgQGlmIChoZWxkTWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRcIj57eyBoZWxkTWVzc2FnZXMubGVuZ3RoIHwgbnVtYmVyIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFudGEtbG9hZGluZy1tb3JlXCIgKm5nSWY9XCJpc0xvYWRpbmdNb3JlXCI+XHJcbiAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICBAaWYgKHNob3dEZWJ1Zykge1xyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogIzY2NlwiPlxyXG4gICAgICAgICAgICAoe3sgcHJldmlvdXNNZXNzYWdlcy5sZW5ndGggfX0gLi4ge3sgbWVzc2FnZXMubGVuZ3RoIH19IC4uIHt7IG5leHRNZXNzYWdlcy5sZW5ndGggfX0pXHJcblxyXG4gICAgICAgICAgICBkaXI9e3tuZXdlc3RMYXN0ID8gJy0xJyA6ICcxJ319XHJcbiAgICAgICAgICAgIHY9e3ttYXhWaXNpYmxlTWVzc2FnZXN9fSwgTT17e21heE1lc3NhZ2VzfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgIH1cclxuXHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCI6bm90KFtkYXRhLWJlZm9yZV0pOm5vdCguaW5saW5lLXJlcGxpZXMpXCI+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuIl19
|
package/fesm2022/banta-sdk.mjs
CHANGED
|
@@ -7587,6 +7587,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
7587
7587
|
args: ['class.visible']
|
|
7588
7588
|
}] } });
|
|
7589
7589
|
|
|
7590
|
+
const DEFAULT_MAX_MESSAGES = 2000;
|
|
7591
|
+
const DEFAULT_MAX_VISIBLE_MESSAGES = 200;
|
|
7590
7592
|
class CommentViewComponent {
|
|
7591
7593
|
constructor(backend, elementRef) {
|
|
7592
7594
|
this.backend = backend;
|
|
@@ -7606,7 +7608,7 @@ class CommentViewComponent {
|
|
|
7606
7608
|
* While this is called "new" messages, it really represents the messages that would be visible *at the beginning
|
|
7607
7609
|
* of the sort order*, which can be flipped by the newestLast feature (used for replies mode).
|
|
7608
7610
|
*
|
|
7609
|
-
* So, when newestLast is false, regardless of the current sortOrder, newMessages are conceptually
|
|
7611
|
+
* So, when newestLast is false (top-level comments), regardless of the current sortOrder, newMessages are conceptually
|
|
7610
7612
|
* *above* the visible set of messages.
|
|
7611
7613
|
*
|
|
7612
7614
|
* When newestLast is true (as in replies mode), regardless of the current sortOrder, newMessages are conceptually
|
|
@@ -7624,10 +7626,6 @@ class CommentViewComponent {
|
|
|
7624
7626
|
* *above* the visible set of messages.
|
|
7625
7627
|
*/
|
|
7626
7628
|
this.olderMessages = [];
|
|
7627
|
-
//#endregion
|
|
7628
|
-
//#region Inputs
|
|
7629
|
-
this.maxMessages = 2000;
|
|
7630
|
-
this.maxVisibleMessages = 200;
|
|
7631
7629
|
this.newestLast = false;
|
|
7632
7630
|
this.holdNewMessages = false;
|
|
7633
7631
|
this.showEmptyState = true;
|
|
@@ -7667,6 +7665,10 @@ class CommentViewComponent {
|
|
|
7667
7665
|
set source(value) { this.setSource(value); }
|
|
7668
7666
|
get previousMessages() { return this.newestLast ? this.olderMessages : this.newMessages; }
|
|
7669
7667
|
get nextMessages() { return this.newestLast ? this.newMessages : this.olderMessages; }
|
|
7668
|
+
set maxMessages(value) { this._maxMessages = value; }
|
|
7669
|
+
get maxMessages() { return this._maxMessages ?? DEFAULT_MAX_MESSAGES; }
|
|
7670
|
+
set maxVisibleMessages(value) { this._maxVisibleMessages = value; }
|
|
7671
|
+
get maxVisibleMessages() { return this._maxVisibleMessages ?? DEFAULT_MAX_VISIBLE_MESSAGES; }
|
|
7670
7672
|
get comments() { return Array.from(this.commentsQuery); }
|
|
7671
7673
|
//#endregion
|
|
7672
7674
|
/**
|
|
@@ -7689,16 +7691,15 @@ class CommentViewComponent {
|
|
|
7689
7691
|
console.error(`Error while loading message in context: Failed to find message ${message.id}, maybe it was deleted!`);
|
|
7690
7692
|
return false;
|
|
7691
7693
|
}
|
|
7692
|
-
let pageSize = this.maxVisibleMessages;
|
|
7693
7694
|
let items = [].concat(this.olderMessages, this.messages, this.newMessages);
|
|
7694
7695
|
let index = items.findIndex(x => x.id === message.id);
|
|
7695
7696
|
if (index < 0) {
|
|
7696
7697
|
console.error(`Error while loading message in context: Message was not present in message list!`);
|
|
7697
7698
|
return false;
|
|
7698
7699
|
}
|
|
7699
|
-
let startIndex = Math.max(0, index -
|
|
7700
|
+
let startIndex = Math.max(0, index - this.maxVisibleMessages / 2);
|
|
7700
7701
|
this.newMessages = items.splice(0, startIndex);
|
|
7701
|
-
this.messages = items.splice(0,
|
|
7702
|
+
this.messages = items.splice(0, this.maxVisibleMessages);
|
|
7702
7703
|
this.olderMessages = items;
|
|
7703
7704
|
this.isViewingMore = true;
|
|
7704
7705
|
}
|
|
@@ -7936,12 +7937,14 @@ class CommentViewComponent {
|
|
|
7936
7937
|
return this.previousMessages.length > 0;
|
|
7937
7938
|
}
|
|
7938
7939
|
get pageSize() {
|
|
7939
|
-
return Math.min(20, this.maxVisibleMessages);
|
|
7940
|
+
return Math.min(20, this.maxVisibleMessages || 20);
|
|
7940
7941
|
}
|
|
7941
7942
|
async showPrevious() {
|
|
7942
7943
|
this.isViewingMore = true;
|
|
7943
7944
|
let nextPageSize = this.pageSize;
|
|
7944
7945
|
this.isLoadingMore = false;
|
|
7946
|
+
if (isNaN(nextPageSize))
|
|
7947
|
+
throw new Error(`Not safe to load more with NaN page size`);
|
|
7945
7948
|
if (this.previousMessages.length > 0) {
|
|
7946
7949
|
const storedMessages = this.previousMessages.splice(Math.max(0, this.previousMessages.length - nextPageSize), nextPageSize);
|
|
7947
7950
|
this.messages = [...storedMessages, ...this.messages];
|
|
@@ -8009,6 +8012,8 @@ class CommentViewComponent {
|
|
|
8009
8012
|
async showNext() {
|
|
8010
8013
|
this.isViewingMore = true;
|
|
8011
8014
|
let nextPageSize = this.pageSize;
|
|
8015
|
+
if (isNaN(nextPageSize))
|
|
8016
|
+
throw new Error(`Not safe to load more with NaN page size`);
|
|
8012
8017
|
this.isLoadingMore = false;
|
|
8013
8018
|
if (this.nextMessages.length > 0) {
|
|
8014
8019
|
const storedMessages = this.nextMessages.splice(0, nextPageSize);
|
|
@@ -8049,6 +8054,8 @@ class CommentViewComponent {
|
|
|
8049
8054
|
async showMore() {
|
|
8050
8055
|
this.isViewingMore = true;
|
|
8051
8056
|
let nextPageSize = this.pageSize;
|
|
8057
|
+
if (isNaN(nextPageSize))
|
|
8058
|
+
throw new Error(`Not safe to load more with NaN page size`);
|
|
8052
8059
|
this.isLoadingMore = false;
|
|
8053
8060
|
if (this.olderMessages.length > 0) {
|
|
8054
8061
|
const storedMessages = this.olderMessages.splice(0, nextPageSize);
|
|
@@ -8092,14 +8099,20 @@ class CommentViewComponent {
|
|
|
8092
8099
|
// Extract the messages that do not fit in the maxVisibleMessages buffer.
|
|
8093
8100
|
if (this.messages.length > this.maxVisibleMessages) {
|
|
8094
8101
|
let overflow = [];
|
|
8095
|
-
|
|
8102
|
+
// Move overflowing messages into newMessages.
|
|
8103
|
+
// Regardless of the order (newestLast), newMessages represents the direction that is being loaded,
|
|
8104
|
+
// since it's definition depends on that order.
|
|
8105
|
+
if (this.newestLast) {
|
|
8096
8106
|
overflow = this.messages.splice(this.maxVisibleMessages, this.messages.length);
|
|
8097
|
-
|
|
8107
|
+
this.newMessages = overflow.concat(this.newMessages);
|
|
8108
|
+
this.newMessages.splice(this.maxMessages - this.maxVisibleMessages, this.newMessages.length);
|
|
8109
|
+
}
|
|
8110
|
+
else {
|
|
8098
8111
|
overflow = this.messages.splice(0, this.messages.length - this.maxVisibleMessages);
|
|
8099
|
-
|
|
8100
|
-
|
|
8101
|
-
|
|
8102
|
-
|
|
8112
|
+
this.newMessages.push(...overflow);
|
|
8113
|
+
if (this.newMessages.length > this.maxMessages - this.maxVisibleMessages)
|
|
8114
|
+
this.newMessages.splice(0, this.newMessages.length - (this.maxMessages - this.maxVisibleMessages));
|
|
8115
|
+
}
|
|
8103
8116
|
}
|
|
8104
8117
|
}
|
|
8105
8118
|
addMessage(message) {
|