#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const double eps = 1e-9;
const int MAX_N = 1e6 + 5;
const int inf = 1e9;
const long long Inf = (long long)1e18;
const long long M = (long long)1e9 + 7;
int Int() {
  int x;
  scanf("%d", &x);
  return x;
}
long long Long() {
  long long x;
  scanf("%lld", &x);
  return x;
}
void Char(char* ch) { scanf("%s", ch); }
template <typename t>
inline t abs(t a) {
  if (a >= 0) return a;
  return -a;
}
template <typename t>
inline t gcd(t a, t b) {
  return !b ? a : gcd(b, a % b);
}
template <typename t>
inline t lcm(t a, t b) {
  return a * (b / gcd(a, b));
}
template <typename T>
T mul(T b, T p, T mod) {
  T res = 0;
  while (p > 0) {
    if (p & 1) {
      res = (res + b) % mod;
    }
    b = (b * 2) % mod;
    p >>= 1;
  }
  return res % mod;
}
template <typename T>
inline T modpow(T b, T p, T Mod) {
  T res = 1;
  while (p) {
    if (p & 1) {
      res = mul(res, b, Mod);
      res %= Mod;
    }
    b = mul(b, b, Mod);
    b %= Mod;
    p >>= 1;
  }
  return res % Mod;
}
template <typename T>
inline T ModInv(T b, T Mod) {
  return modpow(b, Mod - 2, Mod);
}
template <typename T>
inline T pwr(T b, T p) {
  T res = 1;
  while (p > 0) {
    if (p & 1) {
      res *= b;
    }
    b *= b;
    p >>= 1;
  }
  return res;
}
int e1, e2, d1;
template <typename T>
inline void extgcd(T a, T b) {
  if (!b) {
    e1 = 1, e2 = 0, d1 = a;
    return;
  }
  extgcd(b, a % b);
  T x1 = e2;
  T y1 = e1 - (a / b) * e2;
  e1 = x1;
  e2 = y1;
}
template <typename T>
inline vector<T> Unique(vector<T> v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  return v;
}
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c)) v.emplace_back(x);
  return move(v);
}
void err(vector<string>::iterator it) {}
template <typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
  cout << it->substr((*it)[0] == ' ', it->length()) << " = " << a << " ";
  err(++it, args...);
}
std::vector<int> v;
void make() {
  int x;
  for (int i = 1; i <= 50000; i++) {
    int f = (1LL * i * (i - 1)) / 2LL;
    if (f <= inf) x = f;
    v.push_back(f);
  }
}
int main() {
  int t = 1, tc = 0;
  make();
  while (t--) {
    int a = Int(), b = Int(), c = Int(), d = Int();
    int l = lower_bound(v.begin(), v.end(), a) - v.begin();
    int r = lower_bound(v.begin(), v.end(), d) - v.begin();
    if (v[l] != a or v[r] != d) return puts("Impossible"), 0;
    l++, r++;
    if (!a and !b and !c and !d) return puts("0"), 0;
    if (!a and !b and !c and d) {
      while (r--) printf("1");
      return cout << '\n', 0;
    }
    if (a and !b and !c and !d) {
      while (l--) printf("0");
      return cout << '\n', 0;
    }
    int k = l * r;
    if (c + b != k) return puts("Impossible"), 0;
    int h = c / l;
    int rem = c % l;
    r -= h;
    while (h--) {
      printf("1");
    }
    while (l--) {
      if (l + 1 == rem and rem) printf("1");
      printf("0");
    }
    if (rem) r--;
    while (r--) {
      printf("1");
    }
    cout << '\n';
  }
  return 0;
}

### Prompt

Generate a cpp solution to the following problem:

For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x, y}. 

In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.

Input

The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.

Output

If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.

Examples

Input

1 2 3 4


Output

Impossible


Input

1 2 2 1


Output

0110

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const double eps = 1e-9;
const int MAX_N = 1e6 + 5;
const int inf = 1e9;
const long long Inf = (long long)1e18;
const long long M = (long long)1e9 + 7;
int Int() {
  int x;
  scanf("%d", &x);
  return x;
}
long long Long() {
  long long x;
  scanf("%lld", &x);
  return x;
}
void Char(char* ch) { scanf("%s", ch); }
template <typename t>
inline t abs(t a) {
  if (a >= 0) return a;
  return -a;
}
template <typename t>
inline t gcd(t a, t b) {
  return !b ? a : gcd(b, a % b);
}
template <typename t>
inline t lcm(t a, t b) {
  return a * (b / gcd(a, b));
}
template <typename T>
T mul(T b, T p, T mod) {
  T res = 0;
  while (p > 0) {
    if (p & 1) {
      res = (res + b) % mod;
    }
    b = (b * 2) % mod;
    p >>= 1;
  }
  return res % mod;
}
template <typename T>
inline T modpow(T b, T p, T Mod) {
  T res = 1;
  while (p) {
    if (p & 1) {
      res = mul(res, b, Mod);
      res %= Mod;
    }
    b = mul(b, b, Mod);
    b %= Mod;
    p >>= 1;
  }
  return res % Mod;
}
template <typename T>
inline T ModInv(T b, T Mod) {
  return modpow(b, Mod - 2, Mod);
}
template <typename T>
inline T pwr(T b, T p) {
  T res = 1;
  while (p > 0) {
    if (p & 1) {
      res *= b;
    }
    b *= b;
    p >>= 1;
  }
  return res;
}
int e1, e2, d1;
template <typename T>
inline void extgcd(T a, T b) {
  if (!b) {
    e1 = 1, e2 = 0, d1 = a;
    return;
  }
  extgcd(b, a % b);
  T x1 = e2;
  T y1 = e1 - (a / b) * e2;
  e1 = x1;
  e2 = y1;
}
template <typename T>
inline vector<T> Unique(vector<T> v) {
  sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());
  return v;
}
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c)) v.emplace_back(x);
  return move(v);
}
void err(vector<string>::iterator it) {}
template <typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
  cout << it->substr((*it)[0] == ' ', it->length()) << " = " << a << " ";
  err(++it, args...);
}
std::vector<int> v;
void make() {
  int x;
  for (int i = 1; i <= 50000; i++) {
    int f = (1LL * i * (i - 1)) / 2LL;
    if (f <= inf) x = f;
    v.push_back(f);
  }
}
int main() {
  int t = 1, tc = 0;
  make();
  while (t--) {
    int a = Int(), b = Int(), c = Int(), d = Int();
    int l = lower_bound(v.begin(), v.end(), a) - v.begin();
    int r = lower_bound(v.begin(), v.end(), d) - v.begin();
    if (v[l] != a or v[r] != d) return puts("Impossible"), 0;
    l++, r++;
    if (!a and !b and !c and !d) return puts("0"), 0;
    if (!a and !b and !c and d) {
      while (r--) printf("1");
      return cout << '\n', 0;
    }
    if (a and !b and !c and !d) {
      while (l--) printf("0");
      return cout << '\n', 0;
    }
    int k = l * r;
    if (c + b != k) return puts("Impossible"), 0;
    int h = c / l;
    int rem = c % l;
    r -= h;
    while (h--) {
      printf("1");
    }
    while (l--) {
      if (l + 1 == rem and rem) printf("1");
      printf("0");
    }
    if (rem) r--;
    while (r--) {
      printf("1");
    }
    cout << '\n';
  }
  return 0;
}

```