About

Overview

This ADA uses data from the project “The effect of intranasal oxytocin on neural functioning in widow(er)s” (#1503744420, PI: Mary-Frances O’Connor, Co-PI: Brian Arizmendi). It was a double-blind randomized crossover study, designed to address conflicting accounts of motivated behavior in complicated grief using a novel approach-avoidance task variant (grief AAT; gAAT) that allows for comparison between participant-provided photos and nomothetic grief stimuli. Participants were 40 bereaved adults ages 55-80, who experienced the death of a spouse or long-term romantic partner between six months and three years prior to their participation.

Task

Participants attended two identical experimental sessions, at which they received one of two intranasal sprays (treatment A/B) and then took part in an fMRI scan, which involved a structural sequence, the gAAT, and a resting state sequence.

For the gAAT, five stimulus categories were presented: (1) deceased spouse, (2) living loved one [another attachment figure], (3) stranger, (4) generic grief-related scenes, and (5) neutral scenes. Photos provided by the participant were scanned and resized to a standard 750-pixel height and width, and framed in colored frames to match the stimuli used for non-idiographic categories (i.e., stranger, grief-related, neutral). Photos of the stranger were sex-matched to the participant’s partner.

During the task, participants were instructed to follow rules based on an irrelevant characteristic of the stimuli, namely, the color of the frame around the photo (e.g., “push the joystick when the frame is blue, pull when the frame is yellow”). The task was completed in two runs of approximately seven minutes each. In the second run, the instructions were reversed (e.g. “now pull the joystick for blue framed photos”). Order of instructions was counterbalanced across participants. Stimuli were presented via Inquisit 4 (2014), in a pseudorandomized order determined by genetic algorithm to optimize statistical power and psychological validity (Wager & Nichols, 2003). Each trial last 3000ms, with 2500 ms allowed for response. Intertrial interval was 500ms.

Participants completed the task using an MRI-compatible joystick. The stimuli were animated so that a joystick push would make the image smaller (as if they were pushing it away from them) and a joystick pull would make the image larger (as if they were bringing it nearer to them).

Variables

The primary dependent variable of interest for the present analysis is reaction time bias, computed as RTpush-RTpull. Negative bias scores (faster to push than pull) indicate relative avoidance bias, while positive scores (faster to pull than to push) indicate relative approach bias. Because the two runs were identical in every way except for the instruction provided, each trial had both a push RT and a pull RT (e.g., run1 trial1 was push, run2 trial1 was pull, so subtract RT on run2 trial 1 from run1 trial1 to get the difference - this is further elaborated in the data cleaning script below), unless they failed to reverse the instructions.

Main predictors of interest included trial number (in order to establish whether peoples’ response bias changed over the 7-minute run), stimulus (neutral, spouse, stranger, living loved one, death), and condition (treatment A/B - oxytocin or placebo [I’m still blinded]).

Participants also completed a number of self-report measures (state and trait) and provided biological samples for OXTR genotyping and cortisol assay, some of which were used as predictors.

Equations

Level 1:

We first performed MLM to estimate the effect of trial number (i.e., the random effect of time) on response bias (push RT-pull RT) on a given trial. The level-1 model estimated, for each participant j (j = 1–35), a regression line that predicted each participant’s response bias in milliseconds on each trial i from the trial number. This model was represented as follows:
[biasi]j = b0j + b1j [trialnumberi] + rij

where b0j, the intercept, is interpreted as participant j’s mean response bias for a given trial; b1j, the slope, represents the effect of trial number on response bias for each participant j (positive coefficients represent the predictive magnitude of trial number on response bias for a given participant); and rij is the residual error term.

Level 2:

The level-2 models estimated the average effects for the entire sample. The models were represented as follows:

b0j = γ00 + μ0j

b1j = γ10 + μ1j

where the intercept, γ00, is interpreted as the average response bias for the entire sample; γ10 is the average effect of represents the effect of trial number on response bias for each participant j (positive coefficients represent the predictive magnitude of trial number on response bias for the sample as a whole), and thus, the primary estimate of interest; and μ0j and μ1j are the residual error terms.

Adding the fixed effect of stimulus type resulted in the following model:

b0j = γ00 + γ01(stimulusi) + μ0j

b1j = γ10 + γ11(stimulusi) + μ1j

Data cleaning

Note: Went back to the raw data due to some inconsistencies in the OT_ADAA_Omnibus.xlsx file from BA that I found.

Pre-R steps:

  1. Removed all .iqdat files under 25KB or so in order to filter out pilot data and false starts.
  2. Removed non-study data (i.e., tests and OT undergrad files).
  3. Organized raw .iqdat files for each visit by run 1/run 2 (two separate folders) based on date/time stamp.

    In Terminal, within each of the folders in turn…

  4. Changed file extensions to .tsv (tab-separated) from .iqdat: find . -iname "*.iqdat" -exec bash -c 'mv "$0" "${0%\.iqdat}.tsv"' {} \;
  5. Merged the files: cat *.tsv > OT_gAAT_run-1.tsv (or OT_gAAT_run-2.tsv) 5. Merged the files: mlr --tsvlite cat *.tsv > OT_gAAT_run-1.tsv (or OT_gAAT_run-2.tsv)
      5a. mlr --tsvlite drops the header from all but the first file, so column names are not repeated throughout the dataset.
Notes:
  • D117: Had 3 visits due to scanner technical issues. Use “_b" and “_c" as visit 1 and visit 2 respectively.
  • D114: Has multiple files from visit 2. Use the last two.
  • D135: Use files from 6/06/16 and 6/17/18 (scanner issues on 06/13/16). Use “_b" and “_c" as visit 1 and visit 2 respectively.
  • D147: Visit 1 run 2 is partial data for some reason (I do have notes that she switched back to PUSH-YELLOW during run 2, but did not re-run because running way over time.)

Creating the MLM dataset

Import data

I do recall one scan session where Inquisit had some kind of hiccup and the task kept going beyond the end of the fMRI sequence so we had to force-quit it. D122 has complete data from the first 144 trials, so we can just drop the extra ones.

Bias scores

Separate out push minus pull, then subtract run1 from run2 to generate a score quantifying relative approach or avoidance bias. The top and bottom 1% of reaction times (RTs) will be removed as part of conventional data cleaning for this task.

Transformations

Because bias is quite non-normal, looking at the plots above, analyses will use the transformed bias score (bias_t) instead.

Checking the data

Add time-invariant variables

Next step is to add demographics and other self-reported and genetic data variables that we might potentially want to include in the model but that do not change over time. Looking at the codebook for the master dataset, these include:

Demographics:

  • age
  • age_yrs
  • sex_m
  • ethnicity_hisp
  • race
  • timesincedeath

Genetic variables:

  • rs2254298
  • rs2268498
  • rs53576
  • rs2254298_A.carrier
  • rs2268498_C.carrier
  • rs53576_A.carrier

Self-report measures:

  • tot_icg [grief]
  • tot_bdi [depression]
  • tot_bgq [brief grief questionnaire with impairment item]
  • tot_ecrrs_global_anx [anxious attachment - global]
  • tot_ecrrs_global_avoid [avoidant attachment - global]
  • tot_ecrrs_spouse_anx [anxious attachment - spouse]
  • tot_ecrrs_spouse_avoid [avoidant attachment - spouse]
  • tot_ysl [yearning for the deceased]

Exploratory analysis and checking assumptions

First step is to overview the entire dataset using summarytools.

None of the variables have any missing data, apart from rs2254298 and rs2254298_A.carrier, and I’m aware from the data cleaning that I did for the master dataset that one participant’s genotype for that SNP was unable to be identified.

Descriptives

Frequencies

Checking distribution shapes and normality

Got a preview of this above when we used summarytools, but here’s a closer look at some histograms and QQ plots.

The most problematic of these appear to be anxious/avoidant attachment style for the spouse (tot_ecrrs_spouse_anx and tot_ecrrs_spouse_avoid), global anxious attachment style (tot_ecrrs_global_anx), depressive symptoms (tot_bdi), and time since spouse’s death (timesincedeath - in days).

Centering L2 predictors

Evaluate missing data

One person is missing rs2254298 genotype (rs2254298 and rs2254298_A.carrier), which we already knew about. No one else is missing data on any variable.

Scale reliabilities

This dataset does not include the item-level data, but we can get that from the master dataset we loaded in earlier.

All reliabilities look good or excellent (a >=.86) except for the Brief Grief Questionnaire, where a = .72. It’s a short screening measure with only 7 items, so makes sense that its reliability would be lower.

Drop the 4 people with low trial counts

Recall that these participants had bias scores on <14% of trials, likely due to failing to reverse the instructions on run 2.

OLS estimates for exploratory purposes

Peoples’ intercepts do look fairly different from each other…

Stem plot for the intercepts based on the OLS estimates

Stem plot for the slopes based on the OLS estimates

Note that these are all extremely close to zero - probably because of the lack of time effect.

R-square for OLS models

The correlation between intercepts and slopes is -0.475, so people who show less avoidance bias overall change less over the course of the task.

Graphing multilevel data for exploratory purposes

There does not seem to be either a linear or curvilinear effect of trial number (i.e., time) on RT bias in the task.

Analyses (NHST)

Remember, the effect of time refers to trialnumber (this is NOT the time variable; time refers to time of day when task was run.)

The dependent variable, bias_t, is the measure of relative behavioral approach/avoidance bias, based on reaction time to push or pull a joystick in response to various images. We transformed it because it was not normally distributed, and use the transformed variable for all analyses.

Unconditional means model

The overall mean bias score (transformed) is about -0.002, with a standard deviation of 0.023.

ICC is about 1.6% of the variance. This means that 1.6% of the variance in bias is explained by people being different from one another, while the remainder is explained by…something else.

Add fixed and random intercept and slope of time

The average bias at trial number = 0 is -0.016 and gets increasingly approach-biased by a nonsignificant fraction of a percent with each unit of time. There is no significant effect of trial number (time) on RT bias score, t = 0.74, p = 0.457.

99.99% of variance in bias is due to the between-person variance, after controlling for time. This is consistent with the lack of a significant effect of time.

Adding stimulus as a fixed effect

There were 5 different types of stimuli, presented in a randomized order (consistent across participants/sessions) determined by genetic algorithm. Everyone saw the same stimuli in the same order, so it is a fixed effect. The different categories of images were: Death (generic), Deceased (personal photo), Other living loved one (personal photo), Stranger (sex-matched to spouse), and Neutral (objects). The factor stim was created such that Neutral was the reference level.

NO effect of time. There is a significant fixed effect of spouse, t = 3.55, p = .0004. There is also a non-significant effect of stranger, t = -1.73, p = .084. This indicates that people tended to show more approach bias to photos of their spouse (across conditions). The parameter estimate is 0.12 with an SE of 0.03. They also tended to show greater more avoidance bias to photos of the sex-matched stranger.

95% CIs don’t cross zero for spouse, but do for all other stimulus types. This supports the significant effect of spouse stimuli on reaction time bias.

The ICC is identical to that in model 2.

Comparing the model with the fixed effect of stimulus (m3) to the model without (m2), m3 is better (p < .0001) as evidenced by lower AIC, BIC, and lL values.

Take out fixed and random effect of time

Because there’s no significant effect of time, makes sense to drop it from the model. Now we’re basically doing regression but accounting for whatever interdependence exists. Note that these results will NOT match the results of the regressions, because the regressions are based on bias score medians as the DV, rather than means.

Fixed effects are still more or less the same - significant for spouse, marginal for stranger - although the parameter estimates and test statistics are slightly different.

As above, spouse is the only stimulus category whose 95 CIs don’t cross zero, supporting a significant effect of spouse on bias - in this case, viewing spouse images was associated with a relative approach bias.

Is m4 any better than m3?

Nope. Models do not significantly differ (p = 0.851), though the AIC and BIC values are a little smaller for m4 than m3. So let’s forget time and go with m4…

Adding condition as a fixed effect

Participants completed the task at two different sessions, where they were randomized to receive treatment A at one and treatment B at the other (order counterbalanced across participants). The two treatments are oxytocin vs. placebo.

The fixed effect of condition B is not significant, t = 0.15, p = 0.884.

The two models are not significantly different, but the one with the fixed effect of condition (m5) has slightly higher AIC/BIC. Not compelling enough to select that model over m4, though.

Adding the stimulus*condition interaction

We might expect that peoples’ tendency to approach or avoid might differ depending on which treatment they got, but only for certain stimuli.

Interesting. With the interaction in the model, there is a significant effect of death and stranger but not spouse. 95% CIs indicate that viewing the generic death and stranger stimuli are both associated with greater relative avoidance bias.

The model with the interaction in it is not significantly better than either the one with just the fixed effect of condition or with no effect of condition at all, so makes sense to go with the simplest model which only includes stimulus as a fixed effect.

Adding other plausible predictors

There are a few other variables that we might expect to impact approach/avoidance bias, namely grief severity, OXTR genotype, time since death, and attachment style (avoidant, anxious).

None of the added fixed effects are significant in the new model, and the AIC/BIC values are higher, so take ’em out.

Final model

A case of significant, but not meaningful: The R2 for the entire model is .02, indicating that 2% of the variance in bias is explained by the model. So this model is not very good at predicting approach/avoidance bias from the fixed effect of stimulus within person. Oh well.

Check final model assumptions

Checking normality of the residuals

The QQ plot looks pretty okay, albeit a few outliers. D113 is the person who most falls off the line, and does so at both ends. The residuals are also pretty evenly distributed across time, though many fall outside of the +/- 2 range.

Getting an error here for the random slopes Error in [.data.frame(ranef(m4), 72) : undefined columns selected. I think this may be because I don’t have any random slopes, since I took time out of the model. Indeed, when I go into m4, it doesn’t look like a second element for the slopes exists. Let’s test this…

My suspicion was correct: the error message above is because there are no random slopes for my final model.

Checking homoscedasticity

Note that again there are a lot of residuals falling outside of the +/-2 range.

Also, there’s something weird about the L2 plot. Not sure why it shows only 3 of 5 stimulus types.

Analyses (Bayesian)

Unconditional means model

First step is to look at the unconditional means model. We know from the exploratory stuff in previous sections that bias_t is normally distributed, so we can tell brms to use normal likelihood (Gaussian).

library(brms)
# b1N <- brm(bias_t ~ 1 + (1|ID), data=data, family=gaussian()) 
# saveRDS(b1N, "mlm_ada1_b1N.rds")
summary(b1N)
 Family: gaussian 
  Links: mu = identity; sigma = identity 
Formula: bias_t ~ 1 + (1 | ID) 
   Data: data (Number of observations: 9289) 
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup samples = 4000

Group-Level Effects: 
~ID (Number of levels: 35) 
              Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept)     0.13      0.02     0.10     0.17       1184 1.00

Population-Level Effects: 
          Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept    -0.00      0.02    -0.05     0.05       1712 1.00

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma     0.99      0.01     0.98     1.01       4000 1.00

Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample 
is a crude measure of effective sample size, and Rhat is the potential 
scale reduction factor on split chains (at convergence, Rhat = 1).

Rhat = 1 across the board, so that’s good.

plot(b1N) # check trace plots

I think these plots look okay? b_Intercept and SD_ID__Intercept plots are not exactly on top of each other, but do have a lot of overlap in their distributions.

pp_check(b1N, nsamples=20)  # posterior predictive check using normal likelihood

pp_check(b1N, type="error_hist", nsamples=20, binwidth=1) # error histogram (histogram of prediction residuals)

The observed distribution is a very good fit to the predicted data (based on the normal distribution). The error histogram also shows that residuals are normally distributed around 0. See this page for some helpful documentation.

# check ICC to get sense of how variance is distributed between- and within- people
iSd <- as.numeric(summary(b1N)$random$ID[1,1]) # finds 1st row, 1st column of random effects inside the summary of b1N
iVar <- iSd^2
residSd <- as.numeric(summary(b1N)$spec_pars[[1,1]])
residVar <- residSd^2
icc1 <- iVar/(iVar+residVar) 
icc1 # this is the unconditional growth model - just happens in this dataset that it's a nuisance model
[1] 0.01749842

For the unconditional growth model, the ICC is 0.017, meaning that only about 2% of the variance in bias is because people on average perform differently from each other on the task.

Time as fixed and random effect

## check whether we need time as a control variable
# b2 <- brm(bias_t ~ 1 + trialnum + (1 + trialnum|ID), data=data, family=skew_normal(), control=list(adapt_delta = .95))
# saveRDS(b2, "mlm_ada1_b2.rds")
summary(b2) 
 Family: skew_normal 
  Links: mu = identity; sigma = identity; alpha = identity 
Formula: bias_t ~ 1 + trialnum + (1 + trialnum | ID) 
   Data: data (Number of observations: 9289) 
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup samples = 4000

Group-Level Effects: 
~ID (Number of levels: 35) 
                        Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept)               0.12      0.03     0.07     0.17       1651 1.00
sd(trialnum)                0.00      0.00     0.00     0.00        510 1.01
cor(Intercept,trialnum)     0.22      0.47    -0.75     0.95       2352 1.00

Population-Level Effects: 
          Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept    -0.02      0.03    -0.07     0.04       1819 1.00
trialnum      0.00      0.00    -0.00     0.00       4000 1.00

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma     0.99      0.01     0.98     1.01       4000 1.00
alpha    -0.02      0.35    -0.64     0.60       4000 1.00

Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample 
is a crude measure of effective sample size, and Rhat is the potential 
scale reduction factor on split chains (at convergence, Rhat = 1).

Note: Estimate = mean of posterior distribution for each of the parameters.

Group-level effects: When trialnum is 0, the standard deviation of the intercepts is 0.12. There is no random effect of time: the slopes are not at all variable (people are not different from each other). Zero is a credible value for the correlation, because the 95% CIs (credible intervals) cross zero.

Note that Rhat for sd(trialnum) in the random effects is 1.01. Per the brms documentation, this does not seem to indicate a convergence issue due to lack of error messages and the fact that the Rhat for the group-level effect in their example is 1.01: “If ‘Rhat’ is considerably greater than 1, the algorithm has not yet converged and it is necessary to run more iterations and / or set stronger priors.” However, it does indicate that I would probably want to run it again with a higher number of iterations or stronger priors.

Population-level effects: There is no fixed effect of time, either, given that the upper and lower CI limits are -0.0, 0.0.

plot(b2)

SD_ID__trialnum and cor_ID__Intercept__trialnum are totally skewed.

pp_check(b2, nsamples=20)

pp_check(b2, type="error_hist", nsamples=20, binwidth=1) 

Again, the trace plot shows that the observed distribution is a very good fit to the predicted data based on the normal distribution. The error histogram also shows that residuals are normally distributed around 0.

SKIPPING THE CHUNK BELOW… I can’t get sjstats to install (issue with the specific TMB package version- freaking dependencies are the bane of my existence with all these different packages), and no point in running cross validation on a model that we’re going to drop anyway due to lack of both fixed/random effects of time.

# install.packages("sjstats")
# library(sjstats)
# equi_test(b2) # is there a fixed effect?
# waic(b1N, b2) # does WAIC think we should keep time? If so, given there is no fixed effect, this is due to the random effect accounting for variance.
# b1 <- add_ic(b1, ic="R2")
# b2 <- add_ic(b2, ic="R2") 
# mean(b1$R2)
# mean(b2$R2) # does R2 thinks we should keep time? 
# kfold(b1SN, b2, K=10) # use CV to check for over-fitting
# this takes too long, so reduce n(folds) or only perform for final model

Fixed effect of stimulus

# b3 <- brm(bias_t ~ 1 + stim + (1 |ID), data=data, family=skew_normal(), control=list(adapt_delta = .95))
# saveRDS(b3, "mlm_ada1_b3.rds")
summary(b3) 
 Family: skew_normal 
  Links: mu = identity; sigma = identity; alpha = identity 
Formula: bias_t ~ 1 + stim + (1 | ID) 
   Data: data (Number of observations: 9289) 
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup samples = 4000

Group-Level Effects: 
~ID (Number of levels: 35) 
              Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept)     0.13      0.02     0.10     0.17        981 1.00

Population-Level Effects: 
             Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept       -0.01      0.03    -0.07     0.05       1156 1.00
stimdeath       -0.05      0.03    -0.12     0.01       2955 1.00
stimliving       0.04      0.03    -0.02     0.11       2423 1.00
stimspouse       0.12      0.03     0.05     0.18       2704 1.00
stimstranger    -0.06      0.03    -0.12     0.01       2560 1.00

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma     0.99      0.01     0.98     1.00       4000 1.00
alpha    -0.04      0.35    -0.65     0.58       3285 1.00

Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample 
is a crude measure of effective sample size, and Rhat is the potential 
scale reduction factor on split chains (at convergence, Rhat = 1).

Similar to the results of the NHST analysis, there is a notable fixed effect of spouse (estimate = 0.12, est. error = 0.03, 95% CI[0.05,0.18]) on bias, such that people show more approach bias on trials where the stimulus is their spouse.

plot(b3)

marginal_effects(b3)

The high density intervals illustrate the positive effect of spouse on bias, which we also see in the marginal effects plot. In the analysis above, the 95% CI for death and stranger stimuli barely crossed zero, which corresponds with what we see in the marginal effects plot, where the upper limit of the error bar is very close to zero (or below). This also corresponds with the effects we saw in NHST, where there were significant or marginally significant effects of death and stranger in addition to spouse.

pp_check(b3, nsamples=20)

pp_check(b3, type="error_hist", nsamples=20, binwidth=1) # looks like we have improved the residuals; if we rerun this random sampling at least some of the time we no longer see the lower end outliers

# equi_test(b3) # TRY THIS CODE WHEN I GET SJTOOLS TO INSTALL (what does ROPE tells us about the size of effect?)
# waic(b2, b3) # TRY THIS CODE WHEN I GET SJTOOLS TO INSTALL
b2 <- add_ic(b2, ic="R2") 
b3 <- add_ic(b3, ic="R2") 
round(mean(b2$R2), digits=3)
[1] 0.017
round(mean(b3$R2), digits=3)
[1] 0.02

In both models, we have explained about 2 percent of the variance (1.7% vs. 2.0%).

Adding the stimulus*condition interaction (no time)

One of the original study hypotheses was that there would be an interaction (actually, a 3-way interaction with group, but not going to go there for ADA #1; also we may be underpowered for that) between stimulus and condition, such that people might display different response biases for different stimulus categories in condition A vs. B, or vice versa.

# b4 <- brm(bias_t ~ 1 + stim*cond + (1|ID), data=data, family=skew_normal(), control=list(adapt_delta = .95))
# saveRDS(b4, "mlm_ada1_b4.rds")
summary(b4) 
 Family: skew_normal 
  Links: mu = identity; sigma = identity; alpha = identity 
Formula: bias_t ~ 1 + stim * cond + (1 | ID) 
   Data: data (Number of observations: 9289) 
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup samples = 4000

Group-Level Effects: 
~ID (Number of levels: 35) 
              Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept)     0.13      0.02     0.10     0.17       1088 1.00

