Figure 7.1: Judicial Independence, Power-Sharing, and Aid: Individual Patterns

library(texreg)
source("functions/extract_ols_custom.R")

# Libraries
library(tidyverse)
library(gridExtra)
library(tikzDevice)

# Load Data
load("./data/diss_df.rda")

# Labels for easier plotting
diss_df$cabinetINClabel <- ifelse(diss_df$cabinetINC == 1, "Power-Sharing", 
                                    "No \nPower-Sharing")

# PS => JudInd
plot_ps_judinc_LJI <- ggplot(diss_df, aes(x = cabinetINClabel, y = LJI_t2)) + 
  geom_jitter(size = 1.7, alpha = 0.5, height = 0) +
  geom_boxplot(aes(fill = cabinetINClabel), alpha = 0.6) +
  scale_fill_brewer(palette = "Blues") + 
  stat_summary(aes(group = 1), fun.y = mean, geom = "point", shape = 23,
               size = 4, fill = "#d7191c", color = "#d7191c") + 
  theme_bw() +
  theme(legend.position = "none", axis.text = element_text(size = 11)) +
  labs(x = "", y = "LJI")

plot_allaid_LJI <- ggplot(diss_df, aes(x = log(aiddata_AidGDP), y = LJI_t2)) + 
  geom_point(size = 1.7, alpha = 0.5) +
  geom_smooth(method = "lm") +
  theme_bw() +
  labs(x = "All Aid / GDP (log)", y = "LJI") 

# For Manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aid_ps_indeff_judind.tex", height = 3.5)
# cowplot::plot_grid(plot_ps_judinc_LJI, plot_allaid_LJI, nrow = 1)
# dev.off()

# For Replication Archive
cowplot::plot_grid(plot_ps_judinc_LJI, plot_allaid_LJI, nrow = 1)

Figure 7.2: Foreign Aid and Post-Conflict Judicial Independence in Country-Years With and Without Power-Sharing Cabinets

# Libraries
library(tidyverse)

# load data
load("./data/diss_df.rda")

# plot raw data
psaid_judind_plot <- ggplot(diss_df, 
                            aes(x = log(aiddata_AidGDP), 
                                y = LJI_t2)) + 
  geom_point(size = 1.7, alpha = 0.5) + 
  geom_smooth(method = "lm") +
  facet_wrap( ~ cabinetINC, nrow = 1,
              labeller = labeller(cabinetINC = c("0" = "No Power-Sharing", 
                                                 "1" = "Power-Sharing"))) +
  theme_bw() +
  theme(strip.text = element_text(size=11)) +
  labs(x = "Aid / GDP (log)", y = "Linzer and Staton Judicial Independence")

# Output Manuscript
library(gridExtra)
library(tikzDevice)
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_judind_scatterplot.tex", height = 3.5)
# print(psaid_judind_plot)
# dev.off()


print(psaid_judind_plot)

Figure 7.3: Temporal Dynamics of the Interactive Effect between Power-Sharing and Foreign Aid on Judicial Independence

# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)


# Data
load("./data/diss_df.rda")

diss_df <- diss_df %>% 
  dplyr::select(-matches("logit")) 

# Prepare data frame for multiple plots
judind_vars <- list(
  LJI_t1 = diss_df,
  LJI_t2 = diss_df, 
  LJI_t3 = diss_df, 
  LJI_t4 = diss_df, 
  LJI_t5 = diss_df, 
  v2x_jucon_t1 = diss_df,
  v2x_jucon_t2 = diss_df, 
  v2x_jucon_t3 = diss_df, 
  v2x_jucon_t4 = diss_df, 
  v2x_jucon_t5 = diss_df
)

# create data frame with list column
judind_vars <- enframe(judind_vars)

# define function that will be applied to every data frame in the list column
main_model <- function(lead_type, data) {
  data <- as.data.frame(data)
  data$lead_var <- data[, grep(lead_type, names(data), value =T)]
  model <- lfe::felm(lead_var ~
                       cabinetCOUNT *
                       aiddata_AidGDP_ln +
                       log(GDP_per_capita) +
                       ln_pop +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       fh | 0 | 0 | GWNo,
                     data=data)
  return(model)

}


# fit models & post-process data for plotting
model_all <- judind_vars %>% 
  dplyr::mutate(model = map2(name, value, ~ main_model(.x, .y))) 

model_out <- model_all %>% 
  mutate(coef = map(model, broom::tidy)) %>% 
  unnest(coef) %>% 
  # keep only interaction term coefs
  filter(term == "cabinetCOUNT:aiddata_AidGDP_ln") %>% 
  mutate(dem_score = ifelse(grepl("LJI", name), "LJI", "V-Dem")) %>% 
  dplyr::select(dem_score, name, estimate, std.error) %>% 
  group_by(dem_score) %>% 
  mutate(name = 1:5)


temp_dyn_rol <- model_out
save(temp_dyn_rol, file = "./data/temp_dyn_rol.rda")


temp_dynamics_plot <- ggplot(model_out, 
                             aes(x = name, 
                                 y = estimate,
                                 group = dem_score, color = dem_score)) +
  geom_point( aes(group = dem_score), size = 1.7, 
              position = position_dodge(width = .5)) + 
  
  geom_errorbar(aes(ymin = estimate - 1.67 * std.error, 
                    ymax = estimate + 1.67 * std.error, 
                    linetype = dem_score), 
                width = 0,
                position = position_dodge(width = .5)) +
  
  geom_hline(yintercept = 0, linetype = 2) +
  scale_color_manual("", values = c("#4575b4", "#e41a1c")) +
  scale_linetype_manual("", values = c(1, 5)) +
  theme_bw()+ 
  labs(x = "Year after t0", y = "Estimate of Interaction Coefficient \n between Power-Sharing (cabinet)\n and Aid/GDP (log)") +
   theme(legend.position = "bottom") +
  theme(legend.key.size=unit(3,"lines")) # +
  # annotate("rect", xmin=1.5, xmax=2.5, ymin=-Inf, ymax=Inf, alpha=.1, fill="blue")

# Output for manuscript
# options(tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/temp_dynamics_plot_judind.tex", height = 3.5)
# print(temp_dynamics_plot)
# dev.off()

# Output for replication archive
print(temp_dynamics_plot)

Figure 7.4: Marginal Effects of Aid and Power-Sharing on Post-Conflict Judicial Independence

# Libraries
library(tidyverse)
library(rms)
library(tikzDevice)


# Load data
load("./data/diss_df.rda")



# Estimate Models for plotting later
# LJI
model_aidps_judind_LJI_cabinc<- ols(LJI_t2 ~
                                           cabinetINC *
                                           aiddata_AidGDP_ln +
                                           ln_gdp_pc +
                                           ln_pop +
                                           conf_intens +
                                           nonstate + 
                                           WBnatres + 
                                           fh
                                         ,
                                         data = diss_df, 
                                         x = T, y = T)
model_aidps_judind_LJI_cabinc <- robcov(model_aidps_judind_LJI_cabinc, diss_df$GWNo)


model_aidps_judind_LJI_cabcount <- ols(LJI_t2 ~
                                           cabinetCOUNT *
                                           aiddata_AidGDP_ln +
                                           ln_gdp_pc +
                                           ln_pop +
                                           conf_intens +
                                           nonstate + 
                                           WBnatres + 
                                           fh
                                         ,
                                         data = diss_df, 
                                         x = T, y = T)
model_aidps_judind_LJI_cabcount <- robcov(model_aidps_judind_LJI_cabcount, diss_df$GWNo)

# plot marginal effects
source("functions/interaction_plots.R")


# # Output for manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_interaction_judind_plot.tex", height = 3.5)
# 
# par(mfrow=c(1,3),
#     mar = c(5, 7, 4, 0.5),
#     cex.lab = 1.3,
#     cex.axis = 1.3,
#     mgp = c(3.5, 1, 0))
# 
# interaction_plot_continuous(model_aidps_judind_LJI_cabcount, 
#                             "cabinetCOUNT", 
#                             "aiddata_AidGDP_ln", 
#                             "cabinetCOUNT * aiddata_AidGDP_ln", 
#                             title = "", 
#                             ylab = "Marginal effect of Power-Sharing (cabinet) \n on Judicial Independence", 
#                             add_median_effect = T,
#                             xlab = "a) Aid / GDP (Log)\n", 
#                             conf = .90)
# interaction_plot_continuous(model_aidps_judind_LJI_cabcount, 
#                             "aiddata_AidGDP_ln", 
#                             "cabinetCOUNT", 
#                             "cabinetCOUNT * aiddata_AidGDP_ln", 
#                             title = "", 
#                             add_median_effect = T,
#                             ylab = "Marginal effect of Aid\n on Judicial Independence",
#                             xlab = "b) Power-Sharing \n(Number of rebel seats)",
#                             conf = .90)
# interaction_plot_binary(model_aidps_judind_LJI_cabinc,
#                         "aiddata_AidGDP_ln",
#                         "cabinetINC", 
#                         "cabinetINC * aiddata_AidGDP_ln", 
#                         title = "", 
#                         ylab = "Marginal effect of Aid\n on Judicial Independence",
#                         xlab = "c) Power-Sharing \n(1 = Yes, 0 = No)",
#                         conf = .90)
# dev.off()

# Output for Replication Archive
par(mfrow=c(1,3),
    mar = c(5, 7, 4, 0.5),
    cex.lab = 1.3,
    cex.axis = 1.3,
    mgp = c(3.5, 1, 0))

interaction_plot_continuous(model_aidps_judind_LJI_cabcount, 
                            "cabinetCOUNT", 
                            "aiddata_AidGDP_ln", 
                            "cabinetCOUNT * aiddata_AidGDP_ln", 
                            title = "", 
                            ylab = "Marginal effect of Power-Sharing (cabinet) \n on Judicial Independence", 
                            add_median_effect = T,
                            xlab = "a) Aid / GDP (Log)\n", 
                            conf = .90)
interaction_plot_continuous(model_aidps_judind_LJI_cabcount, 
                            "aiddata_AidGDP_ln", 
                            "cabinetCOUNT", 
                            "cabinetCOUNT * aiddata_AidGDP_ln", 
                            title = "", 
                            add_median_effect = T,
                            ylab = "Marginal effect of Aid\n on Judicial Independence",
                            xlab = "b) Power-Sharing \n(Number of rebel seats)",
                            conf = .90)
interaction_plot_binary(model_aidps_judind_LJI_cabinc,
                        "aiddata_AidGDP_ln",
                        "cabinetINC", 
                        "cabinetINC * aiddata_AidGDP_ln", 
                        title = "", 
                        ylab = "Marginal effect of Aid\n on Judicial Independence",
                        xlab = "c) Power-Sharing \n(1 = Yes, 0 = No)",
                        conf = .90)

Figure 7.5: Model Predictions for the Effect of Foreign Aid and Power-Sharing on Post-Conflict Judicial Independence

# Libraries
library(tidyverse)
library(rms)
library(tikzDevice)
library(gridExtra)



# Load data
load("./data/diss_df.rda")

# Estimate Model
diss_df$conflictID <- NULL # conflictID throws an error b/c of missing data
d <- datadist(diss_df); options(datadist='d')

model_aidps_judind_LJI_cabcount <- ols(LJI_t2 ~
                                           cabinetCOUNT *
                                           aiddata_AidGDP_ln +
                                           ln_gdp_pc +
                                           ln_pop +
                                           conf_intens +
                                           nonstate + 
                                           WBnatres + 
                                           fh
                                         ,
                                         data = diss_df, 
                                         x = T, y = T)
model_aidps_judind_LJI_cabcount <- robcov(model_aidps_judind_LJI_cabcount, diss_df$GWNo)

# generate predictions at different power-sharing levels
predictions <- Predict(model_aidps_judind_LJI_cabcount, 
                       aiddata_AidGDP_ln = c(0, 3.4), # 0 = 1% Aid / GDP , 3.4 = 30%
                       cabinetCOUNT = seq(0, 10, 1), 
                       conf.int = 0.9) # 90 % confidence intervals

# generate plot 
meplot_aidps_judind_interaction <- ggplot(data.frame(predictions), 
                           aes(x = cabinetCOUNT, 
                               y = yhat, 
                               group = as.factor(exp(aiddata_AidGDP_ln)))) + 
  geom_line( color = "black", size = 1) + 
  geom_ribbon(aes(ymax = upper, 
                  ymin = lower, 
                  fill = as.factor(round(exp(aiddata_AidGDP_ln), 0))), 
              alpha = 0.7) +
  scale_fill_manual(values = c("#b3cde3", "#e41a1c"), 
                    name = "Aid in per cent of GDP:") +
  scale_x_continuous(breaks = seq(0, 10, 2)) +
  theme_bw() +
  theme(text = element_text(size=8)) +
  labs(x = "Power-Sharing (No. of rebel seats in government)", 
       y = "LS Judicial Independence") +
  theme(legend.position = "bottom") 
  

# At different aid levels
predictions_aid <- Predict(model_aidps_judind_LJI_cabcount, 
                       aiddata_AidGDP_ln, # 0 = 1% Aid / GDP , 3.4 = 30%
                       cabinetCOUNT = seq(0, 10, length.out = 2), 
                       conf.int = 0.9) # 90 % confidence intervals

# generate plot
meplot_aidps_judind_interaction_aid <- ggplot(data.frame(predictions_aid), 
                                              aes(x = exp(aiddata_AidGDP_ln), 
                                                  y = yhat, 
                                                  group = as.factor(cabinetCOUNT))) + 
  geom_line( color = "black", size = 1) + 
  geom_ribbon(aes(ymax = upper, 
                  ymin = lower, 
                  fill = as.factor(cabinetCOUNT)), 
              alpha = 0.7) +
  scale_fill_manual(values = c("#b3cde3", "#e41a1c"), 
                    name = "Number of rebels \nin the power-sharing coalition:") +
  theme_bw() +
  theme(text = element_text(size=8)) +
  labs(x = "Aid / GDP", 
       y = "LS Judicial Independence") +
  theme(legend.position = "bottom") 

# Output manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_judind_ME.tex", height = 4.5, width = 6.5)
# 
# grid.arrange(meplot_aidps_judind_interaction, 
#              meplot_aidps_judind_interaction_aid,
#              nrow = 1)
# dev.off()

# Output Replication Archive
grid.arrange(meplot_aidps_judind_interaction, 
             meplot_aidps_judind_interaction_aid,
             nrow = 1)

Figure 7.6: Probing Mechanisms I: Variation in Types of Power-Sharing and Aid

# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)


# Data
load("./data/diss_df.rda")

diss_df <- diss_df %>% 
  dplyr::select(-matches("logit")) %>% 
  mutate(dga_gdp_ln = log(dga_gdp_zero +1 ), 
         pga_gdp_ln = log(program_aid_gdp_zero + 1), 
         bga_gdp_ln = log(commodity_aid_gdp_zero + 1))

