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.*;
import java.math.*;
public class Main {
    public static void main(String[] args) throws Exception {
        StreamTokenizer in = new StreamTokenizer(System.in);
        in.nextToken();
        int n1 = (int)in.nval;
        int[] x = new int[n1];
        int[] y = new int[n1];
        
        for (int i = 0; i < n1; i++){
            in.nextToken();
            x[i] = (int)in.nval;
            in.nextToken();
            y[i] = (int)in.nval;
        }
        
        double ans = Double.MIN_VALUE;
        for (int i = 0; i< n1 - 1; i++){
            for (int j = i+1; j< n1; j++){
                boolean hasLeft = false;
                boolean hasRight = false;
                double lMax = Double.MIN_VALUE;
                double rMax = Double.MIN_VALUE;
                for (int k = 0; k < n1; k++){
                    if (k == i || k == j) continue;
                    double ar1 = area(x[i],y[i],x[j],y[j],x[k],y[k]);
                    
                    int linePart = linePart(x[i],y[i],x[j],y[j],x[k],y[k]);
                    
                    //px(i,j,k,ar1, linePart);
                    if (linePart >= 0){
                        if (hasLeft){
                            lMax = Math.max(lMax, ar1);
                        }
                        else {
                            hasLeft = true;
                            lMax = ar1;
                        }
                    }
                    else {
                        if (hasRight){
                            rMax = Math.max(rMax, ar1);
                        }
                        else {
                            hasRight = true;
                            rMax = ar1;
                        }
                    }
                }
                if (hasLeft && hasRight){
                    ans = Math.max(ans, lMax+rMax);
                }
                //px(i,j,"max",lMax,rMax);
            }
        }
        System.out.println(String.format("%.8f", ans));
        
        
        
    }
    static void px(Object ... l1){
        System.out.println(Arrays.deepToString(l1));
    }
    public static double heron(double x1, double y1, double x2, double y2, double x3, double y3){
        double a = dist(x1,y1,x2,y2);
        double b = dist(x3,y3,x2,y2);
        double c = dist(x3,y3,x1,y1);
        double s = a+ b + c;
        s/=2;
        return Math.sqrt(s*(s-a)*(s-b)*(s-c));
    }
    public static double area(double x1, double y1, double x2, double y2, double x3, double y3){
        double q1 = x2 - x1;
        double w1 = y2 - y1;
        double q2 = x3 - x1;
        double w2 = y3 - y1;
        return Math.abs(w2*q1 - w1*q2)*0.5;
    }
    public static double dist(double x1, double y1, double x2, double y2){
        double dx = x1 - x2;
        double dy = y1 - y2;
        return Math.sqrt(dx*dx+dy*dy);
    }
    static double eps = 1e-8;
    public static int sign(double n1){
        if (Math.abs(n1)<eps){
            return 0;
        }
        if (n1 > 0) return 1;
        return -1;
    }
    public static int linePart(int x1, int y1, int x2, int y2, int x3, int y3){
        int A = x1 - x2;
        int B = y1 - y2;
        int co1 = B;
        int co2 = -A;
        int needed = B*x1-A*y1;
        int cur = co1*x3 + co2*y3;
        return cur - needed;
    }
    public static int pi(String k1){
        return Integer.parseInt(k1);
    }
}