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.

The “preamble” of my code as follows:

# Load libraries

library(tidyverse) # For ggplots and others
library(survey) # Survey management
library(descr) # Descriptive stats
library(WDI) # Get data from the World Development Indicators (World Bank)

# Set the times new roman font for graphs

windowsFonts(TNR = windowsFont("Times New Roman"))

Declaring the survey design

I declare the survey design of LAPOP’s AB below, in order to produce accurate standard errors for all statistics.

# For all years
ab_des_ec<-svydesign(ids=~upm, 
                     strata=~estratopri, 
                     weights=~weight1500, 
                     nest=TRUE,
                     na.action = 'na.exclude',
                     data=df)

# For years 2014-2016
ab_des_ec1416<-svydesign(ids=~upm, 
                         strata=~estratopri, 
                         weights=~weight1500, 
                         nest=TRUE,
                         na.action = 'na.exclude',
                         data=df46)

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.

Graphical DiD representations

Here I represent the DiD models through simple bar chart comparisons. Basically, we have two groups of bars, one for 2014 and 2016. Each bar inside a year shows the % of corruption justifiers inside a group that is made a DiD.

Unemployment

Here I graph the unemployment DiD graphical representation, or the representation of effects.

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

Output to PNG

Here I output all graphs made to PNG

ggsave('C:/Users/Daniel Sanchez/OneDrive/Documentos/u/tesis/LAPOP/analisis con R/Ecuador 2004-2019/figures/ctol_time.png',
       ctol_time, width = 18, height = 12, units = 'cm')
ggsave('C:/Users/Daniel Sanchez/OneDrive/Documentos/u/tesis/LAPOP/analisis con R/Ecuador 2004-2019/figures/ctol_time_bar.png',
       ctol_time_col, width = 18, height = 12, units = 'cm')
