Basics

Data summary

metadata1 %>%
  group_by(T_SURVEY_NAME) %>%
  summarise(n_surveys = n_distinct(T_SURVEY_ID),
            n_countries = n_distinct(T_SURVEY_COUNTRY),
            n_waves = n_distinct(T_SURVEY_ROUND),
            min_year = min(T_SURVEY_YEAR),
            max_year = max(T_SURVEY_YEAR))

There are 45 countries altogether. Of those, 17 are not included in all projects:

metadata1 %>%
  count(T_SURVEY_NAME, T_SURVEY_COUNTRY) %>%
  spread(T_SURVEY_NAME, n) %>%
  filter(is.na(EQLS + ESS + EVS + ISSP))

Excess bias

by project

Proportion of surveys with excess (> 1.96) absolute bias:

metadata1 %>%
  mutate(is_sig = Q_Abs_bias_internal_criteria > 1.96) %>%
  count(T_SURVEY_NAME, is_sig) %>%
  group_by(T_SURVEY_NAME) %>%
  mutate(prop_sig = round(n / sum(n), 3)) %>%
  filter(is_sig == TRUE) %>%
  select(T_SURVEY_NAME, prop_sig)

2008 was a difficult year for surveys?

Numbers above bars indicate the number of surveys for which bias was possible to calculate.

part1 <- metadata1 %>%
  drop_na(Q_Abs_bias_internal_criteria) %>%
  filter(T_SURVEY_NAME != "ISSP") %>%
  mutate(is_sig = Q_Abs_bias_internal_criteria > 1.96,
         round = gsub("^[A-Z]{1,4}", "", T_SURVEY_ROUND)) %>%
  count(T_SURVEY_NAME, round, is_sig) %>%
  group_by(T_SURVEY_NAME, round) %>%
  mutate(prop_sig = n / sum(n),
         nsurveys = sum(n)) %>%
  filter(is_sig == TRUE) %>%
  ggplot(.) +
  geom_bar(aes(x = round, y = prop_sig), stat = "Identity", fill = "gray70") +
  geom_text(aes(x = round, y = prop_sig + 0.03, label = nsurveys), col = "gray20") +
  theme_bw() +
  facet_wrap("T_SURVEY_NAME", scales = "free_x")

part2 <- metadata1 %>%
  drop_na(Q_Abs_bias_internal_criteria) %>%
  filter(T_SURVEY_NAME == "ISSP") %>%
  mutate(is_sig = Q_Abs_bias_internal_criteria > 1.96,
         round = gsub("^[A-Z]{1,4}", "", T_SURVEY_ROUND)) %>%
  count(T_SURVEY_NAME, round, is_sig) %>%
  group_by(T_SURVEY_NAME, round) %>%
  mutate(prop_sig = n / sum(n),
         nsurveys = sum(n)) %>%
  filter(is_sig == TRUE) %>%
  ggplot(.) +
  geom_bar(aes(x = round, y = prop_sig), stat = "Identity", fill = "gray70") +
  geom_text(aes(x = round, y = prop_sig + 0.035, label = nsurveys), col = "gray20") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90)) +
  facet_wrap("T_SURVEY_NAME", scales = "free_x")

part1 / part2

by country

Surveys with absolute bias > 1.96 by country.

metadata1 %>%
  drop_na(Q_Abs_bias_internal_criteria) %>%
  group_by(T_SURVEY_COUNTRY) %>%
  mutate(total_surveys = n(),
         total_projects = n_distinct(T_SURVEY_NAME),
         is_sig = Q_Abs_bias_internal_criteria > 1.96) %>%
  group_by(T_SURVEY_COUNTRY, is_sig) %>%
  mutate(bias_surveys = n(),
         bias_projects = n_distinct(T_SURVEY_NAME)) %>%
  ungroup() %>%
  distinct(T_SURVEY_COUNTRY, total_surveys, bias_surveys, total_projects, bias_projects, is_sig) %>%
  complete(is_sig, T_SURVEY_COUNTRY, fill = list(bias_surveys = 0, bias_projects = 0)) %>%
  group_by(T_SURVEY_COUNTRY) %>%
  mutate(total_surveys = max(total_surveys, na.rm = T),
         total_projects = max(total_projects, na.rm = T)) %>%
  filter(is_sig == TRUE) %>%
  mutate(prop_bias = round(bias_surveys / total_surveys, 3)) %>%
  select(T_SURVEY_COUNTRY, total_surveys, bias_surveys, prop_bias, total_projects, bias_projects) %>%
  arrange(desc(prop_bias))

