#include <bits/stdc++.h>
using namespace std;
const int N = 157;
const int MOD = 1e9 + 7;
int n, m, dp[4][N][N], s[4][N][N];
inline void inc(int &x, int y) {
  x += y;
  if (x >= MOD) x -= MOD;
}
inline long long get(int g, int lx, int rx, int ly, int ry) {
  if (lx > rx || ly > ry) return 0;
  return 0ll + s[g][rx][ry] + s[g][lx - 1][ly - 1] - s[g][rx][ly - 1] -
         s[g][lx - 1][ry];
}
int solve() {
  if (n < m) swap(n, m);
  int ret = 0;
  for (int i = (1); i < (m + 1); ++i)
    for (int j = (i); j < (m + 1); ++j) dp[0][i][j] = 1;
  for (int _n = (0); _n < (n); ++_n) {
    int cnt = 0;
    for (int k = (0); k < (4); ++k)
      for (int i = (1); i < (m + 1); ++i)
        for (int j = (1); j < (m + 1); ++j) {
          inc(cnt, dp[k][i][j]);
          long long tmp = 0ll + dp[k][i][j] + s[k][i - 1][j] + s[k][i][j - 1] -
                          s[k][i - 1][j - 1];
          s[k][i][j] = (tmp % MOD + MOD) % MOD;
        }
    inc(ret, 1ll * cnt * (n - _n) % MOD);
    for (int i = (1); i < (m + 1); ++i)
      for (int j = (i); j < (m + 1); ++j) {
        dp[0][i][j] = (get(0, i, j, i, j)) % MOD;
        dp[1][i][j] = (get(0, i, j, j + 1, m) + get(1, i, j, j, m)) % MOD;
        dp[2][i][j] = (get(0, 1, i - 1, i, j) + get(2, 1, i, i, j)) % MOD;
        dp[3][i][j] = (get(0, 1, i - 1, j + 1, m) + get(1, 1, i - 1, j, m) +
                       get(2, 1, i, j + 1, m) + get(3, 1, i, j, m)) %
                      MOD;
        for (int k = (0); k < (4); ++k) inc(dp[k][i][j], MOD);
      }
  }
  return ret;
}
int main() {
  scanf("%d%d", &n, &m);
  printf("%d", solve());
  return 0;
}
