rapid-text-editor 1.0.15 → 1.0.16

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.
@@ -6,11 +6,12 @@ import * as i2 from "@angular/material/icon";
6
6
  import * as i3 from "@angular/forms";
7
7
  import * as i4 from "@angular/common";
8
8
  export class RapidTextEditorComponent {
9
- constructor(dialog, el, renderer, elRef) {
9
+ constructor(dialog, el, renderer, elRef, _change) {
10
10
  this.dialog = dialog;
11
11
  this.el = el;
12
12
  this.renderer = renderer;
13
13
  this.elRef = elRef;
14
+ this._change = _change;
14
15
  this.contentCapture = false;
15
16
  this.height = "auto";
16
17
  this.width = "auto";
@@ -28,6 +29,7 @@ export class RapidTextEditorComponent {
28
29
  this.selectedHead = 'P';
29
30
  this.selectedFont = '14';
30
31
  }
32
+ this._change.detectChanges();
31
33
  };
32
34
  this.onTouched = () => { };
33
35
  console.log('Build -1');
@@ -71,6 +73,12 @@ export class RapidTextEditorComponent {
71
73
  else {
72
74
  console.error('Editor element not found.');
73
75
  }
76
+ const observer = new MutationObserver(() => this.updateCurrentFormat());
77
+ observer.observe(this.editor.nativeElement, {
78
+ childList: true,
79
+ characterData: true,
80
+ subtree: true
81
+ });
74
82
  }
75
83
  onContentChange() {
76
84
  if (this.contentCapture) {
@@ -102,6 +110,93 @@ export class RapidTextEditorComponent {
102
110
  onBlur() {
103
111
  this.onTouched();
104
112
  }
113
+ // setFontSize(event: Event) {
114
+ // const select = event.target as HTMLSelectElement;
115
+ // const size = select.value;
116
+ // const selection = window.getSelection();
117
+ // if (!selection || selection.rangeCount === 0) return;
118
+ // const range = selection.getRangeAt(0);
119
+ // if (!range.collapsed) {
120
+ // const parent = selection.anchorNode?.parentElement;
121
+ // if (
122
+ // parent &&
123
+ // parent.classList &&
124
+ // Array.from(parent.classList).some((c: string) => c.startsWith('fs-'))
125
+ // ) {
126
+ // parent.style.fontSize = `${size}px`;
127
+ // parent.className = `fs-${size}`;
128
+ // } else {
129
+ // const span = document.createElement('span');
130
+ // span.style.fontSize = `${size}px`;
131
+ // span.classList.add(`fs-${size}`);
132
+ // range.surroundContents(span);
133
+ // }
134
+ // }
135
+ // else {
136
+ // const span = document.createElement('span');
137
+ // span.style.fontSize = `${size}px`;
138
+ // span.classList.add(`fs-${size}`);
139
+ // span.appendChild(document.createTextNode('\u200B')); // zero-width space
140
+ // range.insertNode(span);
141
+ // const newRange = document.createRange();
142
+ // newRange.setStart(span.firstChild as Node, 1);
143
+ // newRange.collapse(true);
144
+ // selection.removeAllRanges();
145
+ // selection.addRange(newRange);
146
+ // }
147
+ // }
148
+ onEditorKeyUp(event) {
149
+ // handle Enter or arrow keys
150
+ if (event.key === 'Enter' || event.key === 'ArrowLeft' || event.key === 'ArrowRight' || event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'BackSpace') {
151
+ this.updateCurrentFormat();
152
+ }
153
+ }
154
+ updateCurrentFormat() {
155
+ const selection = window.getSelection();
156
+ if (!selection || selection.rangeCount === 0)
157
+ return;
158
+ const anchorNode = selection.anchorNode;
159
+ if (!anchorNode)
160
+ return;
161
+ let parentElem = anchorNode.nodeType === Node.ELEMENT_NODE
162
+ ? anchorNode
163
+ : anchorNode.parentElement;
164
+ if (!parentElem)
165
+ return;
166
+ let detectedHead = 'P';
167
+ let detectedFont = '14'; // default
168
+ // Traverse upward to detect formatting
169
+ while (parentElem && parentElem !== this.editor.nativeElement) {
170
+ const tag = parentElem.tagName.toUpperCase();
171
+ // Detect heading
172
+ if (['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P'].includes(tag)) {
173
+ detectedHead = tag;
174
+ }
175
+ // Detect inline font-size from style or class
176
+ const fontSize = window.getComputedStyle(parentElem).fontSize;
177
+ if (fontSize) {
178
+ const px = parseInt(fontSize.replace('px', ''), 10);
179
+ if (!isNaN(px)) {
180
+ detectedFont = px.toString();
181
+ break; // found the closest valid font size
182
+ }
183
+ }
184
+ parentElem = parentElem.parentElement;
185
+ }
186
+ // Update bound properties if changed
187
+ let changed = false;
188
+ if (this.selectedHead !== detectedHead) {
189
+ this.selectedHead = detectedHead;
190
+ changed = true;
191
+ }
192
+ if (this.selectedFont !== detectedFont) {
193
+ this.selectedFont = detectedFont;
194
+ changed = true;
195
+ }
196
+ if (changed) {
197
+ this._change.detectChanges();
198
+ }
199
+ }
105
200
  setFontSize(event) {
106
201
  const select = event.target;
107
202
  const size = select.value;
@@ -110,32 +205,41 @@ export class RapidTextEditorComponent {
110
205
  return;
111
206
  const range = selection.getRangeAt(0);
112
207
  if (!range.collapsed) {
113
- const parent = selection.anchorNode?.parentElement;
114
- if (parent &&
115
- parent.classList &&
116
- Array.from(parent.classList).some((c) => c.startsWith('fs-'))) {
117
- parent.style.fontSize = `${size}px`;
118
- parent.className = `fs-${size}`;
119
- }
120
- else {
121
- const span = document.createElement('span');
122
- span.style.fontSize = `${size}px`;
123
- span.classList.add(`fs-${size}`);
208
+ // Non-empty selection
209
+ const span = document.createElement('span');
210
+ span.style.fontSize = `${size}px`;
211
+ span.classList.add(`fs-${size}`);
212
+ try {
124
213
  range.surroundContents(span);
125
214
  }
215
+ catch {
216
+ // If selection spans multiple elements, use execCommand fallback
217
+ document.execCommand('fontSize', false, '7'); // temporary largest size
218
+ document.querySelectorAll('font[size="7"]').forEach((el) => {
219
+ el.removeAttribute('size');
220
+ el.style.fontSize = `${size}px`;
221
+ el.classList.add(`fs-${size}`);
222
+ });
223
+ }
126
224
  }
127
225
  else {
226
+ // Collapsed selection (no text selected)
128
227
  const span = document.createElement('span');
129
228
  span.style.fontSize = `${size}px`;
130
229
  span.classList.add(`fs-${size}`);
131
230
  span.appendChild(document.createTextNode('\u200B')); // zero-width space
132
231
  range.insertNode(span);
232
+ // Move cursor inside span
133
233
  const newRange = document.createRange();
134
234
  newRange.setStart(span.firstChild, 1);
135
235
  newRange.collapse(true);
136
236
  selection.removeAllRanges();
137
237
  selection.addRange(newRange);
138
238
  }
239
+ const content = this.editor.nativeElement.innerHTML;
240
+ this.onChange(content);
241
+ this.updateCurrentFormat();
242
+ this._change.detectChanges();
139
243
  }
140
244
  setHeading(event) {
141
245
  const select = event.target;
@@ -534,11 +638,11 @@ export class RapidTextEditorComponent {
534
638
  }
535
639
  }
536
640
  createTableHTML(rowCount, colCount) {
537
- let tableHTML = '<table border="1" style="">';
641
+ let tableHTML = '<table style="font-size: 14px; width: 100%; border: 1px solid black; border-collapse: collapse;">';
538
642
  for (let i = 0; i < rowCount; i++) {
539
643
  tableHTML += '<tr>';
540
644
  for (let j = 0; j < colCount; j++) {
541
- tableHTML += `<td style="font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black"
645
+ tableHTML += `<td style="border: 1px solid black; border-collapse: collapse; height: 2em; padding: .4em; "
542
646
  role="textbox" contenteditable="true"></td>`;
543
647
  }
544
648
  tableHTML += '</tr>';
@@ -590,14 +694,14 @@ export class RapidTextEditorComponent {
590
694
  this.onChange(content);
591
695
  }
592
696
  }
593
- RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
697
+ RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
594
698
  RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "rapid-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
595
699
  {
596
700
  provide: NG_VALUE_ACCESSOR,
597
701
  useExisting: forwardRef(() => RapidTextEditorComponent),
598
702
  multi: true
599
703
  }
600
- ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri!important;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%;border-collapse:collapse;margin:5px}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:70px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
704
+ ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 20px;\" value=\"20\">20px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 28px;\" value=\"28\">28px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (keyup)=\"onEditorKeyUp($event)\" (mouseup)=\"updateCurrentFormat()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%}::ng-deep .editor table,::ng-deep .editor th,::ng-deep .editor td{border:1px solid black;border-collapse:collapse}::ng-deep .editor th,::ng-deep .editor td{padding:.4rem}::ng-deep .editor th{background-color:#f3f3f3}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:70px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
601
705
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, decorators: [{
602
706
  type: Component,
603
707
  args: [{ selector: 'rapid-text-editor', providers: [
@@ -606,8 +710,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
606
710
  useExisting: forwardRef(() => RapidTextEditorComponent),
607
711
  multi: true
608
712
  }
609
- ], template: "<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" (change)=\"onChange(null)\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri!important;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%;border-collapse:collapse;margin:5px}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:70px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"] }]
610
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { contentCapture: [{
713
+ ], template: "<div class=\"dimension\">\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedHead\" (change)=\"setHeading($event)\">\r\n <option value=\"P\" style=\"font-size: 14px;\">Paragraph</option>\r\n <option value=\"H1\" style=\"font-size: 32px; font-weight: bold;\">H1</option>\r\n <option value=\"H2\" style=\"font-size: 28px; font-weight: bold;\">H2</option>\r\n <option value=\"H3\" style=\"font-size: 24px; font-weight: bold;\">H3</option>\r\n <option value=\"H4\" style=\"font-size: 20px; font-weight: bold;\">H4</option>\r\n <option value=\"H5\" style=\"font-size: 18px; font-weight: 600;\">H5</option>\r\n <option value=\"H6\" style=\"font-size: 16px; font-weight: 600;\">H6</option>\r\n </select>\r\n <select class=\"select-wrapper\" [(ngModel)]=\"selectedFont\"\r\n (change)=\"setFontSize($event)\">\r\n <option style=\"font-size: 12px;\" value=\"12\">12px</option>\r\n <option style=\"font-size: 14px;\" value=\"14\" selected>14px</option>\r\n <option style=\"font-size: 16px;\" value=\"16\">16px</option>\r\n <option style=\"font-size: 18px;\" value=\"18\">18px</option>\r\n <option style=\"font-size: 20px;\" value=\"20\">20px</option>\r\n <option style=\"font-size: 24px;\" value=\"24\">24px</option>\r\n <option style=\"font-size: 28px;\" value=\"28\">28px</option>\r\n <option style=\"font-size: 32px;\" value=\"32\">32px</option>\r\n <option style=\"font-size: 48px;\" value=\"48\">48px</option>\r\n </select>\r\n <button (click)=\"format('bold')\" type=\"button\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('italic')\" type=\"button\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('underline')\" type=\"button\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('strikethrough')\" type=\"button\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyLeft')\" type=\"button\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyCenter')\" type=\"button\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyRight')\" type=\"button\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('justifyFull')\" type=\"button\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertUnorderedList')\" type=\"button\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n\r\n <button (click)=\"format('insertOrderedList')\" type=\"button\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n <button color=\"secondary\" aria-label=\"Insert Image\" type=\"button\"\r\n style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input type=\"file\" (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" />\r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n <button (click)=\"openTableDialog($event)\" type=\"button\" color=\"secondary\"\r\n aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n\r\n <button class=\"mb-1\" (click)=\"makeFirstRowHeader()\" type=\"button\" color=\"secondary\" aria-label=\"Make Header\">\r\n <span style=\"font-size: 20px;\" class=\"material-symbols-outlined\">\r\n page_header\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (keyup)=\"onEditorKeyUp($event)\" (mouseup)=\"updateCurrentFormat()\"\r\n (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\">\r\n </div>\r\n </div>\r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div *ngFor=\"let cell of grid; let i = index\" [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\" (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px;font-family:Calibri}::ng-deep .editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri;outline:none!important;font-size:14px}::ng-deep .editor table{width:100%}::ng-deep .editor table,::ng-deep .editor th,::ng-deep .editor td{border:1px solid black;border-collapse:collapse}::ng-deep .editor th,::ng-deep .editor td{padding:.4rem}::ng-deep .editor th{background-color:#f3f3f3}.fs-12{font-size:12px}.fs-13{font-size:13px}.fs-14{font-size:14px}.fs-16{font-size:16px}.fs-18{font-size:18px}.fs-20{font-size:20px}.fs-24{font-size:24px}.fs-28{font-size:28px}.editor h1{font-size:32px;font-weight:700;margin:0}.editor h2{font-size:28px;font-weight:700;margin:0}.editor h3{font-size:24px;font-weight:700;margin:0}.editor h4{font-size:20px;font-weight:700;margin:0}.editor h5{font-size:18px;font-weight:600;margin:0}.editor h6{font-size:16px;font-weight:600;margin:0}.editor p{font-size:14px;font-weight:400;margin:0}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:70px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"] }]
714
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { contentCapture: [{
611
715
  type: Input
612
716
  }], height: [{
613
717
  type: Input
@@ -622,4 +726,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
622
726
  type: ViewChild,
623
727
  args: ['tableDialog']
624
728
  }] } });
625
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFwaWQtdGV4dC1lZGl0b3Ivc3JjL2xpYi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9yYXBpZC10ZXh0LWVkaXRvci9zcmMvbGliL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQTBCLFVBQVUsRUFBRSxZQUFZLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBRWhNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyx3QkFBd0I7SUFlbkMsWUFBb0IsTUFBaUIsRUFBVSxFQUFjLEVBQVUsUUFBbUIsRUFBVSxLQUFpQjtRQUFqRyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBYjVHLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLFdBQU0sR0FBVyxNQUFNLENBQUM7UUFDeEIsVUFBSyxHQUFXLE1BQU0sQ0FBQztRQUN0QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHN0Msa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDbkMsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQW1F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QU0sU0FBUyxHQUFHLHFEQUFxRCxDQUFDO1FBQ3hFLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyx1Q0FBdUM7UUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMscUNBQXFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7c0hBbHFCVSx3QkFBd0I7MEdBQXhCLHdCQUF3Qix5S0FUeEI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztZQUN2RCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsNFBDZEgsNDlKQWtHQTs0RkRqRmEsd0JBQXdCO2tCQWJwQyxTQUFTOytCQUNFLG1CQUFtQixhQUdsQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7MEtBS1EsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ2dDLE1BQU07c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDWCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFRlbXBsYXRlUmVmLCBmb3J3YXJkUmVmLCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyYXBpZC10ZXh0LWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFwaWRUZXh0RWRpdG9yQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbiAgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYXBpZFRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50Q2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gXCJhdXRvXCI7XHJcbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xyXG4gIEBPdXRwdXQoKSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJsZURpYWxvZycpIHRhYmxlRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIGVkaXRvckNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd3M6IG51bWJlciA9IDE7XHJcbiAgY29sczogbnVtYmVyID0gMTtcclxuICBncmlkID0gQXJyYXkoNDkpLmZpbGwoMCk7XHJcbiAgTWF0aCA9IE1hdGg7XHJcbiAgdXBsb2FkZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgY29uc29sZS5sb2coJ0J1aWxkIC0xJylcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NvbnRlbnQgY2FwdHVyZSBpcyBlbmFibGVkLicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NvbnRlbnQgY2FwdHVyZSBpcyBkaXNhYmxlZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydoZWlnaHQnXSB8fCBjaGFuZ2VzWyd3aWR0aCddKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlEaW1lbnNpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5RGltZW5zaW9ucygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRpbWVuc2lvbkVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmRpbWVuc2lvbicpO1xyXG4gICAgaWYgKHRoaXMud2lkdGgpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkaW1lbnNpb25FbGVtZW50LCAnd2lkdGgnLCB0aGlzLndpZHRoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGVkaXRvckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgaWYodGhpcy5oZWlnaHQpe1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVkaXRvckVsZW1lbnQsICdoZWlnaHQnLCB0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvciAmJiAoZWRpdG9yLmlubmVySFRNTC50cmltKCkgPT09IFwiXCIgfHwgZWRpdG9yLmlubmVySFRNTC50cmltKCkgPT09IFwiPGJyPlwiKSkge1xyXG4gICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICByYW5nZS5zZXRTdGFydChlZGl0b3IsIDApO1xyXG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgb25Db250ZW50Q2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29udGVudENhcHR1cmUpIHtcclxuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yQ29udGVudCA9IGVkaXRvci5pbm5lckhUTUw7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NhcHR1cmVkIENvbnRlbnQgKENoaWxkKTonLCB0aGlzLmVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuZWRpdG9yQ29udGVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZW50KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRIZWFkOiBhbnkgPSAnUCc7XHJcbiAgc2VsZWN0ZWRGb250OiBhbnkgPSAnMTQnO1xyXG5cclxuICBwdWJsaWMgb25DaGFuZ2UgPSAoY29udGVudDogc3RyaW5nKSA9PiB7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PSAnPGJyPicgfHwgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPT0gJycpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gJzE0JztcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgd3JpdGVWYWx1ZShjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gY29udGVudCB8fCAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChjb250ZW50OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIHNldEZvbnRTaXplKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNlbGVjdC52YWx1ZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgaWYgKCFyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgY29uc3QgcGFyZW50ID0gc2VsZWN0aW9uLmFuY2hvck5vZGU/LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXJlbnQgJiZcclxuICAgICAgICBwYXJlbnQuY2xhc3NMaXN0ICYmXHJcbiAgICAgICAgQXJyYXkuZnJvbShwYXJlbnQuY2xhc3NMaXN0KS5zb21lKChjOiBzdHJpbmcpID0+IGMuc3RhcnRzV2l0aCgnZnMtJykpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHBhcmVudC5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cHhgO1xyXG4gICAgICAgIHBhcmVudC5jbGFzc05hbWUgPSBgZnMtJHtzaXplfWA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgICAgcmFuZ2Uuc3Vycm91bmRDb250ZW50cyhzcGFuKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBgJHtzaXplfXB4YDtcclxuICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKSk7IC8vIHplcm8td2lkdGggc3BhY2VcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICBuZXdSYW5nZS5zZXRTdGFydChzcGFuLmZpcnN0Q2hpbGQgYXMgTm9kZSwgMSk7XHJcbiAgICAgIG5ld1JhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNldEhlYWRpbmcoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBjb25zdCBzZWxlY3QgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgICBjb25zdCB0YWcgPSBzZWxlY3QudmFsdWU7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcbiAgICBjb25zdCBuZXdFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG4gICAgc3dpdGNoICh0YWcpIHtcclxuICAgICAgY2FzZSAnSDEnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMzJweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIMic6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcyOHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0gzJzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzI0cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDQnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMjBweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdINSc6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcxOHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDYnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1AnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ25vcm1hbCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgbmV3RWxlbS50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0VsZW0uaW5uZXJIVE1MID0gJ1xcdTIwMEInOyAvLyBaZXJvLXdpZHRoIHNwYWNlIHRvIGtlZXAgY3Vyc29yIHZpc2libGVcclxuICAgIH1cclxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICByYW5nZS5pbnNlcnROb2RlKG5ld0VsZW0pO1xyXG4gICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgbmV3UmFuZ2Uuc2V0U3RhcnQobmV3RWxlbSwgbmV3RWxlbS5jaGlsZE5vZGVzLmxlbmd0aCk7XHJcbiAgICBuZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShuZXdSYW5nZSk7XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIGZvcm1hdChjb21tYW5kOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvL0ltYWdlIFNlY3Rpb25cclxuXHJcbiAgYWxsb3dEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBpbWFnZSBkcmFnIHN0YXJ0XHJcbiAgZHJhZyhldmVudDogRHJhZ0V2ZW50LCBpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBldmVudC5kYXRhVHJhbnNmZXI/LnNldERhdGEoXCJ0ZXh0XCIsIGltYWdlVXJsKTtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBkcm9wIGV2ZW50IGluIHRoZSBlZGl0b3JcclxuICBkcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVJbWFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRJbWFnZUluRWRpdG9yKGltYWdlVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0VkaXRvciBlbGVtZW50IG5vdCBmb3VuZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBpbWFnZSBlbGVtZW50XHJcbiAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcclxuICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBpbWFnZSB0byBhbGxvdyByZXNpemluZ1xyXG4gICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgd3JhcHBlci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgIC8vIEVuc3VyZXMgdGhlIHdyYXBwZXIgb25seSB0YWtlcyB1cCBzcGFjZSBmb3IgdGhlIGltYWdlXHJcbiAgICB3cmFwcGVyLnN0eWxlLm1hcmdpbiA9ICcxMHB4JztcclxuICAgIHdyYXBwZXIuc3R5bGUucGFkZGluZyA9ICc1cHgnO1xyXG4gICAgd3JhcHBlci5zdHlsZS5ib3JkZXIgPSAnMXB4IGRhc2hlZCAjY2NjJzsgLy8gT3B0aW9uYWwgYm9yZGVyIHRvIGluZGljYXRlIHRoZSBpbWFnZSBhcmVhXHJcblxyXG4gICAgLy8gQXBwZW5kIHRoZSBpbWFnZSB0byB0aGUgd3JhcHBlclxyXG4gICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgd3JhcHBlciB0byB0aGUgZWRpdG9yXHJcbiAgICBlZGl0b3IuYXBwZW5kQ2hpbGQod3JhcHBlcik7XHJcblxyXG4gICAgLy8gTWFrZSB0aGUgaW1hZ2UgcmVzaXphYmxlXHJcbiAgICB0aGlzLm1ha2VJbWFnZVJlc2l6YWJsZSh3cmFwcGVyLCBpbWcpO1xyXG5cclxuICAgIC8vIE9wdGlvbmFsbHksIGFkZCBhIHRleHQgbm9kZSB0byBtYWludGFpbiBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgYXBwZW5kaW5nIHRoZSBpbWFnZVxyXG4gICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MjAwQicpOyAgLy8gSW52aXNpYmxlIGNoYXJhY3RlciB0byBtYWludGFpbiBwb3NpdGlvblxyXG4gICAgZWRpdG9yLmFwcGVuZENoaWxkKHRleHROb2RlKTtcclxuXHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdyYXBwZXIpO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtYWtlSW1hZ2VSZXNpemFibGUod3JhcHBlcjogSFRNTEVsZW1lbnQsIGltZzogSFRNTEltYWdlRWxlbWVudCk6IHZvaWQge1xyXG4gICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgIGxldCBzdGFydFggPSAwO1xyXG4gICAgbGV0IHN0YXJ0WSA9IDA7XHJcbiAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICBsZXQgc3RhcnRIZWlnaHQgPSAwO1xyXG5cclxuICAgIC8vIENyZWF0ZSByZXNpemUgaGFuZGxlcyBmb3IgdGhlIGltYWdlXHJcbiAgICBjb25zdCBjcmVhdGVSZXNpemVIYW5kbGUgPSAoXHJcbiAgICAgIGN1cnNvcjogc3RyaW5nLFxyXG4gICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgcmVzaXplQ2FsbGJhY2s6IChkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpID0+IHZvaWRcclxuICAgICkgPT4ge1xyXG4gICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgaGFuZGxlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgaGFuZGxlLnN0eWxlLndpZHRoID0gJzEwcHgnO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDAsIDAsIDAsIDAuNSknO1xyXG4gICAgICBoYW5kbGUuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xyXG4gICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChyZXNpemVFdmVudCkgPT4ge1xyXG4gICAgICAgIGlzUmVzaXppbmcgPSB0cnVlO1xyXG4gICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgc3RhcnRZID0gcmVzaXplRXZlbnQuY2xpZW50WTtcclxuICAgICAgICBzdGFydFdpZHRoID0gaW1nLm9mZnNldFdpZHRoO1xyXG4gICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZU1vdmUgPSAobW92ZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNSZXNpemluZykge1xyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gbW92ZUV2ZW50LmNsaWVudFkgLSBzdGFydFk7XHJcbiAgICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrKGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBvbk1vdXNlVXAgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBZGQgcmVzaXppbmcgaGFuZGxlcyB0byB0aGUgd3JhcHBlciBmb3IgdGhlIGltYWdlXHJcbiAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICdudy1yZXNpemUnLFxyXG4gICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCAtIGRlbHRhWH1weGA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgJ3NlLXJlc2l6ZScsXHJcbiAgICAgIHsgYm90dG9tOiAnLTVweCcsIHJpZ2h0OiAnLTVweCcgfSxcclxuICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCArIGRlbHRhWH1weGA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0ICsgZGVsdGFZfXB4YDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluc2VydEltYWdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmIChpbnB1dD8uZmlsZXMpIHtcclxuICAgICAgQXJyYXkuZnJvbShpbnB1dC5maWxlcykuZm9yRWFjaChmaWxlID0+IHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbWFnZVVybCA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXMucHVzaChpbWFnZVVybCk7IC8vIFN0b3JlIGltYWdlIFVSTCBpbiB0aGUgYXJyYXlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnZlcnRJbWFnZShmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoZmlsZS50eXBlICE9PSAnaW1hZ2UvcG5nJykge1xyXG4gICAgICAgIHJlc29sdmUoZmlsZSk7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBpZiBpdCdzIG5vdCBhIFBOR1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcblxyXG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG5cclxuICAgICAgICAgIGlmICghY3R4KSB7XHJcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgY2FudmFzIGNvbnRleHQnKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuXHJcbiAgICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XHJcbiAgICAgICAgICBjYW52YXMudG9CbG9iKFxyXG4gICAgICAgICAgICBibG9iID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmxvYikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QganBnRmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnBuZyQvLCAnLmpwZycpLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoanBnRmlsZSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjb252ZXJ0IFBORyB0byBKUEcnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAnaW1hZ2UvanBlZycsXHJcbiAgICAgICAgICAgIDAuOTUgLy8gUXVhbGl0eSBmYWN0b3IgZm9yIEpQRUdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIHJlYWQgdGhlIGZpbGUnKSk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGluc2VydEltYWdlVG9FZGl0b3IoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgd3JhcHBlci5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyID0gJzFweCBkYXNoZWQgI2NjYyc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5tYXJnaW4gPSAnMTBweCc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5wYWRkaW5nID0gJzVweCc7XHJcbiAgICAgICAgd3JhcHBlci5zdHlsZS5ib3JkZXJCbG9ja0NvbG9yID0gJyMwMDdCRkYnO1xyXG4gICAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICAgIGltZy5zcmMgPSBpbWFnZVVybDtcclxuICAgICAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9ICczMDBweCc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGltZyk7XHJcbiAgICAgICAgbGV0IGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRZID0gMDtcclxuICAgICAgICBsZXQgc3RhcnRXaWR0aCA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAgICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICAgICAgY3Vyc29yOiBzdHJpbmcsXHJcbiAgICAgICAgICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcclxuICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICAgICAgKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUud2lkdGggPSAnMTBweCc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUuaGVpZ2h0ID0gJzEwcHgnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5jdXJzb3IgPSBjdXJzb3I7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGhhbmRsZS5zdHlsZSwgcG9zaXRpb25TdHlsZXMpO1xyXG5cclxuICAgICAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgaXNSZXNpemluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHN0YXJ0WCA9IHJlc2l6ZUV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBpbWcub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHN0YXJ0SGVpZ2h0ID0gaW1nLm9mZnNldEhlaWdodDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpc1Jlc2l6aW5nKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVggPSBtb3ZlRXZlbnQuY2xpZW50WCAtIHN0YXJ0WDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICAgICAgcmVzaXplQ2FsbGJhY2soZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChoYW5kbGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAgICAgJ253LXJlc2l6ZScsXHJcbiAgICAgICAgICB7IHRvcDogJy01cHgnLCBsZWZ0OiAnLTVweCcgfSxcclxuICAgICAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRoIC0gZGVsdGFYfXB4YDtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0IC0gZGVsdGFZfXB4YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICAgICAgeyBib3R0b206ICctNXB4JywgcmlnaHQ6ICctNXB4JyB9LFxyXG4gICAgICAgICAgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUuaGVpZ2h0ID0gYCR7c3RhcnRIZWlnaHQgKyBkZWx0YVl9cHhgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKTtcclxuICAgICAgICBlZGl0b3IuYXBwZW5kQ2hpbGQodGV4dE5vZGUpO1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHdyYXBwZXIpO1xyXG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuVGFibGVEaWFsb2coZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5zZXJ0TWFya2VyKCk7XHJcbiAgICB0aGlzLnJvd3MgPSAxO1xyXG4gICAgdGhpcy5jb2xzID0gMTtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKHRoaXMudGFibGVEaWFsb2csIHtcclxuICAgICAgcG9zaXRpb246IHtcclxuICAgICAgICB0b3A6IGAke2V2ZW50LmNsaWVudFl9cHhgLFxyXG4gICAgICAgIGxlZnQ6IGAke2V2ZW50LmNsaWVudFh9cHhgLFxyXG4gICAgICB9LFxyXG4gICAgICBwYW5lbENsYXNzOiAnY3VzdG9tLWRpYWxvZy1jb250YWluZXInXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5pbnNlcnRUYWJsZShyZXN1bHQucm93cywgcmVzdWx0LmNvbHMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByZXZpZXcoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuY29scyA9IGNvbHM7XHJcbiAgICB0aGlzLnJvd3MgPSByb3dzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlU2VsZWN0aW9uKGNvbEluZGV4OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXIsIGRpYWxvZ1JlZjogYW55KSB7XHJcbiAgICB0aGlzLmNvbHMgPSBjb2xJbmRleDtcclxuICAgIHRoaXMucm93cyA9IHJvd0luZGV4O1xyXG4gICAgZGlhbG9nUmVmLmNsb3NlKHsgcm93czogdGhpcy5yb3dzLCBjb2xzOiB0aGlzLmNvbHMgfSk7IC8vIENsb3NlIGRpYWxvZyB3aXRoIHNlbGVjdGlvblxyXG4gIH1cclxuXHJcbiAgbWFrZUZpcnN0Um93SGVhZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBpbnNpZGUgdGhlIGVkaXRvclxyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0aW9uSW5zaWRlRWRpdG9yKGVkaXRvciwgc2VsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IHRhYmxlIHRvIHRoZSBzZWxlY3Rpb25cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5maW5kQ2xvc2VzdFRhYmxlKHNlbGVjdGVkTm9kZSk7XHJcbiAgICBpZiAoIXRhYmxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIENvbnZlcnQgdGhlIGZpcnN0IHJvdyBjZWxscyB0byBoZWFkZXIgY2VsbHNcclxuICAgIGNvbnN0IGZpcnN0Um93ID0gdGFibGUucm93c1swXTtcclxuICAgIGlmIChmaXJzdFJvdykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpcnN0Um93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldO1xyXG4gICAgICAgIGNvbnN0IHRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKTtcclxuICAgICAgICB0aC5pbm5lckhUTUwgPSBjZWxsLmlubmVySFRNTDtcclxuICAgICAgICB0aC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcclxuICAgICAgICB0aC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI0YxRjFGMCc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgICAgICAgdGguc3R5bGUuYm9yZGVyQ29sbGFwc2UgPSAnY29sbGFwc2UnO1xyXG4gICAgICAgIHRoLnN0eWxlLnBhZGRpbmcgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKS5wYWRkaW5nOyAvLyBSZXRhaW4gcGFkZGluZ1xyXG4gICAgICAgIHRoLnN0eWxlLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCkud2lkdGg7IC8vIFJldGFpbiB3aWR0aFxyXG4gICAgICAgIHRoLnN0eWxlLmhlaWdodCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpLmhlaWdodDtcclxuICAgICAgICBmaXJzdFJvdy5yZXBsYWNlQ2hpbGQodGgsIGNlbGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZENsb3Nlc3RUYWJsZShub2RlOiBOb2RlKTogSFRNTFRhYmxlRWxlbWVudCB8IG51bGwge1xyXG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQpIHtcclxuICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09ICdUQUJMRScpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGUhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydE1hcmtlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICBjb25zdCBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIG1hcmtlci5pZCA9ICd0YWJsZS1tYXJrZXInO1xyXG4gICAgICBtYXJrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShtYXJrZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0VGFibGUocm93czogc3RyaW5nLCBjb2xzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd0NvdW50ID0gcGFyc2VJbnQocm93cywgMTApO1xyXG4gICAgY29uc3QgY29sQ291bnQgPSBwYXJzZUludChjb2xzLCAxMCk7XHJcblxyXG4gICAgaWYgKGlzTmFOKHJvd0NvdW50KSB8fCBpc05hTihjb2xDb3VudCkgfHwgcm93Q291bnQgPCAxIHx8IGNvbENvdW50IDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IG1hcmtlciA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCcjdGFibGUtbWFya2VyJyk7XHJcblxyXG4gICAgY29uc3QgdGFibGVIVE1MID0gdGhpcy5jcmVhdGVUYWJsZUhUTUwocm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gdGFibGVIVE1MO1xyXG4gICAgY29uc3QgdGFibGUgPSB0ZW1wRGl2LmZpcnN0RWxlbWVudENoaWxkO1xyXG5cclxuICAgIGlmIChtYXJrZXIgJiYgdGFibGUpIHtcclxuICAgICAgbWFya2VyLnBhcmVudE5vZGUhLnJlcGxhY2VDaGlsZCh0YWJsZSwgbWFya2VyKTtcclxuICAgICAgdGhpcy5zZXRDdXJzb3JUb0ZpcnN0Q2VsbCh0YWJsZSBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gZmFsbGJhY2sgaWYgbm8gbWFya2VyLCBqdXN0IGFwcGVuZFxyXG4gICAgICB0aGlzLmFwcGVuZFRhYmxlKGVkaXRvciwgcm93Q291bnQsIGNvbENvdW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVGFibGVIVE1MKHJvd0NvdW50OiBudW1iZXIsIGNvbENvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRhYmxlSFRNTCA9ICc8dGFibGUgYm9yZGVyPVwiMVwiIHN0eWxlPVwiXCI+JztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICB0YWJsZUhUTUwgKz0gJzx0cj4nO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHtcclxuICAgICAgICB0YWJsZUhUTUwgKz0gYDx0ZCBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDsgbWluLXdpZHRoOiAxLjVlbTsgaGVpZ2h0OiAyZW07IHBhZGRpbmc6IC40ZW07IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+PC90ZD5gO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlSFRNTCArPSAnPC90cj4nO1xyXG4gICAgfVxyXG4gICAgdGFibGVIVE1MICs9ICc8L3RhYmxlPic7XHJcbiAgICByZXR1cm4gdGFibGVIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRUYWJsZShlZGl0b3I6IEhUTUxFbGVtZW50LCByb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJsZUhUTUwgPSB0aGlzLmNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCArPSB0YWJsZUhUTUw7XHJcbiAgICBjb25zdCBsYXN0SW5zZXJ0ZWRUYWJsZSA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCd0YWJsZTpsYXN0LWNoaWxkJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldEN1cnNvclRvRmlyc3RDZWxsKGxhc3RJbnNlcnRlZFRhYmxlKTtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3I6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIGlmIChub2RlID09PSBlZGl0b3IpIHJldHVybiB0cnVlO1xyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q3Vyc29yVG9GaXJzdENlbGwodGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaXJzdENlbGwgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChmaXJzdENlbGwpIHtcclxuICAgICAgZmlyc3RDZWxsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcclxuICAgICAgZmlyc3RDZWxsLmZvY3VzKCk7XHJcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGZpcnN0Q2VsbCk7IC8vIFNlbGVjdCB0aGUgY29udGVudHMgb2YgdGhlIGNlbGxcclxuICAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBzdGFydFxyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0UGFnZUJyZWFrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZUJyZWFrID0gYDxkaXYgc3R5bGU9XCJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XCI+PGJyIC8+PC9kaXY+YDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHBhZ2VCcmVhayk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDb250ZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MOyAvLyBHZXQgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBlZGl0b3JcclxuICAgIGNvbnN0IHBsYWluVGV4dENvbnRlbnQgPSBlZGl0b3IuaW5uZXJUZXh0OyAvLyBPcHRpb25hbGx5LCBnZXQgcGxhaW4gdGV4dCBjb250ZW50XHJcbiAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGltZW5zaW9uXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJpY2gtdGV4dC1lZGl0b3JcIj5cclxuICAgIDwhLS0gVG9vbGJhciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCI+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRIZWFkXCIgKGNoYW5nZSk9XCJzZXRIZWFkaW5nKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPlBhcmFncmFwaDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMVwiIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMTwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMlwiIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMjwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMzwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5INDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINVwiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNjAwO1wiPkg1PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg2XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+SDY8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIChjaGFuZ2UpPVwib25DaGFuZ2UobnVsbClcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJzZXRGb250U2l6ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIiB2YWx1ZT1cIjEyXCI+MTJweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDE0cHg7XCIgdmFsdWU9XCIxNFwiIHNlbGVjdGVkPjE0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAxNnB4O1wiIHZhbHVlPVwiMTZcIj4xNnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiB2YWx1ZT1cIjE4XCI+MThweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDI0cHg7XCIgdmFsdWU9XCIyNFwiPjI0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4O1wiIHZhbHVlPVwiMzJcIj4zMnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogNDhweDtcIiB2YWx1ZT1cIjQ4XCI+NDhweDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkJvbGRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2JvbGQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkl0YWxpY1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfaXRhbGljPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbmRlcmxpbmVcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X3VuZGVybGluZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdzdHJpa2V0aHJvdWdoJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIlN0cmlrZXRocm91Z2hcIj5cclxuICAgICAgICA8bWF0LWljb24+c3RyaWtldGhyb3VnaF9zPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlMZWZ0JylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkFsaWduIExlZnRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJDZW50ZXJcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5UmlnaHQnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQWxpZ24gUmlnaHRcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlGdWxsJylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkp1c3RpZnlcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2FsaWduX2p1c3RpZnk8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJVbm9yZGVyZWQgTGlzdFwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5mb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJPcmRlcmVkIExpc3RcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2xpc3RfbnVtYmVyZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJJbnNlcnQgSW1hZ2VcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIChjaGFuZ2UpPVwiaW5zZXJ0SW1hZ2VUb0VkaXRvcigkZXZlbnQpXCJcclxuICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG9wYWNpdHk6IDA7IGN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZTtcIj5pbnNlcnRfcGhvdG9fb3V0bGluZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib3BlblRhYmxlRGlhbG9nKCRldmVudClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJDaG9vc2UgdGFibGUgcm93cyBhbmQgY29sdW1uc1wiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5ib3JkZXJfYWxsPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwibWItMVwiIChjbGljayk9XCJtYWtlRmlyc3RSb3dIZWFkZXIoKVwiIHR5cGU9XCJidXR0b25cIiBjb2xvcj1cInNlY29uZGFyeVwiIGFyaWEtbGFiZWw9XCJNYWtlIEhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxyXG4gICAgICAgICAgcGFnZV9oZWFkZXJcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yXCIgaWQ9XCJlZGl0b3JcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgI2VkaXRvciAoaW5wdXQpPVwic3VibWl0Q29udGVudCgpXCIgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgICAoZHJvcCk9XCJkcm9wKCRldmVudClcIiAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudClcIj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxuZy10ZW1wbGF0ZSAjdGFibGVEaWFsb2cgbGV0LWRpYWxvZ1JlZj1cImRpYWxvZ1JlZlwiPlxyXG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+Q2hvb3NlIFRhYmxlIFNpemU8L2gyPlxyXG4gICAgPG1hdC1kaWFsb2ctY29udGVudD5cclxuICAgICAgPGRpdiBjbGFzcz1cImdyaWQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2VsbCBvZiBncmlkOyBsZXQgaSA9IGluZGV4XCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICdncmlkLWl0ZW0nOiB0cnVlLFxyXG4gICAgICAgICdoaWdobGlnaHRlZCc6IGkgJSA3IDwgY29scyAmJiBNYXRoLmZsb29yKGkgLyA3KSA8IHJvd3NcclxuICAgICAgfVwiIChtb3VzZWVudGVyKT1cInVwZGF0ZVByZXZpZXcoaSAlIDcgKyAxLCBNYXRoLmZsb29yKGkgLyA3KSArIDEpXCJcclxuICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVTZWxlY3Rpb24oaSAlIDcgKyAxLCBNYXRoLmZsb29yKGkgLyA3KSArIDEsIGRpYWxvZ1JlZilcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxwPnt7IHJvd3MgfX0geCB7eyBjb2xzIH19IDwvcD5cclxuICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PlxyXG4iXX0=
729
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFwaWQtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcmFwaWQtdGV4dC1lZGl0b3Ivc3JjL2xpYi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9yYXBpZC10ZXh0LWVkaXRvci9zcmMvbGliL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQTBCLFVBQVUsRUFBRSxZQUFZLEVBQXdELE1BQU0sZUFBZSxDQUFDO0FBRWhNLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZ0J6RSxNQUFNLE9BQU8sd0JBQXdCO0lBZW5DLFlBQW9CLE1BQWlCLEVBQzNCLEVBQWMsRUFDZCxRQUFtQixFQUNuQixLQUFpQixFQUNqQixPQUEwQjtRQUpoQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQzNCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFqQjNCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLFdBQU0sR0FBVyxNQUFNLENBQUM7UUFDeEIsVUFBSyxHQUFXLE1BQU0sQ0FBQztRQUN0QixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFHN0Msa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFDbkMsU0FBSSxHQUFXLENBQUMsQ0FBQztRQUNqQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLFNBQUks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QUMsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsYUFBYTtRQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyx1Q0FBdUM7UUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMscUNBQXFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7c0hBNXhCVSx3QkFBd0I7MEdBQXhCLHdCQUF3Qix5S0FUeEI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQztZQUN2RCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsNFBDZkgsd3BLQW9HQTs0RkRsRmEsd0JBQXdCO2tCQWJwQyxTQUFTOytCQUNFLG1CQUFtQixhQUdsQjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7ME1BS1EsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ2dDLE1BQU07c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDWCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFRlbXBsYXRlUmVmLCBmb3J3YXJkUmVmLCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyYXBpZC10ZXh0LWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhcGlkLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYXBpZC10ZXh0LWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFwaWRUZXh0RWRpdG9yQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbiAgXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYXBpZFRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBjb250ZW50Q2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gXCJhdXRvXCI7XHJcbiAgQElucHV0KCkgd2lkdGg6IHN0cmluZyA9IFwiYXV0b1wiO1xyXG4gIEBPdXRwdXQoKSBjb250ZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJsZURpYWxvZycpIHRhYmxlRGlhbG9nITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIGVkaXRvckNvbnRlbnQ6IHN0cmluZyA9ICcnO1xyXG4gIHJvd3M6IG51bWJlciA9IDE7XHJcbiAgY29sczogbnVtYmVyID0gMTtcclxuICBncmlkID0gQXJyYXkoNDkpLmZpbGwoMCk7XHJcbiAgTWF0aCA9IE1hdGg7XHJcbiAgdXBsb2FkZWRJbWFnZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIFxyXG4gICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgX2NoYW5nZTogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdCdWlsZCAtMScpXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnRDYXB0dXJlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDb250ZW50IGNhcHR1cmUgaXMgZW5hYmxlZC4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdDb250ZW50IGNhcHR1cmUgaXMgZGlzYWJsZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snaGVpZ2h0J10gfHwgY2hhbmdlc1snd2lkdGgnXSkge1xyXG4gICAgICB0aGlzLmFwcGx5RGltZW5zaW9ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseURpbWVuc2lvbnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkaW1lbnNpb25FbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kaW1lbnNpb24nKTtcclxuICAgIGlmICh0aGlzLndpZHRoKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZGltZW5zaW9uRWxlbWVudCwgJ3dpZHRoJywgdGhpcy53aWR0aCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBlZGl0b3JFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgIGlmKHRoaXMuaGVpZ2h0KXtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlZGl0b3JFbGVtZW50LCAnaGVpZ2h0JywgdGhpcy5oZWlnaHQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKTtcclxuICAgIGlmIChlZGl0b3IgJiYgKGVkaXRvci5pbm5lckhUTUwudHJpbSgpID09PSBcIlwiIHx8IGVkaXRvci5pbm5lckhUTUwudHJpbSgpID09PSBcIjxicj5cIikpIHtcclxuICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgcmFuZ2Uuc2V0U3RhcnQoZWRpdG9yLCAwKTtcclxuICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRWRpdG9yIGVsZW1lbnQgbm90IGZvdW5kLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gdGhpcy51cGRhdGVDdXJyZW50Rm9ybWF0KCkpO1xyXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcclxuICAgICAgICBzdWJ0cmVlOiB0cnVlXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBvbkNvbnRlbnRDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb250ZW50Q2FwdHVyZSkge1xyXG4gICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmVkaXRvcicpO1xyXG4gICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JDb250ZW50ID0gZWRpdG9yLmlubmVySFRNTDtcclxuICAgICAgICBjb25zb2xlLmxvZygnQ2FwdHVyZWQgQ29udGVudCAoQ2hpbGQpOicsIHRoaXMuZWRpdG9yQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50Q2hhbmdlLmVtaXQodGhpcy5lZGl0b3JDb250ZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvbnRlbnQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZEhlYWQ6IGFueSA9ICdQJztcclxuICBzZWxlY3RlZEZvbnQ6IGFueSA9ICcxNCc7XHJcblxyXG4gIHB1YmxpYyBvbkNoYW5nZSA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcclxuICAgIGlmICh0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PSAnPGJyPicgfHwgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPT0gJycpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gJzE0JztcclxuICAgIH1cclxuICAgIHRoaXMuX2NoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7IH07XHJcblxyXG4gIHdyaXRlVmFsdWUoY29udGVudDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IgJiYgdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGNvbnRlbnQgfHwgJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoY29udGVudDogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIG9uQmx1cigpIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBzZXRGb250U2l6ZShldmVudDogRXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcclxuICAvLyAgIGNvbnN0IHNpemUgPSBzZWxlY3QudmFsdWU7XHJcbiAgLy8gICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG4gIC8vICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAvLyAgIGlmICghcmFuZ2UuY29sbGFwc2VkKSB7XHJcbiAgLy8gICAgIGNvbnN0IHBhcmVudCA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50O1xyXG4gIC8vICAgICBpZiAoXHJcbiAgLy8gICAgICAgcGFyZW50ICYmXHJcbiAgLy8gICAgICAgcGFyZW50LmNsYXNzTGlzdCAmJlxyXG4gIC8vICAgICAgIEFycmF5LmZyb20ocGFyZW50LmNsYXNzTGlzdCkuc29tZSgoYzogc3RyaW5nKSA9PiBjLnN0YXJ0c1dpdGgoJ2ZzLScpKVxyXG4gIC8vICAgICApIHtcclxuICAvLyAgICAgICBwYXJlbnQuc3R5bGUuZm9udFNpemUgPSBgJHtzaXplfXB4YDtcclxuICAvLyAgICAgICBwYXJlbnQuY2xhc3NOYW1lID0gYGZzLSR7c2l6ZX1gO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgLy8gICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IGAke3NpemV9cHhgO1xyXG4gIC8vICAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZChgZnMtJHtzaXplfWApO1xyXG4gIC8vICAgICAgIHJhbmdlLnN1cnJvdW5kQ29udGVudHMoc3Bhbik7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIGVsc2Uge1xyXG4gIC8vICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gIC8vICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgLy8gICAgIHNwYW4uY2xhc3NMaXN0LmFkZChgZnMtJHtzaXplfWApO1xyXG4gIC8vICAgICBzcGFuLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUyMDBCJykpOyAvLyB6ZXJvLXdpZHRoIHNwYWNlXHJcbiAgLy8gICAgIHJhbmdlLmluc2VydE5vZGUoc3Bhbik7XHJcbiAgLy8gICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAvLyAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQoc3Bhbi5maXJzdENoaWxkIGFzIE5vZGUsIDEpO1xyXG4gIC8vICAgICBuZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAvLyAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gIC8vICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgb25FZGl0b3JLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgLy8gaGFuZGxlIEVudGVyIG9yIGFycm93IGtleXNcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBldmVudC5rZXkgPT09ICdBcnJvd1VwJyB8fCBldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGV2ZW50LmtleSA9PT0gJ0JhY2tTcGFjZScgKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudEZvcm1hdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ3VycmVudEZvcm1hdCgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xyXG4gICAgaWYgKCFhbmNob3JOb2RlKSByZXR1cm47XHJcblxyXG4gICAgbGV0IHBhcmVudEVsZW0gPSBhbmNob3JOb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERVxyXG4gICAgICA/IChhbmNob3JOb2RlIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICA6IChhbmNob3JOb2RlLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpO1xyXG5cclxuICAgIGlmICghcGFyZW50RWxlbSkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBkZXRlY3RlZEhlYWQgPSAnUCc7XHJcbiAgICBsZXQgZGV0ZWN0ZWRGb250ID0gJzE0JzsgLy8gZGVmYXVsdFxyXG5cclxuICAgIC8vIFRyYXZlcnNlIHVwd2FyZCB0byBkZXRlY3QgZm9ybWF0dGluZ1xyXG4gICAgd2hpbGUgKHBhcmVudEVsZW0gJiYgcGFyZW50RWxlbSAhPT0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICBjb25zdCB0YWcgPSBwYXJlbnRFbGVtLnRhZ05hbWUudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgIC8vIERldGVjdCBoZWFkaW5nXHJcbiAgICAgIGlmIChbJ0gxJywgJ0gyJywgJ0gzJywgJ0g0JywgJ0g1JywgJ0g2JywgJ1AnXS5pbmNsdWRlcyh0YWcpKSB7XHJcbiAgICAgICAgZGV0ZWN0ZWRIZWFkID0gdGFnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBEZXRlY3QgaW5saW5lIGZvbnQtc2l6ZSBmcm9tIHN0eWxlIG9yIGNsYXNzXHJcbiAgICAgIGNvbnN0IGZvbnRTaXplID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50RWxlbSkuZm9udFNpemU7XHJcbiAgICAgIGlmIChmb250U2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IHB4ID0gcGFyc2VJbnQoZm9udFNpemUucmVwbGFjZSgncHgnLCAnJyksIDEwKTtcclxuICAgICAgICBpZiAoIWlzTmFOKHB4KSkge1xyXG4gICAgICAgICAgZGV0ZWN0ZWRGb250ID0gcHgudG9TdHJpbmcoKTtcclxuICAgICAgICAgIGJyZWFrOyAvLyBmb3VuZCB0aGUgY2xvc2VzdCB2YWxpZCBmb250IHNpemVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHBhcmVudEVsZW0gPSBwYXJlbnRFbGVtLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIGJvdW5kIHByb3BlcnRpZXMgaWYgY2hhbmdlZFxyXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSGVhZCAhPT0gZGV0ZWN0ZWRIZWFkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRIZWFkID0gZGV0ZWN0ZWRIZWFkO1xyXG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRm9udCAhPT0gZGV0ZWN0ZWRGb250KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gZGV0ZWN0ZWRGb250O1xyXG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlZCkge1xyXG4gICAgICB0aGlzLl9jaGFuZ2UuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNldEZvbnRTaXplKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNlbGVjdC52YWx1ZTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcblxyXG4gICAgaWYgKCFyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgLy8gTm9uLWVtcHR5IHNlbGVjdGlvblxyXG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICAgIHNwYW4uY2xhc3NMaXN0LmFkZChgZnMtJHtzaXplfWApO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJhbmdlLnN1cnJvdW5kQ29udGVudHMoc3Bhbik7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIC8vIElmIHNlbGVjdGlvbiBzcGFucyBtdWx0aXBsZSBlbGVtZW50cywgdXNlIGV4ZWNDb21tYW5kIGZhbGxiYWNrXHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvbnRTaXplJywgZmFsc2UsICc3Jyk7IC8vIHRlbXBvcmFyeSBsYXJnZXN0IHNpemVcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdmb250W3NpemU9XCI3XCJdJykuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3NpemUnKTtcclxuICAgICAgICAgIGVsLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1weGA7XHJcbiAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENvbGxhcHNlZCBzZWxlY3Rpb24gKG5vIHRleHQgc2VsZWN0ZWQpXHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW4uc3R5bGUuZm9udFNpemUgPSBgJHtzaXplfXB4YDtcclxuICAgICAgc3Bhbi5jbGFzc0xpc3QuYWRkKGBmcy0ke3NpemV9YCk7XHJcbiAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKSk7IC8vIHplcm8td2lkdGggc3BhY2VcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuXHJcbiAgICAgIC8vIE1vdmUgY3Vyc29yIGluc2lkZSBzcGFuXHJcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQoc3Bhbi5maXJzdENoaWxkIGFzIE5vZGUsIDEpO1xyXG4gICAgICBuZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcclxuICAgIHRoaXMub25DaGFuZ2UoY29udGVudCk7XHJcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRGb3JtYXQoKTtcclxuICAgIHRoaXMuX2NoYW5nZS5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRIZWFkaW5nKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3QgdGFnID0gc2VsZWN0LnZhbHVlO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xyXG4gICAgY29uc3QgbmV3RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcclxuICAgIHN3aXRjaCAodGFnKSB7XHJcbiAgICAgIGNhc2UgJ0gxJzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzMycHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDInOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMjhweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdIMyc6XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250U2l6ZSA9ICcyNHB4JztcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0g0JzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzIwcHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSDUnOlxyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFNpemUgPSAnMThweCc7XHJcbiAgICAgICAgbmV3RWxlbS5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0g2JzpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICc2MDAnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdQJzpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBuZXdFbGVtLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xyXG4gICAgICAgIG5ld0VsZW0uc3R5bGUuZm9udFdlaWdodCA9ICdub3JtYWwnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcbiAgICBpZiAoc2VsZWN0ZWRUZXh0KSB7XHJcbiAgICAgIG5ld0VsZW0udGV4dENvbnRlbnQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdFbGVtLmlubmVySFRNTCA9ICdcXHUyMDBCJzsgLy8gWmVyby13aWR0aCBzcGFjZSB0byBrZWVwIGN1cnNvciB2aXNpYmxlXHJcbiAgICB9XHJcbiAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgcmFuZ2UuaW5zZXJ0Tm9kZShuZXdFbGVtKTtcclxuICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIG5ld1JhbmdlLnNldFN0YXJ0KG5ld0VsZW0sIG5ld0VsZW0uY2hpbGROb2Rlcy5sZW5ndGgpO1xyXG4gICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7XHJcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXQoY29tbWFuZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgJycpO1xyXG4gIH1cclxuXHJcbiAgLy9JbWFnZSBTZWN0aW9uXHJcblxyXG4gIGFsbG93RHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgaW1hZ2UgZHJhZyBzdGFydFxyXG4gIGRyYWcoZXZlbnQ6IERyYWdFdmVudCwgaW1hZ2VVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKFwidGV4dFwiLCBpbWFnZVVybCk7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgZHJvcCBldmVudCBpbiB0aGUgZWRpdG9yXHJcbiAgZHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlSW1hZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy51cGxvYWRlZEltYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0SW1hZ2VJbkVkaXRvcihpbWFnZVVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZWRpdG9yJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFZGl0b3IgZWxlbWVudCBub3QgZm91bmQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDcmVhdGUgaW1hZ2UgZWxlbWVudFxyXG4gICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcbiAgICBpbWcuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICBpbWcuc3R5bGUud2lkdGggPSAnMzAwcHgnO1xyXG4gICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuXHJcbiAgICAvLyBDcmVhdGUgYSB3cmFwcGVyIGFyb3VuZCB0aGUgaW1hZ2UgdG8gYWxsb3cgcmVzaXppbmdcclxuICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHdyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7ICAvLyBFbnN1cmVzIHRoZSB3cmFwcGVyIG9ubHkgdGFrZXMgdXAgc3BhY2UgZm9yIHRoZSBpbWFnZVxyXG4gICAgd3JhcHBlci5zdHlsZS5tYXJnaW4gPSAnMTBweCc7XHJcbiAgICB3cmFwcGVyLnN0eWxlLnBhZGRpbmcgPSAnNXB4JztcclxuICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyID0gJzFweCBkYXNoZWQgI2NjYyc7IC8vIE9wdGlvbmFsIGJvcmRlciB0byBpbmRpY2F0ZSB0aGUgaW1hZ2UgYXJlYVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgaW1hZ2UgdG8gdGhlIHdyYXBwZXJcclxuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTtcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIHdyYXBwZXIgdG8gdGhlIGVkaXRvclxyXG4gICAgZWRpdG9yLmFwcGVuZENoaWxkKHdyYXBwZXIpO1xyXG5cclxuICAgIC8vIE1ha2UgdGhlIGltYWdlIHJlc2l6YWJsZVxyXG4gICAgdGhpcy5tYWtlSW1hZ2VSZXNpemFibGUod3JhcHBlciwgaW1nKTtcclxuXHJcbiAgICAvLyBPcHRpb25hbGx5LCBhZGQgYSB0ZXh0IG5vZGUgdG8gbWFpbnRhaW4gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGVuZGluZyB0aGUgaW1hZ2VcclxuICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1xcdTIwMEInKTsgIC8vIEludmlzaWJsZSBjaGFyYWN0ZXIgdG8gbWFpbnRhaW4gcG9zaXRpb25cclxuICAgIGVkaXRvci5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3cmFwcGVyKTtcclxuICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWFrZUltYWdlUmVzaXphYmxlKHdyYXBwZXI6IEhUTUxFbGVtZW50LCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGxldCBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICBsZXQgc3RhcnRYID0gMDtcclxuICAgIGxldCBzdGFydFkgPSAwO1xyXG4gICAgbGV0IHN0YXJ0V2lkdGggPSAwO1xyXG4gICAgbGV0IHN0YXJ0SGVpZ2h0ID0gMDtcclxuXHJcbiAgICAvLyBDcmVhdGUgcmVzaXplIGhhbmRsZXMgZm9yIHRoZSBpbWFnZVxyXG4gICAgY29uc3QgY3JlYXRlUmVzaXplSGFuZGxlID0gKFxyXG4gICAgICBjdXJzb3I6IHN0cmluZyxcclxuICAgICAgcG9zaXRpb25TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgICAgIHJlc2l6ZUNhbGxiYWNrOiAoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSA9PiB2b2lkXHJcbiAgICApID0+IHtcclxuICAgICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgIGhhbmRsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgIGhhbmRsZS5zdHlsZS53aWR0aCA9ICcxMHB4JztcclxuICAgICAgaGFuZGxlLnN0eWxlLmhlaWdodCA9ICcxMHB4JztcclxuICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmQgPSAncmdiYSgwLCAwLCAwLCAwLjUpJztcclxuICAgICAgaGFuZGxlLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcclxuICAgICAgT2JqZWN0LmFzc2lnbihoYW5kbGUuc3R5bGUsIHBvc2l0aW9uU3R5bGVzKTtcclxuXHJcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAocmVzaXplRXZlbnQpID0+IHtcclxuICAgICAgICBpc1Jlc2l6aW5nID0gdHJ1ZTtcclxuICAgICAgICBzdGFydFggPSByZXNpemVFdmVudC5jbGllbnRYO1xyXG4gICAgICAgIHN0YXJ0WSA9IHJlc2l6ZUV2ZW50LmNsaWVudFk7XHJcbiAgICAgICAgc3RhcnRXaWR0aCA9IGltZy5vZmZzZXRXaWR0aDtcclxuICAgICAgICBzdGFydEhlaWdodCA9IGltZy5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzUmVzaXppbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gbW92ZUV2ZW50LmNsaWVudFggLSBzdGFydFg7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IG1vdmVFdmVudC5jbGllbnRZIC0gc3RhcnRZO1xyXG4gICAgICAgICAgICByZXNpemVDYWxsYmFjayhkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgaXNSZXNpemluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIHJlc2l6aW5nIGhhbmRsZXMgdG8gdGhlIHdyYXBwZXIgZm9yIHRoZSBpbWFnZVxyXG4gICAgY3JlYXRlUmVzaXplSGFuZGxlKFxyXG4gICAgICAnbnctcmVzaXplJyxcclxuICAgICAgeyB0b3A6ICctNXB4JywgbGVmdDogJy01cHgnIH0sXHJcbiAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggLSBkZWx0YVh9cHhgO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCAtIGRlbHRhWX1weGA7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICdzZS1yZXNpemUnLFxyXG4gICAgICB7IGJvdHRvbTogJy01cHgnLCByaWdodDogJy01cHgnIH0sXHJcbiAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgIGltZy5zdHlsZS53aWR0aCA9IGAke3N0YXJ0V2lkdGggKyBkZWx0YVh9cHhgO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCArIGRlbHRhWX1weGA7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRJbWFnZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAoaW5wdXQ/LmZpbGVzKSB7XHJcbiAgICAgIEFycmF5LmZyb20oaW5wdXQuZmlsZXMpLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaW1hZ2VVcmwgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkSW1hZ2VzLnB1c2goaW1hZ2VVcmwpOyAvLyBTdG9yZSBpbWFnZSBVUkwgaW4gdGhlIGFycmF5XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb252ZXJ0SW1hZ2UoZmlsZTogRmlsZSk6IFByb21pc2U8RmlsZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKGZpbGUudHlwZSAhPT0gJ2ltYWdlL3BuZycpIHtcclxuICAgICAgICByZXNvbHZlKGZpbGUpOyAvLyBSZXR1cm4gdGhlIG9yaWdpbmFsIGZpbGUgaWYgaXQncyBub3QgYSBQTkdcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICBpbWcuc3JjID0gZS50YXJnZXQucmVzdWx0O1xyXG5cclxuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWN0eCkge1xyXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IGNhbnZhcyBjb250ZXh0JykpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xyXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xyXG4gICAgICAgICAgY2FudmFzLnRvQmxvYihcclxuICAgICAgICAgICAgYmxvYiA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGJsb2IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpwZ0ZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIGZpbGUubmFtZS5yZXBsYWNlKC9cXC5wbmckLywgJy5qcGcnKSwgeyB0eXBlOiAnaW1hZ2UvanBlZycgfSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGpwZ0ZpbGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gY29udmVydCBQTkcgdG8gSlBHJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgJ2ltYWdlL2pwZWcnLFxyXG4gICAgICAgICAgICAwLjk1IC8vIFF1YWxpdHkgZmFjdG9yIGZvciBKUEVHXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWFkIHRoZSBmaWxlJykpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpbnNlcnRJbWFnZVRvRWRpdG9yKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICBpZiAoZmlsZSkge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGltYWdlVXJsID0gZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5lZGl0b3InKSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VkaXRvciBlbGVtZW50IG5vdCBmb3VuZC4nKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHdyYXBwZXIuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcclxuICAgICAgICB3cmFwcGVyLnN0eWxlLmJvcmRlciA9ICcxcHggZGFzaGVkICNjY2MnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUubWFyZ2luID0gJzEwcHgnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUucGFkZGluZyA9ICc1cHgnO1xyXG4gICAgICAgIHdyYXBwZXIuc3R5bGUuYm9yZGVyQmxvY2tDb2xvciA9ICcjMDA3QkZGJztcclxuICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgICBpbWcuc3JjID0gaW1hZ2VVcmw7XHJcbiAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICBpbWcuc3R5bGUud2lkdGggPSAnMzAwcHgnO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChpbWcpO1xyXG4gICAgICAgIGxldCBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHN0YXJ0WCA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0WSA9IDA7XHJcbiAgICAgICAgbGV0IHN0YXJ0V2lkdGggPSAwO1xyXG4gICAgICAgIGxldCBzdGFydEhlaWdodCA9IDA7XHJcblxyXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlc2l6ZUhhbmRsZSA9IChcclxuICAgICAgICAgIGN1cnNvcjogc3RyaW5nLFxyXG4gICAgICAgICAgcG9zaXRpb25TdHlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXHJcbiAgICAgICAgICByZXNpemVDYWxsYmFjazogKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcikgPT4gdm9pZFxyXG4gICAgICAgICkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLndpZHRoID0gJzEwcHgnO1xyXG4gICAgICAgICAgaGFuZGxlLnN0eWxlLmhlaWdodCA9ICcxMHB4JztcclxuICAgICAgICAgIGhhbmRsZS5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMCwgMCwgMCwgMC41KSc7XHJcbiAgICAgICAgICBoYW5kbGUuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihoYW5kbGUuc3R5bGUsIHBvc2l0aW9uU3R5bGVzKTtcclxuXHJcbiAgICAgICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKHJlc2l6ZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGlzUmVzaXppbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICBzdGFydFggPSByZXNpemVFdmVudC5jbGllbnRYO1xyXG4gICAgICAgICAgICBzdGFydFkgPSByZXNpemVFdmVudC5jbGllbnRZO1xyXG4gICAgICAgICAgICBzdGFydFdpZHRoID0gaW1nLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBzdGFydEhlaWdodCA9IGltZy5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IChtb3ZlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaXNSZXNpemluZykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gbW92ZUV2ZW50LmNsaWVudFggLSBzdGFydFg7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVkgPSBtb3ZlRXZlbnQuY2xpZW50WSAtIHN0YXJ0WTtcclxuICAgICAgICAgICAgICAgIHJlc2l6ZUNhbGxiYWNrKGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IG9uTW91c2VVcCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICBpc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNyZWF0ZVJlc2l6ZUhhbmRsZShcclxuICAgICAgICAgICdudy1yZXNpemUnLFxyXG4gICAgICAgICAgeyB0b3A6ICctNXB4JywgbGVmdDogJy01cHgnIH0sXHJcbiAgICAgICAgICAoZGVsdGFYLCBkZWx0YVkpID0+IHtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLndpZHRoID0gYCR7c3RhcnRXaWR0aCAtIGRlbHRhWH1weGA7XHJcbiAgICAgICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBgJHtzdGFydEhlaWdodCAtIGRlbHRhWX1weGA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBjcmVhdGVSZXNpemVIYW5kbGUoXHJcbiAgICAgICAgICAnc2UtcmVzaXplJyxcclxuICAgICAgICAgIHsgYm90dG9tOiAnLTVweCcsIHJpZ2h0OiAnLTVweCcgfSxcclxuICAgICAgICAgIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xyXG4gICAgICAgICAgICBpbWcuc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRoICsgZGVsdGFYfXB4YDtcclxuICAgICAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9IGAke3N0YXJ0SGVpZ2h0ICsgZGVsdGFZfXB4YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIGVkaXRvci5hcHBlbmRDaGlsZCh3cmFwcGVyKTtcclxuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcXHUyMDBCJyk7XHJcbiAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHRleHROb2RlKTtcclxuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcih3cmFwcGVyKTtcclxuICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKTtcclxuICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlblRhYmxlRGlhbG9nKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmluc2VydE1hcmtlcigpO1xyXG4gICAgdGhpcy5yb3dzID0gMTtcclxuICAgIHRoaXMuY29scyA9IDE7XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbih0aGlzLnRhYmxlRGlhbG9nLCB7XHJcbiAgICAgIHBvc2l0aW9uOiB7XHJcbiAgICAgICAgdG9wOiBgJHtldmVudC5jbGllbnRZfXB4YCxcclxuICAgICAgICBsZWZ0OiBgJHtldmVudC5jbGllbnRYfXB4YCxcclxuICAgICAgfSxcclxuICAgICAgcGFuZWxDbGFzczogJ2N1c3RvbS1kaWFsb2ctY29udGFpbmVyJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuaW5zZXJ0VGFibGUocmVzdWx0LnJvd3MsIHJlc3VsdC5jb2xzKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcmV2aWV3KGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNvbHMgPSBjb2xzO1xyXG4gICAgdGhpcy5yb3dzID0gcm93cztcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGlvbihjb2xJbmRleDogbnVtYmVyLCByb3dJbmRleDogbnVtYmVyLCBkaWFsb2dSZWY6IGFueSkge1xyXG4gICAgdGhpcy5jb2xzID0gY29sSW5kZXg7XHJcbiAgICB0aGlzLnJvd3MgPSByb3dJbmRleDtcclxuICAgIGRpYWxvZ1JlZi5jbG9zZSh7IHJvd3M6IHRoaXMucm93cywgY29sczogdGhpcy5jb2xzIH0pOyAvLyBDbG9zZSBkaWFsb2cgd2l0aCBzZWxlY3Rpb25cclxuICB9XHJcblxyXG4gIG1ha2VGaXJzdFJvd0hlYWRlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAvLyBDaGVjayBpZiBzZWxlY3Rpb24gaXMgaW5zaWRlIHRoZSBlZGl0b3JcclxuICAgIGlmICghdGhpcy5pc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3IsIHNlbGVjdGlvbikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gRmluZCB0aGUgY2xvc2VzdCB0YWJsZSB0byB0aGUgc2VsZWN0aW9uXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZmluZENsb3Nlc3RUYWJsZShzZWxlY3RlZE5vZGUpO1xyXG4gICAgaWYgKCF0YWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBDb252ZXJ0IHRoZSBmaXJzdCByb3cgY2VsbHMgdG8gaGVhZGVyIGNlbGxzXHJcbiAgICBjb25zdCBmaXJzdFJvdyA9IHRhYmxlLnJvd3NbMF07XHJcbiAgICBpZiAoZmlyc3RSb3cpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tpXTtcclxuICAgICAgICBjb25zdCB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RoJyk7XHJcbiAgICAgICAgdGguaW5uZXJIVE1MID0gY2VsbC5pbm5lckhUTUw7XHJcbiAgICAgICAgdGguc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICAgICAgdGguc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNGMUYxRjAnO1xyXG4gICAgICAgIHRoLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgYmxhY2snO1xyXG4gICAgICAgIHRoLnN0eWxlLmJvcmRlckNvbGxhcHNlID0gJ2NvbGxhcHNlJztcclxuICAgICAgICB0aC5zdHlsZS5wYWRkaW5nID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2VsbCkucGFkZGluZzsgLy8gUmV0YWluIHBhZGRpbmdcclxuICAgICAgICB0aC5zdHlsZS53aWR0aCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpLndpZHRoOyAvLyBSZXRhaW4gd2lkdGhcclxuICAgICAgICB0aC5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjZWxsKS5oZWlnaHQ7XHJcbiAgICAgICAgZmlyc3RSb3cucmVwbGFjZUNoaWxkKHRoLCBjZWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmRDbG9zZXN0VGFibGUobm9kZTogTm9kZSk6IEhUTUxUYWJsZUVsZW1lbnQgfCBudWxsIHtcclxuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50KSB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAnVEFCTEUnKSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnNlcnRNYXJrZXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTtcclxuICAgICAgY29uc3QgbWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICBtYXJrZXIuaWQgPSAndGFibGUtbWFya2VyJztcclxuICAgICAgbWFya2VyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgIHJhbmdlLmluc2VydE5vZGUobWFya2VyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluc2VydFRhYmxlKHJvd3M6IHN0cmluZywgY29sczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dDb3VudCA9IHBhcnNlSW50KHJvd3MsIDEwKTtcclxuICAgIGNvbnN0IGNvbENvdW50ID0gcGFyc2VJbnQoY29scywgMTApO1xyXG5cclxuICAgIGlmIChpc05hTihyb3dDb3VudCkgfHwgaXNOYU4oY29sQ291bnQpIHx8IHJvd0NvdW50IDwgMSB8fCBjb2xDb3VudCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBtYXJrZXIgPSBlZGl0b3IucXVlcnlTZWxlY3RvcignI3RhYmxlLW1hcmtlcicpO1xyXG5cclxuICAgIGNvbnN0IHRhYmxlSFRNTCA9IHRoaXMuY3JlYXRlVGFibGVIVE1MKHJvd0NvdW50LCBjb2xDb3VudCk7XHJcbiAgICBjb25zdCB0ZW1wRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0ZW1wRGl2LmlubmVySFRNTCA9IHRhYmxlSFRNTDtcclxuICAgIGNvbnN0IHRhYmxlID0gdGVtcERpdi5maXJzdEVsZW1lbnRDaGlsZDtcclxuXHJcbiAgICBpZiAobWFya2VyICYmIHRhYmxlKSB7XHJcbiAgICAgIG1hcmtlci5wYXJlbnROb2RlIS5yZXBsYWNlQ2hpbGQodGFibGUsIG1hcmtlcik7XHJcbiAgICAgIHRoaXMuc2V0Q3Vyc29yVG9GaXJzdENlbGwodGFibGUgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGZhbGxiYWNrIGlmIG5vIG1hcmtlciwganVzdCBhcHBlbmRcclxuICAgICAgdGhpcy5hcHBlbmRUYWJsZShlZGl0b3IsIHJvd0NvdW50LCBjb2xDb3VudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCB0YWJsZUhUTUwgPSAnPHRhYmxlIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4OyB3aWR0aDogMTAwJTsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XCI+JztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykge1xyXG4gICAgICB0YWJsZUhUTUwgKz0gJzx0cj4nO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHtcclxuICAgICAgICB0YWJsZUhUTUwgKz0gYDx0ZCBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBoZWlnaHQ6IDJlbTsgcGFkZGluZzogLjRlbTsgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+PC90ZD5gO1xyXG4gICAgICB9XHJcbiAgICAgIHRhYmxlSFRNTCArPSAnPC90cj4nO1xyXG4gICAgfVxyXG4gICAgdGFibGVIVE1MICs9ICc8L3RhYmxlPic7XHJcbiAgICByZXR1cm4gdGFibGVIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRUYWJsZShlZGl0b3I6IEhUTUxFbGVtZW50LCByb3dDb3VudDogbnVtYmVyLCBjb2xDb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB0YWJsZUhUTUwgPSB0aGlzLmNyZWF0ZVRhYmxlSFRNTChyb3dDb3VudCwgY29sQ291bnQpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCArPSB0YWJsZUhUTUw7XHJcbiAgICBjb25zdCBsYXN0SW5zZXJ0ZWRUYWJsZSA9IGVkaXRvci5xdWVyeVNlbGVjdG9yKCd0YWJsZTpsYXN0LWNoaWxkJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNldEN1cnNvclRvRmlyc3RDZWxsKGxhc3RJbnNlcnRlZFRhYmxlKTtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1NlbGVjdGlvbkluc2lkZUVkaXRvcihlZGl0b3I6IEhUTUxFbGVtZW50LCBzZWxlY3Rpb246IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgbGV0IG5vZGUgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIGlmIChub2RlID09PSBlZGl0b3IpIHJldHVybiB0cnVlO1xyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q3Vyc29yVG9GaXJzdENlbGwodGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBmaXJzdENlbGwgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0cjpmaXJzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZCwgdHI6Zmlyc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChmaXJzdENlbGwpIHtcclxuICAgICAgZmlyc3RDZWxsLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcclxuICAgICAgZmlyc3RDZWxsLmZvY3VzKCk7XHJcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGZpcnN0Q2VsbCk7IC8vIFNlbGVjdCB0aGUgY29udGVudHMgb2YgdGhlIGNlbGxcclxuICAgICAgbmV3UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIENvbGxhcHNlIHRvIHRoZSBzdGFydFxyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0UGFnZUJyZWFrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFnZUJyZWFrID0gYDxkaXYgc3R5bGU9XCJwYWdlLWJyZWFrLWFmdGVyOiBhbHdheXM7XCI+PGJyIC8+PC9kaXY+YDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHBhZ2VCcmVhayk7XHJcbiAgfVxyXG5cclxuICBzdWJtaXRDb250ZW50KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MOyAvLyBHZXQgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBlZGl0b3JcclxuICAgIGNvbnN0IHBsYWluVGV4dENvbnRlbnQgPSBlZGl0b3IuaW5uZXJUZXh0OyAvLyBPcHRpb25hbGx5LCBnZXQgcGxhaW4gdGV4dCBjb250ZW50XHJcbiAgICB0aGlzLm9uQ2hhbmdlKGNvbnRlbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGltZW5zaW9uXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJpY2gtdGV4dC1lZGl0b3JcIj5cclxuICAgIDwhLS0gVG9vbGJhciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCI+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRIZWFkXCIgKGNoYW5nZSk9XCJzZXRIZWFkaW5nKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUFwiIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiPlBhcmFncmFwaDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMVwiIHN0eWxlPVwiZm9udC1zaXplOiAzMnB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMTwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIMlwiIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMjwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiIHN0eWxlPVwiZm9udC1zaXplOiAyNHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5IMzwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINFwiIHN0eWxlPVwiZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogYm9sZDtcIj5INDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gdmFsdWU9XCJINVwiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNjAwO1wiPkg1PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkg2XCIgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+SDY8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGb250XCJcclxuICAgICAgICAoY2hhbmdlKT1cInNldEZvbnRTaXplKCRldmVudClcIj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1wiIHZhbHVlPVwiMTJcIj4xMnB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDtcIiB2YWx1ZT1cIjE0XCIgc2VsZWN0ZWQ+MTRweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDE2cHg7XCIgdmFsdWU9XCIxNlwiPjE2cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiIHZhbHVlPVwiMThcIj4xOHB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIiB2YWx1ZT1cIjIwXCI+MjBweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDI0cHg7XCIgdmFsdWU9XCIyNFwiPjI0cHg8L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uIHN0eWxlPVwiZm9udC1zaXplOiAyOHB4O1wiIHZhbHVlPVwiMjhcIj4yOHB4PC9vcHRpb24+XHJcbiAgICAgICAgPG9wdGlvbiBzdHlsZT1cImZvbnQtc2l6ZTogMzJweDtcIiB2YWx1ZT1cIjMyXCI+MzJweDwvb3B0aW9uPlxyXG4gICAgICAgIDxvcHRpb24gc3R5bGU9XCJmb250LXNpemU6IDQ4cHg7XCIgdmFsdWU9XCI0OFwiPjQ4cHg8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnYm9sZCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJCb2xkXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9ib2xkPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2l0YWxpYycpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJJdGFsaWNcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2l0YWxpYzwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCd1bmRlcmxpbmUnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiVW5kZXJsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF91bmRlcmxpbmU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnc3RyaWtldGhyb3VnaCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJTdHJpa2V0aHJvdWdoXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnN0cmlrZXRocm91Z2hfczwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5TGVmdCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJBbGlnbiBMZWZ0XCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9sZWZ0PC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlDZW50ZXInKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiQ2VudGVyXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9jZW50ZXI8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeVJpZ2h0JylcIiB0eXBlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIkFsaWduIFJpZ2h0XCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9yaWdodDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5RnVsbCcpXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJKdXN0aWZ5XCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9hbGlnbl9qdXN0aWZ5PC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiVW5vcmRlcmVkIExpc3RcIj5cclxuICAgICAgICA8bWF0LWljb24+Zm9ybWF0X2xpc3RfYnVsbGV0ZWQ8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0T3JkZXJlZExpc3QnKVwiIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiT3JkZXJlZCBMaXN0XCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmZvcm1hdF9saXN0X251bWJlcmVkPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiSW5zZXJ0IEltYWdlXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1mbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIj5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cImluc2VydEltYWdlVG9FZGl0b3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogLTUwJTsgdG9wOiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBvcGFjaXR5OiAwOyBjdXJzb3I6IHBvaW50ZXI7XCJcclxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwicG9pbnRlci1ldmVudHM6IG5vbmU7XCI+aW5zZXJ0X3Bob3RvX291dGxpbmVkPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9wZW5UYWJsZURpYWxvZygkZXZlbnQpXCIgdHlwZT1cImJ1dHRvblwiIGNvbG9yPVwic2Vjb25kYXJ5XCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiQ2hvb3NlIHRhYmxlIHJvd3MgYW5kIGNvbHVtbnNcIj5cclxuICAgICAgICA8bWF0LWljb24+Ym9yZGVyX2FsbDwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1iLTFcIiAoY2xpY2spPVwibWFrZUZpcnN0Um93SGVhZGVyKClcIiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBhcmlhLWxhYmVsPVwiTWFrZSBIZWFkZXJcIj5cclxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMjBweDtcIiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cclxuICAgICAgICAgIHBhZ2VfaGVhZGVyXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImVkaXRvclwiIGlkPVwiZWRpdG9yXCIgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiICNlZGl0b3IgKGlucHV0KT1cInN1Ym1pdENvbnRlbnQoKVwiIChibHVyKT1cIm9uQmx1cigpXCIgKGtleXVwKT1cIm9uRWRpdG9yS2V5VXAoJGV2ZW50KVwiIChtb3VzZXVwKT1cInVwZGF0ZUN1cnJlbnRGb3JtYXQoKVwiXHJcbiAgICAgIChkcm9wKT1cImRyb3AoJGV2ZW50KVwiIChkcmFnb3Zlcik9XCJhbGxvd0Ryb3AoJGV2ZW50KVwiPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPG5nLXRlbXBsYXRlICN0YWJsZURpYWxvZyBsZXQtZGlhbG9nUmVmPVwiZGlhbG9nUmVmXCI+XHJcbiAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT5DaG9vc2UgVGFibGUgU2l6ZTwvaDI+XHJcbiAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjZWxsIG9mIGdyaWQ7IGxldCBpID0gaW5kZXhcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ2dyaWQtaXRlbSc6IHRydWUsXHJcbiAgICAgICAgJ2hpZ2hsaWdodGVkJzogaSAlIDcgPCBjb2xzICYmIE1hdGguZmxvb3IoaSAvIDcpIDwgcm93c1xyXG4gICAgICB9XCIgKG1vdXNlZW50ZXIpPVwidXBkYXRlUHJldmlldyhpICUgNyArIDEsIE1hdGguZmxvb3IoaSAvIDcpICsgMSlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVNlbGVjdGlvbihpICUgNyArIDEsIE1hdGguZmxvb3IoaSAvIDcpICsgMSwgZGlhbG9nUmVmKVwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHA+e3sgcm93cyB9fSB4IHt7IGNvbHMgfX0gPC9wPlxyXG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9kaXY+XHJcbiJdfQ==