Population-Level Effects: 
                   Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept              0.02      0.04    -0.06     0.10       1357 1.00
stimdeath             -0.11      0.05    -0.20    -0.02       1815 1.00
stimliving             0.04      0.05    -0.05     0.13       1791 1.00
stimspouse             0.06      0.05    -0.03     0.16       2030 1.00
stimstranger          -0.09      0.05    -0.18    -0.00       2068 1.00
condB                 -0.05      0.05    -0.15     0.04       1546 1.00
stimdeath:condB        0.11      0.07    -0.02     0.24       1760 1.00
stimliving:condB       0.01      0.06    -0.12     0.13       1959 1.00
stimspouse:condB       0.11      0.07    -0.02     0.24       2012 1.00
stimstranger:condB     0.07      0.06    -0.06     0.20       2009 1.00

Family Specific Parameters: 
      Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma     0.99      0.01     0.98     1.00       4000 1.00
alpha    -0.05      0.35    -0.64     0.58       3415 1.00

Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample 
is a crude measure of effective sample size, and Rhat is the potential 
scale reduction factor on split chains (at convergence, Rhat = 1).
# b4 <- readRDS("mlm_ada1_b4.rds")

Got some warnings while running:

Rejecting initial value: Gradient evaluated at the initial value is not finite. Stan can't start sampling from this initial value. Rejecting initial value: Log probability evaluates to log(0), i.e. negative infinity. Stan can't start sampling from this initial value.

Apparently setting priors may help with this.

Here, we see notable effects of death and stranger stimuli, but not condition nor its interaction with stimulus type.

plot(b4)

marginal_effects(b4) 

pp_check(b4, nsamples=20)

pp_check(b4, type="error_hist", nsamples=20, binwidth=1) # residuals seem about the same

# equi_test(b4) 

Nothing terribly new here, except for the marginal effects. Looking at the plot for stim, the distributions for spouse and stranger and spouse and death don’t seem to overlap, and living loved one and death just barely overlap. Unsurprisingly, people tend to show more approach bias for spouse and living loved one photos compared to death and stranger photos. The third marginal effects plot illustrates the lack of condition or stimulus*condition interaction effects.

The variance accounted for shows a negligable increase with the stimulus*condition interaction in the model (goes from 0.020 to 0.022). The negligable effect is shown in the plot - note no real differences

Using priors

# First find out what default priors are. 
get_prior(bias_t ~ 1 + stim*cond + (1|ID), data=data, family=skew_normal())

brms has set some weakly informative default priors on some of the special parameters. The default for the random coefficients is a half student-t with 3 degrees of freedom.

Let’s assume some weak prior knowledge from previous research. It would actually be somewhat difficult to get solid priors from previous research on this task, given that no previous work has used this specific variant in this population with this specific manipulation (i.e., oxytocin vs. placebo) so I’m making these numbers up.

Based on the error message here (The following priors do not correspond to any model parameter…), I clearly have no idea what I’m doing and need to go back to that lesson (get_prior was not helpful to me, but thanks anyway, brms).

