Setup


# Load the necessary packages required to reproduce the report. For example:


library(magrittr)
library(knitr) 
library(kableExtra)
library(readr) 
library(tidyr)
library(dplyr)
library(magrittr) 
library(stringi)  
library(editrules)

Student names, numbers and percentage of contributions



Executive Summary

#The goal of this report is to process data before it is used by  understanding, organising, manipulating, scanning, and adjusting data.Country wise malnutrition and life expectancy datasets are used and merged on the common column ‘Country’. For numeric variables, the box plot is made using Tukey’s method for finding outliers.
#Histograms are used to look at how all numerical variables are spread out.Make sure that the data is free of mistakes, fits together well, and is ready for further statistical analysis.

Data

Dataset 1 ‘country wise life expectancy’ URL: https://www.kaggle.com/amansaxena/lifeexpectancy?select=Life_expectancy_dataset.csv

Dataset 2 ‘malnutrition data of various countries’ URL: https://www.kaggle.com/ruchi798/malnutrition-across-the-globe?select=country-wise-average.csv


# 1st Dataset
LE_df1 <- read_csv("Life_expectancy_dataset.csv")
spec(LE_df1)

colnames(LE_df1)[4] <- "Male_life" # Rename column  
colnames(LE_df1)[5] <- "Female_life" # Rename column 
# "Overall Life" column is not required
LE_df1 <- LE_df1[ -c(3) ] 

knitr::kable(head(LE_df1), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))

#convert to tidy format and check last rows
LE_df1_tidy <- pivot_longer(LE_df1, names_to = "Gender", values_to = "Life Expectancy", cols = 3:4)
LE_df1_tidy$Country <-  stringi::stri_trans_toupper(LE_df1_tidy$Country) 

knitr::kable(tail(LE_df1_tidy), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped")) 

# 2nd Dataset
CW_df2 <- read_csv("country-wise-average.csv")
spec(CW_df2)

knitr::kable(head(CW_df2), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))  

#finding malnutrition and life expectancy across countries.
df_merged <- left_join(CW_df2,LE_df1_tidy,by="Country")
#check last rows of merged dataset
knitr::kable(tail(df_merged), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))



Understand

I will look at the data and try to figure out what it means by checking its size, attributes, and structure. Then I’ll go ahead and change the type of the columns when necessary.

# This is the R chunk for the Understand Section

spec(df_merged)
str(df_merged)
#Continent, Gender and Income Classification seemed to have wrong classifications and fix them
df_merged$Continent <- factor(df_merged$Continent,
                              levels = c('Africa', 'Europe', 'Asia', 'Oceania', 'North America', 'South America')) 
df_merged$Gender <- factor(df_merged$Gender,
                           levels = c('Male', 'Female'))

df_merged$'Income Classification' <- factor(df_merged$'Income Classification',
                                            levels = c(0,1,2,3),
                                            labels = c('Low Income', 'Lower Middle Income', 'Upper Middle Income', 'High Income'),
                                            ordered = TRUE) 
attributes(df_merged)

Tidy & Manipulate Data I

# Before merging it with data set 2, the steps needed to clean up the data have already been taken. Please look at the section "Data."
# refer Line 26 above : reshaped the data into tidy format (this is for 'Tidy & Manipulate Data I' section)



Tidy & Manipulate Data II

# This is the R chunk for the Tidy & Manipulate Data II 
# To figure out how many children under 5 years old are either underweight or overweight, new column is created 
df_mutated <- mutate(df_merged, 'Under5 Weight Population'=(df_merged$Underweight+df_merged$Overweight)*df_merged$"U5 Population ('000s)"/100)

kable(tail(df_mutated[c(1,2,5,7,8,11:13)]), format = "html", align = 'l')%>%
kable_styling(bootstrap_options = c("striped"))



Scan I

Missing values are scanned and omitted at this step


sapply(df_merged, function(x) sum( is.na(x) ))

#Removing missing data values and no special values are found
df_merged <- df_merged[complete.cases(df_merged), ]
sapply(df_merged, function(x) sum( is.na(x) ))



Scan II

Box plot for each of the numerical variables using Tukey’s method for finding outliers.



colnames(df_merged)[8] <- "Under 5 Population in thousands" 

df_merged$'Under 5 Population in thousands' %>% boxplot(main="Under 5 years Population in thousands", ylab="Population", col = "red")  


