angular-xml-editor
Version:
XML editor component for Angular
169 lines (168 loc) • 26 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { XmlRuleElement } from '../../code/xml-rules-check/xmlRuleElement.class';
import { XmlEditRuleCheckElements } from '../../code/xml-rules-check/xmlEditRuleCheckElements.class';
import { AngularXmlEditorService } from '../../angular-xml-editor.service';
import { Xml2html } from '../../code/xml-html-converter/xml2html.class';
var XmlEditorToolbarComponent = /** @class */ (function () {
function XmlEditorToolbarComponent(editorService) {
this.editorService = editorService;
this.elementGroups = [];
}
Object.defineProperty(XmlEditorToolbarComponent.prototype, "config", {
get: /**
* @return {?}
*/
function () {
if (this.editorContext !== undefined && this.editorContext.config !== undefined) {
return this.editorContext && this.editorContext.config;
}
return undefined;
},
enumerable: true,
configurable: true
});
Object.defineProperty(XmlEditorToolbarComponent.prototype, "editorContextId", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
if (!value) {
return;
}
this.editorContext = this.editorService.getEditorContext(value);
this.actualCursorPosChangedSubscription = this.editorContext.actualCursorChanged.subscribe(function (pos) {
_this.elementGroups = _this.GetElementGroupsForCursorPos(pos.StartPos);
});
},
enumerable: true,
configurable: true
});
/** inserts an element at the actual cursor pos */
/**
* inserts an element at the actual cursor pos
* @param {?} element
* @return {?}
*/
XmlEditorToolbarComponent.prototype.insertElement = /**
* inserts an element at the actual cursor pos
* @param {?} element
* @return {?}
*/
function (element) {
/** @type {?} */
var html = new Xml2html(this.editorContext.config.rules).createNewElementHtml(element);
this.editorContext.domInsertHtml(html);
};
/**
* @return {?}
*/
XmlEditorToolbarComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
XmlEditorToolbarComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () { };
/**
* @return {?}
*/
XmlEditorToolbarComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.actualCursorPosChangedSubscription.unsubscribe();
};
/**
* @param {?} pos
* @return {?}
*/
XmlEditorToolbarComponent.prototype.GetElementGroupsForCursorPos = /**
* @param {?} pos
* @return {?}
*/
function (pos) {
/** @type {?} */
var allowedElements = new XmlEditRuleCheckElements(this.editorContext.config.xmlSchema.xsdNodes).ElementsAllowedAtThisCursorPos(pos);
return this.GetAllElementGroups()
.map(function (g) {
return /** @type {?} */ ({
title: g.title,
elements: g.elements.filter(function (e) { return allowedElements.includes(e.tagName); })
});
})
.filter(function (g) { return g.elements.length > 0; });
};
/**
* @return {?}
*/
XmlEditorToolbarComponent.prototype.GetAllElementGroups = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var unusedElements = XmlRuleElement.Sorted(Array.from(this.editorContext.config.rules.ruleElements.values()).filter(function (elem) {
return _this.editorContext.config.elementGroups.some(function (group) { return !group.elementNames.includes(elem.tagName); });
}));
/** @type {?} */
var otherElementsGroup = /** @type {?} */ ({
title: 'other',
elements: unusedElements
});
return this.editorContext.config.elementGroups
.map(function (g) {
return /** @type {?} */ ({
title: g.title,
elements: XmlRuleElement.Sorted(g.elementNames.map(function (elementName) { return _this.editorContext.config.rules.ruleElements.get(elementName); }).filter(function (e) { return e !== undefined; }))
});
})
.concat(otherElementsGroup)
.filter(function (g) { return g.elements.length !== 0; });
};
XmlEditorToolbarComponent.decorators = [
{ type: Component, args: [{
selector: 'axed-toolbar',
template: "<div class=\"sws-xml-editor-toolbar\">\r\n <h3>Insert element</h3>\r\n\r\n <!--\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button type=\"button\" title=\"Undo\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('undo')\"><i class='fa fa-undo'></i></button>\r\n <button type=\"button\" title=\"Redo\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('redo')\"><i class='fa fa-repeat'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'bold-'+id\" type=\"button\" title=\"Bold\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('bold')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-bold'></i></button>\r\n <button [id]=\"'italic-'+id\" type=\"button\" title=\"Italic\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('italic')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-italic'></i></button>\r\n <button [id]=\"'underline-'+id\" type=\"button\" title=\"Underline\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('underline')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-underline'></i></button>\r\n <button [id]=\"'strikeThrough-'+id\" type=\"button\" title=\"Strikethrough\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('strikeThrough')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-strikethrough'></i></button>\r\n <button [id]=\"'subscript-'+id\" type=\"button\" title=\"Subscript\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('subscript')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-subscript'></i></button>\r\n <button [id]=\"'superscript-'+id\" type=\"button\" title=\"Superscript\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('superscript')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-superscript'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'justifyLeft-'+id\" type=\"button\" title=\"Justify Left\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('justifyLeft')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-align-left'></i></button>\r\n <button [id]=\"'justifyCenter-'+id\" type=\"button\" title=\"Justify Center\" class=\"angular-editor-button\" (click)=\"triggerCommand('justifyCenter')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-align-center'></i></button>\r\n <button [id]=\"'justifyRight-'+id\" type=\"button\" title=\"Justify Right\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('justifyRight')\"\r\n [disabled]=\"htmlMode\">\r\n <i class='fa fa-align-right'></i></button>\r\n <button [id]=\"'justifyFull-'+id\" type=\"button\" title=\"Justify Full\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('justifyFull')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-align-justify'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'indent-'+id\" type=\"button\" title=\"Indent\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('indent')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-indent'></i></button>\r\n <button [id]=\"'outdent-'+id\" type=\"button\" title=\"Outdent\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('outdent')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-outdent'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'insertUnorderedList-'+id\" type=\"button\" title=\"Unordered List\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('insertUnorderedList')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-list-ul'></i></button>\r\n <button [id]=\"'insertOrderedList-'+id\" type=\"button\" title=\"Ordered List\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('insertOrderedList')\"\r\n [disabled]=\"htmlMode\"><i class='fa fa-list-ol'></i></button>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'heading-'+id\" class=\"block-label\"></label>\r\n <select title=\"Formatting\" [id]=\"'heading-'+id\" class=\"select-heading\" [(ngModel)]=\"block\" (change)=\"triggerCommand(block)\"\r\n [disabled]=\"htmlMode\">\r\n <optgroup label=\"Formatting\"></optgroup>\r\n <option class=\"h1\" value=\"h1\">Heading 1</option>\r\n <option class=\"h2\" value=\"h2\">Heading 2</option>\r\n <option class=\"h3\" value=\"h3\">Heading 3</option>\r\n <option class=\"h4\" value=\"h4\">Heading 4</option>\r\n <option class=\"h5\" value=\"h5\">Heading 5</option>\r\n <option class=\"h6\" value=\"h6\">Heading 6</option>\r\n <option class=\"p\" value=\"p\">Paragraph</option>\r\n <option class=\"pre\" value=\"pre\">Predefined</option>\r\n <option class=\"div\" value=\"div\">Standard</option>\r\n <option class=\"default\" value=\"default\">Default</option>\r\n </select>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'fontSelector-'+id\" class=\"block-label\"></label>\r\n <select title=\"Font Name\" [id]=\"'fontSelector-'+id\" class=\"select-font\" [(ngModel)]=\"fontName\" (change)=\"setFontName(fontName)\"\r\n [disabled]=\"htmlMode\">\r\n <optgroup label=\"Font Name\"></optgroup>\r\n <option class=\"arial\" value=\"Arial\">Arial</option>\r\n <option class=\"calibri\" value=\"Calibri\">Calibri</option>\r\n <option class=\"comic-sans-ms\" value=\"Comic Sans MS\">Comic Sans MS</option>\r\n <option class=\"times-new-roman\" value=\"Times New Roman\">Times New Roman</option>\r\n </select>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'fontSizeSelector-'+id\" class=\"block-label\"></label>\r\n <select title=\"Font Size\" [id]=\"'fontSizeSelector-'+id\" class=\"select-font-size\" [(ngModel)]=\"fontSize\" (change)=\"setFontSize(fontSize)\"\r\n [disabled]=\"htmlMode\">\r\n <optgroup label=\"Font Sizing\"></optgroup>\r\n <option class=\"size1\" value=\"1\">1</option>\r\n <option class=\"size2\" value=\"2\">2</option>\r\n <option class=\"size3\" value=\"3\">3</option>\r\n <option class=\"size4\" value=\"4\">4</option>\r\n <option class=\"size5\" value=\"5\">5</option>\r\n <option class=\"size6\" value=\"6\">6</option>\r\n <option class=\"size7\" value=\"7\">7</option>\r\n </select>\r\n </div>\r\n <div class=\"angular-editor-toolbar-set\">\r\n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(fgInput.value, 'textColor')\" #fgInput>\r\n <button [id]=\"'foregroundColorPicker-'+id\" type=\"button\" class=\"sws-xml-editor-button\" (click)=\"fgInput.click()\"\r\n title=\"Text Color\" [disabled]=\"htmlMode\"><span class=\"color-label foreground\"><i class=\"fa fa-font\"></i></span></button>\r\n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(bgInput.value, 'backgroundColor')\" #bgInput>\r\n <button [id]=\"'backgroundColorPicker-'+id\" type=\"button\" class=\"sws-xml-editor-button\" (click)=\"bgInput.click()\"\r\n title=\"Background Color\" [disabled]=\"htmlMode\"><span class=\"color-label background\"><i class=\"fa fa-font\"></i></span></button>\r\n </div>\r\n <div *ngIf=\"customClasses\" class=\"sws-xml-editor-toolbar-set\">\r\n <label [for]=\"'customClassSelector-'+id\" class=\"block-label\"></label>\r\n <select title=\"Custom Style\" [id]=\"'customClassSelector-'+id\" class=\"select-custom-style\" [(ngModel)]=\"customClassId\"\r\n (change)=\"setCustomClass(customClassId)\" [disabled]=\"htmlMode\">\r\n <optgroup label=\"Custom Class\"></optgroup>\r\n <option class=\"\" value=-1>Clear Class</option>\r\n <option *ngFor=\"let item of customClasses; let i = index\" [class]=\"item.class\" [value]=\"i\">{{item.name}}</option>\r\n </select>\r\n </div>\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'link-'+id\" type=\"button\" class=\"sws-xml-editor-button\" (click)=\"insertUrl()\" title=\"Insert Link\"\r\n [disabled]=\"htmlMode\">\r\n <i class=\"fa fa-link\"></i>\r\n </button>\r\n <button type=\"button\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('unlink')\" title=\"Unlink\" [disabled]=\"htmlMode\">\r\n <i class=\"fa fa-chain-broken\"></i>\r\n </button>\r\n <input style=\"display: none\" type=\"file\" (change)=\"onFileChanged($event)\" #fileInput>\r\n <button type=\"button\" class=\"sws-xml-editor-button\" (click)=\"fileInput.click()\" title=\"Insert Image\" [disabled]=\"htmlMode\"><i\r\n class=\"fa fa-image\"></i></button>\r\n\r\n <button type=\"button\" title=\"Horizontal Line\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('insertElement_STAR')\"\r\n [disabled]=\"htmlMode\"><i class=\"fa fa-minus\"></i> STAR</button>\r\n </div>\r\n -->\r\n\r\n\r\n\r\n <div class=\"sws-xml-editor-toolbar-set\" *ngFor=\"let group of elementGroups\">\r\n <label class=\"sws-editor-toolbar-grouplabel\" *ngIf=\"group.title\">{{ group.title }}:</label>\r\n <button *ngFor=\"let elem of group.elements\" type=\"button\" title=\"{{elem.title}}\" class=\"sws-xml-editor-button\"\r\n (click)=\"insertElement(elem)\">\r\n <span *ngIf=\"elem.iconClass\"><i class=\"{{elem.iconClass}}\"></i> </span>{{ elem.tagName }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button type=\"button\" title=\"remove tag\" class=\"sws-xml-editor-button\"><i class=\"fa fa-remove\"></i> remove</button>\r\n </div>\r\n\r\n <!--\r\n <div class=\"sws-xml-editor-toolbar-set\">\r\n <button [id]=\"'toggleEditorMode-'+id\" type=\"button\" title=\"HTML Code\" class=\"sws-xml-editor-button\" (click)=\"triggerCommand('toggleEditorMode')\"><i\r\n class='fa fa-code'></i></button>\r\n </div>\r\n -->\r\n</div>\r\n",
styles: [".sws-xml-editor-toolbar{display:inline-block}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set{border-radius:5px;background-color:#fff;margin-right:5px;margin-bottom:5px;border:1px solid #ddd;clear:both;float:left;display:block;position:relative}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set .sws-editor-toolbar-grouplabel{display:block;font-weight:700;background-color:transparent;float:left;padding:.5em .5em 0}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set .sws-xml-editor-button{border-radius:5px;background-color:transparent;margin:2px;padding:.6em;min-width:3em;float:left;border:.5px solid #eee}.sws-xml-editor-toolbar .sws-xml-editor-toolbar-set .sws-xml-editor-button:hover{cursor:pointer;background-color:#ff8c00;transition:.2s}"]
}] }
];
/** @nocollapse */
XmlEditorToolbarComponent.ctorParameters = function () { return [
{ type: AngularXmlEditorService }
]; };
XmlEditorToolbarComponent.propDecorators = {
config: [{ type: Input, args: ['config',] }],
editorContextId: [{ type: Input, args: ['editorContextId',] }]
};
return XmlEditorToolbarComponent;
}());
export { XmlEditorToolbarComponent };
if (false) {
/** @type {?} */
XmlEditorToolbarComponent.prototype.editorContext;
/** @type {?} */
XmlEditorToolbarComponent.prototype.elementGroups;
/** @type {?} */
XmlEditorToolbarComponent.prototype.actualCursorPosChangedSubscription;
/** @type {?} */
XmlEditorToolbarComponent.prototype.editorService;
}
/**
* @record
*/
export function ToolbarElementGroup() { }
/** @type {?} */
ToolbarElementGroup.prototype.title;
/** @type {?} */
ToolbarElementGroup.prototype.elements;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sLWVkaXRvci10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIteG1sLWVkaXRvci8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3htbC1lZGl0b3ItdG9vbGJhci94bWwtZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFtQyxLQUFLLEVBQXVDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUVqRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUkzRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOENBQThDLENBQUM7O0lBdUN0RSxtQ0FBb0IsYUFBc0M7UUFBdEMsa0JBQWEsR0FBYixhQUFhLENBQXlCOzZCQVZuQixFQUFFO0tBVXFCO0lBN0I5RCxzQkFDSSw2Q0FBTTs7OztRQURWO1lBRUUsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQy9FLE9BQU8sSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQzthQUN4RDtZQUNELE9BQU8sU0FBUyxDQUFDO1NBQ2xCOzs7T0FBQTtJQUVELHNCQUNJLHNEQUFlOzs7OztRQURuQixVQUNvQixLQUFhO1lBRGpDLGlCQVNDO1lBUEMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDVixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUks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QUM7U0FDMUIsQ0FBQzthQUNELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQzthQUMxQixNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQXZCLENBQXVCLENBQUMsQ0FBQztLQUN6Qzs7Z0JBaEZGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsczFUQUFrRDs7aUJBRW5EOzs7O2dCQVZRLHVCQUF1Qjs7O3lCQWM3QixLQUFLLFNBQUMsUUFBUTtrQ0FRZCxLQUFLLFNBQUMsaUJBQWlCOztvQ0ExQjFCOztTQWVhLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFJlbmRlcmVyMiwgSW5wdXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFhtbFJ1bGVFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29kZS94bWwtcnVsZXMtY2hlY2sveG1sUnVsZUVsZW1lbnQuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxDdXJzb3JQb3MgfSBmcm9tICcuLi8uLi9jb2RlL2N1cnNvci94bWxDdXJzb3JQb3MuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxFZGl0UnVsZUNoZWNrRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb2RlL3htbC1ydWxlcy1jaGVjay94bWxFZGl0UnVsZUNoZWNrRWxlbWVudHMuY2xhc3MnO1xyXG5pbXBvcnQgeyBBbmd1bGFyWG1sRWRpdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2FuZ3VsYXIteG1sLWVkaXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFhtbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi8uLi9jb2RlL3htbEVkaXRvckNvbnRleHQuY2xhc3MnO1xyXG5pbXBvcnQgeyBYbWxFZGl0b3JDb25maWcgfSBmcm9tICcuLi8uLi9jb2RlL3htbEVkaXRvckNvbmZpZyc7XHJcbmltcG9ydCB7IFhtbDJodG1sIH0gZnJvbSAnLi4vLi4vY29kZS94bWwtaHRtbC1jb252ZXJ0ZXIveG1sMmh0bWwuY2xhc3MnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdheGVkLXRvb2xiYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi94bWwtZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3htbC1lZGl0b3ItdG9vbGJhci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBYbWxFZGl0b3JUb29sYmFyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZWRpdG9yQ29udGV4dDogWG1sRWRpdG9yQ29udGV4dDtcclxuXHJcbiAgQElucHV0KCdjb25maWcnKVxyXG4gIGdldCBjb25maWcoKTogWG1sRWRpdG9yQ29uZmlnIHtcclxuICAgIGlmICh0aGlzLmVkaXRvckNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmVkaXRvckNvbnRleHQuY29uZmlnICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yQ29udGV4dCAmJiB0aGlzLmVkaXRvckNvbnRleHQuY29uZmlnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgnZWRpdG9yQ29udGV4dElkJylcclxuICBzZXQgZWRpdG9yQ29udGV4dElkKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lZGl0b3JDb250ZXh0ID0gdGhpcy5lZGl0b3JTZXJ2aWNlLmdldEVkaXRvckNvbnRleHQodmFsdWUpO1xyXG4gICAgdGhpcy5hY3R1YWxDdXJzb3JQb3NDaGFuZ2VkU3Vic2NyaXB0aW9uID0gdGhpcy5lZGl0b3JDb250ZXh0LmFjdHVhbEN1cnNvckNoYW5nZWQuc3Vic2NyaWJlKHBvcyA9PiB7XHJcbiAgICAgIHRoaXMuZWxlbWVudEdyb3VwcyA9IHRoaXMuR2V0RWxlbWVudEdyb3Vwc0ZvckN1cnNvclBvcyhwb3MuU3RhcnRQb3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBlbGVtZW50R3JvdXBzOiBUb29sYmFyRWxlbWVudEdyb3VwW10gPSBbXTtcclxuXHJcbiAgYWN0dWFsQ3Vyc29yUG9zQ2hhbmdlZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKiogaW5zZXJ0cyBhbiBlbGVtZW50IGF0IHRoZSBhY3R1YWwgY3Vyc29yIHBvcyAqL1xyXG4gIGluc2VydEVsZW1lbnQoZWxlbWVudDogWG1sUnVsZUVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGh0bWwgPSBuZXcgWG1sMmh0bWwodGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZy5ydWxlcykuY3JlYXRlTmV3RWxlbWVudEh0bWwoZWxlbWVudCk7XHJcbiAgICB0aGlzLmVkaXRvckNvbnRleHQuZG9tSW5zZXJ0SHRtbChodG1sKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWRpdG9yU2VydmljZTogQW5ndWxhclhtbEVkaXRvclNlcnZpY2UpIHt9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHt9XHJcbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0dWFsQ3Vyc29yUG9zQ2hhbmdlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgR2V0RWxlbWVudEdyb3Vwc0ZvckN1cnNvclBvcyhwb3M6IFhtbEN1cnNvclBvcyk6IFRvb2xiYXJFbGVtZW50R3JvdXBbXSB7XHJcbiAgICBjb25zdCBhbGxvd2VkRWxlbWVudHMgPSBuZXcgWG1sRWRpdFJ1bGVDaGVja0VsZW1lbnRzKHRoaXMuZWRpdG9yQ29udGV4dC5jb25maWcueG1sU2NoZW1hLnhzZE5vZGVzKS5FbGVtZW50c0FsbG93ZWRBdFRoaXNDdXJzb3JQb3MocG9zKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5HZXRBbGxFbGVtZW50R3JvdXBzKClcclxuICAgICAgLm1hcChnID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGl0bGU6IGcudGl0bGUsXHJcbiAgICAgICAgICBlbGVtZW50czogZy5lbGVtZW50cy5maWx0ZXIoZSA9PiBhbGxvd2VkRWxlbWVudHMuaW5jbHVkZXMoZS50YWdOYW1lKSlcclxuICAgICAgICB9IGFzIFRvb2xiYXJFbGVtZW50R3JvdXA7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoZyA9PiBnLmVsZW1lbnRzLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgR2V0QWxsRWxlbWVudEdyb3VwcygpOiBUb29sYmFyRWxlbWVudEdyb3VwW10ge1xyXG4gICAgY29uc3QgdW51c2VkRWxlbWVudHMgPSBYbWxSdWxlRWxlbWVudC5Tb3J0ZWQoXHJcbiAgICAgIEFycmF5LmZyb20odGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZy5ydWxlcy5ydWxlRWxlbWVudHMudmFsdWVzKCkpLmZpbHRlcihlbGVtID0+XHJcbiAgICAgICAgdGhpcy5lZGl0b3JDb250ZXh0LmNvbmZpZy5lbGVtZW50R3JvdXBzLnNvbWUoZ3JvdXAgPT4gIWdyb3VwLmVsZW1lbnROYW1lcy5pbmNsdWRlcyhlbGVtLnRhZ05hbWUpKVxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IG90aGVyRWxlbWVudHNHcm91cCA9IHtcclxuICAgICAgdGl0bGU6ICdvdGhlcicsXHJcbiAgICAgIGVsZW1lbnRzOiB1bnVzZWRFbGVtZW50c1xyXG4gICAgfSBhcyBUb29sYmFyRWxlbWVudEdyb3VwO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmVkaXRvckNvbnRleHQuY29uZmlnLmVsZW1lbnRHcm91cHNcclxuICAgICAgLm1hcChnID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGl0bGU6IGcudGl0bGUsXHJcbiAgICAgICAgICBlbGVtZW50czogWG1sUnVsZUVsZW1lbnQuU29ydGVkKGcuZWxlbWVudE5hbWVzLm1hcChlbGVtZW50TmFtZSA9PiB0aGlzLmVkaXRvckNvbnRleHQuY29uZmlnLnJ1bGVzLnJ1bGVFbGVtZW50cy5nZXQoZWxlbWVudE5hbWUpKS5maWx0ZXIoZSA9PiBlICE9PSB1bmRlZmluZWQpKVxyXG4gICAgICAgIH0gYXMgVG9vbGJhckVsZW1lbnRHcm91cDtcclxuICAgICAgfSlcclxuICAgICAgLmNvbmNhdChvdGhlckVsZW1lbnRzR3JvdXApXHJcbiAgICAgIC5maWx0ZXIoZyA9PiBnLmVsZW1lbnRzLmxlbmd0aCAhPT0gMCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJFbGVtZW50R3JvdXAge1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZWxlbWVudHM6IFhtbFJ1bGVFbGVtZW50W107XHJcbn1cclxuIl19