#include <bits/stdc++.h>
using namespace std;
const int N = (int) 1e5 + 7;
const long long mod = (long long) 1e9 + 7;
int n, q, command;
long long a[N], l, r, x, y;
struct SEGTREE{
vector<long long> tree, lazy_one, lazy_two;
void init(int n){
tree.resize(4 * n + 7);
lazy_one.resize(4 * n + 7);
lazy_two.resize(4 * n + 7);
}
void push_one(int node, long long l, long long r){
if(!lazy_one[node]) return;
tree[node] += (r - l + 1) * lazy_one[node];
tree[node] %= mod;
if(l != r){
lazy_one[node * 2] += lazy_one[node];
lazy_one[node * 2 + 1] += lazy_one[node];
}
lazy_one[node] = 0;
}
void push_two(int node, long long l, long long r){
if(!lazy_two[node]) return;
tree[node] += (r - l + 1) * (r + l) / 2 * lazy_two[node];
tree[node] %= mod;
if(l != r){
lazy_two[node * 2] += lazy_two[node];
lazy_two[node * 2 + 1] += lazy_two[node];
}
lazy_two[node] = 0;
}
void update_one(int node, long long l, long long r, int u, int v, long long val){
push_one(node, l, r);
if(v < l || r < u) return;
if(u <= l && r <= v){
lazy_one[node] += val;
push_one(node, l, r);
return;
}
int mid = l + (r - l) / 2;
update_one(node * 2, l, mid, u, v, val);
update_one(node * 2 + 1, mid + 1, r, u, v, val);
tree[node] = (tree[node * 2] + tree[node * 2 + 1]) % mod;
}
void update_two(int node, long long l, long long r, int u, int v, long long val){
push_two(node, l, r);
if(v < l || r < u) return;
if(u <= l && r <= v){
lazy_two[node] += val;
push_two(node, l, r);
return;
}
int mid = l + (r - l) / 2;
update_two(node * 2, l, mid, u, v, val);
update_two(node * 2 + 1, mid + 1, r, u, v, val);
tree[node] = (tree[node * 2] + tree[node * 2 + 1]) % mod;
}
long long get(int node, long long l, long long r, int u, int v){
push_two(node, l, r);
push_one(node, l, r);
if(v < l || r < u) return 0;
if(u <= l && r <= v) return tree[node] % mod;
int mid = l + (r - l) / 2;
long long get1 = get(node * 2, l, mid, u, v) % mod;
long long get2 = get(node * 2 + 1, mid + 1, r, u, v) % mod;
return (get1 + get2) % mod;
}
} segtree;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
//freopen("marisa.inp", "r", stdin);
//freopen("marisa.out", "w", stdout);
cin >> n >> q;
segtree.init(n);
while(q--){
cin >> command >> l >> r;
if(command & 1){
cin >> x >> y;
segtree.update_two(1, 1, n, l, r, x);
segtree.update_one(1, 1, n, l, r, y - l * x);
}
else cout << segtree.get(1, 1, n, l, r) << "\n";
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IChpbnQpIDFlNSArIDc7CmNvbnN0IGxvbmcgbG9uZyBtb2QgPSAobG9uZyBsb25nKSAxZTkgKyA3OwppbnQgbiwgcSwgY29tbWFuZDsKbG9uZyBsb25nIGFbTl0sIGwsIHIsIHgsIHk7CgpzdHJ1Y3QgU0VHVFJFRXsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IHRyZWUsIGxhenlfb25lLCBsYXp5X3R3bzsKCiAgICB2b2lkIGluaXQoaW50IG4pewogICAgICAgIHRyZWUucmVzaXplKDQgKiBuICsgNyk7CiAgICAgICAgbGF6eV9vbmUucmVzaXplKDQgKiBuICsgNyk7CiAgICAgICAgbGF6eV90d28ucmVzaXplKDQgKiBuICsgNyk7CiAgICB9CgogICAgdm9pZCBwdXNoX29uZShpbnQgbm9kZSwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByKXsKICAgICAgICBpZighbGF6eV9vbmVbbm9kZV0pIHJldHVybjsKICAgICAgICB0cmVlW25vZGVdICs9IChyIC0gbCArIDEpICogbGF6eV9vbmVbbm9kZV07CiAgICAgICAgdHJlZVtub2RlXSAlPSBtb2Q7CiAgICAgICAgaWYobCAhPSByKXsKICAgICAgICAgICAgbGF6eV9vbmVbbm9kZSAqIDJdICs9IGxhenlfb25lW25vZGVdOwogICAgICAgICAgICBsYXp5X29uZVtub2RlICogMiArIDFdICs9IGxhenlfb25lW25vZGVdOwogICAgICAgIH0KICAgICAgICBsYXp5X29uZVtub2RlXSA9IDA7CiAgICB9CgogICAgdm9pZCBwdXNoX3R3byhpbnQgbm9kZSwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByKXsKICAgICAgICBpZighbGF6eV90d29bbm9kZV0pIHJldHVybjsKICAgICAgICB0cmVlW25vZGVdICs9IChyIC0gbCArIDEpICogKHIgKyBsKSAvIDIgKiBsYXp5X3R3b1tub2RlXTsKICAgICAgICB0cmVlW25vZGVdICU9IG1vZDsKICAgICAgICBpZihsICE9IHIpewogICAgICAgICAgICBsYXp5X3R3b1tub2RlICogMl0gKz0gbGF6eV90d29bbm9kZV07CiAgICAgICAgICAgIGxhenlfdHdvW25vZGUgKiAyICsgMV0gKz0gbGF6eV90d29bbm9kZV07CiAgICAgICAgfQogICAgICAgIGxhenlfdHdvW25vZGVdID0gMDsKICAgIH0KCiAgICB2b2lkIHVwZGF0ZV9vbmUoaW50IG5vZGUsIGxvbmcgbG9uZyBsLCBsb25nIGxvbmcgciwgaW50IHUsIGludCB2LCBsb25nIGxvbmcgdmFsKXsKICAgICAgICBwdXNoX29uZShub2RlLCBsLCByKTsKICAgICAgICBpZih2IDwgbCB8fCByIDwgdSkgcmV0dXJuOwogICAgICAgIGlmKHUgPD0gbCAmJiByIDw9IHYpewogICAgICAgICAgICBsYXp5X29uZVtub2RlXSArPSB2YWw7CiAgICAgICAgICAgIHB1c2hfb25lKG5vZGUsIGwsIHIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludCBtaWQgPSBsICsgKHIgLSBsKSAvIDI7CiAgICAgICAgdXBkYXRlX29uZShub2RlICogMiwgbCwgbWlkLCB1LCB2LCB2YWwpOwogICAgICAgIHVwZGF0ZV9vbmUobm9kZSAqIDIgKyAxLCBtaWQgKyAxLCByLCB1LCB2LCB2YWwpOwogICAgICAgIHRyZWVbbm9kZV0gPSAodHJlZVtub2RlICogMl0gKyB0cmVlW25vZGUgKiAyICsgMV0pICUgbW9kOwogICAgfQoKICAgIHZvaWQgdXBkYXRlX3R3byhpbnQgbm9kZSwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByLCBpbnQgdSwgaW50IHYsIGxvbmcgbG9uZyB2YWwpewogICAgICAgIHB1c2hfdHdvKG5vZGUsIGwsIHIpOwogICAgICAgIGlmKHYgPCBsIHx8IHIgPCB1KSByZXR1cm47CiAgICAgICAgaWYodSA8PSBsICYmIHIgPD0gdil7CiAgICAgICAgICAgIGxhenlfdHdvW25vZGVdICs9IHZhbDsKICAgICAgICAgICAgcHVzaF90d28obm9kZSwgbCwgcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaW50IG1pZCA9IGwgKyAociAtIGwpIC8gMjsKICAgICAgICB1cGRhdGVfdHdvKG5vZGUgKiAyLCBsLCBtaWQsIHUsIHYsIHZhbCk7CiAgICAgICAgdXBkYXRlX3R3byhub2RlICogMiArIDEsIG1pZCArIDEsIHIsIHUsIHYsIHZhbCk7CiAgICAgICAgdHJlZVtub2RlXSA9ICh0cmVlW25vZGUgKiAyXSArIHRyZWVbbm9kZSAqIDIgKyAxXSkgJSBtb2Q7CiAgICB9CgogICAgbG9uZyBsb25nIGdldChpbnQgbm9kZSwgbG9uZyBsb25nIGwsIGxvbmcgbG9uZyByLCBpbnQgdSwgaW50IHYpewogICAgICAgIHB1c2hfdHdvKG5vZGUsIGwsIHIpOwoJCXB1c2hfb25lKG5vZGUsIGwsIHIpOwogICAgICAgIGlmKHYgPCBsIHx8IHIgPCB1KSByZXR1cm4gMDsKICAgICAgICBpZih1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gdHJlZVtub2RlXSAlIG1vZDsKICAgICAgICBpbnQgbWlkID0gbCArIChyIC0gbCkgLyAyOwogICAgICAgIGxvbmcgbG9uZyBnZXQxID0gZ2V0KG5vZGUgKiAyLCBsLCBtaWQsIHUsIHYpICUgbW9kOwogICAgICAgIGxvbmcgbG9uZyBnZXQyID0gZ2V0KG5vZGUgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdikgJSBtb2Q7CiAgICAgICAgcmV0dXJuIChnZXQxICsgZ2V0MikgJSBtb2Q7CiAgICB9Cn0gc2VndHJlZTsKCmludCBtYWluKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgLy9mcmVvcGVuKCJtYXJpc2EuaW5wIiwgInIiLCBzdGRpbik7CiAgICAvL2ZyZW9wZW4oIm1hcmlzYS5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICBjaW4gPj4gbiA+PiBxOwoKICAgIHNlZ3RyZWUuaW5pdChuKTsKICAgIHdoaWxlKHEtLSl7CiAgICAgICAgY2luID4+IGNvbW1hbmQgPj4gbCA+PiByOwogICAgICAgIGlmKGNvbW1hbmQgJiAxKXsKICAgICAgICAgICAgY2luID4+IHggPj4geTsKICAgICAgICAgICAgc2VndHJlZS51cGRhdGVfdHdvKDEsIDEsIG4sIGwsIHIsIHgpOwoJCQlzZWd0cmVlLnVwZGF0ZV9vbmUoMSwgMSwgbiwgbCwgciwgeSAtIGwgKiB4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBjb3V0IDw8IHNlZ3RyZWUuZ2V0KDEsIDEsIG4sIGwsIHIpIDw8ICJcbiI7CiAgICB9Cn0=