setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
Warning: The working directory was changed to C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1 inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
female <- read.csv("female.csv")

# Determines if R considers female to be a data frame
is.data.frame(female)
[1] TRUE
# Can now use head to see what female looks like
head(female)

# Isolates 3 columns from the original data set
library(tidyverse)
female <- female %>%
  filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States")

head(female)

#Eliminate unwanted columns
colnames(female)
 [1] "Series.Name"    "Series.Code"    "Country.Name"   "Country.Code"   "X1990..YR1990." "X2000..YR2000." "X2012..YR2012." "X2013..YR2013."
 [9] "X2014..YR2014." "X2015..YR2015." "X2016..YR2016." "X2017..YR2017." "X2018..YR2018." "X2019..YR2019." "X2020..YR2020." "X2021..YR2021."
rel_col <- which(colnames(female)== "Country.Name" | colnames(female)== "X2014..YR2014." | colnames(female)== "X2017..YR2017." | colnames(female)== "X2021..YR2021.")
rel_col
[1]  3  9 12 16
female <- female[rel_col] %>% rename("2014" = 2, "2017" = 3, "2021" = 4)
head(female)

#Flip rows and columns
transpose_f <- data.frame(t(female[-1]))
colnames(transpose_f) <- female[, 1]
head(transpose_f)

#tells us what type the data is being stored as. In this case they are characters meaning computations with them will fail
#So we must turn them into numeric values
print(sapply(transpose_f, class))
       Brazil         India United States 
  "character"   "character"   "character" 
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)

#Can now be summarized (compute the mean)
#summarise_each(transpose_f, list(mean))

transpose_f %>% summarise(across(c(Brazil, India, "United States"), list(mean=mean, sd=sd)))

#Graph data
year <- c(2014, 2017, 2021)
ggplot(data=transpose_f, aes(x=year, y=India, group=1)) + geom_line() + geom_point()


################################ Condensed Version for Male Data ##################################################
setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
male <- read.csv("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)

#Distinguish between male and female data
transpose_m <- rename(transpose_m, "Brazil_m" = 1, "India_m" = 2, "United_States_m" = 3)

head(transpose_m)

#Merge male and female data sets
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)

#Plot data
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") 

gfg_plot


###################### Project 1 ############################

# (1) Change y-axis from "India" to "Percentage Ownership"
gfg_plot + labs(y = "Percentage Ownership")

  1. Discuss percentage change over time

Of the 3 countries a higher account ownership among men more likely, especially within Brazil and India. However, notably in the United States, there is no clear higher ownership between the two genders as in some years it is higher among females while in others it is equally higher among males. Also, notably in India, as of the recent years this gap in ownership between the two genders has slowly closed. Whereas in Brazil it has stayed relatively the same over the years.

As for account ownership overall, many countries demonstrate a rise in ownership especially among females. The only areas in contradiction with this trend are the male populations of both India and the United States, which have demonstrated a gradual decrease in account ownership. However, even with this decline, account ownership percentages of 2021 remain across all countries, for the most part, higher than those of 2014.

  1. 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 particular country and gender combinations?

Across all countries, there is a noticeable sharp turning point around 2017 where each country either spiked in account ownership or declined heavily. In this case, disregarding years after 2017 could make it seem as though account ownership in a country was more likely when in reality it was less likely at a point in time and vice versus.

There are also many cases in each country where omitting certain years could produce the idea of a more probable account ownership percentage For example: In India, disregarding 2016 - 2018 In Brazil, disregarding 2016 - 2018 In the United States 2015 - 2018 (Although this would be more of a constant rate)

These results could also be replicated with different gender and country combinations, for example only using the higher ownership genders for each country: the females of the United States, females of India (don’t have a sharp decline like the men do although their percentage is lower across the years in comparison), and males of Brazil. These combinations could create the allusions of a higher likelihood of account ownership percentages among certain genders.

#################### Project 1 (Continued) #############################
# (4) Analysis of csv files

# Get and Plot primary or less percentage rates
setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
Warning: The working directory was changed to C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1 inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
primary <- read.csv("primary.csv")

library(tidyverse)
primary <- primary %>% 
  filter(Country.Name == "Albania" | Country.Name == "Australia" | Country.Name == "Armenia" | Country.Name == "Algeria" | Country.Name == "Argentina")

head(primary)

#Eliminate unwanted columns
rel_col <- which(colnames(primary)== "Country.Name" | colnames(primary)== "X2014..YR2014." | colnames(primary)== "X2017..YR2017." | colnames(primary)== "X2021..YR2021.")

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]

transpose_p$Albania = as.numeric(as.character(transpose_p$Albania))
transpose_p$Australia = as.numeric(as.character(transpose_p$Australia))
transpose_p$Armenia = as.numeric(as.character((transpose_p$Armenia)))
transpose_p$Algeria = as.numeric(as.character((transpose_p$Algeria)))
transpose_p$Argentina = as.numeric(as.character((transpose_p$Argentina)))

