0.1 Reasearch Question:

Is increase in life expectancy associated with higher economic growth?

The week 2 blackboard discussion triggered my interest in the relationships between economy and life expectancy, as I have mentioned on the discussion board, I believe the strength of a country’s economy is the proxy measure of life expectancy. In this project, I would like to do an analysis to find out if my previous thought of the proxy measure is correct or not. There are many factors may affect the life expectancy. According to the Australian Health department, [linked phrase][https://www1.health.gov.au/internet/publications/publishing.nsf/Content/oatsih-hpf-2012-toc~tier1~life-exp-wellb~119] there are many factors influence the life expectancy, such as socioeconomic status, including employment, income, education and economic welling; the quality of the health system and the ability of people to access it; health behaviors such as tobacco and excessive alcohol consumption, poor nutrition and lack of exercise; social factors; genetic factors; and environmental factors including overcrowded housing, lack of clean drinking water and adequate sanitation. However, the analysis has not mentioned the density of living, Migrants, Land Area, and Medium Age. Therefore, I’d like to find out if these factors affect the life expectancy or not.

0.2 Loading Libraries

library(RCurl)
library(XML)
library(data.table)
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.4     ✓ stringr 1.4.0
## ✓ readr   2.1.1     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::between()   masks data.table::between()
## x tidyr::complete()  masks RCurl::complete()
## x dplyr::filter()    masks stats::filter()
## x dplyr::first()     masks data.table::first()
## x dplyr::lag()       masks stats::lag()
## x dplyr::last()      masks data.table::last()
## x purrr::transpose() masks data.table::transpose()
library(dplyr)
library(imputeTS)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ggplot2)
library(corrplot)
## corrplot 0.92 loaded
library(RColorBrewer)
library(sos)
## Loading required package: brew
## 
## Attaching package: 'sos'
## The following object is masked from 'package:dplyr':
## 
##     matches
## The following object is masked from 'package:tidyr':
## 
##     matches
## The following object is masked from 'package:utils':
## 
##     ?
require(AER)
## Loading required package: AER
## Loading required package: car
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
## Loading required package: lmtest
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following object is masked from 'package:imputeTS':
## 
##     na.locf
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'lmtest'
## The following object is masked from 'package:RCurl':
## 
##     reset
## Loading required package: sandwich
## Loading required package: survival

Data source:

The data are from world bank and worldometers. From these two platform, I’m able to find the datasets that I need to work on this project. The world bank data provides the historical data of GDP per capita and the life expectancy. Also, with wragling the worldometers website data, provides the overall population, density, land area, migrants,urban population in 2020.

https://data.worldbank.org/indicator/SP.DYN.LE00.IN https://data.worldbank.org/indicator/NY.GDP.PCAP.CD?end=2020&start=1960&view=chart https://www.worldometers.info/world-population/population-by-country/

0.2.1 Loading Data

data_gdp<-fread('https://raw.githubusercontent.com/nancunjie4560/Data607/master/Final%20Project/API_NY.GDP.PCAP.CD_DS2_en_csv_v2_3358201%20(1)/API_NY.GDP.PCAP.CD_DS2_en_csv_v2_3358201.csv', header = T)

data_life<-fread('https://raw.githubusercontent.com/nancunjie4560/Data607/master/Final%20Project/API_SP.DYN.LE00.IN_DS2_en_csv_v2_3358200%20(1)/API_SP.DYN.LE00.IN_DS2_en_csv_v2_3358200.csv', header = T)


url<-"https://www.worldometers.info/world-population/population-by-country/"

web<- getURL(url)
data_pop<- htmlParse(web)
data_pop<-readHTMLTable(data_pop)
data_pop<-as.data.frame(data_pop)

0.3 Feature Engineering

My target is the top 10 life expectancy countries from data_life in 2005. Select top 10 life expectancy countries, and limited year to 2019.

life<-data_life%>%
      group_by(`Country Name`)%>%
      arrange(desc(`2019`))

