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

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("ESM2e02.csv", ";",
                      escape_double = FALSE, 
                      na = "Not applicable", 
                      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

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")
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")


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")


DIFFERENCES IN THE VALUES OF BIAS ACCORDING TO INTERNAL AND EXTERNAL CRITERIA: NO WEIGHT VS DESIGN WEIGHT

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 = median(delta2), .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")


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 = median(delta2), .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")


WITHIN-PROJECT DIFFERENCES BETWEEN BIAS WITH AND WITHOUT POST-STRATIFICATION WEIGHTS

See Table 2 in the paper.

ESM2e02 %>% filter(T_Weighing_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")


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`) %>%
  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")
LS0tCnRpdGxlOiAnTXVsdGktcHJvamVjdCBhc3Nlc3NtZW50IG9mIHNhbXBsZSBxdWFsaXR5IGluIGNyb3NzLW5hdGlvbmFsIHN1cnZleXMnCnN1YnRpdGxlOiAnUmVwbGljYXRpb24gbWF0ZXJpYWxzJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IgcGFja2FnZXMsIHdhcm5pbmdzID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpICMgZm9yIG1hbmlwdWxhdGluZyBkYXRhCmxpYnJhcnkobGFiZWxsZWQpICMgZm9yIHVzaW5nIGxhYmVscwpsaWJyYXJ5KGZsZXh0YWJsZSkgIyBmb3IgZm9ybWF0dGluZyBvdXRwdXQgdGFibGVzCmxpYnJhcnkocmVhZHIpICMgZm9yIHJlYWRpbmcgY3N2IGZpbGVzCmxpYnJhcnkoYnJvb20pICMgZm9yIGRlYWxpbmcgd2l0aCBhbm5veWluZyBvdXRwdXQgY2h1bmtzCmxpYnJhcnkoc2NhbGVzKSAjIGZvciBwZXJjZW50YWdlIGxhYmVsbGluZwpsaWJyYXJ5KGNvdW50cnljb2RlKSAjIGZvciB3b3JraW5nIHdpdGggY291bnRyeSBuYW1lcwpgYGAKCjxiPiBTVVBMRU1FTlRBUlkgTUFURVJJQUxTIDwvYj4KCkFzIGFjY29tcGFueWluZyBtYXRlcmlhbCB0byDigJxNdWx0aS1wcm9qZWN0IGFzc2Vzc21lbnRzIG9mIHNhbXBsZSBxdWFsaXR5IGluIGNyb3NzLW5hdGlvbmFsIHN1cnZleXM6IFRoZSByb2xlIG9mIHdlaWdodHMgaW4gYXBwbHlpbmcgZXh0ZXJuYWwgYW5kIGludGVybmFsIG1lYXN1cmVzIG9mIHNhbXBsZSBiaWFz4oCdLCB0aGlzIGRvY3VtZW50IHByZXNlbnRzICBkZXRhaWxzIG9mIGRhdGEgdHJhbnNmb3JtYXRpb25zLCBzdGF0aXN0aWNhbCBwcm9jZWR1cmVzLCBhbmQgZXhhY3QgcmVzdWx0cyBvZiBhbmFseXNlcyBwZXJmb3JtZWQgaW4gdGhlIHBhcGVyJ3MgbWFpbiBib2R5LiBDb2RlIGNodW5rcyBhcmUgaGlkZGVuIGJ5IGRlZmF1bHQgYnV0IGNhbiBiZSBhY2Nlc3NlZCBieSBjbGlja2luZyB0aGUgcmVsZXZhbnQgYnV0dG9ucy4gQWxsIGNhbGN1bGF0aW9ucyByZWx5IG9uIHRoZSBwdWJsaWNseSBhdmFpbGFibGUgaW50ZWdyYXRlZCAuY3N2IGRhdGEgZmlsZS4KCmBgYHtyfQpFU00yZTAyIDwtIHJlYWRfZGVsaW0oIkVTTTJlMDIuY3N2IiwgIjsiLAogICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgIG5hID0gIk5vdCBhcHBsaWNhYmxlIiwgCiAgICAgICAgICAgICAgICAgICAgICB0cmltX3dzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKAogIC5kZWZhdWx0ID0gY29sX2NoYXJhY3RlcigpLAogIFRfU1VSVkVZX1lFQVIgPSBjb2xfZG91YmxlKCksCiAgUV9QUk9QX0ZFTV9QT1BVTEFUSU9OXzE4Xzc0ID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfRVhURVJOQUxfMThfNzRfcHN3ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfRVhURVJOQUxfMThfNzRfZHdlaWdodHNfRVNTID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfRVhURVJOQUxfMThfNzRfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX1BST1BfRkVNX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfUFJPUF9GRU1fSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfU1VCU0FNUExFX1NJWkVfSU5URVJOQUxfS09ITEVSX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX0VGRkVDVF9TSVpFX1BST1BfRkVNQUxFX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX3Bzd2VpZ2h0c19zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0c19zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0c19zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9kd2VpZ2h0c19FU1MgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9ub193ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX2R3ZWlnaHRzX0VTUyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfcHN3ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHMgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKQopKQpgYGAKPGI+IERJU1RSSUJVVElPTiBPRiBUSEUgVFlQRVMgT0YgV0VJR0hUUyBBVkFJTEFCTEUgQUNST1NTIFRIRSBGT1VSIFBST0pFQ1RTIDwvYj4KClJhdyBjb3VudHMgYW5kIHJvdyBwZXJjZW50YWdlcyBvZiBkYXRhIHJlcHJlc2VudGVkIGluIHRoZSBwYXBlciBvbiBGaWd1cmUgMS4KCmBgYHtyfQpFU00yZTAyICU+JQogIGNvdW50KFRfU1VSVkVZX05BTUUsIFRfV2VpZ2h0aW5nX2ZhY3RvcjIpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBUX1NVUlZFWV9OQU1FLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkgJT4lCiAgcmVuYW1lKCJUeXBlIG9mIHdlaWdodCIgPSBUX1dlaWdodGluZ19mYWN0b3IyKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lCiAgYWxpZ24oaiA9IDI6NSwgYWxpZ24gPSAiY2VudGVyIikgJT4lCiAgYWxpZ25fbm90dGV4dF9jb2woYWxpZ24gPSAiY2VudGVyIikKYGBgCgpgYGB7cn0KRVNNMmUwMiAlPiUKICBjb3VudChUX1NVUlZFWV9OQU1FLCBUX1dlaWdodGluZ19mYWN0b3IyKSAlPiUKICBncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUKICBtdXRhdGUoUGVyY2VudCA9IHBlcmNlbnQobi9zdW0obiksIGFjY3VyYWN5ID0gMC4xKSkgJT4lIAogIHNlbGVjdChUX1NVUlZFWV9OQU1FLCBUX1dlaWdodGluZ19mYWN0b3IyLCBQZXJjZW50KSAlPiUgCiAgdW5ncm91cCgpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBUX1NVUlZFWV9OQU1FLCB2YWx1ZXNfZnJvbSA9IFBlcmNlbnQsIHZhbHVlc19maWxsID0gIjAlIikgJT4lIAogIHJlbmFtZSgiVHlwZSBvZiB3ZWlnaHQiID0gVF9XZWlnaHRpbmdfZmFjdG9yMikgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduKGogPSAxLCBhbGlnbiA9ICJsZWZ0IikKYGBgCjxicj4KPGI+IFNUUklDVCBWUyBMRU5JRU5UIEFQUFJPQUNIIFRPIElOVEVSTkFMIENSSVRFUklBOiBTRUUgU0VDVElPTiA0LjMuIDwvYj4KClBlYXJzb24gY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGJldHdlZW4gYmlhc2VzIHJlc3VsdGluZyBpbnRlcm5hbCBjcml0ZXJpYSB3aXRob3V0IHdlaWdodHMgYWNjb3JkaW5nIHRvIHRoZSBzdHJpY3QgYXBwcm9hY2ggdnMgdGhlIGxlbmllbnQgYXBwcm9hY2guIENhbGN1bGF0aW9ucyBwZXJmb3JtZWQgZm9yIHN1cnZleXMgd2l0aGluIHRoZSB0d28gcHJvamVjdHMgd2hlcmUgZGF0YSBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdHJpY3QgYXBwcm9hY2ggd2FzIGF2YWlsYWJsZS4KCmBgYHtyfQpFU00yZTAyICU+JSBmaWx0ZXIoVF9TVVJWRVlfTkFNRSAlaW4lIGMoIkVTUyIsICJFUUxTIikpICU+JQpncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUgCnN1bW1hcml6ZShgUGVyYXNvbiBjb3JyZWxhdGlvbmAgPSAoY29yKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0LCBtZXRob2QgPSAncGVhcnNvbicsIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSksIC5ncm91cHMgPSAnZHJvcCcpICU+JSAKICByZW5hbWUoIlByb2plY3QgbmFtZSIgPSBUX1NVUlZFWV9OQU1FKSAlPiUKcWZsZXh0YWJsZSgpICU+JSAKdGhlbWVfYm9va3RhYnMoKSAlPiUgCmFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIpICU+JSAKY29sZm9ybWF0X251bShkaWdpdHMgPSAyLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IERJRkZFUkVOQ0VTIElOIFRIRSBWQUxVRVMgT0YgQklBUyBBQ0NPUkRJTkcgVE8gSU5URVJOQUwgQU5EIEVYVEVSTkFMIENSSVRFUklBOiBOTyBXRUlHSFQgVlMgREVTSUdOIFdFSUdIVCA8L2I+CgpNZWFuIGFuZCBtZWRpYW4gdmFsdWVzIGZvciBkYXRhIHJlcHJlc2VudGVkIG9uIEZpZ3VyZSAyLgoKYGBge3J9CkVTTTJlMDIgJT4lIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiLCBUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgbXV0YXRlKGRlbHRhMSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfZHdlaWdodHNfRVNTICAtIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywKICAgICAgICAgZGVsdGEyID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTIC0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgZ3JvdXBfYnkoVF9TVVJWRVlfRURJVElPTikgJT4lCiAgc3VtbWFyaXNlKG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCA9IG1lYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVkaWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhblhkaWZmZXJlbmNlX2ludGVybmFsID0gbWVhbihkZWx0YTIpLAogICAgICAgICAgICBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCA9IG1lZGlhbihkZWx0YTIpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICByZW5hbWUoIkVTUyB3YXZlIiA9IFRfU1VSVkVZX0VESVRJT04sIAogICAgICAgICAiTWVhbiBkaWZmZXJlbmNlIFxuIGV4dGVybmFsIiA9IG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCwKICAgICAgICAgIk1lZGlhbiBkaWZmZXJlbmNlIFxuIGV4dGVybmFsIiAgPSBtZWRpYW5YZGlmZmVyZW5jZV9leHRlcm5hbCwKICAgICAgICAgIk1lYW4gZGlmZmVyZW5jZSBcbiBpbnRlcm5hbCIgPSBtZWFuWGRpZmZlcmVuY2VfaW50ZXJuYWwsCiAgICAgICAgICJNZWRpYW4gZGlmZmVyZW5jZSBcbiBpbnRlcm5hbCIgPSBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIsIGhlYWRlciA9IFQpICU+JQogIGNvbGZvcm1hdF9udW0oaiA9IDI6NSwgZGlnaXRzID0gMSwgbmFfc3RyID0gIk4vQSIpCmBgYAo8YnI+Ck1lYW4gYW5kIG1lZGlhbiBkaWZmZXJlbmNlcyBhcyByZWZlcmVuY2VkIGluIHNlY3Rpb24gNS4xLgoKYGBge3J9CkVTTTJlMDIgJT4lIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiLCBUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgbXV0YXRlKGRlbHRhMSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfZHdlaWdodHNfRVNTICAtIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywKICAgICAgICAgZGVsdGEyID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTIC0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgc3VtbWFyaXNlKG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCA9IG1lYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVkaWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhblhkaWZmZXJlbmNlX2ludGVybmFsID0gbWVhbihkZWx0YTIpLAogICAgICAgICAgICBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCA9IG1lZGlhbihkZWx0YTIpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBwaXZvdF9sb25nZXIoMTo0LCBuYW1lc190byA9IGMoImZ1biIsICJEaWZmZXJlbmNlIiksIHZhbHVlc190byA9ICJ2YWx1ZXMiLCBuYW1lc19zZXAgPSAiWCIpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmdW4sIHZhbHVlc19mcm9tID0gdmFsdWVzKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lIAogIHRoZW1lX2Jvb2t0YWJzKCkgJT4lCiAgY29sZm9ybWF0X251bShqID0gMjozLCBkaWdpdHMgPSAxLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IFdJVEhJTi1QUk9KRUNUIERJRkZFUkVOQ0VTIEJFVFdFRU4gQklBUyBXSVRIIEFORCBXSVRIT1VUIFBPU1QtU1RSQVRJRklDQVRJT04gV0VJR0hUUyA8L2I+CgpTZWUgVGFibGUgMiBpbiB0aGUgcGFwZXIuCgpgYGB7cn0KRVNNMmUwMiAlPiUgZmlsdGVyKFRfV2VpZ2hpbmdfZmFjdG9yID09ICJUb3RhbCB3ZWlnaHRzIHByZXNlbnQgaW4gZGF0YXNldCIpICU+JSAKICBtdXRhdGUoZGVsdGExID0gUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9wc3dlaWdodHMgLSBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX25vX3dlaWdodHMsCiAgICAgICAgIGRlbHRhMiA9IFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX3Bzd2VpZ2h0cyAtIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMpICU+JQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQogIHN1bW1hcmlzZShtZWFuX2V4dGVybmFsID0gbWVhbihkZWx0YTEpLAogICAgICAgICAgICBtZWRpYW5fZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhbl9pbnRlcm5hbCA9IG1lYW4oZGVsdGEyLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtZWRpYW5faW50ZXJuYWwgPSBtZWRpYW4oZGVsdGEyLCBuYS5ybSA9IFQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICByZW5hbWUoIlByb2plY3QgbmFtZSIgPSBUX1NVUlZFWV9OQU1FLAogICAgICAgICAiTWVhbiBkaWZmZXJlbmNlIFxuIGV4dGVybmFsIiA9IG1lYW5fZXh0ZXJuYWwsCiAgICAgICAgICJNZWRpYW4gZGlmZmVyZW5jZSBcbiBleHRlcm5hbCIgPSBtZWRpYW5fZXh0ZXJuYWwsCiAgICAgICAgICJNZWFuIGRpZmZlcmVuY2UgXG4gaW50ZXJuYWwiID0gbWVhbl9pbnRlcm5hbCwKICAgICAgICAgIk1lZGlhbiBkaWZmZXJlbmNlIFxuIGludGVybmFsIiA9IG1lZGlhbl9pbnRlcm5hbCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JSAKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSAyOjMsIGJpZy5tYXJrID0gIiwiLCBkaWdpdHMgPSAzLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IElOVEVSTkFMIENSSVRFUklBIFdJVEggTk8gV0VJR0hUUzogVEhFIE9VVExJRVJTIDwvYj4KCkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgZGF0YSByZWZlcmVuY2VkIGluIHNlY3Rpb24gNi4KCmBgYHtyfQpFU00yZTAyICU+JQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQogIHN1bW1hcmlzZShRMSA9IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC4yNSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWVkaWFuID0gcXVhbnRpbGUoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgcHJvYnMgPSAwLjI1LCBuYS5ybSA9IFQpLAogICAgICAgICAgICBRMyA9IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC43NSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgSVFSID0gSVFSKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIG5hLnJtID0gVCksCiAgICAgICAgICAgIE91dGxpZXJfdGhyZXNob2xkID0gcXVhbnRpbGUoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgcHJvYnMgPSAwLjc1LCBuYS5ybSA9IFQpICsgMS41ICogSVFSKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIG5hLnJtID0gVCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIHJlbmFtZSgiUHJvamVjdCBuYW1lIiA9IFRfU1VSVkVZX05BTUUsICJPdXRsaWVyIFxuIHRocmVzaG9sZCIgPSBPdXRsaWVyX3RocmVzaG9sZCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JSAKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSAyOjMsIGRpZ2l0cyA9IDIsIG5hX3N0ciA9ICJOL0EiKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSA0OjYsIGRpZ2l0cyA9IDMsIG5hX3N0ciA9ICJOL0EiKQpgYGAKPGJyPgpBIGxpc3Qgb2Ygb3V0bGllcnMgYXMgcmVwcmVzZW50ZWQgb24gRmlndXJlIDQuCgpgYGB7cn0KRVNNMmUwMiAlPiUgCiAgZ3JvdXBfYnkoVF9TVVJWRVlfTkFNRSkgJT4lCiAgZmlsdGVyKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMgPiBxdWFudGlsZShRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBwcm9icyA9IDAuNzUsIG5hLnJtID0gVCkgKyAxLjUgKiBJUVIoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgbmEucm0gPSBUKSkgJT4lCiAgc2VsZWN0KFRfU1VSVkVZX05BTUUsIFRfU1VSVkVZX1lFQVIsIFRfQ09VTlRSWSwgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgcmVuYW1lKCJQcm9qZWN0IG5hbWUiID0gVF9TVVJWRVlfTkFNRSwgIlllYXIiID0gVF9TVVJWRVlfWUVBUiwgIkNvdW50cnkgY29kZSIgPSBUX0NPVU5UUlksICAiSW50ZXJuYWwgYmlhcyIgPSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGBDb3VudHJ5IG5hbWVgID0gY291bnRyeWNvZGUoYENvdW50cnkgY29kZWAsIG9yaWdpbiA9ICJpc28yYyIsIGRlc3RpbmF0aW9uID0gImNvdW50cnkubmFtZSIpKSAlPiUKICByZWxvY2F0ZShgUHJvamVjdCBuYW1lYCwgYFllYXJgLCBgQ291bnRyeSBjb2RlYCwgYENvdW50cnkgbmFtZWAsIGBJbnRlcm5hbCBiaWFzYCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduKGogPSAyOjQsIGFsaWduID0gImNlbnRlciIpICU+JQogIGFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIsIGhlYWRlciA9IFQpICU+JQogIGNvbGZvcm1hdF9udW0oZGlnaXRzID0gMywgYmlnLm1hcmsgPSAiIiwgbmFfc3RyID0gIk4vQSIpCmBgYA==