Fuente: ifsc.org
Reading Data
Innsbruck
Innsbruck: Semi-finals
Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Innsbruck Semis
Innsbruck: Final
Finals

-Competitors = n.final-

#######_ Elo History _

Elo Accumulated Innsbruck Final

competitor Ctry Expectation R.new E.Finals E.podium
sorato ANRAKU JPN 0.8816913 2304.94 0.86 0.85
tomoa NARASAKI JPN 0.7700000 2153.18 0.74 0.66
meichi NARASAKI JPN 0.7128432 2119.33 0.68 0.67
adam ONDRA CZE NA 2113.00 NA NA
mejdi SCHALCK FRA NA 2110.00 NA NA
sam AVEZOU FRA NA 2088.00 NA NA
hannes van DUYSEN BEL NA 2082.00 NA NA
paul JENFT FRA NA 2069.00 NA NA
dohyun LEE KOR NA 2062.00 NA NA
toby ROBERTS GBR 0.6348234 2051.16 0.59 0.58
jakob SCHUBERT AUT NA 2047.00 NA NA
kokoro FUJII JPN NA 2026.00 NA NA
alberto gines LOPEZ ESP NA 2009.00 NA NA
hamish MCARTHUR GBR NA 2005.00 NA NA
yannick FLOHE GER NA 2002.00 NA NA
sohta AMAGASA JPN 0.5434950 1997.04 0.50 0.50
yoshiyuki OGATA JPN NA 1994.00 NA NA
ritsu KAYOTANI JPN 0.5612561 1991.56 0.52 0.49
rei SUGIMOTO JPN NA 1988.00 NA NA
colin DUFFY USA 0.5900000 1984.02 0.52 0.42
jongwon CHON KOR NA 1981.00 NA NA
elias ARRIAGADA KRÜGER GER 0.5260675 1970.84 0.48 0.46
mickael MAWEM FRA NA 1965.00 NA NA
tomoaki TAKATA JPN NA 1957.00 NA NA
jan-luca POSCH AUT NA 1950.00 NA NA
ardch INTRACHUPONGSE THA 0.5000000 1948.01 0.47 0.38
alexander MEGOS GER NA 1946.00 NA NA
nathaniel COLEMAN USA NA 1943.00 NA NA
yuji FUJIWAKI JPN 0.5000000 1940.90 0.46 0.37
thomas LEMAGNER FRA 0.5000000 1926.67 0.44 0.35
nicolai UZNIK AUT NA 1921.00 NA NA
dayan AKHTAR GBR 0.5000000 1919.56 0.43 0.34
sean BAILEY USA NA 1917.00 NA NA
samuel RICHARD FRA 0.5000000 1916.01 0.42 0.33
yuji INOUE JPN NA 1916.00 NA NA
guillermo PEINADO FRANGANILLO ESP 0.5000000 1912.45 0.42 0.33
manuel CORNU FRA NA 1909.00 NA NA
junzhe HU CHN 0.5000000 1908.90 0.41 0.32
yejun CHON KOR 0.5000000 1905.34 0.41 0.32
maximillian MILNE GBR NA 1901.00 NA NA
anze PEHARC SLO 0.4300000 1884.70 0.38 0.29
mathieu TERNANT FRA NA 1869.00 NA NA
nicolas COLLIN BEL NA 1867.00 NA NA
jack MACDOUGALL GBR NA 1866.00 NA NA
gabriele MORONI ITA NA 1853.00 NA NA
yufei PAN CHN NA 1848.00 NA NA
simon LORENZI BEL NA 1843.00 NA NA
nimrod MARCUS ISR NA 1837.00 NA NA
zan lovenjak SUDAR SLO NA 1828.00 NA NA
gholamali BARATZADEH IRI NA 1824.00 NA NA
zach GALLA USA NA 1810.00 NA NA
benjamin HANNA USA NA 1806.00 NA NA
daiki SANO JPN NA 1803.00 NA NA
gregor VEZONIK SLO 0.3200000 1802.82 0.28 0.21
satone YOSHIDA JPN 0.3100000 1800.01 0.27 0.20
oscar BAUDRAND CAN NA 1794.00 NA NA
nikolay RUSEV BUL NA 1790.00 NA NA
alex KHAZANOV ISR NA 1778.00 NA NA
filip SCHENK ITA NA 1770.00 NA NA
Prague.2024
Prague.2024: Semi-finals
Semi-finals

-Competitors = n.semis-

#####_ Elo History _

Elo Accumulated Prague.2024 Semis
Prague.2024: Final
Finals

-Competitors = n.final-

#######_ Elo History _

Elo Accumulated Prague.2024 Final

competitor Ctry Expectation R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 0.9000000 2345.78 81 % 79.57 %
tomoa NARASAKI JPN 0.7800000 2189.04 63 % 61.25 %
adam ONDRA CZE 0.7200000 2132.80 56 % 53.34 %
dohyun LEE KOR 0.6700000 2109.54 50 % 50 %
mejdi SCHALCK FRA 0.7000000 2108.88 53.63 % 50 %
meichi NARASAKI JPN 0.7100000 2104.69 53.03 % 49.4 %
toby ROBERTS GBR 0.6500000 2088.85 48 % 47.03 %
sam AVEZOU FRA 0.6800000 2083.62 50 % 46.37 %
hannes van DUYSEN BEL NA 2082.00 NA NA
paul JENFT FRA NA 2069.00 NA NA
jakob SCHUBERT AUT NA 2047.00 NA NA
kokoro FUJII JPN NA 2026.00 NA NA
alberto gines LOPEZ ESP NA 2009.00 NA NA
hamish MCARTHUR GBR NA 2005.00 NA NA
yannick FLOHE GER NA 2002.00 NA NA
sohta AMAGASA JPN 0.5434950 1997.04 50 % 50 %
yoshiyuki OGATA JPN NA 1994.00 NA NA
rei SUGIMOTO JPN NA 1988.00 NA NA
colin DUFFY USA 0.5900000 1984.02 51.9 % 42.49 %
ritsu KAYOTANI JPN 0.5400000 1980.96 35.64 % 32.38 %
jongwon CHON KOR 0.5300000 1973.83 34.71 % 31.49 %
elias ARRIAGADA KRÜGER GER 0.5260675 1970.84 48 % 46.24 %
mickael MAWEM FRA NA 1965.00 NA NA
tomoaki TAKATA JPN NA 1957.00 NA NA
adam SHAHAR USA 0.4700000 1950.45 31.72 % 28.66 %
jan-luca POSCH AUT NA 1950.00 NA NA
manuel CORNU FRA 0.4500000 1949.66 29 % 28.49 %
ardch INTRACHUPONGSE THA 0.5000000 1948.01 46.72 % 37.52 %
alexander MEGOS GER NA 1946.00 NA NA
nathaniel COLEMAN USA NA 1943.00 NA NA
thomas LEMAGNER FRA 0.5000000 1926.67 43.68 % 34.69 %
yuji FUJIWAKI JPN 0.4700000 1920.49 28.11 % 25.27 %
dayan AKHTAR GBR 0.5000000 1919.56 42.67 % 33.77 %
samuel RICHARD FRA 0.4400000 1919.32 27.97 % 25.14 %
sean BAILEY USA NA 1917.00 NA NA
nicolò SARTIRANA ITA 0.4700000 1916.76 27.68 % 24.86 %
yuji INOUE JPN NA 1916.00 NA NA
guillermo PEINADO FRANGANILLO ESP 0.5000000 1912.45 41.68 % 32.86 %
max KLEESATTEL GER 0.4700000 1910.03 26.91 % 24.15 %
junzhe HU CHN 0.5000000 1908.90 41.18 % 32.41 %
maximillian MILNE GBR 0.4100000 1907.76 26.65 % 23.91 %
ram LEVIN ISR 0.4700000 1906.66 26.53 % 23.79 %
yejun CHON KOR 0.5000000 1905.34 40.68 % 31.96 %
nicolai UZNIK AUT 0.4400000 1893.97 25.13 % 22.49 %
mathieu TERNANT FRA NA 1869.00 NA NA
anze PEHARC SLO 0.3900000 1867.97 22.42 % 19.99 %
nicolas COLLIN BEL NA 1867.00 NA NA
jack MACDOUGALL GBR NA 1866.00 NA NA
gabriele MORONI ITA NA 1853.00 NA NA
yufei PAN CHN NA 1848.00 NA NA
simon LORENZI BEL NA 1843.00 NA NA
nimrod MARCUS ISR NA 1837.00 NA NA
zan lovenjak SUDAR SLO NA 1828.00 NA NA
gholamali BARATZADEH IRI NA 1824.00 NA NA
zach GALLA USA NA 1810.00 NA NA
benjamin HANNA USA NA 1806.00 NA NA
daiki SANO JPN NA 1803.00 NA NA
gregor VEZONIK SLO 0.3200000 1802.82 27.54 % 20.66 %
satone YOSHIDA JPN 0.3100000 1800.01 27.22 % 20.39 %
oscar BAUDRAND CAN NA 1794.00 NA NA
nikolay RUSEV BUL NA 1790.00 NA NA
alex KHAZANOV ISR NA 1778.00 NA NA
filip SCHENK ITA NA 1770.00 NA NA
Seoul.2024
Seoul.2024: Semi-finals
Semi-finals

-Competitors = n.semis-

#######_ Elo History _

Elo Accumulated Seoul.2024 Semis
Seoul.2024: Final
Finals

-Competitors = n.final-

#######_ Elo History _

Elo Accumulated Seoul.2024 Final

