#include <bits/stdc++.h>
template <typename T>
struct ScanfSpecifier {};
template <>
struct ScanfSpecifier<char*> {
  static constexpr const char* value = "%s";
};
template <>
struct ScanfSpecifier<int> {
  static constexpr const char* value = "%d";
};
template <>
struct ScanfSpecifier<double> {
  static constexpr const char* value = "%lf";
};
template <>
struct ScanfSpecifier<float> {
  static constexpr const char* value = "%f";
};
template <>
struct ScanfSpecifier<char> {
  static constexpr const char* value = "%c";
};
template <>
struct ScanfSpecifier<const char*> {
  static constexpr const char* value = "%s";
};
template <>
struct ScanfSpecifier<unsigned long> {
  static constexpr const char* value = "%lu";
};
template <>
struct ScanfSpecifier<unsigned int> {
  static constexpr const char* value = "%u";
};
template <>
struct ScanfSpecifier<long long int> {
  static constexpr const char* value = "%lld";
};
template <typename T>
int RD(T& arg) {
  return std::scanf(ScanfSpecifier<T>::value, &arg);
}
template <int S>
int RD(char (&arg)[S]) {
  return std::scanf("%s", arg);
}
int RD(char* arg) { return std::scanf("%s", arg); }
template <>
int RD<char>(char& arg) {
  return std::scanf(" %c", &arg);
}
template <typename T, typename... Args>
int RD(T& arg1, Args&... args) {
  return RD(arg1) + RD(args...);
}
template <typename T>
T RD() {
  T ret;
  RD(ret);
  return ret;
}
template <typename It>
void RDV(It begin, It end) {
  while (begin != end) RD(*begin++);
}
template <typename C>
void RDV(C& c) {
  RDV(std::begin(c), std::end(c));
}
template <typename T>
void WT(T arg) {
  std::printf(ScanfSpecifier<T>::value, arg);
}
template <typename T, typename U>
void WT(std::pair<T, U> arg) {
  std::printf("(");
  WT(arg.first);
  std::printf(", ");
  WT(arg.second);
  std::printf(")");
}
template <typename... Args>
void WT(Args... args) {
  int alc = 0;
  int dummy[] = {((alc++ ? std::printf(" ") : 0), WT(args), 0)...};
}
template <typename... Args>
void WTL(Args... args) {
  WT(args...);
  std::printf("\n");
}
template <typename It>
void WTV(It begin, It end) {
  int alc = 0;
  while (begin != end) (alc++ ? std::printf(" ") : 0), WT(*begin++);
}
template <typename C>
void WTV(const C& c) {
  WTV(std::begin(c), std::end(c));
}
template <typename It>
void WTVL(It begin, It end) {
  WTV(begin, end);
  std::printf("\n");
}
template <typename C>
void WTVL(const C& c) {
  WTVL(std::begin(c), std::end(c));
}
template <unsigned int Z>
struct ZpZ {
  static const unsigned int P = Z;
  using U64 = unsigned long long int;
  U64 value;
  ZpZ(long long int n) {
    if (std::abs(n) >= P) n %= P;
    if (n < 0) n += P;
    value = n;
  }
  ZpZ() : value(0) {}
  ZpZ& operator+=(ZpZ p) {
    if ((value += p.value) >= P) value -= P;
    return *this;
  }
  ZpZ& operator-=(ZpZ p) {
    if (value >= p.value)
      value -= p.value;
    else
      value += P - p.value;
    return *this;
  }
  ZpZ& operator*=(ZpZ p) {
    value = value * p.value % P;
    return *this;
  }
  ZpZ& operator/=(ZpZ p) {
    value = value * p.inverse().value % P;
    return *this;
  }
  bool operator==(ZpZ p) { return value == p.value; }
  bool operator!=(ZpZ p) { return value != p.value; }
  ZpZ operator+(ZpZ r) const { return ZpZ(value) += r; }
  ZpZ operator-(ZpZ r) const { return ZpZ(value) -= r; }
  ZpZ operator*(ZpZ r) const { return ZpZ(value) *= r; }
  ZpZ operator/(ZpZ r) const { return ZpZ(value) /= r; }
  explicit operator long long int() const { return value; }
  explicit operator int() const { return value; }
  ZpZ operator-() { return P - value; }
  ZpZ inverse() {
    int a = value, b = P, u = 1, v = 0;
    while (b) {
      int t = a / b;
      std::swap(a -= t * b, b);
      std::swap(u -= t * v, v);
    }
    if (u < 0) u += P;
    return u;
  }
  ZpZ pow(U64 e) {
    U64 ret = 1, base = value;
    while (e) {
      if ((e & 1) && ((ret *= base) >> 32)) ret %= P;
      if ((base *= base) >> 32) base %= P;
      e >>= 1;
    }
    return ret;
  }
};
template <unsigned int P>
void WT(ZpZ<P> arg) {
  WT((int)arg);
}
struct Range {
  struct It {
    int num, step;
    int operator*() { return num; }
    void operator++() { num += step; }
    bool operator!=(const It& other) { return num != other.num; }
  };
  Range(int ee) : b(0), e(ee) {}
  Range(int bb, int ee) : b(bb), e(ee) {}
  It begin() { return {b, (b < e ? 1 : -1)}; }
  It end() { return {e, 0}; }
  int b, e;
};
template <typename T>
inline T& UMAX(T& x, T y) {
  if (x < y) x = y;
  return x;
}
template <typename T>
inline T& UMIN(T& x, T y) {
  if (y < x) x = y;
  return x;
}
template <typename T, typename... Args>
struct ArithmiticPromotion {
  typedef decltype(T() + typename ArithmiticPromotion<Args...>::type()) type;
};
template <typename T, typename U>
struct ArithmiticPromotion<T, U> {
  typedef decltype(T() + U()) type;
};
template <typename T>
struct ArithmiticPromotion<T, T> {};
template <typename T>
struct ArithmiticPromotion<T> {};
template <typename T, typename U>
typename ArithmiticPromotion<T, U>::T MAX(T a, U b) {
  return a < b ? b : a;
}
template <typename T, typename... Args>
typename ArithmiticPromotion<T, Args...>::T MAX(T a, Args... args) {
  return MAX(a, MAX(args...));
}
template <typename T, typename U>
typename ArithmiticPromotion<T, U>::T MIN(T a, U b) {
  return a < b ? a : b;
}
template <typename T, typename... Args>
typename ArithmiticPromotion<T, Args...>::T MIN(T a, Args... args) {
  return MIN(a, MIN(args...));
}
using RG = Range;
using namespace std;
const int MOD = 1e9 + 7;
using ZZ = ZpZ<MOD>;
char S[1000009];
int main() {
  RD(S);
  int N = strlen(S);
  ZZ ans = 0;
  ZZ b = 0;
  for (int i = N - 1; i >= 0; i--)
    if (S[i] == 'b')
      b += 1;
    else {
      ans += b;
      b *= 2;
    }
  WTL(ans);
}
