@kolkov/angular-editor 3.0.0-beta.1 → 3.0.0
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/CHANGELOG.md +57 -1
- package/README.md +75 -16
- package/assets/icons/icons.svg +2 -2
- package/fesm2022/kolkov-angular-editor.mjs +1360 -0
- package/fesm2022/kolkov-angular-editor.mjs.map +1 -0
- package/index.d.ts +412 -0
- package/package.json +10 -16
- package/themes/default.scss +22 -0
- package/esm2020/kolkov-angular-editor.mjs +0 -5
- package/esm2020/lib/ae-button/ae-button.component.mjs +0 -21
- package/esm2020/lib/ae-select/ae-select.component.mjs +0 -185
- package/esm2020/lib/ae-toolbar-set/ae-toolbar-set.component.mjs +0 -14
- package/esm2020/lib/angular-editor-toolbar.component.mjs +0 -365
- package/esm2020/lib/angular-editor.component.mjs +0 -415
- package/esm2020/lib/angular-editor.module.mjs +0 -27
- package/esm2020/lib/angular-editor.service.mjs +0 -275
- package/esm2020/lib/config.mjs +0 -36
- package/esm2020/lib/utils.mjs +0 -4
- package/esm2020/public-api.mjs +0 -11
- package/fesm2015/kolkov-angular-editor.mjs +0 -1324
- package/fesm2015/kolkov-angular-editor.mjs.map +0 -1
- package/fesm2020/kolkov-angular-editor.mjs +0 -1318
- package/fesm2020/kolkov-angular-editor.mjs.map +0 -1
- package/kolkov-angular-editor.d.ts +0 -5
- package/lib/ae-button/ae-button.component.d.ts +0 -7
- package/lib/ae-select/ae-select.component.d.ts +0 -46
- package/lib/ae-toolbar-set/ae-toolbar-set.component.d.ts +0 -6
- package/lib/angular-editor-toolbar.component.d.ts +0 -97
- package/lib/angular-editor.component.d.ts +0 -133
- package/lib/angular-editor.module.d.ts +0 -13
- package/lib/angular-editor.service.d.ts +0 -87
- package/lib/config.d.ts +0 -39
- package/lib/utils.d.ts +0 -1
- package/public-api.d.ts +0 -8
- package/src/lib/style.scss +0 -290
|
@@ -1,415 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { Attribute, Component, ContentChild, EventEmitter, forwardRef, HostBinding, HostListener, Inject, Input, Output, SecurityContext, ViewChild } from '@angular/core';
|
|
3
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
import { AngularEditorService } from './angular-editor.service';
|
|
5
|
-
import { angularEditorConfig } from './config';
|
|
6
|
-
import { isDefined } from './utils';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./angular-editor.service";
|
|
9
|
-
import * as i2 from "@angular/platform-browser";
|
|
10
|
-
import * as i3 from "./angular-editor-toolbar.component";
|
|
11
|
-
import * as i4 from "@angular/common";
|
|
12
|
-
export class AngularEditorComponent {
|
|
13
|
-
constructor(r, editorService, doc, sanitizer, cdRef, defaultTabIndex, autoFocus) {
|
|
14
|
-
this.r = r;
|
|
15
|
-
this.editorService = editorService;
|
|
16
|
-
this.doc = doc;
|
|
17
|
-
this.sanitizer = sanitizer;
|
|
18
|
-
this.cdRef = cdRef;
|
|
19
|
-
this.autoFocus = autoFocus;
|
|
20
|
-
this.modeVisual = true;
|
|
21
|
-
this.showPlaceholder = false;
|
|
22
|
-
this.disabled = false;
|
|
23
|
-
this.focused = false;
|
|
24
|
-
this.touched = false;
|
|
25
|
-
this.changed = false;
|
|
26
|
-
this.id = '';
|
|
27
|
-
this.config = angularEditorConfig;
|
|
28
|
-
this.placeholder = '';
|
|
29
|
-
this.executeCommandFn = this.executeCommand.bind(this);
|
|
30
|
-
this.viewMode = new EventEmitter();
|
|
31
|
-
/** emits `blur` event when focused out from the textarea */
|
|
32
|
-
// eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename
|
|
33
|
-
this.blurEvent = new EventEmitter();
|
|
34
|
-
/** emits `focus` event when focused in to the textarea */
|
|
35
|
-
// eslint-disable-next-line @angular-eslint/no-output-rename, @angular-eslint/no-output-native
|
|
36
|
-
this.focusEvent = new EventEmitter();
|
|
37
|
-
this.tabindex = -1;
|
|
38
|
-
const parsedTabIndex = Number(defaultTabIndex);
|
|
39
|
-
this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;
|
|
40
|
-
}
|
|
41
|
-
onFocus() {
|
|
42
|
-
this.focus();
|
|
43
|
-
}
|
|
44
|
-
ngOnInit() {
|
|
45
|
-
this.config.toolbarPosition = this.config.toolbarPosition ? this.config.toolbarPosition : angularEditorConfig.toolbarPosition;
|
|
46
|
-
}
|
|
47
|
-
ngAfterViewInit() {
|
|
48
|
-
if (isDefined(this.autoFocus)) {
|
|
49
|
-
this.focus();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
onPaste(event) {
|
|
53
|
-
if (this.config.rawPaste) {
|
|
54
|
-
event.preventDefault();
|
|
55
|
-
const text = event.clipboardData.getData('text/plain');
|
|
56
|
-
document.execCommand('insertHTML', false, text);
|
|
57
|
-
return text;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Executed command from editor header buttons
|
|
62
|
-
* @param command string from triggerCommand
|
|
63
|
-
* @param value
|
|
64
|
-
*/
|
|
65
|
-
executeCommand(command, value) {
|
|
66
|
-
this.focus();
|
|
67
|
-
if (command === 'focus') {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (command === 'toggleEditorMode') {
|
|
71
|
-
this.toggleEditorMode(this.modeVisual);
|
|
72
|
-
}
|
|
73
|
-
else if (command !== '') {
|
|
74
|
-
if (command === 'clear') {
|
|
75
|
-
this.editorService.removeSelectedElements(this.getCustomTags());
|
|
76
|
-
this.onContentChange(this.textArea.nativeElement);
|
|
77
|
-
}
|
|
78
|
-
else if (command === 'default') {
|
|
79
|
-
this.editorService.removeSelectedElements('h1,h2,h3,h4,h5,h6,p,pre');
|
|
80
|
-
this.onContentChange(this.textArea.nativeElement);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
this.editorService.executeCommand(command, value);
|
|
84
|
-
}
|
|
85
|
-
this.exec();
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* focus event
|
|
90
|
-
*/
|
|
91
|
-
onTextAreaFocus(event) {
|
|
92
|
-
if (this.focused) {
|
|
93
|
-
event.stopPropagation();
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
this.focused = true;
|
|
97
|
-
this.focusEvent.emit(event);
|
|
98
|
-
if (!this.touched || !this.changed) {
|
|
99
|
-
this.editorService.executeInNextQueueIteration(() => {
|
|
100
|
-
this.configure();
|
|
101
|
-
this.touched = true;
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* @description fires when cursor leaves textarea
|
|
107
|
-
*/
|
|
108
|
-
onTextAreaMouseOut(event) {
|
|
109
|
-
this.editorService.saveSelection();
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* blur event
|
|
113
|
-
*/
|
|
114
|
-
onTextAreaBlur(event) {
|
|
115
|
-
/**
|
|
116
|
-
* save selection if focussed out
|
|
117
|
-
*/
|
|
118
|
-
this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);
|
|
119
|
-
if (typeof this.onTouched === 'function') {
|
|
120
|
-
this.onTouched();
|
|
121
|
-
}
|
|
122
|
-
if (event.relatedTarget !== null) {
|
|
123
|
-
const parent = event.relatedTarget.parentElement;
|
|
124
|
-
if (!parent.classList.contains('angular-editor-toolbar-set') && !parent.classList.contains('ae-picker')) {
|
|
125
|
-
this.blurEvent.emit(event);
|
|
126
|
-
this.focused = false;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* focus the text area when the editor is focused
|
|
132
|
-
*/
|
|
133
|
-
focus() {
|
|
134
|
-
if (this.modeVisual) {
|
|
135
|
-
this.textArea.nativeElement.focus();
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
const sourceText = this.doc.getElementById('sourceText' + this.id);
|
|
139
|
-
sourceText.focus();
|
|
140
|
-
this.focused = true;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Executed from the contenteditable section while the input property changes
|
|
145
|
-
* @param element html element from contenteditable
|
|
146
|
-
*/
|
|
147
|
-
onContentChange(element) {
|
|
148
|
-
let html = '';
|
|
149
|
-
if (this.modeVisual) {
|
|
150
|
-
html = element.innerHTML;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
html = element.innerText;
|
|
154
|
-
}
|
|
155
|
-
if ((!html || html === '<br>')) {
|
|
156
|
-
html = '';
|
|
157
|
-
}
|
|
158
|
-
if (typeof this.onChange === 'function') {
|
|
159
|
-
this.onChange(this.config.sanitize || this.config.sanitize === undefined ?
|
|
160
|
-
this.sanitizer.sanitize(SecurityContext.HTML, html) : html);
|
|
161
|
-
if ((!html) !== this.showPlaceholder) {
|
|
162
|
-
this.togglePlaceholder(this.showPlaceholder);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
this.changed = true;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Set the function to be called
|
|
169
|
-
* when the control receives a change event.
|
|
170
|
-
*
|
|
171
|
-
* @param fn a function
|
|
172
|
-
*/
|
|
173
|
-
registerOnChange(fn) {
|
|
174
|
-
this.onChange = e => (e === '<br>' ? fn('') : fn(e));
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Set the function to be called
|
|
178
|
-
* when the control receives a touch event.
|
|
179
|
-
*
|
|
180
|
-
* @param fn a function
|
|
181
|
-
*/
|
|
182
|
-
registerOnTouched(fn) {
|
|
183
|
-
this.onTouched = fn;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Write a new value to the element.
|
|
187
|
-
*
|
|
188
|
-
* @param value value to be executed when there is a change in contenteditable
|
|
189
|
-
*/
|
|
190
|
-
writeValue(value) {
|
|
191
|
-
if ((!value || value === '<br>' || value === '') !== this.showPlaceholder) {
|
|
192
|
-
this.togglePlaceholder(this.showPlaceholder);
|
|
193
|
-
}
|
|
194
|
-
if (value === undefined || value === '' || value === '<br>') {
|
|
195
|
-
value = null;
|
|
196
|
-
}
|
|
197
|
-
this.refreshView(value);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* refresh view/HTML of the editor
|
|
201
|
-
*
|
|
202
|
-
* @param value html string from the editor
|
|
203
|
-
*/
|
|
204
|
-
refreshView(value) {
|
|
205
|
-
const normalizedValue = value === null ? '' : value;
|
|
206
|
-
this.r.setProperty(this.textArea.nativeElement, 'innerHTML', normalizedValue);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* toggles placeholder based on input string
|
|
211
|
-
*
|
|
212
|
-
* @param value A HTML string from the editor
|
|
213
|
-
*/
|
|
214
|
-
togglePlaceholder(value) {
|
|
215
|
-
if (!value) {
|
|
216
|
-
this.r.addClass(this.editorWrapper.nativeElement, 'show-placeholder');
|
|
217
|
-
this.showPlaceholder = true;
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
this.r.removeClass(this.editorWrapper.nativeElement, 'show-placeholder');
|
|
221
|
-
this.showPlaceholder = false;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Implements disabled state for this element
|
|
226
|
-
*
|
|
227
|
-
* @param isDisabled Disabled flag
|
|
228
|
-
*/
|
|
229
|
-
setDisabledState(isDisabled) {
|
|
230
|
-
const div = this.textArea.nativeElement;
|
|
231
|
-
const action = isDisabled ? 'addClass' : 'removeClass';
|
|
232
|
-
this.r[action](div, 'disabled');
|
|
233
|
-
this.disabled = isDisabled;
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* toggles editor mode based on bToSource bool
|
|
237
|
-
*
|
|
238
|
-
* @param bToSource A boolean value from the editor
|
|
239
|
-
*/
|
|
240
|
-
toggleEditorMode(bToSource) {
|
|
241
|
-
let oContent;
|
|
242
|
-
const editableElement = this.textArea.nativeElement;
|
|
243
|
-
if (bToSource) {
|
|
244
|
-
oContent = this.r.createText(editableElement.innerHTML);
|
|
245
|
-
this.r.setProperty(editableElement, 'innerHTML', '');
|
|
246
|
-
this.r.setProperty(editableElement, 'contentEditable', false);
|
|
247
|
-
const oPre = this.r.createElement('pre');
|
|
248
|
-
this.r.setStyle(oPre, 'margin', '0');
|
|
249
|
-
this.r.setStyle(oPre, 'outline', 'none');
|
|
250
|
-
const oCode = this.r.createElement('code');
|
|
251
|
-
this.r.setProperty(oCode, 'id', 'sourceText' + this.id);
|
|
252
|
-
this.r.setStyle(oCode, 'display', 'block');
|
|
253
|
-
this.r.setStyle(oCode, 'white-space', 'pre-wrap');
|
|
254
|
-
this.r.setStyle(oCode, 'word-break', 'keep-all');
|
|
255
|
-
this.r.setStyle(oCode, 'outline', 'none');
|
|
256
|
-
this.r.setStyle(oCode, 'margin', '0');
|
|
257
|
-
this.r.setStyle(oCode, 'background-color', '#fff5b9');
|
|
258
|
-
this.r.setProperty(oCode, 'contentEditable', true);
|
|
259
|
-
this.r.appendChild(oCode, oContent);
|
|
260
|
-
this.focusInstance = this.r.listen(oCode, 'focus', (event) => this.onTextAreaFocus(event));
|
|
261
|
-
this.blurInstance = this.r.listen(oCode, 'blur', (event) => this.onTextAreaBlur(event));
|
|
262
|
-
this.r.appendChild(oPre, oCode);
|
|
263
|
-
this.r.appendChild(editableElement, oPre);
|
|
264
|
-
// ToDo move to service
|
|
265
|
-
this.doc.execCommand('defaultParagraphSeparator', false, 'div');
|
|
266
|
-
this.modeVisual = false;
|
|
267
|
-
this.viewMode.emit(false);
|
|
268
|
-
oCode.focus();
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
if (this.doc.querySelectorAll) {
|
|
272
|
-
this.r.setProperty(editableElement, 'innerHTML', editableElement.innerText);
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
oContent = this.doc.createRange();
|
|
276
|
-
oContent.selectNodeContents(editableElement.firstChild);
|
|
277
|
-
this.r.setProperty(editableElement, 'innerHTML', oContent.toString());
|
|
278
|
-
}
|
|
279
|
-
this.r.setProperty(editableElement, 'contentEditable', true);
|
|
280
|
-
this.modeVisual = true;
|
|
281
|
-
this.viewMode.emit(true);
|
|
282
|
-
this.onContentChange(editableElement);
|
|
283
|
-
editableElement.focus();
|
|
284
|
-
}
|
|
285
|
-
this.editorToolbar.setEditorMode(!this.modeVisual);
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* toggles editor buttons when cursor moved or positioning
|
|
289
|
-
*
|
|
290
|
-
* Send a node array from the contentEditable of the editor
|
|
291
|
-
*/
|
|
292
|
-
exec() {
|
|
293
|
-
this.editorToolbar.triggerButtons();
|
|
294
|
-
let userSelection;
|
|
295
|
-
if (this.doc.getSelection) {
|
|
296
|
-
userSelection = this.doc.getSelection();
|
|
297
|
-
this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);
|
|
298
|
-
}
|
|
299
|
-
let a = userSelection.focusNode;
|
|
300
|
-
const els = [];
|
|
301
|
-
while (a && a.id !== 'editor') {
|
|
302
|
-
els.unshift(a);
|
|
303
|
-
a = a.parentNode;
|
|
304
|
-
}
|
|
305
|
-
this.editorToolbar.triggerBlocks(els);
|
|
306
|
-
}
|
|
307
|
-
configure() {
|
|
308
|
-
this.editorService.uploadUrl = this.config.uploadUrl;
|
|
309
|
-
this.editorService.uploadWithCredentials = this.config.uploadWithCredentials;
|
|
310
|
-
if (this.config.defaultParagraphSeparator) {
|
|
311
|
-
this.editorService.setDefaultParagraphSeparator(this.config.defaultParagraphSeparator);
|
|
312
|
-
}
|
|
313
|
-
if (this.config.defaultFontName) {
|
|
314
|
-
this.editorService.setFontName(this.config.defaultFontName);
|
|
315
|
-
}
|
|
316
|
-
if (this.config.defaultFontSize) {
|
|
317
|
-
this.editorService.setFontSize(this.config.defaultFontSize);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
getFonts() {
|
|
321
|
-
const fonts = this.config.fonts ? this.config.fonts : angularEditorConfig.fonts;
|
|
322
|
-
return fonts.map(x => {
|
|
323
|
-
return { label: x.name, value: x.name };
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
getCustomTags() {
|
|
327
|
-
const tags = ['span'];
|
|
328
|
-
this.config.customClasses.forEach(x => {
|
|
329
|
-
if (x.tag !== undefined) {
|
|
330
|
-
if (!tags.includes(x.tag)) {
|
|
331
|
-
tags.push(x.tag);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
});
|
|
335
|
-
return tags.join(',');
|
|
336
|
-
}
|
|
337
|
-
ngOnDestroy() {
|
|
338
|
-
if (this.blurInstance) {
|
|
339
|
-
this.blurInstance();
|
|
340
|
-
}
|
|
341
|
-
if (this.focusInstance) {
|
|
342
|
-
this.focusInstance();
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
filterStyles(html) {
|
|
346
|
-
html = html.replace('position: fixed;', '');
|
|
347
|
-
return html;
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
AngularEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AngularEditorComponent, deps: [{ token: i0.Renderer2 }, { token: i1.AngularEditorService }, { token: DOCUMENT }, { token: i2.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: 'tabindex', attribute: true }, { token: 'autofocus', attribute: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
351
|
-
AngularEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AngularEditorComponent, selector: "angular-editor", inputs: { id: "id", config: "config", placeholder: "placeholder", tabIndex: "tabIndex" }, outputs: { html: "html", viewMode: "viewMode", blurEvent: "blur", focusEvent: "focus" }, host: { listeners: { "focus": "onFocus()" }, properties: { "attr.tabindex": "this.tabindex" } }, providers: [
|
|
352
|
-
{
|
|
353
|
-
provide: NG_VALUE_ACCESSOR,
|
|
354
|
-
useExisting: forwardRef(() => AngularEditorComponent),
|
|
355
|
-
multi: true
|
|
356
|
-
},
|
|
357
|
-
AngularEditorService
|
|
358
|
-
], queries: [{ propertyName: "customButtonsTemplateRef", first: true, predicate: ["customButtons"], descendants: true }], viewQueries: [{ propertyName: "textArea", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "editorWrapper", first: true, predicate: ["editorWrapper"], descendants: true, static: true }, { propertyName: "editorToolbar", first: true, predicate: ["editorToolbar"], descendants: true }], ngImport: i0, template: "<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n>\n <angular-editor-toolbar\n *ngIf=\"config.toolbarPosition === 'top'\"\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($event.target)\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n <angular-editor-toolbar\n *ngIf=\"config.toolbarPosition === 'bottom'\"\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n ></angular-editor-toolbar>\n</div>\n", styles: ["a{cursor:pointer}.angular-editor-textarea{min-height:150px;overflow:auto;margin-top:5px;resize:vertical}.angular-editor-textarea:after{content:\"\";position:absolute;bottom:0;right:0;display:block;width:8px;height:8px;cursor:nwse-resize;background-color:#ffffff80}.angular-editor-toolbar{font:100 14px/15px Roboto,Arial,sans-serif;background-color:#f5f5f5;font-size:.8rem;padding:.2rem;border:1px solid #ddd;display:flex;flex-wrap:wrap;gap:4px}.angular-editor-toolbar .angular-editor-toolbar-set{display:flex;gap:1px;width:fit-content;vertical-align:baseline}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button{background-color:#fff;vertical-align:middle;border:1px solid #ddd;padding:.4rem;float:left;width:2rem;height:2rem}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:focus,.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button.focus{outline:0}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled>.color-label{pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled>.color-label.foreground :after{background:#555555}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled>.color-label.background{background:#555555}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button.active{background:#fff5b9}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button.active:hover{background-color:#fffa98}.angular-editor-toolbar .angular-editor-toolbar-set select{font-size:11px;width:90px;vertical-align:middle;background-color:transparent;border:.5px solid rgba(255,255,255,0);border-radius:5px;outline:none;padding:.4rem;cursor:pointer}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading{display:inline-block;width:90px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-heading optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading option{border:1px solid;background-color:#fff}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .default{font-size:16px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h1{font-size:24px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h2{font-size:20px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h3{font-size:16px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h4{font-size:15px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h5{font-size:14px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h6{font-size:13px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .div,.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .pre{font-size:12px}}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .select-font{display:inline-block;width:90px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-font optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font option{border:1px solid;background-color:#fff}}.angular-editor-toolbar .angular-editor-toolbar-set .select-font:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-font:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size{display:inline-block;width:50px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size option{border:1px solid;background-color:#fff}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size1{font-size:10px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size2{font-size:12px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size3{font-size:14px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size4{font-size:16px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size5{font-size:18px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size6{font-size:20px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size7{font-size:22px}}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style{display:inline-block;width:90px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style option{border:1px solid;background-color:#fff}}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .color-label{position:relative;cursor:pointer}.angular-editor-toolbar .angular-editor-toolbar-set .background{font-size:smaller;background:#1b1b1b;color:#fff;padding:3px}.angular-editor-toolbar .angular-editor-toolbar-set .foreground :after{position:absolute;content:\"\";inset:auto auto -3px -1px;width:15px;height:2px;z-index:0;background:#1b1b1b}.angular-editor{display:flex;flex-direction:column}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border:1px solid #ddd;background-color:transparent;overflow-x:hidden;overflow-y:auto;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.9rem .8rem 1rem .9rem;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}\n"], components: [{ type: i3.AngularEditorToolbarComponent, selector: "angular-editor-toolbar", inputs: ["id", "uploadUrl", "upload", "showToolbar", "fonts", "customClasses", "defaultFontName", "defaultFontSize", "hiddenButtons"], outputs: ["execute"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
|
359
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AngularEditorComponent, decorators: [{
|
|
360
|
-
type: Component,
|
|
361
|
-
args: [{ selector: 'angular-editor', providers: [
|
|
362
|
-
{
|
|
363
|
-
provide: NG_VALUE_ACCESSOR,
|
|
364
|
-
useExisting: forwardRef(() => AngularEditorComponent),
|
|
365
|
-
multi: true
|
|
366
|
-
},
|
|
367
|
-
AngularEditorService
|
|
368
|
-
], template: "<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n>\n <angular-editor-toolbar\n *ngIf=\"config.toolbarPosition === 'top'\"\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($event.target)\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n <angular-editor-toolbar\n *ngIf=\"config.toolbarPosition === 'bottom'\"\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n ></angular-editor-toolbar>\n</div>\n", styles: ["a{cursor:pointer}.angular-editor-textarea{min-height:150px;overflow:auto;margin-top:5px;resize:vertical}.angular-editor-textarea:after{content:\"\";position:absolute;bottom:0;right:0;display:block;width:8px;height:8px;cursor:nwse-resize;background-color:#ffffff80}.angular-editor-toolbar{font:100 14px/15px Roboto,Arial,sans-serif;background-color:#f5f5f5;font-size:.8rem;padding:.2rem;border:1px solid #ddd;display:flex;flex-wrap:wrap;gap:4px}.angular-editor-toolbar .angular-editor-toolbar-set{display:flex;gap:1px;width:fit-content;vertical-align:baseline}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button{background-color:#fff;vertical-align:middle;border:1px solid #ddd;padding:.4rem;float:left;width:2rem;height:2rem}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:focus,.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button.focus{outline:0}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled>.color-label{pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled>.color-label.foreground :after{background:#555555}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button:disabled>.color-label.background{background:#555555}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button.active{background:#fff5b9}.angular-editor-toolbar .angular-editor-toolbar-set .angular-editor-button.active:hover{background-color:#fffa98}.angular-editor-toolbar .angular-editor-toolbar-set select{font-size:11px;width:90px;vertical-align:middle;background-color:transparent;border:.5px solid rgba(255,255,255,0);border-radius:5px;outline:none;padding:.4rem;cursor:pointer}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading{display:inline-block;width:90px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-heading optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading option{border:1px solid;background-color:#fff}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .default{font-size:16px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h1{font-size:24px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h2{font-size:20px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h3{font-size:16px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h4{font-size:15px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h5{font-size:14px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .h6{font-size:13px}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .div,.angular-editor-toolbar .angular-editor-toolbar-set .select-heading .pre{font-size:12px}}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-heading:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .select-font{display:inline-block;width:90px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-font optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font option{border:1px solid;background-color:#fff}}.angular-editor-toolbar .angular-editor-toolbar-set .select-font:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-font:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size{display:inline-block;width:50px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size option{border:1px solid;background-color:#fff}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size1{font-size:10px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size2{font-size:12px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size3{font-size:14px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size4{font-size:16px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size5{font-size:18px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size6{font-size:20px}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size .size7{font-size:22px}}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-font-size:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style{display:inline-block;width:90px}@supports not (-moz-appearance: none){.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style optgroup{font-size:12px;background-color:#f4f4f4;padding:5px}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style option{border:1px solid;background-color:#fff}}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.angular-editor-toolbar .angular-editor-toolbar-set .select-custom-style:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.angular-editor-toolbar .angular-editor-toolbar-set .color-label{position:relative;cursor:pointer}.angular-editor-toolbar .angular-editor-toolbar-set .background{font-size:smaller;background:#1b1b1b;color:#fff;padding:3px}.angular-editor-toolbar .angular-editor-toolbar-set .foreground :after{position:absolute;content:\"\";inset:auto auto -3px -1px;width:15px;height:2px;z-index:0;background:#1b1b1b}.angular-editor{display:flex;flex-direction:column}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border:1px solid #ddd;background-color:transparent;overflow-x:hidden;overflow-y:auto;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.9rem .8rem 1rem .9rem;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}\n"] }]
|
|
369
|
-
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.AngularEditorService }, { type: undefined, decorators: [{
|
|
370
|
-
type: Inject,
|
|
371
|
-
args: [DOCUMENT]
|
|
372
|
-
}] }, { type: i2.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
373
|
-
type: Attribute,
|
|
374
|
-
args: ['tabindex']
|
|
375
|
-
}] }, { type: undefined, decorators: [{
|
|
376
|
-
type: Attribute,
|
|
377
|
-
args: ['autofocus']
|
|
378
|
-
}] }]; }, propDecorators: { id: [{
|
|
379
|
-
type: Input
|
|
380
|
-
}], config: [{
|
|
381
|
-
type: Input
|
|
382
|
-
}], placeholder: [{
|
|
383
|
-
type: Input
|
|
384
|
-
}], tabIndex: [{
|
|
385
|
-
type: Input
|
|
386
|
-
}], html: [{
|
|
387
|
-
type: Output
|
|
388
|
-
}], textArea: [{
|
|
389
|
-
type: ViewChild,
|
|
390
|
-
args: ['editor', { static: true }]
|
|
391
|
-
}], editorWrapper: [{
|
|
392
|
-
type: ViewChild,
|
|
393
|
-
args: ['editorWrapper', { static: true }]
|
|
394
|
-
}], editorToolbar: [{
|
|
395
|
-
type: ViewChild,
|
|
396
|
-
args: ['editorToolbar']
|
|
397
|
-
}], customButtonsTemplateRef: [{
|
|
398
|
-
type: ContentChild,
|
|
399
|
-
args: ["customButtons"]
|
|
400
|
-
}], viewMode: [{
|
|
401
|
-
type: Output
|
|
402
|
-
}], blurEvent: [{
|
|
403
|
-
type: Output,
|
|
404
|
-
args: ['blur']
|
|
405
|
-
}], focusEvent: [{
|
|
406
|
-
type: Output,
|
|
407
|
-
args: ['focus']
|
|
408
|
-
}], tabindex: [{
|
|
409
|
-
type: HostBinding,
|
|
410
|
-
args: ['attr.tabindex']
|
|
411
|
-
}], onFocus: [{
|
|
412
|
-
type: HostListener,
|
|
413
|
-
args: ['focus']
|
|
414
|
-
}] } });
|
|
415
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1lZGl0b3Ivc3JjL2xpYi9hbmd1bGFyLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWVkaXRvci9zcmMvbGliL2FuZ3VsYXItZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsU0FBUyxFQUVULFNBQVMsRUFBRSxZQUFZLEVBRXZCLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFFTixlQUFlLEVBQ2YsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQXVCLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7Ozs7OztBQWVwQyxNQUFNLE9BQU8sc0JBQXNCO0lBNkNqQyxZQUNVLENBQVksRUFDWixhQUFtQyxFQUNqQixHQUFRLEVBQzFCLFNBQXVCLEVBQ3ZCLEtBQXdCLEVBQ1QsZUFBdUIsRUFDZCxTQUFjO1FBTnRDLE1BQUMsR0FBRCxDQUFDLENBQVc7UUFDWixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDakIsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBRUEsY0FBUyxHQUFULFNBQVMsQ0FBSztRQS9DaEQsZUFB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QUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDO1lBQ3JELEtBQUssRUFBRSxJQUFJO1NBQ1o7UUFDRCxvQkFBb0I7S0FDckIsbWRDdENILHd0RkFvRUE7MkZENUJhLHNCQUFzQjtrQkFibEMsU0FBUzsrQkFDRSxnQkFBZ0IsYUFHZjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQzs0QkFDckQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Qsb0JBQW9CO3FCQUNyQjs7MEJBa0RFLE1BQU07MkJBQUMsUUFBUTs7MEJBR2YsU0FBUzsyQkFBQyxVQUFVOzswQkFDcEIsU0FBUzsyQkFBQyxXQUFXOzRDQXJDZixFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxJQUFJO3NCQUFiLE1BQU07Z0JBRThCLFFBQVE7c0JBQTVDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDUyxhQUFhO3NCQUF4RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ2QsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNLLHdCQUF3QjtzQkFBdEQsWUFBWTt1QkFBQyxlQUFlO2dCQUduQixRQUFRO3NCQUFqQixNQUFNO2dCQUlTLFNBQVM7c0JBQXhCLE1BQU07dUJBQUMsTUFBTTtnQkFJRyxVQUFVO3NCQUExQixNQUFNO3VCQUFDLE9BQU87Z0JBRWUsUUFBUTtzQkFBckMsV0FBVzt1QkFBQyxlQUFlO2dCQUc1QixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIEF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCwgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2VjdXJpdHlDb250ZXh0LCBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vYW5ndWxhci1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvclNlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvckNvbmZpZywgYW5ndWxhckVkaXRvckNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbmd1bGFyLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmd1bGFyLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FuZ3VsYXItZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQW5ndWxhckVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgQW5ndWxhckVkaXRvclNlcnZpY2VcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG5cbiAgbW9kZVZpc3VhbCA9IHRydWU7XG4gIHNob3dQbGFjZWhvbGRlciA9IGZhbHNlO1xuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBmb2N1c2VkID0gZmFsc2U7XG4gIHRvdWNoZWQgPSBmYWxzZTtcbiAgY2hhbmdlZCA9IGZhbHNlO1xuXG4gIGZvY3VzSW5zdGFuY2U6IGFueTtcbiAgYmx1ckluc3RhbmNlOiBhbnk7XG5cbiAgQElucHV0KCkgaWQgPSAnJztcbiAgQElucHV0KCkgY29uZmlnOiBBbmd1bGFyRWRpdG9yQ29uZmlnID0gYW5ndWxhckVkaXRvckNvbmZpZztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgdGFiSW5kZXg6IG51bWJlciB8IG51bGw7XG5cbiAgQE91dHB1dCgpIGh0bWw7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9yJywge3N0YXRpYzogdHJ1ZX0pIHRleHRBcmVhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdlZGl0b3JXcmFwcGVyJywge3N0YXRpYzogdHJ1ZX0pIGVkaXRvcldyYXBwZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclRvb2xiYXInKSBlZGl0b3JUb29sYmFyOiBBbmd1bGFyRWRpdG9yVG9vbGJhckNvbXBvbmVudDtcbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbUJ1dHRvbnNcIikgY3VzdG9tQnV0dG9uc1RlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgZXhlY3V0ZUNvbW1hbmRGbiA9IHRoaXMuZXhlY3V0ZUNvbW1hbmQuYmluZCh0aGlzKTtcblxuICBAT3V0cHV0KCkgdmlld01vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIGVtaXRzIGBibHVyYCBldmVudCB3aGVuIGZvY3VzZWQgb3V0IGZyb20gdGhlIHRleHRhcmVhICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlLCBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBAT3V0cHV0KCdibHVyJykgYmx1ckV2ZW50OiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgLyoqIGVtaXRzIGBmb2N1c2AgZXZlbnQgd2hlbiBmb2N1c2VkIGluIHRvIHRoZSB0ZXh0YXJlYSAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZSwgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgnZm9jdXMnKSBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JykgdGFiaW5kZXggPSAtMTtcblxuICBASG9zdExpc3RlbmVyKCdmb2N1cycpXG4gIG9uRm9jdXMoKSB7XG4gICAgdGhpcy5mb2N1cygpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBBbmd1bGFyRWRpdG9yU2VydmljZSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55LFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEF0dHJpYnV0ZSgndGFiaW5kZXgnKSBkZWZhdWx0VGFiSW5kZXg6IHN0cmluZyxcbiAgICBAQXR0cmlidXRlKCdhdXRvZm9jdXMnKSBwcml2YXRlIGF1dG9Gb2N1czogYW55XG4gICkge1xuICAgIGNvbnN0IHBhcnNlZFRhYkluZGV4ID0gTnVtYmVyKGRlZmF1bHRUYWJJbmRleCk7XG4gICAgdGhpcy50YWJJbmRleCA9IChwYXJzZWRUYWJJbmRleCB8fCBwYXJzZWRUYWJJbmRleCA9PT0gMCkgPyBwYXJzZWRUYWJJbmRleCA6IG51bGw7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZy50b29sYmFyUG9zaXRpb24gPSB0aGlzLmNvbmZpZy50b29sYmFyUG9zaXRpb24gPyB0aGlzLmNvbmZpZy50b29sYmFyUG9zaXRpb24gOiBhbmd1bGFyRWRpdG9yQ29uZmlnLnRvb2xiYXJQb3NpdGlvbjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAoaXNEZWZpbmVkKHRoaXMuYXV0b0ZvY3VzKSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KXtcbiAgICBpZiAodGhpcy5jb25maWcucmF3UGFzdGUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCB0ZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCB0ZXh0KTtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlZCBjb21tYW5kIGZyb20gZWRpdG9yIGhlYWRlciBidXR0b25zXG4gICAqIEBwYXJhbSBjb21tYW5kIHN0cmluZyBmcm9tIHRyaWdnZXJDb21tYW5kXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nLCB2YWx1ZT86IHN0cmluZykge1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgICBpZiAoY29tbWFuZCA9PT0gJ2ZvY3VzJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29tbWFuZCA9PT0gJ3RvZ2dsZUVkaXRvck1vZGUnKSB7XG4gICAgICB0aGlzLnRvZ2dsZUVkaXRvck1vZGUodGhpcy5tb2RlVmlzdWFsKTtcbiAgICB9IGVsc2UgaWYgKGNvbW1hbmQgIT09ICcnKSB7XG4gICAgICBpZiAoY29tbWFuZCA9PT0gJ2NsZWFyJykge1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWRFbGVtZW50cyh0aGlzLmdldEN1c3RvbVRhZ3MoKSk7XG4gICAgICAgIHRoaXMub25Db250ZW50Q2hhbmdlKHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT09ICdkZWZhdWx0Jykge1xuICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWRFbGVtZW50cygnaDEsaDIsaDMsaDQsaDUsaDYscCxwcmUnKTtcbiAgICAgICAgdGhpcy5vbkNvbnRlbnRDaGFuZ2UodGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5leGVjdXRlQ29tbWFuZChjb21tYW5kLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZm9jdXMgZXZlbnRcbiAgICovXG4gIG9uVGV4dEFyZWFGb2N1cyhldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIHRoaXMuZm9jdXNFdmVudC5lbWl0KGV2ZW50KTtcbiAgICBpZiAoIXRoaXMudG91Y2hlZCB8fCAhdGhpcy5jaGFuZ2VkKSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2UuZXhlY3V0ZUluTmV4dFF1ZXVlSXRlcmF0aW9uKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gZmlyZXMgd2hlbiBjdXJzb3IgbGVhdmVzIHRleHRhcmVhXG4gICAqL1xuICBwdWJsaWMgb25UZXh0QXJlYU1vdXNlT3V0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNhdmVTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBibHVyIGV2ZW50XG4gICAqL1xuICBvblRleHRBcmVhQmx1cihldmVudDogRm9jdXNFdmVudCkge1xuICAgIC8qKlxuICAgICAqIHNhdmUgc2VsZWN0aW9uIGlmIGZvY3Vzc2VkIG91dFxuICAgICAqL1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5leGVjdXRlSW5OZXh0UXVldWVJdGVyYXRpb24odGhpcy5lZGl0b3JTZXJ2aWNlLnNhdmVTZWxlY3Rpb24pO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uVG91Y2hlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAoIXBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FuZ3VsYXItZWRpdG9yLXRvb2xiYXItc2V0JykgJiYgIXBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2FlLXBpY2tlcicpKSB7XG4gICAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIGZvY3VzIHRoZSB0ZXh0IGFyZWEgd2hlbiB0aGUgZWRpdG9yIGlzIGZvY3VzZWRcbiAgICovXG4gIGZvY3VzKCkge1xuICAgIGlmICh0aGlzLm1vZGVWaXN1YWwpIHtcbiAgICAgIHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzb3VyY2VUZXh0ID0gdGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQoJ3NvdXJjZVRleHQnICsgdGhpcy5pZCk7XG4gICAgICBzb3VyY2VUZXh0LmZvY3VzKCk7XG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlZCBmcm9tIHRoZSBjb250ZW50ZWRpdGFibGUgc2VjdGlvbiB3aGlsZSB0aGUgaW5wdXQgcHJvcGVydHkgY2hhbmdlc1xuICAgKiBAcGFyYW0gZWxlbWVudCBodG1sIGVsZW1lbnQgZnJvbSBjb250ZW50ZWRpdGFibGVcbiAgICovXG4gIG9uQ29udGVudENoYW5nZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgaWYgKHRoaXMubW9kZVZpc3VhbCkge1xuICAgICAgaHRtbCA9IGVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIH0gZWxzZSB7XG4gICAgICBodG1sID0gZWxlbWVudC5pbm5lclRleHQ7XG4gICAgfVxuICAgIGlmICgoIWh0bWwgfHwgaHRtbCA9PT0gJzxicj4nKSkge1xuICAgICAgaHRtbCA9ICcnO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jb25maWcuc2FuaXRpemUgfHwgdGhpcy5jb25maWcuc2FuaXRpemUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgIHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBodG1sKSA6IGh0bWwpO1xuICAgICAgaWYgKCghaHRtbCkgIT09IHRoaXMuc2hvd1BsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUGxhY2Vob2xkZXIodGhpcy5zaG93UGxhY2Vob2xkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBmbiBhIGZ1bmN0aW9uXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZSA9PiAoZSA9PT0gJzxicj4nID8gZm4oJycpIDogZm4oZSkpIDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxuICAgKiB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgdG91Y2ggZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBmbiBhIGZ1bmN0aW9uXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhIG5ldyB2YWx1ZSB0byB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gY29udGVudGVkaXRhYmxlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcblxuICAgIGlmICgoIXZhbHVlIHx8IHZhbHVlID09PSAnPGJyPicgfHwgdmFsdWUgPT09ICcnKSAhPT0gdGhpcy5zaG93UGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxhY2Vob2xkZXIodGhpcy5zaG93UGxhY2Vob2xkZXIpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJzxicj4nKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoVmlldyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogcmVmcmVzaCB2aWV3L0hUTUwgb2YgdGhlIGVkaXRvclxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgaHRtbCBzdHJpbmcgZnJvbSB0aGUgZWRpdG9yXG4gICAqL1xuICByZWZyZXNoVmlldyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT09IG51bGwgPyAnJyA6IHZhbHVlO1xuICAgIHRoaXMuci5zZXRQcm9wZXJ0eSh0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQsICdpbm5lckhUTUwnLCBub3JtYWxpemVkVmFsdWUpO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvZ2dsZXMgcGxhY2Vob2xkZXIgYmFzZWQgb24gaW5wdXQgc3RyaW5nXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBBIEhUTUwgc3RyaW5nIGZyb20gdGhlIGVkaXRvclxuICAgKi9cbiAgdG9nZ2xlUGxhY2Vob2xkZXIodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aGlzLnIuYWRkQ2xhc3ModGhpcy5lZGl0b3JXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdzaG93LXBsYWNlaG9sZGVyJyk7XG4gICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9IHRydWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yLnJlbW92ZUNsYXNzKHRoaXMuZWRpdG9yV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnc2hvdy1wbGFjZWhvbGRlcicpO1xuICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBkaXNhYmxlZCBzdGF0ZSBmb3IgdGhpcyBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIERpc2FibGVkIGZsYWdcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhY3Rpb24gPSBpc0Rpc2FibGVkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyc7XG4gICAgdGhpcy5yW2FjdGlvbl0oZGl2LCAnZGlzYWJsZWQnKTtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGVzIGVkaXRvciBtb2RlIGJhc2VkIG9uIGJUb1NvdXJjZSBib29sXG4gICAqXG4gICAqIEBwYXJhbSBiVG9Tb3VyY2UgQSBib29sZWFuIHZhbHVlIGZyb20gdGhlIGVkaXRvclxuICAgKi9cbiAgdG9nZ2xlRWRpdG9yTW9kZShiVG9Tb3VyY2U6IGJvb2xlYW4pIHtcbiAgICBsZXQgb0NvbnRlbnQ6IGFueTtcbiAgICBjb25zdCBlZGl0YWJsZUVsZW1lbnQgPSB0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoYlRvU291cmNlKSB7XG4gICAgICBvQ29udGVudCA9IHRoaXMuci5jcmVhdGVUZXh0KGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwpO1xuICAgICAgdGhpcy5yLnNldFByb3BlcnR5KGVkaXRhYmxlRWxlbWVudCwgJ2lubmVySFRNTCcsICcnKTtcbiAgICAgIHRoaXMuci5zZXRQcm9wZXJ0eShlZGl0YWJsZUVsZW1lbnQsICdjb250ZW50RWRpdGFibGUnLCBmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG9QcmUgPSB0aGlzLnIuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICB0aGlzLnIuc2V0U3R5bGUob1ByZSwgJ21hcmdpbicsICcwJyk7XG4gICAgICB0aGlzLnIuc2V0U3R5bGUob1ByZSwgJ291dGxpbmUnLCAnbm9uZScpO1xuXG4gICAgICBjb25zdCBvQ29kZSA9IHRoaXMuci5jcmVhdGVFbGVtZW50KCdjb2RlJyk7XG4gICAgICB0aGlzLnIuc2V0UHJvcGVydHkob0NvZGUsICdpZCcsICdzb3VyY2VUZXh0JyArIHRoaXMuaWQpO1xuICAgICAgdGhpcy5yLnNldFN0eWxlKG9Db2RlLCAnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgdGhpcy5yLnNldFN0eWxlKG9Db2RlLCAnd2hpdGUtc3BhY2UnLCAncHJlLXdyYXAnKTtcbiAgICAgIHRoaXMuci5zZXRTdHlsZShvQ29kZSwgJ3dvcmQtYnJlYWsnLCAna2VlcC1hbGwnKTtcbiAgICAgIHRoaXMuci5zZXRTdHlsZShvQ29kZSwgJ291dGxpbmUnLCAnbm9uZScpO1xuICAgICAgdGhpcy5yLnNldFN0eWxlKG9Db2RlLCAnbWFyZ2luJywgJzAnKTtcbiAgICAgIHRoaXMuci5zZXRTdHlsZShvQ29kZSwgJ2JhY2tncm91bmQtY29sb3InLCAnI2ZmZjViOScpO1xuICAgICAgdGhpcy5yLnNldFByb3BlcnR5KG9Db2RlLCAnY29udGVudEVkaXRhYmxlJywgdHJ1ZSk7XG4gICAgICB0aGlzLnIuYXBwZW5kQ2hpbGQob0NvZGUsIG9Db250ZW50KTtcbiAgICAgIHRoaXMuZm9jdXNJbnN0YW5jZSA9IHRoaXMuci5saXN0ZW4ob0NvZGUsICdmb2N1cycsIChldmVudCkgPT4gdGhpcy5vblRleHRBcmVhRm9jdXMoZXZlbnQpKTtcbiAgICAgIHRoaXMuYmx1ckluc3RhbmNlID0gdGhpcy5yLmxpc3RlbihvQ29kZSwgJ2JsdXInLCAoZXZlbnQpID0+IHRoaXMub25UZXh0QXJlYUJsdXIoZXZlbnQpKTtcbiAgICAgIHRoaXMuci5hcHBlbmRDaGlsZChvUHJlLCBvQ29kZSk7XG4gICAgICB0aGlzLnIuYXBwZW5kQ2hpbGQoZWRpdGFibGVFbGVtZW50LCBvUHJlKTtcblxuICAgICAgLy8gVG9EbyBtb3ZlIHRvIHNlcnZpY2VcbiAgICAgIHRoaXMuZG9jLmV4ZWNDb21tYW5kKCdkZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yJywgZmFsc2UsICdkaXYnKTtcblxuICAgICAgdGhpcy5tb2RlVmlzdWFsID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZXdNb2RlLmVtaXQoZmFsc2UpO1xuICAgICAgb0NvZGUuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZG9jLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgICAgdGhpcy5yLnNldFByb3BlcnR5KGVkaXRhYmxlRWxlbWVudCwgJ2lubmVySFRNTCcsIGVkaXRhYmxlRWxlbWVudC5pbm5lclRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb0NvbnRlbnQgPSB0aGlzLmRvYy5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBvQ29udGVudC5zZWxlY3ROb2RlQ29udGVudHMoZWRpdGFibGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICB0aGlzLnIuc2V0UHJvcGVydHkoZWRpdGFibGVFbGVtZW50LCAnaW5uZXJIVE1MJywgb0NvbnRlbnQudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgICB0aGlzLnIuc2V0UHJvcGVydHkoZWRpdGFibGVFbGVtZW50LCAnY29udGVudEVkaXRhYmxlJywgdHJ1ZSk7XG4gICAgICB0aGlzLm1vZGVWaXN1YWwgPSB0cnVlO1xuICAgICAgdGhpcy52aWV3TW9kZS5lbWl0KHRydWUpO1xuICAgICAgdGhpcy5vbkNvbnRlbnRDaGFuZ2UoZWRpdGFibGVFbGVtZW50KTtcbiAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvclRvb2xiYXIuc2V0RWRpdG9yTW9kZSghdGhpcy5tb2RlVmlzdWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGVzIGVkaXRvciBidXR0b25zIHdoZW4gY3Vyc29yIG1vdmVkIG9yIHBvc2l0aW9uaW5nXG4gICAqXG4gICAqIFNlbmQgYSBub2RlIGFycmF5IGZyb20gdGhlIGNvbnRlbnRFZGl0YWJsZSBvZiB0aGUgZWRpdG9yXG4gICAqL1xuICBleGVjKCkge1xuICAgIHRoaXMuZWRpdG9yVG9vbGJhci50cmlnZ2VyQnV0dG9ucygpO1xuXG4gICAgbGV0IHVzZXJTZWxlY3Rpb247XG4gICAgaWYgKHRoaXMuZG9jLmdldFNlbGVjdGlvbikge1xuICAgICAgdXNlclNlbGVjdGlvbiA9IHRoaXMuZG9jLmdldFNlbGVjdGlvbigpO1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmV4ZWN1dGVJbk5leHRRdWV1ZUl0ZXJhdGlvbih0aGlzLmVkaXRvclNlcnZpY2Uuc2F2ZVNlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgbGV0IGEgPSB1c2VyU2VsZWN0aW9uLmZvY3VzTm9kZTtcbiAgICBjb25zdCBlbHMgPSBbXTtcbiAgICB3aGlsZSAoYSAmJiBhLmlkICE9PSAnZWRpdG9yJykge1xuICAgICAgZWxzLnVuc2hpZnQoYSk7XG4gICAgICBhID0gYS5wYXJlbnROb2RlO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvclRvb2xiYXIudHJpZ2dlckJsb2NrcyhlbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmUoKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnVwbG9hZFVybCA9IHRoaXMuY29uZmlnLnVwbG9hZFVybDtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UudXBsb2FkV2l0aENyZWRlbnRpYWxzID0gdGhpcy5jb25maWcudXBsb2FkV2l0aENyZWRlbnRpYWxzO1xuICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0RGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvcih0aGlzLmNvbmZpZy5kZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmRlZmF1bHRGb250TmFtZSkge1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldEZvbnROYW1lKHRoaXMuY29uZmlnLmRlZmF1bHRGb250TmFtZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udFNpemUpIHtcbiAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRGb250U2l6ZSh0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udFNpemUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZvbnRzKCkge1xuICAgIGNvbnN0IGZvbnRzID0gdGhpcy5jb25maWcuZm9udHMgPyB0aGlzLmNvbmZpZy5mb250cyA6IGFuZ3VsYXJFZGl0b3JDb25maWcuZm9udHM7XG4gICAgcmV0dXJuIGZvbnRzLm1hcCh4ID0+IHtcbiAgICAgIHJldHVybiB7bGFiZWw6IHgubmFtZSwgdmFsdWU6IHgubmFtZX07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDdXN0b21UYWdzKCkge1xuICAgIGNvbnN0IHRhZ3MgPSBbJ3NwYW4nXTtcbiAgICB0aGlzLmNvbmZpZy5jdXN0b21DbGFzc2VzLmZvckVhY2goeCA9PiB7XG4gICAgICBpZiAoeC50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXMoeC50YWcpKSB7XG4gICAgICAgICAgdGFncy5wdXNoKHgudGFnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0YWdzLmpvaW4oJywnKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmJsdXJJbnN0YW5jZSkge1xuICAgICAgdGhpcy5ibHVySW5zdGFuY2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXNJbnN0YW5jZSkge1xuICAgICAgdGhpcy5mb2N1c0luc3RhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyU3R5bGVzKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgncG9zaXRpb246IGZpeGVkOycsICcnKTtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxufVxuIiwiPGRpdlxuICAgICBjbGFzcz1cImFuZ3VsYXItZWRpdG9yXCJcbiAgICAgI2FuZ3VsYXJFZGl0b3JcbiAgICAgW3N0eWxlLndpZHRoXT1cImNvbmZpZy53aWR0aFwiXG4gICAgIFtzdHlsZS5taW5XaWR0aF09XCJjb25maWcubWluV2lkdGhcIlxuPlxuICAgICA8YW5ndWxhci1lZGl0b3ItdG9vbGJhclxuICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnRvb2xiYXJQb3NpdGlvbiA9PT0gJ3RvcCdcIlxuICAgICAgICAgICNlZGl0b3JUb29sYmFyXG4gICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICBbdXBsb2FkVXJsXT1cImNvbmZpZy51cGxvYWRVcmxcIlxuICAgICAgICAgIFt1cGxvYWRdPVwiY29uZmlnLnVwbG9hZFwiXG4gICAgICAgICAgW3Nob3dUb29sYmFyXT1cImNvbmZpZy5zaG93VG9vbGJhciAhPT0gdW5kZWZpbmVkID8gY29uZmlnLnNob3dUb29sYmFyIDogdHJ1ZVwiXG4gICAgICAgICAgW2ZvbnRzXT1cImdldEZvbnRzKClcIlxuICAgICAgICAgIFtjdXN0b21DbGFzc2VzXT1cImNvbmZpZy5jdXN0b21DbGFzc2VzXCJcbiAgICAgICAgICBbZGVmYXVsdEZvbnROYW1lXT1cImNvbmZpZy5kZWZhdWx0Rm9udE5hbWVcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9udFNpemVdPVwiY29uZmlnLmRlZmF1bHRGb250U2l6ZVwiXG4gICAgICAgICAgW2hpZGRlbkJ1dHRvbnNdPVwiY29uZmlnLnRvb2xiYXJIaWRkZW5CdXR0b25zXCJcbiAgICAgICAgICAoZXhlY3V0ZSk9XCJleGVjdXRlQ29tbWFuZCgkZXZlbnQpXCJcbiAgICAgPlxuICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUJ1dHRvbnNUZW1wbGF0ZVJlZlwiXG4gICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBleGVjdXRlQ29tbWFuZEZuOiB0aGlzLmV4ZWN1dGVDb21tYW5kRm59XCJcbiAgICAgICA+XG4gICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgIDwvYW5ndWxhci1lZGl0b3ItdG9vbGJhcj5cblxuICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbmd1bGFyLWVkaXRvci13cmFwcGVyXCJcbiAgICAgICAgICAjZWRpdG9yV3JhcHBlclxuICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgI2VkaXRvclxuICAgICAgICAgICAgICAgY2xhc3M9XCJhbmd1bGFyLWVkaXRvci10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiY29uZmlnLmVkaXRhYmxlXCJcbiAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImRpc2FibGVkID8gLTEgOiB0YWJJbmRleFwiXG4gICAgICAgICAgICAgICBbYXR0ci50cmFuc2xhdGVdPVwiY29uZmlnLnRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICBbYXR0ci5zcGVsbGNoZWNrXT1cImNvbmZpZy5zcGVsbGNoZWNrXCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwiY29uZmlnLmhlaWdodFwiXG4gICAgICAgICAgICAgICBbc3R5bGUubWluSGVpZ2h0XT1cImNvbmZpZy5taW5IZWlnaHRcIlxuICAgICAgICAgICAgICAgW3N0eWxlLm1heEhlaWdodF09XCJjb25maWcubWF4SGVpZ2h0XCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5vdXRsaW5lXT1cImNvbmZpZy5vdXRsaW5lID09PSBmYWxzZSA/ICdub25lJzogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkNvbnRlbnRDaGFuZ2UoJGV2ZW50LnRhcmdldClcIlxuICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uVGV4dEFyZWFGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChibHVyKT1cIm9uVGV4dEFyZWFCbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4ZWMoKVwiXG4gICAgICAgICAgICAgICAoa2V5dXApPVwiZXhlYygpXCJcbiAgICAgICAgICAgICAgIChtb3VzZW91dCk9XCJvblRleHRBcmVhTW91c2VPdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbmd1bGFyLWVkaXRvci1wbGFjZWhvbGRlclwiPnt7IHBsYWNlaG9sZGVyIHx8IGNvbmZpZ1sncGxhY2Vob2xkZXInXSB9fTwvc3Bhbj5cbiAgICAgPC9kaXY+XG4gICAgIDxhbmd1bGFyLWVkaXRvci10b29sYmFyXG4gICAgICAgICAgKm5nSWY9XCJjb25maWcudG9vbGJhclBvc2l0aW9uID09PSAnYm90dG9tJ1wiXG4gICAgICAgICAgI2VkaXRvclRvb2xiYXJcbiAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgIFt1cGxvYWRVcmxdPVwiY29uZmlnLnVwbG9hZFVybFwiXG4gICAgICAgICAgW3VwbG9hZF09XCJjb25maWcudXBsb2FkXCJcbiAgICAgICAgICBbc2hvd1Rvb2xiYXJdPVwiY29uZmlnLnNob3dUb29sYmFyICE9PSB1bmRlZmluZWQgPyBjb25maWcuc2hvd1Rvb2xiYXIgOiB0cnVlXCJcbiAgICAgICAgICBbZm9udHNdPVwiZ2V0Rm9udHMoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzZXNdPVwiY29uZmlnLmN1c3RvbUNsYXNzZXNcIlxuICAgICAgICAgIFtkZWZhdWx0Rm9udE5hbWVdPVwiY29uZmlnLmRlZmF1bHRGb250TmFtZVwiXG4gICAgICAgICAgW2RlZmF1bHRGb250U2l6ZV09XCJjb25maWcuZGVmYXVsdEZvbnRTaXplXCJcbiAgICAgICAgICBbaGlkZGVuQnV0dG9uc109XCJjb25maWcudG9vbGJhckhpZGRlbkJ1dHRvbnNcIlxuICAgICAgICAgIChleGVjdXRlKT1cImV4ZWN1dGVDb21tYW5kKCRldmVudClcIlxuICAgICA+PC9hbmd1bGFyLWVkaXRvci10b29sYmFyPlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { AngularEditorComponent } from './angular-editor.component';
|
|
3
|
-
import { AngularEditorToolbarComponent } from './angular-editor-toolbar.component';
|
|
4
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
-
import { CommonModule } from '@angular/common';
|
|
6
|
-
import { AeSelectComponent } from './ae-select/ae-select.component';
|
|
7
|
-
import { AeButtonComponent } from "./ae-button/ae-button.component";
|
|
8
|
-
import { AeToolbarSetComponent } from './ae-toolbar-set/ae-toolbar-set.component';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class AngularEditorModule {
|
|
11
|
-
}
|
|
12
|
-
AngularEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AngularEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
13
|
-
AngularEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AngularEditorModule, declarations: [AngularEditorComponent, AngularEditorToolbarComponent, AeSelectComponent, AeButtonComponent, AeToolbarSetComponent], imports: [CommonModule, FormsModule, ReactiveFormsModule], exports: [AngularEditorComponent, AngularEditorToolbarComponent, AeButtonComponent, AeToolbarSetComponent] });
|
|
14
|
-
AngularEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AngularEditorModule, imports: [[
|
|
15
|
-
CommonModule, FormsModule, ReactiveFormsModule
|
|
16
|
-
]] });
|
|
17
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AngularEditorModule, decorators: [{
|
|
18
|
-
type: NgModule,
|
|
19
|
-
args: [{
|
|
20
|
-
imports: [
|
|
21
|
-
CommonModule, FormsModule, ReactiveFormsModule
|
|
22
|
-
],
|
|
23
|
-
declarations: [AngularEditorComponent, AngularEditorToolbarComponent, AeSelectComponent, AeButtonComponent, AeToolbarSetComponent],
|
|
24
|
-
exports: [AngularEditorComponent, AngularEditorToolbarComponent, AeButtonComponent, AeToolbarSetComponent]
|
|
25
|
-
}]
|
|
26
|
-
}] });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1lZGl0b3IubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1lZGl0b3Ivc3JjL2xpYi9hbmd1bGFyLWVkaXRvci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRixPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDOztBQVNsRixNQUFNLE9BQU8sbUJBQW1COztnSEFBbkIsbUJBQW1CO2lIQUFuQixtQkFBbUIsaUJBSGYsc0JBQXNCLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLGFBRi9ILFlBQVksRUFBRSxXQUFXLEVBQUUsbUJBQW1CLGFBR3RDLHNCQUFzQixFQUFFLDZCQUE2QixFQUFFLGlCQUFpQixFQUFFLHFCQUFxQjtpSEFFOUYsbUJBQW1CLFlBTnJCO1lBQ1AsWUFBWSxFQUFFLFdBQVcsRUFBRSxtQkFBbUI7U0FDL0M7MkZBSVUsbUJBQW1CO2tCQVAvQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQjtxQkFDL0M7b0JBQ0QsWUFBWSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUscUJBQXFCLENBQUM7b0JBQ2xJLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixFQUFFLDZCQUE2QixFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixDQUFDO2lCQUMzRyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBbmd1bGFyRWRpdG9yQ29tcG9uZW50fSBmcm9tICcuL2FuZ3VsYXItZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQge0FuZ3VsYXJFZGl0b3JUb29sYmFyQ29tcG9uZW50fSBmcm9tICcuL2FuZ3VsYXItZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7Rm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWVTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL2FlLXNlbGVjdC9hZS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7QWVCdXR0b25Db21wb25lbnR9IGZyb20gXCIuL2FlLWJ1dHRvbi9hZS1idXR0b24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBZVRvb2xiYXJTZXRDb21wb25lbnQgfSBmcm9tICcuL2FlLXRvb2xiYXItc2V0L2FlLXRvb2xiYXItc2V0LmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW0FuZ3VsYXJFZGl0b3JDb21wb25lbnQsIEFuZ3VsYXJFZGl0b3JUb29sYmFyQ29tcG9uZW50LCBBZVNlbGVjdENvbXBvbmVudCwgQWVCdXR0b25Db21wb25lbnQsIEFlVG9vbGJhclNldENvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtBbmd1bGFyRWRpdG9yQ29tcG9uZW50LCBBbmd1bGFyRWRpdG9yVG9vbGJhckNvbXBvbmVudCwgQWVCdXR0b25Db21wb25lbnQsIEFlVG9vbGJhclNldENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckVkaXRvck1vZHVsZSB7XG59XG4iXX0=
|