library(tidyverse) # for manipulating data
library(labelled) # for using labels
library(flextable) # for formatting output tables
library(readr) # for reading csv files
library(broom) # for dealing with annoying output chunks
library(scales) # for percentage labelling
library(countrycode) # for working with country names
library(ggrepel) # for labels
library(ggthemes) # for plot formatting
library(ggpubr) # for plot arrangements
SUPLEMENTARY MATERIALS
As accompanying material to “Multi-project assessments of sample quality in cross-national surveys: The role of weights in applying external and internal measures of sample bias”, this document presents details of data transformations, statistical procedures, and exact results of analyses performed in the paper’s main body. Code chunks are hidden by default but can be accessed by clicking the relevant buttons. All calculations rely on the publicly available integrated .csv data file.
ESM2e02 <- read_delim("ESM2e02f.csv", ";",
escape_double = FALSE,
na = c("Not applicable", "Not available"),
trim_ws = TRUE,
col_types = cols(
.default = col_character(),
T_SURVEY_YEAR = col_double(),
Q_PROP_FEM_POPULATION_18_74 = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_EXTERNAL_18_74_psweights = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_EXTERNAL_18_74_dweights_ESS = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_EXTERNAL_18_74_no_weights = col_double(),
Q_PROP_FEM_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_PROP_FEM_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_SUBSAMPLE_SIZE_INTERNAL_KOHLER_strict = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_BIAS_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_BIAS_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_no_weights = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_psweights = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_psweights = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_no_weights = col_double()
))
DISTRIBUTION OF THE TYPES OF WEIGHTS AVAILABLE ACROSS THE FOUR PROJECTS
Figure 1 - with embedded R code
ESM2e02 %>%
mutate(T_Weighting_factor2 = factor(ESM2e02$T_Weighting_factor2,
levels = c("No weights", "Post-stratification weights", "Post-stratification weights with design weights"),
labels = c("No weights", "Post-stratification", "Post-stratification and design"))) %>%
mutate(T_SURVEY_NAME = factor(ESM2e02$T_SURVEY_NAME,
levels = c("EB", "ESS", "EQLS", "ISSP"),
labels = c("EB", "ESS", "EQLS", "ISSP"))) %>%
mutate(cntry_order = fct_infreq(as.factor(T_COUNTRY), ordered = FALSE)) %>%
mutate(cntry_factor = dense_rank(cntry_order)) %>%
ggplot() +
geom_point(aes(x = ifelse(T_SURVEY_NAME == "EB", T_SURVEY_YEAR - 0.3,
ifelse(T_SURVEY_NAME == "ESS", T_SURVEY_YEAR - 0.1,
ifelse(T_SURVEY_NAME == "EQLS", T_SURVEY_YEAR + 0.1, T_SURVEY_YEAR + 0.3))),
y = cntry_factor,
fill = T_Weighting_factor2,
color = T_Weighting_factor2,
shape = T_Weighting_factor2),
show.legend = TRUE,
size = 2.5,
alpha = 0.8) +
geom_text(aes(x = ifelse(T_SURVEY_NAME == "EB", T_SURVEY_YEAR - 0.3,
ifelse(T_SURVEY_NAME == "ESS", T_SURVEY_YEAR - 0.1,
ifelse(T_SURVEY_NAME == "EQLS", T_SURVEY_YEAR + 0.1, T_SURVEY_YEAR + 0.3))),
y = -0.9,
label = ifelse(T_SURVEY_NAME == "EB", "EB",
ifelse(T_SURVEY_NAME == "ESS", "ESS",
ifelse(T_SURVEY_NAME == "EQLS", "EQLS", "ISSP")))),
size = 3.2,
angle = 90) +
scale_fill_manual(values = c("#F2CB3D", "#4F9DDB", "#5A1816")) +
scale_color_manual(values = c("#000000", "#4F9DDB", "#5A1816")) +
scale_x_continuous(breaks = c(2002:2016),
labels = c("'02", "'03", "'04", "'05", "'06", "'07", "'08", "'09", "'10", "'11","'12", "'13", "'14", "'15","'16"),
limits = c(2001.7, 2016.1), minor_breaks = seq(2001.5, 2016.5, 1)) +
scale_y_continuous(breaks = c(1:40),
labels = c("Germany", "Finland", "France", "United Kingdom", "Sweden", "Slovenia", "Czechia", "Denmark", "Netherlands", "Belgium", "Spain", "Hungary", "Poland", "Portugal", "Slovakia", "Austria", "Ireland", "Latvia", "Bulgaria", "Lithuania", "Cyprus", "Estonia", "Croatia", "Turkey", "Italy", "Greece", "Norway", "Switzerland", "Luxembourg", "Romania", "Israel", "Malta", "Russia", "Iceland", "North Macedonia", "Montenegro", "Serbia", "Ukraine", "Albania", "Georgia"), sec.axis = sec_axis(~.*1, breaks = c(1:40), labels = c("DE", "FI", "FR", "GB", "SE", "Sl", "CZ", "DK", "NL", "BE", "ES", "HU", "PL", "PT", "SK", "AT", "IE", "LV", "BG", "LT", "CY", "EE", "HR", "TR", "IT", "GR", "NO", "CH", "LU", "RO", "IL", "MT", "RU", "IS", "MK", "ME", "RS", "UA", "AL", "GE"))) +
guides(shape = guide_legend("Available weights"), fill = guide_legend("Available weights"), color = guide_legend("Available weights")) +
scale_shape_manual(values = c(21, 22, 23)) +
coord_cartesian(xlim = c(2002, 2016), ylim = c(-1, 39)) +
theme_tufte() +
theme(text = element_text(family = "serif"), legend.position = "bottom", legend.text = element_text(size = 12, face = "bold", color = "black"),legend.title = element_text(size = 12, face = "bold", color = "black"), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_text(size = 12, face = "bold", margin = margin(0,0,0,0, "pt"), color = "black"), axis.text.x = element_text(size = 12, face = "bold", color = "black"), panel.grid.major.y = element_line(size = 0.1), panel.grid.minor.x = element_line(size = 0.3, linetype = "dashed"), plot.margin = unit(c(1,1,1,1),"mm"), panel.border = element_blank())

Raw counts and row percentages of data represented in the paper on Figure 1.
ESM2e02 %>%
count(T_SURVEY_NAME, T_Weighting_factor2) %>%
pivot_wider(names_from = T_SURVEY_NAME, values_from = n, values_fill = 0) %>%
rename("Type of weight" = T_Weighting_factor2) %>%
qflextable() %>%
align(j = 2:5, align = "center") %>%
align_nottext_col(align = "center")
Type of weight | EB | EQLS | ESS | ISSP |
Post-stratification weights | 462 | 64 | 0 | 207 |
Post-stratification weights with design weights | 0 | 61 | 196 | 0 |
No weights | 0 | 0 | 3 | 132 |
ESM2e02 %>%
count(T_SURVEY_NAME, T_Weighting_factor2) %>%
group_by(T_SURVEY_NAME) %>%
mutate(Percent = percent(n/sum(n), accuracy = 0.1)) %>%
select(T_SURVEY_NAME, T_Weighting_factor2, Percent) %>%
ungroup() %>%
pivot_wider(names_from = T_SURVEY_NAME, values_from = Percent, values_fill = "0%") %>%
rename("Type of weight" = T_Weighting_factor2) %>%
qflextable() %>%
theme_booktabs() %>%
align(j = 1, align = "left")
Type of weight | EB | EQLS | ESS | ISSP |
Post-stratification weights | 100.0% | 51.2% | 0% | 61.1% |
Post-stratification weights with design weights | 0% | 48.8% | 98.5% | 0% |
No weights | 0% | 0% | 1.5% | 38.9% |
STRICT VS LENIENT APPROACH TO INTERNAL CRITERIA: SEE SECTION 4.3.
Pearson correlation coefficients between biases resulting internal criteria without weights according to the strict approach vs the lenient approach. Calculations performed for surveys within the two projects where data for implementing the strict approach was available.
ESM2e02 %>% filter(T_SURVEY_NAME %in% c("ESS", "EQLS")) %>%
group_by(T_SURVEY_NAME) %>%
summarize(`Perason correlation` = (cor(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, Q_ABS_BIAS_INTERNAL_KOHLER_no_weights_strict, method = 'pearson', use = "pairwise.complete.obs")), .groups = 'drop') %>%
rename("Project name" = T_SURVEY_NAME) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center") %>%
colformat_num(digits = 2, na_str = "N/A")
Project name | Perason correlation |
EQLS | 0.93 |
ESS | 0.96 |
DIFFERENCES IN THE VALUES OF BIAS ACCORDING TO INTERNAL AND EXTERNAL CRITERIA: NO WEIGHT VS DESIGN WEIGHT
Figure 2 - with embedded R code
mean_vals <- ESM2e02 %>%
filter(T_SURVEY_NAME == "ESS") %>%
filter(!T_SURVEY_EDITION_COUNTRY %in% c("ESS4_SK", "ESS5_SK", "ESS6_SK", "ESS3_LV", "ESS3_RO", "ESS4_LT")) %>%
filter(T_DEFFp_ESS == "DEFF>1") %>%
group_by(T_SURVEY_EDITION) %>%
summarise(int_no = mean(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = TRUE), int_ds = mean(Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS, na.rm = TRUE), ext_no = mean(Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights, na.rm = TRUE), ext_ds = mean(Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS,na.rm = TRUE), .groups = 'drop')
plot2a <- ESM2e02 %>%
filter(T_SURVEY_NAME == "ESS") %>%
filter(!T_SURVEY_EDITION_COUNTRY %in% c("ESS4_SK", "ESS5_SK", "ESS6_SK", "ESS3_LV", "ESS3_RO", "ESS4_LT")) %>%
filter(T_DEFFp_ESS == "DEFF>1") %>%
filter(T_External_and_internal_criteria != "Only external applicable") %>%
ggplot() +
ggtitle("Sample bias according to internal criteria") +
ylab("") +
scale_y_continuous(breaks = c(0, 1.96, 3, 6, 9, 12),
labels = c(0, 1.96, 3, 6, 9, 12),
limits = c(0, 12)) +
geom_point(aes(x = 1, y = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, fill = as.factor(1), shape = as.factor(1)),
alpha = 0.5, show.legend = TRUE, size = 2.5) +
geom_violin(aes(group = T_SURVEY_YEAR, x = 1, y = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, fill = as.factor(1)),
alpha = 0.01, trim = TRUE, size = 0.8, na.rm = TRUE, draw_quantiles = 0.5, show.legend = TRUE) +
geom_point(aes(x = 2, y = Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS, fill = as.factor(2), shape = as.factor(2)),
alpha = 0.5, size = 2.5, show.legend = TRUE) +
geom_violin(aes(group = T_SURVEY_YEAR, x = 2, y = Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS, fill = as.factor(2)),
alpha = 0.01, trim = TRUE, size = 0.8, draw_quantiles = 0.5, show.legend = TRUE) +
geom_hline(linetype = "twodash", yintercept = 1.96, alpha = 0.6) +
scale_color_manual(values = c("#F2CB3D" , "#A6080B"), labels = c("Without Weights", "Design Weights")) +
scale_fill_manual(values = c("#F2CB3D" , "#A6080B"), labels = c("Without Weights", "Design Weights")) +
scale_shape_manual(values = c(21 , 24), labels = c("Without Weights", "Design Weights")) +
geom_point(data = mean_vals, aes(x = 2, y = int_ds), shape = "X", size = 4, show.legend = FALSE) +
geom_point(data = mean_vals, aes(x = 1, y = int_no), shape = "X", size = 4, show.legend = FALSE) +
guides(shape = guide_legend("Median values indicated by horizontal line and the mean by X "),
colour = guide_legend("Median values indicated by horizontal line and the mean by X "),
fill = guide_legend("Median values indicated by horizontal line and the mean by X ")) +
coord_cartesian(ylim = c(0.1, 9)) +
theme_bw() + theme(axis.text.x = element_blank(), text = element_text(family = "serif"),
strip.background = element_rect(fill = "white"),
axis.title.x = element_blank(),
axis.ticks.x = element_blank(),
title = element_text(size=12, face = "bold", color = "black"),
strip.text = element_text(size=12, face = "bold", color = "black"),
axis.text.y = element_text(size=12, face = "bold", color = "black"),
legend.position = "bottom",
legend.box = "vertical",
legend.justification = "center",
legend.text = element_text(size=12, face = "bold", color = "black"),
plot.margin = unit(c(1,1,1,1),"mm",),
legend.key.size = unit(1.2,"line")) +
facet_wrap(~ T_SURVEY_EDITION, nrow = 1)
plot2b <- ESM2e02 %>%
filter(T_SURVEY_NAME == "ESS") %>%
filter(!T_SURVEY_EDITION_COUNTRY %in% c("ESS4_SK", "ESS5_SK", "ESS6_SK", "ESS3_LV", "ESS3_RO", "ESS4_LT")) %>%
filter(T_DEFFp_ESS == "DEFF>1") %>%
ggplot() +
ggtitle("Sample bias according to external criteria") +
ylab("") +
scale_y_continuous(breaks = c(0, 1.96, 3, 6, 9),
labels = c(0, 1.96, 3, 6, 9),
limits = c(0, 9)) +
geom_point(aes(x = 1, y = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights, fill = as.factor(1), shape = as.factor(1)),
alpha = 0.5, size = 2.5, show.legend = FALSE) +
geom_violin(aes(group = T_SURVEY_YEAR, x = 1, y = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights, fill = as.factor(1)),
alpha = 0.01, trim = TRUE, size = 0.8, draw_quantiles = 0.5, show.legend = FALSE) +
geom_point(aes(x = 2, y = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS, fill = as.factor(2), shape = as.factor(2)),
alpha = 0.5, size = 2.5, show.legend = FALSE) +
geom_violin(aes(group = T_SURVEY_YEAR, x = 2, y = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS, fill = as.factor(2)),
alpha = 0.01, trim = TRUE, size = 0.8, draw_quantiles = 0.5, show.legend = FALSE) +
geom_hline(linetype = "twodash", yintercept = 1.96, alpha = 0.6) +
scale_color_manual(values = c("#F2CB3D" , "#A6080B"), labels = c("Without Weights", "Design Weights")) +
scale_fill_manual(values = c("#F2CB3D" , "#A6080B"), labels = c("Without Weights", "Design Weights")) +
scale_shape_manual(values = c(21 , 24), labels = c("Without Weights", "Design Weights")) +
geom_point(data = mean_vals, aes(x = 2, y = ext_ds), shape = "X", size = 4, show.legend = FALSE) +
geom_point(data = mean_vals, aes(x = 1, y = ext_no), shape = "X", size = 4, show.legend = FALSE) +
coord_cartesian(ylim = c(0.1, 9)) +
guides(colour = FALSE, shape = FALSE, fill = FALSE) +
theme_bw() + theme(axis.text.x = element_blank(),
text = element_text(family = "serif"),
strip.background = element_rect(fill = "white"),
axis.title.x = element_blank(),
axis.ticks.x = element_blank(),
title = element_text(size = 12, face = "bold", color = "black"),
strip.text = element_text(size = 12, face = "bold", color = "black"),
axis.text.y = element_text(size = 12, face = "bold", color = "black"),
legend.position = "bottom",
legend.box = "vertical",
legend.justification = "left",
legend.text = element_text(size = 12, face = "bold", color = "black"),
plot.margin = unit(c(1,1,1,1),"mm")) +
facet_wrap(~ T_SURVEY_EDITION, nrow = 1)
ggarrange(plot2b, plot2a, nrow = 2)

