Hey et al. (2020) studied the effect of artificial light at night (ALAN) on the growth of a wildflower species (Asclepias syriaca) in an outdoor field experiment. The plant, a species of milkweed, is an important host plant for caterpillars of the monarch butterfly.

They used a split-plot design for their experiment. The between-plots factor was ALAN, with five plots receiving artificial light and five control plots with the same set-up but only receiving ambient light. The sub-plots were 11 L small pots and there were two within-plot factors arranged in a crossed design; planting density (one or three plants per pot) and soil moisture (weekly addition of water vs no watering). There were four pots in each plot, so each combination of density and moisture had a single pot; the design is unreplicated at the sub-plot level. The response variable was total biomass (root and shoot) per pant in each pot, averaged across the plants within the higher density pots.

Asclepias syriaca. Cbaile19, CC0, via Wikimedia Commons

The paper is here

Hey, M. H., DiBiase, E., Roach, D. A., Carr, D. E. & Haynes, K. J. (2020). Interactions between artificial light at night, soil moisture, and plant density affect the growth of a perennial wildflower. Oecologia, 193, 503-10.

Preliminaries

First, load the required packages (afex, car, lattice, lme4, lmerTest, nlme, VCA, ez, emmeans, Rmisc, MuMIn)

Import heymean data file (heymean.csv)

heymean <- read.csv("../data/heymean.csv")
heymean

Set contrasts from afex

Make plot a factor

set_sum_contrasts()
heymean$plot <- factor(heymean$plot)

Check residuals by leaving out error term

hey1.aov <- aov(dwtotal~light*density*water, heymean)
plot(hey1.aov)

See if transformation improves the residuals

hey2.aov <- aov(log10(dwtotal)~light*density*water, heymean)
plot(hey2.aov)

Some improvement in plot; outliers still present but transform response

Note Biomass is always positive, so we don’t really need to add anything before transforming. Hey et al. used a log(x+1) transformation, so we’ll do the same here for consistency. As an exercise, you could modify the next line of code to remove the +1 and rerun the model-fitting to see how much difference there is.

heymean$ldwtotal <- log10(heymean$dwtotal+1)

Fit factorial split-plot with separate within-plot error terms

hey3.aov <- aov(ldwtotal~light*density*water+Error(plot/(density*water)), heymean)
summary(hey3.aov)

Error: plot
          Df Sum Sq Mean Sq F value Pr(>F)
light      1 0.0121  0.0121    0.33   0.58
Residuals  8 0.2925  0.0366               

Error: plot:density
              Df Sum Sq Mean Sq F value Pr(>F)
density        1 0.0021 0.00212    0.21   0.66
light:density  1 0.0017 0.00172    0.17   0.69
Residuals      8 0.0820 0.01025               

Error: plot:water
            Df Sum Sq Mean Sq F value Pr(>F)  
water        1 0.0386  0.0386    4.38   0.07 .
light:water  1 0.0258  0.0258    2.93   0.13  
Residuals    8 0.0704  0.0088                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Error: plot:density:water
                    Df Sum Sq Mean Sq F value Pr(>F)
density:water        1 0.0029 0.00289    0.29   0.60
light:density:water  1 0.0211 0.02112    2.12   0.18
Residuals            8 0.0796 0.00995               

Fit equivalent mixed effects model

hey1.lmer <- lmer(ldwtotal~light+density+water+light*density+light*water+density*water+light*density*water+(1|plot)+(1|plot:density)+(1|plot:water), REML=TRUE, heymean)
boundary (singular) fit: see help('isSingular')
plot(hey1.lmer)

residuals OK

summary(hey1.lmer, ddf="Kenward-Roger")
Linear mixed model fit by REML. t-tests use Kenward-Roger's method ['lmerModLmerTest']
Formula: ldwtotal ~ light + density + water + light * density + light *      water + density * water + light * density * water + (1 |      plot) + (1 | plot:density) + (1 | plot:water)
   Data: heymean

REML criterion at convergence: -17.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9570 -0.5011  0.0056  0.2921  2.4266 

Random effects:
 Groups       Name        Variance Std.Dev.
 plot:water   (Intercept) 0.000000 0.0000  
 plot:density (Intercept) 0.000436 0.0209  
 plot         (Intercept) 0.006579 0.0811  
 Residual                 0.009376 0.0968  
