@radial-color-picker/angular-color-picker
Version:
Radial Color Picker - Angular
145 lines • 16 kB
JavaScript
export const hexToRgb = (hex) => {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
const r = parseInt(result[1], 16);
const g = parseInt(result[2], 16);
const b = parseInt(result[3], 16);
return { r, g, b };
};
export const extractRGB = (rgb) => {
const result = /^(?:rgb\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\))$/i.exec(rgb);
const r = parseInt(result[1], 10);
const g = parseInt(result[2], 10);
const b = parseInt(result[3], 10);
return { r, g, b };
};
export const extractHSL = (hsl) => {
const result = /^(?:hsl\((\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\))$/i.exec(hsl);
const h = parseInt(result[1], 10);
const s = parseInt(result[2], 10);
const l = parseInt(result[3], 10);
return { h, s, l };
};
/**
* Converts RGB color model to hexadecimal string.
*
* @memberOf Utilities
*
* @param r Integer between 0 and 255
* @param g Integer between 0 and 255
* @param b Integer between 0 and 255
*
* @return 6 char long hex string
*/
export const rgbToHex = (r, g, b) => {
// tslint:disable-next-line:no-bitwise
return ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
};
/**
* Converts RGB color model to HSL model.
*
* @memberOf Utilities
*
* @param r Integer between 0 and 255
* @param g Integer between 0 and 255
* @param Integer between 0 and 255
*
* @return The HSL representation containing the hue (in degrees),
* saturation (in percentage) and luminosity (in percentage) fields.
*/
export const rgbToHsl = (r, g, b) => {
r = r / 255;
g = g / 255;
b = b / 255;
let h, s;
const max = Math.max(r, g, b);
const min = Math.min(r, g, b);
const l = (max + min) / 2;
if (max === min) {
h = s = 0; // achromatic
}
else {
const d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
if (max === r) {
h = (g - b) / d + (g < b ? 6 : 0);
}
if (max === g) {
h = (b - r) / d + 2;
}
if (max === b) {
h = (r - g) / d + 4;
}
}
return {
hue: h * 60,
saturation: s * 100,
luminosity: l * 100
};
};
/**
* Converts HSL color model to hexademical string.
*
* @memberOf Utilities
*
* @param h Integer between 0 and 360
* @param s Integer between 0 and 100
* @param l Integer between 0 and 50
*
* @return 6 char long hex string
*/
export const hslToHex = (h, s, l) => {
const colorModel = hslToRgb(h, s, l);
return rgbToHex(colorModel.red, colorModel.green, colorModel.blue);
};
/**
* Converts HSL color model to RGB model.
* Shamelessly taken from http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
*
* @memberOf Utilities
*
* @param h The hue. Number in the 0-360 range
* @param s The saturation. Number in the 0-100 range
* @param l The luminosity. Number in the 0-100 range
*
* @return The RGB representation containing the red, green and blue fields
*/
export const hslToRgb = (h, s, l) => {
let r, g, b;
h = h / 360;
s = s / 100;
l = l / 100;
if (s === 0) {
r = g = b = l; // achromatic
}
else {
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
const p = 2 * l - q;
r = _hue2rgb(p, q, h + 1 / 3);
g = _hue2rgb(p, q, h);
b = _hue2rgb(p, q, h - 1 / 3);
}
return {
red: Math.round(r * 255),
green: Math.round(g * 255),
blue: Math.round(b * 255)
};
};
export const _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;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJhZGlhbC1jb2xvci1waWNrZXIvYW5ndWxhci1jb2xvci1waWNrZXIvIiwic291cmNlcyI6WyJsaWIvaGVscGVycy9jb2xvci1mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFDOUIsTUFBTSxNQUFNLEdBQUcsMkNBQTJDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFO0lBQ2hDLE1BQU0sTUFBTSxHQUFHLHlEQUF5RCxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNoQyxNQUFNLE1BQU0sR0FBRywyREFBMkQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckYsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDckIsQ0FBQyxDQUFDO0FBSUY7Ozs7Ozs7Ozs7RUFVRTtBQUNGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFVLEVBQUU7SUFDbEUsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQTJELEVBQUU7SUFDbkgsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNaLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRVosSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFMUIsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO1FBQ2YsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhO0tBQ3pCO1NBQU07UUFDTCxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRXBCLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFFcEQsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ2IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkM7UUFDRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDYixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNyQjtRQUNELElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNiLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO0tBQ0Y7SUFFRCxPQUFPO1FBQ0wsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFO1FBQ1gsVUFBVSxFQUFFLENBQUMsR0FBRyxHQUFHO1FBQ25CLFVBQVUsRUFBRSxDQUFDLEdBQUcsR0FBRztLQUNwQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFVLEVBQUU7SUFDbEUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRSxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFnRCxFQUFFO0lBQ2hGLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFWixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNaLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ1osQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFFWixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDWCxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhO0tBQzdCO1NBQU07UUFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwQixDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDL0I7SUFFRCxPQUFPO1FBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDMUIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ1QsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNSO0lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ1QsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNSO0lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDNUI7SUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2IsT0FBTyxDQUFDLENBQUM7S0FDVjtJQUNELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3RDO0lBRUQsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgaGV4VG9SZ2IgPSAoaGV4KSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XHJcbiAgY29uc3QgciA9IHBhcnNlSW50KHJlc3VsdFsxXSwgMTYpO1xyXG4gIGNvbnN0IGcgPSBwYXJzZUludChyZXN1bHRbMl0sIDE2KTtcclxuICBjb25zdCBiID0gcGFyc2VJbnQocmVzdWx0WzNdLCAxNik7XHJcblxyXG4gIHJldHVybiB7IHIsIGcsIGIgfTtcclxufTtcclxuZXhwb3J0IGNvbnN0IGV4dHJhY3RSR0IgPSAocmdiKSA9PiB7XHJcbiAgY29uc3QgcmVzdWx0ID0gL14oPzpyZ2JcXCgoXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXCkpJC9pLmV4ZWMocmdiKTtcclxuICBjb25zdCByID0gcGFyc2VJbnQocmVzdWx0WzFdLCAxMCk7XHJcbiAgY29uc3QgZyA9IHBhcnNlSW50KHJlc3VsdFsyXSwgMTApO1xyXG4gIGNvbnN0IGIgPSBwYXJzZUludChyZXN1bHRbM10sIDEwKTtcclxuXHJcbiAgcmV0dXJuIHsgciwgZywgYiB9O1xyXG59O1xyXG5leHBvcnQgY29uc3QgZXh0cmFjdEhTTCA9IChoc2wpID0+IHtcclxuICBjb25zdCByZXN1bHQgPSAvXig/OmhzbFxcKChcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pJVxccyosXFxzKihcXGR7MSwzfSklXFwpKSQvaS5leGVjKGhzbCk7XHJcbiAgY29uc3QgaCA9IHBhcnNlSW50KHJlc3VsdFsxXSwgMTApO1xyXG4gIGNvbnN0IHMgPSBwYXJzZUludChyZXN1bHRbMl0sIDEwKTtcclxuICBjb25zdCBsID0gcGFyc2VJbnQocmVzdWx0WzNdLCAxMCk7XHJcblxyXG4gIHJldHVybiB7IGgsIHMsIGwgfTtcclxufTtcclxuXHJcblxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIFJHQiBjb2xvciBtb2RlbCB0byBoZXhhZGVjaW1hbCBzdHJpbmcuXHJcbiAqXHJcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcclxuICpcclxuICogQHBhcmFtIHIgSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NVxyXG4gKiBAcGFyYW0gZyBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XHJcbiAqIEBwYXJhbSBiIEludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTVcclxuICpcclxuICogQHJldHVybiA2IGNoYXIgbG9uZyBoZXggc3RyaW5nXHJcbiovXHJcbmV4cG9ydCBjb25zdCByZ2JUb0hleCA9IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxyXG4gIHJldHVybiAoKDEgPDwgMjQpICsgKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiKS50b1N0cmluZygxNikuc2xpY2UoMSk7XHJcbn07XHJcblxyXG4vKipcclxuICogQ29udmVydHMgUkdCIGNvbG9yIG1vZGVsIHRvIEhTTCBtb2RlbC5cclxuICpcclxuICogQG1lbWJlck9mIFV0aWxpdGllc1xyXG4gKlxyXG4gKiBAcGFyYW0gciBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1XHJcbiAqIEBwYXJhbSBnIEludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTVcclxuICogQHBhcmFtIEludGVnZXIgYmV0d2VlbiAwIGFuZCAyNTVcclxuICpcclxuICogQHJldHVybiBUaGUgSFNMIHJlcHJlc2VudGF0aW9uIGNvbnRhaW5pbmcgdGhlIGh1ZSAoaW4gZGVncmVlcyksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiAoaW4gcGVyY2VudGFnZSkgYW5kIGx1bWlub3NpdHkgKGluIHBlcmNlbnRhZ2UpIGZpZWxkcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCByZ2JUb0hzbCA9IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogeyBodWU6IG51bWJlciwgc2F0dXJhdGlvbjogbnVtYmVyLCBsdW1pbm9zaXR5OiBudW1iZXIgfSA9PiB7XHJcbiAgciA9IHIgLyAyNTU7XHJcbiAgZyA9IGcgLyAyNTU7XHJcbiAgYiA9IGIgLyAyNTU7XHJcblxyXG4gIGxldCBoLCBzO1xyXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xyXG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xyXG4gIGNvbnN0IGwgPSAobWF4ICsgbWluKSAvIDI7XHJcblxyXG4gIGlmIChtYXggPT09IG1pbikge1xyXG4gICAgaCA9IHMgPSAwOyAvLyBhY2hyb21hdGljXHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IGQgPSBtYXggLSBtaW47XHJcblxyXG4gICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xyXG5cclxuICAgIGlmIChtYXggPT09IHIpIHtcclxuICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApO1xyXG4gICAgfVxyXG4gICAgaWYgKG1heCA9PT0gZykge1xyXG4gICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xyXG4gICAgfVxyXG4gICAgaWYgKG1heCA9PT0gYikge1xyXG4gICAgICBoID0gKHIgLSBnKSAvIGQgKyA0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGh1ZTogaCAqIDYwLFxyXG4gICAgc2F0dXJhdGlvbjogcyAqIDEwMCxcclxuICAgIGx1bWlub3NpdHk6IGwgKiAxMDBcclxuICB9O1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENvbnZlcnRzIEhTTCBjb2xvciBtb2RlbCB0byBoZXhhZGVtaWNhbCBzdHJpbmcuXHJcbiAqXHJcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcclxuICpcclxuICogQHBhcmFtIGggSW50ZWdlciBiZXR3ZWVuIDAgYW5kIDM2MFxyXG4gKiBAcGFyYW0gcyBJbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwXHJcbiAqIEBwYXJhbSBsIEludGVnZXIgYmV0d2VlbiAwIGFuZCA1MFxyXG4gKlxyXG4gKiBAcmV0dXJuIDYgY2hhciBsb25nIGhleCBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBjb25zdCBoc2xUb0hleCA9IChoOiBudW1iZXIsIHM6IG51bWJlciwgbDogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBjb2xvck1vZGVsID0gaHNsVG9SZ2IoaCwgcywgbCk7XHJcblxyXG4gIHJldHVybiByZ2JUb0hleChjb2xvck1vZGVsLnJlZCwgY29sb3JNb2RlbC5ncmVlbiwgY29sb3JNb2RlbC5ibHVlKTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0cyBIU0wgY29sb3IgbW9kZWwgdG8gUkdCIG1vZGVsLlxyXG4gKiBTaGFtZWxlc3NseSB0YWtlbiBmcm9tIGh0dHA6Ly9heG9uZmx1eC5jb20vaGFuZHktcmdiLXRvLWhzbC1hbmQtcmdiLXRvLWhzdi1jb2xvci1tb2RlbC1jXHJcbiAqXHJcbiAqIEBtZW1iZXJPZiBVdGlsaXRpZXNcclxuICpcclxuICogQHBhcmFtIGggVGhlIGh1ZS4gTnVtYmVyIGluIHRoZSAwLTM2MCByYW5nZVxyXG4gKiBAcGFyYW0gcyBUaGUgc2F0dXJhdGlvbi4gTnVtYmVyIGluIHRoZSAwLTEwMCByYW5nZVxyXG4gKiBAcGFyYW0gbCBUaGUgbHVtaW5vc2l0eS4gTnVtYmVyIGluIHRoZSAwLTEwMCByYW5nZVxyXG4gKlxyXG4gKiBAcmV0dXJuIFRoZSBSR0IgcmVwcmVzZW50YXRpb24gY29udGFpbmluZyB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBmaWVsZHNcclxuICovXHJcbmV4cG9ydCBjb25zdCBoc2xUb1JnYiA9IChoLCBzLCBsKTogeyByZWQ6IG51bWJlciwgZ3JlZW46IG51bWJlciwgYmx1ZTogbnVtYmVyIH0gPT4ge1xyXG4gIGxldCByLCBnLCBiO1xyXG5cclxuICBoID0gaCAvIDM2MDtcclxuICBzID0gcyAvIDEwMDtcclxuICBsID0gbCAvIDEwMDtcclxuXHJcbiAgaWYgKHMgPT09IDApIHtcclxuICAgIHIgPSBnID0gYiA9IGw7IC8vIGFjaHJvbWF0aWNcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XHJcbiAgICBjb25zdCBwID0gMiAqIGwgLSBxO1xyXG5cclxuICAgIHIgPSBfaHVlMnJnYihwLCBxLCBoICsgMSAvIDMpO1xyXG4gICAgZyA9IF9odWUycmdiKHAsIHEsIGgpO1xyXG4gICAgYiA9IF9odWUycmdiKHAsIHEsIGggLSAxIC8gMyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcmVkOiBNYXRoLnJvdW5kKHIgKiAyNTUpLFxyXG4gICAgZ3JlZW46IE1hdGgucm91bmQoZyAqIDI1NSksXHJcbiAgICBibHVlOiBNYXRoLnJvdW5kKGIgKiAyNTUpXHJcbiAgfTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBfaHVlMnJnYiA9IChwLCBxLCB0KSA9PiB7XHJcbiAgaWYgKHQgPCAwKSB7XHJcbiAgICB0ICs9IDE7XHJcbiAgfVxyXG4gIGlmICh0ID4gMSkge1xyXG4gICAgdCAtPSAxO1xyXG4gIH1cclxuICBpZiAodCA8IDEgLyA2KSB7XHJcbiAgICByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcclxuICB9XHJcbiAgaWYgKHQgPCAxIC8gMikge1xyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG4gIGlmICh0IDwgMiAvIDMpIHtcclxuICAgIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcclxuICB9XHJcblxyXG4gIHJldHVybiBwO1xyXG59O1xyXG4iXX0=