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.
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.
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 significantly greater rise (slope) in percentage
ownership over time than compared with the rise in 2014 to 2017.
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.
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?
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).
For the second question, 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:
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)
gfg_plot <- 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
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. We can once again dissect our
plot country by country to truly understand it:

Starting with Canada, we can see that percentage ownership has been
on the rise for secondary education, but not for primary education,
which is actually on the decline. We can see that (generally) percentage
ownership is greater in Canada for individuals with secondary education
than for individuals with primary education.

Moving on to Chile, we can see that percentage ownership has been
consistently on the rise for primary education individuals, with a
greater rise from 2014 to roughly 2017. However, for secondary
education, percentage ownership actually was on a decline from 2014 to
roughly 2017, but has been on a rise since that point in 2017 to the
current [latest] data. Also, percentage ownership has always been
significantly greater for individuals in Chile with secondary education
than individuals with primary education in the country.

Looking at China’s data now, we can see that percentage ownership has
always been consistently on the rise for secondary education individuals
(within our data sets time frame). However, for primary education,
percentage ownership was on a decline from 2014 to roughly 2017, but has
been on a rise (similar slope/rate to that of secondary education
individuals) since that point in 2017 to the current [latest] data.
Also, percentage ownership used to be greater for primary education
individuals in China from early/start 2014 to roughly mid-2014, but
since that point to the current [latest] data, secondary education
individuals in China have had greater percentage ownership.

Next up, looking at Germany’s data, we can see that percentage
ownership has always been consistently on the rise for both primary and
secondary education. However, we can see that this rise stops once the
percentage ownership reaches 100 (since that is the maximum). We can see
that primary education percentage ownership increased much faster and
reached this threshold earlier (roughly 2017) compared to secondary
education percentage ownership which only reached this threshold at the
latest data point. Accordingly, only from 2014 to roughly late 2015 was
percentage ownership greater for secondary education individuals, and
from then until right before the current data, primary education
individuals have had greater percentage ownership. However, currently
percentage ownership is the same among both groups.

Lastly, looking at the UK’s data, we can see that percentage
ownership has always been consistently on the decline for primary
education individuals until roughly 2017. From then on (to the current
[latest] data) it’s been consistently on the rise for the primary
education group. For secondary education individuals, the data
illustrates that percentage ownership has been consistently on the rise
(with the greater slope (increase) from 2014 to 2017). We can see that
from 2014 to early-2016 that primary education percentage ownership was
greater, however from that early-2016 point up until early-2020
secondary education individuals had greater percentage ownership. From
that early-2020 point to the current [latest] data, primary education
percentage ownership was once again greater than secondary education
individuals.