Number of national surveys evaluated per edition for data presented on Figure 2.
ESM2e02 %>%
filter(T_SURVEY_NAME == "ESS") %>%
filter(!T_SURVEY_EDITION_COUNTRY %in% c("ESS4_SK", "ESS5_SK", "ESS6_SK", "ESS3_LV", "ESS3_RO", "ESS4_LT")) %>%
filter(T_DEFFp_ESS == "DEFF>1") %>%
count(T_SURVEY_EDITION) %>%
rename("Project Edition" = T_SURVEY_EDITION,
"Number of national surveys \n under evaluation" = n) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center")
Project Edition | Number of national surveys under evaluation |
ESS2002 | 16 |
ESS2004 | 17 |
ESS2006 | 15 |
ESS2008 | 22 |
ESS2010 | 20 |
ESS2012 | 18 |
ESS2014 | 12 |
ESS2016 | 13 |
Mean and median values for data represented on Figure 2.
ESM2e02 %>% filter(T_SURVEY_NAME == "ESS", T_DEFFp_ESS == "DEFF>1") %>%
mutate(delta1 = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS - Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights,
delta2 = Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS - Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
group_by(T_SURVEY_EDITION) %>%
summarise(meanXdifference_external = mean(delta1),
medianXdifference_external = median(delta1),
meanXdifference_internal = mean(delta2),
medianXdifference_internal = round(median(delta2), digits = 2), .groups = 'drop') %>%
rename("ESS wave" = T_SURVEY_EDITION,
"Mean difference \n external" = meanXdifference_external,
"Median difference \n external" = medianXdifference_external,
"Mean difference \n internal" = meanXdifference_internal,
"Median difference \n internal" = medianXdifference_internal) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center", header = T) %>%
colformat_num(j = 2:5, digits = 1, na_str = "N/A")
ESS wave | Mean difference external | Median difference external | Mean difference internal | Median difference internal |
ESS2002 | -0.17 | 0.15 | 0.04 | 0.05 |
ESS2004 | -0.02 | -0.08 | -0.14 | -0.07 |
ESS2006 | -0.75 | -0.70 | 0.07 | -0.03 |
ESS2008 | -0.41 | -0.07 | 0.11 | 0.01 |
ESS2010 | -0.13 | -0.08 | 0.11 | 0.00 |
ESS2012 | -0.27 | -0.06 | -0.20 | 0.00 |
ESS2014 | -0.30 | -0.14 | 0.09 | 0.09 |
ESS2016 | -0.25 | -0.22 | 0.07 | 0.04 |
Mean and median differences as referenced in section 5.1.
ESM2e02 %>% filter(T_SURVEY_NAME == "ESS", T_DEFFp_ESS == "DEFF>1") %>%
mutate(delta1 = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS - Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights,
delta2 = Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS - Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
summarise(meanXdifference_external = mean(delta1),
medianXdifference_external = median(delta1),
meanXdifference_internal = mean(delta2),
medianXdifference_internal = round(median(delta2), digits = 2), .groups = 'drop') %>%
pivot_longer(1:4, names_to = c("fun", "Difference"), values_to = "values", names_sep = "X") %>%
pivot_wider(names_from = fun, values_from = values) %>%
qflextable() %>%
theme_booktabs() %>%
colformat_num(j = 2:3, digits = 1, na_str = "N/A")
Difference | mean | median |
difference_external | -0.28 | -0.08 |
difference_internal | 0.02 | 0.00 |
WITHIN-PROJECT DIFFERENCES BETWEEN BIAS WITH AND WITHOUT POST-STRATIFICATION WEIGHTS
Figure 3 - with embedded R code
Note: In the paper, the internal and external criteria visualisations have been arranged on parallel panels in order to minimize overall figure size.
ESM2e02 %>%
filter(!T_SURVEY_EDITION_COUNTRY %in% c("ISSP2007_NL", "ISSP2015_DK")) %>%
filter(T_Weighting_factor == "Total weights present in dataset") %>%
ggplot(aes(x = T_SURVEY_YEAR)) +
ggtitle("Sample bias according to external criteria") +
ylab("") +
xlab("") +
scale_x_continuous(breaks = c(2002:2016),
labels = c("'02", "'03", "'04", "'05", "'06", "'07", "'08", "'09", "'10", "'11","'12", "'13", "'14", "'15","'16"),
limits = c(2001.3, 2016.7)) +
scale_y_continuous(breaks = c(0, 1.96, 3, 6, 9, 12),
labels = c(0, 1.96, 3, 6, 9, 12),
limits = c(0, 13)) +
geom_violin(aes(group = T_SURVEY_YEAR, x = T_SURVEY_YEAR - 0.2, y = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights, fill = as.factor(1)),
alpha = 0.4,
trim = TRUE,
na.rm = T,
size = 0.8,
draw_quantiles = 0.5) +
geom_violin(aes(group = T_SURVEY_YEAR, x = T_SURVEY_YEAR + 0.2, y = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_psweights,
fill = as.factor(2)),
alpha = 0.8,
trim = TRUE,
na.rm = T,
size = 0.8,
draw_quantiles = 0.5) +
scale_fill_manual(values = c("#F2CB3D" , "#162AF2"), labels = c("Without weights", "Post-stratification weights")) +
geom_hline(linetype = "twodash", yintercept = 1.96, alpha = 0.6) +
guides(shape = FALSE, fill = guide_legend(title = "Absolute bias per wave",
override.aes = list(alpha = c(0.2, 8))), color = FALSE, alpha = FALSE) +
theme_bw() + theme(text = element_text(family = "serif"), strip.background = element_rect(fill = "white"),
axis.text.x = element_text(size = 11, face = "bold", color = "black"),
axis.title.x = element_blank(),
axis.ticks.x = element_blank(),
title = element_text(size = 11, face = "bold", color = "black"),
strip.text = element_text(size = 11, face = "bold", color = "black"),
axis.text.y = element_text(size = 11, face = "bold", color = "black"),
legend.position = "bottom",
legend.box = "vertical",
legend.justification = "left",
legend.text = element_text(size = 11, face = "bold", color = "black"),
plot.margin = unit(c(1,1,1,1),"mm")) +
facet_wrap(~ T_SURVEY_NAME, nrow = 4)

ESM2e02 %>%
filter(T_External_and_internal_criteria %in% c("Both applicable", "Only external applicable")) %>%
filter(T_Weighting_factor == "Total weights present in dataset") %>%
ggplot(aes(x = T_SURVEY_YEAR)) +
ggtitle("Sample bias according to internal criteria") +
ylab("") +
xlab("") +
scale_x_continuous(breaks = c(2002:2016),
labels = c("'02", "'03", "'04", "'05", "'06", "'07", "'08", "'09", "'10", "'11","'12", "'13", "'14", "'15","'16"),
limits = c(2001.3, 2016.7)) +
scale_y_continuous(breaks = c(0, 1.96, 3, 6, 9, 12),
labels = c(0, 1.96, 3, 6, 9, 12),
limits = c(0, 13)) +
geom_violin(aes(group = T_SURVEY_YEAR, x = T_SURVEY_YEAR - 0.2,
y = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights,
fill = as.factor(1)),
na.rm = T,
alpha = 0.4,
trim = TRUE,
size = 0.8,
draw_quantiles = 0.5) +
geom_violin(aes(group = T_SURVEY_YEAR,
x = T_SURVEY_YEAR + 0.2,
y = Q_ABS_BIAS_INTERNAL_KOHLER_psweights,
fill = as.factor(2)),
na.rm = T,
alpha = 0.9,
trim = TRUE,
size = 0.8,
draw_quantiles = 0.5) +
scale_fill_manual(values = c("#F2CB3D" , "#162AF2"), labels = c("Without weights", "Post-stratification weights")) +
geom_hline(linetype = "twodash", yintercept = 1.96, alpha = 0.6) +
guides(shape = FALSE, fill = guide_legend(title = "Absolute bias per wave",
override.aes = list(alpha = c(0.2, 8))), color = FALSE, alpha = FALSE) +
theme_bw() + theme(text = element_text(family = "serif"), strip.background = element_rect(fill = "white"),
axis.text.x = element_text(size = 11, face = "bold", color = "black"),
axis.title.x = element_blank(),
axis.ticks.x = element_blank(),
title = element_text(size = 11, face = "bold", color = "black"),
strip.text = element_text(size = 11, face = "bold", color = "black"),
axis.text.y = element_text(size = 11, face = "bold", color = "black"),
legend.position = "bottom",
legend.box = "vertical",
legend.justification = "left",
legend.text = element_text(size = 11, face = "bold", color = "black"),
plot.margin = unit(c(1,1,1,1),"mm")) +
facet_wrap(~ T_SURVEY_NAME, nrow = 4)

Number of national surveys evaluated per edition for data presented on Figure 3.
ESM2e02 %>%
filter(T_External_and_internal_criteria %in% c("Both applicable", "Only external applicable", "Only external applicable")) %>%
filter(T_Weighting_factor == "Total weights present in dataset") %>%
group_by(T_SURVEY_YEAR) %>%
count(T_SURVEY_NAME) %>%
pivot_wider(names_from = T_SURVEY_NAME, values_from = n) %>%
mutate(Year = as.character(T_SURVEY_YEAR)) %>%
ungroup() %>%
select(Year, EB, EQLS, ESS, ISSP) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center")
Year | EB | EQLS | ESS | ISSP |
2002 | 28 |
| 22 | 11 |
2003 | 28 | 28 |
| 14 |
2004 | 29 |
| 26 | 15 |
2005 | 29 |
|
| 13 |
2006 | 29 |
| 23 | 12 |
2007 | 30 | 31 |
| 13 |
2008 | 30 |
| 30 | 17 |
2009 | 30 |
|
| 19 |
2010 | 31 |
| 28 | 13 |
2011 | 32 | 33 |
| 13 |
2012 | 33 |
| 28 | 20 |
2013 | 33 |
|
| 17 |
2014 | 34 |
| 21 | 14 |
2015 | 33 |
|
| 16 |
2016 | 33 | 33 | 18 |
|
See Table 2 in the paper.
ESM2e02 %>% filter(T_Weighting_factor == "Total weights present in dataset") %>%
mutate(delta1 = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_psweights - Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights,
delta2 = Q_ABS_BIAS_INTERNAL_KOHLER_psweights - Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
group_by(T_SURVEY_NAME) %>%
summarise(mean_external = mean(delta1),
median_external = median(delta1),
mean_internal = mean(delta2, na.rm = T),
median_internal = median(delta2, na.rm = T), .groups = 'drop') %>%
rename("Project name" = T_SURVEY_NAME,
"Mean difference \n external" = mean_external,
"Median difference \n external" = median_external,
"Mean difference \n internal" = mean_internal,
"Median difference \n internal" = median_internal) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center") %>%
colformat_num(j = 2:3, big.mark = ",", digits = 3, na_str = "N/A")
INTERNAL CRITERIA WITH NO WEIGHTS: THE OUTLIERS
Descriptive statistics of data referenced in section 6.
ESM2e02 %>%
group_by(T_SURVEY_NAME) %>%
summarise(Q1 = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.25, na.rm = T),
median = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.25, na.rm = T),
Q3 = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.75, na.rm = T),
IQR = IQR(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = T),
Outlier_threshold = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.75, na.rm = T) + 1.5 * IQR(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = T), .groups = 'drop') %>%
rename("Project name" = T_SURVEY_NAME, "Outlier \n threshold" = Outlier_threshold) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center") %>%
colformat_num(j = 2:3, digits = 2, na_str = "N/A") %>%
colformat_num(j = 4:6, digits = 3, na_str = "N/A")
Figure 4 - with embedded R code
ESM2e02 %>%
filter(T_External_and_internal_criteria %in% c("Both applicable", "Only internal applicable")) %>%
ggplot(aes(x = T_SURVEY_NAME)) +
ylab("") +
scale_y_continuous(breaks = c(0, 1.96, 3, 6, 9, 12),
labels = c(0, 1.96, 3, 6, 9, 12),
limits = c(0, 12)) +
geom_boxplot(aes(y = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights), size = 1, width = 0.5, notch = FALSE, outlier.alpha = 0) +
geom_jitter(data = filter(ESM2e02, Outliers != "outliers"), aes(y = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights), width = 0.1, alpha = 0.2, na.rm = T) +
geom_label_repel(data = filter(ESM2e02, Outliers == "outliers"),
aes(y = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights,
label = T_SURVEY_LABEL,
fill = Outlier_fill),
label.size = unit(0.1, "mm"),
label.padding = unit(0.5, "mm"),
box.padding = unit(0.01, "mm"),
label.r = unit(1, "mm"),
color = "#A6080B",
direction = "x",
nudge_y = 0,
segment.alpha = 0,
force = 0.6,
max.overlaps = 100) +
scale_fill_manual(values = c("white", "gray80")) +
geom_hline(linetype = "twodash", yintercept = 1.96, alpha = 0.6) +
coord_cartesian(ylim = c(0.4,11.6)) +
theme_bw() + theme(text = element_text(family = "serif"),
axis.text.x = element_text(size = 12, face = "bold", color = "black"),
axis.title.x = element_blank(),
title = element_text(size = 12, face = "bold", color = "black"),
strip.text = element_text(size = 12, face = "bold", color = "black"),
axis.text.y = element_text(size = 12, face = "bold", color = "black"),
legend.position = "none",
plot.margin = unit(c(1,1,1,1),"mm"))

