You are given a sequence a_1, a_2, ..., a_n consisting of n integers.

You can choose any non-negative integer D (i.e. D ≥ 0), and for each a_i you can:

  * add D (only once), i. e. perform a_i := a_i + D, or 
  * subtract D (only once), i. e. perform a_i := a_i - D, or 
  * leave the value of a_i unchanged. 



It is possible that after an operation the value a_i becomes negative.

Your goal is to choose such minimum non-negative integer D and perform changes in such a way, that all a_i are equal (i.e. a_1=a_2=...=a_n).

Print the required D or, if it is impossible to choose such value D, print -1.

For example, for array [2, 8] the value D=3 is minimum possible because you can obtain the array [5, 5] if you will add D to 2 and subtract D from 8. And for array [1, 4, 7, 7] the value D=3 is also minimum possible. You can add it to 1 and subtract it from 7 and obtain the array [4, 4, 4, 4].

Input

The first line of the input contains one integer n (1 ≤ n ≤ 100) — the number of elements in a.

The second line of the input contains n integers a_1, a_2, ..., a_n (1 ≤ a_i ≤ 100) — the sequence a.

Output

Print one integer — the minimum non-negative integer value D such that if you add this value to some a_i, subtract this value from some a_i and leave some a_i without changes, all obtained values become equal.

If it is impossible to choose such value D, print -1.

Examples

Input


6
1 4 4 7 4 1


Output


3


Input


5
2 2 5 2 5


Output


3


Input


4
1 3 3 7


Output


-1


Input


2
2 8


Output


3
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int INTMAX = numeric_limits<int>::max();
const long long LLMAX = numeric_limits<long long>::max();
void writeln() { cout << "\n"; }
template <class T>
inline void print(T&& a);
template <class T>
inline void priws(T&& a);
template <class T>
inline void read(T& a);
template <class... Args>
inline void readln(Args&... args) {
  (read(args), ...);
}
template <class H, class... T>
inline void writeln(H&& h, T&&... t) {
  priws(h);
  (print(t), ...);
  writeln();
}
template <class T>
inline void writeln_range(T f, T s) {
  if (f != s)
    for (auto i = f; i != s; ++i) writeln(*i);
}
vector<string> split(string& s, string d) {
  vector<string> v;
  size_t p = 0;
  while ((p = s.find(d)) != string::npos)
    v.push_back(s.substr(0, p)), s.erase(0, p + d.length());
  v.push_back(s);
  return v;
}
template <class... Args>
inline void err(string v, Args... args) {
  auto vv = split(v, ", ");
  auto it = vv.begin();
  (writeln(*it++, "=", args), ...);
}
void run() {
  int n;
  readln(n);
  vector<int> a(n);
  readln(a);
  set<int> b;
  for (int x : a) b.insert(x);
  if (b.size() == 1) return writeln(0);
  int first = *b.begin();
  int second = *b.rbegin();
  auto it = b.begin();
  ++it;
  int third = *it;
  if (b.size() == 2) {
    int diff = second - first;
    if (diff % 2 == 0) diff /= 2;
    return writeln(diff);
  }
  if (b.size() == 3) {
    int diff = third - first;
    if (second - third == diff) return writeln(diff);
  }
  writeln(-1);
}
int main() {
  ios_base::sync_with_stdio(false);
  run();
  return 0;
}
template <class T>
inline ostream& operator<<(ostream& os, vector<T> const& _a);
template <class T1, class T2>
inline istream& operator>>(istream& is, pair<T1, T2>& _a) {
  return is >> _a.first >> _a.second;
}
template <class T1, class T2>
inline ostream& operator<<(ostream& os, pair<T1, T2> const& _a) {
  return os << _a.first << " " << _a.second;
}
template <class T>
inline ostream& operator<<(ostream& os, vector<T> const& _a) {
  if (_a.size())
    os << _a[0];
  else
    os << "\n";
  for (int i = 1; i < (int)(_a.size()); ++i)
    os << "\n "[is_fundamental<T>::value] << _a[i];
  return os;
}
template <class T>
inline ostream& operator<<(ostream& os, valarray<T> const& _a) {
  if (_a.size())
    os << _a[0];
  else
    os << "\n";
  for (int i = 1; i < (int)(_a.size()); ++i)
    os << "\n "[is_fundamental<T>::value] << _a[i];
  return os;
}
template <class T>
inline istream& operator>>(istream& is, vector<T>& _a) {
  for (int i = 0; i < (int)(_a.size()); ++i) is >> _a[i];
  return is;
}
template <class T>
inline istream& operator>>(istream& is, valarray<T>& _a) {
  for (int i = 0; i < (int)(_a.size()); ++i) is >> _a[i];
  return is;
}
template <class T>
inline void print(T&& _a) {
  cout << " " << _a;
}
template <class T>
inline void priws(T&& _a) {
  cout << _a;
}
template <class T>
inline void read(T& _a) {
  cin >> _a;
}
