This document contains the R workflow for processing and analysing the raw data, and generating figures for the manuscript titled “Developmental plasticity to pond drying has carry-over costs on metamorph performance”.

GitHub Repository: The Rmarkdown file can be downloaded from the Code drop down menu (top right).

Data

Load both tadpole and metamorph data from the GitHub repository.

# Load raw data and clean
larva_dat <- read.csv("https://raw.githubusercontent.com/nicholaswunz/tadpole-pond-drying/master/data/larvae_data.csv",
    na.strings = c("", "NA"), stringsAsFactors = TRUE)

metamorph_dat <- read.csv("https://raw.githubusercontent.com/nicholaswunz/tadpole-pond-drying/master/data/metamorph_data.csv",
    na.strings = c("", "NA"), stringsAsFactors = TRUE)

Data summary

Table S1a

Table S1. Mean ± standard deviation (s.d.) of the tadpole total length recorded by treatment group.

Group Water depth (cm) Days Total length ± s.d. (cm) n
T1 0.25 1 0.80±0.07 11
T1 0.25 8 1.07±0.20 11
T1 0.25 15 1.45±0.31 11
T1 0.25 21 1.87±0.34 11
T1 0.25 28 2.32±0.32 11
T2 0.5 1 0.83±0.08 12
T2 0.5 8 1.18±0.11 12
T2 0.5 15 1.75±0.37 12
T2 0.5 21 2.13±0.38 12
T2 0.5 28 2.47±0.34 9
T3 1 1 0.82±0.10 12
T3 1 8 1.47±0.17 12
T3 1 15 2.02±0.15 12
T3 1 21 2.60±0.19 12
T3 1 28 2.45±NA 1
T4 2 1 0.80±0.04 11
T4 2 8 1.61±0.33 11
T4 2 15 2.11±0.26 11
T4 2 21 2.68±0.38 11
T4 2 28 3.26±0.04 3
T5 2-0.25 1 0.82±0.06 12
T5 2-0.25 8 1.56±0.18 12
T5 2-0.25 15 2.18±0.36 12
T5 2-0.25 21 2.52±0.20 12
T5 2-0.25 28 2.61±NA 1

Table S1b

Table S1. Mean ± standard deviation (s.d.) of the growth rate (cm d-1), larval period (days), size at metamorph (cm), and maximum jumping distance (cm) by treatment group.

Group Water depth (cm) Growth rate (cm d\(^{-1}\)) Larval period (d) Metamorph size (cm) Jumping distance (cm) n
T1 0.25 0.05±0.02 43±6.60 0.80±0.12 7.61±1.19 11
T2 0.5 0.06±0.02 39±4.14 0.89±0.14 7.69±1.02 12
T3 1 0.08±0.01 32.5±3.79 1.13±0.15 8.82±1.03 12
T4 2 0.09±0.02 37±3.99 1.13±0.18 9.06±0.78 11
T5 2-0.25 0.08±0.01 32±2.60 1.05±0.11 8.01±0.43 12

Analysis

Run linear mixed effects model (individual ID as random effect) for total length across different water depth using the lmer function from the lme4 package. Run linear model for growth rate, larval period, metamorph size, and metamorph maximum jumping distance across different water depth treatments using lm function.

# linear mixed effects model
length_mod <- lme4::lmer(length_cm ~ days * water_depth + (1 | ID), data = larva_dat)

# linear effects model
growth_mod <- lm(growth_rate_cm_d ~ water_depth, data = metamorph_dat)
period_mod <- lm(larval_period_d ~ water_depth, data = metamorph_dat)
size_mod <- lm(metamorph_size_cm ~ water_depth, data = metamorph_dat)
jump_mod <- lm(jump_dist_cm ~ water_depth, data = metamorph_dat)

Model output

Table S2

Table S2. Summary statistics from linear mixed effects model comparing the regression slope for larval total length (cm) across days of exposure, with water depth treatment as an interactive effect, and frog ID as random effect. emmean = estimated marginal means, s.e. = standard error, df = degrees of freedom, lower.CI = lower 2.5% confident interval, and upper.CI = lower 97.5% confident interval. Pairwise comparison between all treatment groups. p.value = P value with \(\alpha\) set at 0.05. Degrees-of-freedom method: kenward-roger, P value adjustment: tukey method for comparing a family of 5 estimates.

## Linear mixed model fit by REML ['lmerMod']
## Formula: length_cm ~ days * water_depth + (1 | ID)
##    Data: larva_dat
## 
## REML criterion at convergence: 46.2
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.5622 -0.5932 -0.0077  0.6185  2.5084 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  ID       (Intercept) 0.0235   0.153   
##  Residual             0.0424   0.206   
## Number of obs: 257, groups:  ID, 58
## 
## Fixed effects:
##                        Estimate Std. Error t value
## (Intercept)             0.67186    0.06877    9.77
## days                    0.05698    0.00293   19.46
## water_depth0.5          0.06550    0.09556    0.69
## water_depth1            0.09809    0.09734    1.01
## water_depth2            0.11133    0.09877    1.13
## water_depth2-0.25       0.15311    0.09734    1.57
## days:water_depth0.5     0.00735    0.00418    1.76
## days:water_depth1       0.02742    0.00480    5.72
## days:water_depth2       0.03282    0.00468    7.01
## days:water_depth2-0.25  0.02642    0.00480    5.51
## 
## Correlation of Fixed Effects:
##             (Intr) days   wt_0.5 wtr_d1 wtr_d2 w_2-0. d:_0.5 dys:_1 dys:_2
## days        -0.622                                                        
## wtr_dpth0.5 -0.720  0.447                                                 
## water_dpth1 -0.707  0.439  0.508                                          
## water_dpth2 -0.696  0.433  0.501  0.492                                   
## wtr_d2-0.25 -0.707  0.439  0.508  0.499  0.492                            
## dys:wtr_0.5  0.435 -0.700 -0.621 -0.307 -0.303 -0.307                     
## dys:wtr_dp1  0.379 -0.610 -0.273 -0.625 -0.264 -0.268  0.427              
## dys:wtr_dp2  0.389 -0.626 -0.280 -0.275 -0.623 -0.275  0.438  0.382       
## dys:_2-0.25  0.379 -0.610 -0.273 -0.268 -0.264 -0.625  0.427  0.373  0.382
days water_depth emmean SE df lower.CL upper.CL
12.9 0.25 1.41 0.054 50.2 1.30 1.51
12.9 0.5 1.57 0.052 51.1 1.46 1.67
12.9 1 1.86 0.053 56.4 1.75 1.96
12.9 2 1.94 0.055 54.2 1.83 2.05
12.9 2-0.25 1.90 0.053 56.4 1.79 2.01
contrast estimate SE df t.ratio p.value
0.25 - 0.5 -0.007 0.004 195 -1.757 0.402
0.25 - 1 -0.027 0.005 195 -5.717 0.000
0.25 - 2 -0.033 0.005 196 -7.012 0.000
0.25 - (2-0.25) -0.026 0.005 195 -5.509 0.000
0.5 - 1 -0.020 0.005 196 -4.153 0.000
0.5 - 2 -0.025 0.005 197 -5.399 0.000
0.5 - (2-0.25) -0.019 0.005 196 -3.947 0.001
1 - 2 -0.005 0.005 197 -1.025 0.844
1 - (2-0.25) 0.001 0.005 196 0.185 1.000
2 - (2-0.25) 0.006 0.005 197 1.214 0.743

