#include <bits/stdc++.h>
using namespace std;
int M, ret[2][305], tmp[305];
struct Mat {
  int A[305][305];
  Mat() {
    for (int i = 0; i <= M; i++)
      for (int j = 0; j <= M; j++) A[i][j] = 0;
  }
  Mat operator*(const Mat& b) {
    Mat c;
    for (int i = 0; i <= M; i++)
      for (int j = 0; j <= M; j++)
        for (int k = 0; k <= M; k++)
          (c.A[i][j] += 1ll * A[i][k] * b.A[k][j] % 1000000007) %= 1000000007;
    return c;
  }
  Mat operator^(int k) {
    Mat ret, now = *this;
    for (int i = 0; i <= M; i++) ret.A[i][i] = 1;
    for (; k; k >>= 1, now = now * now)
      if (k & 1) ret = ret * now;
    return ret;
  }
} A, Ans;
int main() {
  ret[0][1] = 1;
  for (int p = 1; p <= 7; p++) {
    int x, D = (1 << p - 1) - 1;
    M = (1 << p) - 1;
    A = Mat();
    for (int i = 0; i <= M; i++)
      for (int j = 0; j <= M; j++)
        for (int k = 0; k <= D; k++) {
          int flag = 1;
          tmp[0] = tmp[p] = 1;
          for (int t = 1; t <= p - 1; t++) tmp[t] = k >> t - 1 & 1;
          for (int t = 0; t <= p - 1; t++)
            if ((i >> t & 1) && (j >> t & 1) && tmp[t] && tmp[t + 1]) {
              flag = 0;
              break;
            }
          if (flag) A.A[i][j]++;
        }
    scanf("%d", &x);
    Ans = A ^ x;
    for (int i = 0; i <= M; i++) ret[p & 1][i] = 0;
    for (int i = 0; i <= M; i++)
      for (int j = 0; j <= M; j++)
        (ret[p & 1][i | (1 << p)] +=
         1ll * ret[p & 1 ^ 1][j] * Ans.A[j][i] % 1000000007) %= 1000000007;
  }
  printf("%d\n", ret[1][255]);
}
