UNPKG

@zodiac-ui/editor

Version:

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

125 lines 17.9 kB
import * as LinkifyItNs from 'linkify-it'; import { mapSlice } from "../../lib/utils/map-slice"; const LinkifyIt = LinkifyItNs; export const LINK_REGEXP = /(https?|ftp):\/\/[^\s]+/; const linkify = LinkifyIt(); linkify.add('sourcetree:', 'http:'); const tlds = 'biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|рф'.split('|'); const tlds2Char = 'a[cdefgilmnoqrtuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrtuvwxyz]|n[acefgilopruz]|om|p[aefghkmnrtw]|qa|r[eosuw]|s[abcdegijklmnrtuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]'; tlds.push(tlds2Char); linkify.tlds(tlds, false); export function getLinkMatch(str) { if (!str) { return null; } let match = linkifyMatch(str); if (!match.length) { match = linkify.match(str); } return match && match[0]; } const endsWithSpace = new RegExp("\\s$"); /** * Instance of class LinkMatcher are used in autoformatting in place of Regex. * Hence it has been made similar to regex with an exec method. * Extending it directly from class Regex was introducing some issues, thus that has been avoided. */ export class LinkMatcher { exec(str) { if (endsWithSpace.test(str)) { const chunks = str.slice(0, str.length - 1).split(' '); const lastChunk = chunks[chunks.length - 1]; const links = linkify.match(lastChunk); if (links && links.length > 0) { const lastLink = links[links.length - 1]; lastLink.input = lastChunk; lastLink.length = lastLink.lastIndex - lastLink.index + 1; return [lastLink]; } } return null; } } /** * Adds protocol to url if needed. */ export function normalizeUrl(url) { if (LINK_REGEXP.test(url)) { return url; } const match = getLinkMatch(url); return (match && match.url) || url; } export function linkifyContent(schema) { return (slice) => mapSlice(slice, (node, parent) => { const isAllowedInParent = !parent || parent.type !== schema.nodes.codeBlock; if (isAllowedInParent && node.isText) { const linkified = []; const link = node.type.schema.marks['link']; const text = node.text; const matches = findLinkMatches(text); let pos = 0; matches.forEach(match => { if (match.start > 0) { linkified.push(node.cut(pos, match.start)); } linkified.push(node .cut(match.start, match.end) .mark(link .create({ href: normalizeUrl(match.href) }) .addToSet(node.marks))); pos = match.end; }); if (pos < text.length) { linkified.push(node.cut(pos)); } return linkified; } return node; }); } function findLinkMatches(text) { const matches = []; const linkMatches = text && linkify.match(text); if (linkMatches && linkMatches.length > 0) { linkMatches.forEach(match => { matches.push({ start: match.index, end: match.lastIndex, title: match.raw, href: match.url, }); }); } return matches; } export const linkifyMatch = (text) => { const matches = []; if (!LINK_REGEXP.test(text)) { return matches; } let startpos = 0; let substr; while ((substr = text.substr(startpos))) { const link = (substr.match(LINK_REGEXP) || [''])[0]; if (link) { const index = substr.search(LINK_REGEXP); const start = index >= 0 ? index + startpos : index; const end = start + link.length; matches.push({ index: start, lastIndex: end, raw: link, url: link, text: link, schema: '', }); startpos += end; } else { break; } } return matches; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aem9kaWFjLXVpL2VkaXRvci8iLCJzb3VyY2VzIjpbInBsdWdpbnMvbGluay91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssV0FBVyxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFcEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFBO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztBQWFyRCxNQUFNLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztBQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUVwQyxNQUFNLElBQUksR0FBRyw2RUFBNkUsQ0FBQyxLQUFLLENBQzVGLEdBQUcsQ0FDTixDQUFDO0FBQ0YsTUFBTSxTQUFTLEdBQ1gsa1ZBQWtWLENBQUM7QUFDdlYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUUxQixNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVc7SUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNOLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFDRCxJQUFJLEtBQUssR0FBMEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ2YsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDOUI7SUFDRCxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELE1BQU0sYUFBYSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBRXhDOzs7O0dBSUc7QUFDSCxNQUFN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UUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksRUFBRTtZQUNOLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3BELE1BQU0sR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osU0FBUyxFQUFFLEdBQUc7Z0JBQ2QsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLElBQUk7Z0JBQ1QsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFLEVBQUU7YUFDYixDQUFDLENBQUM7WUFDSCxRQUFRLElBQUksR0FBRyxDQUFDO1NBQ25CO2FBQU07WUFDSCxNQUFNO1NBQ1Q7S0FDSjtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNsaWNlLCBOb2RlLCBTY2hlbWEgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XHJcbmltcG9ydCAqIGFzIExpbmtpZnlJdE5zIGZyb20gJ2xpbmtpZnktaXQnO1xyXG5pbXBvcnQgeyBtYXBTbGljZSB9IGZyb20gXCIuLi8uLi9saWIvdXRpbHMvbWFwLXNsaWNlXCJcclxuXHJcbmNvbnN0IExpbmtpZnlJdCA9IExpbmtpZnlJdE5zXHJcblxyXG5leHBvcnQgY29uc3QgTElOS19SRUdFWFAgPSAvKGh0dHBzP3xmdHApOlxcL1xcL1teXFxzXSsvO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYXRjaCB7XHJcbiAgICBzY2hlbWE6IGFueTtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBsYXN0SW5kZXg6IG51bWJlcjtcclxuICAgIHJhdzogc3RyaW5nO1xyXG4gICAgdGV4dDogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICBsZW5ndGg/OiBudW1iZXI7XHJcbiAgICBpbnB1dD86IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgbGlua2lmeSA9IExpbmtpZnlJdCgpO1xyXG5saW5raWZ5LmFkZCgnc291cmNldHJlZTonLCAnaHR0cDonKTtcclxuXHJcbmNvbnN0IHRsZHMgPSAnYml6fGNvbXxlZHV8Z292fG5ldHxvcmd8cHJvfHdlYnx4eHh8YWVyb3xhc2lhfGNvb3B8aW5mb3xtdXNldW18bmFtZXxzaG9wfNGA0YQnLnNwbGl0KFxyXG4gICAgJ3wnLFxyXG4pO1xyXG5jb25zdCB0bGRzMkNoYXIgPVxyXG4gICAgJ2FbY2RlZmdpbG1ub3FydHV3eHpdfGJbYWJkZWZnaGlqbW5vcnN0dnd5el18Y1thY2RmZ2hpa2xtbm9ydXZ3eHl6XXxkW2Vqa21vel18ZVtjZWdyc3R1XXxmW2lqa21vcl18Z1thYmRlZmdoaWxtbnBxcnN0dXd5XXxoW2ttbnJ0dV18aVtkZWxtbm9xcnN0XXxqW2Vtb3BdfGtbZWdoaW1ucHJ3eXpdfGxbYWJjaWtyc3R1dnldfG1bYWNkZWdoa2xtbm9wcXJ0dXZ3eHl6XXxuW2FjZWZnaWxvcHJ1el18b218cFthZWZnaGttbnJ0d118cWF8cltlb3N1d118c1thYmNkZWdpamtsbW5ydHV2eHl6XXx0W2NkZmdoamtsbW5vcnR2d3pdfHVbYWdrc3l6XXx2W2FjZWdpbnVdfHdbZnNdfHlbZXRdfHpbYW13XSc7XHJcbnRsZHMucHVzaCh0bGRzMkNoYXIpO1xyXG5saW5raWZ5LnRsZHModGxkcywgZmFsc2UpO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmtNYXRjaChzdHI6IHN0cmluZyk6IE1hdGNoIHwgTGlua2lmeU1hdGNoIHwgbnVsbCB7XHJcbiAgICBpZiAoIXN0cikge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgbGV0IG1hdGNoOiBudWxsIHwgTGlua2lmeU1hdGNoW10gPSBsaW5raWZ5TWF0Y2goc3RyKTtcclxuICAgIGlmICghbWF0Y2gubGVuZ3RoKSB7XHJcbiAgICAgICAgbWF0Y2ggPSBsaW5raWZ5Lm1hdGNoKHN0cik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMF07XHJcbn1cclxuXHJcbmNvbnN0IGVuZHNXaXRoU3BhY2UgPSBuZXcgUmVnRXhwKFwiXFxcXHMkXCIpXHJcblxyXG4vKipcclxuICogSW5zdGFuY2Ugb2YgY2xhc3MgTGlua01hdGNoZXIgYXJlIHVzZWQgaW4gYXV0b2Zvcm1hdHRpbmcgaW4gcGxhY2Ugb2YgUmVnZXguXHJcbiAqIEhlbmNlIGl0IGhhcyBiZWVuIG1hZGUgc2ltaWxhciB0byByZWdleCB3aXRoIGFuIGV4ZWMgbWV0aG9kLlxyXG4gKiBFeHRlbmRpbmcgaXQgZGlyZWN0bHkgZnJvbSBjbGFzcyBSZWdleCB3YXMgaW50cm9kdWNpbmcgc29tZSBpc3N1ZXMsIHRodXMgdGhhdCBoYXMgYmVlbiBhdm9pZGVkLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExpbmtNYXRjaGVyIHtcclxuICAgIGV4ZWMoc3RyOiBzdHJpbmcpOiBNYXRjaFtdIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGVuZHNXaXRoU3BhY2UudGVzdChzdHIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNodW5rcyA9IHN0ci5zbGljZSgwLCBzdHIubGVuZ3RoIC0gMSkuc3BsaXQoJyAnKTtcclxuICAgICAgICAgICAgY29uc3QgbGFzdENodW5rID0gY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgY29uc3QgbGlua3M6IG51bGwgfCBNYXRjaFtdID0gbGlua2lmeS5tYXRjaChsYXN0Q2h1bmspO1xyXG4gICAgICAgICAgICBpZiAobGlua3MgJiYgbGlua3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdExpbms6IE1hdGNoID0gbGlua3NbbGlua3MubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICBsYXN0TGluay5pbnB1dCA9IGxhc3RDaHVuaztcclxuICAgICAgICAgICAgICAgIGxhc3RMaW5rLmxlbmd0aCA9IGxhc3RMaW5rLmxhc3RJbmRleCAtIGxhc3RMaW5rLmluZGV4ICsgMTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbbGFzdExpbmtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQWRkcyBwcm90b2NvbCB0byB1cmwgaWYgbmVlZGVkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVVybCh1cmw6IHN0cmluZykge1xyXG4gICAgaWYgKExJTktfUkVHRVhQLnRlc3QodXJsKSkge1xyXG4gICAgICAgIHJldHVybiB1cmw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBtYXRjaCA9IGdldExpbmtNYXRjaCh1cmwpO1xyXG4gICAgcmV0dXJuIChtYXRjaCAmJiBtYXRjaC51cmwpIHx8IHVybDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtpZnlDb250ZW50KHNjaGVtYTogU2NoZW1hKTogKHNsaWNlOiBTbGljZSkgPT4gU2xpY2Uge1xyXG4gICAgcmV0dXJuIChzbGljZTogU2xpY2UpOiBTbGljZSA9PlxyXG4gICAgICAgIG1hcFNsaWNlKHNsaWNlLCAobm9kZSwgcGFyZW50KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQWxsb3dlZEluUGFyZW50ID1cclxuICAgICAgICAgICAgICAgICFwYXJlbnQgfHwgcGFyZW50LnR5cGUgIT09IHNjaGVtYS5ub2Rlcy5jb2RlQmxvY2s7XHJcbiAgICAgICAgICAgIGlmIChpc0FsbG93ZWRJblBhcmVudCAmJiBub2RlLmlzVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGlua2lmaWVkID0gW10gYXMgTm9kZVtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IG5vZGUudHlwZS5zY2hlbWEubWFya3NbJ2xpbmsnXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBub2RlLnRleHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzOiBhbnlbXSA9IGZpbmRMaW5rTWF0Y2hlcyh0ZXh0KTtcclxuICAgICAgICAgICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5mb3JFYWNoKG1hdGNoID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2guc3RhcnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtpZmllZC5wdXNoKG5vZGUuY3V0KHBvcywgbWF0Y2guc3RhcnQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGlua2lmaWVkLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jdXQobWF0Y2guc3RhcnQsIG1hdGNoLmVuZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXJrKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh7IGhyZWY6IG5vcm1hbGl6ZVVybChtYXRjaC5ocmVmKSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVG9TZXQobm9kZS5tYXJrcyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gbWF0Y2guZW5kO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5raWZpZWQucHVzaChub2RlLmN1dChwb3MpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBsaW5raWZpZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgICAgfSk7XHJcbn1cclxuXHJcbmludGVyZmFjZSBMaW5rTWF0Y2gge1xyXG4gICAgc3RhcnQ6IG51bWJlcjtcclxuICAgIGVuZDogbnVtYmVyO1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIGhyZWY6IHN0cmluZztcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZExpbmtNYXRjaGVzKHRleHQ6IHN0cmluZyk6IExpbmtNYXRjaFtdIHtcclxuICAgIGNvbnN0IG1hdGNoZXM6IExpbmtNYXRjaFtdID0gW107XHJcbiAgICBjb25zdCBsaW5rTWF0Y2hlczogJycgfCBudWxsIHwgTWF0Y2hbXSA9IHRleHQgJiYgbGlua2lmeS5tYXRjaCh0ZXh0KTtcclxuICAgIGlmIChsaW5rTWF0Y2hlcyAmJiBsaW5rTWF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGlua01hdGNoZXMuZm9yRWFjaChtYXRjaCA9PiB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogbWF0Y2guaW5kZXgsXHJcbiAgICAgICAgICAgICAgICBlbmQ6IG1hdGNoLmxhc3RJbmRleCxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBtYXRjaC5yYXcsXHJcbiAgICAgICAgICAgICAgICBocmVmOiBtYXRjaC51cmwsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hdGNoZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGlua2lmeU1hdGNoIHtcclxuICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICBsYXN0SW5kZXg6IG51bWJlcjtcclxuICAgIHJhdzogc3RyaW5nO1xyXG4gICAgdXJsOiBzdHJpbmc7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICBzY2hlbWE6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGxpbmtpZnlNYXRjaCA9ICh0ZXh0OiBzdHJpbmcpOiBMaW5raWZ5TWF0Y2hbXSA9PiB7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBMaW5raWZ5TWF0Y2hbXSA9IFtdO1xyXG5cclxuICAgIGlmICghTElOS19SRUdFWFAudGVzdCh0ZXh0KSkge1xyXG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzdGFydHBvcyA9IDA7XHJcbiAgICBsZXQgc3Vic3RyO1xyXG5cclxuICAgIHdoaWxlICgoc3Vic3RyID0gdGV4dC5zdWJzdHIoc3RhcnRwb3MpKSkge1xyXG4gICAgICAgIGNvbnN0IGxpbmsgPSAoc3Vic3RyLm1hdGNoKExJTktfUkVHRVhQKSB8fCBbJyddKVswXTtcclxuICAgICAgICBpZiAobGluaykge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN1YnN0ci5zZWFyY2goTElOS19SRUdFWFApO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4ID49IDAgPyBpbmRleCArIHN0YXJ0cG9zIDogaW5kZXg7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGluay5sZW5ndGg7XHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBpbmRleDogc3RhcnQsXHJcbiAgICAgICAgICAgICAgICBsYXN0SW5kZXg6IGVuZCxcclxuICAgICAgICAgICAgICAgIHJhdzogbGluayxcclxuICAgICAgICAgICAgICAgIHVybDogbGluayxcclxuICAgICAgICAgICAgICAgIHRleHQ6IGxpbmssXHJcbiAgICAgICAgICAgICAgICBzY2hlbWE6ICcnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc3RhcnRwb3MgKz0gZW5kO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWF0Y2hlcztcclxufTtcclxuIl19