@skyux/text-editor 8.6.0 → 9.0.0-alpha.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/documentation.json +185 -105
- package/esm2022/lib/modules/rich-text-display/rich-text-display.component.mjs +42 -0
- package/{esm2020 → esm2022}/lib/modules/rich-text-display/rich-text-display.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/modules/shared/sky-text-editor-resources.module.mjs +11 -11
- package/esm2022/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +197 -0
- package/esm2022/lib/modules/text-editor/services/text-editor-adapter.service.mjs +431 -0
- package/{esm2020 → esm2022}/lib/modules/text-editor/services/text-editor-selection.service.mjs +4 -4
- package/esm2022/lib/modules/text-editor/services/text-editor.service.mjs +59 -0
- package/esm2022/lib/modules/text-editor/services/text-sanitization.service.mjs +38 -0
- package/esm2022/lib/modules/text-editor/text-editor.component.mjs +410 -0
- package/{esm2020 → esm2022}/lib/modules/text-editor/text-editor.module.mjs +41 -41
- package/esm2022/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +207 -0
- package/esm2022/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +119 -0
- package/fesm2022/skyux-text-editor.mjs +1828 -0
- package/fesm2022/skyux-text-editor.mjs.map +1 -0
- package/lib/modules/rich-text-display/rich-text-display.component.d.ts +1 -1
- package/lib/modules/text-editor/menubar/text-editor-menubar.component.d.ts +1 -1
- package/lib/modules/text-editor/text-editor.component.d.ts +4 -2
- package/lib/modules/text-editor/toolbar/text-editor-toolbar.component.d.ts +1 -1
- package/package.json +20 -26
- package/esm2020/lib/modules/rich-text-display/rich-text-display.component.mjs +0 -44
- package/esm2020/lib/modules/text-editor/menubar/text-editor-menubar.component.mjs +0 -197
- package/esm2020/lib/modules/text-editor/services/text-editor-adapter.service.mjs +0 -421
- package/esm2020/lib/modules/text-editor/services/text-editor.service.mjs +0 -64
- package/esm2020/lib/modules/text-editor/services/text-sanitization.service.mjs +0 -43
- package/esm2020/lib/modules/text-editor/text-editor.component.mjs +0 -382
- package/esm2020/lib/modules/text-editor/toolbar/text-editor-toolbar.component.mjs +0 -204
- package/esm2020/lib/modules/text-editor/url-modal/text-editor-url-modal.component.mjs +0 -118
- package/fesm2015/skyux-text-editor.mjs +0 -1781
- package/fesm2015/skyux-text-editor.mjs.map +0 -1
- package/fesm2020/skyux-text-editor.mjs +0 -1792
- package/fesm2020/skyux-text-editor.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/shared/forms-utility.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-list-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/font-size-list-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/menu-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/style-state-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/defaults/toolbar-action-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-command.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/editor-setting.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/font-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/menu-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/style-state.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/text-editor-merge-field.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/types/toolbar-action-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-modal-result.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/modules/text-editor/url-modal/text-editor-url-target.mjs +0 -0
- /package/{esm2020 → esm2022}/skyux-text-editor.mjs +0 -0
|
@@ -1,382 +0,0 @@
|
|
|
1
|
-
var _SkyTextEditorComponent_instances, _SkyTextEditorComponent_defaultId, _SkyTextEditorComponent_id, _SkyTextEditorComponent_focusInitialized, _SkyTextEditorComponent_initialized, _SkyTextEditorComponent_ngUnsubscribe, _SkyTextEditorComponent_changeDetector, _SkyTextEditorComponent_coreAdapterService, _SkyTextEditorComponent_adapterService, _SkyTextEditorComponent_editorService, _SkyTextEditorComponent_sanitizationService, _SkyTextEditorComponent_ngControl, _SkyTextEditorComponent_zone, _SkyTextEditorComponent__fontList, _SkyTextEditorComponent__fontSizeList, _SkyTextEditorComponent__mergeFields, _SkyTextEditorComponent__menus, _SkyTextEditorComponent__toolbarActions, _SkyTextEditorComponent__disabled, _SkyTextEditorComponent__initialStyleState, _SkyTextEditorComponent__placeholder, _SkyTextEditorComponent__value, _SkyTextEditorComponent_updateStyle, _SkyTextEditorComponent_initIframe, _SkyTextEditorComponent_viewToModelUpdate, _SkyTextEditorComponent__onTouched, _SkyTextEditorComponent__onChange;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
-
import { ChangeDetectionStrategy, Component, Input, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { takeUntil } from 'rxjs/operators';
|
|
6
|
-
import { SkyFormsUtility } from '../shared/forms-utility';
|
|
7
|
-
import { FONT_LIST_DEFAULTS } from './defaults/font-list-defaults';
|
|
8
|
-
import { FONT_SIZE_LIST_DEFAULTS } from './defaults/font-size-list-defaults';
|
|
9
|
-
import { MENU_DEFAULTS } from './defaults/menu-defaults';
|
|
10
|
-
import { STYLE_STATE_DEFAULTS } from './defaults/style-state-defaults';
|
|
11
|
-
import { TOOLBAR_ACTION_DEFAULTS } from './defaults/toolbar-action-defaults';
|
|
12
|
-
import { SkyTextEditorAdapterService } from './services/text-editor-adapter.service';
|
|
13
|
-
import { SkyTextEditorSelectionService } from './services/text-editor-selection.service';
|
|
14
|
-
import { SkyTextEditorService } from './services/text-editor.service';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@skyux/core";
|
|
17
|
-
import * as i2 from "./services/text-editor-adapter.service";
|
|
18
|
-
import * as i3 from "./services/text-editor.service";
|
|
19
|
-
import * as i4 from "./services/text-sanitization.service";
|
|
20
|
-
import * as i5 from "@angular/forms";
|
|
21
|
-
import * as i6 from "@angular/common";
|
|
22
|
-
import * as i7 from "@skyux/layout";
|
|
23
|
-
import * as i8 from "./toolbar/text-editor-toolbar.component";
|
|
24
|
-
import * as i9 from "./menubar/text-editor-menubar.component";
|
|
25
|
-
/**
|
|
26
|
-
* The text editor component lets users format and manipulate text.
|
|
27
|
-
*/
|
|
28
|
-
export class SkyTextEditorComponent {
|
|
29
|
-
/**
|
|
30
|
-
* Whether to disable the text editor on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
|
|
31
|
-
* To set the disabled state on reactive forms, use the `FormControl` instead.
|
|
32
|
-
* @default false
|
|
33
|
-
*/
|
|
34
|
-
set disabled(value) {
|
|
35
|
-
const coercedValue = SkyFormsUtility.coerceBooleanProperty(value);
|
|
36
|
-
if (coercedValue !== this.disabled) {
|
|
37
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__disabled, coercedValue, "f");
|
|
38
|
-
// Update focusableChildren inside the iframe.
|
|
39
|
-
let focusableChildren;
|
|
40
|
-
/* istanbul ignore else */
|
|
41
|
-
if (this.iframeRef) {
|
|
42
|
-
focusableChildren = __classPrivateFieldGet(this, _SkyTextEditorComponent_coreAdapterService, "f").getFocusableChildren(this.iframeRef.nativeElement.contentDocument.body, {
|
|
43
|
-
ignoreVisibility: true,
|
|
44
|
-
ignoreTabIndex: true,
|
|
45
|
-
});
|
|
46
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorComponent__disabled, "f")) {
|
|
47
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").disableEditor(focusableChildren, this.iframeRef.nativeElement);
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").enableEditor(focusableChildren, this.iframeRef.nativeElement);
|
|
51
|
-
}
|
|
52
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_changeDetector, "f").markForCheck();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
get disabled() {
|
|
57
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__disabled, "f");
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* The fonts to include in the font picker.
|
|
61
|
-
* @default [{name: 'Blackbaud Sans', value: '"Blackbaud Sans", Arial, sans-serif'}, {name: 'Arial', value: 'Arial'}, {name: 'Arial Black', value: '"Arial Black"'}, {name: 'Courier New', value: '"Courier New"'}, {name: 'Georgia', value: 'Georgia, serif'}, {name: 'Tahoma', value: 'Tahoma, Geneva, sans-serif'}, {name: 'Times New Roman', value: '"Times New Roman"'}, {name: 'Trebuchet MS', value: '"Trebuchet MS", sans-serif'}, {name: 'Verdana', value: 'Verdana, Geneva, sans-serif'}]
|
|
62
|
-
*/
|
|
63
|
-
set fontList(value) {
|
|
64
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__fontList, value || FONT_LIST_DEFAULTS, "f");
|
|
65
|
-
}
|
|
66
|
-
get fontList() {
|
|
67
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__fontList, "f");
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* The font sizes to include in the font size picker.
|
|
71
|
-
* @default [6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 36, 48]
|
|
72
|
-
*/
|
|
73
|
-
set fontSizeList(value) {
|
|
74
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__fontSizeList, value || FONT_SIZE_LIST_DEFAULTS, "f");
|
|
75
|
-
}
|
|
76
|
-
get fontSizeList() {
|
|
77
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__fontSizeList, "f");
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* The unique ID attribute for the text editor.
|
|
81
|
-
* By default, the component generates a random ID.
|
|
82
|
-
*/
|
|
83
|
-
set id(value) {
|
|
84
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_id, value || __classPrivateFieldGet(this, _SkyTextEditorComponent_defaultId, "f"), "f");
|
|
85
|
-
}
|
|
86
|
-
get id() {
|
|
87
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent_id, "f");
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* The initial styles for all content, including background color, font size, and link state.
|
|
91
|
-
*/
|
|
92
|
-
set initialStyleState(state) {
|
|
93
|
-
// Do not update the state after initialization has taken place
|
|
94
|
-
/* istanbul ignore else */
|
|
95
|
-
if (!__classPrivateFieldGet(this, _SkyTextEditorComponent_initialized, "f")) {
|
|
96
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__initialStyleState, {
|
|
97
|
-
...STYLE_STATE_DEFAULTS,
|
|
98
|
-
...state,
|
|
99
|
-
}, "f");
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
get initialStyleState() {
|
|
103
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__initialStyleState, "f");
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* The menus to include in the menu bar.
|
|
107
|
-
* @default [ 'edit', 'format' ]
|
|
108
|
-
*/
|
|
109
|
-
set menus(value) {
|
|
110
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__menus, value || MENU_DEFAULTS, "f");
|
|
111
|
-
}
|
|
112
|
-
get menus() {
|
|
113
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__menus, "f");
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* The merge fields to include in the merge field menu.
|
|
117
|
-
*/
|
|
118
|
-
set mergeFields(value) {
|
|
119
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__mergeFields, value || [], "f");
|
|
120
|
-
}
|
|
121
|
-
get mergeFields() {
|
|
122
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__mergeFields, "f");
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Placeholder text to display when the text entry area is empty.
|
|
126
|
-
*/
|
|
127
|
-
set placeholder(value) {
|
|
128
|
-
/* istanbul ignore else */
|
|
129
|
-
if (value !== __classPrivateFieldGet(this, _SkyTextEditorComponent__placeholder, "f")) {
|
|
130
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__placeholder, value || '', "f");
|
|
131
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorComponent_initialized, "f")) {
|
|
132
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").setPlaceholder(value);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
get placeholder() {
|
|
137
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__placeholder, "f");
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* The actions to include in the toolbar and determines their order.
|
|
141
|
-
* @default [ 'font-family', 'font-size', 'font-style', 'color', 'list', 'link ]
|
|
142
|
-
*/
|
|
143
|
-
set toolbarActions(value) {
|
|
144
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__toolbarActions, value || TOOLBAR_ACTION_DEFAULTS, "f");
|
|
145
|
-
}
|
|
146
|
-
get toolbarActions() {
|
|
147
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__toolbarActions, "f");
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* The internal value of the control.
|
|
151
|
-
*/
|
|
152
|
-
set value(value) {
|
|
153
|
-
// Normalize value and set any empty state to an empty string.
|
|
154
|
-
let normalizedValue;
|
|
155
|
-
const valueTrimmed = value?.trim();
|
|
156
|
-
if (!value ||
|
|
157
|
-
valueTrimmed === '<p></p>' ||
|
|
158
|
-
valueTrimmed === '<br>' ||
|
|
159
|
-
valueTrimmed === '<p><br></p>') {
|
|
160
|
-
normalizedValue = '';
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
normalizedValue = value;
|
|
164
|
-
}
|
|
165
|
-
normalizedValue = __classPrivateFieldGet(this, _SkyTextEditorComponent_sanitizationService, "f")
|
|
166
|
-
.sanitize(normalizedValue)
|
|
167
|
-
.trim();
|
|
168
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorComponent__value, "f") !== normalizedValue) {
|
|
169
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__value, normalizedValue, "f");
|
|
170
|
-
// Update angular form control if model has been normalized.
|
|
171
|
-
/* istanbul ignore else */
|
|
172
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorComponent_ngControl, "f")?.control &&
|
|
173
|
-
normalizedValue !== __classPrivateFieldGet(this, _SkyTextEditorComponent_ngControl, "f").control.value) {
|
|
174
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_ngControl, "f").control.setValue(normalizedValue, {
|
|
175
|
-
emitModelToViewChange: false,
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
// Autofocus isn't testable in Firefox and IE.
|
|
179
|
-
// Don't set focus on the editor now if the iframe isn't initialized.
|
|
180
|
-
// #initIframe() will do another check later to see if the editor should
|
|
181
|
-
// receive focus.
|
|
182
|
-
/* istanbul ignore next */
|
|
183
|
-
if (this.autofocus && __classPrivateFieldGet(this, _SkyTextEditorComponent_initialized, "f") && !__classPrivateFieldGet(this, _SkyTextEditorComponent_focusInitialized, "f")) {
|
|
184
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").focusEditor();
|
|
185
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_focusInitialized, true, "f");
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
get value() {
|
|
190
|
-
return __classPrivateFieldGet(this, _SkyTextEditorComponent__value, "f");
|
|
191
|
-
}
|
|
192
|
-
constructor(changeDetector, coreAdapterService, adapterService, editorService, sanitizationService, ngControl, zone, idSvc) {
|
|
193
|
-
_SkyTextEditorComponent_instances.add(this);
|
|
194
|
-
/**
|
|
195
|
-
* Whether to put focus on the editor after it renders.
|
|
196
|
-
*/
|
|
197
|
-
this.autofocus = false;
|
|
198
|
-
this.editorFocusStream = new Subject();
|
|
199
|
-
_SkyTextEditorComponent_defaultId.set(this, void 0);
|
|
200
|
-
_SkyTextEditorComponent_id.set(this, void 0);
|
|
201
|
-
_SkyTextEditorComponent_focusInitialized.set(this, false);
|
|
202
|
-
_SkyTextEditorComponent_initialized.set(this, false);
|
|
203
|
-
_SkyTextEditorComponent_ngUnsubscribe.set(this, new Subject());
|
|
204
|
-
_SkyTextEditorComponent_changeDetector.set(this, void 0);
|
|
205
|
-
_SkyTextEditorComponent_coreAdapterService.set(this, void 0);
|
|
206
|
-
_SkyTextEditorComponent_adapterService.set(this, void 0);
|
|
207
|
-
_SkyTextEditorComponent_editorService.set(this, void 0);
|
|
208
|
-
_SkyTextEditorComponent_sanitizationService.set(this, void 0);
|
|
209
|
-
_SkyTextEditorComponent_ngControl.set(this, void 0);
|
|
210
|
-
_SkyTextEditorComponent_zone.set(this, void 0);
|
|
211
|
-
_SkyTextEditorComponent__fontList.set(this, FONT_LIST_DEFAULTS);
|
|
212
|
-
_SkyTextEditorComponent__fontSizeList.set(this, FONT_SIZE_LIST_DEFAULTS);
|
|
213
|
-
_SkyTextEditorComponent__mergeFields.set(this, []);
|
|
214
|
-
_SkyTextEditorComponent__menus.set(this, MENU_DEFAULTS);
|
|
215
|
-
_SkyTextEditorComponent__toolbarActions.set(this, TOOLBAR_ACTION_DEFAULTS);
|
|
216
|
-
_SkyTextEditorComponent__disabled.set(this, false);
|
|
217
|
-
_SkyTextEditorComponent__initialStyleState.set(this, Object.assign({}, STYLE_STATE_DEFAULTS));
|
|
218
|
-
_SkyTextEditorComponent__placeholder.set(this, '');
|
|
219
|
-
_SkyTextEditorComponent__value.set(this, '<p></p>');
|
|
220
|
-
/* istanbul ignore next */
|
|
221
|
-
_SkyTextEditorComponent__onTouched.set(this, () => {
|
|
222
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
223
|
-
});
|
|
224
|
-
/* istanbul ignore next */
|
|
225
|
-
_SkyTextEditorComponent__onChange.set(this, () => {
|
|
226
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
227
|
-
});
|
|
228
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_changeDetector, changeDetector, "f");
|
|
229
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_coreAdapterService, coreAdapterService, "f");
|
|
230
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_adapterService, adapterService, "f");
|
|
231
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_editorService, editorService, "f");
|
|
232
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_sanitizationService, sanitizationService, "f");
|
|
233
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_ngControl, ngControl, "f");
|
|
234
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_zone, zone, "f");
|
|
235
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_id, __classPrivateFieldSet(this, _SkyTextEditorComponent_defaultId, idSvc.generateId(), "f"), "f");
|
|
236
|
-
ngControl.valueAccessor = this;
|
|
237
|
-
}
|
|
238
|
-
ngAfterViewInit() {
|
|
239
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_instances, "m", _SkyTextEditorComponent_initIframe).call(this);
|
|
240
|
-
}
|
|
241
|
-
ngOnDestroy() {
|
|
242
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").removeObservers(__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f").editor);
|
|
243
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f").next();
|
|
244
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f").complete();
|
|
245
|
-
}
|
|
246
|
-
onIframeLoad() {
|
|
247
|
-
// Reinitialize the editor if it already exists to cover situations where the text editor might have been moved in the DOM.
|
|
248
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f").isInitialized) {
|
|
249
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_instances, "m", _SkyTextEditorComponent_initIframe).call(this);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Implemented as part of ControlValueAccessor.
|
|
254
|
-
*/
|
|
255
|
-
writeValue(value) {
|
|
256
|
-
this.value = value;
|
|
257
|
-
// Update HTML if necessary.
|
|
258
|
-
if (__classPrivateFieldGet(this, _SkyTextEditorComponent_initialized, "f")) {
|
|
259
|
-
const editorValue = __classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").getEditorInnerHtml();
|
|
260
|
-
if (editorValue !== __classPrivateFieldGet(this, _SkyTextEditorComponent__value, "f")) {
|
|
261
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").setEditorInnerHtml(__classPrivateFieldGet(this, _SkyTextEditorComponent__value, "f"));
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Implemented as part of ControlValueAccessor.
|
|
267
|
-
*/
|
|
268
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
269
|
-
registerOnChange(fn) {
|
|
270
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__onChange, fn, "f");
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Implemented as part of ControlValueAccessor.
|
|
274
|
-
*/
|
|
275
|
-
registerOnTouched(fn) {
|
|
276
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__onTouched, fn, "f");
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* Implemented as part of ControlValueAccessor.
|
|
280
|
-
*/
|
|
281
|
-
setDisabledState(isDisabled) {
|
|
282
|
-
this.disabled = isDisabled;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
_SkyTextEditorComponent_defaultId = new WeakMap(), _SkyTextEditorComponent_id = new WeakMap(), _SkyTextEditorComponent_focusInitialized = new WeakMap(), _SkyTextEditorComponent_initialized = new WeakMap(), _SkyTextEditorComponent_ngUnsubscribe = new WeakMap(), _SkyTextEditorComponent_changeDetector = new WeakMap(), _SkyTextEditorComponent_coreAdapterService = new WeakMap(), _SkyTextEditorComponent_adapterService = new WeakMap(), _SkyTextEditorComponent_editorService = new WeakMap(), _SkyTextEditorComponent_sanitizationService = new WeakMap(), _SkyTextEditorComponent_ngControl = new WeakMap(), _SkyTextEditorComponent_zone = new WeakMap(), _SkyTextEditorComponent__fontList = new WeakMap(), _SkyTextEditorComponent__fontSizeList = new WeakMap(), _SkyTextEditorComponent__mergeFields = new WeakMap(), _SkyTextEditorComponent__menus = new WeakMap(), _SkyTextEditorComponent__toolbarActions = new WeakMap(), _SkyTextEditorComponent__disabled = new WeakMap(), _SkyTextEditorComponent__initialStyleState = new WeakMap(), _SkyTextEditorComponent__placeholder = new WeakMap(), _SkyTextEditorComponent__value = new WeakMap(), _SkyTextEditorComponent__onTouched = new WeakMap(), _SkyTextEditorComponent__onChange = new WeakMap(), _SkyTextEditorComponent_instances = new WeakSet(), _SkyTextEditorComponent_updateStyle = function _SkyTextEditorComponent_updateStyle() {
|
|
286
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent__initialStyleState, {
|
|
287
|
-
...__classPrivateFieldGet(this, _SkyTextEditorComponent__initialStyleState, "f"),
|
|
288
|
-
...__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").getStyleState(),
|
|
289
|
-
}, "f");
|
|
290
|
-
}, _SkyTextEditorComponent_initIframe = function _SkyTextEditorComponent_initIframe() {
|
|
291
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").initEditor(this.id, this.iframeRef.nativeElement, this.initialStyleState, this.placeholder);
|
|
292
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f")
|
|
293
|
-
.inputListener()
|
|
294
|
-
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f")))
|
|
295
|
-
.subscribe(() => {
|
|
296
|
-
// Angular doesn't run change detection for changes originating inside an iframe,
|
|
297
|
-
// so we have to call the onChange() event inside NgZone to force change propagation to consuming components.
|
|
298
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_zone, "f").run(() => {
|
|
299
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_instances, "m", _SkyTextEditorComponent_viewToModelUpdate).call(this);
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f")
|
|
303
|
-
.selectionChangeListener()
|
|
304
|
-
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f")))
|
|
305
|
-
.subscribe(() => {
|
|
306
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_instances, "m", _SkyTextEditorComponent_updateStyle).call(this);
|
|
307
|
-
this.editorFocusStream.next();
|
|
308
|
-
});
|
|
309
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f")
|
|
310
|
-
.clickListener()
|
|
311
|
-
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f")))
|
|
312
|
-
.subscribe(() => {
|
|
313
|
-
this.editorFocusStream.next();
|
|
314
|
-
});
|
|
315
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f")
|
|
316
|
-
.blurListener()
|
|
317
|
-
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f")))
|
|
318
|
-
.subscribe(() => {
|
|
319
|
-
// Angular doesn't run change detection for changes originating inside an iframe,
|
|
320
|
-
// so we have to run markForCheck() inside the NgZone to force change propagation to consuming components.
|
|
321
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_zone, "f").run(() => {
|
|
322
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent__onTouched, "f").call(this);
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_editorService, "f")
|
|
326
|
-
.commandChangeListener()
|
|
327
|
-
.pipe(takeUntil(__classPrivateFieldGet(this, _SkyTextEditorComponent_ngUnsubscribe, "f")))
|
|
328
|
-
.subscribe(() => {
|
|
329
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_instances, "m", _SkyTextEditorComponent_updateStyle).call(this);
|
|
330
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_instances, "m", _SkyTextEditorComponent_viewToModelUpdate).call(this);
|
|
331
|
-
});
|
|
332
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").setEditorInnerHtml(__classPrivateFieldGet(this, _SkyTextEditorComponent__value, "f"));
|
|
333
|
-
/* istanbul ignore next */
|
|
334
|
-
if (this.autofocus) {
|
|
335
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").focusEditor();
|
|
336
|
-
}
|
|
337
|
-
__classPrivateFieldSet(this, _SkyTextEditorComponent_initialized, true, "f");
|
|
338
|
-
}, _SkyTextEditorComponent_viewToModelUpdate = function _SkyTextEditorComponent_viewToModelUpdate(emitChange = true) {
|
|
339
|
-
this.value = __classPrivateFieldGet(this, _SkyTextEditorComponent_adapterService, "f").getEditorInnerHtml();
|
|
340
|
-
/* istanbul ignore else */
|
|
341
|
-
if (emitChange) {
|
|
342
|
-
__classPrivateFieldGet(this, _SkyTextEditorComponent__onChange, "f").call(this, __classPrivateFieldGet(this, _SkyTextEditorComponent__value, "f"));
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
SkyTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyCoreAdapterService }, { token: i2.SkyTextEditorAdapterService }, { token: i3.SkyTextEditorService }, { token: i4.SkyTextSanitizationService }, { token: i5.NgControl }, { token: i0.NgZone }, { token: i1.SkyIdService }], target: i0.ɵɵFactoryTarget.Component });
|
|
346
|
-
SkyTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: SkyTextEditorComponent, selector: "sky-text-editor", inputs: { autofocus: "autofocus", disabled: "disabled", fontList: "fontList", fontSizeList: "fontSizeList", id: "id", initialStyleState: "initialStyleState", menus: "menus", mergeFields: "mergeFields", placeholder: "placeholder", toolbarActions: "toolbarActions" }, providers: [
|
|
347
|
-
SkyTextEditorService,
|
|
348
|
-
SkyTextEditorSelectionService,
|
|
349
|
-
SkyTextEditorAdapterService,
|
|
350
|
-
], viewQueries: [{ propertyName: "iframeRef", first: true, predicate: ["iframe"], descendants: true }], ngImport: i0, template: "<div class=\"sky-text-editor\">\n <sky-toolbar\n *ngIf=\"\n (menus && menus.length) > 0 ||\n (toolbarActions && toolbarActions.length > 0)\n \"\n class=\"sky-text-editor-toolbar\"\n >\n <sky-toolbar-section\n *ngIf=\"menus && menus.length > 0\"\n aria-label=\"Text formatting\"\n class=\"menubar\"\n role=\"toolbar\"\n >\n <sky-text-editor-menubar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [menus]=\"menus\"\n [mergeFields]=\"mergeFields\"\n >\n </sky-text-editor-menubar>\n </sky-toolbar-section>\n <sky-toolbar-section\n *ngIf=\"toolbarActions && toolbarActions.length > 0\"\n aria-label=\"Text formatting\"\n class=\"toolbar\"\n role=\"toolbar\"\n >\n <sky-text-editor-toolbar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [fontList]=\"fontList\"\n [fontSizeList]=\"fontSizeList\"\n [toolbarActions]=\"toolbarActions\"\n [styleState]=\"initialStyleState\"\n >\n </sky-text-editor-toolbar>\n </sky-toolbar-section>\n </sky-toolbar>\n <iframe\n class=\"sky-text-editor-wrapper\"\n src=\"about:blank\"\n title=\"Text Editor\"\n [ngClass]=\"{\n 'sky-text-editor-wrapper-disabled': disabled\n }\"\n (load)=\"onIframeLoad()\"\n #iframe\n >\n </iframe>\n</div>\n", styles: [".sky-text-editor .sky-text-editor-wrapper{display:flex;flex-wrap:wrap;background-color:#fff;width:100%;height:300px;padding:1rem;font-size:1.2rem;border:1px solid #c0c0c0;overflow-y:auto;outline:none}.sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ededee}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-left:1px solid #cdcfd2!important;border-right:1px solid #cdcfd2!important}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-dropdown-button{border:none}.sky-text-editor .sky-text-editor-toolbar sky-text-editor-menubar,.sky-text-editor .sky-text-editor-toolbar sky-text-editor-toolbar{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper{border:1px solid #d2d2d2}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ececed}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar{padding:10px 10px 0}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-top:1px solid #d2d2d2!important;border-left:1px solid #d2d2d2!important;border-right:1px solid #d2d2d2!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 0 0!important}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.λ37, selector: "sky-toolbar" }, { kind: "component", type: i7.λ38, selector: "sky-toolbar-section" }, { kind: "component", type: i8.SkyTextEditorToolbarComponent, selector: "sky-text-editor-toolbar", inputs: ["editorFocusStream", "fontList", "fontSizeList", "toolbarActions", "styleState", "disabled"] }, { kind: "component", type: i9.SkyTextEditorMenubarComponent, selector: "sky-text-editor-menubar", inputs: ["editorFocusStream", "menus", "mergeFields", "disabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
351
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SkyTextEditorComponent, decorators: [{
|
|
352
|
-
type: Component,
|
|
353
|
-
args: [{ selector: 'sky-text-editor', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
354
|
-
SkyTextEditorService,
|
|
355
|
-
SkyTextEditorSelectionService,
|
|
356
|
-
SkyTextEditorAdapterService,
|
|
357
|
-
], template: "<div class=\"sky-text-editor\">\n <sky-toolbar\n *ngIf=\"\n (menus && menus.length) > 0 ||\n (toolbarActions && toolbarActions.length > 0)\n \"\n class=\"sky-text-editor-toolbar\"\n >\n <sky-toolbar-section\n *ngIf=\"menus && menus.length > 0\"\n aria-label=\"Text formatting\"\n class=\"menubar\"\n role=\"toolbar\"\n >\n <sky-text-editor-menubar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [menus]=\"menus\"\n [mergeFields]=\"mergeFields\"\n >\n </sky-text-editor-menubar>\n </sky-toolbar-section>\n <sky-toolbar-section\n *ngIf=\"toolbarActions && toolbarActions.length > 0\"\n aria-label=\"Text formatting\"\n class=\"toolbar\"\n role=\"toolbar\"\n >\n <sky-text-editor-toolbar\n [disabled]=\"disabled\"\n [editorFocusStream]=\"editorFocusStream\"\n [fontList]=\"fontList\"\n [fontSizeList]=\"fontSizeList\"\n [toolbarActions]=\"toolbarActions\"\n [styleState]=\"initialStyleState\"\n >\n </sky-text-editor-toolbar>\n </sky-toolbar-section>\n </sky-toolbar>\n <iframe\n class=\"sky-text-editor-wrapper\"\n src=\"about:blank\"\n title=\"Text Editor\"\n [ngClass]=\"{\n 'sky-text-editor-wrapper-disabled': disabled\n }\"\n (load)=\"onIframeLoad()\"\n #iframe\n >\n </iframe>\n</div>\n", styles: [".sky-text-editor .sky-text-editor-wrapper{display:flex;flex-wrap:wrap;background-color:#fff;width:100%;height:300px;padding:1rem;font-size:1.2rem;border:1px solid #c0c0c0;overflow-y:auto;outline:none}.sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ededee}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-left:1px solid #cdcfd2!important;border-right:1px solid #cdcfd2!important}.sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 10px 0}.sky-text-editor .sky-text-editor-toolbar .sky-dropdown-button{border:none}.sky-text-editor .sky-text-editor-toolbar sky-text-editor-menubar,.sky-text-editor .sky-text-editor-toolbar sky-text-editor-toolbar{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper{border:1px solid #d2d2d2}.sky-theme-modern .sky-text-editor .sky-text-editor-wrapper.sky-text-editor-wrapper-disabled{background-color:#ececed}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar{padding:10px 10px 0}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-section{padding:10px!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-sectioned{border-top:1px solid #d2d2d2!important;border-left:1px solid #d2d2d2!important;border-right:1px solid #d2d2d2!important}.sky-theme-modern .sky-text-editor .sky-text-editor-toolbar .sky-toolbar-item{margin:0 20px 0 0!important}\n"] }]
|
|
358
|
-
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.SkyCoreAdapterService }, { type: i2.SkyTextEditorAdapterService }, { type: i3.SkyTextEditorService }, { type: i4.SkyTextSanitizationService }, { type: i5.NgControl }, { type: i0.NgZone }, { type: i1.SkyIdService }]; }, propDecorators: { autofocus: [{
|
|
359
|
-
type: Input
|
|
360
|
-
}], disabled: [{
|
|
361
|
-
type: Input
|
|
362
|
-
}], fontList: [{
|
|
363
|
-
type: Input
|
|
364
|
-
}], fontSizeList: [{
|
|
365
|
-
type: Input
|
|
366
|
-
}], id: [{
|
|
367
|
-
type: Input
|
|
368
|
-
}], initialStyleState: [{
|
|
369
|
-
type: Input
|
|
370
|
-
}], menus: [{
|
|
371
|
-
type: Input
|
|
372
|
-
}], mergeFields: [{
|
|
373
|
-
type: Input
|
|
374
|
-
}], placeholder: [{
|
|
375
|
-
type: Input
|
|
376
|
-
}], toolbarActions: [{
|
|
377
|
-
type: Input
|
|
378
|
-
}], iframeRef: [{
|
|
379
|
-
type: ViewChild,
|
|
380
|
-
args: ['iframe']
|
|
381
|
-
}] } });
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3RleHQtZWRpdG9yL3NyYy9saWIvbW9kdWxlcy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvdGV4dC1lZGl0b3Ivc3JjL2xpYi9tb2R1bGVzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBRVQsS0FBSyxFQUdMLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN6RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7Ozs7QUFR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QSxJQUFJLHNDQUFRLENBQUMsQ0FBQztLQUMvQjtBQUNILENBQUM7bUhBaFpVLHNCQUFzQjt1R0FBdEIsc0JBQXNCLG9UQU50QjtRQUNULG9CQUFvQjtRQUNwQiw2QkFBNkI7UUFDN0IsMkJBQTJCO0tBQzVCLCtIQ2hESCxpNUNBbURBOzJGRERhLHNCQUFzQjtrQkFabEMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxhQUMxQjt3QkFDVCxvQkFBb0I7d0JBQ3BCLDZCQUE2Qjt3QkFDN0IsMkJBQTJCO3FCQUM1QjswVUFPTSxTQUFTO3NCQURmLEtBQUs7Z0JBU0ssUUFBUTtzQkFEbEIsS0FBSztnQkEyQ0ssUUFBUTtzQkFEbEIsS0FBSztnQkFjSyxZQUFZO3NCQUR0QixLQUFLO2dCQWNLLEVBQUU7c0JBRFosS0FBSztnQkFhSyxpQkFBaUI7c0JBRDNCLEtBQUs7Z0JBcUJLLEtBQUs7c0JBRGYsS0FBSztnQkFhSyxXQUFXO3NCQURyQixLQUFLO2dCQWFLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBb0JLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBWUMsU0FBUztzQkFEZixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNreUNvcmVBZGFwdGVyU2VydmljZSwgU2t5SWRTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreUZvcm1zVXRpbGl0eSB9IGZyb20gJy4uL3NoYXJlZC9mb3Jtcy11dGlsaXR5JztcblxuaW1wb3J0IHsgRk9OVF9MSVNUX0RFRkFVTFRTIH0gZnJvbSAnLi9kZWZhdWx0cy9mb250LWxpc3QtZGVmYXVsdHMnO1xuaW1wb3J0IHsgRk9OVF9TSVpFX0xJU1RfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL2ZvbnQtc2l6ZS1saXN0LWRlZmF1bHRzJztcbmltcG9ydCB7IE1FTlVfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL21lbnUtZGVmYXVsdHMnO1xuaW1wb3J0IHsgU1RZTEVfU1RBVEVfREVGQVVMVFMgfSBmcm9tICcuL2RlZmF1bHRzL3N0eWxlLXN0YXRlLWRlZmF1bHRzJztcbmltcG9ydCB7IFRPT0xCQVJfQUNUSU9OX0RFRkFVTFRTIH0gZnJvbSAnLi9kZWZhdWx0cy90b29sYmFyLWFjdGlvbi1kZWZhdWx0cyc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RleHQtZWRpdG9yLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdGV4dC1lZGl0b3Itc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RleHQtZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5VGV4dFNhbml0aXphdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RleHQtc2FuaXRpemF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvckZvbnQgfSBmcm9tICcuL3R5cGVzL2ZvbnQtc3RhdGUnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvck1lbnVUeXBlIH0gZnJvbSAnLi90eXBlcy9tZW51LXR5cGUnO1xuaW1wb3J0IHsgU2t5VGV4dEVkaXRvclN0eWxlU3RhdGUgfSBmcm9tICcuL3R5cGVzL3N0eWxlLXN0YXRlJztcbmltcG9ydCB7IFNreVRleHRFZGl0b3JNZXJnZUZpZWxkIH0gZnJvbSAnLi90eXBlcy90ZXh0LWVkaXRvci1tZXJnZS1maWVsZCc7XG5pbXBvcnQgeyBTa3lUZXh0RWRpdG9yVG9vbGJhckFjdGlvblR5cGUgfSBmcm9tICcuL3R5cGVzL3Rvb2xiYXItYWN0aW9uLXR5cGUnO1xuXG4vKipcbiAqIFRoZSB0ZXh0IGVkaXRvciBjb21wb25lbnQgbGV0cyB1c2VycyBmb3JtYXQgYW5kIG1hbmlwdWxhdGUgdGV4dC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRleHQtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1xuICAgIFNreVRleHRFZGl0b3JTZXJ2aWNlLFxuICAgIFNreVRleHRFZGl0b3JTZWxlY3Rpb25TZXJ2aWNlLFxuICAgIFNreVRleHRFZGl0b3JBZGFwdGVyU2VydmljZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5VGV4dEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1dCBmb2N1cyBvbiB0aGUgZWRpdG9yIGFmdGVyIGl0IHJlbmRlcnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXV0b2ZvY3VzOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgdGV4dCBlZGl0b3Igb24gdGVtcGxhdGUtZHJpdmVuIGZvcm1zLiBEb24ndCB1c2UgdGhpcyBpbnB1dCBvbiByZWFjdGl2ZSBmb3JtcyBiZWNhdXNlIHRoZXkgbWF5IG92ZXJ3cml0ZSB0aGUgaW5wdXQgb3IgbGVhdmUgdGhlIGNvbnRyb2wgb3V0IG9mIHN5bmMuXG4gICAqIFRvIHNldCB0aGUgZGlzYWJsZWQgc3RhdGUgb24gcmVhY3RpdmUgZm9ybXMsIHVzZSB0aGUgYEZvcm1Db250cm9sYCBpbnN0ZWFkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNvZXJjZWRWYWx1ZSA9IFNreUZvcm1zVXRpbGl0eS5jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmIChjb2VyY2VkVmFsdWUgIT09IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuI19kaXNhYmxlZCA9IGNvZXJjZWRWYWx1ZTtcblxuICAgICAgLy8gVXBkYXRlIGZvY3VzYWJsZUNoaWxkcmVuIGluc2lkZSB0aGUgaWZyYW1lLlxuICAgICAgbGV0IGZvY3VzYWJsZUNoaWxkcmVuOiBIVE1MRWxlbWVudFtdO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0aGlzLmlmcmFtZVJlZikge1xuICAgICAgICBmb2N1c2FibGVDaGlsZHJlbiA9IHRoaXMuI2NvcmVBZGFwdGVyU2VydmljZS5nZXRGb2N1c2FibGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLmlmcmFtZVJlZi5uYXRpdmVFbGVtZW50LmNvbnRlbnREb2N1bWVudC5ib2R5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlnbm9yZVZpc2liaWxpdHk6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVUYWJJbmRleDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuI19kaXNhYmxlZCkge1xuICAgICAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmRpc2FibGVFZGl0b3IoXG4gICAgICAgICAgICBmb2N1c2FibGVDaGlsZHJlbixcbiAgICAgICAgICAgIHRoaXMuaWZyYW1lUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmVuYWJsZUVkaXRvcihcbiAgICAgICAgICAgIGZvY3VzYWJsZUNoaWxkcmVuLFxuICAgICAgICAgICAgdGhpcy5pZnJhbWVSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb250cyB0byBpbmNsdWRlIGluIHRoZSBmb250IHBpY2tlci5cbiAgICogQGRlZmF1bHQgW3tuYW1lOiAnQmxhY2tiYXVkIFNhbnMnLCB2YWx1ZTogJ1wiQmxhY2tiYXVkIFNhbnNcIiwgQXJpYWwsIHNhbnMtc2VyaWYnfSwge25hbWU6ICdBcmlhbCcsIHZhbHVlOiAnQXJpYWwnfSwge25hbWU6ICdBcmlhbCBCbGFjaycsIHZhbHVlOiAnXCJBcmlhbCBCbGFja1wiJ30sIHtuYW1lOiAnQ291cmllciBOZXcnLCB2YWx1ZTogJ1wiQ291cmllciBOZXdcIid9LCB7bmFtZTogJ0dlb3JnaWEnLCB2YWx1ZTogJ0dlb3JnaWEsIHNlcmlmJ30sIHtuYW1lOiAnVGFob21hJywgdmFsdWU6ICdUYWhvbWEsIEdlbmV2YSwgc2Fucy1zZXJpZid9LCB7bmFtZTogJ1RpbWVzIE5ldyBSb21hbicsIHZhbHVlOiAnXCJUaW1lcyBOZXcgUm9tYW5cIid9LCB7bmFtZTogJ1RyZWJ1Y2hldCBNUycsIHZhbHVlOiAnXCJUcmVidWNoZXQgTVNcIiwgc2Fucy1zZXJpZid9LCB7bmFtZTogJ1ZlcmRhbmEnLCB2YWx1ZTogJ1ZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZid9XVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBmb250TGlzdCh2YWx1ZTogU2t5VGV4dEVkaXRvckZvbnRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19mb250TGlzdCA9IHZhbHVlIHx8IEZPTlRfTElTVF9ERUZBVUxUUztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9udExpc3QoKTogU2t5VGV4dEVkaXRvckZvbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19mb250TGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBzaXplcyB0byBpbmNsdWRlIGluIHRoZSBmb250IHNpemUgcGlja2VyLlxuICAgKiBAZGVmYXVsdCBbNiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDM2LCA0OF1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZm9udFNpemVMaXN0KHZhbHVlOiBudW1iZXJbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19mb250U2l6ZUxpc3QgPSB2YWx1ZSB8fCBGT05UX1NJWkVfTElTVF9ERUZBVUxUUztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9udFNpemVMaXN0KCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy4jX2ZvbnRTaXplTGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIElEIGF0dHJpYnV0ZSBmb3IgdGhlIHRleHQgZWRpdG9yLlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgY29tcG9uZW50IGdlbmVyYXRlcyBhIHJhbmRvbSBJRC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2lkID0gdmFsdWUgfHwgdGhpcy4jZGVmYXVsdElkO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzdHlsZXMgZm9yIGFsbCBjb250ZW50LCBpbmNsdWRpbmcgYmFja2dyb3VuZCBjb2xvciwgZm9udCBzaXplLCBhbmQgbGluayBzdGF0ZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaW5pdGlhbFN0eWxlU3RhdGUoc3RhdGU6IFNreVRleHRFZGl0b3JTdHlsZVN0YXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgc3RhdGUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIHRha2VuIHBsYWNlXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXRoaXMuI2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLiNfaW5pdGlhbFN0eWxlU3RhdGUgPSB7XG4gICAgICAgIC4uLlNUWUxFX1NUQVRFX0RFRkFVTFRTLFxuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbml0aWFsU3R5bGVTdGF0ZSgpOiBTa3lUZXh0RWRpdG9yU3R5bGVTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuI19pbml0aWFsU3R5bGVTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWVudXMgdG8gaW5jbHVkZSBpbiB0aGUgbWVudSBiYXIuXG4gICAqIEBkZWZhdWx0IFsgJ2VkaXQnLCAnZm9ybWF0JyBdXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1lbnVzKHZhbHVlOiBTa3lUZXh0RWRpdG9yTWVudVR5cGVbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19tZW51cyA9IHZhbHVlIHx8IE1FTlVfREVGQVVMVFM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lbnVzKCk6IFNreVRleHRFZGl0b3JNZW51VHlwZVtdIHtcbiAgICByZXR1cm4gdGhpcy4jX21lbnVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZXJnZSBmaWVsZHMgdG8gaW5jbHVkZSBpbiB0aGUgbWVyZ2UgZmllbGQgbWVudS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWVyZ2VGaWVsZHModmFsdWU6IFNreVRleHRFZGl0b3JNZXJnZUZpZWxkW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfbWVyZ2VGaWVsZHMgPSB2YWx1ZSB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWVyZ2VGaWVsZHMoKTogU2t5VGV4dEVkaXRvck1lcmdlRmllbGRbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19tZXJnZUZpZWxkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGFjZWhvbGRlciB0ZXh0IHRvIGRpc3BsYXkgd2hlbiB0aGUgdGV4dCBlbnRyeSBhcmVhIGlzIGVtcHR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodmFsdWUgIT09IHRoaXMuI19wbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy4jX3BsYWNlaG9sZGVyID0gdmFsdWUgfHwgJyc7XG4gICAgICBpZiAodGhpcy4jaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2V0UGxhY2Vob2xkZXIodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jX3BsYWNlaG9sZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHRvb2xiYXIgYW5kIGRldGVybWluZXMgdGhlaXIgb3JkZXIuXG4gICAqIEBkZWZhdWx0IFsgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXN0eWxlJywgJ2NvbG9yJywgJ2xpc3QnLCAnbGluayBdXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRvb2xiYXJBY3Rpb25zKFxuICAgIHZhbHVlOiBTa3lUZXh0RWRpdG9yVG9vbGJhckFjdGlvblR5cGVbXSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLiNfdG9vbGJhckFjdGlvbnMgPSB2YWx1ZSB8fCBUT09MQkFSX0FDVElPTl9ERUZBVUxUUztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9vbGJhckFjdGlvbnMoKTogU2t5VGV4dEVkaXRvclRvb2xiYXJBY3Rpb25UeXBlW10ge1xuICAgIHJldHVybiB0aGlzLiNfdG9vbGJhckFjdGlvbnM7XG4gIH1cblxuICBAVmlld0NoaWxkKCdpZnJhbWUnKVxuICBwdWJsaWMgaWZyYW1lUmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgdmFsdWUgb2YgdGhlIGNvbnRyb2wuXG4gICAqL1xuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAvLyBOb3JtYWxpemUgdmFsdWUgYW5kIHNldCBhbnkgZW1wdHkgc3RhdGUgdG8gYW4gZW1wdHkgc3RyaW5nLlxuICAgIGxldCBub3JtYWxpemVkVmFsdWU6IHN0cmluZztcbiAgICBjb25zdCB2YWx1ZVRyaW1tZWQgPSB2YWx1ZT8udHJpbSgpO1xuXG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB2YWx1ZVRyaW1tZWQgPT09ICc8cD48L3A+JyB8fFxuICAgICAgdmFsdWVUcmltbWVkID09PSAnPGJyPicgfHxcbiAgICAgIHZhbHVlVHJpbW1lZCA9PT0gJzxwPjxicj48L3A+J1xuICAgICkge1xuICAgICAgbm9ybWFsaXplZFZhbHVlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IHRoaXMuI3Nhbml0aXphdGlvblNlcnZpY2VcbiAgICAgIC5zYW5pdGl6ZShub3JtYWxpemVkVmFsdWUpXG4gICAgICAudHJpbSgpO1xuXG4gICAgaWYgKHRoaXMuI192YWx1ZSAhPT0gbm9ybWFsaXplZFZhbHVlKSB7XG4gICAgICB0aGlzLiNfdmFsdWUgPSBub3JtYWxpemVkVmFsdWU7XG5cbiAgICAgIC8vIFVwZGF0ZSBhbmd1bGFyIGZvcm0gY29udHJvbCBpZiBtb2RlbCBoYXMgYmVlbiBub3JtYWxpemVkLlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy4jbmdDb250cm9sPy5jb250cm9sICYmXG4gICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSAhPT0gdGhpcy4jbmdDb250cm9sLmNvbnRyb2wudmFsdWVcbiAgICAgICkge1xuICAgICAgICB0aGlzLiNuZ0NvbnRyb2wuY29udHJvbC5zZXRWYWx1ZShub3JtYWxpemVkVmFsdWUsIHtcbiAgICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXV0b2ZvY3VzIGlzbid0IHRlc3RhYmxlIGluIEZpcmVmb3ggYW5kIElFLlxuICAgICAgLy8gRG9uJ3Qgc2V0IGZvY3VzIG9uIHRoZSBlZGl0b3Igbm93IGlmIHRoZSBpZnJhbWUgaXNuJ3QgaW5pdGlhbGl6ZWQuXG4gICAgICAvLyAjaW5pdElmcmFtZSgpIHdpbGwgZG8gYW5vdGhlciBjaGVjayBsYXRlciB0byBzZWUgaWYgdGhlIGVkaXRvciBzaG91bGRcbiAgICAgIC8vIHJlY2VpdmUgZm9jdXMuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKHRoaXMuYXV0b2ZvY3VzICYmIHRoaXMuI2luaXRpYWxpemVkICYmICF0aGlzLiNmb2N1c0luaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmZvY3VzRWRpdG9yKCk7XG4gICAgICAgIHRoaXMuI2ZvY3VzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGVkaXRvckZvY3VzU3RyZWFtID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAjZGVmYXVsdElkOiBzdHJpbmc7XG4gICNpZDogc3RyaW5nO1xuICAjZm9jdXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAjaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjY29yZUFkYXB0ZXJTZXJ2aWNlOiBTa3lDb3JlQWRhcHRlclNlcnZpY2U7XG4gICNhZGFwdGVyU2VydmljZTogU2t5VGV4dEVkaXRvckFkYXB0ZXJTZXJ2aWNlO1xuICAjZWRpdG9yU2VydmljZTogU2t5VGV4dEVkaXRvclNlcnZpY2U7XG4gICNzYW5pdGl6YXRpb25TZXJ2aWNlOiBTa3lUZXh0U2FuaXRpemF0aW9uU2VydmljZTtcbiAgI25nQ29udHJvbDogTmdDb250cm9sO1xuICAjem9uZTogTmdab25lO1xuXG4gICNfZm9udExpc3QgPSBGT05UX0xJU1RfREVGQVVMVFM7XG4gICNfZm9udFNpemVMaXN0ID0gRk9OVF9TSVpFX0xJU1RfREVGQVVMVFM7XG4gICNfbWVyZ2VGaWVsZHM6IFNreVRleHRFZGl0b3JNZXJnZUZpZWxkW10gPSBbXTtcbiAgI19tZW51cyA9IE1FTlVfREVGQVVMVFM7XG4gICNfdG9vbGJhckFjdGlvbnM6IFNreVRleHRFZGl0b3JUb29sYmFyQWN0aW9uVHlwZVtdID0gVE9PTEJBUl9BQ1RJT05fREVGQVVMVFM7XG4gICNfZGlzYWJsZWQgPSBmYWxzZTtcbiAgI19pbml0aWFsU3R5bGVTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIFNUWUxFX1NUQVRFX0RFRkFVTFRTKTtcbiAgI19wbGFjZWhvbGRlciA9ICcnO1xuICAjX3ZhbHVlID0gJzxwPjwvcD4nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBjb3JlQWRhcHRlclNlcnZpY2U6IFNreUNvcmVBZGFwdGVyU2VydmljZSxcbiAgICBhZGFwdGVyU2VydmljZTogU2t5VGV4dEVkaXRvckFkYXB0ZXJTZXJ2aWNlLFxuICAgIGVkaXRvclNlcnZpY2U6IFNreVRleHRFZGl0b3JTZXJ2aWNlLFxuICAgIHNhbml0aXphdGlvblNlcnZpY2U6IFNreVRleHRTYW5pdGl6YXRpb25TZXJ2aWNlLFxuICAgIG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBpZFN2YzogU2t5SWRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jY29yZUFkYXB0ZXJTZXJ2aWNlID0gY29yZUFkYXB0ZXJTZXJ2aWNlO1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlID0gYWRhcHRlclNlcnZpY2U7XG4gICAgdGhpcy4jZWRpdG9yU2VydmljZSA9IGVkaXRvclNlcnZpY2U7XG4gICAgdGhpcy4jc2FuaXRpemF0aW9uU2VydmljZSA9IHNhbml0aXphdGlvblNlcnZpY2U7XG4gICAgdGhpcy4jbmdDb250cm9sID0gbmdDb250cm9sO1xuICAgIHRoaXMuI3pvbmUgPSB6b25lO1xuXG4gICAgdGhpcy4jaWQgPSB0aGlzLiNkZWZhdWx0SWQgPSBpZFN2Yy5nZW5lcmF0ZUlkKCk7XG5cbiAgICBuZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuI2luaXRJZnJhbWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5yZW1vdmVPYnNlcnZlcnModGhpcy4jZWRpdG9yU2VydmljZS5lZGl0b3IpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbklmcmFtZUxvYWQoKTogdm9pZCB7XG4gICAgLy8gUmVpbml0aWFsaXplIHRoZSBlZGl0b3IgaWYgaXQgYWxyZWFkeSBleGlzdHMgdG8gY292ZXIgc2l0dWF0aW9ucyB3aGVyZSB0aGUgdGV4dCBlZGl0b3IgbWlnaHQgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSBET00uXG4gICAgaWYgKHRoaXMuI2VkaXRvclNlcnZpY2UuaXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy4jaW5pdElmcmFtZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblxuICAgIC8vIFVwZGF0ZSBIVE1MIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAodGhpcy4jaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGVkaXRvclZhbHVlID0gdGhpcy4jYWRhcHRlclNlcnZpY2UuZ2V0RWRpdG9ySW5uZXJIdG1sKCk7XG4gICAgICBpZiAoZWRpdG9yVmFsdWUgIT09IHRoaXMuI192YWx1ZSkge1xuICAgICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5zZXRFZGl0b3JJbm5lckh0bWwodGhpcy4jX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuI19vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLiNfb25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICovXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gICN1cGRhdGVTdHlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNfaW5pdGlhbFN0eWxlU3RhdGUgPSB7XG4gICAgICAuLi50aGlzLiNfaW5pdGlhbFN0eWxlU3RhdGUsXG4gICAgICAuLi50aGlzLiNhZGFwdGVyU2VydmljZS5nZXRTdHlsZVN0YXRlKCksXG4gICAgfTtcbiAgfVxuXG4gICNpbml0SWZyYW1lKCk6IHZvaWQge1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmluaXRFZGl0b3IoXG4gICAgICB0aGlzLmlkLFxuICAgICAgKHRoaXMuaWZyYW1lUmVmIGFzIEVsZW1lbnRSZWYpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmluaXRpYWxTdHlsZVN0YXRlLFxuICAgICAgdGhpcy5wbGFjZWhvbGRlclxuICAgICk7XG5cbiAgICB0aGlzLiNlZGl0b3JTZXJ2aWNlXG4gICAgICAuaW5wdXRMaXN0ZW5lcigpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGZvciBjaGFuZ2VzIG9yaWdpbmF0aW5nIGluc2lkZSBhbiBpZnJhbWUsXG4gICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGUgb25DaGFuZ2UoKSBldmVudCBpbnNpZGUgTmdab25lIHRvIGZvcmNlIGNoYW5nZSBwcm9wYWdhdGlvbiB0byBjb25zdW1pbmcgY29tcG9uZW50cy5cbiAgICAgICAgdGhpcy4jem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3ZpZXdUb01vZGVsVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLiNlZGl0b3JTZXJ2aWNlXG4gICAgICAuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZVN0eWxlKCk7XG4gICAgICAgIHRoaXMuZWRpdG9yRm9jdXNTdHJlYW0ubmV4dCgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLiNlZGl0b3JTZXJ2aWNlXG4gICAgICAuY2xpY2tMaXN0ZW5lcigpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5lZGl0b3JGb2N1c1N0cmVhbS5uZXh0KCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuI2VkaXRvclNlcnZpY2VcbiAgICAgIC5ibHVyTGlzdGVuZXIoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEFuZ3VsYXIgZG9lc24ndCBydW4gY2hhbmdlIGRldGVjdGlvbiBmb3IgY2hhbmdlcyBvcmlnaW5hdGluZyBpbnNpZGUgYW4gaWZyYW1lLFxuICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIHJ1biBtYXJrRm9yQ2hlY2soKSBpbnNpZGUgdGhlIE5nWm9uZSB0byBmb3JjZSBjaGFuZ2UgcHJvcGFnYXRpb24gdG8gY29uc3VtaW5nIGNvbXBvbmVudHMuXG4gICAgICAgIHRoaXMuI3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNfb25Ub3VjaGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLiNlZGl0b3JTZXJ2aWNlXG4gICAgICAuY29tbWFuZENoYW5nZUxpc3RlbmVyKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLiN1cGRhdGVTdHlsZSgpO1xuICAgICAgICB0aGlzLiN2aWV3VG9Nb2RlbFVwZGF0ZSgpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5zZXRFZGl0b3JJbm5lckh0bWwodGhpcy4jX3ZhbHVlKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHRoaXMuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5mb2N1c0VkaXRvcigpO1xuICAgIH1cblxuICAgIHRoaXMuI2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gICN2aWV3VG9Nb2RlbFVwZGF0ZShlbWl0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRFZGl0b3JJbm5lckh0bWwoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChlbWl0Q2hhbmdlKSB7XG4gICAgICB0aGlzLiNfb25DaGFuZ2UodGhpcy4jX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAjX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIH07XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgI19vbkNoYW5nZTogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdmFsdWU6IGFueVxuICApID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cInNreS10ZXh0LWVkaXRvclwiPlxuICA8c2t5LXRvb2xiYXJcbiAgICAqbmdJZj1cIlxuICAgICAgKG1lbnVzICYmIG1lbnVzLmxlbmd0aCkgPiAwIHx8XG4gICAgICAodG9vbGJhckFjdGlvbnMgJiYgdG9vbGJhckFjdGlvbnMubGVuZ3RoID4gMClcbiAgICBcIlxuICAgIGNsYXNzPVwic2t5LXRleHQtZWRpdG9yLXRvb2xiYXJcIlxuICA+XG4gICAgPHNreS10b29sYmFyLXNlY3Rpb25cbiAgICAgICpuZ0lmPVwibWVudXMgJiYgbWVudXMubGVuZ3RoID4gMFwiXG4gICAgICBhcmlhLWxhYmVsPVwiVGV4dCBmb3JtYXR0aW5nXCJcbiAgICAgIGNsYXNzPVwibWVudWJhclwiXG4gICAgICByb2xlPVwidG9vbGJhclwiXG4gICAgPlxuICAgICAgPHNreS10ZXh0LWVkaXRvci1tZW51YmFyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtlZGl0b3JGb2N1c1N0cmVhbV09XCJlZGl0b3JGb2N1c1N0cmVhbVwiXG4gICAgICAgIFttZW51c109XCJtZW51c1wiXG4gICAgICAgIFttZXJnZUZpZWxkc109XCJtZXJnZUZpZWxkc1wiXG4gICAgICA+XG4gICAgICA8L3NreS10ZXh0LWVkaXRvci1tZW51YmFyPlxuICAgIDwvc2t5LXRvb2xiYXItc2VjdGlvbj5cbiAgICA8c2t5LXRvb2xiYXItc2VjdGlvblxuICAgICAgKm5nSWY9XCJ0b29sYmFyQWN0aW9ucyAmJiB0b29sYmFyQWN0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJUZXh0IGZvcm1hdHRpbmdcIlxuICAgICAgY2xhc3M9XCJ0b29sYmFyXCJcbiAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICA+XG4gICAgICA8c2t5LXRleHQtZWRpdG9yLXRvb2xiYXJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2VkaXRvckZvY3VzU3RyZWFtXT1cImVkaXRvckZvY3VzU3RyZWFtXCJcbiAgICAgICAgW2ZvbnRMaXN0XT1cImZvbnRMaXN0XCJcbiAgICAgICAgW2ZvbnRTaXplTGlzdF09XCJmb250U2l6ZUxpc3RcIlxuICAgICAgICBbdG9vbGJhckFjdGlvbnNdPVwidG9vbGJhckFjdGlvbnNcIlxuICAgICAgICBbc3R5bGVTdGF0ZV09XCJpbml0aWFsU3R5bGVTdGF0ZVwiXG4gICAgICA+XG4gICAgICA8L3NreS10ZXh0LWVkaXRvci10b29sYmFyPlxuICAgIDwvc2t5LXRvb2xiYXItc2VjdGlvbj5cbiAgPC9za3ktdG9vbGJhcj5cbiAgPGlmcmFtZVxuICAgIGNsYXNzPVwic2t5LXRleHQtZWRpdG9yLXdyYXBwZXJcIlxuICAgIHNyYz1cImFib3V0OmJsYW5rXCJcbiAgICB0aXRsZT1cIlRleHQgRWRpdG9yXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2t5LXRleHQtZWRpdG9yLXdyYXBwZXItZGlzYWJsZWQnOiBkaXNhYmxlZFxuICAgIH1cIlxuICAgIChsb2FkKT1cIm9uSWZyYW1lTG9hZCgpXCJcbiAgICAjaWZyYW1lXG4gID5cbiAgPC9pZnJhbWU+XG48L2Rpdj5cbiJdfQ==
|