Experimental Logic

The Blind Men and the Elephant

A group of blind men were traveling together, and on their trip they encounter a strange object in their path. Each blind man feels a different part of object. They then describe the object based on their partial experience. One man cries out, “it must a think branch of a tree”, say the man feeling the trunk of the elephant. “No”, says the other man, “it must be a pillar”, as he was feeling the thick leg of the elephant. The third man says, “you are both wrong, it is clearly some sort of fan”, as he feels the ear of the elephant. Of course one person must be right and the others are fools. So they beat each other up and the correct person is the one left standing! However, the elephant grows irritated with their foolishness and throws them into the river for disturbing his peace. Keep this story in mind as you try to understand the universe as you build theories to explain it with your hypotheses which are very limited in scope and biased based on your vantage point, ego, etc. - A paraphrased ancient Indian parable

Experimental Example

Step 1: I have a theory. Step 2: I have a hypothesis determined correctly from my theory. Step 3: I have a method (measurement, recruitment of the sample, & analytical tools) to test my hypothesis. Step 4: I collect some data, and it should match my prediction. When Step 4 fails, we have problems because we do not know where the failure comes from: bad theory, bad hypothesis, or bad methods (Meehl, 1978).

Theory: Behavior reinforcement of good behavior makes children happy because they know it means they have pleased adults. However, children tend to become over-excited when rewarded with objects that they know are special treats that are harmful. Cookies might be one such reward, as they know the cookie is “bad” for them but they were so good the adult broke the rules on their behalf. Unfortunately, children become overly excited by the forbidden treat, they tend to lose control and become hyperactive because they cannot yet contain their ‘id.’

Hypothesis: From this theory, we can form a hypothesis that giving children cookies will cause them to lose control of their id and become hyperactive demon children. Thus, we need to design a simple study where we give a bad reward, chocolate chip cookies. Note: No matter what we find, it does not rule out alternative theories, such as sugar (sucrose) which is the primary ingredient in cookies is digested rapidly and provides a rapid flow of sugar into the bloodstream.

Logic of Hypothesis Test

If X is true then Y is true. X is true. Therefore Y is true; However if Y is true that does not mean X is true: So, If children who eat cookies become more hyperactive than the “known” population of children (Y is true), it would be in line with our hypothesis and consistent our theory (X might be true). It does not PROVE our theory (we never knew if X was true in the first place, it was our theory/guess).

If the children do not get hyperactive (Y is false), it would not mean our theory is wrong (X could still be true). Instead, it would just mean our data does not support the hypothesis. We cannot disprove the theory; we can only provide evidence FOR it (never against it using the current methods and logic we employ). But providing evidence for the theory still not mean it was correct.

Null Hypothesis Testing using the Z-tests (Neyman & Pearson Approach)

A hypothesis test is a statistical method that uses sample data to evaluate a hypothesis about a population. Hypothesis testing is the most common type of inferential procedure. Often, we want to test how a treatment affects the population mean.

4 steps for hypothesis testing:

  • State the hypothesis
  • Set the Criteria Decision
  • Collect Data and Compute Sample Statistics
  • Make a Decision

State the hypothesis

The Null Hypothesis \(H_0\)

  • States that in the general population there is no change, no difference, or no relationship
    • In an experiment, H0 predicts that the independent variable (treatment) will have no effect on the dependent variable for the population
  • \(H_0\) is the hypothesis about which the final decision is to reject or fail to reject

The Scientific or Alternative Hypothesis \(H_1\)

  • States that there is a change or relationship between for the general population
    • In an experiment, \(H_1\) predicts that the independent variable (treatment) will influence the dependent variable for the population.

Sample Experiment

Directional hypothesis

  • \(H_0\): Chocolate chip cookies do not make children hyper
  • \(H_1\): Chocolate chip cookies do make children hyper

Non-directional hypothesis

  • \(H_0\): Chocolate chip cookies do not change children’s level of hyperactivity
  • \(H_1\): Chocolate chip cookies do change children’s level of hyperactivity

Default in psychology is to choose the non-directional test (for reasons explained later)

Set the Criteria Decision

  • Depends on the type of test, number of tests conducted, and if the hypothesis id directional or not
  • Assume a normal distribution
  • Let us generate a population (which we will later sample from)
  • \(\mu=50, \sigma=5\)
set.seed(123)
N<-1e6
Population<-rnorm(N, mean=50,sd=5)
hist(Population,
  main="Raw Score Histogram", 
  xlab="Hyperactivity Score", ylab="Frequency")

  • Let us generate convert our histogram into a Probability Density Function
plot(density(scale(Population)),
  main="Probability Density Function", 
  xlab="Hyperactivity Score [z-score]", ylab="Probability", 
  xlim=c(-3.25, 3.25))

  • A determination need to be made about how far sample means need to be from the population mean to reject the null.
  • Problem is what could count as abnormal for this population:
  • Both tails or just the lower or higher tail?
  • What does the tail start and the body end?
  • we set a cut-off (an Alpha level).
  • common Alphas \(\alpha=.05\),\(\alpha=.01\),\(\alpha=.005\),\(\alpha=.001\),\(\alpha=.0001\)
  • alpha is the degree of abnormalness (area under the curve after the cutoff)

Alpha = .05, 1-tailed

(assume abnormal is higher tail)

alpha=.05
z.cut.off=qnorm(alpha)*-1
plot(density(scale(Population)),
  main="Probability Density Function: a = .05", 
  xlab="Hyperactivity Score [z-score]", ylab="Probability", 
  xlim=c(-3.25, 3.25))
abline(v=z.cut.off, col="blue")

The cut off is \(z\) >1.645

Alpha = .05, 2 tailed (both sides)

Since we need to split area under the curve to both sides, \(\frac{a}{2}\)

alpha=.05/2
z.cut.lower=qnorm(alpha)
z.cut.upper=qnorm(alpha)*-1
plot(density(scale(Population)),
  main="Probability Density Function: a = .05", 
  xlab="Hyperactivity Score [z-score]", ylab="Probability", 
  xlim=c(-3.25, 3.25))
abline(v=z.cut.lower, col="blue")
abline(v=z.cut.upper, col="blue")

Cut offs: \(z_{lower}\) < -1.96 & \(z_{upper}\) > 1.96

  • Notice they are symmetrical, this we just say \(z\) > |1.96|, two-tailed

Alpha = .05,.01,.005,.001,.0001 all 2 tailed

alphas=c(.05/2,.01/2,.005/2,.001/2,.0001/2)
z.cut.lower=qnorm(alphas)
z.cut.upper=qnorm(alphas)*-1
plot(density(scale(Population)),
  main="Probability Density Function", 
  xlab="Hyperactivity Score (Z)", ylab="Probability", 
  xlim=c(-5.25, 5.25))
abline(v=z.cut.lower, col=c("blue", "red","purple","orange","black"),lty=c(1,2,3,4,5))
abline(v=z.cut.upper, col=c("blue", "red","purple","orange","black"),lty=c(1,2,3,4,5))

Cut offs for each alpha: - \(z_{a = .05, .01, .005, .001, .0001}\) = 1.96, 2.576, 2.807, 3.291, 3.891, two-tailed

We need to preselect an alpha (z-critical value) BEFORE conduct the experiment.

  • Lets select, a = .005 (note the standard in psych tends to be .05)

Collect Data and Compute Sample Statistics

  • Extract a sample of kids, \(n=36\), and feed them a bunch of cookies! (use sample function in R with replacement to select from our population)
  • We will assume (as with all Z-tests) that the cookies will
  • DV = We will measure their hyperactivity (which will have a random effect, but positive effect on them)
n=36
set.seed(42)
sample<-sample(Population, n, replace = TRUE)

sample.1<-sample+rnorm(n,mean=2,sd=0)
hist(sample.1,  
     main="Histogram", 
  xlab="Hyperactivity Score", ylab="Frequency")

Kids on cookies showed M = 53.035 with an SD = 4.356. That is close to our population parameters! \(\mu=50, \sigma=5\), but is the sample different from the population?

Compute Sample Statistics

\[z_{test} = \frac{M - \mu}{\sigma_M}\]

where denominator is the standard error of the mean

\[\sigma_M = \frac{\sigma}{\sqrt{n}}\]

M = mean(sample.1)
Mu = 50 # given to you from the population
sigma = 5 # given to you, don't use sample SD for z-test

Ztest <- (M - Mu) / (sigma/sqrt(n))

We get a \(z_{test}\)=3.642, so is this value in the tail of the population?

Make a Decision

Two choices:

  • Reject the null hypothesis - this decision can be reached when the data fall in the critical region.

  • This means that the treatment has resulted in a likely difference between the population and the sample

  • We reject the null: it is easier to prove something false than true

  • Fail to reject the null: if the data do not provide strong evidence, i.e., they do not fall in the critical region, then the treatment has no effect

  • Does our \(z_{test}\) fall outside the z-critical (alpha .005)?

alpha=c(.005/2)
z.cut.lower=qnorm(alpha)
z.cut.upper=qnorm(alpha)*-1
plot(density(scale(Population)),
  main="Probability Density Function: a = .005", 
  xlab="Hyperactivity Score [z-score]", ylab="Probability", 
  xlim=c(-4.25, 4.25))
abline(v=z.cut.lower, col=c("purple"),lty=c(1))
abline(v=z.cut.upper, col=c("purple"),lty=c(1))
abline(v=Ztest, col=c("red"),lty=c(2))

YES, our ztest > zcritical, so we REJECT the null

  • We report, \(z_{test}\)=3.642 \(p < .005\) [mean \(p < a\)]
  • Modern APA is report exact Pvalue
P.two.tailed=2*pnorm(-abs(Ztest))
P.one.tailed=pnorm(-abs(Ztest))

\(z_{test}\)=3.642, \(p =\) 2.7^{-4}

  • But we round it (follow APA rules)

Uncertainty and Error in Hypothesis Testing

  • Hypothesis testing is an inferential process because we do NOT know the actual population data and our samples could be in error
  • When we infer we can make two (at least) types of errors (there are others).

Type I Error

  • Also called false alarm or alpha error
  • This occurs when a researcher rejects a null hypothesis that is actually TRUE. i.e., we reject the null even though the treatment does NOTHING
  • Example, Testing zinc or ColdEase on colds using self-report as a measure of improvement
  • Type 1 error, although serious, are minimized by because researchers use a stringent criterion.
  • Alpha level also sets the probability of type 1 occurring.

Type II Error

  • Also called miss or beta error
  • Type II error occurs when a researcher fails to reject the null hypothesis that is really false.
  • In other words, type II error is when the treatment has an effect and it seems like the treatment has had no effect because the hypothesis test fails to detect it
  • This occurs because the sample mean is not in the critical region. The treatment worked but had a small effect.
  • Example, Taking kava tea to reduce stress
Your decision Treatment does not work (\(H_0\)=TRUE) Treatment does work (\(H_0\)=FALSE)
Reject \(H_0\) Type 1 Correct Decision
Retain \(H_0\) Correct Decision Type II

Does our alpha set the error/miss level?

  • The answer is it depends. We will return this issue when we talk about statistical power

Other types of Error

  • Type III and Type IV errors are not problems with procedures of the NHST, they are “user errors”. There are no singular definitions, but most are similar:

Type III error:

  • Option 1: the right answer to the wrong problem (Kimball 1957, p. 134) like when hunting for ghosts - my Electromagnetic meter is beeping, that means there are ghosts here.
  • Option 2: error occurs when you correctly conclude that the two groups are statistically different, but you are wrong about the direction of the difference (Very rare but can happen cause of small sampling)

Type IV error: lots of suggestions for what it should be:

  • when a statistician performs the correct analysis that answers the right research questions when a simpler analysis would suffice
  • asking the wrong question
  • Following up an ANOVA interaction the wrong way

Factors that Influence a Hypothesis Z-Test

  • Difference between the sample mean and population mean
  • Sample size

Assumptions

  • All statistical tests are based on assumptions.
  • If you fail to meet the assumptions, then the test is compromised
  • The standard deviation does not change with the treatment
  • The sample must be representative of the population.

Random Sampling & Independent Observations

Two observations are independent if there is no constant, predictable relationship that occurs between the first and second variable

  • In other words, each time you flip a fair coin, the probability of getting heads on each flip is the same.
  • Each coin flip is independent of the preceding flip

Otherwise your data ends up like the Asch studies on social confirmatory

One-sample t-test

What do you do if you want to work with small samples and you are missing population information? This is the central problem we face in psychology.

Gosset’s First Problem

  • How to use z-tests on small samples

Basic Assumption:

Gosset’s problem: \(\sigma = ?\)

\[\sigma_M = \frac{\sigma}{\sqrt{N}}\]

Gosset’s solution

\[ \sigma \approx {S}\]

Thus,