life<-life[1:12,c(1,64)]

The data shows the top 10 countries that have the longest life expectancies are Hong Kong, Japan, Macao, Switzerland, Singapore, Spain, Korean, Italy, Channel Islands, Liechtenstein. From the above list, I’m going to extract these countries GDP per capita data from data_gdp and data_pop.

gdp<-data_gdp%>%
    filter(`Country Code` %in% c('HKG','JPN','MAC','CHE','SGP','ESP','KOR','ITA','CHI','LIE','SWE','NOR'))

gdp<-gdp[1:12,c(1,64)]

Extract the same 10 countries from data_pop.

pop<-data_pop%>%
  rename(`Country Name`= example2.Country..or.dependency. ,
         `Population`= example2.Population..2020.,
         `Yearly Change`= example2.Yearly.Change,
         `Net Change`= example2.Net.Change,
         `Density` = example2.Density..P.KmÂ..,
         `Area` = example2.Land.Area..KmÂ..,
         `Migrants` = example2.Migrants..net. ,
         `Furtality` = example2.Fert..Rate,
         `Median Age` = example2.Med..Age ,
         `Urban Population` = example2.Urban.Pop.. ,
         `World Share` = example2.World.Share)


pop<-pop%>%
    filter(`Country Name` %in% c('Hong Kong','Japan','Macao','Channel Islands','Singapore','Spain','South Korea','Italy','Switzerland','Liechtenstein','Sweden','Norway'))

gather the three data variables in to one set. dropped Liechtenstein and Channel Islands due to missing GDP per capita data.

life_gdp<-merge(life,gdp, by='Country Name')
pop[3,2]<- life_gdp[5,1]
pop[7,2]<- life_gdp[2,1]
pop[10,2]<- life_gdp[7,1]
data_total<-merge(pop,life_gdp, by='Country Name')
data_total<-data_total[-c(1,6),-c(2,11)]




data_total<- data_total %>%
  rename(`Life Expectancy` = `2019.x`,
         `GDP per Capita` = `2019.y`)

0.4 Correlation

data_total[] <- lapply(data_total, gsub, pattern =",", replacement = "")
data_total[] <- lapply(data_total, gsub, pattern ="%", replacement = "")


data <- as.data.frame(sapply(data_total, as.numeric),na.omit=T)
## Warning in lapply(X = X, FUN = FUN, ...): NAs introduced by coercion
data[,1]<-data_total[,1]

cor(data$`GDP per Capita`,data$`Life Expectancy`)
## [1] 0.06798173
matrix<-cor(data[c(1:10),c(2:12)])
corrplot(matrix, type="lower", order="hclust",
         col=brewer.pal(n=10, name="RdYlBu"))

cor(data$`Life Expectancy`,data$Density)
## [1] 0.4808088

According to the Correlation matrix and plot, density shows positively correlated with correction of 0.4, and the GDP per capita shows as almost flat with correlation 0.06

0.5 Linear Model

linear_model<- lm(`Life Expectancy` ~ Density + Area + Migrants + `Median Age` + `World Share` + `GDP per Capita`, data = data)
linear_model
## 
## Call:
## lm(formula = `Life Expectancy` ~ Density + Area + Migrants + 
##     `Median Age` + `World Share` + `GDP per Capita`, data = data)
## 
## Coefficients:
##      (Intercept)           Density              Area          Migrants  
##        6.197e+01         8.075e-05         1.188e-06        -1.180e-05  
##     `Median Age`     `World Share`  `GDP per Capita`  
##        4.787e-01        -7.652e-01         2.217e-05
model_sum<-summary(linear_model)
MSE<-mean(model_sum$residuals^2)
MSE
## [1] 0.04640895

According to the calculation, the Mean Square Error for this linear model is 0.046 which is pretty small number that is closed to 0.

0.6 Conclusion

