#include<cstdio>\可用万能头#include<bits/stdc++.h>
#include<cmath>
#include<algorithm>
#include<cstring>
#define db double
using namespace std;
const int M=1e4+1;
const int inf=0x7fffffff;
const db eps=1e-10;
int dcmp(db x){if(fabs(x)<eps) return 0;return x<0?-1:1;}
int T,n,s,t;
db sx,sy,bx,by;
struct ss{
int to,last,val;
ss(int a=0,int b=0,int c=1):to(a),last(b),val(c){}
}g[M<<1];
int head[M],cnt;
void add(int a,int b){
g[cnt]=ss(b,head[a]);head[a]=cnt;
g[cnt]=ss(a,head[b]);head[b]=cnt;
}
int dis[M];
bool vis[M];
int sze,que[M],pp,qq;
int spfa(int tot){
for(int i=0;i<tot;i) dis[i]=inf,vis[i]=0;
vis[s]=1;dis[s]=0;que[pp=qq=0]=s;
for(;pp<=qq;pp){
int now=que[pp%tot];
vis[now]=0;
for(int i=head[now];i;i=g[i].last){
if(dis[g[i].to]>dis[now]+g[i].val){
dis[g[i].to]=dis[now]+g[i].val;
if(!vis[g[i].to]){
que[qq%tot]=g[i].to;
vis[g[i].to]=1;
if(dis[que[(pp+1)%tot]]>dis[que[qq%tot]])swap(que[(pp+1)%tot],que[qq%n]);
}
}
}
}
return dis[t];
}
struct point{
db x,y;
point(db a=0,db b=0):x(a),y(b){}
void in(){scanf("%lf%lf",&x,&y);}
}po[M];
point operator +(point a,point b){return point(a.x+b.x,a.y+b.y);}
point operator -(point a,point b){return point(a.x-b.x,a.y-b.y);}
point operator (point a,db b){return point(a.xb ,a.yb );}
point operator /(point a,db b){return point(a.x/b ,a.y/b );}
db cross(point a,point b){return a.xb.y-a.yb.x;}
db dot (point a,point b){return a.xb.x+a.yb.y;}
point rotate(point a){return point(-a.y,a.x);}
point getmid(point a,point b){return point((a.x+b.x)/2,(a.y+b.y)/2);}
struct line{
point p,v;
db ang;
int id;
line(){}
line(point a,point b,int c):p(a),v(b),id(c){ang=atan2(v.y,v.x);}
bool operator <(line a)const{return ang<a.ang;}
point getp(db t){return p+vt;}
}l[M];
bool onleft(line le,point p){return cross(le.v,p-le.p)>0;}
point getlinecut(line a,line b){
point u=a.p-b.p;
db t=cross(b.v,u)/cross(a.v,b.v);
return a.getp(t);
}
int fi,la,vnt;
point p[M];
line q[M];
bool no[M];
void init(int a,int tot){
l[0]=line(point(0,sy),point(0,-1),n);
l[1]=line(point(0,0),point(1,0),n);
l[2]=line(point(sx,0),point(0,1),n);
l[3]=line(point(sx,sy),point(-1,0),n);
vnt=4;
for(int i=0;i<tot;i){
if(i==a||no[i]) continue;
point mid=getmid(po[i],po[a]);
point v=rotate(po[i]-po[a]);
l[vnt++]=line(mid,v,i);
}
}
void halfcut(int a,int tot){
sort(l,l+tot);
q[fi=la=0]=l[0];
for(int i=1;i<tot;i++){
while(fi<la&&!onleft(l[i],p[la-1])) --la;
while(fi<la&&!onleft(l[i],p[fi ])) fi;
q[la]=l[i];
if(fabs(cross(q[la].v,q[la-1].v))<eps){
--la;if(onleft(q[la],l[i].p)) q[la]=l[i];
}
if(fi<la) p[la-1]=getlinecut(q[la],q[la-1]);
}
while(fi<la&&!onleft(q[fi],p[la-1])) --la;
if(la-fi<=1) return;
for(int i=fi;i<=la;i){add(a,q[i].id);}
}
void clear(){
cnt=0;memset(head,0,sizeof(head));
memset(no,0,sizeof(no));
}
db dist(point a,point b){return dot(a-b,a-b);}
int main(){
scanf("%d",&T);
while(T--){
clear();
scanf("%d",&n);
scanf("%lf%lf%lf%lf",&sx,&sy,&bx,&by);
if(!n){printf("0\n");continue;}
t=n;
int pos=0;
db len=1e150;
for(int i=0;i<n;i){
po[i].in();
if(po[i].x>sx||po[i].y>sy)no[i]=1;
db now=dist(po[i],point(bx,by));
if(len>now) len=now,pos=i;
}
s=pos;
for(int i=0;i<n;i++){
if(no[i]) continue;
init(i,n);
halfcut(i,vnt);
}
printf("%d\n",spfa(n+2));
}
return 0;
}