diff --git a/Project 1 b/Project 1
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/Project 1
@@ -0,0 +1 @@
+
diff --git a/Project1.Rmd b/Project1.Rmd
new file mode 100644
index 00000000..b6a11c0d
--- /dev/null
+++ b/Project1.Rmd
@@ -0,0 +1,510 @@
+---
+title: 'Changes in life values for females of different age groups'
+output: html_notebook
+---
+
+
+#### The whole dataset: HappyDB is a corpus of 100,000 crowd-sourced happy moments via Amazon's Mechanical Turk. You can read more about it on https://arxiv.org/abs/1801.07746. But I only use a subset of this dataset to conduct data analysis in this report.
+
+
+```{r, warning=FALSE, message=FALSE,echo=FALSE}
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+library(tm)
+library(tidytext)
+library(tidyverse)
+library(DT)
+library(wordcloud)
+library(scales)
+library(gridExtra)
+library(ngram)
+library(igraph)
+library(ggraph)
+library(rsconnect)
+```
+
+
+
+```{r read data, warning=FALSE, message=FALSE,echo=FALSE}
+hm_data <- read.csv('https://raw.githubusercontent.com/megagonlabs/HappyDB/master/happydb/data/cleaned_hm.csv',stringsAsFactors = FALSE)
+```
+
+
+```{r text processing in tm,warning=FALSE, message=FALSE,echo=FALSE}
+corpus <- VCorpus(VectorSource(hm_data$cleaned_hm))%>%
+ tm_map(content_transformer(tolower))%>%
+ tm_map(removePunctuation)%>%
+ tm_map(removeNumbers)%>%
+ tm_map(removeWords, character(0))%>%
+ tm_map(stripWhitespace)
+```
+
+
+```{r stemming,warning=FALSE, message=FALSE,echo=FALSE}
+stemmed <- tm_map(corpus, stemDocument) %>%
+ tidy() %>%
+ select(text)
+```
+
+
+```{r tidy dictionary,warning=FALSE, message=FALSE,echo=FALSE}
+dict <- tidy(corpus) %>%
+ select(text) %>%
+ unnest_tokens(dictionary, text)
+```
+
+
+```{r stopwords,warning=FALSE, message=FALSE,echo=FALSE}
+data("stop_words")
+
+word <- c("happy","ago","yesterday","lot","today","months","month",
+ "happier","happiest","last","week","past","day","time")
+
+stop_words <- stop_words %>%
+ bind_rows(mutate(tibble(word), lexicon = "updated"))
+```
+
+
+```{r tidy stems with dictionary,warning=FALSE, message=FALSE,echo=FALSE}
+completed <- stemmed %>%
+ mutate(id = row_number()) %>%
+ unnest_tokens(stems, text) %>%
+ bind_cols(dict) %>%
+ anti_join(stop_words, by = c("dictionary" = "word"))
+```
+
+```{r stem completion, warning=FALSE, message=FALSE,echo=FALSE}
+completed <- completed %>%
+ group_by(stems) %>%
+ count(dictionary) %>%
+ mutate(word = dictionary[which.max(n)]) %>%
+ ungroup() %>%
+ select(stems, word) %>%
+ distinct() %>%
+ right_join(completed) %>%
+ select(-stems)
+```
+
+
+```{r reverse unnest,warning=FALSE, message=FALSE,echo=FALSE}
+completed <- completed %>%
+ group_by(id) %>%
+ summarise(text = str_c(word, collapse = " ")) %>%
+ ungroup()
+```
+
+
+```{r cleaned hm_data, warning=FALSE, message=FALSE,echo=FALSE}
+hm_data <- hm_data %>%
+ mutate(id = row_number()) %>%
+ inner_join(completed)
+```
+
+```{r export data,echo=FALSE}
+write_csv(hm_data, "result_moments.csv")
+```
+
+First, I processed the raw textual data 'cleaned_hm.csv' saved in $ data $ file by cleaning data, removing stopwords and creating a tidy version of texts which is saved in $ output $ file.
+
+Then, I combined the processed text with demographic information 'demographic.csv' saved in $ data $ file to generate the dataset for this report.
+
+```{r, message=FALSE,echo=FALSE}
+# Step 1 - Load the processed text data along with demographic information on contributors
+
+# We use the processed data for our analysis and combine it with the demographic information available.
+hm_data <- read_csv("result_moments.csv")
+
+demo_data <- read.csv('https://raw.githubusercontent.com/megagonlabs/HappyDB/master/happydb/data/demographic.csv')
+```
+
+
+```{r combining data, message=FALSE,echo=FALSE}
+# Combine both the data sets and keep the required columns for analysis
+
+# We select a subset of the data that satisfies specific row conditions.
+hm_data <- hm_data %>%
+ inner_join(demo_data, by = "wid") %>%
+ select(wid,
+ original_hm,
+ gender,
+ marital,
+ parenthood,
+ reflection_period,
+ age,
+ country,
+ ground_truth_category,
+ predicted_category,
+ text) %>%
+ mutate(count = sapply(hm_data$text, wordcount)) %>%
+ filter(gender %in% c("m", "f")) %>%
+ filter(marital %in% c("single", "married","divorced","separated","widowed")) %>%
+ filter(parenthood %in% c("n", "y")) %>%
+ filter(reflection_period %in% c("24h", "3m")) %>%
+ mutate(reflection_period = fct_recode(reflection_period,
+ months_3 = "3m", hours_24 = "24h"))
+```
+
+
+
+## Question 1: What make Females in their 10s, 20s, 30s, and 60s happy?
+
+One of the things I do every New Year is to set goals for the new year. Establishing life values is very important to me as I try to live the new year with a new mindset that will help me become a better, happier me. From that perspective, if I could know what life values in general make each age groups happy in advance, I would be able to focus more on those things.
+Thus, I began this project by looking into which moments compose each age groups' happy moments.
+I divided the age groups into females in their 10s, 20s, 30s, and 60s.
+
+
+```{r,echo=FALSE}
+hm_data_10 <- hm_data[hm_data$gender=="f" & hm_data$age>=10 & hm_data$age<20,]
+hm_data_20 <- hm_data[hm_data$gender=="f" & hm_data$age>=20 & hm_data$age<30,]
+hm_data_30 <- hm_data[hm_data$gender=="f" & hm_data$age>=30 & hm_data$age<40,]
+hm_data_60 <- hm_data[hm_data$gender=="f" & hm_data$age>=60 & hm_data$age<70,]
+hm_data_female <- hm_data[hm_data$gender=="f",]
+```
+
+```{r,echo=FALSE}
+bag_of_words_female <- hm_data_female %>%
+ unnest_tokens(word, text)
+
+word_count_female <- bag_of_words_female %>%
+ count(word, sort = TRUE)
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+temp <- bag_of_words_female %>%
+ count(parenthood, word) %>%
+ group_by(parenthood) %>%
+ mutate(proportion = n / sum(n)) %>%
+ select(-n) %>%
+ spread(parenthood, proportion)
+ggplot(temp,
+ aes_string(x = colnames(temp)[2], y = colnames(temp)[3]),
+ color = abs(colnames(temp)[3] - colnames(temp)[2])) +
+ geom_abline(color = "gray40", lty = 2) +
+ geom_jitter(alpha = 0.1, size = 1, width = 0.3, height = 0.3) +
+ labs(title="Words Proportion for females regardless of age")+
+ geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
+ scale_x_log10(labels = percent_format()) +
+ scale_y_log10(labels = percent_format()) +
+ scale_color_gradient(limits = c(0, 0.001), low = "darkslategray4", high = "gray75") +
+ theme(legend.position="none")
+
+```
+
+According to the plot above, regardless of age, females think of "friend", "husband", "family", and "birthday" in their happy moments.
+
+This seemed very general, so I broke it down to 4 different age groups and saw what words/values pop up frequently respectively.
+
+#### Word Cloud
+
+```{r, message=FALSE,echo=FALSE}
+bag_of_words_10 <- hm_data_10 %>%
+ unnest_tokens(word, text)
+
+word_count_10 <- bag_of_words_10 %>%
+ count(word, sort = TRUE)
+
+bag_of_words_20 <- hm_data_20 %>%
+ unnest_tokens(word, text)
+
+word_count_20 <- bag_of_words_20 %>%
+ count(word, sort = TRUE)
+
+bag_of_words_30 <- hm_data_30 %>%
+ unnest_tokens(word, text)
+
+word_count_30 <- bag_of_words_30 %>%
+ count(word, sort = TRUE)
+
+bag_of_words_60 <- hm_data_60 %>%
+ unnest_tokens(word, text)
+
+word_count_60 <- bag_of_words_60 %>%
+ count(word, sort = TRUE)
+```
+
+```{r,message=FALSE,warning=FALSE,echo=FALSE}
+wordcloud(word_count_10$word,word_count_10$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Oranges"))
+
+```
+
+```{r,message=FALSE,warning=FALSE,echo=FALSE}
+wordcloud(word_count_20$word,word_count_20$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Oranges"))
+
+```
+
+```{r, warning=FALSE,message=FALSE,echo=FALSE}
+wordcloud(word_count_30$word,word_count_30$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Oranges"))
+
+```
+
+```{r, warning=FALSE,message=FALSE,echo=FALSE}
+wordcloud(word_count_60$word,word_count_60$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Oranges"))
+
+```
+
+#### Bar Charts
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+ word_count_10[1:15,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ labs(title = "Word Frequency in Happy Moments for female in their 10s")+
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+ word_count_20[1:15,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ labs(title = "Word Frequency in Happy Moments for female in their 20s")+
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+ word_count_30[1:15,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ labs(title = "Word Frequency in Happy Moments for female in their 30s")+
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+ word_count_60[1:15,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ labs(title = "Word Frequency in Happy Moments for female in their 60s")+
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+```
+
+From these word clouds and bar charts, we can see that "friend", "family", "husband" were commonly mentioned for all age groups.
+
+
+
+## Question 2: Other than friends and families, which factors make females happy?
+
+Since friends and families were obvious factors that consisted the female's happiness,
+I excluded those words and focused on other words that were frequently mentioned.
+
+
+#### < 10s >
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+hm_data_female_10 <- hm_data_10[grepl("boyfriend",hm_data_10$text)|grepl("passed",hm_data_10$text)|grepl("event",hm_data_10$text)|grepl("visit",hm_data_10$text)|grepl("college",hm_data_10$text),]
+nrow(hm_data_female_10)
+```
+Of the 82 happy moments that aren't related to 'friends' or 'families' for the teenage females, the frequency of the rest words are as follows:
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+
+bag_of_words_female_10 <- hm_data_female_10 %>%
+ unnest_tokens(word, text)
+
+word_count_female_10 <- bag_of_words_female_10 %>%
+ count(word, sort = TRUE)
+
+word_count_female_10<- word_count_female_10[-c(which(word_count_female_10$word=="friend"),which(word_count_female_10$word=="family")),]
+
+word_count_female_10[1:20,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+wordcloud(word_count_female_10$word,word_count_female_10$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Accent"))
+```
+
+#### < 20s >
+
+For the females in their 20s, the frequency of happy moments that aren't related to 'friends' or 'families' are as follows:
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+bag_of_words_20 <- hm_data_20 %>%
+ unnest_tokens(word, text)
+
+word_count_20 <- bag_of_words_20 %>%
+ count(word, sort = TRUE)
+
+word_count_20<- word_count_20[-c(which(word_count_20$word=="friend"),which(word_count_20$word=="family"),which(word_count_20$word=="home"),which(word_count_20$word=="husband"),which(word_count_20$word=="boyfriend"),which(word_count_20$word=="kids"),which(word_count_20$word=="son"),which(word_count_20$word=="daughter")),]
+
+word_count_20[1:20,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+wordcloud(word_count_20$word,word_count_20$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Accent"))
+```
+
+
+#### < 30s >
+
+For the females in their 30s, the frequency of happy moments that aren't related to 'friends' or 'families' are as follows:
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+bag_of_words_30 <- hm_data_30 %>%
+ unnest_tokens(word, text)
+
+word_count_30 <- bag_of_words_30 %>%
+ count(word, sort = TRUE)
+
+word_count_30<- word_count_30[-c(which(word_count_30$word=="friend"),which(word_count_30$word=="family"),which(word_count_30$word=="home"),which(word_count_30$word=="son"),which(word_count_30$word=="daughter"),which(word_count_30$word=="husband"),which(word_count_30$word=="kids")),]
+
+word_count_30[1:20,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+wordcloud(word_count_30$word,word_count_30$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Accent"))
+```
+
+#### < 60s >
+
+For the females in their 60s, the frequency of happy moments that aren't related to 'friends' or 'families' are as follows:
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+bag_of_words_60 <- hm_data_60 %>%
+ unnest_tokens(word, text)
+
+word_count_60 <- bag_of_words_60 %>%
+ count(word, sort = TRUE)
+
+word_count_60<- word_count_60[-c(which(word_count_60$word=="friend"),which(word_count_60$word=="family"),which(word_count_60$word=="home"),which(word_count_60$word=="son"),which(word_count_60$word=="daughter"),which(word_count_60$word=="husband"),which(word_count_60$word=="kids")),]
+
+word_count_60[1:20,] %>%
+ mutate(word = reorder(word, n)) %>%
+ ggplot(aes(word, n)) +
+ geom_col() +
+ xlab(NULL) +
+ ylab("Word Frequency")+
+ coord_flip()
+wordcloud(word_count_60$word,word_count_60$n ,
+ scale=c(3,0.1),
+ max.words=100,
+ min.freq=1,
+ random.order=FALSE,
+ rot.per=0.3,
+ use.r.layout=T,
+ random.color=FALSE,
+ colors=brewer.pal(9,"Accent"))
+```
+
+
+### 10s - boyfriend, passed, event, visit, college
+### 20s - moment, feel, life, birthday, love, job
+### 30s - watched, dinner, night, played, love
+### 60s - watched, found, visit, dog, dinner, car
+
+
+That means,
+#### for the teenagers, boyfriends or school/college related moments made them happy the most.
+#### For those in their 20s, being in some moments, feeling life and love, or job-related moments made them happy the most.
+#### For those in their 30s, we can infer from the verbs that doing something with people around made them happy the most.
+#### For those in their 60s, we can again infer from the verbs that doing something with people around made them happy the most. It is notable that dogs have appeared for the first time.
+
+
+Below are some examples of the happy moments of each age groups.
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+hm_data_10[grepl("passed",hm_data_10$text),"original_hm"][c(1,2,7,10,11,21),]
+
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+hm_data_20[grepl("birthday",hm_data_20$text),"original_hm"][c(1,2,7,10,11,21),]
+
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+hm_data_30[grepl("dinner",hm_data_30$text),"original_hm"][c(1,2,7,10,11,21),]
+
+```
+
+```{r,warning=FALSE, message=FALSE,echo=FALSE}
+hm_data_60[grepl("dog",hm_data_60$text),"original_hm"][c(1,2,7,10,11,21),]
+
+```
+
+
+## Conclusions
+1. 'Friends' and 'Families' were always mentioned as a top value of all different age groups.
+
+2. For females in 10s and 20s, it could be infered that they had other external factors such as 'college', 'boyfriend', 'life', or 'job' to make them happy.
+
+3. For females in 30s and 60s, it could be infered that internal factors, or the action of doing something with people around you, inferrably friends or families, were what made them happy.
+
+
\ No newline at end of file
diff --git a/Project1.nb.html b/Project1.nb.html
new file mode 100644
index 00000000..805df6a7
--- /dev/null
+++ b/Project1.nb.html
@@ -0,0 +1,2143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+Changes in life values for females of different age groups
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The whole dataset: HappyDB is a corpus of 100,000 crowd-sourced
+happy moments via Amazon’s Mechanical Turk. You can read more about it
+on https://arxiv.org/abs/1801.07746. But I only use a
+subset of this dataset to conduct data analysis in this report.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
First, I processed the raw textual data ‘cleaned_hm.csv’ saved in $
+data $ file by cleaning data, removing stopwords and creating a tidy
+version of texts which is saved in $ output $ file.
+
Then, I combined the processed text with demographic information
+‘demographic.csv’ saved in $ data $ file to generate the dataset for
+this report.
+
+
+
+
+
+
+
+
+
+
+
Question 1: What make Females in their 10s, 20s, 30s, and 60s
+happy?
+
One of the things I do every New Year is to set goals for the new
+year. Establishing life values is very important to me as I try to live
+the new year with a new mindset that will help me become a better,
+happier me. From that perspective, if I could know what life values in
+general make each age groups happy in advance, I would be able to focus
+more on those things. Thus, I began this project by looking into which
+moments compose each age groups’ happy moments. I divided the age groups
+into females in their 10s, 20s, 30s, and 60s.
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
According to the plot above, regardless of age, females think of
+“friend”, “husband”, “family”, and “birthday” in their happy
+moments.
+
This seemed very general, so I broke it down to 4 different age
+groups and saw what words/values pop up frequently respectively.
+
+
Word Cloud
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
+
+
Bar Charts
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
+
+
+

+
+
+
+
From these word clouds and bar charts, we can see that “friend”,
+“family”, “husband” were commonly mentioned for all age groups.
+
+
+
+
Question 2: Other than friends and families, which factors make
+females happy?
+
Since friends and families were obvious factors that consisted the
+female’s happiness, I excluded those words and focused on other words
+that were frequently mentioned.
+
+
< 10s >
+
+
+
+
[1] 82
+
+
+
+
Of the 82 happy moments that aren’t related to ‘friends’ or
+‘families’ for the teenage females, the frequency of the rest words are
+as follows:
+
+
+
+

+
+
+

+
+
+
+
+
+
< 20s >
+
For the females in their 20s, the frequency of happy moments that
+aren’t related to ‘friends’ or ‘families’ are as follows:
+
+
+
+

+
+
+

+
+
+
+
+
+
< 30s >
+
For the females in their 30s, the frequency of happy moments that
+aren’t related to ‘friends’ or ‘families’ are as follows:
+
+
+
+

+
+
+

+
+
+
+
+
+
< 60s >
+
For the females in their 60s, the frequency of happy moments that
+aren’t related to ‘friends’ or ‘families’ are as follows:
+
+
+
+

+
+
+

+
+
+
+
+
+
10s - boyfriend, passed, event, visit, college
+
+
+
20s - moment, feel, life, birthday, love, job
+
+
+
30s - watched, dinner, night, played, love
+
+
+
60s - watched, found, visit, dog, dinner, car
+
That means, #### for the teenagers, boyfriends or school/college
+related moments made them happy the most. #### For those in their 20s,
+being in some moments, feeling life and love, or job-related moments
+made them happy the most. #### For those in their 30s, we can infer from
+the verbs that doing something with people around made them happy the
+most. #### For those in their 60s, we can again infer from the verbs
+that doing something with people around made them happy the most. It is
+notable that dogs have appeared for the first time.
+
Below are some examples of the happy moments of each age groups.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Conclusions
+
+‘Friends’ and ‘Families’ were always mentioned as a top value of
+all different age groups.
+For females in 10s and 20s, it could be infered that they had
+other external factors such as ‘college’, ‘boyfriend’, ‘life’, or ‘job’
+to make them happy.
+For females in 30s and 60s, it could be infered that internal
+factors, or the action of doing something with people around you,
+inferrably friends or families, were what made them happy.
+
+
+
+
+
LS0tDQp0aXRsZTogJ0NoYW5nZXMgaW4gbGlmZSB2YWx1ZXMgZm9yIGZlbWFsZXMgb2YgZGlmZmVyZW50IGFnZSBncm91cHMnDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQogDQojIyMjIFRoZSB3aG9sZSBkYXRhc2V0OiBIYXBweURCIGlzIGEgY29ycHVzIG9mIDEwMCwwMDAgY3Jvd2Qtc291cmNlZCBoYXBweSBtb21lbnRzIHZpYSBBbWF6b24ncyBNZWNoYW5pY2FsIFR1cmsuIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IGl0IG9uIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xODAxLjA3NzQ2LiBCdXQgSSBvbmx5IHVzZSBhIHN1YnNldCBvZiB0aGlzIGRhdGFzZXQgdG8gY29uZHVjdCBkYXRhIGFuYWx5c2lzIGluIHRoaXMgcmVwb3J0Lg0KICANCiAgDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHdvcmRjbG91ZCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KG5ncmFtKQ0KbGlicmFyeShpZ3JhcGgpDQpsaWJyYXJ5KGdncmFwaCkNCmxpYnJhcnkocnNjb25uZWN0KQ0KYGBgDQoNCg0KDQpgYGB7ciByZWFkIGRhdGEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmhtX2RhdGEgPC0gcmVhZC5jc3YoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tZWdhZ29ubGFicy9IYXBweURCL21hc3Rlci9oYXBweWRiL2RhdGEvY2xlYW5lZF9obS5jc3YnLHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCmBgYA0KDQoNCmBgYHtyIHRleHQgcHJvY2Vzc2luZyBpbiB0bSx3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQpjb3JwdXMgPC0gVkNvcnB1cyhWZWN0b3JTb3VyY2UoaG1fZGF0YSRjbGVhbmVkX2htKSklPiUNCiAgdG1fbWFwKGNvbnRlbnRfdHJhbnNmb3JtZXIodG9sb3dlcikpJT4lDQogIHRtX21hcChyZW1vdmVQdW5jdHVhdGlvbiklPiUNCiAgdG1fbWFwKHJlbW92ZU51bWJlcnMpJT4lDQogIHRtX21hcChyZW1vdmVXb3JkcywgY2hhcmFjdGVyKDApKSU+JQ0KICB0bV9tYXAoc3RyaXBXaGl0ZXNwYWNlKQ0KYGBgDQoNCg0KYGBge3Igc3RlbW1pbmcsd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0Kc3RlbW1lZCA8LSB0bV9tYXAoY29ycHVzLCBzdGVtRG9jdW1lbnQpICU+JQ0KICB0aWR5KCkgJT4lDQogIHNlbGVjdCh0ZXh0KQ0KYGBgDQoNCg0KYGBge3IgdGlkeSBkaWN0aW9uYXJ5LHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmRpY3QgPC0gdGlkeShjb3JwdXMpICU+JQ0KICBzZWxlY3QodGV4dCkgJT4lDQogIHVubmVzdF90b2tlbnMoZGljdGlvbmFyeSwgdGV4dCkNCmBgYA0KDQoNCmBgYHtyIHN0b3B3b3Jkcyx3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQpkYXRhKCJzdG9wX3dvcmRzIikNCg0Kd29yZCA8LSBjKCJoYXBweSIsImFnbyIsInllc3RlcmRheSIsImxvdCIsInRvZGF5IiwibW9udGhzIiwibW9udGgiLA0KICAgICAgICAgICAgICAgICAiaGFwcGllciIsImhhcHBpZXN0IiwibGFzdCIsIndlZWsiLCJwYXN0IiwiZGF5IiwidGltZSIpDQoNCnN0b3Bfd29yZHMgPC0gc3RvcF93b3JkcyAlPiUNCiAgYmluZF9yb3dzKG11dGF0ZSh0aWJibGUod29yZCksIGxleGljb24gPSAidXBkYXRlZCIpKQ0KYGBgDQoNCg0KYGBge3IgdGlkeSBzdGVtcyB3aXRoIGRpY3Rpb25hcnksd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KY29tcGxldGVkIDwtIHN0ZW1tZWQgJT4lDQogIG11dGF0ZShpZCA9IHJvd19udW1iZXIoKSkgJT4lDQogIHVubmVzdF90b2tlbnMoc3RlbXMsIHRleHQpICU+JQ0KICBiaW5kX2NvbHMoZGljdCkgJT4lDQogIGFudGlfam9pbihzdG9wX3dvcmRzLCBieSA9IGMoImRpY3Rpb25hcnkiID0gIndvcmQiKSkNCmBgYA0KDQpgYGB7ciBzdGVtIGNvbXBsZXRpb24sIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmNvbXBsZXRlZCA8LSBjb21wbGV0ZWQgJT4lDQogIGdyb3VwX2J5KHN0ZW1zKSAlPiUNCiAgY291bnQoZGljdGlvbmFyeSkgJT4lDQogIG11dGF0ZSh3b3JkID0gZGljdGlvbmFyeVt3aGljaC5tYXgobildKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3Qoc3RlbXMsIHdvcmQpICU+JQ0KICBkaXN0aW5jdCgpICU+JQ0KICByaWdodF9qb2luKGNvbXBsZXRlZCkgJT4lDQogIHNlbGVjdCgtc3RlbXMpDQpgYGANCg0KDQpgYGB7ciByZXZlcnNlIHVubmVzdCx3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQpjb21wbGV0ZWQgPC0gY29tcGxldGVkICU+JQ0KICBncm91cF9ieShpZCkgJT4lDQogIHN1bW1hcmlzZSh0ZXh0ID0gc3RyX2Mod29yZCwgY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpDQpgYGANCg0KDQpgYGB7ciBjbGVhbmVkIGhtX2RhdGEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmhtX2RhdGEgPC0gaG1fZGF0YSAlPiUNCiAgbXV0YXRlKGlkID0gcm93X251bWJlcigpKSAlPiUNCiAgaW5uZXJfam9pbihjb21wbGV0ZWQpDQpgYGANCg0KYGBge3IgZXhwb3J0IGRhdGEsZWNobz1GQUxTRX0NCndyaXRlX2NzdihobV9kYXRhLCAicmVzdWx0X21vbWVudHMuY3N2IikgIA0KYGBgDQoNCkZpcnN0LCBJIHByb2Nlc3NlZCB0aGUgcmF3IHRleHR1YWwgZGF0YSAnY2xlYW5lZF9obS5jc3YnIHNhdmVkIGluICQgZGF0YSAkIGZpbGUgYnkgY2xlYW5pbmcgZGF0YSwgcmVtb3Zpbmcgc3RvcHdvcmRzIGFuZCBjcmVhdGluZyBhIHRpZHkgdmVyc2lvbiBvZiB0ZXh0cyB3aGljaCBpcyBzYXZlZCBpbiAkIG91dHB1dCAkIGZpbGUuDQoNClRoZW4sIEkgY29tYmluZWQgdGhlIHByb2Nlc3NlZCB0ZXh0IHdpdGggZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24gJ2RlbW9ncmFwaGljLmNzdicgc2F2ZWQgaW4gJCBkYXRhICQgZmlsZSB0byBnZW5lcmF0ZSB0aGUgZGF0YXNldCBmb3IgdGhpcyByZXBvcnQuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQojIFN0ZXAgMSAtIExvYWQgdGhlIHByb2Nlc3NlZCB0ZXh0IGRhdGEgYWxvbmcgd2l0aCBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbiBvbiBjb250cmlidXRvcnMNCg0KIyBXZSB1c2UgdGhlIHByb2Nlc3NlZCBkYXRhIGZvciBvdXIgYW5hbHlzaXMgYW5kIGNvbWJpbmUgaXQgd2l0aCB0aGUgZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24gYXZhaWxhYmxlLg0KaG1fZGF0YSA8LSByZWFkX2NzdigicmVzdWx0X21vbWVudHMuY3N2IikNCg0KZGVtb19kYXRhIDwtIHJlYWQuY3N2KCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbWVnYWdvbmxhYnMvSGFwcHlEQi9tYXN0ZXIvaGFwcHlkYi9kYXRhL2RlbW9ncmFwaGljLmNzdicpDQpgYGANCg0KDQpgYGB7ciBjb21iaW5pbmcgZGF0YSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KIyBDb21iaW5lIGJvdGggdGhlIGRhdGEgc2V0cyBhbmQga2VlcCB0aGUgcmVxdWlyZWQgY29sdW1ucyBmb3IgYW5hbHlzaXMNCg0KIyBXZSBzZWxlY3QgYSBzdWJzZXQgb2YgdGhlIGRhdGEgdGhhdCBzYXRpc2ZpZXMgc3BlY2lmaWMgcm93IGNvbmRpdGlvbnMuDQpobV9kYXRhIDwtIGhtX2RhdGEgJT4lDQogIGlubmVyX2pvaW4oZGVtb19kYXRhLCBieSA9ICJ3aWQiKSAlPiUNCiAgc2VsZWN0KHdpZCwNCiAgICAgICAgIG9yaWdpbmFsX2htLA0KICAgICAgICAgZ2VuZGVyLCANCiAgICAgICAgIG1hcml0YWwsIA0KICAgICAgICAgcGFyZW50aG9vZCwNCiAgICAgICAgIHJlZmxlY3Rpb25fcGVyaW9kLA0KICAgICAgICAgYWdlLCANCiAgICAgICAgIGNvdW50cnksIA0KICAgICAgICAgZ3JvdW5kX3RydXRoX2NhdGVnb3J5LCANCiAgICAgICAgIHByZWRpY3RlZF9jYXRlZ29yeSwNCiAgICAgICAgIHRleHQpICU+JQ0KICBtdXRhdGUoY291bnQgPSBzYXBwbHkoaG1fZGF0YSR0ZXh0LCB3b3JkY291bnQpKSAlPiUNCiAgZmlsdGVyKGdlbmRlciAlaW4lIGMoIm0iLCAiZiIpKSAlPiUNCiAgZmlsdGVyKG1hcml0YWwgJWluJSBjKCJzaW5nbGUiLCAibWFycmllZCIsImRpdm9yY2VkIiwic2VwYXJhdGVkIiwid2lkb3dlZCIpKSAlPiUNCiAgZmlsdGVyKHBhcmVudGhvb2QgJWluJSBjKCJuIiwgInkiKSkgJT4lDQogIGZpbHRlcihyZWZsZWN0aW9uX3BlcmlvZCAlaW4lIGMoIjI0aCIsICIzbSIpKSAlPiUNCiAgbXV0YXRlKHJlZmxlY3Rpb25fcGVyaW9kID0gZmN0X3JlY29kZShyZWZsZWN0aW9uX3BlcmlvZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzXzMgPSAiM20iLCBob3Vyc18yNCA9ICIyNGgiKSkNCmBgYA0KDQoNCg0KIyMgUXVlc3Rpb24gMTogV2hhdCBtYWtlIEZlbWFsZXMgaW4gdGhlaXIgMTBzLCAyMHMsIDMwcywgYW5kIDYwcyBoYXBweT8NCg0KT25lIG9mIHRoZSB0aGluZ3MgSSBkbyBldmVyeSBOZXcgWWVhciBpcyB0byBzZXQgZ29hbHMgZm9yIHRoZSBuZXcgeWVhci4gRXN0YWJsaXNoaW5nIGxpZmUgdmFsdWVzIGlzIHZlcnkgaW1wb3J0YW50IHRvIG1lIGFzIEkgdHJ5IHRvIGxpdmUgdGhlIG5ldyB5ZWFyIHdpdGggYSBuZXcgbWluZHNldCB0aGF0IHdpbGwgaGVscCBtZSBiZWNvbWUgYSBiZXR0ZXIsIGhhcHBpZXIgbWUuIEZyb20gdGhhdCBwZXJzcGVjdGl2ZSwgaWYgSSBjb3VsZCBrbm93IHdoYXQgbGlmZSB2YWx1ZXMgaW4gZ2VuZXJhbCBtYWtlIGVhY2ggYWdlIGdyb3VwcyBoYXBweSBpbiBhZHZhbmNlLCBJIHdvdWxkIGJlIGFibGUgdG8gZm9jdXMgbW9yZSBvbiB0aG9zZSB0aGluZ3MuDQpUaHVzLCBJIGJlZ2FuIHRoaXMgcHJvamVjdCBieSBsb29raW5nIGludG8gd2hpY2ggbW9tZW50cyBjb21wb3NlIGVhY2ggYWdlIGdyb3VwcycgaGFwcHkgbW9tZW50cy4NCkkgZGl2aWRlZCB0aGUgYWdlIGdyb3VwcyBpbnRvIGZlbWFsZXMgaW4gdGhlaXIgMTBzLCAyMHMsIDMwcywgYW5kIDYwcy4NCg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KaG1fZGF0YV8xMCA8LSBobV9kYXRhW2htX2RhdGEkZ2VuZGVyPT0iZiIgJiBobV9kYXRhJGFnZT49MTAgJiBobV9kYXRhJGFnZTwyMCxdDQpobV9kYXRhXzIwIDwtIGhtX2RhdGFbaG1fZGF0YSRnZW5kZXI9PSJmIiAmIGhtX2RhdGEkYWdlPj0yMCAmIGhtX2RhdGEkYWdlPDMwLF0NCmhtX2RhdGFfMzAgPC0gaG1fZGF0YVtobV9kYXRhJGdlbmRlcj09ImYiICYgaG1fZGF0YSRhZ2U+PTMwICYgaG1fZGF0YSRhZ2U8NDAsXQ0KaG1fZGF0YV82MCA8LSBobV9kYXRhW2htX2RhdGEkZ2VuZGVyPT0iZiIgJiBobV9kYXRhJGFnZT49NjAgJiBobV9kYXRhJGFnZTw3MCxdDQpobV9kYXRhX2ZlbWFsZSA8LSBobV9kYXRhW2htX2RhdGEkZ2VuZGVyPT0iZiIsXQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpiYWdfb2Zfd29yZHNfZmVtYWxlIDwtICBobV9kYXRhX2ZlbWFsZSAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KQ0KDQp3b3JkX2NvdW50X2ZlbWFsZSA8LSBiYWdfb2Zfd29yZHNfZmVtYWxlICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkNCmBgYA0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQp0ZW1wIDwtIGJhZ19vZl93b3Jkc19mZW1hbGUgJT4lDQogICAgICBjb3VudChwYXJlbnRob29kLCB3b3JkKSAlPiUNCiAgICAgIGdyb3VwX2J5KHBhcmVudGhvb2QpICU+JQ0KICAgICAgbXV0YXRlKHByb3BvcnRpb24gPSBuIC8gc3VtKG4pKSAlPiUgDQogICAgICBzZWxlY3QoLW4pICU+JSANCiAgICAgIHNwcmVhZChwYXJlbnRob29kLCBwcm9wb3J0aW9uKQ0KZ2dwbG90KHRlbXAsIA0KICAgICAgICAgICAgIGFlc19zdHJpbmcoeCA9IGNvbG5hbWVzKHRlbXApWzJdLCB5ID0gY29sbmFtZXModGVtcClbM10pLA0KICAgICAgICAgICAgIGNvbG9yID0gYWJzKGNvbG5hbWVzKHRlbXApWzNdIC0gY29sbmFtZXModGVtcClbMl0pKSArDQogICAgICBnZW9tX2FibGluZShjb2xvciA9ICJncmF5NDAiLCBsdHkgPSAyKSArDQogICAgICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMSwgc2l6ZSA9IDEsIHdpZHRoID0gMC4zLCBoZWlnaHQgPSAwLjMpICsNCiAgbGFicyh0aXRsZT0iV29yZHMgUHJvcG9ydGlvbiBmb3IgZmVtYWxlcyByZWdhcmRsZXNzIG9mIGFnZSIpKw0KICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHdvcmQpLCBjaGVja19vdmVybGFwID0gVFJVRSwgdmp1c3QgPSAxLjUpICsNCiAgICAgIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoKSkgKw0KICAgICAgc2NhbGVfeV9sb2cxMChsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKSArDQogICAgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsaW1pdHMgPSBjKDAsIDAuMDAxKSwgbG93ID0gImRhcmtzbGF0ZWdyYXk0IiwgaGlnaCA9ICJncmF5NzUiKSArDQogICAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQ0KICANCmBgYA0KDQpBY2NvcmRpbmcgdG8gdGhlIHBsb3QgYWJvdmUsIHJlZ2FyZGxlc3Mgb2YgYWdlLCBmZW1hbGVzIHRoaW5rIG9mICJmcmllbmQiLCAiaHVzYmFuZCIsICJmYW1pbHkiLCBhbmQgImJpcnRoZGF5IiBpbiB0aGVpciBoYXBweSBtb21lbnRzLiANCg0KVGhpcyBzZWVtZWQgdmVyeSBnZW5lcmFsLCBzbyBJIGJyb2tlIGl0IGRvd24gdG8gNCBkaWZmZXJlbnQgYWdlIGdyb3VwcyBhbmQgc2F3IHdoYXQgd29yZHMvdmFsdWVzIHBvcCB1cCBmcmVxdWVudGx5IHJlc3BlY3RpdmVseS4NCg0KIyMjIyBXb3JkIENsb3VkDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQpiYWdfb2Zfd29yZHNfMTAgPC0gIGhtX2RhdGFfMTAgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkNCg0Kd29yZF9jb3VudF8xMCA8LSBiYWdfb2Zfd29yZHNfMTAgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQ0KDQpiYWdfb2Zfd29yZHNfMjAgPC0gIGhtX2RhdGFfMjAgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkNCg0Kd29yZF9jb3VudF8yMCA8LSBiYWdfb2Zfd29yZHNfMjAgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQ0KDQpiYWdfb2Zfd29yZHNfMzAgPC0gIGhtX2RhdGFfMzAgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkNCg0Kd29yZF9jb3VudF8zMCA8LSBiYWdfb2Zfd29yZHNfMzAgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQ0KDQpiYWdfb2Zfd29yZHNfNjAgPC0gIGhtX2RhdGFfNjAgJT4lDQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkNCg0Kd29yZF9jb3VudF82MCA8LSBiYWdfb2Zfd29yZHNfNjAgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQ0Kd29yZGNsb3VkKHdvcmRfY291bnRfMTAkd29yZCx3b3JkX2NvdW50XzEwJG4gLA0KICAgICAgICAgIHNjYWxlPWMoMywwLjEpLA0KICAgICAgICAgIG1heC53b3Jkcz0xMDAsDQogICAgICAgICAgbWluLmZyZXE9MSwNCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsDQogICAgICAgICAgcm90LnBlcj0wLjMsDQogICAgICAgICAgdXNlLnIubGF5b3V0PVQsDQogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLA0KICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIk9yYW5nZXMiKSkNCg0KYGBgDQoNCmBgYHtyLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQ0Kd29yZGNsb3VkKHdvcmRfY291bnRfMjAkd29yZCx3b3JkX2NvdW50XzIwJG4gLA0KICAgICAgICAgIHNjYWxlPWMoMywwLjEpLA0KICAgICAgICAgIG1heC53b3Jkcz0xMDAsDQogICAgICAgICAgbWluLmZyZXE9MSwNCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsDQogICAgICAgICAgcm90LnBlcj0wLjMsDQogICAgICAgICAgdXNlLnIubGF5b3V0PVQsDQogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLA0KICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIk9yYW5nZXMiKSkNCg0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCndvcmRjbG91ZCh3b3JkX2NvdW50XzMwJHdvcmQsd29yZF9jb3VudF8zMCRuICwNCiAgICAgICAgICBzY2FsZT1jKDMsMC4xKSwNCiAgICAgICAgICBtYXgud29yZHM9MTAwLA0KICAgICAgICAgIG1pbi5mcmVxPTEsDQogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLA0KICAgICAgICAgIHJvdC5wZXI9MC4zLA0KICAgICAgICAgIHVzZS5yLmxheW91dD1ULA0KICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwNCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJPcmFuZ2VzIikpDQoNCmBgYA0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQp3b3JkY2xvdWQod29yZF9jb3VudF82MCR3b3JkLHdvcmRfY291bnRfNjAkbiAsDQogICAgICAgICAgc2NhbGU9YygzLDAuMSksDQogICAgICAgICAgbWF4LndvcmRzPTEwMCwNCiAgICAgICAgICBtaW4uZnJlcT0xLA0KICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwNCiAgICAgICAgICByb3QucGVyPTAuMywNCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9VCwNCiAgICAgICAgICByYW5kb20uY29sb3I9RkFMU0UsDQogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOSwiT3JhbmdlcyIpKQ0KDQpgYGANCg0KIyMjIyBCYXIgQ2hhcnRzDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCiB3b3JkX2NvdW50XzEwWzE6MTUsXSAlPiUNCiAgICAgIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogICAgICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArDQogICAgICBnZW9tX2NvbCgpICsNCiAgICAgIGxhYnModGl0bGUgPSAiV29yZCBGcmVxdWVuY3kgaW4gSGFwcHkgTW9tZW50cyBmb3IgZmVtYWxlIGluIHRoZWlyIDEwcyIpKw0KICAgICAgeGxhYihOVUxMKSArDQogICAgICB5bGFiKCJXb3JkIEZyZXF1ZW5jeSIpKw0KICAgICAgY29vcmRfZmxpcCgpDQpgYGAgDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCiB3b3JkX2NvdW50XzIwWzE6MTUsXSAlPiUNCiAgICAgIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogICAgICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArDQogICAgICBnZW9tX2NvbCgpICsNCiAgICAgIGxhYnModGl0bGUgPSAiV29yZCBGcmVxdWVuY3kgaW4gSGFwcHkgTW9tZW50cyBmb3IgZmVtYWxlIGluIHRoZWlyIDIwcyIpKw0KICAgICAgeGxhYihOVUxMKSArDQogICAgICB5bGFiKCJXb3JkIEZyZXF1ZW5jeSIpKw0KICAgICAgY29vcmRfZmxpcCgpDQpgYGAgDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCiB3b3JkX2NvdW50XzMwWzE6MTUsXSAlPiUNCiAgICAgIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogICAgICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArDQogICAgICBnZW9tX2NvbCgpICsNCiAgICAgIGxhYnModGl0bGUgPSAiV29yZCBGcmVxdWVuY3kgaW4gSGFwcHkgTW9tZW50cyBmb3IgZmVtYWxlIGluIHRoZWlyIDMwcyIpKw0KICAgICAgeGxhYihOVUxMKSArDQogICAgICB5bGFiKCJXb3JkIEZyZXF1ZW5jeSIpKw0KICAgICAgY29vcmRfZmxpcCgpDQpgYGAgDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCiB3b3JkX2NvdW50XzYwWzE6MTUsXSAlPiUNCiAgICAgIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogICAgICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArDQogICAgICBnZW9tX2NvbCgpICsNCiAgICAgIGxhYnModGl0bGUgPSAiV29yZCBGcmVxdWVuY3kgaW4gSGFwcHkgTW9tZW50cyBmb3IgZmVtYWxlIGluIHRoZWlyIDYwcyIpKw0KICAgICAgeGxhYihOVUxMKSArDQogICAgICB5bGFiKCJXb3JkIEZyZXF1ZW5jeSIpKw0KICAgICAgY29vcmRfZmxpcCgpDQpgYGAgDQogDQpGcm9tIHRoZXNlIHdvcmQgY2xvdWRzIGFuZCBiYXIgY2hhcnRzLCB3ZSBjYW4gc2VlIHRoYXQgImZyaWVuZCIsICJmYW1pbHkiLCAiaHVzYmFuZCIgd2VyZSBjb21tb25seSBtZW50aW9uZWQgZm9yIGFsbCBhZ2UgZ3JvdXBzLg0KDQoNCg0KIyMgUXVlc3Rpb24gMjogT3RoZXIgdGhhbiBmcmllbmRzIGFuZCBmYW1pbGllcywgd2hpY2ggZmFjdG9ycyBtYWtlIGZlbWFsZXMgaGFwcHk/DQoNClNpbmNlIGZyaWVuZHMgYW5kIGZhbWlsaWVzIHdlcmUgb2J2aW91cyBmYWN0b3JzIHRoYXQgY29uc2lzdGVkIHRoZSBmZW1hbGUncyBoYXBwaW5lc3MsDQpJIGV4Y2x1ZGVkIHRob3NlIHdvcmRzIGFuZCBmb2N1c2VkIG9uIG90aGVyIHdvcmRzIHRoYXQgd2VyZSBmcmVxdWVudGx5IG1lbnRpb25lZC4NCg0KDQojIyMjIDwgMTBzID4NCg0KYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaG1fZGF0YV9mZW1hbGVfMTAgPC0gaG1fZGF0YV8xMFtncmVwbCgiYm95ZnJpZW5kIixobV9kYXRhXzEwJHRleHQpfGdyZXBsKCJwYXNzZWQiLGhtX2RhdGFfMTAkdGV4dCl8Z3JlcGwoImV2ZW50IixobV9kYXRhXzEwJHRleHQpfGdyZXBsKCJ2aXNpdCIsaG1fZGF0YV8xMCR0ZXh0KXxncmVwbCgiY29sbGVnZSIsaG1fZGF0YV8xMCR0ZXh0KSxdDQpucm93KGhtX2RhdGFfZmVtYWxlXzEwKQ0KYGBgDQpPZiB0aGUgODIgaGFwcHkgbW9tZW50cyB0aGF0IGFyZW4ndCByZWxhdGVkIHRvICdmcmllbmRzJyBvciAnZmFtaWxpZXMnIGZvciB0aGUgdGVlbmFnZSBmZW1hbGVzLCB0aGUgZnJlcXVlbmN5IG9mIHRoZSByZXN0IHdvcmRzIGFyZSBhcyBmb2xsb3dzOg0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQoNCmJhZ19vZl93b3Jkc19mZW1hbGVfMTAgPC0gIGhtX2RhdGFfZmVtYWxlXzEwICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpDQoNCndvcmRfY291bnRfZmVtYWxlXzEwIDwtIGJhZ19vZl93b3Jkc19mZW1hbGVfMTAgJT4lDQogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQ0KDQp3b3JkX2NvdW50X2ZlbWFsZV8xMDwtIHdvcmRfY291bnRfZmVtYWxlXzEwWy1jKHdoaWNoKHdvcmRfY291bnRfZmVtYWxlXzEwJHdvcmQ9PSJmcmllbmQiKSx3aGljaCh3b3JkX2NvdW50X2ZlbWFsZV8xMCR3b3JkPT0iZmFtaWx5IikpLF0NCg0Kd29yZF9jb3VudF9mZW1hbGVfMTBbMToyMCxdICU+JQ0KICAgICAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIG4pKSAlPiUNCiAgICAgIGdncGxvdChhZXMod29yZCwgbikpICsNCiAgICAgIGdlb21fY29sKCkgKw0KICAgICAgeGxhYihOVUxMKSArDQogICAgICB5bGFiKCJXb3JkIEZyZXF1ZW5jeSIpKw0KICAgICAgY29vcmRfZmxpcCgpDQp3b3JkY2xvdWQod29yZF9jb3VudF9mZW1hbGVfMTAkd29yZCx3b3JkX2NvdW50X2ZlbWFsZV8xMCRuICwNCiAgICAgICAgICBzY2FsZT1jKDMsMC4xKSwNCiAgICAgICAgICBtYXgud29yZHM9MTAwLA0KICAgICAgICAgIG1pbi5mcmVxPTEsDQogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLA0KICAgICAgICAgIHJvdC5wZXI9MC4zLA0KICAgICAgICAgIHVzZS5yLmxheW91dD1ULA0KICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwNCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJBY2NlbnQiKSkNCmBgYA0KDQojIyMjIDwgMjBzID4NCg0KRm9yIHRoZSBmZW1hbGVzIGluIHRoZWlyIDIwcywgdGhlIGZyZXF1ZW5jeSBvZiBoYXBweSBtb21lbnRzIHRoYXQgYXJlbid0IHJlbGF0ZWQgdG8gJ2ZyaWVuZHMnIG9yICdmYW1pbGllcycgYXJlIGFzIGZvbGxvd3M6DQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmJhZ19vZl93b3Jkc18yMCA8LSAgaG1fZGF0YV8yMCAlPiUNCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KQ0KDQp3b3JkX2NvdW50XzIwIDwtIGJhZ19vZl93b3Jkc18yMCAlPiUNCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpDQoNCndvcmRfY291bnRfMjA8LSB3b3JkX2NvdW50XzIwWy1jKHdoaWNoKHdvcmRfY291bnRfMjAkd29yZD09ImZyaWVuZCIpLHdoaWNoKHdvcmRfY291bnRfMjAkd29yZD09ImZhbWlseSIpLHdoaWNoKHdvcmRfY291bnRfMjAkd29yZD09ImhvbWUiKSx3aGljaCh3b3JkX2NvdW50XzIwJHdvcmQ9PSJodXNiYW5kIiksd2hpY2god29yZF9jb3VudF8yMCR3b3JkPT0iYm95ZnJpZW5kIiksd2hpY2god29yZF9jb3VudF8yMCR3b3JkPT0ia2lkcyIpLHdoaWNoKHdvcmRfY291bnRfMjAkd29yZD09InNvbiIpLHdoaWNoKHdvcmRfY291bnRfMjAkd29yZD09ImRhdWdodGVyIikpLF0NCg0Kd29yZF9jb3VudF8yMFsxOjIwLF0gJT4lDQogICAgICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQ0KICAgICAgZ2dwbG90KGFlcyh3b3JkLCBuKSkgKw0KICAgICAgZ2VvbV9jb2woKSArDQogICAgICB4bGFiKE5VTEwpICsNCiAgICAgIHlsYWIoIldvcmQgRnJlcXVlbmN5IikrDQogICAgICBjb29yZF9mbGlwKCkNCndvcmRjbG91ZCh3b3JkX2NvdW50XzIwJHdvcmQsd29yZF9jb3VudF8yMCRuICwNCiAgICAgICAgICBzY2FsZT1jKDMsMC4xKSwNCiAgICAgICAgICBtYXgud29yZHM9MTAwLA0KICAgICAgICAgIG1pbi5mcmVxPTEsDQogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLA0KICAgICAgICAgIHJvdC5wZXI9MC4zLA0KICAgICAgICAgIHVzZS5yLmxheW91dD1ULA0KICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwNCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJBY2NlbnQiKSkNCmBgYA0KDQoNCiMjIyMgPCAzMHMgPg0KDQpGb3IgdGhlIGZlbWFsZXMgaW4gdGhlaXIgMzBzLCB0aGUgZnJlcXVlbmN5IG9mIGhhcHB5IG1vbWVudHMgdGhhdCBhcmVuJ3QgcmVsYXRlZCB0byAnZnJpZW5kcycgb3IgJ2ZhbWlsaWVzJyBhcmUgYXMgZm9sbG93czoNCg0KYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KYmFnX29mX3dvcmRzXzMwIDwtICBobV9kYXRhXzMwICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpDQoNCndvcmRfY291bnRfMzAgPC0gYmFnX29mX3dvcmRzXzMwICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkNCg0Kd29yZF9jb3VudF8zMDwtIHdvcmRfY291bnRfMzBbLWMod2hpY2god29yZF9jb3VudF8zMCR3b3JkPT0iZnJpZW5kIiksd2hpY2god29yZF9jb3VudF8zMCR3b3JkPT0iZmFtaWx5Iiksd2hpY2god29yZF9jb3VudF8zMCR3b3JkPT0iaG9tZSIpLHdoaWNoKHdvcmRfY291bnRfMzAkd29yZD09InNvbiIpLHdoaWNoKHdvcmRfY291bnRfMzAkd29yZD09ImRhdWdodGVyIiksd2hpY2god29yZF9jb3VudF8zMCR3b3JkPT0iaHVzYmFuZCIpLHdoaWNoKHdvcmRfY291bnRfMzAkd29yZD09ImtpZHMiKSksXQ0KDQp3b3JkX2NvdW50XzMwWzE6MjAsXSAlPiUNCiAgICAgIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogICAgICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArDQogICAgICBnZW9tX2NvbCgpICsNCiAgICAgIHhsYWIoTlVMTCkgKw0KICAgICAgeWxhYigiV29yZCBGcmVxdWVuY3kiKSsNCiAgICAgIGNvb3JkX2ZsaXAoKQ0Kd29yZGNsb3VkKHdvcmRfY291bnRfMzAkd29yZCx3b3JkX2NvdW50XzMwJG4gLA0KICAgICAgICAgIHNjYWxlPWMoMywwLjEpLA0KICAgICAgICAgIG1heC53b3Jkcz0xMDAsDQogICAgICAgICAgbWluLmZyZXE9MSwNCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsDQogICAgICAgICAgcm90LnBlcj0wLjMsDQogICAgICAgICAgdXNlLnIubGF5b3V0PVQsDQogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLA0KICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIkFjY2VudCIpKQ0KYGBgDQoNCiMjIyMgPCA2MHMgPg0KDQpGb3IgdGhlIGZlbWFsZXMgaW4gdGhlaXIgNjBzLCB0aGUgZnJlcXVlbmN5IG9mIGhhcHB5IG1vbWVudHMgdGhhdCBhcmVuJ3QgcmVsYXRlZCB0byAnZnJpZW5kcycgb3IgJ2ZhbWlsaWVzJyBhcmUgYXMgZm9sbG93czoNCg0KYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KYmFnX29mX3dvcmRzXzYwIDwtICBobV9kYXRhXzYwICU+JQ0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpDQoNCndvcmRfY291bnRfNjAgPC0gYmFnX29mX3dvcmRzXzYwICU+JQ0KICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkNCg0Kd29yZF9jb3VudF82MDwtIHdvcmRfY291bnRfNjBbLWMod2hpY2god29yZF9jb3VudF82MCR3b3JkPT0iZnJpZW5kIiksd2hpY2god29yZF9jb3VudF82MCR3b3JkPT0iZmFtaWx5Iiksd2hpY2god29yZF9jb3VudF82MCR3b3JkPT0iaG9tZSIpLHdoaWNoKHdvcmRfY291bnRfNjAkd29yZD09InNvbiIpLHdoaWNoKHdvcmRfY291bnRfNjAkd29yZD09ImRhdWdodGVyIiksd2hpY2god29yZF9jb3VudF82MCR3b3JkPT0iaHVzYmFuZCIpLHdoaWNoKHdvcmRfY291bnRfNjAkd29yZD09ImtpZHMiKSksXQ0KDQp3b3JkX2NvdW50XzYwWzE6MjAsXSAlPiUNCiAgICAgIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lDQogICAgICBnZ3Bsb3QoYWVzKHdvcmQsIG4pKSArDQogICAgICBnZW9tX2NvbCgpICsNCiAgICAgIHhsYWIoTlVMTCkgKw0KICAgICAgeWxhYigiV29yZCBGcmVxdWVuY3kiKSsNCiAgICAgIGNvb3JkX2ZsaXAoKQ0Kd29yZGNsb3VkKHdvcmRfY291bnRfNjAkd29yZCx3b3JkX2NvdW50XzYwJG4gLA0KICAgICAgICAgIHNjYWxlPWMoMywwLjEpLA0KICAgICAgICAgIG1heC53b3Jkcz0xMDAsDQogICAgICAgICAgbWluLmZyZXE9MSwNCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsDQogICAgICAgICAgcm90LnBlcj0wLjMsDQogICAgICAgICAgdXNlLnIubGF5b3V0PVQsDQogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLA0KICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDksIkFjY2VudCIpKQ0KYGBgDQoNCg0KIyMjIDEwcyAtIGJveWZyaWVuZCwgcGFzc2VkLCBldmVudCwgdmlzaXQsIGNvbGxlZ2UNCiMjIyAyMHMgLSBtb21lbnQsIGZlZWwsIGxpZmUsIGJpcnRoZGF5LCBsb3ZlLCBqb2INCiMjIyAzMHMgLSB3YXRjaGVkLCBkaW5uZXIsIG5pZ2h0LCBwbGF5ZWQsIGxvdmUNCiMjIyA2MHMgLSB3YXRjaGVkLCBmb3VuZCwgdmlzaXQsIGRvZywgZGlubmVyLCBjYXINCg0KDQpUaGF0IG1lYW5zLA0KIyMjIyBmb3IgdGhlIHRlZW5hZ2VycywgYm95ZnJpZW5kcyBvciBzY2hvb2wvY29sbGVnZSByZWxhdGVkIG1vbWVudHMgbWFkZSB0aGVtIGhhcHB5IHRoZSBtb3N0Lg0KIyMjIyBGb3IgdGhvc2UgaW4gdGhlaXIgMjBzLCBiZWluZyBpbiBzb21lIG1vbWVudHMsIGZlZWxpbmcgbGlmZSBhbmQgbG92ZSwgb3Igam9iLXJlbGF0ZWQgbW9tZW50cyBtYWRlIHRoZW0gaGFwcHkgdGhlIG1vc3QuDQojIyMjIEZvciB0aG9zZSBpbiB0aGVpciAzMHMsIHdlIGNhbiBpbmZlciBmcm9tIHRoZSB2ZXJicyB0aGF0IGRvaW5nIHNvbWV0aGluZyB3aXRoIHBlb3BsZSBhcm91bmQgbWFkZSB0aGVtIGhhcHB5IHRoZSBtb3N0Lg0KIyMjIyBGb3IgdGhvc2UgaW4gdGhlaXIgNjBzLCB3ZSBjYW4gYWdhaW4gaW5mZXIgZnJvbSB0aGUgdmVyYnMgdGhhdCBkb2luZyBzb21ldGhpbmcgd2l0aCBwZW9wbGUgYXJvdW5kIG1hZGUgdGhlbSBoYXBweSB0aGUgbW9zdC4gSXQgaXMgbm90YWJsZSB0aGF0IGRvZ3MgaGF2ZSBhcHBlYXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUuDQoNCg0KQmVsb3cgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdGhlIGhhcHB5IG1vbWVudHMgb2YgZWFjaCBhZ2UgZ3JvdXBzLiANCg0KYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaG1fZGF0YV8xMFtncmVwbCgicGFzc2VkIixobV9kYXRhXzEwJHRleHQpLCJvcmlnaW5hbF9obSJdW2MoMSwyLDcsMTAsMTEsMjEpLF0NCg0KYGBgDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmhtX2RhdGFfMjBbZ3JlcGwoImJpcnRoZGF5IixobV9kYXRhXzIwJHRleHQpLCJvcmlnaW5hbF9obSJdW2MoMSwyLDcsMTAsMTEsMjEpLF0NCg0KYGBgDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0NCmhtX2RhdGFfMzBbZ3JlcGwoImRpbm5lciIsaG1fZGF0YV8zMCR0ZXh0KSwib3JpZ2luYWxfaG0iXVtjKDEsMiw3LDEwLDExLDIxKSxdDQoNCmBgYA0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGVjaG89RkFMU0V9DQpobV9kYXRhXzYwW2dyZXBsKCJkb2ciLGhtX2RhdGFfNjAkdGV4dCksIm9yaWdpbmFsX2htIl1bYygxLDIsNywxMCwxMSwyMSksXQ0KDQpgYGANCg0KDQojIyBDb25jbHVzaW9ucw0KMS4gJ0ZyaWVuZHMnIGFuZCAnRmFtaWxpZXMnIHdlcmUgYWx3YXlzIG1lbnRpb25lZCBhcyBhIHRvcCB2YWx1ZSBvZiBhbGwgZGlmZmVyZW50IGFnZSBncm91cHMuDQoNCjIuIEZvciBmZW1hbGVzIGluIDEwcyBhbmQgMjBzLCBpdCBjb3VsZCBiZSBpbmZlcmVkIHRoYXQgdGhleSBoYWQgb3RoZXIgZXh0ZXJuYWwgZmFjdG9ycyBzdWNoIGFzICdjb2xsZWdlJywgJ2JveWZyaWVuZCcsICdsaWZlJywgb3IgJ2pvYicgdG8gbWFrZSB0aGVtIGhhcHB5LiANCg0KMy4gRm9yIGZlbWFsZXMgaW4gMzBzIGFuZCA2MHMsIGl0IGNvdWxkIGJlIGluZmVyZWQgdGhhdCBpbnRlcm5hbCBmYWN0b3JzLCBvciB0aGUgYWN0aW9uIG9mIGRvaW5nIHNvbWV0aGluZyB3aXRoIHBlb3BsZSBhcm91bmQgeW91LCBpbmZlcnJhYmx5IGZyaWVuZHMgb3IgZmFtaWxpZXMsIHdlcmUgd2hhdCBtYWRlIHRoZW0gaGFwcHkuDQoNCiA=
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+