@covalent/code-editor 4.0.0 → 4.1.0-develop.2

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