UNPKG

materialize-angular

Version:
310 lines 25.6 kB
/** * @fileoverview added by tsickle * Generated from: app/completed-components/html-visualizer/html-visualizer.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Workylab. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE */ import { Component, Input } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { config } from '../../config'; var HTMLVisualizerComponent = /** @class */ (function () { function HTMLVisualizerComponent(sanitizer) { this.sanitizer = sanitizer; this.className = HTMLVisualizerComponent.defaultProps.className; this.html = HTMLVisualizerComponent.defaultProps.html; this.prefix = config.components.prefix; } /** * @return {?} */ HTMLVisualizerComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.htmlContent = this.render(this.html); }; /** * @param {?} html * @return {?} */ HTMLVisualizerComponent.prototype.render = /** * @param {?} html * @return {?} */ function (html) { /** @type {?} */ var tags = this.splitByTags(html); /** @type {?} */ var lines = []; /** @type {?} */ var depth = 0; for (var i = 0; i < tags.length; i++) { /** @type {?} */ var currentTag = tags[i]; /** @type {?} */ var nextTag = tags[i + 1]; /** @type {?} */ var lastTag = tags[i + 2]; /** @type {?} */ var result = this.createLineLogic(currentTag, nextTag, lastTag, depth, i); depth = result.depth; i = result.cycle; lines.push(result.line); } return lines.join('<br />'); }; /** * @param {?} content * @param {?} className * @return {?} */ HTMLVisualizerComponent.prototype.createNode = /** * @param {?} content * @param {?} className * @return {?} */ function (content, className) { /** @type {?} */ var escapedContent = content.replace(/&/g, '&amp;'); escapedContent = escapedContent.trim(); escapedContent = escapedContent.replace(/\[\[/g, '&#123&#123;'); escapedContent = escapedContent.replace(/\]\]/g, '&#125&#125;'); escapedContent = escapedContent.replace(/</g, '&lt;'); escapedContent = escapedContent.replace(/>/g, '&gt;'); escapedContent = escapedContent.replace(/(\S+)="([^']*?)"/g, (/** * @param {?} match * @return {?} */ function (match) { /** @type {?} */ var value = match.match(/"([^']*?)"/g); /** @type {?} */ var attribute = match.match(/(\S+)=/g); /** @type {?} */ var attributeValidated = (attribute && attribute[0]) || ''; /** @type {?} */ var valueValidated = (value && value[0]) || ''; /** @type {?} */ var attributeTag = "<span class=\"" + HTMLVisualizerComponent.ATTRIBUTE_CLASS + "\">" + attributeValidated + "</span>"; /** @type {?} */ var valueTag = "<span class=\"" + HTMLVisualizerComponent.VALUE_CLASS + "\">" + valueValidated + "</span>"; return attributeTag + valueTag; })); escapedContent = escapedContent.replace(/(&lt;\/|&lt;)/g, (/** * @param {?} match * @return {?} */ function (match) { return "<span class=\"" + HTMLVisualizerComponent.SYMBOL_CLASS + "\">&lt;" + (match.includes('/') ? '/' : '') + "</span>"; })); escapedContent = escapedContent.replace(/(\/&gt;|&gt;)/g, (/** * @param {?} match * @return {?} */ function (match) { return "<span class=\"" + HTMLVisualizerComponent.SYMBOL_CLASS + "\">" + (match.includes('/') ? '/' : '') + "&gt;</span>"; })); return "<span class=\"" + className + "\">" + escapedContent + "</span>"; }; /** * @param {?} depth * @param {?} content * @return {?} */ HTMLVisualizerComponent.prototype.indentNode = /** * @param {?} depth * @param {?} content * @return {?} */ function (depth, content) { /** @type {?} */ var indentationBase = '&emsp;&emsp;'; /** @type {?} */ var indentation = indentationBase.repeat(depth); return "" + indentation + content; }; /** * @param {?} xml * @return {?} */ HTMLVisualizerComponent.prototype.splitByTags = /** * @param {?} xml * @return {?} */ function (xml) { /** @type {?} */ var tags = xml.split(/(<\/?[^>]+>)/g); /** @type {?} */ var cleanedTags = tags.filter((/** * @param {?} line * @return {?} */ function (line) { return line.trim() !== ''; })); return cleanedTags; }; /** * @param {?} contentNode * @return {?} */ HTMLVisualizerComponent.prototype.isTag = /** * @param {?} contentNode * @return {?} */ function (contentNode) { return (/<[^>!]+>/).test(contentNode); }; /** * @param {?} contentNode * @return {?} */ HTMLVisualizerComponent.prototype.isOpeningTag = /** * @param {?} contentNode * @return {?} */ function (contentNode) { if (this.isTag(contentNode) && !this.isClosingTag(contentNode) && !this.isSelfClosingTag(contentNode)) { return true; } return false; }; /** * @param {?} contentNode * @return {?} */ HTMLVisualizerComponent.prototype.isClosingTag = /** * @param {?} contentNode * @return {?} */ function (contentNode) { return (/<\/+[^>]+>/).test(contentNode); }; /** * @param {?} contentNode * @return {?} */ HTMLVisualizerComponent.prototype.isSelfClosingTag = /** * @param {?} contentNode * @return {?} */ function (contentNode) { return (/<[^>]+\/>/).test(contentNode); }; /** * @param {?} firstTag * @param {?} middleTag * @param {?} lastTag * @param {?} depth * @param {?} cycle * @return {?} */ HTMLVisualizerComponent.prototype.createLineLogic = /** * @param {?} firstTag * @param {?} middleTag * @param {?} lastTag * @param {?} depth * @param {?} cycle * @return {?} */ function (firstTag, middleTag, lastTag, depth, cycle) { if (this.isOpeningTag(firstTag) && this.isClosingTag(middleTag)) { /** @type {?} */ var openNode = this.createNode(firstTag, 'tag'); /** @type {?} */ var closeNode = this.createNode(middleTag, 'tag'); return { cycle: cycle + 1, depth: depth, line: this.indentNode(depth, "" + openNode + closeNode) }; } if (this.isOpeningTag(firstTag) && !this.isTag(middleTag)) { /** @type {?} */ var openNode = this.createNode(firstTag, 'tag'); /** @type {?} */ var contentNode = this.createNode(middleTag, 'string'); /** @type {?} */ var closeNode = this.createNode(lastTag, 'tag'); return { cycle: cycle + 2, depth: depth, line: this.indentNode(depth, "" + openNode + contentNode + closeNode) }; } if (this.isSelfClosingTag(firstTag)) { /** @type {?} */ var selfClosingNode = this.createNode(firstTag, 'tag'); return { cycle: cycle, depth: depth, line: this.indentNode(depth, selfClosingNode) }; } if (this.isClosingTag(firstTag)) { /** @type {?} */ var closeNode = this.createNode(firstTag, 'tag'); return { cycle: cycle, depth: depth - 1, line: this.indentNode(depth - 1, closeNode) }; } return { cycle: cycle, depth: depth + 1, line: this.indentNode(depth, this.createNode(firstTag, 'text')) }; }; HTMLVisualizerComponent.ATTRIBUTE_CLASS = config.components.prefix + "-html-visualizer-attribute"; HTMLVisualizerComponent.VALUE_CLASS = config.components.prefix + "-html-visualizer-value"; HTMLVisualizerComponent.SYMBOL_CLASS = config.components.prefix + "-html-visualizer-symbol"; HTMLVisualizerComponent.defaultProps = { className: '', html: '' }; HTMLVisualizerComponent.decorators = [ { type: Component, args: [{ selector: config.components.prefix + "-html-visualizer", template: "<div [ngClass]=\"prefix + '-html-visualizer'\">\n <div [ngClass]=\"prefix + '-html-visualizer-content'\" [innerHTML]=\"htmlContent\" ngNonBindable></div>\n</div>\n" }] } ]; /** @nocollapse */ HTMLVisualizerComponent.ctorParameters = function () { return [ { type: DomSanitizer } ]; }; HTMLVisualizerComponent.propDecorators = { className: [{ type: Input }], html: [{ type: Input }] }; return HTMLVisualizerComponent; }()); export { HTMLVisualizerComponent }; if (false) { /** @type {?} */ HTMLVisualizerComponent.ATTRIBUTE_CLASS; /** @type {?} */ HTMLVisualizerComponent.VALUE_CLASS; /** @type {?} */ HTMLVisualizerComponent.SYMBOL_CLASS; /** @type {?} */ HTMLVisualizerComponent.defaultProps; /** @type {?} */ HTMLVisualizerComponent.prototype.className; /** @type {?} */ HTMLVisualizerComponent.prototype.html; /** @type {?} */ HTMLVisualizerComponent.prototype.htmlContent; /** @type {?} */ HTMLVisualizerComponent.prototype.prefix; /** * @type {?} * @private */ HTMLVisualizerComponent.prototype.sanitizer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC12aXN1YWxpemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvaHRtbC12aXN1YWxpemVyL2h0bWwtdmlzdWFsaXplci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEM7SUFvQkUsaUNBQW9CLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFObEMsY0FBUyxHQUFXLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFDbkUsU0FBSSxHQUFXLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFHM0QsV0FBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBR3pDLENBQUM7Ozs7SUFFRCwwQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBRUQsd0NBQU07Ozs7SUFBTixVQUFPLElBQVk7O1lBQ1gsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDOztZQUM3QixLQUFLLEdBQUcsRUFBRTs7WUFFWixLQUFLLEdBQUcsQ0FBQztRQUViLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztnQkFDOUIsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O2dCQUNwQixP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Q3BGLHFDQUFzRjs7SUFFdEYscUNBR0U7O0lBRUYsNENBQTRFOztJQUM1RSx1Q0FBa0U7O0lBRWxFLDhDQUE2Qjs7SUFDN0IseUNBQXlDOzs7OztJQUU3Qiw0Q0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBIVE1MVmlzdWFsaXplck1vZGVsIH0gZnJvbSAnLi9odG1sLXZpc3VhbGl6ZXIubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1odG1sLXZpc3VhbGl6ZXJgLFxuICB0ZW1wbGF0ZVVybDogJy4vaHRtbC12aXN1YWxpemVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBIVE1MVmlzdWFsaXplckNvbXBvbmVudCBpbXBsZW1lbnRzIEhUTUxWaXN1YWxpemVyTW9kZWwsIE9uSW5pdCB7XG4gIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfQ0xBU1MgPSBgJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH0taHRtbC12aXN1YWxpemVyLWF0dHJpYnV0ZWA7XG4gIHN0YXRpYyByZWFkb25seSBWQUxVRV9DTEFTUyA9IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1odG1sLXZpc3VhbGl6ZXItdmFsdWVgO1xuICBzdGF0aWMgcmVhZG9ubHkgU1lNQk9MX0NMQVNTID0gYCR7IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeCB9LWh0bWwtdmlzdWFsaXplci1zeW1ib2xgO1xuXG4gIHN0YXRpYyByZWFkb25seSBkZWZhdWx0UHJvcHM6IEhUTUxWaXN1YWxpemVyTW9kZWwgPSB7XG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBodG1sOiAnJ1xuICB9O1xuXG4gIEBJbnB1dCgpIGNsYXNzTmFtZTogc3RyaW5nID0gSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmNsYXNzTmFtZTtcbiAgQElucHV0KCkgaHRtbDogc3RyaW5nID0gSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmh0bWw7XG5cbiAgcHVibGljIGh0bWxDb250ZW50OiBTYWZlSHRtbDtcbiAgcHVibGljIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmh0bWxDb250ZW50ID0gdGhpcy5yZW5kZXIodGhpcy5odG1sKTtcbiAgfVxuXG4gIHJlbmRlcihodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnNwbGl0QnlUYWdzKGh0bWwpO1xuICAgIGNvbnN0IGxpbmVzID0gW107XG5cbiAgICBsZXQgZGVwdGggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50VGFnID0gdGFnc1tpXTtcbiAgICAgIGNvbnN0IG5leHRUYWcgPSB0YWdzW2kgKyAxXTtcbiAgICAgIGNvbnN0IGxhc3RUYWcgPSB0YWdzW2kgKyAyXTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jcmVhdGVMaW5lTG9naWMoY3VycmVudFRhZywgbmV4dFRhZywgbGFzdFRhZywgZGVwdGgsIGkpO1xuXG4gICAgICBkZXB0aCA9IHJlc3VsdC5kZXB0aDtcbiAgICAgIGkgPSByZXN1bHQuY3ljbGU7XG4gICAgICBsaW5lcy5wdXNoKHJlc3VsdC5saW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignPGJyIC8+Jyk7XG4gIH1cblxuICBjcmVhdGVOb2RlKGNvbnRlbnQ6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgZXNjYXBlZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyYvZywgJyZhbXA7Jyk7XG5cbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnRyaW0oKTtcbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoL1xcW1xcWy9nLCAnJiMxMjMmIzEyMzsnKTtcbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoL1xcXVxcXS9nLCAnJiMxMjUmIzEyNTsnKTtcblxuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvPC9nLCAnJmx0OycpO1xuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvPi9nLCAnJmd0OycpO1xuXG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlKC8oXFxTKyk9XCIoW14nXSo/KVwiL2csIG1hdGNoID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbWF0Y2gubWF0Y2goL1wiKFteJ10qPylcIi9nKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG1hdGNoLm1hdGNoKC8oXFxTKyk9L2cpO1xuICAgICAgY29uc3QgYXR0cmlidXRlVmFsaWRhdGVkID0gKGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGVbMF0pIHx8ICcnO1xuICAgICAgY29uc3QgdmFsdWVWYWxpZGF0ZWQgPSAodmFsdWUgJiYgdmFsdWVbMF0pIHx8ICcnO1xuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVUYWcgPSBgPHNwYW4gY2xhc3M9XCIkeyBIVE1MVmlzdWFsaXplckNvbXBvbmVudC5BVFRSSUJVVEVfQ0xBU1MgfVwiPiR7IGF0dHJpYnV0ZVZhbGlkYXRlZCB9PC9zcGFuPmA7XG4gICAgICBjb25zdCB2YWx1ZVRhZyA9IGA8c3BhbiBjbGFzcz1cIiR7IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LlZBTFVFX0NMQVNTIH1cIj4keyB2YWx1ZVZhbGlkYXRlZCB9PC9zcGFuPmA7XG5cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVUYWcgKyB2YWx1ZVRhZztcbiAgICB9KTtcblxuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvKCZsdDtcXC98Jmx0OykvZywgbWF0Y2ggPT5cbiAgICAgIGA8c3BhbiBjbGFzcz1cIiR7IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LlNZTUJPTF9DTEFTUyB9XCI+Jmx0OyR7IG1hdGNoLmluY2x1ZGVzKCcvJykgPyAnLycgOiAnJyB9PC9zcGFuPmBcbiAgICApO1xuXG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlKC8oXFwvJmd0O3wmZ3Q7KS9nLCBtYXRjaCA9PlxuICAgICAgYDxzcGFuIGNsYXNzPVwiJHsgSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuU1lNQk9MX0NMQVNTIH1cIj4keyBtYXRjaC5pbmNsdWRlcygnLycpID8gJy8nIDogJycgfSZndDs8L3NwYW4+YFxuICAgICk7XG5cbiAgICByZXR1cm4gYDxzcGFuIGNsYXNzPVwiJHsgY2xhc3NOYW1lIH1cIj4keyBlc2NhcGVkQ29udGVudCB9PC9zcGFuPmA7XG4gIH1cblxuICBpbmRlbnROb2RlKGRlcHRoOiBudW1iZXIsIGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IGluZGVudGF0aW9uQmFzZSA9ICcmZW1zcDsmZW1zcDsnO1xuICAgIGNvbnN0IGluZGVudGF0aW9uID0gaW5kZW50YXRpb25CYXNlLnJlcGVhdChkZXB0aCk7XG5cbiAgICByZXR1cm4gYCR7IGluZGVudGF0aW9uIH0keyBjb250ZW50IH1gO1xuICB9XG5cbiAgc3BsaXRCeVRhZ3MoeG1sOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCB0YWdzID0geG1sLnNwbGl0KC8oPFxcLz9bXj5dKz4pL2cpO1xuICAgIGNvbnN0IGNsZWFuZWRUYWdzID0gdGFncy5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSAhPT0gJycpO1xuXG4gICAgcmV0dXJuIGNsZWFuZWRUYWdzO1xuICB9XG5cbiAgaXNUYWcoY29udGVudE5vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoLzxbXj4hXSs+LykudGVzdChjb250ZW50Tm9kZSk7XG4gIH1cblxuICBpc09wZW5pbmdUYWcoY29udGVudE5vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVGFnKGNvbnRlbnROb2RlKSAmJiAhdGhpcy5pc0Nsb3NpbmdUYWcoY29udGVudE5vZGUpICYmICF0aGlzLmlzU2VsZkNsb3NpbmdUYWcoY29udGVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc0Nsb3NpbmdUYWcoY29udGVudE5vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoLzxcXC8rW14+XSs+LykudGVzdChjb250ZW50Tm9kZSk7XG4gIH1cblxuICBpc1NlbGZDbG9zaW5nVGFnKGNvbnRlbnROb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKC88W14+XStcXC8+LykudGVzdChjb250ZW50Tm9kZSk7XG4gIH1cblxuICBjcmVhdGVMaW5lTG9naWMoZmlyc3RUYWc6IHN0cmluZywgbWlkZGxlVGFnOiBzdHJpbmcsIGxhc3RUYWc6IHN0cmluZywgZGVwdGg6IG51bWJlciwgY3ljbGU6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNPcGVuaW5nVGFnKGZpcnN0VGFnKSAmJiB0aGlzLmlzQ2xvc2luZ1RhZyhtaWRkbGVUYWcpKSB7XG4gICAgICBjb25zdCBvcGVuTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RhZycpO1xuICAgICAgY29uc3QgY2xvc2VOb2RlID0gdGhpcy5jcmVhdGVOb2RlKG1pZGRsZVRhZywgJ3RhZycpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeWNsZTogY3ljbGUgKyAxLFxuICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgIGxpbmU6IHRoaXMuaW5kZW50Tm9kZShkZXB0aCwgYCR7IG9wZW5Ob2RlIH0keyBjbG9zZU5vZGUgfWApXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT3BlbmluZ1RhZyhmaXJzdFRhZykgJiYgIXRoaXMuaXNUYWcobWlkZGxlVGFnKSkge1xuICAgICAgY29uc3Qgb3Blbk5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoZmlyc3RUYWcsICd0YWcnKTtcbiAgICAgIGNvbnN0IGNvbnRlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKG1pZGRsZVRhZywgJ3N0cmluZycpO1xuICAgICAgY29uc3QgY2xvc2VOb2RlID0gdGhpcy5jcmVhdGVOb2RlKGxhc3RUYWcsICd0YWcnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3ljbGU6IGN5Y2xlICsgMixcbiAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICBsaW5lOiB0aGlzLmluZGVudE5vZGUoZGVwdGgsIGAkeyBvcGVuTm9kZSB9JHsgY29udGVudE5vZGUgfSR7IGNsb3NlTm9kZSB9YClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNTZWxmQ2xvc2luZ1RhZyhmaXJzdFRhZykpIHtcbiAgICAgIGNvbnN0IHNlbGZDbG9zaW5nTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RhZycpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeWNsZTogY3ljbGUsXG4gICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgbGluZTogdGhpcy5pbmRlbnROb2RlKGRlcHRoLCBzZWxmQ2xvc2luZ05vZGUpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2xvc2luZ1RhZyhmaXJzdFRhZykpIHtcbiAgICAgIGNvbnN0IGNsb3NlTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RhZycpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjeWNsZTogY3ljbGUsXG4gICAgICAgIGRlcHRoOiBkZXB0aCAtIDEsXG4gICAgICAgIGxpbmU6IHRoaXMuaW5kZW50Tm9kZShkZXB0aCAtIDEsIGNsb3NlTm9kZSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN5Y2xlOiBjeWNsZSxcbiAgICAgIGRlcHRoOiBkZXB0aCArIDEsXG4gICAgICBsaW5lOiB0aGlzLmluZGVudE5vZGUoZGVwdGgsIHRoaXMuY3JlYXRlTm9kZShmaXJzdFRhZywgJ3RleHQnKSlcbiAgICB9O1xuICB9XG59XG4iXX0=