Location: “~/R/COVID-19-master/vignettes/covid_lgm”

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.

LS0tCnRpdGxlOiAiQ292aWQxOSBQcm9qZWN0ZWQgQ2FzZXMgYnkgQ291bnRyaWVzIgphdXRob3I6ICJBbmRyZXMgUEVOQSBhbmRyZXNwZW5hQGdtYWlsLmNvbSIKZGF0ZTogIk1heS8wNy8yMDIwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcyAgICAKLS0tCgpMb2NhdGlvbjogIn4vUi9DT1ZJRC0xOS1tYXN0ZXIvdmlnbmV0dGVzL2NvdmlkX2xnbSIKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCgllY2hvID0gVFJVRSwKCW1lc3NhZ2UgPSBGQUxTRSwKCXdhcm5pbmcgPSBGQUxTRQopCmBgYAoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCmJvZHl7IC8qIE5vcm1hbCAgKi8KICAgICAgZm9udC1zaXplOiAxNnB4OwogIH0KdGQgeyAgLyogVGFibGUgICovCiAgZm9udC1zaXplOiAxNHB4Owp9CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDM4cHg7CiAgY29sb3I6IERhcmtSZWQ7Cn0KaDEgeyAvKiBIZWFkZXIgMSAqLwogIGZvbnQtc2l6ZTogMjhweDsKICBjb2xvcjogQmx1ZTsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtCbHVlOwp9CmgzIHsgLyogSGVhZGVyIDMgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwp9CmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1zaXplOiAxMnB4Owp9CnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovCiAgICBmb250LXNpemU6IDE0cHg7Cn0KPC9zdHlsZT4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJtKGxpc3QgPSBscygpKQojIExvYWQgbGlicmFyaWVzCmxpYnJhcnkoInRpZHl2ZXJzZSIsIHdhcm4uY29uZmxpY3RzID0gRikKbGlicmFyeSgiY293cGxvdCIpCmxpYnJhcnkoIm1pbnBhY2subG0iKQpsaWJyYXJ5KCJicm9vbSIpCmxpYnJhcnkoInNpb3AiKQpsaWJyYXJ5KCJrYWJsZUV4dHJhIikKbGlicmFyeSgicGxvdGx5IikKIyBMb2FkIGZ1bmN0aW9ucwpzb3VyY2UoIn4vUi9DT1ZJRC0xOS1tYXN0ZXIvUi9mdW5jdGlvbnMuUiIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgdXBkYXRlIGRhdGEgd2l0aCBzb21lIGNoYXJnZWQgY29sdW1uIG5hbWVzCgpjb3ZpZDE5IDwtIHJlYWRfY3N2KCJ+L1IvQ09WSUQtMTktbWFzdGVyL2RhdGEvQ09WSUQtMTktbWFzdGVyIDIwMjAtMDUtMDcvY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfZGFpbHlfcmVwb3J0cy8wNS0wNy0yMDIwLmNzdiIpCgpzZXR3ZCgifi9SL0NPVklELTE5LW1hc3Rlci9kYXRhL0NPVklELTE5LW1hc3RlciAyMDIwLTA1LTA3L2Nzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzIikKCnRzciA8LSByZWFkX2NzdigidGltZV9zZXJpZXNfY292aWQxOV9yZWNvdmVyZWRfZ2xvYmFsLmNzdiIpCgp0c2MgPC0gcmVhZF9jc3YoInRpbWVfc2VyaWVzX2NvdmlkMTlfY29uZmlybWVkX2dsb2JhbC5jc3YiKQoKdHNkIDwtIHJlYWRfY3N2KCJ0aW1lX3Nlcmllc19jb3ZpZDE5X2RlYXRoc19nbG9iYWwuY3N2IikKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFJ1biB0aWR5X2pvaW5fZnVuIGZ1bmN0aW9uCmNvdmlkMTkgPC0gd3JhbmdsX2NvdmlkMTkoY292aWQxOSkKdHNjIDwtIHdyYW5nbF90c2ModHNjKQp0c2QgPC0gd3JhbmdsX3RzYyh0c2QpCnRzciA8LSB3cmFuZ2xfdHNjKHRzcikKdGlkeV9qb2luIDwtIHRpZHlfam9pbl9mdW4oKQpgYGAKCiMgSW50cm9kdWN0aW9uICAKClRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgc2hvd3MgYW4gYW5hbHlzaXMgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JvbmF2aXJ1cyBwYW5kZW1pYyAoQ292aWQxOSkuCgpUaGUgYW5hbHlzaXMgaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0cywgdGhlIGZpcnN0IGNvbXByaXNlcyBnZW5lcmFsIGdyYXBocyBvZiB0aGUgZGF0YSBhbmQgdGhlbiBhIG51bWVyaWNhbCBzaW11bGF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgbG9naXN0aWMgZ3Jvd3RoIG1vZGVsIChMR00pIGluIG9yZGVyIHRvIGZvcmVjYXN0IHRoZSBwb3NzaWJsZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgYnkgY291bnRyeS4gIAoKVGhlIGRhdGEgdXNlZCBmb3IgdGhpcyBhbmFseXNpcyBhcmUgdXBkYXRlZCBkYWlseSBhbmQgYXJlIHN0b3JlZCBpbiAqKkRhdGEgUmVwb3NpdG9yeSBieSBKb2hucyBIb3BraW5zIENTU0UqKgoKIyBUZXJtcyB1c2VkICAgIAoKIyMjIFJlY292ZXJ5IHJhdGlvIChSUikgICAgIAoKVGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHJlY292ZXJlZCBmcm9tIGEgc3BlY2lmaWVkIGRpc2Vhc2UgYW1vbmcgYWxsIGluZGl2aWR1YWxzIGRpYWdub3NlZCB3aXRoIHRoZSBkaXNlYXNlIG92ZXIgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiAgICAKCiQkUmVjb3ZlcnlSYXRpbyAoUlIpID0gXGZyYWN7UmVjb3ZlcmVkfXtDb25maXJtZWR9JCQgIAoKIyMjIENhc2UgRmF0YWxpdHkgcmF0aW8gKENGUikgICAgCgpDYXNlIGZhdGFsaXR5IHJhdGUsIGFsc28gY2FsbGVkIGNhc2UgZmF0YWxpdHkgcmF0aW8sIGluIGVwaWRlbWlvbG9neSwgdGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyBkaWUgZnJvbSBhIHNwZWNpZmllZCBkaXNlYXNlIGFtb25nIGFsbCBpbmRpdmlkdWFscyBkaWFnbm9zZWQgd2l0aCB0aGUgZGlzZWFzZSBvdmVyIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZS4gIAoKaHR0cHM6Ly93d3cuYnJpdGFubmljYS5jb20vc2NpZW5jZS9jYXNlLWZhdGFsaXR5LXJhdGUKCiQkQ2FzZSBGYXRhbGl0eSBSYXRpbyAoQ0ZSKSA9IFxmcmFje0RlYXRoc317Q29uZmlybWVkfSQkICAKCiMjIyBMb2dpc3RpYyBHcm93dGggTW9kZWwgKExHTSkgICAgICAKCkNsYXJrICgyMDExKSBwcm9wb3NlIGEgbmV3IGVtcGlyaWNhbCBtb2RlbCBiYXNlZCBvbiBsb2dpc3RpYyBncm93dGggbW9kZWxzLiAgCgpBIG5vbmxpbmVhciBtb2RlbCBmb3JtdWxhIGluY2x1ZGluZyB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMuICAKCiQkUHJvamVjdGVkQ2FzZXMgPSBcZnJhY3soSyAqIHQgXiBuKX17KGEgKyB0IF4gbil9JCQgICAgCgpXaGVyZTogIAoKQ2FzZXMgPSBQcm9qZWN0ZWQgQ2FzZSAgIApLID0gQ2FycnlpbmcgY2FwYWNpdHkgIApuID0gSHlwZXJib2xpYyBleHBvbmVudCAgCmEgPSBDb25zdGFudCAgCnQgID0gVGltZSAgCgpUaGUgYmVzdC1maXQgbm9ubGluZWFsIG1vZGVsIGlzIG9idGFpbmVkIGJ5IGFuIGl0ZXJhdGl2ZSBsZWFzdC1zcXVhcmVkIG1ldGhvZC4KClRoZSBsb2dpc3RpYyBncm93dGggbW9kZWwgd2FzIHVzZWQgdG8gcHJvamVjdCB0aGUgcHJvZ3Jlc3Npb24gb2YgdGhlIGRpc2Vhc2UgaW4gY2VydGFpbiBjb3VudHJpZXMuCgpUaGUgbW9zdCByZWxldmFudCByZXN1bHQgb2YgdGhlIG1vZGVsIGNvcnJlc3BvbmRzIHRvIHRoZSAqKnByb2plY3RlZCBjYXNlcyoqLCB0aGlzIHRlcm0gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXNlcyBlc3RpbWF0ZWQgYnkgdGhlIG1vZGVsIGZvciBlYWNoIGNvdW50cnksIHdoZXJlIHRoZSBtb2RlbCBpcyBleGVjdXRlZC4gIAoKIyMjIFByb2plY3RlZCAtIENvbmZpcm1lZCBDYXNlcyBSYXRpbyAgCgpBc3N1bWluZyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgKipwcm9qZWN0ZWQgY2FzZXMqKiBjb3JyZXNwb25kcyB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FzZXMgdGhhdCB3b3VsZCBvY2N1ciBpbiBhIGdpdmVuIGNvdW50cnksIHRoZSBwcm9qZWN0ZWQgLSBjb25maXJtZWQgY2FzZXMgcmF0aW8gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24uCgokJFByb2plY3RlZENvbmZpcm1lZENhc2VzIFJhdGlvID0gMTAwIC0gKDEwMCAqIFxmcmFjeyhtYXgoUHJvamVjdGVkIENhc2UpIC0gbWF4KENvbmZpcm1lZCkpfXsgCiAgICAgICAgICAgICAgICAgIG1heChQcm9qZWN0ZWQgQ2FzZSl9JCQKICAgICAgICAgICAgICAgICAgCiMgR2xvYmFsIENhc2UgIAoKIyMgQXZlcmFnZSBDYXNlcyAoTGFzdCBUaHJlZSBEYXlzKQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQmFyIGdyYXBoIEF2ZXJhZ2UgQ29uZmlybWVkIENhc2VzIChMYXN0IHRocmVlIGRheXMpCmJhcl9ncmFwaCh0aWR5X2pvaW4sIGMzZCwgCiAgICAgICAgICAgICAgICAgICJHbG9iYWwgQ2FzZXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICAiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiYXJfZ3JhcGgodGlkeV9qb2luLCBkM2QsIAogICAgICAgICAgICAgICAgICAiR2xvYmFsIENhc2VzIC0gRGVhdGhzIiwgCiAgICAgICAgICAgICAgICAgICJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIpCmBgYAoKIyMgR2xvYmFsIENhc2UgU3VtbWFyeSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3ZpZDE5CmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X2dyaWRfZ2xvYmFsKHRpZHlfam9pbikKYGBgCgojIyBDb3VudHJ5IENhc2VzCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0aWR5X2pvaW5fZnVuX21heCh0aWR5X2pvaW4pCmBgYAoKIyMgQ2hpbmEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNoaW5hIgpjaGluYSA8LSBjb3VudHJ5X3Jlc3VtZSgiQ2hpbmEiLCBjdXRvZmYgPSA1NDgsIHRyYWNlID0gRiwgdG1heCA9IDk1KQpgYGAKCiMjIEtvcmVhLCBTb3V0aCAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJLb3JlYSwgU291dGgiCnNrIDwtIGNvdW50cnlfcmVzdW1lKCJLb3JlYSwgU291dGgiLCBjdXRvZmYgPSAxNSwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjaGluYSwgc2spCmBgYAoKIyBUaGUgQW1lcmljYXMgIAoKIyMgQ29uZmlybWVkIENhc2UKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJFY3VhZG9yfENoaWxlfFBlcnV8UGFuYW1hfEFyZ2VudGluYXxDb2xvbWJpYXxCcmF6aWx8TWV4aWNvfFZlbmV6dWVsYSIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgY29uZmlybWVkLCAgCiAgICAgICAgICAgICAgICAgICJUaGUgQW1lcmljYXMgLSBDb25maXJtZWQgQ2FzZXMiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIk51bWJlciBvZiBDYXNlcyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQXZlcmFnZSBMYXN0IFRocmVlIERheXMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJFY3VhZG9yfENoaWxlfFBlcnV8UGFuYW1hfEFyZ2VudGluYXxDb2xvbWJpYXxCcmF6aWx8TWV4aWNvfFZlbmV6dWVsYSIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgYzNkLCAgCiAgICAgICAgICAgICAgICAgICJUaGUgQW1lcmljYXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgojIyBDb25maXJtZWQgQ2FzZSAtIENhc2VzIExhc3QgRGF5cwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBhcnJhbmdlKGRlc2MoZGF0ZSkpCmJhcl9ncmFwaChmb28sIGhlYWQoY2FzZXNfYnlfZGF5LCAxKSwgIAogICAgICAgICAgICAgICAgICAiVGhlIEFtZXJpY2FzIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIkNhc2VzIExhc3QgRGF5cyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIE1leGljbyAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTWV4aWNvIgptZXhpY28gPC0gY291bnRyeV9yZXN1bWUoIk1leGljbyIsIGN1dG9mZiA9IDI1MSwgdHJhY2UgPSBGLCB0bWF4ID0gMTgwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBtZXhpY28pCmBgYAoKIyMgTWV4aWNvICYgT3RoZXIgQ291bnRyaWVzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfEtvcmVhLCBTb3V0aHxQZXJ1fEFyZ2VudGluYXxDaGlsZXxDb2xvbWJpYXxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNhc2VzX2J5X2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnksIGFscGhhID0gMC4xNSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNhc2VzX2J5X2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IGxvZyh2YWx1ZSkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAibG9nKE51bWJlciBvZiBDYXNlcykiKQpgYGAKCiMjIERvbWluaWNhbiBSZXB1YmxpYwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkRvbWluaWNhbiBSZXB1YmxpYyIKZHIgPC0gY291bnRyeV9yZXN1bWUoIkRvbWluaWNhbiBSZXB1YmxpYyIsIGN1dG9mZiA9IDUsIAogICAgICAgICAgICAgICAgICAgICB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGRyKQpgYGAKCiMjIFVuaXRlZCBTdGF0ZSAoVVMpCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBodHRwczovL2NvdmlkMTkuaGVhbHRoZGF0YS5vcmcKCiMgaHR0cDovL3d3dy5oZWFsdGhkYXRhLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL2ZpbGVzL3Jlc2VhcmNoX2FydGljbGVzLzIwMjAvY292aWRfcGFwZXJfTUVEUlhJVi0yMDIwLTA0Mzc1MnYxLU11cnJheS5wZGYKCkNvdW50cnkgPC0gIlVTIgp1cyA8LSBjb3VudHJ5X3Jlc3VtZSgiVVMiLCBjdXRvZmYgPSAxNjYzLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHVzKQpgYGAKCiMjIEFyZ2VudGluYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQXJnZW50aW5hIgphcmcgPC0gY291bnRyeV9yZXN1bWUoIkFyZ2VudGluYSIsIGN1dG9mZiA9IDE5LCB0cmFjZSA9IEYsIHRtYXggPSAxMjApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGFyZykKYGBgCgojIyBCcmF6aWwgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkJyYXppbCIKYnJhIDwtIGNvdW50cnlfcmVzdW1lKCJCcmF6aWwiLCBjdXRvZmYgPSAyMDAsIHRyYWNlID0gRiwgdG1heCA9IDE1MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgYnJhKQpgYGAKCiMjIENhbmFkYSAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDYW5hZGEiCmNhbiA8LSBjb3VudHJ5X3Jlc3VtZSgiQ2FuYWRhIiwgY3V0b2ZmID0gODAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY2FuKQpgYGAKCiMjIENvbG9tYmlhIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNvbG9tYmlhIgpjb2wgPC0gY291bnRyeV9yZXN1bWUoIkNvbG9tYmlhIiwgY3V0b2ZmID0gMSwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBjb2wpCmBgYAoKIyMgRWN1YWRvciAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiRWN1YWRvciIKZWN1IDwtIGNvdW50cnlfcmVzdW1lKCJFY3VhZG9yIiwgY3V0b2ZmID0gMSwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBlY3UpCmBgYAoKIyMgQ2hpbGUKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDaGlsZSIKY2hpIDwtIGNvdW50cnlfcmVzdW1lKCJDaGlsZSIsIGN1dG9mZiA9IDEsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY2hpKQpgYGAKCiMjIFBhbmFtYQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlBhbmFtYSIKcGFuIDwtIGNvdW50cnlfcmVzdW1lKCJQYW5hbWEiLCBjdXRvZmYgPSAxMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBwYW4pCmBgYAoKIyMgUGVydSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiUGVydSIKcGVyIDwtIGNvdW50cnlfcmVzdW1lKCJQZXJ1IiwgY3V0b2ZmID0gMzE4LCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHBlcikKYGBgCgojIyBWZW5lenVlbGEgIAoKYGBge3IgZXZhbD1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CkNvdW50cnkgPC0gIlZlbmV6dWVsYSIKdmVuIDwtIGNvdW50cnlfcmVzdW1lKCJWZW5lenVlbGEiLCBjdXRvZmYgPSAyLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHZlbikKYGBgCgojIEV1cm9wZSAgCgojIyBDb25maXJtZWQgQ2FzZSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58RnJhbmNlfEdlcm1hbnl8Tm9yd2F5fFVuaXRlZCBLaW5nZG9tfE5ldGhlcmxhbmRzfFN3aXR6ZXJsYW5kfFBvcnR1Z2FsIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAiRXVyb3BlIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIk51bWJlciBvZiBDYXNlcyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQXZlcmFnZSBMYXN0IFRocmVlIERheXMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJdGFseXxTcGFpbnxGcmFuY2V8R2VybWFueXxOb3J3YXl8VW5pdGVkIEtpbmdkb218TmV0aGVybGFuZHN8U3dpdHplcmxhbmR8UG9ydHVnYWwiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpCmJhcl9ncmFwaChmb28sIGMzZCwgIAogICAgICAgICAgICAgICAgICAiRXVyb3BlIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIkF2ZXJhZ2UgTGFzdCBUaHJlZSBEYXlzIiwgU3lzLkRhdGUoKSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkl0YWx5fFNwYWlufEtvcmVhLCBTb3V0aHxHZXJtYW55fFVuaXRlZCBLaW5nZG9tfEZyYW5jZSIpCnRpdGxlIDwtICJFdXJvcGEiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKGNhc2VzX2J5X2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gdmFsdWUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IGNvdW50cnkpKSArICAgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gVCkgKyAgCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKyAgICAKICB0aGVtZV9taW5pbWFsX2dyaWQoMTMpICsgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gIk51bWJlciBvZiBDYXNlcyIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58S29yZWEsIFNvdXRofEdlcm1hbnl8VW5pdGVkIEtpbmdkb218RnJhbmNlfFN3aXR6ZXJsYW5kfEN6ZWNoaWEiKQp0aXRsZSA8LSAiRXVyb3BlIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgojIyBCZWxnaXVtIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkJlbGdpdW0iCmN6ZSA8LSBjb3VudHJ5X3Jlc3VtZSgiQmVsZ2l1bSIsIGN1dG9mZiA9IDUwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGN6ZSkKYGBgCgojIyBDemVjaGlhICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDemVjaGlhIgpjemUgPC0gY291bnRyeV9yZXN1bWUoIkN6ZWNoaWEiLCBjdXRvZmYgPSAxMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBjemUpCmBgYAoKIyMgR3JlZWNlICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJHcmVlY2UiCmN6ZSA8LSBjb3VudHJ5X3Jlc3VtZSgiR3JlZWNlIiwgY3V0b2ZmID0gMzAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgY3plKQpgYGAKCiMjIEl0YWx5ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJdGFseSIKaXRhIDwtIGNvdW50cnlfcmVzdW1lKCJJdGFseSIsIGN1dG9mZiA9IDEwMCwgdHJhY2UgPSBGLCB0bWF4ID0gODApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGl0YSkKYGBgCgojIyBTcGFpbiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiU3BhaW4iCnNwYSA8LSBjb3VudHJ5X3Jlc3VtZSgiU3BhaW4iLCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgc3BhKQpgYGAKCiMjIFVuaXRlZCBLaW5nZG9tICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJVbml0ZWQgS2luZ2RvbSIKdWsgPC0gY291bnRyeV9yZXN1bWUoIlVuaXRlZCBLaW5nZG9tIiwgY3V0b2ZmID0gMzAwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHVrKQpgYGAKCiMjIEZyYW5jZSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiRnJhbmNlIgpmcmEgPC0gY291bnRyeV9yZXN1bWUoIkZyYW5jZSIsIGN1dG9mZiA9IDEwMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTIwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBmcmEpCmBgYAoKIyMgR2VybWFueSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiR2VybWFueSIKZ2VyIDwtIGNvdW50cnlfcmVzdW1lKCJHZXJtYW55IiwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIGdlcikKYGBgCgojIyBOZXRoZXJsYW5kcwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIk5ldGhlcmxhbmRzIgpuZXQgPC0gY291bnRyeV9yZXN1bWUoIk5ldGhlcmxhbmRzIiwgY3V0b2ZmID0gMjAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgbmV0KQpgYGAKCiMjIFN3aXR6ZXJsYW5kICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJTd2l0emVybGFuZCIKc3dpIDwtIGNvdW50cnlfcmVzdW1lKCJTd2l0emVybGFuZCIsIGN1dG9mZiA9IDUwLCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHN3aSkKYGBgCgojIyBOb3J3YXkgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIk5vcndheSIKbm9yIDwtIGNvdW50cnlfcmVzdW1lKCJOb3J3YXkiLCBjdXRvZmYgPSAxNSwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBub3IpCmBgYAoKIyMgUG9ydHVnYWwgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlBvcnR1Z2FsIgpwb3IgPC0gY291bnRyeV9yZXN1bWUoIlBvcnR1Z2FsIiwgY3V0b2ZmID0gMzUsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgcG9yKQpgYGAKCiMgT3RoZXIgQ291bnRyaWVzCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJKYXBhbnxLb3JlYSwgU291dGh8SXJhbnxSdXNzaWF8SXNyYWVsfEluZGlhfFR1cmtleXxTYXVkaSBBcmFiaWF8UGFraXN0YW4iKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpCmJhcl9ncmFwaChmb28sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICJPdGhlciBDb3VudHJpZXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiTnVtYmVyIG9mIENhc2VzIiwgU3lzLkRhdGUoKSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJcmFufFR1cmtleXxLb3JlYSwgU291dGh8SXNyYWVsfEphcGFufFJ1c3NpYXxTYXVkaSBBcmFiaWEiKQp0aXRsZSA8LSAiT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihjYXNlc19ieV9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImF1dG8iLCBzZSA9IFQpICsgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIklyYW58VHVya2V5fEtvcmVhLCBTb3V0aHxJc3JhZWx8SmFwYW58UnVzc2lhfFNhdWRpIEFyYWJpYSIpCnRpdGxlIDwtICJPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyAtIExvZyBzY2FsZSIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKGNhc2VzX2J5X2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgY29uZmlybWVkKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdAoKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IGxvZyh2YWx1ZSkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gY291bnRyeSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEYpICsKICBmYWNldF9ncmlkKC5+Y291bnRyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEyKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAibG9nKE51bWJlciBvZiBDYXNlcykiKQpgYGAKClRhaXdhbioKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJUYWl3YW4qIgpqYXAgPC0gY291bnRyeV9yZXN1bWUoIlRhaXdhbioiLCBjdXRvZmYgPSAzMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBqYXApCmBgYAoKIyMgSmFwYW4gICAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSmFwYW4iCmphcCA8LSBjb3VudHJ5X3Jlc3VtZSgiSmFwYW4iLCBjdXRvZmYgPSA0MjAsIHRyYWNlID0gRiwgdG1heCA9IDEwMCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgamFwKQpgYGAKCiMjIElyYW4gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIklyYW4iCmlyYSA8LSBjb3VudHJ5X3Jlc3VtZSgiSXJhbiIsIGN1dG9mZiA9IDAsIHRyYWNlID0gRiwgdG1heCA9IDgwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBpcmEpCmBgYAoKIyMgUnVzc2lhICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJSdXNzaWEiCnJ1cyA8LSBjb3VudHJ5X3Jlc3VtZSgiUnVzc2lhIiwgY3V0b2ZmID0gMTk5LCB0cmFjZSA9IEYsIHRtYXggPSAxMDApCmNvdW50cmllc19yZXN1bWUgPC0gZnVsbF9qb2luKGNvdW50cmllc19yZXN1bWUsIHJ1cykKYGBgCgojIyBTaW5nYXBvcmUKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJTaW5nYXBvcmUiCmlzciA8LSBjb3VudHJ5X3Jlc3VtZSgiU2luZ2Fwb3JlIiwgY3V0b2ZmID0gMzg1LCB0cmFjZSA9IEYsIHRtYXggPSA4MCkKY291bnRyaWVzX3Jlc3VtZSA8LSBmdWxsX2pvaW4oY291bnRyaWVzX3Jlc3VtZSwgaXNyKQpgYGAKCiMjIElzcmFlbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSXNyYWVsIgppc3IgPC0gY291bnRyeV9yZXN1bWUoIklzcmFlbCIsIGN1dG9mZiA9IDEyNiwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpjb3VudHJpZXNfcmVzdW1lIDwtIGZ1bGxfam9pbihjb3VudHJpZXNfcmVzdW1lLCBpc3IpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllc19yZXN1bWVbc2FwcGx5KGNvdW50cmllc19yZXN1bWUsIGlzLmluZmluaXRlKV0gPC0gTkEKIyBDb3VudHJpZXMgQW5hbHlzaXMKY291bnRyaWVzX3Jlc3VtZSAlPiUgYXJyYW5nZShjb3VudHJ5KQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgQ291bnRyaWVzIEFuYWx5c2lzCmNvdW50cmllc19yZXN1bWUgJT4lIApzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKQoKZ2dwbG90KGNvdW50cmllc19yZXN1bWUpICsKICBnZW9tX3BvaW50KGFlcyhjYXNlLCBDRlIsIGNvbCA9IGlzQ29udikpICsKICBnZW9tX3Ntb290aChhZXMoY2FzZSwgQ0ZSKSwgbWV0aG9kID0gImF1dG8iLCBzZSA9IFQpICsKICB0aGVtZV9idygpCgpjb3VudHJpZXNfcmVzdW1lICU+JSBmaWx0ZXIoSyA8IDIwMDAwMCkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyhjYXNlLCBLLCBjb2wgPSBpc0NvbnYpKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNhc2UsIEspLCBtZXRob2QgPSAibG0iLCBzZSA9IEYpICsgIAogIHRoZW1lX2J3KCkKCmNvdW50cmllc19yZXN1bWUgJT4lIGZpbHRlcihLIDwgMjAwMDAwKSAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fcG9pbnQoYWVzKGEsIEssIGNvbCA9IGlzQ29udikpICsKICBnZW9tX3Ntb290aChhZXMoYSwgSyksIG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKyAgCiAgdGhlbWVfYncoKQoKY291bnRyaWVzX3Jlc3VtZSAlPiUgZmlsdGVyKEsgPCAyMDAwMDApICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXMoQUlDLCBCSUMsIGNvbCA9IGlzQ29udikpICsKICB0aGVtZV9idygpCgpjb3VudHJpZXNfcmVzdW1lICU+JSAKICBmaWx0ZXIoSyA8IDIwMDAwMCAmIHNpZ21hIDwgNTAwKSAlPiUgCiAgc2VsZWN0KGNvdW50cnksIHByb2csIHNpZ21hKSAlPiUKICBwbG90X2x5KHggPSB+cHJvZywgeSA9IH5zaWdtYSwgY29sb3IgPSB+Y291bnRyeSkKCmNvdW50cmllc19yZXN1bWUgJT4lIAogIHNlbGVjdChjb3VudHJ5LCBkYXlzLCBjYXNlKSAlPiUKICBwbG90X2x5KHggPSB+ZGF5cywgeSA9IH5jYXNlLCBjb2xvciA9IH5jb3VudHJ5KQoKY291bnRyaWVzX3Jlc3VtZSAlPiUgCiAgc2VsZWN0KGNvdW50cnksIGRlYXRoLCBjYXNlKSAlPiUKICBwbG90X2x5KHggPSB+Y2FzZSwgeSA9IH5kZWF0aCwgY29sb3IgPSB+Y291bnRyeSkKCiMgQmFyIGdyYXBoIEF2ZXJhZ2UgQ29uZmlybWVkIENhc2VzIChMYXN0IHRocmVlIGRheXMpCmZvbyA8LSB0aWR5X2pvaW5fZnVuX21heCh0aWR5X2pvaW4pICU+JQogIGZpbHRlcihjb25maXJtZWQgPiAyMDAwKSAlPiUKICBhcnJhbmdlKGRlc2MoQ0ZSKSkgJT4lICAKICBnZ3Bsb3QoYWVzKHggPSBhc19mYWN0b3IoY291bnRyeSksIHkgPSBDRlIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIGZpbGwgPSAibGlnaHRibHVlIiwgCiAgICAgICAgICAgYWxwaGEgPSAwLjYpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKENGUiwgMSkpLCAKICAgICAgICAgICAgaGp1c3QgPSAicmlndGgiLAogICAgICAgICAgICBzaXplID0gNC41LAogICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKwogIGxhYnModGl0bGUgPSAiQ2FzZSBGYXRhbGl0eSBSYXRpbyIsCiAgICAgICBzdWJ0aXRsZSA9ICJDb3VudHJpZXMgd2l0aCBtb3JlIHRoYW4gMjAwMCBjb25maXJtZWQgY2FzZXMiLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICIiLCB5ID0gIiIpICsKICBjb29yZF9mbGlwKCkgKyB0aGVtZV9taW5pbWFsX2dyaWQoMTIpIApmb28KYGBgCgojIFJlZmVyZW5jZXMgIAoKU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQgIAoKQ2xhcmssIEEuSi4gKDIwMTEpLiAiRGVjbGluZSBDdXJ2ZSBBbmFseXNpcyBpbiBVbmNvbnZlbnRpb25hbCBSZXNvdXJjZSBQbGF5cwogICAgVXNpbmcgTG9naXN0aWMgR3Jvd3RoIE1vZGVscy4iIE0uUy4gCiAgICBUaGVzaXMsIFRoZSBVbml2ZXJzaXR5IG9mIFRleGFzIGF0IEF1c3RpbiwgQXVndXN0IDIwMTEuIAoK