#include <bits/stdc++.h>
const int mu=1e9+7,N=100005;
int n,a[N];
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	std::sort(a+1,a+n+1);
	n=std::unique(a+1,a+n+1)-a-1;
	int p=1;
	for (int i=1;i<=n;i++) p=(long long)p*(a[i]-a[i-1]+1)%mu;
	printf("%d\n",p);
}
#include <bits/stdc++.h>
using namespace std;

#define all(v) v.begin(), v.end()

//問題文を理解できなかった
// しきりを入れて区間に分ける
// 区間内はor演算、区間をまたぐときはxor演算を全ての要素同士で先頭から順に
// しきりを入れるパターンは、2^n-1(しきりを入れるか入れないか)
// 計算する場所としきりの場所がずれている!!
// 区間をor演算し終わったもの同士でxor演算する

// A={5,3,7,2,8}のとき
//   0 1 2 3 4
// 0 5|3 7|2 8|　
// i=0 0とA[0](5)をor演算、しきりがあるのでoredをxoredに保持。oredを0に
// i=1 0とA[1](3)をor演算　　　　　　　
// i=2 oredとA[2](7)をor演算 区間全てor演算したoredと保持していたxoredでxor演算
int main() {
  int N;
  cin >> N;
  vector<int> A(N);
  for (int i = 0; i < N; ++i) cin >> A[i];

  int ans = 1 << 30; // 10^9x1.073 使いやすい!　いいね!!
  // int型は4byte(32bit)、1<<31で10^9x2.147になる

  for (int bit = 0; bit < (1 << N - 1); ++bit) {
    int ored = 0, xored = 0;
    for (int i = 0; i < N; ++i) {
      //計算回数はN回、0とA[i]を最初に計算
      ored |= A[i];
      if (bit >> i & 1) { //一致すれば区間をまたぐ
        xored ^= ored;
        // or演算し終わった区間同士をxor演算する
        ored = 0;
      }
    }
    xored ^= ored;
    ans = min(ans, xored);
  }
  cout << ans << endl;
  return 0;
}

// int main() {
//   int N;
//   cin >> N;
//   vector<int> A(N);
//   for (int i = 0; i < N; ++i) cin >> A[i];
//   vector<int> a;
//   for (int i = 0; i < N; i += 2) {
//     int tmp = A[i] | A[i + 1];
//     a.push_back(tmp);
//   }
//   int ans = a[0];
//   for (int i = 1; i < a.size(); ++i) { ans ^= a[i]; }

//   cout << ans << endl;
//   //  sort(all(A));

//   // int tmp = 0;
//   // for (int i = 0; i < N - 1; ++i) { tmp |= A[i]; }
//   // tmp ^= A.back();
//   // cout << tmp << endl;
//   return 0;
// }
