Pollen Consumption

Input data

df <- read_csv("pollen.dates.csv", col_types = cols(treatment = col_factor(levels = c("1","2", "3", "4")), pollen.start = col_date(format = "%m/%d/%Y"),start.time = col_time(format = "%H:%M:%S"),pollen.end = col_date(format = "%m/%d/%Y"),end.time = col_time(format = "%H:%M:%S"),colony.start = col_date(format = "%m/%d/%Y")))
df$colony <- as.factor(df$colony)

Pollen Analysis

#https://stackoverflow.com/questions/75580470/emtrends-in-presence-of-a-quadratic-term-difference-in-quadratic-trends 

##NEW TIME Variable 

df$pollen.time <- as.numeric(df$pollen.time)
df$block <- as.factor(df$block)


LM.fit <- lmer(whole_dif~crithidia*fungicide*poly(pollen.time,2)+(1|colony) + block, data = df)
LM.fit2 <- lmer(whole_dif~(crithidia+fungicide+poly(pollen.time,2))^2+(1|colony) + block, data = df)
LM.fit3 <- lmer(whole_dif~(crithidia+fungicide+poly(pollen.time,2))^2+(1|colony), data = df)
LM.fit4 <- lmer(whole_dif~(crithidia*fungicide+poly(pollen.time,2))^2+(1|colony), data = df)
summary(LM.fit2)
## Linear mixed model fit by REML ['lmerMod']
## Formula: whole_dif ~ (crithidia + fungicide + poly(pollen.time, 2))^2 +  
##     (1 | colony) + block
##    Data: df
## 
## REML criterion at convergence: -344.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.6514 -0.5244 -0.1313  0.4560  4.6582 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  colony   (Intercept) 0.02156  0.1468  
##  Residual             0.03095  0.1759  
## Number of obs: 733, groups:  colony, 35
## 
## Fixed effects:
##                                     Estimate Std. Error t value
## (Intercept)                          0.42954    0.08771   4.897
## crithidiaTRUE                       -0.12779    0.07454  -1.714
## fungicideTRUE                       -0.06971    0.07161  -0.974
## poly(pollen.time, 2)1                2.94132    0.31792   9.252
## poly(pollen.time, 2)2               -2.75860    0.32161  -8.577
## block4                               0.45781    0.10748   4.259
## block6                              -0.15034    0.10713  -1.403
## block7                               0.02902    0.10743   0.270
## block8                               0.13906    0.10737   1.295
## block9                               0.04396    0.10738   0.409
## block10                              0.21771    0.11704   1.860
## block11                             -0.09109    0.10723  -0.849
## block12                              0.07204    0.10725   0.672
## crithidiaTRUE:fungicideTRUE          0.02148    0.10331   0.208
## crithidiaTRUE:poly(pollen.time, 2)1 -1.35371    0.35888  -3.772
## crithidiaTRUE:poly(pollen.time, 2)2  0.81627    0.36106   2.261
## fungicideTRUE:poly(pollen.time, 2)1 -0.10258    0.35990  -0.285
## fungicideTRUE:poly(pollen.time, 2)2  0.87969    0.36215   2.429
anova(LM.fit2, LM.fit, test = "Chi")
## Data: df
## Models:
## LM.fit2: whole_dif ~ (crithidia + fungicide + poly(pollen.time, 2))^2 + (1 | colony) + block
## LM.fit: whole_dif ~ crithidia * fungicide * poly(pollen.time, 2) + (1 | colony) + block
##         npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## LM.fit2   20 -352.13 -260.19 196.06  -392.13                     
## LM.fit    22 -349.80 -248.67 196.90  -393.80 1.6763  2     0.4325
anova(LM.fit2, LM.fit3, test = "Chi")
## Data: df
## Models:
## LM.fit3: whole_dif ~ (crithidia + fungicide + poly(pollen.time, 2))^2 + (1 | colony)
## LM.fit2: whole_dif ~ (crithidia + fungicide + poly(pollen.time, 2))^2 + (1 | colony) + block
##         npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)    
## LM.fit3   12 -330.81 -275.64 177.41  -354.81                         
## LM.fit2   20 -352.13 -260.19 196.06  -392.13 37.318  8  1.006e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AIC(LM.fit2, LM.fit3, LM.fit4)
##         df       AIC
## LM.fit2 20 -304.8886
## LM.fit3 12 -313.1797
## LM.fit4 14 -313.3530
Anova(LM.fit3)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: whole_dif
##                                   Chisq Df Pr(>Chisq)    
## crithidia                        2.7397  1    0.09788 .  
## fungicide                        0.4755  1    0.49048    
## poly(pollen.time, 2)           279.3323  2  < 2.2e-16 ***
## crithidia:fungicide              0.0649  1    0.79894    
## crithidia:poly(pollen.time, 2)  20.0616  2  4.402e-05 ***
## fungicide:poly(pollen.time, 2)   5.7454  2    0.05654 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(LM.fit)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: whole_dif
##                                             Chisq Df Pr(>Chisq)    
## crithidia                                  5.0655  1    0.02441 *  
## fungicide                                  1.3478  1    0.24566    
## poly(pollen.time, 2)                     279.5854  2  < 2.2e-16 ***
## block                                     43.4624  8  7.187e-07 ***
## crithidia:fungicide                        0.0431  1    0.83563    
## crithidia:poly(pollen.time, 2)            20.0698  2  4.384e-05 ***
## fungicide:poly(pollen.time, 2)             6.0573  2    0.04838 *  
## crithidia:fungicide:poly(pollen.time, 2)   1.7097  2    0.42536    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(LM.fit4)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: whole_dif
##                                             Chisq Df Pr(>Chisq)    
## crithidia                                  2.7377  1    0.09800 .  
## fungicide                                  0.4751  1    0.49064    
## poly(pollen.time, 2)                     279.2567  2  < 2.2e-16 ***
## crithidia:fungicide                        0.0648  1    0.79901    
## crithidia:poly(pollen.time, 2)            20.0562  2  4.414e-05 ***
## fungicide:poly(pollen.time, 2)             5.7438  2    0.05659 .  
## crithidia:fungicide:poly(pollen.time, 2)   1.7906  2    0.40848    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#LM.fit3 fits better

Plot pollen data

par(mar = c(5, 5, 4, 2) + 0.1)

df$time2 <- df$pollen.time^2
# Calculate fitted values
time.quad2 <- lme(whole_dif ~ treatment * pollen.time + treatment * time2,
                  random = list(colony = pdDiag(~ pollen.time)), data = df)


fitted3 <- fitted(time.quad2, level = 0)


# Create a data frame with ordered values
a <- with(df,
          data.frame(pollen.time, fitted3, treatment)[order(treatment, pollen.time), ])

# Set the font size multiplier and symbol size multiplier
font_multiplier <- 2
symbol_multiplier <- 2  # Adjust this for larger symbols
legend_cex <- 1.5




# Assuming you have standard error data, here's an example
se <- with(a, tapply(fitted3, treatment, function(x) sd(x)/sqrt(length(x))))

# Plot
with(a, {
  # Plot data for treatment 1
  plot(pollen.time[treatment==1], fitted3[treatment==1],
       ylab = "Average Pollen Consumption (g)", xlab = "Time (days)",
       col = "darkorchid4", type = "b", pch = 1,
       cex.lab = font_multiplier, # Size of axis labels
       cex.axis = font_multiplier, # Size of axis numbers
       cex = symbol_multiplier)    # Size of symbols
  
  # Add standard error ribbon for treatment 1
  polygon(c(pollen.time[treatment==1], rev(pollen.time[treatment==1])),
          c(fitted3[treatment==1] + se[1], rev(fitted3[treatment==1] - se[1])),
          col = adjustcolor("darkorchid4", alpha.f = 0.2), border = NA)
  
  # Add points for other treatments with increased symbol size
  points(pollen.time[treatment==2], fitted3[treatment==2],
         pch = 4, col = "dodgerblue", type = "b",
         cex = symbol_multiplier)    # Size of symbols
  
  # Add standard error ribbon for treatment 2
  polygon(c(pollen.time[treatment==2], rev(pollen.time[treatment==2])),
          c(fitted3[treatment==2] + se[2], rev(fitted3[treatment==2] - se[2])),
          col = adjustcolor("dodgerblue", alpha.f = 0.2), border = NA)
  
  points(pollen.time[treatment==3], fitted3[treatment==3],
         pch = 16, col = "orange4", type = "b",
         cex = symbol_multiplier)    # Size of symbols
  
  # Add standard error ribbon for treatment 3
  polygon(c(pollen.time[treatment==3], rev(pollen.time[treatment==3])),
          c(fitted3[treatment==3] + se[3], rev(fitted3[treatment==3] - se[3])),
          col = adjustcolor("orange4", alpha.f = 0.2), border = NA)
  
  points(pollen.time[treatment==4], fitted3[treatment==4],
         pch = 17, col = "orange", type = "b",
         cex = symbol_multiplier)    # Size of symbols
  
  # Add standard error ribbon for treatment 4
  polygon(c(pollen.time[treatment==4], rev(pollen.time[treatment==4])),
          c(fitted3[treatment==4] + se[4], rev(fitted3[treatment==4] - se[4])),
          col = adjustcolor("orange", alpha.f = 0.2), border = NA)
  
  # Add a legend with larger font
  legend("topleft", legend = c(" Control", "Fungicide", "Fungicide + Crithidia", "Crithidia"),
         col = c("darkorchid4", "dodgerblue", "orange4", "orange"), pch = c(1, 4, 16, 17), 
         lty = 1, cex = legend_cex, bty= "n")
})

Disease dynamics

Input data

#### Data for qpCR Disease Dynamics

all_bees <- read_csv("qpcr_3.4_bees_all2.csv", col_types = cols(treatment = col_factor(levels = c("1", 
                                                                                        "2", "3", "4")), replicate = col_factor(levels = c("1", 
                                                                                                                                           "4", "6", "7", "8", "9", "10", "11", 
                                                                                                                                           "12")), start = col_date(format = "%m/%d/%Y"), 
                                                      innoculation_date = col_date(format = "%m/%d/%Y"), 
                                                      date = col_date(format = "%m/%d/%Y")))
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
all_bees$colony <- as.factor(all_bees$colony)
all_bees$bee_id <- as.factor(all_bees$bee_id)


a_df <- read_csv("individual bees 3.4 average.csv", 
    col_types = cols(date_first_adl = col_date(format = "%m/%d/%Y"), 
        round = col_factor(levels = c("1", 
            "2", "3"))))

a_df$bee_id <- as.factor(a_df$bee_id)
a_df$colony <- as.factor(a_df$colony)
a_df$treatment <- as.factor(a_df$treatment)
a_df$replicate <- as.factor(a_df$replicate)

a_df_na <- na.omit(a_df)


qpcr <-  read_csv("qpcr_3.4_bees_all.csv", 
    col_types = cols(inoculate_round = col_factor(levels = c("1", 
        "2", "3")), inoculate_01 = col_logical(), 
        `end date` = col_date(format = "%m/%d/%Y"), 
        treatment = col_factor(levels = c("3", 
            "4")), replicate = col_factor(levels = c("1", 
            "4", "5", "6", "7", "8", "9", 
            "10", "11", "12")), start = col_date(format = "%m/%d/%Y"), 
        innoculation_date = col_date(format = "%m/%d/%Y"), 
        date = col_date(format = "%m/%d/%Y"), 
        alive_or_dead = col_logical()))
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
qpcr$fungicide <- as.logical(qpcr$fungicide)
qpcr$crithidia <- as.logical(qpcr$crithidia)
qpcr$qro <- as.factor(qpcr$qro)
qpcr$colony <- as.factor(qpcr$colony)
qpcr$premature_death <- as.factor(qpcr$premature_death)
qpcr$dry <- as.double(qpcr$dry)
qpcr$bee_id <- as.factor(qpcr$bee_id)
qpcr$spore_include <- as.numeric(qpcr$spore_include)
qpcr$col_days <- as.factor(qpcr$col_days)


dfcox <- read_csv("data for cox ph.csv")

dfcox$bee_id <- as.factor(dfcox$bee_id)
dfcox$fungicide <- as.factor(dfcox$fungicide)
dfcox$crithidia <- as.factor(dfcox$crithidia)
dfcox$qro <- as.factor(dfcox$qro)
dfcox$inoculate_round <- as.factor(dfcox$inoculate_round)
dfcox$inoculate <- as.factor(dfcox$inoculate)
dfcox$inoculate_01 <- as.factor(dfcox$inoculate_01)
dfcox$premature_death <- as.factor(dfcox$premature_death)
dfcox$treatment <- as.factor(dfcox$treatment)
dfcox$replicate <- as.factor(dfcox$replicate)
dfcox$colony <- as.factor(dfcox$colony)



cbdf <- read_csv("cbdf.csv")
cbdf$colony <- as.factor(cbdf$colony)
cbdf$day <- as.factor(cbdf$day)
cbdf$fungicide <- as.factor(cbdf$fungicide)
cbdf$round <- as.factor(cbdf$round)
cbdf$block <- as.factor(cbdf$block)

qpcr_all <- read_csv("qpcr_3.4_bees_all_with5.csv")
qpcr_all.na <- na.omit(qpcr_all)

unique(qpcr_all$replicate)
##  [1]  1  4  5  6  7  8  9 10 11 12
workers <- read_csv("workers.csv")
workers$colony <- as.factor(workers$colony)
workers$treatment <- as.factor(workers$treatment)
workers$block <- as.factor(workers$block)
workers$qro <- as.factor(workers$qro)
workers$inoculate <- as.logical(workers$inoculate)

custom_labels <- c("Control", "Fungicide", "Fungicide + Crithidia", "Crithidia")

Worker survival probability analysis

#Over whole experiment 

library(survival)
library(coxme)
library(survminer)

workers.na <- na.omit(workers)
workers.na$inoculate_round <- as.factor(workers.na$inoculate_round)
cox <- coxme(Surv(days_alive_since_inoc, inoc_censor) ~ crithidia + fungicide + inoculate_round + inoculate + (1|colony), data = workers.na)

Anova(cox)
## Analysis of Deviance Table (Type II tests)
## 
## Response: Surv(days_alive_since_inoc, inoc_censor)
##                 Df  Chisq Pr(>Chisq)  
## crithidia        1 4.5618    0.03269 *
## fungicide        1 0.5496    0.45846  
## inoculate_round  2 6.5356    0.03809 *
## inoculate        1 3.7609    0.05246 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(cox)
## Mixed effects coxme model
##  Formula: Surv(days_alive_since_inoc, inoc_censor) ~ crithidia + fungicide +      inoculate_round + inoculate + (1 | colony) 
##     Data: workers.na 
## 
##   events, n = 53, 175
## 
## Random effects:
##    group  variable        sd  variance
## 1 colony Intercept 0.8515921 0.7252091
##                   Chisq   df         p   AIC   BIC
## Integrated loglik 38.30  6.0 9.829e-07 26.30 14.47
##  Penalized loglik 75.32 18.4 7.517e-09 38.53  2.28
## 
## Fixed effects:
##                    coef exp(coef) se(coef)    z      p
## crithidia        0.9370    2.5523   0.4387 2.14 0.0327
## fungicide        0.3177    1.3740   0.4285 0.74 0.4585
## inoculate_round2 0.3573    1.4295   0.4951 0.72 0.4705
## inoculate_round3 1.4966    4.4665   0.5855 2.56 0.0106
## inoculateTRUE    0.6020    1.8258   0.3104 1.94 0.0525
emmeans(cox, pairwise ~ crithidia*fungicide)
## $emmeans
##  crithidia fungicide emmean    SE  df asymp.LCL asymp.UCL
##          0         0 -0.110 0.359 Inf    -0.813     0.594
##          1         0  0.827 0.336 Inf     0.170     1.485
##          0         1  0.208 0.349 Inf    -0.476     0.892
##          1         1  1.145 0.347 Inf     0.465     1.825
## 
## Results are averaged over the levels of: inoculate_round, inoculate 
## Results are given on the log (not the response) scale. 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast                                      estimate    SE  df z.ratio
##  crithidia0 fungicide0 - crithidia1 fungicide0   -0.937 0.439 Inf  -2.136
##  crithidia0 fungicide0 - crithidia0 fungicide1   -0.318 0.429 Inf  -0.741
##  crithidia0 fungicide0 - crithidia1 fungicide1   -1.255 0.625 Inf  -2.006
##  crithidia1 fungicide0 - crithidia0 fungicide1    0.619 0.601 Inf   1.031
##  crithidia1 fungicide0 - crithidia1 fungicide1   -0.318 0.429 Inf  -0.741
##  crithidia0 fungicide1 - crithidia1 fungicide1   -0.937 0.439 Inf  -2.136
##  p.value
##   0.1418
##   0.8804
##   0.1856
##   0.7315
##   0.8804
##   0.1418
## 
## Results are averaged over the levels of: inoculate_round, inoculate 
## Results are given on the log (not the response) scale. 
## P value adjustment: tukey method for comparing a family of 4 estimates
emmeans(cox, pairwise ~ inoculate)
## $emmeans
##  inoculate emmean    SE  df asymp.LCL asymp.UCL
##  FALSE      0.217 0.152 Inf    -0.081     0.514
##   TRUE      0.819 0.281 Inf     0.268     1.369
## 
## Results are averaged over the levels of: crithidia, fungicide, inoculate_round 
## Results are given on the log (not the response) scale. 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast     estimate   SE  df z.ratio p.value
##  FALSE - TRUE   -0.602 0.31 Inf  -1.939  0.0525
## 
## Results are averaged over the levels of: crithidia, fungicide, inoculate_round 
## Results are given on the log (not the response) scale.
cox.t <- coxme(Surv(days_alive_since_inoc, inoc_censor) ~ treatment + inoculate_round + (1|colony), data = workers.na)
cox.emm <- emmeans(cox.t, pairwise ~ treatment)
cox.emm
## $emmeans
##  treatment emmean    SE  df asymp.LCL asymp.UCL
##  1         -0.715 0.468 Inf   -1.6319     0.201
##  2          0.344 0.386 Inf   -0.4125     1.101
##  3          0.796 0.361 Inf    0.0884     1.504
##  4          0.918 0.355 Inf    0.2219     1.613
## 
## Results are averaged over the levels of: inoculate_round 
## Results are given on the log (not the response) scale. 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast                estimate    SE  df z.ratio p.value
##  treatment1 - treatment2   -1.060 0.683 Inf  -1.551  0.4069
##  treatment1 - treatment3   -1.512 0.657 Inf  -2.300  0.0980
##  treatment1 - treatment4   -1.633 0.664 Inf  -2.459  0.0665
##  treatment2 - treatment3   -0.452 0.552 Inf  -0.819  0.8457
##  treatment2 - treatment4   -0.573 0.553 Inf  -1.036  0.7283
##  treatment3 - treatment4   -0.121 0.522 Inf  -0.232  0.9956
## 
## Results are averaged over the levels of: inoculate_round 
## Results are given on the log (not the response) scale. 
## P value adjustment: tukey method for comparing a family of 4 estimates
cox.inoc <- coxme(Surv(days_alive_since_inoc, inoc_censor) ~ treatment + inoculate_round + (1|colony), data = workers.na)
Anova(cox.inoc)
## Analysis of Deviance Table (Type II tests)
## 
## Response: Surv(days_alive_since_inoc, inoc_censor)
##                 Df  Chisq Pr(>Chisq)  
## treatment        3 6.9615    0.07313 .
## inoculate_round  2 6.7712    0.03386 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cox.emm <- emmeans(cox.t, pairwise ~ treatment)
cox.emm
## $emmeans
##  treatment emmean    SE  df asymp.LCL asymp.UCL
##  1         -0.715 0.468 Inf   -1.6319     0.201
##  2          0.344 0.386 Inf   -0.4125     1.101
##  3          0.796 0.361 Inf    0.0884     1.504
##  4          0.918 0.355 Inf    0.2219     1.613
## 
## Results are averaged over the levels of: inoculate_round 
## Results are given on the log (not the response) scale. 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast                estimate    SE  df z.ratio p.value
##  treatment1 - treatment2   -1.060 0.683 Inf  -1.551  0.4069
##  treatment1 - treatment3   -1.512 0.657 Inf  -2.300  0.0980
##  treatment1 - treatment4   -1.633 0.664 Inf  -2.459  0.0665
##  treatment2 - treatment3   -0.452 0.552 Inf  -0.819  0.8457
##  treatment2 - treatment4   -0.573 0.553 Inf  -1.036  0.7283
##  treatment3 - treatment4   -0.121 0.522 Inf  -0.232  0.9956
## 
## Results are averaged over the levels of: inoculate_round 
## Results are given on the log (not the response) scale. 
## P value adjustment: tukey method for comparing a family of 4 estimates
brood <- read_csv("brood.csv")

brood <- read_csv("brood.csv")
brood$colony <- as.factor(brood$colony)
brood$treatment <- as.factor(brood$treatment)
brood$block <- as.factor(brood$block)
brood$fungicide <- as.logical(brood$fungicide)
brood$crithidia <- as.logical(brood$crithidia)

Plot COX PH Curves

ggsurvplot(
  survfit(Surv(days_alive_since_inoc, inoc_censor) ~ treatment, data = workers.na),
  legend.title = "",
  censor.shape = 124, 
  censor.size = 2.5,
  ylim = c(0.25, 1),
  palette = c("darkorchid4", "dodgerblue", "orange4", "orange"),
  legend.labs = c("Control", "Fungicide", "Fungicide + Crithidia", "Crithidia"),
  font.x = 16,
  font.y = 16, 
  font.tickslab = 16, 
  font.legend = 18,
  legend = "right"
)

Likliehood of infection above detection limit

qpcr_all.na$adl_neg <- 1 - qpcr_all.na$adl
qpcr_all.na$round <- as.factor(qpcr_all.na$round)
qpcr_all.na$replicate <- as.factor(qpcr_all.na$replicate)

cbw2 <- glm(cbind(adl, adl_neg) ~ fungicide + round + inoculate + replicate, data = qpcr_all.na, family = binomial("logit"))
drop1(cbw2, test = "Chisq")
## Single term deletions
## 
## Model:
## cbind(adl, adl_neg) ~ fungicide + round + inoculate + replicate
##           Df Deviance    AIC     LRT  Pr(>Chi)    
## <none>         1164.6 1192.6                      
## fungicide  1   1172.3 1198.3   7.656 0.0056575 ** 
## round      2   1178.6 1202.6  13.936 0.0009416 ***
## inoculate  1   1267.3 1293.3 102.632 < 2.2e-16 ***
## replicate  9   1224.1 1234.1  59.463 1.701e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(cbw2)
## Analysis of Deviance Table (Type II tests)
## 
## Response: cbind(adl, adl_neg)
##           LR Chisq Df Pr(>Chisq)    
## fungicide    7.656  1  0.0056575 ** 
## round       13.936  2  0.0009416 ***
## inoculate  102.632  1  < 2.2e-16 ***
## replicate   59.463  9  1.701e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(cbw2)
## 
## Call:
## glm(formula = cbind(adl, adl_neg) ~ fungicide + round + inoculate + 
##     replicate, family = binomial("logit"), data = qpcr_all.na)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -2.1059     0.2165  -9.725  < 2e-16 ***
## fungicideTRUE   0.4824     0.1748   2.759  0.00579 ** 
## round2         -1.6874     0.5422  -3.112  0.00186 ** 
## round3          1.0634     0.4727   2.250  0.02446 *  
## inoculateTRUE   1.6621     0.1670   9.954  < 2e-16 ***
## replicate4     -0.4410     0.3231  -1.365  0.17225    
## replicate5      2.8644     0.6075   4.715 2.41e-06 ***
## replicate6      0.2876     0.3651   0.788  0.43097    
## replicate7      0.3445     0.5533   0.623  0.53356    
## replicate8      2.4619     0.6048   4.071 4.68e-05 ***
## replicate9     -0.4547     0.3296  -1.380  0.16771    
## replicate10     0.8307     0.3464   2.398  0.01649 *  
## replicate11     1.2705     0.6384   1.990  0.04660 *  
## replicate12     0.7912     0.3562   2.221  0.02635 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1354.0  on 1181  degrees of freedom
## Residual deviance: 1164.6  on 1168  degrees of freedom
## AIC: 1192.6
## 
## Number of Fisher Scoring iterations: 4
emm1 <- emmeans(cbw2, pairwise ~ fungicide, type = "response")
pairs(emm1)
##  contrast     odds.ratio    SE  df null z.ratio p.value
##  FALSE / TRUE      0.617 0.108 Inf    1  -2.759  0.0058
## 
## Results are averaged over the levels of: round, inoculate, replicate 
## Tests are performed on the log odds ratio scale
emm1
## $emmeans
##  fungicide  prob     SE  df asymp.LCL asymp.UCL
##  FALSE     0.335 0.0298 Inf     0.279     0.395
##   TRUE     0.449 0.0405 Inf     0.371     0.529
## 
## Results are averaged over the levels of: round, inoculate, replicate 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale 
## 
## $contrasts
##  contrast     odds.ratio    SE  df null z.ratio p.value
##  FALSE / TRUE      0.617 0.108 Inf    1  -2.759  0.0058
## 
## Results are averaged over the levels of: round, inoculate, replicate 
## Tests are performed on the log odds ratio scale
em.df <- as.data.frame(emm1$emmeans)
em.df
##  fungicide      prob         SE  df asymp.LCL asymp.UCL
##  FALSE     0.3346131 0.02977979 Inf 0.2789763 0.3952630
##   TRUE     0.4489313 0.04053016 Inf 0.3714293 0.5289951
## 
## Results are averaged over the levels of: round, inoculate, replicate 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale
emm2 <- emmeans(cbw2, pairwise ~ inoculate, type = "response")
pairs(emm2)
##  contrast     odds.ratio     SE  df null z.ratio p.value
##  FALSE / TRUE       0.19 0.0317 Inf    1  -9.954  <.0001
## 
## Results are averaged over the levels of: fungicide, round, replicate 
## Tests are performed on the log odds ratio scale
emm2
## $emmeans
##  inoculate  prob     SE  df asymp.LCL asymp.UCL
##  FALSE     0.218 0.0209 Inf     0.180     0.262
##   TRUE     0.595 0.0405 Inf     0.514     0.671
## 
## Results are averaged over the levels of: fungicide, round, replicate 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale 
## 
## $contrasts
##  contrast     odds.ratio     SE  df null z.ratio p.value
##  FALSE / TRUE       0.19 0.0317 Inf    1  -9.954  <.0001
## 
## Results are averaged over the levels of: fungicide, round, replicate 
## Tests are performed on the log odds ratio scale

