In this script, I use loops to perform weighted gamlss regressions with shorter time spans, to use as a robustness check.

rm(list = ls())
library(gamlss)
library(tidyverse)
library(dplyr)
library(here)
library(fastDummies)

EVS

load(here("./data/final_data", "evssel.RData"))

# Select variables without missings 
evs_complete <- evssel %>% dplyr::select(surveyyear:marstat, weightvec, isced_cat)
evs_complete <- evs_complete %>% drop_na()
evs_complete$time <- evs_complete$surveyyear - min(evs_complete$surveyyear)

# Subset the data so that I only calculate the time effect between the first two waves
evs_1 <- subset(evs_complete, surveyyear == 1990 | surveyyear == 1999)

predictors <- c("time")
deps <- c("climate5")

evs_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_1, weights = weightvec)
  
  evs_list_empty[[i]] <- evs_fit
} 

summary(evs_list_empty[[1]]) #Sig pos effect of time on intercept

# Save it, the 1 indicating that this is the first time effect
save(evs_list_empty, file="./data/final_data/regression_outputs/per_wave/evs_list_empty1.RData")

# Second model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("climate5")

evs_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                    family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_1, weights = weightvec)
  
  evs_list_preds[[i]] <- evs_fit
} 

summary(evs_list_preds[[1]]) #Sig pos effect of time on intercept

save(evs_list_preds, file="./data/final_data/regression_outputs/per_wave/evs_list_preds1_new.RData")

# Third model with interaction effects as well
evs_1$age_time <- evs_1$age * evs_1$time
evs_1$sex_time <- as.numeric(evs_1$sex) * evs_1$time
evs_1 <- fastDummies::dummy_cols(evs_1, select_columns = "isced_cat")
evs_1$isced_basic_time <- evs_1$isced_cat_Basic * evs_1$time
evs_1$isced_intermediate_time <- evs_1$isced_cat_Intermediate * evs_1$time
evs_1$isced_advanced_time <- evs_1$isced_cat_Advanced * evs_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

evs_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_1, weights = weightvec)
  
  evs_list_interactions[[i]] <- evs_fit
} 

summary(evs_list_interactions[[1]]) 

save(evs_list_interactions, file="./data/final_data/regression_outputs/per_wave/evs_list_interactions1_new.RData")
# Now the other waves
# Select the second and third wave to calculate the time effect between these two
evs_2 <- subset(evs_complete, surveyyear == 1999 | surveyyear == 2008)

predictors <- c("time")
deps <- c("climate5")

evs_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regrevsion
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_2, weights = weightvec)
  
  evs_list_empty[[i]] <- evs_fit
} 

summary(evs_list_empty[[1]]) #Sig pos effect of time on intercept

save(evs_list_empty, file="./data/final_data/regression_outputs/per_wave/evs_list_empty2.RData")

# Second model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("climate5")

evs_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                    family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_2, weights = weightvec)
  
  evs_list_preds[[i]] <- evs_fit
} 

summary(evs_list_preds[[1]]) 

save(evs_list_preds, file="./data/final_data/regression_outputs/per_wave/evs_list_preds2_new.RData")

# Third model with interactions
evs_2$age_time <- evs_2$age * evs_2$time
evs_2$sex_time <- as.numeric(evs_2$sex) * evs_2$time
evs_2 <- fastDummies::dummy_cols(evs_2, select_columns = "isced_cat")
evs_2$isced_basic_time <- evs_2$isced_cat_Basic * evs_2$time
evs_2$isced_intermediate_time <- evs_2$isced_cat_Intermediate * evs_2$time
evs_2$isced_advanced_time <- evs_2$isced_cat_Advanced * evs_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

evs_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_2, weights = weightvec)
  
  evs_list_interactions[[i]] <- evs_fit
} 


summary(evs_list_interactions[[1]]) 

save(evs_list_interactions, file="./data/final_data/regression_outputs/per_wave/evs_list_interactions2_new.RData")

I&O Research

# Repeat the same process for I&O research
load(here("./data/final_data", "io_total.RData"))
io_complete <- io_total %>% dplyr::select(worried:surveyyear, weightvec, isced_cat)
io_complete = subset(io_complete, select = -c(urban,IOINKOMEN, IOPOL2017) )
io_complete <- io_complete %>% drop_na()

io_complete$time <- io_complete$surveyyear - min(io_complete$surveyyear)

io_1 <- subset(io_complete, surveyyear == 2019 | surveyyear == 2020)

predictors <- c("time")
deps <- c("worried", "frontrunner", "worry_future", "resp_citiz", "dk_start", "do_gov", "buss_help", "min_contr", "human_resp")

io_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = io_1, weights = weightvec)
  
  io_list_empty[[i]] <- io_fit
} 

save(io_list_empty, file="./data/final_data/regression_outputs/per_wave/io_list_empty1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

io_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = io_1, weights = weightvec)
  
  io_list_preds[[i]] <- io_fit
} 

summary(io_list_preds[[1]]) 

save(io_list_preds, file="./data/final_data/regression_outputs/per_wave/io_list_preds1_new.RData")

# Model with interactions
io_1$age_time <- io_1$age * io_1$time
io_1$sex_time <- as.numeric(io_1$sex) * io_1$time
io_1 <- fastDummies::dummy_cols(io_1, select_columns = "isced_cat")
io_1$isced_basic_time <- io_1$isced_cat_Basic * io_1$time
io_1$isced_intermediate_time <- io_1$isced_cat_Intermediate * io_1$time
io_1$isced_advanced_time <- io_1$isced_cat_Advanced * io_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

io_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = io_1, weights = weightvec)
  
  io_list_interactions[[i]] <- io_fit
} 

summary(io_list_interactions[[1]]) 

save(io_list_interactions, file="./data/final_data/regression_outputs/per_wave/io_list_interactions1_new.RData")
# The other waves
io_2 <- subset(io_complete, surveyyear == 2020 | surveyyear == 2022)

predictors <- c("time")
deps <- c("worried", "frontrunner", "worry_future", "resp_citiz", "dk_start", "do_gov", "buss_help", "min_contr", "human_resp")

io_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = io_2, weights = weightvec)
  
  io_list_empty[[i]] <- io_fit
} 

save(io_list_empty, file="./data/final_data/regression_outputs/per_wave/io_list_empty2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

io_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = io_2, weights = weightvec)
  
  io_list_preds[[i]] <- io_fit
} 

summary(io_list_preds[[1]]) 

save(io_list_preds, file="./data/final_data/regression_outputs/per_wave/io_list_preds2_new.RData")

# Model with interactions
io_2$age_time <- io_2$age * io_2$time
io_2$sex_time <- as.numeric(io_2$sex) * io_2$time
io_2 <- fastDummies::dummy_cols(io_2, select_columns = "isced_cat")
io_2$isced_basic_time <- io_2$isced_cat_Basic * io_2$time
io_2$isced_intermediate_time <- io_2$isced_cat_Intermediate * io_2$time
io_2$isced_advanced_time <- io_2$isced_cat_Advanced * io_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

io_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = io_2, weights = weightvec)
  
  io_list_interactions[[i]] <- io_fit
} 


summary(io_list_interactions[[1]]) 

save(io_list_interactions, file="./data/final_data/regression_outputs/per_wave/io_list_interactions2_new.RData")

ISSP

# And the same procedure for ISSP
rm(list=ls())
load("./data/final_data/issptotal.Rdata")
issptotal$surveyyear[is.na(issptotal$surveyyear)] <- "2010"
issptotal$surveyyear <- as.numeric(issptotal$surveyyear)

# The issp has variables that are asked in all three waves, and variables that are asked only in 2 waves. So I have to run the code on subsets of the data. First I estimate the models for the statements that are asked throughout the three waves. The ones that are asked two waves don't have to be run again. 
issp_complete <- issptotal %>% dplyr::select(surveyyear:marstat, weightvec, isced_cat)
issp_complete <- issp_complete %>% drop_na()
issp_complete$time <- issp_complete$surveyyear - min(issp_complete$surveyyear)
issp_1 <- subset(issp_complete, surveyyear == 1993 | surveyyear == 2000)

predictors <- c("time")
deps <- c("worry", "lifeharm", "willing_price", "willing_tax", "willing_living", "do_right", "progharm", "econprotect", "people_decide")

issp_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                     family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_1, weights = weightvec)
  
  issp_list_empty[[i]] <- issp_fit
} 

save(issp_list_empty, file="./data/final_data/regression_outputs/per_wave/issp_list_empty1.RData")

# Now with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("worry", "lifeharm", "willing_price", "willing_tax", "willing_living", "do_right", "progharm", "econprotect", "people_decide" )

issp_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                      family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_1, weights = weightvec)
  
  issp_list_preds[[i]] <- issp_fit
} 

summary(issp_list_preds[[2]]) 
summary(issp_list_preds[[3]]) 

save(issp_list_preds, file="./data/final_data/regression_outputs/per_wave/issp_list_preds1_new.RData")

# And now interactions
issp_1$age_time <- issp_1$age * issp_1$time
issp_1$sex_time <- as.numeric(issp_1$sex) * issp_1$time
issp_1 <- fastDummies::dummy_cols(issp_1, select_columns = "isced_cat")
issp_1$isced_basic_time <- issp_1$isced_cat_Basic * issp_1$time
issp_1$isced_intermediate_time <- issp_1$isced_cat_Intermediate * issp_1$time
issp_1$isced_advanced_time <- issp_1$isced_cat_Advanced * issp_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

issp_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressisspn
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_1, weights = weightvec)
  
  issp_list_interactions[[i]] <- issp_fit
} 

summary(issp_list_interactions[[1]]) 

save(issp_list_interactions, file="./data/final_data/regression_outputs/per_wave/issp_list_interactions1_new.RData")
# Second part
issp_2 <- subset(issp_complete, surveyyear == 2000 | surveyyear == 2010)

predictors <- c("time")
deps <- c("worry", "lifeharm", "willing_price", "willing_tax", "willing_living", "do_right", "progharm", "econprotect", "people_decide")

issp_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                     family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_2, weights = weightvec)
  
  issp_list_empty[[i]] <- issp_fit
} 

save(issp_list_empty, file="./data/final_data/regression_outputs/per_wave/issp_list_empty2.RData")

# Now with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("worry", "lifeharm", "willing_price", "willing_tax", "willing_living", "do_right", "progharm", "econprotect", "people_decide" )

issp_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                      family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_2, weights = weightvec)
  
  issp_list_preds[[i]] <- issp_fit
} 

save(issp_list_preds, file="./data/final_data/regression_outputs/per_wave/issp_list_preds2_new.RData")

# And now interactions
issp_2$age_time <- issp_2$age * issp_2$time
issp_2$sex_time <- as.numeric(issp_2$sex) * issp_2$time
issp_2 <- fastDummies::dummy_cols(issp_2, select_columns = "isced_cat")
issp_2$isced_basic_time <- issp_2$isced_cat_Basic * issp_2$time
issp_2$isced_intermediate_time <- issp_2$isced_cat_Intermediate * issp_2$time
issp_2$isced_advanced_time <- issp_2$isced_cat_Advanced * issp_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

issp_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressisspn
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_2, weights = weightvec)
  
  issp_list_interactions[[i]] <- issp_fit
} 

summary(issp_list_interactions[[1]]) 

save(issp_list_interactions, file="./data/final_data/regression_outputs/per_wave/issp_list_interactions2_new.RData")

EB

rm(list=ls())
# Now the most difficult one: Eurobarometer. No items are asked steadily throughout time, so have to work with a lot of subsets. 
load("./data/final_data/eb_tot.RData")

# first 1986 - 1995
eb_complete <- eb_tot %>% dplyr::select(surveyyear, env_ec_stat, env_prsimp, sex, isced: urban, weightvec, isced_cat)
# Religion is only asked in one wave
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)
eb_1 <- subset(eb_complete, surveyyear == 1986 | surveyyear == 1992)

# First empty model 
predictors <- c("time")
deps <- c("env_ec_stat", "env_prsimp")

eb_list_empty_1986 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_1986[[i]] <- eb_fit
} 

summary(eb_list_empty_1986[[1]]) 
summary(eb_list_empty_1986[[2]])

save(eb_list_empty_1986, file="./data/final_data/regression_outputs/per_wave/eb_list_empty_1986_1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_ec_stat", "env_prsimp")

eb_list_preds_1986 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_1986[[i]] <- eb_fit
} 

summary(eb_list_preds_1986[[1]]) 
summary(eb_list_preds_1986[[2]])

save(eb_list_preds_1986, file="./data/final_data/regression_outputs/per_wave/eb_list_preds_1986_1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_1986 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_1986[[i]] <- eb_fit
} 

summary(eb_list_interactions_1986[[1]]) 
summary(eb_list_interactions_1986[[2]])

save(eb_list_interactions_1986, file="./data/final_data/regression_outputs/per_wave/eb_list_interactions_1986_1.RData")
# Second part
eb_2 <- subset(eb_complete, surveyyear == 1992 | surveyyear == 1995)

predictors <- c("time")
deps <- c("env_ec_stat", "env_prsimp")

eb_list_empty_1986 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_1986[[i]] <- eb_fit
} 

summary(eb_list_empty_1986[[1]]) 
summary(eb_list_empty_1986[[2]])

save(eb_list_empty_1986, file="./data/final_data/regression_outputs/per_wave/eb_list_empty_1986_2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_ec_stat", "env_prsimp")

eb_list_preds_1986 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_1986[[i]] <- eb_fit
} 

summary(eb_list_preds_1986[[1]]) 
summary(eb_list_preds_1986[[2]])

save(eb_list_preds_1986, file="./data/final_data/regression_outputs/per_wave/eb_list_preds_1986_2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")


eb_list_interactions_1986 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_1986[[i]] <- eb_fit
} 


summary(eb_list_interactions_1986[[1]]) 
summary(eb_list_interactions_1986[[2]])

save(eb_list_interactions_1986, file="./data/final_data/regression_outputs/per_wave/eb_list_interactions_1986_2.RData")
# Now with the influence of environment on quality of life. This is asked 4 times, so I have to make 3 subsets. 
eb_complete <- eb_tot %>% dplyr::select(surveyyear, env_quallife, sex, isced, urban, age, weightvec, isced_cat)
# Lrplace and income are not asked in all waves

eb_complete <- eb_complete %>% drop_na()

eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

eb_1 <- subset(eb_complete, surveyyear == 2004 | surveyyear == 2007)

# First empty model 
predictors <- c("time")
deps <- c("env_quallife")

eb_list_empty_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_quallife[[i]] <- eb_fit
} 

summary(eb_list_empty_quallife[[1]]) 

save(eb_list_empty_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_empty_quallife1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_quallife")

eb_list_preds_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_quallife[[i]] <- eb_fit
} 

summary(eb_list_preds_quallife[[1]]) 

save(eb_list_preds_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_preds_quallife1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_quallife <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_quallife[[i]] <- eb_fit
} 


summary(eb_list_interactions_quallife[[1]]) 

save(eb_list_interactions_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_interactions_quallife1_new.RData")
# Second part
eb_2 <- subset(eb_complete, surveyyear == 2007 | surveyyear == 2011)

predictors <- c("time")
deps <- c("env_quallife")

eb_list_empty_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_quallife[[i]] <- eb_fit
} 

summary(eb_list_empty_quallife[[1]]) 

save(eb_list_empty_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_empty_quallife2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_quallife")

eb_list_preds_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_quallife[[i]] <- eb_fit
} 

summary(eb_list_preds_quallife[[1]]) 

save(eb_list_preds_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_preds_quallife2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_quallife <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_quallife[[i]] <- eb_fit
} 

