#include <bits/stdc++.h>
using namespace std;
const long long N = 200005;
const long long mod = 1e9 + 7;
long long fac[N], n, m, k, s, f[2005][25], t, ans, ny[N];
inline long long read() {
  long long x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return f ? -x : x;
}
inline long long ksm(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = (ans * a) % mod;
    b >>= 1;
    a = (a * a) % mod;
  }
  return ans;
}
inline long long C(long long n, long long m) {
  if (n == 0 || m == 0) return 1;
  return fac[n] * ny[m] % mod * ny[n - m] % mod;
}
inline long long dis(long long a, long long b, long long c, long long d) {
  return C(abs(a - c) + abs(b - d), abs(a - c));
}
struct point {
  long long x, y;
} sxd[N];
inline bool cmp(point a, point b) { return a.x == b.x ? a.y < b.y : a.x < b.x; }
signed main() {
  n = read(), m = read(), k = read(), s = read();
  fac[0] = 1;
  for (register long long i = 1; i <= n + m; i++) fac[i] = fac[i - 1] * i % mod;
  for (register long long i = 0; i <= n + m; i++) ny[i] = ksm(fac[i], mod - 2);
  for (register long long i = 1; i <= k; i++)
    sxd[i].x = read(), sxd[i].y = read();
  sort(sxd + 1, sxd + k + 1, cmp);
  bool ok1 = 0, ok2 = 0;
  if (sxd[1].x != 1 || sxd[1].y != 1) {
    ok1 = 1;
    sxd[++k] = (point){1, 1};
  }
  if (sxd[k].x != n || sxd[k].y != m) {
    ok2 = 1;
    sxd[++k] = (point){n, m};
  }
  if (ok1 == 1 && ok2 == 1)
    s *= 1;
  else if (ok1 == 0 && ok2 == 1)
    s -= (s >> 1);
  else if (ok1 == 1 && ok2 == 0)
    s -= (s >> 1);
  else if (ok1 == 0 && ok2 == 0)
    s -= (s >> 1), s -= (s >> 1);
  sort(sxd + 1, sxd + k + 1, cmp);
  f[1][0] = 1;
  t = log2(s) + 2;
  for (register long long i = 2; i <= k; i++) {
    f[i][1] = dis(1, 1, sxd[i].x, sxd[i].y);
    for (register long long j = 2; j <= t; j++)
      for (register long long ztn = 1; ztn <= i - 1; ztn++)
        if (sxd[ztn].x <= sxd[i].x && sxd[ztn].y <= sxd[i].y) {
          f[i][j] =
              (f[i][j] + (f[ztn][j - 1] - f[ztn][j] + mod) % mod *
                             dis(sxd[ztn].x, sxd[ztn].y, sxd[i].x, sxd[i].y) %
                             mod) %
              mod;
        }
  }
  for (register long long i = 1; i <= t + 1; i++) {
    ans = (ans + (f[k][i] - f[k][i + 1] + mod) % mod * s % mod) % mod;
    s = s - (s >> 1);
  }
  ans = ans * ksm(dis(1, 1, n, m), mod - 2) % mod;
  cout << ans;
  return 0;
}
