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 CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
pair<long long, long long> operator+(const pair<long long, long long> &a,
                                     const pair<long long, long long> &b) {
  return make_pair(a.first + b.first, a.second + b.second);
}
pair<long long, long long> operator-(const pair<long long, long long> &a,
                                     const pair<long long, long long> &b) {
  return make_pair(a.first - b.first, a.second - b.second);
}
pair<long long, long long> operator*(const pair<long long, long long> &a,
                                     const long long &b) {
  return make_pair(a.first * b, a.second * b);
}
pair<long long, long long> operator/(const pair<long long, long long> &a,
                                     const long long &b) {
  return make_pair(a.first / b, a.second / b);
}
long long dot(const pair<long long, long long> &a,
              const pair<long long, long long> &b) {
  return a.first * b.first + a.second * b.second;
}
long long cross(const pair<long long, long long> &a,
                const pair<long long, long long> &b) {
  return a.first * b.second - a.second * b.first;
}
long long abs2(const pair<long long, long long> &a) { return dot(a, a); }
long long abs(const pair<long long, long long> &a) { return sqrt(dot(a, a)); }
int ori(const pair<long long, long long> &b,
        const pair<long long, long long> &a,
        const pair<long long, long long> &c) {
  long long res = cross(a - b, c - b);
  if (res == 0) return 0;
  return res > 0 ? 1 : -1;
}
bool collinearity(const pair<long long, long long> &p1,
                  const pair<long long, long long> &p2,
                  const pair<long long, long long> &p3) {
  return cross(p1 - p3, p2 - p3) == 0;
}
bool btw(const pair<long long, long long> &p1,
         const pair<long long, long long> &p2,
         const pair<long long, long long> &p3) {
  if (!collinearity(p1, p2, p3)) return 0;
  return dot(p1 - p3, p2 - p3) <= 0;
}
bool seg_intersect(const pair<long long, long long> &p1,
                   const pair<long long, long long> &p2,
                   const pair<long long, long long> &p3,
                   const pair<long long, long long> &p4) {
  int a123 = ori(p1, p2, p3);
  int a124 = ori(p1, p2, p4);
  int a341 = ori(p3, p4, p1);
  int a342 = ori(p3, p4, p2);
  if (a123 == 0 && a124 == 0)
    return btw(p1, p2, p3) || btw(p1, p2, p4) || btw(p3, p4, p1) ||
           btw(p3, p4, p2);
  else if (a123 * a124 <= 0 && a341 * a342 <= 0)
    return 1;
  return 0;
}
struct convex_hull {
  vector<pair<long long, long long> > dots;
  void add_dot(long long a, long long b) { dots.push_back(make_pair(a, b)); }
  vector<pair<long long, long long> > hull() {
    vector<pair<long long, long long> > ans;
    sort(dots.begin(), dots.end());
    ans.push_back(dots[0]), ans.push_back(dots[1]);
    for (int i = 2; i < dots.size(); ++i) {
      while (ans.size() >= 2)
        if (ori(ans[ans.size() - 2], ans.back(), dots[i]) <= 0)
          ans.pop_back();
        else
          break;
      ans.push_back(dots[i]);
    }
    for (int i = dots.size() - 2, t = ans.size(); i >= 0; --i) {
      while (ans.size() > t)
        if (ori(ans[ans.size() - 2], ans.back(), dots[i]) <= 0)
          ans.pop_back();
        else
          break;
      ans.push_back(dots[i]);
    }
    return ans;
  }
} cv;
long long area(pair<long long, long long> a, pair<long long, long long> b,
               pair<long long, long long> c, pair<long long, long long> d) {
  return abs(cross(a, b) + cross(b, c) + cross(c, d) + cross(d, a));
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  long long t, n, x, y, ans = 0, tmp;
  cin >> n;
  while (n--) cin >> x >> y, cv.add_dot(x, y);
  auto hull = cv.hull();
  n = hull.size() - 1;
  for (int p = 0; p < n; ++p)
    for (int i = p + 1; i < n; ++i)
      for (int j = (i + 1) % n, k = (j + 1) % n; j != p; j = (j + 1) % n) {
        if (k == j) k = (k + 1) % n;
        while ((k + 1) % n != p &&
               area(hull[p], hull[i], hull[j], hull[k]) <=
                   area(hull[p], hull[i], hull[j], hull[(k + 1) % n]))
          k = (k + 1) % n;
        if (j != p && j != i && k != p && k != i && j != k)
          ans = max(ans, abs(area(hull[p], hull[i], hull[j], hull[k])));
      }
  for (int i = 0; i < n; ++i) {
    for (int j = (i + 1) % n, k = (j + 1) % n; j != i; j = (j + 1) % n) {
      if (k == j) k = (k + 1) % n;
      while ((k + 1) % n != i &&
             abs(cross(hull[j] - hull[i], hull[k] - hull[i])) <=
                 abs(cross(hull[j] - hull[i], hull[(k + 1) % n] - hull[i])))
        k = (k + 1) % n;
      tmp = abs(cross(hull[j] - hull[i], hull[k] - hull[i]));
      for (int p = 0; p < cv.dots.size(); ++p) {
        if (cv.dots[p] == hull[i] || cv.dots[p] == hull[j] ||
            cv.dots[p] == hull[k])
          continue;
        if (abs(cross(hull[i] - cv.dots[p], hull[j] - cv.dots[p])) +
                abs(cross(hull[k] - cv.dots[p], hull[j] - cv.dots[p])) +
                abs(cross(hull[i] - cv.dots[p], hull[k] - cv.dots[p])) ==
            tmp)
          ans = max(
              ans,
              tmp - min({abs(cross(hull[i] - cv.dots[p], hull[j] - cv.dots[p])),
                         abs(cross(hull[k] - cv.dots[p], hull[j] - cv.dots[p])),
                         abs(cross(hull[i] - cv.dots[p],
                                   hull[k] - cv.dots[p]))}));
      }
    }
  }
  cout << fixed << setprecision(14) << (double)ans / 2 << "\n";
}