Pronouns are words that refer to places, people, and things. They work to replace other nouns and prevent the speaker from having to repeat specific names over and over again. Some languages strictly require pronouns to be used in sentences. English is an example of such a language. In most situations, a subject is needed otherwise it creates confusion. Other languages don’t use pronouns as often and explicitly. These are called pro-drop languages. Additional information in the utterance, such as verb conjugation, lets the listener know what the subject of the sentence is without it being stated.

In this statistical analysis, I will investigate whether speaking a pro-drop or non pro-drop language has an impact on the age that children acquire pronouns and its subsequent usage based on data from Wordbank, a database of children’s vocabulary.

Patterns in Age of Acquisition

library(wordbankr)
library(dplyr)
library(ggplot2)
library(tidyverse)

#Getting the Full Datasets

pronouns_usa <- get_item_data(language = "English (American)", form = "WS") %>%
  filter(category == "pronouns")


pronouns_usa_data <- get_instrument_data(language = "English (American)",
                                             form = "WS",
                                             items = pronouns_usa$item_id,
                                             administration_info = TRUE,
                                             item_info = TRUE)


pronouns_esp <- get_item_data(language = "Spanish (Mexican)", form = "WS") %>%
  filter(category == "pronouns")


pronouns_esp_data <- get_instrument_data(language = "Spanish (Mexican)",
                                         form = "WS",
                                         items = pronouns_esp$item_id,
                                         administration_info = TRUE,
                                         item_info = TRUE)

pronouns_kor <- get_item_data(language = "Korean", form = "WS") %>%
  filter(category == "pronouns")


pronouns_kor_data <- get_instrument_data(language = "Korean",
                                        form = "WS",
                                        items = pronouns_kor$item_id,
                                        administration_info = TRUE,
                                        item_info = TRUE)

pronouns_china <- get_item_data(language = "Mandarin (Beijing)", form = "WS") %>%
  filter(category == "pronouns")


pronouns_china_data <- get_instrument_data(language = "Mandarin (Beijing)",
                                         form = "WS",
                                         items = pronouns_china$item_id,
                                         administration_info = TRUE,
                                         item_info = TRUE)

pronouns_ita <- get_item_data(language = "Italian", form = "WS") %>%
  filter(category == "pronouns")


pronouns_ita_data <- get_instrument_data(language = "Italian",
                                           form = "WS",
                                           items = pronouns_ita$item_id,
                                           administration_info = TRUE,
                                           item_info = TRUE)

pronouns_ibe <- get_item_data(language = "Spanish (European)", form = "WS") %>%
  filter(category == "pronouns")


pronouns_ibe_data <- get_instrument_data(language = "Spanish (European)",
                                         form = "WS",
                                         items = pronouns_ibe$item_id,
                                         administration_info = TRUE,
                                         item_info = TRUE)

# Getting Age of Acquisition
aoa_eng <- fit_aoa(pronouns_usa_data)


aoa_eng_pronouns <- aoa_eng[!is.na(aoa_eng$aoa), ]


aoa_esp <- fit_aoa(pronouns_esp_data)


aoa_esp_pronouns <- aoa_esp[!is.na(aoa_esp$aoa), ]


aoa_kor <- fit_aoa(pronouns_kor_data)


aoa_kor_pronouns <- aoa_kor[!is.na(aoa_kor$aoa), ]


aoa_china <- fit_aoa(pronouns_china_data)


aoa_china_pronouns <- aoa_china[!is.na(aoa_china$aoa), ]


aoa_ita <- fit_aoa(pronouns_ita_data)


aoa_ita_pronouns <- aoa_ita[!is.na(aoa_ita$aoa), ]


aoa_ibe <- fit_aoa(pronouns_ibe_data)


aoa_ibe_pronouns <- aoa_ibe[!is.na(aoa_ibe$aoa), ]


  print(ggplot(aoa_eng_pronouns, aes(x = item_definition, y = aoa)) +
    geom_segment(aes(x = item_definition, xend = item_definition, y = 0, yend = aoa), 
                 color = "coral", size = 1) +
    geom_point(shape = 16, size = 3, color = "coral") +
    labs(title = "Age of Acquisition for English (American) Pronouns", x = "Pronouns", y = "Age (months)") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))
)

print(ggplot(aoa_esp_pronouns, aes(x = item_definition, y = aoa)) +
    geom_segment(aes(x = item_definition, xend = item_definition, y = 0, yend = aoa), 
                 color = "aquamarine3", size = 1) +
    geom_point(shape = 16, size = 3, color = "aquamarine3") +
    labs(title = "Age of Acquisition for Spanish (Mexican) Pronouns", x = "Pronouns", y = "Age (months)") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
)


print(ggplot(aoa_ibe_pronouns, aes(x = item_definition, y = aoa)) +
    geom_segment(aes(x = item_definition, xend = item_definition, y = 0, yend = aoa), 
                 color = "chartreuse", size = 1) +
    geom_point(shape = 16, size = 3, color = "chartreuse") +
    labs(title = "Age of Acquisition for Spanish (European) Pronouns", x = "Pronouns", y = "Age (months)") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
)

print(ggplot(aoa_ita_pronouns, aes(x = item_definition, y = aoa)) +
    geom_segment(aes(x = item_definition, xend = item_definition, y = 0, yend = aoa), 
                 color = "goldenrod", size = 1) +
    geom_point(shape = 16, size = 3, color = "goldenrod") +
    labs(title = "Age of Acquisition for Italian Pronouns", x = "Pronouns", y = "Age (months)") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
)

print(ggplot(aoa_kor_pronouns, aes(x = item_definition, y = aoa)) +
    geom_segment(aes(x = item_definition, xend = item_definition, y = 0, yend = aoa), 
                 color = "palevioletred1", size = 1) +
    geom_point(shape = 16, size = 3, color = "palevioletred1") +
    labs(title = "Age of Acquisition for Korean Pronouns", x = "Pronouns", y = "Age (months)") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1))
)

English is a non pro-drop language while Spanish, Italian, Korean, and Mandarin are pro-drop languages. The earliest pronoun acquisition occurs at a similar age in English, Spanish, and Italian. English and Italian are at 21 months old while Spanish is at 20 months. Mandarin’s earliest age of acquisition happens a little younger than the rest–at 19 months. Korean is the latest with their initial pronoun acquisition happening at around 25 months.

Despite English not being pro-drop and from a different family, there’s little distinction from Spanish, Italian, and Mandarin. Across these groups, children consistently acquire first-person pronouns first. Remarkably, according to the data, the first pronoun acquired by Korean children is the demonstrative pronoun, “this.” They don’t acquire a first person pronoun until 27 months old. However, it’s worth noting that the age of acquisition for “this” is actually the same for the rest of the languages as Korean.

Patterns in Production



pronouns_usa_mean <- pronouns_usa_data %>%
  group_by(age, data_id) %>%
  summarise(num = sum(produces, na.rm = TRUE)) %>%
  group_by(age) %>%
  summarise(mean = mean(num, na.rm = TRUE))

pronouns_esp_mean <- pronouns_esp_data %>%
  group_by(age, data_id) %>%
  summarise(num = sum(produces, na.rm = TRUE)) %>%
  group_by(age) %>%
  summarise(mean = mean(num, na.rm = TRUE))


print(ggplot() +
  geom_line(data = pronouns_usa_mean, aes(x = age, y = mean, color = "English (American)")) +
  geom_line(data = pronouns_esp_mean, aes(x = age, y = mean, color = "Spanish (Mexican)")) +
  labs(title = "Pronoun Production by Age", x = "Age (months)", y = "Mean pronouns produced") +
  scale_color_manual(name = "Language", 
                     values = c("English (American)" = "coral", "Spanish (Mexican)" = "aquamarine3"))

)

This graph appears to show Spanish-speaking children using pronouns more frequently than English-speaking children, although I expected the opposite. The average amount of pronouns produced fluctuates as Spanish speakers get older whereas English speakers have a steady increase in production year by year. Even so, in the periods of increased production, Spanish children clearly use more pronouns when they are older just like English-speaking children. An explanation for this could be that it is reflecting the fluidity in the need for pronouns in Spanish. Sometimes, the children find that they really want to use them and at other times, they don’t. At 30 months old, Spanish takes a significant dip in pronouns produced compared to about 27 months. English has about two periods where the production decreases.