LS0tDQp0aXRsZTogIkdyYXBoaW5nIHRoZSBkYXRhIg0Kc3VidGl0bGU6ICJMQVBPUCdzIEFCIEVtcGlyaWNhbCBTdHVkeSBvbiB0aGUgQXR0aXR1ZGVzIG9uIENvcnJ1cHRpb24iDQpkYXRlOiAiMzAvMDgvMjAyMSINCmF1dGhvcjogIkRhbmllbCBTw6FuY2hleiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkhlcmUgSSB3aWxsIGdyYXBoIHRoZSBkYXRhIHRvIGJlIHVzZWQgaW4gdGhlIHBhcGVyLCBmb3IgbW90aXZhdGlvbi9pbnRyb2R1Y3Rpb24gYW5kIGEgZ3JhcGhpY2FsLCBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwc2V1ZG8gRGlEIG1vZGVscy4gDQoNClRoZSAicHJlYW1ibGUiIG9mIG15IGNvZGUgYXMgZm9sbG93czoNCg0KYGBge3Igc2V0dXB9DQojIExvYWQgbGlicmFyaWVzDQoNCmxpYnJhcnkodGlkeXZlcnNlKSAjIEZvciBnZ3Bsb3RzIGFuZCBvdGhlcnMNCmxpYnJhcnkoc3VydmV5KSAjIFN1cnZleSBtYW5hZ2VtZW50DQpsaWJyYXJ5KGRlc2NyKSAjIERlc2NyaXB0aXZlIHN0YXRzDQpsaWJyYXJ5KFdESSkgIyBHZXQgZGF0YSBmcm9tIHRoZSBXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIChXb3JsZCBCYW5rKQ0KDQojIFNldCB0aGUgdGltZXMgbmV3IHJvbWFuIGZvbnQgZm9yIGdyYXBocw0KDQp3aW5kb3dzRm9udHMoVE5SID0gd2luZG93c0ZvbnQoIlRpbWVzIE5ldyBSb21hbiIpKQ0KDQpgYGANCg0KIyMgRGVjbGFyaW5nIHRoZSBzdXJ2ZXkgZGVzaWduDQoNCkkgZGVjbGFyZSB0aGUgc3VydmV5IGRlc2lnbiBvZiBMQVBPUCdzIEFCIGJlbG93LCBpbiBvcmRlciB0byBwcm9kdWNlIGFjY3VyYXRlIHN0YW5kYXJkIGVycm9ycyBmb3IgYWxsIHN0YXRpc3RpY3MuIA0KYGBge3Igc3VydmV5X2Rlc30NCiMgRm9yIGFsbCB5ZWFycw0KYWJfZGVzX2VjPC1zdnlkZXNpZ24oaWRzPX51cG0sIA0KICAgICAgICAgICAgICAgICAgICAgc3RyYXRhPX5lc3RyYXRvcHJpLCANCiAgICAgICAgICAgICAgICAgICAgIHdlaWdodHM9fndlaWdodDE1MDAsIA0KICAgICAgICAgICAgICAgICAgICAgbmVzdD1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgbmEuYWN0aW9uID0gJ25hLmV4Y2x1ZGUnLA0KICAgICAgICAgICAgICAgICAgICAgZGF0YT1kZikNCg0KIyBGb3IgeWVhcnMgMjAxNC0yMDE2DQphYl9kZXNfZWMxNDE2PC1zdnlkZXNpZ24oaWRzPX51cG0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0YT1+ZXN0cmF0b3ByaSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cz1+d2VpZ2h0MTUwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbmVzdD1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9ICduYS5leGNsdWRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRmNDYpDQoNCg0KYGBgDQojIyBUaW1lIHNlcmllcw0KDQpCZWxvdyBJIGluY2x1ZGUgdGhlIHNpbXBsZXN0IGdyYXBocyB3aGljaCBwcmVzZW50IHRpbWUgc2VyaWVzIG9mIGRpZmZlcmVudCBzdGF0aXN0aWNzIHByb2R1Y2VkIHdpdGggdGhlIGRhdGEgb2YgdGhlIEFCLiANCg0KIyMjIENvcnJ1cHRpb24gdG9sZXJhbmNlDQoNCkZpcnN0IEkgY2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGRlc2lnbiBlZmZlY3RzLCBhcyBpdCBpcyBkb25lIHdpdGggTEFQT1AgcmVwb3J0cy4NCmBgYHtyIGN0b2xfcGVyY3N9DQpjdG9sX3BlcmNfeWVhcjwtc3Z5YnkofiBjdG9sLCB+IHllYXIsIGRlc2lnbiA9IGFiX2Rlc19lYywgc3Z5bWVhbiwgbmEucm0gPSBUKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQpjdG9sX3BlcmNfeWVhcg0KYGBgDQpOb3cgZ3JhcGggd2l0aCBgZ2dwbG90YDoNCmBgYHtyIGN0b2xfZ3JhcGhfdGltZSwgIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY3RvbF90aW1lPC1nZ3Bsb3QoY3RvbF9wZXJjX3llYXIsIGFlcyh4ID0geWVhciwgeSA9IGN0b2wsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjdG9sKSwNCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjksIA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2RhcmtncmVlbicpICsNCiAgICAgICAgICAgZ2VvbV9wb2ludChzaXplID0gMS41KSArDQogICAgICAgICAgIGdlb21fbGluZShhZXMoeCA9IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBjdG9sIC0gc2UpLA0KICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNywgDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnZ3JleTUwJywNCiAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gJ2RvdHRlZCcpICsNCiAgICAgICAgICAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGN0b2wgKyBzZSksDQogICAgICAgICAgICAgICAgICAgICBzaXplID0gMC43LCANCiAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdncmV5NTAnLA0KICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSAnZG90dGVkJykgKw0KICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChjdG9sLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjU1LCANCiAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMS42OCwgDQogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksDQogICAgICAgICAgICAgICAgICAgICBzaXplID0gMg0KICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgd2hvIGp1c3RpZnkgY29ycnVwdGlvbiBpbiBFY3VhZG9yLCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjdG9sX3RpbWUpDQoNCmBgYA0KTm93IHJlcGVhdCB0aGUgZ3JhcGggYXMgYSBiYXIgY2hhcnQ6DQoNCmBgYHtyIGN0b2xfZ3JhcGhfdGltZV9jb2wsICBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmN0b2xfdGltZV9jb2w8LWdncGxvdChjdG9sX3BlcmNfeWVhciwgYWVzKHggPSB5ZWFyLCB5ID0gY3RvbCwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGN0b2wgLSAxLjk2KnNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IGN0b2wgKyAxLjk2KnNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChjdG9sLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDYNCiAgICAgICAgICAgICAgICAgICAgICkrDQogICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IHdobyBqdXN0aWZ5IGNvcnJ1cHRpb24gaW4gRWN1YWRvciwgYnkgeWVhcicsDQogICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoY3RvbF90aW1lX2NvbCkNCmBgYA0KVGhlIG1vc3QgaW1wb3J0YW50IGdyYXBoIGluIHRoZSBwYXBlcjogaXQgc2hvd3MgaG93IHRoZSBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aG8gcmVwb3J0IHRvbGVyYW5jZSB0byBicmliaW5nIGhhcyBncm93biBjb25zaWRlcmFibHkuIA0KDQojIyMgQ29uZmlkZW5jZSBpbiB0aGUgcHJlc2lkZW50IA0KDQpJIG5vdyBncmFwaCB0aGUgdGltZSBzZXJpZXMgb2YgYSBkaWNob3RvbWl6ZWQgY29uZmlkZW5jZSBpbiB0aGUgcHJlc2lkZW50IHZhcmlhYmxlLiBTY29yZXMgb3ZlciA0IGFyZSBjb2RlZCBhcyAxIGluIHRoaXMgZGljaG90b21pemVkIHZhcmlhYmxlLg0KDQpOb3cgSSBncmFwaCB0aGUgdGltZSBzZXJpZXMgb2YgcGVvcGxlIHdobyBjb25maWRlIGluIHRoZSBwcmVzaWRlbnQuIEFzIHVzdWFsIGluIHRoZSBMQVBPUCByZXBvcnRzLCB0aGUgY29uZmlkZW5jZSBpbiB0aGUgcHJlc2lkZW50IGlzIGNvZGVkIGFzIDEgd2hlbiB0aGUgc2NvcmVzIHJlc3BvbmRlZCBhcmUgb3ZlciBvciBlcXVhbCB0byA1LiANCg0KYGBge3IgcHJlc19jb25mX2NhbGN9DQoNCnByZXNfY29uZl9jYWxjPC1zdnlieSh+IHByZXNfY29uZl9kaWMsIA0KICAgICAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gYWJfZGVzX2VjLCANCiAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCg0KIyBTZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIEkgd2FudCBhbmQgcmVuYW1lDQoNCnByZXNfY29uZl9jYWxjPC1kcGx5cjo6c2VsZWN0KHByZXNfY29uZl9jYWxjLCB5ZWFyLCBwcmVzX2NvbmZfZGljWWVzLCBzZS5wcmVzX2NvbmZfZGljWWVzKSAlPiUgDQogICAgICAgICAgICAgICAgcmVuYW1lKCdZZXMnPXByZXNfY29uZl9kaWNZZXMsICdTRS55Jz1zZS5wcmVzX2NvbmZfZGljWWVzKQ0KDQojIERlbGV0ZSB5ZWFycyB0aGVyZSBpc24ndCBkYXRhIGZvcg0KDQpwcmVzX2NvbmZfY2FsYzwtIHByZXNfY29uZl9jYWxjWzM6OCxdDQoNCnByZXNfY29uZl9jYWxjDQoNCmBgYA0KDQpgYGB7ciBwcmVzX2NvbmZfZ30NCg0KcHJlc19jb25mX2c8LWdncGxvdChwcmVzX2NvbmZfY2FsYywgYWVzKHggPSB5ZWFyLCB5ID0gWWVzLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWWVzIC0gMS42KlNFLnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gWWVzICsgMS42KlNFLnkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKFllcywgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDYpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBwZW9wbGUgd2hvIHJlcG9ydCBjb25maWRlbmNlIGluIHRoZSBwcmVzaWRlbnQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChwcmVzX2NvbmZfZykNCg0KYGBgDQoNCkFzIHNlZW4gYmVmb3JlLCBjb25maWRlbmNlIGluIHRoZSBwcmVzaWRlbnQgZHJvcHMgc2hhcnBseSBiZXR3ZWVuIDIwMTQgYW5kIDIwMTYuIFRoaXMgaXMgbW9yZSBpbnRlcmVzdGluZyB0aGFuIHRoZSBkcm9wIGZvciAyMDE5LCBzaW5jZSBuYXR1cmFsbHkgdGhlIG5ldyBhZG1pbmlzdHJhdGlvbiB3YXMgZ29pbmcgdG8gbG9zZSBjb25maWRlbmNlIGFzIGl0IHN3aXRjaGVkIHRoZSBwb2xpdGljYWwgc3BlY3RydW0gYWJydXB0bHkuIA0KDQojIyMgVW5lbXBsb3ltZW50IA0KDQpGaXJzdCwgSSBjYWxjdWxhdGUgdW5lbXBsb3ltZW50IHJhdGVzIGFzIGRlZmluZWQgYnkgdGhpcyBzdXJ2ZXkuIEkgZ3JhcGggdGhlbSBhcyBhIGJhciBjaGFydCBhZnRlci4gDQoNCmBgYHtyIHVuZW1fcGVyY3N9DQp1bmVtX3RpbWU8LXN2eWJ5KH4gdW5lbTJfNGEsIA0KICAgICAgICAgICAgICAgICB+IHllYXIsIA0KICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsIA0KICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQoNCnVuZW1fdGltZTwtdW5lbV90aW1lWzM6OCxdDQp1bmVtX3RpbWUNCmBgYA0KDQpgYGB7ciB1bmVtX3RpbWUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KdW5lbV90aW1lX2c8LWdncGxvdCh1bmVtX3RpbWUsIGFlcyh4ID0geWVhciwgeSA9IHVuZW0yXzRhLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gdW5lbTJfNGEgLSBzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IHVuZW0yXzRhICsgc2UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZCh1bmVtMl80YSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMi4xDQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gcmVwb3J0IGJlaW5nIHVuZW1wbG95ZWQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHVuZW1fdGltZV9nKQ0KYGBgDQoNCiMjIyBFY29ub21pYyBTaXR1YXRpb24NCg0KTm93IEkgZG8gdGhlIHNhbWUgcHJvY2VkdXJlcyBmb3IgdGhlIGVjb25vbWljIHNpdHVhdGlvbiBxdWVzdGlvbiwgcGF5aW5nIGF0dGVudGlvbiB0byB0aG9zZSB3aG8gcmVwb3J0IGhhdmluZyBhIHdvcnNlIGVjb25vbWljIHNpdHVhdGlvbiByZWxhdGl2ZSB0byB0aGVpciBzaXR1YXRpb24gMTIgbW9udGhzIGJlZm9yZS4NCg0KYGBge3IgZWNfc2l0X3BlcmN9DQplY3NpdF90aW1lPC1zdnlieSh+IGVjb25fc2l0LCANCiAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsIA0KICAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCg0KIyBTZWxlY3Qgb25seSB0aGUgV29yc2UgcGVyY2VudGFnZXMNCg0KZWNzaXRfdGltZTwtZHBseXI6OnNlbGVjdChlY3NpdF90aW1lLCB5ZWFyLCBlY29uX3NpdFdvcnNlLCBzZS5lY29uX3NpdFdvcnNlKQ0KZWNzaXRfdGltZQ0KYGBgDQoNCk5vdyB0aGUgZ3JhcGg6IA0KDQpgYGB7ciBlY19zaXRfZ3JhcGh9DQplY19zaXRfZzwtZ2dwbG90KGVjc2l0X3RpbWUsIGFlcyh4ID0geWVhciwgeSA9IGVjb25fc2l0V29yc2UsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBlY29uX3NpdFdvcnNlIC0gc2UuZWNvbl9zaXRXb3JzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IGVjb25fc2l0V29yc2UgKyBzZS5lY29uX3NpdFdvcnNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoZWNvbl9zaXRXb3JzZSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMS41DQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gcmVwb3J0IGhhdmluZyB3b3JzZSBlY29ub21pYyBzaXR1YXRpb25zLCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChlY19zaXRfZykNCmBgYA0KQSB2ZXJ5LCB2ZXJ5IGltcG9ydGFudCBpbmNyZWFzZSBiZXR3ZWVuIDIwMTQgYW5kIDIwMTYuIExldCdzIHNlZSBob3cgaXQgYWZmZWN0cyB0aGUgY29tcG9zaXRpb24gb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzLg0KDQojIyMgUG9saXRpY2FsIFNjb3JlL0dyb3Vwcw0KDQpOb3cgSSBjYWxjdWxhdGUgYW5kIHByZXNlbnQgcGVyY2VudGFnZXMgb2YgcGVvcGxlIHRoYXQgYW5zd2VyIGFib3V0IHRoZWlyIHNjb3JlcyBvbiB0aGUgcG9saXRpY2FsIHdpbmdzLiANCg0KRmlyc3QsIEkgY2FsY3VsYXRlIGFuZCBncmFwaCB0aGUgcG9saXRpemF0aW9uIGluZGljYXRvciBhcyBzaG93biBpbiB0aGUgTEFQT1AgcmVwb3J0LiBFcXVhbHMgMSBpZiB0aGUgcGVyc29uIGRpZCBOT1QgYW5zd2VyIHRoZSBwb2xpdGljYWwgc2NvcmUuIE1vcmUgcG9saXRpemF0aW9uIG1lYW5zIGEgbG93ZXIgcGVyY2VudGFnZSBvZiBubyByZXNwb25zZXMuIA0KDQpgYGB7ciBwb2xpdGl6YXRpb25fdGFifQ0KcG9saXRpemF0aW9uX3RpbWU8LXN2eWJ5KH4gcGxzY3JfbmEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduID0gYWJfZGVzX2VjLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSBhcy5kYXRhLmZyYW1lKCkNCnBvbGl0aXphdGlvbl90aW1lDQpgYGANCk5vdyB0aGUgZ3JhcGg6IA0KDQpgYGB7ciBwb2xpdGl6YXRpb25fZ30NCnBvbGl0X2c8LWdncGxvdChwb2xpdGl6YXRpb25fdGltZSwgYWVzKHggPSB5ZWFyLCB5ID0gcGxzY3JfbmEsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcGxzY3JfbmEgLSBzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gcGxzY3JfbmEgKyBzZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChwbHNjcl9uYSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTIuMikrDQogICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IHdobyBkbyBub3QgYW5zd2VyIHRoZSBwb2xpdGljYWwgc2NvcmUgcXVlc3Rpb24sIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHBvbGl0X2cpDQpgYGANCg0KTm93IHRoZSBzYW1lIHByb2NlZHVyZSBmb3IgYWxsIHRocmVlIHBvbGl0aWNhbCBwb3NpdGlvbnMsIGFzIGRlZmluZWQgYnkgTEFQT1AgcmVwb3J0czogbGVmdCwgY2VudGVyIGFuZCByaWdodC4gDQoNCmBgYHtyIHBvbHNjb3JlX3RhYn0NCnBvbGdyb3VwX3RpbWVfY2FsYzwtc3Z5YnkofiBwb2xfZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB+IHllYXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgYXMuZGF0YS5mcmFtZSgpDQojIFJlbmFtZSB2YXJpYWJsZXMNCnBvbGdyb3VwX3RpbWVfY2FsYzwtcmVuYW1lKHBvbGdyb3VwX3RpbWVfY2FsYywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudGVyJyA9IHBvbF9ncm91cENlbnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnTGVmdCcgPSBwb2xfZ3JvdXBMZWZ0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdSaWdodCcgPSBwb2xfZ3JvdXBSaWdodCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb25lJyA9IHBvbF9ncm91cE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnU0UuYyc9IHNlLnBvbF9ncm91cENlbnRlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRS5sJz0gc2UucG9sX2dyb3VwTGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRS5yJz0gc2UucG9sX2dyb3VwUmlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnU0Uubic9IHNlLnBvbF9ncm91cE5vbmUpDQpwb2xncm91cF90aW1lX2NhbGMNCmBgYA0KTm93IG1ha2UgdGhlIHRocmVlIGdyYXBoczoNCg0KYGBge3IgbGVmdF9ncmFwaH0NCmxlZnRfZzwtZ2dwbG90KHBvbGdyb3VwX3RpbWVfY2FsYywgYWVzKHggPSB5ZWFyLCB5ID0gTGVmdCwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExlZnQgLSBTRS5sLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IExlZnQgKyBTRS5sKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChMZWZ0LCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTIuMikrDQogICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gaWRlbnRpZnkgd2l0aCB0aGUgbGVmdCBwb2xpdGljYWwgd2luZywgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScsDQogICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnQ29ycmVzcG9uZHMgdG8gcGVvcGxlIGFuc3dlcmluZyBzY29yZXMgbG93ZXIgdGhhbiA1IGluIHRoZSBQb2xpdGljYWwgU2NvcmUgKEwxKSBxdWVzdGlvbicpDQpwcmludChsZWZ0X2cpDQoNCmBgYA0KDQpgYGB7ciByaWdodF9ncmFwaH0NCnJpZ2h0X2c8LWdncGxvdChwb2xncm91cF90aW1lX2NhbGMsIGFlcyh4ID0geWVhciwgeSA9IFJpZ2h0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gUmlnaHQgLSBTRS5yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFJpZ2h0ICsgU0UuciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoUmlnaHQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMS45KSsNCiAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IHdobyBpZGVudGlmeSB3aXRoIHRoZSByaWdodCBwb2xpdGljYWwgd2luZywgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScsDQogICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnQ29ycmVzcG9uZHMgdG8gcGVvcGxlIGFuc3dlcmluZyBzY29yZXMgaGlnaGVyIHRoYW4gNyBpbiB0aGUgUG9saXRpY2FsIFNjb3JlIChMMSkgcXVlc3Rpb24nKQ0KcHJpbnQocmlnaHRfZykNCg0KYGBgDQpgYGB7ciBjZW50ZXJfZ3JhcGh9DQpjZW50ZXJfZzwtZ2dwbG90KHBvbGdyb3VwX3RpbWVfY2FsYywgYWVzKHggPSB5ZWFyLCB5ID0gQ2VudGVyLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ2VudGVyIC0gU0UuYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IENlbnRlciArIFNFLmMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChDZW50ZXIsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAtMS4zKSsNCiAgICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgd2hvIGlkZW50aWZ5IGluIHRoZSBjZW50ZXIgb2YgdGhlIHBvbGl0aWNhbCB3aW5ncywgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknLA0KICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICdDb3JyZXNwb25kcyB0byBwZW9wbGUgYW5zd2VyaW5nIHNjb3JlcyBiZXR3ZWVuIDQgYW5kIDcgaW4gdGhlIFBvbGl0aWNhbCBTY29yZSAoTDEpIHF1ZXN0aW9uJykNCnByaW50KGNlbnRlcl9nKQ0KDQpgYGANCg0KVGhlIHBlcmNlbnRhZ2VzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIExBUE9QIHJlcG9ydDogdGhlIHJpZ2h0IHdpbnMgYSBsb3QgYmV0d2VlbiAyMDE0IGFuZCAyMDE2LCB3aGVyZSBhcyB0aGUgY2VudGVyIGFsc28gZ2FpbnMgYW5kIHRoZSBsZWZ0IHJlbWFpbnMgdGhlIHNhbWUuIFBlb3BsZSB3aG8gYXJlICJuZXV0cmFsIiBkZWNyZWFzZSBzdGVhZGlseSwgdGhlIHNoYXJwZXN0IGRyb3AgaXMgaW4gMjAxNiwgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RpbmcuIA0KDQojIyMgUHJlc2lkZW50aWFsIEpvYiBBcHByb3ZhbCBSYXRpbmcNCg0KRHJhdyBhIHRpbWUgc2VyaWVzIG9mIHRoaXMgdmFyaWFibGUuDQoNCmBgYHtyIHByZXNfYXByb3Z9DQoNCnByZXNfYXBwcm92YWxfdGltZTwtc3Z5YnkofiBwcmVzX2Fwcm92X2RpYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfiB5ZWFyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdnltZWFuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBhYl9kZXNfZWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KDQpwcmVzX2FwcHJvdmFsX3RpbWU8LWRwbHlyOjpzZWxlY3QocHJlc19hcHByb3ZhbF90aW1lLCB5ZWFyLCBwcmVzX2Fwcm92X2RpYywgc2UpDQoNCg0KYGBgDQpOb3cgSSdsbCBncmFwaCB0aGUgdGltZSBzZXJpZXM6DQoNCmBgYHtyIHByZXNfYXByb3ZfdGd9DQpwcmVzX2Fwcm92X3RnPC0NCiAgZ2dwbG90KHByZXNfYXBwcm92YWxfdGltZSwgYWVzKHggPSB5ZWFyLCB5ID0gcHJlc19hcHJvdl9kaWMpKSsNCiAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHByZXNfYXByb3ZfZGljIC0gc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBwcmVzX2Fwcm92X2RpYyArIHNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKHByZXNfYXByb3ZfZGljLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTEuMykrDQogICAgICAgICAgIHRoZW1lX2J3KCkgKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCB3aG8gYXBwcm92ZSB0aGUgam9iIHBlcmZvcm1hbmNlIG9mIHRoZSBQcmVzaWRlbnQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChwcmVzX2Fwcm92X3RnKQ0KYGBgDQoNCiMjIERlY29tcG9zaW5nIGNvcnJ1cHRpb24gdG9sZXJhbmNlDQoNCkhlcmUgSSB3aWxsIGdyYXBoIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4cGxhaW4sIHRocm91Z2ggZGVzY3JpcHRpdmUgc3RhdGlzdGljcywgdGhlIERpRCBtb2RlbHMuIEkgZGVjb21wb3NlIHRoZSBwZW9wbGUgdGhhdCBhbnN3ZXIgIlllcyIgdG8gdG9sZXJhdGluZyBhIGJyaWJlLCBhbmQgY29tcGFyZSB0aG9zZSBkZWNvbXBvc2l0aW9ucyB0aHJvdWdoIDIwMTQgYW5kIDIwMTYuIA0KDQojIyMgVW5lbXBsb3ltZW50DQoNCk5vdywgSSBjb25zaWRlciB0aGUgJSBvZiBwZW9wbGUgd2hvIGFuc3dlcmVkICJZRVMiIHRvIGEgYnJpYmUgYmVpbmcganVzdGlmaWVkIHdobyByZXBvcnQgYmVpbmcgdW5lbXBsb3llZC4gDQoNCkZpcnN0LCBJIHN1YnNldCBvdXQgdGhlIGRhdGFzZXQgdG8gaGF2ZSBvbmx5IHBvc2l0aXZlIHJlc3BvbnNlcyB0byB0aGUgJGN0b2wkIHZhcmlhYmxlIGFuZCB0aGVuIGNyZWF0ZSBhIG5ldyBzdXJ2ZXkgZGVzaWduIG9iamVjdCB0byBsYXRlciB1c2UgaW4gY2FsY3VsYXRpb25zLiANCg0KYGBge3IgdW5lbV9jdG9sfQ0KIyBTdWJzZXQgYSBiYXNlIHdpdGggb25seSB5ZXMgcmVzcG9uc2VzIHRvIGN0b2wNCg0KZGZfY3RvbDwtc3Vic2V0KGRmLCANCiAgICAgICAgICAgICAgICBkZiRjdG9sID09IDEpDQoNCiMgRGVjbGFyZSBpdHMgc3VydmV5IGRlc2lnbg0KDQpjdG9sX2Rlczwtc3Z5ZGVzaWduKGlkcyA9IH4gdXBtLCANCiAgICAgICAgICAgICAgICAgICBzdHJhdGEgPSB+IGVzdHJhdG9wcmksIA0KICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB+IHdlaWdodDE1MDAsIA0KICAgICAgICAgICAgICAgICAgIG5lc3QgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9ICduYS5leGNsdWRlJywNCiAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfY3RvbCkNCg0KIyBOb3cgc3Vic2V0IGEgYmFzZSB3aXRoIG9ubHkgIm5vIiByZXNwb25zZXMNCg0KZGZfY3RvbF9ubzwtc3Vic2V0KGRmLCANCiAgICAgICAgICAgICAgICAgICBkZiRjdG9sID09IDApDQoNCiMgRGVjbGFyZSBpdHMgc3VydmV5IGRlc2lnbg0KDQpjdG9sX2Rlc19ubzwtc3Z5ZGVzaWduKGlkcyA9IH4gdXBtLCANCiAgICAgICAgICAgICAgICAgICBzdHJhdGEgPSB+IGVzdHJhdG9wcmksIA0KICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB+IHdlaWdodDE1MDAsIA0KICAgICAgICAgICAgICAgICAgIG5lc3QgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9ICduYS5leGNsdWRlJywNCiAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfY3RvbF9ubykNCg0KYGBgDQoNCk5vdyBJIGRvIHRoZSBjYWxjdWxhdGlvbnMsIGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzIHRvbyAoYXMgbG9uZyBhcyB0aGlzIHRlY2huaXF1ZSB3b3JrcyB3ZWxsIGZyb20gYSBzdGF0aXN0aWNhbCB2aWV3cG9pbnQuIEl0IGFwcGVhcnMgaXQgZG9lcykuIA0KDQpgYGB7ciB1bmVtX2N0b2xfY2FsY30NCnVuZW1fY3RvbDwtc3Z5YnkofiB1bmVtMl80YSwgDQogICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgIGRlc2lnbiA9IGN0b2xfZGVzLCANCiAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkNCnVuZW1fY3RvbDwtdW5lbV9jdG9sWzM6OCxdDQp1bmVtX2N0b2wNCmBgYA0KDQpHcmFwaCBiZWxvdzoNCg0KYGBge3IgdW5lbV9jdG9sX2csIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KdW5lbV90aW1lY19nPC1nZ3Bsb3QodW5lbV9jdG9sLCBhZXMoeCA9IHllYXIsIHkgPSB1bmVtMl80YSwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHVuZW0yXzRhIC0gc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSB1bmVtMl80YSArIHNlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQodW5lbTJfNGEsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSsNCiAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyByZXBvcnQgYmVpbmcgdW5lbXBsb3llZCwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHVuZW1fdGltZWNfZykNCg0KYGBgDQpDaGFuZ2UgYmV0d2VlbiAyMDE0IGFuZCAyMDE2IHNlZW1zIHRyaXZpYWwsIHRoZSBpbnRlcmVzdGluZyBqdW1wIGlzIGZyb20gMjAxMiB0byAyMDE0LiBOb3RlIGhvdyBpbiBkaWZmZXJlbnQgeWVhcnMgdGhlcmUgYXJlIGRpZmZlcmVudCBlcnJvciBtYXJnaW5zLCBwcm9iYWJseSBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdGhlIHNhbXBsZSBzaXplLiBUaGlzIHZhcmllcyBkaXJlY3RseSB3aXRoIHRoZSAlIG9mIGNvcnJ1cHRpb24ganVzdGlmaWVycywgd2hpY2ggaXMgcXVpdGUgbG93IGZvciAyMDE0LiANCg0KIyMjIEVjb25vbWljIFNpdHVhdGlvbg0KDQpJIHdpbGwgZ3JhcGggdGhlICUgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyByZXBvcnQgYmVpbmcgd29yc2Ugb2ZmIGluIDIwMTYgaW4gdGhlaXIgZWNvbm9taWMgc2l0dWF0aW9uLiBGaXJzdCBJIGRvIHRoZSBjYWxjdWxhdGlvbnM6IA0KDQpgYGB7ciBlY3NpdF9jdG9sfQ0KZWNzaXRfY3RvbDwtc3Z5YnkofiBlY29uX3NpdCwgDQogICAgICAgICAgICAgICAgICB+IHllYXIsIA0KICAgICAgICAgICAgICAgICAgZGVzaWduID0gY3RvbF9kZXMsIA0KICAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFQpICU+JSANCiAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKQ0KDQojIFNlbGVjdCB0aGUgY29sdW1ucyBJJ20gaW50ZXJlc3RlZCBpbg0KDQplY3NpdF9jdG9sPC1kcGx5cjo6c2VsZWN0KGVjc2l0X2N0b2wsIHllYXIsIGVjb25fc2l0V29yc2UsIHNlLmVjb25fc2l0V29yc2UpDQplY3NpdF9jdG9sDQpgYGANClRoZSBncmFwaCBiZWxvdw0KDQpgYGB7ciBlY19zaXRfY3RvbF9nfQ0KZWNfc2l0Y19nPC1nZ3Bsb3QoZWNzaXRfY3RvbCwgYWVzKHggPSB5ZWFyLCB5ID0gZWNvbl9zaXRXb3JzZSwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVjb25fc2l0V29yc2UgLSBzZS5lY29uX3NpdFdvcnNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gZWNvbl9zaXRXb3JzZSArIHNlLmVjb25fc2l0V29yc2UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChlY29uX3NpdFdvcnNlLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICB2anVzdCA9IC0yDQogICAgICAgICAgICAgICAgICAgICApKw0KICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBjb3JydXB0aW9uIGp1c3RpZmllcnMgd2hvIHJlcG9ydCBoYXZpbmcgd29yc2UgZWNvbm9taWMgc2l0dWF0aW9ucywgYnkgeWVhcicsDQogICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoZWNfc2l0Y19nKQ0KYGBgDQpUaGUgcGVyY2VudGFnZSBpbmNyZWFzZSBvZiB0aGUgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdpdGggd29yc2UgZWNvbm9taWMgc2l0dWF0aW9uIHNlZW1zIHByZXR0eSBjbG9zZSB3aXRoIHRoZSBvdmVyYWxsIHBlcmNlbnRhZ2UgaW5jcmVhc2UuIA0KDQpMZXQncyBzZWUgaG93IHRoZSBzYW1lIHdvcmtzIGZvciBOT04gY29ycnVwdGlvbiBqdXN0aWZpZXJzLiANCg0KYGBge3IgZWNzaXRfY3RvbF9ub30NCiMgU3VydmV5IGRlc2lnbiBmb3IgY29ycnVwdGlvbiByZWplY3RlcnMuDQplY3NpdF9jdG9sbjwtc3Z5YnkofiBlY29uX3NpdCwgDQogICAgICAgICAgICAgICAgICAgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSBjdG9sX2Rlc19ubywgDQogICAgICAgICAgICAgICAgICAgc3Z5bWVhbiwgDQogICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgDQogICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpDQoNCiMgU2VsZWN0IHRoZSBjb2x1bW5zIEknbSBpbnRlcmVzdGVkIGluDQoNCmVjc2l0X2N0b2xuPC1kcGx5cjo6c2VsZWN0KGVjc2l0X2N0b2xuLCB5ZWFyLCBlY29uX3NpdFdvcnNlLCBzZS5lY29uX3NpdFdvcnNlKQ0KZWNzaXRfY3RvbG4NCg0KYGBgDQpUaGUgZ3JhcGg6IA0KDQpgYGB7ciBlY19zaXRfY3RvbG5fZ30NCmVjX3NpdGNfZzwtZ2dwbG90KGVjc2l0X2N0b2xuLCBhZXMoeCA9IHllYXIsIHkgPSBlY29uX3NpdFdvcnNlLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZWNvbl9zaXRXb3JzZSAtIHNlLmVjb25fc2l0V29yc2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBlY29uX3NpdFdvcnNlICsgc2UuZWNvbl9zaXRXb3JzZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKGVjb25fc2l0V29yc2UsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gLTEuNQ0KICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiByZWplY3RlcnMgd2hvIHJlcG9ydCBoYXZpbmcgd29yc2UgZWNvbm9taWMgc2l0dWF0aW9ucywgYnkgeWVhcicsDQogICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoZWNfc2l0Y19nKQ0KYGBgDQpJbmRlZWQsIHRoZSBlY29ub21pYyBlZmZlY3Qgc2VlbXMgdG8gYWZmZWN0IGJvdGggY29ycnVwdGlvbiBqdXN0aWZpZXJzIGFuZCByZWplY3RlcnMgZXF1YWxseSBhY2NvcmRpbmcgdG8gdGhpcyBncmFwaC4gVGhlICJzYW1lIGRpZmZlcmVuY2UiIGlzIGZvdW5kIGJldHdlZW4gMjAxNCBhbmQgMjAxNi4gVGh1cyB0aGF0IG1pZ2h0IGJlIHdoeSB0aGUgZWNvbm9taWMgc2l0dWF0aW9uIHZhcmlhYmxlIGlzIG5vdCBzaWduaWZpY2F0aXZlIGluIG15IHJlZ3Jlc3Npb24gbW9kZWxzLiANCg0KIyMjIFBvbGl0aWNhbCBTY29yZQ0KDQpOb3cgbGV0cyBzZWUgaG93IHRoaXMgd29ya3Mgd2l0aGluIHRoZSBjb3JydXB0aW9uIGp1c3RpZmllcnMuIA0KDQpgYGB7ciBwb2xpdF9jdG9sfQ0KcG9sZ3JvdXBfY3RvbDwtc3Z5YnkofiBwb2xfZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IGN0b2xfZGVzLCANCiAgICAgICAgICAgICAgICAgICAgIHN2eW1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkNCiMgUmVuYW1lDQpwb2xncm91cF9jdG9sPC1yZW5hbWUocG9sZ3JvdXBfY3RvbCwgDQogICAgICAgICAgICAgICAgICAgICAgJ0NlbnRlcicgPSBwb2xfZ3JvdXBDZW50ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICdMZWZ0JyA9IHBvbF9ncm91cExlZnQsIA0KICAgICAgICAgICAgICAgICAgICAgICdSaWdodCcgPSBwb2xfZ3JvdXBSaWdodCwNCiAgICAgICAgICAgICAgICAgICAgICAnTm9uZScgPSBwb2xfZ3JvdXBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5jJz0gc2UucG9sX2dyb3VwQ2VudGVyLA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5sJz0gc2UucG9sX2dyb3VwTGVmdCwNCiAgICAgICAgICAgICAgICAgICAgICAnU0Uucic9IHNlLnBvbF9ncm91cFJpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5uJz0gc2UucG9sX2dyb3VwTm9uZSkNCnBvbGdyb3VwX2N0b2wNCmBgYA0KR3JhcGggdGhlIHBvbGl0aXphdGlvbiBwZXJjZW50YWdlIG9mIHRoZSBjb3JydXB0aW9uIGp1c3RpZmllcnMuDQoNCmBgYHtyIHBvbGl0X2N0b2xfZ30NCnBvbGl0X2N0b2xfZzwtZ2dwbG90KHBvbGdyb3VwX2N0b2wsIGFlcyh4ID0geWVhciwgeSA9IE5vbmUsIGdyb3VwID0gMSkpICsgDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2NvbChmaWxsID0gJ2NoYXJ0cmV1c2UzJywNCiAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdibGFjaycpICsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBOb25lIC0gU0UubiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBOb25lICsgU0UubiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoTm9uZSwgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IC0zLjIpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBjb3JydXB0aW9uIGp1c3RpZmllcnMgd2hvIGRvIG5vdCBhbnN3ZXIgdGhlIHBvbGl0aWNhbCBzY29yZSBxdWVzdGlvbiwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHBvbGl0X2N0b2xfZykNCmBgYA0KVGhpcyBncmFwaCBzaG93cyBhIGRyb3AsIHdoaWNoIGNvdWxkIGJlIG1hcmdpbmFsbHkgc2lnbmlmaWNhbnQsIGNvbnNpZGVyaW5nIHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIA0KDQpOb3cgZ3JhcGggdGhlIG90aGVyIHBvbGl0aWNhbCB3aW5ncyBvZiB0aGUgY29ycnVwdGlvbiBqdXN0aWZpZXJzLiANCg0KYGBge3IgY3RvbF9yaWdodH0NCnJpZ2h0X2N0b2xfZzwtZ2dwbG90KHBvbGdyb3VwX2N0b2wsIGFlcyh4ID0geWVhciwgeSA9IFJpZ2h0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gUmlnaHQgLSBTRS5yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFJpZ2h0ICsgU0UuciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoUmlnaHQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSByaWdodCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KHJpZ2h0X2N0b2xfZykNCmBgYA0KQW4gaW50ZXJlc3RpbmcgaW5jcmVhc2UsIHdoaWNoIEkgZ3Vlc3MganVzdGlmaWVzIHRoZSBtYXJnaW5hbCBzaWduaWZpY2FuY2Ugb2YgdGhpcyB2YXJpYWJsZSBpbiBtb2RlbHMuIA0KDQpUaGUgZ3JhcGggb2YgdGhlIGxlZnQgbm93OiANCg0KYGBge3IgY3RvbF9sZWZ0fQ0KbGVmdF9jdG9sX2c8LWdncGxvdChwb2xncm91cF9jdG9sLCBhZXMoeCA9IHllYXIsIHkgPSBMZWZ0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gTGVmdCAtIFNFLmwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gTGVmdCArIFNFLmwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKExlZnQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSBsZWZ0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQobGVmdF9jdG9sX2cpDQpgYGANClRoZSBncmFwaCBvZiB0aGUgY2VudGVyIG5vdzoNCg0KYGBge3IgY3RvbF9jZW50ZXJ9DQpjZW50ZXJfY3RvbF9nPC1nZ3Bsb3QocG9sZ3JvdXBfY3RvbCwgYWVzKHggPSB5ZWFyLCB5ID0gQ2VudGVyLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ2VudGVyIC0gU0UuYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBDZW50ZXIgKyBTRS5jKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChDZW50ZXIsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSBjZW50ZXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjZW50ZXJfY3RvbF9nKQ0KYGBgDQpMZXRzIGRvIHRoZSBzYW1lIGZvciB0aGUgY29ycnVwdGlvbiByZWplY3RlcnMuIEZpcnN0IHRoZSBjYWxjdWxhdGlvbnMuIA0KDQpgYGB7ciBjdG9sX3Jlal9nfQ0KDQpwb2xncm91cF9jdG9sbjwtc3Z5YnkofiBwb2xfZ3JvdXAsIA0KICAgICAgICAgICAgICAgICAgICAgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IGN0b2xfZGVzX25vLCANCiAgICAgICAgICAgICAgICAgICAgIHN2eW1lYW4sIA0KICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKCkNCiMgUmVuYW1lDQpwb2xncm91cF9jdG9sbjwtcmVuYW1lKHBvbGdyb3VwX2N0b2xuLCANCiAgICAgICAgICAgICAgICAgICAgICAnQ2VudGVyJyA9IHBvbF9ncm91cENlbnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgJ0xlZnQnID0gcG9sX2dyb3VwTGVmdCwgDQogICAgICAgICAgICAgICAgICAgICAgJ1JpZ2h0JyA9IHBvbF9ncm91cFJpZ2h0LA0KICAgICAgICAgICAgICAgICAgICAgICdOb25lJyA9IHBvbF9ncm91cE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgJ1NFLmMnPSBzZS5wb2xfZ3JvdXBDZW50ZXIsDQogICAgICAgICAgICAgICAgICAgICAgJ1NFLmwnPSBzZS5wb2xfZ3JvdXBMZWZ0LA0KICAgICAgICAgICAgICAgICAgICAgICdTRS5yJz0gc2UucG9sX2dyb3VwUmlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgJ1NFLm4nPSBzZS5wb2xfZ3JvdXBOb25lKQ0KcG9sZ3JvdXBfY3RvbG4NCmBgYA0KDQpgYGB7ciBjdG9sbl9ub25lX2d9DQpjdG9sbl9ub25lX2c8LWdncGxvdChwb2xncm91cF9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gTm9uZSwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IE5vbmUgLSBTRS5uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IE5vbmUgKyBTRS5uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChOb25lLCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gNikrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IG9mIGNvcnJ1cHRpb24gcmVqZWN0ZXJzIHdobyBkbyBub3QgYW5zd2VyIHRoZSBwb2xpdGljYWwgc2NvcmUgcXVlc3Rpb24sIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjdG9sbl9ub25lX2cpDQpgYGANCmBgYHtyIGN0b2xuX2NlbnRlcl9nfQ0KY3RvbG5fY2VudGVyX2c8LWdncGxvdChwb2xncm91cF9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gQ2VudGVyLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ2VudGVyIC0gU0UuYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBDZW50ZXIgKyBTRS5jKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChDZW50ZXIsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiByZWplY3RlcnMgd2hvIGlkZW50aWZ5IHdpdGggdGhlIGNlbnRlciwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KGN0b2xuX2NlbnRlcl9nKQ0KYGBgDQpgYGB7ciBjdG9sbl9sZWZ0X2d9DQpjdG9sbl9sZWZ0X2c8LWdncGxvdChwb2xncm91cF9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gTGVmdCwgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IExlZnQgLSBTRS5sLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IExlZnQgKyBTRS5sKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChMZWZ0LCA0KSoxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gNikrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICdUTlInKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QudGl0bGUgPSAgZWxlbWVudF90ZXh0KGZhY2UgPSAnYm9sZCcsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpKw0KICAgICAgICAgICAgICAgICAgICBsYWJzKHggPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgeSA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICdQZXJjZW50IG9mIGNvcnJ1cHRpb24gcmVqZWN0ZXJzIHdobyBpZGVudGlmeSB3aXRoIHRoZSBsZWZ0LCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoY3RvbG5fbGVmdF9nKQ0KYGBgDQoNCmBgYHtyIGN0b2xuX3JpZ2h0X2d9DQpjdG9sbl9yaWdodF9nPC1nZ3Bsb3QocG9sZ3JvdXBfY3RvbG4sIGFlcyh4ID0geWVhciwgeSA9IFJpZ2h0LCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gUmlnaHQgLSBTRS5yLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFJpZ2h0ICsgU0UuciksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcm91bmQoUmlnaHQsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiByZWplY3RlcnMgd2hvIGlkZW50aWZ5IHdpdGggdGhlIHJpZ2h0LCBieSB5ZWFyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICdXaXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChjb25zaWRlcmluZyBkZXNpZ24gZWZmZWN0cyknKQ0KcHJpbnQoY3RvbG5fcmlnaHRfZykNCmBgYA0KQW4gaW1wb3J0YW50IHBvaW50OiBjb3JydXB0aW9uIHJlamVjdGVycyBBTFNPIHdpbiBhIGxvdCBvZiByaWdodC13aW5nIHJlc3BvbmRlbnRzIGZvciAyMDE2LiBUaGlzIG1pZ2h0IGJlIHdoeSANCg0KIyMjIENvbmZpZGVuY2UgaW4gdGhlIHByZXNpZGVudA0KDQpEZWNvbXBvc2UgdG9sZXJhbmNlIHRvIGNvcnJ1cHRpb24gY29uc2lkZXJpbmcgdGhlIGRpY2hvdG9taXplZCB2ZXJzaW9uIG9mIHByZXNpZGVudGlhbCBjb25maWRlbmNlLiANCg0KYGBge3IgcGNvbmZfY3RvbF9jYWxjfQ0KcGNvbmZfY3RvbDwtc3Z5YnkofiBwcmVzX2NvbmZfZGljLCANCiAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBjdG9sX2RlcywgDQogICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIA0KICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpDQoNCnBjb25mX2N0b2w8LWRwbHlyOjpzZWxlY3QocGNvbmZfY3RvbCwgeWVhciwgcHJlc19jb25mX2RpY1llcywgc2UucHJlc19jb25mX2RpY1llcykgJT4lIA0KICAgICAgICAgICAgcmVuYW1lKCdZZXMnID0gcHJlc19jb25mX2RpY1llcywgJ1NFJyA9ICBzZS5wcmVzX2NvbmZfZGljWWVzKQ0KDQpwY29uZl9jdG9sPC1wY29uZl9jdG9sWzM6OCxdDQpwY29uZl9jdG9sDQpgYGANCk5vdyB0aGUgZ3JhcGg6IA0KDQpgYGB7ciBwcmVzX2NvbmZfY3RvbF9nfQ0KY3RvbF9wcmVzX2NvbmZfZzwtZ2dwbG90KHBjb25mX2N0b2wsIGFlcyh4ID0geWVhciwgeSA9IFllcywgZ3JvdXAgPSAxKSkgKyANCiAgICAgICAgICAgICAgICAgICAgIGdlb21fY29sKGZpbGwgPSAnY2hhcnRyZXVzZTMnLA0KICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2JsYWNrJykgKw0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFllcyAtIFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1heCA9IFllcyArIFNFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuNSkrDQogICAgICAgICAgICAgICAgICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPSByb3VuZChZZXMsIDQpKjEwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSA2KSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2J3KCkrDQogICAgICAgICAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gJ1ROUicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC50aXRsZSA9ICBlbGVtZW50X3RleHQoZmFjZSA9ICdib2xkJywgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkrDQogICAgICAgICAgICAgICAgICAgIGxhYnMoeCA9ICcnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ1BlcmNlbnQgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIHdobyBjb25maWRlIHdpdGggdGhlIHByZXNpZGVudCwgYnkgeWVhcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAnV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoY29uc2lkZXJpbmcgZGVzaWduIGVmZmVjdHMpJykNCnByaW50KGN0b2xfcHJlc19jb25mX2cpDQpgYGANCkRvIHRoZSBzYW1lIGZvciBjb3JydXB0aW9uIHJlamVjdGVycy4gDQoNCmBgYHtyIHBjb25mX2N0b2xuX2NhbGN9DQpwY29uZl9jdG9sbjwtc3Z5YnkofiBwcmVzX2NvbmZfZGljLCANCiAgICAgICAgICAgICAgICAgIH4geWVhciwgDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBjdG9sX2Rlc19ubywgDQogICAgICAgICAgICAgICAgICBzdnltZWFuLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCkgJT4lIA0KICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgpDQoNCnBjb25mX2N0b2xuPC1kcGx5cjo6c2VsZWN0KHBjb25mX2N0b2xuLCB5ZWFyLCBwcmVzX2NvbmZfZGljWWVzLCBzZS5wcmVzX2NvbmZfZGljWWVzKSAlPiUgDQogICAgICAgICAgICByZW5hbWUoJ1llcycgPSBwcmVzX2NvbmZfZGljWWVzLCAnU0UnID0gIHNlLnByZXNfY29uZl9kaWNZZXMpDQoNCnBjb25mX2N0b2xuPC1wY29uZl9jdG9sblszOjgsXQ0KcGNvbmZfY3RvbG4NCmBgYA0KDQpOb3cgdGhlIGdyYXBoOiANCg0KYGBge3IgY3RvbG5fcHJlc19jb25mX2dyYXBofQ0KY3RvbG5fcHJlc19jb25mX2c8LWdncGxvdChwY29uZl9jdG9sbiwgYWVzKHggPSB5ZWFyLCB5ID0gWWVzLCBncm91cCA9IDEpKSArIA0KICAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woZmlsbCA9ICdjaGFydHJldXNlMycsDQogICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnYmxhY2snKSArDQogICAgICAgICAgICAgICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gWWVzIC0gU0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gWWVzICsgU0UpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IC41KSsNCiAgICAgICAgICAgICAgICAgICAgIGdlb21fdGV4dChhZXMobGFiZWw9IHJvdW5kKFllcywgNCkqMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDYpKw0KICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSsNCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gIGVsZW1lbnRfdGV4dChmYWNlID0gJ2JvbGQnLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSsNCiAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gJycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAnJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAnUGVyY2VudCBvZiBjb3JydXB0aW9uIHJlamVjdGVycyB3aG8gY29uZmlkZSB3aXRoIHRoZSBwcmVzaWRlbnQsIGJ5IHllYXInLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gJ1dpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKGNvbnNpZGVyaW5nIGRlc2lnbiBlZmZlY3RzKScpDQpwcmludChjdG9sbl9wcmVzX2NvbmZfZykNCg0KYGBgDQoNClRoaXMgaXMgdGhlIHB1bmNobGluZS4gVGhlIHBlb3BsZSB3aG8gdXNlZCB0byByZWplY3QgY29ycnVwdGlvbiBzdG9wcGVkIGRvaW5nIHNvOiBnb3Zlcm5tZW50IHplYWxvdHJ5IHN0b3BwZWQuIElmIHRoZXJlIHdlcmUgbGVzcyBwZW9wbGUgd2hvIGNvbmZpZGVkIGluIHRoZSBwcmVzaWRlbnQsIGFuZCBpbiB0dXJuIHRoZXNlIHBlb3BsZSBzZWVtZWQgdG8gc3RvcCByZWplY3RpbmcgY29ycnVwdCBhY3RpdGl2aXRpZXMsIGl0IG1ha2VzIHNlbnNlIHdoeSBjb3JydXB0aW9uIHRvbGVyYW5jZSBqdW1wZWQuIA0KDQoNCiMjIEdyYXBoaWNhbCBEaUQgcmVwcmVzZW50YXRpb25zDQoNCkhlcmUgSSByZXByZXNlbnQgdGhlIERpRCBtb2RlbHMgdGhyb3VnaCBzaW1wbGUgYmFyIGNoYXJ0IGNvbXBhcmlzb25zLiBCYXNpY2FsbHksIHdlIGhhdmUgdHdvIGdyb3VwcyBvZiBiYXJzLCBvbmUgZm9yIDIwMTQgYW5kIDIwMTYuIEVhY2ggYmFyIGluc2lkZSBhIHllYXIgc2hvd3MgdGhlICUgb2YgY29ycnVwdGlvbiBqdXN0aWZpZXJzIGluc2lkZSBhIGdyb3VwIHRoYXQgaXMgbWFkZSBhIERpRC4gDQoNCiMjIyBVbmVtcGxveW1lbnQNCg0KSGVyZSBJIGdyYXBoIHRoZSB1bmVtcGxveW1lbnQgRGlEIGdyYXBoaWNhbCByZXByZXNlbnRhdGlvbiwgb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGVmZmVjdHMuIA0KDQoNCiMjIEdyYXBocyB1c2luZyBkYXRhIG91dHNpZGUgdGhlIEFtZXJpY2EncyBCYXJvbWV0ZXINCg0KQmVsb3csIEkgZHJhdyB0aGUgZ3JhcGhzIHdoaWNoIGFyZSBtYWRlIHdpdGhvdXQgdGhlIEFCJ3MgZGF0YQ0KDQojIyMgRnJvbSB0aGUgV29ybGQgQmFuaydzIFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMNCg0KSSBub3cgd2FudCB0byBncmFwaCB0aGUgR0RQIGdyb3d0aCBvZiBkaWZmZXJlbnQgbGF0aW4gYW1lcmljYW4gY291bnRyaWVzLCBpbmNsdWRpbmcgRWN1YWRvci4gQmVsb3csIEkgdXNlIHRoZSBgV0RJYCBwYWNrYWdlIHRvIGRvd25sb2FkIHRoZSBkYXRhIGZyb20gdGhlIFdvcmxkIEJhbmsncyBBUEkuIA0KDQpgYGB7ciBkb3dubG9hZF93ZGlfZ2RwZ30NCiMgRGVmaW5lIGNvdW50cnkgSVNPMiBjb2RlcyBmb3IgZG93bmxvYWRpbmcgdGhlIEdEUCBpbmRpY2F0b3JzDQoNCmNvdW50cmllc19sYXRhbTwtYygnRUMnLCAnQ0wnLCAnQ08nLCAnUEUnLCAnQk8nKQ0KDQojIERvd25sb2FkIEdEUCBkYXRhOiB0b3RhbCBhbmQgcGVyIGNhcGl0YSBncm93dGggcmF0ZXMgYW5kIG1hZ25pdHVkZSBwZXIgY2FwaXRhLCBjb25zdGFudCBwcmljZXMgMjAxMCBVU0QNCg0KZ2RwX3dkaTwtV0RJKGNvdW50cnkgPSBjb3VudHJpZXNfbGF0YW0sIGluZGljYXRvciA9IGMoJ05ZLkdEUC5NS1RQLktELlpHJywnTlkuR0RQLlBDQVAuS0QuWkcnLCAnTlkuR0RQLlBDQVAuS0QnKSkNCg0KIyBSZW5hbWUgdGhlIHZhcmlhYmxlcw0KDQpnZHBfd2RpPC1yZW5hbWUoZ2RwX3dkaSwgJ2dkcF9nJyA9IE5ZLkdEUC5NS1RQLktELlpHICwgJ2dkcHBjX2cnID0gTlkuR0RQLlBDQVAuS0QuWkcsICdnZHBfcGMnID0gTlkuR0RQLlBDQVAuS0QpDQoNCmBgYA0KDQpGaXJzdCBJIGdyYXBoIEdEUCBwZXIgY2FwaXRhIGdyb3d0aCByYXRlcyBmb3IgdGhlIGNvdW50cmllcyB0aGF0IEkgZ290Lg0KDQpgYGB7ciBnZHBwY19ncmFwaCwgZmlnLmFsaWduID0gJ2NlbnRlcicsIHdhcm5pbmcgPSBGfQ0KZ2RwcGNfZzwtDQogIGdncGxvdChnZHBfd2RpLCBhZXMoeCA9IHllYXIsIHkgPSBnZHBfcGMvMTAwMCwgY29sb3VyID0gY291bnRyeSkpICsgDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyLDQsNiw4LDEwLDEyLDE0KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxOTYwLCAxOTY1LCAxOTcwLCAxOTc1LCAxOTgwLCAxOTg1LCAxOTkwLCAxOTk1LCAyMDAwLCAyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjM1LDAuOTMpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBsYWJzKHggPSAnWWVhcicsIA0KICAgICAgIHkgPSAnR0RQIHBlciBDYXBpdGEgKFRob3VzYW5kcyBvZiBDb25zdGFudCAyMDEwIFVTRCknLA0KICAgICAgIGNvbG91ciA9ICdDb3VudHJ5JykrDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKQ0KDQpnZHBwY19nDQoNCmBgYA0KYGBge3IgZ2RwcGNfZ3Jvd3RoX2csIGZpZy5hbGlnbiA9ICdjZW50ZXInLCB3YXJuaW5nID0gRn0NCg0KZ2RwX3dkaTE8LXN1YnNldChnZHBfd2RpLCANCiAgICAgICAgICAgICAgICAgZ2RwX3dkaSRjb3VudHJ5ID09ICdFY3VhZG9yJ3wgZ2RwX3dkaSRjb3VudHJ5ID09ICdDb2xvbWJpYScgfCBnZHBfd2RpJGNvdW50cnkgPT0gJ1BlcnUnKQ0KDQpnZHBwY19ncm93dGhfZzwtDQogIGdncGxvdChnZHBfd2RpMSwgYWVzKHggPSB5ZWFyLCB5ID0gZ2RwcGNfZywgY29sb3VyID0gY291bnRyeSkpICsgDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyLDQsNiw4LDEwLDEyLDE0KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxOTYwLCAxOTY1LCAxOTcwLCAxOTc1LCAxOTgwLCAxOTg1LCAxOTkwLCAxOTk1LCAyMDAwLCAyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAnVE5SJyksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjM1LDAuOTMpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBsYWJzKHggPSAnWWVhcicsIA0KICAgICAgIHkgPSAnR0RQIHBlciBDYXBpdGEgQW5udWFsIEdyb3d0aCAoJSknLA0KICAgICAgIGNvbG91ciA9ICdDb3VudHJ5JykrDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKQ0KDQpnZHBwY19ncm93dGhfZw0KDQpgYGANCg0KDQojIyBPdXRwdXQgdG8gUE5HDQoNCkhlcmUgSSBvdXRwdXQgYWxsIGdyYXBocyBtYWRlIHRvIFBORw0KDQpgYGB7ciBvdXRwdXRfZ3JhcGh9DQpnZ3NhdmUoJ0M6L1VzZXJzL0RhbmllbCBTYW5jaGV6L09uZURyaXZlL0RvY3VtZW50b3MvdS90ZXNpcy9MQVBPUC9hbmFsaXNpcyBjb24gUi9FY3VhZG9yIDIwMDQtMjAxOS9maWd1cmVzL2N0b2xfdGltZS5wbmcnLA0KICAgICAgIGN0b2xfdGltZSwgd2lkdGggPSAxOCwgaGVpZ2h0ID0gMTIsIHVuaXRzID0gJ2NtJykNCmdnc2F2ZSgnQzovVXNlcnMvRGFuaWVsIFNhbmNoZXovT25lRHJpdmUvRG9jdW1lbnRvcy91L3Rlc2lzL0xBUE9QL2FuYWxpc2lzIGNvbiBSL0VjdWFkb3IgMjAwNC0yMDE5L2ZpZ3VyZXMvY3RvbF90aW1lX2Jhci5wbmcnLA0KICAgICAgIGN0b2xfdGltZV9jb2wsIHdpZHRoID0gMTgsIGhlaWdodCA9IDEyLCB1bml0cyA9ICdjbScpDQoNCmBgYA0KDQoNCg==