head(transpose_p)

year <- c(2014, 2017, 2021)
ggplot(data=transpose_p, aes(x=year, y=Albania, group=1)) + geom_line() + geom_point()


#Distinguish primary data
transpose_p <- rename(transpose_p, "Albania_p" = 1, "Australia_p" = 2, "Armenia_p" = 3, "Algeria_p" = 4, "Argentia_p" = 5)
head(transpose_p)

# Get and plot secondary or more data
setwd("C:/Users/Elianna Nahandast/Desktop/R Project Data/Project_1")
secondary <- read.csv("secondary.csv")

library(tidyverse)
secondary <- secondary %>% 
  filter(Country.Name == "Albania" | Country.Name == "Australia" | Country.Name == "Armenia" | Country.Name == "Algeria" | Country.Name == "Argentina")

head(secondary)

#Eliminate unwanted columns
rel_col <- which(colnames(secondary)== "Country.Name" | colnames(secondary)== "X2014..YR2014." | colnames(secondary)== "X2017..YR2017." | colnames(secondary)== "X2021..YR2021.")

secondary <- secondary[rel_col] %>% 
  rename("2014" = 2, "2017" = 3, "2021" = 4)

head (secondary)
transpose_s <- data.frame(t(secondary[-1]))
colnames(transpose_s) <- secondary[, 1]

transpose_s$Albania = as.numeric(as.character(transpose_s$Albania))
transpose_s$Australia = as.numeric(as.character(transpose_s$Australia))
transpose_s$Armenia = as.numeric(as.character((transpose_s$Armenia)))
transpose_s$Algeria = as.numeric(as.character((transpose_s$Algeria)))
transpose_s$Argentina = as.numeric(as.character((transpose_s$Argentina)))

head(transpose_s)

# Merge the data sets together

transpose_p <- rownames_to_column(transpose_p, var="Year")
transpose_s <- rownames_to_column(transpose_s, var="Year")

acct_owner_by_education <- merge(x = transpose_p, y = transpose_s, by = "Year", all.x = TRUE)

head(acct_owner_by_education)

#Plot data

gfg_plot <- ggplot(acct_owner_by_education, aes(x=year)) +
  geom_line(aes(y = Albania_p), color = "black") +
  geom_line(aes(y = Albania), color = "gray") + 
  geom_line(aes(y = Australia_p), color = "lightblue") +
  geom_line(aes(y = Australia), color = "blue") +
  geom_line(aes(y = Armenia_p), color = "purple") +
  geom_line(aes(y = Armenia), color = "pink") +
  geom_line(aes(y = Algeria), color = "orange") +
  geom_line(aes(y = Algeria_p), color = "red") +
  geom_line(aes(y = Argentina), color = "darkgreen") +
  geom_line(aes(y = Argentia_p), color = "green")

gfg_plot


# Change y - axis
gfg_plot + labs(y = "Percentage Education")

NA
NA

Summary of Data:

The previous graph includes the data across five countries (Albania, Australia, Armenia, Algeria, and Argentina) and their percentages in account ownership of those having a primary education or less and those having a secondary education or higher. At a glance, there doesn’t seem to be as much direct correlation as seen with the previous graph, however there are some notable observations.

Across most countries, while in previous years account ownership within these two groups remained at distinctly differing percentages, in the recent years it has equaled to around the same percentage in both groups of education. For example, this is seen in Algeria, Argentina, and Armenia. Having this in mind, we can see the two countries that fall from this trend are Australia and Albania, both of which have a large difference in ownership percentages between these two groups.

In both Albania and Australia, higher account ownership percentages were present among those having secondary education or higher.

As mentioned previously, this data can also be cherry-picked in various ways especially in disregarding certain years. Over time, each educated group increased and decreased in some way in regards to their account ownership levels, so omitting certain years could easily be done to show the desired results.

For example, looking at Armenia’s primary education or less population, should the graph only include years 2014 - 2017 it could be said this group was less likely to have account ownership at a financial Institution. However, if we looked at the year 2017 - 2021, it could be said this group had a higher likelihood of having account ownership.

Another notable observation, is that there isn’t a large indication of higher probability of one educational group having account ownership over the other. In some countries, those having primary or less were seen to have higher account owner and in others those of secondary or higher were seen to have higher account ownership. Even across time, both educational groups increased and decreased in percentages. There would likely have to be more background information provided or gained in order to make any real conclusions/reasoning behind the data.

