#include <bits/stdc++.h>
using namespace std;
const int mx = 2005, mxD = 2e5 + 5, md = 1e9 + 7;
int n, m, k, st;
long long dp[mx][21], fact[mxD], ways[mx][mx], tot, cnt;
pair<int, int> pts[mx];
long long binPow(long long a, long long p) {
  long long ans = 1;
  for (; p; p /= 2, a = (a * a) % md)
    if (p & 1) ans = (ans * a) % md;
  return ans;
}
long long choose(long long a, long long b) {
  return (fact[a] * binPow(fact[b] * fact[a - b] % md, md - 2)) % md;
}
int main() {
  cin >> n >> m >> k >> st;
  k++;
  pts[0] = {n, m};
  fact[0] = 1;
  for (int i = 1; i < k; i++) cin >> pts[i].first >> pts[i].second;
  for (int i = 1; i < mxD; i++) fact[i] = (fact[i - 1] * i) % md;
  sort(pts, pts + k);
  for (int i = 0; i < k; i++)
    for (int j = 0; j < i; j++)
      if (pts[i].first >= pts[j].first and pts[i].second >= pts[j].second)
        ways[i][j] =
            choose(pts[i].first - pts[j].first + pts[i].second - pts[j].second,
                   pts[i].first - pts[j].first);
  for (int i = 0; i < k; i++) {
    long long less = 0;
    for (int v = 0; v < 21; v++) {
      dp[i][v] = choose(pts[i].first + pts[i].second - 2, pts[i].first - 1);
      if (v != 20)
        for (int j = 0; j < i; j++)
          if (pts[i].first >= pts[j].first and pts[i].second >= pts[j].second)
            dp[i][v] = (dp[i][v] - (dp[j][v] * ways[i][j] % md) + md) % md;
      dp[i][v] = (dp[i][v] - less + md) % md;
      less = (less + dp[i][v]) % md;
    }
  }
  for (int v = 0; v < 21; st -= st / 2, v++) {
    cnt = (cnt + dp[k - 1][v]) % md;
    tot = (tot + st * dp[k - 1][v]) % md;
  }
  cout << (tot * binPow(cnt, md - 2)) % md << endl;
}
