Problem: Ksusha is a vigorous mathematician. She is keen on absolutely incredible mathematical riddles. 

Today Ksusha came across a convex polygon of non-zero area. She is now wondering: if she chooses a pair of distinct points uniformly among all integer points (points with integer coordinates) inside or on the border of the polygon and then draws a square with two opposite vertices lying in the chosen points, what will the expectation of this square's area be?

A pair of distinct points is chosen uniformly among all pairs of distinct points, located inside or on the border of the polygon. Pairs of points p, q (p ≠ q) and q, p are considered the same.

Help Ksusha! Count the required expectation.

Input

The first line contains integer n (3 ≤ n ≤ 105) — the number of vertices of Ksusha's convex polygon. Next n lines contain the coordinates of the polygon vertices in clockwise or counterclockwise order. The i-th line contains integers xi, yi (|xi|, |yi| ≤ 106) — the coordinates of the vertex that goes i-th in that order.

Output

Print a single real number — the required expected area. 

The answer will be considered correct if its absolute and relative error doesn't exceed 10 - 6.

Examples

Input

3
0 0
5 5
5 0


Output

4.6666666667


Input

4
-1 3
4 5
6 2
3 -5


Output

8.1583333333


Input

3
17 136
859 937
16 641


Output

66811.3704155169

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
long long read() {
  long long x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * f;
}
double ans;
int n, m = 1000000;
int d[2000005], u[2000005];
int x[100005], y[100005];
void solve() {
  for (int i = -m; i <= m; i++) d[i + m] = 1000000000, u[i + m] = -1000000000;
  int lm = m, rm = -m;
  for (int i = 1; i <= n; i++) lm = min(lm, x[i]), rm = max(rm, x[i]);
  for (int i = 1; i <= n; i++) {
    if (x[i] == x[i + 1]) {
      u[x[i] + m] = max(u[x[i] + m], y[i]);
      d[x[i] + m] = min(d[x[i] + m], y[i]);
      continue;
    }
    bool flag = 0;
    if (x[i] > x[i + 1]) {
      swap(x[i], x[i + 1]), swap(y[i], y[i + 1]);
      flag = 1;
    }
    for (int j = x[i]; j <= x[i + 1]; j++) {
      double now =
          (double)(j - x[i]) / (x[i + 1] - x[i]) * (y[i + 1] - y[i]) + y[i];
      d[j + m] = min((int)ceil(now), d[j + m]);
      u[j + m] = max((int)floor(now), u[j + m]);
    }
    if (flag) swap(x[i], x[i + 1]), swap(y[i], y[i + 1]);
  }
  double s0 = 0, s1 = 0, s2 = 0;
  for (long long i = lm; i <= rm; i++) {
    long long t = u[i + m] - d[i + m] + 1;
    s0 += t;
    s1 += t * i;
    s2 += t * i * i;
  }
  ans += (double)(s0 * s2 - s1 * s1) / s0 / (s0 - 1);
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) x[i] = read(), y[i] = read();
  x[n + 1] = x[1];
  y[n + 1] = y[1];
  solve();
  for (int i = 1; i <= n + 1; i++) swap(x[i], y[i]);
  solve();
  printf("%.10lf\n", ans);
  return 0;
}