Besides the language itself, I also wanted to explore the role culture may play in pronoun acquisition and usage by using two varieties of the same pro drop language. The European and Mexican varieties of Spanish have very close average numbers, but Mexican Spanish surpasses its European counterpart overall. They also both have periods of fluctuation. Mexican Spanish features more pronounced rises and falls while European Spanish demonstrates less pronounced and dramatic fluctuations. For instance, the difference in production at around 27 months to 30 months is little compared to Mexican Spanish. It seems as though European Spanish-speaking children are most consistent in their production. Nevertheless, at close to 30 months old, the two varieties seems to have the average.

When compared to Italian, Spanish children use more pronouns on average. Seeing as they are both Romance languages, I wondered if they would have similar production. They are somewhat closer in terms of figures than English and Spanish, but not as much as Mexican and European Spanish. Similar to both varieties of Spanish, Italian and Spanish also fluctuate. Fluctuation seems to be a pattern among non pro-drop languages.

Korean and Spanish have significant differences in average production. Korean-speaking children use far less pronouns on average. Korean and Italian, another Romance language, have similar results. Italian-speaking children produce more pronouns on average. At 31 months old, Korean children produce the highest average amount of pronouns. At the age of 31 months, Korean children exhibit the highest average pronoun production, which is relatively close to that of Spanish-speaking children at 29 months. However, the disparity is notable, with Korean children producing approximately 4 pronouns, whereas Spanish speakers produce nearly 20 pronouns by the age of 31 months. The older both groups of children become, the more pronouns they use, but the differences in Korean are not as discernible as the other languages.

In this set of languages, Korean seems to generate the smallest number of pronouns. The contrast in production is striking. At the age of about 17 months, Mandarin and Korean, the graph indicates that Mandarin produces more pronouns, although the averages are somewhat close. As the children get older, this proximity diminishes. After 35 months old, the mean production increases to slightly over five pronouns. Mandarin-speaking children reach an average of five pronouns at 20 months old, marking a fifteen-month gap.

Patterns in Usage

 ggplot() +
    geom_bar(data = most_common_word_usa_low, aes(x = item_definition, y = num, fill = "English (American)"), stat = "identity", position = position_dodge(width = 0.8)) +
    
    geom_bar(data = most_common_word_esp_low, aes(x = item_definition, y = num, fill = "Spanish (Mexican)"), stat = "identity", position = position_dodge(width = 0.8)) +
    
    geom_bar(data = most_common_word_ita_low, aes(x = item_definition, y = num, fill = "Italian"), stat = "identity", position = position_dodge(width = 0.8)) +
    
    geom_bar(data = most_common_word_kor_low, aes(x = item_definition, y = num, fill = "Korean"), stat = "identity", position = position_dodge(width = 0.8)) +
    
    geom_bar(data = most_common_word_china_low, aes(x = item_definition, y = num, fill = "Mandarin"), stat = "identity", position = position_dodge(width = 0.8)) +
    
    labs(title = "Most Common Pronoun Produced at 19 Months Old", x = "Pronoun", y = "Frequency") +
    
    theme_minimal() +
    
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    
    scale_fill_manual(name = "Language", values = c("English (American)" = "coral", "Spanish (Mexican)" = "aquamarine3", "Italian" = "goldenrod", "Korean" = "palevioletred1", "Mandarin" = "darkorchid"))

In the early developmental stages, the commonality in first-person pronouns spans across languages, except for Korean. English and Italian use the exact same word–“mine.” Spanish and Mandarin use, “I.” Mine is a possessive pronoun while I is a personal pronoun. English-speaking children have the highest frequency with over 200 instances.This high frequency might suggest a tendency for English-speaking Children to frequently discuss their possessions and personal affiliations. However, such an interpretation could mistakenly paint them as more self-centered. This assumption lacks a basis, especially considering that Italian is a pro-drop language, and all the children, regardless of language, primarily use the first person.

In later years, the pattern remains. English-speakers use first person pronouns the most, followed by Spanish-speakers. At 30 months old, Korean speakers are using first person pronouns, but they use it the least. Besides that, the only other word change is for Spanish. The most common pronoun used is now “mío” instead of “yo,” joining English and Italian in the possessive pronoun.

Conclusion

The distinction between pro-drop and non-pro-drop languages doesn’t appear to impact the age of acquisition. Therefore, even if children in pro-drop languages don’t frequently use it, they still learn it at a similar age. This suggests the existence of a shared neurological structure in all children that plays a role in this process regardless of their native language. Usage, on the other hand, might be affected by the culture and society in which the children are immersed. Even among pro-drop languages, there are significant variations in the production of pronouns.

