UNPKG

rb-letter-avatar

Version:
313 lines (312 loc) 43 kB
import { Component, ElementRef, Input } from "@angular/core"; import { Attributes, LAmeta } from "./lameta"; var RbLetterAvatarComponent = /** @class */ (function () { function RbLetterAvatarComponent(el) { this._meta = new LAmeta(); this.attribute = new Attributes(); this.base = "data:image/svg+xml;base64,"; this.charCount = "1"; this.letteravatar = el.nativeElement; } RbLetterAvatarComponent.prototype.ngAfterViewInit = function () { if (!this.alphabetcolors) { this.alphabetcolors = this.getPropertyValue(this.attribute.alphabetcolors) ? this.getPropertyValue(this.attribute.alphabetcolors) : this._meta.defaultColors; } if (!this.textColor) { this.textColor = this.getPropertyValue(this.attribute.textColor) ? this.getPropertyValue(this.attribute.textColor) : this._meta.defaultTextColor; } if (!this.avatarcustombgcolor) { this.avatarcustombgcolor = this.getPropertyValue(this.attribute.avatarcustombgcolor); } if (!this.avatarborder) { this.avatarborder = this.getPropertyValue(this.attribute.avatarborder) ? this.getPropertyValue(this.attribute.avatarborder) : this._meta.defaultAvatarborder; } if (!this.defaultBorder) { this.defaultBorder = this.getPropertyValue(this.attribute.defaultBorder) ? this.getPropertyValue(this.attribute.defaultBorder) : this._meta.defaultBorder; } if (!this.triangleup) { this.triangleup = this.getPropertyValue(this.attribute.triangleup) ? this.getPropertyValue(this.attribute.triangleup) : this._meta.defaultTriangleup; } if (!this.fontsize) { this.fontsize = this.getPropertyValue(this.attribute.fontsize) ? this.getPropertyValue(this.attribute.fontsize) : this._meta.deafultFontsize; } if (!this.height) { this.height = this.getPropertyValue(this.attribute.height) ? this.getPropertyValue(this.attribute.height) : this._meta.defaultHeight; } if (!this.width) { this.width = this.getPropertyValue(this.attribute.width) ? this.getPropertyValue(this.attribute.width) : this._meta.deafultWidth; } if (!this.radius) { this.radius = this.getPropertyValue(this.attribute.radius) ? this.getPropertyValue(this.attribute.radius) : this._meta.defaultRadius; } if (!this.dynamic) { this.dynamic = this.getPropertyValue(this.attribute.dynamic) ? this.getPropertyValue(this.attribute.dynamic) : false; } if (!this.rotatedeg) { this.rotatedeg = this.getPropertyValue(this.attribute.rotatedeg) ? this.getPropertyValue(this.attribute.rotatedeg) : this._meta.defaultRotatedeg; } if (!this.fontWeight) { this.fontWeight = this.getPropertyValue(this.attribute.fontWeight) ? this.getPropertyValue(this.attribute.fontWeight) : this._meta.defaultFontWeight; } if (!this.fontFamily) { this.fontFamily = this.getPropertyValue(this.attribute.fontFamily) ? this.getPropertyValue(this.attribute.fontFamily) : this._meta.defaultFontFamily; } if (!this.shape) { this.shape = this.getPropertyValue(this.attribute.shape); } if (!this.data) { this.data = this.getPropertyValue(this.attribute.data); } this.createAvatar(); }; RbLetterAvatarComponent.prototype.getPropertyValue = function (property) { var result = ""; result = this.letteravatar.getAttribute(property); return result; }; RbLetterAvatarComponent.prototype.createAvatar = function () { var c = ""; if (this.charCount === "2") { var _data = this.getFirstAndLastName(this.data.toUpperCase()); if (_data) { c = _data; } else { c = this.data.substring(0, +this.charCount).toUpperCase(); } } else { c = this.data.substring(0, +this.charCount).toUpperCase(); } var textTag = this.getCharacterTextTag(c, this.textColor, this.fontFamily, this.fontWeight, this.fontsize); var colorIndex; var color = ""; /** * Populate the colors according to attributes */ if (c.charCodeAt(0) < 65) { color = this.getRandomColors(); } else { colorIndex = Math.floor((c.charCodeAt(0) - 65) % this.alphabetcolors.length); color = this.alphabetcolors[colorIndex]; } if (this.avatarcustombgcolor) { color = this.avatarcustombgcolor; } this.createSvg(this.width, this.height, color, textTag); var lvcomponent = this.getLVText(); var svgHtml = window.btoa(unescape(encodeURIComponent(lvcomponent))); var component; var base = this.base; var _style = ""; if (this.avatarBorderStyle) { _style = this.avatarBorderStyle; } else if (this.avatarborder === "true") { _style = this.defaultBorder; } if (this.rotatedeg !== "0") { // tslint:disable-next-line:max-line-length _style = "-ms-transform: rotate(" + this.rotatedeg + "deg); -webkit-transform: rotate(" + this.rotatedeg + "deg); transform: rotate(" + this.rotatedeg + "deg)"; } if (this.shape) { if (this.shape === "round") { var round_style = this.radius + _style; if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) { var img_size = "width:" + this.width + "px;height:" + this.height + "px;"; component = "<img src=" + this.data + " style='" + img_size + round_style + "' />"; } else { component = "<img src=" + base + svgHtml + " style='" + round_style + "' title='" + this.data + "' />"; } } } else { if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) { var img_size = "width:" + this.width + "px;height:" + this.height + "px;"; component = "<img src=" + this.data + " style='" + img_size + _style + "' />"; } else { component = "<img src=" + base + svgHtml + " style='" + _style + "' title='" + this.data + "' />"; } } this.letteravatar.innerHTML = component; }; RbLetterAvatarComponent.prototype.getLVText = function () { var lvTag = document.createElement("div"); lvTag.appendChild(this.imageTag.cloneNode()); return this.imageTag.outerHTML; }; /** * Populate the svg tag which will used for the avatar generation * @param width * @param height * @param color * @returns */ /** * Populate the svg tag which will used for the avatar generation * @param width * @param height * @param color * @returns */ RbLetterAvatarComponent.prototype.createSvg = /** * Populate the svg tag which will used for the avatar generation * @param width * @param height * @param color * @returns */ function (width, height, color, cobj) { var svgTag = document.createElement("svg"); svgTag.setAttribute("xmlns", "http://www.w3.org/2000/svg"); svgTag.setAttribute("pointer-events", "none"); svgTag.setAttribute("width", width); svgTag.setAttribute("height", height); svgTag.setAttribute("style", "background-color:" + color + ";width:" + width + "px" + ";height:" + height + "px"); svgTag.appendChild(cobj); this.imageTag = svgTag; return svgTag.innerHTML; }; /** * Generate the Letter tag by using the svg text element * @param character * @param textColor * @param fontFamily * @param fontWeight * @param fontsize * @returns */ // tslint:disable-next-line:max-line-length /** * Generate the Letter tag by using the svg text element * @param character * @param textColor * @param fontFamily * @param fontWeight * @param fontsize * @returns */ // tslint:disable-next-line:max-line-length RbLetterAvatarComponent.prototype.getCharacterTextTag = /** * Generate the Letter tag by using the svg text element * @param character * @param textColor * @param fontFamily * @param fontWeight * @param fontsize * @returns */ // tslint:disable-next-line:max-line-length function (character, textColor, fontFamily, fontWeight, fontsize) { var textTag = document.createElement("text"); textTag.setAttribute("text-anchor", "middle"); textTag.setAttribute("x", "50%"); textTag.setAttribute("y", "50%"); textTag.setAttribute("dy", "0.35em"); textTag.setAttribute("pointer-events", "auto"); textTag.setAttribute("fill", textColor); textTag.setAttribute("font-family", fontFamily); textTag.setAttribute("style", "font-weight:" + fontWeight + ";font-size:" + fontsize + "px"); textTag.innerText = character; return textTag; }; /** * Get the random colors * @returns */ /** * Get the random colors * @returns */ RbLetterAvatarComponent.prototype.getRandomColors = /** * Get the random colors * @returns */ function () { var letters = "0123456789ABCDEF".split(""); var _color = "#"; for (var i = 0; i < 6; i++) { _color += letters[Math.floor(Math.random() * 16)]; } return _color; }; /** * get the first name and last name first letters and combined and form the letter avatar * @param data * @returns */ /** * get the first name and last name first letters and combined and form the letter avatar * @param data * @returns */ RbLetterAvatarComponent.prototype.getFirstAndLastName = /** * get the first name and last name first letters and combined and form the letter avatar * @param data * @returns */ function (data) { var names = data.split(" "); if (names && names.length >= 2) { var firstName = names[0]; var lastName = names[1]; if (firstName && lastName) { var text = firstName.substr(0, 1) + lastName.substr(0, 1); return text; } else { return data.substr(0, 2); } } }; RbLetterAvatarComponent.decorators = [ { type: Component, args: [{ selector: "rb-letter-avatar", template: "<ng-content></ng-content>" },] }, ]; /** @nocollapse */ RbLetterAvatarComponent.ctorParameters = function () { return [ { type: ElementRef, }, ]; }; RbLetterAvatarComponent.propDecorators = { "alphabetcolors": [{ type: Input, args: ["avatar-alphabet-colors",] },], "textColor": [{ type: Input, args: ["avatar-text-color",] },], "defaultBorder": [{ type: Input, args: ["avatar-default-border",] },], "triangleup": [{ type: Input, args: ["avatar-triangle-up",] },], "fontsize": [{ type: Input, args: ["avatar-font-size",] },], "height": [{ type: Input, args: ["avatar-height",] },], "width": [{ type: Input, args: ["avatar-width",] },], "fontWeight": [{ type: Input, args: ["avatar-font-weight",] },], "fontFamily": [{ type: Input, args: ["avatar-font-family",] },], "radius": [{ type: Input, args: ["avatar-radius",] },], "dynamic": [{ type: Input, args: ["avatar-dynamic",] },], "rotatedeg": [{ type: Input, args: ["avatar-rotate-degree",] },], "charCount": [{ type: Input, args: ["avatar-char-count",] },], "data": [{ type: Input, args: ["avatar-data",] },], "avatarBorderStyle": [{ type: Input, args: ["avatar-border-style",] },], "avatarborder": [{ type: Input, args: ["avatar-border",] },], "avatarcustomborder": [{ type: Input, args: ["avatar-custom-border",] },], "shape": [{ type: Input, args: ["avatar-shape",] },], "avatarcustombgcolor": [{ type: Input, args: ["avatar-custom-bg-color",] },], }; return RbLetterAvatarComponent; }()); export { RbLetterAvatarComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmItbGV0dGVyLWF2YXRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9yYi1sZXR0ZXItYXZhdGFyLyIsInNvdXJjZXMiOlsibGV0dGVyLWF2YXRhci9yYi1sZXR0ZXItYXZhdGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBaUIsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDOztJQW1DMUMsaUNBQVksRUFBYztxQkF4QkYsSUFBSSxNQUFNLEVBQUU7eUJBQ0osSUFBSSxVQUFVLEVBQUU7b0JBV2pDLDRCQUE0Qjt5QkFJSyxHQUFHO1FBUy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztLQUN4QztJQUVELGlEQUFlLEdBQWY7UUFDSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1NBQ3ZGO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQ3JGO1FBQ0QsRUFBRSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3hGO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO1NBQzNGO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztTQUN0RjtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztTQUN2RjtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7U0FDbkY7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7U0FDL0U7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDN0U7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7U0FDL0U7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUM3RDtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztTQUNyRjtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztTQUN2RjtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztTQUN2RjtRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUQ7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7S0FDdkI7SUFDTyxrREFBZ0IsR0FBeEIsVUFBeUIsUUFBZ0I7UUFDckMsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDO0tBQ2pCO0lBRU8sOENBQVksR0FBcEI7UUFDSSxJQUFJLENBQUMsR0FBVyxFQUFFLENBQUM7UUFDbkIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxHQUFXLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDdEUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDUixDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ2I7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzdEO1NBQ0o7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0Q7UUFDRCxJQUFJLE9BQU8sR0FBZ0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEgsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLElBQUksS0FBSyxHQUFXLEVBQUUsQ0FBQzs7OztRQUt2QixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNsQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0UsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0M7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQzNCLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7U0FDcEM7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsSUFBSSxXQUFXLEdBQVUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksT0FBTyxHQUFXLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxJQUFJLEdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM3QixJQUFJLE1BQU0sR0FBVyxFQUFFLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1NBQ25DO1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQSxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUMvQjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzs7WUFFekIsTUFBTSxHQUFHLHdCQUF3QixHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsa0NBQWtDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRywwQkFBMEIsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztTQUNuSztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLFdBQVcsR0FBVyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDL0MsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6RSxJQUFJLFFBQVEsR0FBVyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ2xGLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLEdBQUcsUUFBUSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUM7aUJBQ3ZGO2dCQUFDLElBQUksQ0FBQyxDQUFDO29CQUNKLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxHQUFHLE9BQU8sR0FBRyxVQUFVLEdBQUcsV0FBVyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztpQkFDMUc7YUFDSjtTQUNKO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksUUFBUSxHQUFXLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDbEYsU0FBUyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxRQUFRLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQzthQUNsRjtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNKLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxHQUFHLE9BQU8sR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQzthQUNyRztTQUNKO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0tBRTNDO0lBRU8sMkNBQVMsR0FBakI7UUFDSSxJQUFJLEtBQUssR0FBZ0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7S0FDbEM7SUFFRDs7Ozs7O09BTUc7Ozs7Ozs7O0lBQ0ssMkNBQVM7Ozs7Ozs7SUFBakIsVUFBa0IsS0FBYSxFQUFFLE1BQWMsRUFBRSxLQUFhLEVBQUUsSUFBaUI7UUFFN0UsSUFBSSxNQUFNLEdBQWdCLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLG1CQUFtQixHQUFHLEtBQUssR0FBRyxTQUFTLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xILE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFFdkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7S0FDM0I7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILDJDQUEyQzs7Ozs7Ozs7Ozs7SUFDbkMscURBQW1COzs7Ozs7Ozs7O0lBQTNCLFVBQTRCLFNBQWdCLEVBQUUsU0FBaUIsRUFBRSxVQUFrQixFQUFFLFVBQWtCLEVBQUUsUUFBZ0I7UUFDckgsSUFBSSxPQUFPLEdBQWdCLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxjQUFjLEdBQUcsVUFBVSxHQUFHLGFBQWEsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0YsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQztLQUNsQjtJQUVEOzs7T0FHRzs7Ozs7SUFDSyxpREFBZTs7OztJQUF2QjtRQUNJLElBQUksT0FBTyxHQUFhLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLE1BQU0sR0FBVyxHQUFHLENBQUM7UUFDekIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0tBQ2pCO0lBRUQ7Ozs7T0FJRzs7Ozs7O0lBQ0sscURBQW1COzs7OztJQUEzQixVQUE0QixJQUFZO1FBQ3BDLElBQUksS0FBSyxHQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLFNBQVMsR0FBVyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxRQUFRLEdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLElBQUksR0FBVyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsTUFBTSxDQUFDLElBQUksQ0FBQzthQUNmO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzVCO1NBQ0o7S0FDSjs7Z0JBbFFKLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUUsMkJBQTJCO2lCQUN4Qzs7OztnQkFUbUIsVUFBVTs7O21DQWdCekIsS0FBSyxTQUFDLHdCQUF3Qjs4QkFDOUIsS0FBSyxTQUFDLG1CQUFtQjtrQ0FDekIsS0FBSyxTQUFDLHVCQUF1QjsrQkFDN0IsS0FBSyxTQUFDLG9CQUFvQjs2QkFDMUIsS0FBSyxTQUFDLGtCQUFrQjsyQkFDeEIsS0FBSyxTQUFDLGVBQWU7MEJBQ3JCLEtBQUssU0FBQyxjQUFjOytCQUNwQixLQUFLLFNBQUMsb0JBQW9COytCQUMxQixLQUFLLFNBQUMsb0JBQW9COzJCQUUxQixLQUFLLFNBQUMsZUFBZTs0QkFDckIsS0FBSyxTQUFDLGdCQUFnQjs4QkFDdEIsS0FBSyxTQUFDLHNCQUFzQjs4QkFDNUIsS0FBSyxTQUFDLG1CQUFtQjt5QkFDekIsS0FBSyxTQUFDLGFBQWE7c0NBQ25CLEtBQUssU0FBQyxxQkFBcUI7aUNBQzNCLEtBQUssU0FBQyxlQUFlO3VDQUNyQixLQUFLLFNBQUMsc0JBQXNCOzBCQUM1QixLQUFLLFNBQUMsY0FBYzt3Q0FDcEIsS0FBSyxTQUFDLHdCQUF3Qjs7a0NBbkNuQzs7U0FVYSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIExBbWV0YSB9IGZyb20gXCIuL2xhbWV0YVwiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiB1bmVzY2FwZSh4OiBzdHJpbmcpOiBzdHJpbmc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcInJiLWxldHRlci1hdmF0YXJcIixcclxuICAgIHRlbXBsYXRlOiBcIjxuZy1jb250ZW50PjwvbmctY29udGVudD5cIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmJMZXR0ZXJBdmF0YXJDb21wb25lbnQgIHtcclxuICAgIHByaXZhdGUgbGV0dGVyYXZhdGFyOiBhbnk7XHJcbiAgICBwcml2YXRlIGltYWdlVGFnOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX21ldGE6IExBbWV0YSA9IG5ldyBMQW1ldGEoKTtcclxuICAgIHByaXZhdGUgYXR0cmlidXRlOiBBdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICBASW5wdXQoXCJhdmF0YXItYWxwaGFiZXQtY29sb3JzXCIpIGFscGhhYmV0Y29sb3JzOiBzdHJpbmdbXTtcclxuICAgIEBJbnB1dChcImF2YXRhci10ZXh0LWNvbG9yXCIpIHRleHRDb2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWRlZmF1bHQtYm9yZGVyXCIpIGRlZmF1bHRCb3JkZXI6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci10cmlhbmdsZS11cFwiKSB0cmlhbmdsZXVwOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC1zaXplXCIpIGZvbnRzaXplOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItaGVpZ2h0XCIpIGhlaWdodDogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXdpZHRoXCIpIHdpZHRoOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC13ZWlnaHRcIikgZm9udFdlaWdodDogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWZvbnQtZmFtaWx5XCIpIGZvbnRGYW1pbHk6IHN0cmluZztcclxuICAgIGJhc2U6IHN0cmluZyA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxcIjtcclxuICAgIEBJbnB1dChcImF2YXRhci1yYWRpdXNcIikgcmFkaXVzOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZHluYW1pY1wiKSBkeW5hbWljOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItcm90YXRlLWRlZ3JlZVwiKSByb3RhdGVkZWc6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1jaGFyLWNvdW50XCIpIGNoYXJDb3VudDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZGF0YVwiKSBkYXRhOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItYm9yZGVyLXN0eWxlXCIpIGF2YXRhckJvcmRlclN0eWxlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItYm9yZGVyXCIpIGF2YXRhcmJvcmRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWN1c3RvbS1ib3JkZXJcIikgYXZhdGFyY3VzdG9tYm9yZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItc2hhcGVcIikgc2hhcGU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1jdXN0b20tYmctY29sb3JcIikgYXZhdGFyY3VzdG9tYmdjb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgdGhpcy5sZXR0ZXJhdmF0YXIgPSBlbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWxwaGFiZXRjb2xvcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5hbHBoYWJldGNvbG9ycyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hbHBoYWJldGNvbG9ycykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmFscGhhYmV0Y29sb3JzKSA6IHRoaXMuX21ldGEuZGVmYXVsdENvbG9ycztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRleHRDb2xvcikge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50ZXh0Q29sb3IpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50ZXh0Q29sb3IpIDogdGhpcy5fbWV0YS5kZWZhdWx0VGV4dENvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJjdXN0b21iZ2NvbG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hdmF0YXJib3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmF0YXJib3JkZXIgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYXZhdGFyYm9yZGVyKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYXZhdGFyYm9yZGVyKSA6IHRoaXMuX21ldGEuZGVmYXVsdEF2YXRhcmJvcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kZWZhdWx0Qm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJvcmRlciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kZWZhdWx0Qm9yZGVyKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZGVmYXVsdEJvcmRlcikgOiB0aGlzLl9tZXRhLmRlZmF1bHRCb3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy50cmlhbmdsZXVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJpYW5nbGV1cCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50cmlhbmdsZXVwKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUudHJpYW5nbGV1cCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRUcmlhbmdsZXVwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZm9udHNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb250c2l6ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250c2l6ZSkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRzaXplKSA6IHRoaXMuX21ldGEuZGVhZnVsdEZvbnRzaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmhlaWdodCkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmhlaWdodCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy53aWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLndpZHRoKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUud2lkdGgpIDogdGhpcy5fbWV0YS5kZWFmdWx0V2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5yYWRpdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucmFkaXVzKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucmFkaXVzKSA6IHRoaXMuX21ldGEuZGVmYXVsdFJhZGl1cztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWMpIHtcclxuICAgICAgICAgICAgdGhpcy5keW5hbWljID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmR5bmFtaWMpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5keW5hbWljKSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMucm90YXRlZGVnKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm90YXRlZGVnID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnJvdGF0ZWRlZykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnJvdGF0ZWRlZykgOiB0aGlzLl9tZXRhLmRlZmF1bHRSb3RhdGVkZWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250V2VpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFdlaWdodCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250V2VpZ2h0KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udFdlaWdodCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRGb250V2VpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZm9udEZhbWlseSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udEZhbWlseSkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRGYW1pbHkpIDogdGhpcy5fbWV0YS5kZWZhdWx0Rm9udEZhbWlseTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnNoYXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcGUgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuc2hhcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlQXZhdGFyKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0gXCJcIjtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLmxldHRlcmF2YXRhci5nZXRBdHRyaWJ1dGUocHJvcGVydHkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVBdmF0YXIoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhckNvdW50ID09PSBcIjJcIikge1xyXG4gICAgICAgICAgICBsZXQgX2RhdGE6IHN0cmluZyA9IHRoaXMuZ2V0Rmlyc3RBbmRMYXN0TmFtZSh0aGlzLmRhdGEudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYyA9IF9kYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYyA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCwgK3RoaXMuY2hhckNvdW50KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYyA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCwgK3RoaXMuY2hhckNvdW50KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdGV4dFRhZzogSFRNTEVsZW1lbnQgPSB0aGlzLmdldENoYXJhY3RlclRleHRUYWcoYywgdGhpcy50ZXh0Q29sb3IsIHRoaXMuZm9udEZhbWlseSwgdGhpcy5mb250V2VpZ2h0LCB0aGlzLmZvbnRzaXplKTtcclxuICAgICAgICBsZXQgY29sb3JJbmRleDogbnVtYmVyO1xyXG4gICAgICAgIGxldCBjb2xvcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUG9wdWxhdGUgdGhlIGNvbG9ycyBhY2NvcmRpbmcgdG8gYXR0cmlidXRlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChjLmNoYXJDb2RlQXQoMCkgPCA2NSkge1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuZ2V0UmFuZG9tQ29sb3JzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29sb3JJbmRleCA9IE1hdGguZmxvb3IoKGMuY2hhckNvZGVBdCgwKSAtIDY1KSAlIHRoaXMuYWxwaGFiZXRjb2xvcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgY29sb3IgPSB0aGlzLmFscGhhYmV0Y29sb3JzW2NvbG9ySW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvcikge1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBjb2xvciwgdGV4dFRhZyk7XHJcbiAgICAgICAgbGV0IGx2Y29tcG9uZW50OnN0cmluZyA9IHRoaXMuZ2V0TFZUZXh0KCk7XHJcbiAgICAgICAgbGV0IHN2Z0h0bWw6IHN0cmluZyA9IHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChsdmNvbXBvbmVudCkpKTtcclxuICAgICAgICBsZXQgY29tcG9uZW50OiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IGJhc2U6IHN0cmluZyA9IHRoaXMuYmFzZTtcclxuICAgICAgICBsZXQgX3N0eWxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0aGlzLmF2YXRhckJvcmRlclN0eWxlKSB7XHJcbiAgICAgICAgICAgIF9zdHlsZSA9IHRoaXMuYXZhdGFyQm9yZGVyU3R5bGU7XHJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuYXZhdGFyYm9yZGVyID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBfc3R5bGUgPSB0aGlzLmRlZmF1bHRCb3JkZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb3RhdGVkZWcgIT09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgX3N0eWxlID0gXCItbXMtdHJhbnNmb3JtOiByb3RhdGUoXCIgKyB0aGlzLnJvdGF0ZWRlZyArIFwiZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaGFwZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gXCJyb3VuZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm91bmRfc3R5bGU6IHN0cmluZyA9IHRoaXMucmFkaXVzICsgX3N0eWxlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbmRleE9mKFwiaHR0cFwiKSA+IC0xIHx8IHRoaXMuZGF0YS5pbmRleE9mKFwiZGF0YTppbWFnZVwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltZ19zaXplOiBzdHJpbmcgPSBcIndpZHRoOlwiICsgdGhpcy53aWR0aCArIFwicHg7aGVpZ2h0OlwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFwiPGltZyBzcmM9XCIgKyB0aGlzLmRhdGEgKyBcIiBzdHlsZT0nXCIgKyBpbWdfc2l6ZSArIHJvdW5kX3N0eWxlICsgXCInICAvPlwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgYmFzZSArIHN2Z0h0bWwgKyBcIiBzdHlsZT0nXCIgKyByb3VuZF9zdHlsZSArIFwiJyB0aXRsZT0nXCIgKyB0aGlzLmRhdGEgKyBcIicgLz5cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5kZXhPZihcImh0dHBcIikgPiAtMSB8fCB0aGlzLmRhdGEuaW5kZXhPZihcImRhdGE6aW1hZ2VcIikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGltZ19zaXplOiBzdHJpbmcgPSBcIndpZHRoOlwiICsgdGhpcy53aWR0aCArIFwicHg7aGVpZ2h0OlwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIHRoaXMuZGF0YSArIFwiIHN0eWxlPSdcIiArIGltZ19zaXplICsgX3N0eWxlICsgXCInICAvPlwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIGJhc2UgKyBzdmdIdG1sICsgXCIgc3R5bGU9J1wiICsgX3N0eWxlICsgXCInIHRpdGxlPSdcIiArIHRoaXMuZGF0YSArIFwiJyAvPlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxldHRlcmF2YXRhci5pbm5lckhUTUwgPSBjb21wb25lbnQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TFZUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGx2VGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgbHZUYWcuYXBwZW5kQ2hpbGQodGhpcy5pbWFnZVRhZy5jbG9uZU5vZGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VUYWcub3V0ZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUG9wdWxhdGUgdGhlIHN2ZyB0YWcgd2hpY2ggd2lsbCB1c2VkIGZvciB0aGUgYXZhdGFyIGdlbmVyYXRpb25cclxuICAgICAqIEBwYXJhbSB3aWR0aFxyXG4gICAgICogQHBhcmFtIGhlaWdodFxyXG4gICAgICogQHBhcmFtIGNvbG9yXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN2Zyh3aWR0aDogc3RyaW5nLCBoZWlnaHQ6IHN0cmluZywgY29sb3I6IHN0cmluZywgY29iajogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xyXG5cclxuICAgICAgICBsZXQgc3ZnVGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIik7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIik7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgd2lkdGgpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaGVpZ2h0KTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJiYWNrZ3JvdW5kLWNvbG9yOlwiICsgY29sb3IgKyBcIjt3aWR0aDpcIiArIHdpZHRoICsgXCJweFwiICsgXCI7aGVpZ2h0OlwiICsgaGVpZ2h0ICsgXCJweFwiKTtcclxuICAgICAgICBzdmdUYWcuYXBwZW5kQ2hpbGQoY29iaik7XHJcbiAgICAgICAgdGhpcy5pbWFnZVRhZyA9IHN2Z1RhZztcclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z1RhZy5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgR2VuZXJhdGUgdGhlIExldHRlciB0YWcgYnkgdXNpbmcgdGhlIHN2ZyB0ZXh0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXJcclxuICAgICAqIEBwYXJhbSB0ZXh0Q29sb3JcclxuICAgICAqIEBwYXJhbSBmb250RmFtaWx5XHJcbiAgICAgKiBAcGFyYW0gZm9udFdlaWdodFxyXG4gICAgICogQHBhcmFtIGZvbnRzaXplXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwcml2YXRlIGdldENoYXJhY3RlclRleHRUYWcoY2hhcmFjdGVyOnN0cmluZywgdGV4dENvbG9yOiBzdHJpbmcsIGZvbnRGYW1pbHk6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nLCBmb250c2l6ZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGxldCB0ZXh0VGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiNTAlXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwieVwiLCBcIjUwJVwiKTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcImR5XCIsIFwiMC4zNWVtXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwicG9pbnRlci1ldmVudHNcIiwgXCJhdXRvXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0ZXh0Q29sb3IpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZm9udEZhbWlseSk7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImZvbnQtd2VpZ2h0OlwiICsgZm9udFdlaWdodCArIFwiO2ZvbnQtc2l6ZTpcIiArIGZvbnRzaXplICsgXCJweFwiKTtcclxuICAgICAgICB0ZXh0VGFnLmlubmVyVGV4dCA9IGNoYXJhY3RlcjtcclxuICAgICAgICByZXR1cm4gdGV4dFRhZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcmFuZG9tIGNvbG9yc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRSYW5kb21Db2xvcnMoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbGV0dGVyczogc3RyaW5nW10gPSBcIjAxMjM0NTY3ODlBQkNERUZcIi5zcGxpdChcIlwiKTtcclxuICAgICAgICBsZXQgX2NvbG9yOiBzdHJpbmcgPSBcIiNcIjtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9jb2xvciArPSBsZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBnZXQgdGhlIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZSBmaXJzdCBsZXR0ZXJzIGFuZCBjb21iaW5lZCBhbmQgZm9ybSB0aGUgbGV0dGVyIGF2YXRhclxyXG4gICAgICogQHBhcmFtIGRhdGFcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Rmlyc3RBbmRMYXN0TmFtZShkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBkYXRhLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBpZiAobmFtZXMgJiYgbmFtZXMubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0TmFtZTogc3RyaW5nID0gbmFtZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBsYXN0TmFtZTogc3RyaW5nID0gbmFtZXNbMV07XHJcbiAgICAgICAgICAgIGlmIChmaXJzdE5hbWUgJiYgbGFzdE5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBmaXJzdE5hbWUuc3Vic3RyKDAsIDEpICsgbGFzdE5hbWUuc3Vic3RyKDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5zdWJzdHIoMCwgMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=