#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:667772160")
using namespace std;
struct __isoff {
  __isoff() {
    if (0) freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
    srand(time(0));
  }
  ~__isoff() {}
} __osafwf;
const unsigned long long p1 = 31;
const unsigned long long p2 = 29;
const double eps = 1e-8;
const double pi = acos(-1.0);
const long long inf = 1e17 + 7;
const int infi = 1e9 + 7;
const long long dd = 500 + 7;
const long long mod = 1e9 + 7;
int n, m, t;
vector<vector<int> > Dp, Pdp;
pair<int, int> in[dd][2 * dd];
int ou[dd][dd];
char C[dd][dd];
int main() {
  cin >> n >> m;
  for (long long i = 0; i < (long long)dd; i++) {
    for (long long j = 0; j < (long long)dd; j++) {
      int x = i - j, y = j;
      if (x >= n || x < 0 || y >= m || y < 0) continue;
      ou[x][y] = j;
      in[j][x + y] = make_pair(x, y);
    }
  }
  for (long long i = 0; i < (long long)dd; i++) {
    for (long long j = 0; j < (long long)dd; j++) {
      int x = n - 1 - j, y = i + j;
      if (x >= n || x < 0 || y >= m || y < 0) continue;
      ou[x][y] = j;
      in[j][x + y] = make_pair(x, y);
    }
  }
  vector<int> Si(n + m);
  for (long long i = 0; i < (long long)n; i++) {
    for (long long j = 0; j < (long long)m; j++) {
      Si[i + j]++;
    }
  }
  for (long long i = 0; i < (long long)n; i++) {
    for (long long j = 0; j < (long long)m; j++) {
      cin >> C[i][j];
    }
  }
  int ts = (n + m - 2) / 2;
  int t = Si[ts];
  Dp.resize(t, vector<int>(t));
  for (long long x = 0; x < (long long)t; x++) {
    for (long long y = 0; y < (long long)t; y++) {
      int x1 = in[x][ts].first, y1 = in[x][ts].second;
      int x2 = in[y][n + m - 2 - ts].first, y2 = in[y][n + m - 2 - ts].second;
      if ((x1 == x2 && (y1 == y2 || y1 + 1 == y2)) ||
          (y1 == y2 && (x1 == x2 || x1 + 1 == x2)))
        Dp[x][y] = C[x1][y1] == C[x2][y2];
    }
  }
  for (ts--; ts >= 0; ts--) {
    t = Si[ts];
    Pdp.assign(t, vector<int>(t));
    for (long long x = 0; x < (long long)t; x++) {
      for (long long y = 0; y < (long long)t; y++) {
        int x1 = in[x][ts].first, y1 = in[x][ts].second;
        int x2 = in[y][n + m - 2 - ts].first, y2 = in[y][n + m - 2 - ts].second;
        if (C[x1][y1] == C[x2][y2]) {
          long long s = 0;
          if (x2 - 1 >= 0 && x1 + 1 < n)
            s += Dp[ou[x1 + 1][y1]][ou[x2 - 1][y2]];
          if (y2 - 1 >= 0 && x1 + 1 < n)
            s += Dp[ou[x1 + 1][y1]][ou[x2][y2 - 1]];
          if (x2 - 1 >= 0 && y1 + 1 < m)
            s += Dp[ou[x1][y1 + 1]][ou[x2 - 1][y2]];
          if (y2 - 1 >= 0 && y1 + 1 < m)
            s += Dp[ou[x1][y1 + 1]][ou[x2][y2 - 1]];
          Pdp[x][y] = s % mod;
        }
      }
    }
    swap(Pdp, Dp);
  }
  cout << Dp[0][0];
}