Visulize likelihood of infection probabilities

ggplot(data = em.df, aes(x = fungicide, y = prob, fill = fungicide)) +
  geom_col() +
  geom_bar(stat = "identity", color = "black") +
  geom_col_pattern(
    aes(pattern = fungicide),
    pattern_density = c(0, 0.4),  
    pattern_spacing = 0.03,
    position = position_dodge(0.9)
  ) +
  labs(x = NULL, y = "Probability of Testing Above Detection Limit") +
  theme_cowplot() +
 scale_x_discrete(labels = c("FALSE" = "Crithidia", "TRUE" = "Fungicide + Crithidia")) +
  scale_fill_manual(values = c("FALSE" = "orange", "TRUE" = "orange4")) +
    scale_pattern_manual(values = c("none", "stripe")) + # Customize bar colors
  theme(legend.position = "none") +  # Remove the legend
  annotate(
    geom = "text",
    x = 0.8,
    y = 0.45,
    label = "P < 0.01",
    size = 8
  ) +
  geom_errorbar(aes(ymin = prob - SE, ymax = prob + SE), width = 0.2, size = 0.8, position = position_dodge(1)) +
    theme(legend.position = "none",
        axis.text = element_text(size = 20),  # Set axis label font size
        axis.title = element_text(size = 20)) +  # Set axis title font size
  theme(text = element_text(size = 16))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Days until first infection above detection limit and total times above detection limit

# Input data 
adl <- read.csv("adl.csv")
adl$colony <- as.factor(adl$colony)
adl$treatment <-as.factor(adl$treatment)
adl$round <- as.factor(adl$round)
adl$inoculate <- as.logical(adl$inoculate)
adl$block <- as.factor(adl$block)


adlmod <- glmer.nb(days_to_adl ~ treatment + round + inoculate + block + (1|colony), data = adl)
drop1(adlmod, test = "Chisq")
## Single term deletions
## 
## Model:
## days_to_adl ~ treatment + round + inoculate + block + (1 | colony)
##           npar    AIC     LRT   Pr(Chi)    
## <none>         404.34                      
## treatment    1 403.34  0.9991 0.3175325    
## round        2 415.07 14.7353 0.0006314 ***
## inoculate    1 410.09  7.7495 0.0053728 ** 
## block        9 406.33 19.9943 0.0179474 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(adlmod)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: days_to_adl
##             Chisq Df Pr(>Chisq)   
## treatment  0.9977  1   0.317870   
## round     12.4901  2   0.001940 **
## inoculate  7.3987  1   0.006527 **
## block     20.9704  9   0.012782 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
adlemm <- emmeans(adlmod, pairwise ~ treatment, type = "response")
pairs(adlemm)
##  contrast                ratio    SE  df null z.ratio p.value
##  treatment3 / treatment4 0.866 0.124 Inf    1  -0.999  0.3179
## 
## Results are averaged over the levels of: round, inoculate, block 
## Tests are performed on the log scale
adlemm
## $emmeans
##  treatment response    SE  df asymp.LCL asymp.UCL
##  3             2.12 0.397 Inf      1.47      3.06
##  4             2.45 0.397 Inf      1.78      3.36
## 
## Results are averaged over the levels of: round, inoculate, block 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## 
## $contrasts
##  contrast                ratio    SE  df null z.ratio p.value
##  treatment3 / treatment4 0.866 0.124 Inf    1  -0.999  0.3179
## 
## Results are averaged over the levels of: round, inoculate, block 
## Tests are performed on the log scale
adlemm <- emmeans(adlmod, pairwise ~ round, type = "response")
pairs(adlemm)
##  contrast        ratio    SE  df null z.ratio p.value
##  round1 / round2  1.85 0.745 Inf    1   1.530  0.2767
##  round1 / round3  6.76 4.232 Inf    1   3.051  0.0065
##  round2 / round3  3.65 2.816 Inf    1   1.678  0.2134
## 
## Results are averaged over the levels of: treatment, inoculate, block 
## P value adjustment: tukey method for comparing a family of 3 estimates 
## Tests are performed on the log scale
adlemm
## $emmeans
##  round response    SE  df asymp.LCL asymp.UCL
##  1        5.288 0.936 Inf     3.738      7.48
##  2        2.857 0.846 Inf     1.598      5.10
##  3        0.783 0.457 Inf     0.249      2.46
## 
## Results are averaged over the levels of: treatment, inoculate, block 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## 
## $contrasts
##  contrast        ratio    SE  df null z.ratio p.value
##  round1 / round2  1.85 0.745 Inf    1   1.530  0.2767
##  round1 / round3  6.76 4.232 Inf    1   3.051  0.0065
##  round2 / round3  3.65 2.816 Inf    1   1.678  0.2134
## 
## Results are averaged over the levels of: treatment, inoculate, block 
## P value adjustment: tukey method for comparing a family of 3 estimates 
## Tests are performed on the log scale
adlemm <- emmeans(adlmod, pairwise ~ inoculate, type = "response")
pairs(adlemm)
##  contrast     ratio    SE  df null z.ratio p.value
##  FALSE / TRUE  1.62 0.289 Inf    1   2.720  0.0065
## 
## Results are averaged over the levels of: treatment, round, block 
## Tests are performed on the log scale
adlemm
## $emmeans
##  inoculate response    SE  df asymp.LCL asymp.UCL
##  FALSE         2.90 0.449 Inf      2.14      3.93
##   TRUE         1.79 0.370 Inf      1.19      2.68
## 
## Results are averaged over the levels of: treatment, round, block 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## 
## $contrasts
##  contrast     ratio    SE  df null z.ratio p.value
##  FALSE / TRUE  1.62 0.289 Inf    1   2.720  0.0065
## 
## Results are averaged over the levels of: treatment, round, block 
## Tests are performed on the log scale
detadl <- glmer.nb(total.adl ~ treatment + inoculate + (1|colony), data = adl)
drop1(detadl, test = "Chisq")
## Single term deletions
## 
## Model:
## total.adl ~ treatment + inoculate + (1 | colony)
##           npar    AIC     LRT   Pr(Chi)    
## <none>         437.45                      
## treatment    1 435.98  0.5224    0.4698    
## inoculate    1 466.19 30.7356 2.957e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(detadl)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: total.adl
##             Chisq Df Pr(>Chisq)    
## treatment  0.5418  1     0.4617    
## inoculate 27.9557  1  1.241e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
adl.t.emm <- emmeans(detadl, pairwise ~ inoculate, type = "response")
pairs(adl.t.emm)
##  contrast     ratio    SE  df null z.ratio p.value
##  FALSE / TRUE  0.32 0.069 Inf    1  -5.287  <.0001
## 
## Results are averaged over the levels of: treatment 
## Tests are performed on the log scale
adl.t.emm
## $emmeans
##  inoculate response    SE  df asymp.LCL asymp.UCL
##  FALSE         2.01 0.308 Inf      1.49      2.72
##   TRUE         6.29 1.299 Inf      4.20      9.43
## 
## Results are averaged over the levels of: treatment 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## 
## $contrasts
##  contrast     ratio    SE  df null z.ratio p.value
##  FALSE / TRUE  0.32 0.069 Inf    1  -5.287  <.0001
## 
## Results are averaged over the levels of: treatment 
## Tests are performed on the log scale
adl_sum <- adl %>%
  group_by(treatment) %>%
  summarise(wrkrs = length(bee_id))
adl_sum
## # A tibble: 2 × 2
##   treatment wrkrs
##   <fct>     <int>
## 1 3            50
## 2 4            49

Maximum level of infection

adl$bee_id <- as.factor(adl$bee_id)

qpcr_max_sum <-   qpcr %>%
  group_by(bee_id, treatment, inoculate, inoculate_round, colony) %>%
  summarise(max = max(spores_assumed))

max_sum <- qpcr_max_sum %>%
  group_by(inoculate) %>%
  summarise(mean = mean(max),
            sd= sd(max),
            n = length(max)) %>%
  mutate(se = sd/sqrt(n))

hist(adl$max_infc)

adl$logmax <- log((adl$max_infc)+1)
hist(adl$logmax)

shapiro.test(adl$logmax)
## 
##  Shapiro-Wilk normality test
## 
## data:  adl$logmax
## W = 0.90717, p-value = 3.447e-06
range(adl$logmax)
## [1] 0.000000 6.270988
maxmod <- lmer(logmax ~ treatment + inoculate + round + (1|colony), data = adl)
Anova(maxmod)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: logmax
##             Chisq Df Pr(>Chisq)   
## treatment  0.2929  1   0.588367   
## inoculate  9.8498  1   0.001698 **
## round     11.9265  2   0.002572 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
maxmod.emm <- emmeans(maxmod, pairwise ~ inoculate, type = "response")

library(NBZIMM)
max.zig = lme.zig(fixed = logmax ~ treatment + inoculate + round + offset(log(days_to_adl + 1)), 
             random = ~ 1 | colony, data = adl)
## Computational iterations: 4 
## Computational time: 0.001 minutes
Anova(max.zig)
## Analysis of Deviance Table (Type II tests)
## 
## Response: zz
##             Chisq Df Pr(>Chisq)    
## treatment  2.3994  1    0.12138    
## inoculate  7.9420  1    0.00483 ** 
## round     19.3761  2  6.202e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
max_sum <- adl %>%
  group_by(treatment) %>%
  summarise(m = mean(max_infc),
            n = length(max_infc),
            sd = sd(max_infc)) %>%
  mutate(se = sd/sqrt(n))
max_sum
## # A tibble: 2 × 5
##   treatment     m     n    sd    se
##   <fct>     <dbl> <int> <dbl> <dbl>
## 1 3          99.7    50  124.  17.5
## 2 4          81.1    49  106.  15.1

Infection level measured over time

# Input the data 
qpcr <- read_csv("qpcr_time2.csv")
qpcr$bee_id <- as.factor(qpcr$bee_id)
qpcr$time_group <- as.factor(qpcr$time_group)
qpcr$inoculate_round <- as.factor(qpcr$inoculate_round)
qpcr$replicate <- as.factor(qpcr$replicate)
qpcr$fungicide <- as.factor(qpcr$fungicide)

# Look at shape 
hist(qpcr$spores_assumed)

plot(qpcr$fungicide, qpcr$spores_assumed)

# Transform the data to normalize 
qpcr$logspores <- log((qpcr$spores_assumed)+10)
shapiro.test(qpcr$logspores)
## 
##  Shapiro-Wilk normality test
## 
## data:  qpcr$logspores
## W = 0.54946, p-value < 2.2e-16
hist(qpcr$logspores)

range(qpcr$logspores)
## [1] 2.302585 5.918894
range(qpcr$spores_assumed)
## [1]   0 362
# Final selected model 
f10 = glmer(logspores ~ time_group*fungicide + inoculate + inoculate_round  + (1|bee_id), family = Gamma(link = "log"), data = qpcr)
Anova(f10)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: logspores
##                        Chisq Df Pr(>Chisq)    
## time_group            4.1503  2  0.1255346    
## fungicide             1.9378  1  0.1639072    
## inoculate            13.5467  1  0.0002327 ***
## inoculate_round      31.4479  2  1.483e-07 ***
## time_group:fungicide 19.1116  2  7.079e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(f10)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: Gamma  ( log )
## Formula: logspores ~ time_group * fungicide + inoculate + inoculate_round +  
##     (1 | bee_id)
##    Data: qpcr
## 
##      AIC      BIC   logLik deviance df.resid 
##   1686.8   1741.6   -832.4   1664.8     1067 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.5267 -0.4995 -0.2416  0.0070  5.5692 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  bee_id   (Intercept) 0.00501  0.07078 
##  Residual             0.05020  0.22406 
## Number of obs: 1078, groups:  bee_id, 85
## 
## Fixed effects:
##                           Estimate Std. Error t value Pr(>|z|)    
## (Intercept)                0.93643    0.02634  35.548  < 2e-16 ***
## time_group2               -0.07806    0.02097  -3.722 0.000197 ***
## time_group3               -0.08184    0.02118  -3.864 0.000111 ***
## fungicideTRUE             -0.03824    0.03226  -1.185 0.235854    
## inoculateTRUE              0.12040    0.03271   3.681 0.000233 ***
## inoculate_round2           0.02122    0.03164   0.671 0.502515    
## inoculate_round3           0.21184    0.03809   5.561 2.68e-08 ***
## time_group2:fungicideTRUE  0.12279    0.02981   4.120 3.79e-05 ***
## time_group3:fungicideTRUE  0.10416    0.03023   3.446 0.000570 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) tm_gr2 tm_gr3 fnTRUE inTRUE incl_2 incl_3 t_2:TR
## time_group2 -0.433                                                 
## time_group3 -0.421  0.535                                          
## fungicdTRUE -0.606  0.345  0.336                                   
## inocultTRUE -0.248  0.011  0.006 -0.006                            
## inoclt_rnd2 -0.322 -0.008  0.002 -0.070 -0.029                     
## inoclt_rnd3 -0.390  0.054  0.036  0.093 -0.010  0.247              
## tm_gr2:TRUE  0.293 -0.702 -0.376 -0.482 -0.018  0.010  0.000       
## tm_gr3:TRUE  0.280 -0.373 -0.699 -0.472 -0.009  0.010  0.015  0.537
f10.emm <- emmeans(f10, pairwise ~ fungicide*time_group, type = "response")
f10.emm
## $emmeans
##  fungicide time_group response     SE  df asymp.LCL asymp.UCL
##  FALSE     1              2.93 0.0737 Inf      2.79      3.08
##  TRUE      1              2.82 0.0727 Inf      2.68      2.96
##  FALSE     2              2.71 0.0678 Inf      2.58      2.84
##  TRUE      2              2.95 0.0758 Inf      2.80      3.10
##  FALSE     3              2.70 0.0680 Inf      2.57      2.83
##  TRUE      3              2.88 0.0753 Inf      2.74      3.03
## 
## Results are averaged over the levels of: inoculate, inoculate_round 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## 
## $contrasts
##  contrast                              ratio     SE  df null z.ratio p.value
##  FALSE time_group1 / TRUE time_group1  1.039 0.0335 Inf    1   1.185  0.8440
##  FALSE time_group1 / FALSE time_group2 1.081 0.0227 Inf    1   3.722  0.0027
##  FALSE time_group1 / TRUE time_group2  0.994 0.0319 Inf    1  -0.202  1.0000
##  FALSE time_group1 / FALSE time_group3 1.085 0.0230 Inf    1   3.864  0.0016
##  FALSE time_group1 / TRUE time_group3  1.016 0.0329 Inf    1   0.492  0.9965
##  TRUE time_group1 / FALSE time_group2  1.041 0.0331 Inf    1   1.250  0.8119
##  TRUE time_group1 / TRUE time_group2   0.956 0.0203 Inf    1  -2.107  0.2836
##  TRUE time_group1 / FALSE time_group3  1.045 0.0335 Inf    1   1.358  0.7520
##  TRUE time_group1 / TRUE time_group3   0.978 0.0211 Inf    1  -1.033  0.9071
##  FALSE time_group2 / TRUE time_group2  0.919 0.0291 Inf    1  -2.670  0.0813
##  FALSE time_group2 / FALSE time_group3 1.004 0.0204 Inf    1   0.186  1.0000
##  FALSE time_group2 / TRUE time_group3  0.940 0.0300 Inf    1  -1.947  0.3734
##  TRUE time_group2 / FALSE time_group3  1.092 0.0349 Inf    1   2.766  0.0630
##  TRUE time_group2 / TRUE time_group3   1.023 0.0210 Inf    1   1.091  0.8851
##  FALSE time_group3 / TRUE time_group3  0.936 0.0301 Inf    1  -2.049  0.3147
## 
## Results are averaged over the levels of: inoculate, inoculate_round 
## P value adjustment: tukey method for comparing a family of 6 estimates 
## Tests are performed on the log scale
workcld10 <- cld(object = f10.emm,
               adjust = "Tukey",
               alpha = 0.05,
               Letters = letters)

workcld10
##  fungicide time_group response     SE  df asymp.LCL asymp.UCL .group
##  FALSE     3              2.70 0.0680 Inf      2.52      2.88  a    
##  FALSE     2              2.71 0.0678 Inf      2.54      2.89  a    
##  TRUE      1              2.82 0.0727 Inf      2.63      3.02  ab   
##  TRUE      3              2.88 0.0753 Inf      2.69      3.09  ab   
##  FALSE     1              2.93 0.0737 Inf      2.74      3.13   b   
##  TRUE      2              2.95 0.0758 Inf      2.75      3.15  ab   
## 
## Results are averaged over the levels of: inoculate, inoculate_round 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 6 estimates 
## Intervals are back-transformed from the log scale 
## P value adjustment: tukey method for comparing a family of 6 estimates 
## Tests are performed on the log scale 
## significance level used: alpha = 0.05 
## NOTE: If two or more means share the same grouping symbol,
##       then we cannot show them to be different.
##       But we also did not show them to be the same.
f10.in <- emmeans(f10, pairwise ~ inoculate, type = "response")
f10.in$contrasts
##  contrast     ratio    SE  df null z.ratio p.value
##  FALSE / TRUE 0.887 0.029 Inf    1  -3.681  0.0002
## 
## Results are averaged over the levels of: time_group, fungicide, inoculate_round 
## Tests are performed on the log scale
f10.in
## $emmeans
##  inoculate response     SE  df asymp.LCL asymp.UCL
##  FALSE         2.66 0.0449 Inf      2.58      2.75
##   TRUE         3.00 0.0897 Inf      2.83      3.19
## 
## Results are averaged over the levels of: time_group, fungicide, inoculate_round 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## 
## $contrasts
##  contrast     ratio    SE  df null z.ratio p.value
##  FALSE / TRUE 0.887 0.029 Inf    1  -3.681  0.0002
## 
## Results are averaged over the levels of: time_group, fungicide, inoculate_round 
## Tests are performed on the log scale
workcldin <- cld(object = f10.in,
               adjust = "none",
               alpha = 0.05,
               Letters = letters)

workcldin
##  inoculate response     SE  df asymp.LCL asymp.UCL .group
##  FALSE         2.66 0.0449 Inf      2.58      2.75  a    
##   TRUE         3.00 0.0897 Inf      2.83      3.19   b   
## 
## Results are averaged over the levels of: time_group, fungicide, inoculate_round 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale 
## Tests are performed on the log scale 
## significance level used: alpha = 0.05 
## NOTE: If two or more means share the same grouping symbol,
##       then we cannot show them to be different.
##       But we also did not show them to be the same.
# Create various summaries based on different explanatory variables for later modeling 

infec_sum1 <- qpcr %>%
  group_by(fungicide, time_group, inoculate) %>%
  summarise(m = mean(logspores),
            n = length(logspores),
            sd = sd(logspores)) %>%
  mutate(se = sd/sqrt(n))
infec_sum1
## # A tibble: 12 × 7
## # Groups:   fungicide, time_group [6]
##    fungicide time_group inoculate     m     n    sd     se
##    <fct>     <fct>      <lgl>     <dbl> <int> <dbl>  <dbl>
##  1 FALSE     1          FALSE      2.74   133 0.875 0.0759
##  2 FALSE     1          TRUE       3.01    36 0.932 0.155 
##  3 FALSE     2          FALSE      2.43   156 0.480 0.0384
##  4 FALSE     2          TRUE       2.92    38 0.739 0.120 
##  5 FALSE     3          FALSE      2.45   147 0.458 0.0378
##  6 FALSE     3          TRUE       2.95    38 0.717 0.116 
##  7 TRUE      1          FALSE      2.58   128 0.707 0.0625
##  8 TRUE      1          TRUE       2.74    35 0.869 0.147 
##  9 TRUE      2          FALSE      2.62   147 0.707 0.0583
## 10 TRUE      2          TRUE       2.95    43 0.749 0.114 
## 11 TRUE      3          FALSE      2.58   139 0.602 0.0511
## 12 TRUE      3          TRUE       2.82    38 0.742 0.120
infec_sum2 <- qpcr %>%
  group_by(fungicide, time_group) %>%
  summarise(m = mean(spores_assumed),
            n = length(spores_assumed),
            sd = sd(spores_assumed)) %>%
  mutate(se = sd/sqrt(n))
infec_sum2
## # A tibble: 6 × 6
## # Groups:   fungicide [2]
##   fungicide time_group     m     n    sd    se
##   <fct>     <fct>      <dbl> <int> <dbl> <dbl>
## 1 FALSE     1          18.8    169  46.3  3.56
## 2 FALSE     2           6.84   194  25.9  1.86
## 3 FALSE     3           6.36   185  19.0  1.40
## 4 TRUE      1          13.0    163  46.0  3.60
## 5 TRUE      2          13.2    190  40.3  2.92
## 6 TRUE      3           8.79   177  22.3  1.68
infec_sum4 <- qpcr %>%
  group_by(inoculate, time_group) %>%
  summarise(m = mean(spores_assumed),
            n = length(spores_assumed),
            sd = sd(spores_assumed)) %>%
  mutate(se = sd/sqrt(n))
infec_sum4
## # A tibble: 6 × 6
## # Groups:   inoculate [2]
##   inoculate time_group     m     n    sd    se
##   <lgl>     <fct>      <dbl> <int> <dbl> <dbl>
## 1 FALSE     1          14.3    261  44.3  2.74
## 2 FALSE     2           8.14   303  34.1  1.96
## 3 FALSE     3           5.70   286  19.2  1.13
## 4 TRUE      1          22.0     71  52.4  6.22
## 5 TRUE      2          16.8     81  32.5  3.61
## 6 TRUE      3          14.5     76  24.6  2.82
infec_sum7 <- qpcr %>%
  group_by(inoculate) %>%
  summarise(m = mean(spores_assumed),
            n = length(spores_assumed),
            sd = sd(spores_assumed),
            mean_maxinf = mean(max(spores_assumed))) %>%
  mutate(se = sd/sqrt(n))
infec_sum7
## # A tibble: 2 × 6
##   inoculate     m     n    sd mean_maxinf    se
##   <lgl>     <dbl> <int> <dbl>       <dbl> <dbl>
## 1 FALSE      9.23   850  33.9         362  1.16
## 2 TRUE      17.6    228  37.8         277  2.50
infec_sum8 <- qpcr %>%
  group_by(inoculate_round) %>%
  summarise(m = mean(spores_assumed),
            n = length(spores_assumed),
            sd = sd(spores_assumed),
            mean_maxinf = mean(max(spores_assumed))) %>%
  mutate(se = sd/sqrt(n))
infec_sum8
## # A tibble: 3 × 6
##   inoculate_round     m     n    sd mean_maxinf    se
##   <fct>           <dbl> <int> <dbl>       <dbl> <dbl>
## 1 1                6.99   657  26.5         355  1.03
## 2 2               10.6    275  34.4         325  2.08
## 3 3               29.9    146  56.7         362  4.69

Plot infection levels per time period

# Combine workcld with infec_sum based on matching columns
infec_sum_3 <- merge(infec_sum2, workcld10[, c("fungicide", "time_group", ".group")],
                   by = c("fungicide", "time_group"), all.x = TRUE)


# Create the plot with annotations
ggplot(infec_sum_3, aes(x = time_group, y = m, fill = fungicide)) +
   geom_col_pattern(
    aes(pattern = fungicide),
    pattern_spacing = 0.03,
    position = position_dodge(0.9)
  ) +
  coord_cartesian(ylim = c(0,28)) +
  geom_errorbar(aes(ymin = m - se, ymax = m + se), 
                position = position_dodge(width = 0.9), width = 0.25) +
  geom_text(aes(label = .group, y = m + se + 1), 
            position = position_dodge(width = 0.9), 
            size = 5, 
            hjust = .5) + 
scale_fill_manual(values = c("orange", "orange4"),
                    labels = c("FALSE" = "Crithidia", "TRUE" = "Fungicide + Crithidia")) +
  scale_pattern_manual(values = c("none", "stripe"), guide = "none") +  
    scale_x_discrete(
    labels = c("1" = "Days 0-4", "2" = "Days 5-9", "3" = "Days 0-14")
  ) +
  labs(fill = NULL,  
       y = "Cells/µl",     
       x = "") +  
  theme_cowplot()+
  theme(
    plot.title = element_text(size = 20, face = "bold"),  # Title size
    axis.title = element_text(size = 20),               # Axis titles
    axis.text = element_text(size = 20),                # Axis text
    legend.title = element_text(size = 20),             # Legend title
    legend.text = element_text(size = 20)               # Legend text
  ) +
  theme(legend.position = "right") +
annotate(
    geom = "text",
    x = 0.8,
    y = 27,
    label = "P < 0.01",
    size = 8
  )

Microcolony health metrics

Males

Input data

