Nobel Prize Winners
Georgios Karamanis gathered and shared data on Nobel prize winners over the years, with a fair amount of detail, and used in the tidytuesday
series a while back. These data are to be used for the questions that follow.
readr:: read_csv ("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-05-14/nobel_winners.csv" ) -> nobel_winners
prize_year
double
Year that Nobel Prize was awarded
category
character
Field of study/category
prize
character
Prize Name
motivation
character
Motivation of the award
prize_share
character
Share eg 1 of 1, 1 of 2, 1 of 4, etc
laureate_id
double
ID assigned to each winner
laureate_type
character
Individual or organization
full_name
character
name of the winner
birth_date
double
birth date of winner
birth_city
character
birth city/state of winner
birth_country
character
birth country of winner
gender
character
binary gender of the winner
organization_name
character
organization name
organization_city
character
organization city
organization_country
character
organization country
death_date
double
death date of the winner (if dead)
death_city
character
death city (if dead)
death_country
character
death country (if dead)
First create nobel.df
that keeps only records starting in the year 1960, and only for the “Physics” category. Now generate an appropriate chart that shows the distribution of winners by birth_country
library (tidyverse)
library (tidylog)
nobel_winners %>%
filter (category == "Physics" , prize_year >= 1960 ) -> nobel.df
ggplot () +
geom_bar (
data = nobel.df,
aes (x = birth_country)
) +
labs (x = "Birth Country" , y = "Number of Nobel Laureates" ,
title = "Bar-chart of Nobel Laureates by Country of Birth" ) +
coord_flip ()
Now break this distribution out by gender
to see how winners by country differs across gender
ggplot () +
geom_bar (
data = nobel.df,
aes (x = birth_country, group = gender, fill = gender)
) +
labs (x = "Birth Country" , y = "Number of Nobel Laureates" ,
title = "Bar-chart of Nobel Laureates by Country of Birth" ) +
coord_flip ()
Now go back to noble_winners
, the full data-set, and create a simple plot that shows the distribution of prize winners by death_country
, gender
, and category
nobel_winners %>%
filter (! is.na (death_country)) -> nobel.df
ggplot () +
geom_bar (
data = nobel.df,
aes (x = death_country, group = gender, fill = gender)
) +
labs (x = "Death Country" , y = "Number of Nobel Laureates" ,
title = "Bar-chart of Nobel Laureates by Country of Death, Gender, and Prize category" ) +
coord_flip () +
facet_wrap (~ category)
Water levels in the Great Lakes
Use the data-set given below. Note that water level is in meters.
library (readxl)
url <- "https://aniruhil.github.io/avsr/teaching/dataviz/greatlakes.xlsx"
destfile <- "greatlakes.xlsx"
curl:: curl_download (url, destfile)
read_excel (destfile, col_types = c ("date" ,
"numeric" , "numeric" , "numeric" , "numeric" ,
"numeric" )) -> greatlakes
Now use an appropriate chart to show the water level for Lake Superior.
ggplot (
data = greatlakes,
aes (
x = monthyear,
y = Superior
)
) +
geom_line () +
labs (
x = "Date" ,
y = "Water level, in meters" ,
title = "Lake Superior's water levels over time"
)
County Health Rankings
Download the 2017 County Health Rankings data SPSS format from here , Excel format from here and the accompanying codebook .
These data can be downloaded with the code provided below:
library (readxl)
url <- "https://aniruhil.github.io/avsr/teaching/dataviz/CountyHealthRankings2017.xlsx"
destfile <- "CountyHealthRankings2017.xlsx"
curl:: curl_download (url, destfile)
read_excel (destfile) -> chr.df
Construct appropriate plots that shows the relationship between the following pairs of variables
Adult obesity and High school graduation
ggplot (
data = chr.df,
aes (x = Adult_obesity, y = High_school_graduation)
) +
geom_point () +
labs (x = "Adult Obesity (%)" , y = "High School Graduation (%)" ) +
scale_y_continuous (label = scales:: percent)
Children in poverty and High school graduation
ggplot (
data = chr.df,
aes (x = Children_in_poverty, y = High_school_graduation)
) +
geom_point () +
labs (x = "Children in Poverty (%)" , y = "High School Graduation (%)" ) +
scale_y_continuous (label = scales:: percent)
Preventable hospital stays and Unemployment rate
ggplot (
data = chr.df,
aes (x = Preventable_hospital_stays, y = Unemployment_rate)
) +
geom_point () +
labs (x = "Preventable Hospital Stays" , y = "Unemployment Rate (%)" ) +
scale_y_continuous (label = scales:: percent)
Unemployment Rates
Use the unemployment data given to you (unemprate.RData)
and construct appropriate plots that show the distribution of unemployment rates across years for each of the four educational attainment groups.
load (here:: here ("data" , "unemprate.RData" ))
names (urate)
## [1] "yearmonth" "educ_group" "rate"
Be sure to use a unique color for each educational attainment group
ggplot (
data = urate,
aes (x = yearmonth, y = rate, color = educ_group)
) +
geom_line () +
labs (
x = "Date" ,
y = "Unemployment Rate" ,
color = "" ,
title = "Unemployment Rate by Educational Attainment"
) +
theme (legend.position = "bottom" )
LS0tCnRpdGxlOiAiTVBBIDU4MzAgLSBTb2x1dGlvbnMgdG8gUHJhY3RpY2UgRXhlcmNpc2VzIgpzdWJ0aXRsZTogIlNwcmluZyAyMDIwIgphdXRob3I6ICJJTlNFUlQgWU9VUiBOQU1FIEhFUkUiCmRhdGU6ICJVcGRhdGVkIG9uIGByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBzZWxmX2NvbnRhaW5lZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgpib2R5eyAvKiBOb3JtYWwgICovCi8qICAgIGZvbnQtZmFtaWx5OiBMYXRvLCBzYW5zLXNlcmlmOyAgCiAgICAgIGZvbnQtZmFtaWx5OiBNdWt0YSwgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtZmFtaWx5OiAnTnVuaXRvIFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICBmb250LWZhbWlseTogS2FybGEsIHNhbnMtc2VyaWY7ICAqLwogICAgICBmb250LWZhbWlseTogJ01lcnJpd2VhdGhlciBTYW5zJywgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtc2l6ZTogMThweDsKICB9CgpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAzOHB4OwogIGNvbG9yOiBEYXJrUmVkOwp9CgpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDIgeyAvKiBIZWFkZXIgMiAqLwogICAgZm9udC1zaXplOiAyMnB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDMgeyAvKiBIZWFkZXIgMyAqLwogIGZvbnQtc2l6ZTogMThweDsKICBjb2xvcjogRGFya0JsdWU7Cn0KCmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1mYW1pbHk6IE11a3RhLCBzYW5zLXNlcmlmOyAKICAgIGZvbnQtd2VpZ2h0OiA2MDA7ICAKICAgIGZvbnQtc2l6ZTogMThweDsKfQoKLyogcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTZweDsKfSAqLwo8L3N0eWxlPgoKCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRX0Ka2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScsIGNvbG9yID0gJ2Nvcm5mbG93ZXJibHVlJywgcG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZHBpID0gMzAwLCBjYWNoZSA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4LCBvdXQud2lkdGggPSAiMTAwJSIsIGhpZ2hsaWdodCA9IFRSVUUpIApgYGAKCgojIE5vYmVsIFByaXplIFdpbm5lcnMgCkdlb3JnaW9zIEthcmFtYW5pcyBnYXRoZXJlZCBhbmQgc2hhcmVkIGRhdGEgb24gTm9iZWwgcHJpemUgd2lubmVycyBvdmVyIHRoZSB5ZWFycywgd2l0aCBhIGZhaXIgYW1vdW50IG9mIGRldGFpbCwgYW5kIHVzZWQgaW4gdGhlIGB0aWR5dHVlc2RheWAgc2VyaWVzIGEgd2hpbGUgYmFjay4gVGhlc2UgZGF0YSBhcmUgdG8gYmUgdXNlZCBmb3IgdGhlIHF1ZXN0aW9ucyB0aGF0IGZvbGxvdy4gCgpgYGB7ciBub2JlbC13aW5uZXJzfQpyZWFkcjo6cmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA1LTE0L25vYmVsX3dpbm5lcnMuY3N2IikgLT4gbm9iZWxfd2lubmVycyAKYGBgCgp8dmFyaWFibGUgICAgICAgICAgICAgfGNsYXNzICAgICB8ZGVzY3JpcHRpb24gfAp8Oi0tLXw6LS0tfDotLS0tLS0tLS0tLXwKfHByaXplX3llYXIgICAgICAgICAgIHxkb3VibGUgICAgfCBZZWFyIHRoYXQgTm9iZWwgUHJpemUgd2FzIGF3YXJkZWR8CnxjYXRlZ29yeSAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgRmllbGQgb2Ygc3R1ZHkvY2F0ZWdvcnl8Cnxwcml6ZSAgICAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgUHJpemUgTmFtZSB8Cnxtb3RpdmF0aW9uICAgICAgICAgICB8Y2hhcmFjdGVyIHwgTW90aXZhdGlvbiBvZiB0aGUgYXdhcmQgfAp8cHJpemVfc2hhcmUgICAgICAgICAgfGNoYXJhY3RlciB8IFNoYXJlIGVnIDEgb2YgMSwgMSBvZiAyLCAxIG9mIDQsIGV0YyB8CnxsYXVyZWF0ZV9pZCAgICAgICAgICB8ZG91YmxlICAgIHwgSUQgYXNzaWduZWQgdG8gZWFjaCB3aW5uZXIgfAp8bGF1cmVhdGVfdHlwZSAgICAgICAgfGNoYXJhY3RlciB8IEluZGl2aWR1YWwgb3Igb3JnYW5pemF0aW9uICB8CnxmdWxsX25hbWUgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgbmFtZSBvZiB0aGUgd2lubmVyfAp8YmlydGhfZGF0ZSAgICAgICAgICAgfGRvdWJsZSAgICB8IGJpcnRoIGRhdGUgb2Ygd2lubmVyIHwKfGJpcnRoX2NpdHkgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBiaXJ0aCBjaXR5L3N0YXRlIG9mIHdpbm5lciB8CnxiaXJ0aF9jb3VudHJ5ICAgICAgICB8Y2hhcmFjdGVyIHwgYmlydGggY291bnRyeSBvZiB3aW5uZXIgfAp8Z2VuZGVyICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IGJpbmFyeSBnZW5kZXIgb2YgdGhlIHdpbm5lciB8Cnxvcmdhbml6YXRpb25fbmFtZSAgICB8Y2hhcmFjdGVyIHwgb3JnYW5pemF0aW9uIG5hbWUgfAp8b3JnYW5pemF0aW9uX2NpdHkgICAgfGNoYXJhY3RlciB8IG9yZ2FuaXphdGlvbiBjaXR5IHwKfG9yZ2FuaXphdGlvbl9jb3VudHJ5IHxjaGFyYWN0ZXIgfCBvcmdhbml6YXRpb24gY291bnRyeSB8CnxkZWF0aF9kYXRlICAgICAgICAgICB8ZG91YmxlICAgIHwgZGVhdGggZGF0ZSBvZiB0aGUgd2lubmVyIChpZiBkZWFkKSB8CnxkZWF0aF9jaXR5ICAgICAgICAgICB8Y2hhcmFjdGVyIHwgZGVhdGggY2l0eSAoaWYgZGVhZCkgfAp8ZGVhdGhfY291bnRyeSAgICAgICAgfGNoYXJhY3RlciB8IGRlYXRoIGNvdW50cnkgKGlmIGRlYWQpIHwKCgooYSkgRmlyc3QgY3JlYXRlIGBub2JlbC5kZmAgdGhhdCBrZWVwcyBvbmx5IHJlY29yZHMgc3RhcnRpbmcgaW4gdGhlIHllYXIgMTk2MCwgYW5kIG9ubHkgZm9yIHRoZSAiUGh5c2ljcyIgY2F0ZWdvcnkuIE5vdyBnZW5lcmF0ZSBhbiBhcHByb3ByaWF0ZSBjaGFydCB0aGF0IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2Ygd2lubmVycyBieSBgYmlydGhfY291bnRyeWAgCgpgYGB7ciBxMX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeWxvZykKCm5vYmVsX3dpbm5lcnMgJT4lCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJQaHlzaWNzIiwgcHJpemVfeWVhciA+PSAxOTYwKSAtPiBub2JlbC5kZgoKZ2dwbG90KCkgKwogIGdlb21fYmFyKAogICAgZGF0YSA9IG5vYmVsLmRmLAogICAgYWVzKHggPSBiaXJ0aF9jb3VudHJ5KQogICAgKSArCiAgbGFicyh4ID0gIkJpcnRoIENvdW50cnkiLCB5ID0gIk51bWJlciBvZiBOb2JlbCBMYXVyZWF0ZXMiLCAKICAgICAgIHRpdGxlID0gIkJhci1jaGFydCBvZiBOb2JlbCBMYXVyZWF0ZXMgYnkgQ291bnRyeSBvZiBCaXJ0aCIpICsgCiAgY29vcmRfZmxpcCgpIApgYGAKCgooYikgTm93IGJyZWFrIHRoaXMgZGlzdHJpYnV0aW9uIG91dCBieSBgZ2VuZGVyYCB0byBzZWUgaG93IHdpbm5lcnMgYnkgY291bnRyeSBkaWZmZXJzIGFjcm9zcyBnZW5kZXIgCgpgYGB7ciBxMn0KZ2dwbG90KCkgKwogIGdlb21fYmFyKAogICAgZGF0YSA9IG5vYmVsLmRmLAogICAgYWVzKHggPSBiaXJ0aF9jb3VudHJ5LCBncm91cCA9IGdlbmRlciwgZmlsbCA9IGdlbmRlcikKICAgICkgKwogIGxhYnMoeCA9ICJCaXJ0aCBDb3VudHJ5IiwgeSA9ICJOdW1iZXIgb2YgTm9iZWwgTGF1cmVhdGVzIiwgCiAgICAgICB0aXRsZSA9ICJCYXItY2hhcnQgb2YgTm9iZWwgTGF1cmVhdGVzIGJ5IENvdW50cnkgb2YgQmlydGgiKSArIAogIGNvb3JkX2ZsaXAoKSAKYGBgCgoKKGMpIE5vdyBnbyBiYWNrIHRvIGBub2JsZV93aW5uZXJzYCwgdGhlIGZ1bGwgZGF0YS1zZXQsIGFuZCBjcmVhdGUgYSBzaW1wbGUgcGxvdCB0aGF0IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgcHJpemUgd2lubmVycyBieSBgZGVhdGhfY291bnRyeWAsIGBnZW5kZXJgLCBhbmQgYGNhdGVnb3J5YCAgCgpgYGB7ciBxM30Kbm9iZWxfd2lubmVycyAlPiUKICBmaWx0ZXIoIWlzLm5hKGRlYXRoX2NvdW50cnkpKSAtPiBub2JlbC5kZgoKZ2dwbG90KCkgKwogIGdlb21fYmFyKAogICAgZGF0YSA9IG5vYmVsLmRmLAogICAgYWVzKHggPSBkZWF0aF9jb3VudHJ5LCBncm91cCA9IGdlbmRlciwgZmlsbCA9IGdlbmRlcikKICAgICkgKwogIGxhYnMoeCA9ICJEZWF0aCBDb3VudHJ5IiwgeSA9ICJOdW1iZXIgb2YgTm9iZWwgTGF1cmVhdGVzIiwgCiAgICAgICB0aXRsZSA9ICJCYXItY2hhcnQgb2YgTm9iZWwgTGF1cmVhdGVzIGJ5IENvdW50cnkgb2YgRGVhdGgsIEdlbmRlciwgYW5kIFByaXplIGNhdGVnb3J5IikgKyAKICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAofiBjYXRlZ29yeSkKYGBgCgoKIyBXYXRlciBsZXZlbHMgaW4gdGhlIEdyZWF0IExha2VzCgpVc2UgdGhlIGRhdGEtc2V0IGdpdmVuIGJlbG93LiAqTm90ZSB0aGF0IHdhdGVyIGxldmVsIGlzIGluIG1ldGVycy4qIAoKYGBge3IgZ3JlYXRsYWtlc30KbGlicmFyeShyZWFkeGwpCnVybCA8LSAiaHR0cHM6Ly9hbmlydWhpbC5naXRodWIuaW8vYXZzci90ZWFjaGluZy9kYXRhdml6L2dyZWF0bGFrZXMueGxzeCIKZGVzdGZpbGUgPC0gImdyZWF0bGFrZXMueGxzeCIKY3VybDo6Y3VybF9kb3dubG9hZCh1cmwsIGRlc3RmaWxlKQpyZWFkX2V4Y2VsKGRlc3RmaWxlLCBjb2xfdHlwZXMgPSBjKCJkYXRlIiwgCiAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAibnVtZXJpYyIpKSAtPiBncmVhdGxha2VzIApgYGAKCk5vdyB1c2UgYW4gYXBwcm9wcmlhdGUgY2hhcnQgdG8gc2hvdyB0aGUgd2F0ZXIgbGV2ZWwgZm9yIExha2UgU3VwZXJpb3IuIAoKYGBge3IgbGFrZXN9CmdncGxvdCgKICBkYXRhID0gZ3JlYXRsYWtlcywKICBhZXMoCiAgICB4ID0gbW9udGh5ZWFyLAogICAgeSA9IFN1cGVyaW9yCiAgICApCiAgKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoCiAgICB4ID0gIkRhdGUiLAogICAgeSA9ICJXYXRlciBsZXZlbCwgaW4gbWV0ZXJzIiwKICAgIHRpdGxlID0gIkxha2UgU3VwZXJpb3IncyB3YXRlciBsZXZlbHMgb3ZlciB0aW1lIgogICkKYGBgCgoKIyBDb3VudHkgSGVhbHRoIFJhbmtpbmdzCkRvd25sb2FkIHRoZSAyMDE3IENvdW50eSBIZWFsdGggUmFua2luZ3MgZGF0YSBbU1BTUyBmb3JtYXQgZnJvbSBoZXJlXShodHRwczovL2FuaXJ1aGlsLmdpdGh1Yi5pby9hdnNyL3RlYWNoaW5nL2RhdGF2aXovQ291bnR5SGVhbHRoUmFua2luZ3MyMDE3LnNhdiksIFtFeGNlbCBmb3JtYXQgZnJvbSBoZXJlXShodHRwczovL2FuaXJ1aGlsLmdpdGh1Yi5pby9hdnNyL3RlYWNoaW5nL2RhdGF2aXovQ291bnR5SGVhbHRoUmFua2luZ3MyMDE3Lnhsc3gpIGFuZCB0aGUgW2FjY29tcGFueWluZyBjb2RlYm9va10oaHR0cDovL3d3dy5jb3VudHloZWFsdGhyYW5raW5ncy5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy8yMDE3VHJlbmRzRG9jdW1lbnRhdGlvbi5wZGYpLiAKClRoZXNlIGRhdGEgY2FuIGJlIGRvd25sb2FkZWQgd2l0aCB0aGUgY29kZSBwcm92aWRlZCBiZWxvdzogCgpgYGB7ciBncmVhdC1sYWtlc30KbGlicmFyeShyZWFkeGwpCnVybCA8LSAiaHR0cHM6Ly9hbmlydWhpbC5naXRodWIuaW8vYXZzci90ZWFjaGluZy9kYXRhdml6L0NvdW50eUhlYWx0aFJhbmtpbmdzMjAxNy54bHN4IgpkZXN0ZmlsZSA8LSAiQ291bnR5SGVhbHRoUmFua2luZ3MyMDE3Lnhsc3giCmN1cmw6OmN1cmxfZG93bmxvYWQodXJsLCBkZXN0ZmlsZSkKcmVhZF9leGNlbChkZXN0ZmlsZSkgLT4gY2hyLmRmIApgYGAKCkNvbnN0cnVjdCBhcHByb3ByaWF0ZSBwbG90cyB0aGF0IHNob3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZm9sbG93aW5nIHBhaXJzIG9mIHZhcmlhYmxlcyAKCihhKSBBZHVsdCBvYmVzaXR5IGFuZCBIaWdoIHNjaG9vbCBncmFkdWF0aW9uIAoKYGBge3IgY2hyMX0KZ2dwbG90KAogIGRhdGEgPSBjaHIuZGYsCiAgYWVzKHggPSBBZHVsdF9vYmVzaXR5LCB5ID0gSGlnaF9zY2hvb2xfZ3JhZHVhdGlvbikKICApICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnMoeCA9ICJBZHVsdCBPYmVzaXR5ICglKSIsIHkgPSAiSGlnaCBTY2hvb2wgR3JhZHVhdGlvbiAoJSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KSAKYGBgCgooYikgQ2hpbGRyZW4gaW4gcG92ZXJ0eSBhbmQgSGlnaCBzY2hvb2wgZ3JhZHVhdGlvbiAKCmBgYHtyIGNocjJ9CmdncGxvdCgKICBkYXRhID0gY2hyLmRmLAogIGFlcyh4ID0gQ2hpbGRyZW5faW5fcG92ZXJ0eSwgeSA9IEhpZ2hfc2Nob29sX2dyYWR1YXRpb24pCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHggPSAiQ2hpbGRyZW4gaW4gUG92ZXJ0eSAoJSkiLCB5ID0gIkhpZ2ggU2Nob29sIEdyYWR1YXRpb24gKCUpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudCkgCmBgYAoKKGMpIFByZXZlbnRhYmxlIGhvc3BpdGFsIHN0YXlzIGFuZCBVbmVtcGxveW1lbnQgcmF0ZSAKCmBgYHtyIGNocjN9CmdncGxvdCgKICBkYXRhID0gY2hyLmRmLAogIGFlcyh4ID0gUHJldmVudGFibGVfaG9zcGl0YWxfc3RheXMsIHkgPSBVbmVtcGxveW1lbnRfcmF0ZSkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnMoeCA9ICJQcmV2ZW50YWJsZSBIb3NwaXRhbCBTdGF5cyIsIHkgPSAiVW5lbXBsb3ltZW50IFJhdGUgKCUpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudCkgCmBgYAoKIyBVbmVtcGxveW1lbnQgUmF0ZXMKVXNlIHRoZSB1bmVtcGxveW1lbnQgZGF0YSBnaXZlbiB0byB5b3UgYCh1bmVtcHJhdGUuUkRhdGEpYCBhbmQgY29uc3RydWN0IGFwcHJvcHJpYXRlIHBsb3RzIHRoYXQgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIHVuZW1wbG95bWVudCByYXRlcyBhY3Jvc3MgeWVhcnMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBncm91cHMuIAoKYGBge3IgdXJhdGV9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsICJ1bmVtcHJhdGUuUkRhdGEiKSkKCm5hbWVzKHVyYXRlKQpgYGAKCkJlIHN1cmUgdG8gdXNlIGEgdW5pcXVlIGNvbG9yIGZvciBlYWNoIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgZ3JvdXAKCmBgYHtyIHVyYXRlMn0KZ2dwbG90KAogIGRhdGEgPSB1cmF0ZSwKICBhZXMoeCA9IHllYXJtb250aCwgeSA9IHJhdGUsIGNvbG9yID0gZWR1Y19ncm91cCkKICApICsKICBnZW9tX2xpbmUoKSArCiAgbGFicygKICAgIHggPSAiRGF0ZSIsCiAgICB5ID0gIlVuZW1wbG95bWVudCBSYXRlIiwKICAgIGNvbG9yID0gIiIsCiAgICB0aXRsZSA9ICJVbmVtcGxveW1lbnQgUmF0ZSBieSBFZHVjYXRpb25hbCBBdHRhaW5tZW50IgogICkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCg==