@firestitch/html-editor 12.7.6 → 13.0.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.
Files changed (39) hide show
  1. package/app/modules/html-editor/components/html-editor/html-editor.component.d.ts +5 -3
  2. package/esm2020/app/modules/html-editor/components/html-editor/html-editor.component.mjs +480 -0
  3. package/{esm2015/app/modules/html-editor/fs-html-editor.module.js → esm2020/app/modules/html-editor/fs-html-editor.module.mjs} +10 -7
  4. package/esm2020/app/modules/html-editor/plugins/checklist.plugin.mjs +39 -0
  5. package/esm2020/app/modules/html-editor/plugins/code.plugin.mjs +67 -0
  6. package/esm2020/app/modules/html-editor/plugins/mention.plugin.mjs +90 -0
  7. package/esm2020/app/modules/html-editor/plugins/realtime.plugin.mjs +16 -0
  8. package/esm2020/app/modules/html-editor/plugins/screen-record.plugin.mjs +92 -0
  9. package/{esm2015/app/modules/html-editor/services/froala-loader.service.js → esm2020/app/modules/html-editor/services/froala-loader.service.mjs} +4 -4
  10. package/esm2020/app/modules/html-renderer/components/html-renderer/html-renderer.component.mjs +24 -0
  11. package/{esm2015/app/modules/html-renderer/fs-html-renderer.module.js → esm2020/app/modules/html-renderer/fs-html-renderer.module.mjs} +5 -5
  12. package/fesm2015/{firestitch-html-editor.js → firestitch-html-editor.mjs} +88 -88
  13. package/fesm2015/firestitch-html-editor.mjs.map +1 -0
  14. package/fesm2020/firestitch-html-editor.mjs +1014 -0
  15. package/fesm2020/firestitch-html-editor.mjs.map +1 -0
  16. package/package.json +21 -8
  17. package/bundles/firestitch-html-editor.umd.js +0 -1430
  18. package/bundles/firestitch-html-editor.umd.js.map +0 -1
  19. package/esm2015/app/modules/html-editor/components/html-editor/html-editor.component.js +0 -480
  20. package/esm2015/app/modules/html-editor/plugins/checklist.plugin.js +0 -35
  21. package/esm2015/app/modules/html-editor/plugins/code.plugin.js +0 -63
  22. package/esm2015/app/modules/html-editor/plugins/mention.plugin.js +0 -87
  23. package/esm2015/app/modules/html-editor/plugins/realtime.plugin.js +0 -13
  24. package/esm2015/app/modules/html-editor/plugins/screen-record.plugin.js +0 -91
  25. package/esm2015/app/modules/html-renderer/components/html-renderer/html-renderer.component.js +0 -29
  26. package/fesm2015/firestitch-html-editor.js.map +0 -1
  27. /package/{esm2015/app/modules/html-editor/classes/plugin.js → esm2020/app/modules/html-editor/classes/plugin.mjs} +0 -0
  28. /package/{esm2015/app/modules/html-editor/consts/paragraph-buttons.const.js → esm2020/app/modules/html-editor/consts/paragraph-buttons.const.mjs} +0 -0
  29. /package/{esm2015/app/modules/html-editor/consts/rich-buttons.const.js → esm2020/app/modules/html-editor/consts/rich-buttons.const.mjs} +0 -0
  30. /package/{esm2015/app/modules/html-editor/consts/text-buttons.const.js → esm2020/app/modules/html-editor/consts/text-buttons.const.mjs} +0 -0
  31. /package/{esm2015/app/modules/html-editor/enums/default-plugin.enum.js → esm2020/app/modules/html-editor/enums/default-plugin.enum.mjs} +0 -0
  32. /package/{esm2015/app/modules/html-editor/injects/config.inject.js → esm2020/app/modules/html-editor/injects/config.inject.mjs} +0 -0
  33. /package/{esm2015/app/modules/html-editor/interfaces/html-editor-config.js → esm2020/app/modules/html-editor/interfaces/html-editor-config.mjs} +0 -0
  34. /package/{esm2015/app/modules/html-editor/interfaces/plugin-button.js → esm2020/app/modules/html-editor/interfaces/plugin-button.mjs} +0 -0
  35. /package/{esm2015/app/modules/html-editor/interfaces/plugin-config.js → esm2020/app/modules/html-editor/interfaces/plugin-config.mjs} +0 -0
  36. /package/{esm2015/app/modules/html-editor/plugins/configs/mention-plugin.config.js → esm2020/app/modules/html-editor/plugins/configs/mention-plugin.config.mjs} +0 -0
  37. /package/{esm2015/app/modules/html-editor/plugins/configs/screen-record-plugin.config.js → esm2020/app/modules/html-editor/plugins/configs/screen-record-plugin.config.mjs} +0 -0
  38. /package/{esm2015/firestitch-html-editor.js → esm2020/firestitch-html-editor.mjs} +0 -0
  39. /package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
@@ -6,6 +6,7 @@ import { FsFroalaLoaderService } from '../../services/froala-loader.service';
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class FsHtmlEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor, Validator, OnDestroy {
8
8
  private _defaultConfig;
9
+ private _document;
9
10
  private _cdRef;
10
11
  private _fr;
11
12
  classFocused: boolean;
@@ -19,8 +20,9 @@ export declare class FsHtmlEditorComponent implements OnInit, AfterViewInit, Con
19
20
  private _html;
20
21
  private _initialize$;
21
22
  private _froalaReady$;
23
+ private _window;
22
24
  private _destroy$;
23
- constructor(_defaultConfig: any, _cdRef: ChangeDetectorRef, _fr: FsFroalaLoaderService);
25
+ constructor(_defaultConfig: any, _document: Document, _cdRef: ChangeDetectorRef, _fr: FsFroalaLoaderService);
24
26
  onChange: (data: any) => void;
25
27
  onTouched: () => void;
26
28
  get el(): any;
@@ -31,7 +33,6 @@ export declare class FsHtmlEditorComponent implements OnInit, AfterViewInit, Con
31
33
  ngAfterViewInit(): void;
32
34
  hasContent(): boolean;
33
35
  initialize(options?: any): void;
34
- private _processImageUpload;
35
36
  updateSize(): void;
36
37
  validate(control: AbstractControl): ValidationErrors | null;
37
38
  focus(options?: {
@@ -45,6 +46,7 @@ export declare class FsHtmlEditorComponent implements OnInit, AfterViewInit, Con
45
46
  registerOnTouched(fn: () => void): void;
46
47
  ngOnDestroy(): void;
47
48
  destroy(): void;
49
+ private _processImageUpload;
48
50
  private _createConfig;
49
51
  private _change;
50
52
  private _initButtons;
@@ -53,6 +55,6 @@ export declare class FsHtmlEditorComponent implements OnInit, AfterViewInit, Con
53
55
  private _listenLazyInit;
54
56
  private _contentChanged;
55
57
  private _setupFroala;
56
- static ɵfac: i0.ɵɵFactoryDeclaration<FsHtmlEditorComponent, [{ optional: true; }, null, null]>;
58
+ static ɵfac: i0.ɵɵFactoryDeclaration<FsHtmlEditorComponent, [{ optional: true; }, null, null, null]>;
57
59
  static ɵcmp: i0.ɵɵComponentDeclaration<FsHtmlEditorComponent, "fs-html-editor", never, { "config": "config"; "hint": "hint"; "disabled": "disabled"; }, {}, never, never>;
58
60
  }
@@ -0,0 +1,480 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, HostBinding, Inject, Input, Optional, ViewChild, } from '@angular/core';
2
+ import { ControlContainer, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgForm, } from '@angular/forms';
3
+ import { DOCUMENT } from '@angular/common';
4
+ import { guid } from '@firestitch/common';
5
+ import { FileProcessor, FsFile } from '@firestitch/file';
6
+ import { BehaviorSubject, fromEventPattern, ReplaySubject, Subject } from 'rxjs';
7
+ import { distinctUntilChanged, filter, map, skip, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
8
+ import { merge } from 'lodash-es';
9
+ import { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';
10
+ import { FsFroalaLoaderService } from '../../services/froala-loader.service';
11
+ import { ParagraphButtons } from './../../consts/paragraph-buttons.const';
12
+ import { RichButtons } from './../../consts/rich-buttons.const';
13
+ import { TextButtons } from './../../consts/text-buttons.const';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../../services/froala-loader.service";
16
+ import * as i2 from "@firestitch/label";
17
+ import * as i3 from "@angular/common";
18
+ import * as i4 from "@firestitch/skeleton";
19
+ export class FsHtmlEditorComponent {
20
+ constructor(_defaultConfig, _document, _cdRef, _fr) {
21
+ this._defaultConfig = _defaultConfig;
22
+ this._document = _document;
23
+ this._cdRef = _cdRef;
24
+ this._fr = _fr;
25
+ this.classFocused = false;
26
+ this.config = {};
27
+ this.disabled = false;
28
+ this.initialized = false;
29
+ this.containerID = `fs-html-editor-${guid('xxx')}`;
30
+ this._initialize$ = new ReplaySubject();
31
+ this._froalaReady$ = new BehaviorSubject(null);
32
+ this._window = this._document.defaultView;
33
+ this._destroy$ = new Subject();
34
+ this.onChange = (data) => { };
35
+ this.onTouched = () => { };
36
+ }
37
+ get el() {
38
+ return this.elRef.nativeElement;
39
+ }
40
+ get html() {
41
+ return this._html;
42
+ }
43
+ get editor() {
44
+ return this._editor;
45
+ }
46
+ get froalaLoaded$() {
47
+ return this._fr.loaded$;
48
+ }
49
+ ngOnInit() {
50
+ this.config = this.config || {};
51
+ this.config.autofocus = this.config.autofocus && (!this.config.disabled || !this.disabled);
52
+ this._listenLazyInit();
53
+ }
54
+ ngAfterViewInit() {
55
+ this._initialize$.next();
56
+ }
57
+ hasContent() {
58
+ const el = document.createElement('div');
59
+ if (el.querySelector('img')) {
60
+ return true;
61
+ }
62
+ el.innerHTML = this._html;
63
+ return !!el.innerText.length;
64
+ }
65
+ initialize(options = {}) {
66
+ const config = this._createConfig();
67
+ this._initPlugins(config);
68
+ this._initButtons(config);
69
+ this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {
70
+ this._froalaReady$.next({ config, options });
71
+ });
72
+ }
73
+ updateSize() {
74
+ // Hack: To trigger the toolbar button size modes
75
+ window.dispatchEvent(new Event('resize'));
76
+ }
77
+ validate(control) {
78
+ const err = {};
79
+ if (this.config.maxLength && this._html) {
80
+ const maxLength = this.config.maxLength;
81
+ const length = this._html.length;
82
+ if (length > maxLength) {
83
+ err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;
84
+ }
85
+ }
86
+ return Object.keys(err).length ? err : null;
87
+ }
88
+ focus(options) {
89
+ options = options ? options : {};
90
+ if (options.cursorPosition === 'end') {
91
+ this.editor.selection.setAtEnd(this.editor.$el.get(0));
92
+ }
93
+ else {
94
+ this.editor.selection.setAtStart(this.editor.$el.get(0));
95
+ }
96
+ this.editor.selection.restore();
97
+ const elSelection = this.editor.selection.element();
98
+ if (elSelection) {
99
+ elSelection.scrollIntoView({ block: 'center' });
100
+ }
101
+ }
102
+ clear() {
103
+ this.writeValue('');
104
+ }
105
+ disable() {
106
+ this.disabled = true;
107
+ }
108
+ setHtml(html) {
109
+ this.writeValue(html);
110
+ }
111
+ writeValue(html) {
112
+ this._html = html || '';
113
+ if (Array.isArray(this._html)) {
114
+ this._html = this._html.pop();
115
+ }
116
+ this._html = this._html
117
+ .replace(/<(li)>\s?<(div)>/g, '<li>')
118
+ .replace(/<\/(div)><\/(li)>/g, '</li>');
119
+ if (this.editor && this.editor.html) {
120
+ try {
121
+ this.editor.html.set(this._html);
122
+ }
123
+ catch (e) {
124
+ }
125
+ }
126
+ this._cdRef.markForCheck();
127
+ }
128
+ registerOnChange(fn) {
129
+ this.onChange = fn;
130
+ }
131
+ registerOnTouched(fn) {
132
+ this.onTouched = fn;
133
+ }
134
+ ngOnDestroy() {
135
+ this._initialize$.complete();
136
+ this._destroy$.next();
137
+ this._destroy$.complete();
138
+ this.destroy();
139
+ }
140
+ destroy() {
141
+ if (this.editor) {
142
+ this.editor.destroy();
143
+ }
144
+ this.initialized = false;
145
+ this._cdRef.markForCheck();
146
+ this.el.innerHTML = '';
147
+ }
148
+ _processImageUpload(blob) {
149
+ const processor = new FileProcessor();
150
+ const file = new FsFile(blob);
151
+ const config = {
152
+ orientate: true,
153
+ quality: this.config.image.quality,
154
+ format: this.config.image.format,
155
+ maxWidth: this.config.image.width,
156
+ maxHeight: this.config.image.height,
157
+ minWidth: this.config.image.minWidth,
158
+ minHeight: this.config.image.minHeight,
159
+ };
160
+ return processor.processFile(file, config)
161
+ .pipe(switchMap((fsFile) => {
162
+ return this.config.image.upload(fsFile.file);
163
+ }));
164
+ }
165
+ _createConfig() {
166
+ return merge({ froalaConfig: {} }, this._defaultConfig, this.config);
167
+ }
168
+ _change(html) {
169
+ this._html = html;
170
+ this.onChange(html);
171
+ }
172
+ _initButtons(config) {
173
+ (config.buttons || [])
174
+ .forEach((button) => {
175
+ /*
176
+ Svg Keys:
177
+ ["add", "advancedImageEditor", "alignCenter", "alignJustify", "alignLeft", "alignRight",
178
+ "anchors", "back", "backgroundColor", "blockquote", "bold", "cellBackground",
179
+ "cellBorderColor", "cellOptions", "cellStyle", "clearFormatting", "close", "codeView",
180
+ "cogs", "columns", "editLink", "exitFullscreen", "fontAwesome", "fontFamily",
181
+ "fontSize", "fullscreen", "help", "horizontalLine", "imageAltText", "imageCaption",
182
+ "imageClass", "imageDisplay", "imageManager", "imageSize", "indent", "inlineClass",
183
+ "inlineStyle", "insertEmbed", "insertFile", "insertImage", "insertLink", "insertMore",
184
+ "insertTable", "insertVideo", "upload", "italic", "search", "lineHeight", "linkStyles",
185
+ "mention", "more", "openLink", "orderedList", "outdent", "pageBreaker",
186
+ "paragraphFormat", "paragraphMore", "paragraphStyle", "pdfExport", "print",
187
+ "redo", "removeTable", "remove", "replaceImage", "row", "selectAll", "smile",
188
+ "spellcheck", "star", "strikeThrough", "subscript", "superscript", "symbols", "tags",
189
+ "tableHeader", "tableStyle", "textColor", "textMore", "underline", "undo", "unlink",
190
+ "unorderedList", "verticalAlignBottom", "verticalAlignMiddle", "verticalAlignTop"]
191
+ */
192
+ if (button.svgKey) {
193
+ this._fr.FroalaEditor.DefineIcon(button.name, { SVG_KEY: button.svgKey });
194
+ }
195
+ this._fr.FroalaEditor.RegisterCommand(button.name, {
196
+ title: button.title,
197
+ focus: button.focus ?? true,
198
+ undo: button.undo ?? true,
199
+ refreshAfterCallback: button.refreshAfterCallback ?? true,
200
+ callback() {
201
+ button.click(this);
202
+ },
203
+ });
204
+ });
205
+ }
206
+ _initPlugins(config) {
207
+ (config.plugins || []).forEach((plugin) => {
208
+ this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {
209
+ plugin.editor = editor;
210
+ plugin.initialize();
211
+ return plugin;
212
+ };
213
+ (plugin.config.buttons || []).forEach((button) => {
214
+ this._fr.FroalaEditor.DefineIcon(button.name, {
215
+ NAME: button.name,
216
+ PATH: button.svgPath,
217
+ });
218
+ this._fr.FroalaEditor.RegisterCommand(button.name, {
219
+ icon: button.name,
220
+ title: button.tooltip,
221
+ undo: button.undo,
222
+ focus: button.focus,
223
+ showOnMobile: button.showOnMobile,
224
+ refreshAfterCallback: button.refreshAfterCallback,
225
+ callback() {
226
+ if (button.click) {
227
+ button.click(this);
228
+ }
229
+ },
230
+ refresh(button) {
231
+ if (button.refresh) {
232
+ button.refresh(this, button);
233
+ }
234
+ },
235
+ });
236
+ });
237
+ });
238
+ }
239
+ _createOptions() {
240
+ const config = this._createConfig();
241
+ return merge(
242
+ // For some reason editor store somewhere pointer on default config object and dublicate options each time on init
243
+ // Extra merge level fixed this problem and allow to init config properly without legacy data
244
+ {}, {
245
+ shortcutsEnabled: ['show', 'bold', 'italic', 'underline', 'indent', 'outdent', 'undo', 'redo', 'insertImage', 'createLink'],
246
+ key: config.activationKey,
247
+ placeholderText: config.placeholder,
248
+ linkAlwaysBlank: true,
249
+ tabSpaces: 2,
250
+ typingTimer: 250,
251
+ tooltips: false,
252
+ wordPasteModal: false,
253
+ imageDefaultWidth: 0,
254
+ imageDefaultAlign: 'left',
255
+ quickInsertEnabled: false,
256
+ scrollableContainer: `#${this.containerID}`,
257
+ paragraphDefaultSelection: 'Format',
258
+ videoUpload: false,
259
+ imagePaste: !!config.image?.upload,
260
+ imageUpload: !!config.image?.upload,
261
+ paragraphFormat: {
262
+ N: 'Normal',
263
+ H1: 'Heading 1',
264
+ H2: 'Heading 2',
265
+ H3: 'Heading 3',
266
+ H4: 'Heading 4',
267
+ BLOCKQUOTE: 'Quote',
268
+ },
269
+ lineHeights: {
270
+ Default: '',
271
+ 0.5: '0.5',
272
+ Single: '1',
273
+ 1.15: '1.15',
274
+ 1.5: '1.5',
275
+ Double: '2',
276
+ },
277
+ paragraphFormatSelection: true,
278
+ toolbarButtonsXS: {
279
+ moreText: {
280
+ buttons: TextButtons,
281
+ buttonsVisible: 1,
282
+ },
283
+ moreParagraph: {
284
+ buttons: ParagraphButtons,
285
+ buttonsVisible: 2,
286
+ },
287
+ moreRich: {
288
+ buttons: RichButtons,
289
+ buttonsVisible: 0,
290
+ },
291
+ },
292
+ toolbarButtons: {
293
+ moreText: {
294
+ buttons: TextButtons,
295
+ buttonsVisible: 3,
296
+ },
297
+ moreParagraph: {
298
+ buttons: ParagraphButtons,
299
+ buttonsVisible: 5,
300
+ },
301
+ moreRich: {
302
+ buttons: RichButtons,
303
+ buttonsVisible: 3,
304
+ },
305
+ },
306
+ }, config.froalaConfig);
307
+ }
308
+ _listenLazyInit() {
309
+ // must be there to cleanup https://github.com/microsoft/monaco-editor/issues/827
310
+ // to prevent conflicts with text-editor
311
+ this._window.define = null;
312
+ this.froalaLoaded$
313
+ .pipe(filter((ready) => ready), switchMap(() => this._initialize$), tap(() => {
314
+ const selection = window.getSelection();
315
+ const options = {};
316
+ if (selection.baseNode) {
317
+ options.selection = {
318
+ node: selection.baseNode.nodeValue,
319
+ offset: selection.baseOffset,
320
+ };
321
+ }
322
+ this.initialize(options);
323
+ }), switchMap(() => this._froalaReady$), filter((data) => !!data), tap(({ config, options }) => {
324
+ this._setupFroala(config, options);
325
+ }))
326
+ .subscribe();
327
+ }
328
+ _contentChanged() {
329
+ const editorHTML = this._editor.html.get();
330
+ if (this.html !== editorHTML) {
331
+ this._change(editorHTML);
332
+ }
333
+ }
334
+ _setupFroala(config, options) {
335
+ this._cdRef.markForCheck();
336
+ this.setHtml(this._html);
337
+ if (config.disabled) {
338
+ this.disable();
339
+ }
340
+ if (config.froalaConfig.events) {
341
+ if (config.froalaConfig.events.initialized) {
342
+ config.froalaConfig.events.initialized();
343
+ }
344
+ }
345
+ this._editor.events.on('focus', () => {
346
+ this.classFocused = true;
347
+ this._cdRef.markForCheck();
348
+ });
349
+ this._editor.events.on('blur', () => {
350
+ this.classFocused = false;
351
+ this._cdRef.markForCheck();
352
+ });
353
+ this._editor.events.on('click', () => {
354
+ if (this.config.initOnClick && !this.initialized) {
355
+ this.initialized = true;
356
+ this._cdRef.markForCheck();
357
+ }
358
+ });
359
+ fromEventPattern((handler) => {
360
+ this._editor.events.on('contentChanged', handler);
361
+ }, () => { })
362
+ .pipe(startWith(this._html), map(() => this.editor.html.get()), distinctUntilChanged(), skip(1))
363
+ .subscribe(() => {
364
+ this._contentChanged();
365
+ });
366
+ this._editor.events.on('paste.afterCleanup', (html) => {
367
+ const div = document.createElement('div');
368
+ div.innerHTML = html;
369
+ div.querySelectorAll('*')
370
+ .forEach((el) => {
371
+ for (let i = 0; i < el.attributes.length; i++) {
372
+ const name = el.attributes[0].name;
373
+ if (name !== 'href') {
374
+ el.removeAttribute(name);
375
+ }
376
+ }
377
+ });
378
+ return div.innerHTML;
379
+ });
380
+ this._editor.events.on('keydown', () => {
381
+ this.onTouched();
382
+ });
383
+ if (this.config.image && this.config.image.upload) {
384
+ this._editor.events.on('image.beforePasteUpload', (image) => {
385
+ fetch(image.getAttribute('src'))
386
+ .then((res) => {
387
+ res.blob()
388
+ .then((blob) => {
389
+ this._processImageUpload(blob)
390
+ .pipe(takeUntil(this._destroy$))
391
+ .subscribe((url) => {
392
+ image.setAttribute('src', url);
393
+ image.removeAttribute('data-fr-image-pasted');
394
+ this._contentChanged();
395
+ });
396
+ });
397
+ });
398
+ return false;
399
+ });
400
+ this._editor.events.on('image.beforeUpload', (blobs) => {
401
+ this._processImageUpload(blobs[0])
402
+ .pipe(takeUntil(this._destroy$))
403
+ .subscribe((url) => {
404
+ this.editor.image.insert(url, null, null, this.editor.image.get());
405
+ });
406
+ return false;
407
+ });
408
+ }
409
+ if (this.el.querySelector('.fr-second-toolbar')) {
410
+ this.el.querySelector('.fr-second-toolbar').remove();
411
+ }
412
+ if (this.config.autofocus && !this.config.initOnClick) {
413
+ this.focus();
414
+ }
415
+ }
416
+ }
417
+ FsHtmlEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FsHtmlEditorComponent, deps: [{ token: FS_HTML_EDITOR_CONFIG, optional: true }, { token: DOCUMENT }, { token: i0.ChangeDetectorRef }, { token: i1.FsFroalaLoaderService }], target: i0.ɵɵFactoryTarget.Component });
418
+ FsHtmlEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FsHtmlEditorComponent, selector: "fs-html-editor", inputs: { config: "config", hint: "hint", disabled: "disabled" }, host: { properties: { "class.focused": "this.classFocused", "class.disabled": "this.disabled" } }, providers: [
419
+ {
420
+ provide: NG_VALUE_ACCESSOR,
421
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
422
+ multi: true,
423
+ },
424
+ {
425
+ provide: NG_VALIDATORS,
426
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
427
+ multi: true,
428
+ },
429
+ ], viewQueries: [{ propertyName: "elRef", first: true, predicate: ["elRef"], descendants: true }], ngImport: i0, template: "<fs-label-field>\n <fs-label *ngIf=\"config.label\">{{config.label}}</fs-label>\n <div\n class=\"html-editor-container fs-html-editor-default\"\n [id]=\"containerID\"\n [ngClass]=\"{\n initialized: initialized,\n 'init-on-click': config.initOnClick\n }\">\n <ng-container *fsSkeleton=\"(froalaLoaded$ | async) !== false\"></ng-container>\n <div #elRef></div>\n\n <div class=\"bottom-line\"></div>\n <div class=\"disabled-line\"></div>\n </div>\n\n <fs-label-message>\n <div class=\"fs-form-message\">\n <div class=\"fs-form-hint\">{{hint}}</div>\n </div>\n </fs-label-message>\n</fs-label-field>\n", styles: [":host ::ng-deep .fr-box.fr-basic .fr-wrapper{border:0;border-bottom:1px solid #949494;margin-bottom:1px;background-color:transparent}:host ::ng-deep .fr-box.fr-basic .fr-element{padding:0;font-family:inherit;color:inherit;font-size:inherit;line-height:inherit;min-height:auto}:host ::ng-deep .fr-more-toolbar,:host ::ng-deep .fr-toolbar,:host ::ng-deep .fr-dropdown:after,:host ::ng-deep .fr-dropdown-menu .fr-dropdown-wrapper{transition:none!important}:host ::ng-deep .fr-toolbar-open .fr-more-toolbar{display:block}:host ::ng-deep .fr-more-toolbar{display:none}:host ::ng-deep .fr-toolbar.fr-top{position:sticky;z-index:2;border-radius:0;background-color:#fff}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp{margin:0 20px 0 0}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(1):after,:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(2):after{content:\"\";position:absolute;top:9px;height:30px;border-left:1px solid #e5e5e5;margin-left:10px}:host ::ng-deep .fr-toolbar.fr-top div:first-of-type:before{border:none}:host ::ng-deep .fr-toolbar.fr-top.fr-toolbar-open .fr-newline{height:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:first-child{margin-left:0}:host ::ng-deep .fr-toolbar.fr-top.fr-top{border:0}:host ::ng-deep .fr-toolbar.fr-top .fr-newline{margin:0}:host ::ng-deep .fr-toolbar.fr-top .fr-more-toolbar{z-index:auto;display:flex;justify-content:center;padding-left:0!important}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown:after{right:3px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown.fr-selection span{margin-right:24px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-open{border-radius:4px;margin:4px 2px}:host ::ng-deep .fr-view ol,:host ::ng-deep .fr-view ul{list-style-position:unset}:host ::ng-deep .html-editor-container.init-on-click:not(.initialized) .fr-toolbar{display:none}:host.disabled ::ng-deep .fr-box.fr-basic{opacity:.5;pointer-events:none}:host.disabled ::ng-deep .fr-box.fr-basic .fr-wrapper{border:none}:host.disabled ::ng-deep .disabled-line{display:block}::ng-deep .fr-popup{z-index:1001!important}::ng-deep .fr-video-by-url-layer .fr-checkbox-line{display:none}.disabled-line{display:none;position:absolute;bottom:-1px;z-index:1;background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x;height:1px;width:100%}.bottom-line{opacity:0;transform-origin:50%;transform:scaleX(.5);transition:background-color .3s cubic-bezier(.55,0,.55,.2);width:100%;border-bottom:2px solid #949494;position:absolute;bottom:-1px;z-index:1}:host{position:relative;display:block}:host.focused .bottom-line{opacity:1;display:block;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}::ng-deep .fs-html-editor-mention-container{position:absolute;top:0;left:0;height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:999999;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-bottom-left-radius:4px;border-bottom-right-radius:4px;background:#fff}::ng-deep .fs-html-editor-mention-container ul{margin:0;padding:0;list-style:none}::ng-deep .fs-html-editor-mention-container li{padding:0 16px;cursor:pointer;line-height:48px}::ng-deep .fs-html-editor-mention-container li.highlight,::ng-deep .fs-html-editor-mention-container li:hover{background:#F5F5F5}::ng-deep .fs-html-editor-mention-container li.no-match{cursor:default}\n"], components: [{ type: i2.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { type: i2.FsLabelComponent, selector: "fs-label" }, { type: i2.FsLabelMessageComponent, selector: "fs-label-message" }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }], pipes: { "async": i3.AsyncPipe }, viewProviders: [
430
+ {
431
+ provide: ControlContainer,
432
+ deps: [[Optional, NgForm]],
433
+ useFactory: (ngForm) => ngForm,
434
+ },
435
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FsHtmlEditorComponent, decorators: [{
437
+ type: Component,
438
+ args: [{ selector: 'fs-html-editor', providers: [
439
+ {
440
+ provide: NG_VALUE_ACCESSOR,
441
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
442
+ multi: true,
443
+ },
444
+ {
445
+ provide: NG_VALIDATORS,
446
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
447
+ multi: true,
448
+ },
449
+ ], changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [
450
+ {
451
+ provide: ControlContainer,
452
+ deps: [[Optional, NgForm]],
453
+ useFactory: (ngForm) => ngForm,
454
+ },
455
+ ], template: "<fs-label-field>\n <fs-label *ngIf=\"config.label\">{{config.label}}</fs-label>\n <div\n class=\"html-editor-container fs-html-editor-default\"\n [id]=\"containerID\"\n [ngClass]=\"{\n initialized: initialized,\n 'init-on-click': config.initOnClick\n }\">\n <ng-container *fsSkeleton=\"(froalaLoaded$ | async) !== false\"></ng-container>\n <div #elRef></div>\n\n <div class=\"bottom-line\"></div>\n <div class=\"disabled-line\"></div>\n </div>\n\n <fs-label-message>\n <div class=\"fs-form-message\">\n <div class=\"fs-form-hint\">{{hint}}</div>\n </div>\n </fs-label-message>\n</fs-label-field>\n", styles: [":host ::ng-deep .fr-box.fr-basic .fr-wrapper{border:0;border-bottom:1px solid #949494;margin-bottom:1px;background-color:transparent}:host ::ng-deep .fr-box.fr-basic .fr-element{padding:0;font-family:inherit;color:inherit;font-size:inherit;line-height:inherit;min-height:auto}:host ::ng-deep .fr-more-toolbar,:host ::ng-deep .fr-toolbar,:host ::ng-deep .fr-dropdown:after,:host ::ng-deep .fr-dropdown-menu .fr-dropdown-wrapper{transition:none!important}:host ::ng-deep .fr-toolbar-open .fr-more-toolbar{display:block}:host ::ng-deep .fr-more-toolbar{display:none}:host ::ng-deep .fr-toolbar.fr-top{position:sticky;z-index:2;border-radius:0;background-color:#fff}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp{margin:0 20px 0 0}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(1):after,:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(2):after{content:\"\";position:absolute;top:9px;height:30px;border-left:1px solid #e5e5e5;margin-left:10px}:host ::ng-deep .fr-toolbar.fr-top div:first-of-type:before{border:none}:host ::ng-deep .fr-toolbar.fr-top.fr-toolbar-open .fr-newline{height:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:first-child{margin-left:0}:host ::ng-deep .fr-toolbar.fr-top.fr-top{border:0}:host ::ng-deep .fr-toolbar.fr-top .fr-newline{margin:0}:host ::ng-deep .fr-toolbar.fr-top .fr-more-toolbar{z-index:auto;display:flex;justify-content:center;padding-left:0!important}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown:after{right:3px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown.fr-selection span{margin-right:24px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-open{border-radius:4px;margin:4px 2px}:host ::ng-deep .fr-view ol,:host ::ng-deep .fr-view ul{list-style-position:unset}:host ::ng-deep .html-editor-container.init-on-click:not(.initialized) .fr-toolbar{display:none}:host.disabled ::ng-deep .fr-box.fr-basic{opacity:.5;pointer-events:none}:host.disabled ::ng-deep .fr-box.fr-basic .fr-wrapper{border:none}:host.disabled ::ng-deep .disabled-line{display:block}::ng-deep .fr-popup{z-index:1001!important}::ng-deep .fr-video-by-url-layer .fr-checkbox-line{display:none}.disabled-line{display:none;position:absolute;bottom:-1px;z-index:1;background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x;height:1px;width:100%}.bottom-line{opacity:0;transform-origin:50%;transform:scaleX(.5);transition:background-color .3s cubic-bezier(.55,0,.55,.2);width:100%;border-bottom:2px solid #949494;position:absolute;bottom:-1px;z-index:1}:host{position:relative;display:block}:host.focused .bottom-line{opacity:1;display:block;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}::ng-deep .fs-html-editor-mention-container{position:absolute;top:0;left:0;height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:999999;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-bottom-left-radius:4px;border-bottom-right-radius:4px;background:#fff}::ng-deep .fs-html-editor-mention-container ul{margin:0;padding:0;list-style:none}::ng-deep .fs-html-editor-mention-container li{padding:0 16px;cursor:pointer;line-height:48px}::ng-deep .fs-html-editor-mention-container li.highlight,::ng-deep .fs-html-editor-mention-container li:hover{background:#F5F5F5}::ng-deep .fs-html-editor-mention-container li.no-match{cursor:default}\n"] }]
456
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
457
+ type: Optional
458
+ }, {
459
+ type: Inject,
460
+ args: [FS_HTML_EDITOR_CONFIG]
461
+ }] }, { type: Document, decorators: [{
462
+ type: Inject,
463
+ args: [DOCUMENT]
464
+ }] }, { type: i0.ChangeDetectorRef }, { type: i1.FsFroalaLoaderService }]; }, propDecorators: { classFocused: [{
465
+ type: HostBinding,
466
+ args: ['class.focused']
467
+ }], elRef: [{
468
+ type: ViewChild,
469
+ args: ['elRef']
470
+ }], config: [{
471
+ type: Input
472
+ }], hint: [{
473
+ type: Input
474
+ }], disabled: [{
475
+ type: Input
476
+ }, {
477
+ type: HostBinding,
478
+ args: ['class.disabled']
479
+ }] } });
480
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2h0bWwtZWRpdG9yL2NvbXBvbmVudHMvaHRtbC1lZGl0b3IvaHRtbC1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2h0bWwtZWRpdG9yL2NvbXBvbmVudHMvaHRtbC1lZGl0b3IvaHRtbC1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsZ0JBQWdCLEVBRWhCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsTUFBTSxHQUdQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUU5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9HLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFFLHFC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Q0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU07eUJBQ3ZDO3FCQUNGOzswQkEwQkUsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxxQkFBcUI7OEJBR1YsUUFBUTswQkFEMUIsTUFBTTsyQkFBQyxRQUFRO2dIQXpCbUIsWUFBWTtzQkFBaEQsV0FBVzt1QkFBQyxlQUFlO2dCQUVELEtBQUs7c0JBQS9CLFNBQVM7dUJBQUMsT0FBTztnQkFFRixNQUFNO3NCQUFyQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBSUMsUUFBUTtzQkFGZCxLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sQ29udGFpbmVyLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nRm9ybSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IGd1aWQgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRmlsZVByb2Nlc3NvciwgRnNGaWxlLCBGc0ZpbGVQcm9jZXNzQ29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50UGF0dGVybiwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBza2lwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRlNfSFRNTF9FRElUT1JfQ09ORklHIH0gZnJvbSAnLi4vLi4vaW5qZWN0cy9jb25maWcuaW5qZWN0JztcbmltcG9ydCB7IEZzSHRtbEVkaXRvckNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaHRtbC1lZGl0b3ItY29uZmlnJztcbmltcG9ydCB7IEZzRnJvYWxhTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zyb2FsYS1sb2FkZXIuc2VydmljZSc7XG5cbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJy4vLi4vLi4vY2xhc3Nlcy9wbHVnaW4nO1xuaW1wb3J0IHsgUGFyYWdyYXBoQnV0dG9ucyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL3BhcmFncmFwaC1idXR0b25zLmNvbnN0JztcbmltcG9ydCB7IFJpY2hCdXR0b25zIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvcmljaC1idXR0b25zLmNvbnN0JztcbmltcG9ydCB7IFRleHRCdXR0b25zIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvdGV4dC1idXR0b25zLmNvbnN0JztcbmltcG9ydCB7IFBsdWdpbkJ1dHRvbiB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9wbHVnaW4tYnV0dG9uJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1odG1sLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9odG1sLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2h0bWwtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnNIdG1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZzSHRtbEVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdmlld1Byb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsXG4gICAgICBkZXBzOiBbW09wdGlvbmFsLCBOZ0Zvcm1dXSxcbiAgICAgIHVzZUZhY3Rvcnk6IChuZ0Zvcm06IE5nRm9ybSkgPT4gbmdGb3JtLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZzSHRtbEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvY3VzZWQnKSBwdWJsaWMgY2xhc3NGb2N1c2VkID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZWxSZWYnKSBwdWJsaWMgZWxSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbmZpZzogRnNIdG1sRWRpdG9yQ29uZmlnID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBoaW50OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kaXNhYmxlZCcpXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBwdWJsaWMgcmVhZG9ubHkgY29udGFpbmVySUQgPSBgZnMtaHRtbC1lZGl0b3ItJHtndWlkKCd4eHgnKX1gO1xuXG4gIHByaXZhdGUgX2VkaXRvcjogYW55O1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmc7XG4gIHByaXZhdGUgX2luaXRpYWxpemUkID0gbmV3IFJlcGxheVN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfZnJvYWxhUmVhZHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgcHJpdmF0ZSBfd2luZG93OiBhbnkgPSB0aGlzLl9kb2N1bWVudC5kZWZhdWx0VmlldztcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChGU19IVE1MX0VESVRPUl9DT05GSUcpXG4gICAgcHJpdmF0ZSBfZGVmYXVsdENvbmZpZyxcbiAgICBASW5qZWN0KERPQ1VNRU5UKVxuICAgIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfZnI6IEZzRnJvYWxhTG9hZGVyU2VydmljZSxcbiAgKSB7IH1cblxuICBwdWJsaWMgb25DaGFuZ2UgPSAoZGF0YTogYW55KSA9PiB7IH07XG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKSA9PiB7IH07XG5cbiAgcHVibGljIGdldCBlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnJvYWxhTG9hZGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZnIubG9hZGVkJDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHt9O1xuICAgIHRoaXMuY29uZmlnLmF1dG9mb2N1cyA9IHRoaXMuY29uZmlnLmF1dG9mb2N1cyAmJiAoIXRoaXMuY29uZmlnLmRpc2FibGVkIHx8ICF0aGlzLmRpc2FibGVkKTtcbiAgICB0aGlzLl9saXN0ZW5MYXp5SW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgaGFzQ29udGVudCgpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaWYgKGVsLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBlbC5pbm5lckhUTUwgPSB0aGlzLl9odG1sO1xuXG4gICAgcmV0dXJuICEhZWwuaW5uZXJUZXh0Lmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplKG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5fY3JlYXRlQ29uZmlnKCk7XG4gICAgdGhpcy5faW5pdFBsdWdpbnMoY29uZmlnKTtcbiAgICB0aGlzLl9pbml0QnV0dG9ucyhjb25maWcpO1xuICAgIHRoaXMuX2VkaXRvciA9IG5ldyB0aGlzLl9mci5Gcm9hbGFFZGl0b3IodGhpcy5lbCwgdGhpcy5fY3JlYXRlT3B0aW9ucygpLCAoKSA9PiB7XG4gICAgICB0aGlzLl9mcm9hbGFSZWFkeSQubmV4dCh7IGNvbmZpZywgb3B0aW9ucyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVTaXplKCkge1xuICAgIC8vIEhhY2s6IFRvIHRyaWdnZXIgdGhlIHRvb2xiYXIgYnV0dG9uIHNpemUgbW9kZXNcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3Jlc2l6ZScpKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5jb25maWcubWF4TGVuZ3RoICYmIHRoaXMuX2h0bWwpIHtcbiAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMuY29uZmlnLm1heExlbmd0aDtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX2h0bWwubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBlcnIubWF4TGVuZ3RoRXJyb3IgPSBgTXVzdCBiZSAke21heExlbmd0aH0gY2hhcmFjdGVycyBvciBmZXdlci4gWW91IGVudGVyZWQgJHtsZW5ndGh9IGNoYXJhY3RlcnMuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPyBlcnIgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGZvY3VzKG9wdGlvbnM/OiB7IGN1cnNvclBvc2l0aW9uPzogJ3N0YXJ0JyB8ICdlbmQnIH0pIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IG9wdGlvbnMgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmN1cnNvclBvc2l0aW9uID09PSAnZW5kJykge1xuICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnNldEF0RW5kKHRoaXMuZWRpdG9yLiRlbC5nZXQoMCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24uc2V0QXRTdGFydCh0aGlzLmVkaXRvci4kZWwuZ2V0KDApKTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24ucmVzdG9yZSgpO1xuXG4gICAgY29uc3QgZWxTZWxlY3Rpb24gPSB0aGlzLmVkaXRvci5zZWxlY3Rpb24uZWxlbWVudCgpO1xuICAgIGlmIChlbFNlbGVjdGlvbikge1xuICAgICAgZWxTZWxlY3Rpb24uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIdG1sKGh0bWwpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUoaHRtbCk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sID0gaHRtbCB8fCAnJztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2h0bWwpKSB7XG4gICAgICB0aGlzLl9odG1sID0gdGhpcy5faHRtbC5wb3AoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9odG1sID0gdGhpcy5faHRtbFxuICAgICAgLnJlcGxhY2UoLzwobGkpPlxccz88KGRpdik+L2csICc8bGk+JylcbiAgICAgIC5yZXBsYWNlKC88XFwvKGRpdik+PFxcLyhsaSk+L2csICc8L2xpPicpO1xuXG4gICAgaWYgKHRoaXMuZWRpdG9yICYmIHRoaXMuZWRpdG9yLmh0bWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLmh0bWwuc2V0KHRoaXMuX2h0bWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2luaXRpYWxpemUkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5lbC5pbm5lckhUTUwgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NJbWFnZVVwbG9hZChibG9iKSB7XG4gICAgY29uc3QgcHJvY2Vzc29yID0gbmV3IEZpbGVQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBmaWxlID0gbmV3IEZzRmlsZShibG9iKTtcblxuICAgIGNvbnN0IGNvbmZpZzogRnNGaWxlUHJvY2Vzc0NvbmZpZyA9IHtcbiAgICAgIG9yaWVudGF0ZTogdHJ1ZSxcbiAgICAgIHF1YWxpdHk6IHRoaXMuY29uZmlnLmltYWdlLnF1YWxpdHksXG4gICAgICBmb3JtYXQ6IHRoaXMuY29uZmlnLmltYWdlLmZvcm1hdCBhcyBhbnksXG4gICAgICBtYXhXaWR0aDogdGhpcy5jb25maWcuaW1hZ2Uud2lkdGgsXG4gICAgICBtYXhIZWlnaHQ6IHRoaXMuY29uZmlnLmltYWdlLmhlaWdodCxcbiAgICAgIG1pbldpZHRoOiB0aGlzLmNvbmZpZy5pbWFnZS5taW5XaWR0aCxcbiAgICAgIG1pbkhlaWdodDogdGhpcy5jb25maWcuaW1hZ2UubWluSGVpZ2h0LFxuICAgIH07XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yLnByb2Nlc3NGaWxlKGZpbGUsIGNvbmZpZylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGZzRmlsZTogRnNGaWxlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmltYWdlLnVwbG9hZChmc0ZpbGUuZmlsZSk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUNvbmZpZygpOiBGc0h0bWxFZGl0b3JDb25maWcge1xuICAgIHJldHVybiBtZXJnZSh7IGZyb2FsYUNvbmZpZzoge30gfSwgdGhpcy5fZGVmYXVsdENvbmZpZywgdGhpcy5jb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlKGh0bWwpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICB0aGlzLm9uQ2hhbmdlKGh0bWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEJ1dHRvbnMoY29uZmlnOiBGc0h0bWxFZGl0b3JDb25maWcpIHtcbiAgICAoY29uZmlnLmJ1dHRvbnMgfHwgW10pXG4gICAgICAuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAgU3ZnIEtleXM6XG4gICAgICAgICAgW1wiYWRkXCIsIFwiYWR2YW5jZWRJbWFnZUVkaXRvclwiLCBcImFsaWduQ2VudGVyXCIsIFwiYWxpZ25KdXN0aWZ5XCIsIFwiYWxpZ25MZWZ0XCIsIFwiYWxpZ25SaWdodFwiLFxuICAgICAgICAgIFwiYW5jaG9yc1wiLCBcImJhY2tcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCJibG9ja3F1b3RlXCIsIFwiYm9sZFwiLCBcImNlbGxCYWNrZ3JvdW5kXCIsXG4gICAgICAgICAgXCJjZWxsQm9yZGVyQ29sb3JcIiwgXCJjZWxsT3B0aW9uc1wiLCBcImNlbGxTdHlsZVwiLCBcImNsZWFyRm9ybWF0dGluZ1wiLCBcImNsb3NlXCIsIFwiY29kZVZpZXdcIixcbiAgICAgICAgICBcImNvZ3NcIiwgXCJjb2x1bW5zXCIsIFwiZWRpdExpbmtcIiwgXCJleGl0RnVsbHNjcmVlblwiLCBcImZvbnRBd2Vzb21lXCIsIFwiZm9udEZhbWlseVwiLFxuICAgICAgICAgIFwiZm9udFNpemVcIiwgXCJmdWxsc2NyZWVuXCIsIFwiaGVscFwiLCBcImhvcml6b250YWxMaW5lXCIsIFwiaW1hZ2VBbHRUZXh0XCIsIFwiaW1hZ2VDYXB0aW9uXCIsXG4gICAgICAgICAgXCJpbWFnZUNsYXNzXCIsIFwiaW1hZ2VEaXNwbGF5XCIsIFwiaW1hZ2VNYW5hZ2VyXCIsIFwiaW1hZ2VTaXplXCIsIFwiaW5kZW50XCIsIFwiaW5saW5lQ2xhc3NcIixcbiAgICAgICAgICBcImlubGluZVN0eWxlXCIsIFwiaW5zZXJ0RW1iZWRcIiwgXCJpbnNlcnRGaWxlXCIsIFwiaW5zZXJ0SW1hZ2VcIiwgXCJpbnNlcnRMaW5rXCIsIFwiaW5zZXJ0TW9yZVwiLFxuICAgICAgICAgIFwiaW5zZXJ0VGFibGVcIiwgXCJpbnNlcnRWaWRlb1wiLCBcInVwbG9hZFwiLCBcIml0YWxpY1wiLCBcInNlYXJjaFwiLCBcImxpbmVIZWlnaHRcIiwgXCJsaW5rU3R5bGVzXCIsXG4gICAgICAgICAgXCJtZW50aW9uXCIsIFwibW9yZVwiLCBcIm9wZW5MaW5rXCIsIFwib3JkZXJlZExpc3RcIiwgXCJvdXRkZW50XCIsIFwicGFnZUJyZWFrZXJcIixcbiAgICAgICAgICBcInBhcmFncmFwaEZvcm1hdFwiLCBcInBhcmFncmFwaE1vcmVcIiwgXCJwYXJhZ3JhcGhTdHlsZVwiLCBcInBkZkV4cG9ydFwiLCBcInByaW50XCIsXG4gICAgICAgICAgXCJyZWRvXCIsIFwicmVtb3ZlVGFibGVcIiwgXCJyZW1vdmVcIiwgXCJyZXBsYWNlSW1hZ2VcIiwgXCJyb3dcIiwgXCJzZWxlY3RBbGxcIiwgXCJzbWlsZVwiLFxuICAgICAgICAgIFwic3BlbGxjaGVja1wiLCBcInN0YXJcIiwgXCJzdHJpa2VUaHJvdWdoXCIsIFwic3Vic2NyaXB0XCIsIFwic3VwZXJzY3JpcHRcIiwgXCJzeW1ib2xzXCIsIFwidGFnc1wiLFxuICAgICAgICAgIFwidGFibGVIZWFkZXJcIiwgXCJ0YWJsZVN0eWxlXCIsIFwidGV4dENvbG9yXCIsIFwidGV4dE1vcmVcIiwgXCJ1bmRlcmxpbmVcIiwgXCJ1bmRvXCIsIFwidW5saW5rXCIsXG4gICAgICAgICAgXCJ1bm9yZGVyZWRMaXN0XCIsIFwidmVydGljYWxBbGlnbkJvdHRvbVwiLCBcInZlcnRpY2FsQWxpZ25NaWRkbGVcIiwgXCJ2ZXJ0aWNhbEFsaWduVG9wXCJdXG4gICAgICAgICovXG5cbiAgICAgICAgaWYgKGJ1dHRvbi5zdmdLZXkpIHtcbiAgICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuRGVmaW5lSWNvbihidXR0b24ubmFtZSwgeyBTVkdfS0VZOiBidXR0b24uc3ZnS2V5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnIuRnJvYWxhRWRpdG9yLlJlZ2lzdGVyQ29tbWFuZChidXR0b24ubmFtZSwge1xuICAgICAgICAgIHRpdGxlOiBidXR0b24udGl0bGUsXG4gICAgICAgICAgZm9jdXM6IGJ1dHRvbi5mb2N1cyA/PyB0cnVlLFxuICAgICAgICAgIHVuZG86IGJ1dHRvbi51bmRvID8/IHRydWUsXG4gICAgICAgICAgcmVmcmVzaEFmdGVyQ2FsbGJhY2s6IGJ1dHRvbi5yZWZyZXNoQWZ0ZXJDYWxsYmFjayA/PyB0cnVlLFxuICAgICAgICAgIGNhbGxiYWNrKCkge1xuICAgICAgICAgICAgYnV0dG9uLmNsaWNrKHRoaXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0UGx1Z2lucyhjb25maWcpIHtcbiAgICAoY29uZmlnLnBsdWdpbnMgfHwgW10pLmZvckVhY2goKHBsdWdpbjogUGx1Z2luKSA9PiB7XG4gICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuUExVR0lOU1twbHVnaW4uY29uZmlnLm5hbWVdID0gZnVuY3Rpb24gKGVkaXRvcikge1xuICAgICAgICBwbHVnaW4uZWRpdG9yID0gZWRpdG9yO1xuICAgICAgICBwbHVnaW4uaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgIHJldHVybiBwbHVnaW47XG4gICAgICB9O1xuXG4gICAgICAocGx1Z2luLmNvbmZpZy5idXR0b25zIHx8IFtdKS5mb3JFYWNoKChidXR0b246IFBsdWdpbkJ1dHRvbikgPT4ge1xuICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuRGVmaW5lSWNvbihidXR0b24ubmFtZSwge1xuICAgICAgICAgIE5BTUU6IGJ1dHRvbi5uYW1lLFxuICAgICAgICAgIFBBVEg6IGJ1dHRvbi5zdmdQYXRoLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuUmVnaXN0ZXJDb21tYW5kKGJ1dHRvbi5uYW1lLCB7XG4gICAgICAgICAgaWNvbjogYnV0dG9uLm5hbWUsXG4gICAgICAgICAgdGl0bGU6IGJ1dHRvbi50b29sdGlwLFxuICAgICAgICAgIHVuZG86IGJ1dHRvbi51bmRvLFxuICAgICAgICAgIGZvY3VzOiBidXR0b24uZm9jdXMsXG4gICAgICAgICAgc2hvd09uTW9iaWxlOiBidXR0b24uc2hvd09uTW9iaWxlLFxuICAgICAgICAgIHJlZnJlc2hBZnRlckNhbGxiYWNrOiBidXR0b24ucmVmcmVzaEFmdGVyQ2FsbGJhY2ssXG4gICAgICAgICAgY2FsbGJhY2soKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLmNsaWNrKSB7XG4gICAgICAgICAgICAgIGJ1dHRvbi5jbGljayh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlZnJlc2goYnV0dG9uKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLnJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgYnV0dG9uLnJlZnJlc2godGhpcywgYnV0dG9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVPcHRpb25zKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NyZWF0ZUNvbmZpZygpO1xuXG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIGVkaXRvciBzdG9yZSBzb21ld2hlcmUgcG9pbnRlciBvbiBkZWZhdWx0IGNvbmZpZyBvYmplY3QgYW5kIGR1YmxpY2F0ZSBvcHRpb25zIGVhY2ggdGltZSBvbiBpbml0XG4gICAgICAvLyBFeHRyYSBtZXJnZSBsZXZlbCBmaXhlZCB0aGlzIHByb2JsZW0gYW5kIGFsbG93IHRvIGluaXQgY29uZmlnIHByb3Blcmx5IHdpdGhvdXQgbGVnYWN5IGRhdGFcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBzaG9ydGN1dHNFbmFibGVkOiBbJ3Nob3cnLCAnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ2luZGVudCcsICdvdXRkZW50JywgJ3VuZG8nLCAncmVkbycsICdpbnNlcnRJbWFnZScsICdjcmVhdGVMaW5rJ10sXG4gICAgICAgIGtleTogY29uZmlnLmFjdGl2YXRpb25LZXksXG4gICAgICAgIHBsYWNlaG9sZGVyVGV4dDogY29uZmlnLnBsYWNlaG9sZGVyLFxuICAgICAgICBsaW5rQWx3YXlzQmxhbms6IHRydWUsXG4gICAgICAgIHRhYlNwYWNlczogMixcbiAgICAgICAgdHlwaW5nVGltZXI6IDI1MCxcbiAgICAgICAgdG9vbHRpcHM6IGZhbHNlLFxuICAgICAgICB3b3JkUGFzdGVNb2RhbDogZmFsc2UsXG4gICAgICAgIGltYWdlRGVmYXVsdFdpZHRoOiAwLFxuICAgICAgICBpbWFnZURlZmF1bHRBbGlnbjogJ2xlZnQnLFxuICAgICAgICBxdWlja0luc2VydEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBzY3JvbGxhYmxlQ29udGFpbmVyOiBgIyR7dGhpcy5jb250YWluZXJJRH1gLFxuICAgICAgICBwYXJhZ3JhcGhEZWZhdWx0U2VsZWN0aW9uOiAnRm9ybWF0JyxcbiAgICAgICAgdmlkZW9VcGxvYWQ6IGZhbHNlLFxuICAgICAgICBpbWFnZVBhc3RlOiAhIWNvbmZpZy5pbWFnZT8udXBsb2FkLFxuICAgICAgICBpbWFnZVVwbG9hZDogISFjb25maWcuaW1hZ2U/LnVwbG9hZCxcbiAgICAgICAgcGFyYWdyYXBoRm9ybWF0OiB7XG4gICAgICAgICAgTjogJ05vcm1hbCcsXG4gICAgICAgICAgSDE6ICdIZWFkaW5nIDEnLFxuICAgICAgICAgIEgyOiAnSGVhZGluZyAyJyxcbiAgICAgICAgICBIMzogJ0hlYWRpbmcgMycsXG4gICAgICAgICAgSDQ6ICdIZWFkaW5nIDQnLFxuICAgICAgICAgIEJMT0NLUVVPVEU6ICdRdW90ZScsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVIZWlnaHRzOiB7XG4gICAgICAgICAgRGVmYXVsdDogJycsXG4gICAgICAgICAgMC41OiAnMC41JyxcbiAgICAgICAgICBTaW5nbGU6ICcxJyxcbiAgICAgICAgICAxLjE1OiAnMS4xNScsXG4gICAgICAgICAgMS41OiAnMS41JyxcbiAgICAgICAgICBEb3VibGU6ICcyJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYWdyYXBoRm9ybWF0U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICB0b29sYmFyQnV0dG9uc1hTOiB7XG4gICAgICAgICAgbW9yZVRleHQ6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFRleHRCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUGFyYWdyYXBoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBQYXJhZ3JhcGhCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUmljaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUmljaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0b29sYmFyQnV0dG9uczoge1xuICAgICAgICAgIG1vcmVUZXh0OiB7XG4gICAgICAgICAgICBidXR0b25zOiBUZXh0QnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9yZVBhcmFncmFwaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUGFyYWdyYXBoQnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiA1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9yZVJpY2g6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFJpY2hCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maWcuZnJvYWxhQ29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5MYXp5SW5pdCgpIHtcbiAgICAvLyBtdXN0IGJlIHRoZXJlIHRvIGNsZWFudXAgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9tb25hY28tZWRpdG9yL2lzc3Vlcy84MjdcbiAgICAvLyB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIHRleHQtZWRpdG9yXG4gICAgdGhpcy5fd2luZG93LmRlZmluZSA9IG51bGw7XG5cbiAgICB0aGlzLmZyb2FsYUxvYWRlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHJlYWR5KSA9PiByZWFkeSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9pbml0aWFsaXplJCksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBhbnkgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5iYXNlTm9kZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgIG5vZGU6IHNlbGVjdGlvbi5iYXNlTm9kZS5ub2RlVmFsdWUsXG4gICAgICAgICAgICAgIG9mZnNldDogc2VsZWN0aW9uLmJhc2VPZmZzZXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgICAgIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fZnJvYWxhUmVhZHkkKSxcbiAgICAgICAgZmlsdGVyKChkYXRhKSA9PiAhIWRhdGEpLFxuICAgICAgICB0YXAoKHsgY29uZmlnLCBvcHRpb25zIH0pID0+IHtcbiAgICAgICAgICB0aGlzLl9zZXR1cEZyb2FsYShjb25maWcsIG9wdGlvbnMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRlbnRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvckhUTUwgPSB0aGlzLl9lZGl0b3IuaHRtbC5nZXQoKTtcblxuICAgIGlmICh0aGlzLmh0bWwgIT09IGVkaXRvckhUTUwpIHtcbiAgICAgIHRoaXMuX2NoYW5nZShlZGl0b3JIVE1MKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEZyb2FsYShjb25maWc6IEZzSHRtbEVkaXRvckNvbmZpZywgb3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLnNldEh0bWwodGhpcy5faHRtbCk7XG5cbiAgICBpZiAoY29uZmlnLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmZyb2FsYUNvbmZpZy5ldmVudHMpIHtcbiAgICAgIGlmIChjb25maWcuZnJvYWxhQ29uZmlnLmV2ZW50cy5pbml0aWFsaXplZCkge1xuICAgICAgICBjb25maWcuZnJvYWxhQ29uZmlnLmV2ZW50cy5pbml0aWFsaXplZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2ZvY3VzJywgKCkgPT4ge1xuICAgICAgdGhpcy5jbGFzc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdibHVyJywgKCkgPT4ge1xuICAgICAgdGhpcy5jbGFzc0ZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb25maWcuaW5pdE9uQ2xpY2sgJiYgIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnJvbUV2ZW50UGF0dGVybihcbiAgICAgIChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2NvbnRlbnRDaGFuZ2VkJywgaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgKCkgPT4geyB9LFxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBzdGFydFdpdGgodGhpcy5faHRtbCksXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLmVkaXRvci5odG1sLmdldCgpKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgc2tpcCgxKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jb250ZW50Q2hhbmdlZCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdwYXN0ZS5hZnRlckNsZWFudXAnLCAoaHRtbCkgPT4ge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCcqJylcbiAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZWwuYXR0cmlidXRlc1swXS5uYW1lO1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09ICdocmVmJykge1xuICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdrZXlkb3duJywgKCkgPT4ge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pbWFnZSAmJiB0aGlzLmNvbmZpZy5pbWFnZS51cGxvYWQpIHtcbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2ltYWdlLmJlZm9yZVBhc3RlVXBsb2FkJywgKGltYWdlKSA9PiB7XG5cbiAgICAgICAgZmV0Y2goaW1hZ2UuZ2V0QXR0cmlidXRlKCdzcmMnKSlcbiAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICByZXMuYmxvYigpXG4gICAgICAgICAgICAgIC50aGVuKChibG9iKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2IpXG4gICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHVybCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1mci1pbWFnZS1wYXN0ZWQnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50Q2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdpbWFnZS5iZWZvcmVVcGxvYWQnLCAoYmxvYnMpID0+IHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2JzWzBdKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgodXJsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5pbWFnZS5pbnNlcnQodXJsLCBudWxsLCBudWxsLCB0aGlzLmVkaXRvci5pbWFnZS5nZXQoKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZyLXNlY29uZC10b29sYmFyJykpIHtcbiAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZyLXNlY29uZC10b29sYmFyJykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLmF1dG9mb2N1cyAmJiAhdGhpcy5jb25maWcuaW5pdE9uQ2xpY2spIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxmcy1sYWJlbC1maWVsZD5cbiAgPGZzLWxhYmVsICpuZ0lmPVwiY29uZmlnLmxhYmVsXCI+e3tjb25maWcubGFiZWx9fTwvZnMtbGFiZWw+XG4gIDxkaXZcbiAgICAgIGNsYXNzPVwiaHRtbC1lZGl0b3ItY29udGFpbmVyIGZzLWh0bWwtZWRpdG9yLWRlZmF1bHRcIlxuICAgICAgW2lkXT1cImNvbnRhaW5lcklEXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgaW5pdGlhbGl6ZWQ6IGluaXRpYWxpemVkLFxuICAgICAgICAnaW5pdC1vbi1jbGljayc6IGNvbmZpZy5pbml0T25DbGlja1xuICAgICAgfVwiPlxuICAgIDxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCIoZnJvYWxhTG9hZGVkJCB8IGFzeW5jKSAhPT0gZmFsc2VcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2ICNlbFJlZj48L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJib3R0b20tbGluZVwiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkaXNhYmxlZC1saW5lXCI+PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxmcy1sYWJlbC1tZXNzYWdlPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmcy1mb3JtLWhpbnRcIj57e2hpbnR9fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2ZzLWxhYmVsLW1lc3NhZ2U+XG48L2ZzLWxhYmVsLWZpZWxkPlxuIl19