mmhglobal-dynamicform 2.44.1 → 2.44.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,6 +3,12 @@
3
3
  This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.13.
4
4
 
5
5
  ## Changelog
6
+ ### 2.44.2
7
+ - [ztexteditor]
8
+ - Refactor paste logic to normalize line endings and insert plain text as editor HTML, respecting Enter key behavior.
9
+ - Escape HTML entities, handle empty lines, and remove empty paragraphs from pasted HTML.
10
+ - Add utility methods for text conversion and update Shift-Enter keymap to support splitBlock.
11
+
6
12
  ### 2.44.1
7
13
  - [ztexteditor]
8
14
  - Updated default Enter key behavior.
@@ -1,6 +1,6 @@
1
1
  /********** Angular **********/
2
2
  import { Component, ViewChild } from '@angular/core';
3
- import { chainCommands, exitCode, keymap } from '@progress/kendo-editor-common';
3
+ import { chainCommands, DOMParser as ProseMirrorDOMParser, exitCode, keymap, splitBlock } from '@progress/kendo-editor-common';
4
4
  /********** RxJS **********/
5
5
  import { firstValueFrom } from 'rxjs';
6
6
  /********** Component & Service **********/
@@ -111,14 +111,42 @@ export class ZtexteditorComponent extends InputFieldBase {
111
111
  if (htmlHasImg || cleanedHasTags) {
112
112
  return false;
113
113
  }
114
- // Plain-text paste: prevent Kendo from inserting encoded entities as literal text.
115
- e.preventDefault();
116
- // Decode common entities once so user sees correct characters.
117
- // This is intentionally limited to common entities to avoid unexpected transformations.
118
114
  const normalized = this.normalizePastedText(plainText || cleanedHtml);
119
- editor.exec('insertText', { text: normalized });
115
+ e.preventDefault();
116
+ this.insertPlainTextWithEditorLineBreaks(this.normalizeLineEndings(normalized));
120
117
  return true;
121
118
  }
119
+ normalizeLineEndings(value) {
120
+ return value.replace(/\r\n|\r/g, '\n');
121
+ }
122
+ insertPlainTextWithEditorLineBreaks(value) {
123
+ const view = this.editor?.view;
124
+ if (!view) {
125
+ console.warn('[Ztexteditor] Editor view is not ready. Cannot insert pasted text.');
126
+ return;
127
+ }
128
+ const container = document.createElement('div');
129
+ container.innerHTML = this.plainTextToEditorHtml(value);
130
+ const slice = ProseMirrorDOMParser.fromSchema(view.state.schema).parseSlice(container);
131
+ view.dispatch(view.state.tr.replaceSelection(slice).scrollIntoView());
132
+ }
133
+ plainTextToEditorHtml(value) {
134
+ const lines = value.split('\n');
135
+ if (this.data?.EnterKeyBehavior === 'paragraph') {
136
+ return lines
137
+ .map(line => line.trim() ? `<p>${this.escapeHtml(line)}</p>` : '<p><br></p>')
138
+ .join('');
139
+ }
140
+ return `<p>${lines.map(line => this.escapeHtml(line)).join('<br>')}</p>`;
141
+ }
142
+ escapeHtml(value) {
143
+ return value
144
+ .replaceAll('&', '&amp;')
145
+ .replaceAll('<', '&lt;')
146
+ .replaceAll('>', '&gt;')
147
+ .replaceAll('"', '&quot;')
148
+ .replaceAll("'", '&#39;');
149
+ }
122
150
  /** Normalize text nodes inside pasted HTML without touching tags, styles, links, or image attributes. */
