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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class A {

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);

		int n = sc.nextInt();
		Point[] pts = new Point[n];
		for(int i = 0; i < n; ++i)
			pts[i] = new Point(sc.nextInt(), sc.nextInt());
		double ans = 0;
		for(int i = 0; i < n; ++i)
			for(int j = i + 1; j < n; ++j)
			{
				Point pi = pts[i], pj = pts[j], pk;
				double leftArea = -10, rightArea = -10;
				for(int k = 0; k < n; ++k)
					if(k != i && k != j)
					{
						pk = pts[k];
						if(ccw(pi, pj, pk))
							leftArea = Math.max(leftArea, area(pi, pj, pk));
						else
							rightArea = Math.max(rightArea, area(pj, pi, pk));
					}
				if(leftArea > -1 && rightArea > -1)
					ans = Math.max(ans, leftArea + rightArea);
			}
		out.println(ans);
		out.flush();
		out.close();
	}
	
	static boolean ccw(Point p, Point q, Point r)
	{
		Vector pq = new Vector(p, q), pr = new Vector(p, r);
		return pq.cross(pr) > 0;
	}
	
	static class Point
	{
		int x, y;
		
		Point(int a, int b) { x = a; y = b; }
		
		double dist(Point p) { return Math.sqrt(sq(x - p.x) + sq(y - p.y)); }
		
		double sq(double x) { return x * x; }
	}
	
	static class Vector
	{
		int x, y;
		
		Vector(Point a, Point b)
		{
			x = b.x - a.x;
			y = b.y - a.y;
		}
		
		int cross(Vector v) { return x * v.y - y * v.x; }
	}
	
	static double area(Point a, Point b, Point c)
	{
		return Math.abs(a.x * b.y - a.y * b.x + b.x * c.y - b.y * c.x + c.x * a.y - c.y * a.x) / 2.0; 
	}
	
	static class Scanner 
	{
		StringTokenizer st;
		BufferedReader br;

		public Scanner(InputStream s){	br = new BufferedReader(new InputStreamReader(s));}

		public String next() throws IOException 
		{
			while (st == null || !st.hasMoreTokens()) 
				st = new StringTokenizer(br.readLine());
			return st.nextToken();
		}

		public int nextInt() throws IOException {return Integer.parseInt(next());}

		public long nextLong() throws IOException {return Long.parseLong(next());}

		public String nextLine() throws IOException {return br.readLine();}

		public double nextDouble() throws IOException { return Double.parseDouble(next()); }

		public boolean ready() throws IOException {return br.ready();} 
	}
}