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


public class CF_340B 
{

	static double EPS = 1e-9;
	static class Point
	{
		int x,y;
		public Point(int x,int y)
		{
			this.x = x; this.y = y;
		}
		public String toString()
		{
			return "("+x+","+y+")";
		}

		public int compareTo(Point p)
		{
			if(this.x == p.x)
				return this.y - p.y;
			return this.x - p.x;
		}
	}
	static class Vector
	{
		int x,y;
		public Vector(Point a, Point b)
		{
			x = b.x - a.x ;
			y = b.y - a.y;
		}
		public int cross(Vector c)
		{

			return this.x*c.y - this.y*c.x;
		}


	}

	static int n;
	public static void main(String[]args)throws Throwable
	{
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		Point p[] = new Point[n];
		for(int i = 0  ; i < n ; ++i)
			p[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)
			{
				Vector u = new Vector(p[i],p[j]);
				double maxUp = -1, maxDown = -1;
				for(int k = 0 ; k < n ; ++k)
				{
					if(k == i || k == j)
						continue;
					int ret = u.cross(new Vector(p[i],p[k]));
					if(ret < 0)
						maxDown = Math.max(maxDown, Math.abs(ret) / 2.0);
					else maxUp = Math.max(maxUp, ret / 2.0);
				}
				if(maxUp > 0 && maxDown > 0)
					ans = Math.max(ans, maxUp + maxDown);
			}

		}
		System.out.println(ans);
	}
	static class Scanner
	{
		BufferedReader br;
		StringTokenizer st;


		Scanner(InputStream s)  { br = new BufferedReader(new InputStreamReader(s)); }
		public Scanner(String s) throws FileNotFoundException{	br = new BufferedReader(new FileReader(s));}


		String next() throws IOException
		{

			while(st == null || !st.hasMoreTokens())
				st = new StringTokenizer(br.readLine());
			return st.nextToken();

		}
		int nextInt() throws NumberFormatException, IOException { return Integer.parseInt(next()); }
		long nextLong() throws NumberFormatException, IOException { return Long.parseLong(next()); }




	}
}