Data and Functions

source("0_helpers.R")
load("data/cleaned_selected_wrangled.rdata")
load("data/simulated.rdata")

Distributions

Selection Variables

example_com <- compare(
  example_sim, # The synthetic dataset
  data, # The original dataset
  vars = c("age", "net_income", "relationship_duration_factor"),
  print.coef = TRUE, # Print tables of estimates for original and synthetic data
  ncol = 2,# The number of columns in the plot
  nrow = 1,
  breaks = 16, # Gaps between columns 
  stat = "counts", # Present the raw counts for each variable
  cols = c("#62B6CB", "#1B4965") # Setting the colours in the plot
)

example_com$plots
## [[1]]

## 
## [[2]]

Hormonal Contraception

example_com <- compare(
  example_sim, # The synthetic dataset
  data, # The original dataset
  vars = c("contraception_hormonal", "congruent_contraception"),
  print.coef = TRUE, # Print tables of estimates for original and synthetic data
  ncol = 2, # The number of columns in the plot
  breaks = 16, # Gaps between columns 
  stat = "counts", # Present the raw counts for each variable
  cols = c("#62B6CB", "#1B4965") # Setting the colours in the plot
)

example_com$plots

Outcomes

example_com <- compare(
  example_sim, # The synthetic dataset
  data, # The original dataset
  vars = c("attractiveness_partner",
         "relationship_satisfaction",
         "satisfaction_sexual_intercourse",
         "diary_libido_mean",
         "diary_sex_active_sex_sum",
         "diary_masturbation_sum"),
  print.coef = TRUE, # Print tables of estimates for original and synthetic data
  ncol = 2, # The number of columns in the plot
  nrow = 1,
  breaks = 16, # Gaps between columns 
  stat = "counts", # Present the raw counts for each variable
  cols = c("#62B6CB", "#1B4965") # Setting the colours in the plot
)

example_com$plots
## [[1]]

## 
## [[2]]

## 
## [[3]]

Correlations

Real Data

cor_real = data %>%
  mutate(contraception_hormonal_numeric = ifelse(contraception_hormonal == "yes",
                                                 1,
                                                 ifelse(contraception_hormonal == "no",
                                                        0, NA)),
         congruent_contraception_numeric = ifelse(congruent_contraception == "0",
                                                  0,
                                                  ifelse(congruent_contraception == "1",
                                                         1, NA))) %>%
  select(age, education_years,
         bfi_extra, bfi_neuro, bfi_agree, bfi_consc, bfi_open, religiosity,
         contraception_hormonal_numeric, congruent_contraception_numeric,
         attractiveness_partner,
         relationship_satisfaction,
         satisfaction_sexual_intercourse,
         diary_libido_mean,
         diary_sex_active_sex_sum,
         diary_masturbation_sum) %>%
  corr.test(., minlength = 35)

cor_real_ci = as.data.frame(cor_real$ci) %>%
  rownames_to_column(., "variables")

cor_real_ci = cor_real_ci %>%
  mutate(variables_factor = factor(variables, levels = rev(unique(cor_real_ci$variables))),
         group = "real_data")

ggplot(cor_real_ci, aes(x = variables_factor, y = r)) + 
  geom_pointrange(aes(ymin = lower, ymax = upper)) +
  coord_flip() +
  apatheme +
  theme(text = element_text(size=10))

Simulated Data

example_sim$syn = example_sim$syn %>%
  mutate(contraception_hormonal_numeric = ifelse(contraception_hormonal == "yes",
                                                 1,
                                                 ifelse(contraception_hormonal == "no",
                                                        0, NA)),
         congruent_contraception_numeric = ifelse(congruent_contraception == "0",
                                                  0,
                                                  ifelse(congruent_contraception == "1",
                                                         1, NA)))

cor_sim = example_sim$syn %>%
  select(age, education_years,
         bfi_extra, bfi_neuro, bfi_agree, bfi_consc, bfi_open, religiosity,
         contraception_hormonal_numeric, congruent_contraception_numeric,
         attractiveness_partner,
         relationship_satisfaction,
         satisfaction_sexual_intercourse,
         diary_libido_mean,
         diary_sex_active_sex_sum,
         diary_masturbation_sum) %>%
  corr.test(., minlength = 35)

cor_sim_ci = as.data.frame(cor_sim$ci) %>%
  rownames_to_column(., "variables")

cor_sim_ci = cor_sim_ci %>%
  mutate(variables_factor = factor(variables, levels = rev(unique(cor_sim_ci$variables))),
         group = "simulated_data")

ggplot(cor_sim_ci, aes(x = variables_factor, y = r)) + 
  geom_pointrange(aes(ymin = lower, ymax = upper)) +
  coord_flip() +
  apatheme +
  theme(text = element_text(size=10))

Combined

cor_combined = rbind(cor_real_ci, cor_sim_ci) %>%
  arrange(variables)

plot_cor = function(cor_combined) {
  ggplot(cor_combined, aes(x = variables_factor, y = r, color = group, group = group)) + 
    geom_pointrange(aes(ymin = lower, ymax = upper, color = group, group = group),
                    position = position_dodge(width = 0.5)) +
    coord_flip() +
    apatheme +
    theme(text = element_text(size=10))
}

Age

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "age"))

Years of Education

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "education_years"))

Agreeableness

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "bfi_agree"))

Conscientiousness

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "bfi_consc"))

Openness

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "bfi_open"))

Extraversion

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "bfi_extra"))

Neuroticism

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "bfi_neuro"))

Religiosity

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "religiosity"))

Hormonal contraception

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "contraception_hormonal_numeric"))

Congruent Contraception

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "congruent_contraception_numeric"))

Attractivness Partner

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "attractiveness_partner"))

Relationship Satisfaction

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "relationship_satisfaction"))

Sexual Satisfaction

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "satisfaction_sexual_intercourse"))

Libido

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "diary_libido_mean"))

Sexual Frequency

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "diary_sex_active_sex_sum"))

Masturbation Frequency

plot_cor(cor_combined %>%
           filter(variables_factor %contains% "diary_masturbation_sum"))

Problematic?

cor_combined_wide = cor_combined %>%
  select(variables_factor, group, lower, r, upper) %>%
  pivot_wider(., names_from = group, values_from = c(lower, r, upper)) %>%
  mutate(dif = ifelse(lower_real_data > r_simulated_data, T,
                      ifelse(lower_simulated_data > r_real_data, T,
                             ifelse(upper_real_data < r_simulated_data, T,
                                    ifelse(upper_simulated_data < r_real_data, T,
                                           F)))))

