#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
vector<long long> fact, revFact;
int expo(long long a, int n) {
  long long ans = 1;
  while (n) {
    if (n & 1LL) ans = (ans * a) % MOD;
    n >>= 1;
    a = (a * a) % MOD;
  }
  return ans;
}
int revMod(int a) { return expo(a, MOD - 2); }
void pre(int n) {
  fact = revFact = {1};
  for (int i = (1); i <= (n); ++i) {
    fact.push_back((fact.back() * i) % MOD);
    revFact.push_back(revMod(fact.back()));
  }
}
int binom(int a, int b) {
  long long ans = 1;
  ans = (ans * fact[a]) % MOD;
  ans = (ans * revFact[b]) % MOD;
  ans = (ans * revFact[a - b]) % MOD;
  return ans;
}
int ways(int a, int b) { return binom(a + b, b); }
int main() {
  ios_base::sync_with_stdio(0);
  int n, m, k, s;
  cin >> n >> m >> k >> s;
  pre(n + m);
  const int LG = 23;
  vector<pair<int, int> > anomaly(k);
  for (int i = (0); i <= (k - 1); ++i) {
    int first, second;
    cin >> first >> second;
    first--;
    second--;
    anomaly[i] = {first, second};
  }
  anomaly.push_back({n - 1, m - 1});
  sort(anomaly.begin(), anomaly.end());
  long long dp[k + 1][LG], dpAtLeast[k + 1][LG + 1];
  for (int i = (0); i <= (k); ++i) {
    dpAtLeast[i][0] = ways(anomaly[i].first, anomaly[i].second);
    for (int j = (1); j <= (LG); ++j) {
      dpAtLeast[i][j] = 0;
      for (int prev = (0); prev <= (i - 1); ++prev)
        if (anomaly[prev].second <= anomaly[i].second) {
          int dx = anomaly[i].first - anomaly[prev].first;
          int dy = anomaly[i].second - anomaly[prev].second;
          dpAtLeast[i][j] += ways(dx, dy) * dp[prev][j - 1];
          dpAtLeast[i][j] %= MOD;
        }
    }
    for (int j = (0); j <= (LG - 1); ++j) {
      dp[i][j] = dpAtLeast[i][j] - dpAtLeast[i][j + 1];
      if (dp[i][j] < 0) {
        dp[i][j] += MOD;
      }
    }
  }
  long long ans = 0;
  long long paths = 0;
  for (int j = (0); j <= (LG - 1); ++j) {
    ans = (ans + dp[k][j] * s) % MOD;
    paths = (paths + dp[k][j]) % MOD;
    s = (s + 1) / 2;
  }
  long long all = ways(n - 1, m - 1);
  long long remained = (all - paths) % MOD;
  if (remained < 0) {
    remained += MOD;
  }
  ans = (ans + remained) % MOD;
  ans = (ans * revMod(all)) % MOD;
  cout << ans;
  return 0;
}
