#include <iostream>
template <int Mod>
struct ModuloArithmetic {
static int add(int x, int y) {
long long const tmp = static_cast<long long>(x) + y;
return (tmp > Mod) ? (tmp - Mod) : tmp;
}
static int mul(int x, int y) {
long long const tmp = static_cast<long long>(x) * y;
return tmp % Mod;
}
};
using Modulo = ModuloArithmetic<1000000000 + 7>;
struct Column {
int h;
int h_partial;
int partial;
static Column Next(int h, Column const &prev) {
int const h_partial = std::min(prev.h, h);
int const h_partial_from_prev = std::min(prev.h_partial, h_partial);
int const ones = h_partial - h_partial_from_prev + 1;
int const fat = Modulo::mul(prev.partial, h_partial_from_prev);
int const partial = Modulo::add(ones, fat);
return {h, h_partial, partial};
}
int Total() const {
return Modulo::add(Modulo::mul(h_partial, partial), (h - h_partial));
}
};
int main() {
std::cin.sync_with_stdio(false);
int n;
std::cin >> n;
int possibilities = 0;
Column prev{0, 0, 0};
for (int i = 0; i < n; ++i) {
int h;
std::cin >> h;
Column const next = Column::Next(h - 1, prev);
//std::cout << next.h << " " << next.h_partial << " " << next.partial << "\n";
possibilities = Modulo::add(possibilities, next.Total());
prev = next;
}
std::cout << possibilities;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGludCBNb2Q+CnN0cnVjdCBNb2R1bG9Bcml0aG1ldGljIHsKCXN0YXRpYyBpbnQgYWRkKGludCB4LCBpbnQgeSkgewoJCWxvbmcgbG9uZyBjb25zdCB0bXAgPSBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHgpICsgeTsKCQlyZXR1cm4gKHRtcCA+IE1vZCkgPyAodG1wIC0gTW9kKSA6IHRtcDsKCX0KCglzdGF0aWMgaW50IG11bChpbnQgeCwgaW50IHkpIHsKCQlsb25nIGxvbmcgY29uc3QgdG1wID0gc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih4KSAqIHk7CgkJcmV0dXJuIHRtcCAlIE1vZDsKCX0KfTsKCnVzaW5nIE1vZHVsbyA9IE1vZHVsb0FyaXRobWV0aWM8MTAwMDAwMDAwMCArIDc+OwoKc3RydWN0IENvbHVtbiB7CglpbnQgaDsKCWludCBoX3BhcnRpYWw7CglpbnQgcGFydGlhbDsKCglzdGF0aWMgQ29sdW1uIE5leHQoaW50IGgsIENvbHVtbiBjb25zdCAmcHJldikgewoJCWludCBjb25zdCBoX3BhcnRpYWwgPSBzdGQ6Om1pbihwcmV2LmgsIGgpOwoJCWludCBjb25zdCBoX3BhcnRpYWxfZnJvbV9wcmV2ID0gc3RkOjptaW4ocHJldi5oX3BhcnRpYWwsIGhfcGFydGlhbCk7CgkJaW50IGNvbnN0IG9uZXMgPSBoX3BhcnRpYWwgLSBoX3BhcnRpYWxfZnJvbV9wcmV2ICsgMTsKCQlpbnQgY29uc3QgZmF0ID0gTW9kdWxvOjptdWwocHJldi5wYXJ0aWFsLCBoX3BhcnRpYWxfZnJvbV9wcmV2KTsKCQlpbnQgY29uc3QgcGFydGlhbCA9IE1vZHVsbzo6YWRkKG9uZXMsIGZhdCk7CgkJcmV0dXJuIHtoLCBoX3BhcnRpYWwsIHBhcnRpYWx9OwoJfQoJCglpbnQgVG90YWwoKSBjb25zdCB7CgkJcmV0dXJuIE1vZHVsbzo6YWRkKE1vZHVsbzo6bXVsKGhfcGFydGlhbCwgcGFydGlhbCksIChoIC0gaF9wYXJ0aWFsKSk7Cgl9Cn07CgppbnQgbWFpbigpIHsKCXN0ZDo6Y2luLnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CglpbnQgbjsKCXN0ZDo6Y2luID4+IG47CgkKCWludCBwb3NzaWJpbGl0aWVzID0gMDsKCUNvbHVtbiBwcmV2ezAsIDAsIDB9OwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKCQlpbnQgaDsKCQlzdGQ6OmNpbiA+PiBoOwoJCUNvbHVtbiBjb25zdCBuZXh0ID0gQ29sdW1uOjpOZXh0KGggLSAxLCBwcmV2KTsKCQkvL3N0ZDo6Y291dCA8PCBuZXh0LmggPDwgIiAiIDw8IG5leHQuaF9wYXJ0aWFsIDw8ICIgIiA8PCBuZXh0LnBhcnRpYWwgPDwgIlxuIjsKCQlwb3NzaWJpbGl0aWVzID0gTW9kdWxvOjphZGQocG9zc2liaWxpdGllcywgbmV4dC5Ub3RhbCgpKTsKCQlwcmV2ID0gbmV4dDsKCX0KCXN0ZDo6Y291dCA8PCBwb3NzaWJpbGl0aWVzOwoJcmV0dXJuIDA7Cn0=