\[\sigma_M = \frac{\sigma}{\sqrt{n}} \approx S_M =\frac{S}{\sqrt{n}}\]

So the z-test,

\[z_{test} = \frac{M - \mu}{\sigma_M}\]

becomes, Student’s t-test

\[t = \frac{M - \mu}{S_M}\]

What is \(\mu\)? You would set it based on the true or hypothesized value. Often we set it at \(\mu=0\), or say in the case of IQ, \(\mu=100\). It depends on your specific question.

Gosset’s Second Problem

Can we keep assuming a normal distribution for populations to samples?

Answer: No, because we know when we sample few people are estimates are bad. So he created the t-distribution (called student’s distribution). The t-distribution is the normal distribution adjusting its shape to account for the fact in small samples you estimated the standard deviation from the sample.

x <- seq(-4, 4, length=100)
hx <- dnorm(x)

degf <- c(1, 5, 30)
colors <- c("red", "blue", "darkgreen", "black")
labels <- c("df=1", "df=5", "df=30", "normal")

plot(x, hx, type="l", lty=1, xlab="x value",
  ylab="Density", main="Comparison of t Distributions")

for (i in 1:4){
  lines(x, dt(x,degf[i]), lty=i+1, lwd=1, col=colors[i])
}

legend("topright", inset=.05, title="Distributions",
  labels, lwd=1, lty=c(2, 3, 4, 1), col=colors)

# adapted from http://www.statmethods.net/advgraphs/probability.html
  • We can play with this app: https://gallery.shinyapps.io/dist_calc/

  • The import thing is you need to move the boundaries changes as a function of flatness of the curve (df): you want to keep the alpha the same under the curve, this the critical regions change. So DF is needed get to tcrit.

  • \(a = .05\), two-tailed. Remember [\(z = 1.96\)]

alpha = .05/2

zcrit <- -qnorm(alpha)

#create degrees of freedom
dfs <- seq(1, 30, by=1)
tcrit <- -qt(alpha,dfs)

plot(dfs, tcrit, type="l", lty=1, xlab="Degrees of Freedom",
  ylab="t-crit", main="Alpha = .05")
abline(h=zcrit, col="red")

Thus \(tcrit \approx zcrit\), as \(n \Rightarrow inf\)

Confidence intervals

  • What range of values can we assert we are 95% confident includes the true population parameter?
  • One-sample t-test CI

\[\mu_{effect} = M \pm t_{crit}*S_M\]

\(\mu_{effect}\) would be within \(\pm\) critical tvalues and standard error of you data. The smaller your sample the larger the CI. To get 95%CI you would set your alpha to .05 to get your t-critical.

Interpret CIs

  • Hot debate over what they mean (see Miller & Ulrich, 2016 vs Morey, Hoekstra, Rouder, & Wagenmakers, 2016)
  • Both the word “probability” and the word “confidence” have meanings outside of their technical ones in frequentist statistics causing miss-understandings.

How to interpret CIs

  • Does it actually represent the “Confidence” range which includes the population data? [as I defined it above?]
  • Treat them just like NHST? [what most people do]: Interpret the interval as all the values that would not be rejected by a particular significance test.
  • Follow Neyman? Avoid the problem by not interpreting CIs at all - “the confidence interval asserts nothing except that it is a sample from a confidence procedure.” [No one will accept this, but his point is well taken]
  • Do Bayesian stats only? [Yeah, good luck dealing with reviewers]
  • I prefer to avoid classical CIs and instead use bootstrapped CIs [we will come back to those later]

Example of one-sample t-test

set.seed(42)
# extact a sample of 30 people, that has +9 effect on IQ
n = 30
MeanIQ.effect = 109
SDIQ = 15
Mozart.Sample <- rnorm(n,MeanIQ.effect,SDIQ)
hist(Mozart.Sample, xlab="IQ scores",main="Mozart Effect")

# t-test
?t.test
Mozart.t.test<-t.test(Mozart.Sample,
       alternative = c("two.sided"),
       mu = 100, paired = FALSE, var.equal = TRUE,
       conf.level = 0.95)
Mozart.t.test #call the results
## 
##  One Sample t-test
## 
## data:  Mozart.Sample
## t = 2.9179, df = 29, p-value = 0.006743
## alternative hypothesis: true mean is not equal to 100
## 95 percent confidence interval:
##  102.9993 117.0583
## sample estimates:
## mean of x 
##  110.0288

Independent Samples t-test

  • what if you don’t have the population to compare to, but need to estimate their \(\mu\) via a control or comparison group?
  • Independent samples t-test
  • The goal of a between-subjects research study is to evaluate the mean difference between two populations (or between two treatment conditions).

\[ H_0: \mu_1 = \mu_2 \] \[ H_1: \mu_1 \neq \mu_2 \] where, \(\mu_1\) = Experimental and \(\mu_2\) = Control

Error term

  • The single-sample standard error, \(S_M\) measures how much error expected between \(M\) and \(\mu\).
  • The independent-samples standard error (\(S_{M1 - M2}\)) measures how much error is expected when you are using a sample mean difference (\(M1 - M2\)) to represent a population mean error.

Equal sample sizes

\[ S_{M1 - M2} = \sqrt{\frac{S^2_1}{n_1}+ \frac{S^2_2}{n_2}}\]

  • Each of the two-sample means represents its own population mean, but in each case, there is some error.
  • The amount of error associated with each sample mean can be measured by computing the standard errors.
  • To calculate the total amount of error involved in using two sample means to approximate two population means, we will find the error from each sample separately and then add the two errors together.
  • This formula only works when sample sizes are equal.
  • When the two samples are different sizes, this formula is biased.
  • This comes from the fact that the formula above treats the two sample variances equally. But we know that the statistics obtained from large samples are better estimates, so we need to give larger samples more weight in our estimated standard error.

Unequal sample sizes

  • We are going to change the formula slightly so that we use the pooled sample variance instead of the individual sample variances. \[ S^2_p = \frac{SS_1+SS_2}{df_1+df_2}\]

  • This pooled variance is going to be a weighted estimate of the variance derived from the two samples.

\[ S_{M1 - M2} = \sqrt{\frac{S^2_p}{n_1}+ \frac{S^2_p}{n_2}}\]

Formula

\[ t = \frac{M_1 - M_2 - (\mu_1 - \mu_2)} {S_{M1 - M2}}\] Where, \(\mu_1 - \mu_2 = 0\)

and \(df = (n_1 - 1) + (n_2-1)\)

Confidence Intervals for Independent Samples

\[ \mu_{effect} = (M_1-M_2) \pm t_{crit}*S_{M1 - M2}\]

Example of Independent Samples t-test

  • We will compare IQ (spatial reasoning) of people right after they listen to Mozart’s Sonata for Two Pianos in D Major K. 448 to a control group who listened to Bach’s Brandenburg Concerto No. 6 in B flat major, BWV 1051 Concerto. If the effect is for Mozart only, we should not see it work when listening to Bach (matched on modality & tempo, and complexity of dueling voices)
set.seed(666)
# extact a sample of 30 people, that has +9 effect on IQ
n = 30
MozartIQ.effect = 109
SDIQ = 15
Mozart.Sample.2 <- rnorm(n,MozartIQ.effect,SDIQ)

BachIQ.effect = 110
SDIQ = 15
Bach.Sample <- rnorm(n,BachIQ.effect,SDIQ)

hist(Mozart.Sample.2, xlab="IQ scores",main="Mozart Effect",xlim = c(70,160))

hist(Bach.Sample, xlab="IQ scores",main="Bach Effect",xlim = c(70,160))

# t-test
MvsB.t.test<-t.test(x= Mozart.Sample.2, y= Bach.Sample,
       alternative = c("two.sided"),
       paired = FALSE, var.equal = TRUE,
       conf.level = 0.95)
MvsB.t.test #call the results
## 
##  Two Sample t-test
## 
## data:  Mozart.Sample.2 and Bach.Sample
## t = -1.6594, df = 58, p-value = 0.1024
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -15.195895   1.420754
## sample estimates:
## mean of x mean of y 
##  105.1811  112.0686

So, we cannot reject the null: Bach and Mozart group had the same means (p > .05 & CIs include 0). But we cannot conclude that Mozart is not special, but maybe Bach is special too? The short answer is that Mozart was not special it was an arousal effect (Thompson et al., 2001).

Assumptions

  • Observation within each sample must be independent
  • The two populations from which the samples are selected must be normal
  • The two populations from which the samples are selected must have equal variance
  • Homogeneity of variance - two populations being compared must have the same variance
  • We can pool our variance because it represents the same population (this satisfies homogeneity of variance)
  • If your samples represent TWO DIFFERENT population you cannot pool your variance (like apples and oranges)

Testing Homogeneity of Variance

  • Hartley’s F-max test or Levene’s F test
  • Hartley is easy to do by hand

\[F_{max} = \frac{s^2_{larger}}{s^2_{smaller}}\] where \(df = n-1\), assumes equal samples per group, K = 2 [look up values in tables in the book]

  • For Levene’s test, we need to install the car package, you would run, install.packages(‘car’) only once (until you manually update it or update R and need to reinstall it).
  • This test requires we reformat the data a bit. We need to make a “data-frame”
library(car)
#Reformat
Music.Study<-data.frame(
  DV = c(Mozart.Sample.2,Bach.Sample),
  IV = c(rep("Mozart",n),rep("Bach",n))
)
# first 5 lines
head(Music.Study) 
##          DV     IV
## 1 120.29967 Mozart
## 2 139.21532 Mozart
## 3 103.67298 Mozart
## 4 139.42252 Mozart
## 5  75.74688 Mozart
## 6 120.37594 Mozart
# Lets look at boxplots quickly
boxplot(DV ~ IV, data = Music.Study)

# Load functions from Car package
leveneTest(DV ~ IV, data = Music.Study)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  4.3589 0.04122 *
##       58                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • Seems we have a problem. One group is more variable than the other
  • We cannot fix Homogeneity of Variance (you cannot transform one group, but not the other), but we can make our test more conservative by correcting our degrees of freedom based on the degree of variances mismatch per sample size (below is an example of this type of correction)

\[df_c = \frac{(\frac{S^2_1}{n_1}+\frac{S^2_2}{n_2} )^2}{{\frac{S^2_1}{\frac{n_1}{n_1-1}}}+{\frac{S^2_2}{\frac{n_2}{n_2-1}}}}\]

Welch’s t-test (corrected for HOV)

  • Note we can do our t-test on our dataframe (rather than our individual samples)
  • we set var.equal=FALSE
