UNPKG

@nomadreservations/ngx-codemirror

Version:

`@nomadreservations/ngx-codemirror` [CodeMirror (5.x)](http://codemirror.net/) code editor in your Angular application. Server Side Rendering(SSR) compliant and @angular 6+ Ready.

303 lines (295 loc) 20.6 kB
import { Injectable, Component, Input, Output, ViewChild, EventEmitter, forwardRef, NgZone, NgModule } from '@angular/core'; import { ReplaySubject } from 'rxjs'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * Main Codemirror import, utilizing window's existence to determine if we're server side or not. */ var /** @type {?} */ CodeMirror = typeof window !== 'undefined' && typeof window.navigator !== 'undefined' ? require('codemirror') : undefined; /** * Initialize Event for CodeMirror.Editor instance * * Holds a referencable pointer to the code mirror instance for users. */ var CodemirrorService = /** @class */ (function () { function CodemirrorService() { /** * Codemirror instance subject * * Emits a refrence to the initialized CodeMirror.Editor once it's insantiated. */ this.instance$ = new ReplaySubject(); } CodemirrorService.decorators = [ { type: Injectable }, ]; return CodemirrorService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * Main Codemirror import, utilizing window's existence to determine if we're server side or not. */ var /** @type {?} */ CodeMirror$1 = typeof window !== 'undefined' && typeof window.navigator !== 'undefined' ? require('codemirror') : undefined; /** * CodeMirror component * * **Usage** : * ```html * <ngx-codemirror [(ngModel)]="data" [config]="{...}" (init)="onInit" (blur)="onBlur" (focus)="onFocus" ...></ngx-codemirror> * ``` */ var CodemirrorComponent = /** @class */ (function () { /** * Constructor * * @param _zone NgZone injected for Initialization */ function CodemirrorComponent(_codeMirror, _zone) { this._codeMirror = _codeMirror; this._zone = _zone; /** * change output event, pass through from codemirror */ this.change = new EventEmitter(); /** * focus output event, pass through from codemirror */ this.focus = new EventEmitter(); /** * blur output event, pass through from codemirror */ this.blur = new EventEmitter(); /** * cursorActivity output event, pass through from codemirror */ this.cursorActivity = new EventEmitter(); /** * Value storage */ this._value = ''; } Object.defineProperty(CodemirrorComponent.prototype, "value", { /** Implements ControlValueAccessor.value */ get: /** * Implements ControlValueAccessor.value * @return {?} */ function () { return this._value; }, set: /** * Implements ControlValueAccessor.value * @param {?} v * @return {?} */ function (v) { if (v !== this._value) { this._value = v; this.onChange(v); } }, enumerable: true, configurable: true }); /** * On component destroy * @return {?} */ CodemirrorComponent.prototype.ngOnDestroy = /** * On component destroy * @return {?} */ function () { }; /** * On component view init * @return {?} */ CodemirrorComponent.prototype.ngAfterViewInit = /** * On component view init * @return {?} */ function () { this.config = this.config || {}; this.codemirrorInit(this.config); }; /** * Value update process * @param {?} value * @return {?} */ CodemirrorComponent.prototype.updateValue = /** * Value update process * @param {?} value * @return {?} */ function (value) { this.value = value; this.onTouched(); this.change.emit(value); }; /** * Implements ControlValueAccessor * @param {?} value * @return {?} */ CodemirrorComponent.prototype.writeValue = /** * Implements ControlValueAccessor * @param {?} value * @return {?} */ function (value) { this._value = value || ''; if (this._instance) { this._instance.setValue(this._value); } }; /** * Change event trigger * @param {?} _ * @return {?} */ CodemirrorComponent.prototype.onChange = /** * Change event trigger * @param {?} _ * @return {?} */ function (_) { }; /** * Dirty/touched event trigger * @return {?} */ CodemirrorComponent.prototype.onTouched = /** * Dirty/touched event trigger * @return {?} */ function () { }; /** * Implements ControlValueAccessor.registerOnChange * @param {?} fn * @return {?} */ CodemirrorComponent.prototype.registerOnChange = /** * Implements ControlValueAccessor.registerOnChange * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * Implements ControlValueAccessor.registerOnTouched * @param {?} fn * @return {?} */ CodemirrorComponent.prototype.registerOnTouched = /** * Implements ControlValueAccessor.registerOnTouched * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * Initialize codemirror * @param {?} config * @return {?} */ CodemirrorComponent.prototype.codemirrorInit = /** * Initialize codemirror * @param {?} config * @return {?} */ function (config) { var _this = this; if (CodeMirror$1) { this._zone.runOutsideAngular(function () { _this._instance = CodeMirror$1.fromTextArea(_this.host.nativeElement, config); _this._instance.setValue(_this._value); }); this._instance.on('change', function () { _this.updateValue(_this._instance.getValue()); }); this._instance.on('focus', function (instance, event) { _this.focus.emit({ instance: instance, event: event }); }); this._instance.on('cursorActivity', function (instance) { _this.cursorActivity.emit({ instance: instance }); }); this._instance.on('blur', function (instance, event) { _this.blur.emit({ instance: instance, event: event }); }); this._codeMirror.instance$.next(this._instance); } }; CodemirrorComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngx-codemirror', providers: [ { provide: NG_VALUE_ACCESSOR, // tslint:disable-next-line:no-forward-ref useExisting: forwardRef(function () { return CodemirrorComponent; }), multi: true } ], template: '<textarea #host></textarea>', },] }, ]; /** @nocollapse */ CodemirrorComponent.ctorParameters = function () { return [ { type: CodemirrorService, }, { type: NgZone, }, ]; }; CodemirrorComponent.propDecorators = { "config": [{ type: Input },], "change": [{ type: Output },], "focus": [{ type: Output },], "blur": [{ type: Output },], "cursorActivity": [{ type: Output },], "host": [{ type: ViewChild, args: ['host',] },], "value": [{ type: Input },], }; return CodemirrorComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * \@angular 5.x+ SSR ready CodeMirror wrapping module. */ var CodemirrorModule = /** @class */ (function () { function CodemirrorModule() { } CodemirrorModule.decorators = [ { type: NgModule, args: [{ providers: [ CodemirrorService ], declarations: [CodemirrorComponent], exports: [CodemirrorComponent], entryComponents: [CodemirrorComponent] },] }, ]; return CodemirrorModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { CodemirrorComponent, CodemirrorModule, CodemirrorService }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9tYWRyZXNlcnZhdGlvbnMtbmd4LWNvZGVtaXJyb3IuanMubWFwIiwic291cmNlcyI6WyJuZzovL0Bub21hZHJlc2VydmF0aW9ucy9uZ3gtY29kZW1pcnJvci9uZ3gtY29kZW1pcnJvci9jb2RlbWlycm9yLnNlcnZpY2UudHMiLCJuZzovL0Bub21hZHJlc2VydmF0aW9ucy9uZ3gtY29kZW1pcnJvci9uZ3gtY29kZW1pcnJvci9jb2RlbWlycm9yLmNvbXBvbmVudC50cyIsIm5nOi8vQG5vbWFkcmVzZXJ2YXRpb25zL25neC1jb2RlbWlycm9yL25neC1jb2RlbWlycm9yL2NvZGVtaXJyb3IubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnY29kZW1pcnJvcic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogTWFpbiBDb2RlbWlycm9yIGltcG9ydCwgdXRpbGl6aW5nIHdpbmRvdydzIGV4aXN0ZW5jZSB0byBkZXRlcm1pbmUgaWYgd2UncmUgc2VydmVyIHNpZGUgb3Igbm90LlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuY29uc3QgQ29kZU1pcnJvcjogYW55ID1cbiAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnXG4gID8gcmVxdWlyZSgnY29kZW1pcnJvcicpXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEluaXRpYWxpemUgRXZlbnQgZm9yIENvZGVNaXJyb3IuRWRpdG9yIGluc3RhbmNlXG4gKlxuICogSG9sZHMgYSByZWZlcmVuY2FibGUgcG9pbnRlciB0byB0aGUgY29kZSBtaXJyb3IgaW5zdGFuY2UgZm9yIHVzZXJzLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29kZW1pcnJvclNlcnZpY2Uge1xuICAvKipcbiAgICogQ29kZW1pcnJvciBpbnN0YW5jZSBzdWJqZWN0XG4gICAqXG4gICAqIEVtaXRzIGEgcmVmcmVuY2UgdG8gdGhlIGluaXRpYWxpemVkIENvZGVNaXJyb3IuRWRpdG9yIG9uY2UgaXQncyBpbnNhbnRpYXRlZC5cbiAgICovXG4gIHB1YmxpYyBpbnN0YW5jZSQ6IFJlcGxheVN1YmplY3Q8RWRpdG9yPiA9IG5ldyBSZXBsYXlTdWJqZWN0PEVkaXRvcj4oKTtcbn1cbiIsIi8vIEltcG9ydHNcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRWxlbWVudFJlZixcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICdjb2RlbWlycm9yJztcbmltcG9ydCB7IENvZGVtaXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi9jb2RlbWlycm9yLnNlcnZpY2UnO1xuXG4vKipcbiAqIE1haW4gQ29kZW1pcnJvciBpbXBvcnQsIHV0aWxpemluZyB3aW5kb3cncyBleGlzdGVuY2UgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIHNlcnZlciBzaWRlIG9yIG5vdC5cbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmNvbnN0IENvZGVNaXJyb3I6IGFueSA9XG4gIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJ1xuICA/IHJlcXVpcmUoJ2NvZGVtaXJyb3InKVxuICA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDb2RlTWlycm9yIGNvbXBvbmVudFxuICpcbiAqICoqVXNhZ2UqKiA6XG4gKiBgYGBodG1sXG4gKiAgIDxuZ3gtY29kZW1pcnJvciBbKG5nTW9kZWwpXT1cImRhdGFcIiBbY29uZmlnXT1cInsuLi59XCIgKGluaXQpPVwib25Jbml0XCIgKGJsdXIpPVwib25CbHVyXCIgKGZvY3VzKT1cIm9uRm9jdXNcIiAuLi4+PC9uZ3gtY29kZW1pcnJvcj5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ25neC1jb2RlbWlycm9yJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZm9yd2FyZC1yZWZcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvZGVtaXJyb3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlOiAnPHRleHRhcmVhICNob3N0PjwvdGV4dGFyZWE+Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ29kZW1pcnJvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqIENvZGVtaXJyb3IgY29uZmlnIG9iamVjdCAoc2VlIFtkZXRhaWxzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2NvbmZpZykpICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IGFueTtcbiAgLyoqIGNoYW5nZSBvdXRwdXQgZXZlbnQsIHBhc3MgdGhyb3VnaCBmcm9tIGNvZGVtaXJyb3IgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBmb2N1cyBvdXRwdXQgZXZlbnQsIHBhc3MgdGhyb3VnaCBmcm9tIGNvZGVtaXJyb3IgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIGJsdXIgb3V0cHV0IGV2ZW50LCBwYXNzIHRocm91Z2ggZnJvbSBjb2RlbWlycm9yICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIGN1cnNvckFjdGl2aXR5IG91dHB1dCBldmVudCwgcGFzcyB0aHJvdWdoIGZyb20gY29kZW1pcnJvciAqL1xuICBAT3V0cHV0KCkgcHVibGljIGN1cnNvckFjdGl2aXR5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogSG9zdCBlbGVtZW50IGZvciBjb2RlbWlycm9yIHRvIGF0dGFjaCB0byAqL1xuICBAVmlld0NoaWxkKCdob3N0JykgcHVibGljIGhvc3Q6IEVsZW1lbnRSZWY7XG5cbiAgLyoqIEN1cnJlbnQgZWRpdG9yIGluc3RhbmNlICovXG4gIHByaXZhdGUgX2luc3RhbmNlOiBhbnk7XG5cbiAgLyoqIFZhbHVlIHN0b3JhZ2UgKi9cbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICpcbiAgICogQHBhcmFtIF96b25lIE5nWm9uZSBpbmplY3RlZCBmb3IgSW5pdGlhbGl6YXRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NvZGVNaXJyb3I6IENvZGVtaXJyb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgLyoqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IudmFsdWUgKi9cbiAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH1cblxuICAvKiogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3Nvci52YWx1ZSAqL1xuICBASW5wdXQoKSBzZXQgdmFsdWUodikge1xuICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgICAgdGhpcy5vbkNoYW5nZSh2KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IGRlc3Ryb3lcbiAgICovXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIE9uIGNvbXBvbmVudCB2aWV3IGluaXRcbiAgICovXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLmNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmNvZGVtaXJyb3JJbml0KHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWx1ZSB1cGRhdGUgcHJvY2Vzc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gICAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgICBpZiAodGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuX2luc3RhbmNlLnNldFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2hhbmdlIGV2ZW50IHRyaWdnZXIgKi9cbiAgcHVibGljICBvbkNoYW5nZShfOiBhbnkpIHt9XG4gIC8qKiBEaXJ0eS90b3VjaGVkIGV2ZW50IHRyaWdnZXIgKi9cbiAgcHVibGljIG9uVG91Y2hlZCgpIHt9XG4gIC8qKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgLyoqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPblRvdWNoZWQgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvZGVtaXJyb3JcbiAgICovXG4gIHByaXZhdGUgY29kZW1pcnJvckluaXQoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoQ29kZU1pcnJvcikge1xuICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlLnNldFZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZS5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMuX2luc3RhbmNlLmdldFZhbHVlKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2luc3RhbmNlLm9uKCdmb2N1cycsIChpbnN0YW5jZTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZm9jdXMuZW1pdCh7aW5zdGFuY2UsIGV2ZW50fSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faW5zdGFuY2Uub24oJ2N1cnNvckFjdGl2aXR5JywgKGluc3RhbmNlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jdXJzb3JBY3Rpdml0eS5lbWl0KHtpbnN0YW5jZX0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2luc3RhbmNlLm9uKCdibHVyJywgKGluc3RhbmNlOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ibHVyLmVtaXQoe2luc3RhbmNlLCBldmVudH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2NvZGVNaXJyb3IuaW5zdGFuY2UkLm5leHQodGhpcy5faW5zdGFuY2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29kZW1pcnJvckNvbXBvbmVudCB9IGZyb20gJy4vY29kZW1pcnJvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29kZW1pcnJvclNlcnZpY2UgfSBmcm9tICcuL2NvZGVtaXJyb3Iuc2VydmljZSc7XG5cbi8qKlxuICogQGFuZ3VsYXIgNS54KyBTU1IgcmVhZHkgQ29kZU1pcnJvciB3cmFwcGluZyBtb2R1bGUuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIHByb3ZpZGVyczogW1xuICAgIENvZGVtaXJyb3JTZXJ2aWNlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW0NvZGVtaXJyb3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbQ29kZW1pcnJvckNvbXBvbmVudF0sXG4gIGVudHJ5Q29tcG9uZW50czogW0NvZGVtaXJyb3JDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JNb2R1bGUge31cbiJdLCJuYW1lcyI6WyJDb2RlTWlycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUVBOzs7QUFPQSxxQkFBTSxVQUFVLEdBQ2QsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxXQUFXO01BQ3RFLE9BQU8sQ0FBQyxZQUFZLENBQUM7TUFDckIsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7O3lCQWM4QixJQUFJLGFBQWEsRUFBVTs7O2dCQVB0RSxVQUFVOzs0QkFuQlg7Ozs7Ozs7QUNDQTs7O0FBc0JBLHFCQUFNQSxZQUFVLEdBQ2QsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxXQUFXO01BQ3RFLE9BQU8sQ0FBQyxZ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