ngx-tiptap-editor
Version:
[](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml) [ {
super();
this.dialogService = dialogService;
this.eventService = eventService;
this.ngZone = ngZone;
this.document = document;
this.defaultOptions = {
ng: {
inputPlaceholder: 'Input a link',
}
};
this.createDialog = null;
this.previewDialog = null;
this.linkElement = null;
}
onEditorDestroy() {
this.closeLinkPreview();
this.createDialog?.cancel();
}
onEditorReady() {
this.eventService.registerShortcut('Mod-k')
.pipe(tap((e) => e.preventDefault()), filter(() => this.can()), takeUntil(this.destroy$)).subscribe(() => this.openCreateLinkDialog());
fromEditorEvent(this.editor, 'transaction').pipe(takeUntil(this.destroy$), filter(e => !e.transaction.getMeta('blur'))).subscribe(({ editor: e }) => this.toggleLinkPreview(e));
}
createExtension(extensionOptions) {
return Link.configure(extensionOptions.native);
}
async openCreateLinkDialog() {
if (!this.editor)
return;
const link = getLinkFromCursorPosition(this.editor);
const position = getSelectedEditorTextPosition(this.editor);
if (!position)
return;
this.createDialog = this.ngZone.run(() => this.dialogService.openPopover(LinkSelectComponent, {
width: 'auto',
position: position.topCenter,
autoClose: true,
data: {
link,
inputPlaceholder: this.options.ng.inputPlaceholder
}
}));
const result = await this.createDialog.result$.toPromise();
this.createDialog = null;
if (result.status === 'canceled') {
this.editor.commands.focus();
return;
}
const { from, to } = this.editor.state.selection;
this.editor.chain().focus()
.extendMarkRange('link')
.unsetLink()
.setLink({ href: result.data })
.setTextSelection({ from, to })
.run();
}
can() {
if (!this.editor)
return false;
const active = this.isActive();
const { from, to } = this.editor.state.selection;
return !!this.editor?.can().setLink({ href: '' }) && from !== to || from === to && active;
}
isActive() {
return !!this.editor && 'href' in this.editor.getAttributes('link');
}
async toggleLinkPreview(editor) {
if (
// Link creation dialog is open
this.createDialog ||
// Not active
!this.isActive() ||
// Some text selected
editor.view.state.selection.from !== editor.view.state.selection.to) {
return this.closeLinkPreview();
}
// Get the link and the anchor element
const link = getLinkFromCursorPosition(this.editor);
const linkElement = getLinkDOMFromCursorPosition(this.editor, link);
// Not a link element
if (!linkElement) {
return this.closeLinkPreview();
}
// Already open and no different link element selected
if (this.previewDialog && linkElement === this.linkElement)
return;
// Different link element, so close the preview and create a new dialog
this.closeLinkPreview();
this.linkElement = linkElement;
const position = linkElement.getBoundingClientRect();
const previewDialog = this.ngZone.run(() => this.dialogService.openPopover(LinkPreviewComponent, {
position: {
x: position.x + position.width / 2,
y: position.y
},
data: link
}));
// Prevent race conditions from overwriting the preview dialog
this.previewDialog = previewDialog;
// Get result of dialog
const result = await previewDialog.result$.toPromise();
// Fixes race condition
if (this.previewDialog === previewDialog) {
this.closeLinkPreview();
}
if (result.data === 'delete') {
this.editor.chain().focus().unsetLink().run();
}
else if (result.data === 'edit') {
this.editor.commands.focus();
await this.openCreateLinkDialog();
}
}
closeLinkPreview() {
this.linkElement = null;
if (this.previewDialog) {
this.ngZone.run(() => this.previewDialog.cancel());
this.previewDialog = null;
}
}
}
NgxLink.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxLink, deps: [{ token: i1.TipDialogService }, { token: i2.TiptapEventService }, { token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
NgxLink.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxLink });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxLink, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.TipDialogService }, { type: i2.TiptapEventService }, { type: i0.NgZone }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWxpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGlwdGFwLWVkaXRvci9zcmMvbGliL2V4dGVuc2lvbnMvY3VzdG9tL25neC1saW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsSUFBSSxFQUFlLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG1CQUFtQixFQUFzQixNQUFNLDJDQUEyQyxDQUFDO0FBQ3BHLE9BQU8sRUFDTCxlQUFlLEVBQ2YsNEJBQTRCLEVBQzVCLHlCQUF5QixFQUN6Qiw2QkFBNkIsRUFDOUIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7QUFTekQsV0FBVztBQUVYLE1BQU0sT0FBTyxPQUFRLFNBQVEsZ0JBQWdDO0lBVzNELFlBQ1UsYUFBK0IsRUFDN0IsWUFBZ0MsRUFDbEMsTUFBYyxFQUNJLFFBQWtCO1FBRTVDLEtBQUssRUFBRSxDQUFDO1FBTEEsa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQzdCLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ0ksYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWJ2QyxtQkFBYyxHQUE0QjtZQUMvQyxFQUFFLEVBQUU7Z0JBQ0YsZ0JBQWdCLEVBQUUsY0FBYzthQUNqQztTQUNGLENBQUM7UUFDTSxpQkFBWSxHQUFvQyxJ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LENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDL0M7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDM0I7SUFDSCxDQUFDOztvR0FsSlUsT0FBTywwR0FlUixRQUFRO3dHQWZQLE9BQU87MkZBQVAsT0FBTztrQkFEbkIsVUFBVTsrSUFnQjZCLFFBQVE7MEJBQTNDLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbnlFeHRlbnNpb24sIEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgeyBMaW5rLCBMaW5rT3B0aW9ucyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmsnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERpYWxvZ1JlZiwgUmVzdWx0RGF0YSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZGlhbG9nL2RpYWxvZy5oZWxwZXJzJztcbmltcG9ydCB7IExpbmtQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9saW5rL3ByZXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IExpbmtTZWxlY3RDb21wb25lbnQsIExpbmtTZWxlY3Rpb25Qcm9wcyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbGluay9zZWxlY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIGZyb21FZGl0b3JFdmVudCxcbiAgZ2V0TGlua0RPTUZyb21DdXJzb3JQb3NpdGlvbixcbiAgZ2V0TGlua0Zyb21DdXJzb3JQb3NpdGlvbixcbiAgZ2V0U2VsZWN0ZWRFZGl0b3JUZXh0UG9zaXRpb25cbn0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBUaXBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGlwdGFwRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGlwdGFwLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgVGlwQmFzZUV4dGVuc2lvbiB9IGZyb20gJy4uL3RpcC1iYXNlLWV4dGVuc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd4TGlua09wdGlvbnMge1xuICBuYXRpdmU6IFBhcnRpYWw8TGlua09wdGlvbnM+O1xuICBuZzogUGFydGlhbDx7XG4gICAgaW5wdXRQbGFjZWhvbGRlcjogc3RyaW5nO1xuICB9Pjtcbn1cblxuLy8gQGR5bmFtaWNcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hMaW5rIGV4dGVuZHMgVGlwQmFzZUV4dGVuc2lvbjxOZ3hMaW5rT3B0aW9ucz4ge1xuXG4gIHB1YmxpYyBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxOZ3hMaW5rT3B0aW9ucz4gPSB7XG4gICAgbmc6IHtcbiAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICdJbnB1dCBhIGxpbmsnLFxuICAgIH1cbiAgfTtcbiAgcHJpdmF0ZSBjcmVhdGVEaWFsb2c6IERpYWxvZ1JlZjxhbnksIGFueSwgYW55PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZXZpZXdEaWFsb2c6IERpYWxvZ1JlZjxhbnksIGFueSwgYW55PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxpbmtFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogVGlwRGlhbG9nU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZXZlbnRTZXJ2aWNlOiBUaXB0YXBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIG9uRWRpdG9yRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlTGlua1ByZXZpZXcoKTtcbiAgICB0aGlzLmNyZWF0ZURpYWxvZz8uY2FuY2VsKCk7XG4gIH1cblxuICBwdWJsaWMgb25FZGl0b3JSZWFkeSgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50U2VydmljZS5yZWdpc3RlclNob3J0Y3V0KCdNb2QtaycpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChlKSA9PiBlLnByZXZlbnREZWZhdWx0KCkpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5jYW4oKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHRoaXMub3BlbkNyZWF0ZUxpbmtEaWFsb2coKSk7XG5cbiAgICBmcm9tRWRpdG9yRXZlbnQodGhpcy5lZGl0b3IsICd0cmFuc2FjdGlvbicpLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICBmaWx0ZXIoZSA9PiAhZS50cmFuc2FjdGlvbi5nZXRNZXRhKCdibHVyJykpLFxuICAgICkuc3Vic2NyaWJlKCh7ZWRpdG9yOiBlfSkgPT4gdGhpcy50b2dnbGVMaW5rUHJldmlldyhlKSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRXh0ZW5zaW9uKGV4dGVuc2lvbk9wdGlvbnM6IE5neExpbmtPcHRpb25zKTogQW55RXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gTGluay5jb25maWd1cmUoZXh0ZW5zaW9uT3B0aW9ucy5uYXRpdmUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG9wZW5DcmVhdGVMaW5rRGlhbG9nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIGNvbnN0IGxpbmsgPSBnZXRMaW5rRnJvbUN1cnNvclBvc2l0aW9uKHRoaXMuZWRpdG9yKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGdldFNlbGVjdGVkRWRpdG9yVGV4dFBvc2l0aW9uKHRoaXMuZWRpdG9yKTtcbiAgICBpZiAoIXBvc2l0aW9uKSByZXR1cm47XG5cbiAgICB0aGlzLmNyZWF0ZURpYWxvZyA9IHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlblBvcG92ZXI8c3RyaW5nLCBMaW5rU2VsZWN0aW9uUHJvcHM+KExpbmtTZWxlY3RDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICBwb3NpdGlvbjogcG9zaXRpb24udG9wQ2VudGVyLFxuICAgICAgYXV0b0Nsb3NlOiB0cnVlLFxuICAgICAgZGF0YToge1xuICAgICAgICBsaW5rLFxuICAgICAgICBpbnB1dFBsYWNlaG9sZGVyOiB0aGlzLm9wdGlvbnMubmcuaW5wdXRQbGFjZWhvbGRlciBhcyBzdHJpbmdcbiAgICAgIH1cbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFJlc3VsdERhdGE8c3RyaW5nPiA9IGF3YWl0IHRoaXMuY3JlYXRlRGlhbG9nLnJlc3VsdCQudG9Qcm9taXNlKCk7XG4gICAgdGhpcy5jcmVhdGVEaWFsb2cgPSBudWxsO1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnY2FuY2VsZWQnKSB7XG4gICAgICB0aGlzLmVkaXRvci5jb21tYW5kcy5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtmcm9tLCB0b30gPSB0aGlzLmVkaXRvci5zdGF0ZS5zZWxlY3Rpb247XG4gICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpXG4gICAgICAuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJylcbiAgICAgIC51bnNldExpbmsoKVxuICAgICAgLnNldExpbmsoe2hyZWY6IHJlc3VsdC5kYXRhIX0pXG4gICAgICAuc2V0VGV4dFNlbGVjdGlvbih7ZnJvbSwgdG99KVxuICAgICAgLnJ1bigpO1xuICB9XG5cbiAgcHVibGljIGNhbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XG4gICAgY29uc3Qge2Zyb20sIHRvfSA9IHRoaXMuZWRpdG9yLnN0YXRlLnNlbGVjdGlvbjtcbiAgICByZXR1cm4gISF0aGlzLmVkaXRvcj8uY2FuKCkuc2V0TGluayh7aHJlZjogJyd9KSAmJiBmcm9tICE9PSB0byB8fCBmcm9tID09PSB0byAmJiBhY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lZGl0b3IgJiYgJ2hyZWYnIGluIHRoaXMuZWRpdG9yLmdldEF0dHJpYnV0ZXMoJ2xpbmsnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdG9nZ2xlTGlua1ByZXZpZXcoZWRpdG9yOiBFZGl0b3IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoXG4gICAgICAvLyBMaW5rIGNyZWF0aW9uIGRpYWxvZyBpcyBvcGVuXG4gICAgICB0aGlzLmNyZWF0ZURpYWxvZyB8fFxuICAgICAgLy8gTm90IGFjdGl2ZVxuICAgICAgIXRoaXMuaXNBY3RpdmUoKSB8fFxuICAgICAgLy8gU29tZSB0ZXh0IHNlbGVjdGVkXG4gICAgICBlZGl0b3Iudmlldy5zdGF0ZS5zZWxlY3Rpb24uZnJvbSAhPT0gZWRpdG9yLnZpZXcuc3RhdGUuc2VsZWN0aW9uLnRvXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZUxpbmtQcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBsaW5rIGFuZCB0aGUgYW5jaG9yIGVsZW1lbnRcbiAgICBjb25zdCBsaW5rID0gZ2V0TGlua0Zyb21DdXJzb3JQb3NpdGlvbih0aGlzLmVkaXRvcik7XG4gICAgY29uc3QgbGlua0VsZW1lbnQgPSBnZXRMaW5rRE9NRnJvbUN1cnNvclBvc2l0aW9uKHRoaXMuZWRpdG9yLCBsaW5rKTtcbiAgICAvLyBOb3QgYSBsaW5rIGVsZW1lbnRcbiAgICBpZiAoIWxpbmtFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5jbG9zZUxpbmtQcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBvcGVuIGFuZCBubyBkaWZmZXJlbnQgbGluayBlbGVtZW50IHNlbGVjdGVkXG4gICAgaWYgKHRoaXMucHJldmlld0RpYWxvZyAmJiBsaW5rRWxlbWVudCA9PT0gdGhpcy5saW5rRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgLy8gRGlmZmVyZW50IGxpbmsgZWxlbWVudCwgc28gY2xvc2UgdGhlIHByZXZpZXcgYW5kIGNyZWF0ZSBhIG5ldyBkaWFsb2dcbiAgICB0aGlzLmNsb3NlTGlua1ByZXZpZXcoKTtcbiAgICB0aGlzLmxpbmtFbGVtZW50ID0gbGlua0VsZW1lbnQ7XG4gICAgY29uc3QgcG9zaXRpb24gPSBsaW5rRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwcmV2aWV3RGlhbG9nID0gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuUG9wb3ZlcjwnZGVsZXRlJyB8ICdlZGl0Jz4oTGlua1ByZXZpZXdDb21wb25lbnQsIHtcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIHg6IHBvc2l0aW9uLnggKyBwb3NpdGlvbi53aWR0aCAvIDIsXG4gICAgICAgIHk6IHBvc2l0aW9uLnlcbiAgICAgIH0sXG4gICAgICBkYXRhOiBsaW5rXG4gICAgfSkpO1xuICAgIC8vIFByZXZlbnQgcmFjZSBjb25kaXRpb25zIGZyb20gb3ZlcndyaXRpbmcgdGhlIHByZXZpZXcgZGlhbG9nXG4gICAgdGhpcy5wcmV2aWV3RGlhbG9nID0gcHJldmlld0RpYWxvZztcblxuICAgIC8vIEdldCByZXN1bHQgb2YgZGlhbG9nXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJldmlld0RpYWxvZy5yZXN1bHQkLnRvUHJvbWlzZSgpO1xuICAgIC8vIEZpeGVzIHJhY2UgY29uZGl0aW9uXG4gICAgaWYgKHRoaXMucHJldmlld0RpYWxvZyA9PT0gcHJldmlld0RpYWxvZykge1xuICAgICAgdGhpcy5jbG9zZUxpbmtQcmV2aWV3KCk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5kYXRhID09PSAnZGVsZXRlJykge1xuICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnVuc2V0TGluaygpLnJ1bigpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0LmRhdGEgPT09ICdlZGl0Jykge1xuICAgICAgdGhpcy5lZGl0b3IuY29tbWFuZHMuZm9jdXMoKTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbkNyZWF0ZUxpbmtEaWFsb2coKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlTGlua1ByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5saW5rRWxlbWVudCA9IG51bGw7XG4gICAgaWYgKHRoaXMucHJldmlld0RpYWxvZykge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMucHJldmlld0RpYWxvZyEuY2FuY2VsKCkpO1xuICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==