UNPKG

rb-letter-avatar

Version:
317 lines (311 loc) 45.9 kB
import { Component, ElementRef, Input, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; class LAmeta { constructor() { this.defaultColors = ["#5A8770", "#B2B7BB", "#6FA9AB", "#F5AF29", "#0088B9", "#F18636", "#D93A37", "#A6B12E", "#5C9BBC", "#F5888D", "#9A89B5", "#407887", "#9A89B5", "#5A8770", "#D33F33", "#A2B01F", "#F0B126", "#0087BF", "#F18636", "#0087BF", "#B2B7BB", "#72ACAE", "#9C8AB4", "#5A8770", "#EEB424", "#407887"]; this.defaultTextColor = '#ffffff'; this.defaultBorder = 'border:5px solid white'; this.defaultTriangleup = 'width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid;'; this.deafultFontsize = '30'; this.defaultHeight = '50'; this.deafultWidth = '50'; this.defaultRadius = 'border-radius:50%;'; this.deafultDynamic = 'false'; this.defaultRotatedeg = '0'; this.defaultAvatarborder = 'false'; this.defaultFontWeight = '400'; this.defaultFontFamily = 'HelveticaNeue-Light,Helvetica Neue Light,Helvetica Neue,Helvetica, Arial,Lucida Grande, sans-serif'; } } class Attributes { constructor() { this.alphabetcolors = 'avatar-alphabet-colors'; this.textColor = 'avatar-text-color'; this.defaultBorder = 'avatar-default-border'; this.triangleup = 'avatar-triangle-up'; this.fontsize = 'avatar-font-size'; this.height = 'avatar-height'; this.width = 'avatar-width'; this.radius = 'avatar-radius'; this.avatarcustombgcolor = 'avatar-custom-bg-color'; this.dynamic = 'avatar-dynamic'; this.fontWeight = 'avatar-font-weight'; this.fontFamily = 'avatar-font-family'; this.shape = 'avatar-shape'; this.data = 'avatar-data'; this.rotatedeg = 'avatar-rotate-degree'; this.avatarborder = 'avatar-border'; } } class RbLetterAvatarComponent { constructor(el) { this._meta = new LAmeta(); this.attribute = new Attributes(); this.base = "data:image/svg+xml;base64,"; this.charCount = "1"; this.letteravatar = el.nativeElement; } ngAfterViewInit() { 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(); } getPropertyValue(property) { let result = ""; result = this.letteravatar.getAttribute(property); return result; } createAvatar() { let c = ""; if (this.charCount === "2") { let _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(); } let textTag = this.getCharacterTextTag(c, this.textColor, this.fontFamily, this.fontWeight, this.fontsize); let colorIndex; let 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); let lvcomponent = this.getLVText(); let svgHtml = window.btoa(unescape(encodeURIComponent(lvcomponent))); let component; let base = this.base; let _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") { let round_style = this.radius + _style; if (this.data.indexOf("http") > -1 || this.data.indexOf("data:image") > -1) { let 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) { let 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; } getLVText() { let 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 */ createSvg(width, height, color, cobj) { let 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 getCharacterTextTag(character, textColor, fontFamily, fontWeight, fontsize) { let 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 */ getRandomColors() { let letters = "0123456789ABCDEF".split(""); let _color = "#"; for (let 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 */ getFirstAndLastName(data) { let names = data.split(" "); if (names && names.length >= 2) { let firstName = names[0]; let lastName = names[1]; if (firstName && lastName) { let 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 = () => [ { 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",] },], }; class RbLetterAvatarModule { } RbLetterAvatarModule.decorators = [ { type: NgModule, args: [{ imports: [CommonModule], declarations: [RbLetterAvatarComponent], providers: [], exports: [RbLetterAvatarComponent] },] }, ]; /** @nocollapse */ RbLetterAvatarModule.ctorParameters = () => []; /** * Generated bundle index. Do not edit. */ export { RbLetterAvatarComponent as ɵa, RbLetterAvatarModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmItbGV0dGVyLWF2YXRhci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vcmItbGV0dGVyLWF2YXRhci9sZXR0ZXItYXZhdGFyL2xhbWV0YS50cyIsIm5nOi8vcmItbGV0dGVyLWF2YXRhci9sZXR0ZXItYXZhdGFyL3JiLWxldHRlci1hdmF0YXIuY29tcG9uZW50LnRzIiwibmc6Ly9yYi1sZXR0ZXItYXZhdGFyL3JiLWxldHRlci1hdmF0YXIubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMQW1ldGEge1xyXG4gICAgZGVmYXVsdENvbG9yczogc3RyaW5nW10gPSBbXCIjNUE4NzcwXCIsIFwiI0IyQjdCQlwiLCBcIiM2RkE5QUJcIiwgXCIjRjVBRjI5XCIsIFwiIzAwODhCOVwiLCBcIiNGMTg2MzZcIiwgXCIjRDkzQTM3XCIsIFwiI0E2QjEyRVwiLCBcIiM1QzlCQkNcIiwgXCIjRjU4ODhEXCIsIFwiIzlBODlCNVwiLCBcIiM0MDc4ODdcIiwgXCIjOUE4OUI1XCIsIFwiIzVBODc3MFwiLCBcIiNEMzNGMzNcIiwgXCIjQTJCMDFGXCIsIFwiI0YwQjEyNlwiLCBcIiMwMDg3QkZcIiwgXCIjRjE4NjM2XCIsIFwiIzAwODdCRlwiLCBcIiNCMkI3QkJcIiwgXCIjNzJBQ0FFXCIsIFwiIzlDOEFCNFwiLCBcIiM1QTg3NzBcIiwgXCIjRUVCNDI0XCIsIFwiIzQwNzg4N1wiXTtcclxuICAgIGRlZmF1bHRUZXh0Q29sb3I6IHN0cmluZyA9ICcjZmZmZmZmJztcclxuICAgIGRlZmF1bHRCb3JkZXI6IHN0cmluZyA9ICdib3JkZXI6NXB4IHNvbGlkIHdoaXRlJztcclxuICAgIGRlZmF1bHRUcmlhbmdsZXVwOiBzdHJpbmcgPSAnd2lkdGg6IDA7aGVpZ2h0OiAwO2JvcmRlci1sZWZ0OiA1MHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDogNTBweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOiAxMDBweCBzb2xpZDsnO1xyXG4gICAgZGVhZnVsdEZvbnRzaXplOiBzdHJpbmcgPSAnMzAnO1xyXG4gICAgZGVmYXVsdEhlaWdodDogc3RyaW5nID0gJzUwJztcclxuICAgIGRlYWZ1bHRXaWR0aDogc3RyaW5nID0gJzUwJztcclxuICAgIGRlZmF1bHRSYWRpdXM6IHN0cmluZyA9ICdib3JkZXItcmFkaXVzOjUwJTsnO1xyXG4gICAgZGVhZnVsdER5bmFtaWM6IHN0cmluZyA9ICdmYWxzZSc7XHJcbiAgICBkZWZhdWx0Um90YXRlZGVnOiBzdHJpbmcgPSAnMCc7XHJcbiAgICBkZWZhdWx0QXZhdGFyYm9yZGVyOnN0cmluZyA9ICdmYWxzZSc7XHJcbiAgICBkZWZhdWx0Rm9udFdlaWdodDogc3RyaW5nID0gJzQwMCc7XHJcbiAgICBkZWZhdWx0Rm9udEZhbWlseTogc3RyaW5nID0gJ0hlbHZldGljYU5ldWUtTGlnaHQsSGVsdmV0aWNhIE5ldWUgTGlnaHQsSGVsdmV0aWNhIE5ldWUsSGVsdmV0aWNhLCBBcmlhbCxMdWNpZGEgR3JhbmRlLCBzYW5zLXNlcmlmJztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZXMge1xyXG4gICAgYWxwaGFiZXRjb2xvcnM6IHN0cmluZyA9ICdhdmF0YXItYWxwaGFiZXQtY29sb3JzJztcclxuICAgIHRleHRDb2xvcjogc3RyaW5nID0gJ2F2YXRhci10ZXh0LWNvbG9yJztcclxuICAgIGRlZmF1bHRCb3JkZXI6IHN0cmluZyA9ICdhdmF0YXItZGVmYXVsdC1ib3JkZXInO1xyXG4gICAgdHJpYW5nbGV1cDogc3RyaW5nID0gJ2F2YXRhci10cmlhbmdsZS11cCc7XHJcbiAgICBmb250c2l6ZTogc3RyaW5nID0gJ2F2YXRhci1mb250LXNpemUnO1xyXG4gICAgaGVpZ2h0OiBzdHJpbmcgPSAnYXZhdGFyLWhlaWdodCc7XHJcbiAgICB3aWR0aDogc3RyaW5nID0gJ2F2YXRhci13aWR0aCc7XHJcbiAgICByYWRpdXM6IHN0cmluZyA9ICdhdmF0YXItcmFkaXVzJztcclxuICAgIGF2YXRhcmN1c3RvbWJnY29sb3I6IHN0cmluZyA9ICdhdmF0YXItY3VzdG9tLWJnLWNvbG9yJztcclxuICAgIGR5bmFtaWM6IHN0cmluZyA9ICdhdmF0YXItZHluYW1pYyc7XHJcbiAgICBmb250V2VpZ2h0OiBzdHJpbmcgPSAnYXZhdGFyLWZvbnQtd2VpZ2h0JztcclxuICAgIGZvbnRGYW1pbHk6IHN0cmluZyA9ICdhdmF0YXItZm9udC1mYW1pbHknO1xyXG4gICAgc2hhcGU6IHN0cmluZyA9ICdhdmF0YXItc2hhcGUnO1xyXG4gICAgZGF0YTogc3RyaW5nID0gJ2F2YXRhci1kYXRhJztcclxuICAgIHJvdGF0ZWRlZzogc3RyaW5nID0gJ2F2YXRhci1yb3RhdGUtZGVncmVlJztcclxuICAgIGF2YXRhcmJvcmRlcjpzdHJpbmcgPSAnYXZhdGFyLWJvcmRlcic7XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHsgQXR0cmlidXRlcywgTEFtZXRhIH0gZnJvbSBcIi4vbGFtZXRhXCI7XHJcblxyXG5kZWNsYXJlIGZ1bmN0aW9uIHVuZXNjYXBlKHg6IHN0cmluZyk6IHN0cmluZztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwicmItbGV0dGVyLWF2YXRhclwiLFxyXG4gICAgdGVtcGxhdGU6IFwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYkxldHRlckF2YXRhckNvbXBvbmVudCAge1xyXG4gICAgcHJpdmF0ZSBsZXR0ZXJhdmF0YXI6IGFueTtcclxuICAgIHByaXZhdGUgaW1hZ2VUYWc6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbWV0YTogTEFtZXRhID0gbmV3IExBbWV0YSgpO1xyXG4gICAgcHJpdmF0ZSBhdHRyaWJ1dGU6IEF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpO1xyXG5cclxuICAgIEBJbnB1dChcImF2YXRhci1hbHBoYWJldC1jb2xvcnNcIikgYWxwaGFiZXRjb2xvcnM6IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXRleHQtY29sb3JcIikgdGV4dENvbG9yOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZGVmYXVsdC1ib3JkZXJcIikgZGVmYXVsdEJvcmRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXRyaWFuZ2xlLXVwXCIpIHRyaWFuZ2xldXA6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1mb250LXNpemVcIikgZm9udHNpemU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1oZWlnaHRcIikgaGVpZ2h0OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItd2lkdGhcIikgd2lkdGg6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1mb250LXdlaWdodFwiKSBmb250V2VpZ2h0OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC1mYW1pbHlcIikgZm9udEZhbWlseTogc3RyaW5nO1xyXG4gICAgYmFzZTogc3RyaW5nID0gXCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFwiO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXJhZGl1c1wiKSByYWRpdXM6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1keW5hbWljXCIpIGR5bmFtaWM6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1yb3RhdGUtZGVncmVlXCIpIHJvdGF0ZWRlZzogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWNoYXItY291bnRcIikgY2hhckNvdW50OiBzdHJpbmcgPSBcIjFcIjtcclxuICAgIEBJbnB1dChcImF2YXRhci1kYXRhXCIpIGRhdGE6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1ib3JkZXItc3R5bGVcIikgYXZhdGFyQm9yZGVyU3R5bGU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1ib3JkZXJcIikgYXZhdGFyYm9yZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItY3VzdG9tLWJvcmRlclwiKSBhdmF0YXJjdXN0b21ib3JkZXI6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1zaGFwZVwiKSBzaGFwZTogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWN1c3RvbS1iZy1jb2xvclwiKSBhdmF0YXJjdXN0b21iZ2NvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYpIHtcclxuICAgICAgICB0aGlzLmxldHRlcmF2YXRhciA9IGVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5hbHBoYWJldGNvbG9ycykge1xyXG4gICAgICAgICAgICB0aGlzLmFscGhhYmV0Y29sb3JzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmFscGhhYmV0Y29sb3JzKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYWxwaGFiZXRjb2xvcnMpIDogdGhpcy5fbWV0YS5kZWZhdWx0Q29sb3JzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMudGV4dENvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnRleHRDb2xvcikgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnRleHRDb2xvcikgOiB0aGlzLl9tZXRhLmRlZmF1bHRUZXh0Q29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLmF2YXRhcmN1c3RvbWJnY29sb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmF2YXRhcmN1c3RvbWJnY29sb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmF2YXRhcmJvcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLmF2YXRhcmJvcmRlciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJib3JkZXIpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJib3JkZXIpIDogdGhpcy5fbWV0YS5kZWZhdWx0QXZhdGFyYm9yZGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRCb3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Qm9yZGVyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmRlZmF1bHRCb3JkZXIpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kZWZhdWx0Qm9yZGVyKSA6IHRoaXMuX21ldGEuZGVmYXVsdEJvcmRlcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRyaWFuZ2xldXApIHtcclxuICAgICAgICAgICAgdGhpcy50cmlhbmdsZXVwID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnRyaWFuZ2xldXApID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50cmlhbmdsZXVwKSA6IHRoaXMuX21ldGEuZGVmYXVsdFRyaWFuZ2xldXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250c2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRzaXplID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRzaXplKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udHNpemUpIDogdGhpcy5fbWV0YS5kZWFmdWx0Rm9udHNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuaGVpZ2h0KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuaGVpZ2h0KSA6IHRoaXMuX21ldGEuZGVmYXVsdEhlaWdodDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLndpZHRoKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUud2lkdGgpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS53aWR0aCkgOiB0aGlzLl9tZXRhLmRlYWZ1bHRXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnJhZGl1cykge1xyXG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5yYWRpdXMpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5yYWRpdXMpIDogdGhpcy5fbWV0YS5kZWZhdWx0UmFkaXVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZHluYW1pYykge1xyXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZHluYW1pYykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmR5bmFtaWMpIDogZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5yb3RhdGVkZWcpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3RhdGVkZWcgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucm90YXRlZGVnKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucm90YXRlZGVnKSA6IHRoaXMuX21ldGEuZGVmYXVsdFJvdGF0ZWRlZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvbnRXZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5mb250V2VpZ2h0ID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRXZWlnaHQpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250V2VpZ2h0KSA6IHRoaXMuX21ldGEuZGVmYXVsdEZvbnRXZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250RmFtaWx5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udEZhbWlseSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250RmFtaWx5KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udEZhbWlseSkgOiB0aGlzLl9tZXRhLmRlZmF1bHRGb250RmFtaWx5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2hhcGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zaGFwZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5zaGFwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jcmVhdGVBdmF0YXIoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSBcIlwiO1xyXG4gICAgICAgIHJlc3VsdCA9IHRoaXMubGV0dGVyYXZhdGFyLmdldEF0dHJpYnV0ZShwcm9wZXJ0eSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZUF2YXRhcigpOiB2b2lkIHtcclxuICAgICAgICBsZXQgYzogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICBpZiAodGhpcy5jaGFyQ291bnQgPT09IFwiMlwiKSB7XHJcbiAgICAgICAgICAgIGxldCBfZGF0YTogc3RyaW5nID0gdGhpcy5nZXRGaXJzdEFuZExhc3ROYW1lKHRoaXMuZGF0YS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKF9kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBjID0gX2RhdGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjID0gdGhpcy5kYXRhLnN1YnN0cmluZygwLCArdGhpcy5jaGFyQ291bnQpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjID0gdGhpcy5kYXRhLnN1YnN0cmluZygwLCArdGhpcy5jaGFyQ291bnQpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0ZXh0VGFnOiBIVE1MRWxlbWVudCA9IHRoaXMuZ2V0Q2hhcmFjdGVyVGV4dFRhZyhjLCB0aGlzLnRleHRDb2xvciwgdGhpcy5mb250RmFtaWx5LCB0aGlzLmZvbnRXZWlnaHQsIHRoaXMuZm9udHNpemUpO1xyXG4gICAgICAgIGxldCBjb2xvckluZGV4OiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGNvbG9yOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBQb3B1bGF0ZSB0aGUgY29sb3JzIGFjY29yZGluZyB0byBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGMuY2hhckNvZGVBdCgwKSA8IDY1KSB7XHJcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5nZXRSYW5kb21Db2xvcnMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb2xvckluZGV4ID0gTWF0aC5mbG9vcigoYy5jaGFyQ29kZUF0KDApIC0gNjUpICUgdGhpcy5hbHBoYWJldGNvbG9ycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuYWxwaGFiZXRjb2xvcnNbY29sb3JJbmRleF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yKSB7XHJcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdmcodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIGNvbG9yLCB0ZXh0VGFnKTtcclxuICAgICAgICBsZXQgbHZjb21wb25lbnQ6c3RyaW5nID0gdGhpcy5nZXRMVlRleHQoKTtcclxuICAgICAgICBsZXQgc3ZnSHRtbDogc3RyaW5nID0gd2luZG93LmJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGx2Y29tcG9uZW50KSkpO1xyXG4gICAgICAgIGxldCBjb21wb25lbnQ6IHN0cmluZztcclxuICAgICAgICBsZXQgYmFzZTogc3RyaW5nID0gdGhpcy5iYXNlO1xyXG4gICAgICAgIGxldCBfc3R5bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuYXZhdGFyQm9yZGVyU3R5bGUpIHtcclxuICAgICAgICAgICAgX3N0eWxlID0gdGhpcy5hdmF0YXJCb3JkZXJTdHlsZTtcclxuICAgICAgICB9IGVsc2UgaWYodGhpcy5hdmF0YXJib3JkZXIgPT09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgICAgIF9zdHlsZSA9IHRoaXMuZGVmYXVsdEJvcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnJvdGF0ZWRlZyAhPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgICAgICBfc3R5bGUgPSBcIi1tcy10cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpOyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKFwiICsgdGhpcy5yb3RhdGVkZWcgKyBcImRlZyk7IHRyYW5zZm9ybTogcm90YXRlKFwiICsgdGhpcy5yb3RhdGVkZWcgKyBcImRlZylcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNoYXBlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09PSBcInJvdW5kXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCByb3VuZF9zdHlsZTogc3RyaW5nID0gdGhpcy5yYWRpdXMgKyBfc3R5bGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmluZGV4T2YoXCJodHRwXCIpID4gLTEgfHwgdGhpcy5kYXRhLmluZGV4T2YoXCJkYXRhOmltYWdlXCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaW1nX3NpemU6IHN0cmluZyA9IFwid2lkdGg6XCIgKyB0aGlzLndpZHRoICsgXCJweDtoZWlnaHQ6XCIgKyB0aGlzLmhlaWdodCArIFwicHg7XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIHRoaXMuZGF0YSArIFwiIHN0eWxlPSdcIiArIGltZ19zaXplICsgcm91bmRfc3R5bGUgKyBcIicgIC8+XCI7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFwiPGltZyBzcmM9XCIgKyBiYXNlICsgc3ZnSHRtbCArIFwiIHN0eWxlPSdcIiArIHJvdW5kX3N0eWxlICsgXCInIHRpdGxlPSdcIiArIHRoaXMuZGF0YSArIFwiJyAvPlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbmRleE9mKFwiaHR0cFwiKSA+IC0xIHx8IHRoaXMuZGF0YS5pbmRleE9mKFwiZGF0YTppbWFnZVwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW1nX3NpemU6IHN0cmluZyA9IFwid2lkdGg6XCIgKyB0aGlzLndpZHRoICsgXCJweDtoZWlnaHQ6XCIgKyB0aGlzLmhlaWdodCArIFwicHg7XCI7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgdGhpcy5kYXRhICsgXCIgc3R5bGU9J1wiICsgaW1nX3NpemUgKyBfc3R5bGUgKyBcIicgIC8+XCI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgYmFzZSArIHN2Z0h0bWwgKyBcIiBzdHlsZT0nXCIgKyBfc3R5bGUgKyBcIicgdGl0bGU9J1wiICsgdGhpcy5kYXRhICsgXCInIC8+XCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGV0dGVyYXZhdGFyLmlubmVySFRNTCA9IGNvbXBvbmVudDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRMVlRleHQoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbHZUYWc6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICBsdlRhZy5hcHBlbmRDaGlsZCh0aGlzLmltYWdlVGFnLmNsb25lTm9kZSgpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZVRhZy5vdXRlckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQb3B1bGF0ZSB0aGUgc3ZnIHRhZyB3aGljaCB3aWxsIHVzZWQgZm9yIHRoZSBhdmF0YXIgZ2VuZXJhdGlvblxyXG4gICAgICogQHBhcmFtIHdpZHRoXHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0XHJcbiAgICAgKiBAcGFyYW0gY29sb3JcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlU3ZnKHdpZHRoOiBzdHJpbmcsIGhlaWdodDogc3RyaW5nLCBjb2xvcjogc3RyaW5nLCBjb2JqOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XHJcblxyXG4gICAgICAgIGxldCBzdmdUYWc6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN2Z1wiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3aWR0aCk7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoZWlnaHQpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImJhY2tncm91bmQtY29sb3I6XCIgKyBjb2xvciArIFwiO3dpZHRoOlwiICsgd2lkdGggKyBcInB4XCIgKyBcIjtoZWlnaHQ6XCIgKyBoZWlnaHQgKyBcInB4XCIpO1xyXG4gICAgICAgIHN2Z1RhZy5hcHBlbmRDaGlsZChjb2JqKTtcclxuICAgICAgICB0aGlzLmltYWdlVGFnID0gc3ZnVGFnO1xyXG5cclxuICAgICAgICByZXR1cm4gc3ZnVGFnLmlubmVySFRNTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBHZW5lcmF0ZSB0aGUgTGV0dGVyIHRhZyBieSB1c2luZyB0aGUgc3ZnIHRleHQgZWxlbWVudFxyXG4gICAgICogQHBhcmFtIGNoYXJhY3RlclxyXG4gICAgICogQHBhcmFtIHRleHRDb2xvclxyXG4gICAgICogQHBhcmFtIGZvbnRGYW1pbHlcclxuICAgICAqIEBwYXJhbSBmb250V2VpZ2h0XHJcbiAgICAgKiBAcGFyYW0gZm9udHNpemVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgIHByaXZhdGUgZ2V0Q2hhcmFjdGVyVGV4dFRhZyhjaGFyYWN0ZXI6c3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZywgZm9udEZhbWlseTogc3RyaW5nLCBmb250V2VpZ2h0OiBzdHJpbmcsIGZvbnRzaXplOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IHRleHRUYWc6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ0ZXh0LWFuY2hvclwiLCBcIm1pZGRsZVwiKTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcInhcIiwgXCI1MCVcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiNTAlXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZHlcIiwgXCIwLjM1ZW1cIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcImF1dG9cIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRleHRDb2xvcik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJmb250LWZhbWlseVwiLCBmb250RmFtaWx5KTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcInN0eWxlXCIsIFwiZm9udC13ZWlnaHQ6XCIgKyBmb250V2VpZ2h0ICsgXCI7Zm9udC1zaXplOlwiICsgZm9udHNpemUgKyBcInB4XCIpO1xyXG4gICAgICAgIHRleHRUYWcuaW5uZXJUZXh0ID0gY2hhcmFjdGVyO1xyXG4gICAgICAgIHJldHVybiB0ZXh0VGFnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSByYW5kb20gY29sb3JzXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFJhbmRvbUNvbG9ycygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBsZXR0ZXJzOiBzdHJpbmdbXSA9IFwiMDEyMzQ1Njc4OUFCQ0RFRlwiLnNwbGl0KFwiXCIpO1xyXG4gICAgICAgIGxldCBfY29sb3I6IHN0cmluZyA9IFwiI1wiO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCA2OyBpKyspIHtcclxuICAgICAgICAgICAgX2NvbG9yICs9IGxldHRlcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGdldCB0aGUgZmlyc3QgbmFtZSBhbmQgbGFzdCBuYW1lIGZpcnN0IGxldHRlcnMgYW5kIGNvbWJpbmVkIGFuZCBmb3JtIHRoZSBsZXR0ZXIgYXZhdGFyXHJcbiAgICAgKiBAcGFyYW0gZGF0YVxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRGaXJzdEFuZExhc3ROYW1lKGRhdGE6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IG5hbWVzOiBzdHJpbmdbXSA9IGRhdGEuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGlmIChuYW1lcyAmJiBuYW1lcy5sZW5ndGggPj0gMikge1xyXG4gICAgICAgICAgICBsZXQgZmlyc3ROYW1lOiBzdHJpbmcgPSBuYW1lc1swXTtcclxuICAgICAgICAgICAgbGV0IGxhc3ROYW1lOiBzdHJpbmcgPSBuYW1lc1sxXTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0TmFtZSAmJiBsYXN0TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZyA9IGZpcnN0TmFtZS5zdWJzdHIoMCwgMSkgKyBsYXN0TmFtZS5zdWJzdHIoMCwgMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnN1YnN0cigwLCAyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCB7TmdNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7UmJMZXR0ZXJBdmF0YXJDb21wb25lbnR9IGZyb20gXCIuL2xldHRlci1hdmF0YXIvcmItbGV0dGVyLWF2YXRhci5jb21wb25lbnRcIjtcclxuXHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgICBkZWNsYXJhdGlvbnM6IFtSYkxldHRlckF2YXRhckNvbXBvbmVudF0sXHJcbiAgICBwcm92aWRlcnM6IFtdLFxyXG4gICAgZXhwb3J0czogW1JiTGV0dGVyQXZhdGFyQ29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQg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