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 static java.lang.Math.*;
import static java.lang.System.currentTimeMillis;
import static java.lang.System.exit;
import static java.lang.System.arraycopy;
import static java.util.Arrays.sort;
import static java.util.Arrays.binarySearch;
import static java.util.Arrays.fill;
import java.util.*;
import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		new Main().run();
	}

	BufferedReader in;
	PrintWriter out;
	StringTokenizer st = new StringTokenizer("");

	private void run() throws IOException {
//		in = new BufferedReader(new FileReader("input.txt")); 
//		out = new PrintWriter("output.txt");
		out = new PrintWriter(System.out);
		solve();
//		in.close();
		out.close();
	}
	
	final int MAXN = 301;
	class Point{
		int x, y;
		Point(int x, int y){
			this.x = x;
			this.y = y;
		}
	}
	Point[] point = new Point[MAXN];
	
	double rotate(Point a, Point b, Point c){
		return 0.5 * ( (a.x - b.x) * (c.y - b.y) - (c.x - b.x) * (a.y - b.y) );
	}
	
	private void solve() throws IOException {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for(int i = 0; i < n; ++i)
			point[i] = new Point(sc.nextInt(), sc.nextInt());
		double answer = 0;
		for(int i = 0; i < n; i++){
			for(int j = i+1; j < n; j++){
				double maxRightRotSq = -1, maxLeftRotSq = -1;
				for(int k = 0; k < n; k++)
					if(k != i && k != j){
						double sq = rotate(point[i], point[j], point[k]);
						if(sq > 0){
							maxRightRotSq = max(maxRightRotSq, sq);
						} else {
							maxLeftRotSq = max(maxLeftRotSq, -sq);
						}
					}
				if(maxLeftRotSq != -1 && maxRightRotSq != -1)
					answer = max(answer, maxLeftRotSq + maxRightRotSq);
			}
		}
		out.printf(Locale.US, "%.6f",answer);
	}

	void chk(boolean b) {
		if (b)
			return;
		System.out.println(new Error().getStackTrace()[1]);
		exit(999);
	}
	void deb(String fmt, Object... args) {
		System.out.printf(Locale.US, fmt + "%n", args);
	}
	String nextToken() throws IOException {
		while (!st.hasMoreTokens())
			st = new StringTokenizer(in.readLine());
		return st.nextToken();
	}
	int nextInt() throws IOException {
		return Integer.parseInt(nextToken());
	}
	long nextLong() throws IOException {
		return Long.parseLong(nextToken());
	}
	double nextDouble() throws IOException {
		return Double.parseDouble(nextToken());
	}
	String nextLine() throws IOException {
		st = new StringTokenizer("");
		return in.readLine();
	}
	boolean EOF() throws IOException {
		while (!st.hasMoreTokens()) {
			String s = in.readLine();
			if (s == null)
				return true;
			st = new StringTokenizer(s);
		}
		return false;
	}
}