#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define ms(arr,a) memset(arr,a,sizeof arr)
#define debug(x) cout<<"< "#x" = "<<x<<" >"<<endl
const int maxn=1e5+5;
const int mod=1e9+7;
int fac[maxn],inv_fac[maxn];
int quick_pow(int a,int n)
{
int ret=1;
while(n)
{
if(n&1)ret=1LL*ret*a%mod;
a=1LL*a*a%mod;
n>>=1;
}
return ret;
}
int inv2=quick_pow(2,mod-2);
void init_fac()
{
fac[0]=inv_fac[0]=1;
for(int i=1;i<maxn;++i)
{
fac[i]=1LL*fac[i-1]*i%mod;
inv_fac[i]=quick_pow(fac[i],mod-2);
}
}
int block_size=316;
struct Query
{
int a,b,id,block;
Query(){}
Query(int x,int y,int z):a(x),b(y),id(z){block=a/block_size;}
bool operator < (const Query q)const{return block<q.block||(block==q.block&&b<q.b);}
}q[maxn];
int ans[maxn];
inline int c(int n,int m)
{
return 1LL*fac[n]*inv_fac[m]%mod*inv_fac[n-m]%mod;
}
int main()
{
//freopen("1.txt","w",stdout);
init_fac();
int T;scanf("%d",&T);
for(int i=1;i<=T;++i)
{
int n,m;
scanf("%d%d",&n,&m);
q[i]=Query(n,m,i);
}
sort(q+1,q+T+1);
int& ans1=ans[q[1].id];
for(int i=0;i<=q[1].b;++i)ans1=(ans1+c(q[1].a,i))%mod;
for(int i=2;i<=T;++i)
{
int n=q[i-1].a,m=q[i-1].b,an=ans[q[i-1].id];
while(q[i].b<m)an=(an-c(n,m--)+mod)%mod;
while(q[i].a>n)an=(2*an%mod-c(n++,m)+mod)%mod;
while(q[i].b>m)an=(an+c(n,++m))%mod;
while(q[i].a<n)an=1LL*(an+c(--n,m))*inv2%mod;
ans[q[i].id]=an;
}
for(int i=1;i<=T;++i)printf("%d
",ans[i]);
}