@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
233 lines • 20.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding, ViewChild, ElementRef, HostListener, Output, EventEmitter, Input } from '@angular/core';
import { hexToRgb, rgbToHex, rgbToHsv } from './color-utils';
var ColorPalette = /** @class */ (function () {
function ColorPalette() {
this.baseClass = true;
this.colorChange = new EventEmitter(true);
this.mousedown = false;
}
/**
* @return {?}
*/
ColorPalette.prototype.draw = /**
* @return {?}
*/
function () {
if (!this.ctx) {
this.ctx = this.canvas.nativeElement.getContext('2d');
}
/** @type {?} */
var width = this.canvas.nativeElement.width;
/** @type {?} */
var height = this.canvas.nativeElement.height;
if (this.hue) {
this.ctx.fillStyle = this.hue;
}
else {
this.ctx.fillStyle = '#ff0000';
}
this.ctx.fillRect(0, 0, width, height);
/** @type {?} */
var whiteGrad = this.ctx.createLinearGradient(0, 0, width, 0);
whiteGrad.addColorStop(0, 'rgba(255,255,255,1)');
whiteGrad.addColorStop(1, 'rgba(255,255,255,0)');
this.ctx.fillStyle = whiteGrad;
this.ctx.fillRect(0, 0, width, height);
/** @type {?} */
var blackGrad = this.ctx.createLinearGradient(0, 0, 0, height);
blackGrad.addColorStop(0, 'rgba(0,0,0,0)');
blackGrad.addColorStop(1, 'rgba(0,0,0,1)');
this.ctx.fillStyle = blackGrad;
this.ctx.fillRect(0, 0, width, height);
if (this.selectedPosition) {
this.ctx.strokeStyle = 'white';
this.ctx.fillStyle = 'white';
this.ctx.beginPath();
this.ctx.arc(this.selectedPosition.x, this.selectedPosition.y, 5, 0, 2 * Math.PI);
this.ctx.lineWidth = 3;
this.ctx.stroke();
this.ctx.closePath();
}
};
/**
* @param {?} changes
* @return {?}
*/
ColorPalette.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.color && !changes.color.isFirstChange()) {
/** @type {?} */
var rgbColor = hexToRgb(this.color);
if (rgbColor) {
/** @type {?} */
var hsv = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b);
this.selectedPosition = {
x: (hsv.s * 250) / 100,
y: 250 - (hsv.v * 250) / 100
};
this.draw();
}
}
else if (changes.hue && !changes.hue.isFirstChange()) {
this.draw();
/** @type {?} */
var pos = this.selectedPosition;
if (pos) {
this.colorChange.emit(this.getColorAtPosition(pos.x, pos.y));
}
}
};
/**
* @return {?}
*/
ColorPalette.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.color) {
/** @type {?} */
var rgbColor = hexToRgb(this.color);
if (rgbColor) {
/** @type {?} */
var hsv = rgbToHsv(rgbColor.r, rgbColor.g, rgbColor.b);
this.selectedPosition = {
x: (hsv.s * 250) / 100,
y: 250 - (hsv.v * 250) / 100
};
}
}
this.draw();
};
/**
* @param {?} evt
* @return {?}
*/
ColorPalette.prototype.onMouseUp = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
this.mousedown = false;
};
/**
* @param {?} evt
* @return {?}
*/
ColorPalette.prototype.onMouseDown = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
this.mousedown = true;
/** @type {?} */
var xPos = evt.offsetX < 0 ? 0 : evt.offsetX >= 250 ? 249 : evt.offsetX;
/** @type {?} */
var yPos = evt.offsetY < 0 ? 0 : evt.offsetY >= 250 ? 249 : evt.offsetY;
this.selectedPosition = {
x: xPos,
y: yPos,
};
this.draw();
this.emitColor(xPos, yPos);
};
/**
* @param {?} evt
* @return {?}
*/
ColorPalette.prototype.onMouseMove = /**
* @param {?} evt
* @return {?}
*/
function (evt) {
if (this.mousedown) {
/** @type {?} */
var xPos = evt.offsetX < 0 ? 0 : evt.offsetX >= 250 ? 249 : evt.offsetX;
/** @type {?} */
var yPos = evt.offsetY < 0 ? 0 : evt.offsetY >= 250 ? 249 : evt.offsetY;
this.selectedPosition = {
x: xPos,
y: yPos,
};
this.draw();
this.emitColor(xPos, yPos);
}
};
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
ColorPalette.prototype.emitColor = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
/** @type {?} */
var rgbaColor = this.getColorAtPosition(x, y);
this.colorChange.emit(rgbaColor);
};
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
ColorPalette.prototype.getColorAtPosition = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
/** @type {?} */
var imageData = this.ctx.getImageData(x, y, 1, 1).data;
return rgbToHex(imageData[0], imageData[1], imageData[2]);
};
ColorPalette.decorators = [
{ type: Component, args: [{
selector: 'suka-color-palette',
template: "\n <canvas\n #canvas\n class=\"color-palette\"\n width=\"250\"\n height=\"250\"\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n >\n </canvas>\n "
}] }
];
ColorPalette.propDecorators = {
baseClass: [{ type: HostBinding, args: ['class.color-palette-container',] }],
hue: [{ type: Input }],
color: [{ type: Input }],
colorChange: [{ type: Output }],
canvas: [{ type: ViewChild, args: ['canvas', { static: false },] }],
onMouseUp: [{ type: HostListener, args: ['window:mouseup', ['$event'],] }]
};
return ColorPalette;
}());
export { ColorPalette };
if (false) {
/** @type {?} */
ColorPalette.prototype.baseClass;
/** @type {?} */
ColorPalette.prototype.hue;
/** @type {?} */
ColorPalette.prototype.color;
/** @type {?} */
ColorPalette.prototype.colorChange;
/** @type {?} */
ColorPalette.prototype.canvas;
/**
* @type {?}
* @private
*/
ColorPalette.prototype.ctx;
/**
* @type {?}
* @private
*/
ColorPalette.prototype.mousedown;
/** @type {?} */
ColorPalette.prototype.selectedPosition;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsZXR0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvY29sb3ItcGlja2VyL2NvbG9yLXBhbGV0dGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUVWLFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUVaLEtBQUssRUFFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFdkU7SUFBQTtRQWVnRCxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBS3JELGdCQUFXLEdBQXlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBTTdELGNBQVMsR0FBRyxLQUFLLENBQUM7SUFrSTVCLENBQUM7Ozs7SUE5SEMsMkJBQUk7OztJQUFKO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2RDs7WUFFSyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSzs7WUFDdkMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU07UUFFL0MsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxF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LENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7Ozs7SUFFRCx5Q0FBa0I7Ozs7O0lBQWxCLFVBQW1CLENBQVMsRUFBRSxDQUFTOztZQUMvQixTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN4RCxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7O2dCQTNKRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFLHdOQVVUO2lCQUNGOzs7NEJBRUUsV0FBVyxTQUFDLCtCQUErQjtzQkFFM0MsS0FBSzt3QkFFTCxLQUFLOzhCQUNMLE1BQU07eUJBRU4sU0FBUyxTQUFDLFFBQVEsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7NEJBNkZuQyxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBeUM1QyxtQkFBQztDQUFBLEFBNUpELElBNEpDO1NBOUlZLFlBQVk7OztJQUN2QixpQ0FBK0Q7O0lBRS9ELDJCQUFxQjs7SUFFckIsNkJBQXVCOztJQUN2QixtQ0FBcUU7O0lBRXJFLDhCQUE0RTs7Ozs7SUFFNUUsMkJBQXNDOzs7OztJQUV0QyxpQ0FBMEI7O0lBRTFCLHdDQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSG9zdEJpbmRpbmcsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgSG9zdExpc3RlbmVyLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBJbnB1dCxcbiAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGhleFRvUmdiLCByZ2JUb0hleCwgcmdiVG9Ic3YsIGhzdlRvSGV4IH0gZnJvbSAnLi9jb2xvci11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtY29sb3ItcGFsZXR0ZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGNhbnZhc1xuICAgICAgI2NhbnZhc1xuICAgICAgY2xhc3M9XCJjb2xvci1wYWxldHRlXCJcbiAgICAgIHdpZHRoPVwiMjUwXCJcbiAgICAgIGhlaWdodD1cIjI1MFwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgPC9jYW52YXM+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JQYWxldHRlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jb2xvci1wYWxldHRlLWNvbnRhaW5lcicpIGJhc2VDbGFzcyA9IHRydWU7XG5cbiAgQElucHV0KCkgaHVlOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY29sb3I6IHN0cmluZztcbiAgQE91dHB1dCgpIGNvbG9yQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7XG5cbiAgQFZpZXdDaGlsZCgnY2FudmFzJywge3N0YXRpYzogZmFsc2V9KSBjYW52YXM6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuXG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgcHJpdmF0ZSBtb3VzZWRvd24gPSBmYWxzZTtcblxuICBwdWJsaWMgc2VsZWN0ZWRQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuXG4gIGRyYXcoKSB7XG4gICAgaWYgKCF0aGlzLmN0eCkge1xuICAgICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmdldENvbnRleHQoJzJkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQuaGVpZ2h0O1xuXG4gICAgaWYgKHRoaXMuaHVlKSB7XG4gICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSB0aGlzLmh1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdHguZmlsbFN0eWxlID0gJyNmZjAwMDAnO1xuICAgIH1cblxuICAgIHRoaXMuY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgY29uc3Qgd2hpdGVHcmFkID0gdGhpcy5jdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgd2lkdGgsIDApO1xuICAgIHdoaXRlR3JhZC5hZGRDb2xvclN0b3AoMCwgJ3JnYmEoMjU1LDI1NSwyNTUsMSknKTtcbiAgICB3aGl0ZUdyYWQuYWRkQ29sb3JTdG9wKDEsICdyZ2JhKDI1NSwyNTUsMjU1LDApJyk7XG5cbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSB3aGl0ZUdyYWQ7XG4gICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBjb25zdCBibGFja0dyYWQgPSB0aGlzLmN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCAwLCBoZWlnaHQpO1xuICAgIGJsYWNrR3JhZC5hZGRDb2xvclN0b3AoMCwgJ3JnYmEoMCwwLDAsMCknKTtcbiAgICBibGFja0dyYWQuYWRkQ29sb3JTdG9wKDEsICdyZ2JhKDAsMCwwLDEpJyk7XG5cbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBibGFja0dyYWQ7XG4gICAgdGhpcy5jdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9ICd3aGl0ZSc7XG4gICAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSAnd2hpdGUnO1xuICAgICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgICB0aGlzLmN0eC5hcmMoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbi54LFxuICAgICAgICB0aGlzLnNlbGVjdGVkUG9zaXRpb24ueSxcbiAgICAgICAgNSxcbiAgICAgICAgMCxcbiAgICAgICAgMiAqIE1hdGguUElcbiAgICAgICk7XG4gICAgICB0aGlzLmN0eC5saW5lV2lkdGggPSAzO1xuICAgICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gICAgICB0aGlzLmN0eC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuY29sb3IgJiYgIWNoYW5nZXMuY29sb3IuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICBjb25zdCByZ2JDb2xvciA9IGhleFRvUmdiKHRoaXMuY29sb3IpO1xuXG4gICAgICBpZiAocmdiQ29sb3IpIHtcbiAgICAgICAgY29uc3QgaHN2ID0gcmdiVG9Ic3YocmdiQ29sb3IuciwgcmdiQ29sb3IuZywgcmdiQ29sb3IuYik7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgICB4OiAoaHN2LnMgKiAyNTApIC8gMTAwLFxuICAgICAgICAgIHk6IDI1MCAtIChoc3YudiAqIDI1MCkgLyAxMDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzLmh1ZSAmJiAhY2hhbmdlcy5odWUuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICB0aGlzLmRyYXcoKTtcblxuICAgICAgY29uc3QgcG9zID0gdGhpcy5zZWxlY3RlZFBvc2l0aW9uO1xuXG4gICAgICBpZiAocG9zKSB7XG4gICAgICAgIHRoaXMuY29sb3JDaGFuZ2UuZW1pdCh0aGlzLmdldENvbG9yQXRQb3NpdGlvbihwb3MueCwgcG9zLnkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuY29sb3IpIHtcbiAgICAgIGNvbnN0IHJnYkNvbG9yID0gaGV4VG9SZ2IodGhpcy5jb2xvcik7XG5cbiAgICAgIGlmIChyZ2JDb2xvcikge1xuICAgICAgICBjb25zdCBoc3YgPSByZ2JUb0hzdihyZ2JDb2xvci5yLCByZ2JDb2xvci5nLCByZ2JDb2xvci5iKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFBvc2l0aW9uID0ge1xuICAgICAgICAgIHg6IChoc3YucyAqIDI1MCkgLyAxMDAsXG4gICAgICAgICAgeTogMjUwIC0gKGhzdi52ICogMjUwKSAvIDEwMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRyYXcoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZVVwKGV2dDogTW91c2VFdmVudCkge1xuICAgIHRoaXMubW91c2Vkb3duID0gZmFsc2U7XG4gIH1cblxuICBvbk1vdXNlRG93bihldnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLm1vdXNlZG93biA9IHRydWU7XG4gICAgY29uc3QgeFBvcyA9IGV2dC5vZmZzZXRYIDwgMCA/IDAgOiBldnQub2Zmc2V0WCA+PSAyNTAgPyAyNDkgOiBldnQub2Zmc2V0WDtcbiAgICBjb25zdCB5UG9zID0gZXZ0Lm9mZnNldFkgPCAwID8gMCA6IGV2dC5vZmZzZXRZID49IDI1MCA/IDI0OSA6IGV2dC5vZmZzZXRZO1xuXG4gICAgdGhpcy5zZWxlY3RlZFBvc2l0aW9uID0ge1xuICAgICAgeDogeFBvcyxcbiAgICAgIHk6IHlQb3MsXG4gICAgfTtcbiAgICB0aGlzLmRyYXcoKTtcbiAgICB0aGlzLmVtaXRDb2xvcih4UG9zLCB5UG9zKTtcbiAgfVxuXG4gIG9uTW91c2VNb3ZlKGV2dDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLm1vdXNlZG93bikge1xuICAgICAgY29uc3QgeFBvcyA9IGV2dC5vZmZzZXRYIDwgMCA/IDAgOiBldnQub2Zmc2V0WCA+PSAyNTAgPyAyNDkgOiBldnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHlQb3MgPSBldnQub2Zmc2V0WSA8IDAgPyAwIDogZXZ0Lm9mZnNldFkgPj0gMjUwID8gMjQ5IDogZXZ0Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogeFBvcyxcbiAgICAgICAgeTogeVBvcyxcbiAgICAgIH07XG4gICAgICB0aGlzLmRyYXcoKTtcbiAgICAgIHRoaXMuZW1pdENvbG9yKHhQb3MsIHlQb3MpO1xuICAgIH1cbiAgfVxuXG4gIGVtaXRDb2xvcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGNvbnN0IHJnYmFDb2xvciA9IHRoaXMuZ2V0Q29sb3JBdFBvc2l0aW9uKHgsIHkpO1xuICAgIHRoaXMuY29sb3JDaGFuZ2UuZW1pdChyZ2JhQ29sb3IpO1xuICB9XG5cbiAgZ2V0Q29sb3JBdFBvc2l0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKHgsIHksIDEsIDEpLmRhdGE7XG4gICAgcmV0dXJuIHJnYlRvSGV4KGltYWdlRGF0YVswXSwgaW1hZ2VEYXRhWzFdLCBpbWFnZURhdGFbMl0pO1xuICB9XG59XG4iXX0=