#include <bits/stdc++.h>
const long long big = 0x7fffffff;
using namespace std;
inline void read(long long &x) {
  x = 0;
  char ch = getchar();
  long long pd = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') pd = -pd;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  x *= pd;
}
inline void write(const long long &x) {
  char ggg[10001];
  long long s = 0;
  long long tmp = x;
  if (tmp == 0) {
    putchar('0');
    return;
  }
  if (tmp < 0) {
    tmp = -tmp;
    putchar('-');
  }
  while (tmp > 0) {
    ggg[s++] = tmp % 10 + '0';
    tmp /= 10;
  }
  while (s > 0) {
    putchar(ggg[--s]);
  }
}
inline void wrs(const long long &x) {
  write(x);
  putchar(' ');
}
inline void wrl(const long long &x) {
  write(x);
  putchar('\n');
}
const long long N = 233333, mod = 1e9 + 7;
long long n, m, d, s;
long long f[N][22];
long long fac[N << 1], inv[N << 1];
struct dian {
  long long x, y;
} z[N];
inline bool cmp(dian x, dian y) { return x.x == y.x ? x.y < y.y : x.x < y.x; }
inline long long C(long long x, long long y) {
  if (x < 0 || y < 0 || y > x) return 0;
  if (x == y) return 1;
  return fac[x] * inv[y] % mod * inv[x - y] % mod;
}
inline long long calc(dian x, dian y) {
  static long long dx, dy;
  dx = y.x - x.x;
  dy = y.y - x.y;
  return C(dx + dy, dx);
}
inline long long ksm(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) {
      ans = (ans * x) % mod;
    }
    x = (x * x) % mod;
    y >>= 1;
  }
  return ans % mod;
}
signed main() {
  read(n);
  read(m);
  fac[0] = 1;
  for (register long long i = 1; i <= n + m; ++i) fac[i] = fac[i - 1] * i % mod;
  inv[n + m] = ksm(fac[n + m], mod - 2);
  for (register long long i = n + m - 1; i >= 0; --i)
    inv[i] = inv[i + 1] * (i + 1) % mod;
  read(d);
  read(s);
  for (register long long i = 1; i <= d; ++i) {
    read(z[i].x);
    read(z[i].y);
  }
  z[++d] = (dian){1, 1};
  z[++d] = (dian){n, m};
  sort(z + 1, z + d + 1, cmp);
  f[1][0] = 1;
  for (register long long i = 2; i <= d; ++i) {
    f[i][0] = calc(z[1], z[i]);
    for (register long long j = 1; j < i; ++j) {
      f[i][0] = (f[i][0] - f[j][0] * calc(z[j], z[i]) + mod) % mod;
    }
  }
  for (register long long i = 1; i <= 20; ++i) {
    for (register long long j = 1; j <= d; ++j) {
      f[j][i] = calc(z[1], z[j]);
      for (register long long k = 0; k < i; ++k) {
        f[j][i] = (f[j][i] - f[j][k] + mod) % mod;
      }
      for (register long long k = 1; k < j; ++k) {
        f[j][i] = (f[j][i] - f[k][i] * calc(z[k], z[j]) % mod + mod) % mod;
      }
    }
  }
  long long now = calc(z[1], z[d]);
  long long ans = 0;
  for (register long long i = 1; i <= 20; ++i, s = (s + 1) / 2) {
    ans = (ans + f[d][i] * s % mod) % mod;
    now = (now - f[d][i] + mod) % mod;
  }
  ans = (ans + now) % mod;
  ans = ans * ksm(calc(z[1], z[d]), mod - 2) % mod;
  wrl(ans);
  return 0;
}