Number of national surveys evaluated per edition for data presented on Figure 4.
ESM2e02 %>%
filter(T_External_and_internal_criteria %in% c("Both applicable", "Only internal applicable")) %>%
count(T_SURVEY_NAME) %>%
rename("Project name" = T_SURVEY_NAME,
"Number of national surveys \n under evaluation" = n) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center")
Project name | Number of national surveys under evaluation |
EB | 432 |
EQLS | 125 |
ESS | 197 |
ISSP | 336 |
A list of outliers as represented on Figure 4.
ESM2e02 %>%
group_by(T_SURVEY_NAME) %>%
filter(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights > quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.75, na.rm = T) + 1.5 * IQR(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = T)) %>%
select(T_SURVEY_NAME, T_SURVEY_YEAR, T_COUNTRY, Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
rename("Project name" = T_SURVEY_NAME, "Year" = T_SURVEY_YEAR, "Country code" = T_COUNTRY, "Internal bias" = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
ungroup() %>%
mutate(`Country name` = countrycode(`Country code`, origin = "iso2c", destination = "country.name")) %>%
relocate(`Project name`, `Year`, `Country code`, `Country name`, `Internal bias`) %>%
arrange(`Project name`, `Country name`) %>%
qflextable() %>%
theme_booktabs() %>%
align(j = 2:4, align = "center") %>%
align_nottext_col(align = "center", header = T) %>%
colformat_num(digits = 3, big.mark = "", na_str = "N/A")
Project name | Year | Country code | Country name | Internal bias |
EB | 2016 | HR | Croatia | 4.66 |
EB | 2005 | IT | Italy | 4.88 |
EB | 2004 | MT | Malta | 4.55 |
EB | 2014 | SE | Sweden | 7.01 |
EB | 2015 | SE | Sweden | 6.38 |
EB | 2016 | SE | Sweden | 6.98 |
EQLS | 2016 | HR | Croatia | 3.97 |
EQLS | 2011 | CY | Cyprus | 4.01 |
EQLS | 2007 | IT | Italy | 3.99 |
EQLS | 2003 | GB | United Kingdom | 4.58 |
ESS | 2012 | CZ | Czechia | 3.52 |
ESS | 2010 | DK | Denmark | 3.56 |
ESS | 2016 | NO | Norway | 3.68 |
ESS | 2008 | SK | Slovakia | 11.16 |
ESS | 2010 | SK | Slovakia | 11.52 |
ESS | 2012 | SK | Slovakia | 10.15 |
ISSP | 2003 | FR | France | 6.88 |
ISSP | 2004 | FR | France | 6.07 |
ISSP | 2005 | FR | France | 5.32 |
ISSP | 2006 | FR | France | 8.34 |
ISSP | 2009 | FR | France | 6.28 |
ISSP | 2010 | FR | France | 9.66 |
ISSP | 2013 | FR | France | 4.69 |
ISSP | 2015 | FR | France | 4.75 |
ISSP | 2015 | GE | Georgia | 5.82 |
ISSP | 2008 | HU | Hungary | 4.62 |
ISSP | 2009 | HU | Hungary | 4.64 |
ISSP | 2008 | IT | Italy | 5.00 |
ISSP | 2003 | NL | Netherlands | 6.15 |
ISSP | 2004 | NL | Netherlands | 6.15 |
ISSP | 2006 | NL | Netherlands | 6.33 |
ISSP | 2008 | NL | Netherlands | 4.78 |
ISSP | 2013 | NL | Netherlands | 6.87 |
ISSP | 2014 | NL | Netherlands | 6.87 |
LS0tCnRpdGxlOiAiTXVsdGktcHJvamVjdCBhc3Nlc3NtZW50IG9mIHNhbXBsZSBxdWFsaXR5IGluIGNyb3NzLW5hdGlvbmFsIHN1cnZleXMiCnN1YnRpdGxlOiBSZXBsaWNhdGlvbiBtYXRlcmlhbHMKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciBwYWNrYWdlcywgd2FybmluZ3MgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBmb3IgbWFuaXB1bGF0aW5nIGRhdGEKbGlicmFyeShsYWJlbGxlZCkgIyBmb3IgdXNpbmcgbGFiZWxzCmxpYnJhcnkoZmxleHRhYmxlKSAjIGZvciBmb3JtYXR0aW5nIG91dHB1dCB0YWJsZXMKbGlicmFyeShyZWFkcikgIyBmb3IgcmVhZGluZyBjc3YgZmlsZXMKbGlicmFyeShicm9vbSkgIyBmb3IgZGVhbGluZyB3aXRoIGFubm95aW5nIG91dHB1dCBjaHVua3MKbGlicmFyeShzY2FsZXMpICMgZm9yIHBlcmNlbnRhZ2UgbGFiZWxsaW5nCmxpYnJhcnkoY291bnRyeWNvZGUpICMgZm9yIHdvcmtpbmcgd2l0aCBjb3VudHJ5IG5hbWVzCmxpYnJhcnkoZ2dyZXBlbCkgIyBmb3IgbGFiZWxzCmxpYnJhcnkoZ2d0aGVtZXMpICMgZm9yIHBsb3QgZm9ybWF0dGluZwpsaWJyYXJ5KGdncHVicikgIyBmb3IgcGxvdCBhcnJhbmdlbWVudHMKYGBgCgo8Yj4gU1VQTEVNRU5UQVJZIE1BVEVSSUFMUyA8L2I+CgpBcyBhY2NvbXBhbnlpbmcgbWF0ZXJpYWwgdG8g4oCcTXVsdGktcHJvamVjdCBhc3Nlc3NtZW50cyBvZiBzYW1wbGUgcXVhbGl0eSBpbiBjcm9zcy1uYXRpb25hbCBzdXJ2ZXlzOiBUaGUgcm9sZSBvZiB3ZWlnaHRzIGluIGFwcGx5aW5nIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBtZWFzdXJlcyBvZiBzYW1wbGUgYmlhc+KAnSwgdGhpcyBkb2N1bWVudCBwcmVzZW50cyAgZGV0YWlscyBvZiBkYXRhIHRyYW5zZm9ybWF0aW9ucywgc3RhdGlzdGljYWwgcHJvY2VkdXJlcywgYW5kIGV4YWN0IHJlc3VsdHMgb2YgYW5hbHlzZXMgcGVyZm9ybWVkIGluIHRoZSBwYXBlcidzIG1haW4gYm9keS4gQ29kZSBjaHVua3MgYXJlIGhpZGRlbiBieSBkZWZhdWx0IGJ1dCBjYW4gYmUgYWNjZXNzZWQgYnkgY2xpY2tpbmcgdGhlIHJlbGV2YW50IGJ1dHRvbnMuIEFsbCBjYWxjdWxhdGlvbnMgcmVseSBvbiB0aGUgcHVibGljbHkgYXZhaWxhYmxlIGludGVncmF0ZWQgLmNzdiBkYXRhIGZpbGUuCgpgYGB7cn0KRVNNMmUwMiA8LSByZWFkX2RlbGltKCJFU00yZTAyZi5jc3YiLCAiOyIsCiAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfZG91YmxlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgbmEgPSBjKCJOb3QgYXBwbGljYWJsZSIsICJOb3QgYXZhaWxhYmxlIiksIAogICAgICAgICAgICAgICAgICAgICAgdHJpbV93cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygKICAuZGVmYXVsdCA9IGNvbF9jaGFyYWN0ZXIoKSwKICBUX1NVUlZFWV9ZRUFSID0gY29sX2RvdWJsZSgpLAogIFFfUFJPUF9GRU1fUE9QVUxBVElPTl8xOF83NCA9IGNvbF9kb3VibGUoKSwKICBRX0VGRkVDVF9TSVpFX1BST1BfRkVNQUxFX0VYVEVSTkFMXzE4Xzc0X3Bzd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX0VGRkVDVF9TSVpFX1BST1BfRkVNQUxFX0VYVEVSTkFMXzE4Xzc0X2R3ZWlnaHRzX0VTUyA9IGNvbF9kb3VibGUoKSwKICBRX0VGRkVDVF9TSVpFX1BST1BfRkVNQUxFX0VYVEVSTkFMXzE4Xzc0X25vX3dlaWdodHMgPSBjb2xfZG91YmxlKCksCiAgUV9QUk9QX0ZFTV9JTlRFUk5BTF9LT0hMRVJfcHN3ZWlnaHRzX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX1BST1BfRkVNX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX1NVQlNBTVBMRV9TSVpFX0lOVEVSTkFMX0tPSExFUl9zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9FRkZFQ1RfU0laRV9QUk9QX0ZFTUFMRV9JTlRFUk5BTF9LT0hMRVJfcHN3ZWlnaHRzX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX0VGRkVDVF9TSVpFX1BST1BfRkVNQUxFX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQklBU19JTlRFUk5BTF9LT0hMRVJfcHN3ZWlnaHRzX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfZHdlaWdodHNfRVNTID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9kd2VpZ2h0c19FU1MgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX3Bzd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX25vX3dlaWdodHMgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfcHN3ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMgPSBjb2xfZG91YmxlKCkKKSkKYGBgCjxiPiBESVNUUklCVVRJT04gT0YgVEhFIFRZUEVTIE9GIFdFSUdIVFMgQVZBSUxBQkxFIEFDUk9TUyBUSEUgRk9VUiBQUk9KRUNUUyA8L2I+CgpGaWd1cmUgMSAtIHdpdGggZW1iZWRkZWQgUiBjb2RlCgpgYGB7ciBmaWcxLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gLjc1LCBmaWcuYWxpZ249ICdjZW50ZXInfQpFU00yZTAyICAlPiUKICBtdXRhdGUoVF9XZWlnaHRpbmdfZmFjdG9yMiA9IGZhY3RvcihFU00yZTAyJFRfV2VpZ2h0aW5nX2ZhY3RvcjIsIAogICAgICAgICAgbGV2ZWxzID0gYygiTm8gd2VpZ2h0cyIsICJQb3N0LXN0cmF0aWZpY2F0aW9uIHdlaWdodHMiLCAiUG9zdC1zdHJhdGlmaWNhdGlvbiB3ZWlnaHRzIHdpdGggZGVzaWduIHdlaWdodHMiKSwgCiAgICAgICAgICBsYWJlbHMgPSBjKCJObyB3ZWlnaHRzIiwgIlBvc3Qtc3RyYXRpZmljYXRpb24iLCAiUG9zdC1zdHJhdGlmaWNhdGlvbiBhbmQgZGVzaWduIikpKSAlPiUKICBtdXRhdGUoVF9TVVJWRVlfTkFNRSA9IGZhY3RvcihFU00yZTAyJFRfU1VSVkVZX05BTUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkVCIiwgIkVTUyIsICJFUUxTIiwgIklTU1AiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRUIiLCAiRVNTIiwgIkVRTFMiLCAiSVNTUCIpKSkgJT4lCiAgbXV0YXRlKGNudHJ5X29yZGVyID0gZmN0X2luZnJlcShhcy5mYWN0b3IoVF9DT1VOVFJZKSwgb3JkZXJlZCA9IEZBTFNFKSkgJT4lCiAgbXV0YXRlKGNudHJ5X2ZhY3RvciA9IGRlbnNlX3JhbmsoY250cnlfb3JkZXIpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGlmZWxzZShUX1NVUlZFWV9OQU1FID09ICJFQiIsIFRfU1VSVkVZX1lFQVIgLSAwLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVF9TVVJWRVlfTkFNRSA9PSAiRVNTIiwgVF9TVVJWRVlfWUVBUiAtIDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVF9TVVJWRVlfTkFNRSA9PSAiRVFMUyIsIFRfU1VSVkVZX1lFQVIgKyAwLjEsIFRfU1VSVkVZX1lFQVIgKyAwLjMpKSksIAogICAgICAgICAgICAgICAgIHkgPSBjbnRyeV9mYWN0b3IsIAogICAgICAgICAgICAgICAgIGZpbGwgPSBUX1dlaWdodGluZ19mYWN0b3IyLAogICAgICAgICAgICAgICAgIGNvbG9yID0gVF9XZWlnaHRpbmdfZmFjdG9yMiwKICAgICAgICAgICAgICAgICBzaGFwZSA9IFRfV2VpZ2h0aW5nX2ZhY3RvcjIpLAogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFLAogICAgICAgICAgICAgc2l6ZSA9IDIuNSwKICAgICAgICAgICAgIGFscGhhID0gMC44KSArCiAgZ2VvbV90ZXh0KGFlcyh4ID0gaWZlbHNlKFRfU1VSVkVZX05BTUUgPT0gIkVCIiwgVF9TVVJWRVlfWUVBUiAtIDAuMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFRfU1VSVkVZX05BTUUgPT0gIkVTUyIsIFRfU1VSVkVZX1lFQVIgLSAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVF9TVVJWRVlfTkFNRSA9PSAiRVFMUyIsIFRfU1VSVkVZX1lFQVIgKyAwLjEsIFRfU1VSVkVZX1lFQVIgKyAwLjMpKSksCiAgICAgICAgICAgICAgICB5ID0gLTAuOSwKICAgICAgICAgICAgICAgIGxhYmVsID0gaWZlbHNlKFRfU1VSVkVZX05BTUUgPT0gIkVCIiwgIkVCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShUX1NVUlZFWV9OQU1FID09ICJFU1MiLCAiRVNTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoVF9TVVJWRVlfTkFNRSA9PSAiRVFMUyIsICJFUUxTIiwgIklTU1AiKSkpKSwKICAgICAgICAgICAgc2l6ZSA9IDMuMiwKICAgICAgICAgICAgYW5nbGUgPSA5MCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNGMkNCM0QiLCAiIzRGOUREQiIsICIjNUExODE2IikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzAwMDAwMCIsICIjNEY5RERCIiwgIiM1QTE4MTYiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDIwMDI6MjAxNiksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCInMDIiLCAiJzAzIiwgIicwNCIsICInMDUiLCAiJzA2IiwgIicwNyIsICInMDgiLCAiJzA5IiwgIicxMCIsICInMTEiLCInMTIiLCAiJzEzIiwgIicxNCIsICInMTUiLCInMTYiKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMjAwMS43LCAyMDE2LjEpLCBtaW5vcl9icmVha3MgPSBzZXEoMjAwMS41LCAyMDE2LjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoMTo0MCksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkdlcm1hbnkiLCAJIkZpbmxhbmQiLCAJIkZyYW5jZSIsIAkiVW5pdGVkIEtpbmdkb20iLCAJIlN3ZWRlbiIsIAkiU2xvdmVuaWEiLCAJIkN6ZWNoaWEiLCAJIkRlbm1hcmsiLCAJIk5ldGhlcmxhbmRzIiwgCSJCZWxnaXVtIiwgCSJTcGFpbiIsIAkiSHVuZ2FyeSIsIAkiUG9sYW5kIiwgCSJQb3J0dWdhbCIsIAkiU2xvdmFraWEiLCAJIkF1c3RyaWEiLCAJIklyZWxhbmQiLCAJIkxhdHZpYSIsIAkiQnVsZ2FyaWEiLCAJIkxpdGh1YW5pYSIsIAkiQ3lwcnVzIiwgCSJFc3RvbmlhIiwgCSJDcm9hdGlhIiwgCSJUdXJrZXkiLCAJIkl0YWx5IiwgCSJHcmVlY2UiLCAJIk5vcndheSIsIAkiU3dpdHplcmxhbmQiLCAJIkx1eGVtYm91cmciLCAJIlJvbWFuaWEiLCAJIklzcmFlbCIsIAkiTWFsdGEiLCAJIlJ1c3NpYSIsIAkiSWNlbGFuZCIsIAkiTm9ydGggTWFjZWRvbmlhIiwgCSJNb250ZW5lZ3JvIiwgCSJTZXJiaWEiLCAJIlVrcmFpbmUiLCAJIkFsYmFuaWEiLCAJIkdlb3JnaWEiKSwgc2VjLmF4aXMgPSBzZWNfYXhpcyh+LioxLCBicmVha3MgPSBjKDE6NDApLCBsYWJlbHMgPSBjKCJERSIsICJGSSIsICJGUiIsICJHQiIsICJTRSIsICJTbCIsICJDWiIsICJESyIsICJOTCIsICJCRSIsICJFUyIsICJIVSIsICJQTCIsICJQVCIsICJTSyIsICJBVCIsICJJRSIsICJMViIsICJCRyIsICJMVCIsICJDWSIsICJFRSIsICJIUiIsICJUUiIsICJJVCIsICJHUiIsICJOTyIsICJDSCIsICJMVSIsICJSTyIsICJJTCIsICJNVCIsICJSVSIsICJJUyIsICJNSyIsICJNRSIsICJSUyIsICJVQSIsICJBTCIsICJHRSIpKSkgKwogIGd1aWRlcyhzaGFwZSA9IGd1aWRlX2xlZ2VuZCgiQXZhaWxhYmxlIHdlaWdodHMiKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiQXZhaWxhYmxlIHdlaWdodHMiKSwgY29sb3IgPSBndWlkZV9sZWdlbmQoIkF2YWlsYWJsZSB3ZWlnaHRzIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyMSwgMjIsIDIzKSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gIGMoMjAwMiwgMjAxNiksIHlsaW0gPSBjKC0xLCAzOSkpICsKICB0aGVtZV90dWZ0ZSgpICsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiKSwgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSxsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBtYXJnaW4gPSBtYXJnaW4oMCwwLDAsMCwgInB0IiksIGNvbG9yID0gImJsYWNrIiksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjEpLCBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMywgbGluZXR5cGUgPSAiZGFzaGVkIiksIHBsb3QubWFyZ2luID0gdW5pdChjKDEsMSwxLDEpLCJtbSIpLCBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKUmF3IGNvdW50cyBhbmQgcm93IHBlcmNlbnRhZ2VzIG9mIGRhdGEgcmVwcmVzZW50ZWQgaW4gdGhlIHBhcGVyIG9uIEZpZ3VyZSAxLgoKYGBge3J9CkVTTTJlMDIgJT4lCiAgY291bnQoVF9TVVJWRVlfTkFNRSwgVF9XZWlnaHRpbmdfZmFjdG9yMikgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFRfU1VSVkVZX05BTUUsIHZhbHVlc19mcm9tID0gbiwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICByZW5hbWUoIlR5cGUgb2Ygd2VpZ2h0IiA9IFRfV2VpZ2h0aW5nX2ZhY3RvcjIpICU+JQogIHFmbGV4dGFibGUoKSAlPiUKICBhbGlnbihqID0gMjo1LCBhbGlnbiA9ICJjZW50ZXIiKSAlPiUKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiKQpgYGAKCmBgYHtyfQpFU00yZTAyICU+JQogIGNvdW50KFRfU1VSVkVZX05BTUUsIFRfV2VpZ2h0aW5nX2ZhY3RvcjIpICU+JQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQogIG11dGF0ZShQZXJjZW50ID0gcGVyY2VudChuL3N1bShuKSwgYWNjdXJhY3kgPSAwLjEpKSAlPiUgCiAgc2VsZWN0KFRfU1VSVkVZX05BTUUsIFRfV2VpZ2h0aW5nX2ZhY3RvcjIsIFBlcmNlbnQpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFRfU1VSVkVZX05BTUUsIHZhbHVlc19mcm9tID0gUGVyY2VudCwgdmFsdWVzX2ZpbGwgPSAiMCUiKSAlPiUgCiAgcmVuYW1lKCJUeXBlIG9mIHdlaWdodCIgPSBUX1dlaWdodGluZ19mYWN0b3IyKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lIAogIHRoZW1lX2Jvb2t0YWJzKCkgJT4lCiAgYWxpZ24oaiA9IDEsIGFsaWduID0gImxlZnQiKQpgYGAKPGJyPgo8Yj4gU1RSSUNUIFZTIExFTklFTlQgQVBQUk9BQ0ggVE8gSU5URVJOQUwgQ1JJVEVSSUE6IFNFRSBTRUNUSU9OIDQuMy4gPC9iPgoKUGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgYmV0d2VlbiBiaWFzZXMgcmVzdWx0aW5nIGludGVybmFsIGNyaXRlcmlhIHdpdGhvdXQgd2VpZ2h0cyBhY2NvcmRpbmcgdG8gdGhlIHN0cmljdCBhcHByb2FjaCB2cyB0aGUgbGVuaWVudCBhcHByb2FjaC4gQ2FsY3VsYXRpb25zIHBlcmZvcm1lZCBmb3Igc3VydmV5cyB3aXRoaW4gdGhlIHR3byBwcm9qZWN0cyB3aGVyZSBkYXRhIGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0cmljdCBhcHByb2FjaCB3YXMgYXZhaWxhYmxlLgoKYGBge3J9CkVTTTJlMDIgJT4lIGZpbHRlcihUX1NVUlZFWV9OQU1FICVpbiUgYygiRVNTIiwgIkVRTFMiKSkgJT4lCmdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JSAKc3VtbWFyaXplKGBQZXJhc29uIGNvcnJlbGF0aW9uYCA9IChjb3IoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0c19zdHJpY3QsIG1ldGhvZCA9ICdwZWFyc29uJywgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lIAogIHJlbmFtZSgiUHJvamVjdCBuYW1lIiA9IFRfU1VSVkVZX05BTUUpICU+JQpxZmxleHRhYmxlKCkgJT4lIAp0aGVtZV9ib29rdGFicygpICU+JSAKYWxpZ25fbm90dGV4dF9jb2woYWxpZ24gPSAiY2VudGVyIikgJT4lIApjb2xmb3JtYXRfbnVtKGRpZ2l0cyA9IDIsIG5hX3N0ciA9ICJOL0EiKQpgYGAKPGJyPgo8Yj4gRElGRkVSRU5DRVMgSU4gVEhFIFZBTFVFUyBPRiBCSUFTIEFDQ09SRElORyBUTyBJTlRFUk5BTCBBTkQgRVhURVJOQUwgQ1JJVEVSSUE6IE5PIFdFSUdIVCBWUyBERVNJR04gV0VJR0hUIDwvYj4KCkZpZ3VyZSAyIC0gd2l0aCBlbWJlZGRlZCBSIGNvZGUKCmBgYHtyIGZpZzIsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAuNzUsIGZpZy5hbGlnbj0gJ2NlbnRlcid9CgptZWFuX3ZhbHMgPC0gRVNNMmUwMiAlPiUKICBmaWx0ZXIoVF9TVVJWRVlfTkFNRSA9PSAiRVNTIikgJT4lCiAgZmlsdGVyKCFUX1NVUlZFWV9FRElUSU9OX0NPVU5UUlkgJWluJSBjKCJFU1M0X1NLIiwgIkVTUzVfU0siLCAiRVNTNl9TSyIsICJFU1MzX0xWIiwgIkVTUzNfUk8iLCAiRVNTNF9MVCIpKSAlPiUKICBmaWx0ZXIoVF9ERUZGcF9FU1MgPT0gIkRFRkY+MSIpICU+JQogIGdyb3VwX2J5KFRfU1VSVkVZX0VESVRJT04pICU+JQogIHN1bW1hcmlzZShpbnRfbm8gPSBtZWFuKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIG5hLnJtID0gVFJVRSksIGludF9kcyA9IG1lYW4oUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTLCBuYS5ybSA9IFRSVUUpLCBleHRfbm8gPSBtZWFuKFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywgbmEucm0gPSBUUlVFKSwgZXh0X2RzID0gbWVhbihRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX2R3ZWlnaHRzX0VTUyxuYS5ybSA9IFRSVUUpLCAgLmdyb3VwcyA9ICdkcm9wJykKCnBsb3QyYSA8LSBFU00yZTAyICU+JQogIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiKSAlPiUKICBmaWx0ZXIoIVRfU1VSVkVZX0VESVRJT05fQ09VTlRSWSAlaW4lIGMoIkVTUzRfU0siLCAiRVNTNV9TSyIsICJFU1M2X1NLIiwgIkVTUzNfTFYiLCAiRVNTM19STyIsICJFU1M0X0xUIikpICU+JQogIGZpbHRlcihUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgZmlsdGVyKFRfRXh0ZXJuYWxfYW5kX2ludGVybmFsX2NyaXRlcmlhICE9ICJPbmx5IGV4dGVybmFsIGFwcGxpY2FibGUiKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2d0aXRsZSgiU2FtcGxlIGJpYXMgYWNjb3JkaW5nIHRvIGludGVybmFsIGNyaXRlcmlhIikgKwogIHlsYWIoIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxLjk2LCAzLCA2LCA5LCAxMiksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKDAsIDEuOTYsIDMsIDYsIDksIDEyKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgMTIpKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IDEsICB5ID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgZmlsbCA9IGFzLmZhY3RvcigxKSwgc2hhcGUgPSBhcy5mYWN0b3IoMSkpLCAKICAgICAgICAgICAgIGFscGhhID0gMC41LCBzaG93LmxlZ2VuZCA9IFRSVUUsIHNpemUgPSAyLjUpICsKICBnZW9tX3Zpb2xpbihhZXMoZ3JvdXAgPSBUX1NVUlZFWV9ZRUFSLCB4ID0gMSwgeSA9IFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIGZpbGwgPSBhcy5mYWN0b3IoMSkpLCAKICAgICAgICAgICAgICBhbHBoYSA9IDAuMDEsIHRyaW0gPSBUUlVFLCBzaXplID0gMC44LCBuYS5ybSA9IFRSVUUsIGRyYXdfcXVhbnRpbGVzID0gMC41LCBzaG93LmxlZ2VuZCA9IFRSVUUpICsgCiAgZ2VvbV9wb2ludChhZXMoeCA9IDIsICB5ID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTLCBmaWxsID0gYXMuZmFjdG9yKDIpLCBzaGFwZSA9IGFzLmZhY3RvcigyKSksIAogICAgICAgICAgICAgYWxwaGEgPSAgMC41LCBzaXplID0gMi41LCBzaG93LmxlZ2VuZCA9IFRSVUUpICsgCiAgZ2VvbV92aW9saW4oYWVzKGdyb3VwID0gVF9TVVJWRVlfWUVBUiwgeCA9IDIsIHkgPSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9kd2VpZ2h0c19FU1MsIGZpbGwgPSBhcy5mYWN0b3IoMikpLAogICAgICAgICAgICAgIGFscGhhID0gMC4wMSwgdHJpbSA9IFRSVUUsIHNpemUgPSAwLjgsIGRyYXdfcXVhbnRpbGVzID0gMC41LCBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBnZW9tX2hsaW5lKGxpbmV0eXBlID0gInR3b2Rhc2giLCB5aW50ZXJjZXB0ID0gMS45NiwgYWxwaGEgPSAwLjYpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0YyQ0IzRCIgLCAiI0E2MDgwQiIpLCBsYWJlbHMgPSBjKCJXaXRob3V0IFdlaWdodHMiLCAiRGVzaWduIFdlaWdodHMiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNGMkNCM0QiICwgIiNBNjA4MEIiKSwgbGFiZWxzID0gYygiV2l0aG91dCBXZWlnaHRzIiwgIkRlc2lnbiBXZWlnaHRzIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygyMSAsIDI0KSwgbGFiZWxzID0gYygiV2l0aG91dCBXZWlnaHRzIiwgIkRlc2lnbiBXZWlnaHRzIikpICsKICBnZW9tX3BvaW50KGRhdGEgPSBtZWFuX3ZhbHMsIGFlcyh4ID0gMiwgeSA9IGludF9kcyksIHNoYXBlID0gIlgiLCBzaXplID0gNCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG1lYW5fdmFscywgYWVzKHggPSAxLCB5ID0gaW50X25vKSwgc2hhcGUgPSAiWCIsIHNpemUgPSA0LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ3VpZGVzKHNoYXBlID0gZ3VpZGVfbGVnZW5kKCJNZWRpYW4gdmFsdWVzIGluZGljYXRlZCBieSBob3Jpem9udGFsIGxpbmUgYW5kIHRoZSBtZWFuIGJ5IFggIiksIAogICAgICAgICBjb2xvdXIgPSBndWlkZV9sZWdlbmQoIk1lZGlhbiB2YWx1ZXMgaW5kaWNhdGVkIGJ5IGhvcml6b250YWwgbGluZSBhbmQgdGhlIG1lYW4gYnkgWCAiKSwgCiAgICAgICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoIk1lZGlhbiB2YWx1ZXMgaW5kaWNhdGVkIGJ5IGhvcml6b250YWwgbGluZSBhbmQgdGhlIG1lYW4gYnkgWCAiKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLjEsIDkpKSArCiAgdGhlbWVfYncoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIpLCAKICAgICAgICAgICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksIAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwibW0iLCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMS4yLCJsaW5lIikpICsKICBmYWNldF93cmFwKH4gVF9TVVJWRVlfRURJVElPTiwgbnJvdyA9IDEpCgpwbG90MmIgPC0gRVNNMmUwMiAlPiUKICBmaWx0ZXIoVF9TVVJWRVlfTkFNRSA9PSAiRVNTIikgJT4lCiAgZmlsdGVyKCFUX1NVUlZFWV9FRElUSU9OX0NPVU5UUlkgJWluJSBjKCJFU1M0X1NLIiwgIkVTUzVfU0siLCAiRVNTNl9TSyIsICJFU1MzX0xWIiwgIkVTUzNfUk8iLCAiRVNTNF9MVCIpKSAlPiUKICBmaWx0ZXIoVF9ERUZGcF9FU1MgPT0gIkRFRkY+MSIpICU+JQogIGdncGxvdCgpICsKICBnZ3RpdGxlKCJTYW1wbGUgYmlhcyBhY2NvcmRpbmcgdG8gZXh0ZXJuYWwgY3JpdGVyaWEiKSArCiAgeWxhYigiIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDEuOTYsIDMsIDYsIDkpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygwLCAxLjk2LCAzLCA2LCA5KSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgOSkpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gMSwgIHkgPSBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX25vX3dlaWdodHMsIGZpbGwgPSBhcy5mYWN0b3IoMSksIHNoYXBlID0gYXMuZmFjdG9yKDEpKSwgCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgc2l6ZSA9IDIuNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fdmlvbGluKGFlcyhncm91cCA9IFRfU1VSVkVZX1lFQVIsIHggPSAxLCB5ID0gUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9ub193ZWlnaHRzLCBmaWxsID0gYXMuZmFjdG9yKDEpKSwgCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjAxLCB0cmltID0gVFJVRSwgc2l6ZSA9IDAuOCwgZHJhd19xdWFudGlsZXMgPSAwLjUsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gMiwgIHkgPSBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX2R3ZWlnaHRzX0VTUywgZmlsbCA9IGFzLmZhY3RvcigyKSwgc2hhcGUgPSBhcy5mYWN0b3IoMikpLCAKICAgICAgICAgICAgIGFscGhhID0gMC41LCBzaXplID0gMi41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV92aW9saW4oYWVzKGdyb3VwID0gVF9TVVJWRVlfWUVBUiwgeCA9IDIsIHkgPSBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX2R3ZWlnaHRzX0VTUywgZmlsbCA9IGFzLmZhY3RvcigyKSksIAogICAgICAgICAgICAgIGFscGhhID0gMC4wMSwgdHJpbSA9IFRSVUUsIHNpemUgPSAwLjgsIGRyYXdfcXVhbnRpbGVzID0gMC41LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9obGluZShsaW5ldHlwZSA9ICJ0d29kYXNoIiwgeWludGVyY2VwdCA9IDEuOTYsIGFscGhhID0gMC42KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGMkNCM0QiICwgIiNBNjA4MEIiKSwgbGFiZWxzID0gYygiV2l0aG91dCBXZWlnaHRzIiwgIkRlc2lnbiBXZWlnaHRzIikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjJDQjNEIiAsICIjQTYwODBCIiksIGxhYmVscyA9IGMoIldpdGhvdXQgV2VpZ2h0cyIsICJEZXNpZ24gV2VpZ2h0cyIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMjEgLCAyNCksIGxhYmVscyA9IGMoIldpdGhvdXQgV2VpZ2h0cyIsICJEZXNpZ24gV2VpZ2h0cyIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gbWVhbl92YWxzLCBhZXMoeCA9IDIsIHkgPSBleHRfZHMpLCBzaGFwZSA9ICJYIiwgc2l6ZSA9IDQsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGRhdGEgPSBtZWFuX3ZhbHMsIGFlcyh4ID0gMSwgeSA9IGV4dF9ubyksIHNoYXBlID0gIlgiLCBzaXplID0gNCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLjEsIDkpKSArCiAgZ3VpZGVzKGNvbG91ciA9IEZBTFNFLCBzaGFwZSA9IEZBTFNFLCBmaWxsID0gRkFMU0UpICsKICB0aGVtZV9idygpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiksIAogICAgICAgICAgICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwxLDEsMSksIm1tIikpICsgCiAgZmFjZXRfd3JhcCh+IFRfU1VSVkVZX0VESVRJT04sIG5yb3cgPSAxKQoKZ2dhcnJhbmdlKHBsb3QyYiwgcGxvdDJhLCBucm93ID0gMikKCmBgYAo8YnI+Ck51bWJlciBvZiBuYXRpb25hbCBzdXJ2ZXlzIGV2YWx1YXRlZCBwZXIgZWRpdGlvbiBmb3IgZGF0YSBwcmVzZW50ZWQgb24gRmlndXJlIDIuCmBgYHtyfQpFU00yZTAyICU+JQogIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiKSAlPiUKICBmaWx0ZXIoIVRfU1VSVkVZX0VESVRJT05fQ09VTlRSWSAlaW4lIGMoIkVTUzRfU0siLCAiRVNTNV9TSyIsICJFU1M2X1NLIiwgIkVTUzNfTFYiLCAiRVNTM19STyIsICJFU1M0X0xUIikpICU+JQogIGZpbHRlcihUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgY291bnQoVF9TVVJWRVlfRURJVElPTikgJT4lCnJlbmFtZSgiUHJvamVjdCBFZGl0aW9uIiA9IFRfU1VSVkVZX0VESVRJT04sCiAgICAgICAiTnVtYmVyIG9mIG5hdGlvbmFsIHN1cnZleXMgXG4gdW5kZXIgZXZhbHVhdGlvbiIgPSBuKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lIAogIHRoZW1lX2Jvb2t0YWJzKCkgJT4lIAogIGFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIpIApgYGAKPGJyPgpNZWFuIGFuZCBtZWRpYW4gdmFsdWVzIGZvciBkYXRhIHJlcHJlc2VudGVkIG9uIEZpZ3VyZSAyLgoKYGBge3J9CkVTTTJlMDIgJT4lIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiLCBUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgbXV0YXRlKGRlbHRhMSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfZHdlaWdodHNfRVNTICAtIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywKICAgICAgICAgZGVsdGEyID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTIC0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgZ3JvdXBfYnkoVF9TVVJWRVlfRURJVElPTikgJT4lCiAgc3VtbWFyaXNlKG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCA9IG1lYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVkaWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhblhkaWZmZXJlbmNlX2ludGVybmFsID0gbWVhbihkZWx0YTIpLAogICAgICAgICAgICBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCA9IHJvdW5kKG1lZGlhbihkZWx0YTIpLCBkaWdpdHMgPSAyKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgcmVuYW1lKCJFU1Mgd2F2ZSIgPSBUX1NVUlZFWV9FRElUSU9OLCAKICAgICAgICAgIk1lYW4gZGlmZmVyZW5jZSBcbiBleHRlcm5hbCIgPSBtZWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwsCiAgICAgICAgICJNZWRpYW4gZGlmZmVyZW5jZSBcbiBleHRlcm5hbCIgID0gbWVkaWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwsCiAgICAgICAgICJNZWFuIGRpZmZlcmVuY2UgXG4gaW50ZXJuYWwiID0gbWVhblhkaWZmZXJlbmNlX2ludGVybmFsLAogICAgICAgICAiTWVkaWFuIGRpZmZlcmVuY2UgXG4gaW50ZXJuYWwiID0gbWVkaWFuWGRpZmZlcmVuY2VfaW50ZXJuYWwpICU+JQogIHFmbGV4dGFibGUoKSAlPiUgCiAgdGhlbWVfYm9va3RhYnMoKSAlPiUKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiLCBoZWFkZXIgPSBUKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSAyOjUsIGRpZ2l0cyA9IDEsIG5hX3N0ciA9ICJOL0EiKQpgYGAKCjxicj4KTWVhbiBhbmQgbWVkaWFuIGRpZmZlcmVuY2VzIGFzIHJlZmVyZW5jZWQgaW4gc2VjdGlvbiA1LjEuCgpgYGB7cn0KRVNNMmUwMiAlPiUgZmlsdGVyKFRfU1VSVkVZX05BTUUgPT0gIkVTUyIsIFRfREVGRnBfRVNTID09ICJERUZGPjEiKSAlPiUKICBtdXRhdGUoZGVsdGExID0gUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9kd2VpZ2h0c19FU1MgIC0gUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9ub193ZWlnaHRzLAogICAgICAgICBkZWx0YTIgPSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9kd2VpZ2h0c19FU1MgLSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzKSAlPiUKICBzdW1tYXJpc2UobWVhblhkaWZmZXJlbmNlX2V4dGVybmFsID0gbWVhbihkZWx0YTEpLAogICAgICAgICAgICBtZWRpYW5YZGlmZmVyZW5jZV9leHRlcm5hbCA9IG1lZGlhbihkZWx0YTEpLAogICAgICAgICAgICBtZWFuWGRpZmZlcmVuY2VfaW50ZXJuYWwgPSBtZWFuKGRlbHRhMiksCiAgICAgICAgICAgIG1lZGlhblhkaWZmZXJlbmNlX2ludGVybmFsID0gcm91bmQobWVkaWFuKGRlbHRhMiksIGRpZ2l0cyA9IDIpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBwaXZvdF9sb25nZXIoMTo0LCBuYW1lc190byA9IGMoImZ1biIsICJEaWZmZXJlbmNlIiksIHZhbHVlc190byA9ICJ2YWx1ZXMiLCBuYW1lc19zZXAgPSAiWCIpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmdW4sIHZhbHVlc19mcm9tID0gdmFsdWVzKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lIAogIHRoZW1lX2Jvb2t0YWJzKCkgJT4lCiAgY29sZm9ybWF0X251bShqID0gMjozLCBkaWdpdHMgPSAxLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IFdJVEhJTi1QUk9KRUNUIERJRkZFUkVOQ0VTIEJFVFdFRU4gQklBUyBXSVRIIEFORCBXSVRIT1VUIFBPU1QtU1RSQVRJRklDQVRJT04gV0VJR0hUUyA8L2I+CgpGaWd1cmUgMyAtIHdpdGggZW1iZWRkZWQgUiBjb2RlCjxicj4KPGI+Tm90ZTo8L2I+IEluIHRoZSBwYXBlciwgdGhlIGludGVybmFsIGFuZCBleHRlcm5hbCBjcml0ZXJpYSB2aXN1YWxpc2F0aW9ucyBoYXZlIGJlZW4gYXJyYW5nZWQgb24gcGFyYWxsZWwgcGFuZWxzIGluIG9yZGVyIHRvIG1pbmltaXplIG92ZXJhbGwgZmlndXJlIHNpemUuCgpgYGB7ciBmaWczYSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuYXNwPS44NSwgZmlnLndpZHRoPTQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiBFU00yZTAyICU+JSAKICBmaWx0ZXIoIVRfU1VSVkVZX0VESVRJT05fQ09VTlRSWSAlaW4lIGMoIklTU1AyMDA3X05MIiwgIklTU1AyMDE1X0RLIikpICU+JQogIGZpbHRlcihUX1dlaWdodGluZ19mYWN0b3IgPT0gIlRvdGFsIHdlaWdodHMgcHJlc2VudCBpbiBkYXRhc2V0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gVF9TVVJWRVlfWUVBUikpICsgCiAgZ2d0aXRsZSgiU2FtcGxlIGJpYXMgYWNjb3JkaW5nIHRvIGV4dGVybmFsIGNyaXRlcmlhIikgKwogIHlsYWIoIiIpICsKICB4bGFiKCIiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMjAwMjoyMDE2KSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIicwMiIsICInMDMiLCAiJzA0IiwgIicwNSIsICInMDYiLCAiJzA3IiwgIicwOCIsICInMDkiLCAiJzEwIiwgIicxMSIsIicxMiIsICInMTMiLCAiJzE0IiwgIicxNSIsIicxNiIpLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygyMDAxLjMsIDIwMTYuNykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxLjk2LCAzLCA2LCA5LCAxMiksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKDAsIDEuOTYsIDMsIDYsIDksIDEyKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgMTMpKSAgKwogIGdlb21fdmlvbGluKGFlcyhncm91cCA9IFRfU1VSVkVZX1lFQVIsIHggPSBUX1NVUlZFWV9ZRUFSIC0gMC4yLCAgeSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywgZmlsbCA9IGFzLmZhY3RvcigxKSksCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjQsCiAgICAgICAgICAgICAgdHJpbSA9IFRSVUUsCiAgICAgICAgICAgICAgbmEucm0gPSBULAogICAgICAgICAgICAgIHNpemUgPSAwLjgsCiAgICAgICAgICAgICAgZHJhd19xdWFudGlsZXMgPSAwLjUpICsKICBnZW9tX3Zpb2xpbihhZXMoZ3JvdXAgPSBUX1NVUlZFWV9ZRUFSLCB4ID0gVF9TVVJWRVlfWUVBUiArIDAuMiwgeSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfcHN3ZWlnaHRzLAogICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3IoMikpLAogICAgICAgICAgICAgIGFscGhhID0gMC44LAogICAgICAgICAgICAgIHRyaW0gPSBUUlVFLAogICAgICAgICAgICAgIG5hLnJtID0gVCwKICAgICAgICAgICAgICBzaXplID0gMC44LAogICAgICAgICAgICAgIGRyYXdfcXVhbnRpbGVzID0gMC41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0YyQ0IzRCIgLCAiIzE2MkFGMiIpLCBsYWJlbHMgPSBjKCJXaXRob3V0IHdlaWdodHMiLCAiUG9zdC1zdHJhdGlmaWNhdGlvbiB3ZWlnaHRzIikpICsKICBnZW9tX2hsaW5lKGxpbmV0eXBlID0gInR3b2Rhc2giLCB5aW50ZXJjZXB0ID0gMS45NiwgYWxwaGEgPSAwLjYpICsKICBndWlkZXMoc2hhcGUgPSBGQUxTRSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJBYnNvbHV0ZSBiaWFzIHBlciB3YXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gYygwLjIsIDgpKSksIGNvbG9yID0gRkFMU0UsIGFscGhhID0gRkFMU0UpICsKICB0aGVtZV9idygpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiKSwgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94ID0gInZlcnRpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwxLDEsMSksIm1tIikpICsKICBmYWNldF93cmFwKH4gVF9TVVJWRVlfTkFNRSwgbnJvdyA9IDQpCmBgYAoKYGBge3IgZmlnM2IsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmFzcCA9IC44NSwgZmlnLndpZHRoID0gNCwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CiBFU00yZTAyICU+JQogIGZpbHRlcihUX0V4dGVybmFsX2FuZF9pbnRlcm5hbF9jcml0ZXJpYSAlaW4lIGMoIkJvdGggYXBwbGljYWJsZSIsICJPbmx5IGV4dGVybmFsIGFwcGxpY2FibGUiKSkgJT4lCiAgZmlsdGVyKFRfV2VpZ2h0aW5nX2ZhY3RvciA9PSAiVG90YWwgd2VpZ2h0cyBwcmVzZW50IGluIGRhdGFzZXQiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBUX1NVUlZFWV9ZRUFSKSkgKyAKICBnZ3RpdGxlKCJTYW1wbGUgYmlhcyBhY2NvcmRpbmcgdG8gaW50ZXJuYWwgY3JpdGVyaWEiKSArCiAgeWxhYigiIikgKwogIHhsYWIoIiIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyMDAyOjIwMTYpLCAKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiJzAyIiwgIicwMyIsICInMDQiLCAiJzA1IiwgIicwNiIsICInMDciLCAiJzA4IiwgIicwOSIsICInMTAiLCAiJzExIiwiJzEyIiwgIicxMyIsICInMTQiLCAiJzE1IiwiJzE2IiksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDIwMDEuMywgMjAxNi43KSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxLjk2LCAzLCA2LCA5LCAxMiksIAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKDAsIDEuOTYsIDMsIDYsIDksIDEyKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgMTMpKSAgKwogIGdlb21fdmlvbGluKGFlcyhncm91cCA9IFRfU1VSVkVZX1lFQVIsIHggPSBUX1NVUlZFWV9ZRUFSIC0gMC4yLAogICAgICAgICAgICAgICAgICB5ID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgIAogICAgICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKDEpKSwKICAgICAgICAgICAgICBuYS5ybSA9IFQsCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjQsIAogICAgICAgICAgICAgIHRyaW0gPSBUUlVFLCAKICAgICAgICAgICAgICBzaXplID0gMC44LAogICAgICAgICAgICAgIGRyYXdfcXVhbnRpbGVzID0gMC41KSArCiAgZ2VvbV92aW9saW4oYWVzKGdyb3VwID0gVF9TVVJWRVlfWUVBUiwKICAgICAgICAgICAgICAgICAgeCA9IFRfU1VSVkVZX1lFQVIgKyAwLjIsCiAgICAgICAgICAgICAgICAgIHkgPSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHMsCiAgICAgICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3IoMikpLAogICAgICAgICAgICAgIG5hLnJtID0gVCwKICAgICAgICAgICAgICBhbHBoYSA9IDAuOSwgCiAgICAgICAgICAgICAgdHJpbSA9IFRSVUUsIAogICAgICAgICAgICAgIHNpemUgPSAwLjgsCiAgICAgICAgICAgICAgZHJhd19xdWFudGlsZXMgPSAwLjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjJDQjNEIiAsICIjMTYyQUYyIiksIGxhYmVscyA9IGMoIldpdGhvdXQgd2VpZ2h0cyIsICJQb3N0LXN0cmF0aWZpY2F0aW9uIHdlaWdodHMiKSkgKwogIGdlb21faGxpbmUobGluZXR5cGUgPSAidHdvZGFzaCIsIHlpbnRlcmNlcHQgPSAxLjk2LCBhbHBoYSA9IDAuNikgKwogIGd1aWRlcyhzaGFwZSA9IEZBTFNFLCBmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFic29sdXRlIGJpYXMgcGVyIHdhdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSBjKDAuMiwgOCkpKSwgY29sb3IgPSBGQUxTRSwgYWxwaGEgPSBGQUxTRSkgKwogIHRoZW1lX2J3KCkgKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIpLCBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDEsMSwxKSwibW0iKSkgKwogIGZhY2V0X3dyYXAofiBUX1NVUlZFWV9OQU1FLCBucm93ID0gNCkKYGBgCjxicj4KTnVtYmVyIG9mIG5hdGlvbmFsIHN1cnZleXMgZXZhbHVhdGVkIHBlciBlZGl0aW9uIGZvciBkYXRhIHByZXNlbnRlZCBvbiBGaWd1cmUgMy4KYGBge3J9CkVTTTJlMDIgJT4lCiAgZmlsdGVyKFRfRXh0ZXJuYWxfYW5kX2ludGVybmFsX2NyaXRlcmlhICVpbiUgYygiQm90aCBhcHBsaWNhYmxlIiwgIk9ubHkgZXh0ZXJuYWwgYXBwbGljYWJsZSIsICJPbmx5IGV4dGVybmFsIGFwcGxpY2FibGUiKSkgJT4lCiAgZmlsdGVyKFRfV2VpZ2h0aW5nX2ZhY3RvciA9PSAiVG90YWwgd2VpZ2h0cyBwcmVzZW50IGluIGRhdGFzZXQiKSAlPiUKICBncm91cF9ieShUX1NVUlZFWV9ZRUFSKSAlPiUKY291bnQoVF9TVVJWRVlfTkFNRSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFRfU1VSVkVZX05BTUUsIHZhbHVlc19mcm9tID0gbikgJT4lCiAgbXV0YXRlKFllYXIgPSBhcy5jaGFyYWN0ZXIoVF9TVVJWRVlfWUVBUikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoWWVhciwgRUIsIEVRTFMsIEVTUywgSVNTUCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JSAKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiKSAKYGBgCgpTZWUgVGFibGUgMiBpbiB0aGUgcGFwZXIuCgpgYGB7cn0KRVNNMmUwMiAlPiUgZmlsdGVyKFRfV2VpZ2h0aW5nX2ZhY3RvciA9PSAiVG90YWwgd2VpZ2h0cyBwcmVzZW50IGluIGRhdGFzZXQiKSAlPiUgCiAgbXV0YXRlKGRlbHRhMSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfcHN3ZWlnaHRzIC0gUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9ub193ZWlnaHRzLAogICAgICAgICBkZWx0YTIgPSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHMgLSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzKSAlPiUKICBncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUKICBzdW1tYXJpc2UobWVhbl9leHRlcm5hbCA9IG1lYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVkaWFuX2V4dGVybmFsID0gbWVkaWFuKGRlbHRhMSksCiAgICAgICAgICAgIG1lYW5faW50ZXJuYWwgPSBtZWFuKGRlbHRhMiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWVkaWFuX2ludGVybmFsID0gbWVkaWFuKGRlbHRhMiwgbmEucm0gPSBUKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgcmVuYW1lKCJQcm9qZWN0IG5hbWUiID0gVF9TVVJWRVlfTkFNRSwKICAgICAgICAgIk1lYW4gZGlmZmVyZW5jZSBcbiBleHRlcm5hbCIgPSBtZWFuX2V4dGVybmFsLAogICAgICAgICAiTWVkaWFuIGRpZmZlcmVuY2UgXG4gZXh0ZXJuYWwiID0gbWVkaWFuX2V4dGVybmFsLAogICAgICAgICAiTWVhbiBkaWZmZXJlbmNlIFxuIGludGVybmFsIiA9IG1lYW5faW50ZXJuYWwsCiAgICAgICAgICJNZWRpYW4gZGlmZmVyZW5jZSBcbiBpbnRlcm5hbCIgPSBtZWRpYW5faW50ZXJuYWwpICU+JQogIHFmbGV4dGFibGUoKSAlPiUgCiAgdGhlbWVfYm9va3RhYnMoKSAlPiUgCiAgYWxpZ25fbm90dGV4dF9jb2woYWxpZ24gPSAiY2VudGVyIikgJT4lCiAgY29sZm9ybWF0X251bShqID0gMjozLCBiaWcubWFyayA9ICIsIiwgZGlnaXRzID0gMywgbmFfc3RyID0gIk4vQSIpCmBgYAo8YnI+CjxiPiBJTlRFUk5BTCBDUklURVJJQSBXSVRIIE5PIFdFSUdIVFM6IFRIRSBPVVRMSUVSUyA8L2I+CgpEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIGRhdGEgcmVmZXJlbmNlZCBpbiBzZWN0aW9uIDYuCgpgYGB7cn0KRVNNMmUwMiAlPiUKICBncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUKICBzdW1tYXJpc2UoUTEgPSBxdWFudGlsZShRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBwcm9icyA9IDAuMjUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1lZGlhbiA9IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC4yNSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgUTMgPSBxdWFudGlsZShRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBwcm9icyA9IDAuNzUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIElRUiA9IElRUihRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBPdXRsaWVyX3RocmVzaG9sZCA9IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC43NSwgbmEucm0gPSBUKSArIDEuNSAqIElRUihRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBuYS5ybSA9IFQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICByZW5hbWUoIlByb2plY3QgbmFtZSIgPSBUX1NVUlZFWV9OQU1FLCAiT3V0bGllciBcbiB0aHJlc2hvbGQiID0gT3V0bGllcl90aHJlc2hvbGQpICU+JQogIHFmbGV4dGFibGUoKSAlPiUgCiAgdGhlbWVfYm9va3RhYnMoKSAlPiUgCiAgYWxpZ25fbm90dGV4dF9jb2woYWxpZ24gPSAiY2VudGVyIikgJT4lCiAgY29sZm9ybWF0X251bShqID0gMjozLCBkaWdpdHMgPSAyLCBuYV9zdHIgPSAiTi9BIikgJT4lCiAgY29sZm9ybWF0X251bShqID0gNDo2LCBkaWdpdHMgPSAzLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KRmlndXJlIDQgLSB3aXRoIGVtYmVkZGVkIFIgY29kZQpgYGB7ciBmaWc0LCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gLjc1LCBmaWcuYWxpZ249ICdjZW50ZXInLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEZ9CkVTTTJlMDIgJT4lIAogIGZpbHRlcihUX0V4dGVybmFsX2FuZF9pbnRlcm5hbF9jcml0ZXJpYSAlaW4lIGMoIkJvdGggYXBwbGljYWJsZSIsICJPbmx5IGludGVybmFsIGFwcGxpY2FibGUiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gVF9TVVJWRVlfTkFNRSkpICsgCiAgeWxhYigiIikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDEuOTYsIDMsIDYsIDksIDEyKSwgCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoMCwgMS45NiwgIDMsIDYsIDksIDEyKSwgCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgMTIpKSArCiAgZ2VvbV9ib3hwbG90KGFlcyh5ID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cyksIHNpemUgPSAxLCB3aWR0aCA9IDAuNSwgbm90Y2ggPSBGQUxTRSwgb3V0bGllci5hbHBoYSA9IDApICsKICBnZW9tX2ppdHRlcihkYXRhID0gZmlsdGVyKEVTTTJlMDIsIE91dGxpZXJzICE9ICJvdXRsaWVycyIpLCBhZXMoeSA9IFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMpLCB3aWR0aCA9IDAuMSwgYWxwaGEgPSAwLjIsIG5hLnJtID0gVCkgKwogIGdlb21fbGFiZWxfcmVwZWwoZGF0YSA9IGZpbHRlcihFU00yZTAyLCBPdXRsaWVycyA9PSAib3V0bGllcnMiKSwKICAgICAgICAgICAgICAgICAgIGFlcyh5ID0gIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUX1NVUlZFWV9MQUJFTCwKICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gT3V0bGllcl9maWxsKSwKICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSB1bml0KDAuMSwgIm1tIiksIAogICAgICAgICAgICAgICAgICAgbGFiZWwucGFkZGluZyA9IHVuaXQoMC41LCAibW0iKSwKICAgICAgICAgICAgICAgICAgIGJveC5wYWRkaW5nID0gdW5pdCgwLjAxLCAibW0iKSwKICAgICAgICAgICAgICAgICAgIGxhYmVsLnIgPSB1bml0KDEsICJtbSIpLCAKICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNBNjA4MEIiLAogICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIngiLAogICAgICAgICAgICAgICAgICAgbnVkZ2VfeSA9IDAsCiAgICAgICAgICAgICAgICAgICBzZWdtZW50LmFscGhhID0gMCwgCiAgICAgICAgICAgICAgICAgICBmb3JjZSA9IDAuNiwKICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcyA9IDEwMCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9ICBjKCJ3aGl0ZSIsICJncmF5ODAiKSkgKwogIGdlb21faGxpbmUobGluZXR5cGUgPSAidHdvZGFzaCIsIHlpbnRlcmNlcHQgPSAxLjk2LCBhbHBoYSA9IDAuNikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLjQsMTEuNikpICsKICB0aGVtZV9idygpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiKSwKICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiLCBjb2xvciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwxLDEsMSksIm1tIikpCmBgYAo8YnI+Ck51bWJlciBvZiBuYXRpb25hbCBzdXJ2ZXlzIGV2YWx1YXRlZCBwZXIgZWRpdGlvbiBmb3IgZGF0YSBwcmVzZW50ZWQgb24gRmlndXJlIDQuCmBgYHtyfQpFU00yZTAyICU+JSAKICBmaWx0ZXIoVF9FeHRlcm5hbF9hbmRfaW50ZXJuYWxfY3JpdGVyaWEgJWluJSBjKCJCb3RoIGFwcGxpY2FibGUiLCAiT25seSBpbnRlcm5hbCBhcHBsaWNhYmxlIikpICU+JQpjb3VudChUX1NVUlZFWV9OQU1FKSAlPiUKICAgIHJlbmFtZSgiUHJvamVjdCBuYW1lIiA9IFRfU1VSVkVZX05BTUUsCiAgICAgICAgICJOdW1iZXIgb2YgbmF0aW9uYWwgc3VydmV5cyBcbiB1bmRlciBldmFsdWF0aW9uIiA9IG4pICU+JQogIHFmbGV4dGFibGUoKSAlPiUgCiAgdGhlbWVfYm9va3RhYnMoKSAlPiUgCiAgYWxpZ25fbm90dGV4dF9jb2woYWxpZ24gPSAiY2VudGVyIikKYGBgCjxicj4KQSBsaXN0IG9mIG91dGxpZXJzIGFzIHJlcHJlc2VudGVkIG9uIEZpZ3VyZSA0LgoKYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQpFU00yZTAyICU+JSAKICBncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUKICBmaWx0ZXIoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cyA+IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC43NSwgbmEucm0gPSBUKSArIDEuNSAqIElRUihRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBuYS5ybSA9IFQpKSAlPiUKICBzZWxlY3QoVF9TVVJWRVlfTkFNRSwgVF9TVVJWRVlfWUVBUiwgVF9DT1VOVFJZLCBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzKSAlPiUKICByZW5hbWUoIlByb2plY3QgbmFtZSIgPSBUX1NVUlZFWV9OQU1FLCAiWWVhciIgPSBUX1NVUlZFWV9ZRUFSLCAiQ291bnRyeSBjb2RlIiA9IFRfQ09VTlRSWSwgICJJbnRlcm5hbCBiaWFzIiA9IFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYENvdW50cnkgbmFtZWAgPSBjb3VudHJ5Y29kZShgQ291bnRyeSBjb2RlYCwgb3JpZ2luID0gImlzbzJjIiwgZGVzdGluYXRpb24gPSAiY291bnRyeS5uYW1lIikpICU+JQogIHJlbG9jYXRlKGBQcm9qZWN0IG5hbWVgLCBgWWVhcmAsIGBDb3VudHJ5IGNvZGVgLCBgQ291bnRyeSBuYW1lYCwgYEludGVybmFsIGJpYXNgKSAlPiUKICBhcnJhbmdlKGBQcm9qZWN0IG5hbWVgLCBgQ291bnRyeSBuYW1lYCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduKGogPSAyOjQsIGFsaWduID0gImNlbnRlciIpICU+JQogIGFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIsIGhlYWRlciA9IFQpICU+JQogIGNvbGZvcm1hdF9udW0oZGlnaXRzID0gMywgYmlnLm1hcmsgPSAiIiwgbmFfc3RyID0gIk4vQSIpCmBgYA==