To summarize, the data really varies by country and educational
level, but I can say, in general, the trend of the data illustrates
percentage ownership was on the rise within the data time frame. We can
also generally conclude that secondary education individuals tend to
have greater percentage ownership than primary education
individuals.
LS0tCnRpdGxlOiAiUHJvamVjdCAjMSAtIEZhaXogU2hhaWtoIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMiKQoKZmVtYWxlIDwtIHJlYWQuY3N2KCJmZW1hbGUuY3N2IikKCiMgRGV0ZXJtaW5lIHRoYXQgUiBkb2VzIGNvbnNpZGVyIGZlbWFsZSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUoZmVtYWxlKQoKaGVhZChmZW1hbGUpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmZlbWFsZSA8LSBmZW1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikKCmhlYWQoZmVtYWxlKQoKY29sbmFtZXMoZmVtYWxlKQoKcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0iQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhmZW1hbGUpID09ICJYMjAyMS4uWVIyMDIxLiIgKQpyZWxfY29sCgpmZW1hbGUgPC0gZmVtYWxlW3JlbF9jb2xdICU+JSByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKaGVhZChmZW1hbGUpCgp0cmFuc3Bvc2VfZiA8LSBkYXRhLmZyYW1lKHQoZmVtYWxlWy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQpoZWFkKHRyYW5zcG9zZV9mKQoKcHJpbnQoc2FwcGx5KHRyYW5zcG9zZV9mLCBjbGFzcykpCgp0cmFuc3Bvc2VfZiRCcmF6aWwgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJEJyYXppbCkgCnRyYW5zcG9zZV9mJEluZGlhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRJbmRpYSkKdHJhbnNwb3NlX2YkIlVuaXRlZCBTdGF0ZXMiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIpCmhlYWQodHJhbnNwb3NlX2YpCgpzdW1tYXJpc2VfZWFjaCh0cmFuc3Bvc2VfZiwgbGlzdChtZWFuKSkKCnRyYW5zcG9zZV9mICU+JQogIHN1bW1hcmlzZShhY3Jvc3MoYyhCcmF6aWwsIEluZGlhLCAiVW5pdGVkIFN0YXRlcyIpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtMiIpCgptYWxlIDwtIHJlYWQuY3N2KGZpbGUgPSAibWFsZS5jc3YiKQptYWxlIDwtIG1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikgCgptYWxlIDwtIG1hbGVbcmVsX2NvbF0gJT4lIAogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQoKdHJhbnNwb3NlX20gPC0gZGF0YS5mcmFtZSh0KG1hbGVbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX20pIDwtIG1hbGVbLCAxXQoKdHJhbnNwb3NlX20kQnJhemlsID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kQnJhemlsKSkgCnRyYW5zcG9zZV9tJEluZGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kSW5kaWEpKQp0cmFuc3Bvc2VfbSQiVW5pdGVkIFN0YXRlcyIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX20kIlVuaXRlZCBTdGF0ZXMiKSkpCgpoZWFkKHRyYW5zcG9zZV9tKQoKdHJhbnNwb3NlX20gPC0gcmVuYW1lKHRyYW5zcG9zZV9tLCAiQnJhemlsX20iID0gMSwgIkluZGlhX20iID0gMiwgIlVuaXRlZF9TdGF0ZXNfbSIgPSAzKQoKaGVhZCh0cmFuc3Bvc2VfbSkKCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9mIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfZiwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZ2VuZGVyIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfbSwgeSA9IHRyYW5zcG9zZV9mLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2dlbmRlciA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9nZW5kZXIsICJVbml0ZWRfU3RhdGVzIiA9IDcpCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpCgpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9nZW5kZXIsIGFlcyh4PXllYXIpKSArICAKICAgIGdlb21fbGluZShhZXMoeSA9IEluZGlhKSwgY29sb3IgPSAiYmxhY2siKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBJbmRpYV9tKSwgY29sb3IgPSAicmVkIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsKSwgY29sb3IgPSAiZ3JlZW4iKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBCcmF6aWxfbSksIGNvbG9yID0gImJsdWUiKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfU3RhdGVzKSwgY29sb3IgPSAicHVycGxlIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX1N0YXRlc19tKSwgY29sb3IgPSAidmlvbGV0IikKYGBgCgojIFBhcnQgMTogKENsZWFuaW5nIHVwIHRoZSBmaW5hbCBwbG90KSBUaGUgZmluYWwgcGxvdCBpcyBzb21ld2hhdCBtaXNsZWFkaW5nOiB0aGUgeS1heGlzIGlzIHRpdGxlZCAiSW5kaWEiLiBXcml0ZSBkb3duIHRoZSBjb2RlIHRoYXQgd2lsbCBjaGFuZ2UgaXQgdG8gcGVyY2VudGFnZSBvd25lcnNoaXAuCmBgYHtyfQpnZmdfcGxvdCA8LSBnZmdfcGxvdCArIHlsYWIoInBlcmNlbnRhZ2Ugb3duZXJzaGlwIikKZ2ZnX3Bsb3QKYGBgCgoKICAhW10oL1VzZXJzL2ZhaXpzaGFpa2gvRGVza3RvcC9nZ3Bsb3Rfb3JpZy5wbmcpCgojIFBhcnQgMjogKERyYXdpbmcgQ29uY2x1c2lvbnMpIEFmdGVyIGRyYXdpbmcgdGhlIHBsb3QgdGhhdCBpbmNsdWRlcyBob3cgcGVyY2VudGFnZXMgY2hhbmdlIG92ZXIgdGltZSwgdXNlIHRoaXMgdG8gZHJhdyBzb21lIChmYWlybHkgYmFzaWMpIGNvbmNsdXNpb25zIG9uIHRoZSBob3cgdGhlIG93bmVyc2hpcCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gY2hhbmdlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGlzY3VzcyB3aGV0aGVyIG1hbGVzIGhhdmUgbW9yZSBhY2NvdW50IG93bmVyc2hpcCB0aGFuIGZlbWFsZXMgYW5kIHdoZXRoZXIgdGhlIGRhdGEgc3VnZ2VzdHMgdGhhdCBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyBhcmUgb24gdGhlIHJpc2UuCgpCYXNlZCBvbiB0aGUgZGF0YSBhbmQgdGhlIHBsb3QgdGhhdCB3YXMgZ2VuZXJhdGVkIGZvciBob3cgcGVyY2VudGFnZSBvd25lcnNoaXAgY2hhbmdlcyBvdmVyIHRpbWUuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIHNlZW1zIHRvIGJlIGFsbW9zdCBhIHBpdm90LCBvciBzaGlmdCBpbiB0aGUgb3ZlcmFsbCBkYXRhIGF0IHJvdWdobHkgMjAxNy4gV2UgY2FuIGRpc3NlY3QgdGhpcyBieSB1bmRlcnN0YW5kaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgcGVyY2VudGFnZSBvd25lcnNoaXAgaW4gZWFjaCBjb3VudHJ5LiBTdGFydGluZyB3aXRoIEluZGlhLCB3ZSBjYW4gc2VlIHRoYXQgZnJvbSAyMDE0IHRvIDIwMTcgYm90aCBtYWxlIGFuZCBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBvbiB0aGUgcmlzZSwgaG93ZXZlciBhZnRlciB0aGF0IChmcm9tIDIwMTcgdG8gMjAyMCBhbmQgYmV5b25kKSBpdCdzIGJlZW4gb24gYSBkZWNsaW5lIHdpdGggbWFsZSBvd25lcnNoaXAgcGVyY2VudGFnZSBkZWNsaW5pbmcgYXQgYSBmYXN0ZXIgcmF0ZS4gSG93ZXZlciwgZm9yIHRoZSBtb3N0IHBhcnQgbWFsZXMgYXBwZWFyIHRvIGhhdmUgbW9yZSBhY2NvdW50IG93bmVyc2hpcCB0aGFuIGZlbWFsZXMgaW4gSW5kaWEsIHVudGlsIHRoZSBlbmRpbmcgb2YgZGF0YSAobW9zdCByZWNlbnQpIHdoZXJlIHRoZXkgYXBwZWFyIHRvIGJlIHRoZSBzYW1lLgoKTW92aW5nIG9uIHRvIEJyYXppbCwgd2UgY2FuIHNlZSB0aGF0IG1hbGVzIGhhdmUgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBmZW1hbGVzIGZyb20gMjAxNCBhbGwgdGhlIHdheSB1cCB1bnRpbCB0aGUgY3VycmVudCAobGF0ZXN0KSBhdmFpbGFibGUgZGF0YS4gV2UgY2FuIGFsc28gc2VlIHRoYXQgZm9yIGJvdGggbWFsZXMgYW5kIGZlbWFsZXMgdGhlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBvbiB0aGUgcmlzZS4gRnJvbSAyMDE0IHRvIHJvdWdobHkgMjAxNyB0aGVyZSBkZWZpbml0ZWx5IHdhcyBhIHJpc2UsIGhvd2V2ZXIsIGZyb20gMjAxNyB0byB0aGUgbGF0ZXN0LCB0aGVyZSB3YXMgYSBzaWduaWZpY2FudGx5IGdyZWF0ZXIgcmlzZSAoc2xvcGUpIGluIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIG92ZXIgdGltZSB0aGFuIGNvbXBhcmVkIHdpdGggdGhlIHJpc2UgaW4gMjAxNCB0byAyMDE3LgoKTGFzdGx5LCBsb29raW5nIGF0IHRoZSBVbml0ZWQgU3RhdGVzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGRhdGEgaXMgbm90IGFzIHN0cmFpZ2h0Zm9yd2FyZCBhcyB0aGF0IG9mIEluZGlhIGFuZCBCcmF6aWwuIFdlIGNhbiBzZWUgdGhhdCBmcm9tIDIwMTQgdG8gc29tZSBwb2ludCBpbiBlYXJseS1taWQgMjAxNiB0aGF0IGZlbWFsZXMgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBtYWxlcy4gSG93ZXZlciwgZnJvbSB0aGF0IHNhbWUgZWFybHktbWlkIDIwMTYgcG9pbnQgdXAgdW50aWwgc29tZXdoZXJlIGxhdGUgaW4gMjAxNywgbWFsZXMgYWN0dWFsbHkgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzLiBXZSBjYW4gYWxzbyBzZWUgdGhhdCBmcm9tIDIwMTQgdG8gMjAxNywgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIHdhcyBvbiB0aGUgcmlzZSwgd2hlcmVhcyBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBkZWNsaW5pbmcuIEhvd2V2ZXIsIGZyb20gMjAxNyBhbGwgdGhlIHdheSB0byB0aGUgY3VycmVudCAgKGxhdGVzdCkgZGF0YSwgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIGhhcyBiZWVuIG9uIHRoZSBkZWNsaW5lLCBhbmQgZmVtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2UgaXMgb24gdGhlIHJpc2UuCiAgClRvIGNvbmNsdWRlLCB3ZSBjYW4gc2VlIHRoYXQsIGluIGdlbmVyYWwsIHdoZW4gY29uc2lkZXJpbmcgYWNjb3VudCBwZXJjZW50YWdlIG93bmVyc2hpcCwgaXQgaGFzIGJlZW4gb24gdGhlIHJpc2UgYW5kIHRoZXJlIGlzIGEgZ3JlYXRlciBwZXJjZW50YWdlIG93bmVyc2hpcCBub3cgKGluIHRoZSBjdXJyZW50IGRhdGEpIHdoZW4gY29tcGFyZWQgdG8gdGhhdCBvZiAyMDE0LiBBbHNvLCBleGNlcHQgZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBpdCBhcHBlYXJzIHRoYXQgaGlzdG9yaWNhbGx5IG1hbGVzIGhhdmUgaGFkIGdyZWF0ZXIgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzIGJhc2VkIHVwb24gb3VyIGRhdGEgb2YgQnJhemlsIGFuZCBJbmRpYS4KCiMgUGFydCAzOiAoQ2hlcnJ5IFBpY2tpbmcpIElzIGl0IHBvc3NpYmxlIHRvIHNheSB0aGF0IGFjY291bnQgcGVyY2VudGFnZXMgaGF2ZSBiZWVuIGluY3JlYXNpbmcgaWYgeW91IGRpc3JlZ2FyZCBhIGNlcnRhaW4geWVhcj8gRG9lcyB0aGlzIGNoYW5nZSBpZiB5b3UgZm9jdXMgb24gYSBwYXJ0aWN1bGFyIGNvdW50cnkgYW5kIGdlbmRlciBjb21iaW5hdGlvbnM/CgpGb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHF1ZXN0aW9uIHdoZXJlIGlzIGFza3MgaWYgd2UgY2FuIGNvbmNsdWRlIHRoYXQgYWNjb3VudCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBpZiB3ZSBkaXNyZWdhcmQgYSBjZXJ0YWluIHllYXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBXZSB3b3VsZCBuZWVkIHRvCmRpc3JlZ2FyZCBtdWx0aXBsZSB5ZWFycyBmb3IgdGhpcyB0byBoYXBwZW4uIEZvciBleGFtcGxlLCBsb29raW5nIGF0IHRoZSBVbml0ZWQgU3RhdGUncyBkYXRhLCB3ZSBzZWUgdGhhdCB0aGUgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IGFsbCB0aGUgd2F5IHRvIHRoZQpjdXJyZW50IChsYXRlc3QpIGRhdGEgd2hpY2ggaXMgcGFzdCAyMDIwLiBUaGUgc2FtZSBjYW4gYmVlbiBzZWVuIGluIHRoZSBkYXRhIGZvciBJbmRpYSdzIG1hbGUgZGF0YSwgd2hlcmUgcGVyY2VudGFnZSBvd25lcm5zaGlwIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IHRvIHRoZSBjdXJyZW50IFtsYXRlc3RdIGRhdGEgYXMgd2VsbCAocGFzdCAyMDIwKS4KIApGb3IgdGhlIHNlY29uZCBxdWVzdGlvbiwgdGVjaG5pY2FsbHkgeWVzLCBpZiB3ZSBkb24ndCBjb25zaWRlciB0aGUgZGF0YSBmb3IgVW5pdGVkIFN0YXRlcyBtYWxlLCBVbml0ZWQgU3RhdGVzIGZlbWFsZSAoZGVjcmVhc2luZyBmcm9tIDIwMTQtMjAxNyksIEluZGlhIG1hbGUsIHRoZW4gaXQgYXBwZWFycyB0aGUgcmVtYWluaW5nIGRhdGEgKEluZGlhIGZlbWFsZSwgQnJhemlsIG1hbGUsIGFuZCBCcmF6aWwgZmVtYWxlKSBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBvdmVyYWxsLiBPciBpZiB3ZSBqdXN0IHdhbnQgdG8gZm9jb3VzIG9uIGEgcGFydGljdWxhciBjb3VudHJ5LCB0aGVuIEJyYXppbCB3aWxsIGFjaGlldmUgdGhhdCBzYW1lIHJlc3VsdCBvZiBhbiBvdmVyYWxsIGluY3JlYXNpbmcgcGVyY2VudGFnZSBvd25lcnNoaXAgdHJlbmQuIFdlIGNhbid0IGRvIHRoaXMgd2l0aCBhIGdlbmRlciBjb21iaW5hdGlvbiAoaS5lLiBhbGwgbWFsZXMgb3IgZmVtYWxlcyBpbiBvdXIgZGF0YSBzZXQpIGJlY2F1c2UgdGhlIGRhdGEgdmFyaWVzIGluIGVhY2ggY291bnRyeS4KICAKIyBQYXJ0IDQ6CgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKCnNldHdkKCIvVXNlcnMvZmFpenNoYWlraC9Eb3dubG9hZHMvUF9EYXRhX0V4dHJhY3RfRnJvbV9Xb3JsZF9EZXZlbG9wbWVudF9JbmRpY2F0b3JzLTUiKQoKcHJpbWFyeSA8LSByZWFkLmNzdigicHJpbWFyeS5jc3YiKQoKIyBEZXRlcm1pbmUgdGhhdCBSIGRvZXMgY29uc2lkZXIgcHJpbWFyeSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUocHJpbWFyeSkKCmhlYWQocHJpbWFyeSkKCmxpYnJhcnkodGlkeXZlcnNlKQoKcHJpbWFyeSA8LSBwcmltYXJ5ICU+JQogIGZpbHRlcihDb3VudHJ5Lk5hbWUgPT0gIkNhbmFkYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaW5hIiB8IENvdW50cnkuTmFtZSA9PSAiVW5pdGVkIEtpbmdkb20iIHwgQ291bnRyeS5OYW1lID09ICJHZXJtYW55IiB8IENvdW50cnkuTmFtZSA9PSAiQ2hpbGUiKQoKaGVhZChwcmltYXJ5KQoKY29sbmFtZXMocHJpbWFyeSkKCnJlbF9jb2wgPC0gd2hpY2goY29sbmFtZXMocHJpbWFyeSk9PSJDb3VudHJ5Lk5hbWUiIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMocHJpbWFyeSkgPT0gIlgyMDIxLi5ZUjIwMjEuIiApCnJlbF9jb2wKCnByaW1hcnkgPC0gcHJpbWFyeVtyZWxfY29sXSAlPiUgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpCmhlYWQocHJpbWFyeSkKCnRyYW5zcG9zZV9wIDwtIGRhdGEuZnJhbWUodChwcmltYXJ5Wy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9wKSA8LSBwcmltYXJ5WywgMV0KaGVhZCh0cmFuc3Bvc2VfcCkKCnByaW50KHNhcHBseSh0cmFuc3Bvc2VfcCwgY2xhc3MpKQoKdHJhbnNwb3NlX3AkQ2FuYWRhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCRDYW5hZGEpIAp0cmFuc3Bvc2VfcCRDaGluYSA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkQ2hpbmEpCnRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIpCnRyYW5zcG9zZV9wJCJHZXJtYW55IiA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkIkdlcm1hbnkiKQp0cmFuc3Bvc2VfcCQiQ2hpbGUiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCQiQ2hpbGUiKQpoZWFkKHRyYW5zcG9zZV9wKQoKc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX3AsIGxpc3QobWVhbikpCgp0cmFuc3Bvc2VfcCAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGMoQ2FuYWRhLCBDaGluYSwgIlVuaXRlZCBLaW5nZG9tIiwgR2VybWFueSwgQ2hpbGUpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9wLCBhZXMoeD15ZWFyLCB5PUNoaW5hLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtNiIpCgpzZWNvbmRhcnkgPC0gcmVhZC5jc3YoZmlsZSA9ICJzZWNvbmRhcnkuY3N2IikKc2Vjb25kYXJ5IDwtIHNlY29uZGFyeSAlPiUKICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJDYW5hZGEiIHwgQ291bnRyeS5OYW1lID09ICJDaGluYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIlVuaXRlZCBLaW5nZG9tIiB8IENvdW50cnkuTmFtZSA9PSAiR2VybWFueSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaWxlIikgCgpzZWNvbmRhcnkgPC0gc2Vjb25kYXJ5W3JlbF9jb2xdICU+JSAKICByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKCnRyYW5zcG9zZV9zIDwtIGRhdGEuZnJhbWUodChzZWNvbmRhcnlbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX3MpIDwtIHNlY29uZGFyeVssIDFdCgp0cmFuc3Bvc2VfcyQiQ2FuYWRhIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJDYW5hZGEiKSkgCnRyYW5zcG9zZV9zJCJDaGluYSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiQ2hpbmEiKSkKdHJhbnNwb3NlX3MkIlVuaXRlZCBLaW5nZG9tIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJVbml0ZWQgS2luZ2RvbSIpKQp0cmFuc3Bvc2VfcyQiR2VybWFueSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiR2VybWFueSIpKQp0cmFuc3Bvc2VfcyQiQ2hpbGUiID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3MkIkNoaWxlIikpCgpoZWFkKHRyYW5zcG9zZV9zKQoKdHJhbnNwb3NlX3MgPC0gcmVuYW1lKHRyYW5zcG9zZV9zLCAiQ2FuYWRhX3MiID0gMSwgIkNoaW5hX3MiID0gMiwgIlVuaXRlZF9LaW5nZG9tX3MiID0gMywgIkdlcm1hbnlfcyIgPSA0LCAiQ2hpbGVfcyIgPSA1KQoKaGVhZCh0cmFuc3Bvc2VfcykKCnRyYW5zcG9zZV9zIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcywgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9wIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcCwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfcywgeSA9IHRyYW5zcG9zZV9wLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2VkdWNhdGlvbiA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9lZHVjYXRpb24sICJVbml0ZWRfS2luZ2RvbSIgPSA3KQpoZWFkKGFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uKQoKCmdmZ19wbG90IDwtIGdncGxvdChkYXRhID0gdHJhbnNwb3NlX3AsIGFlcyh4ID0geWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBDaGluYSwgY29sb3IgPSAiQ2hpbmEiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IENhbmFkYSwgY29sb3IgPSAiQ2FuYWRhIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBgVW5pdGVkIEtpbmdkb21gLCBjb2xvciA9ICJVbml0ZWQgS2luZ2RvbSIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gR2VybWFueSwgY29sb3IgPSAiR2VybWFueSIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbGUsIGNvbG9yID0gIkNoaWxlIikpICsKICBnZW9tX2xpbmUoZGF0YSA9IHRyYW5zcG9zZV9zLCBhZXMoeSA9IENoaW5hX3MsIGNvbG9yID0gIkNoaW5hX3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gQ2FuYWRhX3MsIGNvbG9yID0gIkNhbmFkYV9zIikpICsKICBnZW9tX2xpbmUoZGF0YSA9IHRyYW5zcG9zZV9zLCBhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX3MsIGNvbG9yID0gIlVuaXRlZCBLaW5nZG9tX3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gR2VybWFueV9zLCBjb2xvciA9ICJHZXJtYW55X3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gQ2hpbGVfcywgY29sb3IgPSAiQ2hpbGVfcyIpKSArCiAgeWxhYigiUGVyY2VudGFnZSBPd25lcnNoaXAiKQoKZ2ZnX3Bsb3QKCmBgYAoKTm93IHRoYXQgd2UgYXJlIHVzaW5nIGZpdmUgY291bnRyaWVzLCB0aGUgZGF0YSAoYW5kIHBsb3QpIGNlcnRhaW5seSBpcyBtb3JlIGNvbXBsaWNhdGVkLiBXZSBtdXN0IHByZXNzIHRoZSB6b29tIGJ1dHRvbiBpbiBvcmRlciB0byBmdWxseSBzZWUgb3VyIHBsb3QgaW4gaXRzIGFwcHJvcHJpYXRlIHNjYWxlIHNpbmNlIHRoZSBjb3VudHJpZXMgdmFyeSBkcmFzdGljYWxseSBpbiB0aGVpciBkYXRhIGluIHBlcmNlbnRhZ2Ugb3duZXJzaGlwLiBXZSBjYW4gb25jZSBhZ2FpbiBkaXNzZWN0IG91ciBwbG90IGNvdW50cnkgYnkgY291bnRyeSB0byB0cnVseSB1bmRlcnN0YW5kIGl0OgogCiAhW10oL1VzZXJzL2ZhaXpzaGFpa2gvRGVza3RvcC9nZ3Bsb3RfQ2FuYWRhLnBuZykKClN0YXJ0aW5nIHdpdGggQ2FuYWRhLCB3ZSBjYW4gc2VlIHRoYXQgcGVyY2VudGFnZSBvd25lcnNoaXAgaGFzIGJlZW4gb24gdGhlIHJpc2UgZm9yIHNlY29uZGFyeSBlZHVjYXRpb24sIGJ1dCBub3QgZm9yIHByaW1hcnkgZWR1Y2F0aW9uLCB3aGljaCBpcyBhY3R1YWxseSBvbiB0aGUgZGVjbGluZS4gV2UgY2FuIHNlZSB0aGF0IChnZW5lcmFsbHkpIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGlzIGdyZWF0ZXIgaW4gQ2FuYWRhIGZvciBpbmRpdmlkdWFscyB3aXRoIHNlY29uZGFyeSBlZHVjYXRpb24gdGhhbiBmb3IgaW5kaXZpZHVhbHMgd2l0aCBwcmltYXJ5IGVkdWNhdGlvbi4KIAogICFbXSgvVXNlcnMvZmFpenNoYWlraC9EZXNrdG9wL2dncGxvdF9DaGlsZS5wbmcpCiAKTW92aW5nIG9uIHRvIENoaWxlLCB3ZSBjYW4gc2VlIHRoYXQgcGVyY2VudGFnZSBvd25lcnNoaXAgaGFzIGJlZW4gY29uc2lzdGVudGx5IG9uIHRoZSByaXNlIGZvciBwcmltYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscywgd2l0aCBhIGdyZWF0ZXIgcmlzZSBmcm9tIDIwMTQgdG8gcm91Z2hseSAyMDE3LiBIb3dldmVyLCBmb3Igc2Vjb25kYXJ5IGVkdWNhdGlvbiwgcGVyY2VudGFnZSBvd25lcnNoaXAgYWN0dWFsbHkgd2FzIG9uIGEgZGVjbGluZSBmcm9tIDIwMTQgdG8gcm91Z2hseSAyMDE3LCBidXQgaGFzIGJlZW4gb24gYSByaXNlIHNpbmNlIHRoYXQgcG9pbnQgaW4gMjAxNyB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLiBBbHNvLCBwZXJjZW50YWdlIG93bmVyc2hpcCBoYXMgYWx3YXlzIGJlZW4gc2lnbmlmaWNhbnRseSBncmVhdGVyIGZvciBpbmRpdmlkdWFscyBpbiBDaGlsZSB3aXRoIHNlY29uZGFyeSBlZHVjYXRpb24gdGhhbiBpbmRpdmlkdWFscyB3aXRoIHByaW1hcnkgZWR1Y2F0aW9uIGluIHRoZSBjb3VudHJ5LgogCiAgICFbXSgvVXNlcnMvZmFpenNoYWlraC9EZXNrdG9wL2dncGxvdF9DaGluYS5wbmcpCiAgIApMb29raW5nIGF0IENoaW5hJ3MgZGF0YSBub3csIHdlIGNhbiBzZWUgdGhhdCBwZXJjZW50YWdlIG93bmVyc2hpcCBoYXMgYWx3YXlzIGJlZW4gY29uc2lzdGVudGx5IG9uIHRoZSByaXNlIGZvciBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzICh3aXRoaW4gb3VyIGRhdGEgc2V0cyB0aW1lIGZyYW1lKS4gSG93ZXZlciwgZm9yIHByaW1hcnkgZWR1Y2F0aW9uLCBwZXJjZW50YWdlIG93bmVyc2hpcCB3YXMgb24gYSBkZWNsaW5lIGZyb20gMjAxNCB0byByb3VnaGx5IDIwMTcsIGJ1dCBoYXMgYmVlbiBvbiBhIHJpc2UgKHNpbWlsYXIgc2xvcGUvcmF0ZSB0byB0aGF0IG9mIHNlY29uZGFyeSBlZHVjYXRpb24gaW5kaXZpZHVhbHMpIHNpbmNlIHRoYXQgcG9pbnQgaW4gMjAxNyB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLiBBbHNvLCBwZXJjZW50YWdlIG93bmVyc2hpcCB1c2VkIHRvIGJlIGdyZWF0ZXIgZm9yIHByaW1hcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIGluIENoaW5hIGZyb20gZWFybHkvc3RhcnQgMjAxNCB0byByb3VnaGx5IG1pZC0yMDE0LCBidXQgc2luY2UgdGhhdCBwb2ludCB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLCBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIGluIENoaW5hIGhhdmUgaGFkIGdyZWF0ZXIgcGVyY2VudGFnZSBvd25lcnNoaXAuCiAKICAgIVtdKC9Vc2Vycy9mYWl6c2hhaWtoL0Rlc2t0b3AvZ2dwbG90X0dlcm1hbnkucG5nKQogICAKTmV4dCB1cCwgbG9va2luZyBhdCBHZXJtYW55J3MgZGF0YSwgd2UgY2FuIHNlZSB0aGF0IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGhhcyBhbHdheXMgYmVlbiBjb25zaXN0ZW50bHkgb24gdGhlIHJpc2UgZm9yIGJvdGggcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGVkdWNhdGlvbi4gSG93ZXZlciwgd2UgY2FuIHNlZSB0aGF0IHRoaXMgcmlzZSBzdG9wcyBvbmNlIHRoZSBwZXJjZW50YWdlIG93bmVyc2hpcCByZWFjaGVzIDEwMCAoc2luY2UgdGhhdCBpcyB0aGUgbWF4aW11bSkuIFdlIGNhbiBzZWUgdGhhdCBwcmltYXJ5IGVkdWNhdGlvbiBwZXJjZW50YWdlIG93bmVyc2hpcCBpbmNyZWFzZWQgbXVjaCBmYXN0ZXIgYW5kIHJlYWNoZWQgdGhpcyB0aHJlc2hvbGQgZWFybGllciAocm91Z2hseSAyMDE3KSBjb21wYXJlZCB0byBzZWNvbmRhcnkgZWR1Y2F0aW9uIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIHdoaWNoIG9ubHkgcmVhY2hlZCB0aGlzIHRocmVzaG9sZCBhdCB0aGUgbGF0ZXN0IGRhdGEgcG9pbnQuIEFjY29yZGluZ2x5LCBvbmx5IGZyb20gMjAxNCB0byByb3VnaGx5IGxhdGUgMjAxNSB3YXMgcGVyY2VudGFnZSBvd25lcnNoaXAgZ3JlYXRlciBmb3Igc2Vjb25kYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscywgYW5kIGZyb20gdGhlbiB1bnRpbCByaWdodCBiZWZvcmUgdGhlIGN1cnJlbnQgZGF0YSwgcHJpbWFyeSBlZHVjYXRpb24gaW5kaXZpZHVhbHMgaGF2ZSBoYWQgZ3JlYXRlciBwZXJjZW50YWdlIG93bmVyc2hpcC4gSG93ZXZlciwgY3VycmVudGx5IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGlzIHRoZSBzYW1lIGFtb25nIGJvdGggZ3JvdXBzLgoKICAgIVtdKC9Vc2Vycy9mYWl6c2hhaWtoL0Rlc2t0b3AvZ2dwbG90X1VuaXRlZF9LaW5nZG9tLnBuZykKICAgIApMYXN0bHksIGxvb2tpbmcgYXQgdGhlIFVLJ3MgZGF0YSwgd2UgY2FuIHNlZSB0aGF0IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGhhcyBhbHdheXMgYmVlbiBjb25zaXN0ZW50bHkgb24gdGhlIGRlY2xpbmUgZm9yIHByaW1hcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIHVudGlsIHJvdWdobHkgMjAxNy4gRnJvbSB0aGVuIG9uICh0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhKSBpdCdzIGJlZW4gY29uc2lzdGVudGx5IG9uIHRoZSByaXNlIGZvciB0aGUgcHJpbWFyeSBlZHVjYXRpb24gZ3JvdXAuIEZvciBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzLCB0aGUgZGF0YSBpbGx1c3RyYXRlcyB0aGF0IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGhhcyBiZWVuIGNvbnNpc3RlbnRseSBvbiB0aGUgcmlzZSAod2l0aCB0aGUgZ3JlYXRlciBzbG9wZSAoaW5jcmVhc2UpIGZyb20gMjAxNCB0byAyMDE3KS4gV2UgY2FuIHNlZSB0aGF0IGZyb20gMjAxNCB0byBlYXJseS0yMDE2IHRoYXQgcHJpbWFyeSBlZHVjYXRpb24gcGVyY2VudGFnZSBvd25lcnNoaXAgd2FzIGdyZWF0ZXIsIGhvd2V2ZXIgZnJvbSB0aGF0IGVhcmx5LTIwMTYgcG9pbnQgdXAgdW50aWwgZWFybHktMjAyMCBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIGhhZCBncmVhdGVyIHBlcmNlbnRhZ2Ugb3duZXJzaGlwLiBGcm9tIHRoYXQgZWFybHktMjAyMCBwb2ludCB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLCBwcmltYXJ5IGVkdWNhdGlvbiBwZXJjZW50YWdlIG93bmVyc2hpcCB3YXMgb25jZSBhZ2FpbiBncmVhdGVyIHRoYW4gc2Vjb25kYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscy4KIAogICAhW10oL1VzZXJzL2ZhaXpzaGFpa2gvRGVza3RvcC9nZ3Bsb3QucG5nKQogClRvIHN1bW1hcml6ZSwgdGhlIGRhdGEgcmVhbGx5IHZhcmllcyBieSBjb3VudHJ5IGFuZCBlZHVjYXRpb25hbCBsZXZlbCwgYnV0IEkgY2FuIHNheSwgaW4gZ2VuZXJhbCwgdGhlIHRyZW5kIG9mIHRoZSBkYXRhIGlsbHVzdHJhdGVzIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIHdhcyBvbiB0aGUgcmlzZSB3aXRoaW4gdGhlIGRhdGEgdGltZSBmcmFtZS4gV2UgY2FuIGFsc28gZ2VuZXJhbGx5IGNvbmNsdWRlIHRoYXQgc2Vjb25kYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscyB0ZW5kIHRvIGhhdmUgZ3JlYXRlciBwZXJjZW50YWdlIG93bmVyc2hpcCB0aGFuIHByaW1hcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzLg==