cax-design-system 2.7.9 → 2.7.11

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.
@@ -11,15 +11,25 @@ import * as i8 from "cax-design-system/overlay";
11
11
  import * as i9 from "cax-design-system/avatar";
12
12
  export class CommentboxComponent {
13
13
  sanitizer;
14
- comments = [];
14
+ ngZone;
15
+ _comments = [];
16
+ set comments(value) {
17
+ this._comments = Array.isArray(value) ? value : [];
18
+ this.recomputeGroupedComments();
19
+ }
20
+ get comments() {
21
+ return this._comments;
22
+ }
15
23
  mentionSuggestions = [];
16
24
  hashtagSuggestions = [];
17
25
  sidebarHeader;
18
26
  isAdmin = true;
27
+ placeholder = 'Comment or mention others with @, ‘#’ for columns';
19
28
  commentAdded = new EventEmitter();
20
29
  fileSelected = new EventEmitter();
21
30
  fileDownload = new EventEmitter();
22
31
  visibleChange = new EventEmitter();
32
+ onSidebarHide = new EventEmitter();
23
33
  newComment = '';
24
34
  isMentioning = false;
25
35
  isHashtagging = false;
@@ -37,6 +47,7 @@ export class CommentboxComponent {
37
47
  selectedFiles = [];
38
48
  selectedFilesMap = new Map();
39
49
  today = new Date();
50
+ groupedCommentsCache = [];
40
51
  overlayVisible = false;
41
52
  filesOverlayVisible = false;
42
53
  overlayPosition = { top: 0, left: 0 };
@@ -46,23 +57,37 @@ export class CommentboxComponent {
46
57
  isUserScrolling = false;
47
58
  // Add new property for mutation observer
48
59
  observer;
49
- constructor(sanitizer) {
60
+ scrollQueued = false;
61
+ constructor(sanitizer, ngZone) {
50
62
  this.sanitizer = sanitizer;
63
+ this.ngZone = ngZone;
51
64
  this.updateCurrentDate();
52
- this.dateUpdateInterval = setInterval(() => this.updateCurrentDate(), 60000);
53
- // Initialize observer
54
- this.observer = new MutationObserver(() => this.forceScrollToBottom());
65
+ // Run the interval outside Angular to avoid frequent change detection in docs/canvas
66
+ this.ngZone.runOutsideAngular(() => {
67
+ this.dateUpdateInterval = setInterval(() => {
68
+ this.ngZone.run(() => this.updateCurrentDate());
69
+ }, 60000);
70
+ });
55
71
  }
56
72
  ngAfterViewInit() {
57
73
  setTimeout(() => {
58
74
  this.forceScrollToBottom();
59
75
  }, 100);
60
- // Set up observer to auto-scroll when content changes
76
+ // Set up observer to auto-scroll when content changes (outside Angular)
61
77
  if (this.commentsList?.nativeElement) {
62
- this.observer.observe(this.commentsList.nativeElement, {
63
- childList: true,
64
- subtree: true,
65
- characterData: true
78
+ this.ngZone.runOutsideAngular(() => {
79
+ this.observer = new MutationObserver(() => {
80
+ if (this.scrollQueued)
81
+ return;
82
+ this.scrollQueued = true;
83
+ requestAnimationFrame(() => {
84
+ this.forceScrollToBottom();
85
+ this.scrollQueued = false;
86
+ });
87
+ });
88
+ this.observer.observe(this.commentsList.nativeElement, {
89
+ childList: true
90
+ });
66
91
  });
67
92
  }
68
93
  }
@@ -121,21 +146,19 @@ export class CommentboxComponent {
121
146
  }
122
147
  // Always scroll to bottom immediately
123
148
  this.scrollToBottom(true);
149
+ this.recomputeGroupedComments();
124
150
  }
125
151
  }
126
152
  forceScrollToBottom() {
127
153
  if (!this.commentsList?.nativeElement)
128
154
  return;
129
155
  const element = this.commentsList.nativeElement;
130
- requestAnimationFrame(() => {
131
- try {
132
- // Force immediate scroll
133
- element.scrollTop = element.scrollHeight;
134
- }
135
- catch (err) {
136
- console.error('Scroll error:', err);
137
- }
138
- });
156
+ try {
157
+ element.scrollTop = element.scrollHeight;
158
+ }
159
+ catch {
160
+ // no-op
161
+ }
139
162
  }
140
163
  scrollToBottom(force = false) {
141
164
  if (force) {
@@ -145,28 +168,20 @@ export class CommentboxComponent {
145
168
  if (!this.commentsList?.nativeElement)
146
169
  return;
147
170
  const element = this.commentsList.nativeElement;
148
- // Use double RAF for reliable scrolling
171
+ // Single RAF to avoid nested scheduling overhead in Storybook
149
172
  requestAnimationFrame(() => {
150
- requestAnimationFrame(() => {
151
- try {
152
- // Force immediate scroll for new comments
153
- element.scrollTop = element.scrollHeight;
154
- // Use smooth scrolling after initial jump
155
- element.scrollTo({
156
- top: element.scrollHeight,
157
- behavior: 'smooth'
158
- });
159
- }
160
- catch (err) {
161
- element.scrollTop = element.scrollHeight;
162
- }
163
- });
173
+ try {
174
+ element.scrollTop = element.scrollHeight;
175
+ element.scrollTo({ top: element.scrollHeight });
176
+ }
177
+ catch {
178
+ element.scrollTop = element.scrollHeight;
179
+ }
164
180
  });
165
181
  }
166
182
  set visible(value) {
167
183
  if (this._visible !== value) {
168
184
  this._visible = value;
169
- this.visibleChange.emit(this._visible);
170
185
  if (this._visible) {
171
186
  this.shouldAutoScroll = true;
172
187
  setTimeout(() => this.scrollToBottom(true), 300);
@@ -178,11 +193,30 @@ export class CommentboxComponent {
178
193
  }
179
194
  _visible = false;
180
195
  toggleComments() {
181
- this.visible = !this.visible;
196
+ if (this._visible) {
197
+ this.hideComments();
198
+ }
199
+ else {
200
+ this.showComments();
201
+ }
202
+ }
203
+ showComments() {
204
+ if (!this._visible) {
205
+ this._visible = true;
206
+ this.visibleChange.emit(true);
207
+ this.shouldAutoScroll = true;
208
+ setTimeout(() => this.scrollToBottom(true), 300);
209
+ }
210
+ }
211
+ hideComments() {
212
+ if (this._visible) {
213
+ this._visible = false;
214
+ this.visibleChange.emit(false);
215
+ this.onSidebarHide.emit();
216
+ }
182
217
  }
183
- onSidebarHide() {
184
- this._visible = false;
185
- this.visibleChange.emit(false);
218
+ handleSidebarHide() {
219
+ this.hideComments();
186
220
  }
187
221
  onDocumentClick(event) {
188
222
  const target = event.target;
@@ -459,12 +493,11 @@ export class CommentboxComponent {
459
493
  onFileDownload(file) {
460
494
  this.fileDownload.emit(file);
461
495
  }
462
- get groupedComments() {
463
- return this.comments
464
- .reduce((groups, comment) => {
496
+ recomputeGroupedComments() {
497
+ const groups = this._comments.reduce((acc, comment) => {
465
498
  const commentDate = new Date(comment.date);
466
499
  commentDate.setHours(0, 0, 0, 0);
467
- const existingGroup = groups.find((group) => {
500
+ const existingGroup = acc.find((group) => {
468
501
  const groupDate = new Date(group.date);
469
502
  groupDate.setHours(0, 0, 0, 0);
470
503
  return groupDate.getTime() === commentDate.getTime();
@@ -473,14 +506,11 @@ export class CommentboxComponent {
473
506
  existingGroup.items.push(comment);
474
507
  }
475
508
  else {
476
- groups.push({
477
- date: commentDate,
478
- items: [comment]
479
- });
509
+ acc.push({ date: commentDate, items: [comment] });
480
510
  }
481
- return groups;
482
- }, [])
483
- .sort((a, b) => a.date.getTime() - b.date.getTime());
511
+ return acc;
512
+ }, []);
513
+ this.groupedCommentsCache = groups.sort((a, b) => a.date.getTime() - b.date.getTime());
484
514
  }
485
515
  getShortFileName(filename) {
486
516
  if (filename.length <= 4)
@@ -492,13 +522,13 @@ export class CommentboxComponent {
492
522
  const namePart = filename.substring(0, lastDotIndex !== -1 ? lastDotIndex : filename.length);
493
523
  return namePart.substring(0, 4) + '..' + extension;
494
524
  }
495
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CommentboxComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
496
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: CommentboxComponent, selector: "cax-comments", inputs: { comments: "comments", mentionSuggestions: "mentionSuggestions", hashtagSuggestions: "hashtagSuggestions", sidebarHeader: "sidebarHeader", isAdmin: "isAdmin", visible: "visible" }, outputs: { commentAdded: "commentAdded", fileSelected: "fileSelected", fileDownload: "fileDownload", visibleChange: "visibleChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "suggestionPanel", first: true, predicate: ["suggestionPanel"], descendants: true }, { propertyName: "inputText", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "commentsList", first: true, predicate: ["commentsList"], descendants: true }, { propertyName: "countChip", first: true, predicate: ["countChip"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"visible\" class=\"cax-comments-wrapper\">\r\n \r\n <!-- <ng-template caxTemplate=\"content\"> -->\r\n <div class=\"cax-comments-container\">\r\n <div class=\"cax-comments-list\" #commentsList>\r\n <ng-container *ngFor=\"let group of groupedComments\">\r\n <div class=\"cax-date-header\">{{ formatDate(group.date) }}</div>\r\n <div\r\n class=\"cax-comment-item\"\r\n *ngFor=\"let comment of group.items; let i = index\"\r\n [ngClass]=\"{\r\n 'cax-user-comment': !comment.isAdmin,\r\n 'cax-admin-comment': comment.isAdmin,\r\n 'consecutive-message': i > 0 && comment.isAdmin === group.items[i-1].isAdmin && comment.sender === group.items[i-1].sender,\r\n 'new-sender': i > 0 && comment.sender !== group.items[i-1].sender,\r\n 'new-date': i === 0 && group.items.length > 0\r\n }\"\r\n >\r\n <!-- User Message (Left Aligned) -->\r\n <ng-container *ngIf=\"!comment.isAdmin\">\r\n <div class=\"cax-commentbox-avatar-container\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">\r\n <cax-avatar [label]=\"comment.sender?.substring(0, 2).toUpperCase() || 'U'\" [avatarSize]=\"'xs'\" [shape]=\"'circle'\" styleclass=\"cax-commentbox-avatar\"> </cax-avatar>\r\n </div>\r\n <div class=\"cax-comment-content\" [class.no-avatar]=\"i > 0 && group.items[i-1].sender === comment.sender\">\r\n <div class=\"cax-comment-sender\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">{{comment.sender}}</div>\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Admin Message (Right Aligned) -->\r\n <ng-container *ngIf=\"comment.isAdmin\">\r\n <div class=\"cax-comment-content admin\">\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- </ng-template> -->\r\n <cax-overlay #suggestionPanel [(visible)]=\"overlayVisible\" [appendTo]=\"inputText\" (onHide)=\"onSuggestionPanelHide()\" [styleClass]=\"'suggestion-panel'\">\r\n <div class=\"suggestion-list\">\r\n <div *ngFor=\"let item of filteredSuggestions; let i = index\" class=\"suggestion-item\" [ngClass]=\"{'selected': selectedSuggestionIndex === i}\" (click)=\"onSuggestionSelect(item)\" (mouseenter)=\"selectedSuggestionIndex = i\">\r\n <span class=\"suggestion-label\">{{item.name}}</span>\r\n <small class=\"suggestion-id\" *ngIf=\"currentTokenType === 'mention'\">{{item.id}}</small>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n <cax-overlay\r\n [(visible)]=\"filesOverlayVisible\"\r\n [appendTo]=\"countChip\"\r\n [showTransitionOptions]=\"'0.12s ease-out'\"\r\n [hideTransitionOptions]=\"'0.1s ease-in'\"\r\n [style]=\"{ width: '224px', right: '5%' }\"\r\n styleClass=\"files-list-overlay\"\r\n (onHide)=\"hideFilesOverlay()\"\r\n >\r\n <div class=\"files-overlay-content\">\r\n <div *ngFor=\"let file of selectedFiles.slice(4); let i = index\" class=\"file-item\">\r\n <span class=\"file-name\">{{getShortFileName(file.name)}}</span>\r\n <i class=\"cax cax-close-circle\" (click)=\"removeFile(i + 4)\"></i>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n\r\n <!-- <ng-template caxTemplate=\"footer\"> -->\r\n <div class=\"chat-footer\">\r\n <div class=\"selected-files\" *ngIf=\"selectedFiles.length > 0\">\r\n <cax-chip *ngFor=\"let file of selectedFiles.slice(0, 4); let i = index\" [label]=\"getShortFileName(file.name)\" [removable]=\"true\" [size]=\"'lg'\" (onRemove)=\"removeFile(i, true)\">\r\n <ng-template caxTemplate=\"content\">\r\n <i class=\"cax cax-paperclip\"></i>\r\n </ng-template>\r\n </cax-chip>\r\n <cax-chip #countChip *ngIf=\"selectedFiles.length > 4\" [label]=\"'+' + getOverflowCount()\" [size]=\"'lg'\" (mouseenter)=\"showFilesOverlay($event)\"> </cax-chip>\r\n </div>\r\n <div class=\"cax-chat-input-container\">\r\n <div class=\"input-wrapper\">\r\n <cax-inputtext\r\n [(ngModel)]=\"newComment\"\r\n [size]=\"'lg'\"\r\n [rightIcon]=\"true\"\r\n [clearIcon]=\"false\"\r\n [rightIconClass]=\"'cax cax-paperclip'\"\r\n [rightIconClickable]=\"true\"\r\n (rightIconClick)=\"onFileIconClick($event)\"\r\n placeholder=\"Comment or mention others with @, \u2018#\u2019 for columns\"\r\n (keyup)=\"handleKeyUp($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [class]=\"{'chat-input': true, 'admin-input': isAdminSender}\"\r\n [style]=\"{'border-radius': '8px', background: '#ffffff'}\"\r\n #inputText\r\n >\r\n </cax-inputtext>\r\n </div>\r\n\r\n <cax-button [icon]=\"'cax cax-plain'\" [severity]=\"'primary'\" [size]=\"'large'\" (click)=\"addComment()\" [disabled]=\"!newComment.trim() && selectedFiles.length === 0\" class=\"send-button\"> </cax-button>\r\n </div>\r\n\r\n <input #fileInput type=\"file\" (change)=\"onFileSelect($event)\" style=\"display: none\" accept=\"*/*\" multiple />\r\n </div>\r\n <!-- </ng-template> -->\r\n</div>\r\n", styles: ["@layer cax{.cax-comments-wrapper{width:100%;min-height:100%;display:flex;flex-direction:column}.cax-comments-list{display:flex;flex-direction:column;gap:4px;flex:1;overflow-y:auto;overflow-x:hidden;height:100%;padding-bottom:0;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}.cax-comments-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}.cax-comments-list::-webkit-scrollbar-track{background:transparent}.cax-comments-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}.cax-comment-item{display:flex;align-items:flex-end;max-width:85%;gap:4px}.cax-comment-item.consecutive-message{margin-top:0}.cax-comment-item.new-sender{margin-top:12px}.cax-comment-item.new-date{margin-top:0}.cax-user-comment{align-self:flex-start;display:flex;flex-direction:row;text-align:left}.cax-user-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-user-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 12px 0}.cax-user-comment .cax-comment-content.no-avatar{border-radius:12px;margin-left:25px}.cax-user-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-user-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-admin-comment{align-self:flex-end;display:flex;flex-direction:row;justify-content:flex-end;text-align:right}.cax-admin-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-admin-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 0;text-align:left}.cax-admin-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-admin-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-commentbox-avatar{width:32px;height:32px;border-radius:50%;margin:0 8px}.cax-comment-content{background:var(--white-100);border-radius:12px 12px 12px 0;padding:8px;max-width:100%;word-wrap:break-word;display:flex;flex-direction:column;box-shadow:0 2px 4px #0000000d}.cax-comment-content .cax-comment-text{font-weight:400;font-size:14px;line-height:20px}.cax-comment-content .cax-comment-text ::ng-deep .mention{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-text ::ng-deep .hashtag{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-file-attachment{margin-bottom:12px}.cax-file-attachment .file-item{display:flex;align-items:center;gap:12px;border-color:1px solid var(--neutral-150);padding:10px 16px;background:var(--neutral-75);border-radius:8px;cursor:pointer;margin-bottom:8px}.cax-file-attachment .file-item .file-details{display:flex;flex:1;align-items:center;gap:12px}.cax-file-attachment .file-item .file-name{color:var(--neutral-900);font-weight:500;font-size:14px;line-height:20px;flex:1;white-space:nowrap;overflow:hidden}.cax-file-attachment .file-item .file-size{color:var(--neutral-600);font-weight:400;font-size:12px;line-height:18px;margin-right:8px}.cax-file-attachment .file-item i{color:var(--neutral-900);font-size:1.1rem;margin-left:auto;order:2}.cax-file-attachment .file-item i.cax-download{cursor:pointer;transition:color .2s ease}.cax-file-attachment .file-item i.cax-download:hover{color:var(--primary-600)}.cax-file-attachment .file-item i.cax-download:active{color:var(--primary-700)}.cax-file-attachment .file-item:last-child{margin-bottom:0}.cax-file-attachment:last-child{margin-bottom:0}.cax-comment-date{font-weight:400;font-size:12px;line-height:18px;color:var(--neutral-600);align-self:flex-end}.cax-chat-input-container{display:flex;gap:.5rem}.cax-chat-input-container .chat-input{flex:1}.cax-chat-input-container .send-button{cursor:pointer}.input-wrapper{position:relative;flex:1;display:flex;flex-direction:column}.cax-date-header{text-align:center;font-size:12px;font-weight:500;line-height:18px;color:var(--neutral-700);background:var(--neutral-100);align-self:center;width:fit-content;padding:4px 12px;border-radius:4px;margin:11px 0;position:relative;z-index:1}.cax-date-header:first-child{margin-top:0}.cax-comments-container{display:flex;flex-direction:column;height:calc(100vh - 200px);overflow:hidden;position:relative;transform:translateZ(0);backface-visibility:hidden}.selected-files{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 0 5px;position:relative}.selected-files .cax-chip{background:var(--neutral-100)}.selected-files .cax-chip i{margin-right:.5rem}.selected-files .files-overlay{position:absolute;background:var(--white-100);border-radius:8px;box-shadow:0 4px 12px #00000026;width:300px;max-height:400px;z-index:1000;overflow:hidden;border:1px solid var(--neutral-200)}.selected-files .files-overlay .files-overlay-header{padding:12px 16px;font-weight:600;font-size:14px;border-bottom:1px solid var(--neutral-100);background:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content{max-height:350px;overflow-y:auto;padding:8px 0}.selected-files .files-overlay .files-overlay-content .file-item{display:flex;align-items:center;padding:8px 16px;transition:background-color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content .file-item i.cax-paperclip{color:var(--neutral-600);margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;transition:color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times:hover{color:var --error-500}.selected-files :deep(.file-chip){background:var(--neutral-50);border:1px solid var(--neutral-100)}.selected-files :deep(.file-chip) .file-details{display:flex;align-items:center;gap:8px}.selected-files :deep(.file-chip) i{color:var(--primary-500);margin-right:8px}.selected-files :deep(.file-chip) .file-name{font-weight:500}.selected-files :deep(.file-chip) .file-size{color:var(--neutral-600);font-size:.8rem}:host ::ng-deep .cax-sidebar{width:589px!important;border:1px solid var(--neutral-200)!important}:host ::ng-deep .cax-sidebar .cax-sidebar-content{display:flex;flex-direction:column;background:var(--neutral-25);padding:24px 8px!important}:host ::ng-deep .cax-sidebar .cax-sidebar-footer{padding:12px!important;background:var(--neutral-50);border-top:1px solid var(--neutral-200)}:host ::ng-deep .cax-sidebar .cax-sidebar-header{border-bottom:1px solid var(--neutral-200);background:var(--neutral-50);padding:16px 24px!important}:host ::ng-deep .cax-overlay{position:absolute;bottom:0!important;top:unset!important;left:unset!important}:host ::ng-deep .suggestion-panel{background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;margin-left:20px;width:224px;border-radius:8px;border:1px solid var(--neutral-200)}:host ::ng-deep .suggestion-panel .suggestion-list{max-height:200px;overflow-y:auto;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item{padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;transition:background-color .2s ease;align-items:center}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item.selected{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-label{font-weight:500}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-id{color:var(--neutral-600);font-size:.85em}:host ::ng-deep .suggestion-panel .suggestion-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}:host ::ng-deep .chat-footer{position:sticky;bottom:0;z-index:10}:host ::ng-deep .cax-chat-input-container .chat-input .cax-paperclip{color:var(--neutral-900)!important}:host ::ng-deep .files-list-overlay{border:1px solid var(--neutral-200);background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;width:224px;border-radius:8px}:host ::ng-deep .files-list-overlay.cax-overlay{transform-origin:right center!important}:host ::ng-deep .files-list-overlay .files-overlay-content{max-height:200px;overflow-y:auto}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item{transition:background-color .2s ease;padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;font-weight:500;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;border:1.1rem solid var(--neutral-200);transition:color .2s ease}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.InputTextComponent, selector: "cax-inputtext", inputs: ["value", "placeholder", "disabled", "maxlength", "successText", "errorText", "showLabel", "leftIcon", "rightIcon", "rightIconClickable", "clearIcon", "label", "iconPath", "disabledIcon", "showIcon", "iconClass", "leftIconClass", "rightIconClass", "invalid", "required", "style", "size", "styleClass"], outputs: ["valueChange", "rightIconClick"] }, { kind: "component", type: i5.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i6.CaxTemplate, selector: "[caxTemplate]", inputs: ["type", "caxTemplate"] }, { kind: "component", type: i7.Chip, selector: "cax-chip", inputs: ["label", "icon", "image", "alt", "style", "styleClass", "removable", "removeIcon", "size", "severity"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: i8.Overlay, selector: "cax-overlay", inputs: ["visible", "mode", "style", "styleClass", "contentStyle", "contentStyleClass", "target", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "listener", "responsive", "options"], outputs: ["visibleChange", "onBeforeShow", "onShow", "onBeforeHide", "onHide", "onAnimationStart", "onAnimationDone"] }, { kind: "component", type: i9.Avatar, selector: "cax-avatar", inputs: ["label", "icon", "image", "avatarSize", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
525
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CommentboxComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
526
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: CommentboxComponent, selector: "cax-comments", inputs: { comments: "comments", mentionSuggestions: "mentionSuggestions", hashtagSuggestions: "hashtagSuggestions", sidebarHeader: "sidebarHeader", isAdmin: "isAdmin", placeholder: "placeholder", visible: "visible" }, outputs: { commentAdded: "commentAdded", fileSelected: "fileSelected", fileDownload: "fileDownload", visibleChange: "visibleChange", onSidebarHide: "onSidebarHide" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "suggestionPanel", first: true, predicate: ["suggestionPanel"], descendants: true }, { propertyName: "inputText", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "commentsList", first: true, predicate: ["commentsList"], descendants: true }, { propertyName: "countChip", first: true, predicate: ["countChip"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"visible\" class=\"cax-comments-wrapper\">\r\n <!-- <ng-template caxTemplate=\"content\"> -->\r\n <div class=\"cax-comments-container\">\r\n <div class=\"cax-comments-list\" #commentsList>\r\n <ng-container *ngFor=\"let group of groupedCommentsCache\">\r\n <div class=\"cax-date-header\">{{ formatDate(group.date) }}</div>\r\n <div\r\n class=\"cax-comment-item\"\r\n *ngFor=\"let comment of group.items; let i = index\"\r\n [ngClass]=\"{\r\n 'cax-user-comment': !comment.isAdmin,\r\n 'cax-admin-comment': comment.isAdmin,\r\n 'consecutive-message': i > 0 && comment.isAdmin === group.items[i-1].isAdmin && comment.sender === group.items[i-1].sender,\r\n 'new-sender': i > 0 && comment.sender !== group.items[i-1].sender,\r\n 'new-date': i === 0 && group.items.length > 0\r\n }\"\r\n >\r\n <!-- User Message (Left Aligned) -->\r\n <ng-container *ngIf=\"!comment.isAdmin\">\r\n <div class=\"cax-commentbox-avatar-container\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">\r\n <cax-avatar [label]=\"comment.sender?.substring(0, 2).toUpperCase() || 'U'\" [avatarSize]=\"'xs'\" [shape]=\"'circle'\" styleclass=\"cax-commentbox-avatar\"> </cax-avatar>\r\n </div>\r\n <div class=\"cax-comment-content\" [class.no-avatar]=\"i > 0 && group.items[i-1].sender === comment.sender\">\r\n <div class=\"cax-comment-sender\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">{{comment.sender}}</div>\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Admin Message (Right Aligned) -->\r\n <ng-container *ngIf=\"comment.isAdmin\">\r\n <div class=\"cax-comment-content admin\">\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- </ng-template> -->\r\n <cax-overlay #suggestionPanel [(visible)]=\"overlayVisible\" [appendTo]=\"inputText\" (onHide)=\"onSuggestionPanelHide()\" [styleClass]=\"'suggestion-panel'\">\r\n <div class=\"suggestion-list\">\r\n <div *ngFor=\"let item of filteredSuggestions; let i = index\" class=\"suggestion-item\" [ngClass]=\"{'selected': selectedSuggestionIndex === i}\" (click)=\"onSuggestionSelect(item)\" (mouseenter)=\"selectedSuggestionIndex = i\">\r\n <span class=\"suggestion-label\">{{item.name}}</span>\r\n <small class=\"suggestion-id\" *ngIf=\"currentTokenType === 'mention'\">{{item.id}}</small>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n <cax-overlay\r\n [(visible)]=\"filesOverlayVisible\"\r\n [appendTo]=\"countChip\"\r\n [showTransitionOptions]=\"'0.12s ease-out'\"\r\n [hideTransitionOptions]=\"'0.1s ease-in'\"\r\n [style]=\"{ width: '224px', right: '5%' }\"\r\n styleClass=\"files-list-overlay\"\r\n (onHide)=\"hideFilesOverlay()\"\r\n >\r\n <div class=\"files-overlay-content\">\r\n <div *ngFor=\"let file of selectedFiles.slice(4); let i = index\" class=\"file-item\">\r\n <span class=\"file-name\">{{getShortFileName(file.name)}}</span>\r\n <i class=\"cax cax-close-circle\" (click)=\"removeFile(i + 4)\"></i>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n\r\n <!-- <ng-template caxTemplate=\"footer\"> -->\r\n <div class=\"chat-footer\">\r\n <div class=\"selected-files\" *ngIf=\"selectedFiles.length > 0\">\r\n <cax-chip *ngFor=\"let file of selectedFiles.slice(0, 4); let i = index\" [label]=\"getShortFileName(file.name)\" [removable]=\"true\" [size]=\"'lg'\" (onRemove)=\"removeFile(i, true)\">\r\n <ng-template caxTemplate=\"content\">\r\n <i class=\"cax cax-paperclip\"></i>\r\n </ng-template>\r\n </cax-chip>\r\n <cax-chip #countChip *ngIf=\"selectedFiles.length > 4\" [label]=\"'+' + getOverflowCount()\" [size]=\"'lg'\" (mouseenter)=\"showFilesOverlay($event)\"> </cax-chip>\r\n </div>\r\n <div class=\"cax-chat-input-container\">\r\n <div class=\"input-wrapper\">\r\n <cax-inputtext\r\n [(ngModel)]=\"newComment\"\r\n [size]=\"'lg'\"\r\n [rightIcon]=\"true\"\r\n [clearIcon]=\"false\"\r\n [rightIconClass]=\"'cax cax-paperclip'\"\r\n [rightIconClickable]=\"true\"\r\n (rightIconClick)=\"onFileIconClick($event)\"\r\n [placeholder]=\"placeholder\"\r\n (keyup)=\"handleKeyUp($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [ngClass]=\"{'chat-input': true, 'admin-input': isAdmin}\"\r\n [style]=\"{'border-radius': '8px', background: '#ffffff'}\"\r\n #inputText\r\n >\r\n </cax-inputtext>\r\n </div>\r\n\r\n <cax-button [icon]=\"'cax cax-plain'\" [severity]=\"'primary'\" [size]=\"'large'\" (click)=\"addComment()\" [disabled]=\"!newComment.trim() && selectedFiles.length === 0\" class=\"send-button\"> </cax-button>\r\n </div>\r\n\r\n <input #fileInput type=\"file\" (change)=\"onFileSelect($event)\" style=\"display: none\" accept=\"*/*\" multiple />\r\n </div>\r\n <!-- </ng-template> -->\r\n</div>\r\n", styles: ["@layer cax{.cax-comments-wrapper{width:100%;min-height:100%;display:flex;flex-direction:column}.cax-comments-list{display:flex;flex-direction:column;gap:4px;flex:1;overflow-y:auto;overflow-x:hidden;height:100%;padding-bottom:0;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}.cax-comments-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}.cax-comments-list::-webkit-scrollbar-track{background:transparent}.cax-comments-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}.cax-comment-item{display:flex;align-items:flex-end;max-width:85%;gap:4px}.cax-comment-item.consecutive-message{margin-top:0}.cax-comment-item.new-sender{margin-top:12px}.cax-comment-item.new-date{margin-top:0}.cax-user-comment{align-self:flex-start;display:flex;flex-direction:row;text-align:left}.cax-user-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-user-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 12px 0}.cax-user-comment .cax-comment-content.no-avatar{border-radius:12px;margin-left:25px}.cax-user-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-user-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-admin-comment{align-self:flex-end;display:flex;flex-direction:row;justify-content:flex-end;text-align:right}.cax-admin-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-admin-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 0;text-align:left}.cax-admin-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-admin-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-commentbox-avatar{width:32px;height:32px;border-radius:50%;margin:0 8px}.cax-comment-content{background:var(--white-100);border-radius:12px 12px 12px 0;padding:8px;max-width:100%;word-wrap:break-word;display:flex;flex-direction:column;box-shadow:0 2px 4px #0000000d}.cax-comment-content .cax-comment-text{font-weight:400;font-size:14px;line-height:20px}.cax-comment-content .cax-comment-text ::ng-deep .mention{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-text ::ng-deep .hashtag{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-file-attachment{margin-bottom:12px}.cax-file-attachment .file-item{display:flex;align-items:center;gap:12px;border-color:1px solid var(--neutral-150);padding:10px 16px;background:var(--neutral-75);border-radius:8px;cursor:pointer;margin-bottom:8px}.cax-file-attachment .file-item .file-details{display:flex;flex:1;align-items:center;gap:12px}.cax-file-attachment .file-item .file-name{color:var(--neutral-900);font-weight:500;font-size:14px;line-height:20px;flex:1;white-space:nowrap;overflow:hidden}.cax-file-attachment .file-item .file-size{color:var(--neutral-600);font-weight:400;font-size:12px;line-height:18px;margin-right:8px}.cax-file-attachment .file-item i{color:var(--neutral-900);font-size:1.1rem;margin-left:auto;order:2}.cax-file-attachment .file-item i.cax-download{cursor:pointer;transition:color .2s ease}.cax-file-attachment .file-item i.cax-download:hover{color:var(--primary-600)}.cax-file-attachment .file-item i.cax-download:active{color:var(--primary-700)}.cax-file-attachment .file-item:last-child{margin-bottom:0}.cax-file-attachment:last-child{margin-bottom:0}.cax-comment-date{font-weight:400;font-size:12px;line-height:18px;color:var(--neutral-600);align-self:flex-end}.cax-chat-input-container{display:flex;gap:.5rem}.cax-chat-input-container .chat-input{flex:1}.cax-chat-input-container .send-button{cursor:pointer}.input-wrapper{position:relative;flex:1;display:flex;flex-direction:column}.cax-date-header{text-align:center;font-size:12px;font-weight:500;line-height:18px;color:var(--neutral-700);background:var(--neutral-100);align-self:center;width:fit-content;padding:4px 12px;border-radius:4px;margin:11px 0;position:relative;z-index:1}.cax-date-header:first-child{margin-top:0}.cax-comments-container{display:flex;flex-direction:column;height:calc(100vh - 200px);overflow:hidden;position:relative;transform:translateZ(0);backface-visibility:hidden}.selected-files{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 0 5px;position:relative}.selected-files .cax-chip{background:var(--neutral-100)}.selected-files .cax-chip i{margin-right:.5rem}.selected-files .files-overlay{position:absolute;background:var(--white-100);border-radius:8px;box-shadow:0 4px 12px #00000026;width:300px;max-height:400px;z-index:1000;overflow:hidden;border:1px solid var(--neutral-200)}.selected-files .files-overlay .files-overlay-header{padding:12px 16px;font-weight:600;font-size:14px;border-bottom:1px solid var(--neutral-100);background:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content{max-height:350px;overflow-y:auto;padding:8px 0}.selected-files .files-overlay .files-overlay-content .file-item{display:flex;align-items:center;padding:8px 16px;transition:background-color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content .file-item i.cax-paperclip{color:var(--neutral-600);margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;transition:color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times:hover{color:var --error-500}.selected-files :deep(.file-chip){background:var(--neutral-50);border:1px solid var(--neutral-100)}.selected-files :deep(.file-chip) .file-details{display:flex;align-items:center;gap:8px}.selected-files :deep(.file-chip) i{color:var(--primary-500);margin-right:8px}.selected-files :deep(.file-chip) .file-name{font-weight:500}.selected-files :deep(.file-chip) .file-size{color:var(--neutral-600);font-size:.8rem}:host ::ng-deep .cax-sidebar{width:589px!important;border:1px solid var(--neutral-200)!important}:host ::ng-deep .cax-sidebar .cax-sidebar-content{display:flex;flex-direction:column;background:var(--neutral-25);padding:24px 8px!important}:host ::ng-deep .cax-sidebar .cax-sidebar-footer{padding:12px!important;background:var(--neutral-50);border-top:1px solid var(--neutral-200)}:host ::ng-deep .cax-sidebar .cax-sidebar-header{border-bottom:1px solid var(--neutral-200);background:var(--neutral-50);padding:16px 24px!important}:host ::ng-deep .cax-overlay{position:absolute;bottom:0!important;top:unset!important;left:unset!important}:host ::ng-deep .suggestion-panel{background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;margin-left:20px;width:224px;border-radius:8px;border:1px solid var(--neutral-200)}:host ::ng-deep .suggestion-panel .suggestion-list{max-height:200px;overflow-y:auto;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item{padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;transition:background-color .2s ease;align-items:center}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item.selected{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-label{font-weight:500}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-id{color:var(--neutral-600);font-size:.85em}:host ::ng-deep .suggestion-panel .suggestion-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}:host ::ng-deep .chat-footer{position:sticky;bottom:0;z-index:10}:host ::ng-deep .cax-chat-input-container .chat-input .cax-paperclip{color:var(--neutral-900)!important}:host ::ng-deep .files-list-overlay{border:1px solid var(--neutral-200);background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;width:224px;border-radius:8px}:host ::ng-deep .files-list-overlay.cax-overlay{transform-origin:right center!important}:host ::ng-deep .files-list-overlay .files-overlay-content{max-height:200px;overflow-y:auto}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item{transition:background-color .2s ease;padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;font-weight:500;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;border:1.1rem solid var(--neutral-200);transition:color .2s ease}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.InputTextComponent, selector: "cax-inputtext", inputs: ["value", "placeholder", "disabled", "maxlength", "successText", "errorText", "showLabel", "leftIcon", "rightIcon", "rightIconClickable", "clearIcon", "label", "iconPath", "disabledIcon", "showIcon", "iconClass", "leftIconClass", "rightIconClass", "invalid", "required", "style", "size", "styleClass"], outputs: ["valueChange", "rightIconClick"] }, { kind: "component", type: i5.Button, selector: "cax-button", inputs: ["type", "iconPos", "icon", "badge", "rightIcon", "leftIcon", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i6.CaxTemplate, selector: "[caxTemplate]", inputs: ["type", "caxTemplate"] }, { kind: "component", type: i7.Chip, selector: "cax-chip", inputs: ["label", "icon", "image", "alt", "style", "styleClass", "removable", "removeIcon", "size", "severity"], outputs: ["onRemove", "onImageError"] }, { kind: "component", type: i8.Overlay, selector: "cax-overlay", inputs: ["visible", "mode", "style", "styleClass", "contentStyle", "contentStyleClass", "target", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "listener", "responsive", "options"], outputs: ["visibleChange", "onBeforeShow", "onShow", "onBeforeHide", "onHide", "onAnimationStart", "onAnimationDone"] }, { kind: "component", type: i9.Avatar, selector: "cax-avatar", inputs: ["label", "icon", "image", "avatarSize", "shape", "style", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
497
527
  }
498
528
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CommentboxComponent, decorators: [{
499
529
  type: Component,
500
- args: [{ selector: 'cax-comments', template: "<div *ngIf=\"visible\" class=\"cax-comments-wrapper\">\r\n \r\n <!-- <ng-template caxTemplate=\"content\"> -->\r\n <div class=\"cax-comments-container\">\r\n <div class=\"cax-comments-list\" #commentsList>\r\n <ng-container *ngFor=\"let group of groupedComments\">\r\n <div class=\"cax-date-header\">{{ formatDate(group.date) }}</div>\r\n <div\r\n class=\"cax-comment-item\"\r\n *ngFor=\"let comment of group.items; let i = index\"\r\n [ngClass]=\"{\r\n 'cax-user-comment': !comment.isAdmin,\r\n 'cax-admin-comment': comment.isAdmin,\r\n 'consecutive-message': i > 0 && comment.isAdmin === group.items[i-1].isAdmin && comment.sender === group.items[i-1].sender,\r\n 'new-sender': i > 0 && comment.sender !== group.items[i-1].sender,\r\n 'new-date': i === 0 && group.items.length > 0\r\n }\"\r\n >\r\n <!-- User Message (Left Aligned) -->\r\n <ng-container *ngIf=\"!comment.isAdmin\">\r\n <div class=\"cax-commentbox-avatar-container\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">\r\n <cax-avatar [label]=\"comment.sender?.substring(0, 2).toUpperCase() || 'U'\" [avatarSize]=\"'xs'\" [shape]=\"'circle'\" styleclass=\"cax-commentbox-avatar\"> </cax-avatar>\r\n </div>\r\n <div class=\"cax-comment-content\" [class.no-avatar]=\"i > 0 && group.items[i-1].sender === comment.sender\">\r\n <div class=\"cax-comment-sender\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">{{comment.sender}}</div>\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Admin Message (Right Aligned) -->\r\n <ng-container *ngIf=\"comment.isAdmin\">\r\n <div class=\"cax-comment-content admin\">\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- </ng-template> -->\r\n <cax-overlay #suggestionPanel [(visible)]=\"overlayVisible\" [appendTo]=\"inputText\" (onHide)=\"onSuggestionPanelHide()\" [styleClass]=\"'suggestion-panel'\">\r\n <div class=\"suggestion-list\">\r\n <div *ngFor=\"let item of filteredSuggestions; let i = index\" class=\"suggestion-item\" [ngClass]=\"{'selected': selectedSuggestionIndex === i}\" (click)=\"onSuggestionSelect(item)\" (mouseenter)=\"selectedSuggestionIndex = i\">\r\n <span class=\"suggestion-label\">{{item.name}}</span>\r\n <small class=\"suggestion-id\" *ngIf=\"currentTokenType === 'mention'\">{{item.id}}</small>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n <cax-overlay\r\n [(visible)]=\"filesOverlayVisible\"\r\n [appendTo]=\"countChip\"\r\n [showTransitionOptions]=\"'0.12s ease-out'\"\r\n [hideTransitionOptions]=\"'0.1s ease-in'\"\r\n [style]=\"{ width: '224px', right: '5%' }\"\r\n styleClass=\"files-list-overlay\"\r\n (onHide)=\"hideFilesOverlay()\"\r\n >\r\n <div class=\"files-overlay-content\">\r\n <div *ngFor=\"let file of selectedFiles.slice(4); let i = index\" class=\"file-item\">\r\n <span class=\"file-name\">{{getShortFileName(file.name)}}</span>\r\n <i class=\"cax cax-close-circle\" (click)=\"removeFile(i + 4)\"></i>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n\r\n <!-- <ng-template caxTemplate=\"footer\"> -->\r\n <div class=\"chat-footer\">\r\n <div class=\"selected-files\" *ngIf=\"selectedFiles.length > 0\">\r\n <cax-chip *ngFor=\"let file of selectedFiles.slice(0, 4); let i = index\" [label]=\"getShortFileName(file.name)\" [removable]=\"true\" [size]=\"'lg'\" (onRemove)=\"removeFile(i, true)\">\r\n <ng-template caxTemplate=\"content\">\r\n <i class=\"cax cax-paperclip\"></i>\r\n </ng-template>\r\n </cax-chip>\r\n <cax-chip #countChip *ngIf=\"selectedFiles.length > 4\" [label]=\"'+' + getOverflowCount()\" [size]=\"'lg'\" (mouseenter)=\"showFilesOverlay($event)\"> </cax-chip>\r\n </div>\r\n <div class=\"cax-chat-input-container\">\r\n <div class=\"input-wrapper\">\r\n <cax-inputtext\r\n [(ngModel)]=\"newComment\"\r\n [size]=\"'lg'\"\r\n [rightIcon]=\"true\"\r\n [clearIcon]=\"false\"\r\n [rightIconClass]=\"'cax cax-paperclip'\"\r\n [rightIconClickable]=\"true\"\r\n (rightIconClick)=\"onFileIconClick($event)\"\r\n placeholder=\"Comment or mention others with @, \u2018#\u2019 for columns\"\r\n (keyup)=\"handleKeyUp($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [class]=\"{'chat-input': true, 'admin-input': isAdminSender}\"\r\n [style]=\"{'border-radius': '8px', background: '#ffffff'}\"\r\n #inputText\r\n >\r\n </cax-inputtext>\r\n </div>\r\n\r\n <cax-button [icon]=\"'cax cax-plain'\" [severity]=\"'primary'\" [size]=\"'large'\" (click)=\"addComment()\" [disabled]=\"!newComment.trim() && selectedFiles.length === 0\" class=\"send-button\"> </cax-button>\r\n </div>\r\n\r\n <input #fileInput type=\"file\" (change)=\"onFileSelect($event)\" style=\"display: none\" accept=\"*/*\" multiple />\r\n </div>\r\n <!-- </ng-template> -->\r\n</div>\r\n", styles: ["@layer cax{.cax-comments-wrapper{width:100%;min-height:100%;display:flex;flex-direction:column}.cax-comments-list{display:flex;flex-direction:column;gap:4px;flex:1;overflow-y:auto;overflow-x:hidden;height:100%;padding-bottom:0;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}.cax-comments-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}.cax-comments-list::-webkit-scrollbar-track{background:transparent}.cax-comments-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}.cax-comment-item{display:flex;align-items:flex-end;max-width:85%;gap:4px}.cax-comment-item.consecutive-message{margin-top:0}.cax-comment-item.new-sender{margin-top:12px}.cax-comment-item.new-date{margin-top:0}.cax-user-comment{align-self:flex-start;display:flex;flex-direction:row;text-align:left}.cax-user-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-user-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 12px 0}.cax-user-comment .cax-comment-content.no-avatar{border-radius:12px;margin-left:25px}.cax-user-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-user-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-admin-comment{align-self:flex-end;display:flex;flex-direction:row;justify-content:flex-end;text-align:right}.cax-admin-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-admin-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 0;text-align:left}.cax-admin-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-admin-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-commentbox-avatar{width:32px;height:32px;border-radius:50%;margin:0 8px}.cax-comment-content{background:var(--white-100);border-radius:12px 12px 12px 0;padding:8px;max-width:100%;word-wrap:break-word;display:flex;flex-direction:column;box-shadow:0 2px 4px #0000000d}.cax-comment-content .cax-comment-text{font-weight:400;font-size:14px;line-height:20px}.cax-comment-content .cax-comment-text ::ng-deep .mention{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-text ::ng-deep .hashtag{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-file-attachment{margin-bottom:12px}.cax-file-attachment .file-item{display:flex;align-items:center;gap:12px;border-color:1px solid var(--neutral-150);padding:10px 16px;background:var(--neutral-75);border-radius:8px;cursor:pointer;margin-bottom:8px}.cax-file-attachment .file-item .file-details{display:flex;flex:1;align-items:center;gap:12px}.cax-file-attachment .file-item .file-name{color:var(--neutral-900);font-weight:500;font-size:14px;line-height:20px;flex:1;white-space:nowrap;overflow:hidden}.cax-file-attachment .file-item .file-size{color:var(--neutral-600);font-weight:400;font-size:12px;line-height:18px;margin-right:8px}.cax-file-attachment .file-item i{color:var(--neutral-900);font-size:1.1rem;margin-left:auto;order:2}.cax-file-attachment .file-item i.cax-download{cursor:pointer;transition:color .2s ease}.cax-file-attachment .file-item i.cax-download:hover{color:var(--primary-600)}.cax-file-attachment .file-item i.cax-download:active{color:var(--primary-700)}.cax-file-attachment .file-item:last-child{margin-bottom:0}.cax-file-attachment:last-child{margin-bottom:0}.cax-comment-date{font-weight:400;font-size:12px;line-height:18px;color:var(--neutral-600);align-self:flex-end}.cax-chat-input-container{display:flex;gap:.5rem}.cax-chat-input-container .chat-input{flex:1}.cax-chat-input-container .send-button{cursor:pointer}.input-wrapper{position:relative;flex:1;display:flex;flex-direction:column}.cax-date-header{text-align:center;font-size:12px;font-weight:500;line-height:18px;color:var(--neutral-700);background:var(--neutral-100);align-self:center;width:fit-content;padding:4px 12px;border-radius:4px;margin:11px 0;position:relative;z-index:1}.cax-date-header:first-child{margin-top:0}.cax-comments-container{display:flex;flex-direction:column;height:calc(100vh - 200px);overflow:hidden;position:relative;transform:translateZ(0);backface-visibility:hidden}.selected-files{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 0 5px;position:relative}.selected-files .cax-chip{background:var(--neutral-100)}.selected-files .cax-chip i{margin-right:.5rem}.selected-files .files-overlay{position:absolute;background:var(--white-100);border-radius:8px;box-shadow:0 4px 12px #00000026;width:300px;max-height:400px;z-index:1000;overflow:hidden;border:1px solid var(--neutral-200)}.selected-files .files-overlay .files-overlay-header{padding:12px 16px;font-weight:600;font-size:14px;border-bottom:1px solid var(--neutral-100);background:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content{max-height:350px;overflow-y:auto;padding:8px 0}.selected-files .files-overlay .files-overlay-content .file-item{display:flex;align-items:center;padding:8px 16px;transition:background-color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content .file-item i.cax-paperclip{color:var(--neutral-600);margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;transition:color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times:hover{color:var --error-500}.selected-files :deep(.file-chip){background:var(--neutral-50);border:1px solid var(--neutral-100)}.selected-files :deep(.file-chip) .file-details{display:flex;align-items:center;gap:8px}.selected-files :deep(.file-chip) i{color:var(--primary-500);margin-right:8px}.selected-files :deep(.file-chip) .file-name{font-weight:500}.selected-files :deep(.file-chip) .file-size{color:var(--neutral-600);font-size:.8rem}:host ::ng-deep .cax-sidebar{width:589px!important;border:1px solid var(--neutral-200)!important}:host ::ng-deep .cax-sidebar .cax-sidebar-content{display:flex;flex-direction:column;background:var(--neutral-25);padding:24px 8px!important}:host ::ng-deep .cax-sidebar .cax-sidebar-footer{padding:12px!important;background:var(--neutral-50);border-top:1px solid var(--neutral-200)}:host ::ng-deep .cax-sidebar .cax-sidebar-header{border-bottom:1px solid var(--neutral-200);background:var(--neutral-50);padding:16px 24px!important}:host ::ng-deep .cax-overlay{position:absolute;bottom:0!important;top:unset!important;left:unset!important}:host ::ng-deep .suggestion-panel{background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;margin-left:20px;width:224px;border-radius:8px;border:1px solid var(--neutral-200)}:host ::ng-deep .suggestion-panel .suggestion-list{max-height:200px;overflow-y:auto;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item{padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;transition:background-color .2s ease;align-items:center}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item.selected{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-label{font-weight:500}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-id{color:var(--neutral-600);font-size:.85em}:host ::ng-deep .suggestion-panel .suggestion-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}:host ::ng-deep .chat-footer{position:sticky;bottom:0;z-index:10}:host ::ng-deep .cax-chat-input-container .chat-input .cax-paperclip{color:var(--neutral-900)!important}:host ::ng-deep .files-list-overlay{border:1px solid var(--neutral-200);background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;width:224px;border-radius:8px}:host ::ng-deep .files-list-overlay.cax-overlay{transform-origin:right center!important}:host ::ng-deep .files-list-overlay .files-overlay-content{max-height:200px;overflow-y:auto}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item{transition:background-color .2s ease;padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;font-weight:500;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;border:1.1rem solid var(--neutral-200);transition:color .2s ease}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}}\n"] }]
501
- }], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { comments: [{
530
+ args: [{ selector: 'cax-comments', template: "<div *ngIf=\"visible\" class=\"cax-comments-wrapper\">\r\n <!-- <ng-template caxTemplate=\"content\"> -->\r\n <div class=\"cax-comments-container\">\r\n <div class=\"cax-comments-list\" #commentsList>\r\n <ng-container *ngFor=\"let group of groupedCommentsCache\">\r\n <div class=\"cax-date-header\">{{ formatDate(group.date) }}</div>\r\n <div\r\n class=\"cax-comment-item\"\r\n *ngFor=\"let comment of group.items; let i = index\"\r\n [ngClass]=\"{\r\n 'cax-user-comment': !comment.isAdmin,\r\n 'cax-admin-comment': comment.isAdmin,\r\n 'consecutive-message': i > 0 && comment.isAdmin === group.items[i-1].isAdmin && comment.sender === group.items[i-1].sender,\r\n 'new-sender': i > 0 && comment.sender !== group.items[i-1].sender,\r\n 'new-date': i === 0 && group.items.length > 0\r\n }\"\r\n >\r\n <!-- User Message (Left Aligned) -->\r\n <ng-container *ngIf=\"!comment.isAdmin\">\r\n <div class=\"cax-commentbox-avatar-container\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">\r\n <cax-avatar [label]=\"comment.sender?.substring(0, 2).toUpperCase() || 'U'\" [avatarSize]=\"'xs'\" [shape]=\"'circle'\" styleclass=\"cax-commentbox-avatar\"> </cax-avatar>\r\n </div>\r\n <div class=\"cax-comment-content\" [class.no-avatar]=\"i > 0 && group.items[i-1].sender === comment.sender\">\r\n <div class=\"cax-comment-sender\" *ngIf=\"i === 0 || group.items[i-1].sender !== comment.sender\">{{comment.sender}}</div>\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Admin Message (Right Aligned) -->\r\n <ng-container *ngIf=\"comment.isAdmin\">\r\n <div class=\"cax-comment-content admin\">\r\n <div class=\"cax-file-attachment\" *ngIf=\"comment.files?.length\">\r\n <div *ngFor=\"let file of comment.files\" class=\"file-item\">\r\n <div class=\"file-details\">\r\n <span class=\"file-name\">{{ file.name.slice(0, 20) }}{{ file.name.includes('.') ? '.' + file.name.split('.').pop() : '' }}</span>\r\n <span class=\"file-size\">{{file.size}}</span>\r\n </div>\r\n <i class=\"cax cax-download\" (click)=\"onFileDownload(file)\" role=\"button\" tabindex=\"0\"></i>\r\n </div>\r\n </div>\r\n <div class=\"cax-comment-text\" [innerHTML]=\"formatMessageWithTags(comment.text)\"></div>\r\n <span class=\"cax-comment-date\">{{ comment.date | date: 'shortTime' }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <!-- </ng-template> -->\r\n <cax-overlay #suggestionPanel [(visible)]=\"overlayVisible\" [appendTo]=\"inputText\" (onHide)=\"onSuggestionPanelHide()\" [styleClass]=\"'suggestion-panel'\">\r\n <div class=\"suggestion-list\">\r\n <div *ngFor=\"let item of filteredSuggestions; let i = index\" class=\"suggestion-item\" [ngClass]=\"{'selected': selectedSuggestionIndex === i}\" (click)=\"onSuggestionSelect(item)\" (mouseenter)=\"selectedSuggestionIndex = i\">\r\n <span class=\"suggestion-label\">{{item.name}}</span>\r\n <small class=\"suggestion-id\" *ngIf=\"currentTokenType === 'mention'\">{{item.id}}</small>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n <cax-overlay\r\n [(visible)]=\"filesOverlayVisible\"\r\n [appendTo]=\"countChip\"\r\n [showTransitionOptions]=\"'0.12s ease-out'\"\r\n [hideTransitionOptions]=\"'0.1s ease-in'\"\r\n [style]=\"{ width: '224px', right: '5%' }\"\r\n styleClass=\"files-list-overlay\"\r\n (onHide)=\"hideFilesOverlay()\"\r\n >\r\n <div class=\"files-overlay-content\">\r\n <div *ngFor=\"let file of selectedFiles.slice(4); let i = index\" class=\"file-item\">\r\n <span class=\"file-name\">{{getShortFileName(file.name)}}</span>\r\n <i class=\"cax cax-close-circle\" (click)=\"removeFile(i + 4)\"></i>\r\n </div>\r\n </div>\r\n </cax-overlay>\r\n\r\n <!-- <ng-template caxTemplate=\"footer\"> -->\r\n <div class=\"chat-footer\">\r\n <div class=\"selected-files\" *ngIf=\"selectedFiles.length > 0\">\r\n <cax-chip *ngFor=\"let file of selectedFiles.slice(0, 4); let i = index\" [label]=\"getShortFileName(file.name)\" [removable]=\"true\" [size]=\"'lg'\" (onRemove)=\"removeFile(i, true)\">\r\n <ng-template caxTemplate=\"content\">\r\n <i class=\"cax cax-paperclip\"></i>\r\n </ng-template>\r\n </cax-chip>\r\n <cax-chip #countChip *ngIf=\"selectedFiles.length > 4\" [label]=\"'+' + getOverflowCount()\" [size]=\"'lg'\" (mouseenter)=\"showFilesOverlay($event)\"> </cax-chip>\r\n </div>\r\n <div class=\"cax-chat-input-container\">\r\n <div class=\"input-wrapper\">\r\n <cax-inputtext\r\n [(ngModel)]=\"newComment\"\r\n [size]=\"'lg'\"\r\n [rightIcon]=\"true\"\r\n [clearIcon]=\"false\"\r\n [rightIconClass]=\"'cax cax-paperclip'\"\r\n [rightIconClickable]=\"true\"\r\n (rightIconClick)=\"onFileIconClick($event)\"\r\n [placeholder]=\"placeholder\"\r\n (keyup)=\"handleKeyUp($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [ngClass]=\"{'chat-input': true, 'admin-input': isAdmin}\"\r\n [style]=\"{'border-radius': '8px', background: '#ffffff'}\"\r\n #inputText\r\n >\r\n </cax-inputtext>\r\n </div>\r\n\r\n <cax-button [icon]=\"'cax cax-plain'\" [severity]=\"'primary'\" [size]=\"'large'\" (click)=\"addComment()\" [disabled]=\"!newComment.trim() && selectedFiles.length === 0\" class=\"send-button\"> </cax-button>\r\n </div>\r\n\r\n <input #fileInput type=\"file\" (change)=\"onFileSelect($event)\" style=\"display: none\" accept=\"*/*\" multiple />\r\n </div>\r\n <!-- </ng-template> -->\r\n</div>\r\n", styles: ["@layer cax{.cax-comments-wrapper{width:100%;min-height:100%;display:flex;flex-direction:column}.cax-comments-list{display:flex;flex-direction:column;gap:4px;flex:1;overflow-y:auto;overflow-x:hidden;height:100%;padding-bottom:0;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}.cax-comments-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}.cax-comments-list::-webkit-scrollbar-track{background:transparent}.cax-comments-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}.cax-comment-item{display:flex;align-items:flex-end;max-width:85%;gap:4px}.cax-comment-item.consecutive-message{margin-top:0}.cax-comment-item.new-sender{margin-top:12px}.cax-comment-item.new-date{margin-top:0}.cax-user-comment{align-self:flex-start;display:flex;flex-direction:row;text-align:left}.cax-user-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-user-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 12px 0}.cax-user-comment .cax-comment-content.no-avatar{border-radius:12px;margin-left:25px}.cax-user-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-user-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-admin-comment{align-self:flex-end;display:flex;flex-direction:row;justify-content:flex-end;text-align:right}.cax-admin-comment .cax-commentbox-avatar-container{display:flex;align-items:flex-end}.cax-admin-comment .cax-comment-content{margin-bottom:0;display:flex;flex-direction:column;border-radius:12px 12px 0;text-align:left}.cax-admin-comment .cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-admin-comment.consecutive-message .cax-comment-content{border-radius:12px}.cax-commentbox-avatar{width:32px;height:32px;border-radius:50%;margin:0 8px}.cax-comment-content{background:var(--white-100);border-radius:12px 12px 12px 0;padding:8px;max-width:100%;word-wrap:break-word;display:flex;flex-direction:column;box-shadow:0 2px 4px #0000000d}.cax-comment-content .cax-comment-text{font-weight:400;font-size:14px;line-height:20px}.cax-comment-content .cax-comment-text ::ng-deep .mention{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-text ::ng-deep .hashtag{display:inline-block;font-weight:600;color:var(--primary-500)}.cax-comment-content .cax-comment-sender{font-size:14px;font-weight:600;color:var(--neutral-900);margin-bottom:0;line-height:20px}.cax-file-attachment{margin-bottom:12px}.cax-file-attachment .file-item{display:flex;align-items:center;gap:12px;border-color:1px solid var(--neutral-150);padding:10px 16px;background:var(--neutral-75);border-radius:8px;cursor:pointer;margin-bottom:8px}.cax-file-attachment .file-item .file-details{display:flex;flex:1;align-items:center;gap:12px}.cax-file-attachment .file-item .file-name{color:var(--neutral-900);font-weight:500;font-size:14px;line-height:20px;flex:1;white-space:nowrap;overflow:hidden}.cax-file-attachment .file-item .file-size{color:var(--neutral-600);font-weight:400;font-size:12px;line-height:18px;margin-right:8px}.cax-file-attachment .file-item i{color:var(--neutral-900);font-size:1.1rem;margin-left:auto;order:2}.cax-file-attachment .file-item i.cax-download{cursor:pointer;transition:color .2s ease}.cax-file-attachment .file-item i.cax-download:hover{color:var(--primary-600)}.cax-file-attachment .file-item i.cax-download:active{color:var(--primary-700)}.cax-file-attachment .file-item:last-child{margin-bottom:0}.cax-file-attachment:last-child{margin-bottom:0}.cax-comment-date{font-weight:400;font-size:12px;line-height:18px;color:var(--neutral-600);align-self:flex-end}.cax-chat-input-container{display:flex;gap:.5rem}.cax-chat-input-container .chat-input{flex:1}.cax-chat-input-container .send-button{cursor:pointer}.input-wrapper{position:relative;flex:1;display:flex;flex-direction:column}.cax-date-header{text-align:center;font-size:12px;font-weight:500;line-height:18px;color:var(--neutral-700);background:var(--neutral-100);align-self:center;width:fit-content;padding:4px 12px;border-radius:4px;margin:11px 0;position:relative;z-index:1}.cax-date-header:first-child{margin-top:0}.cax-comments-container{display:flex;flex-direction:column;height:calc(100vh - 200px);overflow:hidden;position:relative;transform:translateZ(0);backface-visibility:hidden}.selected-files{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 0 5px;position:relative}.selected-files .cax-chip{background:var(--neutral-100)}.selected-files .cax-chip i{margin-right:.5rem}.selected-files .files-overlay{position:absolute;background:var(--white-100);border-radius:8px;box-shadow:0 4px 12px #00000026;width:300px;max-height:400px;z-index:1000;overflow:hidden;border:1px solid var(--neutral-200)}.selected-files .files-overlay .files-overlay-header{padding:12px 16px;font-weight:600;font-size:14px;border-bottom:1px solid var(--neutral-100);background:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content{max-height:350px;overflow-y:auto;padding:8px 0}.selected-files .files-overlay .files-overlay-content .file-item{display:flex;align-items:center;padding:8px 16px;transition:background-color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}.selected-files .files-overlay .files-overlay-content .file-item i.cax-paperclip{color:var(--neutral-600);margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;transition:color .2s ease}.selected-files .files-overlay .files-overlay-content .file-item i.cax-times:hover{color:var --error-500}.selected-files :deep(.file-chip){background:var(--neutral-50);border:1px solid var(--neutral-100)}.selected-files :deep(.file-chip) .file-details{display:flex;align-items:center;gap:8px}.selected-files :deep(.file-chip) i{color:var(--primary-500);margin-right:8px}.selected-files :deep(.file-chip) .file-name{font-weight:500}.selected-files :deep(.file-chip) .file-size{color:var(--neutral-600);font-size:.8rem}:host ::ng-deep .cax-sidebar{width:589px!important;border:1px solid var(--neutral-200)!important}:host ::ng-deep .cax-sidebar .cax-sidebar-content{display:flex;flex-direction:column;background:var(--neutral-25);padding:24px 8px!important}:host ::ng-deep .cax-sidebar .cax-sidebar-footer{padding:12px!important;background:var(--neutral-50);border-top:1px solid var(--neutral-200)}:host ::ng-deep .cax-sidebar .cax-sidebar-header{border-bottom:1px solid var(--neutral-200);background:var(--neutral-50);padding:16px 24px!important}:host ::ng-deep .cax-overlay{position:absolute;bottom:0!important;top:unset!important;left:unset!important}:host ::ng-deep .suggestion-panel{background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;margin-left:20px;width:224px;border-radius:8px;border:1px solid var(--neutral-200)}:host ::ng-deep .suggestion-panel .suggestion-list{max-height:200px;overflow-y:auto;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item{padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;transition:background-color .2s ease;align-items:center}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item.selected{background-color:var(--neutral-50)}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-label{font-weight:500}:host ::ng-deep .suggestion-panel .suggestion-list .suggestion-item .suggestion-id{color:var(--neutral-600);font-size:.85em}:host ::ng-deep .suggestion-panel .suggestion-list:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .suggestion-panel .suggestion-list::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}:host ::ng-deep .chat-footer{position:sticky;bottom:0;z-index:10}:host ::ng-deep .cax-chat-input-container .chat-input .cax-paperclip{color:var(--neutral-900)!important}:host ::ng-deep .files-list-overlay{border:1px solid var(--neutral-200);background:var(--white-100);box-shadow:0 2px 8px #0000001a;z-index:9999;padding:12px 4px;width:224px;border-radius:8px}:host ::ng-deep .files-list-overlay.cax-overlay{transform-origin:right center!important}:host ::ng-deep .files-list-overlay .files-overlay-content{max-height:200px;overflow-y:auto}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item{transition:background-color .2s ease;padding:6px 8px;cursor:pointer;display:flex;justify-content:space-between;align-items:center;will-change:transform;transform:translateZ(0);backface-visibility:hidden;-webkit-backface-visibility:hidden;scrollbar-width:thin;scrollbar-color:rgba(94,92,92,.3) transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:hover{background-color:var(--neutral-50)}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-name{flex:1;font-size:14px;font-weight:500;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item .file-size{color:var(--neutral-600);font-size:12px;margin-right:8px}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item i.cax-times{color:var(--neutral-600);cursor:pointer;border:1.1rem solid var(--neutral-200);transition:color .2s ease}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item:after{content:\"\";display:block;min-height:20px;scroll-snap-align:end}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-track{background:transparent}:host ::ng-deep .files-list-overlay .files-overlay-content .file-item::-webkit-scrollbar-thumb{background-color:#5553531a;border-radius:4px;border:2px solid transparent;background-clip:padding-box}}\n"] }]
531
+ }], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i0.NgZone }], propDecorators: { comments: [{
502
532
  type: Input
503
533
  }], mentionSuggestions: [{
504
534
  type: Input
@@ -508,6 +538,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
508
538
  type: Input
509
539
  }], isAdmin: [{
510
540
  type: Input
541
+ }], placeholder: [{
542
+ type: Input
511
543
  }], commentAdded: [{
512
544
  type: Output
513
545
  }], fileSelected: [{
@@ -516,6 +548,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
516
548
  type: Output
517
549
  }], visibleChange: [{
518
550
  type: Output
551
+ }], onSidebarHide: [{
552
+ type: Output
519
553
  }], fileInput: [{
520
554
  type: ViewChild,
521
555
  args: ['fileInput']
@@ -537,4 +571,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
537
571
  type: HostListener,
538
572
  args: ['document:click', ['$event']]
539
573
  }] } });
540
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9jb21tZW50Ym94L2NvbW1lbnRib3gudHMiLCIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvY29tbWVudGJveC9jb21tZW50Ym94Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7OztBQXNCNUcsTUFBTSxPQUFPLG1CQUFtQjtJQTRDUjtJQTNDWCxRQUFRLEdBQWMsRUFBRSxDQUFDO0lBQ3pCLGtCQUFrQixHQUFVLEVBQUUsQ0FBQztJQUMvQixrQkFBa0IsR0FBVSxFQUFFLENBQUM7SUFDL0IsYUFBYSxDQUFTO0lBQ3RCLE9BQU8sR0FBWSxJQUFJLENBQUM7SUFDdkIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdkMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDeEMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO0lBQ2xFLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQ3RELFVBQVUsR0FBVyxFQUFFLENBQUM7SUFFeEIsWUFBWSxHQUFZLEtBQUssQ0FBQztJQUM5QixhQUFhLEdBQVksS0FBSyxDQUFDO0lBQy9CLFdBQVcsR0FBVSxFQUFFLENBQUM7SUFDeEIsa0JBQWtCLEdBQVEsSUFBSSxDQUFDO0lBQy9CLHVCQUF1QixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLG1CQUFtQixHQUFVLEVBQUUsQ0FBQztJQUNoQyxnQkFBZ0IsR0FBaUMsSUFBSSxDQUFDO0lBQ3RELGNBQWMsR0FBVyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQWdDO0lBQ25DLGVBQWUsQ0FBYztJQUNuQyxTQUFTLENBQWM7SUFDWixZ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O3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQVlpQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1EsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBQ0osU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNhLFlBQVk7c0JBQTlDLFNBQVM7dUJBQUMsY0FBYztnQkFDRCxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBcUpULE9BQU87c0JBQW5CLEtBQUs7Z0JBNEJOLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG4vLyBBZGQgdGhpcyBpbnRlcmZhY2UgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZVxuaW50ZXJmYWNlIENvbW1lbnQge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBkYXRlOiBEYXRlO1xuICAgIGZpbGVzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHNpemU6IHN0cmluZyB9PjtcbiAgICBpc0FkbWluPzogYm9vbGVhbjtcbiAgICBzZW5kZXI/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHcm91cGVkQ29tbWVudHMge1xuICAgIGRhdGU6IERhdGU7XG4gICAgaXRlbXM6IENvbW1lbnRbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjYXgtY29tbWVudHMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50Ym94Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbW1lbnRib3guc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbW1lbnRib3hDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGNvbW1lbnRzOiBDb21tZW50W10gPSBbXTtcbiAgICBASW5wdXQoKSBtZW50aW9uU3VnZ2VzdGlvbnM6IGFueVtdID0gW107XG4gICAgQElucHV0KCkgaGFzaHRhZ1N1Z2dlc3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIEBJbnB1dCgpIHNpZGViYXJIZWFkZXI6IHN0cmluZztcbiAgICBASW5wdXQoKSBpc0FkbWluOiBib29sZWFuID0gdHJ1ZTtcbiAgICBAT3V0cHV0KCkgY29tbWVudEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIGZpbGVTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcbiAgICBAT3V0cHV0KCkgZmlsZURvd25sb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5hbWU6IHN0cmluZzsgc2l6ZTogc3RyaW5nIH0+KCk7XG4gICAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgbmV3Q29tbWVudDogc3RyaW5nID0gJyc7XG5cbiAgICBpc01lbnRpb25pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpc0hhc2h0YWdnaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgc3VnZ2VzdGlvbnM6IGFueVtdID0gW107XG4gICAgc2VsZWN0ZWRTdWdnZXN0aW9uOiBhbnkgPSBudWxsO1xuICAgIHNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4OiBudW1iZXIgPSAtMTtcbiAgICBmaWx0ZXJlZFN1Z2dlc3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGN1cnJlbnRUb2tlblR5cGU6ICdtZW50aW9uJyB8ICdoYXNodGFnJyB8IG51bGwgPSBudWxsO1xuICAgIGN1cnNvclBvc2l0aW9uOiBudW1iZXIgPSAwO1xuXG4gICAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JykgZmlsZUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKCdzdWdnZXN0aW9uUGFuZWwnKSBzdWdnZXN0aW9uUGFuZWwhOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0VGV4dCcpIGlucHV0VGV4dCE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudHNMaXN0JykgcHJpdmF0ZSBjb21tZW50c0xpc3QhOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvdW50Q2hpcCcpIGNvdW50Q2hpcCE6IEVsZW1lbnRSZWY7XG4gICAgc2VsZWN0ZWRGaWxlczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHNpemU6IHN0cmluZyB9PiA9IFtdO1xuICAgIHNlbGVjdGVkRmlsZXNNYXA6IE1hcDxudW1iZXIsIHsgbmFtZTogc3RyaW5nOyBzaXplOiBzdHJpbmcgfT4gPSBuZXcgTWFwKCk7XG5cbiAgICB0b2RheTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBvdmVybGF5VmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGZpbGVzT3ZlcmxheVZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBvdmVybGF5UG9zaXRpb24gPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG4gICAgcHJpdmF0ZSBkYXRlVXBkYXRlSW50ZXJ2YWw6IGFueTtcblxuICAgIC8vIEtlZXAgdHJhY2sgb2Ygc2hvdWxkIGF1dG8gc2Nyb2xsXG4gICAgcHJpdmF0ZSBzaG91bGRBdXRvU2Nyb2xsID0gdHJ1ZTtcbiAgICBwcml2YXRlIGlzVXNlclNjcm9sbGluZyA9IGZhbHNlO1xuXG4gICAgLy8gQWRkIG5ldyBwcm9wZXJ0eSBmb3IgbXV0YXRpb24gb2JzZXJ2ZXJcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge1xuICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnREYXRlKCk7XG4gICAgICAgIHRoaXMuZGF0ZVVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy51cGRhdGVDdXJyZW50RGF0ZSgpLCA2MDAwMCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBvYnNlcnZlclxuICAgICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gdGhpcy5mb3JjZVNjcm9sbFRvQm90dG9tKCkpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcmNlU2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgfSwgMTAwKTtcblxuICAgICAgICAvLyBTZXQgdXAgb2JzZXJ2ZXIgdG8gYXV0by1zY3JvbGwgd2hlbiBjb250ZW50IGNoYW5nZXNcbiAgICAgICAgaWYgKHRoaXMuY29tbWVudHNMaXN0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5jb21tZW50c0xpc3QubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGVVcGRhdGVJbnRlcnZhbCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmRhdGVVcGRhdGVJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgb2JzZXJ2ZXJcbiAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUN1cnJlbnREYXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodW5kZWZpbmVkLCB7XG4gICAgICAgICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICB0aW1lWm9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvcm1hdE1lc3NhZ2VXaXRoVGFncyh0ZXh0OiBzdHJpbmcpOiBTYWZlSHRtbCB7XG4gICAgICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWRUZXh0ID0gdGV4dC5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gICAgICAgIGNvbnN0IGh0bWxDb250ZW50ID0gc2FuaXRpemVkVGV4dC5yZXBsYWNlKC8oQFxcdyt8I1xcdyspL2csIChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJtZW50aW9uXCIgc3R5bGU9XCJjb2xvcjogIzBDNEFGMzsgZm9udC13ZWlnaHQ6IDYwMDtcIj4ke21hdGNofTwvc3Bhbj5gO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5zdGFydHNXaXRoKCcjJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiaGFzaHRhZ1wiIHN0eWxlPVwiY29sb3I6ICMwQzRBRjM7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+JHttYXRjaH08L3NwYW4+YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWxDb250ZW50KTtcbiAgICB9XG5cbiAgICBhZGRDb21tZW50KCkge1xuICAgICAgICBpZiAodGhpcy5uZXdDb21tZW50LnRyaW0oKSB8fCB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3Q29tbWVudDogQ29tbWVudCA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLm5ld0NvbW1lbnQsXG4gICAgICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICBmaWxlczogdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA+IDAgPyBbLi4udGhpcy5zZWxlY3RlZEZpbGVzXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBpc0FkbWluOiB0aGlzLmlzQWRtaW4sXG4gICAgICAgICAgICAgICAgc2VuZGVyOiB0aGlzLmlzQWRtaW4gPyAnU3lzdGVtIEFkbWluJyA6ICdVc2VyJ1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5jb21tZW50cyA9IFsuLi50aGlzLmNvbW1lbnRzLCBuZXdDb21tZW50XTtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudEFkZGVkLmVtaXQobmV3Q29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLm5ld0NvbW1lbnQgPSAnJztcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzTWFwLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmZpbGVzT3ZlcmxheVZpc2libGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvblBhbmVsPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWdnZXN0aW9uUGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBbHdheXMgc2Nyb2xsIHRvIGJvdHRvbSBpbW1lZGlhdGVseVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9yY2VTY3JvbGxUb0JvdHRvbSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbW1lbnRzTGlzdD8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNvbW1lbnRzTGlzdC5uYXRpdmVFbGVtZW50O1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbW1lZGlhdGUgc2Nyb2xsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Njcm9sbCBlcnJvcjonLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvQm90dG9tKGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcmNlU2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY29tbWVudHNMaXN0Py5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY29tbWVudHNMaXN0Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gVXNlIGRvdWJsZSBSQUYgZm9yIHJlbGlhYmxlIHNjcm9sbGluZ1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSBpbW1lZGlhdGUgc2Nyb2xsIGZvciBuZXcgY29tbWVudHNcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc21vb3RoIHNjcm9sbGluZyBhZnRlciBpbml0aWFsIGp1bXBcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRoaXMuX3Zpc2libGUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkQXV0b1Njcm9sbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQm90dG9tKHRydWUpLCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHRvZ2dsZUNvbW1lbnRzKCkge1xuICAgICAgICB0aGlzLnZpc2libGUgPSAhdGhpcy52aXNpYmxlO1xuICAgIH1cblxuICAgIG9uU2lkZWJhckhpZGUoKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBpc0lucHV0Q2xpY2sgPSB0aGlzLmlucHV0VGV4dD8ubmF0aXZlRWxlbWVudD8uY29udGFpbnModGFyZ2V0KTtcbiAgICAgICAgY29uc3QgaXNQYW5lbENsaWNrID0gdGhpcy5zdWdnZXN0aW9uUGFuZWw/Lm5hdGl2ZUVsZW1lbnQ/LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgICAgaWYgKCFpc0lucHV0Q2xpY2sgJiYgIWlzUGFuZWxDbGljaykge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlS2V5VXAoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBVcGRhdGUgY3Vyc29yIHBvc2l0aW9uIG9uIGV2ZXJ5IGtleSBwcmVzc1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IGlucHV0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdAJyB8fCBldmVudC5rZXkgPT09ICcjJykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gZXZlbnQua2V5ID09PSAnQCcgPyAnbWVudGlvbicgOiAnaGFzaHRhZyc7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPT09ICdtZW50aW9uJyA/IHRoaXMubWVudGlvblN1Z2dlc3Rpb25zIDogdGhpcy5oYXNodGFnU3VnZ2VzdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gMDtcblxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IGlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUG9zaXRpb24gPSB0aGlzLmdldEN1cnNvclBvc2l0aW9uKGlucHV0KTtcblxuICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMuc3VnZ2VzdGlvblBhbmVsPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5sZWZ0ICsgY3Vyc29yUG9zaXRpb24ubGVmdH1weGA7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnN0eWxlLnRvcCA9IGAke3JlY3QudG9wIC0gMTB9cHhgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFRva2VuVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFRva2VuQXRDdXJzb3IoaW5wdXQudmFsdWUsIHRoaXMuY3Vyc29yUG9zaXRpb24pO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRva2VuLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gKHRoaXMuY3VycmVudFRva2VuVHlwZSA9PT0gJ21lbnRpb24nID8gdGhpcy5tZW50aW9uU3VnZ2VzdGlvbnMgOiB0aGlzLmhhc2h0YWdTdWdnZXN0aW9ucykuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBpdGVtLmlkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlc2V0IHNlbGVjdGlvbiBpbmRleCBpZiB3ZSBoYXZlIG5ldyBzdWdnZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA8IDAgfHwgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA+PSB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRUb2tlbkF0Q3Vyc29yKHRleHQ6IHN0cmluZywgY3Vyc29yUG9zOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgYmVmb3JlQ3Vyc29yID0gdGV4dC5zbGljZSgwLCBjdXJzb3JQb3MpO1xuICAgICAgICBjb25zdCBtYXRjaCA9IGJlZm9yZUN1cnNvci5tYXRjaCgvW0AjXVteXFxzXSokLyk7XG4gICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXRXb3JkQXRQb3NpdGlvbih0ZXh0OiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBsZWZ0ID0gdGV4dC5zbGljZSgwLCBwb3NpdGlvbikuc2VhcmNoKC9bQCNdW15cXHNdKiQvKTtcbiAgICAgICAgaWYgKGxlZnQgPT09IC0xKSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGxlZnQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBzZWxlY3RTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IGFueSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMubmV3Q29tbWVudDtcbiAgICAgICAgY29uc3Qgd29yZFN0YXJ0ID0gaW5wdXQuc2xpY2UoMCwgdGhpcy5jdXJzb3JQb3NpdGlvbikuc2VhcmNoKC9bQCNdW15cXHNdKiQvKTtcblxuICAgICAgICB0aGlzLm5ld0NvbW1lbnQgPSBpbnB1dC5zbGljZSgwLCB3b3JkU3RhcnQpICsgc3VnZ2VzdGlvbi52YWx1ZSArICcgJyArIGlucHV0LnNsaWNlKHRoaXMuY3Vyc29yUG9zaXRpb24pO1xuXG4gICAgICAgIHRoaXMuaXNNZW50aW9uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNIYXNodGFnZ2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uU3VnZ2VzdGlvblNlbGVjdChpdGVtOiBhbnkpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLm5ld0NvbW1lbnQ7XG4gICAgICAgIGNvbnN0IGJlZm9yZUN1cnNvciA9IGlucHV0LnNsaWNlKDAsIHRoaXMuY3Vyc29yUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBhZnRlckN1cnNvciA9IGlucHV0LnNsaWNlKHRoaXMuY3Vyc29yUG9zaXRpb24pO1xuICAgICAgICBjb25zdCBsYXN0VG9rZW5JbmRleCA9IE1hdGgubWF4KGJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZignQCcpLCBiZWZvcmVDdXJzb3IubGFzdEluZGV4T2YoJyMnKSk7XG5cbiAgICAgICAgaWYgKGxhc3RUb2tlbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgc3VnZ2VzdGlvbiBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLm5ld0NvbW1lbnQgPSBiZWZvcmVDdXJzb3Iuc2xpY2UoMCwgbGFzdFRva2VuSW5kZXgpICsgaXRlbS5pZCArICcgJyArIGFmdGVyQ3Vyc29yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWdnZXN0aW9uUGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gLTE7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy5pbnB1dFRleHQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICAgICAgaWYgKGlucHV0RWwpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEVsLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU3VnZ2VzdGlvblBhbmVsSGlkZSgpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IC0xO1xuICAgIH1cblxuICAgIGdldEN1cnNvclBvc2l0aW9uKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25TdGFydCA9IGlucHV0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XG4gICAgICAgIGNvbnN0IHRleHRCZWZvcmVDdXJzb3IgPSBpbnB1dC52YWx1ZS5zdWJzdHJpbmcoMCwgc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gdGV4dEJlZm9yZUN1cnNvcjtcbiAgICAgICAgc3Bhbi5zdHlsZS5jc3NUZXh0ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoaW5wdXQsIG51bGwpLmNzc1RleHQ7XG4gICAgICAgIHNwYW4uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIGxlZnQ6IHNwYW4ub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICB0b3A6IHNwYW4ub2Zmc2V0SGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc3Bhbik7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBvbkZpbGVJY29uQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmZpbGVJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25GaWxlU2VsZWN0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgQXJyYXkuZnJvbShpbnB1dC5maWxlcykuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUV4aXN0cyA9IHRoaXMuc2VsZWN0ZWRGaWxlcy5zb21lKChleGlzdGluZ0ZpbGUpID0+IGV4aXN0aW5nRmlsZS5uYW1lID09PSBmaWxlLm5hbWUgJiYgZXhpc3RpbmdGaWxlLnNpemUgPT09IHRoaXMuZm9ybWF0RmlsZVNpemUoZmlsZS5zaXplKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiB0aGlzLmZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXNNYXAuc2V0KHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggLSAxLCBmaWxlSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZVNlbGVjdGVkLmVtaXQoZmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNoYXQtaW5wdXQgaW5wdXQnKTtcbiAgICAgICAgICAgIGlmIChpbnB1dEVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dEVsLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpbGVTdGF0ZShpbmRleDogbnVtYmVyLCBmcm9tQ2hpcDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgYWN0dWFsSW5kZXggPSBmcm9tQ2hpcCA/IGluZGV4IDogaW5kZXggKyA0O1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBhY3R1YWxJbmRleCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlc01hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMuZm9yRWFjaCgoZmlsZSwgaSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzTWFwLnNldChpLCBmaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlRmlsZShpbmRleDogbnVtYmVyLCBmcm9tQ2hpcDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWxlU3RhdGUoaW5kZXgsIGZyb21DaGlwKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlRmlsZXNPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPdmVyZmxvd0NvdW50KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFJldHVybiBjb3VudCBvZiBmaWxlcyBiZXlvbmQgdGhlIGZpcnN0IDRcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggLSA0KTtcbiAgICB9XG5cbiAgICBzaG93RmlsZXNPdmVybGF5KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gUG9zaXRpb24gdGhlIG92ZXJsYXkgYmVsb3cgdGhlIGNvdW50IGNoaXBcbiAgICAgICAgdGhpcy5vdmVybGF5UG9zaXRpb24gPSB7XG4gICAgICAgICAgICB0b3A6IHJlY3QuYm90dG9tICsgNSxcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCAtIDI1MCArIHJlY3Qud2lkdGggLyAyIC8vIENlbnRlciB0aGUgb3ZlcmxheSBob3Jpem9udGFsbHlcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmZpbGVzT3ZlcmxheVZpc2libGUgPSB0cnVlO1xuXG4gICAgICAgIC8vIEFkZCBhIGNsaWNrIG91dHNpZGUgbGlzdGVuZXIgdG8gY2xvc2UgdGhlIG92ZXJsYXlcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGlkZUZpbGVzT3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5maWxlc092ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ2xpY2tPdXRzaWRlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5maWxlcy1vdmVybGF5Jyk7XG4gICAgICAgIGNvbnN0IGNvdW50Q2hpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb3VudC1jaGlwJyk7XG5cbiAgICAgICAgaWYgKG92ZXJsYXkgJiYgIW92ZXJsYXkuY29udGFpbnModGFyZ2V0KSAmJiBjb3VudENoaXAgJiYgIWNvdW50Q2hpcC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVGaWxlc092ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQnl0ZXMnO1xuICAgICAgICBjb25zdCBrID0gMTAyNDtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJ107XG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoMikpICsgJyAnICsgc2l6ZXNbaV07XG4gICAgfVxuXG4gICAgc2hvd1N1Z2dlc3Rpb25zKF9ldmVudDogYW55LCB0eXBlOiAnbWVudGlvbicgfCAnaGFzaHRhZycpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gdHlwZSA9PT0gJ21lbnRpb24nID8gdGhpcy5tZW50aW9uU3VnZ2VzdGlvbnMgOiB0aGlzLmhhc2h0YWdTdWdnZXN0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvblBhbmVsKSB7XG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25QYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAvLyBJZiBzdWdnZXN0aW9ucyBhcmUgdmlzaWJsZSwgaGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgICAgaWYgKHRoaXMub3ZlcmxheVZpc2libGUgJiYgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IE1hdGgubWluKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggKyAxLCB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3VnZ2VzdGlvbkludG9WaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gTWF0aC5tYXgodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCAtIDEsIDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFN1Z2dlc3Rpb25JbnRvVmlldygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoaWZ0K1RhYiAtIG1vdmUgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSBNYXRoLm1heCh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4IC0gMSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWIgLSBtb3ZlIGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSBNYXRoLm1pbih0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ICsgMSwgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3VnZ2VzdGlvbkludG9WaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3QodGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3VnZ2VzdGlvblBhbmVsSGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIHN1Z2dlc3Rpb25zIGFyZSB2aXNpYmxlLCBoYW5kbGUgbm9ybWFsIGVudGVyIGtleSBwcmVzc1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuYWRkQ29tbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGVscGVyIG1ldGhvZCB0byBzY3JvbGwgdGhlIHNlbGVjdGVkIHN1Z2dlc3Rpb24gaW50byB2aWV3XG4gICAgcHJpdmF0ZSBzY3JvbGxTdWdnZXN0aW9uSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbkxpc3QgPSB0aGlzLnN1Z2dlc3Rpb25QYW5lbD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc3VnZ2VzdGlvbi1saXN0Jyk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBzdWdnZXN0aW9uTGlzdD8ucXVlcnlTZWxlY3RvcignLnN1Z2dlc3Rpb24taXRlbS5zZWxlY3RlZCcpO1xuXG4gICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbkxpc3QgJiYgc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdFJlY3QgPSBzdWdnZXN0aW9uTGlzdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdCA9IHNlbGVjdGVkSXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBpdGVtIGlzIG91dHNpZGUgdGhlIHZpc2libGUgYXJlYVxuICAgICAgICAgICAgICAgIGlmIChpdGVtUmVjdC5ib3R0b20gPiBsaXN0UmVjdC5ib3R0b20pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlbSBpcyBiZWxvdyB0aGUgdmlzaWJsZSBhcmVhXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbVJlY3QudG9wIDwgbGlzdFJlY3QudG9wKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0ZW0gaXMgYWJvdmUgdGhlIHZpc2libGUgYXJlYVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25GaWxlRG93bmxvYWQoZmlsZTogeyBuYW1lOiBzdHJpbmc7IHNpemU6IHN0cmluZyB9KSB7XG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkLmVtaXQoZmlsZSk7XG4gICAgfVxuXG4gICAgZ2V0IGdyb3VwZWRDb21tZW50cygpOiBHcm91cGVkQ29tbWVudHNbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRzXG4gICAgICAgICAgICAucmVkdWNlKChncm91cHM6IEdyb3VwZWRDb21tZW50c1tdLCBjb21tZW50OiBDb21tZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudERhdGUgPSBuZXcgRGF0ZShjb21tZW50LmRhdGUpO1xuICAgICAgICAgICAgICAgIGNvbW1lbnREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IGdyb3Vwcy5maW5kKChncm91cCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cERhdGUgPSBuZXcgRGF0ZShncm91cC5kYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBEYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBEYXRlLmdldFRpbWUoKSA9PT0gY29tbWVudERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdHcm91cC5pdGVtcy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IGNvbW1lbnREYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtjb21tZW50XVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBzO1xuICAgICAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5kYXRlLmdldFRpbWUoKSAtIGIuZGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIGdldFNob3J0RmlsZU5hbWUoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChmaWxlbmFtZS5sZW5ndGggPD0gNCkgcmV0dXJuIGZpbGVuYW1lO1xuXG4gICAgICAgIC8vIEdldCBmaWxlIGV4dGVuc2lvblxuICAgICAgICBjb25zdCBsYXN0RG90SW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBsYXN0RG90SW5kZXggIT09IC0xID8gZmlsZW5hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCkgOiAnJztcblxuICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgbmFtZSBwYXJ0IGFuZCBhZGQgdGhlIGV4dGVuc2lvblxuICAgICAgICBjb25zdCBuYW1lUGFydCA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXggIT09IC0xID8gbGFzdERvdEluZGV4IDogZmlsZW5hbWUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG5hbWVQYXJ0LnN1YnN0cmluZygwLCA0KSArICcuLicgKyBleHRlbnNpb247XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cInZpc2libGVcIiBjbGFzcz1cImNheC1jb21tZW50cy13cmFwcGVyXCI+XHJcbiBcclxuICAgIDwhLS0gPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwiY29udGVudFwiPiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWNvbW1lbnRzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWNvbW1lbnRzLWxpc3RcIiAjY29tbWVudHNMaXN0PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZ3JvdXBlZENvbW1lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1kYXRlLWhlYWRlclwiPnt7IGZvcm1hdERhdGUoZ3JvdXAuZGF0ZSkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F4LWNvbW1lbnQtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21tZW50IG9mIGdyb3VwLml0ZW1zOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NheC11c2VyLWNvbW1lbnQnOiAhY29tbWVudC5pc0FkbWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NheC1hZG1pbi1jb21tZW50JzogY29tbWVudC5pc0FkbWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnNlY3V0aXZlLW1lc3NhZ2UnOiBpID4gMCAmJiBjb21tZW50LmlzQWRtaW4gPT09IGdyb3VwLml0ZW1zW2ktMV0uaXNBZG1pbiAmJiBjb21tZW50LnNlbmRlciA9PT0gZ3JvdXAuaXRlbXNbaS0xXS5zZW5kZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3LXNlbmRlcic6IGkgPiAwICYmIGNvbW1lbnQuc2VuZGVyICE9PSBncm91cC5pdGVtc1tpLTFdLnNlbmRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXctZGF0ZSc6IGkgPT09IDAgJiYgZ3JvdXAuaXRlbXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVXNlciBNZXNzYWdlIChMZWZ0IEFsaWduZWQpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbW1lbnQuaXNBZG1pblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1jb21tZW50Ym94LWF2YXRhci1jb250YWluZXJcIiAqbmdJZj1cImkgPT09IDAgfHwgZ3JvdXAuaXRlbXNbaS0xXS5zZW5kZXIgIT09IGNvbW1lbnQuc2VuZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNheC1hdmF0YXIgW2xhYmVsXT1cImNvbW1lbnQuc2VuZGVyPy5zdWJzdHJpbmcoMCwgMikudG9VcHBlckNhc2UoKSB8fCAnVSdcIiBbYXZhdGFyU2l6ZV09XCIneHMnXCIgW3NoYXBlXT1cIidjaXJjbGUnXCIgc3R5bGVjbGFzcz1cImNheC1jb21tZW50Ym94LWF2YXRhclwiPiA8L2NheC1hdmF0YXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudC1jb250ZW50XCIgW2NsYXNzLm5vLWF2YXRhcl09XCJpID4gMCAmJiBncm91cC5pdGVtc1tpLTFdLnNlbmRlciA9PT0gY29tbWVudC5zZW5kZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWNvbW1lbnQtc2VuZGVyXCIgKm5nSWY9XCJpID09PSAwIHx8IGdyb3VwLml0ZW1zW2ktMV0uc2VuZGVyICE9PSBjb21tZW50LnNlbmRlclwiPnt7Y29tbWVudC5zZW5kZXJ9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtZmlsZS1hdHRhY2htZW50XCIgKm5nSWY9XCJjb21tZW50LmZpbGVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZSBvZiBjb21tZW50LmZpbGVzXCIgY2xhc3M9XCJmaWxlLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtbmFtZVwiPnt7IGZpbGUubmFtZS5zbGljZSgwLCAyMCkgfX17eyBmaWxlLm5hbWUuaW5jbHVkZXMoJy4nKSA/ICcuJyArIGZpbGUubmFtZS5zcGxpdCgnLicpLnBvcCgpIDogJycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXNpemVcIj57e2ZpbGUuc2l6ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtZG93bmxvYWRcIiAoY2xpY2spPVwib25GaWxlRG93bmxvYWQoZmlsZSlcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWNvbW1lbnQtdGV4dFwiIFtpbm5lckhUTUxdPVwiZm9ybWF0TWVzc2FnZVdpdGhUYWdzKGNvbW1lbnQudGV4dClcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNheC1jb21tZW50LWRhdGVcIj57eyBjb21tZW50LmRhdGUgfCBkYXRlOiAnc2hvcnRUaW1lJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRtaW4gTWVzc2FnZSAoUmlnaHQgQWxpZ25lZCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21tZW50LmlzQWRtaW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudC1jb250ZW50IGFkbWluXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1maWxlLWF0dGFjaG1lbnRcIiAqbmdJZj1cImNvbW1lbnQuZmlsZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIGNvbW1lbnQuZmlsZXNcIiBjbGFzcz1cImZpbGUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1uYW1lXCI+e3sgZmlsZS5uYW1lLnNsaWNlKDAsIDIwKSB9fXt7IGZpbGUubmFtZS5pbmNsdWRlcygnLicpID8gJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCkgOiAnJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtc2l6ZVwiPnt7ZmlsZS5zaXplfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2F4IGNheC1kb3dubG9hZFwiIChjbGljayk9XCJvbkZpbGVEb3dubG9hZChmaWxlKVwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudC10ZXh0XCIgW2lubmVySFRNTF09XCJmb3JtYXRNZXNzYWdlV2l0aFRhZ3MoY29tbWVudC50ZXh0KVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F4LWNvbW1lbnQtZGF0ZVwiPnt7IGNvbW1lbnQuZGF0ZSB8IGRhdGU6ICdzaG9ydFRpbWUnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPCEtLSA8L25nLXRlbXBsYXRlPiAtLT5cclxuICAgIDxjYXgtb3ZlcmxheSAjc3VnZ2VzdGlvblBhbmVsIFsodmlzaWJsZSldPVwib3ZlcmxheVZpc2libGVcIiBbYXBwZW5kVG9dPVwiaW5wdXRUZXh0XCIgKG9uSGlkZSk9XCJvblN1Z2dlc3Rpb25QYW5lbEhpZGUoKVwiIFtzdHlsZUNsYXNzXT1cIidzdWdnZXN0aW9uLXBhbmVsJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWdnZXN0aW9uLWxpc3RcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZFN1Z2dlc3Rpb25zOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJzdWdnZXN0aW9uLWl0ZW1cIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPT09IGl9XCIgKGNsaWNrKT1cIm9uU3VnZ2VzdGlvblNlbGVjdChpdGVtKVwiIChtb3VzZWVudGVyKT1cInNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gaVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWdnZXN0aW9uLWxhYmVsXCI+e3tpdGVtLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInN1Z2dlc3Rpb24taWRcIiAqbmdJZj1cImN1cnJlbnRUb2tlblR5cGUgPT09ICdtZW50aW9uJ1wiPnt7aXRlbS5pZH19PC9zbWFsbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2NheC1vdmVybGF5PlxyXG4gICAgPGNheC1vdmVybGF5XHJcbiAgICAgICAgWyh2aXNpYmxlKV09XCJmaWxlc092ZXJsYXlWaXNpYmxlXCJcclxuICAgICAgICBbYXBwZW5kVG9dPVwiY291bnRDaGlwXCJcclxuICAgICAgICBbc2hvd1RyYW5zaXRpb25PcHRpb25zXT1cIicwLjEycyBlYXNlLW91dCdcIlxyXG4gICAgICAgIFtoaWRlVHJhbnNpdGlvbk9wdGlvbnNdPVwiJzAuMXMgZWFzZS1pbidcIlxyXG4gICAgICAgIFtzdHlsZV09XCJ7IHdpZHRoOiAnMjI0cHgnLCByaWdodDogJzUlJyB9XCJcclxuICAgICAgICBzdHlsZUNsYXNzPVwiZmlsZXMtbGlzdC1vdmVybGF5XCJcclxuICAgICAgICAob25IaWRlKT1cImhpZGVGaWxlc092ZXJsYXkoKVwiXHJcbiAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVzLW92ZXJsYXktY29udGVudFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlIG9mIHNlbGVjdGVkRmlsZXMuc2xpY2UoNCk7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZpbGUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLW5hbWVcIj57e2dldFNob3J0RmlsZU5hbWUoZmlsZS5uYW1lKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjYXggY2F4LWNsb3NlLWNpcmNsZVwiIChjbGljayk9XCJyZW1vdmVGaWxlKGkgKyA0KVwiPjwvaT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2NheC1vdmVybGF5PlxyXG5cclxuICAgIDwhLS0gPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwiZm9vdGVyXCI+IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGF0LWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZmlsZXNcIiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGNheC1jaGlwICpuZ0Zvcj1cImxldCBmaWxlIG9mIHNlbGVjdGVkRmlsZXMuc2xpY2UoMCwgNCk7IGxldCBpID0gaW5kZXhcIiBbbGFiZWxdPVwiZ2V0U2hvcnRGaWxlTmFtZShmaWxlLm5hbWUpXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgW3NpemVdPVwiJ2xnJ1wiIChvblJlbW92ZSk9XCJyZW1vdmVGaWxlKGksIHRydWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGNheFRlbXBsYXRlPVwiY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtcGFwZXJjbGlwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2NheC1jaGlwPlxyXG4gICAgICAgICAgICAgICAgPGNheC1jaGlwICNjb3VudENoaXAgKm5nSWY9XCJzZWxlY3RlZEZpbGVzLmxlbmd0aCA+IDRcIiBbbGFiZWxdPVwiJysnICsgZ2V0T3ZlcmZsb3dDb3VudCgpXCIgW3NpemVdPVwiJ2xnJ1wiIChtb3VzZWVudGVyKT1cInNob3dGaWxlc092ZXJsYXkoJGV2ZW50KVwiPiA8L2NheC1jaGlwPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1jaGF0LWlucHV0LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2F4LWlucHV0dGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld0NvbW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCInbGcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JpZ2h0SWNvbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsZWFySWNvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyaWdodEljb25DbGFzc109XCInY2F4IGNheC1wYXBlcmNsaXAnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3JpZ2h0SWNvbkNsaWNrYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0SWNvbkNsaWNrKT1cIm9uRmlsZUljb25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDb21tZW50IG9yIG1lbnRpb24gb3RoZXJzIHdpdGggQCwg4oCYI+KAmSBmb3IgY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJoYW5kbGVLZXlVcCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwieydjaGF0LWlucHV0JzogdHJ1ZSwgJ2FkbWluLWlucHV0JzogaXNBZG1pblNlbmRlcn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzhweCcsIGJhY2tncm91bmQ6ICcjZmZmZmZmJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvY2F4LWlucHV0dGV4dD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxjYXgtYnV0dG9uIFtpY29uXT1cIidjYXggY2F4LXBsYWluJ1wiIFtzZXZlcml0eV09XCIncHJpbWFyeSdcIiBbc2l6ZV09XCInbGFyZ2UnXCIgKGNsaWNrKT1cImFkZENvbW1lbnQoKVwiIFtkaXNhYmxlZF09XCIhbmV3Q29tbWVudC50cmltKCkgJiYgc2VsZWN0ZWRGaWxlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInNlbmQtYnV0dG9uXCI+IDwvY2F4LWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8aW5wdXQgI2ZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0KCRldmVudClcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBhY2NlcHQ9XCIqLypcIiBtdWx0aXBsZSAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPCEtLSA8L25nLXRlbXBsYXRlPiAtLT5cclxuPC9kaXY+XHJcbiJdfQ==
574
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9jb21tZW50Ym94L2NvbW1lbnRib3gudHMiLCIuLi8uLi8uLi9zcmMvYXBwL2NvbXBvbmVudHMvY29tbWVudGJveC9jb21tZW50Ym94Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7OztBQXNCcEgsTUFBTSxPQUFPLG1CQUFtQjtJQXdEaEI7SUFDQTtJQXhESixTQUFTLEdBQWMsRUFBRSxDQUFDO0lBQ2xDLElBQWEsUUFBUSxDQUFDLEtBQWdCO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBQ1Esa0JBQWtCLEdBQVUsRUFBRSxDQUFDO0lBQy9CLGtCQUFrQixHQUFVLEVBQUUsQ0FBQztJQUMvQixhQUFhLENBQVM7SUFDdEIsT0FBTyxHQUFZLElBQUksQ0FBQztJQUN4QixXQUFXLEdBQVcsbURBQW1ELENBQUM7SUFDekUsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDdkMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDeEMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO0lBQ2xFLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQzVDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBQ25E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QUs7Z0JBT0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFZaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNRLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNKLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDYSxZQUFZO3NCQUE5QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0QsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQXlKVCxPQUFPO3NCQUFuQixLQUFLO2dCQThDTixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG4vLyBBZGQgdGhpcyBpbnRlcmZhY2UgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZVxuaW50ZXJmYWNlIENvbW1lbnQge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBkYXRlOiBEYXRlO1xuICAgIGZpbGVzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHNpemU6IHN0cmluZyB9PjtcbiAgICBpc0FkbWluPzogYm9vbGVhbjtcbiAgICBzZW5kZXI/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHcm91cGVkQ29tbWVudHMge1xuICAgIGRhdGU6IERhdGU7XG4gICAgaXRlbXM6IENvbW1lbnRbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdjYXgtY29tbWVudHMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50Ym94Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbW1lbnRib3guc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbW1lbnRib3hDb21wb25lbnQge1xuICAgIHByaXZhdGUgX2NvbW1lbnRzOiBDb21tZW50W10gPSBbXTtcbiAgICBASW5wdXQoKSBzZXQgY29tbWVudHModmFsdWU6IENvbW1lbnRbXSkge1xuICAgICAgICB0aGlzLl9jb21tZW50cyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICAgICAgdGhpcy5yZWNvbXB1dGVHcm91cGVkQ29tbWVudHMoKTtcbiAgICB9XG4gICAgZ2V0IGNvbW1lbnRzKCk6IENvbW1lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21tZW50cztcbiAgICB9XG4gICAgQElucHV0KCkgbWVudGlvblN1Z2dlc3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIEBJbnB1dCgpIGhhc2h0YWdTdWdnZXN0aW9uczogYW55W10gPSBbXTtcbiAgICBASW5wdXQoKSBzaWRlYmFySGVhZGVyOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaXNBZG1pbjogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdDb21tZW50IG9yIG1lbnRpb24gb3RoZXJzIHdpdGggQCwg4oCYI+KAmSBmb3IgY29sdW1ucyc7XG4gICAgQE91dHB1dCgpIGNvbW1lbnRBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBmaWxlU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGU+KCk7XG4gICAgQE91dHB1dCgpIGZpbGVEb3dubG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IHNpemU6IHN0cmluZyB9PigpO1xuICAgIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIEBPdXRwdXQoKSBvblNpZGViYXJIaWRlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIG5ld0NvbW1lbnQ6IHN0cmluZyA9ICcnO1xuXG4gICAgaXNNZW50aW9uaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNIYXNodGFnZ2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHN1Z2dlc3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIHNlbGVjdGVkU3VnZ2VzdGlvbjogYW55ID0gbnVsbDtcbiAgICBzZWxlY3RlZFN1Z2dlc3Rpb25JbmRleDogbnVtYmVyID0gLTE7XG4gICAgZmlsdGVyZWRTdWdnZXN0aW9uczogYW55W10gPSBbXTtcbiAgICBjdXJyZW50VG9rZW5UeXBlOiAnbWVudGlvbicgfCAnaGFzaHRhZycgfCBudWxsID0gbnVsbDtcbiAgICBjdXJzb3JQb3NpdGlvbjogbnVtYmVyID0gMDtcblxuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgnc3VnZ2VzdGlvblBhbmVsJykgc3VnZ2VzdGlvblBhbmVsITogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdpbnB1dFRleHQnKSBpbnB1dFRleHQhOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRzTGlzdCcpIHByaXZhdGUgY29tbWVudHNMaXN0ITogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdjb3VudENoaXAnKSBjb3VudENoaXAhOiBFbGVtZW50UmVmO1xuICAgIHNlbGVjdGVkRmlsZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBzaXplOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBzZWxlY3RlZEZpbGVzTWFwOiBNYXA8bnVtYmVyLCB7IG5hbWU6IHN0cmluZzsgc2l6ZTogc3RyaW5nIH0+ID0gbmV3IE1hcCgpO1xuXG4gICAgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGdyb3VwZWRDb21tZW50c0NhY2hlOiBHcm91cGVkQ29tbWVudHNbXSA9IFtdO1xuXG4gICAgb3ZlcmxheVZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBmaWxlc092ZXJsYXlWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICAgb3ZlcmxheVBvc2l0aW9uID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuICAgIHByaXZhdGUgZGF0ZVVwZGF0ZUludGVydmFsOiBhbnk7XG5cbiAgICAvLyBLZWVwIHRyYWNrIG9mIHNob3VsZCBhdXRvIHNjcm9sbFxuICAgIHByaXZhdGUgc2hvdWxkQXV0b1Njcm9sbCA9IHRydWU7XG4gICAgcHJpdmF0ZSBpc1VzZXJTY3JvbGxpbmcgPSBmYWxzZTtcblxuICAgIC8vIEFkZCBuZXcgcHJvcGVydHkgZm9yIG11dGF0aW9uIG9ic2VydmVyXG4gICAgcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIHNjcm9sbFF1ZXVlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50RGF0ZSgpO1xuICAgICAgICAvLyBSdW4gdGhlIGludGVydmFsIG91dHNpZGUgQW5ndWxhciB0byBhdm9pZCBmcmVxdWVudCBjaGFuZ2UgZGV0ZWN0aW9uIGluIGRvY3MvY2FudmFzXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVVwZGF0ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnVwZGF0ZUN1cnJlbnREYXRlKCkpO1xuICAgICAgICAgICAgfSwgNjAwMDApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JjZVNjcm9sbFRvQm90dG9tKCk7XG4gICAgICAgIH0sIDEwMCk7XG5cbiAgICAgICAgLy8gU2V0IHVwIG9ic2VydmVyIHRvIGF1dG8tc2Nyb2xsIHdoZW4gY29udGVudCBjaGFuZ2VzIChvdXRzaWRlIEFuZ3VsYXIpXG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnRzTGlzdD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbFF1ZXVlZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcmNlU2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsUXVldWVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbW1lbnRzTGlzdC5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0ZVVwZGF0ZUludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuZGF0ZVVwZGF0ZUludGVydmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBvYnNlcnZlclxuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcblxuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ3VycmVudERhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGRheTogJzItZGlnaXQnLFxuICAgICAgICAgICAgbW9udGg6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIHRpbWVab25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9ybWF0TWVzc2FnZVdpdGhUYWdzKHRleHQ6IHN0cmluZyk6IFNhZmVIdG1sIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNhbml0aXplZFRleHQgPSB0ZXh0LnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTtcbiAgICAgICAgY29uc3QgaHRtbENvbnRlbnQgPSBzYW5pdGl6ZWRUZXh0LnJlcGxhY2UoLyhAXFx3K3wjXFx3KykvZywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICBpZiAobWF0Y2guc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cIm1lbnRpb25cIiBzdHlsZT1cImNvbG9yOiAjMEM0QUYzOyBmb250LXdlaWdodDogNjAwO1wiPiR7bWF0Y2h9PC9zcGFuPmA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1hdGNoLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJoYXNodGFnXCIgc3R5bGU9XCJjb2xvcjogIzBDNEFGMzsgZm9udC13ZWlnaHQ6IDYwMDtcIj4ke21hdGNofTwvc3Bhbj5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaHRtbENvbnRlbnQpO1xuICAgIH1cblxuICAgIGFkZENvbW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm5ld0NvbW1lbnQudHJpbSgpIHx8IHRoaXMuc2VsZWN0ZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdDb21tZW50OiBDb21tZW50ID0ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubmV3Q29tbWVudCxcbiAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIGZpbGVzOiB0aGlzLnNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMCA/IFsuLi50aGlzLnNlbGVjdGVkRmlsZXNdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGlzQWRtaW46IHRoaXMuaXNBZG1pbixcbiAgICAgICAgICAgICAgICBzZW5kZXI6IHRoaXMuaXNBZG1pbiA/ICdTeXN0ZW0gQWRtaW4nIDogJ1VzZXInXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzID0gWy4uLnRoaXMuY29tbWVudHMsIG5ld0NvbW1lbnRdO1xuICAgICAgICAgICAgdGhpcy5jb21tZW50QWRkZWQuZW1pdChuZXdDb21tZW50KTtcbiAgICAgICAgICAgIHRoaXMubmV3Q29tbWVudCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzID0gW107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXNNYXAuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZXNPdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdWdnZXN0aW9uUGFuZWw/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25QYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFsd2F5cyBzY3JvbGwgdG8gYm90dG9tIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbXB1dGVHcm91cGVkQ29tbWVudHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9yY2VTY3JvbGxUb0JvdHRvbSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbW1lbnRzTGlzdD8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb21tZW50c0xpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gZWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9Cb3R0b20oZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VTY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb21tZW50c0xpc3Q/Lm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb21tZW50c0xpc3QubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyBTaW5nbGUgUkFGIHRvIGF2b2lkIG5lc3RlZCBzY2hlZHVsaW5nIG92ZXJoZWFkIGluIFN0b3J5Ym9va1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsVG8oeyB0b3A6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Zpc2libGUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkQXV0b1Njcm9sbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQm90dG9tKHRydWUpLCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHRvZ2dsZUNvbW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlQ29tbWVudHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93Q29tbWVudHMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkQXV0b1Njcm9sbCA9IHRydWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20odHJ1ZSksIDMwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlQ29tbWVudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl92aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLm9uU2lkZWJhckhpZGUuZW1pdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlU2lkZWJhckhpZGUoKSB7XG4gICAgICAgIHRoaXMuaGlkZUNvbW1lbnRzKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICAgIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlzSW5wdXRDbGljayA9IHRoaXMuaW5wdXRUZXh0Py5uYXRpdmVFbGVtZW50Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgICBjb25zdCBpc1BhbmVsQ2xpY2sgPSB0aGlzLnN1Z2dlc3Rpb25QYW5lbD8ubmF0aXZlRWxlbWVudD8uY29udGFpbnModGFyZ2V0KTtcblxuICAgICAgICBpZiAoIWlzSW5wdXRDbGljayAmJiAhaXNQYW5lbENsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlVcChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFVwZGF0ZSBjdXJzb3IgcG9zaXRpb24gb24gZXZlcnkga2V5IHByZXNzXG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcblxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0AnIHx8IGV2ZW50LmtleSA9PT0gJyMnKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSBldmVudC5rZXkgPT09ICdAJyA/ICdtZW50aW9uJyA6ICdoYXNodGFnJztcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHRoaXMuY3VycmVudFRva2VuVHlwZSA9PT0gJ21lbnRpb24nID8gdGhpcy5tZW50aW9uU3VnZ2VzdGlvbnMgOiB0aGlzLmhhc2h0YWdTdWdnZXN0aW9ucztcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSAwO1xuXG4gICAgICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JQb3NpdGlvbiA9IHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oaW5wdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5zdWdnZXN0aW9uUGFuZWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnN0eWxlLmxlZnQgPSBgJHtyZWN0LmxlZnQgKyBjdXJzb3JQb3NpdGlvbi5sZWZ0fXB4YDtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwuc3R5bGUudG9wID0gYCR7cmVjdC50b3AgLSAxMH1weGA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50VG9rZW5UeXBlKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0VG9rZW5BdEN1cnNvcihpbnB1dC52YWx1ZSwgdGhpcy5jdXJzb3JQb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gdG9rZW4uc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSAodGhpcy5jdXJyZW50VG9rZW5UeXBlID09PSAnbWVudGlvbicgPyB0aGlzLm1lbnRpb25TdWdnZXN0aW9ucyA6IHRoaXMuaGFzaHRhZ1N1Z2dlc3Rpb25zKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pIHx8IGl0ZW0uaWQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hUZXJtKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVzZXQgc2VsZWN0aW9uIGluZGV4IGlmIHdlIGhhdmUgbmV3IHN1Z2dlc3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4IDwgMCB8fCB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID49IHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFRva2VuQXRDdXJzb3IodGV4dDogc3RyaW5nLCBjdXJzb3JQb3M6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBiZWZvcmVDdXJzb3IgPSB0ZXh0LnNsaWNlKDAsIGN1cnNvclBvcyk7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gYmVmb3JlQ3Vyc29yLm1hdGNoKC9bQCNdW15cXHNdKiQvKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIGdldFdvcmRBdFBvc2l0aW9uKHRleHQ6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0ZXh0LnNsaWNlKDAsIHBvc2l0aW9uKS5zZWFyY2goL1tAI11bXlxcc10qJC8pO1xuICAgICAgICBpZiAobGVmdCA9PT0gLTEpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UobGVmdCwgcG9zaXRpb24pO1xuICAgIH1cblxuICAgIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogYW55KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5uZXdDb21tZW50O1xuICAgICAgICBjb25zdCB3b3JkU3RhcnQgPSBpbnB1dC5zbGljZSgwLCB0aGlzLmN1cnNvclBvc2l0aW9uKS5zZWFyY2goL1tAI11bXlxcc10qJC8pO1xuXG4gICAgICAgIHRoaXMubmV3Q29tbWVudCA9IGlucHV0LnNsaWNlKDAsIHdvcmRTdGFydCkgKyBzdWdnZXN0aW9uLnZhbHVlICsgJyAnICsgaW5wdXQuc2xpY2UodGhpcy5jdXJzb3JQb3NpdGlvbik7XG5cbiAgICAgICAgdGhpcy5pc01lbnRpb25pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0hhc2h0YWdnaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb25TdWdnZXN0aW9uU2VsZWN0KGl0ZW06IGFueSkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMubmV3Q29tbWVudDtcbiAgICAgICAgY29uc3QgYmVmb3JlQ3Vyc29yID0gaW5wdXQuc2xpY2UoMCwgdGhpcy5jdXJzb3JQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGFmdGVyQ3Vyc29yID0gaW5wdXQuc2xpY2UodGhpcy5jdXJzb3JQb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGxhc3RUb2tlbkluZGV4ID0gTWF0aC5tYXgoYmVmb3JlQ3Vyc29yLmxhc3RJbmRleE9mKCdAJyksIGJlZm9yZUN1cnNvci5sYXN0SW5kZXhPZignIycpKTtcblxuICAgICAgICBpZiAobGFzdFRva2VuSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBzdWdnZXN0aW9uIGF0IHRoZSBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgICAgIHRoaXMubmV3Q29tbWVudCA9IGJlZm9yZUN1cnNvci5zbGljZSgwLCBsYXN0VG9rZW5JbmRleCkgKyBpdGVtLmlkICsgJyAnICsgYWZ0ZXJDdXJzb3I7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1Z2dlc3Rpb25QYW5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSAtMTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RWwgPSB0aGlzLmlucHV0VGV4dC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgICAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25TdWdnZXN0aW9uUGFuZWxIaWRlKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgZ2V0Q3Vyc29yUG9zaXRpb24oaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvblN0YXJ0ID0gaW5wdXQuc2VsZWN0aW9uU3RhcnQgfHwgMDtcbiAgICAgICAgY29uc3QgdGV4dEJlZm9yZUN1cnNvciA9IGlucHV0LnZhbHVlLnN1YnN0cmluZygwLCBzZWxlY3Rpb25TdGFydCk7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0ZXh0QmVmb3JlQ3Vyc29yO1xuICAgICAgICBzcGFuLnN0eWxlLmNzc1RleHQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbnB1dCwgbnVsbCkuY3NzVGV4dDtcbiAgICAgICAgc3Bhbi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0ge1xuICAgICAgICAgICAgbGVmdDogc3Bhbi5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIHRvcDogc3Bhbi5vZmZzZXRIZWlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzcGFuKTtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIG9uRmlsZUljb25DbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuZmlsZUlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkZpbGVTZWxlY3QoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmIChpbnB1dC5maWxlcyAmJiBpbnB1dC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKGlucHV0LmZpbGVzKS5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlRXhpc3RzID0gdGhpcy5zZWxlY3RlZEZpbGVzLnNvbWUoKGV4aXN0aW5nRmlsZSkgPT4gZXhpc3RpbmdGaWxlLm5hbWUgPT09IGZpbGUubmFtZSAmJiBleGlzdGluZ0ZpbGUuc2l6ZSA9PT0gdGhpcy5mb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpKTtcblxuICAgICAgICAgICAgICAgIGlmICghZmlsZUV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlSW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHRoaXMuZm9ybWF0RmlsZVNpemUoZmlsZS5zaXplKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlc01hcC5zZXQodGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCAtIDEsIGZpbGVJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlU2VsZWN0ZWQuZW1pdChmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2hhdC1pbnB1dCBpbnB1dCcpO1xuICAgICAgICAgICAgaWYgKGlucHV0RWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlucHV0RWwuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsZVN0YXRlKGluZGV4OiBudW1iZXIsIGZyb21DaGlwOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBhY3R1YWxJbmRleCA9IGZyb21DaGlwID8gaW5kZXggOiBpbmRleCArIDQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IHRoaXMuc2VsZWN0ZWRGaWxlcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGFjdHVhbEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGVzTWFwLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlcy5mb3JFYWNoKChmaWxlLCBpKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmlsZXNNYXAuc2V0KGksIGZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVGaWxlKGluZGV4OiBudW1iZXIsIGZyb21DaGlwOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbGVTdGF0ZShpbmRleCwgZnJvbUNoaXApO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVGaWxlc092ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE92ZXJmbG93Q291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gUmV0dXJuIGNvdW50IG9mIGZpbGVzIGJleW9uZCB0aGUgZmlyc3QgNFxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5zZWxlY3RlZEZpbGVzLmxlbmd0aCAtIDQpO1xuICAgIH1cblxuICAgIHNob3dGaWxlc092ZXJsYXkoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBQb3NpdGlvbiB0aGUgb3ZlcmxheSBiZWxvdyB0aGUgY291bnQgY2hpcFxuICAgICAgICB0aGlzLm92ZXJsYXlQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHRvcDogcmVjdC5ib3R0b20gKyA1LFxuICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0IC0gMjUwICsgcmVjdC53aWR0aCAvIDIgLy8gQ2VudGVyIHRoZSBvdmVybGF5IGhvcml6b250YWxseVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZmlsZXNPdmVybGF5VmlzaWJsZSA9IHRydWU7XG5cbiAgICAgICAgLy8gQWRkIGEgY2xpY2sgb3V0c2lkZSBsaXN0ZW5lciB0byBjbG9zZSB0aGUgb3ZlcmxheVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoaWRlRmlsZXNPdmVybGF5KCkge1xuICAgICAgICB0aGlzLmZpbGVzT3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZpbGVzLW92ZXJsYXknKTtcbiAgICAgICAgY29uc3QgY291bnRDaGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvdW50LWNoaXAnKTtcblxuICAgICAgICBpZiAob3ZlcmxheSAmJiAhb3ZlcmxheS5jb250YWlucyh0YXJnZXQpICYmIGNvdW50Q2hpcCAmJiAhY291bnRDaGlwLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZUZpbGVzT3ZlcmxheSgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XG4gICAgICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgICAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InXTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgyKSkgKyAnICcgKyBzaXplc1tpXTtcbiAgICB9XG5cbiAgICBzaG93U3VnZ2VzdGlvbnMoX2V2ZW50OiBhbnksIHR5cGU6ICdtZW50aW9uJyB8ICdoYXNodGFnJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSB0eXBlID09PSAnbWVudGlvbicgPyB0aGlzLm1lbnRpb25TdWdnZXN0aW9ucyA6IHRoaXMuaGFzaHRhZ1N1Z2dlc3Rpb25zO1xuICAgICAgICBpZiAodGhpcy5zdWdnZXN0aW9uUGFuZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvblBhbmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIC8vIElmIHN1Z2dlc3Rpb25zIGFyZSB2aXNpYmxlLCBoYW5kbGUga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSAmJiB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4ID0gTWF0aC5taW4odGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCArIDEsIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWdnZXN0aW9uSW50b1ZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSBNYXRoLm1heCh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbkluZGV4IC0gMSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3VnZ2VzdGlvbkludG9WaWV3KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hpZnQrVGFiIC0gbW92ZSB1cFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IE1hdGgubWF4KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggLSAxLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhYiAtIG1vdmUgZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9IE1hdGgubWluKHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggKyAxLCB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTdWdnZXN0aW9uSW50b1ZpZXcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3VnZ2VzdGlvblNlbGVjdCh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb25JbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdWdnZXN0aW9uUGFuZWxIaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gc3VnZ2VzdGlvbnMgYXJlIHZpc2libGUsIGhhbmRsZSBub3JtYWwgZW50ZXIga2V5IHByZXNzXG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5hZGRDb21tZW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgbWV0aG9kIHRvIHNjcm9sbCB0aGUgc2VsZWN0ZWQgc3VnZ2VzdGlvbiBpbnRvIHZpZXdcbiAgICBwcml2YXRlIHNjcm9sbFN1Z2dlc3Rpb25JbnRvVmlldygpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9uTGlzdCA9IHRoaXMuc3VnZ2VzdGlvblBhbmVsPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zdWdnZXN0aW9uLWxpc3QnKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHN1Z2dlc3Rpb25MaXN0Py5xdWVyeVNlbGVjdG9yKCcuc3VnZ2VzdGlvbi1pdGVtLnNlbGVjdGVkJyk7XG5cbiAgICAgICAgICAgIGlmIChzdWdnZXN0aW9uTGlzdCAmJiBzZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0UmVjdCA9IHN1Z2dlc3Rpb25MaXN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWN0ID0gc2VsZWN0ZWRJdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgb3V0c2lkZSB0aGUgdmlzaWJsZSBhcmVhXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1SZWN0LmJvdHRvbSA+IGxpc3RSZWN0LmJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJdGVtIGlzIGJlbG93IHRoZSB2aXNpYmxlIGFyZWFcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtUmVjdC50b3AgPCBsaXN0UmVjdC50b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlbSBpcyBhYm92ZSB0aGUgdmlzaWJsZSBhcmVhXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbS5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkZpbGVEb3dubG9hZChmaWxlOiB7IG5hbWU6IHN0cmluZzsgc2l6ZTogc3RyaW5nIH0pIHtcbiAgICAgICAgdGhpcy5maWxlRG93bmxvYWQuZW1pdChmaWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY29tcHV0ZUdyb3VwZWRDb21tZW50cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fY29tbWVudHMucmVkdWNlKChhY2M6IEdyb3VwZWRDb21tZW50c1tdLCBjb21tZW50OiBDb21tZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50RGF0ZSA9IG5ldyBEYXRlKGNvbW1lbnQuZGF0ZSk7XG4gICAgICAgICAgICBjb21tZW50RGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IGFjYy5maW5kKChncm91cCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRGF0ZSA9IG5ldyBEYXRlKGdyb3VwLmRhdGUpO1xuICAgICAgICAgICAgICAgIGdyb3VwRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBEYXRlLmdldFRpbWUoKSA9PT0gY29tbWVudERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChleGlzdGluZ0dyb3VwKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdHcm91cC5pdGVtcy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhY2MucHVzaCh7IGRhdGU6IGNvbW1lbnREYXRlLCBpdGVtczogW2NvbW1lbnRdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIHRoaXMuZ3JvdXBlZENvbW1lbnRzQ2FjaGUgPSBncm91cHMuc29ydCgoYSwgYikgPT4gYS5kYXRlLmdldFRpbWUoKSAtIGIuZGF0ZS5nZXRUaW1lKCkpO1xuICAgIH1cblxuICAgIGdldFNob3J0RmlsZU5hbWUoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChmaWxlbmFtZS5sZW5ndGggPD0gNCkgcmV0dXJuIGZpbGVuYW1lO1xuXG4gICAgICAgIC8vIEdldCBmaWxlIGV4dGVuc2lvblxuICAgICAgICBjb25zdCBsYXN0RG90SW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBsYXN0RG90SW5kZXggIT09IC0xID8gZmlsZW5hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCkgOiAnJztcblxuICAgICAgICAvLyBUcnVuY2F0ZSB0aGUgbmFtZSBwYXJ0IGFuZCBhZGQgdGhlIGV4dGVuc2lvblxuICAgICAgICBjb25zdCBuYW1lUGFydCA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXggIT09IC0xID8gbGFzdERvdEluZGV4IDogZmlsZW5hbWUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG5hbWVQYXJ0LnN1YnN0cmluZygwLCA0KSArICcuLicgKyBleHRlbnNpb247XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cInZpc2libGVcIiBjbGFzcz1cImNheC1jb21tZW50cy13cmFwcGVyXCI+XHJcbiAgICA8IS0tIDxuZy10ZW1wbGF0ZSBjYXhUZW1wbGF0ZT1cImNvbnRlbnRcIj4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2F4LWNvbW1lbnRzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudHMtbGlzdFwiICNjb21tZW50c0xpc3Q+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGdyb3VwZWRDb21tZW50c0NhY2hlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWRhdGUtaGVhZGVyXCI+e3sgZm9ybWF0RGF0ZShncm91cC5kYXRlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2F4LWNvbW1lbnQtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbW1lbnQgb2YgZ3JvdXAuaXRlbXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXgtdXNlci1jb21tZW50JzogIWNvbW1lbnQuaXNBZG1pbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXgtYWRtaW4tY29tbWVudCc6IGNvbW1lbnQuaXNBZG1pbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zZWN1dGl2ZS1tZXNzYWdlJzogaSA+IDAgJiYgY29tbWVudC5pc0FkbWluID09PSBncm91cC5pdGVtc1tpLTFdLmlzQWRtaW4gJiYgY29tbWVudC5zZW5kZXIgPT09IGdyb3VwLml0ZW1zW2ktMV0uc2VuZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ldy1zZW5kZXInOiBpID4gMCAmJiBjb21tZW50LnNlbmRlciAhPT0gZ3JvdXAuaXRlbXNbaS0xXS5zZW5kZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3LWRhdGUnOiBpID09PSAwICYmIGdyb3VwLml0ZW1zLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBVc2VyIE1lc3NhZ2UgKExlZnQgQWxpZ25lZCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb21tZW50LmlzQWRtaW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1jb21tZW50Ym94LWF2YXRhci1jb250YWluZXJcIiAqbmdJZj1cImkgPT09IDAgfHwgZ3JvdXAuaXRlbXNbaS0xXS5zZW5kZXIgIT09IGNvbW1lbnQuc2VuZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2F4LWF2YXRhciBbbGFiZWxdPVwiY29tbWVudC5zZW5kZXI/LnN1YnN0cmluZygwLCAyKS50b1VwcGVyQ2FzZSgpIHx8ICdVJ1wiIFthdmF0YXJTaXplXT1cIid4cydcIiBbc2hhcGVdPVwiJ2NpcmNsZSdcIiBzdHlsZWNsYXNzPVwiY2F4LWNvbW1lbnRib3gtYXZhdGFyXCI+IDwvY2F4LWF2YXRhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudC1jb250ZW50XCIgW2NsYXNzLm5vLWF2YXRhcl09XCJpID4gMCAmJiBncm91cC5pdGVtc1tpLTFdLnNlbmRlciA9PT0gY29tbWVudC5zZW5kZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudC1zZW5kZXJcIiAqbmdJZj1cImkgPT09IDAgfHwgZ3JvdXAuaXRlbXNbaS0xXS5zZW5kZXIgIT09IGNvbW1lbnQuc2VuZGVyXCI+e3tjb21tZW50LnNlbmRlcn19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWZpbGUtYXR0YWNobWVudFwiICpuZ0lmPVwiY29tbWVudC5maWxlcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZSBvZiBjb21tZW50LmZpbGVzXCIgY2xhc3M9XCJmaWxlLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLW5hbWVcIj57eyBmaWxlLm5hbWUuc2xpY2UoMCwgMjApIH19e3sgZmlsZS5uYW1lLmluY2x1ZGVzKCcuJykgPyAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKSA6ICcnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWxlLXNpemVcIj57e2ZpbGUuc2l6ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJjYXggY2F4LWRvd25sb2FkXCIgKGNsaWNrKT1cIm9uRmlsZURvd25sb2FkKGZpbGUpXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1jb21tZW50LXRleHRcIiBbaW5uZXJIVE1MXT1cImZvcm1hdE1lc3NhZ2VXaXRoVGFncyhjb21tZW50LnRleHQpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNheC1jb21tZW50LWRhdGVcIj57eyBjb21tZW50LmRhdGUgfCBkYXRlOiAnc2hvcnRUaW1lJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQWRtaW4gTWVzc2FnZSAoUmlnaHQgQWxpZ25lZCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbW1lbnQuaXNBZG1pblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F4LWNvbW1lbnQtY29udGVudCBhZG1pblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNheC1maWxlLWF0dGFjaG1lbnRcIiAqbmdJZj1cImNvbW1lbnQuZmlsZXM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgY29tbWVudC5maWxlc1wiIGNsYXNzPVwiZmlsZS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1uYW1lXCI+e3sgZmlsZS5uYW1lLnNsaWNlKDAsIDIwKSB9fXt7IGZpbGUubmFtZS5pbmNsdWRlcygnLicpID8gJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCkgOiAnJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZS1zaXplXCI+e3tmaWxlLnNpemV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiY2F4IGNheC1kb3dubG9hZFwiIChjbGljayk9XCJvbkZpbGVEb3dubG9hZChmaWxlKVwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY29tbWVudC10ZXh0XCIgW2lubmVySFRNTF09XCJmb3JtYXRNZXNzYWdlV2l0aFRhZ3MoY29tbWVudC50ZXh0KVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXgtY29tbWVudC1kYXRlXCI+e3sgY29tbWVudC5kYXRlIHwgZGF0ZTogJ3Nob3J0VGltZScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIDwvbmctdGVtcGxhdGU+IC0tPlxyXG4gICAgPGNheC1vdmVybGF5ICNzdWdnZXN0aW9uUGFuZWwgWyh2aXNpYmxlKV09XCJvdmVybGF5VmlzaWJsZVwiIFthcHBlbmRUb109XCJpbnB1dFRleHRcIiAob25IaWRlKT1cIm9uU3VnZ2VzdGlvblBhbmVsSGlkZSgpXCIgW3N0eWxlQ2xhc3NdPVwiJ3N1Z2dlc3Rpb24tcGFuZWwnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkU3VnZ2VzdGlvbnM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cInN1Z2dlc3Rpb24taXRlbVwiIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQnOiBzZWxlY3RlZFN1Z2dlc3Rpb25JbmRleCA9PT0gaX1cIiAoY2xpY2spPVwib25TdWdnZXN0aW9uU2VsZWN0KGl0ZW0pXCIgKG1vdXNlZW50ZXIpPVwic2VsZWN0ZWRTdWdnZXN0aW9uSW5kZXggPSBpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Z2dlc3Rpb24tbGFiZWxcIj57e2l0ZW0ubmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwic3VnZ2VzdGlvbi1pZFwiICpuZ0lmPVwiY3VycmVudFRva2VuVHlwZSA9PT0gJ21lbnRpb24nXCI+e3tpdGVtLmlkfX08L3NtYWxsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvY2F4LW92ZXJsYXk+XHJcbiAgICA8Y2F4LW92ZXJsYXlcclxuICAgICAgICBbKHZpc2libGUpXT1cImZpbGVzT3ZlcmxheVZpc2libGVcIlxyXG4gICAgICAgIFthcHBlbmRUb109XCJjb3VudENoaXBcIlxyXG4gICAgICAgIFtzaG93VHJhbnNpdGlvbk9wdGlvbnNdPVwiJzAuMTJzIGVhc2Utb3V0J1wiXHJcbiAgICAgICAgW2hpZGVUcmFuc2l0aW9uT3B0aW9uc109XCInMC4xcyBlYXNlLWluJ1wiXHJcbiAgICAgICAgW3N0eWxlXT1cInsgd2lkdGg6ICcyMjRweCcsIHJpZ2h0OiAnNSUnIH1cIlxyXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJmaWxlcy1saXN0LW92ZXJsYXlcIlxyXG4gICAgICAgIChvbkhpZGUpPVwiaGlkZUZpbGVzT3ZlcmxheSgpXCJcclxuICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZXMtb3ZlcmxheS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2Ygc2VsZWN0ZWRGaWxlcy5zbGljZSg0KTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZmlsZS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtbmFtZVwiPnt7Z2V0U2hvcnRGaWxlTmFtZShmaWxlLm5hbWUpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtY2xvc2UtY2lyY2xlXCIgKGNsaWNrKT1cInJlbW92ZUZpbGUoaSArIDQpXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvY2F4LW92ZXJsYXk+XHJcblxyXG4gICAgPCEtLSA8bmctdGVtcGxhdGUgY2F4VGVtcGxhdGU9XCJmb290ZXJcIj4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2hhdC1mb290ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtZmlsZXNcIiAqbmdJZj1cInNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8Y2F4LWNoaXAgKm5nRm9yPVwibGV0IGZpbGUgb2Ygc2VsZWN0ZWRGaWxlcy5zbGljZSgwLCA0KTsgbGV0IGkgPSBpbmRleFwiIFtsYWJlbF09XCJnZXRTaG9ydEZpbGVOYW1lKGZpbGUubmFtZSlcIiBbcmVtb3ZhYmxlXT1cInRydWVcIiBbc2l6ZV09XCInbGcnXCIgKG9uUmVtb3ZlKT1cInJlbW92ZUZpbGUoaSwgdHJ1ZSlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBjYXhUZW1wbGF0ZT1cImNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImNheCBjYXgtcGFwZXJjbGlwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9jYXgtY2hpcD5cclxuICAgICAgICAgICAgPGNheC1jaGlwICNjb3VudENoaXAgKm5nSWY9XCJzZWxlY3RlZEZpbGVzLmxlbmd0aCA+IDRcIiBbbGFiZWxdPVwiJysnICsgZ2V0T3ZlcmZsb3dDb3VudCgpXCIgW3NpemVdPVwiJ2xnJ1wiIChtb3VzZWVudGVyKT1cInNob3dGaWxlc092ZXJsYXkoJGV2ZW50KVwiPiA8L2NheC1jaGlwPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXgtY2hhdC1pbnB1dC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxjYXgtaW5wdXR0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdDb21tZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCInbGcnXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmlnaHRJY29uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGVhckljb25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyaWdodEljb25DbGFzc109XCInY2F4IGNheC1wYXBlcmNsaXAnXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmlnaHRJY29uQ2xpY2thYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChyaWdodEljb25DbGljayk9XCJvbkZpbGVJY29uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiaGFuZGxlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY2hhdC1pbnB1dCc6IHRydWUsICdhZG1pbi1pbnB1dCc6IGlzQWRtaW59XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieydib3JkZXItcmFkaXVzJzogJzhweCcsIGJhY2tncm91bmQ6ICcjZmZmZmZmJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICNpbnB1dFRleHRcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvY2F4LWlucHV0dGV4dD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8Y2F4LWJ1dHRvbiBbaWNvbl09XCInY2F4IGNheC1wbGFpbidcIiBbc2V2ZXJpdHldPVwiJ3ByaW1hcnknXCIgW3NpemVdPVwiJ2xhcmdlJ1wiIChjbGljayk9XCJhZGRDb21tZW50KClcIiBbZGlzYWJsZWRdPVwiIW5ld0NvbW1lbnQudHJpbSgpICYmIHNlbGVjdGVkRmlsZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJzZW5kLWJ1dHRvblwiPiA8L2NheC1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxpbnB1dCAjZmlsZUlucHV0IHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50KVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGFjY2VwdD1cIiovKlwiIG11bHRpcGxlIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPC9uZy10ZW1wbGF0ZT4gLS0+XHJcbjwvZGl2PlxyXG4iXX0=