#include <bits/stdc++.h>
using namespace std;
const int N = 155;
const int mod = 1e9 + 7;
int dp[N][N][N][4];
int sum[N];
void add(int &x, int y) {
  x = (x + y);
  if (x >= mod) x -= mod;
}
int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) != EOF) {
    for (int i = 1; i <= n; i++) {
      memset(sum, 0, sizeof(sum));
      for (int len = 1; len <= m; len++) {
        for (int j = 1; j + len - 1 <= m; j++) {
          int k = j + len - 1;
          dp[i][j][k][0] = dp[i][j][k - 1][0];
          add(sum[k], dp[i - 1][j][k][0]);
          add(dp[i][j][k][0], sum[k]);
          if (len == 1) dp[i][j][k][0] = i;
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      memset(sum, 0, sizeof(sum));
      for (int j = 1; j <= m; j++) {
        for (int k = j; k <= m; k++) {
          dp[i][j][k][1] = dp[i][j][k - 1][1];
          add(sum[k], dp[i - 1][j][k][1]);
          add(sum[k], dp[i - 1][j - 1][k][0]);
          add(dp[i][j][k][1], sum[k]);
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++)
        for (int k = j; k <= m; k++)
          dp[i][j][k][2] = dp[i][m - k + 1][m - j + 1][1];
    }
    for (int i = 1; i <= n; i++) {
      memset(sum, 0, sizeof(sum));
      for (int len = m; len >= 1; len--) {
        for (int j = 1; j + len - 1 <= m; j++) {
          int k = j + len - 1;
          if (j == 1 || k == m) continue;
          dp[i][j][k][3] = dp[i][j][k + 1][3];
          add(sum[k], dp[i - 1][j - 1][k + 1][0]);
          add(sum[k], dp[i - 1][j][k + 1][1]);
          add(sum[k], dp[i - 1][j - 1][k][2]);
          add(sum[k], dp[i - 1][j][k][3]);
          add(dp[i][j][k][3], sum[k]);
        }
      }
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= m; j++) {
        for (int k = j; k <= m; k++) {
          for (int l = 0; l < 4; l++) add(ans, dp[i][j][k][l]);
        }
      }
    }
    printf("%d\n", ans);
  }
  return 0;
}
