UNPKG

angular-xml-editor

Version:
227 lines (226 loc) 26.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { XmlToolbox } from '../xmlToolbox.class'; import { Xml2htmlAttributeWorker } from './xml2htmlAttributeWorker.class'; export class Xml2html { /** * @param {?} rules */ constructor(rules) { this.rules = rules; this.attributeWorker = new Xml2htmlAttributeWorker(rules); } /** * @param {?} node * @return {?} */ static getTagNameFromNode(node) { /** @type {?} */ const elem = /** @type {?} */ (node); /** @type {?} */ let name = ''; if (elem) { name = elem.getAttribute(Xml2html.DataTagName); } if (name === undefined || name === null || name === '') { throw new Error(`node has no DataTagName attribute ${XmlToolbox.GetNodeDebugContext(node)}`); } return name; } /** * @param {?} node * @return {?} */ static isFloatingElement(node) { /** @type {?} */ const elem = /** @type {?} */ (node); if (elem && elem.classList) { return elem.classList.contains(Xml2html.FloatingTagClassName); } return false; } /** * @param {?} node * @return {?} */ static isNoClosingElement(node) { /** @type {?} */ const elem = /** @type {?} */ (node); if (elem && elem.classList) { return elem.classList.contains(Xml2html.NoClosingTagClassName); } return false; } /** * @param {?} xml * @return {?} */ ToHtml(xml) { if (xml === '' || xml === undefined || xml === null) { return ''; } // alert(xml); // remove newline / carriage return xml = xml.replace(/\n/g, ''); xml = xml.replace(/\r/g, ''); // remove whitespace (tabs) before tags xml = xml.replace(/[\t]+\</g, '<'); // remove whitespace between tags xml = xml.replace(/\>[\t]+\</g, '><'); // remove whitespace after tags xml = xml.replace(/\>[\t]+$/g, '>'); /** @type {?} */ const domparser = new DOMParser(); /** @type {?} */ const domdoc = domparser.parseFromString(xml, 'text/xml'); /** @type {?} */ const targetDocument = new Document(); if (domdoc.documentElement === null) { return ''; } /** @type {?} */ const body = this.GetHtmlElementFromXmlElement(domdoc.documentElement, targetDocument); if (body && body.nodeType === Node.ELEMENT_NODE) { /** @type {?} */ const html = (/** @type {?} */ (body)).outerHTML; return html; } else { throw new Error(`root node ${XmlToolbox.GetNodeDebugContext(body)} is no element`); } } /** * @param {?} ruleElem * @return {?} */ createNewElementHtml(ruleElem) { /** @type {?} */ const elem = this.createNewElementByName(ruleElem.tagName); return elem.outerHTML; } /** * @param {?} tagName * @return {?} */ createNewElementByName(tagName) { /** @type {?} */ const tempDoc = new Document(); /** @type {?} */ const newElement = tempDoc.createElement('div'); /** @type {?} */ const rule = this.rules.ruleElements.get(tagName); if (rule && rule.floating === true) { newElement.classList.add(Xml2html.FloatingTagClassName); } // visualize closing tag or not? if (rule && rule.empty === true) { newElement.classList.add(Xml2html.NoClosingTagClassName); } newElement.setAttribute(Xml2html.DataTagName, tagName); return newElement; } /** * @param {?} node * @param {?} targetDocument * @return {?} */ GetHtmlElementFromXmlElement(node, targetDocument) { switch (node.nodeType) { case Node.ELEMENT_NODE: // element node /** @type {?} */ const asElement = /** @type {?} */ (node); /** @type {?} */ const nodeName = asElement.nodeName; /** @type {?} */ let newElement = targetDocument.createElement('div'); /** @type {?} */ const rule = this.rules.ruleElements.get(nodeName); if (rule && rule.floating) { newElement.classList.add(Xml2html.FloatingTagClassName); } // visualize closing tag or not? if (rule && rule.empty) { newElement.classList.add(Xml2html.NoClosingTagClassName); } newElement.setAttribute(Xml2html.DataTagName, nodeName); /** @type {?} */ const children = asElement.childNodes; if (children.length === 0) { newElement.appendChild(targetDocument.createTextNode('')); // to prevent non closing tags } else { for (let i = 0; i < children.length; ++i) { /** @type {?} */ const childAsHtml = this.GetHtmlElementFromXmlElement(children[i], targetDocument); if (childAsHtml !== undefined) { newElement.appendChild(childAsHtml); } } } // insert attributes this.attributeWorker.writeAllXmlAttributesToHtml(asElement, newElement); return newElement; case Node.TEXT_NODE: // text node /** @type {?} */ const content = (/** @type {?} */ (node)).textContent; if (content.length > 0) { return targetDocument.createTextNode(content); } else { return undefined; } case Node.COMMENT_NODE: // create element node newElement = targetDocument.createElement('div'); newElement.classList.add(Xml2html.CommentTagClassName); newElement.setAttribute(Xml2html.DataTagName, 'comment'); newElement.textContent = (/** @type {?} */ (node)).textContent; return newElement; /* yet not implemented types */ case Node.PROCESSING_INSTRUCTION_NODE: console.warn(`nodeType "PROCESSING_INSTRUCTION_NODE" ${XmlToolbox.GetNodeDebugContext(node)} not implemented yet`); return undefined; case Node.DOCUMENT_NODE: throw new Error(`nodeType "Node.DOCUMENT_NODE" ${XmlToolbox.GetNodeDebugContext(node)} not implemented yet`); case Node.DOCUMENT_TYPE_NODE: throw new Error(`nodeType "Node.DOCUMENT_NODE" ${XmlToolbox.GetNodeDebugContext(node)} not implemented yet`); case Node.DOCUMENT_FRAGMENT_NODE: throw new Error(`nodeType "Node.DOCUMENT_FRAGMENT_NODE" ${XmlToolbox.GetNodeDebugContext(node)} not implemented yet`); /* Depreached node types */ case Node.ATTRIBUTE_NODE: throw new Error(`nodeType "Node.ATTRIBUTE_NODE" ${XmlToolbox.GetNodeDebugContext(node)} is depreached`); case Node.CDATA_SECTION_NODE: throw new Error(`nodeType "Node.CDATA_SECTION_NODE" ${XmlToolbox.GetNodeDebugContext(node)} is depreached`); case Node.ENTITY_REFERENCE_NODE: throw new Error(`nodeType "Node.ENTITY_REFERENCE_NODE" ${XmlToolbox.GetNodeDebugContext(node)} is depreached`); case Node.ENTITY_NODE: throw new Error(`nodeType "Node.ENTITY_NODE" ${XmlToolbox.GetNodeDebugContext(node)} is depreached`); case Node.NOTATION_NODE: throw new Error(`nodeType "Node.NOTATION_NODE" ${XmlToolbox.GetNodeDebugContext(node)} is depreached`); default: // tslint:disable-next-line:max-line-length throw new Error(`unknown xmlElement nodeType ${node.nodeType} in value: ${XmlToolbox.GetNodeDebugContext(node)}`); } } } Xml2html.DataTagName = 'data-tagname'; Xml2html.NoClosingTagClassName = 'xmlTagNoClosing'; Xml2html.FloatingTagClassName = 'floating'; Xml2html.CommentTagClassName = 'comment'; if (false) { /** @type {?} */ Xml2html.DataTagName; /** @type {?} */ Xml2html.NoClosingTagClassName; /** @type {?} */ Xml2html.FloatingTagClassName; /** @type {?} */ Xml2html.CommentTagClassName; /** @type {?} */ Xml2html.prototype.attributeWorker; /** @type {?} */ Xml2html.prototype.rules; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sMmh0bWwuY2xhc3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXhtbC1lZGl0b3IvIiwic291cmNlcyI6WyJsaWIvY29kZS94bWwtaHRtbC1jb252ZXJ0ZXIveG1sMmh0bWwuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcxRSxNQUFNOzs7O0lBUUosWUFBbUIsS0FBZTtRQUFmLFVBQUssR0FBTCxLQUFLLENBQVU7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNEOzs7OztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFVOztRQUNsQyxNQUFNLElBQUkscUJBQUcsSUFBZSxFQUFDOztRQUM3QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RjtRQUNELE9BQU8sSUFBSSxDQUFDO0tBQ2I7Ozs7O0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQVU7O1FBQ2pDLE1BQU0sSUFBSSxxQkFBRyxJQUFlLEVBQUM7UUFDN0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FB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QyxDQUFDO1lBRXpHOztnQkFFRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixJQUFJLENBQUMsUUFBUSxjQUFjLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckg7Ozt1QkFoTDBCLGNBQWM7aUNBQ0wsaUJBQWlCO2dDQUNsQixVQUFVOytCQUNYLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBYbWxSdWxlcyB9IGZyb20gJy4uL3htbC1ydWxlcy1jaGVjay94bWxSdWxlcy5jbGFzcyc7XHJcbmltcG9ydCB7IFhtbFRvb2xib3ggfSBmcm9tICcuLi94bWxUb29sYm94LmNsYXNzJztcclxuaW1wb3J0IHsgWG1sMmh0bWxBdHRyaWJ1dGVXb3JrZXIgfSBmcm9tICcuL3htbDJodG1sQXR0cmlidXRlV29ya2VyLmNsYXNzJztcclxuaW1wb3J0IHsgWG1sUnVsZUVsZW1lbnQgfSBmcm9tICcuLi94bWwtcnVsZXMtY2hlY2sveG1sUnVsZUVsZW1lbnQuY2xhc3MnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFhtbDJodG1sIHtcclxuICBwcml2YXRlIHN0YXRpYyBEYXRhVGFnTmFtZSA9ICdkYXRhLXRhZ25hbWUnO1xyXG4gIHB1YmxpYyBzdGF0aWMgTm9DbG9zaW5nVGFnQ2xhc3NOYW1lID0gJ3htbFRhZ05vQ2xvc2luZyc7XHJcbiAgcHVibGljIHN0YXRpYyBGbG9hdGluZ1RhZ0NsYXNzTmFtZSA9ICdmbG9hdGluZyc7XHJcbiAgcHVibGljIHN0YXRpYyBDb21tZW50VGFnQ2xhc3NOYW1lID0gJ2NvbW1lbnQnO1xyXG5cclxuICBwcml2YXRlIGF0dHJpYnV0ZVdvcmtlcjogWG1sMmh0bWxBdHRyaWJ1dGVXb3JrZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBydWxlczogWG1sUnVsZXMpIHtcclxuICAgIHRoaXMuYXR0cmlidXRlV29ya2VyID0gbmV3IFhtbDJodG1sQXR0cmlidXRlV29ya2VyKHJ1bGVzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRUYWdOYW1lRnJvbU5vZGUobm9kZTogTm9kZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xyXG4gICAgbGV0IG5hbWUgPSAnJztcclxuICAgIGlmIChlbGVtKSB7XHJcbiAgICAgIG5hbWUgPSBlbGVtLmdldEF0dHJpYnV0ZShYbWwyaHRtbC5EYXRhVGFnTmFtZSk7XHJcbiAgICB9XHJcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IG51bGwgfHwgbmFtZSA9PT0gJycpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlIGhhcyBubyBEYXRhVGFnTmFtZSBhdHRyaWJ1dGUgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0Zsb2F0aW5nRWxlbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xyXG4gICAgaWYgKGVsZW0gJiYgZWxlbS5jbGFzc0xpc3QpIHtcclxuICAgICAgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFhtbDJodG1sLkZsb2F0aW5nVGFnQ2xhc3NOYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc05vQ2xvc2luZ0VsZW1lbnQobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcclxuICAgIGlmIChlbGVtICYmIGVsZW0uY2xhc3NMaXN0KSB7XHJcbiAgICAgIHJldHVybiBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhYbWwyaHRtbC5Ob0Nsb3NpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFRvSHRtbCh4bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoeG1sID09PSAnJyB8fCB4bWwgPT09IHVuZGVmaW5lZCB8fCB4bWwgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsZXJ0KHhtbCk7XHJcblxyXG4gICAgLy8gcmVtb3ZlIG5ld2xpbmUgLyBjYXJyaWFnZSByZXR1cm5cclxuICAgIHhtbCA9IHhtbC5yZXBsYWNlKC9cXG4vZywgJycpO1xyXG4gICAgeG1sID0geG1sLnJlcGxhY2UoL1xcci9nLCAnJyk7XHJcbiAgICAvLyByZW1vdmUgd2hpdGVzcGFjZSAodGFicykgYmVmb3JlIHRhZ3NcclxuICAgIHhtbCA9IHhtbC5yZXBsYWNlKC9bXFx0XStcXDwvZywgJzwnKTtcclxuICAgIC8vIHJlbW92ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFnc1xyXG4gICAgeG1sID0geG1sLnJlcGxhY2UoL1xcPltcXHRdK1xcPC9nLCAnPjwnKTtcclxuICAgIC8vIHJlbW92ZSB3aGl0ZXNwYWNlIGFmdGVyIHRhZ3NcclxuICAgIHhtbCA9IHhtbC5yZXBsYWNlKC9cXD5bXFx0XSskL2csICc+Jyk7XHJcblxyXG4gICAgY29uc3QgZG9tcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgY29uc3QgZG9tZG9jID0gZG9tcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpO1xyXG5cclxuICAgIGNvbnN0IHRhcmdldERvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7XHJcblxyXG4gICAgaWYgKGRvbWRvYy5kb2N1bWVudEVsZW1lbnQgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLkdldEh0bWxFbGVtZW50RnJvbVhtbEVsZW1lbnQoZG9tZG9jLmRvY3VtZW50RWxlbWVudCwgdGFyZ2V0RG9jdW1lbnQpO1xyXG4gICAgaWYgKGJvZHkgJiYgYm9keS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgY29uc3QgaHRtbCA9IChib2R5IGFzIEVsZW1lbnQpLm91dGVySFRNTDtcclxuICAgICAgcmV0dXJuIGh0bWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJvb3Qgbm9kZSAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChib2R5KX0gaXMgbm8gZWxlbWVudGApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlTmV3RWxlbWVudEh0bWwocnVsZUVsZW06IFhtbFJ1bGVFbGVtZW50KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGVsZW0gPSB0aGlzLmNyZWF0ZU5ld0VsZW1lbnRCeU5hbWUocnVsZUVsZW0udGFnTmFtZSk7XHJcbiAgICByZXR1cm4gZWxlbS5vdXRlckhUTUw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTmV3RWxlbWVudEJ5TmFtZSh0YWdOYW1lOiBzdHJpbmcpOiBFbGVtZW50IHtcclxuICAgIGNvbnN0IHRlbXBEb2MgPSBuZXcgRG9jdW1lbnQoKTtcclxuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0ZW1wRG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgLy8gZmxvYXRpbmcgZWxlbWVudCBvciBub3Q/XHJcbiAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlcy5ydWxlRWxlbWVudHMuZ2V0KHRhZ05hbWUpO1xyXG4gICAgaWYgKHJ1bGUgJiYgcnVsZS5mbG9hdGluZyA9PT0gdHJ1ZSkge1xyXG4gICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoWG1sMmh0bWwuRmxvYXRpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgfVxyXG4gICAgLy8gdmlzdWFsaXplIGNsb3NpbmcgdGFnIG9yIG5vdD9cclxuICAgIGlmIChydWxlICYmIHJ1bGUuZW1wdHkgPT09IHRydWUpIHtcclxuICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFhtbDJodG1sLk5vQ2xvc2luZ1RhZ0NsYXNzTmFtZSk7XHJcbiAgICB9XHJcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShYbWwyaHRtbC5EYXRhVGFnTmFtZSwgdGFnTmFtZSk7XHJcbiAgICByZXR1cm4gbmV3RWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0SHRtbEVsZW1lbnRGcm9tWG1sRWxlbWVudChub2RlOiBOb2RlLCB0YXJnZXREb2N1bWVudDogRG9jdW1lbnQpOiBOb2RlIHtcclxuICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xyXG4gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOiAvLyBlbGVtZW50IG5vZGVcclxuICAgICAgICBjb25zdCBhc0VsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBhc0VsZW1lbnQubm9kZU5hbWU7XHJcblxyXG4gICAgICAgIC8vIGNyZWF0ZSBlbGVtZW50IG5vZGVcclxuICAgICAgICBsZXQgbmV3RWxlbWVudCA9IHRhcmdldERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICAvLyBmbG9hdGluZyBlbGVtZW50IG9yIG5vdD9cclxuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlcy5ydWxlRWxlbWVudHMuZ2V0KG5vZGVOYW1lKTtcclxuICAgICAgICBpZiAocnVsZSAmJiBydWxlLmZsb2F0aW5nKSB7XHJcbiAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoWG1sMmh0bWwuRmxvYXRpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB2aXN1YWxpemUgY2xvc2luZyB0YWcgb3Igbm90P1xyXG4gICAgICAgIGlmIChydWxlICYmIHJ1bGUuZW1wdHkpIHtcclxuICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChYbWwyaHRtbC5Ob0Nsb3NpbmdUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShYbWwyaHRtbC5EYXRhVGFnTmFtZSwgbm9kZU5hbWUpO1xyXG5cclxuICAgICAgICAvLyBhcHBlbmQgY2hpbGQgZWxlbWVudHMgcmVjdXJzaXZlXHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBhc0VsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKHRhcmdldERvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKSk7IC8vIHRvIHByZXZlbnQgbm9uIGNsb3NpbmcgdGFnc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkQXNIdG1sID0gdGhpcy5HZXRIdG1sRWxlbWVudEZyb21YbWxFbGVtZW50KGNoaWxkcmVuW2ldLCB0YXJnZXREb2N1bWVudCk7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZEFzSHRtbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEFzSHRtbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGluc2VydCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVXb3JrZXIud3JpdGVBbGxYbWxBdHRyaWJ1dGVzVG9IdG1sKGFzRWxlbWVudCwgbmV3RWxlbWVudCk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xyXG5cclxuICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERTogLy8gdGV4dCBub2RlXHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50O1xyXG4gICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybiB0YXJnZXREb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOlxyXG4gICAgICAgIC8vIGNyZWF0ZSBlbGVtZW50IG5vZGVcclxuICAgICAgICBuZXdFbGVtZW50ID0gdGFyZ2V0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgbmV3RWxlbWVudC5jbGFzc0xpc3QuYWRkKFhtbDJodG1sLkNvbW1lbnRUYWdDbGFzc05hbWUpO1xyXG4gICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKFhtbDJodG1sLkRhdGFUYWdOYW1lLCAnY29tbWVudCcpO1xyXG4gICAgICAgIG5ld0VsZW1lbnQudGV4dENvbnRlbnQgPSAobm9kZSBhcyBFbGVtZW50KS50ZXh0Q29udGVudDtcclxuICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcclxuXHJcbiAgICAgIC8qIHlldCBub3QgaW1wbGVtZW50ZWQgdHlwZXMgKi9cclxuICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTpcclxuICAgICAgICBjb25zb2xlLndhcm4oYG5vZGVUeXBlIFwiUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFXCIgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9IG5vdCBpbXBsZW1lbnRlZCB5ZXRgKTtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuRE9DVU1FTlRfTk9ERVwiICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7XHJcbiAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuRE9DVU1FTlRfTk9ERVwiICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7XHJcbiAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgbm9kZVR5cGUgXCJOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREVcIiAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX0gbm90IGltcGxlbWVudGVkIHlldGApO1xyXG5cclxuICAgICAgLyogRGVwcmVhY2hlZCBub2RlIHR5cGVzICovXHJcbiAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERTpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGVUeXBlIFwiTm9kZS5BVFRSSUJVVEVfTk9ERVwiICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfSBpcyBkZXByZWFjaGVkYCk7XHJcbiAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFXCIgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9IGlzIGRlcHJlYWNoZWRgKTtcclxuICAgICAgY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGVUeXBlIFwiTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREVcIiAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX0gaXMgZGVwcmVhY2hlZGApO1xyXG4gICAgICBjYXNlIE5vZGUuRU5USVRZX05PREU6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub2RlVHlwZSBcIk5vZGUuRU5USVRZX05PREVcIiAke1htbFRvb2xib3guR2V0Tm9kZURlYnVnQ29udGV4dChub2RlKX0gaXMgZGVwcmVhY2hlZGApO1xyXG4gICAgICBjYXNlIE5vZGUuTk9UQVRJT05fTk9ERTpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vZGVUeXBlIFwiTm9kZS5OT1RBVElPTl9OT0RFXCIgJHtYbWxUb29sYm94LkdldE5vZGVEZWJ1Z0NvbnRleHQobm9kZSl9IGlzIGRlcHJlYWNoZWRgKTtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biB4bWxFbGVtZW50IG5vZGVUeXBlICR7bm9kZS5ub2RlVHlwZX0gaW4gdmFsdWU6ICR7WG1sVG9vbGJveC5HZXROb2RlRGVidWdDb250ZXh0KG5vZGUpfWApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=