Experiment 1: Director-Matcher Task
Methods
For this experiment, we recruited 15 native speakers of Xhosa and 15 native speakers of Afrikaans. Each participant described 25 sung tone pairs to a confederate matcher.
Hypotheses
- Afrikaans speakers will mainly use the ‘height’ metaphor in speech.
- Xhosa speakers, will use both ‘height’ and ‘size’ flexibly.
- Based on previous findings, we expect gestures accompanying ‘height’ to consistently converge with the spatial mappings invoked by expressions like “high” and “low”.
- Conversely, we expect gestures accompanying ‘size’ in speech to indicate ‘size’ to a lesser extent, and sometimes reveal spatial mappings consistent with ‘height’ metaphors.
Gesture frequency
In the table anch figure below, we see that Xhosa speakers gestured more when using metaphors in speech. Within the two groups, the by-metaphor gesture rates were comparable.
Speech-gesture convergence
Here, we only consider the spatial metaphors ‘height’ and ‘size’.
Gestures were coded for dimension (in terms of movement and location) and handshape (i.e. flat hand, “grip”) and speech-gesture pairs were then coded as either “yes” (convergent), “no” (divergent, e.g. ‘size’ in speech with vertical gestures), “mixed” (both ‘height’ and ‘size’ mappings expressed in gesture) and “n/a” (gestures not clearly expressing spatial mappings).

Summary
- We see that in both languages, the ‘height’ metaphor is consistently accompanied by gestures indicating a vertical space-pitch mapping.
- As predicted, this was also the case with ‘size’ metaphors in Xhosa, which were mostly accompanied by similar gestures expressing verticality.
Experiment 2: Implicit Associations Task
Methods
For this experiment, we recruited 30 native speakers of Xhosa and 30 native speakers of Afrikaans.
Participants performed an RT task targeting implicit space-pitch associations by pairing circles differing in vertical position (high/low, height condition) or size (small, big) with a high/low pitched voice. Participants were asked to indicate whether the sound in each trial was high or low-pitched with button presses.
There were 16 blocks (8 for each condition), with 20 trials in each (320 trials per participant). The order of blocks was randomised.
Stimulus pairs were presented for 200 msec and participants used button presses to indicate whether the sound
Half of the stimulus pairs were “incongruent” in terms of the space-pitch mapping.
Hypotheses
In experiment one, Afrikaans speakers described pitch in terms of ‘height’, whereas Xhosa speakers used ‘size’ in addition to ‘height’. Based on these findings and previous work, we would expect the following:
- Afrikaans speakers’ RTs would be slower (in response to incongruent stimuli) in the ‘height’ condition than in the ‘size’ condition.
- Xhosa speakers’ RTs would be slower in response to incongruent stimuli in both conditions.
We thus expected a three-way interaction effect between language, condition and congruence.
Trimming and filtering the data
RT data are generally difficult to handle for a number of reasons, and the literature proposes a number of procedures to trim and filter the data prior to statistical analyses. In the next sections, we go through each step discussed in the relevant literature.
Accuracy
Ideally, we would want to remove data from participants performing at chance level by pressing buttons at random. To my knowledge, there isn’t a specific threshold for accuracy that’s widely agreed upon for this or similar tasks. However, inspecting the distribution of overall accuracies for each participant, we see that a few participants (n=5) clearly stand out from the rest. Data from these participants are left out in the later analyses.
Another method used by Abutalebi et al., is to use confidence intervals and then set the threshold at the lower CI for each language group. I tried this, and found that this would have further excluded data from four participants.

Setting an upper RT threshold
In the distribution of the response times below, we see a very long right tail. The slowest response is 28 seconds!

Setting an upper threshold will affect RT estimates, but these extreme values would themselves have a major influence making estimates unreliable.
I therefore propose “mild” initial trimming of the data excluding response slower than five seconds as indicated in the figures below.

I’ve also checked for responses that are faster than 100 msec (which are generally considered to be errors), but found none. The fastest recorded RT is 160 msec.
Individual thresholds
There appears to be wide agreement that individual thresholds should be set based on the overall mean and standard deviation for each participant, but authors advocate different levels. Baayen & Milin argue that the frequently used limit at 2 (perhaps also 2.5) standard deviations is too aggressive and proposes an upper limit of 3 standard deviations above the mean coupled with minimal trimming based on residuals after fitting a model. This is essentially what they call performing “model criticism”.
Following this suggestion, we set the threshold for individual RTs at three SDs above individual means.
The table below indicates the amount of data removed in each step. The amount of discarded data seems reasonable and in line with what is generally considered acceptable. Note that the majority of the discarded data is due to poor performance.
Statistical approaches
The classical central tendency approach to analysing RTs is using ANOVAs on the by-participant aggregated means. However, this technique assumes normally distributed data, in which case participant means would offer a reliable summary of the data. The problem is that RTs rarely follow a normal distribution, but rather a positively skewed distribution resembling an ex-Gaussian distribution characterized by a long right tail. As the below plot shows, this is also the case here.

To deal with this issue, we’ll try out the following approaches:
- The Ex-Gaussian approach with separate analyses for the \(\mu\) and \(\tau\) parameters in RT distributions
- Linear regression/ANOVA on the conflict effect and coefficient of variability
- Mixed-effects linear regression with model criticism, checking for autocorrelated RT lags.
The ex-Gaussian approach
In this approach, we compute the three parameters, \(\sigma\) (sigma), \(\mu\) (mu) and tau (tau), that describe an ex-Gaussian distribution, which itself is a convolution of a normal and an exponential distribution. The idea is that potentially interesting effects may hide in the long right tail (\(\tau\) component), which is ignored in standard central tendency tests. \(\mu\) and \(\sigma\) reflect the mean and standard deviation of the Gaussian component, whereas \(\tau\) reflects the mean and the standard deviation of the exponential component.
This procedure has been used e.g. by Abutalebi et al. and Calabria et al.
The figure below shows the dstributions of the three parameters.

We already know that the the grouped distributions appear to follow ex-Gaussian distributions, but we can go further and inspect distributions for each participant in the figure below ordered by mean RT.

From this, it is perhaps less clear that the ex-Gaussian distribution provides the best fit for our data.
We can quantify this by creating simulated data based on the aggregated normal and ex-Gaussian parameters for each participant and perform Kolmogorov-Smirnov tests to see whether the real and simulated distributions are significantly different.
The p-values in the below figure tell us how many participants follow an ex-Gaussian vs. a normal distribution. There are more values above .05 in the ex-Gaussian panel. We therefore conclude that this distribution provides a better fit for the majority of our data.

Before fitting models to our data, we can inspect the following plots which give us a better idea of possible interactions between factors within each parameter. There’s no clear evidence for interactions in the estimated parameters, but there might be main effects of language.

The \(\mu\) parameter
Fitting a full model with all predictors and interactions reveals a marginally significant effect of language (p = .059), i.e. the Xhosa group had shorter RTs in the Gaussian component. No effects reached significant p-values.
Call:
lm(formula = mu ~ language * condition * congruent, data = params)
Residuals:
Min 1Q Median 3Q Max
-131.82 -50.05 -13.16 51.48 253.78
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 592.737 13.468 44.010 <2e-16 ***
languageXhosa -37.173 19.588 -1.898 0.0591 .
conditionsize -13.829 19.047 -0.726 0.4686
congruentTRUE -21.541 19.047 -1.131 0.2593
languageXhosa:conditionsize 3.375 27.702 0.122 0.9031
languageXhosa:congruentTRUE 18.597 27.702 0.671 0.5027
conditionsize:congruentTRUE 27.784 26.936 1.031 0.3035
languageXhosa:conditionsize:congruentTRUE -41.386 39.177 -1.056 0.2920
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 72.53 on 212 degrees of freedom
Multiple R-squared: 0.07613, Adjusted R-squared: 0.04562
F-statistic: 2.496 on 7 and 212 DF, p-value: 0.01751
The \(\tau\) parameter
As with the \(\mu\) parameter, fitting a full model with all predictors and interactions reveals only a marginally significant effect of language (p = .095).
Call:
lm(formula = tau ~ language * condition * congruent, data = params)
Residuals:
Min 1Q Median 3Q Max
-170.61 -72.48 -20.88 52.21 468.38
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 147.355 19.775 7.451 2.31e-12 ***
languageXhosa 48.309 28.762 1.680 0.0945 .
conditionsize 8.576 27.966 0.307 0.7594
congruentTRUE 7.628 27.966 0.273 0.7853
languageXhosa:conditionsize 7.118 40.675 0.175 0.8613
languageXhosa:congruentTRUE -8.017 40.675 -0.197 0.8439
conditionsize:congruentTRUE -11.452 39.550 -0.290 0.7724
languageXhosa:conditionsize:congruentTRUE 15.138 57.524 0.263 0.7927
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 106.5 on 212 degrees of freedom
Multiple R-squared: 0.06082, Adjusted R-squared: 0.02981
F-statistic: 1.961 on 7 and 212 DF, p-value: 0.06172
In sum, we found that Xhosa speakers produced smaller \(\mu\). Otherwise, splitting the Gaussian and exponential components in the RTs did not allow us to identify effects that might have been hiding in the right tails.
Calabria et al. also ran correlation analyses on the \(\mu\) and \(\tau\) parameters of their groups. I’m not completely sure if this is truly interesting or relevant, but doing so yields a small, but significant negative correlation of \(\mu\) and \(\tau\) for Afrikaans speakers and no correlation for Xhosa speakers.
Conflict effect
We can also think of the dependent variable as the mean difference in RTs in response to congruent and incongruent trials, what Calabria et al. call the conflict effect
Below we’ll plot the conflict effect and run the analysis. Note that the congruence variable is contained in the dependent variable, so we fit a model with language and condition as the only factors.

Call:
lm(formula = conflict ~ language * condition, data = conflict_df)
Residuals:
Min 1Q Median 3Q Max
-108.086 -22.213 1.279 16.963 144.360
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 13.913 7.616 1.827 0.0706 .
languageXhosa -10.580 11.078 -0.955 0.3417
conditionsize -16.332 10.771 -1.516 0.1324
languageXhosa:conditionsize 26.248 15.666 1.675 0.0968 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 41.02 on 106 degrees of freedom
Multiple R-squared: 0.02899, Adjusted R-squared: 0.001504
F-statistic: 1.055 on 3 and 106 DF, p-value: 0.3716
There seems to be too much variability to detect any significant effects, though the interaction lines suggest opposite trends, which is reflected in the marginally significant interaction effect between language and condition (p = .097)
Coefficient of variability
It might be interesting to explore whether there are patterns in the variability of response latencies. We can compute the coefficient of variability for each participant by diving the individual SDs by the means.
We plot the data and fit a model in the same way as with the conflict effect.

Call:
lm(formula = lm(coef_var ~ language * condition * congruent,
data = params))
Residuals:
Min 1Q Median 3Q Max
-0.18572 -0.06823 -0.00593 0.04981 0.35430
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.2329422 0.0178153 13.075 <2e-16 ***
languageXhosa 0.0418901 0.0259112 1.617 0.107
conditionsize 0.0014727 0.0251946 0.058 0.953
congruentTRUE 0.0020427 0.0251946 0.081 0.935
languageXhosa:conditionsize 0.0141439 0.0366440 0.386 0.700
languageXhosa:congruentTRUE 0.0037418 0.0366440 0.102 0.919
conditionsize:congruentTRUE -0.0067914 0.0356306 -0.191 0.849
languageXhosa:conditionsize:congruentTRUE 0.0007974 0.0518224 0.015 0.988
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.09594 on 212 degrees of freedom
Multiple R-squared: 0.07045, Adjusted R-squared: 0.03975
F-statistic: 2.295 on 7 and 212 DF, p-value: 0.02833
From the regression output, we see that no effects reached significance.
Mixed-effects regression
The downside of the previous analyses is that they require the data to be aggregated. For this analysis, we’ll follow Baayen & Milin’s suggestions and do the following:
- Compare distributions and transformations of the RTs
- Fit models with different random structures
- Apply model criticism and refit models
- Account for autocorrelation in RTs
Distributions
We’ll compare and determine whether to use untransformed RTs, a log or a inverse Gaussian transformation.
The values for skewness and kurtosis in the table below suggests that all options result in skewed and kurtotic distributions, but with considerable improvements with transformations.
However, these measures are known to be unreliable with larger samples (n > 200)
Instead, we’ll inspect quantile-quantile plots for the goodness of fit of theoretical distributions. Also shown, are the correlation coefficients of the observed and theoretical distributions.

Based on the output, we proceed with the inverse Gaussian transformation. Later model criticism will further improve the goodness of fit.
Below we see QQ-plots for individual participants. It is clear that both groups have a few participants deviating from the expected pattern causing later points to rise above the line in the center panel above.

Before fitting regression models, we’ll plot the data grouped by our independent variables.

Random intercept model
We first fit a random intercept model. From the output we can observe a significant three-way interaction between language, condition and congruence (p = .02)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: RTinv ~ language * condition * congruent + (1 | participant) + (1 | item)
Data: df
REML criterion at convergence: 10686.7
Scaled residuals:
Min 1Q Median 3Q Max
-3.2278 -0.5713 0.0162 0.5620 14.7918
Random effects:
Groups Name Variance Std.Dev.
participant (Intercept) 4.128e-02 0.203168
item (Intercept) 5.032e-05 0.007093
Residual 1.103e-01 0.332078
Number of obs: 16392, groups: participant, 55; item, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 1.457e+00 3.872e-02 5.675e+01 37.633 <2e-16 ***
languageXhosa 7.514e-03 5.587e-02 5.593e+01 0.134 0.8935
conditionsize 1.229e-02 1.227e-02 8.310e+00 1.001 0.3451
congruentTRUE 2.619e-02 1.233e-02 8.450e+00 2.125 0.0645 .
languageXhosa:conditionsize -1.786e-02 1.482e-02 1.633e+04 -1.205 0.2282
languageXhosa:congruentTRUE -1.666e-02 1.482e-02 1.633e+04 -1.125 0.2607
conditionsize:congruentTRUE -3.397e-02 1.739e-02 8.361e+00 -1.954 0.0849 .
languageXhosa:conditionsize:congruentTRUE 4.828e-02 2.085e-02 1.633e+04 2.316 0.0206 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) lnggXh cndtns cnTRUE lnggX: lX:TRU c:TRUE
languageXhs -0.681
conditionsz -0.159 0.074
congrntTRUE -0.159 0.074 0.502
lnggXhs:cnd 0.088 -0.133 -0.552 -0.278
lnggXh:TRUE 0.088 -0.133 -0.279 -0.556 0.502
cndtns:TRUE 0.113 -0.052 -0.707 -0.709 0.390 0.395
lnggX::TRUE -0.063 0.095 0.393 0.396 -0.712 -0.711 -0.556
We then calculate \(R^2\) indicating how well the model fits our data.
[1] 0.2670519
We then apply “model criticism” following Baayen & Milin’s recommendations. This means minimal trimming of standardized residuals above 2.5.
We then refit the model and see that the interaction is still significant.
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: RTinv ~ language * condition * congruent + (1 | participant) + (1 | item)
Data: df2
REML criterion at convergence: 6830.4
Scaled residuals:
Min 1Q Median 3Q Max
-2.87973 -0.61361 0.03524 0.63555 2.98165
Random effects:
Groups Name Variance Std.Dev.
participant (Intercept) 4.243e-02 0.20599
item (Intercept) 8.227e-05 0.00907
Residual 8.754e-02 0.29587
Number of obs: 16173, groups: participant, 55; item, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 1.448e+00 3.930e-02 5.688e+01 36.836 < 2e-16 ***
languageXhosa 9.256e-03 5.642e-02 5.529e+01 0.164 0.87030
conditionsize 1.180e-02 1.275e-02 6.666e+00 0.925 0.38712
congruentTRUE 2.993e-02 1.279e-02 6.741e+00 2.340 0.05319 .
languageXhosa:conditionsize -1.645e-02 1.329e-02 1.611e+04 -1.238 0.21588
languageXhosa:congruentTRUE -2.742e-02 1.328e-02 1.611e+04 -2.064 0.03906 *
conditionsize:congruentTRUE -3.451e-02 1.806e-02 6.695e+00 -1.911 0.09947 .
languageXhosa:conditionsize:congruentTRUE 5.753e-02 1.871e-02 1.611e+04 3.075 0.00211 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) lnggXh cndtns cnTRUE lnggX: lX:TRU c:TRUE
languageXhs -0.678
conditionsz -0.163 0.056
congrntTRUE -0.162 0.056 0.501
lnggXhs:cnd 0.077 -0.118 -0.474 -0.239
lnggXh:TRUE 0.078 -0.118 -0.240 -0.478 0.501
cndtns:TRUE 0.115 -0.040 -0.707 -0.709 0.336 0.339
lnggX::TRUE -0.055 0.084 0.338 0.340 -0.712 -0.710 -0.478
The \(R^2\) value now indicates a considerably better fit.
[1] 0.3208119
Random intercepts and slopes
We’ll also try fitting a model with “maximal random structure” including both random intercepts and slopes as is allowed by the design. We see that the interaction effect is retained in the model.
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: RTinv ~ language * condition * congruent + (1 + condition + congruent | participant) + (1 | item)
Data: df
REML criterion at convergence: 10603.5
Scaled residuals:
Min 1Q Median 3Q Max
-3.2198 -0.5668 0.0171 0.5619 14.6442
Random effects:
Groups Name Variance Std.Dev. Corr
participant (Intercept) 4.357e-02 0.208723
conditionsize 3.872e-03 0.062228 -0.21
congruentTRUE 1.397e-03 0.037370 -0.10 -0.09
item (Intercept) 5.222e-05 0.007226
Residual 1.090e-01 0.330184
Number of obs: 16392, groups: participant, 55; item, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 1.456e+00 3.973e-02 5.474e+01 36.649 <2e-16 ***
languageXhosa 7.739e-03 5.733e-02 5.387e+01 0.135 0.8931
conditionsize 1.324e-02 1.689e-02 2.359e+01 0.784 0.4408
congruentTRUE 2.662e-02 1.419e-02 1.354e+01 1.876 0.0823 .
languageXhosa:conditionsize -1.772e-02 2.236e-02 8.650e+01 -0.792 0.4303
languageXhosa:congruentTRUE -1.545e-02 1.788e-02 1.211e+02 -0.864 0.3891
conditionsize:congruentTRUE -3.440e-02 1.744e-02 8.261e+00 -1.972 0.0829 .
languageXhosa:conditionsize:congruentTRUE 4.615e-02 2.076e-02 1.626e+04 2.223 0.0262 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) lnggXh cndtns cnTRUE lnggX: lX:TRU c:TRUE
languageXhs -0.682
conditionsz -0.253 0.148
congrntTRUE -0.184 0.095 0.289
lnggXhs:cnd 0.162 -0.239 -0.617 -0.136
lnggXh:TRUE 0.109 -0.163 -0.143 -0.588 0.235
cndtns:TRUE 0.110 -0.050 -0.516 -0.619 0.255 0.323
lnggX::TRUE -0.061 0.092 0.284 0.342 -0.470 -0.586 -0.552
\(R^2\):
[1] 0.2783126
We apply model criticism and see that the interaction is still significant.
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: RTinv ~ language * condition * congruent + (1 + condition + congruent | participant) + (1 | item)
Data: df3
REML criterion at convergence: 6807.6
Scaled residuals:
Min 1Q Median 3Q Max
-2.81499 -0.60413 0.03325 0.63064 2.97502
Random effects:
Groups Name Variance Std.Dev. Corr
participant (Intercept) 4.457e-02 0.211109
conditionsize 3.611e-03 0.060095 -0.23
congruentTRUE 8.312e-04 0.028831 -0.12 0.22
item (Intercept) 9.442e-05 0.009717
Residual 8.685e-02 0.294711
Number of obs: 16180, groups: participant, 55; item, 8
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 1.446e+00 4.030e-02 5.544e+01 35.868 < 2e-16 ***
languageXhosa 1.064e-02 5.778e-02 5.369e+01 0.184 0.854607
conditionsize 1.499e-02 1.729e-02 1.695e+01 0.867 0.398196
congruentTRUE 3.141e-02 1.428e-02 8.598e+00 2.199 0.056791 .
languageXhosa:conditionsize -2.008e-02 2.096e-02 8.247e+01 -0.958 0.340960
languageXhosa:congruentTRUE -2.633e-02 1.537e-02 1.354e+02 -1.713 0.089030 .
conditionsize:congruentTRUE -3.750e-02 1.869e-02 6.429e+00 -2.006 0.088469 .
languageXhosa:conditionsize:congruentTRUE 6.175e-02 1.866e-02 1.605e+04 3.309 0.000937 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) lnggXh cndtns cnTRUE lnggX: lX:TRU c:TRUE
languageXhs -0.677
conditionsz -0.268 0.140
congrntTRUE -0.197 0.080 0.408
lnggXhs:cnd 0.165 -0.246 -0.564 -0.179
lnggXh:TRUE 0.107 -0.161 -0.202 -0.499 0.360
cndtns:TRUE 0.116 -0.037 -0.540 -0.657 0.205 0.282
lnggX::TRUE -0.054 0.082 0.248 0.304 -0.450 -0.612 -0.460
The new \(R^2\) indicates a much better fit.
[1] 0.3297167
Autocorrelation of RTs
In the plots below, we see that there are no clear patterns in RTs over trials or over the duration of the experiments.
Still, in this very fast-paced experiment with many trials, it might be the case that response latencies are dependent on RTs in previous trials, particularly at lag\(_{t-1}\).

We therefore need to check for and possibly control for the RT variable being correlated with itself.
However, the following autocorrelation plots with a subsample of thirty participants suggest that there’s no evidence for significant autocorrelation between RTs for most of the participants. We can therefore leave RTs at t-1 out of the model.
Quantiles to be plotted:
0% 3.448276% 6.896552% 10.34483% 13.7931% 17.24138% 20.68966% 24.13793% 27.58621% 31.03448%
-0.586671730 -0.397174279 -0.321054119 -0.277102594 -0.237523948 -0.207245033 -0.182002424 -0.158051947 -0.130596415 -0.113514347
34.48276% 37.93103% 41.37931% 44.82759% 48.27586% 51.72414% 55.17241% 58.62069% 62.06897% 65.51724%
-0.097340640 -0.065118054 -0.041524692 -0.022997554 -0.002101595 0.023375358 0.045085477 0.062544878 0.083833946 0.105303793
68.96552% 72.41379% 75.86207% 79.31034% 82.75862% 86.2069% 89.65517% 93.10345% 96.55172% 100%
0.131932183 0.153693915 0.178259327 0.202648323 0.238750555 0.271158576 0.311439933 0.369299480 0.432781245 0.705182612

