#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
struct node
{
unsigned long long data;
bool lazy , query1 , query2;
node *left , *right;
};
node *build(ull a[] , int strt , int end)
{
node *temp = (node *)malloc(sizeof(node));
if(strt == end)
{
temp->data = a[strt];
temp->left = temp->right = NULL;
temp->lazy = 0;
temp->query1 = temp->query2 = 0;
return temp;
}
int mid = (strt + end)/2;
temp->left = build(a , strt, mid);
temp->right = build(a , mid + 1 , end);
temp->data = temp->left->data ^ temp->right->data;
temp->lazy = 0;
temp->query1 = temp->query2 = 0;
return temp;
}
void rangeupdate(node *root , int strt , int end , int x , int y , bool flag)
{
if(strt >= x && end <= y)
{
if(!root->lazy)
{
if(!((end - strt + 1) & 1))
{
if(((end - strt + 1)/2) & 1)
root->data = ~root->data;
}
else
{
if((flag && (((end - strt + 1)/2) & 1))||(!flag && !(((end - strt + 1)/2) & 1)))
root->data = ~root->data;
}
if(!flag)
{
root->query1 = 1;
root->query2 = 0;
}
else
{
root->query1 = 0;
root->query2 = 1;
}
root->lazy = 1;
}
else
{
if(flag)
{
root->query2 = !root->query2;
if(!root->query1 && !root->query2)
root->lazy = 0;
if(!((end - strt + 1) & 1))
{
if(((end - strt + 1)/2) & 1)
root->data = ~root->data;
}
else
{
if((((end - strt + 1)/2) & 1))
root->data = ~root->data;
}
}
else
{
root->query1 = !root->query1;
if(!root->query1 && !root->query2)
root->lazy = 0;
if(!((end - strt + 1) & 1))
{
if(((end - strt + 1)/2) & 1)
root->data = ~root->data;
}
else
{
if(!(((end - strt + 1)/2) & 1))
root->data = ~root->data;
}
}
}
return;
}
int mid = (strt + end)/2;
if(root->lazy)
{
if(root->query1)
rangeupdate(root->left , strt , mid , strt , mid , 0);
if(root->query2)
rangeupdate(root->left , strt , mid , strt, mid , 1);
if(!((mid - strt + 1) & 1))
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
}
else
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
}
root->lazy = root->query1 = root->query2 = 0;
}
if(y <= mid)
rangeupdate(root->left , strt , mid , x , y , flag);
else if(x > mid)
rangeupdate(root->right , mid + 1 , end , x , y , flag);
else
{
rangeupdate(root->left , strt , mid , x , mid , flag);
if(!((mid - x + 1) & 1))
{
if(flag == 0)
rangeupdate(root->right , mid + 1 , end , mid + 1 , y , 0);
else
rangeupdate(root->right , mid + 1 , end , mid + 1 , y , 1);
}
else
{
if(flag == 0)
rangeupdate(root->right , mid + 1 , end , mid + 1 , y , 1);
else
rangeupdate(root->right , mid + 1 , end , mid + 1 , y , 0);
}
}
root->data = root->left->data ^ root->right->data;
}
void pointupdate(node *root , int strt , int end , int x , ull y)
{
if(strt == end)
{
root->data = y;
return;
}
int mid = (strt + end)/2;
if(root->lazy)
{
if(root->query1)
rangeupdate(root->left , strt , mid , strt , mid , 0);
if(root->query2)
rangeupdate(root->left , strt , mid , strt, mid , 1);
if(!((mid - strt + 1) & 1))
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
}
else
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
}
root->lazy = root->query1 = root->query2 = 0;
}
if(x <= mid)
pointupdate(root->left , strt, mid , x , y);
else
pointupdate(root->right , mid + 1 , end , x , y);
root->data = root->left->data ^ root->right->data;
}
ull pointquery(node *root , int strt , int end , int x)
{
if(strt == end)
return root->data;
int mid = (strt + end)/2;
if(root->lazy)
{
if(root->query1)
rangeupdate(root->left , strt , mid , strt , mid , 0);
if(root->query2)
rangeupdate(root->left , strt , mid , strt, mid , 1);
if(!((mid - strt + 1) & 1))
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
}
else
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
}
root->lazy = root->query1 = root->query2 = 0;
}
if(x <= mid)
return pointquery(root->left , strt , mid , x);
else
return pointquery(root->right , mid + 1 , end , x);
}
ull rangequery(node *root , int strt , int end , int x , int y)
{
if(strt >= x && end <= y)
return root->data;
int mid = (strt + end)/2;
if(root->lazy)
{
if(root->query1)
rangeupdate(root->left , strt , mid , strt , mid , 0);
if(root->query2)
rangeupdate(root->left , strt , mid , strt, mid , 1);
if(!((mid - strt + 1) & 1))
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
}
else
{
if(root->query1)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 1);
if(root->query2)
rangeupdate(root->right , mid + 1 , end , mid + 1 , end , 0);
}
root->lazy = root->query1 = root->query2 = 0;
}
if(y <= mid)
return rangequery(root->left , strt , mid , x , y);
else if(x > mid)
return rangequery(root->right , mid + 1 , end , x , y);
else
return rangequery(root->left , strt , mid , x , mid)^rangequery(root->right , mid + 1 , end , mid + 1 , y);
}
int main()
{
int n ,i;
cin >> n;
ull a[n];
for(i = 0;i < n;i++)
cin >> a[i];
node *root = NULL;
root = build(a , 0 , n-1);
ull x , y , q;
cin >> q;
char t;
while(q--)
{
cin >> t;
if(t == 'A')
{
cin >> x >> y;
pointupdate(root , 0 , n-1 , x-1 , y);
}
else if(t == 'B')
{
cin >> x >> y;
rangeupdate(root , 0 , n-1 , x-1 , y-1 , 0);
}
else if(t == 'C')
{
cin >> x;
cout << pointquery(root , 0 , n-1 , x-1) << endl;
}
else
{
cin >> x >> y;
cout << rangequery(root , 0 , n-1 , x-1 , y-1) << endl;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwpzdHJ1Y3Qgbm9kZQp7Cgl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YTsKCWJvb2wgbGF6eSAsIHF1ZXJ5MSAsIHF1ZXJ5MjsKCW5vZGUgKmxlZnQgLCAqcmlnaHQ7Cn07Cm5vZGUgKmJ1aWxkKHVsbCBhW10gLCBpbnQgc3RydCAsIGludCBlbmQpCnsKCW5vZGUgKnRlbXAgPSAobm9kZSAqKW1hbGxvYyhzaXplb2Yobm9kZSkpOwoJaWYoc3RydCA9PSBlbmQpCgl7CgkJdGVtcC0+ZGF0YSA9IGFbc3RydF07CgkJdGVtcC0+bGVmdCA9IHRlbXAtPnJpZ2h0ID0gTlVMTDsKCQl0ZW1wLT5sYXp5ID0gMDsKCQl0ZW1wLT5xdWVyeTEgPSB0ZW1wLT5xdWVyeTIgPSAwOwoJCXJldHVybiB0ZW1wOwoJfQoJaW50IG1pZCA9IChzdHJ0ICsgZW5kKS8yOwoKCXRlbXAtPmxlZnQgPSBidWlsZChhICwgc3RydCwgIG1pZCk7Cgl0ZW1wLT5yaWdodCA9IGJ1aWxkKGEgLCBtaWQgKyAxICwgZW5kKTsKCXRlbXAtPmRhdGEgPSB0ZW1wLT5sZWZ0LT5kYXRhIF4gdGVtcC0+cmlnaHQtPmRhdGE7Cgl0ZW1wLT5sYXp5ID0gMDsKCXRlbXAtPnF1ZXJ5MSA9IHRlbXAtPnF1ZXJ5MiA9IDA7CglyZXR1cm4gdGVtcDsKfQp2b2lkIHJhbmdldXBkYXRlKG5vZGUgKnJvb3QgLCBpbnQgc3RydCAsIGludCBlbmQgLCBpbnQgeCAsIGludCB5ICwgYm9vbCBmbGFnKQp7CglpZihzdHJ0ID49IHggJiYgZW5kIDw9IHkpCgl7CgkJaWYoIXJvb3QtPmxhenkpCgkJewoJCQlpZighKChlbmQgLSBzdHJ0ICsgMSkgJiAxKSkKCQkJewoJCQkJaWYoKChlbmQgLSBzdHJ0ICsgMSkvMikgJiAxKQoJCQkJCXJvb3QtPmRhdGEgPSB+cm9vdC0+ZGF0YTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmKChmbGFnICYmICgoKGVuZCAtIHN0cnQgKyAxKS8yKSAmIDEpKXx8KCFmbGFnICYmICEoKChlbmQgLSBzdHJ0ICsgMSkvMikgJiAxKSkpCgkJCQkJcm9vdC0+ZGF0YSA9IH5yb290LT5kYXRhOwoKCQkJfQoJCQlpZighZmxhZykKCQkJewoJCQkJcm9vdC0+cXVlcnkxID0gMTsKCQkJCXJvb3QtPnF1ZXJ5MiA9IDA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyb290LT5xdWVyeTEgPSAwOwoJCQkJcm9vdC0+cXVlcnkyID0gMTsKCQkJfQoJCQlyb290LT5sYXp5ID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYoZmxhZykKCQkJewoJCQkJcm9vdC0+cXVlcnkyID0gIXJvb3QtPnF1ZXJ5MjsKCQkJCWlmKCFyb290LT5xdWVyeTEgJiYgIXJvb3QtPnF1ZXJ5MikKCQkJCQlyb290LT5sYXp5ID0gMDsKCQkJCWlmKCEoKGVuZCAtIHN0cnQgKyAxKSAmIDEpKQoJCQkJewoJCQkJCWlmKCgoZW5kIC0gc3RydCArIDEpLzIpICYgMSkKCQkJCQkJcm9vdC0+ZGF0YSA9IH5yb290LT5kYXRhOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWlmKCgoKGVuZCAtIHN0cnQgKyAxKS8yKSAmIDEpKQoJCQkJCQlyb290LT5kYXRhID0gfnJvb3QtPmRhdGE7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyb290LT5xdWVyeTEgPSAhcm9vdC0+cXVlcnkxOwoJCQkJaWYoIXJvb3QtPnF1ZXJ5MSAmJiAhcm9vdC0+cXVlcnkyKQoJCQkJCXJvb3QtPmxhenkgPSAwOwoJCQkJaWYoISgoZW5kIC0gc3RydCArIDEpICYgMSkpCgkJCQl7CgkJCQkJaWYoKChlbmQgLSBzdHJ0ICsgMSkvMikgJiAxKQoJCQkJCQlyb290LT5kYXRhID0gfnJvb3QtPmRhdGE7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYoISgoKGVuZCAtIHN0cnQgKyAxKS8yKSAmIDEpKQoJCQkJCQlyb290LT5kYXRhID0gfnJvb3QtPmRhdGE7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuOwoJfQoKCWludCBtaWQgPSAoc3RydCArIGVuZCkvMjsKCglpZihyb290LT5sYXp5KQoJewoJCWlmKHJvb3QtPnF1ZXJ5MSkKCQkJcmFuZ2V1cGRhdGUocm9vdC0+bGVmdCAsIHN0cnQgLCBtaWQgLCBzdHJ0ICwgbWlkICwgMCk7CgkJaWYocm9vdC0+cXVlcnkyKQoJCQlyYW5nZXVwZGF0ZShyb290LT5sZWZ0ICwgc3RydCAsIG1pZCAsIHN0cnQsICBtaWQgLCAxKTsKCQlpZighKChtaWQgLSBzdHJ0ICsgMSkgJiAxKSkKCQl7CgkJCWlmKHJvb3QtPnF1ZXJ5MSkKCQkJCXJhbmdldXBkYXRlKHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIG1pZCArIDEgLCBlbmQgLCAwKTsKCQkJaWYocm9vdC0+cXVlcnkyKQoJCQkJcmFuZ2V1cGRhdGUocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIGVuZCAsIDEpOwoJCX0KCQllbHNlCgkJewoJCQlpZihyb290LT5xdWVyeTEpCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgZW5kICwgMSk7CgkJCWlmKHJvb3QtPnF1ZXJ5MikKCQkJCXJhbmdldXBkYXRlKHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIG1pZCArIDEgLCBlbmQgLCAwKTsKCQl9CgkJcm9vdC0+bGF6eSA9IHJvb3QtPnF1ZXJ5MSA9IHJvb3QtPnF1ZXJ5MiA9IDA7Cgl9CgoJaWYoeSA8PSBtaWQpCgkJcmFuZ2V1cGRhdGUocm9vdC0+bGVmdCAsIHN0cnQgLCBtaWQgLCB4ICwgeSAsIGZsYWcpOwoJZWxzZSBpZih4ID4gbWlkKQoJCXJhbmdldXBkYXRlKHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIHggLCB5ICwgZmxhZyk7CgllbHNlCgl7CgkJcmFuZ2V1cGRhdGUocm9vdC0+bGVmdCAsIHN0cnQgLCBtaWQgLCB4ICwgbWlkICwgZmxhZyk7CgkJaWYoISgobWlkIC0geCArIDEpICYgMSkpCgkJewoJCQlpZihmbGFnID09IDApCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgeSAsIDApOwoJCQllbHNlCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgeSAsIDEpOwoJCX0KCQllbHNlCgkJewoJCQlpZihmbGFnID09IDApCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgeSAsIDEpOwoJCQllbHNlCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgeSAsIDApOwoJCX0KCX0KCXJvb3QtPmRhdGEgPSByb290LT5sZWZ0LT5kYXRhIF4gcm9vdC0+cmlnaHQtPmRhdGE7Cn0Kdm9pZCBwb2ludHVwZGF0ZShub2RlICpyb290ICwgaW50IHN0cnQgLCBpbnQgZW5kICwgaW50IHggLCB1bGwgeSkKewoJaWYoc3RydCA9PSBlbmQpCgl7CgkJcm9vdC0+ZGF0YSA9IHk7CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IChzdHJ0ICsgZW5kKS8yOwoKCWlmKHJvb3QtPmxhenkpCgl7CgkJaWYocm9vdC0+cXVlcnkxKQoJCQlyYW5nZXVwZGF0ZShyb290LT5sZWZ0ICwgc3RydCAsIG1pZCAsIHN0cnQgLCBtaWQgLCAwKTsKCQlpZihyb290LT5xdWVyeTIpCgkJCXJhbmdldXBkYXRlKHJvb3QtPmxlZnQgLCBzdHJ0ICwgbWlkICwgc3RydCwgIG1pZCAsIDEpOwoJCWlmKCEoKG1pZCAtIHN0cnQgKyAxKSAmIDEpKQoJCXsKCQkJaWYocm9vdC0+cXVlcnkxKQoJCQkJcmFuZ2V1cGRhdGUocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIGVuZCAsIDApOwoJCQlpZihyb290LT5xdWVyeTIpCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgZW5kICwgMSk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHJvb3QtPnF1ZXJ5MSkKCQkJCXJhbmdldXBkYXRlKHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIG1pZCArIDEgLCBlbmQgLCAxKTsKCQkJaWYocm9vdC0+cXVlcnkyKQoJCQkJcmFuZ2V1cGRhdGUocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIGVuZCAsIDApOwoJCX0KCQlyb290LT5sYXp5ID0gcm9vdC0+cXVlcnkxID0gcm9vdC0+cXVlcnkyID0gMDsKCX0KCglpZih4IDw9IG1pZCkKCQlwb2ludHVwZGF0ZShyb290LT5sZWZ0ICwgc3RydCwgIG1pZCAsIHggLCB5KTsKCWVsc2UKCQlwb2ludHVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCB4ICwgeSk7CgoJcm9vdC0+ZGF0YSA9IHJvb3QtPmxlZnQtPmRhdGEgXiByb290LT5yaWdodC0+ZGF0YTsKfQp1bGwgcG9pbnRxdWVyeShub2RlICpyb290ICwgaW50IHN0cnQgLCBpbnQgZW5kICwgaW50IHgpCnsKCWlmKHN0cnQgPT0gZW5kKQoJCXJldHVybiByb290LT5kYXRhOwoKCWludCBtaWQgPSAoc3RydCArIGVuZCkvMjsKCWlmKHJvb3QtPmxhenkpCgl7CgkJaWYocm9vdC0+cXVlcnkxKQoJCQlyYW5nZXVwZGF0ZShyb290LT5sZWZ0ICwgc3RydCAsIG1pZCAsIHN0cnQgLCBtaWQgLCAwKTsKCQlpZihyb290LT5xdWVyeTIpCgkJCXJhbmdldXBkYXRlKHJvb3QtPmxlZnQgLCBzdHJ0ICwgbWlkICwgc3RydCwgIG1pZCAsIDEpOwoJCWlmKCEoKG1pZCAtIHN0cnQgKyAxKSAmIDEpKQoJCXsKCQkJaWYocm9vdC0+cXVlcnkxKQoJCQkJcmFuZ2V1cGRhdGUocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIGVuZCAsIDApOwoJCQlpZihyb290LT5xdWVyeTIpCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgZW5kICwgMSk7CgkJfQoJCWVsc2UKCQl7CgkJCWlmKHJvb3QtPnF1ZXJ5MSkKCQkJCXJhbmdldXBkYXRlKHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIG1pZCArIDEgLCBlbmQgLCAxKTsKCQkJaWYocm9vdC0+cXVlcnkyKQoJCQkJcmFuZ2V1cGRhdGUocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIGVuZCAsIDApOwoJCX0KCQlyb290LT5sYXp5ID0gcm9vdC0+cXVlcnkxID0gcm9vdC0+cXVlcnkyID0gMDsKCX0KCglpZih4IDw9IG1pZCkKCQlyZXR1cm4gcG9pbnRxdWVyeShyb290LT5sZWZ0ICwgc3RydCAsIG1pZCAsIHgpOwoJZWxzZQoJCXJldHVybiBwb2ludHF1ZXJ5KHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIHgpOwp9CnVsbCByYW5nZXF1ZXJ5KG5vZGUgKnJvb3QgLCBpbnQgc3RydCAsIGludCBlbmQgLCBpbnQgeCAsIGludCB5KQp7CglpZihzdHJ0ID49IHggJiYgZW5kIDw9IHkpCgkJcmV0dXJuIHJvb3QtPmRhdGE7CgoJaW50IG1pZCA9IChzdHJ0ICsgZW5kKS8yOwoJaWYocm9vdC0+bGF6eSkKCXsKCQlpZihyb290LT5xdWVyeTEpCgkJCXJhbmdldXBkYXRlKHJvb3QtPmxlZnQgLCBzdHJ0ICwgbWlkICwgc3RydCAsIG1pZCAsIDApOwoJCWlmKHJvb3QtPnF1ZXJ5MikKCQkJcmFuZ2V1cGRhdGUocm9vdC0+bGVmdCAsIHN0cnQgLCBtaWQgLCBzdHJ0LCAgbWlkICwgMSk7CgkJaWYoISgobWlkIC0gc3RydCArIDEpICYgMSkpCgkJewoJCQlpZihyb290LT5xdWVyeTEpCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgZW5kICwgMCk7CgkJCWlmKHJvb3QtPnF1ZXJ5MikKCQkJCXJhbmdldXBkYXRlKHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIG1pZCArIDEgLCBlbmQgLCAxKTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYocm9vdC0+cXVlcnkxKQoJCQkJcmFuZ2V1cGRhdGUocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIGVuZCAsIDEpOwoJCQlpZihyb290LT5xdWVyeTIpCgkJCQlyYW5nZXVwZGF0ZShyb290LT5yaWdodCAsIG1pZCArIDEgLCBlbmQgLCBtaWQgKyAxICwgZW5kICwgMCk7CgkJfQoJCXJvb3QtPmxhenkgPSByb290LT5xdWVyeTEgPSByb290LT5xdWVyeTIgPSAwOwoJfQoKCWlmKHkgPD0gbWlkKQoJCXJldHVybiByYW5nZXF1ZXJ5KHJvb3QtPmxlZnQgLCBzdHJ0ICwgbWlkICwgeCAsIHkpOwoJZWxzZSBpZih4ID4gbWlkKQoJCXJldHVybiByYW5nZXF1ZXJ5KHJvb3QtPnJpZ2h0ICwgbWlkICsgMSAsIGVuZCAsIHggLCB5KTsKCWVsc2UKCQlyZXR1cm4gcmFuZ2VxdWVyeShyb290LT5sZWZ0ICwgc3RydCAsIG1pZCAsIHggLCBtaWQpXnJhbmdlcXVlcnkocm9vdC0+cmlnaHQgLCBtaWQgKyAxICwgZW5kICwgbWlkICsgMSAsIHkpOwp9CmludCBtYWluKCkKewoJaW50IG4gLGk7CgljaW4gPj4gbjsKCXVsbCBhW25dOwoJZm9yKGkgPSAwO2kgPCBuO2krKykKCQljaW4gPj4gYVtpXTsKCglub2RlICpyb290ID0gTlVMTDsKCXJvb3QgPSBidWlsZChhICwgMCAsIG4tMSk7Cgl1bGwgeCAsIHkgLCBxOwoJY2luID4+IHE7CgljaGFyIHQ7Cgl3aGlsZShxLS0pCgl7CgkJY2luID4+IHQ7CgkJaWYodCA9PSAnQScpCgkJewoJCQljaW4gPj4geCA+PiB5OwoJCQlwb2ludHVwZGF0ZShyb290ICwgMCAsIG4tMSAsIHgtMSAsIHkpOwoJCX0KCQllbHNlIGlmKHQgPT0gJ0InKQoJCXsKCQkJY2luID4+IHggPj4geTsKCQkJcmFuZ2V1cGRhdGUocm9vdCAsIDAgLCBuLTEgLCB4LTEgLCB5LTEgLCAwKTsKCQl9CgkJZWxzZSBpZih0ID09ICdDJykKCQl7CgkJCWNpbiA+PiB4OwoJCQljb3V0IDw8IHBvaW50cXVlcnkocm9vdCAsIDAgLCBuLTEgLCB4LTEpIDw8IGVuZGw7CgkJfQoJCWVsc2UKCQl7CgkJCWNpbiA+PiB4ID4+IHk7CgkJCWNvdXQgPDwgcmFuZ2VxdWVyeShyb290ICwgMCAsIG4tMSAsIHgtMSAsIHktMSkgPDwgZW5kbDsKCQl9Cgl9CglyZXR1cm4gMDsKfQo=