Fig. S1

Fig. S1. Model output.

Table S3

Table S3. Summary statistics from linear model for growth rate (cm dˉ¹) between water depth treatments. emmean = estimated marginal means, s.e. = standard error, df = degrees of freedom, lower.CI = lower 2.5% confident interval, and upper.CI = lower 97.5% confident interval. Pairwise comparison between all treatment groups. p.value = P value with \(\alpha\) set at 0.05. P value adjustment: tukey method for comparing a family of 5 estimates.

## 
## Call:
## lm(formula = growth_rate_cm_d ~ water_depth, data = metamorph_dat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.03319 -0.00826  0.00207  0.01078  0.03220 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        0.05087    0.00469   10.86  4.4e-15 ***
## water_depth0.5     0.01117    0.00649    1.72    0.091 .  
## water_depth1       0.03367    0.00649    5.19  3.4e-06 ***
## water_depth2       0.03864    0.00663    5.83  3.4e-07 ***
## water_depth2-0.25  0.03005    0.00649    4.63  2.4e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.0155 on 53 degrees of freedom
## Multiple R-squared:  0.487,  Adjusted R-squared:  0.448 
## F-statistic: 12.6 on 4 and 53 DF,  p-value: 2.9e-07
water_depth emmean SE df lower.CL upper.CL
0.25 0.051 0.005 53 0.041 0.060
0.5 0.062 0.004 53 0.053 0.071
1 0.085 0.004 53 0.076 0.094
2 0.090 0.005 53 0.080 0.099
2-0.25 0.081 0.004 53 0.072 0.090
contrast estimate SE df t.ratio p.value
0.25 - 0.5 -0.011 0.006 53 -1.722 0.429
0.25 - 1 -0.034 0.006 53 -5.191 0.000
0.25 - 2 -0.039 0.007 53 -5.831 0.000
0.25 - (2-0.25) -0.030 0.006 53 -4.632 0.000
0.5 - 1 -0.023 0.006 53 -3.546 0.007
0.5 - 2 -0.027 0.006 53 -4.234 0.001
0.5 - (2-0.25) -0.019 0.006 53 -2.975 0.034
1 - 2 -0.005 0.006 53 -0.766 0.939
1 - (2-0.25) 0.004 0.006 53 0.571 0.979
2 - (2-0.25) 0.009 0.006 53 1.324 0.678

Table S4

Table S4. Summary statistics from linear model for larval period (days) between water depth treatments. emmean = estimated marginal means, s.e. = standard error, df = degrees of freedom, lower.CI = lower 2.5% confident interval, and upper.CI = lower 97.5% confident interval. Pairwise comparison between all treatment groups. p.value = P value with \(\alpha\) set at 0.05. P value adjustment: tukey method for comparing a family of 5 estimates.

## 
## Call:
## lm(formula = larval_period_d ~ water_depth, data = metamorph_dat)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -11.00  -1.92   0.25   2.09   9.08 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          41.00       1.32   31.05  < 2e-16 ***
## water_depth0.5       -3.08       1.83   -1.69    0.098 .  
## water_depth1         -8.25       1.83   -4.51  3.6e-05 ***
## water_depth2         -4.09       1.87   -2.19    0.033 *  
## water_depth2-0.25    -9.25       1.83   -5.06  5.4e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.38 on 53 degrees of freedom
## Multiple R-squared:  0.398,  Adjusted R-squared:  0.352 
## F-statistic: 8.76 on 4 and 53 DF,  p-value: 1.67e-05
water_depth emmean SE df lower.CL upper.CL
0.25 41.0 1.32 53 38.4 43.6
0.5 37.9 1.26 53 35.4 40.5
1 32.8 1.26 53 30.2 35.3
2 36.9 1.32 53 34.3 39.6
2-0.25 31.8 1.26 53 29.2 34.3
contrast estimate SE df t.ratio p.value
0.25 - 0.5 3.08 1.83 53 1.687 0.451
0.25 - 1 8.25 1.83 53 4.513 0.000
0.25 - 2 4.09 1.87 53 2.191 0.199
0.25 - (2-0.25) 9.25 1.83 53 5.060 0.000
0.5 - 1 5.17 1.79 53 2.890 0.042
0.5 - 2 1.01 1.83 53 0.551 0.981
0.5 - (2-0.25) 6.17 1.79 53 3.449 0.009
1 - 2 -4.16 1.83 53 -2.275 0.169
1 - (2-0.25) 1.00 1.79 53 0.559 0.980
2 - (2-0.25) 5.16 1.83 53 2.822 0.050

Table S5

Table S5. Summary statistics from linear model for metamorph size (cm) between water depth treatments. emmean = estimated marginal means, s.e. = standard error, df = degrees of freedom, lower.CI = lower 2.5% confident interval, and upper.CI = lower 97.5% confident interval. Pairwise comparison between all treatment groups. p.value = P value with \(\alpha\) set at 0.05. P value adjustment: tukey method for comparing a family of 5 estimates.

## 
## Call:
## lm(formula = metamorph_size_cm ~ water_depth, data = metamorph_dat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.2793 -0.1045  0.0033  0.0915  0.3815 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         0.8030     0.0428   18.75  < 2e-16 ***
## water_depth0.5      0.0894     0.0593    1.51   0.1375    
## water_depth1        0.3295     0.0593    5.56  9.1e-07 ***
## water_depth2        0.3227     0.0606    5.33  2.1e-06 ***
## water_depth2-0.25   0.2487     0.0593    4.19   0.0001 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.142 on 53 degrees of freedom
## Multiple R-squared:  0.479,  Adjusted R-squared:  0.439 
## F-statistic: 12.2 on 4 and 53 DF,  p-value: 4.35e-07
water_depth emmean SE df lower.CL upper.CL
0.25 0.803 0.043 53 0.717 0.889
0.5 0.892 0.041 53 0.810 0.975
1 1.133 0.041 53 1.050 1.215
2 1.126 0.043 53 1.040 1.212
2-0.25 1.052 0.041 53 0.969 1.134
contrast estimate SE df t.ratio p.value
0.25 - 0.5 -0.089 0.059 53 -1.508 0.562
0.25 - 1 -0.330 0.059 53 -5.558 0.000
0.25 - 2 -0.323 0.061 53 -5.328 0.000
0.25 - (2-0.25) -0.249 0.059 53 -4.194 0.001
0.5 - 1 -0.240 0.058 53 -4.141 0.001
0.5 - 2 -0.233 0.059 53 -3.934 0.002
0.5 - (2-0.25) -0.159 0.058 53 -2.747 0.060
1 - 2 0.007 0.059 53 0.115 1.000
1 - (2-0.25) 0.081 0.058 53 1.394 0.634
2 - (2-0.25) 0.074 0.059 53 1.248 0.724

Table S6

Table S6. Summary statistics from linear model for the maximum distance jumped (cm) between water depth treatments. emmean = estimated marginal means, s.e. = standard error, df = degrees of freedom, lower.CI = lower 2.5% confident interval, and upper.CI = lower 97.5% confident interval. Pairwise comparison between all treatment groups. p.value = P value with \(\alpha\) set at 0.05. P value adjustment: tukey method for comparing a family of 5 estimates.

