UNPKG

@zodiac-ui/editor

Version:

A rich text editor for Angular based on `@atlaskit/editor-core`.

183 lines 29.2 kB
import { Plugin, PluginKey } from "prosemirror-state"; export var LinkAction; (function (LinkAction) { LinkAction["SHOW_INSERT_TOOLBAR"] = "SHOW_INSERT_TOOLBAR"; LinkAction["HIDE_TOOLBAR"] = "HIDE_TOOLBAR"; LinkAction["SELECTION_CHANGE"] = "SELECTION_CHANGE"; })(LinkAction || (LinkAction = {})); export var InsertStatus; (function (InsertStatus) { InsertStatus["EDIT_LINK_TOOLBAR"] = "EDIT"; InsertStatus["INSERT_LINK_TOOLBAR"] = "INSERT"; })(InsertStatus || (InsertStatus = {})); export const canLinkBeCreatedInRange = (from, to) => (state) => { if (!state.doc.rangeHasMark(from, to, state.schema.marks.link)) { const $from = state.doc.resolve(from); const $to = state.doc.resolve(to); const link = state.schema.marks.link; if ($from.parent === $to.parent && $from.parent.isTextblock) { if ($from.parent.type.allowsMarkType(link)) { let allowed = true; state.doc.nodesBetween(from, to, node => { allowed = allowed && !node.marks.some(m => m.type.excludes(link)); return allowed; }); return allowed; } } } return false; }; const isSelectionInsideLink = (state) => !!state.doc.type.schema.marks.link.isInSet(state.selection.$from.marks()); const ɵ0 = isSelectionInsideLink; const isSelectionAroundLink = (state) => { const { $from, $to } = state.selection; const node = $from.nodeAfter; return (!!node && $from.textOffset === 0 && $to.pos - $from.pos === node.nodeSize && !!state.doc.type.schema.marks.link.isInSet(node.marks)); }; const ɵ1 = isSelectionAroundLink; const mapTransactionToState = (state, tr) => { if (!state) { return undefined; } else if (state.type === InsertStatus.EDIT_LINK_TOOLBAR) { const { pos, deleted } = tr.mapping.mapResult(state.pos, 1); const node = tr.doc.nodeAt(pos); // If the position was not deleted & it is still a link if (!deleted && !!node.type.schema.marks.link.isInSet(node.marks)) { if (node === state.node && pos === state.pos) { return state; } return Object.assign({}, state, { pos, node }); } // If the position has been deleted, then require a navigation to show the toolbar again return undefined; } else if (state.type === InsertStatus.INSERT_LINK_TOOLBAR) { return Object.assign({}, state, { from: tr.mapping.map(state.from), to: tr.mapping.map(state.to) }); } }; const ɵ2 = mapTransactionToState; const toState = (state, action, editorState) => { // Show insert or edit toolbar if (!state) { switch (action) { case LinkAction.SHOW_INSERT_TOOLBAR: const { from, to } = editorState.selection; if (canLinkBeCreatedInRange(from, to)(editorState)) { return { type: InsertStatus.INSERT_LINK_TOOLBAR, from, to }; } return undefined; case LinkAction.SELECTION_CHANGE: // If the user has moved their cursor, see if they're in a link const link = getActiveLinkMark(editorState); if (link) { return Object.assign({}, link, { type: InsertStatus.EDIT_LINK_TOOLBAR }); } return undefined; default: return undefined; } } // Update toolbar state if selection changes, or if toolbar is hidden if (state.type === InsertStatus.EDIT_LINK_TOOLBAR) { switch (action) { case LinkAction.SELECTION_CHANGE: const link = getActiveLinkMark(editorState); if (link) { if (link.pos === state.pos && link.node === state.node) { // Make sure we return the same object, if it's the same link return state; } return Object.assign({}, link, { type: InsertStatus.EDIT_LINK_TOOLBAR }); } return undefined; case LinkAction.HIDE_TOOLBAR: return undefined; default: return state; } } // Remove toolbar if user changes selection or toolbar is hidden if (state.type === InsertStatus.INSERT_LINK_TOOLBAR) { switch (action) { case LinkAction.SELECTION_CHANGE: case LinkAction.HIDE_TOOLBAR: return undefined; default: return state; } } }; const ɵ3 = toState; const getActiveLinkMark = (state) => { const { selection: { $from }, } = state; if (isSelectionInsideLink(state) || isSelectionAroundLink(state)) { const pos = $from.pos - $from.textOffset; const node = state.doc.nodeAt(pos); return node && node.isText ? { node, pos } : undefined; } return undefined; }; const ɵ4 = getActiveLinkMark; const getActiveText = (schema, selection) => { const currentSlice = selection.content(); if (currentSlice.size === 0) { return; } if (currentSlice.content.childCount === 1 && [schema.nodes.paragraph, schema.nodes.text].indexOf(currentSlice.content.firstChild.type) !== -1) { return currentSlice.content.firstChild.textContent; } }; const ɵ5 = getActiveText; export const pluginKey = new PluginKey('hyperlinkPlugin'); export const plugin = (dispatch, componentFactoryResolver) => { return new Plugin({ state: { init(_, state) { const canInsertLink = canLinkBeCreatedInRange(state.selection.from, state.selection.to)(state); return { activeText: getActiveText(state.schema, state.selection), canInsertLink, activeLinkMark: toState(undefined, LinkAction.SELECTION_CHANGE, state), }; }, apply(tr, pluginState, oldState, newState) { let state = pluginState; const action = tr.getMeta(pluginKey); if (tr.docChanged) { state = { activeText: state.activeText, canInsertLink: canLinkBeCreatedInRange(newState.selection.from, newState.selection.to)(newState), activeLinkMark: mapTransactionToState(state.activeLinkMark, tr), }; } if (action) { state = { activeText: state.activeText, canInsertLink: state.canInsertLink, activeLinkMark: toState(state.activeLinkMark, action, newState), }; } if (tr.selectionSet) { state = { activeText: getActiveText(newState.schema, newState.selection), canInsertLink: canLinkBeCreatedInRange(newState.selection.from, newState.selection.to)(newState), activeLinkMark: toState(state.activeLinkMark, LinkAction.SELECTION_CHANGE, newState), }; } if (state !== pluginState) { dispatch(pluginKey, state); } return state; }, }, key: pluginKey }); }; export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlwZXJsaW5rLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHpvZGlhYy11aS9lZGl0b3IvIiwic291cmNlcyI6WyJwbHVnaW5zL2xpbmsvcG0vaHlwZXJsaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZSxNQUFNLEVBQUUsU0FBUyxFQUEwQixNQUFNLG1CQUFtQixDQUFBO0FBSTFGLE1BQU0sQ0FBTixJQUFZLFVBSVg7QUFKRCxXQUFZLFVBQVU7SUFDbEIseURBQTJDLENBQUE7SUFDM0MsMkNBQTZCLENBQUE7SUFDN0IsbURBQXFDLENBQUE7QUFDekMsQ0FBQyxFQUpXLFVBQVUsS0FBVixVQUFVLFFBSXJCO0FBQ0QsTUFBTSxDQUFOLElBQVksWUFHWDtBQUhELFdBQVksWUFBWTtJQUNwQiwwQ0FBMEIsQ0FBQTtJQUMxQiw4Q0FBOEIsQ0FBQTtBQUNsQyxDQUFDLEVBSFcsWUFBWSxLQUFaLFlBQVksUUFHdkI7QUFjRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsRUFBRSxDQUFDLENBQ2pFLEtBQWtCLEVBQ3BCLEVBQUU7SUFDQSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM1RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDckMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FB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QUssQ0FBQyxjQUFjLEVBQ3BCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFDM0IsUUFBUSxDQUNYO3FCQUNKLENBQUM7aUJBQ0w7Z0JBRUQsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFO29CQUN2QixRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUM5QjtnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1NBQ0o7UUFDRCxHQUFHLEVBQUUsU0FBUztLQUNqQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlLCBTY2hlbWEgfSBmcm9tIFwicHJvc2VtaXJyb3ItbW9kZWxcIlxyXG5pbXBvcnQgeyBFZGl0b3JTdGF0ZSwgUGx1Z2luLCBQbHVnaW5LZXksIFNlbGVjdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tIFwicHJvc2VtaXJyb3Itc3RhdGVcIlxyXG5pbXBvcnQgeyBEaXNwYXRjaCB9IGZyb20gXCIuLi8uLi8uLi9saWIvaW50ZXJmYWNlcy9lZGl0b3ItY29uZmlnXCJcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxyXG5cclxuZXhwb3J0IGVudW0gTGlua0FjdGlvbiB7XHJcbiAgICBTSE9XX0lOU0VSVF9UT09MQkFSID0gJ1NIT1dfSU5TRVJUX1RPT0xCQVInLFxyXG4gICAgSElERV9UT09MQkFSID0gJ0hJREVfVE9PTEJBUicsXHJcbiAgICBTRUxFQ1RJT05fQ0hBTkdFID0gJ1NFTEVDVElPTl9DSEFOR0UnLFxyXG59XHJcbmV4cG9ydCBlbnVtIEluc2VydFN0YXR1cyB7XHJcbiAgICBFRElUX0xJTktfVE9PTEJBUiA9ICdFRElUJyxcclxuICAgIElOU0VSVF9MSU5LX1RPT0xCQVIgPSAnSU5TRVJUJyxcclxufVxyXG5leHBvcnQgdHlwZSBMaW5rVG9vbGJhclN0YXRlID1cclxuICAgIHwge1xyXG4gICAgdHlwZTogSW5zZXJ0U3RhdHVzLkVESVRfTElOS19UT09MQkFSO1xyXG4gICAgbm9kZTogTm9kZTtcclxuICAgIHBvczogbnVtYmVyO1xyXG59XHJcbiAgICB8IHtcclxuICAgIHR5cGU6IEluc2VydFN0YXR1cy5JTlNFUlRfTElOS19UT09MQkFSO1xyXG4gICAgZnJvbTogbnVtYmVyO1xyXG4gICAgdG86IG51bWJlcjtcclxufVxyXG4gICAgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgY29uc3QgY2FuTGlua0JlQ3JlYXRlZEluUmFuZ2UgPSAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PiAoXHJcbiAgICBzdGF0ZTogRWRpdG9yU3RhdGUsXHJcbikgPT4ge1xyXG4gICAgaWYgKCFzdGF0ZS5kb2MucmFuZ2VIYXNNYXJrKGZyb20sIHRvLCBzdGF0ZS5zY2hlbWEubWFya3MubGluaykpIHtcclxuICAgICAgICBjb25zdCAkZnJvbSA9IHN0YXRlLmRvYy5yZXNvbHZlKGZyb20pO1xyXG4gICAgICAgIGNvbnN0ICR0byA9IHN0YXRlLmRvYy5yZXNvbHZlKHRvKTtcclxuICAgICAgICBjb25zdCBsaW5rID0gc3RhdGUuc2NoZW1hLm1hcmtzLmxpbms7XHJcbiAgICAgICAgaWYgKCRmcm9tLnBhcmVudCA9PT0gJHRvLnBhcmVudCAmJiAkZnJvbS5wYXJlbnQuaXNUZXh0YmxvY2spIHtcclxuICAgICAgICAgICAgaWYgKCRmcm9tLnBhcmVudC50eXBlLmFsbG93c01hcmtUeXBlKGxpbmspKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZS5kb2Mubm9kZXNCZXR3ZWVuKGZyb20sIHRvLCBub2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gYWxsb3dlZCAmJiAhbm9kZS5tYXJrcy5zb21lKG0gPT4gbS50eXBlLmV4Y2x1ZGVzKGxpbmspKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dlZDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn07XHJcblxyXG5jb25zdCBpc1NlbGVjdGlvbkluc2lkZUxpbmsgPSAoc3RhdGU6IEVkaXRvclN0YXRlIHwgVHJhbnNhY3Rpb24pID0+XHJcbiAgICAhIXN0YXRlLmRvYy50eXBlLnNjaGVtYS5tYXJrcy5saW5rLmlzSW5TZXQoc3RhdGUuc2VsZWN0aW9uLiRmcm9tLm1hcmtzKCkpO1xyXG5cclxuY29uc3QgaXNTZWxlY3Rpb25Bcm91bmRMaW5rID0gKHN0YXRlOiBFZGl0b3JTdGF0ZSB8IFRyYW5zYWN0aW9uKSA9PiB7XHJcbiAgICBjb25zdCB7ICRmcm9tLCAkdG8gfSA9IHN0YXRlLnNlbGVjdGlvbjtcclxuICAgIGNvbnN0IG5vZGUgPSAkZnJvbS5ub2RlQWZ0ZXI7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgICAhIW5vZGUgJiZcclxuICAgICAgICAkZnJvbS50ZXh0T2Zmc2V0ID09PSAwICYmXHJcbiAgICAgICAgJHRvLnBvcyAtICRmcm9tLnBvcyA9PT0gbm9kZS5ub2RlU2l6ZSAmJlxyXG4gICAgICAgICEhc3RhdGUuZG9jLnR5cGUuc2NoZW1hLm1hcmtzLmxpbmsuaXNJblNldChub2RlLm1hcmtzKVxyXG4gICAgKTtcclxufTtcclxuXHJcbmNvbnN0IG1hcFRyYW5zYWN0aW9uVG9TdGF0ZSA9IChcclxuICAgIHN0YXRlOiBMaW5rVG9vbGJhclN0YXRlLFxyXG4gICAgdHI6IFRyYW5zYWN0aW9uLFxyXG4pOiBMaW5rVG9vbGJhclN0YXRlID0+IHtcclxuICAgIGlmICghc3RhdGUpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIGlmIChzdGF0ZS50eXBlID09PSBJbnNlcnRTdGF0dXMuRURJVF9MSU5LX1RPT0xCQVIpIHtcclxuICAgICAgICBjb25zdCB7IHBvcywgZGVsZXRlZCB9ID0gdHIubWFwcGluZy5tYXBSZXN1bHQoc3RhdGUucG9zLCAxKTtcclxuICAgICAgICBjb25zdCBub2RlID0gdHIuZG9jLm5vZGVBdChwb3MpIGFzIE5vZGU7XHJcbiAgICAgICAgLy8gSWYgdGhlIHBvc2l0aW9uIHdhcyBub3QgZGVsZXRlZCAmIGl0IGlzIHN0aWxsIGEgbGlua1xyXG4gICAgICAgIGlmICghZGVsZXRlZCAmJiAhIW5vZGUudHlwZS5zY2hlbWEubWFya3MubGluay5pc0luU2V0KG5vZGUubWFya3MpKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlID09PSBzdGF0ZS5ub2RlICYmIHBvcyA9PT0gc3RhdGUucG9zKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHBvcywgbm9kZSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiB0aGUgcG9zaXRpb24gaGFzIGJlZW4gZGVsZXRlZCwgdGhlbiByZXF1aXJlIGEgbmF2aWdhdGlvbiB0byBzaG93IHRoZSB0b29sYmFyIGFnYWluXHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSBpZiAoc3RhdGUudHlwZSA9PT0gSW5zZXJ0U3RhdHVzLklOU0VSVF9MSU5LX1RPT0xCQVIpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5zdGF0ZSxcclxuICAgICAgICAgICAgZnJvbTogdHIubWFwcGluZy5tYXAoc3RhdGUuZnJvbSksXHJcbiAgICAgICAgICAgIHRvOiB0ci5tYXBwaW5nLm1hcChzdGF0ZS50byksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufTtcclxuXHJcbmNvbnN0IHRvU3RhdGUgPSAoXHJcbiAgICBzdGF0ZTogTGlua1Rvb2xiYXJTdGF0ZSxcclxuICAgIGFjdGlvbjogTGlua0FjdGlvbixcclxuICAgIGVkaXRvclN0YXRlOiBFZGl0b3JTdGF0ZSxcclxuKTogTGlua1Rvb2xiYXJTdGF0ZSA9PiB7XHJcblxyXG4gICAgLy8gU2hvdyBpbnNlcnQgb3IgZWRpdCB0b29sYmFyXHJcbiAgICBpZiAoIXN0YXRlKSB7XHJcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBMaW5rQWN0aW9uLlNIT1dfSU5TRVJUX1RPT0xCQVI6XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGZyb20sIHRvIH0gPSBlZGl0b3JTdGF0ZS5zZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FuTGlua0JlQ3JlYXRlZEluUmFuZ2UoZnJvbSwgdG8pKGVkaXRvclN0YXRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHR5cGU6IEluc2VydFN0YXR1cy5JTlNFUlRfTElOS19UT09MQkFSLCBmcm9tLCB0byB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY2FzZSBMaW5rQWN0aW9uLlNFTEVDVElPTl9DSEFOR0U6XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlaXIgY3Vyc29yLCBzZWUgaWYgdGhleSdyZSBpbiBhIGxpbmtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBnZXRBY3RpdmVMaW5rTWFyayhlZGl0b3JTdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobGluaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmxpbmssIHR5cGU6IEluc2VydFN0YXR1cy5FRElUX0xJTktfVE9PTEJBUiB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB0b29sYmFyIHN0YXRlIGlmIHNlbGVjdGlvbiBjaGFuZ2VzLCBvciBpZiB0b29sYmFyIGlzIGhpZGRlblxyXG4gICAgaWYgKHN0YXRlLnR5cGUgPT09IEluc2VydFN0YXR1cy5FRElUX0xJTktfVE9PTEJBUikge1xyXG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTGlua0FjdGlvbi5TRUxFQ1RJT05fQ0hBTkdFOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IGdldEFjdGl2ZUxpbmtNYXJrKGVkaXRvclN0YXRlKTtcclxuICAgICAgICAgICAgICAgIGlmIChsaW5rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmsucG9zID09PSBzdGF0ZS5wb3MgJiYgbGluay5ub2RlID09PSBzdGF0ZS5ub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LCBpZiBpdCdzIHRoZSBzYW1lIGxpbmtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5saW5rLCB0eXBlOiBJbnNlcnRTdGF0dXMuRURJVF9MSU5LX1RPT0xCQVIgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNhc2UgTGlua0FjdGlvbi5ISURFX1RPT0xCQVI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdG9vbGJhciBpZiB1c2VyIGNoYW5nZXMgc2VsZWN0aW9uIG9yIHRvb2xiYXIgaXMgaGlkZGVuXHJcbiAgICBpZiAoc3RhdGUudHlwZSA9PT0gSW5zZXJ0U3RhdHVzLklOU0VSVF9MSU5LX1RPT0xCQVIpIHtcclxuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xyXG4gICAgICAgICAgICBjYXNlIExpbmtBY3Rpb24uU0VMRUNUSU9OX0NIQU5HRTpcclxuICAgICAgICAgICAgY2FzZSBMaW5rQWN0aW9uLkhJREVfVE9PTEJBUjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuY29uc3QgZ2V0QWN0aXZlTGlua01hcmsgPSAoXHJcbiAgICBzdGF0ZTogRWRpdG9yU3RhdGUgfCBUcmFuc2FjdGlvbixcclxuKTogeyBub2RlOiBOb2RlOyBwb3M6IG51bWJlciB9IHwgdW5kZWZpbmVkID0+IHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgICBzZWxlY3Rpb246IHsgJGZyb20gfSxcclxuICAgIH0gPSBzdGF0ZTtcclxuXHJcbiAgICBpZiAoaXNTZWxlY3Rpb25JbnNpZGVMaW5rKHN0YXRlKSB8fCBpc1NlbGVjdGlvbkFyb3VuZExpbmsoc3RhdGUpKSB7XHJcbiAgICAgICAgY29uc3QgcG9zID0gJGZyb20ucG9zIC0gJGZyb20udGV4dE9mZnNldDtcclxuICAgICAgICBjb25zdCBub2RlID0gc3RhdGUuZG9jLm5vZGVBdChwb3MpO1xyXG4gICAgICAgIHJldHVybiBub2RlICYmIG5vZGUuaXNUZXh0ID8geyBub2RlLCBwb3MgfSA6IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG59O1xyXG5cclxuY29uc3QgZ2V0QWN0aXZlVGV4dCA9IChcclxuICAgIHNjaGVtYTogU2NoZW1hLFxyXG4gICAgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXHJcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50U2xpY2UgPSBzZWxlY3Rpb24uY29udGVudCgpO1xyXG5cclxuICAgIGlmIChjdXJyZW50U2xpY2Uuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICAgY3VycmVudFNsaWNlLmNvbnRlbnQuY2hpbGRDb3VudCA9PT0gMSAmJlxyXG4gICAgICAgIFtzY2hlbWEubm9kZXMucGFyYWdyYXBoLCBzY2hlbWEubm9kZXMudGV4dF0uaW5kZXhPZihcclxuICAgICAgICAgICAgY3VycmVudFNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZC50eXBlLFxyXG4gICAgICAgICkgIT09IC0xXHJcbiAgICApIHtcclxuICAgICAgICByZXR1cm4gY3VycmVudFNsaWNlLmNvbnRlbnQuZmlyc3RDaGlsZC50ZXh0Q29udGVudDtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSHlwZXJsaW5rU3RhdGUge1xyXG4gICAgYWN0aXZlVGV4dD86IHN0cmluZztcclxuICAgIGFjdGl2ZUxpbmtNYXJrPzogTGlua1Rvb2xiYXJTdGF0ZTtcclxuICAgIGNhbkluc2VydExpbms6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBwbHVnaW5LZXkgPSBuZXcgUGx1Z2luS2V5KCdoeXBlcmxpbmtQbHVnaW4nKTtcclxuXHJcbmV4cG9ydCBjb25zdCBwbHVnaW4gPSAoZGlzcGF0Y2g6IERpc3BhdGNoLCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQbHVnaW4oe1xyXG4gICAgICAgIHN0YXRlOiB7XHJcbiAgICAgICAgICAgIGluaXQoXywgc3RhdGU6IEVkaXRvclN0YXRlKTogSHlwZXJsaW5rU3RhdGUge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FuSW5zZXJ0TGluayA9IGNhbkxpbmtCZUNyZWF0ZWRJblJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbi5mcm9tLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbi50byxcclxuICAgICAgICAgICAgICAgICkoc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVUZXh0OiBnZXRBY3RpdmVUZXh0KHN0YXRlLnNjaGVtYSwgc3RhdGUuc2VsZWN0aW9uKSxcclxuICAgICAgICAgICAgICAgICAgICBjYW5JbnNlcnRMaW5rLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUxpbmtNYXJrOiB0b1N0YXRlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtBY3Rpb24uU0VMRUNUSU9OX0NIQU5HRSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGFwcGx5KFxyXG4gICAgICAgICAgICAgICAgdHIsXHJcbiAgICAgICAgICAgICAgICBwbHVnaW5TdGF0ZTogSHlwZXJsaW5rU3RhdGUsXHJcbiAgICAgICAgICAgICAgICBvbGRTdGF0ZSxcclxuICAgICAgICAgICAgICAgIG5ld1N0YXRlLFxyXG4gICAgICAgICAgICApOiBIeXBlcmxpbmtTdGF0ZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBwbHVnaW5TdGF0ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHRyLmdldE1ldGEocGx1Z2luS2V5KSBhcyBMaW5rQWN0aW9uO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0ci5kb2NDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRleHQ6IHN0YXRlLmFjdGl2ZVRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkluc2VydExpbms6IGNhbkxpbmtCZUNyZWF0ZWRJblJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUuc2VsZWN0aW9uLmZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZS5zZWxlY3Rpb24udG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkobmV3U3RhdGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaW5rTWFyazogbWFwVHJhbnNhY3Rpb25Ub1N0YXRlKHN0YXRlLmFjdGl2ZUxpbmtNYXJrLCB0ciksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRleHQ6IHN0YXRlLmFjdGl2ZVRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkluc2VydExpbms6IHN0YXRlLmNhbkluc2VydExpbmssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUxpbmtNYXJrOiB0b1N0YXRlKHN0YXRlLmFjdGl2ZUxpbmtNYXJrLCBhY3Rpb24sIG5ld1N0YXRlKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0ci5zZWxlY3Rpb25TZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGV4dDogZ2V0QWN0aXZlVGV4dChuZXdTdGF0ZS5zY2hlbWEsIG5ld1N0YXRlLnNlbGVjdGlvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkluc2VydExpbms6IGNhbkxpbmtCZUNyZWF0ZWRJblJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUuc2VsZWN0aW9uLmZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZS5zZWxlY3Rpb24udG8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkobmV3U3RhdGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMaW5rTWFyazogdG9TdGF0ZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZUxpbmtNYXJrLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua0FjdGlvbi5TRUxFQ1RJT05fQ0hBTkdFLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IHBsdWdpblN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gocGx1Z2luS2V5LCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBrZXk6IHBsdWdpbktleVxyXG4gICAgfSlcclxufVxyXG4iXX0=