summary(eb_list_interactions_quallife[[1]]) 

save(eb_list_interactions_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_interactions_quallife2_new.RData")
# And the third set
eb_3 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2014)

predictors <- c("time")
deps <- c("env_quallife")

eb_list_empty_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_empty_quallife[[i]] <- eb_fit
} 

summary(eb_list_empty_quallife[[1]]) 

save(eb_list_empty_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_empty_quallife3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_quallife")

eb_list_preds_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_preds_quallife[[i]] <- eb_fit
} 

summary(eb_list_preds_quallife[[1]]) 

save(eb_list_preds_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_preds_quallife3_new.RData")

# And the model with interactions
eb_3$age_time <- eb_3$age * eb_3$time
eb_3$sex_time <- as.numeric(eb_3$sex) * eb_3$time
eb_3 <- fastDummies::dummy_cols(eb_3, select_columns = "isced_cat")
eb_3$isced_basic_time <- eb_3$isced_cat_Basic * eb_3$time
eb_3$isced_intermediate_time <- eb_3$isced_cat_Intermediate * eb_3$time
eb_3$isced_advanced_time <- eb_3$isced_cat_Advanced * eb_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_quallife <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_interactions_quallife[[i]] <- eb_fit
} 

summary(eb_list_interactions_quallife[[1]]) 

save(eb_list_interactions_quallife, file="./data/final_data/regression_outputs/per_wave/eb_list_interactions_quallife3_new.RData")
# Now 2 statements that are asked 4 times
eb_complete <- eb_tot %>% dplyr::select(surveyyear, role_ind, big_pol, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)
eb_1 <- subset(eb_complete, surveyyear == 2007 | surveyyear == 2011)

# First empty model 
predictors <- c("time")
deps <- c("role_ind", "big_pol")

eb_list_empty_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_2007[[i]] <- eb_fit
} 

summary(eb_list_empty_2007[[2]]) 

save(eb_list_empty_2007, file="./data/final_data/regression_outputs/eb_list_empty_2007_1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("role_ind", "big_pol")

eb_list_preds_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_2007[[i]] <- eb_fit
} 

summary(eb_list_preds_2007[[1]]) 

save(eb_list_preds_2007, file="./data/final_data/regression_outputs/eb_list_preds_2007_1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2007 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_2007[[i]] <- eb_fit
} 

summary(eb_list_interactions_2007[[1]]) 

save(eb_list_interactions_2007, file="./data/final_data/regression_outputs/eb_list_interactions_2007_1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2014)

predictors <- c("time")
deps <- c("role_ind", "big_pol")

eb_list_empty_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_2007[[i]] <- eb_fit
} 

summary(eb_list_empty_2007[[2]]) 

save(eb_list_empty_2007, file="./data/final_data/regression_outputs/eb_list_empty_2007_2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("role_ind", "big_pol")

eb_list_preds_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_2007[[i]] <- eb_fit
} 

summary(eb_list_preds_2007[[1]]) 

save(eb_list_preds_2007, file="./data/final_data/regression_outputs/eb_list_preds_2007_2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2007 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_2007[[i]] <- eb_fit
} 

summary(eb_list_interactions_2007[[1]]) 

save(eb_list_interactions_2007, file="./data/final_data/regression_outputs/eb_list_interactions_2007_2_new.RData")
# Third set
eb_3 <- subset(eb_complete, surveyyear == 2014 | surveyyear == 2017)

predictors <- c("time")
deps <- c("role_ind", "big_pol")

eb_list_empty_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_empty_2007[[i]] <- eb_fit
} 

summary(eb_list_empty_2007[[2]]) 

save(eb_list_empty_2007, file="./data/final_data/regression_outputs/eb_list_empty_2007_3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("role_ind", "big_pol")

eb_list_preds_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_preds_2007[[i]] <- eb_fit
} 

summary(eb_list_preds_2007[[1]]) 

save(eb_list_preds_2007, file="./data/final_data/regression_outputs/eb_list_preds_2007_3_new.RData")

# And the model with interactions
eb_3$age_time <- eb_3$age * eb_3$time
eb_3$sex_time <- as.numeric(eb_3$sex) * eb_3$time
eb_3 <- fastDummies::dummy_cols(eb_3, select_columns = "isced_cat")
eb_3$isced_basic_time <- eb_3$isced_cat_Basic * eb_3$time
eb_3$isced_intermediate_time <- eb_3$isced_cat_Intermediate * eb_3$time
eb_3$isced_advanced_time <- eb_3$isced_cat_Advanced * eb_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2007 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_interactions_2007[[i]] <- eb_fit
} 

summary(eb_list_interactions_2007[[1]]) 

save(eb_list_interactions_2007, file="./data/final_data/regression_outputs/eb_list_interactions_2007_3_new.RData")
# Statement about willingness to buy more expensive products that are environmentally friendly
eb_complete <- eb_tot %>% dplyr::select(surveyyear, buyprod, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)
eb_1 <- subset(eb_complete, surveyyear == 2007| surveyyear == 2011)

# First empty model 
predictors <- c("time")
deps <- c("buyprod")

eb_list_empty_buyprod <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_buyprod[[i]] <- eb_fit
} 

summary(eb_list_empty_buyprod[[1]]) 

save(eb_list_empty_buyprod, file="./data/final_data/regression_outputs/eb_list_empty_buyprod1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("buyprod")

eb_list_preds_buyprod <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_buyprod[[i]] <- eb_fit
} 

summary(eb_list_preds_buyprod[[1]]) 

save(eb_list_preds_buyprod, file="./data/final_data/regression_outputs/eb_list_preds_buyprod1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_buyprod <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_buyprod[[i]] <- eb_fit
} 


summary(eb_list_interactions_buyprod[[1]]) 

save(eb_list_interactions_buyprod, file="./data/final_data/regression_outputs/eb_list_interactions_buyprod1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2011| surveyyear == 2014)

# First empty model 
predictors <- c("time")
deps <- c("buyprod")

eb_list_empty_buyprod <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_buyprod[[i]] <- eb_fit
} 

summary(eb_list_empty_buyprod[[1]]) 

save(eb_list_empty_buyprod, file="./data/final_data/regression_outputs/eb_list_empty_buyprod2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("buyprod")

eb_list_preds_buyprod <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_buyprod[[i]] <- eb_fit
} 

summary(eb_list_preds_buyprod[[1]]) 

save(eb_list_preds_buyprod, file="./data/final_data/regression_outputs/eb_list_preds_buyprod2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_buyprod <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_buyprod[[i]] <- eb_fit
} 


summary(eb_list_interactions_buyprod[[1]]) 

save(eb_list_interactions_buyprod, file="./data/final_data/regression_outputs/eb_list_interactions_buyprod2_new.RData")
# Affected daily
eb_complete <- eb_tot %>% dplyr::select(surveyyear, eff_daily, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)
eb_1 <- subset(eb_complete, surveyyear == 2007 | surveyyear == 2011)

# First empty model 
predictors <- c("time")
deps <- c("eff_daily")

eb_list_empty_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_empty_eff_daily[[1]]) 

save(eb_list_empty_eff_daily, file="./data/final_data/regression_outputs/eb_list_empty_eff_daily1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("eff_daily")

eb_list_preds_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_preds_eff_daily[[1]]) 

save(eb_list_preds_eff_daily, file="./data/final_data/regression_outputs/eb_list_preds_eff_daily1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_eff_daily <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_interactions_eff_daily[[1]]) 

save(eb_list_interactions_eff_daily, file="./data/final_data/regression_outputs/eb_list_interactions_eff_daily1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2014)

# First empty model 
predictors <- c("time")
deps <- c("eff_daily")

eb_list_empty_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_empty_eff_daily[[1]]) 

save(eb_list_empty_eff_daily, file="./data/final_data/regression_outputs/eb_list_empty_eff_daily2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("eff_daily")

eb_list_preds_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_preds_eff_daily[[1]]) 

save(eb_list_preds_eff_daily, file="./data/final_data/regression_outputs/eb_list_preds_eff_daily2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_eff_daily <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_eff_daily[[i]] <- eb_fit
} 


summary(eb_list_interactions_eff_daily[[1]]) 

save(eb_list_interactions_eff_daily, file="./data/final_data/regression_outputs/eb_list_interactions_eff_daily2_new.RData")
# Third set
eb_3 <- subset(eb_complete, surveyyear == 2014 | surveyyear == 2017)

# First empty model 
predictors <- c("time")
deps <- c("eff_daily")

eb_list_empty_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_empty_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_empty_eff_daily[[1]]) 

save(eb_list_empty_eff_daily, file="./data/final_data/regression_outputs/eb_list_empty_eff_daily3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("eff_daily")

eb_list_preds_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_preds_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_preds_eff_daily[[1]]) 

save(eb_list_preds_eff_daily, file="./data/final_data/regression_outputs/eb_list_preds_eff_daily3_new.RData")

# And the model with interactions
eb_3$age_time <- eb_3$age * eb_3$time
eb_3$sex_time <- as.numeric(eb_3$sex) * eb_3$time
eb_3 <- fastDummies::dummy_cols(eb_3, select_columns = "isced_cat")
eb_3$isced_basic_time <- eb_3$isced_cat_Basic * eb_3$time
eb_3$isced_intermediate_time <- eb_3$isced_cat_Intermediate * eb_3$time
eb_3$isced_advanced_time <- eb_3$isced_cat_Advanced * eb_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_eff_daily <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_interactions_eff_daily[[i]] <- eb_fit
} 


summary(eb_list_interactions_eff_daily[[1]]) 

save(eb_list_interactions_eff_daily, file="./data/final_data/regression_outputs/eb_list_interactions_eff_daily3_new.RData")
# Climate change perception asked in six waves, so have to use 5 subsets
eb_complete <- eb_tot %>% dplyr::select(surveyyear, ccpercept, cchange, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)


eb_1 <- subset(eb_complete, surveyyear == 2009 | surveyyear == 2011)
# First empty model 
predictors <- c("time")
deps <- c("ccpercept", "cchange")

eb_list_empty_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_2009[[i]] <- eb_fit
} 

summary(eb_list_empty_2009[[1]]) 

save(eb_list_empty_2009, file="./data/final_data/regression_outputs/eb_list_empty_2009_1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("ccpercept", "cchange")

eb_list_preds_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_2009[[i]] <- eb_fit
} 

summary(eb_list_preds_2009[[1]]) 

save(eb_list_preds_2009, file="./data/final_data/regression_outputs/eb_list_preds_2009_1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2009 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_2009[[i]] <- eb_fit
} 

summary(eb_list_interactions_2009[[1]]) 

save(eb_list_interactions_2009, file="./data/final_data/regression_outputs/eb_list_interactions_2009_1_new.RData")
# Second set 
eb_2 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2013)
# First empty model 
predictors <- c("time")
deps <- c("ccpercept", "cchange")

eb_list_empty_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_2009[[i]] <- eb_fit
} 

summary(eb_list_empty_2009[[1]]) 

save(eb_list_empty_2009, file="./data/final_data/regression_outputs/eb_list_empty_2009_2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("ccpercept", "cchange")

eb_list_preds_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_2009[[i]] <- eb_fit
} 

summary(eb_list_preds_2009[[1]]) 

save(eb_list_preds_2009, file="./data/final_data/regression_outputs/eb_list_preds_2009_2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")


eb_list_interactions_2009 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_2009[[i]] <- eb_fit
} 

summary(eb_list_interactions_2009[[1]]) 

save(eb_list_interactions_2009, file="./data/final_data/regression_outputs/eb_list_interactions_2009_2_new.RData")
# Third set 
eb_3 <- subset(eb_complete, surveyyear == 2013 | surveyyear == 2015)
# First empty model 
predictors <- c("time")
deps <- c("ccpercept", "cchange")

eb_list_empty_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_empty_2009[[i]] <- eb_fit
} 

summary(eb_list_empty_2009[[1]]) 

save(eb_list_empty_2009, file="./data/final_data/regression_outputs/eb_list_empty_2009_3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("ccpercept", "cchange")

eb_list_preds_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_preds_2009[[i]] <- eb_fit
} 

summary(eb_list_preds_2009[[1]]) 

save(eb_list_preds_2009, file="./data/final_data/regression_outputs/eb_list_preds_2009_3_new.RData")

# And the model with interactions
eb_3$age_time <- eb_3$age * eb_3$time
eb_3$sex_time <- as.numeric(eb_3$sex) * eb_3$time
eb_3 <- fastDummies::dummy_cols(eb_3, select_columns = "isced_cat")
eb_3$isced_basic_time <- eb_3$isced_cat_Basic * eb_3$time
eb_3$isced_intermediate_time <- eb_3$isced_cat_Intermediate * eb_3$time
eb_3$isced_advanced_time <- eb_3$isced_cat_Advanced * eb_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2009 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_interactions_2009[[i]] <- eb_fit
} 

summary(eb_list_interactions_2009[[1]]) 

save(eb_list_interactions_2009, file="./data/final_data/regression_outputs/eb_list_interactions_2009_3_new.RData")
# Fourth set
eb_4 <- subset(eb_complete, surveyyear == 2015 | surveyyear == 2017)
# First empty model 
predictors <- c("time")
deps <- c("ccpercept", "cchange")

eb_list_empty_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_4, weights = weightvec)
  
  eb_list_empty_2009[[i]] <- eb_fit
} 

summary(eb_list_empty_2009[[1]]) 

save(eb_list_empty_2009, file="./data/final_data/regression_outputs/eb_list_empty_2009_4.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("ccpercept", "cchange")

eb_list_preds_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_4, weights = weightvec)
  
  eb_list_preds_2009[[i]] <- eb_fit
} 

summary(eb_list_preds_2009[[1]]) 

save(eb_list_preds_2009, file="./data/final_data/regression_outputs/eb_list_preds_2009_4_new.RData")

# And the model with interactions
eb_4$age_time <- eb_4$age * eb_4$time
eb_4$sex_time <- as.numeric(eb_4$sex) * eb_4$time
eb_4 <- fastDummies::dummy_cols(eb_4, select_columns = "isced_cat")
eb_4$isced_basic_time <- eb_4$isced_cat_Basic * eb_4$time
eb_4$isced_intermediate_time <- eb_4$isced_cat_Intermediate * eb_4$time
eb_4$isced_advanced_time <- eb_4$isced_cat_Advanced * eb_4$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2009 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_4, weights = weightvec)
  
  eb_list_interactions_2009[[i]] <- eb_fit
} 

summary(eb_list_interactions_2009[[1]]) 

save(eb_list_interactions_2009, file="./data/final_data/regression_outputs/eb_list_interactions_2009_4_new.RData")
# Fifth set
eb_5 <- subset(eb_complete, surveyyear == 2017 | surveyyear == 2021)
# First empty model 
predictors <- c("time")
deps <- c("ccpercept", "cchange")

eb_list_empty_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_5, weights = weightvec)
  
  eb_list_empty_2009[[i]] <- eb_fit
} 

summary(eb_list_empty_2009[[1]]) 

save(eb_list_empty_2009, file="./data/final_data/regression_outputs/eb_list_empty_2009_5.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("ccpercept", "cchange")

eb_list_preds_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_5, weights = weightvec)
  
  eb_list_preds_2009[[i]] <- eb_fit
} 

summary(eb_list_preds_2009[[1]]) 

save(eb_list_preds_2009, file="./data/final_data/regression_outputs/eb_list_preds_2009_5_new.RData")