Changes over time

Bias

Orange dots indicate surveys from the waves analyzed in Kohler 2007.

metadata1 %>%
  ungroup() %>%
  mutate(S_SAMPLE_TYPE = fct_collapse(S_SAMPLE_TYPE,
                                      noinfo_insuff = c("no info", "insuff")),
         S_SAMPLE_TYPE = fct_rev(S_SAMPLE_TYPE),
         K2007 = T_SURVEY_ROUND %in% c("EQLS1", "ESS1", "ESS2", "EVS1999", "ISSP2002")) %>%
  ggplot(., aes(x = T_SURVEY_YEAR, y = Q_Bias_internal_criteria, col = K2007)) +
  geom_point(size = 2, alpha = 0.5) +
  scale_color_manual(values = c("gray50", "darkorange")) +
  theme_bw() +
  theme(legend.position = "none") +
  xlab("")

Surveys with absolute bias exceeding 5 are labelled.

metadata1 %>%
  ggplot(., aes(x = T_SURVEY_YEAR, y = Q_Bias_internal_criteria)) +
  geom_point(size = 2) +
  gghighlight(Q_Abs_bias_internal_criteria > 5) +
  geom_text_repel(aes(label = T_SURVEY_ID), size = 3.5) +
  theme_bw() +
  xlab("")

Absolute bias and response rates

Note the different Y axis ranges.

metadata1 %>%
  filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
         mode == "f2f") %>%
  # filter(Q_Abs_bias_internal_criteria < 4.5) %>%
  select(T_SURVEY_NAME, T_SURVEY_COUNTRY, T_SURVEY_ROUND, T_SURVEY_YEAR,
         Q_Abs_bias_internal_criteria, S_RR1_CALC_VALUE) %>%
  gather(var, value, c(S_RR1_CALC_VALUE, Q_Abs_bias_internal_criteria)) %>%
  drop_na(value) %>%
  ggplot(., aes(x = T_SURVEY_YEAR,
                y = value)) +
  geom_point(alpha = 0.1) +
  geom_smooth(method = "loess") +
  theme_bw() +
  facet_wrap(T_SURVEY_NAME ~ var, scales = "free_y", ncol = 2)

Absolute bias by sample type

part1 <- metadata1 %>%
  filter(T_SURVEY_NAME %in% c("ESS", "EQLS")) %>%
  ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
  geom_boxplot() +
  theme_bw() +
  xlab("") +
  facet_wrap("T_SURVEY_NAME", ncol = 1)

part2 <- metadata1 %>%
  filter(T_SURVEY_NAME %in% c("ISSP", "EVS")) %>%
  ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
  geom_boxplot() +
  theme_bw() +
  ylab("") + xlab("") +
  facet_wrap("T_SURVEY_NAME", ncol = 1)

part1 + part2 + plot_layout(widths = c(1, 2))

Excluding absolute bias > 4.

part1 <- metadata1 %>%
  filter(T_SURVEY_NAME %in% c("ESS", "EQLS")) %>%
  ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
  geom_boxplot() +
  theme_bw() +
  xlab("") + ylim(0,4) +
  facet_wrap("T_SURVEY_NAME", ncol = 1)

part2 <- metadata1 %>%
  filter(T_SURVEY_NAME %in% c("ISSP", "EVS")) %>%
  ggplot(., aes(x = S_SAMPLE_TYPE, y = Q_Abs_bias_internal_criteria)) +
  geom_boxplot() +
  theme_bw() +
  ylab("") + xlab("") + ylim(0,4) +
  facet_wrap("T_SURVEY_NAME", ncol = 1)

part1 + part2 + plot_layout(widths = c(1, 2))

