Burgernomics: The Big Mac 🍔 Index for G20 compared to the US Dollar1
Measuring the purchasing power parity (PPP) between two currencies2
Country Currency (Abbr)4 🏷️ Latest Price3 💵 USD under/over ⏱️ Historical Data
Local5 Dollar6 Raw7 Adjusted8 2000 → 2011 → 2020
Raw7
2011 → 2020
Adjusted8
Switzerland Franc (CHF) SFr.6.50 $6.91 20.9% 4.3%
United States Dollar (USD) $5.711 $5.711 0.0% 0.0%
Canada Dollar (CAD) $6.88 $5.08 −11.1% 2.3%
Euro area Euro (EUR) €4.21 $4.79 −16.2% 2.0%
Australia Dollar (AUD) $6.55 $4.58 −19.8% −15.5%
Brazil Real (BRL) R$20.90 $3.91 −31.5% 19.1%
South Korea Won (KRW) ₩4,500 $3.75 −34.4% −14.5%
Saudi Arabia Riyal (SAR) SR14.00 $3.73 −34.6% −5.3%
Japan Yen (JPY) ¥390 $3.64 −36.3% −21.8%
Argentina Peso (ARS) $250.00 $3.51 −38.5% 3.0%
China Renminbi (CNY) ¥21.70 $3.10 −45.7% −6.5%
India Rupee (INR) ₹190.00 $2.53 −55.8% −15.1%
Indonesia Rupiah (IDR) Rp34,000.00 $2.36 −58.8% −23.0%
Mexico Peso (MXN) Mex$50.00 $2.23 −61.0% −33.0%
Turkey Lira (TRY) ₺13.99 $2.04 −64.3% −38.3%
Russia Ruble (RUB) ₽135.00 $1.91 −66.5% −43.6%
South Africa Rand (ZAR) R31.00 $1.86 −67.4% −41.3%
Source: The Economist: The Big Mac Index introduced in 1986 as a semi-humorous illustration of PPP and has been published since then.
The Economist Big Mac index
Data and methodology
R Session Information

- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.0.2 (2020-06-22)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  English_United States.1252  
 ctype    English_United States.1252  
 tz       America/Los_Angeles         
 date     2020-10-28                  

- Packages -------------------------------------------------------------------
 package     * version date       lib source                              
 assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.0.2)                      
 backports     1.1.10  2020-09-15 [1] CRAN (R 4.0.2)                      
 blob          1.2.1   2020-01-20 [1] CRAN (R 4.0.2)                      
 broom         0.7.1   2020-10-02 [1] CRAN (R 4.0.2)                      
 callr         3.5.1   2020-10-13 [1] CRAN (R 4.0.2)                      
 cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.0.2)                      
 checkmate     2.0.0   2020-02-06 [1] CRAN (R 4.0.2)                      
 cli           2.1.0   2020-10-12 [1] CRAN (R 4.0.2)                      
 clipr         0.7.1   2020-10-08 [1] CRAN (R 4.0.2)                      
 colorspace    1.4-1   2019-03-18 [1] CRAN (R 4.0.2)                      
 countrycode * 1.2.0   2020-05-22 [1] CRAN (R 4.0.2)                      
 crayon        1.3.4   2017-09-16 [1] CRAN (R 4.0.2)                      
 curl          4.3     2019-12-02 [1] CRAN (R 4.0.2)                      
 data.table    1.13.0  2020-07-24 [1] CRAN (R 4.0.2)                      
 DBI           1.1.0   2019-12-15 [1] CRAN (R 4.0.2)                      
 dbplyr        1.4.4   2020-05-27 [1] CRAN (R 4.0.2)                      
 desc          1.2.0   2018-05-01 [1] CRAN (R 4.0.2)                      
 details       0.2.1   2020-01-12 [1] CRAN (R 4.0.2)                      
 devtools      2.3.2   2020-09-18 [1] CRAN (R 4.0.2)                      
 digest        0.6.25  2020-02-23 [1] CRAN (R 4.0.2)                      
 dplyr       * 1.0.2   2020-08-18 [1] CRAN (R 4.0.2)                      
 echarts4r   * 0.3.3   2020-09-30 [1] Github (JohnCoene/echarts4r@bd45d50)
 ellipsis      0.3.1   2020-05-15 [1] CRAN (R 4.0.2)                      
 evaluate      0.14    2019-05-28 [1] CRAN (R 4.0.2)                      
 fansi         0.4.1   2020-01-08 [1] CRAN (R 4.0.2)                      
 farver        2.0.3   2020-01-16 [1] CRAN (R 4.0.2)                      
 fastmap       1.0.1   2019-10-08 [1] CRAN (R 4.0.2)                      
 forcats     * 0.5.0   2020-03-01 [1] CRAN (R 4.0.2)                      
 foreign       0.8-80  2020-05-24 [1] CRAN (R 4.0.2)                      
 fs            1.5.0   2020-07-31 [1] CRAN (R 4.0.2)                      
 generics      0.0.2   2018-11-29 [1] CRAN (R 4.0.2)                      
 ggplot2     * 3.3.2   2020-06-19 [1] CRAN (R 4.0.2)                      
 glue          1.4.2   2020-08-27 [1] CRAN (R 4.0.2)                      
 gt          * 0.2.2   2020-10-09 [1] Github (rstudio/gt@6a791b5)         
 gtable        0.3.0   2019-03-25 [1] CRAN (R 4.0.2)                      
 haven         2.3.1   2020-06-01 [1] CRAN (R 4.0.2)                      
 hms           0.5.3   2020-01-08 [1] CRAN (R 4.0.2)                      
 htmltools   * 0.5.0   2020-06-16 [1] CRAN (R 4.0.2)                      
 htmlwidgets   1.5.2   2020-10-03 [1] CRAN (R 4.0.2)                      
 httpuv        1.5.4   2020-06-06 [1] CRAN (R 4.0.2)                      
 httr          1.4.2   2020-07-20 [1] CRAN (R 4.0.2)                      
 jsonlite      1.7.1   2020-09-07 [1] CRAN (R 4.0.2)                      
 knitr         1.30    2020-09-22 [1] CRAN (R 4.0.2)                      
 later         1.1.0.1 2020-06-05 [1] CRAN (R 4.0.2)                      
 lifecycle     0.2.0   2020-03-06 [1] CRAN (R 4.0.2)                      
 lubridate   * 1.7.9   2020-06-08 [1] CRAN (R 4.0.2)                      
 magrittr      1.5     2014-11-22 [1] CRAN (R 4.0.2)                      
 memoise       1.1.0   2017-04-21 [1] CRAN (R 4.0.2)                      
 mime          0.9     2020-02-04 [1] CRAN (R 4.0.0)                      
 modelr        0.1.8   2020-05-19 [1] CRAN (R 4.0.2)                      
 munsell       0.5.0   2018-06-12 [1] CRAN (R 4.0.2)                      
 openxlsx      4.2.2   2020-09-17 [1] CRAN (R 4.0.2)                      
 pillar        1.4.6   2020-07-10 [1] CRAN (R 4.0.2)                      
 pkgbuild      1.1.0   2020-07-13 [1] CRAN (R 4.0.2)                      
 pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.0.2)                      
 pkgload       1.1.0   2020-05-29 [1] CRAN (R 4.0.2)                      
 png           0.1-7   2013-12-03 [1] CRAN (R 4.0.0)                      
 prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.0.2)                      
 processx      3.4.4   2020-09-03 [1] CRAN (R 4.0.2)                      
 promises      1.1.1   2020-06-09 [1] CRAN (R 4.0.2)                      
 ps            1.4.0   2020-10-07 [1] CRAN (R 4.0.2)                      
 purrr       * 0.3.4   2020-04-17 [1] CRAN (R 4.0.2)                      
 R6            2.4.1   2019-11-12 [1] CRAN (R 4.0.2)                      
 Rcpp          1.0.5   2020-07-06 [1] CRAN (R 4.0.2)                      
 readr       * 1.4.0   2020-10-05 [1] CRAN (R 4.0.2)                      
 readxl        1.3.1   2019-03-13 [1] CRAN (R 4.0.2)                      
 remotes       2.2.0   2020-07-21 [1] CRAN (R 4.0.2)                      
 reprex        0.3.0   2019-05-16 [1] CRAN (R 4.0.2)                      
 rio         * 0.5.16  2018-11-26 [1] CRAN (R 4.0.2)                      
 rlang         0.4.8   2020-10-08 [1] CRAN (R 4.0.2)                      
 rmarkdown     2.4     2020-09-30 [1] CRAN (R 4.0.2)                      
 rprojroot     1.3-2   2018-01-03 [1] CRAN (R 4.0.2)                      
 rstudioapi    0.11    2020-02-07 [1] CRAN (R 4.0.2)                      
 rvest         0.3.6   2020-07-25 [1] CRAN (R 4.0.2)                      
 scales        1.1.1   2020-05-11 [1] CRAN (R 4.0.2)                      
 selectr       0.4-2   2019-11-20 [1] CRAN (R 4.0.2)                      
 sessioninfo   1.1.1   2018-11-05 [1] CRAN (R 4.0.2)                      
 shiny         1.5.0   2020-06-23 [1] CRAN (R 4.0.2)                      
 stringi       1.5.3   2020-09-09 [1] CRAN (R 4.0.2)                      
 stringr     * 1.4.0   2019-02-10 [1] CRAN (R 4.0.2)                      
 testthat      2.3.2   2020-03-02 [1] CRAN (R 4.0.2)                      
 tibble      * 3.0.4   2020-10-12 [1] CRAN (R 4.0.2)                      
 tidyr       * 1.1.2   2020-08-27 [1] CRAN (R 4.0.2)                      
 tidyselect    1.1.0   2020-05-11 [1] CRAN (R 4.0.2)                      
 tidyverse   * 1.3.0   2019-11-21 [1] CRAN (R 4.0.2)                      
 usethis       1.6.3   2020-09-17 [1] CRAN (R 4.0.2)                      
 vctrs         0.3.4   2020-08-29 [1] CRAN (R 4.0.2)                      
 withr         2.3.0   2020-09-22 [1] CRAN (R 4.0.2)                      
 xfun          0.18    2020-09-29 [1] CRAN (R 4.0.2)                      
 xml2        * 1.3.2   2020-04-23 [1] CRAN (R 4.0.2)                      
 xtable        1.8-4   2019-04-21 [1] CRAN (R 4.0.2)                      
 yaml          2.2.1   2020-02-01 [1] CRAN (R 4.0.0)                      
 zip           2.1.1   2020-08-27 [1] CRAN (R 4.0.2)                      

[1] C:/R/R-4.0.2/library


1 Base Currency

2 The index is based on the theory of PPP, the notion that in the long run exchange rates should move towards the rate that would equalise the prices of an identical basket of goods and services (in this case, a burger) in any two countries.

3 Data as of 2020-07-01

4 ABBR: Three-character ISO 4217 currency code

5 Price of a Big Mac in the local currency

6 Price of a Big Mac in dollars
                                
$0-1   1-2   2-3   3-4   4-5   5-6   6-7   7-8   8-9   9-10 

7 Raw Index: % cost difference than in the US

8 GDP Adjusted Index: % cost difference than in the US based on differences in GDP between the two countries

LS0tDQp0aXRsZTogICAiPGg0PiA8YSBocmVmPSdodHRwczovL2Jsb2cucnN0dWRpby5jb20vMjAyMC8wOS8xNS9hbm5vdW5jaW5nLXRoZS0yMDIwLXJzdHVkaW8tdGFibGUtY29udGVzdC8nPiAyMDIwIFJTdHVkaW8gVGFibGUgQ29udGVzdCBTdWJtaXNzaW9uIDwvYT4gYnkgQS4gQ2FsYXRyb25pLCBTLiBMdXNzaWVyICYgUi4gS3JvdXNlIDxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9hZ3N0bi9SU3R1ZGlvX3RhYmxlX2NvbnRlc3RfMjAyMCc+IDxpIGNsYXNzPSdmYSBmYS1naXRodWInPjwvaT4gUmVwbyA8L2E+Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHNlbGZfY29udGFpbmRlZDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogbm9uZSAjIG5vbmUgaGlkZSBzaG93DQogICAgdG9jOiBmYWxzZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjb21tZW50ID0gTkEsIGluY2x1ZGUgPSBGQUxTRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChjYWNoZSA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkobHVicmlkYXRlKQ0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInJzdHVkaW8vZ3QiKQ0KbGlicmFyeShndCkNCmxpYnJhcnkoY291bnRyeWNvZGUpDQpsaWJyYXJ5KGVjaGFydHM0cikNCmxpYnJhcnkoaHRtbHRvb2xzKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoaHR0cikNCmBgYA0KDQpgYGB7cn0NCmJtXzEgPC0gaW1wb3J0KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVGhlRWNvbm9taXN0L2JpZy1tYWMtZGF0YS9tYXN0ZXIvb3V0cHV0LWRhdGEvYmlnLW1hYy1mdWxsLWluZGV4LmNzdiIpICU+JQ0KICAgc2VsZWN0KC1zdGFydHNfd2l0aChjKCJHQlAiLCJKUFkiLCJDTlkiKSkpICU+JSANCiAgIG11dGF0ZShpc29fYTIgICAgPSBjb3VudHJ5Y29kZShpc29fYTMgLCBvcmlnaW4gPSAnaXNvM2MnLCBkZXN0aW5hdGlvbiA9ICdpc28yYycsIHdhcm4gPSBGQUxTRSksDQogICAgICAgICAgaXNvX2EyICAgID0gc3RyX3RvX2xvd2VyKGlzb19hMiksDQogICAgICAgICAgaXNvX2EyICAgID0gaWZlbHNlKGlzLm5hKGlzb19hMiksICJldXJvcGVhbl91bmlvbiIsIGlzb19hMiksDQogICAgICAgICAgaXNvX2ZsICAgID0gc3RyX2dsdWUoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9IYXRTY3JpcHRzL2NpcmNsZS1mbGFncy9tYXN0ZXIvZmxhZ3Mve2lzb19hMn0uc3ZnIikpICU+JSANCiAgIGdyb3VwX2J5KGlzb19hMywgaXNvX2EyLCBuYW1lLCBjdXJyZW5jeV9jb2RlLCBpc29fZmwpICU+JSANCiAgIG5lc3RfYnkoKQ0KDQp4X2N1cnJlbmNpZXMgICAgICAgPC0gaW1wb3J0KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcnN0dWRpby9ndC9tYXN0ZXIvZGF0YS1yYXcveF9jdXJyZW5jaWVzLmNzdiIpICU+JSANCiAgIHJlbmFtZShjdXJyZW5jeV9jb2RlID0gY3Vycl9jb2RlICkgJT4lIA0KICAgbXV0YXRlKGN1cnJfbmFtZSA9IHdvcmQoY3Vycl9uYW1lLC0xKSAlPiUgc3RyX3RvX3RpdGxlKCkpDQoNCmJtXzEgPC0gbGVmdF9qb2luKGJtXzEsDQogICAgICAgICAgICAgICAgICB4X2N1cnJlbmNpZXMsDQogICAgICAgICAgICAgICAgICBieSA9ICJjdXJyZW5jeV9jb2RlIikNCmBgYA0KDQpgYGB7cn0NCiMgRzIwIEdyb3VwIG9mIGNvdW50cmllcw0KIyAyMDIwOiBBcmdlbnRpbmEsIEF1c3RyYWxpYSwgQnJhemlsLCBDYW5hZGEsIENoaW5hLCBGcmFuY2UsIEdlcm1hbnksIEl0YWx5LCBJbmRpYSwgSW5kb25lc2lhLEphcGFuLCBSZXB1YmxpYyBvZiBLb3JlYSwgDQojICAgICAgIE1leGljbywgUnVzc2lhLCBTYXVkaSBBcmFiaWEsIFNvdXRoIEFmcmljYSwgVHVya2V5LCBVbml0ZWQgS2luZ2RvbSwgVW5pdGVkIFN0YXRlcyBFdXJvcGVhbiBVbmlvbg0KIyArIFN3aXR6ZXJsYW5kDQoNCmJtX2cyMCA8LSBibV8xICU+JSANCiAgIGZpbHRlcihpc29fYTMgJWluJSBjKCJBUkciLCJBVVMiLCJCUkEiLCJDQU4iLCJDSE4iLCJFVVoiLCJJTkQiLCJJRE4iLCJKUE4iLCJLT1IiLCJNRVgiLCJSVVMiLCJTQVUiLCJaQUYiLCJUVVIiLCJVU0EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkNIRSIpKSAlPiUNCiAgIG11dGF0ZSggbmFtZV9tYXAgPSBuYW1lLA0KICAgICAgICAgICBuYW1lX21hcCA9IGNhc2Vfd2hlbihuYW1lX21hcCA9PSAiRXVybyBhcmVhIiB+ICJFdXJvcGUtRVUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX21hcCA9PSAiUnVzc2lhIiAgICB+ICJSdXNzaWFuIEZlZGVyYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX21hcCA9PSAiQ2hpbmEiICAgICB+ICJQZW9wbGUnc19SZXB1YmxpY19vZl9DaGluYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBhcy5jaGFyYWN0ZXIobmFtZV9tYXApDQogICAgICAgICAgICkpICU+JSANCiAgIG11dGF0ZShsYXN0ID0gbGlzdCggZGF0YSAlPiUgc2xpY2UobigpKSkgKSAlPiUNCiAgIG11dGF0ZSggbWFwID0gbGlzdCgNCiAgICAgIGdsdWU6OmdsdWUoImh0dHBzOi8vY29tbW9ucy53aWtpbWVkaWEub3JnL3dpa2kvRmlsZTp7c3RyX3JlcGxhY2VfYWxsKG5hbWVfbWFwLCcgJywgJ18nKX1fKG9ydGhvZ3JhcGhpY19wcm9qZWN0aW9uKS5zdmciKSAlPiUNCiAgICAgICAgIHJlYWRfaHRtbCgpICU+JQ0KICAgICAgICAgaHRtbF9ub2RlcygiaW1nIikgJT4lDQogICAgICAgICBodG1sX2F0dHIoInNyYyIpICU+JQ0KICAgICAgICAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICAgICAgICAgdHJhbnNmb3JtKGAuYCA9IGFzLmNoYXJhY3RlcihgLmApKSAlPiUNCiAgICAgICAgIGZpbHRlcihncmVwbCgib3J0aG9ncmFwaGljIiwgLiwgcGVybD1UUlVFKSkgJT4lDQogICAgICAgICBzbGljZSgxKSAlPiUNCiAgICAgICAgIHB1bGwoKQ0KICAgKQ0KICAgKSAlPiUNCiAgIHVubmVzdChsYXN0KSAlPiUgDQogICB1bmdyb3VwKCkgJT4lIA0KICAgYXJyYW5nZShkZXNjKFVTRF9yYXcpKSANCmBgYA0KDQpgYGB7cn0NCmNoYXJ0IDwtIGZ1bmN0aW9uKGRhdGEgPSBkYXRhLCB2YXJpYWJsZSA9IHZhcmlhYmxlLCBuYW1lID0gbmFtZSwNCiAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQsIGVuZCA9IGVuZCwNCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgsIGhlaWdodCA9IGhlaWdodCl7DQogICANCiAgIGQgPC0gZGF0YSAlPiUgDQogICAgICBzZWxlY3QoZGF0ZSwgdmFyID0gdmFyaWFibGUpICU+JSANCiAgICAgIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlKSkgJT4lIA0KICAgICAgZHJvcF9uYSh2YXIpDQogICANCiAgIG0gPC0gbWVhbihkICU+JSBwdWxsKHZhcikpDQogICANCiAgIGUgPC0gZCAlPiUgDQogICAgICBlX2NoYXJ0cyh4ID0gZGF0ZSwNCiAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgsDQogICAgICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHQNCiAgICAgICkgJT4lIA0KICAgICAgZV9iYXIodmFyLA0KICAgICAgICAgICAgbmFtZSA9IG5hbWUsDQogICAgICAgICAgICBiYXJXaWR0aCA9ICI3NSUiKSAlPiUNCiAgICAgIGVfbGVnZW5kKHNob3cgPSBGQUxTRSkgJT4lDQogICAgICBlX3lfYXhpcyhzaG93ID0gRkFMU0UsDQogICAgICAgICAgICAgICBtYXggID0gMS4wLA0KICAgICAgICAgICAgICAgbWluID0gLTEuMCkgJT4lDQogICAgICBlX3hfYXhpcyhzaG93ID0gRkFMU0UsDQogICAgICAgICAgICAgICBtaW4gPSBzdGFydCwNCiAgICAgICAgICAgICAgIG1heCA9IGVuZCkgJT4lDQogICAgICBlX2F4aXNfcG9pbnRlcihsYWJlbCA9IGxpc3Qoc2hvdyA9IEZBTFNFKSkgJT4lIA0KICAgICAgZV92aXN1YWxfbWFwKA0KICAgICAgICAgdHlwZSA9ICJwaWVjZXdpc2UiLA0KICAgICAgICAgcGllY2VzID0gbGlzdChsaXN0KGd0ID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMDU3MUIwIiksDQogICAgICAgICAgICAgICAgICAgICAgIGxpc3QobHRlID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjQ0EwMDIwIikNCiAgICAgICAgICksDQogICAgICAgICBzaG93ID0gRkFMU0UsDQogICAgICApIA0KICAgDQogICBpZiAoIGFicyhtKT4wICYmIG5yb3coZCk+MCApIHsNCiAgICAgIGUgPC0gZSAlPiUgDQogICAgICAgICBlX21hcmtfbGluZShkYXRhID0gbGlzdCh5QXhpcyA9IDApLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnJywNCiAgICAgICAgICAgICAgICAgICAgIHNpbGVudCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICBzeW1ib2wgPSAnbm9uZScsDQogICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGlzdChzaG93ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0aW9uID0gJ2VuZCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAwKSwNCiAgICAgICAgICAgICAgICAgICAgIGxpbmVTdHlsZSA9IGxpc3QoY29sb3IgPSAnI2JmYmZiZicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnc29saWQnKQ0KICAgICAgICAgKSAlPiUNCiAgICAgICAgIGVfbWFya19hcmVhKGRhdGEgPSBsaXN0KA0KICAgICAgICAgICAgbGlzdCh4QXhpcyA9ICcyMDExLTA2LTAxJywgeUF4aXMgPSAtMS4wKSwNCiAgICAgICAgICAgIGxpc3QoeEF4aXMgPSAnMjAyMC0wOC0wMScsIHlBeGlzID0gIDEuMCkpLA0KICAgICAgICAgICAgaXRlbVN0eWxlID0gbGlzdChjb2xvciA9ICcjZjJmMmYyJykpICU+JQ0KICAgICAgICAgZV90b29sdGlwKCB0cmlnZ2VyID0gImF4aXMiLA0KICAgICAgICAgICAgICAgICAgICBheGlzUG9pbnRlciA9IGxpc3QodHlwZSA9ICdzaGFkb3cnKSwNCiAgICAgICAgICAgICAgICAgICAgY29uZmluZSA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGVfdG9vbHRpcF9wb2ludGVyX2Zvcm1hdHRlcigicGVyY2VudCIsIGRpZ2l0cyA9IDEpLA0KICAgICAgICAgICAgICAgICAgICB0ZXh0U3R5bGUgPSBsaXN0KGZvbnRTaXplID0gMTApLA0KICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMikNCiAgIH0NCiAgIGUNCn0NCmBgYA0KDQpgYGB7cn0NCmJtX2cyMCA8LSBibV9nMjAgJT4lIA0KICAgcm93d2lzZSgpICU+JSANCiAgIG11dGF0ZShlcmF3ID0gbGlzdChjaGFydChkYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlID0gIlVTRF9yYXciLCBuYW1lID0gIlJhdyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gJzIwMDAtMDMtMDEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAgID0gJzIwMjAtMDgtMDEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMTUwLCBoZWlnaHQgPSA1MCkpLA0KICAgICAgICAgIGVhZGogPSBsaXN0KGNoYXJ0KGRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgPSAiVVNEX2FkanVzdGVkIiwgbmFtZSA9ICJBZGoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9ICcyMDExLTA2LTAxJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgICA9ICcyMDIwLTA4LTAxJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDc1LCBoZWlnaHQgPSA1MCkpDQogICApICU+JSANCiAgIG11dGF0ZShlcmF3X2h0bWwgPSBsaXN0KCBlcmF3ICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLnRhZ3MoKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sdG9vbHM6OkhUTUwoKSApLA0KICAgICAgICAgIGVhZGpfaHRtbCA9IGxpc3QoIGVhZGogJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMudGFncygpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcigpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWx0b29sczo6SFRNTCgpICkNCiAgICkNCmBgYA0KDQoNCmBgYHtyfQ0KZGV0YWNoKCJwYWNrYWdlOnJ2ZXN0IiwgdW5sb2FkID0gVFJVRSkNCmRldGFjaCgicGFja2FnZTpodHRyIiwgIHVubG9hZCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQpjaGFydChkYXRhID0gYm1fZzIwICU+JSBmaWx0ZXIoaXNvX2EzID09ICJBUkciKSAlPiUgc2VsZWN0KGRhdGEpICU+JSB1bm5lc3QoKSwNCiAgICAgIHZhcmlhYmxlID0gIlVTRF9yYXciLCBuYW1lID0gIlJhdyIsIA0KICAgICAgc3RhcnQgPSAnMjAwMC0wMS0wMScsDQogICAgICBlbmQgICA9ICcyMDIxLTAxLTAxJywNCiAgICAgIHdpZHRoID0gMTUwLCBoZWlnaHQgPSA1MCkNCmBgYA0KDQpgYGB7ciBpbmNsdWRlID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KdGFiXzAgPC0gYm1fZzIwICU+JQ0KICAgc2VsZWN0KGlzb19mbCwgbWFwLCBuYW1lLCBpc29fYTMsDQogICAgICAgICAgY3VycmVuY3lfY29kZSwgY3Vycl9uYW1lLCBzeW1ib2wsDQogICAgICAgICAgZGF0ZSwgbG9jYWxfcHJpY2UsIGRvbGxhcl9wcmljZSwgDQogICAgICAgICAgVVNEX3JhdywgVVNEX2FkanVzdGVkLCBlcmF3X2h0bWwsIGVhZGpfaHRtbCkgJT4lDQogICBndCgpICU+JSANCiAgICMgYWRkIGNvdW50cnkgaHlwZXJsaW5rDQogICB0ZXh0X3RyYW5zZm9ybSgNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoDQogICAgICAgICBjb2x1bW5zID0gdmFycyhuYW1lKQ0KICAgICAgKSwNCiAgICAgIGZuID0gZnVuY3Rpb24oeCkgew0KICAgICAgICAgZ2x1ZTo6Z2x1ZSgiPGEgaHJlZj0naHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kve3N0cl9yZXBsYWNlX2FsbCh4LCcgJywgJ18nKX0nPnt4fTwvYT4iKQ0KICAgICAgfQ0KICAgKSAlPiUNCiAgICMgYWRkIGZsYWdzDQogICB0ZXh0X3RyYW5zZm9ybSgNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoDQogICAgICAgICBjb2x1bW5zID0gdmFycyhpc29fZmwpDQogICAgICApLA0KICAgICAgZm4gPSBmdW5jdGlvbih4KSB7d2ViX2ltYWdlKHVybCA9IHgsIGhlaWdodCA9IDMwKX0NCiAgICkgJT4lIA0KICAgIyBhZGQgbWFwcw0KICAgdGV4dF90cmFuc2Zvcm0oDQogICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KA0KICAgICAgICAgY29sdW1ucyA9IHZhcnMobWFwKQ0KICAgICAgKSwNCiAgICAgIGZuID0gZnVuY3Rpb24oeCkge3dlYl9pbWFnZSh1cmwgPSB4LCBoZWlnaHQgPSA1MCl9DQogICApICU+JSANCiAgICMgbWVyZ2UgY3VycmVuY3kgbmFtZSAmIGNvZGUNCiAgIGNvbHNfbWVyZ2UoY29sdW1ucyA9IHZhcnMoY3Vycl9uYW1lLCBjdXJyZW5jeV9jb2RlKSwNCiAgICAgICAgICAgICAgcGF0dGVybiA9IGh0bWwoInsxfSAoPHNtYWxsPnsyfTwvc21hbGw+KSIpICkgDQoNCiMgbWVyZ2UgY3VycmVuY2llcyB0byBsb2NhbCBwcmljZQ0KZm9yIChpIGluIHNlcShucm93KGJtX2cyMCkpKSB7DQogICB0YWJfMCA8LSB0YWJfMCAlPiUgDQogICAgICBmbXRfY3VycmVuY3koY29sdW1ucyA9IHZhcnMobG9jYWxfcHJpY2UpLCANCiAgICAgICAgICAgICAgICAgICByb3dzID0gaSwgDQogICAgICAgICAgICAgICAgICAgY3VycmVuY3kgID0gYm1fZzIwW1tpLCAiY3VycmVuY3lfY29kZSJdXSkNCn0NCg0KdGFiXzEgPC0gdGFiXzAgJT4lIA0KICAgIyByZW1vdmUgdW51c2VkIHZhcmlhYmxlcw0KICAgY29sc19oaWRlKGNvbHVtbnMgPSB2YXJzKGlzb19hMywgc3ltYm9sLCBkYXRlKSkgJT4lIA0KICAgIyByZW5hbWUgdmFyaWFibGVzDQogICBjb2xzX2xhYmVsKCBpc29fZmwgPSAnICcsDQogICAgICAgICAgICAgICBtYXAgICAgPSAnICcsDQogICAgICAgICAgICAgICBuYW1lICAgPSAnQ291bnRyeScsDQogICAgICAgICAgICAgICBjdXJyX25hbWUgPSBodG1sKCdDdXJyZW5jeSA8c21hbGw+KEFiYnIpPC9zbWFsbD4nKSwNCiAgICAgICAgICAgICAgIGRhdGUgPSBodG1sKCdEYXRlIDxzbWFsbD4oeXktbW0pPC9zbWFsbD4nKSwNCiAgICAgICAgICAgICAgIGVyYXdfaHRtbCA9IGh0bWwoIjxzbWFsbD4yMDAwICYjODU5NDsgPGZvbnQgc3R5bGU9J2NvbG9yOiAjYmZiZmJmJz4gMjAxMSAmIzg1OTQ7IDIwMjA8L3NtYWxsPjwvZm9udD4gPGJyPiBSYXciKSwgDQogICAgICAgICAgICAgICBlYWRqX2h0bWwgPSBodG1sKCI8c21hbGw+PGZvbnQgc3R5bGU9J2NvbG9yOiAjYmZiZmJmJz4yMDExICYjODU5NDsgMjAyMDwvc21hbGw+PC9mb250PiA8YnI+IEFkanVzdGVkIikNCiAgICkgJT4lIA0KICAgIyBhbGlnbiBkYXRhDQogICBjb2xzX2FsaWduKGFsaWduID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICBjb2x1bW5zID0gdmFycyhtYXAsIGxvY2FsX3ByaWNlLCBkb2xsYXJfcHJpY2UsIFVTRF9yYXcsIFVTRF9hZGp1c3RlZCkpICU+JQ0KICAgY29sc19hbGlnbihhbGlnbiA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgY29sdW1ucyA9IHZhcnMobmFtZSwgY3Vycl9uYW1lKSkgJT4lIA0KICAgIyBhbGlnbiBjb2x1bW5zIGxhYmVscw0KICAgdGFiX3N0eWxlKA0KICAgICAgc3R5bGUgPSBsaXN0KA0KICAgICAgICAgY2VsbF90ZXh0KGFsaWduID0gImxlZnQiKQ0KICAgICAgKSwNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHMoDQogICAgICAgICBjb2x1bW5zID0gdmFycyhuYW1lLCBjdXJyX25hbWUpDQogICAgICApDQogICApICU+JSANCiAgICMgbWFrZSBtYXAgc3F1YXJlIGNlbGwNCiAgIGNvbHNfd2lkdGgoDQogICAgICB2YXJzKG1hcCkgfiBweCg2MCkNCiAgICkgJT4lIA0KICAgIyBmb3JtYXQgbWlzc2luZw0KICAgZm10X21pc3NpbmcoIGNvbHVtbnMgPSB2YXJzKFVTRF9hZGp1c3RlZCksDQogICAgICAgICAgICAgICAgbWlzc2luZ190ZXh0ID0gaHRtbCgiJm1kYXNoOyIpDQogICApICU+JSANCiAgICMgZm9ybWF0IHBlcmNlbnQNCiAgIGZtdF9wZXJjZW50KGNvbHVtbnMgPSB2YXJzKFVTRF9yYXcsIFVTRF9hZGp1c3RlZCksDQogICAgICAgICAgICAgICBkZWNpbWFscyA9IDEpICU+JSANCiAgICMgcm91bmQgZG9sbGFyIHByaWNlDQogICBmbXRfbnVtYmVyKGNvbHVtbnMgPSB2YXJzKGRvbGxhcl9wcmljZSksDQogICAgICAgICAgICAgIGRlY2ltYWxzICA9IDIpICU+JSANCiAgICMgYWRkIGRvbGxhciBzaWduDQogICBmbXRfY3VycmVuY3koY29sdW1ucyA9IHZhcnMoZG9sbGFyX3ByaWNlKSwNCiAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICJVU0QiKSAlPiUgDQogICAjIHNwYW5uZXINCiAgIHRhYl9zcGFubmVyKA0KICAgICAgbGFiZWwgPSBodG1sKCImIzEyNzk5MTsmIzY1MDM5OyBMYXRlc3QgUHJpY2UiKSwNCiAgICAgIGNvbHVtbnMgPSB2YXJzKGxvY2FsX3ByaWNlLCBkb2xsYXJfcHJpY2UpDQogICApICU+JSANCiAgICMgc3Bhbm5lcg0KICAgdGFiX3NwYW5uZXIoDQogICAgICBsYWJlbCA9IGh0bWwoIiYjMTI4MTgxOyBVU0QgPHNtYWxsPjxmb250IHN0eWxlPSdjb2xvcjogI0NBMDAyMCc+dW5kZXI8L2ZvbnQ+Lzxmb250IHN0eWxlPSdjb2xvcjogIzA1NzFCMCc+b3ZlcjwvZm9udD48L3NtYWxsPiIpLA0KICAgICAgY29sdW1ucyA9IHZhcnMoVVNEX3JhdywgVVNEX2FkanVzdGVkKQ0KICAgKSAlPiUgDQogICAjIFNwYW5uZXINCiAgIHRhYl9zcGFubmVyKA0KICAgICAgbGFiZWwgPSBodG1sKCImIzkyMDE7JiM2NTAzOTsgSGlzdG9yaWNhbCBEYXRhIiksDQogICAgICBjb2x1bW5zID0gdmFycyhlcmF3X2h0bWwsIGVhZGpfaHRtbCkNCiAgICkgJT4lIA0KICAgIyBsYWJlbHMNCiAgIGNvbHNfbGFiZWwobG9jYWxfcHJpY2UgPSAiTG9jYWwiLA0KICAgICAgICAgICAgICBkb2xsYXJfcHJpY2UgPSAiRG9sbGFyIiApICU+JSANCiAgIGNvbHNfbGFiZWwoVVNEX3JhdyA9ICJSYXciLA0KICAgICAgICAgICAgICBVU0RfYWRqdXN0ZWQgPSAiQWRqdXN0ZWQiICkgJT4lIA0KICAgIyBBZGQgY29sb3IgVVNEIFJhdyAmIFVkanVzdGVkDQogICBkYXRhX2NvbG9yKA0KICAgICAgY29sdW1ucyA9IHZhcnMoVVNEX3JhdywgVVNEX2FkanVzdGVkKSwNCiAgICAgIGNvbG9ycyA9IHNjYWxlczo6Y29sX2JpbigNCiAgICAgICAgIGJpbnMgPSBjKC1JbmYsIDAsIEluZiksDQogICAgICAgICBwYWxldHRlID0gYygiI0NBMDAyMCIsIiMwNTcxQjAiKQ0KICAgICAgKSwNCiAgICAgIGFwcGx5X3RvID0gInRleHQiDQogICApICU+JSANCiAgICMgQWRkIGNvbG9yIHRvIGRvbGxhciBwcmljZSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoMTEsIlJkWWxCdSIpWzE6MTBdDQogICBkYXRhX2NvbG9yKA0KICAgICAgY29sdW1ucyA9IHZhcnMoZG9sbGFyX3ByaWNlKSwNCiAgICAgIGNvbG9ycyA9IHNjYWxlczo6Y29sX2JpbigNCiAgICAgICAgIHBhbGV0dGUgPSBjKCIjQTUwMDI2IiwiI0Q3MzAyNyIsIiNGNDZENDMiLCIjRkRBRTYxIiwiI0ZFRTA5MCIsDQogICAgICAgICAgICAgICAgICAgICAiI0ZGRkZCRiIsDQogICAgICAgICAgICAgICAgICAgICAiI0UwRjNGOCIsIiNBQkQ5RTkiLCIjNzRBREQxIiwgIiM0NTc1QjQiKSwNCiAgICAgICAgIGRvbWFpbiA9IGMoMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCksDQogICAgICAgICBiaW5zID0gMTApLA0KICAgICAgYWxwaGEgPSAwLjUNCiAgICklPiUNCiAgICMgbWFrZSBjZWxscyBib2xkDQogICB0YWJfc3R5bGUoDQogICAgICBzdHlsZSA9IGxpc3QoDQogICAgICAgICBjZWxsX3RleHQod2VpZ2h0ID0gImJvbGQiKQ0KICAgICAgKSwNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoDQogICAgICAgICBjb2x1bW5zID0gdmFycyhVU0RfcmF3LCBVU0RfYWRqdXN0ZWQpDQogICAgICApDQogICApICU+JSANCiAgICMgbWFrZSBVUyB0aGUgYmFzZWxpbmUNCiAgIHRhYl9zdHlsZSgNCiAgICAgIHN0eWxlID0gY2VsbF9maWxsKGNvbG9yID0gIiNGRkZGQkYiLCBhbHBoYSA9IDAuNSksDQogICAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KA0KICAgICAgICAgcm93cyA9IG5hbWUgID09ICJVbml0ZWQgU3RhdGVzIg0KICAgICAgKQ0KICAgKSAlPiUNCiAgICMgYWRkIGEgdGl0bGUNCiAgIHRhYl9oZWFkZXIoDQogICAgICB0aXRsZSAgICA9IG1kKCIqKkJ1cmdlcm5vbWljczoqKiBUaGUgQmlnIE1hYyAmIzEyNzgyODsgSW5kZXggZm9yIFtHMjBdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0cyMCkgY29tcGFyZWQgdG8gdGhlIFVTIERvbGxhciIpLA0KICAgICAgc3VidGl0bGUgPSBtZCgiTWVhc3VyaW5nIHRoZSBwdXJjaGFzaW5nIHBvd2VyIHBhcml0eSAoUFBQKSBiZXR3ZWVuIHR3byBjdXJyZW5jaWVzIikNCiAgICkgJT4lIA0KICAgIyBhZGQgc291cmNlDQogICB0YWJfc291cmNlX25vdGUoDQogICAgICBodG1sKCc8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2ZvbnQtYXdlc29tZS80LjcuMC9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MiPiANCiAgICAgICAgICAgPGI+U291cmNlOjwvYj4NCiAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWNvbm9taXN0LmNvbS9uZXdzLzIwMjAvMDcvMTUvdGhlLWJpZy1tYWMtaW5kZXgiPiANCiAgICAgICAgICAgVGhlIEVjb25vbWlzdDogVGhlIEJpZyBNYWMgSW5kZXggPC9hPiBpbnRyb2R1Y2VkIGluICAxOTg2IGFzIGEgc2VtaS1odW1vcm91cyBpbGx1c3RyYXRpb24gb2YgUFBQIGFuZCBoYXMgYmVlbiBwdWJsaXNoZWQgc2luY2UgdGhlbi4NCiAgICAgICAgICAgPGJyPg0KICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL3NlYXJjaD9xPVRoZSUyMEVjb25vbWlzdCUyN3MlMjBCaWclMjBNYWMlMjBpbmRleCUyMCZzcmM9dHlwZWRfcXVlcnkiPiA8aSBjbGFzcz0iZmEgZmEtdHdpdHRlciJzdHlsZT0iZm9udC1zaXplOjI0cHgiPjwvaT4gVGhlIEVjb25vbWlzdCBCaWcgTWFjIGluZGV4ICA8L2E+DQogICAgICAgICAgIDxicj4NCiAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1RoZUVjb25vbWlzdC9iaWctbWFjLWRhdGEiPiA8aSBjbGFzcz0iZmEgZmEtZ2l0aHViIiBzdHlsZT0iZm9udC1zaXplOjI0cHgiPjwvaT4gRGF0YSBhbmQgbWV0aG9kb2xvZ3kgPC9hPg0KICAgICAgICAgICAnKQ0KICAgICAgDQogICApICU+JSANCiAgIHRhYl9zb3VyY2Vfbm90ZSggbWQoIHsgZGV0YWlsczo6ZGV0YWlscyhkZXZ0b29sczo6c2Vzc2lvbl9pbmZvKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSA9ICdSIFNlc3Npb24gSW5mb3JtYXRpb24nDQogICApIA0KICAgfQ0KICAgKQ0KICAgKSAlPiUgDQogICAjIGZvb3Rub3Rlcw0KICAgdGFiX2Zvb3Rub3RlKA0KICAgICAgZm9vdG5vdGUgPSAiRGF0YSBhcyBvZiAyMDIwLTA3LTAxIiwNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9zcGFubmVycyhodG1sKCImIzEyNzk5MTsmIzY1MDM5OyBMYXRlc3QgUHJpY2UiKSkNCiAgICkgJT4lIA0KICAgdGFiX2Zvb3Rub3RlKA0KICAgICAgZm9vdG5vdGUgPSANCiAgICAgICAgICJUaGUgaW5kZXggaXMgYmFzZWQgb24gdGhlIHRoZW9yeSBvZiBQUFAsIHRoZSBub3Rpb24gdGhhdCBpbiB0aGUgbG9uZyBydW4gZXhjaGFuZ2UgcmF0ZXMgc2hvdWxkIG1vdmUgdG93YXJkcyB0aGUgcmF0ZQ0KICAgICAgdGhhdCB3b3VsZCBlcXVhbGlzZSB0aGUgcHJpY2VzIG9mIGFuIGlkZW50aWNhbCBiYXNrZXQgb2YgZ29vZHMgYW5kIHNlcnZpY2VzIChpbiB0aGlzIGNhc2UsIGEgYnVyZ2VyKSBpbiBhbnkgdHdvIGNvdW50cmllcy4iLA0KICAgICAgbG9jYXRpb25zID0gY2VsbHNfdGl0bGUoInN1YnRpdGxlIikNCiAgICkgJT4lIA0KICAgdGFiX2Zvb3Rub3RlKA0KICAgICAgZm9vdG5vdGUgPSAiUmF3IEluZGV4OiAlIGNvc3QgZGlmZmVyZW5jZSB0aGFuIGluIHRoZSBVUyIsDQogICAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKHZhcnMoVVNEX3JhdyxlcmF3X2h0bWwpKQ0KICAgKSAlPiUgDQogICB0YWJfZm9vdG5vdGUoDQogICAgICBmb290bm90ZSA9ICJHRFAgQWRqdXN0ZWQgSW5kZXg6ICUgY29zdCBkaWZmZXJlbmNlIHRoYW4gaW4gdGhlIFVTIGJhc2VkIG9uIGRpZmZlcmVuY2VzIGluIEdEUCBiZXR3ZWVuIHRoZSB0d28gY291bnRyaWVzIiwNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHModmFycyhVU0RfYWRqdXN0ZWQsZWFkal9odG1sKSkNCiAgICkgJT4lIA0KICAgdGFiX2Zvb3Rub3RlKA0KICAgICAgZm9vdG5vdGUgPSAiQmFzZSBDdXJyZW5jeSIsDQogICAgICBsb2NhdGlvbnMgPSBsaXN0KCBjZWxsc190aXRsZSgidGl0bGUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzX2JvZHkoIGNvbHVtbnMgPSB2YXJzKGxvY2FsX3ByaWNlLCBkb2xsYXJfcHJpY2UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IG5hbWUgID09ICJVbml0ZWQgU3RhdGVzIikNCiAgICAgICkNCiAgICkgJT4lIA0KICAgdGFiX2Zvb3Rub3RlKA0KICAgICAgZm9vdG5vdGUgPSBtZCgnQUJCUjogVGhyZWUtY2hhcmFjdGVyIFtJU08gNDIxNyBjdXJyZW5jeSBjb2RlXShodHRwczovL3d3dy5pc28ub3JnL2lzby00MjE3LWN1cnJlbmN5LWNvZGVzLmh0bWwpJyksDQogICAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKHZhcnMoY3Vycl9uYW1lKSkNCiAgICkgJT4lDQogICB0YWJfZm9vdG5vdGUoDQogICAgICBmb290bm90ZSA9IGh0bWwoJ1ByaWNlIG9mIGEgQmlnIE1hYyBpbiB0aGUgbG9jYWwgY3VycmVuY3knKSwNCiAgICAgIGxvY2F0aW9ucyA9IGNlbGxzX2NvbHVtbl9sYWJlbHModmFycyhsb2NhbF9wcmljZSkpDQogICApICU+JSANCiAgIHRhYl9mb290bm90ZSgNCiAgICAgIGZvb3Rub3RlID0gaHRtbCgnUHJpY2Ugb2YgYSBCaWcgTWFjIGluIGRvbGxhcnMgPGJyPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0E1MDAyNjsgb3BhY2l0eTogMC41OyI+ICZlbXNwOyZlbXNwOyZuYnNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNENzMwMjc7IG9wYWNpdHk6IDAuNTsiPiAmZW1zcDsmZW1zcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRjQ2RDQzOyBvcGFjaXR5OiAwLjU7Ij4gJmVtc3A7JmVtc3A7PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZEQUU2MTsgb3BhY2l0eTogMC41OyI+ICZlbXNwOyZlbXNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRUUwOTA7IG9wYWNpdHk6IDAuNTsiPiAmZW1zcDsmZW1zcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkJGOyBvcGFjaXR5OiAwLjU7Ij4gJmVtc3A7JmVtc3A7PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0UwRjNGODsgb3BhY2l0eTogMC41OyI+ICZlbXNwOyZlbXNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNBQkQ5RTk7IG9wYWNpdHk6IDAuNTsiPiAmZW1zcDsmZW1zcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjNzRBREQxOyBvcGFjaXR5OiAwLjU7Ij4gJmVtc3A7JmVtc3A7PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzQ1NzVCNDsgb3BhY2l0eTogMC41OyI+ICZlbXNwOyZlbXNwOyZuYnNwOyZuYnNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPGJyPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+ICAgICAgJDAtMSZuYnNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPiAmbmJzcDsxLTImbmJzcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij4gJm5ic3A7Mi0zJm5ic3A7PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+ICZuYnNwOzMtNCZuYnNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPiAmbmJzcDs0LTUmbmJzcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij4gJm5ic3A7NS02Jm5ic3A7PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+ICZuYnNwOzYtNyZuYnNwOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiBibGFjazsiPiAmbmJzcDs3LTgmbmJzcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogYmxhY2s7Ij4gJm5ic3A7OC05Jm5ic3A7PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IGJsYWNrOyI+ICZuYnNwOzktMTAmbmJzcDs8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgJyksDQogICAgICBsb2NhdGlvbnMgPSBjZWxsc19jb2x1bW5fbGFiZWxzKHZhcnMoZG9sbGFyX3ByaWNlKSkNCiAgICkgJT4lIA0KICAgIyB0cmFuc3BhcmVudCB0cmljazogZG8gbm90IHByaW50IDAlDQogICB0YWJfc3R5bGUoDQogICAgICBzdHlsZSA9IGNlbGxfdGV4dChjb2xvciA9ICd0cmFuc3BhcmVudCcpLA0KICAgICAgbG9jYXRpb25zID0gY2VsbHNfYm9keSgNCiAgICAgICAgIGNvbHVtbnMgPSB2YXJzKFVTRF9yYXcsIFVTRF9hZGp1c3RlZCksDQogICAgICAgICByb3dzID0gbmFtZSAgPT0gIlVuaXRlZCBTdGF0ZXMiKQ0KICAgKSAlPiUNCiAgICMgYWRkIG9wdGlvbnMgbGVmdCBhbGlnbg0KICAgb3B0X2FsaWduX3RhYmxlX2hlYWRlciggYWxpZ24gPSAibGVmdCIpICU+JSANCiAgICMgdXBwZXINCiAgIG9wdF9hbGxfY2Fwcyhsb2NhdGlvbnMgPSAiY29sdW1uX2xhYmVscyIpICU+JSANCiAgICMgdGhlbWUgY29tcGFjdA0KICAgdGFiX29wdGlvbnModGFibGUuZm9udC5zaXplICAgICAgPSBweCgxNCksDQogICAgICAgICAgICAgICBkYXRhX3Jvdy5wYWRkaW5nICAgICA9IHB4KDEpLA0KICAgICAgICAgICAgICAgZm9vdG5vdGVzLnBhZGRpbmcgICAgPSBweCgxKSwNCiAgICAgICAgICAgICAgIHNvdXJjZV9ub3Rlcy5wYWRkaW5nID0gcHgoMSksDQogICAgICAgICAgICAgICByb3dfZ3JvdXAucGFkZGluZyAgICA9IHB4KDEpKSAlPiUgDQogICAjIGFkZCBDU1MNCiAgIG9wdF9jc3MoY3NzID0gIi5odG1sLXdpZGdldCB7bWFyZ2luLWJvdHRvbTogMHB4O30iKSAlPiUgDQogICBvcHRfY3NzKGNzcyA9ICIuZ3Rfcm93Om50aC1jaGlsZCggOSl7b3ZlcmZsb3cteTogaGlkZGVuO30iKSAlPiUgDQogICBvcHRfY3NzKGNzcyA9ICIuZ3Rfcm93Om50aC1jaGlsZCgxMCl7b3ZlcmZsb3cteTogaGlkZGVuO30iKSAlPiUNCiAgIG9wdF9jc3MoY3NzID0gIi5ndF9yb3c6bnRoLWNoaWxkKCAyKTpob3Zlcnt0cmFuc2Zvcm06IHNjYWxlKDIpO30iKSAlPiUgDQogICAjIGNoYW5nZSBmb250DQogICBvcHRfdGFibGVfZm9udCgNCiAgICAgIGZvbnQgPSBsaXN0KGdvb2dsZV9mb250KG5hbWUgPSAiU291cmNlIFNhbnMgUHJvIikpDQogICApIA0KDQp0YWJfMQ0KYGBgDQo=