#Plot stunting percentage and life expectancy
par(mfrow=c(1,2))
df_merged$Stunting %>% boxplot(main="Stunting %", ylab="Percentage", col = "red")
df_merged$`Life Expectancy` %>% boxplot(main="Life expectancy", ylab="Age", col = "red")
par(mfrow=c(1,1)) 

#Plot numerical variables
par(mfrow=c(2,2))
df_merged$'Severe Wasting' %>% boxplot(main="Severe Wasting %", ylab="Percentage",col = "red")
df_merged$'Wasting' %>% boxplot(main="Wasting %", ylab="Percentage", col = "red")
df_merged$`Overweight` %>% boxplot(main="Over weight %", ylab="Percentage", col = "red")
df_merged$`Underweight` %>% boxplot(main="Under weight %", ylab="Percentage", col = "red")

par(mfrow=c(1,1))

par(mfrow=c(1,2))
df_merged$Stunting %>% boxplot(main="Stunting %", ylab="Percentage", col = "red")
df_merged$`Life Expectancy` %>% boxplot(main="Life expectancy", ylab="Age", col = "red")
par(mfrow=c(1,1))



Transform

#Check out the histograms of all the number values and choose variable “wasting” as transformation #Square root transformation gives a better response than the log transformation.

#explore the histograms of all the numerical variables.
par(mfrow =c(3,3))

under5_population <-  df_merged$`Under 5 Population in thousands`
hist(under5_population)

under_weight <- df_merged$`Underweight`
hist(under_weight)

over_weight<- df_merged$`Overweight`
hist(over_weight)

wasting <- df_merged$`Wasting`
hist(wasting)

severe_wasting <- df_merged$`Severe Wasting`
hist(severe_wasting)

stunting <- df_merged$Stunting
hist(stunting)

life_expectancy <- df_merged$`Life Expectancy`
hist(life_expectancy)
par(mfrow=c(1,1))


# convert the distribution into a normal distribution
sqrt_wasting <- sqrt(wasting)
hist(sqrt_wasting)

# reduce the right skewness
log_wasting <- log10(wasting)
hist(log_wasting)

ln_wasting <- log(wasting)
hist(ln_wasting)



