diff --git a/.DS_Store b/.DS_Store index 63d1620..f1a82d4 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 651ba6e..ef5beb7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea/* /.idea/* /.idea/trust_in_science.iml +node_modules/ diff --git a/README.md b/README.md index 2d54a0d..22eaea7 100644 --- a/README.md +++ b/README.md @@ -1 +1,116 @@ -# trust_in_science \ No newline at end of file +# VisTrust: a Multidimensional Framework and Empirical Study of Trust in Data Visualizations + +## Data Dictionary + +Data for the full study can be found in the [data_clean.csv](./study_data/full_Study/data_clean.csv) file. + +| Label of data column in [data_clean.csv](./study_data/full_Study/data_clean.csv) | Explanation of the contents of the data column | +| ---------------------------------------- | ---------------------------------------------- | +| Consent Form | Whether the participant agreed to the consent form (1 indicates a response of "I agree") | +| consent-time_Page Submit | The amount of time the participant took to agree or disagree to the consent form (in seconds) | +| covid-vaccine | Whether the participant has received a Covid-19 vaccine (1 indicates a response of "Yes") | +| covid-vaccine-doses | The number of vaccines the participant has received (if they answered "Yes" to the covid-vaccines question) | +| covid-infection | Whether the participant has been verifiably infected with Covid-19 (1 indicates a response of "Yes") | +| covid-time_Page Submit | The amount of time the participant took to answer the covid vaccine/infection questions (in seconds) | +| intro-vis-time_Page Submit | The amount of time the participant viewed the visualization during the intro (in seconds) | +| affect-science_1 | The participant's rating of the visualization as Scientific (on a scale from 0-Unscientific to 100-Scientific) | +| affect-clarity_1 | The participant's rating of the visualization as Clear (on a scale from 0-Confusing to 100-Clear) | +| affect-aesthetic_1 | The participant's rating of the visualization as Pretty (on a scale from 0-Ugly to 100-Pretty) | +| initial-time_Page Submit | The amount of time the participant took to answer the affect questions (in seconds) | +| tour-time_Page Submit | The amount of time the participant took to complete the guided tour of the visualization (in seconds) | +| simple-vlat-1 | The participant's answer to the first visual literacy question regarding the simple visualization | +| simple-vlat-2 | The participant's answer to the second visual literacy question regarding the simple visualization | +| simple-vlat-time_Page Submit | The amount of time the participant took to answer the visual literacy questions regarding the simple visualization | +| moderate-vlat-1 | The participant's answer to the first visual literacy question regarding the moderate visualization | +| moderate-vlat-2 | The participant's answer to the second visual literacy question regarding the moderate visualization | +| moderate-vlat-time_Page Submit | The amount of time the participant took to answer the visual literacy questions regarding the moderate visualization | +| complex-vlat-1 | The participant's answer to the visual literacy question regarding the complex visualization | +| complex-vlat-time_Page Submit | The amount of time the participant took to answer the visual literacy questions regarding the complex visualization | +| explore-time_Page Submit | The amount of time the participant took to explore the visualization during the designated explore section of the study | +| data-trust_1 | Participant's level of agreement with the statement "The data is accurate" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| data-trust_2 | Participant's level of agreement with the statement "The data is complete and does not leave out important information" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| data-trust_3 | Participant's level of agreement with the statement "The data is unbiased and trustworthy" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| data-trust_4 | Participant's level of agreement with the statement "I understand the meaning of this data well" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| data-trust_5 | Participant's level of agreement with the statement "The data source was clearly displayed" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| data-trust_6 | Participant's level of agreement with the statement "I trust this data" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| data-trust-exp | Additional comments the participant may have after completing the data trust section | +| data-trust-time_Page Submit | The amount of time the participant took to complete the data trust section | +| vis-trust_1 | Participant's level of agreement with the statement "The visualization transparently includes all important elements of the data" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| vis-trust_2 | Participant's level of agreement with the statement "I find it easy to understand this visualization" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| vis-trust_3 | Participant's level of agreement with the statement "I like this visualization" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| vis-trust_4 | Participant's level of agreement with the statement "I would likely share this visualization with my family, friends or on social media" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| vis-trust_5 | Participant's level of agreement with the statement "I would likely use this visualization and its information in my daily life" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| vis-trust_6 | Participant's level of agreement with the statement "I trust this visualization" (on a scale from 1-Strongly Disagree to 7-Strongly Agree) | +| vis-trust-exp | Additional comments the participant may have after completing the visualization trust section | +| vis-trust-time_Page Submit | The amount of time the participant took to complete the visualization trust section | +| interpersonal-trust_1 | Participant's answer to the statement "Generally speaking, would you say that most people can be trusted or that you can't be too careful in dealing with people?" (on a scale from 1-"Most people cannot be trusted" to 7-"Most people can be trusted") | +| interper-trust-exp | Additional comments the participant may have after completing the interpersonal trust question | +| interper-trust-time_Page Submit | The amount of time the participant took to complete the interpersonal trust section | +| attention-check_1 | The answer ranked in position 1 by the participant when answering the attention check question (Correct answer is 5) | +| attention-check_2 | The answer ranked in position 2 by the participant when answering the attention check question (Not relevant) | +| attention-check_3 | The answer ranked in position 3 by the participant when answering the attention check question (Not relevant) | +| attention-check_4 | The answer ranked in position 4 by the participant when answering the attention check question (Not relevant) | +| attention-check_5 | The answer ranked in position 5 by the participant when answering the attention check question (Not relevant) | +| attention-check_6 | The answer ranked in position 6 by the participant when answering the attention check question (Not relevant) | +| attention-check_7 | The answer ranked in position 7 by the participant when answering the attention check question (Not relevant) | +| attention-check-time_Page Submit | The amount of time the participant took to complete the attention check question | +| trust-in-science_1 | Participant's level of trust in political parties (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_2 | Participant's level of trust in the government (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_3 | Participant's level of trust in the police (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_4 | Participant's level of trust in the legal system (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_5 | Participant's level of trust in the news media (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_6 | Participant's level of trust in business and industry (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_7 | Participant's level of trust in scientists/science (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-in-science_8 | Participant's level of trust in doctors (on a scale from 0-"Do not trust at all" to 10-"Trust it completely") | +| trust-science-exp | Additional comments the participant may have after completing the trust in science section | +| trust-science-time_Page Submit | The amount of time the participant took to complete the trust in science section | +| cognition_1 | Participant's response to the statement "I would prefer complex to simple problems" (on a scale from 1-"extremely uncharacteristic of me" to 5-"extremely characteristic of me") | +| cognition_2 | Participant's response to the statement "I like to have the responsibility of handling a situation that requires a lot of thinking" (on a scale from 1-"extremely uncharacteristic of me" to 5-"extremely characteristic of me") | +| cognition_3 | Participant's response to the statement "Thinking is not my idea of fun" (on a scale from 1-"extremely uncharacteristic of me" to 5-"extremely characteristic of me") | +| cognition_4 | Participant's response to the statement "I would rather do something that requires little thought than something that is sure to challenge my thinking abilities" (on a scale from 1-"extremely uncharacteristic of me" to 5-"extremely characteristic of me") | +| cognition_5 | Participant's response to the statement "I really enjoy a task that involves coming up with new solutions to problems" (on a scale from 1-"extremely uncharacteristic of me" to 5-"extremely characteristic of me") | +| cognition_6 | Participant's response to the statement "I would prefer a task that is intellectual, difficult, and important to one that is somewhat important but does not require much thought" (on a scale from 1-"extremely uncharacteristic of me" to 5-"extremely characteristic of me") | +| need-cognition-time_Page Submit | The amount of time the participant took to complete the need for cognition section | +| political_views | Participant's identification of political beliefs (on a scale from 1-"extremely liberal" to 7-"extremely conservative", 8-"Do not know/Refused") | +| covid_information | How much the participant actively sought out information regarding Covid-19 (on a scale from 1-"Once a day" to 5-"Never") | +| politics_time_Page Submit | The amount of time the pariticipant took to complete the politics section | +| Gender | The gender of the participant (1-"Man", 2-"Woman", 3-"Non-binary/third gender", 4-"Other", 5-"Prefer not to disclose") | +| Age | The year the participant was born (in the format YYYY) | +| State_1 | The U.S. State the participant currently lives in | +| Education | The highest level of school / highest degree completed by the participant (1-"Maximum 12 grade no diploma", 2-"High school graduate", 3-"Some college but no degree", 4-"Associate degree in college - Occupational/vocational program", 5-"Associate degree in college - Academic Program", 6-"Bachelor's degree (For example: BA, AB, BS)", 7-"Master's degree (For example: MA, MS, MEng, MEd, MSW, MBA)", 8-"Professional school degree (For example: MD, DDS, DVM, LLB, JD)", 9-"Doctorate degree (For example: PhD, EdD)", 10-"Other") | +| Parents_education | Whether the pariticipant's parents have completed a bachelor's degree (1-"One", 2-"Both", 3-"None") | +| Language | The language spoken at the participant's home (1-"English", 2-"Spanish", 3-"Chinese", 4-"Other") | +| Language_4_TEXT | The language spoken at the participant's home if they answered "Other" to the previous question | +| Ethnicity | The participant's ethnicity (1-"American Indian or Alaska Native (For example, Navajo Nation, Blackfeet Tribe, Mayan, Aztec, Nome Eskimo Community, etc)", 2-"Asian (For example, Chinese, Filipino, Asian Indian, Vietnamese, Korean, Japanese, etc)", 3-"Black or African-American (For example, African American, Jamaican, Haitian, Nigerian, Ethiopian, Somalian, etc)", 4-"Hispanic, Latino/a, or Chicano/a (For example, Mexican or Mexican American, Puerto Rican, Cuban, Salvadoran, Colombian, etc)", 5-"Middle Eastern or North African (For example, Lebanese, Iranian, Egyptian, Syrian, Moroccan, Algerian, etc)", 6-"Native Hawaiian or Pacific Islander (For example, Native Hawaiian, Samoan, Chamorro, Tongan, Fijian, Marshallese, etc)", 7-"White (For example, German, Irish, English, Italian, Polish, French, etc)", 8-"Other race, ethnicity, or origin (please specify)", 9-"Mixed race, ethnicity (please specify)", 10-"Prefer not to disclose") | +| Ethnicity_8_TEXT | The participant's ethnicity if they answered "Other race, ethnicity, or origin" to the Ethnicity question | +| Ethnicity_9_TEXT | The participant's ethnicity if they answered "Mixed race, ethnicity" to the Ethnicity question | +| Income | The total family income of the participant's household (1-"None or less than $4,999", 2-"$5,000–$9,999", 3-"$10,000–$19,999", 4-"$20,000–29,999", 5-"$30,000–39,999", 6-"40,000–49,999", 7-"$50,000–59,999", 8-"90,000–99,999", 9-"$100,000–109,999", 10-"$110,000–119,999", 11-"$120,000–129,999", 12-"$130,000–139,999", 13-"$140,000–149,999", 14-"$150,000 and over", 15-"Do not know", 16-"Prefer not to disclose") | +| Religion | How religious the participant is (on a scale from 1-"Very religious" to 7-"Not religious at all", 8-"Prefer not to disclose") | +| demographics_time_Page Submit | The amount of time it took the participant's the complete the demographics section | +| provenance-data | An array of the participant's interactions with the visualization during the data trust section | +| provenance-vis | An array of the participant's interactions with the visualization during the vis trust section | +| provenance-tour | An array of the participant's interactions with the visualization during the guided tour section | +| provenance-explore | An array of the participant's interactions with the visualization during the explore section | +| isCovidData | Whether the participant was shown a visualization of Covid-19 data (1 indicates "Yes") | +| complexity | The visual complexity of the visualization shown to the participant (e.g., simple, moderate, complex) | +| chartType | The chart type of the visualization shown to the participant (e.g., bar, line) | +| need_for_cognition | Aggregate score for the participant based on their responses to the need for cognition section | +| brushed | Whether the participant used the brush filter (only applies for complex visualizations) | +| explore_interactions | Aggregated list of explore interactions for the participant | +| hover_interactions | Aggregated list of hover interactions for the participant | +| total_hover_time | The total amount of time the participant hovered over a visualization element | +| avg_hover_time | The average amount of time the participant hovered over a visualization element | +| explore_time | The total amount of time the participant spent exploring the visualization | +| explore_active_time | The amount of time the participant spent actively exploring the visualization | +| vlat_simple | Participant's overall score on the visual literacy test for the simple visualization | +| vlat_moderate | Participant's overall score on the visual literacy test for the moderate visualization | +| vlat_complex | Participant's overall score on the visual literacy test for the complex visualization | +| assigned_vlat | The visualization that was shown to the participant | +| ordinal_complexity | The visual complexity of the visualization shown to the participant (1-"simple", 2-"moderate", 3-"complex") | + +## Supplementary Materials + +Supplementary Materials for the VisTrust submission to IEEE VIS 2023 can be found in the *supplementary_materials* directory and include the following: + +- PDF of tables containing the full study results +- PDF of the full study presented to participants (exported from Qualtrics) \ No newline at end of file diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000..d313296 Binary files /dev/null and b/README.pdf differ diff --git a/data_testing.py b/data_testing.py deleted file mode 100644 index b3d286c..0000000 --- a/data_testing.py +++ /dev/null @@ -1,21 +0,0 @@ -import pandas as pd, os - -filenames = [ - 'full_Study/data_clean.csv', - 'pilot4/data.csv', - 'pilot3/pilot3.csv', - 'pilot2/Complexity vs. Trust in Vis_March 6, 2023_07.54.csv', - 'pilot1/Complexity vs. Trust in Vis_March 5, 2023_09.12.csv' -] - -dfs = [] - -full_df = pd.read_csv(os.path.join('study_data',filenames[0])) - -full_cols = set(full_df.columns.tolist()) - -for filename in filenames[1:]: - df = pd.read_csv(os.path.join('study_data',filename)) - df_cols = set(df.columns.tolist()) - print(len(df_cols), len(full_cols), len(df_cols.difference(full_cols))) - dfs.append(df) \ No newline at end of file diff --git a/study_data/.DS_Store b/study_data/.DS_Store index 6cf21fd..0617ec5 100644 Binary files a/study_data/.DS_Store and b/study_data/.DS_Store differ diff --git a/study_data/full_Study/.DS_Store b/study_data/full_Study/.DS_Store index c9fa694..20cd533 100644 Binary files a/study_data/full_Study/.DS_Store and b/study_data/full_Study/.DS_Store differ diff --git a/study_data/full_Study/affectMeasures.png b/study_data/full_Study/affectMeasures.png index fabc57b..03f1228 100644 Binary files a/study_data/full_Study/affectMeasures.png and b/study_data/full_Study/affectMeasures.png differ diff --git a/study_data/full_Study/complexity_dataType_interaction.pdf b/study_data/full_Study/complexity_dataType_interaction.pdf index 4febe40..22da269 100644 Binary files a/study_data/full_Study/complexity_dataType_interaction.pdf and b/study_data/full_Study/complexity_dataType_interaction.pdf differ diff --git a/study_data/full_Study/complexity_interaction.pdf b/study_data/full_Study/complexity_interaction.pdf index 701650e..dbdbead 100644 Binary files a/study_data/full_Study/complexity_interaction.pdf and b/study_data/full_Study/complexity_interaction.pdf differ diff --git a/study_data/full_Study/f7.pdf b/study_data/full_Study/f7.pdf index d905ef2..45ce917 100644 Binary files a/study_data/full_Study/f7.pdf and b/study_data/full_Study/f7.pdf differ diff --git a/study_data/full_Study/provenanceResults.png b/study_data/full_Study/provenanceResults.png index 3aaf42d..b47a346 100644 Binary files a/study_data/full_Study/provenanceResults.png and b/study_data/full_Study/provenanceResults.png differ diff --git a/study_data/full_Study/trustFullAnalysis_6.12.2023.Rmd b/study_data/full_Study/trustFullAnalysis_6.12.2023.Rmd index 171aab9..5b4eb4a 100644 --- a/study_data/full_Study/trustFullAnalysis_6.12.2023.Rmd +++ b/study_data/full_Study/trustFullAnalysis_6.12.2023.Rmd @@ -69,7 +69,7 @@ results %>% group_by(complexity, isCovidData) %>% summarize(n = n(), mean = mean(vis.trust_6), - se = sd(data.trust_6)/sqrt(n)), + se = sd(vis.trust_6)/sqrt(n)), aes(x = mean, xend = mean, y = -.25, yend = .25, colour = as.factor(isCovidData)), size = 1) + # stat_summary(fun.data = "mean_cl_boot", colour = "red", size = 0.5, position = position_nudge(x=0.25, y=0), alpha=0.5) + @@ -118,18 +118,27 @@ results %>% geom_jitter(data = results, width = 0.25, height = 0.2, color = "light gray", alpha = 0.5) + geom_boxplot(lwd = 1, fatten = NULL, width = 0.25, alpha = 0.5, color = "salmon") + # labs(title = "Trust in data") + - geom_vline(data = results %>% + + + geom_segment(data = results %>% group_by(complexity) %>% summarize(n = n(), - data.trust_6 = mean(data.trust_6)), - aes(xintercept = data.trust_6), size = 1,colour = "salmon") + + mean = mean(data.trust_6), + se = sd(data.trust_6)/sqrt(n)), + aes(x = mean, xend = mean, y = -.25, yend = .25, colour ="salmon"), size = 1) + + + geom_text( data = results %>% group_by(complexity) %>% summarize(n = n(), mean = round(mean(data.trust_6),digits=2), se = round(sd(data.trust_6)/sqrt(n),digits=2), - vis.trust_6 = mean(vis.trust_6)), - aes(label = paste(mean, "[",mean-se,",",mean+se,"]"), x = 6.8, y = 0.43, fontface = 3), size=3, colour = "black")+ + dadta.trust_6 = mean(data.trust_6)), + # aes(label = paste(mean, "[",mean-se,",",mean+se,"]"), x = 6.2, y = 0.43, fontface = 3), size=3, colour = "black")+ + aes(label = paste(mean), x = mean, y = .35, fontface = 3), size=4, colour = "black")+ + + + facet_grid(rows = vars(complexity)) + xlab("Trust in Data") + theme_minimal() + @@ -146,21 +155,56 @@ ggsave(paste("complexity_interaction.pdf", sep="")) ```{r} results %>% + filter(isCovidData ==0 ) %>% group_by(complexity) %>% summarize(n = n(), - mean = mean(data.trust_6), - se = sd(data.trust_6)/sqrt(n), + mean = mean(vis.trust_6), + se = sd(vis.trust_6)/sqrt(n), n = n) ``` +```{r} +model <- lm(formula = vis.trust_6 ~ complexity * chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , + data = results%>%filter(isCovidData == 1) + filter(isCovidData ==1 )) +anova(model) +``` +```{r} +model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) + chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , + data = results%>% filter(complexity !='moderatex')) +anova(model) + + +``` + + +```{r} +model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) + chartType + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , + data = results) +anova(model) + + +``` + + Linear Regression Model for trust in vis as a function of ```{r} -model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) * chartType - + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , +model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) * chartType + Age + Gender + State_1 + Income + Education + Parents_education + Language + Ethnicity + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , data = results) anova(model) +``` +```{r} +# can change the predictor to bar.vis +model<- manova(cbind(vis.trust_6, + vis.trust_5, + vis.trust_4, + vis.trust_3, + vis.trust_2, + vis.trust_1) ~ complexity * chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , + data = results %>%filter(isCovidData == 1)) +summary.aov(model) ``` ```{r} @@ -174,14 +218,14 @@ eta_squared(aov(vis.trust_6 ~ complexity * as.factor(isCovidData) * chartType + ``` # Colinearity of trust in vis and trust in data ```{r} -colinearity_model <- lm(formula = trust.in.science_7 ~ affect.aesthetic_1 + affect.clarity_1 + affect.science_1 + vis.trust_1 + vis.trust_2 + vis.trust_3 + vis.trust_4 + vis.trust_5 + vis.trust_6 + data.trust_6 + data.trust_5 + data.trust_4 + data.trust_3 + data.trust_2 + data.trust_1, +colinearity_model <- lm(formula = Age ~ vis.trust_1 + vis.trust_2 + vis.trust_3 + affect.science_1 + affect.clarity_1 + affect.aesthetic_1 + vis.trust_6 + data.trust_1 + data.trust_2 + data.trust_3 + data.trust_4 + data.trust_5 + data.trust_6 + interpersonal.trust_1 + trust.in.science_7 + need_for_cognition, data = results) vif(colinearity_model) ``` vif(colinearity_model)relation of trust in vis and trust in data ```{r} -data_frame = data.frame(results$vis.trust_1, results$vis.trust_2, results$vis.trust_3, results$vis.trust_4, results$vis.trust_5, results$vis.trust_6, results$data.trust_1, results$data.trust_2, results$data.trust_3, results$data.trust_4, results$data.trust_5, results$data.trust_6) +data_frame = data.frame(results$vis.trust_1, results$vis.trust_2, results$vis.trust_3, results$affect.science_1, results$affect.clarity_1, results$affect.aesthetic_1, results$vis.trust_6, results$data.trust_1, results$data.trust_2, results$data.trust_3, results$data.trust_4, results$data.trust_5, results$data.trust_6, results$interpersonal.trust_1, results$trust.in.science_7, results$need_for_cognition) cor(data_frame) ``` @@ -229,9 +273,9 @@ results %>% ``` ```{r} -model <- lm(formula = data.trust_6 ~ complexity * as.factor(isCovidData) * chartType +model <- lm(formula = data.trust_6 ~ complexity * chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 , - data = results) + data = results%>% filter(isCovidData == 0)) anova(model) @@ -435,7 +479,7 @@ results %>% How does performance on VLAT questions predict trust? ```{r} -model <- lm(formula = vis.trust_6 ~ vlat_simple * vlat_moderate * vlat_complex + +model <- lm(formula = vis.trust_6 ~ assigned_vlat * Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1, diff --git a/study_data/full_Study/trustFullAnalysis_6.12.2023.nb.html b/study_data/full_Study/trustFullAnalysis_6.12.2023.nb.html index fd9b5c7..65d7356 100644 --- a/study_data/full_Study/trustFullAnalysis_6.12.2023.nb.html +++ b/study_data/full_Study/trustFullAnalysis_6.12.2023.nb.html @@ -1754,73 +1754,8 @@
Loading required package: tidyverse
-── Attaching core tidyverse packages ─────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
-✔ dplyr 1.1.0 ✔ readr 2.1.4
-✔ forcats 1.0.0 ✔ stringr 1.5.0
-✔ ggplot2 3.4.1 ✔ tibble 3.2.0
-✔ lubridate 1.9.2 ✔ tidyr 1.3.0
-✔ purrr 1.0.1 ── Conflicts ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
-✖ dplyr::filter() masks stats::filter()
-✖ dplyr::lag() masks stats::lag()
-ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
-Attaching package: ‘psych’
-
-The following objects are masked from ‘package:ggplot2’:
-
- %+%, alpha
-
-Loading required package: carData
-
-Attaching package: ‘car’
-
-The following object is masked from ‘package:psych’:
-
- logit
-
-The following object is masked from ‘package:dplyr’:
-
- recode
-
-The following object is masked from ‘package:purrr’:
-
- some
-
-Loading required package: Matrix
-
-Attaching package: ‘Matrix’
-
-The following objects are masked from ‘package:tidyr’:
-
- expand, pack, unpack
-
-
-Attaching package: ‘rstatix’
-
-The following object is masked from ‘package:stats’:
-
- filter
-
-
-Attaching package: ‘effectsize’
-
-The following objects are masked from ‘package:rstatix’:
-
- cohens_d, eta_squared
-
-The following object is masked from ‘package:psych’:
-
- phi
-
-
-Attaching package: ‘GPArotation’
-
-The following objects are masked from ‘package:psych’:
-
- equamax, varimin
-
-Warning: namespace ‘ez’ is not available and has been replaced
+
+Warning: namespace ‘ez’ is not available and has been replaced
by .GlobalEnv when processing object ‘anova_result’
@@ -1861,7 +1796,7 @@ Trust in Science Analysis Notebook
-
+
MinMeanSEMMax <- function(x) {
v <- c(min(x), mean(x) - sd(x)/sqrt(length(x)), mean(x), mean(x) + sd(x)/sqrt(length(x)), max(x))
@@ -1883,7 +1818,7 @@ Trust in Science Analysis Notebook
group_by(complexity, isCovidData) %>%
summarize(n = n(),
mean = mean(vis.trust_6),
- se = sd(data.trust_6)/sqrt(n)),
+ se = sd(vis.trust_6)/sqrt(n)),
aes(x = mean, xend = mean, y = -.25, yend = .25, colour = as.factor(isCovidData)), size = 1) +
# stat_summary(fun.data = "mean_cl_boot", colour = "red", size = 0.5, position = position_nudge(x=0.25, y=0), alpha=0.5) +
@@ -1903,13 +1838,20 @@ Trust in Science Analysis Notebook
legend.position = "none",
axis.text.y = element_blank(),
axis.title.y = element_blank(),
- axis.ticks.y = element_blank())
-
-
-
-ggsave(paste("complexity_dataType_interaction.pdf", sep=""))
-
+ axis.ticks.y = element_blank())
+
+
+`summarise()` has grouped output by 'complexity'. You can override using the `.groups` argument.`summarise()` has grouped output by 'complexity'. You can override using the `.groups` argument.
+
+
+ggsave(paste("complexity_dataType_interaction.pdf", sep=""))
+
+Saving 7.29 x 4.51 in image
+
+
+
+
@@ -1922,11 +1864,21 @@ `summarise()` has grouped output by 'complexity'. You can override using the `.groups` argument.
+
+
+# results$isCovidData <- factor(results$isCovidData, levels = c(0, 1),
# labels = c("Crop Data", "Covid Data"))
@@ -1937,18 +1889,27 @@ Trust in Science Analysis Notebook
geom_jitter(data = results, width = 0.25, height = 0.2, color = "light gray", alpha = 0.5) +
geom_boxplot(lwd = 1, fatten = NULL, width = 0.25, alpha = 0.5, color = "salmon") +
# labs(title = "Trust in data") +
- geom_vline(data = results %>%
+
+
+ geom_segment(data = results %>%
group_by(complexity) %>%
summarize(n = n(),
- data.trust_6 = mean(data.trust_6)),
- aes(xintercept = data.trust_6), size = 1,colour = "salmon") +
+ mean = mean(data.trust_6),
+ se = sd(data.trust_6)/sqrt(n)),
+ aes(x = mean, xend = mean, y = -.25, yend = .25, colour ="salmon"), size = 1) +
+
+
geom_text( data = results %>%
group_by(complexity) %>%
summarize(n = n(),
mean = round(mean(data.trust_6),digits=2),
se = round(sd(data.trust_6)/sqrt(n),digits=2),
- vis.trust_6 = mean(vis.trust_6)),
- aes(label = paste(mean, "[",mean-se,",",mean+se,"]"), x = 6.8, y = 0.43, fontface = 3), size=3, colour = "black")+
+ dadta.trust_6 = mean(data.trust_6)),
+ # aes(label = paste(mean, "[",mean-se,",",mean+se,"]"), x = 6.2, y = 0.43, fontface = 3), size=3, colour = "black")+
+ aes(label = paste(mean), x = mean, y = .35, fontface = 3), size=4, colour = "black")+
+
+
+
facet_grid(rows = vars(complexity)) +
xlab("Trust in Data") +
theme_minimal() +
@@ -1958,33 +1919,285 @@ Trust in Science Analysis Notebook
axis.title.y = element_blank(),
axis.ticks.y = element_blank())
-ggsave(paste("complexity_interaction.pdf", sep=""))
-
+ggsave(paste("complexity_interaction.pdf", sep=""))
+
+Saving 7.29 x 4.51 in image
+
+
+
+
-
+
results %>%
+ filter(isCovidData ==0 ) %>%
group_by(complexity) %>%
summarize(n = n(),
- mean = mean(data.trust_6),
- se = sd(data.trust_6)/sqrt(n),
+ mean = mean(vis.trust_6),
+ se = sd(vis.trust_6)/sqrt(n),
n = n)
+
+model <- lm(formula = vis.trust_6 ~ complexity * chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
+ data = results%>%filter(isCovidData == 1)
+ filter(isCovidData ==1 ))
+
+
+Error: unexpected symbol in:
+" data = results%>%filter(isCovidData == 1)
+ filter"
+
+
+
+
+model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) + chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
+ data = results%>% filter(complexity !='moderate'))
+anova(model)
+
+
+Analysis of Variance Table
+
+Response: vis.trust_6
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 1 3.65 3.652 2.8909 0.090261 .
+as.factor(isCovidData) 1 0.23 0.227 0.1795 0.672144
+chartType 1 1.19 1.189 0.9414 0.332810
+Age 1 5.32 5.317 4.2082 0.041219 *
+Gender 2 6.04 3.022 2.3917 0.093460 .
+State_1 42 95.82 2.282 1.8059 0.003007 **
+Education 8 12.17 1.521 1.2038 0.296826
+Parents_education 2 0.30 0.149 0.1182 0.888523
+Language 3 4.19 1.395 1.1043 0.347861
+Ethnicity 7 9.78 1.396 1.1053 0.359993
+Income 18 25.04 1.391 1.1010 0.351114
+Religion 4 10.79 2.699 2.1361 0.076715 .
+trust.in.science_7 1 77.24 77.236 61.1342 1.291e-13 ***
+need_for_cognition 1 4.73 4.726 3.7406 0.054177 .
+interpersonal.trust_1 1 1.17 1.170 0.9258 0.336843
+complexity:as.factor(isCovidData) 1 0.36 0.362 0.2863 0.593068
+Residuals 263 332.27 1.263
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+
+
+
+
+
+model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) + chartType + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
+ data = results)
+anova(model)
+
+
+Analysis of Variance Table
+
+Response: vis.trust_6
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 4.32 2.161 1.5759 0.20777
+as.factor(isCovidData) 1 2.48 2.480 1.8087 0.17923
+chartType 1 0.03 0.025 0.0185 0.89188
+trust.in.science_7 1 209.08 209.076 152.4880 < 2e-16 ***
+need_for_cognition 1 8.73 8.729 6.3664 0.01192 *
+interpersonal.trust_1 1 6.28 6.284 4.5831 0.03274 *
+complexity:as.factor(isCovidData) 2 5.26 2.629 1.9177 0.14795
+Residuals 539 739.02 1.371
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
Linear Regression Model for trust in vis as a function of
- -model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) * chartType
- + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
+
+model <- lm(formula = vis.trust_6 ~ complexity * as.factor(isCovidData) * chartType + Age + Gender + State_1 + Income + Education + Parents_education + Language + Ethnicity + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
data = results)
-anova(model)
-
+anova(model)
+
+Analysis of Variance Table
+
+Response: vis.trust_6
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 4.45 2.226 1.7237 0.179624
+as.factor(isCovidData) 1 2.74 2.736 2.1181 0.146282
+chartType 1 0.02 0.020 0.0153 0.901530
+Age 1 9.31 9.308 7.2072 0.007537 **
+Gender 3 7.63 2.544 1.9699 0.117759
+State_1 46 127.87 2.780 2.1523 4.266e-05 ***
+Income 18 36.70 2.039 1.5788 0.061567 .
+Education 9 27.94 3.105 2.4040 0.011443 *
+Parents_education 2 0.91 0.455 0.3526 0.703060
+Language 3 2.25 0.749 0.5797 0.628627
+Ethnicity 8 16.18 2.022 1.5659 0.132820
+Religion 4 14.44 3.610 2.7951 0.025844 *
+trust.in.science_7 1 138.52 138.515 107.2476 < 2.2e-16 ***
+need_for_cognition 1 6.54 6.541 5.0644 0.024919 *
+interpersonal.trust_1 1 6.90 6.900 5.3428 0.021273 *
+complexity:as.factor(isCovidData) 2 3.13 1.564 1.2108 0.298943
+complexity:chartType 2 3.36 1.680 1.3006 0.273429
+as.factor(isCovidData):chartType 1 0.64 0.639 0.4945 0.482305
+complexity:as.factor(isCovidData):chartType 2 0.35 0.175 0.1353 0.873503
+Residuals 437 564.41 1.292
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+
+
+
+# can change the predictor to bar.vis
+model<- manova(cbind(vis.trust_6,
+ vis.trust_5,
+ vis.trust_4,
+ vis.trust_3,
+ vis.trust_2,
+ vis.trust_1) ~ complexity * chartType + Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
+ data = results %>%filter(isCovidData == 1))
+summary.aov(model)
+
+
+ Response vis.trust_6 :
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 11.493 5.746 4.6180 0.011151 *
+chartType 1 0.021 0.021 0.0168 0.897075
+Age 1 6.963 6.963 5.5957 0.019138 *
+Gender 3 5.465 1.822 1.4639 0.226227
+State_1 44 138.867 3.156 2.5364 1.075e-05 ***
+Education 9 27.573 3.064 2.4621 0.011600 *
+Parents_education 2 7.254 3.627 2.9150 0.056936 .
+Language 3 5.740 1.913 1.5376 0.206617
+Ethnicity 8 29.014 3.627 2.9146 0.004517 **
+Income 18 39.852 2.214 1.7792 0.031312 *
+Religion 4 27.389 6.847 5.5028 0.000345 ***
+trust.in.science_7 1 94.704 94.704 76.1086 2.463e-15 ***
+need_for_cognition 1 0.249 0.249 0.2004 0.654956
+interpersonal.trust_1 1 7.605 7.605 6.1114 0.014421 *
+complexity:chartType 2 1.003 0.502 0.4032 0.668814
+Residuals 169 210.292 1.244
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+ Response vis.trust_5 :
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 30.29 15.146 5.1029 0.0070499 **
+chartType 1 2.06 2.057 0.6931 0.4062850
+Age 1 6.87 6.872 2.3153 0.1299766
+Gender 3 3.30 1.100 0.3706 0.7742962
+State_1 44 122.01 2.773 0.9342 0.5927361
+Education 9 30.20 3.356 1.1305 0.3438199
+Parents_education 2 21.91 10.955 3.6908 0.0269858 *
+Language 3 4.89 1.631 0.5494 0.6491861
+Ethnicity 8 26.48 3.310 1.1150 0.3554987
+Income 18 75.86 4.214 1.4198 0.1276477
+Religion 4 15.18 3.794 1.2783 0.2805024
+trust.in.science_7 1 40.05 40.055 13.4946 0.0003208 ***
+need_for_cognition 1 9.52 9.516 3.2059 0.0751611 .
+interpersonal.trust_1 1 0.86 0.862 0.2904 0.5906510
+complexity:chartType 2 3.42 1.709 0.5757 0.5634154
+Residuals 169 501.62 2.968
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+ Response vis.trust_4 :
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 18.79 9.393 2.8811 0.05883 .
+chartType 1 0.01 0.008 0.0026 0.95962
+Age 1 1.23 1.230 0.3774 0.53982
+Gender 3 3.55 1.183 0.3629 0.77986
+State_1 44 144.29 3.279 1.0058 0.47167
+Education 9 36.19 4.021 1.2333 0.27773
+Parents_education 2 14.48 7.242 2.2211 0.11165
+Language 3 1.42 0.473 0.1452 0.93266
+Ethnicity 8 40.47 5.059 1.5516 0.14299
+Income 18 66.24 3.680 1.1288 0.32848
+Religion 4 25.68 6.421 1.9695 0.10138
+trust.in.science_7 1 73.52 73.520 22.5499 4.347e-06 ***
+need_for_cognition 1 17.75 17.748 5.4435 0.02082 *
+interpersonal.trust_1 1 0.54 0.542 0.1664 0.68386
+complexity:chartType 2 5.59 2.793 0.8567 0.42640
+Residuals 169 550.99 3.260
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+ Response vis.trust_3 :
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 19.559 9.7794 5.2355 0.0062214 **
+chartType 1 1.574 1.5745 0.8429 0.3598694
+Age 1 2.247 2.2467 1.2028 0.2743263
+Gender 3 12.010 4.0033 2.1432 0.0966560 .
+State_1 44 118.874 2.7017 1.4464 0.0506440 .
+Education 9 24.871 2.7635 1.4795 0.1590611
+Parents_education 2 14.778 7.3889 3.9558 0.0209426 *
+Language 3 0.228 0.0759 0.0406 0.9890404
+Ethnicity 8 9.536 1.1920 0.6381 0.7448722
+Income 18 33.244 1.8469 0.9888 0.4750210
+Religion 4 14.803 3.7006 1.9812 0.0995774 .
+trust.in.science_7 1 26.452 26.4515 14.1612 0.0002312 ***
+need_for_cognition 1 3.476 3.4764 1.8611 0.1743091
+interpersonal.trust_1 1 4.961 4.9615 2.6562 0.1050099
+complexity:chartType 2 1.600 0.8000 0.4283 0.6523172
+Residuals 169 315.673 1.8679
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+ Response vis.trust_2 :
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 38.917 19.4584 13.2888 4.365e-06 ***
+chartType 1 4.965 4.9649 3.3907 0.06732 .
+Age 1 0.610 0.6097 0.4164 0.51962
+Gender 3 13.188 4.3961 3.0023 0.03206 *
+State_1 44 105.817 2.4049 1.6424 0.01352 *
+Education 9 7.175 0.7972 0.5444 0.84042
+Parents_education 2 7.305 3.6523 2.4943 0.08559 .
+Language 3 0.245 0.0816 0.0557 0.98264
+Ethnicity 8 14.155 1.7693 1.2083 0.29684
+Income 18 33.283 1.8491 1.2628 0.21827
+Religion 4 9.240 2.3100 1.5776 0.18250
+trust.in.science_7 1 5.291 5.2911 3.6135 0.05902 .
+need_for_cognition 1 3.732 3.7323 2.5489 0.11224
+interpersonal.trust_1 1 1.851 1.8509 1.2640 0.26248
+complexity:chartType 2 0.428 0.2141 0.1462 0.86406
+Residuals 169 247.462 1.4643
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+ Response vis.trust_1 :
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 5.55 2.774 1.4342 0.24120
+chartType 1 0.00 0.003 0.0013 0.97098
+Age 1 7.35 7.349 3.7990 0.05294 .
+Gender 3 6.91 2.302 1.1901 0.31516
+State_1 44 126.21 2.868 1.4828 0.04008 *
+Education 9 7.14 0.794 0.4104 0.92833
+Parents_education 2 4.62 2.312 1.1952 0.30519
+Language 3 2.86 0.953 0.4929 0.68769
+Ethnicity 8 16.68 2.085 1.0779 0.38093
+Income 18 34.76 1.931 0.9982 0.46434
+Religion 4 12.66 3.166 1.6366 0.16730
+trust.in.science_7 1 39.14 39.145 20.2362 1.268e-05 ***
+need_for_cognition 1 2.43 2.435 1.2586 0.26350
+interpersonal.trust_1 1 10.48 10.477 5.4160 0.02114 *
+complexity:chartType 2 1.76 0.878 0.4541 0.63577
+Residuals 169 326.91 1.934
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+2 observations deleted due to missingness
+
@@ -2004,18 +2217,24 @@ colinearity_model <- lm(formula = trust.in.science_7 ~ affect.aesthetic_1 + affect.clarity_1 + affect.science_1 + vis.trust_1 + vis.trust_2 + vis.trust_3 + vis.trust_4 + vis.trust_5 + vis.trust_6 + data.trust_6 + data.trust_5 + data.trust_4 + data.trust_3 + data.trust_2 + data.trust_1,
+
+colinearity_model <- lm(formula = Age ~ vis.trust_1 + vis.trust_2 + vis.trust_3 + affect.science_1 + affect.clarity_1 + affect.aesthetic_1 + vis.trust_6 + data.trust_1 + data.trust_2 + data.trust_3 + data.trust_4 + data.trust_5 + data.trust_6 + interpersonal.trust_1 + trust.in.science_7 + need_for_cognition,
data = results)
vif(colinearity_model)
+
+ vis.trust_1 vis.trust_2 vis.trust_3 affect.science_1 affect.clarity_1 affect.aesthetic_1 vis.trust_6 data.trust_1 data.trust_2
+ 2.203331 3.076587 2.611914 1.417935 1.562866 1.263335 3.161843 3.324068 2.300680
+ data.trust_3 data.trust_4 data.trust_5 data.trust_6 interpersonal.trust_1 trust.in.science_7 need_for_cognition
+ 2.229731 2.125802 1.689881 4.388363 1.149877 1.422811 1.117929
+
vif(colinearity_model)relation of trust in vis and trust in data
-
-data_frame = data.frame(results$vis.trust_1, results$vis.trust_2, results$vis.trust_3, results$vis.trust_4, results$vis.trust_5, results$vis.trust_6, results$data.trust_1, results$data.trust_2, results$data.trust_3, results$data.trust_4, results$data.trust_5, results$data.trust_6)
+
+data_frame = data.frame(results$vis.trust_1, results$vis.trust_2, results$vis.trust_3, results$affect.science_1, results$affect.clarity_1, results$affect.aesthetic_1, results$vis.trust_6, results$data.trust_1, results$data.trust_2, results$data.trust_3, results$data.trust_4, results$data.trust_5, results$data.trust_6, results$interpersonal.trust_1, results$trust.in.science_7, results$need_for_cognition)
cor(data_frame)
@@ -2068,13 +2287,36 @@ Trust in science, need for cognition, and interpersonal trust on
-
-model <- lm(formula = data.trust_6 ~ complexity * as.factor(isCovidData) * chartType
+
+model <- lm(formula = data.trust_6 ~ complexity * chartType
+ Age + Gender + State_1 + Education + Parents_education + Language + Ethnicity + Income + Religion + trust.in.science_7 + need_for_cognition + interpersonal.trust_1 ,
- data = results)
-anova(model)
-
+ data = results%>% filter(isCovidData == 1))
+anova(model)
+
+Analysis of Variance Table
+
+Response: data.trust_6
+ Df Sum Sq Mean Sq F value Pr(>F)
+complexity 2 3.497 1.749 1.3088 0.272876
+chartType 1 0.889 0.889 0.6653 0.415858
+Age 1 13.358 13.358 9.9976 0.001858 **
+Gender 3 6.582 2.194 1.6421 0.181552
+State_1 44 187.576 4.263 3.1907 4.012e-08 ***
+Education 9 26.902 2.989 2.2372 0.021915 *
+Parents_education 2 9.807 4.903 3.6700 0.027529 *
+Language 3 1.136 0.379 0.2835 0.837286
+Ethnicity 8 19.808 2.476 1.8532 0.070531 .
+Income 18 52.288 2.905 2.1742 0.005527 **
+Religion 4 25.772 6.443 4.8222 0.001044 **
+trust.in.science_7 1 153.507 153.507 114.8923 < 2.2e-16 ***
+need_for_cognition 1 0.377 0.377 0.2823 0.595918
+interpersonal.trust_1 1 8.065 8.065 6.0361 0.015026 *
+complexity:chartType 2 0.103 0.051 0.0384 0.962300
+Residuals 169 225.800 1.336
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
@@ -2206,6 +2448,137 @@ Do the trust items predict trust?
data = results)
summary(model)
+
+
+Call:
+lm(formula = vis.trust_6 ~ vis.trust_1 + vis.trust_2 + vis.trust_3 +
+ vis.trust_4 + vis.trust_5 + affect.science_1 + affect.clarity_1 +
+ affect.aesthetic_1 + Age + Gender + State_1 + Education +
+ Parents_education + Language + Ethnicity + Income + Religion +
+ trust.in.science_7 + need_for_cognition + interpersonal.trust_1,
+ data = results)
+
+Residuals:
+ Min 1Q Median 3Q Max
+-2.83565 -0.50664 0.01138 0.51001 2.58176
+
+Coefficients: (1 not defined because of singularities)
+ Estimate Std. Error t value Pr(>|t|)
+(Intercept) -11.568583 5.984157 -1.933 0.053853 .
+vis.trust_1 0.215786 0.038071 5.668 2.62e-08 ***
+vis.trust_2 0.150292 0.047905 3.137 0.001820 **
+vis.trust_3 0.188862 0.048434 3.899 0.000111 ***
+vis.trust_4 0.056337 0.034117 1.651 0.099392 .
+vis.trust_5 0.020632 0.033502 0.616 0.538318
+affect.science_1 0.006861 0.002558 2.682 0.007601 **
+affect.clarity_1 -0.000636 0.001958 -0.325 0.745437
+affect.aesthetic_1 -0.001043 0.002041 -0.511 0.609684
+Age 0.007716 0.002930 2.633 0.008758 **
+Gender2 0.086332 0.085376 1.011 0.312475
+Gender3 -0.545730 0.405884 -1.345 0.179464
+Gender5 -1.519986 1.377488 -1.103 0.270436
+State_1Alaska 1.322914 1.734212 0.763 0.445972
+State_1Arizona 0.121891 0.383528 0.318 0.750776
+State_1Arkansas -0.031368 0.531276 -0.059 0.952944
+State_1California -0.052693 0.268334 -0.196 0.844409
+State_1Colorado -0.162685 0.376532 -0.432 0.665908
+State_1Connecticut -0.319555 0.477459 -0.669 0.503665
+State_1Delaware 0.335401 0.691998 0.485 0.628141
+State_1Florida -0.267266 0.287427 -0.930 0.352956
+State_1Georgia -0.212548 0.304372 -0.698 0.485348
+State_1Hawaii -0.274540 0.601487 -0.456 0.648302
+State_1Illinois -0.392732 0.321003 -1.223 0.221813
+State_1Indiana -0.359962 0.397884 -0.905 0.366124
+State_1Iowa -0.343904 0.532551 -0.646 0.518767
+State_1Kansas -0.112709 0.421055 -0.268 0.789069
+State_1Kentucky -0.693997 0.390328 -1.778 0.076097 .
+State_1Louisiana -0.551437 0.445468 -1.238 0.216420
+State_1Maine 0.801057 0.583361 1.373 0.170397
+State_1Maryland -0.143161 0.344298 -0.416 0.677755
+State_1Massachusetts -0.111028 0.351510 -0.316 0.752258
+State_1Michigan -0.313457 0.330148 -0.949 0.342916
+State_1Minnesota -0.376869 0.476941 -0.790 0.429848
+State_1Mississippi -1.239929 0.519474 -2.387 0.017413 *
+State_1Missouri -0.818462 0.389421 -2.102 0.036144 *
+State_1Montana 0.049043 0.707315 0.069 0.944754
+State_1Nebraska -0.047164 0.585113 -0.081 0.935791
+State_1Nevada -1.201963 0.507768 -2.367 0.018358 *
+State_1New Hampshire -1.584564 0.947064 -1.673 0.095012 .
+State_1New Jersey -0.114745 0.409673 -0.280 0.779541
+State_1New York 0.100077 0.297830 0.336 0.737016
+State_1North Carolina -0.237599 0.317988 -0.747 0.455345
+State_1Ohio -0.205485 0.338339 -0.607 0.543941
+State_1Oklahoma 0.042281 0.455457 0.093 0.926079
+State_1Oregon -0.426634 0.410003 -1.041 0.298650
+State_1Pennsylvania -0.233936 0.296140 -0.790 0.429981
+State_1Rhode Island -0.488928 0.590033 -0.829 0.407755
+State_1South Carolina -0.507633 0.477715 -1.063 0.288534
+State_1South Dakota -2.119380 0.964038 -2.198 0.028438 *
+State_1Tennessee -0.407836 0.361310 -1.129 0.259610
+State_1Texas -0.391497 0.286211 -1.368 0.172054
+State_1Utah -0.430443 0.446138 -0.965 0.335165
+State_1Vermont -1.340000 0.693503 -1.932 0.053974 .
+State_1Virginia -0.404289 0.406598 -0.994 0.320614
+State_1Washington 0.158682 0.321748 0.493 0.622127
+State_1West Virginia -0.452496 0.578523 -0.782 0.434542
+State_1Wisconsin -0.183009 0.327284 -0.559 0.576327
+State_1Wyoming -0.378580 0.959063 -0.395 0.693226
+Education2 -0.293617 0.395770 -0.742 0.458550
+Education3 -0.477211 0.384007 -1.243 0.214635
+Education4 -0.569974 0.410837 -1.387 0.166038
+Education5 -0.424505 0.415909 -1.021 0.307972
+Education6 -0.662040 0.377600 -1.753 0.080249 .
+Education7 -0.413820 0.390888 -1.059 0.290333
+Education8 -0.174992 0.464790 -0.376 0.706729
+Education9 -0.047943 0.632478 -0.076 0.939612
+Education10 -3.043541 0.998056 -3.049 0.002431 **
+Parents_education2 0.030904 0.104267 0.296 0.767069
+Parents_education3 -0.012182 0.117568 -0.104 0.917520
+Language2 -0.105108 0.529395 -0.199 0.842711
+Language3 0.334894 0.512609 0.653 0.513896
+Language4 -0.865349 0.857233 -1.009 0.313305
+Ethnicity2 -1.889884 1.029641 -1.835 0.067110 .
+Ethnicity3 -1.646928 1.012601 -1.626 0.104574
+Ethnicity4 -1.638000 1.045092 -1.567 0.117757
+Ethnicity5 -0.808707 1.195565 -0.676 0.499128
+Ethnicity6 -0.345946 1.369488 -0.253 0.800687
+Ethnicity7 -1.825416 1.010992 -1.806 0.071669 .
+Ethnicity8 -1.621890 1.019411 -1.591 0.112326
+Ethnicity9 -1.733401 1.014518 -1.709 0.088231 .
+Ethnicity10 NA NA NA NA
+Income2 -0.863563 0.425063 -2.032 0.042793 *
+Income3 -0.847871 0.350137 -2.422 0.015858 *
+Income4 -0.979911 0.333680 -2.937 0.003492 **
+Income5 -0.777323 0.336630 -2.309 0.021399 *
+Income6 -0.930965 0.335217 -2.777 0.005717 **
+Income7 -0.834286 0.338312 -2.466 0.014042 *
+Income8 -0.571733 0.355942 -1.606 0.108936
+Income9 -0.913670 0.353118 -2.587 0.009989 **
+Income10 -0.594093 0.357703 -1.661 0.097454 .
+Income11 -1.063443 0.355617 -2.990 0.002942 **
+Income12 -0.929792 0.367972 -2.527 0.011860 *
+Income13 -0.950678 0.377698 -2.517 0.012189 *
+Income14 -1.177312 0.352011 -3.345 0.000895 ***
+Income15 -0.589763 0.474481 -1.243 0.214543
+Income16 -1.139667 0.369668 -3.083 0.002179 **
+Income17 -0.838200 0.340184 -2.464 0.014122 *
+Income18 -1.494424 0.721342 -2.072 0.038873 *
+Income19 -1.057261 0.400257 -2.641 0.008549 **
+Religion2 -0.118556 0.189118 -0.627 0.531056
+Religion3 -0.197893 0.186632 -1.060 0.289570
+Religion4 -0.036543 0.180259 -0.203 0.839444
+Religion5 0.032519 0.404114 0.080 0.935901
+trust.in.science_7 0.161617 0.022364 7.227 2.20e-12 ***
+need_for_cognition -0.046815 0.071523 -0.655 0.513109
+interpersonal.trust_1 0.055705 0.033848 1.646 0.100526
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+Residual standard error: 0.8806 on 440 degrees of freedom
+ (3 observations deleted due to missingness)
+Multiple R-squared: 0.6498, Adjusted R-squared: 0.5662
+F-statistic: 7.776 on 105 and 440 DF, p-value: < 2.2e-16
+
@@ -2222,6 +2595,133 @@ Do the trust items predict trust?
data = results)
summary(model)
+
+
+Call:
+lm(formula = data.trust_6 ~ data.trust_1 + data.trust_2 + data.trust_3 +
+ data.trust_4 + data.trust_5 + Age + Gender + State_1 + Education +
+ Parents_education + Language + Ethnicity + Income + Religion +
+ trust.in.science_7 + need_for_cognition + interpersonal.trust_1,
+ data = results)
+
+Residuals:
+ Min 1Q Median 3Q Max
+-2.2352 -0.3538 0.0000 0.4104 2.2492
+
+Coefficients: (1 not defined because of singularities)
+ Estimate Std. Error t value Pr(>|t|)
+(Intercept) -1.316e+01 5.014e+00 -2.623 0.009005 **
+data.trust_1 5.598e-01 4.243e-02 13.194 < 2e-16 ***
+data.trust_2 1.124e-01 3.145e-02 3.573 0.000392 ***
+data.trust_3 1.875e-01 3.387e-02 5.535 5.33e-08 ***
+data.trust_4 1.912e-02 3.519e-02 0.543 0.587117
+data.trust_5 6.567e-02 3.099e-02 2.119 0.034662 *
+Age 6.111e-03 2.460e-03 2.485 0.013339 *
+Gender2 -3.429e-02 7.182e-02 -0.477 0.633319
+Gender3 -6.200e-01 3.463e-01 -1.791 0.074037 .
+Gender5 2.591e-01 1.164e+00 0.222 0.824036
+State_1Alaska 2.958e-01 1.446e+00 0.205 0.838027
+State_1Arizona -2.353e-01 3.235e-01 -0.727 0.467429
+State_1Arkansas 3.650e-02 4.519e-01 0.081 0.935655
+State_1California -2.765e-01 2.268e-01 -1.219 0.223556
+State_1Colorado -1.135e-01 3.185e-01 -0.357 0.721633
+State_1Connecticut -2.469e-01 4.076e-01 -0.606 0.545041
+State_1Delaware -3.506e-02 5.847e-01 -0.060 0.952203
+State_1Florida 3.851e-03 2.433e-01 0.016 0.987376
+State_1Georgia -2.070e-02 2.573e-01 -0.080 0.935920
+State_1Hawaii -1.198e-01 5.066e-01 -0.236 0.813221
+State_1Illinois -2.293e-01 2.744e-01 -0.835 0.403907
+State_1Indiana -9.702e-01 3.353e-01 -2.894 0.003993 **
+State_1Iowa -2.097e-01 4.502e-01 -0.466 0.641602
+State_1Kansas -1.939e-01 3.543e-01 -0.547 0.584541
+State_1Kentucky -2.129e-01 3.305e-01 -0.644 0.519800
+State_1Louisiana -4.327e-01 3.758e-01 -1.151 0.250216
+State_1Maine -9.343e-04 4.892e-01 -0.002 0.998477
+State_1Maryland 6.313e-02 2.910e-01 0.217 0.828371
+State_1Massachusetts -1.000e-02 2.966e-01 -0.034 0.973111
+State_1Michigan -1.170e-01 2.784e-01 -0.420 0.674586
+State_1Minnesota -1.259e-02 4.022e-01 -0.031 0.975048
+State_1Mississippi -8.418e-01 4.401e-01 -1.913 0.056430 .
+State_1Missouri -2.860e-01 3.271e-01 -0.874 0.382468
+State_1Montana -3.628e-01 5.914e-01 -0.613 0.539903
+State_1Nebraska -1.390e-02 4.931e-01 -0.028 0.977530
+State_1Nevada -5.972e-02 4.258e-01 -0.140 0.888509
+State_1New Hampshire 8.429e-02 7.988e-01 0.106 0.916012
+State_1New Jersey -4.443e-01 3.448e-01 -1.289 0.198243
+State_1New York -2.169e-02 2.528e-01 -0.086 0.931673
+State_1North Carolina 3.833e-02 2.667e-01 0.144 0.885784
+State_1Ohio -3.252e-02 2.841e-01 -0.114 0.908943
+State_1Oklahoma 3.489e-01 3.843e-01 0.908 0.364442
+State_1Oregon 1.630e-01 3.457e-01 0.471 0.637568
+State_1Pennsylvania -1.478e-01 2.489e-01 -0.594 0.552877
+State_1Rhode Island -4.683e-01 4.941e-01 -0.948 0.343804
+State_1South Carolina -2.846e-01 4.037e-01 -0.705 0.481187
+State_1South Dakota -2.177e+00 8.041e-01 -2.707 0.007051 **
+State_1Tennessee -5.759e-01 3.043e-01 -1.893 0.059033 .
+State_1Texas -2.713e-01 2.417e-01 -1.123 0.262213
+State_1Utah -1.505e-01 3.770e-01 -0.399 0.689941
+State_1Vermont 3.256e-02 5.842e-01 0.056 0.955578
+State_1Virginia 1.386e-01 3.438e-01 0.403 0.686999
+State_1Washington -1.624e-01 2.694e-01 -0.603 0.546903
+State_1West Virginia -2.660e-01 4.864e-01 -0.547 0.584694
+State_1Wisconsin 1.575e-02 2.755e-01 0.057 0.954439
+State_1Wyoming -8.592e-02 8.082e-01 -0.106 0.915383
+Education2 1.740e-01 3.308e-01 0.526 0.599145
+Education3 1.638e-01 3.213e-01 0.510 0.610480
+Education4 3.578e-01 3.436e-01 1.041 0.298215
+Education5 4.338e-01 3.504e-01 1.238 0.216359
+Education6 1.346e-01 3.159e-01 0.426 0.670237
+Education7 1.471e-01 3.283e-01 0.448 0.654383
+Education8 6.090e-01 3.919e-01 1.554 0.120852
+Education9 -8.566e-01 5.304e-01 -1.615 0.107015
+Education10 7.685e-02 8.248e-01 0.093 0.925809
+Parents_education2 3.662e-02 8.801e-02 0.416 0.677566
+Parents_education3 4.423e-03 9.821e-02 0.045 0.964097
+Language2 3.625e-01 4.464e-01 0.812 0.417253
+Language3 2.926e-01 4.337e-01 0.675 0.500217
+Language4 5.497e-01 7.222e-01 0.761 0.446967
+Ethnicity2 -1.413e-01 8.710e-01 -0.162 0.871231
+Ethnicity3 -6.553e-02 8.571e-01 -0.076 0.939095
+Ethnicity4 -1.685e-01 8.846e-01 -0.190 0.849045
+Ethnicity5 -3.473e-01 1.008e+00 -0.345 0.730541
+Ethnicity6 1.352e+00 1.149e+00 1.176 0.240098
+Ethnicity7 -1.305e-01 8.561e-01 -0.152 0.878884
+Ethnicity8 -4.033e-01 8.620e-01 -0.468 0.640066
+Ethnicity9 -6.418e-02 8.591e-01 -0.075 0.940487
+Ethnicity10 NA NA NA NA
+Income2 1.390e-01 3.571e-01 0.389 0.697266
+Income3 1.915e-01 2.922e-01 0.655 0.512637
+Income4 2.520e-01 2.806e-01 0.898 0.369530
+Income5 2.478e-01 2.819e-01 0.879 0.379910
+Income6 2.070e-01 2.816e-01 0.735 0.462661
+Income7 3.353e-01 2.826e-01 1.186 0.236205
+Income8 3.153e-01 2.976e-01 1.059 0.290062
+Income9 3.141e-01 2.950e-01 1.065 0.287521
+Income10 4.680e-01 2.997e-01 1.562 0.119034
+Income11 3.063e-01 2.966e-01 1.033 0.302300
+Income12 2.137e-01 3.097e-01 0.690 0.490494
+Income13 1.122e-01 3.176e-01 0.353 0.723933
+Income14 2.085e-01 2.960e-01 0.704 0.481544
+Income15 5.904e-01 3.992e-01 1.479 0.139880
+Income16 -9.696e-04 3.092e-01 -0.003 0.997499
+Income17 4.046e-01 2.846e-01 1.421 0.155949
+Income18 4.514e-01 6.083e-01 0.742 0.458455
+Income19 -8.688e-02 3.360e-01 -0.259 0.796119
+Religion2 9.832e-02 1.591e-01 0.618 0.536837
+Religion3 8.967e-02 1.567e-01 0.572 0.567443
+Religion4 9.837e-02 1.521e-01 0.647 0.518024
+Religion5 6.231e-01 3.376e-01 1.845 0.065640 .
+trust.in.science_7 6.755e-02 1.965e-02 3.438 0.000642 ***
+need_for_cognition 1.162e-01 5.983e-02 1.942 0.052722 .
+interpersonal.trust_1 4.233e-02 2.839e-02 1.491 0.136678
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+Residual standard error: 0.7431 on 443 degrees of freedom
+ (3 observations deleted due to missingness)
+Multiple R-squared: 0.7791, Adjusted R-squared: 0.7282
+F-statistic: 15.32 on 102 and 443 DF, p-value: < 2.2e-16
+
@@ -2278,8 +2778,8 @@ How does performance on VLAT questions predict trust?
- -model <- lm(formula = vis.trust_6 ~ vlat_simple * vlat_moderate * vlat_complex +
+
+model <- lm(formula = vis.trust_6 ~ assigned_vlat *
Age + Gender + State_1 + Education + Parents_education + Language +
Ethnicity + Income + Religion + trust.in.science_7 +
need_for_cognition + interpersonal.trust_1,
@@ -2703,16 +3203,54 @@ Affect on Trust {it’s own section}
Trust in Data
-
+
model <- lm(formula = data.trust_6 ~ affect.science_1 * affect.clarity_1 * affect.aesthetic_1 +
Age + Gender + State_1 + Education + Parents_education + Language +
Ethnicity + Income + Religion + trust.in.science_7 +
need_for_cognition + interpersonal.trust_1,
data = results)
-anova(model)
-
-emmeans(aov(data.trust_6 ~ affect.science_1 * affect.clarity_1 , data = results) , ~ affect.clarity_1)
+anova(model)
+
+
+Analysis of Variance Table
+
+Response: data.trust_6
+ Df Sum Sq Mean Sq F value Pr(>F)
+affect.science_1 1 215.22 215.219 177.0086 < 2.2e-16 ***
+affect.clarity_1 1 9.25 9.255 7.6117 0.0060405 **
+affect.aesthetic_1 1 7.35 7.346 6.0415 0.0143574 *
+Age 1 11.87 11.874 9.7662 0.0018948 **
+Gender 3 12.52 4.175 3.4337 0.0169859 *
+State_1 46 102.32 2.224 1.8295 0.0011628 **
+Education 9 23.48 2.609 2.1460 0.0247518 *
+Parents_education 2 2.76 1.378 1.1336 0.3228214
+Language 3 3.61 1.204 0.9902 0.3972282
+Ethnicity 8 9.34 1.168 0.9605 0.4663668
+Income 18 24.73 1.374 1.1301 0.3192198
+Religion 4 25.11 6.279 5.1638 0.0004495 ***
+trust.in.science_7 1 99.73 99.728 82.0222 < 2.2e-16 ***
+need_for_cognition 1 1.99 1.989 1.6360 0.2015540
+interpersonal.trust_1 1 10.18 10.178 8.3706 0.0040023 **
+affect.science_1:affect.clarity_1 1 7.06 7.065 5.8105 0.0163391 *
+affect.science_1:affect.aesthetic_1 1 0.60 0.604 0.4971 0.4811667
+affect.clarity_1:affect.aesthetic_1 1 3.71 3.706 3.0481 0.0815296 .
+affect.science_1:affect.clarity_1:affect.aesthetic_1 1 0.30 0.304 0.2501 0.6172265
+Residuals 441 536.20 1.216
+---
+Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
+
+
+emmeans(aov(data.trust_6 ~ affect.science_1 * affect.clarity_1 , data = results) , ~ affect.clarity_1)
+
+NOTE: Results may be misleading due to involvement in interactions
+
+
+ affect.clarity_1 emmean SE df lower.CL upper.CL
+ 75.7 5.17 0.0558 545 5.06 5.28
+
+Confidence level used: 0.95
+
@@ -2756,7 +3294,7 @@ Factor Analysis
-LS0tCnRpdGxlOiAiVHJ1c3QgaW4gU2NpZW5jZSBBbmFseXNpcyBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCmBgYHtyIGVjaG8gPSBGQUxTRX0KcmVxdWlyZSh0aWR5dmVyc2UpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjYXIpCmxpYnJhcnkobG1lNCkKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KHB3cikKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkocnN0YXRpeCkKbGlicmFyeShlZmZlY3RzaXplKQpsaWJyYXJ5KEdQQXJvdGF0aW9uKQojIGVudmlyb25tZW50IHRvIGluY2x1ZGUgdGhlIHNzX3BzeWNoNDUwX3J3czMgcGxhdGZvcm0KbG9hZCgic3NfcHN5Y2g0NTBfcndzMyIpCmBgYAoKTG9hZCBEYXRhCgpgYGB7cn0KcmVzdWx0cyA8LSByZWFkLmNzdigiZGF0YV9jbGVhbl9qdW5lMzAuY3N2IikKCiMgdHJ1c3QgaW4gZGF0YSBpcyB0aGUgY29sdW1uOiBiYXItZGF0YV82CiMgdHJ1c3QgaW4gdmlzIGlzIHRoZSBjb2x1bW46IGJhci12aXNfNgpgYGAKCkNvbnZlcnRpbmcgY292YXJpYXRlcyB0byBmYWN0b3JzCmBgYHtyfQpyZXN1bHRzJEdlbmRlciA8LSBhcy5mYWN0b3IocmVzdWx0cyRHZW5kZXIpCnJlc3VsdHMkRWR1Y2F0aW9uIDwtIGFzLmZhY3RvcihyZXN1bHRzJEVkdWNhdGlvbikKcmVzdWx0cyRQYXJlbnRzX2VkdWNhdGlvbiA8LSBhcy5mYWN0b3IocmVzdWx0cyRQYXJlbnRzX2VkdWNhdGlvbikKcmVzdWx0cyRMYW5ndWFnZSA8LSBhcy5mYWN0b3IocmVzdWx0cyRMYW5ndWFnZSkKcmVzdWx0cyRFdGhuaWNpdHkgPC0gYXMuZmFjdG9yKHJlc3VsdHMkRXRobmljaXR5KQpyZXN1bHRzJEluY29tZSA8LSBhcy5mYWN0b3IocmVzdWx0cyRJbmNvbWUpCnJlc3VsdHMkUmVsaWdpb24gPC0gYXMuZmFjdG9yKHJlc3VsdHMkUmVsaWdpb24pCmBgYAoKVHJ1c3QgaW4gVmlzCgpgYGB7cn0KIyByZXN1bHRzJGlzQ292aWREYXRhIDwtIGZhY3RvcihyZXN1bHRzJGlzQ292aWREYXRhLCBsZXZlbHMgPSBjKDAsIDEpLAojICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNyb3AgRGF0YSIsICJDb3ZpZCBEYXRhIikpCmBgYAoKYGBge3J9CgpNaW5NZWFuU0VNTWF4IDwtIGZ1bmN0aW9uKHgpIHsKICB2IDwtIGMobWluKHgpLCBtZWFuKHgpIC0gc2QoeCkvc3FydChsZW5ndGgoeCkpLCBtZWFuKHgpLCBtZWFuKHgpICsgc2QoeCkvc3FydChsZW5ndGgoeCkpLCBtYXgoeCkpCiAgbmFtZXModikgPC0gYygieW1pbiIsICJsb3dlciIsICJtaWRkbGUiLCAidXBwZXIiLCAieW1heCIpCiAgdgp9CgpyZXN1bHRzICU+JQogICMgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogIGdncGxvdChhZXMoIHggPSB2aXMudHJ1c3RfNiwgeSA9IDAsIGNleD0xLjUsIGNvbG91ciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInB1cnBsZSIsICJvcmFuZ2UiKSkgKwogIHlsaW0oLTAuNSwgMC41KSArCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IHJlc3VsdHMsIHdpZHRoID0gMC4zLCBoZWlnaHQgPSAwLjIsIGNvbG9yID0gImxpZ2h0IGdyYXkiLCBhbHBoYSA9IDAuNSkgKwogICNzdGF0X3N1bW1hcnkoZnVuLmRhdGE9TWluTWVhblNFTU1heCwgZ2VvbT0iYm94cGxvdCIsIGNvbG91cj0icmVkIikgKwoKICBnZW9tX2JveHBsb3QobHdkID0gMSwgZmF0dGVuID0gTlVMTCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuNSkgKwoKICBnZW9tX3NlZ21lbnQoZGF0YSA9IHJlc3VsdHMgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0gbWVhbih2aXMudHJ1c3RfNiksCiAgICAgICAgICAgIHNlID0gc2QoZGF0YS50cnVzdF82KS9zcXJ0KG4pKSwgCiAgICAgICAgICAgICAgYWVzKHggPSBtZWFuLCB4ZW5kID0gbWVhbiwgeSA9IC0uMjUsIHllbmQgPSAuMjUsICBjb2xvdXIgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSwgc2l6ZSA9IDEpICsKICAgICAgICAjIHN0YXRfc3VtbWFyeShmdW4uZGF0YSA9ICJtZWFuX2NsX2Jvb3QiLCBjb2xvdXIgPSAicmVkIiwgc2l6ZSA9IDAuNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4PTAuMjUsIHk9MCksIGFscGhhPTAuNSkgKwoKICBnZW9tX3RleHQoIGRhdGEgPSByZXN1bHRzICU+JSAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbXBsZXhpdHksIGlzQ292aWREYXRhKSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcml6ZShuID0gbigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiA9IHJvdW5kKG1lYW4odmlzLnRydXN0XzYpLGRpZ2l0cz0yKSwKICAgICAgICAgICAgc2UgPSByb3VuZChzZChkYXRhLnRydXN0XzYpL3NxcnQobiksZGlnaXRzPTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZpcy50cnVzdF82ID0gbWVhbih2aXMudHJ1c3RfNikpLAogICAgICAgICAgICAjIGFlcyhsYWJlbCA9IHBhc3RlKG1lYW4sICJbIixtZWFuLXNlLCIsIixtZWFuK3NlLCJdIiksIHggPSA2LjIsIHkgPSAwLjQzLCBmb250ZmFjZSA9IDMpLCBzaXplPTMsIGNvbG91ciA9ICJibGFjayIpKwogICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKG1lYW4pLCB4ID0gbWVhbiwgeSA9IC4zNSwgZm9udGZhY2UgPSAzKSwgc2l6ZT00LCBjb2xvdXIgPSAiYmxhY2siKSsKCiAgZmFjZXRfZ3JpZChjb21wbGV4aXR5IH4gaXNDb3ZpZERhdGEpICsKICB4bGFiKCJUcnVzdCBpbiBWaXN1YWxpemF0aW9uIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQoKCgpnZ3NhdmUocGFzdGUoImNvbXBsZXhpdHlfZGF0YVR5cGVfaW50ZXJhY3Rpb24ucGRmIiwgc2VwPSIiKSkKCmBgYAoKCmBgYHtyfQpyZXN1bHRzICU+JQogIGdyb3VwX2J5KGNvbXBsZXhpdHksIGlzQ292aWREYXRhKSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4odmlzLnRydXN0XzYpLAogICAgICAgICAgICBzZSA9IHNkKHZpcy50cnVzdF82KS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbikKYGBgCgpgYGB7cn0KIyByZXN1bHRzJGlzQ292aWREYXRhIDwtIGZhY3RvcihyZXN1bHRzJGlzQ292aWREYXRhLCBsZXZlbHMgPSBjKDAsIDEpLAojICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNyb3AgRGF0YSIsICJDb3ZpZCBEYXRhIikpCgpyZXN1bHRzICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGEudHJ1c3RfNiwgeSA9IDApKSArCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicHVycGxlIiwgIm9yYW5nZSIpKSArCiAgeWxpbSgtMC41LCAwLjUpICsKICBnZW9tX2ppdHRlcihkYXRhID0gcmVzdWx0cywgd2lkdGggPSAwLjI1LCBoZWlnaHQgPSAwLjIsIGNvbG9yID0gImxpZ2h0IGdyYXkiLCBhbHBoYSA9IDAuNSkgKwogIGdlb21fYm94cGxvdChsd2QgPSAxLCBmYXR0ZW4gPSBOVUxMLCB3aWR0aCA9IDAuMjUsIGFscGhhID0gMC41LCBjb2xvciA9ICJzYWxtb24iKSArCiAgIyBsYWJzKHRpdGxlID0gIlRydXN0IGluIGRhdGEiKSArIAogIGdlb21fdmxpbmUoZGF0YSA9IHJlc3VsdHMgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50cnVzdF82ID0gbWVhbihkYXRhLnRydXN0XzYpKSwgCiAgICAgICAgICAgICAgYWVzKHhpbnRlcmNlcHQgPSBkYXRhLnRydXN0XzYpLCBzaXplID0gMSxjb2xvdXIgPSAic2FsbW9uIikgKwogIGdlb21fdGV4dCggZGF0YSA9IHJlc3VsdHMgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSByb3VuZChtZWFuKGRhdGEudHJ1c3RfNiksZGlnaXRzPTIpLAogICAgICAgICAgICBzZSA9IHJvdW5kKHNkKGRhdGEudHJ1c3RfNikvc3FydChuKSxkaWdpdHM9MiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzYgPSBtZWFuKHZpcy50cnVzdF82KSksCiAgICAgICAgICAgIGFlcyhsYWJlbCA9IHBhc3RlKG1lYW4sICJbIixtZWFuLXNlLCIsIixtZWFuK3NlLCJdIiksIHggPSA2LjgsIHkgPSAwLjQzLCBmb250ZmFjZSA9IDMpLCBzaXplPTMsIGNvbG91ciA9ICJibGFjayIpKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY29tcGxleGl0eSkpICsKICB4bGFiKCJUcnVzdCBpbiBEYXRhIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQoKZ2dzYXZlKHBhc3RlKCJjb21wbGV4aXR5X2ludGVyYWN0aW9uLnBkZiIsIHNlcD0iIikpCgpgYGAKCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBncm91cF9ieShjb21wbGV4aXR5KSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oZGF0YS50cnVzdF82KSwKICAgICAgICAgICAgc2UgPSBzZChkYXRhLnRydXN0XzYpL3NxcnQobiksCiAgICAgICAgICAgIG4gPSBuKQpgYGAKCkxpbmVhciBSZWdyZXNzaW9uIE1vZGVsIGZvciB0cnVzdCBpbiB2aXMgYXMgYSBmdW5jdGlvbiBvZiAKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfNiB+IGNvbXBsZXhpdHkgKiBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpICogY2hhcnRUeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKCgpgYGAKCmBgYHtyfQojIHBvc3QtaG9jIHRlc3RzCmFvdih2aXMudHJ1c3RfNiB+IGNvbXBsZXhpdHkgKiBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpLCBkYXRhID0gcmVzdWx0cykgJT4lIHR1a2V5X2hzZCgpCiMgZWZmZWN0IHNpemVzCmV0YV9zcXVhcmVkKGFvdih2aXMudHJ1c3RfNiB+IGNvbXBsZXhpdHkgKiBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpICogY2hhcnRUeXBlICsgCiAgICAgICAgICAgICAgICAgICsgQWdlICsgYXMuZmFjdG9yKEdlbmRlcikgKyBTdGF0ZV8xICsgYXMuZmFjdG9yKEVkdWNhdGlvbikgKyBhcy5mYWN0b3IoUGFyZW50c19lZHVjYXRpb24pICsgYXMuZmFjdG9yKExhbmd1YWdlKSArIGFzLmZhY3RvcihFdGhuaWNpdHkpICsgYXMuZmFjdG9yKEluY29tZSkgKyBhcy5mYWN0b3IoUmVsaWdpb24pICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgCiAgICAgICAgICAgICAgICAgIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKSkKYGBgIAojIENvbGluZWFyaXR5IG9mIHRydXN0IGluIHZpcyBhbmQgdHJ1c3QgaW4gZGF0YQpgYGB7cn0KY29saW5lYXJpdHlfbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHRydXN0LmluLnNjaWVuY2VfNyB+IGFmZmVjdC5hZXN0aGV0aWNfMSArIGFmZmVjdC5jbGFyaXR5XzEgKyBhZmZlY3Quc2NpZW5jZV8xICsgdmlzLnRydXN0XzEgKyB2aXMudHJ1c3RfMiArIHZpcy50cnVzdF8zICsgdmlzLnRydXN0XzQgKyB2aXMudHJ1c3RfNSArIHZpcy50cnVzdF82ICsgZGF0YS50cnVzdF82ICsgZGF0YS50cnVzdF81ICsgZGF0YS50cnVzdF80ICsgZGF0YS50cnVzdF8zICsgZGF0YS50cnVzdF8yICsgZGF0YS50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKdmlmKGNvbGluZWFyaXR5X21vZGVsKQpgYGAKCnZpZihjb2xpbmVhcml0eV9tb2RlbClyZWxhdGlvbiBvZiB0cnVzdCBpbiB2aXMgYW5kIHRydXN0IGluIGRhdGEKYGBge3J9CmRhdGFfZnJhbWUgPSBkYXRhLmZyYW1lKHJlc3VsdHMkdmlzLnRydXN0XzEsIHJlc3VsdHMkdmlzLnRydXN0XzIsIHJlc3VsdHMkdmlzLnRydXN0XzMsIHJlc3VsdHMkdmlzLnRydXN0XzQsIHJlc3VsdHMkdmlzLnRydXN0XzUsIHJlc3VsdHMkdmlzLnRydXN0XzYsIHJlc3VsdHMkZGF0YS50cnVzdF8xLCByZXN1bHRzJGRhdGEudHJ1c3RfMiwgcmVzdWx0cyRkYXRhLnRydXN0XzMsIHJlc3VsdHMkZGF0YS50cnVzdF80LCByZXN1bHRzJGRhdGEudHJ1c3RfNSwgcmVzdWx0cyRkYXRhLnRydXN0XzYpCmNvcihkYXRhX2ZyYW1lKQpgYGAKCiMgVHJ1c3QgaW4gc2NpZW5jZSwgbmVlZCBmb3IgY29nbml0aW9uLCBhbmQgaW50ZXJwZXJzb25hbCB0cnVzdCBvbiB0cnVzdCBpbiBWaXMKYGBge3J9CnJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlcywgdmFsdWUgPSB2YWx1ZXMsIAogICAgICAgICB0cnVzdC5pbi5zY2llbmNlXzcsIG5lZWRfZm9yX2NvZ25pdGlvbiwgaW50ZXJwZXJzb25hbC50cnVzdF8xKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZXMsIHkgPSB2aXMudHJ1c3RfNiwgY29sb3IgPSB2YXJpYWJsZXMpKSArCgogIGZhY2V0X2dyaWQoY29scyA9IHZhcnModmFyaWFibGVzKSkgKwogICAgZ2VvbV9qaXR0ZXIoKSArCiAgZ2VvbV9zbW9vdGgoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9ibGFuaygpICsgCiAgIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCmBgYAoKCgoKCgpUcnVzdCBpbiBEYXRhCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkYXRhLnRydXN0XzYsIHkgPSBpc0NvdmlkRGF0YSwgY29sb3VyID0gYXMuZmFjdG9yKGlzQ292aWREYXRhKSkpICsKICBnZW9tX2ppdHRlcihkYXRhID0gcmVzdWx0cywgd2lkdGggPSAwLjUpICsKICAjIGxhYnModGl0bGUgPSAiVHJ1c3QgaW4gZGF0YSIpICsgCiAgZ2VvbV92bGluZShkYXRhID0gcmVzdWx0cyAlPiUgCiAgICAgICAgICAgICAgICBncm91cF9ieShjb21wbGV4aXR5LCBpc0NvdmlkRGF0YSwgY2hhcnRUeXBlKSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcml6ZShuID0gbigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRydXN0XzYgPSBtZWFuKGRhdGEudHJ1c3RfNikpLCAKICAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IGRhdGEudHJ1c3RfNiwgY29sb3VyID0gYXMuZmFjdG9yKGlzQ292aWREYXRhKSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGNvbXBsZXhpdHkpLCBjb2xzID0gdmFycyhjaGFydFR5cGUpKSArCiAgdGhlbWVfbWluaW1hbCgpCgpyZXN1bHRzICU+JSAKICBncm91cF9ieShjb21wbGV4aXR5LCBpc0NvdmlkRGF0YSkgJT4lCiAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICBtZWFuID0gbWVhbihkYXRhLnRydXN0XzYpLAogICAgICAgICAgICBzZSA9IHNkKGRhdGEudHJ1c3RfNikvc3FydChuKSwKICAgICAgICAgICAgbiA9IG4pCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBkYXRhLnRydXN0XzYgfiBjb21wbGV4aXR5ICogYXMuZmFjdG9yKGlzQ292aWREYXRhKSAqIGNoYXJ0VHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCgoKYGBgCgpgYGB7cn0KIyBwb3N0LWhvYyB0ZXN0cwphb3YoZGF0YS50cnVzdF82IH4gY29tcGxleGl0eSAqIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSksIGRhdGEgPSByZXN1bHRzKSAlPiUgdHVrZXlfaHNkKCkKYW92KGRhdGEudHJ1c3RfNiB+IGNoYXJ0VHlwZSAqIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSksIGRhdGEgPSByZXN1bHRzKSAlPiUgdHVrZXlfaHNkKCkKIyBlZmZlY3Qgc2l6ZXMKZXRhX3NxdWFyZWQoYW92KGRhdGEudHJ1c3RfNiB+IGNvbXBsZXhpdHkgKiBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpICogY2hhcnRUeXBlICsgCiAgICAgICAgICAgICAgICAgIEFnZSArIGFzLmZhY3RvcihHZW5kZXIpICsgU3RhdGVfMSArIGFzLmZhY3RvcihFZHVjYXRpb24pICsgYXMuZmFjdG9yKFBhcmVudHNfZWR1Y2F0aW9uKSArIGFzLmZhY3RvcihMYW5ndWFnZSkgKyAKICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yKEV0aG5pY2l0eSkgKyBhcy5mYWN0b3IoSW5jb21lKSArIGFzLmZhY3RvcihSZWxpZ2lvbikgKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyAKICAgICAgICAgICAgICAgICAgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpKQplbW1lYW5zKGFvdihkYXRhLnRydXN0XzYgfiBjb21wbGV4aXR5ICwgZGF0YSA9IHJlc3VsdHMpICwgfiBjb21wbGV4aXR5KQpgYGAKClRydXN0IGluIHNjaWVuY2UsIG5lZWQgZm9yIGNvZ25pdGlvbiwgYW5kIGludGVycGVyc29uYWwgdHJ1c3Qgb24gdHJ1c3QgaW4gRGF0YQpgYGB7cn0KcmVzdWx0cyAlPiUKICBnYXRoZXIoa2V5ID0gdmFyaWFibGVzLCB2YWx1ZSA9IHZhbHVlcywgCiAgICAgICAgIHRydXN0LmluLnNjaWVuY2VfNywgbmVlZF9mb3JfY29nbml0aW9uLCBpbnRlcnBlcnNvbmFsLnRydXN0XzEpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlcywgeSA9IGRhdGEudHJ1c3RfNiwgY29sb3IgPSB2YXJpYWJsZXMpKSArCgogIGZhY2V0X2dyaWQoY29scyA9IHZhcnModmFyaWFibGVzKSkgKwogICAgZ2VvbV9qaXR0ZXIoKSArCiAgZ2VvbV9zbW9vdGgoY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9ibGFuaygpICsgCiAgIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgpgYGB7cn0KcmVzdWx0c19sb25nX2RhdGEgPC0gcmVzdWx0cyAlPiUKICBzZWxlY3QoZGF0YS50cnVzdF8xLCBkYXRhLnRydXN0XzIsIGRhdGEudHJ1c3RfMywKICAgICAgICAgZGF0YS50cnVzdF80LCBkYXRhLnRydXN0XzUsIGRhdGEudHJ1c3RfNiwKICAgICAgICAgUmVzcG9uc2VJZCwgY29tcGxleGl0eSwKICAgICAgICAgdmxhdF9zaW1wbGUsIHZsYXRfbW9kZXJhdGUsIHZsYXRfY29tcGxleCkgJT4lCiAgZ2F0aGVyKGtleSA9IHRydXN0SXRlbURhdGEsIHZhbHVlID0gdHJ1c3RSYXRpbmdEYXRhLCAKICAgICAgICAgZGF0YS50cnVzdF8xLCBkYXRhLnRydXN0XzIsIGRhdGEudHJ1c3RfMywgZGF0YS50cnVzdF80LCBkYXRhLnRydXN0XzUsIGRhdGEudHJ1c3RfNikKCnJlc3VsdHNfbG9uZ19kYXRhICU+JQogIGdncGxvdChhZXMoeCA9IHRydXN0UmF0aW5nRGF0YSwgeSA9IDEsIGNvbG9yID0gY29tcGxleGl0eSkpICsKICBnZW9tX2ppdHRlcigpICsKICB5bGltKDAsIDIpICsgCiAgbGFicyh0aXRsZSA9ICJUcnVzdCBpbiBkYXRhIChBbGwpIikgKyAKICBnZW9tX3ZsaW5lKGRhdGEgPSByZXN1bHRzX2xvbmdfZGF0YSAlPiUgCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbXBsZXhpdHksIHRydXN0SXRlbURhdGEpICU+JQogICAgICAgICAgICAgICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlID0gbWVhbih0cnVzdFJhdGluZ0RhdGEpKSwgCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IGF2ZXJhZ2UsIGNvbG9yID0gY29tcGxleGl0eSkpICsKICBmYWNldF9ncmlkKHZhcnModHJ1c3RJdGVtRGF0YSkpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiB0cnVzdCBpbiBkYXRhIGFuZCB2aXMsIGFjcm9zcyBjb21wbGV4aXR5CgpgYGB7cn0KcmVzdWx0c19sb25nX2RhdGEgPC0gcmVzdWx0cyAlPiUKICBzZWxlY3QoZGF0YS50cnVzdF8xLCBkYXRhLnRydXN0XzIsIGRhdGEudHJ1c3RfMywKICAgICAgICAgZGF0YS50cnVzdF80LCBkYXRhLnRydXN0XzUsIGRhdGEudHJ1c3RfNiwKICAgICAgICAgUmVzcG9uc2VJZCwgY29tcGxleGl0eSwKICAgICAgICAgY2hhcnRUeXBlLCBpc0NvdmlkRGF0YSwgCiAgICAgICAgIHZsYXRfc2ltcGxlLCB2bGF0X21vZGVyYXRlLCB2bGF0X2NvbXBsZXgpICU+JQogIGdhdGhlcihrZXkgPSB0cnVzdEl0ZW1EYXRhLCB2YWx1ZSA9IHRydXN0UmF0aW5nRGF0YSwgCiAgICAgICAgICMgZGF0YS50cnVzdF8xLCBkYXRhLnRydXN0XzIsIGRhdGEudHJ1c3RfMywgZGF0YS50cnVzdF80LCBkYXRhLnRydXN0XzUsIAogICAgICAgICBkYXRhLnRydXN0XzYpCgpyZXN1bHRzX2xvbmdfdmlzIDwtIHJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IHRydXN0SXRlbVZpcywgdmFsdWUgPSB0cnVzdFJhdGluZ1ZpcywgCiAgICAgICAgICMgdmlzLnRydXN0XzEsIHZpcy50cnVzdF8yLCB2aXMudHJ1c3RfMywgdmlzLnRydXN0XzQsIHZpcy50cnVzdF81LCAKICAgICAgICAgdmlzLnRydXN0XzYpCgpyZXN1bHRzX2xvbmdfYWxsIDwtIG1lcmdlKHJlc3VsdHNfbG9uZ192aXMsIHJlc3VsdHNfbG9uZ19kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIlJlc3BvbnNlSWQiLCAiY29tcGxleGl0eSIsICJjaGFydFR5cGUiLCAiaXNDb3ZpZERhdGEiKSkKCm1vZGVsPC0gZ2xtKHRydXN0UmF0aW5nVmlzIH4gIHRydXN0UmF0aW5nRGF0YSAqIGNvbXBsZXhpdHkgKyAKICAgICAgICAgICAgICB0cnVzdFJhdGluZ0RhdGEgKiAgY2hhcnRUeXBlICsgCiAgICAgICAgICAgICAgdHJ1c3RSYXRpbmdEYXRhICogIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSksCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0c19sb25nX2FsbCkKQW5vdmEobW9kZWwpCmBgYAoKYGBge3J9CnJlc3VsdHNfbG9uZ19hbGwgJT4lCiAgIyBmaWx0ZXIodHJ1c3RJdGVtVmlzID09ICJiYXIudmlzXzIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0cnVzdFJhdGluZ1ZpcywgeSA9IHRydXN0UmF0aW5nRGF0YSwgY29sb3IgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4yNSkgKwogIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsCiAgICAgICAgICAgICAgZm9ybXVsYSA9IHkgfiB4LAogICAgICAgICAgICAgIGdlb20gPSAic21vb3RoIiwgY29sb3IgPSAiYmxhY2siKSArCiAgbGFicyh0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV3dGVlbiB0cnVzdCBpbiBWaXMgYW5kIERhdGEiKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY2hhcnRUeXBlKSwgY29scyA9IHZhcnMoY29tcGxleGl0eSkpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKCiMgRG8gdGhlIHRydXN0IGl0ZW1zIHByZWRpY3QgdHJ1c3Q/CgoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfNiB+IHZpcy50cnVzdF8xICsgCiAgICAgICAgICAgICAgdmlzLnRydXN0XzIgKyAKICAgICAgICAgICAgICB2aXMudHJ1c3RfMyArIAogICAgICAgICAgICAgIHZpcy50cnVzdF80ICsgCiAgICAgICAgICAgICAgdmlzLnRydXN0XzUgKyAKICAgICAgICAgICAgICBhZmZlY3Quc2NpZW5jZV8xICsKICAgICAgICAgICAgICBhZmZlY3QuY2xhcml0eV8xICsgCiAgICAgICAgICAgICAgYWZmZWN0LmFlc3RoZXRpY18xICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKc3VtbWFyeShtb2RlbCkKYGBgCgoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBkYXRhLnRydXN0XzYgfiBkYXRhLnRydXN0XzEgKyAKICAgICAgICAgICAgICBkYXRhLnRydXN0XzIgKyAKICAgICAgICAgICAgICBkYXRhLnRydXN0XzMgKyAKICAgICAgICAgICAgICBkYXRhLnRydXN0XzQgKyAKICAgICAgICAgICAgICBkYXRhLnRydXN0XzUgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCiMgV2hpY2ggdHJ1c3QgbWVhc3VyZW1lbnRzIHByZWRpY3QgYmVoYXZpb3JhbCBvdXRjb21lcz8KCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gdmlzLnRydXN0XzQgfiB2aXMudHJ1c3RfMSArIAogICAgICAgICAgICAgIHZpcy50cnVzdF8yICsgCiAgICAgICAgICAgICAgdmlzLnRydXN0XzMgKwogICAgICAgICAgICAgIHZpcy50cnVzdF82ICsKICAgICAgICAgICAgICBhZmZlY3Quc2NpZW5jZV8xICsKICAgICAgICAgICAgICBhZmZlY3QuY2xhcml0eV8xICsgCiAgICAgICAgICAgICAgYWZmZWN0LmFlc3RoZXRpY18xICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKc3VtbWFyeShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF81IH4gdmlzLnRydXN0XzEgKyAKICAgICAgICAgICAgICB2aXMudHJ1c3RfMiArIAogICAgICAgICAgICAgIHZpcy50cnVzdF8zICsKICAgICAgICAgICAgICB2aXMudHJ1c3RfNiArCiAgICAgICAgICAgICAgYWZmZWN0LnNjaWVuY2VfMSArCiAgICAgICAgICAgICAgYWZmZWN0LmNsYXJpdHlfMSArIAogICAgICAgICAgICAgIGFmZmVjdC5hZXN0aGV0aWNfMSArCiAgICAgICAgICAgICAgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAogICAgICAgICAgICAgIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCnN1bW1hcnkobW9kZWwpCmBgYAoKCmBgYHtyfQpyZXN1bHRzICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGEudHJ1c3RfMSwgeSA9IGRhdGEudHJ1c3RfNiwgY29sb3IgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21faml0dGVyKCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArCiAgZmFjZXRfd3JhcCh+aXNDb3ZpZERhdGEpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKCgoKCgoKCkhvdyBkb2VzIHBlcmZvcm1hbmNlIG9uIFZMQVQgcXVlc3Rpb25zIHByZWRpY3QgdHJ1c3Q/CgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gdmxhdF9zaW1wbGUgKiB2bGF0X21vZGVyYXRlICogdmxhdF9jb21wbGV4ICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCgplbW1lYW5zKGFvdih2aXMudHJ1c3RfNiB+IHZsYXRfc2ltcGxlICogdmxhdF9jb21wbGV4ICwgZGF0YSA9IHJlc3VsdHMpICwgfiB2bGF0X3NpbXBsZSB8IHZsYXRfY29tcGxleCkKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBnYXRoZXIoa2V5ID0gdmxhdF9sZXZlbCwgdmFsdWUgPSB2bGF0X3BlcmZvcm1hbmNlLCB2bGF0X3NpbXBsZSwgIHZsYXRfbW9kZXJhdGUsIHZsYXRfY29tcGxleCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmlzLnRydXN0XzYsIHkgPSB2bGF0X3BlcmZvcm1hbmNlLCBjb2xvdXIgPSBhcy5mYWN0b3IoYXNzaWduZWRfdmxhdCkpKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjUpICsKICAjIHkoMCwgMikgKyAKICAjIGxhYnModGl0bGUgPSAiVHJ1c3QgaW4gZGF0YSIpICsgCiAgIyBnZW9tX3ZsaW5lKGRhdGEgPSByZXN1bHRzICU+JSAKICAjICAgICAgICAgICAgICBncm91cF9ieShjb21wbGV4aXR5LCBpc0NvdmlkRGF0YSkgJT4lCiAgIyAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICMgICAgICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfNiA9IG1lYW4odmlzLnRydXN0XzYpKSwgCiAgIyAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdmlzLnRydXN0XzYsIGNvbG91ciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh2bGF0X2xldmVsKSwgY29scyA9IHZhcnMoY2hhcnRUeXBlKSkgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKQogICAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCgpPdmVyYWxsIGRpc3RyaWJ1dGlvbiBvZiBWTEFUIHBlcmZvcm1hbmNlCgpUcnVzdCBpbiBWaXMgCmBgYHtyfQojIHZsYXRfbG9uZyA8LSByZXN1bHRzICU+JQojICAgZ2F0aGVyKGtleSA9IHZsYXRfbGV2ZWwsIHZhbHVlID0gdmxhdF9wZXJmb3JtYW5jZSwgdmxhdF9zaW1wbGUsICB2bGF0X21vZGVyYXRlLCB2bGF0X2NvbXBsZXgpIAojIAojIG1vZGVsIDwtIGxtZXIoZm9ybXVsYSA9IHZsYXRfcGVyZm9ybWFuY2UgfiB2bGF0X2xldmVsICogaXNDb3ZpZERhdGEgKiBjaGFydFR5cGUgKwojICAgICAgICAgICAgICAgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKIyAgICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiMgICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgKyAoMXxSZXNwb25zZUlkKSwKIyAgICAgICAgICAgICBkYXRhID0gdmxhdF9sb25nKQojIEFub3ZhKG1vZGVsKQojIAojIGVtbWVhbnMoYW92KHZsYXRfcGVyZm9ybWFuY2UgfiB2bGF0X2xldmVsICwgZGF0YSA9IHJlc3VsdHMpICwgfiB2bGF0X3NpbXBsZSB8IHZsYXRfY29tcGxleCkKIyAKIyAjIHBvc3QtaG9jIHRlc3RzCiMgYW92KHZsYXRfcGVyZm9ybWFuY2UgfiB2bGF0X2xldmVsICogYXMuZmFjdG9yKGlzQ292aWREYXRhKSwgZGF0YSA9IHZsYXRfbG9uZykgJT4lIHR1a2V5X2hzZCgpCmBgYAoKYGBge3J9CnJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IHZsYXRfbGV2ZWwsIHZhbHVlID0gdmxhdF9wZXJmb3JtYW5jZSwgdmxhdF9zaW1wbGUsICB2bGF0X21vZGVyYXRlLCB2bGF0X2NvbXBsZXgpICU+JQogIGdyb3VwX2J5KHZsYXRfbGV2ZWwsIGNoYXJ0VHlwZSwgaXNDb3ZpZERhdGEpICU+JQogIHN1bW1hcml6ZShuID0gbigpLAogICAgICAgICAgICBtZWFuX3ZsYXRfcGVyZm9ybWFuY2UgPSBtZWFuKHZsYXRfcGVyZm9ybWFuY2UpLAogICAgICAgICAgICBzZSA9IHNkKHZsYXRfcGVyZm9ybWFuY2UpL3NxcnQobiksCiAgICAgICAgICAgIG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IHZsYXRfbGV2ZWwsIHkgPSBtZWFuX3ZsYXRfcGVyZm9ybWFuY2UsIAogICAgICAgICAgICAgeW1heCA9IG1lYW5fdmxhdF9wZXJmb3JtYW5jZSArIHNlLCB5bWluID0gbWVhbl92bGF0X3BlcmZvcm1hbmNlIC0gc2UsCiAgICAgICAgICAgICBjb2xvdXIgPSB2bGF0X2xldmVsKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9lcnJvcmJhcigpICsKICAjIGxhYnModGl0bGUgPSAiVHJ1c3QgaW4gZGF0YSIpICsgCiAgIyBnZW9tX3ZsaW5lKGRhdGEgPSByZXN1bHRzICU+JSAKICAjICAgICAgICAgICAgICBncm91cF9ieShjb21wbGV4aXR5LCBpc0NvdmlkRGF0YSkgJT4lCiAgIyAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICMgICAgICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfNiA9IG1lYW4odmlzLnRydXN0XzYpKSwgCiAgIyAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdmlzLnRydXN0XzYsIGNvbG91ciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhpc0NvdmlkRGF0YSkpICsKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgyLCAibGluZXMiKSkKICAgICAgICAjIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgoKVHJ1c3QgaW4gRGF0YQoKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZGF0YS50cnVzdF82IH4gdmxhdF9zaW1wbGUgKiB2bGF0X21vZGVyYXRlICogdmxhdF9jb21wbGV4ICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCgplbW1lYW5zKGFvdihkYXRhLnRydXN0XzYgfiB2bGF0X3NpbXBsZSAqIHZsYXRfY29tcGxleCAsIGRhdGEgPSByZXN1bHRzKSAsIH4gdmxhdF9zaW1wbGUgfCB2bGF0X2NvbXBsZXgpCmBgYAoKCgoKCgoKCgoKIyBXaGljaCBhbnRlY2VkZW50IGRyaXZlcyB0aGUgaW50ZXJhY3Rpb24gZWZmZWN0IGZvciB0cnVzdCBpbiB2aXN1YWxpemF0aW9uIGZvciBjb3ZpZCBkYXRhPwoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfMSB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMgJT4lIGZpbHRlcihpc0NvdmlkRGF0YSA9PSAxKSkKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfMiB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMgJT4lIGZpbHRlcihpc0NvdmlkRGF0YSA9PSAxKSkKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfMyB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMgJT4lIGZpbHRlcihpc0NvdmlkRGF0YSA9PSAxKSkKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBhZmZlY3Quc2NpZW5jZV8xIH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cyAlPiUgZmlsdGVyKGlzQ292aWREYXRhID09IDEpKQphbm92YShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGFmZmVjdC5jbGFyaXR5XzEgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzICU+JSBmaWx0ZXIoaXNDb3ZpZERhdGEgPT0gMSkpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gYWZmZWN0LmFlc3RoZXRpY18xIH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cyAlPiUgZmlsdGVyKGlzQ292aWREYXRhID09IDEpKQphbm92YShtb2RlbCkKYGBgCgojIFdoaWNoIGFudGVjZWRlbnQgZHJpdmVzIHRoZSBtYWluIGVmZmVjdCBmb3IgdHJ1c3QgaW4gZGF0YT8KCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZGF0YS50cnVzdF8xIH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBkYXRhLnRydXN0XzIgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfMyB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZGF0YS50cnVzdF80IH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBkYXRhLnRydXN0XzUgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKYGBgCgojIEhvdyBkb2VzIHByb3ZlbmFuY2UgZGF0YSBwcmVkaWN0IHRydXN0PwoKT3ZlcmFsbAoKYGBge3J9CmJydXNoZWQgPC0gcmVzdWx0cyAlPiUKICBnYXRoZXIoa2V5ID0gcHJvdmVuYW5jZV90eXBlLCB2YWx1ZSA9IHByb3ZlbmFuY2VfdmFsdWUsIGJydXNoZWQsIGV4cGxvcmVfaW50ZXJhY3Rpb25zLCBleHBsb3JlX3RpbWUpICU+JQogIGdyb3VwX2J5KHByb3ZlbmFuY2VfdHlwZSwgY2hhcnRUeXBlLCBpc0NvdmlkRGF0YSwgY29tcGxleGl0eSkgJT4lCiAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICBtZWFuID0gbWVhbihwcm92ZW5hbmNlX3ZhbHVlKSwgCiAgICAgICAgICAgIHNlID0gc2QocHJvdmVuYW5jZV92YWx1ZSkvc3FydChuKSwKICAgICAgICAgICAgbiA9IG4pICU+JQogIGZpbHRlcihwcm92ZW5hbmNlX3R5cGUgPT0gImJydXNoZWQiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm92ZW5hbmNlX3R5cGUsIHkgPSBtZWFuLCB5bWF4ID0gbWVhbiArIHNlLCB5bWluID0gbWVhbiAtIHNlLCBjb2xvciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMih3aWR0aCA9IDAuNSkpICsKICBnZW9tX2Vycm9yYmFyKHdpZHRoID0gMC41LCBzaXplID0gMC42NiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjb21wbGV4aXR5KSwgY29scyA9IHZhcnMoaXNDb3ZpZERhdGEpKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCmJydXNoZWQKCmludGVyYWN0aW9ucyA8LSByZXN1bHRzICU+JQogIGdhdGhlcihrZXkgPSBwcm92ZW5hbmNlX3R5cGUsIHZhbHVlID0gcHJvdmVuYW5jZV92YWx1ZSwgYnJ1c2hlZCwgZXhwbG9yZV9pbnRlcmFjdGlvbnMsIGV4cGxvcmVfdGltZSkgJT4lCiAgZ3JvdXBfYnkocHJvdmVuYW5jZV90eXBlLCBjaGFydFR5cGUsIGlzQ292aWREYXRhLCBjb21wbGV4aXR5KSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKHByb3ZlbmFuY2VfdmFsdWUpLCAKICAgICAgICAgICAgc2UgPSBzZChwcm92ZW5hbmNlX3ZhbHVlKS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbikgJT4lCiAgZmlsdGVyKHByb3ZlbmFuY2VfdHlwZSA9PSAiZXhwbG9yZV9pbnRlcmFjdGlvbnMiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm92ZW5hbmNlX3R5cGUsIHkgPSBtZWFuLCB5bWF4ID0gbWVhbiArIHNlLCB5bWluID0gbWVhbiAtIHNlLCBjb2xvciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMih3aWR0aCA9IDAuNSkpICsKICBnZW9tX2Vycm9yYmFyKHdpZHRoID0gMC41LCBzaXplID0gMC42NiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjb21wbGV4aXR5KSwgY29scyA9IHZhcnMoY2hhcnRUeXBlKSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKQppbnRlcmFjdGlvbnMKCmV4cGxvcmVUaW1lIDwtIHJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IHByb3ZlbmFuY2VfdHlwZSwgdmFsdWUgPSBwcm92ZW5hbmNlX3ZhbHVlLCBicnVzaGVkLCBleHBsb3JlX2ludGVyYWN0aW9ucywgZXhwbG9yZV90aW1lKSAlPiUKICBncm91cF9ieShwcm92ZW5hbmNlX3R5cGUsIGNoYXJ0VHlwZSwgaXNDb3ZpZERhdGEsIGNvbXBsZXhpdHkpICU+JQogIHN1bW1hcml6ZShuID0gbigpLCAKICAgICAgICAgICAgbWVhbiA9IG1lYW4ocHJvdmVuYW5jZV92YWx1ZSksIAogICAgICAgICAgICBzZSA9IHNkKHByb3ZlbmFuY2VfdmFsdWUpL3NxcnQobiksCiAgICAgICAgICAgIG4gPSBuKSAlPiUKICBmaWx0ZXIocHJvdmVuYW5jZV90eXBlID09ICJleHBsb3JlX3RpbWUiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcm92ZW5hbmNlX3R5cGUsIHkgPSBtZWFuLCB5bWF4ID0gbWVhbiArIHNlLCB5bWluID0gbWVhbiAtIHNlLCBjb2xvciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMih3aWR0aCA9IDAuNSkpICsKICBnZW9tX2Vycm9yYmFyKHdpZHRoID0gMC41LCBzaXplID0gMC42NiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjaGFydFR5cGUpLCBjb2xzID0gdmFycyhjb21wbGV4aXR5KSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKQpleHBsb3JlVGltZQoKZXhwbG9yZVRpbWUgKyBpbnRlcmFjdGlvbnMgKyBicnVzaGVkCmdnc2F2ZSgicHJvdmVuYW5jZVJlc3VsdHMucG5nIiwgd2lkdGggPSAyNiwgaGVpZ2h0ID0gMTQpCmBgYApleHBsb3JlX2ludGVyYWN0aW9ucwoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBleHBsb3JlX2ludGVyYWN0aW9ucyB+IGNvbXBsZXhpdHkgKiBjaGFydFR5cGUgKiBpc0NvdmlkRGF0YSArCiAgICAgICAgICAgICAgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAogICAgICAgICAgICAgIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQpgYGAKCmV4cGxvcmVfdGltZQoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBleHBsb3JlX3RpbWUgfiBjb21wbGV4aXR5ICogY2hhcnRUeXBlICogaXNDb3ZpZERhdGEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKYGBgCgoKCkh5cG90aGVzaXM6CmZvciB0aGUgY29tcGxleCBjb25kaXRpb24sIHdlIGV4cGVjdCBwZW9wbGUgd2hvIGJydXNoZWQgbW9yZSB0byBoYXZlIGhpZ2hlciB0cnVzdAoKYGBge3J9CmNvbXBsZXhDb25kaXRpb24gPC0gcmVzdWx0cyAlPiUKICBmaWx0ZXIoY29tcGxleGl0eSA9PSAiY29tcGxleCIpCgojIGNhbiBjaGFuZ2UgdGhlIHByZWRpY3RvciB0byBiYXIudmlzCm1vZGVsPC0gbWFub3ZhKGNiaW5kKGRhdGEudHJ1c3RfMSwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEudHJ1c3RfMiwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEudHJ1c3RfMywgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEudHJ1c3RfNCwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEudHJ1c3RfNSwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEudHJ1c3RfNikgfiBicnVzaGVkICsgZXhwbG9yZV9pbnRlcmFjdGlvbnMgKyBleHBsb3JlX3RpbWUsIAogICAgICAgICAgICAgICBkYXRhID0gY29tcGxleENvbmRpdGlvbikKc3VtbWFyeS5hb3YobW9kZWwpCmBgYAoKSHlwb3RoZXNpczoKZm9yIGFsbCB0aGUgY29uZGl0aW9ucywgd2UgZXhwZWN0IHBlb3BsZSB3aG8gaG92ZXJlZCBtb3JlIHRvIGhhdmUgaGlnaGVyIHRydXN0CgoKYGBge3J9CiMgY2FuIGNoYW5nZSB0aGUgcHJlZGljdG9yIHRvIGJhci52aXMKbW9kZWw8LSBtYW5vdmEoY2JpbmQodmlzLnRydXN0XzYsIAogICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfNSwgCiAgICAgICAgICAgICAgICAgICAgIHZpcy50cnVzdF80LCAKICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzMsIAogICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfMiwgCiAgICAgICAgICAgICAgICAgICAgIHZpcy50cnVzdF8xKSB+IGJydXNoZWQgKyBleHBsb3JlX2ludGVyYWN0aW9ucyArIGV4cGxvcmVfdGltZSwgCiAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQpzdW1tYXJ5LmFvdihtb2RlbCkKYGBgCgoKCiMgQWZmZWN0IG9uIFRydXN0IHtpdCdzIG93biBzZWN0aW9ufQoKYGBge3J9CnJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IGFmZmVjdHMsIHZhbHVlID0gYWZmZWN0UmF0aW5ncywgYWZmZWN0LnNjaWVuY2VfMSwgIGFmZmVjdC5jbGFyaXR5XzEsIGFmZmVjdC5hZXN0aGV0aWNfMSkgJT4lCiAgZ3JvdXBfYnkoYWZmZWN0cywgY2hhcnRUeXBlLCBpc0NvdmlkRGF0YSwgY29tcGxleGl0eSkgJT4lCiAgc3VtbWFyaXplKG4gPSBuKCksCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKGFmZmVjdFJhdGluZ3MpLAogICAgICAgICAgICBzZSA9IHNkKGFmZmVjdFJhdGluZ3MpL3NxcnQobiksCiAgICAgICAgICAgIG4gPSBuKCkpICU+JQogIGdncGxvdChhZXMoeCA9IGFmZmVjdHMsIHkgPSBtZWFuLCAKICAgICAgICAgICAgIHltYXggPSBtZWFuICsgc2UsIHltaW4gPSBtZWFuIC0gc2UsCiAgICAgICAgICAgICBjb2xvdXIgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAwLjUpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IDAuNSwgc2l6ZSA9IDAuNjYsIHBvc2l0aW9uID0gImRvZGdlIikgKwogICMgbGFicyh0aXRsZSA9ICJUcnVzdCBpbiBkYXRhIikgKyAKICAjIGdlb21fdmxpbmUoZGF0YSA9IHJlc3VsdHMgJT4lIAogICMgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbXBsZXhpdHksIGlzQ292aWREYXRhKSAlPiUKICAjICAgICAgICAgICAgICBzdW1tYXJpemUobiA9IG4oKSwgCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIHZpcy50cnVzdF82ID0gbWVhbih2aXMudHJ1c3RfNikpLCAKICAjICAgICAgICAgICAgYWVzKHhpbnRlcmNlcHQgPSB2aXMudHJ1c3RfNiwgY29sb3VyID0gYXMuZmFjdG9yKGlzQ292aWREYXRhKSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGNoYXJ0VHlwZSksIGNvbHMgPSB2YXJzKGNvbXBsZXhpdHkpKSArCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCiAgICAgICAgIyBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmdnc2F2ZSgiYWZmZWN0TWVhc3VyZXMucG5nIiwgd2lkdGggPSAxNywgaGVpZ2h0ID0gOSkKYGBgCgoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBhZmZlY3Quc2NpZW5jZV8xIH4gY29tcGxleGl0eSAqIGNoYXJ0VHlwZSAqIGlzQ292aWREYXRhICsKICAgICAgICAgICAgICBBZ2UgKyBhcy5mYWN0b3IoR2VuZGVyKSArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGFmZmVjdC5jbGFyaXR5XzEgfiBjb21wbGV4aXR5ICogY2hhcnRUeXBlICogaXNDb3ZpZERhdGEgKwogICAgICAgICAgICAgIEFnZSArIGFzLmZhY3RvcihHZW5kZXIpICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAogICAgICAgICAgICAgIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQpzdW1tYXJ5KG1vZGVsKQpgYGAKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBhZmZlY3QuYWVzdGhldGljXzEgfiBjb21wbGV4aXR5ICogY2hhcnRUeXBlICogaXNDb3ZpZERhdGEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKc3VtbWFyeShtb2RlbCkKYGBgCgpUcnVzdCBpbiBWaXMKCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gYWZmZWN0LnNjaWVuY2VfMSAqIGFmZmVjdC5jbGFyaXR5XzEgKiBhZmZlY3QuYWVzdGhldGljXzEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKc3VtbWFyeShtb2RlbCkKCmVtbWVhbnMoYW92KHZpcy50cnVzdF82IH4gYWZmZWN0LnNjaWVuY2VfMSAqIGFmZmVjdC5jbGFyaXR5XzEgLCBkYXRhID0gcmVzdWx0cykgLCB+IGFmZmVjdC5jbGFyaXR5XzEpCmBgYAoKClRydXN0IGluIERhdGEKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZGF0YS50cnVzdF82IH4gYWZmZWN0LnNjaWVuY2VfMSAqIGFmZmVjdC5jbGFyaXR5XzEgKiBhZmZlY3QuYWVzdGhldGljXzEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKCmVtbWVhbnMoYW92KGRhdGEudHJ1c3RfNiB+IGFmZmVjdC5zY2llbmNlXzEgKiBhZmZlY3QuY2xhcml0eV8xICwgZGF0YSA9IHJlc3VsdHMpICwgfiBhZmZlY3QuY2xhcml0eV8xKQpgYGAKCgoKCgoKCgoKCiMgRmFjdG9yIEFuYWx5c2lzIAoKCmBgYHtyfQpmYWN0b3JBbmFseXNpcyA8LSByZXN1bHRzICU+JQogIHNlbGVjdChkYXRhLnRydXN0XzEsIGRhdGEudHJ1c3RfMiwgZGF0YS50cnVzdF8zLCBkYXRhLnRydXN0XzQsIGRhdGEudHJ1c3RfNSwgZGF0YS50cnVzdF82LAogICAgICAgICB2aXMudHJ1c3RfMSwgdmlzLnRydXN0XzIsIHZpcy50cnVzdF8zLCB2aXMudHJ1c3RfNCwgdmlzLnRydXN0XzUsIHZpcy50cnVzdF82LAogICAgICAgICB0cnVzdC5pbi5zY2llbmNlXzEsIHRydXN0LmluLnNjaWVuY2VfMiwgdHJ1c3QuaW4uc2NpZW5jZV8zLCB0cnVzdC5pbi5zY2llbmNlXzQsIHRydXN0LmluLnNjaWVuY2VfNSwKICAgICAgICAgdHJ1c3QuaW4uc2NpZW5jZV82LCB0cnVzdC5pbi5zY2llbmNlXzcsIHRydXN0LmluLnNjaWVuY2VfOCwgCiAgICAgICAgIGNvZ25pdGlvbl8xLCBjb2duaXRpb25fMiwgY29nbml0aW9uXzMsIGNvZ25pdGlvbl80LCBjb2duaXRpb25fNSwgY29nbml0aW9uXzYsCiAgICAgICAgICMgYnJ1c2hlZCwgZXhwbG9yZV9pbnRlcmFjdGlvbnMsICMgZXhwbG9yZV90aW1lLCAKICAgICAgICAgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICB2bGF0X3NpbXBsZSwgdmxhdF9tb2RlcmF0ZSwgdmxhdF9jb21wbGV4LAogICAgICAgICAjIGluaXRpYWwgaW1wcmVzc2lvbgogICAgICAgICBhZmZlY3Quc2NpZW5jZV8xLCBhZmZlY3QuY2xhcml0eV8xLCBhZmZlY3QuYWVzdGhldGljXzEpCgpuZmFjdG9ycyhmYWN0b3JBbmFseXNpcykKYGBgCgpGYWN0b3IgNCBzZWVtIHRvIGhhdmUgbWluaW11bSBjb21wZWx4aXR5LCBCSUMgaXMgcHJldHR5IGxvdywgYW5kIGJpZyBqdW1wIGZvciByb290IG1lYW4KNSBzZWVtcyBtZWggYmVjdWFzZSBvZiB0aGUgYmlnIGp1bXAgZnJvbSA0LTUgb24gY29tcGxleGl0eS4gCgpgYGB7cn0KZjcgPC0gZmEoZmFjdG9yQW5hbHlzaXMsIDcpCnBkZihmaWxlID0gImY3LnBkZiIsICAgIyBUaGUgZGlyZWN0b3J5IHlvdSB3YW50IHRvIHNhdmUgdGhlIGZpbGUgaW4KICAgIHdpZHRoID0gMTUsICMgVGhlIHdpZHRoIG9mIHRoZSBwbG90IGluIGluY2hlcwogICAgaGVpZ2h0ID0gMjMpICMgVGhlIGhlaWdodCBvZiB0aGUgcGxvdCBpbiBpbmNoZXMKZmEuZGlhZ3JhbShmNykKZGV2Lm9mZigpCiMgYmFzZWQgb24gdGhlIGZhY3RvciBhbmFseXNpcywgaXQgbG9va3MgbGlrZSBub3QgYWxsIHRoZSB2aXMgUXMgZ28gdG9nZXRoZXIgYW5kIG5vdCBhbGwgdGhlIGRhdGEgUXMgZ28gdG9nZXRoZXIuIApgYGAKCgoK
+LS0tCnRpdGxlOiAiVHJ1c3QgaW4gU2NpZW5jZSBBbmFseXNpcyBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCmBgYHtyIGVjaG8gPSBGQUxTRX0KcmVxdWlyZSh0aWR5dmVyc2UpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjYXIpCmxpYnJhcnkobG1lNCkKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KHB3cikKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkocnN0YXRpeCkKbGlicmFyeShlZmZlY3RzaXplKQpsaWJyYXJ5KEdQQXJvdGF0aW9uKQojIGVudmlyb25tZW50IHRvIGluY2x1ZGUgdGhlIHNzX3BzeWNoNDUwX3J3czMgcGxhdGZvcm0KbG9hZCgic3NfcHN5Y2g0NTBfcndzMyIpCmBgYAoKTG9hZCBEYXRhCgpgYGB7cn0KcmVzdWx0cyA8LSByZWFkLmNzdigiZGF0YV9jbGVhbl9qdW5lMzAuY3N2IikKCiMgdHJ1c3QgaW4gZGF0YSBpcyB0aGUgY29sdW1uOiBiYXItZGF0YV82CiMgdHJ1c3QgaW4gdmlzIGlzIHRoZSBjb2x1bW46IGJhci12aXNfNgpgYGAKCkNvbnZlcnRpbmcgY292YXJpYXRlcyB0byBmYWN0b3JzCmBgYHtyfQpyZXN1bHRzJEdlbmRlciA8LSBhcy5mYWN0b3IocmVzdWx0cyRHZW5kZXIpCnJlc3VsdHMkRWR1Y2F0aW9uIDwtIGFzLmZhY3RvcihyZXN1bHRzJEVkdWNhdGlvbikKcmVzdWx0cyRQYXJlbnRzX2VkdWNhdGlvbiA8LSBhcy5mYWN0b3IocmVzdWx0cyRQYXJlbnRzX2VkdWNhdGlvbikKcmVzdWx0cyRMYW5ndWFnZSA8LSBhcy5mYWN0b3IocmVzdWx0cyRMYW5ndWFnZSkKcmVzdWx0cyRFdGhuaWNpdHkgPC0gYXMuZmFjdG9yKHJlc3VsdHMkRXRobmljaXR5KQpyZXN1bHRzJEluY29tZSA8LSBhcy5mYWN0b3IocmVzdWx0cyRJbmNvbWUpCnJlc3VsdHMkUmVsaWdpb24gPC0gYXMuZmFjdG9yKHJlc3VsdHMkUmVsaWdpb24pCmBgYAoKVHJ1c3QgaW4gVmlzCgpgYGB7cn0KIyByZXN1bHRzJGlzQ292aWREYXRhIDwtIGZhY3RvcihyZXN1bHRzJGlzQ292aWREYXRhLCBsZXZlbHMgPSBjKDAsIDEpLAojICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNyb3AgRGF0YSIsICJDb3ZpZCBEYXRhIikpCmBgYAoKYGBge3J9CgpNaW5NZWFuU0VNTWF4IDwtIGZ1bmN0aW9uKHgpIHsKICB2IDwtIGMobWluKHgpLCBtZWFuKHgpIC0gc2QoeCkvc3FydChsZW5ndGgoeCkpLCBtZWFuKHgpLCBtZWFuKHgpICsgc2QoeCkvc3FydChsZW5ndGgoeCkpLCBtYXgoeCkpCiAgbmFtZXModikgPC0gYygieW1pbiIsICJsb3dlciIsICJtaWRkbGUiLCAidXBwZXIiLCAieW1heCIpCiAgdgp9CgpyZXN1bHRzICU+JQogICMgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogIGdncGxvdChhZXMoIHggPSB2aXMudHJ1c3RfNiwgeSA9IDAsIGNleD0xLjUsIGNvbG91ciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInB1cnBsZSIsICJvcmFuZ2UiKSkgKwogIHlsaW0oLTAuNSwgMC41KSArCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IHJlc3VsdHMsIHdpZHRoID0gMC4zLCBoZWlnaHQgPSAwLjIsIGNvbG9yID0gImxpZ2h0IGdyYXkiLCBhbHBoYSA9IDAuNSkgKwogICNzdGF0X3N1bW1hcnkoZnVuLmRhdGE9TWluTWVhblNFTU1heCwgZ2VvbT0iYm94cGxvdCIsIGNvbG91cj0icmVkIikgKwoKICBnZW9tX2JveHBsb3QobHdkID0gMSwgZmF0dGVuID0gTlVMTCwgd2lkdGggPSAwLjI1LCBhbHBoYSA9IDAuNSkgKwoKICBnZW9tX3NlZ21lbnQoZGF0YSA9IHJlc3VsdHMgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0gbWVhbih2aXMudHJ1c3RfNiksCiAgICAgICAgICAgIHNlID0gc2QodmlzLnRydXN0XzYpL3NxcnQobikpLCAKICAgICAgICAgICAgICBhZXMoeCA9IG1lYW4sIHhlbmQgPSBtZWFuLCB5ID0gLS4yNSwgeWVuZCA9IC4yNSwgIGNvbG91ciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpLCBzaXplID0gMSkgKwogICAgICAgICMgc3RhdF9zdW1tYXJ5KGZ1bi5kYXRhID0gIm1lYW5fY2xfYm9vdCIsIGNvbG91ciA9ICJyZWQiLCBzaXplID0gMC41LCBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHg9MC4yNSwgeT0wKSwgYWxwaGE9MC41KSArCgogIGdlb21fdGV4dCggZGF0YSA9IHJlc3VsdHMgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0gcm91bmQobWVhbih2aXMudHJ1c3RfNiksZGlnaXRzPTIpLAogICAgICAgICAgICBzZSA9IHJvdW5kKHNkKGRhdGEudHJ1c3RfNikvc3FydChuKSxkaWdpdHM9MiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzYgPSBtZWFuKHZpcy50cnVzdF82KSksCiAgICAgICAgICAgICMgYWVzKGxhYmVsID0gcGFzdGUobWVhbiwgIlsiLG1lYW4tc2UsIiwiLG1lYW4rc2UsIl0iKSwgeCA9IDYuMiwgeSA9IDAuNDMsIGZvbnRmYWNlID0gMyksIHNpemU9MywgY29sb3VyID0gImJsYWNrIikrCiAgICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUobWVhbiksIHggPSBtZWFuLCB5ID0gLjM1LCBmb250ZmFjZSA9IDMpLCBzaXplPTQsIGNvbG91ciA9ICJibGFjayIpKwoKICBmYWNldF9ncmlkKGNvbXBsZXhpdHkgfiBpc0NvdmlkRGF0YSkgKwogIHhsYWIoIlRydXN0IGluIFZpc3VhbGl6YXRpb24iKSArCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCgoKCmdnc2F2ZShwYXN0ZSgiY29tcGxleGl0eV9kYXRhVHlwZV9pbnRlcmFjdGlvbi5wZGYiLCBzZXA9IiIpKQoKYGBgCgoKYGBge3J9CnJlc3VsdHMgJT4lCiAgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogIHN1bW1hcml6ZShuID0gbigpLAogICAgICAgICAgICBtZWFuID0gbWVhbih2aXMudHJ1c3RfNiksCiAgICAgICAgICAgIHNlID0gc2QodmlzLnRydXN0XzYpL3NxcnQobiksCiAgICAgICAgICAgIG4gPSBuKQpgYGAKCmBgYHtyfQojIHJlc3VsdHMkaXNDb3ZpZERhdGEgPC0gZmFjdG9yKHJlc3VsdHMkaXNDb3ZpZERhdGEsIGxldmVscyA9IGMoMCwgMSksCiMgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ3JvcCBEYXRhIiwgIkNvdmlkIERhdGEiKSkKCnJlc3VsdHMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZGF0YS50cnVzdF82LCB5ID0gMCkpICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJwdXJwbGUiLCAib3JhbmdlIikpICsKICB5bGltKC0wLjUsIDAuNSkgKwogIGdlb21faml0dGVyKGRhdGEgPSByZXN1bHRzLCB3aWR0aCA9IDAuMjUsIGhlaWdodCA9IDAuMiwgY29sb3IgPSAibGlnaHQgZ3JheSIsIGFscGhhID0gMC41KSArCiAgZ2VvbV9ib3hwbG90KGx3ZCA9IDEsIGZhdHRlbiA9IE5VTEwsIHdpZHRoID0gMC4yNSwgYWxwaGEgPSAwLjUsIGNvbG9yID0gInNhbG1vbiIpICsKICAjIGxhYnModGl0bGUgPSAiVHJ1c3QgaW4gZGF0YSIpICsgCgogIAogICBnZW9tX3NlZ21lbnQoZGF0YSA9IHJlc3VsdHMgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSBtZWFuKGRhdGEudHJ1c3RfNiksCiAgICAgICAgICAgIHNlID0gc2QoZGF0YS50cnVzdF82KS9zcXJ0KG4pKSwgCiAgICAgICAgICAgICAgYWVzKHggPSBtZWFuLCB4ZW5kID0gbWVhbiwgeSA9IC0uMjUsIHllbmQgPSAuMjUsICBjb2xvdXIgPSJzYWxtb24iKSwgc2l6ZSA9IDEpICsKCiAgCiAgZ2VvbV90ZXh0KCBkYXRhID0gcmVzdWx0cyAlPiUgCiAgICAgICAgICAgICAgICBncm91cF9ieShjb21wbGV4aXR5KSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcml6ZShuID0gbigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiA9IHJvdW5kKG1lYW4oZGF0YS50cnVzdF82KSxkaWdpdHM9MiksCiAgICAgICAgICAgIHNlID0gcm91bmQoc2QoZGF0YS50cnVzdF82KS9zcXJ0KG4pLGRpZ2l0cz0yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYWR0YS50cnVzdF82ID0gbWVhbihkYXRhLnRydXN0XzYpKSwKICAgICAgICAgICAgIyBhZXMobGFiZWwgPSBwYXN0ZShtZWFuLCAiWyIsbWVhbi1zZSwiLCIsbWVhbitzZSwiXSIpLCB4ID0gNi4yLCB5ID0gMC40MywgZm9udGZhY2UgPSAzKSwgc2l6ZT0zLCBjb2xvdXIgPSAiYmxhY2siKSsKICAgICAgICAgICAgICBhZXMobGFiZWwgPSBwYXN0ZShtZWFuKSwgeCA9IG1lYW4sIHkgPSAuMzUsIGZvbnRmYWNlID0gMyksIHNpemU9NCwgY29sb3VyID0gImJsYWNrIikrCiAgCgogIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY29tcGxleGl0eSkpICsKICB4bGFiKCJUcnVzdCBpbiBEYXRhIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQoKZ2dzYXZlKHBhc3RlKCJjb21wbGV4aXR5X2ludGVyYWN0aW9uLnBkZiIsIHNlcD0iIikpCgpgYGAKCgpgYGB7cn0KcmVzdWx0cyAlPiUKIGZpbHRlcihpc0NvdmlkRGF0YSA9PTAgKSAlPiUKICBncm91cF9ieShjb21wbGV4aXR5KSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4odmlzLnRydXN0XzYpLAogICAgICAgICAgICBzZSA9IHNkKHZpcy50cnVzdF82KS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbikKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gY29tcGxleGl0eSAgKiBjaGFydFR5cGUgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMlPiVmaWx0ZXIoaXNDb3ZpZERhdGEgPT0gMSkKIGZpbHRlcihpc0NvdmlkRGF0YSA9PTEgKSkKYW5vdmEobW9kZWwpCmBgYApgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gY29tcGxleGl0eSAgKiBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpICsgY2hhcnRUeXBlICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzJT4lIGZpbHRlcihjb21wbGV4aXR5ICE9J21vZGVyYXRleCcpKQphbm92YShtb2RlbCkKCgpgYGAKCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gY29tcGxleGl0eSAqIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkgKyBjaGFydFR5cGUgKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCgoKYGBgCgoKTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwgZm9yIHRydXN0IGluIHZpcyBhcyBhIGZ1bmN0aW9uIG9mIApgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gY29tcGxleGl0eSAqIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkgKiBjaGFydFR5cGUgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEluY29tZSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCgoKYGBgCmBgYHtyfQojIGNhbiBjaGFuZ2UgdGhlIHByZWRpY3RvciB0byBiYXIudmlzCm1vZGVsPC0gbWFub3ZhKGNiaW5kKHZpcy50cnVzdF82LCAKICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzUsIAogICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfNCwgCiAgICAgICAgICAgICAgICAgICAgIHZpcy50cnVzdF8zLCAKICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzIsIAogICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfMSkgfiBjb21wbGV4aXR5ICAqIGNoYXJ0VHlwZSAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMgJT4lZmlsdGVyKGlzQ292aWREYXRhID09IDEpKQpzdW1tYXJ5LmFvdihtb2RlbCkKYGBgCgpgYGB7cn0KIyBwb3N0LWhvYyB0ZXN0cwphb3YodmlzLnRydXN0XzYgfiBjb21wbGV4aXR5ICogYXMuZmFjdG9yKGlzQ292aWREYXRhKSwgZGF0YSA9IHJlc3VsdHMpICU+JSB0dWtleV9oc2QoKQojIGVmZmVjdCBzaXplcwpldGFfc3F1YXJlZChhb3YodmlzLnRydXN0XzYgfiBjb21wbGV4aXR5ICogYXMuZmFjdG9yKGlzQ292aWREYXRhKSAqIGNoYXJ0VHlwZSArIAogICAgICAgICAgICAgICAgICArIEFnZSArIGFzLmZhY3RvcihHZW5kZXIpICsgU3RhdGVfMSArIGFzLmZhY3RvcihFZHVjYXRpb24pICsgYXMuZmFjdG9yKFBhcmVudHNfZWR1Y2F0aW9uKSArIGFzLmZhY3RvcihMYW5ndWFnZSkgKyBhcy5mYWN0b3IoRXRobmljaXR5KSArIGFzLmZhY3RvcihJbmNvbWUpICsgYXMuZmFjdG9yKFJlbGlnaW9uKSArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIAogICAgICAgICAgICAgICAgICBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgICBkYXRhID0gcmVzdWx0cykpCmBgYCAKIyBDb2xpbmVhcml0eSBvZiB0cnVzdCBpbiB2aXMgYW5kIHRydXN0IGluIGRhdGEKYGBge3J9CmNvbGluZWFyaXR5X21vZGVsIDwtIGxtKGZvcm11bGEgPSBBZ2UgfiB2aXMudHJ1c3RfMSArIHZpcy50cnVzdF8yICsgdmlzLnRydXN0XzMgKyBhZmZlY3Quc2NpZW5jZV8xICsgYWZmZWN0LmNsYXJpdHlfMSArIGFmZmVjdC5hZXN0aGV0aWNfMSArIHZpcy50cnVzdF82ICsgZGF0YS50cnVzdF8xICsgZGF0YS50cnVzdF8yICsgZGF0YS50cnVzdF8zICsgZGF0YS50cnVzdF80ICsgZGF0YS50cnVzdF81ICsgZGF0YS50cnVzdF82ICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKdmlmKGNvbGluZWFyaXR5X21vZGVsKQpgYGAKCnZpZihjb2xpbmVhcml0eV9tb2RlbClyZWxhdGlvbiBvZiB0cnVzdCBpbiB2aXMgYW5kIHRydXN0IGluIGRhdGEKYGBge3J9CmRhdGFfZnJhbWUgPSBkYXRhLmZyYW1lKHJlc3VsdHMkdmlzLnRydXN0XzEsIHJlc3VsdHMkdmlzLnRydXN0XzIsIHJlc3VsdHMkdmlzLnRydXN0XzMsIHJlc3VsdHMkYWZmZWN0LnNjaWVuY2VfMSwgcmVzdWx0cyRhZmZlY3QuY2xhcml0eV8xLCByZXN1bHRzJGFmZmVjdC5hZXN0aGV0aWNfMSwgcmVzdWx0cyR2aXMudHJ1c3RfNiwgcmVzdWx0cyRkYXRhLnRydXN0XzEsIHJlc3VsdHMkZGF0YS50cnVzdF8yLCByZXN1bHRzJGRhdGEudHJ1c3RfMywgcmVzdWx0cyRkYXRhLnRydXN0XzQsIHJlc3VsdHMkZGF0YS50cnVzdF81LCByZXN1bHRzJGRhdGEudHJ1c3RfNiwgcmVzdWx0cyRpbnRlcnBlcnNvbmFsLnRydXN0XzEsIHJlc3VsdHMkdHJ1c3QuaW4uc2NpZW5jZV83LCByZXN1bHRzJG5lZWRfZm9yX2NvZ25pdGlvbikKY29yKGRhdGFfZnJhbWUpCmBgYAoKIyBUcnVzdCBpbiBzY2llbmNlLCBuZWVkIGZvciBjb2duaXRpb24sIGFuZCBpbnRlcnBlcnNvbmFsIHRydXN0IG9uIHRydXN0IGluIFZpcwpgYGB7cn0KcmVzdWx0cyAlPiUKICBnYXRoZXIoa2V5ID0gdmFyaWFibGVzLCB2YWx1ZSA9IHZhbHVlcywgCiAgICAgICAgIHRydXN0LmluLnNjaWVuY2VfNywgbmVlZF9mb3JfY29nbml0aW9uLCBpbnRlcnBlcnNvbmFsLnRydXN0XzEpICU+JQogIGdncGxvdChhZXMoeCA9IHZhbHVlcywgeSA9IHZpcy50cnVzdF82LCBjb2xvciA9IHZhcmlhYmxlcykpICsKCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh2YXJpYWJsZXMpKSArCiAgICBnZW9tX2ppdHRlcigpICsKICBnZW9tX3Ntb290aChjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2JsYW5rKCkgKyAKICAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgyLCAibGluZXMiKSkKYGBgCgoKCgoKClRydXN0IGluIERhdGEKCmBgYHtyfQpyZXN1bHRzICU+JQogIGdncGxvdChhZXMoeCA9IGRhdGEudHJ1c3RfNiwgeSA9IGlzQ292aWREYXRhLCBjb2xvdXIgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21faml0dGVyKGRhdGEgPSByZXN1bHRzLCB3aWR0aCA9IDAuNSkgKwogICMgbGFicyh0aXRsZSA9ICJUcnVzdCBpbiBkYXRhIikgKyAKICBnZW9tX3ZsaW5lKGRhdGEgPSByZXN1bHRzICU+JSAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbXBsZXhpdHksIGlzQ292aWREYXRhLCBjaGFydFR5cGUpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudHJ1c3RfNiA9IG1lYW4oZGF0YS50cnVzdF82KSksIAogICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gZGF0YS50cnVzdF82LCBjb2xvdXIgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY29tcGxleGl0eSksIGNvbHMgPSB2YXJzKGNoYXJ0VHlwZSkpICsKICB0aGVtZV9taW5pbWFsKCkKCnJlc3VsdHMgJT4lIAogIGdyb3VwX2J5KGNvbXBsZXhpdHksIGlzQ292aWREYXRhKSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKGRhdGEudHJ1c3RfNiksCiAgICAgICAgICAgIHNlID0gc2QoZGF0YS50cnVzdF82KS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbikKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfNiB+IGNvbXBsZXhpdHkgKiBjaGFydFR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMlPiUgZmlsdGVyKGlzQ292aWREYXRhID09IDApKQphbm92YShtb2RlbCkKCgpgYGAKCmBgYHtyfQojIHBvc3QtaG9jIHRlc3RzCmFvdihkYXRhLnRydXN0XzYgfiBjb21wbGV4aXR5ICogYXMuZmFjdG9yKGlzQ292aWREYXRhKSwgZGF0YSA9IHJlc3VsdHMpICU+JSB0dWtleV9oc2QoKQphb3YoZGF0YS50cnVzdF82IH4gY2hhcnRUeXBlICogYXMuZmFjdG9yKGlzQ292aWREYXRhKSwgZGF0YSA9IHJlc3VsdHMpICU+JSB0dWtleV9oc2QoKQojIGVmZmVjdCBzaXplcwpldGFfc3F1YXJlZChhb3YoZGF0YS50cnVzdF82IH4gY29tcGxleGl0eSAqIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkgKiBjaGFydFR5cGUgKyAKICAgICAgICAgICAgICAgICAgQWdlICsgYXMuZmFjdG9yKEdlbmRlcikgKyBTdGF0ZV8xICsgYXMuZmFjdG9yKEVkdWNhdGlvbikgKyBhcy5mYWN0b3IoUGFyZW50c19lZHVjYXRpb24pICsgYXMuZmFjdG9yKExhbmd1YWdlKSArIAogICAgICAgICAgICAgICAgICBhcy5mYWN0b3IoRXRobmljaXR5KSArIGFzLmZhY3RvcihJbmNvbWUpICsgYXMuZmFjdG9yKFJlbGlnaW9uKSArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIAogICAgICAgICAgICAgICAgICBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgICBkYXRhID0gcmVzdWx0cykpCmVtbWVhbnMoYW92KGRhdGEudHJ1c3RfNiB+IGNvbXBsZXhpdHkgLCBkYXRhID0gcmVzdWx0cykgLCB+IGNvbXBsZXhpdHkpCmBgYAoKVHJ1c3QgaW4gc2NpZW5jZSwgbmVlZCBmb3IgY29nbml0aW9uLCBhbmQgaW50ZXJwZXJzb25hbCB0cnVzdCBvbiB0cnVzdCBpbiBEYXRhCmBgYHtyfQpyZXN1bHRzICU+JQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZXMsIHZhbHVlID0gdmFsdWVzLCAKICAgICAgICAgdHJ1c3QuaW4uc2NpZW5jZV83LCBuZWVkX2Zvcl9jb2duaXRpb24sIGludGVycGVyc29uYWwudHJ1c3RfMSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWVzLCB5ID0gZGF0YS50cnVzdF82LCBjb2xvciA9IHZhcmlhYmxlcykpICsKCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyh2YXJpYWJsZXMpKSArCiAgICBnZW9tX2ppdHRlcigpICsKICBnZW9tX3Ntb290aChjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2JsYW5rKCkgKyAKICAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgyLCAibGluZXMiKSkKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCmBgYHtyfQpyZXN1bHRzX2xvbmdfZGF0YSA8LSByZXN1bHRzICU+JQogIHNlbGVjdChkYXRhLnRydXN0XzEsIGRhdGEudHJ1c3RfMiwgZGF0YS50cnVzdF8zLAogICAgICAgICBkYXRhLnRydXN0XzQsIGRhdGEudHJ1c3RfNSwgZGF0YS50cnVzdF82LAogICAgICAgICBSZXNwb25zZUlkLCBjb21wbGV4aXR5LAogICAgICAgICB2bGF0X3NpbXBsZSwgdmxhdF9tb2RlcmF0ZSwgdmxhdF9jb21wbGV4KSAlPiUKICBnYXRoZXIoa2V5ID0gdHJ1c3RJdGVtRGF0YSwgdmFsdWUgPSB0cnVzdFJhdGluZ0RhdGEsIAogICAgICAgICBkYXRhLnRydXN0XzEsIGRhdGEudHJ1c3RfMiwgZGF0YS50cnVzdF8zLCBkYXRhLnRydXN0XzQsIGRhdGEudHJ1c3RfNSwgZGF0YS50cnVzdF82KQoKcmVzdWx0c19sb25nX2RhdGEgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdHJ1c3RSYXRpbmdEYXRhLCB5ID0gMSwgY29sb3IgPSBjb21wbGV4aXR5KSkgKwogIGdlb21faml0dGVyKCkgKwogIHlsaW0oMCwgMikgKyAKICBsYWJzKHRpdGxlID0gIlRydXN0IGluIGRhdGEgKEFsbCkiKSArIAogIGdlb21fdmxpbmUoZGF0YSA9IHJlc3VsdHNfbG9uZ19kYXRhICU+JSAKICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSwgdHJ1c3RJdGVtRGF0YSkgJT4lCiAgICAgICAgICAgICAgIHN1bW1hcml6ZShuID0gbigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2UgPSBtZWFuKHRydXN0UmF0aW5nRGF0YSkpLCAKICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gYXZlcmFnZSwgY29sb3IgPSBjb21wbGV4aXR5KSkgKwogIGZhY2V0X2dyaWQodmFycyh0cnVzdEl0ZW1EYXRhKSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgojIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRydXN0IGluIGRhdGEgYW5kIHZpcywgYWNyb3NzIGNvbXBsZXhpdHkKCmBgYHtyfQpyZXN1bHRzX2xvbmdfZGF0YSA8LSByZXN1bHRzICU+JQogIHNlbGVjdChkYXRhLnRydXN0XzEsIGRhdGEudHJ1c3RfMiwgZGF0YS50cnVzdF8zLAogICAgICAgICBkYXRhLnRydXN0XzQsIGRhdGEudHJ1c3RfNSwgZGF0YS50cnVzdF82LAogICAgICAgICBSZXNwb25zZUlkLCBjb21wbGV4aXR5LAogICAgICAgICBjaGFydFR5cGUsIGlzQ292aWREYXRhLCAKICAgICAgICAgdmxhdF9zaW1wbGUsIHZsYXRfbW9kZXJhdGUsIHZsYXRfY29tcGxleCkgJT4lCiAgZ2F0aGVyKGtleSA9IHRydXN0SXRlbURhdGEsIHZhbHVlID0gdHJ1c3RSYXRpbmdEYXRhLCAKICAgICAgICAgIyBkYXRhLnRydXN0XzEsIGRhdGEudHJ1c3RfMiwgZGF0YS50cnVzdF8zLCBkYXRhLnRydXN0XzQsIGRhdGEudHJ1c3RfNSwgCiAgICAgICAgIGRhdGEudHJ1c3RfNikKCnJlc3VsdHNfbG9uZ192aXMgPC0gcmVzdWx0cyAlPiUKICBnYXRoZXIoa2V5ID0gdHJ1c3RJdGVtVmlzLCB2YWx1ZSA9IHRydXN0UmF0aW5nVmlzLCAKICAgICAgICAgIyB2aXMudHJ1c3RfMSwgdmlzLnRydXN0XzIsIHZpcy50cnVzdF8zLCB2aXMudHJ1c3RfNCwgdmlzLnRydXN0XzUsIAogICAgICAgICB2aXMudHJ1c3RfNikKCnJlc3VsdHNfbG9uZ19hbGwgPC0gbWVyZ2UocmVzdWx0c19sb25nX3ZpcywgcmVzdWx0c19sb25nX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiUmVzcG9uc2VJZCIsICJjb21wbGV4aXR5IiwgImNoYXJ0VHlwZSIsICJpc0NvdmlkRGF0YSIpKQoKbW9kZWw8LSBnbG0odHJ1c3RSYXRpbmdWaXMgfiAgdHJ1c3RSYXRpbmdEYXRhICogY29tcGxleGl0eSArIAogICAgICAgICAgICAgIHRydXN0UmF0aW5nRGF0YSAqICBjaGFydFR5cGUgKyAKICAgICAgICAgICAgICB0cnVzdFJhdGluZ0RhdGEgKiAgYXMuZmFjdG9yKGlzQ292aWREYXRhKSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzX2xvbmdfYWxsKQpBbm92YShtb2RlbCkKYGBgCgpgYGB7cn0KcmVzdWx0c19sb25nX2FsbCAlPiUKICAjIGZpbHRlcih0cnVzdEl0ZW1WaXMgPT0gImJhci52aXNfMiIpICU+JQogIGdncGxvdChhZXMoeCA9IHRydXN0UmF0aW5nVmlzLCB5ID0gdHJ1c3RSYXRpbmdEYXRhLCBjb2xvciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjI1KSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIiwKICAgICAgICAgICAgICBmb3JtdWxhID0geSB+IHgsCiAgICAgICAgICAgICAgZ2VvbSA9ICJzbW9vdGgiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXd0ZWVuIHRydXN0IGluIFZpcyBhbmQgRGF0YSIpICsgCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjaGFydFR5cGUpLCBjb2xzID0gdmFycyhjb21wbGV4aXR5KSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgoKIyBEbyB0aGUgdHJ1c3QgaXRlbXMgcHJlZGljdCB0cnVzdD8KCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IHZpcy50cnVzdF82IH4gdmlzLnRydXN0XzEgKyAKICAgICAgICAgICAgICB2aXMudHJ1c3RfMiArIAogICAgICAgICAgICAgIHZpcy50cnVzdF8zICsgCiAgICAgICAgICAgICAgdmlzLnRydXN0XzQgKyAKICAgICAgICAgICAgICB2aXMudHJ1c3RfNSArIAogICAgICAgICAgICAgIGFmZmVjdC5zY2llbmNlXzEgKwogICAgICAgICAgICAgIGFmZmVjdC5jbGFyaXR5XzEgKyAKICAgICAgICAgICAgICBhZmZlY3QuYWVzdGhldGljXzEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfNiB+IGRhdGEudHJ1c3RfMSArIAogICAgICAgICAgICAgIGRhdGEudHJ1c3RfMiArIAogICAgICAgICAgICAgIGRhdGEudHJ1c3RfMyArIAogICAgICAgICAgICAgIGRhdGEudHJ1c3RfNCArIAogICAgICAgICAgICAgIGRhdGEudHJ1c3RfNSArCiAgICAgICAgICAgICAgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAogICAgICAgICAgICAgIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCnN1bW1hcnkobW9kZWwpCmBgYAoKIyBXaGljaCB0cnVzdCBtZWFzdXJlbWVudHMgcHJlZGljdCBiZWhhdmlvcmFsIG91dGNvbWVzPwoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfNCB+IHZpcy50cnVzdF8xICsgCiAgICAgICAgICAgICAgdmlzLnRydXN0XzIgKyAKICAgICAgICAgICAgICB2aXMudHJ1c3RfMyArCiAgICAgICAgICAgICAgdmlzLnRydXN0XzYgKwogICAgICAgICAgICAgIGFmZmVjdC5zY2llbmNlXzEgKwogICAgICAgICAgICAgIGFmZmVjdC5jbGFyaXR5XzEgKyAKICAgICAgICAgICAgICBhZmZlY3QuYWVzdGhldGljXzEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gdmlzLnRydXN0XzUgfiB2aXMudHJ1c3RfMSArIAogICAgICAgICAgICAgIHZpcy50cnVzdF8yICsgCiAgICAgICAgICAgICAgdmlzLnRydXN0XzMgKwogICAgICAgICAgICAgIHZpcy50cnVzdF82ICsKICAgICAgICAgICAgICBhZmZlY3Quc2NpZW5jZV8xICsKICAgICAgICAgICAgICBhZmZlY3QuY2xhcml0eV8xICsgCiAgICAgICAgICAgICAgYWZmZWN0LmFlc3RoZXRpY18xICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKc3VtbWFyeShtb2RlbCkKYGBgCgoKYGBge3J9CnJlc3VsdHMgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZGF0YS50cnVzdF8xLCB5ID0gZGF0YS50cnVzdF82LCBjb2xvciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZ2VvbV9qaXR0ZXIoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBmYWNldF93cmFwKH5pc0NvdmlkRGF0YSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgoKCgoKCgoKSG93IGRvZXMgcGVyZm9ybWFuY2Ugb24gVkxBVCBxdWVzdGlvbnMgcHJlZGljdCB0cnVzdD8KCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gdmlzLnRydXN0XzYgfiAgYXNzaWduZWRfdmxhdCAqCiAgICAgICAgICAgICAgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAogICAgICAgICAgICAgIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQoKZW1tZWFucyhhb3YodmlzLnRydXN0XzYgfiB2bGF0X3NpbXBsZSAqIHZsYXRfY29tcGxleCAsIGRhdGEgPSByZXN1bHRzKSAsIH4gdmxhdF9zaW1wbGUgfCB2bGF0X2NvbXBsZXgpCmBgYAoKYGBge3J9CnJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IHZsYXRfbGV2ZWwsIHZhbHVlID0gdmxhdF9wZXJmb3JtYW5jZSwgdmxhdF9zaW1wbGUsICB2bGF0X21vZGVyYXRlLCB2bGF0X2NvbXBsZXgpICU+JQogIGdncGxvdChhZXMoeCA9IHZpcy50cnVzdF82LCB5ID0gdmxhdF9wZXJmb3JtYW5jZSwgY29sb3VyID0gYXMuZmFjdG9yKGFzc2lnbmVkX3ZsYXQpKSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC41KSArCiAgIyB5KDAsIDIpICsgCiAgIyBsYWJzKHRpdGxlID0gIlRydXN0IGluIGRhdGEiKSArIAogICMgZ2VvbV92bGluZShkYXRhID0gcmVzdWx0cyAlPiUgCiAgIyAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogICMgICAgICAgICAgICAgIHN1bW1hcml6ZShuID0gbigpLCAKICAjICAgICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzYgPSBtZWFuKHZpcy50cnVzdF82KSksIAogICMgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHZpcy50cnVzdF82LCBjb2xvdXIgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnModmxhdF9sZXZlbCksIGNvbHMgPSB2YXJzKGNoYXJ0VHlwZSkpICsKICB0aGVtZV9taW5pbWFsKCkgKyAKICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgyLCAibGluZXMiKSkKICAgICAgICAjIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgoKT3ZlcmFsbCBkaXN0cmlidXRpb24gb2YgVkxBVCBwZXJmb3JtYW5jZQoKVHJ1c3QgaW4gVmlzIApgYGB7cn0KIyB2bGF0X2xvbmcgPC0gcmVzdWx0cyAlPiUKIyAgIGdhdGhlcihrZXkgPSB2bGF0X2xldmVsLCB2YWx1ZSA9IHZsYXRfcGVyZm9ybWFuY2UsIHZsYXRfc2ltcGxlLCAgdmxhdF9tb2RlcmF0ZSwgdmxhdF9jb21wbGV4KSAKIyAKIyBtb2RlbCA8LSBsbWVyKGZvcm11bGEgPSB2bGF0X3BlcmZvcm1hbmNlIH4gdmxhdF9sZXZlbCAqIGlzQ292aWREYXRhICogY2hhcnRUeXBlICsKIyAgICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiMgICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAojICAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICsgKDF8UmVzcG9uc2VJZCksCiMgICAgICAgICAgICAgZGF0YSA9IHZsYXRfbG9uZykKIyBBbm92YShtb2RlbCkKIyAKIyBlbW1lYW5zKGFvdih2bGF0X3BlcmZvcm1hbmNlIH4gdmxhdF9sZXZlbCAsIGRhdGEgPSByZXN1bHRzKSAsIH4gdmxhdF9zaW1wbGUgfCB2bGF0X2NvbXBsZXgpCiMgCiMgIyBwb3N0LWhvYyB0ZXN0cwojIGFvdih2bGF0X3BlcmZvcm1hbmNlIH4gdmxhdF9sZXZlbCAqIGFzLmZhY3Rvcihpc0NvdmlkRGF0YSksIGRhdGEgPSB2bGF0X2xvbmcpICU+JSB0dWtleV9oc2QoKQpgYGAKCmBgYHtyfQpyZXN1bHRzICU+JQogIGdhdGhlcihrZXkgPSB2bGF0X2xldmVsLCB2YWx1ZSA9IHZsYXRfcGVyZm9ybWFuY2UsIHZsYXRfc2ltcGxlLCAgdmxhdF9tb2RlcmF0ZSwgdmxhdF9jb21wbGV4KSAlPiUKICBncm91cF9ieSh2bGF0X2xldmVsLCBjaGFydFR5cGUsIGlzQ292aWREYXRhKSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwKICAgICAgICAgICAgbWVhbl92bGF0X3BlcmZvcm1hbmNlID0gbWVhbih2bGF0X3BlcmZvcm1hbmNlKSwKICAgICAgICAgICAgc2UgPSBzZCh2bGF0X3BlcmZvcm1hbmNlKS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB2bGF0X2xldmVsLCB5ID0gbWVhbl92bGF0X3BlcmZvcm1hbmNlLCAKICAgICAgICAgICAgIHltYXggPSBtZWFuX3ZsYXRfcGVyZm9ybWFuY2UgKyBzZSwgeW1pbiA9IG1lYW5fdmxhdF9wZXJmb3JtYW5jZSAtIHNlLAogICAgICAgICAgICAgY29sb3VyID0gdmxhdF9sZXZlbCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fZXJyb3JiYXIoKSArCiAgIyBsYWJzKHRpdGxlID0gIlRydXN0IGluIGRhdGEiKSArIAogICMgZ2VvbV92bGluZShkYXRhID0gcmVzdWx0cyAlPiUgCiAgIyAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tcGxleGl0eSwgaXNDb3ZpZERhdGEpICU+JQogICMgICAgICAgICAgICAgIHN1bW1hcml6ZShuID0gbigpLCAKICAjICAgICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzYgPSBtZWFuKHZpcy50cnVzdF82KSksIAogICMgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHZpcy50cnVzdF82LCBjb2xvdXIgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoaXNDb3ZpZERhdGEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGFuZWwuc3BhY2luZyA9IHVuaXQoMiwgImxpbmVzIikpCiAgICAgICAgIyBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKClRydXN0IGluIERhdGEKCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfNiB+IHZsYXRfc2ltcGxlICogdmxhdF9tb2RlcmF0ZSAqIHZsYXRfY29tcGxleCArCiAgICAgICAgICAgICAgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyAKICAgICAgICAgICAgICBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIAogICAgICAgICAgICAgIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQoKZW1tZWFucyhhb3YoZGF0YS50cnVzdF82IH4gdmxhdF9zaW1wbGUgKiB2bGF0X2NvbXBsZXggLCBkYXRhID0gcmVzdWx0cykgLCB+IHZsYXRfc2ltcGxlIHwgdmxhdF9jb21wbGV4KQpgYGAKCgoKCgoKCgoKCiMgV2hpY2ggYW50ZWNlZGVudCBkcml2ZXMgdGhlIGludGVyYWN0aW9uIGVmZmVjdCBmb3IgdHJ1c3QgaW4gdmlzdWFsaXphdGlvbiBmb3IgY292aWQgZGF0YT8KCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gdmlzLnRydXN0XzEgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzICU+JSBmaWx0ZXIoaXNDb3ZpZERhdGEgPT0gMSkpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gdmlzLnRydXN0XzIgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzICU+JSBmaWx0ZXIoaXNDb3ZpZERhdGEgPT0gMSkpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gdmlzLnRydXN0XzMgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzICU+JSBmaWx0ZXIoaXNDb3ZpZERhdGEgPT0gMSkpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gYWZmZWN0LnNjaWVuY2VfMSB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMgJT4lIGZpbHRlcihpc0NvdmlkRGF0YSA9PSAxKSkKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBhZmZlY3QuY2xhcml0eV8xIH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cyAlPiUgZmlsdGVyKGlzQ292aWREYXRhID09IDEpKQphbm92YShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGFmZmVjdC5hZXN0aGV0aWNfMSB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMgJT4lIGZpbHRlcihpc0NvdmlkRGF0YSA9PSAxKSkKYW5vdmEobW9kZWwpCmBgYAoKIyBXaGljaCBhbnRlY2VkZW50IGRyaXZlcyB0aGUgbWFpbiBlZmZlY3QgZm9yIHRydXN0IGluIGRhdGE/CgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfMSB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZGF0YS50cnVzdF8yIH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBkYXRhLnRydXN0XzMgfiBjb21wbGV4aXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQWdlICsgR2VuZGVyICsgU3RhdGVfMSArIEVkdWNhdGlvbiArIFBhcmVudHNfZWR1Y2F0aW9uICsgTGFuZ3VhZ2UgKyBFdGhuaWNpdHkgKyBJbmNvbWUgKyBSZWxpZ2lvbiArIHRydXN0LmluLnNjaWVuY2VfNyArIG5lZWRfZm9yX2NvZ25pdGlvbiArIGludGVycGVyc29uYWwudHJ1c3RfMSAsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfNCB+IGNvbXBsZXhpdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xICwKICAgICAgICAgICAgZGF0YSA9IHJlc3VsdHMpCmFub3ZhKG1vZGVsKQpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZGF0YS50cnVzdF81IH4gY29tcGxleGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEgLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCmBgYAoKIyBIb3cgZG9lcyBwcm92ZW5hbmNlIGRhdGEgcHJlZGljdCB0cnVzdD8KCk92ZXJhbGwKCmBgYHtyfQpicnVzaGVkIDwtIHJlc3VsdHMgJT4lCiAgZ2F0aGVyKGtleSA9IHByb3ZlbmFuY2VfdHlwZSwgdmFsdWUgPSBwcm92ZW5hbmNlX3ZhbHVlLCBicnVzaGVkLCBleHBsb3JlX2ludGVyYWN0aW9ucywgZXhwbG9yZV90aW1lKSAlPiUKICBncm91cF9ieShwcm92ZW5hbmNlX3R5cGUsIGNoYXJ0VHlwZSwgaXNDb3ZpZERhdGEsIGNvbXBsZXhpdHkpICU+JQogIHN1bW1hcml6ZShuID0gbigpLCAKICAgICAgICAgICAgbWVhbiA9IG1lYW4ocHJvdmVuYW5jZV92YWx1ZSksIAogICAgICAgICAgICBzZSA9IHNkKHByb3ZlbmFuY2VfdmFsdWUpL3NxcnQobiksCiAgICAgICAgICAgIG4gPSBuKSAlPiUKICBmaWx0ZXIocHJvdmVuYW5jZV90eXBlID09ICJicnVzaGVkIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJvdmVuYW5jZV90eXBlLCB5ID0gbWVhbiwgeW1heCA9IG1lYW4gKyBzZSwgeW1pbiA9IG1lYW4gLSBzZSwgY29sb3IgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAwLjUpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IDAuNSwgc2l6ZSA9IDAuNjYsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY29tcGxleGl0eSksIGNvbHMgPSB2YXJzKGlzQ292aWREYXRhKSkgKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKQpicnVzaGVkCgppbnRlcmFjdGlvbnMgPC0gcmVzdWx0cyAlPiUKICBnYXRoZXIoa2V5ID0gcHJvdmVuYW5jZV90eXBlLCB2YWx1ZSA9IHByb3ZlbmFuY2VfdmFsdWUsIGJydXNoZWQsIGV4cGxvcmVfaW50ZXJhY3Rpb25zLCBleHBsb3JlX3RpbWUpICU+JQogIGdyb3VwX2J5KHByb3ZlbmFuY2VfdHlwZSwgY2hhcnRUeXBlLCBpc0NvdmlkRGF0YSwgY29tcGxleGl0eSkgJT4lCiAgc3VtbWFyaXplKG4gPSBuKCksIAogICAgICAgICAgICBtZWFuID0gbWVhbihwcm92ZW5hbmNlX3ZhbHVlKSwgCiAgICAgICAgICAgIHNlID0gc2QocHJvdmVuYW5jZV92YWx1ZSkvc3FydChuKSwKICAgICAgICAgICAgbiA9IG4pICU+JQogIGZpbHRlcihwcm92ZW5hbmNlX3R5cGUgPT0gImV4cGxvcmVfaW50ZXJhY3Rpb25zIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJvdmVuYW5jZV90eXBlLCB5ID0gbWVhbiwgeW1heCA9IG1lYW4gKyBzZSwgeW1pbiA9IG1lYW4gLSBzZSwgY29sb3IgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAwLjUpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IDAuNSwgc2l6ZSA9IDAuNjYsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY29tcGxleGl0eSksIGNvbHMgPSB2YXJzKGNoYXJ0VHlwZSkpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgyLCAibGluZXMiKSkKaW50ZXJhY3Rpb25zCgpleHBsb3JlVGltZSA8LSByZXN1bHRzICU+JQogIGdhdGhlcihrZXkgPSBwcm92ZW5hbmNlX3R5cGUsIHZhbHVlID0gcHJvdmVuYW5jZV92YWx1ZSwgYnJ1c2hlZCwgZXhwbG9yZV9pbnRlcmFjdGlvbnMsIGV4cGxvcmVfdGltZSkgJT4lCiAgZ3JvdXBfYnkocHJvdmVuYW5jZV90eXBlLCBjaGFydFR5cGUsIGlzQ292aWREYXRhLCBjb21wbGV4aXR5KSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSwgCiAgICAgICAgICAgIG1lYW4gPSBtZWFuKHByb3ZlbmFuY2VfdmFsdWUpLCAKICAgICAgICAgICAgc2UgPSBzZChwcm92ZW5hbmNlX3ZhbHVlKS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbikgJT4lCiAgZmlsdGVyKHByb3ZlbmFuY2VfdHlwZSA9PSAiZXhwbG9yZV90aW1lIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJvdmVuYW5jZV90eXBlLCB5ID0gbWVhbiwgeW1heCA9IG1lYW4gKyBzZSwgeW1pbiA9IG1lYW4gLSBzZSwgY29sb3IgPSBhcy5mYWN0b3IoaXNDb3ZpZERhdGEpKSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAwLjUpKSArCiAgZ2VvbV9lcnJvcmJhcih3aWR0aCA9IDAuNSwgc2l6ZSA9IDAuNjYsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY2hhcnRUeXBlKSwgY29scyA9IHZhcnMoY29tcGxleGl0eSkpICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nID0gdW5pdCgyLCAibGluZXMiKSkKZXhwbG9yZVRpbWUKCmV4cGxvcmVUaW1lICsgaW50ZXJhY3Rpb25zICsgYnJ1c2hlZApnZ3NhdmUoInByb3ZlbmFuY2VSZXN1bHRzLnBuZyIsIHdpZHRoID0gMjYsIGhlaWdodCA9IDE0KQpgYGAKZXhwbG9yZV9pbnRlcmFjdGlvbnMKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZXhwbG9yZV9pbnRlcmFjdGlvbnMgfiBjb21wbGV4aXR5ICogY2hhcnRUeXBlICogaXNDb3ZpZERhdGEgKwogICAgICAgICAgICAgIEFnZSArIEdlbmRlciArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKYGBgCgpleHBsb3JlX3RpbWUKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gZXhwbG9yZV90aW1lIH4gY29tcGxleGl0eSAqIGNoYXJ0VHlwZSAqIGlzQ292aWREYXRhICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCmBgYAoKCgpIeXBvdGhlc2lzOgpmb3IgdGhlIGNvbXBsZXggY29uZGl0aW9uLCB3ZSBleHBlY3QgcGVvcGxlIHdobyBicnVzaGVkIG1vcmUgdG8gaGF2ZSBoaWdoZXIgdHJ1c3QKCmBgYHtyfQpjb21wbGV4Q29uZGl0aW9uIDwtIHJlc3VsdHMgJT4lCiAgZmlsdGVyKGNvbXBsZXhpdHkgPT0gImNvbXBsZXgiKQoKIyBjYW4gY2hhbmdlIHRoZSBwcmVkaWN0b3IgdG8gYmFyLnZpcwptb2RlbDwtIG1hbm92YShjYmluZChkYXRhLnRydXN0XzEsIAogICAgICAgICAgICAgICAgICAgICBkYXRhLnRydXN0XzIsIAogICAgICAgICAgICAgICAgICAgICBkYXRhLnRydXN0XzMsIAogICAgICAgICAgICAgICAgICAgICBkYXRhLnRydXN0XzQsIAogICAgICAgICAgICAgICAgICAgICBkYXRhLnRydXN0XzUsIAogICAgICAgICAgICAgICAgICAgICBkYXRhLnRydXN0XzYpIH4gYnJ1c2hlZCArIGV4cGxvcmVfaW50ZXJhY3Rpb25zICsgZXhwbG9yZV90aW1lLCAKICAgICAgICAgICAgICAgZGF0YSA9IGNvbXBsZXhDb25kaXRpb24pCnN1bW1hcnkuYW92KG1vZGVsKQpgYGAKCkh5cG90aGVzaXM6CmZvciBhbGwgdGhlIGNvbmRpdGlvbnMsIHdlIGV4cGVjdCBwZW9wbGUgd2hvIGhvdmVyZWQgbW9yZSB0byBoYXZlIGhpZ2hlciB0cnVzdAoKCmBgYHtyfQojIGNhbiBjaGFuZ2UgdGhlIHByZWRpY3RvciB0byBiYXIudmlzCm1vZGVsPC0gbWFub3ZhKGNiaW5kKHZpcy50cnVzdF82LCAKICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzUsIAogICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfNCwgCiAgICAgICAgICAgICAgICAgICAgIHZpcy50cnVzdF8zLCAKICAgICAgICAgICAgICAgICAgICAgdmlzLnRydXN0XzIsIAogICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfMSkgfiBicnVzaGVkICsgZXhwbG9yZV9pbnRlcmFjdGlvbnMgKyBleHBsb3JlX3RpbWUsIAogICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKc3VtbWFyeS5hb3YobW9kZWwpCmBgYAoKCgojIEFmZmVjdCBvbiBUcnVzdCB7aXQncyBvd24gc2VjdGlvbn0KCmBgYHtyfQpyZXN1bHRzICU+JQogIGdhdGhlcihrZXkgPSBhZmZlY3RzLCB2YWx1ZSA9IGFmZmVjdFJhdGluZ3MsIGFmZmVjdC5zY2llbmNlXzEsICBhZmZlY3QuY2xhcml0eV8xLCBhZmZlY3QuYWVzdGhldGljXzEpICU+JQogIGdyb3VwX2J5KGFmZmVjdHMsIGNoYXJ0VHlwZSwgaXNDb3ZpZERhdGEsIGNvbXBsZXhpdHkpICU+JQogIHN1bW1hcml6ZShuID0gbigpLAogICAgICAgICAgICBtZWFuID0gbWVhbihhZmZlY3RSYXRpbmdzKSwKICAgICAgICAgICAgc2UgPSBzZChhZmZlY3RSYXRpbmdzKS9zcXJ0KG4pLAogICAgICAgICAgICBuID0gbigpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhZmZlY3RzLCB5ID0gbWVhbiwgCiAgICAgICAgICAgICB5bWF4ID0gbWVhbiArIHNlLCB5bWluID0gbWVhbiAtIHNlLAogICAgICAgICAgICAgY29sb3VyID0gYXMuZmFjdG9yKGlzQ292aWREYXRhKSkpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gMC41KSkgKwogIGdlb21fZXJyb3JiYXIod2lkdGggPSAwLjUsIHNpemUgPSAwLjY2LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAjIGxhYnModGl0bGUgPSAiVHJ1c3QgaW4gZGF0YSIpICsgCiAgIyBnZW9tX3ZsaW5lKGRhdGEgPSByZXN1bHRzICU+JSAKICAjICAgICAgICAgICAgICBncm91cF9ieShjb21wbGV4aXR5LCBpc0NvdmlkRGF0YSkgJT4lCiAgIyAgICAgICAgICAgICAgc3VtbWFyaXplKG4gPSBuKCksIAogICMgICAgICAgICAgICAgICAgICAgICAgICB2aXMudHJ1c3RfNiA9IG1lYW4odmlzLnRydXN0XzYpKSwgCiAgIyAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdmlzLnRydXN0XzYsIGNvbG91ciA9IGFzLmZhY3Rvcihpc0NvdmlkRGF0YSkpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjaGFydFR5cGUpLCBjb2xzID0gdmFycyhjb21wbGV4aXR5KSkgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKQogICAgICAgICMgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpnZ3NhdmUoImFmZmVjdE1lYXN1cmVzLnBuZyIsIHdpZHRoID0gMTcsIGhlaWdodCA9IDkpCmBgYAoKCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gYWZmZWN0LnNjaWVuY2VfMSB+IGNvbXBsZXhpdHkgKiBjaGFydFR5cGUgKiBpc0NvdmlkRGF0YSArCiAgICAgICAgICAgICAgQWdlICsgYXMuZmFjdG9yKEdlbmRlcikgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCmBgYAoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSBhZmZlY3QuY2xhcml0eV8xIH4gY29tcGxleGl0eSAqIGNoYXJ0VHlwZSAqIGlzQ292aWREYXRhICsKICAgICAgICAgICAgICBBZ2UgKyBhcy5mYWN0b3IoR2VuZGVyKSArIFN0YXRlXzEgKyBFZHVjYXRpb24gKyBQYXJlbnRzX2VkdWNhdGlvbiArIExhbmd1YWdlICsgCiAgICAgICAgICAgICAgRXRobmljaXR5ICsgSW5jb21lICsgUmVsaWdpb24gKyB0cnVzdC5pbi5zY2llbmNlXzcgKyAKICAgICAgICAgICAgICBuZWVkX2Zvcl9jb2duaXRpb24gKyBpbnRlcnBlcnNvbmFsLnRydXN0XzEsCiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzKQphbm92YShtb2RlbCkKc3VtbWFyeShtb2RlbCkKYGBgCmBgYHtyfQptb2RlbCA8LSBsbShmb3JtdWxhID0gYWZmZWN0LmFlc3RoZXRpY18xIH4gY29tcGxleGl0eSAqIGNoYXJ0VHlwZSAqIGlzQ292aWREYXRhICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCnN1bW1hcnkobW9kZWwpCmBgYAoKVHJ1c3QgaW4gVmlzCgoKYGBge3J9Cm1vZGVsIDwtIGxtKGZvcm11bGEgPSB2aXMudHJ1c3RfNiB+IGFmZmVjdC5zY2llbmNlXzEgKiBhZmZlY3QuY2xhcml0eV8xICogYWZmZWN0LmFlc3RoZXRpY18xICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCnN1bW1hcnkobW9kZWwpCgplbW1lYW5zKGFvdih2aXMudHJ1c3RfNiB+IGFmZmVjdC5zY2llbmNlXzEgKiBhZmZlY3QuY2xhcml0eV8xICwgZGF0YSA9IHJlc3VsdHMpICwgfiBhZmZlY3QuY2xhcml0eV8xKQpgYGAKCgpUcnVzdCBpbiBEYXRhCgpgYGB7cn0KbW9kZWwgPC0gbG0oZm9ybXVsYSA9IGRhdGEudHJ1c3RfNiB+IGFmZmVjdC5zY2llbmNlXzEgKiBhZmZlY3QuY2xhcml0eV8xICogYWZmZWN0LmFlc3RoZXRpY18xICsKICAgICAgICAgICAgICBBZ2UgKyBHZW5kZXIgKyBTdGF0ZV8xICsgRWR1Y2F0aW9uICsgUGFyZW50c19lZHVjYXRpb24gKyBMYW5ndWFnZSArIAogICAgICAgICAgICAgIEV0aG5pY2l0eSArIEluY29tZSArIFJlbGlnaW9uICsgdHJ1c3QuaW4uc2NpZW5jZV83ICsgCiAgICAgICAgICAgICAgbmVlZF9mb3JfY29nbml0aW9uICsgaW50ZXJwZXJzb25hbC50cnVzdF8xLAogICAgICAgICAgICBkYXRhID0gcmVzdWx0cykKYW5vdmEobW9kZWwpCgplbW1lYW5zKGFvdihkYXRhLnRydXN0XzYgfiBhZmZlY3Quc2NpZW5jZV8xICogYWZmZWN0LmNsYXJpdHlfMSAsIGRhdGEgPSByZXN1bHRzKSAsIH4gYWZmZWN0LmNsYXJpdHlfMSkKYGBgCgoKCgoKCgoKCgojIEZhY3RvciBBbmFseXNpcyAKCgpgYGB7cn0KZmFjdG9yQW5hbHlzaXMgPC0gcmVzdWx0cyAlPiUKICBzZWxlY3QoZGF0YS50cnVzdF8xLCBkYXRhLnRydXN0XzIsIGRhdGEudHJ1c3RfMywgZGF0YS50cnVzdF80LCBkYXRhLnRydXN0XzUsIGRhdGEudHJ1c3RfNiwKICAgICAgICAgdmlzLnRydXN0XzEsIHZpcy50cnVzdF8yLCB2aXMudHJ1c3RfMywgdmlzLnRydXN0XzQsIHZpcy50cnVzdF81LCB2aXMudHJ1c3RfNiwKICAgICAgICAgdHJ1c3QuaW4uc2NpZW5jZV8xLCB0cnVzdC5pbi5zY2llbmNlXzIsIHRydXN0LmluLnNjaWVuY2VfMywgdHJ1c3QuaW4uc2NpZW5jZV80LCB0cnVzdC5pbi5zY2llbmNlXzUsCiAgICAgICAgIHRydXN0LmluLnNjaWVuY2VfNiwgdHJ1c3QuaW4uc2NpZW5jZV83LCB0cnVzdC5pbi5zY2llbmNlXzgsIAogICAgICAgICBjb2duaXRpb25fMSwgY29nbml0aW9uXzIsIGNvZ25pdGlvbl8zLCBjb2duaXRpb25fNCwgY29nbml0aW9uXzUsIGNvZ25pdGlvbl82LAogICAgICAgICAjIGJydXNoZWQsIGV4cGxvcmVfaW50ZXJhY3Rpb25zLCAjIGV4cGxvcmVfdGltZSwgCiAgICAgICAgIGludGVycGVyc29uYWwudHJ1c3RfMSwKICAgICAgICAgdmxhdF9zaW1wbGUsIHZsYXRfbW9kZXJhdGUsIHZsYXRfY29tcGxleCwKICAgICAgICAgIyBpbml0aWFsIGltcHJlc3Npb24KICAgICAgICAgYWZmZWN0LnNjaWVuY2VfMSwgYWZmZWN0LmNsYXJpdHlfMSwgYWZmZWN0LmFlc3RoZXRpY18xKQoKbmZhY3RvcnMoZmFjdG9yQW5hbHlzaXMpCmBgYAoKRmFjdG9yIDQgc2VlbSB0byBoYXZlIG1pbmltdW0gY29tcGVseGl0eSwgQklDIGlzIHByZXR0eSBsb3csIGFuZCBiaWcganVtcCBmb3Igcm9vdCBtZWFuCjUgc2VlbXMgbWVoIGJlY3Vhc2Ugb2YgdGhlIGJpZyBqdW1wIGZyb20gNC01IG9uIGNvbXBsZXhpdHkuIAoKYGBge3J9CmY3IDwtIGZhKGZhY3RvckFuYWx5c2lzLCA3KQpwZGYoZmlsZSA9ICJmNy5wZGYiLCAgICMgVGhlIGRpcmVjdG9yeSB5b3Ugd2FudCB0byBzYXZlIHRoZSBmaWxlIGluCiAgICB3aWR0aCA9IDE1LCAjIFRoZSB3aWR0aCBvZiB0aGUgcGxvdCBpbiBpbmNoZXMKICAgIGhlaWdodCA9IDIzKSAjIFRoZSBoZWlnaHQgb2YgdGhlIHBsb3QgaW4gaW5jaGVzCmZhLmRpYWdyYW0oZjcpCmRldi5vZmYoKQojIGJhc2VkIG9uIHRoZSBmYWN0b3IgYW5hbHlzaXMsIGl0IGxvb2tzIGxpa2Ugbm90IGFsbCB0aGUgdmlzIFFzIGdvIHRvZ2V0aGVyIGFuZCBub3QgYWxsIHRoZSBkYXRhIFFzIGdvIHRvZ2V0aGVyLiAKYGBgCgoKCg==
diff --git a/supplementary_materials/VisTrust_Survey.pdf b/supplementary_materials/VisTrust_Survey.pdf
new file mode 100644
index 0000000..f5bc168
Binary files /dev/null and b/supplementary_materials/VisTrust_Survey.pdf differ
diff --git a/supplementary_materials/Vistrust_Supplementary_Tables.pdf b/supplementary_materials/Vistrust_Supplementary_Tables.pdf
new file mode 100644
index 0000000..7028145
Binary files /dev/null and b/supplementary_materials/Vistrust_Supplementary_Tables.pdf differ