# And the model with interactions
eb_5$age_time <- eb_5$age * eb_5$time
eb_5$sex_time <- as.numeric(eb_5$sex) * eb_5$time
eb_5 <- fastDummies::dummy_cols(eb_5, select_columns = "isced_cat")
eb_5$isced_basic_time <- eb_5$isced_cat_Basic * eb_5$time
eb_5$isced_intermediate_time <- eb_5$isced_cat_Intermediate * eb_5$time
eb_5$isced_advanced_time <- eb_5$isced_cat_Advanced * eb_5$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2009 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_5, weights = weightvec)
  
  eb_list_interactions_2009[[i]] <- eb_fit
} 

summary(eb_list_interactions_2009[[1]]) 

save(eb_list_interactions_2009, file="./data/final_data/regression_outputs/eb_list_interactions_2009_5_new.RData")
# Personal importance asked in 3 waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, pers_imp, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()

eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

eb_1 <- subset(eb_complete, surveyyear == 2009 | surveyyear == 2011)

# First empty model 
predictors <- c("time")
deps <- c("pers_imp")

eb_list_empty_pers_imp <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_empty_pers_imp[[1]]) 

save(eb_list_empty_pers_imp, file="./data/final_data/regression_outputs/eb_list_empty_pers_imp1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("pers_imp")

eb_list_preds_pers_imp <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_preds_pers_imp[[1]]) 

save(eb_list_preds_pers_imp, file="./data/final_data/regression_outputs/eb_list_preds_pers_imp1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_pers_imp <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_interactions_pers_imp[[1]]) 

save(eb_list_interactions_pers_imp, file="./data/final_data/regression_outputs/eb_list_interactions_pers_imp1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2014)

# First empty model 
predictors <- c("time")
deps <- c("pers_imp")

eb_list_empty_pers_imp <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_empty_pers_imp[[1]]) 

save(eb_list_empty_pers_imp, file="./data/final_data/regression_outputs/eb_list_empty_pers_imp2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("pers_imp")

eb_list_preds_pers_imp <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_preds_pers_imp[[1]]) 

save(eb_list_preds_pers_imp, file="./data/final_data/regression_outputs/eb_list_preds_pers_imp2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_pers_imp <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_interactions_pers_imp[[1]]) 

save(eb_list_interactions_pers_imp, file="./data/final_data/regression_outputs/eb_list_interactions_pers_imp2_new.RData")
# Questions about who does enough asked in 3 waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, doprot_natgov:doprot_citiz, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)
eb_1 <- subset(eb_complete, surveyyear == 2009 | surveyyear == 2014)

# First empty model 
predictors <- c("time")
deps <- c("doprot_natgov", "doprot_eu", "doprot_region", "doprot_comp", "doprot_citiz")

eb_list_empty_doprot <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_doprot[[i]] <- eb_fit
} 

summary(eb_list_empty_doprot[[1]]) 

save(eb_list_empty_doprot, file="./data/final_data/regression_outputs/eb_list_empty_doprot1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("doprot_natgov", "doprot_eu", "doprot_region", "doprot_comp", "doprot_citiz")

eb_list_preds_doprot <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_doprot[[i]] <- eb_fit
} 

summary(eb_list_preds_doprot[[1]]) 

save(eb_list_preds_doprot, file="./data/final_data/regression_outputs/eb_list_preds_doprot1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_doprot <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_doprot[[i]] <- eb_fit
} 

summary(eb_list_interactions_doprot[[1]]) 

save(eb_list_interactions_doprot, file="./data/final_data/regression_outputs/eb_list_interactions_doprot1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2014 | surveyyear == 2017)

# First empty model 
predictors <- c("time")
deps <- c("doprot_natgov", "doprot_eu", "doprot_region", "doprot_comp", "doprot_citiz")

eb_list_empty_doprot <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_doprot[[i]] <- eb_fit
} 

summary(eb_list_empty_doprot[[1]]) 

save(eb_list_empty_doprot, file="./data/final_data/regression_outputs/eb_list_empty_doprot2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("doprot_natgov", "doprot_eu", "doprot_region", "doprot_comp", "doprot_citiz")

eb_list_preds_doprot <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_doprot[[i]] <- eb_fit
} 

summary(eb_list_preds_doprot[[1]]) 

save(eb_list_preds_doprot, file="./data/final_data/regression_outputs/eb_list_preds_doprot2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_doprot <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_doprot[[i]] <- eb_fit
} 

summary(eb_list_interactions_doprot[[1]]) 

save(eb_list_interactions_doprot, file="./data/final_data/regression_outputs/eb_list_interactions_doprot2_new.RData")
# Questions about naming climate change a problem
eb_complete <- eb_tot %>% dplyr::select(surveyyear, cchange2, cchangetot, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

eb_1 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2013)

# First empty model 
predictors <- c("time")
deps <- c("cchange2", "cchangetot")

eb_list_empty_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_cchange2[[i]] <- eb_fit
} 

summary(eb_list_empty_cchange2[[1]]) 

save(eb_list_empty_cchange2, file="./data/final_data/regression_outputs/eb_list_empty_cchange2_1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cchange2", "cchangetot")

eb_list_preds_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_cchange2[[i]] <- eb_fit
} 

summary(eb_list_preds_cchange2[[1]]) 

save(eb_list_preds_cchange2, file="./data/final_data/regression_outputs/eb_list_preds_cchange2_1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_cchange2 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_cchange2[[i]] <- eb_fit
} 

summary(eb_list_interactions_cchange2[[1]]) 

save(eb_list_interactions_cchange2, file="./data/final_data/regression_outputs/eb_list_interactions_cchange2_1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2013 | surveyyear == 2015)

# First empty model 
predictors <- c("time")
deps <- c("cchange2", "cchangetot")

eb_list_empty_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_cchange2[[i]] <- eb_fit
} 

summary(eb_list_empty_cchange2[[1]]) 

save(eb_list_empty_cchange2, file="./data/final_data/regression_outputs/eb_list_empty_cchange2_2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cchange2", "cchangetot")

eb_list_preds_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_cchange2[[i]] <- eb_fit
} 

summary(eb_list_preds_cchange2[[1]]) 

save(eb_list_preds_cchange2, file="./data/final_data/regression_outputs/eb_list_preds_cchange2_2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_cchange2 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_cchange2[[i]] <- eb_fit
} 

summary(eb_list_interactions_cchange2[[1]]) 

save(eb_list_interactions_cchange2, file="./data/final_data/regression_outputs/eb_list_interactions_cchange2_2_new.RData")
# Third set
eb_3 <- subset(eb_complete, surveyyear == 2015 | surveyyear == 2017)

# First empty model 
predictors <- c("time")
deps <- c("cchange2", "cchangetot")

eb_list_empty_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_empty_cchange2[[i]] <- eb_fit
} 

summary(eb_list_empty_cchange2[[1]]) 

save(eb_list_empty_cchange2, file="./data/final_data/regression_outputs/eb_list_empty_cchange2_3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cchange2", "cchangetot")

eb_list_preds_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_preds_cchange2[[i]] <- eb_fit
} 

summary(eb_list_preds_cchange2[[1]]) 

save(eb_list_preds_cchange2, file="./data/final_data/regression_outputs/eb_list_preds_cchange2_3_new.RData")

# And the model with interactions
eb_3$age_time <- eb_3$age * eb_3$time
eb_3$sex_time <- as.numeric(eb_3$sex) * eb_3$time
eb_3 <- fastDummies::dummy_cols(eb_3, select_columns = "isced_cat")
eb_3$isced_basic_time <- eb_3$isced_cat_Basic * eb_3$time
eb_3$isced_intermediate_time <- eb_3$isced_cat_Intermediate * eb_3$time
eb_3$isced_advanced_time <- eb_3$isced_cat_Advanced * eb_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_cchange2 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_interactions_cchange2[[i]] <- eb_fit
} 

summary(eb_list_interactions_cchange2[[1]]) 

save(eb_list_interactions_cchange2, file="./data/final_data/regression_outputs/eb_list_interactions_cchange2_3_new.RData")
# Fourth set
eb_4 <- subset(eb_complete, surveyyear == 2017 | surveyyear == 2021)

# First empty model 
predictors <- c("time")
deps <- c("cchange2", "cchangetot")

eb_list_empty_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_4, weights = weightvec)
  
  eb_list_empty_cchange2[[i]] <- eb_fit
} 

summary(eb_list_empty_cchange2[[1]]) 

save(eb_list_empty_cchange2, file="./data/final_data/regression_outputs/eb_list_empty_cchange2_4.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cchange2", "cchangetot")

eb_list_preds_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_4, weights = weightvec)
  
  eb_list_preds_cchange2[[i]] <- eb_fit
} 

summary(eb_list_preds_cchange2[[1]]) 

save(eb_list_preds_cchange2, file="./data/final_data/regression_outputs/eb_list_preds_cchange2_4_new.RData")

# And the model with interactions
eb_4$age_time <- eb_4$age * eb_4$time
eb_4$sex_time <- as.numeric(eb_4$sex) * eb_4$time
eb_4 <- fastDummies::dummy_cols(eb_4, select_columns = "isced_cat")
eb_4$isced_basic_time <- eb_4$isced_cat_Basic * eb_4$time
eb_4$isced_intermediate_time <- eb_4$isced_cat_Intermediate * eb_4$time
eb_4$isced_advanced_time <- eb_4$isced_cat_Advanced * eb_4$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_cchange2 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_4, weights = weightvec)
  
  eb_list_interactions_cchange2[[i]] <- eb_fit
} 

summary(eb_list_interactions_cchange2[[1]]) 

save(eb_list_interactions_cchange2, file="./data/final_data/regression_outputs/eb_list_interactions_cchange2_4_new.RData")
# Question about personal action taken
eb_complete <- eb_tot %>% dplyr::select(surveyyear, prsaction, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)
eb_1 <- subset(eb_complete, surveyyear == 2011 | surveyyear == 2013)

# First empty model 
predictors <- c("time")
deps <- c("prsaction")

eb_list_empty_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_empty_prsaction[[i]] <- eb_fit
} 

summary(eb_list_empty_prsaction[[1]]) 

save(eb_list_empty_prsaction, file="./data/final_data/regression_outputs/eb_list_empty_prsaction1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("prsaction")

eb_list_preds_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_preds_prsaction[[i]] <- eb_fit
} 

summary(eb_list_preds_prsaction[[1]]) 

save(eb_list_preds_prsaction, file="./data/final_data/regression_outputs/eb_list_preds_prsaction1_new.RData")

# And the model with interactions
eb_1$age_time <- eb_1$age * eb_1$time
eb_1$sex_time <- as.numeric(eb_1$sex) * eb_1$time
eb_1 <- fastDummies::dummy_cols(eb_1, select_columns = "isced_cat")
eb_1$isced_basic_time <- eb_1$isced_cat_Basic * eb_1$time
eb_1$isced_intermediate_time <- eb_1$isced_cat_Intermediate * eb_1$time
eb_1$isced_advanced_time <- eb_1$isced_cat_Advanced * eb_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_prsaction <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_1, weights = weightvec)
  
  eb_list_interactions_prsaction[[i]] <- eb_fit
} 

summary(eb_list_interactions_prsaction[[1]]) 

save(eb_list_interactions_prsaction, file="./data/final_data/regression_outputs/eb_list_interactions_prsaction1_new.RData")
# Second set
eb_2 <- subset(eb_complete, surveyyear == 2013 | surveyyear == 2015)

# First empty model 
predictors <- c("time")
deps <- c("prsaction")

eb_list_empty_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_empty_prsaction[[i]] <- eb_fit
} 

summary(eb_list_empty_prsaction[[1]]) 

save(eb_list_empty_prsaction, file="./data/final_data/regression_outputs/eb_list_empty_prsaction2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("prsaction")

eb_list_preds_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_preds_prsaction[[i]] <- eb_fit
} 

summary(eb_list_preds_prsaction[[1]]) 

save(eb_list_preds_prsaction, file="./data/final_data/regression_outputs/eb_list_preds_prsaction2_new.RData")

# And the model with interactions
eb_2$age_time <- eb_2$age * eb_2$time
eb_2$sex_time <- as.numeric(eb_2$sex) * eb_2$time
eb_2 <- fastDummies::dummy_cols(eb_2, select_columns = "isced_cat")
eb_2$isced_basic_time <- eb_2$isced_cat_Basic * eb_2$time
eb_2$isced_intermediate_time <- eb_2$isced_cat_Intermediate * eb_2$time
eb_2$isced_advanced_time <- eb_2$isced_cat_Advanced * eb_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_prsaction <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_2, weights = weightvec)
  
  eb_list_interactions_prsaction[[i]] <- eb_fit
} 

summary(eb_list_interactions_prsaction[[1]]) 

save(eb_list_interactions_prsaction, file="./data/final_data/regression_outputs/eb_list_interactions_prsaction2_new.RData")
# Third set
eb_3 <- subset(eb_complete, surveyyear == 2015 | surveyyear == 2017)

# First empty model 
predictors <- c("time")
deps <- c("prsaction")

eb_list_empty_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_empty_prsaction[[i]] <- eb_fit
} 

summary(eb_list_empty_prsaction[[1]]) 

save(eb_list_empty_prsaction, file="./data/final_data/regression_outputs/eb_list_empty_prsaction3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("prsaction")

eb_list_preds_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_preds_prsaction[[i]] <- eb_fit
} 

summary(eb_list_preds_prsaction[[1]]) 

save(eb_list_preds_prsaction, file="./data/final_data/regression_outputs/eb_list_preds_prsaction3_new.RData")

# And the model with interactions
eb_3$age_time <- eb_3$age * eb_3$time
eb_3$sex_time <- as.numeric(eb_3$sex) * eb_3$time
eb_3 <- fastDummies::dummy_cols(eb_3, select_columns = "isced_cat")
eb_3$isced_basic_time <- eb_3$isced_cat_Basic * eb_3$time
eb_3$isced_intermediate_time <- eb_3$isced_cat_Intermediate * eb_3$time
eb_3$isced_advanced_time <- eb_3$isced_cat_Advanced * eb_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_prsaction <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_3, weights = weightvec)
  
  eb_list_interactions_prsaction[[i]] <- eb_fit
} 

summary(eb_list_interactions_prsaction[[1]]) 

save(eb_list_interactions_prsaction, file="./data/final_data/regression_outputs/eb_list_interactions_prsaction3_new.RData")

SOCON

# Repeat the same process for SOCON
load("./data/final_data/socontotal.RData")

socon_complete <- socontotal %>% drop_na()

socon_complete$time <- socon_complete$surveyyear - min(socon_complete$surveyyear)

socon_1 <- subset(socon_complete, surveyyear == 2020 | surveyyear == 2021)

predictors <- c("time")
deps <- c("fut_gen_socon")

socon_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresssoconn
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_1, weights = weightvec)
  
  socon_list_empty[[i]] <- socon_fit
} 

save(socon_list_empty, file="./data/final_data/regression_outputs/per_wave/socon_list_empty1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

socon_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresssoconn
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_1, weights = weightvec)
  
  socon_list_preds[[i]] <- socon_fit
} 

summary(socon_list_preds[[1]]) 

save(socon_list_preds, file="./data/final_data/regression_outputs/per_wave/socon_list_preds1_new.RData")

# Model with interactions
socon_1$age_time <- socon_1$age * socon_1$time
socon_1$sex_time <- as.numeric(socon_1$sex) * socon_1$time
socon_1 <- fastDummies::dummy_cols(socon_1, select_columns = "isced_cat")
socon_1$isced_basic_time <- socon_1$isced_cat_Basic * socon_1$time
socon_1$isced_intermediate_time <- socon_1$isced_cat_Intermediate * socon_1$time
socon_1$isced_advanced_time <- socon_1$isced_cat_Advanced * socon_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