drones <- read_csv("drones.csv")
drones$treatment <- as.factor(drones$treatment)
drones$block <- as.factor(drones$block)
drones$colony <- as.factor(drones$colony)
drones$id <- as.factor(drones$id)
drones$abdomen_post_ee <- as.numeric(drones$abdomen_post_ee)
drones$fungicide <- as.factor(drones$fungicide)
drones$crithidia <- as.factor(drones$crithidia)
brood <- read_csv("brood.csv")

Males Emerge Days

em.mod <- glmer.nb(emerge ~ fungicide + crithidia + dry_weight + workers_alive + block + (1|colony), data = drones)
## Warning in theta.ml(Y, mu, weights = object@resp$weights, limit = limit, :
## iteration limit reached
summary(em.mod)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: Negative Binomial(10448843)  ( log )
## Formula: emerge ~ fungicide + crithidia + dry_weight + workers_alive +  
##     block + (1 | colony)
##    Data: drones
## 
##      AIC      BIC   logLik deviance df.resid 
##   1605.0   1655.9   -788.5   1577.0      266 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -1.04860 -0.32634 -0.00853  0.30446  1.40901 
## 
## Random effects:
##  Groups Name        Variance  Std.Dev. 
##  colony (Intercept) 4.351e-11 6.596e-06
## Number of obs: 280, groups:  colony, 25
## 
## Fixed effects:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    3.83790    0.06803  56.414   <2e-16 ***
## fungicideTRUE  0.02757    0.02192   1.258   0.2085    
## crithidiaTRUE -0.01327    0.02227  -0.596   0.5513    
## dry_weight    -1.19294    0.08964 -13.308   <2e-16 ***
## workers_alive -0.02433    0.01268  -1.918   0.0551 .  
## block4        -0.07057    0.04429  -1.593   0.1111    
## block7        -0.05654    0.05191  -1.089   0.2760    
## block8        -0.07821    0.05244  -1.492   0.1358    
## block9        -0.05487    0.04895  -1.121   0.2623    
## block10       -0.08649    0.04289  -2.017   0.0437 *  
## block11       -0.05048    0.06536  -0.772   0.4400    
## block12       -0.09124    0.05154  -1.770   0.0767 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) fnTRUE crTRUE dry_wg wrkrs_ block4 block7 block8 block9
## fungicdTRUE -0.395                                                        
## crithidTRUE -0.340  0.061                                                 
## dry_weight   0.031 -0.017 -0.036                                          
## workers_alv -0.771  0.271  0.124 -0.098                                   
## block4      -0.241 -0.064  0.072  0.037 -0.333                            
## block7      -0.443  0.179  0.129  0.017 -0.052  0.662                     
## block8      -0.288 -0.062  0.245  0.016 -0.240  0.725  0.593              
## block9      -0.405  0.090  0.130  0.003 -0.093  0.687  0.611  0.616       
## block10     -0.544  0.058  0.138 -0.014  0.032  0.729  0.667  0.660  0.676
## block11     -0.361  0.176  0.224  0.015 -0.087  0.563  0.522  0.523  0.519
## block12     -0.528  0.167  0.324 -0.015  0.019  0.646  0.617  0.618  0.616
##             blck10 blck11
## fungicdTRUE              
## crithidTRUE              
## dry_weight               
## workers_alv              
## block4                   
## block7                   
## block8                   
## block9                   
## block10                  
## block11      0.554       
## block12      0.680  0.543
## optimizer (Nelder_Mead) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
drop1(em.mod, test = "Chisq")
## Single term deletions
## 
## Model:
## emerge ~ fungicide + crithidia + dry_weight + workers_alive + 
##     block + (1 | colony)
##               npar    AIC    LRT Pr(Chi)
## <none>             1605.0               
## fungicide        1 1604.5 1.4509  0.2284
## crithidia        1 1603.4 0.3331  0.5639
## dry_weight       1 1603.7 0.6426  0.4228
## workers_alive    1 1605.4 2.3678  0.1239
## block            7 1595.2 4.1697  0.7600
em1 <- update(em.mod, .~. -block)
drop1(em1, test = "Chisq")
## Single term deletions
## 
## Model:
## emerge ~ fungicide + crithidia + dry_weight + workers_alive + 
##     (1 | colony)
##               npar    AIC    LRT Pr(Chi)  
## <none>             1595.2                 
## fungicide        1 1595.0 1.8500 0.17378  
## crithidia        1 1593.2 0.0121 0.91234  
## dry_weight       1 1595.1 1.9003 0.16805  
## workers_alive    1 1596.5 3.2603 0.07097 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
em2 <- update(em1, .~. -dry_weight)
drop1(em2, test = "Chisq")
## Single term deletions
## 
## Model:
## emerge ~ fungicide + crithidia + workers_alive + (1 | colony)
##               npar    AIC    LRT Pr(Chi)  
## <none>             1595.1                 
## fungicide        1 1595.0 1.8874 0.16950  
## crithidia        1 1593.2 0.0613 0.80443  
## workers_alive    1 1597.0 3.9384 0.04719 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(em2)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: emerge
##                Chisq Df Pr(>Chisq)   
## fungicide     2.1344  1   0.144024   
## crithidia     0.0688  1   0.793044   
## workers_alive 7.2682  1   0.007019 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(em2)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: emerge
##                Chisq Df Pr(>Chisq)   
## fungicide     2.1344  1   0.144024   
## crithidia     0.0688  1   0.793044   
## workers_alive 7.2682  1   0.007019 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(em2)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: Negative Binomial(10448843)  ( log )
## Formula: emerge ~ fungicide + crithidia + workers_alive + (1 | colony)
##    Data: drones
## 
##      AIC      BIC   logLik deviance df.resid 
##   1595.1   1616.9   -791.5   1583.1      274 
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -0.88827 -0.34661 -0.06238  0.25737  1.88253 
## 
## Random effects:
##  Groups Name        Variance Std.Dev. 
##  colony (Intercept) 3.19e-10 1.786e-05
## Number of obs: 280, groups:  colony, 25
## 
## Fixed effects:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    3.717327   0.041214  90.195  < 2e-16 ***
## fungicideTRUE  0.027696   0.018958   1.461  0.14402    
## crithidiaTRUE -0.005003   0.019069  -0.262  0.79304    
## workers_alive -0.023682   0.008784  -2.696  0.00702 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) fnTRUE crTRUE
## fungicdTRUE -0.258              
## crithidTRUE -0.223 -0.053       
## workers_alv -0.938  0.082  0.058
## optimizer (Nelder_Mead) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
em_sum <- drones %>%
  group_by(treatment) %>%
  summarise(m = mean(emerge),
            sd = sd(emerge),
            n = length(emerge)) %>%
  mutate(se = sd/sqrt(n))

em_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          37.0  2.41   102 0.238
## 2 2          38.1  2.53    68 0.307
## 3 3          38.4  4.08    49 0.583
## 4 4          36.7  2.54    61 0.325
em_sum$plot <- em_sum$m + em_sum$se

Males relative fat

hist(drones$relative_fat)

range(drones$relative_fat)
## [1] -0.000150305  0.003399280
shapiro.test(drones$relative_fat)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$relative_fat
## W = 0.97859, p-value = 0.0003281
drones$sqrt_rf <- (sqrt(drones$relative_fat))
## Warning in sqrt(drones$relative_fat): NaNs produced
drones$logrf <- log(drones$relative_fat)
## Warning in log(drones$relative_fat): NaNs produced
shapiro.test(drones$logrf)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$logrf
## W = 0.94405, p-value = 9.012e-09
shapiro.test(drones$sqrt_rf)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$sqrt_rf
## W = 0.99049, p-value = 0.06877
rf.mod <- lmer(sqrt_rf ~ fungicide + crithidia + workers_alive + block + (1|colony), data = drones)
drop1(rf.mod, test = "Chisq")
## Single term deletions
## 
## Model:
## sqrt_rf ~ fungicide + crithidia + workers_alive + block + (1 | 
##     colony)
##               npar     AIC     LRT   Pr(Chi)    
## <none>             -2019.2                      
## fungicide        1 -2017.6  3.5558 0.0593382 .  
## crithidia        1 -2017.8  3.3635 0.0666578 .  
## workers_alive    1 -2021.2  0.0041 0.9486992    
## block            7 -2007.6 25.5725 0.0006004 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf2 <- update(rf.mod, .~. -workers_alive)
drop1(rf2, test = "Chisq")
## Single term deletions
## 
## Model:
## sqrt_rf ~ fungicide + crithidia + block + (1 | colony)
##           npar     AIC     LRT  Pr(Chi)    
## <none>         -2021.2                     
## fungicide    1 -2019.2  4.0103 0.045222 *  
## crithidia    1 -2019.6  3.5526 0.059451 .  
## block        7 -2008.8 26.3561 0.000435 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(rf2)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: sqrt_rf
##             Chisq Df Pr(>Chisq)    
## fungicide  3.1661  1  0.0751799 .  
## crithidia  2.7294  1  0.0985137 .  
## block     26.4613  7  0.0004165 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf_sum <- drones %>%
  group_by(treatment) %>%
  summarise(m = mean(relative_fat),
            sd = sd(relative_fat),
            n = length(relative_fat)) %>%
  mutate(se = sd/sqrt(n))
  
rf_sum
## # A tibble: 4 × 5
##   treatment       m       sd     n        se
##   <fct>       <dbl>    <dbl> <int>     <dbl>
## 1 1         0.00112 0.000482   102 0.0000477
## 2 2         0.00111 0.000408    68 0.0000495
## 3 3         0.00129 0.000508    49 0.0000725
## 4 4         0.00127 0.000435    61 0.0000557

Males radial cell

hist(drones$radial_um)

shapiro.test(drones$radial_um)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$radial_um
## W = 0.97721, p-value = 0.0001896
range(drones$radial_um)
## [1] 2073.526 3083.439
drones$cuberc <- (drones$radial_um)^3
shapiro.test(drones$cuberc)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$cuberc
## W = 0.99255, p-value = 0.1738
hist(drones$cuberc)

rc_mod <- lmer(cuberc ~ fungicide + crithidia + block + workers_alive + (1|colony), data = drones)
drop1(rc_mod, test = "Chisq")
## Single term deletions
## 
## Model:
## cuberc ~ fungicide + crithidia + block + workers_alive + (1 | 
##     colony)
##               npar   AIC    LRT  Pr(Chi)   
## <none>             13130                   
## fungicide        1 13136 7.6994 0.005524 **
## crithidia        1 13130 1.9668 0.160792   
## block            7 13126 9.6578 0.208808   
## workers_alive    1 13129 0.8686 0.351356   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rc2 <- update(rc_mod, .~. -workers_alive)
drop1(rc2, test = "Chisq")
## Single term deletions
## 
## Model:
## cuberc ~ fungicide + crithidia + block + (1 | colony)
##           npar   AIC     LRT Pr(Chi)   
## <none>         13129                   
## fungicide    1 13137 10.3573 0.00129 **
## crithidia    1 13128  1.4461 0.22916   
## block        7 13126 11.0296 0.13733   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rc3 <- update(rc2, .~. -block)
Anova(rc3)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: cuberc
##            Chisq Df Pr(>Chisq)  
## fungicide 4.9350  1    0.02632 *
## crithidia 0.3472  1    0.55568  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rc_sum <- drones %>%
  group_by(treatment) %>%
  summarise(m = mean(radial_um),
            sd = sd(radial_um),
            n = length(radial_um)) %>%
  mutate(se = sd/sqrt(n))

rc_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1         2690.  188.   102  18.6
## 2 2         2664.  174.    68  21.1
## 3 3         2660.  173.    49  24.7
## 4 4         2749.  135.    61  17.3
rc_sum$plot <- rc_sum$m + rc_sum$se
rc_sum
## # A tibble: 4 × 6
##   treatment     m    sd     n    se  plot
##   <fct>     <dbl> <dbl> <int> <dbl> <dbl>
## 1 1         2690.  188.   102  18.6 2708.
## 2 2         2664.  174.    68  21.1 2685.
## 3 3         2660.  173.    49  24.7 2685.
## 4 4         2749.  135.    61  17.3 2766.
rc_plot <- ggplot(rc_sum, aes(x = treatment, y = m, fill = treatment)) +
  geom_bar(stat = "identity", color = "black") +
  geom_col_pattern(
    aes(pattern = treatment),
    pattern_density = c(0, 0, 0.4, 0),  # Add density for the fourth column
    pattern_spacing = 0.03,
    position = position_dodge(0.9)
  ) +
  scale_fill_viridis_d() +
  geom_errorbar(aes(ymin = m - se, ymax = m + se), width = 0.2, position = position_dodge(0.9)) +
  labs(x = "Treatment", y = "Radial cell length (um)") +
  theme_classic(base_size = 20) +
  coord_cartesian(ylim=c(2600, 2800)) +
  annotate(geom = "text", 
           x = 1, y = 2745,
           label = "P = 0.02",
           size = 8) +
  theme(legend.position = "none",
        axis.text = element_text(size = 20),  # Set axis label font size
        axis.title = element_text(size = 20)) +  # Set axis title font size
  theme(text = element_text(size = 20)) +
  scale_fill_manual(values = c("darkorchid4", "dodgerblue", "orange4", "orange")) +
  scale_pattern_manual(values = c("none", "none", "stripe", "none")) +  # Add stripes to the fourth column
  scale_x_discrete(labels = custom_labels) +
  theme(legend.position = "none") +
  geom_segment(x = 2, xend = 3, y = 2710, yend = 2710, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 2, xend = 2, y = 2700, yend = 2720, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 3, y = 2700, yend = 2720, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 1, xend = 4, y = 2790, yend = 2790, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 1, xend = 1, y = 2780, yend = 2800, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 4, xend = 4, y = 2780, yend = 2800, 
               lineend = "round", linejoin = "round") +
  geom_text(x = 2.5, y = 2712, label = "b", size = 6, vjust = -0.5) +
  geom_text(x = 2.5, y = 2792, label = "a", size = 6, vjust = -0.5)

rc_plot

Total count of males

brood <- read_csv("brood.csv")

brood <- read_csv("brood.csv")
brood$colony <- as.factor(brood$colony)
brood$treatment <- as.factor(brood$treatment)
brood$block <- as.factor(brood$block)
brood$fungicide <- as.logical(brood$fungicide)
brood$crithidia <- as.logical(brood$crithidia)

male_count <- glm.nb(total_drones ~ fungicide + crithidia + block + workers_alive, data = brood)
## Warning in glm.nb(total_drones ~ fungicide + crithidia + block + workers_alive,
## : alternation limit reached
drop1(male_count, test = "Chisq")
## Single term deletions
## 
## Model:
## total_drones ~ fungicide + crithidia + block + workers_alive
##               Df Deviance    AIC    LRT  Pr(>Chi)    
## <none>             42.183 190.34                     
## fungicide      1   42.673 188.83  0.490    0.4840    
## crithidia      1   42.767 188.93  0.584    0.4446    
## block          8   94.592 226.75 52.408 1.404e-08 ***
## workers_alive  1   72.919 219.08 30.736 2.957e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(male_count)
## Analysis of Deviance Table (Type II tests)
## 
## Response: total_drones
##               LR Chisq Df Pr(>Chisq)    
## fungicide        0.490  1     0.4840    
## crithidia        0.584  1     0.4446    
## block           52.408  8  1.404e-08 ***
## workers_alive   30.736  1  2.957e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(male_count)
## 
## Call:
## glm.nb(formula = total_drones ~ fungicide + crithidia + block + 
##     workers_alive, data = brood, init.theta = 6.826554202, link = log)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -6.452e-01  6.069e-01  -1.063 0.287785    
## fungicideTRUE -1.500e-01  2.099e-01  -0.714 0.475035    
## crithidiaTRUE -1.671e-01  2.126e-01  -0.786 0.431855    
## block4         9.474e-01  4.131e-01   2.294 0.021808 *  
## block6        -3.766e+01  3.355e+07   0.000 0.999999    
## block7         5.753e-01  4.511e-01   1.275 0.202200    
## block8         2.564e-01  4.383e-01   0.585 0.558634    
## block9         1.972e-01  4.331e-01   0.455 0.648894    
## block10        1.442e+00  4.027e-01   3.581 0.000342 ***
## block11       -2.076e-01  5.231e-01  -0.397 0.691532    
## block12        8.826e-01  4.625e-01   1.908 0.056345 .  
## workers_alive  5.700e-01  1.086e-01   5.247 1.55e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(6.8266) family taken to be 1)
## 
##     Null deviance: 172.432  on 35  degrees of freedom
## Residual deviance:  42.183  on 24  degrees of freedom
## AIC: 192.34
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  6.83 
##           Std. Err.:  3.60 
## Warning while fitting theta: alternation limit reached 
## 
##  2 x log-likelihood:  -166.341
m0 <- glmmTMB(total_drones ~ fungicide + crithidia + block + workers_alive, data = brood)
Anova(m0)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: total_drones
##                 Chisq Df Pr(>Chisq)    
## fungicide      2.7355  1    0.09814 .  
## crithidia      0.3672  1    0.54456    
## block         58.4296  8  9.465e-10 ***
## workers_alive 18.9357  1  1.352e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mc_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(total_drones),
            n = length(total_drones),
            sd = sd(total_drones)) %>%
  mutate(se = sd/sqrt(n))

mc_sum
## # A tibble: 4 × 5
##   treatment     m     n    sd    se
##   <fct>     <dbl> <int> <dbl> <dbl>
## 1 1         11.3      9  7.84  2.61
## 2 2          7.67     9  7.37  2.46
## 3 3          5.44     9  8.16  2.72
## 4 4          6.89     9  7.18  2.39

Male dry weight

hist(drones$dry_weight)

shapiro.test(drones$dry_weight)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$dry_weight
## W = 0.99166, p-value = 0.1147
range(drones$dry_weight)
## [1] 0.0166 0.0541
drones$log.dry_weight <- log((drones$dry_weight))
shapiro.test(drones$log.dry_weight)
## 
##  Shapiro-Wilk normality test
## 
## data:  drones$log.dry_weight
## W = 0.95647, p-value = 2.014e-07
hist(drones$log.dry_weight)

mdw <- lmer(dry_weight ~ fungicide + crithidia + block + workers_alive + (1|colony), data = drones )
drop1(mdw, test = "Chisq")
## Single term deletions
## 
## Model:
## dry_weight ~ fungicide + crithidia + block + workers_alive + 
##     (1 | colony)
##               npar     AIC     LRT  Pr(Chi)   
## <none>             -1993.7                    
## fungicide        1 -1995.2  0.5266 0.468026   
## crithidia        1 -1990.1  5.6389 0.017566 * 
## block            7 -1987.5 20.2244 0.005105 **
## workers_alive    1 -1991.7  3.9608 0.046570 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(mdw)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: dry_weight
##                 Chisq Df Pr(>Chisq)  
## fungicide      0.6628  1    0.41559  
## crithidia      3.1104  1    0.07779 .
## block         17.0762  7    0.01691 *
## workers_alive  2.8255  1    0.09278 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
qqnorm(resid(mdw));qqline(resid(mdw))

male_dw <- drones %>%
  group_by(treatment) %>%
  summarise(m = mean(dry_weight),
            sd = sd(dry_weight),
            n = length(dry_weight)) %>%
  mutate(se = sd/sqrt(n))
male_dw
## # A tibble: 4 × 5
##   treatment      m      sd     n       se
##   <fct>      <dbl>   <dbl> <int>    <dbl>
## 1 1         0.0373 0.00752   102 0.000745
## 2 2         0.0376 0.00658    68 0.000798
## 3 3         0.0378 0.00706    49 0.00101 
## 4 4         0.0393 0.00668    61 0.000855

Worker dry weights

workers <- na.omit(workers)

workers <- read_csv("workers.csv")
workers$colony <- as.factor(workers$colony)
workers$treatment <- as.factor(workers$treatment)
workers$block <- as.factor(workers$block)
workers$qro <- as.factor(workers$qro)
workers$inoculate <- as.logical(workers$inoculate)
workers$dry <- as.double(workers$dry)
## Warning: NAs introduced by coercion
hist(workers$dry)

shapiro.test(workers$dry)
## 
##  Shapiro-Wilk normality test
## 
## data:  workers$dry
## W = 0.96135, p-value = 3.197e-05
workers$logdry <- log(workers$dry)
shapiro.test(workers$logdry)
## 
##  Shapiro-Wilk normality test
## 
## data:  workers$logdry
## W = 0.99094, p-value = 0.2537
hist(workers$logdry)

workers$fungicide <- as.logical(workers$fungicide)
workers$crithidia <- as.logical(workers$crithidia)

wrkdry1 <- lmer(logdry ~ fungicide*crithidia + inoculate +block + (1|colony), data = workers)
drop1(wrkdry1, test = "Chisq")
## Single term deletions
## 
## Model:
## logdry ~ fungicide * crithidia + inoculate + block + (1 | colony)
##                     npar     AIC     LRT   Pr(Chi)    
## <none>                    93.353                      
## inoculate              1  91.391  0.0373 0.8468608    
## block                  9 104.116 28.7625 0.0007106 ***
## fungicide:crithidia    1  91.794  0.4412 0.5065339    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
wrkdry <- lmer(logdry ~ fungicide + crithidia + inoculate +block + (1|colony), data = workers)
drop1(wrkdry, test = "Chisq")
## Single term deletions
## 
## Model:
## logdry ~ fungicide + crithidia + inoculate + block + (1 | colony)
##           npar     AIC     LRT   Pr(Chi)    
## <none>          91.794                      
## fungicide    1  95.101  5.3065 0.0212462 *  
## crithidia    1 102.738 12.9433 0.0003211 ***
## inoculate    1  89.833  0.0381 0.8452327    
## block        9 102.295 28.5009 0.0007863 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(wrkdry1, wrkdry, test = "Chisq")
## Data: workers
## Models:
## wrkdry: logdry ~ fungicide + crithidia + inoculate + block + (1 | colony)
## wrkdry1: logdry ~ fungicide * crithidia + inoculate + block + (1 | colony)
##         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## wrkdry    15 91.794 141.04 -30.897   61.794                     
## wrkdry1   16 93.353 145.88 -30.677   61.353 0.4412  1     0.5065
Anova(wrkdry1)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: logdry
##                       Chisq Df Pr(>Chisq)    
## fungicide            3.8656  1  0.0492852 *  
## crithidia           10.4098  1  0.0012535 ** 
## inoculate            0.0413  1  0.8390495    
## block               28.4252  9  0.0008097 ***
## fungicide:crithidia  0.2749  1  0.6000361    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(wrkdry)
## Linear mixed model fit by REML ['lmerMod']
## Formula: logdry ~ fungicide + crithidia + inoculate + block + (1 | colony)
##    Data: workers
## 
## REML criterion at convergence: 104.4
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.91492 -0.56289 -0.00892  0.66798  2.04904 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  colony   (Intercept) 0.02217  0.1489  
##  Residual             0.07178  0.2679  
## Number of obs: 197, groups:  colony, 40
## 
## Fixed effects:
##                Estimate Std. Error t value
## (Intercept)   -2.781148   0.105194 -26.438
## fungicideTRUE -0.122302   0.061443  -1.990
## crithidiaTRUE -0.200682   0.061443  -3.266
## inoculateTRUE -0.009667   0.047465  -0.204
## block4         0.087618   0.135147   0.648
## block5        -0.156602   0.136922  -1.144
## block6        -0.008842   0.135923  -0.065
## block7        -0.100143   0.135922  -0.737
## block8         0.121194   0.135147   0.897
## block9        -0.386717   0.135147  -2.861
## block10       -0.126487   0.135147  -0.936
## block11       -0.378121   0.135922  -2.782
## block12       -0.156229   0.135147  -1.156
wrkdry1 <- update(wrkdry, .~. -inoculate)
drop1(wrkdry1, test = "Chisq")
## Single term deletions
## 
## Model:
## logdry ~ fungicide + crithidia + block + (1 | colony)
##           npar     AIC     LRT   Pr(Chi)    
## <none>          89.833                      
## fungicide    1  93.139  5.3061 0.0212508 *  
## crithidia    1 100.782 12.9492 0.0003201 ***
## block        9 100.343 28.5101 0.0007835 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
wm2 <- update(wrkdry1, .~. -fungicide)
drop1(wm2, test = "Chisq")
## Single term deletions
## 
## Model:
## logdry ~ crithidia + block + (1 | colony)
##           npar     AIC    LRT   Pr(Chi)    
## <none>          93.139                     
## crithidia    1 102.998 11.859 0.0005738 ***
## block        9 100.838 25.700 0.0022873 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(wrkdry, wm2, test = "Chisq")
## Data: workers
## Models:
## wm2: logdry ~ crithidia + block + (1 | colony)
## wrkdry: logdry ~ fungicide + crithidia + inoculate + block + (1 | colony)
##        npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
## wm2      13 93.139 135.82 -33.569   67.139                       
## wrkdry   15 91.794 141.04 -30.897   61.794 5.3442  2    0.06911 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(wrkdry1)
## Linear mixed model fit by REML ['lmerMod']
## Formula: logdry ~ fungicide + crithidia + block + (1 | colony)
##    Data: workers
## 
## REML criterion at convergence: 100.1
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.91419 -0.57743 -0.00892  0.67578  2.02348 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  colony   (Intercept) 0.02225  0.1492  
##  Residual             0.07134  0.2671  
## Number of obs: 197, groups:  colony, 40
## 
## Fixed effects:
##               Estimate Std. Error t value
## (Intercept)   -2.78308    0.10475 -26.568
## fungicideTRUE -0.12228    0.06144  -1.990
## crithidiaTRUE -0.20072    0.06144  -3.267
## block4         0.08762    0.13513   0.648
## block5        -0.15659    0.13691  -1.144
## block6        -0.00897    0.13590  -0.066
## block7        -0.10021    0.13590  -0.737
## block8         0.12119    0.13513   0.897
## block9        -0.38672    0.13513  -2.862
## block10       -0.12649    0.13513  -0.936
## block11       -0.37822    0.13590  -2.783
## block12       -0.15623    0.13513  -1.156
## 
## Correlation of Fixed Effects:
##             (Intr) fnTRUE crTRUE block4 block5 block6 block7 block8 block9
## fungicdTRUE -0.286                                                        
## crithidTRUE -0.286 -0.023                                                 
## block4      -0.645  0.000  0.000                                          
## block5      -0.637  0.115 -0.115  0.494                                   
## block6      -0.641 -0.005  0.005  0.497  0.490                            
## block7      -0.638 -0.005 -0.005  0.497  0.491  0.494                     
## block8      -0.645  0.000  0.000  0.500  0.494  0.497  0.497              
## block9      -0.645  0.000  0.000  0.500  0.494  0.497  0.497  0.500       
## block10     -0.645  0.000  0.000  0.500  0.494  0.497  0.497  0.500  0.500
## block11     -0.644  0.005  0.005  0.497  0.491  0.494  0.494  0.497  0.497
## block12     -0.645  0.000  0.000  0.500  0.494  0.497  0.497  0.500  0.500
##             blck10 blck11
## fungicdTRUE              
## crithidTRUE              
## block4                   
## block5                   
## block6                   
## block7                   
## block8                   
## block9                   
## block10                  
## block11      0.497       
## block12      0.500  0.497
Anova(wrkdry1)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: logdry
##             Chisq Df Pr(>Chisq)    
## fungicide  3.9617  1  0.0465471 *  
## crithidia 10.6738  1  0.0010866 ** 
## block     29.1364  9  0.0006146 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
qqnorm(resid(wrkdry1));qqline(resid(wrkdry1))