Number of obs: 40, groups:  plot:water, 20; plot:density, 20; plot, 10

Fixed effects:
                       Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)             0.25082    0.03023  8.00000    8.30  3.4e-05 ***
light1                 -0.01736    0.03023  8.00000   -0.57    0.582    
density1                0.00728    0.01601  8.00000    0.45    0.661    
water1                 -0.03105    0.01531  8.00000   -2.03    0.077 .  
light1:density1         0.00655    0.01601  8.00000    0.41    0.693    
light1:water1          -0.02539    0.01531  8.00000   -1.66    0.136    
density1:water1         0.00850    0.01531  8.00000    0.56    0.594    
light1:density1:water1  0.02298    0.01531  8.00000    1.50    0.172    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) light1 dnsty1 water1 lght1:d1 lght1:w1 dns1:1
light1      0.000                                               
density1    0.000  0.000                                        
water1      0.000  0.000  0.000                                 
lght1:dnst1 0.000  0.000  0.000  0.000                          
light1:wtr1 0.000  0.000  0.000  0.000  0.000                   
dnsty1:wtr1 0.000  0.000  0.000  0.000  0.000    0.000          
lght1:dn1:1 0.000  0.000  0.000  0.000  0.000    0.000    0.000 
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
anova(hey1.lmer, ddf="Kenward-Roger")
Type III Analysis of Variance Table with Kenward-Roger's method
                    Sum Sq Mean Sq NumDF DenDF F value Pr(>F)  
light               0.0031  0.0031     1     8    0.33  0.582  
density             0.0019  0.0019     1     8    0.21  0.661  
water               0.0386  0.0386     1     8    4.11  0.077 .
light:density       0.0016  0.0016     1     8    0.17  0.693  
light:water         0.0258  0.0258     1     8    2.75  0.136  
density:water       0.0029  0.0029     1     8    0.31  0.594  
light:density:water 0.0211  0.0211     1     8    2.25  0.172  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Get variance components

hey1.ci <- confint.merMod(hey1.lmer, oldNames=FALSE)
Computing profile confidence intervals ...
Warning: Last two rows have identical or NA .zeta values: using minstepWarning: Last two rows have identical or NA .zeta values: using minstepWarning: non-monotonic profile for sd_(Intercept)|plot:waterWarning: bad spline fit for sd_(Intercept)|plot:water: falling back to linear interpolationWarning: collapsing to unique 'x' values
hey1.vc <- (hey1.ci)^2
print(hey1.vc)
                               2.5 %   97.5 %
sd_(Intercept)|plot:water   0.00e+00 6.34e-03
sd_(Intercept)|plot:density 0.00e+00 6.91e-03
sd_(Intercept)|plot         3.08e-04 1.84e-02
sigma                       4.37e-03 1.33e-02
(Intercept)                 3.71e-02 9.56e-02
light1                      5.73e-03 1.68e-03
density1                    5.62e-04 1.46e-03
water1                      3.49e-03 9.04e-06
light1:density1             5.97e-04 1.41e-03
light1:water1               2.86e-03 7.03e-06
density1:water1             3.82e-04 1.34e-03
light1:density1:water1      2.57e-05 2.60e-03

Compare this model to model with no plot by density and moisture interactions

hey1a.lmer <- lmer(ldwtotal~light+density+water+light*density+light*water+density*water+light*density*water+(1|plot)+(1|plot:density)+(1|plot:water), REML=FALSE, heymean)
boundary (singular) fit: see help('isSingular')
hey2.lmer <- lmer(ldwtotal~light*density*water+(1|plot), REML=FALSE, heymean)
anova(hey1a.lmer, hey2.lmer)
Data: heymean
Models:
hey2.lmer: ldwtotal ~ light * density * water + (1 | plot)
hey1a.lmer: ldwtotal ~ light + density + water + light * density + light * water + density * water + light * density * water + (1 | plot) + (1 | plot:density) + (1 | plot:water)
           npar   AIC   BIC logLik deviance Chisq Df Pr(>Chisq)
