Here I will graph the data to be used in the paper, for motivation/introduction and a graphical, simpler representation of the pseudo DiD models.
Time series
Below I include the simplest graphs which present time series of different statistics produced with the data of the AB.
Corruption tolerance
First I calculate the percentage taking into account the design effects, as it is done with LAPOP reports.
ctol_perc_year<-svyby(~ ctol, ~ year, design = ab_des_ec, svymean, na.rm = T) %>% as.data.frame()
ctol_perc_year
Now graph with ggplot:
ctol_time<-ggplot(ctol_perc_year, aes(x = year, y = ctol, group = 1)) +
geom_line(aes(x = year,
y = ctol),
size = 0.9,
colour = 'darkgreen') +
geom_point(size = 1.5) +
geom_line(aes(x = year,
y = ctol - se),
size = 0.7,
colour = 'grey50',
linetype = 'dotted') +
geom_line(aes(x = year,
y = ctol + se),
size = 0.7,
colour = 'grey50',
linetype = 'dotted') +
geom_text(aes(label= round(ctol, 4)*100),
vjust = 0.55,
hjust = 1.68,
position = position_dodge(0.9),
size = 2
)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who justify corruption in Ecuador, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctol_time)

Now repeat the graph as a bar chart:
ctol_time_col<-ggplot(ctol_perc_year, aes(x = year, y = ctol, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = ctol - 1.96*se,
ymax = ctol + 1.96*se),
width = .5)+
geom_text(aes(label= round(ctol, 4)*100),
size = 3,
vjust = 6
)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who justify corruption in Ecuador, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctol_time_col)

The most important graph in the paper: it shows how the percentage of people who report tolerance to bribing has grown considerably.
Confidence in the president
I now graph the time series of a dichotomized confidence in the president variable. Scores over 4 are coded as 1 in this dichotomized variable.
Now I graph the time series of people who confide in the president. As usual in the LAPOP reports, the confidence in the president is coded as 1 when the scores responded are over or equal to 5.
pres_conf_calc<-svyby(~ pres_conf_dic,
~ year,
design = ab_des_ec,
svymean,
na.rm = T) %>% as.data.frame()
# Select only the variables I want and rename
pres_conf_calc<-dplyr::select(pres_conf_calc, year, pres_conf_dicYes, se.pres_conf_dicYes) %>%
rename('Yes'=pres_conf_dicYes, 'SE.y'=se.pres_conf_dicYes)
# Delete years there isn't data for
pres_conf_calc<- pres_conf_calc[3:8,]
pres_conf_calc
NA
pres_conf_g<-ggplot(pres_conf_calc, aes(x = year, y = Yes, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Yes - 1.6*SE.y,
ymax = Yes + 1.6*SE.y),
width = .5)+
geom_text(aes(label= round(Yes, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of people who report confidence in the president, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(pres_conf_g)

As seen before, confidence in the president drops sharply between 2014 and 2016. This is more interesting than the drop for 2019, since naturally the new administration was going to lose confidence as it switched the political spectrum abruptly.
Unemployment
First, I calculate unemployment rates as defined by this survey. I graph them as a bar chart after.
unem_time<-svyby(~ unem2_4a,
~ year,
design = ab_des_ec,
svymean,
na.rm = T) %>% as.data.frame()
unem_time<-unem_time[3:8,]
unem_time
unem_time_g<-ggplot(unem_time, aes(x = year, y = unem2_4a, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = unem2_4a - se,
ymax = unem2_4a + se),
width = .5)+
geom_text(aes(label= round(unem2_4a, 4)*100),
size = 3,
vjust = -2.1
)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who report being unemployed, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(unem_time_g)

Economic Situation
Now I do the same procedures for the economic situation question, paying attention to those who report having a worse economic situation relative to their situation 12 months before.
ecsit_time<-svyby(~ econ_sit,
~ year,
design = ab_des_ec,
svymean,
na.rm = T) %>% as.data.frame()
# Select only the Worse percentages
ecsit_time<-dplyr::select(ecsit_time, year, econ_sitWorse, se.econ_sitWorse)
ecsit_time
Now the graph:
ec_sit_g<-ggplot(ecsit_time, aes(x = year, y = econ_sitWorse, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = econ_sitWorse - se.econ_sitWorse,
ymax = econ_sitWorse + se.econ_sitWorse),
width = .5)+
geom_text(aes(label= round(econ_sitWorse, 4)*100),
size = 3,
vjust = -1.5
)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who report having worse economic situations, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ec_sit_g)

A very, very important increase between 2014 and 2016. Let’s see how it affects the composition of corruption justifiers.
Political Score/Groups
Now I calculate and present percentages of people that answer about their scores on the political wings.
First, I calculate and graph the politization indicator as shown in the LAPOP report. Equals 1 if the person did NOT answer the political score. More politization means a lower percentage of no responses.
politization_time<-svyby(~ plscr_na,
~ year,
design = ab_des_ec,
svymean,
na.rm = T) %>% as.data.frame()
politization_time
Now the graph:
polit_g<-ggplot(politization_time, aes(x = year, y = plscr_na, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = plscr_na - se,
ymax = plscr_na + se),
width = .5)+
geom_text(aes(label= round(plscr_na, 4)*100),
size = 3,
vjust = -2.2)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who do not answer the political score question, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(polit_g)

Now the same procedure for all three political positions, as defined by LAPOP reports: left, center and right.
polgroup_time_calc<-svyby(~ pol_group,
~ year,
design = ab_des_ec,
svymean,
na.rm = T) %>% as.data.frame()
# Rename variables
polgroup_time_calc<-rename(polgroup_time_calc,
'Center' = pol_groupCenter,
'Left' = pol_groupLeft,
'Right' = pol_groupRight,
'None' = pol_groupNone,
'SE.c'= se.pol_groupCenter,
'SE.l'= se.pol_groupLeft,
'SE.r'= se.pol_groupRight,
'SE.n'= se.pol_groupNone)
polgroup_time_calc
Now make the three graphs:
left_g<-ggplot(polgroup_time_calc, aes(x = year, y = Left, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Left - SE.l,
ymax = Left + SE.l),
width = .5)+
geom_text(aes(label= round(Left, 4)*100),
size = 3,
vjust = -2.2)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who identify with the left political wing, by year',
subtitle = 'With 95% confidence interval (considering design effects)',
caption = 'Corresponds to people answering scores lower than 5 in the Political Score (L1) question')
print(left_g)

right_g<-ggplot(polgroup_time_calc, aes(x = year, y = Right, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Right - SE.r,
ymax = Right + SE.r),
width = .5)+
geom_text(aes(label= round(Right, 4)*100),
size = 3,
vjust = -1.9)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who identify with the right political wing, by year',
subtitle = 'With 95% confidence interval (considering design effects)',
caption = 'Corresponds to people answering scores higher than 7 in the Political Score (L1) question')
print(right_g)

center_g<-ggplot(polgroup_time_calc, aes(x = year, y = Center, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Center - SE.c,
ymax = Center + SE.c),
width = .5)+
geom_text(aes(label= round(Center, 4)*100),
size = 3,
vjust = -1.3)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who identify in the center of the political wings, by year',
subtitle = 'With 95% confidence interval (considering design effects)',
caption = 'Corresponds to people answering scores between 4 and 7 in the Political Score (L1) question')
print(center_g)

The percentages are consistent with the LAPOP report: the right wins a lot between 2014 and 2016, where as the center also gains and the left remains the same. People who are “neutral” decrease steadily, the sharpest drop is in 2016, which might be interesting.
Presidential Job Approval Rating
Draw a time series of this variable.
pres_approval_time<-svyby(~ pres_aprov_dic,
~ year,
svymean,
design = ab_des_ec,
na.rm = T) %>% as.data.frame()
pres_approval_time<-dplyr::select(pres_approval_time, year, pres_aprov_dic, se)
Now I’ll graph the time series:
pres_aprov_tg<-
ggplot(pres_approval_time, aes(x = year, y = pres_aprov_dic))+
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = pres_aprov_dic - se,
ymax = pres_aprov_dic + se),
width = .5)+
geom_text(aes(label= round(pres_aprov_dic, 4)*100),
size = 3,
vjust = -1.3)+
theme_bw() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent who approve the job performance of the President, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(pres_aprov_tg)

Decomposing corruption tolerance
Here I will graph the information that can be used to explain, through descriptive statistics, the DiD models. I decompose the people that answer “Yes” to tolerating a bribe, and compare those decompositions through 2014 and 2016.
Unemployment
Now, I consider the % of people who answered “YES” to a bribe being justified who report being unemployed.
First, I subset out the dataset to have only positive responses to the \(ctol\) variable and then create a new survey design object to later use in calculations.
# Subset a base with only yes responses to ctol
df_ctol<-subset(df,
df$ctol == 1)
# Declare its survey design
ctol_des<-svydesign(ids = ~ upm,
strata = ~ estratopri,
weights = ~ weight1500,
nest = TRUE,
na.action = 'na.exclude',
data = df_ctol)
# Now subset a base with only "no" responses
df_ctol_no<-subset(df,
df$ctol == 0)
# Declare its survey design
ctol_des_no<-svydesign(ids = ~ upm,
strata = ~ estratopri,
weights = ~ weight1500,
nest = TRUE,
na.action = 'na.exclude',
data = df_ctol_no)
Now I do the calculations, considering design effects too (as long as this technique works well from a statistical viewpoint. It appears it does).
unem_ctol<-svyby(~ unem2_4a,
~ year,
design = ctol_des,
svymean,
na.rm = T) %>%
as.data.frame()
unem_ctol<-unem_ctol[3:8,]
unem_ctol
Graph below:
unem_timec_g<-ggplot(unem_ctol, aes(x = year, y = unem2_4a, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = unem2_4a - se,
ymax = unem2_4a + se),
width = .5)+
geom_text(aes(label= round(unem2_4a, 4)*100),
size = 3,
vjust = 6,
hjust = 0.5)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who report being unemployed, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(unem_timec_g)

