Introduction

The following document shows an analysis of the data associated with the coronavirus pandemic (Covid19).

The analysis is divided into two parts, the first comprises general graphs of the data and then a numerical simulation is performed using the logistic growth model (LGM) in order to forecast the possible total number of cases by country.

The data used for this analysis are updated daily and are stored in Data Repository by Johns Hopkins CSSE

Terms used

Recovery ratio (RR)

The proportion of people recovered from a specified disease among all individuals diagnosed with the disease over a certain period of time.

\[RecoveryRatio (RR) = \frac{Recovered}{Confirmed}\]

Case Fatality ratio (CFR)

Case fatality rate, also called case fatality ratio, in epidemiology, the proportion of people who die from a specified disease among all individuals diagnosed with the disease over a certain period of time.

https://www.britannica.com/science/case-fatality-rate

\[Case Fatality Ratio (CFR) = \frac{Deaths}{Confirmed}\]

Logistic Growth Model (LGM)

Clark (2011) propose a new empirical model based on logistic growth models.

A nonlinear model formula including variables and parameters.

\[ProjectedCases = \frac{(K * t ^ n)}{(a + t ^ n)}\]

Where:

Cases = Projected Case
K = Carrying capacity
n = Hyperbolic exponent
a = Constant
t = Time

The best-fit nonlineal model is obtained by an iterative least-squared method.

The logistic growth model was used to project the progression of the disease in certain countries.

The most relevant result of the model corresponds to the projected cases, this term is associated with the maximum number of cases estimated by the model for each country, where the model is executed.

Projected - Confirmed Cases Ratio

Assuming that the total number of projected cases corresponds to the maximum number of cases that would occur in a given country, the projected - confirmed cases ratio is calculated using the following expression.

