Processing math: 100%
  • Full messy model
  • Simpler model with families of confounders
  • Simplest model
  • Adjustment sets
  • Final variables to use
library(tidyverse)
library(ggdag)
library(dagitty)
library(here)

source(here("lib", "graphics.R"))
source(here("lib", "misc_funs.R"))

update_geom_defaults(ggdag:::GeomDagText, list(family = "Noto Sans", face = "plain"))

my_seed <- 1234
set.seed(my_seed)

Full messy model

huge_messy_dag <- dagitty('
dag {
"Corruption[t-1]" [adjusted,pos="7.000,2.000"]
"Corruption[t-i]" [pos="2.000,2.000"]
"Corruption[t]" [pos="12.000,2.000"]
"Democracy[t-1]" [adjusted,pos="7.250,1.000"]
"Democracy[t-i]" [pos="2.250,1.000"]
"Democracy[t]" [pos="12.250,1.000"]
"Disasters[t-1]" [adjusted,pos="7.250,12.000"]
"Disasters[t-i]" [pos="2.250,12.000"]
"Disasters[t]" [pos="12.250,12.000"]
"Education[t-1]" [adjusted,pos="6.250,8.000"]
"Education[t-i]" [pos="1.250,8.000"]
"Education[t]" [pos="11.250,8.000"]
"GDP/capita[t-1]" [adjusted,pos="6.000,6.000"]
"GDP/capita[t-i]" [pos="1.000,6.000"]
"GDP/capita[t]" [pos="11.000,6.000"]
"Health[t-1]" [adjusted,pos="6.500,9.000"]
"Health[t-i]" [pos="1.500,9.000"]
"Health[t]" [pos="11.500,9.000"]
"Mortality[t-1]" [adjusted,pos="6.750,10.000"]
"Mortality[t-i]" [pos="1.750,10.000"]
"Mortality[t]" [pos="11.750,10.000"]
"Outcome[t-1]" [pos="9.000,6.500"]
"Outcome[t-i]" [pos="4.000,6.500"]
"Outcome[t]" [outcome,pos="14.000,6.500"]
"Restrictions[t-1]" [exposure,pos="8.000,7.750"]
"Restrictions[t-i]" [adjusted,pos="3.000,7.750"]
"Restrictions[t]" [pos="13.000,7.750"]
"Trade[t-1]" [adjusted,pos="6.000,7.000"]
"Trade[t-i]" [pos="1.000,7.000"]
"Trade[t]" [pos="11.000,7.000"]
"Violence[t-1]" [adjusted,pos="6.250,5.000"]
"Violence[t-i]" [pos="1.250,5.000"]
"Violence[t]" [pos="11.250,5.000"]
"`Civil liberties`[t-1]" [adjusted,pos="6.500,4.000"]
"`Civil liberties`[t-i]" [pos="1.500,4.000"]
"`Civil liberties`[t]" [pos="11.500,4.000"]
"`Internal conflict`[t-1]" [adjusted,pos="7.000,11.000"]
"`Internal conflict`[t-i]" [pos="2.000,11.000"]
"`Internal conflict`[t]" [pos="12.000,11.000"]
"`Rule of law`[t-1]" [adjusted,pos="6.750,3.000"]
"`Rule of law`[t-i]" [pos="1.750,3.000"]
"`Rule of law`[t]" [pos="11.750,3.000"]
"Corruption[t-1]" -> "Corruption[t]"
"Corruption[t-1]" -> "Outcome[t-1]"
"Corruption[t-1]" -> "Restrictions[t-1]"
"Corruption[t-i]" -> "Corruption[t-1]"
"Corruption[t-i]" -> "Outcome[t-i]"
"Corruption[t-i]" -> "Restrictions[t-i]"
"Corruption[t]" -> "Outcome[t]"
"Corruption[t]" -> "Restrictions[t]"
"Democracy[t-1]" -> "Corruption[t-1]"
"Democracy[t-1]" -> "Democracy[t]"
"Democracy[t-1]" -> "Outcome[t-1]"
"Democracy[t-1]" -> "Restrictions[t-1]"
"Democracy[t-1]" -> "`Rule of law`[t-1]"
"Democracy[t-i]" -> "Democracy[t-1]"
"Democracy[t-i]" -> "Outcome[t-i]"
"Democracy[t-i]" -> "Restrictions[t-i]"
"Democracy[t]" -> "Corruption[t]"
"Democracy[t]" -> "Outcome[t]"
"Democracy[t]" -> "Restrictions[t]"
"Democracy[t]" -> "`Rule of law`[t]"
"Disasters[t-1]" -> "Outcome[t-1]"
"Disasters[t-1]" -> "Restrictions[t-1]"
"Disasters[t-i]" -> "Outcome[t-i]"
"Disasters[t-i]" -> "Restrictions[t-i]"
"Disasters[t]" -> "Outcome[t]"
"Disasters[t]" -> "Restrictions[t]"
"Education[t-1]" -> "Education[t]"
"Education[t-1]" -> "Outcome[t-1]"
"Education[t-1]" -> "Restrictions[t-1]"
"Education[t-i]" -> "Education[t-1]"
"Education[t-i]" -> "Outcome[t-i]"
"Education[t-i]" -> "Restrictions[t-i]"
"Education[t]" -> "Outcome[t]"
"Education[t]" -> "Restrictions[t]"
"GDP/capita[t-1]" -> "GDP/capita[t]"
"GDP/capita[t-1]" -> "Outcome[t-1]"
"GDP/capita[t-1]" -> "Restrictions[t-1]"
"GDP/capita[t-i]" -> "GDP/capita[t-1]"
"GDP/capita[t-i]" -> "Outcome[t-i]"
"GDP/capita[t-i]" -> "Restrictions[t-i]"
"GDP/capita[t]" -> "Outcome[t]"
"GDP/capita[t]" -> "Restrictions[t]"
"Health[t-1]" -> "Health[t]"
"Health[t-1]" -> "Outcome[t-1]"
"Health[t-1]" -> "Restrictions[t-1]"
"Health[t-i]" -> "Health[t-1]"
"Health[t-i]" -> "Outcome[t-i]"
"Health[t-i]" -> "Restrictions[t-i]"
"Health[t]" -> "Outcome[t]"
"Health[t]" -> "Restrictions[t]"
"Mortality[t-1]" -> "Mortality[t]"
"Mortality[t-1]" -> "Outcome[t-1]"
"Mortality[t-1]" -> "Restrictions[t-1]"
"Mortality[t-i]" -> "Mortality[t-1]"
"Mortality[t-i]" -> "Outcome[t-i]"
"Mortality[t-i]" -> "Restrictions[t-i]"
"Mortality[t]" -> "Outcome[t]"
"Mortality[t]" -> "Restrictions[t]"
"Outcome[t-1]" -> "Outcome[t]"
"Outcome[t-i]" -> "Outcome[t-1]"
"Restrictions[t-1]" -> "Outcome[t-1]"
"Restrictions[t-1]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Restrictions[t]"
"Restrictions[t-i]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Outcome[t-i]"
"Restrictions[t-i]" -> "Restrictions[t-1]"
"Restrictions[t]" -> "Outcome[t]"
"Trade[t-1]" -> "Outcome[t-1]"
"Trade[t-1]" -> "Restrictions[t-1]"
"Trade[t-1]" -> "Trade[t]"
"Trade[t-i]" -> "Outcome[t-i]"
"Trade[t-i]" -> "Restrictions[t-i]"
"Trade[t-i]" -> "Trade[t-1]"
"Trade[t]" -> "GDP/capita[t]"
"Trade[t]" -> "Outcome[t]"
"Trade[t]" -> "Restrictions[t]"
"Violence[t-1]" -> "Outcome[t-1]"
"Violence[t-1]" -> "Restrictions[t-1]"
"Violence[t-1]" -> "Violence[t]"
"Violence[t-i]" -> "Outcome[t-i]"
"Violence[t-i]" -> "Restrictions[t-i]"
"Violence[t-i]" -> "Violence[t-1]"
"Violence[t]" -> "Outcome[t]"
"Violence[t]" -> "Restrictions[t]"
"`Civil liberties`[t-1]" -> "Outcome[t-1]"
"`Civil liberties`[t-1]" -> "Restrictions[t-1]"
"`Civil liberties`[t-1]" -> "`Civil liberties`[t]"
"`Civil liberties`[t-i]" -> "Outcome[t-i]"
"`Civil liberties`[t-i]" -> "Restrictions[t-i]"
"`Civil liberties`[t-i]" -> "`Civil liberties`[t-1]"
"`Civil liberties`[t]" -> "Outcome[t]"
"`Civil liberties`[t]" -> "Restrictions[t]"
"`Internal conflict`[t-1]" -> "Outcome[t-1]"
"`Internal conflict`[t-1]" -> "Restrictions[t-1]"
"`Internal conflict`[t-1]" -> "`Internal conflict`[t]"
"`Internal conflict`[t-i]" -> "Outcome[t-i]"
"`Internal conflict`[t-i]" -> "Restrictions[t-i]"
"`Internal conflict`[t-i]" -> "`Internal conflict`[t-1]"
"`Internal conflict`[t]" -> "Outcome[t]"
"`Internal conflict`[t]" -> "Restrictions[t]"
"`Rule of law`[t-1]" -> "Outcome[t-1]"
"`Rule of law`[t-1]" -> "Restrictions[t-1]"
"`Rule of law`[t-1]" -> "`Rule of law`[t]"
"`Rule of law`[t-i]" -> "Outcome[t-i]"
"`Rule of law`[t-i]" -> "Restrictions[t-i]"
"`Rule of law`[t-i]" -> "`Rule of law`[t-1]"
"`Rule of law`[t]" -> "Outcome[t]"
"`Rule of law`[t]" -> "Restrictions[t]"
}
')

huge_messy_dag_plot <- huge_messy_dag %>% 
  tidy_dagitty() %>% 
  mutate(var_type = case_when(
    str_detect(name, "Outcome") ~ "Outcome",
    str_detect(name, "Restrictions") ~ "Restrictions",
    TRUE ~ "Z"
  )) %>% 
  mutate(time_period = case_when(
    str_detect(name, "t-1") ~ 2,
    str_detect(name, "t-i") ~ 1,
    TRUE ~ 3
  )) %>% 
  mutate(arrow_color = case_when(
    name == "Restrictions[t-1]" & to == "Outcome[t]" ~ "#FF4136",
    TRUE ~ "grey60"
  ))

ggplot(huge_messy_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(data = filter(huge_messy_dag_plot, var_type == "Outcome"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(huge_messy_dag_plot, var_type == "Restrictions"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(huge_messy_dag_plot, var_type == "Z"),
                color = "black", size = pts(9), parse = TRUE) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  scale_y_reverse() +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()

Simpler model with families of confounders

simplerish_dag <- dagitty('
dag {
"`Human rights & politics`[t-1]" [adjusted,pos="5,1.5"]
"`Human rights & politics`[t-i]" [pos="1,1.5"]
"`Human rights & politics`[t]" [pos="9,1.5"]
"`Economics & development`[t-1]" [adjusted,pos="5,2.5"]
"`Economics & development`[t-i]" [pos="1,2.5"]
"`Economics & development`[t]" [pos="9,2.5"]
"Outcome[t-1]" [pos="6.5,1.75"]
"Outcome[t-i]" [adjusted,pos="2.5,1.75"]
"Outcome[t]" [outcome,pos="10.5,1.75"]
"Restrictions[t-1]" [exposure,pos="6,2.25"]
"Restrictions[t-i]" [adjusted,pos="2,2.25"]
"Restrictions[t]" [pos="10,2.25"]
"`Unexpected shocks`[t-1]" [adjusted,pos="5,2"]
"`Unexpected shocks`[t-i]" [pos="1,2"]
"`Unexpected shocks`[t]" [pos="9,2"]
"`Human rights & politics`[t-1]" -> "`Human rights & politics`[t]"
"`Human rights & politics`[t-1]" -> "Outcome[t-1]"
"`Human rights & politics`[t-1]" -> "Restrictions[t-1]"
"`Human rights & politics`[t-1]" -> "Restrictions[t]"
"`Human rights & politics`[t-i]" -> "`Human rights & politics`[t-1]"
"`Human rights & politics`[t-i]" -> "Outcome[t-i]"
"`Human rights & politics`[t-i]" -> "Restrictions[t-i]"
"`Human rights & politics`[t]" -> "Outcome[t]"
"`Human rights & politics`[t]" -> "Restrictions[t]"
"`Economics & development`[t-1]" -> "`Economics & development`[t]"
"`Economics & development`[t-1]" -> "Outcome[t-1]"
"`Economics & development`[t-1]" -> "Restrictions[t-1]"
"`Economics & development`[t-1]" -> "Restrictions[t]"
"`Economics & development`[t-i]" -> "`Economics & development`[t-1]"
"`Economics & development`[t-i]" -> "Outcome[t-i]"
"`Economics & development`[t-i]" -> "Restrictions[t-i]"
"`Economics & development`[t]" -> "Outcome[t]"
"`Economics & development`[t]" -> "Restrictions[t]"
"Outcome[t-1]" -> "Outcome[t]"
"Outcome[t-1]" -> "Restrictions[t]"
"Outcome[t-i]" -> "Outcome[t-1]"
"Outcome[t-i]" -> "Restrictions[t-1]"
"Restrictions[t]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Outcome[t-i]"
"Restrictions[t-1]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Restrictions[t]"
"Restrictions[t-i]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Restrictions[t-1]"
"`Unexpected shocks`[t-1]" -> "Outcome[t-1]"
"`Unexpected shocks`[t-1]" -> "Restrictions[t-1]"
"`Unexpected shocks`[t-1]" -> "Restrictions[t]"
"`Unexpected shocks`[t-1]" -> "`Unexpected shocks`[t]"
"`Unexpected shocks`[t-i]" -> "Outcome[t-i]"
"`Unexpected shocks`[t-i]" -> "Restrictions[t-i]"
"`Unexpected shocks`[t-i]" -> "`Unexpected shocks`[t-1]"
"`Unexpected shocks`[t]" -> "Outcome[t]"
"`Unexpected shocks`[t]" -> "Restrictions[t]"
}
')

simplerish_dag_plot <- simplerish_dag %>% 
  tidy_dagitty() %>% 
  mutate(var_type = case_when(
    str_detect(name, "Outcome") ~ "Outcome",
    str_detect(name, "Restrictions") ~ "Restrictions",
    TRUE ~ "Z"
  )) %>% 
  mutate(time_period = case_when(
    str_detect(name, "t-1") ~ 2,
    str_detect(name, "t-i") ~ 1,
    TRUE ~ 3
  )) %>% 
  mutate(arrow_color = case_when(
    name == "Restrictions[t-1]" & to == "Outcome[t]" ~ "#FF4136",
    TRUE ~ "grey60"
  ))

ggplot(simplerish_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(data = filter(simplerish_dag_plot, var_type == "Outcome"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(simplerish_dag_plot, var_type == "Restrictions"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(simplerish_dag_plot, var_type == "Z"),
                color = "black", size = pts(9), parse = TRUE) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  scale_y_reverse() +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()

Simplest model

simple_dag <- dagitty('
dag {
"Outcome[t-i]" [pos="1.5,2"]
"Outcome[t-1]" [pos="3.5,2"]
"Outcome[t]" [outcome,pos="6,2"]
"Restrictions[t-i]" [pos="1,1"]
"Restrictions[t-1]" [exposure,pos="3,1"]
"Restrictions[t]" [pos="5,1"]
"Z[t-i]" [pos="1,3"]
"Z[t-1]" [pos="3,3"]
"Z[t]" [pos="5,3"]
"Outcome[t-1]" -> "Outcome[t]"
"Outcome[t-1]" -> "Restrictions[t]"
"Outcome[t-i]" -> "Outcome[t-1]"
"Outcome[t-i]" -> "Restrictions[t-1]"
"Restrictions[t]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Outcome[t-i]"
"Restrictions[t-1]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Restrictions[t]"
"Restrictions[t-i]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Restrictions[t-1]"
"Z[t-1]" -> "Outcome[t-1]"
"Z[t-1]" -> "Restrictions[t-1]"
"Z[t-1]" -> "Restrictions[t]"
"Z[t-1]" -> "Z[t]"
"Z[t-i]" -> "Outcome[t-i]"
"Z[t-i]" -> "Restrictions[t-1]"
"Z[t-i]" -> "Restrictions[t-i]"
"Z[t-i]" -> "Z[t-1]"
"Z[t]" -> "Outcome[t]"
"Z[t]" -> "Restrictions[t]"
}
') 

simple_dag_plot <- simple_dag %>% 
  tidy_dagitty() %>% 
  mutate(var_type = case_when(
    str_detect(name, "Outcome") ~ "Outcome",
    str_detect(name, "Restrictions") ~ "Restrictions",
    str_detect(name, "Z") ~ "Z"
  )) %>% 
  mutate(time_period = case_when(
    str_detect(name, "t-1") ~ 2,
    str_detect(name, "t-i") ~ 1,
    TRUE ~ 3
  )) %>% 
  mutate(arrow_color = case_when(
    name == "Restrictions[t-1]" & to == "Outcome[t]" ~ "#FF4136",
    TRUE ~ "grey60"
  )) %>% 
  mutate(letter_only = case_when(
    str_detect(name, "Outcome") ~ str_replace(name, "Outcome", "Y"),
    str_detect(name, "Restrictions") ~ str_replace(name, "Restrictions", "X"),
    TRUE ~ name
  ))

simple_dag_out <- ggplot(simple_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(data = filter(simple_dag_plot, var_type == "Outcome"),
                color = "black", size = pts(11), parse = TRUE, 
                nudge_y = 0.2, nudge_x = 0.3) +
  geom_dag_text(data = filter(simple_dag_plot, var_type == "Restrictions"),
                color = "black", size = pts(11), parse = TRUE, 
                nudge_y = -0.25) +
  geom_dag_text(data = filter(simple_dag_plot, var_type == "Z"),
                color = "black", size = pts(11), parse = TRUE,
                nudge_y = 0) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()
simple_dag_out

simple_dag_letters_out <- ggplot(simple_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(aes(label = letter_only),
                color = "black", size = pts(11), parse = TRUE) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()
simple_dag_letters_out

ggsave(here("analysis", "output", "dag_simple_letters.pdf"), simple_dag_letters_out,
       width = 7, height = 3.75, device = cairo_pdf)
ggsave(here("analysis", "output", "dag_simple_letters.png"), simple_dag_letters_out,
       width = 7, height = 3.75, dpi = 300, type = "cairo")

Adjustment sets

These DAGs are complex—especially the one with every possible node. However, they have important analytical value. We cannot randomly assign countries to impose anti-NGO laws or restrict the environment for civil society—doing that is completely infeasable (and unethical!). This means that we cannot use experimental data to measure the causal effect of anti-NGO restrictions on foreign aid, or E[Aiddo(Restrictions)]. We also don’t have any quasi-experimental situations that would allow for context-based identification of the effect of restrictions on aid.

Simply measuring E[AidRestrictions] is trivial—just run lm(aid ~ restrictions) and look at the coefficient. However, this estimate cannot be interpreted in any sort of causal way, since correlation is not causation. Using the logic of do-calculus, we can actually use the relationships between the nodes in the DAG to transform E[Aiddo(Restrictions)] into a do-free expression by making statistical adjustments and closing backdoor pathways that open up spurious relationships between restrictions and aid. As long as we can find a minimally sufficient adjustment set—or a set of nodes or variables that need to be adjusted in order to ensure that restrictions is d-separated from aid—we can isolate and identify the causal link between restrictions and aid.

Rather than go through the complex math behind the three rules of do-calculus, we can use R (or dagitty.net) to identify minimal sufficient adjustment sets based on the three DAGs above.

  • Huge complicated DAG:

    huge_messy_dag %>%
      adjustmentSets()
    ## { Corruption[t-1], Democracy[t-1], Disasters[t-1], Education[t-1],
    ##   GDP/capita[t-1], Health[t-1], Mortality[t-1], Restrictions[t-i], Trade[t-1],
    ##   Violence[t-1], `Civil liberties`[t-1], `Internal conflict`[t-1], `Rule of
    ##   law`[t-1] }
  • Simpler-ish DAG:

    simplerish_dag %>%
      adjustmentSets()
    ## { Outcome[t-i], Restrictions[t-i], `Economics & development`[t-1], `Human rights
    ##   & politics`[t-1], `Unexpected shocks`[t-1] }
  • Simple DAG:

    simple_dag %>%
      adjustmentSets()
    ## { Outcome[t-i], Restrictions[t-i], Z[t-1] }

 

In other words, if we want to isolate the causal effect of anti-NGO restrictions in time t on aid in time t+1 (i.e. the effect of lagged restrictions), we need to adjust for lagged aid (t1), lagged restrictions (t1), and time-varying confounders (t).

Fortunately, marginal structural models allow us to make all of these adjustments using special inverse probability weights that take this lagging structure and treatment history into account.

Continuous stabilized IPWit=tt=1fX|ˉX,V[(Xit|ˉXi,t1,Vi);μ1,σ21]fX|ˉX,Y,Z,V[(Xit|ˉXi,t1,Yi,t1,Zit,Vi),μ2,σ22]

  • The numerator contains the probability of the observed treatment status (Xit) at each time given the previous history of treatment (ˉXi,t1) and time invariant confounders (Vi).
  • The denominator contains the probability of the observed treatment status (Xit) at each time given the previous history of treatment (ˉXi,t1), previous outcome (Yi,t1), time varying confounders (Zit), and time invariant confounders (Vi).
  • These two probability distributions have a mean of μ1,2 and variance of σ21,2.

Finally, these weights are used in an outcome model similar to this:

lm(outcome ~ lag_treatment, weights = ipw)

Doing this process closes the backdoor pathways between lagged restrictions and present aid and is theoretically sufficient for isolating the causal link between the two.

Final variables to use

Based on these DAGs, here are the variables we use in our treatment and outcome models:

  • Outcome
    • H1: log aid in t (total_oda_lead and total_oda_log_lead)
    • H2: proportion of aid given for contentious causes in t (prop_contentious)
    • H3: proportion of aid given to domestic/international NGOS in t (prop_ngo_dom and prop_ngo_foreign)
  • Treatment
    • Anti-civil society laws and general restrictive environment in t1 (barriers_total and v2xcs_ccsi)
  • Time-varying confounders (all in t1)
    • Human rights and politics
      • Electoral democracy: v2x_polyarchy
      • Corruption: v2x_corr
      • Rule of law: v2x_rule
      • Civil liberties index: v2x_civlib
      • Physical violence index: v2x_clphy
      • Private civil liberties index: v2x_clpriv
    • Economics and development
      • Wealth: gdpcap_log
      • International trade: un_trade_pct_gdp
      • Educational equality: v2peedueq
      • Health equality: v2pehealth
      • Infant mortality rate: e_peinfmor
    • Unexpected shocks
      • Internal conflict: internal_conflict_past_5
      • Natural disasters: natural_dis_count
  • Time-invarying confounders
    • Country code included as multilevel random effects((1 | gwcode))
LS0tCnRpdGxlOiAiQ2F1c2FsIG1vZGVsIGFuZCB0aGVvcnkiCmF1dGhvcjogIlN1cGFybmEgQ2hhdWRocnkgYW5kIEFuZHJldyBIZWlzcyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUYnKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZm9sZGluZzogaGlkZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5yZXRpbmEgPSAzLAogICAgICAgICAgICAgICAgICAgICAgdGlkeS5vcHRzID0gbGlzdCh3aWR0aC5jdXRvZmYgPSAxMjApLCAgIyBGb3IgY29kZQogICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyh3aWR0aCA9IDkwKSwgICMgRm9yIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDAuNjE4LCBmaWcud2lkdGggPSA3LCAKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAiMTAwJSIpCgpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkKYGBgCgpgYGB7ciBsb2FkLWxpYnJhcmllcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dkYWcpCmxpYnJhcnkoZGFnaXR0eSkKbGlicmFyeShoZXJlKQoKc291cmNlKGhlcmUoImxpYiIsICJncmFwaGljcy5SIikpCnNvdXJjZShoZXJlKCJsaWIiLCAibWlzY19mdW5zLlIiKSkKCnVwZGF0ZV9nZW9tX2RlZmF1bHRzKGdnZGFnOjo6R2VvbURhZ1RleHQsIGxpc3QoZmFtaWx5ID0gIk5vdG8gU2FucyIsIGZhY2UgPSAicGxhaW4iKSkKCm15X3NlZWQgPC0gMTIzNApzZXQuc2VlZChteV9zZWVkKQpgYGAKCgojIEZ1bGwgbWVzc3kgbW9kZWwKCmBgYHtyIGZ1bGwtZ2lhbnQtZGFnLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZmlnLmFzcD1OVUxMfQpodWdlX21lc3N5X2RhZyA8LSBkYWdpdHR5KCcKZGFnIHsKIkNvcnJ1cHRpb25bdC0xXSIgW2FkanVzdGVkLHBvcz0iNy4wMDAsMi4wMDAiXQoiQ29ycnVwdGlvblt0LWldIiBbcG9zPSIyLjAwMCwyLjAwMCJdCiJDb3JydXB0aW9uW3RdIiBbcG9zPSIxMi4wMDAsMi4wMDAiXQoiRGVtb2NyYWN5W3QtMV0iIFthZGp1c3RlZCxwb3M9IjcuMjUwLDEuMDAwIl0KIkRlbW9jcmFjeVt0LWldIiBbcG9zPSIyLjI1MCwxLjAwMCJdCiJEZW1vY3JhY3lbdF0iIFtwb3M9IjEyLjI1MCwxLjAwMCJdCiJEaXNhc3RlcnNbdC0xXSIgW2FkanVzdGVkLHBvcz0iNy4yNTAsMTIuMDAwIl0KIkRpc2FzdGVyc1t0LWldIiBbcG9zPSIyLjI1MCwxMi4wMDAiXQoiRGlzYXN0ZXJzW3RdIiBbcG9zPSIxMi4yNTAsMTIuMDAwIl0KIkVkdWNhdGlvblt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2LjI1MCw4LjAwMCJdCiJFZHVjYXRpb25bdC1pXSIgW3Bvcz0iMS4yNTAsOC4wMDAiXQoiRWR1Y2F0aW9uW3RdIiBbcG9zPSIxMS4yNTAsOC4wMDAiXQoiR0RQL2NhcGl0YVt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2LjAwMCw2LjAwMCJdCiJHRFAvY2FwaXRhW3QtaV0iIFtwb3M9IjEuMDAwLDYuMDAwIl0KIkdEUC9jYXBpdGFbdF0iIFtwb3M9IjExLjAwMCw2LjAwMCJdCiJIZWFsdGhbdC0xXSIgW2FkanVzdGVkLHBvcz0iNi41MDAsOS4wMDAiXQoiSGVhbHRoW3QtaV0iIFtwb3M9IjEuNTAwLDkuMDAwIl0KIkhlYWx0aFt0XSIgW3Bvcz0iMTEuNTAwLDkuMDAwIl0KIk1vcnRhbGl0eVt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2Ljc1MCwxMC4wMDAiXQoiTW9ydGFsaXR5W3QtaV0iIFtwb3M9IjEuNzUwLDEwLjAwMCJdCiJNb3J0YWxpdHlbdF0iIFtwb3M9IjExLjc1MCwxMC4wMDAiXQoiT3V0Y29tZVt0LTFdIiBbcG9zPSI5LjAwMCw2LjUwMCJdCiJPdXRjb21lW3QtaV0iIFtwb3M9IjQuMDAwLDYuNTAwIl0KIk91dGNvbWVbdF0iIFtvdXRjb21lLHBvcz0iMTQuMDAwLDYuNTAwIl0KIlJlc3RyaWN0aW9uc1t0LTFdIiBbZXhwb3N1cmUscG9zPSI4LjAwMCw3Ljc1MCJdCiJSZXN0cmljdGlvbnNbdC1pXSIgW2FkanVzdGVkLHBvcz0iMy4wMDAsNy43NTAiXQoiUmVzdHJpY3Rpb25zW3RdIiBbcG9zPSIxMy4wMDAsNy43NTAiXQoiVHJhZGVbdC0xXSIgW2FkanVzdGVkLHBvcz0iNi4wMDAsNy4wMDAiXQoiVHJhZGVbdC1pXSIgW3Bvcz0iMS4wMDAsNy4wMDAiXQoiVHJhZGVbdF0iIFtwb3M9IjExLjAwMCw3LjAwMCJdCiJWaW9sZW5jZVt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2LjI1MCw1LjAwMCJdCiJWaW9sZW5jZVt0LWldIiBbcG9zPSIxLjI1MCw1LjAwMCJdCiJWaW9sZW5jZVt0XSIgW3Bvcz0iMTEuMjUwLDUuMDAwIl0KImBDaXZpbCBsaWJlcnRpZXNgW3QtMV0iIFthZGp1c3RlZCxwb3M9IjYuNTAwLDQuMDAwIl0KImBDaXZpbCBsaWJlcnRpZXNgW3QtaV0iIFtwb3M9IjEuNTAwLDQuMDAwIl0KImBDaXZpbCBsaWJlcnRpZXNgW3RdIiBbcG9zPSIxMS41MDAsNC4wMDAiXQoiYEludGVybmFsIGNvbmZsaWN0YFt0LTFdIiBbYWRqdXN0ZWQscG9zPSI3LjAwMCwxMS4wMDAiXQoiYEludGVybmFsIGNvbmZsaWN0YFt0LWldIiBbcG9zPSIyLjAwMCwxMS4wMDAiXQoiYEludGVybmFsIGNvbmZsaWN0YFt0XSIgW3Bvcz0iMTIuMDAwLDExLjAwMCJdCiJgUnVsZSBvZiBsYXdgW3QtMV0iIFthZGp1c3RlZCxwb3M9IjYuNzUwLDMuMDAwIl0KImBSdWxlIG9mIGxhd2BbdC1pXSIgW3Bvcz0iMS43NTAsMy4wMDAiXQoiYFJ1bGUgb2YgbGF3YFt0XSIgW3Bvcz0iMTEuNzUwLDMuMDAwIl0KIkNvcnJ1cHRpb25bdC0xXSIgLT4gIkNvcnJ1cHRpb25bdF0iCiJDb3JydXB0aW9uW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJDb3JydXB0aW9uW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkNvcnJ1cHRpb25bdC1pXSIgLT4gIkNvcnJ1cHRpb25bdC0xXSIKIkNvcnJ1cHRpb25bdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIkNvcnJ1cHRpb25bdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiQ29ycnVwdGlvblt0XSIgLT4gIk91dGNvbWVbdF0iCiJDb3JydXB0aW9uW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiRGVtb2NyYWN5W3QtMV0iIC0+ICJDb3JydXB0aW9uW3QtMV0iCiJEZW1vY3JhY3lbdC0xXSIgLT4gIkRlbW9jcmFjeVt0XSIKIkRlbW9jcmFjeVt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiRGVtb2NyYWN5W3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkRlbW9jcmFjeVt0LTFdIiAtPiAiYFJ1bGUgb2YgbGF3YFt0LTFdIgoiRGVtb2NyYWN5W3QtaV0iIC0+ICJEZW1vY3JhY3lbdC0xXSIKIkRlbW9jcmFjeVt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiRGVtb2NyYWN5W3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKIkRlbW9jcmFjeVt0XSIgLT4gIkNvcnJ1cHRpb25bdF0iCiJEZW1vY3JhY3lbdF0iIC0+ICJPdXRjb21lW3RdIgoiRGVtb2NyYWN5W3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiRGVtb2NyYWN5W3RdIiAtPiAiYFJ1bGUgb2YgbGF3YFt0XSIKIkRpc2FzdGVyc1t0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiRGlzYXN0ZXJzW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkRpc2FzdGVyc1t0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiRGlzYXN0ZXJzW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKIkRpc2FzdGVyc1t0XSIgLT4gIk91dGNvbWVbdF0iCiJEaXNhc3RlcnNbdF0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJFZHVjYXRpb25bdC0xXSIgLT4gIkVkdWNhdGlvblt0XSIKIkVkdWNhdGlvblt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiRWR1Y2F0aW9uW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkVkdWNhdGlvblt0LWldIiAtPiAiRWR1Y2F0aW9uW3QtMV0iCiJFZHVjYXRpb25bdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIkVkdWNhdGlvblt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJFZHVjYXRpb25bdF0iIC0+ICJPdXRjb21lW3RdIgoiRWR1Y2F0aW9uW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiR0RQL2NhcGl0YVt0LTFdIiAtPiAiR0RQL2NhcGl0YVt0XSIKIkdEUC9jYXBpdGFbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIkdEUC9jYXBpdGFbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiR0RQL2NhcGl0YVt0LWldIiAtPiAiR0RQL2NhcGl0YVt0LTFdIgoiR0RQL2NhcGl0YVt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiR0RQL2NhcGl0YVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJHRFAvY2FwaXRhW3RdIiAtPiAiT3V0Y29tZVt0XSIKIkdEUC9jYXBpdGFbdF0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJIZWFsdGhbdC0xXSIgLT4gIkhlYWx0aFt0XSIKIkhlYWx0aFt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiSGVhbHRoW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkhlYWx0aFt0LWldIiAtPiAiSGVhbHRoW3QtMV0iCiJIZWFsdGhbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIkhlYWx0aFt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJIZWFsdGhbdF0iIC0+ICJPdXRjb21lW3RdIgoiSGVhbHRoW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiTW9ydGFsaXR5W3QtMV0iIC0+ICJNb3J0YWxpdHlbdF0iCiJNb3J0YWxpdHlbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIk1vcnRhbGl0eVt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJNb3J0YWxpdHlbdC1pXSIgLT4gIk1vcnRhbGl0eVt0LTFdIgoiTW9ydGFsaXR5W3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJNb3J0YWxpdHlbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiTW9ydGFsaXR5W3RdIiAtPiAiT3V0Y29tZVt0XSIKIk1vcnRhbGl0eVt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKIk91dGNvbWVbdC0xXSIgLT4gIk91dGNvbWVbdF0iCiJPdXRjb21lW3QtaV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiT3V0Y29tZVt0XSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIlJlc3RyaWN0aW9uc1t0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJSZXN0cmljdGlvbnNbdF0iIC0+ICJPdXRjb21lW3RdIgoiVHJhZGVbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIlRyYWRlW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIlRyYWRlW3QtMV0iIC0+ICJUcmFkZVt0XSIKIlRyYWRlW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJUcmFkZVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJUcmFkZVt0LWldIiAtPiAiVHJhZGVbdC0xXSIKIlRyYWRlW3RdIiAtPiAiR0RQL2NhcGl0YVt0XSIKIlRyYWRlW3RdIiAtPiAiT3V0Y29tZVt0XSIKIlRyYWRlW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiVmlvbGVuY2VbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIlZpb2xlbmNlW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIlZpb2xlbmNlW3QtMV0iIC0+ICJWaW9sZW5jZVt0XSIKIlZpb2xlbmNlW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJWaW9sZW5jZVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJWaW9sZW5jZVt0LWldIiAtPiAiVmlvbGVuY2VbdC0xXSIKIlZpb2xlbmNlW3RdIiAtPiAiT3V0Y29tZVt0XSIKIlZpb2xlbmNlW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiYENpdmlsIGxpYmVydGllc2BbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKImBDaXZpbCBsaWJlcnRpZXNgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBDaXZpbCBsaWJlcnRpZXNgW3QtMV0iIC0+ICJgQ2l2aWwgbGliZXJ0aWVzYFt0XSIKImBDaXZpbCBsaWJlcnRpZXNgW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJgQ2l2aWwgbGliZXJ0aWVzYFt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJgQ2l2aWwgbGliZXJ0aWVzYFt0LWldIiAtPiAiYENpdmlsIGxpYmVydGllc2BbdC0xXSIKImBDaXZpbCBsaWJlcnRpZXNgW3RdIiAtPiAiT3V0Y29tZVt0XSIKImBDaXZpbCBsaWJlcnRpZXNgW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJgSW50ZXJuYWwgY29uZmxpY3RgW3QtMV0iIC0+ICJgSW50ZXJuYWwgY29uZmxpY3RgW3RdIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJgSW50ZXJuYWwgY29uZmxpY3RgW3QtaV0iIC0+ICJgSW50ZXJuYWwgY29uZmxpY3RgW3QtMV0iCiJgSW50ZXJuYWwgY29uZmxpY3RgW3RdIiAtPiAiT3V0Y29tZVt0XSIKImBJbnRlcm5hbCBjb25mbGljdGBbdF0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJgUnVsZSBvZiBsYXdgW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJgUnVsZSBvZiBsYXdgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBSdWxlIG9mIGxhd2BbdC0xXSIgLT4gImBSdWxlIG9mIGxhd2BbdF0iCiJgUnVsZSBvZiBsYXdgW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJgUnVsZSBvZiBsYXdgW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKImBSdWxlIG9mIGxhd2BbdC1pXSIgLT4gImBSdWxlIG9mIGxhd2BbdC0xXSIKImBSdWxlIG9mIGxhd2BbdF0iIC0+ICJPdXRjb21lW3RdIgoiYFJ1bGUgb2YgbGF3YFt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKfQonKQoKaHVnZV9tZXNzeV9kYWdfcGxvdCA8LSBodWdlX21lc3N5X2RhZyAlPiUgCiAgdGlkeV9kYWdpdHR5KCkgJT4lIAogIG11dGF0ZSh2YXJfdHlwZSA9IGNhc2Vfd2hlbigKICAgIHN0cl9kZXRlY3QobmFtZSwgIk91dGNvbWUiKSB+ICJPdXRjb21lIiwKICAgIHN0cl9kZXRlY3QobmFtZSwgIlJlc3RyaWN0aW9ucyIpIH4gIlJlc3RyaWN0aW9ucyIsCiAgICBUUlVFIH4gIloiCiAgKSkgJT4lIAogIG11dGF0ZSh0aW1lX3BlcmlvZCA9IGNhc2Vfd2hlbigKICAgIHN0cl9kZXRlY3QobmFtZSwgInQtMSIpIH4gMiwKICAgIHN0cl9kZXRlY3QobmFtZSwgInQtaSIpIH4gMSwKICAgIFRSVUUgfiAzCiAgKSkgJT4lIAogIG11dGF0ZShhcnJvd19jb2xvciA9IGNhc2Vfd2hlbigKICAgIG5hbWUgPT0gIlJlc3RyaWN0aW9uc1t0LTFdIiAmIHRvID09ICJPdXRjb21lW3RdIiB+ICIjRkY0MTM2IiwKICAgIFRSVUUgfiAiZ3JleTYwIgogICkpCgpnZ3Bsb3QoaHVnZV9tZXNzeV9kYWdfcGxvdCwgYWVzKHggPSB4LCB5ID0geSwgeGVuZCA9IHhlbmQsIHllbmQgPSB5ZW5kKSkgKwogIGdlb21fZGFnX2VkZ2VzKGFlcyhlZGdlX2NvbG91ciA9IGFycm93X2NvbG9yKSkgKwogIGdlb21fZGFnX3BvaW50KGFlcyhjb2xvciA9IHZhcl90eXBlLCBhbHBoYSA9IHRpbWVfcGVyaW9kKSwgc2l6ZSA9IDEyKSArCiAgZ2VvbV9kYWdfdGV4dChkYXRhID0gZmlsdGVyKGh1Z2VfbWVzc3lfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJPdXRjb21lIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoOSksIHBhcnNlID0gVFJVRSkgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihodWdlX21lc3N5X2RhZ19wbG90LCB2YXJfdHlwZSA9PSAiUmVzdHJpY3Rpb25zIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoOSksIHBhcnNlID0gVFJVRSkgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihodWdlX21lc3N5X2RhZ19wbG90LCB2YXJfdHlwZSA9PSAiWiIpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gcHRzKDkpLCBwYXJzZSA9IFRSVUUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0IxMERDOSIsICIjRkY4NTFCIiwgImdyZXk2MCIpKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIGd1aWRlcyhhbHBoYSA9IEZBTFNFLCBjb2xvciA9IEZBTFNFKSArCiAgdGhlbWVfZGFnKCkKYGBgCgoKIyBTaW1wbGVyIG1vZGVsIHdpdGggZmFtaWxpZXMgb2YgY29uZm91bmRlcnMKCmBgYHtyIHNpbXBsZXJpc2gtZGFnLCBmaWcud2lkdGg9MTAuNSwgZmlnLmhlaWdodD00LjUsIGZpZy5hc3A9TlVMTH0Kc2ltcGxlcmlzaF9kYWcgPC0gZGFnaXR0eSgnCmRhZyB7CiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iIFthZGp1c3RlZCxwb3M9IjUsMS41Il0KImBIdW1hbiByaWdodHMgJiBwb2xpdGljc2BbdC1pXSIgW3Bvcz0iMSwxLjUiXQoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0XSIgW3Bvcz0iOSwxLjUiXQoiYEVjb25vbWljcyAmIGRldmVsb3BtZW50YFt0LTFdIiBbYWRqdXN0ZWQscG9zPSI1LDIuNSJdCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3QtaV0iIFtwb3M9IjEsMi41Il0KImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdF0iIFtwb3M9IjksMi41Il0KIk91dGNvbWVbdC0xXSIgW3Bvcz0iNi41LDEuNzUiXQoiT3V0Y29tZVt0LWldIiBbYWRqdXN0ZWQscG9zPSIyLjUsMS43NSJdCiJPdXRjb21lW3RdIiBbb3V0Y29tZSxwb3M9IjEwLjUsMS43NSJdCiJSZXN0cmljdGlvbnNbdC0xXSIgW2V4cG9zdXJlLHBvcz0iNiwyLjI1Il0KIlJlc3RyaWN0aW9uc1t0LWldIiBbYWRqdXN0ZWQscG9zPSIyLDIuMjUiXQoiUmVzdHJpY3Rpb25zW3RdIiBbcG9zPSIxMCwyLjI1Il0KImBVbmV4cGVjdGVkIHNob2Nrc2BbdC0xXSIgW2FkanVzdGVkLHBvcz0iNSwyIl0KImBVbmV4cGVjdGVkIHNob2Nrc2BbdC1pXSIgW3Bvcz0iMSwyIl0KImBVbmV4cGVjdGVkIHNob2Nrc2BbdF0iIFtwb3M9IjksMiJdCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iIC0+ICJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3RdIgoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtaV0iIC0+ICJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKImBIdW1hbiByaWdodHMgJiBwb2xpdGljc2BbdF0iIC0+ICJPdXRjb21lW3RdIgoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC0xXSIgLT4gImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdF0iCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC1pXSIgLT4gImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC0xXSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiYEVjb25vbWljcyAmIGRldmVsb3BtZW50YFt0XSIgLT4gIk91dGNvbWVbdF0iCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiT3V0Y29tZVt0LTFdIiAtPiAiT3V0Y29tZVt0XSIKIk91dGNvbWVbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKIk91dGNvbWVbdC1pXSIgLT4gIk91dGNvbWVbdC0xXSIKIk91dGNvbWVbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiUmVzdHJpY3Rpb25zW3RdIiAtPiAiT3V0Y29tZVt0XSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJSZXN0cmljdGlvbnNbdC0xXSIgLT4gIk91dGNvbWVbdF0iCiJSZXN0cmljdGlvbnNbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKIlJlc3RyaWN0aW9uc1t0LWldIiAtPiAiT3V0Y29tZVt0LTFdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LTFdIiAtPiAiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0XSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LWldIiAtPiAiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LTFdIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0XSIgLT4gIk91dGNvbWVbdF0iCiJgVW5leHBlY3RlZCBzaG9ja3NgW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgp9CicpCgpzaW1wbGVyaXNoX2RhZ19wbG90IDwtIHNpbXBsZXJpc2hfZGFnICU+JSAKICB0aWR5X2RhZ2l0dHkoKSAlPiUgCiAgbXV0YXRlKHZhcl90eXBlID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAiT3V0Y29tZSIpIH4gIk91dGNvbWUiLAogICAgc3RyX2RldGVjdChuYW1lLCAiUmVzdHJpY3Rpb25zIikgfiAiUmVzdHJpY3Rpb25zIiwKICAgIFRSVUUgfiAiWiIKICApKSAlPiUgCiAgbXV0YXRlKHRpbWVfcGVyaW9kID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAidC0xIikgfiAyLAogICAgc3RyX2RldGVjdChuYW1lLCAidC1pIikgfiAxLAogICAgVFJVRSB+IDMKICApKSAlPiUgCiAgbXV0YXRlKGFycm93X2NvbG9yID0gY2FzZV93aGVuKAogICAgbmFtZSA9PSAiUmVzdHJpY3Rpb25zW3QtMV0iICYgdG8gPT0gIk91dGNvbWVbdF0iIH4gIiNGRjQxMzYiLAogICAgVFJVRSB+ICJncmV5NjAiCiAgKSkKCmdncGxvdChzaW1wbGVyaXNoX2RhZ19wbG90LCBhZXMoeCA9IHgsIHkgPSB5LCB4ZW5kID0geGVuZCwgeWVuZCA9IHllbmQpKSArCiAgZ2VvbV9kYWdfZWRnZXMoYWVzKGVkZ2VfY29sb3VyID0gYXJyb3dfY29sb3IpKSArCiAgZ2VvbV9kYWdfcG9pbnQoYWVzKGNvbG9yID0gdmFyX3R5cGUsIGFscGhhID0gdGltZV9wZXJpb2QpLCBzaXplID0gMTIpICsKICBnZW9tX2RhZ190ZXh0KGRhdGEgPSBmaWx0ZXIoc2ltcGxlcmlzaF9kYWdfcGxvdCwgdmFyX3R5cGUgPT0gIk91dGNvbWUiKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IHB0cyg5KSwgcGFyc2UgPSBUUlVFKSArCiAgZ2VvbV9kYWdfdGV4dChkYXRhID0gZmlsdGVyKHNpbXBsZXJpc2hfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJSZXN0cmljdGlvbnMiKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IHB0cyg5KSwgcGFyc2UgPSBUUlVFKSArCiAgZ2VvbV9kYWdfdGV4dChkYXRhID0gZmlsdGVyKHNpbXBsZXJpc2hfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJaIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoOSksIHBhcnNlID0gVFJVRSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjQjEwREM5IiwgIiNGRjg1MUIiLCAiZ3JleTYwIikpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgZ3VpZGVzKGFscGhhID0gRkFMU0UsIGNvbG9yID0gRkFMU0UpICsKICB0aGVtZV9kYWcoKQpgYGAKCgojIFNpbXBsZXN0IG1vZGVsCgpgYGB7ciBzaW1wbGUtZGFnLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD0zLjc1LCBmaWcuYXNwPU5VTEx9CnNpbXBsZV9kYWcgPC0gZGFnaXR0eSgnCmRhZyB7CiJPdXRjb21lW3QtaV0iIFtwb3M9IjEuNSwyIl0KIk91dGNvbWVbdC0xXSIgW3Bvcz0iMy41LDIiXQoiT3V0Y29tZVt0XSIgW291dGNvbWUscG9zPSI2LDIiXQoiUmVzdHJpY3Rpb25zW3QtaV0iIFtwb3M9IjEsMSJdCiJSZXN0cmljdGlvbnNbdC0xXSIgW2V4cG9zdXJlLHBvcz0iMywxIl0KIlJlc3RyaWN0aW9uc1t0XSIgW3Bvcz0iNSwxIl0KIlpbdC1pXSIgW3Bvcz0iMSwzIl0KIlpbdC0xXSIgW3Bvcz0iMywzIl0KIlpbdF0iIFtwb3M9IjUsMyJdCiJPdXRjb21lW3QtMV0iIC0+ICJPdXRjb21lW3RdIgoiT3V0Y29tZVt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiT3V0Y29tZVt0LWldIiAtPiAiT3V0Y29tZVt0LTFdIgoiT3V0Y29tZVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJSZXN0cmljdGlvbnNbdF0iIC0+ICJPdXRjb21lW3RdIgoiUmVzdHJpY3Rpb25zW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiT3V0Y29tZVt0XSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiWlt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiWlt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJaW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJaW3QtMV0iIC0+ICJaW3RdIgoiWlt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiWlt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJaW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKIlpbdC1pXSIgLT4gIlpbdC0xXSIKIlpbdF0iIC0+ICJPdXRjb21lW3RdIgoiWlt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKfQonKSAKCnNpbXBsZV9kYWdfcGxvdCA8LSBzaW1wbGVfZGFnICU+JSAKICB0aWR5X2RhZ2l0dHkoKSAlPiUgCiAgbXV0YXRlKHZhcl90eXBlID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAiT3V0Y29tZSIpIH4gIk91dGNvbWUiLAogICAgc3RyX2RldGVjdChuYW1lLCAiUmVzdHJpY3Rpb25zIikgfiAiUmVzdHJpY3Rpb25zIiwKICAgIHN0cl9kZXRlY3QobmFtZSwgIloiKSB+ICJaIgogICkpICU+JSAKICBtdXRhdGUodGltZV9wZXJpb2QgPSBjYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KG5hbWUsICJ0LTEiKSB+IDIsCiAgICBzdHJfZGV0ZWN0KG5hbWUsICJ0LWkiKSB+IDEsCiAgICBUUlVFIH4gMwogICkpICU+JSAKICBtdXRhdGUoYXJyb3dfY29sb3IgPSBjYXNlX3doZW4oCiAgICBuYW1lID09ICJSZXN0cmljdGlvbnNbdC0xXSIgJiB0byA9PSAiT3V0Y29tZVt0XSIgfiAiI0ZGNDEzNiIsCiAgICBUUlVFIH4gImdyZXk2MCIKICApKSAlPiUgCiAgbXV0YXRlKGxldHRlcl9vbmx5ID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAiT3V0Y29tZSIpIH4gc3RyX3JlcGxhY2UobmFtZSwgIk91dGNvbWUiLCAiWSIpLAogICAgc3RyX2RldGVjdChuYW1lLCAiUmVzdHJpY3Rpb25zIikgfiBzdHJfcmVwbGFjZShuYW1lLCAiUmVzdHJpY3Rpb25zIiwgIlgiKSwKICAgIFRSVUUgfiBuYW1lCiAgKSkKCnNpbXBsZV9kYWdfb3V0IDwtIGdncGxvdChzaW1wbGVfZGFnX3Bsb3QsIGFlcyh4ID0geCwgeSA9IHksIHhlbmQgPSB4ZW5kLCB5ZW5kID0geWVuZCkpICsKICBnZW9tX2RhZ19lZGdlcyhhZXMoZWRnZV9jb2xvdXIgPSBhcnJvd19jb2xvcikpICsKICBnZW9tX2RhZ19wb2ludChhZXMoY29sb3IgPSB2YXJfdHlwZSwgYWxwaGEgPSB0aW1lX3BlcmlvZCksIHNpemUgPSAxMikgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihzaW1wbGVfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJPdXRjb21lIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoMTEpLCBwYXJzZSA9IFRSVUUsIAogICAgICAgICAgICAgICAgbnVkZ2VfeSA9IDAuMiwgbnVkZ2VfeCA9IDAuMykgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihzaW1wbGVfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJSZXN0cmljdGlvbnMiKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IHB0cygxMSksIHBhcnNlID0gVFJVRSwgCiAgICAgICAgICAgICAgICBudWRnZV95ID0gLTAuMjUpICsKICBnZW9tX2RhZ190ZXh0KGRhdGEgPSBmaWx0ZXIoc2ltcGxlX2RhZ19wbG90LCB2YXJfdHlwZSA9PSAiWiIpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gcHRzKDExKSwgcGFyc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgbnVkZ2VfeSA9IDApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0IxMERDOSIsICIjRkY4NTFCIiwgImdyZXk2MCIpKSArCiAgZ3VpZGVzKGFscGhhID0gRkFMU0UsIGNvbG9yID0gRkFMU0UpICsKICB0aGVtZV9kYWcoKQpzaW1wbGVfZGFnX291dApgYGAKCmBgYHtyIHNpbXBsZS1kYWctbGV0dGVycywgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9My43NSwgZmlnLmFzcD1OVUxMfQpzaW1wbGVfZGFnX2xldHRlcnNfb3V0IDwtIGdncGxvdChzaW1wbGVfZGFnX3Bsb3QsIGFlcyh4ID0geCwgeSA9IHksIHhlbmQgPSB4ZW5kLCB5ZW5kID0geWVuZCkpICsKICBnZW9tX2RhZ19lZGdlcyhhZXMoZWRnZV9jb2xvdXIgPSBhcnJvd19jb2xvcikpICsKICBnZW9tX2RhZ19wb2ludChhZXMoY29sb3IgPSB2YXJfdHlwZSwgYWxwaGEgPSB0aW1lX3BlcmlvZCksIHNpemUgPSAxMikgKwogIGdlb21fZGFnX3RleHQoYWVzKGxhYmVsID0gbGV0dGVyX29ubHkpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gcHRzKDExKSwgcGFyc2UgPSBUUlVFKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNCMTBEQzkiLCAiI0ZGODUxQiIsICJncmV5NjAiKSkgKwogIGd1aWRlcyhhbHBoYSA9IEZBTFNFLCBjb2xvciA9IEZBTFNFKSArCiAgdGhlbWVfZGFnKCkKc2ltcGxlX2RhZ19sZXR0ZXJzX291dAoKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJkYWdfc2ltcGxlX2xldHRlcnMucGRmIiksIHNpbXBsZV9kYWdfbGV0dGVyc19vdXQsCiAgICAgICB3aWR0aCA9IDcsIGhlaWdodCA9IDMuNzUsIGRldmljZSA9IGNhaXJvX3BkZikKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJkYWdfc2ltcGxlX2xldHRlcnMucG5nIiksIHNpbXBsZV9kYWdfbGV0dGVyc19vdXQsCiAgICAgICB3aWR0aCA9IDcsIGhlaWdodCA9IDMuNzUsIGRwaSA9IDMwMCwgdHlwZSA9ICJjYWlybyIpCmBgYAoKCgojIEFkanVzdG1lbnQgc2V0cwoKVGhlc2UgREFHcyBhcmUgY29tcGxleOKAlGVzcGVjaWFsbHkgdGhlIG9uZSB3aXRoIGV2ZXJ5IHBvc3NpYmxlIG5vZGUuIEhvd2V2ZXIsIHRoZXkgaGF2ZSBpbXBvcnRhbnQgYW5hbHl0aWNhbCB2YWx1ZS4gV2UgY2Fubm90IHJhbmRvbWx5IGFzc2lnbiBjb3VudHJpZXMgdG8gaW1wb3NlIGFudGktTkdPIGxhd3Mgb3IgcmVzdHJpY3QgdGhlIGVudmlyb25tZW50IGZvciBjaXZpbCBzb2NpZXR54oCUZG9pbmcgdGhhdCBpcyBjb21wbGV0ZWx5IGluZmVhc2FibGUgKGFuZCB1bmV0aGljYWwhKS4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbm5vdCB1c2UgZXhwZXJpbWVudGFsIGRhdGEgdG8gbWVhc3VyZSB0aGUgY2F1c2FsIGVmZmVjdCBvZiBhbnRpLU5HTyByZXN0cmljdGlvbnMgb24gZm9yZWlnbiBhaWQsIG9yICRFW1x0ZXh0e0FpZH0gXG1pZCBkbyhcdGV4dHtSZXN0cmljdGlvbnN9KV0kLiBXZSBhbHNvIGRvbid0IGhhdmUgYW55IHF1YXNpLWV4cGVyaW1lbnRhbCBzaXR1YXRpb25zIHRoYXQgd291bGQgYWxsb3cgZm9yIGNvbnRleHQtYmFzZWQgaWRlbnRpZmljYXRpb24gb2YgdGhlIGVmZmVjdCBvZiByZXN0cmljdGlvbnMgb24gYWlkLgoKU2ltcGx5IG1lYXN1cmluZyAkRVtcdGV4dHtBaWR9IFxtaWQgXHRleHR7UmVzdHJpY3Rpb25zfV0kIGlzIHRyaXZpYWzigJRqdXN0IHJ1biBgbG0oYWlkIH4gcmVzdHJpY3Rpb25zKWAgYW5kIGxvb2sgYXQgdGhlIGNvZWZmaWNpZW50LiBIb3dldmVyLCB0aGlzIGVzdGltYXRlIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBpbiBhbnkgc29ydCBvZiBjYXVzYWwgd2F5LCBzaW5jZSBjb3JyZWxhdGlvbiBpcyBub3QgY2F1c2F0aW9uLiBVc2luZyB0aGUgbG9naWMgb2YgKmRvKi1jYWxjdWx1cywgd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBub2RlcyBpbiB0aGUgREFHIHRvIHRyYW5zZm9ybSAkRVtcdGV4dHtBaWR9IFxtaWQgZG8oXHRleHR7UmVzdHJpY3Rpb25zfSldJCBpbnRvIGEgKmRvKi1mcmVlIGV4cHJlc3Npb24gYnkgbWFraW5nIHN0YXRpc3RpY2FsIGFkanVzdG1lbnRzIGFuZCBjbG9zaW5nIGJhY2tkb29yIHBhdGh3YXlzIHRoYXQgb3BlbiB1cCBzcHVyaW91cyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVzdHJpY3Rpb25zIGFuZCBhaWQuIEFzIGxvbmcgYXMgd2UgY2FuIGZpbmQgYSBtaW5pbWFsbHkgc3VmZmljaWVudCBhZGp1c3RtZW50IHNldOKAlG9yIGEgc2V0IG9mIG5vZGVzIG9yIHZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgYWRqdXN0ZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgcmVzdHJpY3Rpb25zIGlzICpkKi1zZXBhcmF0ZWQgZnJvbSBhaWTigJR3ZSBjYW4gaXNvbGF0ZSBhbmQgaWRlbnRpZnkgdGhlIGNhdXNhbCBsaW5rIGJldHdlZW4gcmVzdHJpY3Rpb25zIGFuZCBhaWQuCgpSYXRoZXIgdGhhbiBnbyB0aHJvdWdoIHRoZSBjb21wbGV4IG1hdGggYmVoaW5kIHRoZSB0aHJlZSBydWxlcyBvZiAqZG8qLWNhbGN1bHVzLCB3ZSBjYW4gdXNlIFIgKG9yIGRhZ2l0dHkubmV0KSB0byBpZGVudGlmeSBtaW5pbWFsIHN1ZmZpY2llbnQgYWRqdXN0bWVudCBzZXRzIGJhc2VkIG9uIHRoZSB0aHJlZSBEQUdzIGFib3ZlLgoKLSBIdWdlIGNvbXBsaWNhdGVkIERBRzoKCmBgYHtyIGh1Z2UtZGFnLWFkanVzdG1lbnQsIGluZGVudD0iICAgICIsIGNsYXNzLnNvdXJjZSA9ICdmb2xkLXNob3cnfQpodWdlX21lc3N5X2RhZyAlPiUKICBhZGp1c3RtZW50U2V0cygpCmBgYAoKLSBTaW1wbGVyLWlzaCBEQUc6CgpgYGB7ciBzaW1wbGVyaXNoLWRhZy1hZGp1c3RtZW50LCBpbmRlbnQ9IiAgICAiLCBjbGFzcy5zb3VyY2UgPSAnZm9sZC1zaG93J30Kc2ltcGxlcmlzaF9kYWcgJT4lCiAgYWRqdXN0bWVudFNldHMoKQpgYGAKCi0gU2ltcGxlIERBRzoKCmBgYHtyIHNpbXBsZS1kYWctYWRqdXN0bWVudCwgaW5kZW50PSIgICAgIiwgY2xhc3Muc291cmNlID0gJ2ZvbGQtc2hvdyd9CnNpbXBsZV9kYWcgJT4lCiAgYWRqdXN0bWVudFNldHMoKQpgYGAKClwgCgpJbiBvdGhlciB3b3JkcywgaWYgd2Ugd2FudCB0byBpc29sYXRlIHRoZSBjYXVzYWwgZWZmZWN0IG9mIGFudGktTkdPIHJlc3RyaWN0aW9ucyBpbiB0aW1lICR0JCBvbiBhaWQgaW4gdGltZSAkdCsxJCAoaS5lLiB0aGUgZWZmZWN0IG9mIGxhZ2dlZCByZXN0cmljdGlvbnMpLCB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgbGFnZ2VkIGFpZCAoJHQtMSQpLCBsYWdnZWQgcmVzdHJpY3Rpb25zICgkdC0xJCksIGFuZCB0aW1lLXZhcnlpbmcgY29uZm91bmRlcnMgKCR0JCkuIAoKRm9ydHVuYXRlbHksIG1hcmdpbmFsIHN0cnVjdHVyYWwgbW9kZWxzIGFsbG93IHVzIHRvIG1ha2UgYWxsIG9mIHRoZXNlIGFkanVzdG1lbnRzIHVzaW5nIHNwZWNpYWwgaW52ZXJzZSBwcm9iYWJpbGl0eSB3ZWlnaHRzIHRoYXQgdGFrZSB0aGlzIGxhZ2dpbmcgc3RydWN0dXJlIGFuZCB0cmVhdG1lbnQgaGlzdG9yeSBpbnRvIGFjY291bnQuCgokJApcdGV4dHtDb250aW51b3VzIHN0YWJpbGl6ZWQgSVBXfV97aXR9ID0gXHByb2RedF97dCA9IDF9IFxmcmFje2Zfe1ggfCBcYmFye1h9LCBWfVsoWF97aXR9IHwgXGJhcntYfV97aSwgdC0xfSwgVl9pKTsgXG11XzEsIFxzaWdtYV4yXzFdfXtmX3tYIHwgXGJhcntYfSwgWSwgWiwgVn1bKFhfe2l0fSB8IFxiYXJ7WH1fe2ksIHQtMX0sIFlfe2ksIHQtMX0sIFpfe2l0fSwgVl9pKSwgXG11XzIsIFxzaWdtYV4yXzJdfQokJAoKLSBUaGUgbnVtZXJhdG9yIGNvbnRhaW5zIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgb2JzZXJ2ZWQgdHJlYXRtZW50IHN0YXR1cyAoJFhfe2l0fSQpIGF0IGVhY2ggdGltZSBnaXZlbiB0aGUgcHJldmlvdXMgaGlzdG9yeSBvZiB0cmVhdG1lbnQgKCRcYmFye1h9X3tpLCB0LTF9JCkgYW5kIHRpbWUgaW52YXJpYW50IGNvbmZvdW5kZXJzICgkVl9pJCkuIAotIFRoZSBkZW5vbWluYXRvciBjb250YWlucyB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIG9ic2VydmVkIHRyZWF0bWVudCBzdGF0dXMgKCRYX3tpdH0kKSBhdCBlYWNoIHRpbWUgZ2l2ZW4gdGhlIHByZXZpb3VzIGhpc3Rvcnkgb2YgdHJlYXRtZW50ICgkXGJhcntYfV97aSwgdC0xfSQpLCBwcmV2aW91cyBvdXRjb21lICgkWV97aSwgdC0xfSQpLCB0aW1lICp2YXJ5aW5nKiBjb25mb3VuZGVycyAoJFpfe2l0fSQpLCBhbmQgdGltZSAqaW52YXJpYW50KiBjb25mb3VuZGVycyAoJFZfaSQpLgotIFRoZXNlIHR3byBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIGhhdmUgYSBtZWFuIG9mICRcbXVfezEsIDJ9JCBhbmQgdmFyaWFuY2Ugb2YgJFxzaWdtYV4yX3sxLCAyfSQuCgpGaW5hbGx5LCB0aGVzZSB3ZWlnaHRzIGFyZSB1c2VkIGluIGFuIG91dGNvbWUgbW9kZWwgc2ltaWxhciB0byB0aGlzOgoKYGBge3IgZXZhbD1GQUxTRSwgY2xhc3Muc291cmNlID0gJ2ZvbGQtc2hvdyd9CmxtKG91dGNvbWUgfiBsYWdfdHJlYXRtZW50LCB3ZWlnaHRzID0gaXB3KQpgYGAKCkRvaW5nIHRoaXMgcHJvY2VzcyBjbG9zZXMgdGhlIGJhY2tkb29yIHBhdGh3YXlzIGJldHdlZW4gbGFnZ2VkIHJlc3RyaWN0aW9ucyBhbmQgcHJlc2VudCBhaWQgYW5kIGlzIHRoZW9yZXRpY2FsbHkgc3VmZmljaWVudCBmb3IgaXNvbGF0aW5nIHRoZSBjYXVzYWwgbGluayBiZXR3ZWVuIHRoZSB0d28uCgoKIyBGaW5hbCB2YXJpYWJsZXMgdG8gdXNlCgpCYXNlZCBvbiB0aGVzZSBEQUdzLCBoZXJlIGFyZSB0aGUgdmFyaWFibGVzIHdlIHVzZSBpbiBvdXIgdHJlYXRtZW50IGFuZCBvdXRjb21lIG1vZGVsczoKCi0gKipPdXRjb21lKioKICAtIEh+MX46IGxvZyBhaWQgaW4gJHQkIChgdG90YWxfb2RhX2xlYWRgIGFuZCBgdG90YWxfb2RhX2xvZ19sZWFkYCkKICAtIEh+Mn46IHByb3BvcnRpb24gb2YgYWlkIGdpdmVuIGZvciBjb250ZW50aW91cyBjYXVzZXMgaW4gJHQkIChgcHJvcF9jb250ZW50aW91c2ApCiAgLSBIfjN+OiBwcm9wb3J0aW9uIG9mIGFpZCBnaXZlbiB0byBkb21lc3RpYy9pbnRlcm5hdGlvbmFsIE5HT1MgaW4gJHQkIChgcHJvcF9uZ29fZG9tYCBhbmQgYHByb3BfbmdvX2ZvcmVpZ25gKQotICoqVHJlYXRtZW50KioKICAtIEFudGktY2l2aWwgc29jaWV0eSBsYXdzIGFuZCBnZW5lcmFsIHJlc3RyaWN0aXZlIGVudmlyb25tZW50IGluICR0LTEkIChgYmFycmllcnNfdG90YWxgIGFuZCBgdjJ4Y3NfY2NzaWApCi0gKipUaW1lLXZhcnlpbmcgY29uZm91bmRlcnMqKiAoYWxsIGluICR0LTEkKQogIC0gSHVtYW4gcmlnaHRzIGFuZCBwb2xpdGljcwogICAgLSBFbGVjdG9yYWwgZGVtb2NyYWN5OiBgdjJ4X3BvbHlhcmNoeWAKICAgIC0gQ29ycnVwdGlvbjogYHYyeF9jb3JyYAogICAgLSBSdWxlIG9mIGxhdzogYHYyeF9ydWxlYAogICAgLSBDaXZpbCBsaWJlcnRpZXMgaW5kZXg6IGB2MnhfY2l2bGliYAogICAgLSBQaHlzaWNhbCB2aW9sZW5jZSBpbmRleDogYHYyeF9jbHBoeWAKICAgIC0gUHJpdmF0ZSBjaXZpbCBsaWJlcnRpZXMgaW5kZXg6IGB2MnhfY2xwcml2YAogIC0gRWNvbm9taWNzIGFuZCBkZXZlbG9wbWVudAogICAgLSBXZWFsdGg6IGBnZHBjYXBfbG9nYAogICAgLSBJbnRlcm5hdGlvbmFsIHRyYWRlOiBgdW5fdHJhZGVfcGN0X2dkcGAKICAgIC0gRWR1Y2F0aW9uYWwgZXF1YWxpdHk6IGB2MnBlZWR1ZXFgCiAgICAtIEhlYWx0aCBlcXVhbGl0eTogYHYycGVoZWFsdGhgCiAgICAtIEluZmFudCBtb3J0YWxpdHkgcmF0ZTogYGVfcGVpbmZtb3JgCiAgLSBVbmV4cGVjdGVkIHNob2NrcwogICAgLSBJbnRlcm5hbCBjb25mbGljdDogYGludGVybmFsX2NvbmZsaWN0X3Bhc3RfNWAKICAgIC0gTmF0dXJhbCBkaXNhc3RlcnM6IGBuYXR1cmFsX2Rpc19jb3VudGAKLSAqKlRpbWUtaW52YXJ5aW5nIGNvbmZvdW5kZXJzKioKICAtIENvdW50cnkgY29kZSBpbmNsdWRlZCBhcyBtdWx0aWxldmVsIHJhbmRvbSBlZmZlY3RzKGAoMSB8IGd3Y29kZSlgKQo=