Bias and response rates

Overall

Excludes sample types: no information, insufficient, non-probability.

metadata1 %>%
  filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
         mode == "f2f") %>%
  ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
  geom_point(aes(col = T_SURVEY_NAME), size = 2, alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE) +
  xlim(0, 1) +
  theme_bw()

Excludes RR >= 0.9, and sample types: no information, insufficient, non-probability.

metadata1 %>%
  filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
         mode == "f2f",
         S_RR1_CALC_VALUE < 0.9) %>%
  ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
  geom_point(aes(col = T_SURVEY_NAME), size = 2, alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE) +
  xlim(0, 1) +
  theme_bw()

By sample type

Excludes RR >= 0.9, and sample types: no information, insufficient, non-probability.

metadata1 %>%
  filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
         mode == "f2f",
         S_RR1_CALC_VALUE < 0.9) %>%  
  ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
  geom_point(size = 2, alpha = 0.1) +
  geom_smooth(method = "loess", se = FALSE, size = 1) +
  theme_bw() +
  facet_wrap("S_SAMPLE_TYPE")

By sample type and project

Excludes RR >= 0.9, and sample types: no information, insufficient, non-probability.

metadata1 %>%
  filter(!S_SAMPLE_TYPE %in% c("no info", "insuff", "non-prob"),
         mode == "f2f",
         S_RR1_CALC_VALUE < 0.9) %>%  
  ggplot(., aes(x = S_RR1_CALC_VALUE, y = Q_Abs_bias_internal_criteria)) +
  geom_point(size = 2, alpha = 0.1) +
  geom_smooth(method = "loess", se = FALSE) +
  theme_bw() +
  facet_grid(T_SURVEY_NAME ~ S_SAMPLE_TYPE)

