Aims and content

The present document includes the analytical steps implemented to model the within-individual relationships between workaholism WHLSM and the focused strain outcomes (i.e., afternoon and evening blood pressure SBP and DBP, emotional exhaustion EE, and sleep disturbances SD) and the within-individual interactions between WHLSM and psychological detachment PD. The analyses are conducted on the daily diary data collected with the Qualtrics platform (Qualtrics, Seattle, WA, USA) from an heterogeneous samples of workers over two weeks, pre-processed as shown in Supplementary Material S3, and aggregated as shown in Supplementary Material S4.

Here, we remove all objects from the R global environment.

# removing all objets from the workspace
rm(list=ls())

The following R packages are used in this document (see References section):

# required packages
packages <- c("lme4","MuMIn","sjPlot","plyr","car","fitdistrplus","ggplot2","gridExtra","influence.ME","mediation","psych","knitr")

# generate packages references
knitr::write_bib(c(.packages(), packages),"packagesMod.bib")

# # run to install missing packages
# xfun::pkg_attach2(packages, message = FALSE); rm(list=ls())


1. Data reading

First, we read daily diary exported from the previous step (see Supplementary Material S4, and the model formulas with the covariates selected from Supplementary Material S5. Moreover, we derive the the preliminary questionnaire dataset prelqs from the diary dataset.

# reading data
load("DATI/diary_aggregated.RData") # daily diary data
load("DATI/mformulas.RData") # selected covariates

# deriving prelqs from diary data (only including variables from the preliminary questionnaire)
prelqs <- diary[!duplicated(diary$ID),c(1,which(colnames(diary)=="gender"):ncol(diary))]

# original sample sizes
cat("diary:",nrow(diary),"responses from",nlevels(diary$ID),"participants")
## diary: 1084 responses from 135 participants
cat("prelqs:",nrow(prelqs),"responses from",nlevels(prelqs$ID),"participants")
## prelqs: 135 responses from 135 participants


2. Data filtering

As we pre-registered here, we filter the data based on participant compliance with the protocol, that is we exclude the participants with less than 3 full days of participation (i.e., with nonmissing response to the afternoon, evening, and morning questionnaire).

# filtering participants with less than 3 observations
clean <- diary[0,]
for(ID in levels(diary$ID)){ 
  if(nrow(diary[diary$ID==ID & diary$aft==1 & diary$eve==1 & diary$mor==1,]) >= 3){ 
    clean <- rbind(clean,diary[diary$ID==ID,]) }}
clean$ID <- as.factor(as.character(clean$ID)) # resetting ID levels
clean_prelqs <- prelqs[prelqs$ID %in% levels(clean$ID),] # filtering prelqs data
clean_prelqs$ID <- as.factor(as.character(clean_prelqs$ID)) # resetting ID levels
cat("diary: Excluded",nlevels(diary$ID)-nlevels(clean$ID),"participants and",nrow(diary)-nrow(clean),"observations")
## diary: Excluded 21 participants and 126 observations
# updating sample sizes
cat("diary:",nrow(clean),"responses from",nlevels(clean$ID),"participants")
## diary: 958 responses from 114 participants
cat("prelqs:",nrow(clean_prelqs),"responses from",nlevels(clean_prelqs$ID),"participants")
## prelqs: 114 responses from 114 participants


2.1. BP data filtering

In addition to participant compliance, we pre-registered the exclusion of all participants reporting taking blood pressure medications bp_drugs or suffering from a cardiovascular dysfunction cv_dysf from the analyses of blood pressure. Here, we exclude such participants showing substantially higher blood pressure (see section 3.5 of Supplementary Material S5). In contrast, deviating from the pre-registration (see Supplementary Material S7), we do not exclude those taking psychoactive psy_drugs or hormonal medication horm_drugs, or those reporting sleep dysfunctions sleep_dysf, as we did not find substantial differences in their blood pressure values (see section 3.5 of Supplementary Material S5). Instead, we exclude these participants as a robustness check (see section 4).

# filtering participants with bp_drugs or cv_dysf
cleanBP <- clean[clean$bp_drugs=="No" & clean$cv_dysf=="No",]
cleanBP$ID <- as.factor(as.character(cleanBP$ID)) # resetting ID levels
cleanBP_prelqs <- prelqs[prelqs$ID %in% levels(cleanBP$ID),] # filtering prelqs data
cleanBP_prelqs$ID <- as.factor(as.character(cleanBP_prelqs$ID)) # resetting ID levels
cat("diary: Excluded further",nlevels(clean$ID)-nlevels(cleanBP$ID),"participants and",
    nrow(clean)-nrow(cleanBP),"observations from BP analyses")
## diary: Excluded further 8 participants and 60 observations from BP analyses
# updating sample sizes
cat("diary (BP):",nrow(cleanBP),"responses from",nlevels(cleanBP$ID),"participants")
## diary (BP): 898 responses from 106 participants
cat("prelqs (BP):",nrow(cleanBP_prelqs),"responses from",nlevels(cleanBP_prelqs$ID),"participants")
## prelqs (BP): 106 responses from 106 participants


2.2. Sleep data filtering

Finally, we also pre-registered the exclusion of all participants reporting sleep dysfunctions from the analyses of sleep disturbances. However, the number of such participants is relatively high, whereas they do not seem to show substantial differences in sleep disturbances comparing to the other participants (see section 3.5 of Supplementary Material S5). Thus, deviating from the pre-registration (see Supplementary Material S7), we do not exclude such participants from the main analyses. Instead, we exclude them as a robustness check (see section 4.5).

# number of participants reporting sleep dysfunctions
summary(clean[!duplicated(clean$ID),"sleep_dysf"])
##  No Yes 
## 100  14


3. Multilevel modeling

Here, we specify, compare, and inspect the results of a series of multilevel models for each of the following pre-registered time-varying outcomes:

  • afternoon systolic SBP_aft and dyastolic blood pressure DBP_aft

  • evening systolic SBP_eve and dyastolic blood pressure DBP_eve

  • emotional exhaustion EE

  • sleep disturbances SD


For each outcome, we implement a hierarchical regression with the following steps:

  1. m0: null model only including the sample intercept, the level-2 variability around the intercept, and the residual term

  2. m1: including the covariates selected in the previous step (see Supplementary Material S5), in addition to psychological detachment PD (i.e., only for evening and next morning outcomes), and the level-2 component of workaholism WHLSM.cm

  3. m2: including the level-1 component of workaholism WHLSM.mc

  4. m3: including the level-1 interactions between WHLSM.mc and PD (i.e., only for outcomes measured in the evening or the following morning).


The following packages are used to optimize the analyses:

library(lme4); library(MuMIn); library(sjPlot); library(plyr); library(car); library(fitdistrplus)
library(gridExtra); library(influence.ME)


3.1. Blood pressure

First, we analyse systolic and diastolic blood pressure. As a main confirmatory analysis, we evaluate the relationships between daily levels of state workaholism and daily averages of blood pressure (i.e., average of afternoon, evening, and next morning measurements). Moreover, as a supplementary pre-registered analysis (see Supplementary Material S7) we apply the same procedure for each time point, that is we analyze the relationship between workaholism and afternoon, evening, and morning blood pressure measurement, respectively. Finally, based on the results, we conduct pre-registered exploratory mediation analyses on time-specific blood pressure measurements.

Daily averages of systolic SBP and diastolic blood pressure DBP are predicted by concurrent state workaholism WHLSM.mc, in addition to trait workaholism WHLSM.cm, and three covariates selected from the previous step (see Supplementary Material S5), namely gender, age, and body mass index BMI.

mformulas[1] # covariates selected for SBP
## [1] "SBP_aft ~ gender + age + BMI"
mformulas[2] # covariates selected for DBP
## [1] "DBP_aft ~ gender + age + BMI"


3.1.1. Afternoon BP

3.1.1.1. Data preparation

First, we prepare the data for the analyses by removing all cases of missing responses in the dependent variable or any predictor or covariate (list-wise deletion), by centering level-2 continuous predictors on the grand mean (grand-mean-centering), and by centering level-1 continuous predictors on the individual mean (person-mean-centering).

# list-wise deletion
cleanBP_aft <- as.data.frame(na.omit(cleanBP[,c("ID","SBP_aft","DBP_aft", # grouping and dependent variables
                                                "gender","age","BMI","WHLSM", # core predictors
                                                "WE","WC","sleep_dysf","psy_drugs","horm_drugs", # for robustness checks
                                                "confounders_aft","flagBP_aft","flagTime","careless",
                                                "position","children")])) 
cleanBP_aft$ID <- as.factor(as.character(cleanBP_aft$ID)) # resetting participant identifier levels
cat("Considering",nrow(cleanBP_aft),"complete obs from",nlevels(as.factor(as.character(cleanBP_aft$ID))),"participants")
## Considering 787 complete obs from 106 participants
# person-mean-centering lv-1 continuous predictors
wide <- cleanBP_aft[!duplicated(cleanBP_aft$ID),] # wide-form dataset
for(Var in c("WHLSM","WE","WC")){
  wide <- cbind(wide,aggregate(cleanBP_aft[,Var],list(cleanBP_aft$ID),mean)[,2]) # individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanBP_aft <- join(cleanBP_aft,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining to long-form df
  cleanBP_aft[,paste0(Var,".mc")] <- cleanBP_aft[,Var] - cleanBP_aft[,paste0(Var,".cm")] } # mean-centered scores

# grand-mean-centering lv-2 continuous predictors
for(Var in c("age","BMI","WHLSM.cm")){ cleanBP_aft[,paste0(Var,".gmc")] <- cleanBP_aft[,Var] - mean(wide[,Var]) }

# showing data
cleanBP_aft[1:3,] # first three rows


3.1.1.2. Model fit

Here, we fit the multilevel models to the selected data using the default restricted maximum likelihood estimator (REML).

# m0: null model
m0_SBP_aft <- lmer(SBP_aft ~ (1|ID), # only fixed and random intercept + residual term
                   data=cleanBP_aft)

# m1: covariates
m1_SBP_aft <- lmer(SBP_aft ~ gender + age.gmc + BMI.gmc + WHLSM.cm.gmc + (1|ID), # covariates
                   data=cleanBP_aft)

# m2: state workaholism
m2_SBP_aft <- lmer(SBP_aft ~ gender + age.gmc + BMI.gmc + WHLSM.cm.gmc + WHLSM.mc + (1|ID),
                   data=cleanBP_aft)


The same models are specified for diastolic blood pressure.

# m0: null model
m0_DBP_aft <- lmer(DBP_aft ~ (1|ID), # only fixed and random intercept + residual term
                   data=cleanBP_aft)

# m1: covariates
m1_DBP_aft <- lmer(DBP_aft ~ gender + age.gmc + BMI.gmc + WHLSM.cm.gmc + (1|ID), # covariates
                   data=cleanBP_aft)

# m2: state workaholism
m2_DBP_aft <- lmer(DBP_aft ~ gender + age.gmc + BMI.gmc + WHLSM.cm.gmc + WHLSM.mc + (1|ID),
                   data=cleanBP_aft)

From the previous chunks, we see that all models converged without problems. Here, we inspect the diagnostics (i.e., normality of residual and random effect distributions, homoscedasticity, and multicollinearity) of the most complex model m2.bis. Influential cases are analyzed in a dedicated section below.


SBP_aft

Model m2.bis shows some deviation from normality especially in the lower tail of the distribution of residuals and both tails of the distribution of random effects. Particularly, participants S082 and S096 are associated with the highest extreme deviations from the distributions of both random effects, and will be removed as a robustness check (see section 4.1). Besides that, we can see that the homoscedsticity assumption holds and that none of the variance inflation factors (VIFs) shows extreme values, ruling out the risk of multicollinearity.

# normality and homoscedasticity
p <- plot_model(m2_SBP_aft,type="diag",dot.size=1)
p[[2]] <- p[[2]]$ID
plot_grid(p,tags=TRUE,margin=c(0,0,0,0))

# participant with highest random effects (i.e., BLUPS)
re <- ranef(m2_SBP_aft)$ID
re[re$WHLSM.mc==max(re$WHLSM.mc)|re$`(Intercept)`==max(re$`(Intercept)`),]
## numeric(0)
# homoscedasticity and multicollinearity
par(mfrow=c(1,2))
for(Var in c("gender")){ boxplot(resid(m2_SBP_aft) ~ cleanBP_aft[,Var],main=paste("Residuals by",Var)) }
barplot(vif(m2_SBP_aft),main="VIF Values",xlim=c(0,10),las=2,horiz=TRUE) # variance inflation factors (VIFs)
abline(v = 5, lwd = 5, lty = 2)


Here, we better inspect the residual distribution and the fit of models specified with alternative family distributions. We can see that none of the alternative families substantially better approximate the distribution of model residuals, with the log-transformed solution (i.e., normal distribution with log-transformed dependent variable) showing the best fit. Yet, it is not so better than the original model. Thus, we initially rely on the normal distribution and then consider the logarithmic transformation as a robustness check (see section 4.1).

# inspecting residual distribution
descdist(resid(m2_SBP_aft)) # unknown best-fit distribution

## summary statistics
## ------
## min:  -36.76048   max:  49.42156 
## median:  -0.4067047 
## mean:  4.281329e-14 
## estimated sd:  9.662342 
## estimated skewness:  0.3987242 
## estimated kurtosis:  4.901672
# fitting model with alternative families
models <- list(
  m2_SBP_aft,
  glmer(formula=formula(m2_SBP_aft),family=Gamma(link="log"),data=cleanBP_aft), # gamma log (doesn't converge)
  glmer(formula=formula(m2_SBP_aft),family=Gamma(link="identity"),data=cleanBP_aft), # gamma id (doesn't converge)
  glmer(formula=formula(m2_SBP_aft),family=gaussian(link="log"),data=cleanBP_aft), # log-normal (singular fit)
  lmer(formula=as.formula(paste("log(SBP_aft) ~",as.character(formula(m2_SBP_aft))[3])),data=cleanBP_aft)) # log transf
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.00424267 (tol = 0.002, component 1)
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.00352728 (tol = 0.002, component 1)
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
# normal Q-Q plot of model residuals
par(mfrow=c(1,5))
for(i in 1:length(models)){ 
  qqnorm(resid(models[[i]]),main=c("Norm","Gamma-log","Gamma-id","log-norm","log-transf")[i]); qqline(resid(models[[i]]))}


DBP_aft

Model m2.bis shows some deviation from normality in both tails of the distribution of residuals and random effects. Particularly, participant S082 is associated with the highest extreme deviation from the distributions of both random effects, and will be removed as a robustness check (see section 4.1). Besides that, we can see that the homoscedsticity assumption holds and that none of the variance inflation factors (VIFs) shows extreme values, ruling out the risk of multicollinearity.

# normality and homoscedasticity
p <- plot_model(m2_DBP_aft,type="diag",dot.size=1)
p[[2]] <- p[[2]]$ID
plot_grid(p,tags=TRUE,margin=c(0,0,0,0))

# participant with highest random effects (i.e., BLUPS)
re <- ranef(m2_DBP_aft)$ID
re[re$WHLSM.mc==max(re$WHLSM.mc)|re$`(Intercept)`==max(re$`(Intercept)`),]
## numeric(0)
# homoscedasticity and multicollinearity
par(mfrow=c(1,2))
for(Var in c("gender")){ boxplot(resid(m2_DBP_aft) ~ cleanBP_aft[,Var],main=paste("Residuals by",Var)) }
barplot(vif(m2_DBP_aft),main="VIF Values",xlim=c(0,10),las=2,horiz=TRUE) # variance inflation factors (VIFs)
abline(v = 5, lwd = 5, lty = 2)


Here, we better inspect the residual distribution and the fit of models specified with alternative family distributions. We can see that some of alternative families slightly better approximate the distribution of model residuals, although not reaching convergence. The log-transformed solution (i.e., normal distribution with log-transformed dependent variable) shows the best fit while reaching convergence. Yet, it is not so better than the original model. Thus, we initially rely on the normal distribution and then consider the logarithmic transformation as a robustness check.

# inspecting residual distribution
descdist(resid(m2_DBP_aft)) # unknown best-fit distribution

## summary statistics
## ------
## min:  -30.20225   max:  36.78257 
## median:  -0.01672168 
## mean:  4.119735e-14 
## estimated sd:  8.413706 
## estimated skewness:  0.1099257 
## estimated kurtosis:  4.379899
# fitting model with alternative families
models <- list(
  m2_DBP_aft,
  glmer(formula=formula(m2_DBP_aft),family=Gamma(link="log"),data=cleanBP_aft), # gamma log (doesn't converge)
  glmer(formula=formula(m2_DBP_aft),family=Gamma(link="identity"),data=cleanBP_aft), # gamma id (doesn't converge)
  glmer(formula=formula(m2_DBP_aft),family=gaussian(link="log"),data=cleanBP_aft), # log-normal (singular fit)
  lmer(formula=as.formula(paste("log(SBP_aft) ~",as.character(formula(m2_DBP_aft))[3])),data=cleanBP_aft)) # log transf
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.00264134 (tol = 0.002, component 1)
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.00739431 (tol = 0.002, component 1)
## boundary (singular) fit: see help('isSingular')
# normal Q-Q plot of model residuals
par(mfrow=c(1,5))
for(i in 1:length(models)){ 
  qqnorm(resid(models[[i]]),main=c("Norm","Gamma-log","Gamma-id","log-norm","log-transf")[i]); qqline(resid(models[[i]]))}


3.1.1.3. Results

Here, we compare the specified models based on the Akaike weight and the likelihood ratio test (with type-I error set to p < .05), and we inspect the results of the selected model(s).

SBP_aft

We can see that the inclusion of state WHLSM is associated with stronger evidence and significantly higher likelihood than models including less predictors (Aw = .99, \(\chi^2\)(1) = 15.07, p < .001), with model m2 being selected as the best model.

# Akaike weight adding one model at time
Weights(AIC(m0_SBP_aft,m1_SBP_aft)) # covariates: better
##  model weights 
## [1] 0 1
Weights(AIC(m0_SBP_aft,m1_SBP_aft,m2_SBP_aft)) # state workaholism: better
##  model weights 
## [1] 0.000 0.001 0.999
# Likelihood ratio test
anova(m1_SBP_aft,m2_SBP_aft) # best model is m2
## refitting model(s) with ML (instead of REML)


Here, we inspect the coefficients estimated by the selected model m2.bis and those estimated by more parsimonious models. We can see that state WHLSM.mc is positively related to BP_aft, whereas trait WHLSM.cm.gmc is not. Among the included covariates, gender, age and BMI, but not trait WHLSM.cm.gmc predict higher SBP_aft.

# regression table
tab_model(m1_SBP_aft,m2_SBP_aft,
          dv.labels=c("Covariates","State WHLSM"),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,show.ci=FALSE,
          collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Covariates State WHLSM
Predictors b (SE) t b (SE) t
(Intercept) 118.25
(1.97)
59.96 118.25
(1.97)
59.96
gender [M] 5.39
(2.92)
1.84 5.39
(2.92)
1.84
age gmc 0.41
(0.12)
3.43 0.41
(0.12)
3.43
BMI gmc 1.10
(0.43)
2.54 1.10
(0.43)
2.54
WHLSM cm gmc 1.33
(1.14)
1.16 1.33
(1.14)
1.16
WHLSM mc 1.56
(0.40)
3.90
Random Effects
σ2 108.96 106.74
τ00 195.27 ID 195.55 ID
N 106 ID 106 ID
Observations 787 787
# plotting main effects from selected model
grid.arrange(plot_model(m2_SBP_aft,type="pred",terms="WHLSM.cm.gmc"), # trait WHLSM
             plot_model(m2_SBP_aft,type="pred",terms="WHLSM.mc"),nrow=1) # state WHLSM


DBP_aft

Results are in line with those found for SBP_aft: the inclusion of state WHLSM is associated with stronger evidence and significantly higher likelihood than models including less predictors (Aw = .99, \(\chi^2\)(1) = 13.84, p < .001), with model m2 being selected as the best model.

# Akaike weight adding one model at time
Weights(AIC(m0_DBP_aft,m1_DBP_aft)) # covariates: better
##  model weights 
## [1] 0 1
Weights(AIC(m0_DBP_aft,m1_DBP_aft,m2_DBP_aft)) # state workaholism: better
##  model weights 
## [1] 0.000 0.003 0.997
# Likelihood ratio test
anova(m1_DBP_aft,m2_DBP_aft) # best model is m2
## refitting model(s) with ML (instead of REML)


Here, we inspect the coefficients estimated by the selected model m2 and those estimated by the other models. In line with the results found for SBP_aft, we can see that state WHLSM.mc is positively related to DBP_aft, whereas trait WHLSM.cm.gmc is not. Among the included covariates, both age and BMI, but not gender predict higher DBP_aft.

# regression table
tab_model(m1_DBP_aft,m2_DBP_aft,
          dv.labels=c("Covariates","State WHLSM"),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,show.ci=FALSE,
          collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Covariates State WHLSM
Predictors b (SE) t b (SE) t
(Intercept) 77.32
(1.46)
52.80 77.32
(1.46)
52.81
gender [M] -0.38
(2.17)
-0.18 -0.38
(2.17)
-0.18
age gmc 0.28
(0.09)
3.07 0.28
(0.09)
3.07
BMI gmc 0.96
(0.32)
2.98 0.96
(0.32)
2.98
WHLSM cm gmc 1.11
(0.85)
1.31 1.11
(0.85)
1.31
WHLSM mc 1.30
(0.35)
3.74
Random Effects
σ2 82.14 80.61
τ00 104.48 ID 104.66 ID
N 106 ID 106 ID
Observations 787 787
# plotting main effects from selected model
grid.arrange(plot_model(m2_DBP_aft,type="pred",terms="WHLSM.cm.gmc"), # trait WHLSM
             plot_model(m2_DBP_aft,type="pred",terms="WHLSM.mc"),nrow=1) # state WHLSM


3.1.1.4. Influential cases

Here, we evaluate the presence of influential cases in the selected model m2. Specifically, the Cook’s distance is considered as the main measure of individual-level (i.e., participant) influence on the estimated parameters, and it is recomputed by progressively excluding the most influential participants (i.e., based on the rule-of-thumb of 4/N) until all extreme values are removed.

3.1.1.4.1. Cook’s distance
SBP_aft

We can see that participants S096 and S082 are potentially influential cases. Note that these are the same participants showing the most extreme deviations from the distributions of random effects (see section 3.1.2).

# cook's distance on the whole sample
infl <- influence(m2_SBP_aft,"ID")
plot(infl,which="cook",cutoff=4/nlevels(cleanBP_aft$ID),xlab="Cook distance",ylab="ID",sort=TRUE)

# progressively excluding participants
infl <- list(
  influence(exclude.influence(m2_SBP_aft,"ID","S082"),"ID"),
  influence(exclude.influence(m2_SBP_aft,"ID",c("S082","S096")),"ID"))
for(i in 1:length(infl)){ 
  plot(infl[[i]],which="cook",cutoff=4/(nlevels(cleanBP_aft$ID)-i),xlab="Cook distance",ylab="ID",sort=TRUE) }


DBP_aft

We can see that participant S082 is a potentially influential case. Note that this is the same participants showing the most extreme deviations from the distributions of random effects (see section 3.1.2).

# cook's distance on the whole sample
infl <- influence(m2_DBP_aft,"ID")
plot(infl,which="cook",cutoff=4/nlevels(cleanBP_aft$ID),xlab="Cook distance",ylab="ID",sort=TRUE)

# progressively excluding participants
infl <- list(influence(exclude.influence(m2_DBP_aft,"ID","S082"),"ID"))
for(i in 1:length(infl)){ 
  plot(infl[[i]],which="cook",cutoff=4/(nlevels(cleanBP_aft$ID)-i),xlab="Cook distance",ylab="ID",sort=TRUE) }


3.1.1.4.2. Coefficient change
SBP_aft

Here, we inspect the magnitude of the changes in the estimated coefficients after the removal of potentially influential cases. We can see that the coefficients estimated by the updated model do not substantially differ from those estimated by the original model. Thus, we choose to rely on the results obtained with the full sample.

# refitting model without influential cases
m2_SBP_aft.noInfl <- update(m2_SBP_aft,data=cleanBP_aft[!cleanBP_aft$ID%in%c("S096","S082"),])

# plotting coefficients original vs. updated model
plot_models(m2_SBP_aft,m2_SBP_aft.noInfl)

# showing regression table original vs. updated model
tab_model(m2_SBP_aft,m2_SBP_aft.noInfl,dv.labels=c("Original","Updated"),show.icc=FALSE,show.p=FALSE,show.se=TRUE,
          show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Original Updated
Predictors b (SE) CI t b (SE) CI t
(Intercept) 118.25
(1.97)
114.38 – 122.12 59.96 116.39
(1.76)
112.94 – 119.84 66.17
gender [M] 5.39
(2.92)
-0.35 – 11.13 1.84 7.31
(2.59)
2.23 – 12.39 2.83
age gmc 0.41
(0.12)
0.18 – 0.65 3.43 0.42
(0.11)
0.21 – 0.63 3.91
BMI gmc 1.10
(0.43)
0.25 – 1.95 2.54 1.05
(0.38)
0.30 – 1.80 2.74
WHLSM cm gmc 1.33
(1.14)
-0.91 – 3.57 1.16 0.87
(1.01)
-1.11 – 2.85 0.87
WHLSM mc 1.56
(0.40)
0.77 – 2.34 3.90 1.19
(0.39)
0.43 – 1.94 3.08
Random Effects
σ2 106.74 95.98
τ00 195.55 ID 148.12 ID
N 106 ID 104 ID
Observations 787 771


DBP_aft

Here, we inspect the magnitude of the changes in the estimated coefficients after the removal of potentially influential cases. We can see that the removal of the influential participant mainly affects the parameter estimated for gender, with men showing substantially higher DBP_aft than women in the updated model. Thus, since gender is not our main focus, we rely on the results obtained with the full sample.

# refitting model without influential cases
m2_DBP_aft.noInfl <- update(m2_SBP_aft,data=cleanBP_aft[cleanBP_aft$ID!="S082",])

# plotting coefficients original vs. updated model
plot_models(m2_DBP_aft,m2_DBP_aft.noInfl)

# showing regression table original vs. updated model
tab_model(m2_DBP_aft,m2_DBP_aft.noInfl,dv.labels=c("Original","Updated"),show.icc=FALSE,show.p=FALSE,show.se=TRUE,
          show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Original Updated
Predictors b (SE) CI t b (SE) CI t
(Intercept) 77.32
(1.46)
74.45 – 80.19 52.81 116.94
(1.82)
113.37 – 120.50 64.42
gender [M] -0.38
(2.17)
-4.65 – 3.88 -0.18 6.91
(2.68)
1.65 – 12.17 2.58
age gmc 0.28
(0.09)
0.10 – 0.45 3.07 0.47
(0.11)
0.26 – 0.69 4.27
BMI gmc 0.96
(0.32)
0.33 – 1.59 2.98 0.95
(0.39)
0.18 – 1.72 2.41
WHLSM cm gmc 1.11
(0.85)
-0.55 – 2.77 1.31 0.74
(1.05)
-1.32 – 2.79 0.70
WHLSM mc 1.30
(0.35)
0.61 – 1.98 3.74 1.42
(0.40)
0.63 – 2.21 3.55
Random Effects
σ2 80.61 104.74
τ00 104.66 ID 159.34 ID
N 106 ID 105 ID
Observations 787 778


3.1.2. Evening BP

Systolic SBP_eve and diastolic blood pressure DBP_eve recoded in the evening are predicted by concurrent state workaholism WHLSM.mc, by psychological detachment PD, trait workaholism WHLSM.cm, and three covariates selected from the previous step (see Supplementary Material S5), namely gender, age, and BMI. A further potential confounder highlighted from the previous step, namely day (i.e., expressing the linear time trend over the study protocol), is not included at this point to get more parsimonious models and more comparable results across BP models, also considering the lack of linear temporal trends in state WHLSM measures (see below). Particularly, as shown in Supplementary Material S5, such linear trend is possibly due to measurement reactivity (i.e., increased physiological activation during the first - less familiar - blood pressure recordings), and it will be considered as a robustness check in section 4.2.

mformulas[3] # covariates selected for SBP_aft
## [1] "SBP_eve ~ gender + age + BMI"
mformulas[4] # covariates selected for DBP_aft
## [1] "DBP_eve ~ gender + age + BMI"
# plotting WHLSM & SBP by day
par(mfrow=c(1,3)); boxplot(SBP_eve ~ day,data=clean); boxplot(DBP_eve ~ day,data=clean); boxplot(WHLSM ~ day,data=clean)

# model weight and estimated parameter for WHLSM by time
m0 <- lmer(WHLSM ~ (1|ID),data=cleanBP)
m1 <- lmer(WHLSM ~ day + (1|ID),data=cleanBP)
Weights(AIC(m0,m1)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.965 0.035
summary(m1)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error   t value
## (Intercept) 3.26380181  0.1377577 23.692339
## day         0.01819296  0.0116718  1.558711


3.1.2.1. Data preparation

First, we prepare the data for the analyses by removing all cases of missing responses in the dependent variable or any predictor or covariate (list-wise deletion), by centering level-2 continuous predictors on the grand mean (grand-mean-centering), and by centering level-1 continuous predictors on the individual mean (person-mean-centering).

# list-wise deletion
cleanBP_eve <- as.data.frame(na.omit(cleanBP[,c("ID","SBP_eve","DBP_eve", # grouping and dependent variables
                                                "gender","age","BMI","WHLSM","PD", # core predictors
                                                "WE","WC","sleep_dysf","psy_drugs","horm_drugs", # for robustness checks
                                                "confounders_eve","flagBP_eve","flagTime","careless","day",
                                                "position","children")])) 
cleanBP_eve$ID <- as.factor(as.character(cleanBP_eve$ID)) # resetting participant identifier levels
cat("Considering",nrow(cleanBP_eve),"complete obs from",nlevels(as.factor(as.character(cleanBP_eve$ID))),"participants")
## Considering 721 complete obs from 106 participants
# person-mean-centering lv-1 continuous predictors
wide <- cleanBP_eve[!duplicated(cleanBP_eve$ID),] # wide-form dataset
for(Var in c("WHLSM","PD","WE","WC")){
  wide <- cbind(wide,aggregate(cleanBP_eve[,Var],list(cleanBP_eve$ID),mean)[,2]) # individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanBP_eve <- join(cleanBP_eve,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining to long-form df
  cleanBP_eve[,paste0(Var,".mc")] <- cleanBP_eve[,Var] - cleanBP_eve[,paste0(Var,".cm")] } # mean-centered scores

# grand-mean-centering lv-2 continuous predictors
for(Var in c("age","BMI","WHLSM.cm")){ cleanBP_eve[,paste0(Var,".gmc")] <- cleanBP_eve[,Var] - mean(wide[,Var]) }

# showing data
cleanBP_eve[1:3,] # first three rows


3.1.2.2. Model fit

Here, we fit the multilevel models to the selected data using the default restricted maximum likelihood estimator (REML).

# m0: null model
m0_SBP_eve <- lmer(SBP_eve ~ (1|ID), # only fixed and random intercept + residual term
                   data=cleanBP_eve)

# m1: covariates
m1_SBP_eve <- lmer(SBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + (1|ID), # covariates
                       data=cleanBP_eve)

# m2: state workaholism
m2_SBP_eve <- lmer(SBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + (1|ID),
                   data=cleanBP_eve)

# m3: interaction
m3_SBP_eve <- lmer(SBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + WHLSM.mc:PD.mc + (1|ID),
                   data=cleanBP_eve)


The same models are specified for diastolic blood pressure.

# m0: null model
m0_DBP_eve <- lmer(DBP_eve ~ (1|ID), # only fixed and random intercept + residual term
                   data=cleanBP_eve)

# m1: covariates
m1_DBP_eve <- lmer(DBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + (1|ID),
                   data=cleanBP_eve)

# m2: state workaholism
m2_DBP_eve <- lmer(DBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + (1|ID),
                   data=cleanBP_eve)

# m3: interactions
m3_DBP_eve <- lmer(DBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + WHLSM.mc:PD.mc + (1|ID),
                   data=cleanBP_eve)

From the previous chunks, we see that all models converged without problems. Here, we inspect the diagnostics (i.e., normality of residual and random effect distributions, homoscedasticity, and multicollinearity) of the most complex model m3. Influential cases are analyzed in a dedicated section below.

SBP_eve

Model m3_SBP_eve shows some deviation from normality especially in the upper tail of the distribution of residuals and both tails of the distribution of random effects. Particularly, participant S082 is associated with the highest extreme deviation from the distributions of random intercepts, and will be removed as a robustness check (see section 4.1). Besides that, we can see that the homoscedsticity assumption holds and that none of the variance inflation factors (VIFs) shows extreme values, ruling out the risk of multicollinearity.

# normality and homoscedasticity
p <- plot_model(m3_SBP_eve,type="diag",dot.size=1)
p[[2]] <- p[[2]]$ID
plot_grid(p,tags=TRUE,margin=c(0,0,0,0))

# participant with highest random effects (i.e., BLUPS)
re <- ranef(m3_SBP_eve)$ID
as.character(cleanBP_prelqs[which(re$`(Intercept)`==max(re$`(Intercept)`)),"ID"])
## [1] "S082"
# homoscedasticity and multicollinearity
par(mfrow=c(1,2))
for(Var in c("gender")){ boxplot(resid(m3_SBP_eve) ~ cleanBP_eve[,Var],main=paste("Residuals by",Var)) }
barplot(vif(m3_SBP_eve),main="VIF Values",xlim=c(0,10),las=2,horiz=TRUE) # variance inflation factors (VIFs)
abline(v = 5, lwd = 5, lty = 2)


Here, we better inspect the residual distribution and the fit of models specified with alternative family distributions. We can see that none of the alternative families substantially better approximate the distribution of model residuals, with the log-transformed solution (i.e., normal distribution with log-transformed dependent variable) showing the best fit. Yet, it is not so better than the original model. Thus, we initially rely on the normal distribution and then consider the logarithmic transformation as a robustness check (see section 4.1).

# inspecting residual distribution
descdist(resid(m3_SBP_eve)) # unknown best-fit distribution

## summary statistics
## ------
## min:  -37.79119   max:  46.31558 
## median:  -0.2969038 
## mean:  6.652117e-14 
## estimated sd:  9.132578 
## estimated skewness:  0.149237 
## estimated kurtosis:  4.770943
# fitting model with alternative families
models <- list(
  m3_SBP_eve,
  glmer(formula=formula(m3_SBP_eve),family=Gamma(link="log"),data=cleanBP_eve), # gamma log (doesn't converge)
  glmer(formula=formula(m3_SBP_eve),family=Gamma(link="identity"),data=cleanBP_eve), # gamma id (doesn't converge)
  glmer(formula=formula(m3_SBP_eve),family=gaussian(link="log"),data=cleanBP_eve), # log-normal (singular fit)
  lmer(formula=as.formula(paste("log(SBP_eve) ~",as.character(formula(m3_SBP_eve))[3])),data=cleanBP_eve)) # log transf
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.00308287 (tol = 0.002, component 1)
## boundary (singular) fit: see help('isSingular')
# normal Q-Q plot of model residuals
par(mfrow=c(1,5))
for(i in 1:length(models)){ 
  qqnorm(resid(models[[i]]),main=c("Norm","Gamma-log","Gamma-id","log-norm","log-transf")[i]); qqline(resid(models[[i]]))}


DBP_eve

Model m3_DBP_eve shows some deviation from normality in both tails of the distribution of residuals and random effects. Particularly, participant S082 is associated with the highest extreme deviation from the distributions of both random effects, and will be removed as a robustness check (see section 4.1). Besides that, we can see that the homoscedsticity assumption holds and that none of the variance inflation factors (VIFs) shows extreme values, ruling out the risk of multicollinearity.

# normality and homoscedasticity
p <- plot_model(m3_DBP_eve,type="diag",dot.size=1)
p[[2]] <- p[[2]]$ID
plot_grid(p,tags=TRUE,margin=c(0,0,0,0))

# participant with highest random effects (i.e., BLUPS)
re <- ranef(m3_DBP_eve)$ID
re[re$WHLSM.mc==max(re$WHLSM.mc)|re$`(Intercept)`==max(re$`(Intercept)`),]
## numeric(0)
# homoscedasticity and multicollinearity
par(mfrow=c(1,2))
for(Var in c("gender")){ boxplot(resid(m3_DBP_eve) ~ cleanBP_eve[,Var],main=paste("Residuals by",Var)) }
barplot(vif(m3_DBP_eve),main="VIF Values",xlim=c(0,10),las=2,horiz=TRUE) # variance inflation factors (VIFs)
abline(v = 5, lwd = 5, lty = 2)


Here, we better inspect the residual distribution and the fit of models specified with alternative family distributions. We can see that none of the alternative families better approximates the distribution of model residuals, and none of them reached convergence. Thus, we initially rely on the normal distribution and then consider the gamma log as a robustness check (i.e., the only solution that converges).

# inspecting residual distribution
descdist(resid(m3_DBP_eve)) # unknown best-fit distribution but close to normal

## summary statistics
## ------
## min:  -22.70821   max:  31.60269 
## median:  -0.1333256 
## mean:  4.346043e-14 
## estimated sd:  7.838394 
## estimated skewness:  0.1657032 
## estimated kurtosis:  3.719358
# fitting model with alternative families
models <- list(
  m3_DBP_eve,
  glmer(formula=formula(m3_DBP_eve),family=Gamma(link="log"),data=cleanBP_eve), # gamma log
  glmer(formula=formula(m3_DBP_eve),family=Gamma(link="identity"),data=cleanBP_eve), # gamma id (doesn't converge)
  glmer(formula=formula(m3_DBP_eve),family=gaussian(link="log"),data=cleanBP_eve), # log-normal (singular fit)
  lmer(formula=as.formula(paste("log(SBP_eve) ~",as.character(formula(m2_DBP_eve))[3])),data=cleanBP_eve)) # log tr (singular)
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.0035261 (tol = 0.002, component 1)
## boundary (singular) fit: see help('isSingular')
# normal Q-Q plot of model residuals
par(mfrow=c(1,5))
for(i in 1:length(models)){ 
  qqnorm(resid(models[[i]]),main=c("Norm","Gamma-log","Gamma-id","log-norm","log-transf")[i]); qqline(resid(models[[i]]))}


3.1.2.3. Results

Here, we compare the specified models based on the Akaike weight and the likelihood ratio test (with type-I error set to p < .05), and we inspect the results of the selected model(s).

SBP_eve

We can see that the inclusion of state WHLSM is not associated with stronger evidence or significant likelihood ratio compared to models including less predictors (Aw = .33, \(\chi^2\)(1) = 0.58, p = .44). Similar, the interaction does not imply stronger evidence or significant likelihood ratio (Aw = .11, \(\chi^2\)(1) = 0.65, p = .42).

# Akaike weight adding one model at time
Weights(AIC(m0_SBP_eve,m1_SBP_eve)) # covariates: better
##  model weights 
## [1] 0 1
Weights(AIC(m0_SBP_eve,m1_SBP_eve,m2_SBP_eve)) # state workaholism: worse
##  model weights 
## [1] 0.000 0.668 0.332
Weights(AIC(m0_SBP_eve,m1_SBP_eve,m2_SBP_eve,m3_SBP_eve)) # interaction: worse
##  model weights 
## [1] 0.000 0.593 0.294 0.113
# Likelihood ratio test with m3.RDet
anova(m1_SBP_eve,m2_SBP_eve,m3_SBP_eve) # best model is m1
## refitting model(s) with ML (instead of REML)


Here, we inspect the coefficients estimated by the selected model m1.bis and those estimated by the target models. We can see that state WHLSM.mc is not substantially related to BP_eve, similar to trait WHLSM.cm.gmc is not. Among the included covariates, age, BMI, and low PD predict higher SBP_eve.

# regression table
tab_model(m1_SBP_eve,m2_SBP_eve,m3_SBP_eve,
          dv.labels=c("Covariates","State WHLSM","Interaction"),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,show.ci=FALSE,
          collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Covariates State WHLSM Interaction
Predictors b (SE) t b (SE) t b (SE) t
(Intercept) 113.08
(1.87)
60.61 113.08
(1.87)
60.61 113.11
(1.86)
60.66
gender [M] 2.48
(2.76)
0.90 2.48
(2.76)
0.90 2.48
(2.76)
0.90
age gmc 0.33
(0.11)
2.91 0.33
(0.11)
2.91 0.33
(0.11)
2.89
BMI gmc 1.40
(0.41)
3.44 1.40
(0.41)
3.44 1.40
(0.41)
3.45
PD mc -0.82
(0.26)
-3.11 -0.81
(0.27)
-3.02 -0.80
(0.27)
-2.99
WHLSM cm gmc 1.34
(1.06)
1.26 1.34
(1.06)
1.26 1.35
(1.06)
1.27
WHLSM mc 0.31
(0.40)
0.76 0.31
(0.40)
0.76
PD mc × WHLSM mc 0.24
(0.30)
0.80
Random Effects
σ2 96.62 96.69 96.77
τ00 173.03 ID 173.02 ID 172.72 ID
N 106 ID 106 ID 106 ID
Observations 721 721 721
# plotting main effects from model m2
grid.arrange(plot_model(m2_SBP_eve,type="pred",terms="WHLSM.cm.gmc"), # trait WHLSM
             plot_model(m2_SBP_eve,type="pred",terms="WHLSM.mc"),nrow=1) # state WHLSM

# plotting interactions
sd(cleanBP_eve$PD.mc) # RDet: 1 SD = 1.38
## [1] 1.382712
plot_model(m3_SBP_eve,type="pred",terms=c("WHLSM.mc","PD.mc [-1.38,1.38]"))


DBP_eve

Results are similar to those found for SBP_eve: the inclusion of state WHLSM is associated with stronger evidence (Aw = .68) but not with significant likelihood ratio compared to models including less predictors (\(\chi^2\)(1) = 3.71, p = .05). Similar, the interaction does not imply stronger evidence or significant likelihood ratio (Aw = .14, \(\chi^2\)(1) = 0.01, p = .99).

# Akaike weight adding one model at time
Weights(AIC(m0_DBP_eve,m1_DBP_eve)) # covariates: better
##  model weights 
## [1] 0 1
Weights(AIC(m0_DBP_eve,m1_DBP_eve,m2_DBP_eve)) # state workaholism: better
##  model weights 
## [1] 0.000 0.319 0.680
Weights(AIC(m0_DBP_eve,m1_DBP_eve,m2_DBP_eve,m3_DBP_eve)) # state whlsm by detachment: worse
##  model weights 
## [1] 0.000 0.275 0.585 0.140
# Likelihood ratio test with m3
anova(m1_DBP_eve,m2_DBP_eve,m3_DBP_eve) # best model is m1
## refitting model(s) with ML (instead of REML)


Here, we inspect the coefficients estimated by the models specified for DBP_eve. We can see that state WHLSM.mc is not substantially related to DBP_eve. Among the included covariates, age and BMI predict higher SBP_eve.

# regression table
tab_model(m1_DBP_eve,m2_DBP_eve,m3_DBP_eve,
          dv.labels=c("Covariates","State WHLSM","Interaction"),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,show.ci=FALSE,
          collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Covariates State WHLSM Interaction
Predictors b (SE) t b (SE) t b (SE) t
(Intercept) 72.72
(1.45)
50.17 72.72
(1.45)
50.17 72.72
(1.45)
50.15
gender [M] -1.31
(2.15)
-0.61 -1.31
(2.15)
-0.61 -1.31
(2.15)
-0.61
age gmc 0.27
(0.09)
3.05 0.27
(0.09)
3.05 0.27
(0.09)
3.05
BMI gmc 1.16
(0.32)
3.66 1.16
(0.32)
3.66 1.16
(0.32)
3.66
PD mc -0.23
(0.23)
-0.99 -0.18
(0.23)
-0.80 -0.18
(0.23)
-0.80
WHLSM cm gmc 0.46
(0.83)
0.55 0.46
(0.83)
0.55 0.46
(0.83)
0.55
WHLSM mc 0.67
(0.34)
1.95 0.67
(0.35)
1.95
PD mc × WHLSM mc 0.00
(0.26)
0.01
Random Effects
σ2 71.29 70.97 71.08
τ00 102.38 ID 102.42 ID 102.43 ID
N 106 ID 106 ID 106 ID
Observations 721 721 721
# plotting main effects from model m2
grid.arrange(plot_model(m2_SBP_eve,type="pred",terms="WHLSM.cm.gmc"), # trait WHLSM
             plot_model(m2_SBP_eve,type="pred",terms="WHLSM.mc"),nrow=1) # state WHLSM

# plotting interactions
sd(cleanBP_eve$PD.mc) # RDet: 1 SD = 1.38
## [1] 1.382712
plot_model(m3_DBP_eve,type="pred",terms=c("WHLSM.mc","PD.mc [-1.38,1.38]"))


3.1.2.4. Influential cases

Here, we evaluate the presence of influential cases in the target model m2. Specifically, the Cook’s distance is considered as the main measure of individual-level (i.e., participant) influence on the estimated parameters, and it is recomputed by progressively excluding the most influential participants (i.e., based on the rule-of-thumb of 4/N) until all extreme values are removed.

3.1.2.4.1. Cook’s distance
SBP_eve

We can see that participants S082 and S096 are potentially influential cases. Note that the latter is the same participants showing the most extreme deviations from the distributions of random effects (see section 3.3.2).

# cook's distance on the whole sample
infl <- influence(m2_SBP_eve,"ID")
plot(infl,which="cook",cutoff=4/nlevels(cleanBP_eve$ID),xlab="Cook distance",ylab="ID",sort=TRUE)

# progressively excluding participants
infl <- list(
  influence(exclude.influence(m2_SBP_eve,"ID","S082"),"ID"),
  influence(exclude.influence(m2_SBP_eve,"ID",c("S082","S096")),"ID"))
for(i in 1:length(infl)){ 
  plot(infl[[i]],which="cook",cutoff=4/(nlevels(cleanBP_eve$ID)-i),xlab="Cook distance",ylab="ID",sort=TRUE) }


DBP_eve

We can see that participants S082 and S080 is a potentially influential case. Note that the former is the same participant showing the most extreme deviations from the distributions of random effects (see section 3.3.2).

# cook's distance on the whole sample
infl <- influence(m2_DBP_eve,"ID")
plot(infl,which="cook",cutoff=4/nlevels(cleanBP_eve$ID),xlab="Cook distance",ylab="ID",sort=TRUE)

# progressively excluding participants
infl <- list(influence(exclude.influence(m2_DBP_eve,"ID","S082"),"ID"),
             influence(exclude.influence(m2_DBP_eve,"ID",c("S082","S080")),"ID"))
for(i in 1:length(infl)){ 
  plot(infl[[i]],which="cook",cutoff=4/(nlevels(cleanBP_eve$ID)-i),xlab="Cook distance",ylab="ID",sort=TRUE) }


3.1.2.4.2. Coefficient change
SBP_eve

Here, we inspect the magnitude of the changes in the estimated coefficients after the removal of potentially influential cases. We can see that the coefficients estimated by the updated model do not substantially differ from those estimated by the original model. Thus, we choose to rely on the results obtained with the full sample.

# refitting model without influential cases
m2_SBP_eve.noInfl <- update(m2_SBP_eve,data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S096"),])

# plotting coefficients original vs. updated model
plot_models(m2_SBP_eve,m2_SBP_eve.noInfl)

# same thing with interactions
m3_DBP_eve.noInfl <- update(m3_SBP_eve,data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S096"),])
plot_models(m3_SBP_eve,m3_DBP_eve.noInfl)

# showing regression table original vs. updated model
tab_model(m2_SBP_eve,m2_SBP_eve.noInfl,dv.labels=c("Original","Updated"),show.icc=FALSE,show.p=FALSE,show.se=TRUE,
          show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Original Updated
Predictors b (SE) CI t b (SE) CI t
(Intercept) 113.08
(1.87)
109.41 – 116.74 60.61 111.19
(1.63)
108.00 – 114.39 68.33
gender [M] 2.48
(2.76)
-2.94 – 7.91 0.90 4.43
(2.39)
-0.26 – 9.12 1.86
age gmc 0.33
(0.11)
0.11 – 0.56 2.91 0.34
(0.10)
0.15 – 0.54 3.45
BMI gmc 1.40
(0.41)
0.60 – 2.20 3.44 1.34
(0.35)
0.65 – 2.03 3.81
PD mc -0.81
(0.27)
-1.33 – -0.28 -3.02 -0.88
(0.27)
-1.41 – -0.35 -3.26
WHLSM cm gmc 1.34
(1.06)
-0.75 – 3.43 1.26 0.87
(0.92)
-0.94 – 2.67 0.94
WHLSM mc 0.31
(0.40)
-0.48 – 1.10 0.76 0.16
(0.40)
-0.64 – 0.95 0.39
Random Effects
σ2 96.69 94.08
τ00 173.02 ID 123.34 ID
N 106 ID 104 ID
Observations 721 709


DBP_eve

Here, we inspect the magnitude of the changes in the estimated coefficients after the removal of potentially influential cases. We can see that the coefficient estimated for state WHLSM.mc by the updated model is strongly reduced. Thus, these results question the generalizability of the estimated relationship between WHLSM.mc and DBP_eve.

# refitting model without influential cases
m2_DBP_eve.noInfl <- update(m2_SBP_eve,data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S080"),])

# plotting coefficients original vs. updated model
plot_models(m2_DBP_eve,m2_DBP_eve.noInfl)

# same thing with interaction
m3_DBP_eve.noInfl <- update(m3_SBP_eve,data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S080"),])
plot_models(m3_DBP_eve,m3_DBP_eve.noInfl)

# showing regression table original vs. updated model
tab_model(m2_DBP_eve,m2_DBP_eve.noInfl,dv.labels=c("Original","Updated"),show.icc=FALSE,show.p=FALSE,show.se=TRUE,
          show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Original Updated
Predictors b (SE) CI t b (SE) CI t
(Intercept) 72.72
(1.45)
69.87 – 75.57 50.17 111.67
(1.70)
108.33 – 115.01 65.63
gender [M] -1.31
(2.15)
-5.53 – 2.90 -0.61 4.09
(2.50)
-0.81 – 8.99 1.64
age gmc 0.27
(0.09)
0.10 – 0.45 3.05 0.39
(0.10)
0.19 – 0.59 3.78
BMI gmc 1.16
(0.32)
0.54 – 1.78 3.66 1.25
(0.37)
0.53 – 1.97 3.41
PD mc -0.18
(0.23)
-0.63 – 0.26 -0.80 -0.73
(0.26)
-1.25 – -0.22 -2.79
WHLSM cm gmc 0.46
(0.83)
-1.17 – 2.08 0.55 0.77
(0.96)
-1.11 – 2.66 0.80
WHLSM mc 0.67
(0.34)
-0.00 – 1.35 1.95 0.16
(0.40)
-0.62 – 0.94 0.40
Random Effects
σ2 70.97 89.95
τ00 102.42 ID 136.26 ID
N 106 ID 104 ID
Observations 721 706


3.1.3. Mediation

In light of the relationships found between state workaholism and afternoon blood pressure, and the substantial correlation found between afternoon and evening blood pressure, here we explore the mediating paths between workaholism and later blood pressure measurements by evaluating the potential mediating role of afternoon blood pressure. This is done by considering the same covariates included above, namely gender, age, BMI, PD, and trait WHLSM.cm.

library(mediation) # loding mediation package
# data preparation (list-wise deletion and mean centering)
cleanBP_med_eve <- as.data.frame(na.omit(cleanBP[,c("ID","SBP_aft","DBP_aft","SBP_eve","DBP_eve", # grouping and response vars
                                                "gender","age","BMI","WHLSM","PD", # core predictors
                                                "WE","WC","sleep_dysf","psy_drugs","horm_drugs", # for robustness checks
                                                "confounders_aft","confounders_eve",
                                                "flagBP_aft","flagBP_eve","flagTime","careless","day",
                                                "children","position")])) 
cleanBP_med_eve$ID <- as.factor(as.character(cleanBP_med_eve$ID)) # resetting participant identifier levels
wide <- cleanBP_med_eve[!duplicated(cleanBP_med_eve$ID),] # wide-form dataset
for(Var in c("WHLSM","PD","SBP_aft","DBP_aft","WE","WC")){
  wide <- cbind(wide,aggregate(cleanBP_med_eve[,Var],list(cleanBP_med_eve$ID),mean)[,2]) # individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanBP_med_eve <- join(cleanBP_med_eve,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining to long-form df
  cleanBP_med_eve[,paste0(Var,".mc")] <- cleanBP_med_eve[,Var] - cleanBP_med_eve[,paste0(Var,".cm")] } # mean-centered scores
for(Var in c("age","BMI","WHLSM.cm")){ cleanBP_med_eve[,paste0(Var,".gmc")] <- cleanBP_med_eve[,Var] - mean(wide[,Var]) } # gmc
cat("Considering",nrow(cleanBP_med_eve),"complete obs from",nlevels(as.factor(as.character(cleanBP_med_eve$ID))),"participants")
## Considering 717 complete obs from 106 participants


We can see that a significant indirect effect is estimated in both cases, whereas the direct effect is not significant for both systolic and diastolic blood pressure. Results are consistent after the removal of influential cases.

SBP_eve

# output and mediation models
mOut_SBP_eve <- lmer(SBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + SBP_aft.mc + 
                       (1|ID),data=cleanBP_med_eve)
mMed_SBP_eve <- lmer(SBP_aft ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + 
                       (1|ID),data=cleanBP_med_eve)

# mediation results
NSIM <- 10000
med_SBP_eve <- mediation::mediate(model.m=mMed_SBP_eve,model.y=mOut_SBP_eve,treat="WHLSM.mc",mediator="SBP_aft.mc",
                       covariates=cleanBP_med_eve[,c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc")],
                       boot=FALSE,sims=NSIM) # quasi-Bayesian CI
summary(med_SBP_eve) # significant indirect effect
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
## (Inference Conditional on the Covariate Values Specified in `covariates')
## 
## Mediator Groups: ID 
## 
## Outcome Groups: ID 
## 
## Output Based on Overall Averages Across Groups 
## 
##                Estimate 95% CI Lower 95% CI Upper p-value   
## ACME             0.1967       0.0565         0.38  0.0032 **
## ADE              0.1126      -0.6597         0.90  0.7800   
## Total Effect     0.3093      -0.4800         1.10  0.4548   
## Prop. Mediated   0.3392      -5.5738         5.61  0.4548   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 717 
## 
## 
## Simulations: 10000
# mediation results without influential cases
mOut_SBP_eve.noInfl <- update(mOut_SBP_eve,data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),])
mMed_SBP_eve.noInfl <- update(mMed_SBP_eve,data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),])
med_SBP_eve.noInfl <- mediation::mediate(model.m=mMed_SBP_eve.noInfl,model.y=mOut_SBP_eve.noInfl,
                              treat="WHLSM.mc",mediator="SBP_aft.mc",
                              covariates=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),
                                                         c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc")],
                              boot=FALSE,sims=NSIM) # quasi-Bayesian CI
summary(med_SBP_eve.noInfl) # indirect effect stays significant
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
## (Inference Conditional on the Covariate Values Specified in `covariates')
## 
## Mediator Groups: ID 
## 
## Outcome Groups: ID 
## 
## Output Based on Overall Averages Across Groups 
## 
##                Estimate 95% CI Lower 95% CI Upper p-value  
## ACME             0.1379       0.0199         0.30   0.018 *
## ADE              0.0188      -0.7724         0.79   0.961  
## Total Effect     0.1567      -0.6359         0.94   0.700  
## Prop. Mediated   0.2099      -5.3281         4.61   0.703  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 705 
## 
## 
## Simulations: 10000


DBP_eve

# output and mediation models
mOut_DBP_eve <- lmer(DBP_eve ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + DBP_aft.mc + 
                       (1|ID),data=cleanBP_med_eve)
mMed_DBP_eve <- lmer(DBP_aft ~ gender + age.gmc + BMI.gmc + PD.mc + WHLSM.cm.gmc + WHLSM.mc + 
                       (1|ID),data=cleanBP_med_eve)

# mediation results
med_DBP_eve <- mediation::mediate(model.m=mMed_DBP_eve,model.y=mOut_DBP_eve,treat="WHLSM.mc",mediator="DBP_aft.mc",
                       covariates=cleanBP_med_eve[,c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc")],
                       boot=FALSE,sims=NSIM) # quasi-Bayesian CI
summary(med_DBP_eve) # significant indirect effect
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
## (Inference Conditional on the Covariate Values Specified in `covariates')
## 
## Mediator Groups: ID 
## 
## Outcome Groups: ID 
## 
## Output Based on Overall Averages Across Groups 
## 
##                Estimate 95% CI Lower 95% CI Upper p-value   
## ACME             0.1700       0.0453         0.33  0.0044 **
## ADE              0.5198      -0.1547         1.21  0.1304   
## Total Effect     0.6898       0.0265         1.37  0.0428 * 
## Prop. Mediated   0.2376       0.0164         1.48  0.0468 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 717 
## 
## 
## Simulations: 10000
# mediation results without influential cases
mOut_DBP_eve.noInfl <- update(mOut_DBP_eve,data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S080"),])
mMed_DBP_eve.noInfl <- update(mMed_DBP_eve,data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S080"),])
med_DBP_eve.noInfl <- mediation::mediate(model.m=mMed_DBP_eve.noInfl,model.y=mOut_DBP_eve.noInfl,
                              treat="WHLSM.mc",mediator="DBP_aft.mc",
                              covariates=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S080"),
                                                         c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc")],
                              boot=FALSE,sims=NSIM) # quasi-Bayesian CI
summary(med_DBP_eve.noInfl) # indirect effect stays significant
## 
## Causal Mediation Analysis 
## 
## Quasi-Bayesian Confidence Intervals
## 
## (Inference Conditional on the Covariate Values Specified in `covariates')
## 
## Mediator Groups: ID 
## 
## Outcome Groups: ID 
## 
## Output Based on Overall Averages Across Groups 
## 
##                Estimate 95% CI Lower 95% CI Upper p-value   
## ACME             0.1847       0.0608         0.35  0.0016 **
## ADE              0.5452      -0.1353         1.23  0.1146   
## Total Effect     0.7299       0.0475         1.41  0.0372 * 
## Prop. Mediated   0.2444       0.0415         1.32  0.0388 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 702 
## 
## 
## Simulations: 10000


3.2. Emotional Exhaustion

Emotional exhaustion EE rated in the evening is predicted by state workaholism WHLSM.mc, in addition to psychological detachment PD, trait workaholism WHLSM.cm, and one covariate selected from the previous step (see Supplementary Material S5), namely gender.

mformulas[5] # covariates selected for EE
## [1] "EE ~ gender"


3.2.1. Data preparation

First, we prepare the data for the analyses by removing all cases of missing responses in the dependent variable or any predictor or covariate (list-wise deletion), by centering level-2 continuous predictors on the grand mean (grand-mean-centering), and by centering level-1 continuous predictors on the individual mean (person-mean-centering).

# list-wise deletion
cleanEE <- as.data.frame(na.omit(clean[,c("ID","EE","gender","PD","WHLSM", # core variables
                                          "WE","WC","flagTime","careless","day", # for robustness checks
                                          "position","children")])) 
cleanEE$ID <- as.factor(as.character(cleanEE$ID)) # resetting participant identifier levels
cat("Considering",nrow(cleanEE),"complete observations from",nlevels(as.factor(as.character(cleanEE$ID))),"participants")
## Considering 779 complete observations from 114 participants
# person-mean-centering lv-1 continuous predictors
wide <- cleanEE[!duplicated(cleanEE$ID),] # wide-form dataset
for(Var in c("PD","WHLSM","WE","WC")){
  wide <- cbind(wide,aggregate(cleanEE[,Var],list(cleanEE$ID),mean)[,2]) # computing individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanEE <- join(cleanEE,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
  cleanEE[,paste0(Var,".mc")] <- cleanEE[,Var] - cleanEE[,paste0(Var,".cm")] } # computing mean-centered scores

# grand-mean-centering lv-2 continuous predictors
for(Var in c("WHLSM.cm")){ cleanEE[,paste0(Var,".gmc")] <- cleanEE[,Var] - mean(wide[,Var]) }

# showing data
cleanEE[1:3,] # first three rows


3.2.2. Model fit

Here, we fit the multilevel models to the selected data using the default restricted maximum likelihood estimator (REML).

# m0: null model
m0_EE <- lmer(EE ~ (1|ID), # only fixed and random intercept + residual term
              data=cleanEE)

# m1: covariates
m1_EE <- lmer(EE ~ gender + PD.mc + WHLSM.cm.gmc + (1|ID), # covariates + recovery exp
              data=cleanEE)

# m2: state workaholism
m2_EE <- lmer(EE ~ gender + PD.mc + WHLSM.cm.gmc + WHLSM.mc + (1|ID),
              data=cleanEE)

# m3: interactions
m3_EE <- lmer(EE ~ gender + PD.mc + WHLSM.cm.gmc + WHLSM.mc + WHLSM.mc + WHLSM.mc:PD.mc + (1|ID), 
              data=cleanEE)

From the previous chunk, we see that all models converged without problems. Here, we inspect the diagnostics (i.e., normality of residual and random effect distributions, homoscedasticity, and multicollinearity) of the most complex model m3. Influential cases are analyzed in a dedicated section below.

Model m3 shows some deviation from normality in both tails of the distribution of residuals and both random effects. Besides that, we can see that the homoscedsticity assumption holds and that none of the variance inflation factors (VIFs) shows extreme values, ruling out the risk of multicollinearity.

# normality and homoscedasticity
p <- plot_model(m3_EE,type="diag",dot.size=1) 
p[[2]] <- p[[2]]$ID
plot_grid(p,tags=TRUE,margin=c(0,0,0,0))

# homoscedasticity and multicollinearity
par(mfrow=c(1,2)) 
for(Var in c("gender")){ boxplot(resid(m3_EE) ~ cleanEE[,Var],main=paste("Residuals by",Var)) }
barplot(vif(m3_EE),main="VIF Values",xlim=c(0,10),las=2,horiz=TRUE) # variance inflation factors (VIFs)
abline(v = 5, lwd = 5, lty = 2)


Here, we better inspect the residual distribution and the fit of models specified with alternative family distributions. We can see that alternative families might better approximate the distribution of model residuals, with the Gamma-log solution (i.e., Gamma distribution with logarithmic link function) showing the best fit. Yet, it is not so better than the original model. Thus, we initially rely on the normal distribution and then consider the Gamma-log solution as a robustness check.

# inspecting residual distribution
descdist(resid(m3_EE)) # best fit for lognormal?

## summary statistics
## ------
## min:  -3.710471   max:  3.628516 
## median:  -0.05379407 
## mean:  -1.253042e-15 
## estimated sd:  0.9577171 
## estimated skewness:  0.2331125 
## estimated kurtosis:  3.691947
# fitting model with alternative families
models <- list(
  m3_EE,
  glmer(formula=formula(m3_EE),family=Gamma(link="log"),data=cleanEE), # gamma with log
  glmer(formula=formula(m3_EE),family=Gamma(link="identity"),data=cleanEE), # [FAILS TO CONV, max|grad| = 0.09]
  glmer(formula=formula(m3_EE),family=gaussian(link="log"),data=cleanEE), # log-norm
  lmer(formula=as.formula(paste("log(EE) ~",as.character(formula(m3_EE))[3])),data=cleanEE)) # norm log

# normal Q-Q plot of model residuals
par(mfrow=c(1,5))
for(i in 1:length(models)){ 
  qqnorm(resid(models[[i]]),main=c("Norm","Gamma-log","Log-norm","log-transf")[i]); qqline(resid(models[[i]])) }


3.2.3. Results

Here, we compare the specified models based on the Akaike weight and the likelihood ratio test (with type-I error set to p < .05), and we inspect the results of the selected model(s). We can see that the inclusion of state WHLSM is associated with stronger evidence and significantly higher likelihood than the baseline model (Aw = .99, \(\chi^2\)(1) = 20.46, p < .001). In contrast, the interactive model is not better than the previous ones (Aw = .06, \(\chi^2\)(1) = 1.68, p = .19).

# Akaike weight adding one model at time
Weights(AIC(m0_EE,m1_EE)) # covariates: better
##  model weights 
## [1] 0 1
Weights(AIC(m0_EE,m1_EE,m2_EE)) # state workaholism: better
##  model weights 
## [1] 0.000 0.001 0.999
Weights(AIC(m0_EE,m1_EE,m2_EE,m3_EE)) # interaction: worse
##  model weights 
## [1] 0.000 0.001 0.939 0.061
# Likelihood ratio test with m3
anova(m1_EE,m2_EE,m3_EE) # best model is m2
## refitting model(s) with ML (instead of REML)


Here, we inspect the coefficients estimated by the selected model m2 and those estimated by other models. We can see that state WHLSM.mc is substantially and negatively related to EE, whereas the interaction is not substantial. Among the included covariates, low PD and high trait WHLSM.gmc predict substantially higher EE.

# regression table
tab_model(m1_EE,m2_EE,m3_EE,
          dv.labels=c("Baseline","State WHLSM","Interaction"),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,show.ci=FALSE,
          collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Baseline State WHLSM Interaction
Predictors b (SE) t b (SE) t b (SE) t
(Intercept) 3.12
(0.14)
21.89 3.12
(0.14)
21.89 3.12
(0.14)
21.84
gender [M] 0.18
(0.21)
0.88 0.18
(0.21)
0.88 0.18
(0.21)
0.88
PD mc -0.08
(0.03)
-3.05 -0.07
(0.03)
-2.70 -0.07
(0.03)
-2.75
WHLSM cm gmc 0.47
(0.08)
5.91 0.47
(0.08)
5.91 0.47
(0.08)
5.88
WHLSM mc 0.19
(0.04)
4.67 0.19
(0.04)
4.67
PD mc × WHLSM mc -0.04
(0.03)
-1.27
Random Effects
σ2 1.09 1.05 1.05
τ00 1.02 ID 1.03 ID 1.03 ID
N 114 ID 114 ID 114 ID
Observations 779 779 779
# plotting main effects from selected model
grid.arrange(plot_model(m3_EE,type="pred",terms="WHLSM.cm.gmc"), # trait WHLSM
             plot_model(m3_EE,type="pred",terms="WHLSM.mc"),nrow=1) # state WHLSM

# plotting interactions
sd(cleanEE$PD.mc) # RDet: 1 SD = 1.36
## [1] 1.359362
plot_model(m3_EE,type="pred",terms=c("WHLSM.mc","PD.mc [-1.36,1.36]"))


3.2.4. Influential cases

Here, we evaluate the presence of influential cases in the selected model m2.bis. Specifically, the Cook’s distance is considered as the main measure of individual-level (i.e., participant) influence on the estimated parameters, and it is recomputed by progressively excluding the most influential participants (i.e., based on the rule-of-thumb of 4/N) until all extreme values are removed.

3.2.4.1. Cook’s distance

We can see that participant S049 is a potentially influential case.

# cook's distance on the whole sample
infl <- influence(m2_EE,"ID")
plot(infl,which="cook",cutoff=4/nlevels(cleanEE$ID),xlab="Cook distance",ylab="ID",sort=TRUE)

# progressively excluding participants
infl <- influence(exclude.influence(m2_EE,"ID","S049"),"ID")
plot(infl,which="cook",cutoff=4/(nlevels(cleanEE$ID)-1),xlab="Cook distance",ylab="ID",sort=TRUE)


3.2.4.2. Coefficient change

Here, we inspect the magnitude of the changes in the estimated coefficients after the removal of potentially influential cases. We can see that the updated models do not imply substantial changes in the estimated coefficients. Thus, we choose to rely on the results obtained with the full sample.

# refitting model without influential cases
m2_EE.noInfl <- update(m2_EE,data=cleanEE[!cleanEE$ID%in%c("S049"),])

# plotting coefficients original vs. updated model
plot_models(m2_EE,m2_EE.noInfl) # main effect

plot_models(m3_EE,update(m3_EE,data=cleanEE[!cleanEE$ID%in%c("S049"),])) # interaction

# showing regression table original vs. updated model
tab_model(m2_EE,m2_EE.noInfl,dv.labels=c("Original","Updated"),show.icc=FALSE,show.p=FALSE,show.se=TRUE,
          show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Original Updated
Predictors b (SE) CI t b (SE) CI t
(Intercept) 3.12
(0.14)
2.84 – 3.40 21.89 3.18
(0.14)
2.90 – 3.45 22.72
gender [M] 0.18
(0.21)
-0.22 – 0.58 0.88 0.12
(0.20)
-0.27 – 0.52 0.61
PD mc -0.07
(0.03)
-0.13 – -0.02 -2.70 -0.07
(0.03)
-0.12 – -0.02 -2.54
WHLSM cm gmc 0.47
(0.08)
0.31 – 0.62 5.91 0.53
(0.08)
0.37 – 0.68 6.60
WHLSM mc 0.19
(0.04)
0.11 – 0.27 4.67 0.19
(0.04)
0.11 – 0.27 4.67
Random Effects
σ2 1.05 1.06
τ00 1.03 ID 0.96 ID
N 114 ID 113 ID
Observations 779 772


3.3. Sleep disturbances

Sleep disturbances SD rated in the morning is predicted by previous day state workaholism WHLSM.mc, in addition to psychological detachment PD, trait workaholism WHLSM.cm, and one covariate selected from the previous step (see Supplementary Material S5), namely gender.

mformulas[6] # covariates selected for SD
## [1] "SD ~ gender"


3.3.1. Data preparation

First, we prepare the data for the analyses by removing all cases of missing responses in the dependent variable or any predictor or covariate (list-wise deletion), by centering level-2 continuous predictors on the grand mean (grand-mean-centering), and by centering level-1 continuous predictors on the individual mean (person-mean-centering).

# list-wise deletion
cleanSD <- as.data.frame(na.omit(clean[,c("ID","SD","gender","PD","WHLSM", # core variables
                                          "WE","WC","sleep_dysf","flagTime","careless", # for robustness checks
                                          "position","children")])) 
cleanSD$ID <- as.factor(as.character(cleanSD$ID)) # resetting participant identifier levels
cat("Considering",nrow(cleanSD),"complete observations from",nlevels(as.factor(as.character(cleanSD$ID))),"participants")
## Considering 723 complete observations from 114 participants
# person-mean-centering lv-1 continuous predictors
wide <- cleanSD[!duplicated(cleanSD$ID),] # wide-form dataset
for(Var in c("PD","WHLSM","WE","WC")){
  wide <- cbind(wide,aggregate(cleanSD[,Var],list(cleanSD$ID),mean)[,2]) # computing individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanSD <- join(cleanSD,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
  cleanSD[,paste0(Var,".mc")] <- cleanSD[,Var] - cleanSD[,paste0(Var,".cm")] } # computing mean-centered scores

# grand-mean-centering lv-2 continuous predictors
for(Var in c("WHLSM.cm")){ cleanSD[,paste0(Var,".gmc")] <- cleanSD[,Var] - mean(wide[,Var]) }

# showing data
cleanSD[1:3,] # first three rows


3.3.2. Model fit

Here, we fit the multilevel models to the selected data using the default restricted maximum likelihood estimator (REML).

# m0: null model
m0_SD <- lmer(SD ~ (1|ID), # only fixed and random intercept + residual term
              data=cleanSD)

# m1: covariates
m1_SD <- lmer(SD ~ gender + PD.mc + WHLSM.cm.gmc + (1|ID), # covariates
              data=cleanSD)

# m2: state workaholism
m2_SD <- lmer(SD ~ gender + PD.mc + WHLSM.cm.gmc + WHLSM.mc + (1|ID),
              data=cleanSD)

# m3: interaction
m3_SD <- lmer(SD ~ gender + PD.mc + WHLSM.cm.gmc + WHLSM.mc + WHLSM.mc + WHLSM.mc:PD.mc + (1|ID), 
              data=cleanSD)


From the previous chunk, we see that all models converged without problems. Here, we inspect the diagnostics (i.e., normality of residual and random effect distributions, homoscedasticity, and multicollinearity) of the most complex model m3. Influential cases are analyzed in a dedicated section below.

Model m3 shows some deviation from normality especially in the lower tail of the residual distribution and both tails of random effects, although deviation from normality is slightly less marked than in model m2. Besides that, we can see that the homoscedsticity assumption holds and that none of the variance inflation factors (VIFs) shows extreme values, ruling out the risk of multicollinearity.

# normality and homoscedasticity
p <- plot_model(m3_SD,type="diag",dot.size=1) 
p[[2]] <- p[[2]]$ID
plot_grid(p,tags=TRUE,margin=c(0,0,0,0))

# homoscedasticity and multicollinearity
par(mfrow=c(1,2)) 
for(Var in c("gender")){ boxplot(resid(m3_SD) ~ cleanSD[,Var],main=paste("Residuals by",Var)) }
barplot(vif(m3_SD),main="VIF Values",xlim=c(0,10),las=2,horiz=TRUE) # variance inflation factors (VIFs)
abline(v = 5, lwd = 5, lty = 2)


Here, we better inspect the residual distribution and the fit of models specified with alternative family distributions. We can see that alternative families might better approximate the distribution of model residuals, with the log-normal solution (i.e., normal distribution with logarithmic link function) showing the best fit. Yet, it is not so better than the original model. Thus, we initially rely on the normal distribution and then consider the log-normal solution as a robustness check.

# inspecting residual distribution
descdist(resid(m3_SD)) # best fit for Gamma

## summary statistics
## ------
## min:  -2.821223   max:  4.242021 
## median:  -0.1752208 
## mean:  -1.441861e-15 
## estimated sd:  0.9856311 
## estimated skewness:  0.8569118 
## estimated kurtosis:  4.099986
# fitting model with alternative families
models <- list(
  m3_SD,
  glmer(formula=formula(m3_SD),family=Gamma(link="log"),data=cleanSD), # Gamma with log [FAILS TO CONV, max|grad| = 0.05]
  glmer(formula=formula(m3_SD),family=Gamma(link="identity"),data=cleanSD), # Gamma with identity
  glmer(formula=formula(m3_SD),family=gaussian(link="log"),data=cleanSD), # log-norm
  lmer(formula=as.formula(paste("log(SD) ~",as.character(formula(m3_SD))[3])),data=cleanSD)) # norm log

# normal Q-Q plot of model residuals
par(mfrow=c(1,5))
for(i in 1:length(models)){ 
  qqnorm(resid(models[[i]]),main=c("Norm","Gamma-log","Log-norm","log-transf")[i]); qqline(resid(models[[i]])) }


3.3.3. Results

Here, we compare the specified models based on the Akaike weight and the likelihood ratio test (with type-I error set to p < .05), and we inspect the results of the selected model(s). We can see that the inclusion of both state WHLSM (Aw = .51, \(\chi^2\)(1) = 5.67, p = .01), and its interaction with PD (Aw = .21, \(\chi^2\)(1) = 5.68, p = .02) are associated with stronger evidence (not the interaction) and significantly higher likelihood than the baseline model. Model m3 is selected as the best model.

# Akaike weight adding one model at time
Weights(AIC(m0_SD,m1_SD)) # covariates: better
##  model weights 
## [1] 0.001 0.999
Weights(AIC(m0_SD,m1_SD,m2_SD)) # state workaholism: better
##  model weights 
## [1] 0.000 0.449 0.551
Weights(AIC(m0_SD,m1_SD,m2_SD,m3_SD)) # interaction: worse
##  model weights 
## [1] 0.000 0.364 0.447 0.189
# Likelihood ratio test with m3
anova(m1_SD,m2_SD,m3_SD) # best model is m3
## refitting model(s) with ML (instead of REML)


Here, we inspect the coefficients estimated by the selected model m3 and those estimated by more parsimonious models. We can see that both trait WHLSM.cm.gmc and state WHLSM.mc are positively related to SD. In the selected model, a substantial interaction is shown such that WHLSM.mc is positively related to SD in those working days with lower RDet and RRel. Among the included covariates, gender predict substantial differences in SD, with higher sleep disturbances for females.

# regression table
tab_model(m1_SD,m2_SD,m3_SD,
          dv.labels=c("Baseline","State WHLSM","Interaction"),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,show.ci=FALSE,
          collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Baseline State WHLSM Interaction
Predictors b (SE) t b (SE) t b (SE) t
(Intercept) 2.75
(0.12)
23.77 2.75
(0.12)
23.77 2.75
(0.12)
23.59
gender [M] -0.40
(0.17)
-2.36 -0.40
(0.17)
-2.36 -0.39
(0.17)
-2.34
PD mc -0.03
(0.03)
-0.89 -0.02
(0.03)
-0.67 -0.02
(0.03)
-0.75
WHLSM cm gmc 0.34
(0.06)
5.30 0.34
(0.06)
5.30 0.34
(0.06)
5.24
WHLSM mc 0.11
(0.04)
2.62 0.11
(0.04)
2.59
PD mc × WHLSM mc -0.07
(0.03)
-2.31
Random Effects
σ2 1.13 1.12 1.11
τ00 0.60 ID 0.60 ID 0.61 ID
N 114 ID 114 ID 114 ID
Observations 723 723 723
# plotting main effects from selected model
grid.arrange(plot_model(m3_SD,type="pred",terms="WHLSM.cm.gmc"), # trait WHLSM
             plot_model(m3_SD,type="pred",terms="WHLSM.mc"),nrow=1) # state WHLSM

# plotting interactions
sd(cleanSD$PD.mc) # PD: 1 SD = 1.36
## [1] 1.362052
plot_model(m3_SD,type="pred",terms=c("WHLSM.mc","PD.mc [-1.36,1.36]"))


3.3.4. Influential cases

Here, we evaluate the presence of influential cases in the selected model m3. Specifically, the Cook’s distance is considered as the main measure of individual-level (i.e., participant) influence on the estimated parameters, and it is recomputed by progressively excluding the most influential participants (i.e., based on the rule-of-thumb of 4/N) until all extreme values are removed.

3.3.4.1. Cook’s distance

We can see that participants S132, S049, S079, and S002 are potentially influential cases.

# cook's distance on the whole sample
infl <- influence(m3_SD,"ID")
plot(infl,which="cook",cutoff=4/nlevels(cleanSD$ID),xlab="Cook distance",ylab="ID",sort=TRUE)

# progressively excluding participants
infl <- list(
  influence(exclude.influence(m3_SD,"ID","S132"),"ID"),
  influence(exclude.influence(m3_SD,"ID",c("S132","S049")),"ID"),
  influence(exclude.influence(m3_SD,"ID",c("S132","S049","S079")),"ID"),
  influence(exclude.influence(m3_SD,"ID",c("S132","S049","S079","S002")),"ID"))
for(i in 1:length(infl)){ 
  plot(infl[[i]],which="cook",cutoff=4/(nlevels(cleanSD$ID)-i),xlab="Cook distance",ylab="ID",sort=TRUE) }


3.3.4.2. Coefficient change

Here, we inspect the magnitude of the changes in the estimated coefficients after the removal of potentially influential cases. We can see that the updated model implies an increase in the coefficient estimated for trait WHLSM.cm.gmc and gender, and a decrease in those estimated for the interaction. However, it does not drop far below the cut-off of |t|=2. Thus, we choose to rely on the results obtained with the full sample.

# refitting model without influential cases
m3_SD.noInfl <- update(m3_SD,data=cleanSD[!cleanSD$ID%in%c("S132","S049","S079","S002"),])

# plotting coefficients original vs. updated model
plot_models(m3_SD,m3_SD.noInfl)

# showing regression table original vs. updated model
tab_model(m3_SD,m3_SD.noInfl,dv.labels=c("Original","Updated"),show.icc=FALSE,show.p=FALSE,show.se=TRUE,
          show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)",show.stat=TRUE,string.stat="t")
  Original Updated
Predictors b (SE) CI t b (SE) CI t
(Intercept) 2.75
(0.12)
2.52 – 2.97 23.59 2.78
(0.11)
2.57 – 2.99 26.01
gender [M] -0.39
(0.17)
-0.72 – -0.06 -2.34 -0.49
(0.15)
-0.79 – -0.19 -3.21
PD mc -0.02
(0.03)
-0.08 – 0.03 -0.75 -0.01
(0.03)
-0.07 – 0.05 -0.41
WHLSM cm gmc 0.34
(0.06)
0.21 – 0.47 5.24 0.38
(0.06)
0.26 – 0.50 6.26
WHLSM mc 0.11
(0.04)
0.03 – 0.20 2.59 0.13
(0.04)
0.04 – 0.21 2.85
PD mc × WHLSM mc -0.07
(0.03)
-0.14 – -0.01 -2.31 -0.07
(0.03)
-0.14 – -0.00 -2.08
Random Effects
σ2 1.11 1.08
τ00 0.61 ID 0.45 ID
N 114 ID 110 ID
Observations 723 693


4. Robusness checks

Here, we conduct a series of robustness checks (or multiverse data analysis; see Steegen et al. 2016) for each selected model by using alternative inclusion criteria, models with additional or less covariates, outlier removal, etc. The following packages and functions are used to optimize the analyses.

library(psych)
glmerAn

#' @title Generalized linear (mixed-effects) regression analysis
#' @param modelType = type of model: GLM, mixed-effects (GLMER), or cumulative link mixedm odel (CLMM)
#' @param data = data.frame of data
#' @param resp = name of the response variable (character)
#' @param fix.eff = character vector of names of the predictor(s)
#' @param REML = argument from the lme4::lmer() function, see ?lmer
#' @param ran.eff = character string indicating the random effect by using the lme4 syntax (defult: "(1|ID)")
#' @param family = character string indicating the name of the GLM(ER) family to be used in the models (default: "normal")
#' @param link =character string indicating the name of the GLM(ER) link function to be used in the models (default: "identity")
#' @param nAGQ = argument from the lme4::glmer() function, see ?glmer
#' @param mComp.baseline = character string indicating the name of the last predictor included in the baseline model to be compared with the subsequent models. If equal to NA (defult), the null model is used as the baseline model for comparison
#' @param p.adjust.method = argument from the stats::p.adjust() function (see ?p.adjust) indicating which method should be used to correct the p-values obtained from the likelihood ratio test (default: NA, for no adjustment)
#' @param key.model = character string indicating the name of the predictor(s) whose model(s) should be considered for the "key.res" output
#' @param key.predictor = character string indicating the name of the predictor to be considered by the "key.res" output
#' @param digits = number of digits for all numeric ouputs
#' @param messages = boolean indicating whether a message should be printed for each operation (defult: FALSE)
glmerAn <- function(data,modelType=c("GLMER"),resp,fix.eff,REML=TRUE,ran.eff="(1|ID)",family="normal",
                    link="identity",nAGQ=1,mComp.baseline=NA,p.adjust.method=NA,coeff.models=NA,transform=NULL,
                    plot.model=NA,plot.pred="all",key.model=NA,key.predictor=NA,digits=3,messages=FALSE){ 
  
  if(messages==TRUE){ cat("Running",modelType,"analysis of",resp,"...") }
  
  # modeling .......................................................................................
  
  # creating model formulas
  formulas <- character()
  if(modelType=="GLM"){ ran.eff <- "1" }
  null.f <- paste(resp,"~",ran.eff) # creating null model formula
  for(i in 1:length(fix.eff)){ # creating other formulas
    if(i==1){ formulas[i] <- paste(resp,"~",fix.eff[1]) } else { formulas[i] <- paste(formulas[i-1],"+",fix.eff[i])  }}
  if(modelType%in%c("GLMER","CLMM")){ if(!is.na(ran.eff)){ formulas <- paste(formulas,"+",ran.eff)
      if(substr(ran.eff,2,2)!="1"){ ranSlope <- paste(fix.eff[which(grepl(ran.eff,fix.eff))])[1]
        null.f <- gsub(ranSlope,"1",null.f)  # removing random slope from models without the related predictor
        for(i in 1:length(formulas)){ 
          if(!(grepl(ranSlope,gsub(paste(ranSlope,"[|]",sep=""),"",formulas[i])))){ 
            formulas[i] <- gsub(paste(ranSlope,"[|]",sep=""),"1|",formulas[i]) }}}
    } else { stop(message="Error: GLMER model type without ran.eff specification") }}
  if(messages==TRUE){ cat("\n\nModel specification:\n - model M0 (null):",null.f)
    for(i in 1:length(formulas)){ cat("\n - model M",i,": ",formulas[i],sep="")}}
  
  # fitting models
  models <- list()
  if(modelType=="GLM"){ if(messages==TRUE){ 
    cat("\n\nFitting GLM models of",resp,"on",nrow(data),"participants \n   using the",
        family,"family with the",link,"link function...") }
    if(family=="normal" & link=="identity"){ null.m <- lm(as.formula(null.f),data=data) # normal family
      for(i in 1:length(formulas)){ models[[i]] <- lm(formula=as.formula(formulas[i]),data=data) }
      } else if (family=="gamma") { null.m <- glm(as.formula(null.f),data=data,family=Gamma(link=link),nAGQ=nAGQ) # gamma
        for(i in 1:length(formulas)){ models[[i]] <- glm(formula=as.formula(formulas[i]),data=data,family=Gamma(link=link)) }
        } else if(family=="normal" & link!="identity"){  
          null.m <- glm(as.formula(null.f),data=data,family=gaussian(link=link)) # normal with other link functions
          for(i in 1:length(formulas)){ 
            models[[i]] <- glm(formula=as.formula(formulas[i]),data=data,family=gaussian(link=link)) }
        } else if(family=="binomial"){ 
          null.m <- glm(as.formula(null.f),data=data,family=binomial(link=link)) # logistic regression
          for(i in 1:length(formulas)){ 
            models[[i]] <- glm(formula=as.formula(formulas[i]),data=data,family=binomial(link=link))}
        } else { stop(message="Error: only normal, gamma, and binomial family are allowed, 
                      with identity, inverse, and log link functions") }
  } else if(modelType=="GLMER"){ suppressMessages(suppressWarnings(require(lme4)))
    if(messages==TRUE){ cat("\n\nFitting",modelType,"models of",resp,"on",nrow(data),"observations from",
                            nlevels(as.factor(as.character(data$ID))),"participants \n   using the",family,
                            "family with the",link,"link function using",ifelse(REML==FALSE,"ML","REML"),"estimator...") }
    if(family=="normal" & link=="identity"){ null.m <- lmer(as.formula(null.f),data=data,REML=REML) # normal  identity
      for(i in 1:length(formulas)){ models[[i]] <- lmer(formula=as.formula(formulas[i]),data=data,REML=REML) }
      } else if (family=="gamma") { null.m <- glmer(as.formula(null.f),data=data,family=Gamma(link=link),nAGQ=nAGQ) # gamma
        for(i in 1:length(formulas)){
          models[[i]]<-glmer(formula=as.formula(formulas[i]),data=data,family=Gamma(link=link),nAGQ=nAGQ) }
        } else if(family=="normal" & link!="identity"){ 
          null.m <- glmer(as.formula(null.f),data=data,family=gaussian(link=link),nAGQ=nAGQ) # normal with other links
          for(i in 1:length(formulas)){ models[[i]] <- glmer(formula=as.formula(formulas[i]),data=data,
                                                             family=gaussian(link=link),nAGQ=nAGQ) }
        } else if(family=="binomial"){ 
          null.m <- glmer(as.formula(null.f),data=data,family=binomial(link=link),nAGQ=nAGQ) # logistic
          for(i in 1:length(formulas)){ models[[i]] <- glmer(formula=as.formula(formulas[i]),data=data,
                                                             family=binomial(link=link),nAGQ=nAGQ)}
        } else { stop(message="Error: only normal, logistic, and gamma family are allowed, 
                               with identity, inverse, and log link functions") }
  } else if(modelType=="CLMM"){ suppressMessages(suppressWarnings(require(ordinal))) # cumulative link mixed models
    if(messages==TRUE){ 
      cat("\n\nFitting",modelType,"models of",resp,"on",nrow(data),"observations from",
          nlevels(as.factor(as.character(data$ID))),"participants \n   using Cumulative Link Mixed Models") }
    data[,resp] <- factor(data[,resp],ordered=TRUE) # response variable as ordered factor
    null.m <- suppressWarnings(clmm(as.formula(gsub("~","~ 1 +",null.f)),data=data)) # suppress formula warning (bugged)
    for(i in 1:length(formulas)){ models[[i]] <- suppressWarnings(clmm(formula=as.formula(formulas[i]),data=data,nAGQ=nAGQ)) }
  } else { stop(message="Error: modelType can only be 'GLM', 'GLMER', or 'CLMM'") }
  
  # outputs...............................................................................................................
  if(messages==TRUE){ cat("\n\nGenerating models outputs...") }
  
  # model comparison
    # likelihood ratio test
    if(messages==TRUE){ cat("\n\n - Running likelihood ratio test:") } 
    suppressMessages(suppressWarnings(require(knitr))); suppressMessages(suppressWarnings(require(MuMIn))) 
    m.num <- 1
    if(is.na(mComp.baseline)){ bsl <- null.m  # selecting baseline model
      } else { m.num <- grep(mComp.baseline,fix.eff)[1] + 1
         bsl <- models[[m.num - 1]] }
    if(modelType!="CLMM"){ lrt <- as.data.frame(anova(bsl,models[[m.num]]))
      if(length(models)>m.num){
        for(i in m.num:(length(models)-1)){ lrt <- rbind(lrt,as.data.frame(anova(models[[i]],models[[i+1]]))[2,]) }}
      } else { lrt <- as.data.frame(ordinal:::anova.clm(bsl,models[[m.num]])) # use anova.clm() to avoid env. issue
        if(length(models)>m.num){
          for(i in m.num:(length(models)-1)){ 
            lrt <- rbind(lrt,as.data.frame(ordinal:::anova.clm(models[[i]],models[[i+1]]))[2,]) }}}
    rownames(lrt) <- c(ifelse(is.na(mComp.baseline),"Null model","Baseline"),
                       fix.eff[m.num:length(fix.eff)])
    if(!is.na(p.adjust.method)){ # p-value corrections for multiple comparison
      if(messages==TRUE){ cat(" (applying",p.adjust.method,"p-values correction)")}
      lrt[!is.na(lrt$`Pr(>Chisq)`),"Pr(>Chisq)"] <- p.adjust(lrt[!is.na(lrt$`Pr(>Chisq)`),"Pr(>Chisq)"],
                                                             method=p.adjust.method)  }
    
    # Akaike weights
    AICs <- lrt[1:2,"AIC"] # Akaike weight
    
    # updating key results
    key <- lrt[which(grepl(key.predictor,row.names(lrt))),] # key results
    if(nrow(key)>1){ key <- key[1,] }
    key.results <- data.frame(sig.LRT=key[,ncol(key)]<0.05, # sig.LRT
                              higher.Aw=key$AIC==min(AICs[1:which(AICs==key$AIC)])) # higher.Aw
  
  # estimated parameters from key.model
  modSummary <- summary(models[[which(fix.eff==key.model)]])
  modSummary <- modSummary$coefficients
  if(modelType=="CLMM"){ modSummary <- modSummary[nlevels(data[,resp]):nrow(modSummary),] }
  key <- round(modSummary[which(grepl(key.predictor,row.names(modSummary))),3][1],2) # taking only first coeff for key.results
  key.results <- cbind(key.results,t.196=abs(key)>1.96,t=key)
  
  # returning key results (sig. LRT, Aw higher than previous model, t > 1.96)
  return(key.results) }

glmerMed

#' @title Generalized linear mixed-effects mediation analysis
#' @param data = data.frame of data
#' @param resp = name of the response variable (character)
#' @param treat = name of the treatment variable (character)
#' @param med = name of the mediator variable (character)
#' @param fix.eff = character vector of names of the predictor(s)
#' @param REML = argument from the lme4::lmer() function, see ?lmer
#' @param ran.eff = character string indicating the random effect by using the lme4 syntax (defult: "(1|ID)")
#' @param family = character string indicating the name of the GLM(ER) family to be used in the models (default: "normal")
#' @param link = character string indicating the name of the GLM(ER) link function to be used in the models (default: "identity")
#' @param sims = number of Monte Carlo draws for quasi-Bayesian CI and p-value (default: 1000)
#' @param alpha.level = significance level (default: 0.05)
#' @param noCov = boolean indicating wheter covariates should be considered in the mediation models or not
#' @param messages = boolean indicating whether a message should be printed for each operation (defult: FALSE)
glmerMed <- function(data,resp,treat,med,fix.eff,REML=TRUE,ran.eff="(1|ID)",family="normal",
                     link="identity",sims=1000,alpha.level=0.05,noCov=FALSE,messages=FALSE){ 
  
  library(lme4); library(mediation)
  
  if(messages==TRUE){ cat("Running",modelType,"analysis of",resp,"...") }
  
  # modeling .......................................................................................
  
  # creating model formulas
  mMed.f <- paste(gsub(".mc","",med),"~",fix.eff[1])
  if(length(fix.eff)>1){
    for(i in 2:length(fix.eff)){ mMed.f <- paste(mMed.f,fix.eff[i],sep=" + ") }} # mediator model 
  mOut.f <- paste(gsub(gsub(".mc","",med),resp,mMed.f),med,sep=" + ") # outcome model
  mMed.f <- paste(mMed.f,ran.eff,sep=" + ") # adding random effects
  mOut.f <- paste(mOut.f,ran.eff,sep=" + ")
  
  # fitting models
  if(messages==TRUE){ cat("\n\nFitting GLMR models of",resp,"and",med,"on",nrow(data),"observations from",
                            nlevels(as.factor(as.character(data$ID))),"participants \n   using the",family,
                            "family with the",link,"link function using",ifelse(REML==FALSE,"ML","REML"),"estimator...") }
  if(family=="normal" & link=="identity"){ 
    mMed <- lmer(as.formula(mMed.f),data=data,REML=REML)
    mOut <- lmer(as.formula(mOut.f),data=data,REML=REML)
  } else if(family=="normal" & link!="identity") { 
      mMed <- glmer(as.formula(mMed.f),data=data,REML=REML,family=gaussian(link=link)) 
      mOut <- glmer(as.formula(mOut.f),data=data,REML=REML,family=gaussian(link=link)) 
  } else if(family=="gamma"){
      mMed <- glmer(as.formula(mMed.f),data=data,family=Gamma(link=link)) 
      mOut <- glmer(as.formula(mOut.f),data=data,family=Gamma(link=link))  
  } else { stop(message="Error: only normal, logistic, and gamma family are allowed, 
                               with identity, inverse, and log link functions") }
  
  # mediation analysis
  if(noCov==TRUE){
     medM <- mediation::mediate(model.m=mMed,model.y=mOut,treat=treat,mediator=med, # mediation & output models, treatment & mediator
                 covariates=NULL,boot=FALSE,sims=sims) # quasi-Bayesian confidence intervals
  } else {
    medM <- mediation::mediate(model.m=mMed,model.y=mOut,treat=treat,mediator=med, # mediation & output models, treatment & mediator
                 covariates=data[,fix.eff[fix.eff!=treat]], # covariates
                 boot=FALSE,sims=sims) } # quasi-Bayesian confidence intervals
  
  # returning estimated quasi-Bayesian p-value
  key.results <- data.frame(indirect.p=medM$d.avg.p,ind.p.sig=medM$d.avg.p<alpha.level,
                            direct.p=medM$z.avg.p,ind.p.sig=medM$z.avg.p<alpha.level)
  return(key.results) }


Moreover, since a further robustness check to be implemented for all outcomes is reproducing the analyses with the full sample, we also reprocess the full diary dataset by removing missing responses and mean-centering predictors.

Show code

# afternoon blood pressure
cleanBP_aft_full <- as.data.frame(na.omit(diary[,c("ID","SBP_aft","DBP_aft","gender","age","BMI","WHLSM")])) # listwise del
                                                   
cleanBP_aft_full$ID <- as.factor(as.character(cleanBP_aft_full$ID)) # resetting participant identifier levels
cat(nrow(cleanBP_aft_full),"complete obs from",nlevels(as.factor(as.character(cleanBP_aft_full$ID))),"participants")
## 907 complete obs from 135 participants
for(Var in c("WHLSM")){ # person-mean-centering lv-1 continuous predictors
  cleanBP_aft_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanBP_aft_full$ID),],
                             aggregate(cleanBP_aft_full[,Var],list(cleanBP_aft_full$ID),mean)[,2]) # individual means
  colnames(cleanBP_aft_prelqs_full)[ncol(cleanBP_aft_prelqs_full)] <- paste0(Var,".cm")
  cleanBP_aft_full <- join(cleanBP_aft_full,cleanBP_aft_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
  cleanBP_aft_full[,paste0(Var,".mc")] <- cleanBP_aft_full[,Var] - cleanBP_aft_full[,paste0(Var,".cm")] } # mean-centered
for(Var in c("age","BMI","WHLSM.cm")){ 
  cleanBP_aft_full[,paste0(Var,".gmc")] <- cleanBP_aft_full[,Var] - mean(cleanBP_aft_prelqs_full[,Var]) } # gmc

# evening blood pressure
cleanBP_eve_full <- as.data.frame(na.omit(diary[,c("ID","SBP_eve","DBP_eve","gender","age","BMI", # list-wise deletion
                                                   "WHLSM","PD")]))
cleanBP_eve_full$ID <- as.factor(as.character(cleanBP_eve_full$ID)) # resetting participant identifier levels
cat(nrow(cleanBP_eve_full),"complete obs from",nlevels(as.factor(as.character(cleanBP_eve_full$ID))),"participants")
## 825 complete obs from 134 participants
for(Var in c("WHLSM","PD")){ # person-mean-centering lv-1 continuous predictors
  cleanBP_eve_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanBP_eve_full$ID),],
                             aggregate(cleanBP_eve_full[,Var],list(cleanBP_eve_full$ID),mean)[,2]) # individual means
  colnames(cleanBP_eve_prelqs_full)[ncol(cleanBP_eve_prelqs_full)] <- paste0(Var,".cm")
  cleanBP_eve_full <- join(cleanBP_eve_full,cleanBP_eve_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
  cleanBP_eve_full[,paste0(Var,".mc")] <- cleanBP_eve_full[,Var] - cleanBP_eve_full[,paste0(Var,".cm")] } # mean-centered
for(Var in c("age","BMI","WHLSM.cm")){ 
  cleanBP_eve_full[,paste0(Var,".gmc")] <- cleanBP_eve_full[,Var] - mean(cleanBP_eve[!duplicated(cleanBP_eve$ID),Var]) } # gmc

# afternoon-to-evening blood pressure
cleanBP_med_eve_full <- as.data.frame(na.omit(diary[,c("ID","SBP_aft","DBP_aft","SBP_eve","DBP_eve", # list-wise deletion
                                                       "gender","age","BMI","WHLSM","PD")])) 
cleanBP_med_eve_full$ID <- as.factor(as.character(cleanBP_med_eve_full$ID)) 
wide <- cleanBP_med_eve_full[!duplicated(cleanBP_med_eve_full$ID),] 
for(Var in c("WHLSM","PD","SBP_aft","DBP_aft")){
  wide <- cbind(wide,aggregate(cleanBP_med_eve_full[,Var],list(cleanBP_med_eve_full$ID),mean)[,2]) 
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanBP_med_eve_full <- join(cleanBP_med_eve_full,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") 
  cleanBP_med_eve_full[,paste0(Var,".mc")] <- cleanBP_med_eve_full[,Var] - cleanBP_med_eve_full[,paste0(Var,".cm")] } 
for(Var in c("age","BMI","WHLSM.cm")){ cleanBP_med_eve_full[,paste0(Var,".gmc")] <- 
  cleanBP_med_eve_full[,Var] - mean(wide[,Var]) } # gmc
cat("Considering",nrow(cleanBP_med_eve_full),"complete obs from",
    nlevels(as.factor(as.character(cleanBP_med_eve_full$ID))),"participants")
## Considering 820 complete obs from 134 participants
# emotional exhaustion
cleanEE_full <- as.data.frame(na.omit(diary[,c("ID","EE","gender","PD","WHLSM")])) # listwise deletion
cleanEE_full$ID <- as.factor(as.character(cleanEE_full$ID)) # resetting participant identifier levels
cat(nrow(cleanEE_full),"complete obs from",nlevels(as.factor(as.character(cleanEE_full$ID))),"participants")
## 827 complete obs from 134 participants
for(Var in c("PD","WHLSM")){ # person-mean-centering lv-1 continuous predictors
  clean_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanEE_full$ID),],
                             aggregate(cleanEE_full[,Var],list(cleanEE_full$ID),mean)[,2]) # individual means
  colnames(clean_prelqs_full)[ncol(clean_prelqs_full)] <- paste0(Var,".cm")
  cleanEE_full <- join(cleanEE_full,clean_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
  cleanEE_full[,paste0(Var,".mc")] <- cleanEE_full[,Var] - cleanEE_full[,paste0(Var,".cm")] } # mean-centered scores
for(Var in c("WHLSM.cm")){ cleanEE_full[,paste0(Var,".gmc")] <- cleanEE_full[,Var] - mean(cleanEE_full[,Var]) } # gmc

# sleep disturbances
cleanSD_full <- as.data.frame(na.omit(diary[,c("ID","SD","gender","dailyHassles_eve","PD","WHLSM")])) # listwise del
cleanSD_full$ID <- as.factor(as.character(cleanSD_full$ID)) # resetting participant identifier levels
cat(nrow(cleanSD_full),"complete obs from",nlevels(as.factor(as.character(cleanSD_full$ID))),"participants")
## 753 complete obs from 132 participants
for(Var in c("PD","WHLSM")){ # person-mean-centering lv-1 continuous predictors
  clean_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanSD_full$ID),],
                             aggregate(cleanSD_full[,Var],list(cleanSD_full$ID),mean)[,2]) # individual means
  colnames(clean_prelqs_full)[ncol(clean_prelqs_full)] <- paste0(Var,".cm")
  cleanSD_full <- join(cleanSD_full,clean_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
  cleanSD_full[,paste0(Var,".mc")] <- cleanSD_full[,Var] - cleanSD_full[,paste0(Var,".cm")] } # mean-centered scores
for(Var in c("WHLSM.cm")){ cleanSD_full[,paste0(Var,".gmc")] <- cleanSD_full[,Var] - mean(cleanSD_full[,Var]) } # gmc


As a further check, we include position as an additional covariate, which we recode into two levels, namely “Employee/Project” vs. “Managers/Employers”.

cleanBP_aft$position <- as.factor(gsub("Employee","employee/project",
                                       gsub("Project","employee/project",cleanBP_aft$position)))
cleanBP_eve$position <- as.factor(gsub("Employee","employee/project",
                                       gsub("Project","employee/project",cleanBP_eve$position)))
cleanBP_med_eve$position <- as.factor(gsub("Employee","employee/project",
                                       gsub("Project","employee/project",cleanBP_med_eve$position)))
cleanEE$position <- as.factor(gsub("Employee","employee/project",
                                       gsub("Project","employee/project",cleanEE$position)))
cleanSD$position <- as.factor(gsub("Employee","employee/project",
                                       gsub("Project","employee/project",cleanSD$position)))


Finally, we load the raw preliminary questionnaire item scores to compute the composite score at the retrospective version of the DUWAS, used for a robustness check.

# isolating raw item scores at the retrospective DUWAS scale
prelqs.retroWHLSM <- prelqs[,c("ID",paste0("duwas",1:10))]
prelqs.retroWHLSM <- prelqs.retroWHLSM[prelqs.retroWHLSM$ID %in% clean$ID,] # subsampling participants included in the clean dataset
prelqs.retroWHLSM$ID <- as.factor(as.character(prelqs.retroWHLSM$ID))
cat("Included participants =",nlevels(prelqs.retroWHLSM$ID))
## Included participants = 114
# computing Cronbach's alpha and 95% CI
psych::alpha(prelqs.retroWHLSM[,paste0("duwas",1:10)])$feldt
## 
##    95% confidence boundaries (Feldt)
##  lower alpha upper
##   0.74   0.8  0.85
# computing grand-mean-centered composite score and adding it to all datasets used below
prelqs.retroWHLSM$WHLSM.retro <- apply(prelqs.retroWHLSM[,paste0("duwas",1:10)],1,mean)
cleanBP_aft <- plyr::join(cleanBP_aft,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanBP_aft$WHLSM.retro.gmc <- cleanBP_aft$WHLSM.retro - mean(cleanBP_aft$WHLSM.retro)
cleanBP_eve <- plyr::join(cleanBP_eve,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanBP_eve$WHLSM.retro.gmc <- cleanBP_eve$WHLSM.retro - mean(cleanBP_eve$WHLSM.retro)
cleanBP_med_eve <- plyr::join(cleanBP_med_eve,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanBP_med_eve$WHLSM.retro.gmc <- cleanBP_med_eve$WHLSM.retro - mean(cleanBP_med_eve$WHLSM.retro)
cleanEE <- plyr::join(cleanEE,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanEE$WHLSM.retro.gmc <- cleanEE$WHLSM.retro - mean(cleanEE$WHLSM.retro)
cleanSD <- plyr::join(cleanSD,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanSD$WHLSM.retro.gmc <- cleanSD$WHLSM.retro - mean(cleanSD$WHLSM.retro)


4.1. Blood pressure

4.1.1. Afternoon BP

For afternoon blood pressure, we implement the following robustness checks:

  1. No Infl: we remove influential participants

  2. No dysf/drugs: we remove all participants reporting sleep dysfunctions, hormonal or psychoactive medications, in addition to those meeting exclusion criteria for blood pressure

  3. No Cov: we remove all covariates, that is we only include WHLSM.mc and its interactions as model predictors

  4. All in: we include all complete observations from all participants, including those meeting the exclusion criteria for compliance and blood pressure

  5. ML: we refit the models by using the Maximum Likelihood estimator, rather than the Restricted Maximum Likelihood

  6. Rand slope: we include the random slope for WHLSM.mc

  7. logTransf: we log-transform the response variable values before fitting the models

  8. confounders_aft: we include potentially confounding factors for blood pressure (e.g., smoking, physical activity) reported in the afternoon as an additional control variable

  9. position: we include job position (Employee/Project vs. Manager/(Self-)Employer) as an additional control variable

  10. children: we include the number of children as an additional control variable

  11. No flagBP: we exclude all observations that were reprocessed due to extreme BP values (see Supplementary Material S3)

  12. No flagTime: we exclude all observations that were flagged due to their associated timing (e.g., morning BP recorded in the afternoon) (see Supplementary Material S3)

  13. No careless: we exclude one participant S137 flagged as potentially careless (see Supplementary Material S3).

  14. WE: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  15. WC: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  16. WHLSM retro: we replace the predictor term for trait workaholism with the composite score at the retrospective version of the DUWAS included in the preliminary questionnaire.


In all cases, the results are consistent with those reported in the main analyses, showing substantial contribution and main effect of state WHLSM.mc.

SBP_aft

checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","logTransf",
            "confounders_aft","position","children","No flagBP","No flagTime","No careless","WE","WC","WHLSM retro")

# main effect of WHLSM.mc
predictors <- c("gender","age.gmc","BMI.gmc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "SBP_aft" # response variable
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[!cleanBP_aft$ID%in%c("S096","S082"),], # without influential
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_aft$psy_drugs=="No" & cleanBP_aft$psy_drugs=="No",], 
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c("WHLSM.mc"), # without covariates
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft_full,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanBP_aft,resp="log(SBP_aft)",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-transf
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"confounders_aft", # adding confounders_aft
                                                      predictors[4:length(predictors)]), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"position", # adding position
                                                      predictors[4:length(predictors)]), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"children", # adding children
                                                      predictors[4:length(predictors)]), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$flagBP_aft==FALSE,], # without flagged BP
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$flagTime==FALSE,], # without flagged times
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$careless==FALSE,], # without careless participant
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excess
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM retro
                    mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc")))
kable(p)
check sig.LRT higher.Aw t.196 t
Original TRUE TRUE TRUE 3.90
No Infl TRUE TRUE TRUE 3.08
No dysf/drugs TRUE TRUE TRUE 3.33
No Cov TRUE TRUE TRUE 3.90
All in TRUE TRUE TRUE 3.43
ML TRUE TRUE TRUE 3.90
Rand slope TRUE TRUE TRUE 3.61
logTransf TRUE TRUE TRUE 3.68
confounders_aft TRUE TRUE TRUE 3.91
position TRUE TRUE TRUE 3.90
children TRUE TRUE TRUE 3.90
No flagBP TRUE TRUE TRUE 3.80
No flagTime TRUE TRUE TRUE 3.88
No careless TRUE TRUE TRUE 3.93
WE TRUE TRUE TRUE 3.75
WC TRUE TRUE TRUE 3.26
WHLSM retro TRUE TRUE TRUE 3.90


DBP_aft

checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","logTransf",
            "confounders_aft","position","children","No flagBP","No flagTime","No careless","WE","WC","WHLSM retro")

# main effect of WHLSM.mc
predictors <- c("gender","age.gmc","BMI.gmc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "DBP_aft" # response variable
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[!cleanBP_aft$ID%in%c("S082"),], # without influential
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_aft$psy_drugs=="No" & cleanBP_aft$psy_drugs=="No",], 
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c("WHLSM.mc"), # without covariates
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft_full,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanBP_aft,resp="log(SBP_aft)",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-transf
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"confounders_aft", # adding confounders_aft
                                                      predictors[4:length(predictors)]), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"position", # adding position
                                                      predictors[4:length(predictors)]), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"children", # adding children
                                                      predictors[4:length(predictors)]), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$flagBP_aft==FALSE,], # without flagged BP
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$flagTime==FALSE,], # without flagged times
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft[cleanBP_aft$careless==FALSE,], # without careless
                    resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excess
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), 
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
            glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), 
                    mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc")))
kable(p)
check sig.LRT higher.Aw t.196 t
Original TRUE TRUE TRUE 3.74
No Infl TRUE TRUE TRUE 3.45
No dysf/drugs TRUE TRUE TRUE 3.96
No Cov TRUE TRUE TRUE 3.74
All in TRUE TRUE TRUE 3.17
ML TRUE TRUE TRUE 3.74
Rand slope TRUE TRUE TRUE 3.56
logTransf TRUE TRUE TRUE 3.68
confounders_aft TRUE TRUE TRUE 3.73
position TRUE TRUE TRUE 3.74
children TRUE TRUE TRUE 3.74
No flagBP TRUE TRUE TRUE 3.20
No flagTime TRUE TRUE TRUE 3.72
No careless TRUE TRUE TRUE 3.79
WE TRUE TRUE TRUE 3.45
WC TRUE TRUE TRUE 3.27
WHLSM retro TRUE TRUE TRUE 3.74


4.1.2. Evening BP

For evening blood pressure, we implement the following robustness checks:

  1. No Infl: we remove influential participants

  2. No dysf/drugs: we remove all participants reporting sleep dysfunctions, hormonal or psychoactive medications, in addition to those meeting exclusion criteria for blood pressure

  3. No Cov: we remove all covariates, that is we only include WHLSM.mc and its interactions as model predictors

  4. All in: we include all complete observations from all participants, including those meeting the exclusion criteria for compliance and blood pressure

  5. ML: we refit the models by using the Maximum Likelihood estimator, rather than the Restricted Maximum Likelihood

  6. Rand slope: we include the random slope for WHLSM.mc

  7. logTransf: we log-transform the response variable values before fitting the models

  8. confounders_eve: we include potentially confounding factors for blood pressure (e.g., smoking, physical activity) reported in the afternoon as an additional control variable

  9. position: we include job position (Employee/Project vs. Manager/(Self-)Employer) as an additional control variable

  10. children: we include the number of children as an additional control variable

  11. No flagBP: we exclude all observations that were reprocessed due to extreme BP values (see Supplementary Material S3)

  12. No flagTime: we exclude all observations that were flagged due to their associated timing (e.g., morning BP recorded in the afternoon) (see Supplementary Material S3)

  13. No careless: we exclude one participant S137 flagged as potentially careless (see Supplementary Material S3)

  14. day1: we include recording day as a further covariate (i.e., 1 = first day, 2 = any other day). In all cases, the results are consistent with those reported in the main analyses, showing no substantial contribution and main effect of state WHLSM.mc.

  15. WE: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  16. WC: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  17. WHLSM retro: we replace the predictor term for trait workaholism with the composite score at the retrospective version of the DUWAS included in the preliminary questionnaire.

# setting robustness checks
checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","logTransf",
            "confounders_eve","position","children","No flagBP","No flagTime","No careless","day1",
            "WE","WC","WHLSM retro")

# creating categorical variable day1 (i.e., first day vs. all other days)
cleanBP_eve$day1 <- 0 
cleanBP_eve[cleanBP_eve$day==1,"day1"] <- 1
cleanBP_eve$day1 <- as.factor(cleanBP_eve$day1)


In all cases, the results are consistent with those reported in the main analyses, showing no substantial contribution or main effect of state WHLSM.mc (only substantial in a few cases for DBP_eve) and no substantial interactions with psychological detachment.

MAIN EFFECT

SBP_eve
predictors <- c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "SBP_eve" # response variable
key <- "WHLSM.mc" # key model and key predictor
bsl <- "WHLSM.cm.gmc" # baseline model
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # original
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S096"),], # without influential
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",], 
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("WHLSM.mc"), # without covariates
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
                    key.predictor=key,key.model=key,REML=FALSE),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope (SINGULAR FIT)
                    key.predictor=key,key.model=key,ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanBP_eve,resp="log(SBP_eve)",fix.eff=predictors,mComp.baseline=bsl, # log-transf
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"confounders_eve", # adding confounders_eve
              predictors[6:length(predictors)]),mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"position", # adding position
              predictors[6:length(predictors)]),mComp.baseline="position",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"children", # adding children
              predictors[6:length(predictors)]),mComp.baseline="children",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"day1",predictors[6:length(predictors)]), # adding day
                    mComp.baseline="day1",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
                    mComp.baseline=bsl,key.predictor="WE.mc",key.model="WE.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
                    mComp.baseline=bsl,key.predictor="WC.mc",key.model="WC.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM retro
                    mComp.baseline="WHLSM.retro.gmc",key.predictor=key,key.model=key)))
kable(p)
check sig.LRT higher.Aw t.196 t
Original FALSE FALSE FALSE 0.76
No Infl FALSE FALSE FALSE 0.39
No dysf/drugs FALSE FALSE FALSE 0.48
No Cov FALSE FALSE FALSE 1.05
All in FALSE FALSE FALSE 0.92
ML FALSE FALSE FALSE 0.76
Rand slope FALSE FALSE FALSE 0.81
logTransf FALSE FALSE FALSE 0.51
confounders_eve FALSE FALSE FALSE 0.76
position FALSE FALSE FALSE 0.76
children FALSE FALSE FALSE 0.76
No flagBP FALSE FALSE FALSE 0.52
No flagTime FALSE FALSE FALSE 0.65
No careless FALSE FALSE FALSE 0.84
day1 FALSE FALSE FALSE 1.04
WE FALSE FALSE FALSE 0.37
WC FALSE FALSE FALSE 1.02
WHLSM retro FALSE FALSE FALSE 0.76


DBP_eve
r <- "DBP_eve" # response variable
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key), # original
            glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S080"),], # without influential
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",], 
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("WHLSM.mc"),key.predictor=key,key.model=key), # without covariates
            glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
                    key.predictor=key,key.model=key,REML=FALSE),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp="log(DBP_eve)",fix.eff=predictors,mComp.baseline=bsl, # Gamma log
                    key.predictor=key,key.model=key,family="gamma",link="log"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"confounders_eve", # adding confounders_eve
              predictors[6:length(predictors)]),mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"position", # adding position
              predictors[6:length(predictors)]),mComp.baseline="position",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"children", # adding children
              predictors[6:length(predictors)]),mComp.baseline="children",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless participants
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"day1",predictors[6:length(predictors)]), # adding day
                    mComp.baseline="day1",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
                    mComp.baseline=bsl,key.predictor="WE.mc",key.model="WE.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
                    mComp.baseline=bsl,key.predictor="WC.mc",key.model="WC.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), 
                    mComp.baseline="WHLSM.retro.gmc",key.predictor=key,key.model=key)))
kable(p)
check sig.LRT higher.Aw t.196 t
Original FALSE TRUE FALSE 1.95
No Infl TRUE TRUE TRUE 2.06
No dysf/drugs FALSE TRUE FALSE 1.44
No Cov TRUE TRUE TRUE 2.04
All in FALSE TRUE FALSE 1.64
ML FALSE TRUE FALSE 1.96
Rand slope FALSE TRUE FALSE 1.95
logTransf FALSE TRUE FALSE 1.72
confounders_eve FALSE TRUE FALSE 1.93
position FALSE TRUE FALSE 1.95
children FALSE TRUE FALSE 1.95
No flagBP TRUE TRUE TRUE 2.04
No flagTime TRUE TRUE TRUE 2.02
No careless FALSE TRUE FALSE 1.93
day1 TRUE TRUE TRUE 2.29
WE FALSE TRUE FALSE 1.87
WC FALSE TRUE FALSE 1.65
WHLSM retro FALSE TRUE FALSE 1.95


INTERACTION

SBP_eve
# interaction with RDet.mc
r <- "SBP_eve"
predictors <- c(predictors,"PD.mc:WHLSM.mc") # predictors
key <- "PD.mc:WHLSM.mc" # key model and key predictor
bsl <- "WHLSM.mc" # baseline model
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # original
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S096","S082"),], # without influential
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",], 
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
                    mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
                    key.predictor=key,key.model=key,REML=FALSE),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope (SINGULAR FIT)
                    key.predictor=key,key.model=key,ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanBP_eve,resp="log(SBP_eve)",fix.eff=predictors,mComp.baseline=bsl, # log-transf
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"confounders_eve", # adding confounders_eve
                                                      predictors[7:length(predictors)]),
                    mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"position", # adding position
                                                     predictors[7:length(predictors)]),
                    mComp.baseline="position",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"children", # adding children
                                                     predictors[7:length(predictors)]),
                    mComp.baseline="children",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless participant
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"day1",predictors[7:length(predictors)]), # adding day
                    mComp.baseline="day1",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
                    mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
                    mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),  # WHLSM.retro
                    mComp.baseline=bsl,key.predictor=key,key.model=key)))
kable(p)
check sig.LRT higher.Aw t.196 t
Original FALSE FALSE FALSE 0.80
No Infl FALSE FALSE FALSE 0.58
No dysf/drugs FALSE FALSE FALSE 0.95
No Cov FALSE TRUE FALSE 1.46
All in FALSE FALSE FALSE 0.85
ML FALSE FALSE FALSE 0.81
Rand slope FALSE FALSE FALSE 0.69
logTransf FALSE FALSE FALSE 0.91
confounders_eve FALSE FALSE FALSE 0.79
position FALSE FALSE FALSE 0.79
children FALSE FALSE FALSE 0.80
No flagBP FALSE FALSE FALSE 0.51
No flagTime FALSE FALSE FALSE 1.04
No careless FALSE FALSE FALSE 0.82
day1 FALSE FALSE FALSE 0.72
WE FALSE FALSE FALSE 1.05
WC FALSE FALSE FALSE 0.38
WHLSM retro FALSE FALSE FALSE 0.79


DBP_eve
r <- "DBP_eve"
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # original
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S096","S080"),], # without influential
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria (SINGULAR FIT)
                                       cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",], 
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
                    mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
                    key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
                    key.predictor=key,key.model=key,REML=FALSE),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope
                    key.predictor=key,key.model=key,ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanBP_eve,resp="DBP_eve",fix.eff=predictors,mComp.baseline=bsl, # Gamma log
                    key.predictor=key,key.model=key,family="gamma",link="log"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"confounders_eve", # adding confounders_eve
                                                      predictors[7:length(predictors)]),
                    mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"position", # adding position
                                                      predictors[7:length(predictors)]),
                    mComp.baseline="position",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"children", # adding children
                                                      predictors[7:length(predictors)]),
                    mComp.baseline="children",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless
                    resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"day1",predictors[7:length(predictors)]), # adding day
                    mComp.baseline="day1",key.predictor=key,key.model=key),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
                    mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
                    mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"),
            glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM.retro
                    mComp.baseline=bsl,key.predictor=key,key.model=key)))
kable(p)
check sig.LRT higher.Aw t.196 t
Original FALSE FALSE FALSE 0.01
No Infl FALSE FALSE FALSE -0.01
No dysf/drugs FALSE FALSE FALSE 0.52
No Cov FALSE FALSE FALSE 0.10
All in FALSE FALSE FALSE 0.63
ML FALSE FALSE FALSE 0.01
Rand slope FALSE FALSE FALSE -0.10
logTransf FALSE FALSE FALSE -0.09
confounders_eve FALSE FALSE FALSE -0.04
position FALSE FALSE FALSE -0.01
children FALSE FALSE FALSE 0.02
No flagBP FALSE FALSE FALSE 0.22
No flagTime FALSE FALSE FALSE 0.05
No careless FALSE FALSE FALSE 0.05
day1 FALSE FALSE FALSE -0.09
WE FALSE FALSE FALSE 0.14
WC FALSE FALSE FALSE -0.13
WHLSM retro FALSE FALSE FALSE 0.02


4.1.3. Mediations

For Afternoon-to-Evening mediations, we implement the following robustness checks:

  1. No Infl: we remove all influential participants found for afternoon and evening BP

  2. No dysf/drugs: we remove all participants reporting sleep dysfunctions, hormonal or psychoactive medications, in addition to those meeting exclusion criteria for blood pressure

  3. No Cov: we remove all covariates, that is we only include WHLSM.mc and its interactions as model predictors

  4. All in: we include all complete observations from all participants, including those meeting the exclusion criteria for compliance and blood pressure

  5. ML: we refit the models by using the Maximum Likelihood estimator, rather than the Restricted Maximum Likelihood

  6. Rand slope: we include the random slope for WHLSM.mc

  7. log-transf: we log-transform blood pressure before fitting the models

  8. confounders: we include potentially confounding factors for blood pressure (e.g., smoking, physical activity) reported in the afternoon or in the evening as an additional control variable

  9. position: we include job position (Employee/Project vs. Manager/(Self-)Employer) as an additional control variable

  10. children: we include the number of children as an additional control variable

  11. No flagBP: we exclude all observations that were reprocessed due to extreme BP values either in the afternoon or in the evening (see Supplementary Material S3); morning flagged cases are not considered to avoid loosing too many observations

  12. No flagTime: we exclude all observations that were flagged due to their associated timing (e.g., morning BP recorded in the afternoon) (see Supplementary Material S3)

  13. No careless: we exclude one participant S137 flagged as potentially careless (see Supplementary Material S3)

  14. day1: we include recording day as a further covariate (i.e., 1 = first day, 2 = any other day). In all cases, the results are consistent with those reported in the main analyses, showing no substantial contribution and main effect of state WHLSM.mc.

  15. WE: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  16. WC: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  17. WHLSM retro: we replace the predictor term for trait workaholism with the composite score at the retrospective version of the DUWAS included in the preliminary questionnaire.

# setting robustness checks
checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","log-transf",
            "confounders","position","children","No flagBP","No flagTime","No careless","day1",
            "WE","WC","WHLSM.retro")

# recoding variables
cleanBP_med_eve$conf <- FALSE # summary of afternoon and evening confounders
cleanBP_med_eve[cleanBP_med_eve$confounders_aft==TRUE | cleanBP_med_eve$confounders_eve==TRUE,"conf"] <- TRUE
summary(cleanBP_med_eve$conf)
##    Mode   FALSE    TRUE 
## logical     531     186
cleanBP_med_eve$flagBP <- FALSE # summary of afternoon and evening flagBP
cleanBP_med_eve[cleanBP_med_eve$flagBP_aft==TRUE | cleanBP_med_eve$flagBP_eve==TRUE,"flagBP"] <- TRUE
summary(cleanBP_med_eve$flagBP)
##    Mode   FALSE    TRUE 
## logical     701      16
cleanBP_med_eve$day1 <- 0 # creating categorical variable day1 (i.e., first day vs. all other days)
cleanBP_med_eve[cleanBP_med_eve$day==1,"day1"] <- 1
cleanBP_med_eve$day1 <- as.factor(cleanBP_med_eve$day1)
summary(cleanBP_med_eve$day1)
##   0   1 
## 634  83


In all cases, the results for SBP are consistent with those reported in the main analyses, showing significant indirect but not direct relationship between state WHLSM.mc and SBP_eve. Most results for DBP are consistent as well, but the indirect relationship is reduced in one case, i.e., with the removal of participants reporting sleep dysfunctions, hormonal, or psychoactive medications. Similarly, the direct relationship becomes significant with the inclusion of day1 as a covariate. Whereas these findings question the generalizability of such relationship, the high number of consistent robustness checks provides some evidence that the relationship is observable in our sample.

SBP_eve

predictors <- c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "SBP_eve" # response variable
t <- "WHLSM.mc" # key model and key predictor
m <- "SBP_aft.mc"
p <- cbind(check=checks,
      rbind(glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors), # original
            glmerMed(data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),], # without influential cases
                    resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_med_eve$psy_drugs=="No" & cleanBP_med_eve$psy_drugs=="No",], 
                    resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c("WHLSM.mc"),noCov=TRUE), # w/o covariates
            glmerMed(data=cleanBP_med_eve_full,resp=r,treat=t,med=m,fix.eff=predictors), # full sample
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors,REML=FALSE), # maximum likelihood
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors, # random slope (singular fit)
                     ran.eff="(WHLSM.mc|ID)"), 
            glmerMed(data=cleanBP_med_eve,resp="log(SBP_eve)",treat=t,med=m,fix.eff=predictors), # log transformation
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"conf", # adding confounders
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"position", # adding position
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"children", # adding children
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagBP==FALSE,], # without flagged BP cases
                     resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagTime==FALSE,], # without flagged times
                     resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$careless==FALSE,], # without careless participants
                     resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"day1", # adding day
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve,resp=r,treat="WE.mc",med=m,
                     fix.eff=gsub("WHLSM.mc","WE.mc",predictors)), # working excessively
            glmerMed(data=cleanBP_med_eve,resp=r,treat="WC.mc",med=m,
                     fix.eff=gsub("WHLSM.mc","WC.mc",predictors)), # working compulsively
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,
                     fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro",predictors)))) # WHLSM retro
kable(p)
check indirect.p ind.p.sig direct.p ind.p.sig.1
Original 0.002 TRUE 0.748 FALSE
No Infl 0.026 TRUE 0.966 FALSE
No dysf/drugs 0.010 TRUE 0.926 FALSE
No Cov 0.002 TRUE 0.634 FALSE
All in 0.000 TRUE 0.630 FALSE
ML 0.000 TRUE 0.762 FALSE
Rand slope 0.010 TRUE 0.684 FALSE
log-transf 0.000 TRUE 0.970 FALSE
confounders 0.000 TRUE 0.762 FALSE
position 0.006 TRUE 0.826 FALSE
children 0.000 TRUE 0.784 FALSE
No flagBP 0.004 TRUE 0.942 FALSE
No flagTime 0.002 TRUE 0.910 FALSE
No careless 0.000 TRUE 0.744 FALSE
day1 0.002 TRUE 0.598 FALSE
WE 0.006 TRUE 0.922 FALSE
WC 0.012 TRUE 0.534 FALSE
WHLSM.retro 0.002 TRUE 0.796 FALSE


DBP_eve

r <- "DBP_eve" # response variable
p <- cbind(check=checks,
      rbind(glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors), # original
            glmerMed(data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),], # without influential cases
                    resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
                                       cleanBP_med_eve$psy_drugs=="No" & cleanBP_med_eve$psy_drugs=="No",], 
                    resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c("WHLSM.mc"),noCov=TRUE), # w/o covariates
            glmerMed(data=cleanBP_med_eve_full,resp=r,treat=t,med=m,fix.eff=predictors), # full sample
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors,REML=FALSE), # maximum likelihood
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors, # random slope (singular fit)
                     ran.eff="(WHLSM.mc|ID)"), 
            glmerMed(data=cleanBP_med_eve,resp="log(DBP_eve)",treat=t,med=m,fix.eff=predictors), # log-transformation
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"conf", # adding confounders
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"position", # adding position
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"children", # adding children
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagBP==FALSE,], # without flagged BP cases
                     resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagTime==FALSE,], # without flagged times
                     resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$careless==FALSE,], # without careless participants
                     resp=r,treat=t,med=m,fix.eff=predictors),
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"day1", # adding day
              predictors[6:length(predictors)])),
            glmerMed(data=cleanBP_med_eve,resp=r,treat="WE.mc",med=m,
                     fix.eff=gsub("WHLSM.mc","WE.mc",predictors)), # working excessively
            glmerMed(data=cleanBP_med_eve,resp=r,treat="WC.mc",med=m,
                     fix.eff=gsub("WHLSM.mc","WC.mc",predictors)), # working compulsively
            glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,
                     fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors)))) # WHLSM retro
kable(p)
check indirect.p ind.p.sig direct.p ind.p.sig.1
Original 0.012 TRUE 0.080 FALSE
No Infl 0.024 TRUE 0.064 FALSE
No dysf/drugs 0.142 FALSE 0.214 FALSE
No Cov 0.018 TRUE 0.082 FALSE
All in 0.006 TRUE 0.198 FALSE
ML 0.012 TRUE 0.082 FALSE
Rand slope 0.034 TRUE 0.112 FALSE
log-transf 0.020 TRUE 0.138 FALSE
confounders 0.020 TRUE 0.108 FALSE
position 0.016 TRUE 0.070 FALSE
children 0.014 TRUE 0.094 FALSE
No flagBP 0.034 TRUE 0.068 FALSE
No flagTime 0.026 TRUE 0.076 FALSE
No careless 0.016 TRUE 0.082 FALSE
day1 0.028 TRUE 0.042 TRUE
WE 0.016 TRUE 0.100 FALSE
WC 0.020 TRUE 0.176 FALSE
WHLSM.retro 0.012 TRUE 0.084 FALSE


4.2. Emotional Exhaustion

For emotional exhaustion, we implement the following robustness checks:

  1. No Infl: we remove influential participants

  2. No Cov: we remove all covariates, that is we only include WHLSM.mc and its interactions as model predictors

  3. All in: we include all complete observations from all participants, including those meeting the exclusion criteria for compliance and blood pressure

  4. ML: we refit the models by using the Maximum Likelihood estimator, rather than the Restricted Maximum Likelihood

  5. Rand slope: we include the random slope for WHLSM.mc

  6. Gamma-log: we refit the models using the Gamma family with the logarithmic link function

  7. logNorm: we refit the models with using log-normal GLM

  8. position: we include job position (Employee/Project vs. Manager/(Self-)Employer) as an additional control variable

  9. children: we include the number of children as an additional control variable

  10. No flagTime: we exclude all observations that were flagged due to their associated timing (e.g., morning BP recorded in the afternoon) (see Supplementary Material S3)

  11. No careless: we exclude one participant S137 flagged as potentially careless (see Supplementary Material S3).

  12. day: we include day as a further continuous covariate (i.e., 1 = first day, 2 = second day, etc.)

  13. WE: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  14. WC: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  15. WHLSM retro: we replace the predictor term for trait workaholism with the composite score at the retrospective version of the DUWAS included in the preliminary questionnaire.

checks <- c("Original","No Infl","No Cov","All in","ML","Rand slope","Gamma-log","logNorm",
            "position","children","No flagTime","No careless","day","WE","WC","WHLSM retro")


In all cases, the results are consistent with those reported in the main analyses, showing substantial contribution and main effect of state WHLSM.mc, but with no substantial interaction with PD.mc (only significant when using the log-normal distribution). Thus, we interpret these findings as a sign of the consistency of the estimated relationship between state WHLSM.mc and EE.

MAIN EFFECT

# main effect of WHLSM.mc
predictors <- c("gender","PD.mc","WHLSM.cm.gmc","WHLSM.mc")
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE[!cleanEE$ID%in%c("S049"),], # without influential
                    resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=c("WHLSM.mc"), # without covariates
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE_full,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # Gamma-log family
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",family="gamma",link="log"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-normal family
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",link="log"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"position", # adding position
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"children", # adding children
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE[cleanEE$flagTime==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", 
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"), # without flagged times
            glmerAn(data=cleanEE[cleanEE$careless==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", 
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"), # without careless participants
            glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1:3],"day",predictors[4:length(predictors)]),
                    mComp.baseline="day",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excessively
            glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
            glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
                    mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"))) # WHLSM retro
kable(p)
check sig.LRT higher.Aw t.196 t
Original TRUE TRUE TRUE 4.67
No Infl TRUE TRUE TRUE 4.67
No Cov TRUE TRUE TRUE 4.88
All in TRUE TRUE TRUE 4.68
ML TRUE TRUE TRUE 4.68
Rand slope TRUE TRUE TRUE 3.88
Gamma-log TRUE TRUE TRUE 4.96
logNorm TRUE TRUE TRUE 4.41
position TRUE TRUE TRUE 4.67
children TRUE TRUE TRUE 4.67
No flagTime TRUE TRUE TRUE 4.60
No careless TRUE TRUE TRUE 4.54
day TRUE TRUE TRUE 4.45
WE TRUE TRUE TRUE 4.37
WC TRUE TRUE TRUE 4.04
WHLSM retro TRUE TRUE TRUE 4.67


INTERACTION

predictors <- c(predictors,"PD.mc:WHLSM.mc")
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # original
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanEE[!cleanEE$ID%in%c("S049"),], # without influential cases
                    resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
                    mComp.baseline="WHLSM.mc", key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanEE_full,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # full sample
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # maximum likelihood
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",REML=FALSE),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # random slope
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # gamma-log family
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",family="gamma",link="log"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # log-normal family
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",link="log"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"position", # adding position
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"children", # adding children
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanEE[cleanEE$flagTime==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # withoug flagged times
            glmerAn(data=cleanEE[cleanEE$careless==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # without careless participant
            glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1:3],"day",predictors[4:length(predictors)]),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # day as covariate
            glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
                    mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"), # working excessively
            glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
                    mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"), # working compulsively
            glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"))) # WHLSM retro
kable(p)
check sig.LRT higher.Aw t.196 t
Original FALSE FALSE FALSE -1.27
No Infl FALSE FALSE FALSE -1.24
No Cov FALSE FALSE FALSE -1.35
All in FALSE FALSE FALSE -1.20
ML FALSE FALSE FALSE -1.27
Rand slope FALSE FALSE FALSE -1.34
Gamma-log FALSE FALSE FALSE -0.62
logNorm FALSE TRUE FALSE -1.51
position FALSE FALSE FALSE -1.28
children FALSE FALSE FALSE -1.25
No flagTime FALSE FALSE FALSE -1.19
No careless FALSE FALSE FALSE -1.31
day FALSE FALSE FALSE -1.24
WE FALSE FALSE FALSE -1.25
WC FALSE FALSE FALSE -1.05
WHLSM retro FALSE FALSE FALSE -1.23


4.3. Sleep disturbances

For sleep disturbances, we implement the following robustness checks:

  1. No Infl: we remove influential participants

  2. No sleepDysf: we remove all participants reporting sleep dysfunctions

  3. No Cov: we remove all covariates, that is we only include WHLSM.mc and its interactions as model predictors

  4. All in: we include all complete observations from all participants, including those meeting the exclusion criteria for compliance and blood pressure

  5. ML: we refit the models by using the Maximum Likelihood estimator, rather than the Restricted Maximum Likelihood

  6. Rand slope: we include the random slope for WHLSM.mc

  7. logNorm: we refit the models with using log-normal GLM

  8. position: we include job position (Employee/Project vs. Manager/(Self-)Employer) as an additional control variable

  9. children: we include the number of children as an additional control variable

  10. No flagTime: we exclude all observations that were flagged due to their associated timing (e.g., morning BP recorded in the afternoon) (see Supplementary Material S3)

  11. No careless: we exclude one participant S137 flagged as potentially careless (see Supplementary Material S3)

  12. WE: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  13. WC: we replace the predictor term for state workaholism with the composite score at the working excessively dimension

  14. WHLSM retro: we replace the predictor term for trait workaholism with the composite score at the retrospective version of the DUWAS included in the preliminary questionnaire

checks <- c("Original","No Infl","No sleepDysf","No Cov","All in","ML","Rand slope","logNorm",
            "position","children","No flagTime","No careless","WE","WC","WHLSM retro")


In all but two cases (i.e., only the interaction but not the main effect of state workaholism is substantial when including the random slope and when using the working compulsively dimension rather than the total state workaholism score), the results are consistent with those reported in the main analyses, showing substantial main effect of state WHLSM.mc and interaction. We interpret these findings as a sign of the consistency of the estimated interactions between WHLSM.mc and PD.mc for SD.

MAIN EFFECT

# main effect of WHLSM.mc
predictors <- c("gender","PD.mc","WHLSM.cm.gmc","WHLSM.mc")
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD[!cleanSD$ID%in%c("S132","S049","S079","S002"),], # without influential
                    resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD[clean$sleep_dysf!="Yes",], # without participants with sleep dysf
                    resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=c("WHLSM.mc"), # without covariates
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD_full,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
            glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-normal family
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc",link="log"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"position", # adding position
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"children", # adding children
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD[cleanSD$flagTime==FALSE,],resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", 
                    key.predictor="WHLSM.mc",key.model="WHLSM.mc"), # without flagged times
            glmerAn(data=cleanSD[cleanSD$careless==FALSE,],resp="SD",fix.eff=predictors,  # without careless
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excessively
            glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
                    mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
            glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
                    mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"))) # WHLSM retro
kable(p)
check sig.LRT higher.Aw t.196 t
Original TRUE TRUE TRUE 2.62
No Infl TRUE TRUE TRUE 2.87
No sleepDysf TRUE TRUE TRUE 2.61
No Cov TRUE TRUE TRUE 2.68
All in TRUE TRUE TRUE 2.79
ML TRUE TRUE TRUE 2.62
Rand slope TRUE TRUE FALSE 1.21
logNorm TRUE TRUE TRUE 3.32
position TRUE TRUE TRUE 2.62
children TRUE TRUE TRUE 2.62
No flagTime TRUE TRUE TRUE 2.77
No careless TRUE TRUE TRUE 2.65
WE TRUE TRUE TRUE 2.77
WC FALSE TRUE FALSE 1.94
WHLSM retro TRUE TRUE TRUE 2.62


INTERACTION

predictors <- c(predictors,"PD.mc:WHLSM.mc")
p <- cbind(check=checks,
      rbind(glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # original
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanSD[!cleanSD$ID%in%c("S132","S049","S079","S002"),], # without influential cases
                    resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanSD[clean$sleep_dysf!="Yes",], # without participants with sleep dysfunctions
                    resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), 
            glmerAn(data=cleanSD,resp="SD",fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
                    mComp.baseline="WHLSM.mc", key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanSD_full,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # full sample
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # maximum likelihood
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",REML=FALSE),
            glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # random slope
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # log-normal family
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",link="log"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"position", # adding position
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"children", # adding children
                                                      predictors[2:length(predictors)]),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
            glmerAn(data=cleanSD[cleanSD$flagTime==FALSE,],resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # withoug flagged times
            glmerAn(data=cleanSD[cleanSD$careless==FALSE,],resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
                    key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # without careless participants
            
            glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
                    mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"), # working excessively
            glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
                    mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"), # working compulsively
            
            glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
                    mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"))) # WHLSM retro
kable(p)
check sig.LRT higher.Aw t.196 t
Original TRUE TRUE TRUE -2.31
No Infl TRUE TRUE TRUE -2.08
No sleepDysf TRUE TRUE TRUE -2.14
No Cov TRUE TRUE TRUE -2.44
All in TRUE TRUE TRUE -2.33
ML TRUE TRUE TRUE -2.31
Rand slope TRUE TRUE TRUE -2.76
logNorm TRUE TRUE TRUE -2.56
position TRUE TRUE TRUE -2.33
children TRUE TRUE TRUE -2.39
No flagTime TRUE TRUE TRUE -2.37
No careless TRUE TRUE TRUE -2.30
WE TRUE TRUE TRUE -1.99
WC TRUE TRUE TRUE -2.23
WHLSM retro TRUE TRUE TRUE -2.29


5. Outputs

Here, we generate and save the regression tables reporting the results estimated by the selected models. For each model, we visualize the unstandardized coefficients (b), the standard error (SE), and the 95% bootstrap confidence intervals computed with 10,000 iterations.

NSIM = 10000

# coefficients afternoon BP
tab_model(m1_SBP_aft,m2_SBP_aft,m1_DBP_aft,m2_DBP_aft,
          dv.labels=paste0(rep(c("SBP_aft_","DBP_aft_"),each=2),c("baseline","WHLSM.mc")),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)")
  SBP_aft_baseline SBP_aft_WHLSM.mc DBP_aft_baseline DBP_aft_WHLSM.mc
Predictors b (SE) CI b (SE) CI b (SE) CI b (SE) CI
(Intercept) 118.25
(1.97)
114.38 – 122.12 118.25
(1.97)
114.38 – 122.12 77.32
(1.46)
74.45 – 80.20 77.32
(1.46)
74.45 – 80.19
gender [M] 5.39
(2.92)
-0.35 – 11.13 5.39
(2.92)
-0.35 – 11.13 -0.38
(2.17)
-4.65 – 3.88 -0.38
(2.17)
-4.65 – 3.88
age gmc 0.41
(0.12)
0.18 – 0.65 0.41
(0.12)
0.18 – 0.65 0.28
(0.09)
0.10 – 0.45 0.28
(0.09)
0.10 – 0.45
BMI gmc 1.10
(0.43)
0.25 – 1.95 1.10
(0.43)
0.25 – 1.95 0.96
(0.32)
0.33 – 1.59 0.96
(0.32)
0.33 – 1.59
WHLSM cm gmc 1.33
(1.14)
-0.91 – 3.57 1.33
(1.14)
-0.91 – 3.57 1.11
(0.85)
-0.55 – 2.77 1.11
(0.85)
-0.55 – 2.77
WHLSM mc 1.56
(0.40)
0.77 – 2.34 1.30
(0.35)
0.61 – 1.98
Random Effects
σ2 108.96 106.74 82.14 80.61
τ00 195.27 ID 195.55 ID 104.48 ID 104.66 ID
N 106 ID 106 ID 106 ID 106 ID
Observations 787 787 787 787
# bootstrap CI SBP_aft
confint.merMod(m1_SBP_aft,parm=3:(length(fixef(m1_SBP_aft))+2),method="boot",nsim=NSIM) # M1
##                    2.5 %      97.5 %
## (Intercept)  114.4396311 121.9985679
## genderM       -0.4483034  11.1027967
## age.gmc        0.1813017   0.6594479
## BMI.gmc        0.2431582   1.9373830
## WHLSM.cm.gmc  -0.9433809   3.5699117
confint.merMod(m2_SBP_aft,parm=3:(length(fixef(m2_SBP_aft))+2),method="boot",nsim=NSIM) # M2
##                    2.5 %      97.5 %
## (Intercept)  114.2751153 122.1679379
## genderM       -0.3637160  11.0986313
## age.gmc        0.1788889   0.6521283
## BMI.gmc        0.2525861   1.9644597
## WHLSM.cm.gmc  -0.8950650   3.5760164
## WHLSM.mc       0.7611169   2.3512745
# bootstrap CI DBP_aft
confint.merMod(m1_DBP_aft,parm=5:(length(fixef(m1_SBP_aft))+2),method="boot",nsim=NSIM) # M1
##                    2.5 %    97.5 %
## age.gmc       0.09865134 0.4548729
## BMI.gmc       0.32664247 1.6065864
## WHLSM.cm.gmc -0.55033958 2.7842322
confint.merMod(m2_DBP_aft,parm=5:(length(fixef(m2_SBP_aft))+2),method="boot",nsim=NSIM) # M2
##                    2.5 %    97.5 %
## age.gmc       0.09754627 0.4569716
## BMI.gmc       0.33492992 1.5929573
## WHLSM.cm.gmc -0.60166092 2.7686367
## WHLSM.mc      0.61872084 1.9673084
# coefficients evening BP
tab_model(m1_SBP_eve,m2_SBP_eve,m3_SBP_eve,m1_DBP_eve,m2_DBP_eve,m3_DBP_eve,
          dv.labels=paste0(rep(c("SBP_eve_","DBP_eve_"),each=3),c("baseline","WHLSM.mc","interaction")),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)")
  SBP_eve_baseline SBP_eve_WHLSM.mc SBP_eve_interaction DBP_eve_baseline DBP_eve_WHLSM.mc DBP_eve_interaction
Predictors b (SE) CI b (SE) CI b (SE) CI b (SE) CI b (SE) CI b (SE) CI
(Intercept) 113.08
(1.87)
109.41 – 116.74 113.08
(1.87)
109.41 – 116.74 113.11
(1.86)
109.45 – 116.77 72.72
(1.45)
69.87 – 75.57 72.72
(1.45)
69.87 – 75.57 72.72
(1.45)
69.87 – 75.57
gender [M] 2.48
(2.76)
-2.94 – 7.91 2.48
(2.76)
-2.94 – 7.91 2.48
(2.76)
-2.94 – 7.90 -1.31
(2.15)
-5.53 – 2.90 -1.31
(2.15)
-5.53 – 2.90 -1.31
(2.15)
-5.53 – 2.90
age gmc 0.33
(0.11)
0.11 – 0.56 0.33
(0.11)
0.11 – 0.56 0.33
(0.11)
0.11 – 0.56 0.27
(0.09)
0.10 – 0.45 0.27
(0.09)
0.10 – 0.45 0.27
(0.09)
0.10 – 0.45
BMI gmc 1.40
(0.41)
0.60 – 2.20 1.40
(0.41)
0.60 – 2.20 1.40
(0.41)
0.60 – 2.20 1.16
(0.32)
0.54 – 1.78 1.16
(0.32)
0.54 – 1.78 1.16
(0.32)
0.54 – 1.78
PD mc -0.82
(0.26)
-1.34 – -0.30 -0.81
(0.27)
-1.33 – -0.28 -0.80
(0.27)
-1.32 – -0.27 -0.23
(0.23)
-0.67 – 0.22 -0.18
(0.23)
-0.63 – 0.26 -0.18
(0.23)
-0.63 – 0.27
WHLSM cm gmc 1.34
(1.06)
-0.75 – 3.43 1.34
(1.06)
-0.75 – 3.43 1.35
(1.06)
-0.74 – 3.44 0.46
(0.83)
-1.17 – 2.08 0.46
(0.83)
-1.17 – 2.08 0.46
(0.83)
-1.17 – 2.08
WHLSM mc 0.31
(0.40)
-0.48 – 1.10 0.31
(0.40)
-0.48 – 1.10 0.67
(0.34)
-0.00 – 1.35 0.67
(0.35)
-0.00 – 1.35
PD mc × WHLSM mc 0.24
(0.30)
-0.35 – 0.84 0.00
(0.26)
-0.51 – 0.51
Random Effects
σ2 96.62 96.69 96.77 71.29 70.97 71.08
τ00 173.03 ID 173.02 ID 172.72 ID 102.38 ID 102.42 ID 102.43 ID
N 106 ID 106 ID 106 ID 106 ID 106 ID 106 ID
Observations 721 721 721 721 721 721
# bootstrap CI SBP_eve
confint.merMod(m1_SBP_eve,parm=3:(length(fixef(m1_SBP_eve))+2),method="boot",nsim=NSIM) # M1
##                    2.5 %      97.5 %
## (Intercept)  109.3702872 116.7234842
## genderM       -2.9454330   7.8981746
## age.gmc        0.1097913   0.5571745
## BMI.gmc        0.5999890   2.2064248
## PD.mc         -1.3406626  -0.2902520
## WHLSM.cm.gmc  -0.7206930   3.4018219
confint.merMod(m2_SBP_eve,parm=3:(length(fixef(m2_SBP_eve))+2),method="boot",nsim=NSIM) # M2
##                    2.5 %      97.5 %
## (Intercept)  109.4134076 116.7476503
## genderM       -3.0751138   7.8695452
## age.gmc        0.1075076   0.5581521
## BMI.gmc        0.6171424   2.2154539
## PD.mc         -1.3317888  -0.2849928
## WHLSM.cm.gmc  -0.7500476   3.4051204
## WHLSM.mc      -0.4803054   1.1170363
confint.merMod(m3_SBP_eve,parm=3:(length(fixef(m3_SBP_eve))+2),method="boot",nsim=NSIM) # M3
##                      2.5 %      97.5 %
## (Intercept)    109.4566260 116.7756009
## genderM         -2.9553584   7.9669292
## age.gmc          0.1057149   0.5509935
## BMI.gmc          0.6006390   2.2148860
## PD.mc           -1.3108674  -0.2817490
## WHLSM.cm.gmc    -0.7116954   3.4393428
## WHLSM.mc        -0.4875876   1.0955268
## PD.mc:WHLSM.mc  -0.3694828   0.8242395
# bootstrap CI DBP_eve
confint.merMod(m1_DBP_eve,parm=3:(length(fixef(m1_DBP_eve))+2),method="boot",nsim=NSIM) # M1
##                    2.5 %     97.5 %
## (Intercept)  69.91707201 75.5146361
## genderM      -5.50157954  2.7837334
## age.gmc       0.09630789  0.4471138
## BMI.gmc       0.52973629  1.7700847
## PD.mc        -0.67887995  0.2252417
## WHLSM.cm.gmc -1.14713308  2.1283198
confint.merMod(m2_DBP_eve,parm=3:(length(fixef(m2_DBP_eve))+2),method="boot",nsim=NSIM) # M2
##                     2.5 %     97.5 %
## (Intercept)  69.899178002 75.5317279
## genderM      -5.468736411  2.9722360
## age.gmc       0.093351817  0.4415851
## BMI.gmc       0.544397214  1.7757014
## PD.mc        -0.629106630  0.2678128
## WHLSM.cm.gmc -1.144785651  2.0667171
## WHLSM.mc      0.005499441  1.3510498
confint.merMod(m3_DBP_eve,parm=3:(length(fixef(m3_DBP_eve))+2),method="boot",nsim=NSIM) # M3
##                       2.5 %     97.5 %
## (Intercept)    69.920946995 75.5180192
## genderM        -5.574241061  2.8625886
## age.gmc         0.091355526  0.4513621
## BMI.gmc         0.535751402  1.7784338
## PD.mc          -0.635938890  0.2680905
## WHLSM.cm.gmc   -1.160080851  2.1024836
## WHLSM.mc        0.004045224  1.3491670
## PD.mc:WHLSM.mc -0.501603579  0.5085815
# coefficients EE and SD
tab_model(m1_EE,m2_EE,m3_EE,m1_SD,m2_SD,m3_SD,
          dv.labels=paste0(rep(c("EE_","SD_"),each=3),c("baseline","WHLSM.mc","interaction")),
          show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)")
  EE_baseline EE_WHLSM.mc EE_interaction SD_baseline SD_WHLSM.mc SD_interaction
Predictors b (SE) CI b (SE) CI b (SE) CI b (SE) CI b (SE) CI b (SE) CI
(Intercept) 3.12
(0.14)
2.84 – 3.40 3.12
(0.14)
2.84 – 3.40 3.12
(0.14)
2.84 – 3.40 2.75
(0.12)
2.53 – 2.98 2.75
(0.12)
2.53 – 2.98 2.75
(0.12)
2.52 – 2.97
gender [M] 0.18
(0.21)
-0.22 – 0.58 0.18
(0.21)
-0.22 – 0.58 0.18
(0.21)
-0.22 – 0.59 -0.40
(0.17)
-0.72 – -0.07 -0.40
(0.17)
-0.72 – -0.07 -0.39
(0.17)
-0.72 – -0.06
PD mc -0.08
(0.03)
-0.14 – -0.03 -0.07
(0.03)
-0.13 – -0.02 -0.07
(0.03)
-0.13 – -0.02 -0.03
(0.03)
-0.08 – 0.03 -0.02
(0.03)
-0.08 – 0.04 -0.02
(0.03)
-0.08 – 0.03
WHLSM cm gmc 0.47
(0.08)
0.31 – 0.62 0.47
(0.08)
0.31 – 0.62 0.47
(0.08)
0.31 – 0.62 0.34
(0.06)
0.22 – 0.47 0.34
(0.06)
0.22 – 0.47 0.34
(0.06)
0.21 – 0.47
WHLSM mc 0.19
(0.04)
0.11 – 0.27 0.19
(0.04)
0.11 – 0.27 0.11
(0.04)
0.03 – 0.20 0.11
(0.04)
0.03 – 0.20
PD mc × WHLSM mc -0.04
(0.03)
-0.10 – 0.02 -0.07
(0.03)
-0.14 – -0.01
Random Effects
σ2 1.09 1.05 1.05 1.13 1.12 1.11
τ00 1.02 ID 1.03 ID 1.03 ID 0.60 ID 0.60 ID 0.61 ID
N 114 ID 114 ID 114 ID 114 ID 114 ID 114 ID
Observations 779 779 779 723 723 723
 # bootstrap CI EE 
confint.merMod(m1_EE,parm=3:(length(fixef(m1_EE))+2),method="boot",nsim=NSIM) # M1
##                   2.5 %      97.5 %
## (Intercept)   2.8422610  3.39941438
## genderM      -0.2250781  0.58615456
## PD.mc        -0.1378132 -0.02884978
## WHLSM.cm.gmc  0.3184584  0.61927262
confint.merMod(m2_EE,parm=3:(length(fixef(m2_EE))+2),method="boot",nsim=NSIM) # M2
##                   2.5 %      97.5 %
## (Intercept)   2.8507944  3.39588003
## genderM      -0.2193533  0.57305636
## PD.mc        -0.1266091 -0.02031197
## WHLSM.cm.gmc  0.3144118  0.62093079
## WHLSM.mc      0.1106096  0.27035420
confint.merMod(m3_EE,parm=3:(length(fixef(m3_EE))+2),method="boot",nsim=NSIM) # M3
##                     2.5 %      97.5 %
## (Intercept)     2.8379755  3.39360531
## genderM        -0.2182741  0.58687388
## PD.mc          -0.1279269 -0.02116087
## WHLSM.cm.gmc    0.3112911  0.62112684
## WHLSM.mc        0.1107532  0.27214145
## PD.mc:WHLSM.mc -0.1006700  0.02035031
# boostrap CI SD
confint.merMod(m1_SD,parm=3:(length(fixef(m1_SD))+2),method="boot",nsim=NSIM) # M1
##                    2.5 %      97.5 %
## (Intercept)   2.52810605  2.97864335
## genderM      -0.71807474 -0.06310848
## PD.mc        -0.08342478  0.03167821
## WHLSM.cm.gmc  0.21660335  0.47118734
confint.merMod(m2_SD,parm=3:(length(fixef(m2_SD))+2),method="boot",nsim=NSIM) # M2
##                    2.5 %      97.5 %
## (Intercept)   2.52515465  2.98227089
## genderM      -0.71688570 -0.06488114
## PD.mc        -0.07701252  0.03833502
## WHLSM.cm.gmc  0.21358565  0.47199962
## WHLSM.mc      0.02946134  0.19999122
confint.merMod(m3_SD,parm=3:(length(fixef(m3_SD))+2),method="boot",nsim=NSIM) # M3
##                      2.5 %      97.5 %
## (Intercept)     2.52022788  2.97743736
## genderM        -0.71942205 -0.06867787
## PD.mc          -0.07861727  0.03433758
## WHLSM.cm.gmc    0.21444106  0.46769987
## WHLSM.mc        0.02671827  0.19504759
## PD.mc:WHLSM.mc -0.13730658 -0.01152252
# plotting interaction
library(ggplot2); library(gridExtra)
sd(cleanSD$PD.mc) # RDet: 1 SD = 1.36
## [1] 1.362052
p <- plot_model(m3_SD,type="pred",terms=c("WHLSM.mc","PD.mc [-1.36,1.36]"),colors="bw",
           alpha=0.4,legend.title="Psychological\ndetachment",axis.title=c("State workaholism","Sleep disturbances")) +
  scale_color_manual(labels=c("-1 SD","+1 SD"),values=c("black","#666666")) +
  scale_linetype_manual(labels=c("-1 SD","+1 SD"),values=c("solid","dashed")) +
  scale_fill_manual(labels=c("-1 SD","+1 SD"),values=c("black","#666666")) + ggtitle("") +
                    theme(text=element_text(size=15))
p

ggsave("RESULTS/Figure3.tiff",plot=p,dpi=300,width=5,height=4)


References

  • Steegen, S., Tuerlinckx, F., Gelman, A., & Vanpaemel, W. (2016). Increasing transparency through a multiverse analysis. Perspectives on Psychological Science, 11(5), 702-712. https://doi.org/10.1177/1745691616658637


R packages

Auguie, Baptiste. 2017. gridExtra: Miscellaneous Functions for "Grid" Graphics. https://CRAN.R-project.org/package=gridExtra.
Bartoń, Kamil. 2023. MuMIn: Multi-Model Inference. https://CRAN.R-project.org/package=MuMIn.
Bates, Douglas, Martin Mächler, Ben Bolker, and Steve Walker. 2015. “Fitting Linear Mixed-Effects Models Using lme4.” Journal of Statistical Software 67 (1): 1–48. https://doi.org/10.18637/jss.v067.i01.
Bates, Douglas, Martin Maechler, Ben Bolker, and Steven Walker. 2023. Lme4: Linear Mixed-Effects Models Using Eigen and S4. https://github.com/lme4/lme4/.
Delignette-Muller, Marie Laure, and Christophe Dutang. 2015. fitdistrplus: An R Package for Fitting Distributions.” Journal of Statistical Software 64 (4): 1–34. https://doi.org/10.18637/jss.v064.i04.
Delignette-Muller, Marie-Laure, Christophe Dutang, and Aurelie Siberchicot. 2023. Fitdistrplus: Help to Fit of a Parametric Distribution to Non-Censored or Censored Data. https://CRAN.R-project.org/package=fitdistrplus.
Fox, John, and Sanford Weisberg. 2019. An R Companion to Applied Regression. Third. Thousand Oaks CA: Sage. https://socialsciences.mcmaster.ca/jfox/Books/Companion/.
Fox, John, Sanford Weisberg, and Brad Price. 2023. Car: Companion to Applied Regression. https://CRAN.R-project.org/package=car.
Imai, Kosuke, Luke Keele, and Dustin Tingley. 2010. “A General Approach to Causal Mediation Analysis.” Psychological Methods 15 (4): 309–34. http://imai.princeton.edu/research/BaronKenny.html.
Imai, Kosuke, Luke Keele, Dustin Tingley, and Teppei Yamamoto. 2010. “Causal Mediation Analysis Using r.” In Advances in Social Science Research Using r, edited by H. D. Vinod. New York: Springer-Verlag.
———. 2011. “Unpacking the Black Box of Causality: Learning about Causal Mechanisms from Experimental and Observational Studies.” American Political Science Review 105 (4): 765–89. http://imai.princeton.edu/research/mediationP.html.
Imai, Kosuke, Luke Keele, and Teppei Yamamoto. 2010. “Identification, Inference, and Sensitivity Analysis for Causal Mediation Effects.” Statistical Science 25 (1): 51–71. http://imai.princeton.edu/research/mediation.html.
Imai, Kosuke, and Teppei Yamamoto. 2013. “Identification and Sensitivity Analysis for Multiple Causal Mechanisms: Revisiting Evidence from Framing Experiments.” Political Analysis 21 (2): 141–71. http://imai.princeton.edu/research/medsens.html.
Lüdecke, Daniel. 2023. sjPlot: Data Visualization for Statistics in Social Science. https://strengejacke.github.io/sjPlot/.
Nieuwenhuis, Rense, Ben Pelzer, and Manfred te Grotenhuis. 2017. Influence.ME: Tools for Detecting Influential Data in Mixed Effects Models. http://www.rensenieuwenhuis.nl/r-project/influenceme/.
Nieuwenhuis, Rense, Manfred Te Grotenhuis, and Ben Pelzer. 2012. “Influence.ME: Tools for Detecting Influential Data in Mixed Effects Models.” R Journal 4 (2): 38–47.
R Core Team. 2023. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Revelle, William. 2023. Psych: Procedures for Psychological, Psychometric, and Personality Research. https://personality-project.org/r/psych/ https://personality-project.org/r/psych-manual.pdf.
Tingley, Dustin, Teppei Yamamoto, Kentaro Hirose, Luke Keele, and Kosuke Imai. 2014. mediation: R Package for Causal Mediation Analysis.” Journal of Statistical Software 59 (5): 1–38. http://www.jstatsoft.org/v59/i05/.
Tingley, Dustin, Teppei Yamamoto, Kentaro Hirose, Luke Keele, Kosuke Imai, Minh Trinh, and Weihuang Wong. 2019. Mediation: Causal Mediation Analysis. https://imai.princeton.edu/projects/mechanisms.html.
Wickham, Hadley. 2011. “The Split-Apply-Combine Strategy for Data Analysis.” Journal of Statistical Software 40 (1): 1–29. https://www.jstatsoft.org/v40/i01/.
———. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
———. 2022. Plyr: Tools for Splitting, Applying and Combining Data. https://CRAN.R-project.org/package=plyr.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2023. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2023. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
LS0tDQp0aXRsZTogIlRoZSBkYWlseSBjb3N0cyBvZiB3b3JrYWhvbGlzbSINCnN1YnRpdGxlOiAiU3VwcGxlbWVudGFyeSBtYXRlcmlhbCBTNjogTXVsdGlsZXZlbCByZWdyZXNzaW9uIG1vZGVsaW5nIg0KYXV0aG9yOiAgIkx1Y2EgTWVuZ2hpbmksIFBoLkQuLCBDcmlzdGlhbiBCYWxkdWNjaSwgUGguRC4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpiaWJsaW9ncmFwaHk6IFtwYWNrYWdlc01vZC5iaWJdDQpub2NpdGU6ICdAKicNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDYNCiAgICBjc3M6IHN0eWxlcy5jc3MNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHRoZW1lOiB1bml0ZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8YnI+DQoNCiMgQWltcyBhbmQgY29udGVudA0KDQpUaGUgcHJlc2VudCBkb2N1bWVudCBpbmNsdWRlcyB0aGUgYW5hbHl0aWNhbCBzdGVwcyBpbXBsZW1lbnRlZCB0byBtb2RlbCB0aGUgd2l0aGluLWluZGl2aWR1YWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHdvcmthaG9saXNtIGBXSExTTWAgYW5kIHRoZSBmb2N1c2VkIHN0cmFpbiBvdXRjb21lcyAoaS5lLiwgYWZ0ZXJub29uIGFuZCBldmVuaW5nIGJsb29kIHByZXNzdXJlIGBTQlBgIGFuZCBgREJQYCwgZW1vdGlvbmFsIGV4aGF1c3Rpb24gYEVFYCwgYW5kIHNsZWVwIGRpc3R1cmJhbmNlcyBgU0RgKSBhbmQgdGhlIHdpdGhpbi1pbmRpdmlkdWFsIGludGVyYWN0aW9ucyBiZXR3ZWVuIGBXSExTTWAgYW5kIHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudCBgUERgLiBUaGUgYW5hbHlzZXMgYXJlIGNvbmR1Y3RlZCBvbiB0aGUgZGFpbHkgZGlhcnkgZGF0YSBjb2xsZWN0ZWQgd2l0aCB0aGUgUXVhbHRyaWNzIHBsYXRmb3JtIChRdWFsdHJpY3MsIFNlYXR0bGUsIFdBLCBVU0EpIGZyb20gYW4gaGV0ZXJvZ2VuZW91cyBzYW1wbGVzIG9mIHdvcmtlcnMgb3ZlciB0d28gd2Vla3MsIHByZS1wcm9jZXNzZWQgYXMgc2hvd24gaW4gW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSwgYW5kIGFnZ3JlZ2F0ZWQgYXMgc2hvd24gaW4gW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzRdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M0X3BzeWNob21ldHJpY3MvUzRfcHN5Y2hvbWV0cmljcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkuDQoNCkhlcmUsIHdlIHJlbW92ZSBhbGwgb2JqZWN0cyBmcm9tIHRoZSBSIGdsb2JhbCBlbnZpcm9ubWVudC4NCmBgYHtyICB9DQojIHJlbW92aW5nIGFsbCBvYmpldHMgZnJvbSB0aGUgd29ya3NwYWNlDQpybShsaXN0PWxzKCkpDQpgYGANCg0KVGhlIGZvbGxvd2luZyBSIHBhY2thZ2VzIGFyZSB1c2VkIGluIHRoaXMgZG9jdW1lbnQgKHNlZSBbUmVmZXJlbmNlc10oI3JlZikgc2VjdGlvbik6DQpgYGB7ciAgfQ0KIyByZXF1aXJlZCBwYWNrYWdlcw0KcGFja2FnZXMgPC0gYygibG1lNCIsIk11TUluIiwic2pQbG90IiwicGx5ciIsImNhciIsImZpdGRpc3RycGx1cyIsImdncGxvdDIiLCJncmlkRXh0cmEiLCJpbmZsdWVuY2UuTUUiLCJtZWRpYXRpb24iLCJwc3ljaCIsImtuaXRyIikNCg0KIyBnZW5lcmF0ZSBwYWNrYWdlcyByZWZlcmVuY2VzDQprbml0cjo6d3JpdGVfYmliKGMoLnBhY2thZ2VzKCksIHBhY2thZ2VzKSwicGFja2FnZXNNb2QuYmliIikNCg0KIyAjIHJ1biB0byBpbnN0YWxsIG1pc3NpbmcgcGFja2FnZXMNCiMgeGZ1bjo6cGtnX2F0dGFjaDIocGFja2FnZXMsIG1lc3NhZ2UgPSBGQUxTRSk7IHJtKGxpc3Q9bHMoKSkNCmBgYA0KDQo8YnI+DQoNCiMgMS4gRGF0YSByZWFkaW5nDQoNCkZpcnN0LCB3ZSByZWFkIGRhaWx5IGBkaWFyeWAgZXhwb3J0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM0XShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TNF9wc3ljaG9tZXRyaWNzL1M0X3BzeWNob21ldHJpY3MtY29kZS1hbmQtb3V0cHV0Lmh0bWwpLCBhbmQgdGhlIG1vZGVsIGZvcm11bGFzIHdpdGggdGhlIGNvdmFyaWF0ZXMgc2VsZWN0ZWQgZnJvbSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkuIE1vcmVvdmVyLCB3ZSBkZXJpdmUgdGhlIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlIGRhdGFzZXQgYHByZWxxc2AgZnJvbSB0aGUgYGRpYXJ5YCBkYXRhc2V0Lg0KYGBge3IgIH0NCiMgcmVhZGluZyBkYXRhDQpsb2FkKCJEQVRJL2RpYXJ5X2FnZ3JlZ2F0ZWQuUkRhdGEiKSAjIGRhaWx5IGRpYXJ5IGRhdGENCmxvYWQoIkRBVEkvbWZvcm11bGFzLlJEYXRhIikgIyBzZWxlY3RlZCBjb3ZhcmlhdGVzDQoNCiMgZGVyaXZpbmcgcHJlbHFzIGZyb20gZGlhcnkgZGF0YSAob25seSBpbmNsdWRpbmcgdmFyaWFibGVzIGZyb20gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUpDQpwcmVscXMgPC0gZGlhcnlbIWR1cGxpY2F0ZWQoZGlhcnkkSUQpLGMoMSx3aGljaChjb2xuYW1lcyhkaWFyeSk9PSJnZW5kZXIiKTpuY29sKGRpYXJ5KSldDQoNCiMgb3JpZ2luYWwgc2FtcGxlIHNpemVzDQpjYXQoImRpYXJ5OiIsbnJvdyhkaWFyeSksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGRpYXJ5JElEKSwicGFydGljaXBhbnRzIikNCmNhdCgicHJlbHFzOiIsbnJvdyhwcmVscXMpLCJyZXNwb25zZXMgZnJvbSIsbmxldmVscyhwcmVscXMkSUQpLCJwYXJ0aWNpcGFudHMiKQ0KYGBgDQoNCjxicj4NCg0KIyAyLiBEYXRhIGZpbHRlcmluZw0KDQpBcyB3ZSBbcHJlLXJlZ2lzdGVyZWQgaGVyZV0oaHR0cHM6Ly9vc2YuaW8vaDl6dnEpLCB3ZSBmaWx0ZXIgdGhlIGRhdGEgYmFzZWQgb24gcGFydGljaXBhbnQgY29tcGxpYW5jZSB3aXRoIHRoZSBwcm90b2NvbCwgdGhhdCBpcyB3ZSAqKmV4Y2x1ZGUgdGhlIHBhcnRpY2lwYW50cyB3aXRoIGxlc3MgdGhhbiAzIGZ1bGwgZGF5cyBvZiBwYXJ0aWNpcGF0aW9uKiogKGkuZS4sIHdpdGggbm9ubWlzc2luZyByZXNwb25zZSB0byB0aGUgYWZ0ZXJub29uLCBldmVuaW5nLCBhbmQgbW9ybmluZyBxdWVzdGlvbm5haXJlKS4NCmBgYHtyICB9DQojIGZpbHRlcmluZyBwYXJ0aWNpcGFudHMgd2l0aCBsZXNzIHRoYW4gMyBvYnNlcnZhdGlvbnMNCmNsZWFuIDwtIGRpYXJ5WzAsXQ0KZm9yKElEIGluIGxldmVscyhkaWFyeSRJRCkpeyANCiAgaWYobnJvdyhkaWFyeVtkaWFyeSRJRD09SUQgJiBkaWFyeSRhZnQ9PTEgJiBkaWFyeSRldmU9PTEgJiBkaWFyeSRtb3I9PTEsXSkgPj0gMyl7IA0KICAgIGNsZWFuIDwtIHJiaW5kKGNsZWFuLGRpYXJ5W2RpYXJ5JElEPT1JRCxdKSB9fQ0KY2xlYW4kSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbiRJRCkpICMgcmVzZXR0aW5nIElEIGxldmVscw0KY2xlYW5fcHJlbHFzIDwtIHByZWxxc1twcmVscXMkSUQgJWluJSBsZXZlbHMoY2xlYW4kSUQpLF0gIyBmaWx0ZXJpbmcgcHJlbHFzIGRhdGENCmNsZWFuX3ByZWxxcyRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuX3ByZWxxcyRJRCkpICMgcmVzZXR0aW5nIElEIGxldmVscw0KY2F0KCJkaWFyeTogRXhjbHVkZWQiLG5sZXZlbHMoZGlhcnkkSUQpLW5sZXZlbHMoY2xlYW4kSUQpLCJwYXJ0aWNpcGFudHMgYW5kIixucm93KGRpYXJ5KS1ucm93KGNsZWFuKSwib2JzZXJ2YXRpb25zIikNCg0KIyB1cGRhdGluZyBzYW1wbGUgc2l6ZXMNCmNhdCgiZGlhcnk6Iixucm93KGNsZWFuKSwicmVzcG9uc2VzIGZyb20iLG5sZXZlbHMoY2xlYW4kSUQpLCJwYXJ0aWNpcGFudHMiKQ0KY2F0KCJwcmVscXM6Iixucm93KGNsZWFuX3ByZWxxcyksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGNsZWFuX3ByZWxxcyRJRCksInBhcnRpY2lwYW50cyIpDQpgYGANCg0KPGJyPg0KDQojIyAyLjEuIEJQIGRhdGEgZmlsdGVyaW5nDQoNCkluIGFkZGl0aW9uIHRvIHBhcnRpY2lwYW50IGNvbXBsaWFuY2UsIHdlIHByZS1yZWdpc3RlcmVkIHRoZSAqKmV4Y2x1c2lvbiBvZiBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyB0YWtpbmcgYmxvb2QgcHJlc3N1cmUgbWVkaWNhdGlvbnMgYGJwX2RydWdzYCBvciBzdWZmZXJpbmcgZnJvbSBhIGNhcmRpb3Zhc2N1bGFyIGR5c2Z1bmN0aW9uIGBjdl9keXNmYCBmcm9tIHRoZSBhbmFseXNlcyBvZiBibG9vZCBwcmVzc3VyZSoqLiBIZXJlLCB3ZSBleGNsdWRlIHN1Y2ggcGFydGljaXBhbnRzIHNob3dpbmcgc3Vic3RhbnRpYWxseSBoaWdoZXIgYmxvb2QgcHJlc3N1cmUgKHNlZSBzZWN0aW9uIDMuNSBvZiBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLiBJbiBjb250cmFzdCwgZGV2aWF0aW5nIGZyb20gdGhlIHByZS1yZWdpc3RyYXRpb24gKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTN10oaHR0cHM6Ly9vc2YuaW8vYnBydmcpKSwgd2UgZG8gbm90IGV4Y2x1ZGUgdGhvc2UgdGFraW5nIHBzeWNob2FjdGl2ZSBgcHN5X2RydWdzYCBvciBob3Jtb25hbCBtZWRpY2F0aW9uIGBob3JtX2RydWdzYCwgb3IgdGhvc2UgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucyBgc2xlZXBfZHlzZmAsIGFzIHdlIGRpZCBub3QgZmluZCBzdWJzdGFudGlhbCBkaWZmZXJlbmNlcyBpbiB0aGVpciBibG9vZCBwcmVzc3VyZSB2YWx1ZXMgKHNlZSBzZWN0aW9uIDMuNSBvZiBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLiBJbnN0ZWFkLCB3ZSBleGNsdWRlIHRoZXNlIHBhcnRpY2lwYW50cyBhcyBhIHJvYnVzdG5lc3MgY2hlY2sgKHNlZSBzZWN0aW9uIDQpLg0KYGBge3IgIH0NCiMgZmlsdGVyaW5nIHBhcnRpY2lwYW50cyB3aXRoIGJwX2RydWdzIG9yIGN2X2R5c2YNCmNsZWFuQlAgPC0gY2xlYW5bY2xlYW4kYnBfZHJ1Z3M9PSJObyIgJiBjbGVhbiRjdl9keXNmPT0iTm8iLF0NCmNsZWFuQlAkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQJElEKSkgIyByZXNldHRpbmcgSUQgbGV2ZWxzDQpjbGVhbkJQX3ByZWxxcyA8LSBwcmVscXNbcHJlbHFzJElEICVpbiUgbGV2ZWxzKGNsZWFuQlAkSUQpLF0gIyBmaWx0ZXJpbmcgcHJlbHFzIGRhdGENCmNsZWFuQlBfcHJlbHFzJElEIDwtIGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5CUF9wcmVscXMkSUQpKSAjIHJlc2V0dGluZyBJRCBsZXZlbHMNCmNhdCgiZGlhcnk6IEV4Y2x1ZGVkIGZ1cnRoZXIiLG5sZXZlbHMoY2xlYW4kSUQpLW5sZXZlbHMoY2xlYW5CUCRJRCksInBhcnRpY2lwYW50cyBhbmQiLA0KICAgIG5yb3coY2xlYW4pLW5yb3coY2xlYW5CUCksIm9ic2VydmF0aW9ucyBmcm9tIEJQIGFuYWx5c2VzIikNCg0KIyB1cGRhdGluZyBzYW1wbGUgc2l6ZXMNCmNhdCgiZGlhcnkgKEJQKToiLG5yb3coY2xlYW5CUCksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGNsZWFuQlAkSUQpLCJwYXJ0aWNpcGFudHMiKQ0KY2F0KCJwcmVscXMgKEJQKToiLG5yb3coY2xlYW5CUF9wcmVscXMpLCJyZXNwb25zZXMgZnJvbSIsbmxldmVscyhjbGVhbkJQX3ByZWxxcyRJRCksInBhcnRpY2lwYW50cyIpDQpgYGANCg0KPGJyPg0KDQojIyAyLjIuIFNsZWVwIGRhdGEgZmlsdGVyaW5nDQoNCkZpbmFsbHksIHdlIGFsc28gcHJlLXJlZ2lzdGVyZWQgdGhlIGV4Y2x1c2lvbiBvZiBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyBzbGVlcCBkeXNmdW5jdGlvbnMgZnJvbSB0aGUgYW5hbHlzZXMgb2Ygc2xlZXAgZGlzdHVyYmFuY2VzLiBIb3dldmVyLCB0aGUgbnVtYmVyIG9mIHN1Y2ggcGFydGljaXBhbnRzIGlzIHJlbGF0aXZlbHkgaGlnaCwgd2hlcmVhcyB0aGV5IGRvIG5vdCBzZWVtIHRvIHNob3cgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZXMgaW4gc2xlZXAgZGlzdHVyYmFuY2VzIGNvbXBhcmluZyB0byB0aGUgb3RoZXIgcGFydGljaXBhbnRzIChzZWUgc2VjdGlvbiAzLjUgb2YgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzVdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M1X2Rlc2NyaXB0aXZlcy9TNV9kZXNjcmlwdGl2ZXMtY29kZS1hbmQtb3V0cHV0Lmh0bWwpKS4gVGh1cywgZGV2aWF0aW5nIGZyb20gdGhlIHByZS1yZWdpc3RyYXRpb24gKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTN10oaHR0cHM6Ly9vc2YuaW8vYnBydmcpKSwgd2UgZG8gbm90IGV4Y2x1ZGUgc3VjaCBwYXJ0aWNpcGFudHMgZnJvbSB0aGUgbWFpbiBhbmFseXNlcy4gSW5zdGVhZCwgd2UgZXhjbHVkZSB0aGVtIGFzIGEgcm9idXN0bmVzcyBjaGVjayAoc2VlIHNlY3Rpb24gNC41KS4NCmBgYHtyICB9DQojIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucw0Kc3VtbWFyeShjbGVhblshZHVwbGljYXRlZChjbGVhbiRJRCksInNsZWVwX2R5c2YiXSkNCmBgYA0KDQo8YnI+DQoNCiMgMy4gTXVsdGlsZXZlbCBtb2RlbGluZw0KDQpIZXJlLCB3ZSBzcGVjaWZ5LCBjb21wYXJlLCBhbmQgaW5zcGVjdCB0aGUgcmVzdWx0cyBvZiBhIHNlcmllcyBvZiBtdWx0aWxldmVsIG1vZGVscyBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIHByZS1yZWdpc3RlcmVkIHRpbWUtdmFyeWluZyBvdXRjb21lczoNCg0KLSBhZnRlcm5vb24gc3lzdG9saWMgYFNCUF9hZnRgIGFuZCBkeWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgYERCUF9hZnRgDQoNCi0gZXZlbmluZyBzeXN0b2xpYyBgU0JQX2V2ZWAgYW5kIGR5YXN0b2xpYyBibG9vZCBwcmVzc3VyZSBgREJQX2V2ZWANCg0KLSBlbW90aW9uYWwgZXhoYXVzdGlvbiBgRUVgDQoNCi0gc2xlZXAgZGlzdHVyYmFuY2VzIGBTRGANCg0KPGJyPg0KDQpGb3IgZWFjaCBvdXRjb21lLCB3ZSBpbXBsZW1lbnQgYSBoaWVyYXJjaGljYWwgcmVncmVzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6DQoNCjEuIGBtMGA6ICoqbnVsbCBtb2RlbCoqIG9ubHkgaW5jbHVkaW5nIHRoZSBzYW1wbGUgaW50ZXJjZXB0LCB0aGUgbGV2ZWwtMiB2YXJpYWJpbGl0eSBhcm91bmQgdGhlIGludGVyY2VwdCwgYW5kIHRoZSByZXNpZHVhbCB0ZXJtDQoNCjIuIGBtMWA6IGluY2x1ZGluZyB0aGUgKipjb3ZhcmlhdGVzKiogc2VsZWN0ZWQgaW4gdGhlIHByZXZpb3VzIHN0ZXAgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLCBpbiBhZGRpdGlvbiB0byBwc3ljaG9sb2dpY2FsIGRldGFjaG1lbnQgYFBEYCAoaS5lLiwgb25seSBmb3IgZXZlbmluZyBhbmQgbmV4dCBtb3JuaW5nIG91dGNvbWVzKSwgYW5kIHRoZSBsZXZlbC0yIGNvbXBvbmVudCBvZiB3b3JrYWhvbGlzbSBgV0hMU00uY21gDQoNCjMuIGBtMmA6IGluY2x1ZGluZyB0aGUgbGV2ZWwtMSBjb21wb25lbnQgb2YgKip3b3JrYWhvbGlzbSoqIGBXSExTTS5tY2ANCg0KNC4gYG0zYDogaW5jbHVkaW5nIHRoZSBsZXZlbC0xICoqaW50ZXJhY3Rpb25zKiogYmV0d2VlbiBgV0hMU00ubWNgIGFuZCBgUERgIChpLmUuLCBvbmx5IGZvciBvdXRjb21lcyBtZWFzdXJlZCBpbiB0aGUgZXZlbmluZyBvciB0aGUgZm9sbG93aW5nIG1vcm5pbmcpLg0KDQo8YnI+DQoNClRoZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGFuYWx5c2VzOg0KYGBge3IgIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkobG1lNCk7IGxpYnJhcnkoTXVNSW4pOyBsaWJyYXJ5KHNqUGxvdCk7IGxpYnJhcnkocGx5cik7IGxpYnJhcnkoY2FyKTsgbGlicmFyeShmaXRkaXN0cnBsdXMpDQpsaWJyYXJ5KGdyaWRFeHRyYSk7IGxpYnJhcnkoaW5mbHVlbmNlLk1FKQ0KYGBgDQoNCjxicj4NCg0KIyMgMy4xLiBCbG9vZCBwcmVzc3VyZQ0KDQpGaXJzdCwgd2UgYW5hbHlzZSBzeXN0b2xpYyBhbmQgZGlhc3RvbGljIGJsb29kIHByZXNzdXJlLiBBcyBhIG1haW4gY29uZmlybWF0b3J5IGFuYWx5c2lzLCB3ZSBldmFsdWF0ZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRhaWx5IGxldmVscyBvZiBzdGF0ZSB3b3JrYWhvbGlzbSBhbmQgKipkYWlseSBhdmVyYWdlcyoqIG9mIGJsb29kIHByZXNzdXJlIChpLmUuLCBhdmVyYWdlIG9mIGFmdGVybm9vbiwgZXZlbmluZywgYW5kIG5leHQgbW9ybmluZyBtZWFzdXJlbWVudHMpLiBNb3Jlb3ZlciwgYXMgYSBzdXBwbGVtZW50YXJ5IHByZS1yZWdpc3RlcmVkIGFuYWx5c2lzIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzddKGh0dHBzOi8vb3NmLmlvL2JwcnZnKSkgd2UgYXBwbHkgdGhlIHNhbWUgcHJvY2VkdXJlICoqZm9yIGVhY2ggdGltZSBwb2ludCoqLCB0aGF0IGlzIHdlIGFuYWx5emUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBhZnRlcm5vb24sIGV2ZW5pbmcsIGFuZCBtb3JuaW5nIGJsb29kIHByZXNzdXJlIG1lYXN1cmVtZW50LCByZXNwZWN0aXZlbHkuIEZpbmFsbHksIGJhc2VkIG9uIHRoZSByZXN1bHRzLCB3ZSBjb25kdWN0IHByZS1yZWdpc3RlcmVkICoqZXhwbG9yYXRvcnkgbWVkaWF0aW9uIGFuYWx5c2VzKiogb24gdGltZS1zcGVjaWZpYyBibG9vZCBwcmVzc3VyZSBtZWFzdXJlbWVudHMuDQoNCkRhaWx5IGF2ZXJhZ2VzIG9mIHN5c3RvbGljIGBTQlBgIGFuZCBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgYERCUGAgYXJlIHByZWRpY3RlZCBieSBjb25jdXJyZW50IHN0YXRlIHdvcmthaG9saXNtIGBXSExTTS5tY2AsIGluIGFkZGl0aW9uIHRvIHRyYWl0IHdvcmthaG9saXNtIGBXSExTTS5jbWAsIGFuZCB0aHJlZSBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLCBuYW1lbHkgYGdlbmRlcmAsIGBhZ2VgLCBhbmQgYm9keSBtYXNzIGluZGV4IGBCTUlgLg0KYGBge3IgIH0NCm1mb3JtdWxhc1sxXSAjIGNvdmFyaWF0ZXMgc2VsZWN0ZWQgZm9yIFNCUA0KbWZvcm11bGFzWzJdICMgY292YXJpYXRlcyBzZWxlY3RlZCBmb3IgREJQDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xLjEuIEFmdGVybm9vbiBCUA0KDQojIyMjIDMuMS4xLjEuIERhdGEgcHJlcGFyYXRpb24NCg0KRmlyc3QsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcyBieSByZW1vdmluZyBhbGwgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvciBhbnkgcHJlZGljdG9yIG9yIGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKiksIGJ5IGNlbnRlcmluZyBsZXZlbC0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgZ3JhbmQgbWVhbiAoKipncmFuZC1tZWFuLWNlbnRlcmluZyoqKSwgYW5kIGJ5IGNlbnRlcmluZyBsZXZlbC0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkJQX2FmdCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoY2xlYW5CUFssYygiSUQiLCJTQlBfYWZ0IiwiREJQX2FmdCIsICMgZ3JvdXBpbmcgYW5kIGRlcGVuZGVudCB2YXJpYWJsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIsICMgY29yZSBwcmVkaWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0UiLCJXQyIsInNsZWVwX2R5c2YiLCJwc3lfZHJ1Z3MiLCJob3JtX2RydWdzIiwgIyBmb3Igcm9idXN0bmVzcyBjaGVja3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mb3VuZGVyc19hZnQiLCJmbGFnQlBfYWZ0IiwiZmxhZ1RpbWUiLCJjYXJlbGVzcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24iLCJjaGlsZHJlbiIpXSkpIA0KY2xlYW5CUF9hZnQkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2FmdCRJRCkpICMgcmVzZXR0aW5nIHBhcnRpY2lwYW50IGlkZW50aWZpZXIgbGV2ZWxzDQpjYXQoIkNvbnNpZGVyaW5nIixucm93KGNsZWFuQlBfYWZ0KSwiY29tcGxldGUgb2JzIGZyb20iLG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2FmdCRJRCkpKSwicGFydGljaXBhbnRzIikNCg0KIyBwZXJzb24tbWVhbi1jZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIHByZWRpY3RvcnMNCndpZGUgPC0gY2xlYW5CUF9hZnRbIWR1cGxpY2F0ZWQoY2xlYW5CUF9hZnQkSUQpLF0gIyB3aWRlLWZvcm0gZGF0YXNldA0KZm9yKFZhciBpbiBjKCJXSExTTSIsIldFIiwiV0MiKSl7DQogIHdpZGUgPC0gY2JpbmQod2lkZSxhZ2dyZWdhdGUoY2xlYW5CUF9hZnRbLFZhcl0sbGlzdChjbGVhbkJQX2FmdCRJRCksbWVhbilbLDJdKSAjIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMod2lkZSlbbmNvbCh3aWRlKV0gPC0gcGFzdGUwKFZhciwiLmNtIikNCiAgY2xlYW5CUF9hZnQgPC0gam9pbihjbGVhbkJQX2FmdCx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgdG8gbG9uZy1mb3JtIGRmDQogIGNsZWFuQlBfYWZ0WyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5CUF9hZnRbLFZhcl0gLSBjbGVhbkJQX2FmdFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KDQojIGdyYW5kLW1lYW4tY2VudGVyaW5nIGx2LTIgY29udGludW91cyBwcmVkaWN0b3JzDQpmb3IoVmFyIGluIGMoImFnZSIsIkJNSSIsIldITFNNLmNtIikpeyBjbGVhbkJQX2FmdFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSBjbGVhbkJQX2FmdFssVmFyXSAtIG1lYW4od2lkZVssVmFyXSkgfQ0KDQojIHNob3dpbmcgZGF0YQ0KY2xlYW5CUF9hZnRbMTozLF0gIyBmaXJzdCB0aHJlZSByb3dzDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4xLjIuIE1vZGVsIGZpdCAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkhlcmUsIHdlIGZpdCB0aGUgbXVsdGlsZXZlbCBtb2RlbHMgdG8gdGhlIHNlbGVjdGVkIGRhdGEgdXNpbmcgdGhlIGRlZmF1bHQgcmVzdHJpY3RlZCBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdG9yIChSRU1MKS4NCmBgYHtyICB9DQojIG0wOiBudWxsIG1vZGVsDQptMF9TQlBfYWZ0IDwtIGxtZXIoU0JQX2FmdCB+ICgxfElEKSwgIyBvbmx5IGZpeGVkIGFuZCByYW5kb20gaW50ZXJjZXB0ICsgcmVzaWR1YWwgdGVybQ0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9hZnQpDQoNCiMgbTE6IGNvdmFyaWF0ZXMNCm0xX1NCUF9hZnQgPC0gbG1lcihTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlLmdtYyArIEJNSS5nbWMgKyBXSExTTS5jbS5nbWMgKyAoMXxJRCksICMgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9hZnQpDQoNCiMgbTI6IHN0YXRlIHdvcmthaG9saXNtDQptMl9TQlBfYWZ0IDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2FmdCkNCmBgYA0KDQo8YnI+DQoNClRoZSBzYW1lIG1vZGVscyBhcmUgc3BlY2lmaWVkIGZvciBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfREJQX2FmdCA8LSBsbWVyKERCUF9hZnQgfiAoMXxJRCksICMgb25seSBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCArIHJlc2lkdWFsIHRlcm0NCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfYWZ0KQ0KDQojIG0xOiBjb3ZhcmlhdGVzDQptMV9EQlBfYWZ0IDwtIGxtZXIoREJQX2FmdCB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgV0hMU00uY20uZ21jICsgKDF8SUQpLCAjIGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfYWZ0KQ0KDQojIG0yOiBzdGF0ZSB3b3JrYWhvbGlzbQ0KbTJfREJQX2FmdCA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9hZnQpDQpgYGANCg0KRnJvbSB0aGUgcHJldmlvdXMgY2h1bmtzLCB3ZSBzZWUgdGhhdCBhbGwgbW9kZWxzIGNvbnZlcmdlZCB3aXRob3V0IHByb2JsZW1zLiBIZXJlLCB3ZSBpbnNwZWN0IHRoZSAqKmRpYWdub3N0aWNzKiogKGkuZS4sIG5vcm1hbGl0eSBvZiByZXNpZHVhbCBhbmQgcmFuZG9tIGVmZmVjdCBkaXN0cmlidXRpb25zLCBob21vc2NlZGFzdGljaXR5LCBhbmQgbXVsdGljb2xsaW5lYXJpdHkpIG9mIHRoZSBtb3N0IGNvbXBsZXggbW9kZWwgYG0yLmJpc2AuIEluZmx1ZW50aWFsIGNhc2VzIGFyZSBhbmFseXplZCBpbiBhIGRlZGljYXRlZCBzZWN0aW9uIGJlbG93Lg0KDQo8YnI+DQoNCiMjIyMjICBTQlBfYWZ0DQoNCk1vZGVsIGBtMi5iaXNgIHNob3dzICoqc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkqKiBlc3BlY2lhbGx5IGluIHRoZSBsb3dlciB0YWlsIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmVzaWR1YWxzIGFuZCBib3RoIHRhaWxzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmFuZG9tIGVmZmVjdHMuIFBhcnRpY3VsYXJseSwgKipwYXJ0aWNpcGFudHMgYFMwODJgIGFuZCBgUzA5NmAqKiBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaWdoZXN0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvdGggcmFuZG9tIGVmZmVjdHMsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXMgYSByb2J1c3RuZXNzIGNoZWNrIChzZWUgc2VjdGlvbiA0LjEpLiBCZXNpZGVzIHRoYXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaG9tb3NjZWRzdGljaXR5IGFzc3VtcHRpb24gaG9sZHMgYW5kIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpIHNob3dzIGV4dHJlbWUgdmFsdWVzLCBydWxpbmcgb3V0IHRoZSByaXNrIG9mIG11bHRpY29sbGluZWFyaXR5Lg0KYGBge3IgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eQ0KcCA8LSBwbG90X21vZGVsKG0yX1NCUF9hZnQsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkNCnBbWzJdXSA8LSBwW1syXV0kSUQNCnBsb3RfZ3JpZChwLHRhZ3M9VFJVRSxtYXJnaW49YygwLDAsMCwwKSkNCg0KIyBwYXJ0aWNpcGFudCB3aXRoIGhpZ2hlc3QgcmFuZG9tIGVmZmVjdHMgKGkuZS4sIEJMVVBTKQ0KcmUgPC0gcmFuZWYobTJfU0JQX2FmdCkkSUQNCnJlW3JlJFdITFNNLm1jPT1tYXgocmUkV0hMU00ubWMpfHJlJGAoSW50ZXJjZXB0KWA9PW1heChyZSRgKEludGVyY2VwdClgKSxdDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkNCmZvcihWYXIgaW4gYygiZ2VuZGVyIikpeyBib3hwbG90KHJlc2lkKG0yX1NCUF9hZnQpIH4gY2xlYW5CUF9hZnRbLFZhcl0sbWFpbj1wYXN0ZSgiUmVzaWR1YWxzIGJ5IixWYXIpKSB9DQpiYXJwbG90KHZpZihtMl9TQlBfYWZ0KSxtYWluPSJWSUYgVmFsdWVzIix4bGltPWMoMCwxMCksbGFzPTIsaG9yaXo9VFJVRSkgIyB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykNCmFibGluZSh2ID0gNSwgbHdkID0gNSwgbHR5ID0gMikNCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGJldHRlciBpbnNwZWN0IHRoZSByZXNpZHVhbCBkaXN0cmlidXRpb24gYW5kIHRoZSBmaXQgb2YgbW9kZWxzIHNwZWNpZmllZCB3aXRoIGFsdGVybmF0aXZlIGZhbWlseSBkaXN0cmlidXRpb25zLiBXZSBjYW4gc2VlIHRoYXQgbm9uZSBvZiB0aGUgYWx0ZXJuYXRpdmUgZmFtaWxpZXMgc3Vic3RhbnRpYWxseSBiZXR0ZXIgYXBwcm94aW1hdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RlbCByZXNpZHVhbHMsIHdpdGggdGhlICoqbG9nLXRyYW5zZm9ybWVkKiogc29sdXRpb24gKGkuZS4sIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBsb2ctdHJhbnNmb3JtZWQgZGVwZW5kZW50IHZhcmlhYmxlKSBzaG93aW5nIHRoZSBiZXN0IGZpdC4gWWV0LCBpdCBpcyBub3Qgc28gYmV0dGVyIHRoYW4gdGhlIG9yaWdpbmFsIG1vZGVsLiBUaHVzLCB3ZSBpbml0aWFsbHkgKipyZWx5IG9uIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uKiogYW5kIHRoZW4gY29uc2lkZXIgdGhlICoqbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gYXMgYSByb2J1c3RuZXNzIGNoZWNrKiogKHNlZSBzZWN0aW9uIDQuMSkuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTJfU0JQX2FmdCkpICMgdW5rbm93biBiZXN0LWZpdCBkaXN0cmlidXRpb24NCmBgYA0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9M30NCiMgZml0dGluZyBtb2RlbCB3aXRoIGFsdGVybmF0aXZlIGZhbWlsaWVzDQptb2RlbHMgPC0gbGlzdCgNCiAgbTJfU0JQX2FmdCwNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0yX1NCUF9hZnQpLGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSxkYXRhPWNsZWFuQlBfYWZ0KSwgIyBnYW1tYSBsb2cgKGRvZXNuJ3QgY29udmVyZ2UpDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtMl9TQlBfYWZ0KSxmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSxkYXRhPWNsZWFuQlBfYWZ0KSwgIyBnYW1tYSBpZCAoZG9lc24ndCBjb252ZXJnZSkNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0yX1NCUF9hZnQpLGZhbWlseT1nYXVzc2lhbihsaW5rPSJsb2ciKSxkYXRhPWNsZWFuQlBfYWZ0KSwgIyBsb2ctbm9ybWFsIChzaW5ndWxhciBmaXQpDQogIGxtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKHBhc3RlKCJsb2coU0JQX2FmdCkgfiIsYXMuY2hhcmFjdGVyKGZvcm11bGEobTJfU0JQX2FmdCkpWzNdKSksZGF0YT1jbGVhbkJQX2FmdCkpICMgbG9nIHRyYW5zZg0KDQojIG5vcm1hbCBRLVEgcGxvdCBvZiBtb2RlbCByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDEsNSkpDQpmb3IoaSBpbiAxOmxlbmd0aChtb2RlbHMpKXsgDQogIHFxbm9ybShyZXNpZChtb2RlbHNbW2ldXSksbWFpbj1jKCJOb3JtIiwiR2FtbWEtbG9nIiwiR2FtbWEtaWQiLCJsb2ctbm9ybSIsImxvZy10cmFuc2YiKVtpXSk7IHFxbGluZShyZXNpZChtb2RlbHNbW2ldXSkpfQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2FmdA0KDQpNb2RlbCBgbTIuYmlzYCBzaG93cyAqKnNvbWUgZGV2aWF0aW9uIGZyb20gbm9ybWFsaXR5KiogaW4gYm90aCB0YWlscyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc2lkdWFscyBhbmQgcmFuZG9tIGVmZmVjdHMuIFBhcnRpY3VsYXJseSwgKipwYXJ0aWNpcGFudCBgUzA4MmAqKiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGhpZ2hlc3QgZXh0cmVtZSBkZXZpYXRpb24gZnJvbSB0aGUgZGlzdHJpYnV0aW9ucyBvZiBib3RoIHJhbmRvbSBlZmZlY3RzLCBhbmQgd2lsbCBiZSByZW1vdmVkIGFzIGEgcm9idXN0bmVzcyBjaGVjayAoc2VlIHNlY3Rpb24gNC4xKS4gQmVzaWRlcyB0aGF0LCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGhvbW9zY2Vkc3RpY2l0eSBhc3N1bXB0aW9uIGhvbGRzIGFuZCB0aGF0IG5vbmUgb2YgdGhlIHZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3JzIChWSUZzKSBzaG93cyBleHRyZW1lIHZhbHVlcywgcnVsaW5nIG91dCB0aGUgcmlzayBvZiBtdWx0aWNvbGxpbmVhcml0eS4NCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBub3JtYWxpdHkgYW5kIGhvbW9zY2VkYXN0aWNpdHkNCnAgPC0gcGxvdF9tb2RlbChtMl9EQlBfYWZ0LHR5cGU9ImRpYWciLGRvdC5zaXplPTEpDQpwW1syXV0gPC0gcFtbMl1dJElEDQpwbG90X2dyaWQocCx0YWdzPVRSVUUsbWFyZ2luPWMoMCwwLDAsMCkpDQoNCiMgcGFydGljaXBhbnQgd2l0aCBoaWdoZXN0IHJhbmRvbSBlZmZlY3RzIChpLmUuLCBCTFVQUykNCnJlIDwtIHJhbmVmKG0yX0RCUF9hZnQpJElEDQpyZVtyZSRXSExTTS5tYz09bWF4KHJlJFdITFNNLm1jKXxyZSRgKEludGVyY2VwdClgPT1tYXgocmUkYChJbnRlcmNlcHQpYCksXQ0KYGBgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9M30NCiMgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbXVsdGljb2xsaW5lYXJpdHkNCnBhcihtZnJvdz1jKDEsMikpDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtMl9EQlBfYWZ0KSB+IGNsZWFuQlBfYWZ0WyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTJfREJQX2FmdCksbWFpbj0iVklGIFZhbHVlcyIseGxpbT1jKDAsMTApLGxhcz0yLGhvcml6PVRSVUUpICMgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpDQphYmxpbmUodiA9IDUsIGx3ZCA9IDUsIGx0eSA9IDIpDQpgYGANCg0KPGJyPg0KDQpIZXJlLCB3ZSBiZXR0ZXIgaW5zcGVjdCB0aGUgcmVzaWR1YWwgZGlzdHJpYnV0aW9uIGFuZCB0aGUgZml0IG9mIG1vZGVscyBzcGVjaWZpZWQgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbHkgZGlzdHJpYnV0aW9ucy4gV2UgY2FuIHNlZSB0aGF0IHNvbWUgb2YgYWx0ZXJuYXRpdmUgZmFtaWxpZXMgc2xpZ2h0bHkgYmV0dGVyIGFwcHJveGltYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kZWwgcmVzaWR1YWxzLCBhbHRob3VnaCBub3QgcmVhY2hpbmcgY29udmVyZ2VuY2UuIFRoZSAqKmxvZy10cmFuc2Zvcm1lZCoqIHNvbHV0aW9uIChpLmUuLCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbG9nLXRyYW5zZm9ybWVkIGRlcGVuZGVudCB2YXJpYWJsZSkgc2hvd3MgdGhlIGJlc3QgZml0IHdoaWxlIHJlYWNoaW5nIGNvbnZlcmdlbmNlLiBZZXQsIGl0IGlzIG5vdCBzbyBiZXR0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGluaXRpYWxseSAqKnJlbHkgb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24qKiBhbmQgdGhlbiBjb25zaWRlciB0aGUgKipsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBhcyBhIHJvYnVzdG5lc3MgY2hlY2sqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIGluc3BlY3RpbmcgcmVzaWR1YWwgZGlzdHJpYnV0aW9uDQpkZXNjZGlzdChyZXNpZChtMl9EQlBfYWZ0KSkgIyB1bmtub3duIGJlc3QtZml0IGRpc3RyaWJ1dGlvbg0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBmaXR0aW5nIG1vZGVsIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWxpZXMNCm1vZGVscyA8LSBsaXN0KA0KICBtMl9EQlBfYWZ0LA0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTJfREJQX2FmdCksZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLGRhdGE9Y2xlYW5CUF9hZnQpLCAjIGdhbW1hIGxvZyAoZG9lc24ndCBjb252ZXJnZSkNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0yX0RCUF9hZnQpLGZhbWlseT1HYW1tYShsaW5rPSJpZGVudGl0eSIpLGRhdGE9Y2xlYW5CUF9hZnQpLCAjIGdhbW1hIGlkIChkb2Vzbid0IGNvbnZlcmdlKQ0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTJfREJQX2FmdCksZmFtaWx5PWdhdXNzaWFuKGxpbms9ImxvZyIpLGRhdGE9Y2xlYW5CUF9hZnQpLCAjIGxvZy1ub3JtYWwgKHNpbmd1bGFyIGZpdCkNCiAgbG1lcihmb3JtdWxhPWFzLmZvcm11bGEocGFzdGUoImxvZyhTQlBfYWZ0KSB+Iixhcy5jaGFyYWN0ZXIoZm9ybXVsYShtMl9EQlBfYWZ0KSlbM10pKSxkYXRhPWNsZWFuQlBfYWZ0KSkgIyBsb2cgdHJhbnNmDQoNCiMgbm9ybWFsIFEtUSBwbG90IG9mIG1vZGVsIHJlc2lkdWFscw0KcGFyKG1mcm93PWMoMSw1KSkNCmZvcihpIGluIDE6bGVuZ3RoKG1vZGVscykpeyANCiAgcXFub3JtKHJlc2lkKG1vZGVsc1tbaV1dKSxtYWluPWMoIk5vcm0iLCJHYW1tYS1sb2ciLCJHYW1tYS1pZCIsImxvZy1ub3JtIiwibG9nLXRyYW5zZiIpW2ldKTsgcXFsaW5lKHJlc2lkKG1vZGVsc1tbaV1dKSl9DQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4xLjMuIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkhlcmUsIHdlIGNvbXBhcmUgdGhlIHNwZWNpZmllZCBtb2RlbHMgYmFzZWQgb24gdGhlIEFrYWlrZSB3ZWlnaHQgYW5kIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgKHdpdGggdHlwZS1JIGVycm9yIHNldCB0byAqcCogPCAuMDUpLCBhbmQgd2UgaW5zcGVjdCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwocykuIA0KDQojIyMjIyBTQlBfYWZ0DQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIGFuZCBzaWduaWZpY2FudGx5IGhpZ2hlciBsaWtlbGlob29kIHRoYW4gbW9kZWxzIGluY2x1ZGluZyBsZXNzIHByZWRpY3RvcnMgKEF3ID0gLjk5LCAkXGNoaV4yJCgxKSA9IDE1LjA3LCAqcCogPCAuMDAxKSwgd2l0aCAqKm1vZGVsIGBtMmAgYmVpbmcgc2VsZWN0ZWQgYXMgdGhlIGJlc3QgbW9kZWwqKi4NCmBgYHtyIH0NCiMgQWthaWtlIHdlaWdodCBhZGRpbmcgb25lIG1vZGVsIGF0IHRpbWUNCldlaWdodHMoQUlDKG0wX1NCUF9hZnQsbTFfU0JQX2FmdCkpICMgY292YXJpYXRlczogYmV0dGVyDQpXZWlnaHRzKEFJQyhtMF9TQlBfYWZ0LG0xX1NCUF9hZnQsbTJfU0JQX2FmdCkpICMgc3RhdGUgd29ya2Fob2xpc206IGJldHRlcg0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdA0KYW5vdmEobTFfU0JQX2FmdCxtMl9TQlBfYWZ0KSAjIGJlc3QgbW9kZWwgaXMgbTINCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIGNvZWZmaWNpZW50cyBlc3RpbWF0ZWQgYnkgdGhlIHNlbGVjdGVkIG1vZGVsIGBtMi5iaXNgIGFuZCB0aG9zZSBlc3RpbWF0ZWQgYnkgbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLiBXZSBjYW4gc2VlIHRoYXQgc3RhdGUgYFdITFNNLm1jYCBpcyBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gYEJQX2FmdGAsIHdoZXJlYXMgdHJhaXQgYFdITFNNLmNtLmdtY2AgaXMgbm90LiBBbW9uZyB0aGUgaW5jbHVkZWQgY292YXJpYXRlcywgYGdlbmRlcmAsIGBhZ2VgIGFuZCBgQk1JYCwgYnV0IG5vdCB0cmFpdCBgV0hMU00uY20uZ21jYCBwcmVkaWN0IGhpZ2hlciBgU0JQX2FmdGAuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD00fQ0KIyByZWdyZXNzaW9uIHRhYmxlDQp0YWJfbW9kZWwobTFfU0JQX2FmdCxtMl9TQlBfYWZ0LA0KICAgICAgICAgIGR2LmxhYmVscz1jKCJDb3ZhcmlhdGVzIiwiU3RhdGUgV0hMU00iKSwNCiAgICAgICAgICBzaG93LmljYz1GQUxTRSxzaG93LnA9RkFMU0Usc2hvdy5zZT1UUlVFLHNob3cucjI9RkFMU0Usc2hvdy5jaT1GQUxTRSwNCiAgICAgICAgICBjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KDQojIHBsb3R0aW5nIG1haW4gZWZmZWN0cyBmcm9tIHNlbGVjdGVkIG1vZGVsDQpncmlkLmFycmFuZ2UocGxvdF9tb2RlbChtMl9TQlBfYWZ0LHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5jbS5nbWMiKSwgIyB0cmFpdCBXSExTTQ0KICAgICAgICAgICAgIHBsb3RfbW9kZWwobTJfU0JQX2FmdCx0eXBlPSJwcmVkIix0ZXJtcz0iV0hMU00ubWMiKSxucm93PTEpICMgc3RhdGUgV0hMU00NCmBgYA0KDQo8YnI+DQoNCiMjIyMjIERCUF9hZnQNCg0KUmVzdWx0cyBhcmUgKippbiBsaW5lIHdpdGggdGhvc2UgZm91bmQgZm9yIGBTQlBfYWZ0YCoqOiB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIGFuZCBzaWduaWZpY2FudGx5IGhpZ2hlciBsaWtlbGlob29kIHRoYW4gbW9kZWxzIGluY2x1ZGluZyBsZXNzIHByZWRpY3RvcnMgKEF3ID0gLjk5LCAkXGNoaV4yJCgxKSA9IDEzLjg0LCAqcCogPCAuMDAxKSwgd2l0aCAqKm1vZGVsIGBtMmAgYmVpbmcgc2VsZWN0ZWQgYXMgdGhlIGJlc3QgbW9kZWwqKi4NCmBgYHtyIH0NCiMgQWthaWtlIHdlaWdodCBhZGRpbmcgb25lIG1vZGVsIGF0IHRpbWUNCldlaWdodHMoQUlDKG0wX0RCUF9hZnQsbTFfREJQX2FmdCkpICMgY292YXJpYXRlczogYmV0dGVyDQpXZWlnaHRzKEFJQyhtMF9EQlBfYWZ0LG0xX0RCUF9hZnQsbTJfREJQX2FmdCkpICMgc3RhdGUgd29ya2Fob2xpc206IGJldHRlcg0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdA0KYW5vdmEobTFfREJQX2FmdCxtMl9EQlBfYWZ0KSAjIGJlc3QgbW9kZWwgaXMgbTINCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIGNvZWZmaWNpZW50cyBlc3RpbWF0ZWQgYnkgdGhlIHNlbGVjdGVkIG1vZGVsIGBtMmAgYW5kIHRob3NlIGVzdGltYXRlZCBieSB0aGUgb3RoZXIgbW9kZWxzLiAqKkluIGxpbmUgd2l0aCB0aGUgcmVzdWx0cyBmb3VuZCBmb3IgYFNCUF9hZnRgKiosIHdlIGNhbiBzZWUgdGhhdCBzdGF0ZSBgV0hMU00ubWNgIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBgREJQX2FmdGAsIHdoZXJlYXMgdHJhaXQgYFdITFNNLmNtLmdtY2AgaXMgbm90LiBBbW9uZyB0aGUgaW5jbHVkZWQgY292YXJpYXRlcywgYm90aCBgYWdlYCBhbmQgYEJNSWAsIGJ1dCBub3QgYGdlbmRlcmAgcHJlZGljdCBoaWdoZXIgYERCUF9hZnRgLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVncmVzc2lvbiB0YWJsZQ0KdGFiX21vZGVsKG0xX0RCUF9hZnQsbTJfREJQX2FmdCwNCiAgICAgICAgICBkdi5sYWJlbHM9YygiQ292YXJpYXRlcyIsIlN0YXRlIFdITFNNIiksDQogICAgICAgICAgc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSxzaG93LnIyPUZBTFNFLHNob3cuY2k9RkFMU0UsDQogICAgICAgICAgY29sbGFwc2Uuc2U9VFJVRSxzdHJpbmcuZXN0PSJiIChTRSkiLHNob3cuc3RhdD1UUlVFLHN0cmluZy5zdGF0PSJ0IikNCg0KIyBwbG90dGluZyBtYWluIGVmZmVjdHMgZnJvbSBzZWxlY3RlZCBtb2RlbA0KZ3JpZC5hcnJhbmdlKHBsb3RfbW9kZWwobTJfREJQX2FmdCx0eXBlPSJwcmVkIix0ZXJtcz0iV0hMU00uY20uZ21jIiksICMgdHJhaXQgV0hMU00NCiAgICAgICAgICAgICBwbG90X21vZGVsKG0yX0RCUF9hZnQsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLm1jIiksbnJvdz0xKSAjIHN0YXRlIFdITFNNDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4xLjQuIEluZmx1ZW50aWFsIGNhc2VzDQoNCkhlcmUsIHdlIGV2YWx1YXRlIHRoZSBwcmVzZW5jZSBvZiBpbmZsdWVudGlhbCBjYXNlcyBpbiB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0yYC4gU3BlY2lmaWNhbGx5LCB0aGUgKipDb29r4oCZcyBkaXN0YW5jZSoqIGlzIGNvbnNpZGVyZWQgYXMgdGhlIG1haW4gbWVhc3VyZSBvZiBpbmRpdmlkdWFsLWxldmVsIChpLmUuLCBwYXJ0aWNpcGFudCkgaW5mbHVlbmNlIG9uIHRoZSBlc3RpbWF0ZWQgcGFyYW1ldGVycywgYW5kIGl0IGlzIHJlY29tcHV0ZWQgYnkgcHJvZ3Jlc3NpdmVseSBleGNsdWRpbmcgdGhlIG1vc3QgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzIChpLmUuLCBiYXNlZCBvbiB0aGUgcnVsZS1vZi10aHVtYiBvZiA0L04pIHVudGlsIGFsbCBleHRyZW1lIHZhbHVlcyBhcmUgcmVtb3ZlZC4NCg0KIyMjIyMgMy4xLjEuNC4xLiBDb29rJ3MgZGlzdGFuY2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBTQlBfYWZ0DQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudHMgYFMwOTZgIGFuZCBgUzA4MmAgYXJlIHBvdGVudGlhbGx5IGluZmx1ZW50aWFsIGNhc2VzLiBOb3RlIHRoYXQgdGhlc2UgYXJlIHRoZSBzYW1lIHBhcnRpY2lwYW50cyBzaG93aW5nIHRoZSBtb3N0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIHJhbmRvbSBlZmZlY3RzIChzZWUgc2VjdGlvbiAzLjEuMikuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgY29vaydzIGRpc3RhbmNlIG9uIHRoZSB3aG9sZSBzYW1wbGUNCmluZmwgPC0gaW5mbHVlbmNlKG0yX1NCUF9hZnQsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhbkJQX2FmdCRJRCkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkNCg0KIyBwcm9ncmVzc2l2ZWx5IGV4Y2x1ZGluZyBwYXJ0aWNpcGFudHMNCmluZmwgPC0gbGlzdCgNCiAgaW5mbHVlbmNlKGV4Y2x1ZGUuaW5mbHVlbmNlKG0yX1NCUF9hZnQsIklEIiwiUzA4MiIpLCJJRCIpLA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfU0JQX2FmdCwiSUQiLGMoIlMwODIiLCJTMDk2IikpLCJJRCIpKQ0KZm9yKGkgaW4gMTpsZW5ndGgoaW5mbCkpeyANCiAgcGxvdChpbmZsW1tpXV0sd2hpY2g9ImNvb2siLGN1dG9mZj00LyhubGV2ZWxzKGNsZWFuQlBfYWZ0JElEKS1pKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKSB9DQpgYGANCg0KPGJyPg0KDQojIyMjIyMgREJQX2FmdA0KDQpXZSBjYW4gc2VlIHRoYXQgcGFydGljaXBhbnQgYFMwODJgIGlzIGEgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZS4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgcGFydGljaXBhbnRzIHNob3dpbmcgdGhlIG1vc3QgZXh0cmVtZSBkZXZpYXRpb25zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbnMgb2YgcmFuZG9tIGVmZmVjdHMgKHNlZSBzZWN0aW9uIDMuMS4yKS4NCmBgYHtyIGZpZy53aWR0aD0zLGZpZy5oZWlnaHQ9MTAsd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTJfREJQX2FmdCwiSUQiKQ0KcGxvdChpbmZsLHdoaWNoPSJjb29rIixjdXRvZmY9NC9ubGV2ZWxzKGNsZWFuQlBfYWZ0JElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBsaXN0KGluZmx1ZW5jZShleGNsdWRlLmluZmx1ZW5jZShtMl9EQlBfYWZ0LCJJRCIsIlMwODIiKSwiSUQiKSkNCmZvcihpIGluIDE6bGVuZ3RoKGluZmwpKXsgDQogIHBsb3QoaW5mbFtbaV1dLHdoaWNoPSJjb29rIixjdXRvZmY9NC8obmxldmVscyhjbGVhbkJQX2FmdCRJRCktaSkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkgfQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgMy4xLjEuNC4yLiBDb2VmZmljaWVudCBjaGFuZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBTQlBfYWZ0DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBhZnRlciB0aGUgcmVtb3ZhbCBvZiBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlcy4gV2UgY2FuIHNlZSB0aGF0IHRoZSBjb2VmZmljaWVudHMgZXN0aW1hdGVkIGJ5IHRoZSB1cGRhdGVkIG1vZGVsIGRvIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBmcm9tIHRob3NlIGVzdGltYXRlZCBieSB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGNob29zZSB0byAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9TQlBfYWZ0Lm5vSW5mbCA8LSB1cGRhdGUobTJfU0JQX2FmdCxkYXRhPWNsZWFuQlBfYWZ0WyFjbGVhbkJQX2FmdCRJRCVpbiVjKCJTMDk2IiwiUzA4MiIpLF0pDQoNCiMgcGxvdHRpbmcgY29lZmZpY2llbnRzIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQpwbG90X21vZGVscyhtMl9TQlBfYWZ0LG0yX1NCUF9hZnQubm9JbmZsKQ0KDQojIHNob3dpbmcgcmVncmVzc2lvbiB0YWJsZSBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KdGFiX21vZGVsKG0yX1NCUF9hZnQsbTJfU0JQX2FmdC5ub0luZmwsZHYubGFiZWxzPWMoIk9yaWdpbmFsIiwiVXBkYXRlZCIpLHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsDQogICAgICAgICAgc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMjIERCUF9hZnQNCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgbWFnbml0dWRlIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnRzIGFmdGVyIHRoZSByZW1vdmFsIG9mIHBvdGVudGlhbGx5IGluZmx1ZW50aWFsIGNhc2VzLiBXZSBjYW4gc2VlIHRoYXQgdGhlIHJlbW92YWwgb2YgdGhlIGluZmx1ZW50aWFsIHBhcnRpY2lwYW50IG1haW5seSBhZmZlY3RzIHRoZSBwYXJhbWV0ZXIgZXN0aW1hdGVkIGZvciBgZ2VuZGVyYCwgd2l0aCBtZW4gc2hvd2luZyBzdWJzdGFudGlhbGx5IGhpZ2hlciBgREJQX2FmdGAgdGhhbiB3b21lbiBpbiB0aGUgdXBkYXRlZCBtb2RlbC4gVGh1cywgc2luY2UgYGdlbmRlcmAgaXMgbm90IG91ciBtYWluIGZvY3VzLCB3ZSAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9EQlBfYWZ0Lm5vSW5mbCA8LSB1cGRhdGUobTJfU0JQX2FmdCxkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JElEIT0iUzA4MiIsXSkNCg0KIyBwbG90dGluZyBjb2VmZmljaWVudHMgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnBsb3RfbW9kZWxzKG0yX0RCUF9hZnQsbTJfREJQX2FmdC5ub0luZmwpDQoNCiMgc2hvd2luZyByZWdyZXNzaW9uIHRhYmxlIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQp0YWJfbW9kZWwobTJfREJQX2FmdCxtMl9EQlBfYWZ0Lm5vSW5mbCxkdi5sYWJlbHM9YygiT3JpZ2luYWwiLCJVcGRhdGVkIiksc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSwNCiAgICAgICAgICBzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xLjIuIEV2ZW5pbmcgQlANCg0KU3lzdG9saWMgYFNCUF9ldmVgIGFuZCBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgYERCUF9ldmVgIHJlY29kZWQgaW4gdGhlIGV2ZW5pbmcgYXJlIHByZWRpY3RlZCBieSBjb25jdXJyZW50IHN0YXRlIHdvcmthaG9saXNtIGBXSExTTS5tY2AsIGJ5IHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudCBgUERgLCB0cmFpdCB3b3JrYWhvbGlzbSBgV0hMU00uY21gLCBhbmQgdGhyZWUgY292YXJpYXRlcyBzZWxlY3RlZCBmcm9tIHRoZSBwcmV2aW91cyBzdGVwIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzVdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M1X2Rlc2NyaXB0aXZlcy9TNV9kZXNjcmlwdGl2ZXMtY29kZS1hbmQtb3V0cHV0Lmh0bWwpKSwgbmFtZWx5IGBnZW5kZXJgLCBgYWdlYCwgYW5kIGBCTUlgLiBBIGZ1cnRoZXIgcG90ZW50aWFsIGNvbmZvdW5kZXIgaGlnaGxpZ2h0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCwgbmFtZWx5IGBkYXlgIChpLmUuLCBleHByZXNzaW5nIHRoZSBsaW5lYXIgdGltZSB0cmVuZCBvdmVyIHRoZSBzdHVkeSBwcm90b2NvbCksIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGlzIHBvaW50IHRvIGdldCBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMgYW5kIG1vcmUgY29tcGFyYWJsZSByZXN1bHRzIGFjcm9zcyBCUCBtb2RlbHMsIGFsc28gY29uc2lkZXJpbmcgdGhlIGxhY2sgb2YgbGluZWFyIHRlbXBvcmFsIHRyZW5kcyBpbiBzdGF0ZSBgV0hMU01gIG1lYXN1cmVzIChzZWUgYmVsb3cpLiBQYXJ0aWN1bGFybHksIGFzIHNob3duIGluIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM1XShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TNV9kZXNjcmlwdGl2ZXMvUzVfZGVzY3JpcHRpdmVzLWNvZGUtYW5kLW91dHB1dC5odG1sKSwgc3VjaCBsaW5lYXIgdHJlbmQgaXMgcG9zc2libHkgZHVlIHRvIG1lYXN1cmVtZW50IHJlYWN0aXZpdHkgKGkuZS4sIGluY3JlYXNlZCBwaHlzaW9sb2dpY2FsIGFjdGl2YXRpb24gZHVyaW5nIHRoZSBmaXJzdCAtIGxlc3MgZmFtaWxpYXIgLSBibG9vZCBwcmVzc3VyZSByZWNvcmRpbmdzKSwgYW5kIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBhcyBhIHJvYnVzdG5lc3MgY2hlY2sgaW4gc2VjdGlvbiA0LjIuDQpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTJ9DQptZm9ybXVsYXNbM10gIyBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZvciBTQlBfYWZ0DQptZm9ybXVsYXNbNF0gIyBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZvciBEQlBfYWZ0DQoNCiMgcGxvdHRpbmcgV0hMU00gJiBTQlAgYnkgZGF5DQpwYXIobWZyb3c9YygxLDMpKTsgYm94cGxvdChTQlBfZXZlIH4gZGF5LGRhdGE9Y2xlYW4pOyBib3hwbG90KERCUF9ldmUgfiBkYXksZGF0YT1jbGVhbik7IGJveHBsb3QoV0hMU00gfiBkYXksZGF0YT1jbGVhbikNCg0KIyBtb2RlbCB3ZWlnaHQgYW5kIGVzdGltYXRlZCBwYXJhbWV0ZXIgZm9yIFdITFNNIGJ5IHRpbWUNCm0wIDwtIGxtZXIoV0hMU00gfiAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KbTEgPC0gbG1lcihXSExTTSB+IGRheSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSkpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4yLjEuIERhdGEgcHJlcGFyYXRpb24NCg0KRmlyc3QsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcyBieSByZW1vdmluZyBhbGwgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvciBhbnkgcHJlZGljdG9yIG9yIGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKiksIGJ5IGNlbnRlcmluZyBsZXZlbC0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgZ3JhbmQgbWVhbiAoKipncmFuZC1tZWFuLWNlbnRlcmluZyoqKSwgYW5kIGJ5IGNlbnRlcmluZyBsZXZlbC0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkJQX2V2ZSA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoY2xlYW5CUFssYygiSUQiLCJTQlBfZXZlIiwiREJQX2V2ZSIsICMgZ3JvdXBpbmcgYW5kIGRlcGVuZGVudCB2YXJpYWJsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIsIlBEIiwgIyBjb3JlIHByZWRpY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXRSIsIldDIiwic2xlZXBfZHlzZiIsInBzeV9kcnVncyIsImhvcm1fZHJ1Z3MiLCAjIGZvciByb2J1c3RuZXNzIGNoZWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZvdW5kZXJzX2V2ZSIsImZsYWdCUF9ldmUiLCJmbGFnVGltZSIsImNhcmVsZXNzIiwiZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiIsImNoaWxkcmVuIildKSkgDQpjbGVhbkJQX2V2ZSRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfZXZlJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5CUF9ldmUpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfZXZlJElEKSkpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0Kd2lkZSA8LSBjbGVhbkJQX2V2ZVshZHVwbGljYXRlZChjbGVhbkJQX2V2ZSRJRCksXSAjIHdpZGUtZm9ybSBkYXRhc2V0DQpmb3IoVmFyIGluIGMoIldITFNNIiwiUEQiLCJXRSIsIldDIikpew0KICB3aWRlIDwtIGNiaW5kKHdpZGUsYWdncmVnYXRlKGNsZWFuQlBfZXZlWyxWYXJdLGxpc3QoY2xlYW5CUF9ldmUkSUQpLG1lYW4pWywyXSkgIyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuQlBfZXZlIDwtIGpvaW4oY2xlYW5CUF9ldmUsd2lkZVssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikgIyBqb2luaW5nIHRvIGxvbmctZm9ybSBkZg0KICBjbGVhbkJQX2V2ZVsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuQlBfZXZlWyxWYXJdIC0gY2xlYW5CUF9ldmVbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgbWVhbi1jZW50ZXJlZCBzY29yZXMNCg0KIyBncmFuZC1tZWFuLWNlbnRlcmluZyBsdi0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0KZm9yKFZhciBpbiBjKCJhZ2UiLCJCTUkiLCJXSExTTS5jbSIpKXsgY2xlYW5CUF9ldmVbLHBhc3RlMChWYXIsIi5nbWMiKV0gPC0gY2xlYW5CUF9ldmVbLFZhcl0gLSBtZWFuKHdpZGVbLFZhcl0pIH0NCg0KIyBzaG93aW5nIGRhdGENCmNsZWFuQlBfZXZlWzE6MyxdICMgZmlyc3QgdGhyZWUgcm93cw0KYGBgDQoNCjxicj4NCg0KIyMjIyAzLjEuMi4yLiBNb2RlbCBmaXQgIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpIZXJlLCB3ZSBmaXQgdGhlIG11bHRpbGV2ZWwgbW9kZWxzIHRvIHRoZSBzZWxlY3RlZCBkYXRhIHVzaW5nIHRoZSBkZWZhdWx0IHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoUkVNTCkuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfU0JQX2V2ZSA8LSBsbWVyKFNCUF9ldmUgfiAoMXxJRCksICMgb25seSBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCArIHJlc2lkdWFsIHRlcm0NCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KDQojIG0xOiBjb3ZhcmlhdGVzDQptMV9TQlBfZXZlIDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyAoMXxJRCksICMgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KDQojIG0yOiBzdGF0ZSB3b3JrYWhvbGlzbQ0KbTJfU0JQX2V2ZSA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2V2ZSkNCg0KIyBtMzogaW50ZXJhY3Rpb24NCm0zX1NCUF9ldmUgPC0gbG1lcihTQlBfZXZlIH4gZ2VuZGVyICsgYWdlLmdtYyArIEJNSS5nbWMgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgV0hMU00ubWM6UEQubWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2V2ZSkNCmBgYA0KDQo8YnI+DQoNClRoZSBzYW1lIG1vZGVscyBhcmUgc3BlY2lmaWVkIGZvciBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfREJQX2V2ZSA8LSBsbWVyKERCUF9ldmUgfiAoMXxJRCksICMgb25seSBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCArIHJlc2lkdWFsIHRlcm0NCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KDQojIG0xOiBjb3ZhcmlhdGVzDQptMV9EQlBfZXZlIDwtIGxtZXIoREJQX2V2ZSB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2V2ZSkNCg0KIyBtMjogc3RhdGUgd29ya2Fob2xpc20NCm0yX0RCUF9ldmUgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlLmdtYyArIEJNSS5nbWMgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9ldmUpDQoNCiMgbTM6IGludGVyYWN0aW9ucw0KbTNfREJQX2V2ZSA8LSBsbWVyKERCUF9ldmUgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyBXSExTTS5tYzpQRC5tYyArICgxfElEKSwNCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KYGBgDQoNCkZyb20gdGhlIHByZXZpb3VzIGNodW5rcywgd2Ugc2VlIHRoYXQgYWxsIG1vZGVscyBjb252ZXJnZWQgd2l0aG91dCBwcm9ibGVtcy4gSGVyZSwgd2UgaW5zcGVjdCB0aGUgKipkaWFnbm9zdGljcyoqIChpLmUuLCBub3JtYWxpdHkgb2YgcmVzaWR1YWwgYW5kIHJhbmRvbSBlZmZlY3QgZGlzdHJpYnV0aW9ucywgaG9tb3NjZWRhc3RpY2l0eSwgYW5kIG11bHRpY29sbGluZWFyaXR5KSBvZiB0aGUgbW9zdCBjb21wbGV4IG1vZGVsIGBtM2AuIEluZmx1ZW50aWFsIGNhc2VzIGFyZSBhbmFseXplZCBpbiBhIGRlZGljYXRlZCBzZWN0aW9uIGJlbG93Lg0KDQojIyMjIyBTQlBfZXZlDQoNCk1vZGVsIGBtM19TQlBfZXZlYCBzaG93cyAqKnNvbWUgZGV2aWF0aW9uIGZyb20gbm9ybWFsaXR5KiogZXNwZWNpYWxseSBpbiB0aGUgdXBwZXIgdGFpbCBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc2lkdWFscyBhbmQgYm90aCB0YWlscyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJhbmRvbSBlZmZlY3RzLiBQYXJ0aWN1bGFybHksICoqcGFydGljaXBhbnQgYFMwODJgKiogaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaWdoZXN0IGV4dHJlbWUgZGV2aWF0aW9uIGZyb20gdGhlIGRpc3RyaWJ1dGlvbnMgb2YgcmFuZG9tIGludGVyY2VwdHMsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXMgYSByb2J1c3RuZXNzIGNoZWNrIChzZWUgc2VjdGlvbiA0LjEpLiBCZXNpZGVzIHRoYXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaG9tb3NjZWRzdGljaXR5IGFzc3VtcHRpb24gaG9sZHMgYW5kIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpIHNob3dzIGV4dHJlbWUgdmFsdWVzLCBydWxpbmcgb3V0IHRoZSByaXNrIG9mIG11bHRpY29sbGluZWFyaXR5Lg0KYGBge3IgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eQ0KcCA8LSBwbG90X21vZGVsKG0zX1NCUF9ldmUsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkNCnBbWzJdXSA8LSBwW1syXV0kSUQNCnBsb3RfZ3JpZChwLHRhZ3M9VFJVRSxtYXJnaW49YygwLDAsMCwwKSkNCg0KIyBwYXJ0aWNpcGFudCB3aXRoIGhpZ2hlc3QgcmFuZG9tIGVmZmVjdHMgKGkuZS4sIEJMVVBTKQ0KcmUgPC0gcmFuZWYobTNfU0JQX2V2ZSkkSUQNCmFzLmNoYXJhY3RlcihjbGVhbkJQX3ByZWxxc1t3aGljaChyZSRgKEludGVyY2VwdClgPT1tYXgocmUkYChJbnRlcmNlcHQpYCkpLCJJRCJdKQ0KYGBgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9M30NCiMgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbXVsdGljb2xsaW5lYXJpdHkNCnBhcihtZnJvdz1jKDEsMikpDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtM19TQlBfZXZlKSB+IGNsZWFuQlBfZXZlWyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTNfU0JQX2V2ZSksbWFpbj0iVklGIFZhbHVlcyIseGxpbT1jKDAsMTApLGxhcz0yLGhvcml6PVRSVUUpICMgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpDQphYmxpbmUodiA9IDUsIGx3ZCA9IDUsIGx0eSA9IDIpDQpgYGANCg0KPGJyPg0KDQpIZXJlLCB3ZSBiZXR0ZXIgaW5zcGVjdCB0aGUgcmVzaWR1YWwgZGlzdHJpYnV0aW9uIGFuZCB0aGUgZml0IG9mIG1vZGVscyBzcGVjaWZpZWQgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbHkgZGlzdHJpYnV0aW9ucy4gV2UgY2FuIHNlZSB0aGF0IG5vbmUgb2YgdGhlIGFsdGVybmF0aXZlIGZhbWlsaWVzIHN1YnN0YW50aWFsbHkgYmV0dGVyIGFwcHJveGltYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kZWwgcmVzaWR1YWxzLCB3aXRoIHRoZSAqKmxvZy10cmFuc2Zvcm1lZCoqIHNvbHV0aW9uIChpLmUuLCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbG9nLXRyYW5zZm9ybWVkIGRlcGVuZGVudCB2YXJpYWJsZSkgc2hvd2luZyB0aGUgYmVzdCBmaXQuIFlldCwgaXQgaXMgbm90IHNvIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbCBtb2RlbC4gVGh1cywgd2UgaW5pdGlhbGx5ICoqcmVseSBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbioqIGFuZCB0aGVuIGNvbnNpZGVyIHRoZSAqKmxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIGFzIGEgcm9idXN0bmVzcyBjaGVjayoqIChzZWUgc2VjdGlvbiA0LjEpLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0NCiMgaW5zcGVjdGluZyByZXNpZHVhbCBkaXN0cmlidXRpb24NCmRlc2NkaXN0KHJlc2lkKG0zX1NCUF9ldmUpKSAjIHVua25vd24gYmVzdC1maXQgZGlzdHJpYnV0aW9uDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTN9DQojIGZpdHRpbmcgbW9kZWwgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbGllcw0KbW9kZWxzIDwtIGxpc3QoDQogIG0zX1NCUF9ldmUsDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19TQlBfZXZlKSxmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksZGF0YT1jbGVhbkJQX2V2ZSksICMgZ2FtbWEgbG9nIChkb2Vzbid0IGNvbnZlcmdlKQ0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfU0JQX2V2ZSksZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksZGF0YT1jbGVhbkJQX2V2ZSksICMgZ2FtbWEgaWQgKGRvZXNuJ3QgY29udmVyZ2UpDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19TQlBfZXZlKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhbkJQX2V2ZSksICMgbG9nLW5vcm1hbCAoc2luZ3VsYXIgZml0KQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKFNCUF9ldmUpIH4iLGFzLmNoYXJhY3Rlcihmb3JtdWxhKG0zX1NCUF9ldmUpKVszXSkpLGRhdGE9Y2xlYW5CUF9ldmUpKSAjIGxvZyB0cmFuc2YNCg0KIyBub3JtYWwgUS1RIHBsb3Qgb2YgbW9kZWwgcmVzaWR1YWxzDQpwYXIobWZyb3c9YygxLDUpKQ0KZm9yKGkgaW4gMTpsZW5ndGgobW9kZWxzKSl7IA0KICBxcW5vcm0ocmVzaWQobW9kZWxzW1tpXV0pLG1haW49YygiTm9ybSIsIkdhbW1hLWxvZyIsIkdhbW1hLWlkIiwibG9nLW5vcm0iLCJsb2ctdHJhbnNmIilbaV0pOyBxcWxpbmUocmVzaWQobW9kZWxzW1tpXV0pKX0NCmBgYA0KDQo8YnI+DQoNCiMjIyMjIERCUF9ldmUNCg0KTW9kZWwgYG0zX0RCUF9ldmVgIHNob3dzICoqc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkqKiBpbiBib3RoIHRhaWxzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmVzaWR1YWxzIGFuZCByYW5kb20gZWZmZWN0cy4gUGFydGljdWxhcmx5LCAqKnBhcnRpY2lwYW50IGBTMDgyYCoqIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGlnaGVzdCBleHRyZW1lIGRldmlhdGlvbiBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvdGggcmFuZG9tIGVmZmVjdHMsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXMgYSByb2J1c3RuZXNzIGNoZWNrIChzZWUgc2VjdGlvbiA0LjEpLiBCZXNpZGVzIHRoYXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaG9tb3NjZWRzdGljaXR5IGFzc3VtcHRpb24gaG9sZHMgYW5kIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpIHNob3dzIGV4dHJlbWUgdmFsdWVzLCBydWxpbmcgb3V0IHRoZSByaXNrIG9mIG11bHRpY29sbGluZWFyaXR5Lg0KYGBge3IgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eQ0KcCA8LSBwbG90X21vZGVsKG0zX0RCUF9ldmUsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkNCnBbWzJdXSA8LSBwW1syXV0kSUQNCnBsb3RfZ3JpZChwLHRhZ3M9VFJVRSxtYXJnaW49YygwLDAsMCwwKSkNCg0KIyBwYXJ0aWNpcGFudCB3aXRoIGhpZ2hlc3QgcmFuZG9tIGVmZmVjdHMgKGkuZS4sIEJMVVBTKQ0KcmUgPC0gcmFuZWYobTNfREJQX2V2ZSkkSUQNCnJlW3JlJFdITFNNLm1jPT1tYXgocmUkV0hMU00ubWMpfHJlJGAoSW50ZXJjZXB0KWA9PW1heChyZSRgKEludGVyY2VwdClgKSxdDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkNCmZvcihWYXIgaW4gYygiZ2VuZGVyIikpeyBib3hwbG90KHJlc2lkKG0zX0RCUF9ldmUpIH4gY2xlYW5CUF9ldmVbLFZhcl0sbWFpbj1wYXN0ZSgiUmVzaWR1YWxzIGJ5IixWYXIpKSB9DQpiYXJwbG90KHZpZihtM19EQlBfZXZlKSxtYWluPSJWSUYgVmFsdWVzIix4bGltPWMoMCwxMCksbGFzPTIsaG9yaXo9VFJVRSkgIyB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykNCmFibGluZSh2ID0gNSwgbHdkID0gNSwgbHR5ID0gMikNCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGJldHRlciBpbnNwZWN0IHRoZSByZXNpZHVhbCBkaXN0cmlidXRpb24gYW5kIHRoZSBmaXQgb2YgbW9kZWxzIHNwZWNpZmllZCB3aXRoIGFsdGVybmF0aXZlIGZhbWlseSBkaXN0cmlidXRpb25zLiBXZSBjYW4gc2VlIHRoYXQgbm9uZSBvZiB0aGUgYWx0ZXJuYXRpdmUgZmFtaWxpZXMgYmV0dGVyIGFwcHJveGltYXRlcyB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGVsIHJlc2lkdWFscywgYW5kIG5vbmUgb2YgdGhlbSByZWFjaGVkIGNvbnZlcmdlbmNlLiBUaHVzLCB3ZSBpbml0aWFsbHkgKipyZWx5IG9uIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uKiogYW5kIHRoZW4gY29uc2lkZXIgdGhlICoqZ2FtbWEgbG9nIGFzIGEgcm9idXN0bmVzcyBjaGVjayoqIChpLmUuLCB0aGUgb25seSBzb2x1dGlvbiB0aGF0IGNvbnZlcmdlcykuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTNfREJQX2V2ZSkpICMgdW5rbm93biBiZXN0LWZpdCBkaXN0cmlidXRpb24gYnV0IGNsb3NlIHRvIG5vcm1hbA0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBmaXR0aW5nIG1vZGVsIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWxpZXMNCm1vZGVscyA8LSBsaXN0KA0KICBtM19EQlBfZXZlLA0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfREJQX2V2ZSksZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLGRhdGE9Y2xlYW5CUF9ldmUpLCAjIGdhbW1hIGxvZw0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfREJQX2V2ZSksZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksZGF0YT1jbGVhbkJQX2V2ZSksICMgZ2FtbWEgaWQgKGRvZXNuJ3QgY29udmVyZ2UpDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19EQlBfZXZlKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhbkJQX2V2ZSksICMgbG9nLW5vcm1hbCAoc2luZ3VsYXIgZml0KQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKFNCUF9ldmUpIH4iLGFzLmNoYXJhY3Rlcihmb3JtdWxhKG0yX0RCUF9ldmUpKVszXSkpLGRhdGE9Y2xlYW5CUF9ldmUpKSAjIGxvZyB0ciAoc2luZ3VsYXIpDQoNCiMgbm9ybWFsIFEtUSBwbG90IG9mIG1vZGVsIHJlc2lkdWFscw0KcGFyKG1mcm93PWMoMSw1KSkNCmZvcihpIGluIDE6bGVuZ3RoKG1vZGVscykpeyANCiAgcXFub3JtKHJlc2lkKG1vZGVsc1tbaV1dKSxtYWluPWMoIk5vcm0iLCJHYW1tYS1sb2ciLCJHYW1tYS1pZCIsImxvZy1ub3JtIiwibG9nLXRyYW5zZiIpW2ldKTsgcXFsaW5lKHJlc2lkKG1vZGVsc1tbaV1dKSl9DQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4yLjMuIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkhlcmUsIHdlIGNvbXBhcmUgdGhlIHNwZWNpZmllZCBtb2RlbHMgYmFzZWQgb24gdGhlIEFrYWlrZSB3ZWlnaHQgYW5kIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgKHdpdGggdHlwZS1JIGVycm9yIHNldCB0byAqcCogPCAuMDUpLCBhbmQgd2UgaW5zcGVjdCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwocykuIA0KDQojIyMjIyBTQlBfZXZlDQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBzdHJvbmdlciBldmlkZW5jZSBvciBzaWduaWZpY2FudCBsaWtlbGlob29kIHJhdGlvIGNvbXBhcmVkIHRvIG1vZGVscyBpbmNsdWRpbmcgbGVzcyBwcmVkaWN0b3JzIChBdyA9IC4zMywgJFxjaGleMiQoMSkgPSAwLjU4LCAqcCogPSAuNDQpLiBTaW1pbGFyLCB0aGUgaW50ZXJhY3Rpb24gZG9lcyBub3QgaW1wbHkgc3Ryb25nZXIgZXZpZGVuY2Ugb3Igc2lnbmlmaWNhbnQgbGlrZWxpaG9vZCByYXRpbyAoQXcgPSAuMTEsICRcY2hpXjIkKDEpID0gMC42NSwgKnAqID0gLjQyKS4NCmBgYHtyIH0NCiMgQWthaWtlIHdlaWdodCBhZGRpbmcgb25lIG1vZGVsIGF0IHRpbWUNCldlaWdodHMoQUlDKG0wX1NCUF9ldmUsbTFfU0JQX2V2ZSkpICMgY292YXJpYXRlczogYmV0dGVyDQpXZWlnaHRzKEFJQyhtMF9TQlBfZXZlLG0xX1NCUF9ldmUsbTJfU0JQX2V2ZSkpICMgc3RhdGUgd29ya2Fob2xpc206IHdvcnNlDQpXZWlnaHRzKEFJQyhtMF9TQlBfZXZlLG0xX1NCUF9ldmUsbTJfU0JQX2V2ZSxtM19TQlBfZXZlKSkgIyBpbnRlcmFjdGlvbjogd29yc2UNCg0KIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgd2l0aCBtMy5SRGV0DQphbm92YShtMV9TQlBfZXZlLG0yX1NCUF9ldmUsbTNfU0JQX2V2ZSkgIyBiZXN0IG1vZGVsIGlzIG0xDQpgYGANCg0KPGJyPg0KDQpIZXJlLCB3ZSBpbnNwZWN0IHRoZSBjb2VmZmljaWVudHMgZXN0aW1hdGVkIGJ5IHRoZSBzZWxlY3RlZCBtb2RlbCBgbTEuYmlzYCBhbmQgdGhvc2UgZXN0aW1hdGVkIGJ5IHRoZSB0YXJnZXQgbW9kZWxzLiBXZSBjYW4gc2VlIHRoYXQgc3RhdGUgYFdITFNNLm1jYCBpcyBub3Qgc3Vic3RhbnRpYWxseSByZWxhdGVkIHRvIGBCUF9ldmVgLCBzaW1pbGFyIHRvIHRyYWl0IGBXSExTTS5jbS5nbWNgIGlzIG5vdC4gQW1vbmcgdGhlIGluY2x1ZGVkIGNvdmFyaWF0ZXMsIGBhZ2VgLCBgQk1JYCwgYW5kIGxvdyBgUERgIHByZWRpY3QgaGlnaGVyIGBTQlBfZXZlYC4NCmBgYHtyIGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NH0NCiMgcmVncmVzc2lvbiB0YWJsZQ0KdGFiX21vZGVsKG0xX1NCUF9ldmUsbTJfU0JQX2V2ZSxtM19TQlBfZXZlLA0KICAgICAgICAgIGR2LmxhYmVscz1jKCJDb3ZhcmlhdGVzIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gbW9kZWwgbTINCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0yX1NCUF9ldmUsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLmNtLmdtYyIpLCAjIHRyYWl0IFdITFNNDQogICAgICAgICAgICAgcGxvdF9tb2RlbChtMl9TQlBfZXZlLHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5tYyIpLG5yb3c9MSkgIyBzdGF0ZSBXSExTTQ0KDQojIHBsb3R0aW5nIGludGVyYWN0aW9ucw0Kc2QoY2xlYW5CUF9ldmUkUEQubWMpICMgUkRldDogMSBTRCA9IDEuMzgNCnBsb3RfbW9kZWwobTNfU0JQX2V2ZSx0eXBlPSJwcmVkIix0ZXJtcz1jKCJXSExTTS5tYyIsIlBELm1jIFstMS4zOCwxLjM4XSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2V2ZQ0KDQpSZXN1bHRzIGFyZSAqKnNpbWlsYXIgdG8gdGhvc2UgZm91bmQgZm9yIGBTQlBfZXZlYCoqOiB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIChBdyA9IC42OCkgYnV0IG5vdCB3aXRoIHNpZ25pZmljYW50IGxpa2VsaWhvb2QgcmF0aW8gY29tcGFyZWQgdG8gbW9kZWxzIGluY2x1ZGluZyBsZXNzIHByZWRpY3RvcnMgKCRcY2hpXjIkKDEpID0gMy43MSwgKnAqID0gLjA1KS4gU2ltaWxhciwgdGhlIGludGVyYWN0aW9uIGRvZXMgbm90IGltcGx5IHN0cm9uZ2VyIGV2aWRlbmNlIG9yIHNpZ25pZmljYW50IGxpa2VsaWhvb2QgcmF0aW8gKEF3ID0gLjE0LCAkXGNoaV4yJCgxKSA9IDAuMDEsICpwKiA9IC45OSkuDQpgYGB7ciB9DQojIEFrYWlrZSB3ZWlnaHQgYWRkaW5nIG9uZSBtb2RlbCBhdCB0aW1lDQpXZWlnaHRzKEFJQyhtMF9EQlBfZXZlLG0xX0RCUF9ldmUpKSAjIGNvdmFyaWF0ZXM6IGJldHRlcg0KV2VpZ2h0cyhBSUMobTBfREJQX2V2ZSxtMV9EQlBfZXZlLG0yX0RCUF9ldmUpKSAjIHN0YXRlIHdvcmthaG9saXNtOiBiZXR0ZXINCldlaWdodHMoQUlDKG0wX0RCUF9ldmUsbTFfREJQX2V2ZSxtMl9EQlBfZXZlLG0zX0RCUF9ldmUpKSAjIHN0YXRlIHdobHNtIGJ5IGRldGFjaG1lbnQ6IHdvcnNlDQoNCiMgTGlrZWxpaG9vZCByYXRpbyB0ZXN0IHdpdGggbTMNCmFub3ZhKG0xX0RCUF9ldmUsbTJfREJQX2V2ZSxtM19EQlBfZXZlKSAjIGJlc3QgbW9kZWwgaXMgbTENCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIGNvZWZmaWNpZW50cyBlc3RpbWF0ZWQgYnkgdGhlIG1vZGVscyBzcGVjaWZpZWQgZm9yIGBEQlBfZXZlYC4gV2UgY2FuIHNlZSB0aGF0IHN0YXRlIGBXSExTTS5tY2AgaXMgbm90IHN1YnN0YW50aWFsbHkgcmVsYXRlZCB0byBgREJQX2V2ZWAuIEFtb25nIHRoZSBpbmNsdWRlZCBjb3ZhcmlhdGVzLCBgYWdlYCBhbmQgYEJNSWAgcHJlZGljdCBoaWdoZXIgYFNCUF9ldmVgLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVncmVzc2lvbiB0YWJsZQ0KdGFiX21vZGVsKG0xX0RCUF9ldmUsbTJfREJQX2V2ZSxtM19EQlBfZXZlLA0KICAgICAgICAgIGR2LmxhYmVscz1jKCJDb3ZhcmlhdGVzIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gbW9kZWwgbTINCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0yX1NCUF9ldmUsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLmNtLmdtYyIpLCAjIHRyYWl0IFdITFNNDQogICAgICAgICAgICAgcGxvdF9tb2RlbChtMl9TQlBfZXZlLHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5tYyIpLG5yb3c9MSkgIyBzdGF0ZSBXSExTTQ0KDQojIHBsb3R0aW5nIGludGVyYWN0aW9ucw0Kc2QoY2xlYW5CUF9ldmUkUEQubWMpICMgUkRldDogMSBTRCA9IDEuMzgNCnBsb3RfbW9kZWwobTNfREJQX2V2ZSx0eXBlPSJwcmVkIix0ZXJtcz1jKCJXSExTTS5tYyIsIlBELm1jIFstMS4zOCwxLjM4XSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyAzLjEuMi40LiBJbmZsdWVudGlhbCBjYXNlcw0KDQpIZXJlLCB3ZSBldmFsdWF0ZSB0aGUgcHJlc2VuY2Ugb2YgaW5mbHVlbnRpYWwgY2FzZXMgaW4gdGhlIHRhcmdldCBtb2RlbCBgbTJgLiBTcGVjaWZpY2FsbHksIHRoZSAqKkNvb2vigJlzIGRpc3RhbmNlKiogaXMgY29uc2lkZXJlZCBhcyB0aGUgbWFpbiBtZWFzdXJlIG9mIGluZGl2aWR1YWwtbGV2ZWwgKGkuZS4sIHBhcnRpY2lwYW50KSBpbmZsdWVuY2Ugb24gdGhlIGVzdGltYXRlZCBwYXJhbWV0ZXJzLCBhbmQgaXQgaXMgcmVjb21wdXRlZCBieSBwcm9ncmVzc2l2ZWx5IGV4Y2x1ZGluZyB0aGUgbW9zdCBpbmZsdWVudGlhbCBwYXJ0aWNpcGFudHMgKGkuZS4sIGJhc2VkIG9uIHRoZSBydWxlLW9mLXRodW1iIG9mIDQvTikgdW50aWwgYWxsIGV4dHJlbWUgdmFsdWVzIGFyZSByZW1vdmVkLg0KDQojIyMjIyAzLjEuMi40LjEuIENvb2sncyBkaXN0YW5jZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMjIFNCUF9ldmUNCg0KV2UgY2FuIHNlZSB0aGF0IHBhcnRpY2lwYW50cyBgUzA4MmAgYW5kIGBTMDk2YCBhcmUgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuIE5vdGUgdGhhdCB0aGUgbGF0dGVyIGlzIHRoZSBzYW1lIHBhcnRpY2lwYW50cyBzaG93aW5nIHRoZSBtb3N0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIHJhbmRvbSBlZmZlY3RzIChzZWUgc2VjdGlvbiAzLjMuMikuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTJfU0JQX2V2ZSwiSUQiKQ0KcGxvdChpbmZsLHdoaWNoPSJjb29rIixjdXRvZmY9NC9ubGV2ZWxzKGNsZWFuQlBfZXZlJElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBsaXN0KA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfU0JQX2V2ZSwiSUQiLCJTMDgyIiksIklEIiksDQogIGluZmx1ZW5jZShleGNsdWRlLmluZmx1ZW5jZShtMl9TQlBfZXZlLCJJRCIsYygiUzA4MiIsIlMwOTYiKSksIklEIikpDQpmb3IoaSBpbiAxOmxlbmd0aChpbmZsKSl7IA0KICBwbG90KGluZmxbW2ldXSx3aGljaD0iY29vayIsY3V0b2ZmPTQvKG5sZXZlbHMoY2xlYW5CUF9ldmUkSUQpLWkpLHhsYWI9IkNvb2sgZGlzdGFuY2UiLHlsYWI9IklEIixzb3J0PVRSVUUpIH0NCmBgYA0KDQo8YnI+DQoNCiMjIyMjIyBEQlBfZXZlDQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudHMgYFMwODJgIGFuZCBgUzA4MGAgaXMgYSBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlLiBOb3RlIHRoYXQgdGhlIGZvcm1lciBpcyB0aGUgc2FtZSBwYXJ0aWNpcGFudCBzaG93aW5nIHRoZSBtb3N0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIHJhbmRvbSBlZmZlY3RzIChzZWUgc2VjdGlvbiAzLjMuMikuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgY29vaydzIGRpc3RhbmNlIG9uIHRoZSB3aG9sZSBzYW1wbGUNCmluZmwgPC0gaW5mbHVlbmNlKG0yX0RCUF9ldmUsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhbkJQX2V2ZSRJRCkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkNCg0KIyBwcm9ncmVzc2l2ZWx5IGV4Y2x1ZGluZyBwYXJ0aWNpcGFudHMNCmluZmwgPC0gbGlzdChpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfREJQX2V2ZSwiSUQiLCJTMDgyIiksIklEIiksDQogICAgICAgICAgICAgaW5mbHVlbmNlKGV4Y2x1ZGUuaW5mbHVlbmNlKG0yX0RCUF9ldmUsIklEIixjKCJTMDgyIiwiUzA4MCIpKSwiSUQiKSkNCmZvcihpIGluIDE6bGVuZ3RoKGluZmwpKXsgDQogIHBsb3QoaW5mbFtbaV1dLHdoaWNoPSJjb29rIixjdXRvZmY9NC8obmxldmVscyhjbGVhbkJQX2V2ZSRJRCktaSkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkgfQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgMy4xLjIuNC4yLiBDb2VmZmljaWVudCBjaGFuZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBTQlBfZXZlDQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBhZnRlciB0aGUgcmVtb3ZhbCBvZiBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlcy4gV2UgY2FuIHNlZSB0aGF0IHRoZSBjb2VmZmljaWVudHMgZXN0aW1hdGVkIGJ5IHRoZSB1cGRhdGVkIG1vZGVsIGRvIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBmcm9tIHRob3NlIGVzdGltYXRlZCBieSB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGNob29zZSB0byAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9TQlBfZXZlLm5vSW5mbCA8LSB1cGRhdGUobTJfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfZXZlWyFjbGVhbkJQX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA5NiIpLF0pDQoNCiMgcGxvdHRpbmcgY29lZmZpY2llbnRzIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQpwbG90X21vZGVscyhtMl9TQlBfZXZlLG0yX1NCUF9ldmUubm9JbmZsKQ0KDQojIHNhbWUgdGhpbmcgd2l0aCBpbnRlcmFjdGlvbnMNCm0zX0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtM19TQlBfZXZlLGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSkNCnBsb3RfbW9kZWxzKG0zX1NCUF9ldmUsbTNfREJQX2V2ZS5ub0luZmwpDQoNCiMgc2hvd2luZyByZWdyZXNzaW9uIHRhYmxlIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQp0YWJfbW9kZWwobTJfU0JQX2V2ZSxtMl9TQlBfZXZlLm5vSW5mbCxkdi5sYWJlbHM9YygiT3JpZ2luYWwiLCJVcGRhdGVkIiksc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSwNCiAgICAgICAgICBzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQpgYGANCg0KPGJyPg0KDQojIyMjIyMgREJQX2V2ZQ0KDQpIZXJlLCB3ZSBpbnNwZWN0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5nZXMgaW4gdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMgYWZ0ZXIgdGhlIHJlbW92YWwgb2YgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuIFdlIGNhbiBzZWUgdGhhdCB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGVkIGZvciBzdGF0ZSBgV0hMU00ubWNgIGJ5IHRoZSB1cGRhdGVkIG1vZGVsIGlzIHN0cm9uZ2x5IHJlZHVjZWQuIFRodXMsIHRoZXNlIHJlc3VsdHMgKipxdWVzdGlvbiB0aGUgZ2VuZXJhbGl6YWJpbGl0eSBvZiB0aGUgZXN0aW1hdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGBXSExTTS5tY2AgYW5kIGBEQlBfZXZlYCoqLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVmaXR0aW5nIG1vZGVsIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCm0yX0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtMl9TQlBfZXZlLGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwODIiLCJTMDgwIiksXSkNCg0KIyBwbG90dGluZyBjb2VmZmljaWVudHMgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnBsb3RfbW9kZWxzKG0yX0RCUF9ldmUsbTJfREJQX2V2ZS5ub0luZmwpDQoNCiMgc2FtZSB0aGluZyB3aXRoIGludGVyYWN0aW9uDQptM19EQlBfZXZlLm5vSW5mbCA8LSB1cGRhdGUobTNfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfZXZlWyFjbGVhbkJQX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0pDQpwbG90X21vZGVscyhtM19EQlBfZXZlLG0zX0RCUF9ldmUubm9JbmZsKQ0KDQojIHNob3dpbmcgcmVncmVzc2lvbiB0YWJsZSBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KdGFiX21vZGVsKG0yX0RCUF9ldmUsbTJfREJQX2V2ZS5ub0luZmwsZHYubGFiZWxzPWMoIk9yaWdpbmFsIiwiVXBkYXRlZCIpLHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsDQogICAgICAgICAgc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMS4zLiBNZWRpYXRpb24gey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkluIGxpZ2h0IG9mIHRoZSByZWxhdGlvbnNoaXBzIGZvdW5kIGJldHdlZW4gc3RhdGUgd29ya2Fob2xpc20gYW5kIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZSwgYW5kIHRoZSBzdWJzdGFudGlhbCBjb3JyZWxhdGlvbiBmb3VuZCBiZXR3ZWVuIGFmdGVybm9vbiBhbmQgZXZlbmluZyBibG9vZCBwcmVzc3VyZSwgaGVyZSB3ZSBleHBsb3JlIHRoZSBtZWRpYXRpbmcgcGF0aHMgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgbGF0ZXIgYmxvb2QgcHJlc3N1cmUgbWVhc3VyZW1lbnRzIGJ5IGV2YWx1YXRpbmcgdGhlIHBvdGVudGlhbCBtZWRpYXRpbmcgcm9sZSBvZiBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUuIFRoaXMgaXMgZG9uZSBieSBjb25zaWRlcmluZyB0aGUgc2FtZSBjb3ZhcmlhdGVzIGluY2x1ZGVkIGFib3ZlLCBuYW1lbHkgYGdlbmRlcmAsIGBhZ2VgLCBgQk1JYCwgYFBEYCwgYW5kIHRyYWl0IGBXSExTTS5jbWAuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KG1lZGlhdGlvbikgIyBsb2RpbmcgbWVkaWF0aW9uIHBhY2thZ2UNCmBgYA0KDQpgYGB7ciB9DQojIGRhdGEgcHJlcGFyYXRpb24gKGxpc3Qtd2lzZSBkZWxldGlvbiBhbmQgbWVhbiBjZW50ZXJpbmcpDQpjbGVhbkJQX21lZF9ldmUgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGNsZWFuQlBbLGMoIklEIiwiU0JQX2FmdCIsIkRCUF9hZnQiLCJTQlBfZXZlIiwiREJQX2V2ZSIsICMgZ3JvdXBpbmcgYW5kIHJlc3BvbnNlIHZhcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIsIlBEIiwgIyBjb3JlIHByZWRpY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXRSIsIldDIiwic2xlZXBfZHlzZiIsInBzeV9kcnVncyIsImhvcm1fZHJ1Z3MiLCAjIGZvciByb2J1c3RuZXNzIGNoZWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZvdW5kZXJzX2FmdCIsImNvbmZvdW5kZXJzX2V2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ0JQX2FmdCIsImZsYWdCUF9ldmUiLCJmbGFnVGltZSIsImNhcmVsZXNzIiwiZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbiIsInBvc2l0aW9uIildKSkgDQpjbGVhbkJQX21lZF9ldmUkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX21lZF9ldmUkSUQpKSAjIHJlc2V0dGluZyBwYXJ0aWNpcGFudCBpZGVudGlmaWVyIGxldmVscw0Kd2lkZSA8LSBjbGVhbkJQX21lZF9ldmVbIWR1cGxpY2F0ZWQoY2xlYW5CUF9tZWRfZXZlJElEKSxdICMgd2lkZS1mb3JtIGRhdGFzZXQNCmZvcihWYXIgaW4gYygiV0hMU00iLCJQRCIsIlNCUF9hZnQiLCJEQlBfYWZ0IiwiV0UiLCJXQyIpKXsNCiAgd2lkZSA8LSBjYmluZCh3aWRlLGFnZ3JlZ2F0ZShjbGVhbkJQX21lZF9ldmVbLFZhcl0sbGlzdChjbGVhbkJQX21lZF9ldmUkSUQpLG1lYW4pWywyXSkgIyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuQlBfbWVkX2V2ZSA8LSBqb2luKGNsZWFuQlBfbWVkX2V2ZSx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgdG8gbG9uZy1mb3JtIGRmDQogIGNsZWFuQlBfbWVkX2V2ZVsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuQlBfbWVkX2V2ZVssVmFyXSAtIGNsZWFuQlBfbWVkX2V2ZVsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KZm9yKFZhciBpbiBjKCJhZ2UiLCJCTUkiLCJXSExTTS5jbSIpKXsgY2xlYW5CUF9tZWRfZXZlWyxwYXN0ZTAoVmFyLCIuZ21jIildIDwtIGNsZWFuQlBfbWVkX2V2ZVssVmFyXSAtIG1lYW4od2lkZVssVmFyXSkgfSAjIGdtYw0KY2F0KCJDb25zaWRlcmluZyIsbnJvdyhjbGVhbkJQX21lZF9ldmUpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfbWVkX2V2ZSRJRCkpKSwicGFydGljaXBhbnRzIikNCmBgYA0KDQo8YnI+DQoNCldlIGNhbiBzZWUgdGhhdCBhIHNpZ25pZmljYW50IGluZGlyZWN0IGVmZmVjdCBpcyBlc3RpbWF0ZWQgaW4gYm90aCBjYXNlcywgd2hlcmVhcyB0aGUgZGlyZWN0IGVmZmVjdCBpcyBub3Qgc2lnbmlmaWNhbnQgZm9yIGJvdGggc3lzdG9saWMgYW5kIGRpYXN0b2xpYyBibG9vZCBwcmVzc3VyZS4gUmVzdWx0cyBhcmUgY29uc2lzdGVudCBhZnRlciB0aGUgcmVtb3ZhbCBvZiBpbmZsdWVudGlhbCBjYXNlcy4NCg0KIyMjIyBTQlBfZXZlDQpgYGB7ciB9DQojIG91dHB1dCBhbmQgbWVkaWF0aW9uIG1vZGVscw0KbU91dF9TQlBfZXZlIDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyBXSExTTS5tYyArIFNCUF9hZnQubWMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgKDF8SUQpLGRhdGE9Y2xlYW5CUF9tZWRfZXZlKQ0KbU1lZF9TQlBfZXZlIDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyBXSExTTS5tYyArIA0KICAgICAgICAgICAgICAgICAgICAgICAoMXxJRCksZGF0YT1jbGVhbkJQX21lZF9ldmUpDQoNCiMgbWVkaWF0aW9uIHJlc3VsdHMNCk5TSU0gPC0gMTAwMDANCm1lZF9TQlBfZXZlIDwtIG1lZGlhdGlvbjo6bWVkaWF0ZShtb2RlbC5tPW1NZWRfU0JQX2V2ZSxtb2RlbC55PW1PdXRfU0JQX2V2ZSx0cmVhdD0iV0hMU00ubWMiLG1lZGlhdG9yPSJTQlBfYWZ0Lm1jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1jbGVhbkJQX21lZF9ldmVbLGMoImdlbmRlciIsImFnZS5nbWMiLCJCTUkuZ21jIiwiUEQubWMiLCJXSExTTS5jbS5nbWMiKV0sDQogICAgICAgICAgICAgICAgICAgICAgIGJvb3Q9RkFMU0Usc2ltcz1OU0lNKSAjIHF1YXNpLUJheWVzaWFuIENJDQpzdW1tYXJ5KG1lZF9TQlBfZXZlKSAjIHNpZ25pZmljYW50IGluZGlyZWN0IGVmZmVjdA0KDQojIG1lZGlhdGlvbiByZXN1bHRzIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCm1PdXRfU0JQX2V2ZS5ub0luZmwgPC0gdXBkYXRlKG1PdXRfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfbWVkX2V2ZVshY2xlYW5CUF9tZWRfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSkNCm1NZWRfU0JQX2V2ZS5ub0luZmwgPC0gdXBkYXRlKG1NZWRfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfbWVkX2V2ZVshY2xlYW5CUF9tZWRfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSkNCm1lZF9TQlBfZXZlLm5vSW5mbCA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkX1NCUF9ldmUubm9JbmZsLG1vZGVsLnk9bU91dF9TQlBfZXZlLm5vSW5mbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWF0PSJXSExTTS5tYyIsbWVkaWF0b3I9IlNCUF9hZnQubWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA5NiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiZ2VuZGVyIiwiYWdlLmdtYyIsIkJNSS5nbWMiLCJQRC5tYyIsIldITFNNLmNtLmdtYyIpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3Q9RkFMU0Usc2ltcz1OU0lNKSAjIHF1YXNpLUJheWVzaWFuIENJDQpzdW1tYXJ5KG1lZF9TQlBfZXZlLm5vSW5mbCkgIyBpbmRpcmVjdCBlZmZlY3Qgc3RheXMgc2lnbmlmaWNhbnQNCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2V2ZQ0KYGBge3IgfQ0KIyBvdXRwdXQgYW5kIG1lZGlhdGlvbiBtb2RlbHMNCm1PdXRfREJQX2V2ZSA8LSBsbWVyKERCUF9ldmUgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyBEQlBfYWZ0Lm1jICsgDQogICAgICAgICAgICAgICAgICAgICAgICgxfElEKSxkYXRhPWNsZWFuQlBfbWVkX2V2ZSkNCm1NZWRfREJQX2V2ZSA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgKDF8SUQpLGRhdGE9Y2xlYW5CUF9tZWRfZXZlKQ0KDQojIG1lZGlhdGlvbiByZXN1bHRzDQptZWRfREJQX2V2ZSA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkX0RCUF9ldmUsbW9kZWwueT1tT3V0X0RCUF9ldmUsdHJlYXQ9IldITFNNLm1jIixtZWRpYXRvcj0iREJQX2FmdC5tYyIsDQogICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXM9Y2xlYW5CUF9tZWRfZXZlWyxjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIlBELm1jIiwiV0hMU00uY20uZ21jIildLA0KICAgICAgICAgICAgICAgICAgICAgICBib290PUZBTFNFLHNpbXM9TlNJTSkgIyBxdWFzaS1CYXllc2lhbiBDSQ0Kc3VtbWFyeShtZWRfREJQX2V2ZSkgIyBzaWduaWZpY2FudCBpbmRpcmVjdCBlZmZlY3QNCg0KIyBtZWRpYXRpb24gcmVzdWx0cyB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptT3V0X0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtT3V0X0RCUF9ldmUsZGF0YT1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0pDQptTWVkX0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtTWVkX0RCUF9ldmUsZGF0YT1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0pDQptZWRfREJQX2V2ZS5ub0luZmwgPC0gbWVkaWF0aW9uOjptZWRpYXRlKG1vZGVsLm09bU1lZF9EQlBfZXZlLm5vSW5mbCxtb2RlbC55PW1PdXRfREJQX2V2ZS5ub0luZmwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdD0iV0hMU00ubWMiLG1lZGlhdG9yPSJEQlBfYWZ0Lm1jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXM9Y2xlYW5CUF9tZWRfZXZlWyFjbGVhbkJQX21lZF9ldmUkSUQlaW4lYygiUzA4MiIsIlMwODAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImdlbmRlciIsImFnZS5nbWMiLCJCTUkuZ21jIiwiUEQubWMiLCJXSExTTS5jbS5nbWMiKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290PUZBTFNFLHNpbXM9TlNJTSkgIyBxdWFzaS1CYXllc2lhbiBDSQ0Kc3VtbWFyeShtZWRfREJQX2V2ZS5ub0luZmwpICMgaW5kaXJlY3QgZWZmZWN0IHN0YXlzIHNpZ25pZmljYW50DQpgYGANCg0KPGJyPg0KDQojIyAzLjIuIEVtb3Rpb25hbCBFeGhhdXN0aW9uDQoNCkVtb3Rpb25hbCBleGhhdXN0aW9uIGBFRWAgcmF0ZWQgaW4gdGhlIGV2ZW5pbmcgaXMgcHJlZGljdGVkIGJ5IHN0YXRlIHdvcmthaG9saXNtIGBXSExTTS5tY2AsIGluIGFkZGl0aW9uIHRvIHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudCBgUERgLCB0cmFpdCB3b3JrYWhvbGlzbSBgV0hMU00uY21gLCBhbmQgb25lIGNvdmFyaWF0ZSBzZWxlY3RlZCBmcm9tIHRoZSBwcmV2aW91cyBzdGVwIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzVdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M1X2Rlc2NyaXB0aXZlcy9TNV9kZXNjcmlwdGl2ZXMtY29kZS1hbmQtb3V0cHV0Lmh0bWwpKSwgbmFtZWx5IGBnZW5kZXJgLg0KYGBge3IgIH0NCm1mb3JtdWxhc1s1XSAjIGNvdmFyaWF0ZXMgc2VsZWN0ZWQgZm9yIEVFDQpgYGANCg0KPGJyPg0KDQojIyMgMy4yLjEuIERhdGEgcHJlcGFyYXRpb24NCg0KRmlyc3QsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcyBieSByZW1vdmluZyBhbGwgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvciBhbnkgcHJlZGljdG9yIG9yIGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKiksIGJ5IGNlbnRlcmluZyBsZXZlbC0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgZ3JhbmQgbWVhbiAoKipncmFuZC1tZWFuLWNlbnRlcmluZyoqKSwgYW5kIGJ5IGNlbnRlcmluZyBsZXZlbC0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkVFIDwtIGFzLmRhdGEuZnJhbWUobmEub21pdChjbGVhblssYygiSUQiLCJFRSIsImdlbmRlciIsIlBEIiwiV0hMU00iLCAjIGNvcmUgdmFyaWFibGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0UiLCJXQyIsImZsYWdUaW1lIiwiY2FyZWxlc3MiLCJkYXkiLCAjIGZvciByb2J1c3RuZXNzIGNoZWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uIiwiY2hpbGRyZW4iKV0pKSANCmNsZWFuRUUkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkVFJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5FRSksImNvbXBsZXRlIG9ic2VydmF0aW9ucyBmcm9tIixubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5FRSRJRCkpKSwicGFydGljaXBhbnRzIikNCg0KIyBwZXJzb24tbWVhbi1jZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIHByZWRpY3RvcnMNCndpZGUgPC0gY2xlYW5FRVshZHVwbGljYXRlZChjbGVhbkVFJElEKSxdICMgd2lkZS1mb3JtIGRhdGFzZXQNCmZvcihWYXIgaW4gYygiUEQiLCJXSExTTSIsIldFIiwiV0MiKSl7DQogIHdpZGUgPC0gY2JpbmQod2lkZSxhZ2dyZWdhdGUoY2xlYW5FRVssVmFyXSxsaXN0KGNsZWFuRUUkSUQpLG1lYW4pWywyXSkgIyBjb21wdXRpbmcgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyh3aWRlKVtuY29sKHdpZGUpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhbkVFIDwtIGpvaW4oY2xlYW5FRSx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgd2l0aCBsb25nLWZvcm0gZGF0YQ0KICBjbGVhbkVFWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5FRVssVmFyXSAtIGNsZWFuRUVbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgY29tcHV0aW5nIG1lYW4tY2VudGVyZWQgc2NvcmVzDQoNCiMgZ3JhbmQtbWVhbi1jZW50ZXJpbmcgbHYtMiBjb250aW51b3VzIHByZWRpY3RvcnMNCmZvcihWYXIgaW4gYygiV0hMU00uY20iKSl7IGNsZWFuRUVbLHBhc3RlMChWYXIsIi5nbWMiKV0gPC0gY2xlYW5FRVssVmFyXSAtIG1lYW4od2lkZVssVmFyXSkgfQ0KDQojIHNob3dpbmcgZGF0YQ0KY2xlYW5FRVsxOjMsXSAjIGZpcnN0IHRocmVlIHJvd3MNCmBgYA0KDQo8YnI+DQoNCiMjIyAzLjIuMi4gTW9kZWwgZml0IA0KDQpIZXJlLCB3ZSBmaXQgdGhlIG11bHRpbGV2ZWwgbW9kZWxzIHRvIHRoZSBzZWxlY3RlZCBkYXRhIHVzaW5nIHRoZSBkZWZhdWx0IHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoUkVNTCkuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfRUUgPC0gbG1lcihFRSB+ICgxfElEKSwgIyBvbmx5IGZpeGVkIGFuZCByYW5kb20gaW50ZXJjZXB0ICsgcmVzaWR1YWwgdGVybQ0KICAgICAgICAgICAgICBkYXRhPWNsZWFuRUUpDQoNCiMgbTE6IGNvdmFyaWF0ZXMNCm0xX0VFIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArICgxfElEKSwgIyBjb3ZhcmlhdGVzICsgcmVjb3ZlcnkgZXhwDQogICAgICAgICAgICAgIGRhdGE9Y2xlYW5FRSkNCg0KIyBtMjogc3RhdGUgd29ya2Fob2xpc20NCm0yX0VFIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICBkYXRhPWNsZWFuRUUpDQoNCiMgbTM6IGludGVyYWN0aW9ucw0KbTNfRUUgPC0gbG1lcihFRSB+IGdlbmRlciArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyBXSExTTS5tYyArIFdITFNNLm1jOlBELm1jICsgKDF8SUQpLCANCiAgICAgICAgICAgICAgZGF0YT1jbGVhbkVFKQ0KYGBgDQoNCkZyb20gdGhlIHByZXZpb3VzIGNodW5rLCB3ZSBzZWUgdGhhdCBhbGwgbW9kZWxzIGNvbnZlcmdlZCB3aXRob3V0IHByb2JsZW1zLiBIZXJlLCB3ZSBpbnNwZWN0IHRoZSAqKmRpYWdub3N0aWNzKiogKGkuZS4sIG5vcm1hbGl0eSBvZiByZXNpZHVhbCBhbmQgcmFuZG9tIGVmZmVjdCBkaXN0cmlidXRpb25zLCBob21vc2NlZGFzdGljaXR5LCBhbmQgbXVsdGljb2xsaW5lYXJpdHkpIG9mIHRoZSBtb3N0IGNvbXBsZXggbW9kZWwgYG0zYC4gSW5mbHVlbnRpYWwgY2FzZXMgYXJlIGFuYWx5emVkIGluIGEgZGVkaWNhdGVkIHNlY3Rpb24gYmVsb3cuDQoNCk1vZGVsIGBtM2Agc2hvd3MgKipzb21lIGRldmlhdGlvbiBmcm9tIG5vcm1hbGl0eSoqIGluIGJvdGggdGFpbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiByZXNpZHVhbHMgYW5kIGJvdGggcmFuZG9tIGVmZmVjdHMuIEJlc2lkZXMgdGhhdCwgd2UgY2FuIHNlZSB0aGF0IHRoZSBob21vc2NlZHN0aWNpdHkgYXNzdW1wdGlvbiBob2xkcyBhbmQgdGhhdCBub25lIG9mIHRoZSB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykgc2hvd3MgZXh0cmVtZSB2YWx1ZXMsIHJ1bGluZyBvdXQgdGhlIHJpc2sgb2YgbXVsdGljb2xsaW5lYXJpdHkuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0NCiMgbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5DQpwIDwtIHBsb3RfbW9kZWwobTNfRUUsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkgDQpwW1syXV0gPC0gcFtbMl1dJElEDQpwbG90X2dyaWQocCx0YWdzPVRSVUUsbWFyZ2luPWMoMCwwLDAsMCkpDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkgDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtM19FRSkgfiBjbGVhbkVFWyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTNfRUUpLG1haW49IlZJRiBWYWx1ZXMiLHhsaW09YygwLDEwKSxsYXM9Mixob3Jpej1UUlVFKSAjIHZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3JzIChWSUZzKQ0KYWJsaW5lKHYgPSA1LCBsd2QgPSA1LCBsdHkgPSAyKQ0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgYmV0dGVyIGluc3BlY3QgdGhlIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGZpdCBvZiBtb2RlbHMgc3BlY2lmaWVkIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWx5IGRpc3RyaWJ1dGlvbnMuIFdlIGNhbiBzZWUgdGhhdCBhbHRlcm5hdGl2ZSBmYW1pbGllcyBtaWdodCBiZXR0ZXIgYXBwcm94aW1hdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RlbCByZXNpZHVhbHMsIHdpdGggdGhlICoqR2FtbWEtbG9nKiogc29sdXRpb24gKGkuZS4sIEdhbW1hIGRpc3RyaWJ1dGlvbiB3aXRoIGxvZ2FyaXRobWljIGxpbmsgZnVuY3Rpb24pIHNob3dpbmcgdGhlIGJlc3QgZml0LiBZZXQsIGl0IGlzIG5vdCBzbyBiZXR0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGluaXRpYWxseSAqKnJlbHkgb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24qKiBhbmQgdGhlbiBjb25zaWRlciB0aGUgKipHYW1tYS1sb2cgc29sdXRpb24gYXMgYSByb2J1c3RuZXNzIGNoZWNrKiouDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTNfRUUpKSAjIGJlc3QgZml0IGZvciBsb2dub3JtYWw/DQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTN9DQojIGZpdHRpbmcgbW9kZWwgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbGllcw0KbW9kZWxzIDwtIGxpc3QoDQogIG0zX0VFLA0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfRUUpLGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSxkYXRhPWNsZWFuRUUpLCAjIGdhbW1hIHdpdGggbG9nDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19FRSksZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksZGF0YT1jbGVhbkVFKSwgIyBbRkFJTFMgVE8gQ09OViwgbWF4fGdyYWR8ID0gMC4wOV0NCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX0VFKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhbkVFKSwgIyBsb2ctbm9ybQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKEVFKSB+Iixhcy5jaGFyYWN0ZXIoZm9ybXVsYShtM19FRSkpWzNdKSksZGF0YT1jbGVhbkVFKSkgIyBub3JtIGxvZw0KDQojIG5vcm1hbCBRLVEgcGxvdCBvZiBtb2RlbCByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDEsNSkpDQpmb3IoaSBpbiAxOmxlbmd0aChtb2RlbHMpKXsgDQogIHFxbm9ybShyZXNpZChtb2RlbHNbW2ldXSksbWFpbj1jKCJOb3JtIiwiR2FtbWEtbG9nIiwiTG9nLW5vcm0iLCJsb2ctdHJhbnNmIilbaV0pOyBxcWxpbmUocmVzaWQobW9kZWxzW1tpXV0pKSB9DQpgYGANCg0KPGJyPg0KDQojIyMgMy4yLjMuIFJlc3VsdHMNCg0KSGVyZSwgd2UgY29tcGFyZSB0aGUgc3BlY2lmaWVkIG1vZGVscyBiYXNlZCBvbiB0aGUgQWthaWtlIHdlaWdodCBhbmQgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCAod2l0aCB0eXBlLUkgZXJyb3Igc2V0IHRvICpwKiA8IC4wNSksIGFuZCB3ZSBpbnNwZWN0IHRoZSByZXN1bHRzIG9mIHRoZSBzZWxlY3RlZCBtb2RlbChzKS4gV2UgY2FuIHNlZSB0aGF0IHRoZSBpbmNsdXNpb24gb2Ygc3RhdGUgYFdITFNNYCBpcyBhc3NvY2lhdGVkIHdpdGggc3Ryb25nZXIgZXZpZGVuY2UgYW5kIHNpZ25pZmljYW50bHkgaGlnaGVyIGxpa2VsaWhvb2QgdGhhbiB0aGUgYmFzZWxpbmUgbW9kZWwgKEF3ID0gLjk5LCAkXGNoaV4yJCgxKSA9IDIwLjQ2LCAqcCogPCAuMDAxKS4gSW4gY29udHJhc3QsIHRoZSBpbnRlcmFjdGl2ZSBtb2RlbCBpcyBub3QgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZXMgKEF3ID0gLjA2LCAkXGNoaV4yJCgxKSA9IDEuNjgsICpwKiA9IC4xOSkuIA0KYGBge3IgfQ0KIyBBa2Fpa2Ugd2VpZ2h0IGFkZGluZyBvbmUgbW9kZWwgYXQgdGltZQ0KV2VpZ2h0cyhBSUMobTBfRUUsbTFfRUUpKSAjIGNvdmFyaWF0ZXM6IGJldHRlcg0KV2VpZ2h0cyhBSUMobTBfRUUsbTFfRUUsbTJfRUUpKSAjIHN0YXRlIHdvcmthaG9saXNtOiBiZXR0ZXINCldlaWdodHMoQUlDKG0wX0VFLG0xX0VFLG0yX0VFLG0zX0VFKSkgIyBpbnRlcmFjdGlvbjogd29yc2UNCg0KIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgd2l0aCBtMw0KYW5vdmEobTFfRUUsbTJfRUUsbTNfRUUpICMgYmVzdCBtb2RlbCBpcyBtMg0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgY29lZmZpY2llbnRzIGVzdGltYXRlZCBieSB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0yYCBhbmQgdGhvc2UgZXN0aW1hdGVkIGJ5IG90aGVyIG1vZGVscy4gV2UgY2FuIHNlZSB0aGF0IHN0YXRlIGBXSExTTS5tY2AgaXMgc3Vic3RhbnRpYWxseSBhbmQgbmVnYXRpdmVseSByZWxhdGVkIHRvIGBFRWAsIHdoZXJlYXMgdGhlICoqaW50ZXJhY3Rpb24gaXMgbm90IHN1YnN0YW50aWFsKiouIEFtb25nIHRoZSBpbmNsdWRlZCBjb3ZhcmlhdGVzLCBsb3cgYFBEYCBhbmQgaGlnaCB0cmFpdCBgV0hMU00uZ21jYCBwcmVkaWN0IHN1YnN0YW50aWFsbHkgaGlnaGVyIGBFRWAuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD00fQ0KIyByZWdyZXNzaW9uIHRhYmxlDQp0YWJfbW9kZWwobTFfRUUsbTJfRUUsbTNfRUUsDQogICAgICAgICAgZHYubGFiZWxzPWMoIkJhc2VsaW5lIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gc2VsZWN0ZWQgbW9kZWwNCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0zX0VFLHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5jbS5nbWMiKSwgIyB0cmFpdCBXSExTTQ0KICAgICAgICAgICAgIHBsb3RfbW9kZWwobTNfRUUsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLm1jIiksbnJvdz0xKSAjIHN0YXRlIFdITFNNDQoNCiMgcGxvdHRpbmcgaW50ZXJhY3Rpb25zDQpzZChjbGVhbkVFJFBELm1jKSAjIFJEZXQ6IDEgU0QgPSAxLjM2DQpwbG90X21vZGVsKG0zX0VFLHR5cGU9InByZWQiLHRlcm1zPWMoIldITFNNLm1jIiwiUEQubWMgWy0xLjM2LDEuMzZdIikpDQpgYGANCg0KPGJyPg0KDQojIyMgMy4yLjQuIEluZmx1ZW50aWFsIGNhc2VzDQoNCkhlcmUsIHdlIGV2YWx1YXRlIHRoZSBwcmVzZW5jZSBvZiBpbmZsdWVudGlhbCBjYXNlcyBpbiB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0yLmJpc2AuIFNwZWNpZmljYWxseSwgdGhlICoqQ29va+KAmXMgZGlzdGFuY2UqKiBpcyBjb25zaWRlcmVkIGFzIHRoZSBtYWluIG1lYXN1cmUgb2YgaW5kaXZpZHVhbC1sZXZlbCAoaS5lLiwgcGFydGljaXBhbnQpIGluZmx1ZW5jZSBvbiB0aGUgZXN0aW1hdGVkIHBhcmFtZXRlcnMsIGFuZCBpdCBpcyByZWNvbXB1dGVkIGJ5IHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHRoZSBtb3N0IGluZmx1ZW50aWFsIHBhcnRpY2lwYW50cyAoaS5lLiwgYmFzZWQgb24gdGhlIHJ1bGUtb2YtdGh1bWIgb2YgNC9OKSB1bnRpbCBhbGwgZXh0cmVtZSB2YWx1ZXMgYXJlIHJlbW92ZWQuDQoNCiMjIyMgMy4yLjQuMS4gQ29vaydzIGRpc3RhbmNlDQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudCBgUzA0OWAgaXMgYSBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlLg0KYGBge3IgZmlnLndpZHRoPTMsZmlnLmhlaWdodD0xMCx3YXJuaW5nPUZBTFNFfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTJfRUUsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhbkVFJElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfRUUsIklEIiwiUzA0OSIpLCJJRCIpDQpwbG90KGluZmwsd2hpY2g9ImNvb2siLGN1dG9mZj00LyhubGV2ZWxzKGNsZWFuRUUkSUQpLTEpLHhsYWI9IkNvb2sgZGlzdGFuY2UiLHlsYWI9IklEIixzb3J0PVRSVUUpDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMi40LjIuIENvZWZmaWNpZW50IGNoYW5nZQ0KDQpIZXJlLCB3ZSBpbnNwZWN0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5nZXMgaW4gdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMgYWZ0ZXIgdGhlIHJlbW92YWwgb2YgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuIFdlIGNhbiBzZWUgdGhhdCB0aGUgdXBkYXRlZCBtb2RlbHMgZG8gbm90IGltcGx5IHN1YnN0YW50aWFsIGNoYW5nZXMgaW4gdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMuIFRodXMsIHdlIGNob29zZSB0byAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9FRS5ub0luZmwgPC0gdXBkYXRlKG0yX0VFLGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSkNCg0KIyBwbG90dGluZyBjb2VmZmljaWVudHMgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnBsb3RfbW9kZWxzKG0yX0VFLG0yX0VFLm5vSW5mbCkgIyBtYWluIGVmZmVjdA0KcGxvdF9tb2RlbHMobTNfRUUsdXBkYXRlKG0zX0VFLGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSkpICMgaW50ZXJhY3Rpb24NCg0KIyBzaG93aW5nIHJlZ3Jlc3Npb24gdGFibGUgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnRhYl9tb2RlbChtMl9FRSxtMl9FRS5ub0luZmwsZHYubGFiZWxzPWMoIk9yaWdpbmFsIiwiVXBkYXRlZCIpLHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsDQogICAgICAgICAgc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KYGBgDQoNCjxicj4NCg0KIyMgMy4zLiBTbGVlcCBkaXN0dXJiYW5jZXMNCg0KU2xlZXAgZGlzdHVyYmFuY2VzIGBTRGAgcmF0ZWQgaW4gdGhlIG1vcm5pbmcgaXMgcHJlZGljdGVkIGJ5IHByZXZpb3VzIGRheSBzdGF0ZSB3b3JrYWhvbGlzbSBgV0hMU00ubWNgLCBpbiBhZGRpdGlvbiB0byBwc3ljaG9sb2dpY2FsIGRldGFjaG1lbnQgYFBEYCwgdHJhaXQgd29ya2Fob2xpc20gYFdITFNNLmNtYCwgYW5kIG9uZSBjb3ZhcmlhdGUgc2VsZWN0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM1XShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TNV9kZXNjcmlwdGl2ZXMvUzVfZGVzY3JpcHRpdmVzLWNvZGUtYW5kLW91dHB1dC5odG1sKSksIG5hbWVseSBgZ2VuZGVyYC4NCmBgYHtyICB9DQptZm9ybXVsYXNbNl0gIyBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZvciBTRA0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMy4xLiBEYXRhIHByZXBhcmF0aW9uDQoNCkZpcnN0LCB3ZSBwcmVwYXJlIHRoZSBkYXRhIGZvciB0aGUgYW5hbHlzZXMgYnkgcmVtb3ZpbmcgYWxsIGNhc2VzIG9mIG1pc3NpbmcgcmVzcG9uc2VzIGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgb3IgYW55IHByZWRpY3RvciBvciBjb3ZhcmlhdGUgKCoqbGlzdC13aXNlIGRlbGV0aW9uKiopLCBieSBjZW50ZXJpbmcgbGV2ZWwtMiBjb250aW51b3VzIHByZWRpY3RvcnMgb24gdGhlIGdyYW5kIG1lYW4gKCoqZ3JhbmQtbWVhbi1jZW50ZXJpbmcqKiksIGFuZCBieSBjZW50ZXJpbmcgbGV2ZWwtMSBjb250aW51b3VzIHByZWRpY3RvcnMgb24gdGhlIGluZGl2aWR1YWwgbWVhbiAoKipwZXJzb24tbWVhbi1jZW50ZXJpbmcqKikuDQpgYGB7ciB9DQojIGxpc3Qtd2lzZSBkZWxldGlvbg0KY2xlYW5TRCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoY2xlYW5bLGMoIklEIiwiU0QiLCJnZW5kZXIiLCJQRCIsIldITFNNIiwgIyBjb3JlIHZhcmlhYmxlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldFIiwiV0MiLCJzbGVlcF9keXNmIiwiZmxhZ1RpbWUiLCJjYXJlbGVzcyIsICMgZm9yIHJvYnVzdG5lc3MgY2hlY2tzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24iLCJjaGlsZHJlbiIpXSkpIA0KY2xlYW5TRCRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuU0QkSUQpKSAjIHJlc2V0dGluZyBwYXJ0aWNpcGFudCBpZGVudGlmaWVyIGxldmVscw0KY2F0KCJDb25zaWRlcmluZyIsbnJvdyhjbGVhblNEKSwiY29tcGxldGUgb2JzZXJ2YXRpb25zIGZyb20iLG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhblNEJElEKSkpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0Kd2lkZSA8LSBjbGVhblNEWyFkdXBsaWNhdGVkKGNsZWFuU0QkSUQpLF0gIyB3aWRlLWZvcm0gZGF0YXNldA0KZm9yKFZhciBpbiBjKCJQRCIsIldITFNNIiwiV0UiLCJXQyIpKXsNCiAgd2lkZSA8LSBjYmluZCh3aWRlLGFnZ3JlZ2F0ZShjbGVhblNEWyxWYXJdLGxpc3QoY2xlYW5TRCRJRCksbWVhbilbLDJdKSAjIGNvbXB1dGluZyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuU0QgPC0gam9pbihjbGVhblNELHdpZGVbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpICMgam9pbmluZyB3aXRoIGxvbmctZm9ybSBkYXRhDQogIGNsZWFuU0RbLHBhc3RlMChWYXIsIi5tYyIpXSA8LSBjbGVhblNEWyxWYXJdIC0gY2xlYW5TRFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBjb21wdXRpbmcgbWVhbi1jZW50ZXJlZCBzY29yZXMNCg0KIyBncmFuZC1tZWFuLWNlbnRlcmluZyBsdi0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0KZm9yKFZhciBpbiBjKCJXSExTTS5jbSIpKXsgY2xlYW5TRFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSBjbGVhblNEWyxWYXJdIC0gbWVhbih3aWRlWyxWYXJdKSB9DQoNCiMgc2hvd2luZyBkYXRhDQpjbGVhblNEWzE6MyxdICMgZmlyc3QgdGhyZWUgcm93cw0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMy4yLiBNb2RlbCBmaXQgIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpIZXJlLCB3ZSBmaXQgdGhlIG11bHRpbGV2ZWwgbW9kZWxzIHRvIHRoZSBzZWxlY3RlZCBkYXRhIHVzaW5nIHRoZSBkZWZhdWx0IHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoUkVNTCkuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfU0QgPC0gbG1lcihTRCB+ICgxfElEKSwgIyBvbmx5IGZpeGVkIGFuZCByYW5kb20gaW50ZXJjZXB0ICsgcmVzaWR1YWwgdGVybQ0KICAgICAgICAgICAgICBkYXRhPWNsZWFuU0QpDQoNCiMgbTE6IGNvdmFyaWF0ZXMNCm0xX1NEIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArICgxfElEKSwgIyBjb3ZhcmlhdGVzDQogICAgICAgICAgICAgIGRhdGE9Y2xlYW5TRCkNCg0KIyBtMjogc3RhdGUgd29ya2Fob2xpc20NCm0yX1NEIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICBkYXRhPWNsZWFuU0QpDQoNCiMgbTM6IGludGVyYWN0aW9uDQptM19TRCA8LSBsbWVyKFNEIH4gZ2VuZGVyICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyBXSExTTS5tYyArIFdITFNNLm1jICsgV0hMU00ubWM6UEQubWMgKyAoMXxJRCksIA0KICAgICAgICAgICAgICBkYXRhPWNsZWFuU0QpDQpgYGANCg0KPGJyPg0KDQpGcm9tIHRoZSBwcmV2aW91cyBjaHVuaywgd2Ugc2VlIHRoYXQgYWxsIG1vZGVscyBjb252ZXJnZWQgd2l0aG91dCBwcm9ibGVtcy4gSGVyZSwgd2UgaW5zcGVjdCB0aGUgKipkaWFnbm9zdGljcyoqIChpLmUuLCBub3JtYWxpdHkgb2YgcmVzaWR1YWwgYW5kIHJhbmRvbSBlZmZlY3QgZGlzdHJpYnV0aW9ucywgaG9tb3NjZWRhc3RpY2l0eSwgYW5kIG11bHRpY29sbGluZWFyaXR5KSBvZiB0aGUgbW9zdCBjb21wbGV4IG1vZGVsIGBtM2AuIEluZmx1ZW50aWFsIGNhc2VzIGFyZSBhbmFseXplZCBpbiBhIGRlZGljYXRlZCBzZWN0aW9uIGJlbG93Lg0KDQpNb2RlbCBgbTNgIHNob3dzICoqc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkqKiBlc3BlY2lhbGx5IGluIHRoZSBsb3dlciB0YWlsIG9mIHRoZSByZXNpZHVhbCBkaXN0cmlidXRpb24gYW5kIGJvdGggdGFpbHMgb2YgcmFuZG9tIGVmZmVjdHMsIGFsdGhvdWdoIGRldmlhdGlvbiBmcm9tIG5vcm1hbGl0eSBpcyBzbGlnaHRseSBsZXNzIG1hcmtlZCB0aGFuIGluIG1vZGVsIGBtMmAuIEJlc2lkZXMgdGhhdCwgd2UgY2FuIHNlZSB0aGF0IHRoZSBob21vc2NlZHN0aWNpdHkgYXNzdW1wdGlvbiBob2xkcyBhbmQgdGhhdCBub25lIG9mIHRoZSB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykgc2hvd3MgZXh0cmVtZSB2YWx1ZXMsIHJ1bGluZyBvdXQgdGhlIHJpc2sgb2YgbXVsdGljb2xsaW5lYXJpdHkuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0NCiMgbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5DQpwIDwtIHBsb3RfbW9kZWwobTNfU0QsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkgDQpwW1syXV0gPC0gcFtbMl1dJElEDQpwbG90X2dyaWQocCx0YWdzPVRSVUUsbWFyZ2luPWMoMCwwLDAsMCkpDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkgDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtM19TRCkgfiBjbGVhblNEWyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTNfU0QpLG1haW49IlZJRiBWYWx1ZXMiLHhsaW09YygwLDEwKSxsYXM9Mixob3Jpej1UUlVFKSAjIHZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3JzIChWSUZzKQ0KYWJsaW5lKHYgPSA1LCBsd2QgPSA1LCBsdHkgPSAyKQ0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgYmV0dGVyIGluc3BlY3QgdGhlIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGZpdCBvZiBtb2RlbHMgc3BlY2lmaWVkIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWx5IGRpc3RyaWJ1dGlvbnMuIFdlIGNhbiBzZWUgdGhhdCBhbHRlcm5hdGl2ZSBmYW1pbGllcyBtaWdodCBiZXR0ZXIgYXBwcm94aW1hdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RlbCByZXNpZHVhbHMsIHdpdGggdGhlICoqbG9nLW5vcm1hbCoqIHNvbHV0aW9uIChpLmUuLCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbG9nYXJpdGhtaWMgbGluayBmdW5jdGlvbikgc2hvd2luZyB0aGUgYmVzdCBmaXQuIFlldCwgaXQgaXMgbm90IHNvIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbCBtb2RlbC4gVGh1cywgd2UgaW5pdGlhbGx5ICoqcmVseSBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbioqIGFuZCB0aGVuIGNvbnNpZGVyIHRoZSAqKmxvZy1ub3JtYWwgc29sdXRpb24gYXMgYSByb2J1c3RuZXNzIGNoZWNrKiouDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTNfU0QpKSAjIGJlc3QgZml0IGZvciBHYW1tYQ0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBmaXR0aW5nIG1vZGVsIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWxpZXMNCm1vZGVscyA8LSBsaXN0KA0KICBtM19TRCwNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX1NEKSxmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksZGF0YT1jbGVhblNEKSwgIyBHYW1tYSB3aXRoIGxvZyBbRkFJTFMgVE8gQ09OViwgbWF4fGdyYWR8ID0gMC4wNV0NCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX1NEKSxmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSxkYXRhPWNsZWFuU0QpLCAjIEdhbW1hIHdpdGggaWRlbnRpdHkNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX1NEKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhblNEKSwgIyBsb2ctbm9ybQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKFNEKSB+Iixhcy5jaGFyYWN0ZXIoZm9ybXVsYShtM19TRCkpWzNdKSksZGF0YT1jbGVhblNEKSkgIyBub3JtIGxvZw0KDQojIG5vcm1hbCBRLVEgcGxvdCBvZiBtb2RlbCByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDEsNSkpDQpmb3IoaSBpbiAxOmxlbmd0aChtb2RlbHMpKXsgDQogIHFxbm9ybShyZXNpZChtb2RlbHNbW2ldXSksbWFpbj1jKCJOb3JtIiwiR2FtbWEtbG9nIiwiTG9nLW5vcm0iLCJsb2ctdHJhbnNmIilbaV0pOyBxcWxpbmUocmVzaWQobW9kZWxzW1tpXV0pKSB9DQpgYGANCg0KPGJyPg0KDQojIyMgMy4zLjMuIFJlc3VsdHMNCg0KSGVyZSwgd2UgY29tcGFyZSB0aGUgc3BlY2lmaWVkIG1vZGVscyBiYXNlZCBvbiB0aGUgQWthaWtlIHdlaWdodCBhbmQgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCAod2l0aCB0eXBlLUkgZXJyb3Igc2V0IHRvICpwKiA8IC4wNSksIGFuZCB3ZSBpbnNwZWN0IHRoZSByZXN1bHRzIG9mIHRoZSBzZWxlY3RlZCBtb2RlbChzKS4gV2UgY2FuIHNlZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgYm90aCBzdGF0ZSBgV0hMU01gIChBdyA9IC41MSwgJFxjaGleMiQoMSkgPSA1LjY3LCAqcCogPSAuMDEpLCBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggYFBEYCAoQXcgPSAuMjEsICRcY2hpXjIkKDEpID0gNS42OCwgKnAqID0gLjAyKSBhcmUgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIChub3QgdGhlIGludGVyYWN0aW9uKSBhbmQgc2lnbmlmaWNhbnRseSBoaWdoZXIgbGlrZWxpaG9vZCB0aGFuIHRoZSBiYXNlbGluZSBtb2RlbC4gKipNb2RlbCBgbTNgIGlzIHNlbGVjdGVkIGFzIHRoZSBiZXN0IG1vZGVsKiouIA0KYGBge3IgfQ0KIyBBa2Fpa2Ugd2VpZ2h0IGFkZGluZyBvbmUgbW9kZWwgYXQgdGltZQ0KV2VpZ2h0cyhBSUMobTBfU0QsbTFfU0QpKSAjIGNvdmFyaWF0ZXM6IGJldHRlcg0KV2VpZ2h0cyhBSUMobTBfU0QsbTFfU0QsbTJfU0QpKSAjIHN0YXRlIHdvcmthaG9saXNtOiBiZXR0ZXINCldlaWdodHMoQUlDKG0wX1NELG0xX1NELG0yX1NELG0zX1NEKSkgIyBpbnRlcmFjdGlvbjogd29yc2UNCg0KIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgd2l0aCBtMw0KYW5vdmEobTFfU0QsbTJfU0QsbTNfU0QpICMgYmVzdCBtb2RlbCBpcyBtMw0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgY29lZmZpY2llbnRzIGVzdGltYXRlZCBieSB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0zYCBhbmQgdGhvc2UgZXN0aW1hdGVkIGJ5IG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscy4gV2UgY2FuIHNlZSB0aGF0IGJvdGggdHJhaXQgYFdITFNNLmNtLmdtY2AgYW5kIHN0YXRlIGBXSExTTS5tY2AgYXJlIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBgU0RgLiBJbiB0aGUgc2VsZWN0ZWQgbW9kZWwsIGEgKipzdWJzdGFudGlhbCBpbnRlcmFjdGlvbioqIGlzIHNob3duIHN1Y2ggdGhhdCBgV0hMU00ubWNgIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBgU0RgIGluIHRob3NlIHdvcmtpbmcgZGF5cyB3aXRoIGxvd2VyIGBSRGV0YCBhbmQgYFJSZWxgLiBBbW9uZyB0aGUgaW5jbHVkZWQgY292YXJpYXRlcywgYGdlbmRlcmAgcHJlZGljdCBzdWJzdGFudGlhbCBkaWZmZXJlbmNlcyBpbiBgU0RgLCB3aXRoIGhpZ2hlciBzbGVlcCBkaXN0dXJiYW5jZXMgZm9yIGZlbWFsZXMuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD00fQ0KIyByZWdyZXNzaW9uIHRhYmxlDQp0YWJfbW9kZWwobTFfU0QsbTJfU0QsbTNfU0QsDQogICAgICAgICAgZHYubGFiZWxzPWMoIkJhc2VsaW5lIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gc2VsZWN0ZWQgbW9kZWwNCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0zX1NELHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5jbS5nbWMiKSwgIyB0cmFpdCBXSExTTQ0KICAgICAgICAgICAgIHBsb3RfbW9kZWwobTNfU0QsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLm1jIiksbnJvdz0xKSAjIHN0YXRlIFdITFNNDQoNCiMgcGxvdHRpbmcgaW50ZXJhY3Rpb25zDQpzZChjbGVhblNEJFBELm1jKSAjIFBEOiAxIFNEID0gMS4zNg0KcGxvdF9tb2RlbChtM19TRCx0eXBlPSJwcmVkIix0ZXJtcz1jKCJXSExTTS5tYyIsIlBELm1jIFstMS4zNiwxLjM2XSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMy40LiBJbmZsdWVudGlhbCBjYXNlcw0KDQpIZXJlLCB3ZSBldmFsdWF0ZSB0aGUgcHJlc2VuY2Ugb2YgaW5mbHVlbnRpYWwgY2FzZXMgaW4gdGhlIHNlbGVjdGVkIG1vZGVsIGBtM2AuIFNwZWNpZmljYWxseSwgdGhlICoqQ29va+KAmXMgZGlzdGFuY2UqKiBpcyBjb25zaWRlcmVkIGFzIHRoZSBtYWluIG1lYXN1cmUgb2YgaW5kaXZpZHVhbC1sZXZlbCAoaS5lLiwgcGFydGljaXBhbnQpIGluZmx1ZW5jZSBvbiB0aGUgZXN0aW1hdGVkIHBhcmFtZXRlcnMsIGFuZCBpdCBpcyByZWNvbXB1dGVkIGJ5IHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHRoZSBtb3N0IGluZmx1ZW50aWFsIHBhcnRpY2lwYW50cyAoaS5lLiwgYmFzZWQgb24gdGhlIHJ1bGUtb2YtdGh1bWIgb2YgNC9OKSB1bnRpbCBhbGwgZXh0cmVtZSB2YWx1ZXMgYXJlIHJlbW92ZWQuDQoNCiMjIyMgMy4zLjQuMS4gQ29vaydzIGRpc3RhbmNlDQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudHMgYFMxMzJgLCBgUzA0OWAsIGBTMDc5YCwgYW5kIGBTMDAyYCBhcmUgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTNfU0QsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhblNEJElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBsaXN0KA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTNfU0QsIklEIiwiUzEzMiIpLCJJRCIpLA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTNfU0QsIklEIixjKCJTMTMyIiwiUzA0OSIpKSwiSUQiKSwNCiAgaW5mbHVlbmNlKGV4Y2x1ZGUuaW5mbHVlbmNlKG0zX1NELCJJRCIsYygiUzEzMiIsIlMwNDkiLCJTMDc5IikpLCJJRCIpLA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTNfU0QsIklEIixjKCJTMTMyIiwiUzA0OSIsIlMwNzkiLCJTMDAyIikpLCJJRCIpKQ0KZm9yKGkgaW4gMTpsZW5ndGgoaW5mbCkpeyANCiAgcGxvdChpbmZsW1tpXV0sd2hpY2g9ImNvb2siLGN1dG9mZj00LyhubGV2ZWxzKGNsZWFuU0QkSUQpLWkpLHhsYWI9IkNvb2sgZGlzdGFuY2UiLHlsYWI9IklEIixzb3J0PVRSVUUpIH0NCmBgYA0KDQo8YnI+DQoNCiMjIyMgMy4zLjQuMi4gQ29lZmZpY2llbnQgY2hhbmdlDQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBhZnRlciB0aGUgcmVtb3ZhbCBvZiBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlcy4gV2UgY2FuIHNlZSB0aGF0IHRoZSB1cGRhdGVkIG1vZGVsIGltcGxpZXMgYW4gaW5jcmVhc2UgaW4gdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlZCBmb3IgdHJhaXQgYFdITFNNLmNtLmdtY2AgYW5kIGBnZW5kZXJgLCBhbmQgYSBkZWNyZWFzZSBpbiB0aG9zZSBlc3RpbWF0ZWQgZm9yIHRoZSBpbnRlcmFjdGlvbi4gSG93ZXZlciwgaXQgZG9lcyBub3QgZHJvcCBmYXIgYmVsb3cgdGhlIGN1dC1vZmYgb2YgfCp0Knw9Mi4gVGh1cywgd2UgY2hvb3NlIHRvICoqcmVseSBvbiB0aGUgcmVzdWx0cyBvYnRhaW5lZCB3aXRoIHRoZSBmdWxsIHNhbXBsZSoqLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVmaXR0aW5nIG1vZGVsIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCm0zX1NELm5vSW5mbCA8LSB1cGRhdGUobTNfU0QsZGF0YT1jbGVhblNEWyFjbGVhblNEJElEJWluJWMoIlMxMzIiLCJTMDQ5IiwiUzA3OSIsIlMwMDIiKSxdKQ0KDQojIHBsb3R0aW5nIGNvZWZmaWNpZW50cyBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KcGxvdF9tb2RlbHMobTNfU0QsbTNfU0Qubm9JbmZsKQ0KDQojIHNob3dpbmcgcmVncmVzc2lvbiB0YWJsZSBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KdGFiX21vZGVsKG0zX1NELG0zX1NELm5vSW5mbCxkdi5sYWJlbHM9YygiT3JpZ2luYWwiLCJVcGRhdGVkIiksc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSwNCiAgICAgICAgICBzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQpgYGANCg0KPGJyPg0KDQojIDQuIFJvYnVzbmVzcyBjaGVja3MNCg0KSGVyZSwgd2UgY29uZHVjdCBhIHNlcmllcyBvZiByb2J1c3RuZXNzIGNoZWNrcyAob3IgKm11bHRpdmVyc2UgZGF0YSBhbmFseXNpcyo7IHNlZSBbU3RlZWdlbiBldCBhbC4gMjAxNl0oI3JlZikpIGZvciBlYWNoIHNlbGVjdGVkIG1vZGVsIGJ5IHVzaW5nIGFsdGVybmF0aXZlIGluY2x1c2lvbiBjcml0ZXJpYSwgbW9kZWxzIHdpdGggYWRkaXRpb25hbCBvciBsZXNzIGNvdmFyaWF0ZXMsIG91dGxpZXIgcmVtb3ZhbCwgZXRjLiBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGFuYWx5c2VzLg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHBzeWNoKQ0KYGBgDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PmBnbG1lckFuYDwvc3VtbWFyeT4NCjxwPg0KYGBge3IgfQ0KIycgQHRpdGxlIEdlbmVyYWxpemVkIGxpbmVhciAobWl4ZWQtZWZmZWN0cykgcmVncmVzc2lvbiBhbmFseXNpcw0KIycgQHBhcmFtIG1vZGVsVHlwZSA9IHR5cGUgb2YgbW9kZWw6IEdMTSwgbWl4ZWQtZWZmZWN0cyAoR0xNRVIpLCBvciBjdW11bGF0aXZlIGxpbmsgbWl4ZWRtIG9kZWwgKENMTU0pDQojJyBAcGFyYW0gZGF0YSA9IGRhdGEuZnJhbWUgb2YgZGF0YQ0KIycgQHBhcmFtIHJlc3AgPSBuYW1lIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSAoY2hhcmFjdGVyKQ0KIycgQHBhcmFtIGZpeC5lZmYgPSBjaGFyYWN0ZXIgdmVjdG9yIG9mIG5hbWVzIG9mIHRoZSBwcmVkaWN0b3IocykNCiMnIEBwYXJhbSBSRU1MID0gYXJndW1lbnQgZnJvbSB0aGUgbG1lNDo6bG1lcigpIGZ1bmN0aW9uLCBzZWUgP2xtZXINCiMnIEBwYXJhbSByYW4uZWZmID0gY2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSByYW5kb20gZWZmZWN0IGJ5IHVzaW5nIHRoZSBsbWU0IHN5bnRheCAoZGVmdWx0OiAiKDF8SUQpIikNCiMnIEBwYXJhbSBmYW1pbHkgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIEdMTShFUikgZmFtaWx5IHRvIGJlIHVzZWQgaW4gdGhlIG1vZGVscyAoZGVmYXVsdDogIm5vcm1hbCIpDQojJyBAcGFyYW0gbGluayA9Y2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBHTE0oRVIpIGxpbmsgZnVuY3Rpb24gdG8gYmUgdXNlZCBpbiB0aGUgbW9kZWxzIChkZWZhdWx0OiAiaWRlbnRpdHkiKQ0KIycgQHBhcmFtIG5BR1EgPSBhcmd1bWVudCBmcm9tIHRoZSBsbWU0OjpnbG1lcigpIGZ1bmN0aW9uLCBzZWUgP2dsbWVyDQojJyBAcGFyYW0gbUNvbXAuYmFzZWxpbmUgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIGxhc3QgcHJlZGljdG9yIGluY2x1ZGVkIGluIHRoZSBiYXNlbGluZSBtb2RlbCB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBzdWJzZXF1ZW50IG1vZGVscy4gSWYgZXF1YWwgdG8gTkEgKGRlZnVsdCksIHRoZSBudWxsIG1vZGVsIGlzIHVzZWQgYXMgdGhlIGJhc2VsaW5lIG1vZGVsIGZvciBjb21wYXJpc29uDQojJyBAcGFyYW0gcC5hZGp1c3QubWV0aG9kID0gYXJndW1lbnQgZnJvbSB0aGUgc3RhdHM6OnAuYWRqdXN0KCkgZnVuY3Rpb24gKHNlZSA/cC5hZGp1c3QpIGluZGljYXRpbmcgd2hpY2ggbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHAtdmFsdWVzIG9idGFpbmVkIGZyb20gdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCAoZGVmYXVsdDogTkEsIGZvciBubyBhZGp1c3RtZW50KQ0KIycgQHBhcmFtIGtleS5tb2RlbCA9IGNoYXJhY3RlciBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgcHJlZGljdG9yKHMpIHdob3NlIG1vZGVsKHMpIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGUgImtleS5yZXMiIG91dHB1dA0KIycgQHBhcmFtIGtleS5wcmVkaWN0b3IgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIHByZWRpY3RvciB0byBiZSBjb25zaWRlcmVkIGJ5IHRoZSAia2V5LnJlcyIgb3V0cHV0DQojJyBAcGFyYW0gZGlnaXRzID0gbnVtYmVyIG9mIGRpZ2l0cyBmb3IgYWxsIG51bWVyaWMgb3VwdXRzDQojJyBAcGFyYW0gbWVzc2FnZXMgPSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgZm9yIGVhY2ggb3BlcmF0aW9uIChkZWZ1bHQ6IEZBTFNFKQ0KZ2xtZXJBbiA8LSBmdW5jdGlvbihkYXRhLG1vZGVsVHlwZT1jKCJHTE1FUiIpLHJlc3AsZml4LmVmZixSRU1MPVRSVUUscmFuLmVmZj0iKDF8SUQpIixmYW1pbHk9Im5vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgIGxpbms9ImlkZW50aXR5IixuQUdRPTEsbUNvbXAuYmFzZWxpbmU9TkEscC5hZGp1c3QubWV0aG9kPU5BLGNvZWZmLm1vZGVscz1OQSx0cmFuc2Zvcm09TlVMTCwNCiAgICAgICAgICAgICAgICAgICAgcGxvdC5tb2RlbD1OQSxwbG90LnByZWQ9ImFsbCIsa2V5Lm1vZGVsPU5BLGtleS5wcmVkaWN0b3I9TkEsZGlnaXRzPTMsbWVzc2FnZXM9RkFMU0UpeyANCiAgDQogIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJSdW5uaW5nIixtb2RlbFR5cGUsImFuYWx5c2lzIG9mIixyZXNwLCIuLi4iKSB9DQogIA0KICAjIG1vZGVsaW5nIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICANCiAgIyBjcmVhdGluZyBtb2RlbCBmb3JtdWxhcw0KICBmb3JtdWxhcyA8LSBjaGFyYWN0ZXIoKQ0KICBpZihtb2RlbFR5cGU9PSJHTE0iKXsgcmFuLmVmZiA8LSAiMSIgfQ0KICBudWxsLmYgPC0gcGFzdGUocmVzcCwifiIscmFuLmVmZikgIyBjcmVhdGluZyBudWxsIG1vZGVsIGZvcm11bGENCiAgZm9yKGkgaW4gMTpsZW5ndGgoZml4LmVmZikpeyAjIGNyZWF0aW5nIG90aGVyIGZvcm11bGFzDQogICAgaWYoaT09MSl7IGZvcm11bGFzW2ldIDwtIHBhc3RlKHJlc3AsIn4iLGZpeC5lZmZbMV0pIH0gZWxzZSB7IGZvcm11bGFzW2ldIDwtIHBhc3RlKGZvcm11bGFzW2ktMV0sIisiLGZpeC5lZmZbaV0pICB9fQ0KICBpZihtb2RlbFR5cGUlaW4lYygiR0xNRVIiLCJDTE1NIikpeyBpZighaXMubmEocmFuLmVmZikpeyBmb3JtdWxhcyA8LSBwYXN0ZShmb3JtdWxhcywiKyIscmFuLmVmZikNCiAgICAgIGlmKHN1YnN0cihyYW4uZWZmLDIsMikhPSIxIil7IHJhblNsb3BlIDwtIHBhc3RlKGZpeC5lZmZbd2hpY2goZ3JlcGwocmFuLmVmZixmaXguZWZmKSldKVsxXQ0KICAgICAgICBudWxsLmYgPC0gZ3N1YihyYW5TbG9wZSwiMSIsbnVsbC5mKSAgIyByZW1vdmluZyByYW5kb20gc2xvcGUgZnJvbSBtb2RlbHMgd2l0aG91dCB0aGUgcmVsYXRlZCBwcmVkaWN0b3INCiAgICAgICAgZm9yKGkgaW4gMTpsZW5ndGgoZm9ybXVsYXMpKXsgDQogICAgICAgICAgaWYoIShncmVwbChyYW5TbG9wZSxnc3ViKHBhc3RlKHJhblNsb3BlLCJbfF0iLHNlcD0iIiksIiIsZm9ybXVsYXNbaV0pKSkpeyANCiAgICAgICAgICAgIGZvcm11bGFzW2ldIDwtIGdzdWIocGFzdGUocmFuU2xvcGUsIlt8XSIsc2VwPSIiKSwiMXwiLGZvcm11bGFzW2ldKSB9fX0NCiAgICB9IGVsc2UgeyBzdG9wKG1lc3NhZ2U9IkVycm9yOiBHTE1FUiBtb2RlbCB0eXBlIHdpdGhvdXQgcmFuLmVmZiBzcGVjaWZpY2F0aW9uIikgfX0NCiAgaWYobWVzc2FnZXM9PVRSVUUpeyBjYXQoIlxuXG5Nb2RlbCBzcGVjaWZpY2F0aW9uOlxuIC0gbW9kZWwgTTAgKG51bGwpOiIsbnVsbC5mKQ0KICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IGNhdCgiXG4gLSBtb2RlbCBNIixpLCI6ICIsZm9ybXVsYXNbaV0sc2VwPSIiKX19DQogIA0KICAjIGZpdHRpbmcgbW9kZWxzDQogIG1vZGVscyA8LSBsaXN0KCkNCiAgaWYobW9kZWxUeXBlPT0iR0xNIil7IGlmKG1lc3NhZ2VzPT1UUlVFKXsgDQogICAgY2F0KCJcblxuRml0dGluZyBHTE0gbW9kZWxzIG9mIixyZXNwLCJvbiIsbnJvdyhkYXRhKSwicGFydGljaXBhbnRzIFxuICAgdXNpbmcgdGhlIiwNCiAgICAgICAgZmFtaWx5LCJmYW1pbHkgd2l0aCB0aGUiLGxpbmssImxpbmsgZnVuY3Rpb24uLi4iKSB9DQogICAgaWYoZmFtaWx5PT0ibm9ybWFsIiAmIGxpbms9PSJpZGVudGl0eSIpeyBudWxsLm0gPC0gbG0oYXMuZm9ybXVsYShudWxsLmYpLGRhdGE9ZGF0YSkgIyBub3JtYWwgZmFtaWx5DQogICAgICBmb3IoaSBpbiAxOmxlbmd0aChmb3JtdWxhcykpeyBtb2RlbHNbW2ldXSA8LSBsbShmb3JtdWxhPWFzLmZvcm11bGEoZm9ybXVsYXNbaV0pLGRhdGE9ZGF0YSkgfQ0KICAgICAgfSBlbHNlIGlmIChmYW1pbHk9PSJnYW1tYSIpIHsgbnVsbC5tIDwtIGdsbShhcy5mb3JtdWxhKG51bGwuZiksZGF0YT1kYXRhLGZhbWlseT1HYW1tYShsaW5rPWxpbmspLG5BR1E9bkFHUSkgIyBnYW1tYQ0KICAgICAgICBmb3IoaSBpbiAxOmxlbmd0aChmb3JtdWxhcykpeyBtb2RlbHNbW2ldXSA8LSBnbG0oZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsZmFtaWx5PUdhbW1hKGxpbms9bGluaykpIH0NCiAgICAgICAgfSBlbHNlIGlmKGZhbWlseT09Im5vcm1hbCIgJiBsaW5rIT0iaWRlbnRpdHkiKXsgIA0KICAgICAgICAgIG51bGwubSA8LSBnbG0oYXMuZm9ybXVsYShudWxsLmYpLGRhdGE9ZGF0YSxmYW1pbHk9Z2F1c3NpYW4obGluaz1saW5rKSkgIyBub3JtYWwgd2l0aCBvdGhlciBsaW5rIGZ1bmN0aW9ucw0KICAgICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IA0KICAgICAgICAgICAgbW9kZWxzW1tpXV0gPC0gZ2xtKGZvcm11bGE9YXMuZm9ybXVsYShmb3JtdWxhc1tpXSksZGF0YT1kYXRhLGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspKSB9DQogICAgICAgIH0gZWxzZSBpZihmYW1pbHk9PSJiaW5vbWlhbCIpeyANCiAgICAgICAgICBudWxsLm0gPC0gZ2xtKGFzLmZvcm11bGEobnVsbC5mKSxkYXRhPWRhdGEsZmFtaWx5PWJpbm9taWFsKGxpbms9bGluaykpICMgbG9naXN0aWMgcmVncmVzc2lvbg0KICAgICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IA0KICAgICAgICAgICAgbW9kZWxzW1tpXV0gPC0gZ2xtKGZvcm11bGE9YXMuZm9ybXVsYShmb3JtdWxhc1tpXSksZGF0YT1kYXRhLGZhbWlseT1iaW5vbWlhbChsaW5rPWxpbmspKX0NCiAgICAgICAgfSBlbHNlIHsgc3RvcChtZXNzYWdlPSJFcnJvcjogb25seSBub3JtYWwsIGdhbW1hLCBhbmQgYmlub21pYWwgZmFtaWx5IGFyZSBhbGxvd2VkLCANCiAgICAgICAgICAgICAgICAgICAgICB3aXRoIGlkZW50aXR5LCBpbnZlcnNlLCBhbmQgbG9nIGxpbmsgZnVuY3Rpb25zIikgfQ0KICB9IGVsc2UgaWYobW9kZWxUeXBlPT0iR0xNRVIiKXsgc3VwcHJlc3NNZXNzYWdlcyhzdXBwcmVzc1dhcm5pbmdzKHJlcXVpcmUobG1lNCkpKQ0KICAgIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJcblxuRml0dGluZyIsbW9kZWxUeXBlLCJtb2RlbHMgb2YiLHJlc3AsIm9uIixucm93KGRhdGEpLCJvYnNlcnZhdGlvbnMgZnJvbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGRhdGEkSUQpKSksInBhcnRpY2lwYW50cyBcbiAgIHVzaW5nIHRoZSIsZmFtaWx5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYW1pbHkgd2l0aCB0aGUiLGxpbmssImxpbmsgZnVuY3Rpb24gdXNpbmciLGlmZWxzZShSRU1MPT1GQUxTRSwiTUwiLCJSRU1MIiksImVzdGltYXRvci4uLiIpIH0NCiAgICBpZihmYW1pbHk9PSJub3JtYWwiICYgbGluaz09ImlkZW50aXR5Iil7IG51bGwubSA8LSBsbWVyKGFzLmZvcm11bGEobnVsbC5mKSxkYXRhPWRhdGEsUkVNTD1SRU1MKSAjIG5vcm1hbCAgaWRlbnRpdHkNCiAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IG1vZGVsc1tbaV1dIDwtIGxtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsUkVNTD1SRU1MKSB9DQogICAgICB9IGVsc2UgaWYgKGZhbWlseT09ImdhbW1hIikgeyBudWxsLm0gPC0gZ2xtZXIoYXMuZm9ybXVsYShudWxsLmYpLGRhdGE9ZGF0YSxmYW1pbHk9R2FtbWEobGluaz1saW5rKSxuQUdRPW5BR1EpICMgZ2FtbWENCiAgICAgICAgZm9yKGkgaW4gMTpsZW5ndGgoZm9ybXVsYXMpKXsNCiAgICAgICAgICBtb2RlbHNbW2ldXTwtZ2xtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsZmFtaWx5PUdhbW1hKGxpbms9bGluayksbkFHUT1uQUdRKSB9DQogICAgICAgIH0gZWxzZSBpZihmYW1pbHk9PSJub3JtYWwiICYgbGluayE9ImlkZW50aXR5Iil7IA0KICAgICAgICAgIG51bGwubSA8LSBnbG1lcihhcy5mb3JtdWxhKG51bGwuZiksZGF0YT1kYXRhLGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspLG5BR1E9bkFHUSkgIyBub3JtYWwgd2l0aCBvdGhlciBsaW5rcw0KICAgICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IG1vZGVsc1tbaV1dIDwtIGdsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShmb3JtdWxhc1tpXSksZGF0YT1kYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspLG5BR1E9bkFHUSkgfQ0KICAgICAgICB9IGVsc2UgaWYoZmFtaWx5PT0iYmlub21pYWwiKXsgDQogICAgICAgICAgbnVsbC5tIDwtIGdsbWVyKGFzLmZvcm11bGEobnVsbC5mKSxkYXRhPWRhdGEsZmFtaWx5PWJpbm9taWFsKGxpbms9bGluayksbkFHUT1uQUdRKSAjIGxvZ2lzdGljDQogICAgICAgICAgZm9yKGkgaW4gMTpsZW5ndGgoZm9ybXVsYXMpKXsgbW9kZWxzW1tpXV0gPC0gZ2xtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PWJpbm9taWFsKGxpbms9bGluayksbkFHUT1uQUdRKX0NCiAgICAgICAgfSBlbHNlIHsgc3RvcChtZXNzYWdlPSJFcnJvcjogb25seSBub3JtYWwsIGxvZ2lzdGljLCBhbmQgZ2FtbWEgZmFtaWx5IGFyZSBhbGxvd2VkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGlkZW50aXR5LCBpbnZlcnNlLCBhbmQgbG9nIGxpbmsgZnVuY3Rpb25zIikgfQ0KICB9IGVsc2UgaWYobW9kZWxUeXBlPT0iQ0xNTSIpeyBzdXBwcmVzc01lc3NhZ2VzKHN1cHByZXNzV2FybmluZ3MocmVxdWlyZShvcmRpbmFsKSkpICMgY3VtdWxhdGl2ZSBsaW5rIG1peGVkIG1vZGVscw0KICAgIGlmKG1lc3NhZ2VzPT1UUlVFKXsgDQogICAgICBjYXQoIlxuXG5GaXR0aW5nIixtb2RlbFR5cGUsIm1vZGVscyBvZiIscmVzcCwib24iLG5yb3coZGF0YSksIm9ic2VydmF0aW9ucyBmcm9tIiwNCiAgICAgICAgICBubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoZGF0YSRJRCkpKSwicGFydGljaXBhbnRzIFxuICAgdXNpbmcgQ3VtdWxhdGl2ZSBMaW5rIE1peGVkIE1vZGVscyIpIH0NCiAgICBkYXRhWyxyZXNwXSA8LSBmYWN0b3IoZGF0YVsscmVzcF0sb3JkZXJlZD1UUlVFKSAjIHJlc3BvbnNlIHZhcmlhYmxlIGFzIG9yZGVyZWQgZmFjdG9yDQogICAgbnVsbC5tIDwtIHN1cHByZXNzV2FybmluZ3MoY2xtbShhcy5mb3JtdWxhKGdzdWIoIn4iLCJ+IDEgKyIsbnVsbC5mKSksZGF0YT1kYXRhKSkgIyBzdXBwcmVzcyBmb3JtdWxhIHdhcm5pbmcgKGJ1Z2dlZCkNCiAgICBmb3IoaSBpbiAxOmxlbmd0aChmb3JtdWxhcykpeyBtb2RlbHNbW2ldXSA8LSBzdXBwcmVzc1dhcm5pbmdzKGNsbW0oZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsbkFHUT1uQUdRKSkgfQ0KICB9IGVsc2UgeyBzdG9wKG1lc3NhZ2U9IkVycm9yOiBtb2RlbFR5cGUgY2FuIG9ubHkgYmUgJ0dMTScsICdHTE1FUicsIG9yICdDTE1NJyIpIH0NCiAgDQogICMgb3V0cHV0cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICBpZihtZXNzYWdlcz09VFJVRSl7IGNhdCgiXG5cbkdlbmVyYXRpbmcgbW9kZWxzIG91dHB1dHMuLi4iKSB9DQogIA0KICAjIG1vZGVsIGNvbXBhcmlzb24NCiAgICAjIGxpa2VsaWhvb2QgcmF0aW8gdGVzdA0KICAgIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJcblxuIC0gUnVubmluZyBsaWtlbGlob29kIHJhdGlvIHRlc3Q6IikgfSANCiAgICBzdXBwcmVzc01lc3NhZ2VzKHN1cHByZXNzV2FybmluZ3MocmVxdWlyZShrbml0cikpKTsgc3VwcHJlc3NNZXNzYWdlcyhzdXBwcmVzc1dhcm5pbmdzKHJlcXVpcmUoTXVNSW4pKSkgDQogICAgbS5udW0gPC0gMQ0KICAgIGlmKGlzLm5hKG1Db21wLmJhc2VsaW5lKSl7IGJzbCA8LSBudWxsLm0gICMgc2VsZWN0aW5nIGJhc2VsaW5lIG1vZGVsDQogICAgICB9IGVsc2UgeyBtLm51bSA8LSBncmVwKG1Db21wLmJhc2VsaW5lLGZpeC5lZmYpWzFdICsgMQ0KICAgICAgICAgYnNsIDwtIG1vZGVsc1tbbS5udW0gLSAxXV0gfQ0KICAgIGlmKG1vZGVsVHlwZSE9IkNMTU0iKXsgbHJ0IDwtIGFzLmRhdGEuZnJhbWUoYW5vdmEoYnNsLG1vZGVsc1tbbS5udW1dXSkpDQogICAgICBpZihsZW5ndGgobW9kZWxzKT5tLm51bSl7DQogICAgICAgIGZvcihpIGluIG0ubnVtOihsZW5ndGgobW9kZWxzKS0xKSl7IGxydCA8LSByYmluZChscnQsYXMuZGF0YS5mcmFtZShhbm92YShtb2RlbHNbW2ldXSxtb2RlbHNbW2krMV1dKSlbMixdKSB9fQ0KICAgICAgfSBlbHNlIHsgbHJ0IDwtIGFzLmRhdGEuZnJhbWUob3JkaW5hbDo6OmFub3ZhLmNsbShic2wsbW9kZWxzW1ttLm51bV1dKSkgIyB1c2UgYW5vdmEuY2xtKCkgdG8gYXZvaWQgZW52LiBpc3N1ZQ0KICAgICAgICBpZihsZW5ndGgobW9kZWxzKT5tLm51bSl7DQogICAgICAgICAgZm9yKGkgaW4gbS5udW06KGxlbmd0aChtb2RlbHMpLTEpKXsgDQogICAgICAgICAgICBscnQgPC0gcmJpbmQobHJ0LGFzLmRhdGEuZnJhbWUob3JkaW5hbDo6OmFub3ZhLmNsbShtb2RlbHNbW2ldXSxtb2RlbHNbW2krMV1dKSlbMixdKSB9fX0NCiAgICByb3duYW1lcyhscnQpIDwtIGMoaWZlbHNlKGlzLm5hKG1Db21wLmJhc2VsaW5lKSwiTnVsbCBtb2RlbCIsIkJhc2VsaW5lIiksDQogICAgICAgICAgICAgICAgICAgICAgIGZpeC5lZmZbbS5udW06bGVuZ3RoKGZpeC5lZmYpXSkNCiAgICBpZighaXMubmEocC5hZGp1c3QubWV0aG9kKSl7ICMgcC12YWx1ZSBjb3JyZWN0aW9ucyBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbg0KICAgICAgaWYobWVzc2FnZXM9PVRSVUUpeyBjYXQoIiAoYXBwbHlpbmciLHAuYWRqdXN0Lm1ldGhvZCwicC12YWx1ZXMgY29ycmVjdGlvbikiKX0NCiAgICAgIGxydFshaXMubmEobHJ0JGBQcig+Q2hpc3EpYCksIlByKD5DaGlzcSkiXSA8LSBwLmFkanVzdChscnRbIWlzLm5hKGxydCRgUHIoPkNoaXNxKWApLCJQcig+Q2hpc3EpIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPXAuYWRqdXN0Lm1ldGhvZCkgIH0NCiAgICANCiAgICAjIEFrYWlrZSB3ZWlnaHRzDQogICAgQUlDcyA8LSBscnRbMToyLCJBSUMiXSAjIEFrYWlrZSB3ZWlnaHQNCiAgICANCiAgICAjIHVwZGF0aW5nIGtleSByZXN1bHRzDQogICAga2V5IDwtIGxydFt3aGljaChncmVwbChrZXkucHJlZGljdG9yLHJvdy5uYW1lcyhscnQpKSksXSAjIGtleSByZXN1bHRzDQogICAgaWYobnJvdyhrZXkpPjEpeyBrZXkgPC0ga2V5WzEsXSB9DQogICAga2V5LnJlc3VsdHMgPC0gZGF0YS5mcmFtZShzaWcuTFJUPWtleVssbmNvbChrZXkpXTwwLjA1LCAjIHNpZy5MUlQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlci5Bdz1rZXkkQUlDPT1taW4oQUlDc1sxOndoaWNoKEFJQ3M9PWtleSRBSUMpXSkpICMgaGlnaGVyLkF3DQogIA0KICAjIGVzdGltYXRlZCBwYXJhbWV0ZXJzIGZyb20ga2V5Lm1vZGVsDQogIG1vZFN1bW1hcnkgPC0gc3VtbWFyeShtb2RlbHNbW3doaWNoKGZpeC5lZmY9PWtleS5tb2RlbCldXSkNCiAgbW9kU3VtbWFyeSA8LSBtb2RTdW1tYXJ5JGNvZWZmaWNpZW50cw0KICBpZihtb2RlbFR5cGU9PSJDTE1NIil7IG1vZFN1bW1hcnkgPC0gbW9kU3VtbWFyeVtubGV2ZWxzKGRhdGFbLHJlc3BdKTpucm93KG1vZFN1bW1hcnkpLF0gfQ0KICBrZXkgPC0gcm91bmQobW9kU3VtbWFyeVt3aGljaChncmVwbChrZXkucHJlZGljdG9yLHJvdy5uYW1lcyhtb2RTdW1tYXJ5KSkpLDNdWzFdLDIpICMgdGFraW5nIG9ubHkgZmlyc3QgY29lZmYgZm9yIGtleS5yZXN1bHRzDQogIGtleS5yZXN1bHRzIDwtIGNiaW5kKGtleS5yZXN1bHRzLHQuMTk2PWFicyhrZXkpPjEuOTYsdD1rZXkpDQogIA0KICAjIHJldHVybmluZyBrZXkgcmVzdWx0cyAoc2lnLiBMUlQsIEF3IGhpZ2hlciB0aGFuIHByZXZpb3VzIG1vZGVsLCB0ID4gMS45NikNCiAgcmV0dXJuKGtleS5yZXN1bHRzKSB9DQpgYGANCjwvcD48L2RldGFpbHM+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PmBnbG1lck1lZGA8L3N1bW1hcnk+DQo8cD4NCmBgYHtyIH0NCiMnIEB0aXRsZSBHZW5lcmFsaXplZCBsaW5lYXIgbWl4ZWQtZWZmZWN0cyBtZWRpYXRpb24gYW5hbHlzaXMNCiMnIEBwYXJhbSBkYXRhID0gZGF0YS5mcmFtZSBvZiBkYXRhDQojJyBAcGFyYW0gcmVzcCA9IG5hbWUgb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChjaGFyYWN0ZXIpDQojJyBAcGFyYW0gdHJlYXQgPSBuYW1lIG9mIHRoZSB0cmVhdG1lbnQgdmFyaWFibGUgKGNoYXJhY3RlcikNCiMnIEBwYXJhbSBtZWQgPSBuYW1lIG9mIHRoZSBtZWRpYXRvciB2YXJpYWJsZSAoY2hhcmFjdGVyKQ0KIycgQHBhcmFtIGZpeC5lZmYgPSBjaGFyYWN0ZXIgdmVjdG9yIG9mIG5hbWVzIG9mIHRoZSBwcmVkaWN0b3IocykNCiMnIEBwYXJhbSBSRU1MID0gYXJndW1lbnQgZnJvbSB0aGUgbG1lNDo6bG1lcigpIGZ1bmN0aW9uLCBzZWUgP2xtZXINCiMnIEBwYXJhbSByYW4uZWZmID0gY2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSByYW5kb20gZWZmZWN0IGJ5IHVzaW5nIHRoZSBsbWU0IHN5bnRheCAoZGVmdWx0OiAiKDF8SUQpIikNCiMnIEBwYXJhbSBmYW1pbHkgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIEdMTShFUikgZmFtaWx5IHRvIGJlIHVzZWQgaW4gdGhlIG1vZGVscyAoZGVmYXVsdDogIm5vcm1hbCIpDQojJyBAcGFyYW0gbGluayA9IGNoYXJhY3RlciBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgR0xNKEVSKSBsaW5rIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIG1vZGVscyAoZGVmYXVsdDogImlkZW50aXR5IikNCiMnIEBwYXJhbSBzaW1zID0gbnVtYmVyIG9mIE1vbnRlIENhcmxvIGRyYXdzIGZvciBxdWFzaS1CYXllc2lhbiBDSSBhbmQgcC12YWx1ZSAoZGVmYXVsdDogMTAwMCkNCiMnIEBwYXJhbSBhbHBoYS5sZXZlbCA9IHNpZ25pZmljYW5jZSBsZXZlbCAoZGVmYXVsdDogMC4wNSkNCiMnIEBwYXJhbSBub0NvdiA9IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0ZXIgY292YXJpYXRlcyBzaG91bGQgYmUgY29uc2lkZXJlZCBpbiB0aGUgbWVkaWF0aW9uIG1vZGVscyBvciBub3QNCiMnIEBwYXJhbSBtZXNzYWdlcyA9IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCBmb3IgZWFjaCBvcGVyYXRpb24gKGRlZnVsdDogRkFMU0UpDQpnbG1lck1lZCA8LSBmdW5jdGlvbihkYXRhLHJlc3AsdHJlYXQsbWVkLGZpeC5lZmYsUkVNTD1UUlVFLHJhbi5lZmY9IigxfElEKSIsZmFtaWx5PSJub3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgbGluaz0iaWRlbnRpdHkiLHNpbXM9MTAwMCxhbHBoYS5sZXZlbD0wLjA1LG5vQ292PUZBTFNFLG1lc3NhZ2VzPUZBTFNFKXsgDQogIA0KICBsaWJyYXJ5KGxtZTQpOyBsaWJyYXJ5KG1lZGlhdGlvbikNCiAgDQogIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJSdW5uaW5nIixtb2RlbFR5cGUsImFuYWx5c2lzIG9mIixyZXNwLCIuLi4iKSB9DQogIA0KICAjIG1vZGVsaW5nIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICANCiAgIyBjcmVhdGluZyBtb2RlbCBmb3JtdWxhcw0KICBtTWVkLmYgPC0gcGFzdGUoZ3N1YigiLm1jIiwiIixtZWQpLCJ+IixmaXguZWZmWzFdKQ0KICBpZihsZW5ndGgoZml4LmVmZik+MSl7DQogICAgZm9yKGkgaW4gMjpsZW5ndGgoZml4LmVmZikpeyBtTWVkLmYgPC0gcGFzdGUobU1lZC5mLGZpeC5lZmZbaV0sc2VwPSIgKyAiKSB9fSAjIG1lZGlhdG9yIG1vZGVsIA0KICBtT3V0LmYgPC0gcGFzdGUoZ3N1Yihnc3ViKCIubWMiLCIiLG1lZCkscmVzcCxtTWVkLmYpLG1lZCxzZXA9IiArICIpICMgb3V0Y29tZSBtb2RlbA0KICBtTWVkLmYgPC0gcGFzdGUobU1lZC5mLHJhbi5lZmYsc2VwPSIgKyAiKSAjIGFkZGluZyByYW5kb20gZWZmZWN0cw0KICBtT3V0LmYgPC0gcGFzdGUobU91dC5mLHJhbi5lZmYsc2VwPSIgKyAiKQ0KICANCiAgIyBmaXR0aW5nIG1vZGVscw0KICBpZihtZXNzYWdlcz09VFJVRSl7IGNhdCgiXG5cbkZpdHRpbmcgR0xNUiBtb2RlbHMgb2YiLHJlc3AsImFuZCIsbWVkLCJvbiIsbnJvdyhkYXRhKSwib2JzZXJ2YXRpb25zIGZyb20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihkYXRhJElEKSkpLCJwYXJ0aWNpcGFudHMgXG4gICB1c2luZyB0aGUiLGZhbWlseSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFtaWx5IHdpdGggdGhlIixsaW5rLCJsaW5rIGZ1bmN0aW9uIHVzaW5nIixpZmVsc2UoUkVNTD09RkFMU0UsIk1MIiwiUkVNTCIpLCJlc3RpbWF0b3IuLi4iKSB9DQogIGlmKGZhbWlseT09Im5vcm1hbCIgJiBsaW5rPT0iaWRlbnRpdHkiKXsgDQogICAgbU1lZCA8LSBsbWVyKGFzLmZvcm11bGEobU1lZC5mKSxkYXRhPWRhdGEsUkVNTD1SRU1MKQ0KICAgIG1PdXQgPC0gbG1lcihhcy5mb3JtdWxhKG1PdXQuZiksZGF0YT1kYXRhLFJFTUw9UkVNTCkNCiAgfSBlbHNlIGlmKGZhbWlseT09Im5vcm1hbCIgJiBsaW5rIT0iaWRlbnRpdHkiKSB7IA0KICAgICAgbU1lZCA8LSBnbG1lcihhcy5mb3JtdWxhKG1NZWQuZiksZGF0YT1kYXRhLFJFTUw9UkVNTCxmYW1pbHk9Z2F1c3NpYW4obGluaz1saW5rKSkgDQogICAgICBtT3V0IDwtIGdsbWVyKGFzLmZvcm11bGEobU91dC5mKSxkYXRhPWRhdGEsUkVNTD1SRU1MLGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspKSANCiAgfSBlbHNlIGlmKGZhbWlseT09ImdhbW1hIil7DQogICAgICBtTWVkIDwtIGdsbWVyKGFzLmZvcm11bGEobU1lZC5mKSxkYXRhPWRhdGEsZmFtaWx5PUdhbW1hKGxpbms9bGluaykpIA0KICAgICAgbU91dCA8LSBnbG1lcihhcy5mb3JtdWxhKG1PdXQuZiksZGF0YT1kYXRhLGZhbWlseT1HYW1tYShsaW5rPWxpbmspKSAgDQogIH0gZWxzZSB7IHN0b3AobWVzc2FnZT0iRXJyb3I6IG9ubHkgbm9ybWFsLCBsb2dpc3RpYywgYW5kIGdhbW1hIGZhbWlseSBhcmUgYWxsb3dlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpZGVudGl0eSwgaW52ZXJzZSwgYW5kIGxvZyBsaW5rIGZ1bmN0aW9ucyIpIH0NCiAgDQogICMgbWVkaWF0aW9uIGFuYWx5c2lzDQogIGlmKG5vQ292PT1UUlVFKXsNCiAgICAgbWVkTSA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkLG1vZGVsLnk9bU91dCx0cmVhdD10cmVhdCxtZWRpYXRvcj1tZWQsICMgbWVkaWF0aW9uICYgb3V0cHV0IG1vZGVscywgdHJlYXRtZW50ICYgbWVkaWF0b3INCiAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1OVUxMLGJvb3Q9RkFMU0Usc2ltcz1zaW1zKSAjIHF1YXNpLUJheWVzaWFuIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIH0gZWxzZSB7DQogICAgbWVkTSA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkLG1vZGVsLnk9bU91dCx0cmVhdD10cmVhdCxtZWRpYXRvcj1tZWQsICMgbWVkaWF0aW9uICYgb3V0cHV0IG1vZGVscywgdHJlYXRtZW50ICYgbWVkaWF0b3INCiAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1kYXRhWyxmaXguZWZmW2ZpeC5lZmYhPXRyZWF0XV0sICMgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICBib290PUZBTFNFLHNpbXM9c2ltcykgfSAjIHF1YXNpLUJheWVzaWFuIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIA0KICAjIHJldHVybmluZyBlc3RpbWF0ZWQgcXVhc2ktQmF5ZXNpYW4gcC12YWx1ZQ0KICBrZXkucmVzdWx0cyA8LSBkYXRhLmZyYW1lKGluZGlyZWN0LnA9bWVkTSRkLmF2Zy5wLGluZC5wLnNpZz1tZWRNJGQuYXZnLnA8YWxwaGEubGV2ZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnA9bWVkTSR6LmF2Zy5wLGluZC5wLnNpZz1tZWRNJHouYXZnLnA8YWxwaGEubGV2ZWwpDQogIHJldHVybihrZXkucmVzdWx0cykgfQ0KYGBgDQo8L3A+PC9kZXRhaWxzPg0KDQo8YnI+DQoNCk1vcmVvdmVyLCBzaW5jZSBhIGZ1cnRoZXIgcm9idXN0bmVzcyBjaGVjayB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIG91dGNvbWVzIGlzIHJlcHJvZHVjaW5nIHRoZSBhbmFseXNlcyB3aXRoIHRoZSBmdWxsIHNhbXBsZSwgd2UgYWxzbyByZXByb2Nlc3MgdGhlICoqZnVsbCBgZGlhcnlgIGRhdGFzZXQqKiBieSByZW1vdmluZyBtaXNzaW5nIHJlc3BvbnNlcyBhbmQgbWVhbi1jZW50ZXJpbmcgcHJlZGljdG9ycy4NCg0KPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBjb2RlPC9zdW1tYXJ5Pg0KPHA+DQpgYGB7ciB9DQojIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZQ0KY2xlYW5CUF9hZnRfZnVsbCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoZGlhcnlbLGMoIklEIiwiU0JQX2FmdCIsIkRCUF9hZnQiLCJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIpXSkpICMgbGlzdHdpc2UgZGVsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmNsZWFuQlBfYWZ0X2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2FmdF9mdWxsJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdChucm93KGNsZWFuQlBfYWZ0X2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfYWZ0X2Z1bGwkSUQpKSksInBhcnRpY2lwYW50cyIpDQpmb3IoVmFyIGluIGMoIldITFNNIikpeyAjIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0KICBjbGVhbkJQX2FmdF9wcmVscXNfZnVsbCA8LSBjYmluZChwcmVscXNbcHJlbHFzJElEJWluJWxldmVscyhjbGVhbkJQX2FmdF9mdWxsJElEKSxdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUoY2xlYW5CUF9hZnRfZnVsbFssVmFyXSxsaXN0KGNsZWFuQlBfYWZ0X2Z1bGwkSUQpLG1lYW4pWywyXSkgIyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKGNsZWFuQlBfYWZ0X3ByZWxxc19mdWxsKVtuY29sKGNsZWFuQlBfYWZ0X3ByZWxxc19mdWxsKV0gPC0gcGFzdGUwKFZhciwiLmNtIikNCiAgY2xlYW5CUF9hZnRfZnVsbCA8LSBqb2luKGNsZWFuQlBfYWZ0X2Z1bGwsY2xlYW5CUF9hZnRfcHJlbHFzX2Z1bGxbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQogIGNsZWFuQlBfYWZ0X2Z1bGxbLHBhc3RlMChWYXIsIi5tYyIpXSA8LSBjbGVhbkJQX2FmdF9mdWxsWyxWYXJdIC0gY2xlYW5CUF9hZnRfZnVsbFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkDQpmb3IoVmFyIGluIGMoImFnZSIsIkJNSSIsIldITFNNLmNtIikpeyANCiAgY2xlYW5CUF9hZnRfZnVsbFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSBjbGVhbkJQX2FmdF9mdWxsWyxWYXJdIC0gbWVhbihjbGVhbkJQX2FmdF9wcmVscXNfZnVsbFssVmFyXSkgfSAjIGdtYw0KDQojIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUNCmNsZWFuQlBfZXZlX2Z1bGwgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGRpYXJ5WyxjKCJJRCIsIlNCUF9ldmUiLCJEQlBfZXZlIiwiZ2VuZGVyIiwiYWdlIiwiQk1JIiwgIyBsaXN0LXdpc2UgZGVsZXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSExTTSIsIlBEIildKSkNCmNsZWFuQlBfZXZlX2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2V2ZV9mdWxsJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdChucm93KGNsZWFuQlBfZXZlX2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfZXZlX2Z1bGwkSUQpKSksInBhcnRpY2lwYW50cyIpDQpmb3IoVmFyIGluIGMoIldITFNNIiwiUEQiKSl7ICMgcGVyc29uLW1lYW4tY2VudGVyaW5nIGx2LTEgY29udGludW91cyBwcmVkaWN0b3JzDQogIGNsZWFuQlBfZXZlX3ByZWxxc19mdWxsIDwtIGNiaW5kKHByZWxxc1twcmVscXMkSUQlaW4lbGV2ZWxzKGNsZWFuQlBfZXZlX2Z1bGwkSUQpLF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZShjbGVhbkJQX2V2ZV9mdWxsWyxWYXJdLGxpc3QoY2xlYW5CUF9ldmVfZnVsbCRJRCksbWVhbilbLDJdKSAjIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMoY2xlYW5CUF9ldmVfcHJlbHFzX2Z1bGwpW25jb2woY2xlYW5CUF9ldmVfcHJlbHFzX2Z1bGwpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhbkJQX2V2ZV9mdWxsIDwtIGpvaW4oY2xlYW5CUF9ldmVfZnVsbCxjbGVhbkJQX2V2ZV9wcmVscXNfZnVsbFssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCiAgY2xlYW5CUF9ldmVfZnVsbFsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuQlBfZXZlX2Z1bGxbLFZhcl0gLSBjbGVhbkJQX2V2ZV9mdWxsWyxwYXN0ZTAoVmFyLCIuY20iKV0gfSAjIG1lYW4tY2VudGVyZWQNCmZvcihWYXIgaW4gYygiYWdlIiwiQk1JIiwiV0hMU00uY20iKSl7IA0KICBjbGVhbkJQX2V2ZV9mdWxsWyxwYXN0ZTAoVmFyLCIuZ21jIildIDwtIGNsZWFuQlBfZXZlX2Z1bGxbLFZhcl0gLSBtZWFuKGNsZWFuQlBfZXZlWyFkdXBsaWNhdGVkKGNsZWFuQlBfZXZlJElEKSxWYXJdKSB9ICMgZ21jDQoNCiMgYWZ0ZXJub29uLXRvLWV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUNCmNsZWFuQlBfbWVkX2V2ZV9mdWxsIDwtIGFzLmRhdGEuZnJhbWUobmEub21pdChkaWFyeVssYygiSUQiLCJTQlBfYWZ0IiwiREJQX2FmdCIsIlNCUF9ldmUiLCJEQlBfZXZlIiwgIyBsaXN0LXdpc2UgZGVsZXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZGVyIiwiYWdlIiwiQk1JIiwiV0hMU00iLCJQRCIpXSkpIA0KY2xlYW5CUF9tZWRfZXZlX2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX21lZF9ldmVfZnVsbCRJRCkpIA0Kd2lkZSA8LSBjbGVhbkJQX21lZF9ldmVfZnVsbFshZHVwbGljYXRlZChjbGVhbkJQX21lZF9ldmVfZnVsbCRJRCksXSANCmZvcihWYXIgaW4gYygiV0hMU00iLCJQRCIsIlNCUF9hZnQiLCJEQlBfYWZ0Iikpew0KICB3aWRlIDwtIGNiaW5kKHdpZGUsYWdncmVnYXRlKGNsZWFuQlBfbWVkX2V2ZV9mdWxsWyxWYXJdLGxpc3QoY2xlYW5CUF9tZWRfZXZlX2Z1bGwkSUQpLG1lYW4pWywyXSkgDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuQlBfbWVkX2V2ZV9mdWxsIDwtIGpvaW4oY2xlYW5CUF9tZWRfZXZlX2Z1bGwsd2lkZVssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikgDQogIGNsZWFuQlBfbWVkX2V2ZV9mdWxsWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5CUF9tZWRfZXZlX2Z1bGxbLFZhcl0gLSBjbGVhbkJQX21lZF9ldmVfZnVsbFsscGFzdGUwKFZhciwiLmNtIildIH0gDQpmb3IoVmFyIGluIGMoImFnZSIsIkJNSSIsIldITFNNLmNtIikpeyBjbGVhbkJQX21lZF9ldmVfZnVsbFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSANCiAgY2xlYW5CUF9tZWRfZXZlX2Z1bGxbLFZhcl0gLSBtZWFuKHdpZGVbLFZhcl0pIH0gIyBnbWMNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5CUF9tZWRfZXZlX2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsDQogICAgbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfbWVkX2V2ZV9mdWxsJElEKSkpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIGVtb3Rpb25hbCBleGhhdXN0aW9uDQpjbGVhbkVFX2Z1bGwgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGRpYXJ5WyxjKCJJRCIsIkVFIiwiZ2VuZGVyIiwiUEQiLCJXSExTTSIpXSkpICMgbGlzdHdpc2UgZGVsZXRpb24NCmNsZWFuRUVfZnVsbCRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuRUVfZnVsbCRJRCkpICMgcmVzZXR0aW5nIHBhcnRpY2lwYW50IGlkZW50aWZpZXIgbGV2ZWxzDQpjYXQobnJvdyhjbGVhbkVFX2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuRUVfZnVsbCRJRCkpKSwicGFydGljaXBhbnRzIikNCmZvcihWYXIgaW4gYygiUEQiLCJXSExTTSIpKXsgIyBwZXJzb24tbWVhbi1jZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIHByZWRpY3RvcnMNCiAgY2xlYW5fcHJlbHFzX2Z1bGwgPC0gY2JpbmQocHJlbHFzW3ByZWxxcyRJRCVpbiVsZXZlbHMoY2xlYW5FRV9mdWxsJElEKSxdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUoY2xlYW5FRV9mdWxsWyxWYXJdLGxpc3QoY2xlYW5FRV9mdWxsJElEKSxtZWFuKVssMl0pICMgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyhjbGVhbl9wcmVscXNfZnVsbClbbmNvbChjbGVhbl9wcmVscXNfZnVsbCldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuRUVfZnVsbCA8LSBqb2luKGNsZWFuRUVfZnVsbCxjbGVhbl9wcmVscXNfZnVsbFssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCiAgY2xlYW5FRV9mdWxsWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5FRV9mdWxsWyxWYXJdIC0gY2xlYW5FRV9mdWxsWyxwYXN0ZTAoVmFyLCIuY20iKV0gfSAjIG1lYW4tY2VudGVyZWQgc2NvcmVzDQpmb3IoVmFyIGluIGMoIldITFNNLmNtIikpeyBjbGVhbkVFX2Z1bGxbLHBhc3RlMChWYXIsIi5nbWMiKV0gPC0gY2xlYW5FRV9mdWxsWyxWYXJdIC0gbWVhbihjbGVhbkVFX2Z1bGxbLFZhcl0pIH0gIyBnbWMNCg0KIyBzbGVlcCBkaXN0dXJiYW5jZXMNCmNsZWFuU0RfZnVsbCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoZGlhcnlbLGMoIklEIiwiU0QiLCJnZW5kZXIiLCJkYWlseUhhc3NsZXNfZXZlIiwiUEQiLCJXSExTTSIpXSkpICMgbGlzdHdpc2UgZGVsDQpjbGVhblNEX2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhblNEX2Z1bGwkSUQpKSAjIHJlc2V0dGluZyBwYXJ0aWNpcGFudCBpZGVudGlmaWVyIGxldmVscw0KY2F0KG5yb3coY2xlYW5TRF9mdWxsKSwiY29tcGxldGUgb2JzIGZyb20iLG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhblNEX2Z1bGwkSUQpKSksInBhcnRpY2lwYW50cyIpDQpmb3IoVmFyIGluIGMoIlBEIiwiV0hMU00iKSl7ICMgcGVyc29uLW1lYW4tY2VudGVyaW5nIGx2LTEgY29udGludW91cyBwcmVkaWN0b3JzDQogIGNsZWFuX3ByZWxxc19mdWxsIDwtIGNiaW5kKHByZWxxc1twcmVscXMkSUQlaW4lbGV2ZWxzKGNsZWFuU0RfZnVsbCRJRCksXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlKGNsZWFuU0RfZnVsbFssVmFyXSxsaXN0KGNsZWFuU0RfZnVsbCRJRCksbWVhbilbLDJdKSAjIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMoY2xlYW5fcHJlbHFzX2Z1bGwpW25jb2woY2xlYW5fcHJlbHFzX2Z1bGwpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhblNEX2Z1bGwgPC0gam9pbihjbGVhblNEX2Z1bGwsY2xlYW5fcHJlbHFzX2Z1bGxbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQogIGNsZWFuU0RfZnVsbFsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuU0RfZnVsbFssVmFyXSAtIGNsZWFuU0RfZnVsbFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KZm9yKFZhciBpbiBjKCJXSExTTS5jbSIpKXsgY2xlYW5TRF9mdWxsWyxwYXN0ZTAoVmFyLCIuZ21jIildIDwtIGNsZWFuU0RfZnVsbFssVmFyXSAtIG1lYW4oY2xlYW5TRF9mdWxsWyxWYXJdKSB9ICMgZ21jDQpgYGANCjwvcD48L2RldGFpbHM+DQoNCjxicj4NCg0KQXMgYSBmdXJ0aGVyIGNoZWNrLCB3ZSBpbmNsdWRlIGBwb3NpdGlvbmAgYXMgYW4gYWRkaXRpb25hbCBjb3ZhcmlhdGUsIHdoaWNoIHdlIHJlY29kZSBpbnRvIHR3byBsZXZlbHMsIG5hbWVseSAiRW1wbG95ZWUvUHJvamVjdCIgdnMuICJNYW5hZ2Vycy9FbXBsb3llcnMiLg0KYGBge3IgfQ0KY2xlYW5CUF9hZnQkcG9zaXRpb24gPC0gYXMuZmFjdG9yKGdzdWIoIkVtcGxveWVlIiwiZW1wbG95ZWUvcHJvamVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJQcm9qZWN0IiwiZW1wbG95ZWUvcHJvamVjdCIsY2xlYW5CUF9hZnQkcG9zaXRpb24pKSkNCmNsZWFuQlBfZXZlJHBvc2l0aW9uIDwtIGFzLmZhY3Rvcihnc3ViKCJFbXBsb3llZSIsImVtcGxveWVlL3Byb2plY3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiUHJvamVjdCIsImVtcGxveWVlL3Byb2plY3QiLGNsZWFuQlBfZXZlJHBvc2l0aW9uKSkpDQpjbGVhbkJQX21lZF9ldmUkcG9zaXRpb24gPC0gYXMuZmFjdG9yKGdzdWIoIkVtcGxveWVlIiwiZW1wbG95ZWUvcHJvamVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJQcm9qZWN0IiwiZW1wbG95ZWUvcHJvamVjdCIsY2xlYW5CUF9tZWRfZXZlJHBvc2l0aW9uKSkpDQpjbGVhbkVFJHBvc2l0aW9uIDwtIGFzLmZhY3Rvcihnc3ViKCJFbXBsb3llZSIsImVtcGxveWVlL3Byb2plY3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiUHJvamVjdCIsImVtcGxveWVlL3Byb2plY3QiLGNsZWFuRUUkcG9zaXRpb24pKSkNCmNsZWFuU0QkcG9zaXRpb24gPC0gYXMuZmFjdG9yKGdzdWIoIkVtcGxveWVlIiwiZW1wbG95ZWUvcHJvamVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJQcm9qZWN0IiwiZW1wbG95ZWUvcHJvamVjdCIsY2xlYW5TRCRwb3NpdGlvbikpKQ0KYGBgDQoNCjxicj4NCg0KRmluYWxseSwgd2UgbG9hZCB0aGUgcmF3IHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUgaXRlbSBzY29yZXMgdG8gY29tcHV0ZSB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSByZXRyb3NwZWN0aXZlIHZlcnNpb24gb2YgdGhlIERVV0FTLCB1c2VkIGZvciBhIHJvYnVzdG5lc3MgY2hlY2suDQpgYGB7ciB9DQojIGlzb2xhdGluZyByYXcgaXRlbSBzY29yZXMgYXQgdGhlIHJldHJvc3BlY3RpdmUgRFVXQVMgc2NhbGUNCnByZWxxcy5yZXRyb1dITFNNIDwtIHByZWxxc1ssYygiSUQiLHBhc3RlMCgiZHV3YXMiLDE6MTApKV0NCnByZWxxcy5yZXRyb1dITFNNIDwtIHByZWxxcy5yZXRyb1dITFNNW3ByZWxxcy5yZXRyb1dITFNNJElEICVpbiUgY2xlYW4kSUQsXSAjIHN1YnNhbXBsaW5nIHBhcnRpY2lwYW50cyBpbmNsdWRlZCBpbiB0aGUgY2xlYW4gZGF0YXNldA0KcHJlbHFzLnJldHJvV0hMU00kSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihwcmVscXMucmV0cm9XSExTTSRJRCkpDQpjYXQoIkluY2x1ZGVkIHBhcnRpY2lwYW50cyA9IixubGV2ZWxzKHByZWxxcy5yZXRyb1dITFNNJElEKSkNCg0KIyBjb21wdXRpbmcgQ3JvbmJhY2gncyBhbHBoYSBhbmQgOTUlIENJDQpwc3ljaDo6YWxwaGEocHJlbHFzLnJldHJvV0hMU01bLHBhc3RlMCgiZHV3YXMiLDE6MTApXSkkZmVsZHQNCg0KIyBjb21wdXRpbmcgZ3JhbmQtbWVhbi1jZW50ZXJlZCBjb21wb3NpdGUgc2NvcmUgYW5kIGFkZGluZyBpdCB0byBhbGwgZGF0YXNldHMgdXNlZCBiZWxvdw0KcHJlbHFzLnJldHJvV0hMU00kV0hMU00ucmV0cm8gPC0gYXBwbHkocHJlbHFzLnJldHJvV0hMU01bLHBhc3RlMCgiZHV3YXMiLDE6MTApXSwxLG1lYW4pDQpjbGVhbkJQX2FmdCA8LSBwbHlyOjpqb2luKGNsZWFuQlBfYWZ0LHByZWxxcy5yZXRyb1dITFNNWyxjKCJJRCIsIldITFNNLnJldHJvIildLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQpjbGVhbkJQX2FmdCRXSExTTS5yZXRyby5nbWMgPC0gY2xlYW5CUF9hZnQkV0hMU00ucmV0cm8gLSBtZWFuKGNsZWFuQlBfYWZ0JFdITFNNLnJldHJvKQ0KY2xlYW5CUF9ldmUgPC0gcGx5cjo6am9pbihjbGVhbkJQX2V2ZSxwcmVscXMucmV0cm9XSExTTVssYygiSUQiLCJXSExTTS5yZXRybyIpXSxieT0iSUQiLHR5cGU9ImxlZnQiKQ0KY2xlYW5CUF9ldmUkV0hMU00ucmV0cm8uZ21jIDwtIGNsZWFuQlBfZXZlJFdITFNNLnJldHJvIC0gbWVhbihjbGVhbkJQX2V2ZSRXSExTTS5yZXRybykNCmNsZWFuQlBfbWVkX2V2ZSA8LSBwbHlyOjpqb2luKGNsZWFuQlBfbWVkX2V2ZSxwcmVscXMucmV0cm9XSExTTVssYygiSUQiLCJXSExTTS5yZXRybyIpXSxieT0iSUQiLHR5cGU9ImxlZnQiKQ0KY2xlYW5CUF9tZWRfZXZlJFdITFNNLnJldHJvLmdtYyA8LSBjbGVhbkJQX21lZF9ldmUkV0hMU00ucmV0cm8gLSBtZWFuKGNsZWFuQlBfbWVkX2V2ZSRXSExTTS5yZXRybykNCmNsZWFuRUUgPC0gcGx5cjo6am9pbihjbGVhbkVFLHByZWxxcy5yZXRyb1dITFNNWyxjKCJJRCIsIldITFNNLnJldHJvIildLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQpjbGVhbkVFJFdITFNNLnJldHJvLmdtYyA8LSBjbGVhbkVFJFdITFNNLnJldHJvIC0gbWVhbihjbGVhbkVFJFdITFNNLnJldHJvKQ0KY2xlYW5TRCA8LSBwbHlyOjpqb2luKGNsZWFuU0QscHJlbHFzLnJldHJvV0hMU01bLGMoIklEIiwiV0hMU00ucmV0cm8iKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCmNsZWFuU0QkV0hMU00ucmV0cm8uZ21jIDwtIGNsZWFuU0QkV0hMU00ucmV0cm8gLSBtZWFuKGNsZWFuU0QkV0hMU00ucmV0cm8pDQpgYGANCg0KPGJyPg0KDQojIyA0LjEuIEJsb29kIHByZXNzdXJlDQoNCiMjIyA0LjEuMS4gQWZ0ZXJub29uIEJQIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpGb3IgYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlLCB3ZSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyByb2J1c3RuZXNzIGNoZWNrczoNCg0KMS4gYE5vIEluZmxgOiB3ZSByZW1vdmUgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzDQoNCjIuIGBObyBkeXNmL2RydWdzYDogd2UgcmVtb3ZlIGFsbCBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucywgaG9ybW9uYWwgb3IgcHN5Y2hvYWN0aXZlIG1lZGljYXRpb25zLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgYmxvb2QgcHJlc3N1cmUNCg0KMy4gYE5vIENvdmA6IHdlIHJlbW92ZSBhbGwgY292YXJpYXRlcywgdGhhdCBpcyB3ZSBvbmx5IGluY2x1ZGUgYFdITFNNLm1jYCBhbmQgaXRzIGludGVyYWN0aW9ucyBhcyBtb2RlbCBwcmVkaWN0b3JzDQoNCjQuIGBBbGwgaW5gOiB3ZSBpbmNsdWRlIGFsbCBjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSBhbGwgcGFydGljaXBhbnRzLCBpbmNsdWRpbmcgdGhvc2UgbWVldGluZyB0aGUgZXhjbHVzaW9uIGNyaXRlcmlhIGZvciBjb21wbGlhbmNlIGFuZCBibG9vZCBwcmVzc3VyZQ0KDQo1LiBgTUxgOiB3ZSByZWZpdCB0aGUgbW9kZWxzIGJ5IHVzaW5nIHRoZSBNYXhpbXVtIExpa2VsaWhvb2QgZXN0aW1hdG9yLCByYXRoZXIgdGhhbiB0aGUgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QNCg0KNi4gYFJhbmQgc2xvcGVgOiB3ZSBpbmNsdWRlIHRoZSByYW5kb20gc2xvcGUgZm9yIGBXSExTTS5tY2AgDQoNCjcuIGBsb2dUcmFuc2ZgOiB3ZSBsb2ctdHJhbnNmb3JtIHRoZSByZXNwb25zZSB2YXJpYWJsZSB2YWx1ZXMgYmVmb3JlIGZpdHRpbmcgdGhlIG1vZGVscw0KDQo4LiBgY29uZm91bmRlcnNfYWZ0YDogd2UgaW5jbHVkZSBwb3RlbnRpYWxseSBjb25mb3VuZGluZyBmYWN0b3JzIGZvciBibG9vZCBwcmVzc3VyZSAoZS5nLiwgc21va2luZywgcGh5c2ljYWwgYWN0aXZpdHkpIHJlcG9ydGVkIGluIHRoZSBhZnRlcm5vb24gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBwb3NpdGlvbmA6IHdlIGluY2x1ZGUgam9iIHBvc2l0aW9uIChFbXBsb3llZS9Qcm9qZWN0IHZzLiBNYW5hZ2VyLyhTZWxmLSlFbXBsb3llcikgYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjEwLiBgY2hpbGRyZW5gOiB3ZSBpbmNsdWRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBObyBmbGFnQlBgOiB3ZSBleGNsdWRlIGFsbCBvYnNlcnZhdGlvbnMgdGhhdCB3ZXJlIHJlcHJvY2Vzc2VkIGR1ZSB0byBleHRyZW1lIEJQIHZhbHVlcyAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjExLiBgTm8gZmxhZ1RpbWVgOiB3ZSBleGNsdWRlIGFsbCBvYnNlcnZhdGlvbnMgdGhhdCB3ZXJlIGZsYWdnZWQgZHVlIHRvIHRoZWlyIGFzc29jaWF0ZWQgdGltaW5nIChlLmcuLCBtb3JuaW5nIEJQIHJlY29yZGVkIGluIHRoZSBhZnRlcm5vb24pIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSkNCg0KMTIuIGBObyBjYXJlbGVzc2A6IHdlIGV4Y2x1ZGUgb25lIHBhcnRpY2lwYW50IGBTMTM3YCBmbGFnZ2VkIGFzIHBvdGVudGlhbGx5IGNhcmVsZXNzIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSkuDQoNCjEzLiBgV0VgOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3Igc3RhdGUgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSB3b3JraW5nIGV4Y2Vzc2l2ZWx5IGRpbWVuc2lvbg0KDQoxNC4gYFdDYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTUuIGBXSExTTSByZXRyb2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciB0cmFpdCB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHJldHJvc3BlY3RpdmUgdmVyc2lvbiBvZiB0aGUgRFVXQVMgaW5jbHVkZWQgaW4gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUuDQoNCjxicj4NCg0KSW4gYWxsIGNhc2VzLCB0aGUgKipyZXN1bHRzIGFyZSBjb25zaXN0ZW50Kiogd2l0aCB0aG9zZSByZXBvcnRlZCBpbiB0aGUgbWFpbiBhbmFseXNlcywgc2hvd2luZyBzdWJzdGFudGlhbCBjb250cmlidXRpb24gYW5kIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AuDQoNCiMjIyMgU0JQX2FmdA0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KY2hlY2tzIDwtIGMoIk9yaWdpbmFsIiwiTm8gSW5mbCIsIk5vIGR5c2YvZHJ1Z3MiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dUcmFuc2YiLA0KICAgICAgICAgICAgImNvbmZvdW5kZXJzX2FmdCIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJObyBmbGFnQlAiLCJObyBmbGFnVGltZSIsIk5vIGNhcmVsZXNzIiwiV0UiLCJXQyIsIldITFNNIHJldHJvIikNCg0KIyBtYWluIGVmZmVjdCBvZiBXSExTTS5tYw0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIldITFNNLmNtLmdtYyIsIldITFNNLm1jIikgIyBwcmVkaWN0b3JzDQpyIDwtICJTQlBfYWZ0IiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnRbIWNsZWFuQlBfYWZ0JElEJWluJWMoIlMwOTYiLCJTMDgyIiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9hZnQkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9hZnQkcHN5X2RydWdzPT0iTm8iLF0sIA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnQscmVzcD1yLGZpeC5lZmY9YygiV0hMU00ubWMiKSwgIyB3aXRob3V0IGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdF9mdWxsLHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG1heGltdW0gbGlrZWxpaG9vZA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIsUkVNTD1GQUxTRSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnQscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyByYW5kb20gc2xvcGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLHJhbi5lZmY9IihXSExTTS5tY3xJRCkiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPSJsb2coU0JQX2FmdCkiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBsb2ctdHJhbnNmDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnQscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6M10sImNvbmZvdW5kZXJzX2FmdCIsICMgYWRkaW5nIGNvbmZvdW5kZXJzX2FmdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1s0Omxlbmd0aChwcmVkaWN0b3JzKV0pLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1s0Omxlbmd0aChwcmVkaWN0b3JzKV0pLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1s0Omxlbmd0aChwcmVkaWN0b3JzKV0pLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRmbGFnQlBfYWZ0PT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnRbY2xlYW5CUF9hZnQkZmxhZ1RpbWU9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRjYXJlbGVzcz09RkFMU0UsXSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50DQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwgDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldFLm1jIixrZXkubW9kZWw9IldFLm1jIiksICMgd29ya2luZyBleGNlc3MNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSwgDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldDLm1jIixrZXkubW9kZWw9IldDLm1jIiksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLCAjIFdITFNNIHJldHJvDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5yZXRyby5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIikpKQ0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2FmdA0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KY2hlY2tzIDwtIGMoIk9yaWdpbmFsIiwiTm8gSW5mbCIsIk5vIGR5c2YvZHJ1Z3MiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dUcmFuc2YiLA0KICAgICAgICAgICAgImNvbmZvdW5kZXJzX2FmdCIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJObyBmbGFnQlAiLCJObyBmbGFnVGltZSIsIk5vIGNhcmVsZXNzIiwiV0UiLCJXQyIsIldITFNNIHJldHJvIikNCg0KIyBtYWluIGVmZmVjdCBvZiBXSExTTS5tYw0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIldITFNNLmNtLmdtYyIsIldITFNNLm1jIikgIyBwcmVkaWN0b3JzDQpyIDwtICJEQlBfYWZ0IiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnRbIWNsZWFuQlBfYWZ0JElEJWluJWMoIlMwODIiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX2FmdCRwc3lfZHJ1Z3M9PSJObyIgJiBjbGVhbkJQX2FmdCRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKCJXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0X2Z1bGwscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIixSRU1MPUZBTFNFKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIHJhbmRvbSBzbG9wZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9ImxvZyhTQlBfYWZ0KSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIGxvZy10cmFuc2YNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwiY29uZm91bmRlcnNfYWZ0IiwgIyBhZGRpbmcgY29uZm91bmRlcnNfYWZ0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjNdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjNdLCJjaGlsZHJlbiIsICMgYWRkaW5nIGNoaWxkcmVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JGZsYWdCUF9hZnQ9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIEJQDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JGNhcmVsZXNzPT1GQUxTRSxdLCAjIHdpdGhvdXQgY2FyZWxlc3MNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0UubWMiLGtleS5tb2RlbD0iV0UubWMiKSwgIyB3b3JraW5nIGV4Y2Vzcw0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0MubWMiLGtleS5tb2RlbD0iV0MubWMiKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvLmdtYyIscHJlZGljdG9ycyksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpKSkNCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyMgNC4xLjIuIEV2ZW5pbmcgQlAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLCB3ZSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyByb2J1c3RuZXNzIGNoZWNrczoNCg0KMS4gYE5vIEluZmxgOiB3ZSByZW1vdmUgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzDQoNCjIuIGBObyBkeXNmL2RydWdzYDogd2UgcmVtb3ZlIGFsbCBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucywgaG9ybW9uYWwgb3IgcHN5Y2hvYWN0aXZlIG1lZGljYXRpb25zLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgYmxvb2QgcHJlc3N1cmUNCg0KMy4gYE5vIENvdmA6IHdlIHJlbW92ZSBhbGwgY292YXJpYXRlcywgdGhhdCBpcyB3ZSBvbmx5IGluY2x1ZGUgYFdITFNNLm1jYCBhbmQgaXRzIGludGVyYWN0aW9ucyBhcyBtb2RlbCBwcmVkaWN0b3JzDQoNCjQuIGBBbGwgaW5gOiB3ZSBpbmNsdWRlIGFsbCBjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSBhbGwgcGFydGljaXBhbnRzLCBpbmNsdWRpbmcgdGhvc2UgbWVldGluZyB0aGUgZXhjbHVzaW9uIGNyaXRlcmlhIGZvciBjb21wbGlhbmNlIGFuZCBibG9vZCBwcmVzc3VyZQ0KDQo1LiBgTUxgOiB3ZSByZWZpdCB0aGUgbW9kZWxzIGJ5IHVzaW5nIHRoZSBNYXhpbXVtIExpa2VsaWhvb2QgZXN0aW1hdG9yLCByYXRoZXIgdGhhbiB0aGUgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QNCg0KNi4gYFJhbmQgc2xvcGVgOiB3ZSBpbmNsdWRlIHRoZSByYW5kb20gc2xvcGUgZm9yIGBXSExTTS5tY2AgDQoNCjcuIGBsb2dUcmFuc2ZgOiB3ZSBsb2ctdHJhbnNmb3JtIHRoZSByZXNwb25zZSB2YXJpYWJsZSB2YWx1ZXMgYmVmb3JlIGZpdHRpbmcgdGhlIG1vZGVscw0KDQo4LiBgY29uZm91bmRlcnNfZXZlYDogd2UgaW5jbHVkZSBwb3RlbnRpYWxseSBjb25mb3VuZGluZyBmYWN0b3JzIGZvciBibG9vZCBwcmVzc3VyZSAoZS5nLiwgc21va2luZywgcGh5c2ljYWwgYWN0aXZpdHkpIHJlcG9ydGVkIGluIHRoZSBhZnRlcm5vb24gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBwb3NpdGlvbmA6IHdlIGluY2x1ZGUgam9iIHBvc2l0aW9uIChFbXBsb3llZS9Qcm9qZWN0IHZzLiBNYW5hZ2VyLyhTZWxmLSlFbXBsb3llcikgYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjEwLiBgY2hpbGRyZW5gOiB3ZSBpbmNsdWRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjExLiBgTm8gZmxhZ0JQYDogd2UgZXhjbHVkZSBhbGwgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSByZXByb2Nlc3NlZCBkdWUgdG8gZXh0cmVtZSBCUCB2YWx1ZXMgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMC4gYE5vIGZsYWdUaW1lYDogd2UgZXhjbHVkZSBhbGwgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBmbGFnZ2VkIGR1ZSB0byB0aGVpciBhc3NvY2lhdGVkIHRpbWluZyAoZS5nLiwgbW9ybmluZyBCUCByZWNvcmRlZCBpbiB0aGUgYWZ0ZXJub29uKSAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjEyLiBgTm8gY2FyZWxlc3NgOiB3ZSBleGNsdWRlIG9uZSBwYXJ0aWNpcGFudCBgUzEzN2AgZmxhZ2dlZCBhcyBwb3RlbnRpYWxseSBjYXJlbGVzcyAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjEzLiBgZGF5MWA6IHdlIGluY2x1ZGUgcmVjb3JkaW5nIGBkYXlgIGFzIGEgZnVydGhlciBjb3ZhcmlhdGUgKGkuZS4sIDEgPSBmaXJzdCBkYXksIDIgPSBhbnkgb3RoZXIgZGF5KS4gSW4gYWxsIGNhc2VzLCB0aGUgKipyZXN1bHRzIGFyZSBjb25zaXN0ZW50Kiogd2l0aCB0aG9zZSByZXBvcnRlZCBpbiB0aGUgbWFpbiBhbmFseXNlcywgc2hvd2luZyBubyBzdWJzdGFudGlhbCBjb250cmlidXRpb24gYW5kIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AuDQoNCjE0LiBgV0VgOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3Igc3RhdGUgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSB3b3JraW5nIGV4Y2Vzc2l2ZWx5IGRpbWVuc2lvbg0KDQoxNS4gYFdDYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTYuIGBXSExTTSByZXRyb2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciB0cmFpdCB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHJldHJvc3BlY3RpdmUgdmVyc2lvbiBvZiB0aGUgRFVXQVMgaW5jbHVkZWQgaW4gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgc2V0dGluZyByb2J1c3RuZXNzIGNoZWNrcw0KY2hlY2tzIDwtIGMoIk9yaWdpbmFsIiwiTm8gSW5mbCIsIk5vIGR5c2YvZHJ1Z3MiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dUcmFuc2YiLA0KICAgICAgICAgICAgImNvbmZvdW5kZXJzX2V2ZSIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJObyBmbGFnQlAiLCJObyBmbGFnVGltZSIsIk5vIGNhcmVsZXNzIiwiZGF5MSIsDQogICAgICAgICAgICAiV0UiLCJXQyIsIldITFNNIHJldHJvIikNCg0KIyBjcmVhdGluZyBjYXRlZ29yaWNhbCB2YXJpYWJsZSBkYXkxIChpLmUuLCBmaXJzdCBkYXkgdnMuIGFsbCBvdGhlciBkYXlzKQ0KY2xlYW5CUF9ldmUkZGF5MSA8LSAwIA0KY2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkZGF5PT0xLCJkYXkxIl0gPC0gMQ0KY2xlYW5CUF9ldmUkZGF5MSA8LSBhcy5mYWN0b3IoY2xlYW5CUF9ldmUkZGF5MSkNCmBgYA0KDQo8YnI+DQoNCkluIGFsbCBjYXNlcywgdGhlICoqcmVzdWx0cyBhcmUgY29uc2lzdGVudCoqIHdpdGggdGhvc2UgcmVwb3J0ZWQgaW4gdGhlIG1haW4gYW5hbHlzZXMsIHNob3dpbmcgbm8gc3Vic3RhbnRpYWwgY29udHJpYnV0aW9uIG9yIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AgKG9ubHkgc3Vic3RhbnRpYWwgaW4gYSBmZXcgY2FzZXMgZm9yIGBEQlBfZXZlYCkgYW5kIG5vIHN1YnN0YW50aWFsIGludGVyYWN0aW9ucyB3aXRoIHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudC4NCg0KIyMjIyBNQUlOIEVGRkVDVCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgU0JQX2V2ZQ0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIlBELm1jIiwiV0hMU00uY20uZ21jIiwiV0hMU00ubWMiKSAjIHByZWRpY3RvcnMNCnIgPC0gIlNCUF9ldmUiICMgcmVzcG9uc2UgdmFyaWFibGUNCmtleSA8LSAiV0hMU00ubWMiICMga2V5IG1vZGVsIGFuZCBrZXkgcHJlZGljdG9yDQpic2wgPC0gIldITFNNLmNtLmdtYyIgIyBiYXNlbGluZSBtb2RlbA0KcCA8LSBjYmluZChjaGVjaz1jaGVja3MsDQogICAgICByYmluZChnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgb3JpZ2luYWwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIgJiBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMoIldITFNNLm1jIiksICMgd2l0aG91dCBjb3ZhcmlhdGVzDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlX2Z1bGwscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXksUkVNTD1GQUxTRSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgcmFuZG9tIHNsb3BlIChTSU5HVUxBUiBGSVQpDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9ImxvZyhTQlBfZXZlKSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBsb2ctdHJhbnNmDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjb25mb3VuZGVyc19ldmUiLCAjIGFkZGluZyBjb25mb3VuZGVyc19ldmUNCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pLG1Db21wLmJhc2VsaW5lPSJjb25mb3VuZGVyc19ldmUiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSxtQ29tcC5iYXNlbGluZT0icG9zaXRpb24iLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjaGlsZHJlbiIsICMgYWRkaW5nIGNoaWxkcmVuDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSxtQ29tcC5iYXNlbGluZT0iY2hpbGRyZW4iLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJGZsYWdCUF9ldmU9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIEJQDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJGZsYWdUaW1lPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCB0aW1lcw0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRjYXJlbGVzcz09RkFMU0UsXSwgIyB3aXRob3V0IGNhcmVsZXNzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJkYXkxIixwcmVkaWN0b3JzWzY6bGVuZ3RoKHByZWRpY3RvcnMpXSksICMgYWRkaW5nIGRheQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iZGF5MSIsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9Z3N1YigiV0hMU00ubWMiLCJXRS5tYyIscHJlZGljdG9ycyksICMgd29ya2luZyBleGNlc3NpdmVseQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj0iV0UubWMiLGtleS5tb2RlbD0iV0UubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj0iV0MubWMiLGtleS5tb2RlbD0iV0MubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLCAjIFdITFNNIHJldHJvDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5yZXRyby5nbWMiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpKSkNCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpyIDwtICJEQlBfZXZlIiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwgIyBvcmlnaW5hbA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlWyFjbGVhbkJQX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0sICMgd2l0aG91dCBpbmZsdWVudGlhbA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iLF0sIA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKCJXSExTTS5tYyIpLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlX2Z1bGwscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXksUkVNTD1GQUxTRSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgcmFuZG9tIHNsb3BlDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9ImxvZyhEQlBfZXZlKSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBHYW1tYSBsb2cNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxmYW1pbHk9ImdhbW1hIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwiY29uZm91bmRlcnNfZXZlIiwgIyBhZGRpbmcgY29uZm91bmRlcnNfZXZlDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSxtQ29tcC5iYXNlbGluZT0iY29uZm91bmRlcnNfZXZlIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICBwcmVkaWN0b3JzWzY6bGVuZ3RoKHByZWRpY3RvcnMpXSksbUNvbXAuYmFzZWxpbmU9InBvc2l0aW9uIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICBwcmVkaWN0b3JzWzY6bGVuZ3RoKHByZWRpY3RvcnMpXSksbUNvbXAuYmFzZWxpbmU9ImNoaWxkcmVuIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnQlBfZXZlPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkY2FyZWxlc3M9PUZBTFNFLF0sICMgd2l0aG91dCBjYXJlbGVzcyBwYXJ0aWNpcGFudHMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sImRheTEiLHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSwgIyBhZGRpbmcgZGF5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJkYXkxIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGV4Y2Vzc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPSJXRS5tYyIsa2V5Lm1vZGVsPSJXRS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPSJXQy5tYyIsa2V5Lm1vZGVsPSJXQy5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvLmdtYyIscHJlZGljdG9ycyksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSkpDQprYWJsZShwKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBJTlRFUkFDVElPTiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgU0JQX2V2ZQ0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyBpbnRlcmFjdGlvbiB3aXRoIFJEZXQubWMNCnIgPC0gIlNCUF9ldmUiDQpwcmVkaWN0b3JzIDwtIGMocHJlZGljdG9ycywiUEQubWM6V0hMU00ubWMiKSAjIHByZWRpY3RvcnMNCmtleSA8LSAiUEQubWM6V0hMU00ubWMiICMga2V5IG1vZGVsIGFuZCBrZXkgcHJlZGljdG9yDQpic2wgPC0gIldITFNNLm1jIiAjIGJhc2VsaW5lIG1vZGVsDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBvcmlnaW5hbA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVshY2xlYW5CUF9ldmUkSUQlaW4lYygiUzA5NiIsIlMwODIiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVfZnVsbCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iLF0sIA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKCJQRC5tYyIsIldITFNNLm1jIiwiUEQubWM6V0hMU00ubWMiKSwgIyB3aXRob3V0IGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLCAjIG1heGltdW0gbGlrZWxpaG9vZA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5LFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLCAjIHJhbmRvbSBzbG9wZSAoU0lOR1VMQVIgRklUKQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5LHJhbi5lZmY9IihXSExTTS5tY3xJRCkiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPSJsb2coU0JQX2V2ZSkiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgbG9nLXRyYW5zZg0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiY29uZm91bmRlcnNfZXZlIiwgIyBhZGRpbmcgY29uZm91bmRlcnNfZXZlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJjb25mb3VuZGVyc19ldmUiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjZdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbNzpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9InBvc2l0aW9uIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJjaGlsZHJlbiIsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkZmxhZ0JQX2V2ZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgQlANCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkZmxhZ1RpbWU9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJGNhcmVsZXNzPT1GQUxTRSxdLCAjIHdpdGhvdXQgY2FyZWxlc3MgcGFydGljaXBhbnQNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6Nl0sImRheTEiLHByZWRpY3RvcnNbNzpsZW5ndGgocHJlZGljdG9ycyldKSwgIyBhZGRpbmcgZGF5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJkYXkxIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGV4Y2Vzc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXRS5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0UubWMiLGtleS5tb2RlbD0iUEQubWM6V0UubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0MubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldDLm1jIixrZXkubW9kZWw9IlBELm1jOldDLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9Z3N1YigiV0hMU00uY20uZ21jIiwiV0hMU00ucmV0cm8uZ21jIixwcmVkaWN0b3JzKSwgICMgV0hMU00ucmV0cm8NCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpKSkNCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpyIDwtICJEQlBfZXZlIg0KcCA8LSBjYmluZChjaGVjaz1jaGVja3MsDQogICAgICByYmluZChnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgb3JpZ2luYWwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwOTYiLCJTMDgwIiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhIChTSU5HVUxBUiBGSVQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIgJiBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMoIlBELm1jIiwiV0hMU00ubWMiLCJQRC5tYzpXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVfZnVsbCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxSRU1MPUZBTFNFKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyByYW5kb20gc2xvcGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxyYW4uZWZmPSIoV0hMU00ubWN8SUQpIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD0iREJQX2V2ZSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBHYW1tYSBsb2cNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxmYW1pbHk9ImdhbW1hIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiY29uZm91bmRlcnNfZXZlIiwgIyBhZGRpbmcgY29uZm91bmRlcnNfZXZlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJjb25mb3VuZGVyc19ldmUiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjZdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJwb3NpdGlvbiIsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6Nl0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbNzpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9ImNoaWxkcmVuIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnQlBfZXZlPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkY2FyZWxlc3M9PUZBTFNFLF0sICMgd2l0aG91dCBjYXJlbGVzcw0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiZGF5MSIscHJlZGljdG9yc1s3Omxlbmd0aChwcmVkaWN0b3JzKV0pLCAjIGFkZGluZyBkYXkNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9ImRheTEiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldFLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXRS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXRS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXQy5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0MubWMiLGtleS5tb2RlbD0iUEQubWM6V0MubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLCAjIFdITFNNLnJldHJvDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSkpDQprYWJsZShwKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS4zLiBNZWRpYXRpb25zIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpGb3IgQWZ0ZXJub29uLXRvLUV2ZW5pbmcgbWVkaWF0aW9ucywgd2UgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcm9idXN0bmVzcyBjaGVja3M6DQoNCjEuIGBObyBJbmZsYDogd2UgcmVtb3ZlIGFsbCBpbmZsdWVudGlhbCBwYXJ0aWNpcGFudHMgZm91bmQgZm9yIGFmdGVybm9vbiBhbmQgZXZlbmluZyBCUA0KDQoyLiBgTm8gZHlzZi9kcnVnc2A6IHdlIHJlbW92ZSBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyBzbGVlcCBkeXNmdW5jdGlvbnMsIGhvcm1vbmFsIG9yIHBzeWNob2FjdGl2ZSBtZWRpY2F0aW9ucywgaW4gYWRkaXRpb24gdG8gdGhvc2UgbWVldGluZyBleGNsdXNpb24gY3JpdGVyaWEgZm9yIGJsb29kIHByZXNzdXJlDQoNCjMuIGBObyBDb3ZgOiB3ZSByZW1vdmUgYWxsIGNvdmFyaWF0ZXMsIHRoYXQgaXMgd2Ugb25seSBpbmNsdWRlIGBXSExTTS5tY2AgYW5kIGl0cyBpbnRlcmFjdGlvbnMgYXMgbW9kZWwgcHJlZGljdG9ycw0KDQo0LiBgQWxsIGluYDogd2UgaW5jbHVkZSBhbGwgY29tcGxldGUgb2JzZXJ2YXRpb25zIGZyb20gYWxsIHBhcnRpY2lwYW50cywgaW5jbHVkaW5nIHRob3NlIG1lZXRpbmcgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgY29tcGxpYW5jZSBhbmQgYmxvb2QgcHJlc3N1cmUNCg0KNS4gYE1MYDogd2UgcmVmaXQgdGhlIG1vZGVscyBieSB1c2luZyB0aGUgTWF4aW11bSBMaWtlbGlob29kIGVzdGltYXRvciwgcmF0aGVyIHRoYW4gdGhlIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kDQoNCjYuIGBSYW5kIHNsb3BlYDogd2UgaW5jbHVkZSB0aGUgcmFuZG9tIHNsb3BlIGZvciBgV0hMU00ubWNgDQoNCjcuIGBsb2ctdHJhbnNmYDogd2UgbG9nLXRyYW5zZm9ybSBibG9vZCBwcmVzc3VyZSBiZWZvcmUgZml0dGluZyB0aGUgbW9kZWxzDQoNCjguIGBjb25mb3VuZGVyc2A6IHdlIGluY2x1ZGUgcG90ZW50aWFsbHkgY29uZm91bmRpbmcgZmFjdG9ycyBmb3IgYmxvb2QgcHJlc3N1cmUgKGUuZy4sIHNtb2tpbmcsIHBoeXNpY2FsIGFjdGl2aXR5KSByZXBvcnRlZCBpbiB0aGUgYWZ0ZXJub29uIG9yIGluIHRoZSBldmVuaW5nIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQo5LiBgcG9zaXRpb25gOiB3ZSBpbmNsdWRlIGpvYiBwb3NpdGlvbiAoRW1wbG95ZWUvUHJvamVjdCB2cy4gTWFuYWdlci8oU2VsZi0pRW1wbG95ZXIpIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQoxMC4gYGNoaWxkcmVuYDogd2UgaW5jbHVkZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQoxMS4gYE5vIGZsYWdCUGA6IHdlIGV4Y2x1ZGUgYWxsIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgcmVwcm9jZXNzZWQgZHVlIHRvIGV4dHJlbWUgQlAgdmFsdWVzIGVpdGhlciBpbiB0aGUgYWZ0ZXJub29uIG9yIGluIHRoZSBldmVuaW5nIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSk7IG1vcm5pbmcgZmxhZ2dlZCBjYXNlcyBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYXZvaWQgbG9vc2luZyB0b28gbWFueSBvYnNlcnZhdGlvbnMNCg0KMTIuIGBObyBmbGFnVGltZWA6IHdlIGV4Y2x1ZGUgYWxsIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgZmxhZ2dlZCBkdWUgdG8gdGhlaXIgYXNzb2NpYXRlZCB0aW1pbmcgKGUuZy4sIG1vcm5pbmcgQlAgcmVjb3JkZWQgaW4gdGhlIGFmdGVybm9vbikgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMy4gYE5vIGNhcmVsZXNzYDogd2UgZXhjbHVkZSBvbmUgcGFydGljaXBhbnQgYFMxMzdgIGZsYWdnZWQgYXMgcG90ZW50aWFsbHkgY2FyZWxlc3MgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxNC4gYGRheTFgOiB3ZSBpbmNsdWRlIHJlY29yZGluZyBgZGF5YCBhcyBhIGZ1cnRoZXIgY292YXJpYXRlIChpLmUuLCAxID0gZmlyc3QgZGF5LCAyID0gYW55IG90aGVyIGRheSkuIEluIGFsbCBjYXNlcywgdGhlICoqcmVzdWx0cyBhcmUgY29uc2lzdGVudCoqIHdpdGggdGhvc2UgcmVwb3J0ZWQgaW4gdGhlIG1haW4gYW5hbHlzZXMsIHNob3dpbmcgbm8gc3Vic3RhbnRpYWwgY29udHJpYnV0aW9uIGFuZCBtYWluIGVmZmVjdCBvZiBzdGF0ZSBgV0hMU00ubWNgLg0KDQoxNS4gYFdFYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTYuIGBXQ2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciBzdGF0ZSB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHdvcmtpbmcgZXhjZXNzaXZlbHkgZGltZW5zaW9uDQoNCjE3LiBgV0hMU00gcmV0cm9gOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3IgdHJhaXQgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSByZXRyb3NwZWN0aXZlIHZlcnNpb24gb2YgdGhlIERVV0FTIGluY2x1ZGVkIGluIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlLg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIHNldHRpbmcgcm9idXN0bmVzcyBjaGVja3MNCmNoZWNrcyA8LSBjKCJPcmlnaW5hbCIsIk5vIEluZmwiLCJObyBkeXNmL2RydWdzIiwiTm8gQ292IiwiQWxsIGluIiwiTUwiLCJSYW5kIHNsb3BlIiwibG9nLXRyYW5zZiIsDQogICAgICAgICAgICAiY29uZm91bmRlcnMiLCJwb3NpdGlvbiIsImNoaWxkcmVuIiwiTm8gZmxhZ0JQIiwiTm8gZmxhZ1RpbWUiLCJObyBjYXJlbGVzcyIsImRheTEiLA0KICAgICAgICAgICAgIldFIiwiV0MiLCJXSExTTS5yZXRybyIpDQoNCiMgcmVjb2RpbmcgdmFyaWFibGVzDQpjbGVhbkJQX21lZF9ldmUkY29uZiA8LSBGQUxTRSAjIHN1bW1hcnkgb2YgYWZ0ZXJub29uIGFuZCBldmVuaW5nIGNvbmZvdW5kZXJzDQpjbGVhbkJQX21lZF9ldmVbY2xlYW5CUF9tZWRfZXZlJGNvbmZvdW5kZXJzX2FmdD09VFJVRSB8IGNsZWFuQlBfbWVkX2V2ZSRjb25mb3VuZGVyc19ldmU9PVRSVUUsImNvbmYiXSA8LSBUUlVFDQpzdW1tYXJ5KGNsZWFuQlBfbWVkX2V2ZSRjb25mKQ0KY2xlYW5CUF9tZWRfZXZlJGZsYWdCUCA8LSBGQUxTRSAjIHN1bW1hcnkgb2YgYWZ0ZXJub29uIGFuZCBldmVuaW5nIGZsYWdCUA0KY2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRmbGFnQlBfYWZ0PT1UUlVFIHwgY2xlYW5CUF9tZWRfZXZlJGZsYWdCUF9ldmU9PVRSVUUsImZsYWdCUCJdIDwtIFRSVUUNCnN1bW1hcnkoY2xlYW5CUF9tZWRfZXZlJGZsYWdCUCkNCmNsZWFuQlBfbWVkX2V2ZSRkYXkxIDwtIDAgIyBjcmVhdGluZyBjYXRlZ29yaWNhbCB2YXJpYWJsZSBkYXkxIChpLmUuLCBmaXJzdCBkYXkgdnMuIGFsbCBvdGhlciBkYXlzKQ0KY2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRkYXk9PTEsImRheTEiXSA8LSAxDQpjbGVhbkJQX21lZF9ldmUkZGF5MSA8LSBhcy5mYWN0b3IoY2xlYW5CUF9tZWRfZXZlJGRheTEpDQpzdW1tYXJ5KGNsZWFuQlBfbWVkX2V2ZSRkYXkxKQ0KYGBgDQoNCjxicj4NCg0KSW4gYWxsIGNhc2VzLCB0aGUgKipyZXN1bHRzIGZvciBgU0JQYCBhcmUgY29uc2lzdGVudCoqIHdpdGggdGhvc2UgcmVwb3J0ZWQgaW4gdGhlIG1haW4gYW5hbHlzZXMsIHNob3dpbmcgc2lnbmlmaWNhbnQgaW5kaXJlY3QgYnV0IG5vdCBkaXJlY3QgcmVsYXRpb25zaGlwIGJldHdlZW4gc3RhdGUgYFdITFNNLm1jYCBhbmQgYFNCUF9ldmVgLiAqKk1vc3QgcmVzdWx0cyBmb3IgYERCUGAgYXJlIGNvbnNpc3RlbnQqKiBhcyB3ZWxsLCBidXQgdGhlICoqaW5kaXJlY3QgcmVsYXRpb25zaGlwIGlzIHJlZHVjZWQgaW4gb25lIGNhc2UqKiwgaS5lLiwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucywgaG9ybW9uYWwsIG9yIHBzeWNob2FjdGl2ZSBtZWRpY2F0aW9ucy4gU2ltaWxhcmx5LCB0aGUgZGlyZWN0IHJlbGF0aW9uc2hpcCBiZWNvbWVzIHNpZ25pZmljYW50IHdpdGggdGhlIGluY2x1c2lvbiBvZiBgZGF5MWAgYXMgYSBjb3ZhcmlhdGUuIFdoZXJlYXMgdGhlc2UgZmluZGluZ3MgcXVlc3Rpb24gdGhlIGdlbmVyYWxpemFiaWxpdHkgb2Ygc3VjaCByZWxhdGlvbnNoaXAsIHRoZSBoaWdoIG51bWJlciBvZiBjb25zaXN0ZW50IHJvYnVzdG5lc3MgY2hlY2tzIHByb3ZpZGVzIHNvbWUgZXZpZGVuY2UgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIG9ic2VydmFibGUgaW4gb3VyIHNhbXBsZS4NCg0KIyMjIyAgU0JQX2V2ZQ0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIlBELm1jIiwiV0hMU00uY20uZ21jIiwiV0hMU00ubWMiKSAjIHByZWRpY3RvcnMNCnIgPC0gIlNCUF9ldmUiICMgcmVzcG9uc2UgdmFyaWFibGUNCnQgPC0gIldITFNNLm1jIiAjIGtleSBtb2RlbCBhbmQga2V5IHByZWRpY3Rvcg0KbSA8LSAiU0JQX2FmdC5tYyINCnAgPC0gY2JpbmQoY2hlY2s9Y2hlY2tzLA0KICAgICAgcmJpbmQoZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwgIyBvcmlnaW5hbA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA5NiIpLF0sICMgd2l0aG91dCBpbmZsdWVudGlhbCBjYXNlcw0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVbY2xlYW5CUF9tZWRfZXZlJHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX21lZF9ldmUkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9tZWRfZXZlJHBzeV9kcnVncz09Ik5vIixdLCANCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YygiV0hMU00ubWMiKSxub0Nvdj1UUlVFKSwgIyB3L28gY292YXJpYXRlcw0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVfZnVsbCxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLCAjIGZ1bGwgc2FtcGxlDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMsUkVNTD1GQUxTRSksICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMsICMgcmFuZG9tIHNsb3BlIChzaW5ndWxhciBmaXQpDQogICAgICAgICAgICAgICAgICAgICByYW4uZWZmPSIoV0hMU00ubWN8SUQpIiksIA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD0ibG9nKFNCUF9ldmUpIix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksICMgbG9nIHRyYW5zZm9ybWF0aW9uDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjb25mIiwgIyBhZGRpbmcgY29uZm91bmRlcnMNCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sInBvc2l0aW9uIiwgIyBhZGRpbmcgcG9zaXRpb24NCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRmbGFnQlA9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIEJQIGNhc2VzDQogICAgICAgICAgICAgICAgICAgICByZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVbY2xlYW5CUF9tZWRfZXZlJGZsYWdUaW1lPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCB0aW1lcw0KICAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRjYXJlbGVzcz09RkFMU0UsXSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50cw0KICAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sImRheTEiLCAjIGFkZGluZyBkYXkNCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD0iV0UubWMiLG1lZD1tLA0KICAgICAgICAgICAgICAgICAgICAgZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSksICMgd29ya2luZyBleGNlc3NpdmVseQ0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PSJXQy5tYyIsbWVkPW0sDQogICAgICAgICAgICAgICAgICAgICBmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sDQogICAgICAgICAgICAgICAgICAgICBmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvIixwcmVkaWN0b3JzKSkpKSAjIFdITFNNIHJldHJvDQprYWJsZShwKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpyIDwtICJEQlBfZXZlIiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksICMgb3JpZ2luYWwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlWyFjbGVhbkJQX21lZF9ldmUkSUQlaW4lYygiUzA4MiIsIlMwOTYiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9tZWRfZXZlJHBzeV9kcnVncz09Ik5vIiAmIGNsZWFuQlBfbWVkX2V2ZSRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMoIldITFNNLm1jIiksbm9Db3Y9VFJVRSksICMgdy9vIGNvdmFyaWF0ZXMNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlX2Z1bGwscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzLFJFTUw9RkFMU0UpLCAjIG1heGltdW0gbGlrZWxpaG9vZA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzLCAjIHJhbmRvbSBzbG9wZSAoc2luZ3VsYXIgZml0KQ0KICAgICAgICAgICAgICAgICAgICAgcmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLCANCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9ImxvZyhEQlBfZXZlKSIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLCAjIGxvZy10cmFuc2Zvcm1hdGlvbg0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwiY29uZiIsICMgYWRkaW5nIGNvbmZvdW5kZXJzDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjaGlsZHJlbiIsICMgYWRkaW5nIGNoaWxkcmVuDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZVtjbGVhbkJQX21lZF9ldmUkZmxhZ0JQPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUCBjYXNlcw0KICAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgIHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZVtjbGVhbkJQX21lZF9ldmUkY2FyZWxlc3M9PUZBTFNFLF0sICMgd2l0aG91dCBjYXJlbGVzcyBwYXJ0aWNpcGFudHMNCiAgICAgICAgICAgICAgICAgICAgIHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJkYXkxIiwgIyBhZGRpbmcgZGF5DQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9IldFLm1jIixtZWQ9bSwNCiAgICAgICAgICAgICAgICAgICAgIGZpeC5lZmY9Z3N1YigiV0hMU00ubWMiLCJXRS5tYyIscHJlZGljdG9ycykpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD0iV0MubWMiLG1lZD1tLA0KICAgICAgICAgICAgICAgICAgICAgZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLA0KICAgICAgICAgICAgICAgICAgICAgZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpKSkpICMgV0hMU00gcmV0cm8NCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyA0LjIuIEVtb3Rpb25hbCBFeGhhdXN0aW9uICB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KRm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLCB3ZSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyByb2J1c3RuZXNzIGNoZWNrczoNCg0KMS4gYE5vIEluZmxgOiB3ZSByZW1vdmUgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzDQoNCjIuIGBObyBDb3ZgOiB3ZSByZW1vdmUgYWxsIGNvdmFyaWF0ZXMsIHRoYXQgaXMgd2Ugb25seSBpbmNsdWRlIGBXSExTTS5tY2AgYW5kIGl0cyBpbnRlcmFjdGlvbnMgYXMgbW9kZWwgcHJlZGljdG9ycw0KDQozLiBgQWxsIGluYDogd2UgaW5jbHVkZSBhbGwgY29tcGxldGUgb2JzZXJ2YXRpb25zIGZyb20gYWxsIHBhcnRpY2lwYW50cywgaW5jbHVkaW5nIHRob3NlIG1lZXRpbmcgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgY29tcGxpYW5jZSBhbmQgYmxvb2QgcHJlc3N1cmUNCg0KNC4gYE1MYDogd2UgcmVmaXQgdGhlIG1vZGVscyBieSB1c2luZyB0aGUgTWF4aW11bSBMaWtlbGlob29kIGVzdGltYXRvciwgcmF0aGVyIHRoYW4gdGhlIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kDQoNCjUuIGBSYW5kIHNsb3BlYDogd2UgaW5jbHVkZSB0aGUgcmFuZG9tIHNsb3BlIGZvciBgV0hMU00ubWNgIA0KDQo2LiBgR2FtbWEtbG9nYDogd2UgcmVmaXQgdGhlIG1vZGVscyB1c2luZyB0aGUgR2FtbWEgZmFtaWx5IHdpdGggdGhlIGxvZ2FyaXRobWljIGxpbmsgZnVuY3Rpb24NCg0KNy4gYGxvZ05vcm1gOiB3ZSByZWZpdCB0aGUgbW9kZWxzIHdpdGggdXNpbmcgbG9nLW5vcm1hbCBHTE0NCg0KOC4gYHBvc2l0aW9uYDogd2UgaW5jbHVkZSBqb2IgcG9zaXRpb24gKEVtcGxveWVlL1Byb2plY3QgdnMuIE1hbmFnZXIvKFNlbGYtKUVtcGxveWVyKSBhcyBhbiBhZGRpdGlvbmFsIGNvbnRyb2wgdmFyaWFibGUNCg0KOS4gYGNoaWxkcmVuYDogd2UgaW5jbHVkZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQoxMC4gYE5vIGZsYWdUaW1lYDogd2UgZXhjbHVkZSBhbGwgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBmbGFnZ2VkIGR1ZSB0byB0aGVpciBhc3NvY2lhdGVkIHRpbWluZyAoZS5nLiwgbW9ybmluZyBCUCByZWNvcmRlZCBpbiB0aGUgYWZ0ZXJub29uKSAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjExLiBgTm8gY2FyZWxlc3NgOiB3ZSBleGNsdWRlIG9uZSBwYXJ0aWNpcGFudCBgUzEzN2AgZmxhZ2dlZCBhcyBwb3RlbnRpYWxseSBjYXJlbGVzcyAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLg0KDQoxMi4gYGRheWA6IHdlIGluY2x1ZGUgYGRheWAgYXMgYSBmdXJ0aGVyIGNvbnRpbnVvdXMgY292YXJpYXRlIChpLmUuLCAxID0gZmlyc3QgZGF5LCAyID0gc2Vjb25kIGRheSwgZXRjLikgDQoNCjEzLiBgV0VgOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3Igc3RhdGUgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSB3b3JraW5nIGV4Y2Vzc2l2ZWx5IGRpbWVuc2lvbg0KDQoxNC4gYFdDYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTUuIGBXSExTTSByZXRyb2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciB0cmFpdCB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHJldHJvc3BlY3RpdmUgdmVyc2lvbiBvZiB0aGUgRFVXQVMgaW5jbHVkZWQgaW4gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmNoZWNrcyA8LSBjKCJPcmlnaW5hbCIsIk5vIEluZmwiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJHYW1tYS1sb2ciLCJsb2dOb3JtIiwNCiAgICAgICAgICAgICJwb3NpdGlvbiIsImNoaWxkcmVuIiwiTm8gZmxhZ1RpbWUiLCJObyBjYXJlbGVzcyIsImRheSIsIldFIiwiV0MiLCJXSExTTSByZXRybyIpDQpgYGANCg0KPGJyPg0KDQpJbiBhbGwgY2FzZXMsIHRoZSAqKnJlc3VsdHMgYXJlIGNvbnNpc3RlbnQqKiB3aXRoIHRob3NlIHJlcG9ydGVkIGluIHRoZSBtYWluIGFuYWx5c2VzLCBzaG93aW5nIHN1YnN0YW50aWFsIGNvbnRyaWJ1dGlvbiBhbmQgbWFpbiBlZmZlY3Qgb2Ygc3RhdGUgYFdITFNNLm1jYCwgYnV0IHdpdGggbm8gc3Vic3RhbnRpYWwgaW50ZXJhY3Rpb24gd2l0aCBgUEQubWNgIChvbmx5IHNpZ25pZmljYW50IHdoZW4gdXNpbmcgdGhlIGxvZy1ub3JtYWwgZGlzdHJpYnV0aW9uKS4gVGh1cywgd2UgaW50ZXJwcmV0IHRoZXNlIGZpbmRpbmdzIGFzIGEgc2lnbiBvZiB0aGUgKipjb25zaXN0ZW5jeSBvZiB0aGUgZXN0aW1hdGVkIHJlbGF0aW9uc2hpcCoqIGJldHdlZW4gc3RhdGUgYFdITFNNLm1jYCBhbmQgYEVFYC4NCg0KIyMjIE1BSU4gRUZGRUNUDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIG1haW4gZWZmZWN0IG9mIFdITFNNLm1jDQpwcmVkaWN0b3JzIDwtIGMoImdlbmRlciIsIlBELm1jIiwiV0hMU00uY20uZ21jIiwiV0hMU00ubWMiKQ0KcCA8LSBjYmluZChjaGVjaz1jaGVja3MsDQogICAgICByYmluZChnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMoIldITFNNLm1jIiksICMgd2l0aG91dCBjb3ZhcmlhdGVzDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRV9mdWxsLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIixSRU1MPUZBTFNFKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgcmFuZG9tIHNsb3BlDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIixyYW4uZWZmPSIoV0hMU00ubWN8SUQpIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIEdhbW1hLWxvZyBmYW1pbHkNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLGZhbWlseT0iZ2FtbWEiLGxpbms9ImxvZyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBsb2ctbm9ybWFsIGZhbWlseQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIsbGluaz0ibG9nIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sInBvc2l0aW9uIiwgIyBhZGRpbmcgcG9zaXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMocHJlZGljdG9yc1sxXSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1syOmxlbmd0aChwcmVkaWN0b3JzKV0pLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUVbY2xlYW5FRSRmbGFnVGltZT09RkFMU0UsXSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCANCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFW2NsZWFuRUUkY2FyZWxlc3M9PUZBTFNFLF0scmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksICMgd2l0aG91dCBjYXJlbGVzcyBwYXJ0aWNpcGFudHMNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMocHJlZGljdG9yc1sxOjNdLCJkYXkiLHByZWRpY3RvcnNbNDpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9ImRheSIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXRS5tYyIsa2V5Lm1vZGVsPSJXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXQy5tYyIsa2V5Lm1vZGVsPSJXQy5tYyIpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpKSkgIyBXSExTTSByZXRybw0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMjIyBJTlRFUkFDVElPTg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKHByZWRpY3RvcnMsIlBELm1jOldITFNNLm1jIikNCnAgPC0gY2JpbmQoY2hlY2s9Y2hlY2tzLA0KICAgICAgcmJpbmQoZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMoIlBELm1jIiwiV0hMU00ubWMiLCJQRC5tYzpXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUVfZnVsbCxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiLFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIHJhbmRvbSBzbG9wZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIGdhbW1hLWxvZyBmYW1pbHkNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiLGZhbWlseT0iZ2FtbWEiLGxpbms9ImxvZyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIGxvZy1ub3JtYWwgZmFtaWx5DQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMocHJlZGljdG9yc1sxXSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1syOmxlbmd0aChwcmVkaWN0b3JzKV0pLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUVbY2xlYW5FRSRmbGFnVGltZT09RkFMU0UsXSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksICMgd2l0aG91ZyBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRVtjbGVhbkVFJGNhcmVsZXNzPT1GQUxTRSxdLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50DQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwiZGF5IixwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwgIyBkYXkgYXMgY292YXJpYXRlDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldFLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXRS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0MubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldDLm1jIixrZXkubW9kZWw9IlBELm1jOldDLm1jIiksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvLmdtYyIscHJlZGljdG9ycyksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSkpICMgV0hMU00gcmV0cm8NCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyA0LjMuIFNsZWVwIGRpc3R1cmJhbmNlcyAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkZvciBzbGVlcCBkaXN0dXJiYW5jZXMsIHdlIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHJvYnVzdG5lc3MgY2hlY2tzOg0KDQoxLiBgTm8gSW5mbGA6IHdlIHJlbW92ZSBpbmZsdWVudGlhbCBwYXJ0aWNpcGFudHMNCg0KMi4gYE5vIHNsZWVwRHlzZmA6IHdlIHJlbW92ZSBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyBzbGVlcCBkeXNmdW5jdGlvbnMNCg0KMy4gYE5vIENvdmA6IHdlIHJlbW92ZSBhbGwgY292YXJpYXRlcywgdGhhdCBpcyB3ZSBvbmx5IGluY2x1ZGUgYFdITFNNLm1jYCBhbmQgaXRzIGludGVyYWN0aW9ucyBhcyBtb2RlbCBwcmVkaWN0b3JzDQoNCjQuIGBBbGwgaW5gOiB3ZSBpbmNsdWRlIGFsbCBjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSBhbGwgcGFydGljaXBhbnRzLCBpbmNsdWRpbmcgdGhvc2UgbWVldGluZyB0aGUgZXhjbHVzaW9uIGNyaXRlcmlhIGZvciBjb21wbGlhbmNlIGFuZCBibG9vZCBwcmVzc3VyZQ0KDQo1LiBgTUxgOiB3ZSByZWZpdCB0aGUgbW9kZWxzIGJ5IHVzaW5nIHRoZSBNYXhpbXVtIExpa2VsaWhvb2QgZXN0aW1hdG9yLCByYXRoZXIgdGhhbiB0aGUgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QNCg0KNi4gYFJhbmQgc2xvcGVgOiB3ZSBpbmNsdWRlIHRoZSByYW5kb20gc2xvcGUgZm9yIGBXSExTTS5tY2AgDQoNCjcuIGBsb2dOb3JtYDogd2UgcmVmaXQgdGhlIG1vZGVscyB3aXRoIHVzaW5nIGxvZy1ub3JtYWwgR0xNDQoNCjguIGBwb3NpdGlvbmA6IHdlIGluY2x1ZGUgam9iIHBvc2l0aW9uIChFbXBsb3llZS9Qcm9qZWN0IHZzLiBNYW5hZ2VyLyhTZWxmLSlFbXBsb3llcikgYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBjaGlsZHJlbmA6IHdlIGluY2x1ZGUgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBhcyBhbiBhZGRpdGlvbmFsIGNvbnRyb2wgdmFyaWFibGUNCg0KMTAuIGBObyBmbGFnVGltZWA6IHdlIGV4Y2x1ZGUgYWxsIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgZmxhZ2dlZCBkdWUgdG8gdGhlaXIgYXNzb2NpYXRlZCB0aW1pbmcgKGUuZy4sIG1vcm5pbmcgQlAgcmVjb3JkZWQgaW4gdGhlIGFmdGVybm9vbikgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMS4gYE5vIGNhcmVsZXNzYDogd2UgZXhjbHVkZSBvbmUgcGFydGljaXBhbnQgYFMxMzdgIGZsYWdnZWQgYXMgcG90ZW50aWFsbHkgY2FyZWxlc3MgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMi4gYFdFYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTMuIGBXQ2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciBzdGF0ZSB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHdvcmtpbmcgZXhjZXNzaXZlbHkgZGltZW5zaW9uDQoNCjE0LiBgV0hMU00gcmV0cm9gOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3IgdHJhaXQgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSByZXRyb3NwZWN0aXZlIHZlcnNpb24gb2YgdGhlIERVV0FTIGluY2x1ZGVkIGluIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmNoZWNrcyA8LSBjKCJPcmlnaW5hbCIsIk5vIEluZmwiLCJObyBzbGVlcER5c2YiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dOb3JtIiwNCiAgICAgICAgICAgICJwb3NpdGlvbiIsImNoaWxkcmVuIiwiTm8gZmxhZ1RpbWUiLCJObyBjYXJlbGVzcyIsIldFIiwiV0MiLCJXSExTTSByZXRybyIpDQpgYGANCg0KPGJyPg0KDQpJbiBhbGwgYnV0IHR3byBjYXNlcyAoaS5lLiwgb25seSB0aGUgaW50ZXJhY3Rpb24gYnV0IG5vdCB0aGUgbWFpbiBlZmZlY3Qgb2Ygc3RhdGUgd29ya2Fob2xpc20gaXMgc3Vic3RhbnRpYWwgd2hlbiBpbmNsdWRpbmcgdGhlIHJhbmRvbSBzbG9wZSBhbmQgd2hlbiB1c2luZyB0aGUgd29ya2luZyBjb21wdWxzaXZlbHkgZGltZW5zaW9uIHJhdGhlciB0aGFuIHRoZSB0b3RhbCBzdGF0ZSB3b3JrYWhvbGlzbSBzY29yZSksIHRoZSAqKnJlc3VsdHMgYXJlIGNvbnNpc3RlbnQqKiB3aXRoIHRob3NlIHJlcG9ydGVkIGluIHRoZSBtYWluIGFuYWx5c2VzLCBzaG93aW5nIHN1YnN0YW50aWFsIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AgYW5kIGludGVyYWN0aW9uLiBXZSBpbnRlcnByZXQgdGhlc2UgZmluZGluZ3MgYXMgYSBzaWduIG9mIHRoZSAqKmNvbnNpc3RlbmN5IG9mIHRoZSBlc3RpbWF0ZWQgaW50ZXJhY3Rpb25zKiogYmV0d2VlbiBgV0hMU00ubWNgIGFuZCBgUEQubWNgIGZvciBgU0RgLg0KDQojIyMgTUFJTiBFRkZFQ1QNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgbWFpbiBlZmZlY3Qgb2YgV0hMU00ubWMNCnByZWRpY3RvcnMgPC0gYygiZ2VuZGVyIiwiUEQubWMiLCJXSExTTS5jbS5nbWMiLCJXSExTTS5tYyIpDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgb3JpZ2luYWwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEWyFjbGVhblNEJElEJWluJWMoIlMxMzIiLCJTMDQ5IiwiUzA3OSIsIlMwMDIiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwNCiAgICAgICAgICAgICAgICAgICAgcmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0RbY2xlYW4kc2xlZXBfZHlzZiE9IlllcyIsXSwgIyB3aXRob3V0IHBhcnRpY2lwYW50cyB3aXRoIHNsZWVwIGR5c2YNCiAgICAgICAgICAgICAgICAgICAgcmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9YygiV0hMU00ubWMiKSwgIyB3aXRob3V0IGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEX2Z1bGwscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyByYW5kb20gc2xvcGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLHJhbi5lZmY9IihXSExTTS5tY3xJRCkiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgbG9nLW5vcm1hbCBmYW1pbHkNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLGxpbms9ImxvZyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzFdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzI6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEW2NsZWFuU0QkZmxhZ1RpbWU9PUZBTFNFLF0scmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksICMgd2l0aG91dCBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRFtjbGVhblNEJGNhcmVsZXNzPT1GQUxTRSxdLHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsICAjIHdpdGhvdXQgY2FyZWxlc3MNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXRS5tYyIsa2V5Lm1vZGVsPSJXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXQy5tYyIsa2V5Lm1vZGVsPSJXQy5tYyIpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpKSkgIyBXSExTTSByZXRybw0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMjIyBJTlRFUkFDVElPTg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKHByZWRpY3RvcnMsIlBELm1jOldITFNNLm1jIikNCnAgPC0gY2JpbmQoY2hlY2s9Y2hlY2tzLA0KICAgICAgcmJpbmQoZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRFshY2xlYW5TRCRJRCVpbiVjKCJTMTMyIiwiUzA0OSIsIlMwNzkiLCJTMDAyIiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEW2NsZWFuJHNsZWVwX2R5c2YhPSJZZXMiLF0sICMgd2l0aG91dCBwYXJ0aWNpcGFudHMgd2l0aCBzbGVlcCBkeXNmdW5jdGlvbnMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLCANCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWMoIlBELm1jIiwiV0hMU00ubWMiLCJQRC5tYzpXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0RfZnVsbCxyZXNwPSJTRCIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiLFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIHJhbmRvbSBzbG9wZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIGxvZy1ub3JtYWwgZmFtaWx5DQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWMocHJlZGljdG9yc1sxXSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1syOmxlbmd0aChwcmVkaWN0b3JzKV0pLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0RbY2xlYW5TRCRmbGFnVGltZT09RkFMU0UsXSxyZXNwPSJTRCIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksICMgd2l0aG91ZyBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRFtjbGVhblNEJGNhcmVsZXNzPT1GQUxTRSxdLHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50cw0KICAgICAgICAgICAgDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldFLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXRS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0MubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldDLm1jIixrZXkubW9kZWw9IlBELm1jOldDLm1jIiksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9Z3N1YigiV0hMU00uY20uZ21jIiwiV0hMU00ucmV0cm8uZ21jIixwcmVkaWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpKSkgIyBXSExTTSByZXRybw0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMgNS4gT3V0cHV0cw0KDQpIZXJlLCB3ZSBnZW5lcmF0ZSBhbmQgc2F2ZSB0aGUgcmVncmVzc2lvbiB0YWJsZXMgcmVwb3J0aW5nIHRoZSByZXN1bHRzIGVzdGltYXRlZCBieSB0aGUgc2VsZWN0ZWQgbW9kZWxzLiBGb3IgZWFjaCBtb2RlbCwgd2UgdmlzdWFsaXplIHRoZSB1bnN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMgKGIpLCB0aGUgc3RhbmRhcmQgZXJyb3IgKFNFKSwgYW5kIHRoZSAqKjk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMqKiBjb21wdXRlZCB3aXRoIDEwLDAwMCBpdGVyYXRpb25zLg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NH0NCk5TSU0gPSAxMDAwMA0KDQojIGNvZWZmaWNpZW50cyBhZnRlcm5vb24gQlANCnRhYl9tb2RlbChtMV9TQlBfYWZ0LG0yX1NCUF9hZnQsbTFfREJQX2FmdCxtMl9EQlBfYWZ0LA0KICAgICAgICAgIGR2LmxhYmVscz1wYXN0ZTAocmVwKGMoIlNCUF9hZnRfIiwiREJQX2FmdF8iKSxlYWNoPTIpLGMoImJhc2VsaW5lIiwiV0hMU00ubWMiKSksDQogICAgICAgICAgc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSxzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIikNCg0KIyBib290c3RyYXAgQ0kgU0JQX2FmdA0KY29uZmludC5tZXJNb2QobTFfU0JQX2FmdCxwYXJtPTM6KGxlbmd0aChmaXhlZihtMV9TQlBfYWZ0KSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTENCmNvbmZpbnQubWVyTW9kKG0yX1NCUF9hZnQscGFybT0zOihsZW5ndGgoZml4ZWYobTJfU0JQX2FmdCkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0yDQoNCiMgYm9vdHN0cmFwIENJIERCUF9hZnQNCmNvbmZpbnQubWVyTW9kKG0xX0RCUF9hZnQscGFybT01OihsZW5ndGgoZml4ZWYobTFfU0JQX2FmdCkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0xDQpjb25maW50Lm1lck1vZChtMl9EQlBfYWZ0LHBhcm09NToobGVuZ3RoKGZpeGVmKG0yX1NCUF9hZnQpKSsyKSxtZXRob2Q9ImJvb3QiLG5zaW09TlNJTSkgIyBNMg0KDQojIGNvZWZmaWNpZW50cyBldmVuaW5nIEJQDQp0YWJfbW9kZWwobTFfU0JQX2V2ZSxtMl9TQlBfZXZlLG0zX1NCUF9ldmUsbTFfREJQX2V2ZSxtMl9EQlBfZXZlLG0zX0RCUF9ldmUsDQogICAgICAgICAgZHYubGFiZWxzPXBhc3RlMChyZXAoYygiU0JQX2V2ZV8iLCJEQlBfZXZlXyIpLGVhY2g9MyksYygiYmFzZWxpbmUiLCJXSExTTS5tYyIsImludGVyYWN0aW9uIikpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIpDQoNCiMgYm9vdHN0cmFwIENJIFNCUF9ldmUNCmNvbmZpbnQubWVyTW9kKG0xX1NCUF9ldmUscGFybT0zOihsZW5ndGgoZml4ZWYobTFfU0JQX2V2ZSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0xDQpjb25maW50Lm1lck1vZChtMl9TQlBfZXZlLHBhcm09MzoobGVuZ3RoKGZpeGVmKG0yX1NCUF9ldmUpKSsyKSxtZXRob2Q9ImJvb3QiLG5zaW09TlNJTSkgIyBNMg0KY29uZmludC5tZXJNb2QobTNfU0JQX2V2ZSxwYXJtPTM6KGxlbmd0aChmaXhlZihtM19TQlBfZXZlKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTMNCg0KIyBib290c3RyYXAgQ0kgREJQX2V2ZQ0KY29uZmludC5tZXJNb2QobTFfREJQX2V2ZSxwYXJtPTM6KGxlbmd0aChmaXhlZihtMV9EQlBfZXZlKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTENCmNvbmZpbnQubWVyTW9kKG0yX0RCUF9ldmUscGFybT0zOihsZW5ndGgoZml4ZWYobTJfREJQX2V2ZSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0yDQpjb25maW50Lm1lck1vZChtM19EQlBfZXZlLHBhcm09MzoobGVuZ3RoKGZpeGVmKG0zX0RCUF9ldmUpKSsyKSxtZXRob2Q9ImJvb3QiLG5zaW09TlNJTSkgIyBNMw0KDQojIGNvZWZmaWNpZW50cyBFRSBhbmQgU0QNCnRhYl9tb2RlbChtMV9FRSxtMl9FRSxtM19FRSxtMV9TRCxtMl9TRCxtM19TRCwNCiAgICAgICAgICBkdi5sYWJlbHM9cGFzdGUwKHJlcChjKCJFRV8iLCJTRF8iKSxlYWNoPTMpLGMoImJhc2VsaW5lIiwiV0hMU00ubWMiLCJpbnRlcmFjdGlvbiIpKSwNCiAgICAgICAgICBzaG93LmljYz1GQUxTRSxzaG93LnA9RkFMU0Usc2hvdy5zZT1UUlVFLHNob3cucjI9RkFMU0UsY29sbGFwc2Uuc2U9VFJVRSxzdHJpbmcuZXN0PSJiIChTRSkiKQ0KDQogIyBib290c3RyYXAgQ0kgRUUgDQpjb25maW50Lm1lck1vZChtMV9FRSxwYXJtPTM6KGxlbmd0aChmaXhlZihtMV9FRSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0xDQpjb25maW50Lm1lck1vZChtMl9FRSxwYXJtPTM6KGxlbmd0aChmaXhlZihtMl9FRSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0yDQpjb25maW50Lm1lck1vZChtM19FRSxwYXJtPTM6KGxlbmd0aChmaXhlZihtM19FRSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0zDQoNCiMgYm9vc3RyYXAgQ0kgU0QNCmNvbmZpbnQubWVyTW9kKG0xX1NELHBhcm09MzoobGVuZ3RoKGZpeGVmKG0xX1NEKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTENCmNvbmZpbnQubWVyTW9kKG0yX1NELHBhcm09MzoobGVuZ3RoKGZpeGVmKG0yX1NEKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTINCmNvbmZpbnQubWVyTW9kKG0zX1NELHBhcm09MzoobGVuZ3RoKGZpeGVmKG0zX1NEKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTMNCg0KIyBwbG90dGluZyBpbnRlcmFjdGlvbg0KbGlicmFyeShnZ3Bsb3QyKTsgbGlicmFyeShncmlkRXh0cmEpDQpzZChjbGVhblNEJFBELm1jKSAjIFJEZXQ6IDEgU0QgPSAxLjM2DQpwIDwtIHBsb3RfbW9kZWwobTNfU0QsdHlwZT0icHJlZCIsdGVybXM9YygiV0hMU00ubWMiLCJQRC5tYyBbLTEuMzYsMS4zNl0iKSxjb2xvcnM9ImJ3IiwNCiAgICAgICAgICAgYWxwaGE9MC40LGxlZ2VuZC50aXRsZT0iUHN5Y2hvbG9naWNhbFxuZGV0YWNobWVudCIsYXhpcy50aXRsZT1jKCJTdGF0ZSB3b3JrYWhvbGlzbSIsIlNsZWVwIGRpc3R1cmJhbmNlcyIpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHM9YygiLTEgU0QiLCIrMSBTRCIpLHZhbHVlcz1jKCJibGFjayIsIiM2NjY2NjYiKSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwobGFiZWxzPWMoIi0xIFNEIiwiKzEgU0QiKSx2YWx1ZXM9Yygic29saWQiLCJkYXNoZWQiKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbChsYWJlbHM9YygiLTEgU0QiLCIrMSBTRCIpLHZhbHVlcz1jKCJibGFjayIsIiM2NjY2NjYiKSkgKyBnZ3RpdGxlKCIiKSArDQogICAgICAgICAgICAgICAgICAgIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpKQ0KcA0KZ2dzYXZlKCJSRVNVTFRTL0ZpZ3VyZTMudGlmZiIscGxvdD1wLGRwaT0zMDAsd2lkdGg9NSxoZWlnaHQ9NCkNCmBgYA0KDQo8YnI+DQoNCiMgUmVmZXJlbmNlcyB7I3JlZn0NCg0KLSBTdGVlZ2VuLCBTLiwgVHVlcmxpbmNreCwgRi4sIEdlbG1hbiwgQS4sICYgVmFucGFlbWVsLCBXLiAoMjAxNikuIEluY3JlYXNpbmcgdHJhbnNwYXJlbmN5IHRocm91Z2ggYSBtdWx0aXZlcnNlIGFuYWx5c2lzLiAqUGVyc3BlY3RpdmVzIG9uIFBzeWNob2xvZ2ljYWwgU2NpZW5jZSwgMTEqKDUpLCA3MDItNzEyLiBodHRwczovL2RvaS5vcmcvMTAuMTE3Ny8xNzQ1NjkxNjE2NjU4NjM3DQoNCjxicj4NCg0KIyMgUiBwYWNrYWdlcw==