#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const ll MOD = 1e9 + 7;
struct nCr_queries {
	private:
	ll N, p;
	vector<ll> fact, ifact, inv;
	ll inverse(const ll& x) {
		if(x == 1) return 1;
		return ((p - p/x) * (inv[p % x] % p)) % p;
	}
	public:
	nCr_queries(ll N,ll p) {
		this->N = N;
		this->p = p;
		fact.resize(N + 1);
		ifact.resize(N + 1);
		inv.resize(N + 1);
		fact[0] = ifact[0] = 1;
		for(int i = 1; i < fact.size(); ++i) {
			fact[i] = fact[i-1] * i % p;
			inv[i] = inverse(i);
			ifact[i] = ifact[i-1] * inv[i] % p;
		}
	}

	ll query(ll n, ll r) {
 		return (fact[n] * ifact[r])%p * ifact[n-r] % p;
	}
};

int main() {
	nCr_queries q(2 * (ll)1e5, (ll)1e9 + 7);
	int r, c, n;
	cin >> r >> c >> n;
	vector<pair<int, int>> v(n);
	vector<ll> dp(n + 1);
	for(auto& i: v) cin >> i.first >> i.second;
	v.push_back({r, c});
	sort(begin(v), end(v));
	for(int i = 0; i <= n; ++i) {
		ll ans = q.query(v[i].first + v[i].second - 2, v[i].second - 1);
		for(int j = 0; j < i; ++j) {
			if(v[j].second > v[i].second) continue;
			ll temp = dp[j] * q.query(v[i].first + v[i].second - v[j].first - v[j].second, v[i].second - v[j].second);
			temp %= MOD;
			ans -= temp;
			while(ans < 0) ans += MOD;
			ans %= MOD;
		}
		dp[i] = ans;
	}
	cout << dp[n];
	return 0;
}
		
