#include <bits/stdc++.h>
using namespace std;
const int SIZE = 20 + 5;
const int Mod = 1e9 + 7;
int inv[SIZE], n;
long long a[SIZE], m, ans;
inline long long read() {
  char ch = getchar();
  long long f = 1, x = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline int Qpow(int b, int p) {
  long long ans = 1, t = b;
  for (; p; p >>= 1, t = t * t % Mod)
    if (p & 1) ans = ans * t % Mod;
  return ans % Mod;
}
inline int C(long long y, int x) {
  if (y < 0 || x < 0 || y < x) return 0;
  y %= Mod;
  if (y == 0 || x == 0) return 1;
  int ans = 1;
  for (int i = 0; i < x; i++) ans = (long long)ans * (y - i) % Mod;
  for (int i = 1; i <= x; i++) ans = (long long)ans * inv[i] % Mod;
  return ans;
}
int main() {
  for (int i = 1; i <= 20; i++) inv[i] = Qpow(i, Mod - 2);
  std::cin >> n >> m;
  for (int i = 1; i <= n; i++) a[i] = read();
  for (int x = 0; x < (1 << n); x++) {
    if (!x)
      ans = (ans + C(n + m - 1, n - 1)) % Mod;
    else {
      long long t = n + m;
      int p = 0;
      for (int i = 0; i < n; i++) {
        if (x >> i & 1) {
          p++;
          t -= a[i + 1];
        }
      }
      t -= p + 1;
      if (p & 1)
        ans = (ans - C(t, n - 1)) % Mod;
      else
        ans = (ans + C(t, n - 1)) % Mod;
    }
  }
  printf("%lld", (ans + Mod) % Mod);
  return 0;
}