# Prepare data frame for multiple plots
judind_vars <- list(
  cabinetCOUNT = diss_df,
  seniorCOUNT = diss_df, 
  nonseniorCOUNT = diss_df, 
  dga_gdp_ln = diss_df, 
  pga_gdp_ln = diss_df, 
  bga_gdp_ln = diss_df
)

# create data frame with list column
judind_vars <- enframe(judind_vars)


# define function that will be applied to every data frame in the list column
main_model <- function(ind_var, data) {
  data <- as.data.frame(data)
  data$ind_var <- data[, ind_var]

  if(grepl("COUNT", ind_var)) {
    model <- lfe::felm(LJI_t2 ~
                       ind_var *
                       aiddata_AidGDP_ln +
                       log(GDP_per_capita) +
                       ln_pop +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       fh | 0 | 0 | GWNo,
                     data=data)
    return(model)

  } else {
    model <- lfe::felm(LJI_t2 ~
                       cabinetCOUNT *
                       ind_var +
                       log(GDP_per_capita) +
                       ln_pop +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       fh | 0 | 0 | GWNo,
                     data=data)
  return(model)
  }
  

}


# fit models & post-process data for plotting
model_all <- judind_vars %>% 
  dplyr::mutate(model = map2(name, value, ~ main_model(.x, .y))) 

model_out <- model_all %>% 
  mutate(coef = map(model, broom::tidy)) %>% 
  unnest(coef) %>% 
  # keep only interaction term coefs
  filter(grepl(":", term)) %>% 
  dplyr::select(name, estimate, std.error) %>% 
  mutate(name = forcats::fct_relevel(name, 
                                     c("cabinetCOUNT", 
                                       "seniorCOUNT", 
                                       "nonseniorCOUNT", 
                                       "dga_gdp_ln", 
                                       "pga_gdp_ln", 
                                       "bga_gdp_ln")))
model_out_rol <- model_out
save(model_out_rol, file= "./data/mechanism_models_rol.rda")


mechanisms_judind_plot <- ggplot(model_out, 
       aes(x = name, 
           y = estimate)) +
  geom_point( size = 1.7, 
       position = position_dodge(width = .5)) + 
  geom_errorbar(aes(ymin = estimate - 1.67 * std.error, 
                    ymax = estimate + 1.67 * std.error), 
                width = 0,
       position = position_dodge(width = .5)) +
 
  geom_hline(yintercept = 0, linetype = 2) +
  theme_bw()+ 
  scale_x_discrete(labels = c("Cabinet PS (Baseline)", 
                                      "Senior PS", 
                                      "Nonsenior PS", 
                                      "DGA", 
                                      "Program Aid", 
                                      "Budget Aid")) +
  labs(x = "", y = "Estimate of Interaction Coefficient \n between Different Types of \n Power-Sharing (cabinet) and Aid") 



# Output for manuscript
# options(tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/mechanisms_judind_plot.tex", height = 2.75)
# print(mechanisms_judind_plot)
# dev.off()

# Output for replication archive
print(mechanisms_judind_plot)

Figure 7.7: Probing Mechanisms II: Strategies Against the Judiciary

# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)

# Data
load("./data/diss_df.rda")

diss_df <- diss_df %>% 
  dplyr::select(-matches("logit")) 

# Prepare data frame for multiple plots
judind_vars <- list(
  v2x_jucon_t2 = diss_df, # judicial constraints on the executive
  v2jureform_t2 = diss_df, # reforms 
  v2juaccnt_t2 = diss_df,
  v2jupurge_t2 = diss_df,
  v2jupack_t2 = diss_df 
  
  
)

# create data frame with list column
judind_vars <- enframe(judind_vars)

# define function that will be applied to every data frame in the list column
main_model <- function(lead_type, data) {
  data <- as.data.frame(data)
  data$lead_var <- data[, grep(lead_type, names(data), value =T)]
  model <- lfe::felm(lead_var ~
                       cabinetCOUNT *
                       aiddata_AidGDP_ln +
                       log(GDP_per_capita) +
                       ln_pop +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       fh | 0 | 0 | GWNo,
                     data=data)
  return(model)
  
}


# fit models & post-process data for plotting
model_all <- judind_vars %>% 
  dplyr::mutate(model = map2(name, value, ~ main_model(.x, .y))) 

model_out <- model_all %>% 
  mutate(coef = map(model, broom::tidy)) %>% 
  unnest(coef) %>% 
  # keep only interaction term coefs
  filter(grepl(":", term)) %>% 
  mutate(name = forcats::fct_reorder(name, estimate, sort))

mechanisms_plot2 <- ggplot(model_out, 
                             aes(x = name, 
                                 y = estimate)) +
  geom_point( size = 1.7, 
              position = position_dodge(width = .5)) + 
 
  geom_errorbar(aes(ymin = estimate - 1.67 * std.error, 
                    ymax = estimate + 1.67 * std.error), 
                width = 0,
                position = position_dodge(width = .5)) +
  geom_hline(yintercept = 0, linetype = 2) +
  scale_color_brewer("",palette = "Set2") +
  theme_bw()+ 
  scale_x_discrete(labels = c("Reforms", 
                              "Purges", 
                              "Accountability", 
                              "Judicial Independence \n(Reference)", 
                              "Court Packing")) +
  labs(x = "", y = "Estimate of Interaction Coefficient \n between Power-Sharing (cabinet)\n and Aid/GDP (log)") +
  theme(legend.position = "bottom")


# options(tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/mechanisms2_judind_plot.tex", height = 2.75)
# print(mechanisms_plot2)
# dev.off()

print(mechanisms_plot2)

Table 7.1: Individual Effects of Power-Sharing and Foreign Aid on Post-Conflict Rule of Law

# Libraries
library(texreg)
# source("functions/extract_ols_custom.R")
library(rms)

# load Data
load("./data/diss_df.rda")
# 
# diss_df$conflictID <- NULL
# datadist_diss_df <- datadist(diss_df); options(datadist='datadist_diss_df')

