v = { }
waiting = False
def replace_low_and_cap( text, splitBy, joinBy) :
text = text.split ( splitBy.lower ( ) )
text = joinBy.join ( text)
text = text.split ( splitBy.title ( ) )
text = joinBy.join ( text)
return text
def replace_all( text, replaceWith, *splitList) :
text = replace_low_and_cap( text, replaceWith, replaceWith)
for splitBy in splitList:
text = replace_low_and_cap( text, splitBy, replaceWith)
return text
def replace_all_dash( text, replaceWith, *splitList) :
text = replace_all( text, replaceWith, replaceWith)
for splitBy in splitList:
text = replace_all( text, replaceWith, "-" +splitBy)
return text
def replace_first( text, replaceWith, spl) :
text = text.split ( spl)
if len ( text) >= 2 :
text[ 0 ] += replaceWith+text.pop ( 1 )
text = spl.join ( text)
return text
def echo( l= "" ) :
print ( l, end= "" )
return l
def println( l= "" ) :
print ( l)
return l
def compileCode( inp) :
storeIn = None
shouldEcho = None
shouldPrint = None
inp = replace_first( inp, '-r"' , '"' )
inp = replace_all_dash( inp, "-r" , "raw" )
inp = replace_all_dash( inp, "-a" , "alias" , "v" , "var" )
inp = replace_all_dash( inp, "-e" , "echo" )
inp = replace_all_dash( inp, "-p" , "print" , "println" )
inp = replace_all_dash( inp, "True" , "yes" , "positive" )
inp = replace_all_dash( inp, "False" , "no" , "negative" )
inp = replace_all_dash( inp, "None" , "nothing" , "empty" , "undefined" , "null" )
spl = inp.split ( "-e" )
if len ( spl) >= 2 :
i = len ( spl) -1
del spl[ i]
shouldEcho = True
spl = "-e" .join ( spl)
spl = spl.split ( "-p" )
if len ( spl) >= 2 :
i = len ( spl) -1
del spl[ i]
shouldPrint = True
spl = "-p" .join ( spl)
spl = spl.split ( "-ifvar" )
if len ( spl) >= 2 :
i = len ( spl) -1
words = spl[ i] .split ( )
varTxt = 'var[' +words.pop ( i) +']'
cond = varTxt+'words'
t = test ( cond)
if t != True :
return
spl = "-ifvar" .join ( spl)
spl = spl.split ( "-if" )
if len ( spl) >= 2 :
i = len ( spl) -1
cond = eval ( spl.pop ( i) )
t = test ( cond)
if t != True :
return
spl = "if" .join ( spl)
spl = spl.split ( "-store in " )
if len ( spl) >= 2 :
i = len ( spl) - 1
storeIn = eval ( spl.pop ( i) )
spl = "-store in " .join ( spl)
spl = spl.split ( "-r" )
if len ( spl) >= 2 :
cmd = "." .join ( spl.pop ( 0 ) .split ( ) )
args = "-r" .join ( spl) .split ( "-a" )
for i in range ( len ( args) ) :
if i > 0 :
a = "v[" +args[ i] +"]"
args[ i] = a
args = "" .join ( args)
if shouldEcho:
code = "{0}({1}, shouldEcho=True)" .format ( cmd , args)
elif shouldPrint:
code = "{}({}, shouldPrint=True)" .format ( cmd , args)
else :
code = "{0}({1})" .format ( cmd , args)
else :
spl = "" .join ( spl)
spl = spl.split ( "-a" )
if len ( spl) >= 2 :
cmd = "." .join ( spl[ 0 ] .split ( ) )
for i in range ( len ( spl) ) :
if i > 0 :
a = "v[" +spl[ i] +"]"
spl[ i] = a
spl.pop ( 0 )
spl = "" .join ( spl)
if shouldEcho:
code = "{}({}, shouldEcho=True)" .format ( cmd , spl)
elif shouldPrint:
code = "{}({}, shouldPrint=True)" .format ( cmd , spl)
else :
code = "{}({})" .format ( cmd , spl)
else :
spl = "" .join ( spl)
spl = spl.split ( "-f" )
if len ( spl) >= 2 :
cmd = spl.pop ( 0 )
arg = spl.pop ( 0 )
cmd = "" .join ( cmd )
cmd = "." .join ( cmd .split ( ) )
if shouldEcho:
code = "{}({}(), shouldEcho=True)" .format ( cmd , arg)
elif shouldPrint:
code = "{}({}(), shouldPrint=True)" .format ( cmd , arg)
else :
code = "{}({}())" .format ( cmd , arg)
else :
spl = "" .join ( spl)
spl = "." .join ( spl.split ( ) )
if shouldEcho:
code = "{}(shouldEcho=True)" .format ( spl)
elif shouldPrint:
code = "{}(shouldPrint=True)" .format ( spl)
else :
code = "{}()" .format ( spl)
if type ( storeIn) == str :
code = """temp = {}
v["{}"] = temp""" .format ( code , storeIn)
return code
def runCode( inp) :
code = compileCode( inp)
eval ( code )
waiting = False
def q( shouldPrint= False , shouldEcho= False ) :
if shouldEcho:
return echo( "Quitting ..." )
if shouldPrint:
return println( "Quitting ..." )
exit( )
raise Exception ( "Error exiting app" )
def printAliases( ) :
for var in v:
val = v[ var]
if type ( val) == str :
val = "\" " +val+"\" "
print ( var+": " +str ( val) )
def getAliases( ) :
return v
def amountOfAliases( ) :
return len ( v)
def alias( var, i= None , shouldPrint= False , shouleEcho= False ) :
if i != None :
v[ var] = i
if shouldEcho:
echo( var+":" , v[ var] )
if shouldPrint:
println( var+":" , v[ var] )
return v[ var]
class error:
def __init__ ( self , e= "" , fatal= False , shouldPrint= False , shouldEcho= False ) :
if fatal == False :
self .txt = "Error"
else :
self .txt = "Fatal error"
if e != "" :
self .txt += ": " +e
if shouldPrint:
println( str ( self ) )
if shouldEcho:
echo( str ( self ) )
@ staticmethod
def fatal( e= "" , shouldPrint= False , shouldEcho= False ) :
err = error( e, True , shouldPrint= shouldPrint, shouldEcho= shouldEcho)
q( shouldPrint, shouldEcho)
return err
@ staticmethod
def makeFatal( self , shouldPrint= False , sholdEcho= False ) :
e = "" .join ( self .txt .split ( "Error: " ) )
return type ( self ) .fatal ( e, shouldPrint, shouldEcho)
def __str__ ( self ) :
return self .txt
def python( c) :
eval ( c)
class ui:
@ staticmethod
def userinput( prompt) :
pauseLoop( )
inp = input ( prompt)
print ( )
return ( inp)
def test ( cond, shouldEcho= False , shouldPrint= False ) :
if type ( cond) == bool :
if shouldEcho:
echo( cond)
if shouldPrint:
println( cond)
return cond
else :
error.fatal ( "Condition is invalid." )
def testcond( cond) :
pauseLoop( )
quit = False
cond = str ( cond)
while not quit:
test = input ( "if the condition is:\n $ " )
println( test )
if test == "exit" :
quit = True
ifTrue = input ( "Do:\n $ " )
println( ifTrue)
if test == "other" :
quit = True
condtest = "True"
else :
condtest = cond+test
if eval ( condtest) :
quit = True
runCode( ifTrue)
playLoop( )
def mainLoop( ) :
print ( "Mainloop" )
while waiting == False :
inp = input ( "\n $ " )
println( inp)
runCode( inp)
for var in v:
print ( var)
print ( "" )
def pauseLoop( ) :
waiting = True
def playLoop( ) :
waiting = False
mainLoop( )
playLoop( )
diA9IHt9Cgp3YWl0aW5nID0gRmFsc2UKCmRlZiByZXBsYWNlX2xvd19hbmRfY2FwKHRleHQsIHNwbGl0QnksIGpvaW5CeSk6CiAgICB0ZXh0ID0gdGV4dC5zcGxpdChzcGxpdEJ5Lmxvd2VyKCkpCiAgICB0ZXh0ID0gam9pbkJ5LmpvaW4odGV4dCkKICAgIHRleHQgPSB0ZXh0LnNwbGl0KHNwbGl0QnkudGl0bGUoKSkKICAgIHRleHQgPSBqb2luQnkuam9pbih0ZXh0KQogICAgcmV0dXJuIHRleHQKCmRlZiByZXBsYWNlX2FsbCh0ZXh0LCByZXBsYWNlV2l0aCwgKnNwbGl0TGlzdCk6CiAgICB0ZXh0ID0gcmVwbGFjZV9sb3dfYW5kX2NhcCh0ZXh0LCByZXBsYWNlV2l0aCwgcmVwbGFjZVdpdGgpCiAgICBmb3Igc3BsaXRCeSBpbiBzcGxpdExpc3Q6CiAgICAgICAgdGV4dCA9IHJlcGxhY2VfbG93X2FuZF9jYXAodGV4dCwgc3BsaXRCeSwgcmVwbGFjZVdpdGgpCiAgICByZXR1cm4gdGV4dAoKZGVmIHJlcGxhY2VfYWxsX2Rhc2godGV4dCwgcmVwbGFjZVdpdGgsICpzcGxpdExpc3QpOgogICAgdGV4dCA9IHJlcGxhY2VfYWxsKHRleHQsIHJlcGxhY2VXaXRoLCByZXBsYWNlV2l0aCkKICAgIGZvciBzcGxpdEJ5IGluIHNwbGl0TGlzdDoKICAgICAgICB0ZXh0ID0gcmVwbGFjZV9hbGwodGV4dCwgcmVwbGFjZVdpdGgsICItIitzcGxpdEJ5KQogICAgcmV0dXJuIHRleHQKCmRlZiByZXBsYWNlX2ZpcnN0KHRleHQsIHJlcGxhY2VXaXRoLCBzcGwpOgogICAgdGV4dCA9IHRleHQuc3BsaXQoc3BsKQogICAgaWYgbGVuKHRleHQpID49IDI6CiAgICAgICAgdGV4dFswXSArPSByZXBsYWNlV2l0aCt0ZXh0LnBvcCgxKQogICAgdGV4dCA9IHNwbC5qb2luKHRleHQpCiAgICByZXR1cm4gdGV4dAoKZGVmIGVjaG8obD0iIik6CiAgICBwcmludChsLCBlbmQ9IiIpCiAgICByZXR1cm4gbAogICAgCmRlZiBwcmludGxuKGw9IiIpOgogICAgcHJpbnQobCkKICAgIHJldHVybiBsCgpkZWYgY29tcGlsZUNvZGUoaW5wKToKICAgIHN0b3JlSW4gPSBOb25lCiAgICBzaG91bGRFY2hvID0gTm9uZQogICAgc2hvdWxkUHJpbnQgPSBOb25lCiAgICBpbnAgPSByZXBsYWNlX2ZpcnN0KGlucCwgJy1yIicsICciJykKICAgIGlucCA9IHJlcGxhY2VfYWxsX2Rhc2goaW5wLCAiLXIiLCAicmF3IikKICAgIGlucCA9IHJlcGxhY2VfYWxsX2Rhc2goaW5wLCAiLWEiLCAiYWxpYXMiLCAidiIsICJ2YXIiKQogICAgaW5wID0gcmVwbGFjZV9hbGxfZGFzaChpbnAsICItZSIsICJlY2hvIikKICAgIGlucCA9IHJlcGxhY2VfYWxsX2Rhc2goaW5wLCAiLXAiLCAicHJpbnQiLCAicHJpbnRsbiIpCiAgICBpbnAgPSByZXBsYWNlX2FsbF9kYXNoKGlucCwgIlRydWUiLCAieWVzIiwgInBvc2l0aXZlIikKICAgIGlucCA9IHJlcGxhY2VfYWxsX2Rhc2goaW5wLCAiRmFsc2UiLCAibm8iLCAibmVnYXRpdmUiKQogICAgaW5wID0gcmVwbGFjZV9hbGxfZGFzaChpbnAsICJOb25lIiwgIm5vdGhpbmciLCAiZW1wdHkiLCAidW5kZWZpbmVkIiwgIm51bGwiKQogICAgc3BsID0gaW5wLnNwbGl0KCItZSIpCiAgICBpZiBsZW4oc3BsKSA+PSAyOgogICAgICAgIGkgPSBsZW4oc3BsKS0xCiAgICAgICAgZGVsIHNwbFtpXQogICAgICAgIHNob3VsZEVjaG8gPSBUcnVlCiAgICBzcGwgPSAiLWUiLmpvaW4oc3BsKQogICAgc3BsID0gc3BsLnNwbGl0KCItcCIpCiAgICBpZiBsZW4oc3BsKSA+PSAyOgogICAgICAgIGkgPSBsZW4oc3BsKS0xCiAgICAgICAgZGVsIHNwbFtpXQogICAgICAgIHNob3VsZFByaW50ID0gVHJ1ZQogICAgc3BsID0gIi1wIi5qb2luKHNwbCkKICAgIHNwbCA9IHNwbC5zcGxpdCgiLWlmdmFyIikKICAgIGlmIGxlbihzcGwpID49IDI6CiAgICAgICAgaSA9IGxlbihzcGwpLTEKICAgICAgICB3b3JkcyA9IHNwbFtpXS5zcGxpdCgpCiAgICAgICAgdmFyVHh0ID0gJ3ZhclsnK3dvcmRzLnBvcChpKSsnXScKICAgICAgICBjb25kID0gdmFyVHh0Kyd3b3JkcycKICAgICAgICB0ID0gdGVzdChjb25kKQogICAgICAgIGlmIHQgIT0gVHJ1ZToKICAgICAgICAgICAgcmV0dXJuCiAgICBzcGwgPSAiLWlmdmFyIi5qb2luKHNwbCkKICAgIHNwbCA9IHNwbC5zcGxpdCgiLWlmIikKICAgIGlmIGxlbihzcGwpID49IDI6CiAgICAgICAgaSA9IGxlbihzcGwpLTEKICAgICAgICBjb25kID0gZXZhbChzcGwucG9wKGkpKQogICAgICAgIHQgPSB0ZXN0KGNvbmQpCiAgICAgICAgaWYgdCAhPSBUcnVlOgogICAgICAgICAgICByZXR1cm4KICAgIHNwbCA9ICJpZiIuam9pbihzcGwpCiAgICBzcGwgPSBzcGwuc3BsaXQoIi1zdG9yZSBpbiAiKQogICAgaWYgbGVuKHNwbCkgPj0gMjoKICAgICAgICBpID0gbGVuKHNwbCkgLSAxCiAgICAgICAgc3RvcmVJbiA9IGV2YWwoc3BsLnBvcChpKSkKICAgIHNwbCA9ICItc3RvcmUgaW4gIi5qb2luKHNwbCkKICAgIHNwbCA9IHNwbC5zcGxpdCgiLXIiKQogICAgaWYgbGVuKHNwbCkgPj0gMjoKICAgICAgICBjbWQgPSAiLiIuam9pbihzcGwucG9wKDApLnNwbGl0KCkpCiAgICAgICAgYXJncyA9ICItciIuam9pbihzcGwpLnNwbGl0KCItYSIpCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFyZ3MpKToKICAgICAgICAgICAgaWYgaSA+IDA6CiAgICAgICAgICAgICAgICBhID0gInZbIithcmdzW2ldKyJdIgogICAgICAgICAgICAgICAgYXJnc1tpXSA9IGEKICAgICAgICBhcmdzID0gIiIuam9pbihhcmdzKQogICAgICAgIGlmIHNob3VsZEVjaG86CiAgICAgICAgICAgIGNvZGUgPSAiezB9KHsxfSwgc2hvdWxkRWNobz1UcnVlKSIuZm9ybWF0KGNtZCwgYXJncykKICAgICAgICBlbGlmIHNob3VsZFByaW50OgogICAgICAgICAgICBjb2RlID0gInt9KHt9LCBzaG91bGRQcmludD1UcnVlKSIuZm9ybWF0KGNtZCwgYXJncykKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb2RlID0gInswfSh7MX0pIi5mb3JtYXQoY21kLCBhcmdzKQogICAgZWxzZToKICAgICAgICBzcGwgPSAiIi5qb2luKHNwbCkKICAgICAgICBzcGwgPSBzcGwuc3BsaXQoIi1hIikKICAgICAgICBpZiBsZW4oc3BsKSA+PSAyOgogICAgICAgICAgICBjbWQgPSAiLiIuam9pbihzcGxbMF0uc3BsaXQoKSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNwbCkpOgogICAgICAgICAgICAgICAgaWYgaSA+IDA6CiAgICAgICAgICAgICAgICAgICAgYSA9ICJ2WyIrc3BsW2ldKyJdIgogICAgICAgICAgICAgICAgICAgIHNwbFtpXSA9IGEKICAgICAgICAgICAgc3BsLnBvcCgwKQogICAgICAgICAgICBzcGwgPSAiIi5qb2luKHNwbCkKICAgICAgICAgICAgaWYgc2hvdWxkRWNobzoKICAgICAgICAgICAgICAgIGNvZGUgPSAie30oe30sIHNob3VsZEVjaG89VHJ1ZSkiLmZvcm1hdChjbWQsIHNwbCkKICAgICAgICAgICAgZWxpZiBzaG91bGRQcmludDoKICAgICAgICAgICAgICAgIGNvZGUgPSAie30oe30sIHNob3VsZFByaW50PVRydWUpIi5mb3JtYXQoY21kLCBzcGwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb2RlID0gInt9KHt9KSIuZm9ybWF0KGNtZCwgc3BsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNwbCA9ICIiLmpvaW4oc3BsKQogICAgICAgICAgICBzcGwgPSBzcGwuc3BsaXQoIi1mIikKICAgICAgICAgICAgaWYgbGVuKHNwbCkgPj0gMjoKICAgICAgICAJICAgIGNtZCA9IHNwbC5wb3AoMCkKICAgICAgICAJICAgIGFyZyA9IHNwbC5wb3AoMCkKICAgICAgICAJICAgIGNtZCA9ICIiLmpvaW4oY21kKQogICAgICAgIAkgICAgY21kID0gIi4iLmpvaW4oY21kLnNwbGl0KCkpCiAgICAgICAgCSAgICBpZiBzaG91bGRFY2hvOgogICAgICAgIAkgICAgICAgIGNvZGUgPSAie30oe30oKSwgc2hvdWxkRWNobz1UcnVlKSIuZm9ybWF0KGNtZCwgYXJnKQogICAgICAgIAkgICAgZWxpZiBzaG91bGRQcmludDoKICAgICAgICAJICAgICAgICBjb2RlID0gInt9KHt9KCksIHNob3VsZFByaW50PVRydWUpIi5mb3JtYXQoY21kLCBhcmcpCiAgICAgICAgCSAgICBlbHNlOgogICAgICAgIAkgICAgICAgIGNvZGUgPSAie30oe30oKSkiLmZvcm1hdChjbWQsIGFyZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNwbCA9ICIiLmpvaW4oc3BsKQogICAgICAgICAgICAgICAgc3BsID0gIi4iLmpvaW4oc3BsLnNwbGl0KCkpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIHNob3VsZEVjaG86CiAgICAgICAgICAgICAgICAgICAgY29kZSA9ICJ7fShzaG91bGRFY2hvPVRydWUpIi5mb3JtYXQoc3BsKQogICAgICAgICAgICAgICAgZWxpZiBzaG91bGRQcmludDoKICAgICAgICAgICAgICAgICAgICBjb2RlID0gInt9KHNob3VsZFByaW50PVRydWUpIi5mb3JtYXQoc3BsKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb2RlID0gInt9KCkiLmZvcm1hdChzcGwpCiAgICBpZiB0eXBlKHN0b3JlSW4pID09IHN0cjogCiAgICAgICAgY29kZSA9ICIiInRlbXAgPSB7fQp2WyJ7fSJdID0gdGVtcCIiIi5mb3JtYXQoY29kZSwgc3RvcmVJbikKICAgIHJldHVybiBjb2RlCmRlZiBydW5Db2RlKGlucCk6CiAgICBjb2RlID0gY29tcGlsZUNvZGUoaW5wKQogICAgZXZhbChjb2RlKQp3YWl0aW5nID0gRmFsc2UKCmRlZiBxKHNob3VsZFByaW50PUZhbHNlLCBzaG91bGRFY2hvPUZhbHNlKToKICAgIGlmIHNob3VsZEVjaG86CiAgICAgICAgcmV0dXJuIGVjaG8oIlF1aXR0aW5nIC4uLiIpCiAgICBpZiBzaG91bGRQcmludDoKICAgICAgICByZXR1cm4gcHJpbnRsbigiUXVpdHRpbmcgLi4uIikKICAgIGV4aXQoKQogICAgcmFpc2UgRXhjZXB0aW9uKCJFcnJvciBleGl0aW5nIGFwcCIpCgpkZWYgcHJpbnRBbGlhc2VzKCk6CiAgICBmb3IgdmFyIGluIHY6CiAgICAgICAgdmFsID0gdlt2YXJdCiAgICAgICAgaWYgdHlwZSh2YWwpID09IHN0cjoKICAgICAgICAgICAgdmFsID0gIlwiIit2YWwrIlwiIgogICAgICAgIHByaW50KHZhcisiOiAiK3N0cih2YWwpKQoKZGVmIGdldEFsaWFzZXMoKToKICAgIHJldHVybiB2CgpkZWYgYW1vdW50T2ZBbGlhc2VzKCk6CiAgICByZXR1cm4gbGVuKHYpCgpkZWYgYWxpYXModmFyLCBpPU5vbmUsIHNob3VsZFByaW50PUZhbHNlLCBzaG91bGVFY2hvPUZhbHNlKToKICAgIGlmIGkgIT0gTm9uZToKICAgICAgICB2W3Zhcl0gPSBpCiAgICBpZiBzaG91bGRFY2hvOgogICAgICAgIGVjaG8odmFyKyI6Iix2W3Zhcl0pCiAgICBpZiBzaG91bGRQcmludDoKICAgICAgICBwcmludGxuKHZhcisiOiIsdlt2YXJdKQogICAgcmV0dXJuIHZbdmFyXQogICAgCmNsYXNzIGVycm9yOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGU9IiIsIGZhdGFsPUZhbHNlLCBzaG91bGRQcmludD1GYWxzZSwgc2hvdWxkRWNobz1GYWxzZSk6CiAgICAgICAgaWYgZmF0YWwgPT0gRmFsc2U6CiAgICAgICAgICAgIHNlbGYudHh0ID0gIkVycm9yIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudHh0ID0gIkZhdGFsIGVycm9yIgogICAgICAgIGlmIGUgIT0gIiI6CiAgICAgICAgICAgIHNlbGYudHh0ICs9ICI6ICIrZQogICAgICAgIGlmIHNob3VsZFByaW50OgogICAgICAgICAgICBwcmludGxuKHN0cihzZWxmKSkKICAgICAgICBpZiBzaG91bGRFY2hvOgogICAgICAgICAgICBlY2hvKHN0cihzZWxmKSkKICAgICAgICAgICAgCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZmF0YWwoZT0iIiwgc2hvdWxkUHJpbnQ9RmFsc2UsIHNob3VsZEVjaG89RmFsc2UpOgogICAgICAgIGVyciA9IGVycm9yKGUsIFRydWUsIHNob3VsZFByaW50PXNob3VsZFByaW50LCBzaG91bGRFY2hvPXNob3VsZEVjaG8pCiAgICAgICAgcShzaG91bGRQcmludCwgc2hvdWxkRWNobykKICAgICAgICByZXR1cm4gZXJyCiAgICAKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBtYWtlRmF0YWwoc2VsZiwgc2hvdWxkUHJpbnQ9RmFsc2UsIHNob2xkRWNobz1GYWxzZSk6CiAgICAgICAgZSA9ICIiLmpvaW4oc2VsZi50eHQuc3BsaXQoIkVycm9yOiAiKSkKICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5mYXRhbChlLCBzaG91bGRQcmludCwgc2hvdWxkRWNobykKICAgICAgICAKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR4dAoKZGVmIHB5dGhvbihjKToKICAgIGV2YWwoYykKCmNsYXNzIHVpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHVzZXJpbnB1dChwcm9tcHQpOgogICAgICAgIHBhdXNlTG9vcCgpCiAgICAgICAgaW5wID0gaW5wdXQocHJvbXB0KQogICAgICAgIHByaW50KCkKICAgICAgICByZXR1cm4oaW5wKQogICAgCmRlZiB0ZXN0KGNvbmQsIHNob3VsZEVjaG89RmFsc2UsIHNob3VsZFByaW50PUZhbHNlKToKICAgIGlmIHR5cGUoY29uZCkgPT0gYm9vbDoKICAgICAgICBpZiBzaG91bGRFY2hvOgogICAgICAgICAgICBlY2hvKGNvbmQpCiAgICAgICAgaWYgc2hvdWxkUHJpbnQ6CiAgICAgICAgICAgIHByaW50bG4oY29uZCkKICAgICAgICByZXR1cm4gY29uZAogICAgZWxzZToKICAgICAgICBlcnJvci5mYXRhbCgiQ29uZGl0aW9uIGlzIGludmFsaWQuIikKCmRlZiB0ZXN0Y29uZChjb25kKToKICAgIHBhdXNlTG9vcCgpCiAgICBxdWl0ID0gRmFsc2UKICAgIGNvbmQgPSBzdHIoY29uZCkKICAgIHdoaWxlIG5vdCBxdWl0OgogICAgICAgIHRlc3QgPSBpbnB1dCgiaWYgdGhlIGNvbmRpdGlvbiBpczpcbiQgIikKICAgICAgICBwcmludGxuKHRlc3QpCiAgICAgICAgaWYgdGVzdCA9PSAiZXhpdCI6CiAgICAgICAgICAgIHF1aXQgPSBUcnVlCiAgICAgICAgaWZUcnVlID0gaW5wdXQoIkRvOlxuJCAiKQogICAgICAgIHByaW50bG4oaWZUcnVlKQogICAgICAgIGlmIHRlc3QgPT0gIm90aGVyIjoKICAgICAgICAgICAgcXVpdCA9IFRydWUKICAgICAgICAgICAgY29uZHRlc3QgPSAiVHJ1ZSIKICAgICAgICBlbHNlOgogICAgICAgIAljb25kdGVzdCA9IGNvbmQrdGVzdAogICAgICAgIGlmIGV2YWwoY29uZHRlc3QpOgogICAgICAgICAgICBxdWl0ID0gVHJ1ZQogICAgICAgICAgICBydW5Db2RlKGlmVHJ1ZSkKICAgIHBsYXlMb29wKCkKCmRlZiBtYWluTG9vcCgpOgogICAgcHJpbnQoIk1haW5sb29wIikKICAgIHdoaWxlIHdhaXRpbmcgPT0gRmFsc2U6CiAgICAgICAgaW5wID0gaW5wdXQoIlxuJCAiKQogICAgICAgIHByaW50bG4oaW5wKQogICAgICAgIHJ1bkNvZGUoaW5wKQogICAgICAgIGZvciB2YXIgaW4gdjoKICAgICAgICAgICAgcHJpbnQodmFyKQogICAgICAgIHByaW50KCIiKQoKZGVmIHBhdXNlTG9vcCgpOgogICAgd2FpdGluZyA9IFRydWUKCmRlZiBwbGF5TG9vcCgpOgogICAgd2FpdGluZyA9IEZhbHNlCiAgICBtYWluTG9vcCgpCgpwbGF5TG9vcCgp