#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INFLL = (1LL<<60);
struct Node {
Node *l,*r;
int pr, sz;
ll val, mn, mx;
bool rev;
Node(ll v=0): l(nullptr), r(nullptr), pr((rand()<<16)^rand()), sz(1), val(v), mn(v), mx(v), rev(false) {}
};
int sz(Node* t){ return t? t->sz : 0; }
void pull(Node* t){ if(!t) return; t->sz = 1 + sz(t->l) + sz(t->r); t->mn = t->val; t->mx = t->val;
if(t->l){ t->mn = min(t->mn, t->l->mn); t->mx = max(t->mx, t->l->mx); }
if(t->r){ t->mn = min(t->mn, t->r->mn); t->mx = max(t->mx, t->r->mx); }
}
void push(Node* t){ if(!t || !t->rev) return; t->rev = false; swap(t->l, t->r); if(t->l) t->l->rev ^= 1; if(t->r) t->r->rev ^= 1; }
Node* merge(Node* a, Node* b){
if(!a) return b; if(!b) return a;
push(a); push(b);
if(a->pr < b->pr){ a->r = merge(a->r, b); pull(a); return a; }
else { b->l = merge(a, b->l); pull(b); return b; }
}
void split(Node* t, int k, Node*& a, Node*& b){ // first k nodes -> a
if(!t){ a=b=nullptr; return; }
push(t);
int lsz = sz(t->l);
if(lsz >= k){
split(t->l, k, a, t->l);
pull(t);
b = t;
} else {
split(t->r, k - lsz - 1, t->r, b);
pull(t);
a = t;
}
}
// treap helpers
ll treap_range_min(Node*& root, int l, int r){
Node *a,*b,*c;
split(root, r, a, b);
split(a, l-1, c, a);
ll ans = (a? a->mn : INFLL);
a = merge(c, a);
root = merge(a, b);
return ans;
}
ll treap_range_max(Node*& root, int l, int r){
Node *a,*b,*c;
split(root, r, a, b);
split(a, l-1, c, a);
ll ans = (a? a->mx : -INFLL);
a = merge(c, a);
root = merge(a, b);
return ans;
}
// HLD
int N,Q;
vector<vector<int>> adj;
vector<int> parentv, depthv, heavy, head, pos, szv, invpos;
int curPos;
vector<ll> weightv;
int dfs1(int v,int p){
parentv[v]=p; depthv[v]=(p==-1?0:depthv[p]+1);
int size=1, maxc=0; heavy[v]=-1;
for(int to: adj[v]) if(to!=p){
int s = dfs1(to, v);
if(s>maxc){ maxc=s; heavy[v]=to; }
size += s;
}
szv[v]=size; return size;
}
void dfs2(int v,int h){
head[v]=h; pos[v]=curPos; invpos[curPos]=v; curPos++;
if(heavy[v]!=-1) dfs2(heavy[v], h);
for(int to: adj[v]) if(to!=parentv[v] && to!=heavy[v]) dfs2(to, to);
}
struct Seg { int l,r; bool rev; };
vector<Seg> getPathSegments(int u,int v){
vector<Seg> up, down;
while(head[u] != head[v]){
if(depthv[head[u]] >= depthv[head[v]]){
up.push_back({pos[head[u]], pos[u], true});
u = parentv[head[u]];
} else {
down.push_back({pos[head[v]], pos[v], false});
v = parentv[head[v]];
}
}
if(pos[u] <= pos[v]) up.push_back({pos[u], pos[v], false});
else up.push_back({pos[v], pos[u], true});
for(int i=(int)down.size()-1;i>=0;--i) up.push_back(down[i]);
return up;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
srand(1234567);
if(!(cin>>N>>Q)) return 0;
weightv.assign(N+1,0);
for(int i=1;i<=N;i++) cin>>weightv[i];
adj.assign(N+1,{});
for(int i=0;i<N-1;i++){ int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); }
parentv.assign(N+1,-1); depthv.assign(N+1,0); heavy.assign(N+1,-1);
head.assign(N+1,0); pos.assign(N+1,0); szv.assign(N+1,0); invpos.assign(N+1,0);
curPos = 1;
dfs1(1,-1);
dfs2(1,1);
Node* root = nullptr;
for(int i=1;i<=N;i++){
Node* nd = new Node(weightv[ invpos[i] ]);
root = merge(root, nd);
}
while(Q--){
int type,u,v; cin>>type>>u>>v;
if(type==1){
auto segs = getPathSegments(u,v);
ll ans = INFLL;
for(auto &s: segs) ans = min(ans, treap_range_min(root, s.l, s.r));
cout<<ans<<"\n";
} else if(type==2){
auto segs = getPathSegments(u,v);
ll ans = -INFLL;
for(auto &s: segs) ans = max(ans, treap_range_max(root, s.l, s.r));
cout<<ans<<"\n";
} else {
auto segs_path = getPathSegments(u,v);
vector<Seg> segs_sorted = segs_path;
sort(segs_sorted.begin(), segs_sorted.end(), [](const Seg&a,const Seg&b){ return a.l < b.l; });
int m = segs_sorted.size();
vector<Node*> nonPath; nonPath.reserve(m+1);
vector<Node*> segsT; segsT.reserve(m);
Node* cur = root;
int prevR = 0; // <-- important: use prevR to index into current 'cur'
for(int i=0;i<m;i++){
int l = segs_sorted[i].l;
int r = segs_sorted[i].r;
int len = r - l + 1;
int kidx = l - prevR - 1; // CORRECT calculation
Node *left, *rest;
split(cur, kidx, left, rest);
Node *mid, *right;
split(rest, len, mid, right);
nonPath.push_back(left);
segsT.push_back(mid);
cur = right;
prevR = r;
}
nonPath.push_back(cur);
unordered_map<int,int> idx; idx.reserve(m*2+3);
for(int i=0;i<m;i++) idx[segs_sorted[i].l] = i;
Node* pathSeq = nullptr;
for(auto &s: segs_path){
int id = idx[s.l];
Node* t = segsT[id];
if(s.rev) { if(t) t->rev ^= 1; }
pathSeq = merge(pathSeq, t);
}
if(pathSeq) pathSeq->rev ^= 1;
Node* temp = pathSeq;
vector<Node*> newMidByL(m, nullptr);
for(int i=0;i<(int)segs_path.size();i++){
auto &s = segs_path[i];
int len = s.r - s.l + 1;
Node *left, *right;
split(temp, len, left, right);
if(s.rev){ if(left) left->rev ^= 1; }
int id = idx[s.l];
newMidByL[id] = left;
temp = right;
}
Node* res = nullptr;
for(int i=0;i<m;i++){
res = merge(res, nonPath[i]);
res = merge(res, newMidByL[i]);
}
res = merge(res, nonPath[m]);
root = res;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwpjb25zdCBsbCBJTkZMTCA9ICgxTEw8PDYwKTsKCnN0cnVjdCBOb2RlIHsKICAgIE5vZGUgKmwsKnI7CiAgICBpbnQgcHIsIHN6OwogICAgbGwgdmFsLCBtbiwgbXg7CiAgICBib29sIHJldjsKICAgIE5vZGUobGwgdj0wKTogbChudWxscHRyKSwgcihudWxscHRyKSwgcHIoKHJhbmQoKTw8MTYpXnJhbmQoKSksIHN6KDEpLCB2YWwodiksIG1uKHYpLCBteCh2KSwgcmV2KGZhbHNlKSB7fQp9OwppbnQgc3ooTm9kZSogdCl7IHJldHVybiB0PyB0LT5zeiA6IDA7IH0Kdm9pZCBwdWxsKE5vZGUqIHQpeyBpZighdCkgcmV0dXJuOyB0LT5zeiA9IDEgKyBzeih0LT5sKSArIHN6KHQtPnIpOyB0LT5tbiA9IHQtPnZhbDsgdC0+bXggPSB0LT52YWw7CiAgICBpZih0LT5sKXsgdC0+bW4gPSBtaW4odC0+bW4sIHQtPmwtPm1uKTsgdC0+bXggPSBtYXgodC0+bXgsIHQtPmwtPm14KTsgfQogICAgaWYodC0+cil7IHQtPm1uID0gbWluKHQtPm1uLCB0LT5yLT5tbik7IHQtPm14ID0gbWF4KHQtPm14LCB0LT5yLT5teCk7IH0KfQp2b2lkIHB1c2goTm9kZSogdCl7IGlmKCF0IHx8ICF0LT5yZXYpIHJldHVybjsgdC0+cmV2ID0gZmFsc2U7IHN3YXAodC0+bCwgdC0+cik7IGlmKHQtPmwpIHQtPmwtPnJldiBePSAxOyBpZih0LT5yKSB0LT5yLT5yZXYgXj0gMTsgfQoKTm9kZSogbWVyZ2UoTm9kZSogYSwgTm9kZSogYil7CiAgICBpZighYSkgcmV0dXJuIGI7IGlmKCFiKSByZXR1cm4gYTsKICAgIHB1c2goYSk7IHB1c2goYik7CiAgICBpZihhLT5wciA8IGItPnByKXsgYS0+ciA9IG1lcmdlKGEtPnIsIGIpOyBwdWxsKGEpOyByZXR1cm4gYTsgfQogICAgZWxzZSB7IGItPmwgPSBtZXJnZShhLCBiLT5sKTsgcHVsbChiKTsgcmV0dXJuIGI7IH0KfQp2b2lkIHNwbGl0KE5vZGUqIHQsIGludCBrLCBOb2RlKiYgYSwgTm9kZSomIGIpeyAvLyBmaXJzdCBrIG5vZGVzIC0+IGEKICAgIGlmKCF0KXsgYT1iPW51bGxwdHI7IHJldHVybjsgfQogICAgcHVzaCh0KTsKICAgIGludCBsc3ogPSBzeih0LT5sKTsKICAgIGlmKGxzeiA+PSBrKXsKICAgICAgICBzcGxpdCh0LT5sLCBrLCBhLCB0LT5sKTsKICAgICAgICBwdWxsKHQpOwogICAgICAgIGIgPSB0OwogICAgfSBlbHNlIHsKICAgICAgICBzcGxpdCh0LT5yLCBrIC0gbHN6IC0gMSwgdC0+ciwgYik7CiAgICAgICAgcHVsbCh0KTsKICAgICAgICBhID0gdDsKICAgIH0KfQoKLy8gdHJlYXAgaGVscGVycwpsbCB0cmVhcF9yYW5nZV9taW4oTm9kZSomIHJvb3QsIGludCBsLCBpbnQgcil7CiAgICBOb2RlICphLCpiLCpjOwogICAgc3BsaXQocm9vdCwgciwgYSwgYik7CiAgICBzcGxpdChhLCBsLTEsIGMsIGEpOwogICAgbGwgYW5zID0gKGE/IGEtPm1uIDogSU5GTEwpOwogICAgYSA9IG1lcmdlKGMsIGEpOwogICAgcm9vdCA9IG1lcmdlKGEsIGIpOwogICAgcmV0dXJuIGFuczsKfQpsbCB0cmVhcF9yYW5nZV9tYXgoTm9kZSomIHJvb3QsIGludCBsLCBpbnQgcil7CiAgICBOb2RlICphLCpiLCpjOwogICAgc3BsaXQocm9vdCwgciwgYSwgYik7CiAgICBzcGxpdChhLCBsLTEsIGMsIGEpOwogICAgbGwgYW5zID0gKGE/IGEtPm14IDogLUlORkxMKTsKICAgIGEgPSBtZXJnZShjLCBhKTsKICAgIHJvb3QgPSBtZXJnZShhLCBiKTsKICAgIHJldHVybiBhbnM7Cn0KCi8vIEhMRAppbnQgTixROwp2ZWN0b3I8dmVjdG9yPGludD4+IGFkajsKdmVjdG9yPGludD4gcGFyZW50diwgZGVwdGh2LCBoZWF2eSwgaGVhZCwgcG9zLCBzenYsIGludnBvczsKaW50IGN1clBvczsKdmVjdG9yPGxsPiB3ZWlnaHR2OwoKaW50IGRmczEoaW50IHYsaW50IHApewogICAgcGFyZW50dlt2XT1wOyBkZXB0aHZbdl09KHA9PS0xPzA6ZGVwdGh2W3BdKzEpOwogICAgaW50IHNpemU9MSwgbWF4Yz0wOyBoZWF2eVt2XT0tMTsKICAgIGZvcihpbnQgdG86IGFkalt2XSkgaWYodG8hPXApewogICAgICAgIGludCBzID0gZGZzMSh0bywgdik7CiAgICAgICAgaWYocz5tYXhjKXsgbWF4Yz1zOyBoZWF2eVt2XT10bzsgfQogICAgICAgIHNpemUgKz0gczsKICAgIH0KICAgIHN6dlt2XT1zaXplOyByZXR1cm4gc2l6ZTsKfQp2b2lkIGRmczIoaW50IHYsaW50IGgpewogICAgaGVhZFt2XT1oOyBwb3Nbdl09Y3VyUG9zOyBpbnZwb3NbY3VyUG9zXT12OyBjdXJQb3MrKzsKICAgIGlmKGhlYXZ5W3ZdIT0tMSkgZGZzMihoZWF2eVt2XSwgaCk7CiAgICBmb3IoaW50IHRvOiBhZGpbdl0pIGlmKHRvIT1wYXJlbnR2W3ZdICYmIHRvIT1oZWF2eVt2XSkgZGZzMih0bywgdG8pOwp9CnN0cnVjdCBTZWcgeyBpbnQgbCxyOyBib29sIHJldjsgfTsKdmVjdG9yPFNlZz4gZ2V0UGF0aFNlZ21lbnRzKGludCB1LGludCB2KXsKICAgIHZlY3RvcjxTZWc+IHVwLCBkb3duOwogICAgd2hpbGUoaGVhZFt1XSAhPSBoZWFkW3ZdKXsKICAgICAgICBpZihkZXB0aHZbaGVhZFt1XV0gPj0gZGVwdGh2W2hlYWRbdl1dKXsKICAgICAgICAgICAgdXAucHVzaF9iYWNrKHtwb3NbaGVhZFt1XV0sIHBvc1t1XSwgdHJ1ZX0pOwogICAgICAgICAgICB1ID0gcGFyZW50dltoZWFkW3VdXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb3duLnB1c2hfYmFjayh7cG9zW2hlYWRbdl1dLCBwb3Nbdl0sIGZhbHNlfSk7CiAgICAgICAgICAgIHYgPSBwYXJlbnR2W2hlYWRbdl1dOwogICAgICAgIH0KICAgIH0KICAgIGlmKHBvc1t1XSA8PSBwb3Nbdl0pIHVwLnB1c2hfYmFjayh7cG9zW3VdLCBwb3Nbdl0sIGZhbHNlfSk7CiAgICBlbHNlIHVwLnB1c2hfYmFjayh7cG9zW3ZdLCBwb3NbdV0sIHRydWV9KTsKICAgIGZvcihpbnQgaT0oaW50KWRvd24uc2l6ZSgpLTE7aT49MDstLWkpIHVwLnB1c2hfYmFjayhkb3duW2ldKTsKICAgIHJldHVybiB1cDsKfQoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBzcmFuZCgxMjM0NTY3KTsKICAgIGlmKCEoY2luPj5OPj5RKSkgcmV0dXJuIDA7CiAgICB3ZWlnaHR2LmFzc2lnbihOKzEsMCk7CiAgICBmb3IoaW50IGk9MTtpPD1OO2krKykgY2luPj53ZWlnaHR2W2ldOwogICAgYWRqLmFzc2lnbihOKzEse30pOwogICAgZm9yKGludCBpPTA7aTxOLTE7aSsrKXsgaW50IHUsdjsgY2luPj51Pj52OyBhZGpbdV0ucHVzaF9iYWNrKHYpOyBhZGpbdl0ucHVzaF9iYWNrKHUpOyB9CiAgICBwYXJlbnR2LmFzc2lnbihOKzEsLTEpOyBkZXB0aHYuYXNzaWduKE4rMSwwKTsgaGVhdnkuYXNzaWduKE4rMSwtMSk7CiAgICBoZWFkLmFzc2lnbihOKzEsMCk7IHBvcy5hc3NpZ24oTisxLDApOyBzenYuYXNzaWduKE4rMSwwKTsgaW52cG9zLmFzc2lnbihOKzEsMCk7CiAgICBjdXJQb3MgPSAxOwogICAgZGZzMSgxLC0xKTsKICAgIGRmczIoMSwxKTsKICAgIE5vZGUqIHJvb3QgPSBudWxscHRyOwogICAgZm9yKGludCBpPTE7aTw9TjtpKyspewogICAgICAgIE5vZGUqIG5kID0gbmV3IE5vZGUod2VpZ2h0dlsgaW52cG9zW2ldIF0pOwogICAgICAgIHJvb3QgPSBtZXJnZShyb290LCBuZCk7CiAgICB9CgogICAgd2hpbGUoUS0tKXsKICAgICAgICBpbnQgdHlwZSx1LHY7IGNpbj4+dHlwZT4+dT4+djsKICAgICAgICBpZih0eXBlPT0xKXsKICAgICAgICAgICAgYXV0byBzZWdzID0gZ2V0UGF0aFNlZ21lbnRzKHUsdik7CiAgICAgICAgICAgIGxsIGFucyA9IElORkxMOwogICAgICAgICAgICBmb3IoYXV0byAmczogc2VncykgYW5zID0gbWluKGFucywgdHJlYXBfcmFuZ2VfbWluKHJvb3QsIHMubCwgcy5yKSk7CiAgICAgICAgICAgIGNvdXQ8PGFuczw8IlxuIjsKICAgICAgICB9IGVsc2UgaWYodHlwZT09Mil7CiAgICAgICAgICAgIGF1dG8gc2VncyA9IGdldFBhdGhTZWdtZW50cyh1LHYpOwogICAgICAgICAgICBsbCBhbnMgPSAtSU5GTEw7CiAgICAgICAgICAgIGZvcihhdXRvICZzOiBzZWdzKSBhbnMgPSBtYXgoYW5zLCB0cmVhcF9yYW5nZV9tYXgocm9vdCwgcy5sLCBzLnIpKTsKICAgICAgICAgICAgY291dDw8YW5zPDwiXG4iOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF1dG8gc2Vnc19wYXRoID0gZ2V0UGF0aFNlZ21lbnRzKHUsdik7CiAgICAgICAgICAgIHZlY3RvcjxTZWc+IHNlZ3Nfc29ydGVkID0gc2Vnc19wYXRoOwogICAgICAgICAgICBzb3J0KHNlZ3Nfc29ydGVkLmJlZ2luKCksIHNlZ3Nfc29ydGVkLmVuZCgpLCBbXShjb25zdCBTZWcmYSxjb25zdCBTZWcmYil7IHJldHVybiBhLmwgPCBiLmw7IH0pOwogICAgICAgICAgICBpbnQgbSA9IHNlZ3Nfc29ydGVkLnNpemUoKTsKICAgICAgICAgICAgdmVjdG9yPE5vZGUqPiBub25QYXRoOyBub25QYXRoLnJlc2VydmUobSsxKTsKICAgICAgICAgICAgdmVjdG9yPE5vZGUqPiBzZWdzVDsgc2Vnc1QucmVzZXJ2ZShtKTsKICAgICAgICAgICAgTm9kZSogY3VyID0gcm9vdDsKICAgICAgICAgICAgaW50IHByZXZSID0gMDsgLy8gPC0tIGltcG9ydGFudDogdXNlIHByZXZSIHRvIGluZGV4IGludG8gY3VycmVudCAnY3VyJwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPG07aSsrKXsKICAgICAgICAgICAgICAgIGludCBsID0gc2Vnc19zb3J0ZWRbaV0ubDsKICAgICAgICAgICAgICAgIGludCByID0gc2Vnc19zb3J0ZWRbaV0ucjsKICAgICAgICAgICAgICAgIGludCBsZW4gPSByIC0gbCArIDE7CiAgICAgICAgICAgICAgICBpbnQga2lkeCA9IGwgLSBwcmV2UiAtIDE7IC8vIENPUlJFQ1QgY2FsY3VsYXRpb24KICAgICAgICAgICAgICAgIE5vZGUgKmxlZnQsICpyZXN0OwogICAgICAgICAgICAgICAgc3BsaXQoY3VyLCBraWR4LCBsZWZ0LCByZXN0KTsKICAgICAgICAgICAgICAgIE5vZGUgKm1pZCwgKnJpZ2h0OwogICAgICAgICAgICAgICAgc3BsaXQocmVzdCwgbGVuLCBtaWQsIHJpZ2h0KTsKICAgICAgICAgICAgICAgIG5vblBhdGgucHVzaF9iYWNrKGxlZnQpOwogICAgICAgICAgICAgICAgc2Vnc1QucHVzaF9iYWNrKG1pZCk7CiAgICAgICAgICAgICAgICBjdXIgPSByaWdodDsKICAgICAgICAgICAgICAgIHByZXZSID0gcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBub25QYXRoLnB1c2hfYmFjayhjdXIpOwogICAgICAgICAgICB1bm9yZGVyZWRfbWFwPGludCxpbnQ+IGlkeDsgaWR4LnJlc2VydmUobSoyKzMpOwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPG07aSsrKSBpZHhbc2Vnc19zb3J0ZWRbaV0ubF0gPSBpOwogICAgICAgICAgICBOb2RlKiBwYXRoU2VxID0gbnVsbHB0cjsKICAgICAgICAgICAgZm9yKGF1dG8gJnM6IHNlZ3NfcGF0aCl7CiAgICAgICAgICAgICAgICBpbnQgaWQgPSBpZHhbcy5sXTsKICAgICAgICAgICAgICAgIE5vZGUqIHQgPSBzZWdzVFtpZF07CiAgICAgICAgICAgICAgICBpZihzLnJldikgeyBpZih0KSB0LT5yZXYgXj0gMTsgfQogICAgICAgICAgICAgICAgcGF0aFNlcSA9IG1lcmdlKHBhdGhTZXEsIHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHBhdGhTZXEpIHBhdGhTZXEtPnJldiBePSAxOwogICAgICAgICAgICBOb2RlKiB0ZW1wID0gcGF0aFNlcTsKICAgICAgICAgICAgdmVjdG9yPE5vZGUqPiBuZXdNaWRCeUwobSwgbnVsbHB0cik7CiAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8KGludClzZWdzX3BhdGguc2l6ZSgpO2krKyl7CiAgICAgICAgICAgICAgICBhdXRvICZzID0gc2Vnc19wYXRoW2ldOwogICAgICAgICAgICAgICAgaW50IGxlbiA9IHMuciAtIHMubCArIDE7CiAgICAgICAgICAgICAgICBOb2RlICpsZWZ0LCAqcmlnaHQ7CiAgICAgICAgICAgICAgICBzcGxpdCh0ZW1wLCBsZW4sIGxlZnQsIHJpZ2h0KTsKICAgICAgICAgICAgICAgIGlmKHMucmV2KXsgaWYobGVmdCkgbGVmdC0+cmV2IF49IDE7IH0KICAgICAgICAgICAgICAgIGludCBpZCA9IGlkeFtzLmxdOwogICAgICAgICAgICAgICAgbmV3TWlkQnlMW2lkXSA9IGxlZnQ7CiAgICAgICAgICAgICAgICB0ZW1wID0gcmlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTm9kZSogcmVzID0gbnVsbHB0cjsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTxtO2krKyl7CiAgICAgICAgICAgICAgICByZXMgPSBtZXJnZShyZXMsIG5vblBhdGhbaV0pOwogICAgICAgICAgICAgICAgcmVzID0gbWVyZ2UocmVzLCBuZXdNaWRCeUxbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcyA9IG1lcmdlKHJlcywgbm9uUGF0aFttXSk7CiAgICAgICAgICAgIHJvb3QgPSByZXM7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0K