Bees are frequently exposed to fungicides in agricultural landscapes, and while these chemicals are generally not considered to be harmful to insect pollinators, the sublethal effects of fungicides are not well understood. We investigated the non-target effects of exposure to field-realistic concentrations of the fungicide, Pristine®, for the common eastern bumble bee (Bombus impatiens). We fed queenless microcolonies of 5 bumble bees pollen patties contaminated with Pristine® ranging from 0 ppb-150,000 ppb, and evaluated the effects of chronic fungicide exposure on brood production, colony weight change, pollen consumption, and drone body quality. We found that while microcolonies fed pollen containing 1,500 ppb consumed the most pollen and produced the most brood, microcolonies exposed to 15,000 ppb gained weight at significantly lower rates. Fungicide exposure also negatively impacted brood development time and drone body quality. Our findings indicate that Pristine® has sublethal effects on bumble bee microcolony growth and brood development, highlighting the potential negative impacts of chronic fungicide exposure to bee health. In the face of the global decline of pollinator species, it is important for us to broaden our understanding of how bees react towards exposure of often overlooked stressors, such as fungicides, to account for potential consequences for pollinator health and pollination services.

Input relevent data files

### Figure out average pollen consumption by treatment 


pollen <- read_csv("pollen1.csv", col_types = cols(round = col_factor(levels = c("1", 
                                                                                 "2")), treatment = col_factor(levels = c("1", 
                                                                                                                          "2", "3", "4", "5")), replicate = col_factor(levels = c("1", 
                                                                                                                                                                                  "2", "3", "4", "5", "6", "7", "9", "11", 
                                                                                                                                                                                  "12")), start_date = col_date(format = "%m/%d/%Y"), 
                                                   start_time = col_character(), end_date = col_date(format = "%m/%d/%Y"), 
                                                   end_time = col_character()))


pollen$colony <- as.factor(pollen$colony)
pollen$pid <- as.factor(pollen$pid)
pollen$count <- as.factor(pollen$count)

pollen <- subset(pollen, pollen$round != 1)

pollen <- na.omit(pollen)

range(pollen$difference)
## [1] -0.30646  1.56542
# get rid of negative numbers
pollen$difference[pollen$difference < 0] <- NA
pollen <- na.omit(pollen)
range(pollen$difference)
## [1] 0.002715 1.565420
# add queenright original colony column 
qro <- read_csv("qro.csv")
qro$colony <- as.factor(qro$colony)
qro$qro <- as.factor(qro$qro)

pollen <- merge(pollen, qro, by.x = "colony")

pollen$pid <- as.factor(pollen$pid)
pollen$dose_consumed <- as.numeric(pollen$dose_consumed)

Average pollen consumption per colony data input

pollen$whole_dif <- as.numeric(pollen$difference)
wd.1 <- lm(difference ~ treatment, data = pollen)
summary(wd.1)
## 
## Call:
## lm(formula = difference ~ treatment, data = pollen)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.4853 -0.2416 -0.1504  0.1576  1.0638 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.429541   0.024170  17.772   <2e-16 ***
## treatment2  0.072099   0.034886   2.067   0.0390 *  
## treatment3  0.078078   0.034406   2.269   0.0235 *  
## treatment4  0.058490   0.034988   1.672   0.0949 .  
## treatment5  0.004982   0.035040   0.142   0.8870    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3375 on 915 degrees of freedom
## Multiple R-squared:  0.009927,   Adjusted R-squared:  0.005599 
## F-statistic: 2.294 on 4 and 915 DF,  p-value: 0.05773
wd.emm <- emmeans(wd.1, "treatment")
summary(wd.emm)
##  treatment emmean     SE  df lower.CL upper.CL
##  1          0.430 0.0242 915    0.382    0.477
##  2          0.502 0.0252 915    0.452    0.551
##  3          0.508 0.0245 915    0.460    0.556
##  4          0.488 0.0253 915    0.438    0.538
##  5          0.435 0.0254 915    0.385    0.484
## 
## Confidence level used: 0.95
wd.summary <- pollen %>% 
  group_by(colony) %>%
  summarize(whole.mean = mean(difference),
            mean.dose = mean(dose_consumed))

as.data.frame(wd.summary)  # this is the data frame I will merge with subsequent data frames to contain average pollen consumption per colony as a new column  
##    colony whole.mean   mean.dose
## 1  1.11R2  0.2829509     0.00000
## 2  1.12R2  0.1697964     0.00000
## 3   1.1R2  0.5213458     0.00000
## 4   1.2R2  0.3374200     0.00000
## 5   1.3R2  0.4512891     0.00000
## 6   1.4R2  0.6063016     0.00000
## 7   1.5R2  0.7079516     0.00000
## 8   1.7R2  0.7400381     0.00000
## 9   1.9R2  0.2240081     0.00000
## 10 2.11R2  0.4178270    35.99958
## 11 2.12R2  0.4035568    35.62453
## 12  2.1R2  0.6101589    55.13368
## 13  2.2R2  0.5109234    47.65174
## 14  2.3R2  0.3280036    24.29676
## 15  2.4R2  0.3881394    32.86886
## 16  2.5R2  0.7194915    73.77696
## 17  2.7R2  0.5299685    46.45851
## 18  2.9R2  0.5857152    52.49618
## 19 3.11R2  0.4216410   357.65779
## 20 3.12R2  0.3390993   281.21803
## 21  3.1R2  0.3711948   307.88606
## 22  3.2R2  0.3461010   310.28287
## 23  3.3R2  0.8465806   919.09823
## 24  3.4R2  0.4120433   406.20875
## 25  3.5R2  0.8906211   969.89690
## 26  3.7R2  0.6266680   720.47811
## 27  3.9R2  0.4409511   417.98849
## 28 4.11R2  0.3456011  3697.92253
## 29 4.12R2  0.2496295  2085.61694
## 30  4.1R2  0.7074755  8936.65823
## 31  4.2R2  0.3871742  4380.60484
## 32  4.3R2  0.5800074  6846.91060
## 33  4.4R2  0.8356247 10230.80238
## 34  4.5R2  0.2335967  1757.69297
## 35  4.7R2  0.6237400  7030.06345
## 36  4.9R2  0.5322950  5682.26011
## 37 5.11R2  0.4113960 43070.09972
## 38 5.12R2  0.2077741 15383.81515
## 39  5.1R2  0.3782286 37367.48316
## 40  5.2R2  0.4912468 52985.85612
## 41  5.3R2  0.2128778 16364.60071
## 42  5.4R2  0.4563045 48624.01684
## 43  5.5R2  0.7095479 82144.93157
## 44  5.7R2  0.6113189 67415.74103
## 45  5.9R2  0.4188290 42601.27230

Worker Mortality data input

mortality  <- read_csv("surviving workers per colony.csv")

mortality$colony <- as.factor(mortality$colony)

Brood data input

brood <- read_csv("brood.csv", col_types = cols(round = col_factor(levels = c("1", 
    "2")), treatment = col_factor(levels = c("1", 
    "2", "3", "4", "5")), replicate = col_factor(levels = c("1", 
    "2", "3", "4", "5", "7", "9", "11", "12"))))

brood$colony <- as.factor(brood$colony)

brood <- subset(brood, brood$round != 1)

brood <- merge(wd.summary, brood, by.x = "colony")

brood <- merge(brood, mortality, by.x = "colony")

brood.sub <- subset(brood, select = c(colony, duration))

Drone data input

drones <- read_csv("drones_rf.csv", col_types = cols(round = col_factor(levels = c("1","2")), treatment = col_factor(levels = c("1","2", "3", "4", "5")), notes = col_skip(), colony_start = col_skip(), colony_count = col_skip(), alive = col_skip(), emerge_date = col_skip()))

#this data set is for drone emerge times and health metrics 

drones$order_on_sheet <- as.factor(drones$order_on_sheet)
drones$replicate <- as.factor(drones$replicate)
drones$colony <- as.factor(drones$colony)
drones$id <- as.factor(drones$id)
drones$relative_fat <- as.double(drones$relative_fat)
drones$radial <- as.double(drones$radial)
drones$`alive?` <- as.double(drones$`alive?`)


drf.pollen <- merge(wd.summary, drones, by.x = "colony")   # this is a new data frame with average pollen consumption data per colony

drf.pollen$alive <- as.logical(drf.pollen$`alive?`)

drone.sum <- drf.pollen %>%
  group_by(colony) %>%
  summarise(count.drone = length(id))
drone.sum
## # A tibble: 40 × 2
##    colony count.drone
##    <fct>        <int>
##  1 1.11R2           4
##  2 1.1R2            6
##  3 1.2R2           12
##  4 1.3R2           11
##  5 1.4R2           16
##  6 1.5R2           21
##  7 1.7R2           12
##  8 2.11R2           9
##  9 2.12R2           5
## 10 2.1R2           11
## # … with 30 more rows
drone.sum <- as.data.frame(drone.sum)

qro <- read_csv("qro.csv")
qro$colony <- as.factor(qro$colony)
qro$qro <- as.factor(qro$qro)

drf.pollen <- merge(drf.pollen, qro, by.x = "colony")

drf.pollen<- merge(drf.pollen, brood.sub, by.x = "colony")

Begin data analysis

Drone Dry Weight

range(drf.pollen$dry_weight)
## [1] 0.0166 0.0826
drf.pollen.dry <- drf.pollen[-c(131, 160, 177), ]   #remove outlier that was covered in honey and dead bees 
range(drf.pollen$dry_weight)
## [1] 0.0166 0.0826
drf.pollen.dry <- subset(drf.pollen.dry, select = c(dry_weight, treatment, whole.mean, mean.dose, workers_alive, alive, duration, qro, colony))
drf.pollen.dry <- na.omit(drf.pollen.dry)

