#include<bits/stdc++.h>usingnamespace std;
#define int long long
#define endl '\n'
typedefunsignedlonglong ull;
constint N =1e5;
constint INF =0x3f3f3f3f3f3f3f3f;
constint MOD =1e9+7;
intqpow(int x, int k)
{
int ret =1;
x %= MOD;
while (k)
{
if (k &1)
{
ret *= x;
ret %= MOD;
}
x *= x;
x %= MOD;
k >>=1;
}
return ret;
}
intinv(int x, int mod)
{
return qpow(x, mod -2);
}
map<int, int> mp;
voidsolve()
{
string s, t;
int k;
cin >> s >> t >> k;
if (t == s) /////
{
int INV = inv(3, MOD);
int b1 = (1+ INV) % MOD;
int ans = b1 * qpow(4, k -1) % MOD;
ans -=1;
ans += MOD;
ans %= MOD;
ans -= INV;
ans += MOD;
ans %= MOD;
cout << ans << endl;
return;
}
if (s.length() < t.length())
{
swap(s, t);
}
int n = s.length();
int m = t.length();
for (int i = m -1; i >=0; --i)
{
int j = i - m + n;
s[j] ='0'+ (s[j] -'0') ^ (t[i] -'0');
}
// s
if (s.length() %2!=0)
{
s ="0"+ s;
} // 0123
// cout << "s " << s << endl;
int fir =0;
int base =1;
for (int i = s.length() -1; i >0; i -=2)
{
int num = (s[i -1] -'0') *2+ s[i] -'0';
if (i == s.length() -1)
{
fir += (mp[num]) * base % MOD;
}
else fir += (mp[num] -1) * base % MOD;
fir %= MOD;
base = (base *4+1) % MOD;
}
fir -=1;
fir += MOD;
fir %= MOD;
// cout << "fir " << fir << endl;
int cnt00 =0;
for (int i = s.length() -1; i >0; i-=2)
{
if (s[i] =='0'&& s[i -1] =='0')
{
cnt00++;
}
if(s[i]=='1'||s[i-1]=='1')
{
break;
}
}
if (1+ cnt00 < k)
{
cout <<-1<< endl;
return;
}
int INV = inv(3, MOD);
int b1 = (1+ INV) % MOD;
int ans = b1 * qpow(4, k -1) % MOD; // add
ans -=1;
ans += MOD;
ans %= MOD;
ans -= INV;
ans += MOD;
ans %= MOD;
ans += fir;
ans %= MOD;
cout << ans << endl;
}
signedmain()
{
// cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
mp[0] =1;
mp[1] =2;
mp[3] =3;
mp[2] =4;
int T =1;
cin >> T;
for (int i =1; i <= T; ++i)
{
solve();
}
return0;
}
/*
*/
#include<bits/stdc++.h>usingnamespace std;
#define int long long
#define endl '\n'
typedefunsignedlonglong ull;
constint N =1e5;
constint INF =0x3f3f3f3f3f3f3f3f;
constint MOD =1e9+7;
voidsolve()
{
int H, W;
cin >> H >> W;
int h[4], w[4];
int cf =0;
int ch =0, cw =0;
for (int i =1; i <=3; ++i)
{
cin >> h[i] >> w[i];
if (h[i] == H && w[i] == W)
{
cf =1;
}
if (h[i] == H)
{
ch++;
}
if (w[i] == W)
{
cw++;
}
}
// cout << ch << " " << cw << endl;
int ans =1;
if (cf ==1)
{
int ans =1;
for (int i =1; i <=3; ++i)
{
ans *= (H - h[i] +1) % MOD * (W - w[i] +1) % MOD;
ans %= MOD;
}
cout << ans << endl;
return;
}
int check = max(ch, cw);
if (check ==0)
{
cout <<0<< endl;
return;
}
if (ch < cw) // 对应 1 vs 2 的情况 ,旋转矩形
{
swap(H, W);
swap(ch, cw);
swap(h, w);
}
// ch!=0
if (ch ==3)
{
ans =0;
if (w[1] + w[2] + w[3] < W)
{
cout <<0<< endl;
return;
}
for (int mid =1; mid <=3; ++mid)
{
int cover = w[1] + w[2] + w[3] - w[mid];
int add1 =0;
if (cover >= W)
{
add1 += (W - w[mid] +1) % MOD;
add1 %= MOD;
}
else {
int step = W - cover;
// 1 4 6
int l, r;
if (mid ==1)
l =2, r =3;
if (mid ==2)
l =1, r =3;
if (mid ==3)
l =1, r =2; //强制安排两侧左右位置
int ndl2 = w[l] +1;
int ndl1 = W - w[r] - w[mid] +1;
ndl1 = max(ndl1, (int)1);
ndl2 = min(ndl2, W - w[mid] +1);
if (ndl2 - ndl1 +1>0)
add1 += ndl2 - ndl1 +1;
add1 %= MOD;
}
ans += add1;
ans %= MOD;
}
for (int r =1; r <=3; ++r)
{
int l =0;
for (int i =1; i <=3; ++i)
{
if (r == i)
continue;
l = max(w[i], l);
}
if (l + w[r] >= W)
{
ans -=1; ///
ans %= MOD;
ans += MOD;
ans %= MOD;
}
}
ans *=2;
ans %= MOD;
cout << ans << endl;
return;
}
int L =0;
int pos =-1;
for (int i =1; i <=3; ++i)
{
if (h[i] == H)
{
L = w[i];
pos = i;
break;
}
}
if (h[1] + h[2] + h[3] - h[pos] < H)
{
cout <<0<< endl;
return;
}
if (ch ==2)
{
for (int i =1; i <=3; ++i)
{
if (h[i] == H && i != pos)
{
if (w[i] + L < W)
{
cout <<0<< endl;
return;
}
}
}
for (int i =1; i <=3; ++i)
{
if (h[i] != H)
{
ans *= (H - h[i] +1) % MOD * (W - w[i] +1) % MOD;
ans %= MOD;
}
}
}
else {
for (int i =1; i <=3; ++i)
{
if (i != pos)
{
if (w[i] + L < W)
{
cout <<0<< endl;
return; ///////
}
}
}
ans *=2;
ans %= MOD;
}
ans *=2;
ans %= MOD;
cout << ans << endl;
}
signedmain()
{
// cout.flags(ios::fixed); cout.precision(8);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T =1;
cin >> T;
for (int i =1; i <= T; ++i)
{
solve();
}
//////////////////////////用来测试的
// int ww[3] = {5, 5, 4};
// int n = 5;
// int ans = 0;
// for (int i = 1; i <= n; ++i)
// {
// for (int j = 1; j <= n; ++j)
// {
// for (int k = 1; k <= n; ++k)
// {
// vector<int> s(n + 1, 0);
// if (i + ww[0] - 1 > n || j + ww[1] - 1 > n || k + ww[2] - 1 > n)
// continue;
// for (int l = i; l <= i + ww[0] - 1; ++l)
// {
// s[l] = 1;
// }
// for (int l = j; l <= j + ww[1] - 1; ++l)
// {
// s[l] = 1;
// }
// for (int l = k; l <= k + ww[2] - 1; ++l)
// {
// s[l] = 1;
// }
// int ok = 1;
// for (int l = 1; l <= n; ++l)
// {
// if (s[l] == 0)
// ok = 0;
// }
// if (ok)
// {
// ans++;
// }
// }
// }
// }
// cout << ans << endl;
return0;
}