Some General Comments:

Example:

M = matrix(c(1:12),byrow=TRUE,ncol=4)
M
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
M[1]
[1] 1
M[2]
[1] 5
M[1,2]
[1] 2
M[,2]
[1]  2  6 10
M[3,]
[1]  9 10 11 12
N = list(matrix(c(1:4),  byrow=TRUE,ncol=2), 
         matrix(c(5:8),  byrow=TRUE,ncol=2), 
         matrix(c(9:12), byrow=TRUE,ncol=2),
         matrix(c(13:16),byrow=TRUE,ncol=2) )
N       # gives the total list of matrices
[[1]]
     [,1] [,2]
[1,]    1    2
[2,]    3    4

[[2]]
     [,1] [,2]
[1,]    5    6
[2,]    7    8

[[3]]
     [,1] [,2]
[1,]    9   10
[2,]   11   12

[[4]]
     [,1] [,2]
[1,]   13   14
[2,]   15   16
N[[4]]  # gives the 4th matrix in the list
     [,1] [,2]
[1,]   13   14
[2,]   15   16
N[[1]] %*% c(1,2)
     [,1]
[1,]    5
[2,]   11
is.vector(N[[1]] %*% c(1,2))     # is not  a vector object
[1] FALSE
as.vector(N[[1]]  %*% c(1,2) )   # MAKE it a vector!
[1]  5 11
is.vector(as.vector(N[[1]]  %*% c(1,2) ))  # (check)
[1] TRUE

Magnets and Multipoles

Consider an iron-dominated \(2n\)-pole magnet (of “infinite length”) that to lowest-order generates a pure multipole (\(B_r \sim \sin n\phi\), \(n = integer >0\)) and whose magnetic field is described by a scalar potential, \(\vec{B} = \nabla\Phi_m\).

  1. Show that the magnetic scalar potential satisfies Laplace’s equation \(\nabla^2\Phi_m = 0\) and that its solution may be written as \[ \Phi_m = C\;r^n\sin n\phi \] where \(C\) is a constant.

[Plug the solution above into Laplace’s equation written in polar coordinates: \[ \nabla^2\Phi_m = \frac{1}{r} \frac{\partial}{\partial r}\left(r\;\frac{\partial \Phi_m}{\partial r}\right) + \frac{1}{r^2}\frac{\partial^2\Phi_m}{\partial\phi^2} \]]

  1. Show that the magnetic field of the 2\(n\)-pole magnet may be written in cylindrical corrdinates as \[ B_r = C\;n \;r^{n-1}\sin n\phi ~~~ ,\\ B_\phi = C\;n \;r^{n-1}\cos n\phi ~~~ . \] The constant \(C\) can now be interpreted as \[ C = \frac{1}{n!}\left( \frac{\partial^{n-1} B_\phi}{\partial r^{n-1}} \right)_{\phi=0}. \]

[Use \(\Phi_m\) above and compute \(\vec{B} = \nabla\Phi_m\).]

  1. Suppose there are \(N\) turns of conductor per pole, each carrying current \(I\). If the pole faces are equipotential surfaces with minimum radius \(R\) at angles \(\phi = k\cdot(\pi/2n)\) for \(k = 1,3,5,\ldots,4n-1\), show that \[ \left( \frac{\partial^{n-1} B_\phi}{\partial r^{n-1}} \right)_{\phi=0} = \frac{\mu_0n!NI}{R^n}. \]

[Use \(\oint\vec{H}\cdot d\vec{\ell} = I_{encl.}\) and integrate along the following path: Start at origin and take the path which begins along the angle \(\phi=\pi/2n\) into the first iron pole; the path then proceeds through the iron and exits the iron along the \(y=0\) axis, from which it proceeds back to the origin. The only major contribution to the integral (assuming infinitely large permeability in the iron) will be the first section of the path integral where \(\mu=\mu_0\), since the field along \(y=0\) will be perpendicular to the path. Hence, \(\oint\vec{H}\cdot d\vec{\ell} = \int_0^R B_r\cdot dr = C\cdot R^n \sin(n\pi/2n) = N\;I\).]

  1. Create a plot of the cross-section of the poles of a decapole (10-pole) magnet with an inner aperture of radius \(R\) = 5 cm, out to radius 8 cm.
library(ggplot2)
angs = c(0:719)/720                          # angle in degrees, for clarity
radp = 5*(1/abs(sin(5*angs*2*pi)))^(1/5)     # pole radius in cm
ggplot(data.frame(angs,radp),aes(angs,radp)) + geom_point(shape=".") + 
   coord_polar(start=-pi/2,direction = -1) + 
   ylim(0,8)

Doublet

E0 = 0.511 # MeV
W = 200    # MeV
pc = sqrt(((W+E0)/E0)^2 - 1)*E0/1000 # GeV
Brho = 10/2.9979*pc   #  T-m
F = 4       # m
Leff = 0.2  # m
d    = 0.6  # m

Consider a beam of electrons, each with kinetic energy 200 MeV. A quadrupole lens is used to focus this beam, with a focal length of 6 m.

  1. What magnetic gradient, \(B' \equiv \partial B_y/\partial x\), is required if the effective length of the magnet is 0.2 m? Is a thin lens approximation justified for use in this situation?
# 1/F = B' Leff / Brho        B' = field gradient [T/m]
Grad = Brho/F/Leff
Grad   # T/m
[1] 0.836045
Leff/F
[1] 0.05
thin = ifelse(Leff/F < 0.1, "yes", "no")
thin
[1] "yes"
  1. We wish to focus the beam both horizontally and vertically using a “doublet”. Consider a second quadrupole magnet with the same parameters as the one used above, but with its electrical polarity reversed creating a “defocusing” lens. Treating these two quadrupoles as thin lenses, if they are now separated by 0.6 m, center-to-center, with the beam passing through the horizontally focusing magnet first and then the horizontally defocusing magnet,

    1. what is the resulting focal length in the horizontal plane, measured from the midpoint of the two lenses?
    2. What is it in the vertical plane?
    3. How do these compare with the theoretical thin lens doublet focal length?
    4. Can you create a system of these two magnets that has the same focal length in both planes? (Justify your answer.)
MF = matrix(c(  1,  0,
              -1/F, 1), nrow=2, ncol=2, byrow=TRUE)
Md = matrix(c(  1,  d,
                0,  1), nrow=2, ncol=2, byrow=TRUE)
MD = matrix(c(  1,  0,
               1/F, 1), nrow=2, ncol=2, byrow=TRUE)
x0 = array(c(1,0))
x0
[1] 1 0
Outx = MD %*% Md %*% MF %*% x0
Outy = MF %*% Md %*% MD %*% x0
Fx = d/2 - Outx[1]/tan(Outx[2])
Fy = d/2 - Outy[1]/tan(Outy[2])

Fx
[1] 22.95604
Fy
[1] 30.95229
F^2/d
[1] 26.66667

[From above, we see that the points where incoming parallel rays cross the x-axis are each a bit different than what the “2-1 element” of the matrix might suggest. We can adjust the strength(s) of the magnets to adjust them and focus at a single point.]

r0 = 1.1
x0 = c(1,0,1,0)
Out = function(r){
  MF = matrix(c(  1,     0,    0,     0, 
                -1/F,    1,    0,     0,
                  0,     0,    1,     0,
                  0,     0,   1/F,    1 ), nrow=4, ncol=4, byrow=TRUE)
  Md = matrix(c(  1,     d,    0,     0, 
                  0,     1,    0,     0,
                  0,     0,    1,     d,
                  0,     0,    0,     1 ), nrow=4, ncol=4, byrow=TRUE)
  MD = matrix(c(  1,     0,    0,     0, 
                 1/F*r,  1,    0,     0,
                  0,     0,    1,     0,
                  0,     0, -1/F*r,   1 ), nrow=4, ncol=4, byrow=TRUE)
  MD %*% Md %*% MF %*% x0
}
Fcn = function(r){
  V = Out(r)
  Fx = d/2 - V[1]/tan(V[2])
  Fy = d/2 - V[3]/tan(V[4])
abs(Fx-Fy)
}
F2d = optimize(Fcn,c(0.5,1.5))
rFin = F2d$minimum
Vf = Out(rFin)
Fx = d/2 - Vf[1]/tan(Vf[2])
Fy = d/2 - Vf[3]/tan(Vf[4])
Fx; Fy
[1] 26.35311
[1] 26.35408

If we increase the strength of the D quad by factor 1.023, then the common focal length will be Fx = 26.35 m, Fy = 26.35 m

Betatron Motion

  1. Create an arbitrary sytem of 50 thin lenses of varying focal lengths and varying distances of separation. For instance, take all the lenses equally spaced by 30 m, but then add random flucutations of \(\pm\) 2 m to each spacing. Next, take the lenses to have equal focal lengths of 25 m, with every-other quad focusing or defocusing, then add a 10% random fluctuation to each quad. Next, create a distribution of 2000 particles from an arbitrary set of Courant-Snyder parameters and emittance, say \(\beta\) = 40 m and \(\alpha\) = -1, and track each particle through the system (1-D phase space only). Is the motion bounded (say, less than 50 mm maximum)? If not, vary the initial CS parameters of the problem until the maximum particle excursion is less than about 50 mm throughout most the system. Make a single plot of the 2000 trajectories (\(x\) vs. \(s\), say) through the system to verify your result.
set.seed(285)
Nls = 50
L   = 30
q0  = 1/25
ds  = rep(30,Nls)          + runif(Nls,-2,2)        # +/- 2 m fluctuation on L
q   = rep(c(-q0,q0),Nls/2) + runif(Nls,-q0,q0)*0.1  #   10%   fluctuation on q
s   = c(0,cumsum(ds))  # total path length
plot(s[-1],q,typ="b",xlab="s [m]",ylab="q [1/m]")

i = 0
M = list(diag(1,2))
while(i<Nls){
   i = i+1
   M[[i]] = matrix(c(    1,      ds[i]      ,
                   -q[i],  1-ds[i]*q[i]  ),  ncol=2,byrow=TRUE)
}
Npar = 2000
bet0 = 50
alf0 = -2
gam0 = (1+alf0^2)/bet0
eps0 = 0.05
x0  =  rnorm(Npar,0, sqrt(eps0*bet0))                 # initial x
xp0 = (rnorm(Npar,0, sqrt(eps0*bet0))-alf0*x0)/bet0   # initial x'
plot(s,rep(0,Nls+1),xlim=c(0,max(s)),ylim=c(-100,100),typ="n",xlab="s [m]",ylab="x(s) [mm]")
abline(h=c(-1,1)*50,lty=2,col="blue")

j = 0
while(j<Npar){
   j = j+1
   V0   = c(x0[j],xp0[j])
   V    = V0
   Vout = V0
   i = 0
   while(i<Nls){
      i = i+1
      V = M[[i]] %*% V
      Vout = cbind(Vout,V)
   }
   xplt = Vout[1,]
   points(s,xplt,typ="l")
}

  1. From the initial set of Courant-Snyder parameters used above, “track” their values using \(K = MKM^T\) along the exact same beamline and plot \(\sqrt{\beta}\) vs. \(s\); compare with the earlier tracking result.
K = list(matrix(c(bet0,-alf0,-alf0,gam0),ncol = 2, byrow = TRUE))
betas = 0
i = 0
while(i<Nls){
   i=i+1
   K[[i+1]] = M[[i]] %*% K[[i]] %*% t(M[[i]])
   betas[i] = K[[i+1]][1,1]
}
plot(s[-1],sqrt(betas),typ="l")

plot(s,rep(0,Nls+1),xlim=c(0,max(s)),ylim=c(-100,100),typ="n",xlab="s [m]",ylab="x(s) [mm]")
abline(h=c(-1,1)*50,lty=2,col="blue")
j = 0
while(j<Npar){
   j = j+1
   V0   = c(x0[j],xp0[j])
   V    = V0
   Vout = V0
   i = 0
   while(i<Nls){
      i = i+1
      V = M[[i]] %*% V
      Vout = cbind(Vout,V)
   }
   xplt = Vout[1,]
   points(s,xplt,typ="l")
}
points(s[-1], sqrt(betas),typ="l",col="red",lwd=3)
points(s[-1],-sqrt(betas),typ="l",col="red",lwd=3)

  1. If your arbitrary system above were repeated indefinitely, would the system be stable?
Mtot = diag(1,2)
i=0
while(i<Nls){
   i=i+1
   Mtot = M[[i]] %*% Mtot
}
Mtot
            [,1]      [,2]
[1,]  4.86291919 180.66981
[2,] -0.07873801  -2.71968
sum(diag(Mtot))
[1] 2.14324
stable = ifelse( abs(sum(diag(Mtot)))<2, "yes", "no")
stable
[1] "no"

Is the ring stable? Answer: no.

A Booster Ring

Consider a system made of thin lens quadrupoles with the following arrangement: FOOFODOOOODO

c = 2.9979e8  # m/s
F = 6   # m
L = 2.5 # m
Ns = 24
C = 8*L*Ns
Bmax = 2  # T
Tr = 0.5  # s; max ramp time
pf = 0.8
h = 2
E0 = 938 # MeV (mc^2, proton)
E1 = 100  # MeV
E2 = 1000 # MeV
phi_s = 28*pi/180

Here, F represents a horizontally focusing lens with focal length \(F\) = 6 m, D represents a horizontally defocusing lens of focal length \(-F\), and O represents a drift space of length \(L\) = 2.5 m.

  1. Determine if the system is stable in each plane \((x, y)\). If it is, determine the phase advance in degrees through the system for each plane.
Mf = matrix(c(  1,  0,
              -1/F, 1), nrow=2, ncol=2, byrow=TRUE)
Md = matrix(c(  1,  0,
               1/F, 1), nrow=2, ncol=2, byrow=TRUE)
Mo = matrix(c(  1,  L,
                0,  1), nrow=2, ncol=2, byrow=TRUE)

Mf
           [,1] [,2]
[1,]  1.0000000    0
[2,] -0.1666667    1
Md
          [,1] [,2]
[1,] 1.0000000    0
[2,] 0.1666667    1
Mo
     [,1] [,2]
[1,]    1  2.5
[2,]    0  1.0
Mx = Mo %*% Md  %*% Mo %*% Mo %*% Mo %*% Mo %*% Md %*% Mo %*% Mf %*% Mo %*% Mo %*% Mf
My = Mo %*% Mf  %*% Mo %*% Mo %*% Mo %*% Mo %*% Mf %*% Mo %*% Md %*% Mo %*% Mo %*% Md

Mx
           [,1]     [,2]
[1,] -4.5806327 25.49769
[2,] -0.7137346  3.75463
My
           [,1]     [,2]
[1,]  1.5073302  7.55787
[2,] -0.4822531 -1.75463
tMx = sum(diag(Mx))
tMy = sum(diag(My))

tMx
[1] -0.8260031
tMy
[1] -0.2472994
mu_x = acos(tMx/2)
mu_y = acos(tMy/2)

mu_x*180/pi; mu_y*180/pi
[1] 114.3935
[1] 97.10278
  1. For a synchrotron made up of 24 such sections, provided that the motion is stable, determine the betatron oscillation tunes \((\nu_x, \nu_y)\) of the synchrotron for each degree of freedom (\(x\) and \(y\)).
nu_x = mu_x * Ns / 2/pi
nu_y = mu_y * Ns / 2/pi
nu_x; nu_y
[1] 7.626235
[1] 6.473519
  1. What are the maximum values of the amplitude functions \(\beta_x\) and \(\beta_y\)?
# max betax should be at one of the F quads; max betay at one of the D quads,
#    since "D" is a focusing magnet in the vertical direction
Mx1 = Mo %*% Md %*% Mo %*% Mo %*% Mo %*% Mo %*% Md %*% Mo %*% Mf %*% Mo %*% Mo %*% Mf # as given
Mx2 = Mf %*% Mo %*% Mo %*% Mf %*% Mo %*% Md %*% Mo %*% Mo %*% Mo %*% Mo %*% Md %*% Mo # cyclic permutation

My1 = Mo %*% Mf %*% Mo %*% Mo %*% Mo %*% Mo %*% Mf %*% Mo %*% Md %*% Mo %*% Mo %*% Md # as given
My2 = Md %*% Mo %*% Mo %*% Md %*% Mo %*% Mf %*% Mo %*% Mo %*% Mo %*% Mo %*% Mf %*% Mo # cyclic permutation

bx1 = Mx1[1,2]/sin(mu_x)
bx2 = Mx2[1,2]/sin(mu_x)

by1 = My1[1,2]/sin(mu_y)
by2 = My2[1,2]/sin(mu_y)

# thus, the maximum will be the max of these two values; process repeated for each plane:
max(bx1,bx2)
[1] 27.99697
max(by1,by2)
[1] 7.616319

  1. Northern Illinois University and Fermi National Accelerator Laboratory

LS0tCnRpdGxlOiAiSG9tZXdvcmsgMiBEaXNjdXNzaW9uIgphdXRob3I6IE1pa2UgU3lwaGVyc15bTm9ydGhlcm4gSWxsaW5vaXMgVW5pdmVyc2l0eSBhbmQgRmVybWkgTmF0aW9uYWwgQWNjZWxlcmF0b3IKICBMYWJvcmF0b3J5XQpkYXRlOiAnbGFzdCB1cGRhdGU6IGByIGZvcm1hdCgoU3lzLkRhdGUoKSksICIlZCAlYiAlWSIpYCcKb3V0cHV0OiAgaHRtbF9ub3RlYm9vawotLS0KCioqU29tZSBHZW5lcmFsIENvbW1lbnRzOioqCgotIGdyYWRlOiAgNDAgcG9zc2libGUgIAogICAgICArIDEwIHB0cyBlYWNoIHByb2JsZW0gIAogICAgICArIGF2ZSBzY29yZTogIDI5LzQwICAKCi0gc3RpbGw6ICBwbGVhc2UgcHV0IGxhc3QgbmFtZXMgaW4geW91ciBmaWxlIG5hbWVzICAKLSBiZSBjYXJlZnVsIG9mIHVuaXRzISBiZSBzdXJlIHRvIHVuZGVyc3RhbmQgZWFjaCBzdGVwIG9mIGEgY2FsYyAgCiAgICAgICsgdXNpbmcgTWVWLCBNZVYvYywgZXRjLiBpbiBjYWxjdWxhdGlvbnMsIGVzcC4gdy8gQnJobyA9IHAvcSAgIAotIEJyaG8gPSBwL3EgPSBwW0dlVi9jXSAqIDEwLzIuOTk3OSAgICAgW2Fuc3dlciBpcyBpbiBULW1dICAKLSBwaGFzZSBhZHZhbmNlIHRocm91Z2ggYSBsb25nIHNlY3Rpb24gb2YgYmVhbSBsaW5lIG9yIHJpbmcgIAotIGluZGV4aW5nOiAgTVsxXSB2cy4gTVsxLDFdIHZzLiBNWzEsMSwxXTsgbGlzdCBvZiBlbGVtZW50cyAuLi4gIAoKPiBFeGFtcGxlOgoKYGBge3J9Ck0gPSBtYXRyaXgoYygxOjEyKSxieXJvdz1UUlVFLG5jb2w9NCkKTQpNWzFdCk1bMl0KTVsxLDJdCk1bLDJdCk1bMyxdCgpOID0gbGlzdChtYXRyaXgoYygxOjQpLCAgYnlyb3c9VFJVRSxuY29sPTIpLCAKICAgICAgICAgbWF0cml4KGMoNTo4KSwgIGJ5cm93PVRSVUUsbmNvbD0yKSwgCiAgICAgICAgIG1hdHJpeChjKDk6MTIpLCBieXJvdz1UUlVFLG5jb2w9MiksCiAgICAgICAgIG1hdHJpeChjKDEzOjE2KSxieXJvdz1UUlVFLG5jb2w9MikgKQpOICAgICAgICMgZ2l2ZXMgdGhlIHRvdGFsIGxpc3Qgb2YgbWF0cmljZXMKTltbNF1dICAjIGdpdmVzIHRoZSA0dGggbWF0cml4IGluIHRoZSBsaXN0Ck5bWzFdXSAlKiUgYygxLDIpCmlzLnZlY3RvcihOW1sxXV0gJSolIGMoMSwyKSkgICAgICMgaXMgbm90ICBhIHZlY3RvciBvYmplY3QKYXMudmVjdG9yKE5bWzFdXSAgJSolIGMoMSwyKSApICAgIyBNQUtFIGl0IGEgdmVjdG9yIQppcy52ZWN0b3IoYXMudmVjdG9yKE5bWzFdXSAgJSolIGMoMSwyKSApKSAgIyAoY2hlY2spCgpgYGAKCgojIyAqKk1hZ25ldHMgYW5kIE11bHRpcG9sZXMqKiAgCgpDb25zaWRlciBhbiBpcm9uLWRvbWluYXRlZCAkMm4kLXBvbGUgbWFnbmV0IChvZiAiaW5maW5pdGUgbGVuZ3RoIikgdGhhdCB0byBsb3dlc3Qtb3JkZXIgZ2VuZXJhdGVzIGEgcHVyZSBtdWx0aXBvbGUgKCRCX3IgXHNpbSBcc2luIG5ccGhpJCwgJG4gPSBpbnRlZ2VyID4wJCkgYW5kIHdob3NlIG1hZ25ldGljIGZpZWxkIGlzIGRlc2NyaWJlZCBieSBhIHNjYWxhciBwb3RlbnRpYWwsICRcdmVje0J9ID0gXG5hYmxhXFBoaV9tJC4KCmEuICBTaG93IHRoYXQgdGhlIG1hZ25ldGljIHNjYWxhciBwb3RlbnRpYWwgc2F0aXNmaWVzIExhcGxhY2UncyBlcXVhdGlvbiAkXG5hYmxhXjJcUGhpX20gPSAwJCBhbmQgdGhhdCBpdHMgc29sdXRpb24gbWF5IGJlIHdyaXR0ZW4gYXMKJCQKXFBoaV9tID0gQ1w7cl5uXHNpbiBuXHBoaQokJAp3aGVyZSAkQyQgaXMgYSBjb25zdGFudC4KCltQbHVnIHRoZSBzb2x1dGlvbiBhYm92ZSBpbnRvIExhcGxhY2UncyBlcXVhdGlvbiB3cml0dGVuIGluIHBvbGFyIGNvb3JkaW5hdGVzOgokJApcbmFibGFeMlxQaGlfbSA9IFxmcmFjezF9e3J9IFxmcmFje1xwYXJ0aWFsfXtccGFydGlhbCByfVxsZWZ0KHJcO1xmcmFje1xwYXJ0aWFsIFxQaGlfbX17XHBhcnRpYWwgcn1ccmlnaHQpICsgXGZyYWN7MX17cl4yfVxmcmFje1xwYXJ0aWFsXjJcUGhpX219e1xwYXJ0aWFsXHBoaV4yfQokJApdCgpiLiAgU2hvdyB0aGF0IHRoZSBtYWduZXRpYyBmaWVsZCBvZiB0aGUgMiRuJC1wb2xlIG1hZ25ldCBtYXkgYmUgd3JpdHRlbiBpbiBjeWxpbmRyaWNhbCBjb3JyZGluYXRlcyBhcwokJApCX3IgICAgPSBDXDtuIFw7cl57bi0xfVxzaW4gblxwaGkgfn5+ICxcXApCX1xwaGkgPSBDXDtuIFw7cl57bi0xfVxjb3MgblxwaGkgfn5+IC4KJCQKVGhlIGNvbnN0YW50ICRDJCBjYW4gbm93IGJlIGludGVycHJldGVkIGFzCiQkCkMgPSBcZnJhY3sxfXtuIX1cbGVmdCggXGZyYWN7XHBhcnRpYWxee24tMX0gQl9ccGhpfXtccGFydGlhbCByXntuLTF9fSBccmlnaHQpX3tccGhpPTB9LgokJAoKW1VzZSAkXFBoaV9tJCBhYm92ZSBhbmQgY29tcHV0ZSAkXHZlY3tCfSA9IFxuYWJsYVxQaGlfbSQuXQoKCmMuIFN1cHBvc2UgdGhlcmUgYXJlICROJCB0dXJucyBvZiBjb25kdWN0b3IgcGVyIHBvbGUsIGVhY2ggY2FycnlpbmcgY3VycmVudCAkSSQuICBJZiB0aGUgcG9sZSBmYWNlcyBhcmUgZXF1aXBvdGVudGlhbCBzdXJmYWNlcyB3aXRoIG1pbmltdW0gcmFkaXVzICRSJCBhdCBhbmdsZXMgJFxwaGkgPSBrXGNkb3QoXHBpLzJuKSQgZm9yICRrID0gMSwzLDUsXGxkb3RzLDRuLTEkLCBzaG93IHRoYXQKJCQKXGxlZnQoIFxmcmFje1xwYXJ0aWFsXntuLTF9IEJfXHBoaX17XHBhcnRpYWwgcl57bi0xfX0gXHJpZ2h0KV97XHBoaT0wfSA9IFxmcmFje1xtdV8wbiFOSX17Ul5ufS4KJCQKCltVc2UgJFxvaW50XHZlY3tIfVxjZG90IGRcdmVje1xlbGx9ID0gSV97ZW5jbC59JCBhbmQgaW50ZWdyYXRlIGFsb25nIHRoZSBmb2xsb3dpbmcgcGF0aDogU3RhcnQgYXQgb3JpZ2luIGFuZCB0YWtlIHRoZSBwYXRoIHdoaWNoIGJlZ2lucyBhbG9uZyB0aGUgYW5nbGUgJFxwaGk9XHBpLzJuJCBpbnRvIHRoZSBmaXJzdCBpcm9uIHBvbGU7IHRoZSBwYXRoIHRoZW4gcHJvY2VlZHMgdGhyb3VnaCB0aGUgaXJvbiBhbmQgZXhpdHMgdGhlIGlyb24gYWxvbmcgdGhlICR5PTAkIGF4aXMsIGZyb20gd2hpY2ggaXQgcHJvY2VlZHMgYmFjayB0byB0aGUgb3JpZ2luLiAgVGhlIG9ubHkgbWFqb3IgY29udHJpYnV0aW9uIHRvIHRoZSBpbnRlZ3JhbCAoYXNzdW1pbmcgaW5maW5pdGVseSBsYXJnZSBwZXJtZWFiaWxpdHkgaW4gdGhlIGlyb24pIHdpbGwgYmUgdGhlIGZpcnN0IHNlY3Rpb24gb2YgdGhlIHBhdGggaW50ZWdyYWwgd2hlcmUgJFxtdT1cbXVfMCQsIHNpbmNlIHRoZSBmaWVsZCBhbG9uZyAkeT0wJCB3aWxsIGJlIHBlcnBlbmRpY3VsYXIgdG8gdGhlIHBhdGguICBIZW5jZSwgJFxvaW50XHZlY3tIfVxjZG90IGRcdmVje1xlbGx9ID0gXGludF8wXlIgQl9yXGNkb3QgZHIgPSBDXGNkb3QgUl5uIFxzaW4oblxwaS8ybikgPSBOXDtJJC5dCgpkLiAgQ3JlYXRlIGEgcGxvdCBvZiB0aGUgY3Jvc3Mtc2VjdGlvbiBvZiB0aGUgcG9sZXMgb2YgYSBkZWNhcG9sZSAoMTAtcG9sZSkgbWFnbmV0IHdpdGggYW4gaW5uZXIgYXBlcnR1cmUgb2YgcmFkaXVzICRSJCA9IDUgY20sIG91dCB0byByYWRpdXMgOCBjbS4KYGBge3IsIHdhcm5pbmc9RkFMU0UsZWNobz1UUlVFLGV2YWw9VFJVRX0KbGlicmFyeShnZ3Bsb3QyKQphbmdzID0gYygwOjcxOSkvNzIwICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZ2xlIGluIGRlZ3JlZXMsIGZvciBjbGFyaXR5CnJhZHAgPSA1KigxL2FicyhzaW4oNSphbmdzKjIqcGkpKSleKDEvNSkgICAgICMgcG9sZSByYWRpdXMgaW4gY20KZ2dwbG90KGRhdGEuZnJhbWUoYW5ncyxyYWRwKSxhZXMoYW5ncyxyYWRwKSkgKyBnZW9tX3BvaW50KHNoYXBlPSIuIikgKyAKICAgY29vcmRfcG9sYXIoc3RhcnQ9LXBpLzIsZGlyZWN0aW9uID0gLTEpICsgCiAgIHlsaW0oMCw4KQpgYGAKCgojIyAqKkRvdWJsZXQqKgoKYGBge3IgUTJzZXR1cDAyLCBldmFsPVRSVUUsIGVjaG89VFJVRX0KRTAgPSAwLjUxMSAjIE1lVgpXID0gMjAwICAgICMgTWVWCnBjID0gc3FydCgoKFcrRTApL0UwKV4yIC0gMSkqRTAvMTAwMCAjIEdlVgpCcmhvID0gMTAvMi45OTc5KnBjICAgIyAgVC1tCkYgPSA0ICAgICAgICMgbQpMZWZmID0gMC4yICAjIG0KZCAgICA9IDAuNiAgIyBtCmBgYAoKQ29uc2lkZXIgYSBiZWFtIG9mIGVsZWN0cm9ucywgZWFjaCB3aXRoIGtpbmV0aWMgZW5lcmd5IGByIFdgIE1lVi4gIEEgcXVhZHJ1cG9sZSBsZW5zIGlzIHVzZWQgdG8gZm9jdXMgdGhpcyBiZWFtLCB3aXRoIGEgZm9jYWwgbGVuZ3RoIG9mIGByIEZgIG0uICAKCmEuIFdoYXQgbWFnbmV0aWMgZ3JhZGllbnQsICRCJyBcZXF1aXYgXHBhcnRpYWwgQl95L1xwYXJ0aWFsIHgkLCBpcyByZXF1aXJlZCBpZiB0aGUgZWZmZWN0aXZlIGxlbmd0aCBvZiB0aGUgbWFnbmV0IGlzIGByIExlZmZgIG0/ICBJcyBhICp0aGluIGxlbnMqIGFwcHJveGltYXRpb24ganVzdGlmaWVkIGZvciB1c2UgaW4gdGhpcyBzaXR1YXRpb24/CmBgYHtyIHF1YWRMZW5zLCBldmFsPVRSVUUsIGVjaG89VFJVRX0KIyAxL0YgPSBCJyBMZWZmIC8gQnJobyAgICAgICAgQicgPSBmaWVsZCBncmFkaWVudCBbVC9tXQpHcmFkID0gQnJoby9GL0xlZmYKR3JhZCAgICMgVC9tCmBgYApgYGB7ciBxdWFkTGVuczIsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQpMZWZmL0YKdGhpbiA9IGlmZWxzZShMZWZmL0YgPCAwLjEsICJ5ZXMiLCAibm8iKQp0aGluCmBgYApiLiBXZSB3aXNoIHRvIGZvY3VzIHRoZSBiZWFtIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5IHVzaW5nIGEgImRvdWJsZXQiLiAgQ29uc2lkZXIgYSBzZWNvbmQgcXVhZHJ1cG9sZSBtYWduZXQgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIHRoZSBvbmUgdXNlZCBhYm92ZSwgYnV0IHdpdGggaXRzIGVsZWN0cmljYWwgcG9sYXJpdHkgcmV2ZXJzZWQgY3JlYXRpbmcgYSAiZGVmb2N1c2luZyIgbGVucy4gIFRyZWF0aW5nIHRoZXNlIHR3byBxdWFkcnVwb2xlcyBhcyB0aGluIGxlbnNlcywgaWYgdGhleSBhcmUgbm93IHNlcGFyYXRlZCBieSBgciBkYCBtLCBjZW50ZXItdG8tY2VudGVyLCB3aXRoIHRoZSBiZWFtIHBhc3NpbmcgdGhyb3VnaCB0aGUgaG9yaXpvbnRhbGx5IGZvY3VzaW5nIG1hZ25ldCBmaXJzdCBhbmQgdGhlbiB0aGUgaG9yaXpvbnRhbGx5IGRlZm9jdXNpbmcgbWFnbmV0LCAKCiAgICAgIGkuICB3aGF0IGlzIHRoZSByZXN1bHRpbmcgZm9jYWwgbGVuZ3RoIGluIHRoZSBob3Jpem9udGFsIHBsYW5lLCBtZWFzdXJlZCBmcm9tIHRoZSBtaWRwb2ludCBvZiB0aGUgdHdvIGxlbnNlcz8gICAKICAgICBpaS4gIFdoYXQgaXMgaXQgaW4gdGhlIHZlcnRpY2FsIHBsYW5lPyAgCiAgICBpaWkuICBIb3cgZG8gdGhlc2UgY29tcGFyZSB3aXRoIHRoZSB0aGVvcmV0aWNhbCB0aGluIGxlbnMgZG91YmxldCBmb2NhbCBsZW5ndGg/ICAKICAgICBpdi4gIENhbiB5b3UgY3JlYXRlIGEgc3lzdGVtIG9mIHRoZXNlIHR3byBtYWduZXRzIHRoYXQgaGFzIHRoZSBzYW1lIGZvY2FsIGxlbmd0aCBpbiBfYm90aF8gcGxhbmVzPyAgKEp1c3RpZnkgeW91ciBhbnN3ZXIuKSAgCgpgYGB7ciBkb3VibGV0LCBldmFsPVRSVUUsIGVjaG89VFJVRX0KTUYgPSBtYXRyaXgoYyggIDEsICAwLAogICAgICAgICAgICAgIC0xL0YsIDEpLCBucm93PTIsIG5jb2w9MiwgYnlyb3c9VFJVRSkKTWQgPSBtYXRyaXgoYyggIDEsICBkLAogICAgICAgICAgICAgICAgMCwgIDEpLCBucm93PTIsIG5jb2w9MiwgYnlyb3c9VFJVRSkKTUQgPSBtYXRyaXgoYyggIDEsICAwLAogICAgICAgICAgICAgICAxL0YsIDEpLCBucm93PTIsIG5jb2w9MiwgYnlyb3c9VFJVRSkKeDAgPSBhcnJheShjKDEsMCkpCngwCmBgYAoKYGBge3IgZG91YmxldDIsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQpPdXR4ID0gTUQgJSolIE1kICUqJSBNRiAlKiUgeDAKT3V0eSA9IE1GICUqJSBNZCAlKiUgTUQgJSolIHgwCkZ4ID0gZC8yIC0gT3V0eFsxXS90YW4oT3V0eFsyXSkKRnkgPSBkLzIgLSBPdXR5WzFdL3RhbihPdXR5WzJdKQoKRngKRnkKRl4yL2QKYGBgCgpbRnJvbSBhYm92ZSwgd2Ugc2VlIHRoYXQgdGhlIHBvaW50cyB3aGVyZSBpbmNvbWluZyBwYXJhbGxlbCByYXlzIGNyb3NzIHRoZSB4LWF4aXMgYXJlIGVhY2ggYSBiaXQgZGlmZmVyZW50IHRoYW4gd2hhdCB0aGUgIjItMSBlbGVtZW50IiBvZiB0aGUgbWF0cml4IG1pZ2h0IHN1Z2dlc3QuICBXZSBjYW4gYWRqdXN0IHRoZSBzdHJlbmd0aChzKSBvZiB0aGUgbWFnbmV0cyB0byBhZGp1c3QgdGhlbSBhbmQgZm9jdXMgYXQgYSBzaW5nbGUgcG9pbnQuXQoKYGBge3IgZG91YmxldDMsIGV2YWw9VFJVRSwgZWNobz1UUlVFfQpyMCA9IDEuMQp4MCA9IGMoMSwwLDEsMCkKT3V0ID0gZnVuY3Rpb24ocil7CiAgTUYgPSBtYXRyaXgoYyggIDEsICAgICAwLCAgICAwLCAgICAgMCwgCiAgICAgICAgICAgICAgICAtMS9GLCAgICAxLCAgICAwLCAgICAgMCwKICAgICAgICAgICAgICAgICAgMCwgICAgIDAsICAgIDEsICAgICAwLAogICAgICAgICAgICAgICAgICAwLCAgICAgMCwgICAxL0YsICAgIDEgKSwgbnJvdz00LCBuY29sPTQsIGJ5cm93PVRSVUUpCiAgTWQgPSBtYXRyaXgoYyggIDEsICAgICBkLCAgICAwLCAgICAgMCwgCiAgICAgICAgICAgICAgICAgIDAsICAgICAxLCAgICAwLCAgICAgMCwKICAgICAgICAgICAgICAgICAgMCwgICAgIDAsICAgIDEsICAgICBkLAogICAgICAgICAgICAgICAgICAwLCAgICAgMCwgICAgMCwgICAgIDEgKSwgbnJvdz00LCBuY29sPTQsIGJ5cm93PVRSVUUpCiAgTUQgPSBtYXRyaXgoYyggIDEsICAgICAwLCAgICAwLCAgICAgMCwgCiAgICAgICAgICAgICAgICAgMS9GKnIsICAxLCAgICAwLCAgICAgMCwKICAgICAgICAgICAgICAgICAgMCwgICAgIDAsICAgIDEsICAgICAwLAogICAgICAgICAgICAgICAgICAwLCAgICAgMCwgLTEvRipyLCAgIDEgKSwgbnJvdz00LCBuY29sPTQsIGJ5cm93PVRSVUUpCiAgTUQgJSolIE1kICUqJSBNRiAlKiUgeDAKfQpGY24gPSBmdW5jdGlvbihyKXsKICBWID0gT3V0KHIpCiAgRnggPSBkLzIgLSBWWzFdL3RhbihWWzJdKQogIEZ5ID0gZC8yIC0gVlszXS90YW4oVls0XSkKYWJzKEZ4LUZ5KQp9CkYyZCA9IG9wdGltaXplKEZjbixjKDAuNSwxLjUpKQpyRmluID0gRjJkJG1pbmltdW0KYGBgCgpgYGB7ciBkb3VibGV0NCwgZXZhbD1UUlVFLCBlY2hvPVRSVUV9ClZmID0gT3V0KHJGaW4pCkZ4ID0gZC8yIC0gVmZbMV0vdGFuKFZmWzJdKQpGeSA9IGQvMiAtIFZmWzNdL3RhbihWZls0XSkKRng7IEZ5CmBgYAoKCklmIHdlIGluY3JlYXNlIHRoZSBzdHJlbmd0aCBvZiB0aGUgRCBxdWFkIGJ5IGZhY3RvciBgciByb3VuZChyRmluLDQpYCwgdGhlbiB0aGUgY29tbW9uIGZvY2FsIGxlbmd0aCB3aWxsIGJlIGBGeGAgPSBgciByb3VuZChGeCwyKWAgbSwgYEZ5YCA9IGByIHJvdW5kKEZ5LDIpYCBtCgoKCgojIyAqKkJldGF0cm9uIE1vdGlvbioqCgphLiBDcmVhdGUgYW4gYXJiaXRyYXJ5IHN5dGVtIG9mIDUwIHRoaW4gbGVuc2VzIG9mIHZhcnlpbmcgZm9jYWwgbGVuZ3RocyBhbmQgdmFyeWluZyBkaXN0YW5jZXMgb2Ygc2VwYXJhdGlvbi4gIEZvciBpbnN0YW5jZSwgdGFrZSBhbGwgdGhlIGxlbnNlcyBlcXVhbGx5IHNwYWNlZCBieSAzMCBtLCBidXQgdGhlbiBhZGQgcmFuZG9tIGZsdWN1dGF0aW9ucyBvZiAkXHBtJCAyIG0gdG8gZWFjaCBzcGFjaW5nLiAgTmV4dCwgdGFrZSB0aGUgbGVuc2VzIHRvIGhhdmUgZXF1YWwgZm9jYWwgbGVuZ3RocyBvZiAyNSBtLCB3aXRoIGV2ZXJ5LW90aGVyIHF1YWQgZm9jdXNpbmcgb3IgZGVmb2N1c2luZywgdGhlbiBhZGQgYSAxMCUgcmFuZG9tIGZsdWN0dWF0aW9uIHRvIGVhY2ggcXVhZC4gIE5leHQsIGNyZWF0ZSBhIGRpc3RyaWJ1dGlvbiBvZiAyMDAwIHBhcnRpY2xlcyBmcm9tIGFuIGFyYml0cmFyeSBzZXQgb2YgQ291cmFudC1TbnlkZXIgcGFyYW1ldGVycyBhbmQgZW1pdHRhbmNlLCBzYXkgJFxiZXRhJCA9IDQwIG0gYW5kICRcYWxwaGEkID0gLTEsIGFuZCB0cmFjayBlYWNoIHBhcnRpY2xlIHRocm91Z2ggdGhlIHN5c3RlbSAoMS1EIHBoYXNlIHNwYWNlIG9ubHkpLiAgSXMgdGhlIG1vdGlvbiBib3VuZGVkIChzYXksIGxlc3MgdGhhbiA1MCBtbSBtYXhpbXVtKT8gIElmIG5vdCwgdmFyeSB0aGUgaW5pdGlhbCBDUyBwYXJhbWV0ZXJzIG9mIHRoZSBwcm9ibGVtIHVudGlsIHRoZSBtYXhpbXVtIHBhcnRpY2xlIGV4Y3Vyc2lvbiBpcyBsZXNzIHRoYW4gYWJvdXQgNTAgbW0gdGhyb3VnaG91dCBtb3N0IHRoZSBzeXN0ZW0uICBNYWtlIGEgc2luZ2xlIHBsb3Qgb2YgdGhlIDIwMDAgdHJhamVjdG9yaWVzICgkeCQgdnMuICRzJCwgc2F5KSB0aHJvdWdoIHRoZSBzeXN0ZW0gdG8gdmVyaWZ5IHlvdXIgcmVzdWx0LgpgYGB7ciwgZXZhbD1UUlVFLGVjaG89VFJVRX0Kc2V0LnNlZWQoMjg1KQpObHMgPSA1MApMICAgPSAzMApxMCAgPSAxLzI1CmRzICA9IHJlcCgzMCxObHMpICAgICAgICAgICsgcnVuaWYoTmxzLC0yLDIpICAgICAgICAjICsvLSAyIG0gZmx1Y3R1YXRpb24gb24gTApxICAgPSByZXAoYygtcTAscTApLE5scy8yKSArIHJ1bmlmKE5scywtcTAscTApKjAuMSAgIyAgIDEwJSAgIGZsdWN0dWF0aW9uIG9uIHEKcyAgID0gYygwLGN1bXN1bShkcykpICAjIHRvdGFsIHBhdGggbGVuZ3RoCnBsb3Qoc1stMV0scSx0eXA9ImIiLHhsYWI9InMgW21dIix5bGFiPSJxIFsxL21dIikKYGBgCmBgYHtyLCBlY2hvPVRSVUUsIGV2YWw9VFJVRX0KaSA9IDAKTSA9IGxpc3QoZGlhZygxLDIpKQp3aGlsZShpPE5scyl7CiAgIGkgPSBpKzEKICAgTVtbaV1dID0gbWF0cml4KGMoICAgIDEsICAgICAgZHNbaV0gICAgICAsCiAgICAgICAgICAgICAgICAgICAtcVtpXSwgIDEtZHNbaV0qcVtpXSAgKSwgIG5jb2w9MixieXJvdz1UUlVFKQp9CmBgYApgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9Ck5wYXIgPSAyMDAwCmJldDAgPSA1MAphbGYwID0gLTIKZ2FtMCA9ICgxK2FsZjBeMikvYmV0MAplcHMwID0gMC4wNQp4MCAgPSAgcm5vcm0oTnBhciwwLCBzcXJ0KGVwczAqYmV0MCkpICAgICAgICAgICAgICAgICAjIGluaXRpYWwgeAp4cDAgPSAocm5vcm0oTnBhciwwLCBzcXJ0KGVwczAqYmV0MCkpLWFsZjAqeDApL2JldDAgICAjIGluaXRpYWwgeCcKcGxvdChzLHJlcCgwLE5scysxKSx4bGltPWMoMCxtYXgocykpLHlsaW09YygtMTAwLDEwMCksdHlwPSJuIix4bGFiPSJzIFttXSIseWxhYj0ieChzKSBbbW1dIikKYWJsaW5lKGg9YygtMSwxKSo1MCxsdHk9Mixjb2w9ImJsdWUiKQoKaiA9IDAKd2hpbGUoajxOcGFyKXsKICAgaiA9IGorMQogICBWMCAgID0gYyh4MFtqXSx4cDBbal0pCiAgIFYgICAgPSBWMAogICBWb3V0ID0gVjAKICAgaSA9IDAKICAgd2hpbGUoaTxObHMpewogICAgICBpID0gaSsxCiAgICAgIFYgPSBNW1tpXV0gJSolIFYKICAgICAgVm91dCA9IGNiaW5kKFZvdXQsVikKICAgfQogICB4cGx0ID0gVm91dFsxLF0KICAgcG9pbnRzKHMseHBsdCx0eXA9ImwiKQp9CmBgYAoKYi4gRnJvbSB0aGUgaW5pdGlhbCBzZXQgb2YgQ291cmFudC1TbnlkZXIgcGFyYW1ldGVycyB1c2VkIGFib3ZlLCAidHJhY2siIHRoZWlyIHZhbHVlcyB1c2luZyAkSyA9IE1LTV5UJCBhbG9uZyB0aGUgZXhhY3Qgc2FtZSBiZWFtbGluZSBhbmQgcGxvdCAkXHNxcnR7XGJldGF9JCB2cy4gJHMkOyBjb21wYXJlIHdpdGggdGhlIGVhcmxpZXIgdHJhY2tpbmcgcmVzdWx0LgpgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CksgPSBsaXN0KG1hdHJpeChjKGJldDAsLWFsZjAsLWFsZjAsZ2FtMCksbmNvbCA9IDIsIGJ5cm93ID0gVFJVRSkpCmJldGFzID0gMAppID0gMAp3aGlsZShpPE5scyl7CiAgIGk9aSsxCiAgIEtbW2krMV1dID0gTVtbaV1dICUqJSBLW1tpXV0gJSolIHQoTVtbaV1dKQogICBiZXRhc1tpXSA9IEtbW2krMV1dWzEsMV0KfQpwbG90KHNbLTFdLHNxcnQoYmV0YXMpLHR5cD0ibCIpCmBgYApgYGB7ciwgZWNobz1UUlVFLCBldmFsPVRSVUV9CnBsb3QocyxyZXAoMCxObHMrMSkseGxpbT1jKDAsbWF4KHMpKSx5bGltPWMoLTEwMCwxMDApLHR5cD0ibiIseGxhYj0icyBbbV0iLHlsYWI9IngocykgW21tXSIpCmFibGluZShoPWMoLTEsMSkqNTAsbHR5PTIsY29sPSJibHVlIikKaiA9IDAKd2hpbGUoajxOcGFyKXsKICAgaiA9IGorMQogICBWMCAgID0gYyh4MFtqXSx4cDBbal0pCiAgIFYgICAgPSBWMAogICBWb3V0ID0gVjAKICAgaSA9IDAKICAgd2hpbGUoaTxObHMpewogICAgICBpID0gaSsxCiAgICAgIFYgPSBNW1tpXV0gJSolIFYKICAgICAgVm91dCA9IGNiaW5kKFZvdXQsVikKICAgfQogICB4cGx0ID0gVm91dFsxLF0KICAgcG9pbnRzKHMseHBsdCx0eXA9ImwiKQp9CnBvaW50cyhzWy0xXSwgc3FydChiZXRhcyksdHlwPSJsIixjb2w9InJlZCIsbHdkPTMpCnBvaW50cyhzWy0xXSwtc3FydChiZXRhcyksdHlwPSJsIixjb2w9InJlZCIsbHdkPTMpCmBgYAoKYy4gSWYgeW91ciBhcmJpdHJhcnkgc3lzdGVtIGFib3ZlIHdlcmUgcmVwZWF0ZWQgaW5kZWZpbml0ZWx5LCB3b3VsZCB0aGUgc3lzdGVtIGJlIHN0YWJsZT8KYGBge3IsIGVjaG89VFJVRSwgZXZhbD1UUlVFfQpNdG90ID0gZGlhZygxLDIpCmk9MAp3aGlsZShpPE5scyl7CiAgIGk9aSsxCiAgIE10b3QgPSBNW1tpXV0gJSolIE10b3QKfQpNdG90CnN1bShkaWFnKE10b3QpKQpzdGFibGUgPSBpZmVsc2UoIGFicyhzdW0oZGlhZyhNdG90KSkpPDIsICJ5ZXMiLCAibm8iKQpzdGFibGUKYGBgCgpJcyB0aGUgcmluZyBzdGFibGU/ICBBbnN3ZXI6ICBgciBzdGFibGVgLgoKIyMgKipBIEJvb3N0ZXIgUmluZyoqCgpDb25zaWRlciBhIHN5c3RlbSBtYWRlIG9mIF90aGluIGxlbnNfIHF1YWRydXBvbGVzIHdpdGggdGhlIGZvbGxvd2luZyBhcnJhbmdlbWVudDogICoqRk9PRk9ET09PT0RPKioKCmBgYHtyIHN5bmNocm90cm9uMDQsZXZhbD1UUlVFLCBlY2hvPVRSVUV9CmMgPSAyLjk5NzllOCAgIyBtL3MKRiA9IDYgICAjIG0KTCA9IDIuNSAjIG0KTnMgPSAyNApDID0gOCpMKk5zCkJtYXggPSAyICAjIFQKVHIgPSAwLjUgICMgczsgbWF4IHJhbXAgdGltZQpwZiA9IDAuOApoID0gMgpFMCA9IDkzOCAjIE1lViAobWNeMiwgcHJvdG9uKQpFMSA9IDEwMCAgIyBNZVYKRTIgPSAxMDAwICMgTWVWCnBoaV9zID0gMjgqcGkvMTgwCmBgYAoKSGVyZSwgKkYqIHJlcHJlc2VudHMgYSBob3Jpem9udGFsbHkgZm9jdXNpbmcgbGVucyB3aXRoIGZvY2FsIGxlbmd0aCAkRiQgPSBgciBGYCBtLCAqRCogcmVwcmVzZW50cyBhIGhvcml6b250YWxseSBkZWZvY3VzaW5nIGxlbnMgb2YgZm9jYWwgbGVuZ3RoICQtRiQsIGFuZCAqTyogcmVwcmVzZW50cyBhIGRyaWZ0IHNwYWNlIG9mIGxlbmd0aCAkTCQgPSBgciBMYCBtLgoKYS4gIERldGVybWluZSBpZiB0aGUgc3lzdGVtIGlzIHN0YWJsZSBpbiBlYWNoIHBsYW5lICQoeCwgeSkkLiAgSWYgaXQgaXMsIGRldGVybWluZSB0aGUgcGhhc2UgYWR2YW5jZSBpbiBkZWdyZWVzIHRocm91Z2ggdGhlIHN5c3RlbSBmb3IgZWFjaCBwbGFuZS4KCmBgYHtyIHN0YWJpbGl0eTA0LCBldmFsPVRSVUUsIGVjaG89VFJVRX0KTWYgPSBtYXRyaXgoYyggIDEsICAwLAogICAgICAgICAgICAgIC0xL0YsIDEpLCBucm93PTIsIG5jb2w9MiwgYnlyb3c9VFJVRSkKTWQgPSBtYXRyaXgoYyggIDEsICAwLAogICAgICAgICAgICAgICAxL0YsIDEpLCBucm93PTIsIG5jb2w9MiwgYnlyb3c9VFJVRSkKTW8gPSBtYXRyaXgoYyggIDEsICBMLAogICAgICAgICAgICAgICAgMCwgIDEpLCBucm93PTIsIG5jb2w9MiwgYnlyb3c9VFJVRSkKCk1mCk1kCk1vCgpNeCA9IE1vICUqJSBNZCAgJSolIE1vICUqJSBNbyAlKiUgTW8gJSolIE1vICUqJSBNZCAlKiUgTW8gJSolIE1mICUqJSBNbyAlKiUgTW8gJSolIE1mCk15ID0gTW8gJSolIE1mICAlKiUgTW8gJSolIE1vICUqJSBNbyAlKiUgTW8gJSolIE1mICUqJSBNbyAlKiUgTWQgJSolIE1vICUqJSBNbyAlKiUgTWQKCk14Ck15Cgp0TXggPSBzdW0oZGlhZyhNeCkpCnRNeSA9IHN1bShkaWFnKE15KSkKCnRNeAp0TXkKCm11X3ggPSBhY29zKHRNeC8yKQptdV95ID0gYWNvcyh0TXkvMikKCm11X3gqMTgwL3BpOyBtdV95KjE4MC9waQpgYGAKCmIuICBGb3IgYSBzeW5jaHJvdHJvbiBtYWRlIHVwIG9mIGByIE5zYCBzdWNoIHNlY3Rpb25zLCBwcm92aWRlZCB0aGF0IHRoZSBtb3Rpb24gaXMgc3RhYmxlLCBkZXRlcm1pbmUgdGhlIGJldGF0cm9uIG9zY2lsbGF0aW9uIHR1bmVzICQoXG51X3gsIFxudV95KSQgb2YgdGhlIHN5bmNocm90cm9uIGZvciBlYWNoIGRlZ3JlZSBvZiBmcmVlZG9tICgkeCQgYW5kICR5JCkuCgpgYGB7ciB0dW5lczA0LCBldmFsPVRSVUUsIGVjaG89VFJVRX0KbnVfeCA9IG11X3ggKiBOcyAvIDIvcGkKbnVfeSA9IG11X3kgKiBOcyAvIDIvcGkKbnVfeDsgbnVfeQpgYGAKCmMuICBXaGF0IGFyZSB0aGUgbWF4aW11bSB2YWx1ZXMgb2YgdGhlIGFtcGxpdHVkZSBmdW5jdGlvbnMgJFxiZXRhX3gkIGFuZCAkXGJldGFfeSQ/CgpgYGB7ciBtYXhCZXRhcywgZXZhbD1UUlVFLCBlY2hvPVRSVUV9CiMgbWF4IGJldGF4IHNob3VsZCBiZSBhdCBvbmUgb2YgdGhlIEYgcXVhZHM7IG1heCBiZXRheSBhdCBvbmUgb2YgdGhlIEQgcXVhZHMsCiMgICAgc2luY2UgIkQiIGlzIGEgZm9jdXNpbmcgbWFnbmV0IGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24KTXgxID0gTW8gJSolIE1kICUqJSBNbyAlKiUgTW8gJSolIE1vICUqJSBNbyAlKiUgTWQgJSolIE1vICUqJSBNZiAlKiUgTW8gJSolIE1vICUqJSBNZiAjIGFzIGdpdmVuCk14MiA9IE1mICUqJSBNbyAlKiUgTW8gJSolIE1mICUqJSBNbyAlKiUgTWQgJSolIE1vICUqJSBNbyAlKiUgTW8gJSolIE1vICUqJSBNZCAlKiUgTW8gIyBjeWNsaWMgcGVybXV0YXRpb24KCk15MSA9IE1vICUqJSBNZiAlKiUgTW8gJSolIE1vICUqJSBNbyAlKiUgTW8gJSolIE1mICUqJSBNbyAlKiUgTWQgJSolIE1vICUqJSBNbyAlKiUgTWQgIyBhcyBnaXZlbgpNeTIgPSBNZCAlKiUgTW8gJSolIE1vICUqJSBNZCAlKiUgTW8gJSolIE1mICUqJSBNbyAlKiUgTW8gJSolIE1vICUqJSBNbyAlKiUgTWYgJSolIE1vICMgY3ljbGljIHBlcm11dGF0aW9uCgpieDEgPSBNeDFbMSwyXS9zaW4obXVfeCkKYngyID0gTXgyWzEsMl0vc2luKG11X3gpCgpieTEgPSBNeTFbMSwyXS9zaW4obXVfeSkKYnkyID0gTXkyWzEsMl0vc2luKG11X3kpCgojIHRodXMsIHRoZSBtYXhpbXVtIHdpbGwgYmUgdGhlIG1heCBvZiB0aGVzZSB0d28gdmFsdWVzOyBwcm9jZXNzIHJlcGVhdGVkIGZvciBlYWNoIHBsYW5lOgptYXgoYngxLGJ4MikKbWF4KGJ5MSxieTIpCmBgYAo=