LS0tDQp0aXRsZTogIlByb25vdW5zIFBsYXlncm91bmQ6IEV4cGxvcmluZyBQcm9ub3VuIERldmVsb3BtZW50IEluIFByby1Ecm9wIGFuZCBOb24gUHJvLURyb3ANCiAgTGFuZ3VhZ2UtU3BlYWtpbmcgQ2hpbGRyZW4iDQphdXRob3I6ICJEb25hZWxsZSBCZW5vaXQiDQpkYXRlOiAiRGVjZW1iZXIgMTUsIDIwMjMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KUHJvbm91bnMgYXJlIHdvcmRzIHRoYXQgcmVmZXIgdG8gcGxhY2VzLCBwZW9wbGUsIGFuZCB0aGluZ3MuIFRoZXkgd29yayB0byByZXBsYWNlIG90aGVyIG5vdW5zIGFuZCBwcmV2ZW50IHRoZSBzcGVha2VyIGZyb20gaGF2aW5nIHRvIHJlcGVhdCBzcGVjaWZpYyBuYW1lcyBvdmVyIGFuZCBvdmVyIGFnYWluLiBTb21lIGxhbmd1YWdlcyBzdHJpY3RseSByZXF1aXJlIHByb25vdW5zIHRvIGJlIHVzZWQgaW4gc2VudGVuY2VzLiBFbmdsaXNoIGlzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhIGxhbmd1YWdlLiBJbiBtb3N0IHNpdHVhdGlvbnMsIGEgc3ViamVjdCBpcyBuZWVkZWQgb3RoZXJ3aXNlIGl0IGNyZWF0ZXMgY29uZnVzaW9uLiBPdGhlciBsYW5ndWFnZXMgZG9uJ3QgdXNlIHByb25vdW5zIGFzIG9mdGVuIGFuZCBleHBsaWNpdGx5LiBUaGVzZSBhcmUgY2FsbGVkIHByby1kcm9wIGxhbmd1YWdlcy4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgdXR0ZXJhbmNlLCBzdWNoIGFzIHZlcmIgY29uanVnYXRpb24sIGxldHMgdGhlIGxpc3RlbmVyIGtub3cgd2hhdCB0aGUgc3ViamVjdCBvZiB0aGUgc2VudGVuY2UgaXMgd2l0aG91dCBpdCBiZWluZyBzdGF0ZWQuDQoNCkluIHRoaXMgc3RhdGlzdGljYWwgYW5hbHlzaXMsIEkgd2lsbCBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHNwZWFraW5nIGEgcHJvLWRyb3Agb3Igbm9uIHByby1kcm9wIGxhbmd1YWdlIGhhcyBhbiBpbXBhY3Qgb24gdGhlIGFnZSB0aGF0IGNoaWxkcmVuIGFjcXVpcmUgcHJvbm91bnMgYW5kIGl0cyBzdWJzZXF1ZW50IHVzYWdlIGJhc2VkIG9uIGRhdGEgZnJvbSBXb3JkYmFuaywgYSBkYXRhYmFzZSBvZiBjaGlsZHJlbidzIHZvY2FidWxhcnkuDQoNCg0KDQoNCiMjIyAqKlBhdHRlcm5zIGluIEFnZSBvZiBBY3F1aXNpdGlvbioqDQoNCmBgYHtyfQ0KbGlicmFyeSh3b3JkYmFua3IpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiNHZXR0aW5nIHRoZSBGdWxsIERhdGFzZXRzDQoNCnByb25vdW5zX3VzYSA8LSBnZXRfaXRlbV9kYXRhKGxhbmd1YWdlID0gIkVuZ2xpc2ggKEFtZXJpY2FuKSIsIGZvcm0gPSAiV1MiKSAlPiUNCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJwcm9ub3VucyIpDQoNCg0KcHJvbm91bnNfdXNhX2RhdGEgPC0gZ2V0X2luc3RydW1lbnRfZGF0YShsYW5ndWFnZSA9ICJFbmdsaXNoIChBbWVyaWNhbikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICJXUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IHByb25vdW5zX3VzYSRpdGVtX2lkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5pc3RyYXRpb25faW5mbyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2luZm8gPSBUUlVFKQ0KDQoNCnByb25vdW5zX2VzcCA8LSBnZXRfaXRlbV9kYXRhKGxhbmd1YWdlID0gIlNwYW5pc2ggKE1leGljYW4pIiwgZm9ybSA9ICJXUyIpICU+JQ0KICBmaWx0ZXIoY2F0ZWdvcnkgPT0gInByb25vdW5zIikNCg0KDQpwcm9ub3Vuc19lc3BfZGF0YSA8LSBnZXRfaW5zdHJ1bWVudF9kYXRhKGxhbmd1YWdlID0gIlNwYW5pc2ggKE1leGljYW4pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICJXUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gcHJvbm91bnNfZXNwJGl0ZW1faWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluaXN0cmF0aW9uX2luZm8gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2luZm8gPSBUUlVFKQ0KDQpwcm9ub3Vuc19rb3IgPC0gZ2V0X2l0ZW1fZGF0YShsYW5ndWFnZSA9ICJLb3JlYW4iLCBmb3JtID0gIldTIikgJT4lDQogIGZpbHRlcihjYXRlZ29yeSA9PSAicHJvbm91bnMiKQ0KDQoNCnByb25vdW5zX2tvcl9kYXRhIDwtIGdldF9pbnN0cnVtZW50X2RhdGEobGFuZ3VhZ2UgPSAiS29yZWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtID0gIldTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IHByb25vdW5zX2tvciRpdGVtX2lkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluaXN0cmF0aW9uX2luZm8gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1faW5mbyA9IFRSVUUpDQoNCnByb25vdW5zX2NoaW5hIDwtIGdldF9pdGVtX2RhdGEobGFuZ3VhZ2UgPSAiTWFuZGFyaW4gKEJlaWppbmcpIiwgZm9ybSA9ICJXUyIpICU+JQ0KICBmaWx0ZXIoY2F0ZWdvcnkgPT0gInByb25vdW5zIikNCg0KDQpwcm9ub3Vuc19jaGluYV9kYXRhIDwtIGdldF9pbnN0cnVtZW50X2RhdGEobGFuZ3VhZ2UgPSAiTWFuZGFyaW4gKEJlaWppbmcpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICJXUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gcHJvbm91bnNfY2hpbmEkaXRlbV9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtaW5pc3RyYXRpb25faW5mbyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1faW5mbyA9IFRSVUUpDQoNCnByb25vdW5zX2l0YSA8LSBnZXRfaXRlbV9kYXRhKGxhbmd1YWdlID0gIkl0YWxpYW4iLCBmb3JtID0gIldTIikgJT4lDQogIGZpbHRlcihjYXRlZ29yeSA9PSAicHJvbm91bnMiKQ0KDQoNCnByb25vdW5zX2l0YV9kYXRhIDwtIGdldF9pbnN0cnVtZW50X2RhdGEobGFuZ3VhZ2UgPSAiSXRhbGlhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICJXUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBwcm9ub3Vuc19pdGEkaXRlbV9pZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG1pbmlzdHJhdGlvbl9pbmZvID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2luZm8gPSBUUlVFKQ0KDQpwcm9ub3Vuc19pYmUgPC0gZ2V0X2l0ZW1fZGF0YShsYW5ndWFnZSA9ICJTcGFuaXNoIChFdXJvcGVhbikiLCBmb3JtID0gIldTIikgJT4lDQogIGZpbHRlcihjYXRlZ29yeSA9PSAicHJvbm91bnMiKQ0KDQoNCnByb25vdW5zX2liZV9kYXRhIDwtIGdldF9pbnN0cnVtZW50X2RhdGEobGFuZ3VhZ2UgPSAiU3BhbmlzaCAoRXVyb3BlYW4pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICJXUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gcHJvbm91bnNfaWJlJGl0ZW1faWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbWluaXN0cmF0aW9uX2luZm8gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtX2luZm8gPSBUUlVFKQ0KYGBgDQpgYGB7cn0NCg0KIyBHZXR0aW5nIEFnZSBvZiBBY3F1aXNpdGlvbg0KYW9hX2VuZyA8LSBmaXRfYW9hKHByb25vdW5zX3VzYV9kYXRhKQ0KDQoNCmFvYV9lbmdfcHJvbm91bnMgPC0gYW9hX2VuZ1shaXMubmEoYW9hX2VuZyRhb2EpLCBdDQoNCg0KYW9hX2VzcCA8LSBmaXRfYW9hKHByb25vdW5zX2VzcF9kYXRhKQ0KDQoNCmFvYV9lc3BfcHJvbm91bnMgPC0gYW9hX2VzcFshaXMubmEoYW9hX2VzcCRhb2EpLCBdDQoNCg0KYW9hX2tvciA8LSBmaXRfYW9hKHByb25vdW5zX2tvcl9kYXRhKQ0KDQoNCmFvYV9rb3JfcHJvbm91bnMgPC0gYW9hX2tvclshaXMubmEoYW9hX2tvciRhb2EpLCBdDQoNCg0KYW9hX2NoaW5hIDwtIGZpdF9hb2EocHJvbm91bnNfY2hpbmFfZGF0YSkNCg0KDQphb2FfY2hpbmFfcHJvbm91bnMgPC0gYW9hX2NoaW5hWyFpcy5uYShhb2FfY2hpbmEkYW9hKSwgXQ0KDQoNCmFvYV9pdGEgPC0gZml0X2FvYShwcm9ub3Vuc19pdGFfZGF0YSkNCg0KDQphb2FfaXRhX3Byb25vdW5zIDwtIGFvYV9pdGFbIWlzLm5hKGFvYV9pdGEkYW9hKSwgXQ0KDQoNCmFvYV9pYmUgPC0gZml0X2FvYShwcm9ub3Vuc19pYmVfZGF0YSkNCg0KDQphb2FfaWJlX3Byb25vdW5zIDwtIGFvYV9pYmVbIWlzLm5hKGFvYV9pYmUkYW9hKSwgXQ0KDQpgYGANCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KDQoNCiAgcHJpbnQoZ2dwbG90KGFvYV9lbmdfcHJvbm91bnMsIGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gYW9hKSkgKw0KICAgIGdlb21fc2VnbWVudChhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeGVuZCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IDAsIHllbmQgPSBhb2EpLCANCiAgICAgICAgICAgICAgICAgY29sb3IgPSAiY29yYWwiLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gImNvcmFsIikgKw0KICAgIGxhYnModGl0bGUgPSAiQWdlIG9mIEFjcXVpc2l0aW9uIGZvciBFbmdsaXNoIChBbWVyaWNhbikgUHJvbm91bnMiLCB4ID0gIlByb25vdW5zIiwgeSA9ICJBZ2UgKG1vbnRocykiKSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCikNCmBgYA0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpwcmludChnZ3Bsb3QoYW9hX2VzcF9wcm9ub3VucywgYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHkgPSBhb2EpKSArDQogICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB4ZW5kID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gMCwgeWVuZCA9IGFvYSksIA0KICAgICAgICAgICAgICAgICBjb2xvciA9ICJhcXVhbWFyaW5lMyIsIHNpemUgPSAxKSArDQogICAgZ2VvbV9wb2ludChzaGFwZSA9IDE2LCBzaXplID0gMywgY29sb3IgPSAiYXF1YW1hcmluZTMiKSArDQogICAgbGFicyh0aXRsZSA9ICJBZ2Ugb2YgQWNxdWlzaXRpb24gZm9yIFNwYW5pc2ggKE1leGljYW4pIFByb25vdW5zIiwgeCA9ICJQcm9ub3VucyIsIHkgPSAiQWdlIChtb250aHMpIikgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkNCikNCmBgYA0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQoNCnByaW50KGdncGxvdChhb2FfaWJlX3Byb25vdW5zLCBhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IGFvYSkpICsNCiAgICBnZW9tX3NlZ21lbnQoYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHhlbmQgPSBpdGVtX2RlZmluaXRpb24sIHkgPSAwLCB5ZW5kID0gYW9hKSwgDQogICAgICAgICAgICAgICAgIGNvbG9yID0gImNoYXJ0cmV1c2UiLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gImNoYXJ0cmV1c2UiKSArDQogICAgbGFicyh0aXRsZSA9ICJBZ2Ugb2YgQWNxdWlzaXRpb24gZm9yIFNwYW5pc2ggKEV1cm9wZWFuKSBQcm9ub3VucyIsIHggPSAiUHJvbm91bnMiLCB5ID0gIkFnZSAobW9udGhzKSIpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpDQopDQoNCmBgYA0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpwcmludChnZ3Bsb3QoYW9hX2l0YV9wcm9ub3VucywgYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHkgPSBhb2EpKSArDQogICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB4ZW5kID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gMCwgeWVuZCA9IGFvYSksIA0KICAgICAgICAgICAgICAgICBjb2xvciA9ICJnb2xkZW5yb2QiLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gImdvbGRlbnJvZCIpICsNCiAgICBsYWJzKHRpdGxlID0gIkFnZSBvZiBBY3F1aXNpdGlvbiBmb3IgSXRhbGlhbiBQcm9ub3VucyIsIHggPSAiUHJvbm91bnMiLCB5ID0gIkFnZSAobW9udGhzKSIpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpDQopDQpgYGANCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KcHJpbnQoZ2dwbG90KGFvYV9rb3JfcHJvbm91bnMsIGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gYW9hKSkgKw0KICAgIGdlb21fc2VnbWVudChhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeGVuZCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IDAsIHllbmQgPSBhb2EpLCANCiAgICAgICAgICAgICAgICAgY29sb3IgPSAicGFsZXZpb2xldHJlZDEiLCBzaXplID0gMSkgKw0KICAgIGdlb21fcG9pbnQoc2hhcGUgPSAxNiwgc2l6ZSA9IDMsIGNvbG9yID0gInBhbGV2aW9sZXRyZWQxIikgKw0KICAgIGxhYnModGl0bGUgPSAiQWdlIG9mIEFjcXVpc2l0aW9uIGZvciBLb3JlYW4gUHJvbm91bnMiLCB4ID0gIlByb25vdW5zIiwgeSA9ICJBZ2UgKG1vbnRocykiKSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQ0KKQ0KYGBgICANCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KcHJpbnQoZ2dwbG90KGFvYV9jaGluYV9wcm9ub3VucywgYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHkgPSBhb2EpKSArDQogICAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB4ZW5kID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gMCwgeWVuZCA9IGFvYSksIA0KICAgICAgICAgICAgICAgICBjb2xvciA9ICJkYXJrb3JjaGlkIiwgc2l6ZSA9IDEpICsNCiAgICBnZW9tX3BvaW50KHNoYXBlID0gMTYsIHNpemUgPSAzLCBjb2xvciA9ICJkYXJrb3JjaGlkIikgKw0KICAgIGxhYnModGl0bGUgPSAiQWdlIG9mIEFjcXVpc2l0aW9uIGZvciBNYW5kYXJpbiBQcm9ub3VucyIsIHggPSAiUHJvbm91bnMiLCB5ID0gIkFnZSAobW9udGhzKSIpICsNCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpDQopDQogIA0KYGBgDQoNCkVuZ2xpc2ggaXMgYSBub24gcHJvLWRyb3AgbGFuZ3VhZ2Ugd2hpbGUgU3BhbmlzaCwgSXRhbGlhbiwgS29yZWFuLCBhbmQgTWFuZGFyaW4gYXJlIHByby1kcm9wIGxhbmd1YWdlcy4gVGhlIGVhcmxpZXN0IHByb25vdW4gYWNxdWlzaXRpb24gb2NjdXJzIGF0IGEgc2ltaWxhciBhZ2UgaW4gRW5nbGlzaCwgU3BhbmlzaCwgYW5kIEl0YWxpYW4uIEVuZ2xpc2ggYW5kIEl0YWxpYW4gYXJlIGF0IDIxIG1vbnRocyBvbGQgd2hpbGUgU3BhbmlzaCBpcyBhdCAyMCBtb250aHMuIE1hbmRhcmluJ3MgZWFybGllc3QgYWdlIG9mIGFjcXVpc2l0aW9uIGhhcHBlbnMgYSBsaXR0bGUgeW91bmdlciB0aGFuIHRoZSByZXN0LS1hdCAxOSBtb250aHMuIEtvcmVhbiBpcyB0aGUgbGF0ZXN0IHdpdGggdGhlaXIgaW5pdGlhbCBwcm9ub3VuIGFjcXVpc2l0aW9uIGhhcHBlbmluZyBhdCBhcm91bmQgMjUgbW9udGhzLg0KDQoNCkRlc3BpdGUgRW5nbGlzaCBub3QgYmVpbmcgcHJvLWRyb3AgYW5kIGZyb20gYSBkaWZmZXJlbnQgZmFtaWx5LCB0aGVyZSdzIGxpdHRsZSBkaXN0aW5jdGlvbiBmcm9tIFNwYW5pc2gsIEl0YWxpYW4sIGFuZCBNYW5kYXJpbi4gQWNyb3NzIHRoZXNlIGdyb3VwcywgY2hpbGRyZW4gY29uc2lzdGVudGx5IGFjcXVpcmUgZmlyc3QtcGVyc29uIHByb25vdW5zIGZpcnN0LiBSZW1hcmthYmx5LCBhY2NvcmRpbmcgdG8gdGhlIGRhdGEsIHRoZSBmaXJzdCBwcm9ub3VuIGFjcXVpcmVkIGJ5IEtvcmVhbiBjaGlsZHJlbiBpcyB0aGUgZGVtb25zdHJhdGl2ZSBwcm9ub3VuLCAidGhpcy4iIFRoZXkgZG9uJ3QgYWNxdWlyZSBhIGZpcnN0IHBlcnNvbiBwcm9ub3VuIHVudGlsIDI3IG1vbnRocyBvbGQuIEhvd2V2ZXIsIGl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIGFnZSBvZiBhY3F1aXNpdGlvbiBmb3IgInRoaXMiIGlzIGFjdHVhbGx5IHRoZSBzYW1lIGZvciB0aGUgcmVzdCBvZiB0aGUgbGFuZ3VhZ2VzIGFzIEtvcmVhbi4NCg0KIyMjICoqUGF0dGVybnMgaW4gUHJvZHVjdGlvbioqDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KDQoNCnByb25vdW5zX3VzYV9tZWFuIDwtIHByb25vdW5zX3VzYV9kYXRhICU+JQ0KICBncm91cF9ieShhZ2UsIGRhdGFfaWQpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gc3VtKHByb2R1Y2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoYWdlKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG51bSwgbmEucm0gPSBUUlVFKSkNCg0KcHJvbm91bnNfZXNwX21lYW4gPC0gcHJvbm91bnNfZXNwX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgZGF0YV9pZCkgJT4lDQogIHN1bW1hcmlzZShudW0gPSBzdW0ocHJvZHVjZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShhZ2UpICU+JQ0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obnVtLCBuYS5ybSA9IFRSVUUpKQ0KDQoNCnByaW50KGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcm9ub3Vuc191c2FfbWVhbiwgYWVzKHggPSBhZ2UsIHkgPSBtZWFuLCBjb2xvciA9ICJFbmdsaXNoIChBbWVyaWNhbikiKSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByb25vdW5zX2VzcF9tZWFuLCBhZXMoeCA9IGFnZSwgeSA9IG1lYW4sIGNvbG9yID0gIlNwYW5pc2ggKE1leGljYW4pIikpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9ub3VuIFByb2R1Y3Rpb24gYnkgQWdlIiwgeCA9ICJBZ2UgKG1vbnRocykiLCB5ID0gIk1lYW4gcHJvbm91bnMgcHJvZHVjZWQiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkxhbmd1YWdlIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJFbmdsaXNoIChBbWVyaWNhbikiID0gImNvcmFsIiwgIlNwYW5pc2ggKE1leGljYW4pIiA9ICJhcXVhbWFyaW5lMyIpKQ0KDQopDQoNCmBgYA0KVGhpcyBncmFwaCBhcHBlYXJzIHRvIHNob3cgU3BhbmlzaC1zcGVha2luZyBjaGlsZHJlbiB1c2luZyBwcm9ub3VucyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBFbmdsaXNoLXNwZWFraW5nIGNoaWxkcmVuLCBhbHRob3VnaCBJIGV4cGVjdGVkIHRoZSBvcHBvc2l0ZS4gVGhlIGF2ZXJhZ2UgYW1vdW50IG9mIHByb25vdW5zIHByb2R1Y2VkIGZsdWN0dWF0ZXMgYXMgU3BhbmlzaCBzcGVha2VycyBnZXQgb2xkZXIgd2hlcmVhcyBFbmdsaXNoIHNwZWFrZXJzIGhhdmUgYSBzdGVhZHkgaW5jcmVhc2UgaW4gcHJvZHVjdGlvbiB5ZWFyIGJ5IHllYXIuIEV2ZW4gc28sIGluIHRoZSBwZXJpb2RzIG9mIGluY3JlYXNlZCBwcm9kdWN0aW9uLCBTcGFuaXNoIGNoaWxkcmVuIGNsZWFybHkgdXNlIG1vcmUgcHJvbm91bnMgd2hlbiB0aGV5IGFyZSBvbGRlciBqdXN0IGxpa2UgRW5nbGlzaC1zcGVha2luZyBjaGlsZHJlbi4gQW4gZXhwbGFuYXRpb24gZm9yIHRoaXMgY291bGQgYmUgdGhhdCBpdCBpcyByZWZsZWN0aW5nIHRoZSBmbHVpZGl0eSBpbiB0aGUgbmVlZCBmb3IgcHJvbm91bnMgaW4gU3BhbmlzaC4gU29tZXRpbWVzLCB0aGUgY2hpbGRyZW4gZmluZCB0aGF0IHRoZXkgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZW0gYW5kIGF0IG90aGVyIHRpbWVzLCB0aGV5IGRvbid0LiBBdCAzMCBtb250aHMgb2xkLCBTcGFuaXNoIHRha2VzIGEgc2lnbmlmaWNhbnQgZGlwIGluIHByb25vdW5zIHByb2R1Y2VkIGNvbXBhcmVkIHRvIGFib3V0IDI3IG1vbnRocy4gRW5nbGlzaCBoYXMgYWJvdXQgdHdvIHBlcmlvZHMgd2hlcmUgdGhlIHByb2R1Y3Rpb24gZGVjcmVhc2VzLiANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KcHJvbm91bnNfZXNwX21lYW4gPC0gcHJvbm91bnNfZXNwX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgZGF0YV9pZCkgJT4lDQogIHN1bW1hcmlzZShudW0gPSBzdW0ocHJvZHVjZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShhZ2UpICU+JQ0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obnVtLCBuYS5ybSA9IFRSVUUpKQ0KDQpwcm9ub3Vuc19pYmVfbWVhbiA8LSBwcm9ub3Vuc19pYmVfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoYWdlLCBkYXRhX2lkKSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IHN1bShwcm9kdWNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGdyb3VwX2J5KGFnZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihudW0sIG5hLnJtID0gVFJVRSkpDQoNCnByaW50KGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcm9ub3Vuc19lc3BfbWVhbiwgYWVzKHggPSBhZ2UsIHkgPSBtZWFuLCBjb2xvciA9ICJTcGFuaXNoIChNZXhpY2FuKSIpKSArDQogIGdlb21fbGluZShkYXRhID0gcHJvbm91bnNfaWJlX21lYW4sIGFlcyh4ID0gYWdlLCB5ID0gbWVhbiwgY29sb3IgPSAiU3BhbmlzaCAoRXVyb3BlYW4pIikpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9ub3VuIFByb2R1Y3Rpb24gYnkgQWdlIiwgeCA9ICJBZ2UgKG1vbnRocykiLCB5ID0gIk1lYW4gcHJvbm91bnMgcHJvZHVjZWQiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkxhbmd1YWdlIiwgdmFsdWVzID0gYygiU3BhbmlzaCAoTWV4aWNhbikiID0gImFxdWFtYXJpbmUzIiwgIlNwYW5pc2ggKEV1cm9wZWFuKSIgPSAiY2hhcnRyZXVzZSIpKQ0KDQopDQoNCmBgYA0KQmVzaWRlcyB0aGUgbGFuZ3VhZ2UgaXRzZWxmLCBJIGFsc28gd2FudGVkIHRvIGV4cGxvcmUgdGhlIHJvbGUgY3VsdHVyZSBtYXkgcGxheSBpbiBwcm9ub3VuIGFjcXVpc2l0aW9uIGFuZCB1c2FnZSBieSB1c2luZyB0d28gdmFyaWV0aWVzIG9mIHRoZSBzYW1lIHBybyBkcm9wIGxhbmd1YWdlLiBUaGUgRXVyb3BlYW4gYW5kIE1leGljYW4gdmFyaWV0aWVzIG9mIFNwYW5pc2ggaGF2ZSB2ZXJ5IGNsb3NlIGF2ZXJhZ2UgbnVtYmVycywgYnV0IE1leGljYW4gU3BhbmlzaCAgc3VycGFzc2VzIGl0cyBFdXJvcGVhbiBjb3VudGVycGFydCBvdmVyYWxsLiBUaGV5IGFsc28gYm90aCBoYXZlIHBlcmlvZHMgb2YgZmx1Y3R1YXRpb24uIE1leGljYW4gU3BhbmlzaCBmZWF0dXJlcyBtb3JlIHByb25vdW5jZWQgcmlzZXMgYW5kIGZhbGxzIHdoaWxlIEV1cm9wZWFuIFNwYW5pc2ggZGVtb25zdHJhdGVzIGxlc3MgcHJvbm91bmNlZCBhbmQgZHJhbWF0aWMgZmx1Y3R1YXRpb25zLiBGb3IgaW5zdGFuY2UsIHRoZSBkaWZmZXJlbmNlIGluIHByb2R1Y3Rpb24gYXQgYXJvdW5kIDI3IG1vbnRocyB0byAzMCBtb250aHMgaXMgbGl0dGxlIGNvbXBhcmVkIHRvIE1leGljYW4gU3BhbmlzaC4gSXQgc2VlbXMgYXMgdGhvdWdoIEV1cm9wZWFuIFNwYW5pc2gtc3BlYWtpbmcgY2hpbGRyZW4gYXJlIG1vc3QgY29uc2lzdGVudCBpbiB0aGVpciBwcm9kdWN0aW9uLiBOZXZlcnRoZWxlc3MsIGF0IGNsb3NlIHRvIDMwIG1vbnRocyBvbGQsIHRoZSB0d28gdmFyaWV0aWVzIHNlZW1zIHRvIGhhdmUgdGhlIGF2ZXJhZ2UuIA0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCnByb25vdW5zX2VzcF9tZWFuIDwtIHByb25vdW5zX2VzcF9kYXRhICU+JQ0KICBncm91cF9ieShhZ2UsIGRhdGFfaWQpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gc3VtKHByb2R1Y2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoYWdlKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG51bSwgbmEucm0gPSBUUlVFKSkNCg0KcHJvbm91bnNfaXRhX21lYW4gPC0gcHJvbm91bnNfaXRhX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgZGF0YV9pZCkgJT4lDQogIHN1bW1hcmlzZShudW0gPSBzdW0ocHJvZHVjZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShhZ2UpICU+JQ0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obnVtLCBuYS5ybSA9IFRSVUUpKQ0KDQpwcmludChnZ3Bsb3QoKSArDQogIGdlb21fbGluZShkYXRhID0gcHJvbm91bnNfZXNwX21lYW4sIGFlcyh4ID0gYWdlLCB5ID0gbWVhbiwgY29sb3IgPSAiU3BhbmlzaCAoTWV4aWNhbikiKSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByb25vdW5zX2l0YV9tZWFuLCBhZXMoeCA9IGFnZSwgeSA9IG1lYW4sIGNvbG9yID0gIkl0YWxpYW4iKSkgKw0KICBsYWJzKHRpdGxlID0gIlByb25vdW4gUHJvZHVjdGlvbiBieSBBZ2UiLCB4ID0gIkFnZSAobW9udGhzKSIsIHkgPSAiTWVhbiBwcm9ub3VucyBwcm9kdWNlZCIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiTGFuZ3VhZ2UiLCB2YWx1ZXMgPSBjKCJTcGFuaXNoIChNZXhpY2FuKSIgPSAiYXF1YW1hcmluZTMiLCAiSXRhbGlhbiIgPSAiZ29sZGVucm9kIikpDQoNCikNCg0KYGBgDQoNCldoZW4gY29tcGFyZWQgdG8gSXRhbGlhbiwgU3BhbmlzaCBjaGlsZHJlbiB1c2UgbW9yZSBwcm9ub3VucyBvbiBhdmVyYWdlLiBTZWVpbmcgYXMgdGhleSBhcmUgYm90aCBSb21hbmNlIGxhbmd1YWdlcywgSSB3b25kZXJlZCBpZiB0aGV5IHdvdWxkIGhhdmUgc2ltaWxhciBwcm9kdWN0aW9uLiBUaGV5IGFyZSBzb21ld2hhdCBjbG9zZXIgaW4gdGVybXMgb2YgZmlndXJlcyB0aGFuIEVuZ2xpc2ggYW5kIFNwYW5pc2gsIGJ1dCBub3QgYXMgbXVjaCBhcyBNZXhpY2FuIGFuZCBFdXJvcGVhbiBTcGFuaXNoLiBTaW1pbGFyIHRvIGJvdGggdmFyaWV0aWVzIG9mIFNwYW5pc2gsIEl0YWxpYW4gYW5kIFNwYW5pc2ggYWxzbyBmbHVjdHVhdGUuIEZsdWN0dWF0aW9uIHNlZW1zIHRvIGJlIGEgcGF0dGVybiBhbW9uZyBub24gcHJvLWRyb3AgbGFuZ3VhZ2VzLiANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KcHJvbm91bnNfZXNwX21lYW4gPC0gcHJvbm91bnNfZXNwX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgZGF0YV9pZCkgJT4lDQogIHN1bW1hcmlzZShudW0gPSBzdW0ocHJvZHVjZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShhZ2UpICU+JQ0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obnVtLCBuYS5ybSA9IFRSVUUpKQ0KDQpwcm9ub3Vuc19rb3JfbWVhbiA8LSBwcm9ub3Vuc19rb3JfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoYWdlLCBkYXRhX2lkKSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IHN1bShwcm9kdWNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGdyb3VwX2J5KGFnZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihudW0sIG5hLnJtID0gVFJVRSkpDQoNCnByaW50KGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcm9ub3Vuc19lc3BfbWVhbiwgYWVzKHggPSBhZ2UsIHkgPSBtZWFuLCBjb2xvciA9ICJhcXVhbWFyaW5lMyIpKSArDQogIGdlb21fbGluZShkYXRhID0gcHJvbm91bnNfa29yX21lYW4sIGFlcyh4ID0gYWdlLCB5ID0gbWVhbiwgY29sb3IgPSAicGFsZXZpb2xldHJlZDEiKSkgKw0KICBsYWJzKHRpdGxlID0gIlByb25vdW4gUHJvZHVjdGlvbiBieSBBZ2UiLCB4ID0gIkFnZSAobW9udGhzKSIsIHkgPSJNZWFuIHByb25vdW5zIHByb2R1Y2VkIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJMYW5ndWFnZSIsIHZhbHVlcyA9IGMoImFxdWFtYXJpbmUzIiwgInBhbGV2aW9sZXRyZWQxIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTcGFuaXNoIChNZXhpY2FuKSIsICJLb3JlYW4iKSkNCikNCmBgYA0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCnByb25vdW5zX2l0YV9tZWFuIDwtIHByb25vdW5zX2l0YV9kYXRhICU+JQ0KICBncm91cF9ieShhZ2UsIGRhdGFfaWQpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gc3VtKHByb2R1Y2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoYWdlKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG51bSwgbmEucm0gPSBUUlVFKSkNCg0KcHJvbm91bnNfa29yX21lYW4gPC0gcHJvbm91bnNfa29yX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgZGF0YV9pZCkgJT4lDQogIHN1bW1hcmlzZShudW0gPSBzdW0ocHJvZHVjZXMsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShhZ2UpICU+JQ0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obnVtLCBuYS5ybSA9IFRSVUUpKQ0KDQpwcmludChnZ3Bsb3QoKSArDQogIGdlb21fbGluZShkYXRhID0gcHJvbm91bnNfaXRhX21lYW4sIGFlcyh4ID0gYWdlLCB5ID0gbWVhbiwgY29sb3IgPSAiZ29sZGVucm9kIikpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcm9ub3Vuc19rb3JfbWVhbiwgYWVzKHggPSBhZ2UsIHkgPSBtZWFuLCBjb2xvciA9ICJob3RwaW5rIikpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9ub3VuIFByb2R1Y3Rpb24gYnkgQWdlIiwgeCA9ICJBZ2UgKG1vbnRocykiLCB5ID0iTWVhbiBwcm9ub3VucyBwcm9kdWNlZCIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiTGFuZ3VhZ2UiLCB2YWx1ZXMgPSBjKCJnb2xkZW5yb2QiLCAiaG90cGluayIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiSXRhbGlhbiIsICJLb3JlYW4iKSkNCikNCmBgYA0KS29yZWFuIGFuZCBTcGFuaXNoIGhhdmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gYXZlcmFnZSBwcm9kdWN0aW9uLiBLb3JlYW4tc3BlYWtpbmcgY2hpbGRyZW4gdXNlIGZhciBsZXNzIHByb25vdW5zIG9uIGF2ZXJhZ2UuIA0KS29yZWFuIGFuZCBJdGFsaWFuLCBhbm90aGVyIFJvbWFuY2UgbGFuZ3VhZ2UsIGhhdmUgc2ltaWxhciByZXN1bHRzLiBJdGFsaWFuLXNwZWFraW5nIGNoaWxkcmVuIHByb2R1Y2UgbW9yZSBwcm9ub3VucyBvbiBhdmVyYWdlLiBBdCAzMSBtb250aHMgb2xkLCBLb3JlYW4gY2hpbGRyZW4gcHJvZHVjZSB0aGUgaGlnaGVzdCBhdmVyYWdlIGFtb3VudCBvZiBwcm9ub3Vucy4gQXQgdGhlIGFnZSBvZiAzMSBtb250aHMsIEtvcmVhbiBjaGlsZHJlbiBleGhpYml0IHRoZSBoaWdoZXN0IGF2ZXJhZ2UgcHJvbm91biBwcm9kdWN0aW9uLCB3aGljaCBpcyByZWxhdGl2ZWx5IGNsb3NlIHRvIHRoYXQgb2YgU3BhbmlzaC1zcGVha2luZyBjaGlsZHJlbiBhdCAyOSBtb250aHMuIEhvd2V2ZXIsIHRoZSBkaXNwYXJpdHkgaXMgbm90YWJsZSwgd2l0aCBLb3JlYW4gY2hpbGRyZW4gcHJvZHVjaW5nIGFwcHJveGltYXRlbHkgNCBwcm9ub3Vucywgd2hlcmVhcyBTcGFuaXNoIHNwZWFrZXJzIHByb2R1Y2UgbmVhcmx5IDIwIHByb25vdW5zIGJ5IHRoZSBhZ2Ugb2YgMzEgbW9udGhzLiBUaGUgb2xkZXIgYm90aCBncm91cHMgb2YgY2hpbGRyZW4gYmVjb21lLCB0aGUgbW9yZSBwcm9ub3VucyB0aGV5IHVzZSwgYnV0IHRoZSBkaWZmZXJlbmNlcyBpbiBLb3JlYW4gYXJlIG5vdCBhcyBkaXNjZXJuaWJsZSBhcyB0aGUgb3RoZXIgbGFuZ3VhZ2VzLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQpwcm9ub3Vuc19rb3JfbWVhbiA8LSBwcm9ub3Vuc19rb3JfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoYWdlLCBkYXRhX2lkKSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IHN1bShwcm9kdWNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGdyb3VwX2J5KGFnZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihudW0sIG5hLnJtID0gVFJVRSkpDQoNCnByb25vdW5zX2NoaW5hX21lYW4gPC0gcHJvbm91bnNfY2hpbmFfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoYWdlLCBkYXRhX2lkKSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IHN1bShwcm9kdWNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGdyb3VwX2J5KGFnZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihudW0sIG5hLnJtID0gVFJVRSkpDQoNCnByaW50KGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBwcm9ub3Vuc19rb3JfbWVhbiwgYWVzKHggPSBhZ2UsIHkgPSBtZWFuLCBjb2xvciA9ICJLb3JlYW4iKSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IHByb25vdW5zX2NoaW5hX21lYW4sIGFlcyh4ID0gYWdlLCB5ID0gbWVhbiwgY29sb3IgPSAiTWFuZGFyaW4iKSkgKw0KICBsYWJzKHRpdGxlID0gIlByb25vdW4gUHJvZHVjdGlvbiBieSBBZ2UiLCB4ID0gIkFnZSAobW9udGhzKSIsIHkgPSAiTWVhbiBwcm9ub3VucyBwcm9kdWNlZCIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiTGFuZ3VhZ2UiLCB2YWx1ZXMgPSBjKCJLb3JlYW4iID0gImhvdHBpbmsiLCAiTWFuZGFyaW4iID0gImRhcmtvcmNoaWQiKSkNCiAgDQopDQoNCmBgYA0KSW4gdGhpcyBzZXQgb2YgbGFuZ3VhZ2VzLCBLb3JlYW4gc2VlbXMgdG8gZ2VuZXJhdGUgdGhlIHNtYWxsZXN0IG51bWJlciBvZiBwcm9ub3Vucy4gVGhlIGNvbnRyYXN0IGluIHByb2R1Y3Rpb24gaXMgc3RyaWtpbmcuIEF0IHRoZSBhZ2Ugb2YgYWJvdXQgMTcgbW9udGhzLCBNYW5kYXJpbiBhbmQgS29yZWFuLCB0aGUgZ3JhcGggaW5kaWNhdGVzIHRoYXQgTWFuZGFyaW4gcHJvZHVjZXMgbW9yZSBwcm9ub3VucywgYWx0aG91Z2ggdGhlIGF2ZXJhZ2VzIGFyZSBzb21ld2hhdCBjbG9zZS4gQXMgdGhlIGNoaWxkcmVuIGdldCBvbGRlciwgdGhpcyBwcm94aW1pdHkgZGltaW5pc2hlcy4gQWZ0ZXIgMzUgbW9udGhzIG9sZCwgdGhlIG1lYW4gcHJvZHVjdGlvbiBpbmNyZWFzZXMgdG8gc2xpZ2h0bHkgb3ZlciBmaXZlIHByb25vdW5zLiBNYW5kYXJpbi1zcGVha2luZyBjaGlsZHJlbiByZWFjaCBhbiBhdmVyYWdlIG9mIGZpdmUgcHJvbm91bnMgYXQgMjAgbW9udGhzIG9sZCwgbWFya2luZyBhIGZpZnRlZW4tbW9udGggZ2FwLiANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCiMjIyAqKlBhdHRlcm5zIGluIFVzYWdlKioNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KcHJvbm91bnNfdXNhX2RhdGFfc3VtbWFyeSA8LSBwcm9ub3Vuc191c2FfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoYWdlLCBpdGVtX2RlZmluaXRpb24pICU+JQ0KICBzdW1tYXJpc2UobnVtID0gc3VtKHByb2R1Y2VzLCBuYS5ybSA9IFRSVUUpKQ0KDQpwcm9ub3Vuc19lc3BfZGF0YV9zdW1tYXJ5IDwtIHByb25vdW5zX2VzcF9kYXRhICU+JQ0KICBncm91cF9ieShhZ2UsIGl0ZW1fZGVmaW5pdGlvbikgJT4lDQogIHN1bW1hcmlzZShudW0gPSBzdW0ocHJvZHVjZXMsIG5hLnJtID0gVFJVRSkpDQoNCnByb25vdW5zX2tvcl9kYXRhX3N1bW1hcnkgPC0gcHJvbm91bnNfa29yX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgaXRlbV9kZWZpbml0aW9uLCBlbmdsaXNoX2dsb3NzKSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IHN1bShwcm9kdWNlcywgbmEucm0gPSBUUlVFKSkNCg0KcHJvbm91bnNfY2hpbmFfZGF0YV9zdW1tYXJ5IDwtIHByb25vdW5zX2NoaW5hX2RhdGEgJT4lDQogIGdyb3VwX2J5KGFnZSwgaXRlbV9kZWZpbml0aW9uLCBlbmdsaXNoX2dsb3NzKSAlPiUNCiAgc3VtbWFyaXNlKG51bSA9IHN1bShwcm9kdWNlcywgbmEucm0gPSBUUlVFKSkNCg0KcHJvbm91bnNfaXRhX2RhdGFfc3VtbWFyeSA8LSBwcm9ub3Vuc19pdGFfZGF0YSAlPiUNCiAgZ3JvdXBfYnkoYWdlLCBpdGVtX2RlZmluaXRpb24sIGVuZ2xpc2hfZ2xvc3MpICU+JQ0KICBzdW1tYXJpc2UobnVtID0gc3VtKHByb2R1Y2VzLCBuYS5ybSA9IFRSVUUpKQ0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm1vc3RfY29tbW9uX3dvcmRfdXNhX2hpZ2ggPC0gcHJvbm91bnNfdXNhX2RhdGFfc3VtbWFyeSAgJT4lDQogIGZpbHRlcihhZ2UgPT0gMzAsIG51bSA9PSA2NDcpDQoNCg0KbW9zdF9jb21tb25fd29yZF91c2FfbG93PC0gcHJvbm91bnNfdXNhX2RhdGFfc3VtbWFyeSAgJT4lDQogIGZpbHRlcihhZ2UgPT0gMTksIG51bSA9PSAyMzApDQoNCg0KbW9zdF9jb21tb25fd29yZF9lc3BfbG93IDwtIHByb25vdW5zX2VzcF9kYXRhX3N1bW1hcnkgICU+JQ0KICBmaWx0ZXIoYWdlID09IDE5LCBudW0gPT0gNTEpDQoNCg0KbW9zdF9jb21tb25fd29yZF9lc3BfaGlnaCA8LSBwcm9ub3Vuc19lc3BfZGF0YV9zdW1tYXJ5ICAlPiUNCiAgZmlsdGVyKGFnZSA9PSAzMCwgbnVtID09IDIyOSkNCg0KDQptb3N0X2NvbW1vbl93b3JkX2l0YV9sb3c8LSBwcm9ub3Vuc19pdGFfZGF0YV9zdW1tYXJ5ICAlPiUNCiAgZmlsdGVyKGFnZSA9PSAxOSwgbnVtID09IDIxKQ0KDQoNCm1vc3RfY29tbW9uX3dvcmRfaXRhX2hpZ2ggPC0gcHJvbm91bnNfaXRhX2RhdGFfc3VtbWFyeSAgJT4lDQogIGZpbHRlcihhZ2UgPT0gMzAsIG51bSA9PSA2NCkNCg0KDQptb3N0X2NvbW1vbl93b3JkX2tvcl9sb3c8LSBwcm9ub3Vuc19rb3JfZGF0YV9zdW1tYXJ5ICAlPiUNCiAgZmlsdGVyKGFnZSA9PSAxOSwgbnVtID09IDIxKQ0KDQoNCm1vc3RfY29tbW9uX3dvcmRfa29yX2hpZ2g8LSBwcm9ub3Vuc19rb3JfZGF0YV9zdW1tYXJ5ICAlPiUNCiAgZmlsdGVyKGFnZSA9PSAzMCwgbnVtID09IDQ3KQ0KDQoNCm1vc3RfY29tbW9uX3dvcmRfY2hpbmFfbG93IDwtIHByb25vdW5zX2NoaW5hX2RhdGFfc3VtbWFyeSAgJT4lDQogIGZpbHRlcihhZ2UgPT0gMTksIG51bSA9PSAzNyApDQoNCg0KbW9zdF9jb21tb25fd29yZF9jaGluYV9oaWdoIDwtIHByb25vdW5zX2NoaW5hX2RhdGFfc3VtbWFyeSAgJT4lDQogIGZpbHRlcihhZ2UgPT0gMzAsIG51bSA9PSA3MCkNCg0KYGBgDQpgYGB7cixtZXNzYWdlPUZBTFNFfQ0KIGdncGxvdCgpICsNCiAgICBnZW9tX2JhcihkYXRhID0gbW9zdF9jb21tb25fd29yZF91c2FfbG93LCBhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IG51bSwgZmlsbCA9ICJFbmdsaXNoIChBbWVyaWNhbikiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpKSArDQogICAgDQogICAgZ2VvbV9iYXIoZGF0YSA9IG1vc3RfY29tbW9uX3dvcmRfZXNwX2xvdywgYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHkgPSBudW0sIGZpbGwgPSAiU3BhbmlzaCAoTWV4aWNhbikiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpKSArDQogICAgDQogICAgZ2VvbV9iYXIoZGF0YSA9IG1vc3RfY29tbW9uX3dvcmRfaXRhX2xvdywgYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHkgPSBudW0sIGZpbGwgPSAiSXRhbGlhbiIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCkpICsNCiAgICANCiAgICBnZW9tX2JhcihkYXRhID0gbW9zdF9jb21tb25fd29yZF9rb3JfbG93LCBhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IG51bSwgZmlsbCA9ICJLb3JlYW4iKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpKSArDQogICAgDQogICAgZ2VvbV9iYXIoZGF0YSA9IG1vc3RfY29tbW9uX3dvcmRfY2hpbmFfbG93LCBhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IG51bSwgZmlsbCA9ICJNYW5kYXJpbiIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCkpICsNCiAgICANCiAgICBsYWJzKHRpdGxlID0gIk1vc3QgQ29tbW9uIFByb25vdW4gUHJvZHVjZWQgYXQgMTkgTW9udGhzIE9sZCIsIHggPSAiUHJvbm91biIsIHkgPSAiRnJlcXVlbmN5IikgKw0KICAgIA0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyANCiAgICANCiAgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIkxhbmd1YWdlIiwgdmFsdWVzID0gYygiRW5nbGlzaCAoQW1lcmljYW4pIiA9ICJjb3JhbCIsICJTcGFuaXNoIChNZXhpY2FuKSIgPSAiYXF1YW1hcmluZTMiLCAiSXRhbGlhbiIgPSAiZ29sZGVucm9kIiwgIktvcmVhbiIgPSAicGFsZXZpb2xldHJlZDEiLCAiTWFuZGFyaW4iID0gImRhcmtvcmNoaWQiKSkNCmBgYA0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9ICANCiBwcmludChnZ3Bsb3QoKSArDQogICAgZ2VvbV9iYXIoZGF0YSA9IG1vc3RfY29tbW9uX3dvcmRfdXNhX2hpZ2gsIGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gbnVtLCBmaWxsID0gIkVuZ2xpc2ggKEFtZXJpY2FuKSIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCkpICsNCiAgICANCiAgICBnZW9tX2JhcihkYXRhID0gbW9zdF9jb21tb25fd29yZF9lc3BfaGlnaCwgYWVzKHggPSBpdGVtX2RlZmluaXRpb24sIHkgPSBudW0sIGZpbGwgPSAiU3BhbmlzaCAoTWV4aWNhbikiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpKSArDQogICAgDQogICAgZ2VvbV9iYXIoZGF0YSA9IG1vc3RfY29tbW9uX3dvcmRfaXRhX2hpZ2gsIGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gbnVtLCBmaWxsID0gIkl0YWxpYW4iKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpKSArDQogICAgDQogICAgZ2VvbV9iYXIoZGF0YSA9IG1vc3RfY29tbW9uX3dvcmRfa29yX2hpZ2gsIGFlcyh4ID0gaXRlbV9kZWZpbml0aW9uLCB5ID0gbnVtLCBmaWxsID0gIktvcmVhbiIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCkpICsNCiAgICANCiAgICBnZW9tX2JhcihkYXRhID0gbW9zdF9jb21tb25fd29yZF9jaGluYV9oaWdoLCBhZXMoeCA9IGl0ZW1fZGVmaW5pdGlvbiwgeSA9IG51bSwgZmlsbCA9ICJNYW5kYXJpbiIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCkpICsNCiAgICANCiAgICBsYWJzKHRpdGxlID0gIk1vc3QgQ29tbW9uIFByb25vdW4gUHJvZHVjZWQgYXQgMzAgTW9udGhzIE9sZCIsIHggPSAiUHJvbm91biIsIHkgPSAiRnJlcXVlbmN5IikgKw0KICAgIA0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyANCiAgICANCiAgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIkxhbmd1YWdlIiwgdmFsdWVzID0gYygiRW5nbGlzaCAoQW1lcmljYW4pIiA9ICJjb3JhbCIsICJTcGFuaXNoIChNZXhpY2FuKSIgPSAiYXF1YW1hcmluZTMiLCAiSXRhbGlhbiIgPSAiZ29sZGVucm9kIiwgIktvcmVhbiIgPSAicGFsZXZpb2xldHJlZDEiLCAiTWFuZGFyaW4iID0gImRhcmtvcmNoaWQiKSkNCiApIA0KICANCmBgYA0KSW4gdGhlIGVhcmx5IGRldmVsb3BtZW50YWwgc3RhZ2VzLCB0aGUgY29tbW9uYWxpdHkgaW4gZmlyc3QtcGVyc29uIHByb25vdW5zIHNwYW5zIGFjcm9zcyBsYW5ndWFnZXMsIGV4Y2VwdCBmb3IgS29yZWFuLiBFbmdsaXNoIGFuZCBJdGFsaWFuIHVzZSB0aGUgZXhhY3Qgc2FtZSAgd29yZC0tIm1pbmUuIiBTcGFuaXNoIGFuZCBNYW5kYXJpbiB1c2UsICJJLiIgTWluZSBpcyBhIHBvc3Nlc3NpdmUgcHJvbm91biB3aGlsZSBJIGlzIGEgcGVyc29uYWwgcHJvbm91bi4gRW5nbGlzaC1zcGVha2luZyBjaGlsZHJlbiBoYXZlIHRoZSBoaWdoZXN0IGZyZXF1ZW5jeSB3aXRoIG92ZXIgMjAwIGluc3RhbmNlcy5UaGlzIGhpZ2ggZnJlcXVlbmN5IG1pZ2h0IHN1Z2dlc3QgYSB0ZW5kZW5jeSBmb3IgRW5nbGlzaC1zcGVha2luZyBDaGlsZHJlbiB0byBmcmVxdWVudGx5IGRpc2N1c3MgdGhlaXIgcG9zc2Vzc2lvbnMgYW5kIHBlcnNvbmFsIGFmZmlsaWF0aW9ucy4gSG93ZXZlciwgc3VjaCBhbiBpbnRlcnByZXRhdGlvbiBjb3VsZCBtaXN0YWtlbmx5IHBhaW50IHRoZW0gYXMgbW9yZSBzZWxmLWNlbnRlcmVkLiBUaGlzIGFzc3VtcHRpb24gbGFja3MgYSBiYXNpcywgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGF0IEl0YWxpYW4gaXMgYSBwcm8tZHJvcCBsYW5ndWFnZSwgYW5kIGFsbCB0aGUgY2hpbGRyZW4sIHJlZ2FyZGxlc3Mgb2YgbGFuZ3VhZ2UsIHByaW1hcmlseSB1c2UgdGhlIGZpcnN0IHBlcnNvbi4NCg0KDQpJbiBsYXRlciB5ZWFycywgdGhlIHBhdHRlcm4gcmVtYWlucy4gRW5nbGlzaC1zcGVha2VycyB1c2UgZmlyc3QgcGVyc29uIHByb25vdW5zIHRoZSBtb3N0LCBmb2xsb3dlZCBieSBTcGFuaXNoLXNwZWFrZXJzLiBBdCAzMCBtb250aHMgb2xkLCBLb3JlYW4gc3BlYWtlcnMgYXJlIHVzaW5nIGZpcnN0IHBlcnNvbiBwcm9ub3VucywgYnV0IHRoZXkgdXNlIGl0IHRoZSBsZWFzdC4gQmVzaWRlcyB0aGF0LCB0aGUgb25seSBvdGhlciB3b3JkIGNoYW5nZSBpcyBmb3IgU3BhbmlzaC4gVGhlIG1vc3QgY29tbW9uIHByb25vdW4gdXNlZCBpcyBub3cgIm3DrW8iIGluc3RlYWQgb2YgInlvLCIgam9pbmluZyBFbmdsaXNoIGFuZCBJdGFsaWFuIGluIHRoZSBwb3NzZXNzaXZlIHByb25vdW4uDQoNCg0KDQoNCg0KIyMjICoqQ29uY2x1c2lvbioqDQpUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBwcm8tZHJvcCBhbmQgbm9uLXByby1kcm9wIGxhbmd1YWdlcyBkb2Vzbid0IGFwcGVhciB0byBpbXBhY3QgdGhlIGFnZSBvZiBhY3F1aXNpdGlvbi4gVGhlcmVmb3JlLCBldmVuIGlmIGNoaWxkcmVuIGluIHByby1kcm9wIGxhbmd1YWdlcyBkb24ndCBmcmVxdWVudGx5IHVzZSBpdCwgdGhleSBzdGlsbCBsZWFybiBpdCBhdCBhIHNpbWlsYXIgYWdlLiBUaGlzIHN1Z2dlc3RzIHRoZSBleGlzdGVuY2Ugb2YgYSBzaGFyZWQgbmV1cm9sb2dpY2FsIHN0cnVjdHVyZSBpbiBhbGwgY2hpbGRyZW4gdGhhdCBwbGF5cyBhIHJvbGUgaW4gdGhpcyBwcm9jZXNzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgbmF0aXZlIGxhbmd1YWdlLiBVc2FnZSwgb24gdGhlIG90aGVyIGhhbmQsIG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IHRoZSBjdWx0dXJlIGFuZCBzb2NpZXR5IGluIHdoaWNoIHRoZSBjaGlsZHJlbiBhcmUgaW1tZXJzZWQuIEV2ZW4gYW1vbmcgcHJvLWRyb3AgbGFuZ3VhZ2VzLCB0aGVyZSBhcmUgc2lnbmlmaWNhbnQgdmFyaWF0aW9ucyBpbiB0aGUgcHJvZHVjdGlvbiBvZiBwcm9ub3Vucy4NCg0KDQoNCg0KDQoNCg0K