LS0tDQp0aXRsZTogIlByb2plY3RfMSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL0VsaWFubmEgTmFoYW5kYXN0L0Rlc2t0b3AvUiBQcm9qZWN0IERhdGEvUHJvamVjdF8xIikNCmZlbWFsZSA8LSByZWFkLmNzdigiZmVtYWxlLmNzdiIpDQoNCiMgRGV0ZXJtaW5lcyBpZiBSIGNvbnNpZGVycyBmZW1hbGUgdG8gYmUgYSBkYXRhIGZyYW1lDQppcy5kYXRhLmZyYW1lKGZlbWFsZSkNCg0KIyBDYW4gbm93IHVzZSBoZWFkIHRvIHNlZSB3aGF0IGZlbWFsZSBsb29rcyBsaWtlDQpoZWFkKGZlbWFsZSkNCg0KIyBJc29sYXRlcyAzIGNvbHVtbnMgZnJvbSB0aGUgb3JpZ2luYWwgZGF0YSBzZXQNCmxpYnJhcnkodGlkeXZlcnNlKQ0KZmVtYWxlIDwtIGZlbWFsZSAlPiUNCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikNCg0KaGVhZChmZW1hbGUpDQoNCiNFbGltaW5hdGUgdW53YW50ZWQgY29sdW1ucw0KY29sbmFtZXMoZmVtYWxlKQ0KcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0gIkNvdW50cnkuTmFtZSIgfCBjb2xuYW1lcyhmZW1hbGUpPT0gIlgyMDE0Li5ZUjIwMTQuIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAyMS4uWVIyMDIxLiIpDQpyZWxfY29sDQoNCmZlbWFsZSA8LSBmZW1hbGVbcmVsX2NvbF0gJT4lIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KaGVhZChmZW1hbGUpDQoNCiNGbGlwIHJvd3MgYW5kIGNvbHVtbnMNCnRyYW5zcG9zZV9mIDwtIGRhdGEuZnJhbWUodChmZW1hbGVbLTFdKSkNCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQ0KaGVhZCh0cmFuc3Bvc2VfZikNCg0KI3RlbGxzIHVzIHdoYXQgdHlwZSB0aGUgZGF0YSBpcyBiZWluZyBzdG9yZWQgYXMuIEluIHRoaXMgY2FzZSB0aGV5IGFyZSBjaGFyYWN0ZXJzIG1lYW5pbmcgY29tcHV0YXRpb25zIHdpdGggdGhlbSB3aWxsIGZhaWwNCiNTbyB3ZSBtdXN0IHR1cm4gdGhlbSBpbnRvIG51bWVyaWMgdmFsdWVzDQpwcmludChzYXBwbHkodHJhbnNwb3NlX2YsIGNsYXNzKSkNCg0KdHJhbnNwb3NlX2YkQnJhemlsID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRCcmF6aWwpDQp0cmFuc3Bvc2VfZiRJbmRpYSA9IGFzLm51bWVyaWModHJhbnNwb3NlX2YkSW5kaWEpDQp0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJCJVbml0ZWQgU3RhdGVzIikNCmhlYWQodHJhbnNwb3NlX2YpDQoNCiNDYW4gbm93IGJlIHN1bW1hcml6ZWQgKGNvbXB1dGUgdGhlIG1lYW4pDQojc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX2YsIGxpc3QobWVhbikpDQoNCnRyYW5zcG9zZV9mICU+JSBzdW1tYXJpc2UoYWNyb3NzKGMoQnJhemlsLCBJbmRpYSwgIlVuaXRlZCBTdGF0ZXMiKSwgbGlzdChtZWFuPW1lYW4sIHNkPXNkKSkpDQoNCiNHcmFwaCBkYXRhDQp5ZWFyIDwtIGMoMjAxNCwgMjAxNywgMjAyMSkNCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBDb25kZW5zZWQgVmVyc2lvbiBmb3IgTWFsZSBEYXRhICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpzZXR3ZCgiQzovVXNlcnMvRWxpYW5uYSBOYWhhbmRhc3QvRGVza3RvcC9SIFByb2plY3QgRGF0YS9Qcm9qZWN0XzEiKQ0KbWFsZSA8LSByZWFkLmNzdigibWFsZS5jc3YiKQ0KbWFsZSA8LSBtYWxlICU+JSANCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikNCg0KbWFsZSA8LSBtYWxlW3JlbF9jb2xdICU+JSANCiAgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpDQoNCnRyYW5zcG9zZV9tIDwtIGRhdGEuZnJhbWUodChtYWxlWy0xXSkpDQpjb2xuYW1lcyh0cmFuc3Bvc2VfbSkgPC0gbWFsZVssIDFdDQoNCnRyYW5zcG9zZV9tJEJyYXppbCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9tJEJyYXppbCkpDQp0cmFuc3Bvc2VfbSRJbmRpYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9tJEluZGlhKSkNCnRyYW5zcG9zZV9tJCJVbml0ZWQgU3RhdGVzIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCh0cmFuc3Bvc2VfbSQiVW5pdGVkIFN0YXRlcyIpKSkNCg0KaGVhZCh0cmFuc3Bvc2VfbSkNCg0KI0Rpc3Rpbmd1aXNoIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGRhdGENCnRyYW5zcG9zZV9tIDwtIHJlbmFtZSh0cmFuc3Bvc2VfbSwgIkJyYXppbF9tIiA9IDEsICJJbmRpYV9tIiA9IDIsICJVbml0ZWRfU3RhdGVzX20iID0gMykNCg0KaGVhZCh0cmFuc3Bvc2VfbSkNCg0KI01lcmdlIG1hbGUgYW5kIGZlbWFsZSBkYXRhIHNldHMNCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikNCnRyYW5zcG9zZV9mIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfZiwgdmFyPSJZZWFyIikNCg0KYWNjdF9vd25lcl9ieV9nZW5kZXIgPC0gbWVyZ2UoeCA9IHRyYW5zcG9zZV9tLCB5ID0gdHJhbnNwb3NlX2YsIGJ5ID0gIlllYXIiLCBhbGwueCA9IFRSVUUpDQphY2N0X293bmVyX2J5X2dlbmRlciA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9nZW5kZXIsICJVbml0ZWRfU3RhdGVzIiA9IDcpDQoNCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpDQoNCiNQbG90IGRhdGENCmdmZ19wbG90IDwtIGdncGxvdChhY2N0X293bmVyX2J5X2dlbmRlciwgYWVzKHg9eWVhcikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSW5kaWEpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gSW5kaWFfbSksIGNvbG9yID0gInJlZCIpICsgDQogIGdlb21fbGluZShhZXMoeSA9IEJyYXppbCksIGNvbG9yID0gImdyZWVuIikgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBCcmF6aWxfbSksIGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9TdGF0ZXMpLCBjb2xvciA9ICJwdXJwbGUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IFVuaXRlZF9TdGF0ZXNfbSksIGNvbG9yID0gInZpb2xldCIpIA0KDQpnZmdfcGxvdA0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFByb2plY3QgMSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgKDEpIENoYW5nZSB5LWF4aXMgZnJvbSAiSW5kaWEiIHRvICJQZXJjZW50YWdlIE93bmVyc2hpcCINCmdmZ19wbG90ICsgbGFicyh5ID0gIlBlcmNlbnRhZ2UgT3duZXJzaGlwIikNCmBgYA0KICgyKSBEaXNjdXNzIHBlcmNlbnRhZ2UgY2hhbmdlIG92ZXIgdGltZQ0KIA0KT2YgdGhlIDMgY291bnRyaWVzIGEgaGlnaGVyIGFjY291bnQgb3duZXJzaGlwIGFtb25nIG1lbiBtb3JlIGxpa2VseSwgZXNwZWNpYWxseSB3aXRoaW4NCkJyYXppbCBhbmQgSW5kaWEuIEhvd2V2ZXIsIG5vdGFibHkgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIHRoZXJlIGlzIG5vIGNsZWFyIGhpZ2hlciANCm93bmVyc2hpcCBiZXR3ZWVuIHRoZSB0d28gZ2VuZGVycyBhcyBpbiBzb21lIHllYXJzIGl0IGlzIGhpZ2hlciBhbW9uZyBmZW1hbGVzIHdoaWxlIGluDQpvdGhlcnMgaXQgaXMgZXF1YWxseSBoaWdoZXIgYW1vbmcgbWFsZXMuIEFsc28sIG5vdGFibHkgaW4gSW5kaWEsIGFzIG9mIHRoZSByZWNlbnQNCnllYXJzIHRoaXMgZ2FwIGluIG93bmVyc2hpcCBiZXR3ZWVuIHRoZSB0d28gZ2VuZGVycyBoYXMgc2xvd2x5IGNsb3NlZC4gV2hlcmVhcyBpbiBCcmF6aWwNCml0IGhhcyBzdGF5ZWQgcmVsYXRpdmVseSB0aGUgc2FtZSBvdmVyIHRoZSB5ZWFycy4NCg0KQXMgZm9yIGFjY291bnQgb3duZXJzaGlwIG92ZXJhbGwsIG1hbnkgY291bnRyaWVzIGRlbW9uc3RyYXRlIGEgcmlzZSBpbiBvd25lcnNoaXAgZXNwZWNpYWxseQ0KYW1vbmcgZmVtYWxlcy4gVGhlIG9ubHkgYXJlYXMgaW4gY29udHJhZGljdGlvbiB3aXRoIHRoaXMgdHJlbmQgYXJlIHRoZSBtYWxlIA0KcG9wdWxhdGlvbnMgb2YgYm90aCBJbmRpYSBhbmQgdGhlIFVuaXRlZCBTdGF0ZXMsIHdoaWNoIGhhdmUgZGVtb25zdHJhdGVkIGEgZ3JhZHVhbA0KZGVjcmVhc2UgaW4gYWNjb3VudCBvd25lcnNoaXAuIEhvd2V2ZXIsIGV2ZW4gd2l0aCB0aGlzIGRlY2xpbmUsIGFjY291bnQgb3duZXJzaGlwIA0KcGVyY2VudGFnZXMgb2YgMjAyMSByZW1haW4gYWNyb3NzIGFsbCBjb3VudHJpZXMsIGZvciB0aGUgbW9zdCBwYXJ0LCBoaWdoZXIgdGhhbiB0aG9zZSBvZg0KMjAxNC4NCg0KICgzKSBJcyBpdCBwb3NzaWJsZSB0byBzYXkgdGhhdCBhY2NvdW50IHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBpbmNyZWFzaW5nIGlmIHlvdSBkaXNyZWdhcmQgDQogICAgIGEgY2VydGFpbiB5ZWFyPyBEb2VzIHRoaXMgY2hhbmdlIGlmIHlvdSBmb2N1cyBvbiBhIHBhcnRpY3VsYXINCiAgICAgcGFydGljdWxhciBjb3VudHJ5IGFuZCBnZW5kZXIgY29tYmluYXRpb25zPw0KDQpBY3Jvc3MgYWxsIGNvdW50cmllcywgdGhlcmUgaXMgYSBub3RpY2VhYmxlIHNoYXJwIHR1cm5pbmcgcG9pbnQgYXJvdW5kIDIwMTcgd2hlcmUNCmVhY2ggY291bnRyeSBlaXRoZXIgc3Bpa2VkIGluIGFjY291bnQgb3duZXJzaGlwIG9yIGRlY2xpbmVkIGhlYXZpbHkuIEluIHRoaXMgY2FzZSwgDQpkaXNyZWdhcmRpbmcgeWVhcnMgYWZ0ZXIgMjAxNyBjb3VsZCBtYWtlIGl0IHNlZW0gYXMgdGhvdWdoIGFjY291bnQgb3duZXJzaGlwIA0KaW4gYSBjb3VudHJ5IHdhcyBtb3JlIGxpa2VseSB3aGVuIGluIHJlYWxpdHkgaXQgd2FzIGxlc3MgbGlrZWx5IGF0IGEgcG9pbnQgaW4gdGltZQ0KYW5kIHZpY2UgdmVyc3VzLg0KDQpUaGVyZSBhcmUgYWxzbyBtYW55IGNhc2VzIGluIGVhY2ggY291bnRyeSB3aGVyZSBvbWl0dGluZyBjZXJ0YWluIHllYXJzIGNvdWxkIA0KcHJvZHVjZSB0aGUgaWRlYSBvZiBhIG1vcmUgcHJvYmFibGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZQ0KRm9yIGV4YW1wbGU6DQpJbiBJbmRpYSwgZGlzcmVnYXJkaW5nIDIwMTYgLSAyMDE4DQpJbiBCcmF6aWwsIGRpc3JlZ2FyZGluZyAyMDE2IC0gMjAxOA0KSW4gdGhlIFVuaXRlZCBTdGF0ZXMgMjAxNSAtIDIwMTggKEFsdGhvdWdoIHRoaXMgd291bGQgYmUgbW9yZSBvZiBhIGNvbnN0YW50IHJhdGUpDQoNClRoZXNlIHJlc3VsdHMgY291bGQgYWxzbyBiZSByZXBsaWNhdGVkIHdpdGggZGlmZmVyZW50IGdlbmRlciBhbmQgY291bnRyeQ0KY29tYmluYXRpb25zLCBmb3IgZXhhbXBsZSBvbmx5IHVzaW5nIHRoZSBoaWdoZXIgb3duZXJzaGlwIGdlbmRlcnMgZm9yIGVhY2ggY291bnRyeToNCnRoZSBmZW1hbGVzIG9mIHRoZSBVbml0ZWQgU3RhdGVzLCBmZW1hbGVzIG9mIEluZGlhIChkb24ndCBoYXZlIGEgc2hhcnAgZGVjbGluZQ0KbGlrZSB0aGUgbWVuIGRvIGFsdGhvdWdoIHRoZWlyIHBlcmNlbnRhZ2UgaXMgbG93ZXIgYWNyb3NzIHRoZSB5ZWFycyBpbiBjb21wYXJpc29uKSwgDQphbmQgbWFsZXMgb2YgQnJhemlsLiBUaGVzZSBjb21iaW5hdGlvbnMgY291bGQgY3JlYXRlIHRoZSBhbGx1c2lvbnMgb2YgYSBoaWdoZXIgbGlrZWxpaG9vZCBvZg0KYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgYW1vbmcgY2VydGFpbiBnZW5kZXJzLg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIFByb2plY3QgMSAoQ29udGludWVkKSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAoNCkgQW5hbHlzaXMgb2YgY3N2IGZpbGVzDQoNCiMgR2V0IGFuZCBQbG90IHByaW1hcnkgb3IgbGVzcyBwZXJjZW50YWdlIHJhdGVzDQpzZXR3ZCgiQzovVXNlcnMvRWxpYW5uYSBOYWhhbmRhc3QvRGVza3RvcC9SIFByb2plY3QgRGF0YS9Qcm9qZWN0XzEiKQ0KcHJpbWFyeSA8LSByZWFkLmNzdigicHJpbWFyeS5jc3YiKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnByaW1hcnkgPC0gcHJpbWFyeSAlPiUgDQogIGZpbHRlcihDb3VudHJ5Lk5hbWUgPT0gIkFsYmFuaWEiIHwgQ291bnRyeS5OYW1lID09ICJBdXN0cmFsaWEiIHwgQ291bnRyeS5OYW1lID09ICJBcm1lbmlhIiB8IENvdW50cnkuTmFtZSA9PSAiQWxnZXJpYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkFyZ2VudGluYSIpDQoNCmhlYWQocHJpbWFyeSkNCg0KI0VsaW1pbmF0ZSB1bndhbnRlZCBjb2x1bW5zDQpyZWxfY29sIDwtIHdoaWNoKGNvbG5hbWVzKHByaW1hcnkpPT0gIkNvdW50cnkuTmFtZSIgfCBjb2xuYW1lcyhwcmltYXJ5KT09ICJYMjAxNC4uWVIyMDE0LiIgfCBjb2xuYW1lcyhwcmltYXJ5KT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhwcmltYXJ5KT09ICJYMjAyMS4uWVIyMDIxLiIpDQoNCnByaW1hcnkgPC0gcHJpbWFyeVtyZWxfY29sXSAlPiUgDQogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KDQpoZWFkIChwcmltYXJ5KQ0KdHJhbnNwb3NlX3AgPC0gZGF0YS5mcmFtZSh0KHByaW1hcnlbLTFdKSkNCmNvbG5hbWVzKHRyYW5zcG9zZV9wKSA8LSBwcmltYXJ5WywgMV0NCg0KdHJhbnNwb3NlX3AkQWxiYW5pYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9wJEFsYmFuaWEpKQ0KdHJhbnNwb3NlX3AkQXVzdHJhbGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3AkQXVzdHJhbGlhKSkNCnRyYW5zcG9zZV9wJEFybWVuaWEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3AkQXJtZW5pYSkpKQ0KdHJhbnNwb3NlX3AkQWxnZXJpYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCh0cmFuc3Bvc2VfcCRBbGdlcmlhKSkpDQp0cmFuc3Bvc2VfcCRBcmdlbnRpbmEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3AkQXJnZW50aW5hKSkpDQoNCmhlYWQodHJhbnNwb3NlX3ApDQoNCnllYXIgPC0gYygyMDE0LCAyMDE3LCAyMDIxKQ0KZ2dwbG90KGRhdGE9dHJhbnNwb3NlX3AsIGFlcyh4PXllYXIsIHk9QWxiYW5pYSwgZ3JvdXA9MSkpICsgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkNCg0KI0Rpc3Rpbmd1aXNoIHByaW1hcnkgZGF0YQ0KdHJhbnNwb3NlX3AgPC0gcmVuYW1lKHRyYW5zcG9zZV9wLCAiQWxiYW5pYV9wIiA9IDEsICJBdXN0cmFsaWFfcCIgPSAyLCAiQXJtZW5pYV9wIiA9IDMsICJBbGdlcmlhX3AiID0gNCwgIkFyZ2VudGlhX3AiID0gNSkNCmhlYWQodHJhbnNwb3NlX3ApDQoNCiMgR2V0IGFuZCBwbG90IHNlY29uZGFyeSBvciBtb3JlIGRhdGENCnNldHdkKCJDOi9Vc2Vycy9FbGlhbm5hIE5haGFuZGFzdC9EZXNrdG9wL1IgUHJvamVjdCBEYXRhL1Byb2plY3RfMSIpDQpzZWNvbmRhcnkgPC0gcmVhZC5jc3YoInNlY29uZGFyeS5jc3YiKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnNlY29uZGFyeSA8LSBzZWNvbmRhcnkgJT4lIA0KICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJBbGJhbmlhIiB8IENvdW50cnkuTmFtZSA9PSAiQXVzdHJhbGlhIiB8IENvdW50cnkuTmFtZSA9PSAiQXJtZW5pYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkFsZ2VyaWEiIHwgQ291bnRyeS5OYW1lID09ICJBcmdlbnRpbmEiKQ0KDQpoZWFkKHNlY29uZGFyeSkNCg0KI0VsaW1pbmF0ZSB1bndhbnRlZCBjb2x1bW5zDQpyZWxfY29sIDwtIHdoaWNoKGNvbG5hbWVzKHNlY29uZGFyeSk9PSAiQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKHNlY29uZGFyeSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoc2Vjb25kYXJ5KT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhzZWNvbmRhcnkpPT0gIlgyMDIxLi5ZUjIwMjEuIikNCg0Kc2Vjb25kYXJ5IDwtIHNlY29uZGFyeVtyZWxfY29sXSAlPiUgDQogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQ0KDQpoZWFkIChzZWNvbmRhcnkpDQp0cmFuc3Bvc2VfcyA8LSBkYXRhLmZyYW1lKHQoc2Vjb25kYXJ5Wy0xXSkpDQpjb2xuYW1lcyh0cmFuc3Bvc2VfcykgPC0gc2Vjb25kYXJ5WywgMV0NCg0KdHJhbnNwb3NlX3MkQWxiYW5pYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJEFsYmFuaWEpKQ0KdHJhbnNwb3NlX3MkQXVzdHJhbGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3MkQXVzdHJhbGlhKSkNCnRyYW5zcG9zZV9zJEFybWVuaWEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3MkQXJtZW5pYSkpKQ0KdHJhbnNwb3NlX3MkQWxnZXJpYSA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKCh0cmFuc3Bvc2VfcyRBbGdlcmlhKSkpDQp0cmFuc3Bvc2VfcyRBcmdlbnRpbmEgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX3MkQXJnZW50aW5hKSkpDQoNCmhlYWQodHJhbnNwb3NlX3MpDQoNCiMgTWVyZ2UgdGhlIGRhdGEgc2V0cyB0b2dldGhlcg0KDQp0cmFuc3Bvc2VfcCA8LSByb3duYW1lc190b19jb2x1bW4odHJhbnNwb3NlX3AsIHZhcj0iWWVhciIpDQp0cmFuc3Bvc2VfcyA8LSByb3duYW1lc190b19jb2x1bW4odHJhbnNwb3NlX3MsIHZhcj0iWWVhciIpDQoNCmFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfcCwgeSA9IHRyYW5zcG9zZV9zLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQ0KDQpoZWFkKGFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uKQ0KDQojUGxvdCBkYXRhDQoNCmdmZ19wbG90IDwtIGdncGxvdChhY2N0X293bmVyX2J5X2VkdWNhdGlvbiwgYWVzKHg9eWVhcikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQWxiYW5pYV9wKSwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFsYmFuaWEpLCBjb2xvciA9ICJncmF5IikgKyANCiAgZ2VvbV9saW5lKGFlcyh5ID0gQXVzdHJhbGlhX3ApLCBjb2xvciA9ICJsaWdodGJsdWUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEF1c3RyYWxpYSksIGNvbG9yID0gImJsdWUiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFybWVuaWFfcCksIGNvbG9yID0gInB1cnBsZSIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQXJtZW5pYSksIGNvbG9yID0gInBpbmsiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFsZ2VyaWEpLCBjb2xvciA9ICJvcmFuZ2UiKSArDQogIGdlb21fbGluZShhZXMoeSA9IEFsZ2VyaWFfcCksIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gQXJnZW50aW5hKSwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBBcmdlbnRpYV9wKSwgY29sb3IgPSAiZ3JlZW4iKQ0KDQpnZmdfcGxvdA0KDQojIENoYW5nZSB5IC0gYXhpcw0KZ2ZnX3Bsb3QgKyBsYWJzKHkgPSAiUGVyY2VudGFnZSBFZHVjYXRpb24iKQ0KDQpgYGANCg0KU3VtbWFyeSBvZiBEYXRhOg0KDQpUaGUgcHJldmlvdXMgZ3JhcGggaW5jbHVkZXMgdGhlIGRhdGEgYWNyb3NzIGZpdmUgY291bnRyaWVzIChBbGJhbmlhLCBBdXN0cmFsaWEsIEFybWVuaWEsIA0KQWxnZXJpYSwgYW5kIEFyZ2VudGluYSkgYW5kIHRoZWlyIHBlcmNlbnRhZ2VzIGluIGFjY291bnQgb3duZXJzaGlwDQpvZiB0aG9zZSBoYXZpbmcgYSBwcmltYXJ5IGVkdWNhdGlvbiBvciBsZXNzIGFuZCB0aG9zZSBoYXZpbmcgYSBzZWNvbmRhcnkgDQplZHVjYXRpb24gb3IgaGlnaGVyLiBBdCBhIGdsYW5jZSwgdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFzIG11Y2ggZGlyZWN0IGNvcnJlbGF0aW9uDQphcyBzZWVuIHdpdGggdGhlIHByZXZpb3VzIGdyYXBoLCBob3dldmVyIHRoZXJlIGFyZSBzb21lIG5vdGFibGUgb2JzZXJ2YXRpb25zLg0KDQpBY3Jvc3MgbW9zdCBjb3VudHJpZXMsIHdoaWxlIGluIHByZXZpb3VzIHllYXJzIGFjY291bnQgb3duZXJzaGlwIHdpdGhpbiB0aGVzZSB0d28NCmdyb3VwcyByZW1haW5lZCBhdCBkaXN0aW5jdGx5IGRpZmZlcmluZyBwZXJjZW50YWdlcywgaW4gdGhlIHJlY2VudCB5ZWFycyBpdCBoYXMgZXF1YWxlZCB0bw0KYXJvdW5kIHRoZSBzYW1lIHBlcmNlbnRhZ2UgaW4gYm90aCBncm91cHMgb2YgZWR1Y2F0aW9uLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBzZWVuIGluIEFsZ2VyaWEsIEFyZ2VudGluYSwgDQphbmQgQXJtZW5pYS4gSGF2aW5nIHRoaXMgaW4gbWluZCwgd2UgY2FuIHNlZSB0aGUgdHdvIGNvdW50cmllcyB0aGF0IGZhbGwgZnJvbSB0aGlzIHRyZW5kIGFyZSANCkF1c3RyYWxpYSBhbmQgQWxiYW5pYSwgYm90aCBvZiB3aGljaCBoYXZlIGEgbGFyZ2UgZGlmZmVyZW5jZSBpbiBvd25lcnNoaXAgcGVyY2VudGFnZXMgYmV0d2VlbiANCnRoZXNlIHR3byBncm91cHMuDQoNCkluIGJvdGggQWxiYW5pYSBhbmQgQXVzdHJhbGlhLCBoaWdoZXIgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBwcmVzZW50IGFtb25nIHRob3NlIGhhdmluZw0Kc2Vjb25kYXJ5IGVkdWNhdGlvbiBvciBoaWdoZXIuDQoNCkFzIG1lbnRpb25lZCBwcmV2aW91c2x5LCB0aGlzIGRhdGEgY2FuIGFsc28gYmUgY2hlcnJ5LXBpY2tlZCBpbiB2YXJpb3VzIHdheXMgZXNwZWNpYWxseQ0KaW4gZGlzcmVnYXJkaW5nIGNlcnRhaW4geWVhcnMuIE92ZXIgdGltZSwgZWFjaCBlZHVjYXRlZCBncm91cCBpbmNyZWFzZWQgYW5kDQpkZWNyZWFzZWQgaW4gc29tZSB3YXkgaW4gcmVnYXJkcyB0byB0aGVpciBhY2NvdW50IG93bmVyc2hpcCBsZXZlbHMsIHNvIG9taXR0aW5nIGNlcnRhaW4geWVhcnMNCmNvdWxkIGVhc2lseSBiZSBkb25lIHRvIHNob3cgdGhlIGRlc2lyZWQgcmVzdWx0cy4NCg0KRm9yIGV4YW1wbGUsIGxvb2tpbmcgYXQgQXJtZW5pYSdzIHByaW1hcnkgZWR1Y2F0aW9uIG9yIGxlc3MgcG9wdWxhdGlvbiwgc2hvdWxkIHRoZSBncmFwaA0Kb25seSBpbmNsdWRlIHllYXJzIDIwMTQgLSAyMDE3IGl0IGNvdWxkIGJlIHNhaWQgdGhpcyBncm91cCB3YXMgbGVzcyBsaWtlbHkgdG8gaGF2ZSBhY2NvdW50IA0Kb3duZXJzaGlwIGF0IGEgZmluYW5jaWFsIEluc3RpdHV0aW9uLiBIb3dldmVyLCBpZiB3ZSBsb29rZWQgYXQgdGhlIHllYXIgMjAxNyAtIDIwMjEsIGl0IGNvdWxkIGJlIA0Kc2FpZCB0aGlzIGdyb3VwIGhhZCBhIGhpZ2hlciBsaWtlbGlob29kIG9mIGhhdmluZyBhY2NvdW50IG93bmVyc2hpcC4NCg0KQW5vdGhlciBub3RhYmxlIG9ic2VydmF0aW9uLCBpcyB0aGF0IHRoZXJlIGlzbid0IGEgbGFyZ2UgaW5kaWNhdGlvbiBvZiBoaWdoZXIgcHJvYmFiaWxpdHkNCm9mIG9uZSBlZHVjYXRpb25hbCBncm91cCBoYXZpbmcgYWNjb3VudCBvd25lcnNoaXAgb3ZlciB0aGUgb3RoZXIuIEluIHNvbWUgY291bnRyaWVzLCB0aG9zZSBoYXZpbmcgDQpwcmltYXJ5IG9yIGxlc3Mgd2VyZSBzZWVuIHRvIGhhdmUgaGlnaGVyIGFjY291bnQgb3duZXIgYW5kIGluIG90aGVycyB0aG9zZSBvZiBzZWNvbmRhcnkgb3INCmhpZ2hlciB3ZXJlIHNlZW4gdG8gaGF2ZSBoaWdoZXIgYWNjb3VudCBvd25lcnNoaXAuIEV2ZW4gYWNyb3NzIHRpbWUsIGJvdGggZWR1Y2F0aW9uYWwgZ3JvdXBzIGluY3JlYXNlZA0KYW5kIGRlY3JlYXNlZCBpbiBwZXJjZW50YWdlcy4gVGhlcmUgd291bGQgbGlrZWx5IGhhdmUgdG8gYmUgbW9yZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIHByb3ZpZGVkIG9yIA0KZ2FpbmVkIGluIG9yZGVyIHRvIG1ha2UgYW55IHJlYWwgY29uY2x1c2lvbnMvcmVhc29uaW5nIGJlaGluZCB0aGUgZGF0YS4NCg==