competitor Ctry Expectation R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 0.9000000 2330.60 82.1 % 76.86 %
tomoa NARASAKI JPN 0.7900000 2187.76 66.85 % 59.34 %
dohyun LEE KOR 0.7200000 2146.43 58 % 69.12 %
meichi NARASAKI JPN 0.7300000 2141.46 60 % 68.5 %
adam ONDRA CZE 0.7200000 2132.80 56 % 53.34 %
mejdi SCHALCK FRA 0.7000000 2118.04 57.44 % 49.42 %
toby ROBERTS GBR 0.6500000 2088.85 48 % 47.03 %
hannes van DUYSEN BEL NA 2082.00 NA NA
paul JENFT FRA 0.6500000 2078.35 51.78 % 43.74 %
sam AVEZOU FRA 0.6700000 2065.95 50 % 41.99 %
jakob SCHUBERT AUT NA 2047.00 NA NA
sohta AMAGASA JPN 0.5900000 2042.60 44 % 55.18 %
kokoro FUJII JPN NA 2026.00 NA NA
alberto gines LOPEZ ESP NA 2009.00 NA NA
jongwon CHON KOR 0.5500000 2006.49 40 % 50 %
hamish MCARTHUR GBR NA 2005.00 NA NA
yannick FLOHE GER NA 2002.00 NA NA
yoshiyuki OGATA JPN NA 1994.00 NA NA
rei SUGIMOTO JPN NA 1988.00 NA NA
ritsu KAYOTANI JPN 0.5300000 1984.03 38.42 % 31.12 %
colin DUFFY USA 0.5900000 1984.02 51.9 % 42.49 %
elias ARRIAGADA KRÜGER GER 0.5260675 1970.84 48 % 46.24 %
mickael MAWEM FRA NA 1965.00 NA NA
tomoaki TAKATA JPN NA 1957.00 NA NA
maximillian MILNE GBR 0.4600000 1955.20 32 % 42.67 %
dayan AKHTAR GBR 0.4600000 1953.39 32 % 42.42 %
jan-luca POSCH AUT NA 1950.00 NA NA
ardch INTRACHUPONGSE THA 0.5000000 1948.01 46.72 % 37.52 %
alexander MEGOS GER NA 1946.00 NA NA
adam SHAHAR USA 0.4800000 1943.58 33.08 % 26.36 %
nathaniel COLEMAN USA NA 1943.00 NA NA
charles BARRON USA 0.4700000 1933.72 31.84 % 25.27 %
thomas LEMAGNER FRA 0.4500000 1923.29 30.55 % 24.15 %
julien CLÉMENCE SUI 0.4700000 1920.25 30.18 % 23.84 %
samuel RICHARD FRA 0.4400000 1919.32 27.97 % 25.14 %
sean BAILEY USA NA 1917.00 NA NA
nicolò SARTIRANA ITA 0.4700000 1916.76 27.68 % 24.86 %
yuji INOUE JPN NA 1916.00 NA NA
manuel CORNU FRA 0.4800000 1915.85 29.65 % 23.38 %
timotej ROMŠAK SLO 0.4700000 1913.51 29.37 % 23.14 %
guillermo PEINADO FRANGANILLO ESP 0.5000000 1912.45 41.68 % 32.86 %
max KLEESATTEL GER 0.4700000 1910.03 26.91 % 24.15 %
junzhe HU CHN 0.5000000 1908.90 41.18 % 32.41 %
ram LEVIN ISR 0.4700000 1906.66 26.53 % 23.79 %
yejun CHON KOR 0.5000000 1905.34 40.68 % 31.96 %
nicolai UZNIK AUT 0.4400000 1893.97 25.13 % 22.49 %
yuji FUJIWAKI JPN 0.4400000 1890.20 26.66 % 20.84 %
mathieu TERNANT FRA NA 1869.00 NA NA
nicolas COLLIN BEL NA 1867.00 NA NA
jack MACDOUGALL GBR NA 1866.00 NA NA
gabriele MORONI ITA NA 1853.00 NA NA
yufei PAN CHN NA 1848.00 NA NA
anze PEHARC SLO 0.3700000 1844.69 21.86 % 16.84 %
simon LORENZI BEL NA 1843.00 NA NA
nimrod MARCUS ISR NA 1837.00 NA NA
zan lovenjak SUDAR SLO NA 1828.00 NA NA
gholamali BARATZADEH IRI NA 1824.00 NA NA
zach GALLA USA NA 1810.00 NA NA
benjamin HANNA USA NA 1806.00 NA NA
daiki SANO JPN NA 1803.00 NA NA
gregor VEZONIK SLO 0.3200000 1802.82 27.54 % 20.66 %
satone YOSHIDA JPN 0.3100000 1800.01 27.22 % 20.39 %
oscar BAUDRAND CAN NA 1794.00 NA NA
nikolay RUSEV BUL NA 1790.00 NA NA
alex KHAZANOV ISR NA 1778.00 NA NA
filip SCHENK ITA NA 1770.00 NA NA
Keqiao.2025
Keqiao.2025: Semi-finals
Semi-finals

-Competitors = n.semis-

#######_ Elo History _

Elo Accumulated Keqiao.2025 Semis
Keqiao.2025: Final
Finals

-Competitors = n.final-

#######_ Elo History _

Elo Accumulated Keqiao.2025 Final
Curitiba
Curitiba: Semi-finals
Semi-finals

-Competitors = n.semis-

#######_ Elo History _

Elo Accumulated Curitiba Semis
Curitiba: Final
Finals

-Competitors = n.final-

#######_ Elo History _

Elo Accumulated Curitiba Final

competitor Ctry Expectation R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 0.94 2434.52 93 % 85.8 %
tomoa NARASAKI JPN 0.85 2263.66 84 % 69.33 %
mejdi SCHALCK FRA 0.80 2203.62 78 % 61.54 %
dohyun LEE KOR 0.78 2198.54 67 % 53.09 %
meichi NARASAKI JPN 0.80 2185.03 78.41 % 50.63 %
adam ONDRA CZE 0.72 2132.80 56 % 53.34 %
paul JENFT FRA 0.73 2121.98 70 % 50 %
sam AVEZOU FRA 0.68 2096.97 55 % 38.68 %
sohta AMAGASA JPN 0.67 2085.06 65 % 44.71 %
hannes van DUYSEN BEL NA 2082.00 NA NA
toby ROBERTS GBR 0.69 2079.30 54.21 % 39.04 %
jakob SCHUBERT AUT NA 2047.00 NA NA
kokoro FUJII JPN NA 2026.00 NA NA
alberto gines LOPEZ ESP NA 2009.00 NA NA
jongwon CHON KOR 0.59 2007.16 56.6 % 26.92 %
hamish MCARTHUR GBR NA 2005.00 NA NA
yannick FLOHE GER NA 2002.00 NA NA
yoshiyuki OGATA JPN NA 1994.00 NA NA
ritsu KAYOTANI JPN 0.53 1984.03 38.42 % 31.12 %
oren PRIHED ISR 0.52 1970.77 38 % 23.37 %
jan-luca POSCH AUT 0.53 1967.08 50 % 29.08 %
colin DUFFY USA 0.55 1966.66 38.23 % 25.08 %
mickael MAWEM FRA NA 1965.00 NA NA
rei SUGIMOTO JPN 0.57 1964.18 50.46 % 22.33 %
elias ARRIAGADA KRÜGER GER 0.54 1961.01 50 % 22.02 %
dayan AKHTAR GBR 0.50 1958.45 37.12 % 24.21 %
tomoaki TAKATA JPN NA 1957.00 NA NA
maximillian MILNE GBR 0.46 1955.20 32 % 42.67 %
ardch INTRACHUPONGSE THA 0.50 1948.01 46.72 % 37.52 %
adrien LEMAIRE FRA 0.50 1946.86 47.96 % 20.65 %
alexander MEGOS GER NA 1946.00 NA NA
julian WIMMER AUT 0.50 1944.19 47.58 % 20.4 %
adam SHAHAR USA 0.48 1943.58 33.08 % 26.36 %
nathaniel COLEMAN USA NA 1943.00 NA NA
thorben perry BLOEM GER 0.48 1940.11 34.7 % 22.32 %
ziqi XU CHN 0.48 1934.54 33.97 % 21.77 %
charles BARRON USA 0.47 1933.72 31.84 % 25.27 %
ido FIDEL ISR 0.50 1922.86 44.53 % 18.48 %
lasse VON FREIER GER 0.50 1920.19 44.15 % 18.25 %
samuel RICHARD FRA 0.44 1919.32 27.97 % 25.14 %
thomas LEMAGNER FRA 0.48 1919.02 43.99 % 18.15 %
lucas TRANDAFIR GER 0.50 1917.52 43.77 % 18.02 %
sean BAILEY USA NA 1917.00 NA NA
yuji INOUE JPN NA 1916.00 NA NA
manuel CORNU FRA 0.48 1915.85 29.65 % 23.38 %
timotej ROMŠAK SLO 0.47 1913.51 29.37 % 23.14 %
guillermo PEINADO FRANGANILLO ESP 0.50 1912.45 41.68 % 32.86 %
zander WALLER USA 0.48 1912.28 31.16 % 19.67 %
tim WÜRTHNER GER 0.50 1912.19 43.02 % 17.57 %
jiahao FU CHN 0.48 1909.50 30.82 % 19.42 %
junzhe HU CHN 0.50 1908.90 41.18 % 32.41 %
ram LEVIN ISR 0.47 1906.66 26.53 % 23.79 %
yejun CHON KOR 0.50 1905.34 40.68 % 31.96 %
julien CLÉMENCE SUI 0.47 1905.33 42.05 % 17.01 %
nicolò SARTIRANA ITA 0.47 1904.52 41.94 % 16.94 %
leo FAVOT FRA 0.50 1903.66 41.82 % 16.87 %
yuji FUJIWAKI JPN 0.42 1900.44 39 % 21.84 %
hannes VAN DUYSEN BEL 0.45 1899.87 41.29 % 16.57 %
nicolai UZNIK AUT 0.44 1893.97 25.13 % 22.49 %
max KLEESATTEL GER 0.46 1879.16 38.43 % 14.99 %
anze PEHARC SLO 0.38 1869.43 35 % 18.94 %
mathieu TERNANT FRA NA 1869.00 NA NA
jack MACDOUGALL GBR NA 1866.00 NA NA
nicolas COLLIN BEL 0.40 1865.67 36.61 % 14.02 %
gabriele MORONI ITA NA 1853.00 NA NA
yufei PAN CHN NA 1848.00 NA NA
simon LORENZI BEL NA 1843.00 NA NA
nimrod MARCUS ISR NA 1837.00 NA NA
zan lovenjak SUDAR SLO NA 1828.00 NA NA
gholamali BARATZADEH IRI NA 1824.00 NA NA
zach GALLA USA NA 1810.00 NA NA
daiki SANO JPN NA 1803.00 NA NA
gregor VEZONIK SLO 0.32 1802.82 27.54 % 20.66 %
satone YOSHIDA JPN 0.31 1800.01 27.22 % 20.39 %
oscar BAUDRAND CAN NA 1794.00 NA NA
benjamin HANNA USA 0.30 1781.21 17.55 % 10.32 %
alex KHAZANOV ISR NA 1778.00 NA NA
nikolay RUSEV BUL 0.28 1773.63 16.93 % 9.93 %
filip SCHENK ITA NA 1770.00 NA NA
Salt.Lake.City.25
Salt.Lake.City.25: Semi-finals
Semi-finals

