ngx-quill
Version:
An angular (>= v2) component for the easy use of the QuillJS richt text editor.
645 lines • 55.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
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
/** @type {?} */
var Quill = null;
/**
* @record
*/
export function CustomOption() { }
if (false) {
/** @type {?} */
CustomOption.prototype.import;
/** @type {?} */
CustomOption.prototype.whitelist;
}
/**
* @record
*/
export function Range() { }
if (false) {
/** @type {?} */
Range.prototype.index;
/** @type {?} */
Range.prototype.length;
}
var QuillEditorComponent = /** @class */ (function () {
function QuillEditorComponent(elementRef, domSanitizer, doc, 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.format = 'html';
this.required = false;
this.customToolbarPosition = 'top';
this.sanitize = false;
this.style = null;
this.strict = true;
this.customOptions = [];
this.onEditorCreated = new EventEmitter();
this.onContentChanged = new EventEmitter();
this.onSelectionChanged = new EventEmitter();
this.disabled = false; // used to store initial value before ViewInit
this.valueGetter = (/**
* @param {?} quillEditor
* @param {?} editorElement
* @return {?}
*/
function (quillEditor, editorElement) {
/** @type {?} */
var html = editorElement.children[0].innerHTML;
if (html === '<p><br></p>' || html === '<div><br><div>') {
html = null;
}
/** @type {?} */
var modelValue = html;
if (_this.format === 'text') {
modelValue = quillEditor.getText();
}
else if (_this.format === 'object') {
modelValue = quillEditor.getContents();
}
else if (_this.format === 'json') {
try {
modelValue = JSON.stringify(quillEditor.getContents());
}
catch (e) {
modelValue = quillEditor.getText();
}
}
return modelValue;
});
this.valueSetter = (/**
* @param {?} quillEditor
* @param {?} value
* @return {?}
*/
function (quillEditor, value) {
if (_this.format === 'html') {
if (_this.sanitize) {
value = _this.domSanitizer.sanitize(SecurityContext.HTML, value);
}
return quillEditor.clipboard.convert(value);
}
else if (_this.format === 'json') {
try {
return JSON.parse(value);
}
catch (e) {
return [{ insert: value }];
}
}
return value;
});
this.selectionChangeHandler = (/**
* @param {?} range
* @param {?} oldRange
* @param {?} source
* @return {?}
*/
function (range, oldRange, source) {
_this.zone.run((/**
* @return {?}
*/
function () {
_this.onSelectionChanged.emit({
editor: _this.quillEditor,
oldRange: oldRange,
range: range,
source: source
});
if (!range && _this.onModelTouched) {
_this.onModelTouched();
}
}));
});
this.textChangeHandler = (/**
* @param {?} delta
* @param {?} oldDelta
* @param {?} source
* @return {?}
*/
function (delta, oldDelta, source) {
// only emit changes emitted by user interactions
// only emit changes emitted by user interactions
/** @type {?} */
var text = _this.quillEditor.getText();
/** @type {?} */
var content = _this.quillEditor.getContents();
/** @type {?} */
var html = (/** @type {?} */ (_this.editorElem)).children[0].innerHTML;
if (html === '<p><br></p>' || html === '<div><br><div>') {
html = null;
}
_this.zone.run((/**
* @return {?}
*/
function () {
/** @type {?} */
var trackChanges = _this.trackChanges || _this.config.trackChanges;
if ((source === Quill.sources.USER || trackChanges && trackChanges === 'all') && _this.onModelChange) {
_this.onModelChange(_this.valueGetter(_this.quillEditor, (/** @type {?} */ (_this.editorElem))));
}
_this.onContentChanged.emit({
content: content,
delta: delta,
editor: _this.quillEditor,
html: html,
oldDelta: oldDelta,
source: source,
text: text
});
}));
});
}
// tslint:disable-next-line:no-empty
// tslint:disable-next-line:no-empty
/**
* @param {?=} _modelValue
* @return {?}
*/
QuillEditorComponent.prototype.onModelChange =
// tslint:disable-next-line:no-empty
/**
* @param {?=} _modelValue
* @return {?}
*/
function (_modelValue) { };
// tslint:disable-next-line:no-empty
// tslint:disable-next-line:no-empty
/**
* @return {?}
*/
QuillEditorComponent.prototype.onModelTouched =
// tslint:disable-next-line:no-empty
/**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
QuillEditorComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
if (isPlatformServer(this.platformId)) {
return;
}
if (!Quill) {
Quill = require('quill');
}
if (this.customToolbarPosition === 'top') {
this.elementRef.nativeElement.insertAdjacentHTML('beforeend', '<div quill-editor-element></div>');
}
else {
this.elementRef.nativeElement.insertAdjacentHTML('afterbegin', '<div quill-editor-element></div>');
}
this.editorElem = this.elementRef.nativeElement.querySelector('[quill-editor-element]');
/** @type {?} */
var toolbarElem = this.elementRef.nativeElement.querySelector('[quill-editor-toolbar]');
/** @type {?} */
var modules = this.modules || (this.config.modules || defaultModules);
if (modules.toolbar === undefined) {
modules.toolbar = defaultModules.toolbar;
}
/** @type {?} */
var placeholder = this.placeholder !== undefined ? this.placeholder : this.config.placeholder;
if (placeholder === undefined) {
placeholder = 'Insert text here ...';
}
if (toolbarElem) {
// tslint:disable-next-line:no-string-literal
modules['toolbar'] = toolbarElem;
}
if (this.style) {
Object.keys(this.style).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.renderer.setStyle(_this.editorElem, key, _this.style[key]);
}));
}
this.customOptions.forEach((/**
* @param {?} customOption
* @return {?}
*/
function (customOption) {
/** @type {?} */
var newCustomOption = Quill.import(customOption.import);
newCustomOption.whitelist = customOption.whitelist;
Quill.register(newCustomOption, true);
}));
/** @type {?} */
var bounds = this.bounds && this.bounds === 'self' ? this.editorElem : this.bounds;
if (!bounds) {
bounds = this.config.bounds ? this.config.bounds : this.doc.body;
}
/** @type {?} */
var debug = this.debug;
if (!debug && debug !== false && this.config.debug) {
debug = this.config.debug;
}
/** @type {?} */
var readOnly = this.readOnly;
if (!readOnly && this.readOnly !== false) {
readOnly = this.config.readOnly !== undefined ? this.config.readOnly : false;
}
/** @type {?} */
var scrollingContainer = this.scrollingContainer;
if (!scrollingContainer && this.scrollingContainer !== null) {
scrollingContainer = this.config.scrollingContainer === null || this.config.scrollingContainer ? this.config.scrollingContainer : null;
}
/** @type {?} */
var formats = this.formats;
if (!formats && formats === undefined) {
formats = this.config.formats || this.config.formats === null ? this.config.formats : 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) {
if (this.format === 'object') {
this.quillEditor.setContents(this.content, 'silent');
}
else if (this.format === 'text') {
this.quillEditor.setText(this.content, 'silent');
}
else if (this.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);
}
/** @type {?} */
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();
this.onEditorCreated.emit(this.quillEditor);
// 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);
};
/**
* @return {?}
*/
QuillEditorComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.quillEditor) {
this.quillEditor.off('selection-change', this.selectionChangeHandler);
this.quillEditor.off('text-change', this.textChangeHandler);
}
};
/**
* @param {?} changes
* @return {?}
*/
QuillEditorComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
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['style']) {
/** @type {?} */
var currentStyling = changes['style'].currentValue;
/** @type {?} */
var previousStyling = changes['style'].previousValue;
if (previousStyling) {
Object.keys(previousStyling).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.renderer.removeStyle(_this.editorElem, key);
}));
}
if (currentStyling) {
Object.keys(currentStyling).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.renderer.setStyle(_this.editorElem, key, _this.style[key]);
}));
}
}
// tslint:enable:no-string-literal
};
/**
* @param {?} currentValue
* @return {?}
*/
QuillEditorComponent.prototype.writeValue = /**
* @param {?} currentValue
* @return {?}
*/
function (currentValue) {
this.content = currentValue;
if (this.quillEditor) {
if (currentValue) {
if (this.format === 'text') {
this.quillEditor.setText(currentValue);
}
else {
this.quillEditor.setContents(this.valueSetter(this.quillEditor, this.content));
}
return;
}
this.quillEditor.setText('');
}
};
/**
* @param {?=} isDisabled
* @return {?}
*/
QuillEditorComponent.prototype.setDisabledState = /**
* @param {?=} isDisabled
* @return {?}
*/
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');
}
}
};
/**
* @param {?} fn
* @return {?}
*/
QuillEditorComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onModelChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
QuillEditorComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onModelTouched = fn;
};
/**
* @return {?}
*/
QuillEditorComponent.prototype.validate = /**
* @return {?}
*/
function () {
if (!this.quillEditor) {
return null;
}
/** @type {?} */
var err = {};
/** @type {?} */
var valid = true;
/** @type {?} */
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;
};
QuillEditorComponent.decorators = [
{ type: Component, args: [{
encapsulation: ViewEncapsulation.None,
providers: [
{
multi: true,
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return QuillEditorComponent; }))
},
{
multi: true,
provide: NG_VALIDATORS,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return QuillEditorComponent; }))
}
],
selector: 'quill-editor',
template: "\n <ng-content select=\"[quill-editor-toolbar]\"></ng-content>\n"
}] }
];
/** @nocollapse */
QuillEditorComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: DomSanitizer },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: Renderer2 },
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [QUILL_CONFIG_TOKEN,] }] }
]; };
QuillEditorComponent.propDecorators = {
format: [{ type: Input }],
theme: [{ type: Input }],
modules: [{ type: Input }],
debug: [{ type: Input }],
readOnly: [{ type: Input }],
placeholder: [{ type: Input }],
maxLength: [{ type: Input }],
minLength: [{ type: Input }],
required: [{ type: Input }],
formats: [{ type: Input }],
customToolbarPosition: [{ type: Input }],
sanitize: [{ type: Input }],
style: [{ type: Input }],
strict: [{ type: Input }],
scrollingContainer: [{ type: Input }],
bounds: [{ type: Input }],
customOptions: [{ type: Input }],
trackChanges: [{ type: Input }],
onEditorCreated: [{ type: Output }],
onContentChanged: [{ type: Output }],
onSelectionChanged: [{ type: Output }],
valueGetter: [{ type: Input }],
valueSetter: [{ type: Input }]
};
return QuillEditorComponent;
}());
export { QuillEditorComponent };
if (false) {
/** @type {?} */
QuillEditorComponent.prototype.quillEditor;
/** @type {?} */
QuillEditorComponent.prototype.editorElem;
/** @type {?} */
QuillEditorComponent.prototype.content;
/** @type {?} */
QuillEditorComponent.prototype.format;
/** @type {?} */
QuillEditorComponent.prototype.theme;
/** @type {?} */
QuillEditorComponent.prototype.modules;
/** @type {?} */
QuillEditorComponent.prototype.debug;
/** @type {?} */
QuillEditorComponent.prototype.readOnly;
/** @type {?} */
QuillEditorComponent.prototype.placeholder;
/** @type {?} */
QuillEditorComponent.prototype.maxLength;
/** @type {?} */
QuillEditorComponent.prototype.minLength;
/** @type {?} */
QuillEditorComponent.prototype.required;
/** @type {?} */
QuillEditorComponent.prototype.formats;
/** @type {?} */
QuillEditorComponent.prototype.customToolbarPosition;
/** @type {?} */
QuillEditorComponent.prototype.sanitize;
/** @type {?} */
QuillEditorComponent.prototype.style;
/** @type {?} */
QuillEditorComponent.prototype.strict;
/** @type {?} */
QuillEditorComponent.prototype.scrollingContainer;
/** @type {?} */
QuillEditorComponent.prototype.bounds;
/** @type {?} */
QuillEditorComponent.prototype.customOptions;
/** @type {?} */
QuillEditorComponent.prototype.trackChanges;
/** @type {?} */
QuillEditorComponent.prototype.onEditorCreated;
/** @type {?} */
QuillEditorComponent.prototype.onContentChanged;
/** @type {?} */
QuillEditorComponent.prototype.onSelectionChanged;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.disabled;
/** @type {?} */
QuillEditorComponent.prototype.valueGetter;
/** @type {?} */
QuillEditorComponent.prototype.valueSetter;
/** @type {?} */
QuillEditorComponent.prototype.selectionChangeHandler;
/** @type {?} */
QuillEditorComponent.prototype.textChangeHandler;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.domSanitizer;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.doc;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.platformId;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.zone;
/**
* @type {?}
* @private
*/
QuillEditorComponent.prototype.config;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1xdWlsbC8iLCJzb3VyY2VzIjpbInNyYy9xdWlsbC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFeEQsT0FBTyxFQUFFLGtCQUFrQixFQUE2QixNQUFNLDJCQUEyQixDQUFBO0FBRXpGLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZUFBZSxFQUVmLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQTtBQUV0QixPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7OztJQU03QyxLQUFLLEdBQVEsSUFBSTs7OztBQUVyQixrQ0FHQzs7O0lBRkMsOEJBQWM7O0lBQ2QsaUNBQWdCOzs7OztBQUdsQiwyQkFHQzs7O0lBRkMsc0JBQWE7O0lBQ2IsdUJBQWM7O0FBR2hCO0lBZ0VFLDhCQUNVLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQ1IsR0FBUSxFQUVMLFVBQWtCLEVBQ3ZDLFFBQW1CLEVBQ25CLElBQVksRUFDZ0IsTUFBbUI7UUFSekQsaUJBU0k7UUFSTSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ1IsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUVMLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsYUFB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QUE4RDs7SUFDOUQscUNBQXVCOztJQUN2Qix1Q0FBK0I7O0lBQy9CLHFDQUFpRDs7SUFDakQsd0NBQTJCOztJQUMzQiwyQ0FBNkI7O0lBQzdCLHlDQUEyQjs7SUFDM0IseUNBQTJCOztJQUMzQix3Q0FBa0M7O0lBQ2xDLHVDQUFrQzs7SUFDbEMscURBQXdEOztJQUN4RCx3Q0FBa0M7O0lBQ2xDLHFDQUEwQjs7SUFDMUIsc0NBQStCOztJQUMvQixrREFBeUQ7O0lBQ3pELHNDQUFzQzs7SUFDdEMsNkNBQTJDOztJQUMzQyw0Q0FBc0M7O0lBRXRDLCtDQUFpRTs7SUFDakUsZ0RBUXVCOztJQUN2QixrREFLdUI7Ozs7O0lBRXZCLHdDQUF3Qjs7SUFrQnhCLDJDQXFCQzs7SUFFRCwyQ0FnQkM7O0lBb0lELHNEQWFDOztJQUVELGlEQTZCQzs7Ozs7SUF0T0MsMENBQThCOzs7OztJQUM5Qiw0Q0FBa0M7Ozs7O0lBQ2xDLG1DQUFrQzs7Ozs7SUFFbEMsMENBQStDOzs7OztJQUMvQyx3Q0FBMkI7Ozs7O0lBQzNCLG9DQUFvQjs7Ozs7SUFDcEIsc0NBQXVEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybVNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInXG5cbmltcG9ydCB7IFFVSUxMX0NPTkZJR19UT0tFTiwgUXVpbGxDb25maWcsIFF1aWxsTW9kdWxlcyB9IGZyb20gJy4vcXVpbGwtZWRpdG9yLmludGVyZmFjZXMnXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBSZW5kZXJlcjIsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcblxuaW1wb3J0IHtcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5cbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgZGVmYXVsdE1vZHVsZXMgfSBmcm9tICcuL3F1aWxsLWRlZmF1bHRzJ1xuXG4vLyBCZWNhdXNlIHF1aWxsIHVzZXMgYGRvY3VtZW50YCBkaXJlY3RseSwgd2UgY2Fubm90IGBpbXBvcnRgIGR1cmluZyBTU1Jcbi8vIGluc3RlYWQsIHdlIGxvYWQgZHluYW1pY2FsbHkgdmlhIGByZXF1aXJlKCdxdWlsbCcpYCBpbiBgbmdBZnRlclZpZXdJbml0KClgXG5kZWNsYXJlIHZhciByZXF1aXJlOiBhbnlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5sZXQgUXVpbGw6IGFueSA9IG51bGxcblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21PcHRpb24ge1xuICBpbXBvcnQ6IHN0cmluZ1xuICB3aGl0ZWxpc3Q6IGFueVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2Uge1xuICBpbmRleDogbnVtYmVyXG4gIGxlbmd0aDogbnVtYmVyXG59XG5cbkBDb21wb25lbnQoe1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUXVpbGxFZGl0b3JDb21wb25lbnQpXG4gICAgfSxcbiAgICB7XG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBRdWlsbEVkaXRvckNvbXBvbmVudClcbiAgICB9XG4gIF0sXG4gIHNlbGVjdG9yOiAncXVpbGwtZWRpdG9yJyxcbiAgdGVtcGxhdGU6IGBcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3F1aWxsLWVkaXRvci10b29sYmFyXVwiPjwvbmctY29udGVudD5cbmBcbn0pXG5leHBvcnQgY2xhc3MgUXVpbGxFZGl0b3JDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFZhbGlkYXRvciB7XG5cbiAgcXVpbGxFZGl0b3I6IGFueVxuICBlZGl0b3JFbGVtOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZFxuICBjb250ZW50OiBhbnlcblxuICBASW5wdXQoKSBmb3JtYXQ/OiAnb2JqZWN0JyB8ICdodG1sJyB8ICd0ZXh0JyB8ICdqc29uJyA9ICdodG1sJ1xuICBASW5wdXQoKSB0aGVtZT86IHN0cmluZ1xuICBASW5wdXQoKSBtb2R1bGVzPzogUXVpbGxNb2R1bGVzXG4gIEBJbnB1dCgpIGRlYnVnPzogJ3dhcm4nIHzCoCdsb2cnIHzCoCdlcnJvcicgfMKgZmFsc2VcbiAgQElucHV0KCkgcmVhZE9ubHk/OiBib29sZWFuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIEBJbnB1dCgpIG1heExlbmd0aD86IG51bWJlclxuICBASW5wdXQoKSBtaW5MZW5ndGg/OiBudW1iZXJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBmb3JtYXRzPzogc3RyaW5nW10gfMKgbnVsbFxuICBASW5wdXQoKSBjdXN0b21Ub29sYmFyUG9zaXRpb246ICd0b3AnIHzCoCdib3R0b20nID0gJ3RvcCdcbiAgQElucHV0KCkgc2FuaXRpemU6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBzdHlsZTogYW55ID0gbnVsbFxuICBASW5wdXQoKSBzdHJpY3Q6IGJvb2xlYW4gPSB0cnVlXG4gIEBJbnB1dCgpIHNjcm9sbGluZ0NvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgc3RyaW5nIHwgbnVsbFxuICBASW5wdXQoKSBib3VuZHM/OiBIVE1MRWxlbWVudCB8IHN0cmluZ1xuICBASW5wdXQoKSBjdXN0b21PcHRpb25zOiBDdXN0b21PcHRpb25bXSA9IFtdXG4gIEBJbnB1dCgpIHRyYWNrQ2hhbmdlcz86ICd1c2VyJyB8wqAnYWxsJ1xuXG4gIEBPdXRwdXQoKSBvbkVkaXRvckNyZWF0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIEBPdXRwdXQoKSBvbkNvbnRlbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8e1xuICAgIGNvbnRlbnQ6IGFueVxuICAgIGRlbHRhOiBhbnlcbiAgICBlZGl0b3I6IGFueVxuICAgIGh0bWw6IHN0cmluZyB8IG51bGxcbiAgICBvbGREZWx0YTogYW55XG4gICAgc291cmNlOiBzdHJpbmdcbiAgICB0ZXh0OiBzdHJpbmdcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPHtcbiAgICBlZGl0b3I6IGFueVxuICAgIG9sZFJhbmdlOiBSYW5nZSB8IG51bGxcbiAgICByYW5nZTogUmFuZ2UgfMKgbnVsbFxuICAgIHNvdXJjZTogc3RyaW5nXG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgcHJpdmF0ZSBkaXNhYmxlZCA9IGZhbHNlIC8vIHVzZWQgdG8gc3RvcmUgaW5pdGlhbCB2YWx1ZSBiZWZvcmUgVmlld0luaXRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55LFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpiYW4tdHlwZXNcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgQEluamVjdChRVUlMTF9DT05GSUdfVE9LRU4pIHByaXZhdGUgY29uZmlnOiBRdWlsbENvbmZpZ1xuICApIHt9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gIG9uTW9kZWxDaGFuZ2UoX21vZGVsVmFsdWU/OiBhbnkpIHt9XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eVxuICBvbk1vZGVsVG91Y2hlZCgpIHt9XG5cbiAgQElucHV0KClcbiAgdmFsdWVHZXR0ZXIgPSAocXVpbGxFZGl0b3I6IGFueSwgZWRpdG9yRWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgfCBhbnnCoCA9PiB7XG4gICAgbGV0IGh0bWw6IHN0cmluZyB8IG51bGwgPSBlZGl0b3JFbGVtZW50LmNoaWxkcmVuWzBdLmlubmVySFRNTFxuICAgIGlmIChodG1sID09PSAnPHA+PGJyPjwvcD4nIHx8IGh0bWwgPT09ICc8ZGl2Pjxicj48ZGl2PicpIHtcbiAgICAgIGh0bWwgPSBudWxsXG4gICAgfVxuICAgIGxldCBtb2RlbFZhbHVlID0gaHRtbFxuXG4gICAgaWYgKHRoaXMuZm9ybWF0ID09PSAndGV4dCcpIHtcbiAgICAgIG1vZGVsVmFsdWUgPSBxdWlsbEVkaXRvci5nZXRUZXh0KClcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWF0ID09PSAnb2JqZWN0Jykge1xuICAgICAgbW9kZWxWYWx1ZSA9IHF1aWxsRWRpdG9yLmdldENvbnRlbnRzKClcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1vZGVsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShxdWlsbEVkaXRvci5nZXRDb250ZW50cygpKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBtb2RlbFZhbHVlID0gcXVpbGxFZGl0b3IuZ2V0VGV4dCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsVmFsdWVcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHZhbHVlU2V0dGVyID0gKHF1aWxsRWRpdG9yOiBhbnksIHZhbHVlOiBhbnkpOiBhbnkgPT4ge1xuICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gJ2h0bWwnKSB7XG4gICAgICBpZiAodGhpcy5zYW5pdGl6ZSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuZG9tU2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBxdWlsbEVkaXRvci5jbGlwYm9hcmQuY29udmVydCh2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gW3sgaW5zZXJ0OiB2YWx1ZSB9XVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmIChpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIVF1aWxsKSB7XG4gICAgICBRdWlsbCA9IHJlcXVpcmUoJ3F1aWxsJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jdXN0b21Ub29sYmFyUG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICdiZWZvcmVlbmQnLFxuICAgICAgICAnPGRpdiBxdWlsbC1lZGl0b3ItZWxlbWVudD48L2Rpdj4nXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmluc2VydEFkamFjZW50SFRNTChcbiAgICAgICAgJ2FmdGVyYmVnaW4nLFxuICAgICAgICAnPGRpdiBxdWlsbC1lZGl0b3ItZWxlbWVudD48L2Rpdj4nXG4gICAgICApXG4gICAgfVxuICAgIHRoaXMuZWRpdG9yRWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnW3F1aWxsLWVkaXRvci1lbGVtZW50XSdcbiAgICApXG5cbiAgICBjb25zdCB0b29sYmFyRWxlbSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnW3F1aWxsLWVkaXRvci10b29sYmFyXSdcbiAgICApXG4gICAgY29uc3QgbW9kdWxlcyA9IHRoaXMubW9kdWxlcyB8fCAodGhpcy5jb25maWcubW9kdWxlcyB8fMKgZGVmYXVsdE1vZHVsZXMpXG4gICAgaWYgKG1vZHVsZXMudG9vbGJhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2R1bGVzLnRvb2xiYXIgPSBkZWZhdWx0TW9kdWxlcy50b29sYmFyXG4gICAgfVxuXG4gICAgbGV0IHBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciAhPT0gdW5kZWZpbmVkID8gdGhpcy5wbGFjZWhvbGRlciA6IHRoaXMuY29uZmlnLnBsYWNlaG9sZGVyXG4gICAgaWYgKHBsYWNlaG9sZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBsYWNlaG9sZGVyID0gJ0luc2VydCB0ZXh0IGhlcmUgLi4uJ1xuICAgIH1cblxuICAgIGlmICh0b29sYmFyRWxlbSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN0cmluZy1saXRlcmFsXG4gICAgICBtb2R1bGVzWyd0b29sYmFyJ10gPSB0b29sYmFyRWxlbVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN0eWxlKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWRpdG9yRWxlbSwga2V5LCB0aGlzLnN0eWxlW2tleV0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuY3VzdG9tT3B0aW9ucy5mb3JFYWNoKChjdXN0b21PcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG5ld0N1c3RvbU9wdGlvbiA9IFF1aWxsLmltcG9ydChjdXN0b21PcHRpb24uaW1wb3J0KVxuICAgICAgbmV3Q3VzdG9tT3B0aW9uLndoaXRlbGlzdCA9IGN1c3RvbU9wdGlvbi53aGl0ZWxpc3RcbiAgICAgIFF1aWxsLnJlZ2lzdGVyKG5ld0N1c3RvbU9wdGlvbiwgdHJ1ZSlcbiAgICB9KVxuXG4gICAgbGV0IGJvdW5kcyA9IHRoaXMuYm91bmRzICYmIHRoaXMuYm91bmRzID09PSAnc2VsZicgPyB0aGlzLmVkaXRvckVsZW0gOiB0aGlzLmJvdW5kc1xuICAgIGlmICghYm91bmRzKSB7XG4gICAgICBib3VuZHMgPSB0aGlzLmNvbmZpZy5ib3VuZHMgPyB0aGlzLmNvbmZpZy5ib3VuZHMgOiB0aGlzLmRvYy5ib2R5XG4gICAgfVxuXG4gICAgbGV0IGRlYnVnID0gdGhpcy5kZWJ1Z1xuICAgIGlmICghZGVidWcgJiYgZGVidWcgIT09IGZhbHNlICYmIHRoaXMuY29uZmlnLmRlYnVnKSB7XG4gICAgICBkZWJ1ZyA9IHRoaXMuY29uZmlnLmRlYnVnXG4gICAgfVxuXG4gICAgbGV0IHJlYWRPbmx5ID0gdGhpcy5yZWFkT25seVxuICAgIGlmICghcmVhZE9ubHkgJiYgdGhpcy5yZWFkT25seSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlYWRPbmx5ID0gdGhpcy5jb25maWcucmVhZE9ubHkgIT09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlnLnJlYWRPbmx5IDogZmFsc2VcbiAgICB9XG5cbiAgICBsZXQgc2Nyb2xsaW5nQ29udGFpbmVyID0gdGhpcy5zY3JvbGxpbmdDb250YWluZXJcbiAgICBpZiAoIXNjcm9sbGluZ0NvbnRhaW5lciAmJiB0aGlzLnNjcm9sbGluZ0NvbnRhaW5lciAhPT0gbnVsbCkge1xuICAgICAgc2Nyb2xsaW5nQ29udGFpbmVyID0gdGhpcy5jb25maWcuc2Nyb2xsaW5nQ29udGFpbmVyID09PSBudWxsIHx8wqB0aGlzLmNvbmZpZy5zY3JvbGxpbmdDb250YWluZXIgPyB0aGlzLmNvbmZpZy5zY3JvbGxpbmdDb250YWluZXIgOiBudWxsXG4gICAgfVxuXG4gICAgbGV0IGZvcm1hdHMgPSB0aGlzLmZvcm1hdHNcbiAgICBpZiAoIWZvcm1hdHMgJiYgZm9ybWF0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3JtYXRzID0gdGhpcy5jb25maWcuZm9ybWF0cyB8fMKgdGhpcy5jb25maWcuZm9ybWF0cyA9PT0gbnVsbCA/IHRoaXMuY29uZmlnLmZvcm1hdHMgOiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICB0aGlzLnF1aWxsRWRpdG9yID0gbmV3IFF1aWxsKHRoaXMuZWRpdG9yRWxlbSwge1xuICAgICAgYm91bmRzLFxuICAgICAgZGVidWcsXG4gICAgICBmb3JtYXRzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgcmVhZE9ubHksXG4gICAgICBzY3JvbGxpbmdDb250YWluZXIsXG4gICAgICBzdHJpY3Q6IHRoaXMuc3RyaWN0LFxuICAgICAgdGhlbWU6IHRoaXMudGhlbWUgfHwgKHRoaXMuY29uZmlnLnRoZW1lID8gdGhpcy5jb25maWcudGhlbWUgOiAnc25vdycpXG4gICAgfSlcblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhpcy5xdWlsbEVkaXRvci5zZXRDb250ZW50cyh0aGlzLmNvbnRlbnQsICdzaWxlbnQnKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1hdCA9PT0gJ3RleHQnKSB7XG4gICAgICAgIHRoaXMucXVpbGxFZGl0b3Iuc2V0VGV4dCh0aGlzLmNvbnRlbnQsICdzaWxlbnQnKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5xdWlsbEVkaXRvci5zZXRDb250ZW50cyhKU09OLnBhcnNlKHRoaXMuY29udGVudCksICdzaWxlbnQnKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5xdWlsbEVkaXRvci5zZXRUZXh0KHRoaXMuY29udGVudCwgJ3NpbGVudCcpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnNhbml0aXplKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50ID0gdGhpcy5kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIHRoaXMuY29udGVudClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50cyA9IHRoaXMucXVpbGxFZGl0b3IuY2xpcGJvYXJkLmNvbnZlcnQodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLnF1aWxsRWRpdG9yLnNldENvbnRlbnRzKGNvbnRlbnRzLCAnc2lsZW50JylcbiAgICAgIH1cblxuICAgICAgdGhpcy5xdWlsbEVkaXRvci5oaXN0b3J5LmNsZWFyKClcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGRpc2FibGVkIHN0YXR1cyBiYXNlZCBvbiB0aGlzLmRpc2FibGVkIGFzIGRlZmF1bHQgdmFsdWVcbiAgICB0aGlzLnNldERpc2FibGVkU3RhdGUoKVxuXG4gICAgdGhpcy5vbkVkaXRvckNyZWF0ZWQuZW1pdCh0aGlzLnF1aWxsRWRpdG9yKVxuXG4gICAgLy8gbWFyayBtb2RlbCBhcyB0b3VjaGVkIGlmIGVkaXRvciBsb3N0IGZvY3VzXG4gICAgdGhpcy5xdWlsbEVkaXRvci5vbihcbiAgICAgICdzZWxlY3Rpb24tY2hhbmdlJyxcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlSGFuZGxlclxuICAgIClcblxuICAgIC8vIHVwZGF0ZSBtb2RlbCBpZiB0ZXh0IGNoYW5nZXNcbiAgICB0aGlzLnF1aWxsRWRpdG9yLm9uKFxuICAgICAgJ3RleHQtY2hhbmdlJyxcbiAgICAgIHRoaXMudGV4dENoYW5nZUhhbmRsZXJcbiAgICApXG4gIH1cblxuICBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyID0gKHJhbmdlOiBSYW5nZSB8wqBudWxsLCBvbGRSYW5nZTogUmFuZ2UgfCBudWxsLCBzb3VyY2U6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh7XG4gICAgICAgIGVkaXRvcjogdGhpcy5xdWlsbEVkaXRvcixcbiAgICAgICAgb2xkUmFuZ2UsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBzb3VyY2VcbiAgICAgIH0