#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > nodes;
const long long N = 2e3 + 10, K = 35, MOD = 1e9 + 7, M = 2e5 + 10;
long long fact[M], invfact[M];
long long ext_euclid(long long a, long long b, long long c, long long d) {
  if (c == 0) return b;
  return ext_euclid(c, d, a % c, b - (a / c) * d);
}
long long inv(long long x) { return ext_euclid(MOD, 0, x, 1) % MOD; }
long long comb(long long a, long long b) {
  return fact[a] * invfact[b] % MOD * invfact[a - b] % MOD;
}
void pre() {
  fact[0] = 1;
  for (int i = 1; i < M; ++i) fact[i] = fact[i - 1] * i % MOD;
  invfact[M - 1] = inv(fact[M - 1]);
  for (int i = M - 2; i >= 0; --i) invfact[i] = invfact[i + 1] * (i + 1) % MOD;
}
long long dp[N][K];
bool adj[N][N];
long long cost[N][N];
long long tcost[N][N];
bool visited[N];
long long n, m, k, s;
void dfs(int u) {
  visited[u] = true;
  for (int v = u + 1; v < k; ++v) {
    if (!adj[u][v]) continue;
    if (!visited[v]) dfs(v);
    long long c = cost[u][v];
    for (int j = 0; j < K; ++j)
      dp[u][min((int)K - 1, j + 1)] =
          (dp[u][min((int)K - 1, j + 1)] + dp[v][j] * c) % MOD;
  }
  for (int j = 2; j < K - 1; ++j) dp[u][j] = (dp[u][j] - dp[u][j + 1]) % MOD;
}
long long dist(pair<int, int> a, pair<int, int> b) {
  if (a.first < b.first) return 0;
  if (a.second < b.second) return 0;
  return comb(a.first + a.second - b.first - b.second, a.first - b.first);
}
long long mult(long long a[], long long b[]) {
  long long ans = 0;
  for (int i = 0; i < k; ++i) {
    ans += a[i] * b[i];
    if (ans > MOD * MOD) ans -= MOD * MOD;
  }
  return ans % MOD;
}
int main() {
  pre();
  cin >> n >> m >> k >> s;
  bool start = false, finish = false;
  for (int i = 0; i < k; ++i) {
    int r, c;
    cin >> r >> c;
    if (r == 1 && c == 1) start = true;
    if (r == n && c == m) finish = true;
    nodes.push_back({r, c});
  }
  if (!start) {
    s *= 2;
    ++k;
    nodes.push_back({1, 1});
  }
  if (!finish) {
    s *= 2;
    ++k;
    nodes.push_back({n, m});
  }
  sort(nodes.begin(), nodes.end());
  for (int i = 0; i < k; ++i) {
    for (int j = i + 1; j < k; ++j) {
      if (nodes[i].second <= nodes[j].second) {
        adj[i][j] = true;
        cost[i][j] = dist(nodes[j], nodes[i]);
      }
    }
  }
  dp[k - 1][1] = 1;
  dfs(0);
  if (n == 1 && m == 1) {
    cout << s << '\n';
    return 0;
  }
  long long ans = 0;
  for (int i = 0; i < K; ++i) {
    ans = (ans + dp[0][i] * s) % MOD;
    s = (s + 1) / 2;
  }
  ans = ans * inv(comb(n + m - 2, n - 1)) % MOD;
  if (ans < 0) ans += MOD;
  cout << ans << '\n';
}