## 
## Call:
## lm(formula = jump_dist_cm ~ water_depth, data = metamorph_dat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.0242 -0.5508 -0.0242  0.3530  2.3891 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         7.6109     0.2790   27.28  < 2e-16 ***
## water_depth0.5      0.0749     0.3862    0.19  0.84691    
## water_depth1        1.2133     0.3862    3.14  0.00275 ** 
## water_depth2        1.4455     0.3945    3.66  0.00057 ***
## water_depth2-0.25   0.3966     0.3862    1.03  0.30909    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.925 on 53 degrees of freedom
## Multiple R-squared:  0.307,  Adjusted R-squared:  0.255 
## F-statistic: 5.87 on 4 and 53 DF,  p-value: 0.000547
water_depth emmean SE df lower.CL upper.CL
0.25 7.61 0.279 53 7.05 8.17
0.5 7.69 0.267 53 7.15 8.22
1 8.82 0.267 53 8.29 9.36
2 9.06 0.279 53 8.50 9.62
2-0.25 8.01 0.267 53 7.47 8.54
contrast estimate SE df t.ratio p.value
0.25 - 0.5 -0.075 0.386 53 -0.194 1.000
0.25 - 1 -1.213 0.386 53 -3.142 0.022
0.25 - 2 -1.446 0.395 53 -3.664 0.005
0.25 - (2-0.25) -0.397 0.386 53 -1.027 0.842
0.5 - 1 -1.138 0.378 53 -3.014 0.031
0.5 - 2 -1.371 0.386 53 -3.549 0.007
0.5 - (2-0.25) -0.322 0.378 53 -0.852 0.913
1 - 2 -0.232 0.386 53 -0.601 0.974
1 - (2-0.25) 0.817 0.378 53 2.162 0.210
2 - (2-0.25) 1.049 0.386 53 2.716 0.065

Figures

Code to produce the main document figures are detailed below. Figures produced were further modified in Adobe Illustrator for publication.

Fig 1 - Tadpole development

fig1a <- larva_dat %>%
    ggplot(aes(x = days, y = length_cm, group = ID, colour = water_depth)) + geom_line(alpha = 0.5) +
    geom_point(size = 3) + scale_colour_manual(values = my_blue) + ylab("Total length (cm)") +
    xlab("Days of exposure") + mytheme()

fig1b <- metamorph_dat %>%
    ggplot(aes(x = water_depth, y = growth_rate_cm_d, colour = water_depth)) + geom_boxplot(fill = NA,
    show.legend = F) + geom_jitter(position = position_jitter(0.05), size = 3) +
    scale_colour_manual(values = my_blue) + ylab(expression("Growth rate (cm d"^"-1" *
    ")")) + xlab("Water depth (cm)") + mytheme()

leg <- cowplot::get_legend(fig1a + theme(legend.box.margin = margin(0, 0, 12)))  # create some space to the left of the legend
prow <- cowplot::plot_grid(fig1a + theme(legend.position = "none"), fig1b + theme(legend.position = "none"),
    ncol = 2, align = "h", axis = "bt", labels = c("A", "B"))
cowplot::plot_grid(prow, leg, rel_widths = c(2, 0.4))  # group as 3 columns (2 figs + 1 legend)

Fig 2 - Metamorph

## larval period
fig2a <- metamorph_dat %>%
    ggplot(aes(x = water_depth, y = larval_period_d, colour = water_depth)) + geom_boxplot(fill = NA,
    show.legend = F) + geom_jitter(position = position_jitter(0.05), size = 3) +
    scale_colour_manual(values = my_blue) + ylab("Larval period (days)") + xlab("Water depth (cm)") +
    mytheme()

## metamorph size
fig2b <- metamorph_dat %>%
    ggplot(aes(x = water_depth, y = metamorph_size_cm, colour = water_depth)) + geom_boxplot(fill = NA,
    show.legend = F) + geom_jitter(position = position_jitter(0.05), size = 3) +
    scale_colour_manual(values = my_blue) + ylab("Metamorph size (cm)") + xlab("Water depth (cm)") +
    mytheme()

# jumping distance
fig2c <- metamorph_dat %>%
    ggplot(aes(x = water_depth, y = jump_dist_cm, colour = water_depth)) + geom_boxplot(fill = NA,
    show.legend = F) + geom_jitter(position = position_jitter(0.05), size = 3) +
    scale_colour_manual(values = my_blue) + ylab("Maximum distance jumped (cm)") +
    xlab("Water depth (cm)") + mytheme()

legend_b <- get_legend(fig2a + guides(color = guide_legend(nrow = 1)) + theme(legend.position = "bottom"))

fig2d <- metamorph_dat %>%
    ggplot(aes(x = metamorph_size_cm, y = jump_dist_cm)) + geom_point(size = 3, aes(colour = water_depth)) +
    scale_colour_manual(values = my_blue) + ylab("Maximum distance jumped (cm)") +
    xlab("Metamorph size (cm)") + ggpmisc::stat_poly_line(formula = y ~ x, colour = "#09519C",
    fill = "#C6DBEF", linetype = "dashed") + ggpmisc::stat_poly_eq(use_label("eq",
    "R2", "R2.CI", "P", "n"), formula = y ~ x) + mytheme()

fig2e <- metamorph_dat %>%
    ggplot(aes(x = larval_period_d, y = metamorph_size_cm)) + geom_point(size = 3,
    aes(colour = water_depth)) + scale_colour_manual(values = my_blue) + ylab("Metamorph size (cm)") +
    xlab("Larval period (days)") + ggpmisc::stat_poly_line(formula = y ~ x, colour = "#09519C",
    fill = "#C6DBEF", linetype = "dashed") + ggpmisc::stat_poly_eq(use_label("eq",
    "R2", "R2.CI", "P", "n"), formula = y ~ x) + mytheme()

plot_grid(fig2a + theme(legend.position = "none"), fig2b + theme(legend.position = "none"),
    fig2c + theme(legend.position = "none"), fig2d + theme(legend.position = "none"),
    fig2e + theme(legend.position = "none"), NULL, ncol = 3, align = "h", axis = "bt",
    labels = c("A", "B", "C", "D", "E", ""))


References



Session Information

R version 4.4.0 (2024-04-24)

Platform: aarch64-apple-darwin20

attached base packages: stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: formatR(v.1.14), ggpmisc(v.0.6.0), ggpp(v.0.5.8-1), emmeans(v.1.10.3), lme4(v.1.1-35.5), Matrix(v.1.7-0), cowplot(v.1.1.3), lubridate(v.1.9.3), forcats(v.1.0.0), stringr(v.1.5.1), dplyr(v.1.1.4), purrr(v.1.0.2), readr(v.2.1.5), tidyr(v.1.3.1), tibble(v.3.2.1), ggplot2(v.3.5.1), tidyverse(v.2.0.0) and knitr(v.1.48)

