@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
118 lines • 17.3 kB
JavaScript
import { EventEmitter, Inject, Injectable, Optional } from "@angular/core";
import { EditorView } from "prosemirror-view";
import { EditorState, Selection } from "prosemirror-state";
import { Node } from "prosemirror-model";
import { findChangedNodesFromTransaction, validateNodes } from "./utils/nodes";
import { EventDispatcher } from "./interfaces/editor-config";
import { createPMPlugins } from "./utils/create-plugins";
import { createSchema } from "./utils/create-schema";
import { createDispatch } from "./utils/create-dispatch";
import { createConfig } from "./utils/create-config";
import { EDITOR_PLUGIN, STATE_HANDLER } from "./constants";
import { ReplaySubject } from "rxjs";
export const defaultState = {
content: [],
type: "doc",
};
export class EditorService {
constructor(plugins, handlers) {
this.eventDispatcher = new EventDispatcher();
this.viewChange = new EventEmitter();
this.stateChange = new ReplaySubject(1);
this.plugins = plugins;
this.handlers = handlers;
}
runTool(tool) {
tool.run(this.state, this.view.dispatch, this.view);
}
updateState(state) {
if (this.view) {
this.createEditorState(state);
this.view.updateState(this.state);
}
}
createEditorState(state) {
this.config = createConfig(this.plugins, {});
const schema = createSchema(this.config);
const dispatch = createDispatch(this.eventDispatcher);
const doc = Node.fromJSON(schema, state ? state.doc : defaultState);
const selection = state ? Selection.fromJSON(doc, state.selection) : undefined;
// const errorReporter = createErrorReporter(errorReporterHandler);
const plugins = createPMPlugins({
schema,
dispatch,
editorConfig: this.config,
eventDispatcher: this.eventDispatcher,
});
// let doc;
// if (options.replaceDoc) {
// doc =
// this.contentTransformer && typeof defaultValue === 'string'
// ? this.contentTransformer.parse(defaultValue)
// : processRawValue(schema, defaultValue);
// }
// let selection: Selection | undefined;
// if (doc) {
// // ED-4759: Don't set selection at end for full-page editor - should be at start
// selection =
// options.props.editorProps.appearance === 'full-page'
// ? Selection.atStart(doc)
// : Selection.atEnd(doc);
// }
// // Workaround for ED-3507: When media node is the last element, scrollIntoView throws an error
// const patchedSelection = selection
// ? Selection.findFrom(selection.$head, -1, true) || undefined
// : undefined;
this.state = EditorState.create({
schema,
plugins,
doc,
selection
});
}
createEditorView(node) {
// Creates the editor-view from this.editorState. If an editor has been mounted
// previously, this will contain the previous state of the editor.
this.view = new EditorView({ mount: node }, {
state: this.state,
dispatchTransaction: (transaction) => {
if (!this.view) {
return;
}
const nodes = findChangedNodesFromTransaction(transaction);
if (validateNodes(nodes)) {
// go ahead and update the state now we know the transaction is good
const editorState = this.view.state.apply(transaction);
this.view.updateState(editorState);
if (transaction.docChanged) {
this.viewChange.emit(this);
}
this.state = editorState;
this.stateChange.next(this);
}
// else {
// const documents = {
// new: getDocStructure(transaction.doc),
// prev: getDocStructure(transaction.docs[0]),
// };
// }
},
});
this.viewChange.emit(this);
this.stateChange.next(this);
if (this.handlers) {
this.stateChange.subscribe((editor) => {
this.handlers.forEach(handler => handler(editor));
});
}
}
}
EditorService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
EditorService.ctorParameters = () => [
{ type: Array, decorators: [{ type: Inject, args: [EDITOR_PLUGIN,] }] },
{ type: Array, decorators: [{ type: Optional }, { type: Inject, args: [STATE_HANDLER,] }] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFlLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFHMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVwQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDeEIsT0FBTyxFQUFFLEVBQUU7SUFDWCxJQUFJLEVBQUUsS0FBSztDQUNkLENBQUE7QUFHRCxNQUFNLE9BQU8sYUFBYTtJQVd0QixZQUFtQyxPQUF1QixFQUFxQyxRQUFnQjtRQUMzRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFD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QVcsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO3dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDOUI7b0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7b0JBRXpCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUM5QjtnQkFDRCxTQUFTO2dCQUNULDBCQUEwQjtnQkFDMUIsaURBQWlEO2dCQUNqRCxzREFBc0Q7Z0JBQ3RELFNBQVM7Z0JBQ1QsSUFBSTtZQUNSLENBQUM7U0FHSixDQUNKLENBQUM7UUFFRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUzQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ3JELENBQUMsQ0FBQyxDQUFBO1NBQ0w7SUFDTCxDQUFDOzs7WUF0SEosVUFBVTs7Ozt3Q0FZTSxNQUFNLFNBQUMsYUFBYTt3Q0FBNEIsUUFBUSxZQUFJLE1BQU0sU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxyXG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCJcclxuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gXCJwcm9zZW1pcnJvci12aWV3XCJcclxuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFRyYW5zYWN0aW9uLCBTZWxlY3Rpb24gfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIlxyXG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcInByb3NlbWlycm9yLW1vZGVsXCJcclxuaW1wb3J0IHsgZmluZENoYW5nZWROb2Rlc0Zyb21UcmFuc2FjdGlvbiwgdmFsaWRhdGVOb2RlcyB9IGZyb20gXCIuL3V0aWxzL25vZGVzXCJcclxuaW1wb3J0IHsgRXZlbnREaXNwYXRjaGVyIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9lZGl0b3ItY29uZmlnXCJcclxuaW1wb3J0IHsgY3JlYXRlUE1QbHVnaW5zIH0gZnJvbSBcIi4vdXRpbHMvY3JlYXRlLXBsdWdpbnNcIlxyXG5pbXBvcnQgeyBjcmVhdGVTY2hlbWEgfSBmcm9tIFwiLi91dGlscy9jcmVhdGUtc2NoZW1hXCJcclxuaW1wb3J0IHsgY3JlYXRlRGlzcGF0Y2ggfSBmcm9tIFwiLi91dGlscy9jcmVhdGUtZGlzcGF0Y2hcIlxyXG5pbXBvcnQgeyBjcmVhdGVDb25maWcgfSBmcm9tIFwiLi91dGlscy9jcmVhdGUtY29uZmlnXCJcclxuaW1wb3J0IHsgRURJVE9SX1BMVUdJTiwgU1RBVEVfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiXHJcbmltcG9ydCB7IEVkaXRvclBsdWdpbiB9IGZyb20gXCIuL2ludGVyZmFjZXMvZWRpdG9yLXBsdWdpblwiXHJcbmltcG9ydCB7IEVkaXRvclRvb2wgfSBmcm9tIFwiLi9lZGl0b3ItdG9vbGJhci9pbnRlcmZhY2VzXCJcclxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gXCJyeGpzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0U3RhdGUgPSB7XHJcbiAgICBjb250ZW50OiBbXSxcclxuICAgIHR5cGU6IFwiZG9jXCIsXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEVkaXRvclNlcnZpY2UgaW1wbGVtZW50cyBFZGl0b3Ige1xyXG4gICAgcHVibGljIHN0YXRlOiBFZGl0b3JTdGF0ZVxyXG4gICAgcHVibGljIHZpZXc6IEVkaXRvclZpZXdcclxuICAgIHByaXZhdGUgY29uZmlnXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50RGlzcGF0Y2hlclxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5zXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzPzogYW55W11cclxuXHJcbiAgICBwdWJsaWMgdmlld0NoYW5nZTogRXZlbnRFbWl0dGVyPGFueT5cclxuICAgIHB1YmxpYyBzdGF0ZUNoYW5nZTogUmVwbGF5U3ViamVjdDxhbnk+XHJcblxyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChFRElUT1JfUExVR0lOKSBwbHVnaW5zOiBFZGl0b3JQbHVnaW5bXSwgQE9wdGlvbmFsKCkgQEluamVjdChTVEFURV9IQU5ETEVSKSBoYW5kbGVycz86IGFueVtdKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7XHJcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZSA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXHJcbiAgICAgICAgdGhpcy5wbHVnaW5zID0gcGx1Z2luc1xyXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVyc1xyXG4gICAgfVxyXG5cclxuICAgIHJ1blRvb2wodG9vbDogRWRpdG9yVG9vbCkge1xyXG4gICAgICAgIHRvb2wucnVuKHRoaXMuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCwgdGhpcy52aWV3KVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlKHN0YXRlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlldykge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvclN0YXRlKHN0YXRlKVxyXG4gICAgICAgICAgICB0aGlzLnZpZXcudXBkYXRlU3RhdGUodGhpcy5zdGF0ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRWRpdG9yU3RhdGUoc3RhdGUpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNyZWF0ZUNvbmZpZyh0aGlzLnBsdWdpbnMsIHt9KVxyXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGNyZWF0ZVNjaGVtYSh0aGlzLmNvbmZpZylcclxuICAgICAgICBjb25zdCBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKHRoaXMuZXZlbnREaXNwYXRjaGVyKTtcclxuICAgICAgICBjb25zdCBkb2MgPSBOb2RlLmZyb21KU09OKHNjaGVtYSwgc3RhdGUgPyBzdGF0ZS5kb2MgOiBkZWZhdWx0U3RhdGUpXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gc3RhdGUgPyBTZWxlY3Rpb24uZnJvbUpTT04oZG9jLCBzdGF0ZS5zZWxlY3Rpb24pIDogdW5kZWZpbmVkXHJcbiAgICAgICAgLy8gY29uc3QgZXJyb3JSZXBvcnRlciA9IGNyZWF0ZUVycm9yUmVwb3J0ZXIoZXJyb3JSZXBvcnRlckhhbmRsZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBwbHVnaW5zID0gY3JlYXRlUE1QbHVnaW5zKHtcclxuICAgICAgICAgICAgc2NoZW1hLFxyXG4gICAgICAgICAgICBkaXNwYXRjaCxcclxuICAgICAgICAgICAgZWRpdG9yQ29uZmlnOiB0aGlzLmNvbmZpZyxcclxuICAgICAgICAgICAgZXZlbnREaXNwYXRjaGVyOiB0aGlzLmV2ZW50RGlzcGF0Y2hlcixcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAvLyBsZXQgZG9jO1xyXG4gICAgICAgIC8vIGlmIChvcHRpb25zLnJlcGxhY2VEb2MpIHtcclxuICAgICAgICAvLyAgICAgZG9jID1cclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuY29udGVudFRyYW5zZm9ybWVyICYmIHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdzdHJpbmcnXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRUcmFuc2Zvcm1lci5wYXJzZShkZWZhdWx0VmFsdWUpXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgOiBwcm9jZXNzUmF3VmFsdWUoc2NoZW1hLCBkZWZhdWx0VmFsdWUpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBsZXQgc2VsZWN0aW9uOiBTZWxlY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gaWYgKGRvYykge1xyXG4gICAgICAgIC8vICAgICAvLyBFRC00NzU5OiBEb24ndCBzZXQgc2VsZWN0aW9uIGF0IGVuZCBmb3IgZnVsbC1wYWdlIGVkaXRvciAtIHNob3VsZCBiZSBhdCBzdGFydFxyXG4gICAgICAgIC8vICAgICBzZWxlY3Rpb24gPVxyXG4gICAgICAgIC8vICAgICAgICAgb3B0aW9ucy5wcm9wcy5lZGl0b3JQcm9wcy5hcHBlYXJhbmNlID09PSAnZnVsbC1wYWdlJ1xyXG4gICAgICAgIC8vICAgICAgICAgICAgID8gU2VsZWN0aW9uLmF0U3RhcnQoZG9jKVxyXG4gICAgICAgIC8vICAgICAgICAgICAgIDogU2VsZWN0aW9uLmF0RW5kKGRvYyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIC8vIFdvcmthcm91bmQgZm9yIEVELTM1MDc6IFdoZW4gbWVkaWEgbm9kZSBpcyB0aGUgbGFzdCBlbGVtZW50LCBzY3JvbGxJbnRvVmlldyB0aHJvd3MgYW4gZXJyb3JcclxuICAgICAgICAvLyBjb25zdCBwYXRjaGVkU2VsZWN0aW9uID0gc2VsZWN0aW9uXHJcbiAgICAgICAgLy8gICAgID8gU2VsZWN0aW9uLmZpbmRGcm9tKHNlbGVjdGlvbi4kaGVhZCwgLTEsIHRydWUpIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgIC8vICAgICA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEVkaXRvclN0YXRlLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgIHNjaGVtYSxcclxuICAgICAgICAgICAgcGx1Z2lucyxcclxuICAgICAgICAgICAgZG9jLFxyXG4gICAgICAgICAgICBzZWxlY3Rpb25cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVkaXRvclZpZXcobm9kZSkge1xyXG4gICAgICAgIC8vIENyZWF0ZXMgdGhlIGVkaXRvci12aWV3IGZyb20gdGhpcy5lZGl0b3JTdGF0ZS4gSWYgYW4gZWRpdG9yIGhhcyBiZWVuIG1vdW50ZWRcclxuICAgICAgICAvLyBwcmV2aW91c2x5LCB0aGlzIHdpbGwgY29udGFpbiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIGVkaXRvci5cclxuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgRWRpdG9yVmlldyhcclxuICAgICAgICAgICAgeyBtb3VudDogbm9kZSB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcclxuICAgICAgICAgICAgICAgIGRpc3BhdGNoVHJhbnNhY3Rpb246ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmlldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlczogTm9kZVtdID0gZmluZENoYW5nZWROb2Rlc0Zyb21UcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlTm9kZXMobm9kZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGFoZWFkIGFuZCB1cGRhdGUgdGhlIHN0YXRlIG5vdyB3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBnb29kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvclN0YXRlID0gdGhpcy52aWV3LnN0YXRlLmFwcGx5KHRyYW5zYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKGVkaXRvclN0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmRvY0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBlZGl0b3JTdGF0ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2UubmV4dCh0aGlzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29uc3QgZG9jdW1lbnRzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbmV3OiBnZXREb2NTdHJ1Y3R1cmUodHJhbnNhY3Rpb24uZG9jKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHByZXY6IGdldERvY1N0cnVjdHVyZSh0cmFuc2FjdGlvbi5kb2NzWzBdKSxcclxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZXMgdGhlIGNvbnRlbnRFZGl0YWJsZSBhdHRyaWJ1dGUgb2YgdGhlIGVkaXRvciBpZiB0aGUgZWRpdG9yIGlzIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAvLyBlZGl0YWJsZTogc3RhdGUgPT4gIXRoaXMucHJvcHMuZWRpdG9yUHJvcHMuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQodGhpcylcclxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlLm5leHQodGhpcylcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZS5zdWJzY3JpYmUoKGVkaXRvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4gaGFuZGxlcihlZGl0b3IpKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=