Snuke is standing on a two-dimensional plane. In one operation, he can move by 1 in the positive x-direction, or move by 1 in the positive y-direction.

Let us define a function f(r, c) as follows:

* f(r,c) :=  (The number of paths from the point (0, 0) to the point (r, c) that Snuke can trace by repeating the operation above)



Given are integers r_1, r_2, c_1, and c_2. Find the sum of f(i, j) over all pair of integers (i, j) such that r_1 ≤ i ≤ r_2 and c_1 ≤ j ≤ c_2, and compute this value modulo (10^9+7).

Constraints

* 1 ≤ r_1 ≤ r_2 ≤ 10^6
* 1 ≤ c_1 ≤ c_2 ≤ 10^6
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


r_1 c_1 r_2 c_2


Output

Print the sum of f(i, j) modulo (10^9+7).

Examples

Input

1 1 2 2


Output

14


Input

314 159 2653 589


Output

602215194
// $%U%$ $%Y%$-$%M%$-$%D%$ $%h%$:$%m%$

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll mod = 1000000007;

const int MN = 2000006;

pair<ll,ll> diofante(ll a, ll b){
	if(!a)return {0,1};
	auto t = diofante(b%a,a);
	return {t.second-(b/a)*t.first,t.first};
}
ll modinv(ll x){
	return (diofante(x,mod).first+mod)%mod;
}

ll fact[MN];

ll f(ll r, ll c){
	return fact[r+c]*modinv(fact[r]*fact[c]%mod)%mod;
}

ll ss(ll r, ll c){
	ll res=0;
	for(ll x=1; x<=r+1; ++x)res=(res+f(x,c))%mod;
	return res;
}

int main(){
	cin.tie(0);
	ios_base::sync_with_stdio(0);
	fact[0]=1;
	for(ll i=1; i<MN; ++i){
		fact[i]=fact[i-1]*i%mod;
	}
	ll r1,c1,r2,c2;
	cin>>r1>>c1>>r2>>c2;
	cout<< (ss(r2,c2)-ss(r2,c1-1)-ss(r1-1,c2)+ss(r1-1,c1-1)+mod+mod)%mod <<endl;
	return 0;
}

