#include<bits/stdc++.h>
using namespace std;
typedef long long int lld;
lld t[3][3]={{1,0,1},{0,2,3},{0,3,5}};
lld a[3][3]={{1,0,1},{0,2,3},{0,3,5}};
lld mod = 1000000007;
void mul(lld a[][3],lld b[][3])
{
lld i,j,k;
lld temp[3][3]={0};
for(i=0;i<3;i++)
for(j=0;j<3;j++)
for(k=0;k<3;k++)
{
lld x = a[i][k]*b[k][j];
while(x>=mod)
x=x-mod;
lld y = x+temp[i][j];
while(y>=mod)
y=y-mod;
temp[i][j] = y;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=temp[i][j];
}
void fib(lld n)
{
if(n==2)
{
a[0][0]=1;
a[0][1]=3;
a[0][2]=6;
a[1][0]=a[2][0]=0;
a[1][1]=13;
a[1][2]=a[2][1]=21;
a[2][2]=34;
return;
}
if(n==1)
return;
fib(n/2);
mul(a,a);
if(n&1)
mul(a,t);
}
void fastscan(lld &number)
{
//variable to indicate sign of input number
bool negative = false;
register int c;
number = 0;
// extract current character from buffer
c = getchar();
if (c=='-')
{
// number is negative
negative = true;
// extract the next character from the buffer
c = getchar();
}
// Keep on extracting characters if they are integers
// i.e ASCII Value lies from '0'(48) to '9' (57)
for (; (c>47 && c<58); c=getchar())
number = number *10 + c - 48;
// if scanned input has a negative sign, negate the
// value of the input number
if (negative)
number *= -1;
}
int main()
{
lld t;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
fastscan(t);
// scanf("%lld",&t);
while(t--)
{
lld n;
fastscan(n);
// scanf("%lld",&n);
a[0][0]=a[0][2]=1;
a[0][1]=a[1][0]=a[2][0]=0;
a[1][2]=a[2][1]=3;
a[2][2]=5;
a[1][1]=2;
if(n==0)
cout << "0\n";
else
{
fib(n);
lld q=2*a[0][2];
while(q>=mod)
q=q-mod;
lld r = q+a[0][1];
while(r>=mod)
r=r-mod;
cout << r << "\n";
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAp0eXBlZGVmIGxvbmcgbG9uZyBpbnQgbGxkOwogCmxsZCB0WzNdWzNdPXt7MSwwLDF9LHswLDIsM30sezAsMyw1fX07CmxsZCBhWzNdWzNdPXt7MSwwLDF9LHswLDIsM30sezAsMyw1fX07CmxsZCBtb2QgPSAxMDAwMDAwMDA3OwogCnZvaWQgbXVsKGxsZCBhW11bM10sbGxkIGJbXVszXSkKewoJbGxkIGksaixrOwoJbGxkIHRlbXBbM11bM109ezB9OwoJZm9yKGk9MDtpPDM7aSsrKQoJZm9yKGo9MDtqPDM7aisrKQoJZm9yKGs9MDtrPDM7aysrKQoJewoJCWxsZCB4ID0gYVtpXVtrXSpiW2tdW2pdOwoJCXdoaWxlKHg+PW1vZCkKCQl4PXgtbW9kOwoJCWxsZCB5ID0geCt0ZW1wW2ldW2pdOwoJCQoJCXdoaWxlKHk+PW1vZCkKCQl5PXktbW9kOwoJCXRlbXBbaV1bal0gPSB5OwoJfQogCglmb3IoaT0wO2k8MztpKyspCglmb3Ioaj0wO2o8MztqKyspCglhW2ldW2pdPXRlbXBbaV1bal07Cn0KIAp2b2lkIGZpYihsbGQgbikKewoJaWYobj09MikKICAgIHsKICAgIAlhWzBdWzBdPTE7CiAgICAJYVswXVsxXT0zOwogICAgCWFbMF1bMl09NjsKICAgIAlhWzFdWzBdPWFbMl1bMF09MDsKICAgIAlhWzFdWzFdPTEzOwogICAgCWFbMV1bMl09YVsyXVsxXT0yMTsKICAgIAlhWzJdWzJdPTM0OwogICAgCXJldHVybjsKICAgIH0KCWlmKG49PTEpCglyZXR1cm47CglmaWIobi8yKTsKCW11bChhLGEpOwoJaWYobiYxKQoJbXVsKGEsdCk7Cn0KCnZvaWQgZmFzdHNjYW4obGxkICZudW1iZXIpIAp7IAogICAgLy92YXJpYWJsZSB0byBpbmRpY2F0ZSBzaWduIG9mIGlucHV0IG51bWJlciAKICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsgCiAgICByZWdpc3RlciBpbnQgYzsgCiAgCiAgICBudW1iZXIgPSAwOyAKICAKICAgIC8vIGV4dHJhY3QgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSBidWZmZXIgCiAgICBjID0gZ2V0Y2hhcigpOyAKICAgIGlmIChjPT0nLScpIAogICAgeyAKICAgICAgICAvLyBudW1iZXIgaXMgbmVnYXRpdmUgCiAgICAgICAgbmVnYXRpdmUgPSB0cnVlOyAKICAKICAgICAgICAvLyBleHRyYWN0IHRoZSBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXIgCiAgICAgICAgYyA9IGdldGNoYXIoKTsgCiAgICB9IAogIAogICAgLy8gS2VlcCBvbiBleHRyYWN0aW5nIGNoYXJhY3RlcnMgaWYgdGhleSBhcmUgaW50ZWdlcnMgCiAgICAvLyBpLmUgQVNDSUkgVmFsdWUgbGllcyBmcm9tICcwJyg0OCkgdG8gJzknICg1NykgCiAgICBmb3IgKDsgKGM+NDcgJiYgYzw1OCk7IGM9Z2V0Y2hhcigpKSAKICAgICAgICBudW1iZXIgPSBudW1iZXIgKjEwICsgYyAtIDQ4OyAKICAKICAgIC8vIGlmIHNjYW5uZWQgaW5wdXQgaGFzIGEgbmVnYXRpdmUgc2lnbiwgbmVnYXRlIHRoZSAKICAgIC8vIHZhbHVlIG9mIHRoZSBpbnB1dCBudW1iZXIgCiAgICBpZiAobmVnYXRpdmUpIAogICAgICAgIG51bWJlciAqPSAtMTsgCn0gCgppbnQgbWFpbigpCnsKCWxsZCB0OwoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKE5VTEwpOwoJZmFzdHNjYW4odCk7Ci8vCXNjYW5mKCIlbGxkIiwmdCk7Cgl3aGlsZSh0LS0pCgl7CgkJbGxkIG47CgkJZmFzdHNjYW4obik7CgkvLwlzY2FuZigiJWxsZCIsJm4pOwoJCWFbMF1bMF09YVswXVsyXT0xOwoJCWFbMF1bMV09YVsxXVswXT1hWzJdWzBdPTA7CgkJYVsxXVsyXT1hWzJdWzFdPTM7CgkJYVsyXVsyXT01OwoJCWFbMV1bMV09MjsKCQkKCQlpZihuPT0wKQoJICAgIGNvdXQgPDwgIjBcbiI7CgkJZWxzZQoJCXsKCQkJZmliKG4pOwoJCQlsbGQgcT0yKmFbMF1bMl07CgkJCXdoaWxlKHE+PW1vZCkKCQkJcT1xLW1vZDsKCQkJbGxkIHIgPSBxK2FbMF1bMV07CgkJCXdoaWxlKHI+PW1vZCkKCQkJcj1yLW1vZDsKCQkJY291dCA8PCByIDw8ICJcbiI7CgkJfQoJfQoJcmV0dXJuIDA7Cn0=