loaded via a namespace (and not attached): gtable(v.0.3.5), xfun(v.0.47), bslib(v.0.8.0), lattice(v.0.22-6), tzdb(v.0.4.0), vctrs(v.0.6.5), tools(v.4.4.0), generics(v.0.1.3), parallel(v.4.4.0), pbkrtest(v.0.5.3), sandwich(v.3.1-0), fansi(v.1.0.6), highr(v.0.11), pacman(v.0.5.1), pkgconfig(v.2.0.3), RColorBrewer(v.1.1-3), lifecycle(v.1.0.4), farver(v.2.1.2), compiler(v.4.4.0), MatrixModels(v.0.5-3), munsell(v.0.5.1), codetools(v.0.2-20), SparseM(v.1.84-2), quantreg(v.5.98), htmltools(v.0.5.8.1), sass(v.0.4.9), yaml(v.2.3.10), pillar(v.1.9.0), nloptr(v.2.1.1), jquerylib(v.0.1.4), MASS(v.7.3-61), cachem(v.1.1.0), boot(v.1.3-30), multcomp(v.1.4-26), nlme(v.3.1-166), tidyselect(v.1.2.1), digest(v.0.6.36), mvtnorm(v.1.2-6), stringi(v.1.8.4), pander(v.0.6.5), bookdown(v.0.40), labeling(v.0.4.3), splines(v.4.4.0), fastmap(v.1.2.0), grid(v.4.4.0), colorspace(v.2.1-1), cli(v.3.6.3), magrittr(v.2.0.3), survival(v.3.7-0), utf8(v.1.2.4), broom(v.1.0.6), TH.data(v.1.1-2), withr(v.3.0.1), backports(v.1.5.0), scales(v.1.3.0), timechange(v.0.3.0), estimability(v.1.5.1), confintr(v.1.0.2), rmarkdown(v.2.28), zoo(v.1.8-12), hms(v.1.1.3), coda(v.0.19-4.1), evaluate(v.0.24.0), rlang(v.1.1.4), Rcpp(v.1.0.13), xtable(v.1.8-4), glue(v.1.7.0), polynom(v.1.4-1), rstudioapi(v.0.16.0), minqa(v.1.2.8), jsonlite(v.1.8.8) and R6(v.2.5.1)


  1. Hawkesbury Institute for the Environment, Western Sydney University, NSW 2753, Australia, ↩︎

