#include<bits/stdc++.h>
using namespace std;
#define sz(s) long(s.size())
#define ll long long
#define F first
#define S second
#define pb push_back
#define all(v) v.begin(), v.end()
#define file(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout)
const int N=1e6+2, mod=1e9+7;
char a[N];
vector<vector<int> > g(28);
int n;
signed main() {
string s;
cin>>s;
n=sz(s);
for(int i=1; i<=n; i++)a[i]=s[i-1];
for(int i=1; i<=n; i++) {
g[int(a[i]-'A')].pb(i);
}
ll cnt=0;
for(int i=1; i<=n; i++) {
for(int j=0; j<=27; j++) {
if(g[j].empty() || g[j].back()<i)continue;
if(sz(g[j])==1) {
if(g[j][0]>=i)cnt=(cnt+(n-g[j][0]+1))%mod;
continue;
}
int l=0, r=sz(g[j])-1;
while(l<=r) {
int mid=(l+r)>>1;
if(g[j][mid]>=i)r=mid-1;
else l=mid+1;
}
if(l==sz(g[j])-1) {
cnt=(cnt+(n-g[j][l]+1))%mod;
continue;
}
cnt=(cnt+(g[j][l+1]-g[j][l]))%mod;
}
}
cout << cnt%mod << '\n';
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBzeihzKSBsb25nKHMuc2l6ZSgpKQojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIEYgZmlyc3QKI2RlZmluZSBTIHNlY29uZAojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGFsbCh2KSB2LmJlZ2luKCksIHYuZW5kKCkKI2RlZmluZSBmaWxlKHMpIGZyZW9wZW4ocyIuaW4iLCAiciIsIHN0ZGluKTsgZnJlb3BlbihzIi5vdXQiLCAidyIsIHN0ZG91dCkKY29uc3QgaW50IE49MWU2KzIsIG1vZD0xZTkrNzsKY2hhciBhW05dOwp2ZWN0b3I8dmVjdG9yPGludD4gPiBnKDI4KTsKaW50IG47CnNpZ25lZCBtYWluKCkgewoJc3RyaW5nIHM7CgljaW4+PnM7CgluPXN6KHMpOwoJZm9yKGludCBpPTE7IGk8PW47IGkrKylhW2ldPXNbaS0xXTsKCWZvcihpbnQgaT0xOyBpPD1uOyBpKyspIHsKCQlnW2ludChhW2ldLSdBJyldLnBiKGkpOwoJfQoJbGwgY250PTA7Cglmb3IoaW50IGk9MTsgaTw9bjsgaSsrKSB7CgkJZm9yKGludCBqPTA7IGo8PTI3OyBqKyspIHsKCQkJaWYoZ1tqXS5lbXB0eSgpIHx8IGdbal0uYmFjaygpPGkpY29udGludWU7CgkJCWlmKHN6KGdbal0pPT0xKSB7CgkJCQlpZihnW2pdWzBdPj1pKWNudD0oY250KyhuLWdbal1bMF0rMSkpJW1vZDsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWludCBsPTAsIHI9c3ooZ1tqXSktMTsKCQkJd2hpbGUobDw9cikgewoJCQkJaW50IG1pZD0obCtyKT4+MTsKCQkJCWlmKGdbal1bbWlkXT49aSlyPW1pZC0xOwoJCQkJZWxzZSBsPW1pZCsxOwoJCQl9CgkJCWlmKGw9PXN6KGdbal0pLTEpIHsKCQkJCWNudD0oY250KyhuLWdbal1bbF0rMSkpJW1vZDsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWNudD0oY250KyhnW2pdW2wrMV0tZ1tqXVtsXSkpJW1vZDsKCQl9Cgl9Cgljb3V0IDw8IGNudCVtb2QgPDwgJ1xuJzsKfQ==