You are given a set of n points in a 2D plane. No three points are collinear.

A pentagram is a set of 5 points A,B,C,D,E that can be arranged as follows. <image> Note the length of the line segments don't matter, only that those particular intersections exist.

Count the number of ways to choose 5 points from the given set that form a pentagram.

Input

The first line contains an integer n (5 ≤ n ≤ 300) — the number of points.

Each of the next n lines contains two integers x_i, y_i (-10^6 ≤ x_i,y_i ≤ 10^6) — the coordinates of the i-th point. It is guaranteed that no three points are collinear.

Output

Print a single integer, the number of sets of 5 points that form a pentagram.

Examples

Input


5
0 0
0 2
2 0
2 2
1 3


Output


1


Input


5
0 0
4 0
0 4
4 4
2 3


Output


0


Input


10
841746 527518
595261 331297
-946901 129987
670374 -140388
-684770 309555
-302589 415564
-387435 613331
-624940 -95922
945847 -199224
24636 -565799


Output


85

Note

A picture of the first sample: <image> A picture of the second sample: <image> A picture of the third sample: <image>
#include <bits/stdc++.h>
using namespace std;
const int maxn = 320;
struct point {
  long long x, y;
  int id;
  point() {}
  point(long long a, long long b) : x(a), y(b){};
  point operator-(point a) { return point(x - a.x, y - a.y); }
} dt[maxn], base, U[maxn], cur[maxn], D[maxn];
int n, tot;
long long ans, cntD[maxn][maxn], cntU[maxn][maxn];
long long xmul(point a, point b) { return a.x * b.y - a.y * b.x; }
bool cmp(point x, point y) { return xmul(x - base, y - base) > 0; }
void solve2(point A, point B) {
  int up_cnt = 0, down_cnt = 0;
  for (int i = 1; i <= tot; i++) {
    long long d = xmul(B - A, cur[i] - A);
    if (d > 0)
      U[++up_cnt] = cur[i];
    else if (d < 0)
      D[++down_cnt] = cur[i];
  }
  base = B;
  sort(U + 1, U + up_cnt + 1, cmp);
  sort(D + 1, D + down_cnt + 1, cmp);
  int num = 0;
  for (int i = 1; i <= up_cnt; i++) {
    while (num < down_cnt && xmul(D[num + 1] - B, B - U[i]) > 0) num++;
    cntD[B.id][U[i].id] = num;
  }
}
void solve3(point A, point B) {
  int up_cnt = 0, down_cnt = 0;
  for (int i = 1; i <= tot; i++) {
    long long d = xmul(B - A, cur[i] - A);
    if (d > 0)
      U[++up_cnt] = cur[i];
    else if (d < 0)
      D[++down_cnt] = cur[i];
  }
  base = B;
  sort(U + 1, U + up_cnt + 1, cmp);
  sort(D + 1, D + down_cnt + 1, cmp);
  int num = 1;
  for (int i = 1; i <= down_cnt; i++) {
    while (num <= up_cnt && xmul(B - D[i], U[num] - B) <= 0) num++;
    cntU[D[i].id][B.id] = up_cnt - num + 1;
  }
}
void solve(int id) {
  cur[tot = 1] = dt[id];
  for (int i = 1; i <= n; i++) {
    if (id != i &&
        (dt[id].y < dt[i].y || (dt[id].y == dt[i].y && dt[id].x < dt[i].x)))
      cur[++tot] = dt[i];
  }
  for (int i = 2; i <= tot; i++) {
    solve2(cur[1], cur[i]);
    solve3(cur[1], cur[i]);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      ans += cntU[i][j] * cntD[i][j];
      cntU[i][j] = cntD[i][j] = 0;
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++)
    scanf("%lld %lld", &dt[i].x, &dt[i].y), dt[i].id = i;
  for (int i = 1; i <= n; i++) {
    solve(i);
  }
  cout << ans << endl;
}
