#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline int Chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline int Chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T read() {
  T sum = 0, fl = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') fl = -1;
  for (; isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) + ch - '0';
  return sum * fl;
}
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int Maxn = 2e5 + 100;
const int Mod = 1e9 + 7;
const double PI = acos(-1.0);
namespace MATH {
int fac[Maxn], ifac[Maxn];
inline void Add(int &a, int b) {
  a += b;
  if (a >= Mod) a -= Mod;
}
inline int Pow(int a, int b) {
  int ans = 1;
  for (int i = b; i; i >>= 1, a = (long long)a * a % Mod)
    if (i & 1) ans = (long long)ans * a % Mod;
  return ans;
}
inline int Binom(int n, int m) {
  if (n < m) return 0;
  return (long long)fac[n] * ifac[m] % Mod * ifac[n - m] % Mod;
}
inline void math_init(int Maxn) {
  fac[0] = 1;
  for (int i = 1; i <= Maxn; ++i) fac[i] = (long long)fac[i - 1] * i % Mod;
  ifac[Maxn] = Pow(fac[Maxn], Mod - 2);
  for (int i = Maxn - 1; i >= 0; --i)
    ifac[i] = (long long)ifac[i + 1] * (i + 1) % Mod;
}
}  // namespace MATH
using namespace MATH;
namespace Poly {
struct Complex {
  double a, b;
  inline Complex() { a = b = 0; }
  inline Complex(double _a, double _b) { a = _a, b = _b; }
  inline Complex operator+(Complex first) const {
    return Complex(a + first.a, b + first.b);
  }
  inline Complex operator-(Complex first) const {
    return Complex(a - first.a, b - first.b);
  }
  inline Complex operator*(Complex first) const {
    return Complex(a * first.a - b * first.b, a * first.b + b * first.a);
  }
  inline Complex conj() { return Complex(a, -b); }
};
Complex a[Maxn], b[Maxn], w[Maxn], a1[Maxn], a2[Maxn];
int rev[Maxn], L, N;
inline void dft(Complex *A, int opt) {
  for (int i = 0; i < N; ++i)
    if (rev[i] < i) swap(A[rev[i]], A[i]);
  for (int i = 1; i < N; i <<= 1)
    for (int t = i << 1, j = 0; j < N; j += t)
      for (int k = 0; k < i; ++k) {
        Complex Wn = w[N / i * k];
        if (opt == -1) Wn.b *= -1;
        Complex first = A[j + k], second = Wn * A[i + j + k];
        A[j + k] = first + second, A[i + j + k] = first - second;
      }
}
inline void mul(int n, int *f, int *g, int *h, int power) {
  int k, v1, v2, v3, pw, cur;
  Complex ca, cb, da1, da2, db1, db2;
  for (N = 1, L = 0; N < 2 * n; N <<= 1) ++L;
  for (int i = 0; i < N; ++i) {
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (L - 1));
    a[i] = b[i] = Complex(0, 0);
  }
  for (int i = 0; i < N; ++i) w[i] = Complex(cos(PI * i / N), sin(PI * i / N));
  cur = 1, pw = Pow(2, power);
  for (int i = 0; i < n; ++i) {
    v1 = (long long)f[i] * cur % Mod, cur = (long long)cur * pw % Mod;
    a[i] = Complex(v1 & 32767, v1 >> 15);
    b[i] = Complex(g[i] & 32767, g[i] >> 15);
  }
  dft(a, 1), dft(b, 1);
  for (int i = 0; i < N; ++i) {
    k = (N - i) & (N - 1), ca = a[k].conj(), cb = b[k].conj();
    da1 = (ca + a[i]) * Complex(0.5, 0), da2 = (a[i] - ca) * Complex(0, -0.5);
    db1 = (cb + b[i]) * Complex(0.5, 0), db2 = (b[i] - cb) * Complex(0, -0.5);
    a1[i] = da1 * db1 + (da1 * db2 + da2 * db1) * Complex(0, 1),
    a2[i] = da2 * db2;
  }
  dft(a1, -1), dft(a2, -1);
  for (int i = 0; i < N; ++i) {
    v1 = (long long)(a1[i].a / N + 0.5) % Mod,
    v2 = (long long)(a1[i].b / N + 0.5) % Mod,
    v3 = (long long)(a2[i].a / N + 0.5) % Mod;
    h[i] = ((((long long)v3 << 30) + ((long long)v2 << 15) + v1) % Mod + Mod) %
           Mod;
  }
}
}  // namespace Poly
int ans, A[Maxn], B[Maxn];
long long N;
int M;
inline void Solve() {
  if (N > M) {
    puts("0");
    return;
  }
  math_init(M);
  A[0] = 1;
  for (int i = 1; i <= M; ++i) B[i] = ifac[i];
  int first = 0, second = 1;
  while (N) {
    if (N & 1) Poly ::mul(M + 1, A, B, A, second), first += second;
    Poly ::mul(M + 1, B, B, B, second);
    N >>= 1, second <<= 1;
  }
  for (int i = 0; i <= M; ++i)
    Add(ans, (long long)A[i] * fac[i] % Mod * Binom(M, i) % Mod);
  cout << ans << endl;
}
inline void Input() { N = read<long long>(), M = read<int>(); }
int main() {
  Input();
  Solve();
  return 0;
}
