#include<bits/stdc++.h>
using namespace std;
using ll = long long;

/// --- modulo Library {{{ ///
constexpr long long extgcd(long long a, long long b, long long& x, long long& y) {
  if(b==0) {
    x = 1; y = 0;
    return a;
  }
  long long d = extgcd(b, a % b, y, x);
  y -= (a / b) * x;
  return d;
}
constexpr long long modpow(long long a, long long b, long long mod = static_cast<int>(1e9 + 7)) {
  a = (a % mod + mod) % mod;
  long long r = 1;
  while(b){
    if(b & 1) r = r * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return r;
}
constexpr long long modinv(long long a, long long mod = static_cast<int>(1e9 + 7)) {
  a = (a % mod + mod) % mod;
  long long x = 0, y = 0;
  extgcd(a, mod, x, y);
  return (x % mod + mod) % mod;
}

template<int N, int mod = static_cast<int>(1e9 + 7)> struct Factorial {
  int arr[N+1], inv[N+1];
  long long operator[](int i) const { return arr[i]; }
  Factorial(): arr(), inv() {
    arr[0] = 1;
    for(int i = 1; i <= N; i++) {
      arr[i] = (long long) i * arr[i - 1] % mod;
    }
    inv[N] = modinv(arr[N], mod);
    for(int i = N-1; i >= 0; i--) {
      inv[i] = (long long) (i + 1) * inv[i + 1] % mod;
    }
  }
  long long C(int n, int r) const {
    if(n < 0 || r < 0 || n < r) return 0;
    return (((long long) arr[n] * inv[r]) % mod * inv[n - r]) % mod;
  }
};
/// }}}--- ///

const int mod = 1e9 + 7;
constexpr int N = 2e5 + 10;
Factorial<N> fact;

#undef DEBUG
// #define DEBUG
/// {{{ DEBUG --- ///
#ifdef DEBUG
template <typename T> ostream &operator<<(ostream &o, const vector<T> &v) { o << "{"; for(size_t i = 0; i < v.size(); i++) o << v[i] << (i + 1 != v.size() ? ", " : ""); o << "}"; return o; }
#ifdef USE_COUT
#define dump(...) [&](){auto __debug_tap=make_tuple(__VA_ARGS__);cout<<"["<<__LINE__<< "] "<<#__VA_ARGS__<<" = "<<__debug_tap<<"\n";}()
#else
#define dump(...) [&](){auto __debug_tap=make_tuple(__VA_ARGS__);cout<<"["<<__LINE__<< "] "<<#__VA_ARGS__<<" = "<<__debug_tap<<"\n";}()
#endif
template<class T> inline void dump2D(T &d, size_t sizey, size_t sizex) { ostream&o=
#ifdef USE_COUT
  cout;
#else
  cerr;
#endif
  for(size_t i = 0; i < sizey; i++) { for(size_t j = 0; j < sizex; j++) o << d[i][j] << " "; o << endl; }
}
#else
template <typename T> ostream &operator<<(ostream &o, const vector<T> &v) { for(size_t i = 0; i < v.size(); i++) o << v[i] << (i + 1 != v.size() ? " " : ""); return o; }
#define dump(...) (42)
#define dump2D(...) (42)
#endif
template<int n, class...T> typename enable_if<(n>=sizeof...(T))>::type _ot(ostream &, tuple<T...> const &){}
template<int n, class...T> typename enable_if<(n< sizeof...(T))>::type _ot(ostream & os, tuple<T...> const & t){ os << (n==0?"":", ") << get<n>(t); _ot<n+1>(os, t); }
template<class...T> ostream & operator<<(ostream &o, tuple<T...> const &t){ o << "("; _ot<0>(o, t); o << ")"; return o; }
template<class T, class U> ostream & operator<<(ostream &o, pair<T, U> const &p) { o << "(" << p.first << ", " << p.second << ")"; return o; }
/// }}}--- ///


int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int a, b, x, y;
  cin >> a >> b >> x >> y;
  x--; y--;
  ll ans = 0;
  for(int i = y + 1; i < b; i++) {
    dump(i + a - x - 2, a - x - 2,b - 1 - i + x, x);
    ans += (ll) fact.C(i + a - x - 2, a - x - 2) * fact.C(b - 1 - i + x, x) % mod;
  }
  cout << ans % mod << endl;
  return 0;
}


Measured memory_bytes: 1792