ngx-jodit-pro
Version:
Angular wrapper for Jodit Pro WYSIWYG editor
223 lines • 29.6 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { BehaviorSubject, combineLatest, delay, distinctUntilChanged, filter, withLatestFrom } from 'rxjs';
import * as i0 from "@angular/core";
export class NgxJoditProComponent {
set options(value) {
this._options = value;
if (value) {
this.initJoditContainer().then();
}
}
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;
/**
* options for jodit pro. It's of type partial because Config is imported from jodit packge and doesn't contain jodit-pro options.
* You can add more supported options even Typescript doesn't suggest the options.
*/
this._options = {};
// 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.setEditorValue(text);
}
});
}
isHTML(text) {
const elem = document.createElement('div');
elem.innerHTML = text;
return (text &&
elem.childNodes.length > 0 &&
elem.childNodes.item(0).nodeType !== 3);
}
async ngAfterViewInit() {
await this.initJoditContainer();
}
ngOnDestroy() {
this.valueSubscription?.unsubscribe();
this.jodit?.events.destruct();
}
async initJoditContainer() {
if (this.joditContainer?.nativeElement) {
if (this.jodit) {
this.jodit.destruct();
this.joditInitializedSubject.next(false);
}
this.jodit = Jodit.make(this.joditContainer.nativeElement, this._options);
await this.jodit.waitForReady();
this.jodit.setEditorValue(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: NgxJoditProComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: NgxJoditProComponent, isStandalone: true, selector: "ngx-jodit-pro", 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(() => NgxJoditProComponent),
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: NgxJoditProComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-jodit-pro', standalone: true, imports: [CommonModule, FormsModule], providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxJoditProComponent),
multi: true
}], changeDetection: ChangeDetectionStrategy.OnPush, template: "<textarea class=\"ngx-jodit-container\" #joditContainer></textarea>\n" }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { joditContainer: [{
type: ViewChild,
args: ['joditContainer', { static: false }]
}], 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWpvZGl0LXByby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL25neC1qb2RpdC1wcm8vc3JjL2xpYi9uZ3gtam9kaXQtcHJvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWpvZGl0LXByby9zcmMvbGliL25neC1qb2RpdC1wcm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUk3QyxPQUFPLEVBQXVCLFdBQVcsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQWdCLGNBQWMsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7QUFrQnZILE1BQU0sT0FBTyxvQkFBb0I7SUFTL0IsSUFBYSxPQUFPLENBQUMsS0FBcUI7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBS0QsSUFBYSxLQUFLLENBQUMsS0FBYTtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUks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IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0lWaWV3T3B0aW9uc1Byb30gZnJvbSAnam9kaXQtcHJvL3R5cGVzL3R5cGVzL3ZpZXcnO1xuaW1wb3J0IHtJVmlld09wdGlvbnN9IGZyb20gJ2pvZGl0L3R5cGVzL3R5cGVzJztcbmltcG9ydCB7SUpvZGl0fSBmcm9tICdqb2RpdC90eXBlcy90eXBlcy9qb2RpdCc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgU3Vic2NyaXB0aW9uLCB3aXRoTGF0ZXN0RnJvbX0gZnJvbSAncnhqcyc7XG5cbmRlY2xhcmUgY29uc3QgSm9kaXQ6IGFueTtcbmV4cG9ydCB0eXBlIEpvZGl0UHJvQ29uZmlnID0gUGFydGlhbDxJVmlld09wdGlvbnMgJiBJVmlld09wdGlvbnNQcm8gJiBSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWpvZGl0LXBybycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1qb2RpdC1wcm8uY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4Sm9kaXRQcm9Db21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG4gIH1dLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtam9kaXQtcHJvLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE5neEpvZGl0UHJvQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2pvZGl0Q29udGFpbmVyJywge3N0YXRpYzogZmFsc2V9KSBqb2RpdENvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIGpvZGl0PzogSUpvZGl0O1xuXG4gIC8qKlxuICAgKiBvcHRpb25zIGZvciBqb2RpdCBwcm8uIEl0J3Mgb2YgdHlwZSBwYXJ0aWFsIGJlY2F1c2UgQ29uZmlnIGlzIGltcG9ydGVkIGZyb20gam9kaXQgcGFja2dlIGFuZCBkb2Vzbid0IGNvbnRhaW4gam9kaXQtcHJvIG9wdGlvbnMuXG4gICAqIFlvdSBjYW4gYWRkIG1vcmUgc3VwcG9ydGVkIG9wdGlvbnMgZXZlbiBUeXBlc2NyaXB0IGRvZXNuJ3Qgc3VnZ2VzdCB0aGUgb3B0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgX29wdGlvbnM/OiBKb2RpdFByb0NvbmZpZyA9IHt9O1xuICBASW5wdXQoKSBzZXQgb3B0aW9ucyh2YWx1ZTogSm9kaXRQcm9Db25maWcpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaW5pdEpvZGl0Q29udGFpbmVyKCkudGhlbigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHZhbHVlIHByb3BlcnR5IChzdWJqZWN0KVxuICBwcml2YXRlIHZhbHVlU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2FuaXRpemVkVGV4dCA9IHRoaXMucHJlcGFyZVRleHQodmFsdWUpO1xuICAgIGlmICghdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSkge1xuICAgICAgdGhpcy52YWx1ZVN1YmplY3QubmV4dChzYW5pdGl6ZWRUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHNhbml0aXplZFRleHQpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvL2V2ZW50c1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5RG93biA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0S2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdE1vdXNlZG93biA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0TW91c2V1cCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFBvaW50ZXJFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0Rm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdFBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcjxDbGlwYm9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0UmVzaXplID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgam9kaXRCZWZvcmVFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGpvZGl0QmVmb3JlQ29tbWFuZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgam9kaXRBZnRlckV4ZWMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBqb2RpdEFmdGVyUGFzdGUgPSBuZXcgRXZlbnRFbWl0dGVyPENsaXBib2FyZEV2ZW50PigpO1xuICBAT3V0cHV0KCkgam9kaXRDaGFuZ2VTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLy8gVXNlZCBmb3IgZGVsYXkgdmFsdWUgYXNzaWdubWVudCB0byB3YWl0IGZvciBqb2RpdCB0byBiZSBpbml0aWFsaXplZFxuICBwcml2YXRlIGpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSB2YWx1ZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBpbnRlcm5WYWx1ZUNoYW5nZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgLy8gSGFuZGxlIHZhbHVlIGNoYW5nZXMgLi4uXG4gICAgICB0aGlzLnZhbHVlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLFxuICAgICAgLy8gLi4uYWRkaXRpb25hbGx5IGVuc3VyaW5nIHRoYXQgdGhlIHZhbHVlIGlzIHJlYXBwbGllZCBpZiB0aGUgZWRpdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2hlbiB2YWx1ZSB3YXMgc2V0XG4gICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0LnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZmlsdGVyKGluaXRpYWxpemVkID0+IGluaXRpYWxpemVkKSlcbiAgICBdKS5waXBlKFxuICAgICAgLy8gUGFzcyB0aHJvdWdoIHRoZSBsYXRlc3QgdmFsdWUgaW4gY2FzZSBvZiBlZGl0b3IgaW5pdGlhbGl6YXRpb25cbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMudmFsdWVTdWJqZWN0KSxcbiAgICAgIC8vIFByZXZlbnQgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICAgICAgZGVsYXkoMClcbiAgICApLnN1YnNjcmliZSgoW1tfLCBpbml0aWFsaXplZF0sIHRleHRdKSA9PiB7XG4gICAgICBpZiAodGhpcy5qb2RpdCAmJiBpbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLmpvZGl0LnNldEVkaXRvclZhbHVlKHRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaXNIVE1MKHRleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IGVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtLmlubmVySFRNTCA9IHRleHQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGV4dCAmJlxuICAgICAgZWxlbS5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGVsZW0uY2hpbGROb2Rlcy5pdGVtKDApLm5vZGVUeXBlICE9PSAzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmluaXRKb2RpdENvbnRhaW5lcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmpvZGl0Py5ldmVudHMuZGVzdHJ1Y3QoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRKb2RpdENvbnRhaW5lcigpIHtcbiAgICBpZiAodGhpcy5qb2RpdENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKHRoaXMuam9kaXQpIHtcbiAgICAgICAgdGhpcy5qb2RpdC5kZXN0cnVjdCgpO1xuICAgICAgICB0aGlzLmpvZGl0SW5pdGlhbGl6ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5qb2RpdCA9IEpvZGl0Lm1ha2UodGhpcy5qb2RpdENvbnRhaW5lci5uYXRpdmVFbGVtZW50LCB0aGlzLl9vcHRpb25zKSBhcyBJSm9kaXQ7XG4gICAgICBhd2FpdCB0aGlzLmpvZGl0LndhaXRGb3JSZWFkeSgpO1xuICAgICAgdGhpcy5qb2RpdC5zZXRFZGl0b3JWYWx1ZSh0aGlzLnZhbHVlU3ViamVjdC5nZXRWYWx1ZSgpKTtcblxuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2NoYW5nZScsICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5pbnRlcm5WYWx1ZUNoYW5nZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2hhbmdlVmFsdWUodGV4dCk7XG4gICAgICAgIHRoaXMuam9kaXRDaGFuZ2UuZW1pdCh0ZXh0KTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0ZXh0KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2tleWRvd24nLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0S2V5RG93bi5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigna2V5dXAnLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0S2V5VXAuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ21vdXNlZG93bicsIChhOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRNb3VzZWRvd24uZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ21vdXNldXAnLCAoYTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0TW91c2V1cC5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignY2xpY2snLCAoYTogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRDbGljay5lbWl0KGEpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignZm9jdXMnLCAoYTogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0Rm9jdXMuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ3Bhc3RlJywgKGE6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuam9kaXRQYXN0ZS5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbigncmVzaXplJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0UmVzaXplLmVtaXQoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2JlZm9yZUVudGVyJywgKGE6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdEJlZm9yZUVudGVyLmVtaXQoYSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuam9kaXQuZXZlbnRzLm9uKCdiZWZvcmVDb21tYW5kJywgKGE6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QmVmb3JlQ29tbWFuZC5lbWl0KGEpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmpvZGl0LmV2ZW50cy5vbignYWZ0ZXJFeGVjJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmpvZGl0QWZ0ZXJFeGVjLmVtaXQoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2FmdGVyUGFzdGUnLCAoYTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdEFmdGVyUGFzdGUuZW1pdChhKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5qb2RpdC5ldmVudHMub24oJ2NoYW5nZVNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgICAgdGhpcy5qb2RpdENoYW5nZVNlbGVjdGlvbi5lbWl0KCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5qb2RpdEluaXRpYWxpemVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLypcbiAgRlVOQ1RJT05TIFJFTEVWQU5UIEZPUiBBTkdVTEFSIEZPUk1TXG4gICAqL1xuXG4gIG9uQ2hhbmdlID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICAgIC8vIGltcGxlbWVudGVkIGJ5IHVzZXJcbiAgfTtcblxuICBvblRvdWNoZWQgPSAoKSA9PiB7XG4gICAgLy8gaW1wbGVtZW50ZWQgYnkgdXNlclxuICB9O1xuXG4gIHdyaXRlVmFsdWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZVN1YmplY3QubmV4dCh0aGlzLnByZXBhcmVUZXh0KHRleHQpKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5fb3B0aW9ucyxcbiAgICAgIGRpc2FibGVkOiBpc0Rpc2FibGVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNIVE1MKHRleHQpID8gdGV4dCA6IGA8cD4ke3RleHR9PC9wPmA7XG4gIH1cbn1cbiIsIjx0ZXh0YXJlYSBjbGFzcz1cIm5neC1qb2RpdC1jb250YWluZXJcIiAjam9kaXRDb250YWluZXI+PC90ZXh0YXJlYT5cbiJdfQ==