#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;
#define output(v) for(auto&it:v){cout<<it<<" ";}cout<<"\n"
#define input(v) for(auto&it:v){cin>>it;}
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
const int N = 1e6+5;
const int MOD = 1e9+7;
const double pi= 3.1415926535897932;
//======================================================
void FastCode()
{
std::ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
}
//======================================================
struct DSU{
vector<int> parent;
vector<int> sizeOfGroup;
DSU(int N){
parent.resize(N+5);
sizeOfGroup.resize(N+5);
for(int i = 0 ; i < N ; i++){
parent[i] = i;
sizeOfGroup[i] = 1;
}
}
ll getLeader(int i){
if(i == parent[i]) return i;
else return parent[i] = getLeader(parent[i]);
}
bool sameGroup(int x , int y){
return getLeader(x) == getLeader(y);
}
void mergeGroup(int x , int y){
int leader1 = getLeader(x);
int leader2 = getLeader(y);
if(leader1 == leader2) return;
else if(sizeOfGroup[leader1]>sizeOfGroup[leader2]){
parent[leader2] = leader1;
sizeOfGroup[leader1]+=sizeOfGroup[leader2];
}else{
parent[leader1] = leader2;
sizeOfGroup[leader2]+=sizeOfGroup[leader1];
}
}
int getSize(int x){
return sizeOfGroup[getLeader(x)];
}
};
//======================================================
struct FenwickTree{
vector<ll> arr;
int n;
FenwickTree(int N){
n=N;
arr.resize(N+5);
}
void update(ll idx , ll val){
while(idx < n+5){
arr[idx]+=val;
idx += idx&-idx;
}
}
ll sum(ll idx){
ll s=0;
while(idx){
s+=arr[idx];
idx -= idx&-idx;
}
return s;
}
ll sum(ll l , ll r){
return sum(r)-sum(l-1);
}
ll get(int idx){
return sum(idx)-sum(idx-1);
}
};
//======================================================
struct SegmentTreeRangeSum{
int size;
vector<ll> arr;
SegmentTreeRangeSum(vector<ll> &a){
size = 1;
int n = a.size();
while(size < n) size *= 2;
arr.assign(size*2 , 0ll);
build( a,0,0,size);
}
void build(vector<ll> &a , int x , int lx , int rx){
if(rx-lx == 1){
if(lx < a.size()) arr[x] = a[lx];
return;
}
int md = (lx+rx)>>1;
build(a , 2*x+1 , lx , md);
build(a , 2*x+2 , md , rx);
arr[x] = arr[2*x+1] + arr[2*x+2];
}
void set(int idx , int val , int x , int lx , int rx){
if(rx-lx == 1){
arr[x] = val;
return;
}
int md = (lx+rx)>>1;
if(idx < md){
set(idx , val , 2*x+1 , lx ,md);
}else{
set(idx , val , 2*x+2 , md ,rx);
}
arr[x] = arr[2*x+1] + arr[2*x+2];
}
void set(int idx , ll val){
set(idx , val , 0 , 0 , size);
}
ll sum(int l , int r, int cur , int lx , int rx){
if(lx >= r || l >= rx) return 0;
else if(lx >= l && r >= rx) return arr[cur];
int md = (lx+rx)>>1;
return sum(l , r , 2*cur+1 , lx , md) + sum(l , r , 2*cur+2 , md , rx);
}
ll sum(int l , int r){
return sum(l , r , 0 , 0 , size);
}
};
//======================================================
struct SegmentTreeMinVal{
int size;
vector<pair<ll , int>> tree;
SegmentTreeMinVal(int n){
size = 1;
while(size < n) size *= 2;
tree.assign(2*size-1 , {LLONG_MAX , 1});
}
void insert(int idx , ll val , int x , int lx , int rx){
if(rx - lx == 1){
tree[x] = {val , 1};
return;
}
int md = (rx+lx)>>1;
if(idx < md){
insert(idx ,val , 2*x+1 , lx , md);
}else{
insert(idx ,val , 2*x+2 , md , rx);
}
pair<ll , int> p1 = tree[2*x+1];
pair<ll , int> p2 = tree[2*x+2];
if(p1.first == p2.first)
tree[x] = {p1.first , p1.second + p2.second};
else if(p1.first > p2.first)
tree[x] = p2;
else tree[x] = p1;
}
void insert(int idx , ll val){
insert(idx , val , 0 , 0 , size);
}
pair<ll , int> getMinVal(int l , int r , int x , int lx , int rx){
if(lx >= r || l >= rx) return {LLONG_MAX , 1};
else if(lx >= l && rx <= r) return tree[x];
else{
int md = (lx+rx)>>1;
pair<ll , int> p1 = getMinVal(l , r , 2*x+1 , lx , md);
pair<ll , int> p2 = getMinVal(l , r , 2*x+2 , md , rx);
if(p1.first == p2.first) return {p1.first , p1.second+p2.second};
else if(p1.first > p2.first) return p2;
else return p1;
}
}
pair<ll , int> getMinVal(int l , int r){
return getMinVal(l , r , 0 , 0 , size);
}
};
//======================================================
ll gcd(ll a , ll b){
if(min(a,b) == 0) return max(a,b);
else return gcd(b , a%b);
}
//======================================================
ll lcm(ll a , ll b){
return a / gcd(a,b) * b;
}
//======================================================
ll KadaneMaxSum(vector<ll> &arr){
ll globalSum = arr[0];
ll curSum = arr[0];
int n = arr.size();
for(int i = 1 ; i < n ; i++){
curSum = max(arr[i] ,curSum+arr[i]);
globalSum = max(globalSum , curSum);
}
return globalSum;
}
//======================================================
ll KadaneMinSum(vector<ll> &arr){
ll globalSum = arr[0];
ll curSum = arr[0];
int n = arr.size();
for(int i = 1 ; i < n ; i++){
curSum = min(arr[i] ,curSum+arr[i]);
globalSum = min(globalSum , curSum);
}
return globalSum;
}
//======================================================
struct Sieve{
int N;
vector<int> primes;
vector<int> isPrime;
Sieve(int n){
N = n;
isPrime.resize(N+5);
for(int i = 0 ; i < N+5 ; i++)
isPrime[i] = true;
sieve();
}
bool check(int x){
return isPrime[x];
}
void sieve(){
isPrime[0] = isPrime[1] = false;
for(int i = 2 ; i*i < N ; i++){
if(isPrime[i])
for(int j = i*i ; j< N ; j+=i){
isPrime[j] = false;
}
}
for(int i = 2 ; i < N ; i++)
if(isPrime[i])
primes.push_back(i);
}
};
//======================================================
ll stringMod(string num , ll mod){
ll ans = 0;
int n = num.size();
for(int i = 0 ; i < n ; i++){
int d = num[i]-'0';
ans = (ans*10+d)%mod;
}
return ans;
}
//======================================================
ll fp(ll base , ll pow , int cMod = MOD){
ll ans = 1;
while(pow){
if(pow&1) ans = (ans%cMod * base%cMod)%cMod;
base = (base*base)%cMod;
pow >>=1;
}
return ans;
}
//======================================================
bool isPrime(ll n){ //not optimise
for(int i = 2 ; i*i<=n ; i++)
if(n%i == 0) return false;
return true;
}
//======================================================
ll findXOR(ll n){
ll mod = n % 4;
if (mod == 0)
return n;
else if (mod == 1)
return 1;
else if (mod == 2)
return n + 1;
else if (mod == 3)
return 0;
}
//======================================================
ll findXOR(ll l, ll r){
return (findXOR(l - 1) ^ findXOR(r));
}
//======================================================
struct combinatorics{
vector<ll> fac;
vector<ll> invers;
combinatorics(){
fac.push_back(1);
invers.push_back(1);
for(int i = 1 ; i < 1e6 ; i++){
fac.push_back( (fac.back()*i)%MOD );
invers.push_back(fp(fac.back() , MOD-2)%MOD);
}
}
ll nCr(int n , int r){
return (fac[n]%MOD * invers[r]%MOD * invers[n-r]%MOD)%MOD;
}ll nPr(int n , int r){
return (fac[n]%MOD * invers[n-r]%MOD)%MOD;
}
};
//======================================================
vector<int> childCnt(N);
int countChild(int root , int cnt ,vector<vector<int>> &adj, vector<bool> &vis){
vis[root] = true;
for(int num : adj[root])
if(!vis[num])
cnt += countChild(num,1 , adj , vis);
childCnt[root] = cnt-1;
return cnt;
}
//======================================================
class comp{
public:
bool operator()(pair<int , int> a , pair<int , int> b){
if(a.first != b.first) return a.first<b.first;
else return a.second>b.second;
}
};
//=====================================================
int dijkstra(vector<vector<pair<int , int>>> &adj , ll u , ll v){
int oo = 1e7;
ll dic[adj.size()+5];
ll par[adj.size()+5];
for(ll i = 0 ; i < adj.size()+5 ; i++)
dic[i] = oo , par[i] = 0;;
priority_queue<pair<ll , ll> , vector<pair<ll , ll>> , greater<>> pq;
pq.push({0 , u});
dic[u] = 0;
while(!pq.empty()){
ll cost = pq.top().first;
ll node = pq.top().second;
pq.pop();
if(cost > dic[node]) continue;
for(auto child : adj[node]){
int nxtCost = child.second;
if(nxtCost + cost < dic[child.first]){
dic[child.first] = nxtCost + cost;
par[child.first] = node;
pq.push({nxtCost + cost , child.first});
}
}
}
return dic[v];
}
//=====================================================
bool bellman_ford(ll src ,ll n , vector<pair<pair<ll , ll> , ll>> &list){
ll dist[n+1];
ll oo = 1e9;
for(ll i = 1 ; i <= n ; i++ )
dist[i] = oo;
dist[src] = 0;
for(ll i = 1 ; i <= n ;i++){
for(ll j = 0 ; j < list.size() ; j++){
if(dist[list[j].first.first] + list[j].second < dist[list[j].first.second]){
dist[list[j].first.second] = dist[list[j].first.first] + list[j].second;
if(i == n) return true;
}
}
}
return false;
}
//=====================================================
vector<vector<int>> floydList;
void floyd_warshall(int n , vector<pair<pair<int , int> , int>> &list){
int oo = 1e8;
floydList.assign(n+1 , vector<int>(n+1 , oo));
for(int i = 1 ; i <= n ;i++)
floydList[i][i] = 0;
for(pair<pair<int , int> , int> p : list){
floydList[p.first.first][p.first.second] = p.second;
floydList[p.first.second][p.first.first] = p.second;
}
for(int k = 1 ; k <= n ; k++)
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n ; j++)
floydList[i][j] = min(floydList[i][j] , floydList[i][k] + floydList[k][j]);
}
//=====================================================
void File(){
// freopen("doroob.in", "r", stdin);
// freopen("output.txt", "w", stdout);
}
//=====================================================
void testCase(ll ct){
ll n , m;
cin >> n >> m;
ll rx , ry , mx , my;
cin >> rx >> ry >> mx >> my;
if(rx > mx){
cout<<"-1\n";
return;
}
if(ry > my){
my = ry + (ry-my);
}
ll ans = 1e17;
ll st = 0 , en = 2e10;
while(st<=en){
ll md = st+en>>1;
ll tempx =rx+md, tempy=ry+md;
if(tempx > mx){
en = md-1;
continue;
}
if(tempy > m){
en = md-1;
continue;
}
if(tempy < my){
st = md+1;
continue;
}
ll dis = mx-tempx;
if(tempy-dis == my){
ans = min(ans,md+dis);
break;
}
else if(tempy-dis > my){
en = md-1;
}else{
st = md+1;
}
}
st = 0 , en = 2e10;
while(st<=en){
ll md = st+en>>1;
ll tempx =rx+md, tempy=ry-md;
if(tempx > mx){
en = md-1;
continue;
}
if(tempy <=0){
en = md-1;
continue;
}
if(tempy > my){
st = md+1;
continue;
}
ll dis = mx-tempx;
if(tempy+dis == my){
ans = min(ans,md+dis);
break;
}
else if(tempy+dis > my){
st = md+1;
}else{
en = md-1;
}
}
if(ans == 1e17) ans = -1;
cout<<ans<<"\n";
}
int main(){
File();
FastCode();
int t = 1;
cin >> t;
for(int i = 1 ; i <= t ; i++)
testCase(i);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CiNkZWZpbmUgb3V0cHV0KHYpIGZvcihhdXRvJml0OnYpe2NvdXQ8PGl0PDwiICI7fWNvdXQ8PCJcbiIKI2RlZmluZSBpbnB1dCh2KSBmb3IoYXV0byZpdDp2KXtjaW4+Pml0O30KI2RlZmluZSBvcmRlcmVkX3NldCB0cmVlPGludCwgbnVsbF90eXBlLGxlc3M8aW50PiwgcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPgpjb25zdCBpbnQgTiA9IDFlNis1Owpjb25zdCBpbnQgTU9EID0gMWU5Kzc7CmNvbnN0IGRvdWJsZSBwaT0gMy4xNDE1OTI2NTM1ODk3OTMyOwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp2b2lkIEZhc3RDb2RlKCkKewogICAgc3RkOjppb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZShOVUxMKTsKICAgIGNvdXQudGllKE5VTEwpOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnN0cnVjdCBEU1V7CiAgICB2ZWN0b3I8aW50PiBwYXJlbnQ7CiAgICB2ZWN0b3I8aW50PiBzaXplT2ZHcm91cDsKICAgIERTVShpbnQgTil7CiAgICAgICAgcGFyZW50LnJlc2l6ZShOKzUpOwogICAgICAgIHNpemVPZkdyb3VwLnJlc2l6ZShOKzUpOwogICAgICAgIGZvcihpbnQgaSA9IDAgOyBpIDwgTiA7IGkrKyl7CiAgICAgICAgICAgIHBhcmVudFtpXSA9IGk7CiAgICAgICAgICAgIHNpemVPZkdyb3VwW2ldID0gMTsKICAgICAgICB9CiAgICB9CiAgICBsbCBnZXRMZWFkZXIoaW50IGkpewogICAgICAgIGlmKGkgPT0gcGFyZW50W2ldKSByZXR1cm4gaTsKICAgICAgICBlbHNlIHJldHVybiBwYXJlbnRbaV0gPSBnZXRMZWFkZXIocGFyZW50W2ldKTsKICAgIH0KICAgIGJvb2wgc2FtZUdyb3VwKGludCB4ICwgaW50IHkpewogICAgICAgIHJldHVybiBnZXRMZWFkZXIoeCkgPT0gZ2V0TGVhZGVyKHkpOwogICAgfQogICAgdm9pZCBtZXJnZUdyb3VwKGludCB4ICwgaW50IHkpewogICAgICAgIGludCBsZWFkZXIxID0gZ2V0TGVhZGVyKHgpOwogICAgICAgIGludCBsZWFkZXIyID0gZ2V0TGVhZGVyKHkpOwogICAgICAgIGlmKGxlYWRlcjEgPT0gbGVhZGVyMikgcmV0dXJuOwogICAgICAgIGVsc2UgaWYoc2l6ZU9mR3JvdXBbbGVhZGVyMV0+c2l6ZU9mR3JvdXBbbGVhZGVyMl0pewogICAgICAgICAgICBwYXJlbnRbbGVhZGVyMl0gPSBsZWFkZXIxOwogICAgICAgICAgICBzaXplT2ZHcm91cFtsZWFkZXIxXSs9c2l6ZU9mR3JvdXBbbGVhZGVyMl07CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHBhcmVudFtsZWFkZXIxXSA9IGxlYWRlcjI7CiAgICAgICAgICAgIHNpemVPZkdyb3VwW2xlYWRlcjJdKz1zaXplT2ZHcm91cFtsZWFkZXIxXTsKICAgICAgICB9CiAgICB9CiAgICBpbnQgZ2V0U2l6ZShpbnQgeCl7CiAgICAgICAgcmV0dXJuIHNpemVPZkdyb3VwW2dldExlYWRlcih4KV07CiAgICB9Cgp9OwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdHJ1Y3QgRmVud2lja1RyZWV7CiAgICB2ZWN0b3I8bGw+IGFycjsKICAgIGludCBuOwogICAgRmVud2lja1RyZWUoaW50IE4pewogICAgICAgIG49TjsKICAgICAgICBhcnIucmVzaXplKE4rNSk7CiAgICB9CgogICAgdm9pZCB1cGRhdGUobGwgaWR4ICwgbGwgdmFsKXsKICAgICAgICB3aGlsZShpZHggPCBuKzUpewogICAgICAgICAgICBhcnJbaWR4XSs9dmFsOwogICAgICAgICAgICBpZHggKz0gaWR4Ji1pZHg7CiAgICAgICAgfQogICAgfQogICAgbGwgc3VtKGxsIGlkeCl7CiAgICAgICAgbGwgcz0wOwogICAgICAgIHdoaWxlKGlkeCl7CiAgICAgICAgICAgIHMrPWFycltpZHhdOwogICAgICAgICAgICBpZHggLT0gaWR4Ji1pZHg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgfQogICAgbGwgc3VtKGxsIGwgLCBsbCByKXsKICAgICAgICByZXR1cm4gc3VtKHIpLXN1bShsLTEpOwogICAgfQogICAgbGwgZ2V0KGludCBpZHgpewogICAgICAgIHJldHVybiBzdW0oaWR4KS1zdW0oaWR4LTEpOwogICAgfQp9OwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdHJ1Y3QgU2VnbWVudFRyZWVSYW5nZVN1bXsKICAgIGludCBzaXplOwogICAgdmVjdG9yPGxsPiBhcnI7CiAgICBTZWdtZW50VHJlZVJhbmdlU3VtKHZlY3RvcjxsbD4gJmEpewogICAgICAgIHNpemUgPSAxOwogICAgICAgIGludCBuID0gYS5zaXplKCk7CiAgICAgICAgd2hpbGUoc2l6ZSA8IG4pIHNpemUgKj0gMjsKICAgICAgICBhcnIuYXNzaWduKHNpemUqMiAsIDBsbCk7CiAgICAgICAgYnVpbGQoIGEsMCwwLHNpemUpOwogICAgfQogICAgdm9pZCBidWlsZCh2ZWN0b3I8bGw+ICZhICwgaW50IHggLCBpbnQgbHggLCBpbnQgcngpewogICAgICAgIGlmKHJ4LWx4ID09IDEpewogICAgICAgICAgICBpZihseCA8IGEuc2l6ZSgpKSBhcnJbeF0gPSBhW2x4XTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgbWQgPSAobHgrcngpPj4xOwogICAgICAgIGJ1aWxkKGEgLCAyKngrMSAsIGx4ICwgbWQpOwogICAgICAgIGJ1aWxkKGEgLCAyKngrMiAsIG1kICwgcngpOwogICAgICAgIGFyclt4XSA9IGFyclsyKngrMV0gKyBhcnJbMip4KzJdOwogICAgfQogICAgdm9pZCBzZXQoaW50IGlkeCAsIGludCB2YWwgLCBpbnQgeCAsIGludCBseCAsIGludCByeCl7CiAgICAgICAgaWYocngtbHggPT0gMSl7CiAgICAgICAgICAgIGFyclt4XSA9IHZhbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbnQgbWQgPSAobHgrcngpPj4xOwogICAgICAgIGlmKGlkeCA8IG1kKXsKICAgICAgICAgICAgc2V0KGlkeCAsIHZhbCAsIDIqeCsxICwgbHggLG1kKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgc2V0KGlkeCAsIHZhbCAsIDIqeCsyICwgbWQgLHJ4KTsKICAgICAgICB9CiAgICAgICAgYXJyW3hdID0gYXJyWzIqeCsxXSArIGFyclsyKngrMl07CiAgICB9CiAgICB2b2lkIHNldChpbnQgaWR4ICwgbGwgdmFsKXsKICAgICAgICBzZXQoaWR4ICwgdmFsICwgMCAsIDAgLCBzaXplKTsKICAgIH0KICAgIGxsIHN1bShpbnQgbCAsIGludCByLCBpbnQgY3VyICwgaW50IGx4ICwgaW50IHJ4KXsKICAgICAgICBpZihseCA+PSByIHx8IGwgPj0gcngpIHJldHVybiAwOwogICAgICAgIGVsc2UgaWYobHggPj0gbCAmJiByID49IHJ4KSByZXR1cm4gIGFycltjdXJdOwogICAgICAgIGludCBtZCA9IChseCtyeCk+PjE7CiAgICAgICAgcmV0dXJuIHN1bShsICwgciAsIDIqY3VyKzEgLCBseCAsIG1kKSArIHN1bShsICwgciAsIDIqY3VyKzIgLCBtZCAsIHJ4KTsKICAgIH0KICAgIGxsIHN1bShpbnQgbCAsIGludCByKXsKICAgICAgICByZXR1cm4gc3VtKGwgLCByICwgMCAsIDAgLCBzaXplKTsKICAgIH0KfTsKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kc3RydWN0IFNlZ21lbnRUcmVlTWluVmFsewogICAgaW50IHNpemU7CiAgICB2ZWN0b3I8cGFpcjxsbCAsIGludD4+IHRyZWU7CiAgICBTZWdtZW50VHJlZU1pblZhbChpbnQgbil7CiAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgd2hpbGUoc2l6ZSA8IG4pIHNpemUgKj0gMjsKICAgICAgICB0cmVlLmFzc2lnbigyKnNpemUtMSAsIHtMTE9OR19NQVggLCAxfSk7CiAgICB9CiAgICB2b2lkIGluc2VydChpbnQgaWR4ICwgbGwgdmFsICwgaW50IHggLCBpbnQgbHggLCBpbnQgcngpewogICAgICAgIGlmKHJ4IC0gbHggPT0gMSl7CiAgICAgICAgICAgIHRyZWVbeF0gPSB7dmFsICwgMX07CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaW50IG1kID0gKHJ4K2x4KT4+MTsKICAgICAgICBpZihpZHggPCBtZCl7CiAgICAgICAgICAgIGluc2VydChpZHggLHZhbCAsIDIqeCsxICwgbHggLCBtZCk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGluc2VydChpZHggLHZhbCAsIDIqeCsyICwgbWQgLCByeCk7CiAgICAgICAgfQogICAgICAgIHBhaXI8bGwgLCBpbnQ+IHAxID0gdHJlZVsyKngrMV07CiAgICAgICAgcGFpcjxsbCAsIGludD4gcDIgPSB0cmVlWzIqeCsyXTsKICAgICAgICBpZihwMS5maXJzdCA9PSBwMi5maXJzdCkKICAgICAgICAgICAgdHJlZVt4XSA9IHtwMS5maXJzdCAsIHAxLnNlY29uZCArIHAyLnNlY29uZH07CiAgICAgICAgZWxzZSBpZihwMS5maXJzdCA+IHAyLmZpcnN0KQogICAgICAgICAgICB0cmVlW3hdID0gcDI7CiAgICAgICAgZWxzZSB0cmVlW3hdID0gcDE7CiAgICB9CiAgICB2b2lkIGluc2VydChpbnQgaWR4ICwgbGwgdmFsKXsKICAgICAgICBpbnNlcnQoaWR4ICwgdmFsICwgMCAsIDAgLCBzaXplKTsKICAgIH0KICAgIHBhaXI8bGwgLCBpbnQ+IGdldE1pblZhbChpbnQgbCAsIGludCByICwgaW50IHggLCBpbnQgbHggLCBpbnQgcngpewogICAgICAgIGlmKGx4ID49IHIgfHwgbCA+PSByeCkgcmV0dXJuIHtMTE9OR19NQVggLCAxfTsKICAgICAgICBlbHNlIGlmKGx4ID49IGwgJiYgcnggPD0gcikgcmV0dXJuIHRyZWVbeF07CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgaW50IG1kID0gKGx4K3J4KT4+MTsKICAgICAgICAgICAgcGFpcjxsbCAsIGludD4gcDEgPSBnZXRNaW5WYWwobCAsIHIgLCAyKngrMSAsIGx4ICwgbWQpOwogICAgICAgICAgICBwYWlyPGxsICwgaW50PiBwMiA9IGdldE1pblZhbChsICwgciAsIDIqeCsyICwgbWQgLCByeCk7CiAgICAgICAgICAgIGlmKHAxLmZpcnN0ID09IHAyLmZpcnN0KSByZXR1cm4ge3AxLmZpcnN0ICwgcDEuc2Vjb25kK3AyLnNlY29uZH07CiAgICAgICAgICAgIGVsc2UgaWYocDEuZmlyc3QgPiBwMi5maXJzdCkgcmV0dXJuIHAyOwogICAgICAgICAgICBlbHNlIHJldHVybiBwMTsKICAgICAgICB9CiAgICB9CiAgICBwYWlyPGxsICwgaW50PiBnZXRNaW5WYWwoaW50IGwgLCBpbnQgcil7CiAgICAgICAgcmV0dXJuIGdldE1pblZhbChsICwgciAsIDAgLCAwICwgc2l6ZSk7CiAgICB9Cn07Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmxsIGdjZChsbCBhICwgbGwgYil7CiAgICBpZihtaW4oYSxiKSA9PSAwKSByZXR1cm4gbWF4KGEsYik7CiAgICBlbHNlIHJldHVybiBnY2QoYiAsIGElYik7Cn0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KbGwgbGNtKGxsIGEgLCBsbCBiKXsKICAgIHJldHVybiBhIC8gZ2NkKGEsYikgKiBiOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmxsIEthZGFuZU1heFN1bSh2ZWN0b3I8bGw+ICZhcnIpewogICAgbGwgZ2xvYmFsU3VtID0gYXJyWzBdOwogICAgbGwgY3VyU3VtID0gYXJyWzBdOwogICAgaW50IG4gPSBhcnIuc2l6ZSgpOwogICAgZm9yKGludCBpID0gMSA7IGkgPCBuIDsgaSsrKXsKICAgICAgICBjdXJTdW0gPSBtYXgoYXJyW2ldICxjdXJTdW0rYXJyW2ldKTsKICAgICAgICBnbG9iYWxTdW0gPSBtYXgoZ2xvYmFsU3VtICwgY3VyU3VtKTsKICAgIH0KICAgIHJldHVybiBnbG9iYWxTdW07Cn0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KbGwgS2FkYW5lTWluU3VtKHZlY3RvcjxsbD4gJmFycil7CiAgICBsbCBnbG9iYWxTdW0gPSBhcnJbMF07CiAgICBsbCBjdXJTdW0gPSBhcnJbMF07CiAgICBpbnQgbiA9IGFyci5zaXplKCk7CiAgICBmb3IoaW50IGkgPSAxIDsgaSA8IG4gOyBpKyspewogICAgICAgIGN1clN1bSA9IG1pbihhcnJbaV0gLGN1clN1bSthcnJbaV0pOwogICAgICAgIGdsb2JhbFN1bSA9IG1pbihnbG9iYWxTdW0gLCBjdXJTdW0pOwogICAgfQogICAgcmV0dXJuIGdsb2JhbFN1bTsKfQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpzdHJ1Y3QgU2lldmV7CiAgICBpbnQgTjsKICAgIHZlY3RvcjxpbnQ+IHByaW1lczsKICAgIHZlY3RvcjxpbnQ+IGlzUHJpbWU7CiAgICBTaWV2ZShpbnQgbil7CiAgICAgICAgTiA9IG47CiAgICAgICAgaXNQcmltZS5yZXNpemUoTis1KTsKICAgICAgICBmb3IoaW50IGkgPSAwIDsgaSA8IE4rNSA7IGkrKykKICAgICAgICAgICAgaXNQcmltZVtpXSA9IHRydWU7CiAgICAgICAgc2lldmUoKTsKICAgIH0KICAgIGJvb2wgY2hlY2soaW50IHgpewogICAgICAgIHJldHVybiBpc1ByaW1lW3hdOwogICAgfQogICAgdm9pZCBzaWV2ZSgpewogICAgICAgIGlzUHJpbWVbMF0gPSBpc1ByaW1lWzFdID0gZmFsc2U7CiAgICAgICAgZm9yKGludCBpID0gMiA7IGkqaSA8IE4gOyBpKyspewogICAgICAgICAgICBpZihpc1ByaW1lW2ldKQogICAgICAgICAgICAgICAgZm9yKGludCBqID0gaSppIDsgajwgTiA7IGorPWkpewogICAgICAgICAgICAgICAgICAgIGlzUHJpbWVbal0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaSA9IDIgOyBpIDwgTiA7IGkrKykKICAgICAgICAgICAgaWYoaXNQcmltZVtpXSkKICAgICAgICAgICAgICAgIHByaW1lcy5wdXNoX2JhY2soaSk7CiAgICB9Cn07Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmxsIHN0cmluZ01vZChzdHJpbmcgbnVtICwgbGwgbW9kKXsKICAgIGxsIGFucyA9IDA7CiAgICBpbnQgbiA9IG51bS5zaXplKCk7CiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IG4gOyBpKyspewogICAgICAgIGludCBkID0gbnVtW2ldLScwJzsKICAgICAgICBhbnMgPSAoYW5zKjEwK2QpJW1vZDsKICAgIH0KICAgIHJldHVybiBhbnM7Cn0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KbGwgZnAobGwgYmFzZSAsIGxsIHBvdyAsIGludCBjTW9kID0gTU9EKXsKICAgIGxsIGFucyA9IDE7CiAgICB3aGlsZShwb3cpewogICAgICAgIGlmKHBvdyYxKSBhbnMgPSAoYW5zJWNNb2QgKiBiYXNlJWNNb2QpJWNNb2Q7CiAgICAgICAgYmFzZSA9IChiYXNlKmJhc2UpJWNNb2Q7CiAgICAgICAgcG93ID4+PTE7CiAgICB9CiAgICByZXR1cm4gYW5zOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmJvb2wgaXNQcmltZShsbCBuKXsgLy9ub3Qgb3B0aW1pc2UKICAgIGZvcihpbnQgaSA9IDIgOyBpKmk8PW4gOyBpKyspCiAgICAgICAgaWYobiVpID09IDApIHJldHVybiAgZmFsc2U7CiAgICByZXR1cm4gIHRydWU7Cn0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KbGwgZmluZFhPUihsbCBuKXsKICAgIGxsIG1vZCA9IG4gJSA0OwogICAgaWYgKG1vZCA9PSAwKQogICAgICAgIHJldHVybiBuOwogICAgZWxzZSBpZiAobW9kID09IDEpCiAgICAgICAgcmV0dXJuIDE7CiAgICBlbHNlIGlmIChtb2QgPT0gMikKICAgICAgICByZXR1cm4gbiArIDE7CiAgICBlbHNlIGlmIChtb2QgPT0gMykKICAgICAgICByZXR1cm4gMDsKfQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpsbCBmaW5kWE9SKGxsIGwsIGxsIHIpewogICAgcmV0dXJuIChmaW5kWE9SKGwgLSAxKSBeIGZpbmRYT1IocikpOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnN0cnVjdCBjb21iaW5hdG9yaWNzewogICAgdmVjdG9yPGxsPiBmYWM7CiAgICB2ZWN0b3I8bGw+IGludmVyczsKICAgIGNvbWJpbmF0b3JpY3MoKXsKICAgICAgICBmYWMucHVzaF9iYWNrKDEpOwogICAgICAgIGludmVycy5wdXNoX2JhY2soMSk7CiAgICAgICAgZm9yKGludCBpID0gMSA7IGkgPCAxZTYgOyBpKyspewogICAgICAgICAgICBmYWMucHVzaF9iYWNrKCAoZmFjLmJhY2soKSppKSVNT0QgKTsKICAgICAgICAgICAgaW52ZXJzLnB1c2hfYmFjayhmcChmYWMuYmFjaygpICwgTU9ELTIpJU1PRCk7CiAgICAgICAgfQogICAgfQogICAgbGwgbkNyKGludCBuICwgaW50IHIpewogICAgICAgIHJldHVybiAoZmFjW25dJU1PRCAqIGludmVyc1tyXSVNT0QgKiBpbnZlcnNbbi1yXSVNT0QpJU1PRDsKICAgIH1sbCBuUHIoaW50IG4gLCBpbnQgcil7CiAgICAgICAgcmV0dXJuIChmYWNbbl0lTU9EICogIGludmVyc1tuLXJdJU1PRCklTU9EOwogICAgfQp9OwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp2ZWN0b3I8aW50PiBjaGlsZENudChOKTsKaW50IGNvdW50Q2hpbGQoaW50IHJvb3QgLCBpbnQgY250ICx2ZWN0b3I8dmVjdG9yPGludD4+ICZhZGosIHZlY3Rvcjxib29sPiAmdmlzKXsKICAgIHZpc1tyb290XSA9IHRydWU7CiAgICBmb3IoaW50IG51bSA6IGFkaltyb290XSkKICAgICAgICBpZighdmlzW251bV0pCiAgICAgICAgICAgIGNudCArPSBjb3VudENoaWxkKG51bSwxICwgYWRqICwgdmlzKTsKICAgIGNoaWxkQ250W3Jvb3RdID0gY250LTE7CiAgICByZXR1cm4gY250Owp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIGNvbXB7CnB1YmxpYzoKICAgIGJvb2wgb3BlcmF0b3IoKShwYWlyPGludCAsIGludD4gYSAsIHBhaXI8aW50ICwgaW50PiBiKXsKICAgICAgICBpZihhLmZpcnN0ICE9IGIuZmlyc3QpIHJldHVybiBhLmZpcnN0PGIuZmlyc3Q7CiAgICAgICAgZWxzZSByZXR1cm4gYS5zZWNvbmQ+Yi5zZWNvbmQ7CiAgICB9Cn07Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaW50IGRpamtzdHJhKHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQgLCBpbnQ+Pj4gJmFkaiAsICBsbCB1ICwgbGwgdil7CiAgICBpbnQgb28gPSAxZTc7CiAgICBsbCBkaWNbYWRqLnNpemUoKSs1XTsKICAgIGxsIHBhclthZGouc2l6ZSgpKzVdOwogICAgZm9yKGxsIGkgPSAwIDsgaSA8IGFkai5zaXplKCkrNSA7IGkrKykKICAgICAgICBkaWNbaV0gPSBvbyAsIHBhcltpXSA9IDA7OwogICAgcHJpb3JpdHlfcXVldWU8cGFpcjxsbCAsIGxsPiAsIHZlY3RvcjxwYWlyPGxsICwgbGw+PiAsIGdyZWF0ZXI8Pj4gcHE7CiAgICBwcS5wdXNoKHswICwgdX0pOwogICAgZGljW3VdID0gMDsKICAgIHdoaWxlKCFwcS5lbXB0eSgpKXsKICAgICAgICBsbCBjb3N0ID0gcHEudG9wKCkuZmlyc3Q7CiAgICAgICAgbGwgbm9kZSA9IHBxLnRvcCgpLnNlY29uZDsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpZihjb3N0ID4gZGljW25vZGVdKSBjb250aW51ZTsKICAgICAgICBmb3IoYXV0byBjaGlsZCA6IGFkaltub2RlXSl7CiAgICAgICAgICAgIGludCBueHRDb3N0ID0gY2hpbGQuc2Vjb25kOwogICAgICAgICAgICBpZihueHRDb3N0ICsgY29zdCA8IGRpY1tjaGlsZC5maXJzdF0pewogICAgICAgICAgICAgICAgZGljW2NoaWxkLmZpcnN0XSA9IG54dENvc3QgKyBjb3N0OwogICAgICAgICAgICAgICAgcGFyW2NoaWxkLmZpcnN0XSA9IG5vZGU7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtueHRDb3N0ICsgY29zdCAsIGNoaWxkLmZpcnN0fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZGljW3ZdOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KYm9vbCBiZWxsbWFuX2ZvcmQobGwgc3JjICxsbCBuICwgIHZlY3RvcjxwYWlyPHBhaXI8bGwgLCBsbD4gLCBsbD4+ICZsaXN0KXsKICAgIGxsIGRpc3RbbisxXTsKICAgIGxsIG9vID0gMWU5OwogICAgZm9yKGxsIGkgPSAxIDsgaSA8PSBuIDsgaSsrICkKICAgICAgICBkaXN0W2ldID0gb287CiAgICBkaXN0W3NyY10gPSAwOwogICAgZm9yKGxsIGkgPSAxIDsgaSA8PSBuIDtpKyspewogICAgICAgIGZvcihsbCBqID0gMCA7IGogPCBsaXN0LnNpemUoKSA7IGorKyl7CiAgICAgICAgICAgIGlmKGRpc3RbbGlzdFtqXS5maXJzdC5maXJzdF0gKyBsaXN0W2pdLnNlY29uZCA8IGRpc3RbbGlzdFtqXS5maXJzdC5zZWNvbmRdKXsKICAgICAgICAgICAgICAgIGRpc3RbbGlzdFtqXS5maXJzdC5zZWNvbmRdID0gZGlzdFtsaXN0W2pdLmZpcnN0LmZpcnN0XSArIGxpc3Rbal0uc2Vjb25kOwogICAgICAgICAgICAgICAgaWYoaSA9PSBuKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gZmxveWRMaXN0Owp2b2lkIGZsb3lkX3dhcnNoYWxsKGludCBuICwgdmVjdG9yPHBhaXI8cGFpcjxpbnQgLCBpbnQ+ICwgaW50Pj4gJmxpc3QpewogICAgaW50IG9vID0gMWU4OwogICAgZmxveWRMaXN0LmFzc2lnbihuKzEgLCB2ZWN0b3I8aW50PihuKzEgLCBvbykpOwogICAgZm9yKGludCBpID0gMSA7IGkgPD0gbiA7aSsrKQogICAgICAgIGZsb3lkTGlzdFtpXVtpXSA9IDA7CiAgICBmb3IocGFpcjxwYWlyPGludCAsIGludD4gLCBpbnQ+IHAgOiBsaXN0KXsKICAgICAgICBmbG95ZExpc3RbcC5maXJzdC5maXJzdF1bcC5maXJzdC5zZWNvbmRdID0gcC5zZWNvbmQ7CiAgICAgICAgZmxveWRMaXN0W3AuZmlyc3Quc2Vjb25kXVtwLmZpcnN0LmZpcnN0XSA9IHAuc2Vjb25kOwogICAgfQogICAgZm9yKGludCBrID0gMSA7IGsgPD0gbiA7IGsrKykKICAgICAgICBmb3IoaW50IGkgPSAxIDsgaSA8PSBuIDsgaSsrKQogICAgICAgICAgICBmb3IoaW50IGogPSAxIDsgaiA8PSBuIDsgaisrKQogICAgICAgICAgICAgICAgZmxveWRMaXN0W2ldW2pdID0gbWluKGZsb3lkTGlzdFtpXVtqXSAsIGZsb3lkTGlzdFtpXVtrXSArIGZsb3lkTGlzdFtrXVtqXSk7Cn0KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp2b2lkIEZpbGUoKXsKLy8gICAgZnJlb3BlbigiZG9yb29iLmluIiwgInIiLCBzdGRpbik7Ci8vICAgICAgICBmcmVvcGVuKCJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQpOwp9Ci8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kdm9pZCB0ZXN0Q2FzZShsbCBjdCl7CiAgICBsbCBuICwgbTsKICAgIGNpbiA+PiBuID4+IG07CiAgICBsbCByeCAsIHJ5ICwgbXggLCBteTsKICAgIGNpbiA+PiByeCA+PiByeSA+PiBteCA+PiBteTsKICAgIGlmKHJ4ID4gbXgpewogICAgICAgIGNvdXQ8PCItMVxuIjsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZihyeSA+IG15KXsKICAgICAgICBteSA9IHJ5ICsgKHJ5LW15KTsKICAgIH0KICAgIGxsIGFucyA9IDFlMTc7CiAgICBsbCBzdCA9IDAgLCBlbiA9IDJlMTA7CiAgICB3aGlsZShzdDw9ZW4pewogICAgICAgIGxsIG1kID0gc3QrZW4+PjE7CiAgICAgICAgbGwgdGVtcHggPXJ4K21kLCB0ZW1weT1yeSttZDsKICAgICAgICBpZih0ZW1weCA+IG14KXsKICAgICAgICAgICAgZW4gPSBtZC0xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYodGVtcHkgPiBtKXsKICAgICAgICAgICAgZW4gPSBtZC0xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYodGVtcHkgPCBteSl7CiAgICAgICAgICAgIHN0ID0gbWQrMTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxsIGRpcyA9IG14LXRlbXB4OwogICAgICAgIGlmKHRlbXB5LWRpcyA9PSBteSl7CiAgICAgICAgICAgIGFucyA9IG1pbihhbnMsbWQrZGlzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYodGVtcHktZGlzID4gbXkpewogICAgICAgICAgICBlbiA9IG1kLTE7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHN0ID0gbWQrMTsKICAgICAgICB9CiAgICB9CiAgICBzdCA9IDAgLCBlbiA9IDJlMTA7CiAgICB3aGlsZShzdDw9ZW4pewogICAgICAgIGxsIG1kID0gc3QrZW4+PjE7CiAgICAgICAgbGwgdGVtcHggPXJ4K21kLCB0ZW1weT1yeS1tZDsKICAgICAgICBpZih0ZW1weCA+IG14KXsKICAgICAgICAgICAgZW4gPSBtZC0xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYodGVtcHkgPD0wKXsKICAgICAgICAgICAgZW4gPSBtZC0xOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYodGVtcHkgPiBteSl7CiAgICAgICAgICAgIHN0ID0gbWQrMTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxsIGRpcyA9IG14LXRlbXB4OwogICAgICAgIGlmKHRlbXB5K2RpcyA9PSBteSl7CiAgICAgICAgICAgIGFucyA9IG1pbihhbnMsbWQrZGlzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYodGVtcHkrZGlzID4gbXkpewogICAgICAgICAgICBzdCA9IG1kKzE7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGVuID0gbWQtMTsKICAgICAgICB9CiAgICB9CgogICAgaWYoYW5zID09IDFlMTcpIGFucyA9IC0xOwogICAgY291dDw8YW5zPDwiXG4iOwp9CmludCBtYWluKCl7CiAgICBGaWxlKCk7CiAgICBGYXN0Q29kZSgpOwogICAgaW50IHQgPSAxOwogICAgY2luID4+IHQ7CiAgICBmb3IoaW50IGkgPSAxIDsgaSA8PSB0IDsgaSsrKQogICAgICAgIHRlc3RDYXNlKGkpOwogICAgcmV0dXJuIDA7Cn0=