// AOJ CGL_4_B Diameter of a Convex Polygon
// 2018.5.3 bal4u

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define EPS 1e-8

typedef struct { double x, y; } PP;

#if 1
#define gc() getchar_unlocked()
#else
#define gc() getchar()
#endif
int in()
{
	int n = 0, c = gc();
	if (c == '-') {	c = gc();
		do n = 10*n + (c & 0xf), c = gc(); while (c >= '0');
		return -n;
	}
	do n = 10*n + (c & 0xf), c = gc(); while (c >= '0');
	return n;
}

double dbl()
{
	int minus = 0;
	double x, y;
	int n = 0, c = gc();
	if (c == '-') minus = 1, c = gc();
	do n = 10*n + (c & 0xf), c = gc(); while (c >= '0');

	if (c == '.') {
		x = 0;
		y = 1, c = gc();
		do y *= 0.1, x += y * (c & 0xf), c = gc(); while (c >= '0');
		x += n;
	} else x = n;
	if (minus) x = -x;
	return x;
}

PP vsub(PP p1, PP p2) { PP r; r.x = p1.x - p2.x, r.y = p1.y - p2.y; return r; }
double cross(PP a, PP b) { return a.x * b.y - a.y * b.x; }
double norm(PP a) { return a.x * a.x + a.y * a.y; }

double convexDiameter(int n, PP *poly)
{
	int i, j, maxi, maxj;
	double maxd, d;

	int is = 0, js = 0;
	for (i = 1; i < n; i++) {
		if (poly[i].y > poly[is].y) is = i;
		if (poly[i].y < poly[js].y) js = i;
	}
	maxd = norm(vsub(poly[is], poly[js]));

	i = maxi = is;
	j = maxj = js;
	poly[n] = poly[0];
	do {
		if (cross(vsub(poly[i+1], poly[i]), vsub(poly[j+1], poly[j])) >= 0) {
			if (++j == n) j = 0;
		} else {
			if (++i == n) i = 0;
		}
	    if ((d=norm(vsub(poly[i], poly[j]))) > maxd) {
			maxd = d;
			maxi = i; maxj = j;
		}
	} while (i != is || j != js);
	return maxd; /* farthest pair is (maxi, maxj). */
}

PP p[80005];

int main()
{
	int n, i;

	n = in();
	for (i = 0; i < n; i++) p[i].x = dbl(), p[i].y = dbl();
	printf("%.10lf\n", sqrt(convexDiameter(n, p)));
	return 0;
}

