/*
* @Author: hungeazy
* @Date: 2025-04-11 18:09:51
* @Last Modified by: hungeazy
* @Last Modified time: 2025-04-11 18:53:43
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
using namespace __gnu_pbds;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
// #define int long long
#define ll long long
#define ull unsigned long long
#define sz(x) x.size()
#define sqr(x) (1LL * (x) * (x))
#define all(x) x.begin(), x.end()
#define fill(f,x) memset(f,x,sizeof(f))
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define debug(x) cout << #x << " = " << x << '\n'
#define ii pair<int,int>
#define iii pair<int,ii>
#define di pair<ii,ii>
#define vi vector<int>
#define vii vector<ii>
#define mii map<int,int>
#define fi first
#define se second
#define pb push_back
#define MOD 1000000007
#define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define MASK(i) (1LL << (i))
#define c_bit(i) __builtin_popcountll(i)
#define BIT(x,i) ((x) & MASK(i))
#define SET_ON(x,i) ((x) | MASK(i))
#define SET_OFF(x,i) ((x) & ~MASK(i))
#define oo 1e18
#define name ""
#define endl '\n'
#define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms.";
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
const int N = (int)5e5+10;
int q;
struct Query {
char type;
int u;
} query[N];
namespace hungeazy {
int n = 1,sz[N],par[N],h[N];
int head[N],id[N],pos[N],arr[N],cur=1,curPos=1;
vi g[N];
bool check[N];
void DFS(int u)
{
sz[u] = 1;
for (int v : g[u])
{
h[v] = h[u]+1;
par[v] = u;
DFS(v);
sz[u] += sz[v];
}
}
void HLD(int u)
{
if (!head[cur]) head[cur] = u;
id[u] = cur;
pos[u] = curPos;
arr[curPos++] = u;
int nxt = 0;
for (int v : g[u])
if (sz[v] > sz[nxt]) nxt = v;
if (nxt) HLD(nxt);
for (int v : g[u])
if (v != nxt) cur++, HLD(v);
}
int LCA(int x, int y)
{
while (id[x] != id[y])
{
if (id[x] < id[y]) y = par[head[id[y]]];
else x = par[head[id[x]]];
}
if (h[x] > h[y]) swap(x,y);
return x;
}
struct SegmentTreeSum {
int st[N<<2],lazy[N<<2];
void down(int id, int l, int r)
{
if (!lazy[id]) return;
int mid = (l+r)>>1, &k = lazy[id];
st[id<<1] += (mid-l+1)*k;
st[id<<1|1] += (r-mid)*k;
lazy[id<<1] += k;
lazy[id<<1|1] += k;
k = 0;
}
void update(int id, int l, int r, int u, int v, int val)
{
if (l > v or r < u) return;
if (l >= u and r <= v)
{
st[id] += (r-l+1)*val;
lazy[id] += val;
return;
}
int mid = (l+r)>>1; down(id,l,r);
update(id<<1,l,mid,u,v,val);
update(id<<1|1,mid+1,r,u,v,val);
st[id] = st[id<<1]+st[id<<1|1];
}
int get(int id, int l, int r, int u, int v)
{
if (l > v or r < u) return 0;
if (l >= u and r <= v) return st[id];
int mid = (l+r)>>1; down(id,l,r);
return get(id<<1,l,mid,u,v)+get(id<<1|1,mid+1,r,u,v);
}
} IT_Sum;
struct SegmentTreeCut {
int st[N<<2],lazy[N<<2];
void down(int id)
{
if (!lazy[id]) return;
int &k = lazy[id];
st[id<<1] = st[id<<1|1] = k;
lazy[id<<1] = lazy[id<<1|1] = k;
k = 0;
}
void update(int id, int l, int r, int u, int v, int val)
{
if (l > v or r < u) return;
if (l >= u and r <= v)
{
st[id] = val;
lazy[id] = val;
return;
}
int mid = (l+r)>>1; down(id);
update(id<<1,l,mid,u,v,val);
update(id<<1|1,mid+1,r,u,v,val);
st[id] = max(st[id<<1],st[id<<1|1]);
}
int find(int id, int l, int r, int u, int v)
{
if (l > v or r < u or st[id] <= 0) return -1;
if (l == r) return l;
int mid = (l+r)>>1; down(id);
int x = find(id<<1|1,mid+1,r,u,v);
if (x == -1) return find(id<<1,l,mid,u,v);
return x;
}
} IT_Cut;
void updatePath(int u)
{
bool ok = true;
while (id[u] != id[1])
{
int far = IT_Cut.find(1,1,n,pos[head[id[u]]],pos[u]);
if (far != -1)
{
ok = false;
IT_Sum.update(1,1,n,far,pos[u],1);
break;
}
IT_Sum.update(1,1,n,pos[head[id[u]]],pos[u],1);
u = par[head[id[u]]];
}
if (ok and pos[u] >= pos[1])
{
int far = IT_Cut.find(1,1,n,pos[1],pos[u]);
IT_Sum.update(1,1,n,far,pos[u],1);
}
}
void cutEdge(int u)
{
int val = IT_Sum.get(1,1,n,pos[u],pos[u]);
int v = par[u];
if (!v) return;
bool ok = true;
while (id[v] != id[1])
{
int far = IT_Cut.find(1,1,n,pos[head[id[v]]],pos[v]);
if (far != -1)
{
ok = false;
IT_Sum.update(1,1,n,far,pos[v],-val);
break;
}
IT_Sum.update(1,1,n,pos[head[id[v]]],pos[v],-val);
v = par[head[id[v]]];
}
if (ok and pos[v] >= pos[1])
{
int far = IT_Cut.find(1,1,n,pos[1],pos[v]);
IT_Sum.update(1,1,n,far,pos[v],-val);
}
IT_Cut.update(1,1,n,pos[u],pos[u],1);
}
void solve(void)
{
FOR(i,1,q)
if (query[i].type == 'A')
g[query[i].u].pb(++n);
DFS(1);
HLD(1);
IT_Sum.update(1,1,n,pos[1],pos[1],1);
int node = 1;
FOR(i,1,q)
{
char type = query[i].type;
int u = query[i].u;
if (type == 'A')
{
updatePath(node+1);
node++;
}
else if (type == 'C')
{
if (check[u]) continue;
check[u] = true;
cutEdge(u);
}
else cout << IT_Sum.get(1,1,n,pos[u],pos[u]) << endl;
}
}
}
signed main()
{
fast;
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> q;
FOR(i,1,q) cin >> query[i].type >> query[i].u;
hungeazy::solve();
time();
return 0;
}
// ██░ ██ █ ██ ███▄ █ ▄████
//▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
//▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
//░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
//░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
// ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
// ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
// ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
// ░ ░ ░ ░ ░ ░
LyoKKiBAQXV0aG9yOiBodW5nZWF6eQoqIEBEYXRlOiAgIDIwMjUtMDQtMTEgMTg6MDk6NTEKKiBATGFzdCBNb2RpZmllZCBieTogICBodW5nZWF6eQoqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjUtMDQtMTEgMTg6NTM6NDMKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4gCiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPiAKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikgIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikgIAovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIscG9wY250LGx6Y250IikgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsgCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7Ci8vICNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgc3ooeCkgeC5zaXplKCkKI2RlZmluZSBzcXIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgZmlsbChmLHgpIG1lbXNldChmLHgsc2l6ZW9mKGYpKQojZGVmaW5lIEZPUihpLGwscikgZm9yKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IoaW50IGk9cjtpPj1sO2ktLSkKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBpaWkgcGFpcjxpbnQsaWk+CiNkZWZpbmUgZGkgcGFpcjxpaSxpaT4KI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8aWk+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBfX2xjbShhLGIpICgxbGwgKiAoKGEpIC8gX19nY2QoKGEpLCAoYikpKSAqIChiKSkKI2RlZmluZSBZRVMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgTk8gY291dCA8PCAiTk9cbiIKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIGNfYml0KGkpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKGkpCiNkZWZpbmUgQklUKHgsaSkgKCh4KSAmIE1BU0soaSkpCiNkZWZpbmUgU0VUX09OKHgsaSkgKCh4KSB8IE1BU0soaSkpCiNkZWZpbmUgU0VUX09GRih4LGkpICgoeCkgJiB+TUFTSyhpKSkKI2RlZmluZSBvbyAxZTE4CiNkZWZpbmUgbmFtZSAiIgojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIHRpbWUoKSBjZXJyIDw8IGVuZGwgPDwgIi0tLS0tLS0tLS0tLS1UaW1lOiIgPDwgMTAwMC4wICogY2xvY2soKSAvIENMT0NLU19QRVJfU0VDIDw8ICJtcy4iOwp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIG1heGltaXplKFQgJnJlcywgY29uc3QgVCAmdmFsKSB7IGlmIChyZXMgPCB2YWwpeyByZXMgPSB2YWw7IHJldHVybiB0cnVlOyB9OyByZXR1cm4gZmFsc2U7IH0KdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBtaW5pbWl6ZShUICZyZXMsIGNvbnN0IFQgJnZhbCkgeyBpZiAocmVzID4gdmFsKXsgcmVzID0gdmFsOyByZXR1cm4gdHJ1ZTsgfTsgcmV0dXJuIGZhbHNlOyB9CnRlbXBsYXRlIDxjbGFzcyBUPiB1c2luZyBvcmRlcmVkX3NldCA9IHRyZWUgPFQsIG51bGxfdHlwZSwgbGVzc19lcXVhbCA8VD4sIHJiX3RyZWVfdGFnLHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CmNvbnN0IGludCBOID0gKGludCk1ZTUrMTA7CmludCBxOwoKc3RydWN0IFF1ZXJ5IHsKCWNoYXIgdHlwZTsKCWludCB1Owp9IHF1ZXJ5W05dOwoKbmFtZXNwYWNlIGh1bmdlYXp5IHsKCglpbnQgbiA9IDEsc3pbTl0scGFyW05dLGhbTl07CglpbnQgaGVhZFtOXSxpZFtOXSxwb3NbTl0sYXJyW05dLGN1cj0xLGN1clBvcz0xOwoJdmkgZ1tOXTsKCWJvb2wgY2hlY2tbTl07CgoJdm9pZCBERlMoaW50IHUpCgl7CgkJc3pbdV0gPSAxOwoJCWZvciAoaW50IHYgOiBnW3VdKQoJCXsKCQkJaFt2XSA9IGhbdV0rMTsKCQkJcGFyW3ZdID0gdTsKCQkJREZTKHYpOwoJCQlzelt1XSArPSBzelt2XTsKCQl9Cgl9CgoJdm9pZCBITEQoaW50IHUpCgl7CgkJaWYgKCFoZWFkW2N1cl0pIGhlYWRbY3VyXSA9IHU7CgkJaWRbdV0gPSBjdXI7CgkJcG9zW3VdID0gY3VyUG9zOwoJCWFycltjdXJQb3MrK10gPSB1OwoJCWludCBueHQgPSAwOwoJCWZvciAoaW50IHYgOiBnW3VdKQoJCQlpZiAoc3pbdl0gPiBzeltueHRdKSBueHQgPSB2OwoJCWlmIChueHQpIEhMRChueHQpOwoJCWZvciAoaW50IHYgOiBnW3VdKQoJCQlpZiAodiAhPSBueHQpIGN1cisrLCBITEQodik7Cgl9CgoJaW50IExDQShpbnQgeCwgaW50IHkpCgl7CgkJd2hpbGUgKGlkW3hdICE9IGlkW3ldKQoJCXsKCQkJaWYgKGlkW3hdIDwgaWRbeV0pIHkgPSBwYXJbaGVhZFtpZFt5XV1dOwoJCQllbHNlIHggPSBwYXJbaGVhZFtpZFt4XV1dOwoJCX0KCQlpZiAoaFt4XSA+IGhbeV0pIHN3YXAoeCx5KTsKCQlyZXR1cm4geDsKCX0KCglzdHJ1Y3QgU2VnbWVudFRyZWVTdW0gewoJCWludCBzdFtOPDwyXSxsYXp5W048PDJdOwoKCQl2b2lkIGRvd24oaW50IGlkLCBpbnQgbCwgaW50IHIpCgkJewoJCQlpZiAoIWxhenlbaWRdKSByZXR1cm47CgkJCWludCBtaWQgPSAobCtyKT4+MSwgJmsgPSBsYXp5W2lkXTsKCQkJc3RbaWQ8PDFdICs9IChtaWQtbCsxKSprOwoJCQlzdFtpZDw8MXwxXSArPSAoci1taWQpKms7CgkJCWxhenlbaWQ8PDFdICs9IGs7CgkJCWxhenlbaWQ8PDF8MV0gKz0gazsKCQkJayA9IDA7CgkJfQoKCQl2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgdmFsKQoJCXsKCQkJaWYgKGwgPiB2IG9yIHIgPCB1KSByZXR1cm47CgkJCWlmIChsID49IHUgYW5kIHIgPD0gdikgCgkJCXsKCQkJCXN0W2lkXSArPSAoci1sKzEpKnZhbDsKCQkJCWxhenlbaWRdICs9IHZhbDsKCQkJCXJldHVybjsKCQkJfQoJCQlpbnQgbWlkID0gKGwrcik+PjE7IGRvd24oaWQsbCxyKTsKCQkJdXBkYXRlKGlkPDwxLGwsbWlkLHUsdix2YWwpOwoJCQl1cGRhdGUoaWQ8PDF8MSxtaWQrMSxyLHUsdix2YWwpOwoJCQlzdFtpZF0gPSBzdFtpZDw8MV0rc3RbaWQ8PDF8MV07CgkJfQoKCQlpbnQgZ2V0KGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpCgkJewoJCQlpZiAobCA+IHYgb3IgciA8IHUpIHJldHVybiAwOwoJCQlpZiAobCA+PSB1IGFuZCByIDw9IHYpIHJldHVybiBzdFtpZF07CgkJCWludCBtaWQgPSAobCtyKT4+MTsgZG93bihpZCxsLHIpOwoJCQlyZXR1cm4gZ2V0KGlkPDwxLGwsbWlkLHUsdikrZ2V0KGlkPDwxfDEsbWlkKzEscix1LHYpOwoJCX0KCX0gSVRfU3VtOwoKCXN0cnVjdCBTZWdtZW50VHJlZUN1dCB7CgkJaW50IHN0W048PDJdLGxhenlbTjw8Ml07CgoJCXZvaWQgZG93bihpbnQgaWQpCgkJewoJCQlpZiAoIWxhenlbaWRdKSByZXR1cm47CgkJCWludCAmayA9IGxhenlbaWRdOwoJCQlzdFtpZDw8MV0gPSBzdFtpZDw8MXwxXSA9IGs7CgkJCWxhenlbaWQ8PDFdID0gbGF6eVtpZDw8MXwxXSA9IGs7CgkJCWsgPSAwOwoJCX0KCgkJdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHZhbCkKCQl7CgkJCWlmIChsID4gdiBvciByIDwgdSkgcmV0dXJuOwoJCQlpZiAobCA+PSB1IGFuZCByIDw9IHYpIAoJCQl7CgkJCQlzdFtpZF0gPSB2YWw7CgkJCQlsYXp5W2lkXSA9IHZhbDsKCQkJCXJldHVybjsKCQkJfQoJCQlpbnQgbWlkID0gKGwrcik+PjE7IGRvd24oaWQpOwoJCQl1cGRhdGUoaWQ8PDEsbCxtaWQsdSx2LHZhbCk7CgkJCXVwZGF0ZShpZDw8MXwxLG1pZCsxLHIsdSx2LHZhbCk7CgkJCXN0W2lkXSA9IG1heChzdFtpZDw8MV0sc3RbaWQ8PDF8MV0pOwoJCX0KCgkJaW50IGZpbmQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikKCQl7CgkJCWlmIChsID4gdiBvciByIDwgdSBvciBzdFtpZF0gPD0gMCkgcmV0dXJuIC0xOwoJCQlpZiAobCA9PSByKSByZXR1cm4gbDsKCQkJaW50IG1pZCA9IChsK3IpPj4xOyBkb3duKGlkKTsKCQkJaW50IHggPSBmaW5kKGlkPDwxfDEsbWlkKzEscix1LHYpOwoJCQlpZiAoeCA9PSAtMSkgcmV0dXJuIGZpbmQoaWQ8PDEsbCxtaWQsdSx2KTsKCQkJcmV0dXJuIHg7CgkJfQoJfSBJVF9DdXQ7CgoJdm9pZCB1cGRhdGVQYXRoKGludCB1KQoJewoJCWJvb2wgb2sgPSB0cnVlOwoJCXdoaWxlIChpZFt1XSAhPSBpZFsxXSkKCQl7CgkJCWludCBmYXIgPSBJVF9DdXQuZmluZCgxLDEsbixwb3NbaGVhZFtpZFt1XV1dLHBvc1t1XSk7CgkJCWlmIChmYXIgIT0gLTEpCgkJCXsKCQkJCW9rID0gZmFsc2U7CgkJCQlJVF9TdW0udXBkYXRlKDEsMSxuLGZhcixwb3NbdV0sMSk7CgkJCQlicmVhazsKCQkJfQoJCQlJVF9TdW0udXBkYXRlKDEsMSxuLHBvc1toZWFkW2lkW3VdXV0scG9zW3VdLDEpOwoJCQl1ID0gcGFyW2hlYWRbaWRbdV1dXTsKCQl9CgkJaWYgKG9rIGFuZCBwb3NbdV0gPj0gcG9zWzFdKQoJCXsKCQkJaW50IGZhciA9IElUX0N1dC5maW5kKDEsMSxuLHBvc1sxXSxwb3NbdV0pOwoJCQlJVF9TdW0udXBkYXRlKDEsMSxuLGZhcixwb3NbdV0sMSk7CgkJfQoJfQoKCXZvaWQgY3V0RWRnZShpbnQgdSkKCXsKCQlpbnQgdmFsID0gSVRfU3VtLmdldCgxLDEsbixwb3NbdV0scG9zW3VdKTsKCQlpbnQgdiA9IHBhclt1XTsKCQlpZiAoIXYpIHJldHVybjsKCQlib29sIG9rID0gdHJ1ZTsKCQl3aGlsZSAoaWRbdl0gIT0gaWRbMV0pCgkJewoJCQlpbnQgZmFyID0gSVRfQ3V0LmZpbmQoMSwxLG4scG9zW2hlYWRbaWRbdl1dXSxwb3Nbdl0pOwoJCQlpZiAoZmFyICE9IC0xKQoJCQl7CgkJCQlvayA9IGZhbHNlOwoJCQkJSVRfU3VtLnVwZGF0ZSgxLDEsbixmYXIscG9zW3ZdLC12YWwpOwoJCQkJYnJlYWs7CgkJCX0KCQkJSVRfU3VtLnVwZGF0ZSgxLDEsbixwb3NbaGVhZFtpZFt2XV1dLHBvc1t2XSwtdmFsKTsKCQkJdiA9IHBhcltoZWFkW2lkW3ZdXV07CgkJfQoJCWlmIChvayBhbmQgcG9zW3ZdID49IHBvc1sxXSkKCQl7CgkJCWludCBmYXIgPSBJVF9DdXQuZmluZCgxLDEsbixwb3NbMV0scG9zW3ZdKTsKCQkJSVRfU3VtLnVwZGF0ZSgxLDEsbixmYXIscG9zW3ZdLC12YWwpOwoJCX0KCQlJVF9DdXQudXBkYXRlKDEsMSxuLHBvc1t1XSxwb3NbdV0sMSk7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCUZPUihpLDEscSkKCQkJaWYgKHF1ZXJ5W2ldLnR5cGUgPT0gJ0EnKQoJCQkJZ1txdWVyeVtpXS51XS5wYigrK24pOwoJCURGUygxKTsKCQlITEQoMSk7CgkJSVRfU3VtLnVwZGF0ZSgxLDEsbixwb3NbMV0scG9zWzFdLDEpOwoJCWludCBub2RlID0gMTsKCQlGT1IoaSwxLHEpCgkJewoJCQljaGFyIHR5cGUgPSBxdWVyeVtpXS50eXBlOwoJCQlpbnQgdSA9IHF1ZXJ5W2ldLnU7CgkJCWlmICh0eXBlID09ICdBJykKCQkJewoJCQkJdXBkYXRlUGF0aChub2RlKzEpOwoJCQkJbm9kZSsrOwoJCQl9CgkJCWVsc2UgaWYgKHR5cGUgPT0gJ0MnKQoJCQl7CgkJCQlpZiAoY2hlY2tbdV0pIGNvbnRpbnVlOwoJCQkJY2hlY2tbdV0gPSB0cnVlOwoJCQkJY3V0RWRnZSh1KTsKCQkJfQoJCQllbHNlIGNvdXQgPDwgSVRfU3VtLmdldCgxLDEsbixwb3NbdV0scG9zW3VdKSA8PCBlbmRsOwoJCX0KCX0KCQp9CgpzaWduZWQgbWFpbigpCnsKICAgIGZhc3Q7CiAgICBpZiAoZm9wZW4obmFtZSIuaW5wIiwiciIpKQogICAgewogICAgCWZyZW9wZW4obmFtZSIuaW5wIiwiciIsc3RkaW4pOwogICAgCWZyZW9wZW4obmFtZSIub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KICAgIGNpbiA+PiBxOwogICAgRk9SKGksMSxxKSBjaW4gPj4gcXVlcnlbaV0udHlwZSA+PiBxdWVyeVtpXS51OwogICAgaHVuZ2Vhenk6OnNvbHZlKCk7CiAgICB0aW1lKCk7CiAgICByZXR1cm4gMDsKfQovLyDilojilojilpEg4paI4paIICDiloggICAg4paI4paIICDilojilojilojiloQgICAg4paIICAg4paE4paI4paI4paI4paICi8v4paT4paI4paI4paRIOKWiOKWiOKWkiDilojiloggIOKWk+KWiOKWiOKWkiDilojilogg4paA4paIICAg4paIICDilojilojilpIg4paA4paI4paSCi8v4paS4paI4paI4paA4paA4paI4paI4paR4paT4paI4paIICDilpLilojilojilpHilpPilojiloggIOKWgOKWiCDilojilojilpLilpLilojilojilpHiloTiloTiloTilpEKLy/ilpHilpPilogg4paR4paI4paIIOKWk+KWk+KWiCAg4paR4paI4paI4paR4paT4paI4paI4paSICDilpDilozilojilojilpLilpHilpPiloggIOKWiOKWiOKWkwovL+KWkeKWk+KWiOKWkuKWkeKWiOKWiOKWk+KWkuKWkuKWiOKWiOKWiOKWiOKWiOKWkyDilpLilojilojilpEgICDilpPilojilojilpHilpHilpLilpPilojilojilojiloDilpIKLy8g4paSIOKWkeKWkeKWkuKWkeKWkuKWkeKWkuKWk+KWkiDilpIg4paSIOKWkSDilpLilpEgICDilpIg4paSICDilpHilpIgICDilpIKLy8g4paSIOKWkeKWkuKWkSDilpHilpHilpHilpLilpEg4paRIOKWkSDilpEg4paR4paRICAg4paRIOKWkuKWkSAg4paRICAg4paRCi8vIOKWkSAg4paR4paRIOKWkSDilpHilpHilpEg4paRIOKWkSAgICDilpEgICDilpEg4paRIOKWkSDilpEgICDilpEKLy8g4paRICDilpEgIOKWkSAgIOKWkSAgICAgICAgICAgICAg4paRICAgICAgIOKWkQ==