socon_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regresssoconn
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_1, weights = weightvec)
  
  socon_list_interactions[[i]] <- socon_fit
} 

summary(socon_list_interactions[[1]]) 

save(socon_list_interactions, file="./data/final_data/regression_outputs/per_wave/socon_list_interactions1_new.RData")
# Repeat the same process for SOCON
socon_2 <- subset(socon_complete, surveyyear == 2021 | surveyyear == 2022)

predictors <- c("time")
deps <- c("fut_gen_socon")

socon_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresssoconn
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_2, weights = weightvec)
  
  socon_list_empty[[i]] <- socon_fit
} 

save(socon_list_empty, file="./data/final_data/regression_outputs/per_wave/socon_list_empty2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

socon_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresssoconn
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_2, weights = weightvec)
  
  socon_list_preds[[i]] <- socon_fit
} 

summary(socon_list_preds[[1]]) 

save(socon_list_preds, file="./data/final_data/regression_outputs/per_wave/socon_list_preds2_new.RData")

# Model with interactions
socon_2$age_time <- socon_2$age * socon_2$time
socon_2$sex_time <- as.numeric(socon_2$sex) * socon_2$time
socon_2 <- fastDummies::dummy_cols(socon_2, select_columns = "isced_cat")
socon_2$isced_basic_time <- socon_2$isced_cat_Basic * socon_2$time
socon_2$isced_intermediate_time <- socon_2$isced_cat_Intermediate * socon_2$time
socon_2$isced_advanced_time <- socon_2$isced_cat_Advanced * socon_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

socon_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regresssoconn
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_2, weights = weightvec)
  
  socon_list_interactions[[i]] <- socon_fit
} 

summary(socon_list_interactions[[1]]) 

save(socon_list_interactions, file="./data/final_data/regression_outputs/per_wave/socon_list_interactions2_new.RData")

LISS

# Repeat the same process for LISS
rm(list=ls())
load("./data/final_data/lisstotal.RData")

liss_complete <- lisstotal %>% drop_na()

liss_complete$time <- liss_complete$surveyyear - min(liss_complete$surveyyear)
table(liss_complete$surveyyear)

liss_1 <- subset(liss_complete, surveyyear == 2019 | surveyyear == 2020.58)

predictors <- c("time")
deps <- c("lifestyle")

liss_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_1, weights = weightvec)
  
  liss_list_empty[[i]] <- liss_fit
} 

save(liss_list_empty, file="./data/final_data/regression_outputs/per_wave/liss_list_empty1.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

liss_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_1, weights = weightvec)
  
  liss_list_preds[[i]] <- liss_fit
} 

summary(liss_list_preds[[1]]) 

save(liss_list_preds, file="./data/final_data/regression_outputs/per_wave/liss_list_preds1_new.RData")

# Model with interactions
liss_1$age_time <- liss_1$age * liss_1$time
liss_1$sex_time <- as.numeric(liss_1$sex) * liss_1$time
liss_1 <- fastDummies::dummy_cols(liss_1, select_columns = "isced_cat")
liss_1$isced_basic_time <- liss_1$isced_cat_Basic * liss_1$time
liss_1$isced_intermediate_time <- liss_1$isced_cat_Intermediate * liss_1$time
liss_1$isced_advanced_time <- liss_1$isced_cat_Advanced * liss_1$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

liss_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_1, weights = weightvec)
  
  liss_list_interactions[[i]] <- liss_fit
} 

summary(liss_list_interactions[[1]]) 

save(liss_list_interactions, file="./data/final_data/regression_outputs/per_wave/liss_list_interactions1_new.RData")
# Repeat the same process for LISS
table(liss_complete$surveyyear)

liss_2 <- subset(liss_complete, surveyyear == 2020.58 | surveyyear == 2020.83)

predictors <- c("time")
deps <- c("lifestyle")

liss_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_2, weights = weightvec)
  
  liss_list_empty[[i]] <- liss_fit
} 

save(liss_list_empty, file="./data/final_data/regression_outputs/per_wave/liss_list_empty2.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

liss_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_2, weights = weightvec)
  
  liss_list_preds[[i]] <- liss_fit
} 

summary(liss_list_preds[[1]]) 

save(liss_list_preds, file="./data/final_data/regression_outputs/per_wave/liss_list_preds2_new.RData")

# Model with interactions
liss_2$age_time <- liss_2$age * liss_2$time
liss_2$sex_time <- as.numeric(liss_2$sex) * liss_2$time
liss_2 <- fastDummies::dummy_cols(liss_2, select_columns = "isced_cat")
liss_2$isced_basic_time <- liss_2$isced_cat_Basic * liss_2$time
liss_2$isced_intermediate_time <- liss_2$isced_cat_Intermediate * liss_2$time
liss_2$isced_advanced_time <- liss_2$isced_cat_Advanced * liss_2$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

liss_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_2, weights = weightvec)
  
  liss_list_interactions[[i]] <- liss_fit
} 

summary(liss_list_interactions[[1]]) 

save(liss_list_interactions, file="./data/final_data/regression_outputs/per_wave/liss_list_interactions2_new.RData")
# Repeat the same process for LISS
table(liss_complete$surveyyear)

liss_3 <- subset(liss_complete, surveyyear == 2020.83 | surveyyear == 2021)

predictors <- c("time")
deps <- c("lifestyle")

liss_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_3, weights = weightvec)
  
  liss_list_empty[[i]] <- liss_fit
} 

save(liss_list_empty, file="./data/final_data/regression_outputs/per_wave/liss_list_empty3.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")

liss_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_3, weights = weightvec)
  
  liss_list_preds[[i]] <- liss_fit
} 

summary(liss_list_preds[[1]]) 

save(liss_list_preds, file="./data/final_data/regression_outputs/per_wave/liss_list_preds3_new.RData")

# Model with interactions
liss_3$age_time <- liss_3$age * liss_3$time
liss_3$sex_time <- as.numeric(liss_3$sex) * liss_3$time
liss_3 <- fastDummies::dummy_cols(liss_3, select_columns = "isced_cat")
liss_3$isced_basic_time <- liss_3$isced_cat_Basic * liss_3$time
liss_3$isced_intermediate_time <- liss_3$isced_cat_Intermediate * liss_3$time
liss_3$isced_advanced_time <- liss_3$isced_cat_Advanced * liss_3$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

liss_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regresslissn
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_3, weights = weightvec)
  
  liss_list_interactions[[i]] <- liss_fit
} 

summary(liss_list_interactions[[1]]) 

