#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define mod ((ll)1e9+7)

//#define TEST

// 上からkビット目がx,yの最上位ビットであるとき、
// y - x = x xor yなるx,yの組み合わせが何通りか求める.
ll solve(int k, ll l, ll r) {
	ll comp = (1LL << (60 - k));
	if (r < comp) return 0;
	if (l >= 2 * comp) return 0;
	// 桁dpを行う.
	ll dp[61][4];
	for (int i = 0; i < 61; ++i)
		for (int j = 0; j < 4; ++j)
			dp[i][j] = 0;
	dp[0][3] = 1;
	for (int i = 1; i < k; ++i) {
		// 0 0を追加する
		comp = (1LL << (60 - i));
		bool ri = r & comp;
		bool li = l & comp;
		if ((!ri) && (!li)) { // 両方0
			for (int j = 0; j < 4; ++j)
				dp[i][j] = dp[i - 1][j];
		}
		if (ri && (!li)) { // 1 0
			dp[i][0] = dp[i - 1][0] + dp[i - 1][2];
			dp[i][1] = dp[i - 1][1] + dp[i - 1][3];
		}
		if ((!ri) && li) { // 0 1
			dp[i][0] = dp[i - 1][0];
			dp[i][2] = dp[i - 1][2];
		}
		if (ri && li) { // 1 1
			dp[i][0] = dp[i - 1][0] + dp[i - 1][2];
		}
	}
	// 1 1を追加する
	comp = (1LL << (60 - k));
	bool rk = r & comp;
	bool lk = l & comp;
	if ((!rk) && (!lk)) { // 0 0
		dp[k][0] = dp[k - 1][0] + dp[k - 1][1];
	}
	if (rk && (!lk)) { // 1 0
		dp[k][0] = dp[k - 1][0] + dp[k - 1][1];
		dp[k][2] = dp[k - 1][2] + dp[k - 1][3];
	}
	if ((!rk) && lk) { // 0 1
		dp[k][0] = dp[k - 1][0];
		dp[k][1] = dp[k - 1][1];
	}
	if (rk && lk) { // 1 1
		for (int j = 0; j < 4; ++j)
			dp[k][j] = dp[k - 1][j];
	}
	for (int i = k + 1; i < 61; ++i) {
		comp = (1LL << (60 - i));
		bool ri = r & comp;
		bool li = l & comp;
		// 0 0を追加する
		if ((!ri) && (!li)) { // 両方0
			for (int j = 0; j < 4; ++j)
				dp[i][j] = dp[i - 1][j];
		}
		if (ri && (!li)) { // 1 0
			dp[i][0] = (dp[i - 1][0] + dp[i - 1][2]) % mod;
			dp[i][1] = (dp[i - 1][1] + dp[i - 1][3]) % mod;
		}
		if ((!ri) && li) { // 0 1
			dp[i][0] = dp[i - 1][0];
			dp[i][2] = dp[i - 1][2];
		}
		if (ri && li) { // 1 1
			dp[i][0] = (dp[i - 1][0] + dp[i - 1][2]) % mod;
		}
		// 1 1を追加する
		if ((!ri) && (!li)) { // 0 0
			dp[i][0] += (dp[i - 1][0] + dp[i - 1][1]) % mod;
			dp[i][0] %= mod;
		}
		if (ri && (!li)) { // 1 0
			dp[i][0] += (dp[i - 1][0] + dp[i - 1][1]) % mod;
			dp[i][0] %= mod;
			dp[i][2] += (dp[i - 1][2] + dp[i - 1][3]) % mod;
			dp[i][2] %= mod;
		}
		if ((!ri) && li) { // 0 1
			dp[i][0] += dp[i - 1][0];
			dp[i][0] %= mod;
			dp[i][1] += dp[i - 1][1];
			dp[i][1] %= mod;
		}
		if (ri && li) { // 1 1
			for (int j = 0; j < 4; ++j) {
				dp[i][j] += dp[i - 1][j];
				dp[i][j] %= mod;
			}
		}
		// 1 0を追加する
		if ((!ri) && (!li)) { // 0 0
			dp[i][0] += dp[i - 1][0];
			dp[i][0] %= mod;
			dp[i][1] += dp[i - 1][1];
			dp[i][1] %= mod;
		}
		if (ri && (!li)) { // 1 0
			for (int j = 0; j < 4; ++j) {
				dp[i][j] += dp[i - 1][j];
				dp[i][j] %= mod;
			}
		}
		if ((!ri) && li) { // 0 1
			dp[i][0] += dp[i - 1][0];
			dp[i][0] %= mod;
		}
		if (ri && li) { // 1 1
			dp[i][0] += dp[i - 1][0];
			dp[i][0] %= mod;
			dp[i][2] += dp[i - 1][2];
			dp[i][2] %= mod;
		}
	}
	ll rv = 0;
	for (int j = 0; j < 4; ++j)
		rv = (rv + dp[61 - 1][j]) % mod;
	return rv;
}

signed main() {
	ll l, r;
	cin >> l >> r;

	ll ans = 0;
	for (int i = 1; i < 61; ++i) {
		ll t = solve(i, l, r);
#ifdef TEST
		cout << t << endl;
#endif
		ans = (ans + t) % mod;
	}

	cout << ans << endl;

	return 0;
}

Measured memory_bytes: 256