#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define ins insert
#define fi first
#define se second
#define INF 1000000000
#define NINF -1000000000
#define LOGN 22
typedef int ll;
const int N = int(1e5)+10;
vector<pair<int,int>> *graph;
bool isBlack[N],isSpecial[N];
int subset_sz[N],chain_group[N];
int data[N],chain_pos[N];
typedef struct {
int a;int b;int wt;
} edge;
edge *Edge;
typedef struct {
vector<int> a;int head;int parent=-1;
int len=0;} chain;
chain *Chain;
map<pair<int,int>,int> e2i;
////////////LEAST COMMON ANCESTOR O(LOG(N)) PER QUERY/////////////////////
int level[N];
int DP[LOGN][N];
void dfs0(int u){
subset_sz[u]=1;
int sidx=-1,swt=-1,sit=-1;
for(int it=0;it<graph[u].size();++it)
{int v=graph[u][it].fi;
if(v!=DP[0][u])
{
DP[0][v]=u;
level[v]=level[u]+1;
dfs0(v);
if(subset_sz[v]>swt){sidx=v;swt=subset_sz[v];sit=it;}
subset_sz[u]+=subset_sz[v];
}
}
if(sidx>-1){
isSpecial[sidx]=true;
data[u]=graph[u][sit].se;}
}
void preprocess(int n){
level[0]=0;
DP[0][0]=0;
dfs0(0);
for(int i=1;i<LOGN;i++)
for(int j=0;j<n;j++)
DP[i][j] = DP[i-1][DP[i-1][j]];
}
int lca(int a,int b){
if(level[a]>level[b])swap(a,b);
int d = level[b]-level[a];
for(int i=0;i<LOGN;i++)
if(d&(1<<i))
b=DP[i][b];
if(a==b)return a;
for(int i=LOGN-1;i>=0;i--)
if(DP[i][a]!=DP[i][b])
a=DP[i][a],b=DP[i][b];
return DP[0][a];
}
//////////////////////////////////////////////////////////////////////////
/////////////////HEAVY-LIGHT DECOMPOSITION////////////////////////////////
int max_chain_no=-1;
void hld(int u,int chain_no,int from){
Chain[chain_no].a.pb(u); ++Chain[chain_no].len;
if(Chain[chain_no].len==1) {
Chain[chain_no].parent=from;
Chain[chain_no].head=u; }
chain_group[u]=chain_no; chain_pos[u]=Chain[chain_no].len-1;
int sz=graph[u].size();
for(int i=0;i<graph[u].size();i++){
int v=graph[u][i].fi;
if(v!=from) {
if(isSpecial[v]){hld(v,chain_no,u);}
else {hld(v,++max_chain_no,u);}
}
}
}
////////////////////CHARACTERIZING OUR DECOMPOSED CHAINS//////////////////////
vector<vector<int>> seg_tree;
int join(int a,int b){return a>b?a:b;}
void build(){
for(int it=0;it<=max_chain_no;it++){
int n= Chain[it].len;
vector<int> tree(2*n);
for (int i=0; i<n; i++)
tree[n+i] = data[Chain[it].a[i]];
for (int i = n - 1; i > 0; --i)
tree[i] = join(tree[i<<1] ,tree[i<<1 | 1]);
seg_tree.pb(tree);
}
}
void updateTree(int idx, int val,int chain_no){
int n= Chain[chain_no].len;
seg_tree[chain_no][idx+n] = val; idx= idx+n;
for (int i=idx; i > 1; i >>= 1)
seg_tree[chain_no][i>>1] = join(seg_tree[chain_no][i],seg_tree[chain_no][i^1]);
}
int queryTree(int l, int r,int chain_no) {
int res = NINF;r++;
int n= Chain[chain_no].len;
for (l += n, r += n; l < r; l >>= 1, r >>= 1){
if (l&1) res = join(res,seg_tree[chain_no][l++]);
if (r&1) res = join(res,seg_tree[chain_no][--r]);
}
return res;
}
void update(int i,int wt){
int a= Edge[i].a, b= Edge[i].b;
if(DP[0][a]==b){swap(a,b);}
if(chain_group[a]==chain_group[b]){updateTree(a,wt,chain_group[a]);}
Edge[i].wt=wt;
}
int query(int a,int b){
int answer=NINF,answer2=NINF;
int c= lca(a,b);
int x=a,j,k;
//printf("[[%d]]",c);
while(x!=c){
if(chain_group[x]==chain_group[c]){
answer= max(answer,queryTree(chain_pos[c],chain_pos[DP[0][x]],chain_group[x])); break; }
else{
if(x!=Chain[chain_group[x]].head)answer= max(answer,queryTree(chain_pos[Chain[chain_group[x]].head],chain_pos[DP[0][x]],chain_group[x]));
}
k=Chain[chain_group[x]].head; x= Chain[chain_group[x]].parent; j=x;
if(j>k){swap(j,k);}
// printf("---%d,%d->%d---",j,k,Edge[e2i[mp(j,k)]].wt);
answer = max(answer,Edge[e2i[mp(j,k)]].wt);
}
x=b;
while(x!=c){
if(chain_group[x]==chain_group[c]){
answer2= max(answer2,queryTree(chain_pos[c],chain_pos[DP[0][x]],chain_group[x])); break; }
else{
if(x!=Chain[chain_group[x]].head)answer2= max(answer2,queryTree(chain_pos[Chain[chain_group[x]].head],chain_pos[DP[0][x]],chain_group[x]));
}
k=Chain[chain_group[x]].head; x= Chain[chain_group[x]].parent; j=x;
if(j>k){swap(j,k);}
//printf("+++%d,%d->%d+++",j,k,Edge[e2i[mp(j,k)]].wt);
answer2 = max(answer2,Edge[e2i[mp(j,k)]].wt);
}
//printf("[%d %d][%d %d]",a,answer,b,answer2);
return max(answer,answer2);
}
//////////////////////////////////////////////////////////////////////////////
int main() {
int t;cin>>t;
string pt;
while(getline(cin,pt) and t--){
int n;cin>>n; e2i.clear();
graph= new vector<pair<int,int>> [n];
Edge = new edge[n];
for(int i=0;i<n-1;i++)
{int u,v,w;cin>>u>>v>>w;u--;v--;
graph[u].pb(mp(v,w));graph[v].pb(mp(u,w));
Edge[i].a=u;Edge[i].b=v; Edge[i].wt= w;
if(u>v)swap(u,v); e2i[mp(u,v)]=i;}
for(int i=0;i<n;i++){isBlack[i]=false;isSpecial[i]=false;data[i]=NINF;}
max_chain_no=-1;
preprocess(n);
Chain = new chain[N];
hld(0,++max_chain_no,-1);
seg_tree.clear();
build();
string type;
while(true)
{
cin>>type;if(type=="DONE"){break;}
int q1,q2;cin>>q1>>q2;//scanf("%d%d",&q1,&q2);
if(type=="CHANGE"){update(q1-1,q2);}
else if(type=="QUERY"){printf("%d\n",query(q1-1,q2-1));}
else {break;}
}
/* printf("[[[%d]]]",max_chain_no);
puts("");
for(int i=0;i<=max_chain_no;i++)
{
printf("[%d]",Chain[i].len);for(int j=0;j<Chain[i].a.size();j++){
printf("{%d %d %d}",Chain[i].a[j]+1,data[Chain[i].a[j]],chain_group[Chain[i].a[j]]);
}puts("");
// printf("%d ",Chain[i].parent);
}
//printf("--[%d]--",queryTree(1,3,0));
*/
}
return 0;
}
/*
1
3
1 2 1
2 3 2
QUERY 1 2
CHANGE 1 3
QUERY 1 2
DONE
*/
/*
1
23
1 2 3
1 3 16
1 4 5
1 5 20
2 6 2
2 8 4
2 9 5
2 10 11
3 11 18
4 12 23
19 23 15
6 7 1
9 13 6
9 15 8
10 18 12
10 19 14
13 14 7
15 16 10
15 17 9
18 20 13
19 21 16
21 22 17
QUERY 22 3
QUERY 3 22
QUERY 22 11
QUERY 11 22
QUERY 22 4
QUERY 4 22
QUERY 22 12
QUERY 12 22
QUERY 14 23
QUERY 23 14
DONE
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyIAojZGVmaW5lIGlucyBpbnNlcnQKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIElORiAgIDEwMDAwMDAwMDAKI2RlZmluZSBOSU5GIC0xMDAwMDAwMDAwCiNkZWZpbmUgTE9HTiAyMgp0eXBlZGVmIGludCBsbDsKY29uc3QgaW50IE4gPSBpbnQoMWU1KSsxMDsKdmVjdG9yPHBhaXI8aW50LGludD4+ICpncmFwaDsKCmJvb2wgaXNCbGFja1tOXSxpc1NwZWNpYWxbTl07CmludCBzdWJzZXRfc3pbTl0sY2hhaW5fZ3JvdXBbTl07CmludCBkYXRhW05dLGNoYWluX3Bvc1tOXTsKCnR5cGVkZWYgc3RydWN0IHsKIGludCBhO2ludCBiO2ludCB3dDsKfSBlZGdlOwoKZWRnZSAqRWRnZTsKCnR5cGVkZWYgc3RydWN0IHsKIHZlY3RvcjxpbnQ+IGE7aW50IGhlYWQ7aW50IHBhcmVudD0tMTsKICBpbnQgbGVuPTA7fSBjaGFpbjsKCmNoYWluICpDaGFpbjsKCm1hcDxwYWlyPGludCxpbnQ+LGludD4gZTJpOwovLy8vLy8vLy8vLy9MRUFTVCBDT01NT04gQU5DRVNUT1IgTyhMT0coTikpIFBFUiBRVUVSWS8vLy8vLy8vLy8vLy8vLy8vLy8vLwppbnQgbGV2ZWxbTl07CmludCBEUFtMT0dOXVtOXTsKdm9pZCBkZnMwKGludCB1KXsKICAgIHN1YnNldF9zelt1XT0xOyAKICAgIGludCBzaWR4PS0xLHN3dD0tMSxzaXQ9LTE7Cglmb3IoaW50IGl0PTA7aXQ8Z3JhcGhbdV0uc2l6ZSgpOysraXQpCiAgICB7aW50IHY9Z3JhcGhbdV1baXRdLmZpOwoJCWlmKHYhPURQWzBdW3VdKQoJCXsKCQkJRFBbMF1bdl09dTsKCQkJbGV2ZWxbdl09bGV2ZWxbdV0rMTsKCQkJZGZzMCh2KTsKICAgICAgICAgICAgaWYoc3Vic2V0X3N6W3ZdPnN3dCl7c2lkeD12O3N3dD1zdWJzZXRfc3pbdl07c2l0PWl0O30KICAgICAgICAgICAgc3Vic2V0X3N6W3VdKz1zdWJzZXRfc3pbdl07CgkJfQogICAgfQogICAgaWYoc2lkeD4tMSl7CiAgICAgIGlzU3BlY2lhbFtzaWR4XT10cnVlOwogICAgICAgIGRhdGFbdV09Z3JhcGhbdV1bc2l0XS5zZTt9Cn0Kdm9pZCBwcmVwcm9jZXNzKGludCBuKXsKICAgIGxldmVsWzBdPTA7CglEUFswXVswXT0wOwoJZGZzMCgwKTsKCWZvcihpbnQgaT0xO2k8TE9HTjtpKyspCgkJZm9yKGludCBqPTA7ajxuO2orKykKCQkJRFBbaV1bal0gPSBEUFtpLTFdW0RQW2ktMV1bal1dOwp9CmludCBsY2EoaW50IGEsaW50IGIpewoJaWYobGV2ZWxbYV0+bGV2ZWxbYl0pc3dhcChhLGIpOwoJaW50IGQgPSBsZXZlbFtiXS1sZXZlbFthXTsKCWZvcihpbnQgaT0wO2k8TE9HTjtpKyspCgkJaWYoZCYoMTw8aSkpCgkJCWI9RFBbaV1bYl07CglpZihhPT1iKXJldHVybiBhOwoJZm9yKGludCBpPUxPR04tMTtpPj0wO2ktLSkKCQlpZihEUFtpXVthXSE9RFBbaV1bYl0pCgkJCWE9RFBbaV1bYV0sYj1EUFtpXVtiXTsKCXJldHVybiBEUFswXVthXTsKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKLy8vLy8vLy8vLy8vLy8vLy9IRUFWWS1MSUdIVCBERUNPTVBPU0lUSU9OLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KaW50IG1heF9jaGFpbl9ubz0tMTsKdm9pZCBobGQoaW50IHUsaW50IGNoYWluX25vLGludCBmcm9tKXsgICAKICAgIENoYWluW2NoYWluX25vXS5hLnBiKHUpOyArK0NoYWluW2NoYWluX25vXS5sZW47CiAgICBpZihDaGFpbltjaGFpbl9ub10ubGVuPT0xKSB7CiAgICAgQ2hhaW5bY2hhaW5fbm9dLnBhcmVudD1mcm9tOwogICAgIENoYWluW2NoYWluX25vXS5oZWFkPXU7ICAgfQogICAgIGNoYWluX2dyb3VwW3VdPWNoYWluX25vOyBjaGFpbl9wb3NbdV09Q2hhaW5bY2hhaW5fbm9dLmxlbi0xOwogICAgaW50IHN6PWdyYXBoW3VdLnNpemUoKTsKICAgIGZvcihpbnQgaT0wO2k8Z3JhcGhbdV0uc2l6ZSgpO2krKyl7CiAgICAgICAgaW50IHY9Z3JhcGhbdV1baV0uZmk7CiAgICAgICAgaWYodiE9ZnJvbSkgewogICAgICAgICAgaWYoaXNTcGVjaWFsW3ZdKXtobGQodixjaGFpbl9ubyx1KTt9CiAgICAgICAgICAgIGVsc2Uge2hsZCh2LCsrbWF4X2NoYWluX25vLHUpO30KICAgICAgICAgICB9CiAgICB9Cn0KLy8vLy8vLy8vLy8vLy8vLy8vLy9DSEFSQUNURVJJWklORyBPVVIgREVDT01QT1NFRCBDSEFJTlMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp2ZWN0b3I8dmVjdG9yPGludD4+IHNlZ190cmVlOwoKaW50IGpvaW4oaW50IGEsaW50IGIpe3JldHVybiBhPmI/YTpiO30Kdm9pZCBidWlsZCgpewogICAgZm9yKGludCBpdD0wO2l0PD1tYXhfY2hhaW5fbm87aXQrKyl7CiAgICAgaW50IG49IENoYWluW2l0XS5sZW47ICAgCiAgICAgdmVjdG9yPGludD4gdHJlZSgyKm4pOwogICAgICAgIAogICAgIGZvciAoaW50IGk9MDsgaTxuOyBpKyspICAgIAogICAgICAgIHRyZWVbbitpXSA9IGRhdGFbQ2hhaW5baXRdLmFbaV1dOwogICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+IDA7IC0taSkgICAgIAogICAgICAgIHRyZWVbaV0gPSBqb2luKHRyZWVbaTw8MV0gLHRyZWVbaTw8MSB8IDFdKTsKICAgICAgICAKICAgICBzZWdfdHJlZS5wYih0cmVlKTsKICAgIH0KfQp2b2lkIHVwZGF0ZVRyZWUoaW50IGlkeCwgaW50IHZhbCxpbnQgY2hhaW5fbm8pewogICAgaW50IG49IENoYWluW2NoYWluX25vXS5sZW47CiAgICBzZWdfdHJlZVtjaGFpbl9ub11baWR4K25dID0gdmFsOyAgaWR4PSBpZHgrbjsKICAgICAKICAgIGZvciAoaW50IGk9aWR4OyBpID4gMTsgaSA+Pj0gMSkKICAgIHNlZ190cmVlW2NoYWluX25vXVtpPj4xXSA9IGpvaW4oc2VnX3RyZWVbY2hhaW5fbm9dW2ldLHNlZ190cmVlW2NoYWluX25vXVtpXjFdKTsKfQppbnQgcXVlcnlUcmVlKGludCBsLCBpbnQgcixpbnQgY2hhaW5fbm8pIHsgCiAgICBpbnQgcmVzID0gTklORjtyKys7CiAgICBpbnQgbj0gQ2hhaW5bY2hhaW5fbm9dLmxlbjsKICAgIGZvciAobCArPSBuLCByICs9IG47IGwgPCByOyBsID4+PSAxLCByID4+PSAxKXsKICAgICAgICBpZiAobCYxKSByZXMgPSBqb2luKHJlcyxzZWdfdHJlZVtjaGFpbl9ub11bbCsrXSk7CiAgICAgICAgaWYgKHImMSkgcmVzID0gam9pbihyZXMsc2VnX3RyZWVbY2hhaW5fbm9dWy0tcl0pOwogICAgfQogICAgcmV0dXJuIHJlczsgCn0KCnZvaWQgdXBkYXRlKGludCBpLGludCB3dCl7CiBpbnQgYT0gRWRnZVtpXS5hLCBiPSBFZGdlW2ldLmI7CiBpZihEUFswXVthXT09Yil7c3dhcChhLGIpO30KIGlmKGNoYWluX2dyb3VwW2FdPT1jaGFpbl9ncm91cFtiXSl7dXBkYXRlVHJlZShhLHd0LGNoYWluX2dyb3VwW2FdKTt9CiBFZGdlW2ldLnd0PXd0Owp9CmludCBxdWVyeShpbnQgYSxpbnQgYil7CiAgICAKIGludCBhbnN3ZXI9TklORixhbnN3ZXIyPU5JTkY7CiBpbnQgYz0gbGNhKGEsYik7CiBpbnQgeD1hLGosazsKIC8vcHJpbnRmKCJbWyVkXV0iLGMpOwogd2hpbGUoeCE9Yyl7CiAgICAgCiAgaWYoY2hhaW5fZ3JvdXBbeF09PWNoYWluX2dyb3VwW2NdKXsKICAgICBhbnN3ZXI9IG1heChhbnN3ZXIscXVlcnlUcmVlKGNoYWluX3Bvc1tjXSxjaGFpbl9wb3NbRFBbMF1beF1dLGNoYWluX2dyb3VwW3hdKSk7ICBicmVhazsgfSAgIAogIGVsc2V7CiAgICAgaWYoeCE9Q2hhaW5bY2hhaW5fZ3JvdXBbeF1dLmhlYWQpYW5zd2VyPSBtYXgoYW5zd2VyLHF1ZXJ5VHJlZShjaGFpbl9wb3NbQ2hhaW5bY2hhaW5fZ3JvdXBbeF1dLmhlYWRdLGNoYWluX3Bvc1tEUFswXVt4XV0sY2hhaW5fZ3JvdXBbeF0pKTsgICAKICB9CiAgIGs9Q2hhaW5bY2hhaW5fZ3JvdXBbeF1dLmhlYWQ7IHg9IENoYWluW2NoYWluX2dyb3VwW3hdXS5wYXJlbnQ7IGo9eDsKICBpZihqPmspe3N3YXAoaixrKTt9CiAvLyBwcmludGYoIi0tLSVkLCVkLT4lZC0tLSIsaixrLEVkZ2VbZTJpW21wKGosayldXS53dCk7CiAgYW5zd2VyID0gbWF4KGFuc3dlcixFZGdlW2UyaVttcChqLGspXV0ud3QpOwogfQogICAgCiB4PWI7CiB3aGlsZSh4IT1jKXsKICAgICAKICBpZihjaGFpbl9ncm91cFt4XT09Y2hhaW5fZ3JvdXBbY10pewogICAgIGFuc3dlcjI9IG1heChhbnN3ZXIyLHF1ZXJ5VHJlZShjaGFpbl9wb3NbY10sY2hhaW5fcG9zW0RQWzBdW3hdXSxjaGFpbl9ncm91cFt4XSkpOyAgYnJlYWs7IH0gICAKICBlbHNlewogICAgIGlmKHghPUNoYWluW2NoYWluX2dyb3VwW3hdXS5oZWFkKWFuc3dlcjI9IG1heChhbnN3ZXIyLHF1ZXJ5VHJlZShjaGFpbl9wb3NbQ2hhaW5bY2hhaW5fZ3JvdXBbeF1dLmhlYWRdLGNoYWluX3Bvc1tEUFswXVt4XV0sY2hhaW5fZ3JvdXBbeF0pKTsgICAKICB9CiAgaz1DaGFpbltjaGFpbl9ncm91cFt4XV0uaGVhZDsgeD0gQ2hhaW5bY2hhaW5fZ3JvdXBbeF1dLnBhcmVudDsgaj14OwogIGlmKGo+ayl7c3dhcChqLGspO30KICAvL3ByaW50ZigiKysrJWQsJWQtPiVkKysrIixqLGssRWRnZVtlMmlbbXAoaixrKV1dLnd0KTsKIGFuc3dlcjIgPSBtYXgoYW5zd2VyMixFZGdlW2UyaVttcChqLGspXV0ud3QpOwogfQogLy9wcmludGYoIlslZCAlZF1bJWQgJWRdIixhLGFuc3dlcixiLGFuc3dlcjIpOwogcmV0dXJuIG1heChhbnN3ZXIsYW5zd2VyMik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKaW50IG1haW4oKSB7CiAgICBpbnQgdDtjaW4+PnQ7CiAgICBzdHJpbmcgcHQ7CiAgICB3aGlsZShnZXRsaW5lKGNpbixwdCkgYW5kIHQtLSl7CiAgICAgICAgCiAgICBpbnQgbjtjaW4+Pm47IGUyaS5jbGVhcigpOwogICAgZ3JhcGg9IG5ldyB2ZWN0b3I8cGFpcjxpbnQsaW50Pj4gW25dOwogICAgRWRnZSA9IG5ldyBlZGdlW25dOwogICAgICAgIAogICAgZm9yKGludCBpPTA7aTxuLTE7aSsrKQogICAge2ludCB1LHYsdztjaW4+PnU+PnY+Pnc7dS0tO3YtLTsKICAgICBncmFwaFt1XS5wYihtcCh2LHcpKTtncmFwaFt2XS5wYihtcCh1LHcpKTsgCiAgICAgRWRnZVtpXS5hPXU7RWRnZVtpXS5iPXY7IEVkZ2VbaV0ud3Q9IHc7ICAgIAogICAgIGlmKHU+dilzd2FwKHUsdik7IGUyaVttcCh1LHYpXT1pO30gCiAgICAgICAgCiAgICBmb3IoaW50IGk9MDtpPG47aSsrKXtpc0JsYWNrW2ldPWZhbHNlO2lzU3BlY2lhbFtpXT1mYWxzZTtkYXRhW2ldPU5JTkY7fQogICAgbWF4X2NoYWluX25vPS0xOyAgICAKICAgIHByZXByb2Nlc3Mobik7IAogICAgQ2hhaW4gPSBuZXcgY2hhaW5bTl07CiAgICBobGQoMCwrK21heF9jaGFpbl9ubywtMSk7CiAgICBzZWdfdHJlZS5jbGVhcigpOwogICAgYnVpbGQoKTsKICAgICAgICAKICAgIHN0cmluZyB0eXBlOwogICAgCiAgICB3aGlsZSh0cnVlKQogICAgewogICAgICAgIGNpbj4+dHlwZTtpZih0eXBlPT0iRE9ORSIpe2JyZWFrO30KICAgICAgICBpbnQgcTEscTI7Y2luPj5xMT4+cTI7Ly9zY2FuZigiJWQlZCIsJnExLCZxMik7CiAgICAgICAgaWYodHlwZT09IkNIQU5HRSIpe3VwZGF0ZShxMS0xLHEyKTt9CiAgICAgICAgZWxzZSBpZih0eXBlPT0iUVVFUlkiKXtwcmludGYoIiVkXG4iLHF1ZXJ5KHExLTEscTItMSkpO30KICAgICAgICBlbHNlIHticmVhazt9CiAgICB9CiAgICAgICAgCiAgICAvKiAgICBwcmludGYoIltbWyVkXV1dIixtYXhfY2hhaW5fbm8pOwogICAgICAgIHB1dHMoIiIpOwogICAgIGZvcihpbnQgaT0wO2k8PW1heF9jaGFpbl9ubztpKyspCiAgICAgewogICAgICBwcmludGYoIlslZF0iLENoYWluW2ldLmxlbik7Zm9yKGludCBqPTA7ajxDaGFpbltpXS5hLnNpemUoKTtqKyspewogICAgICAgICAgcHJpbnRmKCJ7JWQgJWQgJWR9IixDaGFpbltpXS5hW2pdKzEsZGF0YVtDaGFpbltpXS5hW2pdXSxjaGFpbl9ncm91cFtDaGFpbltpXS5hW2pdXSk7CiAgICAgIH1wdXRzKCIiKTsgICAKICAgICAgICAvLyBwcmludGYoIiVkICIsQ2hhaW5baV0ucGFyZW50KTsKICAgICB9IAogICAgICAvL3ByaW50ZigiLS1bJWRdLS0iLHF1ZXJ5VHJlZSgxLDMsMCkpOyAgCiAgICAgICovCiAgICB9CiAgICByZXR1cm4gMDsKfQovKgoxCjMKMSAyIDEKMiAzIDIKUVVFUlkgMSAyCkNIQU5HRSAxIDMKUVVFUlkgMSAyCkRPTkUKCiovCi8qCjEKMjMKMSAyIDMKMSAzIDE2IAoxIDQgNSAKMSA1IDIwCjIgNiAyCjIgOCA0CjIgOSA1IAoyIDEwIDExCjMgMTEgMTgKNCAxMiAyMwoxOSAyMyAxNQo2IDcgMSAKOSAxMyA2CjkgMTUgOAoxMCAxOCAxMgoxMCAxOSAxNAoxMyAxNCA3IAoxNSAxNiAxMAoxNSAxNyA5CjE4IDIwIDEzCjE5IDIxIDE2CjIxIDIyIDE3ClFVRVJZIDIyIDMKUVVFUlkgMyAyMiAKUVVFUlkgMjIgMTEKUVVFUlkgMTEgMjIKUVVFUlkgMjIgNApRVUVSWSA0IDIyClFVRVJZIDIyIDEyClFVRVJZIDEyIDIyClFVRVJZIDE0IDIzClFVRVJZIDIzIDE0CkRPTkUKKi8K