UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

254 lines (253 loc) 32.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export class ColorUtils { /** * @param {?} value * @return {?} */ static isHexValue(value) { let /** @type {?} */ isHexValue = /^#[0-9A-F]{6}$/i.test(value); return isHexValue; } /** * @param {?} hex * @return {?} */ static hexToRGB(hex) { let /** @type {?} */ c = []; if (!hex.startsWith("#")) { c = ("#" + hex).substring(1).split(''); } else { c = hex.substring(1).split(''); } if (c.length == 3) { c = [c[0], c[0], c[1], c[1], c[2], c[2]]; } c = '0x' + c.join(''); return 'rgb(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',') + ')'; } /** * @param {?} value * @return {?} */ static componentToHex(value) { let /** @type {?} */ hex = value.toString(16); return hex.length == 1 ? "0" + hex : hex; } /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ static rgbToHex(r, g, b) { return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b); } /** * @param {?} hex * @param {?} percentage * @return {?} */ static shadeHexColor(hex, percentage) { let /** @type {?} */ hexString = hex; if (hex.startsWith("#")) { hexString = hex.substr(1); } let /** @type {?} */ num = parseInt(hexString, 16); let /** @type {?} */ amt = Math.round(2.55 * percentage); let /** @type {?} */ R = (num >> 16) + amt; let /** @type {?} */ G = (num >> 8 & 0x00FF) + amt; let /** @type {?} */ B = (num & 0x0000FF) + amt; return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1); } /** * @param {?} r * @param {?} g * @param {?} b * @param {?} percentage * @return {?} */ static shadeRGBColor(r, g, b, percentage) { // let f = color.split(","); let /** @type {?} */ t = percentage < 0 ? 0 : 255; let /** @type {?} */ p = percentage < 0 ? percentage * -1 : percentage; let /** @type {?} */ R = (Math.round((t - r) * p) + r); let /** @type {?} */ RString = R + ""; if (RString.length > 3) { RString = RString.substr(0, 3); } let /** @type {?} */ G = (Math.round((t - g) * p) + g); let /** @type {?} */ GString = G + ""; if (GString.length > 3) { GString = GString.substr(0, 3); } let /** @type {?} */ B = (Math.round((t - b) * p) + b); let /** @type {?} */ BString = B + ""; if (BString.length > 3) { BString = BString.substr(0, 3); } return "rgb(" + RString + "," + GString + "," + BString + ")"; } /** * @param {?} color1 * @param {?} color2 * @param {?} point * @return {?} */ static blendHexColors(color1, color2, point) { if (color1.length == 4) { color1 = color1[1] + color1[1] + color1[2] + color1[2] + color1[3] + color1[3]; } else { color1 = color1.substring(1); } if (color2.length == 4) { color2 = color2[1] + color2[1] + color2[2] + color2[2] + color2[3] + color2[3]; } else { color2 = color2.substring(1); } // we have valid input, convert colors to rgb let /** @type {?} */ color1Array = [parseInt(color1[0] + color1[1], 16), parseInt(color1[2] + color1[3], 16), parseInt(color1[4] + color1[5], 16)]; let /** @type {?} */ color2Array = [parseInt(color2[0] + color2[1], 16), parseInt(color2[2] + color2[3], 16), parseInt(color2[4] + color2[5], 16)]; // blend let /** @type {?} */ color3 = [ (1 - point) * color1Array[0] + point * color2Array[0], (1 - point) * color1Array[1] + point * color2Array[1], (1 - point) * color1Array[2] + point * color2Array[2] ]; // convert to hex return '#' + this.componentToHex(Math.round(color3[0])) + this.componentToHex(Math.round(color3[1])) + this.componentToHex(Math.round(color3[2])); } /** * @param {?} hueDegree * @param {?} saturation * @param {?} brightness * @return {?} */ static hsbToRGB(hueDegree, saturation, brightness) { if (hueDegree < 0) { hueDegree = 0; } if (hueDegree >= 360) { hueDegree = 359; } if (saturation < 0) { saturation = 0; } if (saturation > 100) { saturation = 100; } if (brightness < 0) { brightness = 0; } if (brightness > 100) { brightness = 100; } hueDegree /= 360; saturation /= 100; brightness /= 100; let /** @type {?} */ r, /** @type {?} */ g, /** @type {?} */ b; if (saturation === 0) { r = g = b = brightness; // achromatic } else { const /** @type {?} */ hue2rgb = (p, q, t) => { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; const /** @type {?} */ q = brightness < 0.5 ? brightness * (1 + saturation) : brightness + saturation - brightness * saturation; const /** @type {?} */ p = 2 * brightness - q; r = hue2rgb(p, q, hueDegree + 1 / 3); g = hue2rgb(p, q, hueDegree); b = hue2rgb(p, q, hueDegree - 1 / 3); } let /** @type {?} */ rgbArray = [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; return "rgb(" + rgbArray[0] + "," + rgbArray[1] + "," + rgbArray[2] + ")"; } /** * @param {?} hueDegree * @param {?} saturation * @param {?} brightness * @return {?} */ static hsbToHex(hueDegree, saturation, brightness) { let /** @type {?} */ rgbString = this.hsbToRGB(hueDegree, saturation, brightness); let /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(','); return this.rgbToHex(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); } /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ static rgbToHsl(r, g, b) { r /= 255; g /= 255; b /= 255; let /** @type {?} */ max = Math.max(r, g, b); let /** @type {?} */ min = Math.min(r, g, b); let /** @type {?} */ h, /** @type {?} */ s, /** @type {?} */ l = (max + min) / 2; if (max == min) { h = s = 0; // achromatic } else { let /** @type {?} */ d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return [h, s, l]; } /** * @param {?} hex * @return {?} */ static hexToHsl(hex) { let /** @type {?} */ rgbString = this.hexToRGB(hex); let /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(','); return this.rgbToHsl(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); } /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ static rgbToHue(r, g, b) { return Math.round(this.rgbToHsl(r, g, b)[0] * 360); } /** * @param {?} hex * @return {?} */ static hexToHue(hex) { let /** @type {?} */ rgbString = this.hexToRGB(hex); let /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(','); return this.rgbToHue(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sb3JVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0NvbG9yVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE1BQU07Ozs7O0lBQ0ssTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ2xDLHFCQUFJLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Ozs7O0lBR2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFXO1FBQzlCLHFCQUFJLENBQUMsR0FBUSxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Ozs7OztJQUd4RSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQVU7UUFDbkMscUJBQUksR0FBRyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7O0lBR3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7SUFJbkYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDdkQscUJBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUVELHFCQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLHFCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQztRQUN4QyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O0lBSXBLLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsVUFBa0I7O1FBRTNFLHFCQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxxQkFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDdEQscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQzs7Ozs7Ozs7SUFJM0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFFLEtBQWE7UUFFdEUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEM7UUFBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQzs7UUFHRCxxQkFBSSxXQUFXLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xJLHFCQUFJLFdBQVcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1FBR2xJLHFCQUFJLE1BQU0sR0FBRztZQUNULENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNyRCxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ3hELENBQUM7O1FBR0YsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7SUFNL0ksTUFBTSxDQUFDLFFBQVEsQ0FB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Q0FBQztRQUU5RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztDQUVsRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBDb2xvclV0aWxzIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzSGV4VmFsdWUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNIZXhWYWx1ZSA9IC9eI1swLTlBLUZdezZ9JC9pLnRlc3QodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBpc0hleFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGV4VG9SR0IoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYzogYW55ID0gW107XG4gICAgICAgIGlmICghaGV4LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgICBjID0gKFwiI1wiICsgaGV4KS5zdWJzdHJpbmcoMSkuc3BsaXQoJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyA9IGhleC5zdWJzdHJpbmcoMSkuc3BsaXQoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgIGMgPSBbY1swXSwgY1swXSwgY1sxXSwgY1sxXSwgY1syXSwgY1syXV07XG4gICAgICAgIH1cbiAgICAgICAgYyA9ICcweCcgKyBjLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiAncmdiKCcgKyBbKGMgPj4gMTYpICYgMjU1LCAoYyA+PiA4KSAmIDI1NSwgYyAmIDI1NV0uam9pbignLCcpICsgJyknO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY29tcG9uZW50VG9IZXgodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBoZXg6IHN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKDE2KTtcblxuICAgICAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PSAxID8gXCIwXCIgKyBoZXggOiBoZXg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZ2JUb0hleChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy5jb21wb25lbnRUb0hleChyKSArIHRoaXMuY29tcG9uZW50VG9IZXgoZykgKyB0aGlzLmNvbXBvbmVudFRvSGV4KGIpO1xuICAgIH1cblxuICAgIC8vIHBlcmNlbnRhZ2UgPT4gYXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDBcbiAgICBwdWJsaWMgc3RhdGljIHNoYWRlSGV4Q29sb3IoaGV4OiBzdHJpbmcsIHBlcmNlbnRhZ2U6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBoZXhTdHJpbmc6IHN0cmluZyA9IGhleDtcbiAgICAgICAgaWYgKGhleC5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICAgICAgaGV4U3RyaW5nID0gaGV4LnN1YnN0cigxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBudW0gPSBwYXJzZUludChoZXhTdHJpbmcsIDE2KTtcbiAgICAgICAgbGV0IGFtdCA9IE1hdGgucm91bmQoMi41NSAqIHBlcmNlbnRhZ2UpO1xuICAgICAgICBsZXQgUiA9IChudW0gPj4gMTYpICsgYW10O1xuICAgICAgICBsZXQgRyA9IChudW0gPj4gOCAmIDB4MDBGRikgKyBhbXQ7XG4gICAgICAgIGxldCBCID0gKG51bSAmIDB4MDAwMEZGKSArIGFtdDtcbiAgICAgICAgcmV0dXJuICcjJyArICgweDEwMDAwMDAgKyAoUiA8IDI1NSA/IFIgPCAxID8gMCA6IFIgOiAyNTUpICogMHgxMDAwMCArIChHIDwgMjU1ID8gRyA8IDEgPyAwIDogRyA6IDI1NSkgKiAweDEwMCArIChCIDwgMjU1ID8gQiA8IDEgPyAwIDogQiA6IDI1NSkpLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcbiAgICB9XG5cbiAgICAvLyBwZXJjZW50YWdlID0+IGFzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwXG4gICAgcHVibGljIHN0YXRpYyBzaGFkZVJHQkNvbG9yKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIHBlcmNlbnRhZ2U6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIGxldCBmID0gY29sb3Iuc3BsaXQoXCIsXCIpO1xuICAgICAgICBsZXQgdCA9IHBlcmNlbnRhZ2UgPCAwID8gMCA6IDI1NTtcbiAgICAgICAgbGV0IHAgPSBwZXJjZW50YWdlIDwgMCA/IHBlcmNlbnRhZ2UgKiAtMSA6IHBlcmNlbnRhZ2U7XG4gICAgICAgIGxldCBSID0gKE1hdGgucm91bmQoKHQgLSByKSAqIHApICsgcik7XG4gICAgICAgIGxldCBSU3RyaW5nID0gUiArIFwiXCI7XG4gICAgICAgIGlmIChSU3RyaW5nLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIFJTdHJpbmcgPSBSU3RyaW5nLnN1YnN0cigwLCAzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgRyA9IChNYXRoLnJvdW5kKCh0IC0gZykgKiBwKSArIGcpO1xuICAgICAgICBsZXQgR1N0cmluZyA9IEcgKyBcIlwiO1xuICAgICAgICBpZiAoR1N0cmluZy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICBHU3RyaW5nID0gR1N0cmluZy5zdWJzdHIoMCwgMyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IEIgPSAoTWF0aC5yb3VuZCgodCAtIGIpICogcCkgKyBiKTtcbiAgICAgICAgbGV0IEJTdHJpbmcgPSBCICsgXCJcIjtcbiAgICAgICAgaWYgKEJTdHJpbmcubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgQlN0cmluZyA9IEJTdHJpbmcuc3Vic3RyKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwicmdiKFwiICsgUlN0cmluZyArIFwiLFwiICsgR1N0cmluZyArIFwiLFwiICsgQlN0cmluZyArIFwiKVwiO1xuICAgIH1cblxuICAgIC8vIHBvaW50ID0+IHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBmaXJzdCBjb2xvciwgYXMgYSBkZWNpbWFsIGJldHdlZW4gMCBhbmQgMVxuICAgIHB1YmxpYyBzdGF0aWMgYmxlbmRIZXhDb2xvcnMoY29sb3IxOiBzdHJpbmcsIGNvbG9yMjogc3RyaW5nLCBwb2ludDogbnVtYmVyKTogc3RyaW5nIHtcblxuICAgICAgICBpZiAoY29sb3IxLmxlbmd0aCA9PSA0KSB7XG4gICAgICAgICAgICBjb2xvcjEgPSBjb2xvcjFbMV0gKyBjb2xvcjFbMV0gKyBjb2xvcjFbMl0gKyBjb2xvcjFbMl0gKyBjb2xvcjFbM10gKyBjb2xvcjFbM107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2xvcjEgPSBjb2xvcjEuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9IGlmIChjb2xvcjIubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgIGNvbG9yMiA9IGNvbG9yMlsxXSArIGNvbG9yMlsxXSArIGNvbG9yMlsyXSArIGNvbG9yMlsyXSArIGNvbG9yMlszXSArIGNvbG9yMlszXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yMiA9IGNvbG9yMi5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBoYXZlIHZhbGlkIGlucHV0LCBjb252ZXJ0IGNvbG9ycyB0byByZ2JcbiAgICAgICAgbGV0IGNvbG9yMUFycmF5ID0gW3BhcnNlSW50KGNvbG9yMVswXSArIGNvbG9yMVsxXSwgMTYpLCBwYXJzZUludChjb2xvcjFbMl0gKyBjb2xvcjFbM10sIDE2KSwgcGFyc2VJbnQoY29sb3IxWzRdICsgY29sb3IxWzVdLCAxNildO1xuICAgICAgICBsZXQgY29sb3IyQXJyYXkgPSBbcGFyc2VJbnQoY29sb3IyWzBdICsgY29sb3IyWzFdLCAxNiksIHBhcnNlSW50KGNvbG9yMlsyXSArIGNvbG9yMlszXSwgMTYpLCBwYXJzZUludChjb2xvcjJbNF0gKyBjb2xvcjJbNV0sIDE2KV07XG5cbiAgICAgICAgLy8gYmxlbmRcbiAgICAgICAgbGV0IGNvbG9yMyA9IFtcbiAgICAgICAgICAgICgxIC0gcG9pbnQpICogY29sb3IxQXJyYXlbMF0gKyBwb2ludCAqIGNvbG9yMkFycmF5WzBdLFxuICAgICAgICAgICAgKDEgLSBwb2ludCkgKiBjb2xvcjFBcnJheVsxXSArIHBvaW50ICogY29sb3IyQXJyYXlbMV0sXG4gICAgICAgICAgICAoMSAtIHBvaW50KSAqIGNvbG9yMUFycmF5WzJdICsgcG9pbnQgKiBjb2xvcjJBcnJheVsyXVxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdG8gaGV4XG4gICAgICAgIHJldHVybiAnIycgKyB0aGlzLmNvbXBvbmVudFRvSGV4KE1hdGgucm91bmQoY29sb3IzWzBdKSkgKyB0aGlzLmNvbXBvbmVudFRvSGV4KE1hdGgucm91bmQoY29sb3IzWzFdKSkgKyB0aGlzLmNvbXBvbmVudFRvSGV4KE1hdGgucm91bmQoY29sb3IzWzJdKSk7XG4gICAgfVxuXG4gICAgLy8gaHVlIC0+IGRlZ3JlZSBudW1iZXIgYmV0d2VlbiAwIC0gMzU5XG4gICAgLy8gc2F0dXJhdGlvbiAtPiBwZXJjZW50YWdlIG51bWJlciBiZXR3ZWVuIDAgLSAxMDBcbiAgICAvLyBicmlnaHRuZXNzIC0+IHBlcmNlbnRhZ2UgbnVtYmVyIGJldHdlZW4gMCAtIDEwMFxuICAgIHB1YmxpYyBzdGF0aWMgaHNiVG9SR0IoaHVlRGVncmVlOiBudW1iZXIsIHNhdHVyYXRpb246IG51bWJlciwgYnJpZ2h0bmVzczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGh1ZURlZ3JlZSA8IDApIHtcbiAgICAgICAgICAgIGh1ZURlZ3JlZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGh1ZURlZ3JlZSA+PSAzNjApIHtcbiAgICAgICAgICAgIGh1ZURlZ3JlZSA9IDM1OTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2F0dXJhdGlvbiA8IDApIHtcbiAgICAgICAgICAgIHNhdHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYXR1cmF0aW9uID4gMTAwKSB7XG4gICAgICAgICAgICBzYXR1cmF0aW9uID0gMTAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmlnaHRuZXNzIDwgMCkge1xuICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyaWdodG5lc3MgPiAxMDApIHtcbiAgICAgICAgICAgIGJyaWdodG5lc3MgPSAxMDA7XG4gICAgICAgIH1cblxuICAgICAgICBodWVEZWdyZWUgLz0gMzYwO1xuICAgICAgICBzYXR1cmF0aW9uIC89IDEwMDtcbiAgICAgICAgYnJpZ2h0bmVzcyAvPSAxMDA7XG5cbiAgICAgICAgbGV0IHIsIGcsIGI7XG4gICAgICAgIGlmIChzYXR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByID0gZyA9IGIgPSBicmlnaHRuZXNzOyAvLyBhY2hyb21hdGljXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBodWUycmdiID0gKHA6IGFueSwgcTogYW55LCB0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDApIHQgKz0gMTtcbiAgICAgICAgICAgICAgICBpZiAodCA+IDEpIHQgLT0gMTtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDEgLyAyKSByZXR1cm4gcTtcbiAgICAgICAgICAgICAgICBpZiAodCA8IDIgLyAzKSByZXR1cm4gcCArIChxIC0gcCkgKiAoMiAvIDMgLSB0KSAqIDY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBxID0gYnJpZ2h0bmVzcyA8IDAuNSA/IGJyaWdodG5lc3MgKiAoMSArIHNhdHVyYXRpb24pIDogYnJpZ2h0bmVzcyArIHNhdHVyYXRpb24gLSBicmlnaHRuZXNzICogc2F0dXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IHAgPSAyICogYnJpZ2h0bmVzcyAtIHE7XG4gICAgICAgICAgICByID0gaHVlMnJnYihwLCBxLCBodWVEZWdyZWUgKyAxIC8gMyk7XG4gICAgICAgICAgICBnID0gaHVlMnJnYihwLCBxLCBodWVEZWdyZWUpO1xuICAgICAgICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaHVlRGVncmVlIC0gMSAvIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJnYkFycmF5ID0gW01hdGgucm91bmQociAqIDI1NSksIE1hdGgucm91bmQoZyAqIDI1NSksIE1hdGgucm91bmQoYiAqIDI1NSldO1xuXG4gICAgICAgIHJldHVybiBcInJnYihcIiArIHJnYkFycmF5WzBdICsgXCIsXCIgKyByZ2JBcnJheVsxXSArIFwiLFwiICsgcmdiQXJyYXlbMl0gKyBcIilcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhzYlRvSGV4KGh1ZURlZ3JlZTogbnVtYmVyLCBzYXR1cmF0aW9uOiBudW1iZXIsIGJyaWdodG5lc3M6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCByZ2JTdHJpbmcgPSB0aGlzLmhzYlRvUkdCKGh1ZURlZ3JlZSwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcyk7XG4gICAgICAgIGxldCByZ2I6IHN0cmluZ1tdID0gcmdiU3RyaW5nLnN1YnN0cmluZyg0LCByZ2JTdHJpbmcubGVuZ3RoIC0gMSkucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZ2JUb0hleChwYXJzZUludChyZ2JbMF0pLCBwYXJzZUludChyZ2JbMV0pLCBwYXJzZUludChyZ2JbMl0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJnYlRvSHNsKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIHIgLz0gMjU1O1xuICAgICAgICBnIC89IDI1NTtcbiAgICAgICAgYiAvPSAyNTU7XG5cbiAgICAgICAgbGV0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICAgICAgICBsZXQgbWluID0gTWF0aC5taW4ociwgZywgYik7XG4gICAgICAgIGxldCBoLCBzLCBsID0gKG1heCArIG1pbikgLyAyO1xuXG4gICAgICAgIGlmIChtYXggPT0gbWluKSB7XG4gICAgICAgICAgICBoID0gcyA9IDA7IC8vIGFjaHJvbWF0aWNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkID0gbWF4IC0gbWluO1xuICAgICAgICAgICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgICAgICAgICAgc3dpdGNoIChtYXgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIHI6IGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBnOiBoID0gKGIgLSByKSAvIGQgKyAyOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGI6IGggPSAociAtIGcpIC8gZCArIDQ7IGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaCAvPSA2O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtoLCBzLCBsXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhleFRvSHNsKGhleDogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgICAgICBsZXQgcmdiU3RyaW5nID0gdGhpcy5oZXhUb1JHQihoZXgpO1xuICAgICAgICBsZXQgcmdiOiBzdHJpbmdbXSA9IHJnYlN0cmluZy5zdWJzdHJpbmcoNCwgcmdiU3RyaW5nLmxlbmd0aCAtIDEpLnJlcGxhY2UoLyAvZywgJycpLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmdiVG9Ic2wocGFyc2VJbnQocmdiWzBdKSwgcGFyc2VJbnQocmdiWzFdKSwgcGFyc2VJbnQocmdiWzJdKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZ2JUb0h1ZShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5yZ2JUb0hzbChyLCBnLCBiKVswXSAqIDM2MCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoZXhUb0h1ZShoZXg6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCByZ2JTdHJpbmcgPSB0aGlzLmhleFRvUkdCKGhleCk7XG4gICAgICAgIGxldCByZ2I6IHN0cmluZ1tdID0gcmdiU3RyaW5nLnN1YnN0cmluZyg0LCByZ2JTdHJpbmcubGVuZ3RoIC0gMSkucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZ2JUb0h1ZShwYXJzZUludChyZ2JbMF0pLCBwYXJzZUludChyZ2JbMV0pLCBwYXJzZUludChyZ2JbMl0pKTtcbiAgICB9XG59XG4iXX0=