#include <bits/stdc++.h>
using namespace std;
bool debug = false;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
long long ln, lk, lm;
long long f[4][155][155], s[4][155][155];
long long md(long long x) {
  x %= 1000000007;
  if (x < 0) x += 1000000007;
  return x % 1000000007;
}
void pre(int k) {
  for (int(i) = 1; (i) <= (int)(m); (i)++)
    for (int(j) = 1; (j) <= (int)(m); (j)++) {
      s[k][i][j] =
          md(s[k][i][j - 1] + s[k][i - 1][j] - s[k][i - 1][j - 1] + f[k][i][j]);
    }
}
long long cal(int k, int x1, int y1, int x2, int y2) {
  if (x1 > x2 || y1 > y2) return 0;
  return md(s[k][x2][y2] - s[k][x1 - 1][y2] - s[k][x2][y1 - 1] +
            s[k][x1 - 1][y1 - 1]);
}
void dd() {
  for (int(i) = 1; (i) <= (int)(m); (i)++)
    for (int j = i; j <= m; j++) {
      f[0][i][j] = md(1 + cal(0, i, i, j, j));
      f[1][i][j] = cal(0, 1, i, i - 1, j);
      (f[1][i][j] += cal(1, 1, i, i, j)) %= 1000000007;
      f[2][i][j] = cal(0, i, j + 1, j, m);
      (f[2][i][j] += cal(2, i, j, j, m)) %= 1000000007;
      f[3][i][j] = 0;
      (f[3][i][j] += cal(0, 1, j + 1, i - 1, m)) %= 1000000007;
      (f[3][i][j] += cal(1, 1, j + 1, i, m)) %= 1000000007;
      (f[3][i][j] += cal(2, 1, j, i - 1, m)) %= 1000000007;
      (f[3][i][j] += cal(3, 1, j, i, m)) %= 1000000007;
    }
}
int main() {
  scanf("%d%d", &n, &m);
  long long ans = 0;
  for (int(i) = 1; (i) <= (int)(n); (i)++) {
    dd();
    for (int(k) = 0; (k) < (int)(4); (k)++) {
      pre(k);
      ans += md(s[k][m][m]);
      ans %= 1000000007;
    }
  }
  printf("%lld\n", ans);
  return 0;
}