LS0tCnRpdGxlOiAiTUxNIEFEQSAjMSB2MiIKYXV0aG9yOiAiU2FyZW4gU2VlbGV5IgpkYXRlOiAiMTAtMjItMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCi0tLQojIyBBYm91dAojIyMgT3ZlcnZpZXcKVGhpcyBBREEgdXNlcyBkYXRhIGZyb20gdGhlIHByb2plY3Qg4oCcVGhlIGVmZmVjdCBvZiBpbnRyYW5hc2FsIG94eXRvY2luIG9uIG5ldXJhbCBmdW5jdGlvbmluZyBpbiB3aWRvdyhlcilz4oCdICgjMTUwMzc0NDQyMCwgUEk6IE1hcnktRnJhbmNlcyBPJ0Nvbm5vciwgQ28tUEk6IEJyaWFuIEFyaXptZW5kaSkuIEl0IHdhcyBhIGRvdWJsZS1ibGluZCByYW5kb21pemVkIGNyb3Nzb3ZlciBzdHVkeSwgZGVzaWduZWQgdG8gYWRkcmVzcyBjb25mbGljdGluZyBhY2NvdW50cyBvZiBtb3RpdmF0ZWQgYmVoYXZpb3IgaW4gY29tcGxpY2F0ZWQgZ3JpZWYgdXNpbmcgYSBub3ZlbCBhcHByb2FjaC1hdm9pZGFuY2UgdGFzayB2YXJpYW50IChncmllZiBBQVQ7IGdBQVQpIHRoYXQgYWxsb3dzIGZvciBjb21wYXJpc29uIGJldHdlZW4gcGFydGljaXBhbnQtcHJvdmlkZWQgcGhvdG9zIGFuZCBub21vdGhldGljIGdyaWVmIHN0aW11bGkuIFBhcnRpY2lwYW50cyB3ZXJlIDQwIGJlcmVhdmVkIGFkdWx0cyBhZ2VzIDU1LTgwLCB3aG8gZXhwZXJpZW5jZWQgdGhlIGRlYXRoIG9mIGEgc3BvdXNlIG9yIGxvbmctdGVybSByb21hbnRpYyBwYXJ0bmVyIGJldHdlZW4gc2l4IG1vbnRocyBhbmQgdGhyZWUgeWVhcnMgcHJpb3IgdG8gdGhlaXIgcGFydGljaXBhdGlvbi4gCgojIyMgVGFzawpQYXJ0aWNpcGFudHMgYXR0ZW5kZWQgdHdvIGlkZW50aWNhbCBleHBlcmltZW50YWwgc2Vzc2lvbnMsIGF0IHdoaWNoIHRoZXkgcmVjZWl2ZWQgb25lIG9mIHR3byBpbnRyYW5hc2FsIHNwcmF5cyAodHJlYXRtZW50IEEvQikgYW5kIHRoZW4gdG9vayBwYXJ0IGluIGFuIGZNUkkgc2Nhbiwgd2hpY2ggaW52b2x2ZWQgYSBzdHJ1Y3R1cmFsIHNlcXVlbmNlLCB0aGUgZ0FBVCwgYW5kIGEgcmVzdGluZyBzdGF0ZSBzZXF1ZW5jZS4KCkZvciB0aGUgZ0FBVCwgZml2ZSBzdGltdWx1cyBjYXRlZ29yaWVzIHdlcmUgcHJlc2VudGVkOiAoMSkgZGVjZWFzZWQgc3BvdXNlLCAoMikgbGl2aW5nIGxvdmVkIG9uZSBbYW5vdGhlciBhdHRhY2htZW50IGZpZ3VyZV0sICgzKSBzdHJhbmdlciwgKDQpIGdlbmVyaWMgZ3JpZWYtcmVsYXRlZCBzY2VuZXMsIGFuZCAoNSkgbmV1dHJhbCBzY2VuZXMuIFBob3RvcyBwcm92aWRlZCBieSB0aGUgcGFydGljaXBhbnQgd2VyZSBzY2FubmVkIGFuZCByZXNpemVkIHRvIGEgc3RhbmRhcmQgNzUwLXBpeGVsIGhlaWdodCBhbmQgd2lkdGgsIGFuZCBmcmFtZWQgaW4gY29sb3JlZCBmcmFtZXMgdG8gbWF0Y2ggdGhlIHN0aW11bGkgdXNlZCBmb3Igbm9uLWlkaW9ncmFwaGljIGNhdGVnb3JpZXMgKGkuZS4sIHN0cmFuZ2VyLCBncmllZi1yZWxhdGVkLCBuZXV0cmFsKS4gUGhvdG9zIG9mIHRoZSBzdHJhbmdlciB3ZXJlIHNleC1tYXRjaGVkIHRvIHRoZSBwYXJ0aWNpcGFudCdzIHBhcnRuZXIuIAoKRHVyaW5nIHRoZSB0YXNrLCBwYXJ0aWNpcGFudHMgd2VyZSBpbnN0cnVjdGVkIHRvIGZvbGxvdyBydWxlcyBiYXNlZCBvbiBhbiBpcnJlbGV2YW50IGNoYXJhY3RlcmlzdGljIG9mIHRoZSBzdGltdWxpLCBuYW1lbHksIHRoZSBjb2xvciBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZSBwaG90byAoZS5nLiwgXyJwdXNoIHRoZSBqb3lzdGljayB3aGVuIHRoZSBmcmFtZSBpcyBibHVlLCBwdWxsIHdoZW4gdGhlIGZyYW1lIGlzIHllbGxvdyJfKS4gVGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBpbiB0d28gcnVucyBvZiBhcHByb3hpbWF0ZWx5IHNldmVuIG1pbnV0ZXMgZWFjaC4gSW4gdGhlIHNlY29uZCBydW4sIHRoZSBpbnN0cnVjdGlvbnMgd2VyZSByZXZlcnNlZCAoZS5nLiBfIm5vdyBwdWxsIHRoZSBqb3lzdGljayBmb3IgYmx1ZSBmcmFtZWQgcGhvdG9zIl8pLiBPcmRlciBvZiBpbnN0cnVjdGlvbnMgd2FzIGNvdW50ZXJiYWxhbmNlZCBhY3Jvc3MgcGFydGljaXBhbnRzLiBTdGltdWxpIHdlcmUgcHJlc2VudGVkIHZpYSBJbnF1aXNpdCA0ICgyMDE0KSwgaW4gYSBwc2V1ZG9yYW5kb21pemVkIG9yZGVyIGRldGVybWluZWQgYnkgZ2VuZXRpYyBhbGdvcml0aG0gdG8gb3B0aW1pemUgc3RhdGlzdGljYWwgcG93ZXIgYW5kIHBzeWNob2xvZ2ljYWwgdmFsaWRpdHkgKFdhZ2VyICYgTmljaG9scywgMjAwMykuIEVhY2ggdHJpYWwgbGFzdCAzMDAwbXMsIHdpdGggMjUwMCBtcyBhbGxvd2VkIGZvciByZXNwb25zZS4gSW50ZXJ0cmlhbCBpbnRlcnZhbCB3YXMgNTAwbXMuCgpQYXJ0aWNpcGFudHMgY29tcGxldGVkIHRoZSB0YXNrIHVzaW5nIGFuIE1SSS1jb21wYXRpYmxlIGpveXN0aWNrLiBUaGUgc3RpbXVsaSB3ZXJlIGFuaW1hdGVkIHNvIHRoYXQgYSBqb3lzdGljayBwdXNoIHdvdWxkIG1ha2UgdGhlIGltYWdlIHNtYWxsZXIgKGFzIGlmIHRoZXkgd2VyZSBwdXNoaW5nIGl0IGF3YXkgZnJvbSB0aGVtKSBhbmQgYSBqb3lzdGljayBwdWxsIHdvdWxkIG1ha2UgdGhlIGltYWdlIGxhcmdlciAoYXMgaWYgdGhleSB3ZXJlIGJyaW5naW5nIGl0IG5lYXJlciB0byB0aGVtKS4KCiMjIyBWYXJpYWJsZXMKVGhlIHByaW1hcnkgZGVwZW5kZW50IHZhcmlhYmxlIG9mIGludGVyZXN0IGZvciB0aGUgcHJlc2VudCBhbmFseXNpcyBpcyAqKnJlYWN0aW9uIHRpbWUgYmlhcyoqLCBjb21wdXRlZCBhcyBSVDxzdWI+cHVzaDwvc3ViPi1SVDxzdWI+cHVsbDwvc3ViPi4gTmVnYXRpdmUgYmlhcyBzY29yZXMgKGZhc3RlciB0byBwdXNoIHRoYW4gcHVsbCkgaW5kaWNhdGUgcmVsYXRpdmUgYXZvaWRhbmNlIGJpYXMsIHdoaWxlIHBvc2l0aXZlIHNjb3JlcyAoZmFzdGVyIHRvIHB1bGwgdGhhbiB0byBwdXNoKSBpbmRpY2F0ZSByZWxhdGl2ZSBhcHByb2FjaCBiaWFzLiBCZWNhdXNlIHRoZSB0d28gcnVucyB3ZXJlIGlkZW50aWNhbCBpbiBldmVyeSB3YXkgZXhjZXB0IGZvciB0aGUgaW5zdHJ1Y3Rpb24gcHJvdmlkZWQsIGVhY2ggdHJpYWwgaGFkIGJvdGggYSBwdXNoIFJUIGFuZCBhIHB1bGwgUlQgKGUuZy4sIHJ1bjEgdHJpYWwxIHdhcyBwdXNoLCBydW4yIHRyaWFsMSB3YXMgcHVsbCwgc28gc3VidHJhY3QgUlQgb24gcnVuMiB0cmlhbCAxIGZyb20gcnVuMSB0cmlhbDEgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlIC0gdGhpcyBpcyBmdXJ0aGVyIGVsYWJvcmF0ZWQgaW4gdGhlIGRhdGEgY2xlYW5pbmcgc2NyaXB0IGJlbG93KSwgdW5sZXNzIHRoZXkgZmFpbGVkIHRvIHJldmVyc2UgdGhlIGluc3RydWN0aW9ucy4KCk1haW4gcHJlZGljdG9ycyBvZiBpbnRlcmVzdCBpbmNsdWRlZCAqKnRyaWFsIG51bWJlcioqIChpbiBvcmRlciB0byBlc3RhYmxpc2ggd2hldGhlciBwZW9wbGVzJyByZXNwb25zZSBiaWFzIGNoYW5nZWQgb3ZlciB0aGUgNy1taW51dGUgcnVuKSwgKipzdGltdWx1cyoqIChuZXV0cmFsLCBzcG91c2UsIHN0cmFuZ2VyLCBsaXZpbmcgbG92ZWQgb25lLCBkZWF0aCksIGFuZCAqKmNvbmRpdGlvbioqICh0cmVhdG1lbnQgQS9CIC0gb3h5dG9jaW4gb3IgcGxhY2VibyBbSSdtIHN0aWxsIGJsaW5kZWRdKS4gCgpQYXJ0aWNpcGFudHMgYWxzbyBjb21wbGV0ZWQgYSBudW1iZXIgb2Ygc2VsZi1yZXBvcnQgbWVhc3VyZXMgKHN0YXRlIGFuZCB0cmFpdCkgYW5kIHByb3ZpZGVkIGJpb2xvZ2ljYWwgc2FtcGxlcyBmb3IgT1hUUiBnZW5vdHlwaW5nIGFuZCBjb3J0aXNvbCBhc3NheSwgc29tZSBvZiB3aGljaCB3ZXJlIHVzZWQgYXMgcHJlZGljdG9ycy4KCiMjIEVxdWF0aW9ucwojIyMjIExldmVsIDE6CldlIGZpcnN0IHBlcmZvcm1lZCBNTE0gdG8gZXN0aW1hdGUgdGhlIGVmZmVjdCBvZiB0cmlhbCBudW1iZXIgKGkuZS4sIHRoZSByYW5kb20gZWZmZWN0IG9mIHRpbWUpIG9uIHJlc3BvbnNlIGJpYXMgKHB1c2ggUlQtcHVsbCBSVCkgb24gYSBnaXZlbiB0cmlhbC4gVGhlIGxldmVsLTEgbW9kZWwgZXN0aW1hdGVkLCBmb3IgZWFjaCBwYXJ0aWNpcGFudCBfal8gKF9qXyA9IDHigJMzNSksIGEgcmVncmVzc2lvbiBsaW5lIHRoYXQgcHJlZGljdGVkIGVhY2ggcGFydGljaXBhbnTigJlzIHJlc3BvbnNlIGJpYXMgaW4gbWlsbGlzZWNvbmRzIG9uIGVhY2ggdHJpYWwgX2lfIGZyb20gdGhlIHRyaWFsIG51bWJlci4gVGhpcyBtb2RlbCB3YXMgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogCjxibG9ja3F1b3RlPjxjZW50ZXI+PGZvbnQgc2l6ZT00PgpbYmlhczxpPjxzdWI+aTwvc3ViPjwvaT5dPHN1Yj5qPC9zdWI+ID0gPGk+YjwvaT48c3ViPjA8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+ICsgPGk+YjwvaT48c3ViPjE8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+IFt0cmlhbG51bWJlcjxpPjxzdWI+aTwvc3ViPjwvaT5dICsgPGk+cjxzdWI+aWo8L3N1Yj48L2k+CjwvZm9udD48L2NlbnRlcj4KPC9ibG9ja3F1b3RlPgoKd2hlcmUgPGk+YjwvaT48c3ViPjA8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+LCB0aGUgaW50ZXJjZXB0LCBpcyBpbnRlcnByZXRlZCBhcyBwYXJ0aWNpcGFudCBfal/igJlzIG1lYW4gcmVzcG9uc2UgYmlhcyBmb3IgYSBnaXZlbiB0cmlhbDsgPGk+YjwvaT48c3ViPjE8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+LCB0aGUgc2xvcGUsIHJlcHJlc2VudHMgdGhlIGVmZmVjdCBvZiB0cmlhbCBudW1iZXIgb24gcmVzcG9uc2UgYmlhcyBmb3IgZWFjaCBwYXJ0aWNpcGFudCBfal8gKHBvc2l0aXZlIGNvZWZmaWNpZW50cyByZXByZXNlbnQgdGhlIHByZWRpY3RpdmUgbWFnbml0dWRlIG9mIHRyaWFsIG51bWJlciBvbiByZXNwb25zZSBiaWFzIGZvciBhIGdpdmVuIHBhcnRpY2lwYW50KTsgYW5kIDxpPnI8c3ViPmlqPC9zdWI+PC9pPiBpcyB0aGUgcmVzaWR1YWwgZXJyb3IgdGVybS4KCiMjIyMgTGV2ZWwgMjoKVGhlIGxldmVsLTIgbW9kZWxzIGVzdGltYXRlZCB0aGUgYXZlcmFnZSBlZmZlY3RzIGZvciB0aGUgZW50aXJlIHNhbXBsZS4gVGhlIG1vZGVscyB3ZXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6IAoKPGJsb2NrcXVvdGU+PGNlbnRlcj48Zm9udCBzaXplPTQ+CjxpPmI8L2k+PHN1Yj4wPC9zdWI+PHN1Yj5qPC9zdWI+ID0gzrM8c3ViPjAwPC9zdWI+ICsgzrw8c3ViPjA8c3ViPmo8L3N1Yj48L3N1Yj4KPHA+CjxpPmI8L2k+PHN1Yj4xPHN1Yj48aT5qPC9pPjwvc3ViPjwvc3ViPiA9IM6zPHN1Yj4xMDwvc3ViPiArICDOvDxzdWI+MTxzdWI+ajwvc3ViPjwvc3ViPgo8L2ZvbnQ+PC9jZW50ZXI+PC9ibG9ja3F1b3RlPgoKd2hlcmUgdGhlIGludGVyY2VwdCwgzrM8c3ViPjAwPC9zdWI+LCBpcyBpbnRlcnByZXRlZCBhcyB0aGUgYXZlcmFnZSByZXNwb25zZSBiaWFzIGZvciB0aGUgZW50aXJlIHNhbXBsZTsgzrM8c3ViPjEwPC9zdWI+IGlzIHRoZSBhdmVyYWdlIGVmZmVjdCBvZiByZXByZXNlbnRzIHRoZSBlZmZlY3Qgb2YgdHJpYWwgbnVtYmVyIG9uIHJlc3BvbnNlIGJpYXMgZm9yIGVhY2ggcGFydGljaXBhbnQgX2pfIChwb3NpdGl2ZSBjb2VmZmljaWVudHMgcmVwcmVzZW50IHRoZSBwcmVkaWN0aXZlIG1hZ25pdHVkZSBvZiB0cmlhbCBudW1iZXIgb24gcmVzcG9uc2UgYmlhcyBmb3IgdGhlIHNhbXBsZSBhcyBhIHdob2xlKSwgYW5kIHRodXMsIHRoZSBwcmltYXJ5IGVzdGltYXRlIG9mIGludGVyZXN0OyBhbmQgzrw8c3ViPjA8c3ViPmo8L3N1Yj48L3N1Yj4gYW5kIM68PHN1Yj4xPHN1Yj5qPC9zdWI+PC9zdWI+IGFyZSB0aGUgcmVzaWR1YWwgZXJyb3IgdGVybXMuIAoKQWRkaW5nIHRoZSBmaXhlZCBlZmZlY3Qgb2Ygc3RpbXVsdXMgdHlwZSByZXN1bHRlZCBpbiB0aGUgZm9sbG93aW5nIG1vZGVsOgoKPGJsb2NrcXVvdGU+PGNlbnRlcj48Zm9udCBzaXplPTQ+CjxpPmI8L2k+PHN1Yj4wPC9zdWI+PHN1Yj5qPC9zdWI+ID0gzrM8c3ViPjAwPC9zdWI+ICsgzrM8c3ViPjAxPC9zdWI+KHN0aW11bHVzPHN1Yj5pPC9zdWI+KSArIM68PHN1Yj4wPHN1Yj5qPC9zdWI+PC9zdWI+CjxwPgo8aT5iPC9pPjxzdWI+MTxzdWI+PGk+ajwvaT48L3N1Yj48L3N1Yj4gPSDOszxzdWI+MTA8L3N1Yj4gKyDOszxzdWI+MTE8L3N1Yj4oc3RpbXVsdXM8c3ViPmk8L3N1Yj4pICsgzrw8c3ViPjE8c3ViPmo8L3N1Yj48L3N1Yj48L2ZvbnQ+PC9jZW50ZXI+PC9ibG9ja3F1b3RlPgoKCiMjIERhdGEgY2xlYW5pbmcKPGk+Tm90ZTogV2VudCBiYWNrIHRvIHRoZSByYXcgZGF0YSBkdWUgdG8gc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGBPVF9BREFBX09tbmlidXMueGxzeGAgZmlsZSBmcm9tIEJBIHRoYXQgSSBmb3VuZC48L2k+Cgo8Yj5QcmUtUiBzdGVwczwvYj46CgoxLiBSZW1vdmVkIGFsbCAuaXFkYXQgZmlsZXMgdW5kZXIgMjVLQiBvciBzbyBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IHBpbG90IGRhdGEgYW5kIGZhbHNlIHN0YXJ0cy48YnI+CjIuIFJlbW92ZWQgbm9uLXN0dWR5IGRhdGEgKGkuZS4sIHRlc3RzIGFuZCBPVCB1bmRlcmdyYWQgZmlsZXMpLiA8YnI+CjMuIE9yZ2FuaXplZCByYXcgLmlxZGF0IGZpbGVzIGZvciBlYWNoIHZpc2l0IGJ5IHJ1biAxL3J1biAyICh0d28gc2VwYXJhdGUgZm9sZGVycykgYmFzZWQgb24gZGF0ZS90aW1lIHN0YW1wLiA8cD4KPGk+SW4gVGVybWluYWwsIHdpdGhpbiBlYWNoIG9mIHRoZSBmb2xkZXJzIGluIHR1cm4uLi48L2k+PHA+CjQuIENoYW5nZWQgZmlsZSBleHRlbnNpb25zIHRvIC50c3YgKHRhYi1zZXBhcmF0ZWQpIGZyb20gLmlxZGF0OiBgZmluZCAuIC1pbmFtZSAiKi5pcWRhdCIgLWV4ZWMgYmFzaCAtYyAnbXYgIiQwIiAiJHswJVwuaXFkYXR9LnRzdiInIHt9IFw7YDxicj4KNS4gTWVyZ2VkIHRoZSBmaWxlczogYGNhdCAqLnRzdiA+IE9UX2dBQVRfcnVuLTEudHN2YCAob3IgYE9UX2dBQVRfcnVuLTIudHN2YCkKPHN0cmlrZT41LiBNZXJnZWQgdGhlIGZpbGVzOiBgbWxyIC0tdHN2bGl0ZSBjYXQgKi50c3YgPiBPVF9nQUFUX3J1bi0xLnRzdmAgKG9yIGBPVF9nQUFUX3J1bi0yLnRzdmApCjx1bD41YS4gYG1sciAtLXRzdmxpdGVgIGRyb3BzIHRoZSBoZWFkZXIgZnJvbSBhbGwgYnV0IHRoZSBmaXJzdCBmaWxlLCBzbyBjb2x1bW4gbmFtZXMgYXJlIG5vdCByZXBlYXRlZCB0aHJvdWdob3V0IHRoZSBkYXRhc2V0LjwvdWw+Cjx1bD41Yi4gVGhpcyByZXF1aXJlcyBNaWxsZXIsIHdoaWNoIGNhbiBiZSBpbnN0YWxsZWQgdmlhIEhvbWVicmV3IG9uIE9TWCAoaHR0cDovL2pvaG5rZXJsLm9yZy9taWxsZXIvZG9jL2J1aWxkLmh0bWwpPC9zdHJpa2U+IDxpPnRyaWVkIHRvIG1ha2UgdGhpcyB3b3JrIGJ1dCBubyBsdWNrPC9pPjwvdWw+Cgo8aT5Ob3Rlczo8YnI+Cjx1bD48bGk+RDExNzogSGFkIDMgdmlzaXRzIGR1ZSB0byBzY2FubmVyIHRlY2huaWNhbCBpc3N1ZXMuIFVzZSAiX2IiIGFuZCAiX2MiIGFzIHZpc2l0IDEgYW5kIHZpc2l0IDIgcmVzcGVjdGl2ZWx5LjwvbGk+CjxsaT5EMTE0OiBIYXMgbXVsdGlwbGUgZmlsZXMgZnJvbSB2aXNpdCAyLiBVc2UgdGhlIGxhc3QgdHdvLjwvbGk+CjxsaT5EMTM1OiBVc2UgZmlsZXMgZnJvbSA2LzA2LzE2IGFuZCA2LzE3LzE4IChzY2FubmVyIGlzc3VlcyBvbiAwNi8xMy8xNikuIFVzZSAiX2IiIGFuZCAiX2MiIGFzIHZpc2l0IDEgYW5kIHZpc2l0IDIgcmVzcGVjdGl2ZWx5LjwvbGk+CjxsaT5EMTQ3OiBWaXNpdCAxIHJ1biAyIGlzIHBhcnRpYWwgZGF0YSBmb3Igc29tZSByZWFzb24gKEkgZG8gaGF2ZSBub3RlcyB0aGF0IHNoZSBzd2l0Y2hlZCBiYWNrIHRvIDxpPlBVU0gtWUVMTE9XPC9pPiBkdXJpbmcgcnVuIDIsIGJ1dCBkaWQgbm90IHJlLXJ1biBiZWNhdXNlIHJ1bm5pbmcgd2F5IG92ZXIgdGltZS4pPC9saT48L3VsPjwvaT4KCiMjIENyZWF0aW5nIHRoZSBNTE0gZGF0YXNldAojIyMgSW1wb3J0IGRhdGEKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdAoKIyByZWFkIGluIHRoZSBkYXRhIChvbmx5IGltcG9ydGluZyBhIHN1YnNldCBvZiBjb2x1bW5zKQpyYXdfcjEgPC0gZGF0YS5mcmFtZShyZWFkX3Rzdigifi9EZXNrdG9wL09ULWdBQVRfTUxNLWRhdGEvUnVuMV90c3YvT1RfZ0FBVF9ydW4tMS50c3YiLCBjb2xfdHlwZXM9Y29sc19vbmx5KAogIGRhdGUgPSBjb2xfaW50ZWdlcigpLAogIHRpbWUgPSBjb2xfY2hhcmFjdGVyKCksCiAgc3ViamVjdCA9IGNvbF9jaGFyYWN0ZXIoKSwKICBibG9ja2NvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tudW0gPSBjb2xfY2hhcmFjdGVyKCksCiAgdHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy50cmlhbGNvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLnN0aW11bHVzID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5pbml0aWFscmVzcG9uc2UgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLlJUID0gY29sX251bWJlcigpCikpKQoKcmF3X3IyIDwtIGRhdGEuZnJhbWUocmVhZF90c3YoIn4vRGVza3RvcC9PVC1nQUFUX01MTS1kYXRhL1J1bjJfdHN2L09UX2dBQVRfcnVuLTIudHN2IiwgY29sX3R5cGVzPWNvbHNfb25seSgKICBkYXRlID0gY29sX2ludGVnZXIoKSwKICB0aW1lID0gY29sX2NoYXJhY3RlcigpLAogIHN1YmplY3QgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIGJsb2NrbnVtID0gY29sX2NoYXJhY3RlcigpLAogIHRyaWFsY29kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMudHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5zdGltdWx1cyA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMuaW5pdGlhbHJlc3BvbnNlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5SVCA9IGNvbF9udW1iZXIoKQopKSkKCiMgaGVhZGVyIGxpbmUgcmVwZWF0cyB3aGVuIEkgdXNlZCBgY2F0YCB0byBtZXJnZSwgc28gZ2V0IHRob3NlIG91dCBvZiB0aGVyZQpyYXdfcjEgPC0gcmF3X3IxICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQpyYXdfcjIgPC0gcmF3X3IyICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQoKdW5pcXVlKHJhd19yMSRzdWJqZWN0KQojIEQxMTggaXMgc2hvd2luZyB1cCBhcyAidGVzdCIgZm9yIHNvbWUgcmVhc29uIChjaGVja2VkIGFnYWluc3QgdGhlIC5pcWRhdCBmaWxlKSwgYW5kIEQxMzBfYiBpcyBtaXNzaW5nCiMgYm90aCBvZiBEMTMwJ3MgYW5kIEQxNDIncyB2aXNpdHMgd2VyZSBlbnRlcmVkIGFzICJEMTMwIi8iRDE0MiIsIHNvIGNoYW5nZSB0aGUgc3ViamVjdCBJRCBmb3IgdGhlIHZpc2l0IG9uIDA1MjQxNiB0byBEMTMwX2IgYW5kIG9uIApyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwMjA5MTZdIDwtICJEMTE4IgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwNTI0MTZdIDwtICJEMTMwX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCiMgZml4aW5nIHNvbWUgb3RoZXIgc3R1ZmYgaW4gYSBzaW1pbGFyIHZlaW4KcmF3X3IxJHN1YmplY3RbcmF3X3IxJHN1YmplY3QgPT0gIkQxMDFfMiJdIDwtICJEMTAxX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDEzNV9jIl0gPC0gIkQxMzVfYiIKCnVuaXF1ZShyYXdfcjEkc3ViamVjdCkgIyA3OCB1bmlxdWUgLSB0aGF0IGlzIGNvcnJlY3QKCnVuaXF1ZShyYXdfcjIkc3ViamVjdCkKIyBzb21lIHNpbWlsYXIgaXNzdWVzIHRvIGZpeApyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEwMV8yWSJdIDwtICJEMTAxX2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEwN19CXzIiXSA8LSAiRDEwN19iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEyNl9CIl0gPC0gIkQxMjZfYiIKcmF3X3IyJHN1YmplY3RbcmF3X3IyJHN1YmplY3QgPT0gIkQxMzVfYyJdIDwtICJEMTM1X2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCgp1bmlxdWUocmF3X3IyJHN1YmplY3QpICMgNzggdW5pcXVlIC0gdGhhdCBpcyBjb3JyZWN0CgpzdHIocmF3X3IxKQpzdHIocmF3X3IyKQpgYGAKCmBgYHtyfQojIHRha2Ugb3V0IElUSXMgKGludGVyLXRyaWFsIGludGVydmFscykKdW5pcXVlKHJhd19yMSR0cmlhbGNvZGUpCm1sbV9yMSA8LSBmaWx0ZXIocmF3X3IxLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShtbG1fcjEkdHJpYWxjb2RlKQoKdW5pcXVlKHJhd19yMiR0cmlhbGNvZGUpCm1sbV9yMiA8LSBmaWx0ZXIocmF3X3IyLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShtbG1fcjIkdHJpYWxjb2RlKQoKIyBhZGQgYSAidHJpYWxudW0iIHZhcmlhYmxlLCBncm91cGVkIGJ5IElECm1sbV9yMSA8LSBtbG1fcjEgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBtdXRhdGUodHJpYWxudW0gPSByb3dfbnVtYmVyKCkpClZpZXcobWxtX3IyKQptbG1fcjIgPC0gbWxtX3IyICU+JSBncm91cF9ieShzdWJqZWN0KSAlPiUgbXV0YXRlKHRyaWFsbnVtID0gcm93X251bWJlcigpKQpWaWV3KG1sbV9yMikKCm1sbV9yMSAlPiUgZ3JvdXBfYnkodHJpYWxudW0pICU+JSBjb3VudCh0cmlhbG51bSkgIyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscywgaG9vcmF5IQptbG1fcjIgJT4lIGdyb3VwX2J5KHRyaWFsbnVtKSAlPiUgY291bnQodHJpYWxudW0pICMgZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMsIG9uZSBwZXJzb24gaGFzIDE3NwptbG1fcjIgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBjb3VudCgpICMgdGhhdCBwZXJzb24gaXMgRDEyMl9iCmBgYApJIGRvIHJlY2FsbCBvbmUgc2NhbiBzZXNzaW9uIHdoZXJlIElucXVpc2l0IGhhZCBzb21lIGtpbmQgb2YgaGljY3VwIGFuZCB0aGUgdGFzayBrZXB0IGdvaW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmTVJJIHNlcXVlbmNlIHNvIHdlIGhhZCB0byBmb3JjZS1xdWl0IGl0LiBEMTIyIGhhcyBjb21wbGV0ZSBkYXRhIGZyb20gdGhlIGZpcnN0IDE0NCB0cmlhbHMsIHNvIHdlIGNhbiBqdXN0IGRyb3AgdGhlIGV4dHJhIG9uZXMuCmBgYHtyfQptbG1fcjIgPC0gZmlsdGVyKG1sbV9yMiwgdHJpYWxudW0gPD0xNDQpICMgcmVtb3ZlIHRyaWFscyAxNDUtMTc3IGZvciBEMTIyX2IKbWxtX3IyICU+JSBncm91cF9ieSh0cmlhbG51bSkgJT4lIGNvdW50KHRyaWFsbnVtKQojIG5vdyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscwoKIyBhZGQgYSBjb2x1bW4gZm9yICJydW4iCm1sbV9yMSRydW4gPC0gIjEiCm1sbV9yMiRydW4gPC0gIjIiCgojIGFkZCBhIGNvbHVtbiBmb3IgInZpc2l0IgptbG1fcjEkdmlzaXQgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgiKl9iIiwgbWxtX3IxJHN1YmplY3QpLCAiMiIsICIxIikpCm1sbV9yMiR2aXNpdCA8LSBhcy5mYWN0b3IoaWZlbHNlKGdyZXBsKCIqX2IiLCBtbG1fcjIkc3ViamVjdCksICIyIiwgIjEiKSkKCm1sbV9yMSAlPiUgZ3JvdXBfYnkoc3ViamVjdCkgJT4lIGNvdW50KHZpc2l0KSAjIGFsbCBsb29rcyBnb29kCm1sbV9yMiAlPiUgZ3JvdXBfYnkoc3ViamVjdCkgJT4lIGNvdW50KHZpc2l0KSAjIGFsbCBsb29rcyBnb29kCgojIG5vdyByZW1vdmUgdGhlICJfYiIgZnJvbSB2aXNpdCAyIElEcwptbG1fcjEgPC0gbWxtX3IxICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHN1YmplY3QgPSBzdHJfcmVwbGFjZShzdWJqZWN0LCAiX2IiLCAiIikpCnVuaXF1ZShtbG1fcjEkc3ViamVjdCkKCm1sbV9yMiA8LSBtbG1fcjIgJT4lIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoc3ViamVjdCA9IHN0cl9yZXBsYWNlKHN1YmplY3QsICJfYiIsICIiKSkKdW5pcXVlKG1sbV9yMiRzdWJqZWN0KQoKIyBtZXJnZSBkYXRhIGZyb20gdGhlIDIgcnVucyAKbWxtX2J4IDwtIGJpbmRfcm93cyhtbG1fcjEsIG1sbV9yMikKCiMgc3BsaXQgdXAgYnkgdmlzaXQKbWxtX3YxIDwtIG1sbV9ieCAlPiUgZmlsdGVyKHZpc2l0ID09ICIxIikKbWxtX3YyIDwtIG1sbV9ieCAlPiUgZmlsdGVyKHZpc2l0ID09ICIyIikKCm1sbV92MSAlPiUgZ3JvdXBfYnkodHJpYWxudW0pICU+JSBjb3VudCh0cmlhbG51bSkgIyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscywgaG9vcmF5IQptbG1fdjIgJT4lIGdyb3VwX2J5KHRyaWFsbnVtKSAlPiUgY291bnQodHJpYWxudW0pICMgZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMsIGhvb3JheSEKYGBgCgpgYGB7cn0KIyBhZGQgY29sdW1ucyBmb3IgImNvbmQiIGF0IHZpc2l0IDEgYW5kIHZpc2l0IDIgW2NvbmRpdGlvbjogQSBvciBCXQojIGxvYWQgaW4gdGhlIHJhbmRvbWl6YXRpb24gZGF0YQpyYW5kb21pemUgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9yYW5kb21pemF0aW9uX2NsZWFuLnJkcyIpCmhlYWQocmFuZG9taXplKQoKbWxtX3YxIDwtIG1sbV92MSAlPiUKICByZW5hbWUoIklEIiA9IHN1YmplY3QpCgptbG1fdjIgPC0gbWxtX3YyICU+JQogIHJlbmFtZSgiSUQiID0gc3ViamVjdCkKCiMgZ2V0IHRoZSBJRHMgZm9yIGV2ZXJ5b25lIHdobyBnb3QgdHJlYXRtZW50IEEgYXQgdmlzaXQgMSAKSURzX3YxX3R4QSA8LSByYW5kb21pemUgJT4lIGZpbHRlcih0eF92MSA9PSAiQSIpClZpZXcoSURzX3YxX3R4QSkKCiMgaWZlbHNlIHN0YXRlbWVudDogaWYgSUQgPSBhbnkgb2YgdGhvc2UgbGlzdGVkIGluIHR4QV9saXN0LCBtYWtlIGNvbmRfdjEgPSAiQSIsIGVsc2UgbWFrZSBpdCAiQiIKbWxtX3YxIDwtIG1sbV92MSAlPiUKICBtdXRhdGUoY29uZF92MSA9IGFzLmZhY3RvcihpZmVsc2UoSUQgPT0gIkQxMDEiIHwgSUQgPT0gIkQxMDUiIHwgSUQgPT0gIkQxMDkiIHwgSUQgPT0gIkQxMTAiIHwgSUQgPT0gIkQxMTQiIHwgSUQgPT0gIkQxMTUiIHwgSUQgPT0gIkQxMTYiIHwgSUQgPT0gIkQxMTgiIHwgSUQgPT0gIkQxMTkiIHwgSUQgPT0gIkQxMjAiIHwgSUQgPT0gIkQxMjMiIHwgSUQgPT0gIkQxMjQiIHwgSUQgPT0gIkQxMjYiIHwgSUQgPT0gIkQxMjgiIHwgSUQgPT0gIkQxMzIiIHwgSUQgPT0gIkQxMzUiIHwgSUQgPT0gIkQxMzYiIHwgSUQgPT0gIkQxMzciIHwgSUQgPT0gIkQxMzgiIHwgSUQgPT0gIkQxNDAiIHwgSUQgPT0gIkQxNDEiIHwgSUQgPT0gIkQxNDUiIHwgSUQgPT0gIkQxNDgiIHwgSUQgPT0gIkQxNDkiIHwgSUQgPT0gIkQxMTciLCAiQSIsICJCIikpLCBjb25kX3YyID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJCIiwgIkEiKSkpCmhlYWQobWxtX3YxKQoKIyBpZmVsc2Ugc3RhdGVtZW50OiBpZiBJRCA9IGFueSBvZiB0aG9zZSBsaXN0ZWQgaW4gdHhBX2xpc3QsIG1ha2UgY29uZF92MiA9ICJCIiwgZWxzZSBtYWtlIGl0ICJBIiAocGVvcGxlIHdobyB3ZXJlIEEgYXQgdmlzaXQgMSBzaG91bGQgYmUgQiBmb3IgdmlzaXQgMiwgYW5kIHZpY2UgdmVyc2EpCm1sbV92MiA8LSBtbG1fdjIgJT4lCiAgbXV0YXRlKGNvbmRfdjIgPSBhcy5mYWN0b3IoaWZlbHNlKElEID09ICJEMTAxIiB8IElEID09ICJEMTA1IiB8IElEID09ICJEMTA5IiB8IElEID09ICJEMTEwIiB8IElEID09ICJEMTE0IiB8IElEID09ICJEMTE1IiB8IElEID09ICJEMTE2IiB8IElEID09ICJEMTE4IiB8IElEID09ICJEMTE5IiB8IElEID09ICJEMTIwIiB8IElEID09ICJEMTIzIiB8IElEID09ICJEMTI0IiB8IElEID09ICJEMTI2IiB8IElEID09ICJEMTI4IiB8IElEID09ICJEMTMyIiB8IElEID09ICJEMTM1IiB8IElEID09ICJEMTM2IiB8IElEID09ICJEMTM3IiB8IElEID09ICJEMTM4IiB8IElEID09ICJEMTQwIiB8IElEID09ICJEMTQxIiB8IElEID09ICJEMTQ1IiB8IElEID09ICJEMTQ4IiB8IElEID09ICJEMTQ5IiB8IElEID09ICJEMTE3IiwgIkIiLCAiQSIpKSwgY29uZF92MSA9IGFzLmZhY3RvcihpZmVsc2UoSUQgPT0gIkQxMDEiIHwgSUQgPT0gIkQxMDUiIHwgSUQgPT0gIkQxMDkiIHwgSUQgPT0gIkQxMTAiIHwgSUQgPT0gIkQxMTQiIHwgSUQgPT0gIkQxMTUiIHwgSUQgPT0gIkQxMTYiIHwgSUQgPT0gIkQxMTgiIHwgSUQgPT0gIkQxMTkiIHwgSUQgPT0gIkQxMjAiIHwgSUQgPT0gIkQxMjMiIHwgSUQgPT0gIkQxMjQiIHwgSUQgPT0gIkQxMjYiIHwgSUQgPT0gIkQxMjgiIHwgSUQgPT0gIkQxMzIiIHwgSUQgPT0gIkQxMzUiIHwgSUQgPT0gIkQxMzYiIHwgSUQgPT0gIkQxMzciIHwgSUQgPT0gIkQxMzgiIHwgSUQgPT0gIkQxNDAiIHwgSUQgPT0gIkQxNDEiIHwgSUQgPT0gIkQxNDUiIHwgSUQgPT0gIkQxNDgiIHwgSUQgPT0gIkQxNDkiIHwgSUQgPT0gIkQxMTciLCAiQSIsICJCIikpKQoKbGV2ZWxzKG1sbV92MSRjb25kX3YxKQpsZXZlbHMobWxtX3YyJGNvbmRfdjIpCgpoZWFkKG1sbV92MSkKICAKSURzX3YxX3R4QSRJRAptbG1fdjEgJT4lIGdyb3VwX2J5KGNvbmRfdjEpICU+JSBjb3VudChJRCkgIyBJRHMgYW5kIGNvbmQgbWF0Y2ggdHhBX2xpc3QKbWxtX3YyICU+JSBncm91cF9ieShjb25kX3YyKSAlPiUgY291bnQoSUQpICMgSURzIGFuZCBjb25kIG1hdGNoIHR4QV9saXN0CgptbG1fYnggPC0gYmluZF9yb3dzKG1sbV92MSxtbG1fdjIpClZpZXcobWxtX2J4KQoKIyBzYXZlIGl0CnNhdmVSRFMobWxtX2J4LCAifi9Ecm9wYm94LzIwMThGYWxsL0ZTSEQ2MTdDL21sbV9ieC5yZHMiKQpgYGAKCmBgYHtyfQojIHJlbmFtZSBzb21lIHZhcmlhYmxlcwpjb2xuYW1lcyhtbG1fYngpCm1sbV9ieCA8LSBtbG1fYnggJT4lIHJlbmFtZSgicHVzaF9wdWxsIiA9IHZhbHVlcy5pbml0aWFscmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICJnQUFUX1JUIiA9IHZhbHVlcy5SVCkKaGVhZChtbG1fYngpCgojIGFkZCBhIG5ldyB2YXJpYWJsZSBmb3IgY29uZGl0aW9uCm1sbV9ieDEgPC0gbWxtX2J4ICU+JSBtdXRhdGUoY29uZCA9IGFzLmZhY3RvcihpZmVsc2UoY29uZF92MSA9PSAiQSIgJiB2aXNpdCA9PSAiMSIsICJBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmRfdjIgPT0gIkEiICYgdmlzaXQgPT0gIjIiLCAiQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kX3YxID09ICJCIiAmIHZpc2l0ID09ICIxIiwgIkIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmRfdjIgPT0gIkIiICYgdmlzaXQgPT0gIjIiLCAiQiIsIE5BKSkpKSkpCgpWaWV3KG1sbV9ieDEpICMgY2hlY2sgdGhhdCBpdCBjb2RlZCB0aGUgImNvbmQiIGNvbHVtbiBjb3JyZWN0bHkgICAgICAKCiMgYWRkIGEgbmV3IHZhcmlhYmxlIGZvciBzdGltdWx1cyBjYXRlZ29yeQojIGluIHZhbHVlcy5zdGltdWx1czoKIyAxID0gc3BvdXNlLCAyID0gbGl2aW5nIGxvdmVkIG9uZS9XSE9UTywgMyA9IHN0cmFuZ2VyLCA0ID0gbm9tb3RoZXRpYyBkZWF0aC1yZWxhdGVkLCA1ID0gbmV1dHJhbCBpbWFnZXMKCnNvcnQodW5pcXVlKG1sbV9ieDEkdmFsdWVzLnN0aW11bHVzKSkKCm1sbV9ieDIgPC0gbWxtX2J4MSAlPiUKICBtdXRhdGUoc3RpbSA9IGFzLmZhY3RvcihpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIxQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8zLmpwZyIsICJzcG91c2UiLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIyQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8zLmpwZyIsICJsaXZpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIzQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8zLmpwZyIsICJzdHJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICI0Ql8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8zLmpwZyIsICJkZWF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMy5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMy5qcGciLCAibmV1dHJhbCIsIE5BKSkpKSkpKQoKbGV2ZWxzKG1sbV9ieDIkc3RpbSkKbWxtX2J4MiRzdGltIDwtIHJlbGV2ZWwobWxtX2J4MiRzdGltLCByZWYgPSAibmV1dHJhbCIpICMgbWFrZSBuZXV0cmFsIHRoZSByZWZlcmVuY2UgbGV2ZWwKICAgICAgICAgICAgICAgICAgICAgICAKIyBzYXZlIGl0CnNhdmVSRFMobWxtX2J4MiwgIn4vRHJvcGJveC8yMDE4RmFsbC9GU0hENjE3Qy9tbG1fYngyLnJkcyIpCmBgYAoKIyMjIEJpYXMgc2NvcmVzClNlcGFyYXRlIG91dCBwdXNoIG1pbnVzIHB1bGwsIHRoZW4gc3VidHJhY3QgcnVuMSBmcm9tIHJ1bjIgdG8gZ2VuZXJhdGUgYSBzY29yZSBxdWFudGlmeWluZyByZWxhdGl2ZSBhcHByb2FjaCBvciBhdm9pZGFuY2UgYmlhcy4KVGhlIHRvcCBhbmQgYm90dG9tIDElIG9mIHJlYWN0aW9uIHRpbWVzIChSVHMpIHdpbGwgYmUgcmVtb3ZlZCBhcyBwYXJ0IG9mIGNvbnZlbnRpb25hbCBkYXRhIGNsZWFuaW5nIGZvciB0aGlzIHRhc2suCmBgYHtyfQoKbWxtX3IxLjEgPC0gbWxtX2J4MiAlPiUgZmlsdGVyKHJ1biA9PSAiMSIpCnRhaWwobWxtX3IxLjEpICMgZG9lcyBpdCBsaW5lIHVwPwptbG1fcjIuMSA8LSBtbG1fYngyICU+JSBmaWx0ZXIocnVuID09ICIyIikKdGFpbChtbG1fcjIuMSkgCgpwOTlyMSA8LSBxdWFudGlsZShtbG1fcjEuMSRnQUFUX1JULCAwLjk5KSAKcDAxcjEgPC0gcXVhbnRpbGUobWxtX3IxLjEkZ0FBVF9SVCwgMC4wMSkgCnA5OXIxICMgOTl0aCBwZXJjZW50aWxlIFJUcyA+PSAxNzEzLjQ4bXMgCnAwMXIxICMgMXN0IHBlcmNlbnRpbGUgUlRzIDw9IDQ3Mm1zCgpwOTlyMiA8LSBxdWFudGlsZShtbG1fcjIuMSRnQUFUX1JULCAwLjk5KSAKcDAxcjIgPC0gcXVhbnRpbGUobWxtX3IyLjEkZ0FBVF9SVCwgMC4wMSkgIyAxc3QgcGVyY2VudGlsZSBSVHMgPD0gNDYzbXMKcDk5cjIgIyA5OXRoIHBlcmNlbnRpbGUgUlRzID49IDE3MTIuNDVtcyAKcDAxcjIgIyAxc3QgcGVyY2VudGlsZSBSVHMgPD0gNDYzbXMKCm1sbV9yMS4yIDwtIG1sbV9yMS4xICU+JQogIG11dGF0ZShvdXRsaWVyX1JUID0gaWZlbHNlKGdBQVRfUlQgPD0gcDAxcjEgfCBnQUFUX1JUID49IHA5OXIxLCAxLCAwKSkKdGFibGUobWxtX3IxLjIkb3V0bGllcl9SVCkgCjIyNy8xMTAwNSAjIDIyNyB0cmlhbHMgd2lsbCBiZSBkcm9wcGVkIHdoZW4gd2UgcmVtb3ZlIHRoZSB0b3AgYW5kIGJvdHRvbSAxJSwgYW5kIDExMDA1IHdpbGwgYmUgcmV0YWluZWQuCgptbG1fcjIuMiA8LSBtbG1fcjIuMSAlPiUKICBtdXRhdGUob3V0bGllcl9SVCA9IGlmZWxzZShnQUFUX1JUIDw9IHAwMXIyIHwgZ0FBVF9SVCA+PSBwOTlyMiwgMSwgMCkpCnRhYmxlKG1sbV9yMi4yJG91dGxpZXJfUlQpIAoyMzAvMTEwMDIgIyAyMzAgdHJpYWxzIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHdlIHJlbW92ZSB0aGUgdG9wIGFuZCBib3R0b20gMSUsIGFuZCAxMTAwMiB3aWxsIGJlIHJldGFpbmVkLgoKbWxtX3IxcjIgPC0gYmluZF9jb2xzKG1sbV9yMS4yLCBtbG1fcjIuMikgIyAxMTIzMiB0cmlhbHMgdG90YWwuCmhlYWQobWxtX3IxcjIpICMgbWFrZSBzdXJlIHRoYXQgdHJpYWxzIGluIHRoZSB0d28gcnVucyBsaW5lIHVwIHBvc3QtbWVyZ2UKdGFpbChtbG1fcjFyMikgIyBtYWtlIHN1cmUgdGhhdCB0cmlhbHMgaW4gdGhlIHR3byBydW5zIGxpbmUgdXAgcG9zdC1tZXJnZQoKIyBnZXQgcmlkIG9mIGFueSB0cmlhbHMgd2l0aCBvdXRsaWVycyBpbiBlaXRoZXIgcnVuMSBvciBydW4yIAojIChuZWVkIHJ1bjEvcnVuMiB0byBiZSB0aGUgc2FtZSBsZW5ndGggc28gdGhhdCB0aGUgdHJpYWxzIGFsaWduIGJldHdlZW4gdGhlIHJ1bnMpCm1sbV9yMXIyLjEgPC0gbWxtX3IxcjIgJT4lIGZpbHRlcihvdXRsaWVyX1JUID09ICIwIiAmIG91dGxpZXJfUlQxID09ICIwIikgCmNvdW50KG1sbV9yMXIyLjEpICMgMTA3OTAgb2JzLgoxMDc5MC8xMTIzMiAjIDk2JSBvZiB0cmlhbHMgcmV0YWluZWQgPSA0JSBvZiB0cmlhbHMgZHJvcHBlZCA9IDw1JSB0cmlhbHMgZHJvcHBlZCAoaW4gZWZmZWN0LCA8NSUgIm1pc3NpbmcgZGF0YSIpLgoKIyBjYWxjdWxhdGUgdGhlIGJpYXMgbWV0cmljCnB1c2hfcHVsbCA8LSBtbG1fcjFyMi4xICU+JSBmaWx0ZXIocHVzaF9wdWxsID09ICJQVVNIIiAmIHB1c2hfcHVsbDEgPT0gIlBVTEwiKSAlPiUgbXV0YXRlKGJpYXMgPSAoZ0FBVF9SVC1nQUFUX1JUMSkpCnB1bGxfcHVzaCA8LSBtbG1fcjFyMi4xICU+JSBmaWx0ZXIocHVzaF9wdWxsID09ICJQVUxMIiAmIHB1c2hfcHVsbDEgPT0gIlBVU0giKSAlPiUgbXV0YXRlKGJpYXMgPSAoZ0FBVF9SVDEtZ0FBVF9SVCkpCgojIG1lcmdlIHB1c2hfcHVsbCBhbmQgcHVsbF9wdXNoIHRvZ2V0aGVyCm1sbV9wcCA8LSBiaW5kX3Jvd3MocHVzaF9wdWxsLHB1bGxfcHVzaCkKClZpZXcobWxtX3BwKQpgYGAKCiMjIyBUcmFuc2Zvcm1hdGlvbnMKYGBge3J9CmxpYnJhcnkocHN5Y2gpCmRlc2NyaWJlKG1sbV9wcCRiaWFzKSAjIHNrZXduZXNzIGlzIDAuMSwga3VydG9zaXMgaXMgMS42OQpoaXN0KG1sbV9wcCRiaWFzKQpxcW5vcm0obWxtX3BwJGJpYXMpCmdncGxvdChtbG1fcHAsIGFlcyhzYW1wbGU9YmlhcykpK3N0YXRfcXEoKStzdGF0X3FxX2xpbmUoKSAjIG5vdCBhIGdvb2QgbG9vayBhdCBhbGwuLi4KCiMgaW5zdGFsbC5wYWNrYWdlcygiYmVzdE5vcm1hbGl6ZSIpCiMgYmVzdE5vcm1hbGl6ZSBpZGVudGlmaWVzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IG5vcm1hbGl6ZXMgeW91ciBkYXRhIHRoZSBiZXN0CmxpYnJhcnkoYmVzdE5vcm1hbGl6ZSkKCm9yZGVyTm9ybV9iaWFzIDwtIGJlc3ROb3JtYWxpemUobWxtX3BwJGJpYXMpICMgdGhlICJvcmRlck5vcm0iIHRyYW5zZm9ybSBnZXRzIHRoZSBkYXRhIHRoZSBjbG9zZXN0IHRvIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBjb21wYXJlZCB0byBvdGhlciBtZXRob2RzCm1sbV9wcCRiaWFzX3QgPC0gb3JkZXJOb3JtX2JpYXMkeC50ICMgcHVsbCB4LnQgZnJvbSBvcmRlck5vcm1fYmlhcyBhbmQgYXNzaWduIGl0IGJhY2sgaW50byBkYXRhc2V0CiMgeC50IGNvbnRhaW5zIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZXMgb2YgeCwgdXNpbmcgdGhlIHRyYW5zZm9ybSBpZGVudGlmaWVkIGJ5IGJlc3ROb3JtYWxpemUgYXMgYmVpbmcgc3VwZXJpb3IKCmRlc2NyaWJlKG1sbV9wcCRiaWFzX3QpCmhpc3QobWxtX3BwJGJpYXNfdCkKcXFub3JtKG1sbV9wcCRiaWFzX3QpCmdncGxvdChtbG1fcHAsIGFlcyhzYW1wbGU9Ymlhc190KSkrc3RhdF9xcSgpK3N0YXRfcXFfbGluZSgpICMgc28gbXVjaCBiZXR0ZXIhCgojIGJhY2stdHJhbnNmb3JtYXRpb24sIGp1c3QgdG8gc2hvdyBob3cgdG8gZG8gaXQ6CnAgPC0gcHJlZGljdChvcmRlck5vcm1fYmlhcykKICAgIHgyIDwtIHByZWRpY3Qob3JkZXJOb3JtX2JpYXMsIG5ld2RhdGEgPSBwLCBpbnZlcnNlID0gVFJVRSkgIyB4MiBpcyB0aGUgYmFjay10cmFuc2Zvcm1lZCBkYXRhCiAgICBhbGwuZXF1YWwoeDIsIG1sbV9wcCRiaWFzX3QpIAoKbWxtX2J4MyA8LSBtbG1fcHAKc2F2ZVJEUyhtbG1fYngzLCAifi9Ecm9wYm94LzIwMThGYWxsL0ZTSEQ2MTdDL21sbV9ieDMucmRzIikKYGBgCkJlY2F1c2UgYGJpYXNgIGlzIHF1aXRlIG5vbi1ub3JtYWwsIGxvb2tpbmcgYXQgdGhlIHBsb3RzIGFib3ZlLCBhbmFseXNlcyB3aWxsIHVzZSB0aGUgdHJhbnNmb3JtZWQgYmlhcyBzY29yZSAoYGJpYXNfdGApIGluc3RlYWQuCgojIyMgQ2hlY2tpbmcgdGhlIGRhdGEKYGBge3J9CnRhYmxlIDwtIG1sbV9ieDMgJT4lIGdyb3VwX2J5KElEKSAlPiUgZ3JvdXBfYnkoY29uZCkgJT4lIGNvdW50KElEKSAKdGFibGUKIyBtaXNzaW5nIGRhdGEuLi4KIyBjb25kIEEgbG93IHRyaWFsIGNvdW50czogRDEwMSAoMyB0cmlhbHMpLCBEMTQxICgxOCB0cmlhbHMpLCBEMTQ4ICgxOSB0cmlhbHMpCiMgY29uZCBCIGxvdyB0cmlhbCBjb3VudHM6ICBEMTQ3ICgxIHRyaWFsKQoKZGVzY3JpYmUodGFibGUkbikKZ2dwbG90KHRhYmxlLCBhZXMoc2FtcGxlPW4pKStzdGF0X3FxKCkrc3RhdF9xcV9saW5lKCkgIyBjYW4gc2VlIHRob3NlIDQgb24gdGhlIFFRIHBsb3QKCiMgd2hlcmUgYXJlIHRoZSB0cmlhbHMgZ2V0dGluZyBkcm9wcGVkPwptbG1fcjFyMiAlPiUgZ3JvdXBfYnkoSUQpICU+JSBncm91cF9ieShjb25kKSAlPiUgY291bnQoSUQpICMgZXZlcnlvbmUgaGFzIDE0NCBoZXJlCm1sbV9yMXIyLjEgJT4lIGdyb3VwX2J5KElEKSAlPiUgZ3JvdXBfYnkoY29uZCkgJT4lIGNvdW50KElEKSAKIyBhZnRlciBnZXR0aW5nIHJpZCBvZiBvdXRsaWVycywgbW9zdCBwZW9wbGUgbWlzc2luZyBhIGZldyB0cmlhbHMgKEQxMDcgY29uZCBBL0IgYW5kIEQxMTMgY29uZCBBIG1pc3NpbmcgPjIwKQoKbWxtX3IxcjIuMSAlPiUgZmlsdGVyKElEPT0iRDEwMSIgJiBjb25kPT0iQSIpCm1sbV9yMXIyLjEgJT4lIGZpbHRlcihJRD09IkQxNDEiICYgY29uZD09IkEiKQptbG1fcjFyMi4xICU+JSBmaWx0ZXIoSUQ9PSJEMTQ4IiAmIGNvbmQ9PSJBIikKbWxtX3IxcjIuMSAlPiUgZmlsdGVyKElEPT0iRDE0NyIgJiBjb25kPT0iQiIpCiMgc28gdHJpYWxzIGFyZSBnZXR0aW5nIGRyb3BwZWQgYmVjYXVzZSB0aGV5IGRpZG4ndCBlZmZlY3RpdmVseSByZXZlcnNlIHRoZSBpbnN0cnVjdGlvbnMgb3IgdGhleSByZXZlcnRlZCB0byB0aGUgb2xkIGluc3RydWN0aW9ucwojIGluIGVzc2VuY2UsIHRoaXMgcmVtb3ZlcyBlcnJvciB0cmlhbHMKCiMgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHRvIGluZGljYXRlIHRoZSA0IHBhcnRpY2lwYW50cyB3aXRoIGxvdyB0cmlhbCBjb3VudHMgKGkuZS4sIHBlb3BsZSB3aG8gaGF2ZSBhIGJpYXMgc2NvcmUgb24gPDE0JSBvZiB0cmlhbHMpCm1sbV9ieDMgPC0gbWxtX2J4MyAlPiUgbXV0YXRlKGxvd19uX3RyaWFscyA9IGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NyIgfCBJRCA9PSAiRDE0OCIsIDEsIDApKQoKIyBjaGVjayB3aGV0aGVyIHRoZSByb3dzIGxpbmUgdXAgYnkgbG9va2luZyBmb3Igcm93cyB3aGVyZSB2YXIgYW5kIHZhcjEgZG9uJ3QgbWF0Y2gKbm90bGluZWR1cCA8LSBtbG1fYngzICU+JSBmaWx0ZXIoc3RpbSAhPSBzdGltMSkKbm90bGluZWR1cCAjIDAgcm93cyByZXR1cm5lZDsgYWxsIHRoZSByb3dzIG1hdGNoCm5vdGxpbmVkdXAgPC0gbWxtX2J4MyAlPiUgZmlsdGVyKHRyaWFsY29kZSAhPSB0cmlhbGNvZGUxKQpub3RsaW5lZHVwICMgMCByb3dzIHJldHVybmVkOyBhbGwgdGhlIHJvd3MgbWF0Y2gKbm90bGluZWR1cCA8LSBtbG1fYngzICU+JSBmaWx0ZXIodHJpYWxudW0gIT0gdHJpYWxudW0xKQpub3RsaW5lZHVwICMgMCByb3dzIHJldHVybmVkOyBhbGwgdGhlIHJvd3MgbWF0Y2gKCmhlYWQobWxtX2J4MykKc2F2ZVJEUyhtbG1fYngzLCAifi9Ecm9wYm94LzIwMThGYWxsL0ZTSEQ2MTdDL21sbV9ieDMucmRzIikKYGBgCgojIyMgQWRkIHRpbWUtaW52YXJpYW50IHZhcmlhYmxlcwpOZXh0IHN0ZXAgaXMgdG8gYWRkIGRlbW9ncmFwaGljcyBhbmQgb3RoZXIgc2VsZi1yZXBvcnRlZCBhbmQgZ2VuZXRpYyBkYXRhIHZhcmlhYmxlcyB0aGF0IHdlIG1pZ2h0IHBvdGVudGlhbGx5IHdhbnQgdG8gaW5jbHVkZSBpbiB0aGUgbW9kZWwgYnV0IHRoYXQgZG8gbm90IGNoYW5nZSBvdmVyIHRpbWUuIExvb2tpbmcgYXQgdGhlIGNvZGVib29rIGZvciB0aGUgbWFzdGVyIGRhdGFzZXQsIHRoZXNlIGluY2x1ZGU6CgpEZW1vZ3JhcGhpY3M6CgoqIGBhZ2VgCiogYGFnZV95cnNgCiogYHNleF9tYAoqIGBldGhuaWNpdHlfaGlzcGAKKiBgcmFjZWAKKiBgdGltZXNpbmNlZGVhdGhgCgpHZW5ldGljIHZhcmlhYmxlczoKCiogYHJzMjI1NDI5OGAKKiBgcnMyMjY4NDk4YAoqIGByczUzNTc2YAoqIGByczIyNTQyOThfQS5jYXJyaWVyYAoqIGByczIyNjg0OThfQy5jYXJyaWVyYAoqIGByczUzNTc2X0EuY2FycmllcmAKClNlbGYtcmVwb3J0IG1lYXN1cmVzOgoKKiBgdG90X2ljZ2AgW2dyaWVmXQoqIGB0b3RfYmRpYCBbZGVwcmVzc2lvbl0KKiBgdG90X2JncWAgW2JyaWVmIGdyaWVmIHF1ZXN0aW9ubmFpcmUgd2l0aCBpbXBhaXJtZW50IGl0ZW1dCiogYHRvdF9lY3Jyc19nbG9iYWxfYW54YCBbYW54aW91cyBhdHRhY2htZW50IC0gZ2xvYmFsXQoqIGB0b3RfZWNycnNfZ2xvYmFsX2F2b2lkYCBbYXZvaWRhbnQgYXR0YWNobWVudCAtIGdsb2JhbF0KKiBgdG90X2VjcnJzX3Nwb3VzZV9hbnhgIFthbnhpb3VzIGF0dGFjaG1lbnQgLSBzcG91c2VdCiogYHRvdF9lY3Jyc19zcG91c2VfYXZvaWRgIFthdm9pZGFudCBhdHRhY2htZW50IC0gc3BvdXNlXQoqIGB0b3RfeXNsYCBbeWVhcm5pbmcgZm9yIHRoZSBkZWNlYXNlZF0KCgpgYGB7cn0KIyBsb2FkIGluIG1hc3RlciBkYXRhc2V0Cm1hc3RlciA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCX2J4X2NsZWFuLnJkcyIpIAoKIyBzdWJzZXQgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcwptbG1fYWRkIDwtIHN1YnNldChtYXN0ZXIsIHNlbGVjdD1jKElELGFnZSwgYWdlX3lycywgc2V4X20sIGV0aG5pY2l0eV9oaXNwLCByYWNlLCB0aW1lc2luY2VkZWF0aCwgcnMyMjU0Mjk4LCByczIyNjg0OTgsIHJzNTM1NzYsIHJzMjI1NDI5OF9BLmNhcnJpZXIsIHJzMjI2ODQ5OF9DLmNhcnJpZXIsIHJzNTM1NzZfQS5jYXJyaWVyLCB0b3RfYmRpLCB0b3RfYmdxLCB0b3RfZWNycnNfZ2xvYmFsX2FueCx0b3RfZWNycnNfZ2xvYmFsX2F2b2lkLCB0b3RfZWNycnNfc3BvdXNlX2FueCwgdG90X2VjcnJzX3Nwb3VzZV9hdm9pZCwgdG90X3lzbCwgdG90X2ljZykpCmhlYWQobWxtX2FkZCkKCiMgbWVyZ2UgaW50byB0aGUgYmVoYXZpb3JhbCBkYXRhc2V0Cm1sbV9ieDQgPC0gbGVmdF9qb2luKG1sbV9ieDMsIG1sbV9hZGQsIGJ5PSJJRCIpCmhlYWQobWxtX2J4NCkKbGlicmFyeShwc3ljaCkKCiMgc2F2ZSBpdApzYXZlUkRTKG1sbV9ieDQsICJ+L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MvbWxtX2J4NC5yZHMiKQpgYGAKCgojIyBFeHBsb3JhdG9yeSBhbmFseXNpcyBhbmQgY2hlY2tpbmcgYXNzdW1wdGlvbnMKCkZpcnN0IHN0ZXAgaXMgdG8gb3ZlcnZpZXcgdGhlIGVudGlyZSBkYXRhc2V0IHVzaW5nIGBzdW1tYXJ5dG9vbHNgLiAKYGBge3J9CmxpYnJhcnkoc3VtbWFyeXRvb2xzKQoKIyBvdmVydmlldyB0aGUgZW50aXJlIGRhdGFzZXQKZGZTdW1tYXJ5KG1sbV9ieDQpICMgdGhpcyB3aWxsIGxvb2sgbGlrZSBUT1RBTCBjcmFwIGluIHRoZSBjb25zb2xlIChub3RlYm9vayBvdXRwdXQpCiMgdXNlIHZpZXcoZGZTdW1tYXJ5KG1sbV9ieDQpKSBmcm9tIHRoZSBjb25zb2xlIHRvIHNlZSBhIG11Y2ggbW9yZSByZWFkYWJsZSBhbmQgYXR0cmFjdGl2ZSBvdXRwdXQKYGBgCk5vbmUgb2YgdGhlIHZhcmlhYmxlcyBoYXZlIGFueSBtaXNzaW5nIGRhdGEsIGFwYXJ0IGZyb20gYHJzMjI1NDI5OGAgYW5kIGByczIyNTQyOThfQS5jYXJyaWVyYCwgYW5kIEknbSBhd2FyZSBmcm9tIHRoZSBkYXRhIGNsZWFuaW5nIHRoYXQgSSBkaWQgZm9yIHRoZSBtYXN0ZXIgZGF0YXNldCB0aGF0IG9uZSBwYXJ0aWNpcGFudCdzIGdlbm90eXBlIGZvciB0aGF0IFNOUCB3YXMgdW5hYmxlIHRvIGJlIGlkZW50aWZpZWQuCgojIyMgRGVzY3JpcHRpdmVzCmBgYHtyfQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHN0YXJnYXplcikKbGlicmFyeShzdW1tYXJ5dG9vbHMpCgojIGRlc2NyaXB0aXZlcyBmb3IgdGhlIHRpbWUtaW52YXJpYW50IHZhcmlhYmxlcyBhcmUgZ29pbmcgdG8gYmUgd3JvbmcgaWYgd2UgdXNlIG1sbV9ieDQgKHNpbmNlIG9ic2VydmF0aW9ucyBhcmUgZHVwbGljYXRlZCkKIyBzbyBnb2luZyBiYWNrIHRvIHRoZSBtbG1fYWRkIG9iamVjdC4uLgojIG5vdGUgdGhhdCBuID0gNDAsIGJ1dCBuID0gMzkgd2l0aCBSVCBkYXRhCiMgRDE0OSdzIGJlaGF2aW9yYWwgZGF0YSB3YXMgZHJvcHBlZCAocmFuIG91dHNpZGUgb2Ygc2Nhbm5lciksIHNvIGRyb3AgaGlzIGNhc2UKCm1sbV9hZGQgPC0gZmlsdGVyKG1sbV9hZGQsICFncmVwbCgiRDE0OSIsSUQpKQp1bmlxdWUobWxtX2FkZCRJRCkgIyBpdCB3b3JrZWQKbnVtcyA8LSBzZWxlY3RfaWYobWxtX2FkZCwgaXMubnVtZXJpYykgIyBqdXN0IGdldCB0aGUgbnVtZXJpYyB2YXJpYWJsZXMKdmlldyhkZlN1bW1hcnkobnVtcykpIApzdGFyZ2F6ZXIobnVtcywgdHlwZT0idGV4dCIsIHRpdGxlPSJEZXNjcmlwdGl2ZXMiLCBkaWdpdHM9Miwgb3V0PSJ0YWJsZTEudHh0Iiwgbm90ZXMgPSAiTm90ZTogJ3N0YXJnYXplcicgbWFrZXMgbmljZXIgbG9va2luZyB0YWJsZXMsIGJ1dCBkb2Vzbid0IHByb3ZpZGUgc2tld25lc3Mgb3Iga3VydG9zaXMgc3RhdGlzdGljcywgc28gd2UnbGwgdXNlICdwc3ljaCcgZm9yIHRoYXQuIikgCgpkZXNjcmliZShudW1zKQpgYGAKCiMjIyBGcmVxdWVuY2llcwpgYGB7cn0KIyB3aGljaCB2YXJpYWJsZXMgYXJlIGZhY3RvcnM/Cm1sbV9hZGQgJT4lIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JSBjb2xuYW1lcygpCgojIGhtbSwgcnMyMjY4NDk4IGFuZCByczUzNTc2IHNob3VsZCBhbHNvIGJlIGZhY3RvcnMsIHNvIGZpeCB0aGF0IG5vdwptbG1fYWRkIDwtIG1sbV9hZGQgJT4lIG11dGF0ZShyczIyNjg0OTggPSByZWNvZGVfZmFjdG9yKHJzMjI2ODQ5OCwgIkMvVCIgPSAiQy9UIiwgIkNDIiA9ICJDQyIsICJUVCIgPSAiVFQiKSwgcnM1MzU3NiA9IHJlY29kZV9mYWN0b3IocnM1MzU3NiwgIkEvRyIgPSAiQS9HIiwgIkFBIiA9ICJBQSIsICJHRyIgPSAiR0ciKSkKbWxtX2FkZCAlPiUgc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIGNvbG5hbWVzKCkKCiMgZnVuY3Rpb24gdG8gY291bnQgZnJlcXVlbmNpZXMgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZSBmYWN0b3JzLi4udGhpcyBpc24ndCB3b3JraW5nCiMgY291bnRBbGwgPC0gZnVuY3Rpb24oYmFzZWRhdGEpCiMgewojCWZhY3MgPC0gc2FwcGx5KGJhc2VkYXRhLCBpcy5mYWN0b3IpCiMJZmFjZGF0YSA8LSBiYXNlZGF0YVsgLGZhY3NdCiMJZm9yKGkgaW4gMTpsZW5ndGgoZmFjZGF0YSkpCiMJewojCQljb3VudChmYWNkYXRhKQojCSB9CiMgfQojIGNvdW50QWxsKG1sbV9ieDQpCgptbG1fYWRkICU+JSBjb3VudChzZXhfbSkgIyAyOCBmZW1hbGVzLCAxMSBtYWxlcwptbG1fYWRkICU+JSBjb3VudChyYWNlKSAjIDM4IHdoaXRlLCAxIGFub3RoZXIgcmFjZSBub3QgbGlzdGVkCm1sbV9hZGQgJT4lIGNvdW50KGV0aG5pY2l0eV9oaXNwKSAjIDM3IG5vbi1IaXNwYW5pYy9MYXRpbm8sIDIgSGlzcGFuaWMvTGF0aW5vCm1sbV9hZGQgJT4lIGNvdW50KHJzMjI1NDI5OCkgIyAyMiBHRywgMTAgQS9HLCAxIE5BL21pc3NpbmcgKDAgQUEpCm1sbV9hZGQgJT4lIGNvdW50KHJzMjI2ODQ5OCkgIyAxNyBDL1QsIDEwIENDLCAxMiBUVAptbG1fYWRkICU+JSBjb3VudChyczUzNTc2KSAjIDIxIEEvRywgMTggR0cgKDAgQUEpCm1sbV9hZGQgJT4lIGNvdW50KHJzMjI1NDI5OF9BLmNhcnJpZXIpICMgeWVzID0gMTAsIG5vID0gMjgsIE5BID0gMQptbG1fYWRkICU+JSBjb3VudChyczIyNjg0OThfQy5jYXJyaWVyKSAjIHllcyA9IDI3LCBubyA9IDEyCm1sbV9hZGQgJT4lIGNvdW50KHJzNTM1NzZfQS5jYXJyaWVyKSAjIHllcyA9IDIxLCBubyA9IDE4CmBgYAoKIyMjIENoZWNraW5nIGRpc3RyaWJ1dGlvbiBzaGFwZXMgYW5kIG5vcm1hbGl0eQpHb3QgYSBwcmV2aWV3IG9mIHRoaXMgYWJvdmUgd2hlbiB3ZSB1c2VkIGBzdW1tYXJ5dG9vbHNgLCBidXQgaGVyZSdzIGEgY2xvc2VyIGxvb2sgYXQgc29tZSBoaXN0b2dyYW1zIGFuZCBRUSBwbG90cy4KYGBge3J9CiMgYSBmdW5jdGlvbiB0byBwcm9kdWNlIGhpc3RvZ3JhbXMgZm9yIGFsbCBudW1lcmljIHZhcmlhYmxlcyBpbiBhIGRhdGFmcmFtZQpoaXN0QWxsIDwtIGZ1bmN0aW9uKGJhc2VkYXRhKQp7CgludW1zIDwtIHNhcHBseSgoYmFzZWRhdGEpLCBpcy5udW1lcmljKQoJbnVtZGF0YSA8LSBiYXNlZGF0YVsgLG51bXNdCglwYXIobWZyb3c9YygyLDIpKQoJZm9yKGkgaW4gMTpsZW5ndGgobnVtZGF0YSkpCgl7CgkJaGlzdChudW1kYXRhWyxpXSwgeGxhYj1OVUxMLCBtYWluPW5hbWVzKG51bWRhdGFbaV0pKQoJfQp9CgpoaXN0QWxsKGFzLmRhdGEuZnJhbWUobWxtX2J4NCkpCgpxcUFsbCA8LSBmdW5jdGlvbihiYXNlZGF0YSkKewoJbnVtcyA8LSBzYXBwbHkoKGJhc2VkYXRhKSwgaXMubnVtZXJpYykKCW51bWRhdGEgPC0gYmFzZWRhdGFbICxudW1zXQoJcGFyKG1mcm93PWMoMiwyKSkKCWZvcihpIGluIDE6bGVuZ3RoKG51bWRhdGEpKQoJewoJCXFxbm9ybShudW1kYXRhWyxpXSwgeGxhYj1OVUxMLCBtYWluPW5hbWVzKG51bWRhdGFbaV0pKQoJfQp9CgpxcUFsbChhcy5kYXRhLmZyYW1lKG1sbV9ieDQpKQoKYGBgClRoZSBtb3N0IHByb2JsZW1hdGljIG9mIHRoZXNlIGFwcGVhciB0byBiZSBhbnhpb3VzL2F2b2lkYW50IGF0dGFjaG1lbnQgc3R5bGUgZm9yIHRoZSBzcG91c2UgKGB0b3RfZWNycnNfc3BvdXNlX2FueGAgYW5kIGB0b3RfZWNycnNfc3BvdXNlX2F2b2lkYCksIGdsb2JhbCBhbnhpb3VzIGF0dGFjaG1lbnQgc3R5bGUgKGB0b3RfZWNycnNfZ2xvYmFsX2FueGApLCBkZXByZXNzaXZlIHN5bXB0b21zIChgdG90X2JkaWApLCBhbmQgdGltZSBzaW5jZSBzcG91c2UncyBkZWF0aCAoYHRpbWVzaW5jZWRlYXRoYCAtIGluIGRheXMpLgoKIyMjIENlbnRlcmluZyBMMiBwcmVkaWN0b3JzCgpgYGB7cn0KIyBwdWxsIG91dCBvbmx5IHRoZSB0b3RhbCBzY29yZSB2YXJpYWJsZXMsIGFnZSwgdGltZXNpbmNlZGVhdGgKZ2N2YXJzIDwtIGFzLmRhdGEuZnJhbWUobWxtX2J4NFssIGdyZXAoJ150b3R8YWdlfHRpbWVzaW5jZWRlYXRofElEJywgbmFtZXMobWxtX2J4NCkpXSkKZ2N2YXJzMSA8LSBnY3ZhcnNbIWR1cGxpY2F0ZWQoZ2N2YXJzJElEKSwgXQpzdGFyZ2F6ZXIoZ2N2YXJzMSwgdHlwZT0idGV4dCIsIG1lZGlhbiA9IFQsIGRpZ2l0cz0zKQoKZ21lYW5fYWdlIDwtIG1lYW4oZ2N2YXJzMSRhZ2UpCmdtZWFuX2FnZV95cnMgPC0gbWVhbihnY3ZhcnMxJGFnZV95cnMpCmdtZWFuX3RpbWUgPC0gbWVhbihnY3ZhcnMxJHRpbWVzaW5jZWRlYXRoKQpnbWVhbl9iZGkgPC0gbWVhbihnY3ZhcnMxJHRvdF9iZGkpCmdtZWFuX2JncSA8LSBtZWFuKGdjdmFyczEkdG90X2JncSkKZ21lYW5fZWNycnNfZ19hbnggPC0gbWVhbihnY3ZhcnMxJHRvdF9lY3Jyc19nbG9iYWxfYW54KQpnbWVhbl9lY3Jyc19nX2F2IDwtIG1lYW4oZ2N2YXJzMSR0b3RfZWNycnNfZ2xvYmFsX2F2b2lkKQpnbWVhbl9lY3Jyc19zX2FueCA8LSBtZWFuKGdjdmFyczEkdG90X2VjcnJzX3Nwb3VzZV9hbngpCmdtZWFuX2VjcnJzX3NfYXYgPC0gbWVhbihnY3ZhcnMxJHRvdF9lY3Jyc19zcG91c2VfYXZvaWQpCmdtZWFuX2ljZyA8LSBtZWFuKGdjdmFyczEkdG90X2ljZykKZ21lYW5feXNsIDwtIG1lYW4oZ2N2YXJzMSR0b3RfeXNsKQoKbWxtX2J4NSA8LSBtbG1fYng0ICU+JSBtdXRhdGUoZ21lYW5fYWdlID0gYWdlLWdtZWFuX2FnZSwgZ21lYW5fYWdlX3lycyA9IGFnZV95cnMtZ21lYW5fYWdlX3lycywgZ21lYW5fdGltZXNpbmNlZGVhdGggPSB0aW1lc2luY2VkZWF0aC1nbWVhbl90aW1lLCBnbWVhbl9iZGkgPSB0b3RfYmRpLWdtZWFuX2JkaSwgZ21lYW5fYmdxID0gdG90X2JncS1nbWVhbl9iZ3EsIGdtZWFuX2VjcnJzX2dsb2JhbF9hbnggPSB0b3RfZWNycnNfZ2xvYmFsX2FueC1nbWVhbl9lY3Jyc19nX2FueCwgZ21lYW5fZWNycnNfZ2xvYmFsX2F2b2lkID0gdG90X2VjcnJzX2dsb2JhbF9hdm9pZC1nbWVhbl9lY3Jyc19nX2F2LCBnbWVhbl9lY3Jyc19zcG91c2VfYW54ID0gdG90X2VjcnJzX3Nwb3VzZV9hbngtZ21lYW5fZWNycnNfc19hbngsIGdtZWFuX2VjcnJzX3Nwb3VzZV9hdm9pZCA9IHRvdF9lY3Jyc19zcG91c2VfYXZvaWQtZ21lYW5fZWNycnNfc19hdiwgZ21lYW5feXNsID0gdG90X3lzbC1nbWVhbl95c2wsIGdtZWFuX2ljZyA9IHRvdF9pY2ctZ21lYW5faWNnKQpzdGFyZ2F6ZXIoYXMuZGF0YS5mcmFtZShtbG1fYng1KSwgdHlwZT0idGV4dCIpICMgbm90ZSB0aGF0IG1lYW5zIG9mIHRoZSBncm91cC1tZWFuIGNlbnRlcmVkIHZhcmlhYmxlcyBpbiB0aGUgbG9uZyBkYXRhc2V0IGFyZSBub3QgemVybyAtIEkgdGhpbmsgdGhpcyBpcyBiZWNhdXNlIHNvbWUgcGVvcGxlIGhhZCBtb3JlIHRyaWFscyB0aGFuIG90aGVycwoKIyB0ZXN0IHRoYXQgaHlwb3RoZXNpcyB3aXRoIHRoZSBub24tZHVwbGljYXRlZCBkYXRhCmdjdmFyczIgPC0gZ2N2YXJzMSAlPiUgbXV0YXRlKGdtZWFuX2FnZSA9IGFnZS1nbWVhbl9hZ2UsIGdtZWFuX2FnZV95cnMgPSBhZ2VfeXJzLWdtZWFuX2FnZV95cnMsIGdtZWFuX3RpbWVzaW5jZWRlYXRoID0gdGltZXNpbmNlZGVhdGgtZ21lYW5fdGltZSwgZ21lYW5fYmRpID0gdG90X2JkaS1nbWVhbl9iZGksIGdtZWFuX2JncSA9IHRvdF9iZ3EtZ21lYW5fYmdxLCBnbWVhbl9lY3Jyc19nbG9iYWxfYW54ID0gdG90X2VjcnJzX2dsb2JhbF9hbngtZ21lYW5fZWNycnNfZ19hbngsIGdtZWFuX2VjcnJzX2dsb2JhbF9hdm9pZCA9IHRvdF9lY3Jyc19nbG9iYWxfYXZvaWQtZ21lYW5fZWNycnNfZ19hdiwgZ21lYW5fZWNycnNfc3BvdXNlX2FueCA9IHRvdF9lY3Jyc19zcG91c2VfYW54LWdtZWFuX2VjcnJzX3NfYW54LCBnbWVhbl9lY3Jyc19zcG91c2VfYXZvaWQgPSB0b3RfZWNycnNfc3BvdXNlX2F2b2lkLWdtZWFuX2VjcnJzX3NfYXYsIGdtZWFuX3lzbCA9IHRvdF95c2wtZ21lYW5feXNsLCBnbWVhbl9pY2cgPSB0b3RfaWNnLWdtZWFuX2ljZykKc3RhcmdhemVyKGFzLmRhdGEuZnJhbWUoZ2N2YXJzMiksIHR5cGU9InRleHQiKSAjIHllcywgbm93IHRoZSBtZWFucyBhcmUgemVybyB3aGVuIGVhY2ggcGVyc29uIGNvbnRyaWJ1dGVzIG9ubHkgb25lIG9ic2VydmF0aW9uCgpzYXZlUkRTKG1sbV9ieDUsICJ+L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MvbWxtX2J4NS5yZHMiKQpgYGAKCiMjIyBFdmFsdWF0ZSBtaXNzaW5nIGRhdGEgCmBgYHtyfQptbG1fYng1ICU+JSAKICBzZWxlY3RfaWYoZnVuY3Rpb24oeCkgYW55KGlzLm5hKHgpKSkgJT4lIAogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKGlzLm5hKC4pKSkpIC0+IG1sbV9ieDVfTkFzICMgb3IgdXNlIHN1bSgpIGluc3RlYWQgb2YgbWVhbigpIHRvIGZpbmQgbiBtaXNzaW5nIHZhbHVlcwoKbWxtX2J4NV9OQXMgPC0gZ2F0aGVyKG1sbV9ieDVfTkFzKSAjIGNyZWF0ZSBsb25nIGRhdGEgdGhhdCBsaXN0cyB2YXJpYWJsZXMgd2l0aCBhbnkgTkFzLCBhbmQgJSBvZiBkYXRhIG1pc3NpbmcKbWxtX2J4NV9OQXMgIyB0aGlzIGRvZXMgYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBwcm9wbWlzcyBmdW5jdGlvbiBmcm9tIEhPOCwgYnV0IGl0IG9ubHkgc2hvd3MgdmFyaWFibGVzIHdoZXJlIHRoZXJlIGlzIG1pc3NpbmcgZGF0YQoKIyMgcmV2aXNlZCB0aGlzIGZvciB2MiB0byB1c2UgVklNCiMgaW5zdGFsbC5wYWNrYWdlcygiVklNIikKbGlicmFyeShtaWNlKQpsaWJyYXJ5KFZJTSkKYWdnciA9IGFnZ3IobWxtX2J4NSwgY29sPW1kYygxOjIpLCBudW1iZXJzPVRSVUUsIHNvcnRWYXJzPVRSVUUsIGxhYmVscz1uYW1lcyhtbG1fYng1KSwgY2V4LmF4aXM9LjcsIGdhcD0zLCB5bGFiPWMoIlByb3BvcnRpb24gb2YgbWlzc2luZ25lc3MiLCJNaXNzaW5nbmVzcyBQYXR0ZXJuIikpCmBgYApPbmUgcGVyc29uIGlzIG1pc3NpbmcgcnMyMjU0Mjk4IGdlbm90eXBlIChgcnMyMjU0Mjk4YCBhbmQgYHJzMjI1NDI5OF9BLmNhcnJpZXJgKSwgd2hpY2ggd2UgYWxyZWFkeSBrbmV3IGFib3V0LiBObyBvbmUgZWxzZSBpcyBtaXNzaW5nIGRhdGEgb24gYW55IHZhcmlhYmxlLgoKIyMjIFNjYWxlIHJlbGlhYmlsaXRpZXMKVGhpcyBkYXRhc2V0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGl0ZW0tbGV2ZWwgZGF0YSwgYnV0IHdlIGNhbiBnZXQgdGhhdCBmcm9tIHRoZSBtYXN0ZXIgZGF0YXNldCB3ZSBsb2FkZWQgaW4gZWFybGllci4KYGBge3J9CmxpYnJhcnkocHN5Y2gpCm1sbV9zY2FsZXMgPC0gZmlsdGVyKG1hc3RlciwgIWdyZXBsKCJEMTQ5IixJRCkpCgojIyBCREkKbWxtX3RvdF9iZGkgPC0gc3Vic2V0KG1sbV9zY2FsZXMsIHNlbGVjdD1jKGJkaV8xYzpiZGlfMjFjKSkgIApwc3ljaDo6YWxwaGEobWxtX3RvdF9iZGkpICMgdXNlIHBzeWNoOjphbHBoYSBzbyBpdCBkb2Vzbid0IGNvbmZsaWN0IHcvZ2dwbG90J3MgYWxwaGEKCiMjIEJHUQptbG1fdG90X2JncSA8LSBzdWJzZXQobWxtX3NjYWxlcywgc2VsZWN0PWMoYmdxXzE6YmdxXzUpKQpwc3ljaDo6YWxwaGEobWxtX3RvdF9iZ3EpCgojIyBJQ0cKbWxtX3RvdF9pY2cgPC0gc3Vic2V0KG1sbV9zY2FsZXMsIHNlbGVjdD1jKGljZ18xOmljZ18xOSkpCnBzeWNoOjphbHBoYShtbG1fdG90X2ljZykKCiMjIFlTTAptbG1fdG90X3lzbCA8LSBzdWJzZXQobWxtX3NjYWxlcywgc2VsZWN0PWMoeXNsXzE6eXNsXzIxKSkKcHN5Y2g6OmFscGhhKG1sbV90b3RfeXNsKQoKIyMgRUNSUlMtZ2xvYmFsIGFueGlldHkKbWxtX3RvdF9lY3Jyc19nbG9iYWxfYW54IDwtIHN1YnNldChtbG1fc2NhbGVzLCAgc2VsZWN0PWMoZWNycnNfZ2xvYmFsXzdjOmVjcnJzX2dsb2JhbF85YykpCnBzeWNoOjphbHBoYShtbG1fdG90X2VjcnJzX2dsb2JhbF9hbngpCgojIyBFQ1JSUy1nbG9iYWwgYXZvaWQKbWxtX3RvdF9lY3Jyc19nbG9iYWxfYXZvaWQgPC0gc3Vic2V0KG1sbV9zY2FsZXMsICBzZWxlY3Q9YyhlY3Jyc19nbG9iYWxfMXI6ZWNycnNfZ2xvYmFsXzRyLCBlY3Jyc19nbG9iYWxfNWMsIGVjcnJzX2dsb2JhbF82YykpCnBzeWNoOjphbHBoYShtbG1fdG90X2VjcnJzX2dsb2JhbF9hdm9pZCkKCiMjIEVDUlJTLXNwb3VzZSBhbnhpZXR5Cm1sbV90b3RfZWNycnNfc3BvdXNlX2FueCA8LSBzdWJzZXQobWxtX3NjYWxlcywgIHNlbGVjdD1jKGVjcnJzX3Nwb3VzZV83YzplY3Jyc19zcG91c2VfOWMpKQpwc3ljaDo6YWxwaGEobWxtX3RvdF9lY3Jyc19zcG91c2VfYW54KQoKIyMgRUNSUlMtc3BvdXNlIGF2b2lkCm1sbV90b3RfZWNycnNfc3BvdXNlX2F2b2lkIDwtIHN1YnNldChtbG1fc2NhbGVzLCAgc2VsZWN0PWMoZWNycnNfc3BvdXNlXzFyOmVjcnJzX3Nwb3VzZV80ciwgZWNycnNfc3BvdXNlXzVjLCBlY3Jyc19zcG91c2VfNmMpKQpwc3ljaDo6YWxwaGEobWxtX3RvdF9lY3Jyc19zcG91c2VfYXZvaWQpCgpgYGAKQWxsIHJlbGlhYmlsaXRpZXMgbG9vayBnb29kIG9yIGV4Y2VsbGVudCAoYSA+PS44NikgZXhjZXB0IGZvciB0aGUgQnJpZWYgR3JpZWYgUXVlc3Rpb25uYWlyZSwgd2hlcmUgYSA9IC43Mi4gSXQncyBhIHNob3J0IHNjcmVlbmluZyBtZWFzdXJlIHdpdGggb25seSA3IGl0ZW1zLCBzbyBtYWtlcyBzZW5zZSB0aGF0IGl0cyByZWxpYWJpbGl0eSB3b3VsZCBiZSBsb3dlci4KCiMjIyBEcm9wIHRoZSA0IHBlb3BsZSB3aXRoIGxvdyB0cmlhbCBjb3VudHMKUmVjYWxsIHRoYXQgdGhlc2UgcGFydGljaXBhbnRzIGhhZCBiaWFzIHNjb3JlcyBvbiA8MTQlIG9mIHRyaWFscywgbGlrZWx5IGR1ZSB0byBmYWlsaW5nIHRvIHJldmVyc2UgdGhlIGluc3RydWN0aW9ucyBvbiBydW4gMi4KYGBge3J9CmRhdGEgPC0gZmlsdGVyKG1sbV9ieDUsICFncmVwbCgiRDEwMXxEMTQxfEQxNDd8RDE0OCIsSUQpKQp1bmlxdWUoZGF0YSRJRCkgIyBjaGVja2luZyB0aGF0IGl0IHdvcmtlZApgYGAKCiMjIE9MUyBlc3RpbWF0ZXMgZm9yIGV4cGxvcmF0b3J5IHB1cnBvc2VzCgpgYGB7cn0KIyBnZXR0aW5nIHJlZ3VsYXIgcmVncmVzc2lvbiBlc3RpbWF0ZXMgb25lIHBlcnNvbiBhdCBhIHRpbWUgZm9yIGV4cGxvcmF0b3J5IHB1cnBvc2VzOgpsbUVzdCA8LSBieShkYXRhLCBkYXRhJElELCBmdW5jdGlvbih4KSBzdW1tYXJ5KGxtKGJpYXNfdCB+IHRyaWFsbnVtLCBkYXRhPXgpKSkKbG1Fc3QKYGBgClBlb3BsZXMnIGludGVyY2VwdHMgZG8gbG9vayBmYWlybHkgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlci4uLgoKIyMjIFN0ZW0gcGxvdCBmb3IgdGhlIGludGVyY2VwdHMgYmFzZWQgb24gdGhlIE9MUyBlc3RpbWF0ZXMKYGBge3J9CmludCA8LSBieShkYXRhLCBkYXRhJElELCBmdW5jdGlvbih4KSBjb2VmZmljaWVudHMobG0oYmlhc190IH4gdHJpYWxudW0sIGRhdGE9eCkpW1sxXV0pCmludAoKc3VtbWFyeShpbnQpCnN0ZW0oaW50LCBzY2FsZT0yKQpoaXN0KGludCkKYGBgCiMjIyBTdGVtIHBsb3QgZm9yIHRoZSBzbG9wZXMgYmFzZWQgb24gdGhlIE9MUyBlc3RpbWF0ZXMKYGBge3J9CnNsb3BlIDwtIGJ5KGRhdGEsIGRhdGEkSUQsIGZ1bmN0aW9uKHgpIGNvZWZmaWNpZW50cyhsbShiaWFzX3QgfiB0cmlhbG51bSwgZGF0YT14KSlbWzJdXSkKc2xvcGUKCnN1bW1hcnkoc2xvcGUpCnN0ZW0oc2xvcGUsIHNjYWxlPTIpCmhpc3Qoc2xvcGUpCmBgYApOb3RlIHRoYXQgdGhlc2UgYXJlIGFsbCBleHRyZW1lbHkgY2xvc2UgdG8gemVybyAtIHByb2JhYmx5IGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgdGltZSBlZmZlY3QuCgojIyMgUi1zcXVhcmUgZm9yIE9MUyBtb2RlbHMKYGBge3J9Cgpyc3EgPC0gYnkoZGF0YSwgZGF0YSRJRCwgZnVuY3Rpb24oeCkgc3VtbWFyeShsbShiaWFzX3QgfiB0cmlhbG51bSwgZGF0YT14KSkkci5zcXVhcmVkKQpzdW1tYXJ5KHJzcSkKc3RlbShyc3EsIHNjYWxlPTIpCgpjb3IoaW50LCBzbG9wZSkKYGBgClRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGludGVyY2VwdHMgYW5kIHNsb3BlcyBpcyAtMC40NzUsIHNvIHBlb3BsZSB3aG8gc2hvdyBsZXNzIGF2b2lkYW5jZSBiaWFzIG92ZXJhbGwgY2hhbmdlIGxlc3Mgb3ZlciB0aGUgY291cnNlIG9mIHRoZSB0YXNrLgogCiMjIEdyYXBoaW5nIG11bHRpbGV2ZWwgZGF0YSBmb3IgZXhwbG9yYXRvcnkgcHVycG9zZXMKYGBge3J9CmxpYnJhcnkobGF0dGljZSkKeHlwbG90KGJpYXNfdCB+IHRyaWFsbnVtIHwgSUQsIGRhdGEgPSBkYXRhLCBhcy50YWJsZT1UKSAjIHRvbyBtYW55IHBlb3BsZS9oYXJkIHRvIHNlZSwgdHJ5IHJhbmRvbSBzdWJzZXQKCmlkcyA8LSBzYW1wbGUodW5pcXVlKGRhdGEkSUQpLCAxMikKaWRzCnRlbXAgPC0gZGF0YVtkYXRhJElEICVpbiUgaWRzLCBdCnh5cGxvdChiaWFzX3QgfiB0cmlhbG51bSB8IElELCBkYXRhID0gdGVtcCwgYXMudGFibGU9VCkgCgojIGFkZCBmaXQgbGluZShzKQp4eXBsb3QoYmlhc190IH4gdHJpYWxudW0gfCBJRCwgZGF0YSA9IHRlbXAsIHR5cGU9YygicCIsInIiKSkgIyBsaW5lYXIgZml0Cnh5cGxvdChiaWFzX3QgfiB0cmlhbG51bSB8IElELCBkYXRhID0gdGVtcCwgdHlwZT1jKCJwIiwic21vb3RoIikpICMgY3VydmlsaW5lYXIgZml0CgojIGdyYXBoIG9mIHRoZSByYXcgZGF0YSBmb3IgZWFjaCBwZXJzb24KaW50ZXJhY3Rpb24ucGxvdChkYXRhJHRyaWFsbnVtLCBkYXRhJElELCBkYXRhJGJpYXNfdCkKCiMgZ2VuZXJhdGUgbGluZWFyIGZpdHRlZCB2YWx1ZXMgZm9yIGVhY2ggcGVyc29uIGFuZCB0aGVuIHBsb3QgYWxsIHRvZ2V0aGVyIGluIG9uZSBwbG90CmZpdCA8LSBieShkYXRhLCBkYXRhJElELCBmdW5jdGlvbih4KSBmaXR0ZWQudmFsdWVzKGxtKGJpYXNfdCB+IHRyaWFsbnVtLCBkYXRhPXgpKSkKZml0MiA8LSB1bmxpc3QoZml0KQppbnRlcmFjdGlvbi5wbG90KGRhdGEkdHJpYWxudW0sIGRhdGEkSUQsIGZpdDIsIHhsYWI9InRyaWFsIG51bWJlciIsIHlsYWI9IlJUIGJpYXMgKHRyYW5zZm9ybWVkKSIpCmBgYApUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGVpdGhlciBhIGxpbmVhciBvciBjdXJ2aWxpbmVhciBlZmZlY3Qgb2YgdHJpYWwgbnVtYmVyIChpLmUuLCB0aW1lKSBvbiBSVCBiaWFzIGluIHRoZSB0YXNrLgoKCiMjIEFuYWx5c2VzIChOSFNUKQo8Y2VudGVyPjxpPlJlbWVtYmVyLCB0aGUgZWZmZWN0IG9mIHRpbWUgcmVmZXJzIHRvIGB0cmlhbG51bWJlcmAgKHRoaXMgaXMgTk9UIHRoZSBgdGltZWAgdmFyaWFibGU7IGB0aW1lYCByZWZlcnMgdG8gdGltZSBvZiBkYXkgd2hlbiB0YXNrIHdhcyBydW4uKTwvaT48L2NlbnRlcj4KClRoZSBkZXBlbmRlbnQgdmFyaWFibGUsIGBiaWFzX3RgLCBpcyB0aGUgbWVhc3VyZSBvZiByZWxhdGl2ZSBiZWhhdmlvcmFsIGFwcHJvYWNoL2F2b2lkYW5jZSBiaWFzLCBiYXNlZCBvbiByZWFjdGlvbiB0aW1lIHRvIHB1c2ggb3IgcHVsbCBhIGpveXN0aWNrIGluIHJlc3BvbnNlIHRvIHZhcmlvdXMgaW1hZ2VzLiBXZSB0cmFuc2Zvcm1lZCBpdCBiZWNhdXNlIGl0IHdhcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIGFuZCB1c2UgdGhlIHRyYW5zZm9ybWVkIHZhcmlhYmxlIGZvciBhbGwgYW5hbHlzZXMuCgojIyMgVW5jb25kaXRpb25hbCBtZWFucyBtb2RlbApgYGB7cn0KbGlicmFyeShubG1lKQoKIyB1bmNvbmRpdGlvbmFsIG1lYW5zIG1vZGVsCm0xIDwtIGxtZShiaWFzX3QgfiAxLCByYW5kb20gPSB+IDEgfCBJRCwgZGF0YT1kYXRhLCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtMSkKCiMgSUNDCmlWYXIgPC0gYXMubnVtZXJpYyhWYXJDb3JyKG0xKVsxLDFdKQpyZXNpZFZhciA8LSBhcy5udW1lcmljKFZhckNvcnIobTEpWzIsMV0pCmljYzEgPC0gaVZhci8oaVZhcityZXNpZFZhcikgCmljYzEKYGBgClRoZSBvdmVyYWxsIG1lYW4gYmlhcyBzY29yZSAodHJhbnNmb3JtZWQpIGlzIGFib3V0IC0wLjAwMiwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAwLjAyMy4KCklDQyBpcyBhYm91dCAxLjYlIG9mIHRoZSB2YXJpYW5jZS4gVGhpcyBtZWFucyB0aGF0IDEuNiUgb2YgdGhlIHZhcmlhbmNlIGluIGJpYXMgaXMgZXhwbGFpbmVkIGJ5IHBlb3BsZSBiZWluZyBkaWZmZXJlbnQgZnJvbSBvbmUgYW5vdGhlciwgd2hpbGUgdGhlIHJlbWFpbmRlciBpcyBleHBsYWluZWQgYnkuLi5zb21ldGhpbmcgZWxzZS4KCiMjIyBBZGQgZml4ZWQgYW5kIHJhbmRvbSBpbnRlcmNlcHQgYW5kIHNsb3BlIG9mIHRpbWUKYGBge3J9CiMgbW9kZWwgd2l0aCBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCBhbmQgc2xvcGUgb2YgdGltZSAoaW50ZXJjZXB0cyBpbXBsaWVkKQptMiA8LSBsbWUoYmlhc190IH4gdHJpYWxudW0sIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IHRyaWFsbnVtIHwgSUQsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG0yKSAKYW5vdmEobTIpCmBgYApUaGUgYXZlcmFnZSBiaWFzIGF0IHRyaWFsIG51bWJlciA9IDAgaXMgLTAuMDE2IGFuZCBnZXRzIGluY3JlYXNpbmdseSBhcHByb2FjaC1iaWFzZWQgYnkgYSBub25zaWduaWZpY2FudCBmcmFjdGlvbiBvZiBhIHBlcmNlbnQgd2l0aCBlYWNoIHVuaXQgb2YgdGltZS4gVGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHRyaWFsIG51bWJlciAodGltZSkgb24gUlQgYmlhcyBzY29yZSwgX3RfID0gMC43NCwgX3BfID0gMC40NTcuIAoKYGBge3J9CiMgSUNDCmlWYXIgPC0gYXMubnVtZXJpYyhWYXJDb3JyKG0yKVsxLDFdKQpyZXNpZFZhciA8LSBhcy5udW1lcmljKFZhckNvcnIobTIpWzIsMV0pCmljYzIgPC0gaVZhci8oaVZhcityZXNpZFZhcikKaWNjMgpgYGAKOTkuOTklIG9mIHZhcmlhbmNlIGluIGJpYXMgaXMgZHVlIHRvIHRoZSBiZXR3ZWVuLXBlcnNvbiB2YXJpYW5jZSwgYWZ0ZXIgY29udHJvbGxpbmcgZm9yIHRpbWUuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsYWNrIG9mIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHRpbWUuIAoKIyMjIEFkZGluZyBzdGltdWx1cyBhcyBhIGZpeGVkIGVmZmVjdApUaGVyZSB3ZXJlIDUgZGlmZmVyZW50IHR5cGVzIG9mIHN0aW11bGksIHByZXNlbnRlZCBpbiBhIHJhbmRvbWl6ZWQgb3JkZXIgKGNvbnNpc3RlbnQgYWNyb3NzIHBhcnRpY2lwYW50cy9zZXNzaW9ucykgZGV0ZXJtaW5lZCBieSBnZW5ldGljIGFsZ29yaXRobS4gRXZlcnlvbmUgc2F3IHRoZSBzYW1lIHN0aW11bGkgaW4gdGhlIHNhbWUgb3JkZXIsIHNvIGl0IGlzIGEgZml4ZWQgZWZmZWN0LiBUaGUgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgaW1hZ2VzIHdlcmU6IERlYXRoIChnZW5lcmljKSwgRGVjZWFzZWQgKHBlcnNvbmFsIHBob3RvKSwgT3RoZXIgbGl2aW5nIGxvdmVkIG9uZSAocGVyc29uYWwgcGhvdG8pLCBTdHJhbmdlciAoc2V4LW1hdGNoZWQgdG8gc3BvdXNlKSwgYW5kIE5ldXRyYWwgKG9iamVjdHMpLiBUaGUgZmFjdG9yIGBzdGltYCB3YXMgY3JlYXRlZCBzdWNoIHRoYXQgTmV1dHJhbCB3YXMgdGhlIHJlZmVyZW5jZSBsZXZlbC4KCmBgYHtyfQojIGFkZCB0aGUgZml4ZWQgZWZmZWN0IG9mIHN0aW0gYW5kIGNvbXBhcmUgaXRzIGZpdCB0byBtMiBieSBpbnNwZWN0aW5nIHRoZSB0IGFuZCBmIHRlc3RzCm0zIDwtIGxtZShiaWFzX3QgfiB0cmlhbG51bSArIHN0aW0sIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IHRyaWFsbnVtIHwgSUQsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG0zKQpgYGAKTk8gZWZmZWN0IG9mIHRpbWUuIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZml4ZWQgZWZmZWN0IG9mIHNwb3VzZSwgX3RfID0gMy41NSwgX3BfID0gLjAwMDQuIFRoZXJlIGlzIGFsc28gYSBub24tc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHN0cmFuZ2VyLCBfdF8gPSAtMS43MywgX3BfID0gLjA4NC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBwZW9wbGUgdGVuZGVkIHRvIHNob3cgbW9yZSBhcHByb2FjaCBiaWFzIHRvIHBob3RvcyBvZiB0aGVpciBzcG91c2UgKGFjcm9zcyBjb25kaXRpb25zKS4gVGhlIHBhcmFtZXRlciBlc3RpbWF0ZSBpcyAwLjEyIHdpdGggYW4gX1NFXyBvZiAwLjAzLiBUaGV5IGFsc28gdGVuZGVkIHRvIHNob3cgZ3JlYXRlciBtb3JlIGF2b2lkYW5jZSBiaWFzIHRvIHBob3RvcyBvZiB0aGUgc2V4LW1hdGNoZWQgc3RyYW5nZXIuCgpgYGB7cn0KaW50ZXJ2YWxzKG0zLCB3aGljaD0iZml4ZWQiKQpgYGAKOTUlIENJcyBkb24ndCBjcm9zcyB6ZXJvIGZvciBzcG91c2UsIGJ1dCBkbyBmb3IgYWxsIG90aGVyIHN0aW11bHVzIHR5cGVzLiBUaGlzIHN1cHBvcnRzIHRoZSBzaWduaWZpY2FudCBlZmZlY3Qgb2Ygc3BvdXNlIHN0aW11bGkgb24gcmVhY3Rpb24gdGltZSBiaWFzLgoKYGBge3J9CmlWYXIgPC0gYXMubnVtZXJpYyhWYXJDb3JyKG0zKVsxLDFdKQpyZXNpZFZhciA8LSBhcy5udW1lcmljKFZhckNvcnIobTMpWzIsMV0pCmljYzMgPC0gaVZhci8oaVZhcityZXNpZFZhcikKaWNjMyAjIFNhbWUgSUNDIGFzIG0yCmBgYApUaGUgSUNDIGlzIGlkZW50aWNhbCB0byB0aGF0IGluIG1vZGVsIDIuIAoKYGBge3J9CmFub3ZhKG0yLCBtMykgIyBjb21wYXJlIHRoaXMgbW9kZWwgd2l0aCB0aGUgZmlyc3Qgb25lCmBgYApDb21wYXJpbmcgdGhlIG1vZGVsIHdpdGggdGhlIGZpeGVkIGVmZmVjdCBvZiBzdGltdWx1cyAobTMpIHRvIHRoZSBtb2RlbCB3aXRob3V0IChtMiksIG0zIGlzIGJldHRlciAoX3BfIDwgLjAwMDEpIGFzIGV2aWRlbmNlZCBieSBsb3dlciBBSUMsIEJJQywgYW5kIGxMIHZhbHVlcy4KCiMjIyBUYWtlIG91dCBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdCBvZiB0aW1lCkJlY2F1c2UgdGhlcmUncyBubyBzaWduaWZpY2FudCBlZmZlY3Qgb2YgdGltZSwgbWFrZXMgc2Vuc2UgdG8gZHJvcCBpdCBmcm9tIHRoZSBtb2RlbC4gTm93IHdlJ3JlIGJhc2ljYWxseSBkb2luZyByZWdyZXNzaW9uIGJ1dCBhY2NvdW50aW5nIGZvciB3aGF0ZXZlciBpbnRlcmRlcGVuZGVuY2UgZXhpc3RzLiA8Zm9udCBjb2xvcj0icmVkIj5Ob3RlIHRoYXQgdGhlc2UgcmVzdWx0cyB3aWxsIF9OT1RfIG1hdGNoIHRoZSByZXN1bHRzIG9mIHRoZSByZWdyZXNzaW9ucywgYmVjYXVzZSB0aGUgcmVncmVzc2lvbnMgYXJlIGJhc2VkIG9uIGJpYXMgc2NvcmUgPHU+bWVkaWFuczwvdT4gYXMgdGhlIERWLCByYXRoZXIgdGhhbiBtZWFucy48L2ZvbnQ+CgpgYGB7cn0KIyB3aXRob3V0IGZpeGVkIG9yIHJhbmRvbSBlZmZlY3Qgb2YgdGltZSwgb25seSBmaXhlZCBlZmZlY3Qgb2Ygc3RpbXVsdXMKbTQgPC0gbG1lKGJpYXNfdCB+IHN0aW0sIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IDEgfCBJRCwgbWV0aG9kPSJNTCIpCnN1bW1hcnkobTQpCmBgYApGaXhlZCBlZmZlY3RzIGFyZSBzdGlsbCBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgLSBzaWduaWZpY2FudCBmb3Igc3BvdXNlLCBtYXJnaW5hbCBmb3Igc3RyYW5nZXIgLSBhbHRob3VnaCB0aGUgcGFyYW1ldGVyIGVzdGltYXRlcyBhbmQgdGVzdCBzdGF0aXN0aWNzIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQuCgpgYGB7cn0KaW50ZXJ2YWxzKG00LCB3aGljaD0iZml4ZWQiKQpgYGAKQXMgYWJvdmUsIHNwb3VzZSBpcyB0aGUgb25seSBzdGltdWx1cyBjYXRlZ29yeSB3aG9zZSA5NSBDSXMgZG9uJ3QgY3Jvc3MgemVybywgc3VwcG9ydGluZyBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiBzcG91c2Ugb24gYmlhcyAtIGluIHRoaXMgY2FzZSwgdmlld2luZyBzcG91c2UgaW1hZ2VzIHdhcyBhc3NvY2lhdGVkIHdpdGggYSByZWxhdGl2ZSBhcHByb2FjaCBiaWFzLgoKSXMgbTQgYW55IGJldHRlciB0aGFuIG0zPwpgYGB7cn0KYW5vdmEobTMsbTQpCmBgYApOb3BlLiBNb2RlbHMgZG8gbm90IHNpZ25pZmljYW50bHkgZGlmZmVyIChfcF8gPSAwLjg1MSksIHRob3VnaCB0aGUgQUlDIGFuZCBCSUMgdmFsdWVzIGFyZSBhIGxpdHRsZSBzbWFsbGVyIGZvciBtNCB0aGFuIG0zLiBTbyBsZXQncyBmb3JnZXQgdGltZSBhbmQgZ28gd2l0aCBtNC4uLgoKIyMjIEFkZGluZyBjb25kaXRpb24gYXMgYSBmaXhlZCBlZmZlY3QKUGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGUgdGFzayBhdCB0d28gZGlmZmVyZW50IHNlc3Npb25zLCB3aGVyZSB0aGV5IHdlcmUgcmFuZG9taXplZCB0byByZWNlaXZlIHRyZWF0bWVudCBBIGF0IG9uZSBhbmQgdHJlYXRtZW50IEIgYXQgdGhlIG90aGVyIChvcmRlciBjb3VudGVyYmFsYW5jZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuIFRoZSB0d28gdHJlYXRtZW50cyBhcmUgb3h5dG9jaW4gdnMuIHBsYWNlYm8uIApgYGB7cn0KIyBhZGQgdGhlIGludGVyYWN0aW9uIG9mIHN0aW0gYW5kIGNoZWNrIGl0cyBmaXQgYnkgaW5zcGVjdGluZyB0IGFuZCBmIHRlc3RzLiAKbTUgPC0gbG1lKGJpYXNfdCB+IHN0aW0gKyBjb25kLCBkYXRhID0gZGF0YSwgcmFuZG9tID0gfiAxIHwgSUQsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG01KQpgYGAKVGhlIGZpeGVkIGVmZmVjdCBvZiBjb25kaXRpb24gQiBpcyBub3Qgc2lnbmlmaWNhbnQsIF90XyA9IDAuMTUsIF9wXyA9IDAuODg0LgoKYGBge3J9CmFub3ZhKG00LCBtNSkKYGBgClRoZSB0d28gbW9kZWxzIGFyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQsIGJ1dCB0aGUgb25lIHdpdGggdGhlIGZpeGVkIGVmZmVjdCBvZiBjb25kaXRpb24gKG01KSBoYXMgc2xpZ2h0bHkgaGlnaGVyIEFJQy9CSUMuIE5vdCBjb21wZWxsaW5nIGVub3VnaCB0byBzZWxlY3QgdGhhdCBtb2RlbCBvdmVyIG00LCB0aG91Z2guCgojIyMgQWRkaW5nIHRoZSBzdGltdWx1cypjb25kaXRpb24gaW50ZXJhY3Rpb24KCldlIG1pZ2h0IGV4cGVjdCB0aGF0IHBlb3BsZXMnIHRlbmRlbmN5IHRvIGFwcHJvYWNoIG9yIGF2b2lkIG1pZ2h0IGRpZmZlciBkZXBlbmRpbmcgb24gd2hpY2ggdHJlYXRtZW50IHRoZXkgZ290LCBidXQgb25seSBmb3IgY2VydGFpbiBzdGltdWxpLgpgYGB7cn0KIyBhZGQgdGhlIGludGVyYWN0aW9uIG9mIHN0aW0gYW5kIGNoZWNrIGl0cyBmaXQgYnkgaW5zcGVjdGluZyB0IGFuZCBmIHRlc3RzLiAKbTYgPC0gbG1lKGJpYXNfdCB+IHN0aW0qY29uZCwgZGF0YSA9IGRhdGEsIHJhbmRvbSA9IH4gMSB8IElELCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtNikKaW50ZXJ2YWxzKG02KQpgYGAKSW50ZXJlc3RpbmcuIFdpdGggdGhlIGludGVyYWN0aW9uIGluIHRoZSBtb2RlbCwgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgZGVhdGggYW5kIHN0cmFuZ2VyIGJ1dCBub3Qgc3BvdXNlLiA5NSUgQ0lzIGluZGljYXRlIHRoYXQgdmlld2luZyB0aGUgZ2VuZXJpYyBkZWF0aCBhbmQgc3RyYW5nZXIgc3RpbXVsaSBhcmUgYm90aCBhc3NvY2lhdGVkIHdpdGggZ3JlYXRlciByZWxhdGl2ZSBhdm9pZGFuY2UgYmlhcy4gCgpgYGB7cn0KYW5vdmEobTYsbTQsbTUpCmBgYApUaGUgbW9kZWwgd2l0aCB0aGUgaW50ZXJhY3Rpb24gaW4gaXQgaXMgbm90IHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gZWl0aGVyIHRoZSBvbmUgd2l0aCBqdXN0IHRoZSBmaXhlZCBlZmZlY3Qgb2YgY29uZGl0aW9uIG9yIHdpdGggbm8gZWZmZWN0IG9mIGNvbmRpdGlvbiBhdCBhbGwsIHNvIG1ha2VzIHNlbnNlIHRvIGdvIHdpdGggdGhlIHNpbXBsZXN0IG1vZGVsIHdoaWNoIG9ubHkgaW5jbHVkZXMgc3RpbXVsdXMgYXMgYSBmaXhlZCBlZmZlY3QuCgojIyMgQWRkaW5nIG90aGVyIHBsYXVzaWJsZSBwcmVkaWN0b3JzClRoZXJlIGFyZSBhIGZldyBvdGhlciB2YXJpYWJsZXMgdGhhdCB3ZSBtaWdodCBleHBlY3QgdG8gaW1wYWN0IGFwcHJvYWNoL2F2b2lkYW5jZSBiaWFzLCBuYW1lbHkgZ3JpZWYgc2V2ZXJpdHksIE9YVFIgZ2Vub3R5cGUsIHRpbWUgc2luY2UgZGVhdGgsIGFuZCBhdHRhY2htZW50IHN0eWxlIChhdm9pZGFudCwgYW54aW91cykuIApgYGB7cn0KIyB1c2VkIGdyb3VwIG1lYW4gY2VudGVyZWQgc2NvcmVzIGZvciB0aGUgYWRkaXRpb25hbCB2YXJpYWJsZXMgZm9yIGludGVycHJldGFiaWxpdHkKbTcgPC0gbG1lKGJpYXNfdCB+IHN0aW0gKyByczUzNTc2X0EuY2FycmllciArIHJzMjI2ODQ5OF9DLmNhcnJpZXIgKyBnbWVhbl9lY3Jyc19zcG91c2VfYW54ICsgZ21lYW5fZWNycnNfc3BvdXNlX2F2b2lkICsgZ21lYW5fYWdlICsgZ21lYW5faWNnICsgZ21lYW5fdGltZXNpbmNlZGVhdGgsIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IDEgfCBJRCwgbWV0aG9kPSJNTCIpCnN1bW1hcnkobTcpCmFub3ZhKG00LG03KQpgYGAKTm9uZSBvZiB0aGUgYWRkZWQgZml4ZWQgZWZmZWN0cyBhcmUgc2lnbmlmaWNhbnQgaW4gdGhlIG5ldyBtb2RlbCwgYW5kIHRoZSBBSUMvQklDIHZhbHVlcyBhcmUgaGlnaGVyLCBzbyB0YWtlICdlbSBvdXQuIAoKIyMjIEZpbmFsIG1vZGVsCgpgYGB7cn0KIyB2YXJpYW5jZSBleHBsYWluZWQgYnkgdGhlIGVudGlyZSBtb2RlbCAKZml0dGVkIDwtIGZpdHRlZChtNCkKZGF0YSRmaXR0ZWQgPC0gYXMudmVjdG9yKGZpdHRlZCkKcnNxIDwtIGxtKGJpYXMgfiBmaXR0ZWQsIGRhdGE9ZGF0YSkgCnN1bW1hcnkocnNxKQpgYGAKQSBjYXNlIG9mIHNpZ25pZmljYW50LCBidXQgbm90IG1lYW5pbmdmdWw6IFRoZSBSPHN1cD4yPC9zdXA+IGZvciB0aGUgZW50aXJlIG1vZGVsIGlzIC4wMiwgaW5kaWNhdGluZyB0aGF0IDIlIG9mIHRoZSB2YXJpYW5jZSBpbiBiaWFzIGlzIGV4cGxhaW5lZCBieSB0aGUgbW9kZWwuIFNvIHRoaXMgbW9kZWwgaXMgbm90IHZlcnkgZ29vZCBhdCBwcmVkaWN0aW5nIGFwcHJvYWNoL2F2b2lkYW5jZSBiaWFzIGZyb20gdGhlIGZpeGVkIGVmZmVjdCBvZiBzdGltdWx1cyB3aXRoaW4gcGVyc29uLiBPaCB3ZWxsLgoKIyMjIENoZWNrIGZpbmFsIG1vZGVsIGFzc3VtcHRpb25zCgojIyMjQ2hlY2tpbmcgbm9ybWFsaXR5IG9mIHRoZSByZXNpZHVhbHMKYGBge3J9CiMgY2hlY2tpbmcgbm9ybWFsaXR5IG9mIHJlc2lkdWFscwoKIyBsZXZlbCAxOgpxcW5vcm0obTQsIH5yZXNpZCguKSwgaWQ9MC4wMDA3NSkKcGxvdChtNCwgcmVzaWQoLiwgdHlwZT0icCIpIH4gdHJpYWxudW0sIGlkPTAuMDAyNSkKYGBgClRoZSBRUSBwbG90IGxvb2tzIHByZXR0eSBva2F5LCBhbGJlaXQgYSBmZXcgb3V0bGllcnMuIEQxMTMgaXMgdGhlIHBlcnNvbiB3aG8gbW9zdCBmYWxscyBvZmYgdGhlIGxpbmUsIGFuZCBkb2VzIHNvIGF0IGJvdGggZW5kcy4gVGhlIHJlc2lkdWFscyBhcmUgYWxzbyBwcmV0dHkgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aW1lLCB0aG91Z2ggbWFueSBmYWxsIG91dHNpZGUgb2YgdGhlICsvLSAyIHJhbmdlLgoKYGBge3J9CiMgdGhlIGZvbGxvd2luZyBiaXQgd2FudHMgSURzIHRvIGJlIG51bWVyaWMsIHNvIHRha2Ugb3V0IHRoZSAiRCIgZnJvbSBlYWNoIElECmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKG51bUlEID0gYXMubnVtZXJpYyhzdHJfcmVwbGFjZShJRCwgIkQiLCAiIikpKQoKIyBsZXZlbCAyOgpxcW5vcm0obTQsIH5yYW5lZiguKSwgaWQ9MC4yNSkKcmFuSW50IDwtIHJhbmVmKG00KVsxXSAjIGNyZWF0ZSBvYmplY3Qgd2l0aCB0aGUgcmFuZG9tIGludGVyY2VwdCBlc3RpbWF0ZXMKcmFuSW50IDwtIHVubGlzdChyYW5JbnQpIApuYW1lcyhyYW5JbnQpIDwtIE5VTEwgCklEIDwtIHVubGlzdChzdWJzZXQoZGF0YSwgIWR1cGxpY2F0ZWQoZGF0YSRudW1JRCksIHNlbGVjdD0ibnVtSUQiKSkgIyBjcmVhdGUgYW4gSUQgdmFyaWFibGUKcGxvdChyYW5JbnQgfiBJRCkKCiMgcmFuU2xvcGUgPC0gcmFuZWYobTQpWzJdICMgY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSByYW5kb20gc2xvcGVzCiMgcmFuU2xvcGU8LSB1bmxpc3QocmFuU2xvcGUpIAojIG5hbWVzKHJhblNsb3BlKSA8LSBOVUxMIAojIHBsb3QocmFuU2xvcGUgfiBJRCkKCmBgYApHZXR0aW5nIGFuIGVycm9yIGhlcmUgZm9yIHRoZSByYW5kb20gc2xvcGVzIDxmb250IGNvbG9yPSJyZWQiPmBFcnJvciBpbiBbLmRhdGEuZnJhbWUocmFuZWYobTQpLCA3MikgOiB1bmRlZmluZWQgY29sdW1ucyBzZWxlY3RlZGA8L2ZvbnQ+LiBJIHRoaW5rIHRoaXMgbWF5IGJlIGJlY2F1c2UgSSBkb24ndCBoYXZlIGFueSByYW5kb20gc2xvcGVzLCBzaW5jZSBJIHRvb2sgdGltZSBvdXQgb2YgdGhlIG1vZGVsLiBJbmRlZWQsIHdoZW4gSSBnbyBpbnRvIGBtNGAsIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgc2Vjb25kIGVsZW1lbnQgZm9yIHRoZSBzbG9wZXMgZXhpc3RzLiBMZXQncyB0ZXN0IHRoaXMuLi4KCmBgYHtyfQojIHRlc3QgbXkgaHlwb3RoZXNpcywgdXNpbmcgbTMgKHdoZXJlIHRpbWUgd2FzIGluY2x1ZGVkIGFzIGEgcmFuZG9tIGVmZmVjdCkKcmFuSW50MSA8LSByYW5lZihtMylbMV0gIyBjcmVhdGUgb2JqZWN0IHdpdGggdGhlIHJhbmRvbSBpbnRlcmNlcHQgZXN0aW1hdGVzCnJhbkludDEgPC0gdW5saXN0KHJhbkludDEpIApuYW1lcyhyYW5JbnQxKSA8LSBOVUxMIApJRCA8LSB1bmxpc3Qoc3Vic2V0KGRhdGEsICFkdXBsaWNhdGVkKGRhdGEkbnVtSUQpLCBzZWxlY3Q9Im51bUlEIikpICMgY3JlYXRlIGFuIElEIHZhcmlhYmxlCnBsb3QocmFuSW50MSB+IElEKQoKcmFuU2xvcGUxIDwtIHJhbmVmKG0zKVsyXSAjIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgcmFuZG9tIHNsb3BlcwpyYW5TbG9wZTE8LSB1bmxpc3QocmFuU2xvcGUxKSAKbmFtZXMocmFuU2xvcGUxKSA8LSBOVUxMIApwbG90KHJhblNsb3BlMSB+IElEKQoKYGBgCk15IHN1c3BpY2lvbiB3YXMgY29ycmVjdDogdGhlIGVycm9yIG1lc3NhZ2UgYWJvdmUgaXMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gcmFuZG9tIHNsb3BlcyBmb3IgbXkgZmluYWwgbW9kZWwuCgojIyMjIENoZWNraW5nIGhvbW9zY2VkYXN0aWNpdHkKYGBge3J9CiMgY2hlY2tpbmcgaG9tb3NjZWRhc3RpY2l0eQoKIyBsZXZlbCAxOgpkYXRhJHJlc2lkIDwtIGFzLm51bWVyaWMocmVzaWR1YWxzKG00KSkgIyBjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIExldmVsLTEgcmVzaWR1YWxzCnBsb3QoZGF0YSRyZXNpZCB+IGRhdGEkc3RpbSkKCiMgbGV2ZWwgMjoKbGlicmFyeShsYXR0aWNlKQpzdGltIDwtIHVubGlzdChzdWJzZXQoZGF0YSwgIWR1cGxpY2F0ZWQoZGF0YSRudW1JRCksIHNlbGVjdD0ic3RpbSIpKQp4eXBsb3QocmFuSW50IH4gc3RpbSkKIyB4eXBsb3QocmFuU2xvcGUgfiBzdGltKSAtIG5vIHJhbmRvbSBzbG9wZXMgc28gZG9uJ3QgcnVuIHRoaXMKYGBgCk5vdGUgdGhhdCBhZ2FpbiB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVzaWR1YWxzIGZhbGxpbmcgb3V0c2lkZSBvZiB0aGUgKy8tMiByYW5nZS4KCkFsc28sIHRoZXJlJ3Mgc29tZXRoaW5nIHdlaXJkIGFib3V0IHRoZSBMMiBwbG90LiBOb3Qgc3VyZSB3aHkgaXQgc2hvd3Mgb25seSAzIG9mIDUgc3RpbXVsdXMgdHlwZXMuCgojIyBBbmFseXNlcyAoQmF5ZXNpYW4pCgojIyNVbmNvbmRpdGlvbmFsIG1lYW5zIG1vZGVsCkZpcnN0IHN0ZXAgaXMgdG8gbG9vayBhdCB0aGUgdW5jb25kaXRpb25hbCBtZWFucyBtb2RlbC4gV2Uga25vdyBmcm9tIHRoZSBleHBsb3JhdG9yeSBzdHVmZiBpbiBwcmV2aW91cyBzZWN0aW9ucyB0aGF0IGBiaWFzX3RgIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBzbyB3ZSBjYW4gdGVsbCBgYnJtc2AgdG8gdXNlIG5vcm1hbCBsaWtlbGlob29kIChHYXVzc2lhbikuCgpgYGB7cn0KbGlicmFyeShicm1zKQpzZXR3ZCgiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MiKQojIGIxTiA8LSBicm0oYmlhc190IH4gMSArICgxfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9Z2F1c3NpYW4oKSkgCiMgc2F2ZVJEUyhiMU4sICJ+L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MvbWxtX2FkYTFfYjFOLnJkcyIpCmIxTiA8LSByZWFkUkRTKCJtbG1fYWRhMV9iMU4ucmRzIikKc3VtbWFyeShiMU4pCgpgYGAKUmhhdCA9IDEgYWNyb3NzIHRoZSBib2FyZCwgc28gdGhhdCdzIGdvb2QuCgpgYGB7cn0KcGxvdChiMU4pICMgY2hlY2sgdHJhY2UgcGxvdHMKYGBgCkkgdGhpbmsgdGhlc2UgcGxvdHMgbG9vayBva2F5PyBiX0ludGVyY2VwdCBhbmQgU0RfSURfX0ludGVyY2VwdCBwbG90cyBhcmUgbm90IGV4YWN0bHkgb24gdG9wIG9mIGVhY2ggb3RoZXIsIGJ1dCBkbyBoYXZlIGEgbG90IG9mIG92ZXJsYXAgaW4gdGhlaXIgZGlzdHJpYnV0aW9ucy4KCmBgYHtyfQpwcF9jaGVjayhiMU4sIG5zYW1wbGVzPTIwKSAgIyBwb3N0ZXJpb3IgcHJlZGljdGl2ZSBjaGVjayB1c2luZyBub3JtYWwgbGlrZWxpaG9vZApwcF9jaGVjayhiMU4sIHR5cGU9ImVycm9yX2hpc3QiLCBuc2FtcGxlcz0yMCwgYmlud2lkdGg9MSkgIyBlcnJvciBoaXN0b2dyYW0gKGhpc3RvZ3JhbSBvZiBwcmVkaWN0aW9uIHJlc2lkdWFscykKYGBgClRoZSBvYnNlcnZlZCBkaXN0cmlidXRpb24gaXMgYSB2ZXJ5IGdvb2QgZml0IHRvIHRoZSBwcmVkaWN0ZWQgZGF0YSAoYmFzZWQgb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24pLgpUaGUgZXJyb3IgaGlzdG9ncmFtIGFsc28gc2hvd3MgdGhhdCByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFyb3VuZCAwLiBTZWUgW3RoaXMgcGFnZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2JheWVzcGxvdC92aWduZXR0ZXMvZ3JhcGhpY2FsLXBwY3MuaHRtbCkgZm9yIHNvbWUgaGVscGZ1bCBkb2N1bWVudGF0aW9uLgoKYGBge3J9CiMgY2hlY2sgSUNDIHRvIGdldCBzZW5zZSBvZiBob3cgdmFyaWFuY2UgaXMgZGlzdHJpYnV0ZWQgYmV0d2Vlbi0gYW5kIHdpdGhpbi0gcGVvcGxlCmlTZCA8LSBhcy5udW1lcmljKHN1bW1hcnkoYjFOKSRyYW5kb20kSURbMSwxXSkgIyBmaW5kcyAxc3Qgcm93LCAxc3QgY29sdW1uIG9mIHJhbmRvbSBlZmZlY3RzIGluc2lkZSB0aGUgc3VtbWFyeSBvZiBiMU4KaVZhciA8LSBpU2ReMgpyZXNpZFNkIDwtIGFzLm51bWVyaWMoc3VtbWFyeShiMU4pJHNwZWNfcGFyc1tbMSwxXV0pCnJlc2lkVmFyIDwtIHJlc2lkU2ReMgppY2MxIDwtIGlWYXIvKGlWYXIrcmVzaWRWYXIpIAppY2MxICMgdGhpcyBpcyB0aGUgdW5jb25kaXRpb25hbCBncm93dGggbW9kZWwgLSBqdXN0IGhhcHBlbnMgaW4gdGhpcyBkYXRhc2V0IHRoYXQgaXQncyBhIG51aXNhbmNlIG1vZGVsCmBgYApGb3IgdGhlIHVuY29uZGl0aW9uYWwgZ3Jvd3RoIG1vZGVsLCB0aGUgSUNDIGlzIDAuMDE3LCBtZWFuaW5nIHRoYXQgb25seSBhYm91dCAyJSBvZiB0aGUgdmFyaWFuY2UgaW4gYmlhcyBpcyBiZWNhdXNlIHBlb3BsZSBvbiBhdmVyYWdlIHBlcmZvcm0gZGlmZmVyZW50bHkgZnJvbSBlYWNoIG90aGVyIG9uIHRoZSB0YXNrLgoKIyMjIFRpbWUgYXMgZml4ZWQgYW5kIHJhbmRvbSBlZmZlY3QKYGBge3J9CiMjIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0aW1lIGFzIGEgY29udHJvbCB2YXJpYWJsZQojIGIyIDwtIGJybShiaWFzX3QgfiAxICsgdHJpYWxudW0gKyAoMSArIHRyaWFsbnVtfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSwgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhID0gLjk1KSkKIyBzYXZlUkRTKGIyLCAibWxtX2FkYTFfYjIucmRzIikKYjIgPC0gcmVhZFJEUygibWxtX2FkYTFfYjIucmRzIikKc3VtbWFyeShiMikgCmBgYAo8aT5Ob3RlOiBFc3RpbWF0ZSA9IG1lYW4gb2YgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycy48L2k+CgoqKkdyb3VwLWxldmVsIGVmZmVjdHMqKjoKV2hlbiB0cmlhbG51bSBpcyAwLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBpbnRlcmNlcHRzIGlzIDAuMTIuClRoZXJlIGlzIG5vIHJhbmRvbSBlZmZlY3Qgb2YgdGltZTogdGhlIHNsb3BlcyBhcmUgbm90IGF0IGFsbCB2YXJpYWJsZSAocGVvcGxlIGFyZSBub3QgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlcikuClplcm8gaXMgYSBjcmVkaWJsZSB2YWx1ZSBmb3IgdGhlIGNvcnJlbGF0aW9uLCBiZWNhdXNlIHRoZSA5NSUgQ0lzIChjcmVkaWJsZSBpbnRlcnZhbHMpIGNyb3NzIHplcm8uCgpOb3RlIHRoYXQgUmhhdCBmb3Igc2QodHJpYWxudW0pIGluIHRoZSByYW5kb20gZWZmZWN0cyBpcyAxLjAxLiBQZXIgdGhlIFticm1zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsLWJ1ZXJrbmVyL2JybXMpLCB0aGlzIGRvZXMgbm90IHNlZW0gdG8gaW5kaWNhdGUgYSBjb252ZXJnZW5jZSBpc3N1ZSBkdWUgdG8gbGFjayBvZiBlcnJvciBtZXNzYWdlcyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgUmhhdCBmb3IgdGhlIGdyb3VwLWxldmVsIGVmZmVjdCBpbiB0aGVpciBleGFtcGxlIGlzIDEuMDE6IDxpPiJJZiAnUmhhdCcgaXMgY29uc2lkZXJhYmx5IGdyZWF0ZXIgdGhhbiAxLCB0aGUgYWxnb3JpdGhtIGhhcyBub3QgeWV0IGNvbnZlcmdlZCBhbmQgaXQgaXMgbmVjZXNzYXJ5IHRvIHJ1biBtb3JlIGl0ZXJhdGlvbnMgYW5kIC8gb3Igc2V0IHN0cm9uZ2VyIHByaW9ycy48L2k+IiBIb3dldmVyLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgSSB3b3VsZCBwcm9iYWJseSB3YW50IHRvIHJ1biBpdCBhZ2FpbiB3aXRoIGEgaGlnaGVyIG51bWJlciBvZiBpdGVyYXRpb25zIG9yIHN0cm9uZ2VyIHByaW9ycy4KCioqUG9wdWxhdGlvbi1sZXZlbCBlZmZlY3RzKio6ClRoZXJlIGlzIG5vIGZpeGVkIGVmZmVjdCBvZiB0aW1lLCBlaXRoZXIsIGdpdmVuIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBDSSBsaW1pdHMgYXJlIC0wLjAsIDAuMC4KCmBgYHtyfQpwbG90KGIyKQpgYGAKU0RfSURfX3RyaWFsbnVtIGFuZCBjb3JfSURfX0ludGVyY2VwdF9fdHJpYWxudW0gYXJlIHRvdGFsbHkgc2tld2VkLgpgYGB7cn0KcHBfY2hlY2soYjIsIG5zYW1wbGVzPTIwKQpwcF9jaGVjayhiMiwgdHlwZT0iZXJyb3JfaGlzdCIsIG5zYW1wbGVzPTIwLCBiaW53aWR0aD0xKSAKYGBgCkFnYWluLCB0aGUgdHJhY2UgcGxvdCBzaG93cyB0aGF0IHRoZSBvYnNlcnZlZCBkaXN0cmlidXRpb24gaXMgYSB2ZXJ5IGdvb2QgZml0IHRvIHRoZSBwcmVkaWN0ZWQgZGF0YSBiYXNlZCBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4KVGhlIGVycm9yIGhpc3RvZ3JhbSBhbHNvIHNob3dzIHRoYXQgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBhcm91bmQgMC4gCgpgYGB7cn0KIyBpZiB5b3UgZ2V0IHRoZSBlcnJvciBtZXNzYWdlCiMjIEVycm9yIGluIChmdW5jdGlvbiAod2hpY2ggPSBkZXYuY3VyKCkpICA6IAojIyAgIGNhbm5vdCBzaHV0IGRvd24gZGV2aWNlIDEgKHRoZSBudWxsIGRldmljZSkKCiMgcnVuIGRldi5zZXQoZGV2Lm5leHQoKSkgYSBmZXcgdGltZXMgdW50aWwgaXQgcmV0dXJucyBzb21ldGhpbmcgbGlrZQojIyA+IGRldi5zZXQoZGV2Lm5leHQoKSkKIyMgcXVhcnR6X29mZl9zY3JlZW4gCiMjICAgICAgICAgICAgICAgIDQgCmBgYAoKX1NLSVBQSU5HIFRIRSBDSFVOSyBCRUxPVy4uLl8KSSBjYW4ndCBnZXQgc2pzdGF0cyB0byBpbnN0YWxsIChpc3N1ZSB3aXRoIHRoZSBzcGVjaWZpYyBUTUIgcGFja2FnZSB2ZXJzaW9uLSBmcmVha2luZyBkZXBlbmRlbmNpZXMgYXJlIHRoZSBiYW5lIG9mIG15IGV4aXN0ZW5jZSB3aXRoIGFsbCB0aGVzZSBkaWZmZXJlbnQgcGFja2FnZXMpLCBhbmQgbm8gcG9pbnQgaW4gcnVubmluZyBjcm9zcyB2YWxpZGF0aW9uIG9uIGEgbW9kZWwgdGhhdCB3ZSdyZSBnb2luZyB0byBkcm9wIGFueXdheSBkdWUgdG8gbGFjayBvZiBib3RoIGZpeGVkL3JhbmRvbSBlZmZlY3RzIG9mIHRpbWUuCgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzanN0YXRzIikKIyBsaWJyYXJ5KHNqc3RhdHMpCiMgZXF1aV90ZXN0KGIyKSAjIGlzIHRoZXJlIGEgZml4ZWQgZWZmZWN0PwojIHdhaWMoYjFOLCBiMikgIyBkb2VzIFdBSUMgdGhpbmsgd2Ugc2hvdWxkIGtlZXAgdGltZT8gSWYgc28sIGdpdmVuIHRoZXJlIGlzIG5vIGZpeGVkIGVmZmVjdCwgdGhpcyBpcyBkdWUgdG8gdGhlIHJhbmRvbSBlZmZlY3QgYWNjb3VudGluZyBmb3IgdmFyaWFuY2UuCgojIGIxIDwtIGFkZF9pYyhiMSwgaWM9IlIyIikKIyBiMiA8LSBhZGRfaWMoYjIsIGljPSJSMiIpIAojIG1lYW4oYjEkUjIpCiMgbWVhbihiMiRSMikgIyBkb2VzIFIyIHRoaW5rcyB3ZSBzaG91bGQga2VlcCB0aW1lPyAKCiMga2ZvbGQoYjFTTiwgYjIsIEs9MTApICMgdXNlIENWIHRvIGNoZWNrIGZvciBvdmVyLWZpdHRpbmcKIyB0aGlzIHRha2VzIHRvbyBsb25nLCBzbyByZWR1Y2Ugbihmb2xkcykgb3Igb25seSBwZXJmb3JtIGZvciBmaW5hbCBtb2RlbApgYGAKCiMjIyBGaXhlZCBlZmZlY3Qgb2Ygc3RpbXVsdXMKYGBge3J9CiMgYjMgPC0gYnJtKGJpYXNfdCB+IDEgKyBzdGltICsgKDEgfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSwgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhID0gLjk1KSkKIyBzYXZlUkRTKGIzLCAibWxtX2FkYTFfYjMucmRzIikKYjMgPC0gcmVhZFJEUygibWxtX2FkYTFfYjMucmRzIikKc3VtbWFyeShiMykgCmBgYApTaW1pbGFyIHRvIHRoZSByZXN1bHRzIG9mIHRoZSBOSFNUIGFuYWx5c2lzLCB0aGVyZSBpcyBhIG5vdGFibGUgZml4ZWQgZWZmZWN0IG9mIHNwb3VzZSAoZXN0aW1hdGUgPSAwLjEyLCBlc3QuIGVycm9yID0gMC4wMywgOTUlIENJWzAuMDUsMC4xOF0pIG9uIGJpYXMsIHN1Y2ggdGhhdCBwZW9wbGUgc2hvdyBtb3JlIGFwcHJvYWNoIGJpYXMgb24gdHJpYWxzIHdoZXJlIHRoZSBzdGltdWx1cyBpcyB0aGVpciBzcG91c2UuCgpgYGB7cn0KcGxvdChiMykKbWFyZ2luYWxfZWZmZWN0cyhiMykKYGBgClRoZSBoaWdoIGRlbnNpdHkgaW50ZXJ2YWxzIGlsbHVzdHJhdGUgdGhlIHBvc2l0aXZlIGVmZmVjdCBvZiBzcG91c2Ugb24gYmlhcywgd2hpY2ggd2UgYWxzbyBzZWUgaW4gdGhlIG1hcmdpbmFsIGVmZmVjdHMgcGxvdC4gSW4gdGhlIGFuYWx5c2lzIGFib3ZlLCB0aGUgOTUlIENJIGZvciBkZWF0aCBhbmQgc3RyYW5nZXIgc3RpbXVsaSBiYXJlbHkgY3Jvc3NlZCB6ZXJvLCB3aGljaCBjb3JyZXNwb25kcyB3aXRoIHdoYXQgd2Ugc2VlIGluIHRoZSBtYXJnaW5hbCBlZmZlY3RzIHBsb3QsIHdoZXJlIHRoZSB1cHBlciBsaW1pdCBvZiB0aGUgZXJyb3IgYmFyIGlzIHZlcnkgY2xvc2UgdG8gemVybyAob3IgYmVsb3cpLiBUaGlzIGFsc28gY29ycmVzcG9uZHMgd2l0aCB0aGUgZWZmZWN0cyB3ZSBzYXcgaW4gTkhTVCwgd2hlcmUgdGhlcmUgd2VyZSBzaWduaWZpY2FudCBvciBtYXJnaW5hbGx5IHNpZ25pZmljYW50IGVmZmVjdHMgb2YgZGVhdGggYW5kIHN0cmFuZ2VyIGluIGFkZGl0aW9uIHRvIHNwb3VzZS4KCmBgYHtyfQpwcF9jaGVjayhiMywgbnNhbXBsZXM9MjApCnBwX2NoZWNrKGIzLCB0eXBlPSJlcnJvcl9oaXN0IiwgbnNhbXBsZXM9MjAsIGJpbndpZHRoPTEpICMgbG9va3MgbGlrZSB3ZSBoYXZlIGltcHJvdmVkIHRoZSByZXNpZHVhbHM7IGlmIHdlIHJlcnVuIHRoaXMgcmFuZG9tIHNhbXBsaW5nIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHRpbWUgd2Ugbm8gbG9uZ2VyIHNlZSB0aGUgbG93ZXIgZW5kIG91dGxpZXJzCiMgZXF1aV90ZXN0KGIzKSAjIFRSWSBUSElTIENPREUgV0hFTiBJIEdFVCBTSlRPT0xTIFRPIElOU1RBTEwgKHdoYXQgZG9lcyBST1BFIHRlbGxzIHVzIGFib3V0IHRoZSBzaXplIG9mIGVmZmVjdD8pCiMgd2FpYyhiMiwgYjMpICMgVFJZIFRISVMgQ09ERSBXSEVOIEkgR0VUIFNKVE9PTFMgVE8gSU5TVEFMTApgYGAKCmBgYHtyfQpiMiA8LSBhZGRfaWMoYjIsIGljPSJSMiIpIApiMyA8LSBhZGRfaWMoYjMsIGljPSJSMiIpIApyb3VuZChtZWFuKGIyJFIyKSwgZGlnaXRzPTMpCnJvdW5kKG1lYW4oYjMkUjIpLCBkaWdpdHM9MykKYGBgCkluIGJvdGggbW9kZWxzLCB3ZSBoYXZlIGV4cGxhaW5lZCBhYm91dCAyIHBlcmNlbnQgb2YgdGhlIHZhcmlhbmNlICgxLjclIHZzLiAyLjAlKS4KCiMjIyBBZGRpbmcgdGhlIHN0aW11bHVzKmNvbmRpdGlvbiBpbnRlcmFjdGlvbiAobm8gdGltZSkKCk9uZSBvZiB0aGUgb3JpZ2luYWwgc3R1ZHkgaHlwb3RoZXNlcyB3YXMgdGhhdCB0aGVyZSB3b3VsZCBiZSBhbiBpbnRlcmFjdGlvbiAoYWN0dWFsbHksIGEgMy13YXkgaW50ZXJhY3Rpb24gd2l0aCBncm91cCwgYnV0IG5vdCBnb2luZyB0byBnbyB0aGVyZSBmb3IgQURBICMxOyBhbHNvIHdlIG1heSBiZSB1bmRlcnBvd2VyZWQgZm9yIHRoYXQpIGJldHdlZW4gc3RpbXVsdXMgYW5kIGNvbmRpdGlvbiwgc3VjaCB0aGF0IHBlb3BsZSBtaWdodCBkaXNwbGF5IGRpZmZlcmVudCByZXNwb25zZSBiaWFzZXMgZm9yIGRpZmZlcmVudCBzdGltdWx1cyBjYXRlZ29yaWVzIGluIGNvbmRpdGlvbiBBIHZzLiBCLCBvciB2aWNlIHZlcnNhLgoKYGBge3J9CiMgYjQgPC0gYnJtKGJpYXNfdCB+IDEgKyBzdGltKmNvbmQgKyAoMXxJRCksIGRhdGE9ZGF0YSwgZmFtaWx5PXNrZXdfbm9ybWFsKCksIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YSA9IC45NSkpCiMgc2F2ZVJEUyhiNCwgIm1sbV9hZGExX2I0LnJkcyIpCmI0IDwtIHJlYWRSRFMoIm1sbV9hZGExX2I0LnJkcyIpCnN1bW1hcnkoYjQpIApgYGAKR290IHNvbWUgd2FybmluZ3Mgd2hpbGUgcnVubmluZzoKCmBSZWplY3RpbmcgaW5pdGlhbCB2YWx1ZTpgCiAgYEdyYWRpZW50IGV2YWx1YXRlZCBhdCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBub3QgZmluaXRlLmAKICBgU3RhbiBjYW4ndCBzdGFydCBzYW1wbGluZyBmcm9tIHRoaXMgaW5pdGlhbCB2YWx1ZS5gCmBSZWplY3RpbmcgaW5pdGlhbCB2YWx1ZTpgCiAgYExvZyBwcm9iYWJpbGl0eSBldmFsdWF0ZXMgdG8gbG9nKDApLCBpLmUuIG5lZ2F0aXZlIGluZmluaXR5LmAKICBgU3RhbiBjYW4ndCBzdGFydCBzYW1wbGluZyBmcm9tIHRoaXMgaW5pdGlhbCB2YWx1ZS5gCiAgCkFwcGFyZW50bHkgc2V0dGluZyBwcmlvcnMgbWF5IGhlbHAgd2l0aCB0aGlzLgoKSGVyZSwgd2Ugc2VlIG5vdGFibGUgZWZmZWN0cyBvZiBkZWF0aCBhbmQgc3RyYW5nZXIgc3RpbXVsaSwgYnV0IG5vdCBjb25kaXRpb24gbm9yIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHN0aW11bHVzIHR5cGUuCiAgCmBgYHtyfQpwbG90KGI0KQptYXJnaW5hbF9lZmZlY3RzKGI0KSAKCnBwX2NoZWNrKGI0LCBuc2FtcGxlcz0yMCkKcHBfY2hlY2soYjQsIHR5cGU9ImVycm9yX2hpc3QiLCBuc2FtcGxlcz0yMCwgYmlud2lkdGg9MSkgIyByZXNpZHVhbHMgc2VlbSBhYm91dCB0aGUgc2FtZQojIGVxdWlfdGVzdChiNCkgCmBgYApOb3RoaW5nIHRlcnJpYmx5IG5ldyBoZXJlLCBleGNlcHQgZm9yIHRoZSBtYXJnaW5hbCBlZmZlY3RzLiBMb29raW5nIGF0IHRoZSBwbG90IGZvciBgc3RpbWAsIHRoZSBkaXN0cmlidXRpb25zIGZvciBzcG91c2UgYW5kIHN0cmFuZ2VyIGFuZCBzcG91c2UgYW5kIGRlYXRoIGRvbid0IHNlZW0gdG8gb3ZlcmxhcCwgYW5kIGxpdmluZyBsb3ZlZCBvbmUgYW5kIGRlYXRoIGp1c3QgYmFyZWx5IG92ZXJsYXAuIFVuc3VycHJpc2luZ2x5LCBwZW9wbGUgdGVuZCB0byBzaG93IG1vcmUgYXBwcm9hY2ggYmlhcyBmb3Igc3BvdXNlIGFuZCBsaXZpbmcgbG92ZWQgb25lIHBob3RvcyBjb21wYXJlZCB0byBkZWF0aCBhbmQgc3RyYW5nZXIgcGhvdG9zLiBUaGUgdGhpcmQgbWFyZ2luYWwgZWZmZWN0cyBwbG90IGlsbHVzdHJhdGVzIHRoZSBsYWNrIG9mIGNvbmRpdGlvbiBvciBzdGltdWx1cypjb25kaXRpb24gaW50ZXJhY3Rpb24gZWZmZWN0cy4KYGBge3J9CmI0IDwtIGFkZF9pYyhiNCwgaWM9IlIyIikgCnJvdW5kKG1lYW4oYjMkUjIpLCBkaWdpdHM9MykKcm91bmQobWVhbihiNCRSMiksIGRpZ2l0cz0zKQpgYGAKVGhlIHZhcmlhbmNlIGFjY291bnRlZCBmb3Igc2hvd3MgYSBuZWdsaWdhYmxlIGluY3JlYXNlIHdpdGggdGhlIHN0aW11bHVzKmNvbmRpdGlvbiBpbnRlcmFjdGlvbiBpbiB0aGUgbW9kZWwgKGdvZXMgZnJvbSAwLjAyMCB0byAwLjAyMikuIFRoZSBuZWdsaWdhYmxlIGVmZmVjdCBpcyBzaG93biBpbiB0aGUgcGxvdCAtIG5vdGUgbm8gcmVhbCBkaWZmZXJlbmNlcwoKIyMjIFVzaW5nIHByaW9ycwpgYGB7cn0KIyBGaXJzdCBmaW5kIG91dCB3aGF0IGRlZmF1bHQgcHJpb3JzIGFyZS4gCmRhdGEgPC0gZmlsdGVyKG1sbV9ieDUsICFncmVwbCgiRDEwMXxEMTQxfEQxNDd8RDE0OCIsSUQpKQpnZXRfcHJpb3IoYmlhc190IH4gMSArIHN0aW0qY29uZCArICgxfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSkKYGBgCmBicm1zYCBoYXMgc2V0IHNvbWUgd2Vha2x5IGluZm9ybWF0aXZlIGRlZmF1bHQgcHJpb3JzIG9uIHNvbWUgb2YgdGhlIHNwZWNpYWwgcGFyYW1ldGVycy4gVGhlIGRlZmF1bHQgZm9yIHRoZSByYW5kb20gY29lZmZpY2llbnRzIGlzIGEgaGFsZiBzdHVkZW50LXQgd2l0aCAzIGRlZ3JlZXMgb2YgZnJlZWRvbS4KCkxldCdzIGFzc3VtZSBzb21lIHdlYWsgcHJpb3Iga25vd2xlZGdlIGZyb20gcHJldmlvdXMgcmVzZWFyY2guIEl0IHdvdWxkIGFjdHVhbGx5IGJlIHNvbWV3aGF0IGRpZmZpY3VsdCB0byBnZXQgc29saWQgcHJpb3JzIGZyb20gcHJldmlvdXMgcmVzZWFyY2ggb24gdGhpcyB0YXNrLCBnaXZlbiB0aGF0IG5vIHByZXZpb3VzIHdvcmsgaGFzIHVzZWQgdGhpcyBzcGVjaWZpYyB2YXJpYW50IGluIHRoaXMgcG9wdWxhdGlvbiB3aXRoIHRoaXMgc3BlY2lmaWMgbWFuaXB1bGF0aW9uIChpLmUuLCBveHl0b2NpbiB2cy4gcGxhY2Vibykgc28gSSdtIG1ha2luZyB0aGVzZSBudW1iZXJzIHVwLgpgYGB7cn0KIyBMZXQncyBhc3N1bWUgcHJpb3Igc3R1ZGllcyBoYXZlIGZvdW5kIHRoZSBmb2xsb3dpbmcgc2xvcGUgZXN0aW1hdGVzOgojIHN0aW11bHVzIH4gLjAzICguMDEpCiMgY29uZGl0aW9uIH4gLS4wMyAoLjAxKQoKIyBmb3Igd2Vhaywgd2UgdXNlIG5vcm1hbHMgd2l0aCBtZWFucyBmcm9tIHByaW9yIHdvcmsgYW5kIFNEcyBjaG9zZW4gdG8gY3JlYXRlIGEgd2VhayBwZWFrIChJIGdvdCB0aGVzZSBieSBwbGF5aW5nIHdpdGggdmlzdWFsaXphdGlvbnMgLSB0aGV5IGFsbCBhcmUgc2ltaWxhciBnaXZlbiB0aGUgZXN0aW1hdGVzIGZyb20gcHJpb3Igd29yayAtIGUuZy4sIGFsbCBlZmZlY3RzIHdlcmUgc21hbGxlciB0aGFuIG9uZSB3aXRoIFNEcyBjaXJjYSAuMDEtLjE1KQoKIyB2aXN1YWxpemluZyB0byBnZXQgYXBwcm9wcmlhdGUgd2VhayBhbmQgc3Ryb25nIFNEcwp4IDwtIHNlcSgtMSwgMSwgLjEpICMgY3JlYXRlIHNlcXVlbmNlIGZvciB4LWF4aXMgCnBsb3QoeCwgZG5vcm0oeCwgbWVhbj0gLjIwLCBzZD0uNyksIHR5cGU9ImwiLCB5bGltPWMoMCwxKSkgCgpwV2VhayA8LSBjKHNldF9wcmlvcigibm9ybWFsKC4wMywgLjcpIiwgY2xhc3M9ImIiLCBjb2VmPSJzdGltIiksCgkJCXNldF9wcmlvcigibm9ybWFsKC0uMDMsIC43KSIsIGNsYXNzPSJiIiwgY29lZj0iY29uZCIpKQoKIyBiNSA8LSBicm0oYmlhc190IH4gMSArIHN0aW0qY29uZCArICgxfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSwgcHJpb3IgPSBwV2VhaywgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhID0gLjk1KSkKIyBzYXZlUkRTKGI1LCAibWxtX2FkYTFfYjUucmRzIikKIyBiNSA8LSByZWFkUkRTKCJtbG1fYWRhMV9iNS5yZHMiKQojc3VtbWFyeShiNSkKI3Bsb3QoYjUpCiNtYXJnaW5hbF9lZmZlY3RzKGI1KQpgYGAKQmFzZWQgb24gdGhlIGVycm9yIG1lc3NhZ2UgaGVyZSAoPGZvbnQgY29sb3I9InJlZCI+VGhlIGZvbGxvd2luZyBwcmlvcnMgZG8gbm90IGNvcnJlc3BvbmQgdG8gYW55IG1vZGVsIHBhcmFtZXRlci4uLjwvZm9udD4pLCBJIGNsZWFybHkgaGF2ZSBubyBpZGVhIHdoYXQgSSdtIGRvaW5nIGFuZCBuZWVkIHRvIGdvIGJhY2sgdG8gdGhhdCBsZXNzb24gKGBnZXRfcHJpb3JgIHdhcyBub3QgaGVscGZ1bCB0byBtZSwgYnV0IHRoYW5rcyBhbnl3YXksIGJybXMpLg==