/*
* @Author: hungeazy
* @Date: 2025-10-19 15:45:09
* @Last Modified by: hungeazy
* @Last Modified time: 2025-10-20 12:50:37
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
using namespace __gnu_pbds;
bool M1;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ll long long
#define ull unsigned long long
#define sz(x) x.size()
#define sqr(x) (1LL * (x) * (x))
#define all(x) x.begin(), x.end()
#define fill(f,x) memset(f,x,sizeof(f))
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define debug(x) cout << #x << " = " << x << '\n'
#define ii pair<int,int>
#define iii pair<int,ii>
#define di pair<ii,ii>
#define vi vector<int>
#define vii vector<ii>
#define mii map<int,int>
#define fi first
#define se second
#define pb push_back
#define MOD 1000000007
#define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define MASK(i) (1LL << (i))
#define c_bit(i) __builtin_popcountll(i)
#define BIT(x,i) ((x) & MASK(i))
#define SET_ON(x,i) ((x) | MASK(i))
#define SET_OFF(x,i) ((x) & ~MASK(i))
#define oo 1e18
#define name "JUMP"
#define endl '\n'
#define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
#define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
const int N = (int)2e5+10;
int n,q,h[N];
namespace sub1 {
bool approved () {
FOR(i,0,n-1)
if (h[i] != i+1) return false;
return true;
}
void solve(void)
{
while (q--)
{
int A,B,C,D;
cin >> A >> B >> C >> D;
cout << C-B << endl;
}
}
}
namespace sub2 {
int d[N];
bool approved() {
return n <= 200 and q <= 200;
}
void BFS(int p)
{
FOR(i,0,n-1) d[i] = oo;
d[p] = 0;
queue<int> q;
q.push(p);
while (!q.empty())
{
int u = q.front();
q.pop();
FOR(i,u+1,n-1)
if (h[i] > h[u])
{
if (minimize(d[i],d[u]+1))
q.push(i);
break;
}
FOD(i,u-1,0)
if (h[i] > h[u])
{
if (minimize(d[i],d[u]+1))
q.push(i);
break;
}
}
}
void solve(void)
{
while (q--)
{
int A,B,C,D;
cin >> A >> B >> C >> D;
int ans = oo;
FOR(i,A,B)
{
BFS(i);
FOR(j,C,D) minimize(ans,d[j]);
}
cout << (ans == oo ? -1 : ans) << endl;
}
}
}
namespace sub3 {
int L[N],R[N],d[N];
queue<int> Q;
bool approved() {
return n <= 2e3 and q <= 2e3;
}
void solve(void)
{
stack<int> st;
FOR(i,0,n-1)
{
while (!st.empty() and h[st.top()] <= h[i])
st.pop();
if (st.empty()) L[i] = -1;
else L[i] = st.top();
st.push(i);
}
while (!st.empty()) st.pop();
FOD(i,n-1,0)
{
while (!st.empty() and h[st.top()] <= h[i])
st.pop();
if (st.empty()) R[i] = n;
else R[i] = st.top();
st.push(i);
}
while (q--)
{
int A,B,C,D;
cin >> A >> B >> C >> D;
int ans = oo;
FOR(i,A,B)
{
int j = i;
while (j < n)
{
d[j] = oo;
j = R[j];
}
j = i;
while (j >= 0)
{
d[j] = oo;
j = L[j];
}
d[i] = 0;
Q.push(i);
while (!Q.empty())
{
int u = Q.front();
Q.pop();
if (R[u] < n and minimize(d[R[u]],d[u]+1))
{
Q.push(R[u]);
if (R[u] >= C and R[u] <= D)
minimize(ans,d[R[u]]);
}
if (L[u] >= 0 and minimize(d[L[u]],d[u]+1))
{
Q.push(L[u]);
if (L[u] >= C and L[u] <= D)
minimize(ans,d[L[u]]);
}
}
}
cout << (ans == oo ? -1 : ans) << endl;
}
}
}
namespace sub7 {
int L[N][20],R[N][20],nxt[N][20];
int isReal(int u, int v)
{
if (u == n) return v;
if (v == n) return u;
return (h[u] > h[v] ? u : v);
}
int jump(int A, int B, int C, int D)
{
int ans = 0;
FOD(i,19,0)
if (A <= L[B][i] and R[L[B][i]][0] <= D)
B = L[B][i];
if (C <= R[B][0] and R[B][0] <= D) return 1;
FOD(i,19,0)
if (R[nxt[B][i]][0] < C)
{
B = nxt[B][i];
ans += MASK(i);
}
if (R[nxt[B][0]][0] <= D) return ans+2;
FOD(i,19,0)
if (R[B][i] < C)
{
B = R[B][i];
ans += MASK(i);
}
return (C <= R[B][0] and R[B][0] <= D ? ans+1 : -1);
}
void solve(void)
{
FOR(j,0,19)
FOR(i,0,n+1)
L[i][j] = R[i][j] = nxt[i][j] = n;
stack<int> st;
FOR(i,0,n-1)
{
while (!st.empty() and h[st.top()] <= h[i])
st.pop();
if (st.empty()) L[i][0] = n;
else L[i][0] = st.top();
st.push(i);
}
while (!st.empty()) st.pop();
FOD(i,n-1,0)
{
while (!st.empty() and h[st.top()] <= h[i])
st.pop();
if (st.empty()) R[i][0] = n;
else R[i][0] = st.top();
st.push(i);
}
FOR(i,0,n-1) nxt[i][0] = isReal(L[i][0],R[i][0]);
FOR(j,1,19)
FOR(i,0,n-1)
{
L[i][j] = L[L[i][j-1]][j-1];
R[i][j] = R[R[i][j-1]][j-1];
nxt[i][j] = nxt[nxt[i][j-1]][j-1];
}
while (q--)
{
int A,B,C,D;
cin >> A >> B >> C >> D;
cout << jump(A,B,C,D) << endl;
}
}
}
bool M2;
signed main()
{
fast;
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> n >> q;
FOR(i,0,n-1) cin >> h[i];
if (sub1::approved()) return sub1::solve(), time(), memory(), 0;
if (sub2::approved()) return sub2::solve(), time(), memory(), 0;
// if (sub3::approved()) return sub3::solve(), time(), memory(), 0;
sub7::solve();
time();
memory();
return 0;
}
// ██░ ██ █ ██ ███▄ █ ▄████
//▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
//▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
//░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
//░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
// ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
// ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
// ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
// ░ ░ ░ ░ ░ ░
LyoKKiBAQXV0aG9yOiBodW5nZWF6eQoqIEBEYXRlOiAgIDIwMjUtMTAtMTkgMTU6NDU6MDkKKiBATGFzdCBNb2RpZmllZCBieTogICBodW5nZWF6eQoqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjUtMTAtMjAgMTI6NTA6MzcKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4gCiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPiAKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikgIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikgIAovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIscG9wY250LGx6Y250IikgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsgCmJvb2wgTTE7CiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgc3ooeCkgeC5zaXplKCkKI2RlZmluZSBzcXIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgZmlsbChmLHgpIG1lbXNldChmLHgsc2l6ZW9mKGYpKQojZGVmaW5lIEZPUihpLGwscikgZm9yKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IoaW50IGk9cjtpPj1sO2ktLSkKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBpaWkgcGFpcjxpbnQsaWk+CiNkZWZpbmUgZGkgcGFpcjxpaSxpaT4KI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8aWk+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBfX2xjbShhLGIpICgxbGwgKiAoKGEpIC8gX19nY2QoKGEpLCAoYikpKSAqIChiKSkKI2RlZmluZSBZRVMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgTk8gY291dCA8PCAiTk9cbiIKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIGNfYml0KGkpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKGkpCiNkZWZpbmUgQklUKHgsaSkgKCh4KSAmIE1BU0soaSkpCiNkZWZpbmUgU0VUX09OKHgsaSkgKCh4KSB8IE1BU0soaSkpCiNkZWZpbmUgU0VUX09GRih4LGkpICgoeCkgJiB+TUFTSyhpKSkKI2RlZmluZSBvbyAxZTE4CiNkZWZpbmUgbmFtZSAiSlVNUCIKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBtZW1vcnkoKSBjZXJyIDw8IGFicygmTTItJk0xKS8xMDI0LjAvMTAyNCA8PCAiIE1CIiA8PCBlbmRsCiNkZWZpbmUgdGltZSgpIGNlcnIgPDwgZW5kbCA8PCAiLS0tLS0tLS0tLS0tLVRpbWU6IiA8PCAxMDAwLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgIm1zLiIgPDwgZW5kbAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIG1heGltaXplKFQgJnJlcywgY29uc3QgVCAmdmFsKSB7IGlmIChyZXMgPCB2YWwpeyByZXMgPSB2YWw7IHJldHVybiB0cnVlOyB9OyByZXR1cm4gZmFsc2U7IH0KdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBtaW5pbWl6ZShUICZyZXMsIGNvbnN0IFQgJnZhbCkgeyBpZiAocmVzID4gdmFsKXsgcmVzID0gdmFsOyByZXR1cm4gdHJ1ZTsgfTsgcmV0dXJuIGZhbHNlOyB9CnRlbXBsYXRlIDxjbGFzcyBUPiB1c2luZyBvcmRlcmVkX3NldCA9IHRyZWUgPFQsIG51bGxfdHlwZSwgbGVzc19lcXVhbCA8VD4sIHJiX3RyZWVfdGFnLHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT47CmNvbnN0IGludCBOID0gKGludCkyZTUrMTA7CmludCBuLHEsaFtOXTsKCm5hbWVzcGFjZSBzdWIxIHsKCglib29sIGFwcHJvdmVkICgpIHsKCQlGT1IoaSwwLG4tMSkKCQkJaWYgKGhbaV0gIT0gaSsxKSByZXR1cm4gZmFsc2U7CgkJcmV0dXJuIHRydWU7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCXdoaWxlIChxLS0pCgkJewoJCQlpbnQgQSxCLEMsRDsKCQkJY2luID4+IEEgPj4gQiA+PiBDID4+IEQ7CgkJCWNvdXQgPDwgQy1CIDw8IGVuZGw7CgkJfQoJfQoJCn0KCm5hbWVzcGFjZSBzdWIyIHsKCglpbnQgZFtOXTsKCglib29sIGFwcHJvdmVkKCkgewoJCXJldHVybiBuIDw9IDIwMCBhbmQgcSA8PSAyMDA7Cgl9CgoJdm9pZCBCRlMoaW50IHApCgl7CgkJRk9SKGksMCxuLTEpIGRbaV0gPSBvbzsKCQlkW3BdID0gMDsKCQlxdWV1ZTxpbnQ+IHE7CgkJcS5wdXNoKHApOwoJCXdoaWxlICghcS5lbXB0eSgpKQoJCXsKCQkJaW50IHUgPSBxLmZyb250KCk7CgkJCXEucG9wKCk7CgkJCUZPUihpLHUrMSxuLTEpCgkJCQlpZiAoaFtpXSA+IGhbdV0pCgkJCQl7CgkJCQkJaWYgKG1pbmltaXplKGRbaV0sZFt1XSsxKSkKCQkJCQkJcS5wdXNoKGkpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQlGT0QoaSx1LTEsMCkKCQkJCWlmIChoW2ldID4gaFt1XSkKCQkJCXsKCQkJCQlpZiAobWluaW1pemUoZFtpXSxkW3VdKzEpKQoJCQkJCQlxLnB1c2goaSk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJfQoJfQoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQl3aGlsZSAocS0tKQoJCXsKCQkJaW50IEEsQixDLEQ7CgkJCWNpbiA+PiBBID4+IEIgPj4gQyA+PiBEOwoJCQlpbnQgYW5zID0gb287CgkJCUZPUihpLEEsQikgCgkJCXsKCQkJCUJGUyhpKTsKCQkJCUZPUihqLEMsRCkgbWluaW1pemUoYW5zLGRbal0pOwoJCQl9CgkJCWNvdXQgPDwgKGFucyA9PSBvbyA/IC0xIDogYW5zKSA8PCBlbmRsOwoJCX0KCX0KCn0KCm5hbWVzcGFjZSBzdWIzIHsKCglpbnQgTFtOXSxSW05dLGRbTl07CglxdWV1ZTxpbnQ+IFE7CgoJYm9vbCBhcHByb3ZlZCgpIHsKCQlyZXR1cm4gbiA8PSAyZTMgYW5kIHEgPD0gMmUzOwoJfQoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQlzdGFjazxpbnQ+IHN0OwoJCUZPUihpLDAsbi0xKQoJCXsKCQkJd2hpbGUgKCFzdC5lbXB0eSgpIGFuZCBoW3N0LnRvcCgpXSA8PSBoW2ldKQoJCQkJc3QucG9wKCk7CgkJCWlmIChzdC5lbXB0eSgpKSBMW2ldID0gLTE7CgkJCWVsc2UgTFtpXSA9IHN0LnRvcCgpOwoJCQlzdC5wdXNoKGkpOwoJCX0KCQl3aGlsZSAoIXN0LmVtcHR5KCkpIHN0LnBvcCgpOwoJCUZPRChpLG4tMSwwKQoJCXsKCQkJd2hpbGUgKCFzdC5lbXB0eSgpIGFuZCBoW3N0LnRvcCgpXSA8PSBoW2ldKQoJCQkJc3QucG9wKCk7CgkJCWlmIChzdC5lbXB0eSgpKSBSW2ldID0gbjsKCQkJZWxzZSBSW2ldID0gc3QudG9wKCk7CgkJCXN0LnB1c2goaSk7CgkJfQoJCXdoaWxlIChxLS0pCgkJewoJCQlpbnQgQSxCLEMsRDsKCQkJY2luID4+IEEgPj4gQiA+PiBDID4+IEQ7CgkJCWludCBhbnMgPSBvbzsKCQkJRk9SKGksQSxCKQoJCQl7CgkJCQlpbnQgaiA9IGk7CgkJCQl3aGlsZSAoaiA8IG4pIAoJCQkJewoJCQkJCWRbal0gPSBvbzsKCQkJCQlqID0gUltqXTsKCQkJCX0KCQkJCWogPSBpOwoJCQkJd2hpbGUgKGogPj0gMCkKCQkJCXsKCQkJCQlkW2pdID0gb287CgkJCQkJaiA9IExbal07CgkJCQl9CgkJCQlkW2ldID0gMDsKCQkJCVEucHVzaChpKTsKCQkJCXdoaWxlICghUS5lbXB0eSgpKQoJCQkJewoJCQkJCWludCB1ID0gUS5mcm9udCgpOwoJCQkJCVEucG9wKCk7CgkJCQkJaWYgKFJbdV0gPCBuIGFuZCBtaW5pbWl6ZShkW1JbdV1dLGRbdV0rMSkpCgkJCQkJewoJCQkJCQlRLnB1c2goUlt1XSk7CgkJCQkJCWlmIChSW3VdID49IEMgYW5kIFJbdV0gPD0gRCkKCQkJCQkJCW1pbmltaXplKGFucyxkW1JbdV1dKTsKCQkJCQl9CgkJCQkJaWYgKExbdV0gPj0gMCBhbmQgbWluaW1pemUoZFtMW3VdXSxkW3VdKzEpKQoJCQkJCXsKCQkJCQkJUS5wdXNoKExbdV0pOwoJCQkJCQlpZiAoTFt1XSA+PSBDIGFuZCBMW3VdIDw9IEQpCgkJCQkJCQltaW5pbWl6ZShhbnMsZFtMW3VdXSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWNvdXQgPDwgKGFucyA9PSBvbyA/IC0xIDogYW5zKSA8PCBlbmRsOwoJCX0KCX0KCn0KCm5hbWVzcGFjZSBzdWI3IHsKCglpbnQgTFtOXVsyMF0sUltOXVsyMF0sbnh0W05dWzIwXTsKCglpbnQgaXNSZWFsKGludCB1LCBpbnQgdikgCgl7CgkJaWYgKHUgPT0gbikgcmV0dXJuIHY7CgkJaWYgKHYgPT0gbikgcmV0dXJuIHU7CgkJcmV0dXJuIChoW3VdID4gaFt2XSA/IHUgOiB2KTsKCX0KCglpbnQganVtcChpbnQgQSwgaW50IEIsIGludCBDLCBpbnQgRCkKCXsKCQlpbnQgYW5zID0gMDsKCQlGT0QoaSwxOSwwKQoJCQlpZiAoQSA8PSBMW0JdW2ldIGFuZCBSW0xbQl1baV1dWzBdIDw9IEQpCgkJCQlCID0gTFtCXVtpXTsKCQlpZiAoQyA8PSBSW0JdWzBdIGFuZCBSW0JdWzBdIDw9IEQpIHJldHVybiAxOwoJCUZPRChpLDE5LDApCgkJCWlmIChSW254dFtCXVtpXV1bMF0gPCBDKQoJCQl7CgkJCQlCID0gbnh0W0JdW2ldOwoJCQkJYW5zICs9IE1BU0soaSk7CgkJCX0KCQlpZiAoUltueHRbQl1bMF1dWzBdIDw9IEQpIHJldHVybiBhbnMrMjsKCQlGT0QoaSwxOSwwKQoJCQlpZiAoUltCXVtpXSA8IEMpCgkJCXsKCQkJCUIgPSBSW0JdW2ldOwoJCQkJYW5zICs9IE1BU0soaSk7CgkJCX0KCQlyZXR1cm4gKEMgPD0gUltCXVswXSBhbmQgUltCXVswXSA8PSBEID8gYW5zKzEgOiAtMSk7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCUZPUihqLDAsMTkpCgkJCUZPUihpLDAsbisxKSAKCQkJCUxbaV1bal0gPSBSW2ldW2pdID0gbnh0W2ldW2pdID0gbjsKCQlzdGFjazxpbnQ+IHN0OwoJCUZPUihpLDAsbi0xKQoJCXsKCQkJd2hpbGUgKCFzdC5lbXB0eSgpIGFuZCBoW3N0LnRvcCgpXSA8PSBoW2ldKQoJCQkJc3QucG9wKCk7CgkJCWlmIChzdC5lbXB0eSgpKSBMW2ldWzBdID0gbjsKCQkJZWxzZSBMW2ldWzBdID0gc3QudG9wKCk7CgkJCXN0LnB1c2goaSk7CgkJfQoJCXdoaWxlICghc3QuZW1wdHkoKSkgc3QucG9wKCk7CgkJRk9EKGksbi0xLDApCgkJewoJCQl3aGlsZSAoIXN0LmVtcHR5KCkgYW5kIGhbc3QudG9wKCldIDw9IGhbaV0pCgkJCQlzdC5wb3AoKTsKCQkJaWYgKHN0LmVtcHR5KCkpIFJbaV1bMF0gPSBuOwoJCQllbHNlIFJbaV1bMF0gPSBzdC50b3AoKTsKCQkJc3QucHVzaChpKTsKCQl9CgkJRk9SKGksMCxuLTEpIG54dFtpXVswXSA9IGlzUmVhbChMW2ldWzBdLFJbaV1bMF0pOwoJCUZPUihqLDEsMTkpCgkJCUZPUihpLDAsbi0xKQoJCQl7CgkJCQlMW2ldW2pdID0gTFtMW2ldW2otMV1dW2otMV07CgkJCQlSW2ldW2pdID0gUltSW2ldW2otMV1dW2otMV07CgkJCQlueHRbaV1bal0gPSBueHRbbnh0W2ldW2otMV1dW2otMV07CgkJCX0KCQl3aGlsZSAocS0tKQoJCXsKCQkJaW50IEEsQixDLEQ7CgkJCWNpbiA+PiBBID4+IEIgPj4gQyA+PiBEOwoJCQljb3V0IDw8IGp1bXAoQSxCLEMsRCkgPDwgZW5kbDsKCQl9Cgl9Cgp9Cgpib29sIE0yOwpzaWduZWQgbWFpbigpCnsKICAgIGZhc3Q7CiAgICBpZiAoZm9wZW4obmFtZSIuaW5wIiwiciIpKQogICAgewogICAgCWZyZW9wZW4obmFtZSIuaW5wIiwiciIsc3RkaW4pOwogICAgCWZyZW9wZW4obmFtZSIub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KICAgIGNpbiA+PiBuID4+IHE7CiAgICBGT1IoaSwwLG4tMSkgY2luID4+IGhbaV07CiAgIAlpZiAoc3ViMTo6YXBwcm92ZWQoKSkgcmV0dXJuIHN1YjE6OnNvbHZlKCksIHRpbWUoKSwgbWVtb3J5KCksIDA7CiAgIAlpZiAoc3ViMjo6YXBwcm92ZWQoKSkgcmV0dXJuIHN1YjI6OnNvbHZlKCksIHRpbWUoKSwgbWVtb3J5KCksIDA7CiAgIAkvLyBpZiAoc3ViMzo6YXBwcm92ZWQoKSkgcmV0dXJuIHN1YjM6OnNvbHZlKCksIHRpbWUoKSwgbWVtb3J5KCksIDA7CiAgIAlzdWI3Ojpzb2x2ZSgpOwogICAgdGltZSgpOwogICAgbWVtb3J5KCk7CiAgICByZXR1cm4gMDsKfQovLyDilojilojilpEg4paI4paIICDiloggICAg4paI4paIICDilojilojilojiloQgICAg4paIICAg4paE4paI4paI4paI4paICi8v4paT4paI4paI4paRIOKWiOKWiOKWkiDilojiloggIOKWk+KWiOKWiOKWkiDilojilogg4paA4paIICAg4paIICDilojilojilpIg4paA4paI4paSCi8v4paS4paI4paI4paA4paA4paI4paI4paR4paT4paI4paIICDilpLilojilojilpHilpPilojiloggIOKWgOKWiCDilojilojilpLilpLilojilojilpHiloTiloTiloTilpEKLy/ilpHilpPilogg4paR4paI4paIIOKWk+KWk+KWiCAg4paR4paI4paI4paR4paT4paI4paI4paSICDilpDilozilojilojilpLilpHilpPiloggIOKWiOKWiOKWkwovL+KWkeKWk+KWiOKWkuKWkeKWiOKWiOKWk+KWkuKWkuKWiOKWiOKWiOKWiOKWiOKWkyDilpLilojilojilpEgICDilpPilojilojilpHilpHilpLilpPilojilojilojiloDilpIKLy8g4paSIOKWkeKWkeKWkuKWkeKWkuKWkeKWkuKWk+KWkiDilpIg4paSIOKWkSDilpLilpEgICDilpIg4paSICDilpHilpIgICDilpIKLy8g4paSIOKWkeKWkuKWkSDilpHilpHilpHilpLilpEg4paRIOKWkSDilpEg4paR4paRICAg4paRIOKWkuKWkSAg4paRICAg4paRCi8vIOKWkSAg4paR4paRIOKWkSDilpHilpHilpEg4paRIOKWkSAgICDilpEgICDilpEg4paRIOKWkSDilpEgICDilpEKLy8g4paRICDilpEgIOKWkSAgIOKWkSAgICAgICAgICAgICAg4paRICAgICAgIOKWkQ==