import std.stdio;
import std.algorithm;
import std.string;
import std.range;
import std.array;
import std.conv;
import std.complex;
import std.math;
import std.ascii;
import std.bigint;
import std.container;
import std.typecons;

auto readInts() {
	return array(map!(to!int)(readln().strip().split()));
}
auto readInt() {
	return readInts()[0];
}
auto readLongs() {
	return array(map!(to!long)(readln().strip().split()));
}
auto readLong() {
	return readLongs()[0];
}

void readlnTo(T...)(ref T t) {
    auto s = readln().split();
    assert(s.length == t.length);
    foreach(ref ti; t) {
        ti = s[0].to!(typeof(ti));
        s = s[1..$];
    }
}

const real eps = 1e-10;

void main(){
    long h, w, a, b;
    readlnTo(h, w, a, b);
    long p = 1000000000L+7;
    long [long[]] memo;
    long pow_mod(long n, long k) {
        if(k == 0) {
            return 1;
        }
        auto tmp = pow_mod(n, k/2);
        tmp = (tmp*tmp)%p;
        if(k%2 == 1) {
            tmp = (tmp*n)%p;
        }
        return tmp;
    }
    long c(long n, long k) {
        if(([n, k] in memo) !is null) {
            return memo[[n,k]];
        }
        long ans;
        if(k == 0) {
            ans = 1;
        } else {
            ans = (((c(n, k-1)*(n-k+1))%p)*pow_mod(k, p-2))%p;
        }
        memo[[n,k].idup] = ans;
        return ans;
    }
    for(int i; i <= h-a-1+b; ++i) {
        c(h-a-1+b, i);
    }
    for(int i; i <= a+w-b-1; ++i) {
        c(a+w-b-1, i);
    }
    long ans;
    for(int i = 1; i <= min(h-a, w-b); ++i) {
        ans += c(h-a-1+b, h-a-i)*c(a-b+w-1, a-1+i);
        ans %= p;
    }
    writeln(ans);
}


