#Import data
Countries<- read.csv("https://tkelleman.github.io/tkweb/Week5/countries_total.csv")
Income<-read.csv("https://tkelleman.github.io/tkweb/Week5/income_per_person.csv")
LifeExp<-read.csv("https://tkelleman.github.io/tkweb/Week5/life_expectancy_years.csv")
Population<-read.csv("https://tkelleman.github.io/tkweb/Week5/population_total.csv")
## A - Reshape data set: Income Per Person to make a longitudinal data such that the resulting data set has three columns: country, year, and income.
IncomeEdit <- Income %>%
gather(key = "Year", value = "Income", - geo, na.rm=TRUE)
names(IncomeEdit)[1] <- "Country"
## B - Do the same for Life Expectancy in Years so that the resulting data set has three columns: country, year, and life expectancy.
LifeExpEdit <- LifeExp %>%
gather(key = "Year", value = "LifeExpectancy", - geo, na.rm=TRUE)
names(LifeExpEdit)[1] <- "Country"
## C - Merge/join the above two longitudinal data sets to make a new data set, under name LifeExpIncom that has variables: country, year, lifeExp, and income.
LifeExpIncom <- merge(IncomeEdit, LifeExpEdit, by = c("Country", "Year"))
## D - Merge LifeExpIncom with country region so that the final data set has information about income, life expectancy, and country region.
LifeIncomCount <-merge(LifeExpIncom, Countries, by.x = "Country", by.y = "name", all.x = TRUE)
## E - Merge the previous resulting data set with population size so that the final data set has information about income, life expectancy, population size, and country region.
PopulationEdit <- Population %>%
gather(key = "Year", value = "Population", - geo, na.rm=TRUE)
names(PopulationEdit)[1] <- "Country"
FinalData <- merge(LifeIncomCount, PopulationEdit, by = c("Country", "Year"))
FinalData <- subset(FinalData, select = -c(alpha.2, alpha.3, country.code, iso_3166.2, sub.region, region.code, sub.region.code, intermediate.region.code, intermediate.region))
FinalData$Year<-gsub("X","", as.character(FinalData$Year))
#write.csv(FinalData, "FinalData.csv")
## 3 Create a subset of the above resulting longitudinal data set that contains only the data of the year 2000/font> - name it 2000data.
Y2000data<-filter(FinalData, Year==2000)
#Y2000data contains 187 observations of 6 variables
#FinalData contains 40,437 observations of 6 variables
cols1 = c("#332288","#117733","#44AA99","#88CCEE","#DDCC77","#CC6677")
Y2000Plot<-ggplot(Y2000data, aes(x=Income,
y=LifeExpectancy,
size = Population,
color = region)) +
geom_point(aes(size=Population, ids = Country),
show.legend = TRUE,
alpha = 0.8)+
scale_color_manual(values = cols1)+
labs(title = 'Plot of Life Expectancy by Income in 2000',
x = 'Income',
y = 'Life Expectancy',
legend = 'Region')+
transition_states(Year) +
ease_aes('linear')
Y2000Plot
Figure 1: Plot of Life Expectancy by Income in 2000
This
plot shows the relationship between life expectancy and income in the
year 2000 in the merged data set. The population of each country is
represented by the diameter of the points plotted and the color of the
point represents the region of the country. As shown in this figure,
countries in the regions of Americas and Europe have a higher life
expectancy than most countries in the Africa region, with a few outlier
data points. —
### Full Data Set
cols1 = c("#332288","#117733","#44AA99","#88CCEE","#DDCC77","#CC6677")
AllDataPlot<-ggplot(FinalData, aes(x=Income,
y=LifeExpectancy,
size = Population,
color = region)) +
geom_point(aes(size=Population, ids = Country),
show.legend = TRUE,
alpha = 0.8)+
scale_color_manual(values = cols1)+
labs(title = 'Plot of Life Expectency by Income at Year: {closest_state}',
x = 'Income',
y = 'Life Expectancy',
fill = 'Region')+
transition_states(Year) +
ease_aes('linear')
animate(AllDataPlot, renderer = gifski_renderer(), rewind = FALSE, nframes = 300, fps = 10)
Figure 2: Plot of Life Expectancy by Income for Years 1800-2018
This plot shows the relationship between life expectancy and
income all countries in the merged data set. The population of each
country is represented by the diameter of the points plotted and the
color of the point represents the region of the country. As shown in the
plot, all represented countries increase their life expectancy between
the given years but not all countries show an increase in income.
LS0tDQp0aXRsZTogIldlZWsgNSAtIEdHUExPVCBSZXZpc2l0ZWQiDQphdXRob3I6ICJUaW0gS2VsbGVtYW4iDQpkYXRlOiAiMjAyNC0wMi0yMiINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZmlnX3dpZHRoOiA4DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQpkaXYjVE9DIGE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KZGl2I1RPQyBhOmxpbmsgew0KICBjb2xvcjogYmx1ZTsNCn0NCg0KDQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IA0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsNCiAgICBmb250LXNpemU6IDI0cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiBzZWxlY3RlZCBsaW5rICovDQphOmFjdGl2ZSB7DQogIGNvbG9yOiB5ZWxsb3c7DQp9DQo8L3N0eWxlPg0KYGBgDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCiAgIGxpYnJhcnkoY293cGxvdCkNCn0NCmlmICghcmVxdWlyZSgibGF0ZXgyZXhwIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxhdGV4MmV4cCIpDQogICBsaWJyYXJ5KGxhdGV4MmV4cCkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgicG5nIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKSAgICAgICAgICAgICAjIEluc3RhbGwgcG5nIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJwbmciKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQojIyMgZ2dwbG90IGFuZCBleHRlbnNpb25zDQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dwbG90MiIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdncmlkZ2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3JpZGdlcyIpDQp9DQppZiAoIXJlcXVpcmUoImdyYXBoaWNzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJncmFwaGljcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJncmFwaGljcyIpDQp9DQppZiAoIXJlcXVpcmUoImRwbHlyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJkcGx5ciIpDQp9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUUlVFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEpDQpgYGANCg0KYGBge3IgZXZhbD1UUlVFfQ0KI0ltcG9ydCBkYXRhDQpDb3VudHJpZXM8LSByZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs1L2NvdW50cmllc190b3RhbC5jc3YiKQ0KSW5jb21lPC1yZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs1L2luY29tZV9wZXJfcGVyc29uLmNzdiIpDQpMaWZlRXhwPC1yZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs1L2xpZmVfZXhwZWN0YW5jeV95ZWFycy5jc3YiKQ0KUG9wdWxhdGlvbjwtcmVhZC5jc3YoImh0dHBzOi8vdGtlbGxlbWFuLmdpdGh1Yi5pby90a3dlYi9XZWVrNS9wb3B1bGF0aW9uX3RvdGFsLmNzdiIpDQoNCiMjIEEgLSBSZXNoYXBlIGRhdGEgc2V0OiBJbmNvbWUgUGVyIFBlcnNvbiB0byBtYWtlIGEgbG9uZ2l0dWRpbmFsIGRhdGEgc3VjaCB0aGF0IHRoZSByZXN1bHRpbmcgZGF0YSBzZXQgaGFzIHRocmVlIGNvbHVtbnM6IGNvdW50cnksIHllYXIsIGFuZCBpbmNvbWUuDQpJbmNvbWVFZGl0IDwtIEluY29tZSAlPiUNCiAgZ2F0aGVyKGtleSA9ICJZZWFyIiwgdmFsdWUgPSAiSW5jb21lIiwgLSBnZW8sIG5hLnJtPVRSVUUpDQpuYW1lcyhJbmNvbWVFZGl0KVsxXSA8LSAiQ291bnRyeSINCg0KIyMgQiAtIERvIHRoZSBzYW1lIGZvciBMaWZlIEV4cGVjdGFuY3kgaW4gWWVhcnMgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGRhdGEgc2V0IGhhcyB0aHJlZSBjb2x1bW5zOiBjb3VudHJ5LCB5ZWFyLCBhbmQgbGlmZSBleHBlY3RhbmN5Lg0KTGlmZUV4cEVkaXQgPC0gTGlmZUV4cCAlPiUNCiAgZ2F0aGVyKGtleSA9ICJZZWFyIiwgdmFsdWUgPSAiTGlmZUV4cGVjdGFuY3kiLCAtIGdlbywgbmEucm09VFJVRSkNCm5hbWVzKExpZmVFeHBFZGl0KVsxXSA8LSAiQ291bnRyeSINCg0KIyMgQyAtICBNZXJnZS9qb2luIHRoZSBhYm92ZSB0d28gbG9uZ2l0dWRpbmFsIGRhdGEgc2V0cyB0byBtYWtlIGEgbmV3IGRhdGEgc2V0LCB1bmRlciBuYW1lIExpZmVFeHBJbmNvbSB0aGF0IGhhcyB2YXJpYWJsZXM6IGNvdW50cnksIHllYXIsIGxpZmVFeHAsIGFuZCBpbmNvbWUuDQpMaWZlRXhwSW5jb20gPC0gbWVyZ2UoSW5jb21lRWRpdCwgTGlmZUV4cEVkaXQsIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpDQoNCiMjIEQgLSBNZXJnZSBMaWZlRXhwSW5jb20gd2l0aCBjb3VudHJ5IHJlZ2lvbiBzbyB0aGF0IHRoZSBmaW5hbCBkYXRhIHNldCBoYXMgaW5mb3JtYXRpb24gYWJvdXQgaW5jb21lLCBsaWZlIGV4cGVjdGFuY3ksIGFuZCBjb3VudHJ5IHJlZ2lvbi4NCkxpZmVJbmNvbUNvdW50IDwtbWVyZ2UoTGlmZUV4cEluY29tLCBDb3VudHJpZXMsIGJ5LnggPSAiQ291bnRyeSIsIGJ5LnkgPSAibmFtZSIsIGFsbC54ID0gVFJVRSkNCg0KIyMgRSAtICBNZXJnZSB0aGUgcHJldmlvdXMgcmVzdWx0aW5nIGRhdGEgc2V0IHdpdGggcG9wdWxhdGlvbiBzaXplIHNvIHRoYXQgdGhlIGZpbmFsIGRhdGEgc2V0IGhhcyBpbmZvcm1hdGlvbiBhYm91dCBpbmNvbWUsIGxpZmUgZXhwZWN0YW5jeSwgcG9wdWxhdGlvbiBzaXplLCBhbmQgY291bnRyeSByZWdpb24uDQpQb3B1bGF0aW9uRWRpdCA8LSBQb3B1bGF0aW9uICU+JQ0KICBnYXRoZXIoa2V5ID0gIlllYXIiLCB2YWx1ZSA9ICJQb3B1bGF0aW9uIiwgLSBnZW8sIG5hLnJtPVRSVUUpDQpuYW1lcyhQb3B1bGF0aW9uRWRpdClbMV0gPC0gIkNvdW50cnkiDQoNCkZpbmFsRGF0YSA8LSBtZXJnZShMaWZlSW5jb21Db3VudCwgUG9wdWxhdGlvbkVkaXQsIGJ5ID0gYygiQ291bnRyeSIsICJZZWFyIikpDQpGaW5hbERhdGEgPC0gc3Vic2V0KEZpbmFsRGF0YSwgc2VsZWN0ID0gLWMoYWxwaGEuMiwgYWxwaGEuMywgY291bnRyeS5jb2RlLCBpc29fMzE2Ni4yLCBzdWIucmVnaW9uLCByZWdpb24uY29kZSwgc3ViLnJlZ2lvbi5jb2RlLCBpbnRlcm1lZGlhdGUucmVnaW9uLmNvZGUsIGludGVybWVkaWF0ZS5yZWdpb24pKQ0KRmluYWxEYXRhJFllYXI8LWdzdWIoIlgiLCIiLCBhcy5jaGFyYWN0ZXIoRmluYWxEYXRhJFllYXIpKQ0KDQojd3JpdGUuY3N2KEZpbmFsRGF0YSwgIkZpbmFsRGF0YS5jc3YiKQ0KDQojIyAzIENyZWF0ZSBhIHN1YnNldCBvZiB0aGUgYWJvdmUgcmVzdWx0aW5nIGxvbmdpdHVkaW5hbCBkYXRhIHNldCB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGRhdGEgb2YgdGhlIHllYXIgMjAwMC9mb250PiAtIG5hbWUgaXQgMjAwMGRhdGEuDQpZMjAwMGRhdGE8LWZpbHRlcihGaW5hbERhdGEsIFllYXI9PTIwMDApDQoNCiNZMjAwMGRhdGEgY29udGFpbnMgMTg3IG9ic2VydmF0aW9ucyBvZiA2IHZhcmlhYmxlcw0KI0ZpbmFsRGF0YSBjb250YWlucyA0MCw0Mzcgb2JzZXJ2YXRpb25zIG9mIDYgdmFyaWFibGVzDQoNCmBgYA0KDQotLS0NCmBgYHtyIGV2YWw9VFJVRX0NCmNvbHMxID0gYygiIzMzMjI4OCIsIiMxMTc3MzMiLCIjNDRBQTk5IiwiIzg4Q0NFRSIsIiNERENDNzciLCIjQ0M2Njc3IikNClkyMDAwUGxvdDwtZ2dwbG90KFkyMDAwZGF0YSwgYWVzKHg9SW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICB5PUxpZmVFeHBlY3RhbmN5LCANCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gUG9wdWxhdGlvbiwgDQogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSByZWdpb24pKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemU9UG9wdWxhdGlvbiwgaWRzID0gQ291bnRyeSksDQogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUsDQogICAgICAgICAgICBhbHBoYSA9IDAuOCkrDQogICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sczEpKw0KICAgIGxhYnModGl0bGUgPSAnUGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYnkgSW5jb21lIGluIDIwMDAnLA0KICAgICAgIHggPSAnSW5jb21lJywNCiAgICAgICB5ID0gJ0xpZmUgRXhwZWN0YW5jeScsDQogICAgICAgbGVnZW5kID0gJ1JlZ2lvbicpKw0KICAgIHRyYW5zaXRpb25fc3RhdGVzKFllYXIpICsNCiAgICBlYXNlX2FlcygnbGluZWFyJykNClkyMDAwUGxvdA0KYGBgDQo8YnI+DQpGaWd1cmUgMTogUGxvdCBvZiBMaWZlIEV4cGVjdGFuY3kgYnkgSW5jb21lIGluIDIwMDAgPGJyPiA8YnI+ICBUaGlzIHBsb3Qgc2hvd3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxpZmUgZXhwZWN0YW5jeSBhbmQgaW5jb21lIGluIHRoZSB5ZWFyIDIwMDAgaW4gdGhlIG1lcmdlZCBkYXRhIHNldC4gVGhlIHBvcHVsYXRpb24gb2YgZWFjaCBjb3VudHJ5IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBkaWFtZXRlciBvZiB0aGUgcG9pbnRzIHBsb3R0ZWQgYW5kIHRoZSBjb2xvciBvZiB0aGUgcG9pbnQgcmVwcmVzZW50cyB0aGUgcmVnaW9uIG9mIHRoZSBjb3VudHJ5LiBBcyBzaG93biBpbiB0aGlzIGZpZ3VyZSwgY291bnRyaWVzIGluIHRoZSByZWdpb25zIG9mIEFtZXJpY2FzIGFuZCBFdXJvcGUgaGF2ZSBhIGhpZ2hlciBsaWZlIGV4cGVjdGFuY3kgdGhhbiBtb3N0IGNvdW50cmllcyBpbiB0aGUgQWZyaWNhIHJlZ2lvbiwgd2l0aCBhIGZldyBvdXRsaWVyIGRhdGEgcG9pbnRzLg0KLS0tDQpgYGB7ciBldmFsPVRSVUV9DQojIyMgRnVsbCBEYXRhIFNldA0KY29sczEgPSBjKCIjMzMyMjg4IiwiIzExNzczMyIsIiM0NEFBOTkiLCIjODhDQ0VFIiwiI0REQ0M3NyIsIiNDQzY2NzciKQ0KQWxsRGF0YVBsb3Q8LWdncGxvdChGaW5hbERhdGEsIGFlcyh4PUluY29tZSwgDQogICAgICAgICAgICAgICAgICAgICAgeT1MaWZlRXhwZWN0YW5jeSwgDQogICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFBvcHVsYXRpb24sIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gcmVnaW9uKSkgKw0KICBnZW9tX3BvaW50KGFlcyhzaXplPVBvcHVsYXRpb24sIGlkcyA9IENvdW50cnkpLA0KICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFLA0KICAgICAgICAgICAgYWxwaGEgPSAwLjgpKw0KICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbHMxKSsNCiAgICBsYWJzKHRpdGxlID0gJ1Bsb3Qgb2YgTGlmZSBFeHBlY3RlbmN5IGJ5IEluY29tZSBhdCBZZWFyOiB7Y2xvc2VzdF9zdGF0ZX0nLA0KICAgICAgIHggPSAnSW5jb21lJywNCiAgICAgICB5ID0gJ0xpZmUgRXhwZWN0YW5jeScsDQogICAgICAgZmlsbCA9ICAnUmVnaW9uJykrDQogICAgdHJhbnNpdGlvbl9zdGF0ZXMoWWVhcikgKw0KICAgIGVhc2VfYWVzKCdsaW5lYXInKQ0KDQphbmltYXRlKEFsbERhdGFQbG90LCByZW5kZXJlciA9IGdpZnNraV9yZW5kZXJlcigpLCByZXdpbmQgPSBGQUxTRSwgbmZyYW1lcyA9IDMwMCwgZnBzID0gMTApDQpgYGANCjxicj4NCkZpZ3VyZSAyOiBQbG90IG9mIExpZmUgRXhwZWN0YW5jeSBieSBJbmNvbWUgZm9yIFllYXJzIDE4MDAtMjAxOCA8YnI+IDxicj4gIFRoaXMgcGxvdCBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbGlmZSBleHBlY3RhbmN5IGFuZCBpbmNvbWUgYWxsIGNvdW50cmllcyBpbiB0aGUgbWVyZ2VkIGRhdGEgc2V0LiBUaGUgcG9wdWxhdGlvbiBvZiBlYWNoIGNvdW50cnkgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGRpYW1ldGVyIG9mIHRoZSBwb2ludHMgcGxvdHRlZCBhbmQgdGhlIGNvbG9yIG9mIHRoZSBwb2ludCByZXByZXNlbnRzIHRoZSByZWdpb24gb2YgdGhlIGNvdW50cnkuIEFzIHNob3duIGluIHRoZSBwbG90LCBhbGwgcmVwcmVzZW50ZWQgY291bnRyaWVzIGluY3JlYXNlIHRoZWlyIGxpZmUgZXhwZWN0YW5jeSBiZXR3ZWVuIHRoZSBnaXZlbiB5ZWFycyBidXQgbm90IGFsbCBjb3VudHJpZXMgc2hvdyBhbiBpbmNyZWFzZSBpbiBpbmNvbWUuIA0KDQoNCg0KDQo=