#include <vector>
#include <cassert>
#include <utility>
#include <algorithm>
#include <cstdio>
#include <string>
#include <tuple>
struct Interval {
int l, r;
int length() const { return r-l+1; }
};
long long pow10[17], ones[17];
int getBestCount(int L, int R, int power, int logPower, int D) {
if(power == 1) {
if(L <= D && D <= R) {
return 1;
}else {
return 0;
}
}
if(L == 0) {
int cnt = 0;
while(ones[cnt + 1] * D <= R) cnt += 1;
return cnt;
}
if(R == power - 1) {
int cnt = logPower, dep = 0;
while(L <= ones[cnt] * D + ones[dep] * 9 * pow10[cnt]) {
cnt -= 1;
dep += 1;
}
return cnt;
}
const int L0 = L / power, R0 = R / power;
if(L0 == R0) {
int childCnt = getBestCount(L % power, R % power, power / 10, logPower - 1, D);
if(D == L0) childCnt ++;
return childCnt;
}
int count = 0;
for(int digit = L0; digit <= R0; digit++) {
int childCount;
if(digit == L0) {
childCount = getBestCount(L % power, power - 1, power / 10, logPower - 1, D);
}else if(L0 < digit && digit < R0) {
childCount = logPower;
}else {
childCount = getBestCount(0, R % power, power / 10, logPower - 1, D);
}
int nextCount = childCount + (digit == D ? 1 : 0);
if(nextCount < count) continue;
if(nextCount > count) {
count = nextCount;
}
}
return count;
}
std::vector<Interval> genBestIntervals(int L, int R, int power, int logPower, int D) {
if(power == 1) {
if(L <= D && D <= R) {
return std::vector<Interval>(1, Interval{D, D});
}else {
return std::vector<Interval>(1, Interval{L, R});
}
}
const int L0 = L / power, R0 = R / power;
if(L0 == R0) {
auto child = genBestIntervals(L % power, R % power, power / 10, logPower - 1, D);
if(L0 > 0) for(auto &intv : child) intv.l += L0 * power, intv.r += L0 * power;
return child;
}
int count = getBestCount(L, R, power, logPower, D);
std::vector<Interval> intervals;
for(int digit = L0; digit <= R0; digit++) {
int childCount;
if(digit == L0) {
childCount = getBestCount(L % power, power - 1, power / 10, logPower - 1, D);
}else if(L0 < digit && digit < R0) {
childCount = logPower;
}else {
childCount = getBestCount(0, R % power, power / 10, logPower - 1, D);
}
int nextCount = childCount + (digit == D ? 1 : 0);
if(nextCount < count) continue;
assert(nextCount == count);
std::vector<Interval> childIntervals;
if(digit == L0) {
childIntervals = genBestIntervals(L % power, power - 1, power / 10, logPower - 1, D);
}else if(L0 < digit && digit < R0) {
childIntervals.push_back({(power - 1) / 9 * D, (power - 1) / 9 * D});
}else {
childIntervals = genBestIntervals(0, R % power, power / 10, logPower - 1, D);
}
for(Interval intv : childIntervals) {
intv.l += digit * power;
intv.r += digit * power;
intervals.push_back(intv);
}
}
return intervals;
}
struct Event {
int number, who, inserted;
};
int main() {
#ifdef IN_MY_COMPUTER
freopen("example.in.txt", "r", stdin);
#endif
pow10[0] = 1;
for(int i = 1; i < 17; i++) pow10[i] = pow10[i-1] * 10, ones[i] = ones[i-1] * 10 + 1;
int T; scanf("%d", &T);
for(int tc = 1; tc <= T; tc++) {
int A, B, C, D; scanf("%d%d%d%d", &A,&B,&C,&D);
int logPower = std::to_string(B).length() - 1;
int power = 1; for(int rep = 0; rep < logPower; rep++) power *= 10;
auto CIntervals = genBestIntervals(A, B, power, logPower, C);
auto DIntervals = genBestIntervals(A, B, power, logPower, D);
std::vector<Event> events;
for(auto it : CIntervals) events.push_back({it.l, 0, +1}), events.push_back({it.r+1, 0, -1});
for(auto it : DIntervals) events.push_back({it.l, 1, +1}), events.push_back({it.r+1, 1, -1});
std::sort(events.begin(), events.end(), [&](const Event &e1, const Event &e2) { return e1.number < e2.number; });
events.push_back({B+1, -1, -1});
int bestAnswer = -1;
long long bestProbability = -1;
auto updateAnswer = [&bestAnswer, &bestProbability](int pos, long long prob) {
if(prob > bestProbability) {
bestProbability = prob;
bestAnswer = pos;
}else if(prob == bestProbability && bestAnswer > pos) {
bestAnswer = pos;
}
};
long long totalLength[] = {0, 0};
for(auto &it : CIntervals) totalLength[0] += it.length();
for(auto &it : DIntervals) totalLength[1] += it.length();
int alive[] = {0, 0};
long long totalCommonCases = 0;
for(size_t _idx = 0; _idx+1 < events.size(); _idx++) {
Event ¤t = events[_idx];
Event &next = events[_idx+1];
alive[current.who] = alive[current.who] + current.inserted;
if(current.number < next.number || next.who < 0) {
if(alive[0] > 0 && alive[1] > 0) {
totalCommonCases += next.number - current.number;
}
}
}
alive[0] = 0;
alive[1] = 0;
long long leftLength[] = {0, 0};
long long rightLength[] = {totalLength[0], totalLength[1]};
for(size_t _idx = 0; _idx+1 < events.size(); _idx++) {
Event ¤t = events[_idx];
Event &next = events[_idx+1];
alive[current.who] = alive[current.who] + current.inserted;
if(current.number < next.number || next.who < 0) {
const long long length = (next.number - current.number);
for(int i= 0; i < 2; i++) {
if(alive[i] > 0) rightLength[i] = rightLength[i] - length;
}
// [5, 8) length=3
// 5, 6 (7)
// (5) 6 7
auto update = [&](int x) {
long long prob =
3 * (leftLength[0] + x * alive[0]) * (rightLength[1] + (length - 1 - x) * alive[1]) +
3 * (leftLength[1] + x * alive[1]) * (rightLength[0] + (length - 1 - x) * alive[0]);
prob += 1 * totalCommonCases;
if(alive[0] == 1) {
prob += 1 * 1 * totalLength[1];
}
if(alive[1] == 1) {
prob += 1 * totalLength[0] * 1;
}
if(alive[0] == 1 && alive[1] == 1) {
prob -= 2 * 1 * 1 * 1;
}
updateAnswer(current.number + x, prob);
return prob;
};
update(0);
update(length - 1);
{
int low = 0;
int high = length - 1;
while(high - low > 3) {
int mid = (low + high) / 2;
if(update(mid) > update(mid+1)) {
high = mid;
}else {
low = mid;
}
}
for(int x = low; x <= high; x++) {
update(x);
}
}
for(int i= 0; i < 2; i++) {
if(alive[i] > 0) leftLength[i] = leftLength[i] + length;
}
}
}
printf("%d\n", bestAnswer);
}
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHVwbGU+CgpzdHJ1Y3QgSW50ZXJ2YWwgewogICAgaW50IGwsIHI7CiAgICBpbnQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gci1sKzE7IH0KfTsKCmxvbmcgbG9uZyBwb3cxMFsxN10sIG9uZXNbMTddOwoKaW50IGdldEJlc3RDb3VudChpbnQgTCwgaW50IFIsIGludCBwb3dlciwgaW50IGxvZ1Bvd2VyLCBpbnQgRCkgewogICAgaWYocG93ZXIgPT0gMSkgewogICAgICAgIGlmKEwgPD0gRCAmJiBEIDw9IFIpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfWVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYoTCA9PSAwKSB7CiAgICAgICAgaW50IGNudCA9IDA7CiAgICAgICAgd2hpbGUob25lc1tjbnQgKyAxXSAqIEQgPD0gUikgY250ICs9IDE7CiAgICAgICAgcmV0dXJuIGNudDsgCiAgICB9CgogICAgaWYoUiA9PSBwb3dlciAtIDEpIHsKICAgICAgICBpbnQgY250ID0gbG9nUG93ZXIsIGRlcCA9IDA7CiAgICAgICAgd2hpbGUoTCA8PSBvbmVzW2NudF0gKiBEICsgb25lc1tkZXBdICogOSAqIHBvdzEwW2NudF0pIHsKICAgICAgICAgICAgY250IC09IDE7CiAgICAgICAgICAgIGRlcCArPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY250OwogICAgfQoKICAgIGNvbnN0IGludCBMMCA9IEwgLyBwb3dlciwgUjAgPSBSIC8gcG93ZXI7CiAgICBpZihMMCA9PSBSMCkgewogICAgICAgIGludCBjaGlsZENudCA9IGdldEJlc3RDb3VudChMICUgcG93ZXIsIFIgJSBwb3dlciwgcG93ZXIgLyAxMCwgbG9nUG93ZXIgLSAxLCBEKTsKICAgICAgICBpZihEID09IEwwKSBjaGlsZENudCArKzsKICAgICAgICByZXR1cm4gY2hpbGRDbnQ7CiAgICB9CiAKICAgIGludCBjb3VudCA9IDA7CiAgICBmb3IoaW50IGRpZ2l0ID0gTDA7IGRpZ2l0IDw9IFIwOyBkaWdpdCsrKSB7CiAgICAgICAgaW50IGNoaWxkQ291bnQ7CiAgICAgICAgaWYoZGlnaXQgPT0gTDApIHsKICAgICAgICAgICAgY2hpbGRDb3VudCA9IGdldEJlc3RDb3VudChMICUgcG93ZXIsIHBvd2VyIC0gMSwgcG93ZXIgLyAxMCwgbG9nUG93ZXIgLSAxLCBEKTsKICAgICAgICB9ZWxzZSBpZihMMCA8IGRpZ2l0ICYmIGRpZ2l0IDwgUjApIHsKICAgICAgICAgICAgY2hpbGRDb3VudCA9IGxvZ1Bvd2VyOwogICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgY2hpbGRDb3VudCA9IGdldEJlc3RDb3VudCgwLCBSICUgcG93ZXIsIHBvd2VyIC8gMTAsIGxvZ1Bvd2VyIC0gMSwgRCk7CiAgICAgICAgfQogCiAgICAgICAgaW50IG5leHRDb3VudCA9IGNoaWxkQ291bnQgKyAoZGlnaXQgPT0gRCA/IDEgOiAwKTsKICAgICAgICBpZihuZXh0Q291bnQgPCBjb3VudCkgY29udGludWU7CiAKICAgICAgICBpZihuZXh0Q291bnQgPiBjb3VudCkgewogICAgICAgICAgICBjb3VudCA9IG5leHRDb3VudDsKICAgICAgICB9CiAgICB9CiAKICAgIHJldHVybiBjb3VudDsKfQoKc3RkOjp2ZWN0b3I8SW50ZXJ2YWw+IGdlbkJlc3RJbnRlcnZhbHMoaW50IEwsIGludCBSLCBpbnQgcG93ZXIsIGludCBsb2dQb3dlciwgaW50IEQpIHsKICAgIGlmKHBvd2VyID09IDEpIHsKICAgICAgICBpZihMIDw9IEQgJiYgRCA8PSBSKSB7CiAgICAgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxJbnRlcnZhbD4oMSwgSW50ZXJ2YWx7RCwgRH0pOwogICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEludGVydmFsPigxLCBJbnRlcnZhbHtMLCBSfSk7CiAgICAgICAgfQogICAgfQogCiAgICBjb25zdCBpbnQgTDAgPSBMIC8gcG93ZXIsIFIwID0gUiAvIHBvd2VyOwogICAgaWYoTDAgPT0gUjApIHsKICAgICAgICBhdXRvIGNoaWxkID0gZ2VuQmVzdEludGVydmFscyhMICUgcG93ZXIsIFIgJSBwb3dlciwgcG93ZXIgLyAxMCwgbG9nUG93ZXIgLSAxLCBEKTsKICAgICAgICBpZihMMCA+IDApIGZvcihhdXRvICZpbnR2IDogY2hpbGQpIGludHYubCArPSBMMCAqIHBvd2VyLCBpbnR2LnIgKz0gTDAgKiBwb3dlcjsKICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICB9CiAKICAgIGludCBjb3VudCA9IGdldEJlc3RDb3VudChMLCBSLCBwb3dlciwgbG9nUG93ZXIsIEQpOwogICAgc3RkOjp2ZWN0b3I8SW50ZXJ2YWw+IGludGVydmFsczsKICAgIGZvcihpbnQgZGlnaXQgPSBMMDsgZGlnaXQgPD0gUjA7IGRpZ2l0KyspIHsKICAgICAgICBpbnQgY2hpbGRDb3VudDsKICAgICAgICBpZihkaWdpdCA9PSBMMCkgewogICAgICAgICAgICBjaGlsZENvdW50ID0gZ2V0QmVzdENvdW50KEwgJSBwb3dlciwgcG93ZXIgLSAxLCBwb3dlciAvIDEwLCBsb2dQb3dlciAtIDEsIEQpOwogICAgICAgIH1lbHNlIGlmKEwwIDwgZGlnaXQgJiYgZGlnaXQgPCBSMCkgewogICAgICAgICAgICBjaGlsZENvdW50ID0gbG9nUG93ZXI7CiAgICAgICAgfWVsc2UgewogICAgICAgICAgICBjaGlsZENvdW50ID0gZ2V0QmVzdENvdW50KDAsIFIgJSBwb3dlciwgcG93ZXIgLyAxMCwgbG9nUG93ZXIgLSAxLCBEKTsKICAgICAgICB9CiAKICAgICAgICBpbnQgbmV4dENvdW50ID0gY2hpbGRDb3VudCArIChkaWdpdCA9PSBEID8gMSA6IDApOwogICAgICAgIGlmKG5leHRDb3VudCA8IGNvdW50KSBjb250aW51ZTsKICAgICAgICBhc3NlcnQobmV4dENvdW50ID09IGNvdW50KTsKICAgICAgICAKICAgICAgICBzdGQ6OnZlY3RvcjxJbnRlcnZhbD4gY2hpbGRJbnRlcnZhbHM7CiAgICAgICAgaWYoZGlnaXQgPT0gTDApIHsKICAgICAgICAgICAgY2hpbGRJbnRlcnZhbHMgPSBnZW5CZXN0SW50ZXJ2YWxzKEwgJSBwb3dlciwgcG93ZXIgLSAxLCBwb3dlciAvIDEwLCBsb2dQb3dlciAtIDEsIEQpOwogICAgICAgIH1lbHNlIGlmKEwwIDwgZGlnaXQgJiYgZGlnaXQgPCBSMCkgewogICAgICAgICAgICBjaGlsZEludGVydmFscy5wdXNoX2JhY2soeyhwb3dlciAtIDEpIC8gOSAqIEQsIChwb3dlciAtIDEpIC8gOSAqIER9KTsKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgIGNoaWxkSW50ZXJ2YWxzID0gZ2VuQmVzdEludGVydmFscygwLCBSICUgcG93ZXIsIHBvd2VyIC8gMTAsIGxvZ1Bvd2VyIC0gMSwgRCk7CiAgICAgICAgfQogCiAgICAgICAgZm9yKEludGVydmFsIGludHYgOiBjaGlsZEludGVydmFscykgewogICAgICAgICAgICBpbnR2LmwgKz0gZGlnaXQgKiBwb3dlcjsKICAgICAgICAgICAgaW50di5yICs9IGRpZ2l0ICogcG93ZXI7CiAgICAgICAgICAgIGludGVydmFscy5wdXNoX2JhY2soaW50dik7CiAgICAgICAgfQogICAgfQogCiAgICByZXR1cm4gaW50ZXJ2YWxzOwp9CiAKc3RydWN0IEV2ZW50IHsKICAgIGludCBudW1iZXIsIHdobywgaW5zZXJ0ZWQ7Cn07CiAKaW50IG1haW4oKSB7CiNpZmRlZiBJTl9NWV9DT01QVVRFUgogICAgZnJlb3BlbigiZXhhbXBsZS5pbi50eHQiLCAiciIsIHN0ZGluKTsKI2VuZGlmCiAgICBwb3cxMFswXSA9IDE7CiAgICBmb3IoaW50IGkgPSAxOyBpIDwgMTc7IGkrKykgcG93MTBbaV0gPSBwb3cxMFtpLTFdICogMTAsIG9uZXNbaV0gPSBvbmVzW2ktMV0gKiAxMCArIDE7CiAKICAgIGludCBUOyBzY2FuZigiJWQiLCAmVCk7CiAgICBmb3IoaW50IHRjID0gMTsgdGMgPD0gVDsgdGMrKykgewogICAgICAgIGludCBBLCBCLCBDLCBEOyBzY2FuZigiJWQlZCVkJWQiLCAmQSwmQiwmQywmRCk7CiAKICAgICAgICBpbnQgbG9nUG93ZXIgPSBzdGQ6OnRvX3N0cmluZyhCKS5sZW5ndGgoKSAtIDE7CiAgICAgICAgaW50IHBvd2VyID0gMTsgZm9yKGludCByZXAgPSAwOyByZXAgPCBsb2dQb3dlcjsgcmVwKyspIHBvd2VyICo9IDEwOwogCiAgICAgICAgYXV0byBDSW50ZXJ2YWxzID0gZ2VuQmVzdEludGVydmFscyhBLCBCLCBwb3dlciwgbG9nUG93ZXIsIEMpOwogICAgICAgIGF1dG8gREludGVydmFscyA9IGdlbkJlc3RJbnRlcnZhbHMoQSwgQiwgcG93ZXIsIGxvZ1Bvd2VyLCBEKTsKIAogICAgICAgIHN0ZDo6dmVjdG9yPEV2ZW50PiBldmVudHM7CiAgICAgICAgZm9yKGF1dG8gaXQgOiBDSW50ZXJ2YWxzKSBldmVudHMucHVzaF9iYWNrKHtpdC5sLCAwLCArMX0pLCBldmVudHMucHVzaF9iYWNrKHtpdC5yKzEsIDAsIC0xfSk7CiAgICAgICAgZm9yKGF1dG8gaXQgOiBESW50ZXJ2YWxzKSBldmVudHMucHVzaF9iYWNrKHtpdC5sLCAxLCArMX0pLCBldmVudHMucHVzaF9iYWNrKHtpdC5yKzEsIDEsIC0xfSk7CiAgICAgICAgc3RkOjpzb3J0KGV2ZW50cy5iZWdpbigpLCBldmVudHMuZW5kKCksIFsmXShjb25zdCBFdmVudCAmZTEsIGNvbnN0IEV2ZW50ICZlMikgeyByZXR1cm4gZTEubnVtYmVyIDwgZTIubnVtYmVyOyB9KTsKICAgICAgICBldmVudHMucHVzaF9iYWNrKHtCKzEsIC0xLCAtMX0pOwogCiAgICAgICAgaW50IGJlc3RBbnN3ZXIgPSAtMTsKICAgICAgICBsb25nIGxvbmcgYmVzdFByb2JhYmlsaXR5ID0gLTE7CiAKICAgICAgICBhdXRvIHVwZGF0ZUFuc3dlciA9IFsmYmVzdEFuc3dlciwgJmJlc3RQcm9iYWJpbGl0eV0oaW50IHBvcywgbG9uZyBsb25nIHByb2IpIHsKICAgICAgICAgICAgaWYocHJvYiA+IGJlc3RQcm9iYWJpbGl0eSkgewogICAgICAgICAgICAgICAgYmVzdFByb2JhYmlsaXR5ID0gcHJvYjsKICAgICAgICAgICAgICAgIGJlc3RBbnN3ZXIgPSBwb3M7CiAgICAgICAgICAgIH1lbHNlIGlmKHByb2IgPT0gYmVzdFByb2JhYmlsaXR5ICYmIGJlc3RBbnN3ZXIgPiBwb3MpIHsKICAgICAgICAgICAgICAgIGJlc3RBbnN3ZXIgPSBwb3M7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKIAogICAgICAgIGxvbmcgbG9uZyB0b3RhbExlbmd0aFtdID0gezAsIDB9OwogICAgICAgIGZvcihhdXRvICZpdCA6IENJbnRlcnZhbHMpIHRvdGFsTGVuZ3RoWzBdICs9IGl0Lmxlbmd0aCgpOwogICAgICAgIGZvcihhdXRvICZpdCA6IERJbnRlcnZhbHMpIHRvdGFsTGVuZ3RoWzFdICs9IGl0Lmxlbmd0aCgpOwogCiAgICAgICAgaW50IGFsaXZlW10gPSB7MCwgMH07CiAgICAgICAgbG9uZyBsb25nIHRvdGFsQ29tbW9uQ2FzZXMgPSAwOwogICAgICAgIGZvcihzaXplX3QgX2lkeCA9IDA7IF9pZHgrMSA8IGV2ZW50cy5zaXplKCk7IF9pZHgrKykgewogICAgICAgICAgICBFdmVudCAmY3VycmVudCA9IGV2ZW50c1tfaWR4XTsKICAgICAgICAgICAgRXZlbnQgJm5leHQgPSBldmVudHNbX2lkeCsxXTsKIAogICAgICAgICAgICBhbGl2ZVtjdXJyZW50Lndob10gPSBhbGl2ZVtjdXJyZW50Lndob10gKyBjdXJyZW50Lmluc2VydGVkOwogICAgICAgICAgICBpZihjdXJyZW50Lm51bWJlciA8IG5leHQubnVtYmVyIHx8IG5leHQud2hvIDwgMCkgewogICAgICAgICAgICAgICAgaWYoYWxpdmVbMF0gPiAwICYmIGFsaXZlWzFdID4gMCkgewogICAgICAgICAgICAgICAgICAgIHRvdGFsQ29tbW9uQ2FzZXMgKz0gbmV4dC5udW1iZXIgLSBjdXJyZW50Lm51bWJlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYWxpdmVbMF0gPSAwOwogICAgICAgIGFsaXZlWzFdID0gMDsKCiAgICAgICAgbG9uZyBsb25nIGxlZnRMZW5ndGhbXSA9IHswLCAwfTsKICAgICAgICBsb25nIGxvbmcgcmlnaHRMZW5ndGhbXSA9IHt0b3RhbExlbmd0aFswXSwgdG90YWxMZW5ndGhbMV19OwogCiAgICAgICAgZm9yKHNpemVfdCBfaWR4ID0gMDsgX2lkeCsxIDwgZXZlbnRzLnNpemUoKTsgX2lkeCsrKSB7CiAgICAgICAgICAgIEV2ZW50ICZjdXJyZW50ID0gZXZlbnRzW19pZHhdOwogICAgICAgICAgICBFdmVudCAmbmV4dCA9IGV2ZW50c1tfaWR4KzFdOwogCiAgICAgICAgICAgIGFsaXZlW2N1cnJlbnQud2hvXSA9IGFsaXZlW2N1cnJlbnQud2hvXSArIGN1cnJlbnQuaW5zZXJ0ZWQ7CiAgICAgICAgICAgIGlmKGN1cnJlbnQubnVtYmVyIDwgbmV4dC5udW1iZXIgfHwgbmV4dC53aG8gPCAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgbGVuZ3RoID0gKG5leHQubnVtYmVyIC0gY3VycmVudC5udW1iZXIpOwogCiAgICAgICAgICAgICAgICBmb3IoaW50IGk9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZihhbGl2ZVtpXSA+IDApIHJpZ2h0TGVuZ3RoW2ldID0gcmlnaHRMZW5ndGhbaV0gLSBsZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgIC8vIFs1LCA4KSBsZW5ndGg9MwogICAgICAgICAgICAgICAgLy8gNSwgNiAoNykKICAgICAgICAgICAgICAgIC8vICg1KSA2IDcKICAgICAgICAgICAgICAgIGF1dG8gdXBkYXRlID0gWyZdKGludCB4KSB7CiAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIHByb2IgPQogICAgICAgICAgICAgICAgICAgICAgICAzICogKGxlZnRMZW5ndGhbMF0gKyB4ICogYWxpdmVbMF0pICogKHJpZ2h0TGVuZ3RoWzFdICsgKGxlbmd0aCAtIDEgLSB4KSAqIGFsaXZlWzFdKSArCiAgICAgICAgICAgICAgICAgICAgICAgIDMgKiAobGVmdExlbmd0aFsxXSArIHggKiBhbGl2ZVsxXSkgKiAocmlnaHRMZW5ndGhbMF0gKyAobGVuZ3RoIC0gMSAtIHgpICogYWxpdmVbMF0pOwogICAgICAgICAgICAgICAgICAgIHByb2IgKz0gMSAqIHRvdGFsQ29tbW9uQ2FzZXM7CiAgICAgICAgICAgICAgICAgICAgaWYoYWxpdmVbMF0gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9iICs9IDEgKiAxICogdG90YWxMZW5ndGhbMV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmKGFsaXZlWzFdID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYiArPSAxICogdG90YWxMZW5ndGhbMF0gKiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihhbGl2ZVswXSA9PSAxICYmIGFsaXZlWzFdID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYiAtPSAyICogMSAqIDEgKiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVBbnN3ZXIoY3VycmVudC5udW1iZXIgKyB4LCBwcm9iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvYjsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgIHVwZGF0ZSgwKTsKICAgICAgICAgICAgICAgIHVwZGF0ZShsZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgbG93ID0gMDsKICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaCA9IGxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUoaGlnaCAtIGxvdyA+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVwZGF0ZShtaWQpID4gdXBkYXRlKG1pZCsxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDsKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gbWlkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcihpbnQgeCA9IGxvdzsgeCA8PSBoaWdoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgZm9yKGludCBpPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoYWxpdmVbaV0gPiAwKSBsZWZ0TGVuZ3RoW2ldID0gbGVmdExlbmd0aFtpXSArIGxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KIAogICAgICAgIHByaW50ZigiJWRcbiIsIGJlc3RBbnN3ZXIpOwogCiAgICB9CiAKICAgIHJldHVybiAwOwp9IA==