pe <- emmeans(wrkdry1, pairwise ~ crithidia, type = "response")
pe
## $emmeans
##  crithidia emmean     SE   df lower.CL upper.CL
##  FALSE      -2.95 0.0443 27.9    -3.05    -2.86
##   TRUE      -3.16 0.0421 28.1    -3.24    -3.07
## 
## Results are averaged over the levels of: fungicide, block 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast     estimate     SE df t.ratio p.value
##  FALSE - TRUE    0.201 0.0614 28   3.267  0.0029
## 
## Results are averaged over the levels of: fungicide, block 
## Degrees-of-freedom method: kenward-roger
pairs(pe)
##  contrast     estimate     SE df t.ratio p.value
##  FALSE - TRUE    0.201 0.0614 28   3.267  0.0029
## 
## Results are averaged over the levels of: fungicide, block 
## Degrees-of-freedom method: kenward-roger
pef <- emmeans(wrkdry1, pairwise ~ fungicide, type = "response")
pef
## $emmeans
##  fungicide emmean     SE   df lower.CL upper.CL
##  FALSE      -2.99 0.0421 28.1    -3.08    -2.91
##   TRUE      -3.12 0.0443 27.9    -3.21    -3.03
## 
## Results are averaged over the levels of: crithidia, block 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast     estimate     SE df t.ratio p.value
##  FALSE - TRUE    0.122 0.0614 28   1.990  0.0564
## 
## Results are averaged over the levels of: crithidia, block 
## Degrees-of-freedom method: kenward-roger
wrkdry.df <- na.omit(workers)

wrkdrysum <- wrkdry.df %>%
  group_by(treatment) %>%
  summarise(m = mean(dry),
            sd = sd(dry),
            n = length(dry)) %>%
  mutate(se = sd/sqrt(n))

wrkdrysum
## # A tibble: 4 × 5
##   treatment      m     sd     n      se
##   <fct>      <dbl>  <dbl> <int>   <dbl>
## 1 1         0.0586 0.0186    44 0.00280
## 2 2         0.0528 0.0169    45 0.00252
## 3 3         0.0418 0.0128    42 0.00198
## 4 4         0.0488 0.0184    43 0.00281
wtuk.means <- emmeans(object = wrkdry1,
                      specs = "crithidia",
                      adjust = "Tukey",
                      type = "response")

wtuk.means
##  crithidia emmean     SE   df lower.CL upper.CL
##  FALSE      -2.95 0.0443 27.9    -3.06    -2.85
##   TRUE      -3.16 0.0421 28.1    -3.25    -3.06
## 
## Results are averaged over the levels of: fungicide, block 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 2 estimates
w.cld.model <- cld(object = wtuk.means,
                   adjust = "Tukey",
                   Letters = letters,
                   alpha = 0.05)
w.cld.model
##  crithidia emmean     SE   df lower.CL upper.CL .group
##   TRUE      -3.16 0.0421 28.1    -3.25    -3.06  a    
##  FALSE      -2.95 0.0443 27.9    -3.06    -2.85   b   
## 
## Results are averaged over the levels of: fungicide, block 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 2 estimates 
## significance level used: alpha = 0.05 
## NOTE: If two or more means share the same grouping symbol,
##       then we cannot show them to be different.
##       But we also did not show them to be the same.
blockdry <- emmeans(wrkdry1, pairwise ~ block, type = "response")
blockdrymeans <- as.data.frame(blockdry$emmeans)

plot worker dry weights

work_dry <- ggplot(data = wrkdrysum, aes(x = treatment, y = m, fill = treatment)) +
  geom_col(col = "black") +
  coord_cartesian(ylim = c(0, 0.08)) +
  labs(x = "Treatment", y = "Worker Dry Weight (g)") +
  geom_col_pattern(
    aes(pattern = treatment),
    pattern_density = c(0, 0, 0.4, 0),  # Add density for the fourth column
    pattern_spacing = 0.03,
    position = position_dodge(0.9)
  ) + 
  geom_errorbar(aes(ymin = m - se, ymax = m + se), width = 0.2, position = position_dodge(0.9))  + 
  theme_classic(base_size = 20) +
  theme(legend.position = "none") +
  annotate(
    geom = "text",
    x = 4,
    y = 0.079,
    label = "P < 0.01",
    size = 7
  ) +
  theme(legend.position = "none")  +
  scale_x_discrete(labels = custom_labels) +
  scale_fill_manual(values = c("darkorchid4", "dodgerblue", "orange4", "orange")) +
  scale_pattern_manual(values = c("none", "none", "stripe", "none")) + 
  geom_segment(x = 1, xend = 2, y = 0.07, yend = 0.07, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 1, xend = 1, y = 0.07, yend = 0.069, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 2, xend = 2, y = 0.07, yend = 0.069, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 4, y = 0.06, yend = 0.06, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 3, y = 0.06, yend = 0.059, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 4, xend = 4, y = 0.06, yend = 0.059, 
               lineend = "round", linejoin = "round") +
  geom_text(x = 1.5, y = 0.071, label = "a", size = 6, vjust = -0.5) +
  geom_text(x = 3.5, y = 0.061, label = "b", size = 6, vjust = -0.5)

work_dry

Total brood cells

bcm <- glm.nb(brood_cells ~ fungicide + crithidia + workers_alive + block, data = brood)
Anova(bcm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: brood_cells
##               LR Chisq Df Pr(>Chisq)    
## fungicide        3.070  1    0.07973 .  
## crithidia        0.010  1    0.91928    
## workers_alive   92.831  1    < 2e-16 ***
## block          102.709  8    < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
b_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(brood_cells), 
            sd = sd(brood_cells),
            n = length(brood_cells)) %>%
  mutate(se = sd/sqrt(n))

b_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          30.7  23.1     9  7.71
## 2 2          29.8  21.1     9  7.04
## 3 3          21.7  24.9     9  8.30
## 4 4          23.9  26.3     9  8.77

Honey pots

hpm <- glm(honey_pots ~ fungicide + crithidia + workers_alive + block, data = brood, family = "poisson")
Anova(hpm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: honey_pots
##               LR Chisq Df Pr(>Chisq)    
## fungicide       3.5096  1  0.0610131 .  
## crithidia       1.2041  1  0.2725029    
## workers_alive   8.0172  1  0.0046336 ** 
## block          27.4941  8  0.0005806 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
hp_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(honey_pots), 
            sd = sd(honey_pots),
            n = length(honey_pots)) %>%
  mutate(se = sd/sqrt(n))

hp_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          3.33  2.5      9 0.833
## 2 2          4.11  3.02     9 1.01 
## 3 3          2.56  2.24     9 0.747
## 4 4          1.89  1.90     9 0.633

Larvae

tlm <- glm.nb(total_larvae ~ fungicide + crithidia + workers_alive + block, data = brood)
Anova(tlm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: total_larvae
##               LR Chisq Df Pr(>Chisq)    
## fungicide        0.646  1     0.4217    
## crithidia        0.037  1     0.8478    
## workers_alive   39.129  1  3.967e-10 ***
## block           66.939  8  1.994e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tl_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(total_larvae), 
            sd = sd(total_larvae),
            n = length(total_larvae)) %>%
  mutate(se = sd/sqrt(n))

tl_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          22.4  20.9     9  6.97
## 2 2          16.3  11.3     9  3.76
## 3 3          14.2  20.4     9  6.79
## 4 4          16    19.9     9  6.62
dlm <- glm.nb(dead_larvae ~ fungicide + crithidia + workers_alive, data = brood)
Anova(dlm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: dead_larvae
##               LR Chisq Df Pr(>Chisq)  
## fungicide       0.0725  1    0.78771  
## crithidia       0.3865  1    0.53413  
## workers_alive   4.4928  1    0.03404 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dl_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(dead_larvae), 
            sd = sd(dead_larvae),
            n = length(dead_larvae)) %>%
  mutate(se = sd/sqrt(n))

dl_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          1.78  2.82     9 0.940
## 2 2          1.22  2.11     9 0.703
## 3 3          1.44  1.81     9 0.603
## 4 4          1.11  1.96     9 0.655
llm <- glm.nb(live_larvae ~ fungicide + crithidia + workers_alive + block, data = brood)
Anova(llm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: live_larvae
##               LR Chisq Df Pr(>Chisq)    
## fungicide        0.516  1     0.4723    
## crithidia        0.002  1     0.9656    
## workers_alive   44.398  1  2.680e-11 ***
## block           82.510  8  1.526e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ll_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(live_larvae), 
            sd = sd(live_larvae),
            n = length(live_larvae)) %>%
  mutate(se = sd/sqrt(n))

ll_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          20.7  19.0     9  6.34
## 2 2          15.1  11.0     9  3.68
## 3 3          12.8  19.5     9  6.52
## 4 4          14.9  18.7     9  6.23
plmod <- glm(cbind(live_larvae, dead_larvae) ~ fungicide + crithidia + block + workers_alive, data = brood, family = binomial("logit"))
Anova(plmod)
## Analysis of Deviance Table (Type II tests)
## 
## Response: cbind(live_larvae, dead_larvae)
##               LR Chisq Df Pr(>Chisq)   
## fungicide       0.0179  1   0.893715   
## crithidia       0.0067  1   0.934615   
## block          24.1726  8   0.002144 **
## workers_alive   6.1501  1   0.013140 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pupae

tpm <- glm(total_pupae ~ fungicide + crithidia + workers_alive + block, data = brood, family = "poisson")
Anova(tpm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: total_pupae
##               LR Chisq Df Pr(>Chisq)    
## fungicide        0.005  1    0.94611    
## crithidia        4.885  1    0.02709 *  
## workers_alive   51.869  1  5.932e-13 ***
## block           50.394  8  3.433e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tp_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(total_pupae), 
            sd = sd(total_pupae),
            n = length(total_pupae)) %>%
  mutate(se = sd/sqrt(n))

tp_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          8.33  7.78     9  2.59
## 2 2          6     7.55     9  2.52
## 3 3          3.11  3.22     9  1.07
## 4 4          4.11  5.21     9  1.74
dpm <- glm.nb(dead_pupae ~ fungicide + crithidia + workers_alive + block, data = brood)
## Warning: glm.fit: fitted rates numerically 0 occurred
## Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace =
## control$trace > : iteration limit reached
## Warning in theta.ml(Y, mu, sum(w), w, limit = control$maxit, trace =
## control$trace > : iteration limit reached
Anova(dpm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: dead_pupae
##               LR Chisq Df Pr(>Chisq)  
## fungicide       1.9743  1    0.15999  
## crithidia       0.1183  1    0.73086  
## workers_alive   4.5035  1    0.03383 *
## block          16.8182  8    0.03206 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dp_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(dead_pupae), 
            sd = sd(dead_pupae),
            n = length(dead_pupae)) %>%
  mutate(se = sd/sqrt(n))

dp_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1         0.111 0.333     9 0.111
## 2 2         0.111 0.333     9 0.111
## 3 3         0.222 0.441     9 0.147
## 4 4         0.111 0.333     9 0.111
lpm <- glm(live_pupae ~ fungicide + crithidia + workers_alive + block, data = brood, family = "poisson")
Anova(lpm)
## Analysis of Deviance Table (Type II tests)
## 
## Response: live_pupae
##               LR Chisq Df Pr(>Chisq)    
## fungicide        0.002  1    0.96330    
## crithidia        5.386  1    0.02029 *  
## workers_alive   58.627  1  1.905e-14 ***
## block           45.223  8  3.339e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lp_sum <- brood %>%
  group_by(treatment) %>%
  summarise(m = mean(live_pupae), 
            sd = sd(live_pupae),
            n = length(live_pupae)) %>%
  mutate(se = sd/sqrt(n))

lp_sum
## # A tibble: 4 × 5
##   treatment     m    sd     n    se
##   <fct>     <dbl> <dbl> <int> <dbl>
## 1 1          8.22  7.58     9  2.53
## 2 2          5.89  7.54     9  2.51
## 3 3          2.89  3.30     9  1.10
## 4 4          4     5.17     9  1.72
ppmod <- glm(cbind(live_pupae, dead_pupae) ~ fungicide + crithidia + workers_alive, data = brood, family = binomial("logit"))
Anova(ppmod)
## Analysis of Deviance Table (Type II tests)
## 
## Response: cbind(live_pupae, dead_pupae)
##               LR Chisq Df Pr(>Chisq)  
## fungicide       0.0779  1    0.78011  
## crithidia       0.0444  1    0.83313  
## workers_alive   6.0550  1    0.01387 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot total pupae
live_pup <- ggplot(data = lp_sum, aes(x = treatment, y = m, fill = treatment)) +
  geom_col(col = "black") +
  coord_cartesian(ylim = c(0, 13)) +
  labs(x = "Treatment", y = "Live Pupae Count") +
  geom_col_pattern(
    aes(pattern = treatment),
    pattern_density = c(0, 0, 0.4, 0),  # Add density for the fourth column
    pattern_spacing = 0.03,
    position = position_dodge(0.9)
  ) + 
  geom_errorbar(aes(ymin = m - se, ymax = m + se), width = 0.2, position = position_dodge(0.9))  + 
  theme_classic(base_size = 20) +
  theme(legend.position = "none") +
  annotate(
    geom = "text",
    x = 4,
    y = 12,
    label = "P = 0.02",
    size = 7
  ) +
  theme(legend.position = "none")  +
  scale_x_discrete(labels = custom_labels) +
  scale_fill_manual(values = c("darkorchid4", "dodgerblue", "orange4", "orange")) +
  scale_pattern_manual(values = c("none", "none", "stripe", "none")) + 
  geom_segment(x = 1, xend = 2, y = 12, yend = 12, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 1, xend = 1, y = 11.7, yend = 12.3, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 2, xend = 2, y = 11.7, yend = 12.3, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 4, y = 7, yend = 7, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 3, y = 6.7, yend = 7.3, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 4, xend = 4, y = 6.7, yend = 7.3, 
               lineend = "round", linejoin = "round") +
  geom_text(x = 1.5, y = 12.1, label = "a", size = 6, vjust = -0.5) +
  geom_text(x = 3.5, y = 7.1, label = "b", size = 6, vjust = -0.5)

live_pup

tp_plot <- ggplot(data = tp_sum, aes(x = treatment, y = m, fill = treatment)) +
  geom_col(col = "black") +
  coord_cartesian(ylim = c(0, 13)) +
  scale_fill_viridis_d() +
  labs(x = "Treatment", y = "Total Pupae Count") +
  geom_col_pattern(
    aes(pattern = treatment),
    pattern_density = c(0, 0, 0.4, 0),  # Add density for the fourth column
    pattern_spacing = 0.03,
    position = position_dodge(0.9)
  ) + 
  geom_errorbar(aes(ymin = m - se, ymax = m + se), width = 0.2, position = position_dodge(0.9))  + 
  theme_classic(base_size = 20) +
  theme(legend.position = "none") +
  annotate(
    geom = "text",
    x = 4,
    y = 12,
    label = "P = 0.03",
    size = 7
  ) +
  theme(legend.position = "none")  +
  scale_x_discrete(labels = custom_labels) +
  scale_fill_manual(values = c("darkorchid4", "dodgerblue", "orange4", "orange")) +
  scale_pattern_manual(values = c("none", "none", "stripe", "none")) + 
  geom_segment(x = 1, xend = 2, y = 12, yend = 12, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 1, xend = 1, y = 11.7, yend = 12.3, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 2, xend = 2, y = 11.7, yend = 12.3, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 4, y = 7, yend = 7, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 3, xend = 3, y = 6.7, yend = 7.3, 
               lineend = "round", linejoin = "round") +
  geom_segment(x = 4, xend = 4, y = 6.7, yend = 7.3, 
               lineend = "round", linejoin = "round") +
  geom_text(x = 1.5, y = 12.1, label = "a", size = 6, vjust = -0.5) +
  geom_text(x = 3.5, y = 7.1, label = "b", size = 6, vjust = -0.5)

tp_plot

plot_grid(tp_plot, live_pup, ncol=1, nrow =2)

Eggs

egg.mod <- glm.nb(eggs ~ fungicide + crithidia + workers_alive + block, data = brood)
drop1(egg.mod, test = "Chisq")
## Single term deletions
## 
## Model:
## eggs ~ fungicide + crithidia + workers_alive + block
##               Df Deviance    AIC     LRT Pr(>Chi)    
## <none>             46.045 281.46                     
## fungicide      1   46.605 280.02  0.5603 0.454128    
## crithidia      1   46.053 279.46  0.0079 0.929219    
## workers_alive  1   61.824 295.24 15.7787 7.12e-05 ***
## block          8   67.938 287.35 21.8931 0.005118 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(egg.mod)
## Analysis of Deviance Table (Type II tests)
## 
## Response: eggs
##               LR Chisq Df Pr(>Chisq)    
## fungicide       0.5603  1   0.454128    
## crithidia       0.0079  1   0.929219    
## workers_alive  15.7787  1   7.12e-05 ***
## block          21.8931  8   0.005118 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Figures for supplemental material

Spatial Block summary

block_sum <- brood %>%
  group_by(block) %>%
  summarise(
    mbc = mean(brood_cells),
    sdbc = sd(brood_cells),
    nbc = length(brood_cells),
    
    # Larvae
    ml = mean(live_larvae),
    sdl = sd(live_larvae),
    nl = length(live_larvae),
    
    mdl = mean(dead_larvae),
    sddl = sd(dead_larvae),
    ndl = length(dead_larvae),
    
    mtl = mean(total_larvae),
    sdtl = sd(total_larvae),
    ntl = length(total_larvae),
    
    # Pupae
    mp = mean(live_pupae),
    sdp = sd(live_pupae),
    np = length(live_pupae),
    
    mdp = mean(dead_pupae),
    sddp = sd(dead_pupae),
    ndp = length(dead_pupae),
    
    mtp = mean(total_pupae),
    sdtp = sd(total_pupae),
    ntp = length(total_pupae),
    
    # Eggs
    me = mean(eggs),
    sde = sd(eggs),
    ne = length(eggs),
    
    # Honey pots
    mhp = mean(honey_pots),
    sdhp = sd(honey_pots),
    nhp = length(honey_pots),
    
    # Drones
    mtd = mean(total_drones),
    sdtd = sd(total_drones),
    ntd = length(total_drones)
  )


#write.csv(block_sum, file = "C:/Users/runni/OneDrive - The Ohio State University/Runnion and Sivakoff/Synergism Experiment/Disease Dynamics Manuscript/Data and code/block_sum.csv", row.names = FALSE)
library(dplyr)
library(tidyr)
library(ggplot2)

block_sum <- brood %>%
  group_by(block) %>%
  summarise(
    mbc = mean(brood_cells),
    sdbc = sd(brood_cells),
    nbc = length(brood_cells),
    
    # Larvae
    ml = mean(live_larvae),
    sdl = sd(live_larvae),
    nl = length(live_larvae),
    
    mdl = mean(dead_larvae),
    sddl = sd(dead_larvae),
    ndl = length(dead_larvae),
    
    mtl = mean(total_larvae),
    sdtl = sd(total_larvae),
    ntl = length(total_larvae),
    
    # Pupae
    mp = mean(live_pupae),
    sdp = sd(live_pupae),
    np = length(live_pupae),
    
    mdp = mean(dead_pupae),
    sddp = sd(dead_pupae),
    ndp = length(dead_pupae),
    
    mtp = mean(total_pupae),
    sdtp = sd(total_pupae),
    ntp = length(total_pupae),
    
    # Eggs
    me = mean(eggs),
    sde = sd(eggs),
    ne = length(eggs),
    
    # Honey pots
    mhp = mean(honey_pots),
    sdhp = sd(honey_pots),
    nhp = length(honey_pots),
    
    # Drones
    mtd = mean(total_drones),
    sdtd = sd(total_drones),
    ntd = length(total_drones)
  )

block_sum_long <- block_sum %>%
  pivot_longer(cols = starts_with("m"),  # Select all mean columns
               names_to = "variable",
               values_to = "mean_value") %>%
  mutate(variable = factor(variable, 
                           levels = c("ml", "mdl", "mtl", "mp", "mdp", "mtp", 
                                      "me", "mhp", "mtd"),
                           labels = c("Live Larvae", "Dead Larvae", "Total Larvae",
                                      "Live Pupae", "Dead Pupae", "Total Pupae",
                                      "Eggs", "Honey Pots", "Total Drones")))

# Create the plot
ggplot(block_sum_long, aes(x = variable, y = mean_value, fill = block)) +
  geom_col() +
  theme_minimal() +
  labs(title = "Mean Values of Brood Variables by Block",
       x = "Variable",
       y = "Mean Value") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_viridis_d(option = "A") # Optional color scheme for differentiation

Round plot

adl_round_sum <- adl %>%
  group_by(round) %>%
  summarise(
    mmax = mean(max_infc, na.rm = TRUE),
    se_mmax = sd(max_infc, na.rm = TRUE) / sqrt(n()),
    m_total_adl = mean(total.adl, na.rm = TRUE),
    se_m_total_adl = sd(total.adl, na.rm = TRUE) / sqrt(n()),
    m_first_adl = mean(days_to_adl, na.rm = TRUE),
    se_m_first_adl = sd(days_to_adl, na.rm = TRUE) / sqrt(n()),
    m_avg = mean(avg_infc, na.rm = TRUE),
    se_m_avg = sd(avg_infc, na.rm = TRUE) / sqrt(n())
  )

# Reshape data to include standard errors
adl_long <- adl_round_sum %>%
  pivot_longer(
    cols = starts_with("m"),  # Select mean columns
    names_to = "metric",      # Create a column for metric names
    values_to = "mean_value"  # Create a column for mean values
  ) %>%
  mutate(
    se_value = case_when(
      metric == "mmax" ~ se_mmax,
      metric == "m_total_adl" ~ se_m_total_adl,
      metric == "m_first_adl" ~ se_m_first_adl,
      metric == "m_avg" ~ se_m_avg,
      TRUE ~ NA_real_
    )
  )


# Filter for m_avg and mmax
adl_long_avg_max <- adl_long %>%
  filter(metric %in% c("m_avg", "mmax"))

# Plot with error bars
plot1 <- ggplot(adl_long_avg_max, aes(x = round, y = mean_value, fill = metric)) +
  geom_col(position = position_dodge(0.7), width = 0.7) +
  geom_errorbar(
    aes(ymin = mean_value - se_value, ymax = mean_value + se_value),
    position = position_dodge(0.7), width = 0.2
  ) +
  labs(
    x = "Round",
    y = "Cells/ul",
    fill = NULL
  ) +
  scale_fill_manual(
    values = c("m_avg" = "purple", "mmax" = "skyblue"),
    labels = c("m_avg" = "Average Infection Level", "mmax" = "Maximum Infection Level")
  ) +
  theme_minimal() +
  theme(
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    legend.text = element_text(size = 12),
    legend.position = "top"
  )


# Filter for m_total_adl and m_first_adl
adl_long_adl <- adl_long %>%
  filter(metric %in% c("m_total_adl", "m_first_adl"))

# Plot with error bars
plot2 <- ggplot(adl_long_adl, aes(x = round, y = mean_value, fill = metric)) +
  geom_col(position = position_dodge(0.7), width = 0.7) +
  geom_errorbar(
    aes(ymin = mean_value - se_value, ymax = mean_value + se_value),
    position = position_dodge(0.7), width = 0.2
  ) +
  labs(
    x = "Round",
    y = "Days",
    fill = NULL
  ) +
  scale_fill_manual(
    values = c("m_total_adl" = "tomato", "m_first_adl" = "gold"),
    labels = c(
      "m_total_adl" = "Number of Days Infection was Detected",
      "m_first_adl" = "Days Until First Infection Detected"
    )
  ) +
  theme_minimal() +
  theme(
    axis.title = element_text(size = 14),
    axis.text = element_text(size = 12),
    legend.text = element_text(size = 12),
    legend.position = "top"
  )
plot_grid(plot1, plot2, ncol=2, nrow =1)

