#include<bits/stdc++.h>
#define reg register
typedef long long ll;
using namespace std;
inline int qr(){
	int x=0,f=0;char ch=0;
	while(!isdigit(ch)){f|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return f?-x:x;
}
const int N=1e5+100,mod=1e9+7;
int n;
int a[N],f[N],g[N];
struct matrix{
	int H,W;
	ll a[2][2];
	void one(){
		a[0][0]=1,a[0][1]=1;
		a[1][0]=1,a[1][1]=0;
	}
	void zero(){
		for(reg int i=0;i<H;i++){
			for(reg int j=0;j<W;j++) 
			a[i][j]=0;
		}
	}
	matrix operator *(const matrix &t)const{
		matrix res;
		res.H=H,res.W=t.W;
		res.zero();
		for(reg int i=0;i<res.H;i++){
			for(reg int j=0;j<res.W;j++){
				for(reg int k=0;k<W;k++){
					res.a[i][j]=(res.a[i][j]+a[i][k]*t.a[k][j]%mod)%mod;
				}
			}
		}
		return res;
	}
	void print(){
		for(reg int i=0;i<H;i++){
			for(reg int j=0;j<W;j++){
				printf("%d ",a[i][j]);
			}printf("\n");
		}printf("\n");
	}
}tmp,tpp;
matrix mul(matrix a,matrix b){
	matrix res;
	res.H=a.H,res.W=b.W;
	res.zero();
	for(reg int i=0;i<res.H;i++){
		for(reg int j=0;j<res.W;j++){
			for(reg int k=0;k<a.W;k++){
				res.a[i][j]=(res.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
			}
		}
	}
	return res;
}
int main(){
	f[0]=0,f[1]=1;
	n=qr();
	for(reg int i=2;i<=n+2;i++) f[i]=(f[i-1]+f[i-2])%mod;
	for(reg int i=0;i<n-2;i++){
		tmp.H=1,tmp.W=2,tmp.a[0][0]=f[i],tmp.a[0][1]=f[i+2];
		tpp.H=2,tpp.W=2,tpp.one();
		int b=n-i-3;
		while(b){
			if(b&1) tmp=mul(tmp,tpp);
			tpp=mul(tpp,tpp),b>>=1;
		}
		g[n-i]=(tmp.a[0][1]+tmp.a[0][0])%mod;	
	}
	g[1]=f[n+1],g[2]=f[n-2];
	ll ans=0;
	for(reg int i=1;i<=n;i++){
		a[i]=qr();
		ans=(ans+(ll)g[i]*a[i]%mod)%mod;
	}
	printf("%lld",ans);
	return 0;
}
/*
1
2  0
3  1 1
5  1 3  1
8  2 4  4  2
13 3 7  5  7  3
21 5 11 9  9  11 5
34 8 18 14 16 14 18 8
*/
#include<bits/stdc++.h>
#define int ll
#define sz(x) int((x).size())
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
using pi = pair<int,int>;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int minf = 0xc0c0c0c0c0c0c0c0;

const int mod = int(1e9) + 7;

int A[100100];
pi dp[100100][2];

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);


    int n; cin>>n;
    for (int i=1; i<=n; i++) cin>>A[i];

    if (n == 1) {
        cout<<A[1]<<'\n';
        return 0;
    }

    dp[2][0] = pi(A[1] + A[2], 1);

    dp[2][1] = pi((A[1] - A[2] + mod) % mod, 1);


    for (int i=3; i<=n; i++) {

        dp[i][0].first = dp[i-1][0].first + A[i] * dp[i-1][0].second % mod + dp[i-1][1].first + A[i] * dp[i-1][1].second % mod;
        dp[i][0].first %= mod;

        dp[i][0].second = dp[i-1][0].second + dp[i-1][1].second;
        if (dp[i][0].second >= mod) dp[i][0].second -= mod;



        dp[i][1].first = dp[i-1][0].first - (A[i] * dp[i-1][0].second % mod);
        if (dp[i][1].first < 0) dp[i][1].first += mod;

        dp[i][1].second = dp[i-1][0].second;
    }


    cout<<(dp[n][0].first + dp[n][1].first)%mod<<'\n';


    return 0;
}