import time; start = time.time()
algs = ["",
"R' U R' U' R' U' R' U R U R2",
"R U' R U R U R U' R' U' R2",
"R2 U2 R U2 R2 U2 R2 U2 R U2 R2",
"R2 U R2 U' R2 F2 R2 U' F2 U R2 F2",
"R U' R F2 R' U R' U' R2 F2 R2",
"R2 F2 R2 U R U' R F2 R' U R'",
"R U R' U R' U' R F' R U R' U' R' F R2 U' R2 U R",
"F' U2 R' U F U' F' U' R U' F",
"R U R' F' R U R' U' R' F R2 U' R'",
"R' U2 R U2 R' F R U R' U' R' F' R2",
"F' R' U' R F' R' U F' U' F' U F R F2",
"F2 R2 U' R' U' R F2 R' U R F2 U R2 F2",
"F2 R2 U' F2 R' U' R F2 R' U R U R2 F2",
"R' U' R2 U' R2 U' R U2 R2 F U R' U' R F' R",
"R' F R' U R U' F' R2 U2 R' U R2 U R2 U R",
"F' R U R' U' R' F R2 F U' R' U' R U F' R'",
"R' U R' F R F' R U' R' F' U F R U R' U' R",
"R U R' U' R' F R2 U' R' U' R U R' F'",
"F R U' R' U' R U R' F' R U R' U' R' F R F'",
"F' U2 F' U' R' F' R2 U' R' U R' F R U' F",
"R U' R U F R F2 U F U' F R' F' R'"]
##################################################
class MyCube:
"""A virtual 3x3x3 matrix"""
def __init__(self):
self.uSide = ['U0', 'U1', 'U2', 'U3', 'U4', 'U5', 'U6', 'U7'] #URF, UF, etc
self.fSide = ['F0', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7'] #FRD, FD, etc
self.lSide = ['L0', 'L1', 'L2', 'L3', 'L4', 'L5', 'L6', 'L7'] #LFD, LD, etc
self.bSide = ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'] #BRD, BD, etc
self.rSide = ['R0', 'R1', 'R2', 'R3', 'R4', 'R5', 'R6', 'R7'] #RBD, RD, etc
self.dSide = ['D0', 'D1', 'D2', 'D3', 'D4', 'D5', 'D6', 'D7'] #DBR, DR, etc
def doU(self):
self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5], self.uSide[6], self.uSide[7] = self.uSide[6], self.uSide[7], self.uSide[0], self.uSide[1], self.uSide[2], self.uSide[3], self.uSide[4], self.uSide[5]
self.fSide[5], self.lSide[5], self.bSide[5], self.rSide[5] = self.rSide[5], self.fSide[5], self.lSide[5], self.bSide[5]
self.fSide[6], self.lSide[6], self.bSide[6], self.rSide[6] = self.rSide[6], self.fSide[6], self.lSide[6], self.bSide[6]
self.fSide[7], self.lSide[7], self.bSide[7], self.rSide[7] = self.rSide[7], self.fSide[7], self.lSide[7], self.bSide[7]
def doR(self):
self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5], self.rSide[6], self.rSide[7] = self.rSide[6], self.rSide[7], self.rSide[0], self.rSide[1], self.rSide[2], self.rSide[3], self.rSide[4], self.rSide[5]
self.fSide[7], self.uSide[7], self.bSide[3], self.dSide[7] = self.dSide[7], self.fSide[7], self.uSide[7], self.bSide[3]
self.fSide[0], self.uSide[0], self.bSide[4], self.dSide[0] = self.dSide[0], self.fSide[0], self.uSide[0], self.bSide[4]
self.fSide[1], self.uSide[1], self.bSide[5], self.dSide[1] = self.dSide[1], self.fSide[1], self.uSide[1], self.bSide[5]
def doF(self):
self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5], self.fSide[6], self.fSide[7] = self.fSide[6], self.fSide[7], self.fSide[0], self.fSide[1], self.fSide[2], self.fSide[3], self.fSide[4], self.fSide[5]
self.uSide[1], self.rSide[3], self.dSide[5], self.lSide[7] = self.lSide[7], self.uSide[1], self.rSide[3], self.dSide[5]
self.uSide[2], self.rSide[4], self.dSide[6], self.lSide[0] = self.lSide[0], self.uSide[2], self.rSide[4], self.dSide[6]
self.uSide[3], self.rSide[5], self.dSide[7], self.lSide[1] = self.lSide[1], self.uSide[3], self.rSide[5], self.dSide[7]
def returnCrazy(self):
l = []
l.append(self.uSide)
l.append(self.fSide)
l.append(self.lSide)
l.append(self.bSide)
l.append(self.rSide)
return l#; print l
def doAlg(self, algString):
ialg = algString.replace('(', '') #get rid of unwanted
ialg = ialg.replace(')', '') # or otherwise unneeded characters
ialg = ialg.replace("2'", '2') # incl. whitespace, paren., 2's
ialg = ialg.replace(' ', ' ')
parts = ialg.split(' ') #Divide the alg up into individual moves
#parts.reverse()
for part in parts:
if part == 'U': self.doU()
elif part == 'U2': self.doU(); self.doU()
elif part == "U'": self.doU(); self.doU(); self.doU()
elif part == 'F': self.doF()
elif part == 'F2': self.doF(); self.doF()
elif part == "F'": self.doF(); self.doF(); self.doF()
elif part == 'R': self.doR()
elif part == 'R2': self.doR(); self.doR()
elif part == "R'": self.doR(); self.doR(); self.doR()
############### Writing the functions: start ###############
f = open('C:/Users/skorick/Desktop/all/test/test.txt', 'w')
k = "#"*50 + '\n'
f.write(k)
f.write(' def doCrazy(self, a):\t#code generated with writing.py\n')
f.write(' temp = self\n\n')
f.write(' if a == "":\t#default (finished) case:\n')
f.write(' pass\n\n')
for x in range(1,len(algs)): #write a conditional procedure for each of these
f.write(' elif a == "' + algs[x] + '":\t#' + str(x) + '\n')
new = MyCube(); new.doAlg(algs[x])
a = new.returnCrazy(); print a, '\n\n'
f.write(' ')
######################################################################
############################ U: ############################
for x in range(0,8):#uSide
f.write('temp.' + a[0][x][0].lower() + 'Side[' + str(a[0][x][1]) + '] = self.uSide[' + str(x))
f.write(']; ') if x<7 else f.write(']')
############################ F: ############################
f.write('\n\n ')
for yf in range(5,8):
f.write('temp.' + a[1][yf][0].lower() + 'Side[' + str(a[1][yf][1]) + '] = self.fSide[' + str(yf))
f.write(']; ') if yf<7 else f.write(']')
############################ L: ############################
f.write('\n ')
for yl in range(5,8):
f.write('temp.' + a[2][yl][0].lower() + 'Side[' + str(a[2][yl][1]) + '] = self.lSide[' + str(yl))
f.write(']; ') if yl<7 else f.write(']')
############################ B: ############################
f.write('\n ')
for yb in range(5,8):
f.write('temp.' + a[3][yb][0].lower() + 'Side[' + str(a[3][yb][1]) + '] = self.bSide[' + str(yb))
f.write(']; ') if yb<7 else f.write(']')
############################ R: ############################
f.write('\n ')
for yr in range(5,8):
f.write('temp.' + a[4][yr][0].lower() + 'Side[' + str(a[4][yr][1]) + '] = self.rSide[' + str(yr))
f.write(']; ') if yr<7 else f.write(']')
############################ finish ############################
######################################################################
f.write('\n self.resetSelf([temp.uSide, temp.fSide, temp.lSide, temp.bSide, temp.rSide, temp.dSide])\n\n')
f.write(' else: print "BAD"\n')
f.write(k)
f.close()
############### Writing the functions: end ###############
print time.time()-start
aW1wb3J0IHRpbWU7IHN0YXJ0ID0gdGltZS50aW1lKCkKCmFsZ3MgPSBbIiIsCiJSJyBVIFInIFUnIFInIFUnIFInIFUgUiBVIFIyIiwKIlIgVScgUiBVIFIgVSBSIFUnIFInIFUnIFIyIiwKIlIyIFUyIFIgVTIgUjIgVTIgUjIgVTIgUiBVMiBSMiIsCiJSMiBVIFIyIFUnIFIyIEYyIFIyIFUnIEYyIFUgUjIgRjIiLAoiUiBVJyBSIEYyIFInIFUgUicgVScgUjIgRjIgUjIiLAoiUjIgRjIgUjIgVSBSIFUnIFIgRjIgUicgVSBSJyIsCiJSIFUgUicgVSBSJyBVJyBSIEYnIFIgVSBSJyBVJyBSJyBGIFIyIFUnIFIyIFUgUiIsCiJGJyBVMiBSJyBVIEYgVScgRicgVScgUiBVJyBGIiwKIlIgVSBSJyBGJyBSIFUgUicgVScgUicgRiBSMiBVJyBSJyIsCiJSJyBVMiBSIFUyIFInIEYgUiBVIFInIFUnIFInIEYnIFIyIiwKIkYnIFInIFUnIFIgRicgUicgVSBGJyBVJyBGJyBVIEYgUiBGMiIsCiJGMiBSMiBVJyBSJyBVJyBSIEYyIFInIFUgUiBGMiBVIFIyIEYyIiwKIkYyIFIyIFUnIEYyIFInIFUnIFIgRjIgUicgVSBSIFUgUjIgRjIiLAoiUicgVScgUjIgVScgUjIgVScgUiBVMiBSMiBGIFUgUicgVScgUiBGJyBSIiwKIlInIEYgUicgVSBSIFUnIEYnIFIyIFUyIFInIFUgUjIgVSBSMiBVIFIiLAoiRicgUiBVIFInIFUnIFInIEYgUjIgRiBVJyBSJyBVJyBSIFUgRicgUiciLAoiUicgVSBSJyBGIFIgRicgUiBVJyBSJyBGJyBVIEYgUiBVIFInIFUnIFIiLAoiUiBVIFInIFUnIFInIEYgUjIgVScgUicgVScgUiBVIFInIEYnIiwKIkYgUiBVJyBSJyBVJyBSIFUgUicgRicgUiBVIFInIFUnIFInIEYgUiBGJyIsCiJGJyBVMiBGJyBVJyBSJyBGJyBSMiBVJyBSJyBVIFInIEYgUiBVJyBGIiwKIlIgVScgUiBVIEYgUiBGMiBVIEYgVScgRiBSJyBGJyBSJyJdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjbGFzcyBNeUN1YmU6CiAgICAiIiJBIHZpcnR1YWwgM3gzeDMgbWF0cml4IiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi51U2lkZSA9IFsnVTAnLCAnVTEnLCAnVTInLCAnVTMnLCAnVTQnLCAnVTUnLCAnVTYnLCAnVTcnXSAjVVJGLCBVRiwgZXRjCiAgICAgICAgc2VsZi5mU2lkZSA9IFsnRjAnLCAnRjEnLCAnRjInLCAnRjMnLCAnRjQnLCAnRjUnLCAnRjYnLCAnRjcnXSAjRlJELCBGRCwgZXRjCiAgICAgICAgc2VsZi5sU2lkZSA9IFsnTDAnLCAnTDEnLCAnTDInLCAnTDMnLCAnTDQnLCAnTDUnLCAnTDYnLCAnTDcnXSAjTEZELCBMRCwgZXRjCiAgICAgICAgc2VsZi5iU2lkZSA9IFsnQjAnLCAnQjEnLCAnQjInLCAnQjMnLCAnQjQnLCAnQjUnLCAnQjYnLCAnQjcnXSAjQlJELCBCRCwgZXRjCiAgICAgICAgc2VsZi5yU2lkZSA9IFsnUjAnLCAnUjEnLCAnUjInLCAnUjMnLCAnUjQnLCAnUjUnLCAnUjYnLCAnUjcnXSAjUkJELCBSRCwgZXRjCiAgICAgICAgc2VsZi5kU2lkZSA9IFsnRDAnLCAnRDEnLCAnRDInLCAnRDMnLCAnRDQnLCAnRDUnLCAnRDYnLCAnRDcnXSAjREJSLCBEUiwgZXRjCgogICAgZGVmIGRvVShzZWxmKToKICAgICAgICBzZWxmLnVTaWRlWzBdLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnVTaWRlWzJdLCBzZWxmLnVTaWRlWzNdLCBzZWxmLnVTaWRlWzRdLCBzZWxmLnVTaWRlWzVdLCBzZWxmLnVTaWRlWzZdLCBzZWxmLnVTaWRlWzddID0gc2VsZi51U2lkZVs2XSwgc2VsZi51U2lkZVs3XSwgc2VsZi51U2lkZVswXSwgc2VsZi51U2lkZVsxXSwgc2VsZi51U2lkZVsyXSwgc2VsZi51U2lkZVszXSwgc2VsZi51U2lkZVs0XSwgc2VsZi51U2lkZVs1XQoKICAgICAgICBzZWxmLmZTaWRlWzVdLCBzZWxmLmxTaWRlWzVdLCBzZWxmLmJTaWRlWzVdLCBzZWxmLnJTaWRlWzVdID0gc2VsZi5yU2lkZVs1XSwgc2VsZi5mU2lkZVs1XSwgc2VsZi5sU2lkZVs1XSwgc2VsZi5iU2lkZVs1XQogICAgICAgIHNlbGYuZlNpZGVbNl0sIHNlbGYubFNpZGVbNl0sIHNlbGYuYlNpZGVbNl0sIHNlbGYuclNpZGVbNl0gPSBzZWxmLnJTaWRlWzZdLCBzZWxmLmZTaWRlWzZdLCBzZWxmLmxTaWRlWzZdLCBzZWxmLmJTaWRlWzZdCiAgICAgICAgc2VsZi5mU2lkZVs3XSwgc2VsZi5sU2lkZVs3XSwgc2VsZi5iU2lkZVs3XSwgc2VsZi5yU2lkZVs3XSA9IHNlbGYuclNpZGVbN10sIHNlbGYuZlNpZGVbN10sIHNlbGYubFNpZGVbN10sIHNlbGYuYlNpZGVbN10KCiAgICBkZWYgZG9SKHNlbGYpOgogICAgICAgIHNlbGYuclNpZGVbMF0sIHNlbGYuclNpZGVbMV0sIHNlbGYuclNpZGVbMl0sIHNlbGYuclNpZGVbM10sIHNlbGYuclNpZGVbNF0sIHNlbGYuclNpZGVbNV0sIHNlbGYuclNpZGVbNl0sIHNlbGYuclNpZGVbN10gPSBzZWxmLnJTaWRlWzZdLCBzZWxmLnJTaWRlWzddLCBzZWxmLnJTaWRlWzBdLCBzZWxmLnJTaWRlWzFdLCBzZWxmLnJTaWRlWzJdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLnJTaWRlWzRdLCBzZWxmLnJTaWRlWzVdCiAgICAgICAgICAKICAgICAgICBzZWxmLmZTaWRlWzddLCBzZWxmLnVTaWRlWzddLCBzZWxmLmJTaWRlWzNdLCBzZWxmLmRTaWRlWzddID0gc2VsZi5kU2lkZVs3XSwgc2VsZi5mU2lkZVs3XSwgc2VsZi51U2lkZVs3XSwgc2VsZi5iU2lkZVszXQogICAgICAgIHNlbGYuZlNpZGVbMF0sIHNlbGYudVNpZGVbMF0sIHNlbGYuYlNpZGVbNF0sIHNlbGYuZFNpZGVbMF0gPSBzZWxmLmRTaWRlWzBdLCBzZWxmLmZTaWRlWzBdLCBzZWxmLnVTaWRlWzBdLCBzZWxmLmJTaWRlWzRdCiAgICAgICAgc2VsZi5mU2lkZVsxXSwgc2VsZi51U2lkZVsxXSwgc2VsZi5iU2lkZVs1XSwgc2VsZi5kU2lkZVsxXSA9IHNlbGYuZFNpZGVbMV0sIHNlbGYuZlNpZGVbMV0sIHNlbGYudVNpZGVbMV0sIHNlbGYuYlNpZGVbNV0KCiAgICBkZWYgZG9GKHNlbGYpOgogICAgICAgIHNlbGYuZlNpZGVbMF0sIHNlbGYuZlNpZGVbMV0sIHNlbGYuZlNpZGVbMl0sIHNlbGYuZlNpZGVbM10sIHNlbGYuZlNpZGVbNF0sIHNlbGYuZlNpZGVbNV0sIHNlbGYuZlNpZGVbNl0sIHNlbGYuZlNpZGVbN10gPSBzZWxmLmZTaWRlWzZdLCBzZWxmLmZTaWRlWzddLCBzZWxmLmZTaWRlWzBdLCBzZWxmLmZTaWRlWzFdLCBzZWxmLmZTaWRlWzJdLCBzZWxmLmZTaWRlWzNdLCBzZWxmLmZTaWRlWzRdLCBzZWxmLmZTaWRlWzVdCgogICAgICAgIHNlbGYudVNpZGVbMV0sIHNlbGYuclNpZGVbM10sIHNlbGYuZFNpZGVbNV0sIHNlbGYubFNpZGVbN10gPSBzZWxmLmxTaWRlWzddLCBzZWxmLnVTaWRlWzFdLCBzZWxmLnJTaWRlWzNdLCBzZWxmLmRTaWRlWzVdCiAgICAgICAgc2VsZi51U2lkZVsyXSwgc2VsZi5yU2lkZVs0XSwgc2VsZi5kU2lkZVs2XSwgc2VsZi5sU2lkZVswXSA9IHNlbGYubFNpZGVbMF0sIHNlbGYudVNpZGVbMl0sIHNlbGYuclNpZGVbNF0sIHNlbGYuZFNpZGVbNl0KICAgICAgICBzZWxmLnVTaWRlWzNdLCBzZWxmLnJTaWRlWzVdLCBzZWxmLmRTaWRlWzddLCBzZWxmLmxTaWRlWzFdID0gc2VsZi5sU2lkZVsxXSwgc2VsZi51U2lkZVszXSwgc2VsZi5yU2lkZVs1XSwgc2VsZi5kU2lkZVs3XQogICAgCiAgICBkZWYgcmV0dXJuQ3Jhenkoc2VsZik6CiAgICAgICAgbCA9IFtdCiAgICAgICAgbC5hcHBlbmQoc2VsZi51U2lkZSkKICAgICAgICBsLmFwcGVuZChzZWxmLmZTaWRlKQogICAgICAgIGwuYXBwZW5kKHNlbGYubFNpZGUpCiAgICAgICAgbC5hcHBlbmQoc2VsZi5iU2lkZSkKICAgICAgICBsLmFwcGVuZChzZWxmLnJTaWRlKQogICAgICAgIHJldHVybiBsIzsgcHJpbnQgbAogICAgICAgICAKICAgIGRlZiBkb0FsZyhzZWxmLCBhbGdTdHJpbmcpOgogICAgICAgIGlhbGcgPSBhbGdTdHJpbmcucmVwbGFjZSgnKCcsICcnKSAgICAgI2dldCByaWQgb2YgdW53YW50ZWQKICAgICAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCcpJywgJycpICAgICAgICAgICMgb3Igb3RoZXJ3aXNlIHVubmVlZGVkIGNoYXJhY3RlcnMKICAgICAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCIyJyIsICcyJykgICAgICAgICMgaW5jbC4gd2hpdGVzcGFjZSwgcGFyZW4uLCAyJ3MKICAgICAgICBpYWxnID0gaWFsZy5yZXBsYWNlKCcgICcsICcgJykKICAgICAgICBwYXJ0cyA9IGlhbGcuc3BsaXQoJyAnKSAgICAgICAgICAgICAgICNEaXZpZGUgdGhlIGFsZyB1cCBpbnRvIGluZGl2aWR1YWwgbW92ZXMKICAgICAgICAKICAgICAgICAjcGFydHMucmV2ZXJzZSgpCiAgICAgICAgCiAgICAgICAgZm9yIHBhcnQgaW4gcGFydHM6CiAgICAgICAgICAgIGlmIHBhcnQgPT0gICAnVSc6ICBzZWxmLmRvVSgpCiAgICAgICAgICAgIGVsaWYgcGFydCA9PSAnVTInOiBzZWxmLmRvVSgpOyBzZWxmLmRvVSgpCiAgICAgICAgICAgIGVsaWYgcGFydCA9PSAiVSciOiBzZWxmLmRvVSgpOyBzZWxmLmRvVSgpOyBzZWxmLmRvVSgpCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZWxpZiBwYXJ0ID09ICdGJzogIHNlbGYuZG9GKCkKICAgICAgICAgICAgZWxpZiBwYXJ0ID09ICdGMic6IHNlbGYuZG9GKCk7IHNlbGYuZG9GKCkKICAgICAgICAgICAgZWxpZiBwYXJ0ID09ICJGJyI6IHNlbGYuZG9GKCk7IHNlbGYuZG9GKCk7IHNlbGYuZG9GKCkKICAgICAgICAgIAogICAgICAgICAgICBlbGlmIHBhcnQgPT0gJ1InOiAgc2VsZi5kb1IoKQogICAgICAgICAgICBlbGlmIHBhcnQgPT0gJ1IyJzogc2VsZi5kb1IoKTsgc2VsZi5kb1IoKQogICAgICAgICAgICBlbGlmIHBhcnQgPT0gIlInIjogc2VsZi5kb1IoKTsgc2VsZi5kb1IoKTsgc2VsZi5kb1IoKQogICAgICAgIAojIyMjIyMjIyMjIyMjIyMgV3JpdGluZyB0aGUgZnVuY3Rpb25zOiBzdGFydCAjIyMjIyMjIyMjIyMjIyMKZiA9IG9wZW4oJ0M6L1VzZXJzL3Nrb3JpY2svRGVza3RvcC9hbGwvdGVzdC90ZXN0LnR4dCcsICd3JykKayA9ICIjIio1MCArICdcbicKCmYud3JpdGUoaykKZi53cml0ZSgnICAgIGRlZiBkb0NyYXp5KHNlbGYsIGEpOlx0I2NvZGUgZ2VuZXJhdGVkIHdpdGggd3JpdGluZy5weVxuJykKCmYud3JpdGUoJyAgICAgICAgdGVtcCA9IHNlbGZcblxuJykKZi53cml0ZSgnICAgICAgICBpZiBhID09ICIiOlx0I2RlZmF1bHQgKGZpbmlzaGVkKSBjYXNlOlxuJykKCmYud3JpdGUoJyAgICAgICAgICAgIHBhc3NcblxuJykKCgpmb3IgeCBpbiByYW5nZSgxLGxlbihhbGdzKSk6ICN3cml0ZSBhIGNvbmRpdGlvbmFsIHByb2NlZHVyZSBmb3IgZWFjaCBvZiB0aGVzZQogICAgCiAgICBmLndyaXRlKCcgICAgICAgIGVsaWYgYSA9PSAiJyArIGFsZ3NbeF0gKyAnIjpcdCMnICsgc3RyKHgpICsgJ1xuJykKICAgIG5ldyA9IE15Q3ViZSgpOyBuZXcuZG9BbGcoYWxnc1t4XSkKCiAgICBhID0gbmV3LnJldHVybkNyYXp5KCk7IHByaW50IGEsICdcblxuJwogICAgCiAgICBmLndyaXRlKCcgICAgICAgICAgICAnKQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgICBVOiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIGZvciB4IGluIHJhbmdlKDAsOCk6I3VTaWRlICAKICAgICAgICBmLndyaXRlKCd0ZW1wLicgKyBhWzBdW3hdWzBdLmxvd2VyKCkgKyAgJ1NpZGVbJyArIHN0cihhWzBdW3hdWzFdKSArICddID0gc2VsZi51U2lkZVsnICsgc3RyKHgpKQoKICAgICAgICBmLndyaXRlKCddOyAnKSBpZiB4PDcgZWxzZSBmLndyaXRlKCddJykKICAgICAgICAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAgIEY6ICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgZi53cml0ZSgnXG5cbiAgICAgICAgICAgICcpCiAgICBmb3IgeWYgaW4gcmFuZ2UoNSw4KToKICAgICAgICBmLndyaXRlKCd0ZW1wLicgKyBhWzFdW3lmXVswXS5sb3dlcigpICsgICdTaWRlWycgKyBzdHIoYVsxXVt5Zl1bMV0pICsgJ10gPSBzZWxmLmZTaWRlWycgKyBzdHIoeWYpKQogICAgICAgIAogICAgICAgIGYud3JpdGUoJ107ICcpIGlmIHlmPDcgZWxzZSBmLndyaXRlKCddJykKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAgIEw6ICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgZi53cml0ZSgnXG4gICAgICAgICAgICAnKQogICAgZm9yIHlsIGluIHJhbmdlKDUsOCk6CiAgICAgICAgZi53cml0ZSgndGVtcC4nICsgYVsyXVt5bF1bMF0ubG93ZXIoKSArICAnU2lkZVsnICsgc3RyKGFbMl1beWxdWzFdKSArICddID0gc2VsZi5sU2lkZVsnICsgc3RyKHlsKSkKICAgICAgICAKICAgICAgICBmLndyaXRlKCddOyAnKSBpZiB5bDw3IGVsc2UgZi53cml0ZSgnXScpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgICBCOiAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIGYud3JpdGUoJ1xuICAgICAgICAgICAgJykKICAgIGZvciB5YiBpbiByYW5nZSg1LDgpOgogICAgICAgIGYud3JpdGUoJ3RlbXAuJyArIGFbM11beWJdWzBdLmxvd2VyKCkgKyAgJ1NpZGVbJyArIHN0cihhWzNdW3liXVsxXSkgKyAnXSA9IHNlbGYuYlNpZGVbJyArIHN0cih5YikpCiAgICAgICAgCiAgICAgICAgZi53cml0ZSgnXTsgJykgaWYgeWI8NyBlbHNlIGYud3JpdGUoJ10nKQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgICAgUjogICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICBmLndyaXRlKCdcbiAgICAgICAgICAgICcpCiAgICBmb3IgeXIgaW4gcmFuZ2UoNSw4KToKICAgICAgICBmLndyaXRlKCd0ZW1wLicgKyBhWzRdW3lyXVswXS5sb3dlcigpICsgICdTaWRlWycgKyBzdHIoYVs0XVt5cl1bMV0pICsgJ10gPSBzZWxmLnJTaWRlWycgKyBzdHIoeXIpKQoKICAgICAgICBmLndyaXRlKCddOyAnKSBpZiB5cjw3IGVsc2UgZi53cml0ZSgnXScpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgZmluaXNoICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogICAgZi53cml0ZSgnXG4gICAgICAgICAgICBzZWxmLnJlc2V0U2VsZihbdGVtcC51U2lkZSwgdGVtcC5mU2lkZSwgdGVtcC5sU2lkZSwgdGVtcC5iU2lkZSwgdGVtcC5yU2lkZSwgdGVtcC5kU2lkZV0pXG5cbicpCgpmLndyaXRlKCcgICAgICAgIGVsc2U6IHByaW50ICJCQUQiXG4nKQpmLndyaXRlKGspCmYuY2xvc2UoKQojIyMjIyMjIyMjIyMjIyMgV3JpdGluZyB0aGUgZnVuY3Rpb25zOiBlbmQgIyMjIyMjIyMjIyMjIyMjCgpwcmludCAgdGltZS50aW1lKCktc3RhcnQK