#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
using ll = long long;
using pii = pair<int,int>;
const int dx[] = {-1,1,0,0};
const int dy[] = {0,0,-1,1};
const ll mod = 1e9 + 7;
const ll base = 31;
const ll X = 1;
const ll XX = 5;
const ll XXX = 4;
const int N_boxes = 10;
const int N = 32;
const ll X1 = 3000;
const ll X2 = 1;
const ll X3 = 1;
const ll CANT = 10000;
const int inf = 1e9 + 7;
const char Box = 'x';
const char You = 'a';
const char Goal = 'A';
const char Wall = '#';
const int BEAM_WIDTH = 150000;
const int h[17][17] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53},
{0,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131},
{0,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223},
{0,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311},
{0,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409},
{0,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503},
{0,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613},
{0,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719},
{0,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827},
{0,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941},
{0,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049},
{0,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163},
{0,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283},
{0,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423},
{0,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511},
{0,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619},
};
const int h1[17][17] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747},
{0,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877},
{0,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003},
{0,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129},
{0,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267},
{0,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377},
{0,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503},
{0,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657},
{0,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741},
{0,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861},
{0,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011},
{0,3019,3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167},
{0,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301},
{0,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413},
{0,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541},
{0,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671},
};
ll Mul(ll x, ll y){
return x * y % mod;
}
ll Add(ll x, ll y){
x += y;
if(x >= mod) x -= mod;
return x;
}
ll hx[N_boxes], hy[N_boxes];
pii goal, St;
int Cur = 0;
vector<pii> GvB;
int n, m;
string a[N];
unordered_map<ll,ll> mp;
int Time;
const int nigaco1 = 1, nigaco2 = 1; // he so
int niga1 [17] [17], niga2 [17] [17], nigatmp [17] [17];
pii nigadj [] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
queue <pii> nigaq;
const int nigalim = 1e9;
void nigafs (pii x, int type) {
memset (nigatmp, 0x3f, sizeof nigatmp);
nigatmp [x. fi] [x. se] = 0;
nigaq. push (x);
while (!nigaq. empty ()) {
pii nigabruh = nigaq. front ();
nigaq. pop ();
for (pii nigai : nigadj) {
pii nigane = {nigabruh. fi + nigai. fi, nigabruh. se + nigai. se};
if (nigane. fi <= 0 || nigane. fi > 16 || nigane. se <= 0 || nigane. se > 16 || a [nigane. fi] [nigane. se] == '#') continue;
if (nigatmp [nigane. fi] [nigane. se] > nigatmp [nigabruh. fi] [nigabruh. se] + 1) {
nigatmp [nigane. fi] [nigane. se] > nigatmp [nigabruh. fi] [nigabruh. se] + 1;
nigaq. push (nigane);
}
}
}
for (int i = 0; i < 16; i ++) for (int j = 0; j < 16; j ++) {
switch (type) {
case 1 :
niga1 [i] [j] += nigatmp [i] [j];
break;
case 2 :
niga2 [i] [j] += nigatmp [i] [j];
break;
}
}
}
struct State{
pii player;
vector<pii> boxes;
// int cost;
ll cost_heu;
int cur;
string path;
State(pii _player, vector<pii> _boxes, int _cur, string _path = "")
: player(_player), boxes(_boxes), cur(_cur), path(_path) {
cost_heu = cost_H();
}
ll Hash() const {
ll res = 1;
for(pii i : boxes) res = Mul(res,h[i.fi][i.se]);
res = Mul(res,h1[player.fi][player.se]);
return res;
}
ll cost_H() const{
ll res = 0;
int res1 = inf;
int res2 = inf;
for(pii i : boxes){
if(a[i.fi][i.se] != Goal){
res = res + abs(i.fi - goal.fi) + abs(i.se - goal.se);
res1 = min(res1,abs(i.fi - player.fi) + abs(i.se - player.se));
res2 = min(res2,abs(i.fi - goal.fi) + abs(i.se - goal.se));
}
}
//return res;
return X * res + XX * (res1 == inf ? 0 : res1) + XXX * (res2 == inf ? 0 : res2);
}
ll real_cost() const{
return X2 * cost_heu - X1 * cur;
}
bool operator < (const State&other) const{
return real_cost() > other.real_cost();
}
};
bool chk_in(int x, int y){
return (1 <= x && x <= n && 1 <= y && y <= m);
}
void out(State x){
cout << "Player at :" << x.player.fi << ' ' << x.player.se << "\n";
cout << "Cost :" << ' ' << x.cost_heu << ' ' << x.cur << "\n";
cout << "Boxes:\n";
int dem = 0;
for(pii i : x.boxes) {
dem++;
cout << "Boxes " <<dem <<":" <<i.fi << ' ' << i.se << "\n";
}
cout << "Hash:" << x.Hash();
cout << "\n";
}
void sol(){
cin >> Time;
n = 15; m = 15;
for(int i = 0 ; i <= m ; ++i)
a[0][i] = a[n + 1][i] = '#';
for(int i = 1 ; i <= n ; ++i){
cin >> a[i];
a[i] = '#' + a[i] + '#';
for(int j = 1 ; j <= m ; ++j){
if(a[i][j] == Box) {GvB.push_back({i,j});Cur++;}
if(a[i][j] == Goal) goal = {i,j};
if(a[i][j] == You) St = {i,j};
}
}
for (auto i : GvB) {
nigafs (i, 1);
}
nigafs (goal, 2);
int ans = 0;
cout << Cur << "!\n";
State orgin = State(St,GvB,0,"");
vector<State> beam{orgin};
mp[orgin.Hash()] = orgin.real_cost();
ll mn = orgin.real_cost();
for(int step = 0; step < Time && !beam.empty(); ++step){
vector<State> nxt_beam;
nxt_beam.reserve(beam.size() * 4);
////
for(auto &t : beam){
ans = max(ans,t.cur);
if(ans == Cur) break;
if(t.real_cost() != mp[t.Hash()]) continue;
mn = min(mn,t.real_cost());
for(int j = 0 ; j < 4 ; ++j){
int _x = t.player.fi + dx[j];
int _y = t.player.se + dy[j];
if(!chk_in(_x,_y)) continue;
int _x1 = _x + dx[j];
int _y1 = _y + dy[j];
int pos = -1;
int pos1 = -1;
for(int _j = 0 ; _j < (int)t.boxes.size() ; ++_j){
if(a[_x][_y] != Goal){
if(_x == t.boxes[_j].fi && _y == t.boxes[_j].se) pos = _j;
}
if(a[_x1][_y1] != Goal){
if(_x1 == t.boxes[_j].fi && _y1 == t.boxes[_j].se) pos1 = _j;
}
}
if(pos != -1 && pos1 != -1) continue;
if(pos != -1 && a[_x1][_y1] == '#') continue;
State _new = t;
_new.player = {_x,_y};
if(pos != -1) {_new.boxes[pos] = {_x1,_y1};
if(a[_x1][_y1] == Goal) _new.cur += 1;
}
_new.cost_heu = _new.cost_H();
ll hval = _new.Hash();
if(_new.cost_heu >= mn + CANT) continue;
if(mp.count(hval) && mp[hval] <= _new.real_cost()) {
continue;
}
mp[hval] = _new.real_cost();
nxt_beam.push_back(_new);
}
}
if(ans == Cur) break;
sort(nxt_beam.begin(),nxt_beam.end());
while((int)nxt_beam.size() > BEAM_WIDTH) nxt_beam.pop_back();
beam.swap(nxt_beam);
}
cout << ans << "\n";
}
int main(){
// freopen ("input.txt", "r", stdin);
// freopen ("output.txt", "w", stdout);
int tc;
tc = 1;
while(tc--) sol();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAp1c2luZyBsbCA9IGxvbmcgbG9uZzsKdXNpbmcgcGlpID0gcGFpcjxpbnQsaW50PjsKCmNvbnN0IGludCBkeFtdID0gey0xLDEsMCwwfTsKY29uc3QgaW50IGR5W10gPSB7MCwwLC0xLDF9OwoKY29uc3QgbGwgbW9kID0gMWU5ICsgNzsKY29uc3QgbGwgYmFzZSA9IDMxOwpjb25zdCBsbCBYID0gMTsKY29uc3QgbGwgWFggPSA1Owpjb25zdCBsbCBYWFggPSA0Owpjb25zdCBpbnQgTl9ib3hlcyA9IDEwOwpjb25zdCBpbnQgTiA9IDMyOwpjb25zdCBsbCBYMSA9IDMwMDA7CmNvbnN0IGxsIFgyID0gMTsKY29uc3QgbGwgWDMgPSAxOwpjb25zdCBsbCBDQU5UID0gMTAwMDA7Cgpjb25zdCBpbnQgaW5mID0gMWU5ICsgNzsKCmNvbnN0IGNoYXIgQm94ID0gJ3gnOwpjb25zdCBjaGFyIFlvdSA9ICdhJzsKY29uc3QgY2hhciBHb2FsID0gJ0EnOwpjb25zdCBjaGFyIFdhbGwgPSAnIyc7CmNvbnN0IGludCBCRUFNX1dJRFRIID0gMTUwMDAwOwoKY29uc3QgaW50IGhbMTddWzE3XSA9ICB7CiAgICB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwKICAgIHswLDIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcsNDEsNDMsNDcsNTN9LAogICAgezAsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsMTAxLDEwMywxMDcsMTA5LDExMywxMjcsMTMxfSwKICAgIHswLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwxOTEsMTkzLDE5NywxOTksMjExLDIyM30sCiAgICB7MCwyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEsMjc3LDI4MSwyODMsMjkzLDMwNywzMTF9LAogICAgezAsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwzNjcsMzczLDM3OSwzODMsMzg5LDM5Nyw0MDEsNDA5fSwKICAgIHswLDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4Nyw0OTEsNDk5LDUwM30sCiAgICB7MCw1MDksNTIxLDUyMyw1NDEsNTQ3LDU1Nyw1NjMsNTY5LDU3MSw1NzcsNTg3LDU5Myw1OTksNjAxLDYwNyw2MTN9LAogICAgezAsNjE3LDYxOSw2MzEsNjQxLDY0Myw2NDcsNjUzLDY1OSw2NjEsNjczLDY3Nyw2ODMsNjkxLDcwMSw3MDksNzE5fSwKICAgIHswLDcyNyw3MzMsNzM5LDc0Myw3NTEsNzU3LDc2MSw3NjksNzczLDc4Nyw3OTcsODA5LDgxMSw4MjEsODIzLDgyN30sCiAgICB7MCw4MjksODM5LDg1Myw4NTcsODU5LDg2Myw4NzcsODgxLDg4Myw4ODcsOTA3LDkxMSw5MTksOTI5LDkzNyw5NDF9LAogICAgezAsOTQ3LDk1Myw5NjcsOTcxLDk3Nyw5ODMsOTkxLDk5NywxMDA5LDEwMTMsMTAxOSwxMDIxLDEwMzEsMTAzMywxMDM5LDEwNDl9LAogICAgezAsMTA1MSwxMDYxLDEwNjMsMTA2OSwxMDg3LDEwOTEsMTA5MywxMDk3LDExMDMsMTEwOSwxMTE3LDExMjMsMTEyOSwxMTUxLDExNTMsMTE2M30sCiAgICB7MCwxMTcxLDExODEsMTE4NywxMTkzLDEyMDEsMTIxMywxMjE3LDEyMjMsMTIyOSwxMjMxLDEyMzcsMTI0OSwxMjU5LDEyNzcsMTI3OSwxMjgzfSwKICAgIHswLDEyODksMTI5MSwxMjk3LDEzMDEsMTMwMywxMzA3LDEzMTksMTMyMSwxMzI3LDEzNjEsMTM2NywxMzczLDEzODEsMTM5OSwxNDA5LDE0MjN9LAogICAgezAsMTQyNywxNDI5LDE0MzMsMTQzOSwxNDQ3LDE0NTEsMTQ1MywxNDU5LDE0NzEsMTQ4MSwxNDgzLDE0ODcsMTQ4OSwxNDkzLDE0OTksMTUxMX0sCiAgICB7MCwxNTIzLDE1MzEsMTU0MywxNTQ5LDE1NTMsMTU1OSwxNTY3LDE1NzEsMTU3OSwxNTgzLDE1OTcsMTYwMSwxNjA3LDE2MDksMTYxMywxNjE5fSwKfTsKCmNvbnN0IGludCBoMVsxN11bMTddID0gewogICAgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sCiAgICB7MCwxNjIxLDE2MjcsMTYzNywxNjU3LDE2NjMsMTY2NywxNjY5LDE2OTMsMTY5NywxNjk5LDE3MDksMTcyMSwxNzIzLDE3MzMsMTc0MSwxNzQ3fSwKICAgIHswLDE3NTMsMTc1OSwxNzc3LDE3ODMsMTc4NywxNzg5LDE4MDEsMTgxMSwxODIzLDE4MzEsMTg0NywxODYxLDE4NjcsMTg3MSwxODczLDE4Nzd9LAogICAgezAsMTg3OSwxODg5LDE5MDEsMTkwNywxOTEzLDE5MzEsMTkzMywxOTQ5LDE5NTEsMTk3MywxOTc5LDE5ODcsMTk5MywxOTk3LDE5OTksMjAwM30sCiAgICB7MCwyMDExLDIwMTcsMjAyNywyMDI5LDIwMzksMjA1MywyMDYzLDIwNjksMjA4MSwyMDgzLDIwODcsMjA4OSwyMDk5LDIxMTEsMjExMywyMTI5fSwKICAgIHswLDIxMzEsMjEzNywyMTQxLDIxNDMsMjE1MywyMTYxLDIxNzksMjIwMywyMjA3LDIyMTMsMjIyMSwyMjM3LDIyMzksMjI0MywyMjUxLDIyNjd9LAogICAgezAsMjI2OSwyMjczLDIyODEsMjI4NywyMjkzLDIyOTcsMjMwOSwyMzExLDIzMzMsMjMzOSwyMzQxLDIzNDcsMjM1MSwyMzU3LDIzNzEsMjM3N30sCiAgICB7MCwyMzgxLDIzODMsMjM4OSwyMzkzLDIzOTksMjQxMSwyNDE3LDI0MjMsMjQzNywyNDQxLDI0NDcsMjQ1OSwyNDY3LDI0NzMsMjQ3NywyNTAzfSwKICAgIHswLDI1MjEsMjUzMSwyNTM5LDI1NDMsMjU0OSwyNTUxLDI1NTcsMjU3OSwyNTkxLDI1OTMsMjYwOSwyNjE3LDI2MjEsMjYzMywyNjQ3LDI2NTd9LAogICAgezAsMjY1OSwyNjYzLDI2NzEsMjY3NywyNjgzLDI2ODcsMjY4OSwyNjkzLDI2OTksMjcwNywyNzExLDI3MTMsMjcxOSwyNzI5LDI3MzEsMjc0MX0sCiAgICB7MCwyNzQ5LDI3NTMsMjc2NywyNzc3LDI3ODksMjc5MSwyNzk3LDI4MDEsMjgwMywyODE5LDI4MzMsMjgzNywyODQzLDI4NTEsMjg1NywyODYxfSwKICAgIHswLDI4NzksMjg4NywyODk3LDI5MDMsMjkwOSwyOTE3LDI5MjcsMjkzOSwyOTUzLDI5NTcsMjk2MywyOTY5LDI5NzEsMjk5OSwzMDAxLDMwMTF9LAogICAgezAsMzAxOSwzMDIzLDMwMzcsMzA0MSwzMDQ5LDMwNjEsMzA2NywzMDc5LDMwODMsMzA4OSwzMTA5LDMxMTksMzEyMSwzMTM3LDMxNjMsMzE2N30sCiAgICB7MCwzMTY5LDMxODEsMzE4NywzMTkxLDMyMDMsMzIwOSwzMjE3LDMyMjEsMzIyOSwzMjUxLDMyNTMsMzI1NywzMjU5LDMyNzEsMzI5OSwzMzAxfSwKICAgIHswLDMzMDcsMzMxMywzMzE5LDMzMjMsMzMyOSwzMzMxLDMzNDMsMzM0NywzMzU5LDMzNjEsMzM3MSwzMzczLDMzODksMzM5MSwzNDA3LDM0MTN9LAogICAgezAsMzQzMywzNDQ5LDM0NTcsMzQ2MSwzNDYzLDM0NjcsMzQ2OSwzNDkxLDM0OTksMzUxMSwzNTE3LDM1MjcsMzUyOSwzNTMzLDM1MzksMzU0MX0sCiAgICB7MCwzNTQ3LDM1NTcsMzU1OSwzNTcxLDM1ODEsMzU4MywzNTkzLDM2MDcsMzYxMywzNjE3LDM2MjMsMzYzMSwzNjM3LDM2NDMsMzY1OSwzNjcxfSwKfTsKCmxsIE11bChsbCB4LCBsbCB5KXsKICAgIHJldHVybiB4ICogeSAlIG1vZDsKfQoKbGwgQWRkKGxsIHgsIGxsIHkpewogICAgeCArPSB5OwogICAgaWYoeCA+PSBtb2QpIHggLT0gbW9kOwogICAgcmV0dXJuIHg7Cn0KCmxsIGh4W05fYm94ZXNdLCBoeVtOX2JveGVzXTsKcGlpIGdvYWwsIFN0OwppbnQgQ3VyID0gMDsKdmVjdG9yPHBpaT4gR3ZCOwppbnQgbiwgbTsKc3RyaW5nIGFbTl07CnVub3JkZXJlZF9tYXA8bGwsbGw+IG1wOwppbnQgVGltZTsKCmNvbnN0IGludCBuaWdhY28xID0gMSwgbmlnYWNvMiA9IDE7IC8vIGhlIHNvCmludCBuaWdhMSBbMTddIFsxN10sIG5pZ2EyIFsxN10gWzE3XSwgbmlnYXRtcCBbMTddIFsxN107CnBpaSBuaWdhZGogW10gPSB7ezAsIDF9LCB7MSwgMH0sIHswLCAtMX0sIHstMSwgMH19OwpxdWV1ZSA8cGlpPiBuaWdhcTsKY29uc3QgaW50IG5pZ2FsaW0gPSAxZTk7CnZvaWQgbmlnYWZzIChwaWkgeCwgaW50IHR5cGUpIHsKICAgIG1lbXNldCAobmlnYXRtcCwgMHgzZiwgc2l6ZW9mIG5pZ2F0bXApOwogICAgbmlnYXRtcCBbeC4gZmldIFt4LiBzZV0gPSAwOwogICAgbmlnYXEuIHB1c2ggKHgpOwogICAgd2hpbGUgKCFuaWdhcS4gZW1wdHkgKCkpIHsKICAgICAgICBwaWkgbmlnYWJydWggPSBuaWdhcS4gZnJvbnQgKCk7CiAgICAgICAgbmlnYXEuIHBvcCAoKTsKICAgICAgICBmb3IgKHBpaSBuaWdhaSA6IG5pZ2FkaikgewogICAgICAgICAgICBwaWkgbmlnYW5lID0ge25pZ2FicnVoLiBmaSArIG5pZ2FpLiBmaSwgbmlnYWJydWguIHNlICsgbmlnYWkuIHNlfTsKICAgICAgICAgICAgaWYgKG5pZ2FuZS4gZmkgPD0gMCB8fCBuaWdhbmUuIGZpID4gMTYgfHwgbmlnYW5lLiBzZSA8PSAwIHx8IG5pZ2FuZS4gc2UgPiAxNiB8fCBhIFtuaWdhbmUuIGZpXSBbbmlnYW5lLiBzZV0gPT0gJyMnKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKG5pZ2F0bXAgW25pZ2FuZS4gZmldIFtuaWdhbmUuIHNlXSA+IG5pZ2F0bXAgW25pZ2FicnVoLiBmaV0gW25pZ2FicnVoLiBzZV0gKyAxKSB7CiAgICAgICAgICAgICAgICBuaWdhdG1wIFtuaWdhbmUuIGZpXSBbbmlnYW5lLiBzZV0gPiBuaWdhdG1wIFtuaWdhYnJ1aC4gZmldIFtuaWdhYnJ1aC4gc2VdICsgMTsKICAgICAgICAgICAgICAgIG5pZ2FxLiBwdXNoIChuaWdhbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSArKykgZm9yIChpbnQgaiA9IDA7IGogPCAxNjsgaiArKykgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMSA6CiAgICAgICAgICAgIG5pZ2ExIFtpXSBbal0gKz0gbmlnYXRtcCBbaV0gW2pdOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDIgOgogICAgICAgICAgICBuaWdhMiBbaV0gW2pdICs9IG5pZ2F0bXAgW2ldIFtqXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CgpzdHJ1Y3QgU3RhdGV7CiAgICBwaWkgcGxheWVyOwogICAgdmVjdG9yPHBpaT4gYm94ZXM7CgovLyAgICBpbnQgY29zdDsKICAgIGxsIGNvc3RfaGV1OwogICAgaW50IGN1cjsKCiAgICBzdHJpbmcgcGF0aDsKCiAgICBTdGF0ZShwaWkgX3BsYXllciwgdmVjdG9yPHBpaT4gX2JveGVzLCBpbnQgX2N1ciwgc3RyaW5nIF9wYXRoID0gIiIpCiAgICAgICAgOiBwbGF5ZXIoX3BsYXllciksIGJveGVzKF9ib3hlcyksIGN1cihfY3VyKSwgcGF0aChfcGF0aCkgewogICAgICAgIGNvc3RfaGV1ID0gY29zdF9IKCk7CiAgICB9CgogICAgbGwgSGFzaCgpIGNvbnN0IHsKICAgICAgICBsbCByZXMgPSAxOwogICAgICAgIGZvcihwaWkgaSA6IGJveGVzKSByZXMgPSBNdWwocmVzLGhbaS5maV1baS5zZV0pOwogICAgICAgIHJlcyA9IE11bChyZXMsaDFbcGxheWVyLmZpXVtwbGF5ZXIuc2VdKTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQogICAgbGwgY29zdF9IKCkgY29uc3R7CiAgICAgICAgbGwgcmVzID0gMDsKICAgICAgICBpbnQgcmVzMSA9IGluZjsKICAgICAgICBpbnQgcmVzMiA9IGluZjsKICAgICAgICBmb3IocGlpIGkgOiBib3hlcyl7CiAgICAgICAgICAgIGlmKGFbaS5maV1baS5zZV0gIT0gR29hbCl7CiAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBhYnMoaS5maSAtIGdvYWwuZmkpICsgYWJzKGkuc2UgLSBnb2FsLnNlKTsKICAgICAgICAgICAgICAgIHJlczEgPSBtaW4ocmVzMSxhYnMoaS5maSAtIHBsYXllci5maSkgKyBhYnMoaS5zZSAtIHBsYXllci5zZSkpOwogICAgICAgICAgICAgICAgcmVzMiA9IG1pbihyZXMyLGFicyhpLmZpIC0gZ29hbC5maSkgKyBhYnMoaS5zZSAtIGdvYWwuc2UpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL3JldHVybiByZXM7CiAgICAgICAgcmV0dXJuIFggKiByZXMgKyBYWCAqIChyZXMxID09IGluZiA/IDAgOiByZXMxKSArIFhYWCAqIChyZXMyID09IGluZiA/IDAgOiByZXMyKTsKICAgIH0KCiAgICBsbCByZWFsX2Nvc3QoKSBjb25zdHsKICAgICAgICByZXR1cm4gWDIgKiBjb3N0X2hldSAtIFgxICogY3VyOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgU3RhdGUmb3RoZXIpIGNvbnN0ewogICAgICAgIHJldHVybiByZWFsX2Nvc3QoKSA+IG90aGVyLnJlYWxfY29zdCgpOwogICAgfQoKfTsKCgpib29sIGNoa19pbihpbnQgeCwgaW50IHkpewogICAgcmV0dXJuICgxIDw9IHggJiYgeCA8PSBuICYmIDEgPD0geSAmJiB5IDw9IG0pOwp9Cgp2b2lkIG91dChTdGF0ZSB4KXsKICAgIGNvdXQgPDwgIlBsYXllciBhdCA6IiA8PCB4LnBsYXllci5maSA8PCAnICcgPDwgeC5wbGF5ZXIuc2UgPDwgIlxuIjsKICAgIGNvdXQgPDwgIkNvc3QgOiIgPDwgJyAnIDw8IHguY29zdF9oZXUgPDwgJyAnIDw8IHguY3VyIDw8ICJcbiI7CiAgICBjb3V0IDw8ICJCb3hlczpcbiI7CiAgICBpbnQgZGVtID0gMDsKICAgIGZvcihwaWkgaSA6IHguYm94ZXMpIHsKICAgICAgICBkZW0rKzsKICAgICAgICBjb3V0IDw8ICJCb3hlcyAiIDw8ZGVtIDw8IjoiIDw8aS5maSA8PCAnICcgPDwgaS5zZSA8PCAiXG4iOwogICAgfQogICAgY291dCA8PCAiSGFzaDoiIDw8IHguSGFzaCgpOwogICAgY291dCA8PCAiXG4iOwp9Cgp2b2lkIHNvbCgpewogICAgY2luID4+IFRpbWU7CiAgICBuID0gMTU7IG0gPSAxNTsKCgogICAgZm9yKGludCBpID0gMCA7IGkgPD0gbSA7ICsraSkKICAgICAgICBhWzBdW2ldID0gYVtuICsgMV1baV0gPSAnIyc7CgogICAgZm9yKGludCBpID0gMSA7IGkgPD0gbiA7ICsraSl7CiAgICAgICAgY2luID4+IGFbaV07CiAgICAgICAgYVtpXSA9ICcjJyArIGFbaV0gKyAnIyc7CiAgICAgICAgZm9yKGludCBqID0gMSA7IGogPD0gbSA7ICsrail7CiAgICAgICAgICAgIGlmKGFbaV1bal0gPT0gQm94KSB7R3ZCLnB1c2hfYmFjayh7aSxqfSk7Q3VyKys7fQogICAgICAgICAgICBpZihhW2ldW2pdID09IEdvYWwpIGdvYWwgPSB7aSxqfTsKICAgICAgICAgICAgaWYoYVtpXVtqXSA9PSBZb3UpIFN0ID0ge2ksan07CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoYXV0byBpIDogR3ZCKSB7CiAgICAgICAgbmlnYWZzIChpLCAxKTsKICAgIH0KICAgIG5pZ2FmcyAoZ29hbCwgMik7CgoKCgoKCgoKCgoKICAgIGludCBhbnMgPSAwOwoKICAgIGNvdXQgPDwgQ3VyIDw8ICIhXG4iOwogICAgU3RhdGUgb3JnaW4gPSBTdGF0ZShTdCxHdkIsMCwiIik7CiAgICB2ZWN0b3I8U3RhdGU+IGJlYW17b3JnaW59OwogICAgbXBbb3JnaW4uSGFzaCgpXSA9IG9yZ2luLnJlYWxfY29zdCgpOwogICAgbGwgbW4gPSBvcmdpbi5yZWFsX2Nvc3QoKTsKICAgIGZvcihpbnQgc3RlcCA9IDA7IHN0ZXAgPCBUaW1lICYmICFiZWFtLmVtcHR5KCk7ICsrc3RlcCl7CiAgICAgICAgdmVjdG9yPFN0YXRlPiBueHRfYmVhbTsKICAgICAgICBueHRfYmVhbS5yZXNlcnZlKGJlYW0uc2l6ZSgpICogNCk7Ci8vLy8KICAgICAgICBmb3IoYXV0byAmdCA6IGJlYW0pewogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLHQuY3VyKTsKICAgICAgICAgICAgaWYoYW5zID09IEN1cikgYnJlYWs7CiAgICAgICAgICAgIGlmKHQucmVhbF9jb3N0KCkgIT0gbXBbdC5IYXNoKCldKSBjb250aW51ZTsKICAgICAgICAgICAgbW4gPSBtaW4obW4sdC5yZWFsX2Nvc3QoKSk7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDAgOyBqIDwgNCA7ICsrail7CgogICAgICAgICAgICAgICAgaW50IF94ID0gdC5wbGF5ZXIuZmkgKyBkeFtqXTsKICAgICAgICAgICAgICAgIGludCBfeSA9IHQucGxheWVyLnNlICsgZHlbal07CiAgICAgICAgICAgICAgICBpZighY2hrX2luKF94LF95KSkgY29udGludWU7CiAgICAgICAgICAgICAgICBpbnQgX3gxID0gX3ggKyBkeFtqXTsKICAgICAgICAgICAgICAgIGludCBfeTEgPSBfeSArIGR5W2pdOwoKICAgICAgICAgICAgICAgIGludCBwb3MgPSAtMTsKICAgICAgICAgICAgICAgIGludCBwb3MxID0gLTE7CiAgICAgICAgICAgICAgICBmb3IoaW50IF9qID0gMCA7IF9qIDwgKGludCl0LmJveGVzLnNpemUoKSA7ICsrX2opewogICAgICAgICAgICAgICAgICAgIGlmKGFbX3hdW195XSAhPSBHb2FsKXsKICAgICAgICAgICAgICAgICAgICBpZihfeCA9PSB0LmJveGVzW19qXS5maSAmJiBfeSA9PSB0LmJveGVzW19qXS5zZSkgcG9zID0gX2o7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmKGFbX3gxXVtfeTFdICE9IEdvYWwpewogICAgICAgICAgICAgICAgICAgIGlmKF94MSA9PSB0LmJveGVzW19qXS5maSAmJiBfeTEgPT0gdC5ib3hlc1tfal0uc2UpIHBvczEgPSBfajsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYocG9zICE9IC0xICYmIHBvczEgIT0gLTEpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWYocG9zICE9IC0xICYmIGFbX3gxXVtfeTFdID09ICcjJykgY29udGludWU7CiAgICAgICAgICAgICAgICBTdGF0ZSBfbmV3ID0gdDsKICAgICAgICAgICAgICAgIF9uZXcucGxheWVyID0ge194LF95fTsKICAgICAgICAgICAgICAgIGlmKHBvcyAhPSAtMSkge19uZXcuYm94ZXNbcG9zXSA9IHtfeDEsX3kxfTsKICAgICAgICAgICAgICAgIGlmKGFbX3gxXVtfeTFdID09IEdvYWwpIF9uZXcuY3VyICs9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfbmV3LmNvc3RfaGV1ID0gX25ldy5jb3N0X0goKTsKICAgICAgICAgICAgICAgIGxsIGh2YWwgPSBfbmV3Lkhhc2goKTsKICAgICAgICAgICAgICAgIGlmKF9uZXcuY29zdF9oZXUgPj0gbW4gKyBDQU5UKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlmKG1wLmNvdW50KGh2YWwpICYmIG1wW2h2YWxdIDw9IF9uZXcucmVhbF9jb3N0KCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtcFtodmFsXSA9IF9uZXcucmVhbF9jb3N0KCk7CiAgICAgICAgICAgICAgICBueHRfYmVhbS5wdXNoX2JhY2soX25ldyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoYW5zID09IEN1cikgYnJlYWs7CiAgICAgICAgc29ydChueHRfYmVhbS5iZWdpbigpLG54dF9iZWFtLmVuZCgpKTsKICAgICAgICB3aGlsZSgoaW50KW54dF9iZWFtLnNpemUoKSA+IEJFQU1fV0lEVEgpIG54dF9iZWFtLnBvcF9iYWNrKCk7CiAgICAgICAgYmVhbS5zd2FwKG54dF9iZWFtKTsKICAgIH0KICAgIGNvdXQgPDwgYW5zIDw8ICJcbiI7Cn0KCmludCBtYWluKCl7Ci8vICAgIGZyZW9wZW4gKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKLy8gICAgZnJlb3BlbiAoIm91dHB1dC50eHQiLCAidyIsIHN0ZG91dCk7CiAgICBpbnQgdGM7CiAgICB0YyA9IDE7CiAgICB3aGlsZSh0Yy0tKSBzb2woKTsKCiAgICByZXR1cm4gMDsKfQoK