#include <bits/stdc++.h>
using namespace std;
#define ll long long int
#define endl "\n"
// Use mult64() if the number fits in 64 bits, otherwise change all to mult128() (slower)
inline ll mult64(const ll &a, const ll &b, const ll &mod)
{
return [&]() -> ll
{
return mod > INT32_MAX ? (ll)((__int128_t)(a)*b % mod) : (long long)(a)*b % mod;
}();
}
namespace bigNumber
{
using u128 = __uint128_t;
// ---------- 64-bit limb helpers (fast) ----------
static inline void mult64(uint64_t a, uint64_t b, uint64_t &lo, uint64_t &hi)
{
__uint128_t p = (__uint128_t)a * b;
lo = (uint64_t)p;
hi = (uint64_t)(p >> 64);
}
static inline uint64_t add64(uint64_t a, uint64_t b, uint64_t &carry)
{
__uint128_t s = (__uint128_t)a + b + carry;
carry = (uint64_t)(s >> 64);
return (uint64_t)s;
}
// Fallback generic (slow): kept for setup (e.g., computing R^2 mod N once)
u128 mult128(u128 a, u128 b, u128 mod)
{
u128 result = 0;
for (a %= mod; b > 0; a <<= 1, b >>= 1)
{
a >= mod ? a -= mod : 0;
if (b & 1)
result += a, result >= mod ? result -= mod : 0;
}
return result;
}
// ---------- Montgomery (CIOS, 2x64-bit limbs) ----------
// Compute n0' = -N^{-1} mod 2^64 (low limb only)
static inline uint64_t inv64_2k(uint64_t n0)
{
uint64_t x = 1; // initial approx
for (int i = 6; i > 0; i--)
x = (__uint128_t)x * (2 - (__uint128_t)n0 * x);
return x; // x ≡ n0^{-1}
}
inline pair<u128, u128> montModInv(u128 N)
{
return {0, (u128)(0 - inv64_2k(N))};
}
// Fast Montgomery multiplication: returns a*b*R^{-1} mod N, where R=2^128
inline u128 montMult(u128 a, u128 b, u128 N, u128 N_n0prime)
{
uint64_t n0 = (uint64_t)N, n1 = (uint64_t)(N >> 64);
uint64_t a0 = (uint64_t)a, a1 = (uint64_t)(a >> 64);
uint64_t b0 = (uint64_t)b, b1 = (uint64_t)(b >> 64);
uint64_t n0p = (uint64_t)N_n0prime;
uint64_t t0 = 0, t1 = 0, t2 = 0;
auto round_step = [&](uint64_t ai)
{
uint64_t lo, hi, carry;
// t += ai * b
mult64(ai, b0, lo, hi);
carry = 0;
t0 = add64(t0, lo, carry);
t1 = add64(t1, hi, carry);
t2 = add64(t2, 0, carry);
mult64(ai, b1, lo, hi);
carry = 0;
t1 = add64(t1, lo, carry);
t2 = add64(t2, hi, carry);
// m = t0 * n0' (mod 2^64)
uint64_t m = (uint64_t)((__uint128_t)t0 * n0p);
// t += m * N
mult64(m, n0, lo, hi);
carry = 0;
t0 = add64(t0, lo, carry);
t1 = add64(t1, hi, carry);
t2 = add64(t2, 0, carry);
mult64(m, n1, lo, hi);
carry = 0;
t1 = add64(t1, lo, carry);
t2 = add64(t2, hi, carry);
// shift by one limb
t0 = t1;
t1 = t2;
t2 = 0;
};
round_step(a0);
round_step(a1);
__uint128_t res = (((__uint128_t)t1 << 64) | t0);
if (res >= N)
res -= N;
return (u128)res;
}
}
using namespace bigNumber;
template <typename T>
inline T F(T x, T c, T mod, T inv) // Pollard-rho function
{
x = montMult(x, x, mod, inv);
x = x >= mod - c ? x - mod + c : x + c;
return x;
}
template <typename T>
inline T __abs(T N)
{
if (N < 0)
return -N;
return N;
}
template <typename T>
T Pollard_Brent(T N)
{
if (!(N & 1))
return 2;
// Random Number Linear Congruential Generator MMIX from D.E. Knuth
static u128 rng = 0xdeafbeefff;
uint64_t a = rng * 6364136223846793005ull + 1442695040888963407ull;
uint64_t b = a * 6364136223846793005ull + 1442695040888963407ull;
rng = (a + b) ^ (a * b);
T X0 = 1 + a % (N - 1);
T C = 1 + b % (N - 1);
T X = X0; // X1
T gcdVal = 1;
T q = 1;
T Xs, Xt;
T m = 128;
u128 inv = montModInv(N).second;
T L = 1;
while (gcdVal == 1)
{
Xt = X;
for (size_t i = 1; i < L; i++)
X = F(X, C, N, inv);
int k = 0;
while (k < L && gcdVal == 1)
{
Xs = X;
for (size_t i = 0; i < m && i < L - k; i++)
{
X = F(X, C, N, inv);
q = montMult(q, Xt > X ? Xt - X : X - Xt, N, inv);
}
gcdVal = __gcd(q, N);
k += m;
}
L += L;
}
if (gcdVal == N) // Failure
{
do
{
Xs = F(Xs, C, N, inv);
gcdVal = __gcd(Xs > Xt ? Xs - Xt : Xt - Xs, N);
} while (gcdVal == 1);
}
return gcdVal;
}
template <typename T>
T modPow(T N, T power, T mod)
{
if (N % mod == 0 || N == 0)
return 0;
if (N == 1 || power == 0)
return 1;
T res{1};
while (power)
{
if (power & 1)
res = mult64(res, N, mod);
N = mult64(N, N, mod);
power >>= 1;
}
return res;
}
template <typename T>
bool isPrime(T N)
{
if (N < 2 || N % 6 % 4 != 1)
return (N | 1) == 3;
T d = N - 1;
int s{};
while (!(d & 1))
d >>= 1, ++s;
for (const T &a : {2, 325, 9375, 28178, 450775, 9780504, 1795265022})
{
T p = modPow(a % N, d, N), i = s;
while (p != 1 && p != N - 1 && a % N && i--)
p = mult64(p, p, N);
if (p != N - 1 && i != s)
return false;
}
return true;
}
template <typename T>
void primeFactorize(T N, map<T, T> &primeFactors)
{
if (N == 1)
return;
if (!isPrime(N))
{
T Y = Pollard_Brent(N);
primeFactorize(Y, primeFactors);
primeFactorize(N / Y, primeFactors);
}
else
{
primeFactors[N]++;
return;
}
}
template <typename T>
void getAllFactors(T N, vector<T> &factors)
{
factors = {1};
map<T, T> freq;
primeFactorize(N, freq);
for (auto &[p, cnt] : freq)
{
vector<T> temp;
T pw = 1;
for (int i = 0; i <= cnt; i++, pw *= p)
{
for (const T &f : factors)
temp.push_back(f * pw);
}
factors.swap(temp);
}
sort(factors.begin(), factors.end());
}
template <typename T>
T countDivisors(T N)
{
map<T, T> primeFactors;
primeFactorize(N, primeFactors);
T ans{1};
for (const auto &[p, exp] : primeFactors)
ans *= (exp + 1);
return ans;
}
// GCC's implementation for I/O of 128-bit integers
using int128 = signed __int128;
using uint128 = unsigned __int128;
namespace int128_io
{
inline auto char_to_digit(int chr)
{
return static_cast<int>(isalpha(chr) ? 10 + tolower(chr) - 'a' : chr - '0');
}
inline auto digit_to_char(int digit)
{
return static_cast<char>(digit > 9 ? 'a' + digit - 10 : '0' + digit);
}
template <class integer>
inline auto to_int(const std::string &str, size_t *idx = nullptr, int base = 10)
{
size_t i = idx != nullptr ? *idx : 0;
const auto n = str.size();
const auto neg = str[i] == '-';
integer num = 0;
if (neg)
++i;
while (i < n)
num *= base, num += char_to_digit(str[i++]);
if (idx != nullptr)
*idx = i;
return neg ? -num : num;
}
template <class integer>
inline auto to_string(integer num, int base = 10)
{
const auto neg = num < 0;
std::string str;
if (neg)
num = -num;
do
str += digit_to_char(num % base), num /= base;
while (num > 0);
if (neg)
str += '-';
std::reverse(str.begin(), str.end());
return str;
}
inline auto next_str(std::istream &stream)
{
std::string str;
stream >> str;
return str;
}
template <class integer>
inline auto &read(std::istream &stream, integer &num)
{
num = to_int<integer>(next_str(stream));
return stream;
}
template <class integer>
inline auto &write(std::ostream &stream, integer num) { return stream << to_string(num); }
}
inline auto &operator>>(istream &stream, int128 &num) { return int128_io::read(stream, num); }
inline auto &operator<<(ostream &stream, int128 num) { return int128_io::write(stream, num); }
inline auto &operator>>(istream &stream, uint128 &num) { return int128_io::read(stream, num); }
inline auto &operator<<(ostream &stream, uint128 num) { return int128_io::write(stream, num); }
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("Output.txt", "w", stdout);
#endif //! ONLINE_JUDGE
int t = 1;
// cin >> t;
while (t--)
{
int n, m, q;
cin >> n >> m >> q;
vector<ll> a(n), b(m);
ll sumA{}, sumB{};
bitset<400001> inA, inB;
auto adjust = [&](ll N)
{
return N + 200000; // An offset to make all numbers positive
};
for (int i{}; i < n; i++)
cin >> a[i], sumA += a[i], inA[adjust(a[i])] = 1;
for (int j{}; j < m; j++)
cin >> b[j], sumB += b[j], inB[adjust(b[j])] = 1;
/*
(a1 * b1 + a1 * b2 ... a1 * bm)
(a2 * b1 + a2 * b2 ... a2 * bm)
...
...
Take ai as a common factor of each row, you get:
ai * sumB
Accumulate columns, you get:
a1 * sumB + a2 * sumB + a3 * sumB ... + an * sumB
Take sumB as a common factor, you get:
sum of matrix = B = sumA * sumB
After any operation:
x = (sumA - ai) * (sumB - bj)
Factorize x, x = f * d
sumA - ai = f
ai = sumA - f
We need to check that (sumA - f) and (sumB - d) both exists
*/
auto findInA = [&](ll x)
{
x = adjust(x);
return (x >= 0 && x <= 400000 && inA[x]);
};
auto findInB = [&](ll x)
{
x = adjust(x);
return (x >= 0 && x <= 400000 && inB[x]);
};
while (q--)
{
ll x;
cin >> x;
bool ok = false;
vector<u128> vc;
getAllFactors(u128(__abs(x)), vc);
for (const ll &d : vc)
{
// x = (SumB − b[j]) ⋅ (SumA − a[i])
ll f1 = d;
ll f2 = x / d;
ok |= (findInA(sumA - f1) && findInB(sumB - f2));
ok |= (findInA(sumA - f2) && findInB(sumB - f1));
f1 *= -1, f2 *= -1;
ok |= (findInA(sumA - f1) && findInB(sumB - f2));
ok |= (findInA(sumA - f2) && findInB(sumB - f1));
}
if (ok)
cout << "YES\n";
else
cout << "NO\n";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludAojZGVmaW5lIGVuZGwgIlxuIgoKLy8gVXNlIG11bHQ2NCgpIGlmIHRoZSBudW1iZXIgZml0cyBpbiA2NCBiaXRzLCBvdGhlcndpc2UgY2hhbmdlIGFsbCB0byBtdWx0MTI4KCkgKHNsb3dlcikKaW5saW5lIGxsIG11bHQ2NChjb25zdCBsbCAmYSwgY29uc3QgbGwgJmIsIGNvbnN0IGxsICZtb2QpCnsKICAgIHJldHVybiBbJl0oKSAtPiBsbAogICAgewogICAgICAgIHJldHVybiBtb2QgPiBJTlQzMl9NQVggPyAobGwpKChfX2ludDEyOF90KShhKSpiICUgbW9kKSA6IChsb25nIGxvbmcpKGEpKmIgJSBtb2Q7CiAgICB9KCk7Cn0KbmFtZXNwYWNlIGJpZ051bWJlcgp7CiAgICB1c2luZyB1MTI4ID0gX191aW50MTI4X3Q7CgogICAgLy8gLS0tLS0tLS0tLSA2NC1iaXQgbGltYiBoZWxwZXJzIChmYXN0KSAtLS0tLS0tLS0tCiAgICBzdGF0aWMgaW5saW5lIHZvaWQgbXVsdDY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIsIHVpbnQ2NF90ICZsbywgdWludDY0X3QgJmhpKQogICAgewogICAgICAgIF9fdWludDEyOF90IHAgPSAoX191aW50MTI4X3QpYSAqIGI7CiAgICAgICAgbG8gPSAodWludDY0X3QpcDsKICAgICAgICBoaSA9ICh1aW50NjRfdCkocCA+PiA2NCk7CiAgICB9CiAgICBzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGFkZDY0KHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIsIHVpbnQ2NF90ICZjYXJyeSkKICAgIHsKICAgICAgICBfX3VpbnQxMjhfdCBzID0gKF9fdWludDEyOF90KWEgKyBiICsgY2Fycnk7CiAgICAgICAgY2FycnkgPSAodWludDY0X3QpKHMgPj4gNjQpOwogICAgICAgIHJldHVybiAodWludDY0X3QpczsKICAgIH0KICAgIC8vIEZhbGxiYWNrIGdlbmVyaWMgKHNsb3cpOiBrZXB0IGZvciBzZXR1cCAoZS5nLiwgY29tcHV0aW5nIFJeMiBtb2QgTiBvbmNlKQogICAgdTEyOCBtdWx0MTI4KHUxMjggYSwgdTEyOCBiLCB1MTI4IG1vZCkKICAgIHsKICAgICAgICB1MTI4IHJlc3VsdCA9IDA7CiAgICAgICAgZm9yIChhICU9IG1vZDsgYiA+IDA7IGEgPDw9IDEsIGIgPj49IDEpCiAgICAgICAgewogICAgICAgICAgICBhID49IG1vZCA/IGEgLT0gbW9kIDogMDsKICAgICAgICAgICAgaWYgKGIgJiAxKQogICAgICAgICAgICAgICAgcmVzdWx0ICs9IGEsIHJlc3VsdCA+PSBtb2QgPyByZXN1bHQgLT0gbW9kIDogMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8vIC0tLS0tLS0tLS0gTW9udGdvbWVyeSAoQ0lPUywgMng2NC1iaXQgbGltYnMpIC0tLS0tLS0tLS0KICAgIC8vIENvbXB1dGUgbjAnID0gLU5eey0xfSBtb2QgMl42NCAobG93IGxpbWIgb25seSkKICAgIHN0YXRpYyBpbmxpbmUgdWludDY0X3QgaW52NjRfMmsodWludDY0X3QgbjApCiAgICB7CiAgICAgICAgdWludDY0X3QgeCA9IDE7IC8vIGluaXRpYWwgYXBwcm94CiAgICAgICAgZm9yIChpbnQgaSA9IDY7IGkgPiAwOyBpLS0pCiAgICAgICAgICAgIHggPSAoX191aW50MTI4X3QpeCAqICgyIC0gKF9fdWludDEyOF90KW4wICogeCk7CiAgICAgICAgcmV0dXJuIHg7IC8vIHgg4omhIG4wXnstMX0KICAgIH0KCiAgICBpbmxpbmUgcGFpcjx1MTI4LCB1MTI4PiBtb250TW9kSW52KHUxMjggTikKICAgIHsKICAgICAgICByZXR1cm4gezAsICh1MTI4KSgwIC0gaW52NjRfMmsoTikpfTsKICAgIH0KCiAgICAvLyBGYXN0IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb246IHJldHVybnMgYSpiKlJeey0xfSBtb2QgTiwgd2hlcmUgUj0yXjEyOAogICAgaW5saW5lIHUxMjggbW9udE11bHQodTEyOCBhLCB1MTI4IGIsIHUxMjggTiwgdTEyOCBOX24wcHJpbWUpCiAgICB7CiAgICAgICAgdWludDY0X3QgbjAgPSAodWludDY0X3QpTiwgbjEgPSAodWludDY0X3QpKE4gPj4gNjQpOwogICAgICAgIHVpbnQ2NF90IGEwID0gKHVpbnQ2NF90KWEsIGExID0gKHVpbnQ2NF90KShhID4+IDY0KTsKICAgICAgICB1aW50NjRfdCBiMCA9ICh1aW50NjRfdCliLCBiMSA9ICh1aW50NjRfdCkoYiA+PiA2NCk7CiAgICAgICAgdWludDY0X3QgbjBwID0gKHVpbnQ2NF90KU5fbjBwcmltZTsKICAgICAgICB1aW50NjRfdCB0MCA9IDAsIHQxID0gMCwgdDIgPSAwOwoKICAgICAgICBhdXRvIHJvdW5kX3N0ZXAgPSBbJl0odWludDY0X3QgYWkpCiAgICAgICAgewogICAgICAgICAgICB1aW50NjRfdCBsbywgaGksIGNhcnJ5OwogICAgICAgICAgICAvLyB0ICs9IGFpICogYgogICAgICAgICAgICBtdWx0NjQoYWksIGIwLCBsbywgaGkpOwogICAgICAgICAgICBjYXJyeSA9IDA7CiAgICAgICAgICAgIHQwID0gYWRkNjQodDAsIGxvLCBjYXJyeSk7CiAgICAgICAgICAgIHQxID0gYWRkNjQodDEsIGhpLCBjYXJyeSk7CiAgICAgICAgICAgIHQyID0gYWRkNjQodDIsIDAsIGNhcnJ5KTsKICAgICAgICAgICAgbXVsdDY0KGFpLCBiMSwgbG8sIGhpKTsKICAgICAgICAgICAgY2FycnkgPSAwOwogICAgICAgICAgICB0MSA9IGFkZDY0KHQxLCBsbywgY2FycnkpOwogICAgICAgICAgICB0MiA9IGFkZDY0KHQyLCBoaSwgY2FycnkpOwogICAgICAgICAgICAvLyBtID0gdDAgKiBuMCcgKG1vZCAyXjY0KQogICAgICAgICAgICB1aW50NjRfdCBtID0gKHVpbnQ2NF90KSgoX191aW50MTI4X3QpdDAgKiBuMHApOwogICAgICAgICAgICAvLyB0ICs9IG0gKiBOCiAgICAgICAgICAgIG11bHQ2NChtLCBuMCwgbG8sIGhpKTsKICAgICAgICAgICAgY2FycnkgPSAwOwogICAgICAgICAgICB0MCA9IGFkZDY0KHQwLCBsbywgY2FycnkpOwogICAgICAgICAgICB0MSA9IGFkZDY0KHQxLCBoaSwgY2FycnkpOwogICAgICAgICAgICB0MiA9IGFkZDY0KHQyLCAwLCBjYXJyeSk7CiAgICAgICAgICAgIG11bHQ2NChtLCBuMSwgbG8sIGhpKTsKICAgICAgICAgICAgY2FycnkgPSAwOwogICAgICAgICAgICB0MSA9IGFkZDY0KHQxLCBsbywgY2FycnkpOwogICAgICAgICAgICB0MiA9IGFkZDY0KHQyLCBoaSwgY2FycnkpOwogICAgICAgICAgICAvLyBzaGlmdCBieSBvbmUgbGltYgogICAgICAgICAgICB0MCA9IHQxOwogICAgICAgICAgICB0MSA9IHQyOwogICAgICAgICAgICB0MiA9IDA7CiAgICAgICAgfTsKCiAgICAgICAgcm91bmRfc3RlcChhMCk7CiAgICAgICAgcm91bmRfc3RlcChhMSk7CgogICAgICAgIF9fdWludDEyOF90IHJlcyA9ICgoKF9fdWludDEyOF90KXQxIDw8IDY0KSB8IHQwKTsKICAgICAgICBpZiAocmVzID49IE4pCiAgICAgICAgICAgIHJlcyAtPSBOOwogICAgICAgIHJldHVybiAodTEyOClyZXM7CiAgICB9Cn0KdXNpbmcgbmFtZXNwYWNlIGJpZ051bWJlcjsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgppbmxpbmUgVCBGKFQgeCwgVCBjLCBUIG1vZCwgVCBpbnYpIC8vIFBvbGxhcmQtcmhvIGZ1bmN0aW9uCnsKICAgIHggPSBtb250TXVsdCh4LCB4LCBtb2QsIGludik7CiAgICB4ID0geCA+PSBtb2QgLSBjID8geCAtIG1vZCArIGMgOiB4ICsgYzsKICAgIHJldHVybiB4Owp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KaW5saW5lIFQgX19hYnMoVCBOKQp7CiAgICBpZiAoTiA8IDApCiAgICAgICAgcmV0dXJuIC1OOwoKICAgIHJldHVybiBOOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBQb2xsYXJkX0JyZW50KFQgTikKewogICAgaWYgKCEoTiAmIDEpKQogICAgICAgIHJldHVybiAyOwoKICAgIC8vIFJhbmRvbSBOdW1iZXIgTGluZWFyIENvbmdydWVudGlhbCBHZW5lcmF0b3IgTU1JWCBmcm9tIEQuRS4gS251dGgKICAgIHN0YXRpYyB1MTI4IHJuZyA9IDB4ZGVhZmJlZWZmZjsKICAgIHVpbnQ2NF90IGEgPSBybmcgKiA2MzY0MTM2MjIzODQ2NzkzMDA1dWxsICsgMTQ0MjY5NTA0MDg4ODk2MzQwN3VsbDsKICAgIHVpbnQ2NF90IGIgPSBhICogNjM2NDEzNjIyMzg0Njc5MzAwNXVsbCArIDE0NDI2OTUwNDA4ODg5NjM0MDd1bGw7CiAgICBybmcgPSAoYSArIGIpIF4gKGEgKiBiKTsKCiAgICBUIFgwID0gMSArIGEgJSAoTiAtIDEpOwogICAgVCBDID0gMSArIGIgJSAoTiAtIDEpOwogICAgVCBYID0gWDA7IC8vIFgxCiAgICBUIGdjZFZhbCA9IDE7CiAgICBUIHEgPSAxOwogICAgVCBYcywgWHQ7CiAgICBUIG0gPSAxMjg7CiAgICB1MTI4IGludiA9IG1vbnRNb2RJbnYoTikuc2Vjb25kOwogICAgVCBMID0gMTsKICAgIHdoaWxlIChnY2RWYWwgPT0gMSkKICAgIHsKICAgICAgICBYdCA9IFg7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBMOyBpKyspCiAgICAgICAgICAgIFggPSBGKFgsIEMsIE4sIGludik7CgogICAgICAgIGludCBrID0gMDsKICAgICAgICB3aGlsZSAoayA8IEwgJiYgZ2NkVmFsID09IDEpCiAgICAgICAgewogICAgICAgICAgICBYcyA9IFg7CiAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbSAmJiBpIDwgTCAtIGs7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgWCA9IEYoWCwgQywgTiwgaW52KTsKICAgICAgICAgICAgICAgIHEgPSBtb250TXVsdChxLCBYdCA+IFggPyBYdCAtIFggOiBYIC0gWHQsIE4sIGludik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2NkVmFsID0gX19nY2QocSwgTik7CiAgICAgICAgICAgIGsgKz0gbTsKICAgICAgICB9CiAgICAgICAgTCArPSBMOwogICAgfQogICAgaWYgKGdjZFZhbCA9PSBOKSAvLyBGYWlsdXJlCiAgICB7CiAgICAgICAgZG8KICAgICAgICB7CiAgICAgICAgICAgIFhzID0gRihYcywgQywgTiwgaW52KTsKICAgICAgICAgICAgZ2NkVmFsID0gX19nY2QoWHMgPiBYdCA/IFhzIC0gWHQgOiBYdCAtIFhzLCBOKTsKICAgICAgICB9IHdoaWxlIChnY2RWYWwgPT0gMSk7CiAgICB9CiAgICByZXR1cm4gZ2NkVmFsOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBtb2RQb3coVCBOLCBUIHBvd2VyLCBUIG1vZCkKewogICAgaWYgKE4gJSBtb2QgPT0gMCB8fCBOID09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZiAoTiA9PSAxIHx8IHBvd2VyID09IDApCiAgICAgICAgcmV0dXJuIDE7CiAgICBUIHJlc3sxfTsKICAgIHdoaWxlIChwb3dlcikKICAgIHsKICAgICAgICBpZiAocG93ZXIgJiAxKQogICAgICAgICAgICByZXMgPSBtdWx0NjQocmVzLCBOLCBtb2QpOwogICAgICAgIE4gPSBtdWx0NjQoTiwgTiwgbW9kKTsKICAgICAgICBwb3dlciA+Pj0gMTsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpib29sIGlzUHJpbWUoVCBOKQp7CiAgICBpZiAoTiA8IDIgfHwgTiAlIDYgJSA0ICE9IDEpCiAgICAgICAgcmV0dXJuIChOIHwgMSkgPT0gMzsKICAgIFQgZCA9IE4gLSAxOwogICAgaW50IHN7fTsKICAgIHdoaWxlICghKGQgJiAxKSkKICAgICAgICBkID4+PSAxLCArK3M7CiAgICBmb3IgKGNvbnN0IFQgJmEgOiB7MiwgMzI1LCA5Mzc1LCAyODE3OCwgNDUwNzc1LCA5NzgwNTA0LCAxNzk1MjY1MDIyfSkKICAgIHsKICAgICAgICBUIHAgPSBtb2RQb3coYSAlIE4sIGQsIE4pLCBpID0gczsKICAgICAgICB3aGlsZSAocCAhPSAxICYmIHAgIT0gTiAtIDEgJiYgYSAlIE4gJiYgaS0tKQogICAgICAgICAgICBwID0gbXVsdDY0KHAsIHAsIE4pOwogICAgICAgIGlmIChwICE9IE4gLSAxICYmIGkgIT0gcykKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIHByaW1lRmFjdG9yaXplKFQgTiwgbWFwPFQsIFQ+ICZwcmltZUZhY3RvcnMpCnsKICAgIGlmIChOID09IDEpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmICghaXNQcmltZShOKSkKICAgIHsKICAgICAgICBUIFkgPSBQb2xsYXJkX0JyZW50KE4pOwogICAgICAgIHByaW1lRmFjdG9yaXplKFksIHByaW1lRmFjdG9ycyk7CiAgICAgICAgcHJpbWVGYWN0b3JpemUoTiAvIFksIHByaW1lRmFjdG9ycyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHJpbWVGYWN0b3JzW05dKys7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBnZXRBbGxGYWN0b3JzKFQgTiwgdmVjdG9yPFQ+ICZmYWN0b3JzKQp7CiAgICBmYWN0b3JzID0gezF9OwogICAgbWFwPFQsIFQ+IGZyZXE7CiAgICBwcmltZUZhY3Rvcml6ZShOLCBmcmVxKTsKCiAgICBmb3IgKGF1dG8gJltwLCBjbnRdIDogZnJlcSkKICAgIHsKICAgICAgICB2ZWN0b3I8VD4gdGVtcDsKICAgICAgICBUIHB3ID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBjbnQ7IGkrKywgcHcgKj0gcCkKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoY29uc3QgVCAmZiA6IGZhY3RvcnMpCiAgICAgICAgICAgICAgICB0ZW1wLnB1c2hfYmFjayhmICogcHcpOwogICAgICAgIH0KICAgICAgICBmYWN0b3JzLnN3YXAodGVtcCk7CiAgICB9CiAgICBzb3J0KGZhY3RvcnMuYmVnaW4oKSwgZmFjdG9ycy5lbmQoKSk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpUIGNvdW50RGl2aXNvcnMoVCBOKQp7CiAgICBtYXA8VCwgVD4gcHJpbWVGYWN0b3JzOwogICAgcHJpbWVGYWN0b3JpemUoTiwgcHJpbWVGYWN0b3JzKTsKICAgIFQgYW5zezF9OwogICAgZm9yIChjb25zdCBhdXRvICZbcCwgZXhwXSA6IHByaW1lRmFjdG9ycykKICAgICAgICBhbnMgKj0gKGV4cCArIDEpOwogICAgcmV0dXJuIGFuczsKfQoKLy8gR0NDJ3MgaW1wbGVtZW50YXRpb24gZm9yIEkvTyBvZiAxMjgtYml0IGludGVnZXJzCnVzaW5nIGludDEyOCA9IHNpZ25lZCBfX2ludDEyODsKdXNpbmcgdWludDEyOCA9IHVuc2lnbmVkIF9faW50MTI4OwoKbmFtZXNwYWNlIGludDEyOF9pbwp7CgogICAgaW5saW5lIGF1dG8gY2hhcl90b19kaWdpdChpbnQgY2hyKQogICAgewogICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGlzYWxwaGEoY2hyKSA/IDEwICsgdG9sb3dlcihjaHIpIC0gJ2EnIDogY2hyIC0gJzAnKTsKICAgIH0KCiAgICBpbmxpbmUgYXV0byBkaWdpdF90b19jaGFyKGludCBkaWdpdCkKICAgIHsKICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oZGlnaXQgPiA5ID8gJ2EnICsgZGlnaXQgLSAxMCA6ICcwJyArIGRpZ2l0KTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgaW50ZWdlcj4KICAgIGlubGluZSBhdXRvIHRvX2ludChjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBzaXplX3QgKmlkeCA9IG51bGxwdHIsIGludCBiYXNlID0gMTApCiAgICB7CiAgICAgICAgc2l6ZV90IGkgPSBpZHggIT0gbnVsbHB0ciA/ICppZHggOiAwOwogICAgICAgIGNvbnN0IGF1dG8gbiA9IHN0ci5zaXplKCk7CiAgICAgICAgY29uc3QgYXV0byBuZWcgPSBzdHJbaV0gPT0gJy0nOwogICAgICAgIGludGVnZXIgbnVtID0gMDsKICAgICAgICBpZiAobmVnKQogICAgICAgICAgICArK2k7CiAgICAgICAgd2hpbGUgKGkgPCBuKQogICAgICAgICAgICBudW0gKj0gYmFzZSwgbnVtICs9IGNoYXJfdG9fZGlnaXQoc3RyW2krK10pOwogICAgICAgIGlmIChpZHggIT0gbnVsbHB0cikKICAgICAgICAgICAgKmlkeCA9IGk7CiAgICAgICAgcmV0dXJuIG5lZyA/IC1udW0gOiBudW07CiAgICB9CgogICAgdGVtcGxhdGUgPGNsYXNzIGludGVnZXI+CiAgICBpbmxpbmUgYXV0byB0b19zdHJpbmcoaW50ZWdlciBudW0sIGludCBiYXNlID0gMTApCiAgICB7CiAgICAgICAgY29uc3QgYXV0byBuZWcgPSBudW0gPCAwOwogICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKICAgICAgICBpZiAobmVnKQogICAgICAgICAgICBudW0gPSAtbnVtOwogICAgICAgIGRvCiAgICAgICAgICAgIHN0ciArPSBkaWdpdF90b19jaGFyKG51bSAlIGJhc2UpLCBudW0gLz0gYmFzZTsKICAgICAgICB3aGlsZSAobnVtID4gMCk7CiAgICAgICAgaWYgKG5lZykKICAgICAgICAgICAgc3RyICs9ICctJzsKICAgICAgICBzdGQ6OnJldmVyc2Uoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSk7CiAgICAgICAgcmV0dXJuIHN0cjsKICAgIH0KCiAgICBpbmxpbmUgYXV0byBuZXh0X3N0cihzdGQ6OmlzdHJlYW0gJnN0cmVhbSkKICAgIHsKICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CiAgICAgICAgc3RyZWFtID4+IHN0cjsKICAgICAgICByZXR1cm4gc3RyOwogICAgfQoKICAgIHRlbXBsYXRlIDxjbGFzcyBpbnRlZ2VyPgogICAgaW5saW5lIGF1dG8gJnJlYWQoc3RkOjppc3RyZWFtICZzdHJlYW0sIGludGVnZXIgJm51bSkKICAgIHsKICAgICAgICBudW0gPSB0b19pbnQ8aW50ZWdlcj4obmV4dF9zdHIoc3RyZWFtKSk7CiAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgaW50ZWdlcj4KICAgIGlubGluZSBhdXRvICZ3cml0ZShzdGQ6Om9zdHJlYW0gJnN0cmVhbSwgaW50ZWdlciBudW0pIHsgcmV0dXJuIHN0cmVhbSA8PCB0b19zdHJpbmcobnVtKTsgfQp9CgppbmxpbmUgYXV0byAmb3BlcmF0b3I+Pihpc3RyZWFtICZzdHJlYW0sIGludDEyOCAmbnVtKSB7IHJldHVybiBpbnQxMjhfaW86OnJlYWQoc3RyZWFtLCBudW0pOyB9CmlubGluZSBhdXRvICZvcGVyYXRvcjw8KG9zdHJlYW0gJnN0cmVhbSwgaW50MTI4IG51bSkgeyByZXR1cm4gaW50MTI4X2lvOjp3cml0ZShzdHJlYW0sIG51bSk7IH0KaW5saW5lIGF1dG8gJm9wZXJhdG9yPj4oaXN0cmVhbSAmc3RyZWFtLCB1aW50MTI4ICZudW0pIHsgcmV0dXJuIGludDEyOF9pbzo6cmVhZChzdHJlYW0sIG51bSk7IH0KaW5saW5lIGF1dG8gJm9wZXJhdG9yPDwob3N0cmVhbSAmc3RyZWFtLCB1aW50MTI4IG51bSkgeyByZXR1cm4gaW50MTI4X2lvOjp3cml0ZShzdHJlYW0sIG51bSk7IH0KCmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwojaWZuZGVmIE9OTElORV9KVURHRQogICAgZnJlb3BlbigiaW5wdXQudHh0IiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJPdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwojZW5kaWYgLy8hIE9OTElORV9KVURHRQogICAgaW50IHQgPSAxOwogICAgLy8gY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKQogICAgewogICAgICAgIGludCBuLCBtLCBxOwogICAgICAgIGNpbiA+PiBuID4+IG0gPj4gcTsKICAgICAgICB2ZWN0b3I8bGw+IGEobiksIGIobSk7CiAgICAgICAgbGwgc3VtQXt9LCBzdW1Ce307CiAgICAgICAgYml0c2V0PDQwMDAwMT4gaW5BLCBpbkI7CgogICAgICAgIGF1dG8gYWRqdXN0ID0gWyZdKGxsIE4pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gTiArIDIwMDAwMDsgLy8gQW4gb2Zmc2V0IHRvIG1ha2UgYWxsIG51bWJlcnMgcG9zaXRpdmUKICAgICAgICB9OwogICAgICAgIGZvciAoaW50IGl7fTsgaSA8IG47IGkrKykKICAgICAgICAgICAgY2luID4+IGFbaV0sIHN1bUEgKz0gYVtpXSwgaW5BW2FkanVzdChhW2ldKV0gPSAxOwoKICAgICAgICBmb3IgKGludCBqe307IGogPCBtOyBqKyspCiAgICAgICAgICAgIGNpbiA+PiBiW2pdLCBzdW1CICs9IGJbal0sIGluQlthZGp1c3QoYltqXSldID0gMTsKCiAgICAgICAgLyoKICAgICAgICAoYTEgKiBiMSArIGExICogYjIgLi4uIGExICogYm0pCiAgICAgICAgKGEyICogYjEgKyBhMiAqIGIyIC4uLiBhMiAqIGJtKQogICAgICAgIC4uLgogICAgICAgIC4uLgogICAgICAgIFRha2UgYWkgYXMgYSBjb21tb24gZmFjdG9yIG9mIGVhY2ggcm93LCB5b3UgZ2V0OgogICAgICAgIGFpICogc3VtQgogICAgICAgIEFjY3VtdWxhdGUgY29sdW1ucywgeW91IGdldDoKICAgICAgICBhMSAqIHN1bUIgKyBhMiAqIHN1bUIgKyBhMyAqIHN1bUIgLi4uICsgYW4gKiBzdW1CCiAgICAgICAgVGFrZSBzdW1CIGFzIGEgY29tbW9uIGZhY3RvciwgeW91IGdldDoKICAgICAgICBzdW0gb2YgbWF0cml4ID0gQiA9IHN1bUEgKiBzdW1CCgogICAgICAgIEFmdGVyIGFueSBvcGVyYXRpb246CiAgICAgICAgeCA9IChzdW1BIC0gYWkpICogKHN1bUIgLSBiaikKICAgICAgICBGYWN0b3JpemUgeCwgeCA9IGYgKiBkCiAgICAgICAgc3VtQSAtIGFpID0gZgogICAgICAgIGFpID0gc3VtQSAtIGYKICAgICAgICBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgKHN1bUEgLSBmKSBhbmQgKHN1bUIgLSBkKSBib3RoIGV4aXN0cwogICAgICAgICovCiAgICAgICAgYXV0byBmaW5kSW5BID0gWyZdKGxsIHgpCiAgICAgICAgewogICAgICAgICAgICB4ID0gYWRqdXN0KHgpOwogICAgICAgICAgICByZXR1cm4gKHggPj0gMCAmJiB4IDw9IDQwMDAwMCAmJiBpbkFbeF0pOwogICAgICAgIH07CiAgICAgICAgYXV0byBmaW5kSW5CID0gWyZdKGxsIHgpCiAgICAgICAgewogICAgICAgICAgICB4ID0gYWRqdXN0KHgpOwogICAgICAgICAgICByZXR1cm4gKHggPj0gMCAmJiB4IDw9IDQwMDAwMCAmJiBpbkJbeF0pOwogICAgICAgIH07CiAgICAgICAgd2hpbGUgKHEtLSkKICAgICAgICB7CiAgICAgICAgICAgIGxsIHg7CiAgICAgICAgICAgIGNpbiA+PiB4OwogICAgICAgICAgICBib29sIG9rID0gZmFsc2U7CiAgICAgICAgICAgIHZlY3Rvcjx1MTI4PiB2YzsKICAgICAgICAgICAgZ2V0QWxsRmFjdG9ycyh1MTI4KF9fYWJzKHgpKSwgdmMpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGxsICZkIDogdmMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHggPSAoU3VtQiDiiJIgYltqXSkg4ouFIChTdW1BIOKIkiBhW2ldKQogICAgICAgICAgICAgICAgbGwgZjEgPSBkOwogICAgICAgICAgICAgICAgbGwgZjIgPSB4IC8gZDsKICAgICAgICAgICAgICAgIG9rIHw9IChmaW5kSW5BKHN1bUEgLSBmMSkgJiYgZmluZEluQihzdW1CIC0gZjIpKTsKICAgICAgICAgICAgICAgIG9rIHw9IChmaW5kSW5BKHN1bUEgLSBmMikgJiYgZmluZEluQihzdW1CIC0gZjEpKTsKICAgICAgICAgICAgICAgIGYxICo9IC0xLCBmMiAqPSAtMTsKICAgICAgICAgICAgICAgIG9rIHw9IChmaW5kSW5BKHN1bUEgLSBmMSkgJiYgZmluZEluQihzdW1CIC0gZjIpKTsKICAgICAgICAgICAgICAgIG9rIHw9IChmaW5kSW5BKHN1bUEgLSBmMikgJiYgZmluZEluQihzdW1CIC0gZjEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob2spCiAgICAgICAgICAgICAgICBjb3V0IDw8ICJZRVNcbiI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNvdXQgPDwgIk5PXG4iOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9