rb-letter-avatar
Version:
Angular letter avatar component
385 lines • 50.8 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('rb-letter-avatar', ['exports', '@angular/core', '@angular/common'], factory) :
(factory((global['rb-letter-avatar'] = {}),global.ng.core,global.ng.common));
}(this, (function (exports,core,common) { 'use strict';
var LAmeta = (function () {
function LAmeta() {
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';
}
return LAmeta;
}());
var Attributes = (function () {
function Attributes() {
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';
}
return Attributes;
}());
var RbLetterAvatarComponent = (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: core.Component, args: [{
selector: "rb-letter-avatar",
template: "<ng-content></ng-content>"
},] },
];
/** @nocollapse */
RbLetterAvatarComponent.ctorParameters = function () {
return [
{ type: core.ElementRef, },
];
};
RbLetterAvatarComponent.propDecorators = {
"alphabetcolors": [{ type: core.Input, args: ["avatar-alphabet-colors",] },],
"textColor": [{ type: core.Input, args: ["avatar-text-color",] },],
"defaultBorder": [{ type: core.Input, args: ["avatar-default-border",] },],
"triangleup": [{ type: core.Input, args: ["avatar-triangle-up",] },],
"fontsize": [{ type: core.Input, args: ["avatar-font-size",] },],
"height": [{ type: core.Input, args: ["avatar-height",] },],
"width": [{ type: core.Input, args: ["avatar-width",] },],
"fontWeight": [{ type: core.Input, args: ["avatar-font-weight",] },],
"fontFamily": [{ type: core.Input, args: ["avatar-font-family",] },],
"radius": [{ type: core.Input, args: ["avatar-radius",] },],
"dynamic": [{ type: core.Input, args: ["avatar-dynamic",] },],
"rotatedeg": [{ type: core.Input, args: ["avatar-rotate-degree",] },],
"charCount": [{ type: core.Input, args: ["avatar-char-count",] },],
"data": [{ type: core.Input, args: ["avatar-data",] },],
"avatarBorderStyle": [{ type: core.Input, args: ["avatar-border-style",] },],
"avatarborder": [{ type: core.Input, args: ["avatar-border",] },],
"avatarcustomborder": [{ type: core.Input, args: ["avatar-custom-border",] },],
"shape": [{ type: core.Input, args: ["avatar-shape",] },],
"avatarcustombgcolor": [{ type: core.Input, args: ["avatar-custom-bg-color",] },],
};
return RbLetterAvatarComponent;
}());
var RbLetterAvatarModule = (function () {
function RbLetterAvatarModule() {
}
RbLetterAvatarModule.decorators = [
{ type: core.NgModule, args: [{
imports: [common.CommonModule],
declarations: [RbLetterAvatarComponent],
providers: [],
exports: [RbLetterAvatarComponent]
},] },
];
/** @nocollapse */
RbLetterAvatarModule.ctorParameters = function () { return []; };
return RbLetterAvatarModule;
}());
/**
* Generated bundle index. Do not edit.
*/
exports.ɵa = RbLetterAvatarComponent;
exports.RbLetterAvatarModule = RbLetterAvatarModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmItbGV0dGVyLWF2YXRhci51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL3JiLWxldHRlci1hdmF0YXIvbGV0dGVyLWF2YXRhci9sYW1ldGEudHMiLCJuZzovL3JiLWxldHRlci1hdmF0YXIvbGV0dGVyLWF2YXRhci9yYi1sZXR0ZXItYXZhdGFyLmNvbXBvbmVudC50cyIsIm5nOi8vcmItbGV0dGVyLWF2YXRhci9yYi1sZXR0ZXItYXZhdGFyLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTEFtZXRhIHtcclxuICAgIGRlZmF1bHRDb2xvcnM6IHN0cmluZ1tdID0gW1wiIzVBODc3MFwiLCBcIiNCMkI3QkJcIiwgXCIjNkZBOUFCXCIsIFwiI0Y1QUYyOVwiLCBcIiMwMDg4QjlcIiwgXCIjRjE4NjM2XCIsIFwiI0Q5M0EzN1wiLCBcIiNBNkIxMkVcIiwgXCIjNUM5QkJDXCIsIFwiI0Y1ODg4RFwiLCBcIiM5QTg5QjVcIiwgXCIjNDA3ODg3XCIsIFwiIzlBODlCNVwiLCBcIiM1QTg3NzBcIiwgXCIjRDMzRjMzXCIsIFwiI0EyQjAxRlwiLCBcIiNGMEIxMjZcIiwgXCIjMDA4N0JGXCIsIFwiI0YxODYzNlwiLCBcIiMwMDg3QkZcIiwgXCIjQjJCN0JCXCIsIFwiIzcyQUNBRVwiLCBcIiM5QzhBQjRcIiwgXCIjNUE4NzcwXCIsIFwiI0VFQjQyNFwiLCBcIiM0MDc4ODdcIl07XHJcbiAgICBkZWZhdWx0VGV4dENvbG9yOiBzdHJpbmcgPSAnI2ZmZmZmZic7XHJcbiAgICBkZWZhdWx0Qm9yZGVyOiBzdHJpbmcgPSAnYm9yZGVyOjVweCBzb2xpZCB3aGl0ZSc7XHJcbiAgICBkZWZhdWx0VHJpYW5nbGV1cDogc3RyaW5nID0gJ3dpZHRoOiAwO2hlaWdodDogMDtib3JkZXItbGVmdDogNTBweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6IDUwcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTogMTAwcHggc29saWQ7JztcclxuICAgIGRlYWZ1bHRGb250c2l6ZTogc3RyaW5nID0gJzMwJztcclxuICAgIGRlZmF1bHRIZWlnaHQ6IHN0cmluZyA9ICc1MCc7XHJcbiAgICBkZWFmdWx0V2lkdGg6IHN0cmluZyA9ICc1MCc7XHJcbiAgICBkZWZhdWx0UmFkaXVzOiBzdHJpbmcgPSAnYm9yZGVyLXJhZGl1czo1MCU7JztcclxuICAgIGRlYWZ1bHREeW5hbWljOiBzdHJpbmcgPSAnZmFsc2UnO1xyXG4gICAgZGVmYXVsdFJvdGF0ZWRlZzogc3RyaW5nID0gJzAnO1xyXG4gICAgZGVmYXVsdEF2YXRhcmJvcmRlcjpzdHJpbmcgPSAnZmFsc2UnO1xyXG4gICAgZGVmYXVsdEZvbnRXZWlnaHQ6IHN0cmluZyA9ICc0MDAnO1xyXG4gICAgZGVmYXVsdEZvbnRGYW1pbHk6IHN0cmluZyA9ICdIZWx2ZXRpY2FOZXVlLUxpZ2h0LEhlbHZldGljYSBOZXVlIExpZ2h0LEhlbHZldGljYSBOZXVlLEhlbHZldGljYSwgQXJpYWwsTHVjaWRhIEdyYW5kZSwgc2Fucy1zZXJpZic7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdHRyaWJ1dGVzIHtcclxuICAgIGFscGhhYmV0Y29sb3JzOiBzdHJpbmcgPSAnYXZhdGFyLWFscGhhYmV0LWNvbG9ycyc7XHJcbiAgICB0ZXh0Q29sb3I6IHN0cmluZyA9ICdhdmF0YXItdGV4dC1jb2xvcic7XHJcbiAgICBkZWZhdWx0Qm9yZGVyOiBzdHJpbmcgPSAnYXZhdGFyLWRlZmF1bHQtYm9yZGVyJztcclxuICAgIHRyaWFuZ2xldXA6IHN0cmluZyA9ICdhdmF0YXItdHJpYW5nbGUtdXAnO1xyXG4gICAgZm9udHNpemU6IHN0cmluZyA9ICdhdmF0YXItZm9udC1zaXplJztcclxuICAgIGhlaWdodDogc3RyaW5nID0gJ2F2YXRhci1oZWlnaHQnO1xyXG4gICAgd2lkdGg6IHN0cmluZyA9ICdhdmF0YXItd2lkdGgnO1xyXG4gICAgcmFkaXVzOiBzdHJpbmcgPSAnYXZhdGFyLXJhZGl1cyc7XHJcbiAgICBhdmF0YXJjdXN0b21iZ2NvbG9yOiBzdHJpbmcgPSAnYXZhdGFyLWN1c3RvbS1iZy1jb2xvcic7XHJcbiAgICBkeW5hbWljOiBzdHJpbmcgPSAnYXZhdGFyLWR5bmFtaWMnO1xyXG4gICAgZm9udFdlaWdodDogc3RyaW5nID0gJ2F2YXRhci1mb250LXdlaWdodCc7XHJcbiAgICBmb250RmFtaWx5OiBzdHJpbmcgPSAnYXZhdGFyLWZvbnQtZmFtaWx5JztcclxuICAgIHNoYXBlOiBzdHJpbmcgPSAnYXZhdGFyLXNoYXBlJztcclxuICAgIGRhdGE6IHN0cmluZyA9ICdhdmF0YXItZGF0YSc7XHJcbiAgICByb3RhdGVkZWc6IHN0cmluZyA9ICdhdmF0YXItcm90YXRlLWRlZ3JlZSc7XHJcbiAgICBhdmF0YXJib3JkZXI6c3RyaW5nID0gJ2F2YXRhci1ib3JkZXInO1xyXG59XHJcblxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIElucHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIExBbWV0YSB9IGZyb20gXCIuL2xhbWV0YVwiO1xyXG5cclxuZGVjbGFyZSBmdW5jdGlvbiB1bmVzY2FwZSh4OiBzdHJpbmcpOiBzdHJpbmc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBcInJiLWxldHRlci1hdmF0YXJcIixcclxuICAgIHRlbXBsYXRlOiBcIjxuZy1jb250ZW50PjwvbmctY29udGVudD5cIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmJMZXR0ZXJBdmF0YXJDb21wb25lbnQgIHtcclxuICAgIHByaXZhdGUgbGV0dGVyYXZhdGFyOiBhbnk7XHJcbiAgICBwcml2YXRlIGltYWdlVGFnOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX21ldGE6IExBbWV0YSA9IG5ldyBMQW1ldGEoKTtcclxuICAgIHByaXZhdGUgYXR0cmlidXRlOiBBdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZXMoKTtcclxuXHJcbiAgICBASW5wdXQoXCJhdmF0YXItYWxwaGFiZXQtY29sb3JzXCIpIGFscGhhYmV0Y29sb3JzOiBzdHJpbmdbXTtcclxuICAgIEBJbnB1dChcImF2YXRhci10ZXh0LWNvbG9yXCIpIHRleHRDb2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWRlZmF1bHQtYm9yZGVyXCIpIGRlZmF1bHRCb3JkZXI6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci10cmlhbmdsZS11cFwiKSB0cmlhbmdsZXVwOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC1zaXplXCIpIGZvbnRzaXplOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItaGVpZ2h0XCIpIGhlaWdodDogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLXdpZHRoXCIpIHdpZHRoOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZm9udC13ZWlnaHRcIikgZm9udFdlaWdodDogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWZvbnQtZmFtaWx5XCIpIGZvbnRGYW1pbHk6IHN0cmluZztcclxuICAgIGJhc2U6IHN0cmluZyA9IFwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxcIjtcclxuICAgIEBJbnB1dChcImF2YXRhci1yYWRpdXNcIikgcmFkaXVzOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZHluYW1pY1wiKSBkeW5hbWljOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItcm90YXRlLWRlZ3JlZVwiKSByb3RhdGVkZWc6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1jaGFyLWNvdW50XCIpIGNoYXJDb3VudDogc3RyaW5nID0gXCIxXCI7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItZGF0YVwiKSBkYXRhOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItYm9yZGVyLXN0eWxlXCIpIGF2YXRhckJvcmRlclN0eWxlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItYm9yZGVyXCIpIGF2YXRhcmJvcmRlcjogc3RyaW5nO1xyXG4gICAgQElucHV0KFwiYXZhdGFyLWN1c3RvbS1ib3JkZXJcIikgYXZhdGFyY3VzdG9tYm9yZGVyOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoXCJhdmF0YXItc2hhcGVcIikgc2hhcGU6IHN0cmluZztcclxuICAgIEBJbnB1dChcImF2YXRhci1jdXN0b20tYmctY29sb3JcIikgYXZhdGFyY3VzdG9tYmdjb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgdGhpcy5sZXR0ZXJhdmF0YXIgPSBlbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWxwaGFiZXRjb2xvcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5hbHBoYWJldGNvbG9ycyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hbHBoYWJldGNvbG9ycykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmFscGhhYmV0Y29sb3JzKSA6IHRoaXMuX21ldGEuZGVmYXVsdENvbG9ycztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRleHRDb2xvcikge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50ZXh0Q29sb3IpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50ZXh0Q29sb3IpIDogdGhpcy5fbWV0YS5kZWZhdWx0VGV4dENvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5hdmF0YXJjdXN0b21iZ2NvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5hdmF0YXJjdXN0b21iZ2NvbG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5hdmF0YXJib3JkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmF0YXJib3JkZXIgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYXZhdGFyYm9yZGVyKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuYXZhdGFyYm9yZGVyKSA6IHRoaXMuX21ldGEuZGVmYXVsdEF2YXRhcmJvcmRlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5kZWZhdWx0Qm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJvcmRlciA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5kZWZhdWx0Qm9yZGVyKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZGVmYXVsdEJvcmRlcikgOiB0aGlzLl9tZXRhLmRlZmF1bHRCb3JkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy50cmlhbmdsZXVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJpYW5nbGV1cCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS50cmlhbmdsZXVwKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUudHJpYW5nbGV1cCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRUcmlhbmdsZXVwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZm9udHNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5mb250c2l6ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250c2l6ZSkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRzaXplKSA6IHRoaXMuX21ldGEuZGVhZnVsdEZvbnRzaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmhlaWdodCkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmhlaWdodCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy53aWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLndpZHRoKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUud2lkdGgpIDogdGhpcy5fbWV0YS5kZWFmdWx0V2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5yYWRpdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucmFkaXVzKSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUucmFkaXVzKSA6IHRoaXMuX21ldGEuZGVmYXVsdFJhZGl1cztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWMpIHtcclxuICAgICAgICAgICAgdGhpcy5keW5hbWljID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmR5bmFtaWMpID9cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5keW5hbWljKSA6IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMucm90YXRlZGVnKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm90YXRlZGVnID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnJvdGF0ZWRlZykgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLnJvdGF0ZWRlZykgOiB0aGlzLl9tZXRhLmRlZmF1bHRSb3RhdGVkZWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5mb250V2VpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9udFdlaWdodCA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLmF0dHJpYnV0ZS5mb250V2VpZ2h0KSA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udFdlaWdodCkgOiB0aGlzLl9tZXRhLmRlZmF1bHRGb250V2VpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZm9udEZhbWlseSkge1xyXG4gICAgICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZm9udEZhbWlseSkgP1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuYXR0cmlidXRlLmZvbnRGYW1pbHkpIDogdGhpcy5fbWV0YS5kZWZhdWx0Rm9udEZhbWlseTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnNoYXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcGUgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuc2hhcGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmdldFByb3BlcnR5VmFsdWUodGhpcy5hdHRyaWJ1dGUuZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlQXZhdGFyKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0gXCJcIjtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLmxldHRlcmF2YXRhci5nZXRBdHRyaWJ1dGUocHJvcGVydHkpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVBdmF0YXIoKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGM6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhckNvdW50ID09PSBcIjJcIikge1xyXG4gICAgICAgICAgICBsZXQgX2RhdGE6IHN0cmluZyA9IHRoaXMuZ2V0Rmlyc3RBbmRMYXN0TmFtZSh0aGlzLmRhdGEudG9VcHBlckNhc2UoKSk7XHJcbiAgICAgICAgICAgIGlmIChfZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgYyA9IF9kYXRhO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYyA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCwgK3RoaXMuY2hhckNvdW50KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYyA9IHRoaXMuZGF0YS5zdWJzdHJpbmcoMCwgK3RoaXMuY2hhckNvdW50KS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdGV4dFRhZzogSFRNTEVsZW1lbnQgPSB0aGlzLmdldENoYXJhY3RlclRleHRUYWcoYywgdGhpcy50ZXh0Q29sb3IsIHRoaXMuZm9udEZhbWlseSwgdGhpcy5mb250V2VpZ2h0LCB0aGlzLmZvbnRzaXplKTtcclxuICAgICAgICBsZXQgY29sb3JJbmRleDogbnVtYmVyO1xyXG4gICAgICAgIGxldCBjb2xvcjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUG9wdWxhdGUgdGhlIGNvbG9ycyBhY2NvcmRpbmcgdG8gYXR0cmlidXRlc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChjLmNoYXJDb2RlQXQoMCkgPCA2NSkge1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuZ2V0UmFuZG9tQ29sb3JzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29sb3JJbmRleCA9IE1hdGguZmxvb3IoKGMuY2hhckNvZGVBdCgwKSAtIDY1KSAlIHRoaXMuYWxwaGFiZXRjb2xvcnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgY29sb3IgPSB0aGlzLmFscGhhYmV0Y29sb3JzW2NvbG9ySW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvcikge1xyXG4gICAgICAgICAgICBjb2xvciA9IHRoaXMuYXZhdGFyY3VzdG9tYmdjb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3ZnKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBjb2xvciwgdGV4dFRhZyk7XHJcbiAgICAgICAgbGV0IGx2Y29tcG9uZW50OnN0cmluZyA9IHRoaXMuZ2V0TFZUZXh0KCk7XHJcbiAgICAgICAgbGV0IHN2Z0h0bWw6IHN0cmluZyA9IHdpbmRvdy5idG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChsdmNvbXBvbmVudCkpKTtcclxuICAgICAgICBsZXQgY29tcG9uZW50OiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IGJhc2U6IHN0cmluZyA9IHRoaXMuYmFzZTtcclxuICAgICAgICBsZXQgX3N0eWxlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgIGlmICh0aGlzLmF2YXRhckJvcmRlclN0eWxlKSB7XHJcbiAgICAgICAgICAgIF9zdHlsZSA9IHRoaXMuYXZhdGFyQm9yZGVyU3R5bGU7XHJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuYXZhdGFyYm9yZGVyID09PSBcInRydWVcIikge1xyXG4gICAgICAgICAgICBfc3R5bGUgPSB0aGlzLmRlZmF1bHRCb3JkZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5yb3RhdGVkZWcgIT09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgX3N0eWxlID0gXCItbXMtdHJhbnNmb3JtOiByb3RhdGUoXCIgKyB0aGlzLnJvdGF0ZWRlZyArIFwiZGVnKTsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpOyB0cmFuc2Zvcm06IHJvdGF0ZShcIiArIHRoaXMucm90YXRlZGVnICsgXCJkZWcpXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaGFwZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFwZSA9PT0gXCJyb3VuZFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcm91bmRfc3R5bGU6IHN0cmluZyA9IHRoaXMucmFkaXVzICsgX3N0eWxlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbmRleE9mKFwiaHR0cFwiKSA+IC0xIHx8IHRoaXMuZGF0YS5pbmRleE9mKFwiZGF0YTppbWFnZVwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltZ19zaXplOiBzdHJpbmcgPSBcIndpZHRoOlwiICsgdGhpcy53aWR0aCArIFwicHg7aGVpZ2h0OlwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IFwiPGltZyBzcmM9XCIgKyB0aGlzLmRhdGEgKyBcIiBzdHlsZT0nXCIgKyBpbWdfc2l6ZSArIHJvdW5kX3N0eWxlICsgXCInICAvPlwiO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBcIjxpbWcgc3JjPVwiICsgYmFzZSArIHN2Z0h0bWwgKyBcIiBzdHlsZT0nXCIgKyByb3VuZF9zdHlsZSArIFwiJyB0aXRsZT0nXCIgKyB0aGlzLmRhdGEgKyBcIicgLz5cIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5kZXhPZihcImh0dHBcIikgPiAtMSB8fCB0aGlzLmRhdGEuaW5kZXhPZihcImRhdGE6aW1hZ2VcIikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGltZ19zaXplOiBzdHJpbmcgPSBcIndpZHRoOlwiICsgdGhpcy53aWR0aCArIFwicHg7aGVpZ2h0OlwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIHRoaXMuZGF0YSArIFwiIHN0eWxlPSdcIiArIGltZ19zaXplICsgX3N0eWxlICsgXCInICAvPlwiO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50ID0gXCI8aW1nIHNyYz1cIiArIGJhc2UgKyBzdmdIdG1sICsgXCIgc3R5bGU9J1wiICsgX3N0eWxlICsgXCInIHRpdGxlPSdcIiArIHRoaXMuZGF0YSArIFwiJyAvPlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxldHRlcmF2YXRhci5pbm5lckhUTUwgPSBjb21wb25lbnQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TFZUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGx2VGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgbHZUYWcuYXBwZW5kQ2hpbGQodGhpcy5pbWFnZVRhZy5jbG9uZU5vZGUoKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VUYWcub3V0ZXJIVE1MO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUG9wdWxhdGUgdGhlIHN2ZyB0YWcgd2hpY2ggd2lsbCB1c2VkIGZvciB0aGUgYXZhdGFyIGdlbmVyYXRpb25cclxuICAgICAqIEBwYXJhbSB3aWR0aFxyXG4gICAgICogQHBhcmFtIGhlaWdodFxyXG4gICAgICogQHBhcmFtIGNvbG9yXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN2Zyh3aWR0aDogc3RyaW5nLCBoZWlnaHQ6IHN0cmluZywgY29sb3I6IHN0cmluZywgY29iajogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xyXG5cclxuICAgICAgICBsZXQgc3ZnVGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIik7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIik7XHJcbiAgICAgICAgc3ZnVGFnLnNldEF0dHJpYnV0ZShcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgd2lkdGgpO1xyXG4gICAgICAgIHN2Z1RhZy5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaGVpZ2h0KTtcclxuICAgICAgICBzdmdUYWcuc2V0QXR0cmlidXRlKFwic3R5bGVcIiwgXCJiYWNrZ3JvdW5kLWNvbG9yOlwiICsgY29sb3IgKyBcIjt3aWR0aDpcIiArIHdpZHRoICsgXCJweFwiICsgXCI7aGVpZ2h0OlwiICsgaGVpZ2h0ICsgXCJweFwiKTtcclxuICAgICAgICBzdmdUYWcuYXBwZW5kQ2hpbGQoY29iaik7XHJcbiAgICAgICAgdGhpcy5pbWFnZVRhZyA9IHN2Z1RhZztcclxuXHJcbiAgICAgICAgcmV0dXJuIHN2Z1RhZy5pbm5lckhUTUw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgR2VuZXJhdGUgdGhlIExldHRlciB0YWcgYnkgdXNpbmcgdGhlIHN2ZyB0ZXh0IGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXJcclxuICAgICAqIEBwYXJhbSB0ZXh0Q29sb3JcclxuICAgICAqIEBwYXJhbSBmb250RmFtaWx5XHJcbiAgICAgKiBAcGFyYW0gZm9udFdlaWdodFxyXG4gICAgICogQHBhcmFtIGZvbnRzaXplXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBwcml2YXRlIGdldENoYXJhY3RlclRleHRUYWcoY2hhcmFjdGVyOnN0cmluZywgdGV4dENvbG9yOiBzdHJpbmcsIGZvbnRGYW1pbHk6IHN0cmluZywgZm9udFdlaWdodDogc3RyaW5nLCBmb250c2l6ZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGxldCB0ZXh0VGFnOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0XCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIik7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiNTAlXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwieVwiLCBcIjUwJVwiKTtcclxuICAgICAgICB0ZXh0VGFnLnNldEF0dHJpYnV0ZShcImR5XCIsIFwiMC4zNWVtXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwicG9pbnRlci1ldmVudHNcIiwgXCJhdXRvXCIpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0ZXh0Q29sb3IpO1xyXG4gICAgICAgIHRleHRUYWcuc2V0QXR0cmlidXRlKFwiZm9udC1mYW1pbHlcIiwgZm9udEZhbWlseSk7XHJcbiAgICAgICAgdGV4dFRhZy5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcImZvbnQtd2VpZ2h0OlwiICsgZm9udFdlaWdodCArIFwiO2ZvbnQtc2l6ZTpcIiArIGZvbnRzaXplICsgXCJweFwiKTtcclxuICAgICAgICB0ZXh0VGFnLmlubmVyVGV4dCA9IGNoYXJhY3RlcjtcclxuICAgICAgICByZXR1cm4gdGV4dFRhZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcmFuZG9tIGNvbG9yc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRSYW5kb21Db2xvcnMoKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbGV0dGVyczogc3RyaW5nW10gPSBcIjAxMjM0NTY3ODlBQkNERUZcIi5zcGxpdChcIlwiKTtcclxuICAgICAgICBsZXQgX2NvbG9yOiBzdHJpbmcgPSBcIiNcIjtcclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgNjsgaSsrKSB7XHJcbiAgICAgICAgICAgIF9jb2xvciArPSBsZXR0ZXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBnZXQgdGhlIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZSBmaXJzdCBsZXR0ZXJzIGFuZCBjb21iaW5lZCBhbmQgZm9ybSB0aGUgbGV0dGVyIGF2YXRhclxyXG4gICAgICogQHBhcmFtIGRhdGFcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Rmlyc3RBbmRMYXN0TmFtZShkYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBuYW1lczogc3RyaW5nW10gPSBkYXRhLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICBpZiAobmFtZXMgJiYgbmFtZXMubGVuZ3RoID49IDIpIHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0TmFtZTogc3RyaW5nID0gbmFtZXNbMF07XHJcbiAgICAgICAgICAgIGxldCBsYXN0TmFtZTogc3RyaW5nID0gbmFtZXNbMV07XHJcbiAgICAgICAgICAgIGlmIChmaXJzdE5hbWUgJiYgbGFzdE5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmcgPSBmaXJzdE5hbWUuc3Vic3RyKDAsIDEpICsgbGFzdE5hbWUuc3Vic3RyKDAsIDEpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5zdWJzdHIoMCwgMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge05nTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1JiTGV0dGVyQXZhdGFyQ29tcG9uZW50fSBmcm9tIFwiLi9sZXR0ZXItYXZhdGFyL3JiLWxldHRlci1hdmF0YXIuY29tcG9uZW50XCI7XHJcblxyXG5cclxuQE5nTW9kdWxlKHtcclxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gICAgZGVjbGFyYXRpb25zOiBbUmJMZXR0ZXJBdmF0YXJDb21wb25lbnRdLFxyXG4gICAgcHJvdmlkZXJzOiBbXSxcclxuICAgIGV4cG9ydHM6IFtSYkxldHRlckF2YXRhckNvbXBvbmVudF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJiTGV0dGVyQXZhdGFyTW9kdWxlIHsgfVxyXG4iXSwibmFtZXMiOlsiQ29tcG9uZW50IiwiRWxlbWVudFJlZiIsIklucHV0IiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBLElBQUE7O2lDQUM4QixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7b0NBQzdSLFNBQVM7aUNBQ1osd0JBQXdCO3FDQUNwQix5SEFBeUg7bUNBQzNILElBQUk7aUNBQ04sSUFBSTtnQ0FDTCxJQUFJO2lDQUNILG9CQUFvQjtrQ0FDbkIsT0FBTztvQ0FDTCxHQUFHO3VDQUNELE9BQU87cUNBQ1IsS0FBSztxQ0FDTCxvR0FBb0c7O3FCQWJwSTtRQWNDLENBQUE7QUFkRCxJQWdCQSxJQUFBOztrQ0FDNkIsd0JBQXdCOzZCQUM3QixtQkFBbUI7aUNBQ2YsdUJBQXVCOzhCQUMxQixvQkFBb0I7NEJBQ3RCLGtCQUFrQjswQkFDcEIsZUFBZTt5QkFDaEIsY0FBYzswQkFDYixlQUFlO3VDQUNGLHdCQUF3QjsyQkFDcEMsZ0JBQWdCOzhCQUNiLG9CQUFvQjs4QkFDcEIsb0JBQW9CO3lCQUN6QixjQUFjO3dCQUNmLGFBQWE7NkJBQ1Isc0JBQXNCO2dDQUNwQixlQUFlOzt5QkFoQ3pDO1FBaUNDLENBQUE7OztRQ0lHLGlDQUFZLEVBQWM7eUJBeEJGLElBQUksTUFBTSxFQUFFOzZCQUNKLElBQUksVUFBVSxFQUFFO3dCQVdqQyw0QkFBNEI7NkJBSUssR0FB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