Change between 2014 and 2016 seems trivial, the interesting jump is from 2012 to 2014. Note how in different years there are different error margins, probably due to differences in the sample size. This varies directly with the % of corruption justifiers, which is quite low for 2014.
Economic Situation
I will graph the % of corruption justifiers who report being worse off in 2016 in their economic situation. First I do the calculations:
ecsit_ctol<-svyby(~ econ_sit,
~ year,
design = ctol_des,
svymean,
na.rm = T) %>%
as.data.frame()
# Select the columns I'm interested in
ecsit_ctol<-dplyr::select(ecsit_ctol, year, econ_sitWorse, se.econ_sitWorse)
ecsit_ctol
The graph below
ec_sitc_g<-ggplot(ecsit_ctol, aes(x = year, y = econ_sitWorse, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = econ_sitWorse - se.econ_sitWorse,
ymax = econ_sitWorse + se.econ_sitWorse),
width = .5)+
geom_text(aes(label= round(econ_sitWorse, 4)*100),
size = 3,
vjust = -2
)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who report having worse economic situations, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ec_sitc_g)

The percentage increase of the corruption justifiers with worse economic situation seems pretty close with the overall percentage increase.
Let’s see how the same works for NON corruption justifiers.
# Survey design for corruption rejecters.
ecsit_ctoln<-svyby(~ econ_sit,
~ year,
design = ctol_des_no,
svymean,
na.rm = T) %>%
as.data.frame()
# Select the columns I'm interested in
ecsit_ctoln<-dplyr::select(ecsit_ctoln, year, econ_sitWorse, se.econ_sitWorse)
ecsit_ctoln
NA
The graph:
ec_sitc_g<-ggplot(ecsit_ctoln, aes(x = year, y = econ_sitWorse, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = econ_sitWorse - se.econ_sitWorse,
ymax = econ_sitWorse + se.econ_sitWorse),
width = .5)+
geom_text(aes(label= round(econ_sitWorse, 4)*100),
size = 3,
vjust = -1.5
)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption rejecters who report having worse economic situations, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ec_sitc_g)

Indeed, the economic effect seems to affect both corruption justifiers and rejecters equally according to this graph. The “same difference” is found between 2014 and 2016. Thus that might be why the economic situation variable is not significative in my regression models.
Political Score
Now lets see how this works within the corruption justifiers.
polgroup_ctol<-svyby(~ pol_group,
~ year,
design = ctol_des,
svymean,
na.rm = T) %>%
as.data.frame()
# Rename
polgroup_ctol<-rename(polgroup_ctol,
'Center' = pol_groupCenter,
'Left' = pol_groupLeft,
'Right' = pol_groupRight,
'None' = pol_groupNone,
'SE.c'= se.pol_groupCenter,
'SE.l'= se.pol_groupLeft,
'SE.r'= se.pol_groupRight,
'SE.n'= se.pol_groupNone)
polgroup_ctol
Graph the politization percentage of the corruption justifiers.
polit_ctol_g<-ggplot(polgroup_ctol, aes(x = year, y = None, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = None - SE.n,
ymax = None + SE.n),
width = .5)+
geom_text(aes(label= round(None, 4)*100),
size = 3,
vjust = -3.2)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who do not answer the political score question, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(polit_ctol_g)