hey2.lmer    10 -47.7 -30.8   33.8    -67.7                    
hey1a.lmer   12 -43.7 -23.4   33.8    -67.7  0.03  2       0.99
AICc(hey1a.lmer, hey2.lmer)

Simpler model fits equally well

hey2a.lmer <- lmer(ldwtotal~light*density*water+(1|plot), REML=TRUE, heymean)
summary(hey2a.lmer, ddf="Kenward-Roger")
Linear mixed model fit by REML. t-tests use Kenward-Roger's method ['lmerModLmerTest']
Formula: ldwtotal ~ light * density * water + (1 | plot)
   Data: heymean

REML criterion at convergence: -17.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0042 -0.4504 -0.0212  0.2962  2.4499 

Random effects:
 Groups   Name        Variance Std.Dev.
 plot     (Intercept) 0.00672  0.0820  
 Residual             0.00967  0.0983  
Number of obs: 40, groups:  plot, 10

Fixed effects:
                       Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)             0.25082    0.03023  8.00000    8.30  3.4e-05 ***
light1                 -0.01736    0.03023  8.00000   -0.57    0.582    
density1                0.00728    0.01555 24.00000    0.47    0.644    
water1                 -0.03105    0.01555 24.00000   -2.00    0.057 .  
light1:density1         0.00655    0.01555 24.00000    0.42    0.677    
light1:water1          -0.02539    0.01555 24.00000   -1.63    0.115    
density1:water1         0.00850    0.01555 24.00000    0.55    0.590    
light1:density1:water1  0.02298    0.01555 24.00000    1.48    0.152    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) light1 dnsty1 water1 lght1:d1 lght1:w1 dns1:1
light1      0.000                                               
density1    0.000  0.000                                        
water1      0.000  0.000  0.000                                 
lght1:dnst1 0.000  0.000  0.000  0.000                          
light1:wtr1 0.000  0.000  0.000  0.000  0.000                   
dnsty1:wtr1 0.000  0.000  0.000  0.000  0.000    0.000          
lght1:dn1:1 0.000  0.000  0.000  0.000  0.000    0.000    0.000 
anova(hey2a.lmer, ddf="Kenward-Roger")
Type III Analysis of Variance Table with Kenward-Roger's method
                    Sum Sq Mean Sq NumDF DenDF F value Pr(>F)  
light               0.0032  0.0032     1     8    0.33  0.582  
density             0.0021  0.0021     1    24    0.22  0.644  
water               0.0386  0.0386     1    24    3.99  0.057 .
light:density       0.0017  0.0017     1    24    0.18  0.677  
light:water         0.0258  0.0258     1    24    2.67  0.115  
density:water       0.0029  0.0029     1    24    0.30  0.590  
light:density:water 0.0211  0.0211     1    24    2.18  0.152  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Compare to factorial OLS split-plot pooling within-plot error terms

Same as above for fixed effects

hey4.aov <- aov(ldwtotal~light*density*water+Error(plot), heymean)
summary(hey4.aov)

Error: plot
          Df Sum Sq Mean Sq F value Pr(>F)
light      1 0.0121  0.0121    0.33   0.58
Residuals  8 0.2925  0.0366               

Error: Within
                    Df Sum Sq Mean Sq F value Pr(>F)  