# Models 
model_ps_lji_cabcount <- ols(LJI_t2 ~
                                cabinetCOUNT +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_ps_lji_cabcount <- robcov(model_ps_lji_cabcount, diss_df$GWNo)

model_ps_lji_seniorcount <- ols(LJI_t2 ~
                                seniorCOUNT +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_ps_lji_seniorcount <- robcov(model_ps_lji_seniorcount, diss_df$GWNo)

model_ps_lji_nonseniorcount <- ols(LJI_t2 ~
                                nonseniorCOUNT +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_ps_lji_nonseniorcount <- robcov(model_ps_lji_nonseniorcount, diss_df$GWNo)

# Aid
model_dga_lji_cabcount <- ols(LJI_t2 ~
                                cabinetCOUNT +
                                log(dga_gdp_zero  + 1) +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_dga_lji_cabcount <- robcov(model_dga_lji_cabcount, diss_df$GWNo)


model_pga_lji_cabcount <- ols(LJI_t2 ~
                                cabinetCOUNT +
                                log(program_aid_gdp_zero  + 1) +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_pga_lji_cabcount <- robcov(model_pga_lji_cabcount, diss_df$GWNo)

model_bga_lji_cabcount <- ols(LJI_t2 ~
                                cabinetCOUNT +
                                log(commodity_aid_gdp_zero  + 1) +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_bga_lji_cabcount <- robcov(model_bga_lji_cabcount, diss_df$GWNo)

# Output

model_list <- list(model_ps_lji_cabcount, 
                   model_ps_lji_seniorcount, 
                   model_ps_lji_nonseniorcount, 
                   model_dga_lji_cabcount, 
                   model_pga_lji_cabcount, 
                   model_bga_lji_cabcount)

coef_name_map <- list(cabinetCOUNT = "Power-Sharing (cabinet)",
                      seniorCOUNT = "Power-Sharing (senior)",
                      nonseniorCOUNT = "Power-Sharing (nonsenior)",
                            "cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid", 
                            "cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
                            ps_share = "PS (cabinet share)",
                            "ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
                       dga_gdp_zero = "DGA/GDP (log)", 
                      program_aid_gdp_zero = "Program Aid/GDP (log)", 
                      commodity_aid_gdp_zero = "Budget Aid/GDP (log)", 
                            aiddata_AidGDP_ln = "Aid / GDP (log)",
                     
                            ln_gdp_pc = "GDP p/c",
                            ln_pop = "Population",
                            conf_intens = "Conflict Intensity",
                            nonstate = "Non-State Violence",
                      WBnatres = "Nat. Res. Rents",
                      fh = "Regime Type (FH)",
                      
                            polity2 = "Polity",
                            Ethnic = "Ethnic Frac.",
                            DS_ordinal = "UN PKO")

# custom functions to write tex output
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
# 
# custom_texreg(model_list,
#               file = "../output/aid_ps_indeff_judind.tex",
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               custom.coef.map  = coef_name_map,
#               symbol = "+",
#               table = F,
#               booktabs = T,
#               use.packages = F,
#               dcolumn = T,
#               include.rsquared = F,
#               include.cluster = T,
#               star.symbol = "\\*",
#               caption = "",
#               include.lr = F)
              # custom.multicol = T,
              # custom.model.names = c(" \\multicolumn{3}{c}{ \\textbf{Power-Sharing}} & \\multicolumn{3}{c}{ \\textbf{Foreign Aid}} \\\\ \\cmidrule(r){2-4} \\cmidrule(l){5-7} & \\multicolumn{1}{c}{(1)  }",
              #                        "\\multicolumn{1}{c}{(2)  }",
              #                        "\\multicolumn{1}{c}{(3)  }",
              #                        "\\multicolumn{1}{c}{(4)  }",
              #                        "\\multicolumn{1}{c}{(5)   }",
              #                        "\\multicolumn{1}{c}{(6)   }"))


htmlreg(model_list, 
        stars = c(0.001, 0.01, 0.05, 0.1), 
        custom.coef.map  = coef_name_map,
        symbol = "+",
        table = F,
        booktabs = T,
        use.packages = F,
        include.cluster = T, 
        dcolumn = T,
        star.symbol = "\\*", 
        caption = "",
        include.lr = F)
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (cabinet) 0.00 0.00 0.01 0.00
(0.00) (0.00) (0.00) (0.00)
Power-Sharing (senior) 0.02
(0.01)
Power-Sharing (nonsenior) 0.01
(0.01)
DGA/GDP (log) 0.00
(0.03)
Program Aid/GDP (log) -0.02
(0.03)
Budget Aid/GDP (log) -0.01
(0.01)
Aid / GDP (log) -0.02* -0.02* -0.02* -0.02* -0.01 -0.02+
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
GDP p/c -0.01 -0.01 -0.01 -0.01 -0.02 -0.01
(0.02) (0.02) (0.02) (0.02) (0.02) (0.02)
Population -0.02+ -0.02+ -0.02+ -0.02+ -0.02* -0.02+
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Conflict Intensity 0.01 0.01 0.01 0.01 0.01 0.01
(0.04) (0.04) (0.04) (0.04) (0.04) (0.04)
Non-State Violence 0.01 0.01 0.01 0.01 0.01 0.01
(0.04) (0.04) (0.04) (0.04) (0.04) (0.04)
Nat. Res. Rents -0.00** -0.00** -0.00* -0.00** -0.00** -0.00*
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Regime Type (FH) 0.10*** 0.10*** 0.10*** 0.10*** 0.10*** 0.10***
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Num. obs. 272 272 272 272 272 272
R2 0.59 0.59 0.59 0.59 0.59 0.59
Adj. R2 0.58 0.58 0.58 0.58 0.58 0.58
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 7.2: The Interactive Effect of Power-Sharing and Foreign Aid on Post-Conflict Rule of Law

# Libraries
library(texreg)
# source("functions/extract_ols_custom.R")
library(rms)


# load Data
load("./data/diss_df.rda")

# LJI
model_aidps_judind_LJI_cabinc<- ols(LJI_t2 ~
                                           cabinetINC *
                                           aiddata_AidGDP_ln +
                                           ln_gdp_pc +
                                           ln_pop +
                                           conf_intens +
                                           nonstate + 
                                           WBnatres + 
                                           fh
                                         ,
                                         data = diss_df, 
                                         x = T, y = T)
model_aidps_judind_LJI_cabinc <- robcov(model_aidps_judind_LJI_cabinc, diss_df$GWNo)

model_aidps_judind_LJI_cabcount <- ols(LJI_t2 ~
                                           cabinetCOUNT *
                                           aiddata_AidGDP_ln +
                                           ln_gdp_pc +
                                           ln_pop +
                                           conf_intens +
                                           nonstate + 
                                           WBnatres + 
                                           fh 
                                         ,
                                         data = diss_df, 
                                         x = T, y = T)
model_aidps_judind_LJI_cabcount <- robcov(model_aidps_judind_LJI_cabcount, diss_df$GWNo)

# V-Dem
model_aidps_judind_vdem_cabinc <- ols(v2x_jucon_t2 ~
                                      cabinetINC *
                                      aiddata_AidGDP_ln +
                                      ln_gdp_pc +
                                      ln_pop +
                                      conf_intens +
                                      nonstate + 
                                      WBnatres + 
                                      fh
                                    ,
                                    data = diss_df, 
                                    x = T, y = T)
model_aidps_judind_vdem_cabinc <- robcov(model_aidps_judind_vdem_cabinc, diss_df$GWNo)



model_aidps_judind_vdem_cabcount <- ols(v2x_jucon_t2 ~
                                      cabinetCOUNT *
                                      aiddata_AidGDP_ln +
                                      ln_gdp_pc +
                                      ln_pop +
                                      conf_intens +
                                      nonstate + 
                                      WBnatres + 
                                      fh
                                    ,
                                    data = diss_df, 
                                    x = T, y = T)
model_aidps_judind_vdem_cabcount <- robcov(model_aidps_judind_vdem_cabcount, diss_df$GWNo)

# model list:
model_list <- list(model_aidps_judind_LJI_cabinc, 
                   model_aidps_judind_LJI_cabcount, 
                   model_aidps_judind_vdem_cabinc,
                   model_aidps_judind_vdem_cabcount)

coef_name_map <- list(
                      cabinetINC = "Power-Sharing (binary)",
                      "cabinetINC * aiddata_AidGDP_ln" = "Power-Sharing (binary) * Aid",
                      cabinetCOUNT = "Power-Sharing (cabinet)",
                      "cabinetCOUNT * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid", 
                      "cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
                      ps_share = "PS (cabinet share)",
                      "ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
                      dga_gdp_zero = "DGA/GDP (log)", 
                      program_aid_gdp_zero = "Program Aid/GDP (log)", 
                      commodity_aid_gdp_zero = "Budget Aid/GDP (log)", 
                      aiddata_AidGDP_ln = "Aid / GDP (log)",
                      
                      ln_gdp_pc = "GDP p/c (log)",
                      ln_pop = "Population (log)",
                      conf_intens = "Conflict Intensity",
                      nonstate = "Non-State Violence",
                      WBnatres = "Nat. Res. Rents",
                      polity2 = "Polity",
                      fh = "Regime Type (FH)",
                      Ethnic = "Ethnic Frac.",
                      DS_ordinal = "UN PKO")

# custom functions to write tex output
# source("functions/extract_ols_custom.R")
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
# 
# custom_texreg(model_list, 
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               custom.coef.map = coef_name_map,
#               symbol = "+",
#               file = "../output/aidps_judind_main.tex", 
#               table = F,
#               booktabs = T,
#               use.packages = F,
#               dcolumn = T,
#               custom.multicol = T,
#               custom.model.names = c(" \\multicolumn{2}{c}{ \\textbf{LJI}} & \\multicolumn{2}{c}{ \\textbf{V-Dem}} \\\\ \\cmidrule(r){2-3} \\cmidrule(l){4-5} & \\multicolumn{1}{c}{(1)  }",
#                                      "\\multicolumn{1}{c}{(2)  }",
#                                      "\\multicolumn{1}{c}{(3)  }",
#                                      "\\multicolumn{1}{c}{(4)  }"),
#               include.cluster = T, 
#               include.rsquared = F, 
#               star.symbol = "\\*", 
#               include.lr = F)
# 
# texreg::htmlreg(model_list, 
#                 stars = c(0.001, 0.01, 0.05, 0.1),
#                 custom.coef.map = coef_name_map,
#                 symbol = "+",
#         table = F,
#         booktabs = T,
#         use.packages = F,
#         dcolumn = T,
#         include.cluster = T, 
#         include.rsquared = F, 
#         star.symbol = "\\*", 
#         include.lr = F, 
#         caption = "")

Table 7.3: Power-Sharing, Foreign Aid and Post-Conflict Rule of Law: Robustness Checks

# Libraries
library(texreg)
source("functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")

library(tidyverse)
library(rms)
library(plm)
library(countrycode)


# load Data
load("./data/diss_df.rda")


# Ethnic
model_interaction_judind_LJI_Ethnic<- ols(LJI_t2 ~
                                                 cabinetCOUNT *
                                                 aiddata_AidGDP_ln +
                                                 ln_gdp_pc +
                                                 ln_pop +
                                                 conf_intens +
                                                 nonstate + 
                                                 WBnatres + 
                                                 fh +
                                            Ethnic
                                               ,
                                               data = diss_df, 
                                               x = T, y = T)
model_interaction_judind_LJI_Ethnic <- robcov(model_interaction_judind_LJI_Ethnic, diss_df$GWNo)

# PKO
model_interaction_judind_LJI_PKO <- ols(LJI_t2 ~
                                            cabinetCOUNT *
                                            aiddata_AidGDP_ln +
                                            ln_gdp_pc +
                                            ln_pop +
                                            conf_intens +
                                            nonstate + 
                                            WBnatres + 
                                            fh +
                                            DS_ordinal
                                          ,
                                          data = diss_df, 
                                          x = T, y = T)
model_interaction_judind_LJI_PKO <- robcov(model_interaction_judind_LJI_PKO, diss_df$GWNo)

# Cabinet Share

library(readxl)
cnts <- read_excel("./data/CNTSDATA.xls")

cnts <- cnts %>% filter(year >= 1989)

cnts$iso3c <- countrycode(cnts$country, "country.name", "iso3c")
cnts <- cnts %>% filter(country != "SOMALILAND")

testcabsize <- left_join(diss_df, cnts[, c("iso3c", "year", "polit10")])

testcabsize$ps_share <- testcabsize$cabinetCOUNT / testcabsize$polit10 * 100

model_cabsize_judind <- ols(LJI_t2 ~
                       ps_share *
                       aiddata_AidGDP_ln +
                       ln_gdp_pc +
                       ln_pop +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       fh,
                     data = testcabsize, x = T, y = T)
model_cabsize_judind <- robcov(model_cabsize_judind, testcabsize$GWNo)

# Regional Mean
model_interaction_judind_LJI_regmean <- ols(LJI_t2 ~
                                          cabinetCOUNT *
                                          aiddata_AidGDP_ln +
                                          ln_gdp_pc +
                                          ln_pop +
                                          conf_intens +
                                          nonstate + 
                                          WBnatres + 
                                          fh +
                                          LJI_regional_mean
                                        ,
                                        data = diss_df, 
                                        x = T, y = T)
model_interaction_judind_LJI_regmean  <- robcov(model_interaction_judind_LJI_regmean , diss_df$GWNo)


# Commonlaw
model_interaction_judind_LJI_commonlaw <- ols(LJI_t2 ~
                                              cabinetCOUNT *
                                              aiddata_AidGDP_ln +
                                              ln_gdp_pc +
                                              ln_pop +
                                              conf_intens +
                                              nonstate + 
                                              WBnatres + 
                                              fh +
                                              commonlaw
                                            ,
                                            data = diss_df, 
                                            x = T, y = T)
model_interaction_judind_LJI_commonlaw <- robcov(model_interaction_judind_LJI_commonlaw, diss_df$GWNo)



# Constitutional Duration
model_interaction_judind_LJI_constdur<- ols(LJI_t2 ~
                                                cabinetCOUNT *
                                                aiddata_AidGDP_ln +
                                                ln_gdp_pc +
                                                ln_pop +
                                                conf_intens +
                                                nonstate + 
                                                WBnatres + 
                                                fh +
                                                duration_constitution
                                              ,
                                              data = diss_df, 
                                              x = T, y = T)
model_interaction_judind_LJI_constdur <- robcov(model_interaction_judind_LJI_constdur, diss_df$GWNo)

# 
# 
# # All controls
# model_interaction_judind_LJI_allcontrols <- ols(LJI_t2 ~
#                                               cabinetCOUNT *
#                                               aiddata_AidGDP_ln +
#                                               ln_gdp_pc +
#                                               ln_pop +
#                                               conf_intens +
#                                               nonstate + 
#                                               WBnatres + 
#                                               fh +
#                                               Ethnic + 
#                                               DS_ordinal + 
#                                               LJI_regional_mean + 
#                                               commonlaw + 
#                                               duration_constitution
#                                             ,
#                                             data = diss_df, 
#                                             x = T, y = T)
# model_interaction_judind_LJI_allcontrols <- robcov(model_interaction_judind_LJI_allcontrols, diss_df$GWNo)


# Random Effects
model_interaction_judind_LJI_RE <- plm(LJI_t2 ~
                                         cabinetCOUNT *
                                         aiddata_AidGDP_ln +
                                         ln_gdp_pc +
                                         ln_pop +
                                         conf_intens +
                                         nonstate + 
                                         WBnatres + 
                                         fh 
                                       ,
                                       model = "random",
                                       index = c("country", "year"),
                                       data = diss_df, 
                                       x = T, y = T)

series conflictID is NA and has been removed series conflictdummy, xnewconflictinyearv412, xonset1v412, xonset2v412, xonset5v412, xonset8v412, xonset20v412, xmaxintyearv412, xgovonlyv412, xterronlyv412, xbothgovterrv412, xsumconfv412, xpcyears, xis.pc, xcodingend are constants and have been removed

model_interaction_judind_LJI_RE$vcov <- plm::vcovHC(model_interaction_judind_LJI_RE)


# Region Fixed Effects
model_interaction_judind_LJI_FE <- ols(LJI_t2 ~
                                         cabinetCOUNT *
                                         aiddata_AidGDP_ln +
                                         ln_gdp_pc +
                                         ln_pop +
                                         conf_intens +
                                         nonstate + 
                                         WBnatres + 
                                         fh +
                                         region,                  
                                       # model = "within",
                                       # index = c("region", "country_year"),
                                       data = diss_df, 
                                       x = T, y = T)

model_interaction_judind_LJI_FE <- robcov(model_interaction_judind_LJI_FE,diss_df$country)

# Country FEs
model_interaction_judind_LJI_FE_cntry <- plm(LJI_t2 ~
                                         cabinetCOUNT *
                                         aiddata_AidGDP_ln +
                                         ln_gdp_pc +
                                         ln_pop +
                                         conf_intens +
                                         nonstate + 
                                         WBnatres + 
                                         fh 
                                        
                                       ,
                                       model = "within",
                                       index = c("country", "year"),
                                       data = diss_df, 
                                       x = T, y = T)

series conflictID is NA and has been removed series conflictdummy, xnewconflictinyearv412, xonset1v412, xonset2v412, xonset5v412, xonset8v412, xonset20v412, xmaxintyearv412, xgovonlyv412, xterronlyv412, xbothgovterrv412, xsumconfv412, xpcyears, xis.pc, xcodingend are constants and have been removed

model_interaction_judind_LJI_FE_cntry$vcov <- plm::vcovHC(model_interaction_judind_LJI_FE_cntry, cluster = "group")

# Output

# Model list
model_list <- list(model_interaction_judind_LJI_Ethnic, 
                   model_interaction_judind_LJI_PKO, 
                   model_cabsize_judind, 
                   model_interaction_judind_LJI_regmean, 
                   model_interaction_judind_LJI_commonlaw, 
                   model_interaction_judind_LJI_constdur,
                   model_interaction_judind_LJI_RE, 
                   model_interaction_judind_LJI_FE, 
                   model_interaction_judind_LJI_FE_cntry)


## Order of coefficients in output table
name_map_robustness <- list(cabinetCOUNT = "PS (cabinet)",
                            "cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid", 
                            "cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
                            ps_share = "PS (cabinet share)",
                            "ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
                            aiddata_AidGDP_ln = "Aid / GDP (log)",
                            ln_gdp_pc = "GDP p/c",
                            ln_pop = "Population",
                            conf_intens = "Conflict Intensity",
                            nonstate = "Non-State Violence",
                            WBnatres = "Nat. Res. Rents",
                            polity2 = "Polity",
                            fh = "Regime Type (FH)",
                            Ethnic = "Ethnic Frac.",
                            DS_ordinal = "UN PKO",
                            LJI_regional_mean = "LJI Regional Mean", 
                            commonlaw = "Common Law", 
                            duration_constitution = "Const. Duration")


source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')



# # Output Manuscript
# custom_texreg(l = model_list,
#         stars = c(0.001, 0.01, 0.05, 0.1),
#         symbol = "+",
#         table = F,
#         booktabs = T,
#         use.packages = F,
#         dcolumn = T,
#         custom.coef.map = name_map_robustness,
#         file = "../output/aidps_judind_robustness.tex",
#         custom.model.names = c("(1) ELF",
#                                "(2) PKO",
#                                "(3) Cab. Size",
#                                "(4) Regional Mean", 
#                                "(5) Common Law", 
#                                "(6) Const. Duration", 
#                                "(7) RE",
#                                "(8) Region FE",
#                                "(9) Country FE"),
#        
#         star.symbol = "\\*",
#         include.lr = F, 
#         include.cluster = T, 
#         include.rsquared = F, 
#         include.variance = F)

# Output Replication Archive
htmlreg(model_list, 
          stars = c(0.001, 0.01, 0.05, 0.1),
        symbol = "+",
        table = F,
        booktabs = T,
        use.packages = F,
        dcolumn = T,
        custom.coef.map = name_map_robustness,
        custom.model.names = c("(1) ELF",
                               "(2) PKO",
                               "(3) Cab. Size",
                               "(4) Regional Mean", 
                               "(5) Common Law", 
                               "(6) Const. Duration", 
                               "(7) RE",
                               "(8) Region FE",
                               "(9) Country FE"),
       
        star.symbol = "\\*",
        include.lr = F, 
        include.cluster = T, 
        include.rsquared = F, 
        include.variance = F)
Statistical models
(1) ELF (2) PKO (3) Cab. Size (4) Regional Mean (5) Common Law (6) Const. Duration (7) RE (8) Region FE (9) Country FE
PS (cabinet) 0.03*** 0.02** 0.02* 0.02* 0.02** -0.00 0.02+ -0.00
(0.01) (0.01) (0.01) (0.01) (0.01) (0.00) (0.01) (0.00)
PS (cabinet) * Aid -0.01*** -0.01** -0.01* -0.01+ -0.01** 0.00 -0.01 -0.00
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
PS (cabinet share) 0.00
(0.00)
PS (cabinet share) * Aid -0.00
(0.00)
Aid / GDP (log) -0.02* -0.02* -0.02* -0.01 -0.01* -0.02* -0.00 -0.01 -0.00
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.00) (0.01) (0.00)
GDP p/c -0.02 -0.02 0.00 -0.00 0.01 -0.03 0.03*** 0.03+ 0.02**
(0.02) (0.02) (0.02) (0.02) (0.02) (0.02) (0.01) (0.02) (0.01)
Population -0.02+ -0.02+ -0.03* -0.02+ -0.02+ -0.03* 0.00 -0.03** 0.17*
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.02) (0.01) (0.07)
Conflict Intensity 0.02 0.02 0.02 0.03 0.01 0.02 0.01 0.06+ -0.00
(0.04) (0.04) (0.03) (0.03) (0.04) (0.03) (0.02) (0.03) (0.03)
Non-State Violence 0.03 0.01 0.01 0.01 -0.05 0.00 -0.04* 0.02 -0.04*
(0.03) (0.04) (0.04) (0.04) (0.05) (0.03) (0.02) (0.03) (0.02)
Nat. Res. Rents -0.00+ -0.00* -0.00** -0.00 -0.00** -0.00** -0.00*** -0.00* -0.00**
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Regime Type (FH) 0.10*** 0.10*** 0.09*** 0.07*** 0.09*** 0.10*** 0.04*** 0.07*** 0.03***
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Ethnic Frac. -0.12+
(0.07)
UN PKO -0.00
(0.01)
LJI Regional Mean 0.64***
(0.13)
Common Law 0.15**
(0.06)
Const. Duration 0.00+
(0.00)
Num. obs. 272 272 214 272 272 271 272 272 272
Countries 46 46 42 46 46 46 46 46 46
Adj. R2 0.60 0.58 0.63 0.71 0.64 0.60 0.52 0.75 0.46
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 7.4: Power-Sharing, Foreign Aid and Post-Conflict Rule of Law: Matching and 2SLS Results

# Libraries
library(texreg)
source("functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")

library(tidyverse)
library(rms)
library(plm)
library(countrycode)


load("./data/diss_df.rda")

##### Matching #####
library(MatchIt)
library(tidyr)

set.seed(159753)
# prepare data without missings
match_ji_data <- diss_df %>% 
  ungroup() %>% 
  dplyr::select(cabinetINC, cabinetCOUNT, seniorINC,
                seniorCOUNT, nonseniorINC, nonseniorCOUNT,
                aiddata_AidGDP, population, nonstate,
                WBnatres, fh, GDP_per_capita, conf_intens,
                aiddata_AidGDP_ln, LJI_t2, v2x_jucon_t2, GWNo, year, 
                pc_period, Location, ln_pop, ln_gdp_pc,
                LJI_regional_mean, commonlaw, duration_constitution, Ethnic, polity_chng)
match_ji_data <- match_ji_data[complete.cases(match_ji_data), ]

# generate pretreatment controls

match_ji_data <- match_ji_data %>% 
  arrange(GWNo, pc_period, year) %>% 
  group_by(GWNo, pc_period) %>% 
  mutate(match_aiddata_AidGDP_ln = first(aiddata_AidGDP_ln),
         match_pop = first(population),
         match_gdp = first(GDP_per_capita),
         match_nonstate = first(nonstate),
         match_WBnatres = first(WBnatres),
         match_fh = first(fh), 
         match_duration_constitution = first(duration_constitution),
         match_LJI_regional_mean = first(LJI_regional_mean))
    


match_ji_data <- as.data.frame(match_ji_data)

match_ji_res <- matchit(cabinetINC ~
                          match_aiddata_AidGDP_ln +
                          log(match_gdp) +
                          log(match_pop) +
                          conf_intens + # conf_intens is already pre-treatment
                          match_nonstate +
                          log(match_WBnatres + 1)  +
                          match_fh ,
                        method = "nearest",
                        ratio = 2, 
                        distance = "mahalanobis",
                        data = match_ji_data)

# extract data
match_ji_res_df <- match.data(match_ji_res)


# Models

#### Matching: PS * Aid => Judicial Independence

# LJI
model_psaid_matched_LJI <- ols(LJI_t2 ~ 
                                cabinetINC *
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data=match_ji_res_df , x=T, y=T)
model_psaid_matched_LJI <- rms::robcov(model_psaid_matched_LJI, match.data(match_ji_res)$GWNo)

# V-Dem
model_psaid_matched_vdem <- ols(v2x_jucon_t2 ~ 
                                 cabinetINC *
                                 aiddata_AidGDP_ln +
                                 ln_gdp_pc +
                                 ln_pop +
                                 conf_intens +
                                 nonstate + 
                                 WBnatres + 
                                 fh
                               ,
                               data=match_ji_res_df , x=T, y=T)
model_psaid_matched_vdem <- rms::robcov(model_psaid_matched_vdem, match.data(match_ji_res)$GWNo)

#### Instrumental Variable Regressions ###


# ivreg with Jud Ind

library(AER)
library(ivpack)
library(lmtest)

# load instrument
load(file = "./data/instrumentedAid2.RData")
load("./data/diss_df.rda")

diss_df <- merge(diss_df, instrument_df, by = c("year", "iso2c"), all.x = TRUE)
diss_df$total_sum_except <- as.numeric(diss_df$total_sum_except)


# subset only complete.cases / necessary for cluster.robust.se()
iv_na <- na.omit(diss_df[, c(
                               "cabinetCOUNT", 
                               "cabinetINC", 
                               "aiddata_Aid",
                               "aiddata_AidGDP_ln",
                               "aiddata_AidPC_ln",
                               "fh",
                               "GDP_per_capita", 
                               "population", 
                               "conf_intens", 
                               "WBnatres", 
                               "total_sum_except", 
                               "year", 
                               "GWNo", 
                               "GDP",
                               "nonstate", "LJI_t2", "v2x_jucon_t2")])



##### IV #####

iv_na$aid_instrumented_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)
diss_df$aid_instrumented_gdp_ln <- log(diss_df$total_sum_except / diss_df$GDP)

# to proceed with IV estimation I first hard-code the instrument
iv_na$instr_aid_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)

# data transformation for Stata
iv_na$ln_gdp_pc <- log(iv_na$GDP_per_capita)
iv_na$ln_pop <- log(iv_na$population)

# stuff for stata
# diss_df$region_num <- as.numeric(as.factor(diss_df$region))
# diss_df$country_year_num <- as.numeric(as.factor(diss_df$country_year))
foreign::write.dta(iv_na, "./data/diss_df_IV.dta")

# hard code interaction variable
iv_na$cabincXaid <- iv_na$aiddata_AidGDP_ln * iv_na$cabinetINC
iv_na$cabincXaid_instr <- iv_na$aid_instrumented_gdp_ln * iv_na$cabinetINC

library(lfe)


model_iv_judind_lji <- felm(LJI_t2 ~ 
                       cabinetINC +
                       ln_gdp_pc +
                       ln_pop +
                       nonstate +
                       conf_intens +
                       WBnatres +
                       fh 
                       | 0 | (aiddata_AidGDP_ln|cabincXaid ~ aid_instrumented_gdp_ln + cabincXaid_instr) | GWNo, 
                       data = iv_na)


model_iv_judind_vdem <- felm(v2x_jucon_t2 ~ 
                       cabinetINC +
                       ln_gdp_pc +
                       ln_pop +
                       nonstate +
                       conf_intens +
                       WBnatres +
                       fh 
                       | 0 | (aiddata_AidGDP_ln|cabincXaid ~ aid_instrumented_gdp_ln + cabincXaid_instr) | GWNo, 
                       data = iv_na)

# Output Models
## Order of coefficients in output table
name_map <- list(cabinetINC = "Power-Sharing (binary)",
                 "cabinetINC * aiddata_AidGDP_ln" = "Power-Sharing (binary) * Aid",
                 
                 "`cabincXaid(fit)`" = "Power-Sharing (binary) * Aid", 
                 "`aiddata_AidGDP_ln(fit)`" = "Aid / GDP (log)",
                 "aiddata_AidGDP_ln" = "Aid / GDP (log)",
                 
                 "ln_gdp_pc" = "GDP p/c",
                 "ln_pop" = "Population",
                 conf_intens = "Conflict Intensity",
                 nonstate = "Non-State Violence",
                 WBnatres = "Nat. Res. Rents",
                 polity2 = "Regime Type",
                 fh = "Regime Type")

model_list <- list(model_psaid_matched_LJI, model_psaid_matched_vdem, 
                   model_iv_judind_lji, model_iv_judind_vdem)


source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
source("functions/extract_felm_custom.R")
# 
# custom_texreg(model_list, 
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               custom.coef.map = name_map,
#               symbol = "+",
#               file = "../output/aidps_judind_matching2sls.tex", 
#               table = F,
#               booktabs = T,
#               use.packages = F,
#               add.lines = list(c("Countries", 
#                                  length(unique(match_ji_res_df$GWNo)), 
#                                  length(unique(match_ji_res_df$GWNo)), 
#                                  length(unique(diss_df$GWNo)), 
#                                  length(unique(diss_df$GWNo))), 
#                                c("Kleibergen-Paap rk Wald F statistic",
#                                  "", 
#                                  "", 
#                                  "40.32", 
#                                  "40.32")),
#               dcolumn = T,
#               custom.multicol = T,
#               custom.model.names = c(" \\multicolumn{2}{c}{ \\textbf{Matching}} & \\multicolumn{2}{c}{ \\textbf{2SLS}} \\\\ \\cmidrule(r){2-3} \\cmidrule(l){4-5} & \\multicolumn{1}{c}{(1) LJI  }",
#                                      "\\multicolumn{1}{c}{(2) V-Dem  }",
#                                      "\\multicolumn{1}{c}{(3) LJI }",
#                                      "\\multicolumn{1}{c}{(4) V-Dem }"),
#               include.cluster = F,
#               include.rsquared = F, 
#               star.symbol = "\\*", 
#               include.adjrs = T,
#               include.lr = F)

texreg::htmlreg(model_list, 
                stars = c(0.001, 0.01, 0.05, 0.1),
                custom.coef.map = name_map,
                symbol = "+",
        table = F,
        booktabs = T,
        use.packages = F,
        dcolumn = T,
        include.cluster = T, 
        include.rsquared = F, 
        star.symbol = "\\*", 
        include.lr = F, 
        caption = "")
Model 1 Model 2 Model 3 Model 4
Power-Sharing (binary) 0.11* 0.23* 0.11* 0.22*
(0.05) (0.10) (0.05) (0.10)
Power-Sharing (binary) * Aid -0.05** -0.07* -0.05** -0.06+
(0.02) (0.03) (0.02) (0.04)
Aid / GDP (log) -0.01 -0.01 -0.00 0.02
(0.01) (0.02) (0.01) (0.03)
GDP p/c 0.01 -0.05 -0.00 -0.01
(0.02) (0.04) (0.02) (0.04)
Population -0.01 0.01 -0.02 0.01
(0.01) (0.02) (0.01) (0.02)
Conflict Intensity 0.08* 0.01 0.01 -0.04
(0.03) (0.07) (0.04) (0.06)
Non-State Violence -0.05 -0.02 0.01 0.01
(0.03) (0.07) (0.04) (0.05)
Nat. Res. Rents -0.00* 0.00 -0.00* -0.00
(0.00) (0.00) (0.00) (0.00)
Regime Type 0.08*** 0.12*** 0.10*** 0.13***
(0.01) (0.02) (0.01) (0.02)
Num. obs. 108 108 270 270
Countries 25 25
Adj. R2 0.70 0.40 0.58 0.51
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Supplement: Stata code to generate F-Statistics for IV/2SLS models


use ".\data\diss_df_iv.dta", replace

* Generate interactions & interactions with instrument
gen cabXaid = cabinetINC * aiddata_AidGDP_ln
gen cabXaid_instr = cabinetINC * aid_instrumented_gdp_ln

* estimate 2SLS for judicial independence
ivreg2 LJI_t2 cabinetINC ln_gdp_pc ln_pop nonstate conf_intens WBnatres fh  ///
(aiddata_AidGDP_ln cabXaid = aid_instrumented_gdp_ln cabXaid_instr), cluster(GWNo) first 
LS0tDQp0aXRsZTogIkNoYXB0ZXIgNzogUnVsZSBvZiBMYXciDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQoNCi0tLQ0KDQojIEZpZ3VyZSA3LjE6IEp1ZGljaWFsIEluZGVwZW5kZW5jZSwgUG93ZXItU2hhcmluZywgYW5kIEFpZDogSW5kaXZpZHVhbCBQYXR0ZXJucw0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgZmlnLmhlaWdodCA9IDMuNSwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGRldiA9ICJDYWlyb1BORyJ9DQoNCmxpYnJhcnkodGV4cmVnKQ0Kc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkodGlrekRldmljZSkNCg0KIyBMb2FkIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgTGFiZWxzIGZvciBlYXNpZXIgcGxvdHRpbmcNCmRpc3NfZGYkY2FiaW5ldElOQ2xhYmVsIDwtIGlmZWxzZShkaXNzX2RmJGNhYmluZXRJTkMgPT0gMSwgIlBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBcblBvd2VyLVNoYXJpbmciKQ0KDQojIFBTID0+IEp1ZEluZA0KcGxvdF9wc19qdWRpbmNfTEpJIDwtIGdncGxvdChkaXNzX2RmLCBhZXMoeCA9IGNhYmluZXRJTkNsYWJlbCwgeSA9IExKSV90MikpICsgDQogIGdlb21faml0dGVyKHNpemUgPSAxLjcsIGFscGhhID0gMC41LCBoZWlnaHQgPSAwKSArDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IGNhYmluZXRJTkNsYWJlbCksIGFscGhhID0gMC42KSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQmx1ZXMiKSArIA0KICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gMSksIGZ1bi55ID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMjMsDQogICAgICAgICAgICAgICBzaXplID0gNCwgZmlsbCA9ICIjZDcxOTFjIiwgY29sb3IgPSAiI2Q3MTkxYyIpICsgDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIkxKSSIpDQoNCnBsb3RfYWxsYWlkX0xKSSA8LSBnZ3Bsb3QoZGlzc19kZiwgYWVzKHggPSBsb2coYWlkZGF0YV9BaWRHRFApLCB5ID0gTEpJX3QyKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMS43LCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHggPSAiQWxsIEFpZCAvIEdEUCAobG9nKSIsIHkgPSAiTEpJIikgDQoNCiMgRm9yIE1hbnVzY3JpcHQNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzExcHRde2FydGljbGV9IiApDQojIHRpa3ooIi4uL2ZpZ3VyZXMvYWlkX3BzX2luZGVmZl9qdWRpbmQudGV4IiwgaGVpZ2h0ID0gMy41KQ0KIyBjb3dwbG90OjpwbG90X2dyaWQocGxvdF9wc19qdWRpbmNfTEpJLCBwbG90X2FsbGFpZF9MSkksIG5yb3cgPSAxKQ0KIyBkZXYub2ZmKCkNCg0KIyBGb3IgUmVwbGljYXRpb24gQXJjaGl2ZQ0KY293cGxvdDo6cGxvdF9ncmlkKHBsb3RfcHNfanVkaW5jX0xKSSwgcGxvdF9hbGxhaWRfTEpJLCBucm93ID0gMSkNCg0KYGBgDQoNCg0KIyBGaWd1cmUgNy4yOiBGb3JlaWduIEFpZCBhbmQgUG9zdC1Db25mbGljdCBKdWRpY2lhbCBJbmRlcGVuZGVuY2UgaW4gQ291bnRyeS1ZZWFycyBXaXRoIGFuZCBXaXRob3V0IFBvd2VyLVNoYXJpbmcgQ2FiaW5ldHMNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIixmaWcuaGVpZ2h0ID0gMy41LCAgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCB3aWR0aCA9IDksIGhlaWdodCA9IDcsIGRldiA9ICJDYWlyb1BORyJ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIyBsb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgcGxvdCByYXcgZGF0YQ0KcHNhaWRfanVkaW5kX3Bsb3QgPC0gZ2dwbG90KGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9nKGFpZGRhdGFfQWlkR0RQKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBMSklfdDIpKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAxLjcsIGFscGhhID0gMC41KSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGZhY2V0X3dyYXAoIH4gY2FiaW5ldElOQywgbnJvdyA9IDEsDQogICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoY2FiaW5ldElOQyA9IGMoIjAiID0gIk5vIFBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgPSAiUG93ZXItU2hhcmluZyIpKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTExKSkgKw0KICBsYWJzKHggPSAiQWlkIC8gR0RQIChsb2cpIiwgeSA9ICJMaW56ZXIgYW5kIFN0YXRvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiKQ0KDQojIE91dHB1dCBNYW51c2NyaXB0DQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkodGlrekRldmljZSkNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzExcHRde2FydGljbGV9IiApDQojIHRpa3ooIi4uL2ZpZ3VyZXMvYWlkcHNfanVkaW5kX3NjYXR0ZXJwbG90LnRleCIsIGhlaWdodCA9IDMuNSkNCiMgcHJpbnQocHNhaWRfanVkaW5kX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQoNCnByaW50KHBzYWlkX2p1ZGluZF9wbG90KQ0KDQpgYGANCg0KDQojIEZpZ3VyZSA3LjM6IFRlbXBvcmFsIER5bmFtaWNzIG9mIHRoZSBJbnRlcmFjdGl2ZSBFZmZlY3QgYmV0d2VlbiBQb3dlci1TaGFyaW5nIGFuZCBGb3JlaWduIEFpZCBvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBmaWcuaGVpZ2h0ID0gMy41LCBkZXYgPSAiQ2Fpcm9QTkciIH0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShsZmUpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCg0KIyBEYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmIDwtIGRpc3NfZGYgJT4lIA0KICBkcGx5cjo6c2VsZWN0KC1tYXRjaGVzKCJsb2dpdCIpKSANCg0KIyBQcmVwYXJlIGRhdGEgZnJhbWUgZm9yIG11bHRpcGxlIHBsb3RzDQpqdWRpbmRfdmFycyA8LSBsaXN0KA0KICBMSklfdDEgPSBkaXNzX2RmLA0KICBMSklfdDIgPSBkaXNzX2RmLCANCiAgTEpJX3QzID0gZGlzc19kZiwgDQogIExKSV90NCA9IGRpc3NfZGYsIA0KICBMSklfdDUgPSBkaXNzX2RmLCANCiAgdjJ4X2p1Y29uX3QxID0gZGlzc19kZiwNCiAgdjJ4X2p1Y29uX3QyID0gZGlzc19kZiwgDQogIHYyeF9qdWNvbl90MyA9IGRpc3NfZGYsIA0KICB2MnhfanVjb25fdDQgPSBkaXNzX2RmLCANCiAgdjJ4X2p1Y29uX3Q1ID0gZGlzc19kZg0KKQ0KDQojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggbGlzdCBjb2x1bW4NCmp1ZGluZF92YXJzIDwtIGVuZnJhbWUoanVkaW5kX3ZhcnMpDQoNCiMgZGVmaW5lIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGV2ZXJ5IGRhdGEgZnJhbWUgaW4gdGhlIGxpc3QgY29sdW1uDQptYWluX21vZGVsIDwtIGZ1bmN0aW9uKGxlYWRfdHlwZSwgZGF0YSkgew0KICBkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGF0YSkNCiAgZGF0YSRsZWFkX3ZhciA8LSBkYXRhWywgZ3JlcChsZWFkX3R5cGUsIG5hbWVzKGRhdGEpLCB2YWx1ZSA9VCldDQogIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIHwgMCB8IDAgfCBHV05vLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhKQ0KICByZXR1cm4obW9kZWwpDQoNCn0NCg0KDQojIGZpdCBtb2RlbHMgJiBwb3N0LXByb2Nlc3MgZGF0YSBmb3IgcGxvdHRpbmcNCm1vZGVsX2FsbCA8LSBqdWRpbmRfdmFycyAlPiUgDQogIGRwbHlyOjptdXRhdGUobW9kZWwgPSBtYXAyKG5hbWUsIHZhbHVlLCB+IG1haW5fbW9kZWwoLngsIC55KSkpIA0KDQptb2RlbF9vdXQgPC0gbW9kZWxfYWxsICU+JSANCiAgbXV0YXRlKGNvZWYgPSBtYXAobW9kZWwsIGJyb29tOjp0aWR5KSkgJT4lIA0KICB1bm5lc3QoY29lZikgJT4lIA0KICAjIGtlZXAgb25seSBpbnRlcmFjdGlvbiB0ZXJtIGNvZWZzDQogIGZpbHRlcih0ZXJtID09ICJjYWJpbmV0Q09VTlQ6YWlkZGF0YV9BaWRHRFBfbG4iKSAlPiUgDQogIG11dGF0ZShkZW1fc2NvcmUgPSBpZmVsc2UoZ3JlcGwoIkxKSSIsIG5hbWUpLCAiTEpJIiwgIlYtRGVtIikpICU+JSANCiAgZHBseXI6OnNlbGVjdChkZW1fc2NvcmUsIG5hbWUsIGVzdGltYXRlLCBzdGQuZXJyb3IpICU+JSANCiAgZ3JvdXBfYnkoZGVtX3Njb3JlKSAlPiUgDQogIG11dGF0ZShuYW1lID0gMTo1KQ0KDQoNCnRlbXBfZHluX3JvbCA8LSBtb2RlbF9vdXQNCnNhdmUodGVtcF9keW5fcm9sLCBmaWxlID0gIi4vZGF0YS90ZW1wX2R5bl9yb2wucmRhIikNCg0KDQp0ZW1wX2R5bmFtaWNzX3Bsb3QgPC0gZ2dwbG90KG1vZGVsX291dCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZXN0aW1hdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGRlbV9zY29yZSwgY29sb3IgPSBkZW1fc2NvcmUpKSArDQogIGdlb21fcG9pbnQoIGFlcyhncm91cCA9IGRlbV9zY29yZSksIHNpemUgPSAxLjcsIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArIA0KICANCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVzdGltYXRlIC0gMS42NyAqIHN0ZC5lcnJvciwgDQogICAgICAgICAgICAgICAgICAgIHltYXggPSBlc3RpbWF0ZSArIDEuNjcgKiBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IGRlbV9zY29yZSksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMCwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKCIiLCB2YWx1ZXMgPSBjKCIjNDU3NWI0IiwgIiNlNDFhMWMiKSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwoIiIsIHZhbHVlcyA9IGMoMSwgNSkpICsNCiAgdGhlbWVfYncoKSsgDQogIGxhYnMoeCA9ICJZZWFyIGFmdGVyIHQwIiwgeSA9ICJFc3RpbWF0ZSBvZiBJbnRlcmFjdGlvbiBDb2VmZmljaWVudCBcbiBiZXR3ZWVuIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpXG4gYW5kIEFpZC9HRFAgKGxvZykiKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICB0aGVtZShsZWdlbmQua2V5LnNpemU9dW5pdCgzLCJsaW5lcyIpKSAjICsNCiAgIyBhbm5vdGF0ZSgicmVjdCIsIHhtaW49MS41LCB4bWF4PTIuNSwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjEsIGZpbGw9ImJsdWUiKQ0KDQojIE91dHB1dCBmb3IgbWFudXNjcmlwdA0KIyBvcHRpb25zKHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL3RlbXBfZHluYW1pY3NfcGxvdF9qdWRpbmQudGV4IiwgaGVpZ2h0ID0gMy41KQ0KIyBwcmludCh0ZW1wX2R5bmFtaWNzX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KcHJpbnQodGVtcF9keW5hbWljc19wbG90KQ0KDQpgYGANCg0KIyBGaWd1cmUgNy40OiBNYXJnaW5hbCBFZmZlY3RzIG9mIEFpZCBhbmQgUG93ZXItU2hhcmluZyBvbiBQb3N0LUNvbmZsaWN0IEp1ZGljaWFsIEluZGVwZW5kZW5jZQ0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQ9My41LCBkZXYgPSAiQ2Fpcm9QTkcifQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGlrekRldmljZSkNCg0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KDQoNCiMgRXN0aW1hdGUgTW9kZWxzIGZvciBwbG90dGluZyBsYXRlcg0KIyBMSkkNCm1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiaW5jPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJpbmMsIGRpc3NfZGYkR1dObykNCg0KDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgcGxvdCBtYXJnaW5hbCBlZmZlY3RzDQpzb3VyY2UoImZ1bmN0aW9ucy9pbnRlcmFjdGlvbl9wbG90cy5SIikNCg0KDQojICMgT3V0cHV0IGZvciBtYW51c2NyaXB0DQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZHBzX2ludGVyYWN0aW9uX2p1ZGluZF9wbG90LnRleCIsIGhlaWdodCA9IDMuNSkNCiMgDQojIHBhcihtZnJvdz1jKDEsMyksDQojICAgICBtYXIgPSBjKDUsIDcsIDQsIDAuNSksDQojICAgICBjZXgubGFiID0gMS4zLA0KIyAgICAgY2V4LmF4aXMgPSAxLjMsDQojICAgICBtZ3AgPSBjKDMuNSwgMSwgMCkpDQojIA0KIyBpbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWRHRFBfbG4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gIk1hcmdpbmFsIGVmZmVjdCBvZiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSBcbiBvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiYSkgQWlkIC8gR0RQIChMb2cpXG4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQojIGludGVyYWN0aW9uX3Bsb3RfY29udGludW91cyhtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCAqIGFpZGRhdGFfQWlkR0RQX2xuIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTWFyZ2luYWwgZWZmZWN0IG9mIEFpZFxuIG9uIEp1ZGljaWFsIEluZGVwZW5kZW5jZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gImIpIFBvd2VyLVNoYXJpbmcgXG4oTnVtYmVyIG9mIHJlYmVsIHNlYXRzKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KIyBpbnRlcmFjdGlvbl9wbG90X2JpbmFyeShtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkR0RQX2xuIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNYXJnaW5hbCBlZmZlY3Qgb2YgQWlkXG4gb24gSnVkaWNpYWwgSW5kZXBlbmRlbmNlIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjKSBQb3dlci1TaGFyaW5nIFxuKDEgPSBZZXMsIDAgPSBObykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KIyBkZXYub2ZmKCkNCg0KIyBPdXRwdXQgZm9yIFJlcGxpY2F0aW9uIEFyY2hpdmUNCnBhcihtZnJvdz1jKDEsMyksDQogICAgbWFyID0gYyg1LCA3LCA0LCAwLjUpLA0KICAgIGNleC5sYWIgPSAxLjMsDQogICAgY2V4LmF4aXMgPSAxLjMsDQogICAgbWdwID0gYygzLjUsIDEsIDApKQ0KDQppbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTWFyZ2luYWwgZWZmZWN0IG9mIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIFxuIG9uIEp1ZGljaWFsIEluZGVwZW5kZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gImEpIEFpZCAvIEdEUCAoTG9nKVxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IC45MCkNCmludGVyYWN0aW9uX3Bsb3RfY29udGludW91cyhtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWRHRFBfbG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCAqIGFpZGRhdGFfQWlkR0RQX2xuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX21lZGlhbl9lZmZlY3QgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiTWFyZ2luYWwgZWZmZWN0IG9mIEFpZFxuIG9uIEp1ZGljaWFsIEluZGVwZW5kZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJiKSBQb3dlci1TaGFyaW5nIFxuKE51bWJlciBvZiByZWJlbCBzZWF0cykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQppbnRlcmFjdGlvbl9wbG90X2JpbmFyeShtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYywNCiAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldElOQyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMgKiBhaWRkYXRhX0FpZEdEUF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICB5bGFiID0gIk1hcmdpbmFsIGVmZmVjdCBvZiBBaWRcbiBvbiBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjKSBQb3dlci1TaGFyaW5nIFxuKDEgPSBZZXMsIDAgPSBObykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IC45MCkNCg0KDQpgYGANCg0KDQojIEZpZ3VyZSA3LjU6IE1vZGVsIFByZWRpY3Rpb25zIGZvciB0aGUgRWZmZWN0IG9mIEZvcmVpZ24gQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIFBvc3QtQ29uZmxpY3QgSnVkaWNpYWwgSW5kZXBlbmRlbmNlDQoNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBmaWcud2lkdGggPSA2LjUsIGZpZy5oZWlnaHQgPSA0LjUsZGV2ID0gIkNhaXJvUE5HIn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KDQoNCiMgTG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIEVzdGltYXRlIE1vZGVsDQpkaXNzX2RmJGNvbmZsaWN0SUQgPC0gTlVMTCAjIGNvbmZsaWN0SUQgdGhyb3dzIGFuIGVycm9yIGIvYyBvZiBtaXNzaW5nIGRhdGENCmQgPC0gZGF0YWRpc3QoZGlzc19kZik7IG9wdGlvbnMoZGF0YWRpc3Q9J2QnKQ0KDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgZ2VuZXJhdGUgcHJlZGljdGlvbnMgYXQgZGlmZmVyZW50IHBvd2VyLXNoYXJpbmcgbGV2ZWxzDQpwcmVkaWN0aW9ucyA8LSBQcmVkaWN0KG1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9IGMoMCwgMy40KSwgIyAwID0gMSUgQWlkIC8gR0RQICwgMy40ID0gMzAlDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA9IHNlcSgwLCAxMCwgMSksIA0KICAgICAgICAgICAgICAgICAgICAgICBjb25mLmludCA9IDAuOSkgIyA5MCAlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQoNCiMgZ2VuZXJhdGUgcGxvdCANCm1lcGxvdF9haWRwc19qdWRpbmRfaW50ZXJhY3Rpb24gPC0gZ2dwbG90KGRhdGEuZnJhbWUocHJlZGljdGlvbnMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gY2FiaW5ldENPVU5ULCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geWhhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBhcy5mYWN0b3IoZXhwKGFpZGRhdGFfQWlkR0RQX2xuKSkpKSArIA0KICBnZW9tX2xpbmUoIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsgDQogIGdlb21fcmliYm9uKGFlcyh5bWF4ID0gdXBwZXIsIA0KICAgICAgICAgICAgICAgICAgeW1pbiA9IGxvd2VyLCANCiAgICAgICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3Iocm91bmQoZXhwKGFpZGRhdGFfQWlkR0RQX2xuKSwgMCkpKSwgDQogICAgICAgICAgICAgIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpLCANCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJBaWQgaW4gcGVyIGNlbnQgb2YgR0RQOiIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgMikpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSkgKw0KICBsYWJzKHggPSAiUG93ZXItU2hhcmluZyAoTm8uIG9mIHJlYmVsIHNlYXRzIGluIGdvdmVybm1lbnQpIiwgDQogICAgICAgeSA9ICJMUyBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCiAgDQoNCiMgQXQgZGlmZmVyZW50IGFpZCBsZXZlbHMNCnByZWRpY3Rpb25zX2FpZCA8LSBQcmVkaWN0KG1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiwgIyAwID0gMSUgQWlkIC8gR0RQICwgMy40ID0gMzAlDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA9IHNlcSgwLCAxMCwgbGVuZ3RoLm91dCA9IDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgY29uZi5pbnQgPSAwLjkpICMgOTAgJSBjb25maWRlbmNlIGludGVydmFscw0KDQojIGdlbmVyYXRlIHBsb3QNCm1lcGxvdF9haWRwc19qdWRpbmRfaW50ZXJhY3Rpb25fYWlkIDwtIGdncGxvdChkYXRhLmZyYW1lKHByZWRpY3Rpb25zX2FpZCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXhwKGFpZGRhdGFfQWlkR0RQX2xuKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5aGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBhcy5mYWN0b3IoY2FiaW5ldENPVU5UKSkpICsgDQogIGdlb21fbGluZSggY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKyANCiAgZ2VvbV9yaWJib24oYWVzKHltYXggPSB1cHBlciwgDQogICAgICAgICAgICAgICAgICB5bWluID0gbG93ZXIsIA0KICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmZhY3RvcihjYWJpbmV0Q09VTlQpKSwgDQogICAgICAgICAgICAgIGFscGhhID0gMC43KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpLCANCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJOdW1iZXIgb2YgcmViZWxzIFxuaW4gdGhlIHBvd2VyLXNoYXJpbmcgY29hbGl0aW9uOiIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSkgKw0KICBsYWJzKHggPSAiQWlkIC8gR0RQIiwgDQogICAgICAgeSA9ICJMUyBKdWRpY2lhbCBJbmRlcGVuZGVuY2UiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCg0KIyBPdXRwdXQgbWFudXNjcmlwdA0KIyBvcHRpb25zKCB0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9haWRwc19qdWRpbmRfTUUudGV4IiwgaGVpZ2h0ID0gNC41LCB3aWR0aCA9IDYuNSkNCiMgDQojIGdyaWQuYXJyYW5nZShtZXBsb3RfYWlkcHNfanVkaW5kX2ludGVyYWN0aW9uLCANCiMgICAgICAgICAgICAgIG1lcGxvdF9haWRwc19qdWRpbmRfaW50ZXJhY3Rpb25fYWlkLA0KIyAgICAgICAgICAgICAgbnJvdyA9IDEpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpncmlkLmFycmFuZ2UobWVwbG90X2FpZHBzX2p1ZGluZF9pbnRlcmFjdGlvbiwgDQogICAgICAgICAgICAgbWVwbG90X2FpZHBzX2p1ZGluZF9pbnRlcmFjdGlvbl9haWQsDQogICAgICAgICAgICAgbnJvdyA9IDEpDQoNCmBgYA0KDQoNCg0KDQojIEZpZ3VyZSA3LjY6IFByb2JpbmcgTWVjaGFuaXNtcyBJOiBWYXJpYXRpb24gaW4gVHlwZXMgb2YgUG93ZXItU2hhcmluZyBhbmQgQWlkDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRixmaWcuaGVpZ2h0ID0gMy41fQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGxmZSkNCmxpYnJhcnkodGlrekRldmljZSkNCg0KDQojIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCmRpc3NfZGYgPC0gZGlzc19kZiAlPiUgDQogIGRwbHlyOjpzZWxlY3QoLW1hdGNoZXMoImxvZ2l0IikpICU+JSANCiAgbXV0YXRlKGRnYV9nZHBfbG4gPSBsb2coZGdhX2dkcF96ZXJvICsxICksIA0KICAgICAgICAgcGdhX2dkcF9sbiA9IGxvZyhwcm9ncmFtX2FpZF9nZHBfemVybyArIDEpLCANCiAgICAgICAgIGJnYV9nZHBfbG4gPSBsb2coY29tbW9kaXR5X2FpZF9nZHBfemVybyArIDEpKQ0KDQojIFByZXBhcmUgZGF0YSBmcmFtZSBmb3IgbXVsdGlwbGUgcGxvdHMNCmp1ZGluZF92YXJzIDwtIGxpc3QoDQogIGNhYmluZXRDT1VOVCA9IGRpc3NfZGYsDQogIHNlbmlvckNPVU5UID0gZGlzc19kZiwgDQogIG5vbnNlbmlvckNPVU5UID0gZGlzc19kZiwgDQogIGRnYV9nZHBfbG4gPSBkaXNzX2RmLCANCiAgcGdhX2dkcF9sbiA9IGRpc3NfZGYsIA0KICBiZ2FfZ2RwX2xuID0gZGlzc19kZg0KKQ0KDQojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggbGlzdCBjb2x1bW4NCmp1ZGluZF92YXJzIDwtIGVuZnJhbWUoanVkaW5kX3ZhcnMpDQoNCg0KIyBkZWZpbmUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZXZlcnkgZGF0YSBmcmFtZSBpbiB0aGUgbGlzdCBjb2x1bW4NCm1haW5fbW9kZWwgPC0gZnVuY3Rpb24oaW5kX3ZhciwgZGF0YSkgew0KICBkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGF0YSkNCiAgZGF0YSRpbmRfdmFyIDwtIGRhdGFbLCBpbmRfdmFyXQ0KDQogIGlmKGdyZXBsKCJDT1VOVCIsIGluZF92YXIpKSB7DQogICAgbW9kZWwgPC0gbGZlOjpmZWxtKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgIGluZF92YXIgKg0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICBmaCB8IDAgfCAwIHwgR1dObywNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkNCiAgICByZXR1cm4obW9kZWwpDQoNCiAgfSBlbHNlIHsNCiAgICBtb2RlbCA8LSBsZmU6OmZlbG0oTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgaW5kX3ZhciArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICBmaCB8IDAgfCAwIHwgR1dObywNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkNCiAgcmV0dXJuKG1vZGVsKQ0KICB9DQogIA0KDQp9DQoNCg0KIyBmaXQgbW9kZWxzICYgcG9zdC1wcm9jZXNzIGRhdGEgZm9yIHBsb3R0aW5nDQptb2RlbF9hbGwgPC0ganVkaW5kX3ZhcnMgJT4lIA0KICBkcGx5cjo6bXV0YXRlKG1vZGVsID0gbWFwMihuYW1lLCB2YWx1ZSwgfiBtYWluX21vZGVsKC54LCAueSkpKSANCg0KbW9kZWxfb3V0IDwtIG1vZGVsX2FsbCAlPiUgDQogIG11dGF0ZShjb2VmID0gbWFwKG1vZGVsLCBicm9vbTo6dGlkeSkpICU+JSANCiAgdW5uZXN0KGNvZWYpICU+JSANCiAgIyBrZWVwIG9ubHkgaW50ZXJhY3Rpb24gdGVybSBjb2Vmcw0KICBmaWx0ZXIoZ3JlcGwoIjoiLCB0ZXJtKSkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KG5hbWUsIGVzdGltYXRlLCBzdGQuZXJyb3IpICU+JSANCiAgbXV0YXRlKG5hbWUgPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChuYW1lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJjYWJpbmV0Q09VTlQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5pb3JDT1VOVCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnNlbmlvckNPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGdhX2dkcF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBnYV9nZHBfbG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZ2FfZ2RwX2xuIikpKQ0KbW9kZWxfb3V0X3JvbCA8LSBtb2RlbF9vdXQNCnNhdmUobW9kZWxfb3V0X3JvbCwgZmlsZT0gIi4vZGF0YS9tZWNoYW5pc21fbW9kZWxzX3JvbC5yZGEiKQ0KDQoNCm1lY2hhbmlzbXNfanVkaW5kX3Bsb3QgPC0gZ2dwbG90KG1vZGVsX291dCwgDQogICAgICAgYWVzKHggPSBuYW1lLCANCiAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKw0KICBnZW9tX3BvaW50KCBzaXplID0gMS43LCANCiAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArIA0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXN0aW1hdGUgLSAxLjY3ICogc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGVzdGltYXRlICsgMS42NyAqIHN0ZC5lcnJvciksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMCwNCiAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArDQogDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKw0KICB0aGVtZV9idygpKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJDYWJpbmV0IFBTIChCYXNlbGluZSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbmlvciBQUyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uc2VuaW9yIFBTIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJER0EiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW0gQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRnZXQgQWlkIikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiRXN0aW1hdGUgb2YgSW50ZXJhY3Rpb24gQ29lZmZpY2llbnQgXG4gYmV0d2VlbiBEaWZmZXJlbnQgVHlwZXMgb2YgXG4gUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgYW5kIEFpZCIpIA0KDQoNCg0KIyBPdXRwdXQgZm9yIG1hbnVzY3JpcHQNCiMgb3B0aW9ucyh0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9tZWNoYW5pc21zX2p1ZGluZF9wbG90LnRleCIsIGhlaWdodCA9IDIuNzUpDQojIHByaW50KG1lY2hhbmlzbXNfanVkaW5kX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KcHJpbnQobWVjaGFuaXNtc19qdWRpbmRfcGxvdCkNCg0KYGBgDQoNCiMgRmlndXJlIDcuNzogUHJvYmluZyBNZWNoYW5pc21zIElJOiBTdHJhdGVnaWVzIEFnYWluc3QgdGhlIEp1ZGljaWFyeQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLmhlaWdodCA9IDMuNX0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShsZmUpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCiMgRGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KZGlzc19kZiA8LSBkaXNzX2RmICU+JSANCiAgZHBseXI6OnNlbGVjdCgtbWF0Y2hlcygibG9naXQiKSkgDQoNCiMgUHJlcGFyZSBkYXRhIGZyYW1lIGZvciBtdWx0aXBsZSBwbG90cw0KanVkaW5kX3ZhcnMgPC0gbGlzdCgNCiAgdjJ4X2p1Y29uX3QyID0gZGlzc19kZiwgIyBqdWRpY2lhbCBjb25zdHJhaW50cyBvbiB0aGUgZXhlY3V0aXZlDQogIHYyanVyZWZvcm1fdDIgPSBkaXNzX2RmLCAjIHJlZm9ybXMgDQogIHYyanVhY2NudF90MiA9IGRpc3NfZGYsDQogIHYyanVwdXJnZV90MiA9IGRpc3NfZGYsDQogIHYyanVwYWNrX3QyID0gZGlzc19kZiANCiAgDQogIA0KKQ0KDQojIGNyZWF0ZSBkYXRhIGZyYW1lIHdpdGggbGlzdCBjb2x1bW4NCmp1ZGluZF92YXJzIDwtIGVuZnJhbWUoanVkaW5kX3ZhcnMpDQoNCiMgZGVmaW5lIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGV2ZXJ5IGRhdGEgZnJhbWUgaW4gdGhlIGxpc3QgY29sdW1uDQptYWluX21vZGVsIDwtIGZ1bmN0aW9uKGxlYWRfdHlwZSwgZGF0YSkgew0KICBkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGF0YSkNCiAgZGF0YSRsZWFkX3ZhciA8LSBkYXRhWywgZ3JlcChsZWFkX3R5cGUsIG5hbWVzKGRhdGEpLCB2YWx1ZSA9VCldDQogIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIHwgMCB8IDAgfCBHV05vLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kYXRhKQ0KICByZXR1cm4obW9kZWwpDQogIA0KfQ0KDQoNCiMgZml0IG1vZGVscyAmIHBvc3QtcHJvY2VzcyBkYXRhIGZvciBwbG90dGluZw0KbW9kZWxfYWxsIDwtIGp1ZGluZF92YXJzICU+JSANCiAgZHBseXI6Om11dGF0ZShtb2RlbCA9IG1hcDIobmFtZSwgdmFsdWUsIH4gbWFpbl9tb2RlbCgueCwgLnkpKSkgDQoNCm1vZGVsX291dCA8LSBtb2RlbF9hbGwgJT4lIA0KICBtdXRhdGUoY29lZiA9IG1hcChtb2RlbCwgYnJvb206OnRpZHkpKSAlPiUgDQogIHVubmVzdChjb2VmKSAlPiUgDQogICMga2VlcCBvbmx5IGludGVyYWN0aW9uIHRlcm0gY29lZnMNCiAgZmlsdGVyKGdyZXBsKCI6IiwgdGVybSkpICU+JSANCiAgbXV0YXRlKG5hbWUgPSBmb3JjYXRzOjpmY3RfcmVvcmRlcihuYW1lLCBlc3RpbWF0ZSwgc29ydCkpDQoNCm1lY2hhbmlzbXNfcGxvdDIgPC0gZ2dwbG90KG1vZGVsX291dCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZXN0aW1hdGUpKSArDQogIGdlb21fcG9pbnQoIHNpemUgPSAxLjcsIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArIA0KIA0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXN0aW1hdGUgLSAxLjY3ICogc3RkLmVycm9yLCANCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGVzdGltYXRlICsgMS42NyAqIHN0ZC5lcnJvciksIA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMCwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gMikgKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIoIiIscGFsZXR0ZSA9ICJTZXQyIikgKw0KICB0aGVtZV9idygpKyANCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJSZWZvcm1zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHVyZ2VzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjb3VudGFiaWxpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWRpY2lhbCBJbmRlcGVuZGVuY2UgXG4oUmVmZXJlbmNlKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdXJ0IFBhY2tpbmciKSkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICJFc3RpbWF0ZSBvZiBJbnRlcmFjdGlvbiBDb2VmZmljaWVudCBcbiBiZXR3ZWVuIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpXG4gYW5kIEFpZC9HRFAgKGxvZykiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQoNCiMgb3B0aW9ucyh0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9tZWNoYW5pc21zMl9qdWRpbmRfcGxvdC50ZXgiLCBoZWlnaHQgPSAyLjc1KQ0KIyBwcmludChtZWNoYW5pc21zX3Bsb3QyKQ0KIyBkZXYub2ZmKCkNCg0KcHJpbnQobWVjaGFuaXNtc19wbG90MikNCg0KDQpgYGANCg0KDQoNCiMgVGFibGUgNy4xOiBJbmRpdmlkdWFsIEVmZmVjdHMgb2YgUG93ZXItU2hhcmluZyBhbmQgRm9yZWlnbiBBaWQgb24gUG9zdC1Db25mbGljdCBSdWxlIG9mIExhdw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0KIyBzb3VyY2UoImZ1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpsaWJyYXJ5KHJtcykNCg0KIyBsb2FkIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQojIA0KIyBkaXNzX2RmJGNvbmZsaWN0SUQgPC0gTlVMTA0KIyBkYXRhZGlzdF9kaXNzX2RmIDwtIGRhdGFkaXN0KGRpc3NfZGYpOyBvcHRpb25zKGRhdGFkaXN0PSdkYXRhZGlzdF9kaXNzX2RmJykNCg0KIyBNb2RlbHMgDQptb2RlbF9wc19samlfY2FiY291bnQgPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfbGppX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc19samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfcHNfbGppX3NlbmlvcmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfbGppX3NlbmlvcmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc19samlfc2VuaW9yY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfcHNfbGppX25vbnNlbmlvcmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfbGppX25vbnNlbmlvcmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc19samlfbm9uc2VuaW9yY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBBaWQNCm1vZGVsX2RnYV9samlfY2FiY291bnQgPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2RnYV9samlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2RnYV9samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KDQptb2RlbF9wZ2FfbGppX2NhYmNvdW50IDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocHJvZ3JhbV9haWRfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX3BnYV9samlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX3BnYV9samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfYmdhX2xqaV9jYWJjb3VudCA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2JnYV9samlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2JnYV9samlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBPdXRwdXQNCg0KbW9kZWxfbGlzdCA8LSBsaXN0KG1vZGVsX3BzX2xqaV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfcHNfbGppX3NlbmlvcmNvdW50LCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9wc19samlfbm9uc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2RnYV9samlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX3BnYV9samlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2JnYV9samlfY2FiY291bnQpDQoNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdChjYWJpbmV0Q09VTlQgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KICAgICAgICAgICAgICAgICAgICAgIHNlbmlvckNPVU5UID0gIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgIG5vbnNlbmlvckNPVU5UID0gIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVDphaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19zaGFyZSA9ICJQUyAoY2FiaW5ldCBzaGFyZSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc19zaGFyZSAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQUyAoY2FiaW5ldCBzaGFyZSkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICBkZ2FfZ2RwX3plcm8gPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fYWlkX2dkcF96ZXJvID0gIlByb2dyYW0gQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gPSAiQnVkZ2V0IEFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9ICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjID0gIkdEUCBwL2MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICJDb25mbGljdCBJbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyID0gIlBvbGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXRobmljID0gIkV0aG5pYyBGcmFjLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNfb3JkaW5hbCA9ICJVTiBQS08iKQ0KDQojIGN1c3RvbSBmdW5jdGlvbnMgdG8gd3JpdGUgdGV4IG91dHB1dA0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQojIA0KIyBjdXN0b21fdGV4cmVnKG1vZGVsX2xpc3QsDQojICAgICAgICAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkX3BzX2luZGVmZl9qdWRpbmQudGV4IiwNCiMgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwICA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KIyAgICAgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsDQojICAgICAgICAgICAgICAgY2FwdGlvbiA9ICIiLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGKQ0KICAgICAgICAgICAgICAjIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQogICAgICAgICAgICAgICMgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme1Bvd2VyLVNoYXJpbmd9fSAmIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme0ZvcmVpZ24gQWlkfX0gXFxcXCBcXGNtaWRydWxlKHIpezItNH0gXFxjbWlkcnVsZShsKXs1LTd9ICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgIH0iLA0KICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICB9IiwNCiAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eygzKSAgfSIsDQogICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNCkgIH0iLA0KICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDUpICAgfSIsDQogICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNikgICB9IikpDQoNCg0KaHRtbHJlZyhtb2RlbF9saXN0LCANCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLCANCiAgICAgICAgY3VzdG9tLmNvZWYubWFwICA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgIGNhcHRpb24gPSAiIiwNCiAgICAgICAgaW5jbHVkZS5sciA9IEYpDQoNCg0KYGBgDQoNCg0KIyBUYWJsZSA3LjI6IFRoZSBJbnRlcmFjdGl2ZSBFZmZlY3Qgb2YgUG93ZXItU2hhcmluZyBhbmQgRm9yZWlnbiBBaWQgb24gUG9zdC1Db25mbGljdCBSdWxlIG9mIExhdw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0KIyBzb3VyY2UoImZ1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpsaWJyYXJ5KHJtcykNCg0KDQojIGxvYWQgRGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBMSkkNCm1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiaW5jPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJpbmMsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX2p1ZGluZF9MSklfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBWLURlbQ0KbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiaW5jIDwtIG9scyh2MnhfanVjb25fdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19qdWRpbmRfdmRlbV9jYWJpbmMgPC0gcm9iY292KG1vZGVsX2FpZHBzX2p1ZGluZF92ZGVtX2NhYmluYywgZGlzc19kZiRHV05vKQ0KDQoNCg0KbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiY291bnQgPC0gb2xzKHYyeF9qdWNvbl90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX2p1ZGluZF92ZGVtX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgbW9kZWwgbGlzdDoNCm1vZGVsX2xpc3QgPC0gbGlzdChtb2RlbF9haWRwc19qdWRpbmRfTEpJX2NhYmluYywgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfanVkaW5kX0xKSV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfanVkaW5kX3ZkZW1fY2FiaW5jLA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX2p1ZGluZF92ZGVtX2NhYmNvdW50KQ0KDQpjb2VmX25hbWVfbWFwIDwtIGxpc3QoDQogICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldElOQyAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UOmFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQUyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgIHBzX3NoYXJlID0gIlBTIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgInBzX3NoYXJlICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0IHNoYXJlKSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF96ZXJvID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfemVybyA9ICJQcm9ncmFtIEFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb21tb2RpdHlfYWlkX2dkcF96ZXJvID0gIkJ1ZGdldCBBaWQvR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgbG5fcG9wID0gIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUG9saXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMgPSAiRXRobmljIEZyYWMuIiwNCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIpDQoNCiMgY3VzdG9tIGZ1bmN0aW9ucyB0byB3cml0ZSB0ZXggb3V0cHV0DQojIHNvdXJjZSgiZnVuY3Rpb25zL2V4dHJhY3Rfb2xzX2N1c3RvbS5SIikNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0KIyANCiMgY3VzdG9tX3RleHJlZyhtb2RlbF9saXN0LCANCiMgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkcHNfanVkaW5kX21haW4udGV4IiwgDQojICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQojICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiIFxcbXVsdGljb2x1bW57Mn17Y317IFxcdGV4dGJme0xKSX19ICYgXFxtdWx0aWNvbHVtbnsyfXtjfXsgXFx0ZXh0YmZ7Vi1EZW19fSBcXFxcIFxcY21pZHJ1bGUocil7Mi0zfSBcXGNtaWRydWxlKGwpezQtNX0gJiBcXG11bHRpY29sdW1uezF9e2N9eygxKSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMikgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg0KSAgfSIpLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLCANCiMgICAgICAgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLCANCiMgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRikNCiMgDQojIHRleHJlZzo6aHRtbHJlZyhtb2RlbF9saXN0LCANCiMgICAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KIyAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLCANCiMgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLCANCiMgICAgICAgICBpbmNsdWRlLmxyID0gRiwgDQojICAgICAgICAgY2FwdGlvbiA9ICIiKQ0KDQpgYGANCg0KDQoNCg0KIyBUYWJsZSA3LjM6IFBvd2VyLVNoYXJpbmcsIEZvcmVpZ24gQWlkIGFuZCBQb3N0LUNvbmZsaWN0IFJ1bGUgb2YgTGF3OiBSb2J1c3RuZXNzIENoZWNrcw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0Kc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X3BsbV9jdXN0b20uUiIpDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHBsbSkNCmxpYnJhcnkoY291bnRyeWNvZGUpDQoNCg0KIyBsb2FkIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCg0KIyBFdGhuaWMNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRXRobmljPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRXRobmljIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0V0aG5pYywgZGlzc19kZiRHV05vKQ0KDQojIFBLTw0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9QS08gPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTX29yZGluYWwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfUEtPIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX1BLTywgZGlzc19kZiRHV05vKQ0KDQojIENhYmluZXQgU2hhcmUNCg0KbGlicmFyeShyZWFkeGwpDQpjbnRzIDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9DTlRTREFUQS54bHMiKQ0KDQpjbnRzIDwtIGNudHMgJT4lIGZpbHRlcih5ZWFyID49IDE5ODkpDQoNCmNudHMkaXNvM2MgPC0gY291bnRyeWNvZGUoY250cyRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImlzbzNjIikNCmNudHMgPC0gY250cyAlPiUgZmlsdGVyKGNvdW50cnkgIT0gIlNPTUFMSUxBTkQiKQ0KDQp0ZXN0Y2Fic2l6ZSA8LSBsZWZ0X2pvaW4oZGlzc19kZiwgY250c1ssIGMoImlzbzNjIiwgInllYXIiLCAicG9saXQxMCIpXSkNCg0KdGVzdGNhYnNpemUkcHNfc2hhcmUgPC0gdGVzdGNhYnNpemUkY2FiaW5ldENPVU5UIC8gdGVzdGNhYnNpemUkcG9saXQxMCAqIDEwMA0KDQptb2RlbF9jYWJzaXplX2p1ZGluZCA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgcHNfc2hhcmUgKg0KICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRlc3RjYWJzaXplLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9jYWJzaXplX2p1ZGluZCA8LSByb2Jjb3YobW9kZWxfY2Fic2l6ZV9qdWRpbmQsIHRlc3RjYWJzaXplJEdXTm8pDQoNCiMgUmVnaW9uYWwgTWVhbg0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuIDwtIG9scyhMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSklfcmVnaW9uYWxfbWVhbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuICA8LSByb2Jjb3YobW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuICwgZGlzc19kZiRHV05vKQ0KDQoNCiMgQ29tbW9ubGF3DQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbW1vbmxhdyA8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9ubGF3DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbW1vbmxhdyA8LSByb2Jjb3YobW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9jb21tb25sYXcsIGRpc3NfZGYkR1dObykNCg0KDQoNCiMgQ29uc3RpdHV0aW9uYWwgRHVyYXRpb24NCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfY29uc3RkdXI8LSBvbHMoTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fY29uc3RpdHV0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbnN0ZHVyIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbnN0ZHVyLCBkaXNzX2RmJEdXTm8pDQoNCiMgDQojIA0KIyAjIEFsbCBjb250cm9scw0KIyBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2FsbGNvbnRyb2xzIDwtIG9scyhMSklfdDIgfg0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTX29yZGluYWwgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExKSV9yZWdpb25hbF9tZWFuICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25sYXcgKyANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX2NvbnN0aXR1dGlvbg0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KIyBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2FsbGNvbnRyb2xzIDwtIHJvYmNvdihtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2FsbGNvbnRyb2xzLCBkaXNzX2RmJEdXTm8pDQoNCg0KIyBSYW5kb20gRWZmZWN0cw0KbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9SRSA8LSBwbG0oTEpJX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSAicmFuZG9tIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYygiY291bnRyeSIsICJ5ZWFyIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQoNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfUkUkdmNvdiA8LSBwbG06OnZjb3ZIQyhtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX1JFKQ0KDQoNCiMgUmVnaW9uIEZpeGVkIEVmZmVjdHMNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkUgPC0gb2xzKExKSV90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiwgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kZWwgPSAid2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggPSBjKCJyZWdpb24iLCAiY291bnRyeV95ZWFyIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQoNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkUgPC0gcm9iY292KG1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkUsZGlzc19kZiRjb3VudHJ5KQ0KDQojIENvdW50cnkgRkVzDQptb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFX2NudHJ5IDwtIHBsbShMSklfdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjKCJjb3VudHJ5IiwgInllYXIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfRkVfY250cnkkdmNvdiA8LSBwbG06OnZjb3ZIQyhtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFX2NudHJ5LCBjbHVzdGVyID0gImdyb3VwIikNCg0KIyBPdXRwdXQNCg0KIyBNb2RlbCBsaXN0DQptb2RlbF9saXN0IDwtIGxpc3QobW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9FdGhuaWMsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2ludGVyYWN0aW9uX2p1ZGluZF9MSklfUEtPLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9jYWJzaXplX2p1ZGluZCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9yZWdtZWFuLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX2NvbW1vbmxhdywgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfaW50ZXJhY3Rpb25fanVkaW5kX0xKSV9jb25zdGR1ciwNCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX1JFLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9pbnRlcmFjdGlvbl9qdWRpbmRfTEpJX0ZFX2NudHJ5KQ0KDQoNCiMjIE9yZGVyIG9mIGNvZWZmaWNpZW50cyBpbiBvdXRwdXQgdGFibGUNCm5hbWVfbWFwX3JvYnVzdG5lc3MgPC0gbGlzdChjYWJpbmV0Q09VTlQgPSAiUFMgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQ6YWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0KSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfc2hhcmUgPSAiUFMgKGNhYmluZXQgc2hhcmUpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNfc2hhcmUgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQgc2hhcmUpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9ICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyA9ICJHRFAgcC9jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgPSAiUG9wdWxhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgPSAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb24tU3RhdGUgVmlvbGVuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MiA9ICJQb2xpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoID0gIlJlZ2ltZSBUeXBlIChGSCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYyA9ICJFdGhuaWMgRnJhYy4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTX29yZGluYWwgPSAiVU4gUEtPIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSklfcmVnaW9uYWxfbWVhbiA9ICJMSkkgUmVnaW9uYWwgTWVhbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbmxhdyA9ICJDb21tb24gTGF3IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fY29uc3RpdHV0aW9uID0gIkNvbnN0LiBEdXJhdGlvbiIpDQoNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCg0KDQojICMgT3V0cHV0IE1hbnVzY3JpcHQNCiMgY3VzdG9tX3RleHJlZyhsID0gbW9kZWxfbGlzdCwNCiMgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgc3ltYm9sID0gIisiLA0KIyAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBuYW1lX21hcF9yb2J1c3RuZXNzLA0KIyAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZHBzX2p1ZGluZF9yb2J1c3RuZXNzLnRleCIsDQojICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEVMRiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIFBLTyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDMpIENhYi4gU2l6ZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFJlZ2lvbmFsIE1lYW4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgQ29tbW9uIExhdyIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBDb25zdC4gRHVyYXRpb24iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNykgUkUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig4KSBSZWdpb24gRkUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig5KSBDb3VudHJ5IEZFIiksDQojICAgICAgICANCiMgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLA0KIyAgICAgICAgIGluY2x1ZGUubHIgPSBGLCANCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULCANCiMgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQojICAgICAgICAgaW5jbHVkZS52YXJpYW5jZSA9IEYpDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCmh0bWxyZWcobW9kZWxfbGlzdCwgDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gbmFtZV9tYXBfcm9idXN0bmVzcywNCiAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEVMRiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBQS08iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMykgQ2FiLiBTaXplIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFJlZ2lvbmFsIE1lYW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIENvbW1vbiBMYXciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDYpIENvbnN0LiBEdXJhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNykgUkUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoOCkgUmVnaW9uIEZFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDkpIENvdW50cnkgRkUiKSwNCiAgICAgICANCiAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwNCiAgICAgICAgaW5jbHVkZS5sciA9IEYsIA0KICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULCANCiAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsIA0KICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KYGBgDQoNCg0KIyBUYWJsZSA3LjQ6IFBvd2VyLVNoYXJpbmcsIEZvcmVpZ24gQWlkIGFuZCBQb3N0LUNvbmZsaWN0IFJ1bGUgb2YgTGF3OiBNYXRjaGluZyBhbmQgMlNMUyBSZXN1bHRzDQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0ZXhyZWcpDQpzb3VyY2UoImZ1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3RfcGxtX2N1c3RvbS5SIikNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkocGxtKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCg0KDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIyMjIyBNYXRjaGluZyAjIyMjIw0KbGlicmFyeShNYXRjaEl0KQ0KbGlicmFyeSh0aWR5cikNCg0Kc2V0LnNlZWQoMTU5NzUzKQ0KIyBwcmVwYXJlIGRhdGEgd2l0aG91dCBtaXNzaW5ncw0KbWF0Y2hfamlfZGF0YSA8LSBkaXNzX2RmICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZHBseXI6OnNlbGVjdChjYWJpbmV0SU5DLCBjYWJpbmV0Q09VTlQsIHNlbmlvcklOQywNCiAgICAgICAgICAgICAgICBzZW5pb3JDT1VOVCwgbm9uc2VuaW9ySU5DLCBub25zZW5pb3JDT1VOVCwNCiAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUCwgcG9wdWxhdGlvbiwgbm9uc3RhdGUsDQogICAgICAgICAgICAgICAgV0JuYXRyZXMsIGZoLCBHRFBfcGVyX2NhcGl0YSwgY29uZl9pbnRlbnMsDQogICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4sIExKSV90MiwgdjJ4X2p1Y29uX3QyLCBHV05vLCB5ZWFyLCANCiAgICAgICAgICAgICAgICBwY19wZXJpb2QsIExvY2F0aW9uLCBsbl9wb3AsIGxuX2dkcF9wYywNCiAgICAgICAgICAgICAgICBMSklfcmVnaW9uYWxfbWVhbiwgY29tbW9ubGF3LCBkdXJhdGlvbl9jb25zdGl0dXRpb24sIEV0aG5pYywgcG9saXR5X2NobmcpDQptYXRjaF9qaV9kYXRhIDwtIG1hdGNoX2ppX2RhdGFbY29tcGxldGUuY2FzZXMobWF0Y2hfamlfZGF0YSksIF0NCg0KIyBnZW5lcmF0ZSBwcmV0cmVhdG1lbnQgY29udHJvbHMNCg0KbWF0Y2hfamlfZGF0YSA8LSBtYXRjaF9qaV9kYXRhICU+JSANCiAgYXJyYW5nZShHV05vLCBwY19wZXJpb2QsIHllYXIpICU+JSANCiAgZ3JvdXBfYnkoR1dObywgcGNfcGVyaW9kKSAlPiUgDQogIG11dGF0ZShtYXRjaF9haWRkYXRhX0FpZEdEUF9sbiA9IGZpcnN0KGFpZGRhdGFfQWlkR0RQX2xuKSwNCiAgICAgICAgIG1hdGNoX3BvcCA9IGZpcnN0KHBvcHVsYXRpb24pLA0KICAgICAgICAgbWF0Y2hfZ2RwID0gZmlyc3QoR0RQX3Blcl9jYXBpdGEpLA0KICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgPSBmaXJzdChub25zdGF0ZSksDQogICAgICAgICBtYXRjaF9XQm5hdHJlcyA9IGZpcnN0KFdCbmF0cmVzKSwNCiAgICAgICAgIG1hdGNoX2ZoID0gZmlyc3QoZmgpLCANCiAgICAgICAgIG1hdGNoX2R1cmF0aW9uX2NvbnN0aXR1dGlvbiA9IGZpcnN0KGR1cmF0aW9uX2NvbnN0aXR1dGlvbiksDQogICAgICAgICBtYXRjaF9MSklfcmVnaW9uYWxfbWVhbiA9IGZpcnN0KExKSV9yZWdpb25hbF9tZWFuKSkNCiAgICANCg0KDQptYXRjaF9qaV9kYXRhIDwtIGFzLmRhdGEuZnJhbWUobWF0Y2hfamlfZGF0YSkNCg0KbWF0Y2hfamlfcmVzIDwtIG1hdGNoaXQoY2FiaW5ldElOQyB+DQogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2FpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX2dkcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfcG9wKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgIyBjb25mX2ludGVucyBpcyBhbHJlYWR5IHByZS10cmVhdG1lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfV0JuYXRyZXMgKyAxKSAgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9maCAsDQogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAibmVhcmVzdCIsDQogICAgICAgICAgICAgICAgICAgICAgICByYXRpbyA9IDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAibWFoYWxhbm9iaXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG1hdGNoX2ppX2RhdGEpDQoNCiMgZXh0cmFjdCBkYXRhDQptYXRjaF9qaV9yZXNfZGYgPC0gbWF0Y2guZGF0YShtYXRjaF9qaV9yZXMpDQoNCg0KIyBNb2RlbHMNCg0KIyMjIyBNYXRjaGluZzogUFMgKiBBaWQgPT4gSnVkaWNpYWwgSW5kZXBlbmRlbmNlDQoNCiMgTEpJDQptb2RlbF9wc2FpZF9tYXRjaGVkX0xKSSA8LSBvbHMoTEpJX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9bWF0Y2hfamlfcmVzX2RmICwgeD1ULCB5PVQpDQptb2RlbF9wc2FpZF9tYXRjaGVkX0xKSSA8LSBybXM6OnJvYmNvdihtb2RlbF9wc2FpZF9tYXRjaGVkX0xKSSwgbWF0Y2guZGF0YShtYXRjaF9qaV9yZXMpJEdXTm8pDQoNCiMgVi1EZW0NCm1vZGVsX3BzYWlkX21hdGNoZWRfdmRlbSA8LSBvbHModjJ4X2p1Y29uX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPW1hdGNoX2ppX3Jlc19kZiAsIHg9VCwgeT1UKQ0KbW9kZWxfcHNhaWRfbWF0Y2hlZF92ZGVtIDwtIHJtczo6cm9iY292KG1vZGVsX3BzYWlkX21hdGNoZWRfdmRlbSwgbWF0Y2guZGF0YShtYXRjaF9qaV9yZXMpJEdXTm8pDQoNCiMjIyMgSW5zdHJ1bWVudGFsIFZhcmlhYmxlIFJlZ3Jlc3Npb25zICMjIw0KDQoNCiMgaXZyZWcgd2l0aCBKdWQgSW5kDQoNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShpdnBhY2spDQpsaWJyYXJ5KGxtdGVzdCkNCg0KIyBsb2FkIGluc3RydW1lbnQNCmxvYWQoZmlsZSA9ICIuL2RhdGEvaW5zdHJ1bWVudGVkQWlkMi5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmIDwtIG1lcmdlKGRpc3NfZGYsIGluc3RydW1lbnRfZGYsIGJ5ID0gYygieWVhciIsICJpc28yYyIpLCBhbGwueCA9IFRSVUUpDQpkaXNzX2RmJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhkaXNzX2RmJHRvdGFsX3N1bV9leGNlcHQpDQoNCg0KIyBzdWJzZXQgb25seSBjb21wbGV0ZS5jYXNlcyAvIG5lY2Vzc2FyeSBmb3IgY2x1c3Rlci5yb2J1c3Quc2UoKQ0KaXZfbmEgPC0gbmEub21pdChkaXNzX2RmWywgYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkUENfbG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUF9wZXJfY2FwaXRhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZl9pbnRlbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0JuYXRyZXMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWxfc3VtX2V4Y2VwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdXTm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uc3RhdGUiLCAiTEpJX3QyIiwgInYyeF9qdWNvbl90MiIpXSkNCg0KDQoNCiMjIyMjIElWICMjIyMjDQoNCml2X25hJGFpZF9pbnN0cnVtZW50ZWRfZ2RwX2xuIDwtIGxvZyhpdl9uYSR0b3RhbF9zdW1fZXhjZXB0IC8gaXZfbmEkR0RQKQ0KZGlzc19kZiRhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiA8LSBsb2coZGlzc19kZiR0b3RhbF9zdW1fZXhjZXB0IC8gZGlzc19kZiRHRFApDQoNCiMgdG8gcHJvY2VlZCB3aXRoIElWIGVzdGltYXRpb24gSSBmaXJzdCBoYXJkLWNvZGUgdGhlIGluc3RydW1lbnQNCml2X25hJGluc3RyX2FpZF9nZHBfbG4gPC0gbG9nKGl2X25hJHRvdGFsX3N1bV9leGNlcHQgLyBpdl9uYSRHRFApDQoNCiMgZGF0YSB0cmFuc2Zvcm1hdGlvbiBmb3IgU3RhdGENCml2X25hJGxuX2dkcF9wYyA8LSBsb2coaXZfbmEkR0RQX3Blcl9jYXBpdGEpDQppdl9uYSRsbl9wb3AgPC0gbG9nKGl2X25hJHBvcHVsYXRpb24pDQoNCiMgc3R1ZmYgZm9yIHN0YXRhDQojIGRpc3NfZGYkcmVnaW9uX251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkaXNzX2RmJHJlZ2lvbikpDQojIGRpc3NfZGYkY291bnRyeV95ZWFyX251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkaXNzX2RmJGNvdW50cnlfeWVhcikpDQpmb3JlaWduOjp3cml0ZS5kdGEoaXZfbmEsICIuL2RhdGEvZGlzc19kZl9JVi5kdGEiKQ0KDQojIGhhcmQgY29kZSBpbnRlcmFjdGlvbiB2YXJpYWJsZQ0KaXZfbmEkY2FiaW5jWGFpZCA8LSBpdl9uYSRhaWRkYXRhX0FpZEdEUF9sbiAqIGl2X25hJGNhYmluZXRJTkMNCml2X25hJGNhYmluY1hhaWRfaW5zdHIgPC0gaXZfbmEkYWlkX2luc3RydW1lbnRlZF9nZHBfbG4gKiBpdl9uYSRjYWJpbmV0SU5DDQoNCmxpYnJhcnkobGZlKQ0KDQoNCm1vZGVsX2l2X2p1ZGluZF9samkgPC0gZmVsbShMSklfdDIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQyArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIA0KICAgICAgICAgICAgICAgICAgICAgICB8IDAgfCAoYWlkZGF0YV9BaWRHRFBfbG58Y2FiaW5jWGFpZCB+IGFpZF9pbnN0cnVtZW50ZWRfZ2RwX2xuICsgY2FiaW5jWGFpZF9pbnN0cikgfCBHV05vLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGl2X25hKQ0KDQoNCm1vZGVsX2l2X2p1ZGluZF92ZGVtIDwtIGZlbG0odjJ4X2p1Y29uX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICBmaCANCiAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgKGFpZGRhdGFfQWlkR0RQX2xufGNhYmluY1hhaWQgfiBhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiArIGNhYmluY1hhaWRfaW5zdHIpIHwgR1dObywgDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpdl9uYSkNCg0KIyBPdXRwdXQgTW9kZWxzDQojIyBPcmRlciBvZiBjb2VmZmljaWVudHMgaW4gb3V0cHV0IHRhYmxlDQpuYW1lX21hcCA8LSBsaXN0KGNhYmluZXRJTkMgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICJjYWJpbmV0SU5DICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgImBjYWJpbmNYYWlkKGZpdClgIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICJgYWlkZGF0YV9BaWRHRFBfbG4oZml0KWAiID0gIkFpZCAvIEdEUCAobG9nKSIsDQogICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIgPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICJsbl9nZHBfcGMiID0gIkdEUCBwL2MiLA0KICAgICAgICAgICAgICAgICAibG5fcG9wIiA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgPSAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgcG9saXR5MiA9ICJSZWdpbWUgVHlwZSIsDQogICAgICAgICAgICAgICAgIGZoID0gIlJlZ2ltZSBUeXBlIikNCg0KbW9kZWxfbGlzdCA8LSBsaXN0KG1vZGVsX3BzYWlkX21hdGNoZWRfTEpJLCBtb2RlbF9wc2FpZF9tYXRjaGVkX3ZkZW0sIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2l2X2p1ZGluZF9samksIG1vZGVsX2l2X2p1ZGluZF92ZGVtKQ0KDQoNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0Kc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9mZWxtX2N1c3RvbS5SIikNCiMgDQojIGN1c3RvbV90ZXhyZWcobW9kZWxfbGlzdCwgDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IG5hbWVfbWFwLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9haWRwc19qdWRpbmRfbWF0Y2hpbmcyc2xzLnRleCIsIA0KIyAgICAgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICAgICAgICBhZGQubGluZXMgPSBsaXN0KGMoIkNvdW50cmllcyIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKG1hdGNoX2ppX3Jlc19kZiRHV05vKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKG1hdGNoX2ppX3Jlc19kZiRHV05vKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGRpc3NfZGYkR1dObykpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShkaXNzX2RmJEdXTm8pKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiS2xlaWJlcmdlbi1QYWFwIHJrIFdhbGQgRiBzdGF0aXN0aWMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwLjMyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MC4zMiIpKSwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBjdXN0b20ubXVsdGljb2wgPSBULA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezJ9e2N9eyBcXHRleHRiZntNYXRjaGluZ319ICYgXFxtdWx0aWNvbHVtbnsyfXtjfXsgXFx0ZXh0YmZ7MlNMU319IFxcXFwgXFxjbWlkcnVsZShyKXsyLTN9IFxcY21pZHJ1bGUobCl7NC01fSAmIFxcbXVsdGljb2x1bW57MX17Y317KDEpIExKSSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMikgVi1EZW0gIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpIExKSSB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg0KSBWLURlbSB9IiksDQojICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQojICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQojICAgICAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQojICAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYpDQoNCnRleHJlZzo6aHRtbHJlZyhtb2RlbF9saXN0LCANCiAgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQogICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gbmFtZV9tYXAsDQogICAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICBpbmNsdWRlLmxyID0gRiwgDQogICAgICAgIGNhcHRpb24gPSAiIikNCmBgYA0KDQojIFN1cHBsZW1lbnQ6IFN0YXRhIGNvZGUgdG8gZ2VuZXJhdGUgRi1TdGF0aXN0aWNzIGZvciBJVi8yU0xTIG1vZGVscw0KYGBge3IsIGVuZ2luZSA9ICJzdGF0YSIsIGV2YWwgPSBGfQ0KDQp1c2UgIi5cZGF0YVxkaXNzX2RmX2l2LmR0YSIsIHJlcGxhY2UNCg0KKiBHZW5lcmF0ZSBpbnRlcmFjdGlvbnMgJiBpbnRlcmFjdGlvbnMgd2l0aCBpbnN0cnVtZW50DQpnZW4gY2FiWGFpZCA9IGNhYmluZXRJTkMgKiBhaWRkYXRhX0FpZEdEUF9sbg0KZ2VuIGNhYlhhaWRfaW5zdHIgPSBjYWJpbmV0SU5DICogYWlkX2luc3RydW1lbnRlZF9nZHBfbG4NCg0KKiBlc3RpbWF0ZSAyU0xTIGZvciBqdWRpY2lhbCBpbmRlcGVuZGVuY2UNCml2cmVnMiBMSklfdDIgY2FiaW5ldElOQyBsbl9nZHBfcGMgbG5fcG9wIG5vbnN0YXRlIGNvbmZfaW50ZW5zIFdCbmF0cmVzIGZoICAvLy8NCihhaWRkYXRhX0FpZEdEUF9sbiBjYWJYYWlkID0gYWlkX2luc3RydW1lbnRlZF9nZHBfbG4gY2FiWGFpZF9pbnN0ciksIGNsdXN0ZXIoR1dObykgZmlyc3QgDQoNCg0KYGBg