Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- VERSION = 'v1.5.1'
- local base64 = [[local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
- ]]
- base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
- function saveExtra(resource, filename)
- filename = filename or resource
- local file = assert(io.open(filename, 'w'))
- file:write(EXTRAS[resource])
- file:close()
- end
- function saveProgram(filename)
- filename = filename or "asn.lua"
- local file = assert(io.open(filename, 'w'))
- file:write(PROGRAM)
- file:close()
- end
- function typeY()
- write("Do you want to continue? (Type Y for continue): ")
- local read = read(nil, nil, nil, "N")
- if read ~= 'Y' then
- print("Exiting...")
- error("Terminated", 0)
- end
- end
- EXTRAS = {
- ["addresses.conf"] = base64.decode "ewogIGlkZW50aXR5ID0gewogICAgewogICAgICBuYW1lID0gIkRlc3RpbnkiLAogICAgICBhZGRyZXNzID0gIi01LTE2LTIwLTMwLTM0LTIzLTQtMTAtIiwKICAgIH0sCiAgfSwKICBwb3NpdGlvbiA9IHsKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTptaWxreV93YXkiIF0gPSAiLTI3LTI1LTQtMzUtMTAtMjgtIiwKICAgICAgfSwKICAgICAgZXh0cmFnYWxhY3RpYyA9ICItMS0zNS00LTMxLTE1LTMwLTMyLSIsCiAgICAgIG5hbWUgPSAiT3ZlcndvcmxkIiwKICAgICAga2V5ID0gInNnam91cm5leTp0ZXJyYSIsCiAgICB9LAogICAgewogICAgICBpbnRlcnN0ZWxsYXIgPSB7CiAgICAgICAgWyAic2dqb3VybmV5Om1pbGt5X3dheSIgXSA9ICItMjYtNi0xNC0zMS0xMS0yOS0iLAogICAgICB9LAogICAgICBuYW1lID0gIkFieWRvcyIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6YWJ5ZG9zIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0yNy0yMy00LTM0LTEyLTI4LSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiTmV0aGVyIiwKICAgICAga2V5ID0gInNnam91cm5leTpuZXRoZXIiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTpwZWdhc3VzIiBdID0gIi0xNC0zMC02LTEzLTE3LTIzLSIsCiAgICAgICAgWyAic2dqb3VybmV5Om1pbGt5X3dheSIgXSA9ICItMTMtMjQtMi0xOS0zLTMwLSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiRW5kIiwKICAgICAga2V5ID0gInNnam91cm5leTplbmQiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTptaWxreV93YXkiIF0gPSAiLTgtMS0yMi0xNC0zNi0xOS0iLAogICAgICB9LAogICAgICBuYW1lID0gIkNodWxhayIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6Y2h1bGFrIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0xOC03LTMtMzYtMjUtMTUtIiwKICAgICAgfSwKICAgICAgbmFtZSA9ICJDYXZ1bSBUZW5lYnJhZSIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6Y2F2dW1fdGVuZWJyYWUiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTptaWxreV93YXkiIF0gPSAiLTItMjctOC0zNC0yNC0xNS0iLAogICAgICB9LAogICAgICBuYW1lID0gIlVuaXRhcyIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6dW5pdGFzIiwKICAgIH0sCiAgICB7CiAgICAgIGludGVyc3RlbGxhciA9IHsKICAgICAgICBbICJzZ2pvdXJuZXk6bWlsa3lfd2F5IiBdID0gIi0zMy0yMC0xMC0yMi0zLTE3LSIsCiAgICAgIH0sCiAgICAgIG5hbWUgPSAiUmltYSIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6cmltYSIsCiAgICB9LAogICAgewogICAgICBpbnRlcnN0ZWxsYXIgPSB7CiAgICAgICAgWyAic2dqb3VybmV5OnBlZ2FzdXMiIF0gPSAiLTI5LTUtMTctMzQtNi0xMi0iLAogICAgICB9LAogICAgICBleHRyYWdhbGFjdGljID0gIi0xOC0yMC0xLTE1LTE0LTctMTktIiwKICAgICAgbmFtZSA9ICJMYW50ZWEiLAogICAgICBrZXkgPSAic2dqb3VybmV5OmxhbnRlYSIsCiAgICB9LAogICAgewogICAgICBpbnRlcnN0ZWxsYXIgPSB7CiAgICAgICAgWyAic2dqb3VybmV5OnBlZ2FzdXMiIF0gPSAiLTIxLTE0LTI0LTEtMjYtMjgtIiwKICAgICAgfSwKICAgICAgbmFtZSA9ICJBdGhvcyIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6YXRob3MiLAogICAgfSwKICAgIHsKICAgICAgaW50ZXJzdGVsbGFyID0gewogICAgICAgIFsgInNnam91cm5leTptaWxreV93YXkiIF0gPSAiLTI2LTIwLTQtMzYtOS0yNy0iLAogICAgICB9LAogICAgICBuYW1lID0gIkdsYWNpbyIsCiAgICAgIGtleSA9ICJzZ2pvdXJuZXk6cHJveGltYV9jZW50YXVyaSIsCiAgICB9LAogIH0sCn0K";
- }
- PROGRAM = ([[VERSION = 'v1.5.1'
- local base64 = <$<local a={}local b=_G.bit32 and _G.bit32.extract;if not b then if _G.bit then local c,d,e=_G.bit.lshift,_G.bit.rshift,_G.bit.band;b=function(f,g,h)return e(d(f,g),c(1,h)-1)end elseif _G._VERSION=="Lua 5.1"then b=function(f,g,h)local i=0;local j=2^g;for k=0,h-1 do local l=j+j;if f%l>=j then i=i+2^k end;j=l end;return i end else b=load'return function( v, from, width )return ( v >> from ) & ((1 << width) - 1)end'()end end;function a.makeencoder(m,n,o)local p={}for q,r in pairs{[0]='A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9',m or'+',n or'/',o or'='}do p[q]=r:byte()end;return p end;function a.makedecoder(m,n,o)local s={}for q,t in pairs(a.makeencoder(m,n,o))do s[t]=q end;return s end;local u=a.makeencoder()local v=a.makedecoder()local r,w=string.char,table.concat;function a.encode(x,p,y)p=p or u;local z,A,B={},1,#x;local C=B%3;local D={}for k=1,B-C,3 do local E,F,G=x:byte(k,k+2)local f=E*0x10000+F*0x100+G;local H;if y then H=D[f]if not H then H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])D[f]=H end else H=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[b(f,0,6)])end;z[A]=H;A=A+1 end;if C==2 then local E,F=x:byte(B-1,B)local f=E*0x10000+F*0x100;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[b(f,6,6)],p[64])elseif C==1 then local f=x:byte(B)*0x10000;z[A]=r(p[b(f,18,6)],p[b(f,12,6)],p[64],p[64])end;return w(z)end;function a.decode(I,s,y)s=s or v;local J='[^%w%+%/%=]'if s then local m,n;for t,q in pairs(s)do if q==62 then m=t elseif q==63 then n=t end end;J=('[^%%w%%%s%%%s%%=]'):format(r(m),r(n))end;I=I:gsub(J,'')local D=y and{}local z,A={},1;local B=#I;local K=I:sub(-2)=='=='and 2 or I:sub(-1)=='='and 1 or 0;for k=1,K>0 and B-4 or B,4 do local E,F,G,L=I:byte(k,k+3)local H;if y then local M=E*0x1000000+F*0x10000+G*0x100+L;H=D[M]if not H then local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))D[M]=H end else local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40+s[L]H=r(b(f,16,8),b(f,8,8),b(f,0,8))end;z[A]=H;A=A+1 end;if K==1 then local E,F,G=I:byte(B-3,B-1)local f=s[E]*0x40000+s[F]*0x1000+s[G]*0x40;z[A]=r(b(f,16,8),b(f,8,8))elseif K==2 then local E,F=I:byte(B-3,B-2)local f=s[E]*0x40000+s[F]*0x1000;z[A]=r(b(f,16,8))end;return w(z)end;return a
- >$>
- base64 = load(base64, "@[included]/base64.lua", 't', _ENV)()
- local modules = {
- ["basalt"] = base64.decode "bG9jYWwgYWE9e31sb2NhbCBiYT10cnVlO2xvY2FsIGNhPXJlcXVpcmUKbG9jYWwgZGE9ZnVuY3Rpb24oYWIpCmZvciBiYixjYiBpbiBwYWlycyhhYSlkbwppZih0eXBlKGNiKT09InRhYmxlIil0aGVuIGZvciBkYixfYyBpbiBwYWlycyhjYilkbyBpZihkYj09YWIpdGhlbgpyZXR1cm4gX2MoKWVuZCBlbmQgZWxzZSBpZihiYj09YWIpdGhlbiByZXR1cm4gY2IoKWVuZCBlbmQgZW5kO3JldHVybiBjYShhYillbmQKbG9jYWwgX2I9ZnVuY3Rpb24oYWIpaWYoYWJ+PW5pbCl0aGVuIHJldHVybiBhYVthYl1lbmQ7cmV0dXJuIGFhIGVuZAphYVsibW9kdWxlIl09ZnVuY3Rpb24oLi4uKXJldHVybgpmdW5jdGlvbihhYilsb2NhbCBiYixjYj1wY2FsbChkYSxhYilyZXR1cm4gYmIgYW5kIGNiIG9yIG5pbCBlbmQgZW5kCmFhWyJGcmFtZSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgibW9kdWxlIilsb2NhbCBiYj1kYSgiT2JqZWN0IikKbG9jYWwgY2I9ZGEoImxvYWRPYmplY3RzIilsb2NhbCBkYj1kYSgiYmFzYWx0RHJhdyIpbG9jYWwgX2M9ZGEoInV0aWxzIilsb2NhbCBhYz1hYigibGF5b3V0IikKbG9jYWwgYmM9YWIoImJhc2FsdE1vbiIpbG9jYWwgY2M9X2MudXVpZDtsb2NhbCBkYz1fYy5ycGFpcnM7bG9jYWwgX2Q9X2MuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGFkPV9jLnRhYmxlQ291bnQKbG9jYWwgYmQsY2QsZGQ9c3RyaW5nLnN1YixtYXRoLm1pbixtYXRoLm1heApyZXR1cm4KZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hKWxvY2FsIGRfYT1iYihfX2EpbG9jYWwgX2FhPSJGcmFtZSJsb2NhbCBhYWE9e31sb2NhbCBiYWE9e31sb2NhbCBjYWE9e31sb2NhbCBkYWE9e31sb2NhbCBfYmE9e31sb2NhbCBhYmE9e30KbG9jYWwgYmJhPXt9bG9jYWwgY2JhPXt9bG9jYWwgZGJhPTA7bG9jYWwgX2NhPWJfYSBvciB0ZXJtLmN1cnJlbnQoKWxvY2FsIGFjYT0iImxvY2FsIGJjYT1mYWxzZQpsb2NhbCBjY2E9ZmFsc2U7bG9jYWwgZGNhPWZhbHNlO2xvY2FsIF9kYT0wO2xvY2FsIGFkYT0wO2xvY2FsIGJkYT1mYWxzZTtsb2NhbCBjZGE9MDtsb2NhbCBkZGE9ZmFsc2U7bG9jYWwgX19iPWZhbHNlO2xvY2FsIGFfYj0iImxvY2FsIGJfYj1mYWxzZQpsb2NhbCBjX2I9ZmFsc2U7bG9jYWwgZF9iO2xvY2FsIF9hYjtsb2NhbCBhYWI9dHJ1ZTtsb2NhbCBiYWI9dHJ1ZTtsb2NhbCBjYWI9ZmFsc2U7bG9jYWwgZGFiPXt9bG9jYWwgX2JiPXt9CmRfYTpzZXRaSW5kZXgoMTApbG9jYWwgYWJiPWRiKF9jYSlsb2NhbCBiYmI9ZmFsc2U7bG9jYWwgY2JiPTE7bG9jYWwgZGJiPTE7bG9jYWwgX2NiPWNvbG9ycy53aGl0ZTtsb2NhbCBhY2IsYmNiPTAsMDtsb2NhbCBjY2I9e30KbG9jYWwgZnVuY3Rpb24gZGNiKGRiYyxfY2MpaWYoX2Njfj0KbmlsKXRoZW4gX2NjOnNldFZhbHVlc0J5WE1MRGF0YShkYmMpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfZGIoZGJjLF9jYyxhY2MpCmlmKGRiY349bmlsKXRoZW4gaWYoZGJjLnByb3BlcnRpZXN+PW5pbCl0aGVuIGRiYz17ZGJjfWVuZDtmb3IgYmNjLGNjYyBpbiBwYWlycyhkYmMpZG8gbG9jYWwgZGNjPV9jYyhhY2MsCmNjY1siQGlkIl1vciBjYygpKQp0YWJsZS5pbnNlcnQoY2NiLGRjYylkY2IoY2NjLGRjYyllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBhZGIoZGJjKWlmKHR5cGUoZGJjKX49InN0cmluZyIpdGhlbiBkYmM9ZGJjLm5hbWUgZW5kO2ZvciBfY2MsYWNjIGluIHBhaXJzKGFhYSlkbwpmb3IgYmNjLGNjYyBpbgpwYWlycyhhY2MpZG8gaWYoY2NjOmdldE5hbWUoKT09ZGJjKXRoZW4gcmV0dXJuIGNjYyBlbmQgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYmRiKGRiYylsb2NhbCBfY2M9YWRiKGRiYylpZihfY2N+PW5pbCl0aGVuIHJldHVybiBfY2MgZW5kCmZvciBhY2MsYmNjIGluIHBhaXJzKGFhYSlkbwpmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8gaWYoCmRjYzpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbiBsb2NhbCBfZGM9ZGNjOmdldERlZXBPYmplY3QoZGJjKQppZihfZGN+PW5pbCl0aGVuIHJldHVybiBfZGMgZW5kIGVuZCBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBjZGIoZGJjKWxvY2FsIF9jYz1kYmM6Z2V0WkluZGV4KCkKaWYoYWRiKGRiYy5uYW1lKX49bmlsKXRoZW4gcmV0dXJuIG5pbCBlbmQKaWYoYWFhW19jY109PW5pbCl0aGVuCmZvciB4PTEsI2JhYSsxIGRvIGlmKGJhYVt4XX49bmlsKXRoZW4gaWYoX2NjPT1iYWFbeF0pdGhlbiBicmVhayBlbmQ7aWYKKF9jYz5iYWFbeF0pdGhlbiB0YWJsZS5pbnNlcnQoYmFhLHgsX2NjKWJyZWFrIGVuZCBlbHNlCnRhYmxlLmluc2VydChiYWEsX2NjKWVuZCBlbmQ7aWYoI2JhYTw9MCl0aGVuIHRhYmxlLmluc2VydChiYWEsX2NjKWVuZDthYWFbX2NjXT17fWVuZDtkYmMucGFyZW50PWNhYTtpZihkYmMuaW5pdH49bmlsKXRoZW4gZGJjOmluaXQoKWVuZAp0YWJsZS5pbnNlcnQoYWFhW19jY10sZGJjKXJldHVybiBkYmMgZW5kCmxvY2FsIGZ1bmN0aW9uIGRkYihkYmMsX2NjKQpmb3IgYWNjLGJjYyBpbiBwYWlycyhkYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmZvciBfZGMsYWRjIGluIHBhaXJzKGRjYylkbwppZihhZGM9PV9jYyl0aGVuCnRhYmxlLnJlbW92ZShkYWFbYWNjXVtjY2NdLF9kYylpZihkYmMucGFyZW50fj1uaWwpdGhlbiBpZihhZChkYWFbYWNjXSk8PTApdGhlbgpkYmMucGFyZW50OnJlbW92ZUV2ZW50KGFjYyxkYmMpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIF9fYyhkYmMsX2NjKQpmb3IgYWNjLGJjYyBpbiBwYWlycyhhYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmlmKHR5cGUoX2NjKT09InN0cmluZyIpdGhlbgppZihkY2M6Z2V0TmFtZSgpPT1fY2MpdGhlbgp0YWJsZS5yZW1vdmUoYWFhW2FjY10sY2NjKWRkYihjYWEsZGNjKWRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZWxzZSBpZihkY2M9PV9jYyl0aGVuIHRhYmxlLnJlbW92ZShhYWFbYWNjXSxjY2MpZGRiKGNhYSxkY2MpCmRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBmdW5jdGlvbiBhX2MoZGJjLF9jYyxhY2MpCmZvciBiY2MsY2NjIGluIHBhaXJzKGRhYVtfY2NdKWRvIGZvciBkY2MsX2RjIGluIHBhaXJzKGNjYylkbwppZihfZGM6Z2V0TmFtZSgpPT1hY2MpdGhlbiByZXR1cm4gX2RjIGVuZCBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBiX2MoZGJjLF9jYyxhY2MpCmxvY2FsIGJjYz1hY2M6Z2V0WkluZGV4KClpZihkYWFbX2NjXT09bmlsKXRoZW4gZGFhW19jY109e31lbmQ7aWYoX2JhW19jY109PW5pbCl0aGVuCl9iYVtfY2NdPXt9ZW5kCmlmKGFfYyhkYmMsX2NjLGFjYy5uYW1lKX49bmlsKXRoZW4gcmV0dXJuIG5pbCBlbmQKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDphZGRFdmVudChfY2MsZGJjKWVuZDtkYWJbX2NjXT10cnVlCmlmKGRhYVtfY2NdW2JjY109PW5pbCl0aGVuCmZvciB4PTEsI19iYVtfY2NdKzEgZG8KaWYKKF9iYVtfY2NdW3hdfj1uaWwpdGhlbiBpZihiY2M9PV9iYVtfY2NdW3hdKXRoZW4gYnJlYWsgZW5kO2lmKGJjYz5fYmFbX2NjXVt4XSl0aGVuCnRhYmxlLmluc2VydChfYmFbX2NjXSx4LGJjYylicmVhayBlbmQgZWxzZQp0YWJsZS5pbnNlcnQoX2JhW19jY10sYmNjKWVuZCBlbmQKaWYoI19iYVtfY2NdPD0wKXRoZW4gdGFibGUuaW5zZXJ0KF9iYVtfY2NdLGJjYyllbmQ7ZGFhW19jY11bYmNjXT17fWVuZDt0YWJsZS5pbnNlcnQoZGFhW19jY11bYmNjXSxhY2MpcmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gY19jKGRiYyxfY2MsYWNjKQppZihkYWFbX2NjXX49bmlsKXRoZW4KZm9yIGJjYyxjY2MgaW4gcGFpcnMoZGFhW19jY10pZG8KZm9yIGRjYyxfZGMgaW4gcGFpcnMoY2NjKWRvCmlmKF9kYz09YWNjKXRoZW4KdGFibGUucmVtb3ZlKGRhYVtfY2NdW2JjY10sZGNjKWlmKCNkYWFbX2NjXVtiY2NdPD0wKXRoZW4gZGFhW19jY11bYmNjXT1uaWwKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gaWYoCmFkKGRhYVtfY2NdKTw9MCl0aGVuIGRhYltfY2NdPWZhbHNlCmRiYy5wYXJlbnQ6cmVtb3ZlRXZlbnQoX2NjLGRiYyllbmQgZW5kIGVuZDtyZXR1cm4KdHJ1ZSBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBkX2M9bWF0aApsb2NhbCBmdW5jdGlvbiBfYWMoZGJjKQpsb2NhbCBfY2MsYWNjPXBjYWxsKGxvYWQoInJldHVybiAiLi5kYmMsIiIsbmlsLHttYXRoPWRfY30pKWlmIG5vdChfY2MpdGhlbgplcnJvcihkYmMuLiIgaXMgbm90IGEgdmFsaWQgZHluYW1pYyBjb2RlIillbmQ7cmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gYWFjKGRiYyxfY2MsYWNjKWZvciBiY2MsY2NjIGluIHBhaXJzKGNiYSlkbwppZihjY2NbMl09PWFjYylhbmQoY2NjWzRdPT1fY2MpdGhlbiByZXR1cm4gY2NjIGVuZCBlbmQ7ZGJhPWRiYSsxCmNiYVtkYmFdPXswLGFjYyx7fSxfY2MsZGJhfXJldHVybiBjYmFbZGJhXWVuZApsb2NhbCBmdW5jdGlvbiBiYWMoZGJjLF9jYylsb2NhbCBhY2M9e31sb2NhbCBiY2M9e31mb3IgY2NjIGluIF9jYzpnbWF0Y2goIiVhKyUueCIpZG8gbG9jYWwgZGNjPWNjYzpnc3ViKCIlLngiLCIiKQppZgooZGNjfj0ic2VsZiIpYW5kKGRjY349InBhcmVudCIpdGhlbiB0YWJsZS5pbnNlcnQoYWNjLGRjYyllbmQgZW5kCmZvciBjY2MgaW4KX2NjOmdtYXRjaCgiJXcrJS55IilkbyBsb2NhbCBkY2M9Y2NjOmdzdWIoIiUueSIsIiIpaWYoZGNjfj0ic2VsZiIpYW5kKGRjY349InBhcmVudCIpdGhlbgp0YWJsZS5pbnNlcnQoYWNjLGRjYyllbmQgZW5kO2ZvciBjY2MgaW4gX2NjOmdtYXRjaCgiJWErJS53IilkbyBsb2NhbCBkY2M9Y2NjOmdzdWIoIiUudyIsIiIpCmlmKGRjY349InNlbGYiKWFuZAooZGNjfj0icGFyZW50Iil0aGVuIHRhYmxlLmluc2VydChhY2MsZGNjKWVuZCBlbmQKZm9yIGNjYyBpbgpfY2M6Z21hdGNoKCIlYSslLmgiKWRvIGxvY2FsIGRjYz1jY2M6Z3N1YigiJS5oIiwiIilpZihkY2N+PSJzZWxmIilhbmQoZGNjfj0icGFyZW50Iil0aGVuCnRhYmxlLmluc2VydChhY2MsZGNjKWVuZCBlbmQKZm9yIGNjYyxkY2MgaW4gcGFpcnMoYWNjKWRvIGJjY1tkY2NdPWFkYihkY2MpaWYoYmNjW2RjY109PW5pbCl0aGVuCmVycm9yKCJEeW5hbWljIFZhbHVlcyAtIHVuYWJsZSB0byBmaW5kIG9iamVjdCAiLi5kY2MpZW5kIGVuZDtiY2NbInNlbGYiXT1kYmM7YmNjWyJwYXJlbnQiXT1kYmM6Z2V0UGFyZW50KClyZXR1cm4gYmNjIGVuZApsb2NhbCBmdW5jdGlvbiBjYWMoZGJjLF9jYylsb2NhbCBhY2M9ZGJjO2ZvciBiY2MgaW4gZGJjOmdtYXRjaCgiJXcrJS54IilkbwphY2M9YWNjOmdzdWIoYmNjLF9jY1tiY2M6Z3N1YigiJS54IiwiIildOmdldFgoKSllbmQ7Zm9yIGJjYyBpbiBkYmM6Z21hdGNoKCIldyslLnkiKWRvCmFjYz1hY2M6Z3N1YihiY2MsX2NjW2JjYzpnc3ViKCIlLnkiLCIiKV06Z2V0WSgpKWVuZDtmb3IgYmNjIGluIGRiYzpnbWF0Y2goIiV3KyUudyIpZG8KYWNjPWFjYzpnc3ViKGJjYyxfY2NbYmNjOmdzdWIoIiUudyIsIiIpXTpnZXRXaWR0aCgpKWVuZDtmb3IgYmNjIGluIGRiYzpnbWF0Y2goIiV3KyUuaCIpZG8KYWNjPWFjYzpnc3ViKGJjYyxfY2NbYmNjOmdzdWIoIiUuaCIsIiIpXTpnZXRIZWlnaHQoKSllbmQ7cmV0dXJuIGFjYyBlbmQKbG9jYWwgZnVuY3Rpb24gZGFjKGRiYykKaWYoI2NiYT4wKXRoZW4KZm9yIG49MSxkYmEgZG8KaWYoY2JhW25dfj1uaWwpdGhlbiBsb2NhbCBfY2M7aWYoI2NiYVtuXVszXTw9MCl0aGVuCmNiYVtuXVszXT1iYWMoY2JhW25dWzRdLGNiYVtuXVsyXSllbmQKX2NjPWNhYyhjYmFbbl1bMl0sY2JhW25dWzNdKWNiYVtuXVsxXT1fYWMoX2NjKWlmKGNiYVtuXVs0XTpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbgpjYmFbbl1bNF06cmVjYWxjdWxhdGVEeW5hbWljVmFsdWVzKCllbmQgZW5kIGVuZApmb3IgX2NjLGFjYyBpbiBwYWlycyhiYWEpZG8KaWYoYWFhW2FjY11+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluIHBhaXJzKGFhYVthY2NdKWRvCmlmCihjX2EuZ2V0RHluYW1pY1ZhbHVlRXZlbnRTZXR0aW5nKCkpdGhlbiBpZihjY2MuZXZlbnRIYW5kbGVyfj1uaWwpdGhlbgpjY2M6ZXZlbnRIYW5kbGVyKCJiYXNhbHRfZHluYW1pY3ZhbHVlIixkYmMpZW5kIGVuZDtpZihjY2MuY3VzdG9tRXZlbnRIYW5kbGVyfj1uaWwpdGhlbgpjY2M6Y3VzdG9tRXZlbnRIYW5kbGVyKCJiYXNhbHRfcmVzaXplIixkYmMpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gX2JjKGRiYylyZXR1cm4gY2JhW2RiY11bMV1lbmQKbG9jYWwgZnVuY3Rpb24gYWJjKGRiYylsb2NhbCBfY2M9MApmb3IgYWNjLGJjYyBpbiBwYWlycyhhYWEpZG8KZm9yIGNjYyxkY2MgaW4gcGFpcnMoYmNjKWRvCmlmKApkY2MuZ2V0SGVpZ2h0fj1uaWwpYW5kKGRjYy5nZXRZfj1uaWwpdGhlbgppZgooZGNjOmdldFR5cGUoKT09IkRyb3Bkb3duIil0aGVuIGxvY2FsIF9kYyxhZGM9ZGNjOmdldEhlaWdodCgpLGRjYzpnZXRZKCkKbG9jYWwgYmRjLGNkYz1kY2M6Z2V0RHJvcGRvd25TaXplKClfZGM9X2RjK2NkYy0xCmlmKF9kYythZGMtZGJjOmdldEhlaWdodCgpPj1fY2MpdGhlbiBfY2M9ZGQoCl9kYythZGMtZGJjOmdldEhlaWdodCgpLDApZW5kIGVsc2UgbG9jYWwgX2RjLGFkYz1kY2M6Z2V0SGVpZ2h0KCksZGNjOmdldFkoKWlmKApfZGMrYWRjLWRiYzpnZXRIZWlnaHQoKT49X2NjKXRoZW4KX2NjPWRkKF9kYythZGMtZGJjOmdldEhlaWdodCgpLDApZW5kIGVuZCBlbmQgZW5kIGVuZDtyZXR1cm4gX2NjIGVuZApsb2NhbCBmdW5jdGlvbiBiYmMoZGJjKWxvY2FsIF9jYz0wCmZvciBhY2MsYmNjIGluIHBhaXJzKGFhYSlkbwpmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8KaWYKKGRjYy5nZXRXaWR0aH49bmlsKWFuZChkY2MuZ2V0WH49bmlsKXRoZW4gbG9jYWwgX2RjLGFkYz1kY2M6Z2V0V2lkdGgoKSxkY2M6Z2V0WCgpaWYoCl9kYythZGMtZGJjOmdldFdpZHRoKCk+PV9jYyl0aGVuCl9jYz1kZChfZGMrYWRjLWRiYzpnZXRXaWR0aCgpLDApZW5kIGVuZCBlbmQgZW5kO3JldHVybiBfY2MgZW5kO2xvY2FsIGZ1bmN0aW9uIGNiYyhkYmMpaWYoYmFiKXRoZW4gY2RhPWFiYyhkYmMpZW5kIGVuZApjYWE9e2JhckFjdGl2ZT1mYWxzZSxiYXJCYWNrZ3JvdW5kPWNvbG9ycy5ncmF5LGJhclRleHRjb2xvcj1jb2xvcnMuYmxhY2ssYmFyVGV4dD0iTmV3IEZyYW1lIixiYXJUZXh0QWxpZ249ImxlZnQiLGFkZEV2ZW50PWJfYyxyZW1vdmVFdmVudD1jX2MscmVtb3ZlRXZlbnRzPWRkYixnZXRFdmVudD1hX2MsbmV3RHluYW1pY1ZhbHVlPWFhYyxyZWNhbGN1bGF0ZUR5bmFtaWNWYWx1ZXM9ZGFjLGdldER5bmFtaWNWYWx1ZT1fYmMsZ2V0VHlwZT1mdW5jdGlvbihkYmMpcmV0dXJuCl9hYSBlbmQsc2V0WkluZGV4PWZ1bmN0aW9uKGRiYyxfY2MpZF9hLnNldFpJbmRleChkYmMsX2NjKWZvciBhY2MsYmNjIGluIHBhaXJzKGRhYilkbyBpZihiY2MpdGhlbgpkYmMucGFyZW50OmFkZEV2ZW50KGFjYyxkYmMpZW5kIGVuZDtyZXR1cm4gZGJjIGVuZCxzZXRGb2N1c2VkT2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpCmlmKApfYWJ+PV9jYyl0aGVuIGlmKF9hYn49bmlsKXRoZW4KaWYoYWRiKF9hYil+PW5pbCl0aGVuIF9hYjpsb3NlRm9jdXNIYW5kbGVyKCllbmQgZW5kO2lmKF9jY349bmlsKXRoZW4gaWYoYWRiKF9jYyl+PW5pbCl0aGVuCl9jYzpnZXRGb2N1c0hhbmRsZXIoKWVuZCBlbmQ7X2FiPV9jYyBlbmQ7cmV0dXJuIGRiYyBlbmQsZ2V0VmFyaWFibGU9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4KY19hLmdldFZhcmlhYmxlKF9jYyllbmQsc2V0U2l6ZT1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmRfYS5zZXRTaXplKGRiYyxfY2MsYWNjLGJjYylpZihkYmMucGFyZW50PT1uaWwpdGhlbiBhYmI9ZGIoX2NhKWVuZApmb3IgY2NjLGRjYyBpbiBwYWlycyhiYWEpZG8gaWYoYWFhW2RjY11+PW5pbCl0aGVuCmZvciBfZGMsYWRjIGluCnBhaXJzKGFhYVtkY2NdKWRvIGlmKGFkYy5jdXN0b21FdmVudEhhbmRsZXJ+PW5pbCl0aGVuCmFkYzpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXNpemUiLGRiYyllbmQgZW5kIGVuZCBlbmQ7ZGJjOnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpYWFiPWZhbHNlO3JldHVybiBkYmMgZW5kLHNldFRoZW1lPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZigKdHlwZShfY2MpPT0idGFibGUiKXRoZW4gYmJhPV9jYyBlbHNlaWYodHlwZShfY2MpPT0ic3RyaW5nIil0aGVuIGJiYVtfY2NdPWFjYyBlbmQ7ZGJjOnVwZGF0ZURyYXcoKXJldHVybiBkYmMgZW5kLGdldFRoZW1lPWZ1bmN0aW9uKGRiYyxfY2MpCnJldHVybgpiYmFbX2NjXW9yKGRiYy5wYXJlbnR+PW5pbCBhbmQgZGJjLnBhcmVudDpnZXRUaGVtZShfY2Mpb3IKY19hLmdldFRoZW1lKF9jYykpZW5kLGdldFRoZW1lQ29sb3I9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4KX2Njfj1uaWwgYW5kIF9iYltfY2Ndb3IgX2JiIGVuZCxzZXRUaGVtZUNvbG9yPWZ1bmN0aW9uKGRiYyxfY2MsLi4uKQppZgooZGJjLnBhcmVudD09bmlsKXRoZW4KaWYoZGJjPT1jX2EuZ2V0QWN0aXZlRnJhbWUoKSl0aGVuCmlmKHR5cGUoX2NjKT09InN0cmluZyIpdGhlbiBfYmJbX2NjXT0uLi4KX2NhLnNldFBhbGV0dGVDb2xvcigKdHlwZShfY2MpPT0ibnVtYmVyImFuZCBfY2Mgb3IgY29sb3JzW19jY10sLi4uKWVsc2VpZih0eXBlKF9jYyk9PSJ0YWJsZSIpdGhlbgpmb3IgYWNjLGJjYyBpbiBwYWlycyhfY2MpZG8gX2JiW2FjY109YmNjCmlmKHR5cGUoYmNjKT09Im51bWJlciIpdGhlbgpfY2Euc2V0UGFsZXR0ZUNvbG9yKAp0eXBlKGFjYyk9PSJudW1iZXIiYW5kIGFjYyBvciBjb2xvcnNbYWNjXSxiY2MpZWxzZSBsb2NhbCBjY2MsZGNjLF9kYz10YWJsZS51bnBhY2soYmNjKQpfY2Euc2V0UGFsZXR0ZUNvbG9yKAp0eXBlKGFjYyk9PSJudW1iZXIiYW5kIGFjYyBvciBjb2xvcnNbYWNjXSxjY2MsZGNjLF9kYyllbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBkYmMgZW5kLHNldFBvc2l0aW9uPWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKZF9hLnNldFBvc2l0aW9uKGRiYyxfY2MsYWNjLGJjYylkYmM6cmVjYWxjdWxhdGVEeW5hbWljVmFsdWVzKClyZXR1cm4gZGJjIGVuZCxnZXRCYXNhbHRJbnN0YW5jZT1mdW5jdGlvbihkYmMpcmV0dXJuCmNfYSBlbmQsc2V0T2Zmc2V0PWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQphY2I9X2Njfj1uaWwgYW5kCmRfYy5mbG9vcihfY2M8MCBhbmQgZF9jLmFicyhfY2Mpb3ItX2NjKW9yIGFjYgpiY2I9YWNjfj1uaWwgYW5kCmRfYy5mbG9vcihhY2M8MCBhbmQgZF9jLmFicyhhY2Mpb3ItYWNjKW9yIGJjYjtkYmM6dXBkYXRlRHJhdygpcmV0dXJuIGRiYyBlbmQsZ2V0T2Zmc2V0SW50ZXJuYWw9ZnVuY3Rpb24oZGJjKXJldHVybgphY2IsYmNiIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oZGJjKXJldHVybiBhY2I8MCBhbmQgZF9jLmFicyhhY2Ipb3ItYWNiLGJjYjwwIGFuZApkX2MuYWJzKGJjYilvci1iY2IgZW5kLHJlbW92ZUZvY3VzZWRPYmplY3Q9ZnVuY3Rpb24oZGJjKWlmKApfYWJ+PW5pbCl0aGVuCmlmKGFkYihfYWIpfj1uaWwpdGhlbiBfYWI6bG9zZUZvY3VzSGFuZGxlcigpZW5kIGVuZDtfYWI9bmlsO3JldHVybiBkYmMgZW5kLGdldEZvY3VzZWRPYmplY3Q9ZnVuY3Rpb24oZGJjKXJldHVybgpfYWIgZW5kLHNldEN1cnNvcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjKQppZihkYmMucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBkY2MsX2RjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmRiYy5wYXJlbnQ6c2V0Q3Vyc29yKF9jYyBvciBmYWxzZSwoYWNjIG9yIDApK2RjYy0xLChiY2Mgb3IgMCkrX2RjLTEsCmNjYyBvciBfY2IpZWxzZQpsb2NhbCBkY2MsX2RjPWRiYzpnZXRBYnNvbHV0ZVBvc2l0aW9uKGRiYzpnZXRBbmNob3JQb3NpdGlvbihkYmM6Z2V0WCgpLGRiYzpnZXRZKCksdHJ1ZSkpYmJiPV9jYyBvciBmYWxzZTtpZihhY2N+PW5pbCl0aGVuIGNiYj1kY2MrYWNjLTEgZW5kO2lmKGJjY349bmlsKXRoZW4gZGJiPV9kYysKYmNjLTEgZW5kO19jYj1jY2Mgb3IgX2NiO2lmKGJiYil0aGVuCl9jYS5zZXRUZXh0Q29sb3IoX2NiKV9jYS5zZXRDdXJzb3JQb3MoY2JiLGRiYilfY2Euc2V0Q3Vyc29yQmxpbmsoYmJiKWVsc2UKX2NhLnNldEN1cnNvckJsaW5rKGZhbHNlKWVuZCBlbmQ7cmV0dXJuIGRiYyBlbmQsc2V0TW92YWJsZT1mdW5jdGlvbihkYmMsX2NjKQppZigKZGJjLnBhcmVudH49bmlsKXRoZW4gYl9iPV9jYyBvciBub3QgYl9iCmRiYy5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixkYmMpZGFiWyJtb3VzZV9jbGljayJdPXRydWUKZGJjLnBhcmVudDphZGRFdmVudCgibW91c2VfdXAiLGRiYylkYWJbIm1vdXNlX3VwIl09dHJ1ZQpkYmMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixkYmMpZGFiWyJtb3VzZV9kcmFnIl09dHJ1ZSBlbmQ7cmV0dXJuIGRiYyBlbmQsc2V0U2Nyb2xsYWJsZT1mdW5jdGlvbihkYmMsX2NjKWJkYT0oCl9jYyBvciBfY2M9PW5pbClhbmQgdHJ1ZSBvciBmYWxzZQppZigKZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixkYmMpZW5kO2RhYlsibW91c2Vfc2Nyb2xsIl09dHJ1ZTtyZXR1cm4gZGJjIGVuZCxzZXRTY3JvbGxBbW91bnQ9ZnVuY3Rpb24oZGJjLF9jYyljZGE9Cl9jYyBvciBjZGE7YmFiPWZhbHNlO3JldHVybiBkYmMgZW5kLGdldFNjcm9sbEFtb3VudD1mdW5jdGlvbihkYmMpcmV0dXJuIGJhYiBhbmQgY2JjKGRiYylvcgpjZGEgZW5kLGdldENhbGN1bGF0ZWRWZXJ0aWNhbFNjcm9sbD1hYmMsZ2V0Q2FsY3VsYXRlZEhvcml6b250YWxTY3JvbGw9YmJjLHNob3c9ZnVuY3Rpb24oZGJjKWRfYS5zaG93KGRiYykKaWYoCmRiYy5wYXJlbnQ9PW5pbCl0aGVuIGNfYS5zZXRBY3RpdmVGcmFtZShkYmMpCmZvciBfY2MsYWNjIGluIHBhaXJzKGNvbG9ycylkbyBpZgoodHlwZShhY2MpPT0ibnVtYmVyIil0aGVuCl9jYS5zZXRQYWxldHRlQ29sb3IoYWNjLGNvbG9ycy5wYWNrUkdCKHRlcm0ubmF0aXZlUGFsZXR0ZUNvbG9yKChhY2MpKSkpZW5kIGVuZApmb3IgX2NjLGFjYyBpbiBwYWlycyhfYmIpZG8KaWYodHlwZShhY2MpPT0ibnVtYmVyIil0aGVuCl9jYS5zZXRQYWxldHRlQ29sb3IoCnR5cGUoX2NjKT09Im51bWJlciJhbmQgX2NjIG9yIGNvbG9yc1tfY2NdLGFjYyllbHNlIGxvY2FsIGJjYyxjY2MsZGNjPXRhYmxlLnVucGFjayhhY2MpCl9jYS5zZXRQYWxldHRlQ29sb3IoCnR5cGUoX2NjKT09Im51bWJlciJhbmQgX2NjIG9yIGNvbG9yc1tfY2NdLGJjYyxjY2MsZGNjKWVuZCBlbmQKaWYoYmNhKWFuZCBub3QoY2NhKXRoZW4gY19hLnNldE1vbml0b3JGcmFtZShhY2EsZGJjKWVsc2VpZihjY2EpdGhlbgpjX2Euc2V0TW9uaXRvckZyYW1lKGRiYzpnZXROYW1lKCksZGJjLGFjYSllbHNlIGNfYS5zZXRNYWluRnJhbWUoZGJjKWVuZCBlbmQ7cmV0dXJuIGRiYyBlbmQsaGlkZT1mdW5jdGlvbihkYmMpCmRfYS5oaWRlKGRiYykKaWYoZGJjLnBhcmVudD09bmlsKXRoZW4gaWYoYWN0aXZlRnJhbWU9PWRiYyl0aGVuIGFjdGl2ZUZyYW1lPW5pbCBlbmQKaWYoYmNhKWFuZApub3QoY2NhKXRoZW4gaWYoY19hLmdldE1vbml0b3JGcmFtZShhY2EpPT1kYmMpdGhlbgpjX2Euc2V0QWN0aXZlRnJhbWUobmlsKWVuZCBlbHNlaWYoY2NhKXRoZW4KaWYoCmNfYS5nZXRNb25pdG9yRnJhbWUoZGJjOmdldE5hbWUoKSk9PWRiYyl0aGVuIGNfYS5zZXRBY3RpdmVGcmFtZShuaWwpZW5kIGVsc2UKaWYoY19hLmdldE1haW5GcmFtZSgpPT1kYmMpdGhlbiBjX2Euc2V0TWFpbkZyYW1lKG5pbCllbmQgZW5kIGVuZDtyZXR1cm4gZGJjIGVuZCxhZGRMYXlvdXQ9ZnVuY3Rpb24oZGJjLF9jYykKaWYoCl9jY349bmlsKXRoZW4KaWYoZnMuZXhpc3RzKF9jYykpdGhlbiBsb2NhbCBhY2M9ZnMub3BlbihfY2MsInIiKQpsb2NhbCBiY2M9YWM6UGFyc2VYbWxUZXh0KGFjYy5yZWFkQWxsKCkpYWNjLmNsb3NlKCljY2I9e31kYmM6c2V0VmFsdWVzQnlYTUxEYXRhKGJjYyllbmQgZW5kO3JldHVybiBkYmMgZW5kLGdldExhc3RMYXlvdXQ9ZnVuY3Rpb24oZGJjKXJldHVybgpjY2IgZW5kLGFkZExheW91dEZyb21TdHJpbmc9ZnVuY3Rpb24oZGJjLF9jYylpZihfY2N+PW5pbCl0aGVuIGxvY2FsIGFjYz1hYzpQYXJzZVhtbFRleHQoX2NjKQpkYmM6c2V0VmFsdWVzQnlYTUxEYXRhKGFjYyllbmQ7cmV0dXJuIGRiYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRiYyxfY2MpCmRfYS5zZXRWYWx1ZXNCeVhNTERhdGEoZGJjLF9jYylpZihfZCgibW92YWJsZSIsX2NjKX49bmlsKXRoZW4gaWYoX2QoIm1vdmFibGUiLF9jYykpdGhlbgpkYmM6c2V0TW92YWJsZSh0cnVlKWVuZCBlbmQ7aWYoCl9kKCJzY3JvbGxhYmxlIixfY2Mpfj1uaWwpdGhlbgppZihfZCgic2Nyb2xsYWJsZSIsX2NjKSl0aGVuIGRiYzpzZXRTY3JvbGxhYmxlKHRydWUpZW5kIGVuZDtpZgooX2QoIm1vbml0b3IiLF9jYyl+PW5pbCl0aGVuCmRiYzpzZXRNb25pdG9yKF9kKCJtb25pdG9yIixfY2MpKTpzaG93KCllbmQ7aWYoX2QoIm1pcnJvciIsX2NjKX49bmlsKXRoZW4KZGJjOnNldE1pcnJvcihfZCgibWlycm9yIixfY2MpKWVuZAppZihfZCgiYmFyIixfY2Mpfj1uaWwpdGhlbiBpZihfZCgiYmFyIixfY2MpKXRoZW4KZGJjOnNob3dCYXIodHJ1ZSllbHNlIGRiYzpzaG93QmFyKGZhbHNlKWVuZCBlbmQKaWYoX2QoImJhclRleHQiLF9jYyl+PW5pbCl0aGVuIGRiYy5iYXJUZXh0PV9kKCJiYXJUZXh0IixfY2MpZW5kO2lmKF9kKCJiYXJCRyIsX2NjKX49bmlsKXRoZW4KZGJjLmJhckJhY2tncm91bmQ9Y29sb3JzW19kKCJiYXJCRyIsX2NjKV1lbmQ7aWYoX2QoImJhckZHIixfY2Mpfj1uaWwpdGhlbgpkYmMuYmFyVGV4dGNvbG9yPWNvbG9yc1tfZCgiYmFyRkciLF9jYyldZW5kO2lmKF9kKCJiYXJBbGlnbiIsX2NjKX49bmlsKXRoZW4KZGJjLmJhclRleHRBbGlnbj1fZCgiYmFyQWxpZ24iLF9jYyllbmQ7aWYoX2QoImxheW91dCIsX2NjKX49bmlsKXRoZW4KZGJjOmFkZExheW91dChfZCgibGF5b3V0IixfY2MpKWVuZDtpZihfZCgieE9mZnNldCIsX2NjKX49bmlsKXRoZW4KZGJjOnNldE9mZnNldChfZCgieE9mZnNldCIsX2NjKSxiY2IpZW5kO2lmKF9kKCJ5T2Zmc2V0IixfY2Mpfj1uaWwpdGhlbgpkYmM6c2V0T2Zmc2V0KGJjYixfZCgieU9mZnNldCIsX2NjKSllbmQ7aWYoX2QoInNjcm9sbEFtb3VudCIsX2NjKX49bmlsKXRoZW4KZGJjOnNldFNjcm9sbEFtb3VudChfZCgic2Nyb2xsQW1vdW50IixfY2MpKWVuZDtsb2NhbCBhY2M9X2NjOmNoaWxkcmVuKCkKZm9yIGJjYyxjY2MgaW4KcGFpcnMoYWNjKWRvIGlmKGNjYy5fX19uYW1lfj0iYW5pbWF0aW9uIil0aGVuCmxvY2FsIGRjYz1jY2MuX19fbmFtZTpnc3ViKCJeJWwiLHN0cmluZy51cHBlcikKaWYoY2JbZGNjXX49bmlsKXRoZW4gX2RiKGNjYyxkYmNbImFkZCIuLmRjY10sZGJjKWVuZCBlbmQgZW5kO19kYihfY2NbImZyYW1lIl0sZGJjLmFkZEZyYW1lLGRiYykKX2RiKF9jY1siYW5pbWF0aW9uIl0sZGJjLmFkZEFuaW1hdGlvbixkYmMpcmV0dXJuIGRiYyBlbmQsc2hvd0Jhcj1mdW5jdGlvbihkYmMsX2NjKWRiYy5iYXJBY3RpdmU9Cl9jYyBvciBub3QgZGJjLmJhckFjdGl2ZTtkYmM6dXBkYXRlRHJhdygpCnJldHVybiBkYmMgZW5kLHNldEJhcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpZGJjLmJhclRleHQ9X2NjIG9yIiJkYmMuYmFyQmFja2dyb3VuZD0KYWNjIG9yIGRiYy5iYXJCYWNrZ3JvdW5kCmRiYy5iYXJUZXh0Y29sb3I9YmNjIG9yIGRiYy5iYXJUZXh0Y29sb3I7ZGJjOnVwZGF0ZURyYXcoKXJldHVybiBkYmMgZW5kLHNldEJhclRleHRBbGlnbj1mdW5jdGlvbihkYmMsX2NjKWRiYy5iYXJUZXh0QWxpZ249Cl9jYyBvciJsZWZ0ImRiYzp1cGRhdGVEcmF3KClyZXR1cm4gZGJjIGVuZCxzZXRNaXJyb3I9ZnVuY3Rpb24oZGJjLF9jYylpZigKZGJjLnBhcmVudH49bmlsKXRoZW4KZXJyb3IoIkZyYW1lIGhhcyB0byBiZSBhIGJhc2UgZnJhbWUgaW4gb3JkZXIgdG8gYXR0YWNoIGEgbWlycm9yLiIpZW5kO2FfYj1fY2M7aWYobWlycm9yfj1uaWwpdGhlbgphYmIuc2V0TWlycm9yKG1pcnJvcillbmQ7ZGRhPXRydWU7cmV0dXJuIGRiYyBlbmQscmVtb3ZlTWlycm9yPWZ1bmN0aW9uKGRiYyltaXJyb3I9Cm5pbDtkZGE9ZmFsc2U7YWJiLnNldE1pcnJvcihuaWwpcmV0dXJuIGRiYyBlbmQsc2V0TW9uaXRvclNjYWxlPWZ1bmN0aW9uKGRiYyxfY2MpaWYKKGJjYSl0aGVuIF9jYS5zZXRUZXh0U2NhbGUoX2NjKWVuZDtyZXR1cm4gZGJjIGVuZCxzZXRNb25pdG9yPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZigKX2Njfj1uaWwpYW5kKF9jY349ZmFsc2UpdGhlbgppZih0eXBlKF9jYyk9PSJzdHJpbmciKXRoZW4KaWYoCnBlcmlwaGVyYWwuZ2V0VHlwZShfY2MpPT0ibW9uaXRvciIpdGhlbiBfY2E9cGVyaXBoZXJhbC53cmFwKF9jYylkY2E9dHJ1ZSBlbmQKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4gZGJjLnBhcmVudDpyZW1vdmVPYmplY3QoZGJjKWVuZDtiY2E9dHJ1ZTtjX2Euc2V0TW9uaXRvckZyYW1lKF9jYyxkYmMpZWxzZWlmKHR5cGUoX2NjKT09InRhYmxlIil0aGVuCl9jYT1iYyhfY2MpZGNhPXRydWU7YmNhPXRydWU7Y2NhPXRydWUKY19hLnNldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpLGRiYyx0cnVlKWVuZCBlbHNlIF9jYT1wYXJlbnRUZXJtaW5hbDtiY2E9ZmFsc2U7Y2NhPWZhbHNlCmlmKHR5cGUoYWNhKT09InN0cmluZyIpdGhlbgppZigKY19hLmdldE1vbml0b3JGcmFtZShhY2EpPT1kYmMpdGhlbiBjX2Euc2V0TW9uaXRvckZyYW1lKGFjYSxuaWwpZW5kIGVsc2UKaWYoY19hLmdldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpKT09ZGJjKXRoZW4gY19hLnNldE1vbml0b3JGcmFtZShkYmM6Z2V0TmFtZSgpLApuaWwpZW5kIGVuZCBlbmQ7aWYoYWNjfj1uaWwpdGhlbiBfY2Euc2V0VGV4dFNjYWxlKGFjYyllbmQ7YWJiPWRiKF9jYSkKZGJjOnNldFNpemUoX2NhLmdldFNpemUoKSlhYWI9dHJ1ZTthY2E9X2NjIG9yIG5pbDtkYmM6dXBkYXRlRHJhdygpcmV0dXJuIGRiYyBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihkYmMpCmRfYS5sb3NlRm9jdXNIYW5kbGVyKGRiYylpZihfYWJ+PW5pbCl0aGVuIF9hYjpsb3NlRm9jdXNIYW5kbGVyKClfYWI9bmlsIGVuZCBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGRiYykKZF9hLmdldEZvY3VzSGFuZGxlcihkYmMpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmlmKGJfYil0aGVuIGRiYy5wYXJlbnQ6cmVtb3ZlRXZlbnRzKGRiYykKZGJjLnBhcmVudDpyZW1vdmVPYmplY3QoZGJjKWRiYy5wYXJlbnQ6YWRkT2JqZWN0KGRiYylmb3IgX2NjLGFjYyBpbiBwYWlycyhkYWIpZG8gaWYoYWNjKXRoZW4KZGJjLnBhcmVudDphZGRFdmVudChfY2MsZGJjKWVuZCBlbmQKZGJjOnVwZGF0ZURyYXcoKWVuZCBlbmQ7aWYoX2Fifj1uaWwpdGhlbiBfYWI6Z2V0Rm9jdXNIYW5kbGVyKCllbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLC4uLikKZF9hLmV2ZW50SGFuZGxlcihkYmMsX2NjLC4uLikKaWYoZGFhWyJvdGhlcl9ldmVudCJdfj1uaWwpdGhlbgpmb3IgYWNjLGJjYyBpbiBpcGFpcnMoX2JhWyJvdGhlcl9ldmVudCJdKWRvIGlmKApkYWFbIm90aGVyX2V2ZW50Il1bYmNjXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gZGMoZGFhWyJvdGhlcl9ldmVudCJdW2JjY10pZG8gaWYKKGRjYy5ldmVudEhhbmRsZXJ+PW5pbCl0aGVuIGRjYzpldmVudEhhbmRsZXIoX2NjLC4uLillbmQgZW5kIGVuZCBlbmQgZW5kCmlmKGFhYilhbmQgbm90KGJjYSl0aGVuIGlmKGRiYy5wYXJlbnQ9PW5pbCl0aGVuCmlmKF9jYz09InRlcm1fcmVzaXplIil0aGVuCmRiYzpzZW5kRXZlbnQoImJhc2FsdF9yZXNpemUiLGRiYyxfY2MsLi4uKWRiYzpzZXRTaXplKF9jYS5nZXRTaXplKCkpYWFiPXRydWUgZW5kIGVuZCBlbmQKaWYoYmNhKXRoZW4KaWYoYWFiKXRoZW4KaWYoX2NjPT0ibW9uaXRvcl9yZXNpemUiKXRoZW4KaWYodHlwZShhY2EpPT0ic3RyaW5nIil0aGVuCmRiYzpzZXRTaXplKF9jYS5nZXRTaXplKCkpZWxzZWlmKHR5cGUoYWNhKT09InRhYmxlIil0aGVuCmZvciBhY2MsYmNjIGluIHBhaXJzKGFjYSlkbyBmb3IgY2NjLGRjYyBpbiBwYWlycyhiY2MpZG8gaWYocDEgPT1kY2MpdGhlbgpkYmM6c2V0U2l6ZShfY2EuZ2V0U2l6ZSgpKWVuZCBlbmQgZW5kIGVuZDthYWI9dHJ1ZTtkYmM6dXBkYXRlRHJhdygpZW5kIGVuZAppZihfY2M9PSJwZXJpcGhlcmFsIilhbmQocDEgPT1hY2EpdGhlbiBpZgoocGVyaXBoZXJhbC5nZXRUeXBlKGFjYSk9PSJtb25pdG9yIil0aGVuIGRjYT10cnVlO19jYT1wZXJpcGhlcmFsLndyYXAoYWNhKWFiYj1kYihfY2EpCmRiYzp1cGRhdGVEcmF3KCllbmQgZW5kCmlmKF9jYz09InBlcmlwaGVyYWxfZGV0YWNoIilhbmQocDEgPT1hY2EpdGhlbiBkY2E9ZmFsc2UgZW5kIGVuZAppZihkZGEpdGhlbiBpZihwZXJpcGhlcmFsLmdldFR5cGUoYV9iKT09Im1vbml0b3IiKXRoZW4gX19iPXRydWUKYWJiLnNldE1pcnJvcihwZXJpcGhlcmFsLndyYXAoYV9iKSllbmQ7aWYoX2NjPT0icGVyaXBoZXJhbF9kZXRhY2giKWFuZAoocDEgPT1hX2IpdGhlbiBkY2E9ZmFsc2UgZW5kCmlmCihfY2M9PSJtb25pdG9yX3RvdWNoIilhbmQoYV9iPT1wMSl0aGVuIGRiYzptb3VzZUhhbmRsZXIoMSxwMixwMyx0cnVlKWVuZCBlbmQgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjLGRjYykKaWYKKGNjYSl0aGVuIGlmKF9jYS5jYWxjdWxhdGVDbGlja349bmlsKXRoZW4KYWNjLGJjYz1fY2EuY2FsY3VsYXRlQ2xpY2soZGNjLGFjYyxiY2MpZW5kIGVuZAppZihkX2EubW91c2VIYW5kbGVyKGRiYyxfY2MsYWNjLGJjYyxjY2MpKXRoZW4KaWYoZGFhWyJtb3VzZV9jbGljayJdfj1uaWwpdGhlbgpkYmM6c2V0Q3Vyc29yKGZhbHNlKQpmb3IgX2RjLGFkYyBpbiBpcGFpcnMoX2JhWyJtb3VzZV9jbGljayJdKWRvCmlmCihkYWFbIm1vdXNlX2NsaWNrIl1bYWRjXX49bmlsKXRoZW4gZm9yIGJkYyxjZGMgaW4gZGMoZGFhWyJtb3VzZV9jbGljayJdW2FkY10pZG8KaWYoY2RjLm1vdXNlSGFuZGxlcn49bmlsKXRoZW4gaWYKKGNkYzptb3VzZUhhbmRsZXIoX2NjLGFjYyxiY2MsY2NjKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kCmlmKGJfYil0aGVuCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFic29sdXRlUG9zaXRpb24oZGJjOmdldEFuY2hvclBvc2l0aW9uKCkpaWYKKGFjYz49X2RjKWFuZChhY2M8PV9kYytkYmM6Z2V0V2lkdGgoKS0xKWFuZChiY2M9PWFkYyl0aGVuIGNfYj10cnVlO19kYT1fZGMtYWNjCmFkYT15T2ZmIGFuZCAxIG9yIDAgZW5kIGVuZDtkYmM6cmVtb3ZlRm9jdXNlZE9iamVjdCgpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKWlmCihjX2IpdGhlbiBjX2I9ZmFsc2UgZW5kCmlmKGRfYS5tb3VzZVVwSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpKXRoZW4KaWYKKGRhYVsibW91c2VfdXAiXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gaXBhaXJzKF9iYVsibW91c2VfdXAiXSlkbwppZihkYWFbIm1vdXNlX3VwIl1bZGNjXX49bmlsKXRoZW4KZm9yIF9kYyxhZGMgaW4KZGMoZGFhWyJtb3VzZV91cCJdW2RjY10pZG8gaWYoYWRjLm1vdXNlVXBIYW5kbGVyfj1uaWwpdGhlbgppZihhZGM6bW91c2VVcEhhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmlmCihkX2Euc2Nyb2xsSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpKXRoZW4KaWYoZGFhWyJtb3VzZV9zY3JvbGwiXX49bmlsKXRoZW4KZm9yIGRjYyxfZGMgaW4gcGFpcnMoX2JhWyJtb3VzZV9zY3JvbGwiXSlkbwppZigKZGFhWyJtb3VzZV9zY3JvbGwiXVtfZGNdfj1uaWwpdGhlbgpmb3IgYWRjLGJkYyBpbiBkYyhkYWFbIm1vdXNlX3Njcm9sbCJdW19kY10pZG8gaWYoYmRjLnNjcm9sbEhhbmRsZXJ+PQpuaWwpdGhlbgppZihiZGM6c2Nyb2xsSGFuZGxlcihfY2MsYWNjLGJjYykpdGhlbiByZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZDtsb2NhbCBjY2M9YmNiCmlmKGJkYSl0aGVuIGNiYyhkYmMpaWYoX2NjPjApb3IoX2NjPDApdGhlbgpiY2I9ZGQoY2QoYmNiLV9jYywwKSwtY2RhKWRiYzp1cGRhdGVEcmF3KCllbmQgZW5kO2lmKGJjYj09Y2NjKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtkYmM6cmVtb3ZlRm9jdXNlZE9iamVjdCgpCnJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGhvdmVySGFuZGxlcj1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MpCmlmCihkX2EuaG92ZXJIYW5kbGVyKGRiYyxfY2MsYWNjLGJjYykpdGhlbgppZihkYWFbIm1vdXNlX21vdmUiXX49bmlsKXRoZW4KZm9yIGNjYyxkY2MgaW4gcGFpcnMoX2JhWyJtb3VzZV9tb3ZlIl0pZG8KaWYoCmRhYVsibW91c2VfbW92ZSJdW2RjY11+PW5pbCl0aGVuIGZvciBfZGMsYWRjIGluIGRjKGRhYVsibW91c2VfbW92ZSJdW2RjY10pZG8KaWYKKGFkYy5ob3ZlckhhbmRsZXJ+PW5pbCl0aGVuIGlmKGFkYzpob3ZlckhhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBmYWxzZSBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKQppZgooY19iKXRoZW4gbG9jYWwgY2NjLGRjYz1kYmMucGFyZW50OmdldE9mZnNldEludGVybmFsKCljY2M9Y2NjPDAgYW5kCmRfYy5hYnMoY2NjKW9yLWNjYztkY2M9ZGNjPDAgYW5kIGRfYy5hYnMoZGNjKW9yLQpkY2M7bG9jYWwgX2RjPTE7bG9jYWwgYWRjPTE7aWYoZGJjLnBhcmVudH49bmlsKXRoZW4KX2RjLGFkYz1kYmMucGFyZW50OmdldEFic29sdXRlUG9zaXRpb24oZGJjLnBhcmVudDpnZXRBbmNob3JQb3NpdGlvbigpKWVuZApkYmM6c2V0UG9zaXRpb24oCmFjYytfZGEtIChfZGMtMSkrY2NjLGJjYythZGEtIChhZGMtMSkrZGNjKWRiYzp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQKaWYoZGJjOmlzVmlzaWJsZSgpKWFuZChkYmM6aXNFbmFibGVkKCkpdGhlbgppZgooZGFhWyJtb3VzZV9kcmFnIl1+PW5pbCl0aGVuCmZvciBjY2MsZGNjIGluIGlwYWlycyhfYmFbIm1vdXNlX2RyYWciXSlkbwppZgooZGFhWyJtb3VzZV9kcmFnIl1bZGNjXX49bmlsKXRoZW4gZm9yIF9kYyxhZGMgaW4gZGMoZGFhWyJtb3VzZV9kcmFnIl1bZGNjXSlkbwppZihhZGMuZHJhZ0hhbmRsZXJ+PW5pbCl0aGVuIGlmCihhZGM6ZHJhZ0hhbmRsZXIoX2NjLGFjYyxiY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO2RfYS5kcmFnSGFuZGxlcihkYmMsX2NjLGFjYyxiY2MpcmV0dXJuIGZhbHNlIGVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MsYWNjKQppZgooZGJjOmlzRm9jdXNlZCgpKW9yKGRiYy5wYXJlbnQ9PW5pbCl0aGVuCmxvY2FsIGJjYz1kYmM6Z2V0RXZlbnRTeXN0ZW0oKTpzZW5kRXZlbnQoImtleSIsZGJjLCJrZXkiLF9jYylpZihiY2M9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZAppZihkYWFbImtleSJdfj1uaWwpdGhlbgpmb3IgY2NjLGRjYyBpbiBwYWlycyhfYmFbImtleSJdKWRvCmlmKApkYWFbImtleSJdW2RjY11+PW5pbCl0aGVuCmZvciBfZGMsYWRjIGluIGRjKGRhYVsia2V5Il1bZGNjXSlkbyBpZihhZGMua2V5SGFuZGxlcn49bmlsKXRoZW4gaWYKKGFkYzprZXlIYW5kbGVyKF9jYyxhY2MpKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kO3JldHVybiBmYWxzZSBlbmQsa2V5VXBIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MpCmlmCihkYmM6aXNGb2N1c2VkKCkpb3IoZGJjLnBhcmVudD09bmlsKXRoZW4KbG9jYWwgYWNjPWRiYzpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgia2V5X3VwIixkYmMsImtleV91cCIsX2NjKWlmKGFjYz09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kCmlmKGRhYVsia2V5X3VwIl1+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluCnBhaXJzKF9iYVsia2V5X3VwIl0pZG8KaWYoZGFhWyJrZXlfdXAiXVtjY2Ndfj1uaWwpdGhlbiBmb3IgZGNjLF9kYyBpbiBkYyhkYWFbImtleV91cCJdW2NjY10pZG8KaWYoCl9kYy5rZXlVcEhhbmRsZXJ+PW5pbCl0aGVuIGlmKF9kYzprZXlVcEhhbmRsZXIoX2NjKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGNoYXJIYW5kbGVyPWZ1bmN0aW9uKGRiYyxfY2MpCmlmCihkYmM6aXNGb2N1c2VkKCkpb3IoZGJjLnBhcmVudD09bmlsKXRoZW4KbG9jYWwgYWNjPWRiYzpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgiY2hhciIsZGJjLCJjaGFyIixfY2MpaWYoYWNjPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQKaWYoZGFhWyJjaGFyIl1+PW5pbCl0aGVuCmZvciBiY2MsY2NjIGluCnBhaXJzKF9iYVsiY2hhciJdKWRvCmlmKGRhYVsiY2hhciJdW2NjY11+PW5pbCl0aGVuIGZvciBkY2MsX2RjIGluIGRjKGRhYVsiY2hhciJdW2NjY10pZG8KaWYKKF9kYy5jaGFySGFuZGxlcn49bmlsKXRoZW4gaWYoX2RjOmNoYXJIYW5kbGVyKF9jYykpdGhlbiByZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKbG9jYWwgY2NjLGRjYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpzZXRUZXh0KGRkKApfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZWxzZQphYmIuc2V0VGV4dChkZChfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZW5kIGVuZCBlbmQsc2V0Qkc9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjKQpsb2NhbCBjY2MsZGNjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmlmKGFjYz49MSlhbmQoYWNjPD1kYmM6Z2V0SGVpZ2h0KCkpdGhlbgppZihkYmMucGFyZW50fj1uaWwpdGhlbgpkYmMucGFyZW50OnNldEJHKGRkKApfY2MrIChjY2MtMSksY2NjKSxkY2MrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKApkYmM6Z2V0V2lkdGgoKS1fY2MrMSwxKSkpZWxzZQphYmIuc2V0QkcoZGQoX2NjKyAoY2NjLTEpLGNjYyksZGNjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpKWVuZCBlbmQgZW5kLHNldEZHPWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYykKbG9jYWwgY2NjLGRjYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpzZXRGRyhkZCgKX2NjKyAoY2NjLTEpLGNjYyksZGNjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpKWVsc2UKYWJiLnNldEZHKGRkKF9jYysgKGNjYy0xKSxjY2MpLGRjYythY2MtMSxiZChiY2MsZGQoMSAtX2NjKzEsMSksZGQoCmRiYzpnZXRXaWR0aCgpLV9jYysxLDEpKSllbmQgZW5kIGVuZCx3cml0ZVRleHQ9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKaWYoYWNjPj0xKWFuZChhY2M8PWRiYzpnZXRIZWlnaHQoKSl0aGVuCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6d3JpdGVUZXh0KGRkKApfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmQoYmNjLGRkKDEgLV9jYysxLDEpLApkYmM6Z2V0V2lkdGgoKS1fY2MrMSksY2NjLGRjYyllbHNlCmFiYi53cml0ZVRleHQoZGQoX2NjKyAoX2RjLTEpLF9kYyksYWRjK2FjYy0xLGJkKGJjYyxkZCgxIC1fY2MrMSwxKSxkZCgKZGJjOmdldFdpZHRoKCktX2NjKzEsMSkpLGNjYyxkY2MpZW5kIGVuZCBlbmQsYmxpdD1mdW5jdGlvbihkYmMsX2NjLGFjYyxiY2MsY2NjLGRjYykKbG9jYWwgX2RjLGFkYz1kYmM6Z2V0QW5jaG9yUG9zaXRpb24oKQppZihhY2M+PTEpYW5kKGFjYzw9ZGJjOmdldEhlaWdodCgpKXRoZW4KbG9jYWwgYmRjPWRiYzpnZXRXaWR0aCgpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmJjYz1iZChiY2MsZGQoMSAtX2NjKzEsMSksYmRjLV9jYysxKWNjYz1iZChjY2MsZGQoMSAtX2NjKzEsMSksYmRjLV9jYysxKWRjYz1iZChkY2MsZGQoCjEgLV9jYysxLDEpLGJkYy1fY2MrMSkKZGJjLnBhcmVudDpibGl0KGRkKApfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmNjLGNjYyxkY2MpZWxzZQpiY2M9YmQoYmNjLGRkKDEgLV9jYysxLDEpLGRkKGJkYy1fY2MrMSwxKSkKY2NjPWJkKGNjYyxkZCgxIC1fY2MrMSwxKSxkZChiZGMtX2NjKzEsMSkpCmRjYz1iZChkY2MsZGQoMSAtX2NjKzEsMSksZGQoYmRjLV9jYysxLDEpKQphYmIuYmxpdChkZChfY2MrIChfZGMtMSksX2RjKSxhZGMrYWNjLTEsYmNjLGNjYyxkY2MpZW5kIGVuZCBlbmQsZHJhd0JhY2tncm91bmRCb3g9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKY2NjPShhY2M8MSBhbmQoCmNjYythY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKW9yIGNjYythY2MtMSlvcigKY2NjKwphY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKS1hY2MrMSBvciBjY2MpKQpiY2M9KF9jYzwxIGFuZChiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpb3IgYmNjKwpfY2MtMSlvcigKCmJjYytfY2M+ZGJjOmdldFdpZHRoKClhbmQgZGJjOmdldFdpZHRoKCktX2NjKzEgb3IgYmNjKSkKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbHNlCmFiYi5kcmF3QmFja2dyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbmQgZW5kLGRyYXdUZXh0Qm94PWZ1bmN0aW9uKGRiYyxfY2MsYWNjLGJjYyxjY2MsZGNjKQpsb2NhbCBfZGMsYWRjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpCmNjYz0oYWNjPDEgYW5kKApjY2MrYWNjPmRiYzpnZXRIZWlnaHQoKWFuZCBkYmM6Z2V0SGVpZ2h0KClvciBjY2MrYWNjLTEpb3IoCmNjYysKYWNjPmRiYzpnZXRIZWlnaHQoKWFuZCBkYmM6Z2V0SGVpZ2h0KCktYWNjKzEgb3IgY2NjKSkKYmNjPShfY2M8MSBhbmQoYmNjK19jYz5kYmM6Z2V0V2lkdGgoKWFuZCBkYmM6Z2V0V2lkdGgoKW9yIGJjYysKX2NjLTEpb3IoCgpiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpLV9jYysxIG9yIGJjYykpCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6ZHJhd1RleHRCb3goZGQoX2NjKyAoX2RjLTEpLF9kYyksZGQoYWNjKyAoYWRjLTEpLGFkYyksYmNjLGNjYyxiZChkY2MsMSwxKSllbHNlCmFiYi5kcmF3VGV4dEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGJkKGRjYywxLDEpKWVuZCBlbmQsZHJhd0ZvcmVncm91bmRCb3g9ZnVuY3Rpb24oZGJjLF9jYyxhY2MsYmNjLGNjYyxkY2MpCmxvY2FsIF9kYyxhZGM9ZGJjOmdldEFuY2hvclBvc2l0aW9uKCkKY2NjPShhY2M8MSBhbmQoCmNjYythY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKW9yIGNjYythY2MtMSlvcigKY2NjKwphY2M+ZGJjOmdldEhlaWdodCgpYW5kIGRiYzpnZXRIZWlnaHQoKS1hY2MrMSBvciBjY2MpKQpiY2M9KF9jYzwxIGFuZChiY2MrX2NjPmRiYzpnZXRXaWR0aCgpYW5kIGRiYzpnZXRXaWR0aCgpb3IgYmNjKwpfY2MtMSlvcigKCmJjYytfY2M+ZGJjOmdldFdpZHRoKClhbmQgZGJjOmdldFdpZHRoKCktX2NjKzEgb3IgYmNjKSkKaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbHNlCmFiYi5kcmF3Rm9yZWdyb3VuZEJveChkZChfY2MrIChfZGMtMSksX2RjKSxkZChhY2MrIChhZGMtMSksYWRjKSxiY2MsY2NjLGRjYyllbmQgZW5kLGRyYXc9ZnVuY3Rpb24oZGJjLF9jYylpZgooYmNhKWFuZCBub3QoZGNhKXRoZW4gcmV0dXJuIGZhbHNlIGVuZAppZihkYmMucGFyZW50PT1uaWwpdGhlbiBpZihkYmM6Z2V0RHJhdygpPT0KZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZAppZihkX2EuZHJhdyhkYmMpKXRoZW4KbG9jYWwgYWNjLGJjYz1kYmM6Z2V0QWJzb2x1dGVQb3NpdGlvbihkYmM6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBjY2MsZGNjPWRiYzpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX2RjLGFkYz1kYmM6Z2V0U2l6ZSgpCmlmKApkYmMucGFyZW50PT1uaWwpdGhlbgppZihkYmMuYmdDb2xvcn49ZmFsc2UpdGhlbgphYmIuZHJhd0JhY2tncm91bmRCb3goY2NjLGRjYyxfZGMsYWRjLGRiYy5iZ0NvbG9yKWFiYi5kcmF3VGV4dEJveChjY2MsZGNjLF9kYyxhZGMsIiAiKWVuZDtpZihkYmMuZmdDb2xvcn49ZmFsc2UpdGhlbgphYmIuZHJhd0ZvcmVncm91bmRCb3goY2NjLGRjYyxfZGMsYWRjLGRiYy5mZ0NvbG9yKWVuZCBlbmQKaWYoZGJjLmJhckFjdGl2ZSl0aGVuCmlmKGRiYy5wYXJlbnR+PW5pbCl0aGVuCmRiYy5wYXJlbnQ6d3JpdGVUZXh0KGNjYyxkY2MsX2MuZ2V0VGV4dEhvcml6b250YWxBbGlnbihkYmMuYmFyVGV4dCxfZGMsZGJjLmJhclRleHRBbGlnbiksZGJjLmJhckJhY2tncm91bmQsZGJjLmJhclRleHRjb2xvcillbHNlCmFiYi53cml0ZVRleHQoY2NjLGRjYyxfYy5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGRiYy5iYXJUZXh0LF9kYyxkYmMuYmFyVGV4dEFsaWduKSxkYmMuYmFyQmFja2dyb3VuZCxkYmMuYmFyVGV4dGNvbG9yKWVuZAppZihkYmM6Z2V0Qm9yZGVyKCJsZWZ0IikpdGhlbgppZihkYmMucGFyZW50fj1uaWwpdGhlbgpkYmMucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGNjYy0xLGRjYywxLDEsZGJjLmJhckJhY2tncm91bmQpaWYoZGJjLmJnQ29sb3J+PWZhbHNlKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChjY2MtMSxkY2MrMSwxLGFkYy0xLGRiYy5iZ0NvbG9yKWVuZCBlbmQgZW5kCmlmKGRiYzpnZXRCb3JkZXIoInRvcCIpKXRoZW4gaWYoZGJjLnBhcmVudH49bmlsKXRoZW4KZGJjLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChjY2MtMSxkY2MtMSxfZGMrMSwxLGRiYy5iYXJCYWNrZ3JvdW5kKWVuZCBlbmQgZW5kO2ZvciBiZGMsY2RjIGluIGRjKGJhYSlkbwppZihhYWFbY2RjXX49bmlsKXRoZW4gZm9yIGRkYyxfX2QgaW4gcGFpcnMoYWFhW2NkY10pZG8KaWYoX19kLmRyYXd+PW5pbCl0aGVuIF9fZDpkcmF3KCllbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCx1cGRhdGVUZXJtPWZ1bmN0aW9uKGRiYylpZgooYmNhKWFuZCBub3QoZGNhKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDthYmIudXBkYXRlKCllbmQsYWRkT2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpcmV0dXJuCmNkYihfY2MpZW5kLHJlbW92ZU9iamVjdD1fX2MsZ2V0T2JqZWN0PWZ1bmN0aW9uKGRiYyxfY2MpcmV0dXJuIGFkYihfY2MpZW5kLGdldERlZXBPYmplY3Q9ZnVuY3Rpb24oZGJjLF9jYylyZXR1cm4gYmRiKF9jYyllbmQsYWRkRnJhbWU9ZnVuY3Rpb24oZGJjLF9jYylsb2NhbCBhY2M9Y19hLm5ld0ZyYW1lKApfY2Mgb3IgY2MoKSxkYmMsbmlsLGNfYSlyZXR1cm4gY2RiKGFjYyllbmQsaW5pdD1mdW5jdGlvbihkYmMpCmlmCm5vdChjYWIpdGhlbgppZihhX2F+PW5pbCl0aGVuIGRfYS53aWR0aCxkX2EuaGVpZ2h0PWFfYTpnZXRTaXplKCkKZGJjOnNldEJhY2tncm91bmQoYV9hOmdldFRoZW1lKCJGcmFtZUJHIikpCmRiYzpzZXRGb3JlZ3JvdW5kKGFfYTpnZXRUaGVtZSgiRnJhbWVUZXh0IikpZWxzZSBkX2Eud2lkdGgsZF9hLmhlaWdodD1fY2EuZ2V0U2l6ZSgpCmRiYzpzZXRCYWNrZ3JvdW5kKGNfYS5nZXRUaGVtZSgiQmFzYWx0QkciKSkKZGJjOnNldEZvcmVncm91bmQoY19hLmdldFRoZW1lKCJCYXNhbHRUZXh0IikpZW5kO2NhYj10cnVlIGVuZCBlbmR9CmZvciBkYmMsX2NjIGluIHBhaXJzKGNiKWRvIGNhYVsiYWRkIi4uZGJjXT1mdW5jdGlvbihhY2MsYmNjKQpyZXR1cm4gY2RiKF9jYyhiY2Mgb3IgY2MoKSxhY2MpKWVuZCBlbmQ7c2V0bWV0YXRhYmxlKGNhYSxkX2EpcmV0dXJuIGNhYSBlbmQgZW5kCmFhWyJsb2FkT2JqZWN0cyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj17fWlmKGJhKXRoZW4KZm9yIGRiLF9jIGluIHBhaXJzKF9iKCJvYmplY3RzIikpZG8gYWJbZGJdPV9jKCllbmQ7cmV0dXJuIGFiIGVuZDtsb2NhbCBiYj10YWJsZS5wYWNrKC4uLilsb2NhbCBjYj1mcy5nZXREaXIoCmJiWzJdb3IiQmFzYWx0IilpZihjYj09bmlsKXRoZW4KZXJyb3IoIlVuYWJsZSB0byBmaW5kIGRpcmVjdG9yeSAiLi5iYlsyXS4uCiIgcGxlYXNlIHJlcG9ydCB0aGlzIGJ1ZyB0byBvdXIgZGlzY29yZC4iKWVuZDtmb3IgZGIsX2MgaW4KcGFpcnMoZnMubGlzdChmcy5jb21iaW5lKGNiLCJvYmplY3RzIikpKWRvCmlmKF9jfj0iZXhhbXBsZS5sdWEiKXRoZW4gbG9jYWwgYWM9X2M6Z3N1YigiLmx1YSIsIiIpYWJbYWNdPWRhKGFjKWVuZCBlbmQ7cmV0dXJuIGFiIGVuZAphYVsibWFpbiJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiYmFzYWx0RXZlbnQiKSgpbG9jYWwgYmI9ZGEoIkZyYW1lIikKbG9jYWwgY2I9ZGEoInRoZW1lIilsb2NhbCBkYj1kYSgidXRpbHMiKWxvY2FsIF9jPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBhYz1kYi51dWlkCmxvY2FsIGJjPWRiLmNyZWF0ZVRleHQ7bG9jYWwgY2M9ZGIudGFibGVDb3VudDtsb2NhbCBkYz0zMDA7bG9jYWwgX2Q9NTA7bG9jYWwgYWQ9dGVybS5jdXJyZW50KClsb2NhbCBiZD0iMS42LjQibG9jYWwgY2Q9ZnMuZ2V0RGlyKAp0YWJsZS5wYWNrKC4uLilbMl1vciIiKQpsb2NhbCBkZCxfX2EsYV9hLGJfYSxjX2EsZF9hPXt9LHt9LHt9LHt9LHt9LHt9bG9jYWwgX2FhLGFhYSxiYWEsY2FhO2xvY2FsIGRhYT17fWlmCm5vdCB0ZXJtLmlzQ29sb3Igb3Igbm90IHRlcm0uaXNDb2xvcigpdGhlbgplcnJvcignQmFzYWx0IHJlcXVpcmVzIGFuIGFkdmFuY2VkIChnb2xkZW4pIGNvbXB1dGVyIHRvIHJ1bi4nLDApZW5kO2xvY2FsIF9iYT17fQpmb3IgZGFiLF9iYiBpbgpwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYmIpPT0ibnVtYmVyIil0aGVuCl9iYVtkYWJdPXthZC5nZXRQYWxldHRlQ29sb3IoX2JiKX1lbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGFiYSgpY2FhPWZhbHNlO2FkLmNsZWFyKClhZC5zZXRDdXJzb3JQb3MoMSwxKQpmb3IgZGFiLF9iYiBpbiBwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYmIpPT0KIm51bWJlciIpdGhlbgphZC5zZXRQYWxldHRlQ29sb3IoX2JiLGNvbG9ycy5wYWNrUkdCKHRhYmxlLnVucGFjayhfYmFbZGFiXSkpKWVuZCBlbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGJiYShkYWIpYWQuY2xlYXIoKWFkLnNldEJhY2tncm91bmRDb2xvcihjb2xvcnMuYmxhY2spCmFkLnNldFRleHRDb2xvcihjb2xvcnMucmVkKWxvY2FsIF9iYixhYmI9YWQuZ2V0U2l6ZSgpaWYoZGFhLmxvZ2dpbmcpdGhlbiBfYyhkYWIsIkVycm9yIillbmQ7bG9jYWwgYmJiPWJjKAoiQmFzYWx0IGVycm9yOiAiLi5kYWIsX2JiKWxvY2FsIGNiYj0xO2ZvciBkYmIsX2NiIGluIHBhaXJzKGJiYilkbwphZC5zZXRDdXJzb3JQb3MoMSxjYmIpYWQud3JpdGUoX2NiKWNiYj1jYmIrMSBlbmQ7YWQuc2V0Q3Vyc29yUG9zKDEsCmNiYisxKWNhYT1mYWxzZSBlbmQKbG9jYWwgZnVuY3Rpb24gY2JhKGRhYikKYXNzZXJ0KGRhYn49ImZ1bmN0aW9uIiwiU2NoZWR1bGUgbmVlZHMgYSBmdW5jdGlvbiBpbiBvcmRlciB0byB3b3JrISIpCnJldHVybiBmdW5jdGlvbiguLi4pbG9jYWwgX2JiPWNvcm91dGluZS5jcmVhdGUoZGFiKQpsb2NhbCBhYmIsYmJiPWNvcm91dGluZS5yZXN1bWUoX2JiLC4uLikKaWYoYWJiKXRoZW4gdGFibGUuaW5zZXJ0KGRfYSx7X2JiLGJiYn0pZWxzZSBiYmEoYmJiKWVuZCBlbmQgZW5kO2xvY2FsIGRiYT1mdW5jdGlvbihkYWIsX2JiKWNfYVtkYWJdPV9iYiBlbmQKbG9jYWwgX2NhPWZ1bmN0aW9uKGRhYilyZXR1cm4gY19hW2RhYl1lbmQ7bG9jYWwgYWNhPWZ1bmN0aW9uKGRhYiljYj1kYWIgZW5kCmxvY2FsIGJjYT1mdW5jdGlvbihkYWIpcmV0dXJuIGNiW2RhYl1lbmQKbG9jYWwgY2NhPXtnZXREeW5hbWljVmFsdWVFdmVudFNldHRpbmc9ZnVuY3Rpb24oKXJldHVybiBkYWEuZHluYW1pY1ZhbHVlRXZlbnRzIGVuZCxnZXRNYWluRnJhbWU9ZnVuY3Rpb24oKXJldHVybiBfYWEgZW5kLHNldFZhcmlhYmxlPWRiYSxnZXRWYXJpYWJsZT1fY2EsZ2V0VGhlbWU9YmNhLHNldE1haW5GcmFtZT1mdW5jdGlvbihkYWIpCl9hYT1kYWIgZW5kLGdldEFjdGl2ZUZyYW1lPWZ1bmN0aW9uKClyZXR1cm4gYWFhIGVuZCxzZXRBY3RpdmVGcmFtZT1mdW5jdGlvbihkYWIpYWFhPWRhYiBlbmQsZ2V0Rm9jdXNlZE9iamVjdD1mdW5jdGlvbigpcmV0dXJuIGJhYSBlbmQsc2V0Rm9jdXNlZE9iamVjdD1mdW5jdGlvbihkYWIpYmFhPWRhYiBlbmQsZ2V0TW9uaXRvckZyYW1lPWZ1bmN0aW9uKGRhYilyZXR1cm4KYV9hW2RhYl1vciBiX2FbZGFiXVsxXWVuZCxzZXRNb25pdG9yRnJhbWU9ZnVuY3Rpb24oZGFiLF9iYixhYmIpaWYoX2FhPT1fYmIpdGhlbgpfYWE9bmlsIGVuZAppZihhYmIpdGhlbiBiX2FbZGFiXT17X2JiLHNpZGVzfWVsc2UgYV9hW2RhYl09X2JiIGVuZDtpZihfYmI9PW5pbCl0aGVuIGJfYVtkYWJdPW5pbCBlbmQgZW5kLGdldEJhc2VUZXJtPWZ1bmN0aW9uKClyZXR1cm4KYWQgZW5kLHNjaGVkdWxlPWNiYSxzdG9wPWFiYSxuZXdGcmFtZT1iYixnZXREaXJlY3Rvcnk9ZnVuY3Rpb24oKXJldHVybiBjZCBlbmR9CmxvY2FsIGZ1bmN0aW9uIGRjYShkYWIsLi4uKQppZigjZF9hPjApdGhlbiBsb2NhbCBfYmI9e30KZm9yIG49MSwjZF9hIGRvCmlmKGRfYVtuXX49bmlsKXRoZW4KaWYKKGNvcm91dGluZS5zdGF0dXMoZF9hW25dWzFdKT09InN1c3BlbmRlZCIpdGhlbgppZihkX2Fbbl1bMl1+PW5pbCl0aGVuCmlmKGRfYVtuXVsyXT09ZGFiKXRoZW4KbG9jYWwgYWJiLGJiYj1jb3JvdXRpbmUucmVzdW1lKGRfYVtuXVsxXSxkYWIsLi4uKWRfYVtuXVsyXT1iYmI7aWYgbm90KGFiYil0aGVuIGJiYShiYmIpZW5kIGVuZCBlbHNlIGxvY2FsIGFiYixiYmI9Y29yb3V0aW5lLnJlc3VtZShkX2Fbbl1bMV0sZGFiLC4uLikKZF9hW25dWzJdPWJiYjtpZiBub3QoYWJiKXRoZW4gYmJhKGJiYillbmQgZW5kIGVsc2UgdGFibGUuaW5zZXJ0KF9iYixuKWVuZCBlbmQgZW5kCmZvciBuPTEsI19iYiBkbyB0YWJsZS5yZW1vdmUoZF9hLF9iYltuXS0gKG4tMSkpZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2RhKClpZihjYWE9PWZhbHNlKXRoZW4gcmV0dXJuIGVuZDtpZihfYWF+PW5pbCl0aGVuIF9hYTpkcmF3KCkKX2FhOnVwZGF0ZVRlcm0oKWVuZApmb3IgZGFiLF9iYiBpbiBwYWlycyhhX2EpZG8gX2JiOmRyYXcoKV9iYjp1cGRhdGVUZXJtKCllbmQKZm9yIGRhYixfYmIgaW4gcGFpcnMoYl9hKWRvIF9iYlsxXTpkcmF3KClfYmJbMV06dXBkYXRlVGVybSgpZW5kIGVuZDtsb2NhbCBhZGEsYmRhLGNkYT1uaWwsbmlsLG5pbDtsb2NhbCBkZGE9bmlsCmxvY2FsIGZ1bmN0aW9uIF9fYihkYWIsX2JiLGFiYixiYmIpYWRhLGJkYSxjZGE9X2JiLGFiYixiYmI7aWYoZGRhPT1uaWwpdGhlbgpkZGE9b3Muc3RhcnRUaW1lcihkYy8xMDAwKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYV9iKClkZGE9bmlsO19hYTpob3ZlckhhbmRsZXIoYmRhLGNkYSxhZGEpYWFhPV9hYSBlbmQ7bG9jYWwgYl9iLGNfYixkX2I9bmlsLG5pbCxuaWw7bG9jYWwgX2FiPW5pbDtsb2NhbCBmdW5jdGlvbiBhYWIoKV9hYj1uaWw7X2FhOmRyYWdIYW5kbGVyKGJfYixjX2IsZF9iKQphYWE9X2FhIGVuZDtsb2NhbCBmdW5jdGlvbiBiYWIoZGFiLF9iYixhYmIsYmJiKWJfYixjX2IsZF9iPV9iYixhYmIsYmJiCmlmKF9kPDUwKXRoZW4gYWFiKCllbHNlIGlmKF9hYj09bmlsKXRoZW4gX2FiPW9zLnN0YXJ0VGltZXIoCl9kLzEwMDApZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gY2FiKGRhYiwuLi4pCmxvY2FsIF9iYj17Li4ufQppZihhYjpzZW5kRXZlbnQoImJhc2FsdEV2ZW50Q3ljbGUiLGRhYiwuLi4pPT1mYWxzZSl0aGVuIHJldHVybiBlbmQ7aWYoZGFiPT0idGVybWluYXRlIil0aGVuIGRhYS5zdG9wKCllbmQKaWYoX2Fhfj1uaWwpdGhlbgpsb2NhbCBhYmI9e21vdXNlX2NsaWNrPV9hYS5tb3VzZUhhbmRsZXIsbW91c2VfdXA9X2FhLm1vdXNlVXBIYW5kbGVyLG1vdXNlX3Njcm9sbD1fYWEuc2Nyb2xsSGFuZGxlcixtb3VzZV9kcmFnPWJhYixtb3VzZV9tb3ZlPV9fYn1sb2NhbCBiYmI9YWJiW2RhYl0KaWYoYmJifj1uaWwpdGhlbiBiYmIoX2FhLC4uLilkY2EoZGFiLC4uLilfZGEoKXJldHVybiBlbmQgZW5kCmlmKGRhYj09Im1vbml0b3JfdG91Y2giKXRoZW4gaWYoYV9hW19iYlsxXV1+PW5pbCl0aGVuCmFfYVtfYmJbMV1dOm1vdXNlSGFuZGxlcigxLF9iYlsyXSxfYmJbM10sdHJ1ZSlhYWE9YV9hW19iYlsxXV1lbmQKaWYKKGNjKGJfYSk+MCl0aGVuIGZvciBhYmIsYmJiIGluIHBhaXJzKGJfYSlkbwpiYmJbMV06bW91c2VIYW5kbGVyKDEsX2JiWzJdLF9iYlszXSx0cnVlLF9iYlsxXSllbmQgZW5kO2RjYShkYWIsLi4uKV9kYSgpcmV0dXJuIGVuZAppZihhYWF+PW5pbCl0aGVuCmxvY2FsIGFiYj17Y2hhcj1hYWEuY2hhckhhbmRsZXIsa2V5PWFhYS5rZXlIYW5kbGVyLGtleV91cD1hYWEua2V5VXBIYW5kbGVyfWxvY2FsIGJiYj1hYmJbZGFiXWlmKGJiYn49bmlsKXRoZW4gaWYoZGFiPT0ia2V5Iil0aGVuIGRkW19iYlsxXV09dHJ1ZSBlbHNlaWYoZGFiPT0ia2V5X3VwIil0aGVuCmRkW19iYlsxXV09ZmFsc2UgZW5kO2JiYihhYWEsLi4uKWRjYShkYWIsLi4uKQpfZGEoKXJldHVybiBlbmQgZW5kCmlmKGRhYj09InRpbWVyIilhbmQoX2JiWzFdPT1kZGEpdGhlbiBhX2IoKWVsc2VpZgooZGFiPT0idGltZXIiKWFuZChfYmJbMV09PV9hYil0aGVuIGFhYigpZWxzZQpmb3IgYWJiLGJiYiBpbiBwYWlycyhfX2EpZG8gYmJiOmV2ZW50SGFuZGxlcihkYWIsLi4uKWVuZCBlbmQ7ZGNhKGRhYiwuLi4pX2RhKCllbmQKZGFhPXtsb2dnaW5nPWZhbHNlLGR5bmFtaWNWYWx1ZUV2ZW50cz1mYWxzZSxzZXRUaGVtZT1hY2EsZ2V0VGhlbWU9YmNhLGRyYXdGcmFtZXM9X2RhLGdldFZlcnNpb249ZnVuY3Rpb24oKXJldHVybiBiZCBlbmQsc2V0VmFyaWFibGU9ZGJhLGdldFZhcmlhYmxlPV9jYSxzZXRCYXNlVGVybT1mdW5jdGlvbihkYWIpYWQ9ZGFiIGVuZCxsb2c9ZnVuY3Rpb24oLi4uKV9jKC4uLillbmQsc2V0TW91c2VNb3ZlVGhyb3R0bGU9ZnVuY3Rpb24oZGFiKQppZgooX0hPU1Q6ZmluZCgiQ3JhZnRPUyUtUEMiKSl0aGVuIGlmKGNvbmZpZy5nZXQoIm1vdXNlX21vdmVfdGhyb3R0bGUiKX49MTApdGhlbgpjb25maWcuc2V0KCJtb3VzZV9tb3ZlX3Rocm90dGxlIiwxMCllbmQKaWYoZGFiPDEwMCl0aGVuIGRjPTEwMCBlbHNlIGRjPWRhYiBlbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2V0TW91c2VEcmFnVGhyb3R0bGU9ZnVuY3Rpb24oZGFiKWlmKApkYWI8PTApdGhlbiBfZD0wIGVsc2UgX2FiPW5pbDtfZD1kYWIgZW5kIGVuZCxhdXRvVXBkYXRlPWZ1bmN0aW9uKGRhYikKY2FhPWRhYjtpZihkYWI9PW5pbCl0aGVuIGNhYT10cnVlIGVuZDtsb2NhbCBmdW5jdGlvbiBfYmIoKV9kYSgpd2hpbGUgY2FhIGRvCmNhYihvcy5wdWxsRXZlbnRSYXcoKSllbmQgZW5kCmxvY2FsIGFiYixiYmI9eHBjYWxsKF9iYixkZWJ1Zy50cmFjZWJhY2spaWYgbm90KGFiYil0aGVuIGJiYShiYmIpcmV0dXJuIGVuZCBlbmQsdXBkYXRlPWZ1bmN0aW9uKGRhYiwuLi4paWYoCmRhYn49bmlsKXRoZW4gbG9jYWwgX2JiLGFiYj14cGNhbGwoY2FiLGRlYnVnLnRyYWNlYmFjayxkYWIsLi4uKWlmIG5vdChfYmIpdGhlbgpiYmEoYWJiKXJldHVybiBlbmQgZW5kIGVuZCxzdG9wPWFiYSxzdG9wVXBkYXRlPWFiYSxpc0tleURvd249ZnVuY3Rpb24oZGFiKWlmKApkZFtkYWJdPT1uaWwpdGhlbiByZXR1cm4gZmFsc2UgZW5kO3JldHVybiBkZFtkYWJdZW5kLGdldEZyYW1lPWZ1bmN0aW9uKGRhYilmb3IgX2JiLGFiYiBpbgpwYWlycyhfX2EpZG8gaWYoYWJiLm5hbWU9PWRhYil0aGVuIHJldHVybiBhYmIgZW5kIGVuZCBlbmQsZ2V0QWN0aXZlRnJhbWU9ZnVuY3Rpb24oKXJldHVybgphYWEgZW5kLHNldEFjdGl2ZUZyYW1lPWZ1bmN0aW9uKGRhYikKaWYoZGFiOmdldFR5cGUoKT09IkZyYW1lIil0aGVuIGFhYT1kYWI7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsb25FdmVudD1mdW5jdGlvbiguLi4pCmZvciBkYWIsX2JiIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKF9iYik9PSJmdW5jdGlvbiIpdGhlbgphYjpyZWdpc3RlckV2ZW50KCJiYXNhbHRFdmVudEN5Y2xlIixfYmIpZW5kIGVuZCBlbmQsc2NoZWR1bGU9Y2JhLGNyZWF0ZUZyYW1lPWZ1bmN0aW9uKGRhYikKZGFiPWRhYiBvciBhYygpCmZvciBhYmIsYmJiIGluIHBhaXJzKF9fYSlkbyBpZihiYmIubmFtZT09ZGFiKXRoZW4gcmV0dXJuIG5pbCBlbmQgZW5kO2xvY2FsIF9iYj1iYihkYWIsbmlsLG5pbCxjY2EpX2JiOmluaXQoKQp0YWJsZS5pbnNlcnQoX19hLF9iYilpZgooX2FhPT1uaWwpYW5kKF9iYjpnZXROYW1lKCl+PSJiYXNhbHREZWJ1Z2dpbmdGcmFtZSIpdGhlbiBfYmI6c2hvdygpZW5kO3JldHVybiBfYmIgZW5kLHJlbW92ZUZyYW1lPWZ1bmN0aW9uKGRhYilfX2FbZGFiXT0KbmlsIGVuZCxzZXRQcm9qZWN0RGlyPWZ1bmN0aW9uKGRhYiljZD1kYWIgZW5kLGZvcmNlUmVuZGVyVXBkYXRlPWZ1bmN0aW9uKClfZGEoKWVuZCxkZWJ1Zz1mdW5jdGlvbiguLi4pbG9jYWwgZGFiPXsuLi59aWYKKF9hYT09bmlsKXRoZW4gcHJpbnQoLi4uKXJldHVybiBlbmQ7aWYoX2FhLm5hbWV+PSJiYXNhbHREZWJ1Z2dpbmdGcmFtZSIpdGhlbgppZihfYWF+PQpkYWEuZGVidWdGcmFtZSl0aGVuIGRhYS5kZWJ1Z0xhYmVsOnNldFBhcmVudChfYWEpZW5kIGVuZDtsb2NhbCBfYmI9IiJmb3IgYWJiLGJiYiBpbiBwYWlycyhkYWIpZG8KX2JiPV9iYi4uCnRvc3RyaW5nKGJiYikuLiAoI2RhYn49YWJiIGFuZCIsICJvciIiKWVuZApkYWEuZGVidWdMYWJlbDpzZXRUZXh0KCJbRGVidWddICIuLl9iYilmb3IgYWJiLGJiYiBpbiBwYWlycyhiYyhfYmIsZGFhLmRlYnVnTGlzdDpnZXRXaWR0aCgpKSlkbwpkYWEuZGVidWdMaXN0OmFkZEl0ZW0oYmJiKWVuZAppZigKZGFhLmRlYnVnTGlzdDpnZXRJdGVtQ291bnQoKT41MCl0aGVuIGRhYS5kZWJ1Z0xpc3Q6cmVtb3ZlSXRlbSgxKWVuZApkYWEuZGVidWdMaXN0OnNldFZhbHVlKGRhYS5kZWJ1Z0xpc3Q6Z2V0SXRlbShkYWEuZGVidWdMaXN0OmdldEl0ZW1Db3VudCgpKSlpZgooZGFhLmRlYnVnTGlzdC5nZXRJdGVtQ291bnQoKT5kYWEuZGVidWdMaXN0OmdldEhlaWdodCgpKXRoZW4KZGFhLmRlYnVnTGlzdDpzZXRPZmZzZXQoZGFhLmRlYnVnTGlzdDpnZXRJdGVtQ291bnQoKS0KZGFhLmRlYnVnTGlzdDpnZXRIZWlnaHQoKSllbmQKZGFhLmRlYnVnTGFiZWw6c2hvdygpZW5kfQpkYWEuZGVidWdGcmFtZT1kYWEuY3JlYXRlRnJhbWUoImJhc2FsdERlYnVnZ2luZ0ZyYW1lIik6c2hvd0JhcigpOnNldEJhY2tncm91bmQoY29sb3JzLmxpZ2h0R3JheSk6c2V0QmFyKCJEZWJ1ZyIsY29sb3JzLmJsYWNrLGNvbG9ycy5ncmF5KQpkYWEuZGVidWdGcmFtZTphZGRCdXR0b24oImJhY2siKTpzZXRBbmNob3IoInRvcFJpZ2h0Iik6c2V0U2l6ZSgxLDEpOnNldFRleHQoIlwyMiIpOm9uQ2xpY2soZnVuY3Rpb24oKWlmKApkYWEub2xkRnJhbWV+PW5pbCl0aGVuIGRhYS5vbGRGcmFtZTpzaG93KCllbmQgZW5kKTpzZXRCYWNrZ3JvdW5kKGNvbG9ycy5yZWQpOnNob3coKQpkYWEuZGVidWdMaXN0PWRhYS5kZWJ1Z0ZyYW1lOmFkZExpc3QoImRlYnVnTGlzdCIpOnNldFNpemUoInBhcmVudC53IC0gMiIsInBhcmVudC5oIC0gMyIpOnNldFBvc2l0aW9uKDIsMyk6c2V0U2Nyb2xsYWJsZSh0cnVlKTpzaG93KCkKZGFhLmRlYnVnTGFiZWw9ZGFhLmRlYnVnRnJhbWU6YWRkTGFiZWwoImRlYnVnTGFiZWwiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKZGFhLm9sZEZyYW1lPV9hYTtkYWEuZGVidWdGcmFtZTpzaG93KCllbmQpOnNldEJhY2tncm91bmQoY29sb3JzLmJsYWNrKTpzZXRGb3JlZ3JvdW5kKGNvbG9ycy53aGl0ZSk6c2V0QW5jaG9yKCJib3R0b21MZWZ0Iik6aWdub3JlT2Zmc2V0KCk6c2V0WkluZGV4KDIwKTpzaG93KClyZXR1cm4gZGFhIGVuZAphYVsiT2JqZWN0Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJiYXNhbHRFdmVudCIpbG9jYWwgYmI9ZGEoInV0aWxzIikKbG9jYWwgY2I9ZGEoIm1vZHVsZSIpbG9jYWwgZGI9Y2IoImltYWdlcyIpbG9jYWwgX2M9YmIuc3BsaXRTdHJpbmc7bG9jYWwgYWM9YmIubnVtYmVyRnJvbVN0cmluZwpsb2NhbCBiYz1iYi5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgY2MsZGM9dGFibGUudW5wYWNrLHN0cmluZy5zdWIKcmV0dXJuCmZ1bmN0aW9uKF9kKWxvY2FsIGFkPSJPYmplY3QibG9jYWwgYmQ9e31sb2NhbCBjZD0xO2xvY2FsIGRkCmxvY2FsIF9fYT0idG9wTGVmdCJsb2NhbCBhX2E9ZmFsc2U7bG9jYWwgYl9hPXRydWU7bG9jYWwgY19hPWZhbHNlO2xvY2FsIGRfYT1mYWxzZTtsb2NhbCBfYWE9ZmFsc2U7bG9jYWwgYWFhPWZhbHNlCmxvY2FsIGJhYT17bGVmdD1mYWxzZSxyaWdodD1mYWxzZSx0b3A9ZmFsc2UsYm90dG9tPWZhbHNlfWxvY2FsIGNhYT1jb2xvcnMuYmxhY2s7bG9jYWwgZGFhPXRydWU7bG9jYWwgX2JhPWZhbHNlO2xvY2FsIGFiYSxiYmEsY2JhLGRiYT0wLDAsMCwwO2xvY2FsIF9jYTtsb2NhbCBhY2E7bG9jYWwgYmNhPTE7bG9jYWwgY2NhCmxvY2FsIGRjYTtsb2NhbCBfZGE9dHJ1ZTtsb2NhbCBhZGE9dHJ1ZTtsb2NhbCBiZGE9e31sb2NhbCBjZGE9YWIoKQpiZD17eD0xLHk9MSx3aWR0aD0xLGhlaWdodD0xLGJnQ29sb3I9Y29sb3JzLmJsYWNrLGJnU3ltYm9sPSIgIixiZ1N5bWJvbENvbG9yPWNvbG9ycy5ibGFjayxmZ0NvbG9yPWNvbG9ycy53aGl0ZSx0cmFuc3BhcmVudENvbG9yPWZhbHNlLG5hbWU9X2Qgb3IiT2JqZWN0IixwYXJlbnQ9Cm5pbCxzaG93PWZ1bmN0aW9uKGRkYSliX2E9dHJ1ZTtkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaGlkZT1mdW5jdGlvbihkZGEpYl9hPWZhbHNlCmRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxlbmFibGU9ZnVuY3Rpb24oZGRhKWRhYT10cnVlO3JldHVybiBkZGEgZW5kLGRpc2FibGU9ZnVuY3Rpb24oZGRhKWRhYT1mYWxzZQpyZXR1cm4gZGRhIGVuZCxpc0VuYWJsZWQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkYWEgZW5kLGdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYikKbG9jYWwgYl9iPWZ1bmN0aW9uKGNfYikKaWYoY19iOnN1YigxLDEpPT0iIyIpdGhlbgpsb2NhbCBkX2I9ZGRhOmdldEJhc2VGcmFtZSgpOmdldERlZXBPYmplY3QoY19iOnN1YigyLGNfYjpsZW4oKSkpCmlmKGRfYn49bmlsKWFuZChkX2IuaW50ZXJuYWxPYmpldENhbGx+PW5pbCl0aGVuIF9fYihkZGEsZnVuY3Rpb24oKQpkX2I6aW50ZXJuYWxPYmpldENhbGwoKWVuZCllbmQgZWxzZQpfX2IoZGRhLGRkYTpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShjX2IpKWVuZCBlbmQ7aWYodHlwZShhX2IpPT0ic3RyaW5nIil0aGVuIGJfYihhX2IpZWxzZWlmKHR5cGUoYV9iKT09InRhYmxlIil0aGVuCmZvciBjX2IsZF9iIGluIHBhaXJzKGFfYilkbyBiX2IoZF9iKWVuZCBlbmQ7cmV0dXJuIGRkYSBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRkYSxfX2IpCmxvY2FsIGFfYj1kZGE6Z2V0QmFzZUZyYW1lKClsb2NhbCBiX2IsY19iLGRfYgppZihiYygidGV4dHVyZSIsX19iKX49bmlsKXRoZW4gYl9iPWJjKCJ0ZXh0dXJlIixfX2IpZW5kO2lmKGJjKCJtb2RlIixfX2Ipfj1uaWwpdGhlbiBjX2I9YmMoIm1vZGUiLF9fYillbmQKaWYoCmJjKCJ0ZXh0dXJlUGxheSIsX19iKX49bmlsKXRoZW4gZF9iPWJjKCJ0ZXh0dXJlUGxheSIsX19iKWVuZDtsb2NhbCBfYWIsYWFiO2lmKGJjKCJ4IixfX2Ipfj1uaWwpdGhlbiBfYWI9YmMoIngiLF9fYillbmQ7aWYoCmJjKCJ5IixfX2Ipfj1uaWwpdGhlbiBhYWI9YmMoInkiLF9fYillbmQ7aWYKKF9hYn49bmlsKW9yKGFhYn49bmlsKXRoZW4gZGRhOnNldFBvc2l0aW9uKF9hYixhYWIpZW5kO2xvY2FsIGJhYixjYWI7aWYoCmJjKCJ3aWR0aCIsX19iKX49bmlsKXRoZW4gYmFiPWJjKCJ3aWR0aCIsX19iKWVuZDtpZigKYmMoImhlaWdodCIsX19iKX49bmlsKXRoZW4gY2FiPWJjKCJoZWlnaHQiLF9fYillbmQ7aWYoYmFifj1uaWwpb3IoCmNhYn49bmlsKXRoZW4gZGRhOnNldFNpemUoYmFiLGNhYillbmQ7aWYoCmJjKCJiZyIsX19iKX49bmlsKXRoZW4KZGRhOnNldEJhY2tncm91bmQoY29sb3JzW2JjKCJiZyIsX19iKV0pZW5kO2lmKGJjKCJiZ1N5bWJvbCIsX19iKX49bmlsKXRoZW4KZGRhOnNldEJhY2tncm91bmQoZGRhLmJnQ29sb3IsYmMoImJnU3ltYm9sIixfX2IpKWVuZDtpZgooYmMoImJnU3ltYm9sQ29sb3IiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRCYWNrZ3JvdW5kKGRkYS5iZ0NvbG9yLGRkYS5iZ1N5bWJvbCxjb2xvcnNbYmMoImJnU3ltYm9sQ29sb3IiLF9fYildKWVuZAppZgooYmMoImZnIixfX2Ipfj1uaWwpdGhlbiBkZGE6c2V0Rm9yZWdyb3VuZChjb2xvcnNbYmMoImZnIixfX2IpXSllbmQ7aWYoYmMoInZhbHVlIixfX2Ipfj1uaWwpdGhlbgpkZGE6c2V0VmFsdWUoY29sb3JzW2JjKCJ2YWx1ZSIsX19iKV0pZW5kCmlmKGJjKCJ2aXNpYmxlIixfX2Ipfj1uaWwpdGhlbiBpZgooYmMoInZpc2libGUiLF9fYikpdGhlbiBkZGE6c2hvdygpZWxzZSBkZGE6aGlkZSgpZW5kIGVuZAppZihiYygiZW5hYmxlZCIsX19iKX49bmlsKXRoZW4gaWYoYmMoImVuYWJsZWQiLF9fYikpdGhlbiBkZGE6ZW5hYmxlKCllbHNlCmRkYTpkaXNhYmxlKCllbmQgZW5kO2lmKGJjKCJ6SW5kZXgiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRaSW5kZXgoYmMoInpJbmRleCIsX19iKSllbmQ7aWYoYmMoImFuY2hvciIsX19iKX49bmlsKXRoZW4KZGRhOnNldEFuY2hvcihiYygiYW5jaG9yIixfX2IpKWVuZDtpZihiYygic2hhZG93Q29sb3IiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRTaGFkb3coY29sb3JzW2JjKCJzaGFkb3dDb2xvciIsX19iKV0pZW5kO2lmKGJjKCJib3JkZXIiLF9fYil+PW5pbCl0aGVuCmRkYTpzZXRCb3JkZXIoY29sb3JzW2JjKCJib3JkZXIiLF9fYildKWVuZDtpZihiYygiYm9yZGVyTGVmdCIsX19iKX49bmlsKXRoZW4KYmFhWyJsZWZ0Il09Y29sb3JzW2JjKCJib3JkZXJMZWZ0IixfX2IpXWVuZDtpZihiYygiYm9yZGVyVG9wIixfX2Ipfj1uaWwpdGhlbgpiYWFbInRvcCJdPWNvbG9yc1tiYygiYm9yZGVyVG9wIixfX2IpXWVuZDtpZihiYygiYm9yZGVyUmlnaHQiLF9fYil+PW5pbCl0aGVuCmJhYVsicmlnaHQiXT1jb2xvcnNbYmMoImJvcmRlclJpZ2h0IixfX2IpXWVuZAppZgooYmMoImJvcmRlckJvdHRvbSIsX19iKX49bmlsKXRoZW4gYmFhWyJib3R0b20iXT1jb2xvcnNbYmMoImJvcmRlckJvdHRvbSIsX19iKV1lbmQ7aWYoYmMoImJvcmRlckNvbG9yIixfX2Ipfj1uaWwpdGhlbgpkZGE6c2V0Qm9yZGVyKGNvbG9yc1tiYygiYm9yZGVyQ29sb3IiLF9fYildKWVuZDtpZgooYmMoImlnbm9yZU9mZnNldCIsX19iKX49bmlsKXRoZW4KaWYoYmMoImlnbm9yZU9mZnNldCIsX19iKSl0aGVuIGRkYTppZ25vcmVPZmZzZXQodHJ1ZSllbmQgZW5kO2lmCihiYygib25DbGljayIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25DbGljayxiYygib25DbGljayIsX19iKSllbmQ7aWYKKGJjKCJvbkNsaWNrVXAiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uQ2xpY2tVcCxiYygib25DbGlja1VwIixfX2IpKWVuZDtpZgooYmMoIm9uU2Nyb2xsIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vblNjcm9sbCxiYygib25TY3JvbGwiLF9fYikpZW5kO2lmCihiYygib25EcmFnIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbkRyYWcsYmMoIm9uRHJhZyIsX19iKSllbmQ7aWYoYmMoIm9uSG92ZXIiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uSG92ZXIsYmMoIm9uSG92ZXIiLF9fYikpZW5kO2lmCihiYygib25MZWF2ZSIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25MZWF2ZSxiYygib25MZWF2ZSIsX19iKSllbmQ7aWYoYmMoIm9uS2V5IixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbktleSxiYygib25LZXkiLF9fYikpZW5kO2lmKGJjKCJvbktleVVwIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbktleVVwLGJjKCJvbktleVVwIixfX2IpKWVuZDtpZgooYmMoIm9uQ2hhbmdlIixfX2Ipfj1uaWwpdGhlbgpkZGE6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGRkYS5vbkNoYW5nZSxiYygib25DaGFuZ2UiLF9fYikpZW5kO2lmCihiYygib25SZXNpemUiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uUmVzaXplLGJjKCJvblJlc2l6ZSIsX19iKSllbmQ7aWYKKGJjKCJvblJlcG9zaXRpb24iLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uUmVwb3NpdGlvbixiYygib25SZXBvc2l0aW9uIixfX2IpKWVuZDtpZgooYmMoIm9uRXZlbnQiLF9fYil+PW5pbCl0aGVuCmRkYTpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oZGRhLm9uRXZlbnQsYmMoIm9uRXZlbnQiLF9fYikpZW5kO2lmCihiYygib25HZXRGb2N1cyIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25HZXRGb2N1cyxiYygib25HZXRGb2N1cyIsX19iKSllbmQ7aWYKKGJjKCJvbkxvc2VGb2N1cyIsX19iKX49bmlsKXRoZW4KZGRhOmdlbmVyYXRlWE1MRXZlbnRGdW5jdGlvbihkZGEub25Mb3NlRm9jdXMsYmMoIm9uTG9zZUZvY3VzIixfX2IpKWVuZDtpZihiX2J+PW5pbCl0aGVuCmRkYTpzZXRUZXh0dXJlKGJfYixjX2IsZF9iKWVuZDtkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaXNWaXNpYmxlPWZ1bmN0aW9uKGRkYSlyZXR1cm4KYl9hIGVuZCxzZXRGb2N1cz1mdW5jdGlvbihkZGEpaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDpzZXRGb2N1c2VkT2JqZWN0KGRkYSllbmQ7cmV0dXJuIGRkYSBlbmQsc2V0WkluZGV4PWZ1bmN0aW9uKGRkYSxfX2IpCmNkPV9fYgppZihkZGEucGFyZW50fj1uaWwpdGhlbiBkZGEucGFyZW50OnJlbW92ZU9iamVjdChkZGEpCmRkYS5wYXJlbnQ6YWRkT2JqZWN0KGRkYSlkZGE6dXBkYXRlRXZlbnRIYW5kbGVycygpZW5kO3JldHVybiBkZGEgZW5kLHVwZGF0ZUV2ZW50SGFuZGxlcnM9ZnVuY3Rpb24oZGRhKQpmb3IgX19iLGFfYiBpbgpwYWlycyhiZGEpZG8gaWYoYV9iKXRoZW4gZGRhLnBhcmVudDphZGRFdmVudChfX2IsZGRhKWVuZCBlbmQgZW5kLGdldFpJbmRleD1mdW5jdGlvbihkZGEpcmV0dXJuIGNkIGVuZCxnZXRUeXBlPWZ1bmN0aW9uKGRkYSlyZXR1cm4gYWQgZW5kLGdldE5hbWU9ZnVuY3Rpb24oZGRhKXJldHVybgpkZGEubmFtZSBlbmQscmVtb3ZlPWZ1bmN0aW9uKGRkYSlpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OnJlbW92ZU9iamVjdChkZGEpZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRQYXJlbnQ9ZnVuY3Rpb24oZGRhLF9fYikKaWYoCl9fYi5nZXRUeXBlfj1uaWwgYW5kIF9fYjpnZXRUeXBlKCk9PSJGcmFtZSIpdGhlbgpkZGE6cmVtb3ZlKClfX2I6YWRkT2JqZWN0KGRkYSlpZihkZGEuZHJhdyl0aGVuIGRkYTpzaG93KCllbmQgZW5kO3JldHVybiBkZGEgZW5kLHNldFZhbHVlPWZ1bmN0aW9uKGRkYSxfX2IsYV9iKWlmKApkZH49X19iKXRoZW4gZGQ9X19iO2RkYTp1cGRhdGVEcmF3KClpZihhX2J+PWZhbHNlKXRoZW4KZGRhOnZhbHVlQ2hhbmdlZEhhbmRsZXIoKWVuZCBlbmQKcmV0dXJuIGRkYSBlbmQsZ2V0VmFsdWU9ZnVuY3Rpb24oZGRhKXJldHVybiBkZCBlbmQsZ2V0RHJhdz1mdW5jdGlvbihkZGEpcmV0dXJuCmFkYSBlbmQsdXBkYXRlRHJhdz1mdW5jdGlvbihkZGEsX19iKWFkYT1fX2I7aWYoX19iPT1uaWwpdGhlbiBhZGE9dHJ1ZSBlbmQ7aWYoYWRhKXRoZW4gaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDp1cGRhdGVEcmF3KCllbmQgZW5kO3JldHVybiBkZGEgZW5kLGdldEV2ZW50U3lzdGVtPWZ1bmN0aW9uKGRkYSlyZXR1cm4KY2RhIGVuZCxnZXRQYXJlbnQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkZGEucGFyZW50IGVuZCxzZXRQb3NpdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmKHR5cGUoX19iKT09Im51bWJlciIpdGhlbiBkZGEueD0KYl9iIGFuZCBkZGE6Z2V0WCgpK19fYiBvciBfX2IgZW5kO2lmKHR5cGUoYV9iKT09Im51bWJlciIpdGhlbgpkZGEueT1iX2IgYW5kIGRkYTpnZXRZKCkrYV9iIG9yIGFfYiBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gaWYodHlwZShfX2IpPT0ic3RyaW5nIil0aGVuCmRkYS54PWRkYS5wYXJlbnQ6bmV3RHluYW1pY1ZhbHVlKGRkYSxfX2IpZW5kO2lmKHR5cGUoYV9iKT09InN0cmluZyIpdGhlbgpkZGEueT1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsYV9iKWVuZApkZGEucGFyZW50OnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpZW5kO2RkYTpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXBvc2l0aW9uIikKZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldFg9ZnVuY3Rpb24oZGRhKXJldHVybgoKdHlwZShkZGEueCk9PSJudW1iZXIiYW5kIGRkYS54IG9yIG1hdGguZmxvb3IoZGRhLnhbMV0rMC41KWVuZCxnZXRZPWZ1bmN0aW9uKGRkYSlyZXR1cm4KCnR5cGUoZGRhLnkpPT0ibnVtYmVyImFuZCBkZGEueSBvciBtYXRoLmZsb29yKGRkYS55WzFdKzAuNSllbmQsZ2V0UG9zaXRpb249ZnVuY3Rpb24oZGRhKXJldHVybgpkZGE6Z2V0WCgpLGRkYTpnZXRZKCllbmQsZ2V0VmlzaWJpbGl0eT1mdW5jdGlvbihkZGEpcmV0dXJuIGJfYSBlbmQsc2V0VmlzaWJpbGl0eT1mdW5jdGlvbihkZGEsX19iKQpiX2E9X19iIG9yIG5vdCBiX2E7ZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLHNldFNpemU9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKWlmKHR5cGUoX19iKT09CiJudW1iZXIiKXRoZW4KZGRhLndpZHRoPWJfYiBhbmQgZGRhOmdldFdpZHRoKCkrX19iIG9yIF9fYiBlbmQKaWYodHlwZShhX2IpPT0ibnVtYmVyIil0aGVuIGRkYS5oZWlnaHQ9Yl9iIGFuZApkZGE6Z2V0SGVpZ2h0KCkrYV9iIG9yIGFfYiBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gaWYodHlwZShfX2IpPT0ic3RyaW5nIil0aGVuCmRkYS53aWR0aD1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsX19iKWVuZDtpZih0eXBlKGFfYik9PSJzdHJpbmciKXRoZW4KZGRhLmhlaWdodD1kZGEucGFyZW50Om5ld0R5bmFtaWNWYWx1ZShkZGEsYV9iKWVuZApkZGEucGFyZW50OnJlY2FsY3VsYXRlRHluYW1pY1ZhbHVlcygpZW5kO2lmKF9jYX49bmlsKWFuZChkY2E9PSJzdHJldGNoIil0aGVuCmFjYT1kYi5yZXNpemVCSU1HKF9jYSxkZGE6Z2V0U2l6ZSgpKVtiY2FdZW5kCmRkYTpjdXN0b21FdmVudEhhbmRsZXIoImJhc2FsdF9yZXNpemUiKWRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxnZXRIZWlnaHQ9ZnVuY3Rpb24oZGRhKQpyZXR1cm4KdHlwZShkZGEuaGVpZ2h0KT09Im51bWJlciJhbmQgZGRhLmhlaWdodCBvcgptYXRoLmZsb29yKGRkYS5oZWlnaHRbMV0rMC41KWVuZCxnZXRXaWR0aD1mdW5jdGlvbihkZGEpcmV0dXJuCgp0eXBlKGRkYS53aWR0aCk9PSJudW1iZXIiYW5kIGRkYS53aWR0aCBvciBtYXRoLmZsb29yKGRkYS53aWR0aFsxXSswLjUpZW5kLGdldFNpemU9ZnVuY3Rpb24oZGRhKXJldHVybgpkZGE6Z2V0V2lkdGgoKSxkZGE6Z2V0SGVpZ2h0KCllbmQsY2FsY3VsYXRlRHluYW1pY1ZhbHVlcz1mdW5jdGlvbihkZGEpCmlmKAp0eXBlKGRkYS53aWR0aCk9PSJ0YWJsZSIpdGhlbiBkZGEud2lkdGg6Y2FsY3VsYXRlKCllbmQKaWYodHlwZShkZGEuaGVpZ2h0KT09InRhYmxlIil0aGVuIGRkYS5oZWlnaHQ6Y2FsY3VsYXRlKCllbmQKaWYodHlwZShkZGEueCk9PSJ0YWJsZSIpdGhlbiBkZGEueDpjYWxjdWxhdGUoKWVuZAppZih0eXBlKGRkYS55KT09InRhYmxlIil0aGVuIGRkYS55OmNhbGN1bGF0ZSgpZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRCYWNrZ3JvdW5kPWZ1bmN0aW9uKGRkYSxfX2IsYV9iLGJfYilkZGEuYmdDb2xvcj0KX19iIG9yIGZhbHNlCmRkYS5iZ1N5bWJvbD1hX2Igb3IoZGRhLmJnQ29sb3J+PWZhbHNlIGFuZCBkZGEuYmdTeW1ib2wgb3IKZmFsc2UpZGRhLmJnU3ltYm9sQ29sb3I9Yl9iIG9yIGRkYS5iZ1N5bWJvbENvbG9yCmRkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxzZXRUZXh0dXJlPWZ1bmN0aW9uKGRkYSxfX2IsYV9iLGJfYilpZigKdHlwZShfX2IpPT0ic3RyaW5nIil0aGVuIF9jYT1kYi5sb2FkSW1hZ2VBc0JpbWcoX19iKWVsc2VpZih0eXBlKF9fYik9PSJ0YWJsZSIpdGhlbgpfY2E9X19iIGVuZAppZihfY2EuYW5pbWF0ZWQpdGhlbiBsb2NhbCBjX2I9X2NhW2JjYV0uZHVyYXRpb24gb3IKX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWRkYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixkZGEpCmJkYVsib3RoZXJfZXZlbnQiXT10cnVlIGVuZDtfZGE9Yl9iPT1mYWxzZSBhbmQgZmFsc2Ugb3IgdHJ1ZTtiY2E9MQpkY2E9YV9iIG9yIm5vcm1hbCJpZihkY2E9PSJzdHJldGNoIil0aGVuCmFjYT1kYi5yZXNpemVCSU1HKF9jYSxkZGE6Z2V0U2l6ZSgpKVsxXWVsc2UgYWNhPV9jYVsxXWVuZApkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsc2V0VHJhbnNwYXJlbnQ9ZnVuY3Rpb24oZGRhLF9fYilkZGEudHJhbnNwYXJlbnRDb2xvcj0KX19iIG9yIGZhbHNlO2lmKF9fYn49ZmFsc2UpdGhlbiBkZGEuYmdTeW1ib2w9ZmFsc2UKZGRhLmJnU3ltYm9sQ29sb3I9ZmFsc2UgZW5kO2RkYTp1cGRhdGVEcmF3KClyZXR1cm4gZGRhIGVuZCxnZXRCYWNrZ3JvdW5kPWZ1bmN0aW9uKGRkYSlyZXR1cm4KZGRhLmJnQ29sb3IgZW5kLHNldEZvcmVncm91bmQ9ZnVuY3Rpb24oZGRhLF9fYilkZGEuZmdDb2xvcj1fX2Igb3IgZmFsc2UKZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldEZvcmVncm91bmQ9ZnVuY3Rpb24oZGRhKXJldHVybiBkZGEuZmdDb2xvciBlbmQsc2V0U2hhZG93PWZ1bmN0aW9uKGRkYSxfX2IpaWYoCl9fYj09ZmFsc2UpdGhlbiBhYWE9ZmFsc2UgZWxzZSBjYWE9X19iO2FhYT10cnVlIGVuZApkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsaXNTaGFkb3dBY3RpdmU9ZnVuY3Rpb24oZGRhKXJldHVybiBhYWEgZW5kLHNldEJvcmRlcj1mdW5jdGlvbihkZGEsLi4uKQppZigKLi4ufj1uaWwpdGhlbiBsb2NhbCBfX2I9ey4uLn0KZm9yIGFfYixiX2IgaW4gcGFpcnMoX19iKWRvIGlmKGJfYj09ImxlZnQiKW9yKCNfX2I9PTEpdGhlbgpiYWFbImxlZnQiXT1fX2JbMV1lbmQ7aWYoYl9iPT0idG9wIilvcigjX19iPT0xKXRoZW4KYmFhWyJ0b3AiXT1fX2JbMV1lbmQ7aWYoYl9iPT0icmlnaHQiKW9yKCNfX2I9PTEpdGhlbgpiYWFbInJpZ2h0Il09X19iWzFdZW5kO2lmKGJfYj09ImJvdHRvbSIpb3IoI19fYj09MSl0aGVuCmJhYVsiYm90dG9tIl09X19iWzFdZW5kIGVuZCBlbmQ7ZGRhOnVwZGF0ZURyYXcoKXJldHVybiBkZGEgZW5kLGdldEJvcmRlcj1mdW5jdGlvbihkZGEsX19iKWlmKApfX2I9PSJsZWZ0Iil0aGVuIHJldHVybiBib3JkZXJMZWZ0IGVuZAppZihfX2I9PSJ0b3AiKXRoZW4gcmV0dXJuIGJvcmRlclRvcCBlbmQ7aWYoX19iPT0icmlnaHQiKXRoZW4gcmV0dXJuIGJvcmRlclJpZ2h0IGVuZDtpZihfX2I9PSJib3R0b20iKXRoZW4KcmV0dXJuIGJvcmRlckJvdHRvbSBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oZGRhKQppZgooYl9hKXRoZW4KaWYoZGRhLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgX19iLGFfYj1kZGE6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBiX2IsY19iPWRkYTpnZXRTaXplKClsb2NhbCBkX2IsX2FiPWRkYS5wYXJlbnQ6Z2V0U2l6ZSgpCmlmKF9fYitiX2I8MSlvcihfX2I+ZF9iKW9yKGFfYisKY19iPDEpb3IoYV9iPl9hYil0aGVuIHJldHVybiBmYWxzZSBlbmQ7aWYoZGRhLnRyYW5zcGFyZW50Q29sb3J+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iLGJfYixjX2IsZGRhLnRyYW5zcGFyZW50Q29sb3IpZW5kO2lmKGRkYS5iZ0NvbG9yfj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYixiX2IsY19iLGRkYS5iZ0NvbG9yKWVuZAppZihkZGEuYmdTeW1ib2x+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iLGJfYixjX2IsZGRhLmJnU3ltYm9sKWlmKGRkYS5iZ1N5bWJvbH49IiAiKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iLGJfYixjX2IsZGRhLmJnU3ltYm9sQ29sb3IpZW5kIGVuZAppZihhY2F+PW5pbCl0aGVuCmlmKGRjYT09ImNlbnRlciIpdGhlbiBsb2NhbCBiYWIsY2FiPSNhY2FbMV1bMV0sI2FjYQpsb2NhbCBkYWI9YmFiPGJfYiBhbmQgbWF0aC5mbG9vcigoYl9iLWJhYikvCjIpb3IgMApsb2NhbCBfYmI9Y2FiPGNfYiBhbmQgbWF0aC5mbG9vcigoY19iLWNhYikvMilvciAwCmxvY2FsIGFiYj1iYWI8Yl9iIGFuZCAxIG9yIG1hdGguZmxvb3IoKGJhYi1iX2IpLzIpCmxvY2FsIGJiYj1iYWI8Yl9iIGFuZCBiX2Igb3IKYl9iLW1hdGguZmxvb3IoKGJfYi1iYWIpLzIgKzAuNSktMQpsb2NhbCBjYmI9Y2FiPGNfYiBhbmQgMSBvciBtYXRoLmZsb29yKChjYWItY19iKS8yKQpsb2NhbCBkYmI9Y2FiPGNfYiBhbmQgY19iIG9yCmNfYi1tYXRoLmZsb29yKChjX2ItY2FiKS8yICswLjUpLTE7bG9jYWwgX2NiPTEKZm9yIGs9Y2JiLCNhY2EgZG8KaWYoYWNhW2tdfj1uaWwpdGhlbiBsb2NhbCBhY2IsYmNiLGNjYj1jYyhhY2Fba10pYWNiPWRjKGFjYixhYmIsYmJiKQpiY2I9ZGMoYmNiLGFiYixiYmIpY2NiPWRjKGNjYixhYmIsYmJiKQpkZGEucGFyZW50OmJsaXQoX19iK2RhYixhX2IrX2NiLTEgK19iYixhY2IsYmNiLGNjYillbmQ7X2NiPV9jYisxO2lmKGs9PWRiYil0aGVuIGJyZWFrIGVuZCBlbmQgZWxzZQpmb3IgYmFiLGNhYiBpbiBwYWlycyhhY2EpZG8gbG9jYWwgZGFiLF9iYixhYmI9Y2MoY2FiKWRhYj1kYyhkYWIsMSxiX2IpX2JiPWRjKF9iYiwxLGJfYikKYWJiPWRjKGFiYiwxLGJfYilkZGEucGFyZW50OmJsaXQoX19iLGFfYitiYWItMSxkYWIsX2JiLGFiYilpZihiYWI9PQpjX2IpdGhlbiBicmVhayBlbmQgZW5kIGVuZCBlbmQKaWYoYWFhKXRoZW4KZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IrMSxhX2IrY19iLGJfYiwxLGNhYSkKZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IrYl9iLGFfYisxLDEsY19iLGNhYSkKZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IrMSxhX2IrY19iLGJfYiwxLGNhYSkKZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IrYl9iLGFfYisxLDEsY19iLGNhYSllbmQ7bG9jYWwgYWFiPWRkYS5iZ0NvbG9yCmlmKGJhYVsibGVmdCJdfj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd1RleHRCb3goX19iLGFfYiwxLGNfYiwiXDE0OSIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYiwxLGNfYixhYWIpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYiwxLGNfYixiYWFbImxlZnQiXSllbmQKaWYoYmFhWyJ0b3AiXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KF9fYixhX2IsYl9iLDEsIlwxMzEiKWlmKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYixhX2IsYl9iLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYixiX2IsMSxiYWFbInRvcCJdKWVuZAppZihiYWFbImxlZnQiXX49ZmFsc2UpYW5kKGJhYVsidG9wIl1+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iLDEsMSwiXDE1MSIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iLGFfYiwxLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iLGFfYiwxLDEsYmFhWyJsZWZ0Il0pZW5kCmlmKGJhYVsicmlnaHQiXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KF9fYitiX2ItMSxhX2IsMSxjX2IsIlwxNDkiKWlmKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSxjX2IsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iK2JfYi0xLGFfYiwxLGNfYixiYWFbInJpZ2h0Il0pZW5kCmlmKGJhYVsiYm90dG9tIl1+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3VGV4dEJveChfX2IsYV9iK2NfYi0xLGJfYiwxLCJcMTQzIilpZihhYWJ+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChfX2IsYV9iK2NfYi0xLGJfYiwxLGRkYS5iZ0NvbG9yKWVuZApkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYixhX2IrY19iLTEsYl9iLDEsYmFhWyJib3R0b20iXSllbmQKaWYoYmFhWyJ0b3AiXX49ZmFsc2UpYW5kKGJhYVsicmlnaHQiXX49ZmFsc2UpdGhlbiBkZGEucGFyZW50OmRyYXdUZXh0Qm94KApfX2IrYl9iLTEsYV9iLDEsMSwiXDE0OCIpaWYKKGFhYn49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSwxLGRkYS5iZ0NvbG9yKWVuZApkZGEucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9fYitiX2ItMSxhX2IsMSwxLGJhYVsicmlnaHQiXSllbmQKaWYoYmFhWyJyaWdodCJdfj1mYWxzZSlhbmQoYmFhWyJib3R0b20iXX49ZmFsc2UpdGhlbgpkZGEucGFyZW50OmRyYXdUZXh0Qm94KApfX2IrYl9iLTEsYV9iK2NfYi0xLDEsMSwiXDEzMyIpaWYoYWFifj1mYWxzZSl0aGVuCmRkYS5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goX19iK2JfYi0xLGFfYitjX2ItMSwxLDEsZGRhLmJnQ29sb3IpZW5kCmRkYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goX19iK2JfYi0xLAphX2IrY19iLTEsMSwxLGJhYVsicmlnaHQiXSllbmQKaWYoYmFhWyJib3R0b20iXX49ZmFsc2UpYW5kKGJhYVsibGVmdCJdfj1mYWxzZSl0aGVuIGRkYS5wYXJlbnQ6ZHJhd1RleHRCb3goX19iLAphX2IrY19iLTEsMSwxLCJcMTM4IilpZihhYWJ+PWZhbHNlKXRoZW4KZGRhLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveCgKX19iLTEsYV9iK2NfYi0xLDEsMSxkZGEuYmdDb2xvcillbmQKZGRhLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChfX2IsYV9iK2NfYi0xLDEsMSxiYWFbImxlZnQiXSllbmQgZW5kO2FkYT1mYWxzZTtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxnZXRBYnNvbHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKGRkYSxfX2IsYV9iKQppZigKX19iPT1uaWwpb3IoYV9iPT1uaWwpdGhlbiBfX2IsYV9iPWRkYTpnZXRBbmNob3JQb3NpdGlvbigpZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGJfYixjX2I9ZGRhLnBhcmVudDpnZXRBYnNvbHV0ZVBvc2l0aW9uKClfX2I9Yl9iK19fYi0xO2FfYj1jX2IrYV9iLTEgZW5kO3JldHVybiBfX2IsYV9iIGVuZCxnZXRBbmNob3JQb3NpdGlvbj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpaWYoCl9fYj09bmlsKXRoZW4gX19iPWRkYTpnZXRYKCllbmQKaWYoYV9iPT1uaWwpdGhlbiBhX2I9ZGRhOmdldFkoKWVuZAppZihkZGEucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYS5wYXJlbnQ6Z2V0U2l6ZSgpCmlmKF9fYT09InRvcCIpdGhlbiBfX2I9bWF0aC5mbG9vcigKY19iLzIpK19fYi0xIGVsc2VpZihfX2E9PSJ0b3BSaWdodCIpdGhlbgpfX2I9Y19iK19fYi0xIGVsc2VpZihfX2E9PSJyaWdodCIpdGhlbiBfX2I9Y19iK19fYi0xCmFfYj1tYXRoLmZsb29yKGRfYi8yKSthX2ItMSBlbHNlaWYoX19hPT0iYm90dG9tUmlnaHQiKXRoZW4gX19iPWNfYitfX2ItMTthX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PSJib3R0b20iKXRoZW4gX19iPW1hdGguZmxvb3IoCmNfYi8yKStfX2ItMTthX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PQoiYm90dG9tTGVmdCIpdGhlbiBhX2I9ZF9iK2FfYi0xIGVsc2VpZihfX2E9PSJsZWZ0Iil0aGVuCmFfYj1tYXRoLmZsb29yKGRfYi8yKSthX2ItMSBlbHNlaWYoX19hPT0iY2VudGVyIil0aGVuIF9fYj1tYXRoLmZsb29yKGNfYi8yKStfX2ItMTthX2I9bWF0aC5mbG9vcigKZF9iLzIpK2FfYi0xIGVuZDtsb2NhbCBfYWIsYWFiPWRkYS5wYXJlbnQ6Z2V0T2Zmc2V0SW50ZXJuYWwoKWlmIG5vdChhX2Egb3IgYl9iKXRoZW4gcmV0dXJuCl9fYitfYWIsYV9iK2FhYiBlbmQgZW5kO3JldHVybiBfX2IsYV9iIGVuZCxpZ25vcmVPZmZzZXQ9ZnVuY3Rpb24oZGRhLF9fYikKYV9hPV9fYjtpZihfX2I9PW5pbCl0aGVuIGFfYT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oZGRhKQppZigKZGRhLnBhcmVudH49bmlsKXRoZW4gcmV0dXJuIGRkYS5wYXJlbnQ6Z2V0QmFzZUZyYW1lKCllbmQ7cmV0dXJuIGRkYSBlbmQsc2V0QW5jaG9yPWZ1bmN0aW9uKGRkYSxfX2IpX19hPV9fYgpkZGE6dXBkYXRlRHJhdygpcmV0dXJuIGRkYSBlbmQsZ2V0QW5jaG9yPWZ1bmN0aW9uKGRkYSlyZXR1cm4gX19hIGVuZCxvbkNoYW5nZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoInZhbHVlX2NoYW5nZWQiLGFfYillbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uQ2xpY2s9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJtb3VzZV9jbGljayIsYV9iKWVuZCBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZQpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGRhKWJkYVsibW91c2VfdXAiXT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxvbkNsaWNrVXA9ZnVuY3Rpb24oZGRhLC4uLilmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8KaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4gZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX3VwIixhX2IpZW5kIGVuZAppZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGRhKWJkYVsibW91c2VfY2xpY2siXT10cnVlCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3VwIixkZGEpYmRhWyJtb3VzZV91cCJdPXRydWUgZW5kO3JldHVybiBkZGEgZW5kLG9uUmVsZWFzZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX3JlbGVhc2UiLGFfYillbmQgZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixkZGEpYmRhWyJtb3VzZV9jbGljayJdPXRydWUKZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfdXAiLGRkYSliZGFbIm1vdXNlX3VwIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsb25TY3JvbGw9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJtb3VzZV9zY3JvbGwiLGFfYillbmQgZW5kCmlmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsZGRhKWJkYVsibW91c2Vfc2Nyb2xsIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsb25Ib3Zlcj1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX2hvdmVyIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9tb3ZlIixkZGEpYmRhWyJtb3VzZV9tb3ZlIl09dHJ1ZSBlbmQKcmV0dXJuIGRkYSBlbmQsb25MZWF2ZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoIm1vdXNlX2xlYXZlIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9tb3ZlIixkZGEpYmRhWyJtb3VzZV9tb3ZlIl09dHJ1ZSBlbmQKcmV0dXJuIGRkYSBlbmQsb25EcmFnPWZ1bmN0aW9uKGRkYSwuLi4pCmZvciBfX2IsYV9iIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGFfYik9PSJmdW5jdGlvbiIpdGhlbgpkZGE6cmVnaXN0ZXJFdmVudCgibW91c2VfZHJhZyIsYV9iKWVuZCBlbmQKaWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsZGRhKWJkYVsibW91c2VfZHJhZyJdPXRydWUKZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZQpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGRhKWJkYVsibW91c2VfdXAiXT10cnVlIGVuZDtyZXR1cm4gZGRhIGVuZCxvbkV2ZW50PWZ1bmN0aW9uKGRkYSwuLi4pCmZvciBfX2IsYV9iIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGFfYik9PSJmdW5jdGlvbiIpdGhlbgpkZGE6cmVnaXN0ZXJFdmVudCgib3RoZXJfZXZlbnQiLGFfYillbmQgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixkZGEpYmRhWyJvdGhlcl9ldmVudCJdPXRydWUgZW5kO3JldHVybgpkZGEgZW5kLG9uS2V5PWZ1bmN0aW9uKGRkYSwuLi4pCmlmCihkYWEpdGhlbgpmb3IgX19iLGFfYiBpbiBwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImtleSIsYV9iKWVuZCBlbmQ7aWYoZGRhLnBhcmVudH49bmlsKXRoZW4gZGRhLnBhcmVudDphZGRFdmVudCgia2V5IixkZGEpCmJkYVsia2V5Il09dHJ1ZSBlbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uQ2hhcj1mdW5jdGlvbihkZGEsLi4uKQppZgooZGFhKXRoZW4KZm9yIF9fYixhX2IgaW4gcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJjaGFyIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbiBkZGEucGFyZW50OmFkZEV2ZW50KCJjaGFyIixkZGEpCmJkYVsiY2hhciJdPXRydWUgZW5kIGVuZDtyZXR1cm4gZGRhIGVuZCxvblJlc2l6ZT1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImJhc2FsdF9yZXNpemUiLGFfYillbmQgZW5kO3JldHVybiBkZGEgZW5kLG9uUmVwb3NpdGlvbj1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImJhc2FsdF9yZXBvc2l0aW9uIixhX2IpZW5kIGVuZDtyZXR1cm4gZGRhIGVuZCxvbktleVVwPWZ1bmN0aW9uKGRkYSwuLi4pZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvCmlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuIGRkYTpyZWdpc3RlckV2ZW50KCJrZXlfdXAiLGFfYillbmQgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6YWRkRXZlbnQoImtleV91cCIsZGRhKWJkYVsia2V5X3VwIl09dHJ1ZSBlbmQ7cmV0dXJuIGRkYSBlbmQsaXNGb2N1c2VkPWZ1bmN0aW9uKGRkYSlpZigKZGRhLnBhcmVudH49bmlsKXRoZW4KcmV0dXJuIGRkYS5wYXJlbnQ6Z2V0Rm9jdXNlZE9iamVjdCgpPT1kZGEgZW5kO3JldHVybiBmYWxzZSBlbmQsb25HZXRGb2N1cz1mdW5jdGlvbihkZGEsLi4uKQpmb3IgX19iLGFfYiBpbgpwYWlycyh0YWJsZS5wYWNrKC4uLikpZG8gaWYodHlwZShhX2IpPT0iZnVuY3Rpb24iKXRoZW4KZGRhOnJlZ2lzdGVyRXZlbnQoImdldF9mb2N1cyIsYV9iKWVuZCBlbmQ7aWYoZGRhLnBhcmVudH49bmlsKXRoZW4KZGRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRkYSliZGFbIm1vdXNlX2NsaWNrIl09dHJ1ZSBlbmQ7cmV0dXJuCmRkYSBlbmQsb25Mb3NlRm9jdXM9ZnVuY3Rpb24oZGRhLC4uLikKZm9yIF9fYixhX2IgaW4KcGFpcnModGFibGUucGFjayguLi4pKWRvIGlmKHR5cGUoYV9iKT09ImZ1bmN0aW9uIil0aGVuCmRkYTpyZWdpc3RlckV2ZW50KCJsb3NlX2ZvY3VzIixhX2IpZW5kIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGRhKWJkYVsibW91c2VfY2xpY2siXT10cnVlIGVuZDtyZXR1cm4KZGRhIGVuZCxyZWdpc3RlckV2ZW50PWZ1bmN0aW9uKGRkYSxfX2IsYV9iKXJldHVybgpjZGE6cmVnaXN0ZXJFdmVudChfX2IsYV9iKWVuZCxyZW1vdmVFdmVudD1mdW5jdGlvbihkZGEsX19iLGFfYikKcmV0dXJuIGNkYTpyZW1vdmVFdmVudChfX2IsYV9iKWVuZCxzZW5kRXZlbnQ9ZnVuY3Rpb24oZGRhLF9fYiwuLi4pcmV0dXJuIGNkYTpzZW5kRXZlbnQoX19iLGRkYSwuLi4pZW5kLGlzQ29vcmRzSW5PYmplY3Q9ZnVuY3Rpb24oZGRhLF9fYixhX2IpCmlmCihiX2EpYW5kKGRhYSl0aGVuIGlmKF9fYj09bmlsKW9yKGFfYj09bmlsKXRoZW4gcmV0dXJuIGZhbHNlIGVuZApsb2NhbCBiX2IsY19iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWRkYTpnZXRTaXplKCkKaWYKKGJfYjw9X19iKWFuZChiX2IrZF9iPl9fYilhbmQoY19iPD1hX2IpYW5kKGNfYitfYWI+YV9iKXRoZW4gcmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IsY19iKQppZgooZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBkX2IsX2FiPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgYWFiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX2NsaWNrIixkZGEsIm1vdXNlX2NsaWNrIixfX2IsYV9iLQooZF9iLTEpLGJfYi0gKF9hYi0xKSxhX2IsYl9iLGNfYilpZihhYWI9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZihkZGEucGFyZW50fj1uaWwpdGhlbgpkZGEucGFyZW50OnNldEZvY3VzZWRPYmplY3QoZGRhKWVuZDtfYWE9dHJ1ZTtfYmE9dHJ1ZTthYmEsYmJhPWFfYixiX2I7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKQpfYmE9ZmFsc2UKaWYoX2FhKXRoZW4gbG9jYWwgY19iLGRfYj1kZGE6Z2V0QWJzb2x1dGVQb3NpdGlvbigpCmxvY2FsIF9hYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9yZWxlYXNlIixkZGEsIm1vdXNlX3JlbGVhc2UiLF9fYixhX2ItICgKY19iLTEpLGJfYi0gKGRfYi0xKSxhX2IsYl9iKV9hYT1mYWxzZSBlbmQKaWYoZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX3VwIixkZGEsIm1vdXNlX3VwIixfX2IsCmFfYi0gKGNfYi0xKSxiX2ItIChkX2ItMSksYV9iLGJfYilpZihfYWI9PWZhbHNlKXRoZW4gcmV0dXJuIGZhbHNlIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmFnSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmCihfYmEpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX2RyYWciLGRkYSwibW91c2VfZHJhZyIsX19iLGFfYi0gKGNfYi0xKSwKYl9iLSAoZF9iLTEpLGFiYS1hX2IsYmJhLWJfYixhX2IsYl9iKWFiYSxiYmE9YV9iLGJfYjtpZihfYWJ+PW5pbCl0aGVuIHJldHVybiBfYWIgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6c2V0Rm9jdXNlZE9iamVjdChkZGEpZW5kO3JldHVybiB0cnVlIGVuZAppZihkZGE6aXNDb29yZHNJbk9iamVjdChhX2IsYl9iKSl0aGVuCmxvY2FsIGNfYixkX2I9ZGRhOmdldEFic29sdXRlUG9zaXRpb24oZGRhOmdldEFuY2hvclBvc2l0aW9uKCkpYWJhLGJiYT1hX2IsYl9iO2NiYSxkYmE9Y19iLWFfYixkX2ItYl9iIGVuZDtyZXR1cm4gZmFsc2UgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IsYl9iKQppZgooZGRhOmlzQ29vcmRzSW5PYmplY3QoYV9iLGJfYikpdGhlbiBsb2NhbCBjX2IsZF9iPWRkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKCkKbG9jYWwgX2FiPWNkYTpzZW5kRXZlbnQoIm1vdXNlX3Njcm9sbCIsZGRhLCJtb3VzZV9zY3JvbGwiLF9fYixhX2ItCihjX2ItMSksYl9iLSAoZF9iLTEpKWlmKF9hYj09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kO2lmKGRkYS5wYXJlbnR+PW5pbCl0aGVuCmRkYS5wYXJlbnQ6c2V0Rm9jdXNlZE9iamVjdChkZGEpZW5kO3JldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGhvdmVySGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLGFfYixiX2IpCmlmCihkZGE6aXNDb29yZHNJbk9iamVjdChfX2IsYV9iKSl0aGVuCmxvY2FsIGNfYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9ob3ZlciIsZGRhLCJtb3VzZV9ob3ZlciIsX19iLGFfYixiX2IpaWYoY19iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7ZF9hPXRydWU7cmV0dXJuIHRydWUgZW5kCmlmKGRfYSl0aGVuCmxvY2FsIGNfYj1jZGE6c2VuZEV2ZW50KCJtb3VzZV9sZWF2ZSIsZGRhLCJtb3VzZV9sZWF2ZSIsX19iLGFfYixiX2IpaWYoY19iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7ZF9hPWZhbHNlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGtleUhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYixhX2IpaWYKKGRhYSlhbmQoYl9hKXRoZW4KaWYoZGRhOmlzRm9jdXNlZCgpKXRoZW4KbG9jYWwgYl9iPWNkYTpzZW5kRXZlbnQoImtleSIsZGRhLCJrZXkiLF9fYixhX2IpaWYoYl9iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4KZmFsc2UgZW5kLGtleVVwSGFuZGxlcj1mdW5jdGlvbihkZGEsX19iKWlmCihkYWEpYW5kKGJfYSl0aGVuCmlmKGRkYTppc0ZvY3VzZWQoKSl0aGVuCmxvY2FsIGFfYj1jZGE6c2VuZEV2ZW50KCJrZXlfdXAiLGRkYSwia2V5X3VwIixfX2IpaWYoYV9iPT1mYWxzZSl0aGVuIHJldHVybiBmYWxzZSBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4KZmFsc2UgZW5kLGNoYXJIYW5kbGVyPWZ1bmN0aW9uKGRkYSxfX2IpaWYKKGRhYSlhbmQoYl9hKXRoZW4KaWYoZGRhOmlzRm9jdXNlZCgpKXRoZW4KbG9jYWwgYV9iPWNkYTpzZW5kRXZlbnQoImNoYXIiLGRkYSwiY2hhciIsX19iKWlmKGFfYj09ZmFsc2UpdGhlbiByZXR1cm4gZmFsc2UgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuCmZhbHNlIGVuZCx2YWx1ZUNoYW5nZWRIYW5kbGVyPWZ1bmN0aW9uKGRkYSkKY2RhOnNlbmRFdmVudCgidmFsdWVfY2hhbmdlZCIsZGRhLGRkKWVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oZGRhLF9fYiwuLi4pbG9jYWwgYV9iPXsuLi59CmlmCihfX2I9PSJ0aW1lciIpYW5kKGFfYlsxXT09Y2NhKXRoZW4KaWYoX2NhW2JjYSsxXX49bmlsKXRoZW4gYmNhPWJjYSsxO2lmKGRjYT09InN0cmV0Y2giKXRoZW4KYWNhPWRiLnJlc2l6ZUJJTUcoX2NhLGRkYTpnZXRTaXplKCkpW2JjYV1lbHNlIGFjYT1fY2FbYmNhXWVuZDtsb2NhbCBjX2I9X2NhW2JjYV0uZHVyYXRpb24gb3IKX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWVsc2UKaWYoX2RhKXRoZW4gYmNhPTE7aWYoZGNhPT0ic3RyZXRjaCIpdGhlbgphY2E9ZGIucmVzaXplQklNRyhfY2EsZGRhOmdldFNpemUoKSlbMV1lbHNlIGFjYT1fY2FbMV1lbmQ7bG9jYWwgY19iPQpfY2FbMV0uZHVyYXRpb24gb3IgX2NhLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2NhPW9zLnN0YXJ0VGltZXIoY19iKWVuZCBlbmQ7ZGRhOnVwZGF0ZURyYXcoKWVuZDtsb2NhbCBiX2I9Y2RhOnNlbmRFdmVudCgib3RoZXJfZXZlbnQiLGRkYSxfX2IsLi4uKWlmKGJfYn49bmlsKXRoZW4KcmV0dXJuIGJfYiBlbmQgZW5kLGN1c3RvbUV2ZW50SGFuZGxlcj1mdW5jdGlvbihkZGEsX19iLC4uLikKaWYKKApfY2F+PW5pbClhbmQoZGNhPT0ic3RyZXRjaCIpYW5kKF9fYj09ImJhc2FsdF9yZXNpemUiKXRoZW4KYWNhPWRiLnJlc2l6ZUJJTUcoX2NhLGRkYTpnZXRTaXplKCkpW2JjYV1kZGE6dXBkYXRlRHJhdygpZW5kO2xvY2FsIGFfYj1jZGE6c2VuZEV2ZW50KCJjdXN0b21fZXZlbnQiLGRkYSxfX2IsLi4uKWlmKGFfYn49bmlsKXRoZW4KcmV0dXJuIGFfYiBlbmQ7cmV0dXJuIHRydWUgZW5kLGdldEZvY3VzSGFuZGxlcj1mdW5jdGlvbihkZGEpCmxvY2FsIF9fYj1jZGE6c2VuZEV2ZW50KCJnZXRfZm9jdXMiLGRkYSlpZihfX2J+PW5pbCl0aGVuIHJldHVybiBfX2IgZW5kO3JldHVybiB0cnVlIGVuZCxsb3NlRm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGRkYSkKX2JhPWZhbHNlO2xvY2FsIF9fYj1jZGE6c2VuZEV2ZW50KCJsb3NlX2ZvY3VzIixkZGEpCmlmKF9fYn49bmlsKXRoZW4gcmV0dXJuIF9fYiBlbmQ7cmV0dXJuIHRydWUgZW5kLGluaXQ9ZnVuY3Rpb24oZGRhKQppZgooZGRhLnBhcmVudH49bmlsKXRoZW4gZm9yIF9fYixhX2IgaW4gcGFpcnMoYmRhKWRvCmlmKGFfYil0aGVuIGRkYS5wYXJlbnQ6YWRkRXZlbnQoX19iLGRkYSllbmQgZW5kIGVuZDtpZiBub3QoY19hKXRoZW4gY19hPXRydWU7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmR9YmQuX19pbmRleD1iZDtyZXR1cm4gYmQgZW5kIGVuZAphYVsidGhlbWUiXT1mdW5jdGlvbiguLi4pCnJldHVybgp7QmFzYWx0Qkc9Y29sb3JzLmxpZ2h0R3JheSxCYXNhbHRUZXh0PWNvbG9ycy5ibGFjayxGcmFtZUJHPWNvbG9ycy5ncmF5LEZyYW1lVGV4dD1jb2xvcnMuYmxhY2ssQnV0dG9uQkc9Y29sb3JzLmdyYXksQnV0dG9uVGV4dD1jb2xvcnMuYmxhY2ssQ2hlY2tib3hCRz1jb2xvcnMuZ3JheSxDaGVja2JveFRleHQ9Y29sb3JzLmJsYWNrLElucHV0Qkc9Y29sb3JzLmdyYXksSW5wdXRUZXh0PWNvbG9ycy5ibGFjayxUZXh0ZmllbGRCRz1jb2xvcnMuZ3JheSxUZXh0ZmllbGRUZXh0PWNvbG9ycy5ibGFjayxMaXN0Qkc9Y29sb3JzLmdyYXksTGlzdFRleHQ9Y29sb3JzLmJsYWNrLE1lbnViYXJCRz1jb2xvcnMuZ3JheSxNZW51YmFyVGV4dD1jb2xvcnMuYmxhY2ssRHJvcGRvd25CRz1jb2xvcnMuZ3JheSxEcm9wZG93blRleHQ9Y29sb3JzLmJsYWNrLFJhZGlvQkc9Y29sb3JzLmdyYXksUmFkaW9UZXh0PWNvbG9ycy5ibGFjayxTZWxlY3Rpb25CRz1jb2xvcnMuYmxhY2ssU2VsZWN0aW9uVGV4dD1jb2xvcnMubGlnaHRHcmF5LEdyYXBoaWNCRz1jb2xvcnMuYmxhY2ssSW1hZ2VCRz1jb2xvcnMuYmxhY2ssUGFuZUJHPWNvbG9ycy5ibGFjayxQcm9ncmFtQkc9Y29sb3JzLmJsYWNrLFByb2dyZXNzYmFyQkc9Y29sb3JzLmdyYXksUHJvZ3Jlc3NiYXJUZXh0PWNvbG9ycy5ibGFjayxQcm9ncmVzc2JhckFjdGl2ZUJHPWNvbG9ycy5ibGFjayxTY3JvbGxiYXJCRz1jb2xvcnMubGlnaHRHcmF5LFNjcm9sbGJhclRleHQ9Y29sb3JzLmdyYXksU2Nyb2xsYmFyU3ltYm9sQ29sb3I9Y29sb3JzLmJsYWNrLFNsaWRlckJHPWZhbHNlLFNsaWRlclRleHQ9Y29sb3JzLmdyYXksU2xpZGVyU3ltYm9sQ29sb3I9Y29sb3JzLmJsYWNrLFN3aXRjaEJHPWNvbG9ycy5saWdodEdyYXksU3dpdGNoVGV4dD1jb2xvcnMuZ3JheSxTd2l0Y2hCR1N5bWJvbD1jb2xvcnMuYmxhY2ssU3dpdGNoSW5hY3RpdmU9Y29sb3JzLnJlZCxTd2l0Y2hBY3RpdmU9Y29sb3JzLmdyZWVuLExhYmVsQkc9ZmFsc2UsTGFiZWxUZXh0PWNvbG9ycy5ibGFjayxHcmFwaEJHPWNvbG9ycy5ncmF5LEdyYXBoVGV4dD1jb2xvcnMuYmxhY2t9ZW5kO2FhWyJvYmplY3RzIl09e30KYWFbIm9iamVjdHMiXVsiVGltZXIiXT1mdW5jdGlvbiguLi4pCmxvY2FsIGFiPWRhKCJiYXNhbHRFdmVudCIpbG9jYWwgYmI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihjYilsb2NhbCBkYj0iVGltZXIibG9jYWwgX2M9MDtsb2NhbCBhYz0wO2xvY2FsIGJjPTA7bG9jYWwgY2MKbG9jYWwgZGM9YWIoKWxvY2FsIF9kPWZhbHNlCmxvY2FsIGFkPWZ1bmN0aW9uKGNkLGRkLF9fYSkKbG9jYWwgYV9hPWZ1bmN0aW9uKGJfYSkKaWYoYl9hOnN1YigxLDEpPT0iIyIpdGhlbgpsb2NhbCBjX2E9Y2Q6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChiX2E6c3ViKDIsYl9hOmxlbigpKSkKaWYoY19hfj1uaWwpYW5kKGNfYS5pbnRlcm5hbE9iamV0Q2FsbH49bmlsKXRoZW4gZGQoY2QsZnVuY3Rpb24oKQpjX2E6aW50ZXJuYWxPYmpldENhbGwoKWVuZCllbmQgZWxzZQpkZChjZCxjZDpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShiX2EpKWVuZCBlbmQ7aWYodHlwZShfX2EpPT0ic3RyaW5nIil0aGVuIGFfYShfX2EpZWxzZWlmKHR5cGUoX19hKT09InRhYmxlIil0aGVuCmZvciBiX2EsY19hIGluIHBhaXJzKF9fYSlkbyBhX2EoY19hKWVuZCBlbmQ7cmV0dXJuIGNkIGVuZApsb2NhbCBiZD17bmFtZT1jYixnZXRUeXBlPWZ1bmN0aW9uKGNkKXJldHVybiBkYiBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGNkLGRkKQppZihiYigidGltZSIsZGQpfj1uaWwpdGhlbiBfYz1iYigidGltZSIsZGQpZW5kO2lmKGJiKCJyZXBlYXQiLGRkKX49bmlsKXRoZW4gYWM9YmIoInJlcGVhdCIsZGQpZW5kCmlmKApiYigic3RhcnQiLGRkKX49bmlsKXRoZW4gaWYoYmIoInN0YXJ0IixkZCkpdGhlbiBjZDpzdGFydCgpZW5kIGVuZDtpZihiYigib25DYWxsIixkZCl+PW5pbCl0aGVuCmFkKGNkLGNkLm9uQ2FsbCxiYigib25DYWxsIixkZCkpZW5kO3JldHVybiBjZCBlbmQsZ2V0QmFzZUZyYW1lPWZ1bmN0aW9uKGNkKQppZigKY2QucGFyZW50fj1uaWwpdGhlbiByZXR1cm4gY2QucGFyZW50OmdldEJhc2VGcmFtZSgpZW5kO3JldHVybiBjZCBlbmQsZ2V0WkluZGV4PWZ1bmN0aW9uKGNkKXJldHVybiAxIGVuZCxnZXROYW1lPWZ1bmN0aW9uKGNkKQpyZXR1cm4gY2QubmFtZSBlbmQsc2V0VGltZT1mdW5jdGlvbihjZCxkZCxfX2EpX2M9ZGQgb3IgMDthYz1fX2Egb3IgMTtyZXR1cm4gY2QgZW5kLHN0YXJ0PWZ1bmN0aW9uKGNkKWlmKF9kKXRoZW4Kb3MuY2FuY2VsVGltZXIoY2MpZW5kO2JjPWFjO2NjPW9zLnN0YXJ0VGltZXIoX2MpX2Q9dHJ1ZQpjZC5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjZClyZXR1cm4gY2QgZW5kLGlzQWN0aXZlPWZ1bmN0aW9uKGNkKXJldHVybiBfZCBlbmQsY2FuY2VsPWZ1bmN0aW9uKGNkKWlmKApjY349bmlsKXRoZW4gb3MuY2FuY2VsVGltZXIoY2MpZW5kO19kPWZhbHNlCmNkLnBhcmVudDpyZW1vdmVFdmVudCgib3RoZXJfZXZlbnQiLGNkKXJldHVybiBjZCBlbmQsb25DYWxsPWZ1bmN0aW9uKGNkLGRkKQpkYzpyZWdpc3RlckV2ZW50KCJ0aW1lZF9ldmVudCIsZGQpcmV0dXJuIGNkIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oY2QsZGQsX19hKQppZgpkZD09InRpbWVyImFuZCBfX2E9PWNjIGFuZCBfZCB0aGVuIGRjOnNlbmRFdmVudCgidGltZWRfZXZlbnQiLGNkKQppZihiYz49MSl0aGVuIGJjPWJjLTE7aWYoYmM+PTEpdGhlbgpjYz1vcy5zdGFydFRpbWVyKF9jKWVuZCBlbHNlaWYoYmM9PS0xKXRoZW4gY2M9b3Muc3RhcnRUaW1lcihfYyllbmQgZW5kIGVuZH1iZC5fX2luZGV4PWJkO3JldHVybiBiZCBlbmQgZW5kCmFhWyJvYmplY3RzIl1bIklucHV0Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBkYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKF9jKWxvY2FsIGFjPWFiKF9jKWxvY2FsIGJjPSJJbnB1dCJsb2NhbCBjYz0idGV4dCJsb2NhbCBkYz0wCmFjOnNldFpJbmRleCg1KWFjOnNldFZhbHVlKCIiKWFjLndpZHRoPTEwO2FjLmhlaWdodD0xO2xvY2FsIF9kPTE7bG9jYWwgYWQ9MTtsb2NhbCBiZD0iImxvY2FsIGNkO2xvY2FsIGRkCmxvY2FsIF9fYT1iZDtsb2NhbCBhX2E9ZmFsc2UKbG9jYWwgYl9hPXtnZXRUeXBlPWZ1bmN0aW9uKGNfYSlyZXR1cm4gYmMgZW5kLHNldElucHV0VHlwZT1mdW5jdGlvbihjX2EsZF9hKWlmKGRfYT09InBhc3N3b3JkIilvcihkX2E9PSJudW1iZXIiKW9yKGRfYT09CiJ0ZXh0Iil0aGVuIGNjPWRfYSBlbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldERlZmF1bHRUZXh0PWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSliZD1kX2EKY2Q9YWFhIG9yIGNkO2RkPV9hYSBvciBkZDtpZihjX2E6aXNGb2N1c2VkKCkpdGhlbiBfX2E9IiJlbHNlIF9fYT1iZCBlbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldElucHV0VHlwZT1mdW5jdGlvbihjX2EpCnJldHVybiBjYyBlbmQsc2V0VmFsdWU9ZnVuY3Rpb24oY19hLGRfYSlhYy5zZXRWYWx1ZShjX2EsdG9zdHJpbmcoZF9hKSkKaWYgbm90KGFfYSl0aGVuIF9kPQp0b3N0cmluZyhkX2EpOmxlbigpKzEKYWQ9bWF0aC5tYXgoMSxfZC1jX2E6Z2V0V2lkdGgoKSsxKWlmKGNfYTppc0ZvY3VzZWQoKSl0aGVuIGxvY2FsIF9hYSxhYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSwKX2FhK19kLWFkLGFhYSttYXRoLmZsb29yKGNfYTpnZXRIZWlnaHQoKS8yKSxjX2EuZmdDb2xvcillbmQgZW5kO2NfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRWYWx1ZT1mdW5jdGlvbihjX2EpCmxvY2FsIGRfYT1hYy5nZXRWYWx1ZShjX2EpCnJldHVybiBjYz09Im51bWJlciJhbmQgdG9udW1iZXIoZF9hKW9yIGRfYSBlbmQsc2V0SW5wdXRMaW1pdD1mdW5jdGlvbihjX2EsZF9hKQpkYz10b251bWJlcihkX2Epb3IgZGM7Y19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldElucHV0TGltaXQ9ZnVuY3Rpb24oY19hKXJldHVybiBkYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGNfYSxkX2EpCmFjLnNldFZhbHVlc0J5WE1MRGF0YShjX2EsZF9hKWxvY2FsIF9hYSxhYWEKaWYoZGIoImRlZmF1bHRCRyIsZF9hKX49bmlsKXRoZW4gX2FhPWRiKCJkZWZhdWx0QkciLGRfYSllbmQKaWYoZGIoImRlZmF1bHRGRyIsZF9hKX49bmlsKXRoZW4gYWFhPWRiKCJkZWZhdWx0RkciLGRfYSllbmQ7aWYoZGIoImRlZmF1bHQiLGRfYSl+PW5pbCl0aGVuCmNfYTpzZXREZWZhdWx0VGV4dChkYigiZGVmYXVsdCIsZF9hKSxhYWF+PW5pbCBhbmQgY29sb3JzW2FhYV0sCl9hYX49bmlsIGFuZCBjb2xvcnNbX2FhXSllbmQKaWYoZGIoImxpbWl0IixkX2Epfj0KbmlsKXRoZW4gY19hOnNldElucHV0TGltaXQoZGIoImxpbWl0IixkX2EpKWVuZDtpZihkYigidHlwZSIsZF9hKX49bmlsKXRoZW4KY19hOnNldElucHV0VHlwZShkYigidHlwZSIsZF9hKSllbmQ7cmV0dXJuIGNfYSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGNfYSkKYWMuZ2V0Rm9jdXNIYW5kbGVyKGNfYSkKaWYoY19hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgZF9hLF9hYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKV9fYT0iImlmKGJkfj0iIil0aGVuCmNfYTp1cGRhdGVEcmF3KCllbmQKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2ErX2QtYWQsX2FhK21hdGgubWF4KG1hdGguY2VpbCgKY19hOmdldEhlaWdodCgpLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKWVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihjX2EpCmFjLmxvc2VGb2N1c0hhbmRsZXIoY19hKWlmKGNfYS5wYXJlbnR+PW5pbCl0aGVuIF9fYT1iZDtpZihiZH49IiIpdGhlbiBjX2E6dXBkYXRlRHJhdygpZW5kCmNfYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZCBlbmQsa2V5SGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hKQppZgooYWMua2V5SGFuZGxlcihjX2EsZF9hKSl0aGVuIGxvY2FsIF9hYSxhYWE9Y19hOmdldFNpemUoKWFfYT10cnVlCmlmKGRfYT09a2V5cy5iYWNrc3BhY2UpdGhlbgpsb2NhbCBiYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSlpZihfZD4xKXRoZW4KY19hOnNldFZhbHVlKGJiYTpzdWIoMSxfZC0yKS4uYmJhOnN1YihfZCxiYmE6bGVuKCkpKWlmKF9kPjEpdGhlbiBfZD1fZC0xIGVuZAppZihhZD4xKXRoZW4gaWYoX2Q8YWQpdGhlbiBhZD1hZC0xIGVuZCBlbmQgZW5kIGVuZDtpZihkX2E9PWtleXMuZW50ZXIpdGhlbiBpZihjX2EucGFyZW50fj1uaWwpdGhlbiBlbmQgZW5kCmlmKApkX2E9PWtleXMucmlnaHQpdGhlbgpsb2NhbCBiYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSk6bGVuKClfZD1fZCsxO2lmKF9kPmJiYSl0aGVuIF9kPWJiYSsxIGVuZDtpZihfZDwxKXRoZW4gX2Q9MSBlbmQ7aWYKKF9kPGFkKW9yKF9kPj1fYWErYWQpdGhlbiBhZD1fZC1fYWErMSBlbmQ7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kIGVuZAppZihkX2E9PWtleXMubGVmdCl0aGVuIF9kPV9kLTE7aWYoX2Q+PTEpdGhlbgppZihfZDxhZClvcihfZD49X2FhK2FkKXRoZW4gYWQ9X2QgZW5kIGVuZDtpZihfZDwxKXRoZW4gX2Q9MSBlbmQ7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kIGVuZDtsb2NhbCBiYWEsY2FhPWNfYTpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGRhYT10b3N0cmluZyhhYy5nZXRWYWx1ZSgpKQpsb2NhbCBfYmE9KF9kPD1kYWE6bGVuKClhbmQgX2QtMSBvciBkYWE6bGVuKCkpLSAoYWQtMSlsb2NhbCBhYmE9Y19hOmdldFgoKQppZihfYmE+YWJhK19hYS0xKXRoZW4gX2JhPWFiYStfYWEtMSBlbmQ7aWYoY19hLnBhcmVudH49bmlsKXRoZW4KY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiYWErX2JhLGNhYSsKbWF0aC5tYXgobWF0aC5jZWlsKGFhYS8yIC0xLDEpKSxjX2EuZmdDb2xvcillbmQKY19hOnVwZGF0ZURyYXcoKWFfYT1mYWxzZTtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxjaGFySGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hKQppZgooYWMuY2hhckhhbmRsZXIoY19hLGRfYSkpdGhlbiBhX2E9dHJ1ZTtsb2NhbCBfYWEsYWFhPWNfYTpnZXRTaXplKClsb2NhbCBiYWE9YWMuZ2V0VmFsdWUoKQppZigKYmFhOmxlbigpPGRjIG9yIGRjPD0wKXRoZW4KaWYoY2M9PSJudW1iZXIiKXRoZW4gbG9jYWwgY2JhPWJhYQppZgooX2Q9PTEgYW5kIGRfYT09Ii0iKW9yKGRfYT09Ii4iKW9yKHRvbnVtYmVyKGRfYSl+PW5pbCl0aGVuCmNfYTpzZXRWYWx1ZShiYWE6c3ViKDEsX2QtMSkuLgpkX2EuLmJhYTpzdWIoX2QsYmFhOmxlbigpKSlfZD1fZCsxO2lmKGRfYT09Ii4iKW9yKGRfYT09Ii0iKWFuZCgjYmFhPjApdGhlbgppZigKdG9udW1iZXIoYWMuZ2V0VmFsdWUoKSk9PW5pbCl0aGVuIGNfYTpzZXRWYWx1ZShjYmEpX2Q9X2QtMSBlbmQgZW5kIGVuZCBlbHNlCmNfYTpzZXRWYWx1ZShiYWE6c3ViKDEsX2QtMSkuLmRfYS4uYmFhOnN1YihfZCxiYWE6bGVuKCkpKV9kPV9kKzEgZW5kO2lmKF9kPj1fYWErYWQpdGhlbiBhZD1hZCsxIGVuZCBlbmQ7bG9jYWwgY2FhLGRhYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSkKbG9jYWwgYWJhPShfZDw9X2JhOmxlbigpYW5kIF9kLTEgb3IgX2JhOmxlbigpKS0gKGFkLTEpbG9jYWwgYmJhPWNfYTpnZXRYKCkKaWYoYWJhPmJiYStfYWEtMSl0aGVuIGFiYT1iYmErX2FhLTEgZW5kO2lmKGNfYS5wYXJlbnR+PW5pbCl0aGVuCmNfYS5wYXJlbnQ6c2V0Q3Vyc29yKHRydWUsY2FhK2FiYSxkYWErCm1hdGgubWF4KG1hdGguY2VpbChhYWEvMiAtMSwxKSksY19hLmZnQ29sb3IpZW5kO2FfYT1mYWxzZQpjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSkKaWYKKGFjLm1vdXNlSGFuZGxlcihjX2EsZF9hLF9hYSxhYWEpKXRoZW4gbG9jYWwgYmFhLGNhYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBkYWEsX2JhPWNfYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGJhYSxjYWEpbG9jYWwgYWJhLGJiYT1jX2E6Z2V0U2l6ZSgpX2Q9X2FhLWRhYSthZDtsb2NhbCBjYmE9YWMuZ2V0VmFsdWUoKWlmKF9kPgpjYmE6bGVuKCkpdGhlbiBfZD1jYmE6bGVuKCkrMSBlbmQ7aWYoX2Q8YWQpdGhlbiBhZD1fZC0xCmlmKGFkPDEpdGhlbiBhZD0xIGVuZCBlbmQKY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiYWErX2QtYWQsY2FhKwptYXRoLm1heChtYXRoLmNlaWwoYmJhLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oY19hLGRfYSxfYWEsYWFhLGJhYSxjYWEpCmlmCihjX2E6aXNGb2N1c2VkKCkpdGhlbiBpZihjX2E6aXNDb29yZHNJbk9iamVjdChfYWEsYWFhKSl0aGVuCmlmKGFjLmRyYWdIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSxiYWEsY2FhKSl0aGVuIHJldHVybiB0cnVlIGVuZCBlbmQKY19hLnBhcmVudDpyZW1vdmVGb2N1c2VkT2JqZWN0KCllbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hLF9hYSwuLi4pCmFjLmV2ZW50SGFuZGxlcihjX2EsZF9hLF9hYSwuLi4pCmlmKGRfYT09InBhc3RlIil0aGVuCmlmKGNfYTppc0ZvY3VzZWQoKSl0aGVuIGxvY2FsIGFhYT1hYy5nZXRWYWx1ZSgpCmxvY2FsIGJhYSxjYWE9Y19hOmdldFNpemUoKWFfYT10cnVlCmlmKGNjPT0ibnVtYmVyIil0aGVuIGxvY2FsIGRiYT1hYWEKaWYoX2FhPT0iLiIpb3IodG9udW1iZXIoX2FhKX49bmlsKXRoZW4KY19hOnNldFZhbHVlKGFhYTpzdWIoMSwKX2QtMSkuLl9hYS4uYWFhOnN1YihfZCxhYWE6bGVuKCkpKV9kPV9kK19hYTpsZW4oKWVuZAppZih0b251bWJlcihhYy5nZXRWYWx1ZSgpKT09bmlsKXRoZW4gY19hOnNldFZhbHVlKGRiYSllbmQgZWxzZQpjX2E6c2V0VmFsdWUoYWFhOnN1YigxLF9kLTEpLi5fYWEuLmFhYTpzdWIoX2QsYWFhOmxlbigpKSlfZD1fZCtfYWE6bGVuKCllbmQ7aWYoX2Q+PWJhYSthZCl0aGVuIGFkPShfZCsxKS1iYWEgZW5kCmxvY2FsIGRhYSxfYmE9Y19hOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBhYmE9dG9zdHJpbmcoYWMuZ2V0VmFsdWUoKSkKbG9jYWwgYmJhPSgKX2Q8PWFiYTpsZW4oKWFuZCBfZC0xIG9yIGFiYTpsZW4oKSktIChhZC0xKWxvY2FsIGNiYT1jX2E6Z2V0WCgpCmlmKGJiYT5jYmErYmFhLTEpdGhlbiBiYmE9Y2JhK2JhYS0xIGVuZDtpZihjX2EucGFyZW50fj1uaWwpdGhlbgpjX2EucGFyZW50OnNldEN1cnNvcih0cnVlLGRhYStiYmEsX2JhKwptYXRoLm1heChtYXRoLmNlaWwoY2FhLzIgLTEsMSkpLGNfYS5mZ0NvbG9yKWVuZApjX2E6dXBkYXRlRHJhdygpYV9hPWZhbHNlIGVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oY19hKQppZgooYWMuZHJhdyhjX2EpKXRoZW4KaWYoY19hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgZF9hLF9hYT1jX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBhYWEsYmFhPWNfYTpnZXRTaXplKClsb2NhbCBjYWE9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oYmFhLCJjZW50ZXIiKWlmCihjX2EuYmdDb2xvcn49ZmFsc2UpdGhlbgpjX2EucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRfYSxfYWEsYWFhLGJhYSxjX2EuYmdDb2xvcillbmQKZm9yIG49MSxiYWEgZG8KaWYobj09Y2FhKXRoZW4KbG9jYWwgZGFhPXRvc3RyaW5nKGFjLmdldFZhbHVlKCkpbG9jYWwgX2JhPWNfYS5iZ0NvbG9yO2xvY2FsIGFiYT1jX2EuZmdDb2xvcjtsb2NhbCBiYmE7aWYoZGFhOmxlbigpPD0wKXRoZW4gYmJhPV9fYQpfYmE9Y2Qgb3IgX2JhO2FiYT1kZCBvciBhYmEgZW5kO2JiYT1fX2EKaWYoZGFhfj0iIil0aGVuIGJiYT1kYWEgZW5kO2JiYT1iYmE6c3ViKGFkLGFhYSthZC0xKWxvY2FsIGNiYT1hYWEtYmJhOmxlbigpaWYoY2JhPDApdGhlbgpjYmE9MCBlbmQ7aWYoY2M9PSJwYXNzd29yZCIpYW5kKGRhYX49IiIpdGhlbgpiYmE9c3RyaW5nLnJlcCgiKiIsYmJhOmxlbigpKWVuZApiYmE9YmJhLi5zdHJpbmcucmVwKGNfYS5iZ1N5bWJvbCxjYmEpCmNfYS5wYXJlbnQ6d3JpdGVUZXh0KGRfYSxfYWErIChuLTEpLGJiYSxfYmEsYWJhKWVuZCBlbmQ7aWYoY19hOmlzRm9jdXNlZCgpKXRoZW4KY19hLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2ErX2QtYWQsX2FhKwptYXRoLmZsb29yKGNfYTpnZXRIZWlnaHQoKS8yKSxjX2EuZmdDb2xvcillbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihjX2EpCmlmKApjX2EucGFyZW50fj1uaWwpdGhlbiBjX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsY19hKQpjX2EucGFyZW50OmFkZEV2ZW50KCJrZXkiLGNfYSljX2EucGFyZW50OmFkZEV2ZW50KCJjaGFyIixjX2EpCmNfYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjX2EpY19hLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsY19hKWVuZAppZihhYy5pbml0KGNfYSkpdGhlbgpjX2EuYmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJJbnB1dEJHIiljX2EuZmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJJbnB1dFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiX2EsYWMpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJDaGVja2JveCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJDaGVja2JveCJfYzpzZXRaSW5kZXgoNSkKX2M6c2V0VmFsdWUoZmFsc2UpX2Mud2lkdGg9MTtfYy5oZWlnaHQ9MTtsb2NhbCBiYz0iXDQyIgpsb2NhbCBjYz17Z2V0VHlwZT1mdW5jdGlvbihkYylyZXR1cm4gYWMgZW5kLHNldFN5bWJvbD1mdW5jdGlvbihkYyxfZCliYz1fZApkYzp1cGRhdGVEcmF3KClyZXR1cm4gZGMgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkYyxfZCxhZCxiZCkKaWYoX2MubW91c2VIYW5kbGVyKGRjLF9kLGFkLGJkKSl0aGVuCmlmKF9kPT0xKXRoZW4KaWYoCmRjOmdldFZhbHVlKCl+PXRydWUpYW5kKGRjOmdldFZhbHVlKCl+PWZhbHNlKXRoZW4KZGM6c2V0VmFsdWUoZmFsc2UpZWxzZSBkYzpzZXRWYWx1ZShub3QgZGM6Z2V0VmFsdWUoKSllbmQ7ZGM6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZDtyZXR1cm4gZmFsc2UgZW5kLHRvdWNoSGFuZGxlcj1mdW5jdGlvbihkYyxfZCxhZClyZXR1cm4KZGM6bW91c2VIYW5kbGVyKDEsX2QsYWQpZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihkYyxfZCkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGRjLF9kKQppZihjYigiY2hlY2tlZCIsX2Qpfj1uaWwpdGhlbiBpZihjYigiY2hlY2tlZCIsX2QpKXRoZW4gZGM6c2V0VmFsdWUodHJ1ZSllbHNlCmRjOnNldFZhbHVlKGZhbHNlKWVuZCBlbmQ7cmV0dXJuIGRjIGVuZCxkcmF3PWZ1bmN0aW9uKGRjKQppZgooX2MuZHJhdyhkYykpdGhlbgppZihkYy5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIF9kLGFkPWRjOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgYmQsY2Q9ZGM6Z2V0U2l6ZSgpbG9jYWwgZGQ9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oY2QsImNlbnRlciIpaWYKKGRjLmJnQ29sb3J+PWZhbHNlKXRoZW4KZGMucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9kLGFkLGJkLGNkLGRjLmJnQ29sb3IpZW5kCmZvciBuPTEsY2QgZG8KaWYobj09ZGQpdGhlbgppZihkYzpnZXRWYWx1ZSgpPT10cnVlKXRoZW4KZGMucGFyZW50OndyaXRlVGV4dChfZCwKYWQrIChuLTEpLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oYmMsYmQsImNlbnRlciIpLGRjLmJnQ29sb3IsZGMuZmdDb2xvcillbHNlCmRjLnBhcmVudDp3cml0ZVRleHQoX2QsYWQrIChuLTEpLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oIiAiLGJkLCJjZW50ZXIiKSxkYy5iZ0NvbG9yLGRjLmZnQ29sb3IpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihkYykKZGMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsZGMpZGMucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZGMpCmlmKF9jLmluaXQoZGMpKXRoZW4KZGMuYmdDb2xvcj1kYy5wYXJlbnQ6Z2V0VGhlbWUoIkNoZWNrYm94QkciKWRjLmZnQ29sb3I9ZGMucGFyZW50OmdldFRoZW1lKCJDaGVja2JveFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShjYyxfYyllbmQgZW5kCmFhWyJvYmplY3RzIl1bIlBhbmUiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpbG9jYWwgYmI9ZGEoImJhc2FsdExvZ3MiKQpyZXR1cm4KZnVuY3Rpb24oY2IpCmxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJQYW5lIgpsb2NhbCBhYz17Z2V0VHlwZT1mdW5jdGlvbihiYylyZXR1cm4gX2MgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYmMsY2MsZGMsX2QpZGIuc2V0QmFja2dyb3VuZChiYyxjYyxkYyxfZCkKcmV0dXJuIGJjIGVuZCxpbml0PWZ1bmN0aW9uKGJjKQppZihkYi5pbml0KGJjKSl0aGVuCmJjLmJnQ29sb3I9YmMucGFyZW50OmdldFRoZW1lKCJQYW5lQkciKWJjLmZnQ29sb3I9YmMucGFyZW50OmdldFRoZW1lKCJQYW5lQkciKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShhYyxkYillbmQgZW5kCmFhWyJvYmplY3RzIl1bIlByb2dyZXNzYmFyIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKQpsb2NhbCBiYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGNiKWxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJQcm9ncmVzc2JhciJsb2NhbCBhYz0wO2RiOnNldFpJbmRleCg1KQpkYjpzZXRWYWx1ZShmYWxzZSlkYi53aWR0aD0yNTtkYi5oZWlnaHQ9MTtsb2NhbCBiYztsb2NhbCBjYz0iImxvY2FsIGRjPWNvbG9ycy53aGl0ZTtsb2NhbCBfZD0iImxvY2FsIGFkPTAKbG9jYWwgYmQ9e2luaXQ9ZnVuY3Rpb24oY2QpCmlmCihkYi5pbml0KGNkKSl0aGVuIGNkLmJnQ29sb3I9Y2QucGFyZW50OmdldFRoZW1lKCJQcm9ncmVzc2JhckJHIikKY2QuZmdDb2xvcj1jZC5wYXJlbnQ6Z2V0VGhlbWUoIlByb2dyZXNzYmFyVGV4dCIpYmM9Y2QucGFyZW50OmdldFRoZW1lKCJQcm9ncmVzc2JhckFjdGl2ZUJHIillbmQgZW5kLGdldFR5cGU9ZnVuY3Rpb24oY2QpcmV0dXJuCl9jIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY2QsZGQpZGIuc2V0VmFsdWVzQnlYTUxEYXRhKGNkLGRkKWlmKGJiKCJkaXJlY3Rpb24iLGRkKX49Cm5pbCl0aGVuIGFkPWJiKCJkaXJlY3Rpb24iLGRkKWVuZAppZigKYmIoInByb2dyZXNzQ29sb3IiLGRkKX49bmlsKXRoZW4gYmM9Y29sb3JzW2JiKCJwcm9ncmVzc0NvbG9yIixkZCldZW5kCmlmKGJiKCJwcm9ncmVzc1N5bWJvbCIsZGQpfj1uaWwpdGhlbiBjYz1iYigicHJvZ3Jlc3NTeW1ib2wiLGRkKWVuZDtpZihiYigiYmFja2dyb3VuZFN5bWJvbCIsZGQpfj1uaWwpdGhlbgpfZD1iYigiYmFja2dyb3VuZFN5bWJvbCIsZGQpZW5kCmlmCihiYigicHJvZ3Jlc3NTeW1ib2xDb2xvciIsZGQpfj1uaWwpdGhlbiBkYz1jb2xvcnNbYmIoInByb2dyZXNzU3ltYm9sQ29sb3IiLGRkKV1lbmQ7aWYoYmIoIm9uRG9uZSIsZGQpfj1uaWwpdGhlbgpjZDpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oY2Qub25Qcm9ncmVzc0RvbmUsYmIoIm9uRG9uZSIsZGQpKWVuZDtyZXR1cm4gY2QgZW5kLHNldERpcmVjdGlvbj1mdW5jdGlvbihjZCxkZCkKYWQ9ZGQ7Y2Q6dXBkYXRlRHJhdygpcmV0dXJuIGNkIGVuZCxzZXRQcm9ncmVzc0Jhcj1mdW5jdGlvbihjZCxkZCxfX2EsYV9hKWJjPWRkIG9yIGJjCmNjPV9fYSBvciBjYztkYz1hX2Egb3IgZGM7Y2Q6dXBkYXRlRHJhdygpcmV0dXJuIGNkIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKGNkLGRkKQpfZD1kZDpzdWIoMSwxKWNkOnVwZGF0ZURyYXcoKXJldHVybiBjZCBlbmQsc2V0UHJvZ3Jlc3M9ZnVuY3Rpb24oY2QsZGQpaWYKKGRkPj0wKWFuZChkZDw9MTAwKWFuZChhY349ZGQpdGhlbiBhYz1kZDtjZDpzZXRWYWx1ZShhYylpZihhYz09MTAwKXRoZW4KY2Q6cHJvZ3Jlc3NEb25lSGFuZGxlcigpZW5kIGVuZApjZDp1cGRhdGVEcmF3KClyZXR1cm4gY2QgZW5kLGdldFByb2dyZXNzPWZ1bmN0aW9uKGNkKXJldHVybgphYyBlbmQsb25Qcm9ncmVzc0RvbmU9ZnVuY3Rpb24oY2QsZGQpY2Q6cmVnaXN0ZXJFdmVudCgicHJvZ3Jlc3NfZG9uZSIsZGQpCnJldHVybiBjZCBlbmQscHJvZ3Jlc3NEb25lSGFuZGxlcj1mdW5jdGlvbihjZCkKY2Q6c2VuZEV2ZW50KCJwcm9ncmVzc19kb25lIixjZCllbmQsZHJhdz1mdW5jdGlvbihjZCkKaWYoZGIuZHJhdyhjZCkpdGhlbgppZihjZC5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGRkLF9fYT1jZDpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYV9hLGJfYT1jZDpnZXRTaXplKClpZihjZC5iZ0NvbG9yfj1mYWxzZSl0aGVuCmNkLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkZCxfX2EsYV9hLGJfYSxjZC5iZ0NvbG9yKWVuZDtpZihfZH49IiIpdGhlbgpjZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYSxiX2EsX2QpZW5kO2lmKGNkLmZnQ29sb3J+PWZhbHNlKXRoZW4KY2QucGFyZW50OmRyYXdGb3JlZ3JvdW5kQm94KGRkLF9fYSxhX2EsYl9hLGNkLmZnQ29sb3IpZW5kCmlmKGFkPT0xKXRoZW4gY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLF9fYSxhX2EsCmJfYS8xMDAgKmFjLGJjKWNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCxfX2EsYV9hLApiX2EvMTAwICphYyxkYyljZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYSwKYl9hLzEwMCAqYWMsY2MpZWxzZWlmKGFkPT0yKXRoZW4KY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLApfX2ErbWF0aC5jZWlsKGJfYS1iX2EvMTAwICphYyksYV9hLGJfYS8xMDAgKmFjLGJjKQpjZC5wYXJlbnQ6ZHJhd0ZvcmVncm91bmRCb3goZGQsX19hK21hdGguY2VpbChiX2EtYl9hLzEwMCAqYWMpLGFfYSwKYl9hLzEwMCAqYWMsZGMpCmNkLnBhcmVudDpkcmF3VGV4dEJveChkZCxfX2ErbWF0aC5jZWlsKGJfYS1iX2EvMTAwICphYyksYV9hLApiX2EvMTAwICphYyxjYyllbHNlaWYoYWQ9PTMpdGhlbgpjZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goZGQrbWF0aC5jZWlsKGFfYS1hX2EvMTAwICphYyksX19hLAphX2EvMTAwICphYyxiX2EsYmMpCmNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCttYXRoLmNlaWwoYV9hLWFfYS8xMDAgKmFjKSxfX2EsCmFfYS8xMDAgKmFjLGJfYSxkYykKY2QucGFyZW50OmRyYXdUZXh0Qm94KGRkK21hdGguY2VpbChhX2EtYV9hLzEwMCAqYWMpLF9fYSwKYV9hLzEwMCAqYWMsYl9hLGNjKWVsc2UKY2QucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KGRkLF9fYSxhX2EvMTAwICphYyxiX2EsYmMpCmNkLnBhcmVudDpkcmF3Rm9yZWdyb3VuZEJveChkZCxfX2EsYV9hLzEwMCAqYWMsYl9hLGRjKQpjZC5wYXJlbnQ6ZHJhd1RleHRCb3goZGQsX19hLGFfYS8xMDAgKmFjLGJfYSxjYyllbmQgZW5kIGVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiZCxkYillbmQgZW5kCmFhWyJvYmplY3RzIl1bIkRyb3Bkb3duIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9YWIoZGIpbG9jYWwgYWM9IkRyb3Bkb3duIl9jLndpZHRoPTEyO19jLmhlaWdodD0xO19jOnNldFpJbmRleCg2KQpsb2NhbCBiYz17fWxvY2FsIGNjO2xvY2FsIGRjO2xvY2FsIF9kPXRydWU7bG9jYWwgYWQ9ImxlZnQibG9jYWwgYmQ9MDtsb2NhbCBjZD0xNjtsb2NhbCBkZD02O2xvY2FsIF9fYT0iXDE2ImxvY2FsIGFfYT0iXDMxImxvY2FsIGJfYT1mYWxzZQpsb2NhbCBjX2E9e2dldFR5cGU9ZnVuY3Rpb24oZF9hKXJldHVybgphYyBlbmQsc2V0VmFsdWVzQnlYTUxEYXRhPWZ1bmN0aW9uKGRfYSxfYWEpX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGRfYSxfYWEpCmlmKApjYigic2VsZWN0aW9uQkciLF9hYSl+PW5pbCl0aGVuIGNjPWNvbG9yc1tjYigic2VsZWN0aW9uQkciLF9hYSldZW5kO2lmKGNiKCJzZWxlY3Rpb25GRyIsX2FhKX49bmlsKXRoZW4KZGM9Y29sb3JzW2NiKCJzZWxlY3Rpb25GRyIsX2FhKV1lbmQ7aWYoY2IoImRyb3Bkb3duV2lkdGgiLF9hYSl+PW5pbCl0aGVuCmNkPWNiKCJkcm9wZG93bldpZHRoIixfYWEpZW5kO2lmKGNiKCJkcm9wZG93bkhlaWdodCIsX2FhKX49bmlsKXRoZW4KZGQ9Y2IoImRyb3Bkb3duSGVpZ2h0IixfYWEpZW5kO2lmKGNiKCJvZmZzZXQiLF9hYSl+PW5pbCl0aGVuCmJkPWNiKCJvZmZzZXQiLF9hYSllbmQKaWYoX2FhWyJpdGVtIl1+PW5pbCl0aGVuIGxvY2FsIGFhYT1fYWFbIml0ZW0iXWlmKAphYWEucHJvcGVydGllc349bmlsKXRoZW4gYWFhPXthYWF9ZW5kO2ZvciBiYWEsY2FhIGluIHBhaXJzKGFhYSlkbwpkX2E6YWRkSXRlbShjYigidGV4dCIsY2FhKSxjb2xvcnNbY2IoImJnIixjYWEpXSxjb2xvcnNbY2IoImZnIixjYWEpXSllbmQgZW5kIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oZF9hLF9hYSkKYmQ9X2FhO2RfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oZF9hKXJldHVybiBiZCBlbmQsYWRkSXRlbT1mdW5jdGlvbihkX2EsX2FhLGFhYSxiYWEsLi4uKQp0YWJsZS5pbnNlcnQoYmMse3RleHQ9X2FhLGJnQ29sPQphYWEgb3IgZF9hLmJnQ29sb3IsZmdDb2w9YmFhIG9yIGRfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWRfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxnZXRBbGw9ZnVuY3Rpb24oZF9hKXJldHVybgpiYyBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihkX2EsX2FhKXRhYmxlLnJlbW92ZShiYyxfYWEpZF9hOnVwZGF0ZURyYXcoKQpyZXR1cm4gZF9hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKGRfYSxfYWEpcmV0dXJuIGJjW19hYV1lbmQsZ2V0SXRlbUluZGV4PWZ1bmN0aW9uKGRfYSkKbG9jYWwgX2FhPWRfYTpnZXRWYWx1ZSgpZm9yIGFhYSxiYWEgaW4gcGFpcnMoYmMpZG8gaWYoYmFhPT1fYWEpdGhlbiByZXR1cm4gYWFhIGVuZCBlbmQgZW5kLGNsZWFyPWZ1bmN0aW9uKGRfYSkKYmM9e31kX2E6c2V0VmFsdWUoe30sZmFsc2UpZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLGdldEl0ZW1Db3VudD1mdW5jdGlvbihkX2EpcmV0dXJuCiNiYyBlbmQsZWRpdEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhLGNhYSwuLi4pdGFibGUucmVtb3ZlKGJjLF9hYSkKdGFibGUuaW5zZXJ0KGJjLF9hYSx7dGV4dD1hYWEsYmdDb2w9YmFhIG9yIGRfYS5iZ0NvbG9yLGZnQ29sPQpjYWEgb3IgZF9hLmZnQ29sb3IsYXJncz17Li4ufX0pZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLHNlbGVjdEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSlkX2E6c2V0VmFsdWUoCmJjW19hYV1vcnt9LGZhbHNlKWRfYTp1cGRhdGVEcmF3KClyZXR1cm4gZF9hIGVuZCxzZXRTZWxlY3RlZEl0ZW09ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhKWNjPQpfYWEgb3IgZF9hLmJnQ29sb3I7ZGM9YWFhIG9yIGRfYS5mZ0NvbG9yCl9kPWJhYX49bmlsIGFuZCBiYWE7ZF9hOnVwZGF0ZURyYXcoKXJldHVybiBkX2EgZW5kLHNldERyb3Bkb3duU2l6ZT1mdW5jdGlvbihkX2EsX2FhLGFhYSkKY2QsZGQ9X2FhLGFhYTtkX2E6dXBkYXRlRHJhdygpcmV0dXJuIGRfYSBlbmQsZ2V0RHJvcGRvd25TaXplPWZ1bmN0aW9uKGRfYSlyZXR1cm4gY2QsZGQgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihkX2EsX2FhLGFhYSxiYWEsY2FhKQppZgooYl9hKXRoZW4KbG9jYWwgZGFhLF9iYT1kX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihkX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKaWYoX2FhPT0xKXRoZW4KaWYoI2JjPjApdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihkYWE8PWFhYSlhbmQoZGFhK2NkPmFhYSlhbmQKKF9iYStuPT1iYWEpdGhlbiBkX2E6c2V0VmFsdWUoYmNbbitiZF0pCmRfYTp1cGRhdGVEcmF3KCkKbG9jYWwgYWJhPWRfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgibW91c2VfY2xpY2siLGRfYSwibW91c2VfY2xpY2siLGRpcixhYWEsYmFhKWlmKGNhYSl0aGVuIGRfYTptb3VzZVVwSGFuZGxlcihfYWEsYWFhLGJhYSllbmQ7aWYoYWJhPT0KZmFsc2UpdGhlbiByZXR1cm4gYWJhIGVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZAppZihfYy5tb3VzZUhhbmRsZXIoZF9hLF9hYSxhYWEsYmFhKSl0aGVuIGJfYT0obm90IGJfYSlkX2E6dXBkYXRlRHJhdygpCnJldHVybiB0cnVlIGVsc2UgaWYoYl9hKXRoZW4gZF9hOnVwZGF0ZURyYXcoKWJfYT1mYWxzZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCBlbmQsbW91c2VVcEhhbmRsZXI9ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhKQppZgooYl9hKXRoZW4KbG9jYWwgY2FhLGRhYT1kX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihkX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKaWYoX2FhPT0xKXRoZW4KaWYoI2JjPjApdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihjYWE8PWFhYSlhbmQoY2FhK2NkPmFhYSlhbmQKKGRhYStuPT1iYWEpdGhlbiBiX2E9ZmFsc2U7ZF9hOnVwZGF0ZURyYXcoKQpsb2NhbCBfYmE9ZF9hOmdldEV2ZW50U3lzdGVtKCk6c2VuZEV2ZW50KCJtb3VzZV91cCIsZF9hLCJtb3VzZV91cCIsZGlyLGFhYSxiYWEpaWYoX2JhPT1mYWxzZSl0aGVuIHJldHVybiBfYmEgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxzY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKGRfYSxfYWEsYWFhLGJhYSkKaWYKKGJfYSlhbmQoZF9hOmlzRm9jdXNlZCgpKXRoZW4gYmQ9YmQrX2FhO2lmKGJkPDApdGhlbiBiZD0wIGVuZDtpZihfYWE9PTEpdGhlbgppZigjYmM+ZGQpdGhlbiBpZihiZD4KI2JjLWRkKXRoZW4gYmQ9I2JjLWRkIGVuZCBlbHNlIGJkPW1hdGgubWluKCNiYy0xLDApZW5kIGVuZApsb2NhbCBjYWE9ZF9hOmdldEV2ZW50U3lzdGVtKCk6c2VuZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGRfYSwibW91c2Vfc2Nyb2xsIixfYWEsYWFhLGJhYSlpZihjYWE9PWZhbHNlKXRoZW4gcmV0dXJuIGNhYSBlbmQ7ZF9hOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhdz1mdW5jdGlvbihkX2EpCmlmCihfYy5kcmF3KGRfYSkpdGhlbiBsb2NhbCBfYWEsYWFhPWRfYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmFhLGNhYT1kX2E6Z2V0U2l6ZSgpCmlmKApkX2EucGFyZW50fj1uaWwpdGhlbiBpZihkX2EuYmdDb2xvcn49ZmFsc2UpdGhlbgpkX2EucGFyZW50OmRyYXdCYWNrZ3JvdW5kQm94KF9hYSxhYWEsYmFhLGNhYSxkX2EuYmdDb2xvcillbmQ7bG9jYWwgZGFhPWRfYTpnZXRWYWx1ZSgpCmxvY2FsIF9iYT1iYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKCgKZGFhfj1uaWwgYW5kIGRhYS50ZXh0IG9yIiIpLGJhYSxhZCk6c3ViKDEsCmJhYS0xKS4uIChiX2EgYW5kIGFfYSBvciBfX2EpCmRfYS5wYXJlbnQ6d3JpdGVUZXh0KF9hYSxhYWEsX2JhLGRfYS5iZ0NvbG9yLGRfYS5mZ0NvbG9yKQppZihiX2EpdGhlbgpmb3Igbj0xLGRkIGRvCmlmKGJjW24rYmRdfj1uaWwpdGhlbgppZihiY1tuK2JkXT09ZGFhKXRoZW4KaWYoX2QpdGhlbgpkX2EucGFyZW50OndyaXRlVGV4dChfYWEsYWFhK24sYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1sKbitiZF0udGV4dCxjZCxhZCksY2MsZGMpZWxzZQpkX2EucGFyZW50OndyaXRlVGV4dChfYWEsYWFhK24sYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNkLGFkKSxiY1sKbitiZF0uYmdDb2wsYmNbbitiZF0uZmdDb2wpZW5kIGVsc2UKZF9hLnBhcmVudDp3cml0ZVRleHQoX2FhLGFhYStuLGJiLmdldFRleHRIb3Jpem9udGFsQWxpZ24oYmNbbitiZF0udGV4dCxjZCxhZCksYmNbCm4rYmRdLmJnQ29sLGJjW24rYmRdLmZnQ29sKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGRfYSkKZF9hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGRfYSlkX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsZF9hKQpkX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGRfYSkKaWYoX2MuaW5pdChkX2EpKXRoZW4KZF9hLmJnQ29sb3I9ZF9hLnBhcmVudDpnZXRUaGVtZSgiRHJvcGRvd25CRyIpZF9hLmZnQ29sb3I9ZF9hLnBhcmVudDpnZXRUaGVtZSgiRHJvcGRvd25UZXh0IikKY2M9ZF9hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uQkciKWRjPWRfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvblRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShjX2EsX2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJMYWJlbCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgZGI9YmIuY3JlYXRlVGV4dDtsb2NhbCBfYz1kYSgidEhleCIpbG9jYWwgYWM9ZGEoImJpZ2ZvbnQiKQpyZXR1cm4KZnVuY3Rpb24oYmMpbG9jYWwgY2M9YWIoYmMpCmxvY2FsIGRjPSJMYWJlbCJjYzpzZXRaSW5kZXgoMylsb2NhbCBfZD10cnVlO2NjOnNldFZhbHVlKCJMYWJlbCIpY2Mud2lkdGg9NQpsb2NhbCBhZD0ibGVmdCJsb2NhbCBiZD0idG9wImxvY2FsIGNkPTA7bG9jYWwgZGQsX19hPWZhbHNlLGZhbHNlCmxvY2FsIGFfYT17Z2V0VHlwZT1mdW5jdGlvbihiX2EpcmV0dXJuIGRjIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGJfYSxjX2EpY19hPXRvc3RyaW5nKGNfYSkKY2M6c2V0VmFsdWUoY19hKQppZihfZCl0aGVuIGxvY2FsIGRfYT1iX2EucGFyZW50OmdldE9mZnNldCgpCmlmKApjX2E6bGVuKCkrYl9hOmdldFgoKT5iX2EucGFyZW50OmdldFdpZHRoKCkrZF9hKXRoZW4gbG9jYWwgX2FhPQpiX2EucGFyZW50OmdldFdpZHRoKCkrZF9hLWJfYTpnZXRYKCljYy5zZXRTaXplKGJfYSxfYWEsCiNkYihjX2EsX2FhKSllbHNlCmNjLnNldFNpemUoYl9hLGNfYTpsZW4oKSwxKWVuZCBlbmQ7Yl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYl9hLGNfYSkKY2Muc2V0QmFja2dyb3VuZChiX2EsY19hKV9fYT10cnVlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRGb3JlZ3JvdW5kPWZ1bmN0aW9uKGJfYSxjX2EpCmNjLnNldEZvcmVncm91bmQoYl9hLGNfYSlkZD10cnVlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRUZXh0QWxpZ249ZnVuY3Rpb24oYl9hLGNfYSxkX2EpYWQ9CmNfYSBvciBhZDtiZD1kX2Egb3IgYmQ7Yl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEZvbnRTaXplPWZ1bmN0aW9uKGJfYSxjX2EpaWYoCmNfYT4wKWFuZChjX2E8PTQpdGhlbiBjZD1jX2EtMSBvciAwIGVuZApiX2E6dXBkYXRlRHJhdygpcmV0dXJuIGJfYSBlbmQsZ2V0Rm9udFNpemU9ZnVuY3Rpb24oYl9hKXJldHVybiBjZCsxIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYl9hLGNfYSkKY2Muc2V0VmFsdWVzQnlYTUxEYXRhKGJfYSxjX2EpCmlmKGNiKCJ0ZXh0IixjX2Epfj1uaWwpdGhlbiBiX2E6c2V0VGV4dChjYigidGV4dCIsY19hKSllbmQKaWYoY2IoInZlcnRpY2FsQWxpZ24iLGNfYSl+PW5pbCl0aGVuIGJkPWNiKCJ2ZXJ0aWNhbEFsaWduIixjX2EpZW5kO2lmKGNiKCJob3Jpem9udGFsQWxpZ24iLGNfYSl+PW5pbCl0aGVuCmFkPWNiKCJob3Jpem9udGFsQWxpZ24iLGNfYSllbmQ7aWYoY2IoImZvbnQiLGNfYSl+PW5pbCl0aGVuCmJfYTpzZXRGb250U2l6ZShjYigiZm9udCIsY19hKSllbmQ7cmV0dXJuIGJfYSBlbmQsc2V0U2l6ZT1mdW5jdGlvbihiX2EsY19hLGRfYSxfYWEpCmNjLnNldFNpemUoYl9hLGNfYSxkX2EsX2FhKV9kPWZhbHNlO2JfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oYl9hLGNfYSkKaWYoCmNfYT09ImJhc2FsdF9yZXNpemUiKXRoZW4KaWYoX2QpdGhlbiBsb2NhbCBkX2E9Yl9hOmdldFZhbHVlKCkKaWYoCmRfYTpsZW4oKStiX2E6Z2V0WCgpPmJfYS5wYXJlbnQ6Z2V0V2lkdGgoKSl0aGVuIGxvY2FsIF9hYT0KYl9hLnBhcmVudDpnZXRXaWR0aCgpLWJfYTpnZXRYKCkKY2Muc2V0U2l6ZShiX2EsX2FhLCNkYihkX2EsX2FhKSllbHNlIGNjLnNldFNpemUoYl9hLGRfYTpsZW4oKSwxKWVuZCBlbHNlIGVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oYl9hKQppZgooY2MuZHJhdyhiX2EpKXRoZW4KaWYoYl9hLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgY19hLGRfYT1iX2E6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYWEsYWFhPWJfYTpnZXRTaXplKClsb2NhbCBiYWE9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oYWFhLGJkKQppZihjZD09MCl0aGVuCmlmIG5vdChfZCl0aGVuCmxvY2FsIGNhYT1kYihiX2E6Z2V0VmFsdWUoKSxiX2E6Z2V0V2lkdGgoKSkKZm9yIGRhYSxfYmEgaW4gcGFpcnMoY2FhKWRvIGlmKGRhYTw9YWFhKXRoZW4KYl9hLnBhcmVudDp3cml0ZVRleHQoY19hLGRfYStkYWEtMSxfYmEsYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmlmCigjYl9hOmdldFZhbHVlKCkrY19hPmJfYS5wYXJlbnQ6Z2V0V2lkdGgoKSl0aGVuIGxvY2FsIGNhYT1kYihiX2E6Z2V0VmFsdWUoKSxiX2E6Z2V0V2lkdGgoKSkKZm9yIGRhYSxfYmEgaW4KcGFpcnMoY2FhKWRvIGlmKGRhYTw9YWFhKXRoZW4KYl9hLnBhcmVudDp3cml0ZVRleHQoY19hLGRfYStkYWEtMSxfYmEsYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmJfYS5wYXJlbnQ6d3JpdGVUZXh0KGNfYSxkX2EsYl9hOmdldFZhbHVlKCksYl9hLmJnQ29sb3IsYl9hLmZnQ29sb3IpZW5kIGVuZCBlbHNlCmxvY2FsIGNhYT1hYyhjZCxiX2E6Z2V0VmFsdWUoKSxiX2EuZmdDb2xvcixiX2EuYmdDb2xvciBvciBjb2xvcnMubGlnaHRHcmF5KQppZihfZCl0aGVuIGJfYTpzZXRTaXplKCNjYWFbMV1bMV0sI2NhYVsxXS0xKWVuZDtsb2NhbCBkYWEsX2JhPWJfYS5wYXJlbnQ6Z2V0U2l6ZSgpCmxvY2FsIGFiYSxiYmE9I2NhYVsxXVsxXSwjY2FhWzFdCmNfYT1jX2Egb3IgbWF0aC5mbG9vcigoZGFhLWFiYSkvMikrMQpkX2E9ZF9hIG9yIG1hdGguZmxvb3IoKF9iYS1iYmEpLzIpKzEKZm9yIGk9MSxiYmEgZG8KYl9hLnBhcmVudDpzZXRGRyhjX2EsZF9hK2ktMSxjYWFbMl1baV0pYl9hLnBhcmVudDpzZXRCRyhjX2EsZF9hK2ktMSxjYWFbM11baV0pYl9hLnBhcmVudDpzZXRUZXh0KGNfYSwKZF9hK2ktMSxjYWFbMV1baV0pZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGJfYSkKYl9hLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGJfYSkKaWYoY2MuaW5pdChiX2EpKXRoZW4KYl9hLmJnQ29sb3I9Yl9hLnBhcmVudDpnZXRUaGVtZSgiTGFiZWxCRyIpYl9hLmZnQ29sb3I9Yl9hLnBhcmVudDpnZXRUaGVtZSgiTGFiZWxUZXh0IikKaWYKKApiX2EucGFyZW50LmJnQ29sb3I9PWNvbG9ycy5ibGFjaylhbmQoYl9hLmZnQ29sb3I9PWNvbG9ycy5ibGFjayl0aGVuIGJfYS5mZ0NvbG9yPWNvbG9ycy5saWdodEdyYXkgZW5kIGVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShhX2EsY2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJUaHJlYWQiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihiYilsb2NhbCBjYgpsb2NhbCBkYj0iVGhyZWFkImxvY2FsIF9jO2xvY2FsIGFjO2xvY2FsIGJjPWZhbHNlO2xvY2FsIGNjCmxvY2FsIGRjPWZ1bmN0aW9uKF9kLGFkKQppZihhZDpzdWIoMSwxKT09IiMiKXRoZW4KbG9jYWwgYmQ9X2Q6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChhZDpzdWIoMixhZDpsZW4oKSkpCmlmKGJkfj1uaWwpYW5kKGJkLmludGVybmFsT2JqZXRDYWxsfj1uaWwpdGhlbiByZXR1cm4oZnVuY3Rpb24oKQpiZDppbnRlcm5hbE9iamV0Q2FsbCgpZW5kKWVuZCBlbHNlIHJldHVybiBfZDpnZXRCYXNlRnJhbWUoKTpnZXRWYXJpYWJsZShhZCllbmQ7cmV0dXJuIF9kIGVuZApjYj17bmFtZT1iYixnZXRUeXBlPWZ1bmN0aW9uKF9kKXJldHVybiBkYiBlbmQsZ2V0WkluZGV4PWZ1bmN0aW9uKF9kKXJldHVybiAxIGVuZCxnZXROYW1lPWZ1bmN0aW9uKF9kKXJldHVybiBfZC5uYW1lIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oX2QpaWYKKF9kLnBhcmVudH49bmlsKXRoZW4gcmV0dXJuIF9kLnBhcmVudDpnZXRCYXNlRnJhbWUoKWVuZApyZXR1cm4gX2QgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfZCxhZClsb2NhbCBiZDtpZihhYigidGhyZWFkIixhZCl+PW5pbCl0aGVuCmJkPWRjKF9kLGFiKCJ0aHJlYWQiLGFkKSllbmQKaWYoYWIoInN0YXJ0IixhZCl+PW5pbCl0aGVuIGlmCihhYigic3RhcnQiLGFkKSlhbmQoYmR+PW5pbCl0aGVuIF9kOnN0YXJ0KGJkKWVuZCBlbmQ7cmV0dXJuIF9kIGVuZCxzdGFydD1mdW5jdGlvbihfZCxhZCkKaWYoCmFkPT1uaWwpdGhlbiBlcnJvcigiRnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhyZWFkIGlzIG5pbCIpZW5kO19jPWFkO2FjPWNvcm91dGluZS5jcmVhdGUoX2MpYmM9dHJ1ZTtjYz1uaWwKbG9jYWwgYmQsY2Q9Y29yb3V0aW5lLnJlc3VtZShhYyljYz1jZDtpZiBub3QoYmQpdGhlbiBpZihjZH49IlRlcm1pbmF0ZWQiKXRoZW4KZXJyb3IoIlRocmVhZCBFcnJvciBPY2N1cnJlZCAtICIuLmNkKWVuZCBlbmQKX2QucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsX2QpX2QucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsX2QpCl9kLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixfZClfZC5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoImtleSIsX2QpX2QucGFyZW50OmFkZEV2ZW50KCJrZXlfdXAiLF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLF9kKV9kLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLF9kKXJldHVybiBfZCBlbmQsZ2V0U3RhdHVzPWZ1bmN0aW9uKF9kLGFkKWlmKAphY349bmlsKXRoZW4gcmV0dXJuIGNvcm91dGluZS5zdGF0dXMoYWMpZW5kO3JldHVybiBuaWwgZW5kLHN0b3A9ZnVuY3Rpb24oX2QsYWQpCmJjPWZhbHNlO19kLnBhcmVudDpyZW1vdmVFdmVudCgibW91c2VfY2xpY2siLF9kKQpfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm1vdXNlX3VwIixfZClfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm1vdXNlX3Njcm9sbCIsX2QpCl9kLnBhcmVudDpyZW1vdmVFdmVudCgibW91c2VfZHJhZyIsX2QpX2QucGFyZW50OnJlbW92ZUV2ZW50KCJrZXkiLF9kKQpfZC5wYXJlbnQ6cmVtb3ZlRXZlbnQoImtleV91cCIsX2QpX2QucGFyZW50OnJlbW92ZUV2ZW50KCJjaGFyIixfZCkKX2QucGFyZW50OnJlbW92ZUV2ZW50KCJvdGhlcl9ldmVudCIsX2QpcmV0dXJuIF9kIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoIm1vdXNlX2NsaWNrIiwuLi4pZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKF9kLC4uLilfZDpldmVudEhhbmRsZXIoIm1vdXNlX3VwIiwuLi4pZW5kLG1vdXNlU2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pCl9kOmV2ZW50SGFuZGxlcigibW91c2Vfc2Nyb2xsIiwuLi4pZW5kLG1vdXNlRHJhZ0hhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoIm1vdXNlX2RyYWciLC4uLillbmQsbW91c2VNb3ZlSGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pCl9kOmV2ZW50SGFuZGxlcigibW91c2VfbW92ZSIsLi4uKWVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKF9kLC4uLilfZDpldmVudEhhbmRsZXIoImtleSIsLi4uKWVuZCxrZXlVcEhhbmRsZXI9ZnVuY3Rpb24oX2QsLi4uKQpfZDpldmVudEhhbmRsZXIoImtleV91cCIsLi4uKWVuZCxjaGFySGFuZGxlcj1mdW5jdGlvbihfZCwuLi4pX2Q6ZXZlbnRIYW5kbGVyKCJjaGFyIiwuLi4pZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihfZCxhZCwuLi4pCmlmCihiYyl0aGVuCmlmKGNvcm91dGluZS5zdGF0dXMoYWMpPT0ic3VzcGVuZGVkIil0aGVuIGlmKGNjfj1uaWwpdGhlbiBpZihhZH49Y2MpdGhlbiByZXR1cm4gZW5kO2NjPQpuaWwgZW5kCmxvY2FsIGJkLGNkPWNvcm91dGluZS5yZXN1bWUoYWMsYWQsLi4uKWNjPWNkO2lmIG5vdChiZCl0aGVuIGlmKGNkfj0iVGVybWluYXRlZCIpdGhlbgplcnJvcigiVGhyZWFkIEVycm9yIE9jY3VycmVkIC0gIi4uY2QpZW5kIGVuZCBlbHNlCl9kOnN0b3AoKWVuZCBlbmQgZW5kfWNiLl9faW5kZXg9Y2I7cmV0dXJuIGNiIGVuZCBlbmQKYWFbIm9iamVjdHMiXVsiVGV4dGZpZWxkIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ0SGV4IikKbG9jYWwgY2I9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGRiPWRhKCJiYXNhbHRMb2dzIikKbG9jYWwgX2MsYWMsYmMsY2MsZGM9c3RyaW5nLnJlcCxzdHJpbmcuZmluZCxzdHJpbmcuZ21hdGNoLHN0cmluZy5zdWIsc3RyaW5nLmxlbgpyZXR1cm4KZnVuY3Rpb24oX2QpbG9jYWwgYWQ9YWIoX2QpbG9jYWwgYmQ9IlRleHRmaWVsZCJsb2NhbCBjZCxkZCxfX2EsYV9hPTEsMSwxLDE7bG9jYWwgYl9hPXsiIn1sb2NhbCBjX2E9eyIifWxvY2FsIGRfYT17IiJ9CmxvY2FsIF9hYT17fWxvY2FsIGFhYT17fWxvY2FsIGJhYSxjYWEsZGFhLF9iYTtsb2NhbCBhYmEsYmJhPWNvbG9ycy5saWdodEJsdWUsY29sb3JzLmJsYWNrO2FkLndpZHRoPTMwCmFkLmhlaWdodD0xMjthZDpzZXRaSW5kZXgoNSlsb2NhbCBmdW5jdGlvbiBjYmEoKQppZgooYmFhfj1uaWwpYW5kKGNhYX49bmlsKWFuZChkYWF+PW5pbClhbmQoX2Jhfj1uaWwpdGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZApsb2NhbCBmdW5jdGlvbiBkYmEoKWxvY2FsIGFkYSxiZGEsY2RhLGRkYQppZgooY2JhKCkpdGhlbiBpZihiYWE+Y2FhKXRoZW4gYWRhLGJkYT1jYWEsYmFhIGVsc2UgYWRhLGJkYT1iYWEsY2FhIGVuZDtpZihkYWE+X2JhKXRoZW4KY2RhLGRkYT1fYmEsZGFhIGVsc2UgY2RhLGRkYT1kYWEsX2JhIGVuZCBlbmQ7cmV0dXJuIGFkYSxiZGEsY2RhLGRkYSBlbmQ7bG9jYWwgZnVuY3Rpb24gX2NhKCllbmQKbG9jYWwgZnVuY3Rpb24gYWNhKGFkYSlsb2NhbCBiZGEsY2RhLGRkYSxfX2I9ZGJhKGFkYSkKZm9yIG49X19iLGRkYSwtMSBkbwppZihuPT1kZGEpb3Iobj09X19iKXRoZW4gbG9jYWwgYV9iPWJfYVtuXQpsb2NhbCBiX2I9Y19hW25dbG9jYWwgY19iPWRfYVtuXQppZihuPT1kZGEpYW5kKG49PV9fYil0aGVuIGFfYj1hX2I6c3ViKDEsYmRhLTEpLi4KYV9iOnN1YihjZGErMSxhX2I6bGVuKCkpYl9iPWJfYjpzdWIoMSxiZGEtMSkuLgpiX2I6c3ViKGNkYSsxLGJfYjpsZW4oKSljX2I9Y19iOnN1YigxLGJkYS0xKS4uCmNfYjpzdWIoY2RhKzEsY19iOmxlbigpKWVsc2VpZihuPT1iZGEpdGhlbgphX2I9YV9iOnN1YigxLGJkYSliX2I9Yl9iOnN1YigxLGJkYSljX2I9Y19iOnN1YigxLGJkYSllbHNlaWYobj09ZGRhKXRoZW4KYV9iPWFfYjpzdWIoY2RhLGFfYjpsZW4oKSliX2I9Yl9iOnN1YihjZGEsYl9iOmxlbigpKQpjX2I9Y19iOnN1YihjZGEsY19iOmxlbigpKWVuZDtiX2Fbbl09YV9iO2NfYVtuXT1iX2I7ZF9hW25dPWNfYiBlbHNlIHRhYmxlLnJlbW92ZShiX2EsbikKdGFibGUucmVtb3ZlKGNfYSxuKXRhYmxlLnJlbW92ZShkX2EsbillbmQgZW5kO19fYSxhX2E9YmFhLGRhYTtiYWEsY2FhLGRhYSxfYmE9bmlsLG5pbCxuaWwsbmlsO3JldHVybiBhZGEgZW5kCmxvY2FsIGZ1bmN0aW9uIGJjYShhZGEsYmRhKWxvY2FsIGNkYT17fQppZihhZGE6bGVuKCk+MCl0aGVuCmZvciBkZGEgaW4gYmMoYWRhLGJkYSlkbyBsb2NhbCBfX2IsYV9iPWFjKGFkYSxkZGEpCmlmCihfX2J+PW5pbClhbmQoYV9ifj1uaWwpdGhlbiB0YWJsZS5pbnNlcnQoY2RhLF9fYil0YWJsZS5pbnNlcnQoY2RhLGFfYikKbG9jYWwgYl9iPWNjKGFkYSwxLChfX2ItMSkpbG9jYWwgY19iPWNjKGFkYSxhX2IrMSxhZGE6bGVuKCkpYWRhPWJfYi4uICgiOiIpOnJlcChkZGE6bGVuKCkpLi4KY19iIGVuZCBlbmQgZW5kO3JldHVybiBjZGEgZW5kCmxvY2FsIGZ1bmN0aW9uIGNjYShhZGEsYmRhKWJkYT1iZGEgb3IgYV9hCmxvY2FsIGNkYT1iYlthZGEuZmdDb2xvcl06cmVwKGRfYVtiZGFdOmxlbigpKQpsb2NhbCBkZGE9YmJbYWRhLmJnQ29sb3JdOnJlcChjX2FbYmRhXTpsZW4oKSkKZm9yIF9fYixhX2IgaW4gcGFpcnMoYWFhKWRvIGxvY2FsIGJfYj1iY2EoYl9hW2JkYV0sYV9iWzFdKQppZigjYl9iPjApdGhlbgpmb3IgeD0xLCNiX2IvMiBkbwpsb2NhbCBjX2I9eCoyIC0xO2lmKGFfYlsyXX49bmlsKXRoZW4KY2RhPWNkYTpzdWIoMSxiX2JbY19iXS0xKS4uYmJbYV9iWzJdXTpyZXAoYl9iW2NfYisxXS0gKApiX2JbY19iXS0xKSkuLgpjZGE6c3ViKGJfYltjX2IrMV0rMSxjZGE6bGVuKCkpZW5kO2lmCihhX2JbM11+PW5pbCl0aGVuCmRkYT1kZGE6c3ViKDEsYl9iW2NfYl0tMSkuLgoKYmJbYV9iWzNdXTpyZXAoYl9iW2NfYisxXS0gKGJfYltjX2JdLTEpKS4uZGRhOnN1YihiX2JbY19iKzFdKzEsZGRhOmxlbigpKWVuZCBlbmQgZW5kIGVuZApmb3IgX19iLGFfYiBpbiBwYWlycyhfYWEpZG8KZm9yIGJfYixjX2IgaW4gcGFpcnMoYV9iKWRvIGxvY2FsIGRfYj1iY2EoYl9hW2JkYV0sY19iKQppZigjZF9iPjApdGhlbiBmb3IgeD0xLCNkX2IvMiBkbwpsb2NhbCBfYWI9eCoyIC0xCmNkYT1jZGE6c3ViKDEsZF9iW19hYl0tMSkuLgoKYmJbX19iXTpyZXAoZF9iW19hYisxXS0gKGRfYltfYWJdLTEpKS4uY2RhOnN1YihkX2JbX2FiKzFdKzEsY2RhOmxlbigpKWVuZCBlbmQgZW5kIGVuZDtkX2FbYmRhXT1jZGE7Y19hW2JkYV09ZGRhO2FkYTp1cGRhdGVEcmF3KCllbmQ7bG9jYWwgZnVuY3Rpb24gZGNhKGFkYSlmb3Igbj0xLCNiX2EgZG8gY2NhKGFkYSxuKWVuZCBlbmQKbG9jYWwgX2RhPXtnZXRUeXBlPWZ1bmN0aW9uKGFkYSlyZXR1cm4gYmQgZW5kLHNldEJhY2tncm91bmQ9ZnVuY3Rpb24oYWRhLGJkYSkKYWQuc2V0QmFja2dyb3VuZChhZGEsYmRhKWRjYShhZGEpcmV0dXJuIGFkYSBlbmQsc2V0Rm9yZWdyb3VuZD1mdW5jdGlvbihhZGEsYmRhKQphZC5zZXRGb3JlZ3JvdW5kKGFkYSxiZGEpZGNhKGFkYSlyZXR1cm4gYWRhIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYWRhLGJkYSkKYWQuc2V0VmFsdWVzQnlYTUxEYXRhKGFkYSxiZGEpCmlmKGJkYVsibGluZXMiXX49bmlsKXRoZW4gbG9jYWwgY2RhPWJkYVsibGluZXMiXVsibGluZSJdaWYKKGNkYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBjZGE9e2NkYX1lbmQ7Zm9yIGRkYSxfX2IgaW4gcGFpcnMoY2RhKWRvCmFkYTphZGRMaW5lKF9fYjp2YWx1ZSgpKWVuZCBlbmQKaWYoYmRhWyJrZXl3b3JkcyJdfj1uaWwpdGhlbgpmb3IgY2RhLGRkYSBpbiBwYWlycyhiZGFbImtleXdvcmRzIl0pZG8KaWYoY29sb3JzW2NkYV1+PW5pbCl0aGVuCmxvY2FsIF9fYj1kZGE7aWYoX19iLnByb3BlcnRpZXN+PW5pbCl0aGVuIF9fYj17X19ifWVuZDtsb2NhbCBhX2I9e30KZm9yIGJfYixjX2IgaW4gcGFpcnMoX19iKWRvCmxvY2FsIGRfYj1jX2JbImtleXdvcmQiXWlmKGNfYlsia2V5d29yZCJdLnByb3BlcnRpZXN+PW5pbCl0aGVuCmRfYj17Y19iWyJrZXl3b3JkIl19ZW5kO2ZvciBfYWIsYWFiIGluIHBhaXJzKGRfYilkbwp0YWJsZS5pbnNlcnQoYV9iLGFhYjp2YWx1ZSgpKWVuZCBlbmQ7YWRhOmFkZEtleXdvcmRzKGNvbG9yc1tjZGFdLGFfYillbmQgZW5kIGVuZAppZihiZGFbInJ1bGVzIl1+PW5pbCl0aGVuCmlmKGJkYVsicnVsZXMiXVsicnVsZSJdfj1uaWwpdGhlbgpsb2NhbCBjZGE9YmRhWyJydWxlcyJdWyJydWxlIl1pZihiZGFbInJ1bGVzIl1bInJ1bGUiXS5wcm9wZXJ0aWVzfj1uaWwpdGhlbgpjZGE9e2JkYVsicnVsZXMiXVsicnVsZSJdfWVuZApmb3IgZGRhLF9fYiBpbiBwYWlycyhjZGEpZG8gaWYoY2IoInBhdHRlcm4iLF9fYil+PW5pbCl0aGVuCmFkYTphZGRSdWxlKGNiKCJwYXR0ZXJuIixfX2IpLGNvbG9yc1tjYigiZmciLF9fYildLGNvbG9yc1tjYigiYmciLF9fYildKWVuZCBlbmQgZW5kIGVuZCBlbmQsZ2V0TGluZXM9ZnVuY3Rpb24oYWRhKXJldHVybgpiX2EgZW5kLGdldExpbmU9ZnVuY3Rpb24oYWRhLGJkYSlyZXR1cm4gYl9hW2JkYV1lbmQsZWRpdExpbmU9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpCmJfYVtiZGFdPWNkYSBvciBiX2FbYmRhXWNjYShhZGEsYmRhKWFkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxjbGVhcj1mdW5jdGlvbihhZGEpCmJfYT17IiJ9Y19hPXsiIn1kX2E9eyIifWJhYSxjYWEsZGFhLF9iYT1uaWwsbmlsLG5pbCxuaWw7Y2QsZGQsX19hLGFfYT0xLDEsMSwxCmFkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxhZGRMaW5lPWZ1bmN0aW9uKGFkYSxiZGEsY2RhKQppZgooYmRhfj1uaWwpdGhlbgppZigjYl9hPT0xKWFuZChiX2FbMV09PSIiKXRoZW4gYl9hWzFdPWJkYQpjX2FbMV09YmJbYWRhLmJnQ29sb3JdOnJlcChiZGE6bGVuKCkpZF9hWzFdPWJiW2FkYS5mZ0NvbG9yXTpyZXAoYmRhOmxlbigpKQpjY2EoYWRhLDEpcmV0dXJuIGFkYSBlbmQKaWYoY2Rhfj1uaWwpdGhlbiB0YWJsZS5pbnNlcnQoYl9hLGNkYSxiZGEpCnRhYmxlLmluc2VydChjX2EsY2RhLGJiW2FkYS5iZ0NvbG9yXTpyZXAoYmRhOmxlbigpKSkKdGFibGUuaW5zZXJ0KGRfYSxjZGEsYmJbYWRhLmZnQ29sb3JdOnJlcChiZGE6bGVuKCkpKWVsc2UgdGFibGUuaW5zZXJ0KGJfYSxiZGEpCnRhYmxlLmluc2VydChjX2EsYmJbYWRhLmJnQ29sb3JdOnJlcChiZGE6bGVuKCkpKQp0YWJsZS5pbnNlcnQoZF9hLGJiW2FkYS5mZ0NvbG9yXTpyZXAoYmRhOmxlbigpKSllbmQgZW5kO2NjYShhZGEsY2RhIG9yI2JfYSlhZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQsYWRkS2V5d29yZHM9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpaWYoCl9hYVtiZGFdPT1uaWwpdGhlbiBfYWFbYmRhXT17fWVuZDtmb3IgZGRhLF9fYiBpbiBwYWlycyhjZGEpZG8KdGFibGUuaW5zZXJ0KF9hYVtiZGFdLF9fYillbmQ7YWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLGFkZFJ1bGU9ZnVuY3Rpb24oYWRhLGJkYSxjZGEsZGRhKQp0YWJsZS5pbnNlcnQoYWFhLHtiZGEsY2RhLGRkYX0pYWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLGVkaXRSdWxlPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSlmb3IgX19iLGFfYiBpbgpwYWlycyhhYWEpZG8KaWYoYV9iWzFdPT1iZGEpdGhlbiBhYWFbX19iXVsyXT1jZGE7YWFhW19fYl1bM109ZGRhIGVuZCBlbmQ7YWRhOnVwZGF0ZURyYXcoKXJldHVybiBhZGEgZW5kLHJlbW92ZVJ1bGU9ZnVuY3Rpb24oYWRhLGJkYSkKZm9yIGNkYSxkZGEgaW4KcGFpcnMoYWFhKWRvIGlmKGRkYVsxXT09YmRhKXRoZW4gdGFibGUucmVtb3ZlKGFhYSxjZGEpZW5kIGVuZDthZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQsc2V0S2V5d29yZHM9ZnVuY3Rpb24oYWRhLGJkYSxjZGEpCl9hYVtiZGFdPWNkYTthZGE6dXBkYXRlRHJhdygpcmV0dXJuIGFkYSBlbmQscmVtb3ZlTGluZT1mdW5jdGlvbihhZGEsYmRhKQppZigjYl9hPjEpdGhlbiB0YWJsZS5yZW1vdmUoYl9hLApiZGEgb3IjYl9hKQp0YWJsZS5yZW1vdmUoY19hLGJkYSBvciNjX2EpdGFibGUucmVtb3ZlKGRfYSxiZGEgb3IjZF9hKWVsc2UgYl9hPXsiIn1jX2E9eyIifWRfYT17IiJ9ZW5kO2FkYTp1cGRhdGVEcmF3KClyZXR1cm4gYWRhIGVuZCxnZXRUZXh0Q3Vyc29yPWZ1bmN0aW9uKGFkYSlyZXR1cm4KX19hLGFfYSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGFkYSlhZC5nZXRGb2N1c0hhbmRsZXIoYWRhKQppZihhZGEucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBiZGEsY2RhPWFkYTpnZXRBbmNob3JQb3NpdGlvbigpaWYoYWRhLnBhcmVudH49bmlsKXRoZW4KYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxiZGErX19hLWRkLGNkYSthX2EtY2QsYWRhLmZnQ29sb3IpZW5kIGVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihhZGEpCmFkLmxvc2VGb2N1c0hhbmRsZXIoYWRhKQppZihhZGEucGFyZW50fj1uaWwpdGhlbiBhZGEucGFyZW50OnNldEN1cnNvcihmYWxzZSllbmQgZW5kLGtleUhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSkKaWYKKGFkLmtleUhhbmRsZXIoYWRhLGV2ZW50LGJkYSkpdGhlbiBsb2NhbCBjZGEsZGRhPWFkYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX19iLGFfYj1hZGE6Z2V0U2l6ZSgpCmlmKGJkYT09CmtleXMuYmFja3NwYWNlKXRoZW4KaWYoYl9hW2FfYV09PSIiKXRoZW4KaWYoYV9hPjEpdGhlbiB0YWJsZS5yZW1vdmUoYl9hLGFfYSkKdGFibGUucmVtb3ZlKGRfYSxhX2EpdGFibGUucmVtb3ZlKGNfYSxhX2EpCl9fYT1iX2FbYV9hLTFdOmxlbigpKzE7ZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZDthX2E9YV9hLTEgZW5kIGVsc2VpZihfX2E8PTEpdGhlbgppZihhX2E+MSl0aGVuIF9fYT1iX2FbYV9hLTFdOmxlbigpKzEKZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZDtiX2FbYV9hLTFdPWJfYVthX2EtMV0uLmJfYVthX2FdZF9hWwphX2EtMV09ZF9hW2FfYS0xXS4uZF9hW2FfYV1jX2FbYV9hLTFdPWNfYVthX2EtMV0uLgpjX2FbYV9hXXRhYmxlLnJlbW92ZShiX2EsYV9hKQp0YWJsZS5yZW1vdmUoZF9hLGFfYSl0YWJsZS5yZW1vdmUoY19hLGFfYSlhX2E9YV9hLTEgZW5kIGVsc2UgYl9hW2FfYV09Yl9hW2FfYV06c3ViKDEsX19hLTIpLi4KYl9hW2FfYV06c3ViKF9fYSxiX2FbYV9hXTpsZW4oKSkKZF9hW2FfYV09ZF9hW2FfYV06c3ViKDEsCl9fYS0yKS4uZF9hW2FfYV06c3ViKF9fYSxkX2FbYV9hXTpsZW4oKSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMikuLgpjX2FbYV9hXTpzdWIoX19hLGNfYVthX2FdOmxlbigpKWlmKF9fYT4xKXRoZW4KX19hPV9fYS0xIGVuZDtpZihkZD4xKXRoZW4gaWYoX19hPGRkKXRoZW4gZGQ9ZGQtMSBlbmQgZW5kIGVuZDtpZihhX2E8Y2QpdGhlbiBjZD1jZC0xIGVuZDtjY2EoYWRhKWFkYTpzZXRWYWx1ZSgiIillbmQKaWYoYmRhPT1rZXlzLmRlbGV0ZSl0aGVuCmlmKGNiYSgpKXRoZW4gYWNhKGFkYSllbHNlCmlmKF9fYT5iX2FbYV9hXTpsZW4oKSl0aGVuCmlmKApiX2FbYV9hKzFdfj1uaWwpdGhlbiBiX2FbYV9hXT1iX2FbYV9hXS4uYl9hW2FfYSsxXQp0YWJsZS5yZW1vdmUoYl9hLGFfYSsxKXRhYmxlLnJlbW92ZShjX2EsYV9hKzEpdGFibGUucmVtb3ZlKGRfYSxhX2ErMSllbmQgZWxzZSBiX2FbYV9hXT1iX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgpiX2FbYV9hXTpzdWIoX19hKzEsYl9hW2FfYV06bGVuKCkpCmRfYVthX2FdPWRfYVthX2FdOnN1YigxLApfX2EtMSkuLmRfYVthX2FdOnN1YihfX2ErMSxkX2FbYV9hXTpsZW4oKSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgpjX2FbYV9hXTpzdWIoX19hKzEsY19hW2FfYV06bGVuKCkpZW5kIGVuZDtjY2EoYWRhKWVuZAppZihiZGE9PWtleXMuZW50ZXIpdGhlbgp0YWJsZS5pbnNlcnQoYl9hLGFfYSsxLGJfYVthX2FdOnN1YihfX2EsYl9hW2FfYV06bGVuKCkpKQp0YWJsZS5pbnNlcnQoZF9hLGFfYSsxLGRfYVthX2FdOnN1YihfX2EsZF9hW2FfYV06bGVuKCkpKQp0YWJsZS5pbnNlcnQoY19hLGFfYSsxLGNfYVthX2FdOnN1YihfX2EsY19hW2FfYV06bGVuKCkpKWJfYVthX2FdPWJfYVthX2FdOnN1YigxLF9fYS0xKQpkX2FbYV9hXT1kX2FbYV9hXTpzdWIoMSxfX2EtMSljX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSlhX2E9YV9hKzE7X19hPTE7ZGQ9MTtpZihhX2EtY2Q+PQphX2IpdGhlbiBjZD1jZCsxIGVuZDthZGE6c2V0VmFsdWUoIiIpZW5kCmlmKGJkYT09a2V5cy51cCl0aGVuCmlmKGFfYT4xKXRoZW4gYV9hPWFfYS0xO2lmKF9fYT5iX2FbYV9hXTpsZW4oKSsxKXRoZW4gX19hPQpiX2FbYV9hXTpsZW4oKSsxIGVuZAppZihkZD4xKXRoZW4gaWYoX19hPGRkKXRoZW4KZGQ9X19hLV9fYisxO2lmKGRkPDEpdGhlbiBkZD0xIGVuZCBlbmQgZW5kO2lmKGNkPjEpdGhlbiBpZihhX2E8Y2QpdGhlbiBjZD1jZC0xIGVuZCBlbmQgZW5kIGVuZAppZihiZGE9PWtleXMuZG93bil0aGVuCmlmKGFfYTwjYl9hKXRoZW4gYV9hPWFfYSsxO2lmCihfX2E+Yl9hW2FfYV06bGVuKCkrMSl0aGVuIF9fYT1iX2FbYV9hXTpsZW4oKSsxIGVuZAppZihkZD4xKXRoZW4gaWYKKF9fYTxkZCl0aGVuIGRkPV9fYS1fX2IrMTtpZihkZDwxKXRoZW4gZGQ9MSBlbmQgZW5kIGVuZDtpZihhX2E+PWNkK2FfYil0aGVuIGNkPWNkKzEgZW5kIGVuZCBlbmQKaWYoYmRhPT1rZXlzLnJpZ2h0KXRoZW4gX19hPV9fYSsxCmlmKGFfYTwjYl9hKXRoZW4gaWYKKF9fYT5iX2FbYV9hXTpsZW4oKSsxKXRoZW4gX19hPTE7YV9hPWFfYSsxIGVuZCBlbHNlaWYoX19hPmJfYVthX2FdOmxlbigpKXRoZW4gX19hPQpiX2FbYV9hXTpsZW4oKSsxIGVuZDtpZihfX2E8MSl0aGVuIF9fYT0xIGVuZAppZihfX2E8ZGQpb3IoX19hPj1fX2IrZGQpdGhlbiBkZD1fX2EtX19iKzEgZW5kO2lmKGRkPDEpdGhlbiBkZD0xIGVuZCBlbmQKaWYoYmRhPT1rZXlzLmxlZnQpdGhlbiBfX2E9X19hLTE7aWYoX19hPj0xKXRoZW4KaWYoX19hPGRkKW9yKF9fYT49X19iK2RkKXRoZW4gZGQ9X19hIGVuZCBlbmQKaWYoYV9hPjEpdGhlbiBpZihfX2E8MSl0aGVuIGFfYT1hX2EtMQpfX2E9Yl9hW2FfYV06bGVuKCkrMTtkZD1fX2EtX19iKzEgZW5kIGVuZDtpZihfX2E8MSl0aGVuIF9fYT0xIGVuZDtpZihkZDwxKXRoZW4gZGQ9MSBlbmQgZW5kCmlmIG5vdAooIChjZGErX19hLWRkPj1jZGEgYW5kIGNkYStfX2EtZGQ8Y2RhK19fYilhbmQoCmRkYSthX2EtY2Q+PWRkYSBhbmQgZGRhK2FfYS1jZDxkZGErYV9iKSl0aGVuIGRkPW1hdGgubWF4KDEsCmJfYVthX2FdOmxlbigpLV9fYisxKQpjZD1tYXRoLm1heCgxLGFfYS1hX2IrMSllbmQ7bG9jYWwgYl9iPQooX19hPD1iX2FbYV9hXTpsZW4oKWFuZCBfX2EtMSBvciBiX2FbYV9hXTpsZW4oKSktIChkZC0xKQppZihiX2I+CmFkYTpnZXRYKCkrX19iLTEpdGhlbiBiX2I9YWRhOmdldFgoKStfX2ItMSBlbmQKbG9jYWwgY19iPShhX2EtY2Q8YV9iIGFuZCBhX2EtY2Qgb3IgYV9hLWNkLTEpaWYoYl9iPDEpdGhlbiBiX2I9MCBlbmQKYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxjZGErYl9iLGRkYStjX2IsYWRhLmZnQ29sb3IpYWRhOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsY2hhckhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSkKaWYKKGFkLmNoYXJIYW5kbGVyKGFkYSxiZGEpKXRoZW4gbG9jYWwgY2RhLGRkYT1hZGE6Z2V0QW5jaG9yUG9zaXRpb24oKWxvY2FsIF9fYixhX2I9YWRhOmdldFNpemUoKWJfYVthX2FdPWJfYVthX2FdOnN1YigxLApfX2EtMSkuLgpiZGEuLmJfYVthX2FdOnN1YihfX2EsYl9hW2FfYV06bGVuKCkpCmRfYVthX2FdPWRfYVthX2FdOnN1YigxLApfX2EtMSkuLmJiW2FkYS5mZ0NvbG9yXS4uCmRfYVthX2FdOnN1YihfX2EsZF9hW2FfYV06bGVuKCkpCmNfYVthX2FdPWNfYVthX2FdOnN1YigxLF9fYS0xKS4uYmJbYWRhLmJnQ29sb3JdLi4KY19hW2FfYV06c3ViKF9fYSxjX2FbYV9hXTpsZW4oKSlfX2E9X19hKzE7aWYoX19hPj1fX2IrZGQpdGhlbiBkZD1kZCsxIGVuZDtjY2EoYWRhKQphZGE6c2V0VmFsdWUoIiIpCmlmIG5vdAooIChjZGErX19hLWRkPj1jZGEgYW5kIGNkYStfX2EtZGQ8Y2RhK19fYilhbmQoCmRkYSthX2EtY2Q+PWRkYSBhbmQgZGRhK2FfYS1jZDxkZGErYV9iKSl0aGVuIGRkPW1hdGgubWF4KDEsCmJfYVthX2FdOmxlbigpLV9fYisxKQpjZD1tYXRoLm1heCgxLGFfYS1hX2IrMSllbmQ7bG9jYWwgYl9iPQooX19hPD1iX2FbYV9hXTpsZW4oKWFuZCBfX2EtMSBvciBiX2FbYV9hXTpsZW4oKSktIChkZC0xKQppZihiX2I+CmFkYTpnZXRYKCkrX19iLTEpdGhlbiBiX2I9YWRhOmdldFgoKStfX2ItMSBlbmQKbG9jYWwgY19iPShhX2EtY2Q8YV9iIGFuZCBhX2EtY2Qgb3IgYV9hLWNkLTEpaWYoYl9iPDEpdGhlbiBiX2I9MCBlbmQ7aWYoY2JhKCkpdGhlbiBhY2EoYWRhKWVuZDthZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGNkYStiX2IsCmRkYStjX2IsYWRhLmZnQ29sb3IpCmFkYTp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSkKaWYKKGFkLmRyYWdIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWFkYTpnZXRTaXplKCkKaWYoYl9hWwpkZGEtYV9iK2NkXX49bmlsKXRoZW4KaWYKKGJfYitkX2I+Yl9iK2NkYS0gKF9fYisxKStkZClhbmQoYl9iPGJfYitjZGEtX19iK2RkKXRoZW4KX19hPWNkYS1fX2IrZGQ7YV9hPWRkYS1hX2IrY2Q7Y2FhPV9fYTtfYmE9YV9hO2lmKF9fYT5iX2FbYV9hXTpsZW4oKSl0aGVuIF9fYT0KYl9hW2FfYV06bGVuKCkrMTtjYWE9X19hIGVuZDtpZihfX2E8ZGQpdGhlbiBkZD1fX2EtMTtpZgooZGQ8MSl0aGVuIGRkPTEgZW5kIGVuZDthZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGJfYitfX2EtZGQsCmNfYithX2EtY2QsYWRhLmZnQ29sb3IpCmFkYTp1cGRhdGVEcmF3KCllbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihhZGEsYmRhLGNkYSxkZGEpCmlmCihhZC5zY3JvbGxIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKClsb2NhbCBkX2IsX2FiPWFkYTpnZXRTaXplKCkKY2Q9Y2QrYmRhO2lmKGNkPiNiX2EtIChfYWItMSkpdGhlbiBjZD0jYl9hLSAoX2FiLTEpZW5kO2lmCihjZDwxKXRoZW4gY2Q9MSBlbmQKaWYKCihfX2IrX19hLWRkPj1fX2IgYW5kIF9fYitfX2EtZGQ8X19iK2RfYilhbmQoY19iK2FfYS1jZD49Y19iIGFuZCBjX2IrYV9hLWNkPGNfYitfYWIpdGhlbgphZGEucGFyZW50OnNldEN1cnNvcih0cnVlLGJfYitfX2EtZGQsY19iK2FfYS1jZCxhZGEuZmdDb2xvcillbHNlIGFkYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZDthZGE6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oYWRhLGJkYSxjZGEsZGRhKQppZgooYWQubW91c2VIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKaWYKKGJfYVtkZGEtYV9iK2NkXX49bmlsKXRoZW4gX19hPWNkYS1fX2IrZGQ7YV9hPWRkYS1hX2IrY2Q7Y2FhPW5pbDtfYmE9bmlsO2JhYT1fX2E7ZGFhPWFfYQppZihfX2E+CmJfYVthX2FdOmxlbigpKXRoZW4gX19hPWJfYVthX2FdOmxlbigpKzE7YmFhPV9fYSBlbmQ7aWYoX19hPGRkKXRoZW4gZGQ9X19hLTE7aWYoZGQ8MSl0aGVuIGRkPTEgZW5kIGVuZAphZGE6dXBkYXRlRHJhdygpZW5kO2lmKGFkYS5wYXJlbnR+PW5pbCl0aGVuCmFkYS5wYXJlbnQ6c2V0Q3Vyc29yKHRydWUsYl9iK19fYS1kZCxjX2IrYV9hLWNkLGFkYS5mZ0NvbG9yKWVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKGFkYSxiZGEsY2RhLGRkYSkKaWYKKGFkLm1vdXNlVXBIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSkpdGhlbgpsb2NhbCBfX2IsYV9iPWFkYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGFkYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGJfYixjX2I9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKaWYKKGJfYVtkZGEtYV9iK2NkXX49bmlsKXRoZW4gY2FhPWNkYS1fX2IrZGQ7X2JhPWRkYS1hX2IrY2Q7aWYoY2FhPmJfYVtfYmFdOmxlbigpKXRoZW4gY2FhPQpiX2FbX2JhXTpsZW4oKSsxIGVuZDtpZihiYWE9PWNhYSlhbmQoZGFhPT1fYmEpdGhlbiBiYWEsY2FhLGRhYSxfYmE9Cm5pbCxuaWwsbmlsLG5pbCBlbmQKYWRhOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gdHJ1ZSBlbmQgZW5kLGV2ZW50SGFuZGxlcj1mdW5jdGlvbihhZGEsYmRhLGNkYSxkZGEsX19iLGFfYikKYWQuZXZlbnRIYW5kbGVyKGFkYSxiZGEsY2RhLGRkYSxfX2IsYV9iKQppZihiZGE9PSJwYXN0ZSIpdGhlbgppZihhZGE6aXNGb2N1c2VkKCkpdGhlbiBsb2NhbCBiX2IsY19iPWFkYTpnZXRTaXplKCliX2FbYV9hXT1iX2FbYV9hXTpzdWIoMSwKX19hLTEpLi4KY2RhLi5iX2FbYV9hXTpzdWIoX19hLGJfYVthX2FdOmxlbigpKQpkX2FbYV9hXT1kX2FbYV9hXTpzdWIoMSwKX19hLTEpLi5iYlthZGEuZmdDb2xvcl06cmVwKGNkYTpsZW4oKSkuLgpkX2FbYV9hXTpzdWIoX19hLGRfYVthX2FdOmxlbigpKQpjX2FbYV9hXT1jX2FbYV9hXTpzdWIoMSxfX2EtMSkuLgoKYmJbYWRhLmJnQ29sb3JdOnJlcChjZGE6bGVuKCkpLi5jX2FbYV9hXTpzdWIoX19hLGNfYVthX2FdOmxlbigpKV9fYT1fX2ErY2RhOmxlbigpCmlmKF9fYT49Yl9iK2RkKXRoZW4gZGQ9KF9fYSsxKS1iX2IgZW5kO2xvY2FsIGRfYixfYWI9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKYWRhLnBhcmVudDpzZXRDdXJzb3IodHJ1ZSxkX2IrX19hLWRkLF9hYisKYV9hLWNkLGFkYS5mZ0NvbG9yKWNjYShhZGEpYWRhOnVwZGF0ZURyYXcoKWVuZCBlbmQgZW5kLHNldFNlbGVjdGlvbkNvbG9yPWZ1bmN0aW9uKGFkYSxiZGEsY2RhKWFiYT0KYmRhIG9yIGFiYTtiYmE9Y2RhIG9yIGJiYTtyZXR1cm4gYWRhIGVuZCxkcmF3PWZ1bmN0aW9uKGFkYSkKaWYKKGFkLmRyYXcoYWRhKSl0aGVuCmlmKGFkYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGJkYSxjZGE9YWRhOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgZGRhLF9fYj1hZGE6Z2V0U2l6ZSgpCmZvciBuPTEsX19iIGRvIGxvY2FsIGFfYj0iImxvY2FsIGJfYj0iImxvY2FsIGNfYj0iIgppZihiX2FbbitjZC0xXX49bmlsKXRoZW4gYV9iPWJfYVtuK2NkLTFdY19iPWRfYVsKbitjZC0xXWJfYj1jX2FbbitjZC0xXWVuZDthX2I9YV9iOnN1YihkZCxkZGErZGQtMSkKYl9iPWJfYjpzdWIoZGQsZGRhK2RkLTEpY19iPWNfYjpzdWIoZGQsZGRhK2RkLTEpbG9jYWwgZF9iPWRkYS1hX2I6bGVuKClpZihkX2I8MCl0aGVuCmRfYj0wIGVuZDthX2I9YV9iLi5fYyhhZGEuYmdTeW1ib2wsZF9iKWJfYj1iX2IuLgpfYyhiYlthZGEuYmdDb2xvcl0sZF9iKQpjX2I9Y19iLi5fYyhiYlthZGEuZmdDb2xvcl0sZF9iKWFkYS5wYXJlbnQ6c2V0VGV4dChiZGEsY2RhK24tMSxhX2IpYWRhLnBhcmVudDpzZXRCRyhiZGEsCmNkYStuLTEsYl9iKQphZGEucGFyZW50OnNldEZHKGJkYSxjZGErbi0xLGNfYillbmQKaWYoYWRhOmlzRm9jdXNlZCgpKXRoZW4gbG9jYWwgYV9iLGJfYj1hZGE6Z2V0QW5jaG9yUG9zaXRpb24oKWVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGFkYSkKYWRhLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGFkYSlhZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV91cCIsYWRhKQphZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGFkYSlhZGEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixhZGEpCmFkYS5wYXJlbnQ6YWRkRXZlbnQoImtleSIsYWRhKWFkYS5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLGFkYSkKYWRhLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGFkYSkKaWYoYWQuaW5pdChhZGEpKXRoZW4KYWRhLmJnQ29sb3I9YWRhLnBhcmVudDpnZXRUaGVtZSgiVGV4dGZpZWxkQkciKWFkYS5mZ0NvbG9yPWFkYS5wYXJlbnQ6Z2V0VGhlbWUoIlRleHRmaWVsZFRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShfZGEsYWQpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJTY3JvbGxiYXIiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpCmxvY2FsIGJiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTApyZXR1cm4KZnVuY3Rpb24oY2IpbG9jYWwgZGI9YWIoY2IpbG9jYWwgX2M9IlNjcm9sbGJhciJkYi53aWR0aD0xO2RiLmhlaWdodD04O2RiOnNldFZhbHVlKDEpCmRiOnNldFpJbmRleCgyKWxvY2FsIGFjPSJ2ZXJ0aWNhbCJsb2NhbCBiYz0iICJsb2NhbCBjYztsb2NhbCBkYz0iXDEyNyJsb2NhbCBfZD1kYi5oZWlnaHQ7bG9jYWwgYWQ9MTtsb2NhbCBiZD0xCmxvY2FsIGZ1bmN0aW9uIGNkKF9fYSxhX2EsYl9hLGNfYSkKbG9jYWwgZF9hLF9hYT1fX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihfX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBhYWEsYmFhPV9fYTpnZXRTaXplKCkKaWYoYWM9PSJob3Jpem9udGFsIil0aGVuCmZvciBfaW5kZXg9MCxhYWEgZG8KaWYKKGRfYStfaW5kZXg9PWJfYSlhbmQoX2FhPD1jX2EpYW5kKF9hYStiYWE+Y19hKXRoZW4KYWQ9bWF0aC5taW4oX2luZGV4KzEsYWFhLSAoYmQtMSkpX19hOnNldFZhbHVlKF9kL2FhYSogKGFkKSlfX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3IgX2luZGV4PTAsYmFhIGRvCmlmCihfYWErX2luZGV4PT1jX2EpYW5kKGRfYTw9Yl9hKWFuZChkX2ErYWFhPmJfYSl0aGVuIGFkPW1hdGgubWluKF9pbmRleCsxLGJhYS0gKGJkLTEpKQpfX2E6c2V0VmFsdWUoX2QvYmFhKiAoYWQpKV9fYTp1cGRhdGVEcmF3KCllbmQgZW5kIGVuZCBlbmQKbG9jYWwgZGQ9e2dldFR5cGU9ZnVuY3Rpb24oX19hKXJldHVybiBfYyBlbmQsc2V0U3ltYm9sPWZ1bmN0aW9uKF9fYSxhX2EpYmM9YV9hOnN1YigxLDEpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfX2EsYV9hKQpkYi5zZXRWYWx1ZXNCeVhNTERhdGEoX19hLGFfYSkKaWYoYmIoIm1heFZhbHVlIixhX2Epfj1uaWwpdGhlbiBfZD1iYigibWF4VmFsdWUiLGFfYSllbmQ7aWYoYmIoImJhY2tncm91bmRTeW1ib2wiLGFfYSl+PW5pbCl0aGVuCmRjPWJiKCJiYWNrZ3JvdW5kU3ltYm9sIixhX2EpOnN1YigxLDEpZW5kO2lmKGJiKCJzeW1ib2wiLGFfYSl+PW5pbCl0aGVuCmJjPWJiKCJzeW1ib2wiLGFfYSk6c3ViKDEsMSllbmQ7aWYoYmIoImJhclR5cGUiLGFfYSl+PW5pbCl0aGVuCmFjPWJiKCJiYXJUeXBlIixhX2EpOmxvd2VyKCllbmQ7aWYoYmIoInN5bWJvbFNpemUiLGFfYSl+PW5pbCl0aGVuCl9fYTpzZXRTeW1ib2xTaXplKGJiKCJzeW1ib2xTaXplIixhX2EpKWVuZDtpZihiYigic3ltYm9sQ29sb3IiLGFfYSl+PW5pbCl0aGVuCmNjPWNvbG9yc1tiYigic3ltYm9sQ29sb3IiLGFfYSldZW5kO2lmKGJiKCJpbmRleCIsYV9hKX49bmlsKXRoZW4KX19hOnNldEluZGV4KGJiKCJpbmRleCIsYV9hKSllbmQgZW5kLHNldEluZGV4PWZ1bmN0aW9uKF9fYSxhX2EpCmFkPWFfYTtpZihhZDwxKXRoZW4gYWQ9MSBlbmQ7bG9jYWwgYl9hLGNfYT1fX2E6Z2V0U2l6ZSgpCmFkPW1hdGgubWluKGFkLCgKYWM9PSJ2ZXJ0aWNhbCJhbmQgY19hIG9yIGJfYSktIChiZC0xKSkKX19hOnNldFZhbHVlKF9kLyAoYWM9PSJ2ZXJ0aWNhbCJhbmQgY19hIG9yIGJfYSkqYWQpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLGdldEluZGV4PWZ1bmN0aW9uKF9fYSlyZXR1cm4KYWQgZW5kLHNldFN5bWJvbFNpemU9ZnVuY3Rpb24oX19hLGFfYSliZD10b251bWJlcihhX2Epb3IgMQpsb2NhbCBiX2EsY19hPV9fYTpnZXRTaXplKCkKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpfX2E6c2V0VmFsdWUoYWQtMSAqIChfZC8gKGNfYS0gKGJkLTEpKSktIChfZC8gKGNfYS0KKGJkLTEpKSkpZWxzZWlmKGFjPT0iaG9yaXpvbnRhbCIpdGhlbgpfX2E6c2V0VmFsdWUoYWQtMSAqIChfZC8gKGJfYS0gKGJkLTEpKSktIChfZC8gKGJfYS0gKApiZC0xKSkpKWVuZDtfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2V0TWF4VmFsdWU9ZnVuY3Rpb24oX19hLGFfYSkKX2Q9YV9hO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKF9fYSxhX2EpCmRjPXN0cmluZy5zdWIoYV9hLDEsMSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oX19hLGFfYSljYz1hX2EKX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldEJhclR5cGU9ZnVuY3Rpb24oX19hLGFfYSlhYz1hX2E6bG93ZXIoKQpfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSlpZihkYi5tb3VzZUhhbmRsZXIoX19hLGFfYSxiX2EsY19hKSl0aGVuCmNkKF9fYSxhX2EsYl9hLGNfYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmFnSGFuZGxlcj1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpaWYKKGRiLmRyYWdIYW5kbGVyKF9fYSxhX2EsYl9hLGNfYSkpdGhlbiBjZChfX2EsYV9hLGJfYSxjX2EpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpCmlmCihkYi5zY3JvbGxIYW5kbGVyKF9fYSxhX2EsYl9hLGNfYSkpdGhlbiBsb2NhbCBkX2EsX2FhPV9fYTpnZXRTaXplKClhZD1hZCthX2E7aWYoYWQ8MSl0aGVuIGFkPTEgZW5kCmFkPW1hdGgubWluKGFkLCgKYWM9PSJ2ZXJ0aWNhbCJhbmQgX2FhIG9yIGRfYSktIChiZC0xKSkKX19hOnNldFZhbHVlKF9kLyAoYWM9PSJ2ZXJ0aWNhbCJhbmQgX2FhIG9yIGRfYSkqYWQpX19hOnVwZGF0ZURyYXcoKWVuZCBlbmQsZHJhdz1mdW5jdGlvbihfX2EpCmlmCihkYi5kcmF3KF9fYSkpdGhlbgppZihfX2EucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhX2EsYl9hPV9fYTpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGNfYSxkX2E9X19hOmdldFNpemUoKQppZihhYz09Imhvcml6b250YWwiKXRoZW4KX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYSxkYzpyZXAoYWQtMSksX19hLmJnQ29sb3IsX19hLmZnQ29sb3IpCl9fYS5wYXJlbnQ6d3JpdGVUZXh0KGFfYSthZC0xLGJfYSxiYzpyZXAoYmQpLGNjLGNjKQpfX2EucGFyZW50OndyaXRlVGV4dChhX2ErYWQrYmQtMSxiX2EsZGM6cmVwKGNfYS0gKGFkK2JkLTEpKSxfX2EuYmdDb2xvcixfX2EuZmdDb2xvcillbmQKaWYoYWM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3Igbj0wLGRfYS0xIGRvCmlmKGFkPT1uKzEpdGhlbgpmb3IgY3VySW5kZXhPZmZzZXQ9MCxtYXRoLm1pbihiZC0xLGRfYSlkbyBfX2EucGFyZW50OndyaXRlVGV4dChhX2EsYl9hK24rCmN1ckluZGV4T2Zmc2V0LGJjLGNjLGNjKWVuZCBlbHNlIGlmKG4rMSA8YWQpb3IobisxID5hZC0xICtiZCl0aGVuCl9fYS5wYXJlbnQ6d3JpdGVUZXh0KGFfYSxiX2ErbixkYyxfX2EuYmdDb2xvcixfX2EuZmdDb2xvcillbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihfX2EpCl9fYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixfX2EpX19hLnBhcmVudDphZGRFdmVudCgibW91c2VfZHJhZyIsX19hKQpfX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLF9fYSkKaWYoZGIuaW5pdChfX2EpKXRoZW4KX19hLmJnQ29sb3I9X19hLnBhcmVudDpnZXRUaGVtZSgiU2Nyb2xsYmFyQkciKV9fYS5mZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIlNjcm9sbGJhclRleHQiKQpjYz1fX2EucGFyZW50OmdldFRoZW1lKCJTY3JvbGxiYXJTeW1ib2xDb2xvciIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKGRkLGRiKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiUHJvZ3JhbSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidEhleCIpCmxvY2FsIGNiPWRhKCJwcm9jZXNzIilsb2NhbCBkYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUw7bG9jYWwgX2M9c3RyaW5nLnN1YgpyZXR1cm4KZnVuY3Rpb24oYWMsYmMpbG9jYWwgY2M9YWIoYWMpCmxvY2FsIGRjPSJQcm9ncmFtImNjOnNldFpJbmRleCg1KWxvY2FsIF9kO2xvY2FsIGFkO2xvY2FsIGJkPXt9CmxvY2FsIGZ1bmN0aW9uIGNkKGJhYSxjYWEsZGFhLF9iYSxhYmEpbG9jYWwgYmJhLGNiYT0xLDEKbG9jYWwgZGJhLF9jYT1jb2xvcnMuYmxhY2ssY29sb3JzLndoaXRlO2xvY2FsIGFjYT1mYWxzZTtsb2NhbCBiY2E9ZmFsc2U7bG9jYWwgY2NhPXt9bG9jYWwgZGNhPXt9bG9jYWwgX2RhPXt9bG9jYWwgYWRhPXt9bG9jYWwgYmRhO2xvY2FsIGNkYT17fWZvciBpPTAsMTUgZG8gbG9jYWwgYWJiPTIgXmkKYWRhW2FiYl09e2JjOmdldEJhc2FsdEluc3RhbmNlKCkuZ2V0QmFzZVRlcm0oKS5nZXRQYWxldHRlQ29sb3VyKGFiYil9ZW5kO2xvY2FsIGZ1bmN0aW9uIGRkYSgpCmJkYT0oIiAiKTpyZXAoZGFhKQpmb3Igbj0wLDE1IGRvIGxvY2FsIGFiYj0yIF5uO2xvY2FsIGJiYj1iYlthYmJdY2RhW2FiYl09YmJiOnJlcChkYWEpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfX2IoKWRkYSgpbG9jYWwgYWJiPWJkYQpsb2NhbCBiYmI9Y2RhW2NvbG9ycy53aGl0ZV1sb2NhbCBjYmI9Y2RhW2NvbG9ycy5ibGFja10KZm9yIG49MSxfYmEgZG8KY2NhW25dPV9jKGNjYVtuXT09bmlsIGFuZCBhYmIgb3IgY2NhW25dLi5hYmI6c3ViKDEsCmRhYS1jY2Fbbl06bGVuKCkpLDEsZGFhKQpfZGFbbl09X2MoX2RhW25dPT1uaWwgYW5kIGJiYiBvciBfZGFbbl0uLgpiYmI6c3ViKDEsZGFhLV9kYVtuXTpsZW4oKSksMSxkYWEpCmRjYVtuXT1fYyhkY2Fbbl09PW5pbCBhbmQgY2JiIG9yIGRjYVtuXS4uCmNiYjpzdWIoMSxkYWEtZGNhW25dOmxlbigpKSwxLGRhYSllbmQ7Y2MudXBkYXRlRHJhdyhjYyllbmQ7X19iKClsb2NhbCBmdW5jdGlvbiBhX2IoKWlmCmJiYT49MSBhbmQgY2JhPj0xIGFuZCBiYmE8PWRhYSBhbmQgY2JhPD1fYmEgdGhlbiBlbHNlIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYl9iKGFiYixiYmIsY2JiKQpsb2NhbCBkYmI9YmJhO2xvY2FsIF9jYj1kYmIrI2FiYi0xCmlmIGNiYT49MSBhbmQgY2JhPD1fYmEgdGhlbgppZiBkYmI8PWRhYSBhbmQgX2NiPj0xIHRoZW4KaWYgZGJiPT0xIGFuZCBfY2I9PQpkYWEgdGhlbiBjY2FbY2JhXT1hYmI7X2RhW2NiYV09YmJiO2RjYVtjYmFdPWNiYiBlbHNlIGxvY2FsIGFjYixiY2IsY2NiCmlmIGRiYjwxIHRoZW4gbG9jYWwgX19jPQoxIC1kYmIrMTtsb2NhbCBhX2M9ZGFhLWRiYisxO2FjYj1fYyhhYmIsX19jLGFfYykKYmNiPV9jKGJiYixfX2MsYV9jKWNjYj1fYyhjYmIsX19jLGFfYyllbHNlaWYgX2NiPmRhYSB0aGVuIGxvY2FsIF9fYz1kYWEtZGJiKzE7YWNiPV9jKGFiYiwxLF9fYykKYmNiPV9jKGJiYiwxLF9fYyljY2I9X2MoY2JiLDEsX19jKWVsc2UgYWNiPWFiYjtiY2I9YmJiO2NjYj1jYmIgZW5kO2xvY2FsIGRjYj1jY2FbY2JhXWxvY2FsIF9kYj1fZGFbY2JhXWxvY2FsIGFkYj1kY2FbY2JhXWxvY2FsIGJkYixjZGIsZGRiCmlmIGRiYj4xIHRoZW4gbG9jYWwgX19jPWRiYi0xO2JkYj0KX2MoZGNiLDEsX19jKS4uYWNiO2NkYj1fYyhfZGIsMSxfX2MpLi5iY2IKZGRiPV9jKGFkYiwxLF9fYykuLmNjYiBlbHNlIGJkYj1hY2I7Y2RiPWJjYjtkZGI9Y2NiIGVuZAppZiBfY2I8ZGFhIHRoZW4gbG9jYWwgX19jPV9jYisxO2JkYj1iZGIuLl9jKGRjYixfX2MsZGFhKQpjZGI9Y2RiLi5fYyhfZGIsX19jLGRhYSlkZGI9ZGRiLi5fYyhhZGIsX19jLGRhYSllbmQ7Y2NhW2NiYV09YmRiO19kYVtjYmFdPWNkYjtkY2FbY2JhXT1kZGIgZW5kO19kOnVwZGF0ZURyYXcoKWVuZDtiYmE9X2NiKzE7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBjX2IoYWJiLGJiYixjYmIpCmlmKGNiYn49bmlsKXRoZW4gbG9jYWwgZGJiPWNjYVtiYmJdaWYoZGJifj1uaWwpdGhlbgpjY2FbYmJiXT1fYyhkYmI6c3ViKDEsYWJiLTEpLi5jYmIuLmRiYjpzdWIoYWJiKwooY2JiOmxlbigpKSxkYWEpLDEsZGFhKWVuZCBlbmQ7X2Q6dXBkYXRlRHJhdygpZW5kCmxvY2FsIGZ1bmN0aW9uIGRfYihhYmIsYmJiLGNiYikKaWYoY2Jifj1uaWwpdGhlbiBsb2NhbCBkYmI9ZGNhW2JiYl1pZihkYmJ+PW5pbCl0aGVuCmRjYVtiYmJdPV9jKGRiYjpzdWIoMSxhYmItMSkuLmNiYi4uZGJiOnN1YihhYmIrCihjYmI6bGVuKCkpLGRhYSksMSxkYWEpZW5kIGVuZDtfZDp1cGRhdGVEcmF3KCllbmQKbG9jYWwgZnVuY3Rpb24gX2FiKGFiYixiYmIsY2JiKQppZihjYmJ+PW5pbCl0aGVuIGxvY2FsIGRiYj1fZGFbYmJiXWlmKGRiYn49bmlsKXRoZW4KX2RhW2JiYl09X2MoZGJiOnN1YigxLGFiYi0xKS4uY2JiLi5kYmI6c3ViKGFiYisKKGNiYjpsZW4oKSksZGFhKSwxLGRhYSllbmQgZW5kO19kOnVwZGF0ZURyYXcoKWVuZApsb2NhbCBhYWI9ZnVuY3Rpb24oYWJiKQppZiB0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVsc2VpZiBiYlthYmJdPT1uaWwgdGhlbgplcnJvcigiSW52YWxpZCBjb2xvciAoZ290ICIuLmFiYi4uIikiLDIpZW5kO19jYT1hYmIgZW5kCmxvY2FsIGJhYj1mdW5jdGlvbihhYmIpCmlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZWxzZWlmIGJiW2FiYl09PW5pbCB0aGVuCmVycm9yKCJJbnZhbGlkIGNvbG9yIChnb3QgIi4uYWJiLi4iKSIsMillbmQ7ZGJhPWFiYiBlbmQKbG9jYWwgY2FiPWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYilpZiB0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVuZAppZiBiYlthYmJdPT1uaWwgdGhlbiBlcnJvcigiSW52YWxpZCBjb2xvciAoZ290ICIuLgphYmIuLiIpIiwyKWVuZDtsb2NhbCBfY2IKaWYKdHlwZShiYmIpPT0ibnVtYmVyImFuZCBjYmI9PW5pbCBhbmQgZGJiPT1uaWwgdGhlbiBfY2I9e2NvbG91cnMucmdiOChiYmIpfWFkYVthYmJdPV9jYiBlbHNlIGlmCnR5cGUoYmJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzIgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYmJiKS4uIikiLDIpZW5kO2lmIHR5cGUoY2JiKX49Im51bWJlciJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMzIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGNiYikuLiIpIiwyKWVuZDtpZiB0eXBlKGRiYil+PSJudW1iZXIidGhlbgplcnJvcigKImJhZCBhcmd1bWVudCAjNCAoZXhwZWN0ZWQgbnVtYmVyLCBnb3QgIi4udHlwZShkYmIpLi4iKSIsMillbmQ7X2NiPWFkYVthYmJdX2NiWzFdPWJiYgpfY2JbMl09Y2JiO19jYlszXT1kYmIgZW5kIGVuZApsb2NhbCBkYWI9ZnVuY3Rpb24oYWJiKWlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZW5kCmlmIGJiW2FiYl09PW5pbCB0aGVuIGVycm9yKCJJbnZhbGlkIGNvbG9yIChnb3QgIi4uCmFiYi4uIikiLDIpZW5kO2xvY2FsIGJiYj1hZGFbYWJiXXJldHVybiBiYmJbMV0sYmJiWzJdLGJiYlszXWVuZApsb2NhbCBfYmI9e3NldEN1cnNvclBvcz1mdW5jdGlvbihhYmIsYmJiKWlmIHR5cGUoYWJiKX49Im51bWJlciJ0aGVuCmVycm9yKCJiYWQgYXJndW1lbnQgIzEgKGV4cGVjdGVkIG51bWJlciwgZ290ICIuLnR5cGUoYWJiKS4uIikiLDIpZW5kO2lmIHR5cGUoYmJiKX49Im51bWJlciJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMyIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGJiYikuLiIpIiwyKWVuZDtiYmE9bWF0aC5mbG9vcihhYmIpCmNiYT1tYXRoLmZsb29yKGJiYilpZihiY2EpdGhlbiBhX2IoKWVuZCBlbmQsZ2V0Q3Vyc29yUG9zPWZ1bmN0aW9uKClyZXR1cm4KYmJhLGNiYSBlbmQsc2V0Q3Vyc29yQmxpbms9ZnVuY3Rpb24oYWJiKWlmIHR5cGUoYWJiKX49ImJvb2xlYW4idGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBib29sZWFuLCBnb3QgIi4uCnR5cGUoYWJiKS4uIikiLDIpZW5kO2FjYT1hYmIgZW5kLGdldEN1cnNvckJsaW5rPWZ1bmN0aW9uKClyZXR1cm4KYWNhIGVuZCxnZXRQYWxldHRlQ29sb3I9ZGFiLGdldFBhbGV0dGVDb2xvdXI9ZGFiLHNldEJhY2tncm91bmRDb2xvcj1iYWIsc2V0QmFja2dyb3VuZENvbG91cj1iYWIsc2V0VGV4dENvbG9yPWFhYixzZXRUZXh0Q29sb3VyPWFhYixzZXRQYWxldHRlQ29sb3I9Y2FiLHNldFBhbGV0dGVDb2xvdXI9Y2FiLGdldEJhY2tncm91bmRDb2xvcj1mdW5jdGlvbigpcmV0dXJuIGRiYSBlbmQsZ2V0QmFja2dyb3VuZENvbG91cj1mdW5jdGlvbigpcmV0dXJuIGRiYSBlbmQsZ2V0U2l6ZT1mdW5jdGlvbigpCnJldHVybiBkYWEsX2JhIGVuZCxnZXRUZXh0Q29sb3I9ZnVuY3Rpb24oKXJldHVybiBfY2EgZW5kLGdldFRleHRDb2xvdXI9ZnVuY3Rpb24oKXJldHVybiBfY2EgZW5kLGJhc2FsdF9yZXNpemU9ZnVuY3Rpb24oYWJiLGJiYilkYWEsX2JhPWFiYixiYmI7X19iKCllbmQsYmFzYWx0X3JlcG9zaXRpb249ZnVuY3Rpb24oYWJiLGJiYikKYmFhLGNhYT1hYmIsYmJiIGVuZCxiYXNhbHRfc2V0VmlzaWJsZT1mdW5jdGlvbihhYmIpYmNhPWFiYiBlbmQsZHJhd0JhY2tncm91bmRCb3g9ZnVuY3Rpb24oYWJiLGJiYixjYmIsZGJiLF9jYilmb3Igbj0xLGRiYiBkbwpkX2IoYWJiLGJiYisgKG4tMSksYmJbX2NiXTpyZXAoY2JiKSllbmQgZW5kLGRyYXdGb3JlZ3JvdW5kQm94PWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYixfY2IpCmZvciBuPTEsZGJiIGRvIF9hYihhYmIsCmJiYisgKG4tMSksYmJbX2NiXTpyZXAoY2JiKSllbmQgZW5kLGRyYXdUZXh0Qm94PWZ1bmN0aW9uKGFiYixiYmIsY2JiLGRiYixfY2IpZm9yIG49MSxkYmIgZG8KY19iKGFiYixiYmIrIChuLTEpLF9jYjpyZXAoY2JiKSllbmQgZW5kLHdyaXRlVGV4dD1mdW5jdGlvbihhYmIsYmJiLGNiYixkYmIsX2NiKQpkYmI9ZGJiIG9yIGRiYTtfY2I9X2NiIG9yIF9jYTtjX2IoYmFhLGJiYixjYmIpCmRfYihhYmIsYmJiLGJiW2RiYl06cmVwKGNiYjpsZW4oKSkpX2FiKGFiYixiYmIsYmJbX2NiXTpyZXAoY2JiOmxlbigpKSllbmQsYmFzYWx0X3VwZGF0ZT1mdW5jdGlvbigpCmlmKApiY349bmlsKXRoZW4gZm9yIG49MSxfYmEgZG8gYmM6c2V0VGV4dChiYWEsY2FhKyAobi0xKSxjY2Fbbl0pYmM6c2V0QkcoYmFhLGNhYSsKKG4tMSksZGNhW25dKQpiYzpzZXRGRyhiYWEsY2FhKyAobi0xKSxfZGFbbl0pZW5kIGVuZCBlbmQsc2Nyb2xsPWZ1bmN0aW9uKGFiYilpZgp0eXBlKGFiYil+PSJudW1iZXIidGhlbgplcnJvcigiYmFkIGFyZ3VtZW50ICMxIChleHBlY3RlZCBudW1iZXIsIGdvdCAiLi50eXBlKGFiYikuLiIpIiwyKWVuZAppZiBhYmJ+PTAgdGhlbiBsb2NhbCBiYmI9YmRhCmxvY2FsIGNiYj1jZGFbX2NhXWxvY2FsIGRiYj1jZGFbZGJhXQpmb3IgbmV3WT0xLF9iYSBkbyBsb2NhbCBfY2I9bmV3WSthYmIKaWYgX2NiPj0xIGFuZCBfY2I8PV9iYSB0aGVuCmNjYVtuZXdZXT1jY2FbX2NiXWRjYVtuZXdZXT1kY2FbX2NiXV9kYVtuZXdZXT1fZGFbX2NiXWVsc2UgY2NhW25ld1ldPWJiYgpfZGFbbmV3WV09Y2JiO2RjYVtuZXdZXT1kYmIgZW5kIGVuZCBlbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGlzQ29sb3I9ZnVuY3Rpb24oKXJldHVybgpiYzpnZXRCYXNhbHRJbnN0YW5jZSgpLmdldEJhc2VUZXJtKCkuaXNDb2xvcigpZW5kLGlzQ29sb3VyPWZ1bmN0aW9uKClyZXR1cm4KYmM6Z2V0QmFzYWx0SW5zdGFuY2UoKS5nZXRCYXNlVGVybSgpLmlzQ29sb3IoKWVuZCx3cml0ZT1mdW5jdGlvbihhYmIpCmFiYj10b3N0cmluZyhhYmIpaWYoYmNhKXRoZW4KYl9iKGFiYixiYltfY2FdOnJlcChhYmI6bGVuKCkpLGJiW2RiYV06cmVwKGFiYjpsZW4oKSkpZW5kIGVuZCxjbGVhckxpbmU9ZnVuY3Rpb24oKQppZgooYmNhKXRoZW4gY19iKDEsY2JhLCgiICIpOnJlcChkYWEpKQpkX2IoMSxjYmEsYmJbZGJhXTpyZXAoZGFhKSlfYWIoMSxjYmEsYmJbX2NhXTpyZXAoZGFhKSllbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGNsZWFyPWZ1bmN0aW9uKCkKZm9yIG49MSxfYmEKZG8gY19iKDEsbiwoIiAiKTpyZXAoZGFhKSkKZF9iKDEsbixiYltkYmFdOnJlcChkYWEpKV9hYigxLG4sYmJbX2NhXTpyZXAoZGFhKSllbmQ7aWYoYmNhKXRoZW4gYV9iKCllbmQgZW5kLGJsaXQ9ZnVuY3Rpb24oYWJiLGJiYixjYmIpaWYKdHlwZShhYmIpfj0ic3RyaW5nInRoZW4KZXJyb3IoImJhZCBhcmd1bWVudCAjMSAoZXhwZWN0ZWQgc3RyaW5nLCBnb3QgIi4udHlwZShhYmIpLi4iKSIsMillbmQ7aWYgdHlwZShiYmIpfj0ic3RyaW5nInRoZW4KZXJyb3IoCiJiYWQgYXJndW1lbnQgIzIgKGV4cGVjdGVkIHN0cmluZywgZ290ICIuLnR5cGUoYmJiKS4uIikiLDIpZW5kO2lmIHR5cGUoY2JiKX49InN0cmluZyJ0aGVuCmVycm9yKAoiYmFkIGFyZ3VtZW50ICMzIChleHBlY3RlZCBzdHJpbmcsIGdvdCAiLi50eXBlKGNiYikuLiIpIiwyKWVuZAppZgojYmJifj0jYWJiIG9yI2NiYn49I2FiYiB0aGVuIGVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgiLDIpZW5kO2lmKGJjYSl0aGVuIGJfYihhYmIsYmJiLGNiYillbmQgZW5kfXJldHVybiBfYmIgZW5kO2NjLndpZHRoPTMwO2NjLmhlaWdodD0xMjtsb2NhbCBkZD1jZCgxLDEsY2Mud2lkdGgsY2MuaGVpZ2h0KWxvY2FsIF9fYQpsb2NhbCBhX2E9ZmFsc2U7bG9jYWwgYl9hPXt9CmxvY2FsIGZ1bmN0aW9uIGNfYShiYWEpbG9jYWwgY2FhLGRhYT1kZC5nZXRDdXJzb3JQb3MoKQpsb2NhbCBfYmEsYWJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpCmlmKF9iYStjYWEtMSA+PTEgYW5kCl9iYStjYWEtMSA8PV9iYStiYmEtMSBhbmQgZGFhK2FiYS0xID49MSBhbmQKZGFhK2FiYS0xIDw9YWJhK2NiYS0xKXRoZW4KYmFhLnBhcmVudDpzZXRDdXJzb3IoCmJhYTppc0ZvY3VzZWQoKWFuZCBkZC5nZXRDdXJzb3JCbGluaygpLF9iYStjYWEtMSxkYWErYWJhLTEsZGQuZ2V0VGV4dENvbG9yKCkpZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBkX2EoYmFhLGNhYSwuLi4pbG9jYWwgZGFhLF9iYT1fX2E6cmVzdW1lKGNhYSwuLi4pCmlmKGRhYT09ZmFsc2UpYW5kKF9iYX49bmlsKWFuZAooX2Jhfj0iVGVybWluYXRlZCIpdGhlbgpsb2NhbCBhYmE9YmFhOnNlbmRFdmVudCgicHJvZ3JhbV9lcnJvciIsX2JhKQppZihhYmF+PWZhbHNlKXRoZW4gZXJyb3IoIkJhc2FsdCBQcm9ncmFtIC0gIi4uX2JhKWVuZCBlbmQKaWYoX19hOmdldFN0YXR1cygpPT0iZGVhZCIpdGhlbiBiYWE6c2VuZEV2ZW50KCJwcm9ncmFtX2RvbmUiKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2FhKGJhYSxjYWEsZGFhLF9iYSxhYmEpaWYoX19hPT1uaWwpdGhlbiByZXR1cm4gZmFsc2UgZW5kCmlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZiBub3QoYV9hKXRoZW4KbG9jYWwgYmJhLGNiYT1iYWE6Z2V0QWJzb2x1dGVQb3NpdGlvbihiYWE6Z2V0QW5jaG9yUG9zaXRpb24oCm5pbCxuaWwsdHJ1ZSkpZF9hKGJhYSxjYWEsZGFhLF9iYS1iYmErMSxhYmEtY2JhKzEpCmNfYShiYWEpZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYWFhKGJhYSxjYWEsZGFhLF9iYSlpZihfX2E9PW5pbCl0aGVuIHJldHVybiBmYWxzZSBlbmQKaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuIGlmIG5vdChhX2EpdGhlbiBpZihiYWEuZHJhdyl0aGVuCmRfYShiYWEsY2FhLGRhYSxfYmEpY19hKGJhYSllbmQgZW5kIGVuZCBlbmQKX2Q9e2dldFR5cGU9ZnVuY3Rpb24oYmFhKXJldHVybiBkYyBlbmQsc2hvdz1mdW5jdGlvbihiYWEpY2Muc2hvdyhiYWEpCmRkLnNldEJhY2tncm91bmRDb2xvcihiYWEuYmdDb2xvcilkZC5zZXRUZXh0Q29sb3IoYmFhLmZnQ29sb3IpCmRkLmJhc2FsdF9zZXRWaXNpYmxlKHRydWUpcmV0dXJuIGJhYSBlbmQsaGlkZT1mdW5jdGlvbihiYWEpCmNjLmhpZGUoYmFhKWRkLmJhc2FsdF9zZXRWaXNpYmxlKGZhbHNlKXJldHVybiBiYWEgZW5kLHNldFBvc2l0aW9uPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKY2Muc2V0UG9zaXRpb24oYmFhLGNhYSxkYWEsX2JhKQpkZC5iYXNhbHRfcmVwb3NpdGlvbihiYWE6Z2V0QW5jaG9yUG9zaXRpb24oKSlyZXR1cm4gYmFhIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYmFhLGNhYSkKY2Muc2V0VmFsdWVzQnlYTUxEYXRhKGJhYSxjYWEpaWYoZGIoInBhdGgiLGNhYSl+PW5pbCl0aGVuIGFkPWRiKCJwYXRoIixjYWEpZW5kCmlmKApkYigiZXhlY3V0ZSIsY2FhKX49bmlsKXRoZW4gaWYoZGIoImV4ZWN1dGUiLGNhYSkpdGhlbgppZihhZH49bmlsKXRoZW4gYmFhOmV4ZWN1dGUoYWQpZW5kIGVuZCBlbmQgZW5kLGdldEJhc2FsdFdpbmRvdz1mdW5jdGlvbigpcmV0dXJuCmRkIGVuZCxnZXRCYXNhbHRQcm9jZXNzPWZ1bmN0aW9uKClyZXR1cm4gX19hIGVuZCxzZXRTaXplPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSljYy5zZXRTaXplKGJhYSxjYWEsZGFhLF9iYSkKZGQuYmFzYWx0X3Jlc2l6ZShiYWE6Z2V0V2lkdGgoKSxiYWE6Z2V0SGVpZ2h0KCkpcmV0dXJuIGJhYSBlbmQsZ2V0U3RhdHVzPWZ1bmN0aW9uKGJhYSlpZihfX2F+PW5pbCl0aGVuIHJldHVybgpfX2E6Z2V0U3RhdHVzKCllbmQ7cmV0dXJuImluYWN0aXZlImVuZCxzZXRFbnZpcm9tZW50PWZ1bmN0aW9uKGJhYSxjYWEpYmQ9CmNhYSBvcnt9cmV0dXJuIGJhYSBlbmQsZXhlY3V0ZT1mdW5jdGlvbihiYWEsY2FhLC4uLilhZD1jYWEgb3IgYWQKX19hPWNiOm5ldyhhZCxkZCxiZCwuLi4pZGQuc2V0QmFja2dyb3VuZENvbG9yKGNvbG9ycy5ibGFjaykKZGQuc2V0VGV4dENvbG9yKGNvbG9ycy53aGl0ZSlkZC5jbGVhcigpZGQuc2V0Q3Vyc29yUG9zKDEsMSkKZGQuc2V0QmFja2dyb3VuZENvbG9yKGJhYS5iZ0NvbG9yKWRkLnNldFRleHRDb2xvcihiYWEuZmdDb2xvcikKZGQuYmFzYWx0X3NldFZpc2libGUodHJ1ZSlkX2EoYmFhKWFfYT1mYWxzZQppZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsYmFhKWJhYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3VwIixiYWEpCmJhYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLGJhYSliYWEucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9zY3JvbGwiLGJhYSkKYmFhLnBhcmVudDphZGRFdmVudCgia2V5IixiYWEpYmFhLnBhcmVudDphZGRFdmVudCgia2V5X3VwIixiYWEpCmJhYS5wYXJlbnQ6YWRkRXZlbnQoImNoYXIiLGJhYSliYWEucGFyZW50OmFkZEV2ZW50KCJvdGhlcl9ldmVudCIsYmFhKWVuZDtyZXR1cm4gYmFhIGVuZCxzdG9wPWZ1bmN0aW9uKGJhYSkKaWYoCl9fYX49bmlsKXRoZW4KaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuIGRfYShiYWEsInRlcm1pbmF0ZSIpaWYoX19hOmlzRGVhZCgpKXRoZW4KaWYoCmJhYS5wYXJlbnR+PW5pbCl0aGVuIGJhYS5wYXJlbnQ6c2V0Q3Vyc29yKGZhbHNlKWVuZCBlbmQgZW5kIGVuZDtiYWEucGFyZW50OnJlbW92ZUV2ZW50cyhiYWEpcmV0dXJuIGJhYSBlbmQscGF1c2U9ZnVuY3Rpb24oYmFhLGNhYSlhX2E9CmNhYSBvcihub3QgYV9hKQppZihfX2F+PW5pbCl0aGVuIGlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZiBub3QoYV9hKXRoZW4KYmFhOmluamVjdEV2ZW50cyhiX2EpYl9hPXt9ZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsaXNQYXVzZWQ9ZnVuY3Rpb24oYmFhKXJldHVybgphX2EgZW5kLGluamVjdEV2ZW50PWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSxhYmEsYmJhLGNiYSkKaWYoX19hfj1uaWwpdGhlbgppZiBub3QoX19hOmlzRGVhZCgpKXRoZW4gaWYoYV9hPT1mYWxzZSlvcihjYmEpdGhlbgpkX2EoYmFhLGNhYSxkYWEsX2JhLGFiYSxiYmEpZWxzZQp0YWJsZS5pbnNlcnQoYl9hLHtldmVudD1jYWEsYXJncz17ZGFhLF9iYSxhYmEsYmJhfX0pZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsZ2V0UXVldWVkRXZlbnRzPWZ1bmN0aW9uKGJhYSlyZXR1cm4KYl9hIGVuZCx1cGRhdGVRdWV1ZWRFdmVudHM9ZnVuY3Rpb24oYmFhLGNhYSliX2E9Y2FhIG9yIGJfYTtyZXR1cm4gYmFhIGVuZCxpbmplY3RFdmVudHM9ZnVuY3Rpb24oYmFhLGNhYSlpZihfX2F+PW5pbCl0aGVuCmlmIG5vdAooX19hOmlzRGVhZCgpKXRoZW4gZm9yIGRhYSxfYmEgaW4gcGFpcnMoY2FhKWRvCmRfYShiYWEsX2JhLmV2ZW50LHRhYmxlLnVucGFjayhfYmEuYXJncykpZW5kIGVuZCBlbmQ7cmV0dXJuIGJhYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLm1vdXNlSGFuZGxlcihiYWEsY2FhLGRhYSxfYmEpKXRoZW4gX2FhKGJhYSwibW91c2VfY2xpY2siLGNhYSxkYWEsX2JhKXJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLG1vdXNlVXBIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLm1vdXNlVXBIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV91cCIsY2FhLGRhYSxfYmEpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihiYWEsY2FhLGRhYSxfYmEpCmlmCihjYy5zY3JvbGxIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV9zY3JvbGwiLGNhYSxkYWEsX2JhKXJldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhLF9iYSkKaWYKKGNjLmRyYWdIYW5kbGVyKGJhYSxjYWEsZGFhLF9iYSkpdGhlbiBfYWEoYmFhLCJtb3VzZV9kcmFnIixjYWEsZGFhLF9iYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxrZXlIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsZGFhKWlmCihjYy5rZXlIYW5kbGVyKGJhYSxjYWEsZGFhKSl0aGVuIGFhYShiYWEsImtleSIsY2FhLGRhYSlyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuCmZhbHNlIGVuZCxrZXlVcEhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSlpZgooY2Mua2V5VXBIYW5kbGVyKGJhYSxjYWEpKXRoZW4gYWFhKGJhYSwia2V5X3VwIixjYWEpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsY2hhckhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSlpZgooY2MuY2hhckhhbmRsZXIoYmFhLGNhYSkpdGhlbiBhYWEoYmFhLCJjaGFyIixjYWEpcmV0dXJuIHRydWUgZW5kCnJldHVybiBmYWxzZSBlbmQsZ2V0Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGJhYSkKY2MuZ2V0Rm9jdXNIYW5kbGVyKGJhYSkKaWYoX19hfj1uaWwpdGhlbgppZiBub3QoX19hOmlzRGVhZCgpKXRoZW4KaWYgbm90KGFfYSl0aGVuCmlmKGJhYS5wYXJlbnR+PW5pbCl0aGVuCmxvY2FsIGNhYSxkYWE9ZGQuZ2V0Q3Vyc29yUG9zKClsb2NhbCBfYmEsYWJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpCmlmCigKX2JhK2NhYS0xID49MSBhbmQgX2JhK2NhYS0xIDw9X2JhK2JiYS0xIGFuZApkYWErYWJhLTEgPj0xIGFuZCBkYWErYWJhLTEgPD1hYmErY2JhLTEpdGhlbgpiYWEucGFyZW50OnNldEN1cnNvcihkZC5nZXRDdXJzb3JCbGluaygpLF9iYStjYWEtMSxkYWErYWJhLTEsZGQuZ2V0VGV4dENvbG9yKCkpZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsbG9zZUZvY3VzSGFuZGxlcj1mdW5jdGlvbihiYWEpCmNjLmxvc2VGb2N1c0hhbmRsZXIoYmFhKQppZihfX2F+PW5pbCl0aGVuIGlmIG5vdChfX2E6aXNEZWFkKCkpdGhlbiBpZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OnNldEN1cnNvcihmYWxzZSllbmQgZW5kIGVuZCBlbmQsY3VzdG9tRXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGJhYSxjYWEsLi4uKQpjYy5jdXN0b21FdmVudEhhbmRsZXIoYmFhLGNhYSwuLi4paWYoX19hPT1uaWwpdGhlbiByZXR1cm4gZW5kCmlmKGNhYT09ImJhc2FsdF9yZXNpemUiKXRoZW4gbG9jYWwgZGFhLF9iYT1kZC5nZXRTaXplKCkKbG9jYWwgYWJhLGJiYT1iYWE6Z2V0U2l6ZSgpCmlmKGRhYX49YWJhKW9yKF9iYX49YmJhKXRoZW4gZGQuYmFzYWx0X3Jlc2l6ZShhYmEsYmJhKWlmIG5vdAooX19hOmlzRGVhZCgpKXRoZW4gZF9hKGJhYSwidGVybV9yZXNpemUiKWVuZCBlbmQKZGQuYmFzYWx0X3JlcG9zaXRpb24oYmFhOmdldEFuY2hvclBvc2l0aW9uKCkpZW5kIGVuZCxldmVudEhhbmRsZXI9ZnVuY3Rpb24oYmFhLGNhYSxkYWEsX2JhLGFiYSxiYmEpCmNjLmV2ZW50SGFuZGxlcihiYWEsY2FhLGRhYSxfYmEsYWJhLGJiYSlpZihfX2E9PW5pbCl0aGVuIHJldHVybiBlbmQKaWYgbm90KF9fYTppc0RlYWQoKSl0aGVuCmlmIG5vdChhX2EpdGhlbiBpZihjYWF+PSJ0ZXJtaW5hdGUiKXRoZW4KZF9hKGJhYSxjYWEsZGFhLF9iYSxhYmEsYmJhKWVuZAppZihiYWE6aXNGb2N1c2VkKCkpdGhlbgpsb2NhbCBjYmEsZGJhPWJhYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgX2NhLGFjYT1kZC5nZXRDdXJzb3JQb3MoKQppZihiYWEucGFyZW50fj1uaWwpdGhlbgpsb2NhbCBiY2EsY2NhPWJhYTpnZXRTaXplKCkKaWYKKGNiYStfY2EtMSA+PTEgYW5kIGNiYStfY2EtMSA8PWNiYStiY2EtMSBhbmQKYWNhK2RiYS0xID49MSBhbmQgYWNhK2RiYS0xIDw9ZGJhK2NjYS0xKXRoZW4KYmFhLnBhcmVudDpzZXRDdXJzb3IoZGQuZ2V0Q3Vyc29yQmxpbmsoKSxjYmErX2NhLTEsYWNhK2RiYS0xLGRkLmdldFRleHRDb2xvcigpKWVuZCBlbmQ7aWYoY2FhPT0idGVybWluYXRlIil0aGVuIGRfYShiYWEsY2FhKQpiYWEucGFyZW50OnNldEN1cnNvcihmYWxzZSlyZXR1cm4gdHJ1ZSBlbmQgZW5kIGVsc2UKdGFibGUuaW5zZXJ0KGJfYSx7ZXZlbnQ9Y2FhLGFyZ3M9e2RhYSxfYmEsYWJhLGJiYX19KWVuZCBlbmQgZW5kLGRyYXc9ZnVuY3Rpb24oYmFhKQppZgooY2MuZHJhdyhiYWEpKXRoZW4KaWYoYmFhLnBhcmVudH49bmlsKXRoZW4gbG9jYWwgY2FhLGRhYT1iYWE6Z2V0QW5jaG9yUG9zaXRpb24oKQpsb2NhbCBfYmEsYWJhPWRkLmdldEN1cnNvclBvcygpbG9jYWwgYmJhLGNiYT1iYWE6Z2V0U2l6ZSgpZGQuYmFzYWx0X3JlcG9zaXRpb24oY2FhLGRhYSkKZGQuYmFzYWx0X3VwZGF0ZSgpCmlmCihjYWErX2JhLTEgPj0xIGFuZCBjYWErX2JhLTEgPD1jYWErYmJhLTEgYW5kCmFiYStkYWEtMSA+PTEgYW5kIGFiYStkYWEtMSA8PWRhYStjYmEtMSl0aGVuCmJhYS5wYXJlbnQ6c2V0Q3Vyc29yKGJhYTppc0ZvY3VzZWQoKWFuZCBkZC5nZXRDdXJzb3JCbGluaygpLApjYWErX2JhLTEsYWJhK2RhYS0xLGRkLmdldFRleHRDb2xvcigpKWVuZCBlbmQgZW5kIGVuZCxvbkVycm9yPWZ1bmN0aW9uKGJhYSwuLi4pCmZvciBjYWEsZGFhIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGRhYSk9PSJmdW5jdGlvbiIpdGhlbgpiYWE6cmVnaXN0ZXJFdmVudCgicHJvZ3JhbV9lcnJvciIsZGFhKWVuZCBlbmQ7aWYoYmFhLnBhcmVudH49bmlsKXRoZW4KYmFhLnBhcmVudDphZGRFdmVudCgib3RoZXJfZXZlbnQiLGJhYSllbmQ7cmV0dXJuIGJhYSBlbmQsb25Eb25lPWZ1bmN0aW9uKGJhYSwuLi4pCmZvciBjYWEsZGFhIGluCnBhaXJzKHRhYmxlLnBhY2soLi4uKSlkbyBpZih0eXBlKGRhYSk9PSJmdW5jdGlvbiIpdGhlbgpiYWE6cmVnaXN0ZXJFdmVudCgicHJvZ3JhbV9kb25lIixkYWEpZW5kIGVuZDtpZihiYWEucGFyZW50fj1uaWwpdGhlbgpiYWEucGFyZW50OmFkZEV2ZW50KCJvdGhlcl9ldmVudCIsYmFhKWVuZDtyZXR1cm4gYmFhIGVuZCxpbml0PWZ1bmN0aW9uKGJhYSkKaWYKKGNjLmluaXQoYmFhKSl0aGVuIGJhYS5iZ0NvbG9yPWJhYS5wYXJlbnQ6Z2V0VGhlbWUoIlByb2dyYW1CRyIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKF9kLGNjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiU3dpdGNoIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKQpsb2NhbCBiYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGNiKWxvY2FsIGRiPWFiKGNiKWxvY2FsIF9jPSJTd2l0Y2giZGIud2lkdGg9MjtkYi5oZWlnaHQ9MQpkYi5iZ0NvbG9yPWNvbG9ycy5saWdodEdyYXk7ZGIuZmdDb2xvcj1jb2xvcnMuZ3JheTtkYjpzZXRWYWx1ZShmYWxzZSlkYjpzZXRaSW5kZXgoNSkKbG9jYWwgYWM9Y29sb3JzLmJsYWNrO2xvY2FsIGJjPWNvbG9ycy5yZWQ7bG9jYWwgY2M9Y29sb3JzLmdyZWVuCmxvY2FsIGRjPXtnZXRUeXBlPWZ1bmN0aW9uKF9kKXJldHVybiBfYyBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oX2QsYWQpYWM9YWQKX2Q6dXBkYXRlRHJhdygpcmV0dXJuIF9kIGVuZCxzZXRBY3RpdmVCYWNrZ3JvdW5kPWZ1bmN0aW9uKF9kLGFkKWNjPWFkO19kOnVwZGF0ZURyYXcoKXJldHVybiBfZCBlbmQsc2V0SW5hY3RpdmVCYWNrZ3JvdW5kPWZ1bmN0aW9uKF9kLGFkKQpiYz1hZDtfZDp1cGRhdGVEcmF3KClyZXR1cm4gX2QgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfZCxhZCkKZGIuc2V0VmFsdWVzQnlYTUxEYXRhKF9kLGFkKWlmKGJiKCJpbmFjdGl2ZUJHIixhZCl+PW5pbCl0aGVuCmJjPWNvbG9yc1tiYigiaW5hY3RpdmVCRyIsYWQpXWVuZDtpZihiYigiYWN0aXZlQkciLGFkKX49bmlsKXRoZW4KY2M9Y29sb3JzW2JiKCJhY3RpdmVCRyIsYWQpXWVuZDtpZihiYigic3ltYm9sQ29sb3IiLGFkKX49bmlsKXRoZW4KYWM9Y29sb3JzW2JiKCJzeW1ib2xDb2xvciIsYWQpXWVuZCBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9kLGFkLGJkLGNkKQppZgooZGIubW91c2VIYW5kbGVyKF9kLGFkLGJkLGNkKSl0aGVuCmxvY2FsIGRkLF9fYT1fZDpnZXRBYnNvbHV0ZVBvc2l0aW9uKF9kOmdldEFuY2hvclBvc2l0aW9uKCkpX2Q6c2V0VmFsdWUobm90IF9kOmdldFZhbHVlKCkpCl9kOnVwZGF0ZURyYXcoKXJldHVybiB0cnVlIGVuZCBlbmQsZHJhdz1mdW5jdGlvbihfZCkKaWYKKGRiLmRyYXcoX2QpKXRoZW4KaWYoX2QucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhZCxiZD1fZDpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGNkLGRkPV9kOmdldFNpemUoKQpfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQsYmQsY2QsZGQsX2QuYmdDb2xvcikKaWYoX2Q6Z2V0VmFsdWUoKSl0aGVuCl9kLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChhZCxiZCwxLGRkLGNjKV9kLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChhZCsxLGJkLDEsZGQsYWMpZWxzZQpfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQsYmQsMSxkZCxhYylfZC5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYWQrMSxiZCwxLGRkLGJjKWVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKF9kKQpfZC5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2NsaWNrIixfZCkKaWYoZGIuaW5pdChfZCkpdGhlbiBfZC5iZ0NvbG9yPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoQkciKQpfZC5mZ0NvbG9yPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoVGV4dCIpYWM9X2QucGFyZW50OmdldFRoZW1lKCJTd2l0Y2hCR1N5bWJvbCIpCmJjPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoSW5hY3RpdmUiKWNjPV9kLnBhcmVudDpnZXRUaGVtZSgiU3dpdGNoQWN0aXZlIillbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoZGMsZGIpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJTbGlkZXIiXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpCmxvY2FsIGJiPWRhKCJiYXNhbHRMb2dzIilsb2NhbCBjYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJTbGlkZXIiCl9jLndpZHRoPTg7X2MuaGVpZ2h0PTE7X2M6c2V0VmFsdWUoMSlsb2NhbCBiYz0iaG9yaXpvbnRhbCJsb2NhbCBjYz0iICJsb2NhbCBkYztsb2NhbCBfZD0iXDE0MCIKbG9jYWwgYWQ9X2Mud2lkdGg7bG9jYWwgYmQ9MTtsb2NhbCBjZD0xCmxvY2FsIGZ1bmN0aW9uIGRkKGFfYSxiX2EsY19hLGRfYSkKbG9jYWwgX2FhLGFhYT1hX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihhX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBiYWEsY2FhPWFfYTpnZXRTaXplKCkKaWYoYmM9PSJob3Jpem9udGFsIil0aGVuCmZvciBfaW5kZXg9MCxiYWEgZG8KaWYKKF9hYStfaW5kZXg9PWNfYSlhbmQoYWFhPD1kX2EpYW5kKGFhYStjYWE+ZF9hKXRoZW4KYmQ9bWF0aC5taW4oX2luZGV4KzEsYmFhLSAoY2QtMSkpYV9hOnNldFZhbHVlKGFkL2JhYSogKGJkKSlhX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQKaWYoYmM9PSJ2ZXJ0aWNhbCIpdGhlbgpmb3IgX2luZGV4PTAsY2FhIGRvCmlmCihhYWErX2luZGV4PT1kX2EpYW5kKF9hYTw9Y19hKWFuZChfYWErYmFhPmNfYSl0aGVuIGJkPW1hdGgubWluKF9pbmRleCsxLGNhYS0gKGNkLTEpKQphX2E6c2V0VmFsdWUoYWQvY2FhKiAoYmQpKWFfYTp1cGRhdGVEcmF3KCllbmQgZW5kIGVuZCBlbmQKbG9jYWwgX19hPXtnZXRUeXBlPWZ1bmN0aW9uKGFfYSlyZXR1cm4gYWMgZW5kLHNldFN5bWJvbD1mdW5jdGlvbihhX2EsYl9hKWNjPWJfYTpzdWIoMSwxKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gYV9hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYV9hLGJfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGFfYSxiX2EpCmlmKGNiKCJtYXhWYWx1ZSIsYl9hKX49bmlsKXRoZW4gYWQ9Y2IoIm1heFZhbHVlIixiX2EpZW5kO2lmKGNiKCJiYWNrZ3JvdW5kU3ltYm9sIixiX2Epfj1uaWwpdGhlbgpfZD1jYigiYmFja2dyb3VuZFN5bWJvbCIsYl9hKTpzdWIoMSwxKWVuZDtpZihjYigiYmFyVHlwZSIsYl9hKX49bmlsKXRoZW4KYmM9Y2IoImJhclR5cGUiLGJfYSk6bG93ZXIoKWVuZDtpZihjYigic3ltYm9sIixiX2Epfj1uaWwpdGhlbgpjYz1jYigic3ltYm9sIixiX2EpOnN1YigxLDEpZW5kO2lmKGNiKCJzeW1ib2xTaXplIixiX2Epfj1uaWwpdGhlbgphX2E6c2V0U3ltYm9sU2l6ZShjYigic3ltYm9sU2l6ZSIsYl9hKSllbmQ7aWYoY2IoInN5bWJvbENvbG9yIixiX2Epfj1uaWwpdGhlbgpkYz1jb2xvcnNbY2IoInN5bWJvbENvbG9yIixiX2EpXWVuZDtpZihjYigiaW5kZXgiLGJfYSl+PW5pbCl0aGVuCmFfYTpzZXRJbmRleChjYigiaW5kZXgiLGJfYSkpZW5kIGVuZCxzZXRJbmRleD1mdW5jdGlvbihhX2EsYl9hKQpiZD1iX2E7aWYoYmQ8MSl0aGVuIGJkPTEgZW5kO2xvY2FsIGNfYSxkX2E9YV9hOmdldFNpemUoKQpiZD1tYXRoLm1pbihiZCwoCmJjPT0idmVydGljYWwiYW5kIGRfYSBvciBjX2EpLSAoY2QtMSkpCmFfYTpzZXRWYWx1ZShhZC8gKGJjPT0idmVydGljYWwiYW5kIGRfYSBvciBjX2EpKmJkKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gYV9hIGVuZCxnZXRJbmRleD1mdW5jdGlvbihhX2EpcmV0dXJuCmJkIGVuZCxzZXRTeW1ib2xTaXplPWZ1bmN0aW9uKGFfYSxiX2EpY2Q9dG9udW1iZXIoYl9hKW9yIDEKaWYoYmM9PSJ2ZXJ0aWNhbCIpdGhlbgphX2E6c2V0VmFsdWUoYmQtMSAqIChhZC8gKGgtIChjZC0KMSkpKS0gKGFkLyAoaC0gKGNkLTEpKSkpZWxzZWlmKGJjPT0iaG9yaXpvbnRhbCIpdGhlbgphX2E6c2V0VmFsdWUoYmQtMSAqIChhZC8gKHctIChjZC0xKSkpLSAoYWQvCih3LSAoY2QtMSkpKSllbmQ7YV9hOnVwZGF0ZURyYXcoKXJldHVybiBhX2EgZW5kLHNldE1heFZhbHVlPWZ1bmN0aW9uKGFfYSxiX2EpCmFkPWJfYTtyZXR1cm4gYV9hIGVuZCxzZXRCYWNrZ3JvdW5kU3ltYm9sPWZ1bmN0aW9uKGFfYSxiX2EpX2Q9c3RyaW5nLnN1YihiX2EsMSwxKQphX2E6dXBkYXRlRHJhdygpcmV0dXJuIGFfYSBlbmQsc2V0U3ltYm9sQ29sb3I9ZnVuY3Rpb24oYV9hLGJfYSlkYz1iX2E7YV9hOnVwZGF0ZURyYXcoKQpyZXR1cm4gYV9hIGVuZCxzZXRCYXJUeXBlPWZ1bmN0aW9uKGFfYSxiX2EpYmM9Yl9hOmxvd2VyKClhX2E6dXBkYXRlRHJhdygpCnJldHVybiBhX2EgZW5kLG1vdXNlSGFuZGxlcj1mdW5jdGlvbihhX2EsYl9hLGNfYSxkX2EpaWYoX2MubW91c2VIYW5kbGVyKGFfYSxiX2EsY19hLGRfYSkpdGhlbgpkZChhX2EsYl9hLGNfYSxkX2EpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsZHJhZ0hhbmRsZXI9ZnVuY3Rpb24oYV9hLGJfYSxjX2EsZF9hKWlmCihfYy5kcmFnSGFuZGxlcihhX2EsYl9hLGNfYSxkX2EpKXRoZW4gZGQoYV9hLGJfYSxjX2EsZF9hKXJldHVybiB0cnVlIGVuZApyZXR1cm4gZmFsc2UgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oYV9hLGJfYSxjX2EsZF9hKQppZgooX2Muc2Nyb2xsSGFuZGxlcihhX2EsYl9hLGNfYSxkX2EpKXRoZW4gbG9jYWwgX2FhLGFhYT1hX2E6Z2V0U2l6ZSgpYmQ9YmQrYl9hO2lmKGJkPDEpdGhlbiBiZD0xIGVuZApiZD1tYXRoLm1pbihiZCwoCmJjPT0idmVydGljYWwiYW5kIGFhYSBvciBfYWEpLSAoY2QtMSkpCmFfYTpzZXRWYWx1ZShhZC8gKGJjPT0idmVydGljYWwiYW5kIGFhYSBvciBfYWEpKmJkKWFfYTp1cGRhdGVEcmF3KClyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGFfYSkKaWYKKF9jLmRyYXcoYV9hKSl0aGVuCmlmKGFfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGJfYSxjX2E9YV9hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgZF9hLF9hYT1hX2E6Z2V0U2l6ZSgpCmlmKGJjPT0iaG9yaXpvbnRhbCIpdGhlbgphX2EucGFyZW50OndyaXRlVGV4dChiX2EsY19hLF9kOnJlcChiZC0xKSxhX2EuYmdDb2xvcixhX2EuZmdDb2xvcikKYV9hLnBhcmVudDp3cml0ZVRleHQoYl9hK2JkLTEsY19hLGNjOnJlcChjZCksZGMsZGMpCmFfYS5wYXJlbnQ6d3JpdGVUZXh0KGJfYStiZCtjZC0xLGNfYSxfZDpyZXAoZF9hLSAoYmQrY2QtMSkpLGFfYS5iZ0NvbG9yLGFfYS5mZ0NvbG9yKWVuZAppZihiYz09InZlcnRpY2FsIil0aGVuCmZvciBuPTAsX2FhLTEgZG8KaWYoYmQ9PW4rMSl0aGVuCmZvciBjdXJJbmRleE9mZnNldD0wLG1hdGgubWluKGNkLTEsX2FhKWRvIGFfYS5wYXJlbnQ6d3JpdGVUZXh0KGJfYSxjX2ErbisKY3VySW5kZXhPZmZzZXQsY2MsZGMsZGMpZW5kIGVsc2UgaWYobisxIDxiZClvcihuKzEgPmJkLTEgK2NkKXRoZW4KYV9hLnBhcmVudDp3cml0ZVRleHQoYl9hLGNfYStuLF9kLGFfYS5iZ0NvbG9yLGFfYS5mZ0NvbG9yKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGFfYSkKYV9hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGFfYSlhX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9kcmFnIixhX2EpCmFfYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsYV9hKQppZihfYy5pbml0KGFfYSkpdGhlbgphX2EuYmdDb2xvcj1hX2EucGFyZW50OmdldFRoZW1lKCJTbGlkZXJCRyIpYV9hLmZnQ29sb3I9YV9hLnBhcmVudDpnZXRUaGVtZSgiU2xpZGVyVGV4dCIpCmRjPWFfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNsaWRlclN5bWJvbENvbG9yIillbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoX19hLF9jKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiR3JhcGhpYyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidEhleCIpCmxvY2FsIGNiPWRhKCJ1dGlscyIpLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgiYmltZyIpbG9jYWwgX2M9ZGEoImltYWdlcyIpCmxvY2FsIGFjLGJjLGNjLGRjPXN0cmluZy5zdWIsc3RyaW5nLmxlbixtYXRoLm1heCxtYXRoLm1pbgpyZXR1cm4KZnVuY3Rpb24oX2QpbG9jYWwgYWQ9YWIoX2QpbG9jYWwgYmQ9IkdyYXBoaWMibG9jYWwgY2Q9ZGIoKWxvY2FsIGRkPWNkLmdldEZyYW1lT2JqZWN0KDEpbG9jYWwgX19hCmxvY2FsIGFfYT0xO2FkOnNldFpJbmRleCg1KWxvY2FsIGJfYSxjX2E9MCwwCmxvY2FsIGRfYT17Z2V0VHlwZT1mdW5jdGlvbihfYWEpcmV0dXJuIGJkIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oX2FhLGFhYSxiYWEsY2FhKQppZihjYWEpdGhlbgpiX2E9Yl9hK2FhYSBvciAwO2NfYT1jX2ErYmFhIG9yIDAgZWxzZSBiX2E9YWFhIG9yIGJfYTtjX2E9YmFhIG9yIGNfYSBlbmQ7X2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLGdldE9mZnNldD1mdW5jdGlvbihfYWEpcmV0dXJuCmJfYSxjX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihfYWEsYWFhKWFkLnNldFZhbHVlc0J5WE1MRGF0YShfYWEsYWFhKXJldHVybiBfYWEgZW5kLHNlbGVjdEZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEpaWYoCmNkLmdldEZyYW1lT2JqZWN0KGFhYSk9PW5pbCl0aGVuIGNkLmFkZEZyYW1lKGFhYSllbmQKZGQ9Y2QuZ2V0RnJhbWVPYmplY3QoYWFhKV9fYT1kZC5nZXRJbWFnZShhYWEpYV9hPWFhYTtfYWE6dXBkYXRlRHJhdygpZW5kLGFkZEZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEpCmNkLmFkZEZyYW1lKGFhYSlyZXR1cm4gX2FhIGVuZCxnZXRGcmFtZU1ldGFkYXRhPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKXJldHVybiBjZC5nZXRGcmFtZURhdGEoYWFhLGJhYSllbmQsc2V0RnJhbWVNZXRhZGF0YT1mdW5jdGlvbihfYWEsYWFhLGJhYSxjYWEpCmNkLnNldEZyYW1lRGF0YShhYWEsYmFhLGNhYSlyZXR1cm4gX2FhIGVuZCxnZXRNZXRhZGF0YT1mdW5jdGlvbihfYWEsYWFhKXJldHVybiBjZC5nZXRNZXRhZGF0YShhYWEpZW5kLHNldE1ldGFkYXRhPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKXJldHVybgpjZC5zZXRNZXRhZGF0YShhYWEsYmFhKWVuZCxnZXRGcmFtZT1mdW5jdGlvbihfYWEsYWFhKXJldHVybiBjZC5nZXRGcmFtZShhYWEpZW5kLGdldEZyYW1lT2JqZWN0PWZ1bmN0aW9uKF9hYSxhYWEpcmV0dXJuCmNkLmdldEZyYW1lT2JqZWN0KGFhYSllbmQscmVtb3ZlRnJhbWU9ZnVuY3Rpb24oX2FhLGFhYSljZC5yZW1vdmVGcmFtZShhYWEpcmV0dXJuIF9hYSBlbmQsbW92ZUZyYW1lPWZ1bmN0aW9uKF9hYSxhYWEsYmFhKQpjZC5tb3ZlRnJhbWUoYWFhLGJhYSlyZXR1cm4gX2FhIGVuZCxnZXRGcmFtZXM9ZnVuY3Rpb24oX2FhKXJldHVybiBjZC5nZXRGcmFtZXMoKWVuZCxnZXRGcmFtZUNvdW50PWZ1bmN0aW9uKF9hYSlyZXR1cm4KI2NkLmdldEZyYW1lcygpZW5kLGdldFNlbGVjdGVkRnJhbWU9ZnVuY3Rpb24oX2FhKXJldHVybiBhX2EgZW5kLGJsaXQ9ZnVuY3Rpb24oX2FhLGFhYSxiYWEsY2FhLGRhYSxfYmEpCng9ZGFhIG9yIHg7eT1fYmEgb3IgeTtkZC5ibGl0KGFhYSxiYWEsY2FhLHgseSlfX2E9ZGQuZ2V0SW1hZ2UoKQpfYWE6dXBkYXRlRHJhdygpcmV0dXJuIF9hYSBlbmQsc2V0VGV4dD1mdW5jdGlvbihfYWEsYWFhLGJhYSxjYWEpCng9YmFhIG9yIHg7eT1jYWEgb3IgeTtkZC50ZXh0KGFhYSx4LHkpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLHNldEJnPWZ1bmN0aW9uKF9hYSxhYWEsYmFhLGNhYSl4PWJhYSBvciB4O3k9CmNhYSBvciB5O2RkLmJnKGFhYSx4LHkpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLHNldEZnPWZ1bmN0aW9uKF9hYSxhYWEsYmFhLGNhYSl4PWJhYSBvciB4O3k9Y2FhIG9yCnk7ZGQuZmcoYWFhLHgseSlfX2E9ZGQuZ2V0SW1hZ2UoKQpfYWE6dXBkYXRlRHJhdygpcmV0dXJuIF9hYSBlbmQsZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKF9hYSkKcmV0dXJuIGNkLmdldFNpemUoKWVuZCxzZXRJbWFnZVNpemU9ZnVuY3Rpb24oX2FhLGFhYSxiYWEpY2Quc2V0U2l6ZShhYWEsYmFhKV9fYT1kZC5nZXRJbWFnZSgpCl9hYTp1cGRhdGVEcmF3KClyZXR1cm4gX2FhIGVuZCxyZXNpemVJbWFnZT1mdW5jdGlvbihfYWEsYWFhLGJhYSkKbG9jYWwgY2FhPV9jLnJlc2l6ZUJJTUcoY2QuY3JlYXRlQmltZygpLGFhYSxiYWEpY2Q9ZGIoY2FhKWFfYT0xO2RkPWNkLmdldEZyYW1lT2JqZWN0KDEpX19hPWRkLmdldEltYWdlKCkKX2FhOnVwZGF0ZURyYXcoKXJldHVybiBfYWEgZW5kLGxvYWRJbWFnZT1mdW5jdGlvbihfYWEsYWFhKQppZgooZnMuZXhpc3RzKGFhYSkpdGhlbiBsb2NhbCBiYWE9X2MubG9hZEJJTUcoYWFhKWNkPWRiKGJhYSlhX2E9MQpkZD1jZC5nZXRGcmFtZU9iamVjdCgxKV9fYT1kZC5nZXRJbWFnZSgpX2FhOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gX2FhIGVuZCxjbGVhcj1mdW5jdGlvbihfYWEpCmNkPWRiKClfX2E9bmlsO19hYTp1cGRhdGVEcmF3KClyZXR1cm4gX2FhIGVuZCxnZXRJbWFnZT1mdW5jdGlvbihfYWEpcmV0dXJuCmNkLmNyZWF0ZUJpbWcoKWVuZCxkcmF3PWZ1bmN0aW9uKF9hYSkKaWYoYWQuZHJhdyhfYWEpKXRoZW4KaWYoX2FhLnBhcmVudH49bmlsKXRoZW4KbG9jYWwgYWFhLGJhYT1fYWE6Z2V0QW5jaG9yUG9zaXRpb24oKWxvY2FsIGNhYSxkYWE9X2FhOmdldFNpemUoKQppZihfX2F+PW5pbCl0aGVuCmZvciBfYmEsYWJhIGluIHBhaXJzKF9fYSlkbyBpZgooX2JhPD1kYWEtY19hKWFuZChfYmErY19hPj0xKXRoZW4KX2FhLnBhcmVudDpibGl0KGFhYStiX2EsYmFhK19iYS0xICtjX2EsYWJhWzFdLGFiYVsyXSxhYmFbM10pZW5kIGVuZCBlbmQgZW5kIGVuZCBlbmQsaW5pdD1mdW5jdGlvbihfYWEpCmlmCihhZC5pbml0KF9hYSkpdGhlbiBfYWEuYmdDb2xvcj1fYWEucGFyZW50OmdldFRoZW1lKCJHcmFwaGljQkciKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShkX2EsYWQpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJJbWFnZSJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0IikKbG9jYWwgYmI9ZGEoInV0aWxzIikuZ2V0VmFsdWVGcm9tWE1MO2xvY2FsIGNiPWRhKCJpbWFnZXMiKWxvY2FsIGRiLF9jPXRhYmxlLnVucGFjayxzdHJpbmcuc3ViCnJldHVybgpmdW5jdGlvbihhYylsb2NhbCBiYz1hYihhYykKbG9jYWwgY2M9IkltYWdlImJjOnNldFpJbmRleCgyKWxvY2FsIGRjO2xvY2FsIF9kO2xvY2FsIGFkPTE7bG9jYWwgYmQ9ZmFsc2U7bG9jYWwgY2Q7bG9jYWwgZGQ9ZmFsc2U7YmMud2lkdGg9MjQKYmMuaGVpZ2h0PTgKbG9jYWwgZnVuY3Rpb24gX19hKGJfYSkKaWYoZGN+PW5pbCl0aGVuIGxvY2FsIGNfYT17fQpmb3IgZF9hLF9hYSBpbiBwYWlycyhjb2xvcnMpZG8gaWYodHlwZShfYWEpPT0ibnVtYmVyIil0aGVuCmNfYVtfYWFdPXt0ZXJtLm5hdGl2ZVBhbGV0dGVDb2xvcihfYWEpfWVuZCBlbmQ7aWYoZGMucGFsZXR0ZX49bmlsKXRoZW4KZm9yIGRfYSxfYWEgaW4gcGFpcnMoZGMucGFsZXR0ZSlkbyBjX2FbMiBeZF9hXT1fYWEgZW5kIGVuZDtpZihkY1tiX2Fdfj1uaWwpYW5kCihkY1tiX2FdLnBhbGV0dGV+PW5pbCl0aGVuCmZvciBkX2EsX2FhIGluIHBhaXJzKGRjW2JfYV0ucGFsZXR0ZSlkbyBjX2FbMiBeZF9hXT1fYWEgZW5kIGVuZDtyZXR1cm4gY19hIGVuZCBlbmQKbG9jYWwgYV9hPXtpbml0PWZ1bmN0aW9uKGJfYSlpZihiYy5pbml0KGJfYSkpdGhlbgpiX2EuYmdDb2xvcj1iX2EucGFyZW50OmdldFRoZW1lKCJJbWFnZUJHIillbmQgZW5kLGdldFR5cGU9ZnVuY3Rpb24oYl9hKXJldHVybgpjYyBlbmQsbG9hZEltYWdlPWZ1bmN0aW9uKGJfYSxjX2EsZF9hKWlmIG5vdChmcy5leGlzdHMoY19hKSl0aGVuCmVycm9yKCJObyB2YWxpZCBwYXRoOiAiLi5jX2EpZW5kO2RjPWNiLmxvYWRJbWFnZUFzQmltZyhjX2EsZF9hKQphZD0xO19kPWRjO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHNldEltYWdlPWZ1bmN0aW9uKGJfYSxjX2EpCmRjPWNfYTtfZD1kYzthZD0xO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKXJldHVybiBiX2EgZW5kLHVzZVBhbGV0dGU9ZnVuY3Rpb24oYl9hLGNfYSlkZD0KY19hfj1uaWwgYW5kIGNfYSBvciB0cnVlO3JldHVybiBiX2EgZW5kLHBsYXk9ZnVuY3Rpb24oYl9hLGNfYSkKaWYoZGMuYW5pbWF0ZWQpdGhlbgpsb2NhbCBkX2E9CmRjW2FkXS5kdXJhdGlvbiBvciBkYy5zZWNvbmRzUGVyRnJhbWUgb3IgMC4yO2JfYS5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixiX2EpCmNkPW9zLnN0YXJ0VGltZXIoZF9hKWJkPWNfYSBvciBmYWxzZSBlbmQ7cmV0dXJuIGJfYSBlbmQsc2VsZWN0RnJhbWU9ZnVuY3Rpb24oYl9hLGNfYSlpZigKZGNbY19hXX49bmlsKXRoZW4gYWQ9Y19hO2lmKGNkfj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihjZCllbmQKYl9hOnVwZGF0ZURyYXcoKWVuZCBlbmQsZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGJfYSxjX2EsZF9hLC4uLikKYmMuZXZlbnRIYW5kbGVyKGJfYSxjX2EsZF9hLC4uLikKaWYoY19hPT0idGltZXIiKXRoZW4KaWYoZF9hPT1jZCl0aGVuCmlmKGRjW2FkKzFdfj1uaWwpdGhlbiBhZD1hZCsxO2xvY2FsIF9hYT0KZGNbYWRdLmR1cmF0aW9uIG9yIGRjLnNlY29uZHNQZXJGcmFtZSBvciAwLjIKY2Q9b3Muc3RhcnRUaW1lcihfYWEpZWxzZQppZihiZCl0aGVuIGFkPTEKbG9jYWwgX2FhPWRjW2FkXS5kdXJhdGlvbiBvciBkYy5zZWNvbmRzUGVyRnJhbWUgb3IgMC4yO2NkPW9zLnN0YXJ0VGltZXIoX2FhKWVuZCBlbmQ7Yl9hOnVwZGF0ZURyYXcoKWVuZCBlbmQgZW5kLGdldE1ldGFkYXRhPWZ1bmN0aW9uKGJfYSxjX2EpcmV0dXJuCmRjW2NfYV1lbmQsZ2V0SW1hZ2VTaXplPWZ1bmN0aW9uKGJfYSlyZXR1cm4gZGMud2lkdGgsZGMuaGVpZ2h0IGVuZCxyZXNpemVJbWFnZT1mdW5jdGlvbihiX2EsY19hLGRfYSkKX2Q9Y2IucmVzaXplQklNRyhkYyxjX2EsZF9hKWJfYTp1cGRhdGVEcmF3KClyZXR1cm4gYl9hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYl9hLGNfYSkKYmMuc2V0VmFsdWVzQnlYTUxEYXRhKGJfYSxjX2EpCmlmKGJiKCJwYXRoIixjX2Epfj1uaWwpdGhlbiBiX2E6bG9hZEltYWdlKGJiKCJwYXRoIixjX2EpKWVuZDtyZXR1cm4gYl9hIGVuZCxkcmF3PWZ1bmN0aW9uKGJfYSkKaWYKKGJjLmRyYXcoYl9hKSl0aGVuCmlmKF9kfj1uaWwpdGhlbiBpZihkZCl0aGVuCmJfYTpnZXRCYXNlRnJhbWUoKTpzZXRUaGVtZUNvbG9yKF9fYShhZCkpZW5kO2xvY2FsIGNfYSxkX2E9Yl9hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgX2FhLGFhYT1iX2E6Z2V0U2l6ZSgpCmZvciBiYWEsY2FhIGluIGlwYWlycyhfZFthZF0pZG8gbG9jYWwgZGFhLF9iYSxhYmE9ZGIoY2FhKWRhYT1fYyhkYWEsMSxfYWEpCl9iYT1fYyhfYmEsMSxfYWEpYWJhPV9jKGFiYSwxLF9hYSkKYl9hLnBhcmVudDpibGl0KGNfYSxkX2ErYmFhLTEsZGFhLF9iYSxhYmEpaWYoYmFhPT1hYWEpdGhlbiBicmVhayBlbmQgZW5kIGVuZCBlbmQgZW5kfXJldHVybiBzZXRtZXRhdGFibGUoYV9hLGJjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiTGlzdCJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgiT2JqZWN0Iilsb2NhbCBiYj1kYSgidXRpbHMiKQpsb2NhbCBjYj1iYi5nZXRWYWx1ZUZyb21YTUwKcmV0dXJuCmZ1bmN0aW9uKGRiKWxvY2FsIF9jPWFiKGRiKWxvY2FsIGFjPSJMaXN0Il9jLndpZHRoPTE2O19jLmhlaWdodD02O19jOnNldFpJbmRleCg1KWxvY2FsIGJjPXt9CmxvY2FsIGNjO2xvY2FsIGRjO2xvY2FsIF9kPXRydWU7bG9jYWwgYWQ9ImxlZnQibG9jYWwgYmQ9MDtsb2NhbCBjZD10cnVlCmxvY2FsIGRkPXtnZXRUeXBlPWZ1bmN0aW9uKF9fYSlyZXR1cm4gYWMgZW5kLGFkZEl0ZW09ZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hLC4uLikKdGFibGUuaW5zZXJ0KGJjLHt0ZXh0PWFfYSxiZ0NvbD1iX2Egb3IgX19hLmJnQ29sb3IsZmdDb2w9CmNfYSBvciBfX2EuZmdDb2xvcixhcmdzPXsuLi59fSlpZigjYmM8PTEpdGhlbiBfX2E6c2V0VmFsdWUoYmNbMV0sZmFsc2UpZW5kCl9fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRPZmZzZXQ9ZnVuY3Rpb24oX19hLGFfYSkKYmQ9YV9hO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oX19hKXJldHVybiBiZCBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihfX2EsYV9hKQp0YWJsZS5yZW1vdmUoYmMsYV9hKV9fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKF9fYSxhX2EpCnJldHVybiBiY1thX2FdZW5kLGdldEFsbD1mdW5jdGlvbihfX2EpcmV0dXJuIGJjIGVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oX19hKWxvY2FsIGFfYT1fX2E6Z2V0VmFsdWUoKWZvciBiX2EsY19hIGluIHBhaXJzKGJjKWRvIGlmCihjX2E9PWFfYSl0aGVuIHJldHVybiBiX2EgZW5kIGVuZCBlbmQsY2xlYXI9ZnVuY3Rpb24oX19hKQpiYz17fV9fYTpzZXRWYWx1ZSh7fSxmYWxzZSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsZ2V0SXRlbUNvdW50PWZ1bmN0aW9uKF9fYSlyZXR1cm4KI2JjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EsZF9hLC4uLil0YWJsZS5yZW1vdmUoYmMsYV9hKQp0YWJsZS5pbnNlcnQoYmMsYV9hLHt0ZXh0PWJfYSxiZ0NvbD1jX2Egb3IgX19hLmJnQ29sb3IsZmdDb2w9CmRfYSBvciBfX2EuZmdDb2xvcixhcmdzPXsuLi59fSlfX2E6dXBkYXRlRHJhdygpcmV0dXJuIF9fYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihfX2EsYV9hKV9fYTpzZXRWYWx1ZSgKYmNbYV9hXW9ye30sZmFsc2UpX19hOnVwZGF0ZURyYXcoKXJldHVybiBfX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihfX2EsYV9hLGJfYSxjX2EpY2M9CmFfYSBvciBfX2EuYmdDb2xvcjtkYz1iX2Egb3IgX19hLmZnQ29sb3I7X2Q9Y19hfj1uaWwgYW5kIGNfYSBvcgp0cnVlO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRTY3JvbGxhYmxlPWZ1bmN0aW9uKF9fYSxhX2EpCmNkPWFfYTtpZihhX2E9PW5pbCl0aGVuIGNkPXRydWUgZW5kO19fYTp1cGRhdGVEcmF3KClyZXR1cm4gX19hIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oX19hLGFfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKF9fYSxhX2EpaWYoY2IoInNlbGVjdGlvbkJHIixhX2Epfj1uaWwpdGhlbgpjYz1jb2xvcnNbY2IoInNlbGVjdGlvbkJHIixhX2EpXWVuZDtpZihjYigic2VsZWN0aW9uRkciLGFfYSl+PW5pbCl0aGVuCmRjPWNvbG9yc1tjYigic2VsZWN0aW9uRkciLGFfYSldZW5kO2lmKGNiKCJzY3JvbGxhYmxlIixhX2Epfj1uaWwpdGhlbgppZgooY2IoInNjcm9sbGFibGUiLGFfYSkpdGhlbiBfX2E6c2V0U2Nyb2xsYWJsZSh0cnVlKWVsc2UgX19hOnNldFNjcm9sbGFibGUoZmFsc2UpZW5kIGVuZDtpZigKY2IoIm9mZnNldCIsYV9hKX49bmlsKXRoZW4gYmQ9Y2IoIm9mZnNldCIsYV9hKWVuZAppZihhX2FbIml0ZW0iXX49Cm5pbCl0aGVuIGxvY2FsIGJfYT1hX2FbIml0ZW0iXQppZihiX2EucHJvcGVydGllc349bmlsKXRoZW4gYl9hPXtiX2F9ZW5kO2ZvciBjX2EsZF9hIGluIHBhaXJzKGJfYSlkbwpfX2E6YWRkSXRlbShjYigidGV4dCIsZF9hKSxjb2xvcnNbY2IoImJnIixkX2EpXSxjb2xvcnNbY2IoImZnIixkX2EpXSllbmQgZW5kO3JldHVybiBfX2EgZW5kLHNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oX19hLGFfYSxiX2EsY19hKQppZgooX2Muc2Nyb2xsSGFuZGxlcihfX2EsYV9hLGJfYSxjX2EpKXRoZW4KaWYoY2QpdGhlbiBsb2NhbCBkX2EsX2FhPV9fYTpnZXRTaXplKCliZD1iZCthX2E7aWYoYmQ8MCl0aGVuIGJkPTAgZW5kCmlmKGFfYT49MSl0aGVuIGlmKCNiYz5fYWEpdGhlbiBpZihiZD4KI2JjLV9hYSl0aGVuIGJkPSNiYy1fYWEgZW5kO2lmKGJkPj0jYmMpdGhlbiBiZD0jYmMtMSBlbmQgZWxzZSBiZD0KYmQtMSBlbmQgZW5kO19fYTp1cGRhdGVEcmF3KCllbmQ7cmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSkKaWYKKF9jLm1vdXNlSGFuZGxlcihfX2EsYV9hLGJfYSxjX2EpKXRoZW4KbG9jYWwgZF9hLF9hYT1fX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihfX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSlsb2NhbCBhYWEsYmFhPV9fYTpnZXRTaXplKCkKaWYoI2JjPjApdGhlbiBmb3Igbj0xLGJhYSBkbwppZihiY1tuK2JkXX49bmlsKXRoZW4gaWYoZF9hPD1iX2EpYW5kCihkX2ErYWFhPmJfYSlhbmQoX2FhK24tMSA9PWNfYSl0aGVuCl9fYTpzZXRWYWx1ZShiY1tuK2JkXSlfX2E6dXBkYXRlRHJhdygpZW5kIGVuZCBlbmQgZW5kO3JldHVybiB0cnVlIGVuZDtyZXR1cm4gZmFsc2UgZW5kLGRyYWdIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hLGNfYSlyZXR1cm4KX19hOm1vdXNlSGFuZGxlcihhX2EsYl9hLGNfYSllbmQsdG91Y2hIYW5kbGVyPWZ1bmN0aW9uKF9fYSxhX2EsYl9hKXJldHVybgpfX2E6bW91c2VIYW5kbGVyKDEsYV9hLGJfYSllbmQsZHJhdz1mdW5jdGlvbihfX2EpCmlmKF9jLmRyYXcoX19hKSl0aGVuCmlmCihfX2EucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBhX2EsYl9hPV9fYTpnZXRBbmNob3JQb3NpdGlvbigpbG9jYWwgY19hLGRfYT1fX2E6Z2V0U2l6ZSgpaWYoCl9fYS5iZ0NvbG9yfj1mYWxzZSl0aGVuCl9fYS5wYXJlbnQ6ZHJhd0JhY2tncm91bmRCb3goYV9hLGJfYSxjX2EsZF9hLF9fYS5iZ0NvbG9yKWVuZApmb3Igbj0xLGRfYSBkbwppZihiY1tuK2JkXX49bmlsKXRoZW4KaWYoYmNbbitiZF09PQpfX2E6Z2V0VmFsdWUoKSl0aGVuCmlmKF9kKXRoZW4KX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYStuLTEsYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNfYSxhZCksY2MsZGMpZWxzZQpfX2EucGFyZW50OndyaXRlVGV4dChhX2EsYl9hK24tMSxiYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGJjW24rYmRdLnRleHQsY19hLGFkKSxiY1sKbitiZF0uYmdDb2wsYmNbbitiZF0uZmdDb2wpZW5kIGVsc2UKX19hLnBhcmVudDp3cml0ZVRleHQoYV9hLGJfYStuLTEsYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiY1tuK2JkXS50ZXh0LGNfYSxhZCksYmNbCm4rYmRdLmJnQ29sLGJjW24rYmRdLmZnQ29sKWVuZCBlbmQgZW5kIGVuZCBlbmQgZW5kLGluaXQ9ZnVuY3Rpb24oX19hKQpfX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsX19hKV9fYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX2RyYWciLF9fYSkKX19hLnBhcmVudDphZGRFdmVudCgibW91c2Vfc2Nyb2xsIixfX2EpCmlmKF9jLmluaXQoX19hKSl0aGVuIF9fYS5iZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIkxpc3RCRyIpCl9fYS5mZ0NvbG9yPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIkxpc3RUZXh0IiljYz1fX2EucGFyZW50OmdldFRoZW1lKCJTZWxlY3Rpb25CRyIpCmRjPV9fYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvblRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShkZCxfYyllbmQgZW5kCmFhWyJvYmplY3RzIl1bIkFuaW1hdGlvbiJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj1kYSgidXRpbHMiKS5nZXRWYWx1ZUZyb21YTUwKbG9jYWwgYmI9ZGEoImJhc2FsdEV2ZW50IikKbG9jYWwgY2IsZGIsX2MsYWMsYmMsY2M9bWF0aC5mbG9vcixtYXRoLnNpbixtYXRoLmNvcyxtYXRoLnBpLG1hdGguc3FydCxtYXRoLnBvdwpsb2NhbCBkYz1mdW5jdGlvbihjYWIsZGFiLF9iYilyZXR1cm4gY2FiKyAoZGFiLWNhYikqX2JiIGVuZDtsb2NhbCBfZD1mdW5jdGlvbihjYWIpcmV0dXJuIGNhYiBlbmQKbG9jYWwgYWQ9ZnVuY3Rpb24oY2FiKXJldHVybiAxIC1jYWIgZW5kO2xvY2FsIGJkPWZ1bmN0aW9uKGNhYilyZXR1cm4gY2FiKmNhYipjYWIgZW5kO2xvY2FsIGNkPWZ1bmN0aW9uKGNhYilyZXR1cm4KYWQoYmQoYWQoY2FiKSkpZW5kO2xvY2FsIGRkPWZ1bmN0aW9uKGNhYilyZXR1cm4KZGMoYmQoY2FiKSxjZChjYWIpLGNhYillbmQ7bG9jYWwgX19hPWZ1bmN0aW9uKGNhYilyZXR1cm4KZGIoKGNhYiphYykvMillbmQ7bG9jYWwgYV9hPWZ1bmN0aW9uKGNhYilyZXR1cm4KYWQoX2MoKGNhYiphYykvMikpZW5kO2xvY2FsIGJfYT1mdW5jdGlvbihjYWIpcmV0dXJuCi0gKF9jKGFjKngpLTEpLzIgZW5kCmxvY2FsIGNfYT1mdW5jdGlvbihjYWIpCmxvY2FsIGRhYj0xLjcwMTU4O2xvY2FsIF9iYj1kYWIrMTtyZXR1cm4gX2JiKmNhYl4zIC1kYWIqY2FiXjIgZW5kO2xvY2FsIGRfYT1mdW5jdGlvbihjYWIpcmV0dXJuIGNhYl4zIGVuZApsb2NhbCBfYWE9ZnVuY3Rpb24oY2FiKWxvY2FsIGRhYj0oMiAqYWMpLzM7cmV0dXJuCgpjYWI9PTAgYW5kIDAgb3IoY2FiPT0xIGFuZCAxIG9yKC0yIF4gKDEwICpjYWItMTApKgpkYigoY2FiKjEwIC0xMC43NSkqZGFiKSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFhYShjYWIpcmV0dXJuIGNhYj09MCBhbmQgMCBvciAyIF4gKDEwICpjYWItMTApZW5kCmxvY2FsIGZ1bmN0aW9uIGJhYShjYWIpcmV0dXJuIGNhYj09MCBhbmQgMCBvciAyIF4gKDEwICpjYWItMTApZW5kCmxvY2FsIGZ1bmN0aW9uIGNhYShjYWIpbG9jYWwgZGFiPTEuNzAxNTg7bG9jYWwgX2JiPWRhYioxLjUyNTtyZXR1cm4KY2FiPDAuNSBhbmQoICgyICpjYWIpXjIgKgooIChfYmIrMSkqMiAqY2FiLV9iYikpLzIgb3IKKAooMiAqY2FiLTIpXjIgKiAoIChfYmIrMSkqIChjYWIqMiAtMikrX2JiKSsyKS8yIGVuZDtsb2NhbCBmdW5jdGlvbiBkYWEoY2FiKXJldHVybgpjYWI8MC41IGFuZCA0ICpjYWJeMyBvciAxIC0gKC0yICpjYWIrMileMyAvMiBlbmQKbG9jYWwgZnVuY3Rpb24gX2JhKGNhYikKbG9jYWwgZGFiPSgyICphYykvNC41CnJldHVybgpjYWI9PTAgYW5kIDAgb3IoY2FiPT0xIGFuZCAxIG9yCigKY2FiPDAuNSBhbmQtICgyIF4gKDIwICpjYWItMTApKgpkYigoMjAgKmNhYi0xMS4xMjUpKmRhYikpLzIgb3IKKDIgXiAoLTIwICpjYWIrMTApKmRiKCgyMCAqY2FiLTExLjEyNSkqZGFiKSkvMiArMSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFiYShjYWIpcmV0dXJuCmNhYj09MCBhbmQgMCBvcihjYWI9PTEgYW5kIDEgb3IKKApjYWI8MC41IGFuZCAyIF4gKDIwICpjYWItMTApLzIgb3IoMiAtMiBeICgtMjAgKmNhYisxMCkpLzIpKWVuZDtsb2NhbCBmdW5jdGlvbiBiYmEoY2FiKXJldHVybgpjYWI8MC41IGFuZCAyICpjYWJeMiBvciAxIC0gKC0yICpjYWIrMileMiAvMiBlbmQ7bG9jYWwgZnVuY3Rpb24gY2JhKGNhYilyZXR1cm4KY2FiPDAuNSBhbmQgOCAqCmNhYl40IG9yIDEgLSAoLTIgKmNhYisyKV40IC8yIGVuZDtsb2NhbCBmdW5jdGlvbiBkYmEoY2FiKXJldHVybgpjYWI8MC41IGFuZCAxNiAqCmNhYl41IG9yIDEgLSAoLTIgKmNhYisyKV41IC8yIGVuZDtsb2NhbCBmdW5jdGlvbiBfY2EoY2FiKQpyZXR1cm4gY2FiXjIgZW5kO2xvY2FsIGZ1bmN0aW9uIGFjYShjYWIpcmV0dXJuIGNhYl40IGVuZApsb2NhbCBmdW5jdGlvbiBiY2EoY2FiKXJldHVybiBjYWJeNSBlbmQ7bG9jYWwgZnVuY3Rpb24gY2NhKGNhYilsb2NhbCBkYWI9MS43MDE1ODtsb2NhbCBfYmI9ZGFiKzE7cmV0dXJuCjEgK19iYiogKGNhYi0xKV4zICtkYWIqIChjYWItMSleMiBlbmQ7bG9jYWwgZnVuY3Rpb24gZGNhKGNhYilyZXR1cm4gMSAtCigxIC1jYWIpXjMgZW5kCmxvY2FsIGZ1bmN0aW9uIF9kYShjYWIpbG9jYWwgZGFiPSgyICphYykvMztyZXR1cm4KCmNhYj09MCBhbmQgMCBvcihjYWI9PTEgYW5kIDEgb3IoCjIgXiAoLTEwICpjYWIpKmRiKChjYWIqMTAgLTAuNzUpKmRhYikrMSkpZW5kCmxvY2FsIGZ1bmN0aW9uIGFkYShjYWIpcmV0dXJuIGNhYj09MSBhbmQgMSBvciAxIC0yIF4gKC0xMCAqY2FiKWVuZDtsb2NhbCBmdW5jdGlvbiBiZGEoY2FiKXJldHVybiAxIC0gKDEgLWNhYikqICgxIC1jYWIpZW5kO2xvY2FsIGZ1bmN0aW9uIGNkYShjYWIpcmV0dXJuIDEgLSAoCjEgLWNhYileNCBlbmQ7bG9jYWwgZnVuY3Rpb24gZGRhKGNhYikKcmV0dXJuIDEgLSAoMSAtY2FiKV41IGVuZApsb2NhbCBmdW5jdGlvbiBfX2IoY2FiKXJldHVybiAxIC1iYygxIC1jYyhjYWIsMikpZW5kO2xvY2FsIGZ1bmN0aW9uIGFfYihjYWIpcmV0dXJuIGJjKDEgLWNjKGNhYi0xLDIpKWVuZApsb2NhbCBmdW5jdGlvbiBiX2IoY2FiKXJldHVybgoKY2FiPDAuNSBhbmQoMSAtYmMoCjEgLWNjKDIgKmNhYiwyKSkpLzIgb3IoYmMoMSAtY2MoLTIgKmNhYisyLDIpKSsxKS8yIGVuZApsb2NhbCBmdW5jdGlvbiBjX2IoY2FiKWxvY2FsIGRhYj03LjU2MjU7bG9jYWwgX2JiPTIuNzUKaWYoY2FiPDEgL19iYil0aGVuIHJldHVybiBkYWIqY2FiKmNhYiBlbHNlaWYoY2FiPDIgL19iYil0aGVuIGxvY2FsIGFiYj1jYWItCjEuNSAvX2JiO3JldHVybiBkYWIqYWJiKmFiYiswLjc1IGVsc2VpZihjYWI8Mi41IC9fYmIpdGhlbiBsb2NhbCBhYmI9Y2FiLQoyLjI1IC9fYmI7cmV0dXJuIGRhYiphYmIqYWJiKzAuOTM3NSBlbHNlCmxvY2FsIGFiYj1jYWItMi42MjUgL19iYjtyZXR1cm4gZGFiKmFiYiphYmIrMC45ODQzNzUgZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBkX2IoY2FiKXJldHVybiAxIC1jX2IoMSAtY2FiKWVuZDtsb2NhbCBmdW5jdGlvbiBfYWIoY2FiKXJldHVybgp4PDAuNSBhbmQoMSAtCmNfYigxIC0yICpjYWIpKS8yIG9yKDEgK2NfYigyICpjYWItMSkpLzIgZW5kCmxvY2FsIGFhYj17bGluZWFyPV9kLGxlcnA9ZGMsZmxpcD1hZCxlYXNlSW49YmQsZWFzZUluU2luZT1hX2EsZWFzZUluQmFjaz1jX2EsZWFzZUluQ3ViaWM9ZF9hLGVhc2VJbkVsYXN0aWM9X2FhLGVhc2VJbkV4cG89YmFhLGVhc2VJblF1YWQ9X2NhLGVhc2VJblF1YXJ0PWFjYSxlYXNlSW5RdWludD1iY2EsZWFzZUluQ2lyYz1fX2IsZWFzZUluQm91bmNlPWRfYixlYXNlT3V0PWNkLGVhc2VPdXRTaW5lPV9fYSxlYXNlT3V0QmFjaz1jY2EsZWFzZU91dEN1YmljPWRjYSxlYXNlT3V0RWxhc3RpYz1fZGEsZWFzZU91dEV4cG89YWRhLGVhc2VPdXRRdWFkPWJkYSxlYXNlT3V0UXVhcnQ9Y2RhLGVhc2VPdXRRdWludD1kZGEsZWFzZU91dENpcmM9YV9iLGVhc2VPdXRCb3VuY2U9Y19iLGVhc2VJbk91dD1kZCxlYXNlSW5PdXRTaW5lPWJfYSxlYXNlSW5PdXRCYWNrPWNhYSxlYXNlSW5PdXRDdWJpYz1kYWEsZWFzZUluT3V0RWxhc3RpYz1fYmEsZWFzZUluT3V0RXhwbz1hYmEsZWFzZUluT3V0UXVhZD1iYmEsZWFzZUluT3V0UXVhcnQ9Y2JhLGVhc2VJbk91dFF1aW50PWRiYSxlYXNlSW5PdXRDaXJjPWJfYixlYXNlSW5PdXRCb3VuY2U9X2FifWxvY2FsIGJhYj17fQpyZXR1cm4KZnVuY3Rpb24oY2FiKWxvY2FsIGRhYj17fWxvY2FsIF9iYj0iQW5pbWF0aW9uImxvY2FsIGFiYjtsb2NhbCBiYmI9e31sb2NhbCBjYmI9MDtsb2NhbCBkYmI9ZmFsc2U7bG9jYWwgX2NiPTE7bG9jYWwgYWNiPWZhbHNlCmxvY2FsIGJjYj1iYigpbG9jYWwgY2NiPTA7bG9jYWwgZGNiO2xvY2FsIF9kYj1mYWxzZTtsb2NhbCBhZGI9ZmFsc2U7bG9jYWwgYmRiPSJlYXNlT3V0ImxvY2FsIGNkYjtsb2NhbCBmdW5jdGlvbiBkZGIoY19jKWZvciBkX2MsX2FjIGluIHBhaXJzKGNfYylkbwpfYWMoZGFiLGJiYltfY2JdLnQsX2NiKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX19jKGNfYylpZihfY2I9PTEpdGhlbgpjX2M6YW5pbWF0aW9uU3RhcnRIYW5kbGVyKCllbmQ7aWYoYmJiW19jYl1+PW5pbCl0aGVuIGRkYihiYmJbX2NiXS5mKQpjYmI9YmJiW19jYl0udCBlbmQ7X2NiPV9jYisxCmlmKGJiYltfY2JdPT1uaWwpdGhlbiBpZihhY2IpdGhlbiBfY2I9MTtjYmI9MCBlbHNlCmNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpcmV0dXJuIGVuZCBlbmQ7aWYoYmJiW19jYl0udD4wKXRoZW4KYWJiPW9zLnN0YXJ0VGltZXIoYmJiW19jYl0udC1jYmIpZWxzZSBfX2MoY19jKWVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYV9jKGNfYyxkX2MpZm9yIG49MSwjYmJiIGRvCmlmKGJiYltuXS50PT1jX2MpdGhlbiB0YWJsZS5pbnNlcnQoYmJiW25dLmYsZF9jKXJldHVybiBlbmQgZW5kCmZvciBuPTEsI2JiYiBkbwppZihiYmJbbl0udD5jX2MpdGhlbiBpZgooYmJiW24tMV1+PW5pbCl0aGVuIGlmKGJiYltuLTFdLnQ8Y19jKXRoZW4KdGFibGUuaW5zZXJ0KGJiYixuLTEse3Q9Y19jLGY9e2RfY319KXJldHVybiBlbmQgZWxzZQp0YWJsZS5pbnNlcnQoYmJiLG4se3Q9Y19jLGY9e2RfY319KXJldHVybiBlbmQgZW5kIGVuZAppZigjYmJiPD0wKXRoZW4gdGFibGUuaW5zZXJ0KGJiYiwxLHt0PWNfYyxmPXtkX2N9fSlyZXR1cm4gZWxzZWlmKApiYmJbI2JiYl0udDxjX2MpdGhlbiB0YWJsZS5pbnNlcnQoYmJiLHt0PWNfYyxmPXtkX2N9fSllbmQgZW5kCmxvY2FsIGZ1bmN0aW9uIGJfYyhjX2MsZF9jLF9hYyxhYWMsYmFjLGNhYyxkYWMsX2JjKWxvY2FsIGFiYz1jZGI7bG9jYWwgYmJjLGNiYztsb2NhbCBkYmM9IiJpZihhYmMucGFyZW50fj1uaWwpdGhlbgpkYmM9YWJjLnBhcmVudDpnZXROYW1lKCllbmQ7ZGJjPWRiYy4uYWJjOmdldE5hbWUoKQphX2MoYWFjKzAuMDUsZnVuY3Rpb24oKQppZgooZGFjfj1uaWwpdGhlbiBpZihiYWJbZGFjXT09bmlsKXRoZW4gYmFiW2RhY109e31lbmQ7aWYoYmFiW2RhY11bZGJjXX49bmlsKXRoZW4KaWYoCmJhYltkYWNdW2RiY11+PV9iYyl0aGVuIGJhYltkYWNdW2RiY106Y2FuY2VsKCllbmQgZW5kO2JhYltkYWNdW2RiY109X2JjIGVuZDtiYmMsY2JjPWJhYyhhYmMpZW5kKQpmb3Igbj0wLjA1LF9hYyswLjAxLDAuMDUgZG8KYV9jKGFhYytuLGZ1bmN0aW9uKCkKbG9jYWwgX2NjPW1hdGguZmxvb3IoYWFiLmxlcnAoYmJjLGNfYyxhYWJbYmRiXShuL19hYykpKzAuNSkKbG9jYWwgYWNjPW1hdGguZmxvb3IoYWFiLmxlcnAoY2JjLGRfYyxhYWJbYmRiXShuL19hYykpKzAuNSljYWMoYWJjLF9jYyxhY2MpCmlmKGRhY349bmlsKXRoZW4gaWYobj49X2FjLTAuMDEpdGhlbiBpZihiYWJbZGFjXVtkYmNdPT1fYmMpdGhlbiBiYWJbZGFjXVtkYmNdPQpuaWwgZW5kIGVuZCBlbmQgZW5kKWVuZCBlbmQKZGFiPXtuYW1lPWNhYixnZXRUeXBlPWZ1bmN0aW9uKGNfYylyZXR1cm4gX2JiIGVuZCxnZXRCYXNlRnJhbWU9ZnVuY3Rpb24oY19jKWlmKGNfYy5wYXJlbnR+PW5pbCl0aGVuCnJldHVybiBjX2MucGFyZW50OmdldEJhc2VGcmFtZSgpZW5kO3JldHVybiBjX2MgZW5kLHNldE1vZGU9ZnVuY3Rpb24oY19jLGRfYykKYmRiPWRfYztyZXR1cm4gY19jIGVuZCxhZGRNb2RlPWZ1bmN0aW9uKGNfYyxkX2MsX2FjKWFhYltkX2NdPV9hYztyZXR1cm4gY19jIGVuZCxnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb249ZnVuY3Rpb24oY19jLGRfYyxfYWMpCmxvY2FsIGFhYz1mdW5jdGlvbihiYWMpCmlmKApiYWM6c3ViKDEsMSk9PSIjIil0aGVuCmxvY2FsIGNhYz1jX2M6Z2V0QmFzZUZyYW1lKCk6Z2V0RGVlcE9iamVjdChiYWM6c3ViKDIsYmFjOmxlbigpKSkKaWYoY2Fjfj1uaWwpYW5kKGNhYy5pbnRlcm5hbE9iamV0Q2FsbH49bmlsKXRoZW4gZF9jKGNfYyxmdW5jdGlvbigpCmNhYzppbnRlcm5hbE9iamV0Q2FsbCgpZW5kKWVuZCBlbHNlCmRfYyhjX2MsY19jOmdldEJhc2VGcmFtZSgpOmdldFZhcmlhYmxlKGJhYykpZW5kIGVuZDtpZih0eXBlKF9hYyk9PSJzdHJpbmciKXRoZW4gYWFjKF9hYyllbHNlaWYodHlwZShfYWMpPT0idGFibGUiKXRoZW4KZm9yIGJhYyxjYWMgaW4gcGFpcnMoX2FjKWRvIGFhYyhjYWMpZW5kIGVuZDtyZXR1cm4gY19jIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY19jLGRfYylfZGI9CmFiKCJsb29wIixkX2MpPT10cnVlIGFuZCB0cnVlIG9yIGZhbHNlCmlmKAphYigib2JqZWN0IixkX2Mpfj1uaWwpdGhlbgpsb2NhbCBfYWM9Y19jOmdldEJhc2VGcmFtZSgpOmdldERlZXBPYmplY3QoYWIoIm9iamVjdCIsZF9jKSlpZihfYWM9PW5pbCl0aGVuCl9hYz1jX2M6Z2V0QmFzZUZyYW1lKCk6Z2V0VmFyaWFibGUoYWIoIm9iamVjdCIsZF9jKSllbmQKaWYoX2Fjfj1uaWwpdGhlbiBjX2M6c2V0T2JqZWN0KF9hYyllbmQgZW5kCmlmKGRfY1sibW92ZSJdfj1uaWwpdGhlbiBsb2NhbCBfYWM9YWIoIngiLGRfY1sibW92ZSJdKQpsb2NhbCBhYWM9YWIoInkiLGRfY1sibW92ZSJdKWxvY2FsIGJhYz1hYigiZHVyYXRpb24iLGRfY1sibW92ZSJdKQpsb2NhbCBjYWM9YWIoInRpbWUiLGRfY1sibW92ZSJdKWNfYzptb3ZlKF9hYyxhYWMsYmFjLGNhYyllbmQKaWYoZF9jWyJzaXplIl1+PW5pbCl0aGVuIGxvY2FsIF9hYz1hYigid2lkdGgiLGRfY1sic2l6ZSJdKQpsb2NhbCBhYWM9YWIoImhlaWdodCIsZF9jWyJzaXplIl0pbG9jYWwgYmFjPWFiKCJkdXJhdGlvbiIsZF9jWyJzaXplIl0pCmxvY2FsIGNhYz1hYigidGltZSIsZF9jWyJzaXplIl0pY19jOnNpemUoX2FjLGFhYyxiYWMsY2FjKWVuZAppZihkX2NbIm9mZnNldCJdfj1uaWwpdGhlbiBsb2NhbCBfYWM9YWIoIngiLGRfY1sib2Zmc2V0Il0pCmxvY2FsIGFhYz1hYigieSIsZF9jWyJvZmZzZXQiXSlsb2NhbCBiYWM9YWIoImR1cmF0aW9uIixkX2NbIm9mZnNldCJdKQpsb2NhbCBjYWM9YWIoInRpbWUiLGRfY1sib2Zmc2V0Il0pY19jOm9mZnNldChfYWMsYWFjLGJhYyxjYWMpZW5kCmlmKGRfY1sidGV4dENvbG9yIl1+PW5pbCl0aGVuCmxvY2FsIF9hYz1hYigiZHVyYXRpb24iLGRfY1sidGV4dENvbG9yIl0pbG9jYWwgYWFjPWFiKCJ0aW1lIixkX2NbInRleHRDb2xvciJdKWxvY2FsIGJhYz17fQpsb2NhbCBjYWM9ZF9jWyJ0ZXh0Q29sb3IiXVsiY29sb3IiXQppZihjYWN+PW5pbCl0aGVuIGlmKGNhYy5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBjYWM9e2NhY31lbmQ7Zm9yIGRhYyxfYmMgaW4gcGFpcnMoY2FjKWRvCnRhYmxlLmluc2VydChiYWMsY29sb3JzW19iYzp2YWx1ZSgpXSllbmQgZW5kO2lmKF9hY349bmlsKWFuZCgjYmFjPjApdGhlbgpjX2M6Y2hhbmdlVGV4dENvbG9yKF9hYyxhYWMgb3IgMCx0YWJsZS51bnBhY2soYmFjKSllbmQgZW5kCmlmKGRfY1siYmFja2dyb3VuZCJdfj1uaWwpdGhlbgpsb2NhbCBfYWM9YWIoImR1cmF0aW9uIixkX2NbImJhY2tncm91bmQiXSlsb2NhbCBhYWM9YWIoInRpbWUiLGRfY1siYmFja2dyb3VuZCJdKWxvY2FsIGJhYz17fQpsb2NhbCBjYWM9ZF9jWyJiYWNrZ3JvdW5kIl1bImNvbG9yIl0KaWYoY2Fjfj1uaWwpdGhlbiBpZihjYWMucHJvcGVydGllc349bmlsKXRoZW4gY2FjPXtjYWN9ZW5kO2ZvciBkYWMsX2JjIGluIHBhaXJzKGNhYylkbwp0YWJsZS5pbnNlcnQoYmFjLGNvbG9yc1tfYmM6dmFsdWUoKV0pZW5kIGVuZDtpZihfYWN+PW5pbClhbmQoI2JhYz4wKXRoZW4KY19jOmNoYW5nZUJhY2tncm91bmQoX2FjLGFhYyBvciAwLHRhYmxlLnVucGFjayhiYWMpKWVuZCBlbmQKaWYoZF9jWyJ0ZXh0Il1+PW5pbCl0aGVuIGxvY2FsIF9hYz1hYigiZHVyYXRpb24iLGRfY1sidGV4dCJdKQpsb2NhbCBhYWM9YWIoInRpbWUiLGRfY1sidGV4dCJdKWxvY2FsIGJhYz17fWxvY2FsIGNhYz1kX2NbInRleHQiXVsidGV4dCJdCmlmKGNhY349bmlsKXRoZW4gaWYoY2FjLnByb3BlcnRpZXN+PW5pbCl0aGVuCmNhYz17Y2FjfWVuZDtmb3IgZGFjLF9iYyBpbiBwYWlycyhjYWMpZG8KdGFibGUuaW5zZXJ0KGJhYyxfYmM6dmFsdWUoKSllbmQgZW5kO2lmKF9hY349bmlsKWFuZCgjYmFjPjApdGhlbgpjX2M6Y2hhbmdlVGV4dChfYWMsYWFjIG9yIDAsdGFibGUudW5wYWNrKGJhYykpZW5kIGVuZDtpZihhYigib25Eb25lIixkX2Mpfj1uaWwpdGhlbgpjX2M6Z2VuZXJhdGVYTUxFdmVudEZ1bmN0aW9uKGNfYy5vbkRvbmUsYWIoIm9uRG9uZSIsZF9jKSllbmQ7aWYoYWIoIm9uU3RhcnQiLGRfYyl+PW5pbCl0aGVuCmNfYzpnZW5lcmF0ZVhNTEV2ZW50RnVuY3Rpb24oY19jLm9uRG9uZSxhYigib25TdGFydCIsZF9jKSllbmQKaWYKKGFiKCJhdXRvRGVzdHJveSIsZF9jKX49bmlsKXRoZW4gaWYoYWIoImF1dG9EZXN0cm95IixkX2MpKXRoZW4gYWRiPXRydWUgZW5kIGVuZDtiZGI9YWIoIm1vZGUiLGRfYylvciBiZGIKaWYoYWIoInBsYXkiLGRfYyl+PW5pbCl0aGVuIGlmCihhYigicGxheSIsZF9jKSl0aGVuIGNfYzpwbGF5KF9kYillbmQgZW5kO3JldHVybiBjX2MgZW5kLGdldFpJbmRleD1mdW5jdGlvbihjX2MpcmV0dXJuCjEgZW5kLGdldE5hbWU9ZnVuY3Rpb24oY19jKXJldHVybiBjX2MubmFtZSBlbmQsc2V0T2JqZWN0PWZ1bmN0aW9uKGNfYyxkX2MpY2RiPWRfYztyZXR1cm4gY19jIGVuZCxtb3ZlPWZ1bmN0aW9uKGNfYyxkX2MsX2FjLGFhYyxiYWMsY2FjKWNkYj0KY2FjIG9yIGNkYgpiX2MoZF9jLF9hYyxhYWMsYmFjIG9yIDAsY2RiLmdldFBvc2l0aW9uLGNkYi5zZXRQb3NpdGlvbiwicG9zaXRpb24iLGNfYylyZXR1cm4gY19jIGVuZCxvZmZzZXQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMsYWFjLGJhYyxjYWMpY2RiPQpjYWMgb3IgY2RiCmJfYyhkX2MsX2FjLGFhYyxiYWMgb3IgMCxjZGIuZ2V0T2Zmc2V0LGNkYi5zZXRPZmZzZXQsIm9mZnNldCIsY19jKXJldHVybiBjX2MgZW5kLHNpemU9ZnVuY3Rpb24oY19jLGRfYyxfYWMsYWFjLGJhYyxjYWMpY2RiPWNhYyBvcgpjZGIKYl9jKGRfYyxfYWMsYWFjLGJhYyBvciAwLGNkYi5nZXRTaXplLGNkYi5zZXRTaXplLCJzaXplIixjX2MpcmV0dXJuIGNfYyBlbmQsY2hhbmdlVGV4dD1mdW5jdGlvbihjX2MsZF9jLF9hYywuLi4pCmxvY2FsIGFhYz17Li4ufV9hYz1fYWMgb3IgMDtjZGI9b2JqIG9yIGNkYjtmb3Igbj0xLCNhYWMgZG8KYV9jKF9hYytuKiAoZF9jLyNhYWMpLGZ1bmN0aW9uKCkKY2RiLnNldFRleHQoY2RiLGFhY1tuXSllbmQpZW5kO3JldHVybiBjX2MgZW5kLGNoYW5nZUJhY2tncm91bmQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMsLi4uKQpsb2NhbCBhYWM9ey4uLn1fYWM9X2FjIG9yIDA7Y2RiPW9iaiBvciBjZGI7Zm9yIG49MSwjYWFjIGRvCmFfYyhfYWMrbiogKGRfYy8jYWFjKSxmdW5jdGlvbigpCmNkYi5zZXRCYWNrZ3JvdW5kKGNkYixhYWNbbl0pZW5kKWVuZDtyZXR1cm4gY19jIGVuZCxjaGFuZ2VUZXh0Q29sb3I9ZnVuY3Rpb24oY19jLGRfYyxfYWMsLi4uKQpsb2NhbCBhYWM9ey4uLn1fYWM9X2FjIG9yIDA7Y2RiPW9iaiBvciBjZGI7Zm9yIG49MSwjYWFjIGRvCmFfYyhfYWMrbiogKGRfYy8jYWFjKSxmdW5jdGlvbigpCmNkYi5zZXRGb3JlZ3JvdW5kKGNkYixhYWNbbl0pZW5kKWVuZDtyZXR1cm4gY19jIGVuZCxhZGQ9ZnVuY3Rpb24oY19jLGRfYyxfYWMpCmRjYj1kX2MKYV9jKChfYWMgb3IgY2NiKSsKKGJiYlsjYmJiXX49bmlsIGFuZCBiYmJbI2JiYl0udCBvciAwKSxkX2MpcmV0dXJuIGNfYyBlbmQsd2FpdD1mdW5jdGlvbihjX2MsZF9jKWNjYj1kX2M7cmV0dXJuIGNfYyBlbmQscmVwPWZ1bmN0aW9uKGNfYyxkX2MpCmlmKApkY2J+PW5pbCl0aGVuIGZvciBuPTEsZF9jIG9yIDEgZG8KYV9jKCh3YWl0IG9yIGNjYikrCihiYmJbI2JiYl1+PW5pbCBhbmQgYmJiWyNiYmJdLnQgb3IgMCksZGNiKWVuZCBlbmQ7cmV0dXJuIGNfYyBlbmQsb25Eb25lPWZ1bmN0aW9uKGNfYyxkX2MpCmJjYjpyZWdpc3RlckV2ZW50KCJhbmltYXRpb25fZG9uZSIsZF9jKXJldHVybiBjX2MgZW5kLG9uU3RhcnQ9ZnVuY3Rpb24oY19jLGRfYykKYmNiOnJlZ2lzdGVyRXZlbnQoImFuaW1hdGlvbl9zdGFydCIsZF9jKXJldHVybiBjX2MgZW5kLHNldEF1dG9EZXN0cm95PWZ1bmN0aW9uKGNfYyxkX2MpCmFkYj1kX2N+PW5pbCBhbmQgZF9jIG9yIHRydWU7cmV0dXJuIGNfYyBlbmQsYW5pbWF0aW9uRG9uZUhhbmRsZXI9ZnVuY3Rpb24oY19jKQpiY2I6c2VuZEV2ZW50KCJhbmltYXRpb25fZG9uZSIsY19jKWNfYy5wYXJlbnQ6cmVtb3ZlRXZlbnQoIm90aGVyX2V2ZW50IixjX2MpaWYoYWRiKXRoZW4KY19jLnBhcmVudDpyZW1vdmVPYmplY3QoY19jKWNfYz1uaWwgZW5kIGVuZCxhbmltYXRpb25TdGFydEhhbmRsZXI9ZnVuY3Rpb24oY19jKQpiY2I6c2VuZEV2ZW50KCJhbmltYXRpb25fc3RhcnQiLGNfYyllbmQsY2xlYXI9ZnVuY3Rpb24oY19jKWJiYj17fWRjYj1uaWw7Y2NiPTA7X2NiPTE7Y2JiPTA7YWNiPWZhbHNlO3JldHVybiBjX2MgZW5kLHBsYXk9ZnVuY3Rpb24oY19jLGRfYykKY19jOmNhbmNlbCgpZGJiPXRydWU7YWNiPWRfYyBhbmQgdHJ1ZSBvciBmYWxzZTtfY2I9MTtjYmI9MAppZihiYmJbX2NiXX49bmlsKXRoZW4KaWYoCmJiYltfY2JdLnQ+MCl0aGVuIGFiYj1vcy5zdGFydFRpbWVyKGJiYltfY2JdLnQpZWxzZSBfX2MoY19jKWVuZCBlbHNlIGNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpZW5kO2NfYy5wYXJlbnQ6YWRkRXZlbnQoIm90aGVyX2V2ZW50IixjX2MpcmV0dXJuIGNfYyBlbmQsY2FuY2VsPWZ1bmN0aW9uKGNfYylpZigKYWJifj1uaWwpdGhlbiBvcy5jYW5jZWxUaW1lcihhYmIpYWNiPWZhbHNlIGVuZApkYmI9ZmFsc2U7Y19jLnBhcmVudDpyZW1vdmVFdmVudCgib3RoZXJfZXZlbnQiLGNfYylyZXR1cm4gY19jIGVuZCxpbnRlcm5hbE9iamV0Q2FsbD1mdW5jdGlvbihjX2MpCmNfYzpwbGF5KF9kYillbmQsZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKGNfYyxkX2MsX2FjKWlmKGRiYil0aGVuCmlmKGRfYz09InRpbWVyIilhbmQoX2FjPT1hYmIpdGhlbiBpZihiYmJbX2NiXX49bmlsKXRoZW4KX19jKGNfYyllbHNlIGNfYzphbmltYXRpb25Eb25lSGFuZGxlcigpZW5kIGVuZCBlbmQgZW5kfWRhYi5fX2luZGV4PWRhYjtyZXR1cm4gZGFiIGVuZCBlbmQKYWFbIm9iamVjdHMiXVsiUmFkaW8iXT1mdW5jdGlvbiguLi4pbG9jYWwgYWI9ZGEoIk9iamVjdCIpbG9jYWwgYmI9ZGEoInV0aWxzIikKbG9jYWwgY2I9YmIuZ2V0VmFsdWVGcm9tWE1MCnJldHVybgpmdW5jdGlvbihkYilsb2NhbCBfYz1hYihkYilsb2NhbCBhYz0iUmFkaW8iX2Mud2lkdGg9ODtfYzpzZXRaSW5kZXgoNSlsb2NhbCBiYz17fWxvY2FsIGNjO2xvY2FsIGRjCmxvY2FsIF9kO2xvY2FsIGFkO2xvY2FsIGJkO2xvY2FsIGNkO2xvY2FsIGRkPXRydWU7bG9jYWwgX19hPSJcNyJsb2NhbCBhX2E9ImxlZnQiCmxvY2FsIGJfYT17Z2V0VHlwZT1mdW5jdGlvbihjX2EpcmV0dXJuIGFjIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oY19hLGRfYSkKX2Muc2V0VmFsdWVzQnlYTUxEYXRhKGNfYSxkX2EpaWYoY2IoInNlbGVjdGlvbkJHIixkX2Epfj1uaWwpdGhlbgpjYz1jb2xvcnNbY2IoInNlbGVjdGlvbkJHIixkX2EpXWVuZDtpZihjYigic2VsZWN0aW9uRkciLGRfYSl+PW5pbCl0aGVuCmRjPWNvbG9yc1tjYigic2VsZWN0aW9uRkciLGRfYSldZW5kO2lmKGNiKCJib3hCRyIsZF9hKX49bmlsKXRoZW4KX2Q9Y29sb3JzW2NiKCJib3hCRyIsZF9hKV1lbmQ7aWYoY2IoImluYWN0aXZlQm94QkciLGRfYSl+PW5pbCl0aGVuCmJkPWNvbG9yc1tjYigiaW5hY3RpdmVCb3hCRyIsZF9hKV1lbmQ7aWYoY2IoImluYWN0aXZlQm94RkciLGRfYSl+PW5pbCl0aGVuCmNkPWNvbG9yc1tjYigiaW5hY3RpdmVCb3hGRyIsZF9hKV1lbmQ7aWYoY2IoImJveEZHIixkX2Epfj1uaWwpdGhlbgphZD1jb2xvcnNbY2IoImJveEZHIixkX2EpXWVuZDtpZihjYigic3ltYm9sIixkX2Epfj1uaWwpdGhlbgpfX2E9Y2IoInN5bWJvbCIsZF9hKWVuZAppZihkX2FbIml0ZW0iXX49bmlsKXRoZW4gbG9jYWwgX2FhPWRfYVsiaXRlbSJdaWYoCl9hYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBfYWE9e19hYX1lbmQ7Zm9yIGFhYSxiYWEgaW4gcGFpcnMoX2FhKWRvCmNfYTphZGRJdGVtKGNiKCJ0ZXh0IixiYWEpLGNiKCJ4IixiYWEpLGNiKCJ5IixiYWEpLGNvbG9yc1tjYigiYmciLGJhYSldLGNvbG9yc1tjYigiZmciLGJhYSldKWVuZCBlbmQ7cmV0dXJuIGNfYSBlbmQsYWRkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSwuLi4pCnRhYmxlLmluc2VydChiYyx7eD0KX2FhIG9yIDEseT1hYWEgb3IgMSx0ZXh0PWRfYSxiZ0NvbD1iYWEgb3IgY19hLmJnQ29sb3IsZmdDb2w9Y2FhIG9yIGNfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWlmKCNiYz09MSl0aGVuIGNfYTpzZXRWYWx1ZShiY1sxXSllbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldEFsbD1mdW5jdGlvbihjX2EpcmV0dXJuCmJjIGVuZCxyZW1vdmVJdGVtPWZ1bmN0aW9uKGNfYSxkX2EpdGFibGUucmVtb3ZlKGJjLGRfYSljX2E6dXBkYXRlRHJhdygpCnJldHVybiBjX2EgZW5kLGdldEl0ZW09ZnVuY3Rpb24oY19hLGRfYSlyZXR1cm4gYmNbZF9hXWVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oY19hKQpsb2NhbCBkX2E9Y19hOmdldFZhbHVlKClmb3IgX2FhLGFhYSBpbiBwYWlycyhiYylkbyBpZihhYWE9PWRfYSl0aGVuIHJldHVybiBfYWEgZW5kIGVuZCBlbmQsY2xlYXI9ZnVuY3Rpb24oY19hKQpiYz17fWNfYTpzZXRWYWx1ZSh7fSxmYWxzZSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsZ2V0SXRlbUNvdW50PWZ1bmN0aW9uKGNfYSlyZXR1cm4KI2JjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSxkYWEsLi4uKXRhYmxlLnJlbW92ZShiYyxkX2EpCnRhYmxlLmluc2VydChiYyxkX2Ese3g9YWFhIG9yIDEseT1iYWEgb3IgMSx0ZXh0PV9hYSxiZ0NvbD0KY2FhIG9yIGNfYS5iZ0NvbG9yLGZnQ29sPWRhYSBvciBjX2EuZmdDb2xvcixhcmdzPXsuLi59fSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihjX2EsZF9hKWNfYTpzZXRWYWx1ZSgKYmNbZF9hXW9ye30sZmFsc2UpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldEFjdGl2ZVN5bWJvbD1mdW5jdGlvbihjX2EsZF9hKQpfX2E9ZF9hOnN1YigxLDEpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLGNhYSkKY2M9ZF9hIG9yIGNjO2RjPV9hYSBvciBkYztfZD1hYWEgb3IgX2Q7YWQ9YmFhIG9yIGFkCmRkPWNhYX49bmlsIGFuZCBjYWEgb3IgdHJ1ZTtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsbW91c2VIYW5kbGVyPWZ1bmN0aW9uKGNfYSxkX2EsX2FhLGFhYSkKaWYoCiNiYz4wKXRoZW4KbG9jYWwgYmFhLGNhYT1jX2E6Z2V0QWJzb2x1dGVQb3NpdGlvbihjX2E6Z2V0QW5jaG9yUG9zaXRpb24oKSkKZm9yIGRhYSxfYmEgaW4gcGFpcnMoYmMpZG8KaWYoYmFhK19iYS54LTEgPD1fYWEpYW5kKApiYWErX2JhLngtMSArX2JhLnRleHQ6bGVuKCkrMSA+PV9hYSlhbmQoCmNhYStfYmEueS0xID09YWFhKXRoZW4KY19hOnNldFZhbHVlKF9iYSkKbG9jYWwgYWJhPWNfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudCgibW91c2VfY2xpY2siLGNfYSwibW91c2VfY2xpY2siLGRfYSxfYWEsYWFhKWlmKGFiYT09ZmFsc2UpdGhlbiByZXR1cm4gYWJhIGVuZDtpZihjX2EucGFyZW50fj1uaWwpdGhlbgpjX2EucGFyZW50OnNldEZvY3VzZWRPYmplY3QoY19hKWVuZDtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGNfYSkKaWYoCmNfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGRfYSxfYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKZm9yIGFhYSxiYWEgaW4gcGFpcnMoYmMpZG8KaWYoYmFhPT0KY19hOmdldFZhbHVlKCkpdGhlbiBpZihhX2E9PSJsZWZ0Iil0aGVuCmNfYS5wYXJlbnQ6d3JpdGVUZXh0KGJhYS54K2RfYS0xLGJhYS55K19hYS0xLF9fYSxfZCxhZCkKY19hLnBhcmVudDp3cml0ZVRleHQoYmFhLngrMiArZF9hLTEsYmFhLnkrX2FhLTEsYmFhLnRleHQsY2MsZGMpZW5kIGVsc2UKY19hLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveCgKYmFhLngrZF9hLTEsYmFhLnkrX2FhLTEsMSwxLGJkIG9yIGNfYS5iZ0NvbG9yKQpjX2EucGFyZW50OndyaXRlVGV4dChiYWEueCsyICtkX2EtMSxiYWEueStfYWEtMSxiYWEudGV4dCxiYWEuYmdDb2wsYmFhLmZnQ29sKWVuZCBlbmQ7cmV0dXJuIHRydWUgZW5kIGVuZCxpbml0PWZ1bmN0aW9uKGNfYSkKY19hLnBhcmVudDphZGRFdmVudCgibW91c2VfY2xpY2siLGNfYSkKaWYoX2MuaW5pdChjX2EpKXRoZW4KY19hLmJnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhckJHIiljX2EuZmdDb2xvcj1jX2EucGFyZW50OmdldFRoZW1lKCJNZW51YmFyRkciKQpjYz1jX2EucGFyZW50OmdldFRoZW1lKCJTZWxlY3Rpb25CRyIpZGM9Y19hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uVGV4dCIpCl9kPWNfYS5wYXJlbnQ6Z2V0VGhlbWUoIk1lbnViYXJCRyIpYWQ9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhclRleHQiKWVuZCBlbmR9cmV0dXJuIHNldG1ldGF0YWJsZShiX2EsX2MpZW5kIGVuZAphYVsib2JqZWN0cyJdWyJNZW51YmFyIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWJiLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgidEhleCIpCnJldHVybgpmdW5jdGlvbihfYylsb2NhbCBhYz1hYihfYylsb2NhbCBiYz0iTWVudWJhciJsb2NhbCBjYz17fWFjLndpZHRoPTMwO2FjLmhlaWdodD0xCmFjOnNldFpJbmRleCg1KWxvY2FsIGRjPXt9bG9jYWwgX2Q7bG9jYWwgYWQ7bG9jYWwgYmQ9dHJ1ZTtsb2NhbCBjZD0ibGVmdCJsb2NhbCBkZD0wO2xvY2FsIF9fYT0xO2xvY2FsIGFfYT1mYWxzZQpsb2NhbCBmdW5jdGlvbiBiX2EoKWxvY2FsIGNfYT0wO2xvY2FsIGRfYT0wCmxvY2FsIF9hYT1jYzpnZXRXaWR0aCgpCmZvciBuPTEsI2RjIGRvIGlmKGRfYStkY1tuXS50ZXh0OmxlbigpK19fYSoyID5fYWEpdGhlbgppZigKZF9hPF9hYSl0aGVuCmNfYT1jX2ErIChkY1tuXS50ZXh0OmxlbigpK19fYSoyIC0gKF9hYS1kX2EpKWVsc2UgY19hPWNfYStkY1tuXS50ZXh0OmxlbigpK19fYSoyIGVuZCBlbmQ7ZF9hPQpkX2ErZGNbbl0udGV4dDpsZW4oKStfX2EqMiBlbmQ7cmV0dXJuIGNfYSBlbmQKY2M9e2dldFR5cGU9ZnVuY3Rpb24oY19hKXJldHVybiBiYyBlbmQsYWRkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsLi4uKQp0YWJsZS5pbnNlcnQoZGMse3RleHQ9dG9zdHJpbmcoZF9hKSxiZ0NvbD1fYWEgb3IgY19hLmJnQ29sb3IsZmdDb2w9YWFhIG9yIGNfYS5mZ0NvbG9yLGFyZ3M9ey4uLn19KWlmKCNkYz09MSl0aGVuIGNfYTpzZXRWYWx1ZShkY1sxXSllbmQKY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLGdldEFsbD1mdW5jdGlvbihjX2EpcmV0dXJuCmRjIGVuZCxnZXRJdGVtSW5kZXg9ZnVuY3Rpb24oY19hKWxvY2FsIGRfYT1jX2E6Z2V0VmFsdWUoKWZvciBfYWEsYWFhIGluIHBhaXJzKGRjKWRvCmlmKGFhYT09ZF9hKXRoZW4gcmV0dXJuIF9hYSBlbmQgZW5kIGVuZCxjbGVhcj1mdW5jdGlvbihjX2EpCmRjPXt9Y19hOnNldFZhbHVlKHt9LGZhbHNlKWNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxzZXRTcGFjZT1mdW5jdGlvbihjX2EsZF9hKV9fYT0KZF9hIG9yIF9fYTtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2V0T2Zmc2V0PWZ1bmN0aW9uKGNfYSxkX2EpZGQ9CmRfYSBvciAwO2lmKGRkPDApdGhlbiBkZD0wIGVuZDtsb2NhbCBfYWE9Yl9hKClpZihkZD5fYWEpdGhlbiBkZD1fYWEgZW5kCmNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRPZmZzZXQ9ZnVuY3Rpb24oY19hKXJldHVybiBkZCBlbmQsc2V0U2Nyb2xsYWJsZT1mdW5jdGlvbihjX2EsZF9hKQphX2E9ZF9hO2lmKGRfYT09bmlsKXRoZW4gYV9hPXRydWUgZW5kO3JldHVybiBjX2EgZW5kLHNldFZhbHVlc0J5WE1MRGF0YT1mdW5jdGlvbihjX2EsZF9hKQphYy5zZXRWYWx1ZXNCeVhNTERhdGEoY19hLGRfYSlpZihjYigic2VsZWN0aW9uQkciLGRfYSl+PW5pbCl0aGVuCl9kPWNvbG9yc1tjYigic2VsZWN0aW9uQkciLGRfYSldZW5kO2lmKGNiKCJzZWxlY3Rpb25GRyIsZF9hKX49bmlsKXRoZW4KYWQ9Y29sb3JzW2NiKCJzZWxlY3Rpb25GRyIsZF9hKV1lbmQ7aWYoY2IoInNjcm9sbGFibGUiLGRfYSl+PW5pbCl0aGVuCmlmCihjYigic2Nyb2xsYWJsZSIsZF9hKSl0aGVuIGNfYTpzZXRTY3JvbGxhYmxlKHRydWUpZWxzZSBjX2E6c2V0U2Nyb2xsYWJsZShmYWxzZSllbmQgZW5kCmlmKApjYigib2Zmc2V0IixkX2Epfj1uaWwpdGhlbiBjX2E6c2V0T2Zmc2V0KGNiKCJvZmZzZXQiLGRfYSkpZW5kCmlmKGNiKCJzcGFjZSIsZF9hKX49bmlsKXRoZW4gX19hPWNiKCJzcGFjZSIsZF9hKWVuZAppZihkX2FbIml0ZW0iXX49bmlsKXRoZW4gbG9jYWwgX2FhPWRfYVsiaXRlbSJdCmlmKF9hYS5wcm9wZXJ0aWVzfj1uaWwpdGhlbiBfYWE9e19hYX1lbmQ7Zm9yIGFhYSxiYWEgaW4gcGFpcnMoX2FhKWRvCmNfYTphZGRJdGVtKGNiKCJ0ZXh0IixiYWEpLGNvbG9yc1tjYigiYmciLGJhYSldLGNvbG9yc1tjYigiZmciLGJhYSldKWVuZCBlbmQ7cmV0dXJuIGNfYSBlbmQscmVtb3ZlSXRlbT1mdW5jdGlvbihjX2EsZF9hKQp0YWJsZS5yZW1vdmUoZGMsZF9hKWNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxnZXRJdGVtPWZ1bmN0aW9uKGNfYSxkX2EpCnJldHVybiBkY1tkX2FdZW5kLGdldEl0ZW1Db3VudD1mdW5jdGlvbihjX2EpcmV0dXJuI2RjIGVuZCxlZGl0SXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEsYmFhLC4uLil0YWJsZS5yZW1vdmUoZGMsZF9hKQp0YWJsZS5pbnNlcnQoZGMsZF9hLHt0ZXh0PV9hYSxiZ0NvbD0KYWFhIG9yIGNfYS5iZ0NvbG9yLGZnQ29sPWJhYSBvciBjX2EuZmdDb2xvcixhcmdzPXsuLi59fSljX2E6dXBkYXRlRHJhdygpcmV0dXJuIGNfYSBlbmQsc2VsZWN0SXRlbT1mdW5jdGlvbihjX2EsZF9hKWNfYTpzZXRWYWx1ZSgKZGNbZF9hXW9ye30sZmFsc2UpY19hOnVwZGF0ZURyYXcoKXJldHVybiBjX2EgZW5kLHNldFNlbGVjdGVkSXRlbT1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEpX2Q9CmRfYSBvciBjX2EuYmdDb2xvcjthZD1fYWEgb3IgY19hLmZnQ29sb3I7YmQ9YWFhCmNfYTp1cGRhdGVEcmF3KClyZXR1cm4gY19hIGVuZCxtb3VzZUhhbmRsZXI9ZnVuY3Rpb24oY19hLGRfYSxfYWEsYWFhKQppZgooYWMubW91c2VIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSkpdGhlbgpsb2NhbCBiYWEsY2FhPWNfYTpnZXRBYnNvbHV0ZVBvc2l0aW9uKGNfYTpnZXRBbmNob3JQb3NpdGlvbigpKWxvY2FsIGRhYSxfYmE9Y19hOmdldFNpemUoKWxvY2FsIGFiYT0wCmZvciBuPTEsI2RjIGRvCmlmKGRjW25dfj1uaWwpdGhlbgppZgooYmFhK2FiYTw9X2FhK2RkKWFuZChiYWErYWJhKwpkY1tuXS50ZXh0OmxlbigpKyAoX19hKjIpPl9hYStkZClhbmQoY2FhPT1hYWEpdGhlbgpjX2E6c2V0VmFsdWUoZGNbbl0pCmNfYTpnZXRFdmVudFN5c3RlbSgpOnNlbmRFdmVudChldmVudCxjX2EsZXZlbnQsMCxfYWEsYWFhLGRjW25dKWVuZDthYmE9YWJhK2RjW25dLnRleHQ6bGVuKCkrX19hKjIgZW5kIGVuZDtjX2E6dXBkYXRlRHJhdygpcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQsc2Nyb2xsSGFuZGxlcj1mdW5jdGlvbihjX2EsZF9hLF9hYSxhYWEpCmlmCihhYy5zY3JvbGxIYW5kbGVyKGNfYSxkX2EsX2FhLGFhYSkpdGhlbiBpZihhX2EpdGhlbiBkZD1kZCtkX2E7aWYoZGQ8MCl0aGVuIGRkPTAgZW5kO2xvY2FsIGJhYT1iX2EoKWlmKGRkPmJhYSl0aGVuIGRkPWJhYSBlbmQKY19hOnVwZGF0ZURyYXcoKWVuZDtyZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZCxkcmF3PWZ1bmN0aW9uKGNfYSkKaWYKKGFjLmRyYXcoY19hKSl0aGVuCmlmKGNfYS5wYXJlbnR+PW5pbCl0aGVuIGxvY2FsIGRfYSxfYWE9Y19hOmdldEFuY2hvclBvc2l0aW9uKCkKbG9jYWwgYWFhLGJhYT1jX2E6Z2V0U2l6ZSgpaWYoY19hLmJnQ29sb3J+PWZhbHNlKXRoZW4KY19hLnBhcmVudDpkcmF3QmFja2dyb3VuZEJveChkX2EsX2FhLGFhYSxiYWEsY19hLmJnQ29sb3IpZW5kO2xvY2FsIGNhYT0iImxvY2FsIGRhYT0iImxvY2FsIF9iYT0iIgpmb3IgYWJhLGJiYSBpbiBwYWlycyhkYylkbwpsb2NhbCBjYmE9CigiICIpOnJlcChfX2EpLi5iYmEudGV4dC4uICgiICIpOnJlcChfX2EpY2FhPWNhYS4uY2JhCmlmKGJiYT09Y19hOmdldFZhbHVlKCkpdGhlbiBkYWE9ZGFhLi4KZGJbX2Qgb3IgYmJhLmJnQ29sIG9yIGNfYS5iZ0NvbG9yXTpyZXAoY2JhOmxlbigpKV9iYT1fYmEuLgpkYlsKYWQgb3IgYmJhLkZnQ29sIG9yIGNfYS5mZ0NvbG9yXTpyZXAoY2JhOmxlbigpKWVsc2UgZGFhPWRhYS4uCmRiW2JiYS5iZ0NvbCBvciBjX2EuYmdDb2xvcl06cmVwKGNiYTpsZW4oKSlfYmE9X2JhLi4KZGJbYmJhLkZnQ29sIG9yIGNfYS5mZ0NvbG9yXTpyZXAoY2JhOmxlbigpKWVuZCBlbmQKY19hLnBhcmVudDpzZXRUZXh0KGRfYSxfYWEsY2FhOnN1YihkZCsxLGFhYStkZCkpCmNfYS5wYXJlbnQ6c2V0QkcoZF9hLF9hYSxkYWE6c3ViKGRkKzEsYWFhK2RkKSkKY19hLnBhcmVudDpzZXRGRyhkX2EsX2FhLF9iYTpzdWIoZGQrMSxhYWErZGQpKWVuZCBlbmQgZW5kLGluaXQ9ZnVuY3Rpb24oY19hKQpjX2EucGFyZW50OmFkZEV2ZW50KCJtb3VzZV9jbGljayIsY19hKWNfYS5wYXJlbnQ6YWRkRXZlbnQoIm1vdXNlX3Njcm9sbCIsY19hKQppZgooYWMuaW5pdChjX2EpKXRoZW4gY19hLmJnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhckJHIikKY19hLmZnQ29sb3I9Y19hLnBhcmVudDpnZXRUaGVtZSgiTWVudWJhclRleHQiKV9kPWNfYS5wYXJlbnQ6Z2V0VGhlbWUoIlNlbGVjdGlvbkJHIikKYWQ9Y19hLnBhcmVudDpnZXRUaGVtZSgiU2VsZWN0aW9uVGV4dCIpZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKGNjLGFjKWVuZCBlbmQKYWFbIm9iamVjdHMiXVsiQnV0dG9uIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJPYmplY3QiKWxvY2FsIGJiPWRhKCJ1dGlscyIpCmxvY2FsIGNiPWJiLmdldFZhbHVlRnJvbVhNTDtsb2NhbCBkYj1kYSgidEhleCIpCnJldHVybgpmdW5jdGlvbihfYylsb2NhbCBhYz1hYihfYylsb2NhbCBiYz0iQnV0dG9uImxvY2FsIGNjPSJjZW50ZXIibG9jYWwgZGM9ImNlbnRlciIKYWM6c2V0WkluZGV4KDUpYWM6c2V0VmFsdWUoIkJ1dHRvbiIpYWMud2lkdGg9MTI7YWMuaGVpZ2h0PTMKbG9jYWwgX2Q9e2luaXQ9ZnVuY3Rpb24oYWQpCmlmKGFjLmluaXQoYWQpKXRoZW4KYWQuYmdDb2xvcj1hZC5wYXJlbnQ6Z2V0VGhlbWUoIkJ1dHRvbkJHIilhZC5mZ0NvbG9yPWFkLnBhcmVudDpnZXRUaGVtZSgiQnV0dG9uVGV4dCIpZW5kIGVuZCxnZXRUeXBlPWZ1bmN0aW9uKGFkKXJldHVybiBiYyBlbmQsc2V0SG9yaXpvbnRhbEFsaWduPWZ1bmN0aW9uKGFkLGJkKQpjYz1iZDthZDp1cGRhdGVEcmF3KClyZXR1cm4gYWQgZW5kLHNldFZlcnRpY2FsQWxpZ249ZnVuY3Rpb24oYWQsYmQpZGM9YmQKYWQ6dXBkYXRlRHJhdygpcmV0dXJuIGFkIGVuZCxzZXRUZXh0PWZ1bmN0aW9uKGFkLGJkKWFjOnNldFZhbHVlKHRvc3RyaW5nKGJkKSkKYWQ6dXBkYXRlRHJhdygpcmV0dXJuIGFkIGVuZCxzZXRWYWx1ZXNCeVhNTERhdGE9ZnVuY3Rpb24oYWQsYmQpCmFjLnNldFZhbHVlc0J5WE1MRGF0YShhZCxiZCkKaWYoY2IoInRleHQiLGJkKX49bmlsKXRoZW4gYWQ6c2V0VGV4dChjYigidGV4dCIsYmQpKWVuZDtpZihjYigiaG9yaXpvbnRhbEFsaWduIixiZCl+PW5pbCl0aGVuCmNjPWNiKCJob3Jpem9udGFsQWxpZ24iLGJkKWVuZDtpZihjYigidmVydGljYWxBbGlnbiIsYmQpfj1uaWwpdGhlbgpkYz1jYigidmVydGljYWxBbGlnbiIsYmQpZW5kO3JldHVybiBhZCBlbmQsZHJhdz1mdW5jdGlvbihhZCkKaWYKKGFjLmRyYXcoYWQpKXRoZW4KaWYoYWQucGFyZW50fj1uaWwpdGhlbiBsb2NhbCBiZCxjZD1hZDpnZXRBbmNob3JQb3NpdGlvbigpCmxvY2FsIGRkLF9fYT1hZDpnZXRTaXplKClsb2NhbCBhX2E9YmIuZ2V0VGV4dFZlcnRpY2FsQWxpZ24oX19hLGRjKQpmb3Igbj0xLF9fYSBkbwppZihuPT1hX2EpdGhlbgpsb2NhbCBiX2E9YWQ6Z2V0VmFsdWUoKQphZC5wYXJlbnQ6c2V0VGV4dChiZCsgKGRkLzIgLWJfYTpsZW4oKS8yKSxjZCsgKG4tMSksYmIuZ2V0VGV4dEhvcml6b250YWxBbGlnbihiX2EsYl9hOmxlbigpLGNjKSkKYWQucGFyZW50OnNldEZHKGJkKyAoZGQvMiAtYl9hOmxlbigpLzIpLGNkKyAobi0xKSxiYi5nZXRUZXh0SG9yaXpvbnRhbEFsaWduKGRiW2FkLmZnQ29sb3JdOnJlcChiX2E6bGVuKCkpLGJfYTpsZW4oKSxjYykpZW5kIGVuZCBlbmQgZW5kIGVuZH1yZXR1cm4gc2V0bWV0YXRhYmxlKF9kLGFjKWVuZCBlbmQ7YWFbImxpYnJhcmllcyJdPXt9CmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0RHJhdyJdPWZ1bmN0aW9uKC4uLikKbG9jYWwgYWI9ZGEoInRIZXgiKWxvY2FsIGJiLGNiPXN0cmluZy5zdWIsc3RyaW5nLnJlcApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9ZGIgb3IgdGVybS5jdXJyZW50KCkKbG9jYWwgYWM7bG9jYWwgYmMsY2M9X2MuZ2V0U2l6ZSgpbG9jYWwgZGM9e31sb2NhbCBfZD17fWxvY2FsIGFkPXt9bG9jYWwgYmQ9e31sb2NhbCBjZD17fWxvY2FsIGRkPXt9bG9jYWwgX19hO2xvY2FsIGFfYT17fWxvY2FsIGZ1bmN0aW9uIGJfYSgpCl9fYT1jYigiICIsYmMpCmZvciBuPTAsMTUgZG8gbG9jYWwgZGFhPTIgXm47bG9jYWwgX2JhPWFiW2RhYV1hX2FbZGFhXT1jYihfYmEsYmMpZW5kIGVuZDtiX2EoKQpsb2NhbCBmdW5jdGlvbiBjX2EoKWJfYSgpbG9jYWwgZGFhPV9fYQpsb2NhbCBfYmE9YV9hW2NvbG9ycy53aGl0ZV1sb2NhbCBhYmE9YV9hW2NvbG9ycy5ibGFja10KZm9yIGN1cnJlbnRZPTEsY2MgZG8KZGNbY3VycmVudFldPWJiKApkY1tjdXJyZW50WV09PW5pbCBhbmQgZGFhIG9yCmRjW2N1cnJlbnRZXS4uZGFhOnN1YigxLGJjLWRjW2N1cnJlbnRZXTpsZW4oKSksMSxiYykKYWRbY3VycmVudFldPWJiKGFkW2N1cnJlbnRZXT09bmlsIGFuZCBfYmEgb3IgYWRbY3VycmVudFldLi5fYmE6c3ViKDEsYmMtCmFkW2N1cnJlbnRZXTpsZW4oKSksMSxiYykKX2RbY3VycmVudFldPWJiKF9kW2N1cnJlbnRZXT09bmlsIGFuZCBhYmEgb3IgX2RbY3VycmVudFldLi5hYmE6c3ViKDEsYmMtCl9kW2N1cnJlbnRZXTpsZW4oKSksMSxiYyllbmQgZW5kO2NfYSgpCmxvY2FsIGZ1bmN0aW9uIGRfYShkYWEsX2JhLGFiYSkKaWYoX2JhPj0xKWFuZChfYmE8PWNjKXRoZW4KaWYKKGRhYSthYmE6bGVuKCk+MClhbmQoZGFhPD1iYyl0aGVuIGxvY2FsIGJiYT1kY1tfYmFdbG9jYWwgY2JhO2xvY2FsIGRiYT1kYWErI2FiYS0xCmlmKGRhYTwxKXRoZW4gbG9jYWwgX2NhPTEgLWRhYSsxCmxvY2FsIGFjYT1iYy1kYWErMTthYmE9YmIoYWJhLF9jYSxhY2EpZWxzZWlmKGRiYT5iYyl0aGVuIGxvY2FsIF9jYT1iYy1kYWErMTthYmE9YmIoYWJhLDEsX2NhKWVuZAppZihkYWE+MSl0aGVuIGxvY2FsIF9jYT1kYWEtMTtjYmE9YmIoYmJhLDEsX2NhKS4uYWJhIGVsc2UgY2JhPWFiYSBlbmQ7aWYgZGJhPGJjIHRoZW4gY2JhPWNiYS4uYmIoYmJhLGRiYSsxLGJjKWVuZApkY1tfYmFdPWNiYSBlbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfYWEoZGFhLF9iYSxhYmEpCmlmKF9iYT49MSlhbmQoX2JhPD1jYyl0aGVuCmlmKGRhYSthYmE6bGVuKCk+MClhbmQoZGFhPD1iYyl0aGVuCmxvY2FsIGJiYT1fZFtfYmFdbG9jYWwgY2JhO2xvY2FsIGRiYT1kYWErI2FiYS0xCmlmKGRhYTwxKXRoZW4KYWJhPWJiKGFiYSwxIC1kYWErMSxiYy1kYWErMSllbHNlaWYoZGJhPmJjKXRoZW4gYWJhPWJiKGFiYSwxLGJjLWRhYSsxKWVuZAppZihkYWE+MSl0aGVuIGNiYT1iYihiYmEsMSxkYWEtMSkuLmFiYSBlbHNlIGNiYT1hYmEgZW5kO2lmIGRiYTxiYyB0aGVuIGNiYT1jYmEuLmJiKGJiYSxkYmErMSxiYyllbmQKX2RbX2JhXT1jYmEgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYWFhKGRhYSxfYmEsYWJhKQppZihfYmE+PTEpYW5kKF9iYTw9Y2MpdGhlbgppZihkYWErYWJhOmxlbigpPjApYW5kKGRhYTw9YmMpdGhlbgpsb2NhbCBiYmE9YWRbX2JhXWxvY2FsIGNiYTtsb2NhbCBkYmE9ZGFhKyNhYmEtMQppZihkYWE8MSl0aGVuIGxvY2FsIF9jYT0xIC1kYWErMTtsb2NhbCBhY2E9YmMtZGFhKzEKYWJhPWJiKGFiYSxfY2EsYWNhKWVsc2VpZihkYmE+YmMpdGhlbiBsb2NhbCBfY2E9YmMtZGFhKzE7YWJhPWJiKGFiYSwxLF9jYSllbmQKaWYoZGFhPjEpdGhlbiBsb2NhbCBfY2E9ZGFhLTE7Y2JhPWJiKGJiYSwxLF9jYSkuLmFiYSBlbHNlIGNiYT1hYmEgZW5kO2lmIGRiYTxiYyB0aGVuIGNiYT1jYmEuLmJiKGJiYSxkYmErMSxiYyllbmQKYWRbX2JhXT1jYmEgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gYmFhKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmlmKCNhYmE9PSNiYmEpb3IoI2FiYT09I2NiYSl0aGVuCmlmKF9iYT49MSlhbmQoX2JhPD1jYyl0aGVuCmlmKApkYWErYWJhOmxlbigpPjApYW5kKGRhYTw9YmMpdGhlbiBsb2NhbCBkYmE9ZGNbX2JhXWxvY2FsIF9jYT1hZFtfYmFdbG9jYWwgYWNhPV9kW19iYV0KbG9jYWwgYmNhLGNjYSxkY2E7bG9jYWwgX2RhPWRhYSsjYWJhLTEKaWYoZGFhPDEpdGhlbiBsb2NhbCBhZGE9MSAtZGFhKzE7bG9jYWwgYmRhPWJjLWRhYSsxCmFiYT1iYihhYmEsYWRhLGJkYSliYmE9YmIoYmJhLGFkYSxiZGEpY2JhPWJiKGNiYSxhZGEsYmRhKWVsc2VpZihfZGE+YmMpdGhlbiBsb2NhbCBhZGE9YmMtZGFhKzEKYWJhPWJiKGFiYSwxLGFkYSliYmE9YmIoYmJhLDEsYWRhKWNiYT1iYihjYmEsMSxhZGEpZW5kCmlmKGRhYT4xKXRoZW4gbG9jYWwgYWRhPWRhYS0xO2JjYT1iYihkYmEsMSxhZGEpLi5hYmEKY2NhPWJiKF9jYSwxLGFkYSkuLmJiYTtkY2E9YmIoYWNhLDEsYWRhKS4uY2JhIGVsc2UgYmNhPWFiYTtjY2E9YmJhO2RjYT1jYmEgZW5kCmlmIF9kYTxiYyB0aGVuIGJjYT1iY2EuLmJiKGRiYSxfZGErMSxiYykKY2NhPWNjYS4uYmIoX2NhLF9kYSsxLGJjKWRjYT1kY2EuLmJiKGFjYSxfZGErMSxiYyllbmQ7ZGNbX2JhXT1iY2E7YWRbX2JhXT1jY2E7X2RbX2JhXT1kY2EgZW5kIGVuZCBlbmQgZW5kCmxvY2FsIGNhYT17c2V0U2l6ZT1mdW5jdGlvbihkYWEsX2JhKWJjLGNjPWRhYSxfYmE7Y19hKCllbmQsc2V0TWlycm9yPWZ1bmN0aW9uKGRhYSlhYz1kYWEgZW5kLHNldEJHPWZ1bmN0aW9uKGRhYSxfYmEsYWJhKQpfYWEoZGFhLF9iYSxhYmEpZW5kLHNldFRleHQ9ZnVuY3Rpb24oZGFhLF9iYSxhYmEpZF9hKGRhYSxfYmEsYWJhKWVuZCxzZXRGRz1mdW5jdGlvbihkYWEsX2JhLGFiYSkKYWFhKGRhYSxfYmEsYWJhKWVuZCxibGl0PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpYmFhKGRhYSxfYmEsYWJhLGJiYSxjYmEpZW5kLGRyYXdCYWNrZ3JvdW5kQm94PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmZvciBuPTEsYmJhCmRvIF9hYShkYWEsX2JhKyAobi0xKSxjYihhYltjYmFdLGFiYSkpZW5kIGVuZCxkcmF3Rm9yZWdyb3VuZEJveD1mdW5jdGlvbihkYWEsX2JhLGFiYSxiYmEsY2JhKWZvciBuPTEsYmJhIGRvCmFhYShkYWEsX2JhKyAobi0xKSxjYihhYltjYmFdLGFiYSkpZW5kIGVuZCxkcmF3VGV4dEJveD1mdW5jdGlvbihkYWEsX2JhLGFiYSxiYmEsY2JhKQpmb3Igbj0xLGJiYSBkbyBkX2EoZGFhLApfYmErIChuLTEpLGNiKGNiYSxhYmEpKWVuZCBlbmQsd3JpdGVUZXh0PWZ1bmN0aW9uKGRhYSxfYmEsYWJhLGJiYSxjYmEpCmlmKGFiYX49bmlsKXRoZW4gZF9hKGRhYSxfYmEsYWJhKWlmCihiYmF+PW5pbClhbmQoYmJhfj1mYWxzZSl0aGVuCl9hYShkYWEsX2JhLGNiKGFiW2JiYV0sYWJhOmxlbigpKSllbmQ7aWYoY2Jhfj1uaWwpYW5kKGNiYX49ZmFsc2UpdGhlbgphYWEoZGFhLF9iYSxjYihhYltjYmFdLGFiYTpsZW4oKSkpZW5kIGVuZCBlbmQsdXBkYXRlPWZ1bmN0aW9uKCkKbG9jYWwgZGFhLF9iYT1fYy5nZXRDdXJzb3JQb3MoKWxvY2FsIGFiYT1mYWxzZQppZihfYy5nZXRDdXJzb3JCbGlua349bmlsKXRoZW4gYWJhPV9jLmdldEN1cnNvckJsaW5rKCllbmQ7X2Muc2V0Q3Vyc29yQmxpbmsoZmFsc2UpaWYoYWN+PW5pbCl0aGVuCmFjLnNldEN1cnNvckJsaW5rKGZhbHNlKWVuZApmb3Igbj0xLGNjIGRvIF9jLnNldEN1cnNvclBvcygxLG4pCl9jLmJsaXQoZGNbbl0sYWRbbl0sX2Rbbl0paWYoYWN+PW5pbCl0aGVuIGFjLnNldEN1cnNvclBvcygxLG4pCmFjLmJsaXQoZGNbbl0sYWRbbl0sX2Rbbl0pZW5kIGVuZDtfYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JzLmJsYWNrKQpfYy5zZXRDdXJzb3JCbGluayhhYmEpX2Muc2V0Q3Vyc29yUG9zKGRhYSxfYmEpCmlmKGFjfj1uaWwpdGhlbgphYy5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3JzLmJsYWNrKWFjLnNldEN1cnNvckJsaW5rKGFiYSlhYy5zZXRDdXJzb3JQb3MoZGFhLF9iYSllbmQgZW5kLHNldFRlcm09ZnVuY3Rpb24oZGFhKQpfYz1kYWEgZW5kfXJldHVybiBjYWEgZW5kIGVuZAphYVsibGlicmFyaWVzIl1bInV0aWxzIl09ZnVuY3Rpb24oLi4uKQpsb2NhbCBhYixiYixjYj1zdHJpbmcuc3ViLHN0cmluZy5maW5kLHN0cmluZy5yZXZlcnNlCmxvY2FsIGZ1bmN0aW9uIGRiKGFkLGJkKWxvY2FsIGNkPXt9aWYgYWQ9PSIib3IgYmQ9PSIidGhlbiByZXR1cm4gY2QgZW5kO2xvY2FsIGRkPTEKbG9jYWwgX19hLGFfYT1iYihhZCxiZCxkZCl3aGlsZSBfX2EgZG8gdGFibGUuaW5zZXJ0KGNkLGFiKGFkLGRkLF9fYS0xKSlkZD1hX2ErMQpfX2EsYV9hPWJiKGFkLGJkLGRkKWVuZAp0YWJsZS5pbnNlcnQoY2QsYWIoYWQsZGQpKXJldHVybiBjZCBlbmQKbG9jYWwgX2M9e1swXT17OCw0LDMsNiw1fSx7NCwxNCw4LDd9LHs2LDEwLDgsN30sezksMTEsOCwwfSx7MSwxNCw4LDB9LHsxMywxMiw4LDB9LHsyLDEwLDgsMH0sezE1LDgsMTAsMTEsMTIsMTR9LHswLDcsMSw5LDIsMTN9LHszLDExLDgsN30sezIsNiw3LDE1fSx7OSwzLDcsMTV9LHsxMyw1LDcsMTV9LHs1LDEyLDgsN30sezEsNCw3LDE1fSx7NywxMCwxMSwxMiwxNH19bG9jYWwgYWMsYmMsY2M9e30se30se31mb3IgaT0wLDE1IGRvIGJjWzIgXmldPWkgZW5kCmRvIGxvY2FsIGFkPSIwMTIzNDU2Nzg5YWJjZGVmIgpmb3IgaT0xLDE2IGRvIGFjW2FkOnN1YihpLGkpXT0KaS0xO2FjW2ktMV09YWQ6c3ViKGksaSkKY2NbYWQ6c3ViKGksaSldPTIgXiAoaS0xKWNjWzIgXiAoaS0xKV09YWQ6c3ViKGksaSlsb2NhbCBiZD1fY1tpLTFdZm9yIGk9MSwjYmQgZG8KYmRbaV09MiBeYmRbaV1lbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBkYyhhZClsb2NhbCBiZD1fY1tiY1thZFsjYWRdWzFdXV0KZm9yIGo9MSwjYmQgZG8gbG9jYWwgY2Q9YmRbal1mb3IgaT0xLCNhZC0xIGRvIGlmCmFkW2ldWzFdPT1jZCB0aGVuIHJldHVybiBpIGVuZCBlbmQgZW5kO3JldHVybiAxIGVuZApsb2NhbCBmdW5jdGlvbiBfZChhZCxiZCkKaWYgbm90IGJkIHRoZW4gbG9jYWwgZGQ9e31iZD17fWZvciBpPTEsNiBkbyBsb2NhbCBfX2E9YWRbaV1sb2NhbCBhX2E9YmRbX19hXQpiZFtfX2FdLGRkW2ldPWFfYSBhbmQoYV9hKzEpb3IgMSxfX2EgZW5kO2FkPWRkIGVuZDtsb2NhbCBjZD17fWZvciBkZCxfX2EgaW4gcGFpcnMoYmQpZG8gY2RbI2NkKzFdPXtkZCxfX2F9ZW5kCmlmI2NkPjEgdGhlbgp3aGlsZQojY2Q+MiBkbwp0YWJsZS5zb3J0KGNkLGZ1bmN0aW9uKGRfYSxfYWEpcmV0dXJuIGRfYVsyXT5fYWFbMl1lbmQpbG9jYWwgX19hLGFfYT1kYyhjZCksI2NkO2xvY2FsIGJfYSxjX2E9Y2RbYV9hXVsxXSxjZFtfX2FdWzFdCmZvciBpPTEsNiBkbyBpZiBhZFtpXT09Yl9hIHRoZW4KYWRbaV09Y19hO2NkW19fYV1bMl09Y2RbX19hXVsyXSsxIGVuZCBlbmQ7Y2RbYV9hXT1uaWwgZW5kO2xvY2FsIGRkPTEyOApmb3IgaT0xLCNhZC0xIGRvIGlmIGFkW2ldfj1hZFs2XXRoZW4gZGQ9ZGQrMiBeIChpLTEpZW5kIGVuZDtyZXR1cm4gc3RyaW5nLmNoYXIoZGQpLApjY1tjZFsxXVsxXT09YWRbNl1hbmQgY2RbMl1bMV1vciBjZFsxXVsxXV0sY2NbYWRbNl1dZWxzZQpyZXR1cm4iXDEyOCIsY2NbYWRbMV1dLGNjW2FkWzFdXWVuZCBlbmQKcmV0dXJuCntnZXRUZXh0SG9yaXpvbnRhbEFsaWduPWZ1bmN0aW9uKGFkLGJkLGNkLGRkKWFkPWFiKGFkLDEsYmQpbG9jYWwgX19hPWJkLXN0cmluZy5sZW4oYWQpCmlmKGNkPT0icmlnaHQiKXRoZW4gYWQ9c3RyaW5nLnJlcCgKZGQgb3IiICIsX19hKS4uYWQgZWxzZWlmKGNkPT0iY2VudGVyIil0aGVuCmFkPXN0cmluZy5yZXAoZGQgb3IiICIsbWF0aC5mbG9vcigKX19hLzIpKS4uYWQuLgpzdHJpbmcucmVwKGRkIG9yIiAiLG1hdGguZmxvb3IoX19hLzIpKQphZD1hZC4uIChzdHJpbmcubGVuKGFkKTxiZCBhbmQoZGQgb3IiICIpb3IiIillbHNlIGFkPWFkLi5zdHJpbmcucmVwKGRkIG9yIiAiLF9fYSllbmQ7cmV0dXJuIGFkIGVuZCxnZXRUZXh0VmVydGljYWxBbGlnbj1mdW5jdGlvbihhZCxiZCkKbG9jYWwgY2Q9MAppZihiZD09ImNlbnRlciIpdGhlbiBjZD1tYXRoLmNlaWwoYWQvMilpZihjZDwxKXRoZW4gY2Q9MSBlbmQgZW5kO2lmKGJkPT0iYm90dG9tIil0aGVuIGNkPWFkIGVuZDtpZihjZDwxKXRoZW4gY2Q9MSBlbmQ7cmV0dXJuIGNkIGVuZCxycGFpcnM9ZnVuY3Rpb24oYWQpcmV0dXJuIGZ1bmN0aW9uKGJkLGNkKWNkPQpjZC0xO2lmIGNkfj0wIHRoZW4gcmV0dXJuIGNkLGJkW2NkXWVuZCBlbmQsYWQsCiNhZCsxIGVuZCx0YWJsZUNvdW50PWZ1bmN0aW9uKGFkKQpsb2NhbCBiZD0wO2lmKGFkfj1uaWwpdGhlbiBmb3IgY2QsZGQgaW4gcGFpcnMoYWQpZG8gYmQ9YmQrMSBlbmQgZW5kO3JldHVybiBiZCBlbmQsc3BsaXRTdHJpbmc9ZGIsY3JlYXRlVGV4dD1mdW5jdGlvbihhZCxiZCkKbG9jYWwgY2Q9ZGIoYWQsIlxuIilsb2NhbCBkZD17fQpmb3IgX19hLGFfYSBpbiBwYWlycyhjZClkbyBpZigjYV9hPT0wKXRoZW4gdGFibGUuaW5zZXJ0KGRkLCIiKWVuZAp3aGlsZSNhX2E+CmJkIGRvIGxvY2FsIGJfYT1iYihjYihhYihhX2EsMSxiZCkpLCIgIilpZiBub3QgYl9hIHRoZW4gYl9hPWJkIGVsc2UKYl9hPWJkLWJfYSsxIGVuZDtsb2NhbCBjX2E9YWIoYV9hLDEsYl9hKQp0YWJsZS5pbnNlcnQoZGQsY19hKWFfYT1hYihhX2EsYl9hKzEpZW5kO2lmI2FfYT4wIHRoZW4gdGFibGUuaW5zZXJ0KGRkLGFfYSllbmQgZW5kO3JldHVybiBkZCBlbmQsZ2V0VmFsdWVGcm9tWE1MPWZ1bmN0aW9uKGFkLGJkKQpsb2NhbCBjZDtpZih0eXBlKGJkKX49InRhYmxlIil0aGVuIHJldHVybiBlbmQ7aWYoYmRbYWRdfj1uaWwpdGhlbgppZgoodHlwZShiZFthZF0pPT0idGFibGUiKXRoZW4gaWYoYmRbYWRdLnZhbHVlfj1uaWwpdGhlbiBjZD1iZFthZF06dmFsdWUoKWVuZCBlbmQgZW5kO2lmKGNkPT1uaWwpdGhlbgpjZD1iZFsiQCIuLmFkXWVuZDtpZihjZD09InRydWUiKXRoZW4gY2Q9dHJ1ZSBlbHNlaWYoY2Q9PSJmYWxzZSIpdGhlbiBjZD1mYWxzZSBlbHNlaWYodG9udW1iZXIoY2Qpfj1uaWwpdGhlbgpjZD10b251bWJlcihjZCllbmQ7cmV0dXJuIGNkIGVuZCxudW1iZXJGcm9tU3RyaW5nPWZ1bmN0aW9uKGFkKXJldHVybiBsb2FkKAoicmV0dXJuICIuLmFkKSgpZW5kLHV1aWQ9ZnVuY3Rpb24oKQpsb2NhbCBhZD1tYXRoLnJhbmRvbQpsb2NhbCBmdW5jdGlvbiBiZCgpbG9jYWwgY2Q9J3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCdyZXR1cm4Kc3RyaW5nLmdzdWIoY2QsJ1t4eV0nLGZ1bmN0aW9uKGRkKWxvY2FsIF9fYT0KKGRkPT0neCcpYW5kIGFkKDAsMHhmKW9yIGFkKDgsMHhiKQpyZXR1cm4gc3RyaW5nLmZvcm1hdCgnJXgnLF9fYSllbmQpZW5kO3JldHVybiBiZCgpZW5kLGFycmF5PWZ1bmN0aW9uKGFkLGJkKXJldHVybgpsb2FkKAoicmV0dXJuIHsiLi4KKCJuaWwsIik6cmVwKGFkKS4uICgiWzBdPW5pbCwiKTpyZXAoYmQpLi4ifSIpKCllbmQsc2hyaW5rPWZ1bmN0aW9uKGFkLGJkKWxvY2FsIGNkLGRkLF9fYSxhX2E9e3t9LHt9LHt9fSwwLAojYWQrI2FkJTMsYmQgb3IgY29sb3Vycy5ibGFjaztmb3IgaT0xLCNhZCBkbyBpZgojYWRbaV0+ZGQgdGhlbiBkZD0jYWRbaV1lbmQgZW5kCmZvciB5PTAsX19hLTEsMyBkbwpsb2NhbCBiX2EsY19hLGRfYSxfYWE9e30se30se30sMQpmb3IgeD0wLGRkLTEsMiBkbyBsb2NhbCBhYWEsYmFhPXt9LHt9CmZvciB5eT0xLDMgZG8KZm9yIHh4PTEsMiBkbwphYWFbI2FhYSsxXT0oYWRbeSt5eV1hbmQgYWRbeSt5eV1beCt4eF0pYW5kCihhZFt5Kwp5eV1beCt4eF09PTAgYW5kIGFfYSBvciBhZFt5K3l5XVt4K3h4XSlvciBhX2E7YmFhW2FhYVsjYWFhXV09CmJhYVthYWFbI2FhYV1dYW5kKGJhYVthYWFbI2FhYV1dKzEpb3IgMSBlbmQgZW5kO2JfYVtfYWFdLGNfYVtfYWFdLGRfYVtfYWFdPV9kKGFhYSxiYWEpX2FhPV9hYSsxIGVuZApjZFsxXVsjY2RbMV0rMV0sY2RbMl1bI2NkWzJdKzFdLGNkWzNdWyNjZFszXSsxXT10YWJsZS5jb25jYXQoYl9hKSx0YWJsZS5jb25jYXQoY19hKSx0YWJsZS5jb25jYXQoZF9hKWVuZDtjZC53aWR0aCxjZC5oZWlnaHQ9I2NkWzFdWzFdLCNjZFsxXXJldHVybiBjZCBlbmR9ZW5kCmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0TG9ncyJdPWZ1bmN0aW9uKC4uLilsb2NhbCBhYj0iImxvY2FsIGJiPSJiYXNhbHRMb2cudHh0ImxvY2FsIGNiPSJEZWJ1ZyIKZnMuZGVsZXRlKAphYn49IiJhbmQgYWIuLiIvIi4uYmIgb3IgYmIpCmxvY2FsIGRiPXtfX2NhbGw9ZnVuY3Rpb24oX2MsYWMsYmMpaWYoYWM9PW5pbCl0aGVuIHJldHVybiBlbmQKbG9jYWwgY2M9YWJ+PSIiYW5kIGFiLi4iLyIuLmJiIG9yIGJiCmxvY2FsIGRjPWZzLm9wZW4oY2MsZnMuZXhpc3RzKGNjKWFuZCJhIm9yInciKQpkYy53cml0ZUxpbmUoIltCYXNhbHRdWyIuLiAoYmMgYW5kIGJjIG9yIGNiKS4uIl06ICIuLnRvc3RyaW5nKGFjKSlkYy5jbG9zZSgpZW5kfXJldHVybiBzZXRtZXRhdGFibGUoe30sZGIpZW5kCmFhWyJsaWJyYXJpZXMiXVsibGF5b3V0Il09ZnVuY3Rpb24oLi4uKQpsb2NhbCBmdW5jdGlvbiBhYihjYilsb2NhbCBkYj17fWRiLl9fX3ZhbHVlPW5pbDtkYi5fX19uYW1lPWNiCmRiLl9fX2NoaWxkcmVuPXt9ZGIuX19fcHJvcHM9e31mdW5jdGlvbiBkYjp2YWx1ZSgpcmV0dXJuIHNlbGYuX19fdmFsdWUgZW5kO2Z1bmN0aW9uIGRiOnNldFZhbHVlKF9jKQpzZWxmLl9fX3ZhbHVlPV9jIGVuZDtmdW5jdGlvbiBkYjpuYW1lKClyZXR1cm4gc2VsZi5fX19uYW1lIGVuZDtmdW5jdGlvbiBkYjpzZXROYW1lKF9jKQpzZWxmLl9fX25hbWU9X2MgZW5kO2Z1bmN0aW9uIGRiOmNoaWxkcmVuKClyZXR1cm4gc2VsZi5fX19jaGlsZHJlbiBlbmQ7ZnVuY3Rpb24gZGI6bnVtQ2hpbGRyZW4oKXJldHVybgojc2VsZi5fX19jaGlsZHJlbiBlbmQKZnVuY3Rpb24gZGI6YWRkQ2hpbGQoX2MpCmlmCnNlbGZbX2M6bmFtZSgpXX49bmlsIHRoZW4gaWYKdHlwZShzZWxmW19jOm5hbWUoKV0ubmFtZSk9PSJmdW5jdGlvbiJ0aGVuIGxvY2FsIGFjPXt9dGFibGUuaW5zZXJ0KGFjLHNlbGZbX2M6bmFtZSgpXSkKc2VsZltfYzpuYW1lKCldPWFjIGVuZAp0YWJsZS5pbnNlcnQoc2VsZltfYzpuYW1lKCldLF9jKWVsc2Ugc2VsZltfYzpuYW1lKCldPV9jIGVuZDt0YWJsZS5pbnNlcnQoc2VsZi5fX19jaGlsZHJlbixfYyllbmQ7ZnVuY3Rpb24gZGI6cHJvcGVydGllcygpcmV0dXJuIHNlbGYuX19fcHJvcHMgZW5kO2Z1bmN0aW9uIGRiOm51bVByb3BlcnRpZXMoKQpyZXR1cm4jc2VsZi5fX19wcm9wcyBlbmQKZnVuY3Rpb24gZGI6YWRkUHJvcGVydHkoX2MsYWMpbG9jYWwgYmM9IkAiLi5fYwppZiBzZWxmW2JjXX49bmlsIHRoZW4gaWYKdHlwZShzZWxmW2JjXSk9PSJzdHJpbmcidGhlbiBsb2NhbCBjYz17fXRhYmxlLmluc2VydChjYyxzZWxmW2JjXSkKc2VsZltiY109Y2MgZW5kCnRhYmxlLmluc2VydChzZWxmW2JjXSxhYyllbHNlIHNlbGZbYmNdPWFjIGVuZAp0YWJsZS5pbnNlcnQoc2VsZi5fX19wcm9wcyx7bmFtZT1fYyx2YWx1ZT1zZWxmW19jXX0pZW5kO3JldHVybiBkYiBlbmQ7bG9jYWwgYmI9e30KZnVuY3Rpb24gYmI6VG9YbWxTdHJpbmcoY2IpY2I9c3RyaW5nLmdzdWIoY2IsIiYiLCImYW1wOyIpCmNiPXN0cmluZy5nc3ViKGNiLCI8IiwiJmx0OyIpY2I9c3RyaW5nLmdzdWIoY2IsIj4iLCImZ3Q7IikKY2I9c3RyaW5nLmdzdWIoY2IsIlwiIiwiJnF1b3Q7IikKY2I9c3RyaW5nLmdzdWIoY2IsIihbXiV3JSYlOyVwJVx0JSBdKSIsZnVuY3Rpb24oZGIpCnJldHVybiBzdHJpbmcuZm9ybWF0KCImI3glWDsiLHN0cmluZy5ieXRlKGRiKSllbmQpcmV0dXJuIGNiIGVuZApmdW5jdGlvbiBiYjpGcm9tWG1sU3RyaW5nKGNiKQpjYj1zdHJpbmcuZ3N1YihjYiwiJiN4KFsleF0rKSU7IixmdW5jdGlvbihkYikKcmV0dXJuIHN0cmluZy5jaGFyKHRvbnVtYmVyKGRiLDE2KSllbmQpCmNiPXN0cmluZy5nc3ViKGNiLCImIyhbMC05XSspJTsiLGZ1bmN0aW9uKGRiKXJldHVybiBzdHJpbmcuY2hhcih0b251bWJlcihkYiwxMCkpZW5kKWNiPXN0cmluZy5nc3ViKGNiLCImcXVvdDsiLCJcIiIpCmNiPXN0cmluZy5nc3ViKGNiLCImYXBvczsiLCInIiljYj1zdHJpbmcuZ3N1YihjYiwiJmd0OyIsIj4iKQpjYj1zdHJpbmcuZ3N1YihjYiwiJmx0OyIsIjwiKWNiPXN0cmluZy5nc3ViKGNiLCImYW1wOyIsIiYiKXJldHVybiBjYiBlbmQ7ZnVuY3Rpb24gYmI6UGFyc2VBcmdzKGNiLGRiKQpzdHJpbmcuZ3N1YihkYiwiKCV3Kyk9KFtcIiddKSguLSklMiIsZnVuY3Rpb24oX2MsYWMsYmMpCmNiOmFkZFByb3BlcnR5KF9jLHNlbGY6RnJvbVhtbFN0cmluZyhiYykpZW5kKWVuZApmdW5jdGlvbiBiYjpQYXJzZVhtbFRleHQoY2IpCmxvY2FsIGRiPXt9bG9jYWwgX2M9YWIoKXRhYmxlLmluc2VydChkYixfYylsb2NhbCBhYyxiYyxjYyxkYyxfZDtsb2NhbCBhZCxiZD0xLDEKd2hpbGUgdHJ1ZSBkbwphYyxiZCxiYyxjYyxkYyxfZD1zdHJpbmcuZmluZChjYiwiPCglLz8pKFsld186XSspKC4tKSglLz8pPiIsYWQpaWYgbm90IGFjIHRoZW4gYnJlYWsgZW5kO2xvY2FsIGRkPXN0cmluZy5zdWIoY2IsYWQsYWMtMSkKaWYgbm90CnN0cmluZy5maW5kKGRkLCJeJXMqJCIpdGhlbgpsb2NhbCBfX2E9KF9jOnZhbHVlKClvciIiKS4uc2VsZjpGcm9tWG1sU3RyaW5nKGRkKWRiWyNkYl06c2V0VmFsdWUoX19hKWVuZAppZiBfZD09Ii8idGhlbiBsb2NhbCBfX2E9YWIoY2Mpc2VsZjpQYXJzZUFyZ3MoX19hLGRjKQpfYzphZGRDaGlsZChfX2EpZWxzZWlmIGJjPT0iInRoZW4gbG9jYWwgX19hPWFiKGNjKXNlbGY6UGFyc2VBcmdzKF9fYSxkYykKdGFibGUuaW5zZXJ0KGRiLF9fYSlfYz1fX2EgZWxzZSBsb2NhbCBfX2E9dGFibGUucmVtb3ZlKGRiKV9jPWRiWyNkYl0KaWYjZGI8MSB0aGVuIGVycm9yKCJYbWxQYXJzZXI6IG5vdGhpbmcgdG8gY2xvc2Ugd2l0aCAiLi4KY2MpZW5kO2lmIF9fYTpuYW1lKCl+PWNjIHRoZW4KZXJyb3IoIlhtbFBhcnNlcjogdHJ5aW5nIHRvIGNsb3NlICIuLl9fYS5uYW1lLi4iIHdpdGggIi4uY2MpZW5kO19jOmFkZENoaWxkKF9fYSllbmQ7YWQ9YmQrMSBlbmQ7bG9jYWwgY2Q9c3RyaW5nLnN1YihjYixhZClpZiNkYj4xIHRoZW4KZXJyb3IoIlhtbFBhcnNlcjogdW5jbG9zZWQgIi4uZGJbI2RiXTpuYW1lKCkpZW5kO3JldHVybiBfYyBlbmQKZnVuY3Rpb24gYmI6bG9hZEZpbGUoY2IsZGIpaWYgbm90IGRiIHRoZW4gZGI9c3lzdGVtLlJlc291cmNlRGlyZWN0b3J5IGVuZApsb2NhbCBfYz1zeXN0ZW0ucGF0aEZvckZpbGUoY2IsZGIpbG9jYWwgYWMsYmM9aW8ub3BlbihfYywiciIpCmlmIGFjIGFuZCBub3QgYmMgdGhlbiBsb2NhbCBjYz1hYzpyZWFkKCIqYSIpCmlvLmNsb3NlKGFjKXJldHVybiBzZWxmOlBhcnNlWG1sVGV4dChjYyksbmlsIGVsc2UgcHJpbnQoYmMpcmV0dXJuIG5pbCBlbmQgZW5kO3JldHVybiBiYiBlbmQKYWFbImxpYnJhcmllcyJdWyJiaWdmb250Il09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPWRhKCJ0SGV4IikKbG9jYWwgYmI9e3siXDMyXDMyXDMyXDEzN1wxNTZcMTQ4XDE1OFwxNTlcMTQ4XDEzNVwxMzVcMTQ0XDE1OVwxMzlcMzJcMTM2XDE1N1wzMlwxNTlcMTM5XDMyXDMyXDE0M1wzMlwzMlwxNDNcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ3XDE0OFwxNTBcMTMxXDE0OFwzMlwzMlwzMlwxNTFcMTQwXDE0OFwxNTFcMTQwXDE0NyIsIlwzMlwzMlwzMlwxNDlcMTMyXDE0OVwxMzZcMTU2XDE0OVwxNDRcMzJcMTMzXDEzOVwxNTlcMTI5XDE0M1wxNTlcMTMzXDE0M1wxNTlcMTMzXDEzOFwzMlwxMzNcMTM4XDMyXDEzM1wzMlwzMlwzMlwzMlwzMlwzMlwxNTBcMTUwXDEyOVwxMzdcMTU2XDEyOVwzMlwzMlwzMlwxMzNcMTMxXDEyOVwxMzNcMTMxXDEzMiIsIlwzMlwzMlwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMzJcMTI5XDMyXDMyXDMyXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwzMlwzMlwxNDNcMTQzXDE0M1wzMlwzMlwzMlwzMlwzMlwzMlwxMzBcMTI5XDMyXDEzMFwxMzVcMzJcMzJcMzJcMzJcMTMxXDMyXDMyXDEzMVwzMlwxMzEiLCJcMTM5XDE0NFwzMlwzMlwxNDNcMTQ4XDEzNVwxMzBcMTQ0XDE0OVwzMlwxNDlcMTUwXDE1MVwxNDlcMTU4XDE0MFwxMjlcMzJcMzJcMzJcMTM1XDEzMFwxNDRcMTM1XDEzMFwxNDRcMzJcMTQ5XDMyXDMyXDEzOVwzMlwxNTlcMTQ4XDMyXDMyXDMyXDMyXDE1OVwzMlwxNDRcMzJcMTQ4XDMyXDE0N1wxMzFcMTMyIiwiXDE1OVwxMzVcMTI5XDEzMVwxNDNcMTQ5XDE0M1wxMzhcMTQ0XDEzOFwzMlwxMzNcMTMwXDE0OVwxNDlcMTM3XDE1NVwxNDlcMTU5XDE0M1wxNDRcMTQ3XDEzMFwxMzJcMzJcMTQ5XDMyXDE0N1wxMzBcMTMyXDEzMVwxNTlcMTI5XDEzOVwxNTFcMTI5XDE0OFwzMlwzMlwxMzlcMTMxXDEzNVwxMzNcMzJcMTQ0XDEzMFwxNTFcMzIiLCJcMzJcMzJcMzJcMzJcMzJcMzJcMTMwXDEzNVwzMlwxMzBcMzJcMTI5XDMyXDEyOVwxMjlcMTMxXDEzMVwzMlwxMzBcMTMxXDEyOVwxNDBcMTQxXDEzMlwzMlwxMjlcMzJcMzJcMTI5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDEzMVwxMzFcMTI5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyIiwiXDMyXDMyXDMyXDMyXDE0OVwzMlwxNTlcMTU0XDEzM1wxMzNcMTMzXDE0NFwxNTJcMTQxXDEzMlwxMzNcMTUxXDEyOVwxMzZcMTUzXDMyXDMyXDE1NFwzMlwxNTlcMTM0XDEyOVwxMzBcMTM3XDE0NFwxNTlcMzJcMTQ0XDMyXDE0OFwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNTFcMTI5IiwiXDMyXDMyXDMyXDMyXDEzM1wzMlwzMlwzMlwzMlwxNDVcMTQ1XDEzMlwxNDFcMTQwXDEzMlwxNTFcMTI5XDE0NFwxNTBcMTQ2XDEyOVwzMlwzMlwzMlwxMzhcMTQ0XDMyXDMyXDE1OVwxMzNcMTM2XDEzMVwxMzJcMTMxXDE1MVwxMjlcMzJcMTQ0XDMyXDEzMVwxMzFcMTI5XDMyXDE0NFwzMlwxNTFcMTI5XDMyIiwiXDMyXDMyXDMyXDMyXDEyOVwzMlwzMlwzMlwzMlwxMzBcMTMwXDMyXDMyXDEyOVwzMlwxMjlcMzJcMTI5XDEzMFwxMjlcMTI5XDMyXDMyXDMyXDMyXDEzMFwxMjlcMTMwXDEyOVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxMzNcMzJcMzJcMzJcMzJcMzJcMTI5XDMyXDEyOVwzMlwzMiIsIlwxNTBcMTU2XDE0OFwxMzZcMTQ5XDMyXDEzNFwxMzFcMTQ4XDEzNFwxMzFcMTQ4XDE1OVwxMzRcMTQ5XDEzNlwxNDBcMTI5XDE1MlwxMzFcMzJcMTM1XDEzMVwxNDlcMTUwXDEzMVwxNDhcMTUwXDEzMVwxNDhcMzJcMTQ4XDMyXDMyXDE0OFwzMlwzMlwxNTJcMTI5XDE0M1wxNDNcMTQ0XDEzMFwxNTVcMzJcMTM0XDEzMVwxNDgiLCJcMTU3XDEyOVwxNDlcMzJcMTQ5XDMyXDE1MlwxMzFcMTQ0XDE0NFwxMzFcMTQ4XDE0MVwxNDBcMTQ5XDE0NFwzMlwxNDlcMTUxXDEzMVwxNDhcMzJcMTUwXDMyXDE1MFwxMzFcMTQ4XDEzMFwxNTZcMTMzXDMyXDE0NFwzMlwzMlwxNDRcMzJcMTMwXDE1NVwzMlwxNDNcMTQzXDE0NFwzMlwxNTJcMTI5XDMyXDEzNFwzMiIsIlwxMzBcMTMxXDMyXDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMFwxMzFcMzJcMzJcMzJcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwxMjlcMzJcMTMwXDEzMVwzMlwxMzBcMTI5XDMyXDMyXDEyOVwzMlwzMlwxMzNcMzJcMzJcMzJcMTI5XDMyXDMyXDMyXDEzMFwzMlwzMlwzMlwxMjlcMzIiLCJcMTUwXDE0MFwxNTBcMTM3XDE0MFwxNDhcMTM2XDE0MFwxMzJcMTUwXDEzMVwxMzJcMTUxXDEzMVwxNDhcMTM2XDE0N1wxMjlcMTM2XDE0N1wxMjlcMTUwXDE1NlwxNDVcMTM4XDE0M1wxNDlcMTMwXDE1MVwzMlwzMlwzMlwxNDlcMTM4XDE1MlwxMjlcMTQ5XDMyXDMyXDE1N1wxNTJcMTQ5XDE1N1wxNDRcMTQ5XDE1MFwxMzFcMTQ4IiwiXDE0OVwxNDNcMTQyXDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ0XDE0OVwzMlwxNDlcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMzJcMTQ5XDMyXDE0NFwzMlwxNDlcMTQ5XDEzMFwxNDhcMTQ5XDMyXDMyXDE0OVwzMlwxNDlcMTQ5XDEzMFwxNDlcMTQ5XDMyXDE0OSIsIlwxMzBcMTMxXDEyOVwxMjlcMzJcMTI5XDEzMVwxMzFcMzJcMTMwXDEzMVwzMlwxMzFcMTMxXDMyXDEzMVwxMzFcMTI5XDEyOVwzMlwzMlwxMzBcMTMxXDMyXDEyOVwzMlwxMjlcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEyOVwzMlwxMjlcMTMxXDEzMVwxMjlcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzIiLCJcMTM2XDE0MFwxMzJcMTUwXDEzMVwxNDhcMTM2XDE0MFwxMzJcMTUzXDE0MFwxMjlcMTMxXDE1MVwxMjlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTM3XDE1MlwxMjlcMTM3XDE1MlwxMjlcMTMxXDE1NlwxMzNcMTQ5XDEzMVwzMlwxNTBcMzJcMzJcMTMwXDE0OFwzMlwxNTJcMTM3XDE0NFwzMlwzMlwzMiIsIlwxNDlcMzJcMzJcMTQ5XDE1OVwxMzNcMTQ5XDMyXDE0OVwxNDRcMzJcMTQ5XDMyXDE0OVwzMlwxNDlcMzJcMTQ5XDE1MFwxNTFcMTI5XDEzOFwxNTVcMTQ5XDE1MFwxMzBcMTQ4XDMyXDE0OVwzMlwxNTJcMTI5XDMyXDE0OVwzMlwzMlwzMlwxNTBcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyIiwiXDEyOVwzMlwzMlwxMzBcMTI5XDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzJcMzJcMTI5XDMyXDEzMFwxMzFcMzJcMzJcMTI5XDMyXDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwzMlwxMjlcMzJcMTMxXDEzMVwxMjlcMTMwXDEzMVwzMlwzMlwzMlwxMjlcMTMwXDEzMVwzMlwzMlwzMlwzMlwxNDBcMTQwXDEzMiIsIlwzMlwxNTRcMzJcMTU5XDE0M1wzMlwxNDlcMTQzXDMyXDE1OVwxNDNcMzJcMTU5XDE0NFwxNDlcMTU5XDE0M1wzMlwxNTlcMTM3XDE0NVwxNTlcMTQzXDE0NFwxNDlcMTQzXDMyXDMyXDE0NVwzMlwzMlwzMlwxNDVcMTQ5XDMyXDE0NFwzMlwxNDlcMzJcMTQzXDE1OVwzMlwxNDNcMTQzXDMyXDE1OVwxNDNcMzIiLCJcMzJcMzJcMzJcMTUyXDE0MFwxNDlcMTUxXDMyXDE0OVwxNDlcMzJcMTQ1XDE0OVwxMzBcMTQ5XDE1N1wxNDBcMTMzXDMyXDE0OVwzMlwxNTRcMTQzXDE0OVwxNTFcMzJcMTQ5XDMyXDE0OVwzMlwxNDRcMzJcMTQ5XDE0OVwxNTNcMzJcMzJcMTQ5XDMyXDE0OVwxMzNcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OSIsIlwzMlwzMlwzMlwxMzBcMTMxXDEyOVwxMzFcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMzJcMTI5XDMyXDE0MFwxNDBcMTI5XDEyOVwzMlwxMjlcMzJcMTI5XDMyXDEzN1wxNDBcMTI5XDEzMFwzMlwxMjlcMzJcMTMwXDMyXDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwxMzBcMTMxXDMyIiwiXDE0NFwxNDNcMzJcMTU5XDE0NFwxNDRcMTQ0XDE0M1wzMlwxNTlcMTQzXDE0NFwxNTlcMTM4XDMyXDE0NFwzMlwxNDRcMTQ0XDMyXDE0NFwxNDRcMzJcMTQ0XDE0NFwzMlwxNDRcMTQ0XDMyXDE0NFwxNDNcMTQzXDE0NFwzMlwxNTBcMTI5XDMyXDE0OVwzMlwxMzBcMTUwXDMyXDEzNFwxMzdcMTM0XDEzNFwxMzFcMTQ4IiwiXDEzNlwxNDNcMTMzXDE1NFwxNDFcMTQ5XDE1MVwzMlwxMjlcMTM3XDE0MFwxNDRcMzJcMTQ5XDMyXDE0OVwzMlwxNDlcMTU0XDE1OVwxMzNcMTQ5XDE0OFwxNDlcMTU3XDE1M1wzMlwxNTRcMTQzXDE0OVwxNTlcMTM0XDMyXDEzMFwxNDhcMzJcMzJcMTQ5XDMyXDMyXDE1MVwxMjlcMzJcMzJcMzJcMzJcMTM0XDMyIiwiXDEzM1wzMlwzMlwzMlwzMlwxMzNcMTI5XDMyXDMyXDEzMVwxMzFcMzJcMzJcMTMwXDMyXDEzMFwxMzFcMTI5XDMyXDEyOVwzMlwxMzBcMTMxXDEyOVwxMjlcMzJcMTI5XDE0MFwxNDBcMTI5XDEzMVwxMzFcMTI5XDMyXDEzMFwxMjlcMzJcMTI5XDMyXDEzMFwxMjlcMzJcMzJcMzJcMzJcMzJcMTI5XDMyIiwiXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzIiLCJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDMyXDMyIiwiXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzJcMzIiLCJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyIiwiXDMyXDMyXDMyXDMyXDE0NVwzMlwxNTlcMTM5XDMyXDE1MVwxMzFcMTMyXDE1NVwxNDNcMTMyXDEzNFwxMzVcMTQ1XDMyXDE0OVwzMlwxNThcMTQwXDEyOVwxMzBcMTMwXDMyXDE1MlwxNDdcMTU1XDE1N1wxMzRcMzJcMzJcMTQ0XDE0NFwzMlwzMlwzMlwzMlwzMlwzMlwxNTJcMTMxXDE1NVwxMzFcMTMxXDEyOSIsIlwzMlwzMlwzMlwzMlwxNDlcMzJcMTQ5XDMyXDE0NVwxNDhcMTMxXDMyXDE0OVwzMlwxNDlcMTQwXDE1N1wxMzJcMzJcMTQ4XDMyXDEzN1wxNTVcMTQ5XDMyXDMyXDMyXDE0OVwxNTRcMTQ5XDEzN1wxNDJcMzJcMTUzXDE1M1wzMlwxMzFcMTMxXDE0OVwxMzFcMTMxXDEyOVwxNDlcMTM1XDE0NVwzMlwzMlwzMiIsIlwzMlwzMlwzMlwzMlwxMjlcMzJcMTMwXDEzNVwzMlwxMzFcMTMxXDEyOVwxMzRcMTMxXDEzMlwzMlwxMjlcMzJcMzJcMTI5XDMyXDEzMVwxMzFcMzJcMzJcMzJcMzJcMTMwXDEzMVwxMjlcMzJcMzJcMzJcMzJcMTI5XDEyOVwzMlwzMlwzMlwzMlwzMlwzMlwxMzBcMTMxXDEyOVwzMlwzMlwzMiIsIlwxNTBcMTUwXDMyXDMyXDE0OFwzMlwxMzRcMzJcMzJcMTMyXDMyXDMyXDEzNFwzMlwzMlwxNDRcMzJcMTQ0XDE1MFwxNTFcMTQ5XDMyXDMyXDMyXDMyXDMyXDMyXDE0NVwzMlwzMlwxNTJcMTQwXDE0NFwxNDRcMTQ0XDMyXDEzM1wxNTFcMTI5XDEzM1wxNTFcMTI5XDEzMlwxNTFcMTI5XDMyXDE0NVwzMiIsIlwxMzBcMTI5XDMyXDEzMVwxNTFcMTI5XDE0MVwzMlwzMlwxNDJcMzJcMzJcMzJcMzJcMzJcMTQ5XDMyXDE0OVwxMzBcMTQ5XDE0OVwzMlwxNDNcMzJcMzJcMzJcMzJcMTQyXDEzMlwzMlwxNTRcMTQzXDEzM1wxNTdcMTUzXDEzMlwxNTFcMTUwXDE0OFwxNTFcMTU4XDEzMlwxNTFcMTUwXDE0OFwxNDRcMTMwXDE0OCIsIlwzMlwzMlwzMlwxNDBcMTQwXDEzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwzMlwxNTFcMTMxXDMyXDMyXDEyOVwxMjlcMzJcMzJcMzJcMzJcMTM0XDMyXDMyXDMyXDMyXDMyXDMyXDMyXDEyOVwxMjlcMzJcMTI5XDMyXDEyOVwxMjlcMTMwXDEyOVwxMjlcMzJcMTI5XDEzMFwxMzFcMzIiLCJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMTU5XDE0MlwzMlwxNTBcMTUxXDEyOVwxNTBcMTMxXDEzMlwxNDBcMTQzXDE0NFwxNDNcMTQxXDE0NVwxMzdcMTQwXDE0OFwxNDFcMTQxXDE0NFwxNTdcMTQyXDMyXDE1OVwxNDBcMzJcMTUxXDEzNFwzMlwxNTdcMTQxXDMyIiwiXDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1N1wxNDBcMTQ5XDE1MVwxNTFcMzJcMTU0XDE0M1wxMzJcMTU3XDE0MFwzMlwxNTdcMTQwXDMyXDE1N1wxNDBcMzJcMTU3XDE0MFwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMlwzMlwxNDlcMzIiLCJcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEyOVwzMlwxMjlcMTI5XDMyXDEyOVwxMjlcMzJcMTI5XDEyOVwzMlwxMjlcMTI5XDEzMVwxMjlcMzJcMTM0XDMyXDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMVwxMzFcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzIiLCJcMTUxXDEzMVwxNDhcMTUyXDEzN1wxNDVcMTU1XDE0MFwxNDRcMTUyXDE0MlwxNDVcMTUzXDE0MFwxMzJcMTUzXDEzN1wzMlwxNTRcMTQyXDE0NFwxNTVcMTU5XDEzMlwxNTBcMTU2XDE0OFwxNDdcMzJcMTQ0XDE0NFwxMzBcMTQ1XDEzNlwxMzdcMzJcMTQ2XDEzMFwxNDRcMTQ0XDEzMFwxNDVcMTMwXDEzNlwzMlwxNTFcMTQwXDEzMiIsIlwxNTFcMzJcMTQ5XDE1MVwxNTVcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNTJcMTM3XDE0NFwxNTdcMTI5XDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDEzMFwxNTBcMzJcMzJcMTU3XDEyOVwxNDlcMzJcMTQ5IiwiXDEzMVwxMzFcMzJcMTI5XDMyXDEyOVwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMzJcMzJcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDMyXDEyOVwzMlwxMzBcMTMxXDMyXDEzM1wxMzFcMzIiLCJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMTU5XDE0MlwzMlwxNTlcMTU5XDE0NFwxNTJcMTQwXDE0NFwxNTZcMTQzXDMyXDE1OVwxNDFcMTI5XDE1M1wxNDBcMTMyXDE1N1wxNDFcMzJcMTMwXDE0NVwzMlwzMlwxNDdcMzJcMTM2XDE1M1wzMlwxMzBcMTQ2XDMyIiwiXDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE1MlwxNDBcMTQ5XDE0OVwxNTdcMTM0XDE1NFwxNDNcMTMyXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDE1N1wxNDBcMTMzXDMyXDE0OVwzMlwzMlwxNDlcMzJcMzJcMTQ5XDMyXDMyXDE0OVwzMiIsIlwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMxXDEyOVwxMzBcMTMwXDEzMVwzMlwxMzRcMzJcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMTMwXDEzMVwxMjlcMzJcMTI5XDMyXDMyXDEyOVwzMlwzMlwxMjlcMzJcMzJcMTI5XDMyIiwiXDE1OVwxMzRcMTQ0XDEzN1wxMzdcMzJcMTU2XDE0M1wzMlwxNTlcMTQxXDEyOVwxNTNcMTQwXDEzMlwxNTNcMTM3XDMyXDE1N1wxNDFcMzJcMzJcMTMyXDMyXDE1OVwxNDNcMzJcMTQ3XDMyXDE0NFwxNDRcMTMwXDE0NVwxMzZcMTM3XDMyXDE0NlwxMzBcMTQ0XDE0NFwxMzBcMTQ1XDEzMFwxMzhcMzJcMTQ2XDEzMFwxNDQiLCJcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxMzFcMTQ3XDEyOVwxMzhcMTM0XDE0OVwxNDlcMzJcMTQ5XDE0OVwzMlwxNDlcMTQ5XDMyXDE0OVwxNDlcMzJcMTQ5XDE1NFwxNDNcMTQ5XDMyXDE1N1wxMjlcMTU0XDE0M1wxNDkiLCJcMTMwXDEzMVwzMlwxMjlcMzJcMTI5XDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMzJcMTMwXDEzMVwzMlwzMlwzMlwzMlwxMzBcMTMxXDMyXDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDEzMFwxMzFcMTI5XDE0MFwxNDBcMTI5XDEzMFwxMzFcMzJcMTQwXDE0MFwxMjkifSx7IjAwMDExMDAwMDExMDExMDAwMDExMDAxMDEwMTAwMDAwMDAxMDAwMDAwMDEwMDEwMSIsIjAwMDAwMDExMDExMDAwMDAwMDAwMDAxMDEwMTAwMDAwMDAxMDAwMDAwMDEwMDEwMSIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjEwMDAxMDExMDEwMDAwMDAxMDAwMDExMDExMDAwMDAxMDEwMDAwMDEwMDAwMDExMCIsIjAwMDAwMDExMDAwMDAwMDAxMDExMDExMDAwMDExMDAwMDAwMDAwMDAwMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDExMDExMDAwMDAxMDAwMDAwMDEwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMCIsIjAwMDAwMDAwMDExMDExMDEwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDAwMDAwMDAwMDEwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAxMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDExMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMTExMDExMDAwMDAwMDEwMDEwMDAxMDExMDAwMDAwMDEwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDAwMDExMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDEwMDEwMDAxMDAwMDAwMCIsIjAwMDAxMDAwMDAwMDAwMDAwMDExMDExMDAwMDAwMDAwMDEwMDAxMDAxMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDExMDAxMDExMDEwMDExMDExMDExMDAxMDAwMDAwMDEwMDAwMDExMDExMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDEwMDAxMDExMDExMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAxMDAwMDAwMCIsIjExMDExMDAwMDAwMDAwMDAwMDExMDAwMDExMDExMDEwMDAwMDAwMDAxMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMSIsIjAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDAxMTAxMTAxMTAxMTExMTExMTExMTExMSIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMTAwMDEwMDAxMTExMSIsIjAwMDAwMDAwMDAwMDEwMDEwMDEwMDEwMDAxMTAxMTAxMTAxMTExMTExMTExMTExMSIsIjEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMDEwMCIsIjAwMDAwMDExMDEwMDExMDExMDAwMDAxMDAwMDAxMTExMDAwMDAwMDAwMDAxMTAwMCIsIjAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAwMDAxMTAwMDExMDAwMDAwMDAwMTAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAxMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAxMDAxMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDExMDExMDExMDExMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDAwMDAwMDExMDExMDExMDExMDExMDExMDExMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDExMDExMDAwMDExMDAxMDAwMDAwMDAwMDAwMDAwMDAxMDAxMCIsIjAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDExMDAwMDExMDExMDExMDExMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjExMDExMDExMDExMDExMDExMDExMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAxMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDExMDAwMDExMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9fWxvY2FsIGNiPXt9bG9jYWwgZGI9e30KZG8gbG9jYWwgYmM9MDtsb2NhbCBjYz0jYmJbMV1sb2NhbCBkYz0jYmJbMV1bMV0KZm9yIGk9MSxjYywzIGRvCmZvciBqPTEsZGMsMyBkbwpsb2NhbCBfZD1zdHJpbmcuY2hhcihiYylsb2NhbCBhZD17fWFkWzFdPWJiWzFdW2ldOnN1YihqLGorMikKYWRbMl09YmJbMV1baSsxXTpzdWIoaixqKzIpYWRbM109YmJbMV1baSsyXTpzdWIoaixqKzIpbG9jYWwgYmQ9e31iZFsxXT1iYlsyXVtpXTpzdWIoaiwKaisyKWJkWzJdPWJiWzJdW2krMV06c3ViKGosaisyKWJkWzNdPWJiWzJdWwppKzJdOnN1YihqLGorMilkYltfZF09e2FkLGJkfWJjPWJjKzEgZW5kIGVuZDtjYlsxXT1kYiBlbmQKbG9jYWwgZnVuY3Rpb24gX2MoYmMsY2MpbG9jYWwgZGM9e1siMCJdPSIxIixbIjEiXT0iMCJ9aWYgYmM8PSNjYiB0aGVuIHJldHVybiB0cnVlIGVuZApmb3IgZj0jY2IrMSxiYyBkbyBsb2NhbCBfZD17fWxvY2FsIGFkPWNiWwpmLTFdCmZvciBjaGFyPTAsMjU1IGRvIGxvY2FsIGJkPXN0cmluZy5jaGFyKGNoYXIpbG9jYWwgY2Q9e31sb2NhbCBkZD17fQpsb2NhbCBfX2E9YWRbYmRdWzFdbG9jYWwgYV9hPWFkW2JkXVsyXQpmb3IgaT0xLCNfX2EgZG8gbG9jYWwgYl9hLGNfYSxkX2EsX2FhLGFhYSxiYWE9e30se30se30se30se30se30KZm9yIGo9MSwjX19hWzFdZG8KbG9jYWwgY2FhPWRiW19fYVtpXTpzdWIoaixqKV1bMV10YWJsZS5pbnNlcnQoYl9hLGNhYVsxXSkKdGFibGUuaW5zZXJ0KGNfYSxjYWFbMl0pdGFibGUuaW5zZXJ0KGRfYSxjYWFbM10pCmxvY2FsIGRhYT1kYltfX2FbaV06c3ViKGosaildWzJdCmlmIGFfYVtpXTpzdWIoaixqKT09IjEidGhlbgp0YWJsZS5pbnNlcnQoX2FhLChkYWFbMV06Z3N1YigiWzAxXSIsZGMpKSkKdGFibGUuaW5zZXJ0KGFhYSwoZGFhWzJdOmdzdWIoIlswMV0iLGRjKSkpCnRhYmxlLmluc2VydChiYWEsKGRhYVszXTpnc3ViKCJbMDFdIixkYykpKWVsc2UgdGFibGUuaW5zZXJ0KF9hYSxkYWFbMV0pCnRhYmxlLmluc2VydChhYWEsZGFhWzJdKXRhYmxlLmluc2VydChiYWEsZGFhWzNdKWVuZCBlbmQ7dGFibGUuaW5zZXJ0KGNkLHRhYmxlLmNvbmNhdChiX2EpKQp0YWJsZS5pbnNlcnQoY2QsdGFibGUuY29uY2F0KGNfYSkpdGFibGUuaW5zZXJ0KGNkLHRhYmxlLmNvbmNhdChkX2EpKQp0YWJsZS5pbnNlcnQoZGQsdGFibGUuY29uY2F0KF9hYSkpdGFibGUuaW5zZXJ0KGRkLHRhYmxlLmNvbmNhdChhYWEpKQp0YWJsZS5pbnNlcnQoZGQsdGFibGUuY29uY2F0KGJhYSkpZW5kO19kW2JkXT17Y2QsZGR9aWYgY2MgdGhlbiBjYz0iRm9udCIuLmYuLiJZZWxkIi4uY2hhcgpvcy5xdWV1ZUV2ZW50KGNjKW9zLnB1bGxFdmVudChjYyllbmQgZW5kO2NiW2ZdPV9kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQKbG9jYWwgZnVuY3Rpb24gYWMoYmMsY2MsZGMsX2QsYWQpCmlmIG5vdCB0eXBlKGNjKT09InN0cmluZyJ0aGVuIGVycm9yKCJOb3QgYSBTdHJpbmciLDMpZW5kCmxvY2FsIGJkPXR5cGUoZGMpPT0ic3RyaW5nImFuZCBkYzpzdWIoMSwxKW9yIGFiW2RjXW9yCmVycm9yKCJXcm9uZyBGcm9udCBDb2xvciIsMykKbG9jYWwgY2Q9dHlwZShfZCk9PSJzdHJpbmciYW5kIF9kOnN1YigxLDEpb3IgYWJbX2Rdb3IKZXJyb3IoIldyb25nIEJhY2sgQ29sb3IiLDMpaWYoY2JbYmNdPT1uaWwpdGhlbiBfYygzLGZhbHNlKWVuZDtsb2NhbCBkZD1jYltiY11vcgplcnJvcigiV3JvbmcgZm9udCBzaXplIHNlbGVjdGVkIiwzKWlmIGNjPT0iInRoZW4KcmV0dXJue3siIn0seyIifSx7IiJ9fWVuZDtsb2NhbCBfX2E9e30KZm9yIGJhYSBpbiBjYzpnbWF0Y2goJy4nKWRvIHRhYmxlLmluc2VydChfX2EsYmFhKWVuZDtsb2NhbCBhX2E9e31sb2NhbCBiX2E9I2RkW19fYVsxXV1bMV0KZm9yIG5MaW5lPTEsYl9hIGRvIGxvY2FsIGJhYT17fQpmb3IgaT0xLCNfX2EgZG8gYmFhW2ldPWRkW19fYVtpXV1hbmQKZGRbX19hW2ldXVsxXVtuTGluZV1vciIiZW5kO2FfYVtuTGluZV09dGFibGUuY29uY2F0KGJhYSllbmQ7bG9jYWwgY19hPXt9bG9jYWwgZF9hPXt9bG9jYWwgX2FhPXtbIjAiXT1iZCxbIjEiXT1jZH1sb2NhbCBhYWE9e1siMCJdPWNkLFsiMSJdPWJkfQpmb3IgbkxpbmU9MSxiX2EgZG8KbG9jYWwgYmFhPXt9bG9jYWwgY2FhPXt9CmZvciBpPTEsI19fYSBkbwpsb2NhbCBkYWE9ZGRbX19hW2ldXWFuZCBkZFtfX2FbaV1dWzJdW25MaW5lXW9yIiIKYmFhW2ldPWRhYTpnc3ViKCJbMDFdIiwKYWQgYW5ke1siMCJdPWRjOnN1YihpLGkpLFsiMSJdPV9kOnN1YihpLGkpfW9yIF9hYSkKY2FhW2ldPWRhYTpnc3ViKCJbMDFdIiwKYWQgYW5ke1siMCJdPV9kOnN1YihpLGkpLFsiMSJdPWRjOnN1YihpLGkpfW9yIGFhYSllbmQ7Y19hW25MaW5lXT10YWJsZS5jb25jYXQoYmFhKQpkX2FbbkxpbmVdPXRhYmxlLmNvbmNhdChjYWEpZW5kO3JldHVybnthX2EsY19hLGRfYX1lbmQ7cmV0dXJuIGFjIGVuZAphYVsibGlicmFyaWVzIl1bImJhc2FsdE1vbiJdPWZ1bmN0aW9uKC4uLikKbG9jYWwgYWI9e1tjb2xvcnMud2hpdGVdPSIwIixbY29sb3JzLm9yYW5nZV09IjEiLFtjb2xvcnMubWFnZW50YV09IjIiLFtjb2xvcnMubGlnaHRCbHVlXT0iMyIsW2NvbG9ycy55ZWxsb3ddPSI0IixbY29sb3JzLmxpbWVdPSI1IixbY29sb3JzLnBpbmtdPSI2IixbY29sb3JzLmdyYXldPSI3IixbY29sb3JzLmxpZ2h0R3JheV09IjgiLFtjb2xvcnMuY3lhbl09IjkiLFtjb2xvcnMucHVycGxlXT0iYSIsW2NvbG9ycy5ibHVlXT0iYiIsW2NvbG9ycy5icm93bl09ImMiLFtjb2xvcnMuZ3JlZW5dPSJkIixbY29sb3JzLnJlZF09ImUiLFtjb2xvcnMuYmxhY2tdPSJmIn1sb2NhbCBiYixjYixkYixfYz10eXBlLHN0cmluZy5sZW4sc3RyaW5nLnJlcCxzdHJpbmcuc3ViCnJldHVybgpmdW5jdGlvbihhYylsb2NhbCBiYz17fQpmb3IgX2JhLGFiYSBpbiBwYWlycyhhYylkbwpiY1tfYmFdPXt9CmZvciBiYmEsY2JhIGluIHBhaXJzKGFiYSlkbyBsb2NhbCBkYmE9cGVyaXBoZXJhbC53cmFwKGNiYSlpZihkYmE9PW5pbCl0aGVuCmVycm9yKCJVbmFibGUgdG8gZmluZCBtb25pdG9yICIuLmNiYSllbmQ7YmNbX2JhXVtiYmFdPWRiYQpiY1tfYmFdW2JiYV0ubmFtZT1jYmEgZW5kIGVuZDtsb2NhbCBjYyxkYyxfZCxhZCxiZCxjZCxkZCxfX2E9MSwxLDEsMSwwLDAsMCwwO2xvY2FsIGFfYSxiX2E9ZmFsc2UsMQpsb2NhbCBjX2EsZF9hPWNvbG9ycy53aGl0ZSxjb2xvcnMuYmxhY2sKbG9jYWwgZnVuY3Rpb24gX2FhKClsb2NhbCBfYmEsYWJhPTAsMApmb3IgYmJhLGNiYSBpbiBwYWlycyhiYylkbyBsb2NhbCBkYmEsX2NhPTAsMApmb3IgYWNhLGJjYSBpbiBwYWlycyhjYmEpZG8gbG9jYWwgY2NhLGRjYT1iY2EuZ2V0U2l6ZSgpCmRiYT1kYmErY2NhO19jYT1kY2E+X2NhIGFuZCBkY2Egb3IgX2NhIGVuZDtfYmE9X2JhPmRiYSBhbmQgX2JhIG9yIGRiYTthYmE9YWJhK19jYSBlbmQ7ZGQsX19hPV9iYSxhYmEgZW5kO19hYSgpCmxvY2FsIGZ1bmN0aW9uIGFhYSgpbG9jYWwgX2JhPTA7bG9jYWwgYWJhLGJiYT0wLDAKZm9yIGNiYSxkYmEgaW4gcGFpcnMoYmMpZG8gbG9jYWwgX2NhPTA7bG9jYWwgYWNhPTAKZm9yIGJjYSxjY2EgaW4gcGFpcnMoZGJhKWRvCmxvY2FsIGRjYSxfZGE9Y2NhLmdldFNpemUoKWlmKGNjLV9jYT49MSlhbmQoY2MtX2NhPD1kY2EpdGhlbiBhYmE9YmNhIGVuZDtjY2Euc2V0Q3Vyc29yUG9zKApjYy1fY2EsZGMtX2JhKV9jYT1fY2ErZGNhCmlmKGFjYTxfZGEpdGhlbiBhY2E9X2RhIGVuZCBlbmQ7aWYoZGMtX2JhPj0xKWFuZChkYy1fYmE8PWFjYSl0aGVuIGJiYT1jYmEgZW5kCl9iYT1fYmErYWNhIGVuZDtfZCxhZD1hYmEsYmJhIGVuZDthYWEoKQpsb2NhbCBmdW5jdGlvbiBiYWEoX2JhLC4uLilsb2NhbCBhYmE9ey4uLn1yZXR1cm4KZnVuY3Rpb24oKWZvciBiYmEsY2JhIGluIHBhaXJzKGJjKWRvIGZvciBkYmEsX2NhIGluIHBhaXJzKGNiYSlkbwpfY2FbX2JhXSh0YWJsZS51bnBhY2soYWJhKSllbmQgZW5kIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gY2FhKCliYWEoInNldEN1cnNvckJsaW5rIixmYWxzZSkoKQppZiBub3QoYV9hKXRoZW4gcmV0dXJuIGVuZDtpZihiY1thZF09PW5pbCl0aGVuIHJldHVybiBlbmQ7bG9jYWwgX2JhPWJjW2FkXVtfZF0KaWYoX2JhPT1uaWwpdGhlbiByZXR1cm4gZW5kO19iYS5zZXRDdXJzb3JCbGluayhhX2EpZW5kCmxvY2FsIGZ1bmN0aW9uIGRhYShfYmEsYWJhLGJiYSlpZihiY1thZF09PW5pbCl0aGVuIHJldHVybiBlbmQ7bG9jYWwgY2JhPWJjW2FkXVtfZF0KaWYoY2JhPT1uaWwpdGhlbiByZXR1cm4gZW5kO2NiYS5ibGl0KF9iYSxhYmEsYmJhKWxvY2FsIGRiYSxfY2E9Y2JhLmdldFNpemUoKQppZgooY2IoX2JhKStjYz5kYmEpdGhlbiBsb2NhbCBhY2E9YmNbYWRdW19kKzFdaWYoYWNhfj1uaWwpdGhlbiBhY2EuYmxpdChfYmEsYWJhLGJiYSlfZD1fZCsxO2NjPWNjKwpjYihfYmEpZW5kIGVuZDthYWEoKWVuZApyZXR1cm4Ke2NsZWFyPWJhYSgiY2xlYXIiKSxzZXRDdXJzb3JCbGluaz1mdW5jdGlvbihfYmEpYV9hPV9iYTtjYWEoKWVuZCxnZXRDdXJzb3JCbGluaz1mdW5jdGlvbigpcmV0dXJuIGFfYSBlbmQsZ2V0Q3Vyc29yUG9zPWZ1bmN0aW9uKClyZXR1cm4gY2MsZGMgZW5kLHNldEN1cnNvclBvcz1mdW5jdGlvbihfYmEsYWJhKQpjYyxkYz1fYmEsYWJhO2FhYSgpY2FhKCllbmQsc2V0VGV4dFNjYWxlPWZ1bmN0aW9uKF9iYSkKYmFhKCJzZXRUZXh0U2NhbGUiLF9iYSkoKV9hYSgpYWFhKCliX2E9X2JhIGVuZCxnZXRUZXh0U2NhbGU9ZnVuY3Rpb24oKXJldHVybiBiX2EgZW5kLGJsaXQ9ZnVuY3Rpb24oX2JhLGFiYSxiYmEpCmRhYShfYmEsYWJhLGJiYSllbmQsd3JpdGU9ZnVuY3Rpb24oX2JhKV9iYT10b3N0cmluZyhfYmEpbG9jYWwgYWJhPWNiKF9iYSkKZGFhKF9iYSxkYihhYltjX2FdLGFiYSksZGIoYWJbZF9hXSxhYmEpKWVuZCxnZXRTaXplPWZ1bmN0aW9uKClyZXR1cm4gZGQsX19hIGVuZCxzZXRCYWNrZ3JvdW5kQ29sb3I9ZnVuY3Rpb24oX2JhKQpiYWEoInNldEJhY2tncm91bmRDb2xvciIsX2JhKSgpZF9hPV9iYSBlbmQsc2V0VGV4dENvbG9yPWZ1bmN0aW9uKF9iYSkKYmFhKCJzZXRUZXh0Q29sb3IiLF9iYSkoKWNfYT1fYmEgZW5kLGNhbGN1bGF0ZUNsaWNrPWZ1bmN0aW9uKF9iYSxhYmEsYmJhKWxvY2FsIGNiYT0wCmZvciBkYmEsX2NhIGluIHBhaXJzKGJjKWRvIGxvY2FsIGFjYT0wO2xvY2FsIGJjYT0wCmZvciBjY2EsZGNhIGluIHBhaXJzKF9jYSlkbwpsb2NhbCBfZGEsYWRhPWRjYS5nZXRTaXplKClpZihkY2EubmFtZT09X2JhKXRoZW4gcmV0dXJuIGFiYSthY2EsYmJhK2NiYSBlbmQKYWNhPWFjYStfZGE7aWYoYWRhPmJjYSl0aGVuIGJjYT1hZGEgZW5kIGVuZDtjYmE9Y2JhK2JjYSBlbmQ7cmV0dXJuIGFiYSxiYmEgZW5kfWVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJwcm9jZXNzIl09ZnVuY3Rpb24oLi4uKWxvY2FsIGFiPXt9bG9jYWwgYmI9e31sb2NhbCBjYj0wCmxvY2FsIGRiPWRvZmlsZSgicm9tL21vZHVsZXMvbWFpbi9jYy9yZXF1aXJlLmx1YSIpLm1ha2UKZnVuY3Rpb24gYmI6bmV3KF9jLGFjLGJjLC4uLilsb2NhbCBjYz17Li4ufQpsb2NhbCBkYz1zZXRtZXRhdGFibGUoe3BhdGg9X2N9LHtfX2luZGV4PXNlbGZ9KWRjLndpbmRvdz1hYzthYy5jdXJyZW50PXRlcm0uY3VycmVudDthYy5yZWRpcmVjdD10ZXJtLnJlZGlyZWN0CmRjLnByb2Nlc3NJZD1jYgppZih0eXBlKF9jKT09InN0cmluZyIpdGhlbgpkYy5jb3JvdXRpbmU9Y29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbigpCmxvY2FsIF9kPXNoZWxsLnJlc29sdmVQcm9ncmFtKF9jKWxvY2FsIGFkPXNldG1ldGF0YWJsZShiYyx7X19pbmRleD1fRU5WfSlhZC5zaGVsbD1zaGVsbAphZC5iYXNhbHRQcm9ncmFtPXRydWU7YWQucmVxdWlyZSxhZC5wYWNrYWdlPWRiKGFkLGZzLmdldERpcihfZCkpCmlmKGZzLmV4aXN0cyhfZCkpdGhlbgpsb2NhbCBiZD1mcy5vcGVuKF9kLCJyIilsb2NhbCBjZD1iZC5yZWFkQWxsKCliZC5jbG9zZSgpbG9jYWwgZGQ9bG9hZChjZCxfYywiYnQiLGFkKWlmKGRkfj1uaWwpdGhlbiByZXR1cm4KZGQodGFibGUudW5wYWNrKGNjKSllbmQgZW5kIGVuZCllbHNlaWYodHlwZShfYyk9PSJmdW5jdGlvbiIpdGhlbgpkYy5jb3JvdXRpbmU9Y29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbigpCl9jKHRhYmxlLnVucGFjayhjYykpZW5kKWVsc2UgcmV0dXJuIGVuZDthYltjYl09ZGM7Y2I9Y2IrMTtyZXR1cm4gZGMgZW5kCmZ1bmN0aW9uIGJiOnJlc3VtZShfYywuLi4pbG9jYWwgYWM9dGVybS5jdXJyZW50KCl0ZXJtLnJlZGlyZWN0KHNlbGYud2luZG93KQppZigKc2VsZi5maWx0ZXJ+PW5pbCl0aGVuIGlmKF9jfj1zZWxmLmZpbHRlcil0aGVuIHJldHVybiBlbmQ7c2VsZi5maWx0ZXI9bmlsIGVuZDtsb2NhbCBiYyxjYz1jb3JvdXRpbmUucmVzdW1lKHNlbGYuY29yb3V0aW5lLF9jLC4uLilpZiBiYyB0aGVuCnNlbGYuZmlsdGVyPWNjIGVsc2UgcHJpbnRFcnJvcihjYyllbmQ7dGVybS5yZWRpcmVjdChhYykKcmV0dXJuIGJjLGNjIGVuZApmdW5jdGlvbiBiYjppc0RlYWQoKQppZihzZWxmLmNvcm91dGluZX49bmlsKXRoZW4KaWYKKGNvcm91dGluZS5zdGF0dXMoc2VsZi5jb3JvdXRpbmUpPT0iZGVhZCIpdGhlbiB0YWJsZS5yZW1vdmUoYWIsc2VsZi5wcm9jZXNzSWQpcmV0dXJuIHRydWUgZW5kIGVsc2UgcmV0dXJuIHRydWUgZW5kO3JldHVybiBmYWxzZSBlbmQKZnVuY3Rpb24gYmI6Z2V0U3RhdHVzKClpZihzZWxmLmNvcm91dGluZX49bmlsKXRoZW4KcmV0dXJuIGNvcm91dGluZS5zdGF0dXMoc2VsZi5jb3JvdXRpbmUpZW5kO3JldHVybiBuaWwgZW5kCmZ1bmN0aW9uIGJiOnN0YXJ0KCljb3JvdXRpbmUucmVzdW1lKHNlbGYuY29yb3V0aW5lKWVuZDtyZXR1cm4gYmIgZW5kCmFhWyJsaWJyYXJpZXMiXVsiYmFzYWx0RXZlbnQiXT1mdW5jdGlvbiguLi4pCnJldHVybgpmdW5jdGlvbigpbG9jYWwgYWI9e31sb2NhbCBiYj17fQpsb2NhbCBjYj17cmVnaXN0ZXJFdmVudD1mdW5jdGlvbihkYixfYyxhYylpZihhYltfY109PW5pbCl0aGVuIGFiW19jXT17fQpiYltfY109MSBlbmQ7YWJbX2NdW2JiW19jXV09YWM7YmJbX2NdPWJiW19jXSsxO3JldHVybgpiYltfY10tMSBlbmQscmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZGIsX2MsYWMpYWJbX2NdW2FjW19jXV09Cm5pbCBlbmQsc2VuZEV2ZW50PWZ1bmN0aW9uKGRiLF9jLC4uLilsb2NhbCBhYwppZihhYltfY11+PW5pbCl0aGVuIGZvciBiYyxjYyBpbiBwYWlycyhhYltfY10pZG8KbG9jYWwgZGM9Y2MoLi4uKWlmKGRjPT1mYWxzZSl0aGVuIGFjPWRjIGVuZCBlbmQgZW5kO3JldHVybiBhYyBlbmR9Y2IuX19pbmRleD1jYjtyZXR1cm4gY2IgZW5kIGVuZAphYVsibGlicmFyaWVzIl1bImJpbWciXT1mdW5jdGlvbiguLi4pbG9jYWwgYWIsYmI9c3RyaW5nLnN1YixzdHJpbmcucmVwCmxvY2FsIGZ1bmN0aW9uIGNiKGRiLF9jKWxvY2FsIGFjLGJjPTAsMApsb2NhbCBjYyxkYyxfZD17fSx7fSx7fWxvY2FsIGFkLGJkPTEsMTtsb2NhbCBjZD17fQpsb2NhbCBmdW5jdGlvbiBkZCgpCmZvciB5PTEsYmMgZG8gaWYoY2NbeV09PW5pbCl0aGVuIGNjW3ldPWJiKCIgIixhYyllbHNlIGNjW3ldPWNjW3ldLi4KYmIoIiAiLGFjLSNjY1t5XSllbmQ7aWYKKGRjW3ldPT1uaWwpdGhlbiBkY1t5XT1iYigiMCIsYWMpZWxzZQpkY1t5XT1kY1t5XS4uYmIoIjAiLGFjLSNkY1t5XSllbmQKaWYoX2RbeV09PW5pbCl0aGVuIF9kW3ldPWJiKCJmIixhYyllbHNlIF9kW3ldPQpfZFt5XS4uYmIoImYiLGFjLSNfZFt5XSllbmQgZW5kIGVuZApsb2NhbCBfX2E9ZnVuY3Rpb24oZF9hLF9hYSxhYWEpYWQ9X2FhIG9yIGFkO2JkPWFhYSBvciBiZAppZihjY1tiZF09PW5pbCl0aGVuIGNjW2JkXT1iYigiICIsYWQtMSkuLmRfYS4uCmJiKCIgIixhYy0gKCNkX2ErYWQpKWVsc2UgY2NbYmRdPQphYihjY1tiZF0sMSxhZC0xKS4uCmJiKCIgIixhZC0jY2NbYmRdKS4uZF9hLi5hYihjY1tiZF0sYWQrI2RfYSxhYyllbmQ7aWYoI2NjW2JkXT5hYyl0aGVuIGFjPSNjY1tiZF1lbmQ7aWYoYmQ+YmMpdGhlbiBiYz1iZCBlbmQKX2MudXBkYXRlU2l6ZShhYyxiYyllbmQKbG9jYWwgYV9hPWZ1bmN0aW9uKGRfYSxfYWEsYWFhKWFkPV9hYSBvciBhZDtiZD1hYWEgb3IgYmQKaWYoX2RbYmRdPT1uaWwpdGhlbiBfZFtiZF09YmIoImYiLGFkLTEpLi5kX2EuLgpiYigiZiIsYWMtICgjZF9hK2FkKSllbHNlIF9kW2JkXT0KYWIoX2RbYmRdLDEsYWQtMSkuLgpiYigiZiIsYWQtI19kW2JkXSkuLmRfYS4uYWIoX2RbYmRdLGFkKyNkX2EsYWMpZW5kO2lmKCNfZFtiZF0+YWMpdGhlbiBhYz0jX2RbYmRdZW5kO2lmKGJkPmJjKXRoZW4gYmM9YmQgZW5kCl9jLnVwZGF0ZVNpemUoYWMsYmMpZW5kCmxvY2FsIGJfYT1mdW5jdGlvbihkX2EsX2FhLGFhYSlhZD1fYWEgb3IgYWQ7YmQ9YWFhIG9yIGJkCmlmKGRjW2JkXT09bmlsKXRoZW4gZGNbYmRdPWJiKCIwIixhZC0xKS4uZF9hLi4KYmIoIjAiLGFjLSAoI2RfYSthZCkpZWxzZSBkY1tiZF09CmFiKGRjW2JkXSwxLGFkLTEpLi4KYmIoIjAiLGFkLSNkY1tiZF0pLi5kX2EuLmFiKGRjW2JkXSxhZCsjZF9hLGFjKWVuZDtpZigjZGNbYmRdPmFjKXRoZW4gYWM9I2RjW2JkXWVuZDtpZihiZD5iYyl0aGVuIGJjPWJkIGVuZApfYy51cGRhdGVTaXplKGFjLGJjKWVuZApsb2NhbCBmdW5jdGlvbiBjX2EoZF9hKWNkPXt9Y2MsZGMsX2Q9e30se30se30KZm9yIF9hYSxhYWEgaW4gcGFpcnMoZGIpZG8gaWYodHlwZShfYWEpPT0ic3RyaW5nIil0aGVuIGNkW19hYV09YWFhIGVsc2UKY2NbX2FhXSxkY1tfYWFdLF9kW19hYV09YWFhWzFdLGFhYVsyXSxhYWFbM11lbmQgZW5kO19jLnVwZGF0ZVNpemUoYWMsYmMpZW5kO2lmKGRifj1uaWwpdGhlbiBhYz0jZGJbMV1bMV1iYz0jZGI7Y19hKGRiKWVuZApyZXR1cm4Ke3JlY2FsY3VsYXRlU2l6ZT1kZCxzZXRGcmFtZT1jX2EsZ2V0RnJhbWU9ZnVuY3Rpb24oKWxvY2FsIGRfYT17fQpmb3IgX2FhLGFhYSBpbgpwYWlycyhjYylkbyB0YWJsZS5pbnNlcnQoZF9hLHthYWEsZGNbX2FhXSxfZFtfYWFdfSllbmQ7Zm9yIF9hYSxhYWEgaW4gcGFpcnMoY2QpZG8gZF9hW19hYV09YWFhIGVuZDtyZXR1cm4gZF9hLGFjLGJjIGVuZCxnZXRJbWFnZT1mdW5jdGlvbigpCmxvY2FsIGRfYT17fWZvciBfYWEsYWFhIGluIHBhaXJzKGNjKWRvCnRhYmxlLmluc2VydChkX2Ese2FhYSxkY1tfYWFdLF9kW19hYV19KWVuZDtyZXR1cm4gZF9hIGVuZCxzZXRGcmFtZURhdGE9ZnVuY3Rpb24oZF9hLF9hYSkKaWYoCl9hYX49bmlsKXRoZW4gY2RbZF9hXT1fYWEgZWxzZSBpZih0eXBlKGRfYSk9PSJ0YWJsZSIpdGhlbiBjZD1kX2EgZW5kIGVuZCBlbmQsc2V0RnJhbWVJbWFnZT1mdW5jdGlvbihkX2EpCmZvciBfYWEsYWFhIGluIHBhaXJzKGRfYS50KWRvCmNjW19hYV09ZF9hLnRbX2FhXWRjW19hYV09ZF9hLmZnW19hYV1fZFtfYWFdPWRfYS5iZ1tfYWFdZW5kIGVuZCxnZXRGcmFtZUltYWdlPWZ1bmN0aW9uKCkKcmV0dXJue3Q9Y2MsZmc9ZGMsYmc9X2R9ZW5kLGdldEZyYW1lRGF0YT1mdW5jdGlvbihkX2EpcmV0dXJuKGRfYX49bmlsIGFuZCBjZFtkX2Fdb3IgY2QpZW5kLGJsaXQ9ZnVuY3Rpb24oZF9hLF9hYSxhYWEsYmFhLGNhYSkKX19hKGRfYSxiYWEsY2FhKWJfYShfYWEsYmFhLGNhYSlhX2EoYWFhLGJhYSxjYWEpZW5kLHRleHQ9X19hLGZnPWJfYSxiZz1hX2EsZ2V0U2l6ZT1mdW5jdGlvbigpcmV0dXJuCmFjLGJjIGVuZCxzZXRTaXplPWZ1bmN0aW9uKGRfYSxfYWEpbG9jYWwgYWFhLGJhYSxjYWE9e30se30se30KZm9yIF95PTEsX2FhIGRvCmlmKGNjW195XX49bmlsKXRoZW4gYWFhW195XT1hYihjY1tfeV0sMSxkX2EpLi5iYigiICIsCmRfYS1hYyllbHNlIGFhYVtfeV09YmIoIiAiLGRfYSllbmQ7aWYoZGNbX3ldfj1uaWwpdGhlbgpiYWFbX3ldPWFiKGRjW195XSwxLGRfYSkuLmJiKCIwIixkX2EtYWMpZWxzZSBiYWFbX3ldPWJiKCIwIixkX2EpZW5kO2lmCihfZFtfeV1+PW5pbCl0aGVuIGNhYVtfeV09YWIoX2RbX3ldLDEsZF9hKS4uYmIoImYiLGRfYS1hYyllbHNlCmNhYVtfeV09YmIoImYiLGRfYSllbmQgZW5kO2NjLGRjLF9kPWFhYSxiYWEsY2FhO2FjLGJjPWRfYSxfYWEgZW5kfWVuZApyZXR1cm4KZnVuY3Rpb24oZGIpbG9jYWwgX2M9e30KbG9jYWwgYWM9e2NyZWF0b3I9IkJpbWcgTGlicmFyeSBieSBOeW9yaUUiLGRhdGU9b3MuZGF0ZSgiISVZLSVtLSVkVCVUWiIpfWxvY2FsIGJjLGNjPTAsMDtsb2NhbCBkYz17fQpsb2NhbCBmdW5jdGlvbiBfZChjZCxkZCljZD1jZCBvciNfYysxCnRhYmxlLmluc2VydChfYyxjZCxjYihkZCxkYykpaWYoZGQ9PW5pbCl0aGVuIF9jW2NkXS5zZXRTaXplKGJjLGNjKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWQoY2QpdGFibGUucmVtb3ZlKF9jLGNkIG9yI19jKWVuZApsb2NhbCBmdW5jdGlvbiBiZChjZCxkZCkKbG9jYWwgX19hPV9jW2NkXQppZihfX2F+PW5pbCl0aGVuIGxvY2FsIGFfYT1jZCtkZDtpZihhX2E+PTEpYW5kKGFfYTw9I19jKXRoZW4gdGFibGUucmVtb3ZlKF9jLGNkKQp0YWJsZS5pbnNlcnQoX2MsYV9hLF9fYSllbmQgZW5kIGVuZApkYz17dXBkYXRlU2l6ZT1mdW5jdGlvbihjZCxkZCxfX2EpbG9jYWwgYV9hPV9fYT09dHJ1ZSBhbmQgdHJ1ZSBvciBmYWxzZQppZihjZD5iYyl0aGVuIGFfYT10cnVlO2JjPWNkIGVuZDtpZihkZD5jYyl0aGVuIGFfYT10cnVlO2NjPWRkIGVuZAppZihhX2EpdGhlbiBmb3IgYl9hLGNfYSBpbiBwYWlycyhfYylkbyBjX2Euc2V0U2l6ZShiYyxjYykKY19hLnJlY2FsY3VsYXRlU2l6ZSgpZW5kIGVuZCBlbmQsdGV4dD1mdW5jdGlvbihjZCxkZCxfX2EsYV9hKQpsb2NhbCBiX2E9X2NbY2RdaWYoYl9hPT1uaWwpdGhlbiBiX2E9X2QoY2QpZW5kO2JfYS50ZXh0KGRkLF9fYSxhX2EpZW5kLGZnPWZ1bmN0aW9uKGNkLGRkLF9fYSxhX2EpCmxvY2FsIGJfYT1fY1tjZF1pZihiX2E9PW5pbCl0aGVuIGJfYT1fZChjZCllbmQ7Yl9hLmZnKGRkLF9fYSxhX2EpZW5kLGJnPWZ1bmN0aW9uKGNkLGRkLF9fYSxhX2EpCmxvY2FsIGJfYT1fY1tjZF1pZihiX2E9PW5pbCl0aGVuIGJfYT1fZChjZCllbmQ7Yl9hLmJnKGRkLF9fYSxhX2EpZW5kLGJsaXQ9ZnVuY3Rpb24oY2QsZGQsX19hLGFfYSxiX2EsY19hKQpsb2NhbCBkX2E9X2NbY2RdaWYoZF9hPT1uaWwpdGhlbiBkX2E9X2QoY2QpZW5kO2RfYS5ibGl0KGRkLF9fYSxhX2EsYl9hLGNfYSllbmQsc2V0U2l6ZT1mdW5jdGlvbihjZCxkZCkKYmM9Y2Q7Y2M9ZGQ7Zm9yIF9fYSxhX2EgaW4gcGFpcnMoX2MpZG8gYV9hLnNldFNpemUoY2QsZGQpZW5kIGVuZCxnZXRGcmFtZT1mdW5jdGlvbihjZClpZigKX2NbY2Rdfj1uaWwpdGhlbiByZXR1cm4gX2NbY2RdLmdldEZyYW1lKCllbmQgZW5kLGdldEZyYW1lT2JqZWN0cz1mdW5jdGlvbigpcmV0dXJuCl9jIGVuZCxnZXRGcmFtZXM9ZnVuY3Rpb24oKWxvY2FsIGNkPXt9Zm9yIGRkLF9fYSBpbiBwYWlycyhfYylkbyBsb2NhbCBhX2E9X19hLmdldEZyYW1lKCkKdGFibGUuaW5zZXJ0KGNkLGFfYSllbmQ7cmV0dXJuIGNkIGVuZCxnZXRGcmFtZU9iamVjdD1mdW5jdGlvbihjZClyZXR1cm4KX2NbY2RdZW5kLGFkZEZyYW1lPWZ1bmN0aW9uKGNkKWxvY2FsIGRkPWNiKClpZigjX2M8PTEpdGhlbgppZihhYy5hbmltYXRlZD09bmlsKXRoZW4gYWMuYW5pbWF0ZWQ9dHJ1ZSBlbmQKaWYoYWMuc2Vjb25kc1BlckZyYW1lPT1uaWwpdGhlbiBhYy5zZWNvbmRzUGVyRnJhbWU9MC4yIGVuZCBlbmQ7X2QoY2QpcmV0dXJuIGRkIGVuZCxyZW1vdmVGcmFtZT1mdW5jdGlvbihjZCkKYWQoY2QpCmlmKCNfYzw9MSl0aGVuIGlmKGFjLmFuaW1hdGVkPT1uaWwpdGhlbiBhYy5hbmltYXRlZD10cnVlIGVuZDtpZgooYWMuc2Vjb25kc1BlckZyYW1lPT1uaWwpdGhlbiBhYy5zZWNvbmRzUGVyRnJhbWU9MC4yIGVuZCBlbmQgZW5kLG1vdmVGcmFtZT1iZCxzZXRGcmFtZURhdGE9ZnVuY3Rpb24oY2QsZGQsX19hKQppZigKX2NbY2Rdfj1uaWwpdGhlbiBfY1tjZF0uc2V0RnJhbWVEYXRhKGRkLF9fYSllbmQgZW5kLGdldEZyYW1lRGF0YT1mdW5jdGlvbihjZCxkZClyZXR1cm4gX2NbY2Rdfj1uaWwgYW5kCl9jW2NkXS5nZXRGcmFtZURhdGEoZGQpZW5kLGdldFNpemU9ZnVuY3Rpb24oKXJldHVybgpiYyxjYyBlbmQsc2V0QW5pbWF0aW9uPWZ1bmN0aW9uKGNkKWFjLmFuaW1hdGlvbj1jZCBlbmQsc2V0TWV0YWRhdGE9ZnVuY3Rpb24oY2QsZGQpaWYoZGR+PW5pbCl0aGVuIGFjW2NkXT1kZCBlbHNlIGlmKAp0eXBlKGNkKT09InRhYmxlIil0aGVuIGFjPWNkIGVuZCBlbmQgZW5kLGdldE1ldGFkYXRhPWZ1bmN0aW9uKGNkKXJldHVybgpjZH49bmlsIGFuZCBhY1tjZF1vciBhYyBlbmQsY3JlYXRlQmltZz1mdW5jdGlvbigpCmxvY2FsIGNkPXt9CmZvciBkZCxfX2EgaW4gcGFpcnMoX2MpZG8gbG9jYWwgYV9hPV9fYS5nZXRGcmFtZSgpdGFibGUuaW5zZXJ0KGNkLGFfYSllbmQ7Zm9yIGRkLF9fYSBpbiBwYWlycyhhYylkbyBjZFtkZF09X19hIGVuZDtjZC53aWR0aD1iYztjZC5oZWlnaHQ9Y2M7cmV0dXJuIGNkIGVuZH0KaWYoZGJ+PW5pbCl0aGVuIGZvciBjZCxkZCBpbiBwYWlycyhkYilkbwppZih0eXBlKGNkKT09InN0cmluZyIpdGhlbiBhY1tjZF09ZGQgZWxzZSBfZChjZCxkZCllbmQgZW5kCmlmCihhYy53aWR0aD09bmlsKW9yKGFjLmhlaWdodD09bmlsKXRoZW4gZm9yIGNkLGRkIGluIHBhaXJzKF9jKWRvIGxvY2FsIF9fYSxhX2E9ZGQuZ2V0U2l6ZSgpaWYoX19hPmJjKXRoZW4gX19hPWJjIGVuZAppZihhX2E+Y2MpdGhlbiBhX2E9Y2MgZW5kIGVuZApkYy51cGRhdGVTaXplKGJjLGNjLHRydWUpZW5kIGVsc2UgX2QoMSllbmQ7cmV0dXJuIGRjIGVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJpbWFnZXMiXT1mdW5jdGlvbiguLi4pCmxvY2FsIGFiLGJiLGNiPXN0cmluZy5zdWIsbWF0aC5mbG9vcixzdHJpbmcucmVwCmxvY2FsIGZ1bmN0aW9uIGRiKGJkKWxvY2FsIGNkPXt7fX1sb2NhbCBkZD1mcy5vcGVuKGJkLCJyIikKaWYoZGR+PW5pbCl0aGVuIGZvciBfX2EgaW4gZGQucmVhZExpbmUgZG8KdGFibGUuaW5zZXJ0KGNkWzFdLHtjYigiICIsI19fYSksY2IoIiAiLAojX19hKSxfX2F9KWVuZDtkZC5jbG9zZSgpcmV0dXJuIGNkIGVuZCBlbmQKbG9jYWwgZnVuY3Rpb24gX2MoYmQpcmV0dXJuIHBhaW50dXRpbHMubG9hZEltYWdlKGJkKSwibmZwImVuZApsb2NhbCBmdW5jdGlvbiBhYyhiZClsb2NhbCBjZD1mcy5vcGVuKGJkLCJyYiIpCmxvY2FsIGRkPXRleHR1dGlscy51bnNlcmlhbGl6ZShjZC5yZWFkQWxsKCkpY2QuY2xvc2UoKWlmKGRkfj1uaWwpdGhlbiByZXR1cm4gZGQsImJpbWciZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBiYyhiZCllbmQ7bG9jYWwgZnVuY3Rpb24gY2MoYmQpZW5kO2xvY2FsIGZ1bmN0aW9uIGRjKGJkLGNkKQppZihjZD09bmlsKXRoZW4gaWYoYmQ6ZmluZCgiLmJpbWciKSl0aGVuIHJldHVybiBhYyhiZCllbHNlaWYKKGJkOmZpbmQoIi5iYmYiKSl0aGVuIHJldHVybiBiYyhiZCllbHNlIHJldHVybiBfYyhiZCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBfZChiZCxjZClpZigKY2Q9PW5pbCl0aGVuCmlmKGJkOmZpbmQoIi5iaW1nIikpdGhlbiByZXR1cm4gYWMoYmQpZWxzZWlmKGJkOmZpbmQoIi5iYmYiKSl0aGVuIHJldHVybiBjYyhiZCllbHNlIHJldHVybiBkYihiZCllbmQgZW5kIGVuZApsb2NhbCBmdW5jdGlvbiBhZChiZCxjZCxkZCkKbG9jYWwgX19hLGFfYT1iZC53aWR0aCBvciNiZFsxXVsxXVsxXSxiZC5oZWlnaHQgb3IjYmRbMV1sb2NhbCBiX2E9e30KZm9yIGNfYSxkX2EgaW4gcGFpcnMoYmQpZG8KaWYodHlwZShjX2EpPT0ibnVtYmVyIil0aGVuIGxvY2FsIF9hYT17fQpmb3IgeT0xLGRkIGRvIGxvY2FsIGFhYSxiYWEsY2FhPSIiLCIiLCIiCmxvY2FsIGRhYT1iYih5L2RkKmFfYSswLjUpCmlmKGRfYVtkYWFdfj1uaWwpdGhlbgpmb3IgeD0xLGNkIGRvIGxvY2FsIF9iYT1iYih4L2NkKl9fYSswLjUpYWFhPWFhYS4uCmFiKGRfYVtkYWFdWzFdLF9iYSxfYmEpCmJhYT1iYWEuLmFiKGRfYVtkYWFdWzJdLF9iYSxfYmEpY2FhPWNhYS4uYWIoZF9hW2RhYV1bM10sX2JhLF9iYSllbmQ7dGFibGUuaW5zZXJ0KF9hYSx7YWFhLGJhYSxjYWF9KWVuZCBlbmQ7dGFibGUuaW5zZXJ0KGJfYSxjX2EsX2FhKWVsc2UgYl9hW2NfYV09ZF9hIGVuZCBlbmQ7Yl9hLndpZHRoPWNkO2JfYS5oZWlnaHQ9ZGQ7cmV0dXJuIGJfYSBlbmQKcmV0dXJue2xvYWRORlA9X2MsbG9hZEJJTUc9YWMsbG9hZEltYWdlPWRjLHJlc2l6ZUJJTUc9YWQsbG9hZEltYWdlQXNCaW1nPV9kfWVuZAphYVsibGlicmFyaWVzIl1bIm1vZHVsZSJdPWZ1bmN0aW9uKC4uLilyZXR1cm4gZnVuY3Rpb24oYWIpbG9jYWwgYmIsY2I9cGNhbGwoZGEsYWIpCnJldHVybiBiYiBhbmQgY2Igb3IgbmlsIGVuZCBlbmQKYWFbImxpYnJhcmllcyJdWyJ0SGV4Il09ZnVuY3Rpb24oLi4uKQpyZXR1cm4Ke1tjb2xvcnMud2hpdGVdPSIwIixbY29sb3JzLm9yYW5nZV09IjEiLFtjb2xvcnMubWFnZW50YV09IjIiLFtjb2xvcnMubGlnaHRCbHVlXT0iMyIsW2NvbG9ycy55ZWxsb3ddPSI0IixbY29sb3JzLmxpbWVdPSI1IixbY29sb3JzLnBpbmtdPSI2IixbY29sb3JzLmdyYXldPSI3IixbY29sb3JzLmxpZ2h0R3JheV09IjgiLFtjb2xvcnMuY3lhbl09IjkiLFtjb2xvcnMucHVycGxlXT0iYSIsW2NvbG9ycy5ibHVlXT0iYiIsW2NvbG9ycy5icm93bl09ImMiLFtjb2xvcnMuZ3JlZW5dPSJkIixbY29sb3JzLnJlZF09ImUiLFtjb2xvcnMuYmxhY2tdPSJmIn1lbmQ7cmV0dXJuIGFhWyJtYWluIl0oKQ==";
- ["ktlo.check"] = base64.decode "bG9jYWwgdHlwZSxzZWxlY3QscmF3Z2V0LHRvc3RyaW5nLGVycm9yLGRlYnVnLHRhYmxlPXR5cGUsc2VsZWN0LHJhd2dldCx0b3N0cmluZyxlcnJvcixkZWJ1Zyx0YWJsZTtsb2NhbCBhPWRlYnVnLmdldG1ldGF0YWJsZTtsb2NhbCBiLGM9dGFibGUuY29uY2F0LHRhYmxlLnJlbW92ZTtsb2NhbCBkPXt9bG9jYWwgZnVuY3Rpb24gZShmLGcpaWYgZ349InRhYmxlImFuZCBnfj0idXNlcmRhdGEidGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZyBlbmQ7bG9jYWwgaT1yYXdnZXQoaCwiX19uYW1lIilpZiB0eXBlKGkpPT0ic3RyaW5nInRoZW4gcmV0dXJuIGkgZWxzZSByZXR1cm4gZyBlbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIGooLi4uKWxvY2FsIGs9ey4uLn1mb3IgbD0jaywxLC0xIGRvIGlmIGtbbF09PSJuaWwidGhlbiBjKGssbCllbmQgZW5kO2lmI2s8PTEgdGhlbiByZXR1cm4gdG9zdHJpbmcoLi4uKWVsc2UgcmV0dXJuIGIoaywiLCAiLDEsI2stMSkuLiIgb3IgIi4ua1sja11lbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIG0oZixuLG8paWYgbj09byB0aGVuIHJldHVybiB0cnVlIGVuZDtpZiBufj0idGFibGUiYW5kIG5+PSJ1c2VyZGF0YSJ0aGVuIHJldHVybiBmYWxzZSBlbmQ7bG9jYWwgaD1hKGYpaWYgbm90IGggdGhlbiByZXR1cm4gZmFsc2UgZW5kO2xvY2FsIGk9cmF3Z2V0KGgsIl9fbmFtZSIpaWYgaT09byB0aGVuIHJldHVybiB0cnVlIGVuZDtsb2NhbCBwPWguX19jbGFzc2VzO2lmIG5vdCBwIHRoZW4gcmV0dXJuIGZhbHNlIGVuZDtpZiBwW29ddGhlbiByZXR1cm4gdHJ1ZSBlbmQ7cmV0dXJuIGZhbHNlIGVuZDtmdW5jdGlvbiBkLmV4cGVjdChxLGYsLi4uKWxvY2FsIG49dHlwZShmKWZvciBsPTEsc2VsZWN0KCIjIiwuLi4pZG8gbG9jYWwgbz1zZWxlY3QobCwuLi4paWYgbShmLG4sbyl0aGVuIHJldHVybiBmIGVuZCBlbmQ7bG9jYWwgZz1lKGYsbilsb2NhbCBpO2xvY2FsIHIscz1wY2FsbChkZWJ1Zy5nZXRpbmZvLDMsIm5TIilpZiByIGFuZCBzLm5hbWUgYW5kIHMubmFtZX49IiJhbmQgcy53aGF0fj0iQyJ0aGVuIGk9cy5uYW1lIGVuZDtsb2NhbCB0PWooLi4uKWlmIGkgdGhlbiBlcnJvcigoImJhZCBhcmd1bWVudCAjJWQgdG8gJyVzJyAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSxpLHQsZyksMyllbHNlIGVycm9yKCgiYmFkIGFyZ3VtZW50ICMlZCAoJXMgZXhwZWN0ZWQsIGdvdCAlcykiKTpmb3JtYXQocSx0LGcpLDMpZW5kIGVuZDtyZXR1cm4gZAo=";
- ["ktlo.container"] = base64.decode "bG9jYWwgdGFibGUsbWF0aCxzdHJpbmcsYT10YWJsZSxtYXRoLHN0cmluZyxyZXF1aXJlJ2t0bG8uY2hlY2snbG9jYWwgYixjLGQ9dGFibGUudW5wYWNrLHRhYmxlLmluc2VydCx0YWJsZS5jb25jYXQ7bG9jYWwgZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU9ZXJyb3Isc2V0bWV0YXRhYmxlLHRvc3RyaW5nLHR5cGU7bG9jYWwgZSxmPW1hdGguaHVnZSxtYXRoLmZsb29yO2xvY2FsIGcsaCxpPXN0cmluZy5tYXRjaCxzdHJpbmcuZ3N1YixzdHJpbmcuZm9ybWF0O2xvY2FsIGo9YS5leHBlY3Q7bG9jYWwgaz1jb3JvdXRpbmUucmVzdW1lO2xvY2FsIGw9e31sb2NhbCBtPXt9ZnVuY3Rpb24gbTp1bndyYXAoKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gYihuKWVsc2UgZXJyb3IobiwyKWVuZCBlbmQ7ZnVuY3Rpb24gbTp1bnBhY2soKWooMSxzZWxmLCdyZXN1bHQnKWxvY2FsIG49c2VsZi52YWx1ZTtpZiBzZWxmLnN1Y2Nlc3MgdGhlbiByZXR1cm4gdHJ1ZSxiKG4pZWxzZSByZXR1cm4gZmFsc2UsbiBlbmQgZW5kO2xvY2FsIG89e19faW5kZXg9bSxfX25hbWU9J3Jlc3VsdCd9bG9jYWwgZnVuY3Rpb24gcChxLG4pbG9jYWwgcj17c3VjY2Vzcz1xLHZhbHVlPW59cmV0dXJuIHNldG1ldGF0YWJsZShyLG8pZW5kO2xvY2FsIGZ1bmN0aW9uIHMoLi4uKXJldHVybiBwKHRydWUsey4uLn0pZW5kO2xvY2FsIGZ1bmN0aW9uIHQodSlyZXR1cm4gcChmYWxzZSx1KWVuZDtsb2NhbCBmdW5jdGlvbiB2KHcsLi4uKWlmIHcgdGhlbiByZXR1cm4gcyguLi4pZWxzZSByZXR1cm4gdCguLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiB4KHksLi4uKWooMSx5LCdmdW5jdGlvbicpcmV0dXJuIHYocGNhbGwoeSwuLi4pKWVuZDtsb2NhbCBmdW5jdGlvbiB6KEEsLi4uKWooMSxBLCd0aHJlYWQnKXJldHVybiB2KGsoQSwuLi4pKWVuZDtsLnJlc3VsdD17c3VjY2Vzcz1zLGZhaWx1cmU9dCxjYXRjaGluZz14LHJlc3VtaW5nPXoscGFjaz12fWxvY2FsIGZ1bmN0aW9uIEIobilpZiB0eXBlKG4pfj0nbnVtYmVyJ3RoZW4gcmV0dXJuIG5pbCBlbmQ7aWYgbj09ZSBvciBuPT0tZSBvciBufj1mKG4pdGhlbiByZXR1cm4nZmxvYXQnZW5kO3JldHVybidpbnRlZ2VyJ2VuZDtsb2NhbCBmdW5jdGlvbiBDKEQsbilpZiB0eXBlKG4pPT0nc3RyaW5nJ3RoZW4gbG9jYWwgRT1oKGkoIiVxIixuKSwiXFxcbiIsIlxcbiIpYyhELEUpZWxzZWlmIEIobik9PSdmbG9hdCd0aGVuIGlmIG5+PW4gdGhlbiBjKEQsIjAvMCIpZWxzZWlmIG49PWUgdGhlbiBjKEQsIjEvMCIpZWxzZWlmIG49PS1lIHRoZW4gYyhELCItMS8wIillbHNlIGMoRCx0b3N0cmluZyhuKSllbmQgZWxzZSBjKEQsdG9zdHJpbmcobikpZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBGKHNlbGYpbG9jYWwgRD17InsifWxvY2FsIEc9I3NlbGY7Zm9yIEg9MSxHIGRvIEMoRCxzZWxmW0hdKWMoRCwiLCIpZW5kO2ZvciBJLG4gaW4gcGFpcnMoc2VsZilkbyBpZiBub3QoQihJKT09J2ludGVnZXInYW5kIEk+PTEgYW5kIEk8PUcpdGhlbiBpZiB0eXBlKEkpPT0nc3RyaW5nJ2FuZCBnKEksJ15bXyVhXVtfJXddKiQnKXRoZW4gYyhELEkpZWxzZSBjKEQsIlsiKUMoRCxJKWMoRCwiXSIpZW5kO2MoRCwiPSIpQyhELG4pYyhELCIsIillbmQgZW5kO2lmI0Q9PTEgdGhlbiByZXR1cm4ie30iZW5kO0RbI0RdPSd9J3JldHVybiBkKEQpZW5kO2xvY2FsIGZ1bmN0aW9uIEooSyxMKWxvY2FsIE09e31mb3IgTixPIGluIHBhaXJzKEspZG8gbG9jYWwgUD1MW05daWYgUD09bmlsIG9yIE9+PVAgdGhlbiByZXR1cm4gZmFsc2UgZW5kO01bTl09dHJ1ZSBlbmQ7Zm9yIFEsUiBpbiBwYWlycyhMKWRvIGlmIG5vdCBNW1FddGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQ7bG9jYWwgUz17X190b3N0cmluZz1GLF9fZXE9Sn1sb2NhbCBUO2Z1bmN0aW9uIFQobixVKWooMSxuLCd0YWJsZScpaigyLFUsJ2Jvb2xlYW4nLCduaWwnKWxvY2FsIHI9c2V0bWV0YXRhYmxlKG4sUylpZiBVIHRoZW4gZm9yIFIsViBpbiBwYWlycyhuKWRvIGlmIHR5cGUoVik9PSd0YWJsZSd0aGVuIFQoVix0cnVlKWVuZCBlbmQgZW5kO3JldHVybiByIGVuZDtsLmRhdHVtPVQ7cmV0dXJuIGwK";
- ["ktlo.resources"] = base64.decode "bG9jYWwgYT17fWZ1bmN0aW9uIGEubG9hZChiKWxvY2FsIGM9aW8ub3BlbihiLCdyJylpZiBjIHRoZW4gbG9jYWwgZD1jOnJlYWQoJ2EnKWM6Y2xvc2UoKXJldHVybiBkIGVuZDtyZXR1cm4gYXNzZXJ0KFJFU09VUkNFUyBhbmQgUkVTT1VSQ0VTW2JdLCJyZXNvdXJjZSBcIiIuLmIuLiJcIiBub3QgZm91bmQiKWVuZDtyZXR1cm4gYQo=";
- ["ktlo.concurrent"] = base64.decode "bG9jYWwgb3MsdGFibGUsbWF0aD1vcyx0YWJsZSxtYXRoO2xvY2FsIGEsYixjLGQ9b3MucHVsbEV2ZW50UmF3LG9zLnN0YXJ0VGltZXIsb3MuY2FuY2VsVGltZXIsb3MuZXBvY2g7bG9jYWwgZSxmLGcsaD10YWJsZS51bnBhY2ssdGFibGUucGFjayx0YWJsZS5yZW1vdmUsdGFibGUuaW5zZXJ0O2xvY2FsIGk9bWF0aC5mbG9vcjtsb2NhbCBzZXRtZXRhdGFibGUsc2VsZWN0LGVycm9yLHR5cGUscGFpcnM9c2V0bWV0YXRhYmxlLHNlbGVjdCxlcnJvcix0eXBlLHBhaXJzO2xvY2FsIGo9cmVxdWlyZSdrdGxvLmNoZWNrJ2xvY2FsIGs9ai5leHBlY3Q7bG9jYWwgZnVuY3Rpb24gbChtLG4pZm9yIG89MSwjbSBkbyBpZiBuPT1tW29ddGhlbiByZXR1cm4gbyBlbmQgZW5kO3JldHVybiBuaWwgZW5kO2xvY2FsIHA9e3dhaXRhYmxlPXRydWV9bG9jYWwgcT17fWxvY2FsIGZ1bmN0aW9uIHIocylrKDEscywnd2FpdGFibGUnKWxvY2FsIHQ9cy5zZWxlY3Rvcjtsb2NhbCB1PXt0LmltbWVkaWF0ZShzKX1pZiB1WzFddGhlbiByZXR1cm4gZSh1LDIpZW5kO2xvY2FsIHY9dC5lbnRlcihzKXJlcGVhdCBsb2NhbCB3PXthKCl9bG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIHQubGVhdmUocyx2LGZhbHNlKWVycm9yKCJUZXJtaW5hdGVkIiwwKWVuZCB1bnRpbCB0LmNvbmRpdGlvbihzLHYsdylyZXR1cm4gdC5sZWF2ZShzLHYsdHJ1ZSllbmQ7cS53YWl0PXI7ZnVuY3Rpb24gcS5zZWxlY3QoLi4uKWZvciBvPTEsc2VsZWN0KCcjJywuLi4pZG8gayhvLHNlbGVjdChvLC4uLiksJ3dhaXRhYmxlJyllbmQ7bG9jYWwgeT17Li4ufWxvY2FsIHo9e31sb2NhbCBBPXt9bG9jYWwgQj0jeTtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdT17cy5zZWxlY3Rvci5pbW1lZGlhdGUocyl9aWYgdVsxXXRoZW4gcmV0dXJuIHMsZSh1LDIpZW5kIGVuZDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD1zLnNlbGVjdG9yO3pbb109dDtBW29dPXQuZW50ZXIocyllbmQ7bG9jYWwgQz1uaWw7cmVwZWF0IGxvY2FsIHc9ZihhKCkpbG9jYWwgeD13WzFdaWYgeD09J3Rlcm1pbmF0ZSd0aGVuIGZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb110LmxlYXZlKHMsdixmYWxzZSllbmQ7ZXJyb3IoIlRlcm1pbmF0ZWQiLDApZW5kO2ZvciBvPTEsQiBkbyBsb2NhbCBzPXlbb11sb2NhbCB0PXpbb11sb2NhbCB2PUFbb11pZiB0LmNvbmRpdGlvbihzLHYsdyl0aGVuIEM9bzticmVhayBlbmQgZW5kIHVudGlsIEM7bG9jYWwgRDtmb3Igbz0xLEIgZG8gbG9jYWwgcz15W29dbG9jYWwgdD16W29dbG9jYWwgdj1BW29daWYgbz09QyB0aGVuIEQ9Zih0LmxlYXZlKHMsdix0cnVlKSllbHNlIHQubGVhdmUocyx2LGZhbHNlKWVuZCBlbmQ7cmV0dXJuIHlbQ10sZShEKWVuZDtsb2NhbCBmdW5jdGlvbiBFKClyZXR1cm4gZmFsc2UgZW5kO2xvY2FsIEY9e31sb2NhbCBHPTE7Ri5zZWxlY3Rvcj17aW1tZWRpYXRlPUUsZW50ZXI9ZnVuY3Rpb24oc2VsZilsb2NhbCBIPUc7Rz1HKzE7aChzZWxmLmNvbnN1bWVycyxIKXJldHVybiBIIGVuZCxjb25kaXRpb249ZnVuY3Rpb24oc2VsZixILHcpbG9jYWwgSSxKLEs9dGFibGUudW5wYWNrKHcpcmV0dXJuIEk9PSdub3RpZnlfd2FrZSdhbmQgSj09c2VsZi5pZCBhbmQoSz09SCBvciBub3QgSyllbmQsbGVhdmU9ZnVuY3Rpb24oc2VsZixILEMpaWYgbm90IEMgdGhlbiBsb2NhbCBMPXNlbGYuY29uc3VtZXJzO2xvY2FsIE09bChMLEgpaWYgTSB0aGVuIGcoTCxNKXJldHVybiBmYWxzZSBlbHNlIHJldHVybiB0cnVlIGVuZCBlbmQ7cmV0dXJuIGZhbHNlIGVuZH1mdW5jdGlvbiBGOndhaXQoKWsoMSxzZWxmLCdub3RpZnknKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIEY6d2FrZSgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTD1zZWxmLmNvbnN1bWVycztsb2NhbCBOPWcoTCwxKWlmIE4gdGhlbiBvcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZCxOKXJldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gRjp3YWtlX2FsbCgpaygxLHNlbGYsJ25vdGlmeScpbG9jYWwgTz0jc2VsZi5jb25zdW1lcnM7aWYgTz4wIHRoZW4gc2VsZi5jb25zdW1lcnM9e31vcy5xdWV1ZUV2ZW50KCJub3RpZnlfd2FrZSIsc2VsZi5pZClyZXR1cm4gTyBlbHNlIHJldHVybiAwIGVuZCBlbmQ7bG9jYWwgUD17X19pbmRleD1GLF9fY2xhc3Nlcz1wLF9fbmFtZT0nbm90aWZ5J31sb2NhbCBRPTE7bG9jYWwgZnVuY3Rpb24gUigpbG9jYWwgSj1RO1E9USsxO2xvY2FsIFM9e2lkPUosY291bnQ9MCxjb25zdW1lcnM9e319cmV0dXJuIHNldG1ldGF0YWJsZShTLFApZW5kO3Eubm90aWZ5PVI7bG9jYWwgZnVuY3Rpb24gVChzZWxmKWxvY2FsIFM9c2VsZi5ub3RpZnk7cmV0dXJuIFMuc2VsZWN0b3IuZW50ZXIoUyllbmQ7bG9jYWwgZnVuY3Rpb24gVShzZWxmLFYsdylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmNvbmRpdGlvbihTLFYsdyllbmQ7bG9jYWwgZnVuY3Rpb24gVyhzZWxmLFYsQylsb2NhbCBTPXNlbGYubm90aWZ5O3JldHVybiBTLnNlbGVjdG9yLmxlYXZlKFMsVixDKWVuZDtsb2NhbCBmdW5jdGlvbiBYKHUsWSlyZXR1cm57aW1tZWRpYXRlPXUsZW50ZXI9VCxjb25kaXRpb249VSxsZWF2ZT1mdW5jdGlvbihzZWxmLHYsQylsb2NhbCBaPVcoc2VsZix2LEMpcmV0dXJuIFkoc2VsZixaLEMpZW5kfWVuZDtsb2NhbCBfPXt9ZnVuY3Rpb24gXzp0cnlfbG9jaygpaygxLHNlbGYsJ2xvY2thYmxlJylyZXR1cm4gc2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZillbmQ7ZnVuY3Rpb24gXzpsb2NrKClrKDEsc2VsZiwnbG9ja2FibGUnKXIoc2VsZillbmQ7ZnVuY3Rpb24gXzp1bmxvY2soKWsoMSxzZWxmLCdsb2NrYWJsZScpZXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpZW5kO2Z1bmN0aW9uIF86d2l0aF9sb2NrKGEwLC4uLilrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXIoc2VsZilsb2NhbCBEPXtwY2FsbChhMCwuLi4pfXNlbGY6dW5sb2NrKClpZiBEWzFddGhlbiByZXR1cm4gZShELDIpZWxzZSBlcnJvcihEWzJdLDApZW5kIGVuZDtmdW5jdGlvbiBfOndpdGhfdHJ5X2xvY2soYTAsLi4uKWsoMSxzZWxmLCdsb2NrYWJsZScpaygyLGEwLCdmdW5jdGlvbicpbG9jYWwgYTE9c2VsZi5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZilpZiBhMSB0aGVuIGxvY2FsIEQ9e3BjYWxsKGEwLC4uLil9c2VsZjp1bmxvY2soKWlmIERbMV10aGVuIHJldHVybiB0cnVlLGUoRCwyKWVsc2UgZXJyb3IoRFsyXSwwKWVuZCBlbHNlIHJldHVybiBmYWxzZSBlbmQgZW5kO2Z1bmN0aW9uIF86d3JhcChhMClrKDEsc2VsZiwnbG9ja2FibGUnKWsoMixhMCwnZnVuY3Rpb24nKXJldHVybiBmdW5jdGlvbiguLi4pcmV0dXJuIHNlbGY6d2l0aF9sb2NrKGZ1bmN0aW9uKC4uLilyZXR1cm4gYTAoLi4uKWVuZCwuLi4pZW5kIGVuZDtsb2NhbCBmdW5jdGlvbiBhMihzZWxmLFosQylpZiBaIHRoZW4gc2VsZjp1bmxvY2soKWVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYTModSlyZXR1cm4gWCh1LGEyKWVuZDtsb2NhbCBhND17bG9ja2FibGU9dHJ1ZSx3YWl0YWJsZT10cnVlfWxvY2FsIGE1PXt9c2V0bWV0YXRhYmxlKGE1LHtfX2luZGV4PV99KWxvY2FsIGZ1bmN0aW9uIGE2KHNlbGYpaWYgc2VsZi5sb2NrZWQgdGhlbiByZXR1cm4gZmFsc2UgZWxzZSBzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7YTUuc2VsZWN0b3I9YTMoYTYpZnVuY3Rpb24gYTU6dW5sb2NrKClrKDEsc2VsZiwnbXV0ZXgnKWlmIG5vdCBzZWxmLmxvY2tlZCB0aGVuIGVycm9yKCJtdXRleCBub3QgbG9ja2VkIiwyKWVuZDtpZiBub3Qgc2VsZi5ub3RpZnk6d2FrZSgpdGhlbiBzZWxmLmxvY2tlZD1mYWxzZSBlbmQgZW5kO2xvY2FsIGE3PXtfX2luZGV4PWE1LF9fY2xhc3Nlcz1hNCxfX25hbWU9J211dGV4J31mdW5jdGlvbiBxLm11dGV4KClsb2NhbCBhOD17bG9ja2VkPWZhbHNlLG5vdGlmeT1SKCl9cmV0dXJuIHNldG1ldGF0YWJsZShhOCxhNyllbmQ7bG9jYWwgYTk9e31sb2NhbCBmdW5jdGlvbiBhYShzZWxmKWlmI3NlbGYucXVldWU+MCB0aGVuIHJldHVybiB0cnVlLGcoc2VsZi5xdWV1ZSwxKWVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYWIoc2VsZixaLEMpaWYgWiB0aGVuIHNlbGYubm90aWZ5Ondha2UoKWVuZDtpZiBDIHRoZW4gcmV0dXJuIGcoc2VsZi5xdWV1ZSwxKWVuZCBlbmQ7YTkuc2VsZWN0b3I9WChhYSxhYilmdW5jdGlvbiBhOTpzZW5kKG0paygxLHNlbGYsJ2NoYW5uZWwnKWgoc2VsZi5xdWV1ZSxtKXNlbGYubm90aWZ5Ondha2UoKWVuZDtmdW5jdGlvbiBhOTp0cnlfcmVjdigpaygxLHNlbGYsJ2NoYW5uZWwnKXJldHVybiBhYShzZWxmKWVuZDtmdW5jdGlvbiBhOTpyZWN2KClrKDEsc2VsZiwnY2hhbm5lbCcpcmV0dXJuIHIoc2VsZillbmQ7bG9jYWwgYWM9e19faW5kZXg9YTksX19jbGFzc2VzPXAsX19uYW1lPSdjaGFubmVsJ31mdW5jdGlvbiBxLmNoYW5uZWwoKWxvY2FsIGFkPXtxdWV1ZT17fSxub3RpZnk9UigpfXJldHVybiBzZXRtZXRhdGFibGUoYWQsYWMpZW5kO2xvY2FsIGFlPXt9bG9jYWwgZnVuY3Rpb24gYWYoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YWUuc2VsZWN0b3I9WChFLGFmKWZ1bmN0aW9uIGFlOnNldChuKWsoMSxzZWxmLCdwcm9wZXJ0eScpaWYgc2VsZi52YWx1ZX49biB0aGVuIHNlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kIGVuZDtmdW5jdGlvbiBhZTpjb2xsZWN0KGFnKWsoMSxzZWxmLCdwcm9wZXJ0eScpYWcoc2VsZi52YWx1ZSl3aGlsZSB0cnVlIGRvIGxvY2FsIG49cihzZWxmKWFnKG4pd2hpbGUgc2VsZi52YWx1ZX49biBkbyBuPXNlbGYudmFsdWU7YWcobillbmQgZW5kIGVuZDtmdW5jdGlvbiBhZTp3YWl0X3VudGlsKGFoKWsoMSxzZWxmLCdwcm9wZXJ0eScpbG9jYWwgbj1zZWxmLnZhbHVlO2lmIGFoKG4pdGhlbiByZXR1cm4gbiBlbmQ7d2hpbGUgdHJ1ZSBkbyBuPXIoc2VsZilpZiBhaChuKXRoZW4gcmV0dXJuIG4gZW5kIGVuZCBlbmQ7bG9jYWwgYWk9e19faW5kZXg9YWUsX19jbGFzc2VzPXAsX19uYW1lPSdwcm9wZXJ0eSd9ZnVuY3Rpb24gcS5wcm9wZXJ0eShhailsb2NhbCBhaz17dmFsdWU9YWosbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFrLGFpKWVuZDtsb2NhbCBmdW5jdGlvbiBhbChzZWxmKWlmIHNlbGYubG9ja2VkIHRoZW4gcmV0dXJuIGZhbHNlIGVsc2UgbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBzZWxmLndyaXRlLmxvY2tlZD10cnVlIGVuZDtzZWxmLmNvdW50PU8rMTtyZXR1cm4gdHJ1ZSBlbmQgZW5kO2xvY2FsIGFtPXt9YW0uc2VsZWN0b3I9YTMoYWwpZnVuY3Rpb24gYW06dW5sb2NrKClrKDEsc2VsZiwncmVhZF9tdXRleCcpbG9jYWwgTz1zZWxmLmNvdW50O2lmIE89PTAgdGhlbiBlcnJvcigibXV0ZXggaXMgbm90IGxvY2tlZCIsMillbmQ7c2VsZi5jb3VudD1PLTE7aWYgTz09MSB0aGVuIGxvY2FsIGFuPXNlbGYud3JpdGU7aWYgYW4ubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQgZW5kIGVuZDtzZXRtZXRhdGFibGUoYW0se19faW5kZXg9X30pbG9jYWwgYW89e19faW5kZXg9YW0sX19jbGFzc2VzPWE0LF9fbmFtZT0ncmVhZF9tdXRleCd9bG9jYWwgZnVuY3Rpb24gYXAoc2VsZilpZiBzZWxmLmxvY2tlZCB0aGVuIHJldHVybiBmYWxzZSBlbHNlIGxvY2FsIGFxPXNlbGYucmVhZDthcS5sb2NrZWQ9dHJ1ZTtzZWxmLmxvY2tlZD10cnVlO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgYXI9e31hci5zZWxlY3Rvcj1hMyhhcClmdW5jdGlvbiBhcjp1bmxvY2soKWsoMSxzZWxmLCd3cml0ZV9tdXRleCcpbG9jYWwgYXE9c2VsZi5yZWFkO2xvY2FsIE89YXEuY291bnQ7aWYgbm90IHNlbGYubG9ja2VkIG9yIE8+MCB0aGVuIGVycm9yKCJtdXRleCBpcyBub3QgbG9ja2VkIiwyKWVuZDtpZiBzZWxmLm5vdGlmeTp3YWtlKCl0aGVuIHJldHVybiBlbmQ7YXEubG9ja2VkPWZhbHNlO2xvY2FsIGFzPWFxLm5vdGlmeTp3YWtlX2FsbCgpaWYgYXM+MCB0aGVuIGFxLmNvdW50PWFzO3JldHVybiBlbmQ7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kO2xvY2FsIGF0PXtfX2luZGV4PWFyLF9fY2xhc3Nlcz1hNCxfX25hbWU9J3dyaXRlX211dGV4J31mdW5jdGlvbiBxLnJ3X211dGV4KClsb2NhbCBhcT17Y291bnQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSx3cml0ZT10cnVlfWxvY2FsIGFuPXtsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKSxyZWFkPXRydWV9YXEud3JpdGU9YW47YW4ucmVhZD1hcTtzZXRtZXRhdGFibGUoYXEsYW8pc2V0bWV0YXRhYmxlKGFuLGF0KXJldHVybiBhbixhcSBlbmQ7bG9jYWwgZnVuY3Rpb24gYXUoKXJldHVybiBkKCd1dGMnKS8xMDAwIGVuZDtsb2NhbCBhdj17fWF2LnNlbGVjdG9yPXt9ZnVuY3Rpb24gYXYuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpbG9jYWwgYXc9YXUoKWxvY2FsIGF4PXNlbGYubWlsZXN0b25lO2lmIGF3Pj1heCB0aGVuIHNlbGYubWlsZXN0b25lPWF4K3NlbGYucGVyaW9kO3JldHVybiB0cnVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7ZnVuY3Rpb24gYXYuc2VsZWN0b3IuZW50ZXIoc2VsZilsb2NhbCBheT1zZWxmLm1pbGVzdG9uZS1hdSgpaWYgYXk8MCB0aGVuIGF5PTAgZW5kO3JldHVybiBiKGF5KWVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5jb25kaXRpb24oc2VsZixheix3KXJldHVybiB3WzFdPT0ndGltZXInYW5kIHdbMl09PWF6IGVuZDtmdW5jdGlvbiBhdi5zZWxlY3Rvci5sZWF2ZShzZWxmLGF6LEMpaWYgbm90IEMgdGhlbiBjKGF6KWVsc2Ugc2VsZi5taWxlc3RvbmU9c2VsZi5taWxlc3RvbmUrc2VsZi5wZXJpb2QgZW5kIGVuZDtmdW5jdGlvbiBhdjpzbGVlcCgpaygxLHNlbGYsJ3RpbWVyJylyZXR1cm4gcihzZWxmKWVuZDtmdW5jdGlvbiBhdjpza2lwX21pc3NlZCgpaygxLHNlbGYsJ3RpbWVyJylsb2NhbCBhdz1hdSgpbG9jYWwgYXg9c2VsZi5taWxlc3RvbmU7aWYgYXc8YXggdGhlbiByZXR1cm4gMCBlbmQ7bG9jYWwgYUE9c2VsZi5wZXJpb2Q7bG9jYWwgYUI9aSgoYXctYXgpL2FBKSsxO3NlbGYubWlsZXN0b25lPWF4K2FCKmFBO3JldHVybiBhQiBlbmQ7bG9jYWwgYUM9e19faW5kZXg9YXYsX19jbGFzc2VzPXAsX19uYW1lPSd0aW1lcid9ZnVuY3Rpb24gcS50aW1lcihhQSxhRClrKDEsYUEsJ251bWJlcicpaygyLGFELCdudW1iZXInLCduaWwnKWlmIG5vdCBhRCB0aGVuIGFEPWF1KCkrYUEgZW5kO2xvY2FsIGF6PXttaWxlc3RvbmU9YUQscGVyaW9kPWFBfXJldHVybiBzZXRtZXRhdGFibGUoYXosYUMpZW5kO2xvY2FsIGFFPXt9YUUuc2VsZWN0b3I9e31hRS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhRS5zZWxlY3Rvci5lbnRlcihzZWxmKXJldHVybiBiKHNlbGYuZGVsYXkpZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLGF6LHcpcmV0dXJuIHdbMV09PSd0aW1lcidhbmQgd1syXT09YXogZW5kO2Z1bmN0aW9uIGFFLnNlbGVjdG9yLmxlYXZlKHNlbGYsYXosQylpZiBub3QgQyB0aGVuIGMoYXopZW5kIGVuZDtsb2NhbCBhRj17X19pbmRleD1hRSxfX2NsYXNzZXM9cCxfX25hbWU9J3RpbWVvdXQnfWZ1bmN0aW9uIHEudGltZW91dChhRylrKDEsYUcsJ251bWJlcicpbG9jYWwgYUg9e2RlbGF5PWFHfXJldHVybiBzZXRtZXRhdGFibGUoYUgsYUYpZW5kO2xvY2FsIGFJPXt9YUkuc2VsZWN0b3I9e31hSS5zZWxlY3Rvci5pbW1lZGlhdGU9RTtmdW5jdGlvbiBhSS5zZWxlY3Rvci5lbnRlcigpcmV0dXJue31lbmQ7ZnVuY3Rpb24gYUkuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsdix3KWxvY2FsIGFKPXNlbGYuZmlsdGVyKHcpaWYgYUogdGhlbiBmb3Igbz0xLCN3IGRvIHZbb109d1tvXWVuZCBlbmQ7cmV0dXJuIGFKIGVuZDtmdW5jdGlvbiBhSS5zZWxlY3Rvci5sZWF2ZShzZWxmLHYsQylpZiBDIHRoZW4gcmV0dXJuIHYgZW5kIGVuZDtmdW5jdGlvbiBhSTpsaXN0ZW4oKWsoMSxzZWxmLCdldmVudCcpcmV0dXJuIGUocihzZWxmKSllbmQ7bG9jYWwgYUs9e19faW5kZXg9YUksX19jbGFzc2VzPXAsX19uYW1lPSdldmVudCd9ZnVuY3Rpb24gcS5ldmVudChhTClrKDEsYUwsJ2Z1bmN0aW9uJywnc3RyaW5nJywndGFibGUnKWlmIHR5cGUoYUw9PSdzdHJpbmcnKXRoZW4gbG9jYWwgYU09YUw7YUw9ZnVuY3Rpb24odylyZXR1cm4gd1sxXT09YU0gZW5kIGVsc2VpZiB0eXBlKGFMKT09J3RhYmxlJ3RoZW4gbG9jYWwgYU49YUw7YUw9ZnVuY3Rpb24odylmb3IgYU8sbiBpbiBwYWlycyhhTilkbyBpZiB3W2FPXX49biB0aGVuIHJldHVybiBmYWxzZSBlbmQgZW5kO3JldHVybiB0cnVlIGVuZCBlbmQ7bG9jYWwgdz17ZmlsdGVyPWFMfXJldHVybiBzZXRtZXRhdGFibGUodyxhSyllbmQ7bG9jYWwgYVA9e31sb2NhbCBmdW5jdGlvbiBhUShzZWxmKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtsb2NhbCBPPXNlbGYuY291bnQ7aWYgYVI8TyB0aGVuIGFSPWFSKzE7c2VsZi5hcXVpcmVkPWFSO2lmIGFSPT1PIHRoZW4gc2VsZi5sb2NrZWQ9dHJ1ZSBlbmQ7cmV0dXJuIHRydWUgZWxzZSByZXR1cm4gZmFsc2UgZW5kIGVuZDthUC5zZWxlY3Rvcj1hMyhhUSlmdW5jdGlvbiBhUDp1bmxvY2soKWsoMSxzZWxmLCdzZW1hcGhvcmUnKWxvY2FsIGFSPXNlbGYuYXF1aXJlZDtpZiBhUj09MCB0aGVuIGVycm9yKCJzZW1hcGhvcmUgaXMgbm90IGxvY2tlZCIsMillbmQ7aWYgbm90IHNlbGYubm90aWZ5Ondha2UoKXRoZW4gc2VsZi5hcXVpcmVkPWFSLTE7c2VsZi5sb2NrZWQ9ZmFsc2UgZW5kIGVuZDtzZXRtZXRhdGFibGUoYVAse19faW5kZXg9X30pbG9jYWwgYVM9e19faW5kZXg9YVAsX19jbGFzc2VzPWE0LF9fbmFtZT0nc2VtYXBob3JlJ31mdW5jdGlvbiBxLnNlbWFwaG9yZShPKWsoMSxPLCdudW1iZXInKWxvY2FsIGFUPXtjb3VudD1pKE8pLGFxdWlyZWQ9MCxsb2NrZWQ9ZmFsc2Usbm90aWZ5PVIoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFULGFTKWVuZDtsb2NhbCBhVT17fWxvY2FsIGZ1bmN0aW9uIGFWKHNlbGYpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiByZXR1cm4gdHJ1ZSxzZWxmLnZhbHVlIGVsc2UgcmV0dXJuIGZhbHNlIGVuZCBlbmQ7bG9jYWwgZnVuY3Rpb24gYVcoc2VsZixaLEMpaWYgQyB0aGVuIHJldHVybiBzZWxmLnZhbHVlIGVuZCBlbmQ7YVUuc2VsZWN0b3I9WChhVixhVylmdW5jdGlvbiBhVTpnZXQoKWsoMSxzZWxmLCdmdXR1cmUnKXJldHVybiByKHNlbGYpZW5kO2Z1bmN0aW9uIGFVOmNvbXBsZXRlKG4paygxLHNlbGYsJ2Z1dHVyZScpaWYgc2VsZi5jb21wbGV0ZWQgdGhlbiBlcnJvcigiZnV0dXJlIGlzIGFscmVhZHkgY29tcGxldGVkIiwyKWVuZDtzZWxmLmNvbXBsZXRlZD10cnVlO3NlbGYudmFsdWU9bjtzZWxmLm5vdGlmeTp3YWtlX2FsbCgpZW5kO2xvY2FsIGFYPXtfX2luZGV4PWFVLF9fY2xhc3Nlcz1wLF9fbmFtZT0nZnV0dXJlJ31mdW5jdGlvbiBxLmZ1dHVyZSgpbG9jYWwgYVk9e2NvbXBsZXRlZD1mYWxzZSx2YWx1ZT1mYWxzZSxub3RpZnk9cS5ub3RpZnkoKX1yZXR1cm4gc2V0bWV0YXRhYmxlKGFZLGFYKWVuZDtyZXR1cm4gcQo=";
- ["ktlo.job"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgdGFzayA9IHJlcXVpcmUgJ2t0bG8udGFzaycKCmxvY2FsIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgZW5kaW5nKQogICAgcmV0dXJuIHN0cjpzdWIoLSNlbmRpbmcpID09IGVuZGluZwplbmQKCmxvY2FsIGZ1bmN0aW9uIGlzX3Rlcm1pbmF0ZWQoc3RyKQogICAgcmV0dXJuIGVuZHNXaXRoKHN0ciwgIlRlcm1pbmF0ZWQiKQplbmQKCmxvY2FsIGxpYnJhcnkgPSB7fQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbG9jYWwgam9iX21ldGhvZHMgPSB7fQoKam9iX21ldGhvZHMuc2VsZWN0b3IgPSB7fQoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuaW1tZWRpYXRlKHNlbGYpCiAgICBsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQogICAgcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5pbW1lZGlhdGUoZnV0dXJlKQplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCiAgICBsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQogICAgcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IuY29uZGl0aW9uKHNlbGYsIGNvbnRleHQsIGV2ZW50KQogICAgbG9jYWwgZnV0dXJlID0gc2VsZi5mdXR1cmUKICAgIHJldHVybiBmdXR1cmUuc2VsZWN0b3IuY29uZGl0aW9uKGZ1dHVyZSwgY29udGV4dCwgZXZlbnQpCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHMuc2VsZWN0b3IubGVhdmUoc2VsZiwgY29udGV4dCwgc2VsZWN0ZWQpCiAgICBsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQogICAgcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5sZWF2ZShmdXR1cmUsIGNvbnRleHQsIHNlbGVjdGVkKQplbmQKCmxvY2FsIGpvYl9tZXRhID0gewogICAgX19pbmRleCA9IGpvYl9tZXRob2RzOwogICAgX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKICAgIF9fbmFtZSA9ICd0YXNrJzsKfQoKbG9jYWwgZnVuY3Rpb24gam9iX3Jvb3Qoam9iKQogICAgbG9jYWwgcGFyZW50ID0gam9iLnBhcmVudAogICAgaWYgcGFyZW50IHRoZW4KICAgICAgICByZXR1cm4gam9iX3Jvb3QocGFyZW50KQogICAgZWxzZQogICAgICAgIHJldHVybiBqb2IKICAgIGVuZAplbmQKCmxvY2FsIGpvYl9jaGlsZF9kZWF0aAoKbG9jYWwgZnVuY3Rpb24gam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQogICAgaWYgam9iLnRhc2suc3RhdHVzIH49ICdhbGl2ZScgYW5kIG5vdCBuZXh0KGpvYi5jaGlsZHJlbikgYW5kIG5vdCBqb2IuZnV0dXJlLmNvbXBsZXRlZCB0aGVuCiAgICAgICAgaWYgbm90IGpvYi5yZXN1bHQuY29tcGxldGVkIHRoZW4KICAgICAgICAgICAgam9iLnJlc3VsdDpjb21wbGV0ZShqb2IudGFzay5mdXR1cmU6Z2V0KCkpCiAgICAgICAgZW5kCiAgICAgICAgam9iLmZ1dHVyZTpjb21wbGV0ZShqb2IucmVzdWx0OmdldCgpKQogICAgICAgIGxvY2FsIHN1Y2Nlc3MsIGVyciA9IGpvYi5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkKICAgICAgICBpZiBzdWNjZXNzIHRoZW4KICAgICAgICAgICAgam9iLnN0YXR1cyA9ICdkb25lJwogICAgICAgIGVsc2UKICAgICAgICAgICAgaWYgaXNfdGVybWluYXRlZChlcnIpIHRoZW4KICAgICAgICAgICAgICAgIGpvYi5zdGF0dXMgPSAnY2FuY2VsZWQnCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGpvYi5zdGF0dXMgPSAnYmFkJwogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgICAgICBpZiBqb2IucGFyZW50IHRoZW4KICAgICAgICAgICAgam9iX2NoaWxkX2RlYXRoKGpvYi5wYXJlbnQsIGpvYikKICAgICAgICBlbmQKICAgIGVuZAplbmQKCmpvYl9jaGlsZF9kZWF0aCA9IGZ1bmN0aW9uKGpvYiwgY2hpbGQpCiAgICBpZiBjaGlsZC5zdGF0dXMgPT0gJ2JhZCcgdGhlbgogICAgICAgIGlmIG5vdCBqb2IucmVzdWx0LmNvbXBsZXRlZCB0aGVuCiAgICAgICAgICAgIGpvYi5yZXN1bHQ6Y29tcGxldGUoY2hpbGQuZnV0dXJlOmdldCgpKQogICAgICAgICAgICAtLSBpZ25vcmUgcGFyYWxsZWwgZXJyb3JzIGZvciBub3cKICAgICAgICAgICAgbG9jYWwgcm9vdCA9IGpvYl9yb290KGpvYikKICAgICAgICAgICAgbG9jYWwgdHJhY2VzID0gcm9vdC50cmFjZXMgb3Ige30KICAgICAgICAgICAgdGFibGUuaW5zZXJ0KHRyYWNlcywgY2hpbGQudGFzay50cmFjZWJhY2spCiAgICAgICAgICAgIHJvb3QudHJhY2VzID0gdHJhY2VzCiAgICAgICAgZW5kCiAgICAgICAgam9iOmNhbmNlbCgpCiAgICBlbmQKICAgIGpvYi5jaGlsZHJlbltjaGlsZF0gPSBuaWwKICAgIGpvYl90ZXJtaW5hdGVfY29uZGl0aW9uKGpvYikKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfY3JlYXRlKHBvb2wsIGFjdGlvbikKICAgIGFzc2VydChhY3Rpb24pCiAgICBsb2NhbCBqb2IKICAgIGpvYiA9IHsKICAgICAgICBzdGF0dXMgPSAnd29ya2luZyc7CiAgICAgICAgcmVzdWx0ID0gY29uY3VycmVudC5mdXR1cmUoKTsKICAgICAgICBmdXR1cmUgPSBjb25jdXJyZW50LmZ1dHVyZSgpOwogICAgICAgIGNoaWxkcmVuID0ge307CiAgICAgICAgdGFzayA9IHBvb2w6c3Bhd24oZnVuY3Rpb24oKQogICAgICAgICAgICB0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKICAgICAgICAgICAgcmV0dXJuIGFjdGlvbigpCiAgICAgICAgZW5kKTsKICAgIH0KICAgIHNldG1ldGF0YWJsZShqb2IsIGpvYl9tZXRhKQogICAgcG9vbDpzcGF3bl9pbW1vcnRhbChmdW5jdGlvbigpCiAgICAgICAgam9iLnRhc2s6d2FpdCgpCiAgICAgICAgaWYgam9iLnRhc2suc3RhdHVzID09ICdmYWlsZWQnIHRoZW4KICAgICAgICAgICAgam9iOmNhbmNlbCgpCiAgICAgICAgZW5kCiAgICAgICAgam9iX3Rlcm1pbmF0ZV9jb25kaXRpb24oam9iKQogICAgZW5kKTpzdGFydCgpCiAgICByZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Zm9yayhhY3Rpb24pCiAgICBsb2NhbCBqb2IgPSBqb2JfY3JlYXRlKHNlbGYudGFzay5wb29sLCBhY3Rpb24pCiAgICBqb2IucGFyZW50ID0gc2VsZgogICAgc2VsZi5jaGlsZHJlbltqb2JdID0gdHJ1ZQogICAgcmV0dXJuIGpvYgplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmFzeW5jKGFjdGlvbikKICAgIGxvY2FsIGpvYiA9IHNlbGY6Zm9yayhhY3Rpb24pCiAgICBqb2IudGFzazpzdGFydCgpCiAgICByZXR1cm4gam9iCmVuZAoKZnVuY3Rpb24gam9iX21ldGhvZHM6Y2FuY2VsX2NoaWxkcmVuKCkKICAgIGZvciBjaGlsZCBpbiBwYWlycyhzZWxmLmNoaWxkcmVuKSBkbwogICAgICAgIGNoaWxkOmNhbmNlbCgpCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBqb2JfbWV0aG9kczpjYW5jZWwoKQogICAgc2VsZjpjYW5jZWxfY2hpbGRyZW4oKQogICAgc2VsZi50YXNrOnN0b3AoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gam9iX21ldGhvZHM6YXdhaXQoKQogICAgcmV0dXJuIHNlbGYuZnV0dXJlOmdldCgpOnVud3JhcCgpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBqb2JfbWV0aG9kczphd2FpdF90aW1lb3V0KHRpbWVvdXQpCiAgICBsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnNlbGVjdChzZWxmLCBjb25jdXJyZW50LnRpbWVvdXQodGltZW91dCkpCiAgICBpZiByZXN1bHQgPT0gc2VsZiB0aGVuCiAgICAgICAgcmV0dXJuIHRydWUsIHNlbGY6YXdhaXQoKQogICAgZWxzZQogICAgICAgIHNlbGY6Y2FuY2VsKCkKICAgICAgICByZXR1cm4gZmFsc2UKICAgIGVuZAplbmQKCmZ1bmN0aW9uIGpvYl9tZXRob2RzOmZpbm5hbGl6ZShhY3Rpb24pCiAgICBsb2NhbCB0YXNrID0gc2VsZi50YXNrLnBvb2w6c3Bhd25faW1tb3J0YWwoZnVuY3Rpb24oKQogICAgICAgIGNvbmN1cnJlbnQud2FpdChzZWxmKQogICAgICAgIHJldHVybiBhY3Rpb24oKQogICAgZW5kKQogICAgdGFzazpzdGFydCgpCiAgICByZXR1cm4gdGFzawplbmQKCmZ1bmN0aW9uIGxpYnJhcnkucnVuKGFjdGlvbikKICAgIGxvY2FsIHBvb2wgPSB0YXNrLnBvb2woKQogICAgbG9jYWwgcm9vdCA9IGpvYl9jcmVhdGUocG9vbCwgYWN0aW9uKQogICAgcm9vdC50YXNrOnN0YXJ0KCkKICAgIHBvb2w6cnVuKCkKICAgIHJvb3QuZnV0dXJlOmdldCgpCiAgICBsb2NhbCB0cmFjZXMgPSByb290LnRyYWNlcyBvciB7fQogICAgbG9jYWwgdHJhY2ViYWNrID0gcm9vdC50YXNrLnRyYWNlYmFjawogICAgaWYgdHJhY2ViYWNrIHRoZW4KICAgICAgICB0YWJsZS5pbnNlcnQodHJhY2VzLCB0cmFjZWJhY2spCiAgICBlbmQKICAgIGlmIG5leHQodHJhY2VzKSB0aGVuCiAgICAgICAgbG9jYWwgZmlsZW5hbWUgPSBvcy5kYXRlKCJjcmFzaF8lWS0lbS0lZFQlSDolTTolU1oudHh0IikKICAgICAgICBsb2NhbCBmaWxlID0gaW8ub3BlbihmaWxlbmFtZSwgJ3cnKQogICAgICAgIGlmIGZpbGUgdGhlbgogICAgICAgICAgICBmaWxlOndyaXRlKCJFUlJPUjogIikKICAgICAgICAgICAgZmlsZTp3cml0ZShzZWxlY3QoMiwgcm9vdC5mdXR1cmU6Z2V0KCk6dW5wYWNrKCkpKQogICAgICAgICAgICBmaWxlOndyaXRlKCdcbicpCiAgICAgICAgICAgIGZvciBpPSN0cmFjZXMsIDEsIC0xIGRvCiAgICAgICAgICAgICAgICBsb2NhbCB0cmFjZSA9IHRyYWNlc1tpXQogICAgICAgICAgICAgICAgZmlsZTp3cml0ZSh0cmFjZSkKICAgICAgICAgICAgICAgIGZpbGU6d3JpdGUoJ1xuJykKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGZpbGU6Y2xvc2UoKQogICAgICAgIGVuZAogICAgZW5kCiAgICByZXR1cm4gcm9vdDphd2FpdCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKICAgIHJldHVybiB0YXNrLmNvbnRleHQoKS5KT0IKZW5kCgpsb2NhbCBmdW5jdGlvbiBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKICAgIHJldHVybiBsaWJyYXJ5LnJ1bm5pbmcoKSBvciBlcnJvcigibm8gam9iIGluIGN1cnJlbnQgY29udGV4dCIsIDMpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hc3luYyhhY3Rpb24pCiAgICByZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmFzeW5jKGFjdGlvbikKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmNhbmNlbCgpCiAgICByZXR1cm4gam9iX3JlcXVpcmVfcnVubmluZygpOmNhbmNlbCgpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQogICAgbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KICAgIGZvciBfLCBqb2IgaW4gaXBhaXJzIHsgLi4uIH0gZG8KICAgICAgICBqb2I6Y2FuY2VsKCkKICAgIGVuZAogICAgcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5jcml0aWNhbChhY3Rpb24pCiAgICBsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKICAgIGxvY2FsIHQgPSBqb2IudGFzay5wb29sOnNwYXduX2ltbW9ydGFsKGZ1bmN0aW9uKCkKICAgICAgICB0YXNrLmNvbnRleHQoKS5KT0IgPSBqb2IKICAgICAgICByZXR1cm4gYWN0aW9uKCkKICAgIGVuZCkKICAgIHQ6c3RhcnQoKQogICAgcmV0dXJuIHQ6am9pbigpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5yZXRyeSh0aW1lcywgYWN0aW9uLCAuLi4pCiAgICBsb2NhbCBlcnIKICAgIGZvciBfPTEsIHRpbWVzIGRvCiAgICAgICAgbG9jYWwgciA9IHRhYmxlLnBhY2socGNhbGwoYWN0aW9uLCAuLi4pKQogICAgICAgIGlmIHJbMV0gdGhlbgogICAgICAgICAgICByZXR1cm4gdGFibGUudW5wYWNrKHIsIDIpCiAgICAgICAgZWxzZQogICAgICAgICAgICBlcnIgPSByWzJdCiAgICAgICAgICAgIGlmIGlzX3Rlcm1pbmF0ZWQoZXJyKSB0aGVuCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKICAgIGVuZAogICAgZXJyb3IoZXJyLCAwKQplbmQKCmxpYnJhcnkubGl2ZWRhdGEgPSB7fQoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5zdWJzY3JpYmUocHJvcGVydHksIGFjdGlvbikKICAgIHJldHVybiBsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICBwcm9wZXJ0eTpjb2xsZWN0KGZ1bmN0aW9uKHZhbHVlKQogICAgICAgICAgICBsaWJyYXJ5LmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgIGFjdGlvbih2YWx1ZSkKICAgICAgICAgICAgZW5kKQogICAgICAgIGVuZCkKICAgIGVuZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKQogICAgbG9jYWwgdmFsdWVzID0ge30KICAgIGZvciBpLCBwcm9wZXJ0eSBpbiBpcGFpcnMocHJvcGVydGllcykgZG8KICAgICAgICB2YWx1ZXNbaV0gPSBwcm9wZXJ0eS52YWx1ZQogICAgZW5kCiAgICByZXR1cm4gdGFibGUudW5wYWNrKHZhbHVlcykKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LmxpdmVkYXRhLmNvbWJpbmUoYWN0aW9uLCAuLi4pCiAgICBsb2NhbCBqb2IgPSBqb2JfcmVxdWlyZV9ydW5uaW5nKCkKICAgIGxvY2FsIHByb3BlcnRpZXMgPSB0YWJsZS5wYWNrKC4uLikKICAgIGxvY2FsIGluaXQgPSBhY3Rpb24oZXh0cmFjdF92YWx1ZXMocHJvcGVydGllcykpCiAgICBsb2NhbCByZXN1bHQgPSBjb25jdXJyZW50LnByb3BlcnR5KGluaXQpCiAgICBqb2I6YXN5bmMoZnVuY3Rpb24oKQogICAgICAgIHdoaWxlIHRydWUgZG8KICAgICAgICAgICAgY29uY3VycmVudC5zZWxlY3QodGFibGUudW5wYWNrKHByb3BlcnRpZXMpKQogICAgICAgICAgICByZXN1bHQ6c2V0KGFjdGlvbihleHRyYWN0X3ZhbHVlcyhwcm9wZXJ0aWVzKSkpCiAgICAgICAgZW5kCiAgICBlbmQpCiAgICByZXR1cm4gcmVzdWx0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5saXZlZGF0YS5kZXRlcm1pbmVzKHByb3BlcnR5LCBhY3Rpb24pCiAgICBsb2NhbCBqb2IKICAgIHJldHVybiBsaWJyYXJ5LmxpdmVkYXRhLnN1YnNjcmliZShwcm9wZXJ0eSwgZnVuY3Rpb24odmFsdWUpCiAgICAgICAgaWYgam9iIHRoZW4KICAgICAgICAgICAgam9iOmNhbmNlbCgpCiAgICAgICAgZW5kCiAgICAgICAgaWYgdmFsdWUgdGhlbgogICAgICAgICAgICBqb2IgPSBsaWJyYXJ5LmFzeW5jKGFjdGlvbikKICAgICAgICBlbmQKICAgIGVuZCkKZW5kCgpyZXR1cm4gbGlicmFyeQo=";
- ["ktlo.task"] = base64.decode "bG9jYWwgY29uY3VycmVudCA9IHJlcXVpcmUgJ2t0bG8uY29uY3VycmVudCcKbG9jYWwgY29udGFpbmVyID0gcmVxdWlyZSAna3Rsby5jb250YWluZXInCgpsb2NhbCBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIGVuZGluZykKICAgIHJldHVybiBzdHI6c3ViKC0jZW5kaW5nKSA9PSBlbmRpbmcKZW5kCgpsb2NhbCBxdWV1ZUV2ZW50UmF3ID0gb3MucXVldWVFdmVudFJhdyBvciBvcy5xdWV1ZUV2ZW50Cm9zLnF1ZXVlRXZlbnRSYXcgPSBxdWV1ZUV2ZW50UmF3Cgpsb2NhbCBsaWJyYXJ5ID0ge30KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCB0YXNrX21ldGhvZHMgPSB7fQoKdGFza19tZXRob2RzLnNlbGVjdG9yID0ge30KCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5pbW1lZGlhdGUoc2VsZikKICAgIGxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCiAgICByZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmltbWVkaWF0ZShmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmVudGVyKHNlbGYpCiAgICBsb2NhbCBmdXR1cmUgPSBzZWxmLmZ1dHVyZQogICAgcmV0dXJuIGZ1dHVyZS5zZWxlY3Rvci5lbnRlcihmdXR1cmUpCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzLnNlbGVjdG9yLmNvbmRpdGlvbihzZWxmLCBjb250ZXh0LCBldmVudCkKICAgIGxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCiAgICByZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmNvbmRpdGlvbihmdXR1cmUsIGNvbnRleHQsIGV2ZW50KQplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kcy5zZWxlY3Rvci5sZWF2ZShzZWxmLCBjb250ZXh0LCBzZWxlY3RlZCkKICAgIGxvY2FsIGZ1dHVyZSA9IHNlbGYuZnV0dXJlCiAgICByZXR1cm4gZnV0dXJlLnNlbGVjdG9yLmxlYXZlKGZ1dHVyZSwgY29udGV4dCwgc2VsZWN0ZWQpCmVuZAoKdGFza19tZXRob2RzLndhaXQgPSBjb25jdXJyZW50LndhaXQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpqb2luKCkKICAgIHJldHVybiBzZWxmLmZ1dHVyZTpnZXQoKTp1bndyYXAoKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHRhc2tfY29udGludWUoc2VsZiwgZXZlbnQpCiAgICBpZiBzZWxmLnN0YXR1cyB+PSAnYWxpdmUnIHRoZW4KICAgICAgICByZXR1cm4KICAgIGVuZAogICAgaWYgZXZlbnRbMV0gPT0gJ3Rlcm1pbmF0ZScgYW5kIHNlbGYuaW1tb3J0YWwgdGhlbgogICAgICAgIHJldHVybgogICAgZW5kCiAgICBsb2NhbCB0aHJlYWQgPSBzZWxmLnRocmVhZAogICAgbG9jYWwgcHJldl90YXNrID0gX1RBU0sKICAgIF9HLl9UQVNLID0gc2VsZgogICAgbG9jYWwgcmVzdWx0ID0gY29udGFpbmVyLnJlc3VsdC5yZXN1bWluZyh0aHJlYWQsIHRhYmxlLnVucGFjayhldmVudCkpCiAgICBfRy5fVEFTSyA9IHByZXZfdGFzawogICAgbG9jYWwgb2ssIGVyciA9IHJlc3VsdDp1bnBhY2soKQogICAgaWYgbm90IG9rIHRoZW4KICAgICAgICBzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCiAgICAgICAgaWYgZW5kc1dpdGgoZXJyLCAiVGVybWluYXRlZCIpIHRoZW4KICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnc3RvcGVkJwogICAgICAgIGVsc2UKICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnZmFpbGVkJwogICAgICAgICAgICBzZWxmLnRyYWNlYmFjayA9IGRlYnVnLnRyYWNlYmFjayh0aHJlYWQsIGVycikKICAgICAgICBlbmQKICAgIGVsc2VpZiBjb3JvdXRpbmUuc3RhdHVzKHRocmVhZCkgPT0gJ2RlYWQnIHRoZW4KICAgICAgICBzZWxmLmZ1dHVyZTpjb21wbGV0ZShyZXN1bHQpCiAgICAgICAgc2VsZi5zdGF0dXMgPSAnZGVhZCcKICAgIGVsc2UKICAgICAgICBsb2NhbCBuZXh0X2V2ZW50ID0gZXJyCiAgICAgICAgc2VsZi5ldmVudCA9IG5leHRfZXZlbnQKICAgICAgICBpZiBuZXh0X2V2ZW50ID09ICd3YWtlJyB0aGVuCiAgICAgICAgICAgIHRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7dGFzaz1zZWxmLCBvcmRlcj0nd2FrZSd9KQogICAgICAgIGVuZAogICAgZW5kCmVuZAoKZnVuY3Rpb24gdGFza19tZXRob2RzOnJlc3VtZShldmVudCkKICAgIHNlbGY6c3RhcnQoKQogICAgbG9jYWwgZXZlbnROYW1lID0gZXZlbnRbMV0KICAgIGlmIGV2ZW50TmFtZSA9PSAndGFza19zdG9wJyB0aGVuCiAgICAgICAgaWYgZXZlbnRbMl0gPT0gc2VsZi5pZCB0aGVuCiAgICAgICAgICAgIHRhc2tfY29udGludWUoc2VsZiwgeyAndGVybWluYXRlJyB9KQogICAgICAgIGVuZAogICAgICAgIHJldHVybgogICAgZW5kCiAgICBpZiBldmVudE5hbWUgPT0gJ3Rlcm1pbmF0ZScgb3IgKG5vdCBzZWxmLmV2ZW50KSBvciBzZWxmLmV2ZW50ID09IGV2ZW50TmFtZSB0aGVuCiAgICAgICAgdGFza19jb250aW51ZShzZWxmLCBldmVudCkKICAgIGVuZAplbmQKCmZ1bmN0aW9uIHRhc2tfbWV0aG9kczpzdG9wKCkKICAgIGlmIHNlbGYuc3RhdHVzID09ICdhbGl2ZScgdGhlbgogICAgICAgIHRhYmxlLmluc2VydChzZWxmLnBvb2wub3JkZXJzLCB7IHRhc2s9c2VsZiwgb3JkZXI9J3N0b3AnIH0pCiAgICBlbmQKZW5kCgpmdW5jdGlvbiB0YXNrX21ldGhvZHM6c3RhcnQoKQogICAgaWYgbm90IHNlbGYuc3RhcnRlZCB0aGVuCiAgICAgICAgc2VsZi5zdGFydGVkID0gdHJ1ZQogICAgICAgIHRhc2tfY29udGludWUoc2VsZiwge30pCiAgICBlbmQKZW5kCgpsb2NhbCB0YXNrX21ldGEgPSB7CiAgICBfX2luZGV4ID0gdGFza19tZXRob2RzOwogICAgX19jbGFzc2VzID0geyB3YWl0YWJsZSA9IHRydWUgfTsKICAgIF9fbmFtZSA9ICd0YXNrJzsKfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmxvY2FsIHBvb2xfbWV0aG9kcyA9IHt9Cgpsb2NhbCB0YXNrSWRDb3VudGVyID0gMQoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnNwYXduKGFjdGlvbiwgaW1tb3J0YWwpCiAgICBsb2NhbCB0YXNrID0gewogICAgICAgIGlkID0gdGFza0lkQ291bnRlcjsKICAgICAgICBpbW1vcnRhbCA9IGltbW9ydGFsIG9yIGZhbHNlOwogICAgICAgIHBvb2wgPSBzZWxmOwogICAgICAgIGZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCk7CiAgICAgICAgdGhyZWFkID0gY29yb3V0aW5lLmNyZWF0ZShhY3Rpb24pOwogICAgICAgIGV2ZW50ID0gbmlsOwogICAgICAgIHN0YXR1cyA9ICdhbGl2ZSc7CiAgICAgICAgY29udGV4dCA9IHt9OwogICAgICAgIHN0YXJ0ZWQgPSBmYWxzZTsKICAgIH0KICAgIHRhc2tJZENvdW50ZXIgPSB0YXNrSWRDb3VudGVyICsgMQogICAgc2V0bWV0YXRhYmxlKHRhc2ssIHRhc2tfbWV0YSkKICAgIHRhYmxlLmluc2VydChzZWxmLnRhc2tzLCB0YXNrKQogICAgcmV0dXJuIHRhc2sKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3Bhd25faW1tb3J0YWwoYWN0aW9uKQogICAgcmV0dXJuIHNlbGY6c3Bhd24oYWN0aW9uLCB0cnVlKQplbmQKCmZ1bmN0aW9uIHBvb2xfbWV0aG9kczpyZXN1bWUoZXZlbnQpCiAgICBsb2NhbCBmaWx0ZXJlZCA9IHt9CiAgICBsb2NhbCBwcm9jZXNzID0gc2VsZi50YXNrcwogICAgc2VsZi50YXNrcyA9IGZpbHRlcmVkCiAgICBmb3IgXywgdGFzayBpbiBpcGFpcnMocHJvY2VzcykgZG8KICAgICAgICB0YXNrOnJlc3VtZShldmVudCkKICAgICAgICBpZiB0YXNrLnN0YXR1cyA9PSAnYWxpdmUnIHRoZW4KICAgICAgICAgICAgdGFibGUuaW5zZXJ0KGZpbHRlcmVkLCB0YXNrKQogICAgICAgIGVuZAogICAgZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKICAgIHdoaWxlIG5leHQoc2VsZi5vcmRlcnMpIGRvCiAgICAgICAgbG9jYWwgcXVldWUgPSBzZWxmLm9yZGVycwogICAgICAgIHNlbGYub3JkZXJzID0ge30KICAgICAgICBmb3IgXywgcmVjb3JkIGluIGlwYWlycyhxdWV1ZSkgZG8KICAgICAgICAgICAgbG9jYWwgdGFzayA9IHJlY29yZC50YXNrCiAgICAgICAgICAgIGxvY2FsIG9yZGVyID0gcmVjb3JkLm9yZGVyCiAgICAgICAgICAgIGlmIG9yZGVyID09ICdzdG9wJyB0aGVuCiAgICAgICAgICAgICAgICB0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3Rlcm1pbmF0ZScgfSkKICAgICAgICAgICAgZWxzZWlmIG9yZGVyID09ICd3YWtlJyB0aGVuCiAgICAgICAgICAgICAgICB0YXNrX2NvbnRpbnVlKHRhc2ssIHsgJ3dha2UnIH0pCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnByb2Nlc3NfaW50ZXJuYWxfZXZlbnRzKCkKICAgIGxvY2FsIGV2ZW50cyA9IHNlbGYuZXZlbnRzCiAgICBpZiBuZXh0KGV2ZW50cykgdGhlbgogICAgICAgIHNlbGYuZXZlbnRzID0ge30KICAgICAgICBmb3IgXywgZXZlbnQgaW4gaXBhaXJzKGV2ZW50cykgZG8KICAgICAgICAgICAgc2VsZjpyZXN1bWUoZXZlbnQpCiAgICAgICAgZW5kCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6c3RlcCgpCiAgICBzZWxmOnByb2Nlc3Nfb3JkZXJzX3F1ZXVlKCkKICAgIHNlbGY6cHJvY2Vzc19pbnRlcm5hbF9ldmVudHMoKQogICAgaWYgbmV4dChzZWxmLnRhc2tzKSB0aGVuCiAgICAgICAgaWYgbmV4dChzZWxmLmV2ZW50cykgdGhlbgogICAgICAgICAgICBxdWV1ZUV2ZW50UmF3KCdldmVudF9iYXRjaCcpCiAgICAgICAgZW5kCiAgICAgICAgbG9jYWwgZXZlbnQgPSB7IG9zLnB1bGxFdmVudFJhdygpIH0KICAgICAgICBpZiBldmVudFsxXSB+PSAnZXZlbnRfYmF0Y2gnIHRoZW4KICAgICAgICAgICAgc2VsZjpyZXN1bWUoZXZlbnQpCiAgICAgICAgZW5kCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBwb29sX21ldGhvZHM6cnVuKCkKICAgIHdoaWxlIG5leHQoc2VsZi50YXNrcykgZG8KICAgICAgICBzZWxmOnN0ZXAoKQogICAgZW5kCmVuZAoKZnVuY3Rpb24gcG9vbF9tZXRob2RzOnF1ZXVlX2V2ZW50KGV2ZW50TmFtZSwgLi4uKQogICAgdGFibGUuaW5zZXJ0KHNlbGYuZXZlbnRzLCB7ZXZlbnROYW1lLCAuLi59KQplbmQKCmxvY2FsIHBvb2xfbWV0YSA9IHsKICAgIF9faW5kZXggPSBwb29sX21ldGhvZHM7Cn0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdW5jdGlvbiBsaWJyYXJ5LnBvb2woKQogICAgbG9jYWwgcG9vbCA9IHsKICAgICAgICB0YXNrcyA9IHt9OwogICAgICAgIGV2ZW50cyA9IHt9OwogICAgICAgIG9yZGVycyA9IHt9OwogICAgfQogICAgcmV0dXJuIHNldG1ldGF0YWJsZShwb29sLCBwb29sX21ldGEpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS5ydW5uaW5nKCkKICAgIHJldHVybiBfVEFTSwplbmQKCmZ1bmN0aW9uIGxpYnJhcnkuY29udGV4dCgpCiAgICBsb2NhbCB0YXNrID0gbGlicmFyeS5ydW5uaW5nKCkgb3IgZXJyb3IoImNvbnRleHQoKSBjYWxsZWQgb3V0c2lkZSBhbnkgdGFzayIsIDIpCiAgICByZXR1cm4gdGFzay5jb250ZXh0CmVuZAoKZnVuY3Rpb24gbGlicmFyeS5hbnkoLi4uKQogICAgbG9jYWwgcmVzdWx0ID0geyBjb25jdXJyZW50LnNlbGVjdCguLi4pIH0KICAgIGZvciBfLCB0YXNrIGluIGlwYWlycyB7IC4uLiB9IGRvCiAgICAgICAgdGFzazpzdG9wKCkKICAgIGVuZAogICAgcmV0dXJuIHRhYmxlLnVucGFjayhyZXN1bHQpCmVuZAoKZnVuY3Rpb24gbGlicmFyeS55aWVsZCgpCiAgICBjb3JvdXRpbmUueWllbGQoJ3dha2UnKQplbmQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcy5xdWV1ZUV2ZW50ID0gZnVuY3Rpb24oLi4uKQogICAgbG9jYWwgdGFzayA9IGxpYnJhcnkucnVubmluZygpCiAgICBpZiB0YXNrIHRoZW4KICAgICAgICB0YXNrLnBvb2w6cXVldWVfZXZlbnQoLi4uKQogICAgZWxzZQogICAgICAgIHF1ZXVlRXZlbnRSYXcoLi4uKQogICAgZW5kCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
- ["psg.address"] = base64.decode "bG9jYWwgdGFibGUsbWF0aCxzdHJpbmc9dGFibGUsbWF0aCxzdHJpbmc7bG9jYWwgYSxiPXRhYmxlLmNvbmNhdCx0YWJsZS5wYWNrO2xvY2FsIHR5cGUsdG9udW1iZXIsZXJyb3I9dHlwZSx0b251bWJlcixlcnJvcjtsb2NhbCBjPWRlYnVnLmdldG1ldGF0YWJsZTtsb2NhbCBkLGU9c3RyaW5nLnJlcCxzdHJpbmcubWF0Y2g7bG9jYWwgZj17fWxvY2FsIGc9e19fdG9zdHJpbmc9ZnVuY3Rpb24oc2VsZilyZXR1cm4iLSIuLmEoc2VsZiwiLSIpLi4iLSJlbmQsX19lcT1mdW5jdGlvbihzZWxmLGgpbG9jYWwgaT1jKGgpaWYgaS5fX25hbWV+PSdhZGRyZXNzJ3RoZW4gcmV0dXJuIGZhbHNlIGVuZDtsb2NhbCBqPXNlbGYubjtpZiBqfj1oLm4gdGhlbiByZXR1cm4gZmFsc2UgZW5kO2ZvciBrPTEsaiBkbyBpZiBzZWxmW2tdfj1oW2tddGhlbiByZXR1cm4gZmFsc2UgZW5kIGVuZDtyZXR1cm4gdHJ1ZSBlbmQsX19uYW1lPSdhZGRyZXNzJ31sb2NhbCBmdW5jdGlvbiBsKC4uLilsb2NhbCBtPWIoLi4uKWxvY2FsIG49bS5uO2xvY2FsIG87aWYgbj09NiB0aGVuIG89J2ludGVyc3RlbGxhcidlbHNlaWYgbj09NyB0aGVuIG89J2V4dHJhZ2FsYWN0aWMnZWxzZWlmIG49PTggdGhlbiBvPSdzeXN0ZW13aWRlJ2Vsc2UgZXJyb3IoInVuZXhwZWN0ZWQgc3ltYm9sIGNvdW50IGluIGFkZHJlc3MgKDYsIDcsIG9yIDggc3ltYm9scyBleHBlY3RlZCwgZ290ICIuLm4uLiIpIiwyKWVuZDtsb2NhbCBwPXt9Zm9yIGs9MSwjbSBkbyBsb2NhbCBxPXRvbnVtYmVyKG1ba10paWYgdHlwZShxKX49J251bWJlcid0aGVuIGVycm9yKCJlYWNoIHN5bWJvbCBtdXN0IGJlIGFuIGludGVnZXIgbnVtYmVyIiwyKWVuZDtxPW1hdGguZmxvb3IocSlpZiBxPDEgb3IgcT40NyB0aGVuIGVycm9yKCJzeW1ib2wgIyIuLmsuLiIgaXMgb3V0IG9mIGV4cGVjdGVkIHJhbmdlIFsxOzQ3XTogIi4ucSwyKWVuZDtpZiBwW3FddGhlbiBlcnJvcigic3ltYm9sICciLi5xLi4iJyBhcHBlcmVkIHNldmVyYWwgdGltZXMgaW4gYWRkcmVzcyIsMillbmQ7cFtxXT10cnVlO21ba109cSBlbmQ7bS5raW5kPW87cmV0dXJuIHNldG1ldGF0YWJsZShtLGcpZW5kO2xvY2FsIGZ1bmN0aW9uIHIoailyZXR1cm4iXi0iLi5kKCIoJWQrKS0iLGopLi4iJCJlbmQ7bG9jYWwgcz1yKDYpbG9jYWwgdD1yKDcpbG9jYWwgdT1yKDgpbG9jYWwgZnVuY3Rpb24gdiguLi4paWYuLi50aGVuIHJldHVybiBsKC4uLillbmQgZW5kO2xvY2FsIGZ1bmN0aW9uIHcoeCwuLi4pZm9yIGs9MSxzZWxlY3QoJyMnLC4uLilkbyBsb2NhbCB5PXNlbGVjdChrLC4uLilsb2NhbCBtPXYoZSh4LHkpKWlmIG0gdGhlbiByZXR1cm4gbSBlbmQgZW5kO2Vycm9yKCJub3QgYW4gYWRkcmVzcyBzdHJpbmciLDIpZW5kO2xvY2FsIGZ1bmN0aW9uIHooeClyZXR1cm4gdyh4LHMsdCx1KWVuZDtsb2NhbCBmdW5jdGlvbiBBKHgpaWYgeD09J2ludGVyc3RlbGxhcid0aGVuIHJldHVybiA2IGVsc2VpZiB4PT0nZXh0cmFnYWxhY3RpYyd0aGVuIHJldHVybiA3IGVsc2VpZiB4PT0nc3lzdGVtd2lkZSd0aGVuIHJldHVybiA4IGVsc2UgZXJyb3IoInVua25vd24gYWRkcmVzcyB0eXBlOiAiLi54LDIpZW5kIGVuZDtyZXR1cm57Y3JlYXRlPWwscGFyc2U9eixzaXplb2Y9QX0K";
- ["psg.addressbook"] = base64.decode "bG9jYWwgREVGQVVMVF9MT0NBVElPTiA9ICJmaWxlOmFkZHJlc3Nlcy5jb25mIgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBhZGRyZXNzID0gcmVxdWlyZSAncHNnLmFkZHJlc3MnCgpzZXR0aW5ncy5kZWZpbmUoInBzZy5hZGRyZXNzZXNMb2NhdGlvbiIsIHsKICAgIGRlc2NyaXB0aW9uID0gIlN0YXJnYXRlIGFkZHJlc3NlcyBmaWxlIGxvY2F0aW9uIiwKICAgIGRlZmF1bHQgPSBERUZBVUxUX0xPQ0FUSU9OLAogICAgdHlwZSA9ICJzdHJpbmciLAp9KQoKbG9jYWwgbUxvY2F0aW9uID0gc2V0dGluZ3MuZ2V0KCJwc2cuYWRkcmVzc2VzTG9jYXRpb24iLCBERUZBVUxUX0xPQ0FUSU9OKQoKbG9jYWwgbGlicmFyeSA9IHt9CgpmdW5jdGlvbiBsaWJyYXJ5LmdldF9sb2NhdGlvbigpCiAgICByZXR1cm4gbUxvY2F0aW9uCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmVzb2x2ZV9sb2NhdGlvbl9mcm9tKGxvY2F0aW9uKQogICAgaWYgbG9jYXRpb246c3ViKDEsIDUpID09ICJmaWxlOiIgdGhlbgogICAgICAgIHJldHVybiAnZmlsZScsIGxvY2F0aW9uOnN1Yig2KQogICAgZWxzZWlmIGxvY2F0aW9uOnN1YigxLCA1KSA9PSAiaHR0cDoiIG9yIGxvY2F0aW9uOnN1YigxLCA2KSA9PSAiaHR0cHM6IiB0aGVuCiAgICAgICAgcmV0dXJuICd3ZWInLCBsb2NhdGlvbgogICAgZWxzZQogICAgICAgIGVycm9yKCJ1bnN1cHBvcnRlZCBsb2NhdGlvbjogIi4ubG9jYXRpb24pCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBsaWJyYXJ5LnNldF9sb2NhdGlvbih2YWx1ZSkKICAgIHJlc29sdmVfbG9jYXRpb25fZnJvbSh2YWx1ZSkKICAgIG1Mb2NhdGlvbiA9IHZhbHVlCiAgICBzZXR0aW5ncy5zZXQoInBzZy5hZGRyZXNzZXNMb2NhdGlvbiIsIHZhbHVlKQogICAgc2V0dGluZ3Muc2F2ZSgpCmVuZAoKbG9jYWwgZnVuY3Rpb24gcmVzb2x2ZV9sb2NhdGlvbigpCiAgICByZXR1cm4gcmVzb2x2ZV9sb2NhdGlvbl9mcm9tKG1Mb2NhdGlvbikKZW5kCgpsb2NhbCBmdW5jdGlvbiB0cmFuc2Zvcm1BZGRyZXNzKG9iamVjdCkKICAgIGlmIG9iamVjdCA9PSBuaWwgdGhlbgogICAgICAgIHJldHVybiBuaWwKICAgIGVuZAogICAgaWYgdHlwZShvYmplY3QpID09ICJ0YWJsZSIgdGhlbgogICAgICAgIHJldHVybiBhZGRyZXNzLmNyZWF0ZSh0YWJsZS51bnBhY2sob2JqZWN0KSkKICAgIGVsc2UKICAgICAgICByZXR1cm4gYWRkcmVzcy5wYXJzZShvYmplY3QpCiAgICBlbmQKZW5kCgpsb2NhbCBmdW5jdGlvbiB0cmFuc2Zvcm1BZGRyZXNzYm9vayhhZGRyZXNzZXMpCiAgICBsb2NhbCBpZGVudGl0eSA9IHt9CiAgICBpZiBhZGRyZXNzZXMuaWRlbnRpdHkgdGhlbgogICAgICAgIGZvciBpLCByZWNvcmQgaW4gaXBhaXJzKGFkZHJlc3Nlcy5pZGVudGl0eSkgZG8KICAgICAgICAgICAgaWRlbnRpdHlbaV0gPSB7CiAgICAgICAgICAgICAgICBuYW1lID0gcmVjb3JkLm5hbWU7CiAgICAgICAgICAgICAgICBhZGRyZXNzID0gdHJhbnNmb3JtQWRkcmVzcyhyZWNvcmQuYWRkcmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICBlbmQKICAgIGVuZAogICAgbG9jYWwgcG9zaXRpb24gPSB7fQogICAgaWYgYWRkcmVzc2VzLnBvc2l0aW9uIHRoZW4KICAgICAgICBmb3IgaSwgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzZXMucG9zaXRpb24pIGRvCiAgICAgICAgICAgIGxvY2FsIGludGVyc3RlbGxhciA9IHt9CiAgICAgICAgICAgIGlmIHJlY29yZC5pbnRlcnN0ZWxsYXIgdGhlbgogICAgICAgICAgICAgICAgZm9yIGdhbGF4eSwgYWRkciBpbiBwYWlycyhyZWNvcmQuaW50ZXJzdGVsbGFyKSBkbwogICAgICAgICAgICAgICAgICAgIGludGVyc3RlbGxhcltnYWxheHldID0gdHJhbnNmb3JtQWRkcmVzcyhhZGRyKQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBwb3NpdGlvbltpXSA9IHsKICAgICAgICAgICAgICAgIG5hbWUgPSByZWNvcmQubmFtZTsKICAgICAgICAgICAgICAgIGtleSA9IHJlY29yZC5rZXk7CiAgICAgICAgICAgICAgICBpbnRlcnN0ZWxsYXIgPSBpbnRlcnN0ZWxsYXI7CiAgICAgICAgICAgICAgICBleHRyYWdhbGFjdGljID0gdHJhbnNmb3JtQWRkcmVzcyhyZWNvcmQuZXh0cmFnYWxhY3RpYyk7CiAgICAgICAgICAgIH0KICAgICAgICBlbmQKICAgIGVuZAogICAgcmV0dXJuIHsKICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLAogICAgICAgIGlkZW50aXR5ID0gaWRlbnRpdHksCiAgICB9CmVuZAoKLS0tIEBhc3luYwotLS0gQHJldHVybiBwc2cuYWRkcmVzc2Jvb2s/LCBzdHJpbmc/CmZ1bmN0aW9uIGxpYnJhcnkubG9hZCgpCiAgICBsb2NhbCBraW5kLCBsb2NhdGlvbiA9IHJlc29sdmVfbG9jYXRpb24oKQogICAgbG9jYWwgYWRkcmVzc2VzU3RyaW5nCiAgICBpZiBraW5kID09ICdmaWxlJyB0aGVuCiAgICAgICAgbG9jYWwgZmlsZSA9IGFzc2VydChpby5vcGVuKGxvY2F0aW9uKSkKICAgICAgICBhZGRyZXNzZXNTdHJpbmcgPSBmaWxlOnJlYWQoImEiKQogICAgICAgIGZpbGU6Y2xvc2UoKQogICAgZWxzZWlmIGtpbmQgPT0gJ3dlYicgdGhlbgogICAgICAgIGxvY2FsIGZpbGUgPSBhc3NlcnQoaHR0cC5nZXQobG9jYXRpb24pKQogICAgICAgIGFkZHJlc3Nlc1N0cmluZyA9IGZpbGUucmVhZEFsbCgpCiAgICAgICAgZmlsZS5jbG9zZSgpCiAgICBlbmQKICAgIGxvY2FsIHIsIGVyciA9IHRleHR1dGlscy51bnNlcmlhbGlzZShhZGRyZXNzZXNTdHJpbmcpCiAgICBpZiBub3QgciB0aGVuCiAgICAgICAgbG9jYWwgeiwgZXJyMiA9IHRleHR1dGlscy51bnNlcmlhbGlzZUpTT04oYWRkcmVzc2VzU3RyaW5nKQogICAgICAgIGlmIG5vdCB6IHRoZW4KICAgICAgICAgICAgcmV0dXJuIG5pbCwgZXJyCiAgICAgICAgZW5kCiAgICAgICAgciA9IHoKICAgIGVuZAogICAgcmV0dXJuIHRyYW5zZm9ybUFkZHJlc3Nib29rKHIpCmVuZAoKbG9jYWwgZnVuY3Rpb24gdHJhbnNmb3JtQmFja0FkZHJlc3Nib29rKGFkZHJlc3NlcykKICAgIGxvY2FsIHBvc2l0aW9uCiAgICBpZiBuZXh0KGFkZHJlc3Nlcy5wb3NpdGlvbikgdGhlbgogICAgICAgIHBvc2l0aW9uID0ge30KICAgICAgICBmb3IgaSwgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzZXMucG9zaXRpb24pIGRvCiAgICAgICAgICAgIGxvY2FsIGludGVyc3RlbGxhcgogICAgICAgICAgICBpZiBuZXh0KHJlY29yZC5pbnRlcnN0ZWxsYXIpIHRoZW4KICAgICAgICAgICAgICAgIGludGVyc3RlbGxhciA9IHt9CiAgICAgICAgICAgICAgICBmb3IgZ2FsYXh5LCBhZGRyIGluIHBhaXJzKHJlY29yZC5pbnRlcnN0ZWxsYXIpIGRvCiAgICAgICAgICAgICAgICAgICAgaW50ZXJzdGVsbGFyW2dhbGF4eV0gPSB0b3N0cmluZyhhZGRyKQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBwb3NpdGlvbltpXSA9IHsKICAgICAgICAgICAgICAgIG5hbWUgPSByZWNvcmQubmFtZTsKICAgICAgICAgICAgICAgIGtleSA9IHJlY29yZC5rZXk7CiAgICAgICAgICAgICAgICBpbnRlcnN0ZWxsYXIgPSBpbnRlcnN0ZWxsYXI7CiAgICAgICAgICAgICAgICBleHRyYWdhbGFjdGljID0gcmVjb3JkLmV4dHJhZ2FsYWN0aWMgYW5kIHRvc3RyaW5nKHJlY29yZC5leHRyYWdhbGFjdGljKTsKICAgICAgICAgICAgfQogICAgICAgIGVuZAogICAgZW5kCiAgICBsb2NhbCBpZGVudGl0eQogICAgaWYgbmV4dChhZGRyZXNzZXMuaWRlbnRpdHkpIHRoZW4KICAgICAgICBpZGVudGl0eSA9IHt9CiAgICAgICAgZm9yIGksIHJlY29yZCBpbiBpcGFpcnMoYWRkcmVzc2VzLmlkZW50aXR5KSBkbwogICAgICAgICAgICBpZGVudGl0eVtpXSA9IHsKICAgICAgICAgICAgICAgIG5hbWUgPSByZWNvcmQubmFtZTsKICAgICAgICAgICAgICAgIGFkZHJlc3MgPSByZWNvcmQuYWRkcmVzcyBhbmQgdG9zdHJpbmcocmVjb3JkLmFkZHJlc3MpOwogICAgICAgICAgICB9CiAgICAgICAgZW5kCiAgICBlbmQKICAgIHJldHVybiB7CiAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICBpZGVudGl0eSA9IGlkZW50aXR5OwogICAgfQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5zYXZlKGFkZHJlc3NlcykKICAgIGFkZHJlc3NlcyA9IHRyYW5zZm9ybUJhY2tBZGRyZXNzYm9vayhhZGRyZXNzZXMpCiAgICBsb2NhbCBraW5kLCBsb2NhdGlvbiA9IHJlc29sdmVfbG9jYXRpb24oKQogICAgaWYga2luZCA9PSAnZmlsZScgdGhlbgogICAgICAgIGxvY2FsIGNvbnRlbnQKICAgICAgICBpZiBsb2NhdGlvbjpzdWIoLTUpID09ICIuanNvbiIgdGhlbgogICAgICAgICAgICBjb250ZW50ID0gdGV4dHV0aWxzLnNlcmlhbGlzZUpTT04oYWRkcmVzc2VzKQogICAgICAgIGVsc2UKICAgICAgICAgICAgY29udGVudCA9IHRleHR1dGlscy5zZXJpYWxpc2UoYWRkcmVzc2VzKQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIGZpbGUgPSBhc3NlcnQoaW8ub3Blbihsb2NhdGlvbiwgInciKSkKICAgICAgICBmaWxlOndyaXRlKGNvbnRlbnQpCiAgICAgICAgZmlsZTp3cml0ZSgnXG4nKQogICAgICAgIGZpbGU6Y2xvc2UoKQogICAgICAgIHJldHVybiB0cnVlCiAgICBlbHNlaWYga2luZCA9PSAnd2ViJyB0aGVuCiAgICAgICAgcmV0dXJuIGZhbHNlLCAidW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBzYXZpbmcgdG8gd2ViIGxvY2F0aW9uIgogICAgZW5kCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
- ["psg.modal"] = base64.decode "bG9jYWwgYmFzYWx0ID0gcmVxdWlyZSAnYmFzYWx0Jwpsb2NhbCBjb25jdXJyZW50ID0gcmVxdWlyZSAna3Rsby5jb25jdXJyZW50Jwpsb2NhbCByZXNvdXJjZXMgPSByZXF1aXJlICdrdGxvLnJlc291cmNlcycKbG9jYWwgam9iID0gcmVxdWlyZSAna3Rsby5qb2InCgpsb2NhbCBsaWJyYXJ5ID0ge30KCmxvY2FsIGZyYW1lcyA9IG5pbAoKbG9jYWwgZnVuY3Rpb24gZ2V0X2ZyYW1lcygpCiAgICBpZiBub3QgZnJhbWVzIHRoZW4KICAgICAgICBsb2NhbCByb290ID0gYmFzYWx0LmdldEFjdGl2ZUZyYW1lKCkKICAgICAgICBsb2NhbCBtYWluRnJhbWUgPSByb290OmdldE9iamVjdCgicm9vdCIpIG9yIHJvb3Q6Z2V0T2JqZWN0KCJtYWluIikKICAgICAgICBmcmFtZXMgPSB7CiAgICAgICAgICAgIFttYWluRnJhbWVdID0ge30KICAgICAgICB9CiAgICBlbmQKICAgIHJldHVybiBmcmFtZXMKZW5kCgotLS0gQHBhcmFtIHNldHVwIGZ1bihmcmFtZSwgZnV0dXJlOiBmdXR1cmUpCi0tLSBAcmV0dXJuIGFueQpsb2NhbCBmdW5jdGlvbiBvcGVuX21vZGFsX3dpbmRvdyhzZXR1cCkKICAgIGxvY2FsIHJvb3QgPSBiYXNhbHQuZ2V0QWN0aXZlRnJhbWUoKQogICAgbG9jYWwgd2luZG93cyA9IGdldF9mcmFtZXMoKQogICAgZm9yIGZyYW1lLCBzdGFjayBpbiBwYWlycyh3aW5kb3dzKSBkbwogICAgICAgIHRhYmxlLmluc2VydChzdGFjaywgZnJhbWU6aXNFbmFibGVkKCkpCiAgICAgICAgZnJhbWU6ZGlzYWJsZSgpCiAgICBlbmQKICAgIGxvY2FsIGZ1dHVyZSA9IGNvbmN1cnJlbnQuZnV0dXJlKCkKICAgIGxvY2FsIGZyYW1lID0gcm9vdDphZGRGcmFtZSgpCiAgICB3aW5kb3dzW2ZyYW1lXSA9IHt9CiAgICBmcmFtZTpzZXRNb3ZhYmxlKHRydWUpCiAgICBzZXR1cChmcmFtZSwgZnV0dXJlKQogICAgbG9jYWwgb2ssIHJlc3VsdCA9IHBjYWxsKGZ1dHVyZS5nZXQsIGZ1dHVyZSkKICAgIGZyYW1lOnJlbW92ZSgpCiAgICB3aW5kb3dzW2ZyYW1lXSA9IG5pbAogICAgZm9yIG90aGVyRnJhbWUsIHN0YWNrIGluIHBhaXJzKHdpbmRvd3MpIGRvCiAgICAgICAgbG9jYWwgZW5hYmxlZCA9IHRhYmxlLnJlbW92ZShzdGFjaywgLTEpCiAgICAgICAgLS1pZiBlbmFibGVkIHRoZW4KICAgICAgICAgICAgb3RoZXJGcmFtZTplbmFibGUoKQogICAgICAgIC0tZW5kCiAgICBlbmQKICAgIGlmIG9rIHRoZW4KICAgICAgICByZXR1cm4gcmVzdWx0CiAgICBlbHNlCiAgICAgICAgZXJyb3IocmVzdWx0LCAwKQogICAgZW5kCmVuZAoKbGlicmFyeS5vcGVuID0gb3Blbl9tb2RhbF93aW5kb3cKCmxvY2FsIGZ1bmN0aW9uIHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQpCiAgICBmcmFtZTpzZXRTaXplKHdpZHRoLCBoZWlnaHQpCiAgICBmcmFtZTpzZXRQb3NpdGlvbigiKHBhcmVudC53IC0gc2VsZi53KS8yICsgMSIsICIocGFyZW50LmggLSBzZWxmLmgpLzIiKQogICAgZnJhbWU6YWRkTGF5b3V0RnJvbVN0cmluZyhyZXNvdXJjZXMubG9hZChsYXlvdXQpKQogICAgcmV0dXJuIGZyYW1lOmdldE9iamVjdCgid2luZG93IikKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9mcmFtZShmcmFtZSwgaGVpZ2h0LCBsYXlvdXQpCiAgICBsb2NhbCB3aWR0aCA9IG1hdGgubWluKDMwLCBmcmFtZTpnZXRQYXJlbnQoKTpnZXRTaXplKCkgLSAyKQogICAgcmV0dXJuIHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCB3aWR0aCwgaGVpZ2h0LCBsYXlvdXQpCmVuZAoKLS0tIEBhc3luYwpmdW5jdGlvbiBsaWJyYXJ5LmFsZXJ0KHRleHQsIGFjY2VwdCwgY2FuY2VsKQogICAgaWYgdHlwZSh0ZXh0KSA9PSAndGFibGUnIHRoZW4KICAgICAgICB0ZXh0ID0gdGFibGUuY29uY2F0KHRleHQsICdcbicpCiAgICBlbmQKICAgIHJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQogICAgICAgIGxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCAxMywgImFsZXJ0LnhtbCIpCiAgICAgICAgbG9jYWwgYWNjZXB0QnV0dG9uID0gd2luZG93OmdldE9iamVjdCgiYWNjZXB0IikKICAgICAgICBhY2NlcHRCdXR0b246b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgICAgIGZ1dHVyZTpjb21wbGV0ZSh0cnVlKQogICAgICAgIGVuZCkKICAgICAgICBsb2NhbCBjYW5jZWxCdXR0b24gPSB3aW5kb3c6Z2V0T2JqZWN0KCJjYW5jZWwiKQogICAgICAgIGNhbmNlbEJ1dHRvbjpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICAgICAgZnV0dXJlOmNvbXBsZXRlKGZhbHNlKQogICAgICAgIGVuZCkKICAgICAgICBsb2NhbCBjb250ZW50ID0gd2luZG93OmdldE9iamVjdCgiY29udGVudCIpCiAgICAgICAgY29udGVudDpzZXRUZXh0KHRleHQpCiAgICAgICAgaWYgYWNjZXB0IHRoZW4KICAgICAgICAgICAgYWNjZXB0QnV0dG9uOnNob3coKQogICAgICAgICAgICBhY2NlcHRCdXR0b246c2V0VGV4dChhY2NlcHQpCiAgICAgICAgZWxzZQogICAgICAgICAgICBhY2NlcHRCdXR0b246aGlkZSgpCiAgICAgICAgZW5kCiAgICAgICAgY2FuY2VsQnV0dG9uOnNldFRleHQoY2FuY2VsKQogICAgZW5kKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5tZXNzYWdlKHRpdGxlLCBtZXNzYWdlKQogICAgb3Blbl9tb2RhbF93aW5kb3coZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKICAgICAgICBsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZShmcmFtZSwgMTEsICJtZXNzYWdlLnhtbCIpCiAgICAgICAgd2luZG93OmdldE9iamVjdCgidGl0bGUiKTpzZXRUZXh0KHRpdGxlKQogICAgICAgIHdpbmRvdzpnZXRPYmplY3QoImNvbnRlbnQiKTpzZXRUZXh0KG1lc3NhZ2UpCiAgICAgICAgd2luZG93OmdldE9iamVjdCgiY2xvc2UiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICAgICAgZnV0dXJlOmNvbXBsZXRlKG5pbCkKICAgICAgICBlbmQpCiAgICBlbmQpCmVuZAoKbG9jYWwgZnVuY3Rpb24gc2V0dXBfcGFzc3dkKGZyYW1lLCBmdXR1cmUpCiAgICBsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZShmcmFtZSwgOCwgInBhc3N3ZC54bWwiKQogICAgbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJwYXNzd29yZCIpCiAgICBsb2NhbCBkb25lID0gd2luZG93OmdldE9iamVjdCgiZG9uZSIpCiAgICBsb2NhbCBjYW5jZWwgPSB3aW5kb3c6Z2V0T2JqZWN0KCJjYW5jZWwiKQogICAgZG9uZTpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICBmdXR1cmU6Y29tcGxldGUoaW5wdXQ6Z2V0VmFsdWUoKSkKICAgIGVuZCkKICAgIGNhbmNlbDpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICBmdXR1cmU6Y29tcGxldGUobmlsKQogICAgZW5kKQogICAgaW5wdXQ6c2V0Rm9jdXMoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5wYXNzd2QoKQogICAgcmV0dXJuIG9wZW5fbW9kYWxfd2luZG93KHNldHVwX3Bhc3N3ZCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzZXR1cF9jaHBhc3MoZnJhbWUsIGZ1dHVyZSkKICAgIGxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCAxMiwgImNocGFzcy54bWwiKQogICAgbG9jYWwgbWVzc2FnZSA9IHdpbmRvdzpnZXRPYmplY3QoIm1lc3NhZ2UiKQogICAgbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJwYXNzd29yZCIpCiAgICBsb2NhbCBjb25maXJtRWxlbWVudCA9IHdpbmRvdzpnZXRPYmplY3QoImNvbmZpcm0iKQogICAgbG9jYWwgZG9uZSA9IHdpbmRvdzpnZXRPYmplY3QoImRvbmUiKQogICAgbG9jYWwgY2FuY2VsID0gd2luZG93OmdldE9iamVjdCgiY2FuY2VsIikKICAgIGRvbmU6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgbG9jYWwgcGFzc3dvcmQgPSBpbnB1dDpnZXRWYWx1ZSgpCiAgICAgICAgbG9jYWwgY29uZmlybSA9IGNvbmZpcm1FbGVtZW50OmdldFZhbHVlKCkKICAgICAgICBpZiBwYXNzd29yZCB+PSBjb25maXJtIHRoZW4KICAgICAgICAgICAgbWVzc2FnZTpzZXRUZXh0KCJQYXNzd29yZHMgbm90IGVxdWFsISIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGVuZAogICAgICAgIGZ1dHVyZTpjb21wbGV0ZShwYXNzd29yZCkKICAgIGVuZCkKICAgIGNhbmNlbDpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICBmdXR1cmU6Y29tcGxldGUobmlsKQogICAgZW5kKQogICAgaW5wdXQ6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgbWVzc2FnZTpzZXRUZXh0KCIiKQogICAgZW5kKQogICAgY29uZmlybUVsZW1lbnQ6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgbWVzc2FnZTpzZXRUZXh0KCIiKQogICAgZW5kKQogICAgaW5wdXQ6c2V0Rm9jdXMoKQplbmQKCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5jaHBhc3MoKQogICAgcmV0dXJuIG9wZW5fbW9kYWxfd2luZG93KHNldHVwX2NocGFzcykKZW5kCgotLS0gQHBhcmFtIGluaXQgaW50ZWdlcgotLS0gQHJldHVybiBpbnRlZ2VyCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5udW1iZXIoaW5pdCkKICAgIHJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQogICAgICAgIGxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lX3dpZHRoKGZyYW1lLCAyMywgMTYsICJudW1iZXIueG1sIikKICAgICAgICBsb2NhbCBpbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoImlucHV0IikKICAgICAgICBpbnB1dDpzZXRWYWx1ZSh0b3N0cmluZyhpbml0KSkKICAgICAgICBsb2NhbCBkaWdpdHMgPSB3aW5kb3c6Z2V0T2JqZWN0KCJkaWdpdHMiKQogICAgICAgIGZvciBpPTAsIDkgZG8KICAgICAgICAgICAgbG9jYWwgZGlnaXQgPSBkaWdpdHM6Z2V0T2JqZWN0KCJkIi4uaSkKICAgICAgICAgICAgZGlnaXQ6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgICAgICAgICBpbnB1dDpzZXRWYWx1ZSh0b3N0cmluZyh0b251bWJlcihpbnB1dDpnZXRWYWx1ZSgpLi5pKSkpCiAgICAgICAgICAgICAgICBpbnB1dDpzZXRGb2N1cygpCiAgICAgICAgICAgIGVuZCkKICAgICAgICBlbmQKICAgICAgICBsb2NhbCBjb250cm9sID0gd2luZG93OmdldE9iamVjdCgiY29udHJvbCIpCiAgICAgICAgY29udHJvbDpnZXRPYmplY3QoImVyYXNlIik6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgICAgIGxvY2FsIHZhbHVlID0gdG9zdHJpbmcoaW5wdXQ6Z2V0VmFsdWUoKSkKICAgICAgICAgICAgaWYgI3ZhbHVlIH49IDAgdGhlbgogICAgICAgICAgICAgICAgaW5wdXQ6c2V0VmFsdWUodmFsdWU6c3ViKDEsIC0yKSkKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlucHV0OnNldEZvY3VzKCkKICAgICAgICBlbmQpCiAgICAgICAgY29udHJvbDpnZXRPYmplY3QoImRvbmUiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICAgICAgbG9jYWwgdmFsdWUgPSBpbnB1dDpnZXRWYWx1ZSgpCiAgICAgICAgICAgIGZ1dHVyZTpjb21wbGV0ZSh0b251bWJlcih2YWx1ZSkgb3IgMCkKICAgICAgICBlbmQpCiAgICAgICAgY29udHJvbDpnZXRPYmplY3QoImJhY2siKTpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICAgICAgZnV0dXJlOmNvbXBsZXRlKG5pbCkKICAgICAgICBlbmQpCiAgICAgICAgaW5wdXQ6c2V0Rm9jdXMoKQogICAgZW5kKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNldHVwX2FkZHJlc3MoaW5pdEFkZHJlc3MsIGZyYW1lLCBmdXR1cmUpCiAgICBsb2NhbCB3aW5kb3cgPSBzZXR1cF9mcmFtZV93aWR0aChmcmFtZSwgMjcsIDIwLCAiYWRkcmVzcy54bWwiKQogICAgbG9jYWwgc3ltYm9scyA9IHdpbmRvdzpnZXRPYmplY3QoInN5bWJvbHMiKQogICAgbG9jYWwgaW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJpbnB1dCIpCiAgICBsb2NhbCBjb250cm9sID0gd2luZG93OmdldE9iamVjdCgiY29udHJvbCIpCiAgICBsb2NhbCBkb25lID0gY29udHJvbDpnZXRPYmplY3QoImRvbmUiKQogICAgZG9uZTpkaXNhYmxlKCkKICAgIGxvY2FsIGFkZHJlc3MgPSB7fQogICAgbG9jYWwgZnVuY3Rpb24gdXBkYXRlX2FkZHJlc3MobmV3QWRkcmVzcykKICAgICAgICBhZGRyZXNzID0gbmV3QWRkcmVzcwogICAgICAgIGZvciBpPTEsIDggZG8KICAgICAgICAgICAgbG9jYWwgc3ltYm9sID0gYWRkcmVzc1tpXQogICAgICAgICAgICBsb2NhbCBkaXNwbGF5ID0gc3ltYm9sczpnZXRPYmplY3QoInMiLi5pKQogICAgICAgICAgICBpZiBzeW1ib2wgdGhlbgogICAgICAgICAgICAgICAgZGlzcGxheTpzZXRUZXh0KHN0cmluZy5mb3JtYXQoIiUwMmQiLCBzeW1ib2wpKQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBkaXNwbGF5OnNldFRleHQoIiIpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgICAgIGlmICNhZGRyZXNzID49IDYgdGhlbgogICAgICAgICAgICBkb25lOnNldEJhY2tncm91bmQoY29sb3JzLmdyZWVuKQogICAgICAgICAgICBkb25lOmVuYWJsZSgpCiAgICAgICAgZWxzZQogICAgICAgICAgICBkb25lOnNldEJhY2tncm91bmQoY29sb3JzLmdyYXkpCiAgICAgICAgICAgIGRvbmU6ZGlzYWJsZSgpCiAgICAgICAgZW5kCiAgICBlbmQKICAgIGxvY2FsIGZ1bmN0aW9uIGlucHV0X3N5bWJvbChidXR0b24pCiAgICAgICAgbG9jYWwgc3ltYm9sID0gdG9udW1iZXIoYnV0dG9uOmdldFZhbHVlKCkpCiAgICAgICAgbG9jYWwgbGVuZ3RoID0gI2FkZHJlc3MKICAgICAgICBpZiBsZW5ndGggPCA4IHRoZW4KICAgICAgICAgICAgZm9yIGk9MSwgbGVuZ3RoIGRvCiAgICAgICAgICAgICAgICBpZiBhZGRyZXNzW2ldID09IHN5bWJvbCB0aGVuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGxvY2FsIG5ld0FkZHJlc3MgPSB7IHRhYmxlLnVucGFjayhhZGRyZXNzKSB9CiAgICAgICAgICAgIG5ld0FkZHJlc3NbbGVuZ3RoICsgMV0gPSBzeW1ib2wKICAgICAgICAgICAgdXBkYXRlX2FkZHJlc3MobmV3QWRkcmVzcykKICAgICAgICBlbmQKICAgIGVuZAogICAgZm9yIGk9MSwgNDcgZG8KICAgICAgICBpbnB1dDpnZXRPYmplY3QoInYiLi5pKTpvbkNsaWNrKGlucHV0X3N5bWJvbCkKICAgIGVuZAogICAgaW5wdXQ6Z2V0T2JqZWN0KCJlcmFzZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgIGxvY2FsIGxlbmd0aCA9ICNhZGRyZXNzCiAgICAgICAgaWYgbGVuZ3RoID4gMCB0aGVuCiAgICAgICAgICAgIGxvY2FsIG5ld0FkZHJlc3MgPSB7IHRhYmxlLnVucGFjayhhZGRyZXNzLCAxLCBsZW5ndGggLSAxKSB9CiAgICAgICAgICAgIHVwZGF0ZV9hZGRyZXNzKG5ld0FkZHJlc3MpCiAgICAgICAgZW5kCiAgICBlbmQpCiAgICBkb25lOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgIGZ1dHVyZTpjb21wbGV0ZShhZGRyZXNzKQogICAgZW5kKQogICAgY29udHJvbDpnZXRPYmplY3QoImJhY2siKTpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICBmdXR1cmU6Y29tcGxldGUobmlsKQogICAgZW5kKQogICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICBsb2NhbCBldmVudCA9IGNvbmN1cnJlbnQuZXZlbnQoJ3Bhc3RlJykKICAgICAgICB3aGlsZSB0cnVlIGRvCiAgICAgICAgICAgIGxvY2FsIHN1YmplY3QsIGRhdGEgPSBjb25jdXJyZW50LnNlbGVjdChmdXR1cmUsIGV2ZW50KQogICAgICAgICAgICBpZiBzdWJqZWN0ID09IGZ1dHVyZSB0aGVuCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbmQKICAgICAgICAgICAgbG9jYWwgbmV3QWRkcmVzcyA9IHsgdGFibGUudW5wYWNrKGFkZHJlc3MpIH0KICAgICAgICAgICAgbG9jYWwgc3ltYm9scyA9IHt9CiAgICAgICAgICAgIGZvciBfLCBzeW1ib2wgaW4gaXBhaXJzKG5ld0FkZHJlc3MpIGRvCiAgICAgICAgICAgICAgICBzeW1ib2xzW3N5bWJvbF0gPSB0cnVlCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBmb3IgdmFsdWUgaW4gZGF0YVsyXTpnbWF0Y2goIiVkKyIpIGRvCiAgICAgICAgICAgICAgICBsb2NhbCBzeW1ib2wgPSBhc3NlcnQodG9udW1iZXIodmFsdWUpKQogICAgICAgICAgICAgICAgaWYgc3ltYm9sID4gMCBhbmQgc3ltYm9sIDwgNDggYW5kIG5vdCBzeW1ib2xzW3N5bWJvbF0gdGhlbgogICAgICAgICAgICAgICAgICAgIHN5bWJvbHNbc3ltYm9sXSA9IHRydWUKICAgICAgICAgICAgICAgICAgICB0YWJsZS5pbnNlcnQobmV3QWRkcmVzcywgc3ltYm9sKQogICAgICAgICAgICAgICAgICAgIGlmICNuZXdBZGRyZXNzID49IDggdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICB1cGRhdGVfYWRkcmVzcyhuZXdBZGRyZXNzKQogICAgICAgIGVuZAogICAgZW5kKQogICAgdXBkYXRlX2FkZHJlc3MoaW5pdEFkZHJlc3Mgb3Ige30pCmVuZAoKLS0tIEByZXR1cm4gaW50ZWdlcltdCi0tLSBAYXN5bmMKZnVuY3Rpb24gbGlicmFyeS5hZGRyZXNzKGluaXQpCiAgICByZXR1cm4gb3Blbl9tb2RhbF93aW5kb3coZnVuY3Rpb24gKC4uLikgc2V0dXBfYWRkcmVzcyhpbml0LCAuLi4pIGVuZCkKZW5kCgotLS0gQHBhcmFtIGluaXQ/IHN0cmluZwotLS0gQHJldHVybiBzdHJpbmcKLS0tIEBhc3luYwpmdW5jdGlvbiBsaWJyYXJ5LnRleHQoaW5pdCkKICAgIHJldHVybiBvcGVuX21vZGFsX3dpbmRvdyhmdW5jdGlvbihmcmFtZSwgZnV0dXJlKQogICAgICAgIGxvY2FsIHdpbmRvdyA9IHNldHVwX2ZyYW1lKGZyYW1lLCA4LCAidGV4dC54bWwiKQogICAgICAgIGxvY2FsIGlucHV0ID0gd2luZG93OmdldE9iamVjdCgiaW5wdXQiKQogICAgICAgIGlmIGluaXQgdGhlbgogICAgICAgICAgICBpbnB1dDpzZXRWYWx1ZShpbml0KQogICAgICAgIGVuZAogICAgICAgIGxvY2FsIGNvbnRyb2wgPSB3aW5kb3c6Z2V0T2JqZWN0KCJjb250cm9sIikKICAgICAgICBjb250cm9sOmdldE9iamVjdCgiZG9uZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgICAgICBsb2NhbCB2YWx1ZSA9IGlucHV0OmdldFZhbHVlKCkKICAgICAgICAgICAgZnV0dXJlOmNvbXBsZXRlKHZhbHVlKQogICAgICAgIGVuZCkKICAgICAgICBjb250cm9sOmdldE9iamVjdCgiYmFjayIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgICAgICBmdXR1cmU6Y29tcGxldGUobmlsKQogICAgICAgIGVuZCkKICAgICAgICBpbnB1dDpzZXRGb2N1cygpCiAgICBlbmQpCmVuZAoKcmV0dXJuIGxpYnJhcnkK";
- }
- local function loader(module)
- if module == 'ktlo.base64' then
- return function() return base64 end
- else
- local text = modules[module]
- if not text then
- return nil, "not embedded in program"
- end
- modules[module] = nil
- return load(text, "@[included]/"..module..".lua", 't', _ENV)
- end
- end
- table.insert(package.loaders, loader)
- _G.RESOURCES = {
- ["alert.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJvcmFuZ2UiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBoZWlnaHQ9IjEiIGJnPSJyZWQiIC8+CiAgICA8bGFiZWwgeD0icGFyZW50LncvMi1zZWxmLncvMiIgZmc9IndoaXRlIiB0ZXh0PSJBdHRlbnRpb24hIiAvPgogICAgPGxhYmVsIGlkPSJjb250ZW50IiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAyIiBoZWlnaHQ9InBhcmVudC5oIC0gNyIgZmc9ImJsYWNrIiBiZz0icGluayIgLz4KICAgIDxidXR0b24gaWQ9ImFjY2VwdCIgeD0iMyIgeT0icGFyZW50LmgtMyIgd2lkdGg9IjkiIGJnPSJncmVlbiIgdGV4dD0iIiAvPgogICAgPGJ1dHRvbiBpZD0iY2FuY2VsIiB4PSJwYXJlbnQudyAtIHNlbGYudyAtIDEiIHk9InBhcmVudC5oLTMiIHdpZHRoPSI5IiBiZz0iYmx1ZSIgdGV4dD0iIiAvPgo8L2ZyYW1lPg==";
- ["message.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaW1lIj4KICAgIDxwYW5lIHdpZHRoPSJwYXJlbnQudyIgaGVpZ2h0PSIxIiBiZz0iYmx1ZSIgLz4KICAgIDxsYWJlbCBpZD0idGl0bGUiIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgZmc9IndoaXRlIiB0ZXh0PSIiIC8+CiAgICA8YnV0dG9uIGlkPSJjbG9zZSIgeD0icGFyZW50LnciIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGJnPSJyZWQiIGZnPSJ3aGl0ZSIgdGV4dD0iWCIgLz4KICAgIDxsYWJlbCBpZD0iY29udGVudCIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDQiIGJnPSJ3aGl0ZSIKICAgICAgICBmZz0iYmxhY2siIC8+CjwvZnJhbWU+";
- ["asn.xml"] = base64.decode "PGZyYW1lIGlkPSJyb290Ij4KICAgIDxmcmFtZSBpZD0ibWFpbiI+CiAgICAgICAgPG1lbnViYXIgb25DaGFuZ2U9InNlbGVjdEZyYW1lIiB3aWR0aD0icGFyZW50LnciPgogICAgICAgICAgICA8aXRlbSB0ZXh0PSJFZGl0Ii8+CiAgICAgICAgICAgIDxpdGVtIHRleHQ9IkZpbGUiLz4KICAgICAgICA8L21lbnViYXI+CiAgICAgICAgPGZyYW1lIGlkPSJlZGl0IiB5PSIyIiBoZWlnaHQ9InBhcmVudC5oIC0gMSI+CiAgICAgICAgICAgIDxtZW51YmFyIHg9IjIiIHk9IjIiIG9uQ2hhbmdlPSJzZWxlY3RMaXN0IiB3aWR0aD0icGFyZW50LncgLSAyIj4KICAgICAgICAgICAgICAgIDxpdGVtIHRleHQ9IlBvc2l0aW9uIi8+CiAgICAgICAgICAgICAgICA8aXRlbSB0ZXh0PSJJZGVudGl0eSIvPgogICAgICAgICAgICA8L21lbnViYXI+CiAgICAgICAgICAgIDxsaXN0IGlkPSJwb3NpdGlvbiIgeD0iMiIgeT0iMyIgd2lkdGg9InBhcmVudC53IC0gMyIgaGVpZ2h0PSJwYXJlbnQuaCAtIDgiLz4KICAgICAgICAgICAgPGxpc3QgaWQ9ImlkZW50aXR5IiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAzIiBoZWlnaHQ9InBhcmVudC5oIC0gOCIgdmlzaWJsZT0iZmFsc2UiLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSJwYXJlbnQudyAtIDEiIHk9IjMiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ih4iIG9uQ2xpY2s9InVwIi8+CiAgICAgICAgICAgIDxidXR0b24geD0icGFyZW50LncgLSAxIiB5PSJwYXJlbnQuaCAtIDYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ih8iIG9uQ2xpY2s9ImRvd24iLz4KICAgICAgICAgICAgPHBhbmUgeD0icGFyZW50LncgLSAxIiB5PSI0IiB3aWR0aD0iMSIgaGVpZ2h0PSJwYXJlbnQuaCAtIDEwIiBiZz0iYmxhY2siLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSJwYXJlbnQudy8yIC0gNyIgeT0icGFyZW50LmggLSA1IiB3aWR0aD0iNiIgaGVpZ2h0PSIxIiBiZz0ib3JhbmdlIiB0ZXh0PSIeIHVwIB4iIG9uQ2xpY2s9Im1vdmVVcCIvPgogICAgICAgICAgICA8YnV0dG9uIHg9InBhcmVudC53LzIgKyAyIiB5PSJwYXJlbnQuaCAtIDUiIHdpZHRoPSI2IiBoZWlnaHQ9IjEiIGJnPSJibHVlIiB0ZXh0PSIfZG93bh8iIG9uQ2xpY2s9Im1vdmVEb3duIi8+CiAgICAgICAgICAgIDxidXR0b24geD0iMiIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0icGFyZW50LncvMyAtIDIiIGJnPSJncmVlbiIgdGV4dD0iQWRkIiBvbkNsaWNrPSJhZGRSZWNvcmQiLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSJwYXJlbnQudy8zICsgMSIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0icGFyZW50LncvMyAtIDIiIGJnPSJ5ZWxsb3ciIHRleHQ9IkVkaXQiIG9uQ2xpY2s9ImVkaXRSZWNvcmQiLz4KICAgICAgICAgICAgPGJ1dHRvbiB4PSIyKnBhcmVudC53LzMgKyAxIiB5PSJwYXJlbnQuaCAtIDMiIHdpZHRoPSJwYXJlbnQudy8zIC0gMiIgYmc9InJlZCIgdGV4dD0iRGVsZXRlIiBvbkNsaWNrPSJkZWxldGVSZWNvcmQiLz4KICAgICAgICA8L2ZyYW1lPgogICAgICAgIDxmcmFtZSBpZD0iZmlsZSIgeT0iMiIgaGVpZ2h0PSJwYXJlbnQuaCAtIDEiIHZpc2libGU9ImZhbHNlIj4KICAgICAgICAgICAgPGxhYmVsIHg9IjIiIHk9IjIiIHRleHQ9IkN1cnJlbnQgYWRkcmVzc2Jvb2sgZmlsZSIvPgogICAgICAgICAgICA8aW5wdXQgaWQ9ImZpbGVwYXRoIiB4PSIyIiB5PSIzIiB3aWR0aD0icGFyZW50LncgLSAyIi8+CiAgICAgICAgICAgIDxidXR0b24geD0iMiIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0icGFyZW50LncvMiAtIDIiIGJnPSJsaW1lIiB0ZXh0PSJTYXZlIiBvbkNsaWNrPSJzYXZlQWxsIi8+CiAgICAgICAgICAgIDxsYWJlbCBpZD0idmVyc2lvbiIgeD0iKHBhcmVudC53IC0gc2VsZi53KS8yIiB5PSJwYXJlbnQuaCIgZmc9ImdyYXkiLz4KICAgICAgICA8L2ZyYW1lPgogICAgPC9mcmFtZT4KPC9mcmFtZT4K";
- ["position.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciPgogICAgPGxhYmVsIHg9IjIiIHk9IjIiIHRleHQ9Ik5hbWUiLz4KICAgIDxpbnB1dCBpZD0ibmFtZSIgeD0iOCIgeT0iMiIgd2lkdGg9InBhcmVudC53IC0gOCIvPgogICAgPGxhYmVsIHg9IjIiIHk9IjQiIHRleHQ9IlNvbGFyIHN5c3RlbSBrZXkiLz4KICAgIDxpbnB1dCBpZD0ia2V5IiB4PSIyIiB5PSI1IiB3aWR0aD0icGFyZW50LncgLSAyIi8+CiAgICA8bGFiZWwgeD0iMiIgeT0iNyIgdGV4dD0iRXh0cmFnYWxhY3RpYyBhZGRyZXNzIi8+CiAgICA8aW5wdXQgaWQ9ImV4dHJhZ2FsYWN0aWMiIHg9IjIiIHk9IjgiIHdpZHRoPSJwYXJlbnQudyAtIDIiLz4KICAgIDxsYWJlbCB4PSIyIiB5PSIxMCIgdGV4dD0iSW50ZXJzdGVsbGFyIGFkZHJlc3NlcyIvPgogICAgPGxpc3QgaWQ9Imxpc3QiIHg9IjIiIHk9IjExIiBoZWlnaHQ9InBhcmVudC5oIC0gMTYiIHdpZHRoPSJwYXJlbnQudyAtIDMiLz4KICAgIDxidXR0b24geD0icGFyZW50LncgLSAxIiB5PSIxMSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgdGV4dD0iHiIgb25DbGljaz0ic2Nyb2xsVXAiLz4KICAgIDxidXR0b24geD0icGFyZW50LncgLSAxIiB5PSJwYXJlbnQuaCAtIDYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHRleHQ9Ih8iIG9uQ2xpY2s9InNjcm9sbERvd24iLz4KICAgIDxwYW5lIHg9InBhcmVudC53IC0gMSIgeT0iMTIiIHdpZHRoPSIxIiBoZWlnaHQ9InBhcmVudC5oIC0gMTgiIGJnPSJibGFjayIvPgogICAgPGJ1dHRvbiBpZD0iYWRkIiB4PSIyIiB5PSJwYXJlbnQuaCAtIDUiIHdpZHRoPSJwYXJlbnQudy8zIC0gMiIgaGVpZ2h0PSIxIiBiZz0iZ3JlZW4iIHRleHQ9ImFkZCIvPgogICAgPGJ1dHRvbiBpZD0iZWRpdCIgeD0icGFyZW50LncvMyArIDEiIHk9InBhcmVudC5oIC0gNSIgd2lkdGg9InBhcmVudC53LzMgLSAyIiBoZWlnaHQ9IjEiIGJnPSJ5ZWxsb3ciIHRleHQ9ImVkaXQiLz4KICAgIDxidXR0b24gaWQ9ImRlbGV0ZSIgeD0iMipwYXJlbnQudy8zICsgMSIgeT0icGFyZW50LmggLSA1IiB3aWR0aD0icGFyZW50LncvMyAtIDIiIGhlaWdodD0iMSIgYmc9InJlZCIgdGV4dD0iZGVsZXRlIi8+CiAgICA8YnV0dG9uIGlkPSJzdWJtaXQiIHg9IjIiIHk9InBhcmVudC5oIC0gMyIgd2lkdGg9InBhcmVudC53LzIgLSAyIiBiZz0ibGltZSIgdGV4dD0iU3VibWl0Ii8+CiAgICA8YnV0dG9uIGlkPSJjYW5jZWwiIHg9InBhcmVudC53LzIgKyAxIiB5PSJwYXJlbnQuaCAtIDMiIHdpZHRoPSJwYXJlbnQudy8yIC0gMiIgYmc9InBpbmsiIHRleHQ9IkNhbmNlbCIvPgo8L2ZyYW1lPgo=";
- ["record.xml"] = base64.decode "PGZyYW1lIGlkPSJ3aW5kb3ciIGJnPSJsaWdodEJsdWUiPgogICAgPHBhbmUgd2lkdGg9InBhcmVudC53IiBiZz0iYmx1ZSIvPgogICAgPGxhYmVsIHg9IihwYXJlbnQudyAtIHNlbGYudykvMiIgZmc9IndoaXRlIiB0ZXh0PSJBZGRyZXNzIEZvcm0iLz4KICAgIDxsYWJlbCB4PSIyIiB5PSIzIiB0ZXh0PSJOYW1lIi8+CiAgICA8aW5wdXQgaWQ9Im5hbWUiIHg9IjIiIHk9IjQiIGJnPSJjeWFuIiB3aWR0aD0icGFyZW50LncgLSAyIi8+CiAgICA8bGFiZWwgeD0iMiIgeT0iNiIgdGV4dD0iQWRkcmVzcyIvPgogICAgPGlucHV0IGlkPSJhZGRyZXNzIiB4PSIyIiB5PSI3IiBiZz0iY3lhbiIgd2lkdGg9InBhcmVudC53IC0gMiIvPgogICAgPGJ1dHRvbiBpZD0ic3VibWl0IiB4PSIyIiB5PSJwYXJlbnQuaCAtIDMiIHdpZHRoPSJwYXJlbnQudy8yIC0gMiIgYmc9ImxpbWUiIHRleHQ9IlN1Ym1pdCIvPgogICAgPGJ1dHRvbiBpZD0iY2FuY2VsIiB4PSJwYXJlbnQudy8yICsgMSIgeT0icGFyZW50LmggLSAzIiB3aWR0aD0icGFyZW50LncvMiAtIDIiIGJnPSJwaW5rIiB0ZXh0PSJDYW5jZWwiLz4KPC9mcmFtZT4K";
- }
- local entrypoint = "bG9jYWwgdGhlbWUgPSB7CiAgICBGcmFtZUJHID0gY29sb3JzLmxpZ2h0R3JheSwKICAgIEZyYW1lRkcgPSBjb2xvcnMuYmxhY2ssCiAgICBTZWxlY3Rpb25UZXh0ID0gY29sb3JzLndoaXRlLAogICAgSW5wdXRUZXh0ID0gY29sb3JzLndoaXRlLAp9CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpsb2NhbCBiYXNhbHQgPSByZXF1aXJlICdiYXNhbHQnCmxvY2FsIGFkZHJlc3MgPSByZXF1aXJlICdwc2cuYWRkcmVzcycKbG9jYWwgcmVzb3VyY2VzID0gcmVxdWlyZSAna3Rsby5yZXNvdXJjZXMnCmxvY2FsIGNvbmN1cnJlbnQgPSByZXF1aXJlICdrdGxvLmNvbmN1cnJlbnQnCmxvY2FsIGpvYiA9IHJlcXVpcmUgJ2t0bG8uam9iJwpsb2NhbCBtb2RhbCA9IHJlcXVpcmUgJ3BzZy5tb2RhbCcKbG9jYWwgYWRkcmVzc2Jvb2sgPSByZXF1aXJlICdwc2cuYWRkcmVzc2Jvb2snCgpsb2NhbCB2ZXJzaW9uID0gVkVSU0lPTiBvciAiZGV2IgoKbG9jYWwgZnVuY3Rpb24gZG9tKHBhdGgpCiAgICBsb2NhbCBjdXJyZW50ID0gYmFzYWx0LmdldEFjdGl2ZUZyYW1lKCkKICAgIGZvciBfLCBzZWdtZW50IGluIGlwYWlycyhwYXRoKSBkbwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50OmdldE9iamVjdChzZWdtZW50KQogICAgZW5kCiAgICByZXR1cm4gY3VycmVudAplbmQKCmxvY2FsIGZ1bmN0aW9uIHNlbGVjdEZyb20oYmFyLCAuLi4pCiAgICBsb2NhbCBpbmRleCA9IGJhcjpnZXRJdGVtSW5kZXgoKQogICAgZm9yIGk9MSwgc2VsZWN0KCcjJywgLi4uKSBkbwogICAgICAgIGxvY2FsIHRhYiA9IHNlbGVjdChpLCAuLi4pCiAgICAgICAgaWYgdGFiIHRoZW4KICAgICAgICAgICAgaWYgaSA9PSBpbmRleCB0aGVuCiAgICAgICAgICAgICAgICB0YWI6c2hvdygpCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHRhYjpoaWRlKCkKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCiAgICBlbmQKICAgIGxvY2FsIHRhYiA9IHNlbGVjdChpbmRleCwgLi4uKQogICAgcmV0dXJuIHRhYgplbmQKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2VsZWN0RnJhbWUiLCBmdW5jdGlvbihiYXIpCiAgICBzZWxlY3RGcm9tKAogICAgICAgIGJhciwKICAgICAgICBkb20geyAncm9vdCcsICdtYWluJywgJ2VkaXQnIH0sCiAgICAgICAgZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdmaWxlJyB9CiAgICApCmVuZCkKCmxvY2FsIHBvc2l0aW9uTGlzdCwgaWRlbnRpdHlMaXN0LCBhY3RpdmVMaXN0LCBhZGRyZXNzYm9va0xvY2F0aW9uSW5wdXQKCmJhc2FsdC5zZXRWYXJpYWJsZSgic2VsZWN0TGlzdCIsIGZ1bmN0aW9uKGJhcikKICAgIGFjdGl2ZUxpc3QgPSBzZWxlY3RGcm9tKAogICAgICAgIGJhciwKICAgICAgICBwb3NpdGlvbkxpc3QsCiAgICAgICAgaWRlbnRpdHlMaXN0CiAgICApCmVuZCkKCmxvY2FsIGZ1bmN0aW9uIHNjcm9sbChsaXN0LCBpbmNyZW1lbnQpCiAgICBsb2NhbCBvZmZzZXQgPSBsaXN0OmdldE9mZnNldCgpCiAgICBpZiBpbmNyZW1lbnQgPCAwIGFuZCBvZmZzZXQgPD0gMCB0aGVuCiAgICAgICAgcmV0dXJuCiAgICBlbmQKICAgIGlmIGluY3JlbWVudCA+IDAgYW5kIG9mZnNldCA+ICMobGlzdDpnZXRBbGwoKSkgLSBsaXN0OmdldEhlaWdodCgpIHRoZW4KICAgICAgICByZXR1cm4KICAgIGVuZAogICAgbGlzdDpzZXRPZmZzZXQob2Zmc2V0ICsgaW5jcmVtZW50KQplbmQKCmxvY2FsIGZ1bmN0aW9uIHNjcm9sbFBhcmVudExpc3QoYnV0dG9uLCBpbmNyZW1lbnQpCiAgICBsb2NhbCBsaXN0ID0gYnV0dG9uOmdldFBhcmVudCgpOmdldE9iamVjdCgibGlzdCIpCiAgICBzY3JvbGwobGlzdCwgaW5jcmVtZW50KQplbmQKCmxvY2FsIG1vZGFsTXV0ZXggPSBjb25jdXJyZW50Lm11dGV4KCkKbG9jYWwgbW9kYWxNdXRleFBvc2l0aW9uID0gY29uY3VycmVudC5tdXRleCgpCgpsb2NhbCBmdW5jdGlvbiBnZXRJbnB1dE9yTmlsKGlucHV0KQogICAgbG9jYWwgdmFsdWUgPSBpbnB1dDpnZXRWYWx1ZSgpCiAgICBpZiB2YWx1ZSA9PSAiIiB0aGVuCiAgICAgICAgcmV0dXJuIG5pbAogICAgZWxzZQogICAgICAgIHJldHVybiB2YWx1ZQogICAgZW5kCmVuZAoKbG9jYWwgZnVuY3Rpb24gYWRkcmVzc0Zvcm0obXV0ZXgsIHJlY29yZCwga2luZCkKICAgIHJlY29yZCA9IHJlY29yZCBvciB7fQogICAgcmV0dXJuIG1vZGFsLm9wZW4oZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKICAgICAgICBsb2NhbCB3aWR0aCA9IG1hdGgubWluKDMwLCBmcmFtZTpnZXRQYXJlbnQoKTpnZXRTaXplKCkgLSAyKQogICAgICAgIGZyYW1lOnNldFNpemUod2lkdGgsIDEyKQogICAgICAgIGZyYW1lOnNldFBvc2l0aW9uKCIocGFyZW50LncgLSBzZWxmLncpLzIgKyAxIiwgIihwYXJlbnQuaCAtIHNlbGYuaCkvMiIpCiAgICAgICAgZnJhbWU6YWRkTGF5b3V0RnJvbVN0cmluZyhyZXNvdXJjZXMubG9hZCAicmVjb3JkLnhtbCIpCiAgICAgICAgbG9jYWwgd2luZG93ID0gZnJhbWU6Z2V0T2JqZWN0KCJ3aW5kb3ciKQogICAgICAgIGxvY2FsIG5hbWVJbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoIm5hbWUiKQogICAgICAgIG5hbWVJbnB1dDpzZXRWYWx1ZShyZWNvcmQubmFtZSBvciAiIikKICAgICAgICBsb2NhbCBhZGRyZXNzSW5wdXQgPSB3aW5kb3c6Z2V0T2JqZWN0KCJhZGRyZXNzIikKICAgICAgICBhZGRyZXNzSW5wdXQ6c2V0VmFsdWUocmVjb3JkLmFkZHJlc3MgYW5kIHRvc3RyaW5nKHJlY29yZC5hZGRyZXNzKSBvciAiIikKCiAgICAgICAgd2luZG93OmdldE9iamVjdCgic3VibWl0Iik6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgICAgIGxvY2FsIG9rLCB2YWx1ZSA9IHBjYWxsKGFkZHJlc3MucGFyc2UsIGFkZHJlc3NJbnB1dDpnZXRWYWx1ZSgpKQogICAgICAgICAgICBpZiBub3Qgb2sgdGhlbgogICAgICAgICAgICAgICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICBtdXRleDp3aXRoX2xvY2sobW9kYWwuYWxlcnQsICJJbnZhbGlkIGFkZHJlc3M6XG4iLi52YWx1ZSwgbmlsLCAiT0siKQogICAgICAgICAgICAgICAgZW5kKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBpZiB2YWx1ZS5raW5kIH49IGtpbmQgdGhlbgogICAgICAgICAgICAgICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICBtdXRleDp3aXRoX2xvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmFsZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhZGRyZXNzOlxuZXhwZWN0ZWQgIi4ua2luZC4uIiAoIi4uYWRkcmVzcy5zaXplb2Yoa2luZCkuLiIgc3ltYm9scyksIGJ1dCBnb3QgIgogICAgICAgICAgICAgICAgICAgICAgICAuLnZhbHVlLmtpbmQuLiIgKCIuLnZhbHVlLm4uLiIgc3ltYm9scykiLCBuaWwsICJPSyIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbmQpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGZ1dHVyZTpjb21wbGV0ZSB7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZUlucHV0OmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICBhZGRyZXNzID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICBlbmQpCiAgICAgICAgd2luZG93OmdldE9iamVjdCgiY2FuY2VsIik6b25DbGljayhmdW5jdGlvbigpCiAgICAgICAgICAgIGZ1dHVyZTpjb21wbGV0ZShuaWwpCiAgICAgICAgZW5kKQogICAgZW5kKQplbmQKCmxvY2FsIGZ1bmN0aW9uIHBvc2l0aW9uRm9ybShwb3NpdGlvbikKICAgIHBvc2l0aW9uID0gcG9zaXRpb24gb3IgeyBpbnRlcnN0ZWxsYXIgPSB7fSB9CiAgICByZXR1cm4gbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwub3BlbiwgZnVuY3Rpb24oZnJhbWUsIGZ1dHVyZSkKICAgICAgICBsb2NhbCByZWNvcmRNdXRleCA9IGNvbmN1cnJlbnQubXV0ZXgoKQogICAgICAgIGZyYW1lOmFkZExheW91dEZyb21TdHJpbmcocmVzb3VyY2VzLmxvYWQgInBvc2l0aW9uLnhtbCIpCiAgICAgICAgbG9jYWwgd2luZG93ID0gZnJhbWU6Z2V0T2JqZWN0KCJ3aW5kb3ciKQogICAgICAgIGxvY2FsIG5hbWVJbnB1dCA9IHdpbmRvdzpnZXRPYmplY3QoIm5hbWUiKQogICAgICAgIG5hbWVJbnB1dDpzZXRWYWx1ZShwb3NpdGlvbi5uYW1lIG9yICIiKQogICAgICAgIGxvY2FsIGtleUlucHV0ID0gd2luZG93OmdldE9iamVjdCgia2V5IikKICAgICAgICBrZXlJbnB1dDpzZXRWYWx1ZShwb3NpdGlvbi5rZXkgb3IgIiIpCiAgICAgICAgbG9jYWwgZXh0cmFnYWxhY3RpY0lucHV0ID0gd2luZG93OmdldE9iamVjdCgiZXh0cmFnYWxhY3RpYyIpCiAgICAgICAgZXh0cmFnYWxhY3RpY0lucHV0OnNldFZhbHVlKHBvc2l0aW9uLmV4dHJhZ2FsYWN0aWMgYW5kIHRvc3RyaW5nKHBvc2l0aW9uLmV4dHJhZ2FsYWN0aWMpIG9yICIiKQogICAgICAgIGxvY2FsIGludGVyc3RlbGxhckxpc3QgPSB3aW5kb3c6Z2V0T2JqZWN0KCJsaXN0IikKICAgICAgICBsb2NhbCBmdW5jdGlvbiBpbnRlcnN0ZWxsYXJJdGVtKGdhbGF4eSwgYWRkcikKICAgICAgICAgICAgcmV0dXJuIGdhbGF4eS4uIiAiLi50b3N0cmluZyhhZGRyKSwgbmlsLCBuaWwsIHsgZ2FsYXh5ID0gZ2FsYXh5LCBhZGRyZXNzID0gYWRkciB9CiAgICAgICAgZW5kCiAgICAgICAgbG9jYWwgZnVuY3Rpb24gYWRkSW50ZXJzdGVsbGFyKGdhbGF4eSwgYWRkcikKICAgICAgICAgICAgaW50ZXJzdGVsbGFyTGlzdDphZGRJdGVtKGludGVyc3RlbGxhckl0ZW0oZ2FsYXh5LCBhZGRyKSkKICAgICAgICBlbmQKICAgICAgICBmb3IgZ2FsYXh5LCBhZGRyIGluIHBhaXJzKHBvc2l0aW9uLmludGVyc3RlbGxhcikgZG8KICAgICAgICAgICAgYWRkSW50ZXJzdGVsbGFyKGdhbGF4eSwgYWRkcikKICAgICAgICBlbmQKICAgICAgICB3aW5kb3c6Z2V0T2JqZWN0KCJhZGQiKTpvbkNsaWNrKGZ1bmN0aW9uKCkKICAgICAgICAgICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgIGxvY2FsIHJlY29yZCA9IG1vZGFsTXV0ZXhQb3NpdGlvbjp3aXRoX2xvY2soYWRkcmVzc0Zvcm0sIHJlY29yZE11dGV4LCBuaWwsICdpbnRlcnN0ZWxsYXInKQogICAgICAgICAgICAgICAgaWYgcmVjb3JkIHRoZW4KICAgICAgICAgICAgICAgICAgICBhZGRJbnRlcnN0ZWxsYXIocmVjb3JkLm5hbWUsIHJlY29yZC5hZGRyZXNzKQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZCkKICAgICAgICBlbmQpCiAgICAgICAgd2luZG93OmdldE9iamVjdCgiZWRpdCIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgICAgICBsb2NhbCBpbmRleCA9IGludGVyc3RlbGxhckxpc3Q6Z2V0SXRlbUluZGV4KCkKICAgICAgICAgICAgaWYgbm90IGluZGV4IG9yIGluZGV4IDw9IDAgdGhlbgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBsb2NhbCBpdGVtID0gaW50ZXJzdGVsbGFyTGlzdDpnZXRJdGVtKGluZGV4KQogICAgICAgICAgICBsb2NhbCByZWNvcmQgPSBpdGVtLmFyZ3NbMV0KICAgICAgICAgICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgIGxvY2FsIG5ld1JlY29yZCA9IG1vZGFsTXV0ZXhQb3NpdGlvbjp3aXRoX2xvY2soCiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0Zvcm0sIHJlY29yZE11dGV4LCB7bmFtZSA9IHJlY29yZC5nYWxheHksIGFkZHJlc3MgPSByZWNvcmQuYWRkcmVzc30sICdpbnRlcnN0ZWxsYXInCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBuZXdSZWNvcmQgdGhlbgogICAgICAgICAgICAgICAgICAgIGludGVyc3RlbGxhckxpc3Q6ZWRpdEl0ZW0oaW5kZXgsIGludGVyc3RlbGxhckl0ZW0obmV3UmVjb3JkLm5hbWUsIG5ld1JlY29yZC5hZGRyZXNzKSkKICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICBlbmQpCiAgICAgICAgZW5kKQogICAgICAgIHdpbmRvdzpnZXRPYmplY3QoImRlbGV0ZSIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgICAgICBsb2NhbCBpbmRleCA9IGludGVyc3RlbGxhckxpc3Q6Z2V0SXRlbUluZGV4KCkKICAgICAgICAgICAgaWYgbm90IGluZGV4IG9yIGluZGV4IDw9IDAgdGhlbgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBqb2IuYXN5bmMoZnVuY3Rpb24oKQogICAgICAgICAgICAgICAgbG9jYWwgaXNTdXJlID0gbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jayhtb2RhbC5hbGVydCwgIkFyZSB5b3Ugc3VyZT8iLCAiWWVzIiwgIk5vIikKICAgICAgICAgICAgICAgIGlmIGlzU3VyZSB0aGVuCiAgICAgICAgICAgICAgICAgICAgaW50ZXJzdGVsbGFyTGlzdDpyZW1vdmVJdGVtKGluZGV4KQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGVuZCkKICAgICAgICBlbmQpCgogICAgICAgIHdpbmRvdzpnZXRPYmplY3QoInN1Ym1pdCIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgICAgICBsb2NhbCBleHRyYWdhbGFjdGljID0gZ2V0SW5wdXRPck5pbChleHRyYWdhbGFjdGljSW5wdXQpCiAgICAgICAgICAgIGlmIGV4dHJhZ2FsYWN0aWMgdGhlbgogICAgICAgICAgICAgICAgbG9jYWwgb2ssIHZhbHVlID0gcGNhbGwoYWRkcmVzcy5wYXJzZSwgZXh0cmFnYWxhY3RpYykKICAgICAgICAgICAgICAgIGlmIG5vdCBvayB0aGVuCiAgICAgICAgICAgICAgICAgICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmFsZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXh0cmFnYWxhY3RpYyBhZGRyZXNzOlxuIi4udmFsdWUsIG5pbCwgIk9LIgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZW5kKQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBpZiB2YWx1ZS5raW5kIH49ICdleHRyYWdhbGFjdGljJyB0aGVuCiAgICAgICAgICAgICAgICAgICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWxNdXRleFBvc2l0aW9uOndpdGhfbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmFsZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXh0cmFnYWxhY3RpYyBhZGRyZXNzOlxuZXhwZWN0ZWQgZXh0cmFnYWxhY3RpYyBhZGRyZXNzICg3IHN5bWJvbHMpLCBidXQgZ290ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4udmFsdWUua2luZC4uIiAoIi4udmFsdWUubi4uIiBzeW1ib2xzKSIsIG5pbCwgIk9LIgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgZW5kKQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBleHRyYWdhbGFjdGljID0gdmFsdWUKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGxvY2FsIGludGVyc3RlbGxhciA9IHt9CiAgICAgICAgICAgIGxvY2FsIGNvdW50ID0gaW50ZXJzdGVsbGFyTGlzdDpnZXRJdGVtQ291bnQoKQogICAgICAgICAgICBmb3IgaT0xLCBjb3VudCBkbwogICAgICAgICAgICAgICAgbG9jYWwgaXRlbSA9IGludGVyc3RlbGxhckxpc3Q6Z2V0SXRlbShpKQogICAgICAgICAgICAgICAgbG9jYWwgcmVjb3JkID0gaXRlbS5hcmdzWzFdCiAgICAgICAgICAgICAgICBpbnRlcnN0ZWxsYXJbcmVjb3JkLmdhbGF4eV0gPSByZWNvcmQuYWRkcmVzcwogICAgICAgICAgICBlbmQKICAgICAgICAgICAgZnV0dXJlOmNvbXBsZXRlIHsKICAgICAgICAgICAgICAgIG5hbWUgPSBnZXRJbnB1dE9yTmlsKG5hbWVJbnB1dCk7CiAgICAgICAgICAgICAgICBrZXkgPSBnZXRJbnB1dE9yTmlsKGtleUlucHV0KTsKICAgICAgICAgICAgICAgIGludGVyc3RlbGxhciA9IGludGVyc3RlbGxhcjsKICAgICAgICAgICAgICAgIGV4dHJhZ2FsYWN0aWMgPSBleHRyYWdhbGFjdGljOwogICAgICAgICAgICB9CiAgICAgICAgZW5kKQogICAgICAgIHdpbmRvdzpnZXRPYmplY3QoImNhbmNlbCIpOm9uQ2xpY2soZnVuY3Rpb24oKQogICAgICAgICAgICBmdXR1cmU6Y29tcGxldGUobmlsKQogICAgICAgIGVuZCkKICAgIGVuZCkKZW5kCgpiYXNhbHQuc2V0VmFyaWFibGUoInNjcm9sbFVwIiwgZnVuY3Rpb24oYnV0dG9uKQogICAgc2Nyb2xsUGFyZW50TGlzdChidXR0b24sIC0xKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoInNjcm9sbERvd24iLCBmdW5jdGlvbihidXR0b24pCiAgICBzY3JvbGxQYXJlbnRMaXN0KGJ1dHRvbiwgMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJ1cCIsIGZ1bmN0aW9uKCkKICAgIHNjcm9sbChhY3RpdmVMaXN0LCAtMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJkb3duIiwgZnVuY3Rpb24oKQogICAgc2Nyb2xsKGFjdGl2ZUxpc3QsIDEpCmVuZCkKCmxvY2FsIGZ1bmN0aW9uIGxpc3RJdGVtKHJlY29yZCkKICAgIHJldHVybiByZWNvcmQubmFtZSBvciByZWNvcmQua2V5IG9yICI/Pz8iLCBuaWwsIG5pbCwgcmVjb3JkCmVuZAoKYmFzYWx0LnNldFZhcmlhYmxlKCJhZGRSZWNvcmQiLCBmdW5jdGlvbigpCiAgICBqb2IuYXN5bmMoZnVuY3Rpb24oKQogICAgICAgIGxvY2FsIHJlY29yZAogICAgICAgIGlmIGFjdGl2ZUxpc3QgPT0gcG9zaXRpb25MaXN0IHRoZW4KICAgICAgICAgICAgcmVjb3JkID0gcG9zaXRpb25Gb3JtKG5pbCkKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlY29yZCA9IG1vZGFsTXV0ZXg6d2l0aF9sb2NrKGFkZHJlc3NGb3JtLCBtb2RhbE11dGV4UG9zaXRpb24sIG5pbCwgJ3N5c3RlbXdpZGUnKQogICAgICAgIGVuZAogICAgICAgIGlmIHJlY29yZCB0aGVuCiAgICAgICAgICAgIGFjdGl2ZUxpc3Q6YWRkSXRlbShsaXN0SXRlbShyZWNvcmQpKQogICAgICAgIGVuZAogICAgZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImVkaXRSZWNvcmQiLCBmdW5jdGlvbigpCiAgICBsb2NhbCBpbmRleCA9IGFjdGl2ZUxpc3Q6Z2V0SXRlbUluZGV4KCkKICAgIGlmIG5vdCBpbmRleCBvciBpbmRleCA8PSAwIHRoZW4KICAgICAgICByZXR1cm4KICAgIGVuZAogICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICBsb2NhbCByZWNvcmQgPSBhY3RpdmVMaXN0OmdldEl0ZW0oaW5kZXgpLmFyZ3NbMV0KICAgICAgICBpZiBhY3RpdmVMaXN0ID09IHBvc2l0aW9uTGlzdCB0aGVuCiAgICAgICAgICAgIHJlY29yZCA9IHBvc2l0aW9uRm9ybShyZWNvcmQpCiAgICAgICAgZWxzZQogICAgICAgICAgICByZWNvcmQgPSBtb2RhbE11dGV4OndpdGhfbG9jayhhZGRyZXNzRm9ybSwgbW9kYWxNdXRleFBvc2l0aW9uLCByZWNvcmQsICdzeXN0ZW13aWRlJykKICAgICAgICBlbmQKICAgICAgICBpZiByZWNvcmQgdGhlbgogICAgICAgICAgICBhY3RpdmVMaXN0OmVkaXRJdGVtKGluZGV4LCBsaXN0SXRlbShyZWNvcmQpKQogICAgICAgIGVuZAogICAgZW5kKQplbmQpCgpiYXNhbHQuc2V0VmFyaWFibGUoImRlbGV0ZVJlY29yZCIsIGZ1bmN0aW9uKCkKICAgIGxvY2FsIGluZGV4ID0gYWN0aXZlTGlzdDpnZXRJdGVtSW5kZXgoKQogICAgaWYgbm90IGluZGV4IG9yIGluZGV4IDw9IDAgdGhlbgogICAgICAgIHJldHVybgogICAgZW5kCiAgICBqb2IuYXN5bmMoZnVuY3Rpb24oKQogICAgICAgIGxvY2FsIGlzU3VyZSA9IG1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLmFsZXJ0LCAiQXJlIHlvdSBzdXJlPyIsICJZZXMiLCAiTm8iKQogICAgICAgIGlmIGlzU3VyZSB0aGVuCiAgICAgICAgICAgIGFjdGl2ZUxpc3Q6cmVtb3ZlSXRlbShpbmRleCkKICAgICAgICBlbmQKICAgIGVuZCkKZW5kKQoKbG9jYWwgZnVuY3Rpb24gZWRpdExpc3RJdGVtKGxpc3QsIGluZGV4LCBpdGVtKQogICAgbGlzdDplZGl0SXRlbShpbmRleCwgaXRlbS50ZXh0LCBpdGVtLmJnQ29sLCBpdGVtLmZnQ29sLCB0YWJsZS51bnBhY2soaXRlbS5hcmdzKSkKZW5kCgpsb2NhbCBmdW5jdGlvbiBzd2FwTGlzdEl0ZW1zKGxpc3QsIGEsIGIpCiAgICBsb2NhbCBhSXRlbSA9IGxpc3Q6Z2V0SXRlbShhKQogICAgbG9jYWwgYkl0ZW0gPSBsaXN0OmdldEl0ZW0oYikKICAgIGVkaXRMaXN0SXRlbShsaXN0LCBhLCBiSXRlbSkKICAgIGVkaXRMaXN0SXRlbShsaXN0LCBiLCBhSXRlbSkKZW5kCgpiYXNhbHQuc2V0VmFyaWFibGUoIm1vdmVVcCIsIGZ1bmN0aW9uKCkKICAgIGxvY2FsIGluZGV4ID0gYWN0aXZlTGlzdDpnZXRJdGVtSW5kZXgoKQogICAgaWYgbm90IGluZGV4IG9yIGluZGV4IDw9IDAgdGhlbgogICAgICAgIHJldHVybgogICAgZW5kCiAgICBpZiBpbmRleCA9PSAxIHRoZW4KICAgICAgICByZXR1cm4KICAgIGVuZAogICAgc3dhcExpc3RJdGVtcyhhY3RpdmVMaXN0LCBpbmRleCAtIDEsIGluZGV4KQogICAgYWN0aXZlTGlzdDpzZWxlY3RJdGVtKGluZGV4IC0gMSkKZW5kKQoKYmFzYWx0LnNldFZhcmlhYmxlKCJtb3ZlRG93biIsIGZ1bmN0aW9uKCkKICAgIGxvY2FsIGluZGV4ID0gYWN0aXZlTGlzdDpnZXRJdGVtSW5kZXgoKQogICAgaWYgbm90IGluZGV4IG9yIGluZGV4IDw9IDAgdGhlbgogICAgICAgIHJldHVybgogICAgZW5kCiAgICBpZiBpbmRleCA9PSBhY3RpdmVMaXN0OmdldEl0ZW1Db3VudCgpIHRoZW4KICAgICAgICByZXR1cm4KICAgIGVuZAogICAgc3dhcExpc3RJdGVtcyhhY3RpdmVMaXN0LCBpbmRleCwgaW5kZXggKyAxKQogICAgYWN0aXZlTGlzdDpzZWxlY3RJdGVtKGluZGV4ICsgMSkKZW5kKQoKbG9jYWwgZnVuY3Rpb24gdHJhbnNmb3JtTGlzdChsaXN0KQogICAgbG9jYWwgcmVzdWx0ID0ge30KICAgIGZvciBpLCBpdGVtIGluIGlwYWlycyhsaXN0OmdldEFsbCgpKSBkbwogICAgICAgIHJlc3VsdFtpXSA9IGl0ZW0uYXJnc1sxXQogICAgZW5kCiAgICByZXR1cm4gcmVzdWx0CmVuZAoKYmFzYWx0LnNldFZhcmlhYmxlKCJzYXZlQWxsIiwgZnVuY3Rpb24oKQogICAgam9iLmFzeW5jKGZ1bmN0aW9uKCkKICAgICAgICBsb2NhbCBvaywgZXJyID0gcGNhbGwoZnVuY3Rpb24oKQogICAgICAgICAgICBhZGRyZXNzYm9vay5zZXRfbG9jYXRpb24oYWRkcmVzc2Jvb2tMb2NhdGlvbklucHV0OmdldFZhbHVlKCkpCiAgICAgICAgICAgIGxvY2FsIGFkZHJlc3NlcyA9IHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gdHJhbnNmb3JtTGlzdChwb3NpdGlvbkxpc3QpOwogICAgICAgICAgICAgICAgaWRlbnRpdHkgPSB0cmFuc2Zvcm1MaXN0KGlkZW50aXR5TGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWRkcmVzc2Jvb2suc2F2ZShhZGRyZXNzZXMpCiAgICAgICAgZW5kKQogICAgICAgIGlmIG5vdCBvayB0aGVuCiAgICAgICAgICAgIG1vZGFsTXV0ZXg6d2l0aF9sb2NrKG1vZGFsLmFsZXJ0LCAiU2F2aW5nIGZhaWxlZDpcbiIuLmVyciwgbmlsLCAiT0siKQogICAgICAgIGVsc2UKICAgICAgICAgICAgbW9kYWxNdXRleDp3aXRoX2xvY2sobW9kYWwubWVzc2FnZSwgIlN1Y2Nlc3MiLCAiQWRkcmVzc2Jvb2sgc2F2ZWQhIikKICAgICAgICBlbmQKICAgIGVuZCkKZW5kKQoKYmFzYWx0LmNyZWF0ZUZyYW1lKCkKICAgIDpzZXRUaGVtZSh0aGVtZSkKICAgIDphZGRMYXlvdXRGcm9tU3RyaW5nKHJlc291cmNlcy5sb2FkKCJhc24ueG1sIikpCgpkb20geyAncm9vdCcsICdtYWluJywgJ2ZpbGUnLCAndmVyc2lvbicgfTpzZXRUZXh0KHZlcnNpb24pCgpwb3NpdGlvbkxpc3QgPSBkb20geyAncm9vdCcsICdtYWluJywgJ2VkaXQnLCAncG9zaXRpb24nIH0KaWRlbnRpdHlMaXN0ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdlZGl0JywgJ2lkZW50aXR5JyB9CmFjdGl2ZUxpc3QgPSBwb3NpdGlvbkxpc3QKYWRkcmVzc2Jvb2tMb2NhdGlvbklucHV0ID0gZG9tIHsgJ3Jvb3QnLCAnbWFpbicsICdmaWxlJywgJ2ZpbGVwYXRoJyB9CgpkbwogICAgYWRkcmVzc2Jvb2tMb2NhdGlvbklucHV0OnNldFZhbHVlKGFkZHJlc3Nib29rLmdldF9sb2NhdGlvbigpKQogICAgbG9jYWwgYWRkcmVzc2VzID0gYXNzZXJ0KGFkZHJlc3Nib29rLmxvYWQoKSkKICAgIGZvciBfLCByZWNvcmQgaW4gaXBhaXJzKGFkZHJlc3Nlcy5wb3NpdGlvbikgZG8KICAgICAgICBwb3NpdGlvbkxpc3Q6YWRkSXRlbShsaXN0SXRlbShyZWNvcmQpKQogICAgZW5kCiAgICBmb3IgXywgcmVjb3JkIGluIGlwYWlycyhhZGRyZXNzZXMuaWRlbnRpdHkpIGRvCiAgICAgICAgaWRlbnRpdHlMaXN0OmFkZEl0ZW0obGlzdEl0ZW0ocmVjb3JkKSkKICAgIGVuZAplbmQKCmpvYi5ydW4oZnVuY3Rpb24oKQoKam9iLmFzeW5jKGJhc2FsdC5hdXRvVXBkYXRlKQoKZW5kKQo="
- return load(base64.decode(entrypoint), "@/"..shell.getRunningProgram(), 't', _ENV)(...)
- ]]):gsub("<$<", "[["):gsub(">$>", "]]")
- local entrypoint = base64.decode "cHJpbnQoIkluc3RhbGxpbmcgQVNOLi4uIikKCnByaW50KCJTcGVjaWZ5IGFuIFVSTCB0aGF0IHBvaW50cyB0byBhZGRyZXNzZXMgZmlsZTogIikKCmxvY2FsIERFRkFVTFRfTE9DQVRJT04gPSAiZmlsZTphZGRyZXNzZXMuY29uZiIKbG9jYWwgYWRkcmVzc2VzTG9jYXRpb24gPSByZWFkKG5pbCwgbmlsLCBuaWwsIHNldHRpbmdzLmdldCgicHNnLmFkZHJlc3Nlc0xvY2F0aW9uIiwgREVGQVVMVF9MT0NBVElPTikpCgpzZXR0aW5ncy5zZXQoInBzZy5hZGRyZXNzZXNMb2NhdGlvbiIsIGFkZHJlc3Nlc0xvY2F0aW9uKQpzZXR0aW5ncy5zYXZlKCkKCnByaW50KCJVbnBhY2tpbmcgZmlsZXMuLi4iKQppZiBub3QgZnMuZXhpc3RzKCJhZGRyZXNzZXMuY29uZiIpIGFuZCBERUZBVUxUX0xPQ0FUSU9OID09IGFkZHJlc3Nlc0xvY2F0aW9uIHRoZW4KICAgIHNhdmVFeHRyYSgiYWRkcmVzc2VzLmNvbmYiKQplbmQKc2F2ZVByb2dyYW0oKQoKcHJpbnQoIkZpbGVzIHVucGFja2VkISIpCgpwcmludCgiWW91ciBjb3B5IG9mIGFkZHJlc3MgYm9vayBlZGl0b3IiLCBWRVJTSU9OLCAiaXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCEiKQpwcmludCgiRXhlY3V0ZSBcImFzblwiIGNvbW1hbmQgaW4gb3JkZXIgdG8gcnVuIGFkZHJlc3MgYm9vayBlZGl0b3IuIikK"
- return load(entrypoint, "@[included]/installer.lua", 't', _ENV)(...)
Comments
-
- Address Book Editor installer https://github.com/Ktlo/pocket-stargate
Add Comment
Please, Sign In to add comment