Problem: Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral. 

Input

The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide. 

Output

Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.

Examples

Input

5
0 0
0 4
4 0
4 4
2 3


Output

16.000000

Note

In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;

public class MaxArea {
	public static void main(String[] args) throws IOException
	{
		BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(rd.readLine());
		StringTokenizer st;
		x = new int[n];
		y = new int[n];
		for(int i=0; i<n; i++){
			st = new StringTokenizer(rd.readLine());
			x[i] = Integer.parseInt(st.nextToken());
			y[i] = Integer.parseInt(st.nextToken());
		}
		int best = 0;
		for(int i=0; i<n; i++){
			for(int j=i+1; j<n; j++){
				int b = areaFor(i, j);
				best = Math.max(best, b);
			}
		}
		System.out.println(0.5*best);
	}
	
	
	
	static int areaFor(int a, int b){
		int maxAreaSignPos = 0, maxAreaSignNeg = 0;
		int numPos = 0, numNeg = 0;
		for(int i=0; i<n; i++){
			if(i==a || i==b) continue;
			int sig = sign(a, b, i);
			if(sig<0){
				numNeg++;
				maxAreaSignNeg = Math.max(maxAreaSignNeg, Math.abs(sig));
			}
			else{
				numPos++;
				maxAreaSignPos = Math.max(maxAreaSignPos, Math.abs(sig));
			}
		}
		if(numPos>0 && numNeg>0) return maxAreaSignPos+maxAreaSignNeg;
		return -1;
	}
	
	static int sign(int i, int j, int k){
		int x1 = x[i], y1 = y[i], x2 = x[j], y2 = y[j], x3 = x[k], y3 = y[k];
		return (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
	}
	
	
	static int n;
	
	static int[] x, y;
	
}