LS0tCnRpdGxlOiAiRGV2ZWxvcG1lbnRhbCBwbGFzdGljaXR5IHRvIHBvbmQgZHJ5aW5nIGhhcyBjYXJyeS1vdmVyIGNvc3RzIG9uIG1ldGFtb3JwaCBwZXJmb3JtYW5jZSIKc3VidGl0bGU6ICJTdXBwbGVtZW50YXJ5IEluZm9ybWF0aW9uIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZC8lbS8lWScpYCIKYXV0aG9yOgogIC0gTmljaG9sYXMgQy4gV3VeW0hhd2tlc2J1cnkgSW5zdGl0dXRlIGZvciB0aGUgRW52aXJvbm1lbnQsIFdlc3Rlcm4gU3lkbmV5IFVuaXZlcnNpdHksIE5TVyAyNzUzLCBBdXN0cmFsaWEsIG5pY2hvbGFzLnd1Lm56QGdtYWlsLmNvbV0Kb3V0cHV0OgogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgI2NvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCiNsaW5rLWNpdGF0aW9uczogdHJ1ZQotLS0KClRoaXMgZG9jdW1lbnQgY29udGFpbnMgdGhlICpSKiB3b3JrZmxvdyBmb3IgcHJvY2Vzc2luZyBhbmQgYW5hbHlzaW5nIHRoZSByYXcgZGF0YSwgYW5kIGdlbmVyYXRpbmcgZmlndXJlcyBmb3IgdGhlIG1hbnVzY3JpcHQgdGl0bGVkICIqKkRldmVsb3BtZW50YWwgcGxhc3RpY2l0eSB0byBwb25kIGRyeWluZyBoYXMgY2Fycnktb3ZlciBjb3N0cyBvbiBtZXRhbW9ycGggcGVyZm9ybWFuY2UqKiIuIAoKW0dpdEh1YiBSZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vbmljaG9sYXN3dW56L3RhZHBvbGUtcG9uZC1kcnlpbmcpOgpUaGUgUm1hcmtkb3duIGZpbGUgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgKkNvZGUqIGRyb3AgZG93biBtZW51ICh0b3AgcmlnaHQpLgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgY2FjaGUgPSBGQUxTRSwgdGlkeSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQpvcHRpb25zKGRwbHlyLndpZHRoID0gSW5mLCBrbml0ci5rYWJsZS5OQSA9ICIiLCBkaWdpdHMgPSAzKQoKIyBMb2FkIGxpYnJhcnkKcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCBjb3dwbG90LCAKICAgICAgICAgICAgICAgbG1lNCwgZW1tZWFucywgZ2dwbWlzYywgCiAgICAgICAgICAgICAgIGZvcm1hdFIpCgojIEZ1bmN0aW9ucwpteXRoZW1lIDwtIGZ1bmN0aW9uKCkgewogIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuYm9yZGVyICAgICAgICAgID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yICAgICAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yICAgICAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLmxpbmUgICAgICAgICAgICAgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzICAgICAgICAgICAgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgICBheGlzLnRleHQgICAgICAgICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICAgIGF4aXMudGl0bGUgICAgICAgICAgICA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgICAgYXhpcy50aXRsZS55ICAgICAgICAgID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMyksCiAgICAgICAgICBheGlzLnRpdGxlLnggICAgICAgICAgPSBlbGVtZW50X3RleHQodmp1c3QgPSAtMSksCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kICAgICAgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BKSwKICAgICAgICAgIHBsb3QuYmFja2dyb3VuZCAgICAgICA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG9yID0gTkEpLAogICAgICAgICAgcGxvdC5tYXJnaW4gICAgICAgICAgID0gdW5pdChjKDAuMiwgMC4yLCAwLjIsIDAuMiksIHVuaXRzID0gLCAiY20iKSwKICAgICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kICAgICA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG9yID0gTkEpLAogICAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSBOQSksCiAgICAgICAgICBzdHJpcC50ZXh0LnggICAgICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBjb2xvciA9ICJibGFjayIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCAgICAgID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3IgPSBOQSksCiAgICAgICAgICBwbG90LnRpdGxlICAgICAgICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKQogICAgKQp9ICMgc2V0IHVwIHBsb3QgdGhlbWUKCgpteV9ibHVlIDwtIFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbChuID0gOSwgIkJsdWVzIilbMzo5XSAjIGV4Y2x1ZGVkIHRoZSB0d28gbGlnaHRlciBodWVzCgpgYGAKCgojIERhdGEgey19CgpMb2FkIGJvdGggdGFkcG9sZSBhbmQgbWV0YW1vcnBoIGRhdGEgZnJvbSB0aGUgR2l0SHViIHJlcG9zaXRvcnkuCgpgYGB7ciBkYXRhfQojIExvYWQgcmF3IGRhdGEgYW5kIGNsZWFuCmxhcnZhX2RhdCA8LSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL25pY2hvbGFzd3Vuei90YWRwb2xlLXBvbmQtZHJ5aW5nL21hc3Rlci9kYXRhL2xhcnZhZV9kYXRhLmNzdiIsIG5hLnN0cmluZ3MgPSBjKCIiICwgIk5BIiApLCBzdHJpbmdzQXNGYWN0b3JzID0gVFJVRSkKCm1ldGFtb3JwaF9kYXQgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9uaWNob2xhc3d1bnovdGFkcG9sZS1wb25kLWRyeWluZy9tYXN0ZXIvZGF0YS9tZXRhbW9ycGhfZGF0YS5jc3YiLCBuYS5zdHJpbmdzID0gYygiIiAsICJOQSIgKSwgc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpCmBgYAoKIyMgRGF0YSBzdW1tYXJ5IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzIC19IAoKIyMjIFRhYmxlIFMxYSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxscyAtfSAKCioqVGFibGUgUzEuKiogTWVhbiDCsSBzdGFuZGFyZCBkZXZpYXRpb24gKHMuZC4pIG9mIHRoZSB0YWRwb2xlIHRvdGFsIGxlbmd0aCByZWNvcmRlZCBieSB0cmVhdG1lbnQgZ3JvdXAuCgpgYGB7ciB0YWJsZVMxYSwgZWNobz1GQUxTRX0KZGF0YS5mcmFtZShsYXJ2YV9kYXQgJT4lCiAgZHBseXI6Omdyb3VwX2J5KGdyb3VwLCB3YXRlcl9kZXB0aCwgZGF5cykgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gZm9ybWF0KHJvdW5kKG1lYW4obGVuZ3RoX2NtKSwgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgICAgU0QgICA9IGZvcm1hdChyb3VuZChzZChsZW5ndGhfY20pLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICAgICBuICAgID0gbigpKQogICkgJT4lCiAgZHBseXI6Om11dGF0ZShsZW5ndGggPSBwYXN0ZShtZWFuLCBTRCwgc2VwID0gIsKxIikpICU+JQogIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIHdhdGVyX2RlcHRoLCBkYXlzLCBsZW5ndGgsIG4pICU+JQogIGRwbHlyOjpyZW5hbWUoIkdyb3VwIiA9IGdyb3VwLAogICAgICAgICAgICAgICAgIldhdGVyIGRlcHRoIChjbSkiID0gd2F0ZXJfZGVwdGgsCiAgICAgICAgICAgICAgICAiRGF5cyIgPSBkYXlzLAogICAgICAgICAgICAgICAgIlRvdGFsIGxlbmd0aCDCsSBzLmQuIChjbSkiID0gbGVuZ3RoLAogICAgICAgICAgICAgICAgbiAgICAgICAgICAgICAgICAgICAgICAgID0gbikgJT4lCiAga25pdHI6OmthYmxlKGRpZ2l0cyA9IDIpICMgMyBkZWNpbWFsIHBsYWNlcwpgYGAKCiMjIyBUYWJsZSBTMWIgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHMgLX0gCgoqKlRhYmxlIFMxLioqIE1lYW4gwrEgc3RhbmRhcmQgZGV2aWF0aW9uIChzLmQuKSBvZiB0aGUgZ3Jvd3RoIHJhdGUgKGNtIGReLTFeKSwgbGFydmFsIHBlcmlvZCAoZGF5cyksIHNpemUgYXQgbWV0YW1vcnBoIChjbSksIGFuZCBtYXhpbXVtIGp1bXBpbmcgZGlzdGFuY2UgKGNtKSBieSB0cmVhdG1lbnQgZ3JvdXAuCgpgYGB7ciB0YWJsZVMxYiwgZWNobz1GQUxTRX0KZGF0YS5mcmFtZShtZXRhbW9ycGhfZGF0ICU+JQogIGRwbHlyOjpncm91cF9ieShncm91cCwgd2F0ZXJfZGVwdGgpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoZ3Jvd3RoX21lYW4gPSBmb3JtYXQocm91bmQobWVhbihncm93dGhfcmF0ZV9jbV9kKSwgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgICAgZ3Jvd3RoX1NEICAgPSBmb3JtYXQocm91bmQoc2QoZ3Jvd3RoX3JhdGVfY21fZCksIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgIGxhcnZhbF9tZWFuID0gbWVkaWFuKGxhcnZhbF9wZXJpb2RfZCksCiAgICAgICAgICAgICAgICAgICBsYXJ2YWxfU0QgICA9IGZvcm1hdChyb3VuZChzZChsYXJ2YWxfcGVyaW9kX2QpLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICAgICBzaXplX21lYW4gPSBmb3JtYXQocm91bmQobWVhbihtZXRhbW9ycGhfc2l6ZV9jbSksIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgIHNpemVfU0QgICA9IGZvcm1hdChyb3VuZChzZChtZXRhbW9ycGhfc2l6ZV9jbSksIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgIGp1bXBfbWVhbiA9IGZvcm1hdChyb3VuZChtZWFuKGp1bXBfZGlzdF9jbSksIDIpLCBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgIGp1bXBfU0QgICA9IGZvcm1hdChyb3VuZChzZChqdW1wX2Rpc3RfY20pLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICAgICBuICAgID0gbigpKQogICkgJT4lCiAgZHBseXI6Om11dGF0ZShncm93dGggPSBwYXN0ZShncm93dGhfbWVhbiwgZ3Jvd3RoX1NELCBzZXAgPSAiwrEiKSwKICAgICAgICAgICAgICAgIGxhcnZhbCA9IHBhc3RlKGxhcnZhbF9tZWFuLCBsYXJ2YWxfU0QsIHNlcCA9ICLCsSIpLAogICAgICAgICAgICAgICAgc2l6ZSA9IHBhc3RlKHNpemVfbWVhbiwgc2l6ZV9TRCwgc2VwID0gIsKxIiksCiAgICAgICAgICAgICAgICBqdW1wID0gcGFzdGUoanVtcF9tZWFuLCBqdW1wX1NELCBzZXAgPSAiwrEiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChncm91cCwgd2F0ZXJfZGVwdGgsIGdyb3d0aCwgbGFydmFsLCBzaXplLCBqdW1wLCBuKSAlPiUKICBkcGx5cjo6cmVuYW1lKCJHcm91cCIgPSBncm91cCwKICAgICAgICAgICAgICAgICJXYXRlciBkZXB0aCAoY20pIiA9IHdhdGVyX2RlcHRoLAogICAgICAgICAgICAgICAgIkdyb3d0aCByYXRlIChjbSBkJF57LTF9JCkiID0gZ3Jvd3RoLAogICAgICAgICAgICAgICAgIkxhcnZhbCBwZXJpb2QgKGQpIiA9IGxhcnZhbCwKICAgICAgICAgICAgICAgICJNZXRhbW9ycGggc2l6ZSAoY20pIiA9IHNpemUsCiAgICAgICAgICAgICAgICAiSnVtcGluZyBkaXN0YW5jZSAoY20pIiA9IGp1bXAsCiAgICAgICAgICAgICAgICBuICAgICAgICAgICAgICAgICAgICAgICAgPSBuKSAlPiUKICBrbml0cjo6a2FibGUoZGlnaXRzID0gMikgIyAzIGRlY2ltYWwgcGxhY2VzCmBgYAoKKioqCgojIEFuYWx5c2lzIHstfQoKUnVuIGxpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIChpbmRpdmlkdWFsIElEIGFzIHJhbmRvbSBlZmZlY3QpIGZvciB0b3RhbCBsZW5ndGggYWNyb3NzIGRpZmZlcmVudCB3YXRlciBkZXB0aCB1c2luZyB0aGUgYGxtZXJgIGZ1bmN0aW9uIGZyb20gdGhlIGxtZTQgcGFja2FnZS4gUnVuIGxpbmVhciBtb2RlbCBmb3IgZ3Jvd3RoIHJhdGUsIGxhcnZhbCBwZXJpb2QsIG1ldGFtb3JwaCBzaXplLCBhbmQgbWV0YW1vcnBoIG1heGltdW0ganVtcGluZyBkaXN0YW5jZSBhY3Jvc3MgZGlmZmVyZW50IHdhdGVyIGRlcHRoIHRyZWF0bWVudHMgdXNpbmcgYGxtYCBmdW5jdGlvbi4KCmBgYHtyIGFuYWx5c2lzLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0KIyBsaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbApsZW5ndGhfbW9kIDwtIGxtZTQ6OmxtZXIobGVuZ3RoX2NtIH4gIGRheXMgKiB3YXRlcl9kZXB0aCArICgxIHwgSUQpLCBkYXRhID0gbGFydmFfZGF0KSAKCiMgbGluZWFyIGVmZmVjdHMgbW9kZWwKZ3Jvd3RoX21vZCA8LSBsbShncm93dGhfcmF0ZV9jbV9kIH4gd2F0ZXJfZGVwdGgsIGRhdGEgPSBtZXRhbW9ycGhfZGF0KSAKcGVyaW9kX21vZCA8LSBsbShsYXJ2YWxfcGVyaW9kX2QgfiB3YXRlcl9kZXB0aCwgZGF0YSA9IG1ldGFtb3JwaF9kYXQpIApzaXplX21vZCAgIDwtIGxtKG1ldGFtb3JwaF9zaXplX2NtIH4gd2F0ZXJfZGVwdGgsIGRhdGEgPSBtZXRhbW9ycGhfZGF0KSAKanVtcF9tb2QgICA8LSBsbShqdW1wX2Rpc3RfY20gfiB3YXRlcl9kZXB0aCwgZGF0YSA9IG1ldGFtb3JwaF9kYXQpIApgYGAKCiMjIE1vZGVsIG91dHB1dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxscyAtfSAKCiMjIyBUYWJsZSBTMiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxscyAtfSAKCioqVGFibGUgUzIuKiogU3VtbWFyeSBzdGF0aXN0aWNzIGZyb20gbGluZWFyIG1peGVkIGVmZmVjdHMgbW9kZWwgY29tcGFyaW5nIHRoZSByZWdyZXNzaW9uIHNsb3BlIGZvciBsYXJ2YWwgdG90YWwgbGVuZ3RoIChjbSkgYWNyb3NzIGRheXMgb2YgZXhwb3N1cmUsIHdpdGggd2F0ZXIgZGVwdGggdHJlYXRtZW50IGFzIGFuIGludGVyYWN0aXZlIGVmZmVjdCwgYW5kIGZyb2cgSUQgYXMgcmFuZG9tIGVmZmVjdC4gZW1tZWFuID0gZXN0aW1hdGVkIG1hcmdpbmFsIG1lYW5zLCBzLmUuID0gc3RhbmRhcmQgZXJyb3IsIGRmID0gZGVncmVlcyBvZiBmcmVlZG9tLCBsb3dlci5DSSA9IGxvd2VyIDIuNSUgY29uZmlkZW50IGludGVydmFsLCBhbmQgdXBwZXIuQ0kgPSBsb3dlciA5Ny41JSBjb25maWRlbnQgaW50ZXJ2YWwuIFBhaXJ3aXNlIGNvbXBhcmlzb24gYmV0d2VlbiBhbGwgdHJlYXRtZW50IGdyb3Vwcy4gcC52YWx1ZSA9ICpQKiB2YWx1ZSB3aXRoICRcYWxwaGEkIHNldCBhdCAwLjA1LiBEZWdyZWVzLW9mLWZyZWVkb20gbWV0aG9kOiBrZW53YXJkLXJvZ2VyLCAqUCogdmFsdWUgYWRqdXN0bWVudDogdHVrZXkgbWV0aG9kIGZvciBjb21wYXJpbmcgYSBmYW1pbHkgb2YgNSBlc3RpbWF0ZXMuCgpgYGB7ciB0YWJsZVMyLCBlY2hvID0gRkFMU0V9CnN1bW1hcnkobGVuZ3RoX21vZCkKa25pdHI6OmthYmxlKGVtbWVhbnMobGVuZ3RoX21vZCwgc3BlY3MgPSBwYWlyd2lzZSB+IGRheXMgKiB3YXRlcl9kZXB0aCkkZW1tZWFucykKI2tuaXRyOjprYWJsZShlbW1lYW5zKGxlbmd0aF9tb2QsIHNwZWNzID0gcGFpcndpc2UgfiBkYXlzICogd2F0ZXJfZGVwdGgpJGNvbnRyYXN0cykKa25pdHI6OmthYmxlKHBhaXJzKGVtbWVhbnM6OmxzdHJlbmRzKGxlbmd0aF9tb2QsICJ3YXRlcl9kZXB0aCIsIHZhcj0iZGF5cyIpKSkgIyBjb21wYXJlIHNsb3BlcwpgYGAKCiMjIyBGaWcuIFMxIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzIC19IAoKYGBge3IgZmlnUzEsIGVjaG8gPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQplbW1lYW5zOjplbW1pcChyZWZfZ3JpZChsZW5ndGhfbW9kLCBhdCA9IGxpc3QoZGF5cyA9IGMoMSwgOCwgMTUsIDIxLCAyOCkpKSwgCiAgICAgICAgICAgICAgIHdhdGVyX2RlcHRoIH4gZGF5cywKICAgICAgICAgICAgICAgbGluZWFyZyA9IGxpc3QobGluZXR5cGUgPSAic29saWQiLCBsd2QgPSAxLjUpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBteV9ibHVlKSArCiAgeGxhYigiRGF5cyBvZiBleHBvc3VyZSIpICsgeWxhYigiVG90YWwgbGVuZ3RoIChjbSkiKSArCiAgbXl0aGVtZSgpCmBgYAoKKipGaWcuIFMxLioqIE1vZGVsIG91dHB1dC4KCgojIyMgVGFibGUgUzMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHMgLX0gCgoqKlRhYmxlIFMzLioqIFN1bW1hcnkgc3RhdGlzdGljcyBmcm9tIGxpbmVhciBtb2RlbCBmb3IgZ3Jvd3RoIHJhdGUgKGNtIGTLicK5KSBiZXR3ZWVuIHdhdGVyIGRlcHRoIHRyZWF0bWVudHMuIGVtbWVhbiA9IGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucywgcy5lLiA9IHN0YW5kYXJkIGVycm9yLCBkZiA9IGRlZ3JlZXMgb2YgZnJlZWRvbSwgbG93ZXIuQ0kgPSBsb3dlciAyLjUlIGNvbmZpZGVudCBpbnRlcnZhbCwgYW5kIHVwcGVyLkNJID0gbG93ZXIgOTcuNSUgY29uZmlkZW50IGludGVydmFsLiBQYWlyd2lzZSBjb21wYXJpc29uIGJldHdlZW4gYWxsIHRyZWF0bWVudCBncm91cHMuIHAudmFsdWUgPSAqUCogdmFsdWUgd2l0aCAkXGFscGhhJCBzZXQgYXQgMC4wNS4gKlAqIHZhbHVlIGFkanVzdG1lbnQ6IHR1a2V5IG1ldGhvZCBmb3IgY29tcGFyaW5nIGEgZmFtaWx5IG9mIDUgZXN0aW1hdGVzLgoKYGBge3IgdGFibGVTMywgZWNobyA9IEZBTFNFfQpzdW1tYXJ5KGdyb3d0aF9tb2QpCmtuaXRyOjprYWJsZShlbW1lYW5zKGdyb3d0aF9tb2QsICJ3YXRlcl9kZXB0aCIpKQprbml0cjo6a2FibGUoY29udHJhc3QoZW1tZWFucyhncm93dGhfbW9kLCAid2F0ZXJfZGVwdGgiKSwgInBhaXJ3aXNlIikpCmBgYAoKIyMjIFRhYmxlIFM0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzIC19IAoKKipUYWJsZSBTNC4qKiBTdW1tYXJ5IHN0YXRpc3RpY3MgZnJvbSBsaW5lYXIgbW9kZWwgZm9yIGxhcnZhbCBwZXJpb2QgKGRheXMpIGJldHdlZW4gd2F0ZXIgZGVwdGggdHJlYXRtZW50cy4gZW1tZWFuID0gZXN0aW1hdGVkIG1hcmdpbmFsIG1lYW5zLCBzLmUuID0gc3RhbmRhcmQgZXJyb3IsIGRmID0gZGVncmVlcyBvZiBmcmVlZG9tLCBsb3dlci5DSSA9IGxvd2VyIDIuNSUgY29uZmlkZW50IGludGVydmFsLCBhbmQgdXBwZXIuQ0kgPSBsb3dlciA5Ny41JSBjb25maWRlbnQgaW50ZXJ2YWwuIFBhaXJ3aXNlIGNvbXBhcmlzb24gYmV0d2VlbiBhbGwgdHJlYXRtZW50IGdyb3Vwcy4gcC52YWx1ZSA9ICpQKiB2YWx1ZSB3aXRoICRcYWxwaGEkIHNldCBhdCAwLjA1LiAqUCogdmFsdWUgYWRqdXN0bWVudDogdHVrZXkgbWV0aG9kIGZvciBjb21wYXJpbmcgYSBmYW1pbHkgb2YgNSBlc3RpbWF0ZXMuCgpgYGB7ciB0YWJsZVM0LCBlY2hvID0gRkFMU0V9CnN1bW1hcnkocGVyaW9kX21vZCkKa25pdHI6OmthYmxlKGVtbWVhbnMocGVyaW9kX21vZCwgIndhdGVyX2RlcHRoIikpCmtuaXRyOjprYWJsZShjb250cmFzdChlbW1lYW5zKHBlcmlvZF9tb2QsICJ3YXRlcl9kZXB0aCIpLCAicGFpcndpc2UiKSkKYGBgCgojIyMgVGFibGUgUzUgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHMgLX0gCgoqKlRhYmxlIFM1LioqIFN1bW1hcnkgc3RhdGlzdGljcyBmcm9tIGxpbmVhciBtb2RlbCBmb3IgbWV0YW1vcnBoIHNpemUgKGNtKSBiZXR3ZWVuIHdhdGVyIGRlcHRoIHRyZWF0bWVudHMuIGVtbWVhbiA9IGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucywgcy5lLiA9IHN0YW5kYXJkIGVycm9yLCBkZiA9IGRlZ3JlZXMgb2YgZnJlZWRvbSwgbG93ZXIuQ0kgPSBsb3dlciAyLjUlIGNvbmZpZGVudCBpbnRlcnZhbCwgYW5kIHVwcGVyLkNJID0gbG93ZXIgOTcuNSUgY29uZmlkZW50IGludGVydmFsLiBQYWlyd2lzZSBjb21wYXJpc29uIGJldHdlZW4gYWxsIHRyZWF0bWVudCBncm91cHMuIHAudmFsdWUgPSAqUCogdmFsdWUgd2l0aCAkXGFscGhhJCBzZXQgYXQgMC4wNS4gKlAqIHZhbHVlIGFkanVzdG1lbnQ6IHR1a2V5IG1ldGhvZCBmb3IgY29tcGFyaW5nIGEgZmFtaWx5IG9mIDUgZXN0aW1hdGVzLgoKYGBge3IgdGFibGVTNSwgZWNobyA9IEZBTFNFfQpzdW1tYXJ5KHNpemVfbW9kKQprbml0cjo6a2FibGUoZW1tZWFucyhzaXplX21vZCwgIndhdGVyX2RlcHRoIikpCmtuaXRyOjprYWJsZShjb250cmFzdChlbW1lYW5zKHNpemVfbW9kLCAid2F0ZXJfZGVwdGgiKSwgInBhaXJ3aXNlIikpCmBgYAoKIyMjIFRhYmxlIFM2IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzIC19IAoKKipUYWJsZSBTNi4qKiBTdW1tYXJ5IHN0YXRpc3RpY3MgZnJvbSBsaW5lYXIgbW9kZWwgZm9yIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGp1bXBlZCAoY20pICBiZXR3ZWVuIHdhdGVyIGRlcHRoIHRyZWF0bWVudHMuIGVtbWVhbiA9IGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucywgcy5lLiA9IHN0YW5kYXJkIGVycm9yLCBkZiA9IGRlZ3JlZXMgb2YgZnJlZWRvbSwgbG93ZXIuQ0kgPSBsb3dlciAyLjUlIGNvbmZpZGVudCBpbnRlcnZhbCwgYW5kIHVwcGVyLkNJID0gbG93ZXIgOTcuNSUgY29uZmlkZW50IGludGVydmFsLiBQYWlyd2lzZSBjb21wYXJpc29uIGJldHdlZW4gYWxsIHRyZWF0bWVudCBncm91cHMuIHAudmFsdWUgPSAqUCogdmFsdWUgd2l0aCAkXGFscGhhJCBzZXQgYXQgMC4wNS4gKlAqIHZhbHVlIGFkanVzdG1lbnQ6IHR1a2V5IG1ldGhvZCBmb3IgY29tcGFyaW5nIGEgZmFtaWx5IG9mIDUgZXN0aW1hdGVzLgoKYGBge3IgdGFibGVTNiwgZWNobyA9IEZBTFNFfQpzdW1tYXJ5KGp1bXBfbW9kKQprbml0cjo6a2FibGUoZW1tZWFucyhqdW1wX21vZCwgIndhdGVyX2RlcHRoIikpCmtuaXRyOjprYWJsZShjb250cmFzdChlbW1lYW5zKGp1bXBfbW9kLCAid2F0ZXJfZGVwdGgiKSwgInBhaXJ3aXNlIikpCmBgYAoKKioqCgojIEZpZ3VyZXMgey19CgpDb2RlIHRvIHByb2R1Y2UgdGhlIG1haW4gZG9jdW1lbnQgZmlndXJlcyBhcmUgZGV0YWlsZWQgYmVsb3cuIEZpZ3VyZXMgcHJvZHVjZWQgd2VyZSBmdXJ0aGVyIG1vZGlmaWVkIGluIFtBZG9iZSBJbGx1c3RyYXRvcl0oaHR0cHM6Ly93d3cuYWRvYmUuY29tL2F1L3Byb2R1Y3RzL2lsbHVzdHJhdG9yLmh0bWwpIGZvciBwdWJsaWNhdGlvbi4KCiMjIEZpZyAxIC0gVGFkcG9sZSBkZXZlbG9wbWVudCB7LX0KCmBgYHtyIEZpZyAxLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTh9CmZpZzFhIDwtIGxhcnZhX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkYXlzLCB5ID0gbGVuZ3RoX2NtLCBncm91cCA9IElELCBjb2xvdXIgPSB3YXRlcl9kZXB0aCkpICsKICBnZW9tX2xpbmUoYWxwaGEgPSAwLjUpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBteV9ibHVlKSArCiAgeWxhYigiVG90YWwgbGVuZ3RoIChjbSkiKSArIHhsYWIoIkRheXMgb2YgZXhwb3N1cmUiKSArCiAgbXl0aGVtZSgpCgpmaWcxYiA8LSBtZXRhbW9ycGhfZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IHdhdGVyX2RlcHRoLCB5ID0gZ3Jvd3RoX3JhdGVfY21fZCwgY29sb3VyID0gd2F0ZXJfZGVwdGgpKSArIAogIGdlb21fYm94cGxvdChmaWxsID0gTkEsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMDUpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gbXlfYmx1ZSkgKwogIHlsYWIoZXhwcmVzc2lvbigiR3Jvd3RoIHJhdGUgKGNtIGQiXiItMSIqIikiKSkgKyB4bGFiKCJXYXRlciBkZXB0aCAoY20pIikgKwogIG15dGhlbWUoKQoKbGVnIDwtIGNvd3Bsb3Q6OmdldF9sZWdlbmQoZmlnMWEgKyB0aGVtZShsZWdlbmQuYm94Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAxMikpKSAjIGNyZWF0ZSBzb21lIHNwYWNlIHRvIHRoZSBsZWZ0IG9mIHRoZSBsZWdlbmQKcHJvdyA8LSBjb3dwbG90OjpwbG90X2dyaWQoZmlnMWEgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwKICAgICAgICAgICAgICAgICAgZmlnMWIgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSwgCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBhbGlnbiA9ICJoIiwgYXhpcyA9ICJidCIsIGxhYmVscz1jKCJBIiwgIkIiKSkKY293cGxvdDo6cGxvdF9ncmlkKHByb3csIGxlZywgcmVsX3dpZHRocyA9IGMoMiwgLjQpKSAjIGdyb3VwIGFzIDMgY29sdW1ucyAoMiBmaWdzICsgMSBsZWdlbmQpCmBgYAoKIyMgRmlnIDIgLSBNZXRhbW9ycGggey19CgpgYGB7ciBGaWcgMiwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTUuNSwgZmlnLndpZHRoPTl9CiMjIGxhcnZhbCBwZXJpb2QKZmlnMmEgPC0gbWV0YW1vcnBoX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB3YXRlcl9kZXB0aCwgeSA9IGxhcnZhbF9wZXJpb2RfZCwgY29sb3VyID0gd2F0ZXJfZGVwdGgpKSArIAogIGdlb21fYm94cGxvdChmaWxsID0gTkEsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMDUpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gbXlfYmx1ZSkgKwogIHlsYWIoIkxhcnZhbCBwZXJpb2QgKGRheXMpIikgKyB4bGFiKCJXYXRlciBkZXB0aCAoY20pIikgKwogIG15dGhlbWUoKQoKIyMgbWV0YW1vcnBoIHNpemUKZmlnMmIgPC0gbWV0YW1vcnBoX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB3YXRlcl9kZXB0aCwgeSA9IG1ldGFtb3JwaF9zaXplX2NtLCBjb2xvdXIgPSB3YXRlcl9kZXB0aCkpICsgCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSBOQSwgc2hvdy5sZWdlbmQgPSBGKSArIAogIGdlb21faml0dGVyKHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMDUpLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gbXlfYmx1ZSkgKwogIHlsYWIoIk1ldGFtb3JwaCBzaXplIChjbSkiKSArIHhsYWIoIldhdGVyIGRlcHRoIChjbSkiKSArCiAgbXl0aGVtZSgpCgojIGp1bXBpbmcgZGlzdGFuY2UKZmlnMmMgPC0gbWV0YW1vcnBoX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSB3YXRlcl9kZXB0aCwgeSA9IGp1bXBfZGlzdF9jbSwgY29sb3VyID0gd2F0ZXJfZGVwdGgpKSArIAogIGdlb21fYm94cGxvdChmaWxsID0gTkEsIHNob3cubGVnZW5kID0gRikgKyAKICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjA1KSwgc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IG15X2JsdWUpICsKICB5bGFiKCJNYXhpbXVtIGRpc3RhbmNlIGp1bXBlZCAoY20pIikgKyB4bGFiKCJXYXRlciBkZXB0aCAoY20pIikgKwogIG15dGhlbWUoKQoKbGVnZW5kX2IgPC0gZ2V0X2xlZ2VuZChmaWcyYSArIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMSkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKQoKZmlnMmQgPC0gbWV0YW1vcnBoX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtZXRhbW9ycGhfc2l6ZV9jbSwgeSA9IGp1bXBfZGlzdF9jbSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWVzKGNvbG91ciA9IHdhdGVyX2RlcHRoKSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IG15X2JsdWUpICsKICB5bGFiKCJNYXhpbXVtIGRpc3RhbmNlIGp1bXBlZCAoY20pIikgKyB4bGFiKCJNZXRhbW9ycGggc2l6ZSAoY20pIikgKwogIGdncG1pc2M6OnN0YXRfcG9seV9saW5lKGZvcm11bGEgPSB5IH4geCwgY29sb3VyID0gIiMwOTUxOUMiLCBmaWxsID0gIiNDNkRCRUYiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2dwbWlzYzo6c3RhdF9wb2x5X2VxKHVzZV9sYWJlbCgiZXEiLCAiUjIiLCAiUjIuQ0kiLCAiUCIsICJuIiksIGZvcm11bGEgPSB5IH4geCkgKwogIG15dGhlbWUoKQoKZmlnMmUgPC0gbWV0YW1vcnBoX2RhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsYXJ2YWxfcGVyaW9kX2QsIHkgPSBtZXRhbW9ycGhfc2l6ZV9jbSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgYWVzKGNvbG91ciA9IHdhdGVyX2RlcHRoKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gbXlfYmx1ZSkgKwogIHlsYWIoIk1ldGFtb3JwaCBzaXplIChjbSkiKSArIHhsYWIoIkxhcnZhbCBwZXJpb2QgKGRheXMpIikgKwogIGdncG1pc2M6OnN0YXRfcG9seV9saW5lKGZvcm11bGEgPSB5IH4geCwgY29sb3VyID0gIiMwOTUxOUMiLCBmaWxsID0gIiNDNkRCRUYiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2dwbWlzYzo6c3RhdF9wb2x5X2VxKHVzZV9sYWJlbCgiZXEiLCAiUjIiLCAiUjIuQ0kiLCAiUCIsICJuIiksIGZvcm11bGEgPSB5IH4geCkgKwogIG15dGhlbWUoKQoKcGxvdF9ncmlkKGZpZzJhICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgIGZpZzJiICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgIGZpZzJjICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgIGZpZzJkICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgIGZpZzJlICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiksCiAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgIG5jb2wgPSAzLCBhbGlnbiA9ICJoIiwgYXhpcyA9ICJidCIsIAogICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQSIsIkIiLCJDIiwiRCIsIkUiLCIiKSkKYGBgCgoqKioKCiMgUmVmZXJlbmNlcyB7LX0KCjxkaXYgaWQ9InJlZnMiPjwvZGl2Pgo8YnI+CgoqKioKCiMjIFNlc3Npb24gSW5mb3JtYXRpb24gey19CgpgYGB7ciBzZXNzaW9uaW5mbywgZWNobyA9IEZBTFNFfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpLCBsb2NhbGUgPSBGQUxTRSkKYGBgCg==