For given n points in metric space, find the distance of the closest points.

Constraints

* 2 ≤ n ≤ 100,000
* -100 ≤ x, y ≤ 100

Input


n
x0 y0
x1 y1
:
xn-1 yn-1


The first integer n is the number of points.

In the following n lines, the coordinate of the i-th point is given by two real numbers xi and yi. Each value is a real number with at most 6 digits after the decimal point.

Output

Print the distance in a line. The output values should be in a decimal fraction with an error less than 0.000001.

Examples

Input

2
0.0 0.0
1.0 0.0


Output

1.000000


Input

3
0.0 0.0
2.0 0.0
1.0 1.0


Output

1.41421356237
/*
	最近点対：蟻本 第2版 p 326
*/
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(n);++i)
#define ALL(A) A.begin(), A.end()
#define INF 1e100

using namespace std;

typedef long long ll;
typedef pair<double, double> P;

const int MAX_N = (int)1e5 + 5;

int N;
P A[MAX_N];

// y 座標の昇順でマージをするための比較関数
bool compare_y(P a, P b){
	return a.second < b.second;
}

// a は x 座標の昇順で渡される
double closest_pair(P *a, int n){
	if (n <= 1) return INF;
	int m = n / 2;
	double x = a[m].first;
	double d = min(closest_pair(a, m), closest_pair(a + m, n - m));	// (1)
	inplace_merge(a, a + m, a + n, compare_y);	// 2 つのソートされた列をマージ
	// この時点で a は y 座標の昇順になっている

	// (2')
	vector<P> b; // 直線から距離 d 未満の頂点を入れていく
	for (int i = 0; i < n; ++i){
		if (fabs(a[i].first - x) >= d) continue;
		
		// b に入っている頂点を、末尾から、y 座標の差が d 以上になるまで見ていく
		for (int j = 0; j < (int)b.size(); ++j){
			double dx = a[i].first - b[b.size() - j - 1].first;
			double dy = a[i].second - b[b.size() - j - 1].second;
			if (dy >= d) break;
			d = min(d, sqrt(dx * dx + dy * dy));
		} // end for
		b.push_back(a[i]);
	} // end for

	return d;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> N;
	rep (i, N){
		double x, y; cin >> x >> y;
		A[i].first = x; A[i].second = y;
	} // end rep

	sort(A, A + N);	// x 座標でソート
	double res = closest_pair(A, N);

	printf("%.08lf\n", res);

	return 0;
}