ggplot(drf.pollen.dry, aes(x=dry_weight, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.0025,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Dry Weight") +
  labs(y = "Count", x = "Weight (g) ")

shapiro.test(drf.pollen.dry$dry_weight)
## 
##  Shapiro-Wilk normality test
## 
## data:  drf.pollen.dry$dry_weight
## W = 0.99416, p-value = 0.1154

Step 1 - Check for colinearity

dry.model <- lm(dry_weight~ treatment + whole.mean + mean.dose + workers_alive + duration  + qro, data = drf.pollen)
ols_vif_tol(dry.model)
##        Variables  Tolerance       VIF
## 1     treatment2 0.50260697  1.989626
## 2     treatment3 0.59719170  1.674504
## 3     treatment4 0.40461328  2.471496
## 4     treatment5 0.07461722 13.401732
## 5     whole.mean 0.50173020  1.993103
## 6      mean.dose 0.09232082 10.831793
## 7  workers_alive 0.49903846  2.003854
## 8       duration 0.69478708  1.439290
## 9          qroB3 0.78901120  1.267409
## 10         qroB4 0.55986224  1.786154
## 11         qroB5 0.50314078  1.987515
vif(dry.model)
##                    GVIF Df GVIF^(1/(2*Df))
## treatment     19.152334  4        1.446364
## whole.mean     1.993103  1        1.411773
## mean.dose     10.831793  1        3.291169
## workers_alive  2.003854  1        1.415575
## duration       1.439290  1        1.199704
## qro            3.084743  3        1.206526
dry.mod1 <- update(dry.model, .~. - mean.dose)
vif(dry.mod1)
##                   GVIF Df GVIF^(1/(2*Df))
## treatment     2.032114  4        1.092681
## whole.mean    1.691258  1        1.300484
## workers_alive 1.982161  1        1.407892
## duration      1.386150  1        1.177349
## qro           2.905325  3        1.194536
dry.mod2 <- update(dry.model, .~. - whole.mean)
vif(dry.mod2)
##                    GVIF Df GVIF^(1/(2*Df))
## treatment     13.450555  4        1.383861
## mean.dose      9.191372  1        3.031728
## workers_alive  1.985847  1        1.409201
## duration       1.288983  1        1.135334
## qro            2.494860  3        1.164594
dry.mod3 <- update(dry.model, .~. - treatment)
vif(dry.mod3)
##                   GVIF Df GVIF^(1/(2*Df))
## whole.mean    1.399743  1        1.183107
## mean.dose     1.149282  1        1.072046
## workers_alive 1.808411  1        1.344772
## duration      1.137360  1        1.066471
## qro           2.347073  3        1.152801
# This shows that treatment and mean.dose are highly correlated 
pair.dry.df <- subset(drf.pollen, select = c(dry_weight, treatment, whole.mean, mean.dose, workers_alive, alive, duration, qro)) #make a data frame containing only the explanatory variables in the model 

ggpairs(pair.dry.df)

Step 2 - Work down from most complicated model

dry.int <- lmer(dry_weight~ treatment*whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.dry)

dry.g1 <- lmer(dry_weight~ treatment + whole.mean + mean.dose + workers_alive + duration  + qro + (1|colony), data = drf.pollen.dry)

dry.g2 <- lmer(dry_weight~ treatment + whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.dry)
#this is the model we are keeping 

dry.g3 <- lmer(dry_weight~ mean.dose + whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.dry)
anova(dry.int, dry.g1, dry.g2)  #AIC is lower for dry.g2 and Chisq value is not sig.
## Data: drf.pollen.dry
## Models:
## dry.g2: dry_weight ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
## dry.g1: dry_weight ~ treatment + whole.mean + mean.dose + workers_alive + duration + qro + (1 | colony)
## dry.int: dry_weight ~ treatment * whole.mean + workers_alive + duration + qro + (1 | colony)
##         npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## dry.g2    13 -2815.0 -2762.7 1420.5  -2841.0                     
## dry.g1    14 -2813.1 -2756.7 1420.5  -2841.1 0.1073  1     0.7433
## dry.int   17 -2809.0 -2740.6 1421.5  -2843.0 1.9746  3     0.5777
anova(dry.g1, dry.g3) #mean.dose is not useful 
## Data: drf.pollen.dry
## Models:
## dry.g3: dry_weight ~ mean.dose + whole.mean + workers_alive + duration + qro + (1 | colony)
## dry.g1: dry_weight ~ treatment + whole.mean + mean.dose + workers_alive + duration + qro + (1 | colony)
##        npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)    
## dry.g3   10 -2797.0 -2756.7 1408.5  -2817.0                         
## dry.g1   14 -2813.1 -2756.7 1420.5  -2841.1 24.091  4  7.657e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(dry.g2)
## Linear mixed model fit by REML ['lmerMod']
## Formula: dry_weight ~ treatment + whole.mean + workers_alive + duration +  
##     qro + (1 | colony)
##    Data: drf.pollen.dry
## 
## REML criterion at convergence: -2704.8
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.98339 -0.63521 -0.04443  0.67352  3.10627 
## 
## Random effects:
##  Groups   Name        Variance  Std.Dev.
##  colony   (Intercept) 2.555e-06 0.001598
##  Residual             6.036e-05 0.007769
## Number of obs: 413, groups:  colony, 39
## 
## Fixed effects:
##                 Estimate Std. Error t value
## (Intercept)    4.815e-02  4.270e-03  11.275
## treatment2    -2.710e-03  1.683e-03  -1.610
## treatment3    -7.079e-03  1.672e-03  -4.233
## treatment4    -6.735e-04  1.610e-03  -0.418
## treatment5    -1.115e-04  1.673e-03  -0.067
## whole.mean     3.993e-03  3.817e-03   1.046
## workers_alive -8.929e-04  6.538e-04  -1.366
## duration      -1.095e-04  7.134e-05  -1.535
## qroB3          4.339e-04  1.723e-03   0.252
## qroB4          3.319e-03  1.782e-03   1.862
## qroB5          1.601e-03  1.467e-03   1.091
## 
## Correlation of Fixed Effects:
##             (Intr) trtmn2 trtmn3 trtmn4 trtmn5 whl.mn wrkrs_ duratn qroB3 
## treatment2   0.058                                                        
## treatment3   0.094  0.487                                                 
## treatment4   0.167  0.520  0.534                                          
## treatment5   0.121  0.565  0.499  0.548                                   
## whole.mean  -0.217  0.131 -0.083 -0.147  0.177                            
## workers_alv -0.709 -0.103 -0.183 -0.278 -0.316 -0.106                     
## duration    -0.555 -0.390 -0.168 -0.169 -0.291 -0.278  0.129              
## qroB3        0.103  0.197  0.062  0.092  0.251  0.049 -0.100 -0.252       
## qroB4       -0.016  0.065  0.048  0.219 -0.025 -0.487  0.220 -0.011  0.166
## qroB5       -0.434  0.117 -0.042 -0.097 -0.046  0.035  0.583 -0.131  0.200
##             qroB4 
## treatment2        
## treatment3        
## treatment4        
## treatment5        
## whole.mean        
## workers_alv       
## duration          
## qroB3             
## qroB4             
## qroB5        0.308

Step 2.a - Drop1

drop1(dry.g2, test = "Chisq")
## Single term deletions
## 
## Model:
## dry_weight ~ treatment + whole.mean + workers_alive + duration + 
##     qro + (1 | colony)
##               npar     AIC     LRT   Pr(Chi)    
## <none>             -2815.0                      
## treatment        4 -2796.2 26.7206 2.264e-05 ***
## whole.mean       1 -2815.9  1.0772   0.29932    
## workers_alive    1 -2813.7  3.2311   0.07225 .  
## duration         1 -2813.8  3.1801   0.07454 .  
## qro              3 -2814.8  6.1222   0.10581    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dry.g2.update <- update(dry.g2, .~. -whole.mean)
anova(dry.g2.update, dry.g2)
## Data: drf.pollen.dry
## Models:
## dry.g2.update: dry_weight ~ treatment + workers_alive + duration + qro + (1 | colony)
## dry.g2: dry_weight ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
##               npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## dry.g2.update   12 -2815.9 -2767.6 1419.9  -2839.9                     
## dry.g2          13 -2815.0 -2762.7 1420.5  -2841.0 1.0772  1     0.2993
drop1(dry.g2.update, test = "Chisq")
## Single term deletions
## 
## Model:
## dry_weight ~ treatment + workers_alive + duration + qro + (1 | 
##     colony)
##               npar     AIC     LRT   Pr(Chi)    
## <none>             -2815.9                      
## treatment        4 -2797.8 26.0848 3.042e-05 ***
## workers_alive    1 -2815.1  2.7472   0.09743 .  
## duration         1 -2815.5  2.4136   0.12028    
## qro              3 -2811.1 10.7628   0.01308 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dry.g2.update2 <- update(dry.g2.update, .~. -duration)
anova(dry.g2.update2, dry.g2.update)
## Data: drf.pollen.dry
## Models:
## dry.g2.update2: dry_weight ~ treatment + workers_alive + qro + (1 | colony)
## dry.g2.update: dry_weight ~ treatment + workers_alive + duration + qro + (1 | colony)
##                npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## dry.g2.update2   11 -2815.5 -2771.2 1418.7  -2837.5                     
## dry.g2.update    12 -2815.9 -2767.6 1419.9  -2839.9 2.4136  1     0.1203
drop1(dry.g2.update2, test = "Chisq")
## Single term deletions
## 
## Model:
## dry_weight ~ treatment + workers_alive + qro + (1 | colony)
##               npar     AIC     LRT   Pr(Chi)    
## <none>             -2815.5                      
## treatment        4 -2797.1 26.4120 2.613e-05 ***
## workers_alive    1 -2815.3  2.1761   0.14017    
## qro              3 -2812.2  9.2947   0.02562 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dry.g2.update3 <- update(dry.g2.update2, .~. -workers_alive)
anova(dry.g2.update2, dry.g2.update3)
## Data: drf.pollen.dry
## Models:
## dry.g2.update3: dry_weight ~ treatment + qro + (1 | colony)
## dry.g2.update2: dry_weight ~ treatment + workers_alive + qro + (1 | colony)
##                npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## dry.g2.update3   10 -2815.3 -2775.1 1417.6  -2835.3                     
## dry.g2.update2   11 -2815.5 -2771.2 1418.7  -2837.5 2.1761  1     0.1402
drop1(dry.g2.update3, test = "Chisq")
## Single term deletions
## 
## Model:
## dry_weight ~ treatment + qro + (1 | colony)
##           npar     AIC    LRT   Pr(Chi)    
## <none>         -2815.3                     
## treatment    4 -2798.4 24.892 5.288e-05 ***
## qro          3 -2808.7 12.605  0.005575 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#New model we are keeping for dry weight 

dry.g2.update3
## Linear mixed model fit by REML ['lmerMod']
## Formula: dry_weight ~ treatment + qro + (1 | colony)
##    Data: drf.pollen.dry
## REML criterion at convergence: -2740.253
## Random effects:
##  Groups   Name        Std.Dev.
##  colony   (Intercept) 0.001607
##  Residual             0.007778
## Number of obs: 413, groups:  colony, 39
## Fixed Effects:
## (Intercept)   treatment2   treatment3   treatment4   treatment5        qroB3  
##   0.0423110   -0.0038391   -0.0076907   -0.0013794   -0.0014854   -0.0003439  
##       qroB4        qroB5  
##   0.0042521    0.0023159
summary(dry.g2.update3)
## Linear mixed model fit by REML ['lmerMod']
## Formula: dry_weight ~ treatment + qro + (1 | colony)
##    Data: drf.pollen.dry
## 
## REML criterion at convergence: -2740.3
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -3.05397 -0.62226 -0.00129  0.67859  3.13654 
## 
## Random effects:
##  Groups   Name        Variance  Std.Dev.
##  colony   (Intercept) 2.582e-06 0.001607
##  Residual             6.050e-05 0.007778
## Number of obs: 413, groups:  colony, 39
## 
## Fixed effects:
##               Estimate Std. Error t value
## (Intercept)  0.0423110  0.0012739  33.214
## treatment2  -0.0038391  0.0015507  -2.476
## treatment3  -0.0076907  0.0016112  -4.773
## treatment4  -0.0013794  0.0014933  -0.924
## treatment5  -0.0014854  0.0015285  -0.972
## qroB3       -0.0003439  0.0016672  -0.206
## qroB4        0.0042521  0.0015001   2.835
## qroB5        0.0023159  0.0011541   2.007
## 
## Correlation of Fixed Effects:
##            (Intr) trtmn2 trtmn3 trtmn4 trtmn5 qroB3  qroB4 
## treatment2 -0.675                                          
## treatment3 -0.586  0.471                                   
## treatment4 -0.688  0.523  0.485                            
## treatment5 -0.689  0.519  0.476  0.527                     
## qroB3      -0.323  0.108  0.005  0.029  0.182              
## qroB4      -0.377  0.107  0.012  0.212  0.096  0.204       
## qroB5      -0.428  0.135  0.054  0.063  0.114  0.277  0.292

Step 3 - Check model fit

plot(resid(dry.g2.update3)) + 
  abline(h=0, col="red", lwd=2) 

## integer(0)
qqnorm(resid(dry.g2.update3));qqline(resid(dry.g2.update3)) 

Step 4 - Results

Anova(dry.g2.update3)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: dry_weight
##            Chisq Df Pr(>Chisq)    
## treatment 27.733  4  1.412e-05 ***
## qro       10.802  3    0.01284 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dry.emm.update <- emmeans(dry.g2.update3, "treatment")
pairs(dry.emm.update)
##  contrast                 estimate      SE   df t.ratio p.value
##  treatment1 - treatment2  0.003839 0.00156 26.2   2.459  0.1312
##  treatment1 - treatment3  0.007691 0.00163 26.2   4.733  0.0006
##  treatment1 - treatment4  0.001379 0.00150 21.0   0.917  0.8872
##  treatment1 - treatment5  0.001485 0.00154 23.8   0.967  0.8673
##  treatment2 - treatment3  0.003852 0.00164 29.3   2.346  0.1592
##  treatment2 - treatment4 -0.002460 0.00150 23.4  -1.640  0.4881
##  treatment2 - treatment5 -0.002354 0.00152 26.3  -1.552  0.5399
##  treatment3 - treatment4 -0.006311 0.00159 24.0  -3.957  0.0048
##  treatment3 - treatment5 -0.006205 0.00162 26.5  -3.823  0.0060
##  treatment4 - treatment5  0.000106 0.00148 21.2   0.072  1.0000
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 5 estimates
plot(dry.emm.update, comparisons = TRUE)

dry.sum <- drf.pollen %>%
  group_by(treatment) %>%
  summarise(dry.m = mean(dry_weight), 
            dry.sd = sd(dry_weight),
            dryn = length(dry_weight)) %>%
  mutate(sedry = dry.sd/sqrt(dryn))
dry.sum
## # A tibble: 5 × 5
##   treatment  dry.m  dry.sd  dryn    sedry
##   <fct>      <dbl>   <dbl> <int>    <dbl>
## 1 1         0.0444 0.00816    82 0.000901
## 2 2         0.0395 0.00834    76 0.000957
## 3 3         0.0370 0.0104     66 0.00129 
## 4 4         0.0416 0.00831   107 0.000804
## 5 5         0.0416 0.00731    90 0.000771

Step 5 - Visualize

dryanova_summary <- summary(dry.g2.update3)
         
         
drytuk.means <- emmeans(object = dry.g2.update3,
                        specs = "treatment",
                        adjust = "Tukey",
                        type = "response")


drytuk.means
##  treatment emmean      SE   df lower.CL upper.CL
##  1         0.0439 0.00110 22.3   0.0408   0.0470
##  2         0.0400 0.00115 29.3   0.0369   0.0432
##  3         0.0362 0.00122 29.3   0.0328   0.0395
##  4         0.0425 0.00108 17.5   0.0394   0.0456
##  5         0.0424 0.00114 23.9   0.0392   0.0456
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates
dry.cld.model <- cld(object = drytuk.means,
                     adjust = "Tukey",
                     Letters = letters,
                     alpha = 0.05)
dry.cld.model
##  treatment emmean      SE   df lower.CL upper.CL .group
##  3         0.0362 0.00122 29.3   0.0328   0.0395  a    
##  2         0.0400 0.00115 29.3   0.0369   0.0432  ab   
##  5         0.0424 0.00114 23.9   0.0392   0.0456   b   
##  4         0.0425 0.00108 17.5   0.0394   0.0456   b   
##  1         0.0439 0.00110 22.3   0.0408   0.0470   b   
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## P value adjustment: tukey method for comparing a family of 5 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.
drytuk.treatment <- as.data.frame(dry.cld.model)
drytuk.treatment
##  treatment     emmean          SE    df   lower.CL   upper.CL .group
##  3         0.03617637 0.001219110 29.33 0.03282901 0.03952374  a    
##  2         0.04002794 0.001154745 29.33 0.03685730 0.04319859  ab   
##  5         0.04238163 0.001141717 23.88 0.03919697 0.04556630   b   
##  4         0.04248765 0.001075162 17.51 0.03939309 0.04558220   b   
##  1         0.04386704 0.001099481 22.29 0.04078151 0.04695256   b   
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## P value adjustment: tukey method for comparing a family of 5 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.
dry_max <- drf.pollen %>%
  group_by(treatment) %>%
  summarize(maxdry = max(mean(dry_weight)))


dry_for_plotting <- full_join(drytuk.treatment, dry_max,
                              by="treatment")


dp <- ggplot(data = dry.sum, aes(x = treatment, y = dry.m, fill = treatment)) +
  geom_col(col = "black")+
  coord_cartesian(ylim=c(0.03, 0.046)) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) + 
  geom_errorbar(aes(ymin = dry.m - sedry, 
                    ymax = dry.m + sedry),
                position = position_dodge(0.9), width = 0.4) +
  labs(y = "Mean Drone Dry Weight (g)",) +
  ggtitle("Average Drone Dry Weight (g) per Treatment") +
  scale_x_discrete(name = "Treatment", 
                   labels = c("0 PPB", "150 PPB", "1,500 PPB", "15,000 PPB", "150,000 PPB")) +
  theme_cowplot()+
  theme_classic(base_size = 30) 

dp <- dp + 
  annotate(geom = "text", 
          x = 2.5, y = 0.045,
          label = "P < 0.001",
          size = 8) +
  annotate(geom = "text",
           x = c(3, 2, 4, 5, 1),
           y = dry_for_plotting$maxdry + 0.002,
           label = c("a", "ab", "b", "b", "b"),
           size = 8) +
  theme(legend.position =  "none")

dp 

Dry Weight Results Summary

A <- Anova(dry.g2.update3)
A <- as.data.frame(A)
A <- setDT(A)
A
##       Chisq Df   Pr(>Chisq)
## 1: 27.73338  4 1.412494e-05
## 2: 10.80220  3 1.284498e-02
dry_emm <- emmeans(dry.g2.update3, pairwise ~ treatment)
dry_contrasts <- as.data.frame(dry_emm$contrasts)
dry_means <- as.data.frame(dry_emm$emmeans)
dry_means <- setDT(dry_means)
dry_means
##    treatment     emmean          SE       df   lower.CL   upper.CL
## 1:         1 0.04386704 0.001099481 22.29312 0.04158859 0.04614548
## 2:         2 0.04002794 0.001154746 29.33317 0.03766739 0.04238850
## 3:         3 0.03617637 0.001219109 29.33451 0.03368425 0.03866850
## 4:         4 0.04248765 0.001075162 17.51284 0.04022430 0.04475099
## 5:         5 0.04238163 0.001141717 23.87657 0.04002460 0.04473867
dry_contrasts <- setDT(dry_contrasts)
dry_contrasts
##                    contrast      estimate          SE       df     t.ratio
##  1: treatment1 - treatment2  0.0038390929 0.001560937 26.16772  2.45947931
##  2: treatment1 - treatment3  0.0076906630 0.001625012 26.24382  4.73268043
##  3: treatment1 - treatment4  0.0013793901 0.001504353 20.99027  0.91693256
##  4: treatment1 - treatment5  0.0014854044 0.001536801 23.74828  0.96655602
##  5: treatment2 - treatment3  0.0038515701 0.001641710 29.32493  2.34607193
##  6: treatment2 - treatment4 -0.0024597029 0.001499795 23.37671 -1.64002620
##  7: treatment2 - treatment5 -0.0023536885 0.001516999 26.30894 -1.55154282
##  8: treatment3 - treatment4 -0.0063112729 0.001594873 24.03561 -3.95722601
##  9: treatment3 - treatment5 -0.0062052586 0.001623293 26.49833 -3.82263699
## 10: treatment4 - treatment5  0.0001060143 0.001480534 21.16046  0.07160545
##          p.value
##  1: 0.1312276191
##  2: 0.0005895033
##  3: 0.8871812677
##  4: 0.8673230324
##  5: 0.1592058361
##  6: 0.4881304744
##  7: 0.5398742384
##  8: 0.0048269361
##  9: 0.0059675633
## 10: 0.9999934994
dry.sum <- setDT(dry.sum)
dry.sum
##    treatment      dry.m      dry.sd dryn        sedry
## 1:         1 0.04442317 0.008157861   82 0.0009008850
## 2:         2 0.03948684 0.008341372   76 0.0009568210
## 3:         3 0.03697606 0.010442439   66 0.0012853754
## 4:         4 0.04158318 0.008314269  107 0.0008037707
## 5:         5 0.04163189 0.007314701   90 0.0007710372

Drone Relative Fat

drf.pollen.rf <- subset(drf.pollen, select = c(relative_fat, treatment, whole.mean, workers_alive, alive, duration, qro, colony))
drf.pollen.rf <- na.omit(drf.pollen.rf)

shapiro.test(drf.pollen.rf$relative_fat)
## 
##  Shapiro-Wilk normality test
## 
## data:  drf.pollen.rf$relative_fat
## W = 0.8011, p-value < 2.2e-16
range(drf.pollen.rf$relative_fat)
## [1] 0.0002 0.0072
ggplot(drf.pollen.rf, aes(x=relative_fat, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.0002,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Relative Fat") +
  labs(y = "Count", x = "Relative Fat(g) ")

drf.pollen.rf$logrf <- log(drf.pollen.rf$relative_fat)
shapiro.test(drf.pollen.rf$logrf)
## 
##  Shapiro-Wilk normality test
## 
## data:  drf.pollen.rf$logrf
## W = 0.93266, p-value = 4.097e-12
range(drf.pollen.rf$logrf)
## [1] -8.517193 -4.933674
ggplot(drf.pollen.rf, aes(x=logrf, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.1,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Relative Fat (log transformed)") +
  labs(y = "Count", x = "log(Relative Fat(g)) ")

Step 1 - Check for colinearity

rf.model <- lm(relative_fat~ treatment + whole.mean + workers_alive + duration  + qro, data = drf.pollen.rf)
vif(rf.model)
##                   GVIF Df GVIF^(1/(2*Df))
## treatment     1.964734  4        1.088085
## whole.mean    1.769399  1        1.330188
## workers_alive 2.024742  1        1.422934
## duration      1.394242  1        1.180780
## qro           3.217236  3        1.215012

Step 2 - Work down from most complicated model

rf.int <- lmer(relative_fat~ treatment*whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.rf)
#this is the model we will keep 

rf.g1 <- lmer(relative_fat~ treatment + whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.rf)

anova(rf.int, rf.g1)
## Data: drf.pollen.rf
## Models:
## rf.g1: relative_fat ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
## rf.int: relative_fat ~ treatment * whole.mean + workers_alive + duration + qro + (1 | colony)
##        npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)  
## rf.g1    13 -4326.8 -4275.5 2176.4  -4352.8                       
## rf.int   17 -4327.9 -4260.8 2180.9  -4361.9 9.0484  4     0.0599 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf.g3 <- glm(logrf ~ whole.mean, data = drf.pollen.rf)

qqnorm(resid(rf.g3));qqline(resid(rf.g3))

rf.int.2 <- lmer(logrf~ treatment*whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.rf)

rf.g2 <- lmer(logrf~ treatment + whole.mean + workers_alive + duration  + qro + (1|colony), data = drf.pollen.rf)
anova(rf.int, rf.g1)#rf.int marginally better 
## Data: drf.pollen.rf
## Models:
## rf.g1: relative_fat ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
## rf.int: relative_fat ~ treatment * whole.mean + workers_alive + duration + qro + (1 | colony)
##        npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)  
## rf.g1    13 -4326.8 -4275.5 2176.4  -4352.8                       
## rf.int   17 -4327.9 -4260.8 2180.9  -4361.9 9.0484  4     0.0599 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(rf.int.2, rf.g2) #rf.g2 better 
## Data: drf.pollen.rf
## Models:
## rf.g2: logrf ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
## rf.int.2: logrf ~ treatment * whole.mean + workers_alive + duration + qro + (1 | colony)
##          npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## rf.g2      13 452.60 503.89 -213.30   426.60                     
## rf.int.2   17 456.85 523.92 -211.42   422.85 3.7568  4     0.4399
AIC(rf.int, rf.g1)
##        df       AIC
## rf.int 17 -4092.649
## rf.g1  13 -4141.824
AIC(rf.int.2, rf.g2)
##          df      AIC
## rf.int.2 17 501.9528
## rf.g2    13 498.7718

Step 2.a - Drop1

drop1(rf.g2, test = "Chisq")
## Single term deletions
## 
## Model:
## logrf ~ treatment + whole.mean + workers_alive + duration + qro + 
##     (1 | colony)
##               npar    AIC     LRT   Pr(Chi)    
## <none>             452.60                      
## treatment        4 468.05 23.4461 0.0001031 ***
## whole.mean       1 452.15  1.5506 0.2130479    
## workers_alive    1 450.63  0.0254 0.8734816    
## duration         1 458.28  7.6762 0.0055954 ** 
## qro              3 451.79  5.1909 0.1583432    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf.update1 <- update(rf.g2, .~. -workers_alive)

anova(rf.g2, rf.update1)
## Data: drf.pollen.rf
## Models:
## rf.update1: logrf ~ treatment + whole.mean + duration + qro + (1 | colony)
## rf.g2: logrf ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
##            npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## rf.update1   12 450.63 497.97 -213.31   426.63                     
## rf.g2        13 452.60 503.89 -213.30   426.60 0.0254  1     0.8735
drop1(rf.update1, test = "Chisq")
## Single term deletions
## 
## Model:
## logrf ~ treatment + whole.mean + duration + qro + (1 | colony)
##            npar    AIC     LRT   Pr(Chi)    
## <none>          450.63                      
## treatment     4 466.09 23.4639 0.0001023 ***
## whole.mean    1 450.16  1.5285 0.2163435    
## duration      1 456.35  7.7158 0.0054739 ** 
## qro           3 451.01  6.3827 0.0944052 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf.update2 <- update(rf.update1, .~. -whole.mean)

anova(rf.update2, rf.update1)
## Data: drf.pollen.rf
## Models:
## rf.update2: logrf ~ treatment + duration + qro + (1 | colony)
## rf.update1: logrf ~ treatment + whole.mean + duration + qro + (1 | colony)
##            npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## rf.update2   11 450.16 493.56 -214.08   428.16                     
## rf.update1   12 450.63 497.97 -213.31   426.63 1.5285  1     0.2163
drop1(rf.update2, test = "Chisq")
## Single term deletions
## 
## Model:
## logrf ~ treatment + duration + qro + (1 | colony)
##           npar    AIC     LRT   Pr(Chi)    
## <none>         450.16                      
## treatment    4 464.13 21.9708 0.0002031 ***
## duration     1 454.62  6.4629 0.0110151 *  
## qro          3 454.78 10.6269 0.0139246 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
pairs(emmeans(rf.update2, "treatment"))
##  contrast                estimate     SE   df t.ratio p.value
##  treatment1 - treatment2   0.0257 0.0909 26.9   0.283  0.9985
##  treatment1 - treatment3   0.2772 0.0904 24.9   3.068  0.0376
##  treatment1 - treatment4   0.0496 0.0852 22.3   0.582  0.9763
##  treatment1 - treatment5  -0.1308 0.0862 23.3  -1.517  0.5624
##  treatment2 - treatment3   0.2515 0.0899 29.0   2.797  0.0636
##  treatment2 - treatment4   0.0239 0.0827 21.7   0.289  0.9983
##  treatment2 - treatment5  -0.1564 0.0819 24.0  -1.910  0.3393
##  treatment3 - treatment4  -0.2276 0.0878 23.9  -2.594  0.1036
##  treatment3 - treatment5  -0.4080 0.0876 25.0  -4.657  0.0008
##  treatment4 - treatment5  -0.1804 0.0805 19.5  -2.242  0.2063
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 5 estimates

Step 3 - Check model fit

plot(resid(rf.update2)) + 
  abline(h=0, col="red", lwd=2) 

## integer(0)
qqnorm(resid(rf.update2));qqline(resid(rf.update2))  #doesn't look great 

plot(drf.pollen.rf$treatment, drf.pollen.rf$relative_fat)

plot(drf.pollen.rf$relative_fat)

rf_sub <- subset(drf.pollen.rf, relative_fat<0.004)  #Difference of 13 bees

ggplot(rf_sub, aes(x=relative_fat, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.0002,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Relative Fat - Manual subset data") +
  labs(y = "Count", x = "Relative Fat(g) ")

shapiro.test(rf_sub$relative_fat)
## 
##  Shapiro-Wilk normality test
## 
## data:  rf_sub$relative_fat
## W = 0.97686, p-value = 1.232e-05

Check for outliers

boxplot.stats(drf.pollen.rf$relative_fat)$out   #don't care for this 
##  [1] 0.0002 0.0050 0.0040 0.0042 0.0071 0.0034 0.0032 0.0038 0.0036 0.0035
## [11] 0.0003 0.0002 0.0057 0.0032 0.0041 0.0072 0.0060 0.0042 0.0032 0.0049
## [21] 0.0056 0.0046 0.0041
lower_bound <- quantile(drf.pollen.rf$relative_fat, 0.025)
lower_bound
##  2.5% 
## 5e-04
upper_bound <- quantile(drf.pollen.rf$relative_fat, 0.975)
upper_bound  #this matches the subset data set I made getting rid of all values greater than 0.004 
##     97.5% 
## 0.0041475
outlier_ind <- which(drf.pollen.rf$relative_fat < lower_bound | drf.pollen.rf$relative_fat > upper_bound)
outlier_ind   #difference of 16 bees 
##  [1]  37  38  47  48 122 164 181 189 223 264 332 339 348 350 351 352
drf.pollen.rf[outlier_ind,]
##     relative_fat treatment whole.mean workers_alive alive duration qro colony
## 38        0.0002         1  0.6063016             1  TRUE       44  B5  1.4R2
## 39        0.0050         1  0.6063016             1  TRUE       44  B5  1.4R2
## 51        0.0042         1  0.7079516             4  TRUE       37  B4  1.5R2
## 52        0.0071         1  0.7079516             4  TRUE       37  B4  1.5R2
## 131       0.0004         2  0.3280036             5 FALSE       41  B3  2.3R2
## 174       0.0003         3  0.8465806             5  TRUE       62  B3  3.3R2
## 194       0.0004         3  0.8906211             4  TRUE       58  B4  3.5R2
## 202       0.0002         3  0.8906211             4  TRUE       58  B4  3.5R2
## 241       0.0057         4  0.7074755             4  TRUE       41  B1  4.1R2
## 292       0.0004         4  0.8356247             5  TRUE       46  B5  4.4R2
## 369       0.0072         5  0.4563045             5  TRUE       51  B5  5.4R2
## 376       0.0060         5  0.7095479             5  TRUE       43  B4  5.5R2
## 386       0.0042         5  0.7095479             5  TRUE       43  B4  5.5R2
## 388       0.0049         5  0.7095479             5  TRUE       43  B4  5.5R2
## 389       0.0056         5  0.7095479             5  TRUE       43  B4  5.5R2
## 390       0.0046         5  0.6113189             5  TRUE       41  B1  5.7R2
##         logrf
## 38  -8.517193
## 39  -5.298317
## 51  -5.472671
## 52  -4.947660
## 131 -7.824046
## 174 -8.111728
## 194 -7.824046
## 202 -8.517193
## 241 -5.167289
## 292 -7.824046
## 369 -4.933674
## 376 -5.115996
## 386 -5.472671
## 388 -5.318520
## 389 -5.184989
## 390 -5.381699
plot(outlier_ind)

df2 <- drf.pollen.rf[-c(37, 38,47 , 48, 122, 164, 181 ,189, 223 ,264, 332, 339, 348 ,350 ,351, 352),]
ggplot(df2, aes(x=relative_fat, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.0002,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Relative Fat - Outliers removed") +
  labs(y = "Count", x = "Relative Fat(g) ")

shapiro.test(df2$relative_fat)  # This is worse than just cutting off the tail  
## 
##  Shapiro-Wilk normality test
## 
## data:  df2$relative_fat
## W = 0.94807, p-value = 4.83e-10
rf.int.sub <- lmer(relative_fat~ treatment*whole.mean + workers_alive + duration  + qro + (1|colony), data = rf_sub)
rf.g1.sub <- lmer(relative_fat~ treatment + whole.mean + workers_alive + duration  + qro + (1|colony), data = rf_sub) #keep this one  

rf.df2.model <- lmer(relative_fat~ treatment*whole.mean + workers_alive + duration  + qro + (1|colony), data = df2)

anova(rf.int.sub, rf.g1.sub)  #now the model without the interaction is better. 
## Data: rf_sub
## Models:
## rf.g1.sub: relative_fat ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
## rf.int.sub: relative_fat ~ treatment * whole.mean + workers_alive + duration + qro + (1 | colony)
##            npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## rf.g1.sub    13 -4462.6 -4411.7 2244.3  -4488.6                     
## rf.int.sub   17 -4456.0 -4389.6 2245.0  -4490.0 1.4676  4     0.8324
AIC(rf.int.sub, rf.g1.sub)
##            df       AIC
## rf.int.sub 17 -4216.352
## rf.g1.sub  13 -4272.790
plot(resid(rf.int.sub)) + 
  abline(h=0, col="red", lwd=2) 

## integer(0)
qqnorm(resid(rf.int.sub));qqline(resid(rf.int.sub))  #looks much better

qqnorm(resid(rf.df2.model));qqline(resid(rf.df2.model)) #looks marginally better but not good enough to justify cutting the data

plot(resid(rf.g1.sub)) + 
  abline(h=0, col="red", lwd=2) 

## integer(0)
qqnorm(resid(rf.g1.sub));qqline(resid(rf.g1.sub))

emtrends(rf.int.sub, pairwise ~ treatment, var = "whole.mean")
## $emtrends
##  treatment whole.mean.trend       SE   df  lower.CL upper.CL
##  1                 0.000608 0.000698 22.7 -0.000836  0.00205
##  2                -0.000138 0.000886 22.1 -0.001975  0.00170
##  3                 0.000759 0.000603 24.9 -0.000484  0.00200
##  4                 0.000592 0.000626 21.0 -0.000710  0.00189
##  5                 0.000825 0.000865 21.9 -0.000970  0.00262
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast                 estimate       SE   df t.ratio p.value
##  treatment1 - treatment2  7.45e-04 0.001042 21.6   0.715  0.9507
##  treatment1 - treatment3 -1.51e-04 0.000828 20.9  -0.182  0.9997
##  treatment1 - treatment4  1.61e-05 0.000975 22.1   0.017  1.0000
##  treatment1 - treatment5 -2.17e-04 0.001059 21.7  -0.205  0.9996
##  treatment2 - treatment3 -8.96e-04 0.001022 21.8  -0.877  0.9024
##  treatment2 - treatment4 -7.29e-04 0.001094 21.6  -0.666  0.9615
##  treatment2 - treatment5 -9.62e-04 0.001146 21.9  -0.840  0.9152
##  treatment3 - treatment4  1.67e-04 0.000892 23.6   0.187  0.9997
##  treatment3 - treatment5 -6.60e-05 0.000989 22.6  -0.067  1.0000
##  treatment4 - treatment5 -2.33e-04 0.001054 21.9  -0.221  0.9994
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 5 estimates
plot(emtrends(rf.int.sub, pairwise ~ treatment, var = "whole.mean"))

emmip(rf.int.sub, treatment ~ whole.mean, cov.reduce = range)

Drop1 for subset data

drop1(rf.g1.sub, test = "Chisq")
## Single term deletions
## 
## Model:
## relative_fat ~ treatment + whole.mean + workers_alive + duration + 
##     qro + (1 | colony)
##               npar     AIC     LRT  Pr(Chi)   
## <none>             -4462.6                    
## treatment        4 -4454.3 16.2968 0.002646 **
## whole.mean       1 -4460.8  3.7924 0.051487 . 
## workers_alive    1 -4464.6  0.0171 0.895963   
## duration         1 -4456.7  7.8442 0.005098 **
## qro              3 -4465.7  2.8542 0.414653   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
submod.2 <- update(rf.g1.sub, .~. -workers_alive)

anova(rf.g1.sub, submod.2)
## Data: rf_sub
## Models:
## submod.2: relative_fat ~ treatment + whole.mean + duration + qro + (1 | colony)
## rf.g1.sub: relative_fat ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
##           npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## submod.2    12 -4464.6 -4417.6 2244.3  -4488.6                     
## rf.g1.sub   13 -4462.6 -4411.7 2244.3  -4488.6 0.0171  1      0.896
drop1(submod.2, test = "Chisq")
## Single term deletions
## 
## Model:
## relative_fat ~ treatment + whole.mean + duration + qro + (1 | 
##     colony)
##            npar     AIC     LRT  Pr(Chi)   
## <none>          -4464.6                    
## treatment     4 -4456.3 16.2809 0.002664 **
## whole.mean    1 -4462.8  3.7769 0.051963 . 
## duration      1 -4458.7  7.8966 0.004953 **
## qro           3 -4466.3  4.2383 0.236856   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
submod.3 <- update(submod.2, .~. -qro)

anova(submod.2, submod.3)
## Data: rf_sub
## Models:
## submod.3: relative_fat ~ treatment + whole.mean + duration + (1 | colony)
## submod.2: relative_fat ~ treatment + whole.mean + duration + qro + (1 | colony)
##          npar     AIC     BIC logLik deviance  Chisq Df Pr(>Chisq)
## submod.3    9 -4466.3 -4431.1 2242.2  -4484.3                     
## submod.2   12 -4464.6 -4417.6 2244.3  -4488.6 4.2383  3     0.2369
drop1(submod.3, test = "Chisq")
## Single term deletions
## 
## Model:
## relative_fat ~ treatment + whole.mean + duration + (1 | colony)
##            npar     AIC    LRT  Pr(Chi)   
## <none>          -4466.3                   
## treatment     4 -4458.2 16.083 0.002910 **
## whole.mean    1 -4462.1  6.233 0.012539 * 
## duration      1 -4460.7  7.658 0.005652 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
qqnorm(resid(submod.3));qqline(resid(submod.3)) #fine ish 

Keep “submod.3” : relative_fat ~ treatment + whole.mean + duration + (1 | colony)

Step 4 - Results

Anova(rf.update2)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: logrf
##             Chisq Df Pr(>Chisq)    
## treatment 22.7850  4  0.0001398 ***
## duration   5.1138  1  0.0237368 *  
## qro        9.0967  3  0.0280322 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf2.emm <- emmeans(rf.update2, "treatment")
pairs(rf2.emm)
##  contrast                estimate     SE   df t.ratio p.value
##  treatment1 - treatment2   0.0257 0.0909 26.9   0.283  0.9985
##  treatment1 - treatment3   0.2772 0.0904 24.9   3.068  0.0376
##  treatment1 - treatment4   0.0496 0.0852 22.3   0.582  0.9763
##  treatment1 - treatment5  -0.1308 0.0862 23.3  -1.517  0.5624
##  treatment2 - treatment3   0.2515 0.0899 29.0   2.797  0.0636
##  treatment2 - treatment4   0.0239 0.0827 21.7   0.289  0.9983
##  treatment2 - treatment5  -0.1564 0.0819 24.0  -1.910  0.3393
##  treatment3 - treatment4  -0.2276 0.0878 23.9  -2.594  0.1036
##  treatment3 - treatment5  -0.4080 0.0876 25.0  -4.657  0.0008
##  treatment4 - treatment5  -0.1804 0.0805 19.5  -2.242  0.2063
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 5 estimates
plot(rf2.emm, comparisons = TRUE)

Keep the rfupdate.2 model. The means comparisons matches the visualization better for this model, and it is not based on the subset data. The qqplot doesn’t look as good for this model, but it’s not terrible and I’d rather keep the whole data set

rf.sum <- rf_sub %>%
  group_by(treatment) %>%
  summarise(mrf = mean(relative_fat), 
            sdrf = sd(relative_fat),
            nrf = length(relative_fat)) %>%
  mutate(serf = sdrf/sqrt(nrf))

rf.sum
## # A tibble: 5 × 5
##   treatment     mrf     sdrf   nrf      serf
##   <fct>       <dbl>    <dbl> <int>     <dbl>
## 1 1         0.00181 0.000663    70 0.0000792
## 2 2         0.00168 0.000559    75 0.0000645
## 3 3         0.00143 0.000582    59 0.0000758
## 4 4         0.00161 0.000565    88 0.0000603
## 5 5         0.00184 0.000490    77 0.0000558

Step 5 - Visualize

I should be able to make a model where 1 differs from 3 and 4, 2 differs from 3, 3 differs from 1, 2, 4, and 5, and 5 differs from 4 and 3. So actually the final model I will be keeping for the analysis is rf.int. This is the original data not subset, not log transformed, and the emmeans output most closely matches what we would expect to see based on the SE from the summary of the data means

rftuk.means <- emmeans(object = rf.update2,
                        specs = "treatment",
                        adjust = "Tukey",
                        type = "response")


rftuk.means
##  treatment emmean     SE   df lower.CL upper.CL
##  1          -6.39 0.0617 22.6    -6.57    -6.22
##  2          -6.42 0.0646 27.6    -6.60    -6.24
##  3          -6.67 0.0667 28.1    -6.85    -6.49
##  4          -6.44 0.0602 18.5    -6.61    -6.27
##  5          -6.26 0.0618 22.0    -6.44    -6.09
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates
rf.cld.model <- cld(object = rftuk.means,
                     adjust = "Tukey",
                     Letters = letters,
                     alpha = 0.05)
rf.cld.model
##  treatment emmean     SE   df lower.CL upper.CL .group
##  3          -6.67 0.0667 28.1    -6.85    -6.49  a    
##  4          -6.44 0.0602 18.5    -6.61    -6.27  ab   
##  2          -6.42 0.0646 27.6    -6.60    -6.24  ab   
##  1          -6.39 0.0617 22.6    -6.57    -6.22   b   
##  5          -6.26 0.0618 22.0    -6.44    -6.09   b   
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## P value adjustment: tukey method for comparing a family of 5 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.
rftuk.treatment <- as.data.frame(rf.cld.model)
rftuk.treatment
##  treatment    emmean         SE    df  lower.CL  upper.CL .group
##  3         -6.669400 0.06665291 28.12 -6.852954 -6.485846  a    
##  4         -6.441816 0.06016889 18.54 -6.613861 -6.269771  ab   
##  2         -6.417887 0.06456276 27.55 -6.595948 -6.239827  ab   
##  1         -6.392195 0.06167590 22.65 -6.565028 -6.219363   b   
##  5         -6.261443 0.06183873 22.03 -6.435175 -6.087710   b   
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## P value adjustment: tukey method for comparing a family of 5 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.
rf_max <- rf_sub %>%
  group_by(treatment) %>%
  summarize(maxrf = max(mean(relative_fat)))


rf_for_plotting <- full_join(rftuk.treatment, rf_max,
                              by="treatment")

rf <- ggplot(data = rf.sum, aes(x = treatment, y = mrf, fill = treatment)) +
  geom_col(col = "black")+
  coord_cartesian(ylim=c(0.0012, 0.002)) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) + 
  geom_errorbar(aes(ymin = mrf - serf, 
                    ymax = mrf + serf),
                position = position_dodge(0.9), width = 0.4) +
  labs(y = "Mean Drone Relative Fat (g)",) +
  ggtitle("Average Drone Relative Fat (g) per Treatment") +
  scale_x_discrete(name = "Treatment", 
                   labels = c("0 PPB", "150 PPB", "1,500 PPB", "15,000 PPB", "150,000 PPB")) +
  theme_cowplot()+
  theme_classic(base_size = 30) 

rf <- rf + 
  annotate(geom = "text", 
          x = 1, y = 0.002,
          label = "P < 0.01",
          size = 8) +
  annotate(geom = "text",
           x = c(3, 4, 2, 1, 5),
           y = rf_for_plotting$maxrf + 0.00013,
           label = c("a", "ab", "ab", "b", "b"),
           size = 8) +
  theme(legend.position =  "none")

rf

Relative Fat Results Summary

rf.update2
## Linear mixed model fit by REML ['lmerMod']
## Formula: logrf ~ treatment + duration + qro + (1 | colony)
##    Data: drf.pollen.rf
## REML criterion at convergence: 468.2842
## Random effects:
##  Groups   Name        Std.Dev.
##  colony   (Intercept) 0.08082 
##  Residual             0.42325 
## Number of obs: 382, groups:  colony, 40
## Fixed Effects:
## (Intercept)   treatment2   treatment3   treatment4   treatment5     duration  
##   -6.064316    -0.025692    -0.277205    -0.049621     0.130753    -0.008407  
##       qroB3        qroB4        qroB5  
##   -0.115118     0.195570     0.037383
rf_A <- as.data.frame(Anova(rf.update2))
Anova(rf.update2)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: logrf
##             Chisq Df Pr(>Chisq)    
## treatment 22.7850  4  0.0001398 ***
## duration   5.1138  1  0.0237368 *  
## qro        9.0967  3  0.0280322 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rf_A <- setDT(rf_A)
rf_A
##        Chisq Df   Pr(>Chisq)
## 1: 22.784981  4 0.0001397857
## 2:  5.113764  1 0.0237367685
## 3:  9.096717  3 0.0280322433
rf_emm <- emmeans(rf.update2, pairwise ~ treatment)
rf_contrasts <- as.data.frame(rf_emm$contrasts)
rf_means <- as.data.frame(rf_emm$emmeans)
rf_means <- setDT(rf_means)
rf_means
##    treatment    emmean         SE       df  lower.CL  upper.CL
## 1:         1 -6.392195 0.06167590 22.65252 -6.519890 -6.264501
## 2:         2 -6.417887 0.06456276 27.55485 -6.550234 -6.285540
## 3:         3 -6.669400 0.06665291 28.12181 -6.805906 -6.532894
## 4:         4 -6.441816 0.06016889 18.53819 -6.567964 -6.315668
## 5:         5 -6.261443 0.06183873 22.02824 -6.389679 -6.133206
rf_contrasts <- setDT(rf_contrasts)
rf_contrasts
##                    contrast    estimate         SE       df    t.ratio
##  1: treatment1 - treatment2  0.02569186 0.09087000 26.88925  0.2827320
##  2: treatment1 - treatment3  0.27720455 0.09036253 24.89005  3.0676936
##  3: treatment1 - treatment4  0.04962051 0.08519807 22.33308  0.5824136
##  4: treatment1 - treatment5 -0.13075290 0.08620444 23.30736 -1.5167769
##  5: treatment2 - treatment3  0.25151270 0.08990887 29.04124  2.7974179
##  6: treatment2 - treatment4  0.02392865 0.08274312 21.72116  0.2891921
##  7: treatment2 - treatment5 -0.15644476 0.08191357 23.97615 -1.9098760
##  8: treatment3 - treatment4 -0.22758404 0.08775157 23.86998 -2.5935040
##  9: treatment3 - treatment5 -0.40795745 0.08760466 25.03114 -4.6568009
## 10: treatment4 - treatment5 -0.18037341 0.08046528 19.47182 -2.2416304
##          p.value
##  1: 0.9985095277
##  2: 0.0376111188
##  3: 0.9763346462
##  4: 0.5623635051
##  5: 0.0636245950
##  6: 0.9983471765
##  7: 0.3393038516
##  8: 0.1035847601
##  9: 0.0007912811
## 10: 0.2063021347
rf.sum <- setDT(rf.sum)
rf.sum
##    treatment         mrf         sdrf nrf         serf
## 1:         1 0.001812857 0.0006628707  70 7.922820e-05
## 2:         2 0.001680000 0.0005587147  75 6.451482e-05
## 3:         3 0.001428814 0.0005819263  59 7.576035e-05
## 4:         4 0.001614773 0.0005653886  88 6.027063e-05
## 5:         5 0.001835065 0.0004895665  77 5.579128e-05

Drone Radial Cell Length

rc.drones <- subset(drf.pollen, select = c(radial, treatment, whole.mean, workers_alive, alive, duration, qro, colony))
rc.drones <- na.omit(rc.drones)
ggplot(rc.drones, aes(x=radial, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.05,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Radial Cell Length") +
  labs(y = "Count", x = "Length (mm) ")

shapiro.test(rc.drones$radial)
## 
##  Shapiro-Wilk normality test
## 
## data:  rc.drones$radial
## W = 0.98453, p-value = 0.000244
range(rc.drones$radial)
## [1] 1.6924 3.1542
rc.drones$radsquare <- (rc.drones$radial)^2

shapiro.test(rc.drones$radsquare)
## 
##  Shapiro-Wilk normality test
## 
## data:  rc.drones$radsquare
## W = 0.99253, p-value = 0.0397
ggplot(rc.drones, aes(x=radsquare, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 0.5,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Radial Cell Length ^2 ") +
  labs(y = "Count", x = "Length ^2 (mm) ")

Step 1 - Check for colinearity

rad.model <- lm(radial~ treatment + whole.mean + workers_alive + duration  + qro, data = rc.drones)
vif(rad.model)
##                   GVIF Df GVIF^(1/(2*Df))
## treatment     2.020243  4        1.091881
## whole.mean    1.737422  1        1.318113
## workers_alive 1.966186  1        1.402208
## duration      1.418566  1        1.191036
## qro           2.964081  3        1.198528
#No colinearity 

Step 2 - Work down from most complicated model

rad.int <- lmer(radsquare~ treatment*whole.mean + workers_alive + duration  + qro + (1|colony), data = rc.drones)

rad.g1 <- lmer(radsquare~ treatment + whole.mean + workers_alive + duration  + qro + (1|colony), data = rc.drones)   #this is the model we are keeping

rad.g2 <- lmer(radsquare~ whole.mean + workers_alive + duration  + qro + (1|colony), data = rc.drones)
anova(rad.int, rad.g1)
## Data: rc.drones
## Models:
## rad.g1: radsquare ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
## rad.int: radsquare ~ treatment * whole.mean + workers_alive + duration + qro + (1 | colony)
##         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## rad.g1    13 1137.5 1189.7 -555.77   1111.5                     
## rad.int   17 1143.4 1211.5 -554.70   1109.4 2.1546  4     0.7073
anova(rad.g1, rad.g2)
## Data: rc.drones
## Models:
## rad.g2: radsquare ~ whole.mean + workers_alive + duration + qro + (1 | colony)
## rad.g1: radsquare ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
##        npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
## rad.g2    9 1139.3 1175.3 -560.64   1121.3                       
## rad.g1   13 1137.5 1189.7 -555.77   1111.5 9.7236  4    0.04535 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step 2.a - Drop1

drop1(rad.g1, test = "Chisq")
## Single term deletions
## 
## Model:
## radsquare ~ treatment + whole.mean + workers_alive + duration + 
##     qro + (1 | colony)
##               npar    AIC    LRT Pr(Chi)  
## <none>             1137.5                 
## treatment        4 1139.3 9.7236 0.04535 *
## whole.mean       1 1135.6 0.0415 0.83864  
## workers_alive    1 1136.0 0.4346 0.50974  
## duration         1 1138.5 2.9488 0.08594 .
## qro              3 1135.4 3.8350 0.27984  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rad.g1.update <- update(rad.g1, .~. -whole.mean)
anova(rad.g1.update, rad.g1)
## Data: rc.drones
## Models:
## rad.g1.update: radsquare ~ treatment + workers_alive + duration + qro + (1 | colony)
## rad.g1: radsquare ~ treatment + whole.mean + workers_alive + duration + qro + (1 | colony)
##               npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## rad.g1.update   12 1135.6 1183.7 -555.80   1111.6                     
## rad.g1          13 1137.5 1189.7 -555.77   1111.5 0.0415  1     0.8386
drop1(rad.g1.update, test = "Chisq")
## Single term deletions
## 
## Model:
## radsquare ~ treatment + workers_alive + duration + qro + (1 | 
##     colony)
##               npar    AIC    LRT Pr(Chi)  
## <none>             1135.6                 
## treatment        4 1137.3 9.6838 0.04611 *
## workers_alive    1 1134.0 0.4178 0.51805  
## duration         1 1136.6 2.9715 0.08474 .
## qro              3 1133.6 3.9915 0.26239  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rad.g1.update2 <- update(rad.g1.update, .~. -workers_alive)
anova(rad.g1.update2, rad.g1.update)
## Data: rc.drones
## Models:
## rad.g1.update2: radsquare ~ treatment + duration + qro + (1 | colony)
## rad.g1.update: radsquare ~ treatment + workers_alive + duration + qro + (1 | colony)
##                npar    AIC    BIC logLik deviance  Chisq Df Pr(>Chisq)
## rad.g1.update2   11 1134.0 1178.1 -556.0   1112.0                     
## rad.g1.update    12 1135.6 1183.7 -555.8   1111.6 0.4178  1      0.518
drop1(rad.g1.update2, test = "Chisq")
## Single term deletions
## 
## Model:
## radsquare ~ treatment + duration + qro + (1 | colony)
##           npar    AIC    LRT Pr(Chi)  
## <none>         1134.0                 
## treatment    4 1135.5 9.4634 0.05050 .
## duration     1 1134.7 2.6867 0.10119  
## qro          3 1136.3 8.3357 0.03956 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
rad.g1.update3 <- update(rad.g1.update2, .~. -duration)
anova(rad.g1.update3, rad.g1.update2)
## Data: rc.drones
## Models:
## rad.g1.update3: radsquare ~ treatment + qro + (1 | colony)
## rad.g1.update2: radsquare ~ treatment + duration + qro + (1 | colony)
##                npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
## rad.g1.update3   10 1134.7 1174.8 -557.35   1114.7                     
## rad.g1.update2   11 1134.0 1178.1 -556.00   1112.0 2.6867  1     0.1012
drop1(rad.g1.update3, test = "Chisq")
## Single term deletions
## 
## Model:
## radsquare ~ treatment + qro + (1 | colony)
##           npar    AIC    LRT Pr(Chi)  
## <none>         1134.7                 
## treatment    4 1136.0 9.3429 0.05308 .
## qro          3 1135.5 6.8008 0.07853 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step 3 - Check model fit

qqnorm(resid(rad.g1.update3));qqline(resid(rad.g1.update3))   

plot(resid(rad.g1.update3)) + 
  abline(h=0, col="red", lwd=2) 

## integer(0)
#yay! :) 

Step 4 - Results

summary(rad.g1.update3)
## Linear mixed model fit by REML ['lmerMod']
## Formula: radsquare ~ treatment + qro + (1 | colony)
##    Data: rc.drones
## 
## REML criterion at convergence: 1130.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.3472 -0.6072  0.0182  0.6166  4.0743 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  colony   (Intercept) 0.07885  0.2808  
##  Residual             0.87347  0.9346  
## Number of obs: 407, groups:  colony, 40
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept)  6.11568    0.18028  33.924
## treatment2  -0.15929    0.21767  -0.732
## treatment3  -0.57036    0.22613  -2.522
## treatment4  -0.08059    0.21442  -0.376
## treatment5  -0.08936    0.21684  -0.412
## qroB3       -0.07460    0.22968  -0.325
## qroB4        0.18359    0.21448   0.856
## qroB5        0.35329    0.16412   2.153
## 
## Correlation of Fixed Effects:
##            (Intr) trtmn2 trtmn3 trtmn4 trtmn5 qroB3  qroB4 
## treatment2 -0.689                                          
## treatment3 -0.596  0.488                                   
## treatment4 -0.687  0.529  0.492                            
## treatment5 -0.692  0.529  0.487  0.528                     
## qroB3      -0.320  0.095 -0.003  0.036  0.180              
## qroB4      -0.358  0.097  0.007  0.199  0.085  0.204       
## qroB5      -0.415  0.140  0.037  0.063  0.100  0.274  0.283
Anova(rad.g1.update3)
## Analysis of Deviance Table (Type II Wald chisquare tests)
## 
## Response: radsquare
##            Chisq Df Pr(>Chisq)
## treatment 7.7130  4     0.1027
## qro       5.6914  3     0.1276
rad.emm <- emmeans(rad.g1.update3, "treatment")
pairs(rad.emm)
##  contrast                estimate    SE   df t.ratio p.value
##  treatment1 - treatment2  0.15929 0.219 26.8   0.729  0.9479
##  treatment1 - treatment3  0.57036 0.228 28.2   2.506  0.1177
##  treatment1 - treatment4  0.08059 0.215 23.2   0.374  0.9955
##  treatment1 - treatment5  0.08936 0.218 24.9   0.411  0.9936
##  treatment2 - treatment3  0.41107 0.226 30.8   1.817  0.3826
##  treatment2 - treatment4 -0.07870 0.211 24.8  -0.374  0.9956
##  treatment2 - treatment5 -0.06994 0.211 26.2  -0.331  0.9973
##  treatment3 - treatment4 -0.48977 0.224 26.9  -2.187  0.2150
##  treatment3 - treatment5 -0.48100 0.226 28.6  -2.127  0.2364
##  treatment4 - treatment5  0.00877 0.211 22.9   0.042  1.0000
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## P value adjustment: tukey method for comparing a family of 5 estimates
rad.sum <- rc.drones %>%
  group_by(treatment) %>%
  summarise(rad.m = mean(radial), 
            rad.sd = sd(radial),
            rad.n = length(radial)) %>%
  mutate(serad = rad.sd/sqrt(rad.n))
rad.sum
## # A tibble: 5 × 5
##   treatment rad.m rad.sd rad.n  serad
##   <fct>     <dbl>  <dbl> <int>  <dbl>
## 1 1          2.51  0.161    79 0.0182
## 2 2          2.45  0.183    76 0.0209
## 3 3          2.36  0.243    62 0.0309
## 4 4          2.47  0.231   104 0.0227
## 5 5          2.48  0.165    86 0.0178

Step 5 - Visualize

radanova_summary <- summary(rad.g1.update3)
         
         
radtuk.means <- emmeans(object = rad.g1.update3,
                        specs = "treatment",
                        adjust = "Tukey",
                        type = "response")


radtuk.means
##  treatment emmean    SE   df lower.CL upper.CL
##  1           6.23 0.157 23.8     5.79     6.67
##  2           6.07 0.158 28.6     5.64     6.51
##  3           5.66 0.168 31.1     5.20     6.12
##  4           6.15 0.155 20.3     5.71     6.59
##  5           6.14 0.160 24.3     5.70     6.59
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates
rad.cld.model <- cld(object = radtuk.means,
                     adjust = "Tukey",
                     Letters = letters,
                     alpha = 0.05)
rad.cld.model
##  treatment emmean    SE   df lower.CL upper.CL .group
##  3           5.66 0.168 31.1     5.20     6.12  a    
##  2           6.07 0.158 28.6     5.64     6.51  a    
##  5           6.14 0.160 24.3     5.70     6.59  a    
##  4           6.15 0.155 20.3     5.71     6.59  a    
##  1           6.23 0.157 23.8     5.79     6.67  a    
## 
## Results are averaged over the levels of: qro 
## Degrees-of-freedom method: kenward-roger 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## P value adjustment: tukey method for comparing a family of 5 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.
radtuk.treatment <- as.data.frame(rad.cld.model)

rad_max <- rc.drones %>%
  group_by(treatment) %>%
  summarize(maxrad = max(mean(radial)))


rad_for_plotting <- full_join(radtuk.treatment, rad_max,
                              by="treatment")
radp <- ggplot(data = rad.sum, aes(x = treatment, y = rad.m, fill = treatment)) +
  geom_col(col = "black")+
  coord_cartesian(ylim=c(2,2.55)) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) + 
  geom_errorbar(aes(ymin = rad.m - serad, 
                    ymax = rad.m + serad),
                position = position_dodge(0.9), width = 0.4) +
  labs(y = "Mean Drone Radial Cell Length",) +
  ggtitle("Average Drone Radial Cell Length (mm) per Treatment") +
  scale_x_discrete(name = "Treatment", 
                   labels = c("0 PPB", "150 PPB", "1,500 PPB", "15,000 PPB", "150,000 PPB")) +
  theme_cowplot()+
  theme_classic(base_size = 30) +
  theme(legend.position = "none")

radp <- radp + 
  annotate(geom = "text", 
          x = 2, y = 2.54,
          label = "P > 0.1",
          size = 12) +
  annotate(geom = "text",
           x = c(3, 2, 5, 4, 1),
           y = rad_for_plotting$maxrad + 0.05,
           label = c("a", "a", "a", "a", "a"),
           size = 12) +
  theme(legend.position =  "none")

radp

Radial Cell Results Summary

rad.g1.update3
## Linear mixed model fit by REML ['lmerMod']
## Formula: radsquare ~ treatment + qro + (1 | colony)
##    Data: rc.drones
## REML criterion at convergence: 1130.311
## Random effects:
##  Groups   Name        Std.Dev.
##  colony   (Intercept) 0.2808  
##  Residual             0.9346  
## Number of obs: 407, groups:  colony, 40
## Fixed Effects:
## (Intercept)   treatment2   treatment3   treatment4   treatment5        qroB3  
##     6.11568     -0.15929     -0.57036     -0.08059     -0.08936     -0.07460  
##       qroB4        qroB5  
##     0.18359      0.35329
rad_A <- as.data.frame(Anova(rad.g1.update3))
rad_A <- setDT(rad_A)
rad_A
##       Chisq Df Pr(>Chisq)
## 1: 7.713042  4  0.1026738
## 2: 5.691425  3  0.1276272
rad_emm <- emmeans(rad.g1.update3, pairwise ~ treatment)
rad_contrasts <- as.data.frame(rad_emm$contrasts)
rad_contrasts <- setDT(rad_contrasts)
rad_contrasts
##                    contrast     estimate        SE       df     t.ratio
##  1: treatment1 - treatment2  0.159291661 0.2185811 26.82775  0.72875315
##  2: treatment1 - treatment3  0.570356861 0.2275743 28.22011  2.50624471
##  3: treatment1 - treatment4  0.080588327 0.2154953 23.24891  0.37396799
##  4: treatment1 - treatment5  0.089356194 0.2176651 24.85426  0.41052153
##  5: treatment2 - treatment3  0.411065201 0.2262541 30.79816  1.81682950
##  6: treatment2 - treatment4 -0.078703333 0.2107108 24.76664 -0.37351345
##  7: treatment2 - treatment5 -0.069935467 0.2114946 26.25425 -0.33067254
##  8: treatment3 - treatment4 -0.489768534 0.2239194 26.85584 -2.18725366
##  9: treatment3 - treatment5 -0.481000667 0.2260942 28.59779 -2.12743525
## 10: treatment4 - treatment5  0.008767867 0.2105243 22.94982  0.04164777
##       p.value
##  1: 0.9478777
##  2: 0.1176911
##  3: 0.9955388
##  4: 0.9936479
##  5: 0.3825667
##  6: 0.9955783
##  7: 0.9972502
##  8: 0.2150167
##  9: 0.2364409
## 10: 0.9999993
rad_means <- as.data.frame(rad_emm$emmeans)
rad_means <- setDT(rad_means)
rad_means
##    treatment   emmean        SE       df lower.CL upper.CL
## 1:         1 6.231249 0.1569505 23.84265 5.907206 6.555292
## 2:         2 6.071957 0.1584968 28.58486 5.747590 6.396324
## 3:         3 5.660892 0.1679997 31.07016 5.318286 6.003498
## 4:         4 6.150660 0.1552761 20.28489 5.827052 6.474269
## 5:         5 6.141893 0.1604075 24.32014 5.811058 6.472727
rad.sum <- as.data.frame(rad.sum)
rad.sum <- setDT(rad.sum)
rad.sum
##    treatment    rad.m    rad.sd rad.n      serad
## 1:         1 2.509105 0.1614492    79 0.01816446
## 2:         2 2.453703 0.1825906    76 0.02094458
## 3:         3 2.363773 0.2433873    62 0.03091021
## 4:         4 2.468626 0.2314272   104 0.02269331
## 5:         5 2.475636 0.1652572    86 0.01782014

Drone Counts

trunc.csv <- read_csv("duration.fortrunc.csv", 
    col_types = cols(round = col_factor(levels = c("1", 
        "2")), treatment = col_factor(levels = c("1", 
        "2", "3", "4", "5")), replicate = col_factor(levels = c("1", 
        "2", "3", "4", "5", "7", "9", "11", 
        "12")), start_date = col_date(format = "%m/%d/%Y"), 
        emerge_date = col_date(format = "%m/%d/%Y"), 
        end_date = col_date(format = "%m/%d/%Y")))    # this data set is for drone counts 

trunc <- merge(wd.summary, trunc.csv, by.x = "colony")
trunc <- merge(mortality, trunc, by.x = "colony")

trunc$qro <- as.factor(trunc$origin)
count.drones <- subset(trunc, select = c(count, treatment, whole.mean, alive, duration, qro, colony))
count.drones <- na.omit(count.drones)
ggplot(count.drones, aes(x=count, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 1 ,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Drone Count") +
  labs(y = "Count", x = "Number of Drones")

Step 1 - Check for colinearity

count.model <- lm(count~ treatment + whole.mean + alive + duration + qro, data = count.drones)
vif(count.model)
##                GVIF Df GVIF^(1/(2*Df))
## treatment  1.443153  4        1.046921
## whole.mean 2.049137  1        1.431481
## alive      2.511104  1        1.584646
## duration   2.084378  1        1.443738
## qro        1.897492  3        1.112662

Step 2 - Work down from most complicated model

count.pois <- glm(count ~ treatment + whole.mean +alive +duration + qro, data = count.drones, family = "poisson")
summary(count.pois)   #overdispersed 
## 
## Call:
## glm(formula = count ~ treatment + whole.mean + alive + duration + 
##     qro, family = "poisson", data = count.drones)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.8240  -1.5124  -0.6275   0.9664   2.7418  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.15115    0.64327  -1.790 0.073528 .  
## treatment2  -0.06390    0.15584  -0.410 0.681776    
## treatment3  -0.45881    0.16131  -2.844 0.004452 ** 
## treatment4  -0.02662    0.16024  -0.166 0.868060    
## treatment5   0.13738    0.16634   0.826 0.408849    
## whole.mean   3.04430    0.40744   7.472 7.91e-14 ***
## alive        0.15824    0.06218   2.545 0.010933 *  
## duration     0.02629    0.01308   2.010 0.044444 *  
## qroB3        0.25413    0.15904   1.598 0.110063    
## qroB4       -0.06042    0.18029  -0.335 0.737534    
## qroB5        0.46523    0.13301   3.498 0.000469 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 275.44  on 44  degrees of freedom
## Residual deviance: 107.43  on 34  degrees of freedom
## AIC: 291.43
## 
## Number of Fisher Scoring iterations: 5
count.pois.int <- glm(count ~ treatment*whole.mean +alive +duration + qro, data = count.drones, family = "poisson")
summary(count.pois.int) # tiny bit better but still over dispersed 
## 
## Call:
## glm(formula = count ~ treatment * whole.mean + alive + duration + 
##     qro, family = "poisson", data = count.drones)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.6978  -1.3029  -0.3356   0.8896   3.0905  
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)           -2.76021    0.98150  -2.812 0.004920 ** 
## treatment2             0.53851    0.70539   0.763 0.445218    
## treatment3             0.23181    0.57204   0.405 0.685301    
## treatment4             1.50047    0.59796   2.509 0.012096 *  
## treatment5             0.50654    0.56511   0.896 0.370065    
## whole.mean             4.61959    0.85370   5.411 6.26e-08 ***
## alive                  0.16773    0.07043   2.381 0.017243 *  
## duration               0.04214    0.01542   2.732 0.006286 ** 
## qroB3                  0.31250    0.17676   1.768 0.077070 .  
## qroB4                 -0.17270    0.19161  -0.901 0.367412    
## qroB5                  0.54421    0.14467   3.762 0.000169 ***
## treatment2:whole.mean -1.04982    1.24490  -0.843 0.399064    
## treatment3:whole.mean -1.27992    0.93366  -1.371 0.170416    
## treatment4:whole.mean -2.57286    0.97332  -2.643 0.008208 ** 
## treatment5:whole.mean -0.55282    1.00544  -0.550 0.582440    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 275.444  on 44  degrees of freedom
## Residual deviance:  99.683  on 30  degrees of freedom
## AIC: 291.69
## 
## Number of Fisher Scoring iterations: 5
count.int <- glm.nb(count~ treatment*whole.mean + alive + duration  + qro, data = count.drones)

count.g1 <- glm.nb(count~ treatment + whole.mean + alive + duration  + qro , data = count.drones)   #this is the model we are keeping

count.g2 <- glm.nb(count~ treatment + alive + duration  + qro, data = count.drones)

count.g3 <- glm.nb(count~ whole.mean + alive + duration  + qro, data = count.drones)
anova(count.int, count.g1)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: count
##                                             Model    theta Resid. df
## 1 treatment + whole.mean + alive + duration + qro 6.877672        34
## 2 treatment * whole.mean + alive + duration + qro 7.979431        30
##      2 x log-lik.   Test    df LR stat.   Pr(Chi)
## 1       -251.3451                                
## 2       -247.4647 1 vs 2     4 3.880433 0.4224293
anova(count.g1, count.g2)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: count
##                                             Model    theta Resid. df
## 1              treatment + alive + duration + qro 2.882863        35
## 2 treatment + whole.mean + alive + duration + qro 6.877672        34
##      2 x log-lik.   Test    df LR stat.      Pr(Chi)
## 1       -275.2316                                   
## 2       -251.3451 1 vs 2     1  23.8865 1.021861e-06
anova(count.g1, count.g3)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: count
##                                             Model    theta Resid. df
## 1             whole.mean + alive + duration + qro 5.201726        38
## 2 treatment + whole.mean + alive + duration + qro 6.877672        34
##      2 x log-lik.   Test    df LR stat.   Pr(Chi)
## 1       -258.0562                                
## 2       -251.3451 1 vs 2     4 6.711111 0.1519653
AIC(count.g1, count.g3)
##          df      AIC
## count.g1 12 275.3451
## count.g3  8 274.0562
AIC(count.g1, count.int)
##           df      AIC
## count.g1  12 275.3451
## count.int 16 279.4647

Step 2.a - Drop1

drop1(count.g1, test = "Chisq")
## Single term deletions
## 
## Model:
## count ~ treatment + whole.mean + alive + duration + qro
##            Df Deviance    AIC     LRT  Pr(>Chi)    
## <none>          52.237 273.35                      
## treatment   4   59.450 272.56  7.2135  0.125026    
## whole.mean  1   82.877 301.99 30.6403 3.106e-08 ***
## alive       1   60.595 279.70  8.3586  0.003839 ** 
## duration    1   53.307 272.42  1.0701  0.300918    
## qro         3   65.299 280.41 13.0619  0.004505 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
count.g1.update <- update(count.g1, .~. -duration)
anova(count.g1, count.g1.update)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: count
##                                             Model    theta Resid. df
## 1            treatment + whole.mean + alive + qro 6.376087        35
## 2 treatment + whole.mean + alive + duration + qro 6.877672        34
##      2 x log-lik.   Test    df LR stat.   Pr(Chi)
## 1       -252.3811                                
## 2       -251.3451 1 vs 2     1  1.03604 0.3087442
drop1(count.g1.update, test = "Chisq")  #get rid of duration 
## Single term deletions
## 
## Model:
## count ~ treatment + whole.mean + alive + qro
##            Df Deviance    AIC    LRT  Pr(>Chi)    
## <none>          51.476 272.38                     
## treatment   4   57.689 270.60  6.213 0.1837678    
## whole.mean  1   83.444 302.35 31.968 1.568e-08 ***
## alive       1   65.863 284.77 14.387 0.0001488 ***
## qro         3   67.517 282.42 16.041 0.0011120 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step 3 - Check model fit

qqnorm(resid(count.g1.update));qqline(resid(count.g1.update))

plot(resid(count.g1.update)) + 
  abline(h=0, col="red", lwd=2) 

## integer(0)
#these are actually not bad 

Step 4 - Results

summary(count.g1.update)
## 
## Call:
## glm.nb(formula = count ~ treatment + whole.mean + alive + qro, 
##     data = count.drones, init.theta = 6.376086876, link = log)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.1372  -1.1678  -0.2329   0.4935   1.9080  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.880940   0.440731  -1.999 0.045628 *  
## treatment2  -0.184572   0.255323  -0.723 0.469744    
## treatment3  -0.547470   0.262738  -2.084 0.037187 *  
## treatment4  -0.087990   0.260836  -0.337 0.735860    
## treatment5   0.006537   0.265187   0.025 0.980334    
## whole.mean   3.250836   0.567554   5.728 1.02e-08 ***
## alive        0.327408   0.088239   3.710 0.000207 ***
## qroB3        0.180576   0.267796   0.674 0.500116    
## qroB4       -0.068601   0.314774  -0.218 0.827478    
## qroB5        0.813970   0.217973   3.734 0.000188 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(6.3761) family taken to be 1)
## 
##     Null deviance: 132.224  on 44  degrees of freedom
## Residual deviance:  51.476  on 35  degrees of freedom
## AIC: 274.38
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  6.38 
##           Std. Err.:  2.36 
## 
##  2 x log-likelihood:  -252.381
Anova(count.g1.update)
## Analysis of Deviance Table (Type II tests)
## 
## Response: count
##            LR Chisq Df Pr(>Chisq)    
## treatment     6.213  4  0.1837678    
## whole.mean   31.968  1  1.568e-08 ***
## alive        14.387  1  0.0001488 ***
## qro          16.041  3  0.0011120 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
em.count <- emmeans(count.g1.update, "treatment")
pairs(em.count)
##  contrast                estimate    SE  df z.ratio p.value
##  treatment1 - treatment2  0.18457 0.255 Inf   0.723  0.9513
##  treatment1 - treatment3  0.54747 0.263 Inf   2.084  0.2271
##  treatment1 - treatment4  0.08799 0.261 Inf   0.337  0.9972
##  treatment1 - treatment5 -0.00654 0.265 Inf  -0.025  1.0000
##  treatment2 - treatment3  0.36290 0.255 Inf   1.426  0.6110
##  treatment2 - treatment4 -0.09658 0.255 Inf  -0.379  0.9956
##  treatment2 - treatment5 -0.19111 0.253 Inf  -0.756  0.9431
##  treatment3 - treatment4 -0.45948 0.258 Inf  -1.783  0.3837
##  treatment3 - treatment5 -0.55401 0.260 Inf  -2.134  0.2058
##  treatment4 - treatment5 -0.09453 0.266 Inf  -0.355  0.9966
## 
## Results are averaged over the levels of: qro 
## Results are given on the log (not the response) scale. 
## P value adjustment: tukey method for comparing a family of 5 estimates
plot(em.count, comparisons = TRUE)

count.sum <- count.drones %>%
  group_by(treatment) %>%
  summarise(count.m = mean(count), 
            count.sd = sd(count),
            count.n = length(count)) %>%
  mutate(secount = count.sd/sqrt(count.n))
count.sum
## # A tibble: 5 × 5
##   treatment count.m count.sd count.n secount
##   <fct>       <dbl>    <dbl>   <int>   <dbl>
## 1 1            9.67     7.47       9    2.49
## 2 2            9.78     6.67       9    2.22
## 3 3            8.67     6.76       9    2.25
## 4 4           12.2      9.13       9    3.04
## 5 5           10.9      6.92       9    2.31

Step 5 - Visualize

countanova_summary <- summary(count.g1.update)
         
         
counttuk.means <- emmeans(object = count.g1.update,
                        specs = "treatment",
                        adjust = "Tukey",
                        type = "response")


counttuk.means
##  treatment response   SE  df asymp.LCL asymp.UCL
##  1             9.57 1.85 Inf      5.82     15.73
##  2             7.96 1.51 Inf      4.89     12.95
##  3             5.54 1.09 Inf      3.33      9.19
##  4             8.76 1.83 Inf      5.13     14.98
##  5             9.63 1.86 Inf      5.87     15.82
## 
## Results are averaged over the levels of: qro 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## Intervals are back-transformed from the log scale
count.cld.model <- cld(object = counttuk.means,
                     adjust = "Tukey",
                     Letters = letters,
                     alpha = 0.05)
count.cld.model
##  treatment response   SE  df asymp.LCL asymp.UCL .group
##  3             5.54 1.09 Inf      3.33      9.19  a    
##  2             7.96 1.51 Inf      4.89     12.95  a    
##  4             8.76 1.83 Inf      5.13     14.98  a    
##  1             9.57 1.85 Inf      5.82     15.73  a    
##  5             9.63 1.86 Inf      5.87     15.82  a    
## 
## Results are averaged over the levels of: qro 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## Intervals are back-transformed from the log scale 
## P value adjustment: tukey method for comparing a family of 5 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.
counttuk.means <- as.data.frame(counttuk.means)


countuk.treatment <- as.data.frame(count.cld.model)

count_max <- count.drones %>%
  group_by(treatment) %>%
  summarize(maxcount = max(mean(count)))


count_for_plotting <- full_join(countuk.treatment, count_max,
                              by="treatment")

ggplot(data = count.sum, aes(x = treatment, y = count.m, fill = treatment)) +
  geom_col(col = "black")+
  coord_cartesian(ylim=c(1,17.5)) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) + 
  geom_errorbar(aes(ymin = count.m-secount, 
                    ymax = count.m+secount),
                position = position_dodge(0.9), width = 0.4) +
  labs(y = "Mean Drone Count",) +
  ggtitle("Average Drone Count per Treatment") +
  scale_x_discrete(name = "Treatment", 
                   labels = c("0 PPB", "150 PPB", "1,500 PPB", "15,000 PPB", "150,000 PPB")) +
  theme_cowplot()+
  theme_classic(base_size = 30) +
  theme(legend.position = "none") +
  annotate(geom = "text", 
          x = 1.5, y = 16,
          label = "P > 0.05",
          size = 15) +
  annotate(geom = "text",
           x = c(3, 2, 4, 1, 5),
           y = count_for_plotting$maxcount + 3.5,
           label = c("a", "a", "a", "a", "a"),
           size = 12) +
  theme(legend.position =  "none")

Drone Counts Results Summary

count.g1.update
## 
## Call:  glm.nb(formula = count ~ treatment + whole.mean + alive + qro, 
##     data = count.drones, init.theta = 6.376086876, link = log)
## 
## Coefficients:
## (Intercept)   treatment2   treatment3   treatment4   treatment5   whole.mean  
##   -0.880940    -0.184572    -0.547470    -0.087990     0.006537     3.250836  
##       alive        qroB3        qroB4        qroB5  
##    0.327408     0.180576    -0.068601     0.813970  
## 
## Degrees of Freedom: 44 Total (i.e. Null);  35 Residual
## Null Deviance:       132.2 
## Residual Deviance: 51.48     AIC: 274.4
count_A <- as.data.frame(Anova(count.g1.update))
count_A <- setDT(count_A)
count_A
##     LR Chisq Df   Pr(>Chisq)
## 1:  6.213405  4 1.837678e-01
## 2: 31.967787  1 1.567504e-08
## 3: 14.386875  1 1.488361e-04
## 4: 16.041405  3 1.112033e-03
Anova(count.g1.update)
## Analysis of Deviance Table (Type II tests)
## 
## Response: count
##            LR Chisq Df Pr(>Chisq)    
## treatment     6.213  4  0.1837678    
## whole.mean   31.968  1  1.568e-08 ***
## alive        14.387  1  0.0001488 ***
## qro          16.041  3  0.0011120 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
count_emm <- emmeans(count.g1.update, pairwise ~ treatment)
count_contrasts <- as.data.frame(count_emm$contrasts)
count_contrasts <- setDT(count_contrasts)
count_contrasts
##                    contrast     estimate        SE  df     z.ratio   p.value
##  1: treatment1 - treatment2  0.184571649 0.2553227 Inf  0.72289543 0.9512914
##  2: treatment1 - treatment3  0.547470482 0.2627383 Inf  2.08371021 0.2270542
##  3: treatment1 - treatment4  0.087990455 0.2608359 Inf  0.33734025 0.9972171
##  4: treatment1 - treatment5 -0.006536866 0.2651874 Inf -0.02464999 0.9999999
##  5: treatment2 - treatment3  0.362898833 0.2545568 Inf  1.42561040 0.6110446
##  6: treatment2 - treatment4 -0.096581194 0.2549618 Inf -0.37880646 0.9956356
##  7: treatment2 - treatment5 -0.191108515 0.2529530 Inf -0.75551003 0.9431299
##  8: treatment3 - treatment4 -0.459480027 0.2577608 Inf -1.78258336 0.3837289
##  9: treatment3 - treatment5 -0.554007348 0.2596596 Inf -2.13359054 0.2057703
## 10: treatment4 - treatment5 -0.094527321 0.2659881 Inf -0.35538180 0.9965921
count_means <- as.data.frame(count_emm$emmeans)
count_means <- setDT(count_means)
count_means
##    treatment   emmean        SE  df asymp.LCL asymp.UCL
## 1:         1 2.258580 0.1935822 Inf  1.879166  2.637994
## 2:         2 2.074009 0.1897322 Inf  1.702140  2.445877
## 3:         3 1.711110 0.1973104 Inf  1.324389  2.097831
## 4:         4 2.170590 0.2086615 Inf  1.761621  2.579559
## 5:         5 2.265117 0.1931262 Inf  1.886597  2.643638

Colony Duration

duration <- subset(trunc, select = c(count, treatment, whole.mean, alive, duration, qro, emerge, colony))

duration$censored <- ifelse(is.na(duration$emerge), 1, 0)

duration$censored <- as.logical(duration$censored)
ggplot(duration, aes(x=duration, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 1 ,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Colony Duration") +
  labs(y = "Count", x = "Days")

descdist(duration$duration, discrete = TRUE)

## summary statistics
## ------
## min:  20   max:  58 
## median:  42 
## mean:  42.46667 
## estimated sd:  6.542171 
## estimated skewness:  -0.2500756 
## estimated kurtosis:  6.629389
duration$square.dur <- (duration$duration)^2

descdist(duration$square.dur, discrete = TRUE)

## summary statistics
## ------
## min:  400   max:  3364 
## median:  1764 
## mean:  1845.267 
## estimated sd:  553.6501 
## estimated skewness:  0.8579907 
## estimated kurtosis:  5.719182

Step 1 - Check for colinearity

dur.model <- lm(duration~ treatment + whole.mean + alive + qro, data = duration)
vif(dur.model)
##                GVIF Df GVIF^(1/(2*Df))
## treatment  1.144322  4        1.016994
## whole.mean 1.641378  1        1.281163
## alive      1.708799  1        1.307210
## qro        1.550084  3        1.075786

Step 2 - Work down from most complicated model

dur.pois <- glm(duration ~ treatment + whole.mean + alive + qro, data = duration, family = "poisson")
summary(count.pois)   #overdispersed 
## 
## Call:
## glm(formula = count ~ treatment + whole.mean + alive + duration + 
##     qro, family = "poisson", data = count.drones)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.8240  -1.5124  -0.6275   0.9664   2.7418  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.15115    0.64327  -1.790 0.073528 .  
## treatment2  -0.06390    0.15584  -0.410 0.681776    
## treatment3  -0.45881    0.16131  -2.844 0.004452 ** 
## treatment4  -0.02662    0.16024  -0.166 0.868060    
## treatment5   0.13738    0.16634   0.826 0.408849    
## whole.mean   3.04430    0.40744   7.472 7.91e-14 ***
## alive        0.15824    0.06218   2.545 0.010933 *  
## duration     0.02629    0.01308   2.010 0.044444 *  
## qroB3        0.25413    0.15904   1.598 0.110063    
## qroB4       -0.06042    0.18029  -0.335 0.737534    
## qroB5        0.46523    0.13301   3.498 0.000469 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 275.44  on 44  degrees of freedom
## Residual deviance: 107.43  on 34  degrees of freedom
## AIC: 291.43
## 
## Number of Fisher Scoring iterations: 5
dur.int <- glm.nb(duration~ treatment*whole.mean + alive + qro, data = duration)

dur.g1 <- glm.nb(duration~ treatment + whole.mean + alive + qro, data = duration)
drop1(dur.g1, test = "Chisq")
## Single term deletions
## 
## Model:
## duration ~ treatment + whole.mean + alive + qro
##            Df Deviance    AIC     LRT Pr(>Chi)   
## <none>          22.659 293.65                    
## treatment   4   28.258 291.25  5.5995 0.231122   
## whole.mean  1   27.591 296.58  4.9320 0.026363 * 
## alive       1   32.902 301.90 10.2434 0.001372 **
## qro         3   27.751 292.75  5.0917 0.165204   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dur.g2 <- glm.nb(duration~ treatment + alive  + qro, data = duration)

dur.g3 <- glm.nb(duration~ whole.mean + alive + qro, data = duration)

# Switch to squared data below to get rid of warning messages 
dur.pois <- glm(square.dur ~ treatment + whole.mean + alive + qro, data = duration, family = "poisson")
summary(count.pois)   #overdispersed 
## 
## Call:
## glm(formula = count ~ treatment + whole.mean + alive + duration + 
##     qro, family = "poisson", data = count.drones)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.8240  -1.5124  -0.6275   0.9664   2.7418  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.15115    0.64327  -1.790 0.073528 .  
## treatment2  -0.06390    0.15584  -0.410 0.681776    
## treatment3  -0.45881    0.16131  -2.844 0.004452 ** 
## treatment4  -0.02662    0.16024  -0.166 0.868060    
## treatment5   0.13738    0.16634   0.826 0.408849    
## whole.mean   3.04430    0.40744   7.472 7.91e-14 ***
## alive        0.15824    0.06218   2.545 0.010933 *  
## duration     0.02629    0.01308   2.010 0.044444 *  
## qroB3        0.25413    0.15904   1.598 0.110063    
## qroB4       -0.06042    0.18029  -0.335 0.737534    
## qroB5        0.46523    0.13301   3.498 0.000469 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 275.44  on 44  degrees of freedom
## Residual deviance: 107.43  on 34  degrees of freedom
## AIC: 291.43
## 
## Number of Fisher Scoring iterations: 5
dur.int <- glm.nb(square.dur~ treatment*whole.mean + alive + qro, data = duration)

dur.g1 <- glm.nb(square.dur~ treatment + whole.mean + alive + qro, data = duration)
drop1(dur.g1, test = "Chisq")
## Single term deletions
## 
## Model:
## square.dur ~ treatment + whole.mean + alive + qro
##            Df Deviance    AIC     LRT  Pr(>Chi)    
## <none>          45.458 684.39                      
## treatment   4   58.601 689.54 13.1426  0.010600 *  
## whole.mean  1   55.290 692.23  9.8316  0.001715 ** 
## alive       1   67.018 703.95 21.5601 3.429e-06 ***
## qro         3   56.324 689.26 10.8661  0.012472 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dur.g2 <- glm.nb(square.dur~ treatment + alive  + qro, data = duration)

dur.g3 <- glm.nb(square.dur~ whole.mean + alive + qro, data = duration)

dur.g4 <- glm.nb(square.dur ~ treatment, data = duration)

dur.cen <- glm.nb(square.dur~ treatment + censored + whole.mean + alive + qro, data = duration) # 
drop1(dur.cen, test = "Chisq")
## Single term deletions
## 
## Model:
## square.dur ~ treatment + censored + whole.mean + alive + qro
##            Df Deviance    AIC     LRT Pr(>Chi)   
## <none>          45.457 686.35                    
## treatment   4   58.648 691.55 13.1910 0.010379 * 
## censored    1   45.498 684.39  0.0405 0.840505   
## whole.mean  1   55.280 694.18  9.8223 0.001724 **
## alive       1   52.376 691.27  6.9184 0.008531 **
## qro         3   54.893 689.79  9.4358 0.024025 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(dur.g1, dur.cen)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: square.dur
##                                             Model    theta Resid. df
## 1            treatment + whole.mean + alive + qro 21.05744        35
## 2 treatment + censored + whole.mean + alive + qro 21.07611        34
##      2 x log-lik.   Test    df   LR stat.   Pr(Chi)
## 1       -664.3947                                  
## 2       -664.3542 1 vs 2     1 0.04048299 0.8405392
AIC(dur.pois, dur.g1)
##          df       AIC
## dur.pois 10 4199.0536
## dur.g1   11  686.3947
AIC(dur.g1, dur.g2, dur.g3, dur.g4)
##        df      AIC
## dur.g1 11 686.3947
## dur.g2 10 693.2944
## dur.g3  7 689.9570
## dur.g4  6 703.4817
anova(dur.g1, dur.g3, dur.g4)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: square.dur
##                                  Model    theta Resid. df    2 x log-lik.
## 1                            treatment 11.60760        40       -691.4817
## 2             whole.mean + alive + qro 16.31718        39       -675.9570
## 3 treatment + whole.mean + alive + qro 21.05744        35       -664.3947
##     Test    df LR stat.      Pr(Chi)
## 1                                   
## 2 1 vs 2     1  15.5247 8.143412e-05
## 3 2 vs 3     4  11.5623 2.092096e-02
AIC(dur.g1, dur.cen)
##         df      AIC
## dur.g1  11 686.3947
## dur.cen 12 688.3542

Step 3 - Check model fit

qqnorm(resid(dur.g3));qqline(resid(dur.g3))

qqnorm(resid(dur.g1));qqline(resid(dur.g1))   # I almost feel like this one fits better 

qqnorm(resid(dur.cen));qqline(resid(dur.cen))

summary(dur.g1)
## 
## Call:
## glm.nb(formula = square.dur ~ treatment + whole.mean + alive + 
##     qro, data = duration, init.theta = 21.05743915, link = log)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.89476  -0.75776   0.00199   0.60069   2.22508  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  7.48890    0.12691  59.012  < 2e-16 ***
## treatment2  -0.22563    0.10490  -2.151  0.03148 *  
## treatment3  -0.14635    0.10716  -1.366  0.17200    
## treatment4  -0.30842    0.10401  -2.965  0.00302 ** 
## treatment5  -0.33825    0.10672  -3.169  0.00153 ** 
## whole.mean  -0.73649    0.23250  -3.168  0.00154 ** 
## alive        0.13810    0.02756   5.012  5.4e-07 ***
## qroB3       -0.28456    0.10963  -2.596  0.00944 ** 
## qroB4       -0.01014    0.12836  -0.079  0.93706    
## qroB5        0.13285    0.08959   1.483  0.13813    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(21.0574) family taken to be 1)
## 
##     Null deviance: 91.425  on 44  degrees of freedom
## Residual deviance: 45.458  on 35  degrees of freedom
## AIC: 686.39
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  21.06 
##           Std. Err.:  4.47 
## 
##  2 x log-likelihood:  -664.395
summary(dur.g3)
## 
## Call:
## glm.nb(formula = square.dur ~ whole.mean + alive + qro, data = duration, 
##     init.theta = 16.31718118, link = log)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -3.3506  -0.5620  -0.0943   0.4540   2.6766  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  7.38105    0.13375  55.184  < 2e-16 ***
## whole.mean  -0.68794    0.25724  -2.674 0.007488 ** 
## alive        0.11240    0.02980   3.772 0.000162 ***
## qroB3       -0.26889    0.12412  -2.166 0.030287 *  
## qroB4       -0.04101    0.14408  -0.285 0.775925    
## qroB5        0.11116    0.10092   1.101 0.270697    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(16.3172) family taken to be 1)
## 
##     Null deviance: 71.078  on 44  degrees of freedom
## Residual deviance: 45.569  on 39  degrees of freedom
## AIC: 689.96
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  16.32 
##           Std. Err.:  3.45 
## 
##  2 x log-likelihood:  -675.957
summary(dur.cen)
## 
## Call:
## glm.nb(formula = square.dur ~ treatment + censored + whole.mean + 
##     alive + qro, data = duration, init.theta = 21.07611137, link = log)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.89644  -0.76399   0.01806   0.60745   2.31893  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   7.53185    0.25378  29.679  < 2e-16 ***
## treatment2   -0.22507    0.10518  -2.140  0.03237 *  
## treatment3   -0.14710    0.10713  -1.373  0.16972    
## treatment4   -0.31112    0.10409  -2.989  0.00280 ** 
## treatment5   -0.33752    0.10716  -3.150  0.00163 ** 
## censoredTRUE -0.04307    0.22865  -0.188  0.85061    
## whole.mean   -0.74333    0.23611  -3.148  0.00164 ** 
## alive         0.13025    0.04920   2.647  0.00812 ** 
## qroB3        -0.28361    0.10975  -2.584  0.00976 ** 
## qroB4        -0.01326    0.12880  -0.103  0.91801    
## qroB5         0.12416    0.09869   1.258  0.20834    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(21.0761) family taken to be 1)
## 
##     Null deviance: 91.505  on 44  degrees of freedom
## Residual deviance: 45.457  on 34  degrees of freedom
## AIC: 688.35
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  21.08 
##           Std. Err.:  4.47 
## 
##  2 x log-likelihood:  -664.354
drop1(dur.cen, test = "Chisq")
## Single term deletions
## 
## Model:
## square.dur ~ treatment + censored + whole.mean + alive + qro
##            Df Deviance    AIC     LRT Pr(>Chi)   
## <none>          45.457 686.35                    
## treatment   4   58.648 691.55 13.1910 0.010379 * 
## censored    1   45.498 684.39  0.0405 0.840505   
## whole.mean  1   55.280 694.18  9.8223 0.001724 **
## alive       1   52.376 691.27  6.9184 0.008531 **
## qro         3   54.893 689.79  9.4358 0.024025 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dur.cen.update <- update(dur.cen, .~. -qro)

anova(dur.cen, dur.cen.update)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: square.dur
##                                             Model    theta Resid. df
## 1       treatment + censored + whole.mean + alive 17.44174        37
## 2 treatment + censored + whole.mean + alive + qro 21.07611        34
##      2 x log-lik.   Test    df LR stat.    Pr(Chi)
## 1       -672.9406                                 
## 2       -664.3542 1 vs 2     3 8.586343 0.03532756
AIC(dur.cen, dur.cen.update)
##                df      AIC
## dur.cen        12 688.3542
## dur.cen.update  9 690.9406
drop1(dur.cen.update, test = "Chisq")
## Single term deletions
## 
## Model:
## square.dur ~ treatment + censored + whole.mean + alive
##            Df Deviance    AIC     LRT  Pr(>Chi)    
## <none>          45.551 688.94                      
## treatment   4   55.556 690.95 10.0052 0.0403398 *  
## censored    1   46.780 688.17  1.2290 0.2675925    
## whole.mean  1   57.924 699.31 12.3729 0.0004356 ***
## alive       1   49.191 690.58  3.6407 0.0563834 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dur.cen.update1 <- update(dur.cen.update, .~. -alive)

anova(dur.cen.update, dur.cen.update1)
## Likelihood ratio tests of Negative Binomial Models
## 
## Response: square.dur
##                                       Model    theta Resid. df    2 x log-lik.
## 1         treatment + censored + whole.mean 16.14610        38       -676.4445
## 2 treatment + censored + whole.mean + alive 17.44174        37       -672.9406
##     Test    df LR stat.    Pr(Chi)
## 1                                 
## 2 1 vs 2     1 3.503896 0.06122465
AIC(dur.cen.update, dur.cen.update1)
##                 df      AIC
## dur.cen.update   9 690.9406
## dur.cen.update1  8 692.4445
drop1(dur.cen.update1, test = "Chisq")
## Single term deletions
## 
## Model:
## square.dur ~ treatment + censored + whole.mean
##            Df Deviance    AIC     LRT  Pr(>Chi)    
## <none>          45.582 690.44                      
## treatment   4   54.263 691.13  8.6812 0.0695800 .  
## censored    1   59.111 701.97 13.5292 0.0002349 ***
## whole.mean  1   56.698 699.56 11.1164 0.0008557 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
qqnorm(resid(dur.cen.update1));qqline(resid(dur.cen.update1))

Anova(dur.cen.update1)
## Analysis of Deviance Table (Type II tests)
## 
## Response: square.dur
##            LR Chisq Df Pr(>Chisq)    
## treatment    8.6812  4  0.0695800 .  
## censored    13.5292  1  0.0002349 ***
## whole.mean  11.1164  1  0.0008557 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step 4 - Results

Anova(dur.g1)
## Analysis of Deviance Table (Type II tests)
## 
## Response: square.dur
##            LR Chisq Df Pr(>Chisq)    
## treatment   13.1426  4   0.010600 *  
## whole.mean   9.8316  1   0.001715 ** 
## alive       21.5601  1  3.429e-06 ***
## qro         10.8661  3   0.012472 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(dur.g3)
## Analysis of Deviance Table (Type II tests)
## 
## Response: square.dur
##            LR Chisq Df Pr(>Chisq)    
## whole.mean   7.2474  1  0.0071004 ** 
## alive       13.2906  1  0.0002667 ***
## qro          7.1824  3  0.0663058 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# I am going to keep model dur.g1. I think that since whole.mean exlains deviation in the data for both models, it is more important to include treatment as our primary explanatory variable. 
em.dur<- emmeans(dur.g1, "treatment")
pairs(em.dur)
##  contrast                estimate    SE  df z.ratio p.value
##  treatment1 - treatment2   0.2256 0.105 Inf   2.151  0.1987
##  treatment1 - treatment3   0.1464 0.107 Inf   1.366  0.6497
##  treatment1 - treatment4   0.3084 0.104 Inf   2.965  0.0252
##  treatment1 - treatment5   0.3383 0.107 Inf   3.169  0.0133
##  treatment2 - treatment3  -0.0793 0.104 Inf  -0.763  0.9410
##  treatment2 - treatment4   0.0828 0.104 Inf   0.798  0.9314
##  treatment2 - treatment5   0.1126 0.105 Inf   1.075  0.8197
##  treatment3 - treatment4   0.1621 0.105 Inf   1.542  0.5353
##  treatment3 - treatment5   0.1919 0.105 Inf   1.831  0.3556
##  treatment4 - treatment5   0.0298 0.106 Inf   0.281  0.9986
## 
## Results are averaged over the levels of: qro 
## Results are given on the log (not the response) scale. 
## P value adjustment: tukey method for comparing a family of 5 estimates
plot(em.dur, comparisons = TRUE)

dur.sum <- duration %>%
  group_by(treatment) %>%
  summarise(cdur.m = mean(duration), 
            dur.sd = sd(duration),
            dur.n = length(duration)) %>%
  mutate(sedur = dur.sd/sqrt(dur.n))
dur.sum
## # A tibble: 5 × 5
##   treatment cdur.m dur.sd dur.n sedur
##   <fct>      <dbl>  <dbl> <int> <dbl>
## 1 1           45     7.21     9  2.40
## 2 2           42     3.16     9  1.05
## 3 3           44.6   5.08     9  1.69
## 4 4           39.3   4.87     9  1.62
## 5 5           41.4   9.96     9  3.32
dur.sum <- setDT(dur.sum)

dur.sum
##    treatment   cdur.m   dur.sd dur.n    sedur
## 1:         1 45.00000 7.211103     9 2.403701
## 2:         2 42.00000 3.162278     9 1.054093
## 3:         3 44.55556 5.077182     9 1.692394
## 4:         4 39.33333 4.873397     9 1.624466
## 5:         5 41.44444 9.963823     9 3.321274

Step 5 - Visualize

durtuk.means <- emmeans(object = dur.g1,
                        specs = "treatment",
                        adjust = "Tukey",
                        type = "response")


durtuk.means
##  treatment response  SE  df asymp.LCL asymp.UCL
##  1             2127 172 Inf      1727      2619
##  2             1697 133 Inf      1388      2075
##  3             1837 144 Inf      1503      2246
##  4             1562 125 Inf      1272      1919
##  5             1516 117 Inf      1245      1847
## 
## Results are averaged over the levels of: qro 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## Intervals are back-transformed from the log scale
dur.cld.model <- cld(object = durtuk.means,
                     adjust = "Tukey",
                     Letters = letters,
                     alpha = 0.05)
dur.cld.model
##  treatment response  SE  df asymp.LCL asymp.UCL .group
##  5             1516 117 Inf      1245      1847  a    
##  4             1562 125 Inf      1272      1919  a    
##  2             1697 133 Inf      1388      2075  ab   
##  3             1837 144 Inf      1503      2246  ab   
##  1             2127 172 Inf      1727      2619   b   
## 
## Results are averaged over the levels of: qro 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## Intervals are back-transformed from the log scale 
## P value adjustment: tukey method for comparing a family of 5 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.
durtuk.means <- as.data.frame(durtuk.means)

dur_max <- duration %>%
  group_by(treatment) %>%
  summarize(maxdur = max((duration)))


dur_for_plotting <- full_join(durtuk.means, dur_max,
                              by="treatment")

dur_for_plotting$maxse <- dur_for_plotting$response + dur_for_plotting$SE
ggplot(data = dur.sum, aes(x = treatment, y = cdur.m, fill = treatment)) +
  geom_col(col = "black")+
  coord_cartesian(ylim=c(30, 53)) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) + 
  geom_errorbar(aes(ymin = cdur.m-sedur, 
                    ymax = cdur.m+sedur),
                position = position_dodge(0.9), width = 0.4) +
  labs(y = "Days",) +
  ggtitle("Average Colony Duration per Treatment") +
  scale_x_discrete(name = "Treatment", 
                   labels = c("0 PPB", "150 PPB", "1,500 PPB", "15,000 PPB", "150,000 PPB")) +
  theme_cowplot()+
  theme_classic(base_size = 30) +
  theme(legend.position = "none") +
  annotate(geom = "text", 
          x = 1, y = 51.5,
          label = "P < 0.05",
          size = 12) +
  annotate(geom = "text",
           x = c(5, 4, 2, 3, 1),
           y = c(45.8, 42, 44.3, 47.3, 48.6),
           label = c("a", "a", "ab", "ab", "b"),
           size = 12) +
  theme(legend.position =  "none")

dur_for_plotting
##  treatment response       SE  df asymp.LCL asymp.UCL maxdur    maxse
##  1         2126.690 172.3657 Inf  1726.976  2618.920     58 2299.056
##  2         1697.126 132.8416 Inf  1388.005  2075.091     47 1829.968
##  3         1837.144 143.6776 Inf  1502.780  2245.902     55 1980.821
##  4         1562.284 125.2128 Inf  1271.592  1919.430     46 1687.497
##  5         1516.361 116.5944 Inf  1244.581  1847.490     58 1632.956
## 
## Results are averaged over the levels of: qro 
## Confidence level used: 0.95 
## Conf-level adjustment: sidak method for 5 estimates 
## Intervals are back-transformed from the log scale

summary results duration

dur.g1
## 
## Call:  glm.nb(formula = square.dur ~ treatment + whole.mean + alive + 
##     qro, data = duration, init.theta = 21.05743915, link = log)
## 
## Coefficients:
## (Intercept)   treatment2   treatment3   treatment4   treatment5   whole.mean  
##     7.48890     -0.22563     -0.14635     -0.30842     -0.33825     -0.73649  
##       alive        qroB3        qroB4        qroB5  
##     0.13810     -0.28456     -0.01014      0.13285  
## 
## Degrees of Freedom: 44 Total (i.e. Null);  35 Residual
## Null Deviance:       91.43 
## Residual Deviance: 45.46     AIC: 686.4
dura <- setDT(as.data.frame(Anova(dur.g1)))
dura
##     LR Chisq Df   Pr(>Chisq)
## 1: 13.142618  4 1.059956e-02
## 2:  9.831621  1 1.715371e-03
## 3: 21.560052  1 3.429207e-06
## 4: 10.866091  3 1.247246e-02
duremm <- emmeans(dur.g1, pairwise ~ treatment)
durmeans <- setDT(as.data.frame(duremm$contrasts))
durmeans
##                    contrast    estimate        SE  df    z.ratio    p.value
##  1: treatment1 - treatment2  0.22563044 0.1048987 Inf  2.1509372 0.19869556
##  2: treatment1 - treatment3  0.14635483 0.1071556 Inf  1.3658160 0.64966261
##  3: treatment1 - treatment4  0.30841792 0.1040072 Inf  2.9653521 0.02518184
##  4: treatment1 - treatment5  0.33825316 0.1067236 Inf  3.1694315 0.01325790
##  5: treatment2 - treatment3 -0.07927561 0.1038441 Inf -0.7634095 0.94103090
##  6: treatment2 - treatment4  0.08278748 0.1038022 Inf  0.7975505 0.93140240
##  7: treatment2 - treatment5  0.11262272 0.1048029 Inf  1.0746148 0.81967380
##  8: treatment3 - treatment4  0.16206309 0.1051313 Inf  1.5415307 0.53529708
##  9: treatment3 - treatment5  0.19189833 0.1048070 Inf  1.8309693 0.35557292
## 10: treatment4 - treatment5  0.02983524 0.1062410 Inf  0.2808261 0.99864169
durcont <- setDT(as.data.frame(duremm$emmeans))
durcont
##    treatment   emmean         SE  df asymp.LCL asymp.UCL
## 1:         1 7.662322 0.08104880 Inf  7.503469  7.821175
## 2:         2 7.436692 0.07827445 Inf  7.283277  7.590107
## 3:         3 7.515967 0.07820705 Inf  7.362684  7.669250
## 4:         4 7.353904 0.08014728 Inf  7.196818  7.510990
## 5:         5 7.324069 0.07689088 Inf  7.173366  7.474772

Emergence Time - Censored Data

brood.for.merge <- subset(brood, select = c(colony, brood_cells, honey_pot, eggs, dead_larvae, live_larvae, dead_pupae, live_pupae, dead_drones, live_drones, drones))

merged_df <- merge(trunc, brood.for.merge, by = "colony", all = TRUE)

emerge <- subset(merged_df, select = c(emerge, treatment, whole.mean, alive, qro, colony, count, brood_cells, honey_pot, eggs, dead_larvae, live_larvae, dead_pupae, live_pupae, dead_drones, live_drones, drones))
ggplot(emerge, aes(x=emerge, fill = treatment)) +
  geom_histogram(position = "identity", binwidth = 1 ,col=I("black")) +
  scale_fill_manual(values = c("peachpuff3", "darkseagreen", "lightseagreen", "darkolivegreen3", "darkolivegreen4"),
                    name = "Pristine Level",
                    labels = c("Treatment 1 (control)", "Treatment 2", 
                               "Treatment 3", "Treatment 4", "Treatment 5")) +
  ggtitle("Days Until First Drone Emerged") +
  labs(y = "Count", x = "Days")

library(stargazer)
library(censReg)

# Create a new variable indicating censoring
emerge$censored <- ifelse(is.na(emerge$emerge), 1, 0)

# Set censoring limits
emerge$lower_limit <- ifelse(is.na(emerge$emerge), 0, emerge$emerge)
emerge$upper_limit <- ifelse(is.na(emerge$emerge), Inf, emerge$emerge)

model <- censReg(lower_limit ~ treatment + whole.mean + qro + alive, data = emerge, left = 0, right = Inf)

stargazer(model, type = "text") 
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                             lower_limit        
## -----------------------------------------------
## treatment2                    -2.316           
##                               (3.466)          
##                                                
## treatment3                     0.272           
##                               (3.511)          
##                                                
## treatment4                    -1.493           
##                               (3.447)          
##                                                
## treatment5                    -3.369           
##                               (3.642)          
##                                                
## whole.mean                    -9.527           
##                               (7.623)          
##                                                
## qroB3                         -2.794           
##                               (3.737)          
##                                                
## qroB4                          3.949           
##                               (4.328)          
##                                                
## qroB5                        9.938***          
##                               (2.978)          
##                                                
## alive                        8.498***          
##                               (1.040)          
##                                                
## logSigma                     1.957***          
##                               (0.115)          
##                                                
## Constant                       0.257           
##                               (4.785)          
##                                                
## -----------------------------------------------
## Observations                    45             
## Log Likelihood               -139.010          
## Akaike Inf. Crit.             300.019          
## Bayesian Inf. Crit.           319.892          
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01
mod1 <- lm(lower_limit ~ treatment + whole.mean + qro + alive, data = emerge)

stargazer(model, mod1, type = "text")
## 
## =====================================================
##                            Dependent variable:       
##                     ---------------------------------
##                                lower_limit           
##                      censored           OLS          
##                     regression                       
##                        (1)              (2)          
## -----------------------------------------------------
## treatment2            -2.316           -1.891        
##                      (3.466)          (3.501)        
##                                                      
## treatment3            0.272            0.724         
##                      (3.511)          (3.577)        
##                                                      
## treatment4            -1.493           -1.319        
##                      (3.447)          (3.470)        
##                                                      
## treatment5            -3.369           -2.278        
##                      (3.642)          (3.560)        
##                                                      
## whole.mean            -9.527          -10.233        
##                      (7.623)          (7.755)        
##                                                      
## qroB3                 -2.794           -1.810        
##                      (3.737)          (3.652)        
##                                                      
## qroB4                 3.949            3.542         
##                      (4.328)          (4.278)        
##                                                      
## qroB5                9.938***         8.750***       
##                      (2.978)          (2.990)        
##                                                      
## alive                8.498***         7.379***       
##                      (1.040)          (0.918)        
##                                                      
## logSigma             1.957***                        
##                      (0.115)                         
##                                                      
## Constant              0.257            5.596         
##                      (4.785)          (4.230)        
##                                                      
## -----------------------------------------------------
## Observations            45               45          
## R2                                     0.722         
## Adjusted R2                            0.651         
## Log Likelihood       -139.010                        
## Akaike Inf. Crit.    300.019                         
## Bayesian Inf. Crit.  319.892                         
## Residual Std. Error               7.314 (df = 35)    
## F Statistic                    10.110*** (df = 9; 35)
## =====================================================
## Note:                     *p<0.1; **p<0.05; ***p<0.01
AIC(model)
## 'log Lik.' 300.019 (df=11)
AIC(mod1)
## [1] 317.4738
Figures
library(patchwork)


(dp / rf)

Emergence Time

emerge1 <- na.omit(emerge)
em.mod <- glm(emerge ~ treatment + whole.mean + qro + alive, data = emerge1, family = "quasipoisson")
drop1(em.mod, test = "F")
## Single term deletions
## 
## Model:
## emerge ~ treatment + whole.mean + qro + alive
##            Df Deviance F value    Pr(>F)    
## <none>          12.768                      
## treatment   4   14.121  0.7949 0.5378775    
## whole.mean  1   19.192 15.0940 0.0005231 ***
## qro         3   13.313  0.4271 0.7350042    
## alive       1   12.950  0.4290 0.5174851    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
em.mod1 <- glm(emerge ~ treatment + whole.mean + alive, data = emerge1, family = "quasipoisson")
drop1(em.mod1, test = "F")
## Single term deletions
## 
## Model:
## emerge ~ treatment + whole.mean + alive
##            Df Deviance F value    Pr(>F)    
## <none>          13.313                      
## treatment   4   14.962  1.0217    0.4105    
## whole.mean  1   21.468 20.2143 8.076e-05 ***
## alive       1   13.313  0.0010    0.9751    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
em.mod2 <- glm(emerge ~ treatment*whole.mean + qro +  alive, data = emerge1, family = "quasipoisson")
drop1(em.mod2, test = "F")
## Single term deletions
## 
## Model:
## emerge ~ treatment * whole.mean + qro + alive
##                      Df Deviance F value Pr(>F)
## <none>                    9.7529               
## qro                   3  10.1319  0.3367 0.7989
## alive                 1   9.7531  0.0004 0.9838
## treatment:whole.mean  4  12.7677  2.0093 0.1227
summary(em.mod)
## 
## Call:
## glm(formula = emerge ~ treatment + whole.mean + qro + alive, 
##     family = "quasipoisson", data = emerge1)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.82873  -0.43465  -0.05986   0.23330   1.48750  
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.76549    0.13828  27.230  < 2e-16 ***
## treatment2  -0.02846    0.05823  -0.489 0.628630    
## treatment3   0.01450    0.05614   0.258 0.797924    
## treatment4  -0.07553    0.05866  -1.288 0.207755    
## treatment5  -0.03243    0.06049  -0.536 0.595853    
## whole.mean  -0.48475    0.12682  -3.822 0.000621 ***
## qroB3       -0.03500    0.06258  -0.559 0.580176    
## qroB4        0.04105    0.07695   0.533 0.597682    
## qroB5        0.04293    0.05181   0.829 0.413867    
## alive        0.01780    0.02757   0.646 0.523477    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for quasipoisson family taken to be 0.4356321)
## 
##     Null deviance: 23.538  on 39  degrees of freedom
## Residual deviance: 12.768  on 30  degrees of freedom
## AIC: NA
## 
## Number of Fisher Scoring iterations: 4
Anova(em.mod2)
## Analysis of Deviance Table (Type II tests)
## 
## Response: emerge
##                      LR Chisq Df Pr(>Chisq)    
## treatment              3.5596  4    0.46888    
## whole.mean            16.8976  1  3.945e-05 ***
## qro                    0.9967  3    0.80204    
## alive                  0.0004  1    0.98374    
## treatment:whole.mean   7.9303  4    0.09417 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
descdist(emerge1$emerge, discrete = TRUE)

## summary statistics
## ------
## min:  30   max:  51 
## median:  35 
## mean:  36.225 
## estimated sd:  4.822424 
## estimated skewness:  1.752133 
## estimated kurtosis:  6.441673
emsum <- emerge1 %>%
  group_by(treatment) %>%
  summarise(em = mean(emerge))

emsum
## # A tibble: 5 × 2
##   treatment    em
##   <fct>     <dbl>
## 1 1          36.7
## 2 2          35.9
## 3 3          37.6
## 4 4          33.8
## 5 5          37.1
emmod <- glm.nb(emerge ~ treatment, data = emerge)
Anova(emmod)
## Analysis of Deviance Table (Type II tests)
## 
## Response: emerge
##           LR Chisq Df Pr(>Chisq)
## treatment   2.0698  4     0.7229
LS0tDQp0aXRsZTogIkVmZmVjdCBvZiBQcmlzdGluZSBvbiBCdW1ibGUgQmVlIE1pY3JvY29sb25pZXMgLSBEcm9uZSBNZXRyaWNzIg0KYXV0aG9yOiAiRW1pbHkgUnVubmlvbiINCmRhdGU6ICJEYXRhIENvbGxlY3RlZCAyMDIyIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0aGVtZTogam91cm5hbA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBsb2FkIGxpYnJhcmllcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHN0YXRzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGVtbWVhbnMpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KGJsbWVjbykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoYmVzdE5vcm1hbGl6ZSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShhZ3JpY29sYWUpIA0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdsdWUpDQpsaWJyYXJ5KG11bHRjb21wKQ0KbGlicmFyeShtdWx0Y29tcFZpZXcpDQpsaWJyYXJ5KGdsbW1UTUIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KGZpdGRpc3RycGx1cykNCmxpYnJhcnkobG9nc3BsaW5lKQ0KbGlicmFyeShvbHNycikNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KYGBgDQoNCkJlZXMgYXJlIGZyZXF1ZW50bHkgZXhwb3NlZCB0byBmdW5naWNpZGVzIGluIGFncmljdWx0dXJhbCBsYW5kc2NhcGVzLCBhbmQgd2hpbGUgdGhlc2UgY2hlbWljYWxzIGFyZSBnZW5lcmFsbHkgbm90IGNvbnNpZGVyZWQgdG8gYmUgaGFybWZ1bCB0byBpbnNlY3QgcG9sbGluYXRvcnMsIHRoZSBzdWJsZXRoYWwgZWZmZWN0cyBvZiBmdW5naWNpZGVzIGFyZSBub3Qgd2VsbCB1bmRlcnN0b29kLiBXZSBpbnZlc3RpZ2F0ZWQgdGhlIG5vbi10YXJnZXQgZWZmZWN0cyBvZiBleHBvc3VyZSB0byBmaWVsZC1yZWFsaXN0aWMgY29uY2VudHJhdGlvbnMgb2YgdGhlIGZ1bmdpY2lkZSwgUHJpc3RpbmXCriwgZm9yIHRoZSBjb21tb24gZWFzdGVybiBidW1ibGUgYmVlICgqQm9tYnVzIGltcGF0aWVucyopLiBXZSBmZWQgcXVlZW5sZXNzIG1pY3JvY29sb25pZXMgb2YgNSBidW1ibGUgYmVlcyBwb2xsZW4gcGF0dGllcyBjb250YW1pbmF0ZWQgd2l0aCBQcmlzdGluZcKuIHJhbmdpbmcgZnJvbSAwIHBwYi0xNTAsMDAwIHBwYiwgYW5kIGV2YWx1YXRlZCB0aGUgZWZmZWN0cyBvZiBjaHJvbmljIGZ1bmdpY2lkZSBleHBvc3VyZSBvbiBicm9vZCBwcm9kdWN0aW9uLCBjb2xvbnkgd2VpZ2h0IGNoYW5nZSwgcG9sbGVuIGNvbnN1bXB0aW9uLCBhbmQgZHJvbmUgYm9keSBxdWFsaXR5LiBXZSBmb3VuZCB0aGF0IHdoaWxlIG1pY3JvY29sb25pZXMgZmVkIHBvbGxlbiBjb250YWluaW5nIDEsNTAwIHBwYiBjb25zdW1lZCB0aGUgbW9zdCBwb2xsZW4gYW5kIHByb2R1Y2VkIHRoZSBtb3N0IGJyb29kLCBtaWNyb2NvbG9uaWVzIGV4cG9zZWQgdG8gMTUsMDAwIHBwYiBnYWluZWQgd2VpZ2h0IGF0IHNpZ25pZmljYW50bHkgbG93ZXIgcmF0ZXMuIEZ1bmdpY2lkZSBleHBvc3VyZSBhbHNvIG5lZ2F0aXZlbHkgaW1wYWN0ZWQgYnJvb2QgZGV2ZWxvcG1lbnQgdGltZSBhbmQgZHJvbmUgYm9keSBxdWFsaXR5LiBPdXIgZmluZGluZ3MgaW5kaWNhdGUgdGhhdCBQcmlzdGluZcKuIGhhcyBzdWJsZXRoYWwgZWZmZWN0cyBvbiBidW1ibGUgYmVlIG1pY3JvY29sb255IGdyb3d0aCBhbmQgYnJvb2QgZGV2ZWxvcG1lbnQsIGhpZ2hsaWdodGluZyB0aGUgcG90ZW50aWFsIG5lZ2F0aXZlIGltcGFjdHMgb2YgY2hyb25pYyBmdW5naWNpZGUgZXhwb3N1cmUgdG8gYmVlIGhlYWx0aC4gSW4gdGhlIGZhY2Ugb2YgdGhlIGdsb2JhbCBkZWNsaW5lIG9mIHBvbGxpbmF0b3Igc3BlY2llcywgaXQgaXMgaW1wb3J0YW50IGZvciB1cyB0byBicm9hZGVuIG91ciB1bmRlcnN0YW5kaW5nIG9mIGhvdyBiZWVzIHJlYWN0IHRvd2FyZHMgZXhwb3N1cmUgb2Ygb2Z0ZW4gb3Zlcmxvb2tlZCBzdHJlc3NvcnMsIHN1Y2ggYXMgZnVuZ2ljaWRlcywgdG8gYWNjb3VudCBmb3IgcG90ZW50aWFsIGNvbnNlcXVlbmNlcyBmb3IgcG9sbGluYXRvciBoZWFsdGggYW5kIHBvbGxpbmF0aW9uIHNlcnZpY2VzLg0KDQojIyMgSW5wdXQgcmVsZXZlbnQgZGF0YSBmaWxlcyANCg0KYGBge3J9DQojIyMgRmlndXJlIG91dCBhdmVyYWdlIHBvbGxlbiBjb25zdW1wdGlvbiBieSB0cmVhdG1lbnQgDQoNCg0KcG9sbGVuIDwtIHJlYWRfY3N2KCJwb2xsZW4xLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMocm91bmQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIikpLCB0cmVhdG1lbnQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiLCAiMyIsICI0IiwgIjUiKSksIHJlcGxpY2F0ZSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI5IiwgIjExIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyIikpLCBzdGFydF9kYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfdGltZSA9IGNvbF9jaGFyYWN0ZXIoKSwgZW5kX2RhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfdGltZSA9IGNvbF9jaGFyYWN0ZXIoKSkpDQoNCg0KcG9sbGVuJGNvbG9ueSA8LSBhcy5mYWN0b3IocG9sbGVuJGNvbG9ueSkNCnBvbGxlbiRwaWQgPC0gYXMuZmFjdG9yKHBvbGxlbiRwaWQpDQpwb2xsZW4kY291bnQgPC0gYXMuZmFjdG9yKHBvbGxlbiRjb3VudCkNCg0KcG9sbGVuIDwtIHN1YnNldChwb2xsZW4sIHBvbGxlbiRyb3VuZCAhPSAxKQ0KDQpwb2xsZW4gPC0gbmEub21pdChwb2xsZW4pDQoNCnJhbmdlKHBvbGxlbiRkaWZmZXJlbmNlKQ0KDQojIGdldCByaWQgb2YgbmVnYXRpdmUgbnVtYmVycw0KcG9sbGVuJGRpZmZlcmVuY2VbcG9sbGVuJGRpZmZlcmVuY2UgPCAwXSA8LSBOQQ0KcG9sbGVuIDwtIG5hLm9taXQocG9sbGVuKQ0KcmFuZ2UocG9sbGVuJGRpZmZlcmVuY2UpDQoNCg0KIyBhZGQgcXVlZW5yaWdodCBvcmlnaW5hbCBjb2xvbnkgY29sdW1uIA0KcXJvIDwtIHJlYWRfY3N2KCJxcm8uY3N2IikNCnFybyRjb2xvbnkgPC0gYXMuZmFjdG9yKHFybyRjb2xvbnkpDQpxcm8kcXJvIDwtIGFzLmZhY3Rvcihxcm8kcXJvKQ0KDQpwb2xsZW4gPC0gbWVyZ2UocG9sbGVuLCBxcm8sIGJ5LnggPSAiY29sb255IikNCg0KcG9sbGVuJHBpZCA8LSBhcy5mYWN0b3IocG9sbGVuJHBpZCkNCnBvbGxlbiRkb3NlX2NvbnN1bWVkIDwtIGFzLm51bWVyaWMocG9sbGVuJGRvc2VfY29uc3VtZWQpDQoNCmBgYA0KDQojIyMgQXZlcmFnZSBwb2xsZW4gY29uc3VtcHRpb24gcGVyIGNvbG9ueSBkYXRhIGlucHV0DQoNCmBgYHtyfQ0KcG9sbGVuJHdob2xlX2RpZiA8LSBhcy5udW1lcmljKHBvbGxlbiRkaWZmZXJlbmNlKQ0Kd2QuMSA8LSBsbShkaWZmZXJlbmNlIH4gdHJlYXRtZW50LCBkYXRhID0gcG9sbGVuKQ0Kc3VtbWFyeSh3ZC4xKQ0Kd2QuZW1tIDwtIGVtbWVhbnMod2QuMSwgInRyZWF0bWVudCIpDQpzdW1tYXJ5KHdkLmVtbSkNCg0Kd2Quc3VtbWFyeSA8LSBwb2xsZW4gJT4lIA0KICBncm91cF9ieShjb2xvbnkpICU+JQ0KICBzdW1tYXJpemUod2hvbGUubWVhbiA9IG1lYW4oZGlmZmVyZW5jZSksDQogICAgICAgICAgICBtZWFuLmRvc2UgPSBtZWFuKGRvc2VfY29uc3VtZWQpKQ0KDQphcy5kYXRhLmZyYW1lKHdkLnN1bW1hcnkpICAjIHRoaXMgaXMgdGhlIGRhdGEgZnJhbWUgSSB3aWxsIG1lcmdlIHdpdGggc3Vic2VxdWVudCBkYXRhIGZyYW1lcyB0byBjb250YWluIGF2ZXJhZ2UgcG9sbGVuIGNvbnN1bXB0aW9uIHBlciBjb2xvbnkgYXMgYSBuZXcgY29sdW1uICANCg0KYGBgDQoNCiMjIyBXb3JrZXIgTW9ydGFsaXR5IGRhdGEgaW5wdXQgDQoNCmBgYHtyfQ0KbW9ydGFsaXR5ICA8LSByZWFkX2Nzdigic3Vydml2aW5nIHdvcmtlcnMgcGVyIGNvbG9ueS5jc3YiKQ0KDQptb3J0YWxpdHkkY29sb255IDwtIGFzLmZhY3Rvcihtb3J0YWxpdHkkY29sb255KQ0KYGBgDQoNCiMjIyBCcm9vZCBkYXRhIGlucHV0DQoNCmBgYHtyfQ0KYnJvb2QgPC0gcmVhZF9jc3YoImJyb29kLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMocm91bmQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAiMiIpKSwgdHJlYXRtZW50ID0gY29sX2ZhY3RvcihsZXZlbHMgPSBjKCIxIiwgDQogICAgIjIiLCAiMyIsICI0IiwgIjUiKSksIHJlcGxpY2F0ZSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICIyIiwgIjMiLCAiNCIsICI1IiwgIjciLCAiOSIsICIxMSIsICIxMiIpKSkpDQoNCmJyb29kJGNvbG9ueSA8LSBhcy5mYWN0b3IoYnJvb2QkY29sb255KQ0KDQpicm9vZCA8LSBzdWJzZXQoYnJvb2QsIGJyb29kJHJvdW5kICE9IDEpDQoNCmJyb29kIDwtIG1lcmdlKHdkLnN1bW1hcnksIGJyb29kLCBieS54ID0gImNvbG9ueSIpDQoNCmJyb29kIDwtIG1lcmdlKGJyb29kLCBtb3J0YWxpdHksIGJ5LnggPSAiY29sb255IikNCg0KYnJvb2Quc3ViIDwtIHN1YnNldChicm9vZCwgc2VsZWN0ID0gYyhjb2xvbnksIGR1cmF0aW9uKSkNCg0KYGBgDQoNCg0KIyMjIERyb25lIGRhdGEgaW5wdXQNCg0KYGBge3J9DQpkcm9uZXMgPC0gcmVhZF9jc3YoImRyb25lc19yZi5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKHJvdW5kID0gY29sX2ZhY3RvcihsZXZlbHMgPSBjKCIxIiwiMiIpKSwgdHJlYXRtZW50ID0gY29sX2ZhY3RvcihsZXZlbHMgPSBjKCIxIiwiMiIsICIzIiwgIjQiLCAiNSIpKSwgbm90ZXMgPSBjb2xfc2tpcCgpLCBjb2xvbnlfc3RhcnQgPSBjb2xfc2tpcCgpLCBjb2xvbnlfY291bnQgPSBjb2xfc2tpcCgpLCBhbGl2ZSA9IGNvbF9za2lwKCksIGVtZXJnZV9kYXRlID0gY29sX3NraXAoKSkpDQoNCiN0aGlzIGRhdGEgc2V0IGlzIGZvciBkcm9uZSBlbWVyZ2UgdGltZXMgYW5kIGhlYWx0aCBtZXRyaWNzIA0KDQpkcm9uZXMkb3JkZXJfb25fc2hlZXQgPC0gYXMuZmFjdG9yKGRyb25lcyRvcmRlcl9vbl9zaGVldCkNCmRyb25lcyRyZXBsaWNhdGUgPC0gYXMuZmFjdG9yKGRyb25lcyRyZXBsaWNhdGUpDQpkcm9uZXMkY29sb255IDwtIGFzLmZhY3Rvcihkcm9uZXMkY29sb255KQ0KZHJvbmVzJGlkIDwtIGFzLmZhY3Rvcihkcm9uZXMkaWQpDQpkcm9uZXMkcmVsYXRpdmVfZmF0IDwtIGFzLmRvdWJsZShkcm9uZXMkcmVsYXRpdmVfZmF0KQ0KZHJvbmVzJHJhZGlhbCA8LSBhcy5kb3VibGUoZHJvbmVzJHJhZGlhbCkNCmRyb25lcyRgYWxpdmU/YCA8LSBhcy5kb3VibGUoZHJvbmVzJGBhbGl2ZT9gKQ0KDQoNCmRyZi5wb2xsZW4gPC0gbWVyZ2Uod2Quc3VtbWFyeSwgZHJvbmVzLCBieS54ID0gImNvbG9ueSIpICAgIyB0aGlzIGlzIGEgbmV3IGRhdGEgZnJhbWUgd2l0aCBhdmVyYWdlIHBvbGxlbiBjb25zdW1wdGlvbiBkYXRhIHBlciBjb2xvbnkNCg0KZHJmLnBvbGxlbiRhbGl2ZSA8LSBhcy5sb2dpY2FsKGRyZi5wb2xsZW4kYGFsaXZlP2ApDQoNCmRyb25lLnN1bSA8LSBkcmYucG9sbGVuICU+JQ0KICBncm91cF9ieShjb2xvbnkpICU+JQ0KICBzdW1tYXJpc2UoY291bnQuZHJvbmUgPSBsZW5ndGgoaWQpKQ0KZHJvbmUuc3VtDQoNCmRyb25lLnN1bSA8LSBhcy5kYXRhLmZyYW1lKGRyb25lLnN1bSkNCg0KcXJvIDwtIHJlYWRfY3N2KCJxcm8uY3N2IikNCnFybyRjb2xvbnkgPC0gYXMuZmFjdG9yKHFybyRjb2xvbnkpDQpxcm8kcXJvIDwtIGFzLmZhY3Rvcihxcm8kcXJvKQ0KDQpkcmYucG9sbGVuIDwtIG1lcmdlKGRyZi5wb2xsZW4sIHFybywgYnkueCA9ICJjb2xvbnkiKQ0KDQpkcmYucG9sbGVuPC0gbWVyZ2UoZHJmLnBvbGxlbiwgYnJvb2Quc3ViLCBieS54ID0gImNvbG9ueSIpDQoNCmBgYA0KDQojIyBCZWdpbiBkYXRhIGFuYWx5c2lzIA0KDQojIyMgRHJvbmUgRHJ5IFdlaWdodA0KDQpgYGB7ciBsb29rIGF0IHNoYXBlIG9mIGRyb25lIGRyeXdlaWdodCBkYXRhfQ0KDQpyYW5nZShkcmYucG9sbGVuJGRyeV93ZWlnaHQpDQoNCmRyZi5wb2xsZW4uZHJ5IDwtIGRyZi5wb2xsZW5bLWMoMTMxLCAxNjAsIDE3NyksIF0gICAjcmVtb3ZlIG91dGxpZXIgdGhhdCB3YXMgY292ZXJlZCBpbiBob25leSBhbmQgZGVhZCBiZWVzIA0KcmFuZ2UoZHJmLnBvbGxlbiRkcnlfd2VpZ2h0KQ0KDQpkcmYucG9sbGVuLmRyeSA8LSBzdWJzZXQoZHJmLnBvbGxlbi5kcnksIHNlbGVjdCA9IGMoZHJ5X3dlaWdodCwgdHJlYXRtZW50LCB3aG9sZS5tZWFuLCBtZWFuLmRvc2UsIHdvcmtlcnNfYWxpdmUsIGFsaXZlLCBkdXJhdGlvbiwgcXJvLCBjb2xvbnkpKQ0KZHJmLnBvbGxlbi5kcnkgPC0gbmEub21pdChkcmYucG9sbGVuLmRyeSkNCg0KZ2dwbG90KGRyZi5wb2xsZW4uZHJ5LCBhZXMoeD1kcnlfd2VpZ2h0LCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbndpZHRoID0gMC4wMDI1LGNvbD1JKCJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsNCiAgZ2d0aXRsZSgiRHJvbmUgRHJ5IFdlaWdodCIpICsNCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJXZWlnaHQgKGcpICIpDQoNCnNoYXBpcm8udGVzdChkcmYucG9sbGVuLmRyeSRkcnlfd2VpZ2h0KQ0KDQpgYGANCg0KIyMjIyBTdGVwIDEgLSBDaGVjayBmb3IgY29saW5lYXJpdHkgDQoNCmBgYHtyfQ0KZHJ5Lm1vZGVsIDwtIGxtKGRyeV93ZWlnaHR+IHRyZWF0bWVudCArIHdob2xlLm1lYW4gKyBtZWFuLmRvc2UgKyB3b3JrZXJzX2FsaXZlICsgZHVyYXRpb24gICsgcXJvLCBkYXRhID0gZHJmLnBvbGxlbikNCm9sc192aWZfdG9sKGRyeS5tb2RlbCkNCnZpZihkcnkubW9kZWwpDQoNCmRyeS5tb2QxIDwtIHVwZGF0ZShkcnkubW9kZWwsIC5+LiAtIG1lYW4uZG9zZSkNCnZpZihkcnkubW9kMSkNCmRyeS5tb2QyIDwtIHVwZGF0ZShkcnkubW9kZWwsIC5+LiAtIHdob2xlLm1lYW4pDQp2aWYoZHJ5Lm1vZDIpDQpkcnkubW9kMyA8LSB1cGRhdGUoZHJ5Lm1vZGVsLCAufi4gLSB0cmVhdG1lbnQpDQp2aWYoZHJ5Lm1vZDMpDQojIFRoaXMgc2hvd3MgdGhhdCB0cmVhdG1lbnQgYW5kIG1lYW4uZG9zZSBhcmUgaGlnaGx5IGNvcnJlbGF0ZWQgDQoNCmBgYA0KDQoNCmBgYHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTV9DQpwYWlyLmRyeS5kZiA8LSBzdWJzZXQoZHJmLnBvbGxlbiwgc2VsZWN0ID0gYyhkcnlfd2VpZ2h0LCB0cmVhdG1lbnQsIHdob2xlLm1lYW4sIG1lYW4uZG9zZSwgd29ya2Vyc19hbGl2ZSwgYWxpdmUsIGR1cmF0aW9uLCBxcm8pKSAjbWFrZSBhIGRhdGEgZnJhbWUgY29udGFpbmluZyBvbmx5IHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgaW4gdGhlIG1vZGVsIA0KDQpnZ3BhaXJzKHBhaXIuZHJ5LmRmKQ0KDQpgYGANCg0KDQojIyMjIFN0ZXAgMiAtIFdvcmsgZG93biBmcm9tIG1vc3QgY29tcGxpY2F0ZWQgbW9kZWwNCg0KYGBge3J9DQoNCmRyeS5pbnQgPC0gbG1lcihkcnlfd2VpZ2h0fiB0cmVhdG1lbnQqd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJmLnBvbGxlbi5kcnkpDQoNCmRyeS5nMSA8LSBsbWVyKGRyeV93ZWlnaHR+IHRyZWF0bWVudCArIHdob2xlLm1lYW4gKyBtZWFuLmRvc2UgKyB3b3JrZXJzX2FsaXZlICsgZHVyYXRpb24gICsgcXJvICsgKDF8Y29sb255KSwgZGF0YSA9IGRyZi5wb2xsZW4uZHJ5KQ0KDQpkcnkuZzIgPC0gbG1lcihkcnlfd2VpZ2h0fiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgd29ya2Vyc19hbGl2ZSArIGR1cmF0aW9uICArIHFybyArICgxfGNvbG9ueSksIGRhdGEgPSBkcmYucG9sbGVuLmRyeSkNCiN0aGlzIGlzIHRoZSBtb2RlbCB3ZSBhcmUga2VlcGluZyANCg0KZHJ5LmczIDwtIGxtZXIoZHJ5X3dlaWdodH4gbWVhbi5kb3NlICsgd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJmLnBvbGxlbi5kcnkpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KYW5vdmEoZHJ5LmludCwgZHJ5LmcxLCBkcnkuZzIpICAjQUlDIGlzIGxvd2VyIGZvciBkcnkuZzIgYW5kIENoaXNxIHZhbHVlIGlzIG5vdCBzaWcuDQpgYGANCg0KDQpgYGB7cn0NCmFub3ZhKGRyeS5nMSwgZHJ5LmczKSAjbWVhbi5kb3NlIGlzIG5vdCB1c2VmdWwgDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGRyeS5nMikNCmBgYA0KDQojIyMjIFN0ZXAgMi5hIC0gRHJvcDENCg0KYGBge3J9DQpkcm9wMShkcnkuZzIsIHRlc3QgPSAiQ2hpc3EiKQ0KDQpkcnkuZzIudXBkYXRlIDwtIHVwZGF0ZShkcnkuZzIsIC5+LiAtd2hvbGUubWVhbikNCmFub3ZhKGRyeS5nMi51cGRhdGUsIGRyeS5nMikNCg0KZHJvcDEoZHJ5LmcyLnVwZGF0ZSwgdGVzdCA9ICJDaGlzcSIpDQoNCmRyeS5nMi51cGRhdGUyIDwtIHVwZGF0ZShkcnkuZzIudXBkYXRlLCAufi4gLWR1cmF0aW9uKQ0KYW5vdmEoZHJ5LmcyLnVwZGF0ZTIsIGRyeS5nMi51cGRhdGUpDQoNCmRyb3AxKGRyeS5nMi51cGRhdGUyLCB0ZXN0ID0gIkNoaXNxIikNCg0KZHJ5LmcyLnVwZGF0ZTMgPC0gdXBkYXRlKGRyeS5nMi51cGRhdGUyLCAufi4gLXdvcmtlcnNfYWxpdmUpDQphbm92YShkcnkuZzIudXBkYXRlMiwgZHJ5LmcyLnVwZGF0ZTMpDQoNCmRyb3AxKGRyeS5nMi51cGRhdGUzLCB0ZXN0ID0gIkNoaXNxIikNCmBgYA0KYGBge3J9DQojTmV3IG1vZGVsIHdlIGFyZSBrZWVwaW5nIGZvciBkcnkgd2VpZ2h0IA0KDQpkcnkuZzIudXBkYXRlMw0Kc3VtbWFyeShkcnkuZzIudXBkYXRlMykNCg0KYGBgDQoNCg0KIyMjIyBTdGVwIDMgLSBDaGVjayBtb2RlbCBmaXQNCg0KYGBge3J9DQpwbG90KHJlc2lkKGRyeS5nMi51cGRhdGUzKSkgKyANCiAgYWJsaW5lKGg9MCwgY29sPSJyZWQiLCBsd2Q9MikgDQoNCnFxbm9ybShyZXNpZChkcnkuZzIudXBkYXRlMykpO3FxbGluZShyZXNpZChkcnkuZzIudXBkYXRlMykpIA0KYGBgDQoNCiMjIyMgU3RlcCA0IC0gUmVzdWx0cyANCg0KYGBge3J9DQpBbm92YShkcnkuZzIudXBkYXRlMykNCg0KZHJ5LmVtbS51cGRhdGUgPC0gZW1tZWFucyhkcnkuZzIudXBkYXRlMywgInRyZWF0bWVudCIpDQpwYWlycyhkcnkuZW1tLnVwZGF0ZSkNCg0KcGxvdChkcnkuZW1tLnVwZGF0ZSwgY29tcGFyaXNvbnMgPSBUUlVFKQ0KYGBgDQoNCg0KYGBge3J9DQpkcnkuc3VtIDwtIGRyZi5wb2xsZW4gJT4lDQogIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lDQogIHN1bW1hcmlzZShkcnkubSA9IG1lYW4oZHJ5X3dlaWdodCksIA0KICAgICAgICAgICAgZHJ5LnNkID0gc2QoZHJ5X3dlaWdodCksDQogICAgICAgICAgICBkcnluID0gbGVuZ3RoKGRyeV93ZWlnaHQpKSAlPiUNCiAgbXV0YXRlKHNlZHJ5ID0gZHJ5LnNkL3NxcnQoZHJ5bikpDQpkcnkuc3VtDQpgYGANCg0KDQojIyMjIFN0ZXAgNSAtIFZpc3VhbGl6ZQ0KDQpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9IDEyfQ0KDQpkcnlhbm92YV9zdW1tYXJ5IDwtIHN1bW1hcnkoZHJ5LmcyLnVwZGF0ZTMpDQogICAgICAgICANCiAgICAgICAgIA0KZHJ5dHVrLm1lYW5zIDwtIGVtbWVhbnMob2JqZWN0ID0gZHJ5LmcyLnVwZGF0ZTMsDQogICAgICAgICAgICAgICAgICAgICAgICBzcGVjcyA9ICJ0cmVhdG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ID0gIlR1a2V5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQoNCmRyeXR1ay5tZWFucw0KDQpkcnkuY2xkLm1vZGVsIDwtIGNsZChvYmplY3QgPSBkcnl0dWsubWVhbnMsDQogICAgICAgICAgICAgICAgICAgICBhZGp1c3QgPSAiVHVrZXkiLA0KICAgICAgICAgICAgICAgICAgICAgTGV0dGVycyA9IGxldHRlcnMsDQogICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuMDUpDQpkcnkuY2xkLm1vZGVsDQoNCmRyeXR1ay50cmVhdG1lbnQgPC0gYXMuZGF0YS5mcmFtZShkcnkuY2xkLm1vZGVsKQ0KZHJ5dHVrLnRyZWF0bWVudA0KDQpkcnlfbWF4IDwtIGRyZi5wb2xsZW4gJT4lDQogIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lDQogIHN1bW1hcml6ZShtYXhkcnkgPSBtYXgobWVhbihkcnlfd2VpZ2h0KSkpDQoNCg0KZHJ5X2Zvcl9wbG90dGluZyA8LSBmdWxsX2pvaW4oZHJ5dHVrLnRyZWF0bWVudCwgZHJ5X21heCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJ0cmVhdG1lbnQiKQ0KDQoNCmRwIDwtIGdncGxvdChkYXRhID0gZHJ5LnN1bSwgYWVzKHggPSB0cmVhdG1lbnQsIHkgPSBkcnkubSwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9jb2woY29sID0gImJsYWNrIikrDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMC4wMywgMC4wNDYpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsgDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBkcnkubSAtIHNlZHJ5LCANCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGRyeS5tICsgc2VkcnkpLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgd2lkdGggPSAwLjQpICsNCiAgbGFicyh5ID0gIk1lYW4gRHJvbmUgRHJ5IFdlaWdodCAoZykiLCkgKw0KICBnZ3RpdGxlKCJBdmVyYWdlIERyb25lIERyeSBXZWlnaHQgKGcpIHBlciBUcmVhdG1lbnQiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJUcmVhdG1lbnQiLCANCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIFBQQiIsICIxNTAgUFBCIiwgIjEsNTAwIFBQQiIsICIxNSwwMDAgUFBCIiwgIjE1MCwwMDAgUFBCIikpICsNCiAgdGhlbWVfY293cGxvdCgpKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDMwKSANCg0KZHAgPC0gZHAgKyANCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgDQogICAgICAgICAgeCA9IDIuNSwgeSA9IDAuMDQ1LA0KICAgICAgICAgIGxhYmVsID0gIlAgPCAwLjAwMSIsDQogICAgICAgICAgc2l6ZSA9IDgpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IGMoMywgMiwgNCwgNSwgMSksDQogICAgICAgICAgIHkgPSBkcnlfZm9yX3Bsb3R0aW5nJG1heGRyeSArIDAuMDAyLA0KICAgICAgICAgICBsYWJlbCA9IGMoImEiLCAiYWIiLCAiYiIsICJiIiwgImIiKSwNCiAgICAgICAgICAgc2l6ZSA9IDgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gICJub25lIikNCg0KZHAgDQpgYGANCg0KDQojIyMjIERyeSBXZWlnaHQgUmVzdWx0cyBTdW1tYXJ5IA0KDQpgYGB7cn0NCkEgPC0gQW5vdmEoZHJ5LmcyLnVwZGF0ZTMpDQpBIDwtIGFzLmRhdGEuZnJhbWUoQSkNCkEgPC0gc2V0RFQoQSkNCkENCmRyeV9lbW0gPC0gZW1tZWFucyhkcnkuZzIudXBkYXRlMywgcGFpcndpc2UgfiB0cmVhdG1lbnQpDQpkcnlfY29udHJhc3RzIDwtIGFzLmRhdGEuZnJhbWUoZHJ5X2VtbSRjb250cmFzdHMpDQpkcnlfbWVhbnMgPC0gYXMuZGF0YS5mcmFtZShkcnlfZW1tJGVtbWVhbnMpDQpkcnlfbWVhbnMgPC0gc2V0RFQoZHJ5X21lYW5zKQ0KZHJ5X21lYW5zDQpkcnlfY29udHJhc3RzIDwtIHNldERUKGRyeV9jb250cmFzdHMpDQpkcnlfY29udHJhc3RzDQpkcnkuc3VtIDwtIHNldERUKGRyeS5zdW0pDQpkcnkuc3VtDQpgYGANCg0KDQojIyMgRHJvbmUgUmVsYXRpdmUgRmF0DQoNCg0KYGBge3J9DQoNCmRyZi5wb2xsZW4ucmYgPC0gc3Vic2V0KGRyZi5wb2xsZW4sIHNlbGVjdCA9IGMocmVsYXRpdmVfZmF0LCB0cmVhdG1lbnQsIHdob2xlLm1lYW4sIHdvcmtlcnNfYWxpdmUsIGFsaXZlLCBkdXJhdGlvbiwgcXJvLCBjb2xvbnkpKQ0KZHJmLnBvbGxlbi5yZiA8LSBuYS5vbWl0KGRyZi5wb2xsZW4ucmYpDQoNCnNoYXBpcm8udGVzdChkcmYucG9sbGVuLnJmJHJlbGF0aXZlX2ZhdCkNCnJhbmdlKGRyZi5wb2xsZW4ucmYkcmVsYXRpdmVfZmF0KQ0KDQpnZ3Bsb3QoZHJmLnBvbGxlbi5yZiwgYWVzKHg9cmVsYXRpdmVfZmF0LCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbndpZHRoID0gMC4wMDAyLGNvbD1JKCJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsNCiAgZ2d0aXRsZSgiRHJvbmUgUmVsYXRpdmUgRmF0IikgKw0KICBsYWJzKHkgPSAiQ291bnQiLCB4ID0gIlJlbGF0aXZlIEZhdChnKSAiKQ0KDQoNCmRyZi5wb2xsZW4ucmYkbG9ncmYgPC0gbG9nKGRyZi5wb2xsZW4ucmYkcmVsYXRpdmVfZmF0KQ0Kc2hhcGlyby50ZXN0KGRyZi5wb2xsZW4ucmYkbG9ncmYpDQpyYW5nZShkcmYucG9sbGVuLnJmJGxvZ3JmKQ0KDQpnZ3Bsb3QoZHJmLnBvbGxlbi5yZiwgYWVzKHg9bG9ncmYsIGZpbGwgPSB0cmVhdG1lbnQpKSArDQogIGdlb21faGlzdG9ncmFtKHBvc2l0aW9uID0gImlkZW50aXR5IiwgYmlud2lkdGggPSAwLjEsY29sPUkoImJsYWNrIikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicGVhY2hwdWZmMyIsICJkYXJrc2VhZ3JlZW4iLCAibGlnaHRzZWFncmVlbiIsICJkYXJrb2xpdmVncmVlbjMiLCAiZGFya29saXZlZ3JlZW40IiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJpc3RpbmUgTGV2ZWwiLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJUcmVhdG1lbnQgMSAoY29udHJvbCkiLCAiVHJlYXRtZW50IDIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJlYXRtZW50IDMiLCAiVHJlYXRtZW50IDQiLCAiVHJlYXRtZW50IDUiKSkgKw0KICBnZ3RpdGxlKCJEcm9uZSBSZWxhdGl2ZSBGYXQgKGxvZyB0cmFuc2Zvcm1lZCkiKSArDQogIGxhYnMoeSA9ICJDb3VudCIsIHggPSAibG9nKFJlbGF0aXZlIEZhdChnKSkgIikNCg0KYGBgDQoNCg0KIyMjIyBTdGVwIDEgLSBDaGVjayBmb3IgY29saW5lYXJpdHkgDQoNCmBgYHtyfQ0KcmYubW9kZWwgPC0gbG0ocmVsYXRpdmVfZmF0fiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgd29ya2Vyc19hbGl2ZSArIGR1cmF0aW9uICArIHFybywgZGF0YSA9IGRyZi5wb2xsZW4ucmYpDQp2aWYocmYubW9kZWwpDQpgYGANCg0KIyMjIyBTdGVwIDIgLSBXb3JrIGRvd24gZnJvbSBtb3N0IGNvbXBsaWNhdGVkIG1vZGVsDQoNCmBgYHtyfQ0KcmYuaW50IDwtIGxtZXIocmVsYXRpdmVfZmF0fiB0cmVhdG1lbnQqd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJmLnBvbGxlbi5yZikNCiN0aGlzIGlzIHRoZSBtb2RlbCB3ZSB3aWxsIGtlZXAgDQoNCnJmLmcxIDwtIGxtZXIocmVsYXRpdmVfZmF0fiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgd29ya2Vyc19hbGl2ZSArIGR1cmF0aW9uICArIHFybyArICgxfGNvbG9ueSksIGRhdGEgPSBkcmYucG9sbGVuLnJmKQ0KDQphbm92YShyZi5pbnQsIHJmLmcxKQ0KDQpyZi5nMyA8LSBnbG0obG9ncmYgfiB3aG9sZS5tZWFuLCBkYXRhID0gZHJmLnBvbGxlbi5yZikNCg0KcXFub3JtKHJlc2lkKHJmLmczKSk7cXFsaW5lKHJlc2lkKHJmLmczKSkNCg0KDQpyZi5pbnQuMiA8LSBsbWVyKGxvZ3JmfiB0cmVhdG1lbnQqd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJmLnBvbGxlbi5yZikNCg0KcmYuZzIgPC0gbG1lcihsb2dyZn4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gZHJmLnBvbGxlbi5yZikNCg0KYGBgDQoNCg0KYGBge3J9DQphbm92YShyZi5pbnQsIHJmLmcxKSNyZi5pbnQgbWFyZ2luYWxseSBiZXR0ZXIgDQphbm92YShyZi5pbnQuMiwgcmYuZzIpICNyZi5nMiBiZXR0ZXIgDQoNCkFJQyhyZi5pbnQsIHJmLmcxKQ0KQUlDKHJmLmludC4yLCByZi5nMikNCg0KYGBgDQoNCg0KIyMjIyBTdGVwIDIuYSAtIERyb3AxIA0KDQpgYGB7cn0NCmRyb3AxKHJmLmcyLCB0ZXN0ID0gIkNoaXNxIikNCg0KcmYudXBkYXRlMSA8LSB1cGRhdGUocmYuZzIsIC5+LiAtd29ya2Vyc19hbGl2ZSkNCg0KYW5vdmEocmYuZzIsIHJmLnVwZGF0ZTEpDQoNCmRyb3AxKHJmLnVwZGF0ZTEsIHRlc3QgPSAiQ2hpc3EiKQ0KDQpyZi51cGRhdGUyIDwtIHVwZGF0ZShyZi51cGRhdGUxLCAufi4gLXdob2xlLm1lYW4pDQoNCmFub3ZhKHJmLnVwZGF0ZTIsIHJmLnVwZGF0ZTEpDQoNCmRyb3AxKHJmLnVwZGF0ZTIsIHRlc3QgPSAiQ2hpc3EiKQ0KDQpwYWlycyhlbW1lYW5zKHJmLnVwZGF0ZTIsICJ0cmVhdG1lbnQiKSkNCg0KYGBgDQoNCg0KIyMjIyBTdGVwIDMgLSBDaGVjayBtb2RlbCBmaXQNCg0KYGBge3J9DQpwbG90KHJlc2lkKHJmLnVwZGF0ZTIpKSArIA0KICBhYmxpbmUoaD0wLCBjb2w9InJlZCIsIGx3ZD0yKSANCg0KcXFub3JtKHJlc2lkKHJmLnVwZGF0ZTIpKTtxcWxpbmUocmVzaWQocmYudXBkYXRlMikpICAjZG9lc24ndCBsb29rIGdyZWF0IA0KDQpgYGANCg0KDQpgYGB7cn0NCnBsb3QoZHJmLnBvbGxlbi5yZiR0cmVhdG1lbnQsIGRyZi5wb2xsZW4ucmYkcmVsYXRpdmVfZmF0KQ0KcGxvdChkcmYucG9sbGVuLnJmJHJlbGF0aXZlX2ZhdCkNCg0KcmZfc3ViIDwtIHN1YnNldChkcmYucG9sbGVuLnJmLCByZWxhdGl2ZV9mYXQ8MC4wMDQpICAjRGlmZmVyZW5jZSBvZiAxMyBiZWVzDQoNCmdncGxvdChyZl9zdWIsIGFlcyh4PXJlbGF0aXZlX2ZhdCwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0ocG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW53aWR0aCA9IDAuMDAwMixjb2w9SSgiYmxhY2siKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJwZWFjaHB1ZmYzIiwgImRhcmtzZWFncmVlbiIsICJsaWdodHNlYWdyZWVuIiwgImRhcmtvbGl2ZWdyZWVuMyIsICJkYXJrb2xpdmVncmVlbjQiKSwNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJQcmlzdGluZSBMZXZlbCIsDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlRyZWF0bWVudCAxIChjb250cm9sKSIsICJUcmVhdG1lbnQgMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmVhdG1lbnQgMyIsICJUcmVhdG1lbnQgNCIsICJUcmVhdG1lbnQgNSIpKSArDQogIGdndGl0bGUoIkRyb25lIFJlbGF0aXZlIEZhdCAtIE1hbnVhbCBzdWJzZXQgZGF0YSIpICsNCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJSZWxhdGl2ZSBGYXQoZykgIikNCg0Kc2hhcGlyby50ZXN0KHJmX3N1YiRyZWxhdGl2ZV9mYXQpDQoNCmBgYA0KDQoNCiMjIyMgQ2hlY2sgZm9yIG91dGxpZXJzIA0KDQpgYGB7cn0NCmJveHBsb3Quc3RhdHMoZHJmLnBvbGxlbi5yZiRyZWxhdGl2ZV9mYXQpJG91dCAgICNkb24ndCBjYXJlIGZvciB0aGlzIA0KDQpsb3dlcl9ib3VuZCA8LSBxdWFudGlsZShkcmYucG9sbGVuLnJmJHJlbGF0aXZlX2ZhdCwgMC4wMjUpDQpsb3dlcl9ib3VuZA0KDQp1cHBlcl9ib3VuZCA8LSBxdWFudGlsZShkcmYucG9sbGVuLnJmJHJlbGF0aXZlX2ZhdCwgMC45NzUpDQp1cHBlcl9ib3VuZCAgI3RoaXMgbWF0Y2hlcyB0aGUgc3Vic2V0IGRhdGEgc2V0IEkgbWFkZSBnZXR0aW5nIHJpZCBvZiBhbGwgdmFsdWVzIGdyZWF0ZXIgdGhhbiAwLjAwNCANCg0KDQpvdXRsaWVyX2luZCA8LSB3aGljaChkcmYucG9sbGVuLnJmJHJlbGF0aXZlX2ZhdCA8IGxvd2VyX2JvdW5kIHwgZHJmLnBvbGxlbi5yZiRyZWxhdGl2ZV9mYXQgPiB1cHBlcl9ib3VuZCkNCm91dGxpZXJfaW5kICAgI2RpZmZlcmVuY2Ugb2YgMTYgYmVlcyANCg0KZHJmLnBvbGxlbi5yZltvdXRsaWVyX2luZCxdDQoNCnBsb3Qob3V0bGllcl9pbmQpDQoNCmRmMiA8LSBkcmYucG9sbGVuLnJmWy1jKDM3LCAzOCw0NyAsIDQ4LCAxMjIsIDE2NCwgMTgxICwxODksIDIyMyAsMjY0LCAzMzIsIDMzOSwgMzQ4ICwzNTAgLDM1MSwgMzUyKSxdDQoNCg0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRmMiwgYWVzKHg9cmVsYXRpdmVfZmF0LCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbndpZHRoID0gMC4wMDAyLGNvbD1JKCJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsNCiAgZ2d0aXRsZSgiRHJvbmUgUmVsYXRpdmUgRmF0IC0gT3V0bGllcnMgcmVtb3ZlZCIpICsNCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJSZWxhdGl2ZSBGYXQoZykgIikNCg0Kc2hhcGlyby50ZXN0KGRmMiRyZWxhdGl2ZV9mYXQpICAjIFRoaXMgaXMgd29yc2UgdGhhbiBqdXN0IGN1dHRpbmcgb2ZmIHRoZSB0YWlsICANCmBgYA0KDQoNCmBgYHtyfQ0KcmYuaW50LnN1YiA8LSBsbWVyKHJlbGF0aXZlX2ZhdH4gdHJlYXRtZW50Kndob2xlLm1lYW4gKyB3b3JrZXJzX2FsaXZlICsgZHVyYXRpb24gICsgcXJvICsgKDF8Y29sb255KSwgZGF0YSA9IHJmX3N1YikNCnJmLmcxLnN1YiA8LSBsbWVyKHJlbGF0aXZlX2ZhdH4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gcmZfc3ViKSAja2VlcCB0aGlzIG9uZSAgDQoNCnJmLmRmMi5tb2RlbCA8LSBsbWVyKHJlbGF0aXZlX2ZhdH4gdHJlYXRtZW50Kndob2xlLm1lYW4gKyB3b3JrZXJzX2FsaXZlICsgZHVyYXRpb24gICsgcXJvICsgKDF8Y29sb255KSwgZGF0YSA9IGRmMikNCg0KYW5vdmEocmYuaW50LnN1YiwgcmYuZzEuc3ViKSAgI25vdyB0aGUgbW9kZWwgd2l0aG91dCB0aGUgaW50ZXJhY3Rpb24gaXMgYmV0dGVyLiANCkFJQyhyZi5pbnQuc3ViLCByZi5nMS5zdWIpDQoNCnBsb3QocmVzaWQocmYuaW50LnN1YikpICsgDQogIGFibGluZShoPTAsIGNvbD0icmVkIiwgbHdkPTIpIA0KDQpxcW5vcm0ocmVzaWQocmYuaW50LnN1YikpO3FxbGluZShyZXNpZChyZi5pbnQuc3ViKSkgICNsb29rcyBtdWNoIGJldHRlcg0KDQpxcW5vcm0ocmVzaWQocmYuZGYyLm1vZGVsKSk7cXFsaW5lKHJlc2lkKHJmLmRmMi5tb2RlbCkpICNsb29rcyBtYXJnaW5hbGx5IGJldHRlciBidXQgbm90IGdvb2QgZW5vdWdoIHRvIGp1c3RpZnkgY3V0dGluZyB0aGUgZGF0YQ0KDQpwbG90KHJlc2lkKHJmLmcxLnN1YikpICsgDQogIGFibGluZShoPTAsIGNvbD0icmVkIiwgbHdkPTIpIA0KDQpxcW5vcm0ocmVzaWQocmYuZzEuc3ViKSk7cXFsaW5lKHJlc2lkKHJmLmcxLnN1YikpDQoNCmBgYA0KDQpgYGB7cn0NCmVtdHJlbmRzKHJmLmludC5zdWIsIHBhaXJ3aXNlIH4gdHJlYXRtZW50LCB2YXIgPSAid2hvbGUubWVhbiIpDQpwbG90KGVtdHJlbmRzKHJmLmludC5zdWIsIHBhaXJ3aXNlIH4gdHJlYXRtZW50LCB2YXIgPSAid2hvbGUubWVhbiIpKQ0KZW1taXAocmYuaW50LnN1YiwgdHJlYXRtZW50IH4gd2hvbGUubWVhbiwgY292LnJlZHVjZSA9IHJhbmdlKQ0KDQpgYGANCg0KDQoNCiMjIyMgRHJvcDEgZm9yIHN1YnNldCBkYXRhIA0KDQpgYGB7cn0NCg0KZHJvcDEocmYuZzEuc3ViLCB0ZXN0ID0gIkNoaXNxIikNCg0Kc3VibW9kLjIgPC0gdXBkYXRlKHJmLmcxLnN1YiwgLn4uIC13b3JrZXJzX2FsaXZlKQ0KDQphbm92YShyZi5nMS5zdWIsIHN1Ym1vZC4yKQ0KDQpkcm9wMShzdWJtb2QuMiwgdGVzdCA9ICJDaGlzcSIpDQoNCnN1Ym1vZC4zIDwtIHVwZGF0ZShzdWJtb2QuMiwgLn4uIC1xcm8pDQoNCmFub3ZhKHN1Ym1vZC4yLCBzdWJtb2QuMykNCg0KZHJvcDEoc3VibW9kLjMsIHRlc3QgPSAiQ2hpc3EiKQ0KDQpxcW5vcm0ocmVzaWQoc3VibW9kLjMpKTtxcWxpbmUocmVzaWQoc3VibW9kLjMpKSAjZmluZSBpc2ggDQoNCmBgYA0KDQoqS2VlcCAic3VibW9kLjMiIDogcmVsYXRpdmVfZmF0IH4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIGR1cmF0aW9uICsgKDEgfCBjb2xvbnkpKiANCg0KIyMjIyBTdGVwIDQgLSBSZXN1bHRzIA0KDQpgYGB7cn0NCkFub3ZhKHJmLnVwZGF0ZTIpDQpyZjIuZW1tIDwtIGVtbWVhbnMocmYudXBkYXRlMiwgInRyZWF0bWVudCIpDQpwYWlycyhyZjIuZW1tKQ0KcGxvdChyZjIuZW1tLCBjb21wYXJpc29ucyA9IFRSVUUpDQoNCmBgYA0KDQoNCipLZWVwIHRoZSByZnVwZGF0ZS4yIG1vZGVsLiBUaGUgbWVhbnMgY29tcGFyaXNvbnMgbWF0Y2hlcyB0aGUgdmlzdWFsaXphdGlvbiBiZXR0ZXIgZm9yIHRoaXMgbW9kZWwsIGFuZCBpdCBpcyBub3QgYmFzZWQgb24gdGhlIHN1YnNldCBkYXRhLiBUaGUgcXFwbG90IGRvZXNuJ3QgbG9vayBhcyBnb29kIGZvciB0aGlzIG1vZGVsLCBidXQgaXQncyBub3QgdGVycmlibGUgYW5kIEknZCByYXRoZXIga2VlcCB0aGUgd2hvbGUgZGF0YSBzZXQqDQoNCg0KYGBge3J9DQpyZi5zdW0gPC0gcmZfc3ViICU+JQ0KICBncm91cF9ieSh0cmVhdG1lbnQpICU+JQ0KICBzdW1tYXJpc2UobXJmID0gbWVhbihyZWxhdGl2ZV9mYXQpLCANCiAgICAgICAgICAgIHNkcmYgPSBzZChyZWxhdGl2ZV9mYXQpLA0KICAgICAgICAgICAgbnJmID0gbGVuZ3RoKHJlbGF0aXZlX2ZhdCkpICU+JQ0KICBtdXRhdGUoc2VyZiA9IHNkcmYvc3FydChucmYpKQ0KDQpyZi5zdW0NCmBgYA0KDQoNCg0KIyMjIyBTdGVwIDUgLSBWaXN1YWxpemUNCg0KKkkgc2hvdWxkIGJlIGFibGUgdG8gbWFrZSBhIG1vZGVsIHdoZXJlIDEgZGlmZmVycyBmcm9tIDMgYW5kIDQsIDIgZGlmZmVycyBmcm9tIDMsIDMgZGlmZmVycyBmcm9tIDEsIDIsIDQsIGFuZCA1LCBhbmQgNSBkaWZmZXJzIGZyb20gNCBhbmQgMy4gU28gYWN0dWFsbHkgdGhlIGZpbmFsIG1vZGVsIEkgd2lsbCBiZSBrZWVwaW5nIGZvciB0aGUgYW5hbHlzaXMgaXMgcmYuaW50LiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBkYXRhIG5vdCBzdWJzZXQsIG5vdCBsb2cgdHJhbnNmb3JtZWQsIGFuZCB0aGUgZW1tZWFucyBvdXRwdXQgbW9zdCBjbG9zZWx5IG1hdGNoZXMgd2hhdCB3ZSB3b3VsZCBleHBlY3QgdG8gc2VlIGJhc2VkIG9uIHRoZSBTRSBmcm9tIHRoZSBzdW1tYXJ5IG9mIHRoZSBkYXRhIG1lYW5zKg0KDQoNCmBgYHtyfQ0KDQpyZnR1ay5tZWFucyA8LSBlbW1lYW5zKG9iamVjdCA9IHJmLnVwZGF0ZTIsDQogICAgICAgICAgICAgICAgICAgICAgICBzcGVjcyA9ICJ0cmVhdG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ID0gIlR1a2V5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQoNCnJmdHVrLm1lYW5zDQoNCmBgYA0KDQoNCmBgYHtyfQ0KcmYuY2xkLm1vZGVsIDwtIGNsZChvYmplY3QgPSByZnR1ay5tZWFucywNCiAgICAgICAgICAgICAgICAgICAgIGFkanVzdCA9ICJUdWtleSIsDQogICAgICAgICAgICAgICAgICAgICBMZXR0ZXJzID0gbGV0dGVycywNCiAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC4wNSkNCnJmLmNsZC5tb2RlbA0KYGBgDQoNCmBgYHtyfQ0KcmZ0dWsudHJlYXRtZW50IDwtIGFzLmRhdGEuZnJhbWUocmYuY2xkLm1vZGVsKQ0KcmZ0dWsudHJlYXRtZW50DQoNCmBgYA0KDQpgYGB7ciwgZmlnLmhlaWdodD0gOCwgZmlnLndpZHRoPSAxNCB9DQpyZl9tYXggPC0gcmZfc3ViICU+JQ0KICBncm91cF9ieSh0cmVhdG1lbnQpICU+JQ0KICBzdW1tYXJpemUobWF4cmYgPSBtYXgobWVhbihyZWxhdGl2ZV9mYXQpKSkNCg0KDQpyZl9mb3JfcGxvdHRpbmcgPC0gZnVsbF9qb2luKHJmdHVrLnRyZWF0bWVudCwgcmZfbWF4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnk9InRyZWF0bWVudCIpDQoNCnJmIDwtIGdncGxvdChkYXRhID0gcmYuc3VtLCBhZXMoeCA9IHRyZWF0bWVudCwgeSA9IG1yZiwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9jb2woY29sID0gImJsYWNrIikrDQogIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMC4wMDEyLCAwLjAwMikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicGVhY2hwdWZmMyIsICJkYXJrc2VhZ3JlZW4iLCAibGlnaHRzZWFncmVlbiIsICJkYXJrb2xpdmVncmVlbjMiLCAiZGFya29saXZlZ3JlZW40IiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJpc3RpbmUgTGV2ZWwiLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJUcmVhdG1lbnQgMSAoY29udHJvbCkiLCAiVHJlYXRtZW50IDIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJlYXRtZW50IDMiLCAiVHJlYXRtZW50IDQiLCAiVHJlYXRtZW50IDUiKSkgKyANCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1yZiAtIHNlcmYsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbXJmICsgc2VyZiksDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuNCkgKw0KICBsYWJzKHkgPSAiTWVhbiBEcm9uZSBSZWxhdGl2ZSBGYXQgKGcpIiwpICsNCiAgZ2d0aXRsZSgiQXZlcmFnZSBEcm9uZSBSZWxhdGl2ZSBGYXQgKGcpIHBlciBUcmVhdG1lbnQiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJUcmVhdG1lbnQiLCANCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIFBQQiIsICIxNTAgUFBCIiwgIjEsNTAwIFBQQiIsICIxNSwwMDAgUFBCIiwgIjE1MCwwMDAgUFBCIikpICsNCiAgdGhlbWVfY293cGxvdCgpKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDMwKSANCg0KcmYgPC0gcmYgKyANCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgDQogICAgICAgICAgeCA9IDEsIHkgPSAwLjAwMiwNCiAgICAgICAgICBsYWJlbCA9ICJQIDwgMC4wMSIsDQogICAgICAgICAgc2l6ZSA9IDgpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IGMoMywgNCwgMiwgMSwgNSksDQogICAgICAgICAgIHkgPSByZl9mb3JfcGxvdHRpbmckbWF4cmYgKyAwLjAwMDEzLA0KICAgICAgICAgICBsYWJlbCA9IGMoImEiLCAiYWIiLCAiYWIiLCAiYiIsICJiIiksDQogICAgICAgICAgIHNpemUgPSA4KSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICAibm9uZSIpDQoNCnJmDQpgYGANCg0KDQojIyMjIFJlbGF0aXZlIEZhdCBSZXN1bHRzIFN1bW1hcnkgDQoNCmBgYHtyfQ0KcmYudXBkYXRlMg0KcmZfQSA8LSBhcy5kYXRhLmZyYW1lKEFub3ZhKHJmLnVwZGF0ZTIpKQ0KQW5vdmEocmYudXBkYXRlMikNCnJmX0EgPC0gc2V0RFQocmZfQSkNCnJmX0ENCnJmX2VtbSA8LSBlbW1lYW5zKHJmLnVwZGF0ZTIsIHBhaXJ3aXNlIH4gdHJlYXRtZW50KQ0KcmZfY29udHJhc3RzIDwtIGFzLmRhdGEuZnJhbWUocmZfZW1tJGNvbnRyYXN0cykNCnJmX21lYW5zIDwtIGFzLmRhdGEuZnJhbWUocmZfZW1tJGVtbWVhbnMpDQpyZl9tZWFucyA8LSBzZXREVChyZl9tZWFucykNCnJmX21lYW5zDQpyZl9jb250cmFzdHMgPC0gc2V0RFQocmZfY29udHJhc3RzKQ0KcmZfY29udHJhc3RzDQpyZi5zdW0gPC0gc2V0RFQocmYuc3VtKQ0KcmYuc3VtDQpgYGANCg0KDQoNCg0KDQojIyMgRHJvbmUgUmFkaWFsIENlbGwgTGVuZ3RoDQoNCmBgYHtyfQ0KcmMuZHJvbmVzIDwtIHN1YnNldChkcmYucG9sbGVuLCBzZWxlY3QgPSBjKHJhZGlhbCwgdHJlYXRtZW50LCB3aG9sZS5tZWFuLCB3b3JrZXJzX2FsaXZlLCBhbGl2ZSwgZHVyYXRpb24sIHFybywgY29sb255KSkNCnJjLmRyb25lcyA8LSBuYS5vbWl0KHJjLmRyb25lcykNCmBgYA0KDQpgYGB7cn0NCg0KZ2dwbG90KHJjLmRyb25lcywgYWVzKHg9cmFkaWFsLCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbndpZHRoID0gMC4wNSxjb2w9SSgiYmxhY2siKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJwZWFjaHB1ZmYzIiwgImRhcmtzZWFncmVlbiIsICJsaWdodHNlYWdyZWVuIiwgImRhcmtvbGl2ZWdyZWVuMyIsICJkYXJrb2xpdmVncmVlbjQiKSwNCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJQcmlzdGluZSBMZXZlbCIsDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlRyZWF0bWVudCAxIChjb250cm9sKSIsICJUcmVhdG1lbnQgMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmVhdG1lbnQgMyIsICJUcmVhdG1lbnQgNCIsICJUcmVhdG1lbnQgNSIpKSArDQogIGdndGl0bGUoIkRyb25lIFJhZGlhbCBDZWxsIExlbmd0aCIpICsNCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJMZW5ndGggKG1tKSAiKQ0KDQpzaGFwaXJvLnRlc3QocmMuZHJvbmVzJHJhZGlhbCkNCg0KcmFuZ2UocmMuZHJvbmVzJHJhZGlhbCkNCg0KcmMuZHJvbmVzJHJhZHNxdWFyZSA8LSAocmMuZHJvbmVzJHJhZGlhbCleMg0KDQpzaGFwaXJvLnRlc3QocmMuZHJvbmVzJHJhZHNxdWFyZSkNCg0KZ2dwbG90KHJjLmRyb25lcywgYWVzKHg9cmFkc3F1YXJlLCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbndpZHRoID0gMC41LGNvbD1JKCJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsNCiAgZ2d0aXRsZSgiRHJvbmUgUmFkaWFsIENlbGwgTGVuZ3RoIF4yICIpICsNCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJMZW5ndGggXjIgKG1tKSAiKQ0KDQpgYGANCg0KIyMjIyBTdGVwIDEgLSBDaGVjayBmb3IgY29saW5lYXJpdHkgDQoNCmBgYHtyfQ0KcmFkLm1vZGVsIDwtIGxtKHJhZGlhbH4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8sIGRhdGEgPSByYy5kcm9uZXMpDQp2aWYocmFkLm1vZGVsKQ0KDQojTm8gY29saW5lYXJpdHkgDQoNCmBgYA0KDQoNCiMjIyMgU3RlcCAyIC0gV29yayBkb3duIGZyb20gbW9zdCBjb21wbGljYXRlZCBtb2RlbA0KDQpgYGB7cn0NCnJhZC5pbnQgPC0gbG1lcihyYWRzcXVhcmV+IHRyZWF0bWVudCp3aG9sZS5tZWFuICsgd29ya2Vyc19hbGl2ZSArIGR1cmF0aW9uICArIHFybyArICgxfGNvbG9ueSksIGRhdGEgPSByYy5kcm9uZXMpDQoNCnJhZC5nMSA8LSBsbWVyKHJhZHNxdWFyZX4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIHdvcmtlcnNfYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8gKyAoMXxjb2xvbnkpLCBkYXRhID0gcmMuZHJvbmVzKSAgICN0aGlzIGlzIHRoZSBtb2RlbCB3ZSBhcmUga2VlcGluZw0KDQpyYWQuZzIgPC0gbG1lcihyYWRzcXVhcmV+IHdob2xlLm1lYW4gKyB3b3JrZXJzX2FsaXZlICsgZHVyYXRpb24gICsgcXJvICsgKDF8Y29sb255KSwgZGF0YSA9IHJjLmRyb25lcykNCmBgYA0KDQpgYGB7cn0NCmFub3ZhKHJhZC5pbnQsIHJhZC5nMSkNCmFub3ZhKHJhZC5nMSwgcmFkLmcyKQ0KYGBgDQoNCiMjIyMgU3RlcCAyLmEgLSBEcm9wMSANCg0KYGBge3J9DQoNCmRyb3AxKHJhZC5nMSwgdGVzdCA9ICJDaGlzcSIpDQoNCnJhZC5nMS51cGRhdGUgPC0gdXBkYXRlKHJhZC5nMSwgLn4uIC13aG9sZS5tZWFuKQ0KYW5vdmEocmFkLmcxLnVwZGF0ZSwgcmFkLmcxKQ0KDQpkcm9wMShyYWQuZzEudXBkYXRlLCB0ZXN0ID0gIkNoaXNxIikNCg0KcmFkLmcxLnVwZGF0ZTIgPC0gdXBkYXRlKHJhZC5nMS51cGRhdGUsIC5+LiAtd29ya2Vyc19hbGl2ZSkNCmFub3ZhKHJhZC5nMS51cGRhdGUyLCByYWQuZzEudXBkYXRlKQ0KDQpkcm9wMShyYWQuZzEudXBkYXRlMiwgdGVzdCA9ICJDaGlzcSIpDQoNCnJhZC5nMS51cGRhdGUzIDwtIHVwZGF0ZShyYWQuZzEudXBkYXRlMiwgLn4uIC1kdXJhdGlvbikNCmFub3ZhKHJhZC5nMS51cGRhdGUzLCByYWQuZzEudXBkYXRlMikNCg0KZHJvcDEocmFkLmcxLnVwZGF0ZTMsIHRlc3QgPSAiQ2hpc3EiKQ0KYGBgDQoNCg0KIyMjIyBTdGVwIDMgLSBDaGVjayBtb2RlbCBmaXQNCg0KYGBge3J9DQpxcW5vcm0ocmVzaWQocmFkLmcxLnVwZGF0ZTMpKTtxcWxpbmUocmVzaWQocmFkLmcxLnVwZGF0ZTMpKSAgIA0KDQpwbG90KHJlc2lkKHJhZC5nMS51cGRhdGUzKSkgKyANCiAgYWJsaW5lKGg9MCwgY29sPSJyZWQiLCBsd2Q9MikgDQoNCiN5YXkhIDopIA0KDQpgYGANCg0KDQoNCiMjIyMgU3RlcCA0IC0gUmVzdWx0cyANCg0KYGBge3J9DQpzdW1tYXJ5KHJhZC5nMS51cGRhdGUzKQ0KDQpBbm92YShyYWQuZzEudXBkYXRlMykNCg0KYGBgDQoNCg0KYGBge3J9DQpyYWQuZW1tIDwtIGVtbWVhbnMocmFkLmcxLnVwZGF0ZTMsICJ0cmVhdG1lbnQiKQ0KcGFpcnMocmFkLmVtbSkNCmBgYA0KDQoNCmBgYHtyfQ0KcmFkLnN1bSA8LSByYy5kcm9uZXMgJT4lDQogIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lDQogIHN1bW1hcmlzZShyYWQubSA9IG1lYW4ocmFkaWFsKSwgDQogICAgICAgICAgICByYWQuc2QgPSBzZChyYWRpYWwpLA0KICAgICAgICAgICAgcmFkLm4gPSBsZW5ndGgocmFkaWFsKSkgJT4lDQogIG11dGF0ZShzZXJhZCA9IHJhZC5zZC9zcXJ0KHJhZC5uKSkNCnJhZC5zdW0NCmBgYA0KDQoNCiMjIyMgU3RlcCA1IC0gVmlzdWFsaXplDQoNCmBgYHtyfQ0KDQpyYWRhbm92YV9zdW1tYXJ5IDwtIHN1bW1hcnkocmFkLmcxLnVwZGF0ZTMpDQogICAgICAgICANCiAgICAgICAgIA0KcmFkdHVrLm1lYW5zIDwtIGVtbWVhbnMob2JqZWN0ID0gcmFkLmcxLnVwZGF0ZTMsDQogICAgICAgICAgICAgICAgICAgICAgICBzcGVjcyA9ICJ0cmVhdG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ID0gIlR1a2V5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQoNCnJhZHR1ay5tZWFucw0KDQpyYWQuY2xkLm1vZGVsIDwtIGNsZChvYmplY3QgPSByYWR0dWsubWVhbnMsDQogICAgICAgICAgICAgICAgICAgICBhZGp1c3QgPSAiVHVrZXkiLA0KICAgICAgICAgICAgICAgICAgICAgTGV0dGVycyA9IGxldHRlcnMsDQogICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuMDUpDQpyYWQuY2xkLm1vZGVsDQoNCnJhZHR1ay50cmVhdG1lbnQgPC0gYXMuZGF0YS5mcmFtZShyYWQuY2xkLm1vZGVsKQ0KDQpyYWRfbWF4IDwtIHJjLmRyb25lcyAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXplKG1heHJhZCA9IG1heChtZWFuKHJhZGlhbCkpKQ0KDQoNCnJhZF9mb3JfcGxvdHRpbmcgPC0gZnVsbF9qb2luKHJhZHR1ay50cmVhdG1lbnQsIHJhZF9tYXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0idHJlYXRtZW50IikNCg0KYGBgDQoNCg0KYGBge3IsIGZpZy53aWR0aD0gMTIsIGZpZy5oZWlnaHQ9IDEwfQ0KcmFkcCA8LSBnZ3Bsb3QoZGF0YSA9IHJhZC5zdW0sIGFlcyh4ID0gdHJlYXRtZW50LCB5ID0gcmFkLm0sIGZpbGwgPSB0cmVhdG1lbnQpKSArDQogIGdlb21fY29sKGNvbCA9ICJibGFjayIpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDIsMi41NSkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicGVhY2hwdWZmMyIsICJkYXJrc2VhZ3JlZW4iLCAibGlnaHRzZWFncmVlbiIsICJkYXJrb2xpdmVncmVlbjMiLCAiZGFya29saXZlZ3JlZW40IiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJpc3RpbmUgTGV2ZWwiLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJUcmVhdG1lbnQgMSAoY29udHJvbCkiLCAiVHJlYXRtZW50IDIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJlYXRtZW50IDMiLCAiVHJlYXRtZW50IDQiLCAiVHJlYXRtZW50IDUiKSkgKyANCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHJhZC5tIC0gc2VyYWQsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gcmFkLm0gKyBzZXJhZCksDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjkpLCB3aWR0aCA9IDAuNCkgKw0KICBsYWJzKHkgPSAiTWVhbiBEcm9uZSBSYWRpYWwgQ2VsbCBMZW5ndGgiLCkgKw0KICBnZ3RpdGxlKCJBdmVyYWdlIERyb25lIFJhZGlhbCBDZWxsIExlbmd0aCAobW0pIHBlciBUcmVhdG1lbnQiKSArDQogIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJUcmVhdG1lbnQiLCANCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwIFBQQiIsICIxNTAgUFBCIiwgIjEsNTAwIFBQQiIsICIxNSwwMDAgUFBCIiwgIjE1MCwwMDAgUFBCIikpICsNCiAgdGhlbWVfY293cGxvdCgpKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDMwKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KcmFkcCA8LSByYWRwICsgDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIA0KICAgICAgICAgIHggPSAyLCB5ID0gMi41NCwNCiAgICAgICAgICBsYWJlbCA9ICJQID4gMC4xIiwNCiAgICAgICAgICBzaXplID0gMTIpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IGMoMywgMiwgNSwgNCwgMSksDQogICAgICAgICAgIHkgPSByYWRfZm9yX3Bsb3R0aW5nJG1heHJhZCArIDAuMDUsDQogICAgICAgICAgIGxhYmVsID0gYygiYSIsICJhIiwgImEiLCAiYSIsICJhIiksDQogICAgICAgICAgIHNpemUgPSAxMikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAgIm5vbmUiKQ0KDQpyYWRwDQpgYGANCg0KIyMjIyBSYWRpYWwgQ2VsbCBSZXN1bHRzIFN1bW1hcnkgDQoNCmBgYHtyfQ0KcmFkLmcxLnVwZGF0ZTMNCnJhZF9BIDwtIGFzLmRhdGEuZnJhbWUoQW5vdmEocmFkLmcxLnVwZGF0ZTMpKQ0KcmFkX0EgPC0gc2V0RFQocmFkX0EpDQpyYWRfQQ0KcmFkX2VtbSA8LSBlbW1lYW5zKHJhZC5nMS51cGRhdGUzLCBwYWlyd2lzZSB+IHRyZWF0bWVudCkNCnJhZF9jb250cmFzdHMgPC0gYXMuZGF0YS5mcmFtZShyYWRfZW1tJGNvbnRyYXN0cykNCnJhZF9jb250cmFzdHMgPC0gc2V0RFQocmFkX2NvbnRyYXN0cykNCnJhZF9jb250cmFzdHMNCnJhZF9tZWFucyA8LSBhcy5kYXRhLmZyYW1lKHJhZF9lbW0kZW1tZWFucykNCnJhZF9tZWFucyA8LSBzZXREVChyYWRfbWVhbnMpDQpyYWRfbWVhbnMNCg0KcmFkLnN1bSA8LSBhcy5kYXRhLmZyYW1lKHJhZC5zdW0pDQpyYWQuc3VtIDwtIHNldERUKHJhZC5zdW0pDQpyYWQuc3VtDQpgYGANCg0KDQojIyMgRHJvbmUgQ291bnRzDQoNCmBgYHtyfQ0KDQp0cnVuYy5jc3YgPC0gcmVhZF9jc3YoImR1cmF0aW9uLmZvcnRydW5jLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMocm91bmQgPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIjEiLCANCiAgICAgICAgIjIiKSksIHRyZWF0bWVudCA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiMSIsIA0KICAgICAgICAiMiIsICIzIiwgIjQiLCAiNSIpKSwgcmVwbGljYXRlID0gY29sX2ZhY3RvcihsZXZlbHMgPSBjKCIxIiwgDQogICAgICAgICIyIiwgIjMiLCAiNCIsICI1IiwgIjciLCAiOSIsICIxMSIsIA0KICAgICAgICAiMTIiKSksIHN0YXJ0X2RhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJW0vJWQvJVkiKSwgDQogICAgICAgIGVtZXJnZV9kYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVtLyVkLyVZIiksIA0KICAgICAgICBlbmRfZGF0ZSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlbS8lZC8lWSIpKSkgICAgIyB0aGlzIGRhdGEgc2V0IGlzIGZvciBkcm9uZSBjb3VudHMgDQoNCnRydW5jIDwtIG1lcmdlKHdkLnN1bW1hcnksIHRydW5jLmNzdiwgYnkueCA9ICJjb2xvbnkiKQ0KdHJ1bmMgPC0gbWVyZ2UobW9ydGFsaXR5LCB0cnVuYywgYnkueCA9ICJjb2xvbnkiKQ0KDQp0cnVuYyRxcm8gPC0gYXMuZmFjdG9yKHRydW5jJG9yaWdpbikNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCmNvdW50LmRyb25lcyA8LSBzdWJzZXQodHJ1bmMsIHNlbGVjdCA9IGMoY291bnQsIHRyZWF0bWVudCwgd2hvbGUubWVhbiwgYWxpdmUsIGR1cmF0aW9uLCBxcm8sIGNvbG9ueSkpDQpjb3VudC5kcm9uZXMgPC0gbmEub21pdChjb3VudC5kcm9uZXMpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChjb3VudC5kcm9uZXMsIGFlcyh4PWNvdW50LCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShwb3NpdGlvbiA9ICJpZGVudGl0eSIsIGJpbndpZHRoID0gMSAsY29sPUkoImJsYWNrIikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygicGVhY2hwdWZmMyIsICJkYXJrc2VhZ3JlZW4iLCAibGlnaHRzZWFncmVlbiIsICJkYXJrb2xpdmVncmVlbjMiLCAiZGFya29saXZlZ3JlZW40IiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJpc3RpbmUgTGV2ZWwiLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJUcmVhdG1lbnQgMSAoY29udHJvbCkiLCAiVHJlYXRtZW50IDIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJlYXRtZW50IDMiLCAiVHJlYXRtZW50IDQiLCAiVHJlYXRtZW50IDUiKSkgKw0KICBnZ3RpdGxlKCJEcm9uZSBDb3VudCIpICsNCiAgbGFicyh5ID0gIkNvdW50IiwgeCA9ICJOdW1iZXIgb2YgRHJvbmVzIikNCmBgYA0KDQoNCiMjIyMgU3RlcCAxIC0gQ2hlY2sgZm9yIGNvbGluZWFyaXR5IA0KDQoNCmBgYHtyfQ0KY291bnQubW9kZWwgPC0gbG0oY291bnR+IHRyZWF0bWVudCArIHdob2xlLm1lYW4gKyBhbGl2ZSArIGR1cmF0aW9uICsgcXJvLCBkYXRhID0gY291bnQuZHJvbmVzKQ0KdmlmKGNvdW50Lm1vZGVsKQ0KYGBgDQoNCg0KIyMjIyBTdGVwIDIgLSBXb3JrIGRvd24gZnJvbSBtb3N0IGNvbXBsaWNhdGVkIG1vZGVsDQoNCmBgYHtyfQ0KY291bnQucG9pcyA8LSBnbG0oY291bnQgfiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICthbGl2ZSArZHVyYXRpb24gKyBxcm8sIGRhdGEgPSBjb3VudC5kcm9uZXMsIGZhbWlseSA9ICJwb2lzc29uIikNCnN1bW1hcnkoY291bnQucG9pcykgICAjb3ZlcmRpc3BlcnNlZCANCg0KY291bnQucG9pcy5pbnQgPC0gZ2xtKGNvdW50IH4gdHJlYXRtZW50Kndob2xlLm1lYW4gK2FsaXZlICtkdXJhdGlvbiArIHFybywgZGF0YSA9IGNvdW50LmRyb25lcywgZmFtaWx5ID0gInBvaXNzb24iKQ0Kc3VtbWFyeShjb3VudC5wb2lzLmludCkgIyB0aW55IGJpdCBiZXR0ZXIgYnV0IHN0aWxsIG92ZXIgZGlzcGVyc2VkIA0KDQpjb3VudC5pbnQgPC0gZ2xtLm5iKGNvdW50fiB0cmVhdG1lbnQqd2hvbGUubWVhbiArIGFsaXZlICsgZHVyYXRpb24gICsgcXJvLCBkYXRhID0gY291bnQuZHJvbmVzKQ0KDQpjb3VudC5nMSA8LSBnbG0ubmIoY291bnR+IHRyZWF0bWVudCArIHdob2xlLm1lYW4gKyBhbGl2ZSArIGR1cmF0aW9uICArIHFybyAsIGRhdGEgPSBjb3VudC5kcm9uZXMpICAgI3RoaXMgaXMgdGhlIG1vZGVsIHdlIGFyZSBrZWVwaW5nDQoNCmNvdW50LmcyIDwtIGdsbS5uYihjb3VudH4gdHJlYXRtZW50ICsgYWxpdmUgKyBkdXJhdGlvbiAgKyBxcm8sIGRhdGEgPSBjb3VudC5kcm9uZXMpDQoNCmNvdW50LmczIDwtIGdsbS5uYihjb3VudH4gd2hvbGUubWVhbiArIGFsaXZlICsgZHVyYXRpb24gICsgcXJvLCBkYXRhID0gY291bnQuZHJvbmVzKQ0KYGBgDQoNCmBgYHtyfQ0KYW5vdmEoY291bnQuaW50LCBjb3VudC5nMSkNCmFub3ZhKGNvdW50LmcxLCBjb3VudC5nMikNCmFub3ZhKGNvdW50LmcxLCBjb3VudC5nMykNCg0KQUlDKGNvdW50LmcxLCBjb3VudC5nMykNCkFJQyhjb3VudC5nMSwgY291bnQuaW50KQ0KYGBgDQoNCiMjIyMgU3RlcCAyLmEgLSBEcm9wMQ0KDQpgYGB7cn0NCmRyb3AxKGNvdW50LmcxLCB0ZXN0ID0gIkNoaXNxIikNCg0KY291bnQuZzEudXBkYXRlIDwtIHVwZGF0ZShjb3VudC5nMSwgLn4uIC1kdXJhdGlvbikNCmFub3ZhKGNvdW50LmcxLCBjb3VudC5nMS51cGRhdGUpDQoNCmRyb3AxKGNvdW50LmcxLnVwZGF0ZSwgdGVzdCA9ICJDaGlzcSIpICAjZ2V0IHJpZCBvZiBkdXJhdGlvbiANCg0KYGBgDQoNCg0KIyMjIyBTdGVwIDMgLSBDaGVjayBtb2RlbCBmaXQNCg0KDQpgYGB7cn0NCnFxbm9ybShyZXNpZChjb3VudC5nMS51cGRhdGUpKTtxcWxpbmUocmVzaWQoY291bnQuZzEudXBkYXRlKSkNCg0KDQpwbG90KHJlc2lkKGNvdW50LmcxLnVwZGF0ZSkpICsgDQogIGFibGluZShoPTAsIGNvbD0icmVkIiwgbHdkPTIpIA0KDQojdGhlc2UgYXJlIGFjdHVhbGx5IG5vdCBiYWQgDQpgYGANCg0KIyMjIyBTdGVwIDQgLSBSZXN1bHRzIA0KDQpgYGB7cn0NCnN1bW1hcnkoY291bnQuZzEudXBkYXRlKQ0KQW5vdmEoY291bnQuZzEudXBkYXRlKQ0KDQplbS5jb3VudCA8LSBlbW1lYW5zKGNvdW50LmcxLnVwZGF0ZSwgInRyZWF0bWVudCIpDQpwYWlycyhlbS5jb3VudCkNCnBsb3QoZW0uY291bnQsIGNvbXBhcmlzb25zID0gVFJVRSkNCg0KY291bnQuc3VtIDwtIGNvdW50LmRyb25lcyAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNvdW50Lm0gPSBtZWFuKGNvdW50KSwgDQogICAgICAgICAgICBjb3VudC5zZCA9IHNkKGNvdW50KSwNCiAgICAgICAgICAgIGNvdW50Lm4gPSBsZW5ndGgoY291bnQpKSAlPiUNCiAgbXV0YXRlKHNlY291bnQgPSBjb3VudC5zZC9zcXJ0KGNvdW50Lm4pKQ0KY291bnQuc3VtDQpgYGANCg0KDQojIyMjIFN0ZXAgNSAtIFZpc3VhbGl6ZQ0KDQpgYGB7ciwgZmlnLmhlaWdodD0gMTMsIGZpZy53aWR0aD0gMTF9DQoNCmNvdW50YW5vdmFfc3VtbWFyeSA8LSBzdW1tYXJ5KGNvdW50LmcxLnVwZGF0ZSkNCiAgICAgICAgIA0KICAgICAgICAgDQpjb3VudHR1ay5tZWFucyA8LSBlbW1lYW5zKG9iamVjdCA9IGNvdW50LmcxLnVwZGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNzID0gInRyZWF0bWVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3QgPSAiVHVrZXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJyZXNwb25zZSIpDQoNCg0KY291bnR0dWsubWVhbnMNCg0KY291bnQuY2xkLm1vZGVsIDwtIGNsZChvYmplY3QgPSBjb3VudHR1ay5tZWFucywNCiAgICAgICAgICAgICAgICAgICAgIGFkanVzdCA9ICJUdWtleSIsDQogICAgICAgICAgICAgICAgICAgICBMZXR0ZXJzID0gbGV0dGVycywNCiAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gMC4wNSkNCmNvdW50LmNsZC5tb2RlbA0KDQpjb3VudHR1ay5tZWFucyA8LSBhcy5kYXRhLmZyYW1lKGNvdW50dHVrLm1lYW5zKQ0KDQoNCmNvdW50dWsudHJlYXRtZW50IDwtIGFzLmRhdGEuZnJhbWUoY291bnQuY2xkLm1vZGVsKQ0KDQpjb3VudF9tYXggPC0gY291bnQuZHJvbmVzICU+JQ0KICBncm91cF9ieSh0cmVhdG1lbnQpICU+JQ0KICBzdW1tYXJpemUobWF4Y291bnQgPSBtYXgobWVhbihjb3VudCkpKQ0KDQoNCmNvdW50X2Zvcl9wbG90dGluZyA8LSBmdWxsX2pvaW4oY291bnR1ay50cmVhdG1lbnQsIGNvdW50X21heCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5PSJ0cmVhdG1lbnQiKQ0KDQpnZ3Bsb3QoZGF0YSA9IGNvdW50LnN1bSwgYWVzKHggPSB0cmVhdG1lbnQsIHkgPSBjb3VudC5tLCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2NvbChjb2wgPSAiYmxhY2siKSsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygxLDE3LjUpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsgDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjb3VudC5tLXNlY291bnQsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gY291bnQubStzZWNvdW50KSwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC40KSArDQogIGxhYnMoeSA9ICJNZWFuIERyb25lIENvdW50IiwpICsNCiAgZ2d0aXRsZSgiQXZlcmFnZSBEcm9uZSBDb3VudCBwZXIgVHJlYXRtZW50IikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSAiVHJlYXRtZW50IiwgDQogICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMCBQUEIiLCAiMTUwIFBQQiIsICIxLDUwMCBQUEIiLCAiMTUsMDAwIFBQQiIsICIxNTAsMDAwIFBQQiIpKSArDQogIHRoZW1lX2Nvd3Bsb3QoKSsNCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAzMCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgDQogICAgICAgICAgeCA9IDEuNSwgeSA9IDE2LA0KICAgICAgICAgIGxhYmVsID0gIlAgPiAwLjA1IiwNCiAgICAgICAgICBzaXplID0gMTUpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IGMoMywgMiwgNCwgMSwgNSksDQogICAgICAgICAgIHkgPSBjb3VudF9mb3JfcGxvdHRpbmckbWF4Y291bnQgKyAzLjUsDQogICAgICAgICAgIGxhYmVsID0gYygiYSIsICJhIiwgImEiLCAiYSIsICJhIiksDQogICAgICAgICAgIHNpemUgPSAxMikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAgIm5vbmUiKQ0KDQoNCmBgYA0KDQojIyMjIERyb25lIENvdW50cyBSZXN1bHRzIFN1bW1hcnkgDQoNCmBgYHtyfQ0KY291bnQuZzEudXBkYXRlDQpjb3VudF9BIDwtIGFzLmRhdGEuZnJhbWUoQW5vdmEoY291bnQuZzEudXBkYXRlKSkNCmNvdW50X0EgPC0gc2V0RFQoY291bnRfQSkNCmNvdW50X0ENCkFub3ZhKGNvdW50LmcxLnVwZGF0ZSkNCmNvdW50X2VtbSA8LSBlbW1lYW5zKGNvdW50LmcxLnVwZGF0ZSwgcGFpcndpc2UgfiB0cmVhdG1lbnQpDQpjb3VudF9jb250cmFzdHMgPC0gYXMuZGF0YS5mcmFtZShjb3VudF9lbW0kY29udHJhc3RzKQ0KY291bnRfY29udHJhc3RzIDwtIHNldERUKGNvdW50X2NvbnRyYXN0cykNCmNvdW50X2NvbnRyYXN0cw0KY291bnRfbWVhbnMgPC0gYXMuZGF0YS5mcmFtZShjb3VudF9lbW0kZW1tZWFucykNCmNvdW50X21lYW5zIDwtIHNldERUKGNvdW50X21lYW5zKQ0KY291bnRfbWVhbnMNCmBgYA0KDQoNCiMjIyBDb2xvbnkgRHVyYXRpb24NCg0KYGBge3J9DQpkdXJhdGlvbiA8LSBzdWJzZXQodHJ1bmMsIHNlbGVjdCA9IGMoY291bnQsIHRyZWF0bWVudCwgd2hvbGUubWVhbiwgYWxpdmUsIGR1cmF0aW9uLCBxcm8sIGVtZXJnZSwgY29sb255KSkNCg0KZHVyYXRpb24kY2Vuc29yZWQgPC0gaWZlbHNlKGlzLm5hKGR1cmF0aW9uJGVtZXJnZSksIDEsIDApDQoNCmR1cmF0aW9uJGNlbnNvcmVkIDwtIGFzLmxvZ2ljYWwoZHVyYXRpb24kY2Vuc29yZWQpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KGR1cmF0aW9uLCBhZXMoeD1kdXJhdGlvbiwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0ocG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW53aWR0aCA9IDEgLGNvbD1JKCJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsNCiAgZ2d0aXRsZSgiQ29sb255IER1cmF0aW9uIikgKw0KICBsYWJzKHkgPSAiQ291bnQiLCB4ID0gIkRheXMiKQ0KYGBgDQoNCmBgYHtyfQ0KZGVzY2Rpc3QoZHVyYXRpb24kZHVyYXRpb24sIGRpc2NyZXRlID0gVFJVRSkNCg0KZHVyYXRpb24kc3F1YXJlLmR1ciA8LSAoZHVyYXRpb24kZHVyYXRpb24pXjINCg0KZGVzY2Rpc3QoZHVyYXRpb24kc3F1YXJlLmR1ciwgZGlzY3JldGUgPSBUUlVFKQ0KYGBgDQoNCg0KIyMjIyBTdGVwIDEgLSBDaGVjayBmb3IgY29saW5lYXJpdHkgDQoNCmBgYHtyfQ0KZHVyLm1vZGVsIDwtIGxtKGR1cmF0aW9ufiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgYWxpdmUgKyBxcm8sIGRhdGEgPSBkdXJhdGlvbikNCnZpZihkdXIubW9kZWwpDQpgYGANCg0KDQojIyMjIFN0ZXAgMiAtIFdvcmsgZG93biBmcm9tIG1vc3QgY29tcGxpY2F0ZWQgbW9kZWwNCg0KYGBge3J9DQpkdXIucG9pcyA8LSBnbG0oZHVyYXRpb24gfiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgYWxpdmUgKyBxcm8sIGRhdGEgPSBkdXJhdGlvbiwgZmFtaWx5ID0gInBvaXNzb24iKQ0Kc3VtbWFyeShjb3VudC5wb2lzKSAgICNvdmVyZGlzcGVyc2VkIA0KDQpkdXIuaW50IDwtIGdsbS5uYihkdXJhdGlvbn4gdHJlYXRtZW50Kndob2xlLm1lYW4gKyBhbGl2ZSArIHFybywgZGF0YSA9IGR1cmF0aW9uKQ0KDQpkdXIuZzEgPC0gZ2xtLm5iKGR1cmF0aW9ufiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgYWxpdmUgKyBxcm8sIGRhdGEgPSBkdXJhdGlvbikNCmRyb3AxKGR1ci5nMSwgdGVzdCA9ICJDaGlzcSIpDQoNCmR1ci5nMiA8LSBnbG0ubmIoZHVyYXRpb25+IHRyZWF0bWVudCArIGFsaXZlICArIHFybywgZGF0YSA9IGR1cmF0aW9uKQ0KDQpkdXIuZzMgPC0gZ2xtLm5iKGR1cmF0aW9ufiB3aG9sZS5tZWFuICsgYWxpdmUgKyBxcm8sIGRhdGEgPSBkdXJhdGlvbikNCg0KIyBTd2l0Y2ggdG8gc3F1YXJlZCBkYXRhIGJlbG93IHRvIGdldCByaWQgb2Ygd2FybmluZyBtZXNzYWdlcyANCg0KYGBgDQoNCg0KYGBge3J9DQpkdXIucG9pcyA8LSBnbG0oc3F1YXJlLmR1ciB+IHRyZWF0bWVudCArIHdob2xlLm1lYW4gKyBhbGl2ZSArIHFybywgZGF0YSA9IGR1cmF0aW9uLCBmYW1pbHkgPSAicG9pc3NvbiIpDQpzdW1tYXJ5KGNvdW50LnBvaXMpICAgI292ZXJkaXNwZXJzZWQgDQoNCmR1ci5pbnQgPC0gZ2xtLm5iKHNxdWFyZS5kdXJ+IHRyZWF0bWVudCp3aG9sZS5tZWFuICsgYWxpdmUgKyBxcm8sIGRhdGEgPSBkdXJhdGlvbikNCg0KZHVyLmcxIDwtIGdsbS5uYihzcXVhcmUuZHVyfiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgYWxpdmUgKyBxcm8sIGRhdGEgPSBkdXJhdGlvbikNCmRyb3AxKGR1ci5nMSwgdGVzdCA9ICJDaGlzcSIpDQoNCmR1ci5nMiA8LSBnbG0ubmIoc3F1YXJlLmR1cn4gdHJlYXRtZW50ICsgYWxpdmUgICsgcXJvLCBkYXRhID0gZHVyYXRpb24pDQoNCmR1ci5nMyA8LSBnbG0ubmIoc3F1YXJlLmR1cn4gd2hvbGUubWVhbiArIGFsaXZlICsgcXJvLCBkYXRhID0gZHVyYXRpb24pDQoNCmR1ci5nNCA8LSBnbG0ubmIoc3F1YXJlLmR1ciB+IHRyZWF0bWVudCwgZGF0YSA9IGR1cmF0aW9uKQ0KDQpkdXIuY2VuIDwtIGdsbS5uYihzcXVhcmUuZHVyfiB0cmVhdG1lbnQgKyBjZW5zb3JlZCArIHdob2xlLm1lYW4gKyBhbGl2ZSArIHFybywgZGF0YSA9IGR1cmF0aW9uKSAjIA0KZHJvcDEoZHVyLmNlbiwgdGVzdCA9ICJDaGlzcSIpDQoNCmFub3ZhKGR1ci5nMSwgZHVyLmNlbikNCmBgYA0KDQoNCmBgYHtyfQ0KQUlDKGR1ci5wb2lzLCBkdXIuZzEpDQpBSUMoZHVyLmcxLCBkdXIuZzIsIGR1ci5nMywgZHVyLmc0KQ0KDQphbm92YShkdXIuZzEsIGR1ci5nMywgZHVyLmc0KQ0KDQpBSUMoZHVyLmcxLCBkdXIuY2VuKQ0KYGBgDQoNCg0KIyMjIyBTdGVwIDMgLSBDaGVjayBtb2RlbCBmaXQNCg0KYGBge3J9DQpxcW5vcm0ocmVzaWQoZHVyLmczKSk7cXFsaW5lKHJlc2lkKGR1ci5nMykpDQoNCnFxbm9ybShyZXNpZChkdXIuZzEpKTtxcWxpbmUocmVzaWQoZHVyLmcxKSkgICAjIEkgYWxtb3N0IGZlZWwgbGlrZSB0aGlzIG9uZSBmaXRzIGJldHRlciANCg0KcXFub3JtKHJlc2lkKGR1ci5jZW4pKTtxcWxpbmUocmVzaWQoZHVyLmNlbikpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGR1ci5nMSkNCnN1bW1hcnkoZHVyLmczKQ0Kc3VtbWFyeShkdXIuY2VuKQ0KYGBgDQoNCmBgYHtyfQ0KZHJvcDEoZHVyLmNlbiwgdGVzdCA9ICJDaGlzcSIpDQoNCmR1ci5jZW4udXBkYXRlIDwtIHVwZGF0ZShkdXIuY2VuLCAufi4gLXFybykNCg0KYW5vdmEoZHVyLmNlbiwgZHVyLmNlbi51cGRhdGUpDQoNCkFJQyhkdXIuY2VuLCBkdXIuY2VuLnVwZGF0ZSkNCg0KZHJvcDEoZHVyLmNlbi51cGRhdGUsIHRlc3QgPSAiQ2hpc3EiKQ0KDQpkdXIuY2VuLnVwZGF0ZTEgPC0gdXBkYXRlKGR1ci5jZW4udXBkYXRlLCAufi4gLWFsaXZlKQ0KDQphbm92YShkdXIuY2VuLnVwZGF0ZSwgZHVyLmNlbi51cGRhdGUxKQ0KDQpBSUMoZHVyLmNlbi51cGRhdGUsIGR1ci5jZW4udXBkYXRlMSkNCg0KZHJvcDEoZHVyLmNlbi51cGRhdGUxLCB0ZXN0ID0gIkNoaXNxIikNCg0KcXFub3JtKHJlc2lkKGR1ci5jZW4udXBkYXRlMSkpO3FxbGluZShyZXNpZChkdXIuY2VuLnVwZGF0ZTEpKQ0KDQpBbm92YShkdXIuY2VuLnVwZGF0ZTEpDQoNCmBgYA0KDQoNCg0KDQojIyMjIFN0ZXAgNCAtIFJlc3VsdHMgDQoNCmBgYHtyfQ0KQW5vdmEoZHVyLmcxKQ0KQW5vdmEoZHVyLmczKQ0KDQojIEkgYW0gZ29pbmcgdG8ga2VlcCBtb2RlbCBkdXIuZzEuIEkgdGhpbmsgdGhhdCBzaW5jZSB3aG9sZS5tZWFuIGV4bGFpbnMgZGV2aWF0aW9uIGluIHRoZSBkYXRhIGZvciBib3RoIG1vZGVscywgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gaW5jbHVkZSB0cmVhdG1lbnQgYXMgb3VyIHByaW1hcnkgZXhwbGFuYXRvcnkgdmFyaWFibGUuIA0KYGBgDQoNCmBgYHtyfQ0KZW0uZHVyPC0gZW1tZWFucyhkdXIuZzEsICJ0cmVhdG1lbnQiKQ0KcGFpcnMoZW0uZHVyKQ0KcGxvdChlbS5kdXIsIGNvbXBhcmlzb25zID0gVFJVRSkNCg0KYGBgDQoNCmBgYHtyfQ0KZHVyLnN1bSA8LSBkdXJhdGlvbiAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKGNkdXIubSA9IG1lYW4oZHVyYXRpb24pLCANCiAgICAgICAgICAgIGR1ci5zZCA9IHNkKGR1cmF0aW9uKSwNCiAgICAgICAgICAgIGR1ci5uID0gbGVuZ3RoKGR1cmF0aW9uKSkgJT4lDQogIG11dGF0ZShzZWR1ciA9IGR1ci5zZC9zcXJ0KGR1ci5uKSkNCmR1ci5zdW0NCg0KZHVyLnN1bSA8LSBzZXREVChkdXIuc3VtKQ0KDQpkdXIuc3VtDQpgYGANCg0KDQojIyMjIFN0ZXAgNSAtIFZpc3VhbGl6ZQ0KDQpgYGB7cn0NCiAgICAgICAgDQpkdXJ0dWsubWVhbnMgPC0gZW1tZWFucyhvYmplY3QgPSBkdXIuZzEsDQogICAgICAgICAgICAgICAgICAgICAgICBzcGVjcyA9ICJ0cmVhdG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ID0gIlR1a2V5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQoNCmR1cnR1ay5tZWFucw0KDQpkdXIuY2xkLm1vZGVsIDwtIGNsZChvYmplY3QgPSBkdXJ0dWsubWVhbnMsDQogICAgICAgICAgICAgICAgICAgICBhZGp1c3QgPSAiVHVrZXkiLA0KICAgICAgICAgICAgICAgICAgICAgTGV0dGVycyA9IGxldHRlcnMsDQogICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuMDUpDQpkdXIuY2xkLm1vZGVsDQoNCmR1cnR1ay5tZWFucyA8LSBhcy5kYXRhLmZyYW1lKGR1cnR1ay5tZWFucykNCg0KZHVyX21heCA8LSBkdXJhdGlvbiAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXplKG1heGR1ciA9IG1heCgoZHVyYXRpb24pKSkNCg0KDQpkdXJfZm9yX3Bsb3R0aW5nIDwtIGZ1bGxfam9pbihkdXJ0dWsubWVhbnMsIGR1cl9tYXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieT0idHJlYXRtZW50IikNCg0KZHVyX2Zvcl9wbG90dGluZyRtYXhzZSA8LSBkdXJfZm9yX3Bsb3R0aW5nJHJlc3BvbnNlICsgZHVyX2Zvcl9wbG90dGluZyRTRQ0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLndpZHRoPSAxMiwgZmlnLmhlaWdodD0gMTB9DQpnZ3Bsb3QoZGF0YSA9IGR1ci5zdW0sIGFlcyh4ID0gdHJlYXRtZW50LCB5ID0gY2R1ci5tLCBmaWxsID0gdHJlYXRtZW50KSkgKw0KICBnZW9tX2NvbChjb2wgPSAiYmxhY2siKSsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW09YygzMCwgNTMpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsgDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjZHVyLm0tc2VkdXIsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gY2R1ci5tK3NlZHVyKSwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHdpZHRoID0gMC40KSArDQogIGxhYnMoeSA9ICJEYXlzIiwpICsNCiAgZ2d0aXRsZSgiQXZlcmFnZSBDb2xvbnkgRHVyYXRpb24gcGVyIFRyZWF0bWVudCIpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0gIlRyZWF0bWVudCIsIA0KICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAgUFBCIiwgIjE1MCBQUEIiLCAiMSw1MDAgUFBCIiwgIjE1LDAwMCBQUEIiLCAiMTUwLDAwMCBQUEIiKSkgKw0KICB0aGVtZV9jb3dwbG90KCkrDQogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMzApICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIA0KICAgICAgICAgIHggPSAxLCB5ID0gNTEuNSwNCiAgICAgICAgICBsYWJlbCA9ICJQIDwgMC4wNSIsDQogICAgICAgICAgc2l6ZSA9IDEyKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsDQogICAgICAgICAgIHggPSBjKDUsIDQsIDIsIDMsIDEpLA0KICAgICAgICAgICB5ID0gYyg0NS44LCA0MiwgNDQuMywgNDcuMywgNDguNiksDQogICAgICAgICAgIGxhYmVsID0gYygiYSIsICJhIiwgImFiIiwgImFiIiwgImIiKSwNCiAgICAgICAgICAgc2l6ZSA9IDEyKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICAibm9uZSIpDQoNCmR1cl9mb3JfcGxvdHRpbmcNCmBgYA0Kc3VtbWFyeSByZXN1bHRzIGR1cmF0aW9uDQoNCmBgYHtyfQ0KZHVyLmcxDQpkdXJhIDwtIHNldERUKGFzLmRhdGEuZnJhbWUoQW5vdmEoZHVyLmcxKSkpDQpkdXJhDQoNCmR1cmVtbSA8LSBlbW1lYW5zKGR1ci5nMSwgcGFpcndpc2UgfiB0cmVhdG1lbnQpDQpkdXJtZWFucyA8LSBzZXREVChhcy5kYXRhLmZyYW1lKGR1cmVtbSRjb250cmFzdHMpKQ0KZHVybWVhbnMNCg0KZHVyY29udCA8LSBzZXREVChhcy5kYXRhLmZyYW1lKGR1cmVtbSRlbW1lYW5zKSkNCmR1cmNvbnQNCmBgYA0KDQoNCg0KDQojIyMgRW1lcmdlbmNlIFRpbWUgLSBDZW5zb3JlZCBEYXRhDQoNCmBgYHtyfQ0KDQpicm9vZC5mb3IubWVyZ2UgPC0gc3Vic2V0KGJyb29kLCBzZWxlY3QgPSBjKGNvbG9ueSwgYnJvb2RfY2VsbHMsIGhvbmV5X3BvdCwgZWdncywgZGVhZF9sYXJ2YWUsIGxpdmVfbGFydmFlLCBkZWFkX3B1cGFlLCBsaXZlX3B1cGFlLCBkZWFkX2Ryb25lcywgbGl2ZV9kcm9uZXMsIGRyb25lcykpDQoNCm1lcmdlZF9kZiA8LSBtZXJnZSh0cnVuYywgYnJvb2QuZm9yLm1lcmdlLCBieSA9ICJjb2xvbnkiLCBhbGwgPSBUUlVFKQ0KDQplbWVyZ2UgPC0gc3Vic2V0KG1lcmdlZF9kZiwgc2VsZWN0ID0gYyhlbWVyZ2UsIHRyZWF0bWVudCwgd2hvbGUubWVhbiwgYWxpdmUsIHFybywgY29sb255LCBjb3VudCwgYnJvb2RfY2VsbHMsIGhvbmV5X3BvdCwgZWdncywgZGVhZF9sYXJ2YWUsIGxpdmVfbGFydmFlLCBkZWFkX3B1cGFlLCBsaXZlX3B1cGFlLCBkZWFkX2Ryb25lcywgbGl2ZV9kcm9uZXMsIGRyb25lcykpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChlbWVyZ2UsIGFlcyh4PWVtZXJnZSwgZmlsbCA9IHRyZWF0bWVudCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0ocG9zaXRpb24gPSAiaWRlbnRpdHkiLCBiaW53aWR0aCA9IDEgLGNvbD1JKCJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInBlYWNocHVmZjMiLCAiZGFya3NlYWdyZWVuIiwgImxpZ2h0c2VhZ3JlZW4iLCAiZGFya29saXZlZ3JlZW4zIiwgImRhcmtvbGl2ZWdyZWVuNCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlByaXN0aW5lIExldmVsIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVHJlYXRtZW50IDEgKGNvbnRyb2wpIiwgIlRyZWF0bWVudCAyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyZWF0bWVudCAzIiwgIlRyZWF0bWVudCA0IiwgIlRyZWF0bWVudCA1IikpICsNCiAgZ2d0aXRsZSgiRGF5cyBVbnRpbCBGaXJzdCBEcm9uZSBFbWVyZ2VkIikgKw0KICBsYWJzKHkgPSAiQ291bnQiLCB4ID0gIkRheXMiKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpsaWJyYXJ5KGNlbnNSZWcpDQoNCiMgQ3JlYXRlIGEgbmV3IHZhcmlhYmxlIGluZGljYXRpbmcgY2Vuc29yaW5nDQplbWVyZ2UkY2Vuc29yZWQgPC0gaWZlbHNlKGlzLm5hKGVtZXJnZSRlbWVyZ2UpLCAxLCAwKQ0KDQojIFNldCBjZW5zb3JpbmcgbGltaXRzDQplbWVyZ2UkbG93ZXJfbGltaXQgPC0gaWZlbHNlKGlzLm5hKGVtZXJnZSRlbWVyZ2UpLCAwLCBlbWVyZ2UkZW1lcmdlKQ0KZW1lcmdlJHVwcGVyX2xpbWl0IDwtIGlmZWxzZShpcy5uYShlbWVyZ2UkZW1lcmdlKSwgSW5mLCBlbWVyZ2UkZW1lcmdlKQ0KDQptb2RlbCA8LSBjZW5zUmVnKGxvd2VyX2xpbWl0IH4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIHFybyArIGFsaXZlLCBkYXRhID0gZW1lcmdlLCBsZWZ0ID0gMCwgcmlnaHQgPSBJbmYpDQoNCnN0YXJnYXplcihtb2RlbCwgdHlwZSA9ICJ0ZXh0IikgDQoNCm1vZDEgPC0gbG0obG93ZXJfbGltaXQgfiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgcXJvICsgYWxpdmUsIGRhdGEgPSBlbWVyZ2UpDQoNCnN0YXJnYXplcihtb2RlbCwgbW9kMSwgdHlwZSA9ICJ0ZXh0IikNCg0KQUlDKG1vZGVsKQ0KQUlDKG1vZDEpDQoNCg0KYGBgDQoNCg0KDQojIyMjIyMgRmlndXJlcyANCg0KYGBge3IsIGZpZy5oZWlnaHQ9IDIwLCBmaWcud2lkdGg9IDE0fQ0KbGlicmFyeShwYXRjaHdvcmspDQoNCg0KKGRwIC8gcmYpDQpgYGANCg0KDQojIyMjIEVtZXJnZW5jZSBUaW1lDQoNCmBgYHtyfQ0KZW1lcmdlMSA8LSBuYS5vbWl0KGVtZXJnZSkNCmBgYA0KDQoNCmBgYHtyfQ0KZW0ubW9kIDwtIGdsbShlbWVyZ2UgfiB0cmVhdG1lbnQgKyB3aG9sZS5tZWFuICsgcXJvICsgYWxpdmUsIGRhdGEgPSBlbWVyZ2UxLCBmYW1pbHkgPSAicXVhc2lwb2lzc29uIikNCmRyb3AxKGVtLm1vZCwgdGVzdCA9ICJGIikNCg0KZW0ubW9kMSA8LSBnbG0oZW1lcmdlIH4gdHJlYXRtZW50ICsgd2hvbGUubWVhbiArIGFsaXZlLCBkYXRhID0gZW1lcmdlMSwgZmFtaWx5ID0gInF1YXNpcG9pc3NvbiIpDQpkcm9wMShlbS5tb2QxLCB0ZXN0ID0gIkYiKQ0KDQplbS5tb2QyIDwtIGdsbShlbWVyZ2UgfiB0cmVhdG1lbnQqd2hvbGUubWVhbiArIHFybyArICBhbGl2ZSwgZGF0YSA9IGVtZXJnZTEsIGZhbWlseSA9ICJxdWFzaXBvaXNzb24iKQ0KZHJvcDEoZW0ubW9kMiwgdGVzdCA9ICJGIikNCg0Kc3VtbWFyeShlbS5tb2QpDQoNCkFub3ZhKGVtLm1vZDIpDQoNCmRlc2NkaXN0KGVtZXJnZTEkZW1lcmdlLCBkaXNjcmV0ZSA9IFRSVUUpDQoNCg0KZW1zdW0gPC0gZW1lcmdlMSAlPiUNCiAgZ3JvdXBfYnkodHJlYXRtZW50KSAlPiUNCiAgc3VtbWFyaXNlKGVtID0gbWVhbihlbWVyZ2UpKQ0KDQplbXN1bQ0KDQplbW1vZCA8LSBnbG0ubmIoZW1lcmdlIH4gdHJlYXRtZW50LCBkYXRhID0gZW1lcmdlKQ0KQW5vdmEoZW1tb2QpDQoNCmBgYA0KDQoNCg==