#include <bits/stdc++.h>
#define MOD 1000000007
using namespace std;

int n,LIM;
char s[1000010];
long long ans;

int f[2000010];
long long sumL[1000010],sizL[1000010],sumR[1000010],sizR[1000010];

void manacher()
{
    int i,x,a,b,lim = (n<<1)-1;
    f[1] = 1; x = 1;
    for(i=2;i<=lim;i++)
    {
        f[i] = max(i&1,x+f[x]-i);
        if(x+x>i) f[i] = min(f[i],f[x+x-i]);
        a = (i-f[i])>>1; b = (i+2+f[i])>>1;
        while(s[a] && s[b] && s[a] == s[b]) { a--; b++; f[i]+=2;}
        if(i+f[i]>x+f[x]) x = i;
    }
    f[lim+1] = 0;
}

void add(long long *arr,int l,int r,int val)
{
    if(l>r) return;
    arr[l] = (arr[l] + val)%MOD;
    arr[r+1] = (arr[r+1] - val + MOD)%MOD;
}

int main()
{
    int i;
    while(scanf("%s",s+1) > 0)
    {
        n = strlen(s+1);
        manacher();
        
        memset(sumL,0,sizeof(long long)*(n+3)); memset(sizL,0,sizeof(long long)*(n+3));
        memset(sumR,0,sizeof(long long)*(n+3)); memset(sizR,0,sizeof(long long)*(n+3));
        for(i=1;i<=n;i++)
        {
            add(sumL,i,i+(f[(i<<1)-1]>>1),i<<1);
            add(sizL,i,i+(f[(i<<1)-1]>>1),1);
            add(sumL,i+1,i+(f[i<<1]>>1),i<<1|1);
            add(sizL,i+1,i+(f[i<<1]>>1),1);
            add(sumR,i-(f[(i<<1)-1]>>1),i,i<<1);
            add(sizR,i-(f[(i<<1)-1]>>1),i,1);
            add(sumR,i-(f[i<<1]>>1)+1,i,i<<1|1);
            add(sizR,i-(f[i<<1]>>1)+1,i,1);
        }
        
        ans = 0;
        for(i=1;i<n;i++)
        {
            sumL[i]  = (sumL[i] + sumL[i-1])%MOD;
            sizL[i]  = (sizL[i] + sizL[i-1])%MOD;
            sumR[i+1]  = (sumR[i+1] + sumR[i])%MOD;
            sizR[i+1]  = (sizR[i+1] + sizR[i])%MOD;
            ans = (ans + (sumL[i]-sizL[i]*i%MOD+MOD) * (sumR[i+1]-sizR[i+1]*(i+1)%MOD+MOD))%MOD;
        }
        
        printf("%I64d\n",ans);
    }
    return 0;
}