This graph shows a drop, which could be marginally significant, considering the 95% confidence intervals.
Now graph the other political wings of the corruption justifiers.
right_ctol_g<-ggplot(polgroup_ctol, aes(x = year, y = Right, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Right - SE.r,
ymax = Right + SE.r),
width = .5)+
geom_text(aes(label= round(Right, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who identify with the right',
subtitle = 'With 95% confidence interval (considering design effects)')
print(right_ctol_g)

An interesting increase, which I guess justifies the marginal significance of this variable in models.
The graph of the left now:
left_ctol_g<-ggplot(polgroup_ctol, aes(x = year, y = Left, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Left - SE.l,
ymax = Left + SE.l),
width = .5)+
geom_text(aes(label= round(Left, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who identify with the left',
subtitle = 'With 95% confidence interval (considering design effects)')
print(left_ctol_g)

The graph of the center now:
center_ctol_g<-ggplot(polgroup_ctol, aes(x = year, y = Center, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Center - SE.c,
ymax = Center + SE.c),
width = .5)+
geom_text(aes(label= round(Center, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who identify with the center',
subtitle = 'With 95% confidence interval (considering design effects)')
print(center_ctol_g)

Lets do the same for the corruption rejecters. First the calculations.
polgroup_ctoln<-svyby(~ pol_group,
~ year,
design = ctol_des_no,
svymean,
na.rm = T) %>%
as.data.frame()
# Rename
polgroup_ctoln<-rename(polgroup_ctoln,
'Center' = pol_groupCenter,
'Left' = pol_groupLeft,
'Right' = pol_groupRight,
'None' = pol_groupNone,
'SE.c'= se.pol_groupCenter,
'SE.l'= se.pol_groupLeft,
'SE.r'= se.pol_groupRight,
'SE.n'= se.pol_groupNone)
polgroup_ctoln
ctoln_none_g<-ggplot(polgroup_ctoln, aes(x = year, y = None, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = None - SE.n,
ymax = None + SE.n),
width = .5)+
geom_text(aes(label= round(None, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption rejecters who do not answer the political score question, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctoln_none_g)

ctoln_center_g<-ggplot(polgroup_ctoln, aes(x = year, y = Center, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Center - SE.c,
ymax = Center + SE.c),
width = .5)+
geom_text(aes(label= round(Center, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption rejecters who identify with the center, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctoln_center_g)

ctoln_left_g<-ggplot(polgroup_ctoln, aes(x = year, y = Left, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Left - SE.l,
ymax = Left + SE.l),
width = .5)+
geom_text(aes(label= round(Left, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption rejecters who identify with the left, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctoln_left_g)

ctoln_right_g<-ggplot(polgroup_ctoln, aes(x = year, y = Right, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Right - SE.r,
ymax = Right + SE.r),
width = .5)+
geom_text(aes(label= round(Right, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption rejecters who identify with the right, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctoln_right_g)

An important point: corruption rejecters ALSO win a lot of right-wing respondents for 2016. This might be why
Confidence in the president
Decompose tolerance to corruption considering the dichotomized version of presidential confidence.
pconf_ctol<-svyby(~ pres_conf_dic,
~ year,
design = ctol_des,
svymean,
na.rm = T) %>%
as.data.frame()
pconf_ctol<-dplyr::select(pconf_ctol, year, pres_conf_dicYes, se.pres_conf_dicYes) %>%
rename('Yes' = pres_conf_dicYes, 'SE' = se.pres_conf_dicYes)
pconf_ctol<-pconf_ctol[3:8,]
pconf_ctol
Now the graph:
ctol_pres_conf_g<-ggplot(pconf_ctol, aes(x = year, y = Yes, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Yes - SE,
ymax = Yes + SE),
width = .5)+
geom_text(aes(label= round(Yes, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption justifiers who confide with the president, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctol_pres_conf_g)

Do the same for corruption rejecters.
pconf_ctoln<-svyby(~ pres_conf_dic,
~ year,
design = ctol_des_no,
svymean,
na.rm = T) %>%
as.data.frame()
pconf_ctoln<-dplyr::select(pconf_ctoln, year, pres_conf_dicYes, se.pres_conf_dicYes) %>%
rename('Yes' = pres_conf_dicYes, 'SE' = se.pres_conf_dicYes)
pconf_ctoln<-pconf_ctoln[3:8,]
pconf_ctoln
Now the graph:
ctoln_pres_conf_g<-ggplot(pconf_ctoln, aes(x = year, y = Yes, group = 1)) +
geom_col(fill = 'chartreuse3',
colour = 'black') +
geom_errorbar(aes(ymin = Yes - SE,
ymax = Yes + SE),
width = .5)+
geom_text(aes(label= round(Yes, 4)*100),
size = 3,
vjust = 6)+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
text = element_text(family = 'TNR'),
axis.text.y = element_blank(),
axis.text.x = element_text(size = 8),
axis.ticks = element_blank(),
plot.title = element_text(face = 'bold', size = 12),
plot.subtitle = element_text(size = 12))+
labs(x = '',
y = '',
title = 'Percent of corruption rejecters who confide with the president, by year',
subtitle = 'With 95% confidence interval (considering design effects)')
print(ctoln_pres_conf_g)

This is the punchline. The people who used to reject corruption stopped doing so: government zealotry stopped. If there were less people who confided in the president, and in turn these people seemed to stop rejecting corrupt actitivities, it makes sense why corruption tolerance jumped.
Graphs using data outside the America’s Barometer
Below, I draw the graphs which are made without the AB’s data
From the World Bank’s World Development Indicators
I now want to graph the GDP growth of different latin american countries, including Ecuador. Below, I use the WDI package to download the data from the World Bank’s API.
# Define country ISO2 codes for downloading the GDP indicators
countries_latam<-c('EC', 'CL', 'CO', 'PE', 'BO')
# Download GDP data: total and per capita growth rates and magnitude per capita, constant prices 2010 USD
gdp_wdi<-WDI(country = countries_latam, indicator = c('NY.GDP.MKTP.KD.ZG','NY.GDP.PCAP.KD.ZG', 'NY.GDP.PCAP.KD'))
# Rename the variables
gdp_wdi<-rename(gdp_wdi, 'gdp_g' = NY.GDP.MKTP.KD.ZG , 'gdppc_g' = NY.GDP.PCAP.KD.ZG, 'gdp_pc' = NY.GDP.PCAP.KD)
First I graph GDP per capita growth rates for the countries that I got.
gdppc_g<-
ggplot(gdp_wdi, aes(x = year, y = gdp_pc/1000, colour = country)) +
geom_line() +
geom_point(size = 1) +
scale_y_continuous(breaks = c(2,4,6,8,10,12,14)) +
scale_x_continuous(breaks = c(1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020)) +
theme_bw() +
theme(text = element_text(family = 'TNR'),
axis.title.x = element_text(size = 10),
axis.title.y = element_text(size = 10),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = c(0.35,0.93),
legend.title = element_blank(),
legend.box.background = element_rect(colour = 'black')) +
labs(x = 'Year',
y = 'GDP per Capita (Thousands of Constant 2010 USD)',
colour = 'Country')+
guides(colour = guide_legend(nrow = 1))
gdppc_g

gdp_wdi1<-subset(gdp_wdi,
gdp_wdi$country == 'Ecuador'| gdp_wdi$country == 'Colombia' | gdp_wdi$country == 'Peru')
gdppc_growth_g<-
ggplot(gdp_wdi1, aes(x = year, y = gdppc_g, colour = country)) +
geom_line() +
geom_point(size = 1) +
scale_y_continuous(breaks = c(2,4,6,8,10,12,14)) +
scale_x_continuous(breaks = c(1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020)) +
theme_bw() +
theme(text = element_text(family = 'TNR'),
axis.title.x = element_text(size = 10),
axis.title.y = element_text(size = 10),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = c(0.35,0.93),
legend.title = element_blank(),
legend.box.background = element_rect(colour = 'black')) +
labs(x = 'Year',
y = 'GDP per Capita Annual Growth (%)',
colour = 'Country')+
guides(colour = guide_legend(nrow = 1))
gdppc_growth_g

LS0tDQp0aXRsZTogIkdyYXBoaW5nIHRoZSBkYXRhIg0Kc3VidGl0bGU6ICJMQVBPUCdzIEFCIEVtcGlyaWNhbCBTdHVkeSBvbiB0aGUgQXR0aXR1ZGVzIG9uIENvcnJ1cHRpb24iDQpkYXRlOiAiMzAvMDgvMjAyMSINCmF1dGhvcjogIkRhbmllbCBTw6FuY2hleiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkhlcmUgSSB3aWxsIGdyYXBoIHRoZSBkYXRhIHRvIGJlIHVzZWQgaW4gdGhlIHBhcGVyLCBmb3IgbW90aXZhdGlvbi9pbnRyb2R1Y3Rpb24gYW5kIGEgZ3JhcGhpY2FsLCBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwc2V1ZG8gRGlEIG1vZGVscy4gDQoNClRoZSAicHJlYW1ibGUiIG9mIG15IGNvZGUgYXMgZm9sbG93czoNCg0KYGBge3Igc2V0dXB9DQojIExvYWQgbGlicmFyaWVzDQoNCmxpYnJhcnkodGlkeXZlcnNlKSAjIEZvciBnZ3Bsb3RzIGFuZCBvdGhlcnMNCmxpYnJhcnkoc3VydmV5KSAjIFN1cnZleSBtYW5hZ2VtZW50DQpsaWJyYXJ5KGRlc2NyKSAjIERlc2NyaXB0aXZlIHN0YXRzDQpsaWJyYXJ5KFdESSkgIyBHZXQgZGF0YSBmcm9tIHRoZSBXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIChXb3JsZCBCYW5rKQ0KDQojIFNldCB0aGUgdGltZXMgbmV3IHJvbWFuIGZvbnQgZm9yIGdyYXBocw0KDQp3aW5kb3dzRm9udHMoVE5SID0gd2luZG93c0ZvbnQoIlRpbWVzIE5ldyBSb21hbiIpKQ0KDQpgYGANCg0KIyMgRGVjbGFyaW5nIHRoZSBzdXJ2ZXkgZGVzaWduDQoNCkkgZGVjbGFyZSB0aGUgc3VydmV5IGRlc2lnbiBvZiBMQVBPUCdzIEFCIGJlbG93LCBpbiBvcmRlciB0byBwcm9kdWNlIGFjY3VyYXRlIHN0YW5kYXJkIGVycm9ycyBmb3IgYWxsIHN0YXRpc3RpY3MuIA0KYGBge3Igc3VydmV5X2Rlc30NCiMgRm9yIGFsbCB5ZWFycw0KYWJfZGVzX2VjPC1zdnlkZXNpZ24oaWRzPX51cG0sIA0KICAgICAgICAgICAgICAgICAgICAgc3RyYXRhPX5lc3RyYXRvcHJpLCANCiAgICAgICAgICAgICAgICAgICAgIHdlaWdodHM9fndlaWdodDE1MDAsIA0KICAgICAgICAgICAgICAgICAgICAgbmVzdD1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgbmEuYWN0aW9uID0gJ25hLmV4Y2x1ZGUnLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kZikNCg0KIyBGb3IgeWVhcnMgMjAxNC0yMDE2DQphYl9kZXNfZWMxNDE2PC1zdnlkZXNpZ24oaWRzPX51cG0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0YT1+ZXN0cmF0b3ByaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cz1+d2VpZ2h0MTUwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbmVzdD1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9ICduYS5leGNsdWRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRmNDYpDQoNCg0KYGBgDQojIyBUaW1lIHNlcmllcw0KDQpCZWxvdyBJIGluY2x1ZGUgdGhlIHNpbXBsZXN0IGdyYXBocyB3aGljaCBwcmVzZW50IHRpbWUgc2VyaWVzIG9mIGRpZmZlcmVudCBzdGF0aXN0aWNzIHByb2R1Y2VkIHdpdGggdGhlIGRhdGEgb2YgdGhlIEFCLiANCg0KIyMjIENvcnJ1cHRpb24gdG9sZXJhbmNlDQoNCkZpcnN0IEkgY2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGRlc2lnbiBlZmZlY3RzLCBhcyBpdCBpcyBkb25lIHdpdGggTEFQT1AgcmVwb3J0cy4NCmBgYHtyIGN0b2xfcGVyY3N9DQpjdG9sX3BlcmNfeWVhcjwtc3Z5YnkofiBjdG9sLCB+IHllYXIsIGRlc2lnbiA9IGFiX2Rlc19lYywgc3Z5bWVhbiwgbmEucm0gPSBUKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQpjdG9sX3BlcmNfeWVhcg0KYGBgDQpOb3cgZ3JhcGggd2l0aCBgZ2dwbG90YDoNCmBgYHtyIGN0b2xfZ3JhcGhfdGltZSwgIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY3RvbF90aW1lPC1nZ3Bsb3QoY3RvbF9wZXJjX3llYXIsIGFlcyh4ID0geWVhciwgeSA9IGN0b2wsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjdG9sKSwNCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2RhcmtncmVlbicpICsNCiAgICAgICAgICAgZ2VvbV9wb2ludChzaXplID0gMS41KSArDQogICAgICAgICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjdG9sIC0gc2UpLA0KICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNywgDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnZ3JleTUwJywNCiAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gJ2RvdHRlZCcpICsNCiAgICAgICAgICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGN0b2wgKyBzZSksDQogICAgICAgICAgICAgICAgICAgICBzaXplID0gMC43LCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdncmV5NTAnLA0KICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSAnZG90dGVkJykgKw0KICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChjdG9sLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjU1LCANCiAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMS42OCwgDQogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksDQogICAgICAgICAgICAgICAgICAgICBzaXplID0gMg0KICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgd2hvIGp1c3RpZnkgY29ycnVwdGlvbiBpbiBFY3VhZG9yLCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjdG9sX3RpbWUpDQoNCmBgYA0KTm93IHJlcGVhdCB0aGUgZ3JhcGggYXMgYSBiYXIgY2hhcnQ6DQoNCmBgYHtyIGN0b2xfZ3JhcGhfdGltZV9jb2wsICBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmN0b2xfdGltZV9jb2w8LWdncGxvdChjdG9sX3BlcmNfeWVhciwgYWVzKHggPSB5ZWFyLCB5ID0gY3RvbCwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGN0b2wgLSAxLjk2KnNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IGN0b2wgKyAxLjk2KnNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChjdG9sLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDYNCiAgICAgICAgICAgICAgICAgICAgICkrDQogICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IHdobyBqdXN0aWZ5IGNvcnJ1cHRpb24gaW4gRWN1YWRvciwgYnkgeWVhcicsDQogICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoY3RvbF90aW1lX2NvbCkNCmBgYA0KVGhlIG1vc3QgaW1wb3J0YW50IGdyYXBoIGluIHRoZSBwYXBlcjogaXQgc2hvd3MgaG93IHRoZSBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gcmVwb3J0IHRvbGVyYW5jZSB0byBicmliaW5nIGhhcyBncm93biBjb25zaWRlcmFibHkuIA0KDQojIyMgQ29uZmlkZW5jZSBpbiB0aGUgcHJlc2lkZW50IA0KDQpJIG5vdyBncmFwaCB0aGUgdGltZSBzZXJpZXMgb2YgYSBkaWNob3RvbWl6ZWQgY29uZmlkZW5jZSBpbiB0aGUgcHJlc2lkZW50IHZhcmlhYmxlLiBTY29yZXMgb3ZlciA0IGFyZSBjb2RlZCBhcyAxIGluIHRoaXMgZGljaG90b21pemVkIHZhcmlhYmxlLg0KDQpOb3cgSSBncmFwaCB0aGUgdGltZSBzZXJpZXMgb2YgcGVvcGxlIHdobyBjb25maWRlIGluIHRoZSBwcmVzaWRlbnQuIEFzIHVzdWFsIGluIHRoZSBMQVBPUCByZXBvcnRzLCB0aGUgY29uZmlkZW5jZSBpbiB0aGUgcHJlc2lkZW50IGlzIGNvZGVkIGFzIDEgd2hlbiB0aGUgc2NvcmVzIHJlc3BvbmRlZCBhcmUgb3ZlciBvciBlcXVhbCB0byA1LiANCg0KYGBge3IgcHJlc19jb25mX2NhbGN9DQoNCnByZXNfY29uZl9jYWxjPC1zdnlieSh+IHByZXNfY29uZl9kaWMsIA0KICAgICAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gYWJfZGVzX2VjLCANCiAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCg0KIyBTZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIEkgd2FudCBhbmQgcmVuYW1lDQoNCnByZXNfY29uZl9jYWxjPC1kcGx5cjo6c2VsZWN0KHByZXNfY29uZl9jYWxjLCB5ZWFyLCBwcmVzX2NvbmZfZGljWWVzLCBzZS5wcmVzX2NvbmZfZGljWWVzKSAlPiUgDQogICAgICAgICAgICAgICAgcmVuYW1lKCdZZXMnPXByZXNfY29uZl9kaWNZZXMsICdTRS55Jz1zZS5wcmVzX2NvbmZfZGljWWVzKQ0KDQojIERlbGV0ZSB5ZWFycyB0aGVyZSBpc24ndCBkYXRhIGZvcg0KDQpwcmVzX2NvbmZfY2FsYzwtIHByZXNfY29uZl9jYWxjWzM6OCxdDQoNCnByZXNfY29uZl9jYWxjDQoNCmBgYA0KDQpgYGB7ciBwcmVzX2NvbmZfZ30NCg0KcHJlc19jb25mX2c8LWdncGxvdChwcmVzX2NvbmZfY2FsYywgYWVzKHggPSB5ZWFyLCB5ID0gWWVzLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWWVzIC0gMS42KlNFLnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gWWVzICsgMS42KlNFLnkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKFllcywgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDYpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBwZW9wbGUgd2hvIHJlcG9ydCBjb25maWRlbmNlIGluIHRoZSBwcmVzaWRlbnQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChwcmVzX2NvbmZfZykNCg0KYGBgDQoNCkFzIHNlZW4gYmVmb3JlLCBjb25maWRlbmNlIGluIHRoZSBwcmVzaWRlbnQgZHJvcHMgc2hhcnBseSBiZXR3ZWVuIDIwMTQgYW5kIDIwMTYuIFRoaXMgaXMgbW9yZSBpbnRlcmVzdGluZyB0aGFuIHRoZSBkcm9wIGZvciAyMDE5LCBzaW5jZSBuYXR1cmFsbHkgdGhlIG5ldyBhZG1pbmlzdHJhdGlvbiB3YXMgZ29pbmcgdG8gbG9zZSBjb25maWRlbmNlIGFzIGl0IHN3aXRjaGVkIHRoZSBwb2xpdGljYWwgc3BlY3RydW0gYWJydXB0bHkuIA0KDQojIyMgVW5lbXBsb3ltZW50IA0KDQpGaXJzdCwgSSBjYWxjdWxhdGUgdW5lbXBsb3ltZW50IHJhdGVzIGFzIGRlZmluZWQgYnkgdGhpcyBzdXJ2ZXkuIEkgZ3JhcGggdGhlbSBhcyBhIGJhciBjaGFydCBhZnRlci4gDQoNCmBgYHtyIHVuZW1fcGVyY3N9DQp1bmVtX3RpbWU8LXN2eWJ5KH4gdW5lbTJfNGEsIA0KICAgICAgICAgICAgICAgICB+IHllYXIsIA0KICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsIA0KICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQoNCnVuZW1fdGltZTwtdW5lbV90aW1lWzM6OCxdDQp1bmVtX3RpbWUNCmBgYA0KDQpgYGB7ciB1bmVtX3RpbWUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KdW5lbV90aW1lX2c8LWdncGxvdCh1bmVtX3RpbWUsIGFlcyh4ID0geWVhciwgeSA9IHVuZW0yXzRhLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gdW5lbTJfNGEgLSBzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IHVuZW0yXzRhICsgc2UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZCh1bmVtMl80YSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMi4xDQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gcmVwb3J0IGJlaW5nIHVuZW1wbG95ZWQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHVuZW1fdGltZV9nKQ0KYGBgDQoNCiMjIyBFY29ub21pYyBTaXR1YXRpb24NCg0KTm93IEkgZG8gdGhlIHNhbWUgcHJvY2VkdXJlcyBmb3IgdGhlIGVjb25vbWljIHNpdHVhdGlvbiBxdWVzdGlvbiwgcGF5aW5nIGF0dGVudGlvbiB0byB0aG9zZSB3aG8gcmVwb3J0IGhhdmluZyBhIHdvcnNlIGVjb25vbWljIHNpdHVhdGlvbiByZWxhdGl2ZSB0byB0aGVpciBzaXR1YXRpb24gMTIgbW9udGhzIGJlZm9yZS4NCg0KYGBge3IgZWNfc2l0X3BlcmN9DQplY3NpdF90aW1lPC1zdnlieSh+IGVjb25fc2l0LCANCiAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsIA0KICAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCg0KIyBTZWxlY3Qgb25seSB0aGUgV29yc2UgcGVyY2VudGFnZXMNCg0KZWNzaXRfdGltZTwtZHBseXI6OnNlbGVjdChlY3NpdF90aW1lLCB5ZWFyLCBlY29uX3NpdFdvcnNlLCBzZS5lY29uX3NpdFdvcnNlKQ0KZWNzaXRfdGltZQ0KYGBgDQoNCk5vdyB0aGUgZ3JhcGg6IA0KDQpgYGB7ciBlY19zaXRfZ3JhcGh9DQplY19zaXRfZzwtZ2dwbG90KGVjc2l0X3RpbWUsIGFlcyh4ID0geWVhciwgeSA9IGVjb25fc2l0V29yc2UsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBlY29uX3NpdFdvcnNlIC0gc2UuZWNvbl9zaXRXb3JzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IGVjb25fc2l0V29yc2UgKyBzZS5lY29uX3NpdFdvcnNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoZWNvbl9zaXRXb3JzZSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMS41DQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gcmVwb3J0IGhhdmluZyB3b3JzZSBlY29ub21pYyBzaXR1YXRpb25zLCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChlY19zaXRfZykNCmBgYA0KQSB2ZXJ5LCB2ZXJ5IGltcG9ydGFudCBpbmNyZWFzZSBiZXR3ZWVuIDIwMTQgYW5kIDIwMTYuIExldCdzIHNlZSBob3cgaXQgYWZmZWN0cyB0aGUgY29tcG9zaXRpb24gb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzLg0KDQojIyMgUG9saXRpY2FsIFNjb3JlL0dyb3Vwcw0KDQpOb3cgSSBjYWxjdWxhdGUgYW5kIHByZXNlbnQgcGVyY2VudGFnZXMgb2YgcGVvcGxlIHRoYXQgYW5zd2VyIGFib3V0IHRoZWlyIHNjb3JlcyBvbiB0aGUgcG9saXRpY2FsIHdpbmdzLiANCg0KRmlyc3QsIEkgY2FsY3VsYXRlIGFuZCBncmFwaCB0aGUgcG9saXRpemF0aW9uIGluZGljYXRvciBhcyBzaG93biBpbiB0aGUgTEFQT1AgcmVwb3J0LiBFcXVhbHMgMSBpZiB0aGUgcGVyc29uIGRpZCBOT1QgYW5zd2VyIHRoZSBwb2xpdGljYWwgc2NvcmUuIE1vcmUgcG9saXRpemF0aW9uIG1lYW5zIGEgbG93ZXIgcGVyY2VudGFnZSBvZiBubyByZXNwb25zZXMuIA0KDQpgYGB7ciBwb2xpdGl6YXRpb25fdGFifQ0KcG9saXRpemF0aW9uX3RpbWU8LXN2eWJ5KH4gcGxzY3JfbmEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gYWJfZGVzX2VjLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCnBvbGl0aXphdGlvbl90aW1lDQpgYGANCk5vdyB0aGUgZ3JhcGg6IA0KDQpgYGB7ciBwb2xpdGl6YXRpb25fZ30NCnBvbGl0X2c8LWdncGxvdChwb2xpdGl6YXRpb25fdGltZSwgYWVzKHggPSB5ZWFyLCB5ID0gcGxzY3JfbmEsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcGxzY3JfbmEgLSBzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gcGxzY3JfbmEgKyBzZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChwbHNjcl9uYSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTIuMikrDQogICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IHdobyBkbyBub3QgYW5zd2VyIHRoZSBwb2xpdGljYWwgc2NvcmUgcXVlc3Rpb24sIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHBvbGl0X2cpDQpgYGANCg0KTm93IHRoZSBzYW1lIHByb2NlZHVyZSBmb3IgYWxsIHRocmVlIHBvbGl0aWNhbCBwb3NpdGlvbnMsIGFzIGRlZmluZWQgYnkgTEFQT1AgcmVwb3J0czogbGVmdCwgY2VudGVyIGFuZCByaWdodC4gDQoNCmBgYHtyIHBvbHNjb3JlX3RhYn0NCnBvbGdyb3VwX3RpbWVfY2FsYzwtc3Z5YnkofiBwb2xfZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB+IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQojIFJlbmFtZSB2YXJpYWJsZXMNCnBvbGdyb3VwX3RpbWVfY2FsYzwtcmVuYW1lKHBvbGdyb3VwX3RpbWVfY2FsYywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudGVyJyA9IHBvbF9ncm91cENlbnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnTGVmdCcgPSBwb2xfZ3JvdXBMZWZ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdSaWdodCcgPSBwb2xfZ3JvdXBSaWdodCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb25lJyA9IHBvbF9ncm91cE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnU0UuYyc9IHNlLnBvbF9ncm91cENlbnRlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRS5sJz0gc2UucG9sX2dyb3VwTGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRS5yJz0gc2UucG9sX2dyb3VwUmlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnU0Uubic9IHNlLnBvbF9ncm91cE5vbmUpDQpwb2xncm91cF90aW1lX2NhbGMNCmBgYA0KTm93IG1ha2UgdGhlIHRocmVlIGdyYXBoczoNCg0KYGBge3IgbGVmdF9ncmFwaH0NCmxlZnRfZzwtZ2dwbG90KHBvbGdyb3VwX3RpbWVfY2FsYywgYWVzKHggPSB5ZWFyLCB5ID0gTGVmdCwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExlZnQgLSBTRS5sLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IExlZnQgKyBTRS5sKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChMZWZ0LCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTIuMikrDQogICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gaWRlbnRpZnkgd2l0aCB0aGUgbGVmdCBwb2xpdGljYWwgd2luZywgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScsDQogICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnQ29ycmVzcG9uZHMgdG8gcGVvcGxlIGFuc3dlcmluZyBzY29yZXMgbG93ZXIgdGhhbiA1IGluIHRoZSBQb2xpdGljYWwgU2NvcmUgKEwxKSBxdWVzdGlvbicpDQpwcmludChsZWZ0X2cpDQoNCmBgYA0KDQpgYGB7ciByaWdodF9ncmFwaH0NCnJpZ2h0X2c8LWdncGxvdChwb2xncm91cF90aW1lX2NhbGMsIGFlcyh4ID0geWVhciwgeSA9IFJpZ2h0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gUmlnaHQgLSBTRS5yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFJpZ2h0ICsgU0UuciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoUmlnaHQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMS45KSsNCiAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IHdobyBpZGVudGlmeSB3aXRoIHRoZSByaWdodCBwb2xpdGljYWwgd2luZywgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScsDQogICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnQ29ycmVzcG9uZHMgdG8gcGVvcGxlIGFuc3dlcmluZyBzY29yZXMgaGlnaGVyIHRoYW4gNyBpbiB0aGUgUG9saXRpY2FsIFNjb3JlIChMMSkgcXVlc3Rpb24nKQ0KcHJpbnQocmlnaHRfZykNCg0KYGBgDQpgYGB7ciBjZW50ZXJfZ3JhcGh9DQpjZW50ZXJfZzwtZ2dwbG90KHBvbGdyb3VwX3RpbWVfY2FsYywgYWVzKHggPSB5ZWFyLCB5ID0gQ2VudGVyLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ2VudGVyIC0gU0UuYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IENlbnRlciArIFNFLmMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChDZW50ZXIsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMS4zKSsNCiAgICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgd2hvIGlkZW50aWZ5IGluIHRoZSBjZW50ZXIgb2YgdGhlIHBvbGl0aWNhbCB3aW5ncywgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknLA0KICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICdDb3JyZXNwb25kcyB0byBwZW9wbGUgYW5zd2VyaW5nIHNjb3JlcyBiZXR3ZWVuIDQgYW5kIDcgaW4gdGhlIFBvbGl0aWNhbCBTY29yZSAoTDEpIHF1ZXN0aW9uJykNCnByaW50KGNlbnRlcl9nKQ0KDQpgYGANCg0KVGhlIHBlcmNlbnRhZ2VzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIExBUE9QIHJlcG9ydDogdGhlIHJpZ2h0IHdpbnMgYSBsb3QgYmV0d2VlbiAyMDE0IGFuZCAyMDE2LCB3aGVyZSBhcyB0aGUgY2VudGVyIGFsc28gZ2FpbnMgYW5kIHRoZSBsZWZ0IHJlbWFpbnMgdGhlIHNhbWUuIFBlb3BsZSB3aG8gYXJlICJuZXV0cmFsIiBkZWNyZWFzZSBzdGVhZGlseSwgdGhlIHNoYXJwZXN0IGRyb3AgaXMgaW4gMjAxNiwgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RpbmcuIA0KDQojIyMgUHJlc2lkZW50aWFsIEpvYiBBcHByb3ZhbCBSYXRpbmcNCg0KRHJhdyBhIHRpbWUgc2VyaWVzIG9mIHRoaXMgdmFyaWFibGUuDQoNCmBgYHtyIHByZXNfYXByb3Z9DQoNCnByZXNfYXBwcm92YWxfdGltZTwtc3Z5YnkofiBwcmVzX2Fwcm92X2RpYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfiB5ZWFyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KDQpwcmVzX2FwcHJvdmFsX3RpbWU8LWRwbHlyOjpzZWxlY3QocHJlc19hcHByb3ZhbF90aW1lLCB5ZWFyLCBwcmVzX2Fwcm92X2RpYywgc2UpDQoNCg0KYGBgDQpOb3cgSSdsbCBncmFwaCB0aGUgdGltZSBzZXJpZXM6DQoNCmBgYHtyIHByZXNfYXByb3ZfdGd9DQpwcmVzX2Fwcm92X3RnPC0NCiAgZ2dwbG90KHByZXNfYXBwcm92YWxfdGltZSwgYWVzKHggPSB5ZWFyLCB5ID0gcHJlc19hcHJvdl9kaWMpKSsNCiAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHByZXNfYXByb3ZfZGljIC0gc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBwcmVzX2Fwcm92X2RpYyArIHNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKHByZXNfYXByb3ZfZGljLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTEuMykrDQogICAgICAgICAgIHRoZW1lX2J3KCkgKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gYXBwcm92ZSB0aGUgam9iIHBlcmZvcm1hbmNlIG9mIHRoZSBQcmVzaWRlbnQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChwcmVzX2Fwcm92X3RnKQ0KYGBgDQoNCiMjIERlY29tcG9zaW5nIGNvcnJ1cHRpb24gdG9sZXJhbmNlDQoNCkhlcmUgSSB3aWxsIGdyYXBoIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4cGxhaW4sIHRocm91Z2ggZGVzY3JpcHRpdmUgc3RhdGlzdGljcywgdGhlIERpRCBtb2RlbHMuIEkgZGVjb21wb3NlIHRoZSBwZW9wbGUgdGhhdCBhbnN3ZXIgIlllcyIgdG8gdG9sZXJhdGluZyBhIGJyaWJlLCBhbmQgY29tcGFyZSB0aG9zZSBkZWNvbXBvc2l0aW9ucyB0aHJvdWdoIDIwMTQgYW5kIDIwMTYuIA0KDQojIyMgVW5lbXBsb3ltZW50DQoNCk5vdywgSSBjb25zaWRlciB0aGUgJSBvZiBwZW9wbGUgd2hvIGFuc3dlcmVkICJZRVMiIHRvIGEgYnJpYmUgYmVpbmcganVzdGlmaWVkIHdobyByZXBvcnQgYmVpbmcgdW5lbXBsb3llZC4gDQoNCkZpcnN0LCBJIHN1YnNldCBvdXQgdGhlIGRhdGFzZXQgdG8gaGF2ZSBvbmx5IHBvc2l0aXZlIHJlc3BvbnNlcyB0byB0aGUgJGN0b2wkIHZhcmlhYmxlIGFuZCB0aGVuIGNyZWF0ZSBhIG5ldyBzdXJ2ZXkgZGVzaWduIG9iamVjdCB0byBsYXRlciB1c2UgaW4gY2FsY3VsYXRpb25zLiANCg0KYGBge3IgdW5lbV9jdG9sfQ0KIyBTdWJzZXQgYSBiYXNlIHdpdGggb25seSB5ZXMgcmVzcG9uc2VzIHRvIGN0b2wNCg0KZGZfY3RvbDwtc3Vic2V0KGRmLCANCiAgICAgICAgICAgICAgICBkZiRjdG9sID09IDEpDQoNCiMgRGVjbGFyZSBpdHMgc3VydmV5IGRlc2lnbg0KDQpjdG9sX2Rlczwtc3Z5ZGVzaWduKGlkcyA9IH4gdXBtLCANCiAgICAgICAgICAgICAgICAgICBzdHJhdGEgPSB+IGVzdHJhdG9wcmksIA0KICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB+IHdlaWdodDE1MDAsIA0KICAgICAgICAgICAgICAgICAgIG5lc3QgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9ICduYS5leGNsdWRlJywNCiAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfY3RvbCkNCg0KIyBOb3cgc3Vic2V0IGEgYmFzZSB3aXRoIG9ubHkgIm5vIiByZXNwb25zZXMNCg0KZGZfY3RvbF9ubzwtc3Vic2V0KGRmLCANCiAgICAgICAgICAgICAgICAgICBkZiRjdG9sID09IDApDQoNCiMgRGVjbGFyZSBpdHMgc3VydmV5IGRlc2lnbg0KDQpjdG9sX2Rlc19ubzwtc3Z5ZGVzaWduKGlkcyA9IH4gdXBtLCANCiAgICAgICAgICAgICAgICAgICBzdHJhdGEgPSB+IGVzdHJhdG9wcmksIA0KICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB+IHdlaWdodDE1MDAsIA0KICAgICAgICAgICAgICAgICAgIG5lc3QgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9ICduYS5leGNsdWRlJywNCiAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfY3RvbF9ubykNCg0KYGBgDQoNCk5vdyBJIGRvIHRoZSBjYWxjdWxhdGlvbnMsIGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzIHRvbyAoYXMgbG9uZyBhcyB0aGlzIHRlY2huaXF1ZSB3b3JrcyB3ZWxsIGZyb20gYSBzdGF0aXN0aWNhbCB2aWV3cG9pbnQuIEl0IGFwcGVhcnMgaXQgZG9lcykuIA0KDQpgYGB7ciB1bmVtX2N0b2xfY2FsY30NCnVuZW1fY3RvbDwtc3Z5YnkofiB1bmVtMl80YSwgDQogICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgIGRlc2lnbiA9IGN0b2xfZGVzLCANCiAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkNCnVuZW1fY3RvbDwtdW5lbV9jdG9sWzM6OCxdDQp1bmVtX2N0b2wNCmBgYA0KDQpHcmFwaCBiZWxvdzoNCg0KYGBge3IgdW5lbV9jdG9sX2csIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KdW5lbV90aW1lY19nPC1nZ3Bsb3QodW5lbV9jdG9sLCBhZXMoeCA9IHllYXIsIHkgPSB1bmVtMl80YSwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHVuZW0yXzRhIC0gc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSB1bmVtMl80YSArIHNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQodW5lbTJfNGEsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSsNCiAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyByZXBvcnQgYmVpbmcgdW5lbXBsb3llZCwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHVuZW1fdGltZWNfZykNCg0KYGBgDQpDaGFuZ2UgYmV0d2VlbiAyMDE0IGFuZCAyMDE2IHNlZW1zIHRyaXZpYWwsIHRoZSBpbnRlcmVzdGluZyBqdW1wIGlzIGZyb20gMjAxMiB0byAyMDE0LiBOb3RlIGhvdyBpbiBkaWZmZXJlbnQgeWVhcnMgdGhlcmUgYXJlIGRpZmZlcmVudCBlcnJvciBtYXJnaW5zLCBwcm9iYWJseSBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdGhlIHNhbXBsZSBzaXplLiBUaGlzIHZhcmllcyBkaXJlY3RseSB3aXRoIHRoZSAlIG9mIGNvcnJ1cHRpb24ganVzdGlmaWVycywgd2hpY2ggaXMgcXVpdGUgbG93IGZvciAyMDE0LiANCg0KIyMjIEVjb25vbWljIFNpdHVhdGlvbg0KDQpJIHdpbGwgZ3JhcGggdGhlICUgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyByZXBvcnQgYmVpbmcgd29yc2Ugb2ZmIGluIDIwMTYgaW4gdGhlaXIgZWNvbm9taWMgc2l0dWF0aW9uLiBGaXJzdCBJIGRvIHRoZSBjYWxjdWxhdGlvbnM6IA0KDQpgYGB7ciBlY3NpdF9jdG9sfQ0KZWNzaXRfY3RvbDwtc3Z5YnkofiBlY29uX3NpdCwgDQogICAgICAgICAgICAgICAgICB+IHllYXIsIA0KICAgICAgICAgICAgICAgICAgZGVzaWduID0gY3RvbF9kZXMsIA0KICAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSANCiAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKQ0KDQojIFNlbGVjdCB0aGUgY29sdW1ucyBJJ20gaW50ZXJlc3RlZCBpbg0KDQplY3NpdF9jdG9sPC1kcGx5cjo6c2VsZWN0KGVjc2l0X2N0b2wsIHllYXIsIGVjb25fc2l0V29yc2UsIHNlLmVjb25fc2l0V29yc2UpDQplY3NpdF9jdG9sDQpgYGANClRoZSBncmFwaCBiZWxvdw0KDQpgYGB7ciBlY19zaXRfY3RvbF9nfQ0KZWNfc2l0Y19nPC1nZ3Bsb3QoZWNzaXRfY3RvbCwgYWVzKHggPSB5ZWFyLCB5ID0gZWNvbl9zaXRXb3JzZSwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVjb25fc2l0V29yc2UgLSBzZS5lY29uX3NpdFdvcnNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gZWNvbl9zaXRXb3JzZSArIHNlLmVjb25fc2l0V29yc2UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChlY29uX3NpdFdvcnNlLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICB2anVzdCA9IC0yDQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBjb3JydXB0aW9uIGp1c3RpZmllcnMgd2hvIHJlcG9ydCBoYXZpbmcgd29yc2UgZWNvbm9taWMgc2l0dWF0aW9ucywgYnkgeWVhcicsDQogICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoZWNfc2l0Y19nKQ0KYGBgDQpUaGUgcGVyY2VudGFnZSBpbmNyZWFzZSBvZiB0aGUgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdpdGggd29yc2UgZWNvbm9taWMgc2l0dWF0aW9uIHNlZW1zIHByZXR0eSBjbG9zZSB3aXRoIHRoZSBvdmVyYWxsIHBlcmNlbnRhZ2UgaW5jcmVhc2UuIA0KDQpMZXQncyBzZWUgaG93IHRoZSBzYW1lIHdvcmtzIGZvciBOT04gY29ycnVwdGlvbiBqdXN0aWZpZXJzLiANCg0KYGBge3IgZWNzaXRfY3RvbF9ub30NCiMgU3VydmV5IGRlc2lnbiBmb3IgY29ycnVwdGlvbiByZWplY3RlcnMuDQplY3NpdF9jdG9sbjwtc3Z5YnkofiBlY29uX3NpdCwgDQogICAgICAgICAgICAgICAgICAgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBjdG9sX2Rlc19ubywgDQogICAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgDQogICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpDQoNCiMgU2VsZWN0IHRoZSBjb2x1bW5zIEknbSBpbnRlcmVzdGVkIGluDQoNCmVjc2l0X2N0b2xuPC1kcGx5cjo6c2VsZWN0KGVjc2l0X2N0b2xuLCB5ZWFyLCBlY29uX3NpdFdvcnNlLCBzZS5lY29uX3NpdFdvcnNlKQ0KZWNzaXRfY3RvbG4NCg0KYGBgDQpUaGUgZ3JhcGg6IA0KDQpgYGB7ciBlY19zaXRfY3RvbG5fZ30NCmVjX3NpdGNfZzwtZ2dwbG90KGVjc2l0X2N0b2xuLCBhZXMoeCA9IHllYXIsIHkgPSBlY29uX3NpdFdvcnNlLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZWNvbl9zaXRXb3JzZSAtIHNlLmVjb25fc2l0V29yc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBlY29uX3NpdFdvcnNlICsgc2UuZWNvbl9zaXRXb3JzZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKGVjb25fc2l0V29yc2UsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTEuNQ0KICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiByZWplY3RlcnMgd2hvIHJlcG9ydCBoYXZpbmcgd29yc2UgZWNvbm9taWMgc2l0dWF0aW9ucywgYnkgeWVhcicsDQogICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoZWNfc2l0Y19nKQ0KYGBgDQpJbmRlZWQsIHRoZSBlY29ub21pYyBlZmZlY3Qgc2VlbXMgdG8gYWZmZWN0IGJvdGggY29ycnVwdGlvbiBqdXN0aWZpZXJzIGFuZCByZWplY3RlcnMgZXF1YWxseSBhY2NvcmRpbmcgdG8gdGhpcyBncmFwaC4gVGhlICJzYW1lIGRpZmZlcmVuY2UiIGlzIGZvdW5kIGJldHdlZW4gMjAxNCBhbmQgMjAxNi4gVGh1cyB0aGF0IG1pZ2h0IGJlIHdoeSB0aGUgZWNvbm9taWMgc2l0dWF0aW9uIHZhcmlhYmxlIGlzIG5vdCBzaWduaWZpY2F0aXZlIGluIG15IHJlZ3Jlc3Npb24gbW9kZWxzLiANCg0KIyMjIFBvbGl0aWNhbCBTY29yZQ0KDQpOb3cgbGV0cyBzZWUgaG93IHRoaXMgd29ya3Mgd2l0aGluIHRoZSBjb3JydXB0aW9uIGp1c3RpZmllcnMuIA0KDQpgYGB7ciBwb2xpdF9jdG9sfQ0KcG9sZ3JvdXBfY3RvbDwtc3Z5YnkofiBwb2xfZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IGN0b2xfZGVzLCANCiAgICAgICAgICAgICAgICAgICAgIHN2eW1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkNCiMgUmVuYW1lDQpwb2xncm91cF9jdG9sPC1yZW5hbWUocG9sZ3JvdXBfY3RvbCwgDQogICAgICAgICAgICAgICAgICAgICAgJ0NlbnRlcicgPSBwb2xfZ3JvdXBDZW50ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICdMZWZ0JyA9IHBvbF9ncm91cExlZnQsIA0KICAgICAgICAgICAgICAgICAgICAgICdSaWdodCcgPSBwb2xfZ3JvdXBSaWdodCwNCiAgICAgICAgICAgICAgICAgICAgICAnTm9uZScgPSBwb2xfZ3JvdXBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5jJz0gc2UucG9sX2dyb3VwQ2VudGVyLA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5sJz0gc2UucG9sX2dyb3VwTGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAnU0Uucic9IHNlLnBvbF9ncm91cFJpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5uJz0gc2UucG9sX2dyb3VwTm9uZSkNCnBvbGdyb3VwX2N0b2wNCmBgYA0KR3JhcGggdGhlIHBvbGl0aXphdGlvbiBwZXJjZW50YWdlIG9mIHRoZSBjb3JydXB0aW9uIGp1c3RpZmllcnMuDQoNCmBgYHtyIHBvbGl0X2N0b2xfZ30NCnBvbGl0X2N0b2xfZzwtZ2dwbG90KHBvbGdyb3VwX2N0b2wsIGFlcyh4ID0geWVhciwgeSA9IE5vbmUsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBOb25lIC0gU0UubiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBOb25lICsgU0UubiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoTm9uZSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IC0zLjIpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBjb3JydXB0aW9uIGp1c3RpZmllcnMgd2hvIGRvIG5vdCBhbnN3ZXIgdGhlIHBvbGl0aWNhbCBzY29yZSBxdWVzdGlvbiwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHBvbGl0X2N0b2xfZykNCmBgYA0KVGhpcyBncmFwaCBzaG93cyBhIGRyb3AsIHdoaWNoIGNvdWxkIGJlIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQsIGNvbnNpZGVyaW5nIHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIA0KDQpOb3cgZ3JhcGggdGhlIG90aGVyIHBvbGl0aWNhbCB3aW5ncyBvZiB0aGUgY29ycnVwdGlvbiBqdXN0aWZpZXJzLiANCg0KYGBge3IgY3RvbF9yaWdodH0NCnJpZ2h0X2N0b2xfZzwtZ2dwbG90KHBvbGdyb3VwX2N0b2wsIGFlcyh4ID0geWVhciwgeSA9IFJpZ2h0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gUmlnaHQgLSBTRS5yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFJpZ2h0ICsgU0UuciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoUmlnaHQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSByaWdodCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHJpZ2h0X2N0b2xfZykNCmBgYA0KQW4gaW50ZXJlc3RpbmcgaW5jcmVhc2UsIHdoaWNoIEkgZ3Vlc3MganVzdGlmaWVzIHRoZSBtYXJnaW5hbCBzaWduaWZpY2FuY2Ugb2YgdGhpcyB2YXJpYWJsZSBpbiBtb2RlbHMuIA0KDQpUaGUgZ3JhcGggb2YgdGhlIGxlZnQgbm93OiANCg0KYGBge3IgY3RvbF9sZWZ0fQ0KbGVmdF9jdG9sX2c8LWdncGxvdChwb2xncm91cF9jdG9sLCBhZXMoeCA9IHllYXIsIHkgPSBMZWZ0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gTGVmdCAtIFNFLmwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gTGVmdCArIFNFLmwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKExlZnQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSBsZWZ0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQobGVmdF9jdG9sX2cpDQpgYGANClRoZSBncmFwaCBvZiB0aGUgY2VudGVyIG5vdzoNCg0KYGBge3IgY3RvbF9jZW50ZXJ9DQpjZW50ZXJfY3RvbF9nPC1nZ3Bsb3QocG9sZ3JvdXBfY3RvbCwgYWVzKHggPSB5ZWFyLCB5ID0gQ2VudGVyLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ2VudGVyIC0gU0UuYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBDZW50ZXIgKyBTRS5jKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChDZW50ZXIsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSBjZW50ZXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjZW50ZXJfY3RvbF9nKQ0KYGBgDQpMZXRzIGRvIHRoZSBzYW1lIGZvciB0aGUgY29ycnVwdGlvbiByZWplY3RlcnMuIEZpcnN0IHRoZSBjYWxjdWxhdGlvbnMuIA0KDQpgYGB7ciBjdG9sX3Jlal9nfQ0KDQpwb2xncm91cF9jdG9sbjwtc3Z5YnkofiBwb2xfZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IGN0b2xfZGVzX25vLCANCiAgICAgICAgICAgICAgICAgICAgIHN2eW1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkNCiMgUmVuYW1lDQpwb2xncm91cF9jdG9sbjwtcmVuYW1lKHBvbGdyb3VwX2N0b2xuLCANCiAgICAgICAgICAgICAgICAgICAgICAnQ2VudGVyJyA9IHBvbF9ncm91cENlbnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgJ0xlZnQnID0gcG9sX2dyb3VwTGVmdCwgDQogICAgICAgICAgICAgICAgICAgICAgJ1JpZ2h0JyA9IHBvbF9ncm91cFJpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICdOb25lJyA9IHBvbF9ncm91cE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgJ1NFLmMnPSBzZS5wb2xfZ3JvdXBDZW50ZXIsDQogICAgICAgICAgICAgICAgICAgICAgJ1NFLmwnPSBzZS5wb2xfZ3JvdXBMZWZ0LA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5yJz0gc2UucG9sX2dyb3VwUmlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgJ1NFLm4nPSBzZS5wb2xfZ3JvdXBOb25lKQ0KcG9sZ3JvdXBfY3RvbG4NCmBgYA0KDQpgYGB7ciBjdG9sbl9ub25lX2d9DQpjdG9sbl9ub25lX2c8LWdncGxvdChwb2xncm91cF9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gTm9uZSwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IE5vbmUgLSBTRS5uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IE5vbmUgKyBTRS5uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChOb25lLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gNikrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IG9mIGNvcnJ1cHRpb24gcmVqZWN0ZXJzIHdobyBkbyBub3QgYW5zd2VyIHRoZSBwb2xpdGljYWwgc2NvcmUgcXVlc3Rpb24sIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjdG9sbl9ub25lX2cpDQpgYGANCmBgYHtyIGN0b2xuX2NlbnRlcl9nfQ0KY3RvbG5fY2VudGVyX2c8LWdncGxvdChwb2xncm91cF9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gQ2VudGVyLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ2VudGVyIC0gU0UuYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBDZW50ZXIgKyBTRS5jKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChDZW50ZXIsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiByZWplY3RlcnMgd2hvIGlkZW50aWZ5IHdpdGggdGhlIGNlbnRlciwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KGN0b2xuX2NlbnRlcl9nKQ0KYGBgDQpgYGB7ciBjdG9sbl9sZWZ0X2d9DQpjdG9sbl9sZWZ0X2c8LWdncGxvdChwb2xncm91cF9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gTGVmdCwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExlZnQgLSBTRS5sLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IExlZnQgKyBTRS5sKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChMZWZ0LCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gNikrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IG9mIGNvcnJ1cHRpb24gcmVqZWN0ZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSBsZWZ0LCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoY3RvbG5fbGVmdF9nKQ0KYGBgDQoNCmBgYHtyIGN0b2xuX3JpZ2h0X2d9DQpjdG9sbl9yaWdodF9nPC1nZ3Bsb3QocG9sZ3JvdXBfY3RvbG4sIGFlcyh4ID0geWVhciwgeSA9IFJpZ2h0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gUmlnaHQgLSBTRS5yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFJpZ2h0ICsgU0UuciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoUmlnaHQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiByZWplY3RlcnMgd2hvIGlkZW50aWZ5IHdpdGggdGhlIHJpZ2h0LCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoY3RvbG5fcmlnaHRfZykNCmBgYA0KQW4gaW1wb3J0YW50IHBvaW50OiBjb3JydXB0aW9uIHJlamVjdGVycyBBTFNPIHdpbiBhIGxvdCBvZiByaWdodC13aW5nIHJlc3BvbmRlbnRzIGZvciAyMDE2LiBUaGlzIG1pZ2h0IGJlIHdoeSANCg0KIyMjIENvbmZpZGVuY2UgaW4gdGhlIHByZXNpZGVudA0KDQpEZWNvbXBvc2UgdG9sZXJhbmNlIHRvIGNvcnJ1cHRpb24gY29uc2lkZXJpbmcgdGhlIGRpY2hvdG9taXplZCB2ZXJzaW9uIG9mIHByZXNpZGVudGlhbCBjb25maWRlbmNlLiANCg0KYGBge3IgcGNvbmZfY3RvbF9jYWxjfQ0KcGNvbmZfY3RvbDwtc3Z5YnkofiBwcmVzX2NvbmZfZGljLCANCiAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBjdG9sX2RlcywgDQogICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIA0KICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpDQoNCnBjb25mX2N0b2w8LWRwbHlyOjpzZWxlY3QocGNvbmZfY3RvbCwgeWVhciwgcHJlc19jb25mX2RpY1llcywgc2UucHJlc19jb25mX2RpY1llcykgJT4lIA0KICAgICAgICAgICAgcmVuYW1lKCdZZXMnID0gcHJlc19jb25mX2RpY1llcywgJ1NFJyA9ICBzZS5wcmVzX2NvbmZfZGljWWVzKQ0KDQpwY29uZl9jdG9sPC1wY29uZl9jdG9sWzM6OCxdDQpwY29uZl9jdG9sDQpgYGANCk5vdyB0aGUgZ3JhcGg6IA0KDQpgYGB7ciBwcmVzX2NvbmZfY3RvbF9nfQ0KY3RvbF9wcmVzX2NvbmZfZzwtZ2dwbG90KHBjb25mX2N0b2wsIGFlcyh4ID0geWVhciwgeSA9IFllcywgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFllcyAtIFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFllcyArIFNFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChZZXMsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBjb25maWRlIHdpdGggdGhlIHByZXNpZGVudCwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KGN0b2xfcHJlc19jb25mX2cpDQpgYGANCkRvIHRoZSBzYW1lIGZvciBjb3JydXB0aW9uIHJlamVjdGVycy4gDQoNCmBgYHtyIHBjb25mX2N0b2xuX2NhbGN9DQpwY29uZl9jdG9sbjwtc3Z5YnkofiBwcmVzX2NvbmZfZGljLCANCiAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBjdG9sX2Rlc19ubywgDQogICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIA0KICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpDQoNCnBjb25mX2N0b2xuPC1kcGx5cjo6c2VsZWN0KHBjb25mX2N0b2xuLCB5ZWFyLCBwcmVzX2NvbmZfZGljWWVzLCBzZS5wcmVzX2NvbmZfZGljWWVzKSAlPiUgDQogICAgICAgICAgICByZW5hbWUoJ1llcycgPSBwcmVzX2NvbmZfZGljWWVzLCAnU0UnID0gIHNlLnByZXNfY29uZl9kaWNZZXMpDQoNCnBjb25mX2N0b2xuPC1wY29uZl9jdG9sblszOjgsXQ0KcGNvbmZfY3RvbG4NCmBgYA0KDQpOb3cgdGhlIGdyYXBoOiANCg0KYGBge3IgY3RvbG5fcHJlc19jb25mX2dyYXBofQ0KY3RvbG5fcHJlc19jb25mX2c8LWdncGxvdChwY29uZl9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gWWVzLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWWVzIC0gU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gWWVzICsgU0UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKFllcywgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDYpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBjb3JydXB0aW9uIHJlamVjdGVycyB3aG8gY29uZmlkZSB3aXRoIHRoZSBwcmVzaWRlbnQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjdG9sbl9wcmVzX2NvbmZfZykNCg0KYGBgDQoNClRoaXMgaXMgdGhlIHB1bmNobGluZS4gVGhlIHBlb3BsZSB3aG8gdXNlZCB0byByZWplY3QgY29ycnVwdGlvbiBzdG9wcGVkIGRvaW5nIHNvOiBnb3Zlcm5tZW50IHplYWxvdHJ5IHN0b3BwZWQuIElmIHRoZXJlIHdlcmUgbGVzcyBwZW9wbGUgd2hvIGNvbmZpZGVkIGluIHRoZSBwcmVzaWRlbnQsIGFuZCBpbiB0dXJuIHRoZXNlIHBlb3BsZSBzZWVtZWQgdG8gc3RvcCByZWplY3RpbmcgY29ycnVwdCBhY3RpdGl2aXRpZXMsIGl0IG1ha2VzIHNlbnNlIHdoeSBjb3JydXB0aW9uIHRvbGVyYW5jZSBqdW1wZWQuIA0KDQoNCiMjIEdyYXBoaWNhbCBEaUQgcmVwcmVzZW50YXRpb25zDQoNCkhlcmUgSSByZXByZXNlbnQgdGhlIERpRCBtb2RlbHMgdGhyb3VnaCBzaW1wbGUgYmFyIGNoYXJ0IGNvbXBhcmlzb25zLiBCYXNpY2FsbHksIHdlIGhhdmUgdHdvIGdyb3VwcyBvZiBiYXJzLCBvbmUgZm9yIDIwMTQgYW5kIDIwMTYuIEVhY2ggYmFyIGluc2lkZSBhIHllYXIgc2hvd3MgdGhlICUgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIGluc2lkZSBhIGdyb3VwIHRoYXQgaXMgbWFkZSBhIERpRC4gDQoNCiMjIyBVbmVtcGxveW1lbnQNCg0KSGVyZSBJIGdyYXBoIHRoZSB1bmVtcGxveW1lbnQgRGlEIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiwgb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGVmZmVjdHMuIA0KDQoNCiMjIEdyYXBocyB1c2luZyBkYXRhIG91dHNpZGUgdGhlIEFtZXJpY2EncyBCYXJvbWV0ZXINCg0KQmVsb3csIEkgZHJhdyB0aGUgZ3JhcGhzIHdoaWNoIGFyZSBtYWRlIHdpdGhvdXQgdGhlIEFCJ3MgZGF0YQ0KDQojIyMgRnJvbSB0aGUgV29ybGQgQmFuaydzIFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMNCg0KSSBub3cgd2FudCB0byBncmFwaCB0aGUgR0RQIGdyb3d0aCBvZiBkaWZmZXJlbnQgbGF0aW4gYW1lcmljYW4gY291bnRyaWVzLCBpbmNsdWRpbmcgRWN1YWRvci4gQmVsb3csIEkgdXNlIHRoZSBgV0RJYCBwYWNrYWdlIHRvIGRvd25sb2FkIHRoZSBkYXRhIGZyb20gdGhlIFdvcmxkIEJhbmsncyBBUEkuIA0KDQpgYGB7ciBkb3dubG9hZF93ZGlfZ2RwZ30NCiMgRGVmaW5lIGNvdW50cnkgSVNPMiBjb2RlcyBmb3IgZG93bmxvYWRpbmcgdGhlIEdEUCBpbmRpY2F0b3JzDQoNCmNvdW50cmllc19sYXRhbTwtYygnRUMnLCAnQ0wnLCAnQ08nLCAnUEUnLCAnQk8nKQ0KDQojIERvd25sb2FkIEdEUCBkYXRhOiB0b3RhbCBhbmQgcGVyIGNhcGl0YSBncm93dGggcmF0ZXMgYW5kIG1hZ25pdHVkZSBwZXIgY2FwaXRhLCBjb25zdGFudCBwcmljZXMgMjAxMCBVU0QNCg0KZ2RwX3dkaTwtV0RJKGNvdW50cnkgPSBjb3VudHJpZXNfbGF0YW0sIGluZGljYXRvciA9IGMoJ05ZLkdEUC5NS1RQLktELlpHJywnTlkuR0RQLlBDQVAuS0QuWkcnLCAnTlkuR0RQLlBDQVAuS0QnKSkNCg0KIyBSZW5hbWUgdGhlIHZhcmlhYmxlcw0KDQpnZHBfd2RpPC1yZW5hbWUoZ2RwX3dkaSwgJ2dkcF9nJyA9IE5ZLkdEUC5NS1RQLktELlpHICwgJ2dkcHBjX2cnID0gTlkuR0RQLlBDQVAuS0QuWkcsICdnZHBfcGMnID0gTlkuR0RQLlBDQVAuS0QpDQoNCmBgYA0KDQpGaXJzdCBJIGdyYXBoIEdEUCBwZXIgY2FwaXRhIGdyb3d0aCByYXRlcyBmb3IgdGhlIGNvdW50cmllcyB0aGF0IEkgZ290Lg0KDQpgYGB7ciBnZHBwY19ncmFwaCwgZmlnLmFsaWduID0gJ2NlbnRlcicsIHdhcm5pbmcgPSBGfQ0KZ2RwcGNfZzwtDQogIGdncGxvdChnZHBfd2RpLCBhZXMoeCA9IHllYXIsIHkgPSBnZHBfcGMvMTAwMCwgY29sb3VyID0gY291bnRyeSkpICsgDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyLDQsNiw4LDEwLDEyLDE0KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxOTYwLCAxOTY1LCAxOTcwLCAxOTc1LCAxOTgwLCAxOTg1LCAxOTkwLCAxOTk1LCAyMDAwLCAyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjM1LDAuOTMpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBsYWJzKHggPSAnWWVhcicsIA0KICAgICAgIHkgPSAnR0RQIHBlciBDYXBpdGEgKFRob3VzYW5kcyBvZiBDb25zdGFudCAyMDEwIFVTRCknLA0KICAgICAgIGNvbG91ciA9ICdDb3VudHJ5JykrDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKQ0KDQpnZHBwY19nDQoNCmBgYA0KYGBge3IgZ2RwcGNfZ3Jvd3RoX2csIGZpZy5hbGlnbiA9ICdjZW50ZXInLCB3YXJuaW5nID0gRn0NCg0KZ2RwX3dkaTE8LXN1YnNldChnZHBfd2RpLCANCiAgICAgICAgICAgICAgICAgZ2RwX3dkaSRjb3VudHJ5ID09ICdFY3VhZG9yJ3wgZ2RwX3dkaSRjb3VudHJ5ID09ICdDb2xvbWJpYScgfCBnZHBfd2RpJGNvdW50cnkgPT0gJ1BlcnUnKQ0KDQpnZHBwY19ncm93dGhfZzwtDQogIGdncGxvdChnZHBfd2RpMSwgYWVzKHggPSB5ZWFyLCB5ID0gZ2RwcGNfZywgY29sb3VyID0gY291bnRyeSkpICsgDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyLDQsNiw4LDEwLDEyLDE0KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxOTYwLCAxOTY1LCAxOTcwLCAxOTc1LCAxOTgwLCAxOTg1LCAxOTkwLCAxOTk1LCAyMDAwLCAyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjM1LDAuOTMpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBsYWJzKHggPSAnWWVhcicsIA0KICAgICAgIHkgPSAnR0RQIHBlciBDYXBpdGEgQW5udWFsIEdyb3d0aCAoJSknLA0KICAgICAgIGNvbG91ciA9ICdDb3VudHJ5JykrDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKQ0KDQpnZHBwY19ncm93dGhfZw0KDQpgYGANCg0KDQojIyBPdXRwdXQgdG8gUE5HDQoNCkhlcmUgSSBvdXRwdXQgYWxsIGdyYXBocyBtYWRlIHRvIFBORw0KDQpgYGB7ciBvdXRwdXRfZ3JhcGh9DQpnZ3NhdmUoJ0M6L1VzZXJzL0RhbmllbCBTYW5jaGV6L09uZURyaXZlL0RvY3VtZW50b3MvdS90ZXNpcy9MQVBPUC9hbmFsaXNpcyBjb24gUi9FY3VhZG9yIDIwMDQtMjAxOS9maWd1cmVzL2N0b2xfdGltZS5wbmcnLA0KICAgICAgIGN0b2xfdGltZSwgd2lkdGggPSAxOCwgaGVpZ2h0ID0gMTIsIHVuaXRzID0gJ2NtJykNCmdnc2F2ZSgnQzovVXNlcnMvRGFuaWVsIFNhbmNoZXovT25lRHJpdmUvRG9jdW1lbnRvcy91L3Rlc2lzL0xBUE9QL2FuYWxpc2lzIGNvbiBSL0VjdWFkb3IgMjAwNC0yMDE5L2ZpZ3VyZXMvY3RvbF90aW1lX2Jhci5wbmcnLA0KICAgICAgIGN0b2xfdGltZV9jb2wsIHdpZHRoID0gMTgsIGhlaWdodCA9IDEyLCB1bml0cyA9ICdjbScpDQoNCmBgYA0KDQoNCg==