#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long fac[N], inv[N];
const long long mod = 1e9 + 7;
long long km(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = a * ans % mod;
    b >>= 1;
    a = a * a % mod;
  }
  return ans;
}
int a[N], b[N], n, m, k;
void init() {
  fac[0] = 1;
  for (int i = 1; i < N; i++) fac[i] = fac[i - 1] * i % mod;
  inv[N - 1] = km(fac[N - 1], mod - 2);
  for (int i = N - 2; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
}
long long get(int x, int y) { return fac[x] * inv[y] % mod * inv[x - y] % mod; }
struct uzi {
  int a, b;
  bool operator<(const uzi &t) const {
    if (a == t.a) return b < t.b;
    return a < t.a;
  }
} p[N];
long long tmp[N];
int main() {
  ios::sync_with_stdio(false);
  init();
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++) cin >> p[i].a >> p[i].b;
  long long ans = get(n + m - 2, m - 1);
  sort(p + 1, p + 1 + k);
  for (int i = 1; i <= k; i++) {
    int sta = 0;
    long long tot = 0;
    tmp[i] = get(p[i].a + p[i].b - 2, p[i].b - 1);
    for (int j = 1; j < i; j++) {
      if (p[j].b <= p[i].b) {
        sta = 1;
        tot += tmp[j] *
               get(p[i].a + p[i].b - p[j].a - p[j].b, p[i].b - p[j].b) % mod;
        tot %= mod;
      }
    }
    if (!sta) {
      tmp[i] = get(p[i].a + p[i].b - 2, p[i].b - 1);
    } else {
      tmp[i] -= tot;
      tmp[i] = (tmp[i] + mod) % mod;
    }
    ans -= tmp[i] * get(n + m - p[i].a - p[i].b, m - p[i].b) % mod;
    ans = (ans + mod) % mod;
  }
  cout << ans << '\n';
  return 0;
}
