angular-xml-editor
Version:
XML editor component for Angular
227 lines (226 loc) • 26.6 kB
JavaScript
/**
* @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=