123
151
  normalizePastedHtml(e) {
124
152
  if (!this.symbolNormalizationSettings.Enabled) {
@@ -142,8 +170,26 @@ export class ZtexteditorComponent extends InputFieldBase {
142
170
  node.textContent = this.normalizePastedText(node.textContent ?? '');
143
171
  node = walker.nextNode();
144
172
  }
173
+ this.removeEmptyParagraphs(doc);
145
174
  e.cleanedHtml = doc.body.innerHTML;
146
175
  }
176
+ removeEmptyParagraphs(doc) {
177
+ const emptyParagraphs = Array.from(doc.body.querySelectorAll('p')).filter(paragraph => this.isEmptyParagraph(paragraph));
178
+ emptyParagraphs.forEach(paragraph => paragraph.remove());
179
+ }
180
+ isEmptyParagraph(paragraph) {
181
+ const allowedEmptyNodes = Array.from(paragraph.childNodes).every(node => {
182
+ if (node.nodeType === Node.TEXT_NODE) {
183
+ return !(node.textContent ?? '').trim();
184
+ }
185
+ if (node.nodeType !== Node.ELEMENT_NODE) {
186
+ return false;
187
+ }
188
+ const element = node;
189
+ return element.tagName.toLowerCase() === 'br';
190
+ });
191
+ return allowedEmptyNodes && !(paragraph.textContent ?? '').trim();
192
+ }
147
193
  /** Normalize known paste symbol variants from Office/email content into stable display characters. */
148
194
  normalizePastedText(value) {
149
195
  if (!this.symbolNormalizationSettings.Enabled || !value) {
@@ -286,6 +332,7 @@ export class ZtexteditorComponent extends InputFieldBase {
286
332
  }
287
333
  enterAsLineBreakPlugin() {
288
334
  return keymap({
335
+ 'Shift-Enter': chainCommands(exitCode, splitBlock),
289
336
  Enter: chainCommands(exitCode, (state, dispatch) => {
290
337
  const hardBreak = state.schema.nodes.hard_break;
291
338
  if (!hardBreak || !state.selection.$from.parent.inlineContent) {
@@ -599,4 +646,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
599
646
  type: ViewChild,
600
647
  args: ['editor']
601
648
  }] } });
602
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4Riw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFVTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBZ0R0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztR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Q0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2lIQXRzQlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsZ0xDaENqQywwOVRBMklBOzJGRDNHYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsaUJBQWlCOzhQQUtDLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCwgRWRpdG9yUGFzdGVFdmVudCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWVkaXRvcic7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcbmltcG9ydCB7IGNoYWluQ29tbWFuZHMsIGV4aXRDb2RlLCBrZXltYXAsIFBsdWdpbiB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1lZGl0b3ItY29tbW9uJztcclxuXHJcbi8qKioqKioqKioqIFJ4SlMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW5wdXRGaWVsZEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL2lucHV0ZmllbGRiYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFpDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBBbGVydEJ1dHRvbixcclxuICBBbGVydFNlcnZpY2UsXHJcbiAgQ29tcHJlc3NJbWFnZVNlcnZpY2UsXHJcbiAgRm9udEF3ZVNvbWVTZXJ2aWNlLFxyXG4gIEltYWdlQ29tcHJlc3Npb25Db25maWcsXHJcbiAgVGV4dEVkaXRvclN5bWJvbE5vcm1hbGl6YXRpb25Db25maWcsXHJcbiAgVGV4dEVkaXRvclN5bWJvbFJlcGxhY2VtZW50LFxyXG4gIFRvYXN0U2VydmljZSxcclxuICBaQ29tcG9uZW50LFxyXG4gIFpDb21wb25lbnRIZWxwZXJcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenRleHRlZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96dGV4dGVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4venRleHRlZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIHB1YmxpYyBlZGl0b3IhOiBFZGl0b3JDb21wb25lbnQ7XHJcblxyXG4gIHB1YmxpYyBwYXN0ZUNsZWFudXBTZXR0aW5nczoge1xyXG4gICAgcmVtb3ZlTXNDbGFzc2VzOiBib29sZWFuO1xyXG4gICAgcmVtb3ZlTXNTdHlsZXM6IGJvb2xlYW47XHJcbiAgICByZW1vdmVJbnZhbGlkSFRNTDogYm9vbGVhbjtcclxuICAgIFtrZXk6IHN0cmluZ106IGFueTtcclxuICB9ID0ge1xyXG4gICAgcmVtb3ZlTXNDbGFzc2VzOiBmYWxzZSxcclxuICAgIHJlbW92ZU1zU3R5bGVzOiBmYWxzZSxcclxuICAgIHJlbW92ZUludmFsaWRIVE1MOiBmYWxzZSxcclxuICB9O1xyXG5cclxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3M6IHsgaWZyYW1lOiBib29sZWFuOyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcclxuICAgIGlmcmFtZTogdHJ1ZSxcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzOiBSZXF1aXJlZDxPbWl0PFRleHRFZGl0b3JTeW1ib2xOb3JtYWxpemF0aW9uQ29uZmlnLCAnQ3VzdG9tUmVwbGFjZW1lbnRzJz4+ICYge1xyXG4gICAgQ3VzdG9tUmVwbGFjZW1lbnRzOiBUZXh0RWRpdG9yU3ltYm9sUmVwbGFjZW1lbnRbXTtcclxuICB9ID0ge1xyXG4gICAgRW5hYmxlZDogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZUh0bWxFbnRpdGllczogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZURhc2g6IHRydWUsXHJcbiAgICBOb3JtYWxpemVRdW90ZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVTcGFjZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVFbGxpcHNpczogdHJ1ZSxcclxuICAgIEN1c3RvbVJlcGxhY2VtZW50czogW10sXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnNDYWxsYmFjayA9IChkZWZhdWx0UGx1Z2luczogUGx1Z2luW10pOiBQbHVnaW5bXSA9PiB7XHJcbiAgICBpZiAodGhpcy5kYXRhPy5FbnRlcktleUJlaGF2aW9yID09PSAncGFyYWdyYXBoJykge1xyXG4gICAgICByZXR1cm4gZGVmYXVsdFBsdWdpbnM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFt0aGlzLmVudGVyQXNMaW5lQnJlYWtQbHVnaW4oKSwgLi4uZGVmYXVsdFBsdWdpbnNdO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBpc0NvbXByZXNzTW9kZU9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIENsb3NlRW5sYXJnZUJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZGlhbG9nUmVmPzogRGlhbG9nUmVmO1xyXG5cclxuICBwcml2YXRlIG9yaWdpbmFsSW5saW5lU3R5bGU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uRW5hYmxlSWNvbjogc3RyaW5nID0gJ2staS16b29tLWJlc3QtZml0JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uRGlzYWJsZWRJY29uOiBzdHJpbmcgPSAnay1pLXpvb20tYWN0dWFsLXNpemUnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHB1YmxpYyByZWFkb25seSBmb250QXdlU29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzSW1hZ2U6IENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemUgY29tcG9uZW50IHN0YXRlIGFuZCBlZGl0b3IgY29uZmlndXJhdGlvbi4gKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuXHJcbiAgICAvLyBCYWNrd2FyZC1jb21wYXRpYmxlIGRlZmF1bHQ6IHdoZW4gbm90IHByb3ZpZGVkLCB1c2UgZXhwbG9yZXIuXHJcbiAgICB0aGlzLmRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID0gdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCB8fCAnZXhwbG9yZXInO1xyXG5cclxuICAgIHRoaXMuc2V0dXBQYXN0ZUNsZWFudXBTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5zZXR1cFN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncygpO1xyXG4gICAgc3VwZXIuc2V0dXBDb21wb25lbnRTZXR0aW5ncyh0aGlzLmNvbXBvbmVudFNldHRpbmdzKTtcclxuICAgIHN1cGVyLmZvY3VzT25EZWZhdWx0KHRoaXMuZm9jdXMuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgLy8gU2FmZSBjYXN0IHRvIGJvb2xlYW4uXHJcbiAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhIXRoaXMuZGF0YT8uQ29tcHJlc3Npb247XHJcbiAgfVxyXG5cclxuICAvKiogTm90aWZ5IGNvbXBvbmVudCBzZXJ2aWNlIG9uY2UgdmlldyBpcyByZWFkeS4gKi9cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN5bmMgZWRpdG9yIGNvbnRlbnQgdG8gek1vZGVsIGFuZCB0cmlnZ2VyIGNvbmZpZ3VyZWQgY2hhbmdlIGhhbmRsZXIuICovXHJcbiAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldFRvWk1vZGVsKHRoaXMuZGF0YS5WYWx1ZSwgdmFsdWUsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLnRyaWdnZXJFdmVudCgnaW5wdXRmaWVsZC1vbkNoYW5nZScsIHRoaXMuZGF0YS5PbkNoYW5nZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZSBwYXN0ZTogbm9ybWFsaXplIHBsYWluLXRleHQgc3BlY2lhbCBlbnRpdGllcywgdGhlbiBvcHRpb25hbGx5IGNvbXByZXNzIHBhc3RlZCBiYXNlNjQgaW1hZ2VzLiAqL1xyXG4gIHB1YmxpYyBhc3luYyBvblBhc3RlKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gUGFzdGUgZXZlbnQgaXMgdW5kZWZpbmVkLiBQYXN0ZSBpZ25vcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29tbW9uIEV4Y2VsL3BsYWluLXRleHQgaXNzdWU6IFwiJmFtcDtcIiBnZXRzIGluc2VydGVkIGxpdGVyYWxseSBjYXVzaW5nIFwiJmFtcDthbXA7XCIgaW4gSFRNTC5cclxuICAgIGNvbnN0IGlzSGFuZGxlZCA9IHRoaXMuaGFuZGxlQ29tbW9uU3ltYm9sVGFncyhlKTtcclxuICAgIGlmIChpc0hhbmRsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm9ybWFsaXplUGFzdGVkSHRtbChlKTtcclxuXHJcbiAgICAvLyBDb21wcmVzcyBvbmx5IGlmIGVuYWJsZWQgYW5kIGJhc2U2NCBpbWFnZXMgZXhpc3QuXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUltYWdlQ29tcHJlc3Npb24oZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgcGFzdGUgaXMgcGxhaW4gdGV4dCAobm8gSFRNTCB0YWdzIGFuZCBubyBpbWFnZXMpLCBub3JtYWxpemUgY29tbW9uIGVudGl0aWVzIGFuZCBpbnNlcnQgYXMgcmVhbCB0ZXh0LlxyXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBldmVudCBpcyBoYW5kbGVkIGFuZCBkZWZhdWx0IHBhc3RlIGlzIHByZXZlbnRlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUNvbW1vblN5bWJvbFRhZ3MoZTogRWRpdG9yUGFzdGVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IGhhbmRsZSBwbGFpbi10ZXh0IG5vcm1hbGl6YXRpb24uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGlwYm9hcmQgPSAoZS5vcmlnaW5hbEV2ZW50IGFzIENsaXBib2FyZEV2ZW50IHwgdW5kZWZpbmVkKT8uY2xpcGJvYXJkRGF0YTtcclxuICAgIGNvbnN0IHBsYWluVGV4dCA9IGNsaXBib2FyZD8uZ2V0RGF0YSgndGV4dC9wbGFpbicpID8/ICcnO1xyXG4gICAgY29uc3QgaHRtbFRleHQgPSBjbGlwYm9hcmQ/LmdldERhdGEoJ3RleHQvaHRtbCcpID8/ICcnO1xyXG4gICAgY29uc3QgY2xlYW5lZEh0bWwgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG5cclxuICAgIGNvbnN0IGh0bWxIYXNJbWcgPSAvPGltZ1xcYi9pLnRlc3QoaHRtbFRleHQpO1xyXG4gICAgY29uc3QgY2xlYW5lZEhhc1RhZ3MgPSAvPFtePl0rPi8udGVzdChjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgLy8gSWYgcGFzdGUgaGFzIEhUTUwgdGFncyBvciBpbWFnZXMsIGRvIE5PVCBpbnRlcmZlcmUgKGxldCBLZW5kbyBoYW5kbGUgaXQpLlxyXG4gICAgaWYgKGh0bWxIYXNJbWcgfHwgY2xlYW5lZEhhc1RhZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBsYWluLXRleHQgcGFzdGU6IHByZXZlbnQgS2VuZG8gZnJvbSBpbnNlcnRpbmcgZW5jb2RlZCBlbnRpdGllcyBhcyBsaXRlcmFsIHRleHQuXHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgLy8gRGVjb2RlIGNvbW1vbiBlbnRpdGllcyBvbmNlIHNvIHVzZXIgc2VlcyBjb3JyZWN0IGNoYXJhY3RlcnMuXHJcbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgbGltaXRlZCB0byBjb21tb24gZW50aXRpZXMgdG8gYXZvaWQgdW5leHBlY3RlZCB0cmFuc2Zvcm1hdGlvbnMuXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVQYXN0ZWRUZXh0KHBsYWluVGV4dCB8fCBjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgZWRpdG9yLmV4ZWMoJ2luc2VydFRleHQnLCB7IHRleHQ6IG5vcm1hbGl6ZWQgfSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUgdGV4dCBub2RlcyBpbnNpZGUgcGFzdGVkIEhUTUwgd2l0aG91dCB0b3VjaGluZyB0YWdzLCBzdHlsZXMsIGxpbmtzLCBvciBpbWFnZSBhdHRyaWJ1dGVzLiAqL1xyXG4gIHByaXZhdGUgbm9ybWFsaXplUGFzdGVkSHRtbChlOiBFZGl0b3JQYXN0ZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsZWFuZWQgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG4gICAgaWYgKCFjbGVhbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZG9jOiBEb2N1bWVudDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoY2xlYW5lZCwgJ3RleHQvaHRtbCcpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBGYWlsZWQgdG8gcGFyc2UgcGFzdGVkIEhUTUwgZm9yIHN5bWJvbCBub3JtYWxpemF0aW9uLiBQYXN0ZSB3aWxsIGNvbnRpbnVlLicsIGVycik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB3YWxrZXIgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xyXG4gICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIG5vZGUudGV4dENvbnRlbnQgPSB0aGlzLm5vcm1hbGl6ZVBhc3RlZFRleHQobm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XHJcbiAgICAgIG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgLyoqIE5vcm1hbGl6ZSBrbm93biBwYXN0ZSBzeW1ib2wgdmFyaWFudHMgZnJvbSBPZmZpY2UvZW1haWwgY29udGVudCBpbnRvIHN0YWJsZSBkaXNwbGF5IGNoYXJhY3RlcnMuICovXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVQYXN0ZWRUZXh0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkIHx8ICF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5vcm1hbGl6ZWQgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplSHRtbEVudGl0aWVzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZhbXA7JywgJyYnKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcmbHQ7JywgJzwnKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcmZ3Q7JywgJz4nKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcmcXVvdDsnLCAnXCInKVxyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcmIzM5OycsIFwiJ1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplRGFzaCkge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9bXFx1MjAxMFxcdTIwMTFcXHUyMDEyXFx1MjAxM1xcdTIwMTRcXHUyMjEyXS9nLCAnLScpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVRdW90ZXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcclxuICAgICAgICAucmVwbGFjZSgvW1xcdTIwMThcXHUyMDE5XFx1MjAxQVxcdTIwMUJdL2csIFwiJ1wiKVxyXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MjAxQ1xcdTIwMURcXHUyMDFFXFx1MjAxRl0vZywgJ1wiJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZVNwYWNlcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9bXFx1MDBBMFxcdTIwMkZcXHUyMDA3XS9nLCAnICcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVFbGxpcHNpcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9cXHUyMDI2L2csICcuLi4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5hcHBseUN1c3RvbVN5bWJvbFJlcGxhY2VtZW50cyhub3JtYWxpemVkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlDdXN0b21TeW1ib2xSZXBsYWNlbWVudHModmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzLnJlZHVjZSgocmVzdWx0LCByZXBsYWNlbWVudCkgPT4ge1xyXG4gICAgICBpZiAoIXJlcGxhY2VtZW50Py5Gcm9tKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocmVwbGFjZW1lbnQuSXNSZWdleCkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlKG5ldyBSZWdFeHAocmVwbGFjZW1lbnQuRnJvbSwgcmVwbGFjZW1lbnQuRmxhZ3MgfHwgJ2cnKSwgcmVwbGFjZW1lbnQuVG8gPz8gJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlQWxsKHJlcGxhY2VtZW50LkZyb20sIHJlcGxhY2VtZW50LlRvID8/ICcnKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEludmFsaWQgY3VzdG9tIHN5bWJvbCByZXBsYWNlbWVudCBza2lwcGVkLicsIHsgcmVwbGFjZW1lbnQsIGVyciB9KTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICB9LCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiBjb21wcmVzc2lvbiBpcyBlbmFibGVkIGFuZCBjb21wcmVzcyBtb2RlIGlzIE9OLCBjb21wcmVzcyBhbnkgcGFzdGVkIGJhc2U2NCBpbWFnZXMgKGRhdGE6aW1hZ2UvKikuXHJcbiAgICogSU1QT1JUQU5UOiBtb2RpZmllcyBlLmNsZWFuZWRIdG1sICh3aGF0IGdldHMgcGFzdGVkKSwgbm90IGVkaXRvci52YWx1ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUltYWdlQ29tcHJlc3Npb24oZTogRWRpdG9yUGFzdGVFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgY29tcHJlc3Npb25Db25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBpc0NvbXByZXNzaW9uRW5hYmxlZCA9ICEhY29tcHJlc3Npb25Db25maWc7XHJcbiAgICBpZiAoIWlzQ29tcHJlc3Npb25FbmFibGVkIHx8ICF0aGlzLmlzQ29tcHJlc3NNb2RlT24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsZWFuZWQgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG4gICAgaWYgKCFjbGVhbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZG9jOiBEb2N1bWVudDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoY2xlYW5lZCwgJ3RleHQvaHRtbCcpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBGYWlsZWQgdG8gcGFyc2UgcGFzdGVkIEhUTUwgZm9yIGltYWdlIGNvbXByZXNzaW9uLiBQYXN0ZSB3aWxsIGNvbnRpbnVlLicsIGVycik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbWdFbGVtZW50cyA9IEFycmF5LmZyb20oZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpKVxyXG4gICAgICAubWFwKGltZyA9PiBpbWcgYXMgSFRNTEltYWdlRWxlbWVudClcclxuICAgICAgLmZpbHRlcihpbWcgPT4gdHlwZW9mIGltZz8uc3JjID09PSAnc3RyaW5nJyAmJiBpbWcuc3JjLnN0YXJ0c1dpdGgoJ2RhdGE6aW1hZ2UvJykpO1xyXG5cclxuICAgIGlmIChpbWdFbGVtZW50cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBiZWZvcmVTaXplQnl0ZXMgPSAwO1xyXG4gICAgbGV0IGFmdGVyU2l6ZUJ5dGVzID0gMDtcclxuICAgIGxldCBmYWlsZWRDb3VudCA9IDA7XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIGltZ0VsZW1lbnRzLm1hcChhc3luYyAoaW1nLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNyYyA9IGltZy5zcmM7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgdGhpcy5iYXNlNjRUb0ZpbGUoc3JjLCBgcGFzdGVkLWltYWdlLSR7aW5kZXh9YCk7XHJcbiAgICAgICAgICBiZWZvcmVTaXplQnl0ZXMgKz0gZmlsZS5zaXplO1xyXG5cclxuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWQgPSBhd2FpdCB0aGlzLmltYWdlQ29tcHJlc3Npb24oZmlsZSk7XHJcbiAgICAgICAgICBpZiAoIWNvbXByZXNzZWQpIHtcclxuICAgICAgICAgICAgZmFpbGVkQ291bnQrKztcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIEltYWdlIGNvbXByZXNzaW9uIHNraXBwZWQvZmFpbGVkIGZvciBwYXN0ZWQgaW1hZ2UgIyR7aW5kZXggKyAxfS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc0RhdGFVUkwoY29tcHJlc3NlZCk7XHJcbiAgICAgICAgICBhZnRlclNpemVCeXRlcyArPSBjb21wcmVzc2VkLnNpemU7XHJcbiAgICAgICAgICBpbWcuc3JjID0gYmFzZTY0O1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgZmFpbGVkQ291bnQrKztcclxuICAgICAgICAgIGNvbnNvbGUud2FybihgW1p0ZXh0ZWRpdG9yXSBFcnJvciBjb21wcmVzc2luZyBwYXN0ZWQgaW1hZ2UgIyR7aW5kZXggKyAxfS5gLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG5cclxuICAgIC8vIEhlbHBmdWwgY29uc29sZSBsb2dzIGZvciB0cm91Ymxlc2hvb3RpbmcuXHJcbiAgICBjb25zdCBiZWZvcmVLYiA9IChiZWZvcmVTaXplQnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDIpO1xyXG4gICAgY29uc3QgYWZ0ZXJLYiA9IChhZnRlclNpemVCeXRlcyAvIDEwMjQpLnRvRml4ZWQoMik7XHJcblxyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIGBbWnRleHRlZGl0b3JdIFBhc3RlZCBpbWFnZSBjb21wcmVzc2lvbiBjb21wbGV0ZWQuIEltYWdlcz0ke2ltZ0VsZW1lbnRzLmxlbmd0aH0sIEZhaWxlZD0ke2ZhaWxlZENvdW50fSwgQmVmb3JlPSR7YmVmb3JlS2J9S0IsIEFmdGVyPSR7YWZ0ZXJLYn1LQmAsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIE1vZGlmeSB3aGF0IGdldHMgcGFzdGVkLCBub3QgZWRpdG9yLnZhbHVlLlxyXG4gICAgZS5jbGVhbmVkSHRtbCA9IGRvYy5ib2R5LmlubmVySFRNTDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBjb21wcmVzcyBtb2RlIHZpYSBjb25maXJtYXRpb24gZGlhbG9nLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbk9mZkNvbXByZXNzTW9kZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhlYWRlciA9ICdDb25maXJtYXRpb24nO1xyXG4gICAgY29uc3QgYWN0aW9uVGV4dCA9IHRoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xyXG5cclxuICAgIC8vIEtlZXAgZXhpc3RpbmcgYmVoYXZpb3I6IHRvZ2dsaW5nIHJlc2V0cyBjb250ZW50LlxyXG4gICAgY29uc3QgbWVzc2FnZSA9XHJcbiAgICAgIGBEbyB5b3Ugd2FudCB0byA8Yj4ke2FjdGlvblRleHR9PC9iPiBpbWFnZSBjb21wcmVzc2lvbiB3aGVuIGlucHV0IGNvbnRlbnQ/YCArXHJcbiAgICAgIGA8YnIvPk5vdGU6IENsaWNrIFwiWWVzXCIgdGhlIGNvbnRlbnQgd2lsbCBiZSByZXNldCB0byBibGFuay5gO1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbnMgPSB7XHJcbiAgICAgIHllczogeyB0ZXh0OiAnWWVzJywgY3NzQ2xhc3M6ICdwcmltYXJ5JyB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgICBubzogeyB0ZXh0OiAnTm8nLCBjc3NDbGFzczogJ3NlY29uZGFyeScgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5hbGVydFNlcnZpY2VcclxuICAgICAgLnNob3coaGVhZGVyLCBtZXNzYWdlLCBbYnV0dG9ucy55ZXMsIGJ1dHRvbnMubm9dLCBbJ2NvbC00J10pXHJcbiAgICAgIC5zdWJzY3JpYmUocmVwbHkgPT4ge1xyXG4gICAgICAgIGlmIChyZXBseSAhPT0gJ1llcycpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IHRvZ2dsZSBjb21wcmVzc2lvbiBtb2RlLicpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZWRpdG9yLnZhbHVlID0gJyc7XHJcbiAgICAgICAgdGhpcy5pc0NvbXByZXNzTW9kZU9uID0gIXRoaXMuaXNDb21wcmVzc01vZGVPbjtcclxuXHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcclxuICAgICAgICAgIGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdFbmFibGUnIDogJ0Rpc2FibGUnfSBpbWFnZSBjb21wcmVzc2lvbiBzdWNjZXNzZnVsbHkuYCxcclxuICAgICAgICAgICd0b3AnLFxyXG4gICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAyNTAwLFxyXG4gICAgICAgICAgJ3N1Y2Nlc3MnLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb21wcmVzc2lvblRvb2xiYXJJY29uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYGstaS1pbWFnZSAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/IHRoaXMuY29tcHJlc3Npb25EaXNhYmxlZEljb24gOiB0aGlzLmNvbXByZXNzaW9uRW5hYmxlSWNvbn1gO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb21wcmVzc2lvblRvb2xiYXJUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdEaXNhYmxlJyA6ICdFbmFibGUnfSBpbWFnZSBjb21wcmVzc2lvbmA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVudGVyQXNMaW5lQnJlYWtQbHVnaW4oKTogUGx1Z2luIHtcclxuICAgIHJldHVybiBrZXltYXAoe1xyXG4gICAgICBFbnRlcjogY2hhaW5Db21tYW5kcyhleGl0Q29kZSwgKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhhcmRCcmVhayA9IHN0YXRlLnNjaGVtYS5ub2Rlcy5oYXJkX2JyZWFrO1xyXG4gICAgICAgIGlmICghaGFyZEJyZWFrIHx8ICFzdGF0ZS5zZWxlY3Rpb24uJGZyb20ucGFyZW50LmlubGluZUNvbnRlbnQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgoaGFyZEJyZWFrLmNyZWF0ZSgpKS5zY3JvbGxJbnRvVmlldygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jdXMgZWRpdG9yIGlmIGF2YWlsYWJsZS4gUmV0dXJucyB0cnVlIGlmIGZvY3VzIHN1Y2NlZWRlZC4gKi9cclxuICBwdWJsaWMgZm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcclxuICAgICAgdGhpcy5lZGl0b3IuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWU6IHN0cmluZywgZm9udEF3ZXNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IGljb25OYW1lVmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoaWNvbk5hbWUsIHRoaXMuZ3JvdXApO1xyXG4gICAgaWYgKGljb25OYW1lVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWVWYWx1ZSwgZm9udEF3ZXNvbWVTZXJ2aWNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpY29uTmFtZTtcclxuICB9XHJcblxyXG4gIC8qKiBNZXJnZSBLZW5kbyBwYXN0ZSBjbGVhbnVwIHNldHRpbmdzIGZyb20gUGFzdGVDbGVhbnVwU2V0dGluZ3MsIHdpdGggZGF0YS5PcHRpb25zIGtlcHQgYXMgYSBsZWdhY3kgZmFsbGJhY2suICovXHJcbiAgcHJpdmF0ZSBzZXR1cFBhc3RlQ2xlYW51cFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZGF0YT8uUGFzdGVDbGVhbnVwU2V0dGluZ3MgPz8gdGhpcy5kYXRhPy5PcHRpb25zO1xyXG4gICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKG9wdGlvbnMsIHRoaXMuZ3JvdXApO1xyXG4gICAgICBpZiAocmVzb2x2ZWQgJiYgdHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgcmVzb2x2ZWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBQYXN0ZSBjbGVhbnVwIHNldHRpbmdzIHJlc29sdmVkIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QuIFNldHRpbmdzIHVuY2hhbmdlZC4nLCB7XHJcbiAgICAgICAgICByZXNvbHZlZCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFzdGVDbGVhbnVwU2V0dGluZ3MsIG9wdGlvbnMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVuc3VwcG9ydGVkIHBhc3RlIGNsZWFudXAgc2V0dGluZ3MgdHlwZS4gU2V0dGluZ3MgdW5jaGFuZ2VkLicsIHtcclxuICAgICAgdHlwZTogdHlwZW9mIG9wdGlvbnMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNvbHZlIG9wdGlvbmFsIHBhc3RlIHN5bWJvbCBub3JtYWxpemF0aW9uIHNldHRpbmdzIGZyb20gZmllbGQgY29uZmlnLiAqL1xyXG4gIHByaXZhdGUgc2V0dXBTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZGF0YT8uU3ltYm9sTm9ybWFsaXphdGlvbjtcclxuICAgIGlmIChzZXR0aW5ncyA9PT0gdW5kZWZpbmVkIHx8IHNldHRpbmdzID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCA9IHNldHRpbmdzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoc2V0dGluZ3MsIHRoaXMuZ3JvdXApO1xyXG4gICAgICB0aGlzLm1lcmdlU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKHJlc29sdmVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVyZ2VTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3Moc2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZVN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncyhzZXR0aW5nczogdW5rbm93bik6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQgPSBzZXR0aW5ncztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc2V0dGluZ3MgfHwgdHlwZW9mIHNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNldHRpbmdzKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gU3ltYm9sTm9ybWFsaXphdGlvbiByZXNvbHZlZCB2YWx1ZSBpcyBub3QgYSBzdXBwb3J0ZWQgY29uZmlnLiBTZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MsIHNldHRpbmdzKTtcclxuICAgIHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkN1c3RvbVJlcGxhY2VtZW50cyA9XHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzKVxyXG4gICAgICAgID8gdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzXHJcbiAgICAgICAgOiBbXTtcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gQ3VzdG9tIEltYWdlIFVwbG9hZCAvIEVubGFyZ2VcclxuXHJcbiAgLyoqIFRyaWdnZXIgaGlkZGVuIGZpbGUgaW5wdXQgY2xpY2sgZm9yIGltYWdlIHVwbG9hZC4gKi9cclxuICBwdWJsaWMgb3BlbkZpbGVFeHBsb3JlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkID0gYCR7dGhpcy5kYXRhLlZhbHVlfS11cGxvYWQtZmlsZWA7XHJcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuXHJcbiAgICBpZiAoIWlucHV0KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgW1p0ZXh0ZWRpdG9yXSBVcGxvYWQgaW5wdXQgZWxlbWVudCBub3QgZm91bmQgKGlkPVwiJHtpZH1cIikuYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW4gYW4gZW5sYXJnZWQgcG9wdXAgZWRpdG9yLiAqL1xyXG4gIHB1YmxpYyBvcGVuUG9wdXAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3Qgb3BlbiBwb3B1cC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE9wZW4gZGlhbG9nXHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKHtcclxuICAgICAgY29udGVudDogWnRleHRlZGl0b3JDb21wb25lbnQsXHJcbiAgICAgIHdpZHRoOiAnOTglJyxcclxuICAgICAgaGVpZ2h0OiAnOTclJyxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHBvcHVwQ29tcG9uZW50ID0gdGhpcy5kaWFsb2dSZWYuY29udGVudC5pbnN0YW5jZSBhcyBadGV4dGVkaXRvckNvbXBvbmVudDtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kYXRhLkFsbG93RW5sYXJnZSA9IGZhbHNlO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWY7XHJcbiAgICBwb3B1cENvbXBvbmVudC5DbG9zZUVubGFyZ2VCdG4gPSB0cnVlO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcyA9IHRoaXMuY29tcG9uZW50UHJvcGVydGllcztcclxuXHJcbiAgICAvLyBQcmVzZXJ2ZSBzdHlsZSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiBjbG9zZS5cclxuICAgIHRoaXMub3JpZ2luYWxJbmxpbmVTdHlsZSA9IHRoaXMuY29tcG9uZW50UHJvcGVydGllcz8uc3R5bGU/LnN0eWxlMSA/PyAnJztcclxuICAgIGlmIChwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMSA9XHJcbiAgICAgICAgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID8/ICcnKSArXHJcbiAgICAgICAgYGhlaWdodDokeyh3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjgpLnRvU3RyaW5nKCl9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHBvcHVwQ29tcG9uZW50Lmdyb3VwID0gdGhpcy5ncm91cDtcclxuICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFNldHRpbmdzID0gdGhpcy5jb21wb25lbnRTZXR0aW5ncztcclxuICAgIHBvcHVwQ29tcG9uZW50LmZvcm0gPSB0aGlzLmZvcm07XHJcblxyXG4gICAgLy8gUmVzdG9yZSBzdGF0ZSBhbmQgcHVzaCB2YWx1ZSBiYWNrIGludG8gZWRpdG9yIG9uIGNsb3NlLlxyXG4gICAgdGhpcy5kaWFsb2dSZWYucmVzdWx0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YS5BbGxvd0VubGFyZ2UgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UHJvcGVydGllcz8uc3R5bGUpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID0gdGhpcy5vcmlnaW5hbElubGluZVN0eWxlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBQdWxsIGN1cnJlbnQgek1vZGVsIGludG8gZWRpdG9yIGFuZCB0cmlnZ2VyIG9uQ2hhbmdlIChleGlzdGluZyBiZWhhdmlvcikuXHJcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5ncm91cD8uek1vZGVsPy5bdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgICAgZWRpdG9yLnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UobmV3VmFsdWUpO1xyXG4gICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZSB0aGUgcG9wdXAgZWRpdG9yIGlmIG9wZW4uICovXHJcbiAgcHVibGljIG9uUG9wdXBDbG9zZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaWFsb2dSZWYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSA8aW5wdXQgdHlwZT1cImZpbGVcIj4gY2hhbmdlIGFuZCBpbnNlcnQgc2VsZWN0ZWQgaW1hZ2UgaW50byBlZGl0b3IuXHJcbiAgICogTk9URTogUHJlZmVyIHR5cGluZyBmaWxlSW5wdXQgYXMgRXZlbnQgZm9yIGJldHRlciBzYWZldHkuXHJcbiAgICovXHJcbiAgcHVibGljIHVwbG9hZEltYWdlKGZpbGVJbnB1dDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZmlsZUlucHV0Py50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICBjb25zdCBmaWxlID0gaW5wdXQ/LmZpbGVzPy5bMF07XHJcblxyXG4gICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBObyBpbWFnZSBzZWxlY3RlZCBmb3IgdXBsb2FkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdm9pZCB0aGlzLmluc2VydEltYWdlSW50b0VkaXRvcihmaWxlKTtcclxuICB9XHJcblxyXG4gIC8qKiBJbnNlcnQgaW1hZ2UgaW50byBlZGl0b3IsIG9wdGlvbmFsbHkgY29tcHJlc3NpbmcgZmlyc3QuICovXHJcbiAgcHJpdmF0ZSBhc3luYyBpbnNlcnRJbWFnZUludG9FZGl0b3IoZmlsZTogRmlsZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IGluc2VydCBpbWFnZS4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB3b3JraW5nRmlsZTogRmlsZSB8IG51bGwgPSBmaWxlO1xyXG5cclxuICAgIGNvbnN0IGNvbXByZXNzaW9uQ29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgY29tcHJlc3Npb25FbmFibGVkID0gISFjb21wcmVzc2lvbkNvbmZpZztcclxuXHJcbiAgICBpZiAoY29tcHJlc3Npb25FbmFibGVkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBiZWZvcmUgY29tcHJlc3Npb246ICR7KHdvcmtpbmdGaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcblxyXG4gICAgICB3b3JraW5nRmlsZSA9IGF3YWl0IHRoaXMuaW1hZ2VDb21wcmVzc2lvbih3b3JraW5nRmlsZSk7XHJcbiAgICAgIGlmICghd29ya2luZ0ZpbGUpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gSW1hZ2UgY29tcHJlc3Npb24gZmFpbGVkLiBVcGxvYWQgaW1hZ2UgaW5zZXJ0aW9uIGFib3J0ZWQuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhgW1p0ZXh0ZWRpdG9yXSBVcGxvYWQgaW1hZ2UgYWZ0ZXIgY29tcHJlc3Npb246ICR7KHdvcmtpbmdGaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTCh3b3JraW5nRmlsZSk7XHJcbiAgICAgIGVkaXRvci5leGVjKCdpbnNlcnRJbWFnZScsIHsgc3JjOiBiYXNlNjQgfSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byByZWFkIHVwbG9hZGVkIGltYWdlIGFzIGJhc2U2NC4nLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnQgYmFzZTY0IChkYXRhIFVSTCkgdG8gRmlsZS4gKi9cclxuICBwcml2YXRlIGFzeW5jIGJhc2U2NFRvRmlsZShiYXNlNjRTdHJpbmc6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8RmlsZT4ge1xyXG4gICAgLy8gVXNpbmcgZmV0Y2ggb24gZGF0YSBVUkwgaXMgc3VwcG9ydGVkIGJ5IG1vZGVybiBicm93c2Vyczsga2VlcCBleGlzdGluZyBsb2dpYy5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYmFzZTY0U3RyaW5nKTtcclxuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBGaWxlKFtibG9iXSwgZmlsZU5hbWUsIHtcclxuICAgICAgdHlwZTogYmxvYi50eXBlLFxyXG4gICAgICBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXByZXNzIGFuIGltYWdlIGZpbGUgaWYgaXQgaXMgYW4gaW1hZ2UgYW5kIGFib3ZlIG1pbiB0aHJlc2hvbGQuXHJcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgZmlsZSB3aGVuIGNvbXByZXNzaW9uIGlzIHNraXBwZWQsIGFuZCBudWxsIG9ubHkgd2hlbiBjb21wcmVzc2lvbiBmYWlscy5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGltYWdlQ29tcHJlc3Npb24oZmlsZTogRmlsZSk6IFByb21pc2U8RmlsZSB8IG51bGw+IHtcclxuICAgIGlmICghZmlsZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gaW1hZ2VDb21wcmVzc2lvbiBjYWxsZWQgd2l0aCBlbXB0eSBmaWxlLicpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZpbGUudHlwZSB8fCAhZmlsZS50eXBlLmluY2x1ZGVzKCdpbWFnZScpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBTa2lwcGluZyBjb21wcmVzc2lvbjogZmlsZSBpcyBub3QgYW4gaW1hZ2UuJywgeyB0eXBlOiBmaWxlLnR5cGUgfSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZGF0YT8uQ29tcHJlc3Npb24gYXMgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIC8vIENvbXByZXNzaW9uIG5vdCBjb25maWd1cmVkOyBrZWVwIHRoZSBvcmlnaW5hbCBmaWxlLlxyXG4gICAgICByZXR1cm4gZmlsZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbWdDb25maWcgPSB0aGlzLmNvbXByZXNzaW9uQ29uZmlnSGFuZGxlcihjb25maWcpO1xyXG5cclxuICAgIC8vIElmIGZpbGUgaXMgYmVsb3cgdGhyZXNob2xkLCBrZWVwIHRoZSBvcmlnaW5hbCBmaWxlLlxyXG4gICAgaWYgKGZpbGUuc2l6ZSA8PSBpbWdDb25maWcuRmlsZVNpemVNaW5TaXplQnl0ZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBgW1p0ZXh0ZWRpdG9yXSBTa2lwcGluZyBjb21wcmVzc2lvbjogZmlsZSBzaXplICR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0IgaXMgYmVsb3cgdGhyZXNob2xkICR7KGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlIC8gMTAyNCkudG9GaXhlZCgyKX1LQi5gLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZmlsZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjb21wcmVzc2VkJCA9IHRoaXMuY29tcHJlc3NJbWFnZS5jb21wcmVzcyhmaWxlLCBpbWdDb25maWcpO1xyXG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGNvbXByZXNzZWQkKTtcclxuICAgICAgcmV0dXJuIGNvbXByZXNzZWRGaWxlID8/IG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIENvbXByZXNzaW9uIHNlcnZpY2UgdGhyZXcgYW4gZXJyb3IuJywgZXJyKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIGltYWdlIGNvbXByZXNzaW9uIGNvbmZpZyBpbnRvIGJ5dGUtYmFzZWQgdGhyZXNob2xkcy4gKi9cclxuICBwcml2YXRlIGNvbXByZXNzaW9uQ29uZmlnSGFuZGxlcihpbWdDb25maWc6IEltYWdlQ29tcHJlc3Npb25Db25maWcpOiBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHtcclxuICAgIGlmICghaW1nQ29uZmlnKSB7XHJcbiAgICAgIC8vIERlZmVuc2l2ZTogc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNhbGxlciBjaGVja3MuXHJcbiAgICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gdGhpcy5jb252ZXJ0U2l6ZVRvQnl0ZShpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW1nQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBzaXplIHN0cmluZyBsaWtlIFwiMTAwa2JcIiwgXCIxIE1CXCIsIFwiMmdiXCIgdG8gYnl0ZXMuXHJcbiAgICogSWYgbm8gdW5pdCBpcyBwcm92aWRlZCwgYnl0ZXMgYXJlIGFzc3VtZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0U2l6ZVRvQnl0ZShzaXplU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKCFzaXplU3RyaW5nIHx8IHR5cGVvZiBzaXplU3RyaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gY29udmVydFNpemVUb0J5dGUgcmVjZWl2ZWQgaW52YWxpZCBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgYWxsIHNwYWNlcywgZS5nLiBcIjEgTUJcIiAtPiBcIjFNQlwiXHJcbiAgICBjb25zdCB0cmltbWVkID0gc2l6ZVN0cmluZy5yZXBsYWNlKC8gL2csICcnKS50cmltKCk7XHJcbiAgICBpZiAoIXRyaW1tZWQpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCBudW1lcmljIHBhcnQgYW5kIHVuaXQgcGFydCAobGV0dGVycykuXHJcbiAgICAvLyBFeGFtcGxlOiBcIjEuNU1CXCIgPT4gbnVtYmVyPTEuNSwgdW5pdD1cIm1iXCJcclxuICAgIGNvbnN0IG1hdGNoID0gL14oWzAtOV0qXFwuP1swLTldKykoW2EtekEtWl0qKSQvLmV4ZWModHJpbW1lZCk7XHJcbiAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBVbmFibGUgdG8gcGFyc2Ugc2l6ZVN0cmluZy4gRGVmYXVsdGluZyB0byAwLicsIHsgc2l6ZVN0cmluZyB9KTtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpYyA9IE51bWJlcihtYXRjaFsxXSk7XHJcbiAgICBjb25zdCB1bml0ID0gKG1hdGNoWzJdIHx8ICdiJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG51bWVyaWMpIHx8IG51bWVyaWMgPCAwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbnZhbGlkIG51bWVyaWMgc2l6ZSBpbiBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgY2FzZSAnYic6XHJcbiAgICAgIGNhc2UgJyc6XHJcbiAgICAgICAgcmV0dXJuIG51bWVyaWM7XHJcbiAgICAgIGNhc2UgJ2tiJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ21iJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0O1xyXG4gICAgICBjYXNlICdnYic6XHJcbiAgICAgICAgcmV0dXJuIG51bWVyaWMgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVua25vd24gdW5pdCBpbiBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIGJ5dGVzLicsIHsgc2l6ZVN0cmluZywgdW5pdCB9KTtcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIGEgRmlsZSBhcyBiYXNlNjQgZGF0YSBVUkwuICovXHJcbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmICghZmlsZSkge1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZpbGUgaXMgcmVxdWlyZWQuJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAjZW5kcmVnaW9uXHJcbn1cclxuIiwiXHJcblxyXG48ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienRleHRlZGl0b3ItY29udGFpbmVyIGUxdGFnLXN0eWxlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGVcIiBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBleHBhbmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gIDxpb24tYnV0dG9uICAgY2xhc3M9XCJpb24tYWN0aXZhdGFibGUgcmlwcGxlLXBhcmVudFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNFwiICpuZ0lmPVwiZGF0YS5BbGxvd0VubGFyZ2VcIiAoY2xpY2spPVwib3BlblBvcHVwKClcIiAgW2lkXT1cImRhdGEuVmFsdWUgKyctcG9wdXAtYnV0dG9uJ1wiPlxyXG4gICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvblwiIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUV4cGFuZEFsdCcsIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgPC9pb24tYnV0dG9uPlxyXG4gIDxpb24tYnV0dG9uICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJDbG9zZUVubGFyZ2VCdG5cIiAoY2xpY2spPVwib25Qb3B1cENsb3NlKClcIiAgW2lkXT1cImRhdGEuVmFsdWUgKyctcG9wdXAtYnV0dG9uJ1wiPlxyXG4gICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvblwiICBbaWNvbl09XCJnZXRGb250QXdlc29tZSgnZmFDb21wcmVzc0FsdCcsIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgPC9pb24tYnV0dG9uPlxyXG48L2Rpdj5cclxuICA8a2VuZG8tZWRpdG9yICNlZGl0b3JcclxuICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cImRhdGEuUmVzaXphYmxlIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtwbHVnaW5zXT1cInBsdWdpbnNDYWxsYmFja1wiXHJcbiAgICAgICAgICAgICAgICBbcGFzdGVDbGVhbnVwU2V0dGluZ3NdPVwicGFzdGVDbGVhbnVwU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbaWZyYW1lXT1cImNvbXBvbmVudFNldHRpbmdzLmlmcmFtZVwiPlxyXG4gICAgPGtlbmRvLXRvb2xiYXIgKm5nSWY9XCJkYXRhLlRvb2xCYXJTdHlsZSA9PT0gJ2Jhc2ljJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCJcclxuICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yUmVkb0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckJvbGRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJdGFsaWNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRlcmxpbmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdHJpa2V0aHJvdWdoQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3Vic2NyaXB0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3VwZXJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkxlZnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkNlbnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduUmlnaHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkp1c3RpZnlCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb3JtYXQ+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udFNpemU+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udEZhbWlseT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlciBrZW5kb0VkaXRvckZvcmVDb2xvcj48L2tlbmRvLXRvb2xiYXItY29sb3JwaWNrZXI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yQmFja0NvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0VW5vcmRlcmVkTGlzdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluc2VydE9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5kZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yT3V0ZGVudEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckNyZWF0ZUxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+PC9rZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dCZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dBZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZUNvbHVtbkJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVJvd0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVRhYmxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBbaWNvbl09XCJjb21wcmVzc2lvblRvb2xiYXJJY29uXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKClcIiBbdGl0bGVdPVwiY29tcHJlc3Npb25Ub29sYmFyVGl0bGVcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JWaWV3U291cmNlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciAqbmdJZj1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnZnVsbCdcIiBjbGFzcz1cImUxdGFnLXN0eWxlMlwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yUmVkb0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckJvbGRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJdGFsaWNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRlcmxpbmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdHJpa2V0aHJvdWdoQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3Vic2NyaXB0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3VwZXJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkxlZnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkNlbnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduUmlnaHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkp1c3RpZnlCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb3JtYXQ+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udFNpemU+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udEZhbWlseT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlciBrZW5kb0VkaXRvckZvcmVDb2xvciB2aWV3PVwiZ3JhZGllbnRcIj48L2tlbmRvLXRvb2xiYXItY29sb3JwaWNrZXI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yQmFja0NvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0VW5vcmRlcmVkTGlzdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluc2VydE9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5kZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yT3V0ZGVudEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckNyZWF0ZUxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+PC9rZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dCZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dBZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZUNvbHVtbkJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVJvd0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVRhYmxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yTWVyZ2VDZWxsc0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclNwbGl0Q2VsbEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluc2VydEZpbGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2RlZmF1bHQnXCIga2VuZG9FZGl0b3JJbnNlcnRJbWFnZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZXhwbG9yZXInXCIgaWNvbj1cImstaS1pbWFnZSBrLWktcGhvdG9cIiAoY2xpY2spPVwib3BlbkZpbGVFeHBsb3JlcigpXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiISFkYXRhLkNvbXByZXNzaW9uXCIgW2ljb25dPVwiY29tcHJlc3Npb25Ub29sYmFySWNvblwiIChjbGljayk9XCJvbk9mZkNvbXByZXNzTW9kZSgpXCIgW3RpdGxlXT1cImNvbXByZXNzaW9uVG9vbGJhclRpdGxlXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yVmlld1NvdXJjZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgPC9rZW5kby10b29sYmFyPlxyXG4gIDwva2VuZG8tZWRpdG9yPlxyXG4gIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiB0eXBlPVwiZmlsZVwiIFtpZF09XCJkYXRhLlZhbHVlICsnLXVwbG9hZC1maWxlJ1wiIFtuYW1lXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG5nZi1tYXgtc2l6ZT1cIjVNQlwiIChjaGFuZ2UpPVwidXBsb2FkSW1hZ2UoJGV2ZW50KVwiPlxyXG48L2Rpdj5cclxuIl19
649
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsSUFBSSxvQkFBb0IsRUFDakMsUUFBUSxFQUNSLE1BQU0sRUFFTixVQUFVLEVBQ1gsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qyw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFVTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBZ0R0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxD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QU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU87YUFDUjtZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUUzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBZ0IsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O2lIQXJ3QlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsZ0xDdkNqQywwOVRBMklBOzJGRHBHYSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsaUJBQWlCOzhQQUtDLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCwgRWRpdG9yUGFzdGVFdmVudCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWVkaXRvcic7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWRpYWxvZyc7XHJcbmltcG9ydCB7XG4gIGNoYWluQ29tbWFuZHMsXG4gIERPTVBhcnNlciBhcyBQcm9zZU1pcnJvckRPTVBhcnNlcixcbiAgZXhpdENvZGUsXG4gIGtleW1hcCxcbiAgUGx1Z2luLFxuICBzcGxpdEJsb2NrXG59IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1lZGl0b3ItY29tbW9uJztcblxyXG4vKioqKioqKioqKiBSeEpTICoqKioqKioqKiovXHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IElucHV0RmllbGRCYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sXHJcbiAgQWxlcnRTZXJ2aWNlLFxyXG4gIENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gIEZvbnRBd2VTb21lU2VydmljZSxcclxuICBJbWFnZUNvbXByZXNzaW9uQ29uZmlnLFxyXG4gIFRleHRFZGl0b3JTeW1ib2xOb3JtYWxpemF0aW9uQ29uZmlnLFxyXG4gIFRleHRFZGl0b3JTeW1ib2xSZXBsYWNlbWVudCxcclxuICBUb2FzdFNlcnZpY2UsXHJcbiAgWkNvbXBvbmVudCxcclxuICBaQ29tcG9uZW50SGVscGVyXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXp0ZXh0ZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4venRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3p0ZXh0ZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBadGV4dGVkaXRvckNvbXBvbmVudCBleHRlbmRzIElucHV0RmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBAVmlld0NoaWxkKCdlZGl0b3InKSBwdWJsaWMgZWRpdG9yITogRWRpdG9yQ29tcG9uZW50O1xyXG5cclxuICBwdWJsaWMgcGFzdGVDbGVhbnVwU2V0dGluZ3M6IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogYm9vbGVhbjtcclxuICAgIHJlbW92ZU1zU3R5bGVzOiBib29sZWFuO1xyXG4gICAgcmVtb3ZlSW52YWxpZEhUTUw6IGJvb2xlYW47XHJcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbiAgfSA9IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogZmFsc2UsXHJcbiAgICByZW1vdmVNc1N0eWxlczogZmFsc2UsXHJcbiAgICByZW1vdmVJbnZhbGlkSFRNTDogZmFsc2UsXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzOiB7IGlmcmFtZTogYm9vbGVhbjsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBpZnJhbWU6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5nczogUmVxdWlyZWQ8T21pdDxUZXh0RWRpdG9yU3ltYm9sTm9ybWFsaXphdGlvbkNvbmZpZywgJ0N1c3RvbVJlcGxhY2VtZW50cyc+PiAmIHtcclxuICAgIEN1c3RvbVJlcGxhY2VtZW50czogVGV4dEVkaXRvclN5bWJvbFJlcGxhY2VtZW50W107XHJcbiAgfSA9IHtcclxuICAgIEVuYWJsZWQ6IHRydWUsXHJcbiAgICBOb3JtYWxpemVIdG1sRW50aXRpZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVEYXNoOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplUXVvdGVzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplU3BhY2VzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplRWxsaXBzaXM6IHRydWUsXHJcbiAgICBDdXN0b21SZXBsYWNlbWVudHM6IFtdLFxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zQ2FsbGJhY2sgPSAoZGVmYXVsdFBsdWdpbnM6IFBsdWdpbltdKTogUGx1Z2luW10gPT4ge1xyXG4gICAgaWYgKHRoaXMuZGF0YT8uRW50ZXJLZXlCZWhhdmlvciA9PT0gJ3BhcmFncmFwaCcpIHtcclxuICAgICAgcmV0dXJuIGRlZmF1bHRQbHVnaW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbdGhpcy5lbnRlckFzTGluZUJyZWFrUGx1Z2luKCksIC4uLmRlZmF1bHRQbHVnaW5zXTtcclxuICB9O1xyXG5cclxuICBwdWJsaWMgaXNDb21wcmVzc01vZGVPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBDbG9zZUVubGFyZ2VCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGRpYWxvZ1JlZj86IERpYWxvZ1JlZjtcclxuXHJcbiAgcHJpdmF0ZSBvcmlnaW5hbElubGluZVN0eWxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc2lvbkVuYWJsZUljb246IHN0cmluZyA9ICdrLWktem9vbS1iZXN0LWZpdCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc2lvbkRpc2FibGVkSWNvbjogc3RyaW5nID0gJ2staS16b29tLWFjdHVhbC1zaXplJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEF3ZVNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc0ltYWdlOiBDb21wcmVzc0ltYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplIGNvbXBvbmVudCBzdGF0ZSBhbmQgZWRpdG9yIGNvbmZpZ3VyYXRpb24uICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcblxyXG4gICAgLy8gQmFja3dhcmQtY29tcGF0aWJsZSBkZWZhdWx0OiB3aGVuIG5vdCBwcm92aWRlZCwgdXNlIGV4cGxvcmVyLlxyXG4gICAgdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9IHRoaXMuZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgfHwgJ2V4cGxvcmVyJztcclxuXHJcbiAgICB0aGlzLnNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuc2V0dXBTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MoKTtcclxuICAgIHN1cGVyLnNldHVwQ29tcG9uZW50U2V0dGluZ3ModGhpcy5jb21wb25lbnRTZXR0aW5ncyk7XHJcbiAgICBzdXBlci5mb2N1c09uRGVmYXVsdCh0aGlzLmZvY3VzLmJpbmQodGhpcykpO1xyXG5cclxuICAgIC8vIFNhZmUgY2FzdCB0byBib29sZWFuLlxyXG4gICAgdGhpcy5pc0NvbXByZXNzTW9kZU9uID0gISF0aGlzLmRhdGE/LkNvbXByZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqIE5vdGlmeSBjb21wb25lbnQgc2VydmljZSBvbmNlIHZpZXcgaXMgcmVhZHkuICovXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTeW5jIGVkaXRvciBjb250ZW50IHRvIHpNb2RlbCBhbmQgdHJpZ2dlciBjb25maWd1cmVkIGNoYW5nZSBoYW5kbGVyLiAqL1xyXG4gIHB1YmxpYyBvbkNoYW5nZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRUb1pNb2RlbCh0aGlzLmRhdGEuVmFsdWUsIHZhbHVlLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2lucHV0ZmllbGQtb25DaGFuZ2UnLCB0aGlzLmRhdGEuT25DaGFuZ2UsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kbGUgcGFzdGU6IG5vcm1hbGl6ZSBwbGFpbi10ZXh0IHNwZWNpYWwgZW50aXRpZXMsIHRoZW4gb3B0aW9uYWxseSBjb21wcmVzcyBwYXN0ZWQgYmFzZTY0IGltYWdlcy4gKi9cclxuICBwdWJsaWMgYXN5bmMgb25QYXN0ZShlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGV2ZW50IGlzIHVuZGVmaW5lZC4gUGFzdGUgaWdub3JlZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbW1vbiBFeGNlbC9wbGFpbi10ZXh0IGlzc3VlOiBcIiZhbXA7XCIgZ2V0cyBpbnNlcnRlZCBsaXRlcmFsbHkgY2F1c2luZyBcIiZhbXA7YW1wO1wiIGluIEhUTUwuXHJcbiAgICBjb25zdCBpc0hhbmRsZWQgPSB0aGlzLmhhbmRsZUNvbW1vblN5bWJvbFRhZ3MoZSk7XHJcbiAgICBpZiAoaXNIYW5kbGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vcm1hbGl6ZVBhc3RlZEh0bWwoZSk7XHJcblxyXG4gICAgLy8gQ29tcHJlc3Mgb25seSBpZiBlbmFibGVkIGFuZCBiYXNlNjQgaW1hZ2VzIGV4aXN0LlxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbWFnZUNvbXByZXNzaW9uKGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXG4gICAqIElmIHRoZSBwYXN0ZSBpcyBwbGFpbiB0ZXh0IChubyBIVE1MIHRhZ3MgYW5kIG5vIGltYWdlcyksIG5vcm1hbGl6ZSBjb21tb24gZW50aXRpZXMgYW5kIGluc2VydCBhcyByZWFsIHRleHQuXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBldmVudCBpcyBoYW5kbGVkIGFuZCBkZWZhdWx0IHBhc3RlIGlzIHByZXZlbnRlZC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ29tbW9uU3ltYm9sVGFncyhlOiBFZGl0b3JQYXN0ZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaGFuZGxlIHBsYWluLXRleHQgbm9ybWFsaXphdGlvbi4nKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjbGlwYm9hcmQgPSAoZS5vcmlnaW5hbEV2ZW50IGFzIENsaXBib2FyZEV2ZW50IHwgdW5kZWZpbmVkKT8uY2xpcGJvYXJkRGF0YTtcbiAgICBjb25zdCBwbGFpblRleHQgPSBjbGlwYm9hcmQ/LmdldERhdGEoJ3RleHQvcGxhaW4nKSA/PyAnJztcbiAgICBjb25zdCBodG1sVGV4dCA9IGNsaXBib2FyZD8uZ2V0RGF0YSgndGV4dC9odG1sJykgPz8gJyc7XG4gICAgY29uc3QgY2xlYW5lZEh0bWwgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG5cclxuICAgIGNvbnN0IGh0bWxIYXNJbWcgPSAvPGltZ1xcYi9pLnRlc3QoaHRtbFRleHQpO1xyXG4gICAgY29uc3QgY2xlYW5lZEhhc1RhZ3MgPSAvPFtePl0rPi8udGVzdChjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgLy8gSWYgcGFzdGUgaGFzIEhUTUwgdGFncyBvciBpbWFnZXMsIGRvIE5PVCBpbnRlcmZlcmUgKGxldCBLZW5kbyBoYW5kbGUgaXQpLlxyXG4gICAgaWYgKGh0bWxIYXNJbWcgfHwgY2xlYW5lZEhhc1RhZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVBhc3RlZFRleHQocGxhaW5UZXh0IHx8IGNsZWFuZWRIdG1sKTtcblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmluc2VydFBsYWluVGV4dFdpdGhFZGl0b3JMaW5lQnJlYWtzKHRoaXMubm9ybWFsaXplTGluZUVuZGluZ3Mobm9ybWFsaXplZCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVMaW5lRW5kaW5ncyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxyXFxufFxcci9nLCAnXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFBsYWluVGV4dFdpdGhFZGl0b3JMaW5lQnJlYWtzKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIHZpZXcgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IHBhc3RlZCB0ZXh0LicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0aGlzLnBsYWluVGV4dFRvRWRpdG9ySHRtbCh2YWx1ZSk7XG5cbiAgICBjb25zdCBzbGljZSA9IFByb3NlTWlycm9yRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpLnBhcnNlU2xpY2UoY29udGFpbmVyKTtcbiAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbihzbGljZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gIH1cblxuICBwcml2YXRlIHBsYWluVGV4dFRvRWRpdG9ySHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCdcXG4nKTtcblxuICAgIGlmICh0aGlzLmRhdGE/LkVudGVyS2V5QmVoYXZpb3IgPT09ICdwYXJhZ3JhcGgnKSB7XG4gICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpID8gYDxwPiR7dGhpcy5lc2NhcGVIdG1sKGxpbmUpfTwvcD5gIDogJzxwPjxicj48L3A+JylcbiAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiBgPHA+JHtsaW5lcy5tYXAobGluZSA9PiB0aGlzLmVzY2FwZUh0bWwobGluZSkpLmpvaW4oJzxicj4nKX08L3A+YDtcbiAgfVxuXG4gIHByaXZhdGUgZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgICAgIC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKTtcbiAgfVxuXG4gIC8qKiBOb3JtYWxpemUgdGV4dCBub2RlcyBpbnNpZGUgcGFzdGVkIEhUTUwgd2l0aG91dCB0b3VjaGluZyB0YWdzLCBzdHlsZXMsIGxpbmtzLCBvciBpbWFnZSBhdHRyaWJ1dGVzLiAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZEh0bWwoZTogRWRpdG9yUGFzdGVFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xlYW5lZCA9IGUuY2xlYW5lZEh0bWwgPz8gJyc7XHJcbiAgICBpZiAoIWNsZWFuZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkb2M6IERvY3VtZW50O1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhjbGVhbmVkLCAndGV4dC9odG1sJyk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byBwYXJzZSBwYXN0ZWQgSFRNTCBmb3Igc3ltYm9sIG5vcm1hbGl6YXRpb24uIFBhc3RlIHdpbGwgY29udGludWUuJywgZXJyKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHdhbGtlciA9IGRvYy5jcmVhdGVUcmVlV2Fsa2VyKGRvYy5ib2R5LCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7XHJcbiAgICBsZXQgbm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xyXG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIG5vZGUudGV4dENvbnRlbnQgPSB0aGlzLm5vcm1hbGl6ZVBhc3RlZFRleHQobm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jKTtcblxuICAgIGUuY2xlYW5lZEh0bWwgPSBkb2MuYm9keS5pbm5lckhUTUw7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVtcHR5UGFyYWdyYXBocyhkb2M6IERvY3VtZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW1wdHlQYXJhZ3JhcGhzID0gQXJyYXkuZnJvbShkb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdwJykpLmZpbHRlcihwYXJhZ3JhcGggPT5cbiAgICAgIHRoaXMuaXNFbXB0eVBhcmFncmFwaChwYXJhZ3JhcGgpLFxuICAgICk7XG5cbiAgICBlbXB0eVBhcmFncmFwaHMuZm9yRWFjaChwYXJhZ3JhcGggPT4gcGFyYWdyYXBoLnJlbW92ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFbXB0eVBhcmFncmFwaChwYXJhZ3JhcGg6IEhUTUxQYXJhZ3JhcGhFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWxsb3dlZEVtcHR5Tm9kZXMgPSBBcnJheS5mcm9tKHBhcmFncmFwaC5jaGlsZE5vZGVzKS5ldmVyeShub2RlID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICByZXR1cm4gIShub2RlLnRleHRDb250ZW50ID8/ICcnKS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnInO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbG93ZWRFbXB0eU5vZGVzICYmICEocGFyYWdyYXBoLnRleHRDb250ZW50ID8/ICcnKS50cmltKCk7XG4gIH1cblxuICAvKiogTm9ybWFsaXplIGtub3duIHBhc3RlIHN5bWJvbCB2YXJpYW50cyBmcm9tIE9mZmljZS9lbWFpbCBjb250ZW50IGludG8gc3RhYmxlIGRpc3BsYXkgY2hhcmFjdGVycy4gKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVQYXN0ZWRUZXh0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCB8fCAhdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBub3JtYWxpemVkID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZUh0bWxFbnRpdGllcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcmYW1wOycsICcmJylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmx0OycsICc8JylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmd0OycsICc+JylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJnF1b3Q7JywgJ1wiJylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJiMzOTsnLCBcIidcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZURhc2gpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvW1xcdTIwMTBcXHUyMDExXFx1MjAxMlxcdTIwMTNcXHUyMDE0XFx1MjIxMl0vZywgJy0nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplUXVvdGVzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDE4XFx1MjAxOVxcdTIwMUFcXHUyMDFCXS9nLCBcIidcIilcclxuICAgICAgICAucmVwbGFjZSgvW1xcdTIwMUNcXHUyMDFEXFx1MjAxRVxcdTIwMUZdL2csICdcIicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVTcGFjZXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvW1xcdTAwQTBcXHUyMDJGXFx1MjAwN10vZywgJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplRWxsaXBzaXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvXFx1MjAyNi9nLCAnLi4uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlDdXN0b21TeW1ib2xSZXBsYWNlbWVudHMobm9ybWFsaXplZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q3VzdG9tU3ltYm9sUmVwbGFjZW1lbnRzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkN1c3RvbVJlcGxhY2VtZW50cy5yZWR1Y2UoKHJlc3VsdCwgcmVwbGFjZW1lbnQpID0+IHtcclxuICAgICAgaWYgKCFyZXBsYWNlbWVudD8uRnJvbSkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlcGxhY2VtZW50LklzUmVnZXgpIHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQucmVwbGFjZShuZXcgUmVnRXhwKHJlcGxhY2VtZW50LkZyb20sIHJlcGxhY2VtZW50LkZsYWdzIHx8ICdnJyksIHJlcGxhY2VtZW50LlRvID8/ICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQucmVwbGFjZUFsbChyZXBsYWNlbWVudC5Gcm9tLCByZXBsYWNlbWVudC5UbyA/PyAnJyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbnZhbGlkIGN1c3RvbSBzeW1ib2wgcmVwbGFjZW1lbnQgc2tpcHBlZC4nLCB7IHJlcGxhY2VtZW50LCBlcnIgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWYgY29tcHJlc3Npb24gaXMgZW5hYmxlZCBhbmQgY29tcHJlc3MgbW9kZSBpcyBPTiwgY29tcHJlc3MgYW55IHBhc3RlZCBiYXNlNjQgaW1hZ2VzIChkYXRhOmltYWdlLyopLlxyXG4gICAqIElNUE9SVEFOVDogbW9kaWZpZXMgZS5jbGVhbmVkSHRtbCAod2hhdCBnZXRzIHBhc3RlZCksIG5vdCBlZGl0b3IudmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbWFnZUNvbXByZXNzaW9uKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGNvbXByZXNzaW9uQ29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgaXNDb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG4gICAgaWYgKCFpc0NvbXByZXNzaW9uRW5hYmxlZCB8fCAhdGhpcy5pc0NvbXByZXNzTW9kZU9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGVhbmVkID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuICAgIGlmICghY2xlYW5lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRvYzogRG9jdW1lbnQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGNsZWFuZWQsICd0ZXh0L2h0bWwnKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHBhcnNlIHBhc3RlZCBIVE1MIGZvciBpbWFnZSBjb21wcmVzc2lvbi4gUGFzdGUgd2lsbCBjb250aW51ZS4nLCBlcnIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW1nRWxlbWVudHMgPSBBcnJheS5mcm9tKGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKSlcclxuICAgICAgLm1hcChpbWcgPT4gaW1nIGFzIEhUTUxJbWFnZUVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoaW1nID0+IHR5cGVvZiBpbWc/LnNyYyA9PT0gJ3N0cmluZycgJiYgaW1nLnNyYy5zdGFydHNXaXRoKCdkYXRhOmltYWdlLycpKTtcclxuXHJcbiAgICBpZiAoaW1nRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYmVmb3JlU2l6ZUJ5dGVzID0gMDtcclxuICAgIGxldCBhZnRlclNpemVCeXRlcyA9IDA7XHJcbiAgICBsZXQgZmFpbGVkQ291bnQgPSAwO1xyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBpbWdFbGVtZW50cy5tYXAoYXN5bmMgKGltZywgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuYmFzZTY0VG9GaWxlKHNyYywgYHBhc3RlZC1pbWFnZS0ke2luZGV4fWApO1xyXG4gICAgICAgICAgYmVmb3JlU2l6ZUJ5dGVzICs9IGZpbGUuc2l6ZTtcclxuXHJcbiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKGZpbGUpO1xyXG4gICAgICAgICAgaWYgKCFjb21wcmVzc2VkKSB7XHJcbiAgICAgICAgICAgIGZhaWxlZENvdW50Kys7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBza2lwcGVkL2ZhaWxlZCBmb3IgcGFzdGVkIGltYWdlICMke2luZGV4ICsgMX0uYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKGNvbXByZXNzZWQpO1xyXG4gICAgICAgICAgYWZ0ZXJTaXplQnl0ZXMgKz0gY29tcHJlc3NlZC5zaXplO1xyXG4gICAgICAgICAgaW1nLnNyYyA9IGJhc2U2NDtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIGZhaWxlZENvdW50Kys7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtadGV4dGVkaXRvcl0gRXJyb3IgY29tcHJlc3NpbmcgcGFzdGVkIGltYWdlICMke2luZGV4ICsgMX0uYCwgZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBIZWxwZnVsIGNvbnNvbGUgbG9ncyBmb3IgdHJvdWJsZXNob290aW5nLlxyXG4gICAgY29uc3QgYmVmb3JlS2IgPSAoYmVmb3JlU2l6ZUJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKTtcclxuICAgIGNvbnN0IGFmdGVyS2IgPSAoYWZ0ZXJTaXplQnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDIpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBgW1p0ZXh0ZWRpdG9yXSBQYXN0ZWQgaW1hZ2UgY29tcHJlc3Npb24gY29tcGxldGVkLiBJbWFnZXM9JHtpbWdFbGVtZW50cy5sZW5ndGh9LCBGYWlsZWQ9JHtmYWlsZWRDb3VudH0sIEJlZm9yZT0ke2JlZm9yZUtifUtCLCBBZnRlcj0ke2FmdGVyS2J9S0JgLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBNb2RpZnkgd2hhdCBnZXRzIHBhc3RlZCwgbm90IGVkaXRvci52YWx1ZS5cclxuICAgIGUuY2xlYW5lZEh0bWwgPSBkb2MuYm9keS5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgY29tcHJlc3MgbW9kZSB2aWEgY29uZmlybWF0aW9uIGRpYWxvZy5cclxuICAgKi9cclxuICBwdWJsaWMgb25PZmZDb21wcmVzc01vZGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWFkZXIgPSAnQ29uZmlybWF0aW9uJztcclxuICAgIGNvbnN0IGFjdGlvblRleHQgPSB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyAnZGlzYWJsZScgOiAnZW5hYmxlJztcclxuXHJcbiAgICAvLyBLZWVwIGV4aXN0aW5nIGJlaGF2aW9yOiB0b2dnbGluZyByZXNldHMgY29udGVudC5cclxuICAgIGNvbnN0IG1lc3NhZ2UgPVxyXG4gICAgICBgRG8geW91IHdhbnQgdG8gPGI+JHthY3Rpb25UZXh0fTwvYj4gaW1hZ2UgY29tcHJlc3Npb24gd2hlbiBpbnB1dCBjb250ZW50P2AgK1xyXG4gICAgICBgPGJyLz5Ob3RlOiBDbGljayBcIlllc1wiIHRoZSBjb250ZW50IHdpbGwgYmUgcmVzZXQgdG8gYmxhbmsuYDtcclxuXHJcbiAgICBjb25zdCBidXR0b25zID0ge1xyXG4gICAgICB5ZXM6IHsgdGV4dDogJ1llcycsIGNzc0NsYXNzOiAncHJpbWFyeScgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgICAgbm86IHsgdGV4dDogJ05vJywgY3NzQ2xhc3M6ICdzZWNvbmRhcnknIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlXHJcbiAgICAgIC5zaG93KGhlYWRlciwgbWVzc2FnZSwgW2J1dHRvbnMueWVzLCBidXR0b25zLm5vXSwgWydjb2wtNCddKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlcGx5ID0+IHtcclxuICAgICAgICBpZiAocmVwbHkgIT09ICdZZXMnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCB0b2dnbGUgY29tcHJlc3Npb24gbW9kZS4nKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVkaXRvci52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuaXNDb21wcmVzc01vZGVPbiA9ICF0aGlzLmlzQ29tcHJlc3NNb2RlT247XHJcblxyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBgJHt0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyAnRW5hYmxlJyA6ICdEaXNhYmxlJ30gaW1hZ2UgY29tcHJlc3Npb24gc3VjY2Vzc2Z1bGx5LmAsXHJcbiAgICAgICAgICAndG9wJyxcclxuICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgMjUwMCxcclxuICAgICAgICAgICdzdWNjZXNzJyxcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29tcHJlc3Npb25Ub29sYmFySWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBrLWktaW1hZ2UgJHt0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRJY29uIDogdGhpcy5jb21wcmVzc2lvbkVuYWJsZUljb259YDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29tcHJlc3Npb25Ub29sYmFyVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHt0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyAnRGlzYWJsZScgOiAnRW5hYmxlJ30gaW1hZ2UgY29tcHJlc3Npb25gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlbnRlckFzTGluZUJyZWFrUGx1Z2luKCk6IFBsdWdpbiB7XG4gICAgcmV0dXJuIGtleW1hcCh7XG4gICAgICAnU2hpZnQtRW50ZXInOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCBzcGxpdEJsb2NrKSxcbiAgICAgIEVudGVyOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhcmRCcmVhayA9IHN0YXRlLnNjaGVtYS5ub2Rlcy5oYXJkX2JyZWFrO1xuICAgICAgICBpZiAoIWhhcmRCcmVhayB8fCAhc3RhdGUuc2VsZWN0aW9uLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XHJcbiAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChoYXJkQnJlYWsuY3JlYXRlKCkpLnNjcm9sbEludG9WaWV3KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1cyBlZGl0b3IgaWYgYXZhaWxhYmxlLiBSZXR1cm5zIHRydWUgaWYgZm9jdXMgc3VjY2VlZGVkLiAqL1xyXG4gIHB1YmxpYyBmb2N1cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb250QXdlc29tZShpY29uTmFtZTogc3RyaW5nLCBmb250QXdlc29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSk6IHVua25vd24ge1xyXG4gICAgY29uc3QgaWNvbk5hbWVWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShpY29uTmFtZSwgdGhpcy5ncm91cCk7XHJcbiAgICBpZiAoaWNvbk5hbWVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRGb250QXdlc29tZShpY29uTmFtZVZhbHVlLCBmb250QXdlc29tZVNlcnZpY2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGljb25OYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1lcmdlIEtlbmRvIHBhc3RlIGNsZWFudXAgc2V0dGluZ3MgZnJvbSBQYXN0ZUNsZWFudXBTZXR0aW5ncywgd2l0aCBkYXRhLk9wdGlvbnMga2VwdCBhcyBhIGxlZ2FjeSBmYWxsYmFjay4gKi9cclxuICBwcml2YXRlIHNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kYXRhPy5QYXN0ZUNsZWFudXBTZXR0aW5ncyA/PyB0aGlzLmRhdGE/Lk9wdGlvbnM7XHJcbiAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUob3B0aW9ucywgdGhpcy5ncm91cCk7XHJcbiAgICAgIGlmIChyZXNvbHZlZCAmJiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhc3RlQ2xlYW51cFNldHRpbmdzLCByZXNvbHZlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGNsZWFudXAgc2V0dGluZ3MgcmVzb2x2ZWQgdmFsdWUgaXMgbm90IGFuIG9iamVjdC4gU2V0dGluZ3MgdW5jaGFuZ2VkLicsIHtcclxuICAgICAgICAgIHJlc29sdmVkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgb3B0aW9ucyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5zdXBwb3J0ZWQgcGFzdGUgY2xlYW51cCBzZXR0aW5ncyB0eXBlLiBTZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICB0eXBlOiB0eXBlb2Ygb3B0aW9ucyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmUgb3B0aW9uYWwgcGFzdGUgc3ltYm9sIG5vcm1hbGl6YXRpb24gc2V0dGluZ3MgZnJvbSBmaWVsZCBjb25maWcuICovXHJcbiAgcHJpdmF0ZSBzZXR1cFN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5kYXRhPy5TeW1ib2xOb3JtYWxpemF0aW9uO1xyXG4gICAgaWYgKHNldHRpbmdzID09PSB1bmRlZmluZWQgfHwgc2V0dGluZ3MgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09ICdib29sZWFuJykge1xyXG4gICAgICB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkID0gc2V0dGluZ3M7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCByZXNvbHZlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzZXR0aW5ncywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMubWVyZ2VTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MocmVzb2x2ZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZXJnZVN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKHNldHRpbmdzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCA9IHNldHRpbmdzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFzZXR0aW5ncyB8fCB0eXBlb2Ygc2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2V0dGluZ3MpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBTeW1ib2xOb3JtYWxpemF0aW9uIHJlc29sdmVkIHZhbHVlIGlzIG5vdCBhIHN1cHBvcnRlZCBjb25maWcuIFNldHRpbmdzIHVuY2hhbmdlZC4nLCB7XHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncywgc2V0dGluZ3MpO1xyXG4gICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzID1cclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMpXHJcbiAgICAgICAgPyB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHNcclxuICAgICAgICA6IFtdO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBDdXN0b20gSW1hZ2UgVXBsb2FkIC8gRW5sYXJnZVxyXG5cclxuICAvKiogVHJpZ2dlciBoaWRkZW4gZmlsZSBpbnB1dCBjbGljayBmb3IgaW1hZ2UgdXBsb2FkLiAqL1xyXG4gIHB1YmxpYyBvcGVuRmlsZUV4cGxvcmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBgJHt0aGlzLmRhdGEuVmFsdWV9LXVwbG9hZC1maWxlYDtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbnB1dCBlbGVtZW50IG5vdCBmb3VuZCAoaWQ9XCIke2lkfVwiKS5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbiBhbiBlbmxhcmdlZCBwb3B1cCBlZGl0b3IuICovXHJcbiAgcHVibGljIG9wZW5Qb3B1cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBvcGVuIHBvcHVwLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3BlbiBkaWFsb2dcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xyXG4gICAgICBjb250ZW50OiBadGV4dGVkaXRvckNvbXBvbmVudCxcclxuICAgICAgd2lkdGg6ICc5OCUnLFxyXG4gICAgICBoZWlnaHQ6ICc5NyUnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXBDb21wb25lbnQgPSB0aGlzLmRpYWxvZ1JlZi5jb250ZW50Lmluc3RhbmNlIGFzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50O1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEuQWxsb3dFbmxhcmdlID0gZmFsc2U7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZjtcclxuICAgIHBvcHVwQ29tcG9uZW50LkNsb3NlRW5sYXJnZUJ0biA9IHRydWU7XHJcbiAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzO1xyXG5cclxuICAgIC8vIFByZXNlcnZlIHN0eWxlIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGNsb3NlLlxyXG4gICAgdGhpcy5vcmlnaW5hbElubGluZVN0eWxlID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxID8/ICcnO1xyXG4gICAgaWYgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXM/LnN0eWxlKSB7XHJcbiAgICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID1cclxuICAgICAgICAocG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPz8gJycpICtcclxuICAgICAgICBgaGVpZ2h0OiR7KHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCkudG9TdHJpbmcoKX1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcG9wdXBDb21wb25lbnQuZ3JvdXAgPSB0aGlzLmdyb3VwO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50U2V0dGluZ3MgPSB0aGlzLmNvbXBvbmVudFNldHRpbmdzO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZm9ybSA9IHRoaXMuZm9ybTtcclxuXHJcbiAgICAvLyBSZXN0b3JlIHN0YXRlIGFuZCBwdXNoIHZhbHVlIGJhY2sgaW50byBlZGl0b3Igb24gY2xvc2UuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5yZXN1bHQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5kYXRhLkFsbG93RW5sYXJnZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPSB0aGlzLm9yaWdpbmFsSW5saW5lU3R5bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFB1bGwgY3VycmVudCB6TW9kZWwgaW50byBlZGl0b3IgYW5kIHRyaWdnZXIgb25DaGFuZ2UgKGV4aXN0aW5nIGJlaGF2aW9yKS5cclxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdyb3VwPy56TW9kZWw/Llt0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgICBlZGl0b3IudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsb3NlIHRoZSBwb3B1cCBlZGl0b3IgaWYgb3Blbi4gKi9cclxuICBwdWJsaWMgb25Qb3B1cENsb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpYWxvZ1JlZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIDxpbnB1dCB0eXBlPVwiZmlsZVwiPiBjaGFuZ2UgYW5kIGluc2VydCBzZWxlY3RlZCBpbWFnZSBpbnRvIGVkaXRvci5cclxuICAgKiBOT1RFOiBQcmVmZXIgdHlwaW5nIGZpbGVJbnB1dCBhcyBFdmVudCBmb3IgYmV0dGVyIHNhZmV0eS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkSW1hZ2UoZmlsZUlucHV0OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dD8uZmlsZXM/LlswXTtcclxuXHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIE5vIGltYWdlIHNlbGVjdGVkIGZvciB1cGxvYWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2b2lkIHRoaXMuaW5zZXJ0SW1hZ2VJbnRvRWRpdG9yKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBpbWFnZSBpbnRvIGVkaXRvciwgb3B0aW9uYWxseSBjb21wcmVzc2luZyBmaXJzdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIGluc2VydEltYWdlSW50b0VkaXRvcihmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IGltYWdlLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdvcmtpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IGZpbGU7XHJcblxyXG4gICAgY29uc3QgY29tcHJlc3Npb25Db25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG5cclxuICAgIGlmIChjb21wcmVzc2lvbkVuYWJsZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtadGV4dGVkaXRvcl0gVXBsb2FkIGltYWdlIGJlZm9yZSBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuXHJcbiAgICAgIHdvcmtpbmdGaWxlID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKHdvcmtpbmdGaWxlKTtcclxuICAgICAgaWYgKCF3b3JraW5nRmlsZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBmYWlsZWQuIFVwbG9hZCBpbWFnZSBpbnNlcnRpb24gYWJvcnRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBhZnRlciBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKHdvcmtpbmdGaWxlKTtcclxuICAgICAgZWRpdG9yLmV4ZWMoJ2luc2VydEltYWdlJywgeyBzcmM6IGJhc2U2NCB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHJlYWQgdXBsb2FkZWQgaW1hZ2UgYXMgYmFzZTY0LicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydCBiYXNlNjQgKGRhdGEgVVJMKSB0byBGaWxlLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYmFzZTY0VG9GaWxlKGJhc2U2NFN0cmluZzogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICAvLyBVc2luZyBmZXRjaCBvbiBkYXRhIFVSTCBpcyBzdXBwb3J0ZWQgYnkgbW9kZXJuIGJyb3dzZXJzOyBrZWVwIGV4aXN0aW5nIGxvZ2ljLlxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiYXNlNjRTdHJpbmcpO1xyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwge1xyXG4gICAgICB0eXBlOiBibG9iLnR5cGUsXHJcbiAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpZiBpdCBpcyBhbiBpbWFnZSBhbmQgYWJvdmUgbWluIHRocmVzaG9sZC5cclxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBmaWxlIHdoZW4gY29tcHJlc3Npb24gaXMgc2tpcHBlZCwgYW5kIG51bGwgb25seSB3aGVuIGNvbXByZXNzaW9uIGZhaWxzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaW1hZ2VDb21wcmVzc2lvbihmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBpbWFnZUNvbXByZXNzaW9uIGNhbGxlZCB3aXRoIGVtcHR5IGZpbGUuJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmlsZS50eXBlIHx8ICFmaWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJykpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIGlzIG5vdCBhbiBpbWFnZS4nLCB7IHR5cGU6IGZpbGUudHlwZSB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgLy8gQ29tcHJlc3Npb24gbm90IGNvbmZpZ3VyZWQ7IGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0NvbmZpZyA9IHRoaXMuY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGNvbmZpZyk7XHJcblxyXG4gICAgLy8gSWYgZmlsZSBpcyBiZWxvdyB0aHJlc2hvbGQsIGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICBpZiAoZmlsZS5zaXplIDw9IGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIHNpemUgJHsoZmlsZS5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX1LQiBpcyBiZWxvdyB0aHJlc2hvbGQgJHsoaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCLmAsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWQkID0gdGhpcy5jb21wcmVzc0ltYWdlLmNvbXByZXNzKGZpbGUsIGltZ0NvbmZpZyk7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRGaWxlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY29tcHJlc3NlZCQpO1xyXG4gICAgICByZXR1cm4gY29tcHJlc3NlZEZpbGUgPz8gbnVsbDtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gQ29tcHJlc3Npb24gc2VydmljZSB0aHJldyBhbiBlcnJvci4nLCBlcnIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUgaW1hZ2UgY29tcHJlc3Npb24gY29uZmlnIGludG8gYnl0ZS1iYXNlZCB0aHJlc2hvbGRzLiAqL1xyXG4gIHByaXZhdGUgY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGltZ0NvbmZpZzogSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyk6IEltYWdlQ29tcHJlc3Npb25Db25maWcge1xyXG4gICAgaWYgKCFpbWdDb25maWcpIHtcclxuICAgICAgLy8gRGVmZW5zaXZlOiBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgY2FsbGVyIGNoZWNrcy5cclxuICAgICAgcmV0dXJuIGltZ0NvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSkge1xyXG4gICAgICBpbWdDb25maWcuRmlsZVNpemVNYXhTaXplQnl0ZSA9IHRoaXMuY29udmVydFNpemVUb0J5dGUoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIGxpa2UgXCIxMDBrYlwiLCBcIjEgTUJcIiwgXCIyZ2JcIiB0byBieXRlcy5cclxuICAgKiBJZiBubyB1bml0IGlzIHByb3ZpZGVkLCBieXRlcyBhcmUgYXNzdW1lZC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRTaXplVG9CeXRlKHNpemVTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAoIXNpemVTdHJpbmcgfHwgdHlwZW9mIHNpemVTdHJpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBjb252ZXJ0U2l6ZVRvQnl0ZSByZWNlaXZlZCBpbnZhbGlkIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBhbGwgc3BhY2VzLCBlLmcuIFwiMSBNQlwiIC0+IFwiMU1CXCJcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBzaXplU3RyaW5nLnJlcGxhY2UoLyAvZywgJycpLnRyaW0oKTtcclxuICAgIGlmICghdHJpbW1lZCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHRyYWN0IG51bWVyaWMgcGFydCBhbmQgdW5pdCBwYXJ0IChsZXR0ZXJzKS5cclxuICAgIC8vIEV4YW1wbGU6IFwiMS41TUJcIiA9PiBudW1iZXI9MS41LCB1bml0PVwibWJcIlxyXG4gICAgY29uc3QgbWF0Y2ggPSAvXihbMC05XSpcXC4/WzAtOV0rKShbYS16QS1aXSopJC8uZXhlYyh0cmltbWVkKTtcclxuICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVuYWJsZSB0byBwYXJzZSBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKG1hdGNoWzFdKTtcclxuICAgIGNvbnN0IHVuaXQgPSAobWF0Y2hbMl0gfHwgJ2InKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtZXJpYykgfHwgbnVtZXJpYyA8IDApIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEludmFsaWQgbnVtZXJpYyBzaXplIGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICBjYXNlICdiJzpcclxuICAgICAgY2FzZSAnJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgICAgY2FzZSAna2InOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNDtcclxuICAgICAgY2FzZSAnbWInOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ2diJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0ICogMTAyNDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5rbm93biB1bml0IGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gYnl0ZXMuJywgeyBzaXplU3RyaW5nLCB1bml0IH0pO1xyXG4gICAgICAgIHJldHVybiBudW1lcmljO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlYWQgYSBGaWxlIGFzIGJhc2U2NCBkYXRhIFVSTC4gKi9cclxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmlsZSBpcyByZXF1aXJlZC4nKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxufVxyXG4iLCJcclxuXHJcbjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJ6dGV4dGVkaXRvci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGV4cGFuZC1idG4tY29udGFpbmVyXCI+XHJcbiAgPGlvbi1idXR0b24gICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJkYXRhLkFsbG93RW5sYXJnZVwiIChjbGljayk9XCJvcGVuUG9wdXAoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoJ2ZhRXhwYW5kQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbiAgPGlvbi1idXR0b24gIGNsYXNzPVwiaW9uLWFjdGl2YXRhYmxlIHJpcHBsZS1wYXJlbnRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIiAqbmdJZj1cIkNsb3NlRW5sYXJnZUJ0blwiIChjbGljayk9XCJvblBvcHVwQ2xvc2UoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUNvbXByZXNzQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbjwvZGl2PlxyXG4gIDxrZW5kby1lZGl0b3IgI2VkaXRvclxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwiZGF0YS5SZXNpemFibGUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BsdWdpbnNdPVwicGx1Z2luc0NhbGxiYWNrXCJcclxuICAgICAgICAgICAgICAgIFtwYXN0ZUNsZWFudXBTZXR0aW5nc109XCJwYXN0ZUNsZWFudXBTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtpZnJhbWVdPVwiY29tcG9uZW50U2V0dGluZ3MuaWZyYW1lXCI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciAqbmdJZj1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnYmFzaWMnXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTJcIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3I+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRVbm9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0T3JkZXJlZExpc3RCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRGaWxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdkZWZhdWx0J1wiIGtlbmRvRWRpdG9ySW5zZXJ0SW1hZ2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2V4cGxvcmVyJ1wiIGljb249XCJrLWktaW1hZ2Ugay1pLXBob3RvXCIgKGNsaWNrKT1cIm9wZW5GaWxlRXhwbG9yZXIoKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5Db21wcmVzc2lvblwiIFtpY29uXT1cImNvbXByZXNzaW9uVG9vbGJhckljb25cIiAoY2xpY2spPVwib25PZmZDb21wcmVzc01vZGUoKVwiIFt0aXRsZV09XCJjb21wcmVzc2lvblRvb2xiYXJUaXRsZVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclZpZXdTb3VyY2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgIDwva2VuZG8tdG9vbGJhcj5cclxuICAgIDxrZW5kby10b29sYmFyICpuZ0lmPVwiZGF0YS5Ub29sQmFyU3R5bGUgPT09ICdmdWxsJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3Igdmlldz1cImdyYWRpZW50XCI+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRVbm9yZGVyZWRMaXN0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0T3JkZXJlZExpc3RCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JNZXJnZUNlbGxzQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3BsaXRDZWxsQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBbaWNvbl09XCJjb21wcmVzc2lvblRvb2xiYXJJY29uXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKClcIiBbdGl0bGVdPVwiY29tcHJlc3Npb25Ub29sYmFyVGl0bGVcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JWaWV3U291cmNlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgPC9rZW5kby1lZGl0b3I+XHJcbiAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHR5cGU9XCJmaWxlXCIgW2lkXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgW25hbWVdPVwiZGF0YS5WYWx1ZSArJy11cGxvYWQtZmlsZSdcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgbmdmLW1heC1zaXplPVwiNU1CXCIgKGNoYW5nZSk9XCJ1cGxvYWRJbWFnZSgkZXZlbnQpXCI+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -93,7 +93,7 @@ import 'brace/mode/javascript';
93
93
  import 'brace/mode/html';
94
94
  import { trigger, transition, style, animate, state } from '@angular/animations';
95
95
  import { event as event$1 } from 'jquery';
96
- import { keymap, chainCommands, exitCode } from '@progress/kendo-editor-common';
96
+ import { DOMParser as DOMParser$1, keymap, chainCommands, exitCode, splitBlock } from '@progress/kendo-editor-common';
97
97
  import * as i7$2 from '@progress/kendo-angular-toolbar';
98
98
  import { MultiSelect, DropDownList } from '@syncfusion/ej2-dropdowns';
99
99
  import { createElement, getComponent } from '@syncfusion/ej2-base';
@@ -9959,14 +9959,44 @@ class ZtexteditorComponent extends InputFieldBase {
9959
9959
  if (htmlHasImg || cleanedHasTags) {
9960
9960
  return false;
9961
9961
  }
9962
- // Plain-text paste: prevent Kendo from inserting encoded entities as literal text.
9963
- e.preventDefault();
9964
- // Decode common entities once so user sees correct characters.
9965
- // This is intentionally limited to common entities to avoid unexpected transformations.
9966
9962
  const normalized = this.normalizePastedText(plainText || cleanedHtml);
9967
- editor.exec('insertText', { text: normalized });
9963
+ e.preventDefault();
9964
+ this.insertPlainTextWithEditorLineBreaks(this.normalizeLineEndings(normalized));
9968
9965
  return true;
9969
9966
  }
9967
+ normalizeLineEndings(value) {
9968
+ return value.replace(/\r\n|\r/g, '\n');
9969
+ }
9970
+ insertPlainTextWithEditorLineBreaks(value) {
9971
+ var _a;
9972
+ const view = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.view;
9973
+ if (!view) {
9974
+ console.warn('[Ztexteditor] Editor view is not ready. Cannot insert pasted text.');
9975
+ return;
9976
+ }
9977
+ const container = document.createElement('div');
9978
+ container.innerHTML = this.plainTextToEditorHtml(value);
9979
+ const slice = DOMParser$1.fromSchema(view.state.schema).parseSlice(container);
9980
+ view.dispatch(view.state.tr.replaceSelection(slice).scrollIntoView());
9981
+ }
9982
+ plainTextToEditorHtml(value) {
9983
+ var _a;
9984
+ const lines = value.split('\n');
9985
+ if (((_a = this.data) === null || _a === void 0 ? void 0 : _a.EnterKeyBehavior) === 'paragraph') {
9986
+ return lines
9987
+ .map(line => line.trim() ? `<p>${this.escapeHtml(line)}</p>` : '<p><br></p>')
9988
+ .join('');
9989
+ }
9990
+ return `<p>${lines.map(line => this.escapeHtml(line)).join('<br>')}</p>`;
9991
+ }
9992
+ escapeHtml(value) {
9993
+ return value
9994
+ .replaceAll('&', '&amp;')
9995
+ .replaceAll('<', '&lt;')
9996
+ .replaceAll('>', '&gt;')
9997
+ .replaceAll('"', '&quot;')
9998
+ .replaceAll("'", '&#39;');
9999
+ }
9970
10000
  /** Normalize text nodes inside pasted HTML without touching tags, styles, links, or image attributes. */
9971
10001
  normalizePastedHtml(e) {
9972
10002
  var _a, _b;
@@ -9991,8 +10021,28 @@ class ZtexteditorComponent extends InputFieldBase {
9991
10021
  node.textContent = this.normalizePastedText((_b = node.textContent) !== null && _b !== void 0 ? _b : '');
9992
10022
  node = walker.nextNode();
9993
10023
  }
10024
+ this.removeEmptyParagraphs(doc);
9994
10025
  e.cleanedHtml = doc.body.innerHTML;
9995
10026
  }
10027
+ removeEmptyParagraphs(doc) {
10028
+ const emptyParagraphs = Array.from(doc.body.querySelectorAll('p')).filter(paragraph => this.isEmptyParagraph(paragraph));
10029
+ emptyParagraphs.forEach(paragraph => paragraph.remove());
10030
+ }
10031
+ isEmptyParagraph(paragraph) {
10032
+ var _a;
10033
+ const allowedEmptyNodes = Array.from(paragraph.childNodes).every(node => {
10034
+ var _a;
10035
+ if (node.nodeType === Node.TEXT_NODE) {
10036
+ return !((_a = node.textContent) !== null && _a !== void 0 ? _a : '').trim();
10037
+ }
10038
+ if (node.nodeType !== Node.ELEMENT_NODE) {
10039
+ return false;
10040
+ }
10041
+ const element = node;
10042
+ return element.tagName.toLowerCase() === 'br';
10043
+ });
10044
+ return allowedEmptyNodes && !((_a = paragraph.textContent) !== null && _a !== void 0 ? _a : '').trim();
10045
+ }
9996
10046
  /** Normalize known paste symbol variants from Office/email content into stable display characters. */
9997
10047
  normalizePastedText(value) {
9998
10048
  if (!this.symbolNormalizationSettings.Enabled || !value) {
@@ -10139,6 +10189,7 @@ class ZtexteditorComponent extends InputFieldBase {
10139
10189
  }
10140
10190
  enterAsLineBreakPlugin() {
10141
10191
  return keymap({
10192
+ 'Shift-Enter': chainCommands(exitCode, splitBlock),
10142
10193
  Enter: chainCommands(exitCode, (state, dispatch) => {
10143
10194
  const hardBreak = state.schema.nodes.hard_break;
10144
10195
  if (!hardBreak || !state.selection.$from.parent.inlineContent) {