x = cor_combined_wide %>% filter(dif == T)
plot_cor(cor_combined %>%
           filter(variables_factor %in% x$variables_factor))

Main Analyses

Selection effects

Hormonal Contraception

Simple Model
model = lm.synds(as.numeric(contraception_hormonal) ~
                   age + net_income + relationship_duration_factor,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Complex Model
model = lm.synds(as.numeric(contraception_hormonal) ~
                   age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Congruent Use of Hormonal Contraception

Simple Model
model = lm.synds(as.numeric(congruent_contraception) ~
                   age + net_income + relationship_duration_factor,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Complex Model
model = lm.synds(as.numeric(congruent_contraception) ~
                   age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Effects of Hormonal Contraception

Attractiveness of Partner

Uncontrolled
model = lm.synds(attractiveness_partner ~ contraception_hormonal,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(attractiveness_partner ~ contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Relationship Satisfaction

Uncontrolled
model = lm.synds(relationship_satisfaction ~ contraception_hormonal,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(relationship_satisfaction ~ contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Sexual Satisfaction

Uncontrolled
model = lm.synds(satisfaction_sexual_intercourse ~ contraception_hormonal,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(satisfaction_sexual_intercourse ~ contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Libido

Uncontrolled
model = lm.synds(diary_libido_mean ~ contraception_hormonal,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(diary_libido_mean ~ contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Sexual Frequency

Uncontrolled
model = glm.synds(diary_sex_active_sex_sum ~ offset(log(number_of_days)) +
                        contraception_hormonal,
                         data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = glm.synds(diary_sex_active_sex_sum ~ offset(log(number_of_days)) +
                        contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Masturbation Frequency

Uncontrolled
model = glm.synds(diary_masturbation_sum ~ offset(log(number_of_days)) +
                        contraception_hormonal,
                         data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = glm.synds(diary_masturbation_sum ~ offset(log(number_of_days)) +
                        contraception_hormonal +
                        age + net_income + relationship_duration_factor +
                              education_years +
                              bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                              religiosity,
                         data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

HC, Congruent Use of HC and Their Interaction

Attractiveness of Partner

Uncontrolled
model = lm.synds(attractiveness_partner ~ contraception_hormonal * congruent_contraception,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(attractiveness_partner ~ contraception_hormonal * congruent_contraception +
                   age + net_income + relationship_duration_factor +
                   education_years +
                   bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                   religiosity,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Relationship Satisfaction

Uncontrolled
model = lm.synds(relationship_satisfaction ~ contraception_hormonal * congruent_contraception,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(relationship_satisfaction ~ contraception_hormonal * congruent_contraception +
                   age + net_income + relationship_duration_factor +
                   education_years +
                   bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                   religiosity,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Sexual Satisfaction

Uncontrolled
model = lm.synds(satisfaction_sexual_intercourse ~ contraception_hormonal * congruent_contraception,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(satisfaction_sexual_intercourse ~ contraception_hormonal * congruent_contraception +
                   age + net_income + relationship_duration_factor +
                   education_years +
                   bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                   religiosity,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Libido

Uncontrolled
model = lm.synds(diary_libido_mean ~ contraception_hormonal * congruent_contraception,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = lm.synds(diary_libido_mean ~ contraception_hormonal * congruent_contraception +
                   age + net_income + relationship_duration_factor +
                   education_years +
                   bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                   religiosity,
                 data = example_sim)

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Sexual Frequency

Uncontrolled
model = glm.synds(diary_sex_active_sex_sum ~ offset(log(number_of_days)) +
                    contraception_hormonal * congruent_contraception,
                  data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = glm.synds(diary_sex_active_sex_sum ~ offset(log(number_of_days)) +
                    contraception_hormonal * congruent_contraception +
                    age + net_income + relationship_duration_factor +
                    education_years +
                    bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                    religiosity,
                  data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Masturbation Frequency

Uncontrolled
model = glm.synds(diary_masturbation_sum ~ offset(log(number_of_days)) +
                    contraception_hormonal * congruent_contraception,
                  data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

Controlled
model = glm.synds(diary_masturbation_sum ~ offset(log(number_of_days)) +
                    contraception_hormonal * congruent_contraception +
                    age + net_income + relationship_duration_factor +
                    education_years +
                    bfi_extra + bfi_neuro + bfi_agree + bfi_consc + bfi_open +
                    religiosity,
                  data = example_sim, family = "poisson")

t_test_com <- compare(
  model, # Results from the synthetic linear model
  data, # The original dataset
  lwd = 1.5, # The type of line in the plot
  lty = 1, # The width of line in the plot
  point.size = 4, # The size of the symbols used in the plot
  lcol = c("#62B6CB", "#1B4965") # Set the colours
)

t_test_com$ci.plot +
  ggtitle("") +
  apatheme +
  theme(text = element_text(size=10)) +
  background_grid()

LS0tDQp0aXRsZTogIkNoZWNrIFN5bnRoZXRpYyBkYXRhIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogJ2hpZGUnDQogICAgc2VsZl9jb250YWluZWQ6IGZhbHNlDQotLS0NCg0KIyMgRGF0YSBhbmQgRnVuY3Rpb25zDQpgYGB7ciBkYXRhIGFuZCBmdW5jdGlvbnN9DQpzb3VyY2UoIjBfaGVscGVycy5SIikNCmxvYWQoImRhdGEvY2xlYW5lZF9zZWxlY3RlZF93cmFuZ2xlZC5yZGF0YSIpDQpsb2FkKCJkYXRhL3NpbXVsYXRlZC5yZGF0YSIpDQpgYGANCg0KIyMgRGlzdHJpYnV0aW9ucyB7LnRhYnNldH0NCiMjIyBTZWxlY3Rpb24gVmFyaWFibGVzDQpgYGB7cn0NCmV4YW1wbGVfY29tIDwtIGNvbXBhcmUoDQogIGV4YW1wbGVfc2ltLCAjIFRoZSBzeW50aGV0aWMgZGF0YXNldA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIHZhcnMgPSBjKCJhZ2UiLCAibmV0X2luY29tZSIsICJyZWxhdGlvbnNoaXBfZHVyYXRpb25fZmFjdG9yIiksDQogIHByaW50LmNvZWYgPSBUUlVFLCAjIFByaW50IHRhYmxlcyBvZiBlc3RpbWF0ZXMgZm9yIG9yaWdpbmFsIGFuZCBzeW50aGV0aWMgZGF0YQ0KICBuY29sID0gMiwjIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgcGxvdA0KICBucm93ID0gMSwNCiAgYnJlYWtzID0gMTYsICMgR2FwcyBiZXR3ZWVuIGNvbHVtbnMgDQogIHN0YXQgPSAiY291bnRzIiwgIyBQcmVzZW50IHRoZSByYXcgY291bnRzIGZvciBlYWNoIHZhcmlhYmxlDQogIGNvbHMgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldHRpbmcgdGhlIGNvbG91cnMgaW4gdGhlIHBsb3QNCikNCg0KZXhhbXBsZV9jb20kcGxvdHMNCmBgYA0KDQojIyMgSG9ybW9uYWwgQ29udHJhY2VwdGlvbg0KYGBge3J9DQpleGFtcGxlX2NvbSA8LSBjb21wYXJlKA0KICBleGFtcGxlX3NpbSwgIyBUaGUgc3ludGhldGljIGRhdGFzZXQNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICB2YXJzID0gYygiY29udHJhY2VwdGlvbl9ob3Jtb25hbCIsICJjb25ncnVlbnRfY29udHJhY2VwdGlvbiIpLA0KICBwcmludC5jb2VmID0gVFJVRSwgIyBQcmludCB0YWJsZXMgb2YgZXN0aW1hdGVzIGZvciBvcmlnaW5hbCBhbmQgc3ludGhldGljIGRhdGENCiAgbmNvbCA9IDIsICMgVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBwbG90DQogIGJyZWFrcyA9IDE2LCAjIEdhcHMgYmV0d2VlbiBjb2x1bW5zIA0KICBzdGF0ID0gImNvdW50cyIsICMgUHJlc2VudCB0aGUgcmF3IGNvdW50cyBmb3IgZWFjaCB2YXJpYWJsZQ0KICBjb2xzID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXR0aW5nIHRoZSBjb2xvdXJzIGluIHRoZSBwbG90DQopDQoNCmV4YW1wbGVfY29tJHBsb3RzDQpgYGANCg0KDQojIyMgT3V0Y29tZXMNCmBgYHtyfQ0KZXhhbXBsZV9jb20gPC0gY29tcGFyZSgNCiAgZXhhbXBsZV9zaW0sICMgVGhlIHN5bnRoZXRpYyBkYXRhc2V0DQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgdmFycyA9IGMoImF0dHJhY3RpdmVuZXNzX3BhcnRuZXIiLA0KICAgICAgICAgInJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb24iLA0KICAgICAgICAgInNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UiLA0KICAgICAgICAgImRpYXJ5X2xpYmlkb19tZWFuIiwNCiAgICAgICAgICJkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0iLA0KICAgICAgICAgImRpYXJ5X21hc3R1cmJhdGlvbl9zdW0iKSwNCiAgcHJpbnQuY29lZiA9IFRSVUUsICMgUHJpbnQgdGFibGVzIG9mIGVzdGltYXRlcyBmb3Igb3JpZ2luYWwgYW5kIHN5bnRoZXRpYyBkYXRhDQogIG5jb2wgPSAyLCAjIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgcGxvdA0KICBucm93ID0gMSwNCiAgYnJlYWtzID0gMTYsICMgR2FwcyBiZXR3ZWVuIGNvbHVtbnMgDQogIHN0YXQgPSAiY291bnRzIiwgIyBQcmVzZW50IHRoZSByYXcgY291bnRzIGZvciBlYWNoIHZhcmlhYmxlDQogIGNvbHMgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldHRpbmcgdGhlIGNvbG91cnMgaW4gdGhlIHBsb3QNCikNCg0KZXhhbXBsZV9jb20kcGxvdHMNCmBgYA0KDQojIyBDb3JyZWxhdGlvbnMgey50YWJzZXR9DQojIyMgUmVhbCBEYXRhDQpgYGB7cn0NCmNvcl9yZWFsID0gZGF0YSAlPiUNCiAgbXV0YXRlKGNvbnRyYWNlcHRpb25faG9ybW9uYWxfbnVtZXJpYyA9IGlmZWxzZShjb250cmFjZXB0aW9uX2hvcm1vbmFsID09ICJ5ZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbnRyYWNlcHRpb25faG9ybW9uYWwgPT0gIm5vIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTkEpKSwNCiAgICAgICAgIGNvbmdydWVudF9jb250cmFjZXB0aW9uX251bWVyaWMgPSBpZmVsc2UoY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24gPT0gIjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24gPT0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTkEpKSkgJT4lDQogIHNlbGVjdChhZ2UsIGVkdWNhdGlvbl95ZWFycywNCiAgICAgICAgIGJmaV9leHRyYSwgYmZpX25ldXJvLCBiZmlfYWdyZWUsIGJmaV9jb25zYywgYmZpX29wZW4sIHJlbGlnaW9zaXR5LA0KICAgICAgICAgY29udHJhY2VwdGlvbl9ob3Jtb25hbF9udW1lcmljLCBjb25ncnVlbnRfY29udHJhY2VwdGlvbl9udW1lcmljLA0KICAgICAgICAgYXR0cmFjdGl2ZW5lc3NfcGFydG5lciwNCiAgICAgICAgIHJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb24sDQogICAgICAgICBzYXRpc2ZhY3Rpb25fc2V4dWFsX2ludGVyY291cnNlLA0KICAgICAgICAgZGlhcnlfbGliaWRvX21lYW4sDQogICAgICAgICBkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0sDQogICAgICAgICBkaWFyeV9tYXN0dXJiYXRpb25fc3VtKSAlPiUNCiAgY29yci50ZXN0KC4sIG1pbmxlbmd0aCA9IDM1KQ0KDQpjb3JfcmVhbF9jaSA9IGFzLmRhdGEuZnJhbWUoY29yX3JlYWwkY2kpICU+JQ0KICByb3duYW1lc190b19jb2x1bW4oLiwgInZhcmlhYmxlcyIpDQoNCmNvcl9yZWFsX2NpID0gY29yX3JlYWxfY2kgJT4lDQogIG11dGF0ZSh2YXJpYWJsZXNfZmFjdG9yID0gZmFjdG9yKHZhcmlhYmxlcywgbGV2ZWxzID0gcmV2KHVuaXF1ZShjb3JfcmVhbF9jaSR2YXJpYWJsZXMpKSksDQogICAgICAgICBncm91cCA9ICJyZWFsX2RhdGEiKQ0KDQpnZ3Bsb3QoY29yX3JlYWxfY2ksIGFlcyh4ID0gdmFyaWFibGVzX2ZhY3RvciwgeSA9IHIpKSArIA0KICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpDQpgYGANCg0KIyMjIFNpbXVsYXRlZCBEYXRhDQpgYGB7cn0NCmV4YW1wbGVfc2ltJHN5biA9IGV4YW1wbGVfc2ltJHN5biAlPiUNCiAgbXV0YXRlKGNvbnRyYWNlcHRpb25faG9ybW9uYWxfbnVtZXJpYyA9IGlmZWxzZShjb250cmFjZXB0aW9uX2hvcm1vbmFsID09ICJ5ZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbnRyYWNlcHRpb25faG9ybW9uYWwgPT0gIm5vIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTkEpKSwNCiAgICAgICAgIGNvbmdydWVudF9jb250cmFjZXB0aW9uX251bWVyaWMgPSBpZmVsc2UoY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24gPT0gIjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24gPT0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTkEpKSkNCg0KY29yX3NpbSA9IGV4YW1wbGVfc2ltJHN5biAlPiUNCiAgc2VsZWN0KGFnZSwgZWR1Y2F0aW9uX3llYXJzLA0KICAgICAgICAgYmZpX2V4dHJhLCBiZmlfbmV1cm8sIGJmaV9hZ3JlZSwgYmZpX2NvbnNjLCBiZmlfb3BlbiwgcmVsaWdpb3NpdHksDQogICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsX251bWVyaWMsIGNvbmdydWVudF9jb250cmFjZXB0aW9uX251bWVyaWMsDQogICAgICAgICBhdHRyYWN0aXZlbmVzc19wYXJ0bmVyLA0KICAgICAgICAgcmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbiwNCiAgICAgICAgIHNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UsDQogICAgICAgICBkaWFyeV9saWJpZG9fbWVhbiwNCiAgICAgICAgIGRpYXJ5X3NleF9hY3RpdmVfc2V4X3N1bSwNCiAgICAgICAgIGRpYXJ5X21hc3R1cmJhdGlvbl9zdW0pICU+JQ0KICBjb3JyLnRlc3QoLiwgbWlubGVuZ3RoID0gMzUpDQoNCmNvcl9zaW1fY2kgPSBhcy5kYXRhLmZyYW1lKGNvcl9zaW0kY2kpICU+JQ0KICByb3duYW1lc190b19jb2x1bW4oLiwgInZhcmlhYmxlcyIpDQoNCmNvcl9zaW1fY2kgPSBjb3Jfc2ltX2NpICU+JQ0KICBtdXRhdGUodmFyaWFibGVzX2ZhY3RvciA9IGZhY3Rvcih2YXJpYWJsZXMsIGxldmVscyA9IHJldih1bmlxdWUoY29yX3NpbV9jaSR2YXJpYWJsZXMpKSksDQogICAgICAgICBncm91cCA9ICJzaW11bGF0ZWRfZGF0YSIpDQoNCmdncGxvdChjb3Jfc2ltX2NpLCBhZXMoeCA9IHZhcmlhYmxlc19mYWN0b3IsIHkgPSByKSkgKyANCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKQ0KYGBgDQoNCiMjIyBDb21iaW5lZA0KYGBge3J9DQpjb3JfY29tYmluZWQgPSByYmluZChjb3JfcmVhbF9jaSwgY29yX3NpbV9jaSkgJT4lDQogIGFycmFuZ2UodmFyaWFibGVzKQ0KDQpwbG90X2NvciA9IGZ1bmN0aW9uKGNvcl9jb21iaW5lZCkgew0KICBnZ3Bsb3QoY29yX2NvbWJpbmVkLCBhZXMoeCA9IHZhcmlhYmxlc19mYWN0b3IsIHkgPSByLCBjb2xvciA9IGdyb3VwLCBncm91cCA9IGdyb3VwKSkgKyANCiAgICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyLCBjb2xvciA9IGdyb3VwLCBncm91cCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsNCiAgICBjb29yZF9mbGlwKCkgKw0KICAgIGFwYXRoZW1lICsNCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKQ0KfQ0KYGBgDQoNCg0KIyMjIyBBZ2UNCmBgYHtyfQ0KcGxvdF9jb3IoY29yX2NvbWJpbmVkICU+JQ0KICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVzX2ZhY3RvciAlY29udGFpbnMlICJhZ2UiKSkNCmBgYA0KDQojIyMjIFllYXJzIG9mIEVkdWNhdGlvbg0KYGBge3J9DQpwbG90X2Nvcihjb3JfY29tYmluZWQgJT4lDQogICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXNfZmFjdG9yICVjb250YWlucyUgImVkdWNhdGlvbl95ZWFycyIpKQ0KYGBgDQoNCiMjIyMgQWdyZWVhYmxlbmVzcw0KYGBge3J9DQpwbG90X2Nvcihjb3JfY29tYmluZWQgJT4lDQogICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXNfZmFjdG9yICVjb250YWlucyUgImJmaV9hZ3JlZSIpKQ0KYGBgDQoNCiMjIyMgQ29uc2NpZW50aW91c25lc3MNCmBgYHtyfQ0KcGxvdF9jb3IoY29yX2NvbWJpbmVkICU+JQ0KICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVzX2ZhY3RvciAlY29udGFpbnMlICJiZmlfY29uc2MiKSkNCmBgYA0KDQojIyMjIE9wZW5uZXNzDQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAiYmZpX29wZW4iKSkNCmBgYA0KDQoNCiMjIyMgRXh0cmF2ZXJzaW9uDQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAiYmZpX2V4dHJhIikpDQoNCmBgYA0KDQojIyMjIE5ldXJvdGljaXNtDQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAiYmZpX25ldXJvIikpDQoNCmBgYA0KDQojIyMjIFJlbGlnaW9zaXR5DQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAicmVsaWdpb3NpdHkiKSkNCg0KYGBgDQoNCiMjIyMgSG9ybW9uYWwgY29udHJhY2VwdGlvbg0KYGBge3J9DQpwbG90X2Nvcihjb3JfY29tYmluZWQgJT4lDQogICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXNfZmFjdG9yICVjb250YWlucyUgImNvbnRyYWNlcHRpb25faG9ybW9uYWxfbnVtZXJpYyIpKQ0KYGBgDQoNCiMjIyMgQ29uZ3J1ZW50IENvbnRyYWNlcHRpb24NCmBgYHtyfQ0KcGxvdF9jb3IoY29yX2NvbWJpbmVkICU+JQ0KICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVzX2ZhY3RvciAlY29udGFpbnMlICJjb25ncnVlbnRfY29udHJhY2VwdGlvbl9udW1lcmljIikpDQoNCmBgYA0KDQoNCiMjIyMgQXR0cmFjdGl2bmVzcyBQYXJ0bmVyDQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAiYXR0cmFjdGl2ZW5lc3NfcGFydG5lciIpKQ0KDQpgYGANCg0KIyMjIyBSZWxhdGlvbnNoaXAgU2F0aXNmYWN0aW9uDQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAicmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbiIpKQ0KDQpgYGANCg0KIyMjIyBTZXh1YWwgU2F0aXNmYWN0aW9uDQpgYGB7cn0NCnBsb3RfY29yKGNvcl9jb21iaW5lZCAlPiUNCiAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlc19mYWN0b3IgJWNvbnRhaW5zJSAic2F0aXNmYWN0aW9uX3NleHVhbF9pbnRlcmNvdXJzZSIpKQ0KDQpgYGANCg0KIyMjIyBMaWJpZG8NCmBgYHtyfQ0KcGxvdF9jb3IoY29yX2NvbWJpbmVkICU+JQ0KICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVzX2ZhY3RvciAlY29udGFpbnMlICJkaWFyeV9saWJpZG9fbWVhbiIpKQ0KDQpgYGANCg0KDQojIyMjIFNleHVhbCBGcmVxdWVuY3kNCmBgYHtyfQ0KcGxvdF9jb3IoY29yX2NvbWJpbmVkICU+JQ0KICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVzX2ZhY3RvciAlY29udGFpbnMlICJkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0iKSkNCg0KYGBgDQoNCiMjIyMgTWFzdHVyYmF0aW9uIEZyZXF1ZW5jeQ0KYGBge3J9DQpwbG90X2Nvcihjb3JfY29tYmluZWQgJT4lDQogICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXNfZmFjdG9yICVjb250YWlucyUgImRpYXJ5X21hc3R1cmJhdGlvbl9zdW0iKSkNCg0KYGBgDQoNCiMjIyBQcm9ibGVtYXRpYz8gey5hY3RpdmV9DQpgYGB7cn0NCmNvcl9jb21iaW5lZF93aWRlID0gY29yX2NvbWJpbmVkICU+JQ0KICBzZWxlY3QodmFyaWFibGVzX2ZhY3RvciwgZ3JvdXAsIGxvd2VyLCByLCB1cHBlcikgJT4lDQogIHBpdm90X3dpZGVyKC4sIG5hbWVzX2Zyb20gPSBncm91cCwgdmFsdWVzX2Zyb20gPSBjKGxvd2VyLCByLCB1cHBlcikpICU+JQ0KICBtdXRhdGUoZGlmID0gaWZlbHNlKGxvd2VyX3JlYWxfZGF0YSA+IHJfc2ltdWxhdGVkX2RhdGEsIFQsDQogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvd2VyX3NpbXVsYXRlZF9kYXRhID4gcl9yZWFsX2RhdGEsIFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1cHBlcl9yZWFsX2RhdGEgPCByX3NpbXVsYXRlZF9kYXRhLCBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVwcGVyX3NpbXVsYXRlZF9kYXRhIDwgcl9yZWFsX2RhdGEsIFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRikpKSkpDQoNCnggPSBjb3JfY29tYmluZWRfd2lkZSAlPiUgZmlsdGVyKGRpZiA9PSBUKQ0KYGBgDQoNCg0KYGBge3J9DQpwbG90X2Nvcihjb3JfY29tYmluZWQgJT4lDQogICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXNfZmFjdG9yICVpbiUgeCR2YXJpYWJsZXNfZmFjdG9yKSkNCmBgYA0KDQojIyBNYWluIEFuYWx5c2VzIHsudGFic2V0fQ0KIyMjIFNlbGVjdGlvbiBlZmZlY3RzIHsudGFic2V0fQ0KIyMjIyBIb3Jtb25hbCBDb250cmFjZXB0aW9uIHsudGFic2V0fQ0KIyMjIyMgU2ltcGxlIE1vZGVsDQpgYGB7cn0NCm1vZGVsID0gbG0uc3luZHMoYXMubnVtZXJpYyhjb250cmFjZXB0aW9uX2hvcm1vbmFsKSB+DQogICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltKQ0KDQp0X3Rlc3RfY29tIDwtIGNvbXBhcmUoDQogIG1vZGVsLCAjIFJlc3VsdHMgZnJvbSB0aGUgc3ludGhldGljIGxpbmVhciBtb2RlbA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIGx3ZCA9IDEuNSwgIyBUaGUgdHlwZSBvZiBsaW5lIGluIHRoZSBwbG90DQogIGx0eSA9IDEsICMgVGhlIHdpZHRoIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgcG9pbnQuc2l6ZSA9IDQsICMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbHMgdXNlZCBpbiB0aGUgcGxvdA0KICBsY29sID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXQgdGhlIGNvbG91cnMNCikNCg0KdF90ZXN0X2NvbSRjaS5wbG90ICsNCiAgZ2d0aXRsZSgiIikgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsNCiAgYmFja2dyb3VuZF9ncmlkKCkNCmBgYA0KDQojIyMjIyBDb21wbGV4IE1vZGVsDQpgYGB7cn0NCm1vZGVsID0gbG0uc3luZHMoYXMubnVtZXJpYyhjb250cmFjZXB0aW9uX2hvcm1vbmFsKSB+DQogICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX3llYXJzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KDQojIyMjIENvbmdydWVudCBVc2Ugb2YgSG9ybW9uYWwgQ29udHJhY2VwdGlvbiB7LnRhYnNldH0NCiMjIyMjIFNpbXBsZSBNb2RlbA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKGFzLm51bWVyaWMoY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24pIH4NCiAgICAgICAgICAgICAgICAgICBhZ2UgKyBuZXRfaW5jb21lICsgcmVsYXRpb25zaGlwX2R1cmF0aW9uX2ZhY3RvciwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMjIENvbXBsZXggTW9kZWwNCmBgYHtyfQ0KbW9kZWwgPSBsbS5zeW5kcyhhcy5udW1lcmljKGNvbmdydWVudF9jb250cmFjZXB0aW9uKSB+DQogICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX3llYXJzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIEVmZmVjdHMgb2YgSG9ybW9uYWwgQ29udHJhY2VwdGlvbiB7LnRhYnNldH0NCiMjIyMgQXR0cmFjdGl2ZW5lc3Mgb2YgUGFydG5lciB7LnRhYnNldH0NCiMjIyMjIFVuY29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKGF0dHJhY3RpdmVuZXNzX3BhcnRuZXIgfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKGF0dHJhY3RpdmVuZXNzX3BhcnRuZXIgfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFnZSArIG5ldF9pbmNvbWUgKyByZWxhdGlvbnNoaXBfZHVyYXRpb25fZmFjdG9yICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl95ZWFycyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmlfZXh0cmEgKyBiZmlfbmV1cm8gKyBiZmlfYWdyZWUgKyBiZmlfY29uc2MgKyBiZmlfb3BlbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZ2lvc2l0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMgUmVsYXRpb25zaGlwIFNhdGlzZmFjdGlvbiB7LnRhYnNldH0NCiMjIyMjIFVuY29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKHJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb24gfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKHJlbGF0aW9uc2hpcF9zYXRpc2ZhY3Rpb24gfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFnZSArIG5ldF9pbmNvbWUgKyByZWxhdGlvbnNoaXBfZHVyYXRpb25fZmFjdG9yICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl95ZWFycyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmlfZXh0cmEgKyBiZmlfbmV1cm8gKyBiZmlfYWdyZWUgKyBiZmlfY29uc2MgKyBiZmlfb3BlbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZ2lvc2l0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMgU2V4dWFsIFNhdGlzZmFjdGlvbiB7LnRhYnNldH0NCiMjIyMjIFVuY29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKHNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UgfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKHNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UgfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFnZSArIG5ldF9pbmNvbWUgKyByZWxhdGlvbnNoaXBfZHVyYXRpb25fZmFjdG9yICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl95ZWFycyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmlfZXh0cmEgKyBiZmlfbmV1cm8gKyBiZmlfYWdyZWUgKyBiZmlfY29uc2MgKyBiZmlfb3BlbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZ2lvc2l0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMgTGliaWRvIHsudGFic2V0fQ0KIyMjIyMgVW5jb250cm9sbGVkDQpgYGB7cn0NCm1vZGVsID0gbG0uc3luZHMoZGlhcnlfbGliaWRvX21lYW4gfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKGRpYXJ5X2xpYmlkb19tZWFuIH4gY29udHJhY2VwdGlvbl9ob3Jtb25hbCArDQogICAgICAgICAgICAgICAgICAgICAgICBhZ2UgKyBuZXRfaW5jb21lICsgcmVsYXRpb25zaGlwX2R1cmF0aW9uX2ZhY3RvciArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZHVjYXRpb25feWVhcnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZpX2V4dHJhICsgYmZpX25ldXJvICsgYmZpX2FncmVlICsgYmZpX2NvbnNjICsgYmZpX29wZW4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWdpb3NpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltKQ0KDQp0X3Rlc3RfY29tIDwtIGNvbXBhcmUoDQogIG1vZGVsLCAjIFJlc3VsdHMgZnJvbSB0aGUgc3ludGhldGljIGxpbmVhciBtb2RlbA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIGx3ZCA9IDEuNSwgIyBUaGUgdHlwZSBvZiBsaW5lIGluIHRoZSBwbG90DQogIGx0eSA9IDEsICMgVGhlIHdpZHRoIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgcG9pbnQuc2l6ZSA9IDQsICMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbHMgdXNlZCBpbiB0aGUgcGxvdA0KICBsY29sID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXQgdGhlIGNvbG91cnMNCikNCg0KdF90ZXN0X2NvbSRjaS5wbG90ICsNCiAgZ2d0aXRsZSgiIikgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsNCiAgYmFja2dyb3VuZF9ncmlkKCkNCmBgYA0KDQojIyMjIFNleHVhbCBGcmVxdWVuY3kgey50YWJzZXR9DQojIyMjIyBVbmNvbnRyb2xsZWQNCmBgYHtyfQ0KbW9kZWwgPSBnbG0uc3luZHMoZGlhcnlfc2V4X2FjdGl2ZV9zZXhfc3VtIH4gb2Zmc2V0KGxvZyhudW1iZXJfb2ZfZGF5cykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltLCBmYW1pbHkgPSAicG9pc3NvbiIpDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMjIENvbnRyb2xsZWQNCmBgYHtyfQ0KbW9kZWwgPSBnbG0uc3luZHMoZGlhcnlfc2V4X2FjdGl2ZV9zZXhfc3VtIH4gb2Zmc2V0KGxvZyhudW1iZXJfb2ZfZGF5cykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWNlcHRpb25faG9ybW9uYWwgKw0KICAgICAgICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX3llYXJzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSwgZmFtaWx5ID0gInBvaXNzb24iKQ0KDQp0X3Rlc3RfY29tIDwtIGNvbXBhcmUoDQogIG1vZGVsLCAjIFJlc3VsdHMgZnJvbSB0aGUgc3ludGhldGljIGxpbmVhciBtb2RlbA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIGx3ZCA9IDEuNSwgIyBUaGUgdHlwZSBvZiBsaW5lIGluIHRoZSBwbG90DQogIGx0eSA9IDEsICMgVGhlIHdpZHRoIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgcG9pbnQuc2l6ZSA9IDQsICMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbHMgdXNlZCBpbiB0aGUgcGxvdA0KICBsY29sID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXQgdGhlIGNvbG91cnMNCikNCg0KdF90ZXN0X2NvbSRjaS5wbG90ICsNCiAgZ2d0aXRsZSgiIikgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsNCiAgYmFja2dyb3VuZF9ncmlkKCkNCmBgYA0KDQojIyMjIE1hc3R1cmJhdGlvbiBGcmVxdWVuY3kgey50YWJzZXR9DQojIyMjIyBVbmNvbnRyb2xsZWQNCmBgYHtyfQ0KbW9kZWwgPSBnbG0uc3luZHMoZGlhcnlfbWFzdHVyYmF0aW9uX3N1bSB+IG9mZnNldChsb2cobnVtYmVyX29mX2RheXMpKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSwgZmFtaWx5ID0gInBvaXNzb24iKQ0KDQp0X3Rlc3RfY29tIDwtIGNvbXBhcmUoDQogIG1vZGVsLCAjIFJlc3VsdHMgZnJvbSB0aGUgc3ludGhldGljIGxpbmVhciBtb2RlbA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIGx3ZCA9IDEuNSwgIyBUaGUgdHlwZSBvZiBsaW5lIGluIHRoZSBwbG90DQogIGx0eSA9IDEsICMgVGhlIHdpZHRoIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgcG9pbnQuc2l6ZSA9IDQsICMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbHMgdXNlZCBpbiB0aGUgcGxvdA0KICBsY29sID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXQgdGhlIGNvbG91cnMNCikNCg0KdF90ZXN0X2NvbSRjaS5wbG90ICsNCiAgZ2d0aXRsZSgiIikgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsNCiAgYmFja2dyb3VuZF9ncmlkKCkNCmBgYA0KDQojIyMjIyBDb250cm9sbGVkDQpgYGB7cn0NCm1vZGVsID0gZ2xtLnN5bmRzKGRpYXJ5X21hc3R1cmJhdGlvbl9zdW0gfiBvZmZzZXQobG9nKG51bWJlcl9vZl9kYXlzKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY2VwdGlvbl9ob3Jtb25hbCArDQogICAgICAgICAgICAgICAgICAgICAgICBhZ2UgKyBuZXRfaW5jb21lICsgcmVsYXRpb25zaGlwX2R1cmF0aW9uX2ZhY3RvciArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZHVjYXRpb25feWVhcnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZpX2V4dHJhICsgYmZpX25ldXJvICsgYmZpX2FncmVlICsgYmZpX2NvbnNjICsgYmZpX29wZW4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWdpb3NpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltLCBmYW1pbHkgPSAicG9pc3NvbiIpDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyBIQywgQ29uZ3J1ZW50IFVzZSBvZiBIQyBhbmQgVGhlaXIgSW50ZXJhY3Rpb24gey50YWJzZXR9DQojIyMjIEF0dHJhY3RpdmVuZXNzIG9mIFBhcnRuZXIgey50YWJzZXR9DQojIyMjIyBVbmNvbnRyb2xsZWQNCmBgYHtyfQ0KbW9kZWwgPSBsbS5zeW5kcyhhdHRyYWN0aXZlbmVzc19wYXJ0bmVyIH4gY29udHJhY2VwdGlvbl9ob3Jtb25hbCAqIGNvbmdydWVudF9jb250cmFjZXB0aW9uLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMjIENvbnRyb2xsZWQNCmBgYHtyfQ0KbW9kZWwgPSBsbS5zeW5kcyhhdHRyYWN0aXZlbmVzc19wYXJ0bmVyIH4gY29udHJhY2VwdGlvbl9ob3Jtb25hbCAqIGNvbmdydWVudF9jb250cmFjZXB0aW9uICsNCiAgICAgICAgICAgICAgICAgICBhZ2UgKyBuZXRfaW5jb21lICsgcmVsYXRpb25zaGlwX2R1cmF0aW9uX2ZhY3RvciArDQogICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX3llYXJzICsNCiAgICAgICAgICAgICAgICAgICBiZmlfZXh0cmEgKyBiZmlfbmV1cm8gKyBiZmlfYWdyZWUgKyBiZmlfY29uc2MgKyBiZmlfb3BlbiArDQogICAgICAgICAgICAgICAgICAgcmVsaWdpb3NpdHksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyBSZWxhdGlvbnNoaXAgU2F0aXNmYWN0aW9uIHsudGFic2V0fQ0KIyMjIyMgVW5jb250cm9sbGVkDQpgYGB7cn0NCm1vZGVsID0gbG0uc3luZHMocmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbiB+IGNvbnRyYWNlcHRpb25faG9ybW9uYWwgKiBjb25ncnVlbnRfY29udHJhY2VwdGlvbiwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltKQ0KDQp0X3Rlc3RfY29tIDwtIGNvbXBhcmUoDQogIG1vZGVsLCAjIFJlc3VsdHMgZnJvbSB0aGUgc3ludGhldGljIGxpbmVhciBtb2RlbA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIGx3ZCA9IDEuNSwgIyBUaGUgdHlwZSBvZiBsaW5lIGluIHRoZSBwbG90DQogIGx0eSA9IDEsICMgVGhlIHdpZHRoIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgcG9pbnQuc2l6ZSA9IDQsICMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbHMgdXNlZCBpbiB0aGUgcGxvdA0KICBsY29sID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXQgdGhlIGNvbG91cnMNCikNCg0KdF90ZXN0X2NvbSRjaS5wbG90ICsNCiAgZ2d0aXRsZSgiIikgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsNCiAgYmFja2dyb3VuZF9ncmlkKCkNCmBgYA0KDQojIyMjIyBDb250cm9sbGVkDQpgYGB7cn0NCm1vZGVsID0gbG0uc3luZHMocmVsYXRpb25zaGlwX3NhdGlzZmFjdGlvbiB+IGNvbnRyYWNlcHRpb25faG9ybW9uYWwgKiBjb25ncnVlbnRfY29udHJhY2VwdGlvbiArDQogICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl95ZWFycyArDQogICAgICAgICAgICAgICAgICAgYmZpX2V4dHJhICsgYmZpX25ldXJvICsgYmZpX2FncmVlICsgYmZpX2NvbnNjICsgYmZpX29wZW4gKw0KICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMgU2V4dWFsIFNhdGlzZmFjdGlvbiB7LnRhYnNldH0NCiMjIyMjIFVuY29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKHNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UgfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsICogY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24sDQogICAgICAgICAgICAgICAgIGRhdGEgPSBleGFtcGxlX3NpbSkNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKHNhdGlzZmFjdGlvbl9zZXh1YWxfaW50ZXJjb3Vyc2UgfiBjb250cmFjZXB0aW9uX2hvcm1vbmFsICogY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24gKw0KICAgICAgICAgICAgICAgICAgIGFnZSArIG5ldF9pbmNvbWUgKyByZWxhdGlvbnNoaXBfZHVyYXRpb25fZmFjdG9yICsNCiAgICAgICAgICAgICAgICAgICBlZHVjYXRpb25feWVhcnMgKw0KICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICByZWxpZ2lvc2l0eSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltKQ0KDQp0X3Rlc3RfY29tIDwtIGNvbXBhcmUoDQogIG1vZGVsLCAjIFJlc3VsdHMgZnJvbSB0aGUgc3ludGhldGljIGxpbmVhciBtb2RlbA0KICBkYXRhLCAjIFRoZSBvcmlnaW5hbCBkYXRhc2V0DQogIGx3ZCA9IDEuNSwgIyBUaGUgdHlwZSBvZiBsaW5lIGluIHRoZSBwbG90DQogIGx0eSA9IDEsICMgVGhlIHdpZHRoIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgcG9pbnQuc2l6ZSA9IDQsICMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbHMgdXNlZCBpbiB0aGUgcGxvdA0KICBsY29sID0gYygiIzYyQjZDQiIsICIjMUI0OTY1IikgIyBTZXQgdGhlIGNvbG91cnMNCikNCg0KdF90ZXN0X2NvbSRjaS5wbG90ICsNCiAgZ2d0aXRsZSgiIikgKw0KICBhcGF0aGVtZSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsNCiAgYmFja2dyb3VuZF9ncmlkKCkNCmBgYA0KDQojIyMjIExpYmlkbyB7LnRhYnNldH0NCiMjIyMjIFVuY29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGxtLnN5bmRzKGRpYXJ5X2xpYmlkb19tZWFuIH4gY29udHJhY2VwdGlvbl9ob3Jtb25hbCAqIGNvbmdydWVudF9jb250cmFjZXB0aW9uLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMjIENvbnRyb2xsZWQNCmBgYHtyfQ0KbW9kZWwgPSBsbS5zeW5kcyhkaWFyeV9saWJpZG9fbWVhbiB+IGNvbnRyYWNlcHRpb25faG9ybW9uYWwgKiBjb25ncnVlbnRfY29udHJhY2VwdGlvbiArDQogICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl95ZWFycyArDQogICAgICAgICAgICAgICAgICAgYmZpX2V4dHJhICsgYmZpX25ldXJvICsgYmZpX2FncmVlICsgYmZpX2NvbnNjICsgYmZpX29wZW4gKw0KICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0pDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQoNCiMjIyMgU2V4dWFsIEZyZXF1ZW5jeSB7LnRhYnNldH0NCiMjIyMjIFVuY29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGdsbS5zeW5kcyhkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0gfiBvZmZzZXQobG9nKG51bWJlcl9vZl9kYXlzKSkgKw0KICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsICogY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24sDQogICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0sIGZhbWlseSA9ICJwb2lzc29uIikNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGdsbS5zeW5kcyhkaWFyeV9zZXhfYWN0aXZlX3NleF9zdW0gfiBvZmZzZXQobG9nKG51bWJlcl9vZl9kYXlzKSkgKw0KICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsICogY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24gKw0KICAgICAgICAgICAgICAgICAgICBhZ2UgKyBuZXRfaW5jb21lICsgcmVsYXRpb25zaGlwX2R1cmF0aW9uX2ZhY3RvciArDQogICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl95ZWFycyArDQogICAgICAgICAgICAgICAgICAgIGJmaV9leHRyYSArIGJmaV9uZXVybyArIGJmaV9hZ3JlZSArIGJmaV9jb25zYyArIGJmaV9vcGVuICsNCiAgICAgICAgICAgICAgICAgICAgcmVsaWdpb3NpdHksDQogICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0sIGZhbWlseSA9ICJwb2lzc29uIikNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyBNYXN0dXJiYXRpb24gRnJlcXVlbmN5IHsudGFic2V0fQ0KIyMjIyMgVW5jb250cm9sbGVkDQpgYGB7cn0NCm1vZGVsID0gZ2xtLnN5bmRzKGRpYXJ5X21hc3R1cmJhdGlvbl9zdW0gfiBvZmZzZXQobG9nKG51bWJlcl9vZl9kYXlzKSkgKw0KICAgICAgICAgICAgICAgICAgICBjb250cmFjZXB0aW9uX2hvcm1vbmFsICogY29uZ3J1ZW50X2NvbnRyYWNlcHRpb24sDQogICAgICAgICAgICAgICAgICBkYXRhID0gZXhhbXBsZV9zaW0sIGZhbWlseSA9ICJwb2lzc29uIikNCg0KdF90ZXN0X2NvbSA8LSBjb21wYXJlKA0KICBtb2RlbCwgIyBSZXN1bHRzIGZyb20gdGhlIHN5bnRoZXRpYyBsaW5lYXIgbW9kZWwNCiAgZGF0YSwgIyBUaGUgb3JpZ2luYWwgZGF0YXNldA0KICBsd2QgPSAxLjUsICMgVGhlIHR5cGUgb2YgbGluZSBpbiB0aGUgcGxvdA0KICBsdHkgPSAxLCAjIFRoZSB3aWR0aCBvZiBsaW5lIGluIHRoZSBwbG90DQogIHBvaW50LnNpemUgPSA0LCAjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2xzIHVzZWQgaW4gdGhlIHBsb3QNCiAgbGNvbCA9IGMoIiM2MkI2Q0IiLCAiIzFCNDk2NSIpICMgU2V0IHRoZSBjb2xvdXJzDQopDQoNCnRfdGVzdF9jb20kY2kucGxvdCArDQogIGdndGl0bGUoIiIpICsNCiAgYXBhdGhlbWUgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArDQogIGJhY2tncm91bmRfZ3JpZCgpDQpgYGANCg0KIyMjIyMgQ29udHJvbGxlZA0KYGBge3J9DQptb2RlbCA9IGdsbS5zeW5kcyhkaWFyeV9tYXN0dXJiYXRpb25fc3VtIH4gb2Zmc2V0KGxvZyhudW1iZXJfb2ZfZGF5cykpICsNCiAgICAgICAgICAgICAgICAgICAgY29udHJhY2VwdGlvbl9ob3Jtb25hbCAqIGNvbmdydWVudF9jb250cmFjZXB0aW9uICsNCiAgICAgICAgICAgICAgICAgICAgYWdlICsgbmV0X2luY29tZSArIHJlbGF0aW9uc2hpcF9kdXJhdGlvbl9mYWN0b3IgKw0KICAgICAgICAgICAgICAgICAgICBlZHVjYXRpb25feWVhcnMgKw0KICAgICAgICAgICAgICAgICAgICBiZmlfZXh0cmEgKyBiZmlfbmV1cm8gKyBiZmlfYWdyZWUgKyBiZmlfY29uc2MgKyBiZmlfb3BlbiArDQogICAgICAgICAgICAgICAgICAgIHJlbGlnaW9zaXR5LA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IGV4YW1wbGVfc2ltLCBmYW1pbHkgPSAicG9pc3NvbiIpDQoNCnRfdGVzdF9jb20gPC0gY29tcGFyZSgNCiAgbW9kZWwsICMgUmVzdWx0cyBmcm9tIHRoZSBzeW50aGV0aWMgbGluZWFyIG1vZGVsDQogIGRhdGEsICMgVGhlIG9yaWdpbmFsIGRhdGFzZXQNCiAgbHdkID0gMS41LCAjIFRoZSB0eXBlIG9mIGxpbmUgaW4gdGhlIHBsb3QNCiAgbHR5ID0gMSwgIyBUaGUgd2lkdGggb2YgbGluZSBpbiB0aGUgcGxvdA0KICBwb2ludC5zaXplID0gNCwgIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9scyB1c2VkIGluIHRoZSBwbG90DQogIGxjb2wgPSBjKCIjNjJCNkNCIiwgIiMxQjQ5NjUiKSAjIFNldCB0aGUgY29sb3Vycw0KKQ0KDQp0X3Rlc3RfY29tJGNpLnBsb3QgKw0KICBnZ3RpdGxlKCIiKSArDQogIGFwYXRoZW1lICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKw0KICBiYWNrZ3JvdW5kX2dyaWQoKQ0KYGBgDQo=