UNPKG

ngx-quill

Version:

An angular (>= v2) component for the easy use of the QuillJS richt text editor.

513 lines 61.4 kB
import * as tslib_1 from "tslib"; import { isPlatformServer } from '@angular/common'; import { DomSanitizer } from '@angular/platform-browser'; import { QUILL_CONFIG_TOKEN } from './quill-editor.interfaces'; import { Component, ElementRef, EventEmitter, forwardRef, Inject, Input, NgZone, Output, PLATFORM_ID, Renderer2, SecurityContext, ViewEncapsulation } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DOCUMENT } from '@angular/common'; import { defaultModules } from './quill-defaults'; // tslint:disable-next-line:variable-name var Quill = null; var getFormat = function (format, configFormat) { var passedFormat = format || configFormat; return passedFormat || 'html'; }; var ɵ0 = getFormat; var QuillEditorComponent = /** @class */ (function () { function QuillEditorComponent(elementRef, domSanitizer, doc, // tslint:disable-next-line:ban-types platformId, renderer, zone, config) { var _this = this; this.elementRef = elementRef; this.domSanitizer = domSanitizer; this.doc = doc; this.platformId = platformId; this.renderer = renderer; this.zone = zone; this.config = config; this.required = false; this.customToolbarPosition = 'top'; this.sanitize = false; this.styles = null; this.strict = true; this.customOptions = []; this.preserveWhitespace = false; this.onEditorCreated = new EventEmitter(); this.onEditorChanged = new EventEmitter(); this.onContentChanged = new EventEmitter(); this.onSelectionChanged = new EventEmitter(); this.onFocus = new EventEmitter(); this.onBlur = new EventEmitter(); this.disabled = false; // used to store initial value before ViewInit this.valueGetter = function (quillEditor, editorElement) { var html = editorElement.querySelector('.ql-editor').innerHTML; if (html === '<p><br></p>' || html === '<div><br><div>') { html = null; } var modelValue = html; var format = getFormat(_this.format, _this.config.format); if (format === 'text') { modelValue = quillEditor.getText(); } else if (format === 'object') { modelValue = quillEditor.getContents(); } else if (format === 'json') { try { modelValue = JSON.stringify(quillEditor.getContents()); } catch (e) { modelValue = quillEditor.getText(); } } return modelValue; }; this.valueSetter = function (quillEditor, value) { var format = getFormat(_this.format, _this.config.format); if (format === 'html') { if (_this.sanitize) { value = _this.domSanitizer.sanitize(SecurityContext.HTML, value); } return quillEditor.clipboard.convert(value); } else if (format === 'json') { try { return JSON.parse(value); } catch (e) { return [{ insert: value }]; } } return value; }; this.selectionChangeHandler = function (range, oldRange, source) { _this.zone.run(function () { if (range === null) { _this.onBlur.emit({ editor: _this.quillEditor, source: source }); } else if (oldRange === null) { _this.onFocus.emit({ editor: _this.quillEditor, source: source }); } _this.onSelectionChanged.emit({ editor: _this.quillEditor, oldRange: oldRange, range: range, source: source }); if (!range && _this.onModelTouched) { _this.onModelTouched(); } }); }; this.textChangeHandler = function (delta, oldDelta, source) { // only emit changes emitted by user interactions var text = _this.quillEditor.getText(); var content = _this.quillEditor.getContents(); var html = _this.editorElem.querySelector('.ql-editor').innerHTML; if (html === '<p><br></p>' || html === '<div><br><div>') { html = null; } _this.zone.run(function () { var trackChanges = _this.trackChanges || _this.config.trackChanges; if ((source === Quill.sources.USER || trackChanges && trackChanges === 'all') && _this.onModelChange) { _this.onModelChange(_this.valueGetter(_this.quillEditor, _this.editorElem)); } _this.onContentChanged.emit({ content: content, delta: delta, editor: _this.quillEditor, html: html, oldDelta: oldDelta, source: source, text: text }); }); }; this.editorChangeHandler = function (event, current, old, source) { // only emit changes emitted by user interactions if (event === 'text-change') { var text_1 = _this.quillEditor.getText(); var content_1 = _this.quillEditor.getContents(); var html_1 = _this.editorElem.querySelector('.ql-editor').innerHTML; if (html_1 === '<p><br></p>' || html_1 === '<div><br><div>') { html_1 = null; } _this.zone.run(function () { _this.onEditorChanged.emit({ content: content_1, delta: current, editor: _this.quillEditor, event: event, html: html_1, oldDelta: old, source: source, text: text_1 }); }); } else { _this.onEditorChanged.emit({ editor: _this.quillEditor, event: event, oldRange: old, range: current, source: source }); } }; } QuillEditorComponent_1 = QuillEditorComponent; // tslint:disable-next-line:no-empty QuillEditorComponent.prototype.onModelChange = function (_modelValue) { }; // tslint:disable-next-line:no-empty QuillEditorComponent.prototype.onModelTouched = function () { }; QuillEditorComponent.prototype.ngAfterViewInit = function () { var _this = this; if (isPlatformServer(this.platformId)) { return; } if (!Quill) { Quill = require('quill'); } this.elementRef.nativeElement.insertAdjacentHTML(this.customToolbarPosition === 'top' ? 'beforeend' : 'afterbegin', this.preserveWhitespace ? '<pre quill-editor-element></pre>' : '<div quill-editor-element></div>'); this.editorElem = this.elementRef.nativeElement.querySelector('[quill-editor-element]'); var toolbarElem = this.elementRef.nativeElement.querySelector('[quill-editor-toolbar]'); var modules = Object.assign({}, this.modules || (this.config.modules || defaultModules)); if (toolbarElem) { modules.toolbar = toolbarElem; } else if (modules.toolbar === undefined) { modules.toolbar = defaultModules.toolbar; } var placeholder = this.placeholder !== undefined ? this.placeholder : this.config.placeholder; if (placeholder === undefined) { placeholder = 'Insert text here ...'; } if (this.styles) { Object.keys(this.styles).forEach(function (key) { _this.renderer.setStyle(_this.editorElem, key, _this.styles[key]); }); } this.customOptions.forEach(function (customOption) { var newCustomOption = Quill.import(customOption.import); newCustomOption.whitelist = customOption.whitelist; Quill.register(newCustomOption, true); }); var bounds = this.bounds && this.bounds === 'self' ? this.editorElem : this.bounds; if (!bounds) { bounds = this.config.bounds ? this.config.bounds : this.doc.body; } var debug = this.debug; if (!debug && debug !== false && this.config.debug) { debug = this.config.debug; } var readOnly = this.readOnly; if (!readOnly && this.readOnly !== false) { readOnly = this.config.readOnly !== undefined ? this.config.readOnly : false; } var scrollingContainer = this.scrollingContainer; if (!scrollingContainer && this.scrollingContainer !== null) { scrollingContainer = this.config.scrollingContainer === null || this.config.scrollingContainer ? this.config.scrollingContainer : null; } var formats = this.formats; if (!formats && formats === undefined) { formats = this.config.formats ? Object.assign({}, this.config.formats) : (this.config.formats === null ? null : undefined); } this.quillEditor = new Quill(this.editorElem, { bounds: bounds, debug: debug, formats: formats, modules: modules, placeholder: placeholder, readOnly: readOnly, scrollingContainer: scrollingContainer, strict: this.strict, theme: this.theme || (this.config.theme ? this.config.theme : 'snow') }); if (this.content) { var format = getFormat(this.format, this.config.format); if (format === 'object') { this.quillEditor.setContents(this.content, 'silent'); } else if (format === 'text') { this.quillEditor.setText(this.content, 'silent'); } else if (format === 'json') { try { this.quillEditor.setContents(JSON.parse(this.content), 'silent'); } catch (e) { this.quillEditor.setText(this.content, 'silent'); } } else { if (this.sanitize) { this.content = this.domSanitizer.sanitize(SecurityContext.HTML, this.content); } var contents = this.quillEditor.clipboard.convert(this.content); this.quillEditor.setContents(contents, 'silent'); } this.quillEditor.history.clear(); } // initialize disabled status based on this.disabled as default value this.setDisabledState(); // triggered if selection or text changed this.quillEditor.on('editor-change', this.editorChangeHandler); // mark model as touched if editor lost focus this.quillEditor.on('selection-change', this.selectionChangeHandler); // update model if text changes this.quillEditor.on('text-change', this.textChangeHandler); // trigger created in a timeout to avoid changed models after checked // if you are using the editor api in created output to change the editor content setTimeout(function () { return _this.onEditorCreated.emit(_this.quillEditor); }); }; QuillEditorComponent.prototype.ngOnDestroy = function () { if (this.quillEditor) { this.quillEditor.off('selection-change', this.selectionChangeHandler); this.quillEditor.off('text-change', this.textChangeHandler); this.quillEditor.off('editor-change', this.editorChangeHandler); } }; QuillEditorComponent.prototype.ngOnChanges = function (changes) { var _this = this; if (!this.quillEditor) { return; } // tslint:disable:no-string-literal if (changes['readOnly']) { this.quillEditor.enable(!changes['readOnly'].currentValue); } if (changes['placeholder']) { this.quillEditor.root.dataset.placeholder = changes['placeholder'].currentValue; } if (changes['styles']) { var currentStyling = changes['styles'].currentValue; var previousStyling = changes['styles'].previousValue; if (previousStyling) { Object.keys(previousStyling).forEach(function (key) { _this.renderer.removeStyle(_this.editorElem, key); }); } if (currentStyling) { Object.keys(currentStyling).forEach(function (key) { _this.renderer.setStyle(_this.editorElem, key, _this.styles[key]); }); } } // tslint:enable:no-string-literal }; QuillEditorComponent.prototype.writeValue = function (currentValue) { this.content = currentValue; var format = getFormat(this.format, this.config.format); if (this.quillEditor) { if (currentValue) { if (format === 'text') { this.quillEditor.setText(currentValue); } else { this.quillEditor.setContents(this.valueSetter(this.quillEditor, this.content)); } return; } this.quillEditor.setText(''); } }; QuillEditorComponent.prototype.setDisabledState = function (isDisabled) { if (isDisabled === void 0) { isDisabled = this.disabled; } // store initial value to set appropriate disabled status after ViewInit this.disabled = isDisabled; if (this.quillEditor) { if (isDisabled) { this.quillEditor.disable(); this.renderer.setAttribute(this.elementRef.nativeElement, 'disabled', 'disabled'); } else { if (!this.readOnly) { this.quillEditor.enable(); } this.renderer.removeAttribute(this.elementRef.nativeElement, 'disabled'); } } }; QuillEditorComponent.prototype.registerOnChange = function (fn) { this.onModelChange = fn; }; QuillEditorComponent.prototype.registerOnTouched = function (fn) { this.onModelTouched = fn; }; QuillEditorComponent.prototype.validate = function () { if (!this.quillEditor) { return null; } var err = {}; var valid = true; var textLength = this.quillEditor.getText().trim().length; if (this.minLength && textLength && textLength < this.minLength) { err.minLengthError = { given: textLength, minLength: this.minLength }; valid = false; } if (this.maxLength && textLength > this.maxLength) { err.maxLengthError = { given: textLength, maxLength: this.maxLength }; valid = false; } if (this.required && !textLength) { err.requiredError = { empty: true }; valid = false; } return valid ? null : err; }; var QuillEditorComponent_1; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], QuillEditorComponent.prototype, "format", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], QuillEditorComponent.prototype, "theme", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "modules", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "debug", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], QuillEditorComponent.prototype, "readOnly", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], QuillEditorComponent.prototype, "placeholder", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Number) ], QuillEditorComponent.prototype, "maxLength", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Number) ], QuillEditorComponent.prototype, "minLength", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], QuillEditorComponent.prototype, "required", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Array) ], QuillEditorComponent.prototype, "formats", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], QuillEditorComponent.prototype, "customToolbarPosition", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], QuillEditorComponent.prototype, "sanitize", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "styles", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], QuillEditorComponent.prototype, "strict", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "scrollingContainer", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "bounds", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Array) ], QuillEditorComponent.prototype, "customOptions", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], QuillEditorComponent.prototype, "trackChanges", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], QuillEditorComponent.prototype, "preserveWhitespace", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], QuillEditorComponent.prototype, "onEditorCreated", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], QuillEditorComponent.prototype, "onEditorChanged", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], QuillEditorComponent.prototype, "onContentChanged", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], QuillEditorComponent.prototype, "onSelectionChanged", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], QuillEditorComponent.prototype, "onFocus", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], QuillEditorComponent.prototype, "onBlur", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "valueGetter", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], QuillEditorComponent.prototype, "valueSetter", void 0); QuillEditorComponent = QuillEditorComponent_1 = tslib_1.__decorate([ Component({ encapsulation: ViewEncapsulation.None, providers: [ { multi: true, provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return QuillEditorComponent_1; }) }, { multi: true, provide: NG_VALIDATORS, useExisting: forwardRef(function () { return QuillEditorComponent_1; }) } ], selector: 'quill-editor', template: "\n <ng-content select=\"[quill-editor-toolbar]\"></ng-content>\n" }), tslib_1.__param(2, Inject(DOCUMENT)), tslib_1.__param(3, Inject(PLATFORM_ID)), tslib_1.__param(6, Inject(QUILL_CONFIG_TOKEN)), tslib_1.__metadata("design:paramtypes", [ElementRef, DomSanitizer, Object, Object, Renderer2, NgZone, Object]) ], QuillEditorComponent); return QuillEditorComponent; }()); export { QuillEditorComponent }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1xdWlsbC8iLCJzb3VyY2VzIjpbInNyYy9xdWlsbC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFeEQsT0FBTyxFQUFFLGtCQUFrQixFQUEwQyxNQUFNLDJCQUEyQixDQUFBO0FBRXRHLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZUFBZSxFQUVmLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQTtBQUV0QixPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFLakQseUNBQXlDO0FBQ3pDLElBQUksS0FBSyxHQUFRLElBQUksQ0FBQTtBQVlyQixJQUFNLFNBQVMsR0FBRyxVQUFDLE1BQW9CLEVBQUUsWUFBMEI7SUFDakUsSUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLFlBQVksQ0FBQTtJQUMzQyxPQUFPLFlBQVksSUFBSSxNQUFNLENBQUE7QUFDL0IsQ0FBQyxDQUFBOztBQXFCRDtJQXNFRSw4QkFDVSxVQUFzQixFQUN0QixZQUEwQixFQUNSLEdBQVE7SUFDbEMscUNBQXFDO0lBQ1IsVUFBa0IsRUFDdkMsUUFBbUIsRUFDbkIsSUFBWSxFQUNnQixNQUFtQjtRQVJ6RCxpQkFTSTtRQVJNLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIs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QU0sRUFBRTswQ0FBVSxZQUFZO3lEQUdSO0lBQ2I7UUFBVCxNQUFNLEVBQUU7MENBQVMsWUFBWTt3REFHUDtJQXFCdkI7UUFEQyxLQUFLLEVBQUU7OzZEQXNCUDtJQUdEO1FBREMsS0FBSyxFQUFFOzs2REFpQlA7SUEvSFUsb0JBQW9CO1FBbkJoQyxTQUFTLENBQUM7WUFDVCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtZQUNyQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsS0FBSyxFQUFFLElBQUk7b0JBQ1gsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsc0JBQW9CLEVBQXBCLENBQW9CLENBQUM7aUJBQ3BEO2dCQUNEO29CQUNFLEtBQUssRUFBRSxJQUFJO29CQUNYLE9BQU8sRUFBRSxhQUFhO29CQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxzQkFBb0IsRUFBcEIsQ0FBb0IsQ0FBQztpQkFDcEQ7YUFDRjtZQUNELFFBQVEsRUFBRSxjQUFjO1lBQ3hCLFFBQVEsRUFBRSxtRUFFWDtTQUNBLENBQUM7UUEwRUcsbUJBQUEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRWhCLG1CQUFBLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUduQixtQkFBQSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtpREFQUCxVQUFVO1lBQ1IsWUFBWSxVQUdPLE1BQU07WUFDN0IsU0FBUztZQUNiLE1BQU07T0E3RVgsb0JBQW9CLENBa2VoQztJQUFELDJCQUFDO0NBQUEsQUFsZUQsSUFrZUM7U0FsZVksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInXG5cbmltcG9ydCB7IFFVSUxMX0NPTkZJR19UT0tFTiwgUXVpbGxDb25maWcsIFF1aWxsRm9ybWF0LCBRdWlsbE1vZHVsZXMgfSBmcm9tICcuL3F1aWxsLWVkaXRvci5pbnRlcmZhY2VzJ1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgUmVuZGVyZXIyLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5cbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdG9yXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IGRlZmF1bHRNb2R1bGVzIH0gZnJvbSAnLi9xdWlsbC1kZWZhdWx0cydcblxuLy8gQmVjYXVzZSBxdWlsbCB1c2VzIGBkb2N1bWVudGAgZGlyZWN0bHksIHdlIGNhbm5vdCBgaW1wb3J0YCBkdXJpbmcgU1NSXG4vLyBpbnN0ZWFkLCB3ZSBsb2FkIGR5bmFtaWNhbGx5IHZpYSBgcmVxdWlyZSgncXVpbGwnKWAgaW4gYG5nQWZ0ZXJWaWV3SW5pdCgpYFxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxubGV0IFF1aWxsOiBhbnkgPSBudWxsXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tT3B0aW9uIHtcbiAgaW1wb3J0OiBzdHJpbmdcbiAgd2hpdGVsaXN0OiBhbnlbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlIHtcbiAgaW5kZXg6IG51bWJlclxuICBsZW5ndGg6IG51bWJlclxufVxuXG5jb25zdCBnZXRGb3JtYXQgPSAoZm9ybWF0PzogUXVpbGxGb3JtYXQsIGNvbmZpZ0Zvcm1hdD86IFF1aWxsRm9ybWF0KTogUXVpbGxGb3JtYXQgPT4ge1xuICBjb25zdCBwYXNzZWRGb3JtYXQgPSBmb3JtYXQgfHwgY29uZmlnRm9ybWF0XG4gIHJldHVybiBwYXNzZWRGb3JtYXQgfHwgJ2h0bWwnXG59XG5cbkBDb21wb25lbnQoe1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUXVpbGxFZGl0b3JDb21wb25lbnQpXG4gICAgfSxcbiAgICB7XG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBRdWlsbEVkaXRvckNvbXBvbmVudClcbiAgICB9XG4gIF0sXG4gIHNlbGVjdG9yOiAncXVpbGwtZWRpdG9yJyxcbiAgdGVtcGxhdGU6IGBcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3F1aWxsLWVkaXRvci10b29sYmFyXVwiPjwvbmctY29udGVudD5cbmBcbn0pXG5leHBvcnQgY2xhc3MgUXVpbGxFZGl0b3JDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFZhbGlkYXRvciB7XG5cbiAgcXVpbGxFZGl0b3I6IGFueVxuICBlZGl0b3JFbGVtOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZFxuICBjb250ZW50OiBhbnlcblxuICBASW5wdXQoKSBmb3JtYXQ/OiAnb2JqZWN0JyB8ICdodG1sJyB8ICd0ZXh0JyB8ICdqc29uJ1xuICBASW5wdXQoKSB0aGVtZT86IHN0cmluZ1xuICBASW5wdXQoKSBtb2R1bGVzPzogUXVpbGxNb2R1bGVzXG4gIEBJbnB1dCgpIGRlYnVnPzogJ3dhcm4nIHzCoCdsb2cnIHzCoCdlcnJvcicgfMKgZmFsc2VcbiAgQElucHV0KCkgcmVhZE9ubHk/OiBib29sZWFuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIEBJbnB1dCgpIG1heExlbmd0aD86IG51bWJlclxuICBASW5wdXQoKSBtaW5MZW5ndGg/OiBudW1iZXJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBmb3JtYXRzPzogc3RyaW5nW10gfMKgbnVsbFxuICBASW5wdXQoKSBjdXN0b21Ub29sYmFyUG9zaXRpb246ICd0b3AnIHzCoCdib3R0b20nID0gJ3RvcCdcbiAgQElucHV0KCkgc2FuaXRpemU6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBzdHlsZXM6IGFueSA9IG51bGxcbiAgQElucHV0KCkgc3RyaWN0OiBib29sZWFuID0gdHJ1ZVxuICBASW5wdXQoKSBzY3JvbGxpbmdDb250YWluZXI/OiBIVE1MRWxlbWVudCB8IHN0cmluZyB8IG51bGxcbiAgQElucHV0KCkgYm91bmRzPzogSFRNTEVsZW1lbnQgfCBzdHJpbmdcbiAgQElucHV0KCkgY3VzdG9tT3B0aW9uczogQ3VzdG9tT3B0aW9uW10gPSBbXVxuICBASW5wdXQoKSB0cmFja0NoYW5nZXM/OiAndXNlcicgfMKgJ2FsbCdcbiAgQElucHV0KCkgcHJlc2VydmVXaGl0ZXNwYWNlOiBib29sZWFuID0gZmFsc2VcblxuICBAT3V0cHV0KCkgb25FZGl0b3JDcmVhdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgb25FZGl0b3JDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8e1xuICAgIGNvbnRlbnQ6IGFueVxuICAgIGRlbHRhOiBhbnlcbiAgICBlZGl0b3I6IGFueVxuICAgIGV2ZW50OiAndGV4dC1jaGFuZ2UnXG4gICAgaHRtbDogc3RyaW5nIHwgbnVsbFxuICAgIG9sZERlbHRhOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xuICAgIHRleHQ6IHN0cmluZ1xuICB9IHzCoHtcbiAgICBlZGl0b3I6IGFueVxuICAgIGV2ZW50OiAnc2VsZWN0aW9uLWNoYW5nZSdcbiAgICBvbGRSYW5nZTogUmFuZ2UgfCBudWxsXG4gICAgcmFuZ2U6IFJhbmdlIHzCoG51bGxcbiAgICBzb3VyY2U6IHN0cmluZ1xuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgb25Db250ZW50Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHtcbiAgICBjb250ZW50OiBhbnlcbiAgICBkZWx0YTogYW55XG4gICAgZWRpdG9yOiBhbnlcbiAgICBodG1sOiBzdHJpbmcgfCBudWxsXG4gICAgb2xkRGVsdGE6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG4gICAgdGV4dDogc3RyaW5nXG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjx7XG4gICAgZWRpdG9yOiBhbnlcbiAgICBvbGRSYW5nZTogUmFuZ2UgfCBudWxsXG4gICAgcmFuZ2U6IFJhbmdlIHzCoG51bGxcbiAgICBzb3VyY2U6IHN0cmluZ1xuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICBAT3V0cHV0KCkgb25Gb2N1czogRXZlbnRFbWl0dGVyPHtcbiAgICBlZGl0b3I6IGFueVxuICAgIHNvdXJjZTogc3RyaW5nXG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBPdXRwdXQoKSBvbkJsdXI6IEV2ZW50RW1pdHRlcjx7XG4gICAgZWRpdG9yOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIGRpc2FibGVkID0gZmFsc2UgLy8gdXNlZCB0byBzdG9yZSBpbml0aWFsIHZhbHVlIGJlZm9yZSBWaWV3SW5pdFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnksXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmJhbi10eXBlc1xuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KFFVSUxMX0NPTkZJR19UT0tFTikgcHJpdmF0ZSBjb25maWc6IFF1aWxsQ29uZmlnXG4gICkge31cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgb25Nb2RlbENoYW5nZShfbW9kZWxWYWx1ZT86IGFueSkge31cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gIG9uTW9kZWxUb3VjaGVkKCkge31cblxuICBASW5wdXQoKVxuICB2YWx1ZUdldHRlciA9IChxdWlsbEVkaXRvcjogYW55LCBlZGl0b3JFbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB8IGFuecKgID0+IHtcbiAgICBsZXQgaHRtbDogc3RyaW5nIHwgbnVsbCA9IGVkaXRvckVsZW1lbnQucXVlcnlTZWxlY3RvcignLnFsLWVkaXRvcicpIS5pbm5lckhUTUxcbiAgICBpZiAoaHRtbCA9PT0gJzxwPjxicj48L3A+JyB8fCBodG1sID09PSAnPGRpdj48YnI+PGRpdj4nKSB7XG4gICAgICBodG1sID0gbnVsbFxuICAgIH1cbiAgICBsZXQgbW9kZWxWYWx1ZSA9IGh0bWxcbiAgICBjb25zdCBmb3JtYXQgPSBnZXRGb3JtYXQodGhpcy5mb3JtYXQsIHRoaXMuY29uZmlnLmZvcm1hdClcblxuICAgIGlmIChmb3JtYXQgPT09ICd0ZXh0Jykge1xuICAgICAgbW9kZWxWYWx1ZSA9IHF1aWxsRWRpdG9yLmdldFRleHQoKVxuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnb2JqZWN0Jykge1xuICAgICAgbW9kZWxWYWx1ZSA9IHF1aWxsRWRpdG9yLmdldENvbnRlbnRzKClcbiAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2RlbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocXVpbGxFZGl0b3IuZ2V0Q29udGVudHMoKSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbW9kZWxWYWx1ZSA9IHF1aWxsRWRpdG9yLmdldFRleHQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlbFZhbHVlXG4gIH1cblxuICBASW5wdXQoKVxuICB2YWx1ZVNldHRlciA9IChxdWlsbEVkaXRvcjogYW55LCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICBjb25zdCBmb3JtYXQgPSBnZXRGb3JtYXQodGhpcy5mb3JtYXQsIHRoaXMuY29uZmlnLmZvcm1hdClcbiAgICBpZiAoZm9ybWF0ID09PSAnaHRtbCcpIHtcbiAgICAgIGlmICh0aGlzLnNhbml0aXplKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIHZhbHVlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHF1aWxsRWRpdG9yLmNsaXBib2FyZC5jb252ZXJ0KHZhbHVlKVxuICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gW3sgaW5zZXJ0OiB2YWx1ZSB9XVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIVF1aWxsKSB7XG4gICAgICBRdWlsbCA9IHJlcXVpcmUoJ3F1aWxsJylcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICB0aGlzLmN1c3RvbVRvb2xiYXJQb3NpdGlvbiA9PT0gJ3RvcCcgPyAnYmVmb3JlZW5kJyA6ICdhZnRlcmJlZ2luJyxcbiAgICAgIHRoaXMucHJlc2VydmVXaGl0ZXNwYWNlID8gJzxwcmUgcXVpbGwtZWRpdG9yLWVsZW1lbnQ+PC9wcmU+JyA6ICc8ZGl2IHF1aWxsLWVkaXRvci1lbGVtZW50PjwvZGl2PidcbiAgICApXG5cbiAgICB0aGlzLmVkaXRvckVsZW0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJ1txdWlsbC1lZGl0b3ItZWxlbWVudF0nXG4gICAgKVxuXG4gICAgY29uc3QgdG9vbGJhckVsZW0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJ1txdWlsbC1lZGl0b3ItdG9vbGJhcl0nXG4gICAgKVxuICAgIGNvbnN0IG1vZHVsZXMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZHVsZXMgfHwgKHRoaXMuY29uZmlnLm1vZHVsZXMgfHzCoGRlZmF1bHRNb2R1bGVzKSlcblxuICAgIGlmICh0b29sYmFyRWxlbSkge1xuICAgICAgbW9kdWxlcy50b29sYmFyID0gdG9vbGJhckVsZW1cbiAgICB9IGVsc2UgaWYgKG1vZHVsZXMudG9vbGJhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2R1bGVzLnRvb2xiYXIgPSBkZWZhdWx0TW9kdWxlcy50b29sYmFyXG4gICAgfVxuXG4gICAgbGV0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkID8gdGhpcy5wbGFjZWhvbGRlciA6IHRoaXMuY29uZmlnLnBsYWNlaG9sZGVyXG4gICAgaWYgKHBsYWNlaG9sZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBsYWNlaG9sZGVyID0gJ0luc2VydCB0ZXh0IGhlcmUgLi4uJ1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0eWxlcykge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lZGl0b3JFbGVtLCBrZXksIHRoaXMuc3R5bGVzW2tleV0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuY3VzdG9tT3B0aW9ucy5mb3JFYWNoKChjdXN0b21PcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG5ld0N1c3RvbU9wdGlvbiA9IFF1aWxsLmltcG9ydChjdXN0b21PcHRpb24uaW1wb3J0KVxuICAgICAgbmV3Q3VzdG9tT3B0aW9uLndoaXRlbGlzdCA9IGN1c3RvbU9wdGlvbi53aGl0ZWxpc3RcbiAgICAgIFF1aWxsLnJlZ2lzdGVyKG5ld0N1c3RvbU9wdGlvbiwgdHJ1ZSlcbiAgICB9KVxuXG4gICAgbGV0IGJvdW5kcyA9IHRoaXMuYm91bmRzICYmIHRoaXMuYm91bmRzID09PSAnc2VsZicgPyB0aGlzLmVkaXRvckVsZW0gOiB0aGlzLmJvdW5kc1xuICAgIGlmICghYm91bmRzKSB7XG4gICAgICBib3VuZHMgPSB0aGlzLmNvbmZpZy5ib3VuZHMgPyB0aGlzLmNvbmZpZy5ib3VuZHMgOiB0aGlzLmRvYy5ib2R5XG4gICAgfVxuXG4gICAgbGV0IGRlYnVnID0gdGhpcy5kZWJ1Z1xuICAgIGlmICghZGVidWcgJiYgZGVidWcgIT09IGZhbHNlICYmIHRoaXMuY29uZmlnLmRlYnVnKSB7XG4gICAgICBkZWJ1ZyA9IHRoaXMuY29uZmlnLmRlYnVnXG