ngx-jodit
Version:
Angular wrapper for jodit WYSIWYG editor
224 lines • 28.6 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { Jodit } from 'jodit';
import { BehaviorSubject, combineLatest, delay, distinctUntilChanged, filter, withLatestFrom, } from 'rxjs';
import * as i0 from "@angular/core";
export class NgxJoditComponent {
set options(value) {
this._options = value;
if (value) {
this.initJoditContainer();
}
}
set value(value) {
const sanitizedText = this.prepareText(value);
if (!this.internValueChange) {
this.valueSubject.next(sanitizedText);
}
else {
this.internValueChange = false;
}
this.onChange(sanitizedText);
}
get value() {
return this.valueSubject.getValue();
}
constructor(cdr) {
this.cdr = cdr;
// value property (subject)
this.valueSubject = new BehaviorSubject('');
this.valueChange = new EventEmitter();
//events
this.joditChange = new EventEmitter();
this.joditKeyDown = new EventEmitter();
this.joditKeyUp = new EventEmitter();
this.joditMousedown = new EventEmitter();
this.joditMouseup = new EventEmitter();
this.joditClick = new EventEmitter();
this.joditFocus = new EventEmitter();
this.joditPaste = new EventEmitter();
this.joditResize = new EventEmitter();
this.joditBeforeEnter = new EventEmitter();
this.joditBeforeCommand = new EventEmitter();
this.joditAfterExec = new EventEmitter();
this.joditAfterPaste = new EventEmitter();
this.joditChangeSelection = new EventEmitter();
// Used for delay value assignment to wait for jodit to be initialized
this.joditInitializedSubject = new BehaviorSubject(false);
this.internValueChange = false;
/*
FUNCTIONS RELEVANT FOR ANGULAR FORMS
*/
this.onChange = (text) => {
// implemented by user
};
this.onTouched = () => {
// implemented by user
};
this.valueSubscription = combineLatest([
// Handle value changes ...
this.valueSubject.asObservable().pipe(distinctUntilChanged()),
// ...additionally ensuring that the value is reapplied if the editor was not initialized when value was set
this.joditInitializedSubject.pipe(distinctUntilChanged(), filter((initialized) => initialized)),
])
.pipe(
// Pass through the latest value in case of editor initialization
withLatestFrom(this.valueSubject),
// Prevent ExpressionChangedAfterItHasBeenCheckedError
delay(0))
.subscribe(([[_, initialized], text]) => {
if (this.jodit && initialized) {
this.jodit.value = text;
}
});
}
isHTML(text) {
const elem = document.createElement('div');
elem.innerHTML = text;
return (text &&
elem.childNodes.length > 0 &&
elem.childNodes.item(0).nodeType !== 3);
}
ngAfterViewInit() {
this.initJoditContainer();
}
ngOnDestroy() {
this.valueSubscription?.unsubscribe();
this.jodit?.destruct();
}
initJoditContainer() {
if (this.joditContainer) {
if (this.jodit) {
this.jodit.destruct();
this.joditInitializedSubject.next(false);
}
this.jodit = Jodit.make(this.joditContainer.nativeElement, this._options);
this.jodit.value = this.valueSubject.getValue();
this.jodit.events.on('change', (text) => {
this.internValueChange = true;
this.changeValue(text);
this.joditChange.emit(text);
this.onChange(text);
});
this.jodit.events.on('keydown', (a) => {
this.joditKeyDown.emit(a);
});
this.jodit.events.on('keyup', (a) => {
this.joditKeyUp.emit(a);
});
this.jodit.events.on('mousedown', (a) => {
this.joditMousedown.emit(a);
});
this.jodit.events.on('mouseup', (a) => {
this.joditMouseup.emit(a);
});
this.jodit.events.on('click', (a) => {
this.joditClick.emit(a);
this.onTouched();
});
this.jodit.events.on('focus', (a) => {
this.joditFocus.emit(a);
});
this.jodit.events.on('paste', (a) => {
this.joditPaste.emit(a);
});
this.jodit.events.on('resize', () => {
this.joditResize.emit();
});
this.jodit.events.on('beforeEnter', (a) => {
this.joditBeforeEnter.emit(a);
});
this.jodit.events.on('beforeCommand', (a) => {
this.joditBeforeCommand.emit(a);
});
this.jodit.events.on('afterExec', () => {
this.joditAfterExec.emit();
});
this.jodit.events.on('afterPaste', (a) => {
this.joditAfterPaste.emit(a);
});
this.jodit.events.on('changeSelection', () => {
this.joditChangeSelection.emit();
});
this.joditInitializedSubject.next(true);
}
}
changeValue(value) {
this.valueChange.emit(value);
}
writeValue(text) {
this.valueSubject.next(this.prepareText(text));
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.options = {
...this._options,
disabled: isDisabled,
};
}
prepareText(text) {
return this.isHTML(text) ? text : `<p>${text}</p>`;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NgxJoditComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: NgxJoditComponent, isStandalone: true, selector: "ngx-jodit", inputs: { options: "options", value: "value" }, outputs: { valueChange: "valueChange", joditChange: "joditChange", joditKeyDown: "joditKeyDown", joditKeyUp: "joditKeyUp", joditMousedown: "joditMousedown", joditMouseup: "joditMouseup", joditClick: "joditClick", joditFocus: "joditFocus", joditPaste: "joditPaste", joditResize: "joditResize", joditBeforeEnter: "joditBeforeEnter", joditBeforeCommand: "joditBeforeCommand", joditAfterExec: "joditAfterExec", joditAfterPaste: "joditAfterPaste", joditChangeSelection: "joditChangeSelection" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxJoditComponent),
multi: true,
},
], viewQueries: [{ propertyName: "joditContainer", first: true, predicate: ["joditContainer"], descendants: true }], ngImport: i0, template: "<textarea class=\"ngx-jodit-container\" #joditContainer></textarea>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: NgxJoditComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-jodit', standalone: true, imports: [CommonModule, FormsModule], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxJoditComponent),
multi: true,
},
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<textarea class=\"ngx-jodit-container\" #joditContainer></textarea>\n" }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { joditContainer: [{
type: ViewChild,
args: ['joditContainer']
}], options: [{
type: Input
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], joditChange: [{
type: Output
}], joditKeyDown: [{
type: Output
}], joditKeyUp: [{
type: Output
}], joditMousedown: [{
type: Output
}], joditMouseup: [{
type: Output
}], joditClick: [{
type: Output
}], joditFocus: [{
type: Output
}], joditPaste: [{
type: Output
}], joditResize: [{
type: Output
}], joditBeforeEnter: [{
type: Output
}], joditBeforeCommand: [{
type: Output
}], joditAfterExec: [{
type: Output
}], joditAfterPaste: [{
type: Output
}], joditChangeSelection: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWpvZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWpvZGl0L3NyYy9saWIvbmd4LWpvZGl0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWpvZGl0L3NyYy9saWIvbmd4LWpvZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEdBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQWdCLGNBQWMsR0FBRSxNQUFNLE1BQU0sQ0FBQzs7QUFtQnhILE1BQU0sT0FBTyxpQkFBaUI7SUFXNUIsSUFBYSxPQUFPLENBQUMsS0FBa0I7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBT0QsSUFBYSxLQUFLLENBQUMsS0FBYTtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFD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QkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDRJQy9CSCx1RUFDQSx5RERzQlksWUFBWSw4QkFBRSxXQUFXOzsyRkFZeEIsaUJBQWlCO2tCQWY3QixTQUFTOytCQUNFLFdBQVcsY0FDVCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLGFBRXpCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFFZ0IsdUJBQXVCLENBQUMsTUFBTTtzRkFJbEIsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBU2QsT0FBTztzQkFBbkIsS0FBSztnQkFhTyxLQUFLO3NCQUFqQixLQUFLO2dCQWNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IsfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0pvZGl0fSBmcm9tICdqb2RpdCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZGVsYXksIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIFN1YnNjcmlwdGlvbiwgd2l0aExhdGVzdEZyb20sfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtKb2RpdENvbmZpZ30gZnJvbSAnLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1qb2RpdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1qb2RpdC5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4Sm9kaXRDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWpvZGl0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hKb2RpdENvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdqb2RpdENvbnRhaW5lcicpIGpvZGl0Q29udGFpbmVyITogRWxlbWVudFJlZjtcbiAgam9kaXQ/OiBKb2RpdDtcblxuICAvKipcbiAgICogb3B0aW9ucyBmb3Igam9kaXQuXG4gICAqIFlvdSBjYW4gYWRkIG1vcmUgc3VwcG9ydGVkIG9wdGlvbnMgZXZlbiBUeXBlc2NyaXB0IGRvZXNuJ3Qgc3VnZ2VzdCB0aGUgb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM/OiBKb2RpdENvbmZpZztcblxuICBASW5wdXQoKSBzZXQgb3B0aW9ucyh2YWx1ZTogSm9kaXRDb25maWcpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaW5pdEpvZGl0Q29udGFpbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gdmFsdWUgcHJvcGVydHkgKHN1YmplY3QpXG4gIHByaXZhdGUgdmFsdWVTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcbiAgICAnJ1xuICApO1xuXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2FuaXRpemVkVGV4dCA9IHRoaXMucHJlcGFyZVRleHQodmFsdWUpO1xuICAgIGlmICghdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSkge1xuICAgICAgdGhpcy52YWx1ZVN1YmplY3QubmV4dChzYW5pdGl6ZWRUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHNhbml0aXplZFRleHQpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvL2V2ZW50c1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5RG93biA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdE1vdXNlZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0TW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFBvaW50ZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Rm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdFBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcjxDbGlwYm9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0UmVzaXplID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgam9kaXRCZWZvcmVFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0QmVmb3JlQ29tbWFuZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgam9kaXRBZnRlckV4ZWMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdEFmdGVyUGFzdGUgPSBuZXcgRXZlbnRFbWl0dGVyPENsaXBib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2VTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gVXNlZCBmb3IgZGVsYXkgdmFsdWUgYXNzaWdubWVudCB0byB3YWl0IGZvciBqb2RpdCB0byBiZSBpbml0aWFsaXplZFxuICBwcml2YXRlIGpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHZhbHVlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGludGVyblZhbHVlQ2hhbmdlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgLy8gSGFuZGxlIHZhbHVlIGNoYW5nZXMgLi4uXG4gICAgICB0aGlzLnZhbHVlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgLy8gLi4uYWRkaXRpb25hbGx5IGVuc3VyaW5nIHRoYXQgdGhlIHZhbHVlIGlzIHJlYXBwbGllZCBpZiB0aGUgZWRpdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2hlbiB2YWx1ZSB3YXMgc2V0XG4gICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0LnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIGZpbHRlcigoaW5pdGlhbGl6ZWQpID0+IGluaXRpYWxpemVkKVxuICAgICAgKSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIFBhc3MgdGhyb3VnaCB0aGUgbGF0ZXN0IHZhbHVlIGluIGNhc2Ugb2YgZWRpdG9yIGluaXRpYWxpemF0aW9uXG4gICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMudmFsdWVTdWJqZWN0KSxcbiAgICAgICAgLy8gUHJldmVudCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgICAgIGRlbGF5KDApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbW18sIGluaXRpYWxpemVkXSwgdGV4dF0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuam9kaXQgJiYgaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICB0aGlzLmpvZGl0LnZhbHVlID0gdGV4dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBpc0hUTUwodGV4dDogc3RyaW5nKSB7XG4gICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW0uaW5uZXJIVE1MID0gdGV4dDtcblxuICAgIHJldHVybiAoXG4gICAgICB0ZXh0ICYmXG4gICAgICBlbGVtLmNoaWxkTm9kZXMubGVuZ3RoID4gMCAmJlxuICAgICAgZWxlbS5jaGlsZE5vZGVzLml0ZW0oMCkubm9kZVR5cGUgIT09IDNcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdEpvZGl0Q29udGFpbmVyKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnZhbHVlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuam9kaXQ/LmRlc3RydWN0KCk7XG4gIH1cblxuICBpbml0Sm9kaXRDb250YWluZXIoKSB7XG4gICAgaWYgKHRoaXMuam9kaXRDb250YWluZXIpIHtcbiAgICAgIGlmICh0aGlzLmpvZGl0KSB7XG4gICAgICAgIHRoaXMuam9kaXQuZGVzdHJ1Y3QoKTtcbiAgICAgICAgdGhpcy5qb2RpdEluaXRpYWxpemVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuam9kaXQgPSBKb2RpdC5tYWtlKFxuICAgICAgICB0aGlzLmpvZGl0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuX29wdGlvbnMgYXMgYW55XG4gICAgICApO1xuICAgICAgdGhpcy5qb2RpdC52YWx1ZSA9IHRoaXMudmFsdWVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignY2hhbmdlJywgKHRleHQ6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmludGVyblZhbHVlQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGFuZ2VWYWx1ZSh0ZXh0KTtcbiAgICAgICAgdGhpcy5qb2RpdENoYW5nZS5lbWl0KHRleHQpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRleHQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigna2V5ZG93bicsIChhOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRLZXlEb3duLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdrZXl1cCcsIChhOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRLZXlVcC5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignbW91c2Vkb3duJywgKGE6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdE1vdXNlZG93bi5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignbW91c2V1cCcsIChhOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRNb3VzZXVwLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdjbGljaycsIChhOiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdENsaWNrLmVtaXQoYSk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdmb2N1cycsIChhOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRGb2N1cy5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigncGFzdGUnLCAoYTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdFBhc3RlLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRSZXNpemUuZW1pdCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignYmVmb3JlRW50ZXInLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QmVmb3JlRW50ZXIuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2JlZm9yZUNvbW1hbmQnLCAoYTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRCZWZvcmVDb21tYW5kLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdhZnRlckV4ZWMnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRBZnRlckV4ZWMuZW1pdCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignYWZ0ZXJQYXN0ZScsIChhOiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QWZ0ZXJQYXN0ZS5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignY2hhbmdlU2VsZWN0aW9uJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0Q2hhbmdlU2VsZWN0aW9uLmVtaXQoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKlxuICBGVU5DVElPTlMgUkVMRVZBTlQgRk9SIEFOR1VMQVIgRk9STVNcbiAgICovXG5cbiAgb25DaGFuZ2UgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgLy8gaW1wbGVtZW50ZWQgYnkgdXNlclxuICB9O1xuXG4gIG9uVG91Y2hlZCA9ICgpID0+IHtcbiAgICAvLyBpbXBsZW1lbnRlZCBieSB1c2VyXG4gIH07XG5cbiAgd3JpdGVWYWx1ZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlU3ViamVjdC5uZXh0KHRoaXMucHJlcGFyZVRleHQodGV4dCkpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHRleHQ6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLl9vcHRpb25zLFxuICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNIVE1MKHRleHQpID8gdGV4dCA6IGA8cD4ke3RleHR9PC9wPmA7XG4gIH1cbn1cbiIsIjx0ZXh0YXJlYSBjbGFzcz1cIm5neC1qb2RpdC1jb250YWluZXJcIiAjam9kaXRDb250YWluZXI+PC90ZXh0YXJlYT5cbiJdfQ==