#include <bits/stdc++.h>
using namespace std;
const int M = 333;
const int MOD = 1e9 + 7;
const int MAXN = 7;
int prep[10][130][130];
int w[10];
int add(int a, int b) {
  int c = a + b;
  while (c >= MOD) c -= MOD;
  return c;
}
int mul(int a, int b) { return 1LL * a * b % MOD; }
struct matrix {
  int data[(1 << MAXN)][(1 << MAXN)];
  int n, m;
  matrix(int a = (1 << MAXN), int b = (1 << MAXN), bool c = 0) {
    n = a;
    m = b;
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++) data[i][j] = (i == j) * c;
  }
  void operator*=(matrix c) {
    matrix res(n, c.m);
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++)
        for (int k = 0; k < c.m; k++)
          res.data[i][k] = add(res.data[i][k], mul(data[i][j], c.data[j][k]));
    (*this) = res;
  }
  void operator^=(int c) {
    matrix res(n, m, 1);
    for (; c; c /= 2) {
      if (c & 1) res *= (*this);
      (*this) *= (*this);
    }
    (*this) = res;
  }
};
int bit(int mask, int ind) { return ((mask >> ind) & 1); }
void pre_proc(int len, int mf, int me, int mm) {
  len++;
  mm |= (1 << (len - 1));
  mm = (mm << 1) | 1;
  for (int i = 0; i < len; i++)
    if (bit(mf, i) && bit(me, i) && bit(mm, i) && bit(mm, i + 1)) return;
  prep[len - 1][mf][me]++;
}
int main() {
  for (int i = 0; i < 7; i++) cin >> w[i];
  for (int i = 0; i < 7; i++)
    for (int j = 0; j < (1 << (i + 1)); j++)
      for (int k = 0; k < (1 << (i + 1)); k++)
        for (int h = 0; h < (1 << i); h++) pre_proc(i, j, k, h);
  matrix M[7];
  for (int i = 0; i < 7; i++) M[i].n = M[i].m = (1 << (i + 1));
  for (int i = 0; i < 7; i++) {
    for (int j = 0; j < (1 << (i + 1)); j++)
      for (int k = 0; k < (1 << (i + 1)); k++) M[i].data[j][k] = prep[i][j][k];
    M[i] ^= w[i];
  }
  matrix A[7];
  for (int i = 1; i < 8; i++) {
    A[i - 1].n = 1 << i;
    A[i - 1].m = 1;
  }
  A[0].data[1][0] = 1;
  M[0] *= A[0];
  swap(A[0], M[0]);
  for (int i = 1; i < 7; i++) {
    for (int j = 0; j < (1 << i); j++)
      A[i].data[(j << 1) | 1][0] = A[i - 1].data[j][0];
    M[i] *= A[i];
    swap(A[i], M[i]);
  }
  cout << A[6].data[(1 << MAXN) - 1][0] << endl;
}
