Problem: Jzzhu have n non-negative integers a1, a2, ..., an. We will call a sequence of indexes i1, i2, ..., ik (1 ≤ i1 < i2 < ... < ik ≤ n) a group of size k. 

Jzzhu wonders, how many groups exists such that ai1 & ai2 & ... & aik = 0 (1 ≤ k ≤ n)? Help him and print this number modulo 1000000007 (109 + 7). Operation x & y denotes bitwise AND operation of two numbers.

Input

The first line contains a single integer n (1 ≤ n ≤ 106). The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 106).

Output

Output a single integer representing the number of required groups modulo 1000000007 (109 + 7).

Examples

Input

3
2 3 3


Output

0


Input

4
0 1 2 3


Output

10


Input

6
5 2 0 5 2 1


Output

53

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
const int N = 3e6 + 5;
int bit[N], pw[N], f[N];
char IN[1000000], *SS = IN, *TT = IN;
inline int read() {
  int now = 0;
  register char c =
      (SS == TT && (TT = (SS = IN) + fread(IN, 1, 1000000, stdin), SS == TT)
           ? EOF
           : *SS++);
  for (; !isdigit(c);
       c = (SS == TT &&
                    (TT = (SS = IN) + fread(IN, 1, 1000000, stdin), SS == TT)
                ? EOF
                : *SS++))
    ;
  for (; isdigit(c);
       now = now * 10 + c - '0',
       c = (SS == TT &&
                    (TT = (SS = IN) + fread(IN, 1, 1000000, stdin), SS == TT)
                ? EOF
                : *SS++))
    ;
  return now;
}
int main() {
  int n = read(), lim = 0;
  for (int t, i = 1; i <= n; ++i) ++f[t = read()], lim = std::max(lim, t);
  pw[0] = 1;
  for (int i = 1; i <= n; ++i)
    pw[i] = pw[i - 1] << 1, pw[i] >= 1000000007 && (pw[i] -= 1000000007);
  for (int i = 0; 1 << i <= lim; ++i)
    for (int s = 0; s <= lim; ++s)
      if (!(s >> i & 1))
        (f[s] += f[s | (1 << i)]) >= 1000000007 && (f[s] -= 1000000007);
  long long ans = 0;
  for (int i = 1; i <= lim; ++i) bit[i] = bit[i ^ (i & -i)] ^ 1;
  for (int i = 0; i <= lim; ++i)
    ans += bit[i] ? 1000000007 - pw[f[i]] + 1 : pw[f[i]] - 1;
  printf("%I64d\n", ans % 1000000007);
  return 0;
}