Problem: You are given a non-empty string s consisting of lowercase letters. Find the number of pairs of non-overlapping palindromic substrings of this string.

In a more formal way, you have to find the quantity of tuples (a, b, x, y) such that 1 ≤ a ≤ b < x ≤ y ≤ |s| and substrings s[a... b], s[x... y] are palindromes.

A palindrome is a string that can be read the same way from left to right and from right to left. For example, "abacaba", "z", "abba" are palindromes.

A substring s[i... j] (1 ≤ i ≤ j ≤ |s|) of string s = s1s2... s|s| is a string sisi + 1... sj. For example, substring s[2...4] of string s = "abacaba" equals "bac".

Input

The first line of input contains a non-empty string s which consists of lowercase letters ('a'...'z'), s contains at most 2000 characters.

Output

Output a single number — the quantity of pairs of non-overlapping palindromic substrings of s.

Please do not use the %lld format specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64d format specifier.

Examples

Input

aa


Output

1


Input

aaa


Output

5


Input

abacaba


Output

36

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
int xx[] = {0, 0, 1, -1, 1, -1, 1, -1};
int yy[] = {1, -1, 0, 0, 1, -1, -1, 1};
inline long long MAX(long long a, long long b) { return (a > b) ? a : b; }
inline long long MIN(long long a, long long b) { return (a > b) ? b : a; }
inline double dis(double ax, double ay, double bx, double by) {
  return ((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
}
long long pwr(long long x, long long n) {
  if (n == 0) return 1;
  if (n == 1) return x;
  long long a = pwr(x, n / 2);
  a = a * a;
  if (n % 2) a *= x;
  return a;
}
long long numPal[2001][2001], palLen[2001][2001];
int main() {
  char str[2010];
  long long ans = 0, n, i, j;
  scanf("%s", str);
  n = strlen(str);
  for (i = 0; i < n; i++) numPal[i][i] = palLen[i][i] = 1;
  for (i = 1; i < n; i++)
    for (j = 0; j + i < n; j++) {
      if (str[j] == str[j + i]) {
        if (palLen[j + 1][j + i - 1] == i - 1) palLen[j][j + i] = i + 1;
      }
      numPal[j][j + i] = (palLen[j][j + i] == i + 1) + numPal[j + 1][j + i] +
                         numPal[j][j + i - 1] - numPal[j + 1][j + i - 1];
    }
  for (i = 0; i < n - 1; i++)
    for (j = i; j < n - 1; j++)
      if (palLen[i][j] == j - i + 1) ans += numPal[j + 1][n - 1];
  cout << ans << endl;
  getchar();
  getchar();
  return 0;
}