import java.io.IOException;
import java.io.InputStream;
import java.util.*;
class TestClass {
static final class InputReader {
private final byte[] buf = new byte[1024];
private int curChar;
private int numChars;
this.stream = stream;
}
if (curChar >= numChars) {
curChar = 0;
numChars = stream.read(buf);
if (numChars <= 0) {
return -1;
}
}
return buf[curChar++];
}
return (int) readLong();
}
int c = read();
while (isSpaceChar(c)) {
c = read();
}
boolean negative = false;
if (c == '-') {
negative = true;
c = read();
}
long res = 0;
do {
res *= 10;
res += c - '0';
c = read();
} while (!isSpaceChar(c));
return negative ? -res : res;
}
public final int[] readIntArray
(int size
) throws IOException { int[] array = new int[size];
for (int i = 0; i < size; i++) {
array[i] = readInt();
}
return array;
}
public final long[] readLongArray
(int size
) throws IOException { long[] array = new long[size];
for (int i = 0; i < size; i++) {
array[i] = readLong();
}
return array;
}
int c = read();
while (isSpaceChar(c)) {
c = read();
}
StringBuilder res = new StringBuilder();
do {
res.append((char) c);
c = read();
} while (!isSpaceChar(c));
return res.toString();
}
private boolean isSpaceChar(int c) {
return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
}
}
static long mulmod(long a, long b,
long mod) {
long res = 0; // Initialize result
a = a % mod;
while (b > 0) {
// If b is odd, add 'a' to result
if (b % 2 == 1) {
res = (res + a) % mod;
}
// Multiply 'a' with 2
a = (a * 2) % mod;
// Divide b by 2
b /= 2;
}
// Return result
return res % mod;
}
static long pow(long a, long b, long MOD) {
long x = 1, y = a;
while (b > 0) {
if (b % 2 == 1) {
x = (x * y);
if (x > MOD) x %= MOD;
}
y = (y * y);
if (y > MOD) y %= MOD;
b /= 2;
}
return x;
}
static long[] f = new long[100001];
static long InverseEuler(long n, long MOD) {
return pow(n, MOD - 2, MOD);
}
static long C(int n, int r, long MOD) {
return (f[n] * ((InverseEuler(f[r], MOD) * InverseEuler(f[n - r], MOD)) % MOD)) % MOD;
}
public static class SegmentTree {
long[] tree;
long[] lazy;
int n;
public SegmentTree(long[] arr) {
n = arr.length;
tree = new long[arr.length * 5];
lazy = new long[arr.length * 5];
build(arr, 0, arr.length - 1, 0);
}
private void build(long[] arr, int s, int e, int pos) {
if (s == e) {
tree[pos] = arr[s];
return;
}
int m = (s + e) / 2;
build(arr, s, m, 2 * pos + 1);
build(arr, m + 1, e, 2 * pos + 2);
tree
[pos
] = Math.
max(tree
[2 * pos
+ 1], tree
[2 * pos
+ 2]); }
public void update(int s, int e, long val) {
updateUtil(s, e, val, 0, n - 1, 0);
}
public long get(int s, int e) {
return getUtil(s, e, 0, n - 1, 0);
}
private long getUtil(int gs, int ge, int s, int e, int pos) {
if (s
> e
|| s
> ge
|| e
< gs
) return Long.
MIN_VALUE; if (lazy[pos] != 0) {
tree[pos] += lazy[pos];
if (s != e) {
lazy[2 * pos + 1] += lazy[pos];
lazy[2 * pos + 2] += lazy[pos];
}
lazy[pos] = 0;
}
if (s >= gs && e <= ge) {
return tree[pos];
}
int m = (s + e) / 2;
return Math.
max(getUtil
(gs, ge, s, m,
2 * pos
+ 1), getUtil
(gs, ge, m
+ 1, e,
2 * pos
+ 2)); }
private void updateUtil(int us, int ue, long val, int s, int e, int pos) {
if (s > e || s > ue || e < us) return;
if (lazy[pos] != 0) {
tree[pos] += lazy[pos];
if (s != e) {
lazy[2 * pos + 1] += lazy[pos];
lazy[2 * pos + 2] += lazy[pos];
}
lazy[pos] = 0;
}
if (s >= us && e <= ue) {
tree[pos] += val;
if (s != e) {
lazy[2 * pos + 1] += val;
lazy[2 * pos + 2] += val;
}
return;
}
int m = (s + e) / 2;
updateUtil(us, ue, val, s, m, 2 * pos + 1);
updateUtil(us, ue, val, m + 1, e, 2 * pos + 2);
tree
[pos
] = Math.
max(tree
[2 * pos
+ 1], tree
[2 * pos
+ 2]); }
}
static int[] h = {0, 0, -1, 1};
static int[] v = {1, -1, 0, 0};
public static class Pair {
public int x, y, p;
public Pair(int d, int y) {
this.x = d;
this.y = y;
}
}
static long compute_hash
(String s
) { int p = 31;
int m = 1000000007;
long hash_value = 0;
long p_pow = 1;
for (int i = 0; i < s.length(); ++i) {
char c = s.charAt(i);
hash_value = (hash_value + (c - 'a' + 1) * p_pow) % m;
p_pow = (p_pow * p) % m;
}
return hash_value;
}
static int counter = 0;
//https://i...content-available-to-author-only...e.com/ebRGa6
InputReader in
= new InputReader
(System.
in); long t = in.readLong();
int[][] pre = new int[100000+1][17];
int[] tin = new int[100000+1];
int[] tout = new int[100000+1];
int[] xors = new int[100000+1];
while (t-- > 0) {
counter = 0;
int n = in.readInt();
int q = in.readInt();
int[] val = new int[n+1];
for (int i = 1; i <= n; ++i) {
val[i] = in.readInt();
}
List<List<Integer>> tree = new ArrayList<>();
for (int i = 0; i <= n; ++i) {
tree.add(new ArrayList<>());
}
for (int i = 0; i < n - 1; ++i) {
int p = in.readInt();
int r = in.readInt();
tree.get(p).add(r);
tree.get(r ).add(p );
}
preprocess(1, pre, tree, new int[n+1], 0, -1, tin, tout, 0, val, xors);
// for (int i = 0; i < n; ++i) {
// for (int j = 30; j >= 0; --j) {
// System.out.print(pre[i][j] + " ");
// }
// System.out.println("");
// }
while (q-- > 0) {
int s = in.readInt();
int e = in.readInt();
if (e > s) {
int temp = s;
s = e;
e = temp;
}
if (s == e) {
continue;
}
if ((tin[s] <= tin[e] && tout[s] >= tout[e])) {
System.
out.
println(xors
[s
] ^ xors
[e
] ^ val
[s
]); continue;
}
if ((tin[s] >= tin[e] && tout[s] <= tout[e])) {
System.
out.
println(xors
[s
] ^ xors
[e
] ^ val
[e
]); continue;
}
int xor = xors[s];
for (int i = 16; i >= 0; --i) {
if (pre[s][i] != 0) {
if (!(tin[pre[s][i]] <= tin[e] && tout[pre[s][i]] >= tout[e])) {
s = pre[s][i];
}
}
}
// assert(pre[s][0] != -1);
xor = xor ^ xors[e] ^ val[pre[s][0]];
}
}
}
private static void preprocess(int pos, int[][] pre, List<List<Integer>> tree, int[] traverse, int depth, int last, int[] tin, int[] tout, int xor, int[] val, int[] xors) {
tin[pos] = counter++;
xors[pos] = xor ^ val[pos];
traverse[depth] = pos;
for (int i = 0; depth - (1 << i) >= 0; ++i) {
pre[pos][i] = traverse[depth - (1 << i)];
}
for (int i = 0; i < tree.get(pos).size(); ++i) {
if (tree.get(pos).get(i) != last)
preprocess(tree.get(pos).get(i), pre, tree, traverse, depth + 1, pos, tin, tout, xors[pos], val, xors);
}
tout[pos] = counter++;
}
private static long solve(long[][] dp, int n, int r) {
if (n == 0) {
if (r == 0) return 1;
else return 0;
}
if (r <= 0) return 0;
if (dp[n][r] != -1) return dp[n][r];
long answer = 0;
for (int i = 1; i < n; ++i) {
answer += solve(dp, n - 1, r - i);
}
dp[n][r] = answer;
return answer;
}
static int gcd(int a, int b) {
while (b != 0) {
int t = a;
a = b;
b = t % b;
}
return a;
}
class Solution {
public int maxProduct(int[] nums) {
PriorityQueue<Integer> p = new PriorityQueue<>(new Comparator<Integer>() {
@Override
return Integer.
compare(t1, integer
); }
});
for (int i = 0; i < nums.length; ++i) {
p.add(nums[i]);
}
int f = p.remove();
int s = p.remove();
return (f - 1) * (s - 1);
}
}
static boolean submit = true;
if (!submit)
}
static void debug(int s) {
if (!submit)
}
}
CgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLnV0aWwuKjsKCmNsYXNzIFRlc3RDbGFzcyB7CgoKICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dFJlYWRlciB7CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW07CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CiAgICAgICAgcHJpdmF0ZSBpbnQgY3VyQ2hhcjsKICAgICAgICBwcml2YXRlIGludCBudW1DaGFyczsKCiAgICAgICAgcHVibGljIElucHV0UmVhZGVyKElucHV0U3RyZWFtIHN0cmVhbSkgewogICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICBpZiAoY3VyQ2hhciA+PSBudW1DaGFycykgewogICAgICAgICAgICAgICAgY3VyQ2hhciA9IDA7CiAgICAgICAgICAgICAgICBudW1DaGFycyA9IHN0cmVhbS5yZWFkKGJ1Zik7CiAgICAgICAgICAgICAgICBpZiAobnVtQ2hhcnMgPD0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYnVmW2N1ckNoYXIrK107CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgZmluYWwgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICByZXR1cm4gKGludCkgcmVhZExvbmcoKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgaW50IGMgPSByZWFkKCk7CiAgICAgICAgICAgIHdoaWxlIChpc1NwYWNlQ2hhcihjKSkgewogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgICAgIGlmIChjID09IC0xKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChjID09ICctJykgewogICAgICAgICAgICAgICAgbmVnYXRpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb25nIHJlcyA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIHJlcyAqPSAxMDsKICAgICAgICAgICAgICAgIHJlcyArPSBjIC0gJzAnOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfSB3aGlsZSAoIWlzU3BhY2VDaGFyKGMpKTsKICAgICAgICAgICAgcmV0dXJuIG5lZ2F0aXZlID8gLXJlcyA6IHJlczsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmaW5hbCBpbnRbXSByZWFkSW50QXJyYXkoaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgIGludFtdIGFycmF5ID0gbmV3IGludFtzaXplXTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICAgIGFycmF5W2ldID0gcmVhZEludCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBmaW5hbCBsb25nW10gcmVhZExvbmdBcnJheShpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgbG9uZ1tdIGFycmF5ID0gbmV3IGxvbmdbc2l6ZV07CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlYWRMb25nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgaW50IGMgPSByZWFkKCk7CiAgICAgICAgICAgIHdoaWxlIChpc1NwYWNlQ2hhcihjKSkgewogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoKGNoYXIpIGMpOwogICAgICAgICAgICAgICAgYyA9IHJlYWQoKTsKICAgICAgICAgICAgfSB3aGlsZSAoIWlzU3BhY2VDaGFyKGMpKTsKICAgICAgICAgICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BhY2VDaGFyKGludCBjKSB7CiAgICAgICAgICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x0JyB8fCBjID09IC0xOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgbG9uZyBtdWxtb2QobG9uZyBhLCBsb25nIGIsCiAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtb2QpIHsKICAgICAgICBsb25nIHJlcyA9IDA7IC8vIEluaXRpYWxpemUgcmVzdWx0CiAgICAgICAgYSA9IGEgJSBtb2Q7CiAgICAgICAgd2hpbGUgKGIgPiAwKSB7CiAgICAgICAgICAgIC8vIElmIGIgaXMgb2RkLCBhZGQgJ2EnIHRvIHJlc3VsdAogICAgICAgICAgICBpZiAoYiAlIDIgPT0gMSkgewogICAgICAgICAgICAgICAgcmVzID0gKHJlcyArIGEpICUgbW9kOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBNdWx0aXBseSAnYScgd2l0aCAyCiAgICAgICAgICAgIGEgPSAoYSAqIDIpICUgbW9kOwoKICAgICAgICAgICAgLy8gRGl2aWRlIGIgYnkgMgogICAgICAgICAgICBiIC89IDI7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm4gcmVzdWx0CiAgICAgICAgcmV0dXJuIHJlcyAlIG1vZDsKICAgIH0KCiAgICBzdGF0aWMgbG9uZyBwb3cobG9uZyBhLCBsb25nIGIsIGxvbmcgTU9EKSB7CiAgICAgICAgbG9uZyB4ID0gMSwgeSA9IGE7CiAgICAgICAgd2hpbGUgKGIgPiAwKSB7CiAgICAgICAgICAgIGlmIChiICUgMiA9PSAxKSB7CiAgICAgICAgICAgICAgICB4ID0gKHggKiB5KTsKICAgICAgICAgICAgICAgIGlmICh4ID4gTU9EKSB4ICU9IE1PRDsKICAgICAgICAgICAgfQogICAgICAgICAgICB5ID0gKHkgKiB5KTsKICAgICAgICAgICAgaWYgKHkgPiBNT0QpIHkgJT0gTU9EOwogICAgICAgICAgICBiIC89IDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB4OwogICAgfQoKICAgIHN0YXRpYyBsb25nW10gZiA9IG5ldyBsb25nWzEwMDAwMV07CgogICAgc3RhdGljIGxvbmcgSW52ZXJzZUV1bGVyKGxvbmcgbiwgbG9uZyBNT0QpIHsKICAgICAgICByZXR1cm4gcG93KG4sIE1PRCAtIDIsIE1PRCk7CiAgICB9CgogICAgc3RhdGljIGxvbmcgQyhpbnQgbiwgaW50IHIsIGxvbmcgTU9EKSB7CgogICAgICAgIHJldHVybiAoZltuXSAqICgoSW52ZXJzZUV1bGVyKGZbcl0sIE1PRCkgKiBJbnZlcnNlRXVsZXIoZltuIC0gcl0sIE1PRCkpICUgTU9EKSkgJSBNT0Q7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWdtZW50VHJlZSB7CiAgICAgICAgbG9uZ1tdIHRyZWU7CiAgICAgICAgbG9uZ1tdIGxhenk7CiAgICAgICAgaW50IG47CgogICAgICAgIHB1YmxpYyBTZWdtZW50VHJlZShsb25nW10gYXJyKSB7CiAgICAgICAgICAgIG4gPSBhcnIubGVuZ3RoOwogICAgICAgICAgICB0cmVlID0gbmV3IGxvbmdbYXJyLmxlbmd0aCAqIDVdOwogICAgICAgICAgICBsYXp5ID0gbmV3IGxvbmdbYXJyLmxlbmd0aCAqIDVdOwogICAgICAgICAgICBidWlsZChhcnIsIDAsIGFyci5sZW5ndGggLSAxLCAwKTsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCBidWlsZChsb25nW10gYXJyLCBpbnQgcywgaW50IGUsIGludCBwb3MpIHsKICAgICAgICAgICAgaWYgKHMgPT0gZSkgewogICAgICAgICAgICAgICAgdHJlZVtwb3NdID0gYXJyW3NdOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBtID0gKHMgKyBlKSAvIDI7CgogICAgICAgICAgICBidWlsZChhcnIsIHMsIG0sIDIgKiBwb3MgKyAxKTsKICAgICAgICAgICAgYnVpbGQoYXJyLCBtICsgMSwgZSwgMiAqIHBvcyArIDIpOwoKICAgICAgICAgICAgdHJlZVtwb3NdID0gTWF0aC5tYXgodHJlZVsyICogcG9zICsgMV0sIHRyZWVbMiAqIHBvcyArIDJdKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShpbnQgcywgaW50IGUsIGxvbmcgdmFsKSB7CiAgICAgICAgICAgIHVwZGF0ZVV0aWwocywgZSwgdmFsLCAwLCBuIC0gMSwgMCk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgbG9uZyBnZXQoaW50IHMsIGludCBlKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRVdGlsKHMsIGUsIDAsIG4gLSAxLCAwKTsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgbG9uZyBnZXRVdGlsKGludCBncywgaW50IGdlLCBpbnQgcywgaW50IGUsIGludCBwb3MpIHsKICAgICAgICAgICAgaWYgKHMgPiBlIHx8IHMgPiBnZSB8fCBlIDwgZ3MpIHJldHVybiBMb25nLk1JTl9WQUxVRTsKICAgICAgICAgICAgaWYgKGxhenlbcG9zXSAhPSAwKSB7CiAgICAgICAgICAgICAgICB0cmVlW3Bvc10gKz0gbGF6eVtwb3NdOwogICAgICAgICAgICAgICAgaWYgKHMgIT0gZSkgewogICAgICAgICAgICAgICAgICAgIGxhenlbMiAqIHBvcyArIDFdICs9IGxhenlbcG9zXTsKICAgICAgICAgICAgICAgICAgICBsYXp5WzIgKiBwb3MgKyAyXSArPSBsYXp5W3Bvc107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsYXp5W3Bvc10gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzID49IGdzICYmIGUgPD0gZ2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cmVlW3Bvc107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IG0gPSAocyArIGUpIC8gMjsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGdldFV0aWwoZ3MsIGdlLCBzLCBtLCAyICogcG9zICsgMSksIGdldFV0aWwoZ3MsIGdlLCBtICsgMSwgZSwgMiAqIHBvcyArIDIpKTsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVVdGlsKGludCB1cywgaW50IHVlLCBsb25nIHZhbCwgaW50IHMsIGludCBlLCBpbnQgcG9zKSB7CiAgICAgICAgICAgIGlmIChzID4gZSB8fCBzID4gdWUgfHwgZSA8IHVzKSByZXR1cm47CgogICAgICAgICAgICBpZiAobGF6eVtwb3NdICE9IDApIHsKICAgICAgICAgICAgICAgIHRyZWVbcG9zXSArPSBsYXp5W3Bvc107CiAgICAgICAgICAgICAgICBpZiAocyAhPSBlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF6eVsyICogcG9zICsgMV0gKz0gbGF6eVtwb3NdOwogICAgICAgICAgICAgICAgICAgIGxhenlbMiAqIHBvcyArIDJdICs9IGxhenlbcG9zXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhenlbcG9zXSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzID49IHVzICYmIGUgPD0gdWUpIHsKICAgICAgICAgICAgICAgIHRyZWVbcG9zXSArPSB2YWw7CiAgICAgICAgICAgICAgICBpZiAocyAhPSBlKSB7CiAgICAgICAgICAgICAgICAgICAgbGF6eVsyICogcG9zICsgMV0gKz0gdmFsOwogICAgICAgICAgICAgICAgICAgIGxhenlbMiAqIHBvcyArIDJdICs9IHZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaW50IG0gPSAocyArIGUpIC8gMjsKICAgICAgICAgICAgdXBkYXRlVXRpbCh1cywgdWUsIHZhbCwgcywgbSwgMiAqIHBvcyArIDEpOwogICAgICAgICAgICB1cGRhdGVVdGlsKHVzLCB1ZSwgdmFsLCBtICsgMSwgZSwgMiAqIHBvcyArIDIpOwoKICAgICAgICAgICAgdHJlZVtwb3NdID0gTWF0aC5tYXgodHJlZVsyICogcG9zICsgMV0sIHRyZWVbMiAqIHBvcyArIDJdKTsKICAgICAgICB9CgoKICAgIH0KCgogICAgc3RhdGljIGludFtdIGggPSB7MCwgMCwgLTEsIDF9OwogICAgc3RhdGljIGludFtdIHYgPSB7MSwgLTEsIDAsIDB9OwoKCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhaXIgewogICAgICAgIHB1YmxpYyBpbnQgeCwgeSwgcDsKCiAgICAgICAgcHVibGljIFBhaXIoaW50IGQsIGludCB5KSB7CiAgICAgICAgICAgIHRoaXMueCA9IGQ7CiAgICAgICAgICAgIHRoaXMueSA9IHk7CiAgICAgICAgfQoKCiAgICB9CgogICAgc3RhdGljIGxvbmcgY29tcHV0ZV9oYXNoKFN0cmluZyBzKSB7CiAgICAgICAgaW50IHAgPSAzMTsKICAgICAgICBpbnQgbSA9IDEwMDAwMDAwMDc7CiAgICAgICAgbG9uZyBoYXNoX3ZhbHVlID0gMDsKICAgICAgICBsb25nIHBfcG93ID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkgewogICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKICAgICAgICAgICAgaGFzaF92YWx1ZSA9IChoYXNoX3ZhbHVlICsgKGMgLSAnYScgKyAxKSAqIHBfcG93KSAlIG07CiAgICAgICAgICAgIHBfcG93ID0gKHBfcG93ICogcCkgJSBtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaGFzaF92YWx1ZTsKICAgIH0KCiAgICBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIC8vaHR0cHM6Ly9pLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9lYlJHYTYKICAgICAgICBJbnB1dFJlYWRlciBpbiA9IG5ldyBJbnB1dFJlYWRlcihTeXN0ZW0uaW4pOwogICAgICAgIGxvbmcgdCA9IGluLnJlYWRMb25nKCk7CgogICAgICAgICAgICBpbnRbXVtdIHByZSA9IG5ldyBpbnRbMTAwMDAwKzFdWzE3XTsKICAgICAgICAgICAgaW50W10gdGluID0gbmV3IGludFsxMDAwMDArMV07CiAgICAgICAgICAgIGludFtdIHRvdXQgPSBuZXcgaW50WzEwMDAwMCsxXTsKICAgICAgICAgICAgaW50W10geG9ycyA9IG5ldyBpbnRbMTAwMDAwKzFdOwogICAgICAgIHdoaWxlICh0LS0gPiAwKSB7CiAgICAgICAgICAgIGNvdW50ZXIgPSAwOwogICAgICAgICAgICBpbnQgbiA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgaW50IHEgPSBpbi5yZWFkSW50KCk7CgogICAgICAgICAgICBpbnRbXSB2YWwgPSBuZXcgaW50W24rMV07CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47ICsraSkgewogICAgICAgICAgICAgICAgdmFsW2ldID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMaXN0PExpc3Q8SW50ZWdlcj4+IHRyZWUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgICAgICAgICB0cmVlLmFkZChuZXcgQXJyYXlMaXN0PD4oKSk7CiAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChwcmVbaV0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyArK2kpIHsKICAgICAgICAgICAgICAgIGludCBwID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgICAgaW50IHIgPSBpbi5yZWFkSW50KCk7CgogICAgICAgICAgICAgICAgdHJlZS5nZXQocCkuYWRkKHIpOwogICAgICAgICAgICAgICAgdHJlZS5nZXQociApLmFkZChwICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBwcmVwcm9jZXNzKDEsIHByZSwgdHJlZSwgbmV3IGludFtuKzFdLCAwLCAtMSwgdGluLCB0b3V0LCAwLCB2YWwsIHhvcnMpOwovLyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci8vICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAzMDsgaiA+PSAwOyAtLWopIHsKLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQocHJlW2ldW2pdICsgIiAiKTsKLy8gICAgICAgICAgICAgICAgfQovLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwovLyAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHEtLSA+IDApIHsKICAgICAgICAgICAgICAgIGludCBzID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgICAgaW50IGUgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICAgICBpZiAoZSA+IHMpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IHM7CiAgICAgICAgICAgICAgICAgICAgcyA9IGU7CiAgICAgICAgICAgICAgICAgICAgZSA9IHRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHMgPT0gZSkgewogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih2YWxbc10pOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoKHRpbltzXSA8PSB0aW5bZV0gJiYgdG91dFtzXSA+PSB0b3V0W2VdKSkgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b3JzW3NdIF4geG9yc1tlXSBeIHZhbFtzXSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoKHRpbltzXSA+PSB0aW5bZV0gJiYgdG91dFtzXSA8PSB0b3V0W2VdKSkgewogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih4b3JzW3NdIF4geG9yc1tlXSBeIHZhbFtlXSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbnQgeG9yID0geG9yc1tzXTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxNjsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHJlW3NdW2ldICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGluW3ByZVtzXVtpXV0gPD0gdGluW2VdICYmIHRvdXRbcHJlW3NdW2ldXSA+PSB0b3V0W2VdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHByZVtzXVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGFzc2VydChwcmVbc11bMF0gIT0gLTEpOwogICAgICAgICAgICAgICAgeG9yID0geG9yIF4geG9yc1tlXSBeIHZhbFtwcmVbc11bMF1dOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHhvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKCiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwcm9jZXNzKGludCBwb3MsIGludFtdW10gcHJlLCBMaXN0PExpc3Q8SW50ZWdlcj4+IHRyZWUsIGludFtdIHRyYXZlcnNlLCBpbnQgZGVwdGgsIGludCBsYXN0LCBpbnRbXSB0aW4sIGludFtdIHRvdXQsIGludCB4b3IsIGludFtdIHZhbCwgaW50W10geG9ycykgewogICAgICAgIHRpbltwb3NdID0gY291bnRlcisrOwogICAgICAgIHhvcnNbcG9zXSA9IHhvciBeIHZhbFtwb3NdOwogICAgICAgIHRyYXZlcnNlW2RlcHRoXSA9IHBvczsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGRlcHRoIC0gKDEgPDwgaSkgPj0gMDsgKytpKSB7CiAgICAgICAgICAgIHByZVtwb3NdW2ldID0gdHJhdmVyc2VbZGVwdGggLSAoMSA8PCBpKV07CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWUuZ2V0KHBvcykuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgaWYgKHRyZWUuZ2V0KHBvcykuZ2V0KGkpICE9IGxhc3QpCiAgICAgICAgICAgICAgICBwcmVwcm9jZXNzKHRyZWUuZ2V0KHBvcykuZ2V0KGkpLCBwcmUsIHRyZWUsIHRyYXZlcnNlLCBkZXB0aCArIDEsIHBvcywgdGluLCB0b3V0LCB4b3JzW3Bvc10sIHZhbCwgeG9ycyk7CiAgICAgICAgfQogICAgICAgIHRvdXRbcG9zXSA9IGNvdW50ZXIrKzsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBsb25nIHNvbHZlKGxvbmdbXVtdIGRwLCBpbnQgbiwgaW50IHIpIHsKICAgICAgICBpZiAobiA9PSAwKSB7CiAgICAgICAgICAgIGlmIChyID09IDApIHJldHVybiAxOwogICAgICAgICAgICBlbHNlIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAociA8PSAwKSByZXR1cm4gMDsKICAgICAgICBpZiAoZHBbbl1bcl0gIT0gLTEpIHJldHVybiBkcFtuXVtyXTsKICAgICAgICBsb25nIGFuc3dlciA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgYW5zd2VyICs9IHNvbHZlKGRwLCBuIC0gMSwgciAtIGkpOwogICAgICAgIH0KICAgICAgICBkcFtuXVtyXSA9IGFuc3dlcjsKICAgICAgICByZXR1cm4gYW5zd2VyOwogICAgfQoKICAgIHN0YXRpYyBpbnQgZ2NkKGludCBhLCBpbnQgYikgewoKICAgICAgICB3aGlsZSAoYiAhPSAwKSB7CiAgICAgICAgICAgIGludCB0ID0gYTsKICAgICAgICAgICAgYSA9IGI7CiAgICAgICAgICAgIGIgPSB0ICUgYjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgY2xhc3MgU29sdXRpb24gewogICAgICAgIHB1YmxpYyBpbnQgbWF4UHJvZHVjdChpbnRbXSBudW1zKSB7CiAgICAgICAgICAgIFByaW9yaXR5UXVldWU8SW50ZWdlcj4gcCA9IG5ldyBQcmlvcml0eVF1ZXVlPD4obmV3IENvbXBhcmF0b3I8SW50ZWdlcj4oKSB7CiAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShJbnRlZ2VyIGludGVnZXIsIEludGVnZXIgdDEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKHQxLCBpbnRlZ2VyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgcC5hZGQobnVtc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGYgPSBwLnJlbW92ZSgpOwogICAgICAgICAgICBpbnQgcyA9IHAucmVtb3ZlKCk7CiAgICAgICAgICAgIHJldHVybiAoZiAtIDEpICogKHMgLSAxKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGJvb2xlYW4gc3VibWl0ID0gdHJ1ZTsKCiAgICBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgcykgewogICAgICAgIGlmICghc3VibWl0KQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7CiAgICB9CgogICAgc3RhdGljIHZvaWQgZGVidWcoaW50IHMpIHsKICAgICAgICBpZiAoIXN1Ym1pdCkKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwogICAgfQoKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=