density              1 0.0021  0.0021    0.22  0.644  
water                1 0.0386  0.0386    3.99  0.057 .
light:density        1 0.0017  0.0017    0.18  0.677  
light:water          1 0.0258  0.0258    2.67  0.115  
density:water        1 0.0029  0.0029    0.30  0.590  
light:density:water  1 0.0211  0.0211    2.18  0.152  
Residuals           24 0.2320  0.0097                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
LS0tCnRpdGxlOiAiUUsgQm94IDExLjUiCm91dHB1dDoKICBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpIZXkgZXQgYWwuICgyMDIwKSBzdHVkaWVkIHRoZSBlZmZlY3Qgb2YgYXJ0aWZpY2lhbCBsaWdodCBhdCBuaWdodCAoQUxBTikgb24gdGhlIGdyb3d0aCBvZiBhIHdpbGRmbG93ZXIgc3BlY2llcyAoKkFzY2xlcGlhcyBzeXJpYWNhKikgaW4gYW4gb3V0ZG9vciBmaWVsZCBleHBlcmltZW50LiBUaGUgcGxhbnQsIGEgc3BlY2llcyBvZiBtaWxrd2VlZCwgaXMgYW4gaW1wb3J0YW50IGhvc3QgcGxhbnQgZm9yIGNhdGVycGlsbGFycyBvZiB0aGUgbW9uYXJjaCBidXR0ZXJmbHkuCgpUaGV5IHVzZWQgYSBzcGxpdC1wbG90IGRlc2lnbiBmb3IgdGhlaXIgZXhwZXJpbWVudC4gVGhlIGJldHdlZW4tcGxvdHMgZmFjdG9yIHdhcyBBTEFOLCB3aXRoIGZpdmUgcGxvdHMgcmVjZWl2aW5nIGFydGlmaWNpYWwgbGlnaHQgYW5kIGZpdmUgY29udHJvbCBwbG90cyB3aXRoIHRoZSBzYW1lIHNldC11cCBidXQgb25seSByZWNlaXZpbmcgYW1iaWVudCBsaWdodC4gVGhlIHN1Yi1wbG90cyB3ZXJlIDExIEwgc21hbGwgcG90cyBhbmQgdGhlcmUgd2VyZSB0d28gd2l0aGluLXBsb3QgZmFjdG9ycyBhcnJhbmdlZCBpbiBhIGNyb3NzZWQgZGVzaWduOyBwbGFudGluZyBkZW5zaXR5IChvbmUgb3IgdGhyZWUgcGxhbnRzIHBlciBwb3QpIGFuZCBzb2lsIG1vaXN0dXJlICh3ZWVrbHkgYWRkaXRpb24gb2Ygd2F0ZXIgdnMgbm8gd2F0ZXJpbmcpLiBUaGVyZSB3ZXJlIGZvdXIgcG90cyBpbiBlYWNoIHBsb3QsIHNvIGVhY2ggY29tYmluYXRpb24gb2YgZGVuc2l0eSBhbmQgbW9pc3R1cmUgaGFkIGEgc2luZ2xlIHBvdDsgdGhlIGRlc2lnbiBpcyB1bnJlcGxpY2F0ZWQgYXQgdGhlIHN1Yi1wbG90IGxldmVsLiBUaGUgcmVzcG9uc2UgdmFyaWFibGUgd2FzIHRvdGFsIGJpb21hc3MgKHJvb3QgYW5kIHNob290KSBwZXIgcGFudCBpbiBlYWNoIHBvdCwgYXZlcmFnZWQgYWNyb3NzIHRoZSBwbGFudHMgd2l0aGluIHRoZSBoaWdoZXIgZGVuc2l0eSBwb3RzLgoKWyFbXShpbWFnZXMvQXNjbGVwaWFzX3N5cmlhY2EsXzIwMjEtMDctMDQsX0JldGhlbF9QYXJrLF8wMi5qcGcpe3dpZHRoPSI4MDAifV0oaHR0cHM6Ly9jb21tb25zLndpa2ltZWRpYS5vcmcvd2lraS9GaWxlOkFzY2xlcGlhc19zeXJpYWNhLF8yMDIxLTA3LTA0LF9CZXRoZWxfUGFyayxfMDIuanBnKQoKKkFzY2xlcGlhcyBzeXJpYWNhKi4gQ2JhaWxlMTksIENDMCwgdmlhIFdpa2ltZWRpYSBDb21tb25zCgpUaGUgcGFwZXIgaXMgW2hlcmVdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L3MwMDQ0Mi0wMjAtMDQ2NzktOSkKCkhleSwgTS4gSC4sIERpQmlhc2UsIEUuLCBSb2FjaCwgRC4gQS4sIENhcnIsIEQuIEUuICYgSGF5bmVzLCBLLiBKLiAoMjAyMCkuIEludGVyYWN0aW9ucyBiZXR3ZWVuIGFydGlmaWNpYWwgbGlnaHQgYXQgbmlnaHQsIHNvaWwgbW9pc3R1cmUsIGFuZCBwbGFudCBkZW5zaXR5IGFmZmVjdCB0aGUgZ3Jvd3RoIG9mIGEgcGVyZW5uaWFsIHdpbGRmbG93ZXIuICpPZWNvbG9naWEqLCAxOTMsIDUwMy0xMC4KCiMjIyBQcmVsaW1pbmFyaWVzCgpGaXJzdCwgbG9hZCB0aGUgcmVxdWlyZWQgcGFja2FnZXMgKGFmZXgsIGNhciwgbGF0dGljZSwgbG1lNCwgbG1lclRlc3QsIG5sbWUsIFZDQSwgZXosIGVtbWVhbnMsIFJtaXNjLCBNdU1JbikKCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQpzb3VyY2UoIi4uL1IvbGlicmFyaWVzLlIiKSAgICNUaGlzIGlzIHRoZSBjb21tb24gbGlicmFyeQpgYGAKCkltcG9ydCBoZXltZWFuIGRhdGEgZmlsZSAoW2hleW1lYW4uY3N2XSguLi9kYXRhL2hleW1lYW4uY3N2KSkKCmBgYHtyfQpoZXltZWFuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2hleW1lYW4uY3N2IikKaGV5bWVhbgpgYGAKClNldCBjb250cmFzdHMgZnJvbSBhZmV4CgpNYWtlIHBsb3QgYSBmYWN0b3IKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQpzZXRfc3VtX2NvbnRyYXN0cygpCmhleW1lYW4kcGxvdCA8LSBmYWN0b3IoaGV5bWVhbiRwbG90KQpgYGAKCkNoZWNrIHJlc2lkdWFscyBieSBsZWF2aW5nIG91dCBlcnJvciB0ZXJtCgpgYGB7ciB9CmhleTEuYW92IDwtIGFvdihkd3RvdGFsfmxpZ2h0KmRlbnNpdHkqd2F0ZXIsIGhleW1lYW4pCnBsb3QoaGV5MS5hb3YpCmBgYAoKU2VlIGlmIHRyYW5zZm9ybWF0aW9uIGltcHJvdmVzIHRoZSByZXNpZHVhbHMKCmBgYHtyIH0KaGV5Mi5hb3YgPC0gYW92KGxvZzEwKGR3dG90YWwpfmxpZ2h0KmRlbnNpdHkqd2F0ZXIsIGhleW1lYW4pCnBsb3QoaGV5Mi5hb3YpCmBgYAoKU29tZSBpbXByb3ZlbWVudCBpbiBwbG90OyBvdXRsaWVycyBzdGlsbCBwcmVzZW50IGJ1dCB0cmFuc2Zvcm0gcmVzcG9uc2UKCioqTm90ZSoqIEJpb21hc3MgaXMgYWx3YXlzIHBvc2l0aXZlLCBzbyB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byBhZGQgYW55dGhpbmcgYmVmb3JlIHRyYW5zZm9ybWluZy4gSGV5IGV0IGFsLiB1c2VkIGEgbG9nKHgrMSkgdHJhbnNmb3JtYXRpb24sIHNvIHdlJ2xsIGRvIHRoZSBzYW1lIGhlcmUgZm9yIGNvbnNpc3RlbmN5LiBBcyBhbiBleGVyY2lzZSwgeW91IGNvdWxkIG1vZGlmeSB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgdG8gcmVtb3ZlIHRoZSArMSBhbmQgcmVydW4gdGhlIG1vZGVsLWZpdHRpbmcgdG8gc2VlIGhvdyBtdWNoIGRpZmZlcmVuY2UgdGhlcmUgaXMuCgpgYGB7ciB9CmhleW1lYW4kbGR3dG90YWwgPC0gbG9nMTAoaGV5bWVhbiRkd3RvdGFsKzEpCmBgYAoKIyMgRml0IGZhY3RvcmlhbCBzcGxpdC1wbG90IHdpdGggc2VwYXJhdGUgd2l0aGluLXBsb3QgZXJyb3IgdGVybXMKCmBgYHtyIH0KaGV5My5hb3YgPC0gYW92KGxkd3RvdGFsfmxpZ2h0KmRlbnNpdHkqd2F0ZXIrRXJyb3IocGxvdC8oZGVuc2l0eSp3YXRlcikpLCBoZXltZWFuKQpzdW1tYXJ5KGhleTMuYW92KQpgYGAKCiMjIEZpdCBlcXVpdmFsZW50IG1peGVkIGVmZmVjdHMgbW9kZWwKCmBgYHtyIH0KaGV5MS5sbWVyIDwtIGxtZXIobGR3dG90YWx+bGlnaHQrZGVuc2l0eSt3YXRlcitsaWdodCpkZW5zaXR5K2xpZ2h0KndhdGVyK2RlbnNpdHkqd2F0ZXIrbGlnaHQqZGVuc2l0eSp3YXRlcisoMXxwbG90KSsoMXxwbG90OmRlbnNpdHkpKygxfHBsb3Q6d2F0ZXIpLCBSRU1MPVRSVUUsIGhleW1lYW4pCnBsb3QoaGV5MS5sbWVyKQpgYGAKCnJlc2lkdWFscyBPSwoKYGBge3IgfQpzdW1tYXJ5KGhleTEubG1lciwgZGRmPSJLZW53YXJkLVJvZ2VyIikKYW5vdmEoaGV5MS5sbWVyLCBkZGY9IktlbndhcmQtUm9nZXIiKQpgYGAKCiMjIyBHZXQgdmFyaWFuY2UgY29tcG9uZW50cwoKYGBge3IgfQpoZXkxLmNpIDwtIGNvbmZpbnQubWVyTW9kKGhleTEubG1lciwgb2xkTmFtZXM9RkFMU0UpCmhleTEudmMgPC0gKGhleTEuY2kpXjIKcHJpbnQoaGV5MS52YykKYGBgCgojIyMgQ29tcGFyZSB0aGlzIG1vZGVsIHRvIG1vZGVsIHdpdGggbm8gcGxvdCBieSBkZW5zaXR5IGFuZCBtb2lzdHVyZSBpbnRlcmFjdGlvbnMKCmBgYHtyIH0KaGV5MWEubG1lciA8LSBsbWVyKGxkd3RvdGFsfmxpZ2h0K2RlbnNpdHkrd2F0ZXIrbGlnaHQqZGVuc2l0eStsaWdodCp3YXRlcitkZW5zaXR5KndhdGVyK2xpZ2h0KmRlbnNpdHkqd2F0ZXIrKDF8cGxvdCkrKDF8cGxvdDpkZW5zaXR5KSsoMXxwbG90OndhdGVyKSwgUkVNTD1GQUxTRSwgaGV5bWVhbikKaGV5Mi5sbWVyIDwtIGxtZXIobGR3dG90YWx+bGlnaHQqZGVuc2l0eSp3YXRlcisoMXxwbG90KSwgUkVNTD1GQUxTRSwgaGV5bWVhbikKYW5vdmEoaGV5MWEubG1lciwgaGV5Mi5sbWVyKQpBSUNjKGhleTFhLmxtZXIsIGhleTIubG1lcikKYGBgCgpTaW1wbGVyIG1vZGVsIGZpdHMgZXF1YWxseSB3ZWxsCgpgYGB7ciB9CmhleTJhLmxtZXIgPC0gbG1lcihsZHd0b3RhbH5saWdodCpkZW5zaXR5KndhdGVyKygxfHBsb3QpLCBSRU1MPVRSVUUsIGhleW1lYW4pCnN1bW1hcnkoaGV5MmEubG1lciwgZGRmPSJLZW53YXJkLVJvZ2VyIikKYW5vdmEoaGV5MmEubG1lciwgZGRmPSJLZW53YXJkLVJvZ2VyIikKYGBgCgojIyMgQ29tcGFyZSB0byBmYWN0b3JpYWwgT0xTIHNwbGl0LXBsb3QgcG9vbGluZyB3aXRoaW4tcGxvdCBlcnJvciB0ZXJtcwoKU2FtZSBhcyBhYm92ZSBmb3IgZml4ZWQgZWZmZWN0cwoKYGBge3IgfQpoZXk0LmFvdiA8LSBhb3YobGR3dG90YWx+bGlnaHQqZGVuc2l0eSp3YXRlcitFcnJvcihwbG90KSwgaGV5bWVhbikKc3VtbWFyeShoZXk0LmFvdikKYGBgCg==