MvsB.welch<-t.test(DV ~ IV, data = Music.Study,
       alternative = c("two.sided"),
       paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
MvsB.welch #call the results
## 
##  Welch Two Sample t-test
## 
## data:  DV by IV
## t = 1.6594, df = 52.235, p-value = 0.103
## alternative hypothesis: true difference in means between group Bach and group Mozart is not equal to 0
## 95 percent confidence interval:
##  -1.440321 15.215462
## sample estimates:
##   mean in group Bach mean in group Mozart 
##             112.0686             105.1811
  • Our DF is not a smaller (and a faction)
  • Not the default in R is to assume HOV problems, SPSS shows you both and lets you pick

References

Meehl, P. E. (1978). Theoretical risks and tabular asterisks: Sir Karl, Sir Ronald, and the slow progress of soft psychology. Journal of consulting and clinical Psychology, 46(4), 806.

Miller, J., & Ulrich, R. (2016). Interpreting confidence intervals: A comment on Hoekstra, Morey, Rouder, and Wagenmakers (2014). Psychonomic bulletin & review, 23(1), 124-130.

Morey, R. D., Hoekstra, R., Rouder, J. N., & Wagenmakers, E. J. (2016). Continued misinterpretation of confidence intervals: response to Miller and Ulrich. Psychonomic bulletin & review, 23(1), 131-140.

Rauscher, F. H., Shaw, G. L., & Ky, C. N. (1993). Music and spatial task performance. Nature, 365(6447), 611-611.

Thompson, W. F., Schellenberg, E. G., & Husain, G. (2001). Arousal, mood, and the Mozart effect. Psychological science, 12(3), 248-251.

LS0tDQp0aXRsZTogJ0h5cG90aGVzaXMgVGVzdGluZzogei10ZXN0cyAmIHQtdGVzdHMnDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgZm9udHNpemU6IDhwdA0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlPVRSVUUpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSAgRkFMU0UpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoPTQuNSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcuaGVpZ2h0PTMuNSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcuYWxpZ249J2NlbnRlcicpIA0KYGBgDQoNCiMgRXhwZXJpbWVudGFsIExvZ2ljDQojIyBUaGUgQmxpbmQgTWVuIGFuZCB0aGUgRWxlcGhhbnQNCkEgZ3JvdXAgb2YgYmxpbmQgbWVuIHdlcmUgdHJhdmVsaW5nIHRvZ2V0aGVyLCBhbmQgb24gdGhlaXIgdHJpcCB0aGV5IGVuY291bnRlciBhIHN0cmFuZ2Ugb2JqZWN0IGluIHRoZWlyIHBhdGguIEVhY2ggYmxpbmQgbWFuIGZlZWxzIGEgZGlmZmVyZW50IHBhcnQgb2Ygb2JqZWN0LiBUaGV5IHRoZW4gZGVzY3JpYmUgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGVpciBwYXJ0aWFsIGV4cGVyaWVuY2UuIE9uZSBtYW4gY3JpZXMgb3V0LCAiaXQgbXVzdCBhIHRoaW5rIGJyYW5jaCBvZiBhIHRyZWUiLCBzYXkgdGhlIG1hbiBmZWVsaW5nIHRoZSB0cnVuayBvZiB0aGUgZWxlcGhhbnQuICAiTm8iLCBzYXlzIHRoZSBvdGhlciBtYW4sICJpdCBtdXN0IGJlIGEgcGlsbGFyIiwgYXMgaGUgd2FzIGZlZWxpbmcgdGhlIHRoaWNrIGxlZyBvZiB0aGUgZWxlcGhhbnQuIFRoZSB0aGlyZCBtYW4gc2F5cywgInlvdSBhcmUgYm90aCB3cm9uZywgaXQgaXMgY2xlYXJseSBzb21lIHNvcnQgb2YgZmFuIiwgYXMgaGUgZmVlbHMgdGhlIGVhciBvZiB0aGUgZWxlcGhhbnQuIE9mIGNvdXJzZSBvbmUgcGVyc29uIG11c3QgYmUgcmlnaHQgYW5kIHRoZSBvdGhlcnMgYXJlIGZvb2xzLiBTbyB0aGV5IGJlYXQgZWFjaCBvdGhlciB1cCBhbmQgdGhlIGNvcnJlY3QgcGVyc29uIGlzIHRoZSBvbmUgbGVmdCBzdGFuZGluZyEgSG93ZXZlciwgdGhlIGVsZXBoYW50IGdyb3dzIGlycml0YXRlZCB3aXRoIHRoZWlyIGZvb2xpc2huZXNzIGFuZCB0aHJvd3MgdGhlbSBpbnRvIHRoZSByaXZlciBmb3IgZGlzdHVyYmluZyBoaXMgcGVhY2UuIEtlZXAgdGhpcyBzdG9yeSBpbiBtaW5kIGFzIHlvdSB0cnkgdG8gdW5kZXJzdGFuZCB0aGUgdW5pdmVyc2UgYXMgeW91IGJ1aWxkIHRoZW9yaWVzIHRvIGV4cGxhaW4gaXQgd2l0aCB5b3VyIGh5cG90aGVzZXMgd2hpY2ggYXJlIHZlcnkgbGltaXRlZCBpbiBzY29wZSBhbmQgYmlhc2VkIGJhc2VkIG9uIHlvdXIgdmFudGFnZSBwb2ludCwgZWdvLCBldGMuIC0gKkEgcGFyYXBocmFzZWQgYW5jaWVudCBJbmRpYW4gcGFyYWJsZSogIA0KDQojIyBFeHBlcmltZW50YWwgRXhhbXBsZSANCioqU3RlcCAxKio6IEkgaGF2ZSBhIHRoZW9yeS4gKipTdGVwIDIqKjogSSBoYXZlIGEgaHlwb3RoZXNpcyBkZXRlcm1pbmVkIGNvcnJlY3RseSBmcm9tIG15IHRoZW9yeS4gICoqU3RlcCAzKio6IEkgaGF2ZSBhIG1ldGhvZCAobWVhc3VyZW1lbnQsIHJlY3J1aXRtZW50IG9mIHRoZSBzYW1wbGUsICYgYW5hbHl0aWNhbCB0b29scykgdG8gdGVzdCBteSBoeXBvdGhlc2lzLiAqKlN0ZXAgNCoqOiBJIGNvbGxlY3Qgc29tZSBkYXRhLCBhbmQgaXQgc2hvdWxkIG1hdGNoIG15IHByZWRpY3Rpb24uIFdoZW4gU3RlcCA0IGZhaWxzLCB3ZSBoYXZlIHByb2JsZW1zIGJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hlcmUgdGhlIGZhaWx1cmUgY29tZXMgZnJvbTogYmFkIHRoZW9yeSwgYmFkIGh5cG90aGVzaXMsIG9yIGJhZCBtZXRob2RzIChNZWVobCwgMTk3OCkuDQoNCioqVGhlb3J5Kio6IEJlaGF2aW9yIHJlaW5mb3JjZW1lbnQgb2YgZ29vZCBiZWhhdmlvciBtYWtlcyBjaGlsZHJlbiBoYXBweSBiZWNhdXNlIHRoZXkga25vdyBpdCBtZWFucyB0aGV5IGhhdmUgcGxlYXNlZCBhZHVsdHMuIEhvd2V2ZXIsIGNoaWxkcmVuIHRlbmQgdG8gYmVjb21lIG92ZXItZXhjaXRlZCB3aGVuIHJld2FyZGVkIHdpdGggb2JqZWN0cyB0aGF0IHRoZXkga25vdyBhcmUgc3BlY2lhbCB0cmVhdHMgdGhhdCBhcmUgKmhhcm1mdWwqLiAgQ29va2llcyBtaWdodCBiZSBvbmUgc3VjaCByZXdhcmQsIGFzIHRoZXkga25vdyB0aGUgY29va2llIGlzICJiYWQiIGZvciB0aGVtIGJ1dCB0aGV5IHdlcmUgc28gZ29vZCB0aGUgYWR1bHQgYnJva2UgdGhlIHJ1bGVzIG9uIHRoZWlyIGJlaGFsZi4gVW5mb3J0dW5hdGVseSwgY2hpbGRyZW4gYmVjb21lIG92ZXJseSBleGNpdGVkIGJ5IHRoZSBmb3JiaWRkZW4gdHJlYXQsIHRoZXkgdGVuZCB0byBsb3NlIGNvbnRyb2wgYW5kIGJlY29tZSBoeXBlcmFjdGl2ZSBiZWNhdXNlIHRoZXkgY2Fubm90IHlldCBjb250YWluIHRoZWlyICdpZC4nICANCg0KKipIeXBvdGhlc2lzKio6IEZyb20gdGhpcyB0aGVvcnksIHdlIGNhbiBmb3JtIGEgaHlwb3RoZXNpcyB0aGF0IGdpdmluZyBjaGlsZHJlbiBjb29raWVzIHdpbGwgY2F1c2UgdGhlbSB0byBsb3NlIGNvbnRyb2wgb2YgdGhlaXIgaWQgYW5kIGJlY29tZSBoeXBlcmFjdGl2ZSBkZW1vbiBjaGlsZHJlbi4gVGh1cywgd2UgbmVlZCB0byBkZXNpZ24gYSBzaW1wbGUgc3R1ZHkgd2hlcmUgd2UgZ2l2ZSBhIGJhZCByZXdhcmQsIGNob2NvbGF0ZSBjaGlwIGNvb2tpZXMuICoqTm90ZSoqOiBObyBtYXR0ZXIgd2hhdCB3ZSBmaW5kLCBpdCBkb2VzIG5vdCBydWxlIG91dCBhbHRlcm5hdGl2ZSB0aGVvcmllcywgc3VjaCBhcyBzdWdhciAoc3Vjcm9zZSkgd2hpY2ggaXMgdGhlIHByaW1hcnkgaW5ncmVkaWVudCBpbiBjb29raWVzIGlzIGRpZ2VzdGVkIHJhcGlkbHkgYW5kIHByb3ZpZGVzIGEgcmFwaWQgZmxvdyBvZiBzdWdhciBpbnRvIHRoZSBibG9vZHN0cmVhbS4gDQoNCiMjIyBMb2dpYyBvZiBIeXBvdGhlc2lzIFRlc3QNCklmIFggaXMgdHJ1ZSB0aGVuIFkgaXMgdHJ1ZS4gWCBpcyB0cnVlLiBUaGVyZWZvcmUgWSBpcyB0cnVlOyBIb3dldmVyIGlmIFkgaXMgdHJ1ZSB0aGF0IGRvZXMgbm90IG1lYW4gWCBpcyB0cnVlOiBTbywgSWYgY2hpbGRyZW4gd2hvIGVhdCBjb29raWVzIGJlY29tZSBtb3JlIGh5cGVyYWN0aXZlIHRoYW4gdGhlICJrbm93biIgcG9wdWxhdGlvbiBvZiBjaGlsZHJlbiAoWSBpcyB0cnVlKSwgaXQgd291bGQgYmUgaW4gbGluZSB3aXRoIG91ciBoeXBvdGhlc2lzIGFuZCAqKmNvbnNpc3RlbnQqKiBvdXIgdGhlb3J5IChYICptaWdodCogYmUgdHJ1ZSkuIEl0IGRvZXMgbm90IFBST1ZFIG91ciB0aGVvcnkgKHdlIG5ldmVyIGtuZXcgaWYgWCB3YXMgdHJ1ZSBpbiB0aGUgZmlyc3QgcGxhY2UsIGl0IHdhcyBvdXIgdGhlb3J5L2d1ZXNzKS4gDQoNCklmIHRoZSBjaGlsZHJlbiBkbyBub3QgZ2V0IGh5cGVyYWN0aXZlIChZIGlzIGZhbHNlKSwgaXQgd291bGQgbm90IG1lYW4gb3VyIHRoZW9yeSBpcyB3cm9uZyAoWCBjb3VsZCBzdGlsbCBiZSB0cnVlKS4gSW5zdGVhZCwgaXQgd291bGQganVzdCBtZWFuIG91ciBkYXRhIGRvZXMgKm5vdCogc3VwcG9ydCB0aGUgaHlwb3RoZXNpcy4gV2UgY2Fubm90IGRpc3Byb3ZlIHRoZSB0aGVvcnk7IHdlIGNhbiBvbmx5IHByb3ZpZGUgZXZpZGVuY2UgRk9SIGl0IChuZXZlciBhZ2FpbnN0IGl0IHVzaW5nIHRoZSBjdXJyZW50IG1ldGhvZHMgYW5kIGxvZ2ljIHdlIGVtcGxveSkuIEJ1dCBwcm92aWRpbmcgZXZpZGVuY2UgZm9yIHRoZSB0aGVvcnkgc3RpbGwgbm90IG1lYW4gaXQgd2FzIGNvcnJlY3QuICANCg0KDQojIE51bGwgSHlwb3RoZXNpcyBUZXN0aW5nIHVzaW5nIHRoZSBaLXRlc3RzIChOZXltYW4gJiBQZWFyc29uIEFwcHJvYWNoKQ0KQSBoeXBvdGhlc2lzIHRlc3QgaXMgYSBzdGF0aXN0aWNhbCBtZXRob2QgdGhhdCB1c2VzIHNhbXBsZSBkYXRhIHRvIGV2YWx1YXRlIGEgaHlwb3RoZXNpcyBhYm91dCBhIHBvcHVsYXRpb24uIEh5cG90aGVzaXMgdGVzdGluZyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBpbmZlcmVudGlhbCBwcm9jZWR1cmUuIE9mdGVuLCB3ZSB3YW50IHRvIHRlc3QgaG93IGEgdHJlYXRtZW50IGFmZmVjdHMgdGhlIHBvcHVsYXRpb24gbWVhbi4NCg0KKio0IHN0ZXBzIGZvciBoeXBvdGhlc2lzIHRlc3RpbmcqKjoNCg0KLSBTdGF0ZSB0aGUgaHlwb3RoZXNpcyANCi0gU2V0IHRoZSBDcml0ZXJpYSBEZWNpc2lvbg0KLSBDb2xsZWN0IERhdGEgYW5kIENvbXB1dGUgU2FtcGxlIFN0YXRpc3RpY3MNCi0gTWFrZSBhIERlY2lzaW9uDQoNCiMjIyBTdGF0ZSB0aGUgaHlwb3RoZXNpcw0KDQoqKlRoZSBOdWxsIEh5cG90aGVzaXMqKiAkSF8wJA0KDQotIFN0YXRlcyB0aGF0IGluIHRoZSBnZW5lcmFsIHBvcHVsYXRpb24gdGhlcmUgaXMgbm8gY2hhbmdlLCBubyBkaWZmZXJlbmNlLCBvciBubyByZWxhdGlvbnNoaXAgDQogICAgLSBJbiBhbiBleHBlcmltZW50LCBIMCBwcmVkaWN0cyB0aGF0IHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSAodHJlYXRtZW50KSB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgZm9yIHRoZSBwb3B1bGF0aW9uIA0KLSAkSF8wJCBpcyB0aGUgaHlwb3RoZXNpcyBhYm91dCB3aGljaCB0aGUgZmluYWwgZGVjaXNpb24gaXMgdG8gKnJlamVjdCogb3IgKmZhaWwgdG8gcmVqZWN0Kg0KDQoqKlRoZSBTY2llbnRpZmljIG9yIEFsdGVybmF0aXZlIEh5cG90aGVzaXMqKiAkSF8xJA0KDQotIFN0YXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGZvciB0aGUgZ2VuZXJhbCBwb3B1bGF0aW9uDQogICAgLSBJbiBhbiBleHBlcmltZW50LCAkSF8xJCBwcmVkaWN0cyB0aGF0IHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSAodHJlYXRtZW50KSB3aWxsIGluZmx1ZW5jZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGZvciB0aGUgcG9wdWxhdGlvbi4gDQoNCioqU2FtcGxlIEV4cGVyaW1lbnQqKg0KDQoqRGlyZWN0aW9uYWwgaHlwb3RoZXNpcyoNCg0KLSAkSF8wJDogQ2hvY29sYXRlIGNoaXAgY29va2llcyBkbyBub3QgbWFrZSBjaGlsZHJlbiBoeXBlcg0KLSAkSF8xJDogQ2hvY29sYXRlIGNoaXAgY29va2llcyBkbyBtYWtlIGNoaWxkcmVuIGh5cGVyIA0KDQoqTm9uLWRpcmVjdGlvbmFsIGh5cG90aGVzaXMqDQoNCi0gJEhfMCQ6IENob2NvbGF0ZSBjaGlwIGNvb2tpZXMgZG8gbm90IGNoYW5nZSBjaGlsZHJlbidzIGxldmVsIG9mIGh5cGVyYWN0aXZpdHkNCi0gJEhfMSQ6IENob2NvbGF0ZSBjaGlwIGNvb2tpZXMgZG8gY2hhbmdlIGNoaWxkcmVuJ3MgbGV2ZWwgb2YgaHlwZXJhY3Rpdml0eQ0KDQoqKkRlZmF1bHQgaW4gcHN5Y2hvbG9neSBpcyB0byBjaG9vc2UgdGhlIG5vbi1kaXJlY3Rpb25hbCB0ZXN0IChmb3IgcmVhc29ucyBleHBsYWluZWQgbGF0ZXIpKioNCg0KIyMjIFNldCB0aGUgQ3JpdGVyaWEgRGVjaXNpb24NCg0KLSBEZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRlc3QsIG51bWJlciBvZiB0ZXN0cyBjb25kdWN0ZWQsIGFuZCBpZiB0aGUgaHlwb3RoZXNpcyBpZCBkaXJlY3Rpb25hbCBvciBub3QNCi0gQXNzdW1lIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbg0KLSBMZXQgdXMgZ2VuZXJhdGUgYSBwb3B1bGF0aW9uICh3aGljaCB3ZSB3aWxsIGxhdGVyIHNhbXBsZSBmcm9tKQ0KLSAkXG11PTUwLCBcc2lnbWE9NSQNCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpOPC0xZTYNClBvcHVsYXRpb248LXJub3JtKE4sIG1lYW49NTAsc2Q9NSkNCmhpc3QoUG9wdWxhdGlvbiwNCiAgbWFpbj0iUmF3IFNjb3JlIEhpc3RvZ3JhbSIsIA0KICB4bGFiPSJIeXBlcmFjdGl2aXR5IFNjb3JlIiwgeWxhYj0iRnJlcXVlbmN5IikNCmBgYA0KDQotIExldCB1cyBnZW5lcmF0ZSBjb252ZXJ0IG91ciBoaXN0b2dyYW0gaW50byBhIFByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24gDQoNCmBgYHtyfQ0KcGxvdChkZW5zaXR5KHNjYWxlKFBvcHVsYXRpb24pKSwNCiAgbWFpbj0iUHJvYmFiaWxpdHkgRGVuc2l0eSBGdW5jdGlvbiIsIA0KICB4bGFiPSJIeXBlcmFjdGl2aXR5IFNjb3JlIFt6LXNjb3JlXSIsIHlsYWI9IlByb2JhYmlsaXR5IiwgDQogIHhsaW09YygtMy4yNSwgMy4yNSkpDQpgYGANCg0KLSBBIGRldGVybWluYXRpb24gbmVlZCB0byBiZSBtYWRlIGFib3V0IGhvdyBmYXIgc2FtcGxlIG1lYW5zIG5lZWQgdG8gYmUgZnJvbSB0aGUgcG9wdWxhdGlvbiBtZWFuIHRvIHJlamVjdCB0aGUgbnVsbC4gDQotIFByb2JsZW0gaXMgd2hhdCBjb3VsZCBjb3VudCBhcyAqYWJub3JtYWwqIGZvciB0aGlzIHBvcHVsYXRpb246IA0KLSBCb3RoIHRhaWxzIG9yIGp1c3QgdGhlIGxvd2VyIG9yIGhpZ2hlciB0YWlsPw0KLSBXaGF0IGRvZXMgdGhlIHRhaWwgc3RhcnQgYW5kIHRoZSBib2R5IGVuZD8gDQotIHdlIHNldCBhIGN1dC1vZmYgKGFuIEFscGhhIGxldmVsKS4gDQotIGNvbW1vbiBBbHBoYXMgJFxhbHBoYT0uMDUkLCRcYWxwaGE9LjAxJCwkXGFscGhhPS4wMDUkLCRcYWxwaGE9LjAwMSQsJFxhbHBoYT0uMDAwMSQgDQotIGFscGhhIGlzIHRoZSBkZWdyZWUgb2YgYWJub3JtYWxuZXNzIChhcmVhIHVuZGVyIHRoZSBjdXJ2ZSBhZnRlciB0aGUgY3V0b2ZmKQ0KDQoqKkFscGhhID0gLjA1LCAxLXRhaWxlZCoqDQoNCihhc3N1bWUgYWJub3JtYWwgaXMgaGlnaGVyIHRhaWwpDQoNCmBgYHtyfQ0KYWxwaGE9LjA1DQp6LmN1dC5vZmY9cW5vcm0oYWxwaGEpKi0xDQpwbG90KGRlbnNpdHkoc2NhbGUoUG9wdWxhdGlvbikpLA0KICBtYWluPSJQcm9iYWJpbGl0eSBEZW5zaXR5IEZ1bmN0aW9uOiBhID0gLjA1IiwgDQogIHhsYWI9Ikh5cGVyYWN0aXZpdHkgU2NvcmUgW3otc2NvcmVdIiwgeWxhYj0iUHJvYmFiaWxpdHkiLCANCiAgeGxpbT1jKC0zLjI1LCAzLjI1KSkNCmFibGluZSh2PXouY3V0Lm9mZiwgY29sPSJibHVlIikNCmBgYA0KDQpUaGUgY3V0IG9mZiBpcyAkeiQgPmByIHJvdW5kKHouY3V0Lm9mZiwzKWANCg0KKipBbHBoYSA9IC4wNSwgMiB0YWlsZWQgKGJvdGggc2lkZXMpKioNCg0KU2luY2Ugd2UgbmVlZCB0byBzcGxpdCBhcmVhIHVuZGVyIHRoZSBjdXJ2ZSB0byBib3RoIHNpZGVzLCAkXGZyYWN7YX17Mn0kDQoNCmBgYHtyfQ0KYWxwaGE9LjA1LzINCnouY3V0Lmxvd2VyPXFub3JtKGFscGhhKQ0Kei5jdXQudXBwZXI9cW5vcm0oYWxwaGEpKi0xDQpwbG90KGRlbnNpdHkoc2NhbGUoUG9wdWxhdGlvbikpLA0KICBtYWluPSJQcm9iYWJpbGl0eSBEZW5zaXR5IEZ1bmN0aW9uOiBhID0gLjA1IiwgDQogIHhsYWI9Ikh5cGVyYWN0aXZpdHkgU2NvcmUgW3otc2NvcmVdIiwgeWxhYj0iUHJvYmFiaWxpdHkiLCANCiAgeGxpbT1jKC0zLjI1LCAzLjI1KSkNCmFibGluZSh2PXouY3V0Lmxvd2VyLCBjb2w9ImJsdWUiKQ0KYWJsaW5lKHY9ei5jdXQudXBwZXIsIGNvbD0iYmx1ZSIpDQpgYGANCg0KQ3V0IG9mZnM6IA0KJHpfe2xvd2VyfSQgPCBgciByb3VuZCh6LmN1dC5sb3dlciwzKWAgJiAkel97dXBwZXJ9JCA+IGByIHJvdW5kKHouY3V0LnVwcGVyLDMpYA0KDQotIE5vdGljZSB0aGV5IGFyZSBzeW1tZXRyaWNhbCwgdGhpcyB3ZSBqdXN0IHNheSAkeiQgPiB8YHIgcm91bmQoei5jdXQudXBwZXIsMylgfCwgKnR3by10YWlsZWQqDQoNCioqQWxwaGEgPSAuMDUsLjAxLC4wMDUsLjAwMSwuMDAwMSBhbGwgMiB0YWlsZWQqKg0KDQpgYGB7cn0NCmFscGhhcz1jKC4wNS8yLC4wMS8yLC4wMDUvMiwuMDAxLzIsLjAwMDEvMikNCnouY3V0Lmxvd2VyPXFub3JtKGFscGhhcykNCnouY3V0LnVwcGVyPXFub3JtKGFscGhhcykqLTENCnBsb3QoZGVuc2l0eShzY2FsZShQb3B1bGF0aW9uKSksDQogIG1haW49IlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb24iLCANCiAgeGxhYj0iSHlwZXJhY3Rpdml0eSBTY29yZSAoWikiLCB5bGFiPSJQcm9iYWJpbGl0eSIsIA0KICB4bGltPWMoLTUuMjUsIDUuMjUpKQ0KYWJsaW5lKHY9ei5jdXQubG93ZXIsIGNvbD1jKCJibHVlIiwgInJlZCIsInB1cnBsZSIsIm9yYW5nZSIsImJsYWNrIiksbHR5PWMoMSwyLDMsNCw1KSkNCmFibGluZSh2PXouY3V0LnVwcGVyLCBjb2w9YygiYmx1ZSIsICJyZWQiLCJwdXJwbGUiLCJvcmFuZ2UiLCJibGFjayIpLGx0eT1jKDEsMiwzLDQsNSkpDQpgYGANCg0KQ3V0IG9mZnMgZm9yIGVhY2ggYWxwaGE6IA0KLSAgJHpfe2EgPSAuMDUsIC4wMSwgLjAwNSwgLjAwMSwgLjAwMDF9JCA9IGByIHJvdW5kKHouY3V0LnVwcGVyLDMpYCwgKnR3by10YWlsZWQqDQoNCioqV2UgbmVlZCB0byBwcmVzZWxlY3QgYW4gYWxwaGEgKHotY3JpdGljYWwgdmFsdWUpIEJFRk9SRSBjb25kdWN0IHRoZSBleHBlcmltZW50LioqDQoNCi0gTGV0cyBzZWxlY3QsIGEgPSAuMDA1IChub3RlIHRoZSBzdGFuZGFyZCBpbiBwc3ljaCB0ZW5kcyB0byBiZSAuMDUpDQoNCg0KIyMjIENvbGxlY3QgRGF0YSBhbmQgQ29tcHV0ZSBTYW1wbGUgU3RhdGlzdGljcw0KDQotIEV4dHJhY3QgYSBzYW1wbGUgb2Yga2lkcywgJG49MzYkLCBhbmQgZmVlZCB0aGVtIGEgYnVuY2ggb2YgY29va2llcyEgKHVzZSBgc2FtcGxlYCBmdW5jdGlvbiBpbiBSIHdpdGggcmVwbGFjZW1lbnQgdG8gc2VsZWN0IGZyb20gb3VyIHBvcHVsYXRpb24pDQotIFdlIHdpbGwgYXNzdW1lIChhcyB3aXRoIGFsbCBaLXRlc3RzKSB0aGF0IHRoZSBjb29raWVzIHdpbGwgDQotIERWID0gV2Ugd2lsbCBtZWFzdXJlIHRoZWlyIGh5cGVyYWN0aXZpdHkgKHdoaWNoIHdpbGwgaGF2ZSBhIHJhbmRvbSBlZmZlY3QsIGJ1dCBwb3NpdGl2ZSBlZmZlY3Qgb24gdGhlbSkNCg0KYGBge3J9DQpuPTM2DQpzZXQuc2VlZCg0MikNCnNhbXBsZTwtc2FtcGxlKFBvcHVsYXRpb24sIG4sIHJlcGxhY2UgPSBUUlVFKQ0KDQpzYW1wbGUuMTwtc2FtcGxlK3Jub3JtKG4sbWVhbj0yLHNkPTApDQpoaXN0KHNhbXBsZS4xLCAgDQogICAgIG1haW49Ikhpc3RvZ3JhbSIsIA0KICB4bGFiPSJIeXBlcmFjdGl2aXR5IFNjb3JlIiwgeWxhYj0iRnJlcXVlbmN5IikNCmBgYA0KDQpLaWRzIG9uIGNvb2tpZXMgc2hvd2VkIE0gPSAgYHIgcm91bmQobWVhbihzYW1wbGUuMSksMylgIHdpdGggYW4gU0QgPSBgciByb3VuZChzZChzYW1wbGUuMSksMylgLg0KVGhhdCBpcyBjbG9zZSB0byBvdXIgcG9wdWxhdGlvbiBwYXJhbWV0ZXJzISAkXG11PTUwLCBcc2lnbWE9NSQsIGJ1dCBpcyB0aGUgc2FtcGxlIGRpZmZlcmVudCBmcm9tIHRoZSBwb3B1bGF0aW9uPyANCg0KKipDb21wdXRlIFNhbXBsZSBTdGF0aXN0aWNzKioNCg0KJCR6X3t0ZXN0fSA9IFxmcmFje00gLSBcbXV9e1xzaWdtYV9NfSQkIA0KDQp3aGVyZSBkZW5vbWluYXRvciBpcyB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIG1lYW4NCg0KJCRcc2lnbWFfTSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JCQgDQoNCmBgYHtyfQ0KTSA9IG1lYW4oc2FtcGxlLjEpDQpNdSA9IDUwICMgZ2l2ZW4gdG8geW91IGZyb20gdGhlIHBvcHVsYXRpb24NCnNpZ21hID0gNSAjIGdpdmVuIHRvIHlvdSwgZG9uJ3QgdXNlIHNhbXBsZSBTRCBmb3Igei10ZXN0DQoNClp0ZXN0IDwtIChNIC0gTXUpIC8gKHNpZ21hL3NxcnQobikpDQpgYGANCg0KV2UgZ2V0IGEgJHpfe3Rlc3R9JD1gciByb3VuZChadGVzdCwzKWAsIHNvIGlzIHRoaXMgdmFsdWUgaW4gdGhlIHRhaWwgb2YgdGhlIHBvcHVsYXRpb24/IA0KDQojIyMgTWFrZSBhIERlY2lzaW9uDQoNClR3byBjaG9pY2VzOg0KDQotICoqUmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMqKiAtIHRoaXMgZGVjaXNpb24gY2FuIGJlIHJlYWNoZWQgd2hlbiB0aGUgZGF0YSBmYWxsIGluIHRoZSBjcml0aWNhbCByZWdpb24uICANCi0gVGhpcyBtZWFucyB0aGF0IHRoZSB0cmVhdG1lbnQgaGFzIHJlc3VsdGVkIGluIGEgbGlrZWx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9wdWxhdGlvbiBhbmQgdGhlIHNhbXBsZQ0KLSAqKldlIHJlamVjdCB0aGUgbnVsbCoqOiBpdCBpcyBlYXNpZXIgdG8gcHJvdmUgc29tZXRoaW5nIGZhbHNlIHRoYW4gdHJ1ZSANCi0gKipGYWlsIHRvIHJlamVjdCB0aGUgbnVsbCoqOiBpZiB0aGUgZGF0YSBkbyBub3QgcHJvdmlkZSBzdHJvbmcgZXZpZGVuY2UsIGkuZS4sIHRoZXkgZG8gbm90IGZhbGwgaW4gdGhlIGNyaXRpY2FsIHJlZ2lvbiwgdGhlbiB0aGUgdHJlYXRtZW50IGhhcyBubyBlZmZlY3QNCg0KLSBEb2VzIG91ciAkel97dGVzdH0kIGZhbGwgb3V0c2lkZSB0aGUgei1jcml0aWNhbCAoYWxwaGEgLjAwNSk/IA0KDQpgYGB7cn0NCmFscGhhPWMoLjAwNS8yKQ0Kei5jdXQubG93ZXI9cW5vcm0oYWxwaGEpDQp6LmN1dC51cHBlcj1xbm9ybShhbHBoYSkqLTENCnBsb3QoZGVuc2l0eShzY2FsZShQb3B1bGF0aW9uKSksDQogIG1haW49IlByb2JhYmlsaXR5IERlbnNpdHkgRnVuY3Rpb246IGEgPSAuMDA1IiwgDQogIHhsYWI9Ikh5cGVyYWN0aXZpdHkgU2NvcmUgW3otc2NvcmVdIiwgeWxhYj0iUHJvYmFiaWxpdHkiLCANCiAgeGxpbT1jKC00LjI1LCA0LjI1KSkNCmFibGluZSh2PXouY3V0Lmxvd2VyLCBjb2w9YygicHVycGxlIiksbHR5PWMoMSkpDQphYmxpbmUodj16LmN1dC51cHBlciwgY29sPWMoInB1cnBsZSIpLGx0eT1jKDEpKQ0KYWJsaW5lKHY9WnRlc3QsIGNvbD1jKCJyZWQiKSxsdHk9YygyKSkNCmBgYA0KDQoqKllFUywgb3VyIHp0ZXN0ID4gemNyaXRpY2FsLCBzbyB3ZSBSRUpFQ1QgdGhlIG51bGwqKg0KDQotIFdlIHJlcG9ydCwgJHpfe3Rlc3R9JD1gciByb3VuZChadGVzdCwzKWAgJHAgPCAuMDA1JCBbbWVhbiAkcCA8IGEkXSANCi0gTW9kZXJuIEFQQSBpcyByZXBvcnQgZXhhY3QgUHZhbHVlDQoNCmBgYHtyfQ0KUC50d28udGFpbGVkPTIqcG5vcm0oLWFicyhadGVzdCkpDQpQLm9uZS50YWlsZWQ9cG5vcm0oLWFicyhadGVzdCkpDQpgYGANCg0KJHpfe3Rlc3R9JD1gciByb3VuZChadGVzdCwzKWAsICRwID0kIGByIHJvdW5kKFAudHdvLnRhaWxlZCw1KWANCg0KLSBCdXQgd2Ugcm91bmQgaXQgKGZvbGxvdyBBUEEgcnVsZXMpDQoNCiMjIFVuY2VydGFpbnR5IGFuZCBFcnJvciBpbiBIeXBvdGhlc2lzIFRlc3RpbmcNCg0KLSBIeXBvdGhlc2lzIHRlc3RpbmcgaXMgYW4gaW5mZXJlbnRpYWwgcHJvY2VzcyBiZWNhdXNlIHdlIGRvIE5PVCBrbm93IHRoZSBhY3R1YWwgcG9wdWxhdGlvbiBkYXRhIGFuZCBvdXIgc2FtcGxlcyBjb3VsZCBiZSBpbiBlcnJvciAgDQotIFdoZW4gd2UgaW5mZXIgd2UgY2FuIG1ha2UgdHdvIChhdCBsZWFzdCkgdHlwZXMgb2YgZXJyb3JzICh0aGVyZSBhcmUgb3RoZXJzKS4NCg0KDQojIyMgVHlwZSBJIEVycm9yDQotIEFsc28gY2FsbGVkIGZhbHNlIGFsYXJtIG9yIGFscGhhIGVycm9yDQotIFRoaXMgb2NjdXJzIHdoZW4gYSByZXNlYXJjaGVyIHJlamVjdHMgYSBudWxsIGh5cG90aGVzaXMgdGhhdCBpcyBhY3R1YWxseSBUUlVFLiAgaS5lLiwgd2UgcmVqZWN0IHRoZSBudWxsIGV2ZW4gdGhvdWdoIHRoZSB0cmVhdG1lbnQgZG9lcyBOT1RISU5HDQotIEV4YW1wbGUsIFRlc3RpbmcgemluYyBvciBDb2xkRWFzZSBvbiBjb2xkcyB1c2luZyBzZWxmLXJlcG9ydCBhcyBhIG1lYXN1cmUgb2YgaW1wcm92ZW1lbnQNCi0gVHlwZSAxIGVycm9yLCBhbHRob3VnaCBzZXJpb3VzLCBhcmUgbWluaW1pemVkIGJ5IGJlY2F1c2UgcmVzZWFyY2hlcnMgdXNlIGEgc3RyaW5nZW50IGNyaXRlcmlvbi4NCi0gQWxwaGEgbGV2ZWwgYWxzbyBzZXRzIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIDEgb2NjdXJyaW5nLiANCg0KIyMjIFR5cGUgSUkgRXJyb3INCi0gQWxzbyBjYWxsZWQgbWlzcyBvciBiZXRhIGVycm9yDQotIFR5cGUgSUkgZXJyb3Igb2NjdXJzIHdoZW4gYSByZXNlYXJjaGVyIGZhaWxzIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgaXMgcmVhbGx5IGZhbHNlLiANCi0gSW4gb3RoZXIgd29yZHMsIHR5cGUgSUkgZXJyb3IgaXMgd2hlbiB0aGUgdHJlYXRtZW50IGhhcyBhbiBlZmZlY3QgYW5kIGl0IHNlZW1zIGxpa2UgdGhlIHRyZWF0bWVudCBoYXMgaGFkIG5vIGVmZmVjdCBiZWNhdXNlIHRoZSBoeXBvdGhlc2lzIHRlc3QgZmFpbHMgdG8gZGV0ZWN0IGl0DQotIFRoaXMgb2NjdXJzIGJlY2F1c2UgdGhlIHNhbXBsZSBtZWFuIGlzIG5vdCBpbiB0aGUgY3JpdGljYWwgcmVnaW9uLiBUaGUgdHJlYXRtZW50IHdvcmtlZCBidXQgaGFkIGEgc21hbGwgZWZmZWN0LiANCi0gRXhhbXBsZSwgVGFraW5nIGthdmEgdGVhIHRvIHJlZHVjZSBzdHJlc3MgDQoNCg0KWW91ciBkZWNpc2lvbiB8IFRyZWF0bWVudCBkb2VzIG5vdCB3b3JrICgkSF8wJD1UUlVFKSB8IFRyZWF0bWVudCBkb2VzIHdvcmsgKCRIXzAkPUZBTFNFKQ0KLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0NClJlamVjdCAkSF8wJCAgfCBUeXBlIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb3JyZWN0IERlY2lzaW9uDQpSZXRhaW4gJEhfMCQgIHwgQ29ycmVjdCBEZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgIHwgVHlwZSBJSQ0KDQojIyBEb2VzIG91ciBhbHBoYSBzZXQgdGhlIGVycm9yL21pc3MgbGV2ZWw/DQotIFRoZSBhbnN3ZXIgaXMgaXQgZGVwZW5kcy4gV2Ugd2lsbCByZXR1cm4gdGhpcyBpc3N1ZSB3aGVuIHdlIHRhbGsgYWJvdXQgKnN0YXRpc3RpY2FsIHBvd2VyKg0KDQoNCiMjIyBPdGhlciB0eXBlcyBvZiBFcnJvcg0KDQotIFR5cGUgSUlJIGFuZCBUeXBlIElWIGVycm9ycyBhcmUgbm90IHByb2JsZW1zIHdpdGggcHJvY2VkdXJlcyBvZiB0aGUgTkhTVCwgdGhleSBhcmUgInVzZXIgZXJyb3JzIi4gVGhlcmUgYXJlIG5vIHNpbmd1bGFyIGRlZmluaXRpb25zLCBidXQgbW9zdCBhcmUgc2ltaWxhcjogDQoNCioqVHlwZSBJSUkgZXJyb3I6KioNCg0KLSBPcHRpb24gMTogdGhlIHJpZ2h0IGFuc3dlciB0byB0aGUgd3JvbmcgcHJvYmxlbSAoS2ltYmFsbCAxOTU3LCBwLiAxMzQpIA0KbGlrZSB3aGVuIGh1bnRpbmcgZm9yIGdob3N0cyAtIG15IEVsZWN0cm9tYWduZXRpYyBtZXRlciBpcyBiZWVwaW5nLCB0aGF0IG1lYW5zIHRoZXJlIGFyZSBnaG9zdHMgaGVyZS4NCi0gT3B0aW9uIDI6IGVycm9yIG9jY3VycyB3aGVuIHlvdSBjb3JyZWN0bHkgY29uY2x1ZGUgdGhhdCB0aGUgdHdvIGdyb3VwcyBhcmUgc3RhdGlzdGljYWxseSBkaWZmZXJlbnQsIGJ1dCB5b3UgYXJlIHdyb25nIGFib3V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIGRpZmZlcmVuY2UgKFZlcnkgcmFyZSBidXQgY2FuIGhhcHBlbiBjYXVzZSBvZiBzbWFsbCBzYW1wbGluZykNCiAgDQoqKlR5cGUgSVYgZXJyb3I6KiogbG90cyBvZiBzdWdnZXN0aW9ucyBmb3Igd2hhdCBpdCBzaG91bGQgYmU6DQoNCi0gd2hlbiBhIHN0YXRpc3RpY2lhbiBwZXJmb3JtcyB0aGUgY29ycmVjdCBhbmFseXNpcyB0aGF0IGFuc3dlcnMgdGhlIHJpZ2h0IHJlc2VhcmNoIHF1ZXN0aW9ucyB3aGVuIGEgc2ltcGxlciBhbmFseXNpcyB3b3VsZCBzdWZmaWNlDQotIGFza2luZyB0aGUgd3JvbmcgcXVlc3Rpb24NCi0gRm9sbG93aW5nIHVwIGFuIEFOT1ZBIGludGVyYWN0aW9uIHRoZSB3cm9uZyB3YXkNCg0KIyMgRmFjdG9ycyB0aGF0IEluZmx1ZW5jZSBhIEh5cG90aGVzaXMgWi1UZXN0IA0KLSBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNhbXBsZSBtZWFuIGFuZCBwb3B1bGF0aW9uIG1lYW4NCi0gU2FtcGxlIHNpemUNCg0KIyMgQXNzdW1wdGlvbnMNCi0gQWxsIHN0YXRpc3RpY2FsIHRlc3RzIGFyZSBiYXNlZCBvbiBhc3N1bXB0aW9ucy4NCi0gSWYgeW91IGZhaWwgdG8gbWVldCB0aGUgYXNzdW1wdGlvbnMsIHRoZW4gdGhlIHRlc3QgaXMgY29tcHJvbWlzZWQNCi0gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBkb2VzIG5vdCBjaGFuZ2Ugd2l0aCB0aGUgdHJlYXRtZW50DQotIFRoZSBzYW1wbGUgbXVzdCBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgcG9wdWxhdGlvbi4NCg0KIyMjIFJhbmRvbSBTYW1wbGluZyAmIEluZGVwZW5kZW50IE9ic2VydmF0aW9ucw0KVHdvIG9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgaWYgdGhlcmUgaXMgbm8gY29uc3RhbnQsIHByZWRpY3RhYmxlIHJlbGF0aW9uc2hpcCB0aGF0IG9jY3VycyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHZhcmlhYmxlDQoNCi0gSW4gb3RoZXIgd29yZHMsIGVhY2ggdGltZSB5b3UgZmxpcCBhIGZhaXIgY29pbiwgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgaGVhZHMgb24gZWFjaCBmbGlwIGlzIHRoZSBzYW1lLiANCi0gRWFjaCBjb2luIGZsaXAgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHByZWNlZGluZyBmbGlwDQoNCioqT3RoZXJ3aXNlIHlvdXIgZGF0YSBlbmRzIHVwIGxpa2UgdGhlIEFzY2ggc3R1ZGllcyBvbiBzb2NpYWwgY29uZmlybWF0b3J5KioNCg0KIyBPbmUtc2FtcGxlIHQtdGVzdA0KDQpXaGF0IGRvIHlvdSBkbyBpZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggc21hbGwgc2FtcGxlcyBhbmQgeW91IGFyZSBtaXNzaW5nIHBvcHVsYXRpb24gaW5mb3JtYXRpb24/IFRoaXMgaXMgdGhlIGNlbnRyYWwgcHJvYmxlbSB3ZSBmYWNlIGluIHBzeWNob2xvZ3kuIA0KDQojIyBHb3NzZXQncyBGaXJzdCBQcm9ibGVtDQotIEhvdyB0byB1c2Ugei10ZXN0cyBvbiBzbWFsbCBzYW1wbGVzDQoNCipCYXNpYyBBc3N1bXB0aW9uOiogDQoNCkdvc3NldCdzIHByb2JsZW06ICRcc2lnbWEgPSA/JA0KDQokJFxzaWdtYV9NID0gXGZyYWN7XHNpZ21hfXtcc3FydHtOfX0kJA0KDQpHb3NzZXQncyBzb2x1dGlvbg0KDQokJCBcc2lnbWEgXGFwcHJveCB7U30kJA0KDQpUaHVzLCANCg0KJCRcc2lnbWFfTSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19IFxhcHByb3ggU19NID1cZnJhY3tTfXtcc3FydHtufX0kJA0KDQpTbyB0aGUgei10ZXN0LA0KDQokJHpfe3Rlc3R9ID0gXGZyYWN7TSAtIFxtdX17XHNpZ21hX019JCQgDQoNCmJlY29tZXMsIFN0dWRlbnQncyAqdCotdGVzdA0KDQokJHQgPSBcZnJhY3tNIC0gXG11fXtTX019JCQgDQoNCldoYXQgaXMgJFxtdSQ/IFlvdSB3b3VsZCBzZXQgaXQgYmFzZWQgb24gdGhlIHRydWUgb3IgaHlwb3RoZXNpemVkIHZhbHVlLiAgT2Z0ZW4gd2Ugc2V0IGl0IGF0ICRcbXU9MCQsIG9yIHNheSBpbiB0aGUgY2FzZSBvZiBJUSwgJFxtdT0xMDAkLiBJdCBkZXBlbmRzIG9uIHlvdXIgc3BlY2lmaWMgcXVlc3Rpb24uIA0KDQojIyBHb3NzZXQncyBTZWNvbmQgUHJvYmxlbQ0KDQpDYW4gd2Uga2VlcCBhc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIHBvcHVsYXRpb25zIHRvIHNhbXBsZXM/DQoNCj4gQW5zd2VyOiBObywgYmVjYXVzZSB3ZSBrbm93IHdoZW4gd2Ugc2FtcGxlIGZldyBwZW9wbGUgYXJlIGVzdGltYXRlcyBhcmUgYmFkLiAgU28gaGUgY3JlYXRlZCB0aGUgdC1kaXN0cmlidXRpb24gKGNhbGxlZCBzdHVkZW50J3MgZGlzdHJpYnV0aW9uKS4gVGhlIHQtZGlzdHJpYnV0aW9uIGlzIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIGFkanVzdGluZyBpdHMgc2hhcGUgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgaW4gc21hbGwgc2FtcGxlcyB5b3UgZXN0aW1hdGVkIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZnJvbSB0aGUgc2FtcGxlLiANCg0KYGBge3J9DQp4IDwtIHNlcSgtNCwgNCwgbGVuZ3RoPTEwMCkNCmh4IDwtIGRub3JtKHgpDQoNCmRlZ2YgPC0gYygxLCA1LCAzMCkNCmNvbG9ycyA8LSBjKCJyZWQiLCAiYmx1ZSIsICJkYXJrZ3JlZW4iLCAiYmxhY2siKQ0KbGFiZWxzIDwtIGMoImRmPTEiLCAiZGY9NSIsICJkZj0zMCIsICJub3JtYWwiKQ0KDQpwbG90KHgsIGh4LCB0eXBlPSJsIiwgbHR5PTEsIHhsYWI9InggdmFsdWUiLA0KICB5bGFiPSJEZW5zaXR5IiwgbWFpbj0iQ29tcGFyaXNvbiBvZiB0IERpc3RyaWJ1dGlvbnMiKQ0KDQpmb3IgKGkgaW4gMTo0KXsNCiAgbGluZXMoeCwgZHQoeCxkZWdmW2ldKSwgbHR5PWkrMSwgbHdkPTEsIGNvbD1jb2xvcnNbaV0pDQp9DQoNCmxlZ2VuZCgidG9wcmlnaHQiLCBpbnNldD0uMDUsIHRpdGxlPSJEaXN0cmlidXRpb25zIiwNCiAgbGFiZWxzLCBsd2Q9MSwgbHR5PWMoMiwgMywgNCwgMSksIGNvbD1jb2xvcnMpDQoNCiMgYWRhcHRlZCBmcm9tIGh0dHA6Ly93d3cuc3RhdG1ldGhvZHMubmV0L2FkdmdyYXBocy9wcm9iYWJpbGl0eS5odG1sDQpgYGANCg0KLSBXZSBjYW4gcGxheSB3aXRoIHRoaXMgYXBwOiBodHRwczovL2dhbGxlcnkuc2hpbnlhcHBzLmlvL2Rpc3RfY2FsYy8NCg0KLSBUaGUgaW1wb3J0IHRoaW5nIGlzIHlvdSBuZWVkIHRvIG1vdmUgdGhlIGJvdW5kYXJpZXMgY2hhbmdlcyBhcyBhIGZ1bmN0aW9uIG9mIGZsYXRuZXNzIG9mIHRoZSBjdXJ2ZSAoZGYpOiB5b3Ugd2FudCB0byBrZWVwIHRoZSBhbHBoYSB0aGUgc2FtZSB1bmRlciB0aGUgY3VydmUsIHRoaXMgdGhlIGNyaXRpY2FsIHJlZ2lvbnMgY2hhbmdlLiBTbyBERiBpcyBuZWVkZWQgZ2V0IHRvIHRjcml0Lg0KLSAkYSA9IC4wNSQsIHR3by10YWlsZWQuIFJlbWVtYmVyIFskeiA9IDEuOTYkXQ0KDQpgYGB7cn0NCmFscGhhID0gLjA1LzINCg0KemNyaXQgPC0gLXFub3JtKGFscGhhKQ0KDQojY3JlYXRlIGRlZ3JlZXMgb2YgZnJlZWRvbQ0KZGZzIDwtIHNlcSgxLCAzMCwgYnk9MSkNCnRjcml0IDwtIC1xdChhbHBoYSxkZnMpDQoNCnBsb3QoZGZzLCB0Y3JpdCwgdHlwZT0ibCIsIGx0eT0xLCB4bGFiPSJEZWdyZWVzIG9mIEZyZWVkb20iLA0KICB5bGFiPSJ0LWNyaXQiLCBtYWluPSJBbHBoYSA9IC4wNSIpDQphYmxpbmUoaD16Y3JpdCwgY29sPSJyZWQiKQ0KDQpgYGANCg0KVGh1cyAkdGNyaXQgXGFwcHJveCB6Y3JpdCQsIGFzICRuIFxSaWdodGFycm93IGluZiQNCg0KDQojIyBDb25maWRlbmNlIGludGVydmFscw0KLSBXaGF0IHJhbmdlIG9mIHZhbHVlcyBjYW4gd2UgYXNzZXJ0IHdlIGFyZSA5NSUgY29uZmlkZW50IGluY2x1ZGVzIHRoZSB0cnVlIHBvcHVsYXRpb24gcGFyYW1ldGVyPw0KLSBPbmUtc2FtcGxlIHQtdGVzdCBDSQ0KDQokJFxtdV97ZWZmZWN0fSA9IE0gXHBtIHRfe2NyaXR9KlNfTSQkDQoNCiRcbXVfe2VmZmVjdH0kIHdvdWxkIGJlIHdpdGhpbiAkXHBtJCBjcml0aWNhbCB0dmFsdWVzIGFuZCBzdGFuZGFyZCBlcnJvciBvZiB5b3UgZGF0YS4gVGhlIHNtYWxsZXIgeW91ciBzYW1wbGUgdGhlIGxhcmdlciB0aGUgQ0kuIFRvIGdldCA5NSVDSSB5b3Ugd291bGQgc2V0IHlvdXIgYWxwaGEgdG8gLjA1IHRvIGdldCB5b3VyIHQtY3JpdGljYWwuICAgDQoNCiMjIyBJbnRlcnByZXQgQ0lzDQotIEhvdCBkZWJhdGUgb3ZlciB3aGF0IHRoZXkgbWVhbiAoc2VlIE1pbGxlciAmIFVscmljaCwgMjAxNiB2cyBNb3JleSwgSG9la3N0cmEsIFJvdWRlciwgJiBXYWdlbm1ha2VycywgMjAxNikNCi0gQm90aCB0aGUgd29yZCAicHJvYmFiaWxpdHkiIGFuZCB0aGUgd29yZCAiY29uZmlkZW5jZSIgaGF2ZSBtZWFuaW5ncyBvdXRzaWRlIG9mIHRoZWlyIHRlY2huaWNhbCBvbmVzIGluIGZyZXF1ZW50aXN0IHN0YXRpc3RpY3MgY2F1c2luZyBtaXNzLXVuZGVyc3RhbmRpbmdzLg0KDQoqKkhvdyB0byBpbnRlcnByZXQgQ0lzKioNCg0KLSBEb2VzIGl0IGFjdHVhbGx5IHJlcHJlc2VudCB0aGUgIkNvbmZpZGVuY2UiIHJhbmdlIHdoaWNoIGluY2x1ZGVzIHRoZSBwb3B1bGF0aW9uIGRhdGE/IFthcyBJIGRlZmluZWQgaXQgYWJvdmU/XQ0KLSBUcmVhdCB0aGVtIGp1c3QgbGlrZSBOSFNUPyBbd2hhdCBtb3N0IHBlb3BsZSBkb106IEludGVycHJldCB0aGUgaW50ZXJ2YWwgYXMgYWxsIHRoZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3QgYmUgcmVqZWN0ZWQgYnkgYSBwYXJ0aWN1bGFyIHNpZ25pZmljYW5jZSB0ZXN0Lg0KLSBGb2xsb3cgTmV5bWFuPyBBdm9pZCB0aGUgcHJvYmxlbSBieSBub3QgaW50ZXJwcmV0aW5nIENJcyBhdCBhbGwgLSAidGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgYXNzZXJ0cyBub3RoaW5nIGV4Y2VwdCB0aGF0IGl0IGlzIGEgc2FtcGxlIGZyb20gYSBjb25maWRlbmNlIHByb2NlZHVyZS4iIFtObyBvbmUgd2lsbCBhY2NlcHQgdGhpcywgYnV0IGhpcyBwb2ludCBpcyB3ZWxsIHRha2VuXQ0KLSBEbyBCYXllc2lhbiBzdGF0cyBvbmx5PyBbWWVhaCwgZ29vZCBsdWNrIGRlYWxpbmcgd2l0aCByZXZpZXdlcnNdDQotIEkgcHJlZmVyIHRvIGF2b2lkIGNsYXNzaWNhbCBDSXMgYW5kIGluc3RlYWQgdXNlIGJvb3RzdHJhcHBlZCBDSXMgW3dlIHdpbGwgY29tZSBiYWNrIHRvIHRob3NlIGxhdGVyXQ0KDQoNCiMjIEV4YW1wbGUgb2Ygb25lLXNhbXBsZSB0LXRlc3QNCi0gV2Ugd2lsbCBjb21wYXJlIElRIChzcGF0aWFsIHJlYXNvbmluZykgb2YgcGVvcGxlIHJpZ2h0IGFmdGVyIHRoZXkgbGlzdGVuIHRvIFtNb3phcnQncyBTb25hdGEgZm9yIFR3byBQaWFub3MgaW4gRCBNYWpvciBLLiA0NDhdKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9YmFTNW55OFRMaTgpLiAoUmF1c2NoZXIgZXQgYWwuLCAxOTkzKQ0KDQpgYGB7cn0NCnNldC5zZWVkKDQyKQ0KIyBleHRhY3QgYSBzYW1wbGUgb2YgMzAgcGVvcGxlLCB0aGF0IGhhcyArOSBlZmZlY3Qgb24gSVENCm4gPSAzMA0KTWVhbklRLmVmZmVjdCA9IDEwOQ0KU0RJUSA9IDE1DQpNb3phcnQuU2FtcGxlIDwtIHJub3JtKG4sTWVhbklRLmVmZmVjdCxTRElRKQ0KaGlzdChNb3phcnQuU2FtcGxlLCB4bGFiPSJJUSBzY29yZXMiLG1haW49Ik1vemFydCBFZmZlY3QiKQ0KYGBgDQoNCmBgYHtyfQ0KIyB0LXRlc3QNCj90LnRlc3QNCk1vemFydC50LnRlc3Q8LXQudGVzdChNb3phcnQuU2FtcGxlLA0KICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksDQogICAgICAgbXUgPSAxMDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBUUlVFLA0KICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQ0KTW96YXJ0LnQudGVzdCAjY2FsbCB0aGUgcmVzdWx0cw0KYGBgDQoNCiMgSW5kZXBlbmRlbnQgU2FtcGxlcyB0LXRlc3QNCi0gd2hhdCBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgcG9wdWxhdGlvbiB0byBjb21wYXJlIHRvLCBidXQgbmVlZCB0byBlc3RpbWF0ZSB0aGVpciAkXG11JCB2aWEgYSBjb250cm9sIG9yIGNvbXBhcmlzb24gZ3JvdXA/IA0KLSBJbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdA0KLSBUaGUgZ29hbCBvZiBhIGJldHdlZW4tc3ViamVjdHMgcmVzZWFyY2ggc3R1ZHkgaXMgdG8gZXZhbHVhdGUgdGhlIG1lYW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb3B1bGF0aW9ucyAob3IgYmV0d2VlbiB0d28gdHJlYXRtZW50IGNvbmRpdGlvbnMpLg0KDQokJCBIXzA6IFxtdV8xID0gXG11XzIgJCQgDQokJCBIXzE6IFxtdV8xIFxuZXEgXG11XzIgJCQgDQp3aGVyZSwgJFxtdV8xJCA9IEV4cGVyaW1lbnRhbCBhbmQgJFxtdV8yJCA9IENvbnRyb2wNCg0KIyMgRXJyb3IgdGVybQ0KLSBUaGUgc2luZ2xlLXNhbXBsZSBzdGFuZGFyZCBlcnJvciwgJFNfTSQgbWVhc3VyZXMgaG93IG11Y2ggZXJyb3IgZXhwZWN0ZWQgYmV0d2VlbiAkTSQgYW5kICRcbXUkLg0KLSBUaGUgaW5kZXBlbmRlbnQtc2FtcGxlcyBzdGFuZGFyZCBlcnJvciAoJFNfe00xIC0gTTJ9JCkgbWVhc3VyZXMgaG93IG11Y2ggZXJyb3IgaXMgZXhwZWN0ZWQgd2hlbiB5b3UgYXJlIHVzaW5nIGEgc2FtcGxlIG1lYW4gZGlmZmVyZW5jZSAoJE0xIC0gTTIkKSB0byByZXByZXNlbnQgYSBwb3B1bGF0aW9uIG1lYW4gZXJyb3IuDQoNCiMjIyBFcXVhbCBzYW1wbGUgc2l6ZXMgDQokJCBTX3tNMSAtIE0yfSA9ICBcc3FydHtcZnJhY3tTXjJfMX17bl8xfSsgXGZyYWN7U14yXzJ9e25fMn19JCQgDQoNCi0gRWFjaCBvZiB0aGUgdHdvLXNhbXBsZSBtZWFucyByZXByZXNlbnRzIGl0cyBvd24gcG9wdWxhdGlvbiBtZWFuLCBidXQgaW4gZWFjaCBjYXNlLCB0aGVyZSBpcyBzb21lIGVycm9yLiAgDQotIFRoZSBhbW91bnQgb2YgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGVhY2ggc2FtcGxlIG1lYW4gY2FuIGJlIG1lYXN1cmVkIGJ5IGNvbXB1dGluZyB0aGUgc3RhbmRhcmQgZXJyb3JzLg0KLSBUbyBjYWxjdWxhdGUgdGhlIHRvdGFsIGFtb3VudCBvZiBlcnJvciBpbnZvbHZlZCBpbiB1c2luZyB0d28gc2FtcGxlIG1lYW5zIHRvIGFwcHJveGltYXRlIHR3byBwb3B1bGF0aW9uIG1lYW5zLCB3ZSB3aWxsIGZpbmQgdGhlIGVycm9yIGZyb20gZWFjaCBzYW1wbGUgc2VwYXJhdGVseSBhbmQgdGhlbiBhZGQgdGhlIHR3byBlcnJvcnMgdG9nZXRoZXIuDQogLSBUaGlzIGZvcm11bGEgb25seSB3b3JrcyB3aGVuIHNhbXBsZSBzaXplcyBhcmUgZXF1YWwuIA0KLSBXaGVuIHRoZSB0d28gc2FtcGxlcyBhcmUgZGlmZmVyZW50IHNpemVzLCB0aGlzIGZvcm11bGEgaXMgYmlhc2VkLiAgDQotIFRoaXMgY29tZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBmb3JtdWxhIGFib3ZlIHRyZWF0cyB0aGUgdHdvIHNhbXBsZSB2YXJpYW5jZXMgZXF1YWxseS4gIEJ1dCB3ZSBrbm93IHRoYXQgdGhlIHN0YXRpc3RpY3Mgb2J0YWluZWQgZnJvbSBsYXJnZSBzYW1wbGVzIGFyZSBiZXR0ZXIgZXN0aW1hdGVzLCBzbyB3ZSBuZWVkIHRvIGdpdmUgbGFyZ2VyIHNhbXBsZXMgbW9yZSB3ZWlnaHQgaW4gb3VyIGVzdGltYXRlZCBzdGFuZGFyZCBlcnJvci4NCg0KDQojIyMgVW5lcXVhbCBzYW1wbGUgc2l6ZXMgDQotIFdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIGZvcm11bGEgc2xpZ2h0bHkgc28gdGhhdCB3ZSB1c2UgdGhlIHBvb2xlZCBzYW1wbGUgdmFyaWFuY2UgaW5zdGVhZCBvZiB0aGUgaW5kaXZpZHVhbCBzYW1wbGUgdmFyaWFuY2VzLg0KJCQgU14yX3AgPSAgXGZyYWN7U1NfMStTU18yfXtkZl8xK2RmXzJ9JCQgDQoNCi0gVGhpcyBwb29sZWQgdmFyaWFuY2UgaXMgZ29pbmcgdG8gYmUgYSB3ZWlnaHRlZCBlc3RpbWF0ZSBvZiB0aGUgdmFyaWFuY2UgZGVyaXZlZCBmcm9tIHRoZSB0d28gc2FtcGxlcy4NCg0KJCQgU197TTEgLSBNMn0gPSAgXHNxcnR7XGZyYWN7U14yX3B9e25fMX0rIFxmcmFje1NeMl9wfXtuXzJ9fSQkIA0KDQojIyBGb3JtdWxhDQoNCiQkICB0ID0gXGZyYWN7TV8xIC0gTV8yIC0gKFxtdV8xIC0gXG11XzIpfSB7U197TTEgLSBNMn19JCQNCldoZXJlLCAkXG11XzEgLSBcbXVfMiA9IDAkDQoNCmFuZCAkZGYgPSAobl8xIC0gMSkgKyAobl8yLTEpJA0KDQojIyBDb25maWRlbmNlIEludGVydmFscyBmb3IgSW5kZXBlbmRlbnQgU2FtcGxlcw0KDQokJCBcbXVfe2VmZmVjdH0gPSAoTV8xLU1fMikgXHBtIHRfe2NyaXR9KlNfe00xIC0gTTJ9JCQNCg0KIyMgRXhhbXBsZSBvZiBJbmRlcGVuZGVudCBTYW1wbGVzIHQtdGVzdA0KLSBXZSB3aWxsIGNvbXBhcmUgSVEgKHNwYXRpYWwgcmVhc29uaW5nKSBvZiBwZW9wbGUgcmlnaHQgYWZ0ZXIgdGhleSBsaXN0ZW4gdG8gTW96YXJ0J3MgU29uYXRhIGZvciBUd28gUGlhbm9zIGluIEQgTWFqb3IgSy4gNDQ4IHRvIGEgY29udHJvbCBncm91cCB3aG8gbGlzdGVuZWQgdG8gW0JhY2gncyBCcmFuZGVuYnVyZyBDb25jZXJ0byBOby4gNiBpbiBCIGZsYXQgbWFqb3IsIEJXViAxMDUxIENvbmNlcnRvXShodHRwczovL3lvdXR1LmJlL0NleEpROFZXSmZZP3Q9MTVzKS4gIElmIHRoZSBlZmZlY3QgaXMgZm9yIE1vemFydCBvbmx5LCB3ZSBzaG91bGQgbm90IHNlZSBpdCB3b3JrIHdoZW4gbGlzdGVuaW5nIHRvIEJhY2ggKG1hdGNoZWQgb24gbW9kYWxpdHkgJiB0ZW1wbywgYW5kIGNvbXBsZXhpdHkgb2YgZHVlbGluZyB2b2ljZXMpIA0KDQpgYGB7cn0NCnNldC5zZWVkKDY2NikNCiMgZXh0YWN0IGEgc2FtcGxlIG9mIDMwIHBlb3BsZSwgdGhhdCBoYXMgKzkgZWZmZWN0IG9uIElRDQpuID0gMzANCk1vemFydElRLmVmZmVjdCA9IDEwOQ0KU0RJUSA9IDE1DQpNb3phcnQuU2FtcGxlLjIgPC0gcm5vcm0obixNb3phcnRJUS5lZmZlY3QsU0RJUSkNCg0KQmFjaElRLmVmZmVjdCA9IDExMA0KU0RJUSA9IDE1DQpCYWNoLlNhbXBsZSA8LSBybm9ybShuLEJhY2hJUS5lZmZlY3QsU0RJUSkNCg0KaGlzdChNb3phcnQuU2FtcGxlLjIsIHhsYWI9IklRIHNjb3JlcyIsbWFpbj0iTW96YXJ0IEVmZmVjdCIseGxpbSA9IGMoNzAsMTYwKSkNCmhpc3QoQmFjaC5TYW1wbGUsIHhsYWI9IklRIHNjb3JlcyIsbWFpbj0iQmFjaCBFZmZlY3QiLHhsaW0gPSBjKDcwLDE2MCkpDQoNCg0KYGBgIA0KIA0KYGBge3J9DQojIHQtdGVzdA0KTXZzQi50LnRlc3Q8LXQudGVzdCh4PSBNb3phcnQuU2FtcGxlLjIsIHk9IEJhY2guU2FtcGxlLA0KICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksDQogICAgICAgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IFRSVUUsDQogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpDQpNdnNCLnQudGVzdCAjY2FsbCB0aGUgcmVzdWx0cw0KDQpgYGANCiANClNvLCB3ZSBjYW5ub3QgcmVqZWN0IHRoZSBudWxsOiBCYWNoIGFuZCBNb3phcnQgZ3JvdXAgaGFkIHRoZSBzYW1lIG1lYW5zIChwID4gLjA1ICYgQ0lzIGluY2x1ZGUgMCkuIEJ1dCB3ZSBjYW5ub3QgY29uY2x1ZGUgdGhhdCBNb3phcnQgaXMgbm90IHNwZWNpYWwsIGJ1dCBtYXliZSBCYWNoIGlzIHNwZWNpYWwgdG9vPyBUaGUgc2hvcnQgYW5zd2VyIGlzIHRoYXQgTW96YXJ0IHdhcyBub3Qgc3BlY2lhbCBpdCB3YXMgYW4gYXJvdXNhbCBlZmZlY3QgKFRob21wc29uIGV0IGFsLiwgMjAwMSkuIA0KDQoNCiMjIEFzc3VtcHRpb25zIA0KLSBPYnNlcnZhdGlvbiB3aXRoaW4gZWFjaCBzYW1wbGUgbXVzdCBiZSBpbmRlcGVuZGVudA0KLSBUaGUgdHdvIHBvcHVsYXRpb25zIGZyb20gd2hpY2ggdGhlIHNhbXBsZXMgYXJlIHNlbGVjdGVkIG11c3QgYmUgbm9ybWFsICANCi0gVGhlIHR3byBwb3B1bGF0aW9ucyBmcm9tIHdoaWNoIHRoZSBzYW1wbGVzIGFyZSBzZWxlY3RlZCBtdXN0IGhhdmUgZXF1YWwgdmFyaWFuY2UNCi0gKipIb21vZ2VuZWl0eSBvZiB2YXJpYW5jZSoqIC0gdHdvIHBvcHVsYXRpb25zIGJlaW5nIGNvbXBhcmVkIG11c3QgaGF2ZSB0aGUgc2FtZSB2YXJpYW5jZQ0KLSBXZSBjYW4gcG9vbCBvdXIgdmFyaWFuY2UgYmVjYXVzZSBpdCByZXByZXNlbnRzIHRoZSBzYW1lIHBvcHVsYXRpb24gKHRoaXMgc2F0aXNmaWVzIGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlKSANCi0gSWYgeW91ciBzYW1wbGVzIHJlcHJlc2VudCBUV08gRElGRkVSRU5UIHBvcHVsYXRpb24geW91IGNhbm5vdCBwb29sIHlvdXIgdmFyaWFuY2UgKGxpa2UgYXBwbGVzIGFuZCBvcmFuZ2VzKQ0KDQoNCiMjIyBUZXN0aW5nIEhvbW9nZW5laXR5IG9mIFZhcmlhbmNlIA0KLSBIYXJ0bGV5J3MgRi1tYXggdGVzdCBvciBMZXZlbmUncyBGIHRlc3QNCi0gSGFydGxleSBpcyBlYXN5IHRvIGRvIGJ5IGhhbmQgDQoNCiQkRl97bWF4fSA9IFxmcmFje3NeMl97bGFyZ2VyfX17c14yX3tzbWFsbGVyfX0kJA0Kd2hlcmUgJGRmID0gbi0xJCwgYXNzdW1lcyBlcXVhbCBzYW1wbGVzIHBlciBncm91cCwgSyA9IDIgW2xvb2sgdXAgdmFsdWVzIGluIHRhYmxlcyBpbiB0aGUgYm9va10NCg0KLSBGb3IgTGV2ZW5lJ3MgdGVzdCwgd2UgbmVlZCB0byBpbnN0YWxsIHRoZSBjYXIgcGFja2FnZSwgeW91IHdvdWxkIHJ1biwgaW5zdGFsbC5wYWNrYWdlcygnY2FyJykgb25seSBvbmNlICh1bnRpbCB5b3UgbWFudWFsbHkgdXBkYXRlIGl0IG9yIHVwZGF0ZSBSIGFuZCBuZWVkIHRvIHJlaW5zdGFsbCBpdCkuIA0KLSBUaGlzIHRlc3QgcmVxdWlyZXMgd2UgcmVmb3JtYXQgdGhlIGRhdGEgYSBiaXQuIFdlIG5lZWQgdG8gbWFrZSBhICJkYXRhLWZyYW1lIg0KDQpgYGB7cn0NCmxpYnJhcnkoY2FyKQ0KI1JlZm9ybWF0DQpNdXNpYy5TdHVkeTwtZGF0YS5mcmFtZSgNCiAgRFYgPSBjKE1vemFydC5TYW1wbGUuMixCYWNoLlNhbXBsZSksDQogIElWID0gYyhyZXAoIk1vemFydCIsbikscmVwKCJCYWNoIixuKSkNCikNCiMgZmlyc3QgNSBsaW5lcw0KaGVhZChNdXNpYy5TdHVkeSkgDQojIExldHMgbG9vayBhdCBib3hwbG90cyBxdWlja2x5DQpib3hwbG90KERWIH4gSVYsIGRhdGEgPSBNdXNpYy5TdHVkeSkNCiMgTG9hZCBmdW5jdGlvbnMgZnJvbSBDYXIgcGFja2FnZQ0KbGV2ZW5lVGVzdChEViB+IElWLCBkYXRhID0gTXVzaWMuU3R1ZHkpDQpgYGANCg0KLSBTZWVtcyB3ZSBoYXZlIGEgcHJvYmxlbS4gT25lIGdyb3VwIGlzIG1vcmUgdmFyaWFibGUgdGhhbiB0aGUgb3RoZXINCi0gV2UgY2Fubm90IGZpeCBIb21vZ2VuZWl0eSBvZiBWYXJpYW5jZSAoeW91IGNhbm5vdCB0cmFuc2Zvcm0gb25lIGdyb3VwLCBidXQgbm90IHRoZSBvdGhlciksIGJ1dCB3ZSBjYW4gbWFrZSBvdXIgdGVzdCBtb3JlIGNvbnNlcnZhdGl2ZSBieSBjb3JyZWN0aW5nIG91ciBkZWdyZWVzIG9mIGZyZWVkb20gYmFzZWQgb24gdGhlIGRlZ3JlZSBvZiB2YXJpYW5jZXMgbWlzbWF0Y2ggcGVyIHNhbXBsZSBzaXplIChiZWxvdyBpcyBhbiBleGFtcGxlIG9mIHRoaXMgdHlwZSBvZiBjb3JyZWN0aW9uKQ0KDQokJGRmX2MgPSBcZnJhY3soXGZyYWN7U14yXzF9e25fMX0rXGZyYWN7U14yXzJ9e25fMn0gKV4yfXt7XGZyYWN7U14yXzF9e1xmcmFje25fMX17bl8xLTF9fX0re1xmcmFje1NeMl8yfXtcZnJhY3tuXzJ9e25fMi0xfX19fSQkDQoNCiMjIFdlbGNoJ3MgdC10ZXN0IChjb3JyZWN0ZWQgZm9yIEhPVikNCi0gTm90ZSB3ZSBjYW4gZG8gb3VyIHQtdGVzdCBvbiBvdXIgZGF0YWZyYW1lIChyYXRoZXIgdGhhbiBvdXIgaW5kaXZpZHVhbCBzYW1wbGVzKQ0KLSB3ZSBzZXQgKip2YXIuZXF1YWw9RkFMU0UqKg0KDQpgYGB7cn0NCk12c0Iud2VsY2g8LXQudGVzdChEViB+IElWLCBkYXRhID0gTXVzaWMuU3R1ZHksDQogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwNCiAgICAgICBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsDQogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpDQpNdnNCLndlbGNoICNjYWxsIHRoZSByZXN1bHRzDQpgYGANCg0KLSBPdXIgREYgaXMgbm90IGEgc21hbGxlciAoYW5kIGEgZmFjdGlvbikNCi0gTm90IHRoZSBkZWZhdWx0IGluIFIgaXMgdG8gYXNzdW1lIEhPViBwcm9ibGVtcywgU1BTUyBzaG93cyB5b3UgYm90aCBhbmQgbGV0cyB5b3UgcGljaw0KDQpccGFnZWJyZWFrDQoNCiMgUmVmZXJlbmNlcw0KDQpNZWVobCwgUC4gRS4gKDE5NzgpLiBUaGVvcmV0aWNhbCByaXNrcyBhbmQgdGFidWxhciBhc3Rlcmlza3M6IFNpciBLYXJsLCBTaXIgUm9uYWxkLCBhbmQgdGhlIHNsb3cgcHJvZ3Jlc3Mgb2Ygc29mdCBwc3ljaG9sb2d5LiAqSm91cm5hbCBvZiBjb25zdWx0aW5nIGFuZCBjbGluaWNhbCBQc3ljaG9sb2d5KiwgNDYoNCksIDgwNi4NCg0KTWlsbGVyLCBKLiwgJiBVbHJpY2gsIFIuICgyMDE2KS4gSW50ZXJwcmV0aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzOiBBIGNvbW1lbnQgb24gSG9la3N0cmEsIE1vcmV5LCBSb3VkZXIsIGFuZCBXYWdlbm1ha2VycyAoMjAxNCkuICAqUHN5Y2hvbm9taWMgYnVsbGV0aW4gJiByZXZpZXcqLCAyMygxKSwgMTI0LTEzMC4NCg0KTW9yZXksIFIuIEQuLCBIb2Vrc3RyYSwgUi4sIFJvdWRlciwgSi4gTi4sICYgV2FnZW5tYWtlcnMsIEUuIEouICgyMDE2KS4gQ29udGludWVkIG1pc2ludGVycHJldGF0aW9uIG9mIGNvbmZpZGVuY2UgaW50ZXJ2YWxzOiByZXNwb25zZSB0byANCk1pbGxlciBhbmQgVWxyaWNoLiAqUHN5Y2hvbm9taWMgYnVsbGV0aW4gJiByZXZpZXcqLCAyMygxKSwgMTMxLTE0MC4JDQoNClJhdXNjaGVyLCBGLiBILiwgU2hhdywgRy4gTC4sICYgS3ksIEMuIE4uICgxOTkzKS4gTXVzaWMgYW5kIHNwYXRpYWwgdGFzayBwZXJmb3JtYW5jZS4gKk5hdHVyZSosIDM2NSg2NDQ3KSwgNjExLTYxMS4NCg0KVGhvbXBzb24sIFcuIEYuLCBTY2hlbGxlbmJlcmcsIEUuIEcuLCAmIEh1c2FpbiwgRy4gKDIwMDEpLiBBcm91c2FsLCBtb29kLCBhbmQgdGhlIE1vemFydCBlZmZlY3QuICpQc3ljaG9sb2dpY2FsIHNjaWVuY2UqLCAxMigzKSwgMjQ4LTI1MS4NCg0KPHNjcmlwdD4NCiAgKGZ1bmN0aW9uKGkscyxvLGcscixhLG0pe2lbJ0dvb2dsZUFuYWx5dGljc09iamVjdCddPXI7aVtyXT1pW3JdfHxmdW5jdGlvbigpew0KICAoaVtyXS5xPWlbcl0ucXx8W10pLnB1c2goYXJndW1lbnRzKX0saVtyXS5sPTEqbmV3IERhdGUoKTthPXMuY3JlYXRlRWxlbWVudChvKSwNCiAgbT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKG8pWzBdO2EuYXN5bmM9MTthLnNyYz1nO20ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxtKQ0KICB9KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJ2h0dHBzOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2FuYWx5dGljcy5qcycsJ2dhJyk7DQoNCiAgZ2EoJ2NyZWF0ZScsICdVQS05MDQxNTE2MC0xJywgJ2F1dG8nKTsNCiAgZ2EoJ3NlbmQnLCAncGFnZXZpZXcnKTsNCg0KPC9zY3JpcHQ+DQo=