LS0tDQp0aXRsZTogIkRpZmZlcmVudGlhbCByZXNwb25zZXMgdG8gcGVzdGljaWRlcyBhbmQgcGFyYXNpdGUgc3RyZXNzIGFyZSBsaW5rZWQgdG8gYnVtYmxlIGJlZSBsaWZlIHN0YWdlIg0KYXV0aG9yOiAiRW1pbHkgUnVubmlvbiINCmRhdGU6ICIyMDI0LTEwLTE3Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0aGVtZTogam91cm5hbA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UpDQprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICJDOi9Vc2Vycy9ydW5uaS9PbmVEcml2ZSAtIFRoZSBPaGlvIFN0YXRlIFVuaXZlcnNpdHkvUnVubmlvbiBhbmQgU2l2YWtvZmYvU3luZXJnaXNtIEV4cGVyaW1lbnQvRGF0YSBhbmFseXNpcy9GaWxlcyBmb3IgYW5hbHlzaXMiKQ0KYGBgDQoNCg0KYGBge3IgbG9hZCBsaWJyYXJpZXMsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh2aXJpZGlzTGl0ZSkNCmxpYnJhcnkoc3RhdHMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoZW1tZWFucykNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHZpcmlkaXNMaXRlKQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShlbW1lYW5zKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShsbWU0KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3BhdHRlcm4pDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGJsbWVjbykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShhZ3JpY29sYWUpIA0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdsdWUpDQpsaWJyYXJ5KG11bHRjb21wKQ0KbGlicmFyeShtdWx0Y29tcFZpZXcpDQpsaWJyYXJ5KGdsbW1UTUIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KGZpdGRpc3RycGx1cykNCmxpYnJhcnkobG9nc3BsaW5lKQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQoNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoYmxtZWNvKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGFncmljb2xhZSkgDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoZ2x1ZSkNCmxpYnJhcnkobXVsdGNvbXApDQpsaWJyYXJ5KG11bHRjb21wVmlldykNCmxpYnJhcnkoZ2xtbVRNQikNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KbGlicmFyeShsb2dzcGxpbmUpDQojbGlicmFyeShvbHNycikNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KDQoNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkobmxtZSkNCmxpYnJhcnkoZW1tZWFucykNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkobGF0dGljZSkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShjb3dwbG90KQ0KYGBgDQoNCiMgUG9sbGVuIENvbnN1bXB0aW9uIA0KDQojIyBJbnB1dCBkYXRhIA0KDQpgYGB7cn0NCmRmIDwtIHJlYWRfY3N2KCJwb2xsZW4uZGF0ZXMuY3N2IiwgY29sX3R5cGVzID0gY29scyh0cmVhdG1lbnQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCIyIiwgIjMiLCAiNCIpKSwgcG9sbGVuLnN0YXJ0ID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksc3RhcnQudGltZSA9IGNvbF90aW1lKGZvcm1hdCA9ICIlSDolTTolUyIpLHBvbGxlbi5lbmQgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSxlbmQudGltZSA9IGNvbF90aW1lKGZvcm1hdCA9ICIlSDolTTolUyIpLGNvbG9ueS5zdGFydCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpKSkNCmRmJGNvbG9ueSA8LSBhcy5mYWN0b3IoZGYkY29sb255KQ0KYGBgDQoNCiMjIFBvbGxlbiBBbmFseXNpcyANCg0KYGBge3J9DQojaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzU1ODA0NzAvZW10cmVuZHMtaW4tcHJlc2VuY2Utb2YtYS1xdWFkcmF0aWMtdGVybS1kaWZmZXJlbmNlLWluLXF1YWRyYXRpYy10cmVuZHMgDQoNCiMjTkVXIFRJTUUgVmFyaWFibGUgDQoNCmRmJHBvbGxlbi50aW1lIDwtIGFzLm51bWVyaWMoZGYkcG9sbGVuLnRpbWUpDQpkZiRibG9jayA8LSBhcy5mYWN0b3IoZGYkYmxvY2spDQoNCg0KTE0uZml0IDwtIGxtZXIod2hvbGVfZGlmfmNyaXRoaWRpYSpmdW5naWNpZGUqcG9seShwb2xsZW4udGltZSwyKSsoMXxjb2xvbnkpICsgYmxvY2ssIGRhdGEgPSBkZikNCkxNLmZpdDIgPC0gbG1lcih3aG9sZV9kaWZ+KGNyaXRoaWRpYStmdW5naWNpZGUrcG9seShwb2xsZW4udGltZSwyKSleMisoMXxjb2xvbnkpICsgYmxvY2ssIGRhdGEgPSBkZikNCkxNLmZpdDMgPC0gbG1lcih3aG9sZV9kaWZ+KGNyaXRoaWRpYStmdW5naWNpZGUrcG9seShwb2xsZW4udGltZSwyKSleMisoMXxjb2xvbnkpLCBkYXRhID0gZGYpDQpMTS5maXQ0IDwtIGxtZXIod2hvbGVfZGlmfihjcml0aGlkaWEqZnVuZ2ljaWRlK3BvbHkocG9sbGVuLnRpbWUsMikpXjIrKDF8Y29sb255KSwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShMTS5maXQyKQ0KYW5vdmEoTE0uZml0MiwgTE0uZml0LCB0ZXN0ID0gIkNoaSIpDQphbm92YShMTS5maXQyLCBMTS5maXQzLCB0ZXN0ID0gIkNoaSIpDQpBSUMoTE0uZml0MiwgTE0uZml0MywgTE0uZml0NCkNCg0KDQpBbm92YShMTS5maXQzKQ0KQW5vdmEoTE0uZml0KQ0KQW5vdmEoTE0uZml0NCkNCiNMTS5maXQzIGZpdHMgYmV0dGVyDQoNCg0KDQpgYGANCg0KDQojIyBQbG90IHBvbGxlbiBkYXRhDQoNCmBgYHtyLCBmaWcud2lkdGg9IDE0LCBmaWcuaGVpZ2h0PTEwfQ0KcGFyKG1hciA9IGMoNSwgNSwgNCwgMikgKyAwLjEpDQoNCmRmJHRpbWUyIDwtIGRmJHBvbGxlbi50aW1lXjINCiMgQ2FsY3VsYXRlIGZpdHRlZCB2YWx1ZXMNCnRpbWUucXVhZDIgPC0gbG1lKHdob2xlX2RpZiB+IHRyZWF0bWVudCAqIHBvbGxlbi50aW1lICsgdHJlYXRtZW50ICogdGltZTIsDQogICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KGNvbG9ueSA9IHBkRGlhZyh+IHBvbGxlbi50aW1lKSksIGRhdGEgPSBkZikNCg0KDQpmaXR0ZWQzIDwtIGZpdHRlZCh0aW1lLnF1YWQyLCBsZXZlbCA9IDApDQoNCg0KIyBDcmVhdGUgYSBkYXRhIGZyYW1lIHdpdGggb3JkZXJlZCB2YWx1ZXMNCmEgPC0gd2l0aChkZiwNCiAgICAgICAgICBkYXRhLmZyYW1lKHBvbGxlbi50aW1lLCBmaXR0ZWQzLCB0cmVhdG1lbnQpW29yZGVyKHRyZWF0bWVudCwgcG9sbGVuLnRpbWUpLCBdKQ0KDQojIFNldCB0aGUgZm9udCBzaXplIG11bHRpcGxpZXIgYW5kIHN5bWJvbCBzaXplIG11bHRpcGxpZXINCmZvbnRfbXVsdGlwbGllciA8LSAyDQpzeW1ib2xfbXVsdGlwbGllciA8LSAyICAjIEFkanVzdCB0aGlzIGZvciBsYXJnZXIgc3ltYm9scw0KbGVnZW5kX2NleCA8LSAxLjUNCg0KDQoNCg0KIyBBc3N1bWluZyB5b3UgaGF2ZSBzdGFuZGFyZCBlcnJvciBkYXRhLCBoZXJlJ3MgYW4gZXhhbXBsZQ0Kc2UgPC0gd2l0aChhLCB0YXBwbHkoZml0dGVkMywgdHJlYXRtZW50LCBmdW5jdGlvbih4KSBzZCh4KS9zcXJ0KGxlbmd0aCh4KSkpKQ0KDQojIFBsb3QNCndpdGgoYSwgew0KICAjIFBsb3QgZGF0YSBmb3IgdHJlYXRtZW50IDENCiAgcGxvdChwb2xsZW4udGltZVt0cmVhdG1lbnQ9PTFdLCBmaXR0ZWQzW3RyZWF0bWVudD09MV0sDQogICAgICAgeWxhYiA9ICJBdmVyYWdlIFBvbGxlbiBDb25zdW1wdGlvbiAoZykiLCB4bGFiID0gIlRpbWUgKGRheXMpIiwNCiAgICAgICBjb2wgPSAiZGFya29yY2hpZDQiLCB0eXBlID0gImIiLCBwY2ggPSAxLA0KICAgICAgIGNleC5sYWIgPSBmb250X211bHRpcGxpZXIsICMgU2l6ZSBvZiBheGlzIGxhYmVscw0KICAgICAgIGNleC5heGlzID0gZm9udF9tdWx0aXBsaWVyLCAjIFNpemUgb2YgYXhpcyBudW1iZXJzDQogICAgICAgY2V4ID0gc3ltYm9sX211bHRpcGxpZXIpICAgICMgU2l6ZSBvZiBzeW1ib2xzDQogIA0KICAjIEFkZCBzdGFuZGFyZCBlcnJvciByaWJib24gZm9yIHRyZWF0bWVudCAxDQogIHBvbHlnb24oYyhwb2xsZW4udGltZVt0cmVhdG1lbnQ9PTFdLCByZXYocG9sbGVuLnRpbWVbdHJlYXRtZW50PT0xXSkpLA0KICAgICAgICAgIGMoZml0dGVkM1t0cmVhdG1lbnQ9PTFdICsgc2VbMV0sIHJldihmaXR0ZWQzW3RyZWF0bWVudD09MV0gLSBzZVsxXSkpLA0KICAgICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCJkYXJrb3JjaGlkNCIsIGFscGhhLmYgPSAwLjIpLCBib3JkZXIgPSBOQSkNCiAgDQogICMgQWRkIHBvaW50cyBmb3Igb3RoZXIgdHJlYXRtZW50cyB3aXRoIGluY3JlYXNlZCBzeW1ib2wgc2l6ZQ0KICBwb2ludHMocG9sbGVuLnRpbWVbdHJlYXRtZW50PT0yXSwgZml0dGVkM1t0cmVhdG1lbnQ9PTJdLA0KICAgICAgICAgcGNoID0gNCwgY29sID0gImRvZGdlcmJsdWUiLCB0eXBlID0gImIiLA0KICAgICAgICAgY2V4ID0gc3ltYm9sX211bHRpcGxpZXIpICAgICMgU2l6ZSBvZiBzeW1ib2xzDQogIA0KICAjIEFkZCBzdGFuZGFyZCBlcnJvciByaWJib24gZm9yIHRyZWF0bWVudCAyDQogIHBvbHlnb24oYyhwb2xsZW4udGltZVt0cmVhdG1lbnQ9PTJdLCByZXYocG9sbGVuLnRpbWVbdHJlYXRtZW50PT0yXSkpLA0KICAgICAgICAgIGMoZml0dGVkM1t0cmVhdG1lbnQ9PTJdICsgc2VbMl0sIHJldihmaXR0ZWQzW3RyZWF0bWVudD09Ml0gLSBzZVsyXSkpLA0KICAgICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCJkb2RnZXJibHVlIiwgYWxwaGEuZiA9IDAuMiksIGJvcmRlciA9IE5BKQ0KICANCiAgcG9pbnRzKHBvbGxlbi50aW1lW3RyZWF0bWVudD09M10sIGZpdHRlZDNbdHJlYXRtZW50PT0zXSwNCiAgICAgICAgIHBjaCA9IDE2LCBjb2wgPSAib3JhbmdlNCIsIHR5cGUgPSAiYiIsDQogICAgICAgICBjZXggPSBzeW1ib2xfbXVsdGlwbGllcikgICAgIyBTaXplIG9mIHN5bWJvbHMNCiAgDQogICMgQWRkIHN0YW5kYXJkIGVycm9yIHJpYmJvbiBmb3IgdHJlYXRtZW50IDMNCiAgcG9seWdvbihjKHBvbGxlbi50aW1lW3RyZWF0bWVudD09M10sIHJldihwb2xsZW4udGltZVt0cmVhdG1lbnQ9PTNdKSksDQogICAgICAgICAgYyhmaXR0ZWQzW3RyZWF0bWVudD09M10gKyBzZVszXSwgcmV2KGZpdHRlZDNbdHJlYXRtZW50PT0zXSAtIHNlWzNdKSksDQogICAgICAgICAgY29sID0gYWRqdXN0Y29sb3IoIm9yYW5nZTQiLCBhbHBoYS5mID0gMC4yKSwgYm9yZGVyID0gTkEpDQogIA0KICBwb2ludHMocG9sbGVuLnRpbWVbdHJlYXRtZW50PT00XSwgZml0dGVkM1t0cmVhdG1lbnQ9PTRdLA0KICAgICAgICAgcGNoID0gMTcsIGNvbCA9ICJvcmFuZ2UiLCB0eXBlID0gImIiLA0KICAgICAgICAgY2V4ID0gc3ltYm9sX211bHRpcGxpZXIpICAgICMgU2l6ZSBvZiBzeW1ib2xzDQogIA0KICAjIEFkZCBzdGFuZGFyZCBlcnJvciByaWJib24gZm9yIHRyZWF0bWVudCA0DQogIHBvbHlnb24oYyhwb2xsZW4udGltZVt0cmVhdG1lbnQ9PTRdLCByZXYocG9sbGVuLnRpbWVbdHJlYXRtZW50PT00XSkpLA0KICAgICAgICAgIGMoZml0dGVkM1t0cmVhdG1lbnQ9PTRdICsgc2VbNF0sIHJldihmaXR0ZWQzW3RyZWF0bWVudD09NF0gLSBzZVs0XSkpLA0KICAgICAgICAgIGNvbCA9IGFkanVzdGNvbG9yKCJvcmFuZ2UiLCBhbHBoYS5mID0gMC4yKSwgYm9yZGVyID0gTkEpDQogIA0KICAjIEFkZCBhIGxlZ2VuZCB3aXRoIGxhcmdlciBmb250DQogIGxlZ2VuZCgidG9wbGVmdCIsIGxlZ2VuZCA9IGMoIiBDb250cm9sIiwgIkZ1bmdpY2lkZSIsICJGdW5naWNpZGUgKyBDcml0aGlkaWEiLCAiQ3JpdGhpZGlhIiksDQogICAgICAgICBjb2wgPSBjKCJkYXJrb3JjaGlkNCIsICJkb2RnZXJibHVlIiwgIm9yYW5nZTQiLCAib3JhbmdlIiksIHBjaCA9IGMoMSwgNCwgMTYsIDE3KSwgDQogICAgICAgICBsdHkgPSAxLCBjZXggPSBsZWdlbmRfY2V4LCBidHk9ICJuIikNCn0pDQoNCmBgYA0KDQojIERpc2Vhc2UgZHluYW1pY3MNCg0KIyMgSW5wdXQgZGF0YSANCg0KYGBge3J9DQoNCiMjIyMgRGF0YSBmb3IgcXBDUiBEaXNlYXNlIER5bmFtaWNzDQoNCmFsbF9iZWVzIDwtIHJlYWRfY3N2KCJxcGNyXzMuNF9iZWVzX2FsbDIuY3N2IiwgY29sX3R5cGVzID0gY29scyh0cmVhdG1lbnQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMiIsICIzIiwgIjQiKSksIHJlcGxpY2F0ZSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IiwgIjYiLCAiNyIsICI4IiwgIjkiLCAiMTAiLCAiMTEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIiKSksIHN0YXJ0ID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ub2N1bGF0aW9uX2RhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIikpKQ0KDQphbGxfYmVlcyRjb2xvbnkgPC0gYXMuZmFjdG9yKGFsbF9iZWVzJGNvbG9ueSkNCmFsbF9iZWVzJGJlZV9pZCA8LSBhcy5mYWN0b3IoYWxsX2JlZXMkYmVlX2lkKQ0KDQoNCmFfZGYgPC0gcmVhZF9jc3YoImluZGl2aWR1YWwgYmVlcyAzLjQgYXZlcmFnZS5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGRhdGVfZmlyc3RfYWRsID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICByb3VuZCA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICAgICAgICAgIjIiLCAiMyIpKSkpDQoNCmFfZGYkYmVlX2lkIDwtIGFzLmZhY3RvcihhX2RmJGJlZV9pZCkNCmFfZGYkY29sb255IDwtIGFzLmZhY3RvcihhX2RmJGNvbG9ueSkNCmFfZGYkdHJlYXRtZW50IDwtIGFzLmZhY3RvcihhX2RmJHRyZWF0bWVudCkNCmFfZGYkcmVwbGljYXRlIDwtIGFzLmZhY3RvcihhX2RmJHJlcGxpY2F0ZSkNCg0KYV9kZl9uYSA8LSBuYS5vbWl0KGFfZGYpDQoNCg0KcXBjciA8LSAgcmVhZF9jc3YoInFwY3JfMy40X2JlZXNfYWxsLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoaW5vY3VsYXRlX3JvdW5kID0gY29sX2ZhY3RvcihsZXZlbHMgPSBjKCIxIiwgDQogICAgICAgICIyIiwgIjMiKSksIGlub2N1bGF0ZV8wMSA9IGNvbF9sb2dpY2FsKCksIA0KICAgICAgICBgZW5kIGRhdGVgID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICB0cmVhdG1lbnQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjMiLCANCiAgICAgICAgICAgICI0IikpLCByZXBsaWNhdGUgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAgICAgICAgICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsIA0KICAgICAgICAgICAgIjEwIiwgIjExIiwgIjEyIikpLCBzdGFydCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpLCANCiAgICAgICAgaW5ub2N1bGF0aW9uX2RhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQogICAgICAgIGRhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQogICAgICAgIGFsaXZlX29yX2RlYWQgPSBjb2xfbG9naWNhbCgpKSkNCg0KcXBjciRmdW5naWNpZGUgPC0gYXMubG9naWNhbChxcGNyJGZ1bmdpY2lkZSkNCnFwY3IkY3JpdGhpZGlhIDwtIGFzLmxvZ2ljYWwocXBjciRjcml0aGlkaWEpDQpxcGNyJHFybyA8LSBhcy5mYWN0b3IocXBjciRxcm8pDQpxcGNyJGNvbG9ueSA8LSBhcy5mYWN0b3IocXBjciRjb2xvbnkpDQpxcGNyJHByZW1hdHVyZV9kZWF0aCA8LSBhcy5mYWN0b3IocXBjciRwcmVtYXR1cmVfZGVhdGgpDQpxcGNyJGRyeSA8LSBhcy5kb3VibGUocXBjciRkcnkpDQpxcGNyJGJlZV9pZCA8LSBhcy5mYWN0b3IocXBjciRiZWVfaWQpDQpxcGNyJHNwb3JlX2luY2x1ZGUgPC0gYXMubnVtZXJpYyhxcGNyJHNwb3JlX2luY2x1ZGUpDQpxcGNyJGNvbF9kYXlzIDwtIGFzLmZhY3RvcihxcGNyJGNvbF9kYXlzKQ0KDQoNCmRmY294IDwtIHJlYWRfY3N2KCJkYXRhIGZvciBjb3ggcGguY3N2IikNCg0KZGZjb3gkYmVlX2lkIDwtIGFzLmZhY3RvcihkZmNveCRiZWVfaWQpDQpkZmNveCRmdW5naWNpZGUgPC0gYXMuZmFjdG9yKGRmY294JGZ1bmdpY2lkZSkNCmRmY294JGNyaXRoaWRpYSA8LSBhcy5mYWN0b3IoZGZjb3gkY3JpdGhpZGlhKQ0KZGZjb3gkcXJvIDwtIGFzLmZhY3RvcihkZmNveCRxcm8pDQpkZmNveCRpbm9jdWxhdGVfcm91bmQgPC0gYXMuZmFjdG9yKGRmY294JGlub2N1bGF0ZV9yb3VuZCkNCmRmY294JGlub2N1bGF0ZSA8LSBhcy5mYWN0b3IoZGZjb3gkaW5vY3VsYXRlKQ0KZGZjb3gkaW5vY3VsYXRlXzAxIDwtIGFzLmZhY3RvcihkZmNveCRpbm9jdWxhdGVfMDEpDQpkZmNveCRwcmVtYXR1cmVfZGVhdGggPC0gYXMuZmFjdG9yKGRmY294JHByZW1hdHVyZV9kZWF0aCkNCmRmY294JHRyZWF0bWVudCA8LSBhcy5mYWN0b3IoZGZjb3gkdHJlYXRtZW50KQ0KZGZjb3gkcmVwbGljYXRlIDwtIGFzLmZhY3RvcihkZmNveCRyZXBsaWNhdGUpDQpkZmNveCRjb2xvbnkgPC0gYXMuZmFjdG9yKGRmY294JGNvbG9ueSkNCg0KDQoNCmNiZGYgPC0gcmVhZF9jc3YoImNiZGYuY3N2IikNCmNiZGYkY29sb255IDwtIGFzLmZhY3RvcihjYmRmJGNvbG9ueSkNCmNiZGYkZGF5IDwtIGFzLmZhY3RvcihjYmRmJGRheSkNCmNiZGYkZnVuZ2ljaWRlIDwtIGFzLmZhY3RvcihjYmRmJGZ1bmdpY2lkZSkNCmNiZGYkcm91bmQgPC0gYXMuZmFjdG9yKGNiZGYkcm91bmQpDQpjYmRmJGJsb2NrIDwtIGFzLmZhY3RvcihjYmRmJGJsb2NrKQ0KDQpxcGNyX2FsbCA8LSByZWFkX2NzdigicXBjcl8zLjRfYmVlc19hbGxfd2l0aDUuY3N2IikNCnFwY3JfYWxsLm5hIDwtIG5hLm9taXQocXBjcl9hbGwpDQoNCnVuaXF1ZShxcGNyX2FsbCRyZXBsaWNhdGUpDQoNCndvcmtlcnMgPC0gcmVhZF9jc3YoIndvcmtlcnMuY3N2IikNCndvcmtlcnMkY29sb255IDwtIGFzLmZhY3Rvcih3b3JrZXJzJGNvbG9ueSkNCndvcmtlcnMkdHJlYXRtZW50IDwtIGFzLmZhY3Rvcih3b3JrZXJzJHRyZWF0bWVudCkNCndvcmtlcnMkYmxvY2sgPC0gYXMuZmFjdG9yKHdvcmtlcnMkYmxvY2spDQp3b3JrZXJzJHFybyA8LSBhcy5mYWN0b3Iod29ya2VycyRxcm8pDQp3b3JrZXJzJGlub2N1bGF0ZSA8LSBhcy5sb2dpY2FsKHdvcmtlcnMkaW5vY3VsYXRlKQ0KDQpjdXN0b21fbGFiZWxzIDwtIGMoIkNvbnRyb2wiLCAiRnVuZ2ljaWRlIiwgIkZ1bmdpY2lkZSArIENyaXRoaWRpYSIsICJDcml0aGlkaWEiKQ0KDQoNCmBgYA0KDQoNCiMjIyBXb3JrZXIgc3Vydml2YWwgcHJvYmFiaWxpdHkgYW5hbHlzaXMgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04fQ0KDQojT3ZlciB3aG9sZSBleHBlcmltZW50IA0KDQpsaWJyYXJ5KHN1cnZpdmFsKQ0KbGlicmFyeShjb3htZSkNCmxpYnJhcnkoc3Vydm1pbmVyKQ0KDQp3b3JrZXJzLm5hIDwtIG5hLm9taXQod29ya2VycykNCndvcmtlcnMubmEkaW5vY3VsYXRlX3JvdW5kIDwtIGFzLmZhY3Rvcih3b3JrZXJzLm5hJGlub2N1bGF0ZV9yb3VuZCkNCmNveCA8LSBjb3htZShTdXJ2KGRheXNfYWxpdmVfc2luY2VfaW5vYywgaW5vY19jZW5zb3IpIH4gY3JpdGhpZGlhICsgZnVuZ2ljaWRlICsgaW5vY3VsYXRlX3JvdW5kICsgaW5vY3VsYXRlICsgKDF8Y29sb255KSwgZGF0YSA9IHdvcmtlcnMubmEpDQoNCkFub3ZhKGNveCkNCnN1bW1hcnkoY294KQ0KDQplbW1lYW5zKGNveCwgcGFpcndpc2UgfiBjcml0aGlkaWEqZnVuZ2ljaWRlKQ0KZW1tZWFucyhjb3gsIHBhaXJ3aXNlIH4gaW5vY3VsYXRlKQ0KDQpjb3gudCA8LSBjb3htZShTdXJ2KGRheXNfYWxpdmVfc2luY2VfaW5vYywgaW5vY19jZW5zb3IpIH4gdHJlYXRtZW50ICsgaW5vY3VsYXRlX3JvdW5kICsgKDF8Y29sb255KSwgZGF0YSA9IHdvcmtlcnMubmEpDQpjb3guZW1tIDwtIGVtbWVhbnMoY294LnQsIHBhaXJ3aXNlIH4gdHJlYXRtZW50KQ0KY294LmVtbQ0KDQpjb3guaW5vYyA8LSBjb3htZShTdXJ2KGRheXNfYWxpdmVfc2luY2VfaW5vYywgaW5vY19jZW5zb3IpIH4gdHJlYXRtZW50ICsgaW5vY3VsYXRlX3JvdW5kICsgKDF8Y29sb255KSwgZGF0YSA9IHdvcmtlcnMubmEpDQpBbm92YShjb3guaW5vYykNCg0KY294LmVtbSA8LSBlbW1lYW5zKGNveC50LCBwYWlyd2lzZSB+IHRyZWF0bWVudCkNCmNveC5lbW0NCg0KYnJvb2QgPC0gcmVhZF9jc3YoImJyb29kLmNzdiIpDQoNCmJyb29kIDwtIHJlYWRfY3N2KCJicm9vZC5jc3YiKQ0KYnJvb2QkY29sb255IDwtIGFzLmZhY3Rvcihicm9vZCRjb2xvbnkpDQpicm9vZCR0cmVhdG1lbnQgPC0gYXMuZmFjdG9yKGJyb29kJHRyZWF0bWVudCkNCmJyb29kJGJsb2NrIDwtIGFzLmZhY3Rvcihicm9vZCRibG9jaykNCmJyb29kJGZ1bmdpY2lkZSA8LSBhcy5sb2dpY2FsKGJyb29kJGZ1bmdpY2lkZSkNCmJyb29kJGNyaXRoaWRpYSA8LSBhcy5sb2dpY2FsKGJyb29kJGNyaXRoaWRpYSkNCg0KYGBgDQoNCg0KIyMjIyBQbG90IENPWCBQSCBDdXJ2ZXMgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMn0NCg0KZ2dzdXJ2cGxvdCgNCiAgc3VydmZpdChTdXJ2KGRheXNfYWxpdmVfc2luY2VfaW5vYywgaW5vY19jZW5zb3IpIH4gdHJlYXRtZW50LCBkYXRhID0gd29ya2Vycy5uYSksDQogIGxlZ2VuZC50aXRsZSA9ICIiLA0KICBjZW5zb3Iuc2hhcGUgPSAxMjQsIA0KICBjZW5zb3Iuc2l6ZSA9IDIuNSwNCiAgeWxpbSA9IGMoMC4yNSwgMSksDQogIHBhbGV0dGUgPSBjKCJkYXJrb3JjaGlkNCIsICJkb2RnZXJibHVlIiwgIm9yYW5nZTQiLCAib3JhbmdlIiksDQogIGxlZ2VuZC5sYWJzID0gYygiQ29udHJvbCIsICJGdW5naWNpZGUiLCAiRnVuZ2ljaWRlICsgQ3JpdGhpZGlhIiwgIkNyaXRoaWRpYSIpLA0KICBmb250LnggPSAxNiwNCiAgZm9udC55ID0gMTYsIA0KICBmb250LnRpY2tzbGFiID0gMTYsIA0KICBmb250LmxlZ2VuZCA9IDE4LA0KICBsZWdlbmQgPSAicmlnaHQiDQopDQpgYGANCg0KDQojIyMgTGlrbGllaG9vZCBvZiBpbmZlY3Rpb24gYWJvdmUgZGV0ZWN0aW9uIGxpbWl0DQoNCmBgYHtyfQ0KcXBjcl9hbGwubmEkYWRsX25lZyA8LSAxIC0gcXBjcl9hbGwubmEkYWRsDQpxcGNyX2FsbC5uYSRyb3VuZCA8LSBhcy5mYWN0b3IocXBjcl9hbGwubmEkcm91bmQpDQpxcGNyX2FsbC5uYSRyZXBsaWNhdGUgPC0gYXMuZmFjdG9yKHFwY3JfYWxsLm5hJHJlcGxpY2F0ZSkNCg0KY2J3MiA8LSBnbG0oY2JpbmQoYWRsLCBhZGxfbmVnKSB+IGZ1bmdpY2lkZSArIHJvdW5kICsgaW5vY3VsYXRlICsgcmVwbGljYXRlLCBkYXRhID0gcXBjcl9hbGwubmEsIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpKQ0KZHJvcDEoY2J3MiwgdGVzdCA9ICJDaGlzcSIpDQpBbm92YShjYncyKQ0KDQpzdW1tYXJ5KGNidzIpDQoNCmVtbTEgPC0gZW1tZWFucyhjYncyLCBwYWlyd2lzZSB+IGZ1bmdpY2lkZSwgdHlwZSA9ICJyZXNwb25zZSIpDQpwYWlycyhlbW0xKQ0KZW1tMQ0KDQplbS5kZiA8LSBhcy5kYXRhLmZyYW1lKGVtbTEkZW1tZWFucykNCmVtLmRmDQoNCg0KZW1tMiA8LSBlbW1lYW5zKGNidzIsIHBhaXJ3aXNlIH4gaW5vY3VsYXRlLCB0eXBlID0gInJlc3BvbnNlIikNCnBhaXJzKGVtbTIpDQplbW0yDQoNCg0KYGBgDQoNCiMjIyMgVmlzdWxpemUgbGlrZWxpaG9vZCBvZiBpbmZlY3Rpb24gcHJvYmFiaWxpdGllcw0KDQpgYGB7ciwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9IDEwfQ0KDQpnZ3Bsb3QoZGF0YSA9IGVtLmRmLCBhZXMoeCA9IGZ1bmdpY2lkZSwgeSA9IHByb2IsIGZpbGwgPSBmdW5naWNpZGUpKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fY29sX3BhdHRlcm4oDQogICAgYWVzKHBhdHRlcm4gPSBmdW5naWNpZGUpLA0KICAgIHBhdHRlcm5fZGVuc2l0eSA9IGMoMCwgMC40KSwgIA0KICAgIHBhdHRlcm5fc3BhY2luZyA9IDAuMDMsDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpDQogICkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gIlByb2JhYmlsaXR5IG9mIFRlc3RpbmcgQWJvdmUgRGV0ZWN0aW9uIExpbWl0IikgKw0KICB0aGVtZV9jb3dwbG90KCkgKw0KIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiRkFMU0UiID0gIkNyaXRoaWRpYSIsICJUUlVFIiA9ICJGdW5naWNpZGUgKyBDcml0aGlkaWEiKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJGQUxTRSIgPSAib3JhbmdlIiwgIlRSVUUiID0gIm9yYW5nZTQiKSkgKw0KICAgIHNjYWxlX3BhdHRlcm5fbWFudWFsKHZhbHVlcyA9IGMoIm5vbmUiLCAic3RyaXBlIikpICsgIyBDdXN0b21pemUgYmFyIGNvbG9ycw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgICMgUmVtb3ZlIHRoZSBsZWdlbmQNCiAgYW5ub3RhdGUoDQogICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICB4ID0gMC44LA0KICAgIHkgPSAwLjQ1LA0KICAgIGxhYmVsID0gIlAgPCAwLjAxIiwNCiAgICBzaXplID0gOA0KICApICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHByb2IgLSBTRSwgeW1heCA9IHByb2IgKyBTRSksIHdpZHRoID0gMC4yLCBzaXplID0gMC44LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDEpKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgICMgU2V0IGF4aXMgbGFiZWwgZm9udCBzaXplDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkgKyAgIyBTZXQgYXhpcyB0aXRsZSBmb250IHNpemUNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQ0KYGBgDQoNCg0KIyMgRGF5cyB1bnRpbCBmaXJzdCBpbmZlY3Rpb24gYWJvdmUgZGV0ZWN0aW9uIGxpbWl0IGFuZCB0b3RhbCB0aW1lcyBhYm92ZSBkZXRlY3Rpb24gbGltaXQgDQoNCmBgYHtyfQ0KIyBJbnB1dCBkYXRhIA0KYWRsIDwtIHJlYWQuY3N2KCJhZGwuY3N2IikNCmFkbCRjb2xvbnkgPC0gYXMuZmFjdG9yKGFkbCRjb2xvbnkpDQphZGwkdHJlYXRtZW50IDwtYXMuZmFjdG9yKGFkbCR0cmVhdG1lbnQpDQphZGwkcm91bmQgPC0gYXMuZmFjdG9yKGFkbCRyb3VuZCkNCmFkbCRpbm9jdWxhdGUgPC0gYXMubG9naWNhbChhZGwkaW5vY3VsYXRlKQ0KYWRsJGJsb2NrIDwtIGFzLmZhY3RvcihhZGwkYmxvY2spDQoNCg0KYWRsbW9kIDwtIGdsbWVyLm5iKGRheXNfdG9fYWRsIH4gdHJlYXRtZW50ICsgcm91bmQgKyBpbm9jdWxhdGUgKyBibG9jayArICgxfGNvbG9ueSksIGRhdGEgPSBhZGwpDQpkcm9wMShhZGxtb2QsIHRlc3QgPSAiQ2hpc3EiKQ0KQW5vdmEoYWRsbW9kKQ0KDQphZGxlbW0gPC0gZW1tZWFucyhhZGxtb2QsIHBhaXJ3aXNlIH4gdHJlYXRtZW50LCB0eXBlID0gInJlc3BvbnNlIikNCnBhaXJzKGFkbGVtbSkNCmFkbGVtbQ0KDQoNCmFkbGVtbSA8LSBlbW1lYW5zKGFkbG1vZCwgcGFpcndpc2UgfiByb3VuZCwgdHlwZSA9ICJyZXNwb25zZSIpDQpwYWlycyhhZGxlbW0pDQphZGxlbW0NCg0KYWRsZW1tIDwtIGVtbWVhbnMoYWRsbW9kLCBwYWlyd2lzZSB+IGlub2N1bGF0ZSwgdHlwZSA9ICJyZXNwb25zZSIpDQpwYWlycyhhZGxlbW0pDQphZGxlbW0NCg0KZGV0YWRsIDwtIGdsbWVyLm5iKHRvdGFsLmFkbCB+IHRyZWF0bWVudCArIGlub2N1bGF0ZSArICgxfGNvbG9ueSksIGRhdGEgPSBhZGwpDQpkcm9wMShkZXRhZGwsIHRlc3QgPSAiQ2hpc3EiKQ0KQW5vdmEoZGV0YWRsKQ0KDQphZGwudC5lbW0gPC0gZW1tZWFucyhkZXRhZGwsIHBhaXJ3aXNlIH4gaW5vY3VsYXRlLCB0eXBlID0gInJlc3BvbnNlIikNCnBhaXJzKGFkbC50LmVtbSkNCmFkbC50LmVtbQ0KDQphZGxfc3VtIDwtIGFkbCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKHdya3JzID0gbGVuZ3RoKGJlZV9pZCkpDQphZGxfc3VtDQoNCmBgYA0KDQojIyBNYXhpbXVtIGxldmVsIG9mIGluZmVjdGlvbg0KDQpgYGB7cn0NCmFkbCRiZWVfaWQgPC0gYXMuZmFjdG9yKGFkbCRiZWVfaWQpDQoNCnFwY3JfbWF4X3N1bSA8LSAgIHFwY3IgJT4lDQogIGdyb3VwX2J5KGJlZV9pZCwgdHJlYXRtZW50LCBpbm9jdWxhdGUsIGlub2N1bGF0ZV9yb3VuZCwgY29sb255KSAlPiUNCiAgc3VtbWFyaXNlKG1heCA9IG1heChzcG9yZXNfYXNzdW1lZCkpDQoNCm1heF9zdW0gPC0gcXBjcl9tYXhfc3VtICU+JQ0KICBncm91cF9ieShpbm9jdWxhdGUpICU+JQ0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4obWF4KSwNCiAgICAgICAgICAgIHNkPSBzZChtYXgpLA0KICAgICAgICAgICAgbiA9IGxlbmd0aChtYXgpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KaGlzdChhZGwkbWF4X2luZmMpDQoNCmFkbCRsb2dtYXggPC0gbG9nKChhZGwkbWF4X2luZmMpKzEpDQpoaXN0KGFkbCRsb2dtYXgpDQpzaGFwaXJvLnRlc3QoYWRsJGxvZ21heCkNCnJhbmdlKGFkbCRsb2dtYXgpDQoNCm1heG1vZCA8LSBsbWVyKGxvZ21heCB+IHRyZWF0bWVudCArIGlub2N1bGF0ZSArIHJvdW5kICsgKDF8Y29sb255KSwgZGF0YSA9IGFkbCkNCkFub3ZhKG1heG1vZCkNCm1heG1vZC5lbW0gPC0gZW1tZWFucyhtYXhtb2QsIHBhaXJ3aXNlIH4gaW5vY3VsYXRlLCB0eXBlID0gInJlc3BvbnNlIikNCg0KbGlicmFyeShOQlpJTU0pDQptYXguemlnID0gbG1lLnppZyhmaXhlZCA9IGxvZ21heCB+IHRyZWF0bWVudCArIGlub2N1bGF0ZSArIHJvdW5kICsgb2Zmc2V0KGxvZyhkYXlzX3RvX2FkbCArIDEpKSwgDQogICAgICAgICAgICAgcmFuZG9tID0gfiAxIHwgY29sb255LCBkYXRhID0gYWRsKQ0KDQpBbm92YShtYXguemlnKQ0KDQptYXhfc3VtIDwtIGFkbCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKG1heF9pbmZjKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgobWF4X2luZmMpLA0KICAgICAgICAgICAgc2QgPSBzZChtYXhfaW5mYykpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KbWF4X3N1bQ0KDQpgYGANCg0KIyMgSW5mZWN0aW9uIGxldmVsIG1lYXN1cmVkIG92ZXIgdGltZSANCg0KYGBge3J9DQoNCiMgSW5wdXQgdGhlIGRhdGEgDQpxcGNyIDwtIHJlYWRfY3N2KCJxcGNyX3RpbWUyLmNzdiIpDQpxcGNyJGJlZV9pZCA8LSBhcy5mYWN0b3IocXBjciRiZWVfaWQpDQpxcGNyJHRpbWVfZ3JvdXAgPC0gYXMuZmFjdG9yKHFwY3IkdGltZV9ncm91cCkNCnFwY3IkaW5vY3VsYXRlX3JvdW5kIDwtIGFzLmZhY3RvcihxcGNyJGlub2N1bGF0ZV9yb3VuZCkNCnFwY3IkcmVwbGljYXRlIDwtIGFzLmZhY3RvcihxcGNyJHJlcGxpY2F0ZSkNCnFwY3IkZnVuZ2ljaWRlIDwtIGFzLmZhY3RvcihxcGNyJGZ1bmdpY2lkZSkNCg0KIyBMb29rIGF0IHNoYXBlIA0KaGlzdChxcGNyJHNwb3Jlc19hc3N1bWVkKQ0KDQpwbG90KHFwY3IkZnVuZ2ljaWRlLCBxcGNyJHNwb3Jlc19hc3N1bWVkKQ0KDQojIFRyYW5zZm9ybSB0aGUgZGF0YSB0byBub3JtYWxpemUgDQpxcGNyJGxvZ3Nwb3JlcyA8LSBsb2coKHFwY3Ikc3BvcmVzX2Fzc3VtZWQpKzEwKQ0Kc2hhcGlyby50ZXN0KHFwY3IkbG9nc3BvcmVzKQ0KaGlzdChxcGNyJGxvZ3Nwb3JlcykNCnJhbmdlKHFwY3IkbG9nc3BvcmVzKQ0KDQpyYW5nZShxcGNyJHNwb3Jlc19hc3N1bWVkKQ0KDQojIEZpbmFsIHNlbGVjdGVkIG1vZGVsIA0KZjEwID0gZ2xtZXIobG9nc3BvcmVzIH4gdGltZV9ncm91cCpmdW5naWNpZGUgKyBpbm9jdWxhdGUgKyBpbm9jdWxhdGVfcm91bmQgICsgKDF8YmVlX2lkKSwgZmFtaWx5ID0gR2FtbWEobGluayA9ICJsb2ciKSwgZGF0YSA9IHFwY3IpDQpBbm92YShmMTApDQpzdW1tYXJ5KGYxMCkNCmYxMC5lbW0gPC0gZW1tZWFucyhmMTAsIHBhaXJ3aXNlIH4gZnVuZ2ljaWRlKnRpbWVfZ3JvdXAsIHR5cGUgPSAicmVzcG9uc2UiKQ0KZjEwLmVtbQ0Kd29ya2NsZDEwIDwtIGNsZChvYmplY3QgPSBmMTAuZW1tLA0KICAgICAgICAgICAgICAgYWRqdXN0ID0gIlR1a2V5IiwNCiAgICAgICAgICAgICAgIGFscGhhID0gMC4wNSwNCiAgICAgICAgICAgICAgIExldHRlcnMgPSBsZXR0ZXJzKQ0KDQp3b3JrY2xkMTANCg0KZjEwLmluIDwtIGVtbWVhbnMoZjEwLCBwYWlyd2lzZSB+IGlub2N1bGF0ZSwgdHlwZSA9ICJyZXNwb25zZSIpDQpmMTAuaW4kY29udHJhc3RzDQpmMTAuaW4NCndvcmtjbGRpbiA8LSBjbGQob2JqZWN0ID0gZjEwLmluLA0KICAgICAgICAgICAgICAgYWRqdXN0ID0gIm5vbmUiLA0KICAgICAgICAgICAgICAgYWxwaGEgPSAwLjA1LA0KICAgICAgICAgICAgICAgTGV0dGVycyA9IGxldHRlcnMpDQoNCndvcmtjbGRpbg0KDQoNCiMgQ3JlYXRlIHZhcmlvdXMgc3VtbWFyaWVzIGJhc2VkIG9uIGRpZmZlcmVudCBleHBsYW5hdG9yeSB2YXJpYWJsZXMgZm9yIGxhdGVyIG1vZGVsaW5nIA0KDQppbmZlY19zdW0xIDwtIHFwY3IgJT4lDQogIGdyb3VwX2J5KGZ1bmdpY2lkZSwgdGltZV9ncm91cCwgaW5vY3VsYXRlKSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKGxvZ3Nwb3JlcyksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGxvZ3Nwb3JlcyksDQogICAgICAgICAgICBzZCA9IHNkKGxvZ3Nwb3JlcykpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KaW5mZWNfc3VtMQ0KDQoNCmluZmVjX3N1bTIgPC0gcXBjciAlPiUNCiAgZ3JvdXBfYnkoZnVuZ2ljaWRlLCB0aW1lX2dyb3VwKSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHNwb3Jlc19hc3N1bWVkKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgoc3BvcmVzX2Fzc3VtZWQpLA0KICAgICAgICAgICAgc2QgPSBzZChzcG9yZXNfYXNzdW1lZCkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KaW5mZWNfc3VtMg0KDQoNCmluZmVjX3N1bTQgPC0gcXBjciAlPiUNCiAgZ3JvdXBfYnkoaW5vY3VsYXRlLCB0aW1lX2dyb3VwKSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHNwb3Jlc19hc3N1bWVkKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgoc3BvcmVzX2Fzc3VtZWQpLA0KICAgICAgICAgICAgc2QgPSBzZChzcG9yZXNfYXNzdW1lZCkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KaW5mZWNfc3VtNA0KDQoNCmluZmVjX3N1bTcgPC0gcXBjciAlPiUNCiAgZ3JvdXBfYnkoaW5vY3VsYXRlKSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHNwb3Jlc19hc3N1bWVkKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgoc3BvcmVzX2Fzc3VtZWQpLA0KICAgICAgICAgICAgc2QgPSBzZChzcG9yZXNfYXNzdW1lZCksDQogICAgICAgICAgICBtZWFuX21heGluZiA9IG1lYW4obWF4KHNwb3Jlc19hc3N1bWVkKSkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KaW5mZWNfc3VtNw0KDQppbmZlY19zdW04IDwtIHFwY3IgJT4lDQogIGdyb3VwX2J5KGlub2N1bGF0ZV9yb3VuZCkgJT4lDQogIHN1bW1hcmlzZShtID0gbWVhbihzcG9yZXNfYXNzdW1lZCksDQogICAgICAgICAgICBuID0gbGVuZ3RoKHNwb3Jlc19hc3N1bWVkKSwNCiAgICAgICAgICAgIHNkID0gc2Qoc3BvcmVzX2Fzc3VtZWQpLA0KICAgICAgICAgICAgbWVhbl9tYXhpbmYgPSBtZWFuKG1heChzcG9yZXNfYXNzdW1lZCkpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCmluZmVjX3N1bTgNCg0KDQoNCmBgYA0KDQojIyMgUGxvdCBpbmZlY3Rpb24gbGV2ZWxzIHBlciB0aW1lIHBlcmlvZA0KDQpgYGB7ciwgZmlnLndpZHRoPTEzLCBmaWcuaGVpZ2h0PTd9DQoNCiMgQ29tYmluZSB3b3JrY2xkIHdpdGggaW5mZWNfc3VtIGJhc2VkIG9uIG1hdGNoaW5nIGNvbHVtbnMNCmluZmVjX3N1bV8zIDwtIG1lcmdlKGluZmVjX3N1bTIsIHdvcmtjbGQxMFssIGMoImZ1bmdpY2lkZSIsICJ0aW1lX2dyb3VwIiwgIi5ncm91cCIpXSwNCiAgICAgICAgICAgICAgICAgICBieSA9IGMoImZ1bmdpY2lkZSIsICJ0aW1lX2dyb3VwIiksIGFsbC54ID0gVFJVRSkNCg0KDQojIENyZWF0ZSB0aGUgcGxvdCB3aXRoIGFubm90YXRpb25zDQpnZ3Bsb3QoaW5mZWNfc3VtXzMsIGFlcyh4ID0gdGltZV9ncm91cCwgeSA9IG0sIGZpbGwgPSBmdW5naWNpZGUpKSArDQogICBnZW9tX2NvbF9wYXR0ZXJuKA0KICAgIGFlcyhwYXR0ZXJuID0gZnVuZ2ljaWRlKSwNCiAgICBwYXR0ZXJuX3NwYWNpbmcgPSAwLjAzLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KQ0KICApICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsMjgpKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtIC0gc2UsIHltYXggPSBtICsgc2UpLCANCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgd2lkdGggPSAwLjI1KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSAuZ3JvdXAsIHkgPSBtICsgc2UgKyAxKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICBzaXplID0gNSwgDQogICAgICAgICAgICBoanVzdCA9IC41KSArIA0Kc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygib3JhbmdlIiwgIm9yYW5nZTQiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRkFMU0UiID0gIkNyaXRoaWRpYSIsICJUUlVFIiA9ICJGdW5naWNpZGUgKyBDcml0aGlkaWEiKSkgKw0KICBzY2FsZV9wYXR0ZXJuX21hbnVhbCh2YWx1ZXMgPSBjKCJub25lIiwgInN0cmlwZSIpLCBndWlkZSA9ICJub25lIikgKyAgDQogICAgc2NhbGVfeF9kaXNjcmV0ZSgNCiAgICBsYWJlbHMgPSBjKCIxIiA9ICJEYXlzIDAtNCIsICIyIiA9ICJEYXlzIDUtOSIsICIzIiA9ICJEYXlzIDAtMTQiKQ0KICApICsNCiAgbGFicyhmaWxsID0gTlVMTCwgIA0KICAgICAgIHkgPSAiQ2VsbHMvwrVsIiwgICAgIA0KICAgICAgIHggPSAiIikgKyAgDQogIHRoZW1lX2Nvd3Bsb3QoKSsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLCAgIyBUaXRsZSBzaXplDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLCAgICAgICAgICAgICAgICMgQXhpcyB0aXRsZXMNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgICAgICAgICAgICAgICAgIyBBeGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dA0KICApICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKw0KYW5ub3RhdGUoDQogICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICB4ID0gMC44LA0KICAgIHkgPSAyNywNCiAgICBsYWJlbCA9ICJQIDwgMC4wMSIsDQogICAgc2l6ZSA9IDgNCiAgKQ0KDQoNCg0KDQpgYGANCg0KDQoNCg0KIyBNaWNyb2NvbG9ueSBoZWFsdGggbWV0cmljcw0KDQojIyBNYWxlcw0KDQojIyMgSW5wdXQgZGF0YSANCg0KYGBge3J9DQpkcm9uZXMgPC0gcmVhZF9jc3YoImRyb25lcy5jc3YiKQ0KZHJvbmVzJHRyZWF0bWVudCA8LSBhcy5mYWN0b3IoZHJvbmVzJHRyZWF0bWVudCkNCmRyb25lcyRibG9jayA8LSBhcy5mYWN0b3IoZHJvbmVzJGJsb2NrKQ0KZHJvbmVzJGNvbG9ueSA8LSBhcy5mYWN0b3IoZHJvbmVzJGNvbG9ueSkNCmRyb25lcyRpZCA8LSBhcy5mYWN0b3IoZHJvbmVzJGlkKQ0KZHJvbmVzJGFiZG9tZW5fcG9zdF9lZSA8LSBhcy5udW1lcmljKGRyb25lcyRhYmRvbWVuX3Bvc3RfZWUpDQpkcm9uZXMkZnVuZ2ljaWRlIDwtIGFzLmZhY3Rvcihkcm9uZXMkZnVuZ2ljaWRlKQ0KZHJvbmVzJGNyaXRoaWRpYSA8LSBhcy5mYWN0b3IoZHJvbmVzJGNyaXRoaWRpYSkNCmJyb29kIDwtIHJlYWRfY3N2KCJicm9vZC5jc3YiKQ0KDQpgYGANCg0KDQojIyMjIE1hbGVzIEVtZXJnZSBEYXlzDQoNCmBgYHtyfQ0KDQplbS5tb2QgPC0gZ2xtZXIubmIoZW1lcmdlIH4gZnVuZ2ljaWRlICsgY3JpdGhpZGlhICsgZHJ5X3dlaWdodCArIHdvcmtlcnNfYWxpdmUgKyBibG9jayArICgxfGNvbG9ueSksIGRhdGEgPSBkcm9uZXMpDQpzdW1tYXJ5KGVtLm1vZCkNCmRyb3AxKGVtLm1vZCwgdGVzdCA9ICJDaGlzcSIpDQplbTEgPC0gdXBkYXRlKGVtLm1vZCwgLn4uIC1ibG9jaykNCmRyb3AxKGVtMSwgdGVzdCA9ICJDaGlzcSIpDQplbTIgPC0gdXBkYXRlKGVtMSwgLn4uIC1kcnlfd2VpZ2h0KQ0KZHJvcDEoZW0yLCB0ZXN0ID0gIkNoaXNxIikNCkFub3ZhKGVtMikNCg0KDQpBbm92YShlbTIpDQpzdW1tYXJ5KGVtMikNCg0KZW1fc3VtIDwtIGRyb25lcyAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKGVtZXJnZSksDQogICAgICAgICAgICBzZCA9IHNkKGVtZXJnZSksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGVtZXJnZSkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KDQplbV9zdW0NCg0KZW1fc3VtJHBsb3QgPC0gZW1fc3VtJG0gKyBlbV9zdW0kc2UNCg0KYGBgDQoNCiMjIyMgTWFsZXMgcmVsYXRpdmUgZmF0IA0KDQpgYGB7cn0NCg0KaGlzdChkcm9uZXMkcmVsYXRpdmVfZmF0KQ0KcmFuZ2UoZHJvbmVzJHJlbGF0aXZlX2ZhdCkNCnNoYXBpcm8udGVzdChkcm9uZXMkcmVsYXRpdmVfZmF0KQ0KZHJvbmVzJHNxcnRfcmYgPC0gKHNxcnQoZHJvbmVzJHJlbGF0aXZlX2ZhdCkpDQpkcm9uZXMkbG9ncmYgPC0gbG9nKGRyb25lcyRyZWxhdGl2ZV9mYXQpDQpzaGFwaXJvLnRlc3QoZHJvbmVzJGxvZ3JmKQ0Kc2hhcGlyby50ZXN0KGRyb25lcyRzcXJ0X3JmKQ0KDQpyZi5tb2QgPC0gbG1lcihzcXJ0X3JmIH4gZnVuZ2ljaWRlICsgY3JpdGhpZGlhICsgd29ya2Vyc19hbGl2ZSArIGJsb2NrICsgKDF8Y29sb255KSwgZGF0YSA9IGRyb25lcykNCmRyb3AxKHJmLm1vZCwgdGVzdCA9ICJDaGlzcSIpDQpyZjIgPC0gdXBkYXRlKHJmLm1vZCwgLn4uIC13b3JrZXJzX2FsaXZlKQ0KZHJvcDEocmYyLCB0ZXN0ID0gIkNoaXNxIikNCkFub3ZhKHJmMikNCg0KcmZfc3VtIDwtIGRyb25lcyAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHJlbGF0aXZlX2ZhdCksDQogICAgICAgICAgICBzZCA9IHNkKHJlbGF0aXZlX2ZhdCksDQogICAgICAgICAgICBuID0gbGVuZ3RoKHJlbGF0aXZlX2ZhdCkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KICANCnJmX3N1bQ0KDQpgYGANCg0KIyMjIyBNYWxlcyByYWRpYWwgY2VsbCANCg0KYGBge3J9DQoNCmhpc3QoZHJvbmVzJHJhZGlhbF91bSkNCnNoYXBpcm8udGVzdChkcm9uZXMkcmFkaWFsX3VtKQ0KcmFuZ2UoZHJvbmVzJHJhZGlhbF91bSkNCmRyb25lcyRjdWJlcmMgPC0gKGRyb25lcyRyYWRpYWxfdW0pXjMNCnNoYXBpcm8udGVzdChkcm9uZXMkY3ViZXJjKQ0KaGlzdChkcm9uZXMkY3ViZXJjKQ0KDQpyY19tb2QgPC0gbG1lcihjdWJlcmMgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyBibG9jayArIHdvcmtlcnNfYWxpdmUgKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJvbmVzKQ0KZHJvcDEocmNfbW9kLCB0ZXN0ID0gIkNoaXNxIikNCnJjMiA8LSB1cGRhdGUocmNfbW9kLCAufi4gLXdvcmtlcnNfYWxpdmUpDQpkcm9wMShyYzIsIHRlc3QgPSAiQ2hpc3EiKQ0KcmMzIDwtIHVwZGF0ZShyYzIsIC5+LiAtYmxvY2spDQpBbm92YShyYzMpDQoNCnJjX3N1bSA8LSBkcm9uZXMgJT4lDQogIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lDQogIHN1bW1hcmlzZShtID0gbWVhbihyYWRpYWxfdW0pLA0KICAgICAgICAgICAgc2QgPSBzZChyYWRpYWxfdW0pLA0KICAgICAgICAgICAgbiA9IGxlbmd0aChyYWRpYWxfdW0pKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KcmNfc3VtDQoNCnJjX3N1bSRwbG90IDwtIHJjX3N1bSRtICsgcmNfc3VtJHNlDQpyY19zdW0NCg0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9IDEyLCBmaWcuaGVpZ2h0PTh9DQpyY19wbG90IDwtIGdncGxvdChyY19zdW0sIGFlcyh4ID0gdHJlYXRtZW50LCB5ID0gbSwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2NvbF9wYXR0ZXJuKA0KICAgIGFlcyhwYXR0ZXJuID0gdHJlYXRtZW50KSwNCiAgICBwYXR0ZXJuX2RlbnNpdHkgPSBjKDAsIDAsIDAuNCwgMCksICAjIEFkZCBkZW5zaXR5IGZvciB0aGUgZm91cnRoIGNvbHVtbg0KICAgIHBhdHRlcm5fc3BhY2luZyA9IDAuMDMsDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpDQogICkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG0gLSBzZSwgeW1heCA9IG0gKyBzZSksIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSkpICsNCiAgbGFicyh4ID0gIlRyZWF0bWVudCIsIHkgPSAiUmFkaWFsIGNlbGwgbGVuZ3RoICh1bSkiKSArDQogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMjApICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygyNjAwLCAyODAwKSkgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCANCiAgICAgICAgICAgeCA9IDEsIHkgPSAyNzQ1LA0KICAgICAgICAgICBsYWJlbCA9ICJQID0gMC4wMiIsDQogICAgICAgICAgIHNpemUgPSA4KSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksICAjIFNldCBheGlzIGxhYmVsIGZvbnQgc2l6ZQ0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpICsgICMgU2V0IGF4aXMgdGl0bGUgZm9udCBzaXplDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkYXJrb3JjaGlkNCIsICJkb2RnZXJibHVlIiwgIm9yYW5nZTQiLCAib3JhbmdlIikpICsNCiAgc2NhbGVfcGF0dGVybl9tYW51YWwodmFsdWVzID0gYygibm9uZSIsICJub25lIiwgInN0cmlwZSIsICJub25lIikpICsgICMgQWRkIHN0cmlwZXMgdG8gdGhlIGZvdXJ0aCBjb2x1bW4NCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjdXN0b21fbGFiZWxzKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDIsIHhlbmQgPSAzLCB5ID0gMjcxMCwgeWVuZCA9IDI3MTAsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDIsIHhlbmQgPSAyLCB5ID0gMjcwMCwgeWVuZCA9IDI3MjAsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDMsIHhlbmQgPSAzLCB5ID0gMjcwMCwgeWVuZCA9IDI3MjAsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDEsIHhlbmQgPSA0LCB5ID0gMjc5MCwgeWVuZCA9IDI3OTAsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDEsIHhlbmQgPSAxLCB5ID0gMjc4MCwgeWVuZCA9IDI4MDAsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDQsIHhlbmQgPSA0LCB5ID0gMjc4MCwgeWVuZCA9IDI4MDAsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3RleHQoeCA9IDIuNSwgeSA9IDI3MTIsIGxhYmVsID0gImIiLCBzaXplID0gNiwgdmp1c3QgPSAtMC41KSArDQogIGdlb21fdGV4dCh4ID0gMi41LCB5ID0gMjc5MiwgbGFiZWwgPSAiYSIsIHNpemUgPSA2LCB2anVzdCA9IC0wLjUpDQoNCnJjX3Bsb3QNCmBgYA0KDQojIyMjIFRvdGFsIGNvdW50IG9mIG1hbGVzIA0KDQpgYGB7cn0NCmJyb29kIDwtIHJlYWRfY3N2KCJicm9vZC5jc3YiKQ0KDQpicm9vZCA8LSByZWFkX2NzdigiYnJvb2QuY3N2IikNCmJyb29kJGNvbG9ueSA8LSBhcy5mYWN0b3IoYnJvb2QkY29sb255KQ0KYnJvb2QkdHJlYXRtZW50IDwtIGFzLmZhY3Rvcihicm9vZCR0cmVhdG1lbnQpDQpicm9vZCRibG9jayA8LSBhcy5mYWN0b3IoYnJvb2QkYmxvY2spDQpicm9vZCRmdW5naWNpZGUgPC0gYXMubG9naWNhbChicm9vZCRmdW5naWNpZGUpDQpicm9vZCRjcml0aGlkaWEgPC0gYXMubG9naWNhbChicm9vZCRjcml0aGlkaWEpDQoNCm1hbGVfY291bnQgPC0gZ2xtLm5iKHRvdGFsX2Ryb25lcyB+IGZ1bmdpY2lkZSArIGNyaXRoaWRpYSArIGJsb2NrICsgd29ya2Vyc19hbGl2ZSwgZGF0YSA9IGJyb29kKQ0KZHJvcDEobWFsZV9jb3VudCwgdGVzdCA9ICJDaGlzcSIpDQpBbm92YShtYWxlX2NvdW50KQ0Kc3VtbWFyeShtYWxlX2NvdW50KQ0KDQptMCA8LSBnbG1tVE1CKHRvdGFsX2Ryb25lcyB+IGZ1bmdpY2lkZSArIGNyaXRoaWRpYSArIGJsb2NrICsgd29ya2Vyc19hbGl2ZSwgZGF0YSA9IGJyb29kKQ0KQW5vdmEobTApDQoNCm1jX3N1bSA8LSBicm9vZCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHRvdGFsX2Ryb25lcyksDQogICAgICAgICAgICBuID0gbGVuZ3RoKHRvdGFsX2Ryb25lcyksDQogICAgICAgICAgICBzZCA9IHNkKHRvdGFsX2Ryb25lcykpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KDQptY19zdW0NCmBgYA0KDQojIyMjIE1hbGUgZHJ5IHdlaWdodA0KDQpgYGB7cn0NCmhpc3QoZHJvbmVzJGRyeV93ZWlnaHQpDQpzaGFwaXJvLnRlc3QoZHJvbmVzJGRyeV93ZWlnaHQpDQoNCnJhbmdlKGRyb25lcyRkcnlfd2VpZ2h0KQ0KZHJvbmVzJGxvZy5kcnlfd2VpZ2h0IDwtIGxvZygoZHJvbmVzJGRyeV93ZWlnaHQpKQ0Kc2hhcGlyby50ZXN0KGRyb25lcyRsb2cuZHJ5X3dlaWdodCkNCmhpc3QoZHJvbmVzJGxvZy5kcnlfd2VpZ2h0KQ0KDQoNCm1kdyA8LSBsbWVyKGRyeV93ZWlnaHQgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyBibG9jayArIHdvcmtlcnNfYWxpdmUgKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJvbmVzICkNCmRyb3AxKG1kdywgdGVzdCA9ICJDaGlzcSIpDQpBbm92YShtZHcpDQoNCnFxbm9ybShyZXNpZChtZHcpKTtxcWxpbmUocmVzaWQobWR3KSkNCg0KbWFsZV9kdyA8LSBkcm9uZXMgJT4lDQogIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lDQogIHN1bW1hcmlzZShtID0gbWVhbihkcnlfd2VpZ2h0KSwNCiAgICAgICAgICAgIHNkID0gc2QoZHJ5X3dlaWdodCksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGRyeV93ZWlnaHQpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCm1hbGVfZHcNCg0KYGBgDQoNCg0KIyMgV29ya2VyIGRyeSB3ZWlnaHRzDQoNCmBgYHtyfQ0Kd29ya2VycyA8LSBuYS5vbWl0KHdvcmtlcnMpDQoNCndvcmtlcnMgPC0gcmVhZF9jc3YoIndvcmtlcnMuY3N2IikNCndvcmtlcnMkY29sb255IDwtIGFzLmZhY3Rvcih3b3JrZXJzJGNvbG9ueSkNCndvcmtlcnMkdHJlYXRtZW50IDwtIGFzLmZhY3Rvcih3b3JrZXJzJHRyZWF0bWVudCkNCndvcmtlcnMkYmxvY2sgPC0gYXMuZmFjdG9yKHdvcmtlcnMkYmxvY2spDQp3b3JrZXJzJHFybyA8LSBhcy5mYWN0b3Iod29ya2VycyRxcm8pDQp3b3JrZXJzJGlub2N1bGF0ZSA8LSBhcy5sb2dpY2FsKHdvcmtlcnMkaW5vY3VsYXRlKQ0KDQpgYGANCg0KYGBge3J9DQp3b3JrZXJzJGRyeSA8LSBhcy5kb3VibGUod29ya2VycyRkcnkpDQpoaXN0KHdvcmtlcnMkZHJ5KQ0Kc2hhcGlyby50ZXN0KHdvcmtlcnMkZHJ5KQ0Kd29ya2VycyRsb2dkcnkgPC0gbG9nKHdvcmtlcnMkZHJ5KQ0Kc2hhcGlyby50ZXN0KHdvcmtlcnMkbG9nZHJ5KQ0KaGlzdCh3b3JrZXJzJGxvZ2RyeSkNCndvcmtlcnMkZnVuZ2ljaWRlIDwtIGFzLmxvZ2ljYWwod29ya2VycyRmdW5naWNpZGUpDQp3b3JrZXJzJGNyaXRoaWRpYSA8LSBhcy5sb2dpY2FsKHdvcmtlcnMkY3JpdGhpZGlhKQ0KDQp3cmtkcnkxIDwtIGxtZXIobG9nZHJ5IH4gZnVuZ2ljaWRlKmNyaXRoaWRpYSArIGlub2N1bGF0ZSArYmxvY2sgKyAoMXxjb2xvbnkpLCBkYXRhID0gd29ya2VycykNCmRyb3AxKHdya2RyeTEsIHRlc3QgPSAiQ2hpc3EiKQ0KDQp3cmtkcnkgPC0gbG1lcihsb2dkcnkgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyBpbm9jdWxhdGUgK2Jsb2NrICsgKDF8Y29sb255KSwgZGF0YSA9IHdvcmtlcnMpDQpkcm9wMSh3cmtkcnksIHRlc3QgPSAiQ2hpc3EiKQ0KDQphbm92YSh3cmtkcnkxLCB3cmtkcnksIHRlc3QgPSAiQ2hpc3EiKQ0KDQpBbm92YSh3cmtkcnkxKQ0KDQpzdW1tYXJ5KHdya2RyeSkNCndya2RyeTEgPC0gdXBkYXRlKHdya2RyeSwgLn4uIC1pbm9jdWxhdGUpDQpkcm9wMSh3cmtkcnkxLCB0ZXN0ID0gIkNoaXNxIikNCndtMiA8LSB1cGRhdGUod3JrZHJ5MSwgLn4uIC1mdW5naWNpZGUpDQpkcm9wMSh3bTIsIHRlc3QgPSAiQ2hpc3EiKQ0KYW5vdmEod3JrZHJ5LCB3bTIsIHRlc3QgPSAiQ2hpc3EiKQ0Kc3VtbWFyeSh3cmtkcnkxKQ0KQW5vdmEod3JrZHJ5MSkNCg0KcXFub3JtKHJlc2lkKHdya2RyeTEpKTtxcWxpbmUocmVzaWQod3JrZHJ5MSkpDQoNCnBlIDwtIGVtbWVhbnMod3JrZHJ5MSwgcGFpcndpc2UgfiBjcml0aGlkaWEsIHR5cGUgPSAicmVzcG9uc2UiKQ0KcGUNCnBhaXJzKHBlKQ0KDQpwZWYgPC0gZW1tZWFucyh3cmtkcnkxLCBwYWlyd2lzZSB+IGZ1bmdpY2lkZSwgdHlwZSA9ICJyZXNwb25zZSIpDQpwZWYNCg0Kd3JrZHJ5LmRmIDwtIG5hLm9taXQod29ya2VycykNCg0Kd3JrZHJ5c3VtIDwtIHdya2RyeS5kZiAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKGRyeSksDQogICAgICAgICAgICBzZCA9IHNkKGRyeSksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGRyeSkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KDQp3cmtkcnlzdW0NCg0Kd3R1ay5tZWFucyA8LSBlbW1lYW5zKG9iamVjdCA9IHdya2RyeTEsDQogICAgICAgICAgICAgICAgICAgICAgc3BlY3MgPSAiY3JpdGhpZGlhIiwNCiAgICAgICAgICAgICAgICAgICAgICBhZGp1c3QgPSAiVHVrZXkiLA0KICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQp3dHVrLm1lYW5zDQoNCncuY2xkLm1vZGVsIDwtIGNsZChvYmplY3QgPSB3dHVrLm1lYW5zLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9ICJUdWtleSIsDQogICAgICAgICAgICAgICAgICAgTGV0dGVycyA9IGxldHRlcnMsDQogICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjA1KQ0Kdy5jbGQubW9kZWwNCg0KYmxvY2tkcnkgPC0gZW1tZWFucyh3cmtkcnkxLCBwYWlyd2lzZSB+IGJsb2NrLCB0eXBlID0gInJlc3BvbnNlIikNCmJsb2NrZHJ5bWVhbnMgPC0gYXMuZGF0YS5mcmFtZShibG9ja2RyeSRlbW1lYW5zKQ0KDQpgYGANCiMjIyMgcGxvdCB3b3JrZXIgZHJ5IHdlaWdodHMNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQ0Kd29ya19kcnkgPC0gZ2dwbG90KGRhdGEgPSB3cmtkcnlzdW0sIGFlcyh4ID0gdHJlYXRtZW50LCB5ID0gbSwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9jb2woY29sID0gImJsYWNrIikgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMC4wOCkpICsNCiAgbGFicyh4ID0gIlRyZWF0bWVudCIsIHkgPSAiV29ya2VyIERyeSBXZWlnaHQgKGcpIikgKw0KICBnZW9tX2NvbF9wYXR0ZXJuKA0KICAgIGFlcyhwYXR0ZXJuID0gdHJlYXRtZW50KSwNCiAgICBwYXR0ZXJuX2RlbnNpdHkgPSBjKDAsIDAsIDAuNCwgMCksICAjIEFkZCBkZW5zaXR5IGZvciB0aGUgZm91cnRoIGNvbHVtbg0KICAgIHBhdHRlcm5fc3BhY2luZyA9IDAuMDMsDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpDQogICkgKyANCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG0gLSBzZSwgeW1heCA9IG0gKyBzZSksIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSkpICArIA0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIwKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSA0LA0KICAgIHkgPSAwLjA3OSwNCiAgICBsYWJlbCA9ICJQIDwgMC4wMSIsDQogICAgc2l6ZSA9IDcNCiAgKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjdXN0b21fbGFiZWxzKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtvcmNoaWQ0IiwgImRvZGdlcmJsdWUiLCAib3JhbmdlNCIsICJvcmFuZ2UiKSkgKw0KICBzY2FsZV9wYXR0ZXJuX21hbnVhbCh2YWx1ZXMgPSBjKCJub25lIiwgIm5vbmUiLCAic3RyaXBlIiwgIm5vbmUiKSkgKyANCiAgZ2VvbV9zZWdtZW50KHggPSAxLCB4ZW5kID0gMiwgeSA9IDAuMDcsIHllbmQgPSAwLjA3LCANCiAgICAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiLCBsaW5lam9pbiA9ICJyb3VuZCIpICsNCiAgZ2VvbV9zZWdtZW50KHggPSAxLCB4ZW5kID0gMSwgeSA9IDAuMDcsIHllbmQgPSAwLjA2OSwgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fc2VnbWVudCh4ID0gMiwgeGVuZCA9IDIsIHkgPSAwLjA3LCB5ZW5kID0gMC4wNjksIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDMsIHhlbmQgPSA0LCB5ID0gMC4wNiwgeWVuZCA9IDAuMDYsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDMsIHhlbmQgPSAzLCB5ID0gMC4wNiwgeWVuZCA9IDAuMDU5LCANCiAgICAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiLCBsaW5lam9pbiA9ICJyb3VuZCIpICsNCiAgZ2VvbV9zZWdtZW50KHggPSA0LCB4ZW5kID0gNCwgeSA9IDAuMDYsIHllbmQgPSAwLjA1OSwgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fdGV4dCh4ID0gMS41LCB5ID0gMC4wNzEsIGxhYmVsID0gImEiLCBzaXplID0gNiwgdmp1c3QgPSAtMC41KSArDQogIGdlb21fdGV4dCh4ID0gMy41LCB5ID0gMC4wNjEsIGxhYmVsID0gImIiLCBzaXplID0gNiwgdmp1c3QgPSAtMC41KQ0KDQp3b3JrX2RyeQ0KDQpgYGANCg0KIyMjIyBUb3RhbCBicm9vZCBjZWxscyANCg0KYGBge3J9DQoNCmJjbSA8LSBnbG0ubmIoYnJvb2RfY2VsbHMgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyB3b3JrZXJzX2FsaXZlICsgYmxvY2ssIGRhdGEgPSBicm9vZCkNCkFub3ZhKGJjbSkNCg0KYl9zdW0gPC0gYnJvb2QgJT4lDQogIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lDQogIHN1bW1hcmlzZShtID0gbWVhbihicm9vZF9jZWxscyksIA0KICAgICAgICAgICAgc2QgPSBzZChicm9vZF9jZWxscyksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGJyb29kX2NlbGxzKSkgJT4lDQogIG11dGF0ZShzZSA9IHNkL3NxcnQobikpDQoNCmJfc3VtDQpgYGANCg0KIyMjIyBIb25leSBwb3RzIA0KDQpgYGB7cn0NCmhwbSA8LSBnbG0oaG9uZXlfcG90cyB+IGZ1bmdpY2lkZSArIGNyaXRoaWRpYSArIHdvcmtlcnNfYWxpdmUgKyBibG9jaywgZGF0YSA9IGJyb29kLCBmYW1pbHkgPSAicG9pc3NvbiIpDQpBbm92YShocG0pDQoNCmhwX3N1bSA8LSBicm9vZCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKGhvbmV5X3BvdHMpLCANCiAgICAgICAgICAgIHNkID0gc2QoaG9uZXlfcG90cyksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGhvbmV5X3BvdHMpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KaHBfc3VtDQoNCmBgYA0KDQojIyMjIExhcnZhZSANCg0KYGBge3J9DQoNCnRsbSA8LSBnbG0ubmIodG90YWxfbGFydmFlIH4gZnVuZ2ljaWRlICsgY3JpdGhpZGlhICsgd29ya2Vyc19hbGl2ZSArIGJsb2NrLCBkYXRhID0gYnJvb2QpDQpBbm92YSh0bG0pDQoNCnRsX3N1bSA8LSBicm9vZCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHRvdGFsX2xhcnZhZSksIA0KICAgICAgICAgICAgc2QgPSBzZCh0b3RhbF9sYXJ2YWUpLA0KICAgICAgICAgICAgbiA9IGxlbmd0aCh0b3RhbF9sYXJ2YWUpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KdGxfc3VtDQoNCg0KZGxtIDwtIGdsbS5uYihkZWFkX2xhcnZhZSB+IGZ1bmdpY2lkZSArIGNyaXRoaWRpYSArIHdvcmtlcnNfYWxpdmUsIGRhdGEgPSBicm9vZCkNCkFub3ZhKGRsbSkNCg0KZGxfc3VtIDwtIGJyb29kICU+JQ0KICBncm91cF9ieSh0cmVhdG1lbnQpICU+JQ0KICBzdW1tYXJpc2UobSA9IG1lYW4oZGVhZF9sYXJ2YWUpLCANCiAgICAgICAgICAgIHNkID0gc2QoZGVhZF9sYXJ2YWUpLA0KICAgICAgICAgICAgbiA9IGxlbmd0aChkZWFkX2xhcnZhZSkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KDQpkbF9zdW0NCg0KDQpsbG0gPC0gZ2xtLm5iKGxpdmVfbGFydmFlIH4gZnVuZ2ljaWRlICsgY3JpdGhpZGlhICsgd29ya2Vyc19hbGl2ZSArIGJsb2NrLCBkYXRhID0gYnJvb2QpDQpBbm92YShsbG0pDQoNCmxsX3N1bSA8LSBicm9vZCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKGxpdmVfbGFydmFlKSwgDQogICAgICAgICAgICBzZCA9IHNkKGxpdmVfbGFydmFlKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgobGl2ZV9sYXJ2YWUpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KbGxfc3VtDQoNCg0KcGxtb2QgPC0gZ2xtKGNiaW5kKGxpdmVfbGFydmFlLCBkZWFkX2xhcnZhZSkgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyBibG9jayArIHdvcmtlcnNfYWxpdmUsIGRhdGEgPSBicm9vZCwgZmFtaWx5ID0gYmlub21pYWwoImxvZ2l0IikpDQpBbm92YShwbG1vZCkNCg0KYGBgDQoNCiMjIyMgUHVwYWUgDQoNCmBgYHtyfQ0KdHBtIDwtIGdsbSh0b3RhbF9wdXBhZSB+IGZ1bmdpY2lkZSArIGNyaXRoaWRpYSArIHdvcmtlcnNfYWxpdmUgKyBibG9jaywgZGF0YSA9IGJyb29kLCBmYW1pbHkgPSAicG9pc3NvbiIpDQpBbm92YSh0cG0pDQoNCnRwX3N1bSA8LSBicm9vZCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHRvdGFsX3B1cGFlKSwgDQogICAgICAgICAgICBzZCA9IHNkKHRvdGFsX3B1cGFlKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgodG90YWxfcHVwYWUpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KdHBfc3VtDQoNCg0KZHBtIDwtIGdsbS5uYihkZWFkX3B1cGFlIH4gZnVuZ2ljaWRlICsgY3JpdGhpZGlhICsgd29ya2Vyc19hbGl2ZSArIGJsb2NrLCBkYXRhID0gYnJvb2QpDQpBbm92YShkcG0pDQoNCmRwX3N1bSA8LSBicm9vZCAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKG0gPSBtZWFuKGRlYWRfcHVwYWUpLCANCiAgICAgICAgICAgIHNkID0gc2QoZGVhZF9wdXBhZSksDQogICAgICAgICAgICBuID0gbGVuZ3RoKGRlYWRfcHVwYWUpKSAlPiUNCiAgbXV0YXRlKHNlID0gc2Qvc3FydChuKSkNCg0KZHBfc3VtDQoNCg0KbHBtIDwtIGdsbShsaXZlX3B1cGFlIH4gZnVuZ2ljaWRlICsgY3JpdGhpZGlhICsgd29ya2Vyc19hbGl2ZSArIGJsb2NrLCBkYXRhID0gYnJvb2QsIGZhbWlseSA9ICJwb2lzc29uIikNCkFub3ZhKGxwbSkNCg0KbHBfc3VtIDwtIGJyb29kICU+JQ0KICBncm91cF9ieSh0cmVhdG1lbnQpICU+JQ0KICBzdW1tYXJpc2UobSA9IG1lYW4obGl2ZV9wdXBhZSksIA0KICAgICAgICAgICAgc2QgPSBzZChsaXZlX3B1cGFlKSwNCiAgICAgICAgICAgIG4gPSBsZW5ndGgobGl2ZV9wdXBhZSkpICU+JQ0KICBtdXRhdGUoc2UgPSBzZC9zcXJ0KG4pKQ0KDQpscF9zdW0NCg0KDQpwcG1vZCA8LSBnbG0oY2JpbmQobGl2ZV9wdXBhZSwgZGVhZF9wdXBhZSkgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyB3b3JrZXJzX2FsaXZlLCBkYXRhID0gYnJvb2QsIGZhbWlseSA9IGJpbm9taWFsKCJsb2dpdCIpKQ0KQW5vdmEocHBtb2QpDQoNCg0KDQpgYGANCg0KIyMjIyMgcGxvdCB0b3RhbCBwdXBhZQ0KDQpgYGB7ciwgZmlnLndpZHRoPSAxMCwgZmlnLmhlaWdodD0gOH0NCmxpdmVfcHVwIDwtIGdncGxvdChkYXRhID0gbHBfc3VtLCBhZXMoeCA9IHRyZWF0bWVudCwgeSA9IG0sIGZpbGwgPSB0cmVhdG1lbnQpKSArDQogIGdlb21fY29sKGNvbCA9ICJibGFjayIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEzKSkgKw0KICBsYWJzKHggPSAiVHJlYXRtZW50IiwgeSA9ICJMaXZlIFB1cGFlIENvdW50IikgKw0KICBnZW9tX2NvbF9wYXR0ZXJuKA0KICAgIGFlcyhwYXR0ZXJuID0gdHJlYXRtZW50KSwNCiAgICBwYXR0ZXJuX2RlbnNpdHkgPSBjKDAsIDAsIDAuNCwgMCksICAjIEFkZCBkZW5zaXR5IGZvciB0aGUgZm91cnRoIGNvbHVtbg0KICAgIHBhdHRlcm5fc3BhY2luZyA9IDAuMDMsDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpDQogICkgKyANCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG0gLSBzZSwgeW1heCA9IG0gKyBzZSksIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSkpICArIA0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIwKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBhbm5vdGF0ZSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIHggPSA0LA0KICAgIHkgPSAxMiwNCiAgICBsYWJlbCA9ICJQID0gMC4wMiIsDQogICAgc2l6ZSA9IDcNCiAgKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjdXN0b21fbGFiZWxzKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtvcmNoaWQ0IiwgImRvZGdlcmJsdWUiLCAib3JhbmdlNCIsICJvcmFuZ2UiKSkgKw0KICBzY2FsZV9wYXR0ZXJuX21hbnVhbCh2YWx1ZXMgPSBjKCJub25lIiwgIm5vbmUiLCAic3RyaXBlIiwgIm5vbmUiKSkgKyANCiAgZ2VvbV9zZWdtZW50KHggPSAxLCB4ZW5kID0gMiwgeSA9IDEyLCB5ZW5kID0gMTIsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDEsIHhlbmQgPSAxLCB5ID0gMTEuNywgeWVuZCA9IDEyLjMsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDIsIHhlbmQgPSAyLCB5ID0gMTEuNywgeWVuZCA9IDEyLjMsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDMsIHhlbmQgPSA0LCB5ID0gNywgeWVuZCA9IDcsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDMsIHhlbmQgPSAzLCB5ID0gNi43LCB5ZW5kID0gNy4zLCANCiAgICAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiLCBsaW5lam9pbiA9ICJyb3VuZCIpICsNCiAgZ2VvbV9zZWdtZW50KHggPSA0LCB4ZW5kID0gNCwgeSA9IDYuNywgeWVuZCA9IDcuMywgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fdGV4dCh4ID0gMS41LCB5ID0gMTIuMSwgbGFiZWwgPSAiYSIsIHNpemUgPSA2LCB2anVzdCA9IC0wLjUpICsNCiAgZ2VvbV90ZXh0KHggPSAzLjUsIHkgPSA3LjEsIGxhYmVsID0gImIiLCBzaXplID0gNiwgdmp1c3QgPSAtMC41KQ0KDQpsaXZlX3B1cA0KDQp0cF9wbG90IDwtIGdncGxvdChkYXRhID0gdHBfc3VtLCBhZXMoeCA9IHRyZWF0bWVudCwgeSA9IG0sIGZpbGwgPSB0cmVhdG1lbnQpKSArDQogIGdlb21fY29sKGNvbCA9ICJibGFjayIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEzKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgbGFicyh4ID0gIlRyZWF0bWVudCIsIHkgPSAiVG90YWwgUHVwYWUgQ291bnQiKSArDQogIGdlb21fY29sX3BhdHRlcm4oDQogICAgYWVzKHBhdHRlcm4gPSB0cmVhdG1lbnQpLA0KICAgIHBhdHRlcm5fZGVuc2l0eSA9IGMoMCwgMCwgMC40LCAwKSwgICMgQWRkIGRlbnNpdHkgZm9yIHRoZSBmb3VydGggY29sdW1uDQogICAgcGF0dGVybl9zcGFjaW5nID0gMC4wMywNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSkNCiAgKSArIA0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbSAtIHNlLCB5bWF4ID0gbSArIHNlKSwgd2lkdGggPSAwLjIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSkgICsgDQogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMjApICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGFubm90YXRlKA0KICAgIGdlb20gPSAidGV4dCIsDQogICAgeCA9IDQsDQogICAgeSA9IDEyLA0KICAgIGxhYmVsID0gIlAgPSAwLjAzIiwNCiAgICBzaXplID0gNw0KICApICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGN1c3RvbV9sYWJlbHMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya29yY2hpZDQiLCAiZG9kZ2VyYmx1ZSIsICJvcmFuZ2U0IiwgIm9yYW5nZSIpKSArDQogIHNjYWxlX3BhdHRlcm5fbWFudWFsKHZhbHVlcyA9IGMoIm5vbmUiLCAibm9uZSIsICJzdHJpcGUiLCAibm9uZSIpKSArIA0KICBnZW9tX3NlZ21lbnQoeCA9IDEsIHhlbmQgPSAyLCB5ID0gMTIsIHllbmQgPSAxMiwgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fc2VnbWVudCh4ID0gMSwgeGVuZCA9IDEsIHkgPSAxMS43LCB5ZW5kID0gMTIuMywgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fc2VnbWVudCh4ID0gMiwgeGVuZCA9IDIsIHkgPSAxMS43LCB5ZW5kID0gMTIuMywgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fc2VnbWVudCh4ID0gMywgeGVuZCA9IDQsIHkgPSA3LCB5ZW5kID0gNywgDQogICAgICAgICAgICAgICBsaW5lZW5kID0gInJvdW5kIiwgbGluZWpvaW4gPSAicm91bmQiKSArDQogIGdlb21fc2VnbWVudCh4ID0gMywgeGVuZCA9IDMsIHkgPSA2LjcsIHllbmQgPSA3LjMsIA0KICAgICAgICAgICAgICAgbGluZWVuZCA9ICJyb3VuZCIsIGxpbmVqb2luID0gInJvdW5kIikgKw0KICBnZW9tX3NlZ21lbnQoeCA9IDQsIHhlbmQgPSA0LCB5ID0gNi43LCB5ZW5kID0gNy4zLCANCiAgICAgICAgICAgICAgIGxpbmVlbmQgPSAicm91bmQiLCBsaW5lam9pbiA9ICJyb3VuZCIpICsNCiAgZ2VvbV90ZXh0KHggPSAxLjUsIHkgPSAxMi4xLCBsYWJlbCA9ICJhIiwgc2l6ZSA9IDYsIHZqdXN0ID0gLTAuNSkgKw0KICBnZW9tX3RleHQoeCA9IDMuNSwgeSA9IDcuMSwgbGFiZWwgPSAiYiIsIHNpemUgPSA2LCB2anVzdCA9IC0wLjUpDQoNCnRwX3Bsb3QNCg0KDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTE1fQ0KcGxvdF9ncmlkKHRwX3Bsb3QsIGxpdmVfcHVwLCBuY29sPTEsIG5yb3cgPTIpDQpgYGANCg0KDQojIyMjIEVnZ3MNCg0KYGBge3J9DQoNCmVnZy5tb2QgPC0gZ2xtLm5iKGVnZ3MgfiBmdW5naWNpZGUgKyBjcml0aGlkaWEgKyB3b3JrZXJzX2FsaXZlICsgYmxvY2ssIGRhdGEgPSBicm9vZCkNCmRyb3AxKGVnZy5tb2QsIHRlc3QgPSAiQ2hpc3EiKQ0KQW5vdmEoZWdnLm1vZCkNCg0KYGBgDQoNCg0KIyBGaWd1cmVzIGZvciBzdXBwbGVtZW50YWwgbWF0ZXJpYWwgDQoNCg0KIyMgU3BhdGlhbCBCbG9jayBzdW1tYXJ5DQoNCmBgYHtyfQ0KDQpibG9ja19zdW0gPC0gYnJvb2QgJT4lDQogIGdyb3VwX2J5KGJsb2NrKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG1iYyA9IG1lYW4oYnJvb2RfY2VsbHMpLA0KICAgIHNkYmMgPSBzZChicm9vZF9jZWxscyksDQogICAgbmJjID0gbGVuZ3RoKGJyb29kX2NlbGxzKSwNCiAgICANCiAgICAjIExhcnZhZQ0KICAgIG1sID0gbWVhbihsaXZlX2xhcnZhZSksDQogICAgc2RsID0gc2QobGl2ZV9sYXJ2YWUpLA0KICAgIG5sID0gbGVuZ3RoKGxpdmVfbGFydmFlKSwNCiAgICANCiAgICBtZGwgPSBtZWFuKGRlYWRfbGFydmFlKSwNCiAgICBzZGRsID0gc2QoZGVhZF9sYXJ2YWUpLA0KICAgIG5kbCA9IGxlbmd0aChkZWFkX2xhcnZhZSksDQogICAgDQogICAgbXRsID0gbWVhbih0b3RhbF9sYXJ2YWUpLA0KICAgIHNkdGwgPSBzZCh0b3RhbF9sYXJ2YWUpLA0KICAgIG50bCA9IGxlbmd0aCh0b3RhbF9sYXJ2YWUpLA0KICAgIA0KICAgICMgUHVwYWUNCiAgICBtcCA9IG1lYW4obGl2ZV9wdXBhZSksDQogICAgc2RwID0gc2QobGl2ZV9wdXBhZSksDQogICAgbnAgPSBsZW5ndGgobGl2ZV9wdXBhZSksDQogICAgDQogICAgbWRwID0gbWVhbihkZWFkX3B1cGFlKSwNCiAgICBzZGRwID0gc2QoZGVhZF9wdXBhZSksDQogICAgbmRwID0gbGVuZ3RoKGRlYWRfcHVwYWUpLA0KICAgIA0KICAgIG10cCA9IG1lYW4odG90YWxfcHVwYWUpLA0KICAgIHNkdHAgPSBzZCh0b3RhbF9wdXBhZSksDQogICAgbnRwID0gbGVuZ3RoKHRvdGFsX3B1cGFlKSwNCiAgICANCiAgICAjIEVnZ3MNCiAgICBtZSA9IG1lYW4oZWdncyksDQogICAgc2RlID0gc2QoZWdncyksDQogICAgbmUgPSBsZW5ndGgoZWdncyksDQogICAgDQogICAgIyBIb25leSBwb3RzDQogICAgbWhwID0gbWVhbihob25leV9wb3RzKSwNCiAgICBzZGhwID0gc2QoaG9uZXlfcG90cyksDQogICAgbmhwID0gbGVuZ3RoKGhvbmV5X3BvdHMpLA0KICAgIA0KICAgICMgRHJvbmVzDQogICAgbXRkID0gbWVhbih0b3RhbF9kcm9uZXMpLA0KICAgIHNkdGQgPSBzZCh0b3RhbF9kcm9uZXMpLA0KICAgIG50ZCA9IGxlbmd0aCh0b3RhbF9kcm9uZXMpDQogICkNCg0KDQojd3JpdGUuY3N2KGJsb2NrX3N1bSwgZmlsZSA9ICJDOi9Vc2Vycy9ydW5uaS9PbmVEcml2ZSAtIFRoZSBPaGlvIFN0YXRlIFVuaXZlcnNpdHkvUnVubmlvbiBhbmQgU2l2YWtvZmYvU3luZXJnaXNtIEV4cGVyaW1lbnQvRGlzZWFzZSBEeW5hbWljcyBNYW51c2NyaXB0L0RhdGEgYW5kIGNvZGUvYmxvY2tfc3VtLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KDQpgYGANCg0KDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpibG9ja19zdW0gPC0gYnJvb2QgJT4lDQogIGdyb3VwX2J5KGJsb2NrKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG1iYyA9IG1lYW4oYnJvb2RfY2VsbHMpLA0KICAgIHNkYmMgPSBzZChicm9vZF9jZWxscyksDQogICAgbmJjID0gbGVuZ3RoKGJyb29kX2NlbGxzKSwNCiAgICANCiAgICAjIExhcnZhZQ0KICAgIG1sID0gbWVhbihsaXZlX2xhcnZhZSksDQogICAgc2RsID0gc2QobGl2ZV9sYXJ2YWUpLA0KICAgIG5sID0gbGVuZ3RoKGxpdmVfbGFydmFlKSwNCiAgICANCiAgICBtZGwgPSBtZWFuKGRlYWRfbGFydmFlKSwNCiAgICBzZGRsID0gc2QoZGVhZF9sYXJ2YWUpLA0KICAgIG5kbCA9IGxlbmd0aChkZWFkX2xhcnZhZSksDQogICAgDQogICAgbXRsID0gbWVhbih0b3RhbF9sYXJ2YWUpLA0KICAgIHNkdGwgPSBzZCh0b3RhbF9sYXJ2YWUpLA0KICAgIG50bCA9IGxlbmd0aCh0b3RhbF9sYXJ2YWUpLA0KICAgIA0KICAgICMgUHVwYWUNCiAgICBtcCA9IG1lYW4obGl2ZV9wdXBhZSksDQogICAgc2RwID0gc2QobGl2ZV9wdXBhZSksDQogICAgbnAgPSBsZW5ndGgobGl2ZV9wdXBhZSksDQogICAgDQogICAgbWRwID0gbWVhbihkZWFkX3B1cGFlKSwNCiAgICBzZGRwID0gc2QoZGVhZF9wdXBhZSksDQogICAgbmRwID0gbGVuZ3RoKGRlYWRfcHVwYWUpLA0KICAgIA0KICAgIG10cCA9IG1lYW4odG90YWxfcHVwYWUpLA0KICAgIHNkdHAgPSBzZCh0b3RhbF9wdXBhZSksDQogICAgbnRwID0gbGVuZ3RoKHRvdGFsX3B1cGFlKSwNCiAgICANCiAgICAjIEVnZ3MNCiAgICBtZSA9IG1lYW4oZWdncyksDQogICAgc2RlID0gc2QoZWdncyksDQogICAgbmUgPSBsZW5ndGgoZWdncyksDQogICAgDQogICAgIyBIb25leSBwb3RzDQogICAgbWhwID0gbWVhbihob25leV9wb3RzKSwNCiAgICBzZGhwID0gc2QoaG9uZXlfcG90cyksDQogICAgbmhwID0gbGVuZ3RoKGhvbmV5X3BvdHMpLA0KICAgIA0KICAgICMgRHJvbmVzDQogICAgbXRkID0gbWVhbih0b3RhbF9kcm9uZXMpLA0KICAgIHNkdGQgPSBzZCh0b3RhbF9kcm9uZXMpLA0KICAgIG50ZCA9IGxlbmd0aCh0b3RhbF9kcm9uZXMpDQogICkNCg0KYmxvY2tfc3VtX2xvbmcgPC0gYmxvY2tfc3VtICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJtIiksICAjIFNlbGVjdCBhbGwgbWVhbiBjb2x1bW5zDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ2YXJpYWJsZSIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWVhbl92YWx1ZSIpICU+JQ0KICBtdXRhdGUodmFyaWFibGUgPSBmYWN0b3IodmFyaWFibGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygibWwiLCAibWRsIiwgIm10bCIsICJtcCIsICJtZHAiLCAibXRwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZSIsICJtaHAiLCAibXRkIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMaXZlIExhcnZhZSIsICJEZWFkIExhcnZhZSIsICJUb3RhbCBMYXJ2YWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGl2ZSBQdXBhZSIsICJEZWFkIFB1cGFlIiwgIlRvdGFsIFB1cGFlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVnZ3MiLCAiSG9uZXkgUG90cyIsICJUb3RhbCBEcm9uZXMiKSkpDQoNCiMgQ3JlYXRlIHRoZSBwbG90DQpnZ3Bsb3QoYmxvY2tfc3VtX2xvbmcsIGFlcyh4ID0gdmFyaWFibGUsIHkgPSBtZWFuX3ZhbHVlLCBmaWxsID0gYmxvY2spKSArDQogIGdlb21fY29sKCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIk1lYW4gVmFsdWVzIG9mIEJyb29kIFZhcmlhYmxlcyBieSBCbG9jayIsDQogICAgICAgeCA9ICJWYXJpYWJsZSIsDQogICAgICAgeSA9ICJNZWFuIFZhbHVlIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJBIikgIyBPcHRpb25hbCBjb2xvciBzY2hlbWUgZm9yIGRpZmZlcmVudGlhdGlvbg0KYGBgDQoNCg0KIyMgUm91bmQgcGxvdCANCg0KYGBge3J9DQphZGxfcm91bmRfc3VtIDwtIGFkbCAlPiUNCiAgZ3JvdXBfYnkocm91bmQpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbW1heCA9IG1lYW4obWF4X2luZmMsIG5hLnJtID0gVFJVRSksDQogICAgc2VfbW1heCA9IHNkKG1heF9pbmZjLCBuYS5ybSA9IFRSVUUpIC8gc3FydChuKCkpLA0KICAgIG1fdG90YWxfYWRsID0gbWVhbih0b3RhbC5hZGwsIG5hLnJtID0gVFJVRSksDQogICAgc2VfbV90b3RhbF9hZGwgPSBzZCh0b3RhbC5hZGwsIG5hLnJtID0gVFJVRSkgLyBzcXJ0KG4oKSksDQogICAgbV9maXJzdF9hZGwgPSBtZWFuKGRheXNfdG9fYWRsLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNlX21fZmlyc3RfYWRsID0gc2QoZGF5c190b19hZGwsIG5hLnJtID0gVFJVRSkgLyBzcXJ0KG4oKSksDQogICAgbV9hdmcgPSBtZWFuKGF2Z19pbmZjLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNlX21fYXZnID0gc2QoYXZnX2luZmMsIG5hLnJtID0gVFJVRSkgLyBzcXJ0KG4oKSkNCiAgKQ0KDQojIFJlc2hhcGUgZGF0YSB0byBpbmNsdWRlIHN0YW5kYXJkIGVycm9ycw0KYWRsX2xvbmcgPC0gYWRsX3JvdW5kX3N1bSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBzdGFydHNfd2l0aCgibSIpLCAgIyBTZWxlY3QgbWVhbiBjb2x1bW5zDQogICAgbmFtZXNfdG8gPSAibWV0cmljIiwgICAgICAjIENyZWF0ZSBhIGNvbHVtbiBmb3IgbWV0cmljIG5hbWVzDQogICAgdmFsdWVzX3RvID0gIm1lYW5fdmFsdWUiICAjIENyZWF0ZSBhIGNvbHVtbiBmb3IgbWVhbiB2YWx1ZXMNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNlX3ZhbHVlID0gY2FzZV93aGVuKA0KICAgICAgbWV0cmljID09ICJtbWF4IiB+IHNlX21tYXgsDQogICAgICBtZXRyaWMgPT0gIm1fdG90YWxfYWRsIiB+IHNlX21fdG90YWxfYWRsLA0KICAgICAgbWV0cmljID09ICJtX2ZpcnN0X2FkbCIgfiBzZV9tX2ZpcnN0X2FkbCwNCiAgICAgIG1ldHJpYyA9PSAibV9hdmciIH4gc2VfbV9hdmcsDQogICAgICBUUlVFIH4gTkFfcmVhbF8NCiAgICApDQogICkNCg0KDQojIEZpbHRlciBmb3IgbV9hdmcgYW5kIG1tYXgNCmFkbF9sb25nX2F2Z19tYXggPC0gYWRsX2xvbmcgJT4lDQogIGZpbHRlcihtZXRyaWMgJWluJSBjKCJtX2F2ZyIsICJtbWF4IikpDQoNCiMgUGxvdCB3aXRoIGVycm9yIGJhcnMNCnBsb3QxIDwtIGdncGxvdChhZGxfbG9uZ19hdmdfbWF4LCBhZXMoeCA9IHJvdW5kLCB5ID0gbWVhbl92YWx1ZSwgZmlsbCA9IG1ldHJpYykpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjcpLCB3aWR0aCA9IDAuNykgKw0KICBnZW9tX2Vycm9yYmFyKA0KICAgIGFlcyh5bWluID0gbWVhbl92YWx1ZSAtIHNlX3ZhbHVlLCB5bWF4ID0gbWVhbl92YWx1ZSArIHNlX3ZhbHVlKSwNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuNyksIHdpZHRoID0gMC4yDQogICkgKw0KICBsYWJzKA0KICAgIHggPSAiUm91bmQiLA0KICAgIHkgPSAiQ2VsbHMvdWwiLA0KICAgIGZpbGwgPSBOVUxMDQogICkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKCJtX2F2ZyIgPSAicHVycGxlIiwgIm1tYXgiID0gInNreWJsdWUiKSwNCiAgICBsYWJlbHMgPSBjKCJtX2F2ZyIgPSAiQXZlcmFnZSBJbmZlY3Rpb24gTGV2ZWwiLCAibW1heCIgPSAiTWF4aW11bSBJbmZlY3Rpb24gTGV2ZWwiKQ0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCINCiAgKQ0KDQoNCiMgRmlsdGVyIGZvciBtX3RvdGFsX2FkbCBhbmQgbV9maXJzdF9hZGwNCmFkbF9sb25nX2FkbCA8LSBhZGxfbG9uZyAlPiUNCiAgZmlsdGVyKG1ldHJpYyAlaW4lIGMoIm1fdG90YWxfYWRsIiwgIm1fZmlyc3RfYWRsIikpDQoNCiMgUGxvdCB3aXRoIGVycm9yIGJhcnMNCnBsb3QyIDwtIGdncGxvdChhZGxfbG9uZ19hZGwsIGFlcyh4ID0gcm91bmQsIHkgPSBtZWFuX3ZhbHVlLCBmaWxsID0gbWV0cmljKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuNyksIHdpZHRoID0gMC43KSArDQogIGdlb21fZXJyb3JiYXIoDQogICAgYWVzKHltaW4gPSBtZWFuX3ZhbHVlIC0gc2VfdmFsdWUsIHltYXggPSBtZWFuX3ZhbHVlICsgc2VfdmFsdWUpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC43KSwgd2lkdGggPSAwLjINCiAgKSArDQogIGxhYnMoDQogICAgeCA9ICJSb3VuZCIsDQogICAgeSA9ICJEYXlzIiwNCiAgICBmaWxsID0gTlVMTA0KICApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygibV90b3RhbF9hZGwiID0gInRvbWF0byIsICJtX2ZpcnN0X2FkbCIgPSAiZ29sZCIpLA0KICAgIGxhYmVscyA9IGMoDQogICAgICAibV90b3RhbF9hZGwiID0gIk51bWJlciBvZiBEYXlzIEluZmVjdGlvbiB3YXMgRGV0ZWN0ZWQiLA0KICAgICAgIm1fZmlyc3RfYWRsIiA9ICJEYXlzIFVudGlsIEZpcnN0IEluZmVjdGlvbiBEZXRlY3RlZCINCiAgICApDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIg0KICApDQoNCmBgYA0KDQoNCg0KYGBge3IsIGZpZy53aWR0aD0gMTUsIGZpZy5oZWlnaHQ9MTB9DQpwbG90X2dyaWQocGxvdDEsIHBsb3QyLCBuY29sPTIsIG5yb3cgPTEpDQpgYGANCg==