LS0tDQp0aXRsZTogIkRhdGEgV3JhbmdsaW5nIChEYXRhIFByZXByb2Nlc3NpbmcpIg0KYXV0aG9yOiAiRUkgVEhJUkkgTFdJTiINCnN1YnRpdGxlOiBQcmFjdGljYWwgYXNzZXNzbWVudCAyDQpkYXRlOiAiMyBPQ1QgMjAyMiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCi0tLQ0KDQoNCiMjICoqU2V0dXAqKg0KDQpgYGB7cn0NCg0KIyBMb2FkIHRoZSBuZWNlc3NhcnkgcGFja2FnZXMgcmVxdWlyZWQgdG8gcmVwcm9kdWNlIHRoZSByZXBvcnQuIEZvciBleGFtcGxlOg0KDQoNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGtuaXRyKSANCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkocmVhZHIpIA0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KG1hZ3JpdHRyKSANCmxpYnJhcnkoc3RyaW5naSkgIA0KbGlicmFyeShlZGl0cnVsZXMpDQpgYGANCg0KDQojIyAqKlN0dWRlbnQgbmFtZXMsIG51bWJlcnMgYW5kIHBlcmNlbnRhZ2Ugb2YgY29udHJpYnV0aW9ucyoqDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KDQpuYTwtIGMoIkVJIFRISVJJIExXSU4iKQ0Kbm88LSBjKCJTMzg2NjM2MCIpDQpwYzwtIGMoIjEwMCUiKQ0KDQpzPC0gZGF0YS5mcmFtZShjYmluZChuYSxubyxwYykpDQpjb2xuYW1lcyhzKTwtIGMoIlN0dWRlbnQgbmFtZSIsICJTdHVkZW50IG51bWJlciIsICJQZXJjZW50YWdlIG9mIGNvbnRyaWJ1dGlvbiIpDQoNCnMgJT4lIGtibChjYXB0aW9uID0gIkluZGl2aWR1YWwiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIkNhbWJyaWEiKQ0KDQpgYGANCjxicj4NCjxicj4NCg0KIyMgKipFeGVjdXRpdmUgU3VtbWFyeSoqDQoNCiNUaGUgZ29hbCBvZiB0aGlzIHJlcG9ydCBpcyB0byBwcm9jZXNzIGRhdGEgYmVmb3JlIGl0IGlzIHVzZWQgYnnCoCB1bmRlcnN0YW5kaW5nLCBvcmdhbmlzaW5nLCBtYW5pcHVsYXRpbmcsIHNjYW5uaW5nLCBhbmQgYWRqdXN0aW5nIGRhdGEuQ291bnRyeSB3aXNlIG1hbG51dHJpdGlvbiBhbmQgbGlmZSBleHBlY3RhbmN5IGRhdGFzZXRzIGFyZSB1c2VkIGFuZCBtZXJnZWQgb24gdGhlIGNvbW1vbiBjb2x1bW4g4oCYQ291bnRyeeKAmS4gRm9yIG51bWVyaWMgdmFyaWFibGVzLCB0aGUgYm94IHBsb3QgaXMgbWFkZSB1c2luZyBUdWtleSdzIG1ldGhvZCBmb3IgZmluZGluZyBvdXRsaWVycy4NCjxicj4NCiNIaXN0b2dyYW1zIGFyZSB1c2VkIHRvIGxvb2sgYXQgaG93IGFsbCBudW1lcmljYWwgdmFyaWFibGVzIGFyZSBzcHJlYWQgb3V0Lk1ha2Ugc3VyZSB0aGF0IHRoZSBkYXRhIGlzIGZyZWUgb2YgbWlzdGFrZXMsIGZpdHMgdG9nZXRoZXIgd2VsbCwgYW5kIGlzIHJlYWR5IGZvciBmdXJ0aGVyIHN0YXRpc3RpY2FsIGFuYWx5c2lzLg0KPGJyPg0KDQojIyAqKkRhdGEqKg0KDQpEYXRhc2V0IDEgJ2NvdW50cnkgd2lzZSBsaWZlIGV4cGVjdGFuY3knDQpVUkw6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vYW1hbnNheGVuYS9saWZlZXhwZWN0YW5jeT9zZWxlY3Q9TGlmZV9leHBlY3RhbmN5X2RhdGFzZXQuY3N2DQoNCg0KRGF0YXNldCAyICdtYWxudXRyaXRpb24gZGF0YSBvZiB2YXJpb3VzIGNvdW50cmllcyAnDQpVUkw6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcnVjaGk3OTgvbWFsbnV0cml0aW9uLWFjcm9zcy10aGUtZ2xvYmU/c2VsZWN0PWNvdW50cnktd2lzZS1hdmVyYWdlLmNzdg0KDQpgYGB7cn0NCg0KIyAxc3QgRGF0YXNldA0KTEVfZGYxIDwtIHJlYWRfY3N2KCJMaWZlX2V4cGVjdGFuY3lfZGF0YXNldC5jc3YiKQ0Kc3BlYyhMRV9kZjEpDQoNCmNvbG5hbWVzKExFX2RmMSlbNF0gPC0gIk1hbGVfbGlmZSIgIyBSZW5hbWUgY29sdW1uICANCmNvbG5hbWVzKExFX2RmMSlbNV0gPC0gIkZlbWFsZV9saWZlIiAjIFJlbmFtZSBjb2x1bW4gDQojICJPdmVyYWxsIExpZmUiIGNvbHVtbiBpcyBub3QgcmVxdWlyZWQNCkxFX2RmMSA8LSBMRV9kZjFbIC1jKDMpIF0gDQoNCmtuaXRyOjprYWJsZShoZWFkKExFX2RmMSksIGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSAnbCcpJT4lDQprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIpKQ0KDQojY29udmVydCB0byB0aWR5IGZvcm1hdCBhbmQgY2hlY2sgbGFzdCByb3dzDQpMRV9kZjFfdGlkeSA8LSBwaXZvdF9sb25nZXIoTEVfZGYxLCBuYW1lc190byA9ICJHZW5kZXIiLCB2YWx1ZXNfdG8gPSAiTGlmZSBFeHBlY3RhbmN5IiwgY29scyA9IDM6NCkNCkxFX2RmMV90aWR5JENvdW50cnkgPC0gIHN0cmluZ2k6OnN0cmlfdHJhbnNfdG91cHBlcihMRV9kZjFfdGlkeSRDb3VudHJ5KSANCg0Ka25pdHI6OmthYmxlKHRhaWwoTEVfZGYxX3RpZHkpLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gJ2wnKSU+JQ0Ka2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiKSkgDQoNCiMgMm5kIERhdGFzZXQNCkNXX2RmMiA8LSByZWFkX2NzdigiY291bnRyeS13aXNlLWF2ZXJhZ2UuY3N2IikNCnNwZWMoQ1dfZGYyKQ0KDQprbml0cjo6a2FibGUoaGVhZChDV19kZjIpLCBmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gJ2wnKSU+JQ0Ka2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiKSkgIA0KDQojZmluZGluZyBtYWxudXRyaXRpb24gYW5kIGxpZmUgZXhwZWN0YW5jeSBhY3Jvc3MgY291bnRyaWVzLg0KZGZfbWVyZ2VkIDwtIGxlZnRfam9pbihDV19kZjIsTEVfZGYxX3RpZHksYnk9IkNvdW50cnkiKQ0KI2NoZWNrIGxhc3Qgcm93cyBvZiBtZXJnZWQgZGF0YXNldA0Ka25pdHI6OmthYmxlKHRhaWwoZGZfbWVyZ2VkKSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICdsJyklPiUNCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMgKipVbmRlcnN0YW5kKiogDQoNCkkgd2lsbCBsb29rIGF0IHRoZSBkYXRhIGFuZCB0cnkgdG8gZmlndXJlIG91dCB3aGF0IGl0IG1lYW5zIGJ5IGNoZWNraW5nIGl0cyBzaXplLCBhdHRyaWJ1dGVzLCBhbmQgc3RydWN0dXJlLiBUaGVuIEknbGwgZ28gYWhlYWQgYW5kIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgY29sdW1ucyB3aGVuIG5lY2Vzc2FyeS4NCjxicj4NCjxicj4NCg0KYGBge3J9DQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSBVbmRlcnN0YW5kIFNlY3Rpb24NCg0Kc3BlYyhkZl9tZXJnZWQpDQpzdHIoZGZfbWVyZ2VkKQ0KI0NvbnRpbmVudCwgR2VuZGVyIGFuZCBJbmNvbWUgQ2xhc3NpZmljYXRpb24gc2VlbWVkIHRvIGhhdmUgd3JvbmcgY2xhc3NpZmljYXRpb25zIGFuZCBmaXggdGhlbQ0KZGZfbWVyZ2VkJENvbnRpbmVudCA8LSBmYWN0b3IoZGZfbWVyZ2VkJENvbnRpbmVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoJ0FmcmljYScsICdFdXJvcGUnLCAnQXNpYScsICdPY2VhbmlhJywgJ05vcnRoIEFtZXJpY2EnLCAnU291dGggQW1lcmljYScpKSANCmRmX21lcmdlZCRHZW5kZXIgPC0gZmFjdG9yKGRmX21lcmdlZCRHZW5kZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCdNYWxlJywgJ0ZlbWFsZScpKQ0KDQpkZl9tZXJnZWQkJ0luY29tZSBDbGFzc2lmaWNhdGlvbicgPC0gZmFjdG9yKGRmX21lcmdlZCQnSW5jb21lIENsYXNzaWZpY2F0aW9uJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLDEsMiwzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnTG93IEluY29tZScsICdMb3dlciBNaWRkbGUgSW5jb21lJywgJ1VwcGVyIE1pZGRsZSBJbmNvbWUnLCAnSGlnaCBJbmNvbWUnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpIA0KYXR0cmlidXRlcyhkZl9tZXJnZWQpDQpgYGANCg0KDQoNCiMjCSoqVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJICoqDQoNCg0KYGBge3J9DQojIEJlZm9yZSBtZXJnaW5nIGl0IHdpdGggZGF0YSBzZXQgMiwgdGhlIHN0ZXBzIG5lZWRlZCB0byBjbGVhbiB1cCB0aGUgZGF0YSBoYXZlIGFscmVhZHkgYmVlbiB0YWtlbi4gUGxlYXNlIGxvb2sgYXQgdGhlIHNlY3Rpb24gIkRhdGEuIg0KIyByZWZlciBMaW5lIDI2IGFib3ZlIDogcmVzaGFwZWQgdGhlIGRhdGEgaW50byB0aWR5IGZvcm1hdCAodGhpcyBpcyBmb3IgJ1RpZHkgJiBNYW5pcHVsYXRlIERhdGEgSScgc2VjdGlvbikNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMjICoqVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSoqIA0KDQpgYGB7cn0NCiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSUkgDQojIFRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgY2hpbGRyZW4gdW5kZXIgNSB5ZWFycyBvbGQgYXJlIGVpdGhlciB1bmRlcndlaWdodCBvciBvdmVyd2VpZ2h0LCBuZXcgY29sdW1uIGlzIGNyZWF0ZWQgDQpkZl9tdXRhdGVkIDwtIG11dGF0ZShkZl9tZXJnZWQsICdVbmRlcjUgV2VpZ2h0IFBvcHVsYXRpb24nPShkZl9tZXJnZWQkVW5kZXJ3ZWlnaHQrZGZfbWVyZ2VkJE92ZXJ3ZWlnaHQpKmRmX21lcmdlZCQiVTUgUG9wdWxhdGlvbiAoJzAwMHMpIi8xMDApDQoNCmthYmxlKHRhaWwoZGZfbXV0YXRlZFtjKDEsMiw1LDcsOCwxMToxMyldKSwgZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9ICdsJyklPiUNCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpDQpgYGANCiANCg0KPGJyPg0KPGJyPg0KDQojIwkqKlNjYW4gSSAqKg0KIyBNaXNzaW5nIHZhbHVlcyBhcmUgc2Nhbm5lZCBhbmQgb21pdHRlZCBhdCB0aGlzIHN0ZXANCmBgYHtyfQ0KDQpzYXBwbHkoZGZfbWVyZ2VkLCBmdW5jdGlvbih4KSBzdW0oIGlzLm5hKHgpICkpDQoNCiNSZW1vdmluZyBtaXNzaW5nIGRhdGEgdmFsdWVzIGFuZCBubyBzcGVjaWFsIHZhbHVlcyBhcmUgZm91bmQNCmRmX21lcmdlZCA8LSBkZl9tZXJnZWRbY29tcGxldGUuY2FzZXMoZGZfbWVyZ2VkKSwgXQ0Kc2FwcGx5KGRmX21lcmdlZCwgZnVuY3Rpb24oeCkgc3VtKCBpcy5uYSh4KSApKQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIwkqKlNjYW4gSUkqKg0KIyBCb3ggcGxvdCBmb3IgZWFjaCBvZiB0aGUgbnVtZXJpY2FsIHZhcmlhYmxlcyB1c2luZyBUdWtleSdzIG1ldGhvZCBmb3IgZmluZGluZyBvdXRsaWVycy4NCmBgYHtyfQ0KDQoNCmNvbG5hbWVzKGRmX21lcmdlZClbOF0gPC0gIlVuZGVyIDUgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHMiIA0KDQpkZl9tZXJnZWQkJ1VuZGVyIDUgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHMnICU+JSBib3hwbG90KG1haW49IlVuZGVyIDUgeWVhcnMgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHMiLCB5bGFiPSJQb3B1bGF0aW9uIiwgY29sID0gInJlZCIpICANCg0KDQojUGxvdCBzdHVudGluZyBwZXJjZW50YWdlIGFuZCBsaWZlIGV4cGVjdGFuY3kNCnBhcihtZnJvdz1jKDEsMikpDQpkZl9tZXJnZWQkU3R1bnRpbmcgJT4lIGJveHBsb3QobWFpbj0iU3R1bnRpbmcgJSIsIHlsYWI9IlBlcmNlbnRhZ2UiLCBjb2wgPSAicmVkIikNCmRmX21lcmdlZCRgTGlmZSBFeHBlY3RhbmN5YCAlPiUgYm94cGxvdChtYWluPSJMaWZlIGV4cGVjdGFuY3kiLCB5bGFiPSJBZ2UiLCBjb2wgPSAicmVkIikNCnBhcihtZnJvdz1jKDEsMSkpIA0KDQojUGxvdCBudW1lcmljYWwgdmFyaWFibGVzDQpwYXIobWZyb3c9YygyLDIpKQ0KZGZfbWVyZ2VkJCdTZXZlcmUgV2FzdGluZycgJT4lIGJveHBsb3QobWFpbj0iU2V2ZXJlIFdhc3RpbmcgJSIsIHlsYWI9IlBlcmNlbnRhZ2UiLGNvbCA9ICJyZWQiKQ0KZGZfbWVyZ2VkJCdXYXN0aW5nJyAlPiUgYm94cGxvdChtYWluPSJXYXN0aW5nICUiLCB5bGFiPSJQZXJjZW50YWdlIiwgY29sID0gInJlZCIpDQpkZl9tZXJnZWQkYE92ZXJ3ZWlnaHRgICU+JSBib3hwbG90KG1haW49Ik92ZXIgd2VpZ2h0ICUiLCB5bGFiPSJQZXJjZW50YWdlIiwgY29sID0gInJlZCIpDQpkZl9tZXJnZWQkYFVuZGVyd2VpZ2h0YCAlPiUgYm94cGxvdChtYWluPSJVbmRlciB3ZWlnaHQgJSIsIHlsYWI9IlBlcmNlbnRhZ2UiLCBjb2wgPSAicmVkIikNCg0KcGFyKG1mcm93PWMoMSwxKSkNCg0KcGFyKG1mcm93PWMoMSwyKSkNCmRmX21lcmdlZCRTdHVudGluZyAlPiUgYm94cGxvdChtYWluPSJTdHVudGluZyAlIiwgeWxhYj0iUGVyY2VudGFnZSIsIGNvbCA9ICJyZWQiKQ0KZGZfbWVyZ2VkJGBMaWZlIEV4cGVjdGFuY3lgICU+JSBib3hwbG90KG1haW49IkxpZmUgZXhwZWN0YW5jeSIsIHlsYWI9IkFnZSIsIGNvbCA9ICJyZWQiKQ0KcGFyKG1mcm93PWMoMSwxKSkNCg0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQoNCiMjCSoqVHJhbnNmb3JtICoqDQojQ2hlY2sgb3V0IHRoZSBoaXN0b2dyYW1zIG9mIGFsbCB0aGUgbnVtYmVyIHZhbHVlcyBhbmQgY2hvb3NlIHZhcmlhYmxlICJ3YXN0aW5nIiBhcyB0cmFuc2Zvcm1hdGlvbg0KI1NxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uIGdpdmVzIGEgYmV0dGVyIHJlc3BvbnNlIHRoYW4gdGhlIGxvZyB0cmFuc2Zvcm1hdGlvbi4NCmBgYHtyfQ0KI2V4cGxvcmUgdGhlIGhpc3RvZ3JhbXMgb2YgYWxsIHRoZSBudW1lcmljYWwgdmFyaWFibGVzLg0KcGFyKG1mcm93ID1jKDMsMykpDQoNCnVuZGVyNV9wb3B1bGF0aW9uIDwtICBkZl9tZXJnZWQkYFVuZGVyIDUgUG9wdWxhdGlvbiBpbiB0aG91c2FuZHNgDQpoaXN0KHVuZGVyNV9wb3B1bGF0aW9uKQ0KDQp1bmRlcl93ZWlnaHQgPC0gZGZfbWVyZ2VkJGBVbmRlcndlaWdodGANCmhpc3QodW5kZXJfd2VpZ2h0KQ0KDQpvdmVyX3dlaWdodDwtIGRmX21lcmdlZCRgT3ZlcndlaWdodGANCmhpc3Qob3Zlcl93ZWlnaHQpDQoNCndhc3RpbmcgPC0gZGZfbWVyZ2VkJGBXYXN0aW5nYA0KaGlzdCh3YXN0aW5nKQ0KDQpzZXZlcmVfd2FzdGluZyA8LSBkZl9tZXJnZWQkYFNldmVyZSBXYXN0aW5nYA0KaGlzdChzZXZlcmVfd2FzdGluZykNCg0Kc3R1bnRpbmcgPC0gZGZfbWVyZ2VkJFN0dW50aW5nDQpoaXN0KHN0dW50aW5nKQ0KDQpsaWZlX2V4cGVjdGFuY3kgPC0gZGZfbWVyZ2VkJGBMaWZlIEV4cGVjdGFuY3lgDQpoaXN0KGxpZmVfZXhwZWN0YW5jeSkNCnBhcihtZnJvdz1jKDEsMSkpDQoNCg0KIyBjb252ZXJ0IHRoZSBkaXN0cmlidXRpb24gaW50byBhIG5vcm1hbCBkaXN0cmlidXRpb24NCnNxcnRfd2FzdGluZyA8LSBzcXJ0KHdhc3RpbmcpDQpoaXN0KHNxcnRfd2FzdGluZykNCg0KIyByZWR1Y2UgdGhlIHJpZ2h0IHNrZXduZXNzDQpsb2dfd2FzdGluZyA8LSBsb2cxMCh3YXN0aW5nKQ0KaGlzdChsb2dfd2FzdGluZykNCg0KbG5fd2FzdGluZyA8LSBsb2cod2FzdGluZykNCmhpc3QobG5fd2FzdGluZykNCmBgYA0KIA0KDQo8YnI+DQo8YnI+DQoNCg==