Summary
Methods:
- The ex-Gaussian approach failed to detect significant effects in the \(\mu\) and \(\tau\) parameters. However, more aggressive trimming might yield significant results in some of these analyses.
- This is an interesting approach, but also quite limited in that it requires aggregating the data.
- The same may be true for the conflict effect and the coefficient of variability.
- A three-way interaction was significant in all mixed-effects regression models varying in their random structures before and after applying model criticism.
The three-way interaction suggests that:
- Afrikaans speakers’ RTs were more affected by congruence in the ‘height’ condition
- Xhosa speakers were more affected by congruence in the ‘size’ condition
Xhosa speakers appear to have slightly slower responses overall, but this may be due to greater variability, since, as we saw in the ex-Gaussian analysis, they actually have smaller \(\mu\), but larger \(\tau\) values compared with the Afrikaans group.
Experiment 3: Two-alternative forced-choice task
Whereas experiment 2 was designed to test implicit associations between space and pitch, experiment 3 is aimed at explicit associations where participants choose between height and size mappings in a mixed condition, and whether to match high/low pitch with high vs low position and small vs. big.
Methods
We recruited 30 native speakers of Xhosa and 30 native speakers of Afrikaans for experiment 3.
Participants performed a two-alternative forced-choice task targeting explicit space-pitch associations by pairing pitch with circles differing in vertical position (high/low, height condition) or size (small, big). In a third condition (or trial type), participants had to choose between mapping pitch to either a high/low or a small/big circle.
There were 40 trials per participant. The order of trial types was randomised.
We also recorded RTs in each trial.
We again use mixed-effects regression to analyse the data.
Hypotheses
- Xhosa speakers’ will be more likely to pair pitch with ‘size’ in the mixed condition compared with Afrikaans speakers.
- No group differences in stimulus pairing in the ‘height’ and ‘size’ conditions. E.g. high pitch will consistently be paired with high and small circles.
- RTs will be slower in the mixed condition for both groups.
Mixed condition
The plot and output below indicate that Xhosa speakers, when given the possibility of pairing either visual height or size with pitch, are less likely to select size than Afrikaans speakers.

Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: choiceDimension ~ voice * language + (1 | participant)
Data: df_m
AIC BIC logLik deviance df.resid
587.4 609.4 -288.7 577.4 592
Scaled residuals:
Min 1Q Median 3Q Max
-5.0581 -0.5260 0.2646 0.4567 3.4811
Random effects:
Groups Name Variance Std.Dev.
participant (Intercept) 2.32 1.523
Number of obs: 597, groups: participant, 61
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.3472 0.3720 3.622 0.000293 ***
voicelow 1.0147 0.3516 2.886 0.003899 **
languageXhosa -2.1798 0.5143 -4.238 2.25e-05 ***
voicelow:languageXhosa 1.4295 0.4846 2.950 0.003180 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) voiclw lnggXh
voicelow -0.358
languageXhs -0.731 0.255
vclw:lnggXh 0.294 -0.709 -0.418
We find an interaction effect between language and voice frequency.
Contrary to our expectations, Afrikaans speakers were more likely to pair small circles with high-pitched voices rather than circles with a high position.
The opposite patterns was found for Xhosa speakers, who preferred the ‘height’ mapping.
For low-pitched voices, both group consistently favoured the ‘size’ mapping.
Height condition

Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: choiceName ~ voice * language + (1 + voice | participant)
Data: df_h
AIC BIC logLik deviance df.resid
735.6 766.4 -360.8 721.6 600
Scaled residuals:
Min 1Q Median 3Q Max
-2.2522 -0.6824 0.2859 0.5909 2.2376
Random effects:
Groups Name Variance Std.Dev. Corr
participant (Intercept) 4.828 2.197
voicelow 8.511 2.917 -0.94
Number of obs: 607, groups: participant, 61
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.8408 0.4730 -1.778 0.07547 .
voicelow 1.6184 0.6233 2.596 0.00942 **
languageXhosa 0.7860 0.6648 1.182 0.23710
voicelow:languageXhosa -1.3244 0.8702 -1.522 0.12804
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) voiclw lnggXh
voicelow -0.892
languageXhs -0.714 0.637
vclw:lnggXh 0.641 -0.717 -0.897
In the ‘height’ condition, we find a significant effect for voice frequency. The trend further suggests an interaction such that Afrikaans speakers are more consistent in mapping high/low voices to high/low circles.
Size condition

Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: choiceName ~ voice * language + (1 | participant)
Data: df_s
AIC BIC logLik deviance df.resid
577.1 599.1 -283.5 567.1 603
Scaled residuals:
Min 1Q Median 3Q Max
-3.0099 -0.4562 -0.2429 0.3899 3.8936
Random effects:
Groups Name Variance Std.Dev.
participant (Intercept) 0.9321 0.9654
Number of obs: 608, groups: participant, 61
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.8822 0.2976 6.324 2.55e-10 ***
voicelow -4.2257 0.4014 -10.527 < 2e-16 ***
languageXhosa -2.1984 0.3913 -5.619 1.92e-08 ***
voicelow:languageXhosa 2.5268 0.4982 5.072 3.93e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) voiclw lnggXh
voicelow -0.546
languageXhs -0.774 0.436
vclw:lnggXh 0.417 -0.769 -0.482
In the ‘size’ condition, we see a clear interaction between language and voice frequency.
The two language groups showed high agreement in pairing low pitch with big, rather than small circles.
Interestingly, Xhosa speakers also showed a slight preference for pairing high pitch with big circles, whereas Afrikaans speakers more consistently paired high pitch with small circles.
RT analyses
Finally, as large RTs might be indicative of uncertainty, we’ll examine whether there are significant differences in RTs related to the independent variables.
The data has been trimmed to only include responses faster than 20 seconds.
Not shown here are QQ-plots and correlation coefficients indicating that the log-normal transformation provides the best fit for our data. We will also apply model criticism and only examine the final model.
As the condition variable has more than two levels for comparison, we’ll base our analysis on an anova table summarizing the regression output.

Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
language 2.3358 2.3358 1 51.38 8.5757 0.005068 **
voice 1.9138 1.9138 1 2042.38 7.0264 0.008094 **
condition 20.0421 10.0211 2 2041.88 36.7923 < 2.2e-16 ***
language:voice 0.9849 0.9849 1 2042.38 3.6160 0.057366 .
language:condition 0.0970 0.0485 2 2041.88 0.1782 0.836826
voice:condition 0.6134 0.3067 2 2047.02 1.1261 0.324507
language:voice:condition 0.2553 0.1276 2 2047.02 0.4686 0.625950
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The interaction plots and anova table reveal significant main effects of language, voice frequency and condition with no interaction effects. Xhosa speakers generally took longer in selecting visual stimuli, which was to be expected on the basis of their lower consistency in all conditions.
Interestingly, our expectation that the mixed condition would give rise to the longest RTs is not supported by the results. Instead the ‘height’ condition consistently gave rise to slower decisions despite being the more dominant mapping in speech.
Summary
This experiment yielded some very interesting and surprising results.
Overall, Xhosa speakers were less consistent in how they mapped space to pitch, both when choosing visual stimuli of opposite spatial polarities, and when choosing between height and size.
Surprisingly, Afrikaans speakers consistently preferred the size mapping for both high and low-pitched voices, whereas Xhosa speakers showed a preference for ‘height’ in cases with low pitch, and ‘size’ in cases with high pitch.
Another striking finding was that, in the size condition, Xhosa speakers showed a preference for mapping big circles to both low pitch and high pitch, though to a lesser extent.
There appears to be more individual variation for Xhosa speakers in this task, both in choosing between mappings, as well as choosing polarity correspondences within particular mappings.
In this experiment, linguistic metaphors proved to be poor predictors of non-linguistic choices with regards to spatial mappings.
Conclusion
In the series of experiments, we examined spatial metaphors for pitch from three angles: language production, performance in a nonverbal implicit association task and nonverbal judgements in an explicit association task.
Our language production findings show that ‘height’ is used in Adrikaans, whereas Xhosa speakers also used ‘size’. Interestingly, and in line with our findings from a previous study, vertical gestures frequently accompany ‘height’ but also ‘size’ metaphors. The speech material does not allow us determine whether gestural indications of height might refer to the physical size/height of a person likely to produce the heard sounds.
In the RT task, we found a three-way interaction that followed our predictions. However, methods requiring data aggregation failed to detect this effect. I would suggest reporting the statistically more sophisticated mixed-effect regfression model with maximal random structure, but perhaps also noting that an ex-Gaussian approach failed to detect any significant effects. As the last interaction plot indicates, the effect is far from spectacular (as opposed to previous findings in the literature).
The results from the hird experiment seem more puzzling. We did not expect Afrikaans speakers to consistently map pitch to ‘size’. Nor did we expect Xhosa speakers to choose ‘height’/‘size’ depending on the pitch of the voice.
In the height and size conditions, Afrikaans speakers paired pitch with high/low/big/small as expected, whereas Xhosa speakers were much less consistent, with the exception that they had a clear preference for pairing “low” pitch with bic circles as opposed to small circles. Further studies with other types of stimuli might shed light on the latter findings
As I see it, our findings point in different directions and only support the very general idea that the conceptualisation of pitch is, to some extent, spatial, but flexible. The factorial designs demonstrated different effects of manipulating visual size and height for the two groups, but only in the case of mixed-effects regression. The role of language in shaping the conceptualisation of pitch is unclear, but far from deterministic. This is particularly evident from the contradictory findings in experiment 3.
References and readings
Abutalebi, J., Guidi, L., Borsa, V., Canini, M., Della Rosa, P. A., Parris, B. A., & Weekes, B. S. (2015). Bilingualism provides a neural reserve for aging populations. Neuropsychologia, 69, 201–210. https://doi.org/10.1016/j.neuropsychologia.2015.01.040
Baayen, H. R., & Milin, P. (2010). Analyzing reaction times. International Journal of Psychological Research, 3(2), 12. https://doi.org/10.21500/20112084.807
Calabria, M., Hernandez, M., Martin, C. D., & Costa, A. (2011). When the Tail Counts: The Advantage of Bilingualism Through the Ex-Gaussian Distribution Analysis. Frontiers in Psychology, 2. https://doi.org/10.3389/fpsyg.2011.00250
Henriquez-Henriquez, M. P., Billeke, P., Henriquez, H., Zamorano, F. J., Rothhammer, F., & Aboitiz, F. (2015). Intra-Individual Response Variability Assessed by Ex-Gaussian Analysis may be a New Endophenotype for Attention-Deficit/Hyperactivity Disorder. Frontiers in Psychiatry, 5. https://doi.org/10.3389/fpsyt.2014.00197
Lachaud, C. M., & Renaud, O. (2011). A tutorial for analyzing human reaction times: How to filter data, manage missing values, and choose a statistical model. Applied Psycholinguistics, 32(02), 389–416. https://doi.org/10.1017/S0142716410000457
Marsden, E., Thompson, S., & Plonsky, L. (2018). A methodological synthesis of self-paced reading in second language research. Applied Psycholinguistics, 39(05), 861–904. https://doi.org/10.1017/S0142716418000036
Ratcliff, R. (u.å.). Methods for Dealing With Reaction Time Outliers, 23. Whelan, R. (2010). Effective analysis of reaction time data. The Psychological Record, 58(3). Hentet fra https://opensiuc.lib.siu.edu/tpr/vol58/iss3/9
LS0tCnRpdGxlOiAiUmVwb3J0IG9uIFN0ZWxsZW5ib3NjaCBkYXRhIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGRmX3ByaW50OiBrYWJsZQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSxlcnJvcj1GQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4KQpgYGAKCiMgRXhwZXJpbWVudCAxOiBEaXJlY3Rvci1NYXRjaGVyIFRhc2sKCiMjIE1ldGhvZHMKCkZvciB0aGlzIGV4cGVyaW1lbnQsIHdlIHJlY3J1aXRlZCAxNSBuYXRpdmUgc3BlYWtlcnMgb2YgWGhvc2EgYW5kIDE1IG5hdGl2ZSBzcGVha2VycyBvZiBBZnJpa2FhbnMuIApFYWNoIHBhcnRpY2lwYW50IGRlc2NyaWJlZCAyNSBzdW5nIHRvbmUgcGFpcnMgdG8gYSBjb25mZWRlcmF0ZSBtYXRjaGVyLgoKIyMgSHlwb3RoZXNlcwoKLSBBZnJpa2FhbnMgc3BlYWtlcnMgd2lsbCBtYWlubHkgdXNlIHRoZSAnaGVpZ2h0JyBtZXRhcGhvciBpbiBzcGVlY2guCi0gWGhvc2Egc3BlYWtlcnMsIHdpbGwgdXNlIGJvdGggJ2hlaWdodCcgYW5kICdzaXplJyBmbGV4aWJseS4KLSBCYXNlZCBvbiBwcmV2aW91cyBmaW5kaW5ncywgd2UgZXhwZWN0IGdlc3R1cmVzIGFjY29tcGFueWluZyAnaGVpZ2h0JyB0byBjb25zaXN0ZW50bHkgY29udmVyZ2Ugd2l0aCB0aGUgc3BhdGlhbCBtYXBwaW5ncyBpbnZva2VkIGJ5IGV4cHJlc3Npb25zIGxpa2UgImhpZ2giIGFuZCAibG93Ii4gCi0gQ29udmVyc2VseSwgd2UgZXhwZWN0IGdlc3R1cmVzIGFjY29tcGFueWluZyAnc2l6ZScgaW4gc3BlZWNoIHRvIGluZGljYXRlICdzaXplJyB0byBhIGxlc3NlciBleHRlbnQsIGFuZCBzb21ldGltZXMgcmV2ZWFsIHNwYXRpYWwgbWFwcGluZ3MgY29uc2lzdGVudCB3aXRoICdoZWlnaHQnIG1ldGFwaG9ycy4KCmBgYHtyIGVjaG8gPUZ9CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyBMT0FEIFBBQ0tBR0VTIEFORCBEQVRBICMjIyMjIyMjIyMjIyMjIyMjCgpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KEhtaXNjKQpsaWJyYXJ5KHN0ZWxsZW5ib3NjaCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkocmV0aW1lcykKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdncmlkZ2VzKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGdhbWxzcykKbGlicmFyeSh0aWR5dmVyc2UpCgpzZXQuc2VlZCgxMjI4KQoKZGYgPC0gcmVhZF9jc3YoInN0dWR5M19wcm9kdWN0aW9uLWtvcGkvc3R1ZHkzX3Byb2R1Y3Rpb25fZGF0YV9jbGVhbiIpCiMlPiUKICMgc2VsZWN0KC1YMSkKCm15X3RoZW1lIDwtIGZ1bmN0aW9uKCkgewogIHRoZW1lX2J3KCkgKwogICAgdGhlbWUobGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLAogICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIixzaXplID0gMTQpLAogICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyBQTE9UIFRIRU1FICMjIyMjIyMjIyMjIyMjIyMjCgojIG15X3RoZW1lIDwtIGZ1bmN0aW9uKCkgewojICAganRvb2xzOjp0aGVtZV9hcGEoKSArCiMgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgICAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kICA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgICB0aGVtZShwYW5lbC5ib3JkZXIgICAgID0gZWxlbWVudF9ibGFuaygpKSArICAgICAgICAgICAgICAgICAgICAgICAjIGZhY2V0IGJvcmRlcgojICAgICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSArICAgICAgICAgICAgICAgICAgIyBmYWNldCB0aXRsZSBiYWNrZ3JvdW5kCiMgICAgIHRoZW1lKHN0cmlwLnRleHQueCAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSAgID0gMjApKSArCiMgICAgIHRoZW1lKGF4aXMudGl0bGUueCAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSAgID0gMjAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAyNSwgciA9IDAsIGIgPSAwLCBsID0gMCkpKSArCiMgICAgIHRoZW1lKGF4aXMudGl0bGUueSAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSAgID0gMjAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAwLCByID0gMjUsIGIgPSAwLCBsID0gMCkpKSArCiMgICAgIHRoZW1lKGF4aXMudGV4dC55ICAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSAgID0gMjApKSArCiMgICAgIHRoZW1lKGF4aXMudGV4dC54ICAgICAgPSAgZWxlbWVudF90ZXh0KHNpemUgID0gMjApKSArCiMgICAgIHRoZW1lKHBhbmVsLnNwYWNpbmcgICAgPSB1bml0KDIsICJsaW5lcyIpKSArCiMgICAgIHRoZW1lKHBsb3QubWFyZ2luICAgICAgPSB1bml0KGMoLjUsIC41LCAuNSwgLjUpLCAiY20iKSkgKwojICAgICB0aGVtZShwbG90LnRpdGxlICAgICAgID0gZWxlbWVudF90ZXh0KHNpemUgICA9IDI0LCB2anVzdCA9IDUsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKHQgPSAyNSwgciA9IDAsIGIgPSAyNSwgbCA9IDApKSkKIyB9CgpgYGAKCiMjIFNwZWVjaCByZXN1bHRzCgojIyMgTnVtYmVyIG9mIG1ldGFwaG9yaWNhbCBleHByZXNzaW9ucyB1c2VkIGluIHNwZWVjaAoKYGBge3J9CnRhYmxlKGRmJExhbmd1YWdlKQpgYGAKCiMjIyBXZWlnaHRlZCBtZWFuIGRpc3RyaWJ1dGlvbnMgb2YgbWV0YXBob3JzIGluIHNwZWVjaAoKSW4gdGhlIGZpZ3VyZSBiZWxvdywgd2UgZmluZCB0aGF0ICdoZWlnaHQnIGlzIGRvbWluYW50IGluIGJvdGggbGFuZ3VhZ2VzLiAnU2l6ZScgaXMgb25seSB1c2VkIGluIFhob3NhLCB0aG91Z2ggbGVzcyB0aGFuIGV4cGVjdGVkIG9uIHRoZSBiYXNpcyBvZiBvdXIgcGlsb3QgZGF0YS4KCmBgYHtyfQpkZiAlPD4lIG11dGF0ZShNZXRhcGhvciA9IGZjdF9sdW1wKE1ldGFwaG9yLG49MykpCgpzcGVlY2hfcmVzdWx0cyA8LSBkZiAgICAgICAgICAgICAgICU+JQogIGdyb3VwX2J5KExhbmd1YWdlLCBpZCwgTWV0YXBob3IpICU+JQogIHN1bW1hcmlzZShuPW4oKSkgICAgICAgICAgICAgICAgICU+JQogIGNvbXBsZXRlKE1ldGFwaG9yLCBuZXN0aW5nKGlkKSwgCiAgICAgICAgICAgZmlsbCA9IGxpc3QobiA9IDApKSAgICAgJT4lCiAgbXV0YXRlKGZyZXEgPSBuIC8gc3VtKG4pLCAKICAgICAgICAgd3Q9c3VtKG4pKSAgICAgICAgICAgICAgICAlPiUKICBncm91cF9ieShMYW5ndWFnZSxNZXRhcGhvcikgICAgICAlPiUKICBzdW1tYXJpc2UoRnJlcSA9IHdlaWdodGVkLm1lYW4oZnJlcSx3dCksCiAgICAgICAgICAgICAgc2UgPSBzcXJ0KHd0ZC52YXIoZnJlcSx3dCkpL3NxcnQobGVuZ3RoKHVuaXF1ZShpZCkpKSkgJT4lCiAgZmlsdGVyKEZyZXEgPiAwKQoKI3NwZWVjaF9yZXN1bHRzCgpzcGVlY2hfcmVzdWx0cyAlPiUKICBnZ3Bsb3QoYWVzKHg9TWV0YXBob3IseT1GcmVxKSkgKwogIGdlb21fYmFyKHN0YXQgICAgID0gImlkZW50aXR5IiwKICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIsCiAgICAgICAgICAgZmlsbCAgICAgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1siZ3JlZW4iXSwKICAgICAgICAgICBhbHBoYSAgICA9IC45KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1GcmVxLXNlLHltYXg9RnJlcStzZSksd2lkdGg9LjIpICsKICBmYWNldF9ncmlkKH5MYW5ndWFnZSwgc2NhbGU9ImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIHRoZW1lKGF4aXMudGV4dC54ICAgID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50aWNrcy54ICAgPSBlbGVtZW50X2JsYW5rKCkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxKSkgKwogICNnZ3RpdGxlKCJNZXRhcGhvcnMgSW4gU3BlZWNoIikgKwogIHlsYWIoIndNZWFuIHByb3BvcnRpb25zIikgKwogIHhsYWIoIk1ldGFwaG9ycyIpICsKICBteV90aGVtZSgpCmBgYAoKIyMgR2VzdHVyZSBmcmVxdWVuY3kKCkluIHRoZSB0YWJsZSBhbmNoIGZpZ3VyZSBiZWxvdywgd2Ugc2VlIHRoYXQgWGhvc2Egc3BlYWtlcnMgZ2VzdHVyZWQgbW9yZSB3aGVuIHVzaW5nIG1ldGFwaG9ycyBpbiBzcGVlY2guIFdpdGhpbiB0aGUgdHdvIGdyb3VwcywgdGhlIGJ5LW1ldGFwaG9yIGdlc3R1cmUgcmF0ZXMgd2VyZSBjb21wYXJhYmxlLgoKIyMjIFByb3BvcnRpb24gb2YgbWV0YXBob3JpY2FsIGV4cHJlc3Npb25zIHdpdGggY28tc3BlZWNoIGdlc3R1cmVzCgpgYGB7cn0KZGYgJT4ldGFieWwoTGFuZ3VhZ2UsR2VzdHVyZSkgJT4lIGFkb3JuX3BlcmNlbnRhZ2VzKCkKYGBgCgojIyMgR2VzdHVyZSBmcmVxdWVuY3kgYnkgbWV0YXBob3IKCmBgYHtyfQpnZXN0dXJlX2ZyZXEgPC0gZGYgJT4lIAogIGdyb3VwX2J5KExhbmd1YWdlLGlkLE1ldGFwaG9yLEdlc3R1cmUpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBjb21wbGV0ZShHZXN0dXJlLCBuZXN0aW5nKGlkKSwgCiAgICAgICAgICAgZmlsbCA9IGxpc3QobiA9IDApKSAgICAgJT4lCiAgbXV0YXRlKGZyZXEgPSBuIC8gc3VtKG4pLCAKICAgICAgICAgd3Q9c3VtKG4pKSAlPiUKICBncm91cF9ieShMYW5ndWFnZSxNZXRhcGhvcixHZXN0dXJlKSAgICAgICU+JQogIHN1bW1hcmlzZShGcmVxID0gd2VpZ2h0ZWQubWVhbihmcmVxLHd0KSwKICAgICAgICAgICAgc2UgPSBzcXJ0KHd0ZC52YXIoZnJlcSx3dCkpL3NxcnQobGVuZ3RoKHVuaXF1ZShpZCkpKSkgJT4lCiAgZmlsdGVyKEdlc3R1cmUgPT0xKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1HZXN0dXJlKQoKI2dlc3R1cmVfZnJlcQoKZ2VzdHVyZV9mcmVxICU+JQogIGdncGxvdChhZXMoeD1NZXRhcGhvcix5PUZyZXEpKSArCiAgZ2VvbV9iYXIoc3RhdCAgICAgPSAiaWRlbnRpdHkiLAogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwKICAgICAgICAgICBmaWxsICAgICA9IHN0ZWxsZW5ib3NjaF9jb2xvdXJzWyJncmVlbiJdLAogICAgICAgICAgIGFscGhhICAgID0gLjkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUZyZXEtc2UseW1heD1GcmVxK3NlKSx3aWR0aD0uMikgKwogIGZhY2V0X2dyaWQofkxhbmd1YWdlLCBzY2FsZT0iZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggICAgPSBlbGVtZW50X3RleHQoKSwKICAgICAgICBheGlzLnRpY2tzLnggICA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEpKSArCiAgI2dndGl0bGUoIkdlc3R1cmVzIFdpdGggTWV0YXBob3JzIEluIFNwZWVjaCIpICsKICB5bGFiKCJ3TWVhbiBwcm9wb3J0aW9ucyIpICsKICB4bGFiKCJNZXRhcGhvcnMiKSArIAogIG15X3RoZW1lKCkKYGBgCgojIyBTcGVlY2gtZ2VzdHVyZSBjb252ZXJnZW5jZQoKSGVyZSwgd2Ugb25seSBjb25zaWRlciB0aGUgc3BhdGlhbCBtZXRhcGhvcnMgJ2hlaWdodCcgYW5kICdzaXplJy4KPHA+Ckdlc3R1cmVzIHdlcmUgY29kZWQgZm9yIGRpbWVuc2lvbiAoaW4gdGVybXMgb2YgbW92ZW1lbnQgYW5kIGxvY2F0aW9uKSBhbmQgaGFuZHNoYXBlIChpLmUuIGZsYXQgaGFuZCwgImdyaXAiKSBhbmQgc3BlZWNoLWdlc3R1cmUgcGFpcnMgd2VyZSB0aGVuIGNvZGVkIGFzIGVpdGhlciAieWVzIiAoY29udmVyZ2VudCksICJubyIgKGRpdmVyZ2VudCwgZS5nLiAnc2l6ZScgaW4gc3BlZWNoIHdpdGggdmVydGljYWwgZ2VzdHVyZXMpLCAibWl4ZWQiIChib3RoICdoZWlnaHQnIGFuZCAnc2l6ZScgbWFwcGluZ3MgZXhwcmVzc2VkIGluIGdlc3R1cmUpIGFuZCAibi9hIiAoZ2VzdHVyZXMgbm90IGNsZWFybHkgZXhwcmVzc2luZyBzcGF0aWFsIG1hcHBpbmdzKS4KCmBgYHtyfQpkZjIgPSBkZiAlPiUKICBmaWx0ZXIoTWV0YXBob3IgPT0gIkhlaWdodCIgfCBNZXRhcGhvciA9PSAiU2l6ZSIsIAogICAgICAgICBHZXN0dXJlID09IDEpICU+JQogIGRyb3BsZXZlbHMoKSAlPiUKICBtdXRhdGUoSGFuZHNoYXBlID0gZmN0X2NvbGxhcHNlKEhhbmRzaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaXAgPSBjKCJuYXJyb3cgZ3JpcCIsIm5ldXRyYWwgZ3JpcCIsIndpZGUgZ3JpcCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBjKCJub25lIiwib3RoZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRIID0gYygiZmxhdCBIIiwiZmxhdCBWIiwicG9pbnQiKSkpICU+JQogIAogIG11dGF0ZShjb252ZXJnZW5jZSA9IGNhc2Vfd2hlbiggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEhFSUdIVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YXBob3IgICA9PSAiSGVpZ2h0IiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRGltZW5zaW9uICA9PSAidmVydCIgICB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGltZW5zaW9uICA9PSAibm9uZSIpICAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kc2hhcGUgID09ICJmbGF0SCIgIH4gInllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFwaG9yICAgPT0gIkhlaWdodCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbiAgPT0gInZlcnQiICAgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhhbmRzaGFwZSAgPT0gImZsYXRIIiB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZHNoYXBlICA9PSAib3RoZXIiKSB+ICJ5ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFwaG9yICAgPT0gIkhlaWdodCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpbWVuc2lvbiAgPT0gInZlcnQiICAgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRzaGFwZSAgPT0gImdyaXAiICAgfiAibWl4ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhcGhvciAgID09ICJIZWlnaHQiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaW1lbnNpb24gID09ICJzaXplIiAgIH4gIm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTSVpFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhcGhvciAgID09ICJTaXplIiAgICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEaW1lbnNpb24gID09ICJzaXplIiAgIHwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kc2hhcGUgID09ICJncmlwIikgIH4gInllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFwaG9yICAgPT0gIlNpemUiICAgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERpbWVuc2lvbiAgPT0gInZlcnQiICAgfCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kc2hhcGUgID09ICJmbGF0SCIpIH4gIm5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhcGhvciAgID09ICJTaXplIiAgICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaW1lbnNpb24gID09ICJ2ZXJ0IiAgICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kc2hhcGUgID09ICJncmlwIiAgIH4gIm1peGVkIikpIAoKIyB3aXRoIE5Bcwpjb252X3Jlc3VsdHMyIDwtIGRmMiAlPiUKICBncm91cF9ieShpZCxMYW5ndWFnZSxNZXRhcGhvcixjb252ZXJnZW5jZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGNvbXBsZXRlKGlkLCBuZXN0aW5nKGNvbnZlcmdlbmNlKSxmaWxsID0gbGlzdChuPTApKSAgICAlPiUKICBtdXRhdGUoZnJlcSA9IG4gLyBzdW0obiksIAogICAgICAgICB3dD1zdW0obikpICU+JQogIGdyb3VwX2J5KExhbmd1YWdlLE1ldGFwaG9yLGNvbnZlcmdlbmNlKSAgICAgICU+JQogIHN1bW1hcmlzZShGcmVxID0gd2VpZ2h0ZWQubWVhbihmcmVxLHd0KSwKICAgICAgICAgICAgc2UgPSBzcXJ0KHd0ZC52YXIoZnJlcSx3dCkpL3NxcnQobGVuZ3RoKHVuaXF1ZShpZCkpKSkgJT4lCiAgdW5ncm91cCAlPiUKICBtdXRhdGUoY29udmVyZ2VuY2UgPSBmY3RfZXhwbGljaXRfbmEoY29udmVyZ2VuY2UsbmFfbGV2ZWwgPSAibi9hIikpCgojY29udl9yZXN1bHRzMiAKCmNvbG91cnMgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1tjKDEsMiwzLDUpXQoKY29udl9yZXN1bHRzMiAlPiUKICAgIGdncGxvdChhZXMoeD1NZXRhcGhvcix5PUZyZXEsZmlsbD1jb252ZXJnZW5jZSkpICsKICAgIGdlb21fYmFyKHN0YXQgICAgID0gImlkZW50aXR5IiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwKICAgICAgICAgICAgIGFscGhhID0gLjkpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49RnJlcS1zZSx5bWF4PUZyZXErc2UpLAogICAgICAgICAgICAgICAgICB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM4QjczNTUiLCAiI0YwRTY4QyIsICIjMDA4QjQ1IiwgIiM2NjAwMjciKSkgKwogICAgZmFjZXRfZ3JpZCh+TGFuZ3VhZ2UsIHNjYWxlcyA9ImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpICsKICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLDEpKSArCiAgICAjZ2d0aXRsZSgiU3BlZWNoLUdlc3R1cmUgQ29udmVyZ2VuY2UiKSArCiAgICB5bGFiKCJ3TWVhbiBwcm9wb3J0aW9ucyIpICsKICAgIHhsYWIoIk1ldGFwaG9ycyIpICsKICAgIG15X3RoZW1lKCkKYGBgCgojIyBTdW1tYXJ5CgotIFdlIHNlZSB0aGF0IGluIGJvdGggbGFuZ3VhZ2VzLCB0aGUgJ2hlaWdodCcgbWV0YXBob3IgaXMgY29uc2lzdGVudGx5IGFjY29tcGFuaWVkIGJ5IGdlc3R1cmVzIGluZGljYXRpbmcgYSB2ZXJ0aWNhbCBzcGFjZS1waXRjaCBtYXBwaW5nLiAKLSBBcyBwcmVkaWN0ZWQsIHRoaXMgd2FzIGFsc28gdGhlIGNhc2Ugd2l0aCAnc2l6ZScgbWV0YXBob3JzIGluIFhob3NhLCB3aGljaCB3ZXJlIG1vc3RseSBhY2NvbXBhbmllZCBieSBzaW1pbGFyIGdlc3R1cmVzIGV4cHJlc3NpbmcgdmVydGljYWxpdHkuCgojIEV4cGVyaW1lbnQgMjogSW1wbGljaXQgQXNzb2NpYXRpb25zIFRhc2sKCmBgYHtyfQpmaWxlcyA8LSBsaXN0LmZpbGVzKCJSVF9hbmFseXNpc19TQS1rb3BpL1JUX2xvZ3Nfc3RlbGxlbmJvc2NoIixwYXR0ZXJuPSIqLmNzdiIsZnVsbC5uYW1lcyA9IFQpCgpkZiAgICA8LSBmaWxlcyAgICU+JQogIG1hcChyZWFkX2NzdjIpICU+JQogIHJlZHVjZShyYmluZCkKCmBgYAoKIyMgTWV0aG9kcwoKRm9yIHRoaXMgZXhwZXJpbWVudCwgd2UgcmVjcnVpdGVkIDMwIG5hdGl2ZSBzcGVha2VycyBvZiBYaG9zYSBhbmQgMzAgbmF0aXZlIHNwZWFrZXJzIG9mIEFmcmlrYWFucy4gCgpQYXJ0aWNpcGFudHMgcGVyZm9ybWVkIGFuIFJUIHRhc2sgdGFyZ2V0aW5nIGltcGxpY2l0IHNwYWNlLXBpdGNoIGFzc29jaWF0aW9ucyBieSBwYWlyaW5nIGNpcmNsZXMgZGlmZmVyaW5nIGluIHZlcnRpY2FsIHBvc2l0aW9uIChoaWdoL2xvdywgaGVpZ2h0IGNvbmRpdGlvbikgb3Igc2l6ZSAoc21hbGwsIGJpZykgd2l0aCBhIGhpZ2gvbG93IHBpdGNoZWQgdm9pY2UuIFBhcnRpY2lwYW50cyB3ZXJlIGFza2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHNvdW5kIGluIGVhY2ggdHJpYWwgd2FzIGhpZ2ggb3IgbG93LXBpdGNoZWQgd2l0aCBidXR0b24gcHJlc3Nlcy4KClRoZXJlIHdlcmUgMTYgYmxvY2tzICg4IGZvciBlYWNoIGNvbmRpdGlvbiksIHdpdGggMjAgdHJpYWxzIGluIGVhY2ggKDMyMCB0cmlhbHMgcGVyIHBhcnRpY2lwYW50KS4gVGhlIG9yZGVyIG9mIGJsb2NrcyB3YXMgcmFuZG9taXNlZC4KClN0aW11bHVzIHBhaXJzIHdlcmUgcHJlc2VudGVkIGZvciAyMDAgbXNlYyBhbmQgcGFydGljaXBhbnRzIHVzZWQgYnV0dG9uIHByZXNzZXMgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgc291bmQKCkhhbGYgb2YgdGhlIHN0aW11bHVzIHBhaXJzIHdlcmUgImluY29uZ3J1ZW50IiBpbiB0ZXJtcyBvZiB0aGUgc3BhY2UtcGl0Y2ggbWFwcGluZy4KCiMjIEh5cG90aGVzZXMKCkluIGV4cGVyaW1lbnQgb25lLCBBZnJpa2FhbnMgc3BlYWtlcnMgZGVzY3JpYmVkIHBpdGNoIGluIHRlcm1zIG9mICdoZWlnaHQnLCB3aGVyZWFzIFhob3NhIHNwZWFrZXJzIHVzZWQgJ3NpemUnIGluIGFkZGl0aW9uIHRvICdoZWlnaHQnLiBCYXNlZCBvbiB0aGVzZSBmaW5kaW5ncyBhbmQgcHJldmlvdXMgd29yaywgd2Ugd291bGQgZXhwZWN0IHRoZSBmb2xsb3dpbmc6CgotIEFmcmlrYWFucyBzcGVha2VycycgUlRzIHdvdWxkIGJlIHNsb3dlciAoaW4gcmVzcG9uc2UgdG8gaW5jb25ncnVlbnQgc3RpbXVsaSkgaW4gdGhlICdoZWlnaHQnIGNvbmRpdGlvbiB0aGFuIGluIHRoZSAnc2l6ZScgY29uZGl0aW9uLgotIFhob3NhIHNwZWFrZXJzJyBSVHMgd291bGQgYmUgc2xvd2VyIGluIHJlc3BvbnNlIHRvIGluY29uZ3J1ZW50IHN0aW11bGkgaW4gYm90aCBjb25kaXRpb25zLgoKV2UgdGh1cyBleHBlY3RlZCBhICp0aHJlZS13YXkgaW50ZXJhY3Rpb24gZWZmZWN0KiBiZXR3ZWVuIGxhbmd1YWdlLCBjb25kaXRpb24gYW5kIGNvbmdydWVuY2UuCgpgYGB7cn0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyMgQ0hBTkdFIFZBUklBQkxFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGYkbGFuZ3VhZ2VbZGYkbGFuZ3VhZ2UgPT0gIkFmcmthYW5zIl0gPC0gIkFmcmlrYWFucyIKZGYkbGFuZ3VhZ2VbZGYkbGFuZ3VhZ2UgPT0gIlhoIl0gPC0gIlhob3NhIgoKZGYkUlQgICAgICAgICAgPC0gYXMubnVtZXJpYyhkZiRSVCkgKiAxMDAwCmRmJHBhcnRpY2lwYW50IDwtIGZhY3RvcihkZiRwYXJ0aWNpcGFudCkKZGYkY29uZGl0aW9uICAgPC0gZmFjdG9yKGRmJGNvbmRpdGlvbikKZGYkc291bmQgICAgICAgPC0gZmFjdG9yKGRmJHNvdW5kKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyMgQUREIFZBUklBQkxFUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGYkbG9nUlQgPC0gbG9nKGRmJFJUKQpkZiRSVGludiA8LSAoMS9kZiRSVCkgKiAxMDAwCmRfdGFibGUgIDwtIGRhdGEudGFibGUoZGYpCmRfdGFibGVbICwgUlRsYWcgOj0gc2hpZnQoUlQpXQpkZiAgICAgICA8LSBhcy50aWJibGUoZF90YWJsZSkKZGYkUlRsYWdbZGYkdHJpYWwgPT0gMV0gPC0gTkEgCgpkZiAlPD4lIAogIGRwbHlyOjpncm91cF9ieShwYXJ0aWNpcGFudCkgJT4lIAogIG11dGF0ZSgKICAgIHRyaWFsQ291bnQgPSByb3dfbnVtYmVyKCksCiAgICBhY2N1cmFjeSAgID0gaWZlbHNlKChzb3VuZCA9PSAiaGlnaCIgJiBrZXkgPT0gImsiKSB8CiAgICAgICAgICAgICAgICAgICAgICAgIChzb3VuZCA9PSAibG93IiAmIGtleSA9PSAicyIpLCAxLCAwKSwKICAgIGNvbmdydWVudCAgPSBmYWN0b3IoaWZlbHNlKCgodmlzdWFsPT0iaGlnaCIgfCB2aXN1YWwgPT0ic21hbGwiKSAgJiBzb3VuZD09ImhpZ2giKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHZpc3VhbD09ImxvdyIgfCB2aXN1YWwgPT0iYmlnIikgJiBzb3VuZD09ImxvdyIpLFQsRikpLAogICAgaXRlbSAgICAgICA9IHBhc3RlMCh2aXN1YWwsc291bmQpKQoKIyBzZXZlcmFsIHBhcnRpY2lwYW50cyBhcHBlYXIgdG8gaGF2ZSByZXZlcnNlZCB0aGVpciBrZXkgcHJlc3NlcyBmb3IgaGlnaC9sb3cgCiMgdXBvbiBpbnNwZWN0aW9uIG9mIG92ZXJhbGwgYWNjdXJhY3kKI3Byb3AudGFibGUodGFibGUoZGYkYWNjdXJhY3ksZGYkcGFydGljaXBhbnQpLDIpCgpyZXZlcnNlZCA8LSBjKCJGMjQiLCJGMzEiLCJGMzQiLCJGMzUiLCJGMzkiLCJGNDMiLCJNMzEiLCJNMzYiLCJNNDIiLCJNNDQiKQpkZiRhY2N1cmFjeVtkZiRwYXJ0aWNpcGFudCAlaW4lIHJldmVyc2VkXSA8LSByZWNvZGUoZGYkYWNjdXJhY3lbZGYkcGFydGljaXBhbnQgJWluJSByZXZlcnNlZF0sIjAiPSIxIiwiMSI9IjAiKSAlPiUKICBhcy5udW1lcmljKCkKCiMjIyAxLiByZW1vdmUgcGFydGljaXBhbnRzIGR1ZSB0byBvbmUgaGFuZCBhbnN3ZXJzL2Nsb3NlZCBleWVzIGV0Yy4KCnJlbW92ZV9hZiA8LSBjKCJBUkY5IiwiQVJGMjgiLCJBUkYyOSIsIkFSRjMxIikKCmRmICU8PiUgCiAgZmlsdGVyKCFwYXJ0aWNpcGFudCAlaW4lIHJlbW92ZV9hZikgJT4lCiAgZHJvcGxldmVscygpCgpmdWxsIDwtIG5yb3coZGYpCmBgYAoKIyMgVHJpbW1pbmcgYW5kIGZpbHRlcmluZyB0aGUgZGF0YQoKUlQgZGF0YSBhcmUgZ2VuZXJhbGx5IGRpZmZpY3VsdCB0byBoYW5kbGUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMsIGFuZCB0aGUgbGl0ZXJhdHVyZSBwcm9wb3NlcyBhIG51bWJlciBvZiBwcm9jZWR1cmVzIHRvIHRyaW0gYW5kIGZpbHRlciB0aGUgZGF0YSBwcmlvciB0byBzdGF0aXN0aWNhbCBhbmFseXNlcy4gSW4gdGhlIG5leHQgc2VjdGlvbnMsIHdlIGdvIHRocm91Z2ggZWFjaCBzdGVwIGRpc2N1c3NlZCBpbiB0aGUgcmVsZXZhbnQgbGl0ZXJhdHVyZS4KCiMjIyBBY2N1cmFjeQoKSWRlYWxseSwgd2Ugd291bGQgd2FudCB0byByZW1vdmUgZGF0YSBmcm9tIHBhcnRpY2lwYW50cyBwZXJmb3JtaW5nIGF0IGNoYW5jZSBsZXZlbCBieSBwcmVzc2luZyBidXR0b25zIGF0IHJhbmRvbS4gVG8gbXkga25vd2xlZGdlLCB0aGVyZSBpc24ndCBhIHNwZWNpZmljIHRocmVzaG9sZCBmb3IgYWNjdXJhY3kgdGhhdCdzIHdpZGVseSBhZ3JlZWQgdXBvbiBmb3IgdGhpcyBvciBzaW1pbGFyIHRhc2tzLiBIb3dldmVyLCBpbnNwZWN0aW5nIHRoZSBkaXN0cmlidXRpb24gb2Ygb3ZlcmFsbCBhY2N1cmFjaWVzIGZvciBlYWNoIHBhcnRpY2lwYW50LCB3ZSBzZWUgdGhhdCBhIGZldyBwYXJ0aWNpcGFudHMgKG49NSkgY2xlYXJseSBzdGFuZCBvdXQgZnJvbSB0aGUgcmVzdC4KRGF0YSBmcm9tIHRoZXNlIHBhcnRpY2lwYW50cyBhcmUgbGVmdCBvdXQgaW4gdGhlIGxhdGVyIGFuYWx5c2VzLgoKQW5vdGhlciBtZXRob2QgdXNlZCBieSBBYnV0YWxlYmkgZXQgYWwuLCBpcyB0byB1c2UgY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIHRoZW4gc2V0IHRoZSB0aHJlc2hvbGQgYXQgdGhlIGxvd2VyIENJIGZvciBlYWNoIGxhbmd1YWdlIGdyb3VwLgpJIHRyaWVkIHRoaXMsIGFuZCBmb3VuZCB0aGF0IHRoaXMgd291bGQgaGF2ZSBmdXJ0aGVyIGV4Y2x1ZGVkIGRhdGEgZnJvbSBmb3VyIHBhcnRpY2lwYW50cy4KCmBgYHtyfQpvdmVyYWxsX2FjY3VyYWN5IDwtIGRmICAgICAgICAlPiUgCiAgdGFieWwoYWNjdXJhY3kscGFydGljaXBhbnQpICU+JSAKICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgICAgJT4lCiAgZmlsdGVyKGFjY3VyYWN5ID09IDEpICAgICAgICU+JSAKICBnYXRoZXIoKSAgICAgICAgICAgICAgICAgICAgJT4lCiAgZmlsdGVyKGtleSAhPSAiYWNjdXJhY3kiKSAgICU+JQogIGlubmVyX2pvaW4oZGYsIGJ5ID0gYygia2V5IiA9ICJwYXJ0aWNpcGFudCIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KGtleSwgdmFsdWUpICAgJT4lCiAgZmlsdGVyKCFkdXBsaWNhdGVkKGtleSx2YWx1ZSkpCgpvdmVyYWxsX2FjY3VyYWN5ICU+JSAKICBnZ3Bsb3QoYWVzKHk9dmFsdWUpKSArIAogIGdlb21fYm94cGxvdChmaWxsID0gdW5uYW1lKHN0ZWxsZW5ib3NjaF9jb2xvdXJzWyJraGFraSJdKSwKICAgICAgICAgICAgICAgb3V0bGllci5zaXplID0gNSwKICAgICAgICAgICAgICAgb3V0bGllci5hbHBoYSA9IC44LAogICAgICAgICAgICAgICB3aWR0aCA9MSkgKwogIG15X3RoZW1lKCkgKwogIGdndGl0bGUoIk1lYW4gYWNjdXJhY2llcyIpCiAgCgojIHdlIGNhbiBzZXQgdGhlIGFjY3VyYWN5IHRocmVzaG9sZCBhdCAuODUKIyBBbm90aGVyIG1ldGhvZCAoQWJ1dGFsZWJpIGV0IGFsLikgaXMgdG8gc2V0IHRocmVzaG9sZCBhdCBsb3dlciBncm91cCBDSQojIHRoaXMgd291bGQgZXhjbHVkZSA0IGFmcmlrYWFucyBzcGVha2Vycywgc2VlIEVYVFJBCgpyZW1vdmVfcGFydGljaXBhbnRzIDwtIG92ZXJhbGxfYWNjdXJhY3kgJT4lCiAgZmlsdGVyKHZhbHVlIDwgLjg1KSAlPiUgCiAgdW5pcXVlKCkgICAgICAgICAgICAKCmRmICU8PiUgZmlsdGVyKCFwYXJ0aWNpcGFudCAlaW4lIHJlbW92ZV9wYXJ0aWNpcGFudHMka2V5KQoKc3RlcDEgPC0gZnVsbCAtIG5yb3coZGYpCmBgYAoKIyMjIFNldHRpbmcgYW4gdXBwZXIgUlQgdGhyZXNob2xkCgpJbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSByZXNwb25zZSB0aW1lcyBiZWxvdywgd2Ugc2VlIGEgdmVyeSBsb25nIHJpZ2h0IHRhaWwuIFRoZSBzbG93ZXN0IHJlc3BvbnNlIGlzIDI4IHNlY29uZHMhCgpgYGB7cn0KIyBkaXN0cmlidXRpb24KZ2dwbG90KGRmLGFlcyhSVCkpICsgCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSB1bm5hbWUoc3RlbGxlbmJvc2NoX2NvbG91cnNbImtoYWtpIl0pKSArCiAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIG9mIFJUcyIpICsKICBteV90aGVtZSgpCmBgYAoKU2V0dGluZyBhbiB1cHBlciB0aHJlc2hvbGQgd2lsbCBhZmZlY3QgUlQgZXN0aW1hdGVzLCBidXQgdGhlc2UgZXh0cmVtZSB2YWx1ZXMgd291bGQgdGhlbXNlbHZlcyBoYXZlIGEgbWFqb3IgaW5mbHVlbmNlIG1ha2luZyBlc3RpbWF0ZXMgdW5yZWxpYWJsZS4KCkkgdGhlcmVmb3JlIHByb3Bvc2UgIm1pbGQiIGluaXRpYWwgdHJpbW1pbmcgb2YgdGhlIGRhdGEgZXhjbHVkaW5nIHJlc3BvbnNlIHNsb3dlciB0aGFuIGZpdmUgc2Vjb25kcyBhcyBpbmRpY2F0ZWQgaW4gdGhlIGZpZ3VyZXMgYmVsb3cuCgoKYGBge3J9CiMgem9vbSBpbgpkaXN0cl9jdXJ2ZSA8LSBnZ3Bsb3QoZGYsYWVzKFJUKSkgKyAKICBnZW9tX2RlbnNpdHkoZmlsbCA9IHVubmFtZShzdGVsbGVuYm9zY2hfY29sb3Vyc1sia2hha2kiXSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1MDAwLCAKICAgICAgICAgICAgIGNvbG91ciAgICAgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1siZ3JlZW4iXSwgCiAgICAgICAgICAgICBsaW5ldHlwZSAgID0gImRhc2hlZCIsIHNpemU9MSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltICA9IGMoMCwxMDAwMCkpICsKICBteV90aGVtZSgpCgpkaXN0cl9ib3ggPC0gZ2dwbG90KGRmLGFlcyh4PSIiLHk9UlQpKSArIAogIGdlb21faml0dGVyKGFscGhhICAgPSAuMikgKwogIGdlb21fYm94cGxvdChhbHBoYSAgPSAuNSwKICAgICAgICAgICAgICAgZmlsbCAgID0gdW5uYW1lKHN0ZWxsZW5ib3NjaF9jb2xvdXJzWyJzaGlyYXoiXSksCiAgICAgICAgICAgICAgIGNvbG91ciA9IHVubmFtZShzdGVsbGVuYm9zY2hfY29sb3Vyc1sia2hha2kiXSksCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDUwMDAsCiAgICAgICAgICAgICBjb2xvdXIgICAgID0gc3RlbGxlbmJvc2NoX2NvbG91cnNbImdyZWVuIl0sIAogICAgICAgICAgICAgbGluZXR5cGUgICA9ICJkYXNoZWQiLCBzaXplID0gMSkgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltICA9IGMoMCwxMDAwMCkpICsKICBteV90aGVtZSgpCgpncmlkLmFycmFuZ2UoZGlzdHJfY3VydmUsZGlzdHJfYm94LG5jb2w9Mix0b3AgPSBncmlkOjp0ZXh0R3JvYigiUlQgZGlzdHJpYnV0aW9ucyB3aXRoIDVzIHRocmVzaG9sZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRzaXplPTE4KSkpCgpkZiAlPD4lIGZpbHRlcihSVCA8IDUwMDApCgpzdGVwMiA8LSBmdWxsIC0gc3RlcDEgLSBucm93KGRmKQpgYGAKCgpJJ3ZlIGFsc28gY2hlY2tlZCBmb3IgcmVzcG9uc2VzIHRoYXQgYXJlIGZhc3RlciB0aGFuIDEwMCBtc2VjICh3aGljaCBhcmUgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgdG8gYmUgZXJyb3JzKSwgYnV0IGZvdW5kIG5vbmUuIFRoZSBmYXN0ZXN0IHJlY29yZGVkIFJUIGlzIDE2MCBtc2VjLgoKIyMjIEluZGl2aWR1YWwgdGhyZXNob2xkcwoKVGhlcmUgYXBwZWFycyB0byBiZSB3aWRlIGFncmVlbWVudCB0aGF0IGluZGl2aWR1YWwgdGhyZXNob2xkcyBzaG91bGQgYmUgc2V0IGJhc2VkIG9uIHRoZSBvdmVyYWxsIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgZWFjaCBwYXJ0aWNpcGFudCwgYnV0IGF1dGhvcnMgYWR2b2NhdGUgZGlmZmVyZW50IGxldmVscy4gQmFheWVuICYgTWlsaW4gYXJndWUgdGhhdCB0aGUgZnJlcXVlbnRseSB1c2VkIGxpbWl0IGF0IDIgKHBlcmhhcHMgYWxzbyAyLjUpIHN0YW5kYXJkIGRldmlhdGlvbnMgaXMgdG9vIGFnZ3Jlc3NpdmUgYW5kIHByb3Bvc2VzIGFuIHVwcGVyIGxpbWl0IG9mIDMgc3RhbmRhcmQgZGV2aWF0aW9ucyBhYm92ZSB0aGUgbWVhbiBjb3VwbGVkIHdpdGggbWluaW1hbCB0cmltbWluZyBiYXNlZCBvbiByZXNpZHVhbHMgYWZ0ZXIgZml0dGluZyBhIG1vZGVsLiBUaGlzIGlzIGVzc2VudGlhbGx5IHdoYXQgdGhleSBjYWxsIHBlcmZvcm1pbmcgIm1vZGVsIGNyaXRpY2lzbSIuCgpGb2xsb3dpbmcgdGhpcyBzdWdnZXN0aW9uLCB3ZSBzZXQgdGhlIHRocmVzaG9sZCBmb3IgaW5kaXZpZHVhbCBSVHMgYXQgdGhyZWUgU0RzIGFib3ZlIGluZGl2aWR1YWwgbWVhbnMuCgpgYGB7cn0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyMgU0VUIElORElWSURVQUwgUlQgVEhSRVNIT0xEUyAjIyMjIyMjIwoKbGltaXRzIDwtIGRmICU+JQogIGZpbHRlcihhY2N1cmFjeSA9PSAiMSIpICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50KSAgICU+JQogIHN1bW1hcmlzZShtID0gbWVhbihSVCksCiAgICAgICAgICAgIHVwcGVyX2xpbSA9IG1lYW4oUlQpICsgKDMqc2QoUlQpKSkKCmRmICU8PiUgCiAgI2ZpbHRlcihhY2N1cmFjeSA9PSAiMSIpICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50KSAlPiUKICBpbm5lcl9qb2luKGxpbWl0cywgYnkgPSAicGFydGljaXBhbnQiKSAlPiUKICBmaWx0ZXIoUlQgPD0gdXBwZXJfbGltKQoKc3RlcDMgPC0gZnVsbCAtIHN0ZXAxIC0gc3RlcDIgLSBucm93KGRmKQpgYGAKClRoZSB0YWJsZSBiZWxvdyBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBkYXRhIHJlbW92ZWQgaW4gZWFjaCBzdGVwLiBUaGUgYW1vdW50IG9mIGRpc2NhcmRlZCBkYXRhIHNlZW1zIHJlYXNvbmFibGUgYW5kIGluIGxpbmUgd2l0aCB3aGF0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIGFjY2VwdGFibGUuIE5vdGUgdGhhdCB0aGUgbWFqb3JpdHkgb2YgdGhlIGRpc2NhcmRlZCBkYXRhIGlzIGR1ZSB0byBwb29yIHBlcmZvcm1hbmNlLgoKYGBge3J9CnJlbW92ZWQgPC0gdGliYmxlKGBUcmltLiBwcm9jZWR1cmVgPSAKICAgICAgICAgICAgICAgIGMoIk5vIHRyaW1taW5nIiwiQWNjLiA+IC44NSIsICJSVCA8IDVzIiwiTSArIDNTRCIpLAogICAgICAgICAgICAgICAgICBuID0gYyhmdWxsLHN0ZXAxLHN0ZXAyLHN0ZXAzKSkKcmVtb3ZlZCAlPD4lIG11dGF0ZSgiJSIgPSBuIC8gZnVsbCAqIDEwMCkKCm5fcmVtb3ZlZCAgPSBzdW0oc3RlcDEsc3RlcDIsc3RlcDMpCnBjdF9yZW1vdmVkID0gcm91bmQobl9yZW1vdmVkL2Z1bGwgKiAxMDAsMikKdG90YWwgPSBjKCJUb3RhbCByZW1vdmVkIixuX3JlbW92ZWQscGN0X3JlbW92ZWQpCnJlbW92ZWQkYCVgID0gcm91bmQocmVtb3ZlZCRgJWAsMikKcmJpbmQocmVtb3ZlZCx0b3RhbCkKYGBgCgojIyBTdGF0aXN0aWNhbCBhcHByb2FjaGVzCgpUaGUgY2xhc3NpY2FsIGNlbnRyYWwgdGVuZGVuY3kgYXBwcm9hY2ggdG8gYW5hbHlzaW5nIFJUcyBpcyB1c2luZyBBTk9WQXMgb24gdGhlIGJ5LXBhcnRpY2lwYW50IGFnZ3JlZ2F0ZWQgbWVhbnMuIEhvd2V2ZXIsIHRoaXMgdGVjaG5pcXVlIGFzc3VtZXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgZGF0YSwgaW4gd2hpY2ggY2FzZSBwYXJ0aWNpcGFudCBtZWFucyB3b3VsZCBvZmZlciBhIHJlbGlhYmxlIHN1bW1hcnkgb2YgdGhlIGRhdGEuIFRoZSBwcm9ibGVtIGlzIHRoYXQgUlRzIHJhcmVseSBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCBidXQgcmF0aGVyIGEgcG9zaXRpdmVseSBza2V3ZWQgZGlzdHJpYnV0aW9uIHJlc2VtYmxpbmcgYW4gZXgtR2F1c3NpYW4gZGlzdHJpYnV0aW9uIGNoYXJhY3Rlcml6ZWQgYnkgYSBsb25nIHJpZ2h0IHRhaWwuIEFzIHRoZSBiZWxvdyBwbG90IHNob3dzLCB0aGlzIGlzIGFsc28gdGhlIGNhc2UgaGVyZS4KCmBgYHtyfQpkZiA8LSByZWFkX2NzdigiZGF0YWZpbGVfdGFzazIuY3N2IikKCmRmICU8PiUgZmlsdGVyKGFjY3VyYWN5PT0xKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyMjIyBERU5TSVRZIFBMT1RTICMjIyMjIyMjIyMjIyMjIyMjIyMjIwpjb2xzID0gdW5uYW1lKHN0ZWxsZW5ib3NjaF9jb2xvdXJzW2MoImdyZWVuIiwic2hpcmF6Iiwia2hha2kiKV0pCgpkZiAlPiUgCiAgZ2dwbG90KGFlcyh4PVJULGZpbGw9bGFuZ3VhZ2UpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYSA9IC42KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoY29sc1sxXSxjb2xzWzJdKSkgKwogIGZhY2V0X2dyaWQoY29uZGl0aW9ufmNvbmdydWVudCkgKwogIHhsaW0oYygwLDIwMDApKSArCiAgbXlfdGhlbWUoKSArCiAgZ2d0aXRsZSgiUlRzIGdyb3VwZWQgYnkgSVZzIikgKwogIG15X3RoZW1lKCkKYGBgCgpUbyBkZWFsIHdpdGggdGhpcyBpc3N1ZSwgd2UnbGwgdHJ5IG91dCB0aGUgZm9sbG93aW5nIGFwcHJvYWNoZXM6CgotIFRoZSAqRXgtR2F1c3NpYW4gYXBwcm9hY2gqIHdpdGggc2VwYXJhdGUgYW5hbHlzZXMgZm9yIHRoZSAqJFxtdSQqIGFuZCAqJFx0YXUkKiBwYXJhbWV0ZXJzIGluIFJUIGRpc3RyaWJ1dGlvbnMKLSBMaW5lYXIgcmVncmVzc2lvbi9BTk9WQSBvbiB0aGUgKmNvbmZsaWN0IGVmZmVjdCogYW5kICpjb2VmZmljaWVudCBvZiB2YXJpYWJpbGl0eSoKLSBNaXhlZC1lZmZlY3RzIGxpbmVhciByZWdyZXNzaW9uIHdpdGggbW9kZWwgY3JpdGljaXNtLCBjaGVja2luZyBmb3IgYXV0b2NvcnJlbGF0ZWQgUlQgbGFncy4KCiMjIyBUaGUgZXgtR2F1c3NpYW4gYXBwcm9hY2gKCkluIHRoaXMgYXBwcm9hY2gsIHdlIGNvbXB1dGUgdGhlIHRocmVlIHBhcmFtZXRlcnMsICokXHNpZ21hJCogKHNpZ21hKSwgKiRcbXUkKiAobXUpIGFuZCAqdGF1KiAodGF1KSwgdGhhdCBkZXNjcmliZSBhbiBleC1HYXVzc2lhbiBkaXN0cmlidXRpb24sIHdoaWNoIGl0c2VsZiBpcyBhIGNvbnZvbHV0aW9uIG9mIGEgbm9ybWFsIGFuZCBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24uIFRoZSBpZGVhIGlzIHRoYXQgcG90ZW50aWFsbHkgaW50ZXJlc3RpbmcgZWZmZWN0cyBtYXkgaGlkZSBpbiB0aGUgbG9uZyByaWdodCB0YWlsICgkXHRhdSQgY29tcG9uZW50KSwgd2hpY2ggaXMgaWdub3JlZCBpbiBzdGFuZGFyZCBjZW50cmFsIHRlbmRlbmN5IHRlc3RzLiAkXG11JCBhbmQgJFxzaWdtYSQgcmVmbGVjdCB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBHYXVzc2lhbiBjb21wb25lbnQsIHdoZXJlYXMgJFx0YXUkIHJlZmxlY3RzIHRoZSBtZWFuIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBleHBvbmVudGlhbCBjb21wb25lbnQuCgpUaGlzIHByb2NlZHVyZSBoYXMgYmVlbiB1c2VkIGUuZy4gYnkgQWJ1dGFsZWJpIGV0IGFsLiBhbmQgQ2FsYWJyaWEgZXQgYWwuCgpUaGUgZmlndXJlIGJlbG93IHNob3dzIHRoZSBkc3RyaWJ1dGlvbnMgb2YgdGhlIHRocmVlIHBhcmFtZXRlcnMuCgpgYGB7cn0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIyMjIyMgRVNUSU1BVEUgQU5EIFZJU1VBTElTRSBQQVJBTUVURVJTICMjIwoKcGFyYW1zIDwtIGRmICU+JSAKICBncm91cF9ieShsYW5ndWFnZSxjb25kaXRpb24sY29uZ3J1ZW50LHBhcnRpY2lwYW50KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG4gICAgICAgID0gbigpLAogICAgICAgICAgICAgICAgICAgbWVhbiAgICAgPSBtZWFuKFJUKSwKICAgICAgICAgICAgICAgICAgIHNkICAgICAgID0gc2QoUlQpLAogICAgICAgICAgICAgICAgICAgY29lZl92YXIgPSBzZChSVCkvbWVhbihSVCksCiAgICAgICAgICAgICAgICAgICBtdSAgICAgICA9IG1leGdhdXNzKFJUKVsxXSwKICAgICAgICAgICAgICAgICAgIHNpZ21hICAgID0gbWV4Z2F1c3MoUlQpWzJdLAogICAgICAgICAgICAgICAgICAgdGF1ICAgICAgPSBtZXhnYXVzcyhSVClbM10pICU+JQogIHVuZ3JvdXAoKQoKcGFyYW1zX2V4IDwtIHBhcmFtcyAgICAgICAgICAgICAgICAgICAgICU+JQogIGRwbHlyOjpzZWxlY3QoLW4sLW1lYW4sLXNkLC1jb2VmX3ZhcikgJT4lCiAgZ2F0aGVyKGtleSA9ICJwYXJhbWV0ZXIiLCB2YWx1ZSA9ICJ2YWx1ZSIsIDU6NykKCiMgcGFyYW1zX2V4ICU+JSAKIyAgIGdncGxvdChhZXMoeD12YWx1ZSxmaWxsPXBhcmFtZXRlcikpICsgCiMgICBnZW9tX2RlbnNpdHkoYWxwaGE9LjcpICsKIyAgIHNjYWxlX2ZpbGxfc3RlbGxlbmJvc2NoKCkgKwojICAgZmFjZXRfZ3JpZChsYW5ndWFnZX5jb25kaXRpb24gKyBjb25ncnVlbnQpICsKIyAgIGdndGl0bGUoIkRpc3RyaWJ1dGlvbnMgb2Ygc2lnbWEsIG11IGFuZCB0YXUiLAojICAgICAgICAgICBzdWJ0aXRsZSA9ICJCeSBsYW5ndWFnZSwgY29uZGl0aW9uIGFuZCBjb25ncnVlbmNlIikKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyMjIyMjIyMgQk9YUExPVFMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmNvbHMgPSB1bm5hbWUoc3RlbGxlbmJvc2NoX2NvbG91cnNbYygiZ3JlZW4iLCJzaGlyYXoiLCJraGFraSIpXSkKCnBhcmFtc19leCAlPiUgZ2dwbG90KGFlcyh4PXBhcmFtZXRlcix5PXZhbHVlLGZpbGw9bGFuZ3VhZ2UpKSArIAogIGdlb21faml0dGVyKGFscGhhID0gLjYpICsKICBnZW9tX2JveHBsb3QoYWxwaGEgICAgICAgICA9IC44LAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsCiAgICAgICAgICAgICAgIGNvbG91ciAgICAgICAgPSBjb2xzWzNdKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzICAgPSBjKGNvbHNbMV0sY29sc1syXSkpICsKICBmYWNldF9ncmlkKGNvbmRpdGlvbn5jb25ncnVlbnQpICsKICAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9ucyBieSBsYW5ndWFnZSwgY29uZGl0aW9uIGFuZCBjb25ncnVlbmNlIikgKwogIG15X3RoZW1lKCkKYGBgCgpXZSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgdGhlIGdyb3VwZWQgZGlzdHJpYnV0aW9ucyBhcHBlYXIgdG8gZm9sbG93IGV4LUdhdXNzaWFuIGRpc3RyaWJ1dGlvbnMsIGJ1dCB3ZSBjYW4gZ28gZnVydGhlciBhbmQgaW5zcGVjdCBkaXN0cmlidXRpb25zIGZvciBlYWNoIHBhcnRpY2lwYW50IGluIHRoZSBmaWd1cmUgYmVsb3cgb3JkZXJlZCBieSBtZWFuIFJULgoKYGBge3J9CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyMjIyMjIFJUIERJU1RSSUJVVElPTlMgQlkgUEFSVElDSVBBTlQgCgphZl9kZW5zaXR5IDwtIGRmICAgICAgICAgJT4lIAogIGZpbHRlcihsYW5ndWFnZT09IkFmcmlrYWFucyIpICU+JQogIGdncGxvdChhZXMoeD1SVCwgeSA9IHJlb3JkZXIocGFydGljaXBhbnQsUlQpLCBmaWxsID0gbGFuZ3VhZ2UpKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYSAgICAgICAgICA9IC43LAogICAgICAgICAgICAgICAgICAgICAgcmVsX21pbl9oZWlnaHQgPSAwLjAwNSwgCiAgICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCAgICA9IEYsCiAgICAgICAgICAgICAgICAgICAgICBzaXplICAgICAgICAgICA9IDAuMikgKwogIHNjYWxlX2ZpbGxfc3RlbGxlbmJvc2NoKCJtYWluIixyZXZlcnNlID1UKSArCiAgeGxpbShjID0gMCwyMDAwKSArCiAgbGFicyh5ID0gIlBhcnRpY2lwYW50XG4iKSArCiAgZ2d0aXRsZSgiQWZyaWthYW5zIikgKwogIG15X3RoZW1lKCkKCnhoX2RlbnNpdHkgPC0gZGYgJT4lIAogIGZpbHRlcihsYW5ndWFnZT09Ilhob3NhIikgJT4lIAogIGdncGxvdChhZXMoeD1SVCwgeSA9IHJlb3JkZXIocGFydGljaXBhbnQsUlQpLGZpbGw9bGFuZ3VhZ2UpKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYSAgICAgICAgICA9IC43LAogICAgICAgICAgICAgICAgICAgICAgcmVsX21pbl9oZWlnaHQgPSAwLjAwNSwKICAgICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kICAgID0gRiwKICAgICAgICAgICAgICAgICAgICAgIHNpemUgICAgICAgICAgID0gMC4yKSArCiAgc2NhbGVfZmlsbF9zdGVsbGVuYm9zY2goIndpbmUiKSArCiAgeGxpbShjID0gMCwyMDAwKSArCiAgbGFicyh5ID0gTlVMTCkgKwogIGdndGl0bGUoIlhob3NhIikgKyAKICBteV90aGVtZSgpCgpncmlkLmFycmFuZ2UoYWZfZGVuc2l0eSx4aF9kZW5zaXR5LG5jb2w9MiwKICAgICAgICAgICAgIHRvcCA9IGdyaWQ6OnRleHRHcm9iKCJieS1wYXJ0aWNpcGFudCBSVCBkaXN0cmlidXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udHNpemU9MTgpKSkKYGBgCgpGcm9tIHRoaXMsIGl0IGlzIHBlcmhhcHMgbGVzcyBjbGVhciB0aGF0IHRoZSBleC1HYXVzc2lhbiBkaXN0cmlidXRpb24gcHJvdmlkZXMgdGhlIGJlc3QgZml0IGZvciBvdXIgZGF0YS4KCldlIGNhbiBxdWFudGlmeSB0aGlzICBieSBjcmVhdGluZyBzaW11bGF0ZWQgZGF0YSBiYXNlZCBvbiB0aGUgYWdncmVnYXRlZCBub3JtYWwgYW5kIGV4LUdhdXNzaWFuIHBhcmFtZXRlcnMgZm9yIGVhY2ggcGFydGljaXBhbnQgYW5kIHBlcmZvcm0gS29sbW9nb3Jvdi1TbWlybm92IHRlc3RzIHRvIHNlZSB3aGV0aGVyIHRoZSByZWFsIGFuZCBzaW11bGF0ZWQgZGlzdHJpYnV0aW9ucyBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuCgpUaGUgcC12YWx1ZXMgaW4gdGhlIGJlbG93IGZpZ3VyZSB0ZWxsIHVzIGhvdyBtYW55IHBhcnRpY2lwYW50cyBmb2xsb3cgYW4gZXgtR2F1c3NpYW4gdnMuIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gVGhlcmUgYXJlIG1vcmUgdmFsdWVzIGFib3ZlIC4wNSBpbiB0aGUgZXgtR2F1c3NpYW4gcGFuZWwuIFdlIHRoZXJlZm9yZSBjb25jbHVkZSB0aGF0IHRoaXMgZGlzdHJpYnV0aW9uIHByb3ZpZGVzIGEgYmV0dGVyIGZpdCBmb3IgdGhlIG1ham9yaXR5IG9mIG91ciBkYXRhLgoKYGBge3J9CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyMjIyMjIEZJVCBEQVRBIFRPIERJU1RSSUJVVElPTlMgIyMjIyMjIyMjIyMKCiMjIyAxLiBFWF9HQVVTU0lBTgoKZGlzdHIgPC0gZGYgJT4lIAogIGdyb3VwX2J5KHBhcnRpY2lwYW50KSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG4gICAgID0gbigpLAogICAgICAgICAgICAgICAgICAgbWVhbiAgPSBtZWFuKFJUKSwKICAgICAgICAgICAgICAgICAgIHNkICAgID0gc2QoUlQpLAogICAgICAgICAgICAgICAgICAgbXUgICAgPSBtZXhnYXVzcyhSVClbMV0sCiAgICAgICAgICAgICAgICAgICBzaWdtYSA9IG1leGdhdXNzKFJUKVsyXSwKICAgICAgICAgICAgICAgICAgIHRhdSAgID0gbWV4Z2F1c3MoUlQpWzNdKQoKbGlzdF9yYW5kX3J0ID0gbGlzdCgpCmZvciAoaSBpbiBzZXEoMTpucm93KGRpc3RyKSkpIHsKICAKICBuICAgICA9IGFzX3ZlY3RvcihkaXN0cltpLDJdKQogIG11ICAgID0gYXNfdmVjdG9yKGRpc3RyW2ksNV0pCiAgc2lnbWEgPSBhc192ZWN0b3IoZGlzdHJbaSw2XSkKICBudSAgICA9IGFzX3ZlY3RvcihkaXN0cltpLDddKSAjIHRhdQogIAogIGxzICAgID0gbGlzdChyZXhHQVVTKG49bixtdT1tdSxzaWdtYT1zaWdtYSxudT1udSkpCiAgbGlzdF9yYW5kX3J0W2ldID0gbHMKfQoKZCA8LSBkYXRhLmZyYW1lKHBhcnRpY2lwYW50ID0gdW5pcXVlKGRmJHBhcnRpY2lwYW50KSwKICAgICAgICAgICAgICAgIHBfbnVtYmVyICAgID0gcm93X251bWJlcih1bmlxdWUoZGYkcGFydGljaXBhbnQpKSkKCmRmICU8PiUgZnVsbF9qb2luKGQpCgpsaXN0X3JlYWxfcnQgPC0gZGYgICAgICAgICAgICU+JSAKICBkcGx5cjo6c2VsZWN0KHBfbnVtYmVyLFJUKSAlPiUKICBzcGxpdCguJHBfbnVtYmVyKQoKa3NfdGVzdHMgPSBsaXN0KCkKZm9yIChpIGluIHVuaXF1ZShkZiRwX251bWJlcikpewogIAogIGtzX3Rlc3RzW1tpXV0gPSBkYXRhLmZyYW1lKAogICAgcmVhbF9ydCAgICAgPSBhc192ZWN0b3IobGlzdF9yZWFsX3J0W1tpXV1bMl0pLAogICAgc2ltX3J0ICAgICAgPSBhc192ZWN0b3IobGlzdF9yYW5kX3J0W2ldKSkKfQoKa3NfcmVzdWx0cyA9IGRhdGEuZnJhbWUoKQpmb3IgKGkgaW4gdW5pcXVlKGQkcF9udW1iZXIpKSB7CiAgcGFydGljaXBhbnQgPSBkJHBhcnRpY2lwYW50W2ldCiAgeCAgICAgICAgICAgPSBrc190ZXN0c1tbaV1dJHJlYWxfcnQKICB5ICAgICAgICAgICA9IGtzX3Rlc3RzW1tpXV0kc2ltX3J0CiAgCiAgYFAtdmFsdWVzYCA9IGtzLnRlc3QoeCx5KSRwLnZhbHVlCiAga3NfcmVzdWx0cyA9IHJiaW5kKGtzX3Jlc3VsdHMsY2JpbmQocGFydGljaXBhbnQsYFAtdmFsdWVzYCkpCn0KCmV4Z2F1c3NfZml0IDwtIGtzX3Jlc3VsdHMgJT4lIAogIGdncGxvdChhZXMoeD1wYXJ0aWNpcGFudCx5PWBQLXZhbHVlc2ApKSArIAogIGdlb21fcG9pbnQoc2l6ZT0yLGFscGhhPS44KSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuMDUsCiAgICAgICAgICAgICBjb2xvdXIgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1s1XSkgKwogIHlsaW0oMCwxKSArCiAgZ2d0aXRsZSgiSy1TIHRlc3RzIGZvciBFeC1HYXVzc2lhbiBkaXN0cmlidXRpb25zIikgKwogIG15X3RoZW1lKCkKCiMjIyAyLiBOT1JNQUwgRElTVFJJQlVUSU9OCgpsaXN0X3JhbmRfcnRfbm9ybSA9IGxpc3QoKQpmb3IgKGkgaW4gc2VxKDE6bnJvdyhkaXN0cikpKSB7CiAgCiAgbiAgICA9IGFzX3ZlY3RvcihkaXN0cltpLDJdKQogIG1lYW4gPSBhc192ZWN0b3IoZGlzdHJbaSwzXSkKICBzZCAgID0gYXNfdmVjdG9yKGRpc3RyW2ksNF0pCiAgCiAgbHMgICA9IGxpc3Qocm5vcm0obj1uLG1lYW49bWVhbixzZD1zZCkpCiAgbGlzdF9yYW5kX3J0X25vcm1baV0gPSBscwp9Cgprc190ZXN0c19ub3JtID0gbGlzdCgpCmZvciAoaSBpbiB1bmlxdWUoZGYkcF9udW1iZXIpKXsKICAKICBrc190ZXN0c19ub3JtW1tpXV0gPSBkYXRhLmZyYW1lKAogICAgcmVhbF9ydCA9IGFzX3ZlY3RvcihsaXN0X3JlYWxfcnRbW2ldXVsyXSksCiAgICBzaW1fcnQgID0gYXNfdmVjdG9yKGxpc3RfcmFuZF9ydF9ub3JtW2ldKSkKfQoKa3NfcmVzdWx0c19ub3JtID0gZGF0YS5mcmFtZSgpCmZvciAoaSBpbiB1bmlxdWUoZCRwX251bWJlcikpIHsKICBwYXJ0aWNpcGFudCA9IGQkcGFydGljaXBhbnRbaV0KICB4ID0ga3NfdGVzdHNfbm9ybVtbaV1dJHJlYWxfcnQKICB5ID0ga3NfdGVzdHNfbm9ybVtbaV1dJHNpbV9ydAogIAogIGBQLXZhbHVlc2AgICAgICA9IGtzLnRlc3QoeCx5KSRwLnZhbHVlCiAga3NfcmVzdWx0c19ub3JtID0gcmJpbmQoa3NfcmVzdWx0c19ub3JtLGNiaW5kKHBhcnRpY2lwYW50LGBQLXZhbHVlc2ApKQp9Cgpub3JtX2ZpdCA8LSBrc19yZXN1bHRzX25vcm0gJT4lIAogIGdncGxvdChhZXMocGFydGljaXBhbnQseT1gUC12YWx1ZXNgKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MixhbHBoYT0uOCkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjA1LAogICAgICAgICAgICAgY29sb3VyID0gc3RlbGxlbmJvc2NoX2NvbG91cnNbNV0pICsKICB5bGltKDAsMSkgKwogIGxhYnMoeT1OVUxMKSArCiAgZ2d0aXRsZSgiSy1TIHRlc3RzIGZvciBub3JtYWwgZGlzdHJpYnV0aW9ucyIpICsKICBteV90aGVtZSgpCgojIyMgMy4gQ09NUEFSRSBGSVRTCgpncmlkLmFycmFuZ2UoZXhnYXVzc19maXQsbm9ybV9maXQsbmNvbD0yKQoKYGBgCgpCZWZvcmUgZml0dGluZyBtb2RlbHMgdG8gb3VyIGRhdGEsIHdlIGNhbiBpbnNwZWN0IHRoZSBmb2xsb3dpbmcgcGxvdHMgd2hpY2ggZ2l2ZSB1cyBhIGJldHRlciBpZGVhIG9mIHBvc3NpYmxlIGludGVyYWN0aW9ucyBiZXR3ZWVuIGZhY3RvcnMgd2l0aGluIGVhY2ggcGFyYW1ldGVyLiBUaGVyZSdzIG5vIGNsZWFyIGV2aWRlbmNlIGZvciBpbnRlcmFjdGlvbnMgaW4gdGhlIGVzdGltYXRlZCBwYXJhbWV0ZXJzLCBidXQgdGhlcmUgbWlnaHQgYmUgbWFpbiBlZmZlY3RzIG9mIGxhbmd1YWdlLgoKYGBge3J9CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIyMjIyMjIyMgSU5URVJBQ1RJT04gUExPVFMgIyMjIyMjIyMjIyMjIyMjIyMKCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuMSkKCm11X3Bsb3QgPC0gcGFyYW1zICU+JSAKICBSbWlzYzo6c3VtbWFyeVNFKG1lYXN1cmV2YXI9Im11Iixncm91cHZhcnM9YygibGFuZ3VhZ2UiLCJjb25kaXRpb24iLCJjb25ncnVlbnQiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY29uZ3J1ZW50LCB5ID0gbXUsIGNvbG9yID0gbGFuZ3VhZ2UpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGxhbmd1YWdlKSwKICAgICAgICAgICAgc2l6ZSAgICAgID0gMSwKICAgICAgICAgICAgcG9zaXRpb24gID0gZG9kZ2UpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbXUtY2kseW1heCA9IG11K2NpKSwKICAgICAgICAgICAgICAgIHdpZHRoICAgID0uMywKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gZG9kZ2UpICsKICBmYWNldF9ncmlkKH5jb25kaXRpb24pICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKGNvbHNbMV0sY29sc1syXSkpICsKICB5bGltKGMoMCw2MjUpKSArCiAgZ3VpZGVzKGNvbG91cj1GKSArCiAgbXlfdGhlbWUoKQoKdGF1X3Bsb3QgPC0gcGFyYW1zICU+JSAKICBSbWlzYzo6c3VtbWFyeVNFKG1lYXN1cmV2YXI9InRhdSIsZ3JvdXB2YXJzPWMoImxhbmd1YWdlIiwiY29uZGl0aW9uIiwiY29uZ3J1ZW50IikpICU+JQogIGdncGxvdChhZXMoeCA9IGNvbmdydWVudCwgeSA9IHRhdSwgY29sb3IgPSBsYW5ndWFnZSkpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gbGFuZ3VhZ2UpLAogICAgICAgICAgICBzaXplICAgICAgPSAxLAogICAgICAgICAgICBwb3NpdGlvbiAgPSBkb2RnZSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBkb2RnZSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSB0YXUtY2kseW1heCA9IHRhdStjaSksCiAgICAgICAgICAgICAgICB3aWR0aCAgICA9LjMsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGRvZGdlKSArCiAgZmFjZXRfZ3JpZCh+Y29uZGl0aW9uKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Yyhjb2xzWzFdLGNvbHNbMl0pKSArCiAgeWxpbShjKDAsMzUwKSkgKwogIGd1aWRlcyhjb2xvdXI9RikgKwogIG15X3RoZW1lKCkKCnNpZ21hX3Bsb3QgPC0gcGFyYW1zICU+JSBSbWlzYzo6c3VtbWFyeVNFKG1lYXN1cmV2YXI9InNpZ21hIixncm91cHZhcnM9YygibGFuZ3VhZ2UiLCJjb25kaXRpb24iLCJjb25ncnVlbnQiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY29uZ3J1ZW50LCB5ID0gc2lnbWEsIGNvbG9yID0gbGFuZ3VhZ2UpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGxhbmd1YWdlKSwKICAgICAgICAgICAgc2l6ZSAgICAgID0gMSwKICAgICAgICAgICAgcG9zaXRpb24gID0gZG9kZ2UpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gc2lnbWEtY2kseW1heCA9IHNpZ21hK2NpKSwKICAgICAgICAgICAgICAgIHdpZHRoICAgID0gLjMsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGRvZGdlKSArCiAgZmFjZXRfZ3JpZCh+Y29uZGl0aW9uKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Yyhjb2xzWzFdLGNvbHNbMl0pKSArCiAgeWxpbShjKDAsMTUwKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIG15X3RoZW1lKCkKCmdyaWQuYXJyYW5nZShtdV9wbG90LHRhdV9wbG90LHNpZ21hX3Bsb3QsbnJvdz0yLAogICAgICAgICAgICAgIHRvcCA9IGdyaWQ6OnRleHRHcm9iKCJJbnRlcmFjdGlvbnMgYmV0d2VlbiBJVnMgaW4gc2lnbWEsIG11IGFuZCB0YXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3A9Z3Bhcihmb250c2l6ZT0xOCkpKQpgYGAKCiMjIyMgVGhlICRcbXUkIHBhcmFtZXRlcgoKRml0dGluZyBhIGZ1bGwgbW9kZWwgd2l0aCBhbGwgcHJlZGljdG9ycyBhbmQgaW50ZXJhY3Rpb25zIHJldmVhbHMgYSBtYXJnaW5hbGx5IHNpZ25pZmljYW50IGVmZmVjdCBvZiBsYW5ndWFnZSAocCA9IC4wNTkpLCBpLmUuIHRoZSBYaG9zYSBncm91cCBoYWQgc2hvcnRlciBSVHMgKmluIHRoZSBHYXVzc2lhbiBjb21wb25lbnQqLiBObyBlZmZlY3RzIHJlYWNoZWQgc2lnbmlmaWNhbnQgcC12YWx1ZXMuIAoKYGBge3J9Cm11X21vZF9mdWxsID0gbG0obXUgfiBsYW5ndWFnZSpjb25kaXRpb24qY29uZ3J1ZW50LGRhdGE9cGFyYW1zKQpzdW1tYXJ5KG11X21vZF9mdWxsKQoKYGBgCgojIyMjIFRoZSAkXHRhdSQgcGFyYW1ldGVyCgpBcyB3aXRoIHRoZSAkXG11JCBwYXJhbWV0ZXIsIGZpdHRpbmcgYSBmdWxsIG1vZGVsIHdpdGggYWxsIHByZWRpY3RvcnMgYW5kIGludGVyYWN0aW9ucyByZXZlYWxzIG9ubHkgYSBtYXJnaW5hbGx5IHNpZ25pZmljYW50IGVmZmVjdCBvZiBsYW5ndWFnZSAocCA9IC4wOTUpLgoKYGBge3J9CnRhdV9tb2RfZnVsbCA9IGxtKHRhdSB+IGxhbmd1YWdlKmNvbmRpdGlvbipjb25ncnVlbnQsZGF0YT1wYXJhbXMpCnN1bW1hcnkodGF1X21vZF9mdWxsKQpgYGAKCkluIHN1bSwgd2UgZm91bmQgdGhhdCBYaG9zYSBzcGVha2VycyBwcm9kdWNlZCBzbWFsbGVyICRcbXUkLiBPdGhlcndpc2UsIHNwbGl0dGluZyB0aGUgR2F1c3NpYW4gYW5kIGV4cG9uZW50aWFsIGNvbXBvbmVudHMgaW4gdGhlIFJUcyBkaWQgbm90IGFsbG93IHVzIHRvIGlkZW50aWZ5IGVmZmVjdHMgdGhhdCBtaWdodCBoYXZlIGJlZW4gaGlkaW5nIGluIHRoZSByaWdodCB0YWlscy4KCkNhbGFicmlhIGV0IGFsLiBhbHNvIHJhbiBjb3JyZWxhdGlvbiBhbmFseXNlcyBvbiB0aGUgJFxtdSQgYW5kICRcdGF1JCBwYXJhbWV0ZXJzIG9mIHRoZWlyIGdyb3Vwcy4gSSdtIG5vdCBjb21wbGV0ZWx5IHN1cmUgaWYgdGhpcyBpcyB0cnVseSBpbnRlcmVzdGluZyBvciByZWxldmFudCwgYnV0IGRvaW5nIHNvIHlpZWxkcyBhIHNtYWxsLCBidXQgc2lnbmlmaWNhbnQgbmVnYXRpdmUgY29ycmVsYXRpb24gb2YgJFxtdSQgYW5kICRcdGF1JCBmb3IgQWZyaWthYW5zIHNwZWFrZXJzIGFuZCBubyBjb3JyZWxhdGlvbiBmb3IgWGhvc2Egc3BlYWtlcnMuCgojIyMgQ29uZmxpY3QgZWZmZWN0CgpXZSBjYW4gYWxzbyB0aGluayBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFzIHRoZSBtZWFuIGRpZmZlcmVuY2UgaW4gUlRzIGluIHJlc3BvbnNlIHRvIGNvbmdydWVudCBhbmQgaW5jb25ncnVlbnQgdHJpYWxzLCB3aGF0IENhbGFicmlhIGV0IGFsLiBjYWxsIHRoZSAqY29uZmxpY3QgZWZmZWN0KgoKQmVsb3cgd2UnbGwgcGxvdCB0aGUgY29uZmxpY3QgZWZmZWN0IGFuZCBydW4gdGhlIGFuYWx5c2lzLiBOb3RlIHRoYXQgdGhlIGNvbmdydWVuY2UgdmFyaWFibGUgaXMgY29udGFpbmVkIGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUsIHNvIHdlIGZpdCBhIG1vZGVsIHdpdGggbGFuZ3VhZ2UgYW5kIGNvbmRpdGlvbiBhcyB0aGUgb25seSBmYWN0b3JzLgoKYGBge3J9CmNvbmZsaWN0X2RmIDwtIGRmICU+JQogIGdyb3VwX2J5KGxhbmd1YWdlLGNvbmRpdGlvbixwYXJ0aWNpcGFudCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtX2luY29uZ3J1ZW50ID0gbWVhbihSVFtjb25ncnVlbnQ9PUZBTFNFXSksCiAgICAgICAgICAgICAgICAgICBtX2NvbmdydWVudCAgID0gbWVhbihSVFtjb25ncnVlbnQ9PVRSVUVdKSwKICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0ICAgICAgPSBtX2luY29uZ3J1ZW50IC0gbV9jb25ncnVlbnQpCgojIyMgQk9YUExPVFMKYm94ZXMgPC0gY29uZmxpY3RfZGYgJT4lIGdncGxvdChhZXMoeD1sYW5ndWFnZSx5PWNvbmZsaWN0LGZpbGw9bGFuZ3VhZ2UpKSArIAogIGdlb21faml0dGVyKGFscGhhID0gLjcpICsKICBnZW9tX2JveHBsb3QoYWxwaGEgICAgICAgICA9IC44LAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsCiAgICAgICAgICAgICAgIGNvbG91ciAgICAgICAgPSBjb2xzWzNdLAogICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgICA9IGMoY29sc1sxXSxjb2xzWzJdKSkgKwogIGZhY2V0X2dyaWQofmNvbmRpdGlvbikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBteV90aGVtZSgpCgojIyMgSU5URVJBQ1RJT04gUExPVFMKaW50ZXJhY3Rpb25zIDwtIGNvbmZsaWN0X2RmICU+JSAKICBSbWlzYzo6c3VtbWFyeVNFKG1lYXN1cmV2YXI9ImNvbmZsaWN0IiwgZ3JvdXB2YXJzID0gYygibGFuZ3VhZ2UiLCJjb25kaXRpb24iKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY29uZGl0aW9uLCB5ID0gY29uZmxpY3QsIGNvbG9yID0gbGFuZ3VhZ2UpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGxhbmd1YWdlKSwKICAgICAgICAgICAgc2l6ZSAgICAgID0gMSwKICAgICAgICAgICAgcG9zaXRpb24gID0gZG9kZ2UpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gY29uZmxpY3QtY2kseW1heCA9IGNvbmZsaWN0K2NpKSwKICAgICAgICAgICAgICAgIHdpZHRoICAgID0uMywKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gZG9kZ2UpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKGNvbHNbMV0sY29sc1syXSkpICsKICAjZmFjZXRfZ3JpZCh+bGFuZ3VhZ2UpICsKICBndWlkZXMoY29sb3VyPUZBTFNFKSArCiAgbXlfdGhlbWUoKQoKZ3JpZC5hcnJhbmdlKGJveGVzLGludGVyYWN0aW9ucyx0b3AgPSBncmlkOjp0ZXh0R3JvYigiQ29uZmxpY3QgZWZmZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udHNpemU9MTgpKSkKYGBgCgpgYGB7cn0KY29uZmxpY3RfbW9kX2Z1bGwgPSBsbShjb25mbGljdCB+IGxhbmd1YWdlKmNvbmRpdGlvbixkYXRhPWNvbmZsaWN0X2RmKQpzdW1tYXJ5KGNvbmZsaWN0X21vZF9mdWxsKQpgYGAKClRoZXJlIHNlZW1zIHRvIGJlIHRvbyBtdWNoIHZhcmlhYmlsaXR5IHRvIGRldGVjdCBhbnkgc2lnbmlmaWNhbnQgZWZmZWN0cywgdGhvdWdoIHRoZSBpbnRlcmFjdGlvbiBsaW5lcyBzdWdnZXN0IG9wcG9zaXRlIHRyZW5kcywgd2hpY2ggaXMgcmVmbGVjdGVkIGluIHRoZSBtYXJnaW5hbGx5IHNpZ25pZmljYW50IGludGVyYWN0aW9uIGVmZmVjdCBiZXR3ZWVuIGxhbmd1YWdlIGFuZCBjb25kaXRpb24gKHAgPSAuMDk3KQoKIyMjIENvZWZmaWNpZW50IG9mIHZhcmlhYmlsaXR5CgpJdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBleHBsb3JlIHdoZXRoZXIgdGhlcmUgYXJlIHBhdHRlcm5zIGluIHRoZSB2YXJpYWJpbGl0eSBvZiByZXNwb25zZSBsYXRlbmNpZXMuIFdlIGNhbiBjb21wdXRlIHRoZSBjb2VmZmljaWVudCBvZiB2YXJpYWJpbGl0eSBmb3IgZWFjaCBwYXJ0aWNpcGFudCBieSBkaXZpbmcgdGhlIGluZGl2aWR1YWwgU0RzIGJ5IHRoZSBtZWFucy4KCldlIHBsb3QgdGhlIGRhdGEgYW5kIGZpdCBhIG1vZGVsIGluIHRoZSBzYW1lIHdheSBhcyB3aXRoIHRoZSBjb25mbGljdCBlZmZlY3QuCgpgYGB7cn0KIyMjIEJPWFBMT1RTCmJveGVzIDwtIHBhcmFtcyAlPiUgCiAgZ2dwbG90KGFlcyh4PWNvbmdydWVudCx5PWNvZWZfdmFyLGZpbGw9bGFuZ3VhZ2UpKSArIAogIGdlb21faml0dGVyKGFscGhhID0gLjcpICsKICBnZW9tX2JveHBsb3QoYWxwaGEgICAgICAgICA9IC44LAogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsCiAgICAgICAgICAgICAgIGNvbG91ciAgICAgICAgPSBjb2xzWzNdKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzICAgPSBjKGNvbHNbMV0sY29sc1syXSkpICsKICBmYWNldF9ncmlkKH5jb25kaXRpb24pICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgbXlfdGhlbWUoKQoKIyMjIElOVEVSQUNUSU9OIFBMT1RTCmludGVyYWN0aW9ucyA8LSBwYXJhbXMgJT4lIAogIFJtaXNjOjpzdW1tYXJ5U0UobWVhc3VyZXZhcj0iY29lZl92YXIiLCBncm91cHZhcnMgPSBjKCJsYW5ndWFnZSIsImNvbmRpdGlvbiIsImNvbmdydWVudCIpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Y29uZ3J1ZW50LHk9Y29lZl92YXIsY29sb3VyPWxhbmd1YWdlKSkgKyAKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gbGFuZ3VhZ2UpLAogICAgICAgICAgICBzaXplICAgICAgPSAxLAogICAgICAgICAgICBwb3NpdGlvbiAgPSBkb2RnZSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBkb2RnZSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjb2VmX3Zhci1jaSx5bWF4ID0gY29lZl92YXIrY2kpLAogICAgICAgICAgICAgICAgd2lkdGggICAgPS4zLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBkb2RnZSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoY29sc1sxXSxjb2xzWzJdKSkgKwogIGZhY2V0X2dyaWQofmNvbmRpdGlvbikgKwogIG15X3RoZW1lKCkKCmdyaWQuYXJyYW5nZShib3hlcyxpbnRlcmFjdGlvbnMsdG9wID0gZ3JpZDo6dGV4dEdyb2IoIkNvZWZmaWNpZW50IG9mIHZhcmlhYmlsaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udHNpemU9MTgpKSkKCmBgYAoKYGBge3J9CmNvZWZfdmFyX21vZF9mdWxsID0gbG0obG0oY29lZl92YXIgfiBsYW5ndWFnZSpjb25kaXRpb24qY29uZ3J1ZW50LGRhdGE9cGFyYW1zKSkKc3VtbWFyeShjb2VmX3Zhcl9tb2RfZnVsbCkKYGBgCgpGcm9tIHRoZSByZWdyZXNzaW9uIG91dHB1dCwgd2Ugc2VlIHRoYXQgbm8gZWZmZWN0cyByZWFjaGVkIHNpZ25pZmljYW5jZS4KCiMjIyBNaXhlZC1lZmZlY3RzIHJlZ3Jlc3Npb24KClRoZSBkb3duc2lkZSBvZiB0aGUgcHJldmlvdXMgYW5hbHlzZXMgaXMgdGhhdCB0aGV5IHJlcXVpcmUgdGhlIGRhdGEgdG8gYmUgYWdncmVnYXRlZC4KRm9yIHRoaXMgYW5hbHlzaXMsIHdlJ2xsIGZvbGxvdyBCYWF5ZW4gJiBNaWxpbidzIHN1Z2dlc3Rpb25zIGFuZCBkbyB0aGUgZm9sbG93aW5nOgoKLSBDb21wYXJlIGRpc3RyaWJ1dGlvbnMgYW5kIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgUlRzCi0gRml0IG1vZGVscyB3aXRoIGRpZmZlcmVudCByYW5kb20gc3RydWN0dXJlcwotIEFwcGx5IG1vZGVsIGNyaXRpY2lzbSBhbmQgcmVmaXQgbW9kZWxzCi0gQWNjb3VudCBmb3IgYXV0b2NvcnJlbGF0aW9uIGluIFJUcwoKIyMjIyBEaXN0cmlidXRpb25zCgpXZSdsbCBjb21wYXJlIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0byB1c2UgdW50cmFuc2Zvcm1lZCBSVHMsIGEgbG9nIG9yIGEgaW52ZXJzZSBHYXVzc2lhbiB0cmFuc2Zvcm1hdGlvbi4KClRoZSB2YWx1ZXMgZm9yIHNrZXduZXNzIGFuZCBrdXJ0b3NpcyBpbiB0aGUgdGFibGUgYmVsb3cgc3VnZ2VzdHMgdGhhdCBhbGwgb3B0aW9ucyByZXN1bHQgaW4gc2tld2VkIGFuZCBrdXJ0b3RpYyBkaXN0cmlidXRpb25zLCBidXQgd2l0aCBjb25zaWRlcmFibGUgaW1wcm92ZW1lbnRzIHdpdGggdHJhbnNmb3JtYXRpb25zLgoKYGBge3J9CmRlc2MgPC0gZGYgJT4lIAogIHNlbGVjdChSVCxsb2dSVCwgUlRpbnYpCmQ9ZGF0YS5mcmFtZShwc3ljaDo6ZGVzY3JpYmUoZGVzYykpCmQgJT4lIHNlbGVjdChza2V3LGt1cnRvc2lzKQpgYGAKCkhvd2V2ZXIsIHRoZXNlIG1lYXN1cmVzIGFyZSBrbm93biB0byBiZSB1bnJlbGlhYmxlIHdpdGggbGFyZ2VyIHNhbXBsZXMgKG4gPiAyMDApCgpJbnN0ZWFkLCB3ZSdsbCBpbnNwZWN0IHF1YW50aWxlLXF1YW50aWxlIHBsb3RzIGZvciB0aGUgZ29vZG5lc3Mgb2YgZml0IG9mIHRoZW9yZXRpY2FsIGRpc3RyaWJ1dGlvbnMuIEFsc28gc2hvd24sIGFyZSB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIG9mIHRoZSBvYnNlcnZlZCBhbmQgdGhlb3JldGljYWwgZGlzdHJpYnV0aW9ucy4KCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTEwfQojIyMgSU5TUEVDVCBRUVBMT1RTCgpSVF9jb3IgICAgPSBxcW5vcm0oZGYkUlQscGxvdD1GKQpSVGludl9jb3IgPSBxcW5vcm0oZGYkUlRpbnYscGxvdD1GKQpSVGxvZ19jb3IgPSBxcW5vcm0oZGYkbG9nUlQscGxvdD1GKQoKUlRfcGxvdCA8LSBkZiAlPiUgCiAgZ2dwbG90KGFlcyhzYW1wbGU9UlQpKSsKICBzdGF0X3FxKCkgKwogIHN0YXRfcXFfbGluZShjb2xvdXIgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1sic2hpcmF6Il0pICsKICBnZ3RpdGxlKCJSVCIpICsKICBteV90aGVtZSgpICsKICBhbm5vdGF0ZSgidGV4dCIsCiAgICAgICAgICAgeCAgICAgPSAtMywKICAgICAgICAgICB5ICAgICA9IG1heChkZiRSVCksCiAgICAgICAgICAgc2l6ZSAgPSA4LAogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIml0YWxpYyhyKSA9PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChjb3IoUlRfY29yJHgsUlRfY29yJHkpLDMpKSxwYXJzZT1UKQoKUlRpbnZfcGxvdCA8LSBkZiAgJT4lCiAgZ2dwbG90KGFlcyhzYW1wbGU9UlRpbnYpKSsKICBzdGF0X3FxKCkgKwogIHN0YXRfcXFfbGluZShjb2xvdXIgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1sic2hpcmF6Il0pICsKICBnZ3RpdGxlKCJJbnZlcnNlIEdhdXNzaWFuIHRyYW5zZm9ybSIpICsKICBteV90aGVtZSgpICsKICBhbm5vdGF0ZSgidGV4dCIsCiAgICAgICAgICAgeCAgICAgPSAtMiwKICAgICAgICAgICB5ICAgICA9IG1heChkZiRSVGludiksCiAgICAgICAgICAgc2l6ZSAgPSA1LAogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIml0YWxpYyhyKSA9PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChjb3IoUlRpbnZfY29yJHgsUlRpbnZfY29yJHkpLDMpKSxwYXJzZT1UKQoKUlRsb2dfcGxvdCA8LSBkZiAlPiUgCiAgZ2dwbG90KGFlcyhzYW1wbGU9bG9nUlQpKSsKICBzdGF0X3FxKCkgKwogIHN0YXRfcXFfbGluZShjb2xvdXIgPSBzdGVsbGVuYm9zY2hfY29sb3Vyc1sic2hpcmF6Il0pICsKICBnZ3RpdGxlKCJMb2ctTm9ybWFsIHRyYW5zZm9ybSIpICsKICBteV90aGVtZSgpICsKICBhbm5vdGF0ZSgidGV4dCIsCiAgICAgICAgICAgeCAgICAgPSAtMywKICAgICAgICAgICB5ICAgICA9IG1heChkZiRsb2dSVCksCiAgICAgICAgICAgc2l6ZSAgPSA4LAogICAgICAgICAgIGxhYmVsID0gcGFzdGUoIml0YWxpYyhyKSA9PSIsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChjb3IoUlRsb2dfY29yJHgsUlRsb2dfY29yJHkpLDMpKSxwYXJzZT1UKQoKZ3JpZC5hcnJhbmdlKFJUX3Bsb3QsUlRpbnZfcGxvdCxSVGxvZ19wbG90LG5jb2w9MykKYGBgCgpCYXNlZCBvbiB0aGUgb3V0cHV0LCB3ZSBwcm9jZWVkIHdpdGggdGhlIGludmVyc2UgR2F1c3NpYW4gdHJhbnNmb3JtYXRpb24uIExhdGVyIG1vZGVsIGNyaXRpY2lzbSB3aWxsIGZ1cnRoZXIgaW1wcm92ZSB0aGUgZ29vZG5lc3Mgb2YgZml0LgoKQmVsb3cgd2Ugc2VlIFFRLXBsb3RzIGZvciBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cy4gSXQgaXMgY2xlYXIgdGhhdCBib3RoIGdyb3VwcyBoYXZlIGEgZmV3IHBhcnRpY2lwYW50cyBkZXZpYXRpbmcgZnJvbSB0aGUgZXhwZWN0ZWQgcGF0dGVybiBjYXVzaW5nIGxhdGVyIHBvaW50cyB0byByaXNlIGFib3ZlIHRoZSBsaW5lIGluIHRoZSBjZW50ZXIgcGFuZWwgYWJvdmUuCgpgYGB7cn0KIyMjIEJZIFBBUlRJQ0lQQU5UCgpkZiAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZT1SVGludixjb2xvdXI9bGFuZ3VhZ2UpKSsKICBzdGF0X3FxKCkgKwogIGZhY2V0X3dyYXAofnBhcnRpY2lwYW50KSArCiAgc3RhdF9xcV9saW5lKGNvbG91cj0iYmxhY2siKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgICA9IGMoY29sc1sxXSxjb2xzWzJdKSkgKwogIGdndGl0bGUoImIiKSArCiAgZ2d0aXRsZSgiUGFydGljaXBhbnQgUVEgUGxvdHMiKSArCiAgbXlfdGhlbWUoKSAKYGBgCgpCZWZvcmUgZml0dGluZyByZWdyZXNzaW9uIG1vZGVscywgd2UnbGwgcGxvdCB0aGUgZGF0YSBncm91cGVkIGJ5IG91ciBpbmRlcGVuZGVudCB2YXJpYWJsZXMuCgpgYGB7cn0KIyMjIEJPWFBMT1RTCmJveGVzIDwtIGRmICU+JSAKICBnZ3Bsb3QoYWVzKHg9Y29uZ3J1ZW50LHk9UlQsZmlsbD1sYW5ndWFnZSkpICsgCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAuMykgKwogIGdlb21fYm94cGxvdChhbHBoYSAgICAgICAgID0gLjgsCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwKICAgICAgICAgICAgICAgY29sb3VyICAgICAgICA9IGNvbHNbM10pICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgICA9IGMoY29sc1sxXSxjb2xzWzJdKSkgKwogIGZhY2V0X2dyaWQofmNvbmRpdGlvbikgKyAKICBteV90aGVtZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpIAoKIyMjIElOVEVSQUNUSU9OIFBMT1RTCmludGVyYWN0aW9ucyA8LSBkZiAlPiUgCiAgUm1pc2M6OnN1bW1hcnlTRShtZWFzdXJldmFyPSJSVCIsIGdyb3VwdmFycyA9IGMoImxhbmd1YWdlIiwiY29uZGl0aW9uIiwiY29uZ3J1ZW50IikpICU+JQogIGdncGxvdChhZXMoeCA9IGNvbmdydWVudCwgeSA9IFJULCBjb2xvciA9IGxhbmd1YWdlKSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBsYW5ndWFnZSksCiAgICAgICAgICAgIHNpemUgICAgICA9IDEsCiAgICAgICAgICAgIHBvc2l0aW9uICA9IGRvZGdlKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFJULWNpLHltYXggPSBSVCtjaSksCiAgICAgICAgICAgICAgICB3aWR0aCAgICA9LjMsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGRvZGdlKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Yyhjb2xzWzFdLGNvbHNbMl0pKSArCiAgZmFjZXRfZ3JpZCh+Y29uZGl0aW9uKSArIAogIG15X3RoZW1lKCkgKwogIGd1aWRlcyhjb2xvdXI9RkFMU0UpCgpncmlkLmFycmFuZ2UoYm94ZXMsaW50ZXJhY3Rpb25zLHRvcCA9IGdyaWQ6OnRleHRHcm9iKCJSVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncD1ncGFyKGZvbnRzaXplPTE4KSkpCmBgYAoKIyMjIyBSYW5kb20gaW50ZXJjZXB0IG1vZGVsCgpXZSBmaXJzdCBmaXQgYSByYW5kb20gaW50ZXJjZXB0IG1vZGVsLiBGcm9tIHRoZSBvdXRwdXQgd2UgY2FuIG9ic2VydmUgYSBzaWduaWZpY2FudCB0aHJlZS13YXkgaW50ZXJhY3Rpb24gYmV0d2VlbiBsYW5ndWFnZSwgY29uZGl0aW9uIGFuZCBjb25ncnVlbmNlIChwID0gLjAyKQoKYGBge3J9CiMjIyBSQU5ET00gSU5URVJDRVBUUwoKbTFfYSA9IGxtZXIoUlRpbnYgfiBsYW5ndWFnZSpjb25kaXRpb24qY29uZ3J1ZW50ICsgKDF8cGFydGljaXBhbnQpICsgKDF8aXRlbSksIGRhdGEgPSBkZikKc3VtbWFyeShtMV9hKQpgYGAKCldlIHRoZW4gY2FsY3VsYXRlICRSXjIkIGluZGljYXRpbmcgaG93IHdlbGwgdGhlIG1vZGVsIGZpdHMgb3VyIGRhdGEuCgpgYGB7cn0KbTFfYXU9YXVnbWVudChtMV9hKQoKIyBNT0RFTCBDUklUSUNJU00KCiMgUi1zcXVhcmVkCmNvcihtMV9hdSRSVGludixtMV9hdSQuZml0dGVkKSBeMgpgYGAKCldlIHRoZW4gYXBwbHkgIm1vZGVsIGNyaXRpY2lzbSIgZm9sbG93aW5nIEJhYXllbiAmIE1pbGluJ3MgcmVjb21tZW5kYXRpb25zLiBUaGlzIG1lYW5zIG1pbmltYWwgdHJpbW1pbmcgb2Ygc3RhbmRhcmRpemVkIHJlc2lkdWFscyBhYm92ZSAyLjUuCgpgYGB7cn0KZGYyID0gZGZbYWJzKHNjYWxlKG0xX2F1JC5yZXNpZCkpIDwgMi41LCBdCmBgYAoKV2UgdGhlbiByZWZpdCB0aGUgbW9kZWwgYW5kIHNlZSB0aGF0IHRoZSBpbnRlcmFjdGlvbiBpcyBzdGlsbCBzaWduaWZpY2FudC4KCmBgYHtyfQojIHJlZml0IG1vZGVsCm0xX2IgPSBsbWVyKFJUaW52fmxhbmd1YWdlKmNvbmRpdGlvbipjb25ncnVlbnQgKyAoMXxwYXJ0aWNpcGFudCkgKyAoMXxpdGVtKSwgZGF0YSA9IGRmMikKc3VtbWFyeShtMV9iKQpgYGAKClRoZSAkUl4yJCB2YWx1ZSBub3cgaW5kaWNhdGVzIGEgY29uc2lkZXJhYmx5IGJldHRlciBmaXQuCgpgYGB7cn0KIyBDaGVjayBuZXcgbW9kZWwKbTFfYnU9YXVnbWVudChtMV9iKQoKIyBSLXNxdWFyZWQKY29yKG0xX2J1JFJUaW52LG0xX2J1JC5maXR0ZWQpIF4yCmBgYAoKIyMjIyBSYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzCgpXZSdsbCBhbHNvIHRyeSBmaXR0aW5nIGEgbW9kZWwgd2l0aCAibWF4aW1hbCByYW5kb20gc3RydWN0dXJlIiBpbmNsdWRpbmcgYm90aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGFzIGlzIGFsbG93ZWQgYnkgdGhlIGRlc2lnbi4gV2Ugc2VlIHRoYXQgdGhlIGludGVyYWN0aW9uIGVmZmVjdCBpcyByZXRhaW5lZCBpbiB0aGUgbW9kZWwuCgpgYGB7cn0KbTJfYSA9IGxtZXIoUlRpbnZ+bGFuZ3VhZ2UqY29uZGl0aW9uKmNvbmdydWVudCArICgxK2NvbmRpdGlvbitjb25ncnVlbnR8cGFydGljaXBhbnQpICsgKDF8aXRlbSksIGRhdGEgPSBkZikKCnN1bW1hcnkobTJfYSkKYGBgCgokUl4yJDoKCmBgYHtyfQptMl9hdT1hdWdtZW50KG0yX2EpCgpjb3IobTJfYXUkUlRpbnYsbTJfYXUkLmZpdHRlZCleMgpgYGAKCldlIGFwcGx5IG1vZGVsIGNyaXRpY2lzbSBhbmQgc2VlIHRoYXQgdGhlIGludGVyYWN0aW9uIGlzIHN0aWxsIHNpZ25pZmljYW50LgoKYGBge3J9CmRmMyA9IGRmW2FicyhzY2FsZShtMl9hdSQucmVzaWQpKSA8IDIuNSwgXQoKbTJfYiA9IGxtZXIoUlRpbnZ+bGFuZ3VhZ2UqY29uZGl0aW9uKmNvbmdydWVudCArKDErY29uZGl0aW9uK2NvbmdydWVudHxwYXJ0aWNpcGFudCkgKyAoMXxpdGVtKSwgZGF0YSA9IGRmMykKc3VtbWFyeShtMl9iKQpgYGAKClRoZSBuZXcgJFJeMiQgaW5kaWNhdGVzIGEgbXVjaCBiZXR0ZXIgZml0LgoKYGBge3J9Cm0yX2J1PWF1Z21lbnQobTJfYikKY29yKG0yX2J1JFJUaW52LG0yX2J1JC5maXR0ZWQpXjIKYGBgCgojIyMjIEF1dG9jb3JyZWxhdGlvbiBvZiBSVHMKCkluIHRoZSBwbG90cyBiZWxvdywgd2Ugc2VlIHRoYXQgdGhlcmUgYXJlIG5vIGNsZWFyIHBhdHRlcm5zIGluIFJUcyBvdmVyIHRyaWFscyBvciBvdmVyIHRoZSBkdXJhdGlvbiBvZiB0aGUgZXhwZXJpbWVudHMuCgpTdGlsbCwgaW4gdGhpcyB2ZXJ5IGZhc3QtcGFjZWQgZXhwZXJpbWVudCB3aXRoIG1hbnkgdHJpYWxzLCBpdCBtaWdodCBiZSB0aGUgY2FzZSB0aGF0IHJlc3BvbnNlIGxhdGVuY2llcyBhcmUgZGVwZW5kZW50IG9uIFJUcyBpbiBwcmV2aW91cyB0cmlhbHMsIHBhcnRpY3VsYXJseSBhdCBsYWckX3t0LTF9JC4KCgpgYGB7cn0KIyBXSVRISU4gQkxPQ0tTClJUX3dpdGhpbiA8LSBkZiAlPiUgCiAgZ3JvdXBfYnkobGFuZ3VhZ2UscGFydGljaXBhbnQsdHJpYWwpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UobT1tZWFuKFJUKSkgICAgICAgICAlPiUKICBnZ3Bsb3QoYWVzKHg9dHJpYWwseT1tKSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXA9cGFydGljaXBhbnQpLAogICAgICAgICAgICBzaXplPS4xKSArCiAgZmFjZXRfZ3JpZChsYW5ndWFnZX4uKSArCiAgZ2VvbV9zbW9vdGgoY29sb3VyICAgICAgPSBjb2xzWzNdLAogICAgICAgICAgICAgIHNpemUgICAgICAgID0gMSwKICAgICAgICAgICAgICBhZXMoZmlsbCAgICA9IGxhbmd1YWdlKSwKICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEYpICsKICBteV90aGVtZSgpICsKICBnZ3RpdGxlKCJSVCB3aXRoaW4gYmxvY2tzIikgCgojIE9WRVJBTEwKUlRfb3ZlcmFsbCA8LSBkZiAlPiUgCiAgZ3JvdXBfYnkobGFuZ3VhZ2UscGFydGljaXBhbnQsdHJpYWxDb3VudCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZShtPW1lYW4oUlQpKSAgICAgICAgICAgICAgJT4lCiAgZ2dwbG90KGFlcyh4PXRyaWFsQ291bnQseT1tKSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXA9cGFydGljaXBhbnQpLHNpemU9LjEpICsKICBmYWNldF9ncmlkKGxhbmd1YWdlfi4pICsKICBnZW9tX3Ntb290aChjb2xvdXIgICAgICA9IGNvbHNbM10sCiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgPSAxLAogICAgICAgICAgICAgIGFlcyhmaWxsICAgID0gbGFuZ3VhZ2UpLAogICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRikgKwogIG15X3RoZW1lKCkgKwogIGdndGl0bGUoIlJUIG92ZXJhbGwiKQoKZ3JpZC5hcnJhbmdlKFJUX3dpdGhpbixSVF9vdmVyYWxsLAogICAgICAgICAgICAgIHRvcCA9IGdyaWQ6OnRleHRHcm9iKCJSVCBieSB0cmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3A9Z3Bhcihmb250c2l6ZT0xOCkpKQpgYGAKCldlIHRoZXJlZm9yZSBuZWVkIHRvIGNoZWNrIGZvciBhbmQgcG9zc2libHkgY29udHJvbCBmb3IgdGhlIFJUIHZhcmlhYmxlIGJlaW5nIGNvcnJlbGF0ZWQgd2l0aCBpdHNlbGYuCgpIb3dldmVyLCB0aGUgZm9sbG93aW5nIGF1dG9jb3JyZWxhdGlvbiBwbG90cyB3aXRoIGEgc3Vic2FtcGxlIG9mIHRoaXJ0eSBwYXJ0aWNpcGFudHMgc3VnZ2VzdCB0aGF0IHRoZXJlJ3Mgbm8gZXZpZGVuY2UgZm9yIHNpZ25pZmljYW50IGF1dG9jb3JyZWxhdGlvbiBiZXR3ZWVuIFJUcyBmb3IgbW9zdCBvZiB0aGUgcGFydGljaXBhbnRzLiBXZSBjYW4gdGhlcmVmb3JlIGxlYXZlIFJUcyBhdCB0LTEgb3V0IG9mIHRoZSBtb2RlbC4KCmBgYHtyfQpsaWJyYXJ5KGl0c2FkdWcpCmFjZl9uX3Bsb3RzKGRmJFJUaW52LAogICAgICAgICAgc3BsaXRfYnk9bGlzdChTdWJqZWN0PWRmJHBhcnRpY2lwYW50LCBUcmlhbD1kZiR0cmlhbCksCiAgICAgICAgICBuPTMwKQpgYGAKCiMjIFN1bW1hcnkKCk1ldGhvZHM6CgotIFRoZSBleC1HYXVzc2lhbiBhcHByb2FjaCBmYWlsZWQgdG8gZGV0ZWN0IHNpZ25pZmljYW50IGVmZmVjdHMgaW4gdGhlICRcbXUkIGFuZCAkXHRhdSQgcGFyYW1ldGVycy4gSG93ZXZlciwgCm1vcmUgYWdncmVzc2l2ZSB0cmltbWluZyBtaWdodCB5aWVsZCBzaWduaWZpY2FudCByZXN1bHRzIGluIHNvbWUgb2YgdGhlc2UgYW5hbHlzZXMuCi0gVGhpcyBpcyBhbiBpbnRlcmVzdGluZyBhcHByb2FjaCwgYnV0IGFsc28gcXVpdGUgbGltaXRlZCBpbiB0aGF0IGl0IHJlcXVpcmVzIGFnZ3JlZ2F0aW5nIHRoZSBkYXRhLgotIFRoZSBzYW1lIG1heSBiZSB0cnVlIGZvciB0aGUgY29uZmxpY3QgZWZmZWN0IGFuZCB0aGUgY29lZmZpY2llbnQgb2YgdmFyaWFiaWxpdHkuCi0gQSB0aHJlZS13YXkgaW50ZXJhY3Rpb24gd2FzIHNpZ25pZmljYW50IGluIGFsbCBtaXhlZC1lZmZlY3RzIHJlZ3Jlc3Npb24gbW9kZWxzIHZhcnlpbmcgaW4gdGhlaXIgcmFuZG9tIHN0cnVjdHVyZXMgYmVmb3JlIGFuZCBhZnRlciBhcHBseWluZyBtb2RlbCBjcml0aWNpc20uCgpUaGUgdGhyZWUtd2F5IGludGVyYWN0aW9uIHN1Z2dlc3RzIHRoYXQ6CgotIEFmcmlrYWFucyBzcGVha2VycycgUlRzIHdlcmUgbW9yZSBhZmZlY3RlZCBieSBjb25ncnVlbmNlIGluIHRoZSAnaGVpZ2h0JyBjb25kaXRpb24KLSBYaG9zYSBzcGVha2VycyB3ZXJlIG1vcmUgYWZmZWN0ZWQgYnkgY29uZ3J1ZW5jZSBpbiB0aGUgJ3NpemUnIGNvbmRpdGlvbgoKWGhvc2Egc3BlYWtlcnMgYXBwZWFyIHRvIGhhdmUgc2xpZ2h0bHkgc2xvd2VyIHJlc3BvbnNlcyBvdmVyYWxsLCBidXQgdGhpcyBtYXkgYmUgZHVlIHRvIGdyZWF0ZXIgdmFyaWFiaWxpdHksIHNpbmNlLCBhcyB3ZSBzYXcgaW4gdGhlIGV4LUdhdXNzaWFuIGFuYWx5c2lzLCB0aGV5IGFjdHVhbGx5IGhhdmUgc21hbGxlciAkXG11JCwgYnV0IGxhcmdlciAkXHRhdSQgdmFsdWVzIGNvbXBhcmVkIHdpdGggdGhlIEFmcmlrYWFucyBncm91cC4KCiMgRXhwZXJpbWVudCAzOiBUd28tYWx0ZXJuYXRpdmUgZm9yY2VkLWNob2ljZSB0YXNrCgpXaGVyZWFzIGV4cGVyaW1lbnQgMiB3YXMgZGVzaWduZWQgdG8gdGVzdCBpbXBsaWNpdCBhc3NvY2lhdGlvbnMgYmV0d2VlbiBzcGFjZSBhbmQgcGl0Y2gsIGV4cGVyaW1lbnQgMyBpcyBhaW1lZCBhdCBleHBsaWNpdCBhc3NvY2lhdGlvbnMgd2hlcmUgcGFydGljaXBhbnRzIGNob29zZSBiZXR3ZWVuIGhlaWdodCBhbmQgc2l6ZSBtYXBwaW5ncyBpbiBhIG1peGVkIGNvbmRpdGlvbiwgYW5kIHdoZXRoZXIgdG8gbWF0Y2ggaGlnaC9sb3cgcGl0Y2ggd2l0aCBoaWdoIHZzIGxvdyBwb3NpdGlvbiBhbmQgc21hbGwgdnMuIGJpZy4KCiMjIE1ldGhvZHMKCldlIHJlY3J1aXRlZCAzMCBuYXRpdmUgc3BlYWtlcnMgb2YgWGhvc2EgYW5kIDMwIG5hdGl2ZSBzcGVha2VycyBvZiBBZnJpa2FhbnMgZm9yIGV4cGVyaW1lbnQgMy4gCgpQYXJ0aWNpcGFudHMgcGVyZm9ybWVkIGEgdHdvLWFsdGVybmF0aXZlIGZvcmNlZC1jaG9pY2UgdGFzayB0YXJnZXRpbmcgZXhwbGljaXQgc3BhY2UtcGl0Y2ggYXNzb2NpYXRpb25zIGJ5IHBhaXJpbmcgcGl0Y2ggd2l0aCBjaXJjbGVzIGRpZmZlcmluZyBpbiB2ZXJ0aWNhbCBwb3NpdGlvbiAoaGlnaC9sb3csIGhlaWdodCBjb25kaXRpb24pIG9yIHNpemUgKHNtYWxsLCBiaWcpLiBJbiBhIHRoaXJkIGNvbmRpdGlvbiAob3IgdHJpYWwgdHlwZSksIHBhcnRpY2lwYW50cyBoYWQgdG8gY2hvb3NlIGJldHdlZW4gbWFwcGluZyBwaXRjaCB0byBlaXRoZXIgYSBoaWdoL2xvdyBvciBhIHNtYWxsL2JpZyBjaXJjbGUuCgpUaGVyZSB3ZXJlIDQwIHRyaWFscyBwZXIgcGFydGljaXBhbnQuIFRoZSBvcmRlciBvZiB0cmlhbCB0eXBlcyB3YXMgcmFuZG9taXNlZC4KCldlIGFsc28gcmVjb3JkZWQgUlRzIGluIGVhY2ggdHJpYWwuCgpXZSBhZ2FpbiB1c2UgbWl4ZWQtZWZmZWN0cyByZWdyZXNzaW9uIHRvIGFuYWx5c2UgdGhlIGRhdGEuCgojIyBIeXBvdGhlc2VzCgotIFhob3NhIHNwZWFrZXJzJyB3aWxsIGJlIG1vcmUgbGlrZWx5IHRvIHBhaXIgcGl0Y2ggd2l0aCAnc2l6ZScgaW4gdGhlIG1peGVkIGNvbmRpdGlvbiBjb21wYXJlZCB3aXRoIEFmcmlrYWFucyBzcGVha2Vycy4KLSBObyBncm91cCBkaWZmZXJlbmNlcyBpbiBzdGltdWx1cyBwYWlyaW5nIGluIHRoZSAnaGVpZ2h0JyBhbmQgJ3NpemUnIGNvbmRpdGlvbnMuIEUuZy4gaGlnaCBwaXRjaCB3aWxsIGNvbnNpc3RlbnRseSBiZSBwYWlyZWQgd2l0aCBoaWdoIGFuZCBzbWFsbCBjaXJjbGVzLgotIFJUcyB3aWxsIGJlIHNsb3dlciBpbiB0aGUgbWl4ZWQgY29uZGl0aW9uIGZvciBib3RoIGdyb3Vwcy4KCgpgYGB7cn0KZGYgPC0gcmVhZC5jc3YoImZvcmNlZF9jaG9pY2VfYW5hbHlzaXNfc2Eta29waS90YXNrXzNfZGF0YWZpbGUuY3N2IikgJT4lIAogIGFzX3RpYmJsZSgpCgpjb2xzICA8LSB1bm5hbWUoc3RlbGxlbmJvc2NoX2NvbG91cnNbYygiZ3JlZW4iLCJzaGlyYXoiLCJraGFraSIpXSkKZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MC4xKQpgYGAKCiMjIE1peGVkIGNvbmRpdGlvbgoKVGhlIHBsb3QgYW5kIG91dHB1dCBiZWxvdyBpbmRpY2F0ZSB0aGF0IFhob3NhIHNwZWFrZXJzLCB3aGVuIGdpdmVuIHRoZSBwb3NzaWJpbGl0eSBvZiBwYWlyaW5nIGVpdGhlciB2aXN1YWwgaGVpZ2h0IG9yIHNpemUgd2l0aCBwaXRjaCwgYXJlIGxlc3MgbGlrZWx5IHRvIHNlbGVjdCBzaXplIHRoYW4gQWZyaWthYW5zIHNwZWFrZXJzLgoKYGBge3J9CiMjIyMjIyMgTUlYRUQgQ09ORElUSU9OICMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGZfbSA8LSBkZiAlPiUgCiAgZmlsdGVyKGNvbmRpdGlvbj09Im1peGVkIiAmIGNvbmdydWVudCA9PVRSVUUpCgptaXhlZCA8LSBkZl9tICU+JQogIGdyb3VwX2J5KGxhbmd1YWdlLHBhcnRpY2lwYW50LHZvaWNlLGNob2ljZURpbWVuc2lvbikgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQogIGNvbXBsZXRlKGNob2ljZURpbWVuc2lvbiwgCiAgICAgICAgICAgbmVzdGluZyhwYXJ0aWNpcGFudCksIAogICAgICAgICAgIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgbXV0YXRlKGZyZXEgPSBuIC8gc3VtKG4pLCAKICAgICAgICAgd3Q9c3VtKG4pKSAlPiUKICBncm91cF9ieShsYW5ndWFnZSx2b2ljZSxjaG9pY2VEaW1lbnNpb24pICU+JQogIHN1bW1hcmlzZShGcmVxID0gd2VpZ2h0ZWQubWVhbihmcmVxLHd0KSwKICAgICAgICAgICAgc2UgICA9IHNxcnQoSG1pc2M6Ond0ZC52YXIoZnJlcSx3dCkpL3NxcnQobGVuZ3RoKHVuaXF1ZShwYXJ0aWNpcGFudCkpKSkgJT4lCiAgdW5ncm91cCgpCgojIGxpbmVzCm1peGVkICU+JSAKICBnZ3Bsb3QoYWVzKHg9Y2hvaWNlRGltZW5zaW9uLHk9RnJlcSxjb2xvdXI9bGFuZ3VhZ2UpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGxhbmd1YWdlKSwKICAgICAgICAgICAgc2l6ZSAgICAgID0gMSwKICAgICAgICAgICAgcG9zaXRpb24gID0gZG9kZ2UpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gZG9kZ2UpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gRnJlcS1zZSx5bWF4ID0gRnJlcStzZSksCiAgICAgICAgICAgICAgICB3aWR0aCAgICA9IC4zLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBkb2RnZSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYyhjb2xzWzFdLGNvbHNbMl0pKSArCiAgZmFjZXRfd3JhcCh+dm9pY2UpICsKICBnZ3RpdGxlKCJQYWlyaW5nIHBpdGNoIHdpdGggSGVpZ2h0IHZzLiBTaXplIikgKwogIG15X3RoZW1lKCkKCmZpdDEgPSBnbG1lcihjaG9pY2VEaW1lbnNpb24gfiB2b2ljZSAqIGxhbmd1YWdlICsgKDF8cGFydGljaXBhbnQpLGZhbWlseT0iYmlub21pYWwiLGRhdGE9ZGZfbSkKc3VtbWFyeShmaXQxKQpgYGAKCldlIGZpbmQgYW4gaW50ZXJhY3Rpb24gZWZmZWN0IGJldHdlZW4gbGFuZ3VhZ2UgYW5kIHZvaWNlIGZyZXF1ZW5jeS4KCkNvbnRyYXJ5IHRvIG91ciBleHBlY3RhdGlvbnMsIEFmcmlrYWFucyBzcGVha2VycyB3ZXJlIG1vcmUgbGlrZWx5IHRvIHBhaXIgc21hbGwgY2lyY2xlcyB3aXRoIGhpZ2gtcGl0Y2hlZCB2b2ljZXMgcmF0aGVyIHRoYW4gY2lyY2xlcyB3aXRoIGEgaGlnaCBwb3NpdGlvbi4gCgpUaGUgb3Bwb3NpdGUgcGF0dGVybnMgd2FzIGZvdW5kIGZvciBYaG9zYSBzcGVha2Vycywgd2hvIHByZWZlcnJlZCB0aGUgJ2hlaWdodCcgbWFwcGluZy4KCkZvciBsb3ctcGl0Y2hlZCB2b2ljZXMsIGJvdGggZ3JvdXAgY29uc2lzdGVudGx5IGZhdm91cmVkIHRoZSAnc2l6ZScgbWFwcGluZy4KCiMjIEhlaWdodCBjb25kaXRpb24KCmBgYHtyfQojIyMjIyMjIEhFSUdIVCBDT05ESVRJT04gIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpkZl9oIDwtIGRmICU+JSAKICBmaWx0ZXIoY29uZGl0aW9uPT0iaGVpZ2h0IikKCmhlaWdodCA8LSBkZl9oICU+JQogIGdyb3VwX2J5KGxhbmd1YWdlLHBhcnRpY2lwYW50LHZvaWNlLGNob2ljZU5hbWUpICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUKICBjb21wbGV0ZShjaG9pY2VOYW1lLCAKICAgICAgICAgICBuZXN0aW5nKHBhcnRpY2lwYW50KSwgCiAgICAgICAgICAgZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBtdXRhdGUoZnJlcSA9IG4gLyBzdW0obiksIAogICAgICAgICB3dD1zdW0obikpICU+JQogIGdyb3VwX2J5KGxhbmd1YWdlLHZvaWNlLGNob2ljZU5hbWUpICAgICAgJT4lCiAgc3VtbWFyaXNlKEZyZXEgPSB3ZWlnaHRlZC5tZWFuKGZyZXEsd3QpLAogICAgICAgICAgICBzZSA9IHNxcnQoSG1pc2M6Ond0ZC52YXIoZnJlcSx3dCkpL3NxcnQobGVuZ3RoKHVuaXF1ZShwYXJ0aWNpcGFudCkpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihGcmVxPjApCiAgCiMgbGluZXMKaGVpZ2h0ICU+JSAKICBnZ3Bsb3QoYWVzKHg9Y2hvaWNlTmFtZSx5PUZyZXEsY29sb3VyPWxhbmd1YWdlKSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBsYW5ndWFnZSksCiAgICAgICAgICAgIHNpemUgPSAxLAogICAgICAgICAgICBwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IEZyZXEtc2UseW1heCA9IEZyZXErc2UpLAogICAgICAgICAgICAgICAgd2lkdGggICAgPS4zLAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBkb2RnZSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoY29sc1sxXSxjb2xzWzJdKSkgKwogIG15X3RoZW1lKCkgKwogIGdndGl0bGUoIlBhaXJpbmcgcGl0Y2ggd2l0aCBoaWdoIHZzLiBsb3cgY2lyY2xlcyIpICsKICBmYWNldF93cmFwKH52b2ljZSkKCmZpdDIgPSBnbG1lcihjaG9pY2VOYW1lIH4gdm9pY2UgKiBsYW5ndWFnZSArICgxK3ZvaWNlfHBhcnRpY2lwYW50KSxmYW1pbHk9ImJpbm9taWFsIixkYXRhPWRmX2gpCnN1bW1hcnkoZml0MikKYGBgCgpJbiB0aGUgJ2hlaWdodCcgY29uZGl0aW9uLCB3ZSBmaW5kIGEgc2lnbmlmaWNhbnQgZWZmZWN0IGZvciB2b2ljZSBmcmVxdWVuY3kuIFRoZSB0cmVuZCBmdXJ0aGVyIHN1Z2dlc3RzIGFuIGludGVyYWN0aW9uIHN1Y2ggdGhhdCBBZnJpa2FhbnMgc3BlYWtlcnMgYXJlIG1vcmUgY29uc2lzdGVudCBpbiBtYXBwaW5nIGhpZ2gvbG93IHZvaWNlcyB0byBoaWdoL2xvdyBjaXJjbGVzLgoKIyMgU2l6ZSBjb25kaXRpb24KCmBgYHtyfQojIyMjIyMjIFNJWkUgQ09ORElUSU9OICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmRmX3MgPC0gZGYgJT4lIAogIGZpbHRlcihjb25kaXRpb249PSJzaXplIikKCnNpemUgPC0gZGZfcyAlPiUKICBncm91cF9ieShsYW5ndWFnZSxwYXJ0aWNpcGFudCx2b2ljZSxjaG9pY2VOYW1lKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lCiAgY29tcGxldGUoY2hvaWNlTmFtZSwgCiAgICAgICAgICAgbmVzdGluZyhwYXJ0aWNpcGFudCksIAogICAgICAgICAgIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgbXV0YXRlKGZyZXEgPSBuIC8gc3VtKG4pLCAKICAgICAgICAgd3Q9c3VtKG4pKSAlPiUKICBncm91cF9ieShsYW5ndWFnZSx2b2ljZSxjaG9pY2VOYW1lKSAlPiUKICBzdW1tYXJpc2UoRnJlcSA9IHdlaWdodGVkLm1lYW4oZnJlcSx3dCksCiAgICAgICAgICAgIHNlID0gc3FydChIbWlzYzo6d3RkLnZhcihmcmVxLHd0KSkvc3FydChsZW5ndGgodW5pcXVlKHBhcnRpY2lwYW50KSkpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKEZyZXE+MCkKCiMgbGluZXMKc2l6ZSAlPiUgCiAgZ2dwbG90KGFlcyh4PWNob2ljZU5hbWUseT1GcmVxLGNvbG91cj1sYW5ndWFnZSkpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gbGFuZ3VhZ2UpLAogICAgICAgICAgICBzaXplID0gMSwKICAgICAgICAgICAgcG9zaXRpb24gPSBkb2RnZSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBkb2RnZSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBGcmVxLXNlLHltYXggPSBGcmVxK3NlKSwKICAgICAgICAgICAgICAgIHdpZHRoICAgID0uMywKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gZG9kZ2UpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKGNvbHNbMV0sY29sc1syXSkpICsKICBteV90aGVtZSgpICsKICBnZ3RpdGxlKCJQYWlyaW5nIHBpdGNoIHdpdGggc21hbGwgdnMuIGJpZyBjaXJjbGVzIikgKwogIGZhY2V0X3dyYXAofnZvaWNlKQoKZml0MyA9IGdsbWVyKGNob2ljZU5hbWUgfiB2b2ljZSAqIGxhbmd1YWdlICsgKDF8cGFydGljaXBhbnQpLGZhbWlseT0iYmlub21pYWwiLGRhdGE9ZGZfcykKc3VtbWFyeShmaXQzKQpgYGAKCgpJbiB0aGUgJ3NpemUnIGNvbmRpdGlvbiwgd2Ugc2VlIGEgY2xlYXIgaW50ZXJhY3Rpb24gYmV0d2VlbiBsYW5ndWFnZSBhbmQgdm9pY2UgZnJlcXVlbmN5LgoKVGhlIHR3byBsYW5ndWFnZSBncm91cHMgc2hvd2VkIGhpZ2ggYWdyZWVtZW50IGluIHBhaXJpbmcgbG93IHBpdGNoIHdpdGggYmlnLCByYXRoZXIgdGhhbiBzbWFsbCBjaXJjbGVzLgoKSW50ZXJlc3RpbmdseSwgWGhvc2Egc3BlYWtlcnMgYWxzbyBzaG93ZWQgYSBzbGlnaHQgcHJlZmVyZW5jZSBmb3IgcGFpcmluZyAqaGlnaCogcGl0Y2ggd2l0aCBiaWcgY2lyY2xlcywgd2hlcmVhcyBBZnJpa2FhbnMgc3BlYWtlcnMgbW9yZSBjb25zaXN0ZW50bHkgcGFpcmVkIGhpZ2ggcGl0Y2ggd2l0aCBzbWFsbCBjaXJjbGVzLgoKIyMgUlQgYW5hbHlzZXMKCkZpbmFsbHksIGFzIGxhcmdlIFJUcyBtaWdodCBiZSBpbmRpY2F0aXZlIG9mIHVuY2VydGFpbnR5LCB3ZSdsbCBleGFtaW5lIHdoZXRoZXIgdGhlcmUgYXJlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIFJUcyByZWxhdGVkIHRvIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMuCgpUaGUgZGF0YSBoYXMgYmVlbiB0cmltbWVkIHRvIG9ubHkgaW5jbHVkZSByZXNwb25zZXMgZmFzdGVyIHRoYW4gMjAgc2Vjb25kcy4KCk5vdCBzaG93biBoZXJlIGFyZSBRUS1wbG90cyBhbmQgY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGluZGljYXRpbmcgdGhhdCB0aGUgbG9nLW5vcm1hbCB0cmFuc2Zvcm1hdGlvbiBwcm92aWRlcyB0aGUgYmVzdCBmaXQgZm9yIG91ciBkYXRhLgpXZSB3aWxsIGFsc28gYXBwbHkgbW9kZWwgY3JpdGljaXNtIGFuZCBvbmx5IGV4YW1pbmUgdGhlIGZpbmFsIG1vZGVsLgoKQXMgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBoYXMgbW9yZSB0aGFuIHR3byBsZXZlbHMgZm9yIGNvbXBhcmlzb24sIHdlJ2xsIGJhc2Ugb3VyIGFuYWx5c2lzIG9uIGFuIGFub3ZhIHRhYmxlIHN1bW1hcml6aW5nIHRoZSByZWdyZXNzaW9uIG91dHB1dC4KCmBgYHtyfQojIGxpbmVzCmRmICU8PiUgZmlsdGVyKFJUIDwgMjApCgpkZiAlPiUgCiAgUm1pc2M6OnN1bW1hcnlTRShtZWFzdXJldmFyID0gIlJUIiwgZ3JvdXB2YXJzID0gYygibGFuZ3VhZ2UiLCJjb25kaXRpb24iLCJ2b2ljZSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Y29uZGl0aW9uLHk9UlQsY29sb3VyPWxhbmd1YWdlKSkgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBsYW5ndWFnZSksCiAgICAgICAgICAgIHNpemUgPSAxLAogICAgICAgICAgICBwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IGRvZGdlKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IFJULXNlLHltYXggPSBSVCtzZSksCiAgICAgICAgICAgICAgICB3aWR0aCAgICA9LjMsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGRvZGdlKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Yyhjb2xzWzFdLGNvbHNbMl0pKSArCiAgbXlfdGhlbWUoKSArCiAgZ2d0aXRsZSgiUlRzIikgKwogIGZhY2V0X3dyYXAofnZvaWNlKQoKZml0UlQgPC0gbG1lcihsb2coUlQpIH4gbGFuZ3VhZ2Uqdm9pY2UqY29uZGl0aW9uICsgKDF8cGFydGljaXBhbnQpLCBkYXRhID1kZikKYW5vdmEoZml0UlQpICAKYGBgCgpUaGUgaW50ZXJhY3Rpb24gcGxvdHMgYW5kIGFub3ZhIHRhYmxlIHJldmVhbCBzaWduaWZpY2FudCBtYWluIGVmZmVjdHMgb2YgbGFuZ3VhZ2UsIHZvaWNlIGZyZXF1ZW5jeSBhbmQgY29uZGl0aW9uIHdpdGggbm8gaW50ZXJhY3Rpb24gZWZmZWN0cy4KWGhvc2Egc3BlYWtlcnMgZ2VuZXJhbGx5IHRvb2sgbG9uZ2VyIGluIHNlbGVjdGluZyB2aXN1YWwgc3RpbXVsaSwgd2hpY2ggd2FzIHRvIGJlIGV4cGVjdGVkIG9uIHRoZSBiYXNpcyBvZiB0aGVpciBsb3dlciBjb25zaXN0ZW5jeSBpbiBhbGwgY29uZGl0aW9ucy4KCkludGVyZXN0aW5nbHksIG91ciBleHBlY3RhdGlvbiB0aGF0IHRoZSBtaXhlZCBjb25kaXRpb24gd291bGQgZ2l2ZSByaXNlIHRvIHRoZSBsb25nZXN0IFJUcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZXN1bHRzLiBJbnN0ZWFkIHRoZSAnaGVpZ2h0JyBjb25kaXRpb24gY29uc2lzdGVudGx5IGdhdmUgcmlzZSB0byBzbG93ZXIgZGVjaXNpb25zIGRlc3BpdGUgYmVpbmcgdGhlIG1vcmUgZG9taW5hbnQgbWFwcGluZyBpbiBzcGVlY2guCgojIyBTdW1tYXJ5CgpUaGlzIGV4cGVyaW1lbnQgeWllbGRlZCBzb21lIHZlcnkgaW50ZXJlc3RpbmcgYW5kIHN1cnByaXNpbmcgcmVzdWx0cy4KCk92ZXJhbGwsIFhob3NhIHNwZWFrZXJzIHdlcmUgbGVzcyBjb25zaXN0ZW50IGluIGhvdyB0aGV5IG1hcHBlZCBzcGFjZSB0byBwaXRjaCwgYm90aCB3aGVuIGNob29zaW5nIHZpc3VhbCBzdGltdWxpIG9mIG9wcG9zaXRlIHNwYXRpYWwgcG9sYXJpdGllcywgYW5kIHdoZW4gY2hvb3NpbmcgYmV0d2VlbiBoZWlnaHQgYW5kIHNpemUuCgpTdXJwcmlzaW5nbHksIEFmcmlrYWFucyBzcGVha2VycyBjb25zaXN0ZW50bHkgcHJlZmVycmVkIHRoZSBzaXplIG1hcHBpbmcgZm9yIGJvdGggaGlnaCBhbmQgbG93LXBpdGNoZWQgdm9pY2VzLCB3aGVyZWFzIFhob3NhIHNwZWFrZXJzIHNob3dlZCBhIHByZWZlcmVuY2UgZm9yICdoZWlnaHQnIGluIGNhc2VzIHdpdGggbG93IHBpdGNoLCBhbmQgJ3NpemUnIGluIGNhc2VzIHdpdGggaGlnaCBwaXRjaC4KCkFub3RoZXIgc3RyaWtpbmcgZmluZGluZyB3YXMgdGhhdCwgaW4gdGhlIHNpemUgY29uZGl0aW9uLCBYaG9zYSBzcGVha2VycyBzaG93ZWQgYSBwcmVmZXJlbmNlIGZvciBtYXBwaW5nIGJpZyBjaXJjbGVzIHRvIGJvdGggbG93IHBpdGNoICphbmQqIGhpZ2ggcGl0Y2gsIHRob3VnaCB0byBhIGxlc3NlciBleHRlbnQuCgpUaGVyZSBhcHBlYXJzIHRvIGJlIG1vcmUgaW5kaXZpZHVhbCB2YXJpYXRpb24gZm9yIFhob3NhIHNwZWFrZXJzIGluIHRoaXMgdGFzaywgYm90aCBpbiBjaG9vc2luZyBiZXR3ZWVuIG1hcHBpbmdzLCBhcyB3ZWxsIGFzIGNob29zaW5nIHBvbGFyaXR5IGNvcnJlc3BvbmRlbmNlcyAqd2l0aGluKiBwYXJ0aWN1bGFyIG1hcHBpbmdzLgoKSW4gdGhpcyBleHBlcmltZW50LCBsaW5ndWlzdGljIG1ldGFwaG9ycyBwcm92ZWQgdG8gYmUgcG9vciBwcmVkaWN0b3JzIG9mIG5vbi1saW5ndWlzdGljIGNob2ljZXMgd2l0aCByZWdhcmRzIHRvIHNwYXRpYWwgbWFwcGluZ3MuCgojIENvbmNsdXNpb24KCkluIHRoZSBzZXJpZXMgb2YgZXhwZXJpbWVudHMsIHdlIGV4YW1pbmVkIHNwYXRpYWwgbWV0YXBob3JzIGZvciBwaXRjaCBmcm9tIHRocmVlIGFuZ2xlczogbGFuZ3VhZ2UgcHJvZHVjdGlvbiwgcGVyZm9ybWFuY2UgaW4gYSBub252ZXJiYWwgaW1wbGljaXQgYXNzb2NpYXRpb24gdGFzayBhbmQgbm9udmVyYmFsIGp1ZGdlbWVudHMgaW4gYW4gZXhwbGljaXQgYXNzb2NpYXRpb24gdGFzay4KCk91ciBsYW5ndWFnZSBwcm9kdWN0aW9uIGZpbmRpbmdzIHNob3cgdGhhdCAnaGVpZ2h0JyBpcyB1c2VkIGluIEFkcmlrYWFucywgd2hlcmVhcyBYaG9zYSBzcGVha2VycyBhbHNvIHVzZWQgJ3NpemUnLiBJbnRlcmVzdGluZ2x5LCBhbmQgaW4gbGluZSB3aXRoIG91ciBmaW5kaW5ncyBmcm9tIGEgcHJldmlvdXMgc3R1ZHksIHZlcnRpY2FsIGdlc3R1cmVzIGZyZXF1ZW50bHkgYWNjb21wYW55ICdoZWlnaHQnIGJ1dCBhbHNvICdzaXplJyBtZXRhcGhvcnMuIFRoZSBzcGVlY2ggbWF0ZXJpYWwgZG9lcyBub3QgYWxsb3cgdXMgZGV0ZXJtaW5lIHdoZXRoZXIgZ2VzdHVyYWwgaW5kaWNhdGlvbnMgb2YgaGVpZ2h0IG1pZ2h0IHJlZmVyIHRvIHRoZSBwaHlzaWNhbCBzaXplL2hlaWdodCBvZiBhIHBlcnNvbiBsaWtlbHkgdG8gcHJvZHVjZSB0aGUgaGVhcmQgc291bmRzLgoKSW4gdGhlIFJUIHRhc2ssIHdlIGZvdW5kIGEgdGhyZWUtd2F5IGludGVyYWN0aW9uIHRoYXQgZm9sbG93ZWQgb3VyIHByZWRpY3Rpb25zLiBIb3dldmVyLCBtZXRob2RzIHJlcXVpcmluZyBkYXRhIGFnZ3JlZ2F0aW9uIGZhaWxlZCB0byBkZXRlY3QgdGhpcyBlZmZlY3QuIEkgd291bGQgc3VnZ2VzdCByZXBvcnRpbmcgdGhlIHN0YXRpc3RpY2FsbHkgbW9yZSBzb3BoaXN0aWNhdGVkIG1peGVkLWVmZmVjdCByZWdmcmVzc2lvbiBtb2RlbCB3aXRoIG1heGltYWwgcmFuZG9tIHN0cnVjdHVyZSwgYnV0IHBlcmhhcHMgYWxzbyBub3RpbmcgdGhhdCBhbiBleC1HYXVzc2lhbiBhcHByb2FjaCBmYWlsZWQgdG8gZGV0ZWN0IGFueSBzaWduaWZpY2FudCBlZmZlY3RzLiBBcyB0aGUgbGFzdCBpbnRlcmFjdGlvbiBwbG90IGluZGljYXRlcywgdGhlIGVmZmVjdCBpcyBmYXIgZnJvbSBzcGVjdGFjdWxhciAoYXMgb3Bwb3NlZCB0byBwcmV2aW91cyBmaW5kaW5ncyBpbiB0aGUgbGl0ZXJhdHVyZSkuCgpUaGUgcmVzdWx0cyBmcm9tIHRoZSBoaXJkIGV4cGVyaW1lbnQgc2VlbSBtb3JlIHB1enpsaW5nLiBXZSBkaWQgbm90IGV4cGVjdCBBZnJpa2FhbnMgc3BlYWtlcnMgdG8gY29uc2lzdGVudGx5IG1hcCBwaXRjaCB0byAnc2l6ZScuIE5vciBkaWQgd2UgZXhwZWN0IFhob3NhIHNwZWFrZXJzIHRvIGNob29zZSAnaGVpZ2h0Jy8nc2l6ZScgZGVwZW5kaW5nIG9uIHRoZSBwaXRjaCBvZiB0aGUgdm9pY2UuCgpJbiB0aGUgaGVpZ2h0IGFuZCBzaXplIGNvbmRpdGlvbnMsIEFmcmlrYWFucyBzcGVha2VycyBwYWlyZWQgcGl0Y2ggd2l0aCBoaWdoL2xvdy9iaWcvc21hbGwgYXMgZXhwZWN0ZWQsIHdoZXJlYXMgWGhvc2Egc3BlYWtlcnMgd2VyZSBtdWNoIGxlc3MgY29uc2lzdGVudCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhleSBoYWQgYSBjbGVhciBwcmVmZXJlbmNlIGZvciBwYWlyaW5nICJsb3ciIHBpdGNoIHdpdGggYmljIGNpcmNsZXMgYXMgb3Bwb3NlZCB0byBzbWFsbCBjaXJjbGVzLgpGdXJ0aGVyIHN0dWRpZXMgd2l0aCBvdGhlciB0eXBlcyBvZiBzdGltdWxpIG1pZ2h0IHNoZWQgbGlnaHQgb24gdGhlIGxhdHRlciBmaW5kaW5ncwoKQXMgSSBzZWUgaXQsIG91ciBmaW5kaW5ncyBwb2ludCBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucyBhbmQgb25seSBzdXBwb3J0IHRoZSB2ZXJ5IGdlbmVyYWwgaWRlYSB0aGF0IHRoZSBjb25jZXB0dWFsaXNhdGlvbiBvZiBwaXRjaCBpcywgdG8gc29tZSBleHRlbnQsIHNwYXRpYWwsIGJ1dCBmbGV4aWJsZS4gVGhlIGZhY3RvcmlhbCBkZXNpZ25zIGRlbW9uc3RyYXRlZCBkaWZmZXJlbnQgZWZmZWN0cyBvZiBtYW5pcHVsYXRpbmcgdmlzdWFsIHNpemUgYW5kIGhlaWdodCBmb3IgdGhlIHR3byBncm91cHMsIGJ1dCBvbmx5IGluIHRoZSBjYXNlIG9mIG1peGVkLWVmZmVjdHMgcmVncmVzc2lvbi4gVGhlIHJvbGUgb2YgbGFuZ3VhZ2UgaW4gc2hhcGluZyB0aGUgY29uY2VwdHVhbGlzYXRpb24gb2YgcGl0Y2ggaXMgdW5jbGVhciwgYnV0IGZhciBmcm9tIGRldGVybWluaXN0aWMuIFRoaXMgaXMgcGFydGljdWxhcmx5IGV2aWRlbnQgZnJvbSB0aGUgY29udHJhZGljdG9yeSBmaW5kaW5ncyBpbiBleHBlcmltZW50IDMuCgojIFJlZmVyZW5jZXMgYW5kIHJlYWRpbmdzCgpBYnV0YWxlYmksIEouLCBHdWlkaSwgTC4sIEJvcnNhLCBWLiwgQ2FuaW5pLCBNLiwgRGVsbGEgUm9zYSwgUC4gQS4sIFBhcnJpcywgQi4gQS4sICYgV2Vla2VzLCBCLiBTLiAoMjAxNSkuIEJpbGluZ3VhbGlzbSBwcm92aWRlcyBhIG5ldXJhbCByZXNlcnZlIGZvciBhZ2luZyBwb3B1bGF0aW9ucy4gTmV1cm9wc3ljaG9sb2dpYSwgNjksIDIwMeKAkzIxMC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5uZXVyb3BzeWNob2xvZ2lhLjIwMTUuMDEuMDQwCgpCYWF5ZW4sIEguIFIuLCAmIE1pbGluLCBQLiAoMjAxMCkuIEFuYWx5emluZyByZWFjdGlvbiB0aW1lcy4gSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIFBzeWNob2xvZ2ljYWwgUmVzZWFyY2gsIDMoMiksIDEyLiBodHRwczovL2RvaS5vcmcvMTAuMjE1MDAvMjAxMTIwODQuODA3CgpDYWxhYnJpYSwgTS4sIEhlcm5hbmRleiwgTS4sIE1hcnRpbiwgQy4gRC4sICYgQ29zdGEsIEEuICgyMDExKS4gV2hlbiB0aGUgVGFpbCBDb3VudHM6IFRoZSBBZHZhbnRhZ2Ugb2YgQmlsaW5ndWFsaXNtIFRocm91Z2ggdGhlIEV4LUdhdXNzaWFuIERpc3RyaWJ1dGlvbiBBbmFseXNpcy4gRnJvbnRpZXJzIGluIFBzeWNob2xvZ3ksIDIuIGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2Zwc3lnLjIwMTEuMDAyNTAKCkhlbnJpcXVlei1IZW5yaXF1ZXosIE0uIFAuLCBCaWxsZWtlLCBQLiwgSGVucmlxdWV6LCBILiwgWmFtb3Jhbm8sIEYuIEouLCBSb3RoaGFtbWVyLCBGLiwgJiBBYm9pdGl6LCBGLiAoMjAxNSkuIEludHJhLUluZGl2aWR1YWwgUmVzcG9uc2UgVmFyaWFiaWxpdHkgQXNzZXNzZWQgYnkgRXgtR2F1c3NpYW4gQW5hbHlzaXMgbWF5IGJlIGEgTmV3IEVuZG9waGVub3R5cGUgZm9yIEF0dGVudGlvbi1EZWZpY2l0L0h5cGVyYWN0aXZpdHkgRGlzb3JkZXIuIEZyb250aWVycyBpbiBQc3ljaGlhdHJ5LCA1LiBodHRwczovL2RvaS5vcmcvMTAuMzM4OS9mcHN5dC4yMDE0LjAwMTk3CgpMYWNoYXVkLCBDLiBNLiwgJiBSZW5hdWQsIE8uICgyMDExKS4gQSB0dXRvcmlhbCBmb3IgYW5hbHl6aW5nIGh1bWFuIHJlYWN0aW9uIHRpbWVzOiBIb3cgdG8gZmlsdGVyIGRhdGEsIG1hbmFnZSBtaXNzaW5nIHZhbHVlcywgYW5kIGNob29zZSBhIHN0YXRpc3RpY2FsIG1vZGVsLiBBcHBsaWVkIFBzeWNob2xpbmd1aXN0aWNzLCAzMigwMiksIDM4OeKAkzQxNi4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTcvUzAxNDI3MTY0MTAwMDA0NTcKCk1hcnNkZW4sIEUuLCBUaG9tcHNvbiwgUy4sICYgUGxvbnNreSwgTC4gKDIwMTgpLiBBIG1ldGhvZG9sb2dpY2FsIHN5bnRoZXNpcyBvZiBzZWxmLXBhY2VkIHJlYWRpbmcgaW4gc2Vjb25kIGxhbmd1YWdlIHJlc2VhcmNoLiBBcHBsaWVkIFBzeWNob2xpbmd1aXN0aWNzLCAzOSgwNSksIDg2MeKAkzkwNC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTcvUzAxNDI3MTY0MTgwMDAwMzYKClJhdGNsaWZmLCBSLiAodS7DpS4pLiBNZXRob2RzIGZvciBEZWFsaW5nIFdpdGggUmVhY3Rpb24gVGltZSBPdXRsaWVycywgMjMuCldoZWxhbiwgUi4gKDIwMTApLiBFZmZlY3RpdmUgYW5hbHlzaXMgb2YgcmVhY3Rpb24gdGltZSBkYXRhLiBUaGUgUHN5Y2hvbG9naWNhbCBSZWNvcmQsIDU4KDMpLiBIZW50ZXQgZnJhIGh0dHBzOi8vb3BlbnNpdWMubGliLnNpdS5lZHUvdHByL3ZvbDU4L2lzczMvOQoKCgoK