#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O1")
#pragma GCC optimize("O1")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#define int long long
#define cint const int
#define ii pair<int, int>
#define fi first
#define se second
#define vi vector<int>
#define vii vector<vi>
#define pb push_back
#define pq priority_queue
#define mid(l, r) ((l + r) >> 1)
#define left(id) (id << 1)
#define right(id) (id << 1 | 1)
#define cntbit(mask) __builtin_popcountll(mask)
#define BIT(mask, i) (mask & (1ll << (i)))
#define ONBIT(mask, i) (mask | (1ll << (i)))
const int MAXN = 115;
const int oo = 1e18;
struct Node {
int i;
int j;
int s;
int D;
};
struct trace {
int i;
int j;
int s;
};
struct cmp {
bool operator() (Node a, Node b) {
return a.D > b.D;
}
};
int d[MAXN][MAXN][7];
char A[MAXN][MAXN];
trace pre[MAXN][MAXN][7];
bool vis[MAXN][MAXN][7], dg[MAXN][MAXN];
int N, M, X, Y, Z, T;
vector<int> di[7], dj[7], ns[7];
void djk() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
for (int s = 0; s <= 4; s++) {
d[i][j][s] = oo;
vis[i][j][s] = 0;
}
}
}
d[X][Y][0] = 0;
pq<Node, vector<Node>, cmp> q;
q.push({X, Y, 0, 0});
while (q.size()) {
Node top = q.top();
q.pop();
int i = top.i;
int j = top.j;
int s = top.s;
if (vis[i][j][s]) continue;
vis[i][j][s] = true;
for (int k = 0; k < 4; k++) {
int Ni = i + di[s][k];
int Nj = j + dj[s][k];
int Ns = ns[s][k];
if (Ni < 1 || Nj < 1 || Ni > N || Nj > M || vis[Ni][Nj][Ns]) continue;
if (Ns == 0) {
if (dg[Ni][Nj]) continue;
}
if (Ns == 1) {
if (dg[Ni][Nj] || dg[Ni + 1][Nj] || dg[Ni + 2][Nj]) continue;
}
if (Ns == 2) {
if (dg[Ni][Nj] || dg[Ni][Nj - 1] || dg[Ni][Nj - 2]) continue;
}
if (Ns == 3) {
if (dg[Ni][Nj] || dg[Ni - 1][Nj] || dg[Ni - 2][Nj]) continue;
}
if (Ns == 4) {
if (dg[Ni][Nj] || dg[Ni][Nj + 1] || dg[Ni][Nj + 2]) continue;
}
if (d[Ni][Nj][Ns] > d[i][j][s] + 1) {
d[Ni][Nj][Ns] = d[i][j][s] + 1;
pre[Ni][Nj][Ns] = {i, j, s};
//cout << Ni << ' ' << Nj << ' ' << Ns << ' ' << d[Ni][Nj][Ns] << '\n';
q.push({Ni, Nj, Ns, d[Ni][Nj][Ns]});
}
}
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("dtqg_gbox_dt2.inp", "r", stdin);
// freopen("dtqg_gbox_dt2.out", "w", stdout);
cin >> N >> M >> X >> Y >> Z >> T;
X++, Y++, Z++, T++;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
cin >> A[i][j];
if (A[i][j] == '1') dg[i][j] = true;
}
}
di[0] = {3, -3, 0, 0};
dj[0] = {0, 0, -3, 3};
ns[0] = {3, 1, 4, 2}; // xuong len trai phai
di[1] = {-1, 0, 3, 0};
dj[1] = {0, 1, 0, -1};
ns[1] = {0, 1, 0, 1}; // len phai xuong trai
di[2] = {-1, 0, 1, 0};
dj[2] = {0, 1, 0, -3};
ns[2] = {2, 0, 2, 0}; // len phai xuong trai
di[3] = {-3, 0, 1, 0};
dj[3] = {0, 1, 0, -1};
ns[3] = {0, 3, 0, 3}; // len phai xuong trai
di[4] = {-1, 0, 1, 0};
dj[4] = {0, 3, 0, -1};
ns[4] = {4, 0, 4, 0}; // len phai xuong trai
djk();
if (vis[Z][T][0]) cout << d[Z][T][0] << '\n';
else {
cout << -1;
return 0;
}
vector<int> res;
trace a = {Z, T, 0};
while (a.i != X || a.j != Y || a.s != 0) {
trace tmp = pre[a.i][a.j][a.s];
// len tren 3
// xuong duoi 1
// sang phai 0
// sang trai 2
for (int k = 0; k < 4; k++) {
int Ni = a.i, Nj = a.j, Ns = a.s;
int i = tmp.i, j = tmp.j, s = tmp.s;
if (Ni == i + di[s][k] && Nj == j + dj[s][k]) {
if (s == 0) {
if (Ns == 3) res.pb(1);
if (Ns == 1) res.pb(3);
if (Ns == 4) res.pb(2);
if (Ns == 2) res.pb(0);
}
else {
if (k == 0) res.pb(3);
if (k == 1) res.pb(0);
if (k == 2) res.pb(1);
if (k == 3) res.pb(2);
}
}
}
a = tmp;
}
reverse(res.begin(), res.end());
for (auto v : res) cout << v << ' ';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMSIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMSIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJ1bnJvbGwtbG9vcHMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgzKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiaW5saW5lIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mZ2NzZSIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZmdjc2UtbG0iKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZpcGEtc3JhIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdHJlZS1wcmUiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZ0cmVlLXZycCIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnBlZXBob2xlMiIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZmZhc3QtbWF0aCIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnNjaGVkLXNwZWMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZhbGlnbi1qdW1wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZmFsaWduLWxvb3BzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mYWxpZ24tbGFiZWxzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mZGV2aXJ0dWFsaXplIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mY2FsbGVyLXNhdmVzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mY3Jvc3NqdW1waW5nIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdGhyZWFkLWp1bXBzIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mcmVvcmRlci1ibG9ja3MiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZzY2hlZHVsZS1pbnNucyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUtZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdHJlZS10YWlsLW1lcmdlIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mc2NoZWR1bGUtaW5zbnMyIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mc3RyaWN0LWFsaWFzaW5nIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mYWxpZ24tZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mY3NlLWZvbGxvdy1qdW1wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnNjaGVkLWludGVyYmxvY2siKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZwYXJ0aWFsLWlubGluaW5nIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIm5vLXN0YWNrLXByb3RlY3RvciIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnJlb3JkZXItZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1maW5kaXJlY3QtaW5saW5pbmciKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZob2lzdC1hZGphY2VudC1sb2FkcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZnJlcnVuLWNzZS1hZnRlci1sb29wIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoImlubGluZS1zbWFsbC1mdW5jdGlvbnMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZpbmxpbmUtc21hbGwtZnVuY3Rpb25zIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mdHJlZS1zd2l0Y2gtY29udmVyc2lvbiIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCItZm9wdGltaXplLXNpYmxpbmctY2FsbHMiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIi1mZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MiKQojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBjaW50IGNvbnN0IGludAojZGVmaW5lIGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8dmk+CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgcHEgcHJpb3JpdHlfcXVldWUKI2RlZmluZSBtaWQobCwgcikgKChsICsgcikgPj4gMSkKI2RlZmluZSBsZWZ0KGlkKSAoaWQgPDwgMSkKI2RlZmluZSByaWdodChpZCkgKGlkIDw8IDEgfCAxKQojZGVmaW5lIGNudGJpdChtYXNrKSBfX2J1aWx0aW5fcG9wY291bnRsbChtYXNrKQojZGVmaW5lIEJJVChtYXNrLCBpKSAobWFzayAmICgxbGwgPDwgKGkpKSkKI2RlZmluZSBPTkJJVChtYXNrLCBpKSAobWFzayB8ICgxbGwgPDwgKGkpKSkKCmNvbnN0IGludCBNQVhOID0gMTE1Owpjb25zdCBpbnQgb28gICA9IDFlMTg7CgpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IHM7CiAgICBpbnQgRDsKfTsKCnN0cnVjdCB0cmFjZSB7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IHM7Cn07CgpzdHJ1Y3QgY21wIHsKICAgIGJvb2wgb3BlcmF0b3IoKSAoTm9kZSBhLCBOb2RlIGIpIHsKICAgICAgICByZXR1cm4gYS5EID4gYi5EOwogICAgfQp9OwoKaW50IGRbTUFYTl1bTUFYTl1bN107CmNoYXIgQVtNQVhOXVtNQVhOXTsKdHJhY2UgcHJlW01BWE5dW01BWE5dWzddOwpib29sIHZpc1tNQVhOXVtNQVhOXVs3XSwgZGdbTUFYTl1bTUFYTl07CmludCBOLCBNLCBYLCBZLCBaLCBUOwp2ZWN0b3I8aW50PiBkaVs3XSwgZGpbN10sIG5zWzddOwoKCnZvaWQgZGprKCkgewogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gTTsgaisrKSB7CiAgICAgICAgICAgIGZvciAoaW50IHMgPSAwOyBzIDw9IDQ7IHMrKykgewogICAgICAgICAgICAgICAgZFtpXVtqXVtzXSA9IG9vOwogICAgICAgICAgICAgICAgdmlzW2ldW2pdW3NdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGRbWF1bWV1bMF0gPSAwOwogICAgcHE8Tm9kZSwgdmVjdG9yPE5vZGU+LCBjbXA+IHE7CiAgICBxLnB1c2goe1gsIFksIDAsIDB9KTsKICAgIHdoaWxlIChxLnNpemUoKSkgewogICAgICAgIE5vZGUgdG9wID0gcS50b3AoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGludCBpID0gdG9wLmk7CiAgICAgICAgaW50IGogPSB0b3AuajsKICAgICAgICBpbnQgcyA9IHRvcC5zOwogICAgICAgIGlmICh2aXNbaV1bal1bc10pIGNvbnRpbnVlOwogICAgICAgIHZpc1tpXVtqXVtzXSA9IHRydWU7CiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKICAgICAgICAgICAgaW50IE5pID0gaSArIGRpW3NdW2tdOwogICAgICAgICAgICBpbnQgTmogPSBqICsgZGpbc11ba107CiAgICAgICAgICAgIGludCBOcyA9IG5zW3NdW2tdOwoKICAgICAgICAgICAgaWYgKE5pIDwgMSB8fCBOaiA8IDEgfHwgTmkgPiBOIHx8IE5qID4gTSB8fCB2aXNbTmldW05qXVtOc10pIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoTnMgPT0gMCkgewogICAgICAgICAgICAgICAgaWYgKGRnW05pXVtOal0pIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoTnMgPT0gMSkgewogICAgICAgICAgICAgICAgaWYgKGRnW05pXVtOal0gfHwgZGdbTmkgKyAxXVtOal0gfHwgZGdbTmkgKyAyXVtOal0pIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChOcyA9PSAyKSB7CiAgICAgICAgICAgICAgICBpZiAoZGdbTmldW05qXSB8fCBkZ1tOaV1bTmogLSAxXSB8fCBkZ1tOaV1bTmogLSAyXSkgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChOcyA9PSAzKSB7CiAgICAgICAgICAgICAgICBpZiAoZGdbTmldW05qXSB8fCBkZ1tOaSAtIDFdW05qXSB8fCBkZ1tOaSAtIDJdW05qXSkgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKE5zID09IDQpIHsKICAgICAgICAgICAgICAgIGlmIChkZ1tOaV1bTmpdIHx8IGRnW05pXVtOaiArIDFdIHx8IGRnW05pXVtOaiArIDJdKSBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZFtOaV1bTmpdW05zXSA+IGRbaV1bal1bc10gKyAxKSB7CiAgICAgICAgICAgICAgICBkW05pXVtOal1bTnNdID0gZFtpXVtqXVtzXSArIDE7CiAgICAgICAgICAgICAgICBwcmVbTmldW05qXVtOc10gPSB7aSwgaiwgc307CiAgICAgICAgICAgICAgICAvL2NvdXQgPDwgTmkgPDwgJyAnIDw8IE5qIDw8ICcgJyA8PCBOcyA8PCAnICcgPDwgZFtOaV1bTmpdW05zXSA8PCAnXG4nOwogICAgICAgICAgICAgICAgcS5wdXNoKHtOaSwgTmosIE5zLCBkW05pXVtOal1bTnNdfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwoKLy8gICAgZnJlb3BlbigiZHRxZ19nYm94X2R0Mi5pbnAiLCAiciIsIHN0ZGluKTsKLy8gICAgZnJlb3BlbigiZHRxZ19nYm94X2R0Mi5vdXQiLCAidyIsIHN0ZG91dCk7CgoKICAgIGNpbiA+PiBOID4+IE0gPj4gWCA+PiBZID4+IFogPj4gVDsKICAgIFgrKywgWSsrLCBaKyssIFQrKzsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IE07IGorKykgewogICAgICAgICAgICBjaW4gPj4gQVtpXVtqXTsKICAgICAgICAgICAgaWYgKEFbaV1bal0gPT0gJzEnKSBkZ1tpXVtqXSA9IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIGRpWzBdID0gezMsIC0zLCAwLCAwfTsKICAgIGRqWzBdID0gezAsIDAsIC0zLCAzfTsKICAgIG5zWzBdID0gezMsIDEsIDQsIDJ9OyAvLyB4dW9uZyBsZW4gdHJhaSBwaGFpCgogICAgZGlbMV0gPSB7LTEsIDAsIDMsIDB9OwogICAgZGpbMV0gPSB7MCwgMSwgMCwgLTF9OwogICAgbnNbMV0gPSB7MCwgMSwgMCwgMX07IC8vIGxlbiBwaGFpIHh1b25nIHRyYWkKCiAgICBkaVsyXSA9IHstMSwgMCwgMSwgMH07CiAgICBkalsyXSA9IHswLCAxLCAwLCAtM307CiAgICBuc1syXSA9IHsyLCAwLCAyLCAwfTsgLy8gbGVuIHBoYWkgeHVvbmcgdHJhaQoKICAgIGRpWzNdID0gey0zLCAwLCAxLCAwfTsKICAgIGRqWzNdID0gezAsIDEsIDAsIC0xfTsKICAgIG5zWzNdID0gezAsIDMsIDAsIDN9OyAvLyBsZW4gcGhhaSB4dW9uZyB0cmFpCgogICAgZGlbNF0gPSB7LTEsIDAsIDEsIDB9OwogICAgZGpbNF0gPSB7MCwgMywgMCwgLTF9OwogICAgbnNbNF0gPSB7NCwgMCwgNCwgMH07IC8vIGxlbiBwaGFpIHh1b25nIHRyYWkKCiAgICBkamsoKTsKICAgIGlmICh2aXNbWl1bVF1bMF0pIGNvdXQgPDwgZFtaXVtUXVswXSA8PCAnXG4nOwogICAgZWxzZSB7CiAgICAgICAgY291dCA8PCAtMTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB2ZWN0b3I8aW50PiByZXM7CiAgICB0cmFjZSBhID0ge1osIFQsIDB9OwogICAgd2hpbGUgKGEuaSAhPSBYIHx8IGEuaiAhPSBZIHx8IGEucyAhPSAwKSB7CiAgICAgICAgdHJhY2UgdG1wID0gcHJlW2EuaV1bYS5qXVthLnNdOwogICAgICAgIC8vIGxlbiB0cmVuIDMKICAgICAgICAvLyB4dW9uZyBkdW9pIDEKICAgICAgICAvLyBzYW5nIHBoYWkgMAogICAgICAgIC8vIHNhbmcgdHJhaSAyCiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspIHsKICAgICAgICAgICAgaW50IE5pID0gYS5pLCBOaiA9IGEuaiwgTnMgPSBhLnM7CiAgICAgICAgICAgIGludCBpICA9IHRtcC5pLCBqID0gdG1wLmosIHMgPSB0bXAuczsKICAgICAgICAgICAgaWYgKE5pID09IGkgKyBkaVtzXVtrXSAmJiBOaiA9PSBqICsgZGpbc11ba10pIHsKICAgICAgICAgICAgICAgIGlmIChzID09IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoTnMgPT0gMykgcmVzLnBiKDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChOcyA9PSAxKSByZXMucGIoMyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE5zID09IDQpIHJlcy5wYigyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTnMgPT0gMikgcmVzLnBiKDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gMCkgcmVzLnBiKDMpOwogICAgICAgICAgICAgICAgICAgIGlmIChrID09IDEpIHJlcy5wYigwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSAyKSByZXMucGIoMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGsgPT0gMykgcmVzLnBiKDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGEgPSB0bXA7CiAgICB9CiAgICByZXZlcnNlKHJlcy5iZWdpbigpLCByZXMuZW5kKCkpOwogICAgZm9yIChhdXRvIHYgOiByZXMpIGNvdXQgPDwgdiA8PCAnICc7Cn0K