#include <bits/stdc++.h>
using namespace std;
#define db double
#define ll long long int
#define ld long double
#define li long int
#define pb push_back
#define mp make_pair
#define FOR(i,a,b) for(i=a;i<b;i++)
#define RFOR(i,a,b) for(i=a;i>b;i--)
#define f first
#define s second
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);srand(time(NULL));
#define pl pair<ll,ll>
#define pll pair<ll,pl>
#define plll pair<ll,pll>
#define all(a) a.begin(),a.end()
#define nl cout<<endl
#define inf LONG_LONG_MAX
#define minf LONG_LONG_MIN
#define pq priority_queue
#define pi 3.1415926535897932
bool isPrime(ll n)
{
if (n <= 1) return false;
if (n <= 3) return true;
if (n%2 == 0 || n%3 == 0)
return false;
for (ll i=5; i*i<=n; i=i+6)
{
if (n%i == 0 || n%(i+2) == 0)
return false;
}
return true;
}
ll gcd(ll a,ll b)
{
if(a==0) return b;
if(a<b) swap(a,b);
return gcd(a%b,b);
}
ll gcdextended(ll a,ll b,ll &x,ll &y)
{
if(a==0)
{
x=0;
y=1;
return b;
}
ll x1,y1,gcd=gcdextended(b%a,a,x1,y1);
x=y1-(b/a)*x1;
y=x1;
return gcd;
}
ll modinverse(ll a,ll m)
{
ll x,y;
ll g=gcdextended(a,m,x,y);
if(g!=1)
{
cout<<"NOT POSSIBLE";
return -1;
}
else
return (x%m+m)%m;
}
ll po(ll x,ll y)
{
ll res = 1;
while (y > 0)
{
if (y & 1)
res = (res*x);
y = y>>1;
x = (x*x);
}
return res;
}
ll pom(ll x,ll y,ll p)
{
ll res=1;
x=x%p;
while(y>0)
{
if(y&1)
res=(res*x)%p;
y= y>>1;
x=(x*x)%p;
}
return res;
}
ll modinv(ll x,ll p)
{
ll y=pom(x,p-2,p);
return y;
}
ll root(ll x,vector<ll> &id)
{
while(id[x]!=x)
{
id[x]=id[id[x]];
x=id[x];
}
return x;
}
void uni(ll x,ll y,vector<ll> &id)
{
ll a=root(x,id);
ll b=root(y,id);
id[a]=id[b];
}
ll mst(vector<pll> &e,vector<ll> &id)
{
ll x,y,i,j;
ll mic=0,c;
FOR(i,0,e.size())
{
x=e[i].s.f;
y=e[i].s.s;
c=e[i].f;
if(root(x,id)!=root(y,id))
{
uni(x,y,id);
mic+=c;
}
}
return mic;
}
bool sec(const pl &a,const pl &b)
{
if(a.s==b.s) return a.f>b.f;
return a.s>b.s;
}
ll ff(ll in,vector<ll> &a,ll n)
{
ll i,x=0,y=2*n-1;
while(x<y)
{
if(x==in || x==in+1) x++;
if(y==in || y==in+1) y--;
if((x<in || x>in+1) && (y<in || y>in+1))
{
if(a[x]+a[y]==a[in]) x++,y--;
else return 0;
}
}
return 1;
}
int main()
{
//fast;
ll t;
scanf("%lld",&t);
while(t--)
{
ll n,p=1e9+7,i,an,x,y;
scanf("%lld",&n);
vector<ll> fact(n+1),inv(n+1),a(2*n);
fact[0]=1,fact[1]=1;
FOR(i,2,n+1) fact[i]=(fact[i-1]*i)%p;
inv[n]=modinv(fact[n],p);
RFOR(i,n-1,-1) inv[i]=(inv[i+1]*(i+1))%p;
FOR(i,0,2*n) scanf("%lld",&a[i]);
sort(all(a));
if(n==1)
{
if(a[0]==a[1]) printf("1\n");
else printf("0\n");
}
else
{
map<ll,ll> m;
map<pl,ll> fr;
map<pl,ll>::iterator it;
FOR(i,0,2*n-1)
{
if(a[i]==a[i+1] && m.find(a[i])==m.end() && ff(i,a,n))
break;
if(a[i]==a[i+1]) m[a[i]]=1;
}
//cout<<i<<" ";
if(i==2*n-1) printf("0\n");
else
{
an=fact[n-1];
x=0,y=2*n-1;
while(x<y)
{
if(x==i || x==i+1) x++;
if(y==i || y==i+1) y--;
if((x<i || x>i+1) && (y<i || y>i+1))
{
if(a[x]!=a[y]) an=(an*2)%p;
fr[mp(a[x],a[y])]++;
x++,y--;
}
}
for(it=fr.begin();it!=fr.end();it++)
{
x=it->s;
an=(an*inv[x])%p;
}
printf("%lld\n",an);
}
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIGxsIGxvbmcgbG9uZyBpbnQKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGxpIGxvbmcgaW50CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaT1hO2k8YjtpKyspCiNkZWZpbmUgUkZPUihpLGEsYikgZm9yKGk9YTtpPmI7aS0tKQojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksY2luLnRpZSgwKSxjb3V0LnRpZSgwKTtzcmFuZCh0aW1lKE5VTEwpKTsKI2RlZmluZSBwbCBwYWlyPGxsLGxsPgojZGVmaW5lIHBsbCBwYWlyPGxsLHBsPgojZGVmaW5lIHBsbGwgcGFpcjxsbCxwbGw+CiNkZWZpbmUgYWxsKGEpIGEuYmVnaW4oKSxhLmVuZCgpCiNkZWZpbmUgbmwgY291dDw8ZW5kbAojZGVmaW5lIGluZiBMT05HX0xPTkdfTUFYCiNkZWZpbmUgbWluZiBMT05HX0xPTkdfTUlOCiNkZWZpbmUgcHEgcHJpb3JpdHlfcXVldWUKI2RlZmluZSBwaSAzLjE0MTU5MjY1MzU4OTc5MzIKCmJvb2wgaXNQcmltZShsbCBuKQp7CiAgICAgICAgICAgIAogICAgICAgIGlmIChuIDw9IDEpICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKG4gPD0gMykgIHJldHVybiB0cnVlOwogICAgICAgICAgICAKICAgICAgICBpZiAobiUyID09IDAgfHwgbiUzID09IDApIAogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIAogICAgICAgIGZvciAobGwgaT01OyBpKmk8PW47IGk9aSs2KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKG4laSA9PSAwIHx8IG4lKGkrMikgPT0gMCkKICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIHRydWU7Cn0KbGwgZ2NkKGxsIGEsbGwgYikKewogICAgaWYoYT09MCkgICAgcmV0dXJuIGI7CiAgICBpZihhPGIpIHN3YXAoYSxiKTsKICAgIHJldHVybiBnY2QoYSViLGIpOwp9CmxsIGdjZGV4dGVuZGVkKGxsIGEsbGwgYixsbCAmeCxsbCAmeSkKewogICAgaWYoYT09MCkKICAgIHsKICAgICAgICB4PTA7CiAgICAgICAgeT0xOwogICAgICAgIHJldHVybiBiOwogICAgfQogICAgbGwgeDEseTEsZ2NkPWdjZGV4dGVuZGVkKGIlYSxhLHgxLHkxKTsKICAgIHg9eTEtKGIvYSkqeDE7CiAgICB5PXgxOwogICAgcmV0dXJuIGdjZDsKfQpsbCBtb2RpbnZlcnNlKGxsIGEsbGwgbSkKewogICAgbGwgeCx5OwogICAgbGwgZz1nY2RleHRlbmRlZChhLG0seCx5KTsKICAgIGlmKGchPTEpCiAgICB7CiAgICAgICAgY291dDw8Ik5PVCBQT1NTSUJMRSI7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZWxzZQogICAgICAgIHJldHVybiAoeCVtK20pJW07Cn0KbGwgcG8obGwgeCxsbCB5KSAKeyAKICAgIGxsIHJlcyA9IDE7ICAgICAgICAKICAgIHdoaWxlICh5ID4gMCkgCiAgICB7IAogICAgICAgIGlmICh5ICYgMSkgCiAgICAgICAgICAgIHJlcyA9IChyZXMqeCk7IAogICAgICAgIHkgPSB5Pj4xOwogICAgICAgIHggPSAoeCp4KTsgICAKICAgIH0gCiAgICByZXR1cm4gcmVzOyAKfQpsbCBwb20obGwgeCxsbCB5LGxsIHApCnsKICAgIGxsIHJlcz0xOwogICAgeD14JXA7CiAgICB3aGlsZSh5PjApCiAgICB7CiAgICAgICAgaWYoeSYxKQogICAgICAgICAgICByZXM9KHJlcyp4KSVwOwogICAgICAgIHk9IHk+PjE7CiAgICAgICAgeD0oeCp4KSVwOwogICAgfQogICAgcmV0dXJuIHJlczsKfQpsbCBtb2RpbnYobGwgeCxsbCBwKQp7CglsbCB5PXBvbSh4LHAtMixwKTsKCXJldHVybiB5Owp9CmxsIHJvb3QobGwgeCx2ZWN0b3I8bGw+ICZpZCkKewogICAgd2hpbGUoaWRbeF0hPXgpCiAgICB7CiAgICAgICAgaWRbeF09aWRbaWRbeF1dOwogICAgICAgIHg9aWRbeF07CiAgICB9CiAgICByZXR1cm4geDsKfQp2b2lkIHVuaShsbCB4LGxsIHksdmVjdG9yPGxsPiAmaWQpCnsKICAgIGxsIGE9cm9vdCh4LGlkKTsKICAgIGxsIGI9cm9vdCh5LGlkKTsKICAgIGlkW2FdPWlkW2JdOwp9CmxsIG1zdCh2ZWN0b3I8cGxsPiAmZSx2ZWN0b3I8bGw+ICZpZCkKewogICAgbGwgeCx5LGksajsKICAgIGxsIG1pYz0wLGM7CiAgICBGT1IoaSwwLGUuc2l6ZSgpKQogICAgewogICAgICAgIHg9ZVtpXS5zLmY7CiAgICAgICAgeT1lW2ldLnMuczsKICAgICAgICBjPWVbaV0uZjsKICAgICAgICBpZihyb290KHgsaWQpIT1yb290KHksaWQpKQogICAgICAgIHsKICAgICAgICAgICAgdW5pKHgseSxpZCk7CiAgICAgICAgICAgIG1pYys9YzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbWljOwp9CmJvb2wgc2VjKGNvbnN0IHBsICZhLGNvbnN0IHBsICZiKSAgCnsKICAgIGlmKGEucz09Yi5zKSAgICByZXR1cm4gYS5mPmIuZjsKICAgIHJldHVybiBhLnM+Yi5zOwp9CmxsIGZmKGxsIGluLHZlY3RvcjxsbD4gJmEsbGwgbikKewoJbGwgaSx4PTAseT0yKm4tMTsKCXdoaWxlKHg8eSkKCXsKCQlpZih4PT1pbiB8fCB4PT1pbisxKQl4Kys7CgkJaWYoeT09aW4gfHwgeT09aW4rMSkJeS0tOwoJCWlmKCh4PGluIHx8IHg+aW4rMSkgJiYgKHk8aW4gfHwgeT5pbisxKSkKCQl7CgkJCWlmKGFbeF0rYVt5XT09YVtpbl0pCXgrKyx5LS07CgkJCWVsc2UJcmV0dXJuIDA7CgkJfQoJfQoJcmV0dXJuIDE7Cn0KaW50IG1haW4oKQp7CiAgICAvL2Zhc3Q7CiAgICBsbCB0OwogICAgc2NhbmYoIiVsbGQiLCZ0KTsKICAgIHdoaWxlKHQtLSkKICAgIHsKICAgIAlsbCBuLHA9MWU5KzcsaSxhbix4LHk7CiAgICAJc2NhbmYoIiVsbGQiLCZuKTsKICAgIAl2ZWN0b3I8bGw+IGZhY3QobisxKSxpbnYobisxKSxhKDIqbik7CiAgICAJZmFjdFswXT0xLGZhY3RbMV09MTsKICAgIAlGT1IoaSwyLG4rMSkJZmFjdFtpXT0oZmFjdFtpLTFdKmkpJXA7CiAgICAJaW52W25dPW1vZGludihmYWN0W25dLHApOyAKICAgIAlSRk9SKGksbi0xLC0xKQlpbnZbaV09KGludltpKzFdKihpKzEpKSVwOwogICAgCUZPUihpLDAsMipuKQlzY2FuZigiJWxsZCIsJmFbaV0pOwogICAgCXNvcnQoYWxsKGEpKTsKICAgIAlpZihuPT0xKQogICAgCXsKICAgIAkJaWYoYVswXT09YVsxXSkJcHJpbnRmKCIxXG4iKTsKICAgIAkJZWxzZQlwcmludGYoIjBcbiIpOwogICAgCX0KICAgIAllbHNlCiAgICAJewoJIAkJbWFwPGxsLGxsPiBtOwoJIAkJbWFwPHBsLGxsPiBmcjsKCSAJCW1hcDxwbCxsbD46Oml0ZXJhdG9yIGl0OwoJICAgIAlGT1IoaSwwLDIqbi0xKQoJICAgIAl7CgkgICAgCQlpZihhW2ldPT1hW2krMV0gJiYgbS5maW5kKGFbaV0pPT1tLmVuZCgpICYmIGZmKGksYSxuKSkKCSAgICAJCQlicmVhazsKCSAgICAJCWlmKGFbaV09PWFbaSsxXSkgCW1bYVtpXV09MTsKCSAgICAJfQoJICAgIAkvL2NvdXQ8PGk8PCIgIjsKCSAgICAJaWYoaT09MipuLTEpCXByaW50ZigiMFxuIik7CgkgICAgCWVsc2UKCSAgICAJewoJICAgIAkJYW49ZmFjdFtuLTFdOwoJCSAgICAJeD0wLHk9MipuLTE7CgkJICAgIAl3aGlsZSh4PHkpCgkJICAgIAl7CgkJICAgIAkJaWYoeD09aSB8fCB4PT1pKzEpCXgrKzsKCQkgICAgCQlpZih5PT1pIHx8IHk9PWkrMSkJeS0tOwoJCSAgICAJCWlmKCh4PGkgfHwgeD5pKzEpICYmICh5PGkgfHwgeT5pKzEpKQoJCSAgICAJCXsKCQkgICAgCQkJaWYoYVt4XSE9YVt5XSkJYW49KGFuKjIpJXA7CgkJICAgIAkJCWZyW21wKGFbeF0sYVt5XSldKys7CgkJICAgIAkJCXgrKyx5LS07CgkJICAgIAkJfQkKCQkgICAgCX0KCQkgICAgCWZvcihpdD1mci5iZWdpbigpO2l0IT1mci5lbmQoKTtpdCsrKQoJCSAgICAJewoJCSAgICAJCXg9aXQtPnM7CgkJICAgIAkJYW49KGFuKmludlt4XSklcDsKCQkgICAgCX0KCQkgICAgCXByaW50ZigiJWxsZFxuIixhbik7CgkJICAgIH0KCQl9CiAgICB9Cn0K