@covalent/code-editor 6.4.0 → 6.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,370 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, forwardRef, ChangeDetectorRef, NgZone, Inject, PLATFORM_ID, } from '@angular/core';
2
+ import { isPlatformServer } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { of, Subject } from 'rxjs';
5
+ import { fromEvent, merge, timer } from 'rxjs';
6
+ import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators';
7
+ // Use esm version to support shipping subset of languages and features
8
+ import { editor, languages } from 'monaco-editor';
9
+ import { mixinControlValueAccessor, mixinDisabled, } from '@covalent/core/common';
10
+ import * as i0 from "@angular/core";
11
+ const noop = () => {
12
+ // empty method
13
+ };
14
+ // counter for ids to allow for multiple editors on one page
15
+ let uniqueCounter = 0;
16
+ export class TdCodeEditorBase {
17
+ constructor(_changeDetectorRef) {
18
+ this._changeDetectorRef = _changeDetectorRef;
19
+ }
20
+ }
21
+ export const _TdCodeEditorMixinBase = mixinControlValueAccessor(mixinDisabled(TdCodeEditorBase), []);
22
+ export class TdCodeEditorComponent extends _TdCodeEditorMixinBase {
23
+ /**
24
+ * value?: string
25
+ */
26
+ set value(value) {
27
+ this._value = value;
28
+ if (this._componentInitialized) {
29
+ this.applyValue();
30
+ }
31
+ }
32
+ get value() {
33
+ return this._value;
34
+ }
35
+ applyValue() {
36
+ if (!this._fromEditor) {
37
+ this._editor.setValue(this._value);
38
+ }
39
+ this._fromEditor = false;
40
+ this.propagateChange(this._value);
41
+ this.editorValueChange.emit();
42
+ }
43
+ registerOnChange(fn) {
44
+ this.propagateChange = fn;
45
+ }
46
+ registerOnTouched(fn) {
47
+ this.onTouched = fn;
48
+ }
49
+ /**
50
+ * getEditorContent?: function
51
+ * Returns the content within the editor
52
+ */
53
+ getValue() {
54
+ if (!this._componentInitialized) {
55
+ return of('');
56
+ }
57
+ setTimeout(() => {
58
+ this._subject.next(this._value);
59
+ this._subject.complete();
60
+ this._subject = new Subject();
61
+ });
62
+ return this._subject.asObservable();
63
+ }
64
+ /**
65
+ * language?: string
66
+ * language used in editor
67
+ */
68
+ set language(language) {
69
+ this._language = language;
70
+ if (this._componentInitialized) {
71
+ this.applyLanguage();
72
+ }
73
+ }
74
+ get language() {
75
+ return this._language;
76
+ }
77
+ applyLanguage() {
78
+ if (this._language) {
79
+ editor.setModelLanguage(this._editor.getModel(), this._language);
80
+ this.editorLanguageChanged.emit();
81
+ }
82
+ }
83
+ /**
84
+ * registerLanguage?: function
85
+ * Registers a custom Language within the editor
86
+ */
87
+ registerLanguage(language) {
88
+ if (this._componentInitialized) {
89
+ languages.register({ id: language.id });
90
+ this._disposables.push(languages.setMonarchTokensProvider(language.id, {
91
+ tokenizer: {
92
+ root: language.monarchTokensProvider,
93
+ },
94
+ }));
95
+ // Define a new theme that constains only rules that match this language
96
+ editor.defineTheme(language.customTheme.id, language.customTheme.theme);
97
+ this._theme = language.customTheme.id;
98
+ this._disposables.push(languages.registerCompletionItemProvider(language.id, {
99
+ provideCompletionItems: () => {
100
+ return language.completionItemProvider;
101
+ },
102
+ }));
103
+ const css = document.createElement('style');
104
+ css.type = 'text/css';
105
+ css.innerHTML = language.monarchTokensProviderCSS;
106
+ document.body.appendChild(css);
107
+ this.editorConfigurationChanged.emit();
108
+ this._registeredLanguagesStyles = [
109
+ ...this._registeredLanguagesStyles,
110
+ css,
111
+ ];
112
+ }
113
+ }
114
+ /**
115
+ * style?: string
116
+ * css style of the editor on the page
117
+ */
118
+ set editorStyle(editorStyle) {
119
+ this._editorStyle = editorStyle;
120
+ if (this._componentInitialized) {
121
+ this.applyStyle();
122
+ }
123
+ }
124
+ get editorStyle() {
125
+ return this._editorStyle;
126
+ }
127
+ applyStyle() {
128
+ if (this._editorStyle) {
129
+ const containerDiv = this._editorContainer.nativeElement;
130
+ containerDiv.setAttribute('style', this._editorStyle);
131
+ }
132
+ }
133
+ /**
134
+ * theme?: string
135
+ * Theme to be applied to editor
136
+ */
137
+ set theme(theme) {
138
+ this._theme = theme;
139
+ if (this._componentInitialized) {
140
+ this._editor.updateOptions({ theme });
141
+ this.editorConfigurationChanged.emit();
142
+ }
143
+ }
144
+ get theme() {
145
+ return this._theme;
146
+ }
147
+ /**
148
+ * fullScreenKeyBinding?: number
149
+ * See here for key bindings https://microsoft.github.io/monaco-editor/api/enums/keycode.html
150
+ * Sets the KeyCode for shortcutting to Fullscreen mode
151
+ */
152
+ set fullScreenKeyBinding(keycode) {
153
+ this._keycode = keycode;
154
+ }
155
+ get fullScreenKeyBinding() {
156
+ return this._keycode;
157
+ }
158
+ /**
159
+ * editorOptions?: object
160
+ * Options used on editor instantiation. Available options listed here:
161
+ * https://microsoft.github.io/monaco-editor/api/interfaces/editor.ieditoroptions.html
162
+ */
163
+ set editorOptions(editorOptions) {
164
+ this._editorOptions = editorOptions;
165
+ if (this._componentInitialized) {
166
+ this._editor.updateOptions(editorOptions);
167
+ this.editorConfigurationChanged.emit();
168
+ }
169
+ }
170
+ get editorOptions() {
171
+ return this._editorOptions;
172
+ }
173
+ /**
174
+ * layout method that calls layout method of editor and instructs the editor to remeasure its container
175
+ */
176
+ layout() {
177
+ if (this._componentInitialized) {
178
+ this._editor.layout();
179
+ }
180
+ }
181
+ /**
182
+ * Returns if in Full Screen Mode or not
183
+ */
184
+ get isFullScreen() {
185
+ return this._isFullScreen;
186
+ }
187
+ // tslint:disable-next-line:member-ordering
188
+ constructor(_changeDetectorRef, _elementRef, _ngZone, platformId) {
189
+ super(_changeDetectorRef);
190
+ this._elementRef = _elementRef;
191
+ this._ngZone = _ngZone;
192
+ this.platformId = platformId;
193
+ this._destroy = new Subject();
194
+ this._widthSubject = new Subject();
195
+ this._heightSubject = new Subject();
196
+ this._editorStyle = 'width:100%;height:100%;';
197
+ this._value = '';
198
+ this._theme = 'vs';
199
+ this._language = 'javascript';
200
+ this._subject = new Subject();
201
+ this._editorInnerContainer = 'editorInnerContainer' + uniqueCounter++;
202
+ this._fromEditor = false;
203
+ this._componentInitialized = false;
204
+ this._editorOptions = {};
205
+ this._isFullScreen = false;
206
+ this._registeredLanguagesStyles = [];
207
+ this._disposables = [];
208
+ /**
209
+ * editorInitialized: function($event)
210
+ * Event emitted when editor is first initialized
211
+ */
212
+ this.editorInitialized = new EventEmitter();
213
+ /**
214
+ * editorConfigurationChanged: function($event)
215
+ * Event emitted when editor's configuration changes
216
+ */
217
+ this.editorConfigurationChanged = new EventEmitter();
218
+ /**
219
+ * editorLanguageChanged: function($event)
220
+ * Event emitted when editor's Language changes
221
+ */
222
+ this.editorLanguageChanged = new EventEmitter();
223
+ /**
224
+ * editorValueChange: function($event)
225
+ * Event emitted any time something changes the editor value
226
+ */
227
+ this.editorValueChange = new EventEmitter();
228
+ this.propagateChange = (_) => noop;
229
+ }
230
+ ngOnInit() {
231
+ if (isPlatformServer(this.platformId)) {
232
+ return;
233
+ }
234
+ const containerDiv = this._editorContainer.nativeElement;
235
+ containerDiv.id = this._editorInnerContainer;
236
+ this._editor = editor.create(containerDiv, Object.assign({
237
+ value: this._value,
238
+ language: this.language,
239
+ theme: this._theme,
240
+ }, this.editorOptions));
241
+ this._componentInitialized = true;
242
+ setTimeout(() => {
243
+ this.applyLanguage();
244
+ this._fromEditor = true;
245
+ this.applyValue();
246
+ this.applyStyle();
247
+ this.editorInitialized.emit(this._editor);
248
+ this.editorConfigurationChanged.emit();
249
+ });
250
+ // The `onDidChangeContent` returns a disposable object (an object with `dispose()` method) which will cleanup
251
+ // the listener. The callback, that we pass to `onDidChangeContent`, captures `this`. This leads to a circular reference
252
+ // (`td-code-editor -> monaco -> td-code-editor`) and prevents the `td-code-editor` from being GC'd.
253
+ this._disposables.push(this._editor.getModel().onDidChangeContent(() => {
254
+ this._fromEditor = true;
255
+ this.writeValue(this._editor.getValue());
256
+ this.layout();
257
+ }));
258
+ this.addFullScreenModeCommand();
259
+ this._ngZone.runOutsideAngular(() => merge(fromEvent(window, 'resize').pipe(debounceTime(100)), this._widthSubject.asObservable().pipe(distinctUntilChanged()), this._heightSubject.asObservable().pipe(distinctUntilChanged()))
260
+ .pipe(debounceTime(100), takeUntil(this._destroy))
261
+ .subscribe(() => {
262
+ // Note: this is being called outside of the Angular zone since we don't have to
263
+ // run change detection whenever the editor resizes itself.
264
+ this.layout();
265
+ }));
266
+ this._ngZone.runOutsideAngular(() => timer(500, 250)
267
+ .pipe(takeUntil(this._destroy))
268
+ .subscribe(() => {
269
+ const { width, height } = this._elementRef.nativeElement.getBoundingClientRect();
270
+ this._widthSubject.next(width);
271
+ this._heightSubject.next(height);
272
+ }));
273
+ }
274
+ ngOnDestroy() {
275
+ this._changeDetectorRef.detach();
276
+ this._registeredLanguagesStyles.forEach((style) => style.remove());
277
+ while (this._disposables.length) {
278
+ this._disposables.pop()?.dispose();
279
+ }
280
+ if (this._editor) {
281
+ this._editor.dispose();
282
+ }
283
+ this._destroy.next(true);
284
+ this._destroy.unsubscribe();
285
+ }
286
+ /**
287
+ * showFullScreenEditor request for full screen of Code Editor based on its browser type.
288
+ */
289
+ showFullScreenEditor() {
290
+ if (this._componentInitialized) {
291
+ const codeEditorElement = this._editorContainer
292
+ .nativeElement;
293
+ codeEditorElement.requestFullscreen();
294
+ }
295
+ this._isFullScreen = true;
296
+ }
297
+ /**
298
+ * exitFullScreenEditor request to exit full screen of Code Editor based on its browser type.
299
+ */
300
+ exitFullScreenEditor() {
301
+ if (this._componentInitialized) {
302
+ document.exitFullscreen();
303
+ }
304
+ this._isFullScreen = false;
305
+ }
306
+ /**
307
+ * addFullScreenModeCommand used to add the fullscreen option to the context menu
308
+ */
309
+ addFullScreenModeCommand() {
310
+ this._disposables.push(this._editor.addAction({
311
+ // An unique identifier of the contributed action.
312
+ id: 'fullScreen',
313
+ // A label of the action that will be presented to the user.
314
+ label: 'Full Screen',
315
+ // An optional array of keybindings for the action.
316
+ contextMenuGroupId: 'navigation',
317
+ keybindings: this._keycode,
318
+ contextMenuOrder: 1.5,
319
+ // Method that will be executed when the action is triggered.
320
+ run: () => {
321
+ this.showFullScreenEditor();
322
+ },
323
+ }));
324
+ }
325
+ }
326
+ TdCodeEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TdCodeEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
327
+ TdCodeEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TdCodeEditorComponent, selector: "td-code-editor", inputs: { value: "value", language: "language", editorStyle: "editorStyle", theme: "theme", fullScreenKeyBinding: "fullScreenKeyBinding", editorOptions: "editorOptions" }, outputs: { editorInitialized: "editorInitialized", editorConfigurationChanged: "editorConfigurationChanged", editorLanguageChanged: "editorLanguageChanged", editorValueChange: "editorValueChange" }, providers: [
328
+ {
329
+ provide: NG_VALUE_ACCESSOR,
330
+ useExisting: forwardRef(() => TdCodeEditorComponent),
331
+ multi: true,
332
+ },
333
+ ], viewQueries: [{ propertyName: "_editorContainer", first: true, predicate: ["editorContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"editor-container\" #editorContainer></div>\n", styles: [":host{display:block;position:relative}:host .editor-container{position:absolute;inset:0}::ng-deep .monaco-aria-container{display:none}\n"] });
334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TdCodeEditorComponent, decorators: [{
335
+ type: Component,
336
+ args: [{ selector: 'td-code-editor', providers: [
337
+ {
338
+ provide: NG_VALUE_ACCESSOR,
339
+ useExisting: forwardRef(() => TdCodeEditorComponent),
340
+ multi: true,
341
+ },
342
+ ], template: "<div class=\"editor-container\" #editorContainer></div>\n", styles: [":host{display:block;position:relative}:host .editor-container{position:absolute;inset:0}::ng-deep .monaco-aria-container{display:none}\n"] }]
343
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
344
+ type: Inject,
345
+ args: [PLATFORM_ID]
346
+ }] }]; }, propDecorators: { _editorContainer: [{
347
+ type: ViewChild,
348
+ args: ['editorContainer', { static: true }]
349
+ }], editorInitialized: [{
350
+ type: Output
351
+ }], editorConfigurationChanged: [{
352
+ type: Output
353
+ }], editorLanguageChanged: [{
354
+ type: Output
355
+ }], editorValueChange: [{
356
+ type: Output
357
+ }], value: [{
358
+ type: Input
359
+ }], language: [{
360
+ type: Input
361
+ }], editorStyle: [{
362
+ type: Input
363
+ }], theme: [{
364
+ type: Input
365
+ }], fullScreenKeyBinding: [{
366
+ type: Input
367
+ }], editorOptions: [{
368
+ type: Input
369
+ }] } });
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvZGUtZWRpdG9yL3NyYy9saWIvY29kZS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvZGUtZWRpdG9yL3NyYy9saWIvY29kZS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixpQkFBaUIsRUFFakIsTUFBTSxFQUNOLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9FLHVFQUF1RTtBQUN2RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUUvRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGFBQWEsR0FDZCxNQUFNLHVCQUF1QixDQUFDOztBQUUvQixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7SUFDaEIsZUFBZTtBQUNqQixDQUFDLENBQUM7QUFFRiw0REFBNEQ7QUFDNUQsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBRXRCLE1BQU0sT0FBTyxn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QyxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBUUcsMEJBQTBCO3NCQUFuQyxNQUFNO2dCQU9HLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFPRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBUU0sS0FBSztzQkFEakIsS0FBSztnQkFpREYsUUFBUTtzQkFEWCxLQUFLO2dCQW1FRixXQUFXO3NCQURkLEtBQUs7Z0JBd0JGLEtBQUs7c0JBRFIsS0FBSztnQkFrQkYsb0JBQW9CO3NCQUR2QixLQUFLO2dCQWNGLGFBQWE7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbiAgSW5qZWN0LFxuICBQTEFURk9STV9JRCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vLyBVc2UgZXNtIHZlcnNpb24gdG8gc3VwcG9ydCBzaGlwcGluZyBzdWJzZXQgb2YgbGFuZ3VhZ2VzIGFuZCBmZWF0dXJlc1xuaW1wb3J0IHsgZWRpdG9yLCBsYW5ndWFnZXMsIElEaXNwb3NhYmxlIH0gZnJvbSAnbW9uYWNvLWVkaXRvcic7XG5cbmltcG9ydCB7XG4gIG1peGluQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIG1peGluRGlzYWJsZWQsXG59IGZyb20gJ0Bjb3ZhbGVudC9jb3JlL2NvbW1vbic7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG4gIC8vIGVtcHR5IG1ldGhvZFxufTtcblxuLy8gY291bnRlciBmb3IgaWRzIHRvIGFsbG93IGZvciBtdWx0aXBsZSBlZGl0b3JzIG9uIG9uZSBwYWdlXG5sZXQgdW5pcXVlQ291bnRlciA9IDA7XG5cbmV4cG9ydCBjbGFzcyBUZENvZGVFZGl0b3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG59XG5cbmV4cG9ydCBjb25zdCBfVGRDb2RlRWRpdG9yTWl4aW5CYXNlID0gbWl4aW5Db250cm9sVmFsdWVBY2Nlc3NvcihcbiAgbWl4aW5EaXNhYmxlZChUZENvZGVFZGl0b3JCYXNlKSxcbiAgW11cbik7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RkLWNvZGUtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvZGUtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29kZS1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUZENvZGVFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGRDb2RlRWRpdG9yQ29tcG9uZW50XG4gIGV4dGVuZHMgX1RkQ29kZUVkaXRvck1peGluQmFzZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveVxue1xuICBwcml2YXRlIF9kZXN0cm95OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSBfd2lkdGhTdWJqZWN0OiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgX2hlaWdodFN1YmplY3Q6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICBwcml2YXRlIF9lZGl0b3JTdHlsZSA9ICd3aWR0aDoxMDAlO2hlaWdodDoxMDAlOyc7XG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG4gIHByaXZhdGUgX3RoZW1lID0gJ3ZzJztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2UgPSAnamF2YXNjcmlwdCc7XG4gIHByaXZhdGUgX3N1YmplY3Q6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2VkaXRvcklubmVyQ29udGFpbmVyOiBzdHJpbmcgPVxuICAgICdlZGl0b3JJbm5lckNvbnRhaW5lcicgKyB1bmlxdWVDb3VudGVyKys7XG4gIHByaXZhdGUgX2VkaXRvciE6IGVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3I7XG4gIHByaXZhdGUgX2Zyb21FZGl0b3IgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29tcG9uZW50SW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZWRpdG9yT3B0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgX2lzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICBwcml2YXRlIF9rZXljb2RlOiBhbnk7XG4gIHByaXZhdGUgX3JlZ2lzdGVyZWRMYW5ndWFnZXNTdHlsZXM6IEhUTUxTdHlsZUVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9kaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvckNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIF9lZGl0b3JDb250YWluZXIhOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBlZGl0b3JJbml0aWFsaXplZDogZnVuY3Rpb24oJGV2ZW50KVxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gZWRpdG9yIGlzIGZpcnN0IGluaXRpYWxpemVkXG4gICAqL1xuICBAT3V0cHV0KClcbiAgZWRpdG9ySW5pdGlhbGl6ZWQ6IEV2ZW50RW1pdHRlcjxlZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxlZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yPigpO1xuXG4gIC8qKlxuICAgKiBlZGl0b3JDb25maWd1cmF0aW9uQ2hhbmdlZDogZnVuY3Rpb24oJGV2ZW50KVxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gZWRpdG9yJ3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzXG4gICAqL1xuICBAT3V0cHV0KCkgZWRpdG9yQ29uZmlndXJhdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBlZGl0b3JMYW5ndWFnZUNoYW5nZWQ6IGZ1bmN0aW9uKCRldmVudClcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGVkaXRvcidzIExhbmd1YWdlIGNoYW5nZXNcbiAgICovXG4gIEBPdXRwdXQoKSBlZGl0b3JMYW5ndWFnZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBlZGl0b3JWYWx1ZUNoYW5nZTogZnVuY3Rpb24oJGV2ZW50KVxuICAgKiBFdmVudCBlbWl0dGVkIGFueSB0aW1lIHNvbWV0aGluZyBjaGFuZ2VzIHRoZSBlZGl0b3IgdmFsdWVcbiAgICovXG4gIEBPdXRwdXQoKSBlZGl0b3JWYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IG5vb3A7XG5cbiAgLyoqXG4gICAqIHZhbHVlPzogc3RyaW5nXG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuYXBwbHlWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBvdmVycmlkZSBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBhcHBseVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZnJvbUVkaXRvcikge1xuICAgICAgdGhpcy5fZWRpdG9yLnNldFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fZnJvbUVkaXRvciA9IGZhbHNlO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLmVkaXRvclZhbHVlQ2hhbmdlLmVtaXQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cbiAgb3ZlcnJpZGUgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogZ2V0RWRpdG9yQ29udGVudD86IGZ1bmN0aW9uXG4gICAqIFJldHVybnMgdGhlIGNvbnRlbnQgd2l0aGluIHRoZSBlZGl0b3JcbiAgICovXG4gIGdldFZhbHVlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIG9mKCcnKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9zdWJqZWN0Lm5leHQodGhpcy5fdmFsdWUpO1xuICAgICAgdGhpcy5fc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogbGFuZ3VhZ2U/OiBzdHJpbmdcbiAgICogbGFuZ3VhZ2UgdXNlZCBpbiBlZGl0b3JcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBsYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuYXBwbHlMYW5ndWFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYW5ndWFnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgfVxuXG4gIGFwcGx5TGFuZ3VhZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xhbmd1YWdlKSB7XG4gICAgICBlZGl0b3Iuc2V0TW9kZWxMYW5ndWFnZShcbiAgICAgICAgdGhpcy5fZWRpdG9yLmdldE1vZGVsKCkgYXMgZWRpdG9yLklUZXh0TW9kZWwsXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlXG4gICAgICApO1xuICAgICAgdGhpcy5lZGl0b3JMYW5ndWFnZUNoYW5nZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiByZWdpc3Rlckxhbmd1YWdlPzogZnVuY3Rpb25cbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIExhbmd1YWdlIHdpdGhpbiB0aGUgZWRpdG9yXG4gICAqL1xuICByZWdpc3Rlckxhbmd1YWdlKGxhbmd1YWdlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIGxhbmd1YWdlcy5yZWdpc3Rlcih7IGlkOiBsYW5ndWFnZS5pZCB9KTtcblxuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChcbiAgICAgICAgbGFuZ3VhZ2VzLnNldE1vbmFyY2hUb2tlbnNQcm92aWRlcihsYW5ndWFnZS5pZCwge1xuICAgICAgICAgIHRva2VuaXplcjoge1xuICAgICAgICAgICAgcm9vdDogbGFuZ3VhZ2UubW9uYXJjaFRva2Vuc1Byb3ZpZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBEZWZpbmUgYSBuZXcgdGhlbWUgdGhhdCBjb25zdGFpbnMgb25seSBydWxlcyB0aGF0IG1hdGNoIHRoaXMgbGFuZ3VhZ2VcbiAgICAgIGVkaXRvci5kZWZpbmVUaGVtZShsYW5ndWFnZS5jdXN0b21UaGVtZS5pZCwgbGFuZ3VhZ2UuY3VzdG9tVGhlbWUudGhlbWUpO1xuICAgICAgdGhpcy5fdGhlbWUgPSBsYW5ndWFnZS5jdXN0b21UaGVtZS5pZDtcblxuICAgICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChcbiAgICAgICAgbGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcihsYW5ndWFnZS5pZCwge1xuICAgICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZS5jb21wbGV0aW9uSXRlbVByb3ZpZGVyO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBjb25zdCBjc3M6IEhUTUxTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgY3NzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgY3NzLmlubmVySFRNTCA9IGxhbmd1YWdlLm1vbmFyY2hUb2tlbnNQcm92aWRlckNTUztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3NzKTtcbiAgICAgIHRoaXMuZWRpdG9yQ29uZmlndXJhdGlvbkNoYW5nZWQuZW1pdCgpO1xuICAgICAgdGhpcy5fcmVnaXN0ZXJlZExhbmd1YWdlc1N0eWxlcyA9IFtcbiAgICAgICAgLi4udGhpcy5fcmVnaXN0ZXJlZExhbmd1YWdlc1N0eWxlcyxcbiAgICAgICAgY3NzLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogc3R5bGU/OiBzdHJpbmdcbiAgICogY3NzIHN0eWxlIG9mIHRoZSBlZGl0b3Igb24gdGhlIHBhZ2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBlZGl0b3JTdHlsZShlZGl0b3JTdHlsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZWRpdG9yU3R5bGUgPSBlZGl0b3JTdHlsZTtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuYXBwbHlTdHlsZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlZGl0b3JTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3JTdHlsZTtcbiAgfVxuXG4gIGFwcGx5U3R5bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2VkaXRvclN0eWxlKSB7XG4gICAgICBjb25zdCBjb250YWluZXJEaXY6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5fZWRpdG9yQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb250YWluZXJEaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRoaXMuX2VkaXRvclN0eWxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdGhlbWU/OiBzdHJpbmdcbiAgICogVGhlbWUgdG8gYmUgYXBwbGllZCB0byBlZGl0b3JcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCB0aGVtZSh0aGVtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhlbWUgPSB0aGVtZTtcbiAgICBpZiAodGhpcy5fY29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX2VkaXRvci51cGRhdGVPcHRpb25zKHsgdGhlbWUgfSk7XG4gICAgICB0aGlzLmVkaXRvckNvbmZpZ3VyYXRpb25DaGFuZ2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHRoZW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIGZ1bGxTY3JlZW5LZXlCaW5kaW5nPzogbnVtYmVyXG4gICAqIFNlZSBoZXJlIGZvciBrZXkgYmluZGluZ3MgaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL21vbmFjby1lZGl0b3IvYXBpL2VudW1zL2tleWNvZGUuaHRtbFxuICAgKiBTZXRzIHRoZSBLZXlDb2RlIGZvciBzaG9ydGN1dHRpbmcgdG8gRnVsbHNjcmVlbiBtb2RlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgZnVsbFNjcmVlbktleUJpbmRpbmcoa2V5Y29kZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLl9rZXljb2RlID0ga2V5Y29kZTtcbiAgfVxuICBnZXQgZnVsbFNjcmVlbktleUJpbmRpbmcoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLl9rZXljb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIGVkaXRvck9wdGlvbnM/OiBvYmplY3RcbiAgICogT3B0aW9ucyB1c2VkIG9uIGVkaXRvciBpbnN0YW50aWF0aW9uLiBBdmFpbGFibGUgb3B0aW9ucyBsaXN0ZWQgaGVyZTpcbiAgICogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL21vbmFjby1lZGl0b3IvYXBpL2ludGVyZmFjZXMvZWRpdG9yLmllZGl0b3JvcHRpb25zLmh0bWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBlZGl0b3JPcHRpb25zKGVkaXRvck9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuX2VkaXRvck9wdGlvbnMgPSBlZGl0b3JPcHRpb25zO1xuICAgIGlmICh0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fZWRpdG9yLnVwZGF0ZU9wdGlvbnMoZWRpdG9yT3B0aW9ucyk7XG4gICAgICB0aGlzLmVkaXRvckNvbmZpZ3VyYXRpb25DaGFuZ2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGVkaXRvck9wdGlvbnMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBsYXlvdXQgbWV0aG9kIHRoYXQgY2FsbHMgbGF5b3V0IG1ldGhvZCBvZiBlZGl0b3IgYW5kIGluc3RydWN0cyB0aGUgZWRpdG9yIHRvIHJlbWVhc3VyZSBpdHMgY29udGFpbmVyXG4gICAqL1xuICBsYXlvdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9lZGl0b3IubGF5b3V0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgaWYgaW4gRnVsbCBTY3JlZW4gTW9kZSBvciBub3RcbiAgICovXG4gIGdldCBpc0Z1bGxTY3JlZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRnVsbFNjcmVlbjtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptZW1iZXItb3JkZXJpbmdcbiAgY29uc3RydWN0b3IoXG4gICAgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihfY2hhbmdlRGV0ZWN0b3JSZWYpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lckRpdjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLl9lZGl0b3JDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICBjb250YWluZXJEaXYuaWQgPSB0aGlzLl9lZGl0b3JJbm5lckNvbnRhaW5lcjtcblxuICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvci5jcmVhdGUoXG4gICAgICBjb250YWluZXJEaXYsXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICAgIHRoZW1lOiB0aGlzLl90aGVtZSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5lZGl0b3JPcHRpb25zXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFwcGx5TGFuZ3VhZ2UoKTtcbiAgICAgIHRoaXMuX2Zyb21FZGl0b3IgPSB0cnVlO1xuICAgICAgdGhpcy5hcHBseVZhbHVlKCk7XG4gICAgICB0aGlzLmFwcGx5U3R5bGUoKTtcbiAgICAgIHRoaXMuZWRpdG9ySW5pdGlhbGl6ZWQuZW1pdCh0aGlzLl9lZGl0b3IpO1xuICAgICAgdGhpcy5lZGl0b3JDb25maWd1cmF0aW9uQ2hhbmdlZC5lbWl0KCk7XG4gICAgfSk7XG4gICAgLy8gVGhlIGBvbkRpZENoYW5nZUNvbnRlbnRgIHJldHVybnMgYSBkaXNwb3NhYmxlIG9iamVjdCAoYW4gb2JqZWN0IHdpdGggYGRpc3Bvc2UoKWAgbWV0aG9kKSB3aGljaCB3aWxsIGNsZWFudXBcbiAgICAvLyB0aGUgbGlzdGVuZXIuIFRoZSBjYWxsYmFjaywgdGhhdCB3ZSBwYXNzIHRvIGBvbkRpZENoYW5nZUNvbnRlbnRgLCBjYXB0dXJlcyBgdGhpc2AuIFRoaXMgbGVhZHMgdG8gYSBjaXJjdWxhciByZWZlcmVuY2VcbiAgICAvLyAoYHRkLWNvZGUtZWRpdG9yIC0+IG1vbmFjbyAtPiB0ZC1jb2RlLWVkaXRvcmApIGFuZCBwcmV2ZW50cyB0aGUgYHRkLWNvZGUtZWRpdG9yYCBmcm9tIGJlaW5nIEdDJ2QuXG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChcbiAgICAgICh0aGlzLl9lZGl0b3IuZ2V0TW9kZWwoKSBhcyBlZGl0b3IuSVRleHRNb2RlbCkub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgdGhpcy5fZnJvbUVkaXRvciA9IHRydWU7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl9lZGl0b3IuZ2V0VmFsdWUoKSk7XG4gICAgICAgIHRoaXMubGF5b3V0KCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hZGRGdWxsU2NyZWVuTW9kZUNvbW1hbmQoKTtcblxuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxuICAgICAgbWVyZ2UoXG4gICAgICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKGRlYm91bmNlVGltZSgxMDApKSxcbiAgICAgICAgdGhpcy5fd2lkdGhTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSksXG4gICAgICAgIHRoaXMuX2hlaWdodFN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgKVxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyBOb3RlOiB0aGlzIGlzIGJlaW5nIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0b1xuICAgICAgICAgIC8vIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHdoZW5ldmVyIHRoZSBlZGl0b3IgcmVzaXplcyBpdHNlbGYuXG4gICAgICAgICAgdGhpcy5sYXlvdXQoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxuICAgICAgdGltZXIoNTAwLCAyNTApXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPVxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHRoaXMuX3dpZHRoU3ViamVjdC5uZXh0KHdpZHRoKTtcbiAgICAgICAgICB0aGlzLl9oZWlnaHRTdWJqZWN0Lm5leHQoaGVpZ2h0KTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZExhbmd1YWdlc1N0eWxlcy5mb3JFYWNoKChzdHlsZTogSFRNTFN0eWxlRWxlbWVudCkgPT5cbiAgICAgIHN0eWxlLnJlbW92ZSgpXG4gICAgKTtcbiAgICB3aGlsZSAodGhpcy5fZGlzcG9zYWJsZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9kaXNwb3NhYmxlcy5wb3AoKT8uZGlzcG9zZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZWRpdG9yKSB7XG4gICAgICB0aGlzLl9lZGl0b3IuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kZXN0cm95Lm5leHQodHJ1ZSk7XG4gICAgdGhpcy5fZGVzdHJveS51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNob3dGdWxsU2NyZWVuRWRpdG9yIHJlcXVlc3QgZm9yIGZ1bGwgc2NyZWVuIG9mIENvZGUgRWRpdG9yIGJhc2VkIG9uIGl0cyBicm93c2VyIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc2hvd0Z1bGxTY3JlZW5FZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudEluaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb2RlRWRpdG9yRWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLl9lZGl0b3JDb250YWluZXJcbiAgICAgICAgLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICBjb2RlRWRpdG9yRWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgICB0aGlzLl9pc0Z1bGxTY3JlZW4gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4aXRGdWxsU2NyZWVuRWRpdG9yIHJlcXVlc3QgdG8gZXhpdCBmdWxsIHNjcmVlbiBvZiBDb2RlIEVkaXRvciBiYXNlZCBvbiBpdHMgYnJvd3NlciB0eXBlLlxuICAgKi9cbiAgcHVibGljIGV4aXRGdWxsU2NyZWVuRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb21wb25lbnRJbml0aWFsaXplZCkge1xuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gICAgdGhpcy5faXNGdWxsU2NyZWVuID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogYWRkRnVsbFNjcmVlbk1vZGVDb21tYW5kIHVzZWQgdG8gYWRkIHRoZSBmdWxsc2NyZWVuIG9wdGlvbiB0byB0aGUgY29udGV4dCBtZW51XG4gICAqL1xuICBwcml2YXRlIGFkZEZ1bGxTY3JlZW5Nb2RlQ29tbWFuZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5wdXNoKFxuICAgICAgdGhpcy5fZWRpdG9yLmFkZEFjdGlvbih7XG4gICAgICAgIC8vIEFuIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb250cmlidXRlZCBhY3Rpb24uXG4gICAgICAgIGlkOiAnZnVsbFNjcmVlbicsXG4gICAgICAgIC8vIEEgbGFiZWwgb2YgdGhlIGFjdGlvbiB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgICAgICBsYWJlbDogJ0Z1bGwgU2NyZWVuJyxcbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgYXJyYXkgb2Yga2V5YmluZGluZ3MgZm9yIHRoZSBhY3Rpb24uXG4gICAgICAgIGNvbnRleHRNZW51R3JvdXBJZDogJ25hdmlnYXRpb24nLFxuICAgICAgICBrZXliaW5kaW5nczogdGhpcy5fa2V5Y29kZSxcbiAgICAgICAgY29udGV4dE1lbnVPcmRlcjogMS41LFxuICAgICAgICAvLyBNZXRob2QgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGFjdGlvbiBpcyB0cmlnZ2VyZWQuXG4gICAgICAgIHJ1bjogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2hvd0Z1bGxTY3JlZW5FZGl0b3IoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIiAjZWRpdG9yQ29udGFpbmVyPjwvZGl2PlxuIl19
@@ -3,11 +3,11 @@ import { CommonModule } from '@angular/common';
3
3
  import { TdCodeEditorComponent } from './code-editor.component';
