#include<bits/stdc++.h> //NeOWami
using namespace std;
#define int long long
#define ft first
#define sc second
using pii = pair<int, int>;
const int N = 2e5 + 5;
int n, q, a[N];
vector<int> G[N];
struct query {
int x, y, w;
} Q[N];
namespace sub1 {
int par[N], h[N];
void dfs(int u, int pre) {
for (int v: G[u]) if (v != pre) {
h[v] = h[u] + 1;
par[v] = u;
dfs(v, u);
}
}
void solve() {
par[1] = 1;
dfs(1, 1);
for (int t = 1; t <= q; t++) {
int x = Q[t].x, y = Q[t].y, w = Q[t].w;
while(x != y) {
if (h[x] < h[y]) swap(x, y);
a[x] %= w;
x = par[x];
}
a[x] %= w;
int ans = 0;
for (int i = 1; i <= n; i++) ans = ans + (a[i] % t);
cout << ans << "\n";
}
}
}///
bool checkLine() {
for (int u = 1; u < n; u++) {
bool flag = 0;
for (int v: G[u]) if (v == u + 1) flag = 1;
if (flag == 0) return 0;
}
return 1;
}
namespace sub2 {
bool checksub() {
if (!checkLine()) return 0;
for (int i = 1; i <= n; i++) if (a[i] > 2) return 0;
return 1;
}
int st[N * 4][3], on[N * 4][3];
vector<int> lz[N * 4];
void build(int id, int l, int r) {
if (l == r) {
st[id][a[l]]++;
lz[id].clear();
return;
}
int mid = l +r >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
for (int i = 0; i <= 2; i++) {
st[id][i] = st[id * 2][i] + st[id * 2 + 1][i];
}
lz[id].clear();
}
void down(int id) {
if (lz[id].size()) {
for (int t: lz[id]) {
int cntNew[3] = {0, 0, 0};
if (!on[id * 2][t]) {
for (int i = 0; i <= 2; i++) cntNew[i % t] += st[id * 2][i];
for (int i = 0; i <= 2; i++) st[id * 2][i] = cntNew[i];
lz[id * 2].push_back(t);
on[id * 2][t] = 1;
}
cntNew[0] = cntNew[1] = cntNew[2] = 0;
if (!on[id * 2 + 1][t]) {
for (int i = 0; i <= 2; i++) cntNew[i % t] += st[id * 2 + 1][i];
for (int i = 0; i <= 2; i++) st[id * 2 + 1][i] = cntNew[i];
lz[id * 2 + 1].push_back(t);
on[id * 2 + 1][t] = 1;
}
}
lz[id].clear();
}
}
void update(int id, int l, int r, int u, int v, int t) {
if (l > v|| r < u) return;
if (l >= u && r <= v) {
if (!on[id][t]) {
int cntNew[3] = {0, 0, 0};
for (int i = 0; i <= 2; i++) cntNew[i % t] += st[id][i];
for (int i = 0; i <= 2; i++) st[id][i] = cntNew[i];
lz[id].push_back(t);
on[id][t] = 1;
}
return;
}
down(id);
int mid = l + r >> 1;
update(id * 2, l, mid, u, v, t);
update(id * 2 + 1, mid + 1, r, u, v, t);
for (int i = 0; i <= 2; i++) st[id][i] = st[id * 2][i] + st[id * 2 + 1][i];
}
void solve() {
build(1, 1, n);
for (int t = 1; t <= q; t++) {
int x = Q[t].x, y = Q[t].y, w = Q[t].w;
if (x > y) swap(x, y);
if (w <= 2) update(1, 1, n, x, y, w);
int ans = 0;
for (int i = 1; i <= 2; i++) ans = ans + (i % t) * st[1][i];
cout << ans << "\n";
}
}
}///
int bit[N], bit2[N];
inline void update(int id, int t, int bit[]) {
if (id == 0) return;
for (; id < N; id += id &- id) bit[id] += t;
}
inline int get(int id, int bit[]) {
int ans = 0;
for (; id > 0; id -= id &- id) ans = ans + bit[id];
return ans;
}
inline int getrange(int l, int r, int bit[]) {
return get(r, bit) - get(l - 1, bit);
}
namespace sub3 {
bool checksub() {
if (!checkLine()) return 0;
for (int i =1; i <= q; i++) if (Q[i].x != Q[i].y) return 0;
return 1;
}
void solve() {
for (int i =1 ; i <= n; i++) {
update(a[i], 1, bit);
update(a[i], a[i], bit2);
}
for (int t = 1; t <= q; t++) {
int x = Q[t].x, y = Q[t].y, w = Q[t].w;
// cerr << t << ": " << x << " " << y << " " << w << "\n";
update(a[x], -1, bit);
update(a[x], -a[x], bit2);
a[x] %= w;
update(a[x], 1, bit);
update(a[x], a[x], bit2);
if (t == 1) {
cout << "0\n";
continue;
}
int ans = 0;
for (int l = 0; l < N; l += t) {
int r = min(N - 1, l + (t - 1));
// cerr << t << " " << l << " " << r << " -> " << "\n";
int all = getrange(l, r, bit2);
int del = l * getrange(l, r, bit);
ans = (ans + all - del);
// cerr << t << " " << l << " " << r << " -> " << all - del << "\n";
}
cout << ans << "\n";
}
}
}///
namespace subcan {
int par[N], h[N];
void dfs(int u, int pre) {
for (int v: G[u]) if (v != pre) {
h[v] = h[u] + 1;
par[v] = u;
dfs(v, u);
}
}
void solve() {
par[1] = 1;
dfs(1, 1);
for (int i =1 ; i <= n; i++) {
update(a[i], 1, bit);
update(a[i], a[i], bit2);
}
for (int t = 1; t <= q; t++) {
int x = Q[t].x, y = Q[t].y, w = Q[t].w;
// cerr << t << ": " << x << " " << y << " " << w << "\n";
while(x != y) {
if (h[x] < h[y]) swap(x, y);
if (a[x] >= w) {
update(a[x], -1, bit);
update(a[x], -a[x], bit2);
a[x] %= w;
update(a[x], 1, bit);
update(a[x], a[x], bit2);
}
x = par[x];
}
if (a[x] >= w) {
update(a[x], -1, bit);
update(a[x], -a[x], bit2);
a[x] %= w;
update(a[x], 1, bit);
update(a[x], a[x], bit2);
}
if (t == 1) {
cout << "0\n";
continue;
}
int ans = 0;
for (int l = 0; l < N; l += t) {
int r = min(N - 1, l + (t - 1));
// cerr << t << " " << l << " " << r << " -> " << "\n";
int all = getrange(l, r, bit2);
int del = l * getrange(l, r, bit);
ans = (ans + all - del);
// cerr << t << " " << l << " " << r << " -> " << all - del << "\n";
}
cout << ans << "\n";
}
}
}///
signed main() {
cin.tie(NULL)->sync_with_stdio(false); cout.tie(NULL);
if (ifstream("PINE.inp")) {
freopen("PINE.inp", "r", stdin);
freopen("PINE.out", "w", stdout);
}
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i =1 ; i < n; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= q; i++) {
int x, y, w; cin >> x >> y >> w;
Q[i] = {x, y, w};
}
if (n <= 5000 && q <= 5000) return sub1::solve(), 0;
if (sub2::checksub()) return sub2::solve(), 0;
if (sub3::checksub()) return sub3::solve(), 0;
if (n * q <= 100000000) return sub1::solve(), 0;
return subcan::solve(), 0;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4gLy9OZU9XYW1pCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBmdCBmaXJzdAojZGVmaW5lIHNjIHNlY29uZAp1c2luZyBwaWkgPSBwYWlyPGludCwgaW50PjsKY29uc3QgaW50IE4gPSAyZTUgKyA1OwppbnQgbiwgcSwgYVtOXTsKdmVjdG9yPGludD4gR1tOXTsKc3RydWN0IHF1ZXJ5IHsKICAgIGludCB4LCB5LCB3Owp9IFFbTl07CgpuYW1lc3BhY2Ugc3ViMSB7CmludCBwYXJbTl0sIGhbTl07CnZvaWQgZGZzKGludCB1LCBpbnQgcHJlKSB7CiAgICBmb3IgKGludCB2OiBHW3VdKSBpZiAodiAhPSBwcmUpIHsKICAgICAgICBoW3ZdID0gaFt1XSArIDE7CiAgICAgICAgcGFyW3ZdID0gdTsKICAgICAgICBkZnModiwgdSk7CiAgICB9Cn0Kdm9pZCBzb2x2ZSgpIHsKICAgIHBhclsxXSA9IDE7CiAgICBkZnMoMSwgMSk7CiAgICBmb3IgKGludCB0ID0gMTsgdCA8PSBxOyB0KyspIHsKICAgICAgICBpbnQgeCA9IFFbdF0ueCwgeSA9IFFbdF0ueSwgdyA9IFFbdF0udzsKICAgICAgICB3aGlsZSh4ICE9IHkpIHsKICAgICAgICAgICAgaWYgKGhbeF0gPCBoW3ldKSBzd2FwKHgsIHkpOwogICAgICAgICAgICBhW3hdICU9IHc7CiAgICAgICAgICAgIHggPSBwYXJbeF07CiAgICAgICAgfQogICAgICAgIGFbeF0gJT0gdzsKICAgICAgICBpbnQgYW5zID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFucyA9IGFucyArIChhW2ldICUgdCk7CiAgICAgICAgY291dCA8PCBhbnMgPDwgIlxuIjsKICAgIH0KfQp9Ly8vCgpib29sIGNoZWNrTGluZSgpIHsKICAgIGZvciAoaW50IHUgPSAxOyB1IDwgbjsgdSsrKSB7CiAgICAgICAgYm9vbCBmbGFnID0gMDsKICAgICAgICBmb3IgKGludCB2OiBHW3VdKSBpZiAodiA9PSB1ICsgMSkgZmxhZyA9IDE7CiAgICAgICAgaWYgKGZsYWcgPT0gMCkgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKbmFtZXNwYWNlIHN1YjIgewpib29sIGNoZWNrc3ViKCkgewogICAgaWYgKCFjaGVja0xpbmUoKSkgcmV0dXJuIDA7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGlmIChhW2ldID4gMikgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQppbnQgc3RbTiAqIDRdWzNdLCBvbltOICogNF1bM107CnZlY3RvcjxpbnQ+IGx6W04gKiA0XTsKdm9pZCBidWlsZChpbnQgaWQsIGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPT0gcikgewogICAgICAgIHN0W2lkXVthW2xdXSsrOwogICAgICAgIGx6W2lkXS5jbGVhcigpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBtaWQgPSBsICtyICA+PiAxOwogICAgYnVpbGQoaWQgKiAyLCBsLCBtaWQpOwogICAgYnVpbGQoaWQgKiAyICsgMSwgbWlkICsgMSwgcik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIHsKICAgICAgICBzdFtpZF1baV0gPSBzdFtpZCAqIDJdW2ldICsgc3RbaWQgKiAyICsgMV1baV07CiAgICB9CiAgICBseltpZF0uY2xlYXIoKTsKfQp2b2lkIGRvd24oaW50IGlkKSB7CiAgICBpZiAobHpbaWRdLnNpemUoKSkgewogICAgICAgIGZvciAoaW50IHQ6IGx6W2lkXSkgewogICAgICAgICAgICBpbnQgY250TmV3WzNdID0gezAsIDAsIDB9OwogICAgICAgICAgICBpZiAoIW9uW2lkICogMl1bdF0pIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDI7IGkrKykgY250TmV3W2kgJSB0XSArPSBzdFtpZCAqIDJdW2ldOwogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMjsgaSsrKSBzdFtpZCAqIDJdW2ldID0gY250TmV3W2ldOwogICAgICAgICAgICAgICAgbHpbaWQgKiAyXS5wdXNoX2JhY2sodCk7CiAgICAgICAgICAgICAgICBvbltpZCAqIDJdW3RdID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbnROZXdbMF0gPSBjbnROZXdbMV0gPSBjbnROZXdbMl0gPSAwOwogICAgICAgICAgICBpZiAoIW9uW2lkICogMiArIDFdW3RdKSB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIGNudE5ld1tpICUgdF0gKz0gc3RbaWQgKiAyICsgMV1baV07CiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIHN0W2lkICogMiArIDFdW2ldID0gY250TmV3W2ldOwogICAgICAgICAgICAgICAgbHpbaWQgKiAyICsgMV0ucHVzaF9iYWNrKHQpOwogICAgICAgICAgICAgICAgb25baWQgKiAyICsgMV1bdF0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGx6W2lkXS5jbGVhcigpOwogICAgfQp9CnZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCB0KSB7CiAgICBpZiAobCA+IHZ8fCByIDwgdSkgcmV0dXJuOwogICAgaWYgKGwgPj0gdSAmJiByIDw9IHYpIHsKICAgICAgICBpZiAoIW9uW2lkXVt0XSkgewogICAgICAgICAgICBpbnQgY250TmV3WzNdID0gezAsIDAsIDB9OwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIGNudE5ld1tpICUgdF0gKz0gc3RbaWRdW2ldOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIHN0W2lkXVtpXSA9IGNudE5ld1tpXTsKICAgICAgICAgICAgbHpbaWRdLnB1c2hfYmFjayh0KTsKICAgICAgICAgICAgb25baWRdW3RdID0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZG93bihpZCk7CiAgICBpbnQgbWlkID0gbCArIHIgPj4gMTsKICAgIHVwZGF0ZShpZCAqIDIsIGwsIG1pZCwgdSwgdiwgdCk7CiAgICB1cGRhdGUoaWQgKiAyICsgMSwgbWlkICsgMSwgciwgdSwgdiwgdCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIHN0W2lkXVtpXSA9IHN0W2lkICogMl1baV0gKyBzdFtpZCAqIDIgKyAxXVtpXTsKfQp2b2lkIHNvbHZlKCkgewogICAgYnVpbGQoMSwgMSwgbik7CiAgICBmb3IgKGludCB0ID0gMTsgdCA8PSBxOyB0KyspIHsKICAgICAgICBpbnQgeCA9IFFbdF0ueCwgeSA9IFFbdF0ueSwgdyA9IFFbdF0udzsKICAgICAgICBpZiAoeCA+IHkpIHN3YXAoeCwgeSk7CiAgICAgICAgaWYgKHcgPD0gMikgdXBkYXRlKDEsIDEsIG4sIHgsIHksIHcpOwogICAgICAgIGludCBhbnMgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykgYW5zID0gYW5zICsgKGkgJSB0KSAqIHN0WzFdW2ldOwogICAgICAgIGNvdXQgPDwgYW5zIDw8ICJcbiI7CiAgICB9Cn0KfS8vLwppbnQgYml0W05dLCBiaXQyW05dOwppbmxpbmUgdm9pZCB1cGRhdGUoaW50IGlkLCBpbnQgdCwgaW50IGJpdFtdKSB7CiAgICBpZiAoaWQgPT0gMCkgcmV0dXJuOwogICAgZm9yICg7IGlkIDwgTjsgaWQgKz0gaWQgJi0gaWQpIGJpdFtpZF0gKz0gdDsKfQppbmxpbmUgaW50IGdldChpbnQgaWQsIGludCBiaXRbXSkgewogICAgaW50IGFucyA9IDA7CiAgICBmb3IgKDsgaWQgPiAwOyBpZCAtPSBpZCAmLSBpZCkgYW5zID0gYW5zICsgYml0W2lkXTsKICAgIHJldHVybiBhbnM7Cn0KaW5saW5lIGludCBnZXRyYW5nZShpbnQgbCwgaW50IHIsIGludCBiaXRbXSkgewogICAgcmV0dXJuIGdldChyLCBiaXQpIC0gZ2V0KGwgLSAxLCBiaXQpOwp9CgpuYW1lc3BhY2Ugc3ViMyB7CmJvb2wgY2hlY2tzdWIoKSB7CiAgICBpZiAoIWNoZWNrTGluZSgpKSByZXR1cm4gMDsKICAgIGZvciAoaW50IGkgPTE7IGkgPD0gcTsgaSsrKSBpZiAoUVtpXS54ICE9IFFbaV0ueSkgcmV0dXJuIDA7CiAgICByZXR1cm4gMTsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIGZvciAoaW50IGkgPTEgOyBpIDw9IG47IGkrKykgewogICAgICAgIHVwZGF0ZShhW2ldLCAxLCBiaXQpOwogICAgICAgIHVwZGF0ZShhW2ldLCBhW2ldLCBiaXQyKTsKICAgIH0KICAgIGZvciAoaW50IHQgPSAxOyB0IDw9IHE7IHQrKykgewogICAgICAgIGludCB4ID0gUVt0XS54LCB5ID0gUVt0XS55LCB3ID0gUVt0XS53OwovLyAgICAgICAgY2VyciA8PCB0IDw8ICI6ICIgPDwgeCA8PCAiICIgPDwgeSA8PCAiICIgPDwgdyA8PCAiXG4iOwogICAgICAgIHVwZGF0ZShhW3hdLCAtMSwgYml0KTsKICAgICAgICB1cGRhdGUoYVt4XSwgLWFbeF0sIGJpdDIpOwogICAgICAgIGFbeF0gJT0gdzsKICAgICAgICB1cGRhdGUoYVt4XSwgMSwgYml0KTsKICAgICAgICB1cGRhdGUoYVt4XSwgYVt4XSwgYml0Mik7CiAgICAgICAgaWYgKHQgPT0gMSkgewogICAgICAgICAgICBjb3V0IDw8ICIwXG4iOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaW50IGFucyA9IDA7CiAgICAgICAgZm9yIChpbnQgbCA9IDA7IGwgPCBOOyBsICs9IHQpIHsKICAgICAgICAgICAgaW50IHIgPSBtaW4oTiAtIDEsIGwgKyAodCAtIDEpKTsKLy8gICAgICAgICAgICBjZXJyIDw8IHQgPDwgIiAiIDw8IGwgPDwgIiAiIDw8IHIgPDwgIiAtPiAiIDw8ICJcbiI7CiAgICAgICAgICAgIGludCBhbGwgPSBnZXRyYW5nZShsLCByLCBiaXQyKTsKICAgICAgICAgICAgaW50IGRlbCA9IGwgKiBnZXRyYW5nZShsLCByLCBiaXQpOwogICAgICAgICAgICBhbnMgPSAoYW5zICsgYWxsIC0gZGVsKTsKLy8gICAgICAgICAgICBjZXJyIDw8IHQgPDwgIiAiIDw8IGwgPDwgIiAiIDw8IHIgPDwgIiAtPiAiIDw8IGFsbCAtIGRlbCA8PCAiXG4iOwogICAgICAgIH0KICAgICAgICBjb3V0IDw8IGFucyA8PCAiXG4iOwogICAgfQp9Cn0vLy8KCgpuYW1lc3BhY2Ugc3ViY2FuIHsKaW50IHBhcltOXSwgaFtOXTsKdm9pZCBkZnMoaW50IHUsIGludCBwcmUpIHsKICAgIGZvciAoaW50IHY6IEdbdV0pIGlmICh2ICE9IHByZSkgewogICAgICAgIGhbdl0gPSBoW3VdICsgMTsKICAgICAgICBwYXJbdl0gPSB1OwogICAgICAgIGRmcyh2LCB1KTsKICAgIH0KfQoKdm9pZCBzb2x2ZSgpIHsKICAgIHBhclsxXSA9IDE7CiAgICBkZnMoMSwgMSk7CiAgICBmb3IgKGludCBpID0xIDsgaSA8PSBuOyBpKyspIHsKICAgICAgICB1cGRhdGUoYVtpXSwgMSwgYml0KTsKICAgICAgICB1cGRhdGUoYVtpXSwgYVtpXSwgYml0Mik7CiAgICB9CiAgICBmb3IgKGludCB0ID0gMTsgdCA8PSBxOyB0KyspIHsKICAgICAgICBpbnQgeCA9IFFbdF0ueCwgeSA9IFFbdF0ueSwgdyA9IFFbdF0udzsKLy8gICAgICAgIGNlcnIgPDwgdCA8PCAiOiAiIDw8IHggPDwgIiAiIDw8IHkgPDwgIiAiIDw8IHcgPDwgIlxuIjsKCgogICAgICAgIHdoaWxlKHggIT0geSkgewogICAgICAgICAgICBpZiAoaFt4XSA8IGhbeV0pIHN3YXAoeCwgeSk7CiAgICAgICAgICAgIGlmIChhW3hdID49IHcpIHsKICAgICAgICAgICAgICAgIHVwZGF0ZShhW3hdLCAtMSwgYml0KTsKICAgICAgICAgICAgICAgIHVwZGF0ZShhW3hdLCAtYVt4XSwgYml0Mik7CiAgICAgICAgICAgICAgICBhW3hdICU9IHc7CiAgICAgICAgICAgICAgICB1cGRhdGUoYVt4XSwgMSwgYml0KTsKICAgICAgICAgICAgICAgIHVwZGF0ZShhW3hdLCBhW3hdLCBiaXQyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB4ID0gcGFyW3hdOwogICAgICAgIH0KICAgICAgICBpZiAoYVt4XSA+PSB3KSB7CiAgICAgICAgICAgIHVwZGF0ZShhW3hdLCAtMSwgYml0KTsKICAgICAgICAgICAgdXBkYXRlKGFbeF0sIC1hW3hdLCBiaXQyKTsKICAgICAgICAgICAgYVt4XSAlPSB3OwogICAgICAgICAgICB1cGRhdGUoYVt4XSwgMSwgYml0KTsKICAgICAgICAgICAgdXBkYXRlKGFbeF0sIGFbeF0sIGJpdDIpOwogICAgICAgIH0KICAgICAgICBpZiAodCA9PSAxKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIjBcbiI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpbnQgYW5zID0gMDsKICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IE47IGwgKz0gdCkgewogICAgICAgICAgICBpbnQgciA9IG1pbihOIC0gMSwgbCArICh0IC0gMSkpOwovLyAgICAgICAgICAgIGNlcnIgPDwgdCA8PCAiICIgPDwgbCA8PCAiICIgPDwgciA8PCAiIC0+ICIgPDwgIlxuIjsKICAgICAgICAgICAgaW50IGFsbCA9IGdldHJhbmdlKGwsIHIsIGJpdDIpOwogICAgICAgICAgICBpbnQgZGVsID0gbCAqIGdldHJhbmdlKGwsIHIsIGJpdCk7CiAgICAgICAgICAgIGFucyA9IChhbnMgKyBhbGwgLSBkZWwpOwovLyAgICAgICAgICAgIGNlcnIgPDwgdCA8PCAiICIgPDwgbCA8PCAiICIgPDwgciA8PCAiIC0+ICIgPDwgYWxsIC0gZGVsIDw8ICJcbiI7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgYW5zIDw8ICJcbiI7CiAgICB9Cgp9Cn0vLy8KCnNpZ25lZCBtYWluKCkgewogICAgY2luLnRpZShOVUxMKS0+c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY291dC50aWUoTlVMTCk7CiAgICBpZiAoaWZzdHJlYW0oIlBJTkUuaW5wIikpIHsKICAgICAgICBmcmVvcGVuKCJQSU5FLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIlBJTkUub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgY2luID4+IG4gPj4gcTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07CiAgICBmb3IgKGludCBpID0xIDsgaSA8IG47IGkrKykgewogICAgICAgIGludCB1LCB2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIEdbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIEdbdl0ucHVzaF9iYWNrKHUpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKSB7CiAgICAgICAgaW50IHgsIHksIHc7IGNpbiA+PiB4ID4+IHkgPj4gdzsKICAgICAgICBRW2ldID0ge3gsIHksIHd9OwogICAgfQogICAgaWYgKG4gPD0gNTAwMCAmJiBxIDw9IDUwMDApIHJldHVybiBzdWIxOjpzb2x2ZSgpLCAwOwogICAgaWYgKHN1YjI6OmNoZWNrc3ViKCkpIHJldHVybiBzdWIyOjpzb2x2ZSgpLCAwOwogICAgaWYgKHN1YjM6OmNoZWNrc3ViKCkpIHJldHVybiBzdWIzOjpzb2x2ZSgpLCAwOwogICAgaWYgKG4gKiBxIDw9IDEwMDAwMDAwMCkgcmV0dXJuIHN1YjE6OnNvbHZlKCksIDA7CiAgICByZXR1cm4gc3ViY2FuOjpzb2x2ZSgpLCAwOwogICAgcmV0dXJuIDA7Cn0K