ngx-image-cropper
Version:
An image cropper for Angular
239 lines • 53.4 kB
JavaScript
export function checkCropperPosition(cropperPosition, cropperState, maintainSize) {
cropperPosition = checkCropperSizeRestriction(cropperPosition, cropperState);
return checkCropperWithinMaxSizeBounds(cropperPosition, cropperState, maintainSize);
}
export function checkCropperSizeRestriction(cropperPosition, cropperState) {
let cropperWidth = cropperPosition.x2 - cropperPosition.x1;
let cropperHeight = cropperPosition.y2 - cropperPosition.y1;
const centerX = cropperPosition.x1 + cropperWidth / 2;
const centerY = cropperPosition.y1 + cropperHeight / 2;
if (cropperState.options.cropperStaticHeight && cropperState.options.cropperStaticWidth) {
cropperWidth = cropperState.maxSize().width > cropperState.options.cropperStaticWidth
? cropperState.options.cropperStaticWidth
: cropperState.maxSize().width;
cropperHeight = cropperState.maxSize().height > cropperState.options.cropperStaticHeight
? cropperState.options.cropperStaticHeight
: cropperState.maxSize().height;
}
else {
cropperWidth = Math.max(cropperState.cropperScaledMinWidth, Math.min(cropperWidth, cropperState.cropperScaledMaxWidth, cropperState.maxSize().width));
cropperHeight = Math.max(cropperState.cropperScaledMinHeight, Math.min(cropperHeight, cropperState.cropperScaledMaxHeight, cropperState.maxSize().height));
if (cropperState.options.maintainAspectRatio) {
if (cropperState.maxSize().width / cropperState.options.aspectRatio < cropperState.maxSize().height) {
cropperHeight = cropperWidth / cropperState.options.aspectRatio;
}
else {
cropperWidth = cropperHeight * cropperState.options.aspectRatio;
}
}
}
const x1 = centerX - cropperWidth / 2;
const x2 = x1 + cropperWidth;
const y1 = centerY - cropperHeight / 2;
const y2 = y1 + cropperHeight;
return { x1, x2, y1, y2 };
}
export function checkCropperWithinMaxSizeBounds(position, cropperState, maintainSize = false) {
if (position.x1 < 0) {
position = {
...position,
x1: 0,
x2: position.x2 - (maintainSize ? position.x1 : 0)
};
}
if (position.y1 < 0) {
position = {
...position,
y2: position.y2 - (maintainSize ? position.y1 : 0),
y1: 0
};
}
if (position.x2 > cropperState.maxSize().width) {
position = {
...position,
x1: position.x1 - (maintainSize ? (position.x2 - cropperState.maxSize().width) : 0),
x2: cropperState.maxSize().width
};
}
if (position.y2 > cropperState.maxSize().height) {
position = {
...position,
y1: position.y1 - (maintainSize ? (position.y2 - cropperState.maxSize().height) : 0),
y2: cropperState.maxSize().height
};
}
return position;
}
export function moveCropper(event, moveStart) {
const diffX = getClientX(event) - moveStart.clientX;
const diffY = getClientY(event) - moveStart.clientY;
return {
x1: moveStart.cropper.x1 + diffX,
y1: moveStart.cropper.y1 + diffY,
x2: moveStart.cropper.x2 + diffX,
y2: moveStart.cropper.y2 + diffY
};
}
export function resizeCropper(event, moveStart, cropperState) {
const cropperPosition = { ...cropperState.cropper() };
const moveX = getClientX(event) - moveStart.clientX;
const moveY = getClientY(event) - moveStart.clientY;
switch (moveStart.position) {
case 'left':
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
break;
case 'topleft':
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
break;
case 'top':
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
break;
case 'topright':
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
cropperPosition.y1 = Math.min(Math.max(moveStart.cropper.y1 + moveY, cropperPosition.y2 - cropperState.cropperScaledMaxHeight), cropperPosition.y2 - cropperState.cropperScaledMinHeight);
break;
case 'right':
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
break;
case 'bottomright':
cropperPosition.x2 = Math.max(Math.min(moveStart.cropper.x2 + moveX, cropperPosition.x1 + cropperState.cropperScaledMaxWidth), cropperPosition.x1 + cropperState.cropperScaledMinWidth);
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
break;
case 'bottom':
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
break;
case 'bottomleft':
cropperPosition.x1 = Math.min(Math.max(moveStart.cropper.x1 + moveX, cropperPosition.x2 - cropperState.cropperScaledMaxWidth), cropperPosition.x2 - cropperState.cropperScaledMinWidth);
cropperPosition.y2 = Math.max(Math.min(moveStart.cropper.y2 + moveY, cropperPosition.y1 + cropperState.cropperScaledMaxHeight), cropperPosition.y1 + cropperState.cropperScaledMinHeight);
break;
case 'center':
const scale = 'scale' in event ? event.scale : 1;
const newWidth = Math.min(Math.max(cropperState.cropperScaledMinWidth, (Math.abs(moveStart.cropper.x2 - moveStart.cropper.x1)) * scale), cropperState.cropperScaledMaxWidth);
const newHeight = Math.min(Math.max(cropperState.cropperScaledMinHeight, (Math.abs(moveStart.cropper.y2 - moveStart.cropper.y1)) * scale), cropperState.cropperScaledMaxHeight);
cropperPosition.x1 = moveStart.clientX - newWidth / 2;
cropperPosition.x2 = moveStart.clientX + newWidth / 2;
cropperPosition.y1 = moveStart.clientY - newHeight / 2;
cropperPosition.y2 = moveStart.clientY + newHeight / 2;
if (cropperPosition.x1 < 0) {
cropperPosition.x2 -= cropperPosition.x1;
cropperPosition.x1 = 0;
}
else if (cropperPosition.x2 > cropperState.maxSize().width) {
cropperPosition.x1 -= (cropperPosition.x2 - cropperState.maxSize().width);
cropperPosition.x2 = cropperState.maxSize().width;
}
if (cropperPosition.y1 < 0) {
cropperPosition.y2 -= cropperPosition.y1;
cropperPosition.y1 = 0;
}
else if (cropperPosition.y2 > cropperState.maxSize().height) {
cropperPosition.y1 -= (cropperPosition.y2 - cropperState.maxSize().height);
cropperPosition.y2 = cropperState.maxSize().height;
}
break;
}
if (cropperState.options.maintainAspectRatio) {
return checkAspectRatio(moveStart.position, cropperPosition, cropperState);
}
else {
return cropperPosition;
}
}
export function checkAspectRatio(position, cropperPosition, cropperState) {
cropperPosition = { ...cropperPosition };
let overflowX = 0;
let overflowY = 0;
switch (position) {
case 'top':
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);
overflowY = Math.max(0 - cropperPosition.y1, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'bottom':
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : (overflowX / cropperState.options.aspectRatio);
}
break;
case 'topleft':
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(0 - cropperPosition.x1, 0);
overflowY = Math.max(0 - cropperPosition.y1, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'topright':
cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);
overflowY = Math.max(0 - cropperPosition.y1, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'right':
case 'bottomright':
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'left':
case 'bottomleft':
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
overflowX = Math.max(0 - cropperPosition.x1, 0);
overflowY = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);
if (overflowX > 0 || overflowY > 0) {
cropperPosition.x1 += (overflowY * cropperState.options.aspectRatio) > overflowX ? (overflowY * cropperState.options.aspectRatio) : overflowX;
cropperPosition.y2 -= (overflowY * cropperState.options.aspectRatio) > overflowX ? overflowY : overflowX / cropperState.options.aspectRatio;
}
break;
case 'center':
cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * cropperState.options.aspectRatio;
cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / cropperState.options.aspectRatio;
const overflowX1 = Math.max(0 - cropperPosition.x1, 0);
const overflowX2 = Math.max(cropperPosition.x2 - cropperState.maxSize().width, 0);
const overflowY1 = Math.max(cropperPosition.y2 - cropperState.maxSize().height, 0);
const overflowY2 = Math.max(0 - cropperPosition.y1, 0);
if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {
cropperPosition.x1 += (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? (overflowY1 * cropperState.options.aspectRatio) : overflowX1;
cropperPosition.x2 -= (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? (overflowY2 * cropperState.options.aspectRatio) : overflowX2;
cropperPosition.y1 += (overflowY2 * cropperState.options.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / cropperState.options.aspectRatio;
cropperPosition.y2 -= (overflowY1 * cropperState.options.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / cropperState.options.aspectRatio;
}
break;
}
return cropperPosition;
}
export function getClientX(event) {
if ('touches' in event && event.touches[0]) {
return event.touches[0].clientX;
}
else if ('clientX' in event) {
return event.clientX;
}
return 0;
}
export function getClientY(event) {
if ('touches' in event && event.touches[0]) {
return event.touches[0].clientY;
}
else if ('clientX' in event) {
return event.clientY;
}
return 0;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci1wb3NpdGlvbi51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvdXRpbHMvY3JvcHBlci1wb3NpdGlvbi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsZUFBZ0MsRUFBRSxZQUEwQixFQUFFLFlBQXFCO0lBQ3RILGVBQWUsR0FBRywyQkFBMkIsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTywrQkFBK0IsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsZUFBZ0MsRUFBRSxZQUEwQjtJQUN0RyxJQUFJLFlBQVksR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUM7SUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzVELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFFdkQsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4RixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQjtZQUNuRixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7WUFDekMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7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QyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDNUgsZUFBZSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUM1RCxNQUFNO1FBQ1IsS0FBSyxRQUFRO1lBQ1gsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQzdHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQzlHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3ZDLGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGVBQWUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZE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QUUsQ0FBQztRQUMzQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBc0M7SUFDL0QsSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7U0FBTSxJQUFJLFNBQVMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyb3BwZXJQb3NpdGlvbiwgTW92ZVN0YXJ0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDcm9wcGVyU3RhdGUgfSBmcm9tICcuLi9jb21wb25lbnQvY3JvcHBlci5zdGF0ZSc7XG5pbXBvcnQgeyBCYXNpY0V2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9iYXNpYy1ldmVudC5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDcm9wcGVyUG9zaXRpb24oY3JvcHBlclBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBtYWludGFpblNpemU6IGJvb2xlYW4pOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjcm9wcGVyUG9zaXRpb24gPSBjaGVja0Nyb3BwZXJTaXplUmVzdHJpY3Rpb24oY3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGUpO1xuICByZXR1cm4gY2hlY2tDcm9wcGVyV2l0aGluTWF4U2l6ZUJvdW5kcyhjcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZSwgbWFpbnRhaW5TaXplKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ3JvcHBlclNpemVSZXN0cmljdGlvbihjcm9wcGVyUG9zaXRpb246IENyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBsZXQgY3JvcHBlcldpZHRoID0gY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxO1xuICBsZXQgY3JvcHBlckhlaWdodCA9IGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MTtcbiAgY29uc3QgY2VudGVyWCA9IGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJXaWR0aCAvIDI7XG4gIGNvbnN0IGNlbnRlclkgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVySGVpZ2h0IC8gMjtcblxuICBpZiAoY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodCAmJiBjcm9wcGVyU3RhdGUub3B0aW9ucy5jcm9wcGVyU3RhdGljV2lkdGgpIHtcbiAgICBjcm9wcGVyV2lkdGggPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLndpZHRoID4gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY1dpZHRoXG4gICAgICA/IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNXaWR0aFxuICAgICAgOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLndpZHRoO1xuICAgIGNyb3BwZXJIZWlnaHQgPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodCA+IGNyb3BwZXJTdGF0ZS5vcHRpb25zLmNyb3BwZXJTdGF0aWNIZWlnaHRcbiAgICAgID8gY3JvcHBlclN0YXRlLm9wdGlvbnMuY3JvcHBlclN0YXRpY0hlaWdodFxuICAgICAgOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodDtcbiAgfSBlbHNlIHtcbiAgICBjcm9wcGVyV2lkdGggPSBNYXRoLm1heChjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoLCBNYXRoLm1pbihjcm9wcGVyV2lkdGgsIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgsIGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkud2lkdGgpKTtcbiAgICBjcm9wcGVySGVpZ2h0ID0gTWF0aC5tYXgoY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQsIE1hdGgubWluKGNyb3BwZXJIZWlnaHQsIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0LCBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodCkpO1xuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBpZiAoY3JvcHBlclN0YXRlLm1heFNpemUoKS53aWR0aCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvIDwgY3JvcHBlclN0YXRlLm1heFNpemUoKS5oZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlckhlaWdodCA9IGNyb3BwZXJXaWR0aCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JvcHBlcldpZHRoID0gY3JvcHBlckhlaWdodCAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHgxID0gY2VudGVyWCAtIGNyb3BwZXJXaWR0aCAvIDI7XG4gIGNvbnN0IHgyID0geDEgKyBjcm9wcGVyV2lkdGg7XG4gIGNvbnN0IHkxID0gY2VudGVyWSAtIGNyb3BwZXJIZWlnaHQgLyAyO1xuICBjb25zdCB5MiA9IHkxICsgY3JvcHBlckhlaWdodDtcbiAgcmV0dXJuIHt4MSwgeDIsIHkxLCB5Mn07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Nyb3BwZXJXaXRoaW5NYXhTaXplQm91bmRzKHBvc2l0aW9uOiBDcm9wcGVyUG9zaXRpb24sIGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlLCBtYWludGFpblNpemUgPSBmYWxzZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGlmIChwb3NpdGlvbi54MSA8IDApIHtcbiAgICBwb3NpdGlvbiA9IHtcbiAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgeDE6IDAsXG4gICAgICB4MjogcG9zaXRpb24ueDIgLSAobWFpbnRhaW5TaXplID8gcG9zaXRpb24ueDEgOiAwKVxuICAgIH07XG4gIH1cbiAgaWYgKHBvc2l0aW9uLnkxIDwgMCkge1xuICAgIHBvc2l0aW9uID0ge1xuICAgICAgLi4ucG9zaXRpb24sXG4gICAgICB5MjogcG9zaXRpb24ueTIgLSAobWFpbnRhaW5TaXplID8gcG9zaXRpb24ueTEgOiAwKSxcbiAgICAgIHkxOiAwXG4gICAgfTtcbiAgfVxuICBpZiAocG9zaXRpb24ueDIgPiBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLndpZHRoKSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHgxOiBwb3NpdGlvbi54MSAtIChtYWludGFpblNpemUgPyAocG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLndpZHRoKSA6IDApLFxuICAgICAgeDI6IGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkud2lkdGhcbiAgICB9O1xuICB9XG4gIGlmIChwb3NpdGlvbi55MiA+IGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkuaGVpZ2h0KSB7XG4gICAgcG9zaXRpb24gPSB7XG4gICAgICAuLi5wb3NpdGlvbixcbiAgICAgIHkxOiBwb3NpdGlvbi55MSAtIChtYWludGFpblNpemUgPyAocG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodCkgOiAwKSxcbiAgICAgIHkyOiBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHBvc2l0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW92ZUNyb3BwZXIoZXZlbnQ6IEV2ZW50IHwgQmFzaWNFdmVudCwgbW92ZVN0YXJ0OiBNb3ZlU3RhcnQpOiBDcm9wcGVyUG9zaXRpb24ge1xuICBjb25zdCBkaWZmWCA9IGdldENsaWVudFgoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFg7XG4gIGNvbnN0IGRpZmZZID0gZ2V0Q2xpZW50WShldmVudCkgLSBtb3ZlU3RhcnQuY2xpZW50WTtcblxuICByZXR1cm4ge1xuICAgIHgxOiBtb3ZlU3RhcnQuY3JvcHBlci54MSArIGRpZmZYLFxuICAgIHkxOiBtb3ZlU3RhcnQuY3JvcHBlci55MSArIGRpZmZZLFxuICAgIHgyOiBtb3ZlU3RhcnQuY3JvcHBlci54MiArIGRpZmZYLFxuICAgIHkyOiBtb3ZlU3RhcnQuY3JvcHBlci55MiArIGRpZmZZXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVDcm9wcGVyKGV2ZW50OiBFdmVudCB8IEJhc2ljRXZlbnQsIG1vdmVTdGFydDogTW92ZVN0YXJ0LCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGNvbnN0IGNyb3BwZXJQb3NpdGlvbiA9IHsuLi5jcm9wcGVyU3RhdGUuY3JvcHBlcigpfTtcbiAgY29uc3QgbW92ZVggPSBnZXRDbGllbnRYKGV2ZW50KSAtIG1vdmVTdGFydC5jbGllbnRYO1xuICBjb25zdCBtb3ZlWSA9IGdldENsaWVudFkoZXZlbnQpIC0gbW92ZVN0YXJ0LmNsaWVudFk7XG4gIHN3aXRjaCAobW92ZVN0YXJ0LnBvc2l0aW9uKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBNYXRoLm1pbihNYXRoLm1heChtb3ZlU3RhcnQuY3JvcHBlci54MSArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b3BsZWZ0JzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLngxICsgbW92ZVgsIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbldpZHRoKTtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLnkxICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSA9IE1hdGgubWluKE1hdGgubWF4KG1vdmVTdGFydC5jcm9wcGVyLnkxICsgbW92ZVksIGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0KSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wcmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueDIgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueTEgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci54MiArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdib3R0b21yaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci54MiArIG1vdmVYLCBjcm9wcGVyUG9zaXRpb24ueDEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heFdpZHRoKSxcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci55MiArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBNYXRoLm1heChNYXRoLm1pbihtb3ZlU3RhcnQuY3JvcHBlci55MiArIG1vdmVZLCBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MSArIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbWxlZnQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gTWF0aC5taW4oTWF0aC5tYXgobW92ZVN0YXJ0LmNyb3BwZXIueDEgKyBtb3ZlWCwgY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCksXG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgpO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gTWF0aC5tYXgoTWF0aC5taW4obW92ZVN0YXJ0LmNyb3BwZXIueTIgKyBtb3ZlWSwgY3JvcHBlclBvc2l0aW9uLnkxICsgY3JvcHBlclN0YXRlLmNyb3BwZXJTY2FsZWRNYXhIZWlnaHQpLFxuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKyBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1pbkhlaWdodCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY29uc3Qgc2NhbGUgPSAnc2NhbGUnIGluIGV2ZW50ID8gZXZlbnQuc2NhbGUgYXMgbnVtYmVyIDogMTtcbiAgICAgIGNvbnN0IG5ld1dpZHRoID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluV2lkdGgsIChNYXRoLmFicyhtb3ZlU3RhcnQuY3JvcHBlci54MiAtIG1vdmVTdGFydC5jcm9wcGVyLngxKSkgKiBzY2FsZSksXG4gICAgICAgIGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWF4V2lkdGgpO1xuICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KGNyb3BwZXJTdGF0ZS5jcm9wcGVyU2NhbGVkTWluSGVpZ2h0LCAoTWF0aC5hYnMobW92ZVN0YXJ0LmNyb3BwZXIueTIgLSBtb3ZlU3RhcnQuY3JvcHBlci55MSkpICogc2NhbGUpLFxuICAgICAgICBjcm9wcGVyU3RhdGUuY3JvcHBlclNjYWxlZE1heEhlaWdodCk7XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDEgPSBtb3ZlU3RhcnQuY2xpZW50WCAtIG5ld1dpZHRoIC8gMjtcbiAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiA9IG1vdmVTdGFydC5jbGllbnRYICsgbmV3V2lkdGggLyAyO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gbW92ZVN0YXJ0LmNsaWVudFkgLSBuZXdIZWlnaHQgLyAyO1xuICAgICAgY3JvcHBlclBvc2l0aW9uLnkyID0gbW92ZVN0YXJ0LmNsaWVudFkgKyBuZXdIZWlnaHQgLyAyO1xuICAgICAgaWYgKGNyb3BwZXJQb3NpdGlvbi54MSA8IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngyIC09IGNyb3BwZXJQb3NpdGlvbi54MTtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoY3JvcHBlclBvc2l0aW9uLngyID4gY3JvcHBlclN0YXRlLm1heFNpemUoKS53aWR0aCkge1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDEgLT0gKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkud2lkdGgpO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLndpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGNyb3BwZXJQb3NpdGlvbi55MSA8IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC09IGNyb3BwZXJQb3NpdGlvbi55MTtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoY3JvcHBlclBvc2l0aW9uLnkyID4gY3JvcHBlclN0YXRlLm1heFNpemUoKS5oZWlnaHQpIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxIC09IChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodCk7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi55MiA9IGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkuaGVpZ2h0O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gIH1cblxuICBpZiAoY3JvcHBlclN0YXRlLm9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpbykge1xuICAgIHJldHVybiBjaGVja0FzcGVjdFJhdGlvKG1vdmVTdGFydC5wb3NpdGlvbiEsIGNyb3BwZXJQb3NpdGlvbiwgY3JvcHBlclN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JvcHBlclBvc2l0aW9uO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FzcGVjdFJhdGlvKHBvc2l0aW9uOiBzdHJpbmcsIGNyb3BwZXJQb3NpdGlvbjogQ3JvcHBlclBvc2l0aW9uLCBjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gIGNyb3BwZXJQb3NpdGlvbiA9IHsuLi5jcm9wcGVyUG9zaXRpb259O1xuICBsZXQgb3ZlcmZsb3dYID0gMDtcbiAgbGV0IG92ZXJmbG93WSA9IDA7XG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLngyID0gY3JvcHBlclBvc2l0aW9uLngxICsgKGNyb3BwZXJQb3NpdGlvbi55MiAtIGNyb3BwZXJQb3NpdGlvbi55MSkgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkud2lkdGgsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueDIgPSBjcm9wcGVyUG9zaXRpb24ueDEgKyAoY3JvcHBlclBvc2l0aW9uLnkyIC0gY3JvcHBlclBvc2l0aW9uLnkxKSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUoKS53aWR0aCwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodCwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC09IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiAob3ZlcmZsb3dYIC8gY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wbGVmdCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTEgPSBjcm9wcGVyUG9zaXRpb24ueTIgLSAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi54MSwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heCgwIC0gY3JvcHBlclBvc2l0aW9uLnkxLCAwKTtcbiAgICAgIGlmIChvdmVyZmxvd1ggPiAwIHx8IG92ZXJmbG93WSA+IDApIHtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLngxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pIDogb3ZlcmZsb3dYO1xuICAgICAgICBjcm9wcGVyUG9zaXRpb24ueTEgKz0gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA+IG92ZXJmbG93WCA/IG92ZXJmbG93WSA6IG92ZXJmbG93WCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wcmlnaHQnOlxuICAgICAgY3JvcHBlclBvc2l0aW9uLnkxID0gY3JvcHBlclBvc2l0aW9uLnkyIC0gKGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJQb3NpdGlvbi54MSkgLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIG92ZXJmbG93WCA9IE1hdGgubWF4KGNyb3BwZXJQb3NpdGlvbi54MiAtIGNyb3BwZXJTdGF0ZS5tYXhTaXplKCkud2lkdGgsIDApO1xuICAgICAgb3ZlcmZsb3dZID0gTWF0aC5tYXgoMCAtIGNyb3BwZXJQb3NpdGlvbi55MSwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkxICs9IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICBjYXNlICdib3R0b21yaWdodCc6XG4gICAgICBjcm9wcGVyUG9zaXRpb24ueTIgPSBjcm9wcGVyUG9zaXRpb24ueTEgKyAoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclBvc2l0aW9uLngxKSAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgb3ZlcmZsb3dYID0gTWF0aC5tYXgoY3JvcHBlclBvc2l0aW9uLngyIC0gY3JvcHBlclN0YXRlLm1heFNpemUoKS53aWR0aCwgMCk7XG4gICAgICBvdmVyZmxvd1kgPSBNYXRoLm1heChjcm9wcGVyUG9zaXRpb24ueTIgLSBjcm9wcGVyU3RhdGUubWF4U2l6ZSgpLmhlaWdodCwgMCk7XG4gICAgICBpZiAob3ZlcmZsb3dYID4gMCB8fCBvdmVyZmxvd1kgPiAwKSB7XG4gICAgICAgIGNyb3BwZXJQb3NpdGlvbi54MiAtPSAob3ZlcmZsb3dZICogY3JvcHBlclN0YXRlLm9wdGlvbnMuYXNwZWN0UmF0aW8pID4gb3ZlcmZsb3dYID8gKG92ZXJmbG93WSAqIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKSA6IG92ZXJmbG93WDtcbiAgICAgICAgY3JvcHBlclBvc2l0aW9uLnkyIC09IChvdmVyZmxvd1kgKiBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbykgPiBvdmVyZmxvd1ggPyBvdmVyZmxvd1kgOiBvdmVyZmxvd1ggLyBjcm9wcGVyU3RhdGUub3B0aW9ucy5hc3BlY3RSYXRpbztcbiAgICAgIH1cbiAgICAgIGJ