4
4
  import * as i0 from "@angular/core";
5
5
  export class CovalentCodeEditorModule {
6
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CovalentCodeEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
7
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: CovalentCodeEditorModule, bootstrap: [TdCodeEditorComponent], declarations: [TdCodeEditorComponent], imports: [CommonModule], exports: [TdCodeEditorComponent] });
8
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CovalentCodeEditorModule, imports: [CommonModule] });
9
6
  }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: CovalentCodeEditorModule, decorators: [{
7
+ CovalentCodeEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CovalentCodeEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ CovalentCodeEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: CovalentCodeEditorModule, bootstrap: [TdCodeEditorComponent], declarations: [TdCodeEditorComponent], imports: [CommonModule], exports: [TdCodeEditorComponent] });
9
+ CovalentCodeEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CovalentCodeEditorModule, imports: [CommonModule] });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CovalentCodeEditorModule, decorators: [{
11
11
  type: NgModule,
12
12
  args: [{
13
13
  imports: [CommonModule],
@@ -16,4 +16,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
16
16
  bootstrap: [TdCodeEditorComponent],
17
17
  }]
18
18
  }] });
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvZGUtZWRpdG9yL3NyYy9saWIvY29kZS1lZGl0b3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQVFoRSxNQUFNLE9BQU8sd0JBQXdCO3VHQUF4Qix3QkFBd0I7d0dBQXhCLHdCQUF3QixjQUZ2QixxQkFBcUIsa0JBRmxCLHFCQUFxQixhQUQxQixZQUFZLGFBRVoscUJBQXFCO3dHQUdwQix3QkFBd0IsWUFMekIsWUFBWTs7MkZBS1gsd0JBQXdCO2tCQU5wQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsWUFBWSxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ3JDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNoQyxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBUZENvZGVFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvZGUtZWRpdG9yLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtUZENvZGVFZGl0b3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbVGRDb2RlRWRpdG9yQ29tcG9uZW50XSxcbiAgYm9vdHN0cmFwOiBbVGRDb2RlRWRpdG9yQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgQ292YWxlbnRDb2RlRWRpdG9yTW9kdWxlIHt9XG4iXX0=
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3IubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvZGUtZWRpdG9yL3NyYy9saWIvY29kZS1lZGl0b3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQVFoRSxNQUFNLE9BQU8sd0JBQXdCOztzSEFBeEIsd0JBQXdCO3VIQUF4Qix3QkFBd0IsY0FGdkIscUJBQXFCLGtCQUZsQixxQkFBcUIsYUFEMUIsWUFBWSxhQUVaLHFCQUFxQjt1SEFHcEIsd0JBQXdCLFlBTHpCLFlBQVk7NEZBS1gsd0JBQXdCO2tCQU5wQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsWUFBWSxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ3JDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO29CQUNoQyxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztpQkFDbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBUZENvZGVFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvZGUtZWRpdG9yLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtUZENvZGVFZGl0b3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbVGRDb2RlRWRpdG9yQ29tcG9uZW50XSxcbiAgYm9vdHN0cmFwOiBbVGRDb2RlRWRpdG9yQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgQ292YWxlbnRDb2RlRWRpdG9yTW9kdWxlIHt9XG4iXX0=