LS0tDQp0aXRsZTogIlN1cnZleXMiDQpkYXRlOiAiNy8xMy8yMDIxIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoZ2doaWdobGlnaHQpDQoNCm1ldGFkYXRhIDwtIHJpbzo6aW1wb3J0KCIwMF9NZXRhZGF0YV9FUUxTX0VTU19FVlNfSVNTUF8yMV8wN18wMi5zYXYiLCB1c2VyX25hID0gVFJVRSkNCg0KDQptZXRhZGF0YTEgPC0gbWV0YWRhdGEgJT4lDQogIHphcF9sYWJlbHMoKSAlPiUNCiAgbXV0YXRlKFNfU0FNUExFX1RZUEUgPSBwbHlyOjptYXB2YWx1ZXMoU19TQU1QTEVfVFlQRSwgYyhOQSwgMSwyLDMsNCw1LDYsNyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIm5vIGluZm8iLCAibm9uLXByb2IiLCAibXVsdGkgUlIiLCAibXVsdGkgSEgiLCAibXVsdGkgaW5kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZSBzdGFnZSIsICJtdWx0aSB1bnNwZWMiLCAiaW5zdWZmIikpLA0KICAgICAgICAgU19TQU1QTEVfVFlQRSA9IGZhY3RvcihTX1NBTVBMRV9UWVBFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJtdWx0aSB1bnNwZWMiLCAibm9uLXByb2IiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGkgUlIiLCAibXVsdGkgSEgiLCAibXVsdGkgaW5kIiwgInNpbmdsZSBzdGFnZSIpKSwNCiAgICAgICAgIFNfV0lUSElOX0hIX1NFTEVDVElPTiA9IHBseXI6Om1hcHZhbHVlcyhTX1dJVEhJTl9ISF9TRUxFQ1RJT04sIGMoMCwxLDYsNyw5LDEwLE5BKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJub3QgYXBwIiwgIktpc2giLCAiYmlydGhkYXkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXJ0aGRheSBzZWxmLWNvbXBsIiwgImluc3VmZiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1yYW5kb20iLCAibWlzcyIpKSwNCiAgICAgICAgIHllYXIgPSBUX1NVUlZFWV9ZRUFSIC0gMTk4MSwNCiAgICAgICAgIG1vZGUgPSBjYXNlX3doZW4oDQogICAgICAgICAgIFNfTU9ERV9GMkYgPT0gMSB+ICJmMmYiLA0KICAgICAgICAgICBTX01PREVfQ0FUSSA9PSAxIH4gImNhdGkiLA0KICAgICAgICAgICBTX01PREVfQ0FXSSA9PSAxIH4gImNhd2kiLA0KICAgICAgICAgICBTX01PREVfUE9TVF9NQUlMID09IDEgfiAibWFpbCIsDQogICAgICAgICAgIFNfTU9ERV9TRUxGX0NPTVBMRVRJT04gPT0gMSB+ICJzZWxmIiwNCiAgICAgICAgICAgVFJVRSB+ICJtaXNzaW5nIg0KICAgICAgICAgKQ0KICApICU+JQ0KICANCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZ1bmN0aW9uKHgpIGlmZWxzZSh4ICVpbiUgYygtOTk5OSwgLTg4ODgpLCBOQSwgeCkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhTX0JBQ0tfQ0hFQ0tJTkcsIFNfU1VCU1RJVFVUSU9OKSwgZmFjdG9yKQ0KYGBgDQoNCiMgQmFzaWNzDQoNCkRhdGEgc3VtbWFyeQ0KDQpgYGB7cn0NCm1ldGFkYXRhMSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfTkFNRSkgJT4lDQogIHN1bW1hcmlzZShuX3N1cnZleXMgPSBuX2Rpc3RpbmN0KFRfU1VSVkVZX0lEKSwNCiAgICAgICAgICAgIG5fY291bnRyaWVzID0gbl9kaXN0aW5jdChUX1NVUlZFWV9DT1VOVFJZKSwNCiAgICAgICAgICAgIG5fd2F2ZXMgPSBuX2Rpc3RpbmN0KFRfU1VSVkVZX1JPVU5EKSwNCiAgICAgICAgICAgIG1pbl95ZWFyID0gbWluKFRfU1VSVkVZX1lFQVIpLA0KICAgICAgICAgICAgbWF4X3llYXIgPSBtYXgoVF9TVVJWRVlfWUVBUikpDQpgYGANCg0KVGhlcmUgYXJlIDQ1IGNvdW50cmllcyBhbHRvZ2V0aGVyLiBPZiB0aG9zZSwgMTcgYXJlIG5vdCBpbmNsdWRlZCBpbiBhbGwgcHJvamVjdHM6DQoNCmBgYHtyfQ0KbWV0YWRhdGExICU+JQ0KICBjb3VudChUX1NVUlZFWV9OQU1FLCBUX1NVUlZFWV9DT1VOVFJZKSAlPiUNCiAgc3ByZWFkKFRfU1VSVkVZX05BTUUsIG4pICU+JQ0KICBmaWx0ZXIoaXMubmEoRVFMUyArIEVTUyArIEVWUyArIElTU1ApKQ0KYGBgDQoNCg0KDQojIEV4Y2VzcyBiaWFzDQoNCiMjIGJ5IHByb2plY3QNCg0KUHJvcG9ydGlvbiBvZiBzdXJ2ZXlzIHdpdGggZXhjZXNzICg+IDEuOTYpIGFic29sdXRlIGJpYXM6DQoNCmBgYHtyIHByb2plY3Qtc2lnbmlmaWNhbnQtdGFibGV9DQptZXRhZGF0YTEgJT4lDQogIG11dGF0ZShpc19zaWcgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhID4gMS45NikgJT4lDQogIGNvdW50KFRfU1VSVkVZX05BTUUsIGlzX3NpZykgJT4lDQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQ0KICBtdXRhdGUocHJvcF9zaWcgPSByb3VuZChuIC8gc3VtKG4pLCAzKSkgJT4lDQogIGZpbHRlcihpc19zaWcgPT0gVFJVRSkgJT4lDQogIHNlbGVjdChUX1NVUlZFWV9OQU1FLCBwcm9wX3NpZykNCmBgYA0KDQoNCjIwMDggd2FzIGEgZGlmZmljdWx0IHllYXIgZm9yIHN1cnZleXM/DQoNCk51bWJlcnMgYWJvdmUgYmFycyBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHN1cnZleXMgZm9yIHdoaWNoIGJpYXMgd2FzIHBvc3NpYmxlIHRvIGNhbGN1bGF0ZS4NCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0gNiwgZmlnLndpZHRoID0gMTB9DQpwYXJ0MSA8LSBtZXRhZGF0YTEgJT4lDQogIGRyb3BfbmEoUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSkgJT4lDQogIGZpbHRlcihUX1NVUlZFWV9OQU1FICE9ICJJU1NQIikgJT4lDQogIG11dGF0ZShpc19zaWcgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhID4gMS45NiwNCiAgICAgICAgIHJvdW5kID0gZ3N1YigiXltBLVpdezEsNH0iLCAiIiwgVF9TVVJWRVlfUk9VTkQpKSAlPiUNCiAgY291bnQoVF9TVVJWRVlfTkFNRSwgcm91bmQsIGlzX3NpZykgJT4lDQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUsIHJvdW5kKSAlPiUNCiAgbXV0YXRlKHByb3Bfc2lnID0gbiAvIHN1bShuKSwNCiAgICAgICAgIG5zdXJ2ZXlzID0gc3VtKG4pKSAlPiUNCiAgZmlsdGVyKGlzX3NpZyA9PSBUUlVFKSAlPiUNCiAgZ2dwbG90KC4pICsNCiAgZ2VvbV9iYXIoYWVzKHggPSByb3VuZCwgeSA9IHByb3Bfc2lnKSwgc3RhdCA9ICJJZGVudGl0eSIsIGZpbGwgPSAiZ3JheTcwIikgKw0KICBnZW9tX3RleHQoYWVzKHggPSByb3VuZCwgeSA9IHByb3Bfc2lnICsgMC4wMywgbGFiZWwgPSBuc3VydmV5cyksIGNvbCA9ICJncmF5MjAiKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKCJUX1NVUlZFWV9OQU1FIiwgc2NhbGVzID0gImZyZWVfeCIpDQoNCnBhcnQyIDwtIG1ldGFkYXRhMSAlPiUNCiAgZHJvcF9uYShRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSAlPiUNCiAgZmlsdGVyKFRfU1VSVkVZX05BTUUgPT0gIklTU1AiKSAlPiUNCiAgbXV0YXRlKGlzX3NpZyA9IFFfQWJzX2JpYXNfaW50ZXJuYWxfY3JpdGVyaWEgPiAxLjk2LA0KICAgICAgICAgcm91bmQgPSBnc3ViKCJeW0EtWl17MSw0fSIsICIiLCBUX1NVUlZFWV9ST1VORCkpICU+JQ0KICBjb3VudChUX1NVUlZFWV9OQU1FLCByb3VuZCwgaXNfc2lnKSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfTkFNRSwgcm91bmQpICU+JQ0KICBtdXRhdGUocHJvcF9zaWcgPSBuIC8gc3VtKG4pLA0KICAgICAgICAgbnN1cnZleXMgPSBzdW0obikpICU+JQ0KICBmaWx0ZXIoaXNfc2lnID09IFRSVUUpICU+JQ0KICBnZ3Bsb3QoLikgKw0KICBnZW9tX2JhcihhZXMoeCA9IHJvdW5kLCB5ID0gcHJvcF9zaWcpLCBzdGF0ID0gIklkZW50aXR5IiwgZmlsbCA9ICJncmF5NzAiKSArDQogIGdlb21fdGV4dChhZXMoeCA9IHJvdW5kLCB5ID0gcHJvcF9zaWcgKyAwLjAzNSwgbGFiZWwgPSBuc3VydmV5cyksIGNvbCA9ICJncmF5MjAiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkgKw0KICBmYWNldF93cmFwKCJUX1NVUlZFWV9OQU1FIiwgc2NhbGVzID0gImZyZWVfeCIpDQoNCnBhcnQxIC8gcGFydDINCmBgYA0KDQojIyBieSBjb3VudHJ5DQoNClN1cnZleXMgd2l0aCBhYnNvbHV0ZSBiaWFzID4gMS45NiBieSBjb3VudHJ5Lg0KDQpgYGB7cn0NCm1ldGFkYXRhMSAlPiUNCiAgZHJvcF9uYShRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfQ09VTlRSWSkgJT4lDQogIG11dGF0ZSh0b3RhbF9zdXJ2ZXlzID0gbigpLA0KICAgICAgICAgdG90YWxfcHJvamVjdHMgPSBuX2Rpc3RpbmN0KFRfU1VSVkVZX05BTUUpLA0KICAgICAgICAgaXNfc2lnID0gUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSA+IDEuOTYpICU+JQ0KICBncm91cF9ieShUX1NVUlZFWV9DT1VOVFJZLCBpc19zaWcpICU+JQ0KICBtdXRhdGUoYmlhc19zdXJ2ZXlzID0gbigpLA0KICAgICAgICAgYmlhc19wcm9qZWN0cyA9IG5fZGlzdGluY3QoVF9TVVJWRVlfTkFNRSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGRpc3RpbmN0KFRfU1VSVkVZX0NPVU5UUlksIHRvdGFsX3N1cnZleXMsIGJpYXNfc3VydmV5cywgdG90YWxfcHJvamVjdHMsIGJpYXNfcHJvamVjdHMsIGlzX3NpZykgJT4lDQogIGNvbXBsZXRlKGlzX3NpZywgVF9TVVJWRVlfQ09VTlRSWSwgZmlsbCA9IGxpc3QoYmlhc19zdXJ2ZXlzID0gMCwgYmlhc19wcm9qZWN0cyA9IDApKSAlPiUNCiAgZ3JvdXBfYnkoVF9TVVJWRVlfQ09VTlRSWSkgJT4lDQogIG11dGF0ZSh0b3RhbF9zdXJ2ZXlzID0gbWF4KHRvdGFsX3N1cnZleXMsIG5hLnJtID0gVCksDQogICAgICAgICB0b3RhbF9wcm9qZWN0cyA9IG1heCh0b3RhbF9wcm9qZWN0cywgbmEucm0gPSBUKSkgJT4lDQogIGZpbHRlcihpc19zaWcgPT0gVFJVRSkgJT4lDQogIG11dGF0ZShwcm9wX2JpYXMgPSByb3VuZChiaWFzX3N1cnZleXMgLyB0b3RhbF9zdXJ2ZXlzLCAzKSkgJT4lDQogIHNlbGVjdChUX1NVUlZFWV9DT1VOVFJZLCB0b3RhbF9zdXJ2ZXlzLCBiaWFzX3N1cnZleXMsIHByb3BfYmlhcywgdG90YWxfcHJvamVjdHMsIGJpYXNfcHJvamVjdHMpICU+JQ0KICBhcnJhbmdlKGRlc2MocHJvcF9iaWFzKSkNCmBgYA0KDQoNCg0KIyBDaGFuZ2VzIG92ZXIgdGltZQ0KDQojIyBCaWFzDQoNCk9yYW5nZSBkb3RzIGluZGljYXRlIHN1cnZleXMgZnJvbSB0aGUgd2F2ZXMgYW5hbHl6ZWQgaW4gS29obGVyIDIwMDcuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA2LCBmaWcud2lkdGggPSAxMH0NCm1ldGFkYXRhMSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoU19TQU1QTEVfVFlQRSA9IGZjdF9jb2xsYXBzZShTX1NBTVBMRV9UWVBFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2luZm9faW5zdWZmID0gYygibm8gaW5mbyIsICJpbnN1ZmYiKSksDQogICAgICAgICBTX1NBTVBMRV9UWVBFID0gZmN0X3JldihTX1NBTVBMRV9UWVBFKSwNCiAgICAgICAgIEsyMDA3ID0gVF9TVVJWRVlfUk9VTkQgJWluJSBjKCJFUUxTMSIsICJFU1MxIiwgIkVTUzIiLCAiRVZTMTk5OSIsICJJU1NQMjAwMiIpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gVF9TVVJWRVlfWUVBUiwgeSA9IFFfQmlhc19pbnRlcm5hbF9jcml0ZXJpYSwgY29sID0gSzIwMDcpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGFscGhhID0gMC41KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmF5NTAiLCAiZGFya29yYW5nZSIpKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxhYigiIikNCmBgYA0KDQpTdXJ2ZXlzIHdpdGggYWJzb2x1dGUgYmlhcyBleGNlZWRpbmcgNSBhcmUgbGFiZWxsZWQuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA2LCBmaWcud2lkdGggPSAxMH0NCm1ldGFkYXRhMSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gVF9TVVJWRVlfWUVBUiwgeSA9IFFfQmlhc19pbnRlcm5hbF9jcml0ZXJpYSkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBnZ2hpZ2hsaWdodChRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhID4gNSkgKw0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gVF9TVVJWRVlfSUQpLCBzaXplID0gMy41KSArDQogIHRoZW1lX2J3KCkgKw0KICB4bGFiKCIiKQ0KYGBgDQoNCg0KIyMgQWJzb2x1dGUgYmlhcyBhbmQgcmVzcG9uc2UgcmF0ZXMNCg0KTm90ZSB0aGUgZGlmZmVyZW50IFkgYXhpcyByYW5nZXMuDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSAxMCwgZmlnLndpZHRoID0gMTB9DQptZXRhZGF0YTEgJT4lDQogIGZpbHRlcighU19TQU1QTEVfVFlQRSAlaW4lIGMoIm5vIGluZm8iLCAiaW5zdWZmIiwgIm5vbi1wcm9iIiksDQogICAgICAgICBtb2RlID09ICJmMmYiKSAlPiUNCiAgIyBmaWx0ZXIoUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSA8IDQuNSkgJT4lDQogIHNlbGVjdChUX1NVUlZFWV9OQU1FLCBUX1NVUlZFWV9DT1VOVFJZLCBUX1NVUlZFWV9ST1VORCwgVF9TVVJWRVlfWUVBUiwNCiAgICAgICAgIFFfQWJzX2JpYXNfaW50ZXJuYWxfY3JpdGVyaWEsIFNfUlIxX0NBTENfVkFMVUUpICU+JQ0KICBnYXRoZXIodmFyLCB2YWx1ZSwgYyhTX1JSMV9DQUxDX1ZBTFVFLCBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgJT4lDQogIGRyb3BfbmEodmFsdWUpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBUX1NVUlZFWV9ZRUFSLA0KICAgICAgICAgICAgICAgIHkgPSB2YWx1ZSkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKFRfU1VSVkVZX05BTUUgfiB2YXIsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikNCmBgYA0KDQoNCg0KIyBBYnNvbHV0ZSBiaWFzIGJ5IHNhbXBsZSB0eXBlDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PSA3LCBmaWcud2lkdGggPSAxMH0NCnBhcnQxIDwtIG1ldGFkYXRhMSAlPiUNCiAgZmlsdGVyKFRfU1VSVkVZX05BTUUgJWluJSBjKCJFU1MiLCAiRVFMUyIpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gU19TQU1QTEVfVFlQRSwgeSA9IFFfQWJzX2JpYXNfaW50ZXJuYWxfY3JpdGVyaWEpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgdGhlbWVfYncoKSArDQogIHhsYWIoIiIpICsNCiAgZmFjZXRfd3JhcCgiVF9TVVJWRVlfTkFNRSIsIG5jb2wgPSAxKQ0KDQpwYXJ0MiA8LSBtZXRhZGF0YTEgJT4lDQogIGZpbHRlcihUX1NVUlZFWV9OQU1FICVpbiUgYygiSVNTUCIsICJFVlMiKSkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFNfU0FNUExFX1RZUEUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB5bGFiKCIiKSArIHhsYWIoIiIpICsNCiAgZmFjZXRfd3JhcCgiVF9TVVJWRVlfTkFNRSIsIG5jb2wgPSAxKQ0KDQpwYXJ0MSArIHBhcnQyICsgcGxvdF9sYXlvdXQod2lkdGhzID0gYygxLCAyKSkNCmBgYA0KDQoNCkV4Y2x1ZGluZyBhYnNvbHV0ZSBiaWFzID4gNC4NCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0gNywgZmlnLndpZHRoID0gMTB9DQpwYXJ0MSA8LSBtZXRhZGF0YTEgJT4lDQogIGZpbHRlcihUX1NVUlZFWV9OQU1FICVpbiUgYygiRVNTIiwgIkVRTFMiKSkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFNfU0FNUExFX1RZUEUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHRoZW1lX2J3KCkgKw0KICB4bGFiKCIiKSArIHlsaW0oMCw0KSArDQogIGZhY2V0X3dyYXAoIlRfU1VSVkVZX05BTUUiLCBuY29sID0gMSkNCg0KcGFydDIgPC0gbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoVF9TVVJWRVlfTkFNRSAlaW4lIGMoIklTU1AiLCAiRVZTIikpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBTX1NBTVBMRV9UWVBFLCB5ID0gUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICB0aGVtZV9idygpICsNCiAgeWxhYigiIikgKyB4bGFiKCIiKSArIHlsaW0oMCw0KSArDQogIGZhY2V0X3dyYXAoIlRfU1VSVkVZX05BTUUiLCBuY29sID0gMSkNCg0KcGFydDEgKyBwYXJ0MiArIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMSwgMikpDQpgYGANCg0KDQoNCiMgQmlhcyBhbmQgcmVzcG9uc2UgcmF0ZXMNCg0KIyMgT3ZlcmFsbA0KDQpFeGNsdWRlcyBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIikgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFNfUlIxX0NBTENfVkFMVUUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2wgPSBUX1NVUlZFWV9OQU1FKSwgc2l6ZSA9IDIsIGFscGhhID0gMC41KSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQpFeGNsdWRlcyBSUiA+PSAwLjksIGFuZCBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIiwNCiAgICAgICAgIFNfUlIxX0NBTENfVkFMVUUgPCAwLjkpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBTX1JSMV9DQUxDX1ZBTFVFLCB5ID0gUV9BYnNfYmlhc19pbnRlcm5hbF9jcml0ZXJpYSkpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sID0gVF9TVVJWRVlfTkFNRSksIHNpemUgPSAyLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQojIyBCeSBzYW1wbGUgdHlwZQ0KDQpFeGNsdWRlcyBSUiA+PSAwLjksIGFuZCBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDYsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIiwNCiAgICAgICAgIFNfUlIxX0NBTENfVkFMVUUgPCAwLjkpICU+JSAgDQogIGdncGxvdCguLCBhZXMoeCA9IFNfUlIxX0NBTENfVkFMVUUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBzaXplID0gMSkgKw0KICB0aGVtZV9idygpICsNCiAgZmFjZXRfd3JhcCgiU19TQU1QTEVfVFlQRSIpDQpgYGANCg0KDQojIyBCeSBzYW1wbGUgdHlwZSBhbmQgcHJvamVjdA0KDQpFeGNsdWRlcyBSUiA+PSAwLjksIGFuZCBzYW1wbGUgdHlwZXM6IG5vIGluZm9ybWF0aW9uLCBpbnN1ZmZpY2llbnQsIG5vbi1wcm9iYWJpbGl0eS4NCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDYsIGZpZy53aWR0aCA9IDEwfQ0KbWV0YWRhdGExICU+JQ0KICBmaWx0ZXIoIVNfU0FNUExFX1RZUEUgJWluJSBjKCJubyBpbmZvIiwgImluc3VmZiIsICJub24tcHJvYiIpLA0KICAgICAgICAgbW9kZSA9PSAiZjJmIiwNCiAgICAgICAgIFNfUlIxX0NBTENfVkFMVUUgPCAwLjkpICU+JSAgDQogIGdncGxvdCguLCBhZXMoeCA9IFNfUlIxX0NBTENfVkFMVUUsIHkgPSBRX0Fic19iaWFzX2ludGVybmFsX2NyaXRlcmlhKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IDAuMSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF9ncmlkKFRfU1VSVkVZX05BTUUgfiBTX1NBTVBMRV9UWVBFKQ0KYGBgDQoNCiAgDQogIA==