#include<bits/stdc++.h>
#define X first
#define Y second
#define all(x) begin(x), end(x)
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define FORD(i, b, a) for(int i = (b); i >= (a); i--)
#define REP(i, a, b) for (int i = (a); i < (b); i++)
#define mxx max_element
#define mnn min_element
#define SQR(x) (1LL * (x) * (x))
#define MASK(i) (1LL << (i))
#define Point Vector
#define left Left
#define right Right
#define div Div
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
typedef pair<db, db> pdb;
typedef pair<ld, ld> pld;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<ll, ll> pll;
typedef pair<ll, pll> plll;
typedef pair<ll, int> pli;
typedef pair<ll, pii> plii;
template<class A, class B>
bool maximize(A& x, B y) {
if (x < y) return x = y, true; else return false;
}
template<class A, class B>
bool minimize(A& x, B y) {
if (x > y) return x = y, true; else return false;
}
/* END OF TEMPLATE */
int cnt_state = 0;
void dq(int col, int mask) {
if (col > 5) {
cnt_state++;
return ;
}
for (int mask2 = mask; mask2 > 0; mask2 = (mask2 - 1) & mask) dq(col + 1, mask2);
}
const int N = 1e3 + 7;
const int mod = 1e9 + 7;
int n, m;
map<vector<int>, int> dp[7][N];
void add(int& x, int y) {
if ((x+=y) >= mod) x-=mod;
}
vector<int> shift_left(vector<int> state) {
vector<int> res;
for (int i = 1; i < m; i++) res.push_back(state[i]);
res.push_back(0);
return res;
}
int dq(int row, int col, vector<int> state) {
if (col > n) return 1;
if (dp[row][col].find(state) != dp[row][col].end()) return dp[row][col][state];
int& res = dp[row][col][state];
if (row == m) res = dq(0, col + 1, shift_left(state)); else {
// // state[0] la trang thai cua cot col
if (state[0] & MASK(row)) res = dq(row + 1, col, state); else {
for (int i = row; i < m; i++)
if (state[0] & MASK(i)) break; else {
int sz = i - row + 1;
if (col + sz - 1 > n) break;
vector<int> new_state = state;
// bat bit
for (int j = 0; j < sz; j++)
for (int k = row; k <= i; k++) new_state[j]|=MASK(k);
add(res, dq(i + 1, col, new_state));
}
}
}
return res;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
vector<int> st(m, 0);
cout<<dq(0, 1, st);
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBYIGZpcnN0CiNkZWZpbmUgWSBzZWNvbmQKI2RlZmluZSBhbGwoeCkgYmVnaW4oeCksIGVuZCh4KQojZGVmaW5lIEZPUihpLCBhLCBiKSBmb3IoaW50IGkgPSAoYSk7IGkgPD0gKGIpOyBpKyspCiNkZWZpbmUgRk9SRChpLCBiLCBhKSBmb3IoaW50IGkgPSAoYik7IGkgPj0gKGEpOyBpLS0pCiNkZWZpbmUgUkVQKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSk7IGkgPCAoYik7IGkrKykKI2RlZmluZSBteHggbWF4X2VsZW1lbnQKI2RlZmluZSBtbm4gbWluX2VsZW1lbnQKI2RlZmluZSBTUVIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIFBvaW50IFZlY3RvcgojZGVmaW5lIGxlZnQgTGVmdAojZGVmaW5lIHJpZ2h0IFJpZ2h0CiNkZWZpbmUgZGl2IERpdgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgZG91YmxlIGRiOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHBhaXI8ZGIsIGRiPiBwZGI7CnR5cGVkZWYgcGFpcjxsZCwgbGQ+IHBsZDsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaWk7CnR5cGVkZWYgcGFpcjxpbnQsIHBpaT4gcGlpaTsKdHlwZWRlZiBwYWlyPGxsLCBsbD4gcGxsOwp0eXBlZGVmIHBhaXI8bGwsIHBsbD4gcGxsbDsKdHlwZWRlZiBwYWlyPGxsLCBpbnQ+IHBsaTsKdHlwZWRlZiBwYWlyPGxsLCBwaWk+IHBsaWk7Cgp0ZW1wbGF0ZTxjbGFzcyBBLCBjbGFzcyBCPgogICAgYm9vbCBtYXhpbWl6ZShBJiB4LCBCIHkpIHsKICAgICAgICBpZiAoeCA8IHkpIHJldHVybiB4ID0geSwgdHJ1ZTsgZWxzZSByZXR1cm4gZmFsc2U7CiAgICB9CnRlbXBsYXRlPGNsYXNzIEEsIGNsYXNzIEI+CiAgICBib29sIG1pbmltaXplKEEmIHgsIEIgeSkgewogICAgICAgIGlmICh4ID4geSkgcmV0dXJuIHggPSB5LCB0cnVlOyBlbHNlIHJldHVybiBmYWxzZTsKICAgIH0KCi8qIEVORCBPRiBURU1QTEFURSAqLwoKaW50IGNudF9zdGF0ZSA9IDA7Cgp2b2lkIGRxKGludCBjb2wsIGludCBtYXNrKSB7CiAgICBpZiAoY29sID4gNSkgewogICAgICAgIGNudF9zdGF0ZSsrOwogICAgICAgIHJldHVybiA7CiAgICB9CiAgICBmb3IgKGludCBtYXNrMiA9IG1hc2s7IG1hc2syID4gMDsgbWFzazIgPSAobWFzazIgLSAxKSAmIG1hc2spIGRxKGNvbCArIDEsIG1hc2syKTsKfQoKY29uc3QgaW50IE4gPSAxZTMgKyA3Owpjb25zdCBpbnQgbW9kID0gMWU5ICsgNzsKCmludCBuLCBtOwoKbWFwPHZlY3RvcjxpbnQ+LCBpbnQ+IGRwWzddW05dOwoKdm9pZCBhZGQoaW50JiB4LCBpbnQgeSkgewogICAgaWYgKCh4Kz15KSA+PSBtb2QpIHgtPW1vZDsKfQoKdmVjdG9yPGludD4gc2hpZnRfbGVmdCh2ZWN0b3I8aW50PiBzdGF0ZSkgewogICAgdmVjdG9yPGludD4gcmVzOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtOyBpKyspIHJlcy5wdXNoX2JhY2soc3RhdGVbaV0pOwogICAgcmVzLnB1c2hfYmFjaygwKTsKICAgIHJldHVybiByZXM7Cn0KCmludCBkcShpbnQgcm93LCBpbnQgY29sLCB2ZWN0b3I8aW50PiBzdGF0ZSkgewogICAgaWYgKGNvbCA+IG4pIHJldHVybiAxOwogICAgaWYgKGRwW3Jvd11bY29sXS5maW5kKHN0YXRlKSAhPSBkcFtyb3ddW2NvbF0uZW5kKCkpIHJldHVybiBkcFtyb3ddW2NvbF1bc3RhdGVdOwogICAgaW50JiByZXMgPSBkcFtyb3ddW2NvbF1bc3RhdGVdOwogICAgaWYgKHJvdyA9PSBtKSByZXMgPSBkcSgwLCBjb2wgKyAxLCBzaGlmdF9sZWZ0KHN0YXRlKSk7IGVsc2UgewogICAgLy8gICAgLy8gc3RhdGVbMF0gbGEgdHJhbmcgdGhhaSBjdWEgY290IGNvbAogICAgICAgIGlmIChzdGF0ZVswXSAmIE1BU0socm93KSkgcmVzID0gZHEocm93ICsgMSwgY29sLCBzdGF0ZSk7IGVsc2UgewogICAgICAgICAgICBmb3IgKGludCBpID0gcm93OyBpIDwgbTsgaSsrKQogICAgICAgICAgICAgICAgaWYgKHN0YXRlWzBdICYgTUFTSyhpKSkgYnJlYWs7IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGludCBzeiA9IGkgLSByb3cgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmIChjb2wgKyBzeiAtIDEgPiBuKSBicmVhazsKICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiBuZXdfc3RhdGUgPSBzdGF0ZTsKICAgICAgICAgICAgICAgICAgICAvLyBiYXQgYml0CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzejsgaisrKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gcm93OyBrIDw9IGk7IGsrKykgbmV3X3N0YXRlW2pdfD1NQVNLKGspOwogICAgICAgICAgICAgICAgICAgIGFkZChyZXMsIGRxKGkgKyAxLCBjb2wsIG5ld19zdGF0ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7CiAgICBjaW4udGllKDApOwogICAgY2luPj5uPj5tOwogICAgdmVjdG9yPGludD4gc3QobSwgMCk7CiAgICBjb3V0PDxkcSgwLCAxLCBzdCk7CiAgICByZXR1cm4gMDsKfQoKCgo=