save(liss_list_interactions, file="./data/final_data/regression_outputs/per_wave/liss_list_interactions3_new.RData")
LS0tDQp0aXRsZTogIkdhbWxzcyByZWdyZXNzaW9ucyBzaG9ydGVyIHRpbWUgc3BhbnMiDQphdXRob3I6ICJBbnVzY2hrYSBQZWVsZW4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChldmFsID0gRkFMU0UpDQprbml0cjo6b3B0c19jaHVuayRzZXQobnVtYmVyX3NlY3Rpb25zID0gRkFMU0UpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0NCmBgYA0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KcHJlIHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQp9DQoNCnByZVtjbGFzc10gew0KICBtYXgtaGVpZ2h0OiAxMDBweDsNCn0NCmBgYA0KDQpJbiB0aGlzIHNjcmlwdCwgSSB1c2UgbG9vcHMgdG8gcGVyZm9ybSB3ZWlnaHRlZCBnYW1sc3MgcmVncmVzc2lvbnMgd2l0aCBzaG9ydGVyIHRpbWUgc3BhbnMsIHRvIHVzZSBhcyBhIHJvYnVzdG5lc3MgY2hlY2suDQoNCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpsaWJyYXJ5KGdhbWxzcykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoZmFzdER1bW1pZXMpDQpgYGANCg0KIyMgRVZTIHstfQ0KDQpgYGB7cn0NCmxvYWQoaGVyZSgiLi9kYXRhL2ZpbmFsX2RhdGEiLCAiZXZzc2VsLlJEYXRhIikpDQoNCiMgU2VsZWN0IHZhcmlhYmxlcyB3aXRob3V0IG1pc3NpbmdzIA0KZXZzX2NvbXBsZXRlIDwtIGV2c3NlbCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyOm1hcnN0YXQsIHdlaWdodHZlYywgaXNjZWRfY2F0KQ0KZXZzX2NvbXBsZXRlIDwtIGV2c19jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQpldnNfY29tcGxldGUkdGltZSA8LSBldnNfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihldnNfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBTdWJzZXQgdGhlIGRhdGEgc28gdGhhdCBJIG9ubHkgY2FsY3VsYXRlIHRoZSB0aW1lIGVmZmVjdCBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gd2F2ZXMNCmV2c18xIDwtIHN1YnNldChldnNfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMTk5MCB8IHN1cnZleXllYXIgPT0gMTk5OSkNCg0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiY2xpbWF0ZTUiKQ0KDQpldnNfbGlzdF9lbXB0eSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZXZzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGV2c18xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZXZzX2xpc3RfZW1wdHlbW2ldXSA8LSBldnNfZml0DQp9IA0KDQpzdW1tYXJ5KGV2c19saXN0X2VtcHR5W1sxXV0pICNTaWcgcG9zIGVmZmVjdCBvZiB0aW1lIG9uIGludGVyY2VwdA0KDQojIFNhdmUgaXQsIHRoZSAxIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGVmZmVjdA0Kc2F2ZShldnNfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2V2c19saXN0X2VtcHR5MS5SRGF0YSIpDQoNCiMgU2Vjb25kIG1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2xpbWF0ZTUiKQ0KDQpldnNfbGlzdF9wcmVkcyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZXZzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGV2c18xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZXZzX2xpc3RfcHJlZHNbW2ldXSA8LSBldnNfZml0DQp9IA0KDQpzdW1tYXJ5KGV2c19saXN0X3ByZWRzW1sxXV0pICNTaWcgcG9zIGVmZmVjdCBvZiB0aW1lIG9uIGludGVyY2VwdA0KDQpzYXZlKGV2c19saXN0X3ByZWRzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvZXZzX2xpc3RfcHJlZHMxX25ldy5SRGF0YSIpDQoNCiMgVGhpcmQgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiBlZmZlY3RzIGFzIHdlbGwNCmV2c18xJGFnZV90aW1lIDwtIGV2c18xJGFnZSAqIGV2c18xJHRpbWUNCmV2c18xJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZXZzXzEkc2V4KSAqIGV2c18xJHRpbWUNCmV2c18xIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGV2c18xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZXZzXzEkaXNjZWRfYmFzaWNfdGltZSA8LSBldnNfMSRpc2NlZF9jYXRfQmFzaWMgKiBldnNfMSR0aW1lDQpldnNfMSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBldnNfMSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZXZzXzEkdGltZQ0KZXZzXzEkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBldnNfMSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBldnNfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZXZzX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGV2c19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBldnNfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGV2c19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGV2c19maXQNCn0gDQoNCnN1bW1hcnkoZXZzX2xpc3RfaW50ZXJhY3Rpb25zW1sxXV0pIA0KDQpzYXZlKGV2c19saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2V2c19saXN0X2ludGVyYWN0aW9uczFfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBOb3cgdGhlIG90aGVyIHdhdmVzDQojIFNlbGVjdCB0aGUgc2Vjb25kIGFuZCB0aGlyZCB3YXZlIHRvIGNhbGN1bGF0ZSB0aGUgdGltZSBlZmZlY3QgYmV0d2VlbiB0aGVzZSB0d28NCmV2c18yIDwtIHN1YnNldChldnNfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMTk5OSB8IHN1cnZleXllYXIgPT0gMjAwOCkNCg0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiY2xpbWF0ZTUiKQ0KDQpldnNfbGlzdF9lbXB0eSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3JldnNpb24NCiAgZXZzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGV2c18yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZXZzX2xpc3RfZW1wdHlbW2ldXSA8LSBldnNfZml0DQp9IA0KDQpzdW1tYXJ5KGV2c19saXN0X2VtcHR5W1sxXV0pICNTaWcgcG9zIGVmZmVjdCBvZiB0aW1lIG9uIGludGVyY2VwdA0KDQpzYXZlKGV2c19saXN0X2VtcHR5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvZXZzX2xpc3RfZW1wdHkyLlJEYXRhIikNCg0KIyBTZWNvbmQgbW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJjbGltYXRlNSIpDQoNCmV2c19saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBldnNfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZXZzXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBldnNfbGlzdF9wcmVkc1tbaV1dIDwtIGV2c19maXQNCn0gDQoNCnN1bW1hcnkoZXZzX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUoZXZzX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9ldnNfbGlzdF9wcmVkczJfbmV3LlJEYXRhIikNCg0KIyBUaGlyZCBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZXZzXzIkYWdlX3RpbWUgPC0gZXZzXzIkYWdlICogZXZzXzIkdGltZQ0KZXZzXzIkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhldnNfMiRzZXgpICogZXZzXzIkdGltZQ0KZXZzXzIgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZXZzXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQpldnNfMiRpc2NlZF9iYXNpY190aW1lIDwtIGV2c18yJGlzY2VkX2NhdF9CYXNpYyAqIGV2c18yJHRpbWUNCmV2c18yJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGV2c18yJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBldnNfMiR0aW1lDQpldnNfMiRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGV2c18yJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGV2c18yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQpldnNfbGlzdF9pbnRlcmFjdGlvbnMgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZXZzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGV2c18yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZXZzX2xpc3RfaW50ZXJhY3Rpb25zW1tpXV0gPC0gZXZzX2ZpdA0KfSANCg0KDQpzdW1tYXJ5KGV2c19saXN0X2ludGVyYWN0aW9uc1tbMV1dKSANCg0Kc2F2ZShldnNfbGlzdF9pbnRlcmFjdGlvbnMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9ldnNfbGlzdF9pbnRlcmFjdGlvbnMyX25ldy5SRGF0YSIpDQpgYGANCg0KIyMgSSZPIFJlc2VhcmNoIHstfQ0KYGBge3J9DQojIFJlcGVhdCB0aGUgc2FtZSBwcm9jZXNzIGZvciBJJk8gcmVzZWFyY2gNCmxvYWQoaGVyZSgiLi9kYXRhL2ZpbmFsX2RhdGEiLCAiaW9fdG90YWwuUkRhdGEiKSkNCmlvX2NvbXBsZXRlIDwtIGlvX3RvdGFsICU+JSBkcGx5cjo6c2VsZWN0KHdvcnJpZWQ6c3VydmV5eWVhciwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQppb19jb21wbGV0ZSA9IHN1YnNldChpb19jb21wbGV0ZSwgc2VsZWN0ID0gLWModXJiYW4sSU9JTktPTUVOLCBJT1BPTDIwMTcpICkNCmlvX2NvbXBsZXRlIDwtIGlvX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCg0KaW9fY29tcGxldGUkdGltZSA8LSBpb19jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGlvX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCmlvXzEgPC0gc3Vic2V0KGlvX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTkgfCBzdXJ2ZXl5ZWFyID09IDIwMjApDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoIndvcnJpZWQiLCAiZnJvbnRydW5uZXIiLCAid29ycnlfZnV0dXJlIiwgInJlc3BfY2l0aXoiLCAiZGtfc3RhcnQiLCAiZG9fZ292IiwgImJ1c3NfaGVscCIsICJtaW5fY29udHIiLCAiaHVtYW5fcmVzcCIpDQoNCmlvX2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlvX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpb19saXN0X2VtcHR5W1tpXV0gPC0gaW9fZml0DQp9IA0KDQpzYXZlKGlvX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9pb19saXN0X2VtcHR5MS5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KDQppb19saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpb19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpb19saXN0X3ByZWRzW1tpXV0gPC0gaW9fZml0DQp9IA0KDQpzdW1tYXJ5KGlvX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUoaW9fbGlzdF9wcmVkcywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2lvX2xpc3RfcHJlZHMxX25ldy5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmlvXzEkYWdlX3RpbWUgPC0gaW9fMSRhZ2UgKiBpb18xJHRpbWUNCmlvXzEkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhpb18xJHNleCkgKiBpb18xJHRpbWUNCmlvXzEgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoaW9fMSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmlvXzEkaXNjZWRfYmFzaWNfdGltZSA8LSBpb18xJGlzY2VkX2NhdF9CYXNpYyAqIGlvXzEkdGltZQ0KaW9fMSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBpb18xJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBpb18xJHRpbWUNCmlvXzEkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBpb18xJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGlvXzEkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmlvX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlvX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpb19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGlvX2ZpdA0KfSANCg0Kc3VtbWFyeShpb19saXN0X2ludGVyYWN0aW9uc1tbMV1dKSANCg0Kc2F2ZShpb19saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2lvX2xpc3RfaW50ZXJhY3Rpb25zMV9uZXcuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBUaGUgb3RoZXIgd2F2ZXMNCmlvXzIgPC0gc3Vic2V0KGlvX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMjAgfCBzdXJ2ZXl5ZWFyID09IDIwMjIpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoIndvcnJpZWQiLCAiZnJvbnRydW5uZXIiLCAid29ycnlfZnV0dXJlIiwgInJlc3BfY2l0aXoiLCAiZGtfc3RhcnQiLCAiZG9fZ292IiwgImJ1c3NfaGVscCIsICJtaW5fY29udHIiLCAiaHVtYW5fcmVzcCIpDQoNCmlvX2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlvX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpb19saXN0X2VtcHR5W1tpXV0gPC0gaW9fZml0DQp9IA0KDQpzYXZlKGlvX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9pb19saXN0X2VtcHR5Mi5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KDQppb19saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpb19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpb19saXN0X3ByZWRzW1tpXV0gPC0gaW9fZml0DQp9IA0KDQpzdW1tYXJ5KGlvX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUoaW9fbGlzdF9wcmVkcywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2lvX2xpc3RfcHJlZHMyX25ldy5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmlvXzIkYWdlX3RpbWUgPC0gaW9fMiRhZ2UgKiBpb18yJHRpbWUNCmlvXzIkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhpb18yJHNleCkgKiBpb18yJHRpbWUNCmlvXzIgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoaW9fMiwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmlvXzIkaXNjZWRfYmFzaWNfdGltZSA8LSBpb18yJGlzY2VkX2NhdF9CYXNpYyAqIGlvXzIkdGltZQ0KaW9fMiRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBpb18yJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBpb18yJHRpbWUNCmlvXzIkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBpb18yJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGlvXzIkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmlvX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlvX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpb19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGlvX2ZpdA0KfSANCg0KDQpzdW1tYXJ5KGlvX2xpc3RfaW50ZXJhY3Rpb25zW1sxXV0pIA0KDQpzYXZlKGlvX2xpc3RfaW50ZXJhY3Rpb25zLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvaW9fbGlzdF9pbnRlcmFjdGlvbnMyX25ldy5SRGF0YSIpDQpgYGANCg0KIyMgSVNTUCB7LX0NCg0KYGBge3J9DQojIEFuZCB0aGUgc2FtZSBwcm9jZWR1cmUgZm9yIElTU1ANCnJtKGxpc3Q9bHMoKSkNCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL2lzc3B0b3RhbC5SZGF0YSIpDQppc3NwdG90YWwkc3VydmV5eWVhcltpcy5uYShpc3NwdG90YWwkc3VydmV5eWVhcildIDwtICIyMDEwIg0KaXNzcHRvdGFsJHN1cnZleXllYXIgPC0gYXMubnVtZXJpYyhpc3NwdG90YWwkc3VydmV5eWVhcikNCg0KIyBUaGUgaXNzcCBoYXMgdmFyaWFibGVzIHRoYXQgYXJlIGFza2VkIGluIGFsbCB0aHJlZSB3YXZlcywgYW5kIHZhcmlhYmxlcyB0aGF0IGFyZSBhc2tlZCBvbmx5IGluIDIgd2F2ZXMuIFNvIEkgaGF2ZSB0byBydW4gdGhlIGNvZGUgb24gc3Vic2V0cyBvZiB0aGUgZGF0YS4gRmlyc3QgSSBlc3RpbWF0ZSB0aGUgbW9kZWxzIGZvciB0aGUgc3RhdGVtZW50cyB0aGF0IGFyZSBhc2tlZCB0aHJvdWdob3V0IHRoZSB0aHJlZSB3YXZlcy4gVGhlIG9uZXMgdGhhdCBhcmUgYXNrZWQgdHdvIHdhdmVzIGRvbid0IGhhdmUgdG8gYmUgcnVuIGFnYWluLiANCmlzc3BfY29tcGxldGUgPC0gaXNzcHRvdGFsICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXI6bWFyc3RhdCwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQppc3NwX2NvbXBsZXRlIDwtIGlzc3BfY29tcGxldGUgJT4lIGRyb3BfbmEoKQ0KaXNzcF9jb21wbGV0ZSR0aW1lIDwtIGlzc3BfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihpc3NwX2NvbXBsZXRlJHN1cnZleXllYXIpDQppc3NwXzEgPC0gc3Vic2V0KGlzc3BfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMTk5MyB8IHN1cnZleXllYXIgPT0gMjAwMCkNCg0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygid29ycnkiLCAibGlmZWhhcm0iLCAid2lsbGluZ19wcmljZSIsICJ3aWxsaW5nX3RheCIsICJ3aWxsaW5nX2xpdmluZyIsICJkb19yaWdodCIsICJwcm9naGFybSIsICJlY29ucHJvdGVjdCIsICJwZW9wbGVfZGVjaWRlIikNCg0KaXNzcF9saXN0X2VtcHR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpc3NwX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpc3NwXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpc3NwX2xpc3RfZW1wdHlbW2ldXSA8LSBpc3NwX2ZpdA0KfSANCg0Kc2F2ZShpc3NwX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9pc3NwX2xpc3RfZW1wdHkxLlJEYXRhIikNCg0KIyBOb3cgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJ3b3JyeSIsICJsaWZlaGFybSIsICJ3aWxsaW5nX3ByaWNlIiwgIndpbGxpbmdfdGF4IiwgIndpbGxpbmdfbGl2aW5nIiwgImRvX3JpZ2h0IiwgInByb2doYXJtIiwgImVjb25wcm90ZWN0IiwgInBlb3BsZV9kZWNpZGUiICkNCg0KaXNzcF9saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpc3NwX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gaXNzcF8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgaXNzcF9saXN0X3ByZWRzW1tpXV0gPC0gaXNzcF9maXQNCn0gDQoNCnN1bW1hcnkoaXNzcF9saXN0X3ByZWRzW1syXV0pIA0Kc3VtbWFyeShpc3NwX2xpc3RfcHJlZHNbWzNdXSkgDQoNCnNhdmUoaXNzcF9saXN0X3ByZWRzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvaXNzcF9saXN0X3ByZWRzMV9uZXcuUkRhdGEiKQ0KDQojIEFuZCBub3cgaW50ZXJhY3Rpb25zDQppc3NwXzEkYWdlX3RpbWUgPC0gaXNzcF8xJGFnZSAqIGlzc3BfMSR0aW1lDQppc3NwXzEkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhpc3NwXzEkc2V4KSAqIGlzc3BfMSR0aW1lDQppc3NwXzEgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoaXNzcF8xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KaXNzcF8xJGlzY2VkX2Jhc2ljX3RpbWUgPC0gaXNzcF8xJGlzY2VkX2NhdF9CYXNpYyAqIGlzc3BfMSR0aW1lDQppc3NwXzEkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gaXNzcF8xJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBpc3NwXzEkdGltZQ0KaXNzcF8xJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gaXNzcF8xJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGlzc3BfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KaXNzcF9saXN0X2ludGVyYWN0aW9ucyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lzc3BuDQogIGlzc3BfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gaXNzcF8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgaXNzcF9saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUoaXNzcF9saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2lzc3BfbGlzdF9pbnRlcmFjdGlvbnMxX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgU2Vjb25kIHBhcnQNCmlzc3BfMiA8LSBzdWJzZXQoaXNzcF9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDAwIHwgc3VydmV5eWVhciA9PSAyMDEwKQ0KDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJ3b3JyeSIsICJsaWZlaGFybSIsICJ3aWxsaW5nX3ByaWNlIiwgIndpbGxpbmdfdGF4IiwgIndpbGxpbmdfbGl2aW5nIiwgImRvX3JpZ2h0IiwgInByb2doYXJtIiwgImVjb25wcm90ZWN0IiwgInBlb3BsZV9kZWNpZGUiKQ0KDQppc3NwX2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlzc3BfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlzc3BfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGlzc3BfbGlzdF9lbXB0eVtbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzYXZlKGlzc3BfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2lzc3BfbGlzdF9lbXB0eTIuUkRhdGEiKQ0KDQojIE5vdyB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoIndvcnJ5IiwgImxpZmVoYXJtIiwgIndpbGxpbmdfcHJpY2UiLCAid2lsbGluZ190YXgiLCAid2lsbGluZ19saXZpbmciLCAiZG9fcmlnaHQiLCAicHJvZ2hhcm0iLCAiZWNvbnByb3RlY3QiLCAicGVvcGxlX2RlY2lkZSIgKQ0KDQppc3NwX2xpc3RfcHJlZHMgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlzc3BfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpc3NwXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpc3NwX2xpc3RfcHJlZHNbW2ldXSA8LSBpc3NwX2ZpdA0KfSANCg0Kc2F2ZShpc3NwX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9pc3NwX2xpc3RfcHJlZHMyX25ldy5SRGF0YSIpDQoNCiMgQW5kIG5vdyBpbnRlcmFjdGlvbnMNCmlzc3BfMiRhZ2VfdGltZSA8LSBpc3NwXzIkYWdlICogaXNzcF8yJHRpbWUNCmlzc3BfMiRzZXhfdGltZSA8LSBhcy5udW1lcmljKGlzc3BfMiRzZXgpICogaXNzcF8yJHRpbWUNCmlzc3BfMiA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhpc3NwXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQppc3NwXzIkaXNjZWRfYmFzaWNfdGltZSA8LSBpc3NwXzIkaXNjZWRfY2F0X0Jhc2ljICogaXNzcF8yJHRpbWUNCmlzc3BfMiRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBpc3NwXzIkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGlzc3BfMiR0aW1lDQppc3NwXzIkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBpc3NwXzIkaXNjZWRfY2F0X0FkdmFuY2VkICogaXNzcF8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQppc3NwX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaXNzcG4NCiAgaXNzcF9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpc3NwXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpc3NwX2xpc3RfaW50ZXJhY3Rpb25zW1tpXV0gPC0gaXNzcF9maXQNCn0gDQoNCnN1bW1hcnkoaXNzcF9saXN0X2ludGVyYWN0aW9uc1tbMV1dKSANCg0Kc2F2ZShpc3NwX2xpc3RfaW50ZXJhY3Rpb25zLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvaXNzcF9saXN0X2ludGVyYWN0aW9uczJfbmV3LlJEYXRhIikNCg0KYGBgDQoNCiMjIEVCIHstfQ0KDQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkNCiMgTm93IHRoZSBtb3N0IGRpZmZpY3VsdCBvbmU6IEV1cm9iYXJvbWV0ZXIuIE5vIGl0ZW1zIGFyZSBhc2tlZCBzdGVhZGlseSB0aHJvdWdob3V0IHRpbWUsIHNvIGhhdmUgdG8gd29yayB3aXRoIGEgbG90IG9mIHN1YnNldHMuIA0KbG9hZCgiLi9kYXRhL2ZpbmFsX2RhdGEvZWJfdG90LlJEYXRhIikNCg0KIyBmaXJzdCAxOTg2IC0gMTk5NQ0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGVudl9lY19zdGF0LCBlbnZfcHJzaW1wLCBzZXgsIGlzY2VkOiB1cmJhbiwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQojIFJlbGlnaW9uIGlzIG9ubHkgYXNrZWQgaW4gb25lIHdhdmUNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KZWJfMSA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMTk4NiB8IHN1cnZleXllYXIgPT0gMTk5MikNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImVudl9lY19zdGF0IiwgImVudl9wcnNpbXAiKQ0KDQplYl9saXN0X2VtcHR5XzE5ODYgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMTk4NltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzE5ODZbWzFdXSkgDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfZW1wdHlfMTk4NiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfZW1wdHlfMTk4Nl8xLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImVudl9lY19zdGF0IiwgImVudl9wcnNpbXAiKQ0KDQplYl9saXN0X3ByZWRzXzE5ODYgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfMTk4NltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzE5ODZbWzFdXSkgDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfcHJlZHNfMTk4NiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfcHJlZHNfMTk4Nl8xX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMSRhZ2VfdGltZSA8LSBlYl8xJGFnZSAqIGViXzEkdGltZQ0KZWJfMSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzEkc2V4KSAqIGViXzEkdGltZQ0KZWJfMSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMSRpc2NlZF9iYXNpY190aW1lIDwtIGViXzEkaXNjZWRfY2F0X0Jhc2ljICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NiA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc18xOTg2W1sxXV0pIA0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc18xOTg2W1syXV0pDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfaW50ZXJhY3Rpb25zXzE5ODZfMS5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgU2Vjb25kIHBhcnQNCmViXzIgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDE5OTIgfCBzdXJ2ZXl5ZWFyID09IDE5OTUpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImVudl9lY19zdGF0IiwgImVudl9wcnNpbXAiKQ0KDQplYl9saXN0X2VtcHR5XzE5ODYgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMTk4NltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzE5ODZbWzFdXSkgDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfZW1wdHlfMTk4NiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfZW1wdHlfMTk4Nl8yLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImVudl9lY19zdGF0IiwgImVudl9wcnNpbXAiKQ0KDQplYl9saXN0X3ByZWRzXzE5ODYgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfMTk4NltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzE5ODZbWzFdXSkgDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfcHJlZHNfMTk4NiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfcHJlZHNfMTk4Nl8yX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMiRhZ2VfdGltZSA8LSBlYl8yJGFnZSAqIGViXzIkdGltZQ0KZWJfMiRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzIkc2V4KSAqIGViXzIkdGltZQ0KZWJfMiA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8yLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMiRpc2NlZF9iYXNpY190aW1lIDwtIGViXzIkaXNjZWRfY2F0X0Jhc2ljICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzIkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzIkdGltZQ0KZWJfMiRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzIkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMiR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KDQplYl9saXN0X2ludGVyYWN0aW9uc18xOTg2IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc18xOTg2W1tpXV0gPC0gZWJfZml0DQp9IA0KDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NltbMV1dKSANCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zXzE5ODYsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9lYl9saXN0X2ludGVyYWN0aW9uc18xOTg2XzIuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBOb3cgd2l0aCB0aGUgaW5mbHVlbmNlIG9mIGVudmlyb25tZW50IG9uIHF1YWxpdHkgb2YgbGlmZS4gVGhpcyBpcyBhc2tlZCA0IHRpbWVzLCBzbyBJIGhhdmUgdG8gbWFrZSAzIHN1YnNldHMuIA0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGVudl9xdWFsbGlmZSwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQojIExycGxhY2UgYW5kIGluY29tZSBhcmUgbm90IGFza2VkIGluIGFsbCB3YXZlcw0KDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQoNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQplYl8xIDwtIHN1YnNldChlYl9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDA0IHwgc3VydmV5eWVhciA9PSAyMDA3KQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZW52X3F1YWxsaWZlIikNCg0KZWJfbGlzdF9lbXB0eV9xdWFsbGlmZSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfcXVhbGxpZmVbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9xdWFsbGlmZVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X3F1YWxsaWZlLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvZWJfbGlzdF9lbXB0eV9xdWFsbGlmZTEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZW52X3F1YWxsaWZlIikNCg0KZWJfbGlzdF9wcmVkc19xdWFsbGlmZSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19xdWFsbGlmZVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX3F1YWxsaWZlW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfcXVhbGxpZmUsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9lYl9saXN0X3ByZWRzX3F1YWxsaWZlMV9uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzEkYWdlX3RpbWUgPC0gZWJfMSRhZ2UgKiBlYl8xJHRpbWUNCmViXzEkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8xJHNleCkgKiBlYl8xJHRpbWUNCmViXzEgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzEkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8xJGlzY2VkX2NhdF9CYXNpYyAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8xJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8xJHRpbWUNCmViXzEkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8xJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzEkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX3F1YWxsaWZlIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZVtbaV1dIDwtIGViX2ZpdA0KfSANCg0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX3F1YWxsaWZlW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zX3F1YWxsaWZlLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmUxX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgU2Vjb25kIHBhcnQNCmViXzIgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMDcgfCBzdXJ2ZXl5ZWFyID09IDIwMTEpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImVudl9xdWFsbGlmZSIpDQoNCmViX2xpc3RfZW1wdHlfcXVhbGxpZmUgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5X3F1YWxsaWZlW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfcXVhbGxpZmVbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV9xdWFsbGlmZSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfZW1wdHlfcXVhbGxpZmUyLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImVudl9xdWFsbGlmZSIpDQoNCmViX2xpc3RfcHJlZHNfcXVhbGxpZmUgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfcXVhbGxpZmVbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19xdWFsbGlmZVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX3F1YWxsaWZlLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvZWJfbGlzdF9wcmVkc19xdWFsbGlmZTJfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8yJGFnZV90aW1lIDwtIGViXzIkYWdlICogZWJfMiR0aW1lDQplYl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMiRzZXgpICogZWJfMiR0aW1lDQplYl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQmFzaWMgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZSA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2Vibg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmVbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmVbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmUsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9lYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZTJfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBBbmQgdGhlIHRoaXJkIHNldA0KZWJfMyA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxMSB8IHN1cnZleXllYXIgPT0gMjAxNCkNCg0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZW52X3F1YWxsaWZlIikNCg0KZWJfbGlzdF9lbXB0eV9xdWFsbGlmZSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfcXVhbGxpZmVbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9xdWFsbGlmZVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X3F1YWxsaWZlLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvZWJfbGlzdF9lbXB0eV9xdWFsbGlmZTMuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZW52X3F1YWxsaWZlIikNCg0KZWJfbGlzdF9wcmVkc19xdWFsbGlmZSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8zLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19xdWFsbGlmZVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX3F1YWxsaWZlW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfcXVhbGxpZmUsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9lYl9saXN0X3ByZWRzX3F1YWxsaWZlM19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzMkYWdlX3RpbWUgPC0gZWJfMyRhZ2UgKiBlYl8zJHRpbWUNCmViXzMkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8zJHNleCkgKiBlYl8zJHRpbWUNCmViXzMgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMywgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzMkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9CYXNpYyAqIGViXzMkdGltZQ0KZWJfMyRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8zJHRpbWUNCmViXzMkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzMkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX3F1YWxsaWZlIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzZWJuDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2ViX2xpc3RfaW50ZXJhY3Rpb25zX3F1YWxsaWZlM19uZXcuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBOb3cgMiBzdGF0ZW1lbnRzIHRoYXQgYXJlIGFza2VkIDQgdGltZXMNCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCByb2xlX2luZCwgYmlnX3BvbCwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCmViXzEgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMDcgfCBzdXJ2ZXl5ZWFyID09IDIwMTEpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJyb2xlX2luZCIsICJiaWdfcG9sIikNCg0KZWJfbGlzdF9lbXB0eV8yMDA3IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV8yMDA3W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfMjAwN1tbMl1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5XzIwMDcsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5XzIwMDdfMS5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJyb2xlX2luZCIsICJiaWdfcG9sIikNCg0KZWJfbGlzdF9wcmVkc18yMDA3IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc18yMDA3W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfMjAwN1tbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzXzIwMDcsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzXzIwMDdfMV9uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzEkYWdlX3RpbWUgPC0gZWJfMSRhZ2UgKiBlYl8xJHRpbWUNCmViXzEkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8xJHNleCkgKiBlYl8xJHRpbWUNCmViXzEgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzEkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8xJGlzY2VkX2NhdF9CYXNpYyAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8xJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8xJHRpbWUNCmViXzEkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8xJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzEkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDcgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3NlYm4NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwN1tbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA3LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwN18xX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgU2Vjb25kIHNldA0KZWJfMiA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxMSB8IHN1cnZleXllYXIgPT0gMjAxNCkNCg0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygicm9sZV9pbmQiLCAiYmlnX3BvbCIpDQoNCmViX2xpc3RfZW1wdHlfMjAwNyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAwN1tbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMDdbWzJdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDA3LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDA3XzIuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygicm9sZV9pbmQiLCAiYmlnX3BvbCIpDQoNCmViX2xpc3RfcHJlZHNfMjAwNyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfMjAwN1tbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzIwMDdbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc18yMDA3LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc18yMDA3XzJfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8yJGFnZV90aW1lIDwtIGViXzIkYWdlICogZWJfMiR0aW1lDQplYl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMiRzZXgpICogZWJfMiR0aW1lDQplYl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQmFzaWMgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc18yMDA3IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzZWJuDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc18yMDA3W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwNywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdfMl9uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFRoaXJkIHNldA0KZWJfMyA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxNCB8IHN1cnZleXllYXIgPT0gMjAxNykNCg0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygicm9sZV9pbmQiLCAiYmlnX3BvbCIpDQoNCmViX2xpc3RfZW1wdHlfMjAwNyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAwN1tbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMDdbWzJdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDA3LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDA3XzMuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygicm9sZV9pbmQiLCAiYmlnX3BvbCIpDQoNCmViX2xpc3RfcHJlZHNfMjAwNyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfMjAwN1tbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzIwMDdbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc18yMDA3LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc18yMDA3XzNfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8zJGFnZV90aW1lIDwtIGViXzMkYWdlICogZWJfMyR0aW1lDQplYl8zJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMyRzZXgpICogZWJfMyR0aW1lDQplYl8zIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzMsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8zJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMyRpc2NlZF9jYXRfQmFzaWMgKiBlYl8zJHRpbWUNCmViXzMkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMyRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMyR0aW1lDQplYl8zJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMyRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8zJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc18yMDA3IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzZWJuDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc18yMDA3W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwNywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdfM19uZXcuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBTdGF0ZW1lbnQgYWJvdXQgd2lsbGluZ25lc3MgdG8gYnV5IG1vcmUgZXhwZW5zaXZlIHByb2R1Y3RzIHRoYXQgYXJlIGVudmlyb25tZW50YWxseSBmcmllbmRseQ0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGJ1eXByb2QsIHNleCwgaXNjZWQsIHVyYmFuLCBhZ2UsIHdlaWdodHZlYywgaXNjZWRfY2F0KQ0KZWJfY29tcGxldGUgPC0gZWJfY29tcGxldGUgJT4lIGRyb3BfbmEoKQ0KZWJfY29tcGxldGUkdGltZSA8LSBlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGViX2NvbXBsZXRlJHN1cnZleXllYXIpDQplYl8xIDwtIHN1YnNldChlYl9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDA3fCBzdXJ2ZXl5ZWFyID09IDIwMTEpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJidXlwcm9kIikNCg0KZWJfbGlzdF9lbXB0eV9idXlwcm9kIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9idXlwcm9kW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfYnV5cHJvZFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X2J1eXByb2QsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X2J1eXByb2QxLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImJ1eXByb2QiKQ0KDQplYl9saXN0X3ByZWRzX2J1eXByb2QgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2J1eXByb2RbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19idXlwcm9kW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfYnV5cHJvZCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfYnV5cHJvZDFfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8xJGFnZV90aW1lIDwtIGViXzEkYWdlICogZWJfMSR0aW1lDQplYl8xJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMSRzZXgpICogZWJfMSR0aW1lDQplYl8xIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzEsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8xJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfQmFzaWMgKiBlYl8xJHRpbWUNCmViXzEkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8xJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kW1tpXV0gPC0gZWJfZml0DQp9IA0KDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZDFfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBTZWNvbmQgc2V0DQplYl8yIDwtIHN1YnNldChlYl9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDExfCBzdXJ2ZXl5ZWFyID09IDIwMTQpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJidXlwcm9kIikNCg0KZWJfbGlzdF9lbXB0eV9idXlwcm9kIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9idXlwcm9kW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfYnV5cHJvZFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X2J1eXByb2QsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X2J1eXByb2QyLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImJ1eXByb2QiKQ0KDQplYl9saXN0X3ByZWRzX2J1eXByb2QgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2J1eXByb2RbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19idXlwcm9kW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfYnV5cHJvZCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfYnV5cHJvZDJfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8yJGFnZV90aW1lIDwtIGViXzIkYWdlICogZWJfMiR0aW1lDQplYl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMiRzZXgpICogZWJfMiR0aW1lDQplYl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQmFzaWMgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kW1tpXV0gPC0gZWJfZml0DQp9IA0KDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZDJfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBBZmZlY3RlZCBkYWlseQ0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGVmZl9kYWlseSwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCmViXzEgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMDcgfCBzdXJ2ZXl5ZWFyID09IDIwMTEpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJlZmZfZGFpbHkiKQ0KDQplYl9saXN0X2VtcHR5X2VmZl9kYWlseSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9lZmZfZGFpbHkxLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImVmZl9kYWlseSIpDQoNCmViX2xpc3RfcHJlZHNfZWZmX2RhaWx5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19lZmZfZGFpbHlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19lZmZfZGFpbHlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19lZmZfZGFpbHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX2VmZl9kYWlseTFfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8xJGFnZV90aW1lIDwtIGViXzEkYWdlICogZWJfMSR0aW1lDQplYl8xJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMSRzZXgpICogZWJfMSR0aW1lDQplYl8xIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzEsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8xJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfQmFzaWMgKiBlYl8xJHRpbWUNCmViXzEkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8xJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHkgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2VmZl9kYWlseVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5MV9uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFNlY29uZCBzZXQNCmViXzIgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTEgfCBzdXJ2ZXl5ZWFyID09IDIwMTQpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJlZmZfZGFpbHkiKQ0KDQplYl9saXN0X2VtcHR5X2VmZl9kYWlseSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9lZmZfZGFpbHkyLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImVmZl9kYWlseSIpDQoNCmViX2xpc3RfcHJlZHNfZWZmX2RhaWx5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19lZmZfZGFpbHlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19lZmZfZGFpbHlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19lZmZfZGFpbHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX2VmZl9kYWlseTJfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8yJGFnZV90aW1lIDwtIGViXzIkYWdlICogZWJfMiR0aW1lDQplYl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMiRzZXgpICogZWJfMiR0aW1lDQplYl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQmFzaWMgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHkgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2VmZl9kYWlseVtbaV1dIDwtIGViX2ZpdA0KfSANCg0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX2VmZl9kYWlseVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHkyX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgVGhpcmQgc2V0DQplYl8zIDwtIHN1YnNldChlYl9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDE0IHwgc3VydmV5eWVhciA9PSAyMDE3KQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZWZmX2RhaWx5IikNCg0KZWJfbGlzdF9lbXB0eV9lZmZfZGFpbHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5X2VmZl9kYWlseVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X2VmZl9kYWlseVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X2VmZl9kYWlseSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfZWZmX2RhaWx5My5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJlZmZfZGFpbHkiKQ0KDQplYl9saXN0X3ByZWRzX2VmZl9kYWlseSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfZWZmX2RhaWx5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfZWZmX2RhaWx5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc19lZmZfZGFpbHkzX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMyRhZ2VfdGltZSA8LSBlYl8zJGFnZSAqIGViXzMkdGltZQ0KZWJfMyRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzMkc2V4KSAqIGViXzMkdGltZQ0KZWJfMyA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8zLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMyRpc2NlZF9iYXNpY190aW1lIDwtIGViXzMkaXNjZWRfY2F0X0Jhc2ljICogZWJfMyR0aW1lDQplYl8zJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzMkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzMkdGltZQ0KZWJfMyRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzMkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMyR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5M19uZXcuUkRhdGEiKQ0KDQpgYGANCg0KYGBge3J9DQojIENsaW1hdGUgY2hhbmdlIHBlcmNlcHRpb24gYXNrZWQgaW4gc2l4IHdhdmVzLCBzbyBoYXZlIHRvIHVzZSA1IHN1YnNldHMNCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCBjY3BlcmNlcHQsIGNjaGFuZ2UsIHNleCwgaXNjZWQsIHVyYmFuLCBhZ2UsIHdlaWdodHZlYywgaXNjZWRfY2F0KQ0KZWJfY29tcGxldGUgPC0gZWJfY29tcGxldGUgJT4lIGRyb3BfbmEoKQ0KZWJfY29tcGxldGUkdGltZSA8LSBlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGViX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCg0KZWJfMSA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAwOSB8IHN1cnZleXllYXIgPT0gMjAxMSkNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJjY3BlcmNlcHQiLCAiY2NoYW5nZSIpDQoNCmViX2xpc3RfZW1wdHlfMjAwOSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAwOVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMDlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDA5XzEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2NwZXJjZXB0IiwgImNjaGFuZ2UiKQ0KDQplYl9saXN0X3ByZWRzXzIwMDkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzXzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc18yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfMjAwOSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfMjAwOV8xX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMSRhZ2VfdGltZSA8LSBlYl8xJGFnZSAqIGViXzEkdGltZQ0KZWJfMSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzEkc2V4KSAqIGViXzEkdGltZQ0KZWJfMSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMSRpc2NlZF9iYXNpY190aW1lIDwtIGViXzEkaXNjZWRfY2F0X0Jhc2ljICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOSA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc18yMDA5XzFfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBTZWNvbmQgc2V0IA0KZWJfMiA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxMSB8IHN1cnZleXllYXIgPT0gMjAxMykNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJjY3BlcmNlcHQiLCAiY2NoYW5nZSIpDQoNCmViX2xpc3RfZW1wdHlfMjAwOSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAwOVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMDlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDA5XzIuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2NwZXJjZXB0IiwgImNjaGFuZ2UiKQ0KDQplYl9saXN0X3ByZWRzXzIwMDkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzXzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc18yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfMjAwOSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfMjAwOV8yX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMiRhZ2VfdGltZSA8LSBlYl8yJGFnZSAqIGViXzIkdGltZQ0KZWJfMiRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzIkc2V4KSAqIGViXzIkdGltZQ0KZWJfMiA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8yLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMiRpc2NlZF9iYXNpY190aW1lIDwtIGViXzIkaXNjZWRfY2F0X0Jhc2ljICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzIkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzIkdGltZQ0KZWJfMiRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzIkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMiR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KDQplYl9saXN0X2ludGVyYWN0aW9uc18yMDA5IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc18yMDA5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDlfMl9uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFRoaXJkIHNldCANCmViXzMgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTMgfCBzdXJ2ZXl5ZWFyID09IDIwMTUpDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiY2NwZXJjZXB0IiwgImNjaGFuZ2UiKQ0KDQplYl9saXN0X2VtcHR5XzIwMDkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5XzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV8yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfMjAwOSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfMjAwOV8zLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNjcGVyY2VwdCIsICJjY2hhbmdlIikNCg0KZWJfbGlzdF9wcmVkc18yMDA5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8zLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc18yMDA5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfMjAwOVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzXzIwMDksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzXzIwMDlfM19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzMkYWdlX3RpbWUgPC0gZWJfMyRhZ2UgKiBlYl8zJHRpbWUNCmViXzMkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8zJHNleCkgKiBlYl8zJHRpbWUNCmViXzMgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMywgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzMkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9CYXNpYyAqIGViXzMkdGltZQ0KZWJfMyRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8zJHRpbWUNCmViXzMkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzMkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDkgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOV8zX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgRm91cnRoIHNldA0KZWJfNCA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxNSB8IHN1cnZleXllYXIgPT0gMjAxNykNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJjY3BlcmNlcHQiLCAiY2NoYW5nZSIpDQoNCmViX2xpc3RfZW1wdHlfMjAwOSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfNCwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAwOVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMDlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDA5XzQuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2NwZXJjZXB0IiwgImNjaGFuZ2UiKQ0KDQplYl9saXN0X3ByZWRzXzIwMDkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzQsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzXzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc18yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfMjAwOSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfMjAwOV80X25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfNCRhZ2VfdGltZSA8LSBlYl80JGFnZSAqIGViXzQkdGltZQ0KZWJfNCRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzQkc2V4KSAqIGViXzQkdGltZQ0KZWJfNCA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl80LCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfNCRpc2NlZF9iYXNpY190aW1lIDwtIGViXzQkaXNjZWRfY2F0X0Jhc2ljICogZWJfNCR0aW1lDQplYl80JGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzQkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzQkdGltZQ0KZWJfNCRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzQkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfNCR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOSA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl80LCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc18yMDA5XzRfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBGaWZ0aCBzZXQNCmViXzUgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTcgfCBzdXJ2ZXl5ZWFyID09IDIwMjEpDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiY2NwZXJjZXB0IiwgImNjaGFuZ2UiKQ0KDQplYl9saXN0X2VtcHR5XzIwMDkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5XzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV8yMDA5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfMjAwOSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfMjAwOV81LlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNjcGVyY2VwdCIsICJjY2hhbmdlIikNCg0KZWJfbGlzdF9wcmVkc18yMDA5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl81LCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc18yMDA5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfMjAwOVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzXzIwMDksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzXzIwMDlfNV9uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzUkYWdlX3RpbWUgPC0gZWJfNSRhZ2UgKiBlYl81JHRpbWUNCmViXzUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl81JHNleCkgKiBlYl81JHRpbWUNCmViXzUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfNSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzUkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl81JGlzY2VkX2NhdF9CYXNpYyAqIGViXzUkdGltZQ0KZWJfNSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl81JGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl81JHRpbWUNCmViXzUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl81JGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDkgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfNSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOV81X25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIFBlcnNvbmFsIGltcG9ydGFuY2UgYXNrZWQgaW4gMyB3YXZlcw0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIHBlcnNfaW1wLCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCg0KZWJfY29tcGxldGUkdGltZSA8LSBlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGViX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCmViXzEgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMDkgfCBzdXJ2ZXl5ZWFyID09IDIwMTEpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJwZXJzX2ltcCIpDQoNCmViX2xpc3RfZW1wdHlfcGVyc19pbXAgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfcGVyc19pbXBbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9wZXJzX2ltcFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X3BlcnNfaW1wLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9wZXJzX2ltcDEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygicGVyc19pbXAiKQ0KDQplYl9saXN0X3ByZWRzX3BlcnNfaW1wIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX3BlcnNfaW1wW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfcGVyc19pbXBbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19wZXJzX2ltcCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfcGVyc19pbXAxX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMSRhZ2VfdGltZSA8LSBlYl8xJGFnZSAqIGViXzEkdGltZQ0KZWJfMSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzEkc2V4KSAqIGViXzEkdGltZQ0KZWJfMSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMSRpc2NlZF9iYXNpY190aW1lIDwtIGViXzEkaXNjZWRfY2F0X0Jhc2ljICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXAgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX3BlcnNfaW1wW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX3BlcnNfaW1wW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zX3BlcnNfaW1wLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXAxX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgU2Vjb25kIHNldA0KZWJfMiA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxMSB8IHN1cnZleXllYXIgPT0gMjAxNCkNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoInBlcnNfaW1wIikNCg0KZWJfbGlzdF9lbXB0eV9wZXJzX2ltcCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9wZXJzX2ltcFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X3BlcnNfaW1wW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfcGVyc19pbXAsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X3BlcnNfaW1wMi5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJwZXJzX2ltcCIpDQoNCmViX2xpc3RfcHJlZHNfcGVyc19pbXAgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfcGVyc19pbXBbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19wZXJzX2ltcFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX3BlcnNfaW1wLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc19wZXJzX2ltcDJfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8yJGFnZV90aW1lIDwtIGViXzIkYWdlICogZWJfMiR0aW1lDQplYl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMiRzZXgpICogZWJfMiR0aW1lDQplYl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQmFzaWMgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19wZXJzX2ltcCA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXBbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXBbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXAsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19wZXJzX2ltcDJfbmV3LlJEYXRhIikNCg0KYGBgDQoNCmBgYHtyfQ0KIyBRdWVzdGlvbnMgYWJvdXQgd2hvIGRvZXMgZW5vdWdoIGFza2VkIGluIDMgd2F2ZXMNCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCBkb3Byb3RfbmF0Z292OmRvcHJvdF9jaXRpeiwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCmViXzEgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMDkgfCBzdXJ2ZXl5ZWFyID09IDIwMTQpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJkb3Byb3RfbmF0Z292IiwgImRvcHJvdF9ldSIsICJkb3Byb3RfcmVnaW9uIiwgImRvcHJvdF9jb21wIiwgImRvcHJvdF9jaXRpeiIpDQoNCmViX2xpc3RfZW1wdHlfZG9wcm90IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9kb3Byb3RbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9kb3Byb3RbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV9kb3Byb3QsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X2RvcHJvdDEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZG9wcm90X25hdGdvdiIsICJkb3Byb3RfZXUiLCAiZG9wcm90X3JlZ2lvbiIsICJkb3Byb3RfY29tcCIsICJkb3Byb3RfY2l0aXoiKQ0KDQplYl9saXN0X3ByZWRzX2RvcHJvdCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfZG9wcm90W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfZG9wcm90W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfZG9wcm90LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc19kb3Byb3QxX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMSRhZ2VfdGltZSA8LSBlYl8xJGFnZSAqIGViXzEkdGltZQ0KZWJfMSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzEkc2V4KSAqIGViXzEkdGltZQ0KZWJfMSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMSRpc2NlZF9iYXNpY190aW1lIDwtIGViXzEkaXNjZWRfY2F0X0Jhc2ljICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfZG9wcm90IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19kb3Byb3RbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfZG9wcm90W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdDFfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBTZWNvbmQgc2V0DQplYl8yIDwtIHN1YnNldChlYl9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDE0IHwgc3VydmV5eWVhciA9PSAyMDE3KQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZG9wcm90X25hdGdvdiIsICJkb3Byb3RfZXUiLCAiZG9wcm90X3JlZ2lvbiIsICJkb3Byb3RfY29tcCIsICJkb3Byb3RfY2l0aXoiKQ0KDQplYl9saXN0X2VtcHR5X2RvcHJvdCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfZG9wcm90W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfZG9wcm90W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfZG9wcm90LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9kb3Byb3QyLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImRvcHJvdF9uYXRnb3YiLCAiZG9wcm90X2V1IiwgImRvcHJvdF9yZWdpb24iLCAiZG9wcm90X2NvbXAiLCAiZG9wcm90X2NpdGl6IikNCg0KZWJfbGlzdF9wcmVkc19kb3Byb3QgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2RvcHJvdFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX2RvcHJvdFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX2RvcHJvdCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfZG9wcm90Ml9uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzIkYWdlX3RpbWUgPC0gZWJfMiRhZ2UgKiBlYl8yJHRpbWUNCmViXzIkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8yJHNleCkgKiBlYl8yJHRpbWUNCmViXzIgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMiwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzIkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8yJGlzY2VkX2NhdF9CYXNpYyAqIGViXzIkdGltZQ0KZWJfMiRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8yJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8yJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzIkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdCA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfZG9wcm90W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19kb3Byb3QsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19kb3Byb3QyX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgUXVlc3Rpb25zIGFib3V0IG5hbWluZyBjbGltYXRlIGNoYW5nZSBhIHByb2JsZW0NCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCBjY2hhbmdlMiwgY2NoYW5nZXRvdCwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCg0KZWJfMSA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxMSB8IHN1cnZleXllYXIgPT0gMjAxMykNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImNjaGFuZ2UyIiwgImNjaGFuZ2V0b3QiKQ0KDQplYl9saXN0X2VtcHR5X2NjaGFuZ2UyIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9jY2hhbmdlMltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X2NjaGFuZ2UyW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfY2NoYW5nZTIsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X2NjaGFuZ2UyXzEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2NoYW5nZTIiLCAiY2NoYW5nZXRvdCIpDQoNCmViX2xpc3RfcHJlZHNfY2NoYW5nZTIgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfY2NoYW5nZTJbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19jY2hhbmdlMltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX2NjaGFuZ2UyLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc19jY2hhbmdlMl8xX25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfMSRhZ2VfdGltZSA8LSBlYl8xJGFnZSAqIGViXzEkdGltZQ0KZWJfMSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViXzEkc2V4KSAqIGViXzEkdGltZQ0KZWJfMSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl8xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfMSRpc2NlZF9iYXNpY190aW1lIDwtIGViXzEkaXNjZWRfY2F0X0Jhc2ljICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViXzEkdGltZQ0KZWJfMSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViXzEkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfY2NoYW5nZTIgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfY2NoYW5nZTJfMV9uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFNlY29uZCBzZXQNCmViXzIgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTMgfCBzdXJ2ZXl5ZWFyID09IDIwMTUpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJjY2hhbmdlMiIsICJjY2hhbmdldG90IikNCg0KZWJfbGlzdF9lbXB0eV9jY2hhbmdlMiA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfY2NoYW5nZTJbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9jY2hhbmdlMltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X2NjaGFuZ2UyLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9jY2hhbmdlMl8yLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNjaGFuZ2UyIiwgImNjaGFuZ2V0b3QiKQ0KDQplYl9saXN0X3ByZWRzX2NjaGFuZ2UyIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2NjaGFuZ2UyW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfY2NoYW5nZTJbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfY2NoYW5nZTJfMl9uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzIkYWdlX3RpbWUgPC0gZWJfMiRhZ2UgKiBlYl8yJHRpbWUNCmViXzIkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8yJHNleCkgKiBlYl8yJHRpbWUNCmViXzIgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMiwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzIkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8yJGlzY2VkX2NhdF9CYXNpYyAqIGViXzIkdGltZQ0KZWJfMiRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8yJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8yJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzIkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyXzJfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBUaGlyZCBzZXQNCmViXzMgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTUgfCBzdXJ2ZXl5ZWFyID09IDIwMTcpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJjY2hhbmdlMiIsICJjY2hhbmdldG90IikNCg0KZWJfbGlzdF9lbXB0eV9jY2hhbmdlMiA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfY2NoYW5nZTJbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9jY2hhbmdlMltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X2NjaGFuZ2UyLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9jY2hhbmdlMl8zLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNjaGFuZ2UyIiwgImNjaGFuZ2V0b3QiKQ0KDQplYl9saXN0X3ByZWRzX2NjaGFuZ2UyIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2NjaGFuZ2UyW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfY2NoYW5nZTJbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfY2NoYW5nZTJfM19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzMkYWdlX3RpbWUgPC0gZWJfMyRhZ2UgKiBlYl8zJHRpbWUNCmViXzMkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8zJHNleCkgKiBlYl8zJHRpbWUNCmViXzMgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMywgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzMkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9CYXNpYyAqIGViXzMkdGltZQ0KZWJfMyRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8zJHRpbWUNCmViXzMkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzMkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyXzNfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBGb3VydGggc2V0DQplYl80IDwtIHN1YnNldChlYl9jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDE3IHwgc3VydmV5eWVhciA9PSAyMDIxKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiY2NoYW5nZTIiLCAiY2NoYW5nZXRvdCIpDQoNCmViX2xpc3RfZW1wdHlfY2NoYW5nZTIgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzQsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5X2NjaGFuZ2UyW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfY2NoYW5nZTJbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV9jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfY2NoYW5nZTJfNC5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJjY2hhbmdlMiIsICJjY2hhbmdldG90IikNCg0KZWJfbGlzdF9wcmVkc19jY2hhbmdlMiA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl80LCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19jY2hhbmdlMltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX2NjaGFuZ2UyW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfY2NoYW5nZTIsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX2NjaGFuZ2UyXzRfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl80JGFnZV90aW1lIDwtIGViXzQkYWdlICogZWJfNCR0aW1lDQplYl80JHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfNCRzZXgpICogZWJfNCR0aW1lDQplYl80IDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzQsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl80JGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfNCRpc2NlZF9jYXRfQmFzaWMgKiBlYl80JHRpbWUNCmViXzQkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfNCRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfNCR0aW1lDQplYl80JGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfNCRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl80JHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMiA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl80LCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfY2NoYW5nZTJbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfY2NoYW5nZTJbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfY2NoYW5nZTIsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMl80X25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIFF1ZXN0aW9uIGFib3V0IHBlcnNvbmFsIGFjdGlvbiB0YWtlbg0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIHByc2FjdGlvbiwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCmViXzEgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTEgfCBzdXJ2ZXl5ZWFyID09IDIwMTMpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJwcnNhY3Rpb24iKQ0KDQplYl9saXN0X2VtcHR5X3Byc2FjdGlvbiA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfcHJzYWN0aW9uW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfcHJzYWN0aW9uW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfcHJzYWN0aW9uLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb24xLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoInByc2FjdGlvbiIpDQoNCmViX2xpc3RfcHJlZHNfcHJzYWN0aW9uIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19wcnNhY3Rpb25bW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19wcnNhY3Rpb25bWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19wcnNhY3Rpb24sIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX3Byc2FjdGlvbjFfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8xJGFnZV90aW1lIDwtIGViXzEkYWdlICogZWJfMSR0aW1lDQplYl8xJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMSRzZXgpICogZWJfMSR0aW1lDQplYl8xIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzEsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8xJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfQmFzaWMgKiBlYl8xJHRpbWUNCmViXzEkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMSR0aW1lDQplYl8xJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8xJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb24gPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX3Byc2FjdGlvbltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb25bWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uMV9uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFNlY29uZCBzZXQNCmViXzIgPC0gc3Vic2V0KGViX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTMgfCBzdXJ2ZXl5ZWFyID09IDIwMTUpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJwcnNhY3Rpb24iKQ0KDQplYl9saXN0X2VtcHR5X3Byc2FjdGlvbiA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfcHJzYWN0aW9uW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfcHJzYWN0aW9uW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfcHJzYWN0aW9uLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb24yLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoInByc2FjdGlvbiIpDQoNCmViX2xpc3RfcHJlZHNfcHJzYWN0aW9uIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19wcnNhY3Rpb25bW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19wcnNhY3Rpb25bWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19wcnNhY3Rpb24sIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX3Byc2FjdGlvbjJfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl8yJGFnZV90aW1lIDwtIGViXzIkYWdlICogZWJfMiR0aW1lDQplYl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfMiRzZXgpICogZWJfMiR0aW1lDQplYl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQmFzaWMgKiBlYl8yJHRpbWUNCmViXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfMiR0aW1lDQplYl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb24gPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX3Byc2FjdGlvbltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb25bWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uMl9uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQojIFRoaXJkIHNldA0KZWJfMyA8LSBzdWJzZXQoZWJfY29tcGxldGUsIHN1cnZleXllYXIgPT0gMjAxNSB8IHN1cnZleXllYXIgPT0gMjAxNykNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoInByc2FjdGlvbiIpDQoNCmViX2xpc3RfZW1wdHlfcHJzYWN0aW9uIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8zLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb25bW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb25bWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb24sIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X3Byc2FjdGlvbjMuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygicHJzYWN0aW9uIikNCg0KZWJfbGlzdF9wcmVkc19wcnNhY3Rpb24gPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX3Byc2FjdGlvbltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX3Byc2FjdGlvbltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX3Byc2FjdGlvbiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfcHJzYWN0aW9uM19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViXzMkYWdlX3RpbWUgPC0gZWJfMyRhZ2UgKiBlYl8zJHRpbWUNCmViXzMkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl8zJHNleCkgKiBlYl8zJHRpbWUNCmViXzMgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfMywgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViXzMkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9CYXNpYyAqIGViXzMkdGltZQ0KZWJfMyRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl8zJHRpbWUNCmViXzMkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl8zJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViXzMkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX3Byc2FjdGlvbiA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl8zLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX3Byc2FjdGlvbltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb24sIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb24zX25ldy5SRGF0YSIpDQpgYGANCg0KDQojIyBTT0NPTiB7LX0NCmBgYHtyfQ0KIyBSZXBlYXQgdGhlIHNhbWUgcHJvY2VzcyBmb3IgU09DT04NCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL3NvY29udG90YWwuUkRhdGEiKQ0KDQpzb2Nvbl9jb21wbGV0ZSA8LSBzb2NvbnRvdGFsICU+JSBkcm9wX25hKCkNCg0Kc29jb25fY29tcGxldGUkdGltZSA8LSBzb2Nvbl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKHNvY29uX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCnNvY29uXzEgPC0gc3Vic2V0KHNvY29uX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMjAgfCBzdXJ2ZXl5ZWFyID09IDIwMjEpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImZ1dF9nZW5fc29jb24iKQ0KDQpzb2Nvbl9saXN0X2VtcHR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc3NvY29ubg0KICBzb2Nvbl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBzb2Nvbl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9lbXB0eVtbaV1dIDwtIHNvY29uX2ZpdA0KfSANCg0Kc2F2ZShzb2Nvbl9saXN0X2VtcHR5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvc29jb25fbGlzdF9lbXB0eTEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCg0Kc29jb25fbGlzdF9wcmVkcyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Nzb2Nvbm4NCiAgc29jb25fZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBzb2Nvbl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9wcmVkc1tbaV1dIDwtIHNvY29uX2ZpdA0KfSANCg0Kc3VtbWFyeShzb2Nvbl9saXN0X3ByZWRzW1sxXV0pIA0KDQpzYXZlKHNvY29uX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9zb2Nvbl9saXN0X3ByZWRzMV9uZXcuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQpzb2Nvbl8xJGFnZV90aW1lIDwtIHNvY29uXzEkYWdlICogc29jb25fMSR0aW1lDQpzb2Nvbl8xJHNleF90aW1lIDwtIGFzLm51bWVyaWMoc29jb25fMSRzZXgpICogc29jb25fMSR0aW1lDQpzb2Nvbl8xIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKHNvY29uXzEsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQpzb2Nvbl8xJGlzY2VkX2Jhc2ljX3RpbWUgPC0gc29jb25fMSRpc2NlZF9jYXRfQmFzaWMgKiBzb2Nvbl8xJHRpbWUNCnNvY29uXzEkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gc29jb25fMSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogc29jb25fMSR0aW1lDQpzb2Nvbl8xJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gc29jb25fMSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBzb2Nvbl8xJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQpzb2Nvbl9saXN0X2ludGVyYWN0aW9ucyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc3NvY29ubg0KICBzb2Nvbl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBzb2Nvbl8xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9pbnRlcmFjdGlvbnNbW2ldXSA8LSBzb2Nvbl9maXQNCn0gDQoNCnN1bW1hcnkoc29jb25fbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUoc29jb25fbGlzdF9pbnRlcmFjdGlvbnMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9zb2Nvbl9saXN0X2ludGVyYWN0aW9uczFfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBSZXBlYXQgdGhlIHNhbWUgcHJvY2VzcyBmb3IgU09DT04NCnNvY29uXzIgPC0gc3Vic2V0KHNvY29uX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMjEgfCBzdXJ2ZXl5ZWFyID09IDIwMjIpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImZ1dF9nZW5fc29jb24iKQ0KDQpzb2Nvbl9saXN0X2VtcHR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc3NvY29ubg0KICBzb2Nvbl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBzb2Nvbl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9lbXB0eVtbaV1dIDwtIHNvY29uX2ZpdA0KfSANCg0Kc2F2ZShzb2Nvbl9saXN0X2VtcHR5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvc29jb25fbGlzdF9lbXB0eTIuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCg0Kc29jb25fbGlzdF9wcmVkcyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Nzb2Nvbm4NCiAgc29jb25fZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBzb2Nvbl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9wcmVkc1tbaV1dIDwtIHNvY29uX2ZpdA0KfSANCg0Kc3VtbWFyeShzb2Nvbl9saXN0X3ByZWRzW1sxXV0pIA0KDQpzYXZlKHNvY29uX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9zb2Nvbl9saXN0X3ByZWRzMl9uZXcuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQpzb2Nvbl8yJGFnZV90aW1lIDwtIHNvY29uXzIkYWdlICogc29jb25fMiR0aW1lDQpzb2Nvbl8yJHNleF90aW1lIDwtIGFzLm51bWVyaWMoc29jb25fMiRzZXgpICogc29jb25fMiR0aW1lDQpzb2Nvbl8yIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKHNvY29uXzIsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQpzb2Nvbl8yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gc29jb25fMiRpc2NlZF9jYXRfQmFzaWMgKiBzb2Nvbl8yJHRpbWUNCnNvY29uXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gc29jb25fMiRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogc29jb25fMiR0aW1lDQpzb2Nvbl8yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gc29jb25fMiRpc2NlZF9jYXRfQWR2YW5jZWQgKiBzb2Nvbl8yJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQpzb2Nvbl9saXN0X2ludGVyYWN0aW9ucyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc3NvY29ubg0KICBzb2Nvbl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBzb2Nvbl8yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9pbnRlcmFjdGlvbnNbW2ldXSA8LSBzb2Nvbl9maXQNCn0gDQoNCnN1bW1hcnkoc29jb25fbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUoc29jb25fbGlzdF9pbnRlcmFjdGlvbnMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9zb2Nvbl9saXN0X2ludGVyYWN0aW9uczJfbmV3LlJEYXRhIikNCmBgYA0KDQoNCiMjIExJU1Mgey19DQoNCmBgYHtyfQ0KIyBSZXBlYXQgdGhlIHNhbWUgcHJvY2VzcyBmb3IgTElTUw0Kcm0obGlzdD1scygpKQ0KbG9hZCgiLi9kYXRhL2ZpbmFsX2RhdGEvbGlzc3RvdGFsLlJEYXRhIikNCg0KbGlzc19jb21wbGV0ZSA8LSBsaXNzdG90YWwgJT4lIGRyb3BfbmEoKQ0KDQpsaXNzX2NvbXBsZXRlJHRpbWUgPC0gbGlzc19jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGxpc3NfY29tcGxldGUkc3VydmV5eWVhcikNCnRhYmxlKGxpc3NfY29tcGxldGUkc3VydmV5eWVhcikNCg0KbGlzc18xIDwtIHN1YnNldChsaXNzX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMTkgfCBzdXJ2ZXl5ZWFyID09IDIwMjAuNTgpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImxpZmVzdHlsZSIpDQoNCmxpc3NfbGlzdF9lbXB0eSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3NsaXNzbg0KICBsaXNzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGxpc3NfMSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGxpc3NfbGlzdF9lbXB0eVtbaV1dIDwtIGxpc3NfZml0DQp9IA0KDQpzYXZlKGxpc3NfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2xpc3NfbGlzdF9lbXB0eTEuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCg0KbGlzc19saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2xpc3NuDQogIGxpc3NfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBsaXNzXzEsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBsaXNzX2xpc3RfcHJlZHNbW2ldXSA8LSBsaXNzX2ZpdA0KfSANCg0Kc3VtbWFyeShsaXNzX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUobGlzc19saXN0X3ByZWRzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvbGlzc19saXN0X3ByZWRzMV9uZXcuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQpsaXNzXzEkYWdlX3RpbWUgPC0gbGlzc18xJGFnZSAqIGxpc3NfMSR0aW1lDQpsaXNzXzEkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhsaXNzXzEkc2V4KSAqIGxpc3NfMSR0aW1lDQpsaXNzXzEgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMobGlzc18xLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KbGlzc18xJGlzY2VkX2Jhc2ljX3RpbWUgPC0gbGlzc18xJGlzY2VkX2NhdF9CYXNpYyAqIGxpc3NfMSR0aW1lDQpsaXNzXzEkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gbGlzc18xJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBsaXNzXzEkdGltZQ0KbGlzc18xJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gbGlzc18xJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGxpc3NfMSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KbGlzc19saXN0X2ludGVyYWN0aW9ucyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2xpc3NuDQogIGxpc3NfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gbGlzc18xLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgbGlzc19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGxpc3NfZml0DQp9IA0KDQpzdW1tYXJ5KGxpc3NfbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUobGlzc19saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2xpc3NfbGlzdF9pbnRlcmFjdGlvbnMxX25ldy5SRGF0YSIpDQpgYGANCg0KDQpgYGB7cn0NCiMgUmVwZWF0IHRoZSBzYW1lIHByb2Nlc3MgZm9yIExJU1MNCnRhYmxlKGxpc3NfY29tcGxldGUkc3VydmV5eWVhcikNCg0KbGlzc18yIDwtIHN1YnNldChsaXNzX2NvbXBsZXRlLCBzdXJ2ZXl5ZWFyID09IDIwMjAuNTggfCBzdXJ2ZXl5ZWFyID09IDIwMjAuODMpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImxpZmVzdHlsZSIpDQoNCmxpc3NfbGlzdF9lbXB0eSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3NsaXNzbg0KICBsaXNzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGxpc3NfMiwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGxpc3NfbGlzdF9lbXB0eVtbaV1dIDwtIGxpc3NfZml0DQp9IA0KDQpzYXZlKGxpc3NfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2xpc3NfbGlzdF9lbXB0eTIuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCg0KbGlzc19saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2xpc3NuDQogIGxpc3NfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBsaXNzXzIsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBsaXNzX2xpc3RfcHJlZHNbW2ldXSA8LSBsaXNzX2ZpdA0KfSANCg0Kc3VtbWFyeShsaXNzX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUobGlzc19saXN0X3ByZWRzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvcGVyX3dhdmUvbGlzc19saXN0X3ByZWRzMl9uZXcuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQpsaXNzXzIkYWdlX3RpbWUgPC0gbGlzc18yJGFnZSAqIGxpc3NfMiR0aW1lDQpsaXNzXzIkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhsaXNzXzIkc2V4KSAqIGxpc3NfMiR0aW1lDQpsaXNzXzIgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMobGlzc18yLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KbGlzc18yJGlzY2VkX2Jhc2ljX3RpbWUgPC0gbGlzc18yJGlzY2VkX2NhdF9CYXNpYyAqIGxpc3NfMiR0aW1lDQpsaXNzXzIkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gbGlzc18yJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBsaXNzXzIkdGltZQ0KbGlzc18yJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gbGlzc18yJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGxpc3NfMiR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KbGlzc19saXN0X2ludGVyYWN0aW9ucyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2xpc3NuDQogIGxpc3NfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gbGlzc18yLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgbGlzc19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGxpc3NfZml0DQp9IA0KDQpzdW1tYXJ5KGxpc3NfbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUobGlzc19saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2xpc3NfbGlzdF9pbnRlcmFjdGlvbnMyX25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIFJlcGVhdCB0aGUgc2FtZSBwcm9jZXNzIGZvciBMSVNTDQp0YWJsZShsaXNzX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCmxpc3NfMyA8LSBzdWJzZXQobGlzc19jb21wbGV0ZSwgc3VydmV5eWVhciA9PSAyMDIwLjgzIHwgc3VydmV5eWVhciA9PSAyMDIxKQ0KDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJsaWZlc3R5bGUiKQ0KDQpsaXNzX2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzbGlzc24NCiAgbGlzc19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBsaXNzXzMsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBsaXNzX2xpc3RfZW1wdHlbW2ldXSA8LSBsaXNzX2ZpdA0KfSANCg0Kc2F2ZShsaXNzX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9saXNzX2xpc3RfZW1wdHkzLlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQoNCmxpc3NfbGlzdF9wcmVkcyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3NsaXNzbg0KICBsaXNzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gbGlzc18zLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgbGlzc19saXN0X3ByZWRzW1tpXV0gPC0gbGlzc19maXQNCn0gDQoNCnN1bW1hcnkobGlzc19saXN0X3ByZWRzW1sxXV0pIA0KDQpzYXZlKGxpc3NfbGlzdF9wcmVkcywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3Blcl93YXZlL2xpc3NfbGlzdF9wcmVkczNfbmV3LlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KbGlzc18zJGFnZV90aW1lIDwtIGxpc3NfMyRhZ2UgKiBsaXNzXzMkdGltZQ0KbGlzc18zJHNleF90aW1lIDwtIGFzLm51bWVyaWMobGlzc18zJHNleCkgKiBsaXNzXzMkdGltZQ0KbGlzc18zIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGxpc3NfMywgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmxpc3NfMyRpc2NlZF9iYXNpY190aW1lIDwtIGxpc3NfMyRpc2NlZF9jYXRfQmFzaWMgKiBsaXNzXzMkdGltZQ0KbGlzc18zJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGxpc3NfMyRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogbGlzc18zJHRpbWUNCmxpc3NfMyRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGxpc3NfMyRpc2NlZF9jYXRfQWR2YW5jZWQgKiBsaXNzXzMkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmxpc3NfbGlzdF9pbnRlcmFjdGlvbnMgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3NsaXNzbg0KICBsaXNzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGxpc3NfMywgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGxpc3NfbGlzdF9pbnRlcmFjdGlvbnNbW2ldXSA8LSBsaXNzX2ZpdA0KfSANCg0Kc3VtbWFyeShsaXNzX2xpc3RfaW50ZXJhY3Rpb25zW1sxXV0pIA0KDQpzYXZlKGxpc3NfbGlzdF9pbnRlcmFjdGlvbnMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9wZXJfd2F2ZS9saXNzX2xpc3RfaW50ZXJhY3Rpb25zM19uZXcuUkRhdGEiKQ0KYGBgDQoNCg==