install.packages(“tidyverse”)
setwd(“/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators”)
female <- read.csv(“female.csv”)
Determine that R does consider female to be data frame
is.data.frame(female)
head(female)
library(tidyverse)
female <- female %>% filter(Country.Name == “Brazil” |
Country.Name == “India” | Country.Name == “United States”)
head(female)
colnames(female)
rel_col <- which(colnames(female)==“Country.Name” |
colnames(female)== “X2014..YR2014.” | colnames(female)==
“X2017..YR2017.” | colnames(female) == “X2021..YR2021.” ) rel_col
female <- female[rel_col] %>% rename(“2014” = 2, “2017” = 3,
“2021” = 4) head(female)
transpose_f <- data.frame(t(female[-1])) colnames(transpose_f)
<- female[, 1] head(transpose_f)
print(sapply(transpose_f, class))
transpose_f\(Brazil =
as.numeric(transpose_f\)Brazil) transpose_f\(India = as.numeric(transpose_f\)India)
transpose_f\("United States" =
as.numeric(transpose_f\)“United States”) head(transpose_f)
summarise_each(transpose_f, list(mean))
transpose_f %>% summarise(across(c(Brazil, India, “United
States”), list(mean=mean, sd=sd)))
year <- c(2014, 2017,2021) ggplot(data=transpose_f, aes(x=year,
y=India, group=1)) + geom_line()+ geom_point()
setwd(“/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators-2”)
male <- read.csv(file = “male.csv”) male <- male %>%
filter(Country.Name == “Brazil” | Country.Name == “India” | Country.Name
== “United States”)
male <- male[rel_col] %>% rename(“2014” = 2, “2017” = 3, “2021”
= 4)
transpose_m <- data.frame(t(male[-1])) colnames(transpose_m) <-
male[, 1]
transpose_m\(Brazil =
as.numeric(as.character(transpose_m\)Brazil)) transpose_m\(India =
as.numeric(as.character(transpose_m\)India)) transpose_m\("United States" =
as.numeric(as.character((transpose_m\)“United States”)))
head(transpose_m)
transpose_m <- rename(transpose_m, “Brazil_m” = 1, “India_m” = 2,
“United_States_m” = 3)
head(transpose_m)
transpose_m <- rownames_to_column(transpose_m, var=“Year”)
transpose_f <- rownames_to_column(transpose_f, var=“Year”)
acct_owner_by_gender <- merge(x = transpose_m, y = transpose_f, by
= “Year”, all.x = TRUE) acct_owner_by_gender <-
rename(acct_owner_by_gender, “United_States” = 7)
head(acct_owner_by_gender)
gfg_plot <- ggplot(acct_owner_by_gender, aes(x=year)) +
geom_line(aes(y = India), color = “black”) + geom_line(aes(y = India_m),
color = “red”) + geom_line(aes(y = Brazil), color = “green”) +
geom_line(aes(y = Brazil_m), color = “blue”) + geom_line(aes(y =
United_States), color = “purple”) + geom_line(aes(y = United_States_m),
color = “violet”)
Part 1: (Cleaning up the final plot) The final plot is somewhat
misleading: the y-axis is titled “India”. Write down the code that will
change it to percentage ownership.
gfg_plot <- gfg_plot + ylab("percentage ownership")
gfg_plot
Part 2: (Drawing Conclusions) After drawing the plot that includes
how percentages change over time, use this to draw some (fairly basic)
conclusions on the how the ownership percentages have been changed. For
example, you can discuss whether males have more account ownership than
females and whether the data suggests that account ownership percentages
are on the rise.
print(“Based on the data and the plot that was generated for how
percentage ownership changes over time. We can conclude that there seems
to be almost a pivot, or shift in the overall data at roughly 2017. We
can dissect this by understanding the relationship between male and
female percentage ownership in each country. Starting with India, we can
see that from 2014 to 2017 both male and female account ownership
percentages were on the rise, however after that (from 2017 to 2020 and
beyond) it’s been on a decline with male ownership percentage declining
at a faster rate. However, for the most part males appear to have more
account ownership than females in India, until the ending of data (most
recent) where they appear to be the same.”) print(“”) print(“Moving on
to Brazil, we can see that males have had more account ownership than
females from 2014 all the way up until the current (latest) available
data. We can also see that for both males and females the account
ownership percentages have been on the rise. From 2014 to roughly 2017
there definitely was a rise, however, from 2017 to the latest, there was
a signifciantly greater rise (slope) in percentage ownership over time
than compared with the rise in 2014 to 2017.”) print(“”) print(“Lastly,
looking at the United States, we can see that the data is not as
straightforward as that of India and Brazil. We can see that from 2014
to some point in early-mid 2016 that females had more account ownership
than males. However, from that same early-mid 2016 point up until
somewhere late in 2017, males actually had more account ownership
percentages than females. We can also see that from 2014 to 2017, male
account ownership percentage was on the rise, whereas female account
ownership percentages were declining. However, from 2017 all the way to
the current (latest) data, male account ownership percentage has been on
the decline, and female account ownership percentage is on the rise.”)
print(“”) print(“To conclude, we can see that, in general, when
considering account percentage ownership, it has been on the rise and
there is a greater percentage ownership now (in the current data) when
compared to that of 2014. Also, except for the United States, it appears
that historically males have had greater account ownership percentages
than females based upon our data of Brazil and India.”)
Part 3: (Cherry Picking) Is it possible to say that account
percentages have been increasing if you disregard a certain year? Does
this change if you focus on a particular country and gender
combinations?
print(“”) print(“For the first part of the question where is asks if
we can conclude that account percentages have been increasing if we
disregard a certain year, this is not the case. We would need to
disregard multiple years for this to happen. For example, looking at the
United State’s data, we see that the male account ownership percentage
has been decreasing from 2017 all the way to the current (latest) data
which is past 2020. The same can been seen in the data for India’s male
data, where percentage ownernship has been decreasing from 2017 to the
current [latest] data as well (past 2020).”) print(“”)
print(“Technically yes, if we don’t consider the data for United States
male, United States female (decreasing from 2014-2017), India male, then
it appears the remaining data (India female, Brazil male, and Brazil
female) indicates that account ownership percentages have been
increasing overall. Or if we just want to focous on a particular
country, then Brazil will achieve that same result of an overall
increasing percentage ownership trend. We can’t do this with a gender
combination (i.e. all males or females in our data set) because the data
varies in each country.”)
#Part 4: (Summarzing the data yourself) Do a similar analysis using
the csv files: # 1: Account ownership at a financial institution or with
a mobile-money-service provider, primary education or less (% of
population ages 15+) # 2: Account ownership at a financial institution
or with a mobile-money-service provider, secondary education or more (%
of population ages 15+)
You should analyze exactly five countries. You are free to pick the
countries but your choices should not include the United States, India
nor Brazil. After a visual representation of the data is made, you
should have a paragraph or two summarizing your conclusions. The summary
should be about the length of half a page and no longer than a
page.
install.packages(“tidyverse”)
setwd(“/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators-5”)
primary <- read.csv(“primary.csv”)
Determine that R does consider primary to be data frame
is.data.frame(primary)
head(primary)
library(tidyverse)
primary <- primary %>% filter(Country.Name == “Canada” |
Country.Name == “China” | Country.Name == “United Kingdom” |
Country.Name == “Germany” | Country.Name == “Chile”)
head(primary)
colnames(primary)
rel_col <- which(colnames(primary)==“Country.Name” |
colnames(primary)== “X2014..YR2014.” | colnames(primary)==
“X2017..YR2017.” | colnames(primary) == “X2021..YR2021.” ) rel_col
primary <- primary[rel_col] %>% rename(“2014” = 2, “2017” = 3,
“2021” = 4) head(primary)
transpose_p <- data.frame(t(primary[-1])) colnames(transpose_p)
<- primary[, 1] head(transpose_p)
print(sapply(transpose_p, class))
transpose_p\(Canada =
as.numeric(transpose_p\)Canada) transpose_p\(China = as.numeric(transpose_p\)China)
transpose_p\("United Kingdom" =
as.numeric(transpose_p\)“United Kingdom”) transpose_p\("Germany" =
as.numeric(transpose_p\)“Germany”) transpose_p\("Chile" =
as.numeric(transpose_p\)“Chile”) head(transpose_p)
summarise_each(transpose_p, list(mean))
transpose_p %>% summarise(across(c(Canada, China, “United
Kingdom”, Germany, Chile), list(mean=mean, sd=sd)))
year <- c(2014, 2017,2021) ggplot(data=transpose_p, aes(x=year,
y=China, group=1)) + geom_line()+ geom_point()
setwd(“/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators-6”)
secondary <- read.csv(file = “secondary.csv”) secondary <-
secondary %>% filter(Country.Name == “Canada” | Country.Name ==
“China” | Country.Name == “United Kingdom” | Country.Name == “Germany” |
Country.Name == “Chile”)
secondary <- secondary[rel_col] %>% rename(“2014” = 2, “2017” =
3, “2021” = 4)
transpose_s <- data.frame(t(secondary[-1])) colnames(transpose_s)
<- secondary[, 1]
transpose_s\("Canada" =
as.numeric(as.character(transpose_s\)“Canada”)) transpose_s\("China" =
as.numeric(as.character(transpose_s\)“China”)) transpose_s\("United Kingdom" =
as.numeric(as.character(transpose_s\)“United Kingdom”))
transpose_s\("Germany" =
as.numeric(as.character(transpose_s\)“Germany”)) transpose_s\("Chile" =
as.numeric(as.character(transpose_s\)“Chile”))
head(transpose_s)
transpose_s <- rename(transpose_s, “Canada_s” = 1, “China_s” = 2,
“United_Kingdom_s” = 3, “Germany_s” = 4, “Chile_s” = 5)
head(transpose_s)
transpose_s <- rownames_to_column(transpose_s, var=“Year”)
transpose_p <- rownames_to_column(transpose_p, var=“Year”)
acct_owner_by_education <- merge(x = transpose_s, y = transpose_p,
by = “Year”, all.x = TRUE) acct_owner_by_education <-
rename(acct_owner_by_education, “United_Kingdom” = 7)
head(acct_owner_by_education)
ggplot(data = transpose_p, aes(x = year)) + geom_line(aes(y = China,
color = “China”)) + geom_line(aes(y = Canada, color = “Canada”)) +
geom_line(aes(y = United Kingdom, color = “United
Kingdom”)) + geom_line(aes(y = Germany, color = “Germany”)) +
geom_line(aes(y = Chile, color = “Chile”)) + geom_line(data =
transpose_s, aes(y = China_s, color = “China_s”)) + geom_line(data =
transpose_s, aes(y = Canada_s, color = “Canada_s”)) + geom_line(data =
transpose_s, aes(y = United_Kingdom_s, color = “United Kingdom_s”)) +
geom_line(data = transpose_s, aes(y = Germany_s, color = “Germany_s”)) +
geom_line(data = transpose_s, aes(y = Chile_s, color = “Chile_s”))
ylab(“Percentage Ownership”)
gfg_plot
ggplot
print(“Now that we are using five countries, the data (and plot)
certainly is more complicated. We must press the”zoom” button in order
to fully see our plot in its appropriate scale since the countries vary
drastically in their data in percentage ownership.”) print(“”) print(“We
can once again dissect our plot country by country to truly understand
it.”)
LS0tCnRpdGxlOiAiUHJvamVjdCAjMSAtIEZhaXogU2hhaWtoIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMiKQoKZmVtYWxlIDwtIHJlYWQuY3N2KCJmZW1hbGUuY3N2IikKCiMgRGV0ZXJtaW5lIHRoYXQgUiBkb2VzIGNvbnNpZGVyIGZlbWFsZSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUoZmVtYWxlKQoKaGVhZChmZW1hbGUpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmZlbWFsZSA8LSBmZW1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikKCmhlYWQoZmVtYWxlKQoKY29sbmFtZXMoZmVtYWxlKQoKcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0iQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhmZW1hbGUpID09ICJYMjAyMS4uWVIyMDIxLiIgKQpyZWxfY29sCgpmZW1hbGUgPC0gZmVtYWxlW3JlbF9jb2xdICU+JSByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKaGVhZChmZW1hbGUpCgp0cmFuc3Bvc2VfZiA8LSBkYXRhLmZyYW1lKHQoZmVtYWxlWy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQpoZWFkKHRyYW5zcG9zZV9mKQoKcHJpbnQoc2FwcGx5KHRyYW5zcG9zZV9mLCBjbGFzcykpCgp0cmFuc3Bvc2VfZiRCcmF6aWwgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJEJyYXppbCkgCnRyYW5zcG9zZV9mJEluZGlhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRJbmRpYSkKdHJhbnNwb3NlX2YkIlVuaXRlZCBTdGF0ZXMiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIpCmhlYWQodHJhbnNwb3NlX2YpCgpzdW1tYXJpc2VfZWFjaCh0cmFuc3Bvc2VfZiwgbGlzdChtZWFuKSkKCnRyYW5zcG9zZV9mICU+JQogIHN1bW1hcmlzZShhY3Jvc3MoYyhCcmF6aWwsIEluZGlhLCAiVW5pdGVkIFN0YXRlcyIpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtMiIpCgptYWxlIDwtIHJlYWQuY3N2KGZpbGUgPSAibWFsZS5jc3YiKQptYWxlIDwtIG1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikgCgptYWxlIDwtIG1hbGVbcmVsX2NvbF0gJT4lIAogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQoKdHJhbnNwb3NlX20gPC0gZGF0YS5mcmFtZSh0KG1hbGVbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX20pIDwtIG1hbGVbLCAxXQoKdHJhbnNwb3NlX20kQnJhemlsID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kQnJhemlsKSkgCnRyYW5zcG9zZV9tJEluZGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kSW5kaWEpKQp0cmFuc3Bvc2VfbSQiVW5pdGVkIFN0YXRlcyIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX20kIlVuaXRlZCBTdGF0ZXMiKSkpCgpoZWFkKHRyYW5zcG9zZV9tKQoKdHJhbnNwb3NlX20gPC0gcmVuYW1lKHRyYW5zcG9zZV9tLCAiQnJhemlsX20iID0gMSwgIkluZGlhX20iID0gMiwgIlVuaXRlZF9TdGF0ZXNfbSIgPSAzKQoKaGVhZCh0cmFuc3Bvc2VfbSkKCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9mIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfZiwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZ2VuZGVyIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfbSwgeSA9IHRyYW5zcG9zZV9mLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2dlbmRlciA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9nZW5kZXIsICJVbml0ZWRfU3RhdGVzIiA9IDcpCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpCgpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9nZW5kZXIsIGFlcyh4PXllYXIpKSArICAKICAgIGdlb21fbGluZShhZXMoeSA9IEluZGlhKSwgY29sb3IgPSAiYmxhY2siKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBJbmRpYV9tKSwgY29sb3IgPSAicmVkIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsKSwgY29sb3IgPSAiZ3JlZW4iKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBCcmF6aWxfbSksIGNvbG9yID0gImJsdWUiKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfU3RhdGVzKSwgY29sb3IgPSAicHVycGxlIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX1N0YXRlc19tKSwgY29sb3IgPSAidmlvbGV0IikgCiAgICAKICAgIAojIFBhcnQgMTogKENsZWFuaW5nIHVwIHRoZSBmaW5hbCBwbG90KSBUaGUgZmluYWwgcGxvdCBpcyBzb21ld2hhdCBtaXNsZWFkaW5nOiB0aGUgeS1heGlzIGlzIHRpdGxlZCAiSW5kaWEiLiBXcml0ZSBkb3duIHRoZSBjb2RlIHRoYXQgd2lsbCBjaGFuZ2UgaXQgdG8gcGVyY2VudGFnZSBvd25lcnNoaXAuCiAgICBnZmdfcGxvdCA8LSBnZmdfcGxvdCArIHlsYWIoInBlcmNlbnRhZ2Ugb3duZXJzaGlwIikKICAgIApnZmdfcGxvdAoKCiMgUGFydCAyOiAoRHJhd2luZyBDb25jbHVzaW9ucykgQWZ0ZXIgZHJhd2luZyB0aGUgcGxvdCB0aGF0IGluY2x1ZGVzIGhvdyBwZXJjZW50YWdlcyBjaGFuZ2Ugb3ZlciB0aW1lLCB1c2UgdGhpcyB0byBkcmF3IHNvbWUgKGZhaXJseSBiYXNpYykgY29uY2x1c2lvbnMgb24gdGhlIGhvdyB0aGUgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkaXNjdXNzIHdoZXRoZXIgbWFsZXMgaGF2ZSBtb3JlIGFjY291bnQgb3duZXJzaGlwIHRoYW4gZmVtYWxlcyBhbmQgd2hldGhlciB0aGUgZGF0YSBzdWdnZXN0cyB0aGF0IGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGFyZSBvbiB0aGUgcmlzZS4KCnByaW50KCJCYXNlZCBvbiB0aGUgZGF0YSBhbmQgdGhlIHBsb3QgdGhhdCB3YXMgZ2VuZXJhdGVkIGZvciBob3cgcGVyY2VudGFnZSBvd25lcnNoaXAgY2hhbmdlcyBvdmVyIHRpbWUuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIHNlZW1zIHRvIGJlIGFsbW9zdCBhIHBpdm90LCBvciBzaGlmdCBpbiB0aGUgb3ZlcmFsbAogZGF0YSBhdCByb3VnaGx5IDIwMTcuIFdlIGNhbiBkaXNzZWN0IHRoaXMgYnkgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGluIGVhY2ggY291bnRyeS4gU3RhcnRpbmcgd2l0aCBJbmRpYSwgd2UgY2FuIHNlZSB0aGF0IAogZnJvbSAyMDE0IHRvIDIwMTcgYm90aCBtYWxlIGFuZCBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBvbiB0aGUgcmlzZSwgaG93ZXZlciBhZnRlciB0aGF0IChmcm9tIDIwMTcgdG8gMjAyMCBhbmQgYmV5b25kKSBpdCdzIGJlZW4gb24gYSBkZWNsaW5lIHdpdGggbWFsZSBvd25lcnNoaXAgCiBwZXJjZW50YWdlIGRlY2xpbmluZyBhdCBhIGZhc3RlciByYXRlLiBIb3dldmVyLCBmb3IgdGhlIG1vc3QgcGFydCBtYWxlcyBhcHBlYXIgdG8gaGF2ZSBtb3JlIGFjY291bnQgb3duZXJzaGlwIHRoYW4gZmVtYWxlcyBpbiBJbmRpYSwgdW50aWwgdGhlIGVuZGluZyBvZiBkYXRhIChtb3N0IHJlY2VudCkgd2hlcmUgdGhleQogIGFwcGVhciB0byBiZSB0aGUgc2FtZS4iKQpwcmludCgiXG4iKQpwcmludCgiTW92aW5nIG9uIHRvIEJyYXppbCwgd2UgY2FuIHNlZSB0aGF0IG1hbGVzIGhhdmUgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBmZW1hbGVzIGZyb20gMjAxNCBhbGwgdGhlIHdheSB1cCB1bnRpbCB0aGUgY3VycmVudCAobGF0ZXN0KSBhdmFpbGFibGUgZGF0YS4gV2UgY2FuIGFsc28gc2VlCiB0aGF0IGZvciBib3RoIG1hbGVzIGFuZCBmZW1hbGVzIHRoZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gb24gdGhlIHJpc2UuIEZyb20gMjAxNCB0byByb3VnaGx5IDIwMTcgdGhlcmUgZGVmaW5pdGVseSB3YXMgYSByaXNlLCBob3dldmVyLCBmcm9tIDIwMTcgdG8gdGhlIGxhdGVzdCwgdGhlcmUKICB3YXMgYSBzaWduaWZjaWFudGx5IGdyZWF0ZXIgcmlzZSAoc2xvcGUpIGluIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIG92ZXIgdGltZSB0aGFuIGNvbXBhcmVkIHdpdGggdGhlIHJpc2UgaW4gMjAxNCB0byAyMDE3LiIpCnByaW50KCJcbiIpCnByaW50KCJMYXN0bHksIGxvb2tpbmcgYXQgdGhlIFVuaXRlZCBTdGF0ZXMsIHdlIGNhbiBzZWUgdGhhdCB0aGUgZGF0YSBpcyBub3QgYXMgc3RyYWlnaHRmb3J3YXJkIGFzIHRoYXQgb2YgSW5kaWEgYW5kIEJyYXppbC4gV2UgY2FuIHNlZSB0aGF0IGZyb20gMjAxNCB0byBzb21lIHBvaW50IGluIGVhcmx5LW1pZCAyMDE2IHRoYXQKIGZlbWFsZXMgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBtYWxlcy4gSG93ZXZlciwgZnJvbSB0aGF0IHNhbWUgZWFybHktbWlkIDIwMTYgcG9pbnQgdXAgdW50aWwgc29tZXdoZXJlIGxhdGUgaW4gMjAxNywgbWFsZXMgYWN0dWFsbHkgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzLgogIFdlIGNhbiBhbHNvIHNlZSB0aGF0IGZyb20gMjAxNCB0byAyMDE3LCBtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2Ugd2FzIG9uIHRoZSByaXNlLCB3aGVyZWFzIGZlbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyB3ZXJlIGRlY2xpbmluZy4gSG93ZXZlciwgZnJvbSAyMDE3IGFsbCB0aGUgd2F5IHRvIHRoZSBjdXJyZW50ICAobGF0ZXN0KSBkYXRhLCBtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2UgaGFzIGJlZW4gb24gdGhlIGRlY2xpbmUsIGFuZCBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZSBpcyBvbiB0aGUgcmlzZS4iKQpwcmludCgiXG4iKQpwcmludCgiVG8gY29uY2x1ZGUsIHdlIGNhbiBzZWUgdGhhdCwgaW4gZ2VuZXJhbCwgd2hlbiBjb25zaWRlcmluZyBhY2NvdW50IHBlcmNlbnRhZ2Ugb3duZXJzaGlwLCBpdCBoYXMgYmVlbiBvbiB0aGUgcmlzZSBhbmQgdGhlcmUgaXMgYSBncmVhdGVyIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIG5vdyAoaW4gdGhlIGN1cnJlbnQgZGF0YSkgd2hlbgogY29tcGFyZWQgdG8gdGhhdCBvZiAyMDE0LiBBbHNvLCBleGNlcHQgZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBpdCBhcHBlYXJzIHRoYXQgaGlzdG9yaWNhbGx5IG1hbGVzIGhhdmUgaGFkIGdyZWF0ZXIgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzIGJhc2VkIHVwb24gb3VyIGRhdGEgb2YgQnJhemlsIGFuZCBJbmRpYS4iKQogCiAKIyBQYXJ0IDM6IChDaGVycnkgUGlja2luZykgSXMgaXQgcG9zc2libGUgdG8gc2F5IHRoYXQgYWNjb3VudCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBpZiB5b3UgZGlzcmVnYXJkIGEgY2VydGFpbiB5ZWFyPyBEb2VzIHRoaXMgY2hhbmdlIGlmIHlvdSBmb2N1cyBvbiBhIHBhcnRpY3VsYXIgY291bnRyeSBhbmQgZ2VuZGVyIGNvbWJpbmF0aW9ucz8KCnByaW50KCJcbiIpCnByaW50KCJGb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHF1ZXN0aW9uIHdoZXJlIGlzIGFza3MgaWYgd2UgY2FuIGNvbmNsdWRlIHRoYXQgYWNjb3VudCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBpZiB3ZSBkaXNyZWdhcmQgYSBjZXJ0YWluIHllYXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBXZSB3b3VsZCBuZWVkIHRvCmRpc3JlZ2FyZCBtdWx0aXBsZSB5ZWFycyBmb3IgdGhpcyB0byBoYXBwZW4uIEZvciBleGFtcGxlLCBsb29raW5nIGF0IHRoZSBVbml0ZWQgU3RhdGUncyBkYXRhLCB3ZSBzZWUgdGhhdCB0aGUgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IGFsbCB0aGUgd2F5IHRvIHRoZQpjdXJyZW50IChsYXRlc3QpIGRhdGEgd2hpY2ggaXMgcGFzdCAyMDIwLiBUaGUgc2FtZSBjYW4gYmVlbiBzZWVuIGluIHRoZSBkYXRhIGZvciBJbmRpYSdzIG1hbGUgZGF0YSwgd2hlcmUgcGVyY2VudGFnZSBvd25lcm5zaGlwIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IHRvIHRoZSBjdXJyZW50IFtsYXRlc3RdIGRhdGEgYXMKIHdlbGwgKHBhc3QgMjAyMCkuIikKIHByaW50KCJcbiIpCiBwcmludCgiVGVjaG5pY2FsbHkgeWVzLCBpZiB3ZSBkb24ndCBjb25zaWRlciB0aGUgZGF0YSBmb3IgVW5pdGVkIFN0YXRlcyBtYWxlLCBVbml0ZWQgU3RhdGVzIGZlbWFsZSAoZGVjcmVhc2luZyBmcm9tIDIwMTQtMjAxNyksIEluZGlhIG1hbGUsIHRoZW4gaXQgYXBwZWFycyB0aGUgcmVtYWluaW5nIGRhdGEKICAoSW5kaWEgZmVtYWxlLCBCcmF6aWwgbWFsZSwgYW5kIEJyYXppbCBmZW1hbGUpIGluZGljYXRlcyB0aGF0IGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBpbmNyZWFzaW5nIG92ZXJhbGwuIE9yIGlmIHdlIGp1c3Qgd2FudCB0byBmb2NvdXMgb24gYSBwYXJ0aWN1bGFyIGNvdW50cnksIHRoZW4gQnJhemlsCiAgIHdpbGwgYWNoaWV2ZSB0aGF0IHNhbWUgcmVzdWx0IG9mIGFuIG92ZXJhbGwgaW5jcmVhc2luZyBwZXJjZW50YWdlIG93bmVyc2hpcCB0cmVuZC4gV2UgY2FuJ3QgZG8gdGhpcyB3aXRoIGEgZ2VuZGVyIGNvbWJpbmF0aW9uIChpLmUuIGFsbCBtYWxlcyBvciBmZW1hbGVzIGluIG91ciBkYXRhIHNldCkgYmVjYXVzZSB0aGUgZGF0YSAKICAgdmFyaWVzIGluIGVhY2ggY291bnRyeS4iKQogIAogIAogICNQYXJ0IDQ6IChTdW1tYXJ6aW5nIHRoZSBkYXRhIHlvdXJzZWxmKSBEbyBhIHNpbWlsYXIgYW5hbHlzaXMgdXNpbmcgdGhlIGNzdiBmaWxlczoKIyAxOiBBY2NvdW50IG93bmVyc2hpcCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB3aXRoIGEgbW9iaWxlLW1vbmV5LXNlcnZpY2UgcHJvdmlkZXIsIHByaW1hcnkgZWR1Y2F0aW9uIG9yIGxlc3MgKCUgb2YgcG9wdWxhdGlvbiBhZ2VzIDE1KykKIyAyOiBBY2NvdW50IG93bmVyc2hpcCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB3aXRoIGEgbW9iaWxlLW1vbmV5LXNlcnZpY2UgcHJvdmlkZXIsIHNlY29uZGFyeSBlZHVjYXRpb24gb3IgbW9yZSAoJSBvZiBwb3B1bGF0aW9uIGFnZXMgMTUrKQoKIyBZb3Ugc2hvdWxkIGFuYWx5emUgZXhhY3RseSBmaXZlIGNvdW50cmllcy4gWW91IGFyZSBmcmVlIHRvIHBpY2sgdGhlIGNvdW50cmllcyBidXQgeW91ciBjaG9pY2VzIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgVW5pdGVkIFN0YXRlcywgSW5kaWEgbm9yIEJyYXppbC4gQWZ0ZXIgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgaXMgbWFkZSwgeW91IHNob3VsZCBoYXZlIGEgcGFyYWdyYXBoIG9yIHR3byBzdW1tYXJpemluZyB5b3VyIGNvbmNsdXNpb25zLiBUaGUgc3VtbWFyeSBzaG91bGQgYmUgYWJvdXQgdGhlIGxlbmd0aCBvZiBoYWxmIGEgcGFnZSBhbmQgbm8gbG9uZ2VyIHRoYW4gYSBwYWdlLgoKaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKCnNldHdkKCIvVXNlcnMvZmFpenNoYWlraC9Eb3dubG9hZHMvUF9EYXRhX0V4dHJhY3RfRnJvbV9Xb3JsZF9EZXZlbG9wbWVudF9JbmRpY2F0b3JzLTUiKQoKcHJpbWFyeSA8LSByZWFkLmNzdigicHJpbWFyeS5jc3YiKQoKIyBEZXRlcm1pbmUgdGhhdCBSIGRvZXMgY29uc2lkZXIgcHJpbWFyeSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUocHJpbWFyeSkKCmhlYWQocHJpbWFyeSkKCmxpYnJhcnkodGlkeXZlcnNlKQoKcHJpbWFyeSA8LSBwcmltYXJ5ICU+JQogIGZpbHRlcihDb3VudHJ5Lk5hbWUgPT0gIkNhbmFkYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaW5hIiB8IENvdW50cnkuTmFtZSA9PSAiVW5pdGVkIEtpbmdkb20iIHwgQ291bnRyeS5OYW1lID09ICJHZXJtYW55IiB8IENvdW50cnkuTmFtZSA9PSAiQ2hpbGUiKQoKaGVhZChwcmltYXJ5KQoKY29sbmFtZXMocHJpbWFyeSkKCnJlbF9jb2wgPC0gd2hpY2goY29sbmFtZXMocHJpbWFyeSk9PSJDb3VudHJ5Lk5hbWUiIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMocHJpbWFyeSkgPT0gIlgyMDIxLi5ZUjIwMjEuIiApCnJlbF9jb2wKCnByaW1hcnkgPC0gcHJpbWFyeVtyZWxfY29sXSAlPiUgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpCmhlYWQocHJpbWFyeSkKCnRyYW5zcG9zZV9wIDwtIGRhdGEuZnJhbWUodChwcmltYXJ5Wy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9wKSA8LSBwcmltYXJ5WywgMV0KaGVhZCh0cmFuc3Bvc2VfcCkKCnByaW50KHNhcHBseSh0cmFuc3Bvc2VfcCwgY2xhc3MpKQoKdHJhbnNwb3NlX3AkQ2FuYWRhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCRDYW5hZGEpIAp0cmFuc3Bvc2VfcCRDaGluYSA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkQ2hpbmEpCnRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIpCnRyYW5zcG9zZV9wJCJHZXJtYW55IiA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkIkdlcm1hbnkiKQp0cmFuc3Bvc2VfcCQiQ2hpbGUiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCQiQ2hpbGUiKQpoZWFkKHRyYW5zcG9zZV9wKQoKc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX3AsIGxpc3QobWVhbikpCgp0cmFuc3Bvc2VfcCAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGMoQ2FuYWRhLCBDaGluYSwgIlVuaXRlZCBLaW5nZG9tIiwgR2VybWFueSwgQ2hpbGUpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9wLCBhZXMoeD15ZWFyLCB5PUNoaW5hLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtNiIpCgpzZWNvbmRhcnkgPC0gcmVhZC5jc3YoZmlsZSA9ICJzZWNvbmRhcnkuY3N2IikKc2Vjb25kYXJ5IDwtIHNlY29uZGFyeSAlPiUKICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJDYW5hZGEiIHwgQ291bnRyeS5OYW1lID09ICJDaGluYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIlVuaXRlZCBLaW5nZG9tIiB8IENvdW50cnkuTmFtZSA9PSAiR2VybWFueSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaWxlIikgCgpzZWNvbmRhcnkgPC0gc2Vjb25kYXJ5W3JlbF9jb2xdICU+JSAKICByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKCnRyYW5zcG9zZV9zIDwtIGRhdGEuZnJhbWUodChzZWNvbmRhcnlbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX3MpIDwtIHNlY29uZGFyeVssIDFdCgp0cmFuc3Bvc2VfcyQiQ2FuYWRhIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJDYW5hZGEiKSkgCnRyYW5zcG9zZV9zJCJDaGluYSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiQ2hpbmEiKSkKdHJhbnNwb3NlX3MkIlVuaXRlZCBLaW5nZG9tIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJVbml0ZWQgS2luZ2RvbSIpKQp0cmFuc3Bvc2VfcyQiR2VybWFueSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiR2VybWFueSIpKQp0cmFuc3Bvc2VfcyQiQ2hpbGUiID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3MkIkNoaWxlIikpCgpoZWFkKHRyYW5zcG9zZV9zKQoKdHJhbnNwb3NlX3MgPC0gcmVuYW1lKHRyYW5zcG9zZV9zLCAiQ2FuYWRhX3MiID0gMSwgIkNoaW5hX3MiID0gMiwgIlVuaXRlZF9LaW5nZG9tX3MiID0gMywgIkdlcm1hbnlfcyIgPSA0LCAiQ2hpbGVfcyIgPSA1KQoKaGVhZCh0cmFuc3Bvc2VfcykKCnRyYW5zcG9zZV9zIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcywgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9wIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcCwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfcywgeSA9IHRyYW5zcG9zZV9wLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2VkdWNhdGlvbiA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9lZHVjYXRpb24sICJVbml0ZWRfS2luZ2RvbSIgPSA3KQpoZWFkKGFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uKQoKZ2dwbG90KGRhdGEgPSB0cmFuc3Bvc2VfcCwgYWVzKHggPSB5ZWFyKSkgKwogIGdlb21fbGluZShhZXMoeSA9IENoaW5hLCBjb2xvciA9ICJDaGluYSIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2FuYWRhLCBjb2xvciA9ICJDYW5hZGEiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGBVbml0ZWQgS2luZ2RvbWAsIGNvbG9yID0gIlVuaXRlZCBLaW5nZG9tIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55LCBjb2xvciA9ICJHZXJtYW55IikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBDaGlsZSwgY29sb3IgPSAiQ2hpbGUiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gQ2hpbmFfcywgY29sb3IgPSAiQ2hpbmFfcyIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB0cmFuc3Bvc2VfcywgYWVzKHkgPSBDYW5hZGFfcywgY29sb3IgPSAiQ2FuYWRhX3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fcywgY29sb3IgPSAiVW5pdGVkIEtpbmdkb21fcyIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB0cmFuc3Bvc2VfcywgYWVzKHkgPSBHZXJtYW55X3MsIGNvbG9yID0gIkdlcm1hbnlfcyIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB0cmFuc3Bvc2VfcywgYWVzKHkgPSBDaGlsZV9zLCBjb2xvciA9ICJDaGlsZV9zIikpCiAgCiAgeWxhYigiUGVyY2VudGFnZSBPd25lcnNoaXAiKQoKICAgIApnZmdfcGxvdAoKIVtnZ3Bsb3RdKC9Vc2Vycy9mYWl6c2hhaWtoL0Rlc2t0b3AvZ2dwbG90LnBuZykKCnByaW50KCJOb3cgdGhhdCB3ZSBhcmUgdXNpbmcgZml2ZSBjb3VudHJpZXMsIHRoZSBkYXRhIChhbmQgcGxvdCkgY2VydGFpbmx5IGlzIG1vcmUgY29tcGxpY2F0ZWQuIFdlIG11c3QgcHJlc3MgdGhlICJ6b29tIiBidXR0b24gaW4gb3JkZXIgdG8KIGZ1bGx5IHNlZSBvdXIgcGxvdCBpbiBpdHMgYXBwcm9wcmlhdGUgc2NhbGUgc2luY2UgdGhlIGNvdW50cmllcyB2YXJ5IGRyYXN0aWNhbGx5IGluIHRoZWlyIGRhdGEgaW4gcGVyY2VudGFnZSBvd25lcnNoaXAuIikKIHByaW50KCJcbiIpCiBwcmludCgiV2UgY2FuIG9uY2UgYWdhaW4gZGlzc2VjdCBvdXIgcGxvdCBjb3VudHJ5IGJ5IGNvdW50cnkgdG8gdHJ1bHkgdW5kZXJzdGFuZCBpdC4iKQ==