-Competitors = n.semis-

#######_ Elo History _

Elo Accumulated Salt.Lake.City.25 Semis
Salt.Lake.City.25: Final
Finals

-Competitors = n.final-

#######_ Elo History _

Elo Accumulated Salt.Lake.City.25 Final

competitor Ctry Expectation R.new Prob.Finals Prob.podium
sorato ANRAKU JPN 0.95 2488.31 94 % 83.02 %
tomoa NARASAKI JPN 0.85 2268.24 83.95 % 56.12 %
dohyun LEE KOR 0.82 2245.37 80 % 54.7 %
mejdi SCHALCK FRA 0.83 2239.29 81 % 53.83 %
meichi NARASAKI JPN 0.80 2212.61 78 % 50 %
adam ONDRA CZE 0.72 2132.80 56 % 53.34 %
sohta AMAGASA JPN 0.70 2127.67 67 % 38.01 %
paul JENFT FRA 0.72 2115.80 68.5 % 34.71 %
sam AVEZOU FRA 0.68 2096.97 55 % 38.68 %
hannes van DUYSEN BEL NA 2082.00 NA NA
toby ROBERTS GBR 0.69 2079.30 54.21 % 39.04 %
jakob SCHUBERT AUT NA 2047.00 NA NA
kokoro FUJII JPN NA 2026.00 NA NA
hamish MCARTHUR GBR 0.57 2013.16 54.64 % 22.75 %
alberto gines LOPEZ ESP NA 2009.00 NA NA
jongwon CHON KOR 0.59 2007.16 56.6 % 26.92 %
yannick FLOHE GER NA 2002.00 NA NA
colin DUFFY USA 0.53 1999.91 50 % 22.72 %
yoshiyuki OGATA JPN NA 1994.00 NA NA
rei SUGIMOTO JPN 0.53 1989.10 50 % 21.64 %
ritsu KAYOTANI JPN 0.53 1984.03 38.42 % 31.12 %
oren PRIHED ISR 0.52 1970.77 38 % 23.37 %
jan-luca POSCH AUT 0.53 1967.08 50 % 29.08 %
mickael MAWEM FRA NA 1965.00 NA NA
dayan AKHTAR GBR 0.50 1958.44 46.78 % 17.69 %
tomoaki TAKATA JPN NA 1957.00 NA NA
adrien LEMAIRE FRA 0.50 1946.86 47.96 % 20.65 %
alexander MEGOS GER NA 1946.00 NA NA
maximillian MILNE GBR 0.50 1944.08 44.73 % 16.52 %
nathaniel COLEMAN USA NA 1943.00 NA NA
thorben perry BLOEM GER 0.48 1940.11 34.7 % 22.32 %
elias ARRIAGADA KRÜGER GER 0.51 1938.73 43.97 % 16.1 %
yuji FUJIWAKI JPN 0.45 1934.61 42 % 16.79 %
ziqi XU CHN 0.48 1934.54 33.97 % 21.77 %
charles BARRON USA 0.47 1933.72 31.84 % 25.27 %
ardch INTRACHUPONGSE THA 0.49 1925.78 42.14 % 15.12 %
ido FIDEL ISR 0.50 1922.86 44.53 % 18.48 %
lasse VON FREIER GER 0.50 1920.19 44.15 % 18.25 %
samuel RICHARD FRA 0.44 1919.32 27.97 % 25.14 %
lucas TRANDAFIR GER 0.50 1917.52 43.77 % 18.02 %
sean BAILEY USA NA 1917.00 NA NA
yuji INOUE JPN NA 1916.00 NA NA
manuel CORNU FRA 0.48 1915.85 29.65 % 23.38 %
julian WIMMER AUT 0.48 1913.63 40.45 % 14.24 %
timotej ROMŠAK SLO 0.47 1913.51 29.37 % 23.14 %
adam SHAHAR USA 0.48 1913.02 40.36 % 14.2 %
raffael GRUBER AUT 0.48 1912.78 40.33 % 14.18 %
guillermo PEINADO FRANGANILLO ESP 0.50 1912.45 41.68 % 32.86 %
zander WALLER USA 0.48 1912.28 31.16 % 19.67 %
tim WÜRTHNER GER 0.50 1912.19 43.02 % 17.57 %
jiahao FU CHN 0.48 1909.50 30.82 % 19.42 %
junzhe HU CHN 0.50 1908.90 41.18 % 32.41 %
ram LEVIN ISR 0.47 1906.66 26.53 % 23.79 %
yejun CHON KOR 0.50 1905.34 40.68 % 31.96 %
julien CLÉMENCE SUI 0.47 1905.33 42.05 % 17.01 %
thomas LEMAGNER FRA 0.45 1905.26 39.29 % 13.66 %
nicolò SARTIRANA ITA 0.47 1904.52 41.94 % 16.94 %
leo FAVOT FRA 0.50 1903.66 41.82 % 16.87 %
hannes VAN DUYSEN BEL 0.42 1897.31 38.2 % 13.13 %
nicolai UZNIK AUT 0.44 1893.97 25.13 % 22.49 %
max KLEESATTEL GER 0.46 1879.16 38.43 % 14.99 %
jack MACDOUGALL GBR 0.37 1871.92 34.82 % 11.55 %
mathieu TERNANT FRA NA 1869.00 NA NA
nicolas COLLIN BEL 0.40 1865.67 36.61 % 14.02 %
anze PEHARC SLO 0.38 1853.08 32.4 % 10.49 %
gabriele MORONI ITA NA 1853.00 NA NA
yufei PAN CHN NA 1848.00 NA NA
simon LORENZI BEL NA 1843.00 NA NA
nimrod MARCUS ISR NA 1837.00 NA NA
zan lovenjak SUDAR SLO NA 1828.00 NA NA
gholamali BARATZADEH IRI NA 1824.00 NA NA
zach GALLA USA NA 1810.00 NA NA
daiki SANO JPN NA 1803.00 NA NA
gregor VEZONIK SLO 0.32 1802.82 27.54 % 20.66 %
satone YOSHIDA JPN 0.31 1800.01 27.22 % 20.39 %
oscar BAUDRAND CAN 0.28 1786.26 24.6 % 7.39 %
benjamin HANNA USA 0.30 1781.21 17.55 % 10.32 %
alex KHAZANOV ISR NA 1778.00 NA NA
filip SCHENK ITA NA 1770.00 NA NA
nikolay RUSEV BUL 0.26 1754.82 21.4 % 6.24 %

Prague.25

Prague.25: Semi-finals

Semi-finals

-Competitors = n.semis-

competitor Ctry R results Expectation R.new E.Finals E.podium
sorato ANRAKU JPN 2488.31 1 0.96 2517.64 0.96 0.89
mejdi SCHALCK FRA 2239.29 2 0.85 2266.47 0.86 0.66
sohta AMAGASA JPN 2127.67 3 0.75 2152.67 0.76 0.50
dohyun LEE KOR 2245.37 4 0.85 2267.61 0.86 0.66
yufei PAN CHN 1848.00 5 0.37 1869.12 0.39 0.16
anze PEHARC SLO 1853.08 6 0.38 1871.72 0.39 0.17
samuel RICHARD FRA 1919.32 7 0.47 1935.24 0.48 0.22
hannes VAN DUYSEN BEL 1897.31 8 0.44 1910.86 0.45 0.20
jack MACDOUGALL GBR 1871.92 9 0.40 1883.11 0.41 0.17
antoine GIRARD FRA 1940.54 10 0.50 1948.99 0.50 0.24
elias ARRIAGADA KRÜGER GER 1938.73 11 0.50 1944.73 0.49 0.23
daiki SANO JPN 1803.00 12 0.31 1807.06 0.31 0.12
max BERTONE FRA 1940.54 12 0.50 1944.07 0.49 0.23
hamish MCARTHUR GBR 2013.16 14 0.60 2011.48 0.59 0.31
adam ONDRA CZE 2132.80 15 0.75 2128.25 0.74 0.46
adrien LEMAIRE FRA 1946.86 15 0.51 1942.98 0.49 0.23
kento YAMAGUCHI JPN 1940.54 17 0.50 1931.76 0.48 0.22
thomas LEMAGNER FRA 1905.26 18 0.45 1894.16 0.42 0.18
jan-luca POSCH AUT 1967.08 19 0.54 1953.27 0.51 0.24
toby ROBERTS GBR 2079.30 20 0.69 2062.61 0.66 0.37
matteo REUSA ITA 1940.54 21 0.50 1921.92 0.46 0.21
nicolai UZNIK AUT 1893.97 22 0.43 1873.07 0.39 0.17
maximillian MILNE GBR 1944.08 23 0.51 1920.52 0.46 0.21
nicolas COLLIN BEL 1865.67 24 0.39 1839.96 0.35 0.14
lucas TRANDAFIR GER 1917.52 25 0.47 1889.14 0.41 0.18
lasse VON FREIER GER 1920.19 26 0.47 1889.34 0.41 0.18
julien CLÉMENCE SUI 1905.33 27 0.45 1872.08 0.39 0.17

#####_ Elo History _

Elo Accumulated Prague.25 Semis

Prob.Podium - CIs

Prague.25: Final

Finals

-Competitors = n.final-

#####_ Elo History _

Elo Accumulated Prague.25 Final

Elo in time

Prob to Finals[POstFinals] - CIs

Elo - CIs

Prob.Podium[POST FINAL] - CIs

LS0tDQp0aXRsZTogIklGU0NfRWxvX0JPVUxERVJfTWVuXzIwMjUiDQphdXRob3I6ICJGZWRlcmljbyBKLiBWaWxsYXRvcm8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KIyMjIyMgRnVlbnRlOiBbaWZzYy5vcmddKGlmc2Mub3JnKQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZXZhbD19DQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBGQUxTRSwNCgltZXNzYWdlID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCglpbmNsdWRlID0gRkFMU0UNCikNCmBgYCAgDQoNCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KaWYoIXJlcXVpcmUodGlkeXZlcnNlKSl7aW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIixyZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIil9DQppZighcmVxdWlyZShnb29nbGVzaGVldHM0KSl7aW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlc2hlZXRzNCIpfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlZHJpdmUpKXtpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVkcml2ZSIpfQ0KaWYoIXJlcXVpcmUoZHBseXIpKXtpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpfQ0KaWYoIXJlcXVpcmUoaHR0cjIpKXtpbnN0YWxsLnBhY2thZ2VzKCJodHRyMiIpfQ0KaWYoIXJlcXVpcmUoanNvbmxpdGUpKXtpbnN0YWxsLnBhY2thZ2VzKCJqc29ubGl0ZSIpfQ0KaWYoIXJlcXVpcmUoUnNlbGVuaXVtKSl7aW5zdGFsbC5wYWNrYWdlcygiUnNlbGVuaXVtIil9DQppZighcmVxdWlyZShjaHJvbW90ZSkpe2luc3RhbGwucGFja2FnZXMoImNocm9tb3RlIil9DQppZighcmVxdWlyZShwdXJycikpe2luc3RhbGwucGFja2FnZXMoInB1cnJyIil9DQppZighcmVxdWlyZSh3ZG1hbikpe2luc3RhbGwucGFja2FnZXMoIndkbWFuIil9DQppZighcmVxdWlyZShEVCkpe2luc3RhbGwucGFja2FnZXMoIkRUIil9DQppZighcmVxdWlyZShwbG90bHkpKXtpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKX0NCmlmKCFyZXF1aXJlKGJvb3QpKXtpbnN0YWxsLnBhY2thZ2VzKCJib290Iil9DQoNCiMjDQpsaWJyYXJ5KGJvb3QpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGNocm9tb3RlKQ0KbGlicmFyeShwdXJycikNCmxpYnJhcnkod2RtYW4pDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShSU2VsZW5pdW0pDQoNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkoZ29vZ2xlZHJpdmUpDQoNCmBgYCAgDQoNCg0KIyMjIyMgUmVhZGluZyBEYXRhDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQoNCiNvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCiMNCnNzIDwtICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xREZualBfREQ3bzQyTWxYV3Y3X1RzQi1QWkFwM2VEeTFpR1Q4bUJWWG1LRS9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9IDENCnJhbmdvID0gIkExOno3MzgiDQpyYW5rcyA8LSByZWFkX3NoZWV0KHNzLA0KICAgICAgICAgICAgICAgIHNoZWV0PWhvamEsDQogICAgICAgICAgICAgICAgcmFuZ2U9IHJhbmdvLCANCiAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFDQogICAgICAgICAgICAgICAgIywNCiAgICAgICAgICAgICAgICAjY29sX3R5cGVzID0gImMiDQogICAgICAgICAgICAgICAgKQ0KDQpyYW5rcyA8LSAgcmFua3MgJT4lDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikNCiMjIyBFbG8gbGVhZCBKdW5lLTIwMjQNCnNzIDwtICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xY2k1ZVdzcGN4NmFHaG1pN08yanplRHhDUVo4dVNVYnZZUENCaGlZcGZEZy9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9ICJFbG9fTWVuJ3NfQm91bGRlcl9KdW5lXzIwMjQiDQpyYW5nbyA9ICJBMTpDNTEiDQplbG8uYWNjdW0gPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICBzaGVldD1ob2phLA0KICAgICAgICAgICAgICAgIHJhbmdlPSByYW5nbywgDQogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRQ0KICAgICAgICAgICAgICAgICMsDQogICAgICAgICAgICAgICAgI2NvbF90eXBlcyA9ICJjIg0KICAgICAgICAgICAgICAgICkNCg0KZWxvLmFjY3VtIDwtICBlbG8uYWNjdW0gJT4lDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikNCmVsby5ib3VsZGVyLm1lbi5hY2N1bSA8LSBlbG8uYWNjdW0gDQojIyMNCg0KZWxvLmJvdWxkZXIubWVuLmFjY3VtIDwtIGVsby5ib3VsZGVyLm1lbi5hY2N1bSAlPiUNCiAgICBzZXBhcmF0ZShjb21wZXRpdG9yLCBpbnRvID0gYygiZmlyc3QiLCAibGFzdCIpLCBzZXAgPSAiKD89XFxzK1xcUyskKSIsIHJlbW92ZSA9IEZBTFNFKSAlPiUgIA0KICAgIG11dGF0ZSgNCiAgICAgICAgY29tcGV0aXRvciA9IHBhc3RlKHN0cl90b19sb3dlcihzdHJfdHJpbShmaXJzdCkpLCBzdHJfdG9fdXBwZXIoc3RyX3RyaW0obGFzdCkpKQ0KICAgICkgJT4lDQogICAgc2VsZWN0KC1maXJzdCwgLWxhc3QpICAjIHJlbW92ZSBoZWxwZXIgY29sdW1ucw0KDQpgYGAgIA0KDQojIyMjIyBJbm5zYnJ1Y2sNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iSW5uc2JydWNrIikgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAjICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gY29tcGUsDQogICAgICBTdGFnZSA9IFN0YWdlLA0KICAgICAgICAgICBDb3VudHJ5ID0gQ291bnRyeSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSwNCiAgICAgIFJhbmsgPSBSYW5rKSAlPiUNCiMgIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIENvdW50cnkgKyBDb21wZSB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpib3VsZGVyX21lbiA8LSBhc190aWJibGUoYm91bGRlcl9tZW4pDQojIw0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCiMjIyMjIElubnNicnVjazogU2VtaS1maW5hbHMNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksIGMoMSwyLDYpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5Jbm5zYnJ1Y2suc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uSW5uc2JydWNrLnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gYm91bGRlcl9tZW4uSW5uc2JydWNrLnNlbWlzICU+JSByaWdodF9qb2luKGVsby5ib3VsZGVyLm1lbi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkRWxvWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGANCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLklubnNicnVjay5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI1Byb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5Jbm5zYnJ1Y2suc2VtaXMgPC0gYXNfdGliYmxlKGVsby5Jbm5zYnJ1Y2suc2VtaXMpDQoNCiMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBib3VsZGVyX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uSW5uc2JydWNrLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb249IEUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5Jbm5zYnJ1Y2suZGVidXQgPC0gYXNfdGliYmxlKGVsby5Jbm5zYnJ1Y2suZGVidXQpDQoNCmVsby5Jbm5zYnJ1Y2suc2VtaXMgPC0gZWxvLklubnNicnVjay5zZW1pcyAlPiUgcmJpbmQoZWxvLklubnNicnVjay5kZWJ1dCkNCg0KIyMjIyBQcm9iLkZpbmFsZXMgDQoNCiNtYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNCmVsby5sYXN0LmNvbXAgPC0gZWxvLklubnNicnVjay5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs3XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCiAgDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcFtvcmRlcihlbG8ubGFzdC5jb21wJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCw5KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIklubnNicnVjay5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5Jbm5zYnJ1Y2suc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeS5sYXN0DQoNCmBgYCAgDQoNCg0KIyMjIyMgKipFbG8gQWNjdW11bGF0ZWQgSW5uc2JydWNrIFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5ib3VsZGVyLm1lbi5hY2N1bSAlPiUNCiAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uSW5uc2JydWNrLnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNywxMCwxMSldKQ0KYGBgICANCg0KDQoNCiMjIyMjIElubnNicnVjazogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KDQojIyMjIyBGaW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uZmluYWxgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuLklubnNicnVjay5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5Jbm5zYnJ1Y2suZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5Jbm5zYnJ1Y2suZmluYWwgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCiNhdmcucGxheWVyIDwtIG1lZGlhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAgICAgICAgICAgICAgICAgIyAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJEZpbmFsWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCldKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGMoMTo2KSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQojDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KDQoNCmVsby5Jbm5zYnJ1Y2suZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb249IEUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICNQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uSW5uc2JydWNrLmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uSW5uc2JydWNrLmZpbmFsKQ0KDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uSW5uc2JydWNrLmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCg0KYGBgICANCg0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXANCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIklubnNicnVjay5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIElubnNicnVjayBGaW5hbCoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uSW5uc2JydWNrLmZpbmFsDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgsOSldKQ0KYGBgICANCg0KDQojIyMjIyBQcmFndWUuMjAyNCAgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iUHJhZ3VlLjIwMjQiKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICMgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBjb21wZSwNCiAgICAgIFN0YWdlID0gU3RhZ2UsDQogICAgICAgICAgIENvdW50cnkgPSBDb3VudHJ5LA0KICAgICAgICAgICBEYXRlPSBEYXRlLA0KICAgICAgUmFuayA9IFJhbmspICU+JQ0KIyAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgQ291bnRyeSArIENvbXBlICB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpib3VsZGVyX21lbiA8LSBhc190aWJibGUoYm91bGRlcl9tZW4pDQojIw0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCg0KIyMjIyMgUHJhZ3VlLjIwMjQ6IFNlbWktZmluYWxzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMjIyBTZW1pLWZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5zZW1pc2AtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5QcmFndWUuMjAyNC5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4uZGVidXQgKSksIG5hLnJtID0gVCkNCm1lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5QcmFndWUuMjAyNC5zZW1pcykNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBib3VsZGVyX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uUHJhZ3VlLjIwMjQuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5QcmFndWUuMjAyNC5kZWJ1dCA8LSBhc190aWJibGUoZWxvLlByYWd1ZS4yMDI0LmRlYnV0KQ0KDQplbG8uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gZWxvLlByYWd1ZS4yMDI0LnNlbWlzICU+JSByYmluZChlbG8uUHJhZ3VlLjIwMjQuZGVidXQpDQoNCiMjIyMjIyMjIyMjDQojDQojIyMgUHJvYi5GaW5hbGVzIA0KDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQplbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjAyNC5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs3XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCg0KIA0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXBbb3JkZXIoZWxvLmxhc3QuY29tcCRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgsOSldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJQcmFndWUuMjAyNC5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5QcmFndWUuMjAyNC5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBQcmFndWUuMjAyNCBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLlByYWd1ZS4yMDI0LnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMgUHJhZ3VlLjIwMjQ6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRGaW5hbCksIGMoMSwyLDQpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuZmluYWwgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJEZpbmFsIT0iTkEiKSANCiMNCiNsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5QcmFndWUuMjAyNC5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KI2F2Zy5wbGF5ZXIgPC0gbWVhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAjICAgICAgICAgICAgICAgICAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJEZpbmFsWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCldKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGMoMTo2KSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCiNFIDwtIDEvKDErKDEwXiggKCBzb3J0KFIsIGRlY3JlYXNpbmcgPSBUUlVFKVs4XSAtUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uUHJhZ3VlLjIwMjQuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCmVsby5QcmFndWUuMjAyNC5maW5hbCA8LSBhc190aWJibGUoZWxvLlByYWd1ZS4yMDI0LmZpbmFsKQ0KIyMjIFByb2IuRmluYWxlcyAoc2FtZSBhcyBTZW1pcykNClByb2IuRmluYWxzIDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICAgIHNlbWlfam9pbihsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLCBjKCJjb21wZXRpdG9yIiwgIkUuRmluYWxzIildLCBieSA9ICJjb21wZXRpdG9yIikgJT4lIA0KICAgIG11dGF0ZShvcmRlciA9IG1hdGNoKGNvbXBldGl0b3IsIGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3IpKSAlPiUgDQogICAgYXJyYW5nZShvcmRlcikgJT4lDQogICAgc2VsZWN0KEUuRmluYWxzKQ0KIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLlByYWd1ZS4yMDI0LmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCmBgYCAgDQoNCg0KIyMjIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcA0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiUHJhZ3VlLjIwMjQuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFByYWd1ZS4yMDI0IEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjAyNC5zZW1pcw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNywxMCwxMSldKQ0KYGBgICAgDQoNCg0KIyMjIyMgU2VvdWwuMjAyNCAgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iU2VvdWwuMjAyNCIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJvdWxkZXJfbWVuIDwtIGFzX3RpYmJsZShib3VsZGVyX21lbikNCiMjDQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMjIyBTZW91bC4yMDI0OiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgU2VtaS1maW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uc2VtaXNgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuLlNlb3VsLjIwMjQuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uU2VvdWwuMjAyNC5zZW1pcyAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLlNlb3VsLjIwMjQuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuLmRlYnV0ICkpLCBuYS5ybSA9IFQpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLlNlb3VsLjIwMjQuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uU2VvdWwuMjAyNC5zZW1pcyA8LSBhc190aWJibGUoZWxvLlNlb3VsLjIwMjQuc2VtaXMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gYm91bGRlcl9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLlNlb3VsLjIwMjQuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5TZW91bC4yMDI0LmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uU2VvdWwuMjAyNC5kZWJ1dCkNCg0KZWxvLlNlb3VsLjIwMjQuc2VtaXMgPC0gZWxvLlNlb3VsLjIwMjQuc2VtaXMgJT4lIHJiaW5kKGVsby5TZW91bC4yMDI0LmRlYnV0KQ0KDQojIyMjIyMjIyMjIw0KIw0KIyMjIFByb2IuRmluYWxlcyANCg0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KZWxvLmxhc3QuY29tcCA8LSBlbG8uU2VvdWwuMjAyNC5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs3XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCg0KIA0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXBbb3JkZXIoZWxvLmxhc3QuY29tcCRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgsOSldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNlb3VsLjIwMjQuc2VtaXMiDQojZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uMjIuYWNjdW0udG9fc3ViMTYgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpLA0KICMgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSkNCiMNCiNlbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMjIA0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uU2VvdWwuMjAyNC5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZW91bC4yMDI0IFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5TZW91bC4yMDI0LnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMgU2VvdWwuMjAyNDogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5TZW91bC4yMDI0LmZpbmFsIDwtIGJvdWxkZXJfbWVuWyxjKDEsMiw0KV0gJT4lIGZpbHRlcihib3VsZGVyX21lbiRGaW5hbCE9Ik5BIikgDQojDQojbGFzdC5jb21wLmRlYnV0IDwtIGJvdWxkZXJfbWVuLlNlb3VsLjIwMjQuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5TZW91bC4yMDI0LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQojYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5TZW91bC4yMDI0LmZpbmFsIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQplbG8uU2VvdWwuMjAyNC5maW5hbCA8LSBhc190aWJibGUoZWxvLlNlb3VsLjIwMjQuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uU2VvdWwuMjAyNC5maW5hbA0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC0gUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzID0gcm91bmQoUHJvYi5GaW5hbHMkRS5GaW5hbHMsMiksDQogICAgICAgICBFLnBvZGl1bSA9IHJvdW5kKFByb2IucG9kaXVtLDIpLA0KICAgICAgICAgUHJvYi5GaW5hbHMgPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDIpLCIlIiksDQogICAgICAgICApDQpgYGAgIA0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXANCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNlb3VsLjIwMjQuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFNlb3VsLjIwMjQgRmluYWwqKg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLlNlb3VsLjIwMjQuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgIA0KDQoNCg0KIyMjIyMgS2VxaWFvLjIwMjUgIA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PSA4fQ0KYm91bGRlcl9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IktlcWlhby4yMDI1IikgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAjICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gY29tcGUsDQogICAgICBTdGFnZSA9IFN0YWdlLA0KICAgICAgICAgICBDb3VudHJ5ID0gQ291bnRyeSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSwNCiAgICAgIFJhbmsgPSBSYW5rKSAlPiUNCiMgIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIENvdW50cnkgKyBDb21wZSAgfiBTdGFnZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJSYW5rIiwNCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KYm91bGRlcl9tZW4gPC0gYXNfdGliYmxlKGJvdWxkZXJfbWVuKQ0KIyMNCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksXSANCiMjDQpuLnNlbWlzIDwtIG5yb3coYm91bGRlcl9tZW5bIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksXSkNCm4uZmluYWxzIDwtIG5yb3coYm91bGRlcl9tZW5bIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKSxdKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIEtlcWlhby4yMDI1OiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgU2VtaS1maW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uc2VtaXNgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuLktlcWlhby4yMDI1LnNlbWlzIDwtIGJvdWxkZXJfbWVuWyxjKDEsMiw2KV0gJT4lIGZpbHRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGAhPSJOQSIpIA0KIw0KbGFzdC5jb21wLmRlYnV0IDwtIGJvdWxkZXJfbWVuLktlcWlhby4yMDI1LnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gYm91bGRlcl9tZW4uS2VxaWFvLjIwMjUuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuLmRlYnV0ICkpLCBuYS5ybSA9IFQpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLktlcWlhby4yMDI1LnNlbWlzIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLktlcWlhby4yMDI1LnNlbWlzIDwtIGFzX3RpYmJsZShlbG8uS2VxaWFvLjIwMjUuc2VtaXMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gYm91bGRlcl9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLktlcWlhby4yMDI1LmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uS2VxaWFvLjIwMjUuZGVidXQgPC0gYXNfdGliYmxlKGVsby5LZXFpYW8uMjAyNS5kZWJ1dCkNCg0KZWxvLktlcWlhby4yMDI1LnNlbWlzIDwtIGVsby5LZXFpYW8uMjAyNS5zZW1pcyAlPiUgcmJpbmQoZWxvLktlcWlhby4yMDI1LmRlYnV0KQ0KDQojIyMjIyMjIyMjIw0KIw0KIyMjIFByb2IuRmluYWxlcyANCg0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuc2VtaXMNClIubmV3IDwtIGVsby5sYXN0LmNvbXAkUi5uZXcNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCiMjIyBQcm9iLiBQb2RpdW0NCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wIDwtIGVsby5sYXN0LmNvbXAgJT4lDQogIG11dGF0ZShFLkZpbmFscz0gcm91bmQoUHJvYi5GaW5hbHMsMiksDQogICAgICAgICBFLnBvZGl1bT0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDIpLCIlIiksDQogICAgICAgICBQcm9iLnBvZGl1bT0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDIpLCIgJSIpDQogICAgICAgICApDQoNCiANCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wW29yZGVyKGVsby5sYXN0LmNvbXAkcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4LDkpXSkNCg0KYGBgICANCg0KDQojIyMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJLZXFpYW8uMjAyNS5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5LZXFpYW8uMjAyNS5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBLZXFpYW8uMjAyNSBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9Rn0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgDQoNCg0KDQojIyMjIyBLZXFpYW8uMjAyNTogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5LZXFpYW8uMjAyNS5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5LZXFpYW8uMjAyNS5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLktlcWlhby4yMDI1LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQojYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5LZXFpYW8uMjAyNS5maW5hbCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KZWxvLktlcWlhby4yMDI1LmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uS2VxaWFvLjIwMjUuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuZmluYWwNClIubmV3IDwtIGVsby5sYXN0LmNvbXAkUi5uZXcNCg0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtIFIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wIDwtIGVsby5sYXN0LmNvbXAgJT4lDQogIG11dGF0ZShFLkZpbmFscyA9IHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW0gPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzID0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMkRS5GaW5hbHMqMTAwLDIpLCIlIiksDQogICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiJSIpLA0KICAgICAgICAgKQ0KYGBgICANCg0KDQojIyMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJLZXFpYW8uMjAyNS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBLZXFpYW8uMjAyNSBGaW5hbCoqDQoNCmBgYHtyIGluY2x1ZGU9Rn0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgIA0KDQoNCiMjIyMjIEN1cml0aWJhICANCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcm93cy5wcmludD0gOH0NCmJvdWxkZXJfbWVuIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoY29tcGU9PSJDdXJpdGliYSIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJvdWxkZXJfbWVuIDwtIGFzX3RpYmJsZShib3VsZGVyX21lbikNCiMjDQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMjIyBDdXJpdGliYTogU2VtaS1maW5hbHMNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksIGMoMSwyLDYpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5DdXJpdGliYS5zZW1pcyA8LSBib3VsZGVyX21lblssYygxLDIsNildICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgIT0iTkEiKSANCiMNCmxhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5DdXJpdGliYS5zZW1pcyAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLkN1cml0aWJhLnNlbWlzICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbi5kZWJ1dCApKSwgbmEucm0gPSBUKQ0KbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kYFNlbWktZmluYWxgWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5DdXJpdGliYS5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5DdXJpdGliYS5zZW1pcyA8LSBhc190aWJibGUoZWxvLkN1cml0aWJhLnNlbWlzKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSLmRlYnV0IDwtIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuKQ0KbmFtZXMgPC0gbGFzdC5jb21wLmRlYnV0WywxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuZGVidXQkQ291bnRyeQ0KI2NhdGVnIDwtIGJvdWxkZXJfbWVuLmFfYg0KUyA8LSAoKG1lZGlhbmEtIGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5DdXJpdGliYS5kZWJ1dCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkN1cml0aWJhLmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uQ3VyaXRpYmEuZGVidXQpDQoNCmVsby5DdXJpdGliYS5zZW1pcyA8LSBlbG8uQ3VyaXRpYmEuc2VtaXMgJT4lIHJiaW5kKGVsby5DdXJpdGliYS5kZWJ1dCkNCg0KIyMjIyMjIyMjIyMNCiMNCiMjIyBQcm9iLkZpbmFsZXMgDQoNCiNtYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNCmVsby5sYXN0LmNvbXAgPC0gZWxvLkN1cml0aWJhLnNlbWlzDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXcpL0QgKSkpDQojIyMgUHJvYi4gUG9kaXVtDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHM9IHJvdW5kKFByb2IuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW09IHJvdW5kKFByb2IucG9kaXVtLDIpLA0KICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW09IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiICUiKQ0KICAgICAgICAgKQ0KDQogDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcFtvcmRlcihlbG8ubGFzdC5jb21wJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCw5KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiQ3VyaXRpYmEuc2VtaXMiDQojZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uMjIuYWNjdW0udG9fc3ViMTYgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpLA0KICMgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSkNCiMNCiNlbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMjIA0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uQ3VyaXRpYmEuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjIyMgKipFbG8gQWNjdW11bGF0ZWQgQ3VyaXRpYmEgU2VtaXMqKg0KDQpgYGB7ciBpbmNsdWRlPUZ9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLkN1cml0aWJhLnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMgQ3VyaXRpYmE6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRGaW5hbCksIGMoMSwyLDQpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uQ3VyaXRpYmEuZmluYWwgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJEZpbmFsIT0iTkEiKSANCiMNCiNsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uQ3VyaXRpYmEuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5DdXJpdGliYS5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KI2F2Zy5wbGF5ZXIgPC0gbWVhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAjICAgICAgICAgICAgICAgICAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJEZpbmFsWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCldKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGMoMTo2KSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCiNFIDwtIDEvKDErKDEwXiggKCBzb3J0KFIsIGRlY3JlYXNpbmcgPSBUUlVFKVs4XSAtUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uQ3VyaXRpYmEuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCmVsby5DdXJpdGliYS5maW5hbCA8LSBhc190aWJibGUoZWxvLkN1cml0aWJhLmZpbmFsKQ0KIyMjIFByb2IuRmluYWxlcyAoc2FtZSBhcyBTZW1pcykNClByb2IuRmluYWxzIDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICAgIHNlbWlfam9pbihsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLCBjKCJjb21wZXRpdG9yIiwgIkUuRmluYWxzIildLCBieSA9ICJjb21wZXRpdG9yIikgJT4lIA0KICAgIG11dGF0ZShvcmRlciA9IG1hdGNoKGNvbXBldGl0b3IsIGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3IpKSAlPiUgDQogICAgYXJyYW5nZShvcmRlcikgJT4lDQogICAgc2VsZWN0KEUuRmluYWxzKQ0KIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLkN1cml0aWJhLmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCmBgYCAgDQoNCg0KIyMjIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcA0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiQ3VyaXRpYmEuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEN1cml0aWJhIEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5DdXJpdGliYS5zZW1pcw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNywxMCwxMSldKQ0KYGBgICAgDQoNCg0KDQojIyMjIyBTYWx0Lkxha2UuQ2l0eS4yNSAgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iU2FsdC5MYWtlLkNpdHkuMjUiKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICMgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBjb21wZSwNCiAgICAgIFN0YWdlID0gU3RhZ2UsDQogICAgICAgICAgIENvdW50cnkgPSBDb3VudHJ5LA0KICAgICAgICAgICBEYXRlPSBEYXRlLA0KICAgICAgUmFuayA9IFJhbmspICU+JQ0KIyAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgQ291bnRyeSArIENvbXBlICB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpib3VsZGVyX21lbiA8LSBhc190aWJibGUoYm91bGRlcl9tZW4pDQojIw0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCg0KIyMjIyMgU2FsdC5MYWtlLkNpdHkuMjU6IFNlbWktZmluYWxzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMjIyBTZW1pLWZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5zZW1pc2AtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5TYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4uZGVidXQgKSksIG5hLnJtID0gVCkNCm1lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5TYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcykNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBib3VsZGVyX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5TYWx0Lkxha2UuQ2l0eS4yNS5kZWJ1dCA8LSBhc190aWJibGUoZWxvLlNhbHQuTGFrZS5DaXR5LjI1LmRlYnV0KQ0KDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gZWxvLlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzICU+JSByYmluZChlbG8uU2FsdC5MYWtlLkNpdHkuMjUuZGVidXQpDQoNCiMjIyMjIyMjIyMjDQojDQojIyMgUHJvYi5GaW5hbGVzIA0KDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQplbG8ubGFzdC5jb21wIDwtIGVsby5TYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCg0KIA0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXBbb3JkZXIoZWxvLmxhc3QuY29tcCRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgsOSldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzIg0KI2Vsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLjIyLmFjY3VtLnRvX3N1YjE2ICU+JSANCiMgIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSwNCiAjICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSkpDQojDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIyANCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzJGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCg0KYGBgICANCg0KDQoNCiMjIyMjICoqRWxvIEFjY3VtdWxhdGVkIFNhbHQuTGFrZS5DaXR5LjI1IFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgDQoNCg0KDQojIyMjIyBTYWx0Lkxha2UuQ2l0eS4yNTogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5TYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5TYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLlNhbHQuTGFrZS5DaXR5LjI1LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQojYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5TYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KZWxvLlNhbHQuTGFrZS5DaXR5LjI1LmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uU2FsdC5MYWtlLkNpdHkuMjUuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uU2FsdC5MYWtlLkNpdHkuMjUuZmluYWwNClIubmV3IDwtIGVsby5sYXN0LmNvbXAkUi5uZXcNCg0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtIFIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wIDwtIGVsby5sYXN0LmNvbXAgJT4lDQogIG11dGF0ZShFLkZpbmFscyA9IHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW0gPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzID0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMkRS5GaW5hbHMqMTAwLDIpLCIlIiksDQogICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiJSIpLA0KICAgICAgICAgKQ0KYGBgICANCg0KDQojIyMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJTYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgU2FsdC5MYWtlLkNpdHkuMjUgRmluYWwqKg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgICANCg0KDQoNCiMjIyBQcmFndWUuMjUgIA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PSA4fQ0KYm91bGRlcl9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IlByYWd1ZS4yNSIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJvdWxkZXJfbWVuIDwtIGFzX3RpYmJsZShib3VsZGVyX21lbikNCiMjDQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMgUHJhZ3VlLjI1OiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5QcmFndWUuMjUuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uUHJhZ3VlLjI1LnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1ULCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5QcmFndWUuMjUuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuLmRlYnV0ICkpLCBuYS5ybSA9IFQpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLlByYWd1ZS4yNS5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5QcmFndWUuMjUuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5QcmFndWUuMjUuc2VtaXMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gYm91bGRlcl9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLlByYWd1ZS4yNS5kZWJ1dCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLlByYWd1ZS4yNS5kZWJ1dCA8LSBhc190aWJibGUoZWxvLlByYWd1ZS4yNS5kZWJ1dCkNCg0KZWxvLlByYWd1ZS4yNS5zZW1pcyA8LSBlbG8uUHJhZ3VlLjI1LnNlbWlzICU+JSByYmluZChlbG8uUHJhZ3VlLjI1LmRlYnV0KQ0KDQojIyMjIyMjIyMjIw0KIw0KIyMjIFByb2IuRmluYWxlcyANCg0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KZWxvLmxhc3QuY29tcCA8LSBlbG8uUHJhZ3VlLjI1LnNlbWlzDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXcpL0QgKSkpDQojIyMgUHJvYi4gUG9kaXVtDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHM9IHJvdW5kKFByb2IuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW09IHJvdW5kKFByb2IucG9kaXVtLDIpLA0KICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW09IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiICUiKQ0KICAgICAgICAgKQ0KDQogDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcFtvcmRlcihlbG8ubGFzdC5jb21wJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCw5KV0pDQoNCmBgYCAgDQoNCg0KDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlByYWd1ZS4yNS5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5QcmFndWUuMjUuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjIyMgKipFbG8gQWNjdW11bGF0ZWQgUHJhZ3VlLjI1IFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgDQoNCg0KIyMjIFByb2IuUG9kaXVtICAtIENJcw0KDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTYsIGZpZy5oZWlnaHQ9MTJ9DQplbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wIDwtIA0KICBlbG8uaGlzdG9yeSAlPiUNCiAgICBzZW1pX2pvaW4oZWxvLmxhc3QuY29tcFtlbG8ubGFzdC5jb21wJHJlc3VsdHM8PTgsXSwgam9pbl9ieShjb21wZXRpdG9yKSkNCg0KcG9kaXVtX0NJcyA8LSB0aWJibGUoY29tcGV0aXRvcj0gZWxvLmhpc3RvcnkuZm9yLmxhc3QuY29tcCRjb21wZXRpdG9yWyFpcy5uYShlbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wJEUucG9kaXVtKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHBvZGl1bSA9IGVsby5oaXN0b3J5LmZvci5sYXN0LmNvbXAkRS5wb2RpdW1bIWlzLm5hKGVsby5oaXN0b3J5LmZvci5sYXN0LmNvbXAkRS5wb2RpdW0pXSkNCiMjIyMjIyMjIyMjIyMjDQoNCmJvb3RfbWVhbl9jaV9zYWZlIDwtIGZ1bmN0aW9uKHgsIFIgPSAxMDAwKSB7DQogIGlmIChsZW5ndGgodW5pcXVlKHgpKSA8PSAxIHx8IGxlbmd0aCh4KSA8IDIpIHsNCiAgICAjIENhbid0IGJvb3RzdHJhcCBpZiBubyB2YXJpYXRpb24gb3Igb25seSBvbmUgdmFsdWUNCiAgICByZXR1cm4oYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICB9DQogIA0KICBib290X29iaiA8LSBib290KHgsIHN0YXRpc3RpYyA9IGZ1bmN0aW9uKGRhdGEsIGkpIG1lYW4oZGF0YVtpXSksIFIgPSBSKQ0KICBjaSA8LSB0cnlDYXRjaCh7DQogICAgYm9vdC5jaShib290X29iaiwgdHlwZSA9ICJwZXJjIikkcGVyY2VudFs0OjVdDQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICANCiAgcmV0dXJuKGNpKQ0KfQ0KIyMjIyMjIyMjIyMNCnN1bW1hcnlfcHJvYnMgPC0gcG9kaXVtX0NJcyAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX3BvZGl1bSA9IG1lYW4ocG9kaXVtKSwNCiAgICBjaSA9IGxpc3QoYm9vdF9tZWFuX2NpX3NhZmUocG9kaXVtKSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG93ZXJfOTVDSSA9IG1hcF9kYmwoY2ksIDEpLA0KICAgIHVwcGVyXzk1Q0kgPSBtYXBfZGJsKGNpLCAyKQ0KICApICU+JQ0KICBzZWxlY3QoLWNpKQ0KDQpwIDwtIGdncGxvdChzdW1tYXJ5X3Byb2JzLCBhZXMoeSA9IGZjdF9yZW9yZGVyKGNvbXBldGl0b3IsIG1lYW5fcG9kaXVtKSwgeCA9IG1lYW5fcG9kaXVtKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjUxLCBsdHk9MiwgbHdkPTAuNSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAxLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArDQogIGdlb21fZXJyb3JiYXIoDQogICAgYWVzKHhtaW4gPSBsb3dlcl85NUNJLCB4bWF4ID0gdXBwZXJfOTVDSSksDQogICAgd2lkdGggPSAwLjIsDQogICAgbmEucm0gPSBUUlVFDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJvYmFiaWxpdHkgb2YgUmVhY2hpbmcgUG9kaXVtIChCb290c3RyYXBwZWQgOTUlIENJKSIsDQogICAgeSA9ICJDb21wZXRpdG9yIiwNCiAgICB4ID0gIkVzdGltYXRlZCBQcm9iYWJpbGl0eSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSANCiMrDQogIyB0aGVtZSgNCiAgIyAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSAgIyBhbmdsZWQgbGFiZWxzDQojICApDQoNCg0KDQojcA0KZ2dwbG90bHkocCkNCiMjIyMNCg0KYGBgICANCg0KDQoNCiMjIyBQcmFndWUuMjU6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KDQoNCg0KDQojIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJvdWxkZXJfbWVuLlByYWd1ZS4yNS5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5QcmFndWUuMjUuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9VFJVRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLlByYWd1ZS4yNS5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KI2F2Zy5wbGF5ZXIgPC1tZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5QcmFndWUuMjUuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCmVsby5QcmFndWUuMjUuZmluYWwgPC0gYXNfdGliYmxlKGVsby5QcmFndWUuMjUuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uUHJhZ3VlLjI1LmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXANCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlByYWd1ZS4yNS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgUHJhZ3VlLjI1IEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQoja25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQplbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNywxMCwxMSldDQpgYGAgICANCg0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgZWNobyA9IEZBTFNFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KCWluY2x1ZGUgPSBUUlVFDQopDQpgYGAgIA0KDQojIyMgRWxvIGluIHRpbWUNCg0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2LCBmaWcuaGVpZ2h0PSAxMH0NCmNvbXBfb3JkZXIgPC0gYygiSW5uc2JydWNrLnNlbWlzIiwgIklubnNicnVjay5maW5hbCIsDQogICAgICAgICAgICAgICAgIlByYWd1ZS4yMDI0LnNlbWlzIiwgIlByYWd1ZS4yMDI0LmZpbmFsIiwNCiAgICAgICAgICAgICAgICAiU2VvdWwuMjAyNC5zZW1pcyIsICJTZW91bC4yMDI0LmZpbmFsIiwNCiAgICAgICAgICAgICAgICAiS2VxaWFvLjIwMjUuc2VtaXMiICwgIktlcWlhby4yMDI1LmZpbmFsIiwNCiAgICAgICAgICAgICAgICAiQ3VyaXRpYmEuc2VtaXMiLCAiQ3VyaXRpYmEuZmluYWwiLA0KICAgICAgICAgICAgICAgICJTYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcyIsICJTYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCIsDQogICAgICAgICAgICAgICAgIlByYWd1ZS4yNS5zZW1pcyIsICJQcmFndWUuMjUuZmluYWwiKQ0KDQptZWRpYW5fZWxvX3Blci5jb21wIDwtICBlbG8uaGlzdG9yeSAlPiUgZ3JvdXBfYnkoY29tcCkgJT4lIHN1bW1hcmlzZShtZWRpYW5fZWxvID0gbWVkaWFuKFIubmV3KSApICU+JSBtdXRhdGUoY29tcD0gZmFjdG9yKGNvbXAsIGxldmVscyA9IGNvbXBfb3JkZXIpKSAlPiUgYXJyYW5nZShjb21wKSANCg0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogICNmaWx0ZXIoY2F0ZWc9PSJTdWIxOE0ifGNhdGVnPT0iU3ViMjBNInxjYXRlZz09IkFic00iLCBSLm5ldz49MCkgJT4lDQogIG11dGF0ZShjb21wID0gZmFjdG9yKGNvbXAsIGxldmVscyA9IGNvbXBfb3JkZXIpKSAlPiUgDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gQ3RyeSkgKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdD1tZWRpYW4oZWxvLmhpc3RvcnkkUi5uZXcpLGxpbmV0eXBlPSAiZGFzaGVkIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDIwLCBoanVzdCA9IDEpICkNCg0KDQojcA0KZ2dwbG90bHkocCkNCmBgYA0KDQoNCg0KIyMjIFByb2IgdG8gRmluYWxzW1BPc3RGaW5hbHNdIC0gQ0lzDQoNCmBgYHtyIGluY2x1ZGU9VFJVRSwgZmlnLndpZHRoPSAxNiwgZmlnLmhlaWdodD0xMn0NClByb2IuRmluYWxzX0NJcyA8LSB0aWJibGUoY29tcGV0aXRvcj0gZWxvLmhpc3RvcnkkY29tcGV0aXRvclshaXMubmEoZWxvLmhpc3RvcnkkRS5GaW5hbHMpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYi5maW5hbHMgPSBlbG8uaGlzdG9yeSRFLkZpbmFsc1shaXMubmEoZWxvLmhpc3RvcnkkRS5GaW5hbHMpXSkNCiMjIyMjIyMjIyMjIyMjDQpsaWJyYXJ5KGJvb3QpDQpib290X21lYW5fY2kgPC0gZnVuY3Rpb24oeCwgUiA9IDEwMDApIHsNCiAgaWYgKGxlbmd0aCh1bmlxdWUoeCkpIDw9IDEgfHwgbGVuZ3RoKHgpIDwgMikgew0KICAgICMgQ2FuJ3QgYm9vdHN0cmFwIGlmIG5vIHZhcmlhdGlvbiBvciBvbmx5IG9uZSB2YWx1ZQ0KICAgIHJldHVybihjKE5BX3JlYWxfLCBOQV9yZWFsXykpDQogIH0NCiAgDQogIGJvb3Rfb2JqIDwtIGJvb3QoeCwgc3RhdGlzdGljID0gZnVuY3Rpb24oZGF0YSwgaSkgbWVhbihkYXRhW2ldKSwgUiA9IFIpDQogIGNpIDwtIHRyeUNhdGNoKHsNCiAgICBib290LmNpKGJvb3Rfb2JqLCB0eXBlID0gInBlcmMiKSRwZXJjZW50WzQ6NV0NCiAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSBjKE5BX3JlYWxfLCBOQV9yZWFsXykpDQogIA0KICByZXR1cm4oY2kpDQp9DQojIyMjIyMjIyMjIw0Kc3VtbWFyeV9wcm9icyA8LSBQcm9iLkZpbmFsc19DSXMgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3IpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9wcm9iID0gbWVhbihwcm9iLmZpbmFscyksDQogICAgY2kgPSBsaXN0KCBib290X21lYW5fY2kocHJvYi5maW5hbHMpICksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG93ZXJfOTVDSSA9IG1hcF9kYmwoY2ksIDEpLA0KICAgIHVwcGVyXzk1Q0kgPSBtYXBfZGJsKGNpLCAyKQ0KICApICU+JQ0KICBzZWxlY3QoLWNpKQ0KDQpwIDwtIGdncGxvdChzdW1tYXJ5X3Byb2JzLCBhZXMoeSA9IGZjdF9yZW9yZGVyKGNvbXBldGl0b3IsIG1lYW5fcHJvYiksIHggPSBtZWFuX3Byb2IpKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAuNTEsIGx0eT0yLCBsd2Q9MC41KSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIGNvbG9yID0gImRhcmtncmVlbiIpICsNCiAgZ2VvbV9lcnJvcmJhcigNCiAgICBhZXMoeG1pbiA9IGxvd2VyXzk1Q0ksIHhtYXggPSB1cHBlcl85NUNJKSwNCiAgICB3aWR0aCA9IDAuMiwNCiAgICBuYS5ybSA9IFRSVUUNCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQcm9iYWJpbGl0eSBvZiBSZWFjaGluZyBGaW5hbHMgKEJvb3RzdHJhcHBlZCA5NSUgQ0kpIiwNCiAgICB5ID0gIkNvbXBldGl0b3IiLA0KICAgIHggPSAiRXN0aW1hdGVkIFByb2JhYmlsaXR5Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpIA0KIysNCiAjIHRoZW1lKA0KICAjICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpICAjIGFuZ2xlZCBsYWJlbHMNCiMgICkNCg0KDQoNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgIA0KDQojIyMgRWxvICAtIENJcw0KDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTYsIGZpZy5oZWlnaHQ9MTJ9DQplbG9fQ0lzIDwtIHRpYmJsZShjb21wZXRpdG9yPSBlbG8uaGlzdG9yeSRjb21wZXRpdG9yWyFpcy5uYShlbG8uaGlzdG9yeSRSLm5ldyldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFbG8gPSBlbG8uaGlzdG9yeSRSLm5ld1shaXMubmEoZWxvLmhpc3RvcnkkUi5uZXcpXSkNCiMjIyMjIyMjIyMjIyMjDQoNCmJvb3RfbWVhbl9jaV9zYWZlIDwtIGZ1bmN0aW9uKHgsIFIgPSAxMDAwKSB7DQogIGlmIChsZW5ndGgodW5pcXVlKHgpKSA8PSAxIHx8IGxlbmd0aCh4KSA8IDIpIHsNCiAgICAjIENhbid0IGJvb3RzdHJhcCBpZiBubyB2YXJpYXRpb24gb3Igb25seSBvbmUgdmFsdWUNCiAgICByZXR1cm4oYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICB9DQogIA0KICBib290X29iaiA8LSBib290KHgsIHN0YXRpc3RpYyA9IGZ1bmN0aW9uKGRhdGEsIGkpIG1lYW4oZGF0YVtpXSksIFIgPSBSKQ0KICBjaSA8LSB0cnlDYXRjaCh7DQogICAgYm9vdC5jaShib290X29iaiwgdHlwZSA9ICJwZXJjIikkcGVyY2VudFs0OjVdDQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICANCiAgcmV0dXJuKGNpKQ0KfQ0KIyMjIyMjIyMjIyMNCnN1bW1hcnlfcHJvYnMgPC0gZWxvX0NJcyAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX2VsbyA9IG1lYW4oRWxvKSwNCiAgICBjaSA9IGxpc3QoYm9vdF9tZWFuX2NpX3NhZmUoRWxvKSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG93ZXJfOTVDSSA9IG1hcF9kYmwoY2ksIDEpLA0KICAgIHVwcGVyXzk1Q0kgPSBtYXBfZGJsKGNpLCAyKQ0KICApICU+JQ0KICBzZWxlY3QoLWNpKQ0KDQpwIDwtIGdncGxvdChzdW1tYXJ5X3Byb2JzLCBhZXMoeSA9IGZjdF9yZW9yZGVyKGNvbXBldGl0b3IsIG1lYW5fZWxvKSwgeCA9IG1lYW5fZWxvKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzb3J0KHN1bW1hcnlfcHJvYnMkbWVhbl9lbG8sIGRlY3JlYXNpbmcgPSBUKVs5XSwgbHR5PTIsIGx3ZD0wLjUpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX2Vycm9yYmFyKA0KICAgIGFlcyh4bWluID0gbG93ZXJfOTVDSSwgeG1heCA9IHVwcGVyXzk1Q0kpLA0KICAgIHdpZHRoID0gMC4yLA0KICAgIG5hLnJtID0gVFJVRQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgICNsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkNCiAgICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJFbG8gKEJvb3RzdHJhcHBlZCA5NSUgQ0kpIiwNCiAgICB5ID0gIkNvbXBldGl0b3IiLA0KICAgIHggPSAiRXN0aW1hdGVkIEVsbyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSANCiMrDQogIyB0aGVtZSgNCiAgIyAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSAgIyBhbmdsZWQgbGFiZWxzDQojICApDQoNCg0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCiMjIyBQcm9iLlBvZGl1bVtQT1NUIEZJTkFMXSAgLSBDSXMNCg0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2LCBmaWcuaGVpZ2h0PTEyfQ0KZWxvLmhpc3RvcnkuZm9yLmxhc3QuY29tcCA8LSANCiAgZWxvLmhpc3RvcnkgJT4lDQogICAgc2VtaV9qb2luKGVsby5sYXN0LmNvbXAsIGpvaW5fYnkoY29tcGV0aXRvcikpDQoNCnBvZGl1bV9DSXMgPC0gdGliYmxlKGNvbXBldGl0b3I9IGVsby5oaXN0b3J5LmZvci5sYXN0LmNvbXAkY29tcGV0aXRvclshaXMubmEoZWxvLmhpc3RvcnkuZm9yLmxhc3QuY29tcCRFLnBvZGl1bSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwb2RpdW0gPSBlbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wJEUucG9kaXVtWyFpcy5uYShlbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wJEUucG9kaXVtKV0pDQojIyMjIyMjIyMjIyMjIw0KDQpib290X21lYW5fY2lfc2FmZSA8LSBmdW5jdGlvbih4LCBSID0gMTAwMCkgew0KICBpZiAobGVuZ3RoKHVuaXF1ZSh4KSkgPD0gMSB8fCBsZW5ndGgoeCkgPCAyKSB7DQogICAgIyBDYW4ndCBib290c3RyYXAgaWYgbm8gdmFyaWF0aW9uIG9yIG9ubHkgb25lIHZhbHVlDQogICAgcmV0dXJuKGMoTkFfcmVhbF8sIE5BX3JlYWxfKSkNCiAgfQ0KICANCiAgYm9vdF9vYmogPC0gYm9vdCh4LCBzdGF0aXN0aWMgPSBmdW5jdGlvbihkYXRhLCBpKSBtZWFuKGRhdGFbaV0pLCBSID0gUikNCiAgY2kgPC0gdHJ5Q2F0Y2goew0KICAgIGJvb3QuY2koYm9vdF9vYmosIHR5cGUgPSAicGVyYyIpJHBlcmNlbnRbNDo1XQ0KICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIGMoTkFfcmVhbF8sIE5BX3JlYWxfKSkNCiAgDQogIHJldHVybihjaSkNCn0NCiMjIyMjIyMjIyMjDQpzdW1tYXJ5X3Byb2JzIDwtIHBvZGl1bV9DSXMgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3IpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9wb2RpdW0gPSBtZWFuKHBvZGl1bSksDQogICAgY2kgPSBsaXN0KGJvb3RfbWVhbl9jaV9zYWZlKHBvZGl1bSkpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGxvd2VyXzk1Q0kgPSBtYXBfZGJsKGNpLCAxKSwNCiAgICB1cHBlcl85NUNJID0gbWFwX2RibChjaSwgMikNCiAgKSAlPiUNCiAgc2VsZWN0KC1jaSkNCg0KcCA8LSBnZ3Bsb3Qoc3VtbWFyeV9wcm9icywgYWVzKHkgPSBmY3RfcmVvcmRlcihjb21wZXRpdG9yLCBtZWFuX3BvZGl1bSksIHggPSBtZWFuX3BvZGl1bSkpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC41MSwgbHR5PTIsIGx3ZD0wLjUpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX2Vycm9yYmFyKA0KICAgIGFlcyh4bWluID0gbG93ZXJfOTVDSSwgeG1heCA9IHVwcGVyXzk1Q0kpLA0KICAgIHdpZHRoID0gMC4yLA0KICAgIG5hLnJtID0gVFJVRQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlByb2JhYmlsaXR5IG9mIFJlYWNoaW5nIFBvZGl1bSAoQm9vdHN0cmFwcGVkIDk1JSBDSSkiLA0KICAgIHkgPSAiQ29tcGV0aXRvciIsDQogICAgeCA9ICJFc3RpbWF0ZWQgUHJvYmFiaWxpdHkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgDQojKw0KICMgdGhlbWUoDQogICMgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkgICMgYW5nbGVkIGxhYmVscw0KIyAgKQ0KDQoNCg0KI3ANCmdncGxvdGx5KHApDQojIyMjDQoNCmBgYCAgDQoNCg0KDQo=