#include <bits/stdc++.h>
using namespace std;
// #define vs vector<string >
#define ll long long int
#define pb push_back
#define vi vector<int>
#define vt vector<tup>
#define vtt vector<vt >
#define vii vector<vi >
#define viii vector<vii >
#define vb vector<bool>
#define vd vector<double>
#define vbb vector<vb >
#define vl vector<long long int>
#define vll vector<vl >
#define vlll vector<vll >
#define foi(x) for (int i = 0; i < x; ++i)
#define foj(x) for (int j = 0; j < x; ++j)
#define fok(x) for (int k = 0; k < x; ++k)
#define foi1(x) for (int i = 1; i <= x; ++i)
#define foj1(x) for (int j = 1; j <= x; ++j)
#define si size()
#define le length()
#define vs vector<string>
#define vss vector<vs >
#define qs queue<string>
class tup{
public:
int a, b;
tup(){}
tup(int p, int q){
a=p;
b=q;
}
};
const double eps = 1e-8;
bool isPres(vector<double> &v, double d){
for(auto x:v){
if(fabs(d-x)<eps)
return true;
}
return false;
}
int ans;
void swap(tup &p, tup &q){
tup x(p.a,p.b);
p=q;
q=x;
}
void f(vt &v){
int x = 0;
foi(v.si-1){
if(v[i].a>=v[i+1].a and v[i].b>=v[i+1].b)
return;
if((v[i+1].a == v[i].a) or (v[i+1].b == v[i].b))
continue;
if(!x){
x=(v[i+1].a<v[i].a)?1:-1;
continue;
}
if((x==-1 and v[i+1].a<v[i].a) or (x==1 and v[i+1].a>v[i].a))
return;
}
ans++;
}
void genPerm(vt &v, int i, int j){
if(i==j){
f(v);
return;
}
for(int k=i;k<=j;k++){
swap(v[i],v[k]);
genPerm(v,i+1,j);
swap(v[i],v[k]);
}
}
int main(int argc, char const *argv[])
{
int t;
cin>>t;
for(int q=1;q<=t;q++){
cout<<"Case #"<<q<<": ";
int n,x,y;
cin>>n;
vt v;
foi(n){
cin>>x>>y;
tup t1;
t1.a=x;t1.b=y;
v.pb(t1);
}
ans = 0;
genPerm(v,0,n-1);
cout<<ans<<endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gI2RlZmluZSB2cyB2ZWN0b3I8c3RyaW5nID4KI2RlZmluZSBsbCBsb25nIGxvbmcgaW50CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSB2dCB2ZWN0b3I8dHVwPgojZGVmaW5lIHZ0dCB2ZWN0b3I8dnQgPgojZGVmaW5lIHZpaSB2ZWN0b3I8dmkgPgojZGVmaW5lIHZpaWkgdmVjdG9yPHZpaSA+CiNkZWZpbmUgdmIgdmVjdG9yPGJvb2w+CiNkZWZpbmUgdmQgdmVjdG9yPGRvdWJsZT4KI2RlZmluZSB2YmIgdmVjdG9yPHZiID4KI2RlZmluZSB2bCB2ZWN0b3I8bG9uZyBsb25nIGludD4KI2RlZmluZSB2bGwgdmVjdG9yPHZsID4KI2RlZmluZSB2bGxsIHZlY3Rvcjx2bGwgPgojZGVmaW5lIGZvaSh4KSBmb3IgKGludCBpID0gMDsgaSA8IHg7ICsraSkKI2RlZmluZSBmb2ooeCkgZm9yIChpbnQgaiA9IDA7IGogPCB4OyArK2opCiNkZWZpbmUgZm9rKHgpIGZvciAoaW50IGsgPSAwOyBrIDwgeDsgKytrKQojZGVmaW5lIGZvaTEoeCkgZm9yIChpbnQgaSA9IDE7IGkgPD0geDsgKytpKQojZGVmaW5lIGZvajEoeCkgZm9yIChpbnQgaiA9IDE7IGogPD0geDsgKytqKQojZGVmaW5lIHNpIHNpemUoKQojZGVmaW5lIGxlIGxlbmd0aCgpCiNkZWZpbmUgdnMgdmVjdG9yPHN0cmluZz4KI2RlZmluZSB2c3MgdmVjdG9yPHZzID4KI2RlZmluZSBxcyBxdWV1ZTxzdHJpbmc+CgoKY2xhc3MgdHVwewpwdWJsaWM6CglpbnQgYSwgYjsKCXR1cCgpe30KCXR1cChpbnQgcCwgaW50IHEpewoJCWE9cDsKCQliPXE7Cgl9Cn07Cgpjb25zdCBkb3VibGUgZXBzID0gMWUtODsKCmJvb2wgaXNQcmVzKHZlY3Rvcjxkb3VibGU+ICZ2LCBkb3VibGUgZCl7Cglmb3IoYXV0byB4OnYpewoJCWlmKGZhYnMoZC14KTxlcHMpCgkJCXJldHVybiB0cnVlOwoJfQoJcmV0dXJuIGZhbHNlOwp9CgppbnQgYW5zOwoKdm9pZCBzd2FwKHR1cCAmcCwgdHVwICZxKXsKCXR1cCB4KHAuYSxwLmIpOwoJcD1xOwoJcT14Owp9Cgp2b2lkIGYodnQgJnYpewoJaW50IHggPSAwOwoJZm9pKHYuc2ktMSl7CgkJaWYodltpXS5hPj12W2krMV0uYSBhbmQgdltpXS5iPj12W2krMV0uYikKCQkJcmV0dXJuOwoJCWlmKCh2W2krMV0uYSA9PSB2W2ldLmEpIG9yICh2W2krMV0uYiA9PSB2W2ldLmIpKQoJCQljb250aW51ZTsKCQlpZigheCl7CgkJCXg9KHZbaSsxXS5hPHZbaV0uYSk/MTotMTsKCQkJY29udGludWU7CgkJfQoJCWlmKCh4PT0tMSBhbmQgdltpKzFdLmE8dltpXS5hKSBvciAoeD09MSBhbmQgdltpKzFdLmE+dltpXS5hKSkKCQkJcmV0dXJuOwoJfQoJYW5zKys7Cn0KCnZvaWQgZ2VuUGVybSh2dCAmdiwgaW50IGksIGludCBqKXsKCWlmKGk9PWopewoJCWYodik7CgkJcmV0dXJuOwoJfQoJZm9yKGludCBrPWk7azw9ajtrKyspewoJCXN3YXAodltpXSx2W2tdKTsKCQlnZW5QZXJtKHYsaSsxLGopOwoJCXN3YXAodltpXSx2W2tdKTsKCX0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkKewoJaW50IHQ7CgljaW4+PnQ7Cglmb3IoaW50IHE9MTtxPD10O3ErKyl7CgkJY291dDw8IkNhc2UgIyI8PHE8PCI6ICI7CgkJaW50IG4seCx5OwoJCWNpbj4+bjsKCQl2dCB2OwoJCWZvaShuKXsKCQkJY2luPj54Pj55OwoJCQl0dXAgdDE7CgkJCXQxLmE9eDt0MS5iPXk7CgkJCXYucGIodDEpOwoJCX0KCQlhbnMgPSAwOwoJCWdlblBlcm0odiwwLG4tMSk7CgkJY291dDw8YW5zPDxlbmRsOwoJfQoJcmV0dXJuIDA7Cn0=