In conclusion, the linear regression model tells that the GDP per capita is not statistically significant in this model. However, The variables, such as Density, Migrants, Median Age are positively correlated with Life Expectancy. Therefore, I cannot confirm that the GDP per capita affects the Life Expectancy in this case. Next time, I’d like to expend the data set, and I believe it may gives me a different result.

LS0tCnRpdGxlOiAiREFUQTYwN19GaW5hbCBQcm9qZWN0X0NodW5qaWVfTmFuIgphdXRob3I6ICJDaHVuamllIE5hbiIKZGF0ZTogIjEyLzQvMjAyMSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGhpZ2hsaWdodDogcHlnbWVudHMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCgojIyBSZWFzZWFyY2ggUXVlc3Rpb246CioqSXMgaW5jcmVhc2UgaW4gbGlmZSBleHBlY3RhbmN5IGFzc29jaWF0ZWQgd2l0aCBoaWdoZXIgZWNvbm9taWMgZ3Jvd3RoPyoqCgpUaGUgd2VlayAyIGJsYWNrYm9hcmQgZGlzY3Vzc2lvbiB0cmlnZ2VyZWQgbXkgaW50ZXJlc3QgaW4gdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBlY29ub215IGFuZCBsaWZlIGV4cGVjdGFuY3ksIGFzIEkgaGF2ZSBtZW50aW9uZWQgb24gdGhlIGRpc2N1c3Npb24gYm9hcmQsIEkgYmVsaWV2ZSB0aGUgc3RyZW5ndGggb2YgYSBjb3VudHJ54oCZcyBlY29ub215IGlzIHRoZSBwcm94eSBtZWFzdXJlIG9mIGxpZmUgZXhwZWN0YW5jeS4gSW4gdGhpcyBwcm9qZWN0LCBJIHdvdWxkIGxpa2UgdG8gZG8gYW4gYW5hbHlzaXMgdG8gZmluZCBvdXQgaWYgbXkgcHJldmlvdXMgdGhvdWdodCBvZiB0aGUgcHJveHkgbWVhc3VyZSBpcyBjb3JyZWN0IG9yIG5vdC4KVGhlcmUgYXJlIG1hbnkgZmFjdG9ycyBtYXkgYWZmZWN0IHRoZSBsaWZlIGV4cGVjdGFuY3kuIEFjY29yZGluZyB0byB0aGUgQXVzdHJhbGlhbiBIZWFsdGggZGVwYXJ0bWVudCwgIFtsaW5rZWQgcGhyYXNlXVtodHRwczovL3d3dzEuaGVhbHRoLmdvdi5hdS9pbnRlcm5ldC9wdWJsaWNhdGlvbnMvcHVibGlzaGluZy5uc2YvQ29udGVudC9vYXRzaWgtaHBmLTIwMTItdG9jfnRpZXIxfmxpZmUtZXhwLXdlbGxifjExOV0gdGhlcmUgYXJlIG1hbnkgZmFjdG9ycyBpbmZsdWVuY2UgdGhlIGxpZmUgZXhwZWN0YW5jeSwgc3VjaCBhcyBzb2Npb2Vjb25vbWljIHN0YXR1cywgaW5jbHVkaW5nIGVtcGxveW1lbnQsIGluY29tZSwgZWR1Y2F0aW9uIGFuZCBlY29ub21pYyB3ZWxsaW5nOyB0aGUgcXVhbGl0eSBvZiB0aGUgaGVhbHRoIHN5c3RlbSBhbmQgdGhlIGFiaWxpdHkgb2YgcGVvcGxlIHRvIGFjY2VzcyBpdDsgaGVhbHRoIGJlaGF2aW9ycyBzdWNoIGFzIHRvYmFjY28gYW5kIGV4Y2Vzc2l2ZSBhbGNvaG9sIGNvbnN1bXB0aW9uLCBwb29yIG51dHJpdGlvbiBhbmQgbGFjayBvZiBleGVyY2lzZTsgc29jaWFsIGZhY3RvcnM7IGdlbmV0aWMgZmFjdG9yczsgYW5kIGVudmlyb25tZW50YWwgZmFjdG9ycyBpbmNsdWRpbmcgb3ZlcmNyb3dkZWQgaG91c2luZywgbGFjayBvZiBjbGVhbiBkcmlua2luZyB3YXRlciBhbmQgYWRlcXVhdGUgc2FuaXRhdGlvbi4gSG93ZXZlciwgdGhlIGFuYWx5c2lzIGhhcyBub3QgbWVudGlvbmVkIHRoZSBkZW5zaXR5IG9mIGxpdmluZywgTWlncmFudHMsIExhbmQgQXJlYSwgYW5kIE1lZGl1bSBBZ2UuIFRoZXJlZm9yZSwgSSdkIGxpa2UgdG8gZmluZCBvdXQgaWYgdGhlc2UgZmFjdG9ycyBhZmZlY3QgdGhlIGxpZmUgZXhwZWN0YW5jeSBvciBub3QuIAoKCiMjIExvYWRpbmcgTGlicmFyaWVzCmBgYHtyfQpsaWJyYXJ5KFJDdXJsKQpsaWJyYXJ5KFhNTCkKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShpbXB1dGVUUykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShzb3MpCnJlcXVpcmUoQUVSKQpgYGAKCgoKCgoqRGF0YSBzb3VyY2UqOgoKVGhlIGRhdGEgYXJlIGZyb20gd29ybGQgYmFuayBhbmQgd29ybGRvbWV0ZXJzLiBGcm9tIHRoZXNlIHR3byBwbGF0Zm9ybSwgSSdtIGFibGUgdG8gZmluZCB0aGUgZGF0YXNldHMgdGhhdCBJIG5lZWQgdG8gd29yayBvbiB0aGlzIHByb2plY3QuIFRoZSB3b3JsZCBiYW5rIGRhdGEgcHJvdmlkZXMgdGhlIGhpc3RvcmljYWwgZGF0YSBvZiBHRFAgcGVyIGNhcGl0YSBhbmQgdGhlIGxpZmUgZXhwZWN0YW5jeS4gQWxzbywgd2l0aCB3cmFnbGluZyB0aGUgd29ybGRvbWV0ZXJzIHdlYnNpdGUgZGF0YSwgcHJvdmlkZXMgdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiwgZGVuc2l0eSwgbGFuZCBhcmVhLCBtaWdyYW50cyx1cmJhbiBwb3B1bGF0aW9uIGluIDIwMjAuIAoKaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLkRZTi5MRTAwLklOCmh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9OWS5HRFAuUENBUC5DRD9lbmQ9MjAyMCZzdGFydD0xOTYwJnZpZXc9Y2hhcnQKaHR0cHM6Ly93d3cud29ybGRvbWV0ZXJzLmluZm8vd29ybGQtcG9wdWxhdGlvbi9wb3B1bGF0aW9uLWJ5LWNvdW50cnkvCgoKIyMjIExvYWRpbmcgRGF0YQoKYGBge3J9CgoKZGF0YV9nZHA8LWZyZWFkKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbmFuY3VuamllNDU2MC9EYXRhNjA3L21hc3Rlci9GaW5hbCUyMFByb2plY3QvQVBJX05ZLkdEUC5QQ0FQLkNEX0RTMl9lbl9jc3ZfdjJfMzM1ODIwMSUyMCgxKS9BUElfTlkuR0RQLlBDQVAuQ0RfRFMyX2VuX2Nzdl92Ml8zMzU4MjAxLmNzdicsIGhlYWRlciA9IFQpCgpkYXRhX2xpZmU8LWZyZWFkKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbmFuY3VuamllNDU2MC9EYXRhNjA3L21hc3Rlci9GaW5hbCUyMFByb2plY3QvQVBJX1NQLkRZTi5MRTAwLklOX0RTMl9lbl9jc3ZfdjJfMzM1ODIwMCUyMCgxKS9BUElfU1AuRFlOLkxFMDAuSU5fRFMyX2VuX2Nzdl92Ml8zMzU4MjAwLmNzdicsIGhlYWRlciA9IFQpCgoKdXJsPC0iaHR0cHM6Ly93d3cud29ybGRvbWV0ZXJzLmluZm8vd29ybGQtcG9wdWxhdGlvbi9wb3B1bGF0aW9uLWJ5LWNvdW50cnkvIgoKd2ViPC0gZ2V0VVJMKHVybCkKZGF0YV9wb3A8LSBodG1sUGFyc2Uod2ViKQpkYXRhX3BvcDwtcmVhZEhUTUxUYWJsZShkYXRhX3BvcCkKZGF0YV9wb3A8LWFzLmRhdGEuZnJhbWUoZGF0YV9wb3ApCgpgYGAKCgojIyBGZWF0dXJlIEVuZ2luZWVyaW5nCgpNeSB0YXJnZXQgaXMgdGhlIHRvcCAxMCBsaWZlIGV4cGVjdGFuY3kgY291bnRyaWVzIGZyb20gZGF0YV9saWZlIGluIDIwMDUuIApTZWxlY3QgdG9wIDEwIGxpZmUgZXhwZWN0YW5jeSBjb3VudHJpZXMsIGFuZCBsaW1pdGVkIHllYXIgdG8gMjAxOS4KYGBge3J9CgpsaWZlPC1kYXRhX2xpZmUlPiUKICAgICAgZ3JvdXBfYnkoYENvdW50cnkgTmFtZWApJT4lCiAgICAgIGFycmFuZ2UoZGVzYyhgMjAxOWApKQoKbGlmZTwtbGlmZVsxOjEyLGMoMSw2NCldCgoKYGBgCgpUaGUgZGF0YSBzaG93cyB0aGUgdG9wIDEwIGNvdW50cmllcyB0aGF0IGhhdmUgdGhlIGxvbmdlc3QgbGlmZSBleHBlY3RhbmNpZXMgYXJlIEhvbmcgS29uZywgSmFwYW4sIE1hY2FvLCBTd2l0emVybGFuZCwgU2luZ2Fwb3JlLCBTcGFpbiwgS29yZWFuLCBJdGFseSwgQ2hhbm5lbCBJc2xhbmRzLCBMaWVjaHRlbnN0ZWluLgpGcm9tIHRoZSBhYm92ZSBsaXN0LCBJJ20gZ29pbmcgdG8gZXh0cmFjdCB0aGVzZSBjb3VudHJpZXMgR0RQIHBlciBjYXBpdGEgZGF0YSBmcm9tIGRhdGFfZ2RwIGFuZCBkYXRhX3BvcC4KCmBgYHtyfQpnZHA8LWRhdGFfZ2RwJT4lCiAgICBmaWx0ZXIoYENvdW50cnkgQ29kZWAgJWluJSBjKCdIS0cnLCdKUE4nLCdNQUMnLCdDSEUnLCdTR1AnLCdFU1AnLCdLT1InLCdJVEEnLCdDSEknLCdMSUUnLCdTV0UnLCdOT1InKSkKCmdkcDwtZ2RwWzE6MTIsYygxLDY0KV0KCgoKYGBgCgoKRXh0cmFjdCB0aGUgc2FtZSAxMCBjb3VudHJpZXMgZnJvbSBkYXRhX3BvcC4KCmBgYHtyfQpwb3A8LWRhdGFfcG9wJT4lCiAgcmVuYW1lKGBDb3VudHJ5IE5hbWVgPSBleGFtcGxlMi5Db3VudHJ5Li5vci5kZXBlbmRlbmN5LiAsCiAgICAgICAgIGBQb3B1bGF0aW9uYD0gZXhhbXBsZTIuUG9wdWxhdGlvbi4uMjAyMC4sCiAgICAgICAgIGBZZWFybHkgQ2hhbmdlYD0gZXhhbXBsZTIuWWVhcmx5LkNoYW5nZSwKICAgICAgICAgYE5ldCBDaGFuZ2VgPSBleGFtcGxlMi5OZXQuQ2hhbmdlLAogICAgICAgICBgRGVuc2l0eWAgPSBleGFtcGxlMi5EZW5zaXR5Li5QLkttw4IuLiwKICAgICAgICAgYEFyZWFgID0gZXhhbXBsZTIuTGFuZC5BcmVhLi5LbcOCLi4sCiAgICAgICAgIGBNaWdyYW50c2AgPSBleGFtcGxlMi5NaWdyYW50cy4ubmV0LiAsCiAgICAgICAgIGBGdXJ0YWxpdHlgID0gZXhhbXBsZTIuRmVydC4uUmF0ZSwKICAgICAgICAgYE1lZGlhbiBBZ2VgID0gZXhhbXBsZTIuTWVkLi5BZ2UgLAogICAgICAgICBgVXJiYW4gUG9wdWxhdGlvbmAgPSBleGFtcGxlMi5VcmJhbi5Qb3AuLiAsCiAgICAgICAgIGBXb3JsZCBTaGFyZWAgPSBleGFtcGxlMi5Xb3JsZC5TaGFyZSkKCgpwb3A8LXBvcCU+JQogICAgZmlsdGVyKGBDb3VudHJ5IE5hbWVgICVpbiUgYygnSG9uZyBLb25nJywnSmFwYW4nLCdNYWNhbycsJ0NoYW5uZWwgSXNsYW5kcycsJ1NpbmdhcG9yZScsJ1NwYWluJywnU291dGggS29yZWEnLCdJdGFseScsJ1N3aXR6ZXJsYW5kJywnTGllY2h0ZW5zdGVpbicsJ1N3ZWRlbicsJ05vcndheScpKQoKYGBgCgoKCmdhdGhlciB0aGUgdGhyZWUgZGF0YSB2YXJpYWJsZXMgaW4gdG8gb25lIHNldC4gCmRyb3BwZWQgTGllY2h0ZW5zdGVpbiBhbmQgQ2hhbm5lbCBJc2xhbmRzIGR1ZSB0byBtaXNzaW5nIEdEUCBwZXIgY2FwaXRhIGRhdGEuCmBgYHtyfQoKbGlmZV9nZHA8LW1lcmdlKGxpZmUsZ2RwLCBieT0nQ291bnRyeSBOYW1lJykKcG9wWzMsMl08LSBsaWZlX2dkcFs1LDFdCnBvcFs3LDJdPC0gbGlmZV9nZHBbMiwxXQpwb3BbMTAsMl08LSBsaWZlX2dkcFs3LDFdCmRhdGFfdG90YWw8LW1lcmdlKHBvcCxsaWZlX2dkcCwgYnk9J0NvdW50cnkgTmFtZScpCmRhdGFfdG90YWw8LWRhdGFfdG90YWxbLWMoMSw2KSwtYygyLDExKV0KCgoKCmRhdGFfdG90YWw8LSBkYXRhX3RvdGFsICU+JQogIHJlbmFtZShgTGlmZSBFeHBlY3RhbmN5YCA9IGAyMDE5LnhgLAogICAgICAgICBgR0RQIHBlciBDYXBpdGFgID0gYDIwMTkueWApCgoKYGBgCgoKIyMgQ29ycmVsYXRpb24KYGBge3J9CmRhdGFfdG90YWxbXSA8LSBsYXBwbHkoZGF0YV90b3RhbCwgZ3N1YiwgcGF0dGVybiA9IiwiLCByZXBsYWNlbWVudCA9ICIiKQpkYXRhX3RvdGFsW10gPC0gbGFwcGx5KGRhdGFfdG90YWwsIGdzdWIsIHBhdHRlcm4gPSIlIiwgcmVwbGFjZW1lbnQgPSAiIikKCgpkYXRhIDwtIGFzLmRhdGEuZnJhbWUoc2FwcGx5KGRhdGFfdG90YWwsIGFzLm51bWVyaWMpLG5hLm9taXQ9VCkKZGF0YVssMV08LWRhdGFfdG90YWxbLDFdCgpjb3IoZGF0YSRgR0RQIHBlciBDYXBpdGFgLGRhdGEkYExpZmUgRXhwZWN0YW5jeWApCm1hdHJpeDwtY29yKGRhdGFbYygxOjEwKSxjKDI6MTIpXSkKY29ycnBsb3QobWF0cml4LCB0eXBlPSJsb3dlciIsIG9yZGVyPSJoY2x1c3QiLAogICAgICAgICBjb2w9YnJld2VyLnBhbChuPTEwLCBuYW1lPSJSZFlsQnUiKSkKY29yKGRhdGEkYExpZmUgRXhwZWN0YW5jeWAsZGF0YSREZW5zaXR5KQoKYGBgCgpBY2NvcmRpbmcgdG8gdGhlIENvcnJlbGF0aW9uIG1hdHJpeCBhbmQgcGxvdCwgZGVuc2l0eSBzaG93cyBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBjb3JyZWN0aW9uIG9mIDAuNCwgYW5kIHRoZSBHRFAgcGVyIGNhcGl0YSBzaG93cyBhcyBhbG1vc3QgZmxhdCB3aXRoIGNvcnJlbGF0aW9uIDAuMDYKCgoKCgojIyBMaW5lYXIgTW9kZWwKCmBgYHtyfQpsaW5lYXJfbW9kZWw8LSBsbShgTGlmZSBFeHBlY3RhbmN5YCB+IERlbnNpdHkgKyBBcmVhICsgTWlncmFudHMgKyBgTWVkaWFuIEFnZWAgKyBgV29ybGQgU2hhcmVgICsgYEdEUCBwZXIgQ2FwaXRhYCwgZGF0YSA9IGRhdGEpCmxpbmVhcl9tb2RlbAptb2RlbF9zdW08LXN1bW1hcnkobGluZWFyX21vZGVsKQpNU0U8LW1lYW4obW9kZWxfc3VtJHJlc2lkdWFsc14yKQpNU0UKCgpgYGAKQWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbiwgdGhlIE1lYW4gU3F1YXJlIEVycm9yIGZvciB0aGlzIGxpbmVhciBtb2RlbCBpcyAwLjA0NiB3aGljaCBpcyBwcmV0dHkgc21hbGwgbnVtYmVyIHRoYXQgaXMgY2xvc2VkIHRvIDAuCgoKCgoKIyMgQ29uY2x1c2lvbiAKCkluIGNvbmNsdXNpb24sIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0ZWxscyB0aGF0IHRoZSBHRFAgcGVyIGNhcGl0YSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiB0aGlzIG1vZGVsLgpIb3dldmVyLCBUaGUgdmFyaWFibGVzLCBzdWNoIGFzIERlbnNpdHksIE1pZ3JhbnRzLCBNZWRpYW4gQWdlIGFyZSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBMaWZlIEV4cGVjdGFuY3kuIFRoZXJlZm9yZSwgSSBjYW5ub3QgY29uZmlybSB0aGF0IHRoZSBHRFAgcGVyIGNhcGl0YSBhZmZlY3RzIHRoZSBMaWZlIEV4cGVjdGFuY3kgaW4gdGhpcyBjYXNlLiBOZXh0IHRpbWUsIEknZCBsaWtlIHRvIGV4cGVuZCB0aGUgZGF0YSBzZXQsIGFuZCBJIGJlbGlldmUgaXQgbWF5IGdpdmVzIG1lIGEgZGlmZmVyZW50IHJlc3VsdC4gCgoKIA==