#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
if(!(cin >> N)) return 0;
vector<pair<double,double>> pts(N);
for(int i=0;i<N;i++) cin >> pts[i].first >> pts[i].second;
double xA,yA,xB,yB;
cin >> xA >> yA >> xB >> yB;
auto cross = [](double ax,double ay,double bx,double by){
return ax*by - ay*bx;
};
auto dot = [](double ax,double ay,double bx,double by){
return ax*bx + ay*by;
};
double wx = xB - xA, wy = yB - yA;
double r = hypot(wx, wy);
// 문제 보장상 A != B 이므로 r > 0
double ux = wx / r, uy = wy / r;
const double EPS = 1e-12;
long double total = 0.0L;
for (int i=0;i<N;i++){
double vx = pts[i].first - xA;
double vy = pts[i].second - yA;
double d = hypot(vx, vy);
double c = cross(vx, vy, wx, wy); // v x w
bool inDisk = (d <= r + EPS);
bool inHalf = (c >= -EPS); // 경계 포함
if (inDisk && inHalf) {
// 이미 반원 안
continue;
}
double best = 1e100;
// 후보 1: 원 밖 + 왼쪽이면 원으로의 반지름 투영
if (d > r + EPS && c > EPS) {
best = min(best, d - r);
}
// 후보 2/3: 반평면 경계선(직선 ℓ)로의 투영
double t = dot(vx, vy, ux, uy); // v · u (직선 방향 성분)
double d_perp = fabs(cross(vx, vy, ux, uy)); // 선까지의 수직거리 (u가 단위벡터)
if (t >= -r - EPS && t <= r + EPS) {
// 지름 선분 안으로 수직 낙하
best = min(best, d_perp);
} else {
// 지름 끝점 두 개 중 가까운 곳
double parallel_excess = fabs(t) - r; // >= 0
if (parallel_excess < 0) parallel_excess = 0; // 안정화
double cand = hypot(parallel_excess, d_perp);
best = min(best, cand);
}
total += best;
}
cout.setf(std::ios::fixed);
cout << setprecision(10) << (double)total << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBpbnQgTjsKICAgIGlmKCEoY2luID4+IE4pKSByZXR1cm4gMDsKICAgIHZlY3RvcjxwYWlyPGRvdWJsZSxkb3VibGU+PiBwdHMoTik7CiAgICBmb3IoaW50IGk9MDtpPE47aSsrKSBjaW4gPj4gcHRzW2ldLmZpcnN0ID4+IHB0c1tpXS5zZWNvbmQ7CiAgICBkb3VibGUgeEEseUEseEIseUI7CiAgICBjaW4gPj4geEEgPj4geUEgPj4geEIgPj4geUI7CgogICAgYXV0byBjcm9zcyA9IFtdKGRvdWJsZSBheCxkb3VibGUgYXksZG91YmxlIGJ4LGRvdWJsZSBieSl7CiAgICAgICAgcmV0dXJuIGF4KmJ5IC0gYXkqYng7CiAgICB9OwogICAgYXV0byBkb3QgPSBbXShkb3VibGUgYXgsZG91YmxlIGF5LGRvdWJsZSBieCxkb3VibGUgYnkpewogICAgICAgIHJldHVybiBheCpieCArIGF5KmJ5OwogICAgfTsKCiAgICBkb3VibGUgd3ggPSB4QiAtIHhBLCB3eSA9IHlCIC0geUE7CiAgICBkb3VibGUgciA9IGh5cG90KHd4LCB3eSk7CiAgICAvLyDrrLjsoJwg67O07J6l7IOBIEEgIT0gQiDsnbTrr4DroZwgciA+IDAKICAgIGRvdWJsZSB1eCA9IHd4IC8gciwgdXkgPSB3eSAvIHI7CgogICAgY29uc3QgZG91YmxlIEVQUyA9IDFlLTEyOwogICAgbG9uZyBkb3VibGUgdG90YWwgPSAwLjBMOwoKICAgIGZvciAoaW50IGk9MDtpPE47aSsrKXsKICAgICAgICBkb3VibGUgdnggPSBwdHNbaV0uZmlyc3QgIC0geEE7CiAgICAgICAgZG91YmxlIHZ5ID0gcHRzW2ldLnNlY29uZCAtIHlBOwogICAgICAgIGRvdWJsZSBkID0gaHlwb3QodngsIHZ5KTsKICAgICAgICBkb3VibGUgYyA9IGNyb3NzKHZ4LCB2eSwgd3gsIHd5KTsgICAgICAgICAgICAvLyB2IHggdwogICAgICAgIGJvb2wgaW5EaXNrID0gKGQgPD0gciArIEVQUyk7CiAgICAgICAgYm9vbCBpbkhhbGYgPSAoYyA+PSAtRVBTKTsgLy8g6rK96rOEIO2PrO2VqAoKICAgICAgICBpZiAoaW5EaXNrICYmIGluSGFsZikgewogICAgICAgICAgICAvLyDsnbTrr7gg67CY7JuQIOyViAogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGRvdWJsZSBiZXN0ID0gMWUxMDA7CgogICAgICAgIC8vIO2bhOuztCAxOiDsm5Ag67CWICsg7Jm87Kq97J2066m0IOybkOycvOuhnOydmCDrsJjsp4DrpoQg7Yis7JiBCiAgICAgICAgaWYgKGQgPiByICsgRVBTICYmIGMgPiBFUFMpIHsKICAgICAgICAgICAgYmVzdCA9IG1pbihiZXN0LCBkIC0gcik7CiAgICAgICAgfQoKICAgICAgICAvLyDtm4Trs7QgMi8zOiDrsJjtj4nrqbQg6rK96rOE7ISgKOyngeyEoCDihJMp66Gc7J2YIO2IrOyYgQogICAgICAgIGRvdWJsZSB0ID0gZG90KHZ4LCB2eSwgdXgsIHV5KTsgICAgICAgICAgLy8gdiDCtyB1ICjsp4HshKAg67Cp7ZalIOyEseu2hCkKICAgICAgICBkb3VibGUgZF9wZXJwID0gZmFicyhjcm9zcyh2eCwgdnksIHV4LCB1eSkpOyAvLyDshKDquYzsp4DsnZgg7IiY7KeB6rGw66asICh16rCAIOuLqOychOuyoe2EsCkKICAgICAgICBpZiAodCA+PSAtciAtIEVQUyAmJiB0IDw9IHIgKyBFUFMpIHsKICAgICAgICAgICAgLy8g7KeA66aEIOyEoOu2hCDslYjsnLzroZwg7IiY7KeBIOuCme2VmAogICAgICAgICAgICBiZXN0ID0gbWluKGJlc3QsIGRfcGVycCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8g7KeA66aEIOuBneygkCDrkZAg6rCcIOykkSDqsIDquYzsmrQg6rOzCiAgICAgICAgICAgIGRvdWJsZSBwYXJhbGxlbF9leGNlc3MgPSBmYWJzKHQpIC0gcjsgLy8gPj0gMAogICAgICAgICAgICBpZiAocGFyYWxsZWxfZXhjZXNzIDwgMCkgcGFyYWxsZWxfZXhjZXNzID0gMDsgLy8g7JWI7KCV7ZmUCiAgICAgICAgICAgIGRvdWJsZSBjYW5kID0gaHlwb3QocGFyYWxsZWxfZXhjZXNzLCBkX3BlcnApOwogICAgICAgICAgICBiZXN0ID0gbWluKGJlc3QsIGNhbmQpOwogICAgICAgIH0KCiAgICAgICAgdG90YWwgKz0gYmVzdDsKICAgIH0KCiAgICBjb3V0LnNldGYoc3RkOjppb3M6OmZpeGVkKTsgCiAgICBjb3V0IDw8IHNldHByZWNpc2lvbigxMCkgPDwgKGRvdWJsZSl0b3RhbCA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0=