\[ProjectedConfirmedCases Ratio = 100 - (100 * \frac{(max(Projected Case) - max(Confirmed))}{ max(Projected Case)}\]

Global Case

Average Cases (Last Three Days)

Global Case Summary

Country Cases

China

Korea, South

The Americas

Confirmed Case

Confirmed Case - Average Last Three Days

Confirmed Case - Cases Last Days

Mexico

Mexico & Other Countries

Dominican Republic

United State (US)

Argentina

Brazil

Canada

Colombia

Ecuador

Chile

Panama

Peru

Venezuela

Europe

Confirmed Case

Confirmed Case - Average Last Three Days

Belgium

Czechia

Greece

Italy

Spain

United Kingdom

France

Germany

Netherlands

Switzerland

Norway

Portugal

Other Countries

Taiwan*

Japan

Iran

Russia

Singapore

Israel

References

Source data: https://github.com/CSSEGISandData/COVID-19.git

Clark, A.J. (2011). “Decline Curve Analysis in Unconventional Resource Plays Using Logistic Growth Models.” M.S. Thesis, The University of Texas at Austin, August 2011.

LS0tCnRpdGxlOiAiQ292aWQxOSBQcm9qZWN0ZWQgQ2FzZXMgYnkgQ291bnRyaWVzIgphdXRob3I6ICJBbmRyZXMgUEVOQSBhbmRyZXNwZW5hQGdtYWlsLmNvbSIKZGF0ZTogIkFwcmlsLzExLzIwMjAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzICAgIAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgllY2hvID0gVFJVRSwKCW1lc3NhZ2UgPSBGQUxTRSwKCXdhcm5pbmcgPSBGQUxTRQopCmBgYAoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCmJvZHl7IC8qIE5vcm1hbCAgKi8KICAgICAgZm9udC1zaXplOiAxNnB4OwogIH0KdGQgeyAgLyogVGFibGUgICovCiAgZm9udC1zaXplOiAxNHB4Owp9CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDM4cHg7CiAgY29sb3I6IERhcmtSZWQ7Cn0KaDEgeyAvKiBIZWFkZXIgMSAqLwogIGZvbnQtc2l6ZTogMjhweDsKICBjb2xvcjogQmx1ZTsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtCbHVlOwp9CmgzIHsgLyogSGVhZGVyIDMgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwp9CmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1zaXplOiAxMnB4Owp9CnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovCiAgICBmb250LXNpemU6IDE0cHg7Cn0KPC9zdHlsZT4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KCJ0aWR5dmVyc2UiLCB3YXJuLmNvbmZsaWN0cyA9IEYpCmxpYnJhcnkoImNvd3Bsb3QiKQpsaWJyYXJ5KCJtaW5wYWNrLmxtIikKbGlicmFyeSgiYnJvb20iKQpsaWJyYXJ5KCJzaW9wIikKbGlicmFyeSgia2FibGVFeHRyYSIpCmxpYnJhcnkoInBsb3RseSIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgdXBkYXRlIGRhdGEgd2l0aCBzb21lIGNoYXJnZWQgY29sdW1uIG5hbWVzCgpjb3ZpZDE5IDwtIHJlYWRfY3N2KCJ+L0RvY3VtZW50cy9DT1ZJRC0xOS1tYXN0ZXIvZGF0YS9DT1ZJRC0xOS1tYXN0ZXIgMjAyMC0wNC0xMi9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV9kYWlseV9yZXBvcnRzLzA0LTExLTIwMjAuY3N2IikKCnNldHdkKCJ+L0RvY3VtZW50cy9DT1ZJRC0xOS1tYXN0ZXIvZGF0YS9DT1ZJRC0xOS1tYXN0ZXIgMjAyMC0wNC0xMi9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3NlcmllcyIpCgp0c3IgPC0gcmVhZF9jc3YoInRpbWVfc2VyaWVzX2NvdmlkMTlfcmVjb3ZlcmVkX2dsb2JhbC5jc3YiKQoKdHNjIDwtIHJlYWRfY3N2KCJ0aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IikKCnRzZCA8LSByZWFkX2NzdigidGltZV9zZXJpZXNfY292aWQxOV9kZWF0aHNfZ2xvYmFsLmNzdiIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIycgQHRpdGxlIEEgd3JhbmdsX2NvdmlkMTkgZnVuY3Rpb24KIycgQHBhcmFtIGNvdmlkMTkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF9jb3ZpZDE5CiMnIEBleHBvcnQgd3JhbmdsX2NvdmlkMTkKIycgQGtleXdvcmRzIHdyYW5nbF9jb3ZpZDE5CiMnCndyYW5nbF9jb3ZpZDE5IDwtIGZ1bmN0aW9uKGNvdmlkMTkpIHsKY292aWQxOSAlPiUgCiAgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlX1N0YXRlIiwgCiAgICAgICAgIGNvdW50cnkgPSAiQ291bnRyeV9SZWdpb24iLAogICAgICAgICBsYXN0X3VwZCA9ICJMYXN0X1VwZGF0ZSIpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oQ29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkLCBuYS5ybSA9IFQpLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZGVhdGhzID0gc3VtKERlYXRocywgbmEucm0gPSBUKSwKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQvY29uZmlybWVkLCAwKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGhzL2NvbmZpcm1lZCwgMCkpICAgIAp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNjIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c2MgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c2MKIycgQGV4cG9ydCB3cmFuZ2xfdHNjCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNjCiMnCndyYW5nbF90c2MgPC0gZnVuY3Rpb24odHNjKSB7CnRzYyAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpICAKfQoKIycgQHRpdGxlIEEgd3JhbmdsX3RzYyBmdW5jdGlvbgojJyBAcGFyYW0gdHNkIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiB3cmFuZ2xfdHNkCiMnIEBleHBvcnQgd3JhbmdsX3RzZAojJyBAa2V5d29yZHMgd3JhbmdsX3RzZAojJwp3cmFuZ2xfdHNkIDwtIGZ1bmN0aW9uKHRzZCkgewp0c2QgJT4lIHJlbmFtZShzdGF0ZSA9ICJQcm92aW5jZS9TdGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICJDb3VudHJ5L1JlZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBMYXQsIGxvbmcgPSBMb25nKQp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNyIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c3IgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c3IKIycgQGV4cG9ydCB3cmFuZ2xfdHNyCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNyCiMnCndyYW5nbF90c3IgPC0gZnVuY3Rpb24odHNyKSB7CnRzciAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpCn0KCiMnIEB0aXRsZSBBIHRpZHlfam9pbl9mdW5fbWF4IGJ5IGNvdW50cnkgZnVuY3Rpb24KIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gdGlkeV9qb2luX2Z1bl9tYXgKIycgQGV4cG9ydCB0aWR5X2pvaW5fZnVuX21heAojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bl9tYXgKIycKdGlkeV9qb2luX2Z1bl9tYXggPC0gZnVuY3Rpb24odGlkeV9qb2luKSB7CnRpZHlfam9pbiAlPiUgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IG1heChjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IG1heChyZWNvdmVyZWQsIG5hLnJtID0gVCksICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWF0aHMgPSBtYXgoZGVhdGgsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMSksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRocy9jb25maXJtZWQsIDEpKSAlPiUKICBhcnJhbmdlKC1jb25maXJtZWQpICAKfQoKIycgQHRpdGxlIEEgZ2F0aGVyIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHZhciAtICB4IGlucHV0IGRhdGEKIycgQHJldHVybiBnYXRoZXJfZnVuCiMnIEBleHBvcnQgZ2F0aGVyX2Z1bgojJyBAa2V5d29yZHMgZ2F0aGVyX2Z1bgojJyAKZ2F0aGVyX2Z1biA8LSBmdW5jdGlvbihkYXRhLCB2YXIpIHsKICB2YXIgPC0gZW5xdW8odmFyKQogIGRhdGEgJT4lIGdhdGhlcihkYXRlLCAhIXZhciwgLWxhdCwgLWxvbmcsIC1zdGF0ZSwgLWNvdW50cnkpICU+JSAgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlbS8lZC8leSIpKQp9CgojJyBAdGl0bGUgdGlkeV9qb2luX2Z1bgojJyBAcmV0dXJuIHRpZHlfam9pbgojJyBAZXhwb3J0IHRpZHlfam9pbgojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bgojJyAKdGlkeV9qb2luX2Z1biA8LSBmdW5jdGlvbigpIHsKICAKIyBSdW4gZ2F0aGVyIGZ1bmN0aW9uCnRzY190aWR5IDwtIGdhdGhlcl9mdW4odHNjLCBjb25maXJtZWQpCnRzZF90aWR5IDwtIGdhdGhlcl9mdW4odHNkLCBkZWF0aCkKdHNyX3RpZHkgPC0gZ2F0aGVyX2Z1bih0c3IsIHJlY292ZXJlZCkKCiMgSm9pbiBkYXRhIGZyYW1lcwp0aWR5X2pvaW4gPC0gZnVsbF9qb2luKHRzY190aWR5LCB0c2RfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCnRpZHlfam9pbiA8LSBmdWxsX2pvaW4odGlkeV9qb2luLCB0c3JfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCgojIENvbnZlcnQgdG8gbnVtZXJpYwp0aWR5X2pvaW4kY29uZmlybWVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGNvbmZpcm1lZCkKdGlkeV9qb2luJGRlYXRoIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGRlYXRoKQp0aWR5X2pvaW4kcmVjb3ZlcmVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJHJlY292ZXJlZCkKCiMgQ2FsY3VsYXRlIGFkZGl0aW9uYWwgdmFyaWFibGVzCnRpZHlfam9pbiA8LSB0aWR5X2pvaW4gJT4lIAojIFJlY292ZXJ5IFJhdGlvICglKSAmIENhc2UgRmF0YWxpdHkgUmF0aW8gKCUpICAgICAgICAgCiAgbXV0YXRlKFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMCksCiAgICAgICBDRlIgPSByb3VuZCgxMDAgKiBkZWF0aC9jb25maXJtZWQsIDEpKSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUgCiMgbWVhbiBjb25maXJtZWQgY2FzZSBsYXN0IDMgZGF5cyAgICAgICAgCiAgbXV0YXRlKGMzZCA9IG1lYW4odGFpbChjb25maXJtZWQsIDNMKSksCiAgICAgICAgIGQzZCA9IG1lYW4odGFpbChkZWF0aCwgM0wpKSwKICAgICAgICAgcjNkICA9IG1lYW4odGFpbChyZWNvdmVyZWQsIDNMKSksCiAgICAgICAgIHN0YXRlID0gaWZlbHNlKGlzLm5hKHN0YXRlKSwgImFsbHMiLCBzdGF0ZSksCiAgICAgICAgIGNhc2VzX2J5X2RheSA9IChjb25maXJtZWQgLSBsYWcoY29uZmlybWVkLCAxTCkpKSAlPiUKICB1bmdyb3VwKCkKfQoKIycgQHRpdGxlIHBsb3RfZW5xdW8gZnVuY3Rpb24KIycgQHBhcmFtIGRhdGEgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0geCAtICB4IGlucHV0IGRhdGEKIycgQHBhcmFtIHkgLSAgeSBpbnB1dCBkYXRhCiMnIEBwYXJhbSBUaXRsZSAtICB0aXRsZQojJyBAcmV0dXJuIHBsb3QKIycgQGV4cG9ydCBwbG90IHBsb3QgZ3JhcGgKIycgQGtleXdvcmRzIHBsb3QKIycgCnBsb3RfZW5xdW8gPC0gZnVuY3Rpb24oLmRhdGEsIHgsIHksIFRpdGxlKQp7CiAgeCA8LSBlbnF1byh4KQogIHkgPC0gZW5xdW8oeSkKICBnZ3Bsb3QoLmRhdGEsIGFlcyghIXgsICEheSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGFscGhhID0gMC42LCBjb2xvciA9ICEheSkpICsgCiAgICBnZW9tX2xpbmUoYWVzKGFscGhhID0gMC42LCBjb2xvciA9ICEheSkpICsKICAgIGxhYnModGl0bGUgPSBUaXRsZSwgeCA9ICIiLCB5ID0gIiIpICArCiAgICB0aGVtZV9taW5pbWFsX2dyaWQoMTIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKfQoKIycgQHRpdGxlIGdsb2JhbF9jYXNlIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIGNvbmZpcm1lZCAtICBjb25maXJtZWQgaW5wdXQgZGF0YQojJyBAcGFyYW0gcmVjb3ZlcmVkIC0gIHJlY292ZXJlZCBpbnB1dCBkYXRhCiMnIEBwYXJhbSBkZWF0aCAtICBkZWF0aHMgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGdsb2JhbF9jYXNlCiMnIEBleHBvcnQgZ2xvYmFsX2Nhc2UgcGxvdCBncmFwaAojJyBAa2V5d29yZHMgZ2xvYmFsX2Nhc2UKIycgCmdsb2JhbF9jYXNlIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgewogIGNvbmZpcm1lZCA8LSBlbnF1byhjb25maXJtZWQpCiAgcmVjb3ZlcmVkIDwtIGVucXVvKHJlY292ZXJlZCkKICBkZWF0aCA8LSBlbnF1byhkZWF0aCkgICAgCiAgCmRhdGEgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oISFjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bSghIXJlY292ZXJlZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgZGVhdGggPSBzdW0oISFkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkIC8gY29uZmlybWVkLCAxKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGggLyBjb25maXJtZWQsIDEpKSAKfQoKIycgQHRpdGxlIHBsb3RfZ3JpZF9nbG9iYWwKIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcGxvdF9ncmlkX2dsb2JhbAojJyBAZXhwb3J0IHBsb3RfZ3JpZF9nbG9iYWwKIycgQGtleXdvcmRzIHBsb3RfZ3JpZF9nbG9iYWwKIycgCnBsb3RfZ3JpZF9nbG9iYWwgPC0gZnVuY3Rpb24odGlkeV9qb2luKXsKICBkYXRhIDwtIGdsb2JhbF9jYXNlKHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKSAKICBwMSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGNvbmZpcm1lZCwgIkNvbmZpcm1lZCIpCiAgcDIgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCByZWNvdmVyZWQsICJSZWNvdmVyZWQiKQogIHAzIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgZGVhdGgsICJEZWF0aHMiKQogIHA0IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgUlIsICJSZWNvdmVyeSBSYXRpbyAoJSkiKQogIHA1IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgQ0ZSLCAiQ2FzZSBGYXRhbGl0eSBSYXRpbyAoJSkiKQogIAp0aXRsZV9nZyA8LSBnZ3Bsb3QoKSArIAogIGxhYnModGl0bGUgPSAiR2xvYmFsIENhc2VzIiwgCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJSZXBvcnQgZGF0ZToiLCBTeXMuRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBtaW4oZGF0YSRkYXRlW2RhdGEkY29uZmlybWVkID49IDFdLCBuYS5ybSA9IFQpKSkgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIAoKICBwbG90X2dyaWQodGl0bGVfZ2csIHAxLCBwMiwgcDMsIHA0LCBwNSwgbmNvbCA9IDMpICAgCn0KCiMnIEB0aXRsZSBwbG90X2dyaWRfY291bnRyeQojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHBsb3RfZ3JpZF9jb3VudHJ5CiMnIEBleHBvcnQgcGxvdF9ncmlkX2NvdW50cnkKIycgQGtleXdvcmRzIHBsb3RfZ3JpZF9jb3VudHJ5CiMnICAgCnBsb3RfZ3JpZF9jb3VudHJ5IDwtIGZ1bmN0aW9uKGNvdW50cnksIHRpZHlfam9pbil7CiAgY291bnRyeSA8LSBlbnF1byhjb3VudHJ5KSAgCiAgZGF0YSA8LSBjb3VudHJ5X2NhbGMoISFjb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgCiAgcDEgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBjb25maXJtZWQsICJDb25maXJtZWQiKQogIHAyIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgY2FzZXNfYnlfZGF5LCAiY2FzZXNfYnlfZGF5IikgIAogIHAzIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgZGVhdGgsICJEZWF0aHMiKQogIHA0IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgZGVhdGhfYnlfZGF5LCAiZGVhdGhfYnlfZGF5IikKICBwNSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENGUiwgIkNhc2UgRmF0YWxpdHkgUmF0aW8gKCUpIikKICAKIyBGaXJzdCBjYXNlIGRhdGUKdGl0bGVfZ2cgPC0gZ2dwbG90KCkgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUoIkNvdW50cnk6IiwgQ291bnRyeSksCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJSZXBvcnQgZGF0ZToiLCBTeXMuRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAiXG5GaXJzdCBjYXNlIGRhdGU6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbihkYXRhJGRhdGVbZGF0YSRjb25maXJtZWQgPj0gMV0sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgICAgICAgICJcbkNvbmZpcm1lZC5sYXN0LjMuZGF5czoiLCAKICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQobWVhbihoZWFkKGRhdGEkY2FzZXNfYnlfZGF5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCwgMykpLCAwKSksCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIAoKICBwbG90X2dyaWQodGl0bGVfZ2csIHAxLCBwMiwgcDMsIHA0LCBwNSwgbmNvbCA9IDMpICAgICAKfQoKIycgQHRpdGxlIENvdW50cnkgQ2FzZSBDYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBjb25maXJtZWQgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gcmVjb3ZlcmVkIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGRlYXRoIC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBjb3VudHJ5X2NhbGMKIycgQGV4cG9ydCBjb3VudHJ5X2NhbGMKIycgQGtleXdvcmRzIGNvdW50cnlfY2FsYwojJyAKY291bnRyeV9jYWxjIDwtIGZ1bmN0aW9uKGNvdW50cnksIGRhdGEsIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgewogIGNvdW50cnkgPC0gZW5xdW8oY291bnRyeSkKICBjb25maXJtZWQgPC0gZW5xdW8oY29uZmlybWVkKQogIHJlY292ZXJlZCA8LSBlbnF1byhyZWNvdmVyZWQpCiAgZGVhdGggPC0gZW5xdW8oZGVhdGgpICAgIAogIApkYXRhICU+JSBmaWx0ZXIoY291bnRyeSA9PSAhIWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGRhdGUpICU+JQogIGZpbHRlcighIWNvbmZpcm1lZCA+PSAxKSAlPiUKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKCEhY29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oISFyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGRlYXRoID0gc3VtKCEhZGVhdGgsIG5hLnJtID0gVCksIAogICAgICAgICAgICBSUiA9IHJvdW5kKDEwMCAqIHJlY292ZXJlZCAvIGNvbmZpcm1lZCwgMSksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRoIC8gY29uZmlybWVkLCAxKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShjYXNlc19ieV9kYXkgPSAoY29uZmlybWVkIC0gbGFnKGNvbmZpcm1lZCwgMUwpKSwKICAgICAgICAgZGVhdGhfYnlfZGF5ID0gKGRlYXRoIC0gbGFnKGRlYXRoLCAxTCkpLAogICAgICAgICBkYXlzID0gMTpuKCkpICU+JQogIGFycmFuZ2UoZGVzYyhkYXRlKSkgJT4lCiAgc2VsZWN0KGRhdGUsIGRheXMsIGNvbmZpcm1lZCwgY2FzZXNfYnlfZGF5LCAKICAgICAgICAgZGVhdGgsIGRlYXRoX2J5X2RheSwgQ0ZSLCByZWNvdmVyZWQsIFJSKQp9ICAgIAoKIycgQHRpdGxlIHJlc3VtZSBDYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHJlc3VtZQojJyBAZXhwb3J0IHJlc3VtZQojJyBAa2V5d29yZHMgcmVzdW1lCiMnIApyZXN1bWUgPC0gZnVuY3Rpb24oQ291bnRyeSkgewogIAp0aWR5X2pvaW4gJT4lIAogIGZpbHRlcihjb3VudHJ5ID09IENvdW50cnkgJiBkYXRlID09IG1heChkYXRlKSkgJT4lIAogIHN1bW1hcmlzZShkYXRlID0gbWF4KGRhdGUpLAogICAgICAgICAgICBDb25maXJtZWQgPSBzdW0oY29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBSZWNvdmVyZWQgPSBzdW0ocmVjb3ZlcmVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBEZWF0aCA9IHN1bShkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIENGUiA9IGhlYWQoQ0ZSLCAxKSkKfQoKIycgQHRpdGxlIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAgY2FsY3VsYXRpb25zCiMnIEBwYXJhbSBjb3VudHJ5IC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIEBleHBvcnQgbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcAojJyBAa2V5d29yZHMgbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcAojJyAKbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcCA8LSBmdW5jdGlvbihDb3VudHJ5LCBjdXRvZmYpIHsKICAKIyBQcmVwYXJlIGRhdGEgIAp0aWR5X2pvaW4gJT4lIAogIGZpbHRlcihjb3VudHJ5ID09IENvdW50cnkpICU+JSAKICBncm91cF9ieShjb3VudHJ5LCBkYXRlKSAlPiUgCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IHN1bShjb25maXJtZWQsIG5hLnJtID0gVCkpICU+JQogIGRwbHlyOjpmaWx0ZXIoY29uZmlybWVkID4gY3V0b2ZmKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZHBseXI6Om11dGF0ZSh0ID0gMTpuKCkpCn0KCiMnIEB0aXRsZSBsb2dpc3RpY19ncm93dGhfbW9kZWwgQ2FsY3VsYXRpb25zCiMnIEBwYXJhbSBjb3VudHJ5IC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGRhdGEgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gY3V0b2ZmIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHRyYWNlIC0gIGlucHV0IGRhdGEgdHJhY2UgbW9kZWwKIycgQHBhcmFtIHRtYXggLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9tb2RlbAojJyBAZXhwb3J0IGxvZ2lzdGljX2dyb3d0aF9tb2RlbAojJyBAa2V5d29yZHMgbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIApsb2dpc3RpY19ncm93dGhfbW9kZWwgPC0gZnVuY3Rpb24oQ291bnRyeSwgY3V0b2ZmLCB0cmFjZSwgdG1heCkgewoKIyBQcmVwYXJlIGRhdGEKZGF0YSA8LSBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwKENvdW50cnksIGN1dG9mZikgIAogIAojIFNldCBpbnB1dCBtb2RlbCBwYXJhbWV0ZXJzICAgICAgCnNldC5zZWVkKDE3KQptYXhpdGVyIDwtIDEwMjQKcGFybXMgPC0gYyhLID0gbWF4KGRhdGEkY29uZmlybWVkLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICBhID0gbWF4KGRhdGEkY29uZmlybWVkLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICBuID0gMSkKY29udHJvbCA8LSBjKG5scy5jb250cm9sKG1heGl0ZXIgPSBtYXhpdGVyKSkgICAgCiAgICAKIyBSdW4gTG9naXN0aWMgbW9kZWwgICAKdHJ5Q2F0Y2goewptb2RlbCA8LSBtaW5wYWNrLmxtOjpubHNMTShjb25maXJtZWQgfiAoSyAqIHQgXiBuKSAvIChhICsgdCBeIG4pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwYXJtcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjb250cm9sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UgPSB0cmFjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQoKIyBTdG9yZSBsb2dpc3RpYyBwYXJhbWV0ZXIgcmVzdWx0cwptb2RlbF9wYXJtIDwtIGRhdGEuZnJhbWUoY291bnRyeSA9IENvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgSyA9IGNvZWYobW9kZWwpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGNvZWYobW9kZWwpWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGNvZWYobW9kZWwpWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKIyBDcmVhdGUgdGltZSB2ZWN0b3IgYSBzbGlnaHRseSBsYXJnZXIgdG8gcmVhbCBkYXRhIAp0IDwtIDE6dG1heAoKIyBDYWxjdWxhdGUgY29uZmlybWVkX0xHTSBmcm9tIG1vZGVsClByb2plY3RlZF9MR00gPSAobW9kZWxfcGFybSRLICogdCBeIG1vZGVsX3Bhcm0kbikgLyAKICAgICAgICAgICAgICAgICAgKG1vZGVsX3Bhcm0kYSArIHQgXiBtb2RlbF9wYXJtJG4pCgojIENyZWF0ZSBkYXRhIHRvIHN0b3JlIExHTSBjYWxjdWxhdGlvbgpmb28gPC0gZGF0YV9mcmFtZSh0ID0gdCwgCiAgICAgICAgICAgICAgICAgIFByb2plY3RlZF9MR00gPSBQcm9qZWN0ZWRfTEdNICAgICAgICAgICAgICAgICAKKQoKIyBKb2luIGNhbGN1bGF0ZSBkYXRhIHdpdGggcmVhbCBkYXRhCmRhdGEgPC0gbGVmdF9qb2luKGZvbywgZGF0YSwgYnkgPSAidCIpCgojIENvbXBsZXRlIGRhdGUgY29sdW1uCmRhdGEkZGF0ZSA8LSBzZXEoYXMuRGF0ZShtaW4oZGF0YSRkYXRlLCBuYS5ybSA9IFQpKSwgCiAgICBhcy5EYXRlKG1pbihkYXRhJGRhdGUsIG5hLnJtID0gVCkgKyB0bWF4IC0gMSksICJkYXlzIikKCiMgQ29tcGxldGUgY291bnRyeSBjb2x1bW4KZGF0YSRjb3VudHJ5IDwtIENvdW50cnkKCiMgQ3JlYXRlIGxhYmVsIGRhdGEgZnJhbWUKYW5ub3RhdGlvbiA8LSBkYXRhLmZyYW1lKAogIHggPSB0bWF4ICsgNSwKICB5ID0gbWF4KGRhdGEkUHJvamVjdGVkX0xHTSwgbmEucm0gPSBUKSwKICBsYWJlbCA9IHBhc3RlKCJQcm9qZWN0ZWQgY2FzZXMgPSIsIAogICAgICAgICAgICAgICAgcm91bmQobW9kZWxfcGFybSRLLCAwKSksCiMgUHJvamVjdGVkIC0gQ29uZmlybWVkIENhc2VzIFJhdGlvIGNhbGN1bGF0aW9uICAKICByYXRpbyA9IHJvdW5kKDEwMCAtICgxMDAgKiAKICAgICAgICAgICAgICAgICAgKG1heChtb2RlbF9wYXJtJEssIG5hLnJtID0gVCkgLSAKICAgICAgICAgICAgICAgICAgbWF4KGRhdGEkY29uZmlybWVkLCBuYS5ybSA9IFQpKSAvIAogICAgICAgICAgICAgICAgICByb3VuZChtYXgobW9kZWxfcGFybSRLLCAwKSkpKSkKCiMgUHJlcGFyZSBvdXRwdXQgZGF0YSBmcmFtZQpvdXRwdXQgPC0gbGlzdCgibW9kZWwiID0gbW9kZWwsIAogICAgICAgICAgICAgICAiZGF0YSIgPSBkYXRhLCAKICAgICAgICAgICAgICAgImFubm90YXRpb24iID0gYW5ub3RhdGlvbikKIyBPdXRwdXQgcmVzdWx0cwpyZXR1cm4ob3V0cHV0KQp9LCBlcnJvciA9IGZ1bmN0aW9uKGUpe2NhdCgiRVJST1IgOiIsY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGF0YTEgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdCAtICBpbnB1dCBkYXRhIHRpbWUKIycgQHBhcmFtIHlfcHJveSAtICBpbnB1dCB5IHByb3llY3RlZAojJyBAcGFyYW0geV9wcm9mIC0gIGlucHV0IGRhdGEgCiMnIEBwYXJhbSBkYXRhMiAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB4IC0gIGlucHV0IGRhdGEgeAojJyBAcGFyYW0geSAtICBpbnB1dCBkYXRhIHkKIycgQHBhcmFtIGxhYmVsIC0gIGlucHV0IGRhdGEgbGFiZWwKIycgQHJldHVybiBsb2dpc3RpY19ncm93dGhfbW9kZWwKIycgQGV4cG9ydCBsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdAojJyBAa2V5d29yZHMgbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QKIycKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QgPC0gZnVuY3Rpb24oLmRhdGExLCB0LCB5X3Byb3ksIHlfY29uZiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhMiwgeCwgeSwgbGFiZWwpIHsKdCA8LSBlbnF1byh0KSAgCnlfcHJveSA8LSBlbnF1byh5X3Byb3kpCnlfY29uZiA8LSBlbnF1byh5X2NvbmYpCnggPC0gZW5xdW8oeCkKeSA8LSBlbnF1byh5KQpsYWJlbCA8LSBlbnF1byhsYWJlbCkKCmdncGxvdChkYXRhID0gLmRhdGExKSArCiAgZ2VvbV9saW5lKGFlcyghIXQsICEheV9wcm95LCBjb2xvdXIgPSAiUHJvamVjdGVkIikpICsgIAogIGdlb21fcG9pbnQoYWVzKCEhdCwgISF5X3Byb3ksIGNvbG91ciA9ICJQcm9qZWN0ZWQiKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IC5kYXRhMSwgCiAgICAgICAgICAgICBhZXMoISF0LCAhIXlfY29uZiwgY29sb3VyID0gIkNvbmZpcm1lZCIpKSArCiAgZ2VvbV9sYWJlbChkYXRhID0gLmRhdGEyLCAKICAgICAgICAgICAgYWVzKCB4ID0gISF4LCB5ID0gISF5LCBsYWJlbCA9ICEhbGFiZWwpLCAKICAgICAgICAgICAgZmlsbCA9ICJsaWdodGJsdWUiLAogICAgICAgICAgICBudWRnZV94ID0gLTI1LCAKICAgICAgICAgICAgc2l6ZSA9IDUuMCwKICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoQ291bnRyeSwgIi0gQ292aWQtMTkgLSBMb2dpc3RpYyBHcm93dGggTW9kZWwgKExHTSkiKSwKICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIkNvbmZpcm1lZCAvIFByb2plY3RlZCBDYXNlcyBSYXRpbyA6IiwKICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEyJHJhdGlvLCAiJSIpLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgCiAgICAgICB5ID0gIk51bWJlciBvZiBDb25maXJtZWQgQ2FzZXMiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKDE0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICAgIAp9IAoKIycgQHRpdGxlIGJhcl9ncmFwaAojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdGl0bGUgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGJhcl9ncmFwaAojJyBAZXhwb3J0IGJhcl9ncmFwaAojJyBAa2V5d29yZHMgYmFyX2dyYXBoCiMnIApiYXJfZ3JhcGggPC0gZnVuY3Rpb24odGlkeV9qb2luLCB5LCB0aXRsZSwgc3VidGl0bGUpIHsKeSA8LSBlbnF1byh5KSAgCnRpZHlfam9pbiAlPiUgZ3JvdXBfYnkoY291bnRyeSkgJT4lIAogIHN1bW1hcmlzZSh5ID0gbWF4KCEheSkpICU+JSAKICB0b3BfbigxMCkgJT4lIGFycmFuZ2UoeSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYXNfZmFjdG9yKGNvdW50cnkpLCB5ID0geSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgCiAgICAgICAgICAgZmlsbCA9ICJsaWdodGJsdWUiLCAKICAgICAgICAgICBhbHBoYSA9IDAuNikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoeSwgMCkpLCAKICAgICAgICAgICAgaGp1c3QgPSAicmlndGgiLAogICAgICAgICAgICBzaXplID0gNC41LAogICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogIGNvb3JkX2ZsaXAoKSArIHRoZW1lX21pbmltYWxfZ3JpZCgxNCkgIAp9CgojJyBAdGl0bGUgcGxvdGx5CiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0geSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB0aXRsZSAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gcGxvdGx5CiMnIEBleHBvcnQgcGxvdGx5CiMnIEBrZXl3b3JkcyBwbG90bHkKIycgCnBsb3RseSA8LSBmdW5jdGlvbihkYXRhLCB0LCBjb25maXJtZWQsIFByb2plY3RlZF9MR00sIHRpdGxlKSB7CmZpZyA8LSBwbG90X2x5KGRhdGEsIHggPSB0KQpmaWcgPC0gZmlnICU+JSBhZGRfdHJhY2UoeSA9IGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ2NvbmZpcm1lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gJ2xpbmVzK21hcmtlcnMnKQpmaWcgJT4lIGFkZF90cmFjZSh5ID0gUHJvamVjdGVkX0xHTSwgCiAgICAgICAgICAgICAgICAgIG5hbWUgPSAnUHJvamVjdGVkX0xHTScsIAogICAgICAgICAgICAgICAgICBtb2RlID0gJ2xpbmVzK21hcmtlcnMnKSAlPiUgCiAgbGF5b3V0KHRpdGxlID0gdGl0bGUpCn0KCnBsb3RfY29tcGFyaXNvbiA8LSBmdW5jdGlvbigpewpsaW1feSA8LSBtYXgobW8kZGF0YSRQcm9qZWN0ZWRfTEdNLCBuYS5ybSA9IFQpCiMgc3VtIG9mIHNxdWFyZXMKc3VtKChtbyRkYXRhJFByb2plY3RlZF9MR00gLSBtbyRkYXRhJGNvbmZpcm1lZCleMikKIyB0aGUgb2JzZXJ2ZWQgcHJldmFsZW5jZXM6CndpdGgobW8kZGF0YSwgcGxvdCh0LCBjb25maXJtZWQsIHBjaCA9IDE5LCBjb2wgPSAiZ3JlZW4iLCB5bGltID0gYygwLCBsaW1feSkpKQojIHRoZSBtb2RlbC1wcmVkaWN0ZWQgcHJldmFsZW5jZXM6CndpdGgobW8kZGF0YSwgbGluZXModCwgUHJvamVjdGVkX0xHTSwgY29sID0gInJlZCIsIHR5cGUgPSAibyIpKQojIHRoZSAiZXJyb3JzIjoKc2VnbWVudHMobW8kZGF0YSR0LCBtbyRkYXRhJGNvbmZpcm1lZCwgbW8kZGF0YSR0LCBtbyRkYXRhJFByb2plY3RlZF9MR00pCmdyaWQoY29sID0gImJsdWUiKSAgCn0KCiMnIEB0aXRsZSBjb3VudHJ5X3Jlc3VtZQojJyBAcGFyYW0gQ291bm50cnkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gY3V0b2ZmIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHRyYWNlIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHRtYXggLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gY29tcCAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gY291bnRyeV9yZXN1bWUKIycgQGV4cG9ydCBjb3VudHJ5X3Jlc3VtZQojJyBAa2V5d29yZHMgY291bnRyeV9yZXN1bWUKIycKY291bnRyeV9yZXN1bWUgPC0gZnVuY3Rpb24oQ291bnRyeSwgY3V0b2ZmLCB0cmFjZSwgdG1heCkgewojIFByaW50IHJlc3VtZSBkYXRhIGJ5IGNvdW50cnkgCnByaW50KHJlc3VtZShDb3VudHJ5KSkKIyBDYWxjdWxhdGUgYWRkaXRpb25hbCBjb3VudHJ5IGRhdGEKZGF0YSA8LSBjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnByaW50KGRhdGEpCiMgUGxvdCBjb3VudHJ5IGRhdGEKcGxvdDEgPC0gcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpwcmludChwbG90MSkKIyBDYWxjdWxhdGUgTEdNIGJ5IGNvdXVudHJ5Cm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSBjdXRvZmYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UgPSB0cmFjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWF4ID0gdG1heCkKZm9vIDwtIHRpZHkobW8kbW9kZWwpCnByaW50KGZvbykKYmFyIDwtIGdsYW5jZShtbyRtb2RlbCkKcHJpbnQoYmFyKQojIENyZWF0ZSAiY291bnRyeV9yZXN1bWUiIGRhdGEgZnJhbWUKY291bnRyeV9yZXN1bWUgPC0gZGF0YS5mcmFtZShjb3VudHJ5ID0gQ291bnRyeSwgCiAgICAgICAgICAgICAgICAgYWN0dWFsID0gaGVhZChkYXRhJGRhdGUsIDEpLAogICAgICAgICAgICAgICAgIHN0YXJ0ID0gbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICBjYXNlID0gaGVhZChkYXRhJGNvbmZpcm1lZCwgMSksCiAgICAgICAgICAgICAgICAgZGVhdGggPSBoZWFkKGRhdGEkZGVhdGgsIDEpLAogICAgICAgICAgICAgICAgIENGUiA9IGhlYWQoZGF0YSRDRlIsMSksIAogICAgICAgICAgICAgICAgIGRheXMgPSAxICsgaGVhZChkYXRhJGRhdGUsIDEpIC0gCiAgICAgICAgICAgICAgICAgICBtaW4oZGF0YSRkYXRlW2RhdGEkY29uZmlybWVkID49IDFdLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgICAgIGlzQ29udiA9IGJhciRpc0NvbnYsCiAgICAgICAgICAgICAgICAgSyA9IHJvdW5kKGZvbyRlc3RpbWF0ZVsxXSwgMCksCiAgICAgICAgICAgICAgICAgYSA9IHJvdW5kKGZvbyRlc3RpbWF0ZVsyXSwgMCksCiAgICAgICAgICAgICAgICAgbiA9IHJvdW5kKGZvbyRlc3RpbWF0ZVszXSwgMiksCiAgICAgICAgICAgICAgICAgcHJvZyA9IHJvdW5kKDEwMCAtIDEwMCAqIChmb28kZXN0aW1hdGVbMV0gLSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZChkYXRhJGNvbmZpcm1lZCwgMSkpIC8KICAgICAgICAgICAgICAgICAgICBmb28kZXN0aW1hdGVbMV0sIDApLAogICAgICAgICAgICAgICAgIHNpZ21hID0gcm91bmQoYmFyJHNpZ21hLCAwKSwKICAgICAgICAgICAgICAgICBkZXZpYW5jZSA9IHJvdW5kKGJhciRkZXZpYW5jZSwgMCksCiAgICAgICAgICAgICAgICAgbG9nTGlrID0gcm91bmQoYmFyJGxvZ0xpaywgMCksCiAgICAgICAgICAgICAgICAgZGYucmVzaWR1YWwgPSByb3VuZChiYXIkZGYucmVzaWR1YWwsIDApLAogICAgICAgICAgICAgICAgIEFJQyA9IHJvdW5kKGJhciRBSUMsIDApLAogICAgICAgICAgICAgICAgIEJJQyA9IHJvdW5kKGJhciRCSUMsIDApLAogICAgICAgICAgICAgICAgIEsucC52YWx1ZSAgPSBmb28kcC52YWx1ZVsxXSwKICAgICAgICAgICAgICAgICBhLnAudmFsdWUgID0gZm9vJHAudmFsdWVbMl0sCiAgICAgICAgICAgICAgICAgbi5wLnZhbHVlICA9IGZvbyRwLnZhbHVlWzNdLAogICAgICAgICAgICAgICAgIEsuc3RkLmVycm9yICA9IGZvbyRzdGQuZXJyb3JbMV0sCiAgICAgICAgICAgICAgICAgYS5zdGQuZXJyb3IgID0gZm9vJHN0ZC5lcnJvclsyXSwKICAgICAgICAgICAgICAgICBuLnN0ZC5lcnJvciAgPSBmb28kc3RkLmVycm9yWzNdKQojIFBsb3QgTEdNIHJlc3VsdHMKcHJpbnQobG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpKQpwcmludChwbG90bHkobW8kZGF0YSwgfmRhdGUsIH5jb25maXJtZWQsIH5Qcm9qZWN0ZWRfTEdNLCAKICAgICAgIHBhc3RlKENvdW50cnksICItIE1vZGVsIFJlc3VsdHMgLSIsIG1vJGFubm90YXRpb24kbGFiZWwpKSkKIyBQcmludCAiY291bnRyeV9yZXN1bWUiIGRhdGEgZnJhbWUKcHJpbnQoY291bnRyeV9yZXN1bWUpCnJldHVybihjb3VudHJ5X3Jlc3VtZSkKfQpgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFJ1biB0aWR5X2pvaW5fZnVuIGZ1bmN0aW9uCmNvdmlkMTkgPC0gd3JhbmdsX2NvdmlkMTkoY292aWQxOSkKdHNjIDwtIHdyYW5nbF90c2ModHNjKQp0c2QgPC0gd3JhbmdsX3RzYyh0c2QpCnRzciA8LSB3cmFuZ2xfdHNjKHRzcikKdGlkeV9qb2luIDwtIHRpZHlfam9pbl9mdW4oKQpgYGAKCiMgSW50cm9kdWN0aW9uICAKClRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgc2hvd3MgYW4gYW5hbHlzaXMgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JvbmF2aXJ1cyBwYW5kZW1pYyAoQ292aWQxOSkuCgpUaGUgYW5hbHlzaXMgaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0cywgdGhlIGZpcnN0IGNvbXByaXNlcyBnZW5lcmFsIGdyYXBocyBvZiB0aGUgZGF0YSBhbmQgdGhlbiBhIG51bWVyaWNhbCBzaW11bGF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgbG9naXN0aWMgZ3Jvd3RoIG1vZGVsIChMR00pIGluIG9yZGVyIHRvIGZvcmVjYXN0IHRoZSBwb3NzaWJsZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgYnkgY291bnRyeS4gIAoKVGhlIGRhdGEgdXNlZCBmb3IgdGhpcyBhbmFseXNpcyBhcmUgdXBkYXRlZCBkYWlseSBhbmQgYXJlIHN0b3JlZCBpbiAqKkRhdGEgUmVwb3NpdG9yeSBieSBKb2hucyBIb3BraW5zIENTU0UqKgoKIyBUZXJtcyB1c2VkICAgIAoKIyMjIFJlY292ZXJ5IHJhdGlvIChSUikgICAgIAoKVGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHJlY292ZXJlZCBmcm9tIGEgc3BlY2lmaWVkIGRpc2Vhc2UgYW1vbmcgYWxsIGluZGl2aWR1YWxzIGRpYWdub3NlZCB3aXRoIHRoZSBkaXNlYXNlIG92ZXIgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiAgICAKCiQkUmVjb3ZlcnlSYXRpbyAoUlIpID0gXGZyYWN7UmVjb3ZlcmVkfXtDb25maXJtZWR9JCQgIAoKIyMjIENhc2UgRmF0YWxpdHkgcmF0aW8gKENGUikgICAgCgpDYXNlIGZhdGFsaXR5IHJhdGUsIGFsc28gY2FsbGVkIGNhc2UgZmF0YWxpdHkgcmF0aW8sIGluIGVwaWRlbWlvbG9neSwgdGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyBkaWUgZnJvbSBhIHNwZWNpZmllZCBkaXNlYXNlIGFtb25nIGFsbCBpbmRpdmlkdWFscyBkaWFnbm9zZWQgd2l0aCB0aGUgZGlzZWFzZSBvdmVyIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZS4gIAoKaHR0cHM6Ly93d3cuYnJpdGFubmljYS5jb20vc2NpZW5jZS9jYXNlLWZhdGFsaXR5LXJhdGUKCiQkQ2FzZSBGYXRhbGl0eSBSYXRpbyAoQ0ZSKSA9IFxmcmFje0RlYXRoc317Q29uZmlybWVkfSQkICAKCiMjIyBMb2dpc3RpYyBHcm93dGggTW9kZWwgKExHTSkgICAgICAKCkNsYXJrICgyMDExKSBwcm9wb3NlIGEgbmV3IGVtcGlyaWNhbCBtb2RlbCBiYXNlZCBvbiBsb2dpc3RpYyBncm93dGggbW9kZWxzLiAgCgpBIG5vbmxpbmVhciBtb2RlbCBmb3JtdWxhIGluY2x1ZGluZyB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMuICAKCiQkUHJvamVjdGVkQ2FzZXMgPSBcZnJhY3soSyAqIHQgXiBuKX17KGEgKyB0IF4gbil9JCQgICAgCgpXaGVyZTogIAoKQ2FzZXMgPSBQcm9qZWN0ZWQgQ2FzZSAgIApLID0gQ2FycnlpbmcgY2FwYWNpdHkgIApuID0gSHlwZXJib2xpYyBleHBvbmVudCAgCmEgPSBDb25zdGFudCAgCnQgID0gVGltZSAgCgpUaGUgYmVzdC1maXQgbm9ubGluZWFsIG1vZGVsIGlzIG9idGFpbmVkIGJ5IGFuIGl0ZXJhdGl2ZSBsZWFzdC1zcXVhcmVkIG1ldGhvZC4KClRoZSBsb2dpc3RpYyBncm93dGggbW9kZWwgd2FzIHVzZWQgdG8gcHJvamVjdCB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIGRpc2Vhc2UgaW4gY2VydGFpbiBjb3VudHJpZXMuCgpUaGUgbW9zdCByZWxldmFudCByZXN1bHQgb2YgdGhlIG1vZGVsIGNvcnJlc3BvbmRzIHRvIHRoZSAqKnByb2plY3RlZCBjYXNlcyoqLCB0aGlzIHRlcm0gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXNlcyBlc3RpbWF0ZWQgYnkgdGhlIG1vZGVsIGZvciBlYWNoIGNvdW50cnksIHdoZXJlIHRoZSBtb2RlbCBpcyBleGVjdXRlZC4gIAoKIyMjIFByb2plY3RlZCAtIENvbmZpcm1lZCBDYXNlcyBSYXRpbyAgCgpBc3N1bWluZyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgKipwcm9qZWN0ZWQgY2FzZXMqKiBjb3JyZXNwb25kcyB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FzZXMgdGhhdCB3b3VsZCBvY2N1ciBpbiBhIGdpdmVuIGNvdW50cnksIHRoZSBwcm9qZWN0ZWQgLSBjb25maXJtZWQgY2FzZXMgcmF0aW8gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24uCgokJFByb2plY3RlZENvbmZpcm1lZENhc2VzIFJhdGlvID0gMTAwIC0gKDEwMCAqIFxmcmFjeyhtYXgoUHJvamVjdGVkIENhc2UpIC0gbWF4KENvbmZpcm1lZCkpfXsgCiAgICAgICAgICAgICAgICAgIG1heChQcm9qZWN0ZWQgQ2FzZSl9JCQKICAgICAgICAgICAgICAgICAgCiMgR2xvYmFsIENhc2UgIAoKIyMgQXZlcmFnZSBDYXNlcyAoTGFzdCBUaHJlZSBEYXlzKQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQmFyIGdyYXBoIEF2ZXJhZ2UgQ29uZmlybWVkIENhc2VzIChMYXN0IHRocmVlIGRheXMpCmJhcl9ncmFwaCh0aWR5X2pvaW4sIGMzZCwgCiAgICAgICAgICAgICAgICAgICJHbG9iYWwgQ2FzZXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICAiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiYXJfZ3JhcGgodGlkeV9qb2luLCBkM2QsIAogICAgICAgICAgICAgICAgICAiR2xvYmFsIENhc2VzIC0gRGVhdGhzIiwgCiAgICAgICAgICAgICAgICAgICJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIpCmBgYAoKIyMgR2xvYmFsIENhc2UgU3VtbWFyeSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3ZpZDE5CmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X2dyaWRfZ2xvYmFsKHRpZHlfam9pbikKYGBgCgojIyBDb3VudHJ5IENhc2VzCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0aWR5X2pvaW5fZnVuX21heCh0aWR5X2pvaW4pCmBgYAoKIyMgQ2hpbmEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNoaW5hIgpjaGluYSA8LSBjb3VudHJ5X3Jlc3VtZSgiQ2hpbmEiLCBjdXRvZmYgPSA1MDAsIHRyYWNlID0gRiwgdG1heCA9IDgwKQpgYGAKCiMjIEtvcmVhLCBTb3V0aCAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJLb3JlYSwgU291dGgiCnNrIDwtIGNvdW50cnlfcmVzdW1lKCJLb3JlYSwgU291dGgiLCBjdXRvZmYgPSA1MCwgdHJhY2UgPSBGLCB0bWF4ID0gODApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNoaW5hLCBzaykKYGBgCgojIFRoZSBBbWVyaWNhcyAgCgojIyBDb25maXJtZWQgQ2FzZQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlcyIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiTnVtYmVyIG9mIENhc2VzIiwgU3lzLkRhdGUoKSkpCmBgYAoKIyMgQ29uZmlybWVkIENhc2UgLSBBdmVyYWdlIExhc3QgVGhyZWUgRGF5cwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjM2QsICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQ2FzZXMgTGFzdCBEYXlzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiRWN1YWRvcnxDaGlsZXxQZXJ1fFBhbmFtYXxBcmdlbnRpbmF8Q29sb21iaWF8QnJhemlsfE1leGljb3xWZW5lenVlbGEiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGFycmFuZ2UoZGVzYyhkYXRlKSkKYmFyX2dyYXBoKGZvbywgaGVhZChjYXNlc19ieV9kYXksIDEpLCAgCiAgICAgICAgICAgICAgICAgICJUaGUgQW1lcmljYXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiQ2FzZXMgTGFzdCBEYXlzIiwgU3lzLkRhdGUoKSkpCmBgYAoKIyMgTWV4aWNvICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJNZXhpY28iCm1leGljbyA8LSBjb3VudHJ5X3Jlc3VtZSgiTWV4aWNvIiwgY3V0b2ZmID0gMTEsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBtZXhpY28pCmBgYAoKIyMgTWV4aWNvICYgT3RoZXIgQ291bnRyaWVzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfEtvcmVhLCBTb3V0aHxQZXJ1fEFyZ2VudGluYXxDaGlsZXxDb2xvbWJpYXxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNhc2VzX2J5X2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnksIGFscGhhID0gMC4xNSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNhc2VzX2J5X2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IGxvZyh2YWx1ZSkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAibG9nKE51bWJlciBvZiBDYXNlcykiKQpgYGAKCiMjIERvbWluaWNhbiBSZXB1YmxpYwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkRvbWluaWNhbiBSZXB1YmxpYyIKZHIgPC0gY291bnRyeV9yZXN1bWUoIkRvbWluaWNhbiBSZXB1YmxpYyIsIGN1dG9mZiA9IDEwLCAKICAgICAgICAgICAgICAgICAgICAgdHJhY2UgPSBGLCB0bWF4ID0gNDgpCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGRyKQpgYGAKCiMjIFVuaXRlZCBTdGF0ZSAoVVMpCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBodHRwczovL2NvdmlkMTkuaGVhbHRoZGF0YS5vcmcKCiMgaHR0cDovL3d3dy5oZWFsdGhkYXRhLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL2ZpbGVzL3Jlc2VhcmNoX2FydGljbGVzLzIwMjAvY292aWRfcGFwZXJfTUVEUlhJVi0yMDIwLTA0Mzc1MnYxLU11cnJheS5wZGYKCkNvdW50cnkgPC0gIlVTIgp1cyA8LSBjb3VudHJ5X3Jlc3VtZSgiVVMiLCBjdXRvZmYgPSAyMDAwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHVzKQpgYGAKCiMjIEFyZ2VudGluYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQXJnZW50aW5hIgphcmcgPC0gY291bnRyeV9yZXN1bWUoIkFyZ2VudGluYSIsIGN1dG9mZiA9IDUwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgYXJnKQpgYGAKCiMjIEJyYXppbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQnJhemlsIgpicmEgPC0gY291bnRyeV9yZXN1bWUoIkJyYXppbCIsIGN1dG9mZiA9IDIwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgYnJhKQpgYGAKCiMjIENhbmFkYSAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDYW5hZGEiCmNhbiA8LSBjb3VudHJ5X3Jlc3VtZSgiQ2FuYWRhIiwgY3V0b2ZmID0gODAsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBjYW4pCmBgYAoKIyMgQ29sb21iaWEgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQ29sb21iaWEiCmNvbCA8LSBjb3VudHJ5X3Jlc3VtZSgiQ29sb21iaWEiLCBjdXRvZmYgPSA1LCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY29sKQpgYGAKCiMjIEVjdWFkb3IgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkVjdWFkb3IiCmVjdSA8LSBjb3VudHJ5X3Jlc3VtZSgiRWN1YWRvciIsIGN1dG9mZiA9IDEsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBlY3UpCmBgYAoKIyMgQ2hpbGUKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDaGlsZSIKY2hpIDwtIGNvdW50cnlfcmVzdW1lKCJDaGlsZSIsIGN1dG9mZiA9IDEwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY2hpKQpgYGAKCiMjIFBhbmFtYQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlBhbmFtYSIKcGFuIDwtIGNvdW50cnlfcmVzdW1lKCJQYW5hbWEiLCBjdXRvZmYgPSAyMCwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHBhbikKYGBgCgojIyBQZXJ1ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJQZXJ1IgpwZXIgPC0gY291bnRyeV9yZXN1bWUoIlBlcnUiLCBjdXRvZmYgPSAxMCwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHBlcikKYGBgCgojIyBWZW5lenVlbGEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnZlbiA8LSBjb3VudHJ5X3Jlc3VtZSgiVmVuZXp1ZWxhIiwgY3V0b2ZmID0gMSwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHZlbikKYGBgCgojIEV1cm9wZSAgCgojIyBDb25maXJtZWQgQ2FzZSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58RnJhbmNlfEdlcm1hbnl8Tm9yd2F5fFVuaXRlZCBLaW5nZG9tfE5ldGhlcmxhbmRzfFN3aXR6ZXJsYW5kfFBvcnR1Z2FsIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAiRXVyb3BlIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIk51bWJlciBvZiBDYXNlcyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQXZlcmFnZSBMYXN0IFRocmVlIERheXMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJdGFseXxTcGFpbnxGcmFuY2V8R2VybWFueXxOb3J3YXl8VW5pdGVkIEtpbmdkb218TmV0aGVybGFuZHN8U3dpdHplcmxhbmR8UG9ydHVnYWwiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpCmJhcl9ncmFwaChmb28sIGMzZCwgIAogICAgICAgICAgICAgICAgICAiRXVyb3BlIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIkF2ZXJhZ2UgTGFzdCBUaHJlZSBEYXlzIiwgU3lzLkRhdGUoKSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkl0YWx5fFNwYWlufEtvcmVhLCBTb3V0aHxHZXJtYW55fFVuaXRlZCBLaW5nZG9tfEZyYW5jZSIpCnRpdGxlIDwtICJFdXJvcGEiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKGNhc2VzX2J5X2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gdmFsdWUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGNvdW50cnkpKSArICAgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gVCkgKyAgCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKyAgICAKICB0aGVtZV9taW5pbWFsX2dyaWQoMTMpICsgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gIk51bWJlciBvZiBDYXNlcyIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58S29yZWEsIFNvdXRofEdlcm1hbnl8VW5pdGVkIEtpbmdkb218RnJhbmNlfFN3aXR6ZXJsYW5kfEN6ZWNoaWEiKQp0aXRsZSA8LSAiRXVyb3BlIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgojIyBCZWxnaXVtIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkJlbGdpdW0iCmN6ZSA8LSBjb3VudHJ5X3Jlc3VtZSgiQmVsZ2l1bSIsIGN1dG9mZiA9IDUwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY3plKQpgYGAKCiMjIEN6ZWNoaWEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkN6ZWNoaWEiCmN6ZSA8LSBjb3VudHJ5X3Jlc3VtZSgiQ3plY2hpYSIsIGN1dG9mZiA9IDEwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY3plKQpgYGAKCiMjIEdyZWVjZSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiR3JlZWNlIgpjemUgPC0gY291bnRyeV9yZXN1bWUoIkdyZWVjZSIsIGN1dG9mZiA9IDMwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY3plKQpgYGAKCiMjIEl0YWx5ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJdGFseSIKaXRhIDwtIGNvdW50cnlfcmVzdW1lKCJJdGFseSIsIGN1dG9mZiA9IDEwMCwgdHJhY2UgPSBGLCB0bWF4ID0gODApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGl0YSkKYGBgCgojIyBTcGFpbiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiU3BhaW4iCnNwYSA8LSBjb3VudHJ5X3Jlc3VtZSgiU3BhaW4iLCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBzcGEpCmBgYAoKIyMgVW5pdGVkIEtpbmdkb20gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlVuaXRlZCBLaW5nZG9tIgp1ayA8LSBjb3VudHJ5X3Jlc3VtZSgiVW5pdGVkIEtpbmdkb20iLCBjdXRvZmYgPSAzMDAsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCB1aykKYGBgCgojIyBGcmFuY2UgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkZyYW5jZSIKZnJhIDwtIGNvdW50cnlfcmVzdW1lKCJGcmFuY2UiLCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBmcmEpCmBgYAoKIyMgR2VybWFueSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiR2VybWFueSIKZ2VyIDwtIGNvdW50cnlfcmVzdW1lKCJHZXJtYW55IiwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgZ2VyKQpgYGAKCiMjIE5ldGhlcmxhbmRzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTmV0aGVybGFuZHMiCm5ldCA8LSBjb3VudHJ5X3Jlc3VtZSgiTmV0aGVybGFuZHMiLCBjdXRvZmYgPSAyMCwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIG5ldCkKYGBgCgojIyBTd2l0emVybGFuZCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiU3dpdHplcmxhbmQiCnN3aSA8LSBjb3VudHJ5X3Jlc3VtZSgiU3dpdHplcmxhbmQiLCBjdXRvZmYgPSA1MCwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHN3aSkKYGBgCgojIyBOb3J3YXkgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIk5vcndheSIKbm9yIDwtIGNvdW50cnlfcmVzdW1lKCJOb3J3YXkiLCBjdXRvZmYgPSAxNSwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIG5vcikKYGBgCgojIyBQb3J0dWdhbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiUG9ydHVnYWwiCnBvciA8LSBjb3VudHJ5X3Jlc3VtZSgiUG9ydHVnYWwiLCBjdXRvZmYgPSAzNSwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHBvcikKYGBgCgojIE90aGVyIENvdW50cmllcwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSmFwYW58S29yZWEsIFNvdXRofElyYW58UnVzc2lhfElzcmFlbHxJbmRpYXxUdXJrZXl8U2F1ZGkgQXJhYmlhfFBha2lzdGFuIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAiT3RoZXIgQ291bnRyaWVzIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIk51bWJlciBvZiBDYXNlcyIsIFN5cy5EYXRlKCkpKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXJhbnxUdXJrZXl8S29yZWEsIFNvdXRofElzcmFlbHxKYXBhbnxSdXNzaWF8U2F1ZGkgQXJhYmlhIikKdGl0bGUgPC0gIk90aGVyIENvdW50cmllcyIKc3VidGl0bGUgPC0gIkN1bXVsYXRpdmUgQ29uZmlybWVkIENhc2VzIgojIFNlbGVjdCBkYXRhCmRmIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBmaWx0ZXIoY2FzZXNfYnlfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBjb25maXJtZWQpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1kYXRlLCAtY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKGRheSA9IDE6bigpKQoKIyBQbG90CmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSB2YWx1ZSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gY291bnRyeSkpICsgICAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBUKSArICAKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArICAgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJcmFufFR1cmtleXxLb3JlYSwgU291dGh8SXNyYWVsfEphcGFufFJ1c3NpYXxTYXVkaSBBcmFiaWEiKQp0aXRsZSA8LSAiT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgpUYWl3YW4qCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiVGFpd2FuKiIKamFwIDwtIGNvdW50cnlfcmVzdW1lKCJUYWl3YW4qIiwgY3V0b2ZmID0gMzAsIHRyYWNlID0gRiwgdG1heCA9IDUwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBqYXApCmBgYAoKIyMgSmFwYW4gICAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSmFwYW4iCmphcCA8LSBjb3VudHJ5X3Jlc3VtZSgiSmFwYW4iLCBjdXRvZmYgPSAzMCwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGphcCkKYGBgCgojIyBJcmFuICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJcmFuIgppcmEgPC0gY291bnRyeV9yZXN1bWUoIklyYW4iLCBjdXRvZmYgPSAwLCB0cmFjZSA9IEYsIHRtYXggPSA4MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgaXJhKQpgYGAKCiMjIFJ1c3NpYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiUnVzc2lhIgpydXMgPC0gY291bnRyeV9yZXN1bWUoIlJ1c3NpYSIsIGN1dG9mZiA9IDEwMCwgdHJhY2UgPSBGLCB0bWF4ID0gNTApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHJ1cykKYGBgCgojIyBTaW5nYXBvcmUKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJTaW5nYXBvcmUiCmlzciA8LSBjb3VudHJ5X3Jlc3VtZSgiU2luZ2Fwb3JlIiwgY3V0b2ZmID0gNTAsIHRyYWNlID0gRiwgdG1heCA9IDgwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBpc3IpCmBgYAoKIyMgSXNyYWVsICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJc3JhZWwiCmlzciA8LSBjb3VudHJ5X3Jlc3VtZSgiSXNyYWVsIiwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEYsIHRtYXggPSA1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgaXNyKQpgYGAKCgoKYGBge3IgZXZhbD1GQUxTRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9NSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBDb3VudHJpZXMgQW5hbHlzaXMKY291bnRyaWVzX3Jlc3VtZSAlPiUgYXJyYW5nZShjb3VudHJ5KQpjb3VudHJpZXNfcmVzdW1lICU+JSAKc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSkKCmdncGxvdChjb3VudHJpZXNfcmVzdW1lKSArCiAgZ2VvbV9wb2ludChhZXMoY2FzZSwgQ0ZSLCBjb2wgPSBpc0NvbnYpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNhc2UsIENGUiksIG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBUKSArCiAgdGhlbWVfYncoKQoKY291bnRyaWVzX3Jlc3VtZSAlPiUgZmlsdGVyKEsgPCAyMDAwMDApICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXMoY2FzZSwgSywgY29sID0gaXNDb252KSkgKwogIGdlb21fc21vb3RoKGFlcyhjYXNlLCBLKSwgbWV0aG9kID0gImxtIiwgc2UgPSBGKSArICAKICB0aGVtZV9idygpCgpjb3VudHJpZXNfcmVzdW1lICU+JSBmaWx0ZXIoSyA8IDIwMDAwMCkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyhhLCBLLCBjb2wgPSBpc0NvbnYpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGEsIEspLCBtZXRob2QgPSAibG0iLCBzZSA9IEYpICsgIAogIHRoZW1lX2J3KCkKCmNvdW50cmllc19yZXN1bWUgJT4lIGZpbHRlcihLIDwgMjAwMDAwKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKEFJQywgQklDLCBjb2wgPSBpc0NvbnYpKSArCiAgdGhlbWVfYncoKQoKY291bnRyaWVzX3Jlc3VtZSAlPiUgCiAgZmlsdGVyKEsgPCAyMDAwMDAgJiBzaWdtYSA8IDUwMCkgJT4lIAogIHNlbGVjdChjb3VudHJ5LCBwcm9nLCBzaWdtYSkgJT4lCiAgcGxvdF9seSh4ID0gfnByb2csIHkgPSB+c2lnbWEsIGNvbG9yID0gfmNvdW50cnkpCgpjb3VudHJpZXNfcmVzdW1lICU+JSAKICBzZWxlY3QoY291bnRyeSwgZGF5cywgY2FzZSkgJT4lCiAgcGxvdF9seSh4ID0gfmRheXMsIHkgPSB+Y2FzZSwgY29sb3IgPSB+Y291bnRyeSkKCmNvdW50cmllc19yZXN1bWUgJT4lIAogIHNlbGVjdChjb3VudHJ5LCBkZWF0aCwgY2FzZSkgJT4lCiAgcGxvdF9seSh4ID0gfmNhc2UsIHkgPSB+ZGVhdGgsIGNvbG9yID0gfmNvdW50cnkpCgojIEJhciBncmFwaCBBdmVyYWdlIENvbmZpcm1lZCBDYXNlcyAoTGFzdCB0aHJlZSBkYXlzKQpmb28gPC0gdGlkeV9qb2luX2Z1bl9tYXgodGlkeV9qb2luKSAlPiUKICBmaWx0ZXIoY29uZmlybWVkID4gMjAwMCkgJT4lCiAgYXJyYW5nZShkZXNjKENGUikpICU+JSAgCiAgZ2dwbG90KGFlcyh4ID0gYXNfZmFjdG9yKGNvdW50cnkpLCB5ID0gQ0ZSKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCAKICAgICAgICAgICBmaWxsID0gImxpZ2h0Ymx1ZSIsIAogICAgICAgICAgIGFscGhhID0gMC42KSArIAogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChDRlIsIDEpKSwgCiAgICAgICAgICAgIGhqdXN0ID0gInJpZ3RoIiwKICAgICAgICAgICAgc2l6ZSA9IDQuNSwKICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsKICBsYWJzKHRpdGxlID0gIkNhc2UgRmF0YWxpdHkgUmF0aW8iLAogICAgICAgc3VidGl0bGUgPSAiIiwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgY29vcmRfZmxpcCgpICsgdGhlbWVfbWluaW1hbF9ncmlkKDEyKSAKZm9vCmBgYAoKIyBSZWZlcmVuY2VzICAKClNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0ICAKCkNsYXJrLCBBLkouICgyMDExKS4gIkRlY2xpbmUgQ3VydmUgQW5hbHlzaXMgaW4gVW5jb252ZW50aW9uYWwgUmVzb3VyY2UgUGxheXMKICAgIFVzaW5nIExvZ2lzdGljIEdyb3d0aCBNb2RlbHMuIiBNLlMuIAogICAgVGhlc2lzLCBUaGUgVW5pdmVyc2l0eSBvZiBUZXhhcyBhdCBBdXN0aW4sIEF1Z3VzdCAyMDExLiAKCgo=