# your code goes here
from math import *
from random import *
from time import *
cst = float ( 'inf' )
global x, y, X, r1, worst, lam
global g, geq, gen
global vals
global f, f_new, T, O1, O2
def getH( g) :
if g <= 0 :
return 0
else :
return 1
def getHeq( geq) :
if geq == 0 :
return 0
else :
return 1
def ineq( x) :
g = [ 0 ]
#g1 = x[1]+5
#g.append(g1)
return g
def eq( x) :
geq = [ 0 ]
#geq1 = x[1]+5
#geq.append(geq1)
return geq
def fobj( x) :
for i in range ( var+1 ) :
if x[ i] > 0 :
y[ i] = 1
else :
y[ i] = 0
#print("x =",x)
#print("y =",y)
Z = abs ( x[ 1 ] ) +abs ( x[ 2 ] ) +abs ( x[ 3 ] ) +abs ( x[ 4 ] ) +abs ( x[ 5 ] ) +abs ( x[ 6 ] ) +abs ( x[ 7 ] ) +abs ( x[ 8 ] ) +abs ( x[ 9 ] ) +abs ( x[ 10 ] ) +abs ( x[ 1 ] ) *abs ( x[ 2 ] ) *abs ( x[ 3 ] ) *abs ( x[ 4 ] ) *abs ( x[ 5 ] ) *abs ( x[ 6 ] ) *abs ( x[ 7 ] ) *abs ( x[ 8 ] ) *abs ( x[ 9 ] ) *abs ( x[ 10 ] )
g = ineq( x)
geq = eq( x)
for k in range ( 1 , len ( g) ) :
Z = Z+lam*( g[ k] **2 ) *getH( g[ k] )
for k in range ( 1 , len ( geq) ) :
Z = Z+lam*( geq[ k] **2 ) *getHeq( geq[ k] )
return Z
pop = 30
var = 10
maxGen = 4500
mini = [ 0 , -5 , -5 , -5 , -5 , -5 , -5 , -5 , -5 , -5 , -5 ]
#maxi = [0, 1, 1, 3, 1, 45, 1, 35, 1, 92, 1, 93, 40, 55, 1, 1, 1, 1, 61, 60, 1, 1, 25, 40, 93, 1, 1, 1, 1, 3, 3, 95, 93, 3, 95, 96, 90, 3, 3, 40, 95, 50, 3, 3, 37, 3, 3, 35, 70, 93, 45]
maxi = [ 0 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 ]
#maxi = [0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30]
#lam = 7
O1 = 1.00000000027
O2 = 1.0000957
g = [ ]
geq = [ ]
x = [ 0 for i in range ( var+1 ) ]
X = [ [ 0 for i in range ( var+1 ) ] for j in range ( pop+1 ) ]
M = [ [ 0 for i in range ( var+1 ) ] for j in range ( pop+1 ) ]
y = [ 0 for i in range ( var+1 ) ]
f = [ 0 for i in range ( pop+1 ) ]
f[ 0 ] = cst
for j in range ( 1 , var+1 ) :
for i in range ( 1 , pop+1 ) :
X[ i] [ j] = mini[ j] +( maxi[ j] -mini[ j] ) *random ( )
M[ i] [ j] = X[ i] [ j]
def method_1( ) :
global r1, worst
if gen == 1 :
for i in range ( 1 , pop+1 ) :
f[ i] = fobj( X[ i] )
if i == 1 :
best = i
worst = i
else :
if f[ best] > f[ i] :
best = i
if f[ worst] < f[ i] :
worst = i
r1 = best
X_best = X[ best]
X_worst = X[ worst]
else :
for i in range ( 1 , pop+1 ) :
if i == 1 :
best = i
worst = i
else :
if f[ best] > f[ i] :
best = i
if f[ worst] < f[ i] :
worst = i
X_best = X[ best]
X_worst = X[ worst]
X_t = [ [ 0 for i in range ( var+1 ) ] for j in range ( pop+1 ) ]
for i in range ( 1 , pop+1 ) :
for j in range ( 1 , var+1 ) :
X_t[ i] [ j] = X[ i] [ j]
for i in range ( 1 , pop+1 ) :
for j in range ( 1 , var+1 ) :
vals = X[ i] [ j] +random ( ) *( X_best[ j] -abs ( X[ i] [ j] ) ) -random ( ) *( X_worst[ j] -abs ( X[ i] [ j] ) )
if vals < mini[ j] :
X_t[ i] [ j] = mini[ j]
elif vals > maxi[ j] :
X_t[ i] [ j] = maxi[ j]
else :
X_t[ i] [ j] = vals
f_new = [ 0 ]
for i in range ( 1 , pop+1 ) :
f_new.append ( fobj( X_t[ i] ) )
for i in range ( 1 , pop+1 ) :
if f[ i] > f_new[ i] :
X[ i] = X_t[ i]
f[ i] = f_new[ i]
if i == 1 :
worst = i
elif f[ worst] < f[ i] :
worst = i
def method_2( ) :
p = [ i for i in range ( 1 , pop+1 ) ]
p.remove ( r1)
r2 = choice( p)
p.remove ( r2)
r3 = choice( p)
ex = 0
X_child = [ 0 ]
for i in range ( 1 , var+1 ) :
R1 = X[ r1] [ i]
R2 = X[ r2] [ i]
R3 = X[ r3] [ i]
fR1 = fobj( X[ r1] )
fR2 = fobj( X[ r2] )
fR3 = fobj( X[ r3] )
den = ( R2-R3) *fR1+( R3-R1) *fR2+( R1-R2) *fR3
tries = 0
while den == 0 :
tries += 1
if tries > 10 :
ex = 1
break
r3 = choice( p)
R3 = X[ r3] [ i]
fR3 = fobj( X[ r3] )
den = ( R2-R3) *fR1+( R3-R1) *fR2+( R1-R2) *fR3
if ex == 1 :
break
val = 0.5 *( float ( ( R2**2 -R3**2 ) *fR1+( R3**2 -R1**2 ) *fR2+( R1**2 -R2**2 ) *fR3) /( ( R2-R3) *fR1+( R3-R1) *fR2+( R1-R2) *fR3) )
if val < mini[ j] :
X_child.append ( mini[ j] )
elif val > maxi[ j] :
X_child.append ( maxi[ j] )
else :
X_child.append ( val)
if ex == 0 :
f_child = fobj( X_child)
if f_child < f[ worst] :
f[ worst] = f_child
X[ worst] = X_child
def sol( ) :
print ( "\n Solution table:\n " )
s = ""
for i in range ( 1 , var+1 ) :
s += "x" +str ( i) +" "
print ( s+"f(x)\n " )
for i in range ( 1 , pop+1 ) :
s = ""
for j in range ( 1 , var+1 ) :
s += str ( X[ i] [ j] ) +" "
print ( s+" " +str ( f[ i] ) +"\n " )
gen = 1
T = float ( 'inf' )
final = 1
start_time = time ( )
while gen <= maxGen:
p = ( O2 - O1) /( 1 + e**( ( 20 *( -gen+( maxGen/4 ) ) ) /maxGen) ) + O1
lam = 10 **p
method_1( )
if T >= min ( f) :
T = min ( T, min ( f) )
for i in range ( 1 , pop+1 ) :
if f[ i] == T:
vals = X[ i]
break
final = f.index ( min ( f) )
T = min ( T, min ( f) )
#print("Gen "+str(gen)+":",T)
gen += 1
#sol()
'''final = 1
for i in range (1, pop+1):
if f[final] > f[i]:
final = i
'''
#sol()
execution_time = time ( ) -start_time
print ( "Execution time in seconds: " +str ( execution_time) )
print ( "Final solution:\n " )
print ( "Values:" )
for i in range ( 1 , var+1 ) :
print ( "x" +str ( i) +" = " +str ( X[ final] [ i] ) )
x = X[ final]
for i in range ( var+1 ) :
if x[ i] > 0 :
y[ i] = 1
else :
y[ i] = 0
#Enter equation here
Z = abs ( x[ 1 ] ) +abs ( x[ 2 ] ) +abs ( x[ 3 ] ) +abs ( x[ 4 ] ) +abs ( x[ 5 ] ) +abs ( x[ 6 ] ) +abs ( x[ 7 ] ) +abs ( x[ 8 ] ) +abs ( x[ 9 ] ) +abs ( x[ 10 ] ) +abs ( x[ 1 ] ) *abs ( x[ 2 ] ) *abs ( x[ 3 ] ) *abs ( x[ 4 ] ) *abs ( x[ 5 ] ) *abs ( x[ 6 ] ) *abs ( x[ 7 ] ) *abs ( x[ 8 ] ) *abs ( x[ 9 ] ) *abs ( x[ 10 ] )
#print("\nf(x) = "+str(T))
print ( "\n f(x) = " +str ( Z) )
x = vals
print ( "\n Final solution:\n " )
print ( "Values:" )
for i in range ( 1 , var+1 ) :
print ( "x" +str ( i) +" = " +str ( vals[ i] ) )
#x = X[final]
for i in range ( var+1 ) :
if x[ i] > 0 :
y[ i] = 1
else :
y[ i] = 0
Z = abs ( x[ 1 ] ) +abs ( x[ 2 ] ) +abs ( x[ 3 ] ) +abs ( x[ 4 ] ) +abs ( x[ 5 ] ) +abs ( x[ 6 ] ) +abs ( x[ 7 ] ) +abs ( x[ 8 ] ) +abs ( x[ 9 ] ) +abs ( x[ 10 ] ) +abs ( x[ 1 ] ) *abs ( x[ 2 ] ) *abs ( x[ 3 ] ) *abs ( x[ 4 ] ) *abs ( x[ 5 ] ) *abs ( x[ 6 ] ) *abs ( x[ 7 ] ) *abs ( x[ 8 ] ) *abs ( x[ 9 ] ) *abs ( x[ 10 ] )
#print("\nf(x) = "+str(T))
print ( "\n f(x) = " +str ( Z) )
#print()
#print()
#print(ineq(X[final]))
#print(g)
print ( )
print ( )
for j in range ( 1 , var+1 ) :
for i in range ( 1 , pop+1 ) :
X[ i] [ j] = M[ i] [ j]
gen = 1
T = float ( 'inf' )
final = 1
start_time = time ( )
while gen <= maxGen:
p = ( ( O2 - O1) /( 1 + e**( ( 20 *( -gen+( maxGen/4 ) ) ) /maxGen) ) ) + O1
lam = 10 **p
if gen % 2 == 1 :
method_1( )
else :
method_2( )
if T >= min ( f) :
T = min ( T, min ( f) )
for i in range ( 1 , pop+1 ) :
if f[ i] == T:
vals = X[ i]
break
final = f.index ( min ( f) )
T = min ( T, min ( f) )
#print("Gen "+str(gen)+":",T)
gen += 1
#sol()
'''final = 1
for i in range (1, pop+1):
if f[final] > f[i]:
final = i
'''
#sol()
execution_time = time ( ) -start_time
print ( "Execution time in seconds: " +str ( execution_time) )
print ( "Final solution:\n " )
print ( "Values:" )
for i in range ( 1 , var+1 ) :
print ( "x" +str ( i) +" = " +str ( X[ final] [ i] ) )
x = X[ final]
for i in range ( var+1 ) :
if x[ i] > 0 :
y[ i] = 1
else :
y[ i] = 0
#Enter equation here
Z = abs ( x[ 1 ] ) +abs ( x[ 2 ] ) +abs ( x[ 3 ] ) +abs ( x[ 4 ] ) +abs ( x[ 5 ] ) +abs ( x[ 6 ] ) +abs ( x[ 7 ] ) +abs ( x[ 8 ] ) +abs ( x[ 9 ] ) +abs ( x[ 10 ] ) +abs ( x[ 1 ] ) *abs ( x[ 2 ] ) *abs ( x[ 3 ] ) *abs ( x[ 4 ] ) *abs ( x[ 5 ] ) *abs ( x[ 6 ] ) *abs ( x[ 7 ] ) *abs ( x[ 8 ] ) *abs ( x[ 9 ] ) *abs ( x[ 10 ] )
#print("\nf(x) = "+str(T))
print ( "\n f(x) = " +str ( Z) )
#print(ineq(X[final]))
#print(g)
x = vals
print ( "\n Final solution:\n " )
print ( "Values:" )
for i in range ( 1 , var+1 ) :
print ( "x" +str ( i) +" = " +str ( vals[ i] ) )
#x = X[final]
for i in range ( var+1 ) :
if x[ i] > 0 :
y[ i] = 1
else :
y[ i] = 0
Z = abs ( x[ 1 ] ) +abs ( x[ 2 ] ) +abs ( x[ 3 ] ) +abs ( x[ 4 ] ) +abs ( x[ 5 ] ) +abs ( x[ 6 ] ) +abs ( x[ 7 ] ) +abs ( x[ 8 ] ) +abs ( x[ 9 ] ) +abs ( x[ 10 ] ) +abs ( x[ 1 ] ) *abs ( x[ 2 ] ) *abs ( x[ 3 ] ) *abs ( x[ 4 ] ) *abs ( x[ 5 ] ) *abs ( x[ 6 ] ) *abs ( x[ 7 ] ) *abs ( x[ 8 ] ) *abs ( x[ 9 ] ) *abs ( x[ 10 ] )
#print("\nf(x) = "+str(T))
print ( "\n f(x) = " +str ( Z) )
CiMgeW91ciBjb2RlIGdvZXMgaGVyZQpmcm9tIG1hdGggaW1wb3J0ICoKZnJvbSByYW5kb20gaW1wb3J0ICoKZnJvbSB0aW1lIGltcG9ydCAqCgpjc3QgPSBmbG9hdCgnaW5mJykKZ2xvYmFsIHgsIHksIFgsIHIxLCB3b3JzdCwgbGFtCmdsb2JhbCBnLCBnZXEsIGdlbgpnbG9iYWwgdmFscwpnbG9iYWwgZiwgZl9uZXcsIFQsIE8xLCBPMgoKZGVmIGdldEgoZyk6CiAgICBpZiBnIDw9IDA6CiAgICAgICAgcmV0dXJuIDAKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIDEKCmRlZiBnZXRIZXEoZ2VxKToKICAgIGlmIGdlcSA9PSAwOgogICAgICAgIHJldHVybiAwCiAgICBlbHNlOgogICAgICAgIHJldHVybiAxCiAgIApkZWYgaW5lcSh4KToKICAgIGcgPSBbMF0KICAgCiAgICAjZzEgPSB4WzFdKzUKICAgICNnLmFwcGVuZChnMSkKCiAgIAogICAgCiAgICAKICAgCiAgICByZXR1cm4gZwoKZGVmIGVxKHgpOgogICAgZ2VxID0gWzBdCiAgIAogICAgI2dlcTEgPSB4WzFdKzUKICAgICNnZXEuYXBwZW5kKGdlcTEpCgogICAgcmV0dXJuIGdlcQoKZGVmIGZvYmooeCk6CiAgICBmb3IgaSBpbiByYW5nZSAodmFyKzEpOgogICAgICAgIGlmIHhbaV0gPiAwOgogICAgICAgICAgICB5W2ldID0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlbaV0gPSAwCgogICAgI3ByaW50KCJ4ID0iLHgpCiAgICAjcHJpbnQoInkgPSIseSkKICAgCiAgICBaID0gYWJzKHhbMV0pK2Ficyh4WzJdKSthYnMoeFszXSkrYWJzKHhbNF0pK2Ficyh4WzVdKSthYnMoeFs2XSkrYWJzKHhbN10pK2Ficyh4WzhdKSthYnMoeFs5XSkrYWJzKHhbMTBdKSthYnMoeFsxXSkqYWJzKHhbMl0pKmFicyh4WzNdKSphYnMoeFs0XSkqYWJzKHhbNV0pKmFicyh4WzZdKSphYnMoeFs3XSkqYWJzKHhbOF0pKmFicyh4WzldKSphYnMoeFsxMF0pCgogICAgZyA9IGluZXEoeCkKICAgIGdlcSA9IGVxKHgpCgogICAgZm9yIGsgaW4gcmFuZ2UgKDEsIGxlbihnKSk6CiAgICAgICAgWiA9IForbGFtKihnW2tdKioyKSpnZXRIKGdba10pCiAgICAgICAKICAgIGZvciBrIGluIHJhbmdlICgxLCBsZW4oZ2VxKSk6CiAgICAgICAgWiA9IForbGFtKihnZXFba10qKjIpKmdldEhlcShnZXFba10pCiAgICAgICAKICAgIHJldHVybiBaCgpwb3AgPSAzMAp2YXIgPSAxMAptYXhHZW4gPSA0NTAwCm1pbmkgPVswLCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNSwgLTUsIC01LCAtNV0KI21heGkgPSBbMCwgMSwgMSwgMywgMSwgNDUsIDEsIDM1LCAxLCA5MiwgMSwgOTMsIDQwLCA1NSwgMSwgMSwgMSwgMSwgNjEsIDYwLCAxLCAxLCAyNSwgNDAsIDkzLCAxLCAxLCAxLCAxLCAzLCAzLCA5NSwgOTMsIDMsIDk1LCA5NiwgOTAsIDMsIDMsIDQwLCA5NSwgNTAsIDMsIDMsIDM3LCAzLCAzLCAzNSwgNzAsIDkzLCA0NV0KbWF4aSA9IFswLCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1XQojbWF4aSA9IFswLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMF0KI2xhbSA9IDcKTzEgPSAxLjAwMDAwMDAwMDI3Ck8yID0gMS4wMDAwOTU3CgpnID0gW10KZ2VxID0gW10KCnggPSBbMCBmb3IgaSBpbiByYW5nZSAodmFyKzEpXQpYID0gW1swIGZvciBpIGluIHJhbmdlICh2YXIrMSldIGZvciBqIGluIHJhbmdlIChwb3ArMSldCk0gPSBbWzAgZm9yIGkgaW4gcmFuZ2UgKHZhcisxKV0gZm9yIGogaW4gcmFuZ2UgKHBvcCsxKV0KCnkgPSBbMCBmb3IgaSBpbiByYW5nZSAodmFyKzEpXQoKZiA9IFswIGZvciBpIGluIHJhbmdlIChwb3ArMSldCmZbMF0gPSBjc3QKCmZvciBqIGluIHJhbmdlICgxLCB2YXIrMSk6CiAgICBmb3IgaSBpbiByYW5nZSAoMSwgcG9wKzEpOgogICAgICAgIFhbaV1bal0gPSBtaW5pW2pdKyhtYXhpW2pdLW1pbmlbal0pKnJhbmRvbSgpCiAgICAgICAgTVtpXVtqXSA9IFhbaV1bal0KCmRlZiBtZXRob2RfMSgpOgogICAgZ2xvYmFsIHIxLCB3b3JzdAogICAKICAgIGlmIGdlbiA9PSAxOgogICAgICAgIGZvciBpIGluIHJhbmdlICgxLCBwb3ArMSk6CiAgICAgICAgICAgIGZbaV0gPSBmb2JqKFhbaV0pCiAgICAgICAgICAgIGlmIGkgPT0gMToKICAgICAgICAgICAgICAgIGJlc3QgPSBpCiAgICAgICAgICAgICAgICB3b3JzdCA9IGkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGZbYmVzdF0gPiBmW2ldOgogICAgICAgICAgICAgICAgICAgIGJlc3QgPSBpCiAgICAgICAgICAgICAgICBpZiBmW3dvcnN0XSA8IGZbaV06CiAgICAgICAgICAgICAgICAgICAgd29yc3QgPSBpCgogICAgICAgIHIxID0gYmVzdAogICAgICAgIFhfYmVzdCA9IFhbYmVzdF0KICAgICAgICBYX3dvcnN0ID0gWFt3b3JzdF0KCiAgICBlbHNlOgogICAgICAgIGZvciBpIGluIHJhbmdlICgxLCBwb3ArMSk6CiAgICAgICAgICAgIGlmIGkgPT0gMToKICAgICAgICAgICAgICAgIGJlc3QgPSBpCiAgICAgICAgICAgICAgICB3b3JzdCA9IGkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGZbYmVzdF0gPiBmW2ldOgogICAgICAgICAgICAgICAgICAgIGJlc3QgPSBpCiAgICAgICAgICAgICAgICBpZiBmW3dvcnN0XSA8IGZbaV06CiAgICAgICAgICAgICAgICAgICAgd29yc3QgPSBpCgogICAgICAgIFhfYmVzdCA9IFhbYmVzdF0KICAgICAgICBYX3dvcnN0ID0gWFt3b3JzdF0KCgogICAgWF90ID0gW1swIGZvciBpIGluIHJhbmdlICh2YXIrMSldIGZvciBqIGluIHJhbmdlIChwb3ArMSldCgogICAgZm9yIGkgaW4gcmFuZ2UoMSwgcG9wKzEpOgogICAgICAgIGZvciBqIGluIHJhbmdlICgxLCB2YXIrMSk6CiAgICAgICAgICAgIFhfdFtpXVtqXSA9IFhbaV1bal0KICAgCiAgICBmb3IgaSBpbiByYW5nZSAoMSwgcG9wKzEpOgogICAgICAgIGZvciBqIGluIHJhbmdlICgxLCB2YXIrMSk6CiAgICAgICAgICAgIHZhbHMgPSBYW2ldW2pdK3JhbmRvbSgpKihYX2Jlc3Rbal0tYWJzKFhbaV1bal0pKS1yYW5kb20oKSooWF93b3JzdFtqXS1hYnMoWFtpXVtqXSkpCiAgICAgICAgICAgIGlmIHZhbHMgPCBtaW5pW2pdOgogICAgICAgICAgICAgICAgWF90W2ldW2pdID0gbWluaVtqXQogICAgICAgICAgICBlbGlmIHZhbHMgPiBtYXhpW2pdOgogICAgICAgICAgICAgICAgWF90W2ldW2pdID0gbWF4aVtqXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgWF90W2ldW2pdID0gdmFscwoKICAgIGZfbmV3ID0gWzBdCiAgICBmb3IgaSBpbiByYW5nZSAoMSwgcG9wKzEpOgogICAgICAgIGZfbmV3LmFwcGVuZChmb2JqKFhfdFtpXSkpCgogICAgZm9yIGkgaW4gcmFuZ2UgKDEsIHBvcCsxKToKICAgICAgICBpZiBmW2ldID4gZl9uZXdbaV06CiAgICAgICAgICAgIFhbaV0gPSBYX3RbaV0KICAgICAgICBmW2ldID0gZl9uZXdbaV0KICAgICAgIAogICAgICAgIGlmIGkgPT0gMToKICAgICAgICAgICAgd29yc3QgPSBpCiAgICAgICAgZWxpZiBmW3dvcnN0XSA8IGZbaV06CiAgICAgICAgICAgIHdvcnN0ID0gaQoKZGVmIG1ldGhvZF8yKCk6CiAgICBwID0gW2kgZm9yIGkgaW4gcmFuZ2UgKDEsIHBvcCsxKV0KICAgIHAucmVtb3ZlKHIxKQoKICAgIHIyID0gY2hvaWNlKHApCiAgICBwLnJlbW92ZShyMikKICAgIHIzID0gY2hvaWNlKHApCiAgICBleCA9IDAKICAgCiAgICBYX2NoaWxkID0gWzBdCgogICAgZm9yIGkgaW4gcmFuZ2UgKDEsIHZhcisxKToKICAgICAgICBSMSA9IFhbcjFdW2ldCiAgICAgICAgUjIgPSBYW3IyXVtpXQogICAgICAgIFIzID0gWFtyM11baV0KCiAgICAgICAgZlIxID0gZm9iaihYW3IxXSkKICAgICAgICBmUjIgPSBmb2JqKFhbcjJdKQogICAgICAgIGZSMyA9IGZvYmooWFtyM10pCgogICAgICAgIGRlbiA9IChSMi1SMykqZlIxKyhSMy1SMSkqZlIyKyhSMS1SMikqZlIzCiAgICAgICAgdHJpZXMgPSAwCiAgICAgICAgd2hpbGUgZGVuID09IDA6CiAgICAgICAgICAgIHRyaWVzICs9IDEKICAgICAgICAgICAgaWYgdHJpZXMgPiAxMDoKICAgICAgICAgICAgICAgIGV4ID0gMQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgcjMgPSBjaG9pY2UocCkKICAgICAgICAgICAgUjMgPSBYW3IzXVtpXQogICAgICAgICAgICBmUjMgPSBmb2JqKFhbcjNdKQogICAgICAgICAgICBkZW4gPSAoUjItUjMpKmZSMSsoUjMtUjEpKmZSMisoUjEtUjIpKmZSMwoKICAgICAgICBpZiBleCA9PSAxOgogICAgICAgICAgICBicmVhawogICAgICAgIHZhbCA9IDAuNSooZmxvYXQoKFIyKioyLVIzKioyKSpmUjErKFIzKioyLVIxKioyKSpmUjIrKFIxKioyLVIyKioyKSpmUjMpLygoUjItUjMpKmZSMSsoUjMtUjEpKmZSMisoUjEtUjIpKmZSMykpCiAgICAgICAgaWYgdmFsIDwgbWluaVtqXToKICAgICAgICAgICAgWF9jaGlsZC5hcHBlbmQobWluaVtqXSkKICAgICAgICBlbGlmIHZhbCA+IG1heGlbal06CiAgICAgICAgICAgIFhfY2hpbGQuYXBwZW5kKG1heGlbal0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgWF9jaGlsZC5hcHBlbmQodmFsKQoKICAgIGlmIGV4ID09IDA6CiAgICAgICAgZl9jaGlsZCA9IGZvYmooWF9jaGlsZCkKCiAgICAgICAgaWYgZl9jaGlsZCA8IGZbd29yc3RdOgogICAgICAgICAgICBmW3dvcnN0XSA9IGZfY2hpbGQKICAgICAgICAgICAgWFt3b3JzdF0gPSBYX2NoaWxkCgpkZWYgc29sKCk6CiAgICBwcmludCgiXG5Tb2x1dGlvbiB0YWJsZTpcbiIpCiAgICBzID0gIiIKICAgIGZvciBpIGluIHJhbmdlICgxLCB2YXIrMSk6CiAgICAgICAgcyArPSAieCIrc3RyKGkpKyIgIgogICAgcHJpbnQocysiZih4KVxuIikKICAgCiAgICBmb3IgaSBpbiByYW5nZSAoMSwgcG9wKzEpOgogICAgICAgIHMgPSAiIgogICAgICAgIGZvciBqIGluIHJhbmdlICgxLCB2YXIrMSk6CiAgICAgICAgICAgIHMgKz0gc3RyKFhbaV1bal0pKyIgIgogICAgICAgIHByaW50KHMrIiAiK3N0cihmW2ldKSsiXG4iKQogICAKZ2VuID0gMQpUID0gZmxvYXQoJ2luZicpCmZpbmFsID0gMQoKc3RhcnRfdGltZSA9IHRpbWUoKQoKd2hpbGUgZ2VuIDw9IG1heEdlbjoKICAgIHAgPSAoTzIgLSBPMSkvKDEgKyBlKiooKDIwKigtZ2VuKyhtYXhHZW4vNCkpKS9tYXhHZW4pKSArIE8xCiAgICBsYW0gPSAxMCoqcAogICAKICAgIG1ldGhvZF8xKCkKCiAgICBpZiBUID49IG1pbihmKToKICAgICAgICBUID0gbWluKFQsIG1pbihmKSkKICAgICAgICBmb3IgaSBpbiByYW5nZSAoMSwgcG9wKzEpOgogICAgICAgICAgICBpZiBmW2ldID09IFQ6CiAgICAgICAgICAgICAgICB2YWxzID0gWFtpXQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBmaW5hbCA9IGYuaW5kZXgobWluKGYpKQogICAgICAgCiAgICBUID0gbWluKFQsIG1pbihmKSkKCiAgICAjcHJpbnQoIkdlbiAiK3N0cihnZW4pKyI6IixUKQogICAKICAgIGdlbiArPSAxCiAgICAjc29sKCkKCicnJ2ZpbmFsID0gMQpmb3IgaSBpbiByYW5nZSAoMSwgcG9wKzEpOgogICAgaWYgZltmaW5hbF0gPiBmW2ldOgogICAgICAgIGZpbmFsID0gaQonJycKCiNzb2woKQoKZXhlY3V0aW9uX3RpbWUgPSB0aW1lKCktc3RhcnRfdGltZQpwcmludCgiRXhlY3V0aW9uIHRpbWUgaW4gc2Vjb25kczogIitzdHIoZXhlY3V0aW9uX3RpbWUpKQoKcHJpbnQoIkZpbmFsIHNvbHV0aW9uOlxuIikKcHJpbnQoIlZhbHVlczoiKQpmb3IgaSBpbiByYW5nZSAoMSwgdmFyKzEpOgogICAgcHJpbnQoIngiK3N0cihpKSsiID0gIitzdHIoWFtmaW5hbF1baV0pKQoKeCA9IFhbZmluYWxdCmZvciBpIGluIHJhbmdlICh2YXIrMSk6CiAgICBpZiB4W2ldID4gMDoKICAgICAgICB5W2ldID0gMQogICAgZWxzZToKICAgICAgICB5W2ldID0gMAoKI0VudGVyIGVxdWF0aW9uIGhlcmUKWiA9IGFicyh4WzFdKSthYnMoeFsyXSkrYWJzKHhbM10pK2Ficyh4WzRdKSthYnMoeFs1XSkrYWJzKHhbNl0pK2Ficyh4WzddKSthYnMoeFs4XSkrYWJzKHhbOV0pK2Ficyh4WzEwXSkrYWJzKHhbMV0pKmFicyh4WzJdKSphYnMoeFszXSkqYWJzKHhbNF0pKmFicyh4WzVdKSphYnMoeFs2XSkqYWJzKHhbN10pKmFicyh4WzhdKSphYnMoeFs5XSkqYWJzKHhbMTBdKQoKI3ByaW50KCJcbmYoeCkgPSAiK3N0cihUKSkKcHJpbnQoIlxuZih4KSA9ICIrc3RyKFopKQoKCgp4ID0gdmFscwpwcmludCgiXG5GaW5hbCBzb2x1dGlvbjpcbiIpCnByaW50KCJWYWx1ZXM6IikKZm9yIGkgaW4gcmFuZ2UgKDEsIHZhcisxKToKICAgIHByaW50KCJ4IitzdHIoaSkrIiA9ICIrc3RyKHZhbHNbaV0pKQoKI3ggPSBYW2ZpbmFsXQpmb3IgaSBpbiByYW5nZSAodmFyKzEpOgogICAgaWYgeFtpXSA+IDA6CiAgICAgICAgeVtpXSA9IDEKICAgIGVsc2U6CiAgICAgICAgeVtpXSA9IDAKClogPSBhYnMoeFsxXSkrYWJzKHhbMl0pK2Ficyh4WzNdKSthYnMoeFs0XSkrYWJzKHhbNV0pK2Ficyh4WzZdKSthYnMoeFs3XSkrYWJzKHhbOF0pK2Ficyh4WzldKSthYnMoeFsxMF0pK2Ficyh4WzFdKSphYnMoeFsyXSkqYWJzKHhbM10pKmFicyh4WzRdKSphYnMoeFs1XSkqYWJzKHhbNl0pKmFicyh4WzddKSphYnMoeFs4XSkqYWJzKHhbOV0pKmFicyh4WzEwXSkKCiNwcmludCgiXG5mKHgpID0gIitzdHIoVCkpCnByaW50KCJcbmYoeCkgPSAiK3N0cihaKSkKCgoKI3ByaW50KCkKI3ByaW50KCkKCiNwcmludChpbmVxKFhbZmluYWxdKSkKI3ByaW50KGcpCgoKcHJpbnQoKQpwcmludCgpCgpmb3IgaiBpbiByYW5nZSAoMSwgdmFyKzEpOgogICAgZm9yIGkgaW4gcmFuZ2UgKDEsIHBvcCsxKToKICAgICAgICBYW2ldW2pdID0gTVtpXVtqXQoKZ2VuID0gMQpUID0gZmxvYXQoJ2luZicpCmZpbmFsID0gMQoKc3RhcnRfdGltZSA9IHRpbWUoKQoKd2hpbGUgZ2VuIDw9IG1heEdlbjoKICAgIHAgPSAoKE8yIC0gTzEpLygxICsgZSoqKCgyMCooLWdlbisobWF4R2VuLzQpKSkvbWF4R2VuKSkpICsgTzEKICAgIGxhbSA9IDEwKipwCiAgIAogICAgaWYgZ2VuICUgMiA9PSAxOgogICAgICAgIG1ldGhvZF8xKCkKICAgIGVsc2U6CiAgICAgICAgbWV0aG9kXzIoKQoKICAgIGlmIFQgPj0gbWluKGYpOgogICAgICAgIFQgPSBtaW4oVCwgbWluKGYpKQogICAgICAgIGZvciBpIGluIHJhbmdlICgxLCBwb3ArMSk6CiAgICAgICAgICAgIGlmIGZbaV0gPT0gVDoKICAgICAgICAgICAgICAgIHZhbHMgPSBYW2ldCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGZpbmFsID0gZi5pbmRleChtaW4oZikpCiAgICAgICAKICAgIFQgPSBtaW4oVCwgbWluKGYpKQoKICAgICNwcmludCgiR2VuICIrc3RyKGdlbikrIjoiLFQpCiAgIAogICAgZ2VuICs9IDEKICAgICNzb2woKQoKJycnZmluYWwgPSAxCmZvciBpIGluIHJhbmdlICgxLCBwb3ArMSk6CiAgICBpZiBmW2ZpbmFsXSA+IGZbaV06CiAgICAgICAgZmluYWwgPSBpCicnJwoKI3NvbCgpCgpleGVjdXRpb25fdGltZSA9IHRpbWUoKS1zdGFydF90aW1lCnByaW50KCJFeGVjdXRpb24gdGltZSBpbiBzZWNvbmRzOiAiK3N0cihleGVjdXRpb25fdGltZSkpCgpwcmludCgiRmluYWwgc29sdXRpb246XG4iKQpwcmludCgiVmFsdWVzOiIpCmZvciBpIGluIHJhbmdlICgxLCB2YXIrMSk6CiAgICBwcmludCgieCIrc3RyKGkpKyIgPSAiK3N0cihYW2ZpbmFsXVtpXSkpCgp4ID0gWFtmaW5hbF0KZm9yIGkgaW4gcmFuZ2UgKHZhcisxKToKICAgIGlmIHhbaV0gPiAwOgogICAgICAgIHlbaV0gPSAxCiAgICBlbHNlOgogICAgICAgIHlbaV0gPSAwCgojRW50ZXIgZXF1YXRpb24gaGVyZQpaID0gYWJzKHhbMV0pK2Ficyh4WzJdKSthYnMoeFszXSkrYWJzKHhbNF0pK2Ficyh4WzVdKSthYnMoeFs2XSkrYWJzKHhbN10pK2Ficyh4WzhdKSthYnMoeFs5XSkrYWJzKHhbMTBdKSthYnMoeFsxXSkqYWJzKHhbMl0pKmFicyh4WzNdKSphYnMoeFs0XSkqYWJzKHhbNV0pKmFicyh4WzZdKSphYnMoeFs3XSkqYWJzKHhbOF0pKmFicyh4WzldKSphYnMoeFsxMF0pCgojcHJpbnQoIlxuZih4KSA9ICIrc3RyKFQpKQpwcmludCgiXG5mKHgpID0gIitzdHIoWikpCgojcHJpbnQoaW5lcShYW2ZpbmFsXSkpCiNwcmludChnKQoKCgp4ID0gdmFscwpwcmludCgiXG5GaW5hbCBzb2x1dGlvbjpcbiIpCnByaW50KCJWYWx1ZXM6IikKZm9yIGkgaW4gcmFuZ2UgKDEsIHZhcisxKToKICAgIHByaW50KCJ4IitzdHIoaSkrIiA9ICIrc3RyKHZhbHNbaV0pKQoKI3ggPSBYW2ZpbmFsXQpmb3IgaSBpbiByYW5nZSAodmFyKzEpOgogICAgaWYgeFtpXSA+IDA6CiAgICAgICAgeVtpXSA9IDEKICAgIGVsc2U6CiAgICAgICAgeVtpXSA9IDAKClogPSBhYnMoeFsxXSkrYWJzKHhbMl0pK2Ficyh4WzNdKSthYnMoeFs0XSkrYWJzKHhbNV0pK2Ficyh4WzZdKSthYnMoeFs3XSkrYWJzKHhbOF0pK2Ficyh4WzldKSthYnMoeFsxMF0pK2Ficyh4WzFdKSphYnMoeFsyXSkqYWJzKHhbM10pKmFicyh4WzRdKSphYnMoeFs1XSkqYWJzKHhbNl0pKmFicyh4WzddKSphYnMoeFs4XSkqYWJzKHhbOV0pKmFicyh4WzEwXSkKI3ByaW50KCJcbmYoeCkgPSAiK3N0cihUKSkKcHJpbnQoIlxuZih4KSA9ICIrc3RyKFopKQo=