How To Calculate Effect Size For A Priori
Annotation: At that place is some very complex R code used to generate today's lecture. I take hidden it in the PDF file. If you run into echo=FALSE
inside the RMD file it means that is the code y'all are not expected to sympathize or acquire. I volition explain the functions you will need to larn.
Probability is Fickle
Review: The standard error can be understood as the Standard deviation of Sample Means. To understand this let's generate a population for the Advanced Measures of Music Audiation (a test of college students tonal and rhythmic discrimination), \(\mu\) = 27, \(\sigma\) = 3.75 and view the PDF of the population. Nosotros can see beneath 95% of the X scores occur between most 19.65 & 34.35 on rhythmic discrimination.
Now lets draw 10 samples of \(due north = 13\) people per sample. In other words, x information collections with xiii people where we measure their rhythmic bigotry
The hateful of the means of the samples was 26.791, shut to the hateful of the popluation, \(\mu=27\). The predicted standard fault based on our equation \(\sigma_M = \frac{\sigma}{\sqrt{northward}} = \frac{3.75}{\sqrt{13}}\) = 1.04. In reality these 10 studies yielded SD(sample ways) = 0.55. Why practise different?
The problem is our original sample was too small and we probably got only people in the middle by chance. And then what if nosotros run 5000 replications of what we but did: SD(10 replications of 13 people per sample). The ruby-red line = theoretical SEM
You volition observe the graph is not symmetrical. In fact, 56% of the scores are below the theoretical SEM and 44% are above the theoretical SEM. Why did this happen? For the aforementioned reason, we got a low estimate before: with the small sample nosotros are almost likely getting people only from the centre of the population because they are near probable. However, sometimes by chance, you will get scores (and ways) that are Manner besides small or large. This the trouble with Gosset introduced by moving us away from using known values of \(\sigma\) standard deviation and using the sample \(S\) every bit an approximation. The solution to this problem is to estimate how probable y'all are to go your result by hazard given your specific sample size and given how big your result is likely to be.
Betoken Detection Theory
Given I must estimate my SEM from my \(S\), I need a way to run into how "big" an effect might exist. Cohen borrowed a useful idea at the time, signal detection theory which was created during the invention of the radio and radar. The idea was that you want to know how strong a signal needed to be for you to discover it over the noise. The racket for us is the control group and the indicate the effect of your treatment.
\[ d = \frac{\mu_{(Noise+Betoken)}-\mu_{(Noise)}}{\sigma_{(Dissonance)}} \] Annotation this implicit assumption: \[\sigma_{(Dissonance)} = \sigma_{(Noise+Signal})\]
Cohen's \(d\)
Cohen surmised that we could employ the same logic to experiments to determine how big the effect would be (in other words how like shooting fish in a barrel information technology is to distinguish the signal from the racket).
\[ d = \frac{M_{H1}-\mu_{H0}}{S_{H1}} \]
You lot might notice you take seen this formula before!
\[ Z = \frac{M-\mu}{Due south} \]
Then Cohen'southward \(d\) is in standard deviation units:
Size | \(d\) |
---|---|
Pocket-size | .two |
Medium | .5 |
Large | .8 |
Small Visualized
Medium Visualized
Large Visualized
Y'all discover that fifty-fifty in a large upshot at that place is a lot of overlap between the curves.
Power
Power is the likelihood that a report will observe an issue when in that location is an consequence. Ability = \(ane - \beta\), where \(\beta\) = Type II error (Cohen, 1962, 1988, 1992). Below is a visual representation of ability.
Uses of Power
A priori Power: Setting a specific likelihood (ability = .80) at given \(\alpha\) level (.05), knowing the truthful consequence size. This is used to estimate the sample size needed to achieve that power (Cohen, 1962, 1988, 1992). The problem here is what is the truthful issue size? We used to say become find a meta-analysis to estimate it, simply those effect sizes are overestimated because of publication bias (Kicinski et al., 2015). Some other rules of thumb, assume your effect is small-to-medium (d = .3 or .four).
Mail-hoc Power: Estimating the power you achieved given the observed outcome size y'all establish from your study, the sample size and \(\blastoff\) yous ready. Post-hoc power has no significant, and the reason has to exercise probability beingness fickle (Hoenig & Heisey, 2001). In short, the trouble is that your estimate of \(\sigma\) in small samples, \(S\) is going to exist underestimated making your calculation of \(d\) too big. I will bear witness y'all in graphs how not-piffling this effect is.
Power and Significance testing
While I take shown you power every bit information technology related to population \(\mu\) & \(\sigma\) distributions, we calculate significance testing based on 'standard error' units non 'standard deviation' units. A reminder is that this means when we say something is statistically pregnant it does Non mean it is clinically pregnant. Case, in "Simpson and Delilah" from the Simpsons (S7:E2), Homer takes Dimoxinil, and the next forenoon he has a full luscious head of pilus. The result of Dimoxinil is huge! In reality, Minoxidil (the existent drug) grows back very picayune hair (afterwards months and months of 2x a mean solar day applications). The upshot is small, but it is significant because "nearly" men experience hair growth beyond noise which is defined in SEM not SD.
As Due north increases, the standard error goes down (\(\frac{S}{\sqrt{due north}}\)), meaning the width the noise decreases.
Medium Outcome Size
Curves = standard difference
Significance Test on Medium Effect size
The Distance of the peaks of the curves volition not change (result size based on the graph higher up), just we volition alter the width of the curve to reflect Standard Error
Significance Test when North = 12
Significance Test when Northward = 24
Significance Exam when N = 48
Y'all will notice the surface area of \(1-\beta\) increases considering as we add together sample, the curve gets thinner (SEM), only the distance between them does not change! This effect size is theoretically independent of significance testing every bit its simply based on the hateful difference / standard divergence. If you know the true standard deviation (\(\sigma\)) than this is a truthful statement. Notwithstanding, we never know the truthful standard deviation so we approximate it based on sample (\(S\)). So our observed gauge of effect size from experimental information is another estimate based on the fickleness of probably (which is why we hope meta-analysis which averages over lots of studies is a better judge).
Estimating A priori Power
To ensure a specific likelihood, y'all will observe a significant effect (\(ane-\beta\)) we needed to set that value. There are two values that are oftentimes chosen .8 and .95. 80% power is the value suggested by Cohen considering it's economical. 95% is called high power, and it has been favored of late (but its very expensive and you will run into why). As well, you demand 3 pieces of information. 1) Effect size (in Cohen's \(d\)), ii) You lot \(\alpha\) level, and 3) a number of tails you lot want to gear up (usually 2-tailed).
Back to our rhythmic discriminability Lets presume you create a grooming program to increase students rhythmic discriminability and assume the \(d\) = .4 (minor-to-medium effect). Nosotros can set our \(\blastoff = .05\) and number of tails (ii). and let Cohen'southward (1988) formulas approximate the aforementioned needed.
Power .lxxx
pwr.t.exam
office in the pwr packet is built into R already (no need to install it). It is limited to what it can do, but information technology tin can do the basic power analysis. For more than complex ability calculations you will need to download gpower a costless stand-alone ability software or you have to find other packages in R or build a Monte-Carlo simulation (which I might have for you later on in the semester ).
pwr.t.test
works by solving what you lot leave as NULL
.
library(pwr) At.Power.lxxx<-pwr.t.test(north = NULL, d = .4, power = .80, sig.level = 0.05, type = c("one.sample"), alternative = c("2.sided")) At.Ability.lxxx
## ## 1-sample t exam power calculation ## ## due north = 51.00945 ## d = 0.4 ## sig.level = 0.05 ## power = 0.8 ## alternative = two.sided
We round the value up 52
Power .95
At.Power.95<-pwr.t.examination(n = NULL, d = .four, power = .95, sig.level = 0.05, blazon = c("i.sample"), alternative = c("two.sided")) At.Ability.95
## ## 1-sample t test power adding ## ## northward = 83.16425 ## d = 0.4 ## sig.level = 0.05 ## power = 0.95 ## alternative = two.sided
We circular the value upwards 84
Sample size and Power
Sample size and power at a given effect size have a not-linear relationship
Ability curve d = .iv
Ability curve d = .2
Power curve d = .8
As you can encounter, the large the effect the fewer subjects you need.
Solve A Priori Power
Yous tin can solve A Priori power if you know your Northward, True d, \(\alpha\) level N = xiii d = .4 a = .05, 2-tailed
library(pwr) AP.Ability.N13<-pwr.t.test(n = 13, d = .4, power = NULL, sig.level = 0.05, blazon = c("1.sample"), alternative = c("two.sided")) AP.Power.N13
## ## One-sample t examination power calculation ## ## n = 13 ## d = 0.4 ## sig.level = 0.05 ## ability = 0.2642632 ## alternative = ii.sided
A Priori power = 0.264
Power and Effect size
Result size and power at a given sample size also has a not-linear human relationship
Ability Bend n = 25
Ability Bend n = 50
Power Curve northward = 100
Solve for Max Result Size Detectable
Y'all tin can solve the largest effect you can detect with your N at a specific a priori power if yous know your N, Power level, \(\alpha\) level North = 13 power = .80 a = .05, ii-tailed
library(pwr) Eff.Power.N13<-pwr.t.exam(northward = xiii, d = NULL, power = .80, sig.level = 0.05, type = c("one.sample"), alternative = c("two.sided")) Eff.Power.N13
## ## 1-sample t test power calculation ## ## n = 13 ## d = 0.8466569 ## sig.level = 0.05 ## power = 0.viii ## alternative = two.sided
Max Upshot Size Detectable at .8 power with N = 13 is 0.847. A very high value (which is bad)
Power in independent t-tests
The part in R to similar to the functions we have been using, only now it tells yous North per group. Also it assumes HOV
Let'southward go back to our Mozart effect: compare IQ (spatial reasoning) of people right after they listen to Mozart'south Sonata for Two Pianos in D Major One thousand. 448 to a control grouping who listened to Bach's Brandenburg Concerto No. 6 in B flat major, BWV 1051 Concerto. If the effect is for Mozart just, we should not encounter information technology work when listening to Bach (matched on modality & tempo, and complexity of dualing voices)
Simulation: \(\mu_{Mozart} = 109\), \(\sigma_{Mozart} = xv\), \(\mu_{Bach} = 110\), \(\sigma_{Bach} = 15\), nosotros excerpt a sample of \(Northward = 30\). Our t-exam (not correcting for HOV)
# t-test MvsB.t.exam<-t.examination(x= Mozart.Sample.ii, y= Bach.Sample, alternative = c("two.sided"), paired = Fake, var.equal = Truthful, conf.level = 0.95) MvsB.t.test #phone call the results
## ## Ii Sample t-examination ## ## data: Mozart.Sample.2 and Bach.Sample ## t = -one.6594, df = 58, p-value = 0.1024 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percentage confidence interval: ## -fifteen.195895 i.420754 ## sample estimates: ## mean of x mean of y ## 105.1811 112.0686
Outcome Size in Contained Design
We take two sources of variance group i and group two. Cohen originally suggested nosotros can just use \(d = \frac{ M_{exp} - M_{control} }{S_{control}}\), because \(S_{control} = S_{exp}\), however later it was suggested to instead use a corrected \(d\)
\[d = \frac{M_{exp} - M_{control}}{S_{pooled}}\]
Why practice y'all recall the corrected formula is amend?
Outcome size bundle
the effsize package
is useful as it can calculate \(d\) in the same way we might utilise a t-test in R.
library(effsize) Obs.d<-cohen.d(Mozart.Sample.2, Bach.Sample, pooled=Truthful,paired=FALSE, na.rm=FALSE, hedges.correction=Simulated, conf.level=0.95) Obs.d
## ## Cohen'southward d ## ## d judge: -0.4284595 (small) ## 95 percent confidence interval: ## inf sup ## -0.95119710 0.09427815
Notation it tin use hedges correction (g)
\[chiliad = .632\frac{M_{exp} - M_{control}}{S_{pooled}}\] Note that is am approximation to correct for pocket-sized samples (notation the existent formula is more complex, this is just simplified version)
HedgeG<-cohen.d(Mozart.Sample.2, Bach.Sample, pooled=TRUE,paired=Fake, na.rm=FALSE, hedges.correction=Truthful, conf.level=0.95) HedgeG
## ## Hedges's g ## ## g guess: -0.4228951 (small) ## 95 percent confidence interval: ## inf sup ## -0.94548137 0.09969124
Estiamte sample size at Ability .80
Lets say our d = 0.423
ID.At.Power.80<-pwr.t.test(northward = Null, d = abs(HedgeG$judge), power = .eighty, sig.level = 0.05, type = c("2.sample"), alternative = c("two.sided")) ID.At.Power.lxxx
## ## Ii-sample t exam power calculation ## ## n = 88.74578 ## d = 0.4228951 ## sig.level = 0.05 ## power = 0.eight ## alternative = two.sided ## ## NOTE: n is number in *each* group
We circular the value up 89 and that is the number we need PER Group assuming this effect size estimated from our failed experiment.
Estimate sample size at Power .95
ID.At.Power.95<-pwr.t.test(n = Cipher, d = abs(HedgeG$approximate), ability = .95, sig.level = 0.05, type = c("two.sample"), alternative = c("two.sided")) ID.At.Power.95
## ## Two-sample t test power calculation ## ## n = 146.2894 ## d = 0.4228951 ## sig.level = 0.05 ## ability = 0.95 ## alternative = two.sided ## ## Notation: north is number in *each* group
Nosotros round the value upward 147 and that is the number we need PER Grouping assuming this effect size estimated from our failed experiment.
Problem with Observed d
Running a single pilot with a small sample to gauge the effect size was a standard practise. Yet, it tin can upshot in problems. Nosotros got a small effect size by chance. What if we re-run our study (N = 30) 5000 times?
In theory my true d = \(110 - 109 / fifteen\) = .067. Basically a nix effect. When people look at \(d\) they tend to take the absolute value (we volition do the same)
So in fact our estimated d from that ane experiment (observed d = 0.428 had a 10.6% chance of occurring! Worse notwithstanding, in that location was a 46.32% gamble of getting a value higher up a pocket-size upshot \(d = .ii\)
References
Cohen, J. (1962). The statistical power of abnormal-social psychological research: A review. The Journal of Abnormal and Social Psychology, 65, 145-153.
Cohen, J. (1988). Statistical power analysis for the behavioral sciences (second edition). Hillsdale, NJ: Lawrence Erlbaum Associates.
Cohen, J. (1992). A ability primer. Psychological Bulletin, 112, 155-159.
Hoenig, J. One thousand., & Heisey, D. M. (2001). The abuse of power: the pervasive fallacy of ability calculations for data analysis. The American Statistician, 55, xix-24.
Kicinski, M., Springate, D. A., & Kontopantelis, Eastward. (2015). Publication bias in meta-analyses from the Cochrane Database of Systematic Reviews. Statistics in medicine, 34(20), 2781-2793.
Note: Ability graphs adapted from: http://rpsychologist.com/creating-a-typical-textbook-illustration-of-statistical-power-using-either-ggplot-or-base-graphics
LS0tDQp0aXRsZTogJ1Bvd2VyIGFuZCBFZmZlY3QgU2l6ZScNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBmb250c2l6ZTogOHB0DQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IG5vDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UpDQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9ICBGQUxTRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGg9NC4yNSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcuaGVpZ2h0PTQuMCkNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcuYWxpZ249J2NlbnRlcicpIA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wb3MgPSAnSCcpDQprbml0cjo6b3B0c19jaHVuayRzZXQocmVzdWx0cz0naG9sZCcpIA0KYGBgDQoNCg0KXHBhZ2VicmVhaw0KDQpOb3RlOiBUaGVyZSBpcyBzb21lIHZlcnkgY29tcGxleCBSIGNvZGUgdXNlZCB0byBnZW5lcmF0ZSB0b2RheSdzIGxlY3R1cmUuIEkgaGF2ZSBoaWRkZW4gaXQgaW4gdGhlIFBERiBmaWxlLiBJZiB5b3Ugc2VlIGBlY2hvPUZBTFNFYCBpbnNpZGUgdGhlIFJNRCBmaWxlIGl0IG1lYW5zIHRoYXQgaXMgdGhlIGNvZGUgeW91IGFyZSBub3QgZXhwZWN0ZWQgdG8gdW5kZXJzdGFuZCBvciBsZWFybi4gSSB3aWxsIGV4cGxhaW4gdGhlIGZ1bmN0aW9ucyB5b3Ugd2lsbCBuZWVkIHRvIGxlYXJuLiANCg0KIyBQcm9iYWJpbGl0eSBpcyBGaWNrbGUgDQoNClJldmlldzogVGhlIHN0YW5kYXJkIGVycm9yIGNhbiBiZSB1bmRlcnN0b29kIGFzIHRoZSBTdGFuZGFyZCBkZXZpYXRpb24gb2YgU2FtcGxlIE1lYW5zLiBUbyB1bmRlcnN0YW5kIHRoaXMgbGV0J3MgZ2VuZXJhdGUgYSBwb3B1bGF0aW9uIGZvciB0aGUgQWR2YW5jZWQgTWVhc3VyZXMgb2YgTXVzaWMgQXVkaWF0aW9uIChhIHRlc3Qgb2YgY29sbGVnZSBzdHVkZW50cyB0b25hbCBhbmQgcmh5dGhtaWMgZGlzY3JpbWluYXRpb24pLCAkXG11JCA9IDI3LCAkXHNpZ21hJCA9IDMuNzUgYW5kIHZpZXcgdGhlIFBERiBvZiB0aGUgcG9wdWxhdGlvbi4gV2UgY2FuIHNlZSBiZWxvdyA5NSUgb2YgdGhlIFggc2NvcmVzIG9jY3VyIGJldHdlZW4gYWJvdXQgMTkuNjUgJiAzNC4zNSBvbiByaHl0aG1pYyBkaXNjcmltaW5hdGlvbi4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KIyBtb2RpZmllZCBmcm9tIGh0dHBzOi8vd3d3LnN0YXRtZXRob2RzLm5ldC9hZHZncmFwaHMvcHJvYmFiaWxpdHkuaHRtbA0KbWVhbj0yNzsgc2Q9My43NQ0KbGI9KG1lYW4gLSBzZCoxLjk2KTsgdWI9KG1lYW4gKyBzZCoxLjk2KQ0KDQp4IDwtIHNlcSgtNCw0LGxlbmd0aD0xMDApKnNkICsgbWVhbg0KaHggPC0gZG5vcm0oeCxtZWFuLHNkKQ0KDQpwbG90KHgsIGh4LCB0eXBlPSJuIiwgeGxhYj0iUmh5dGhtaWMgU2NvcmUiLCB5bGFiPSIiLA0KICBtYWluPSIiLCBheGVzPUZBTFNFKQ0KDQppIDwtIHggPj0gbGIgJiB4IDw9IHViDQpsaW5lcyh4LCBoeCkNCnBvbHlnb24oYyhsYix4W2ldLHViKSwgYygwLGh4W2ldLDApLCBjb2w9InJlZCIpIA0KDQphcmVhIDwtIHBub3JtKHViLCBtZWFuLCBzZCkgLSBwbm9ybShsYiwgbWVhbiwgc2QpDQpyZXN1bHQgPC0gcGFzdGUoIlAoIixsYiwiPCBSaHl0aG0gPCIsdWIsIikgPSIsDQogICBzaWduaWYoYXJlYSwgZGlnaXRzPTMpKQ0KbXRleHQocmVzdWx0LDMpDQpheGlzKDEsIGF0PXNlcSgwLCA0MCwgMiksIHBvcz0wKQ0KYGBgDQoNCk5vdyBsZXRzIGRyYXcgMTAgc2FtcGxlcyBvZiAkbiA9IDEzJCBwZW9wbGUgcGVyIHNhbXBsZS4gSW4gb3RoZXIgd29yZHMsIDEwIGRhdGEgY29sbGVjdGlvbnMgd2l0aCAxMyBwZW9wbGUgd2hlcmUgd2UgbWVhc3VyZSB0aGVpciByaHl0aG1pYyBkaXNjcmltaW5hdGlvbiANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpzZXQuc2VlZCg1NDMpDQpOPTEzOyBNPTI3OyBTRD0zLjc1OyBzYW1wbGVzPTEwDQpTYW1wbGUuTWVhbnM8LXJlcGxpY2F0ZShzYW1wbGVzLCBtZWFuKHJub3JtKG49TixtZWFuPU0sc2Q9U0QpKSkNCmhpc3QoU2FtcGxlLk1lYW5zLA0KICBtYWluPSJIaXN0b2dyYW0iLCANCiAgeGxhYj0iUmh5dGhtaWMgZGlzY3JpbWluYXRpb24gb2YgMTAgc2FtcGxlcyAobiA9IDEyKSIsIHlsYWI9IkZyZXF1ZW5jeSIsDQogIHhsaW09YygyMCwzMCkpDQpgYGANCg0KDQpUaGUgbWVhbiBvZiB0aGUgbWVhbnMgb2YgdGhlIHNhbXBsZXMgd2FzIGByIHJvdW5kKG1lYW4oU2FtcGxlLk1lYW5zKSwzKWAsIGNsb3NlIHRvIHRoZSBtZWFuIG9mIHRoZSBwb3BsdWF0aW9uLCAkXG11PTI3JC4gVGhlIHByZWRpY3RlZCBzdGFuZGFyZCBlcnJvciBiYXNlZCBvbiBvdXIgZXF1YXRpb24gJFxzaWdtYV9NID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gPSBcZnJhY3szLjc1fXtcc3FydHsxM319JCA9IGByIHJvdW5kKDMuNzUvKDEzXi41KSwyKWAuICBJbiByZWFsaXR5IHRoZXNlIDEwIHN0dWRpZXMgeWllbGRlZCBTRChzYW1wbGUgbWVhbnMpID0gYHIgcm91bmQoc2QoU2FtcGxlLk1lYW5zKSwyKWAuICoqV2h5IGRvIGRpZmZlcmVudD8qKiANCg0KVGhlIHByb2JsZW0gaXMgb3VyIG9yaWdpbmFsIHNhbXBsZSB3YXMgdG9vIHNtYWxsIGFuZCB3ZSBwcm9iYWJseSBnb3Qgb25seSBwZW9wbGUgaW4gdGhlIG1pZGRsZSBieSBjaGFuY2UuIFNvIHdoYXQgaWYgd2UgcnVuIDUwMDAgcmVwbGljYXRpb25zIG9mIHdoYXQgd2UganVzdCBkaWQ6ICBTRCgxMCByZXBsaWNhdGlvbnMgb2YgMTMgcGVvcGxlIHBlciBzYW1wbGUpLiBUaGUgcmVkIGxpbmUgPSB0aGVvcmV0aWNhbCBTRU0NCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldC5zZWVkKDU0MykNCk49MTM7IE09Mjc7IFNEPTMuNzU7IHNhbXBsZXM9MTANClNhbXBsZS5TRDwtcmVwbGljYXRlKDUwMDAsIHNkKHJlcGxpY2F0ZShzYW1wbGVzLCBtZWFuKHJub3JtKG49TixtZWFuPU0sc2Q9U0QpKSkpKQ0KaGlzdChTYW1wbGUuU0QsDQogIG1haW49Ikhpc3RvZ3JhbSIsIA0KICB4bGFiPSJFbXBpcmljYWwgU0VNOiBcbjUwMDAgcmVwbGljYXRpb25zIFNEKDEwIHN0dWRpZXMgb2YgbiA9IDEzKSIsIHlsYWI9IkZyZXF1ZW5jeSIsDQogIHhsaW09YygwLDIpKQ0KYWJsaW5lKHY9KDMuNzUvKDEzXi41KSksY29sPSJyZWQiLGx3ZD00KQ0KDQpgYGANCg0KWW91IHdpbGwgbm90aWNlIHRoZSBncmFwaCBpcyBub3Qgc3ltbWV0cmljYWwuICBJbiBmYWN0LCBgciByb3VuZChtZWFuKGlmZWxzZShTYW1wbGUuU0QgPCAoMy43NS8oMTNeLjUpKSwxLDApKSwyKSoxMDBgJSBvZiB0aGUgc2NvcmVzIGFyZSBiZWxvdyB0aGUgdGhlb3JldGljYWwgU0VNIGFuZCBgciByb3VuZChtZWFuKGlmZWxzZShTYW1wbGUuU0QgPiAoMy43NS8oMTNeLjUpKSwxLDApKSwyKSoxMDBgJSBhcmUgYWJvdmUgdGhlIHRoZW9yZXRpY2FsIFNFTS4gV2h5IGRpZCB0aGlzIGhhcHBlbj8gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2UgZ290IGEgbG93IGVzdGltYXRlIGJlZm9yZTogKndpdGggdGhlIHNtYWxsIHNhbXBsZSB3ZSBhcmUgbW9zdCBsaWtlbHkgZ2V0dGluZyBwZW9wbGUgb25seSBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHBvcHVsYXRpb24gYmVjYXVzZSB0aGV5IGFyZSBtb3N0IGxpa2VseSouICBIb3dldmVyLCBzb21ldGltZXMgYnkgY2hhbmNlLCB5b3Ugd2lsbCBnZXQgc2NvcmVzIChhbmQgbWVhbnMpIHRoYXQgYXJlIFdBWSB0b28gc21hbGwgb3IgbGFyZ2UuICBUaGlzIHRoZSBwcm9ibGVtIHdpdGggR29zc2V0IGludHJvZHVjZWQgYnkgbW92aW5nIHVzIGF3YXkgZnJvbSB1c2luZyBrbm93biB2YWx1ZXMgb2YgJFxzaWdtYSQgc3RhbmRhcmQgZGV2aWF0aW9uIGFuZCB1c2luZyB0aGUgc2FtcGxlICRTJCBhcyBhbiBhcHByb3hpbWF0aW9uLiBUaGUgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzIHRvIGVzdGltYXRlIGhvdyBsaWtlbHkgeW91IGFyZSB0byBnZXQgeW91ciByZXN1bHQgYnkgY2hhbmNlIGdpdmVuIHlvdXIgKnNwZWNpZmljIHNhbXBsZSBzaXplKiBhbmQgZ2l2ZW4gaG93ICpiaWcgeW91ciBlZmZlY3QqIGlzIGxpa2VseSB0byBiZS4NCg0KIyMgU2lnbmFsIERldGVjdGlvbiBUaGVvcnkNCkdpdmVuIEkgbXVzdCBlc3RpbWF0ZSBteSBTRU0gZnJvbSBteSAkUyQsIEkgbmVlZCBhIHdheSB0byBzZWUgaG93ICJiaWciIGFuIGVmZmVjdCBtaWdodCBiZS4gQ29oZW4gYm9ycm93ZWQgYSB1c2VmdWwgaWRlYSBhdCB0aGUgdGltZSwgc2lnbmFsIGRldGVjdGlvbiB0aGVvcnkgd2hpY2ggd2FzIGNyZWF0ZWQgZHVyaW5nIHRoZSBpbnZlbnRpb24gb2YgdGhlIHJhZGlvIGFuZCByYWRhci4gIFRoZSBpZGVhIHdhcyB0aGF0IHlvdSB3YW50IHRvIGtub3cgaG93IHN0cm9uZyBhIHNpZ25hbCBuZWVkZWQgdG8gYmUgZm9yIHlvdSB0byBkZXRlY3QgaXQgb3ZlciB0aGUgbm9pc2UuIFRoZSBub2lzZSBmb3IgdXMgaXMgdGhlIGNvbnRyb2wgZ3JvdXAgYW5kIHRoZSBzaWduYWwgdGhlIGVmZmVjdCBvZiB5b3VyIHRyZWF0bWVudC4gIA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTYuMjUsZmlnLmhlaWdodD0zLjB9DQojIG1vZGlmZWQgZnJvbSBodHRwOi8vcnBzeWNob2xvZ2lzdC5jb20vY3JlYXRpbmctYS10eXBpY2FsLXRleHRib29rLWlsbHVzdHJhdGlvbi1vZi1zdGF0aXN0aWNhbC1wb3dlci11c2luZy1laXRoZXItZ2dwbG90LW9yLWJhc2UtZ3JhcGhpY3MNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkKSAjIG5lZWQgZm9yIGFycm93KCkNCm0xIDwtIDAgICMgbXUgSDANCnNkMSA8LSAxLjUgIyBzaWdtYSBIMA0KbTIgPC0gMy41ICMgbXUgSEENCnNkMiA8LSAxLjUgIyBzaWdtYSBIQQ0KDQp6X2NyaXQgPC0gcW5vcm0oMS0oMC4wNS8yKSwgbTEsIHNkMSkNCg0KIyBzZXQgbGVuZ3RoIG9mIHRhaWxzDQptaW4xIDwtIG0xLXNkMSo0DQptYXgxIDwtIG0xK3NkMSo0DQptaW4yIDwtIG0yLXNkMio0DQptYXgyIDwtIG0yK3NkMio0ICAgICAgICAgIA0KIyBjcmVhdGUgeCBzZXF1ZW5jZQ0KeCA8LSBzZXEobWluKG1pbjEsbWluMiksIG1heChtYXgxLCBtYXgyKSwgLjAxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMQ0KeTEgPC0gZG5vcm0oeCwgbTEsIHNkMSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMikNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMiA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkyKQ0KDQojIGNvbWJpbmUgcG9seWdvbnMuIA0KZGYxJGlkIDwtIDIgDQpkZjIkaWQgPC0gMSANCnBvbHkgPC0gcmJpbmQoZGYxLCBkZjIpDQpwb2x5JGlkIDwtIGZhY3Rvcihwb2x5JGlkLCAgbGFiZWxzPWMoImgwIiwiaDEiKSkNCg0KZ2dwbG90KHBvbHksIGFlcyh4LHksICBncm91cD1pZCkpICsNCiAgZ2VvbV9wb2x5Z29uKHNob3dfZ3VpZGU9RiwgYWxwaGE9SSg4LzEwKSkgKw0KICBnZW9tX2xpbmUoZGF0YT1kZjEsIGFlcyh4LHksIGNvbG9yPSJIMCIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksIHNpemU9MS41LCBzaG93X2d1aWRlPUYpICsgDQogIGdlb21fbGluZShkYXRhPWRmMiwgYWVzKGNvbG9yPSJIQSIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIkdyb3VwIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIkhBIiA9ICIjOTgxZTBiIiwiSDAiID0gImJsYWNrIikpICsNCiAgYW5ub3RhdGUoInNlZ21lbnQiLCB4PW0xKy40LCB5PTAuMjY1LCB4ZW5kPW0yLS40LCB5ZW5kPTAuMjY1LCBjb2xvcj0nYmx1ZScsDQogICAgICAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjMsICJjbSIpKSwgc2l6ZT0xKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWw9ImQiLCB4PShtMSttMikvMiwgeT0wLjI1LCBwYXJzZT1ULCBzaXplPTgpICsNCiAgYW5ub3RhdGUoInNlZ21lbnQiLCB4PW0yLS40LCB5PTAuMjY1LCB4ZW5kPW0xKy40LCB5ZW5kPTAuMjY1LCBjb2xvcj0nYmx1ZScsDQogICAgICAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjMsICJjbSIpKSwgc2l6ZT0xKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWw9Ik4iLCB4PW0xLCB5PTAuMjgsIHBhcnNlPVQsIHNpemU9OCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIGxhYmVsPSJOICsgUyIsIHg9bTIsIHk9MC4yOCwgcGFyc2U9VCwgc2l6ZT04KSArDQogIGdndGl0bGUoIlNpZ25hbCBEZXRlY3Rpb24iKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjZmZmZmZmIiksDQogICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSkNCmBgYA0KDQokJCBkID0gXGZyYWN7XG11X3soTm9pc2UrU2lnbmFsKX0tXG11X3soTm9pc2UpfX17XHNpZ21hX3soTm9pc2UpfX0gJCQNCk5vdGUgdGhpcyBpbXBsaWNpdCBhc3N1bXB0aW9uOiAkJFxzaWdtYV97KE5vaXNlKX0gPSBcc2lnbWFfeyhOb2lzZStTaWduYWx9KSQkDQoNCiMjIENvaGVuJ3MgJGQkDQpDb2hlbiBzdXJtaXNlZCB0aGF0IHdlIGNvdWxkIGFwcGx5IHRoZSBzYW1lIGxvZ2ljIHRvIGV4cGVyaW1lbnRzIHRvIGRldGVybWluZSBob3cgYmlnIHRoZSBlZmZlY3Qgd291bGQgYmUgKGluIG90aGVyIHdvcmRzIGhvdyBlYXN5IGl0IGlzIHRvIGRpc3Rpbmd1aXNoIHRoZSBzaWduYWwgZnJvbSB0aGUgbm9pc2UpLiANCg0KJCQgZCA9IFxmcmFje01fe0gxfS1cbXVfe0gwfX17U197SDF9fSAkJA0KDQpZb3UgbWlnaHQgbm90aWNlIHlvdSBoYXZlIHNlZW4gdGhpcyBmb3JtdWxhIGJlZm9yZSENCg0KJCQgWiA9IFxmcmFje00tXG11fXtTfSAkJA0KDQpTbyBDb2hlbidzICRkJCBpcyBpbiBzdGFuZGFyZCBkZXZpYXRpb24gdW5pdHM6DQoNClNpemUgICB8ICRkJA0KLS0tLS0tIHwgLS0tLS0tLS0NClNtYWxsICB8IC4yDQpNZWRpdW0gfCAuNQ0KTGFyZ2UgIHwgLjgNCiAgICAgICAgICAgICAgDQojIyMgU21hbGwgVmlzdWFsaXplZA0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD00LjI1LGZpZy5oZWlnaHQ9Mi4wfQ0KIyBtb2RpZmllZCBmcm9tIGh0dHA6Ly9ycHN5Y2hvbG9naXN0LmNvbS9jcmVhdGluZy1hLXR5cGljYWwtdGV4dGJvb2staWxsdXN0cmF0aW9uLW9mLXN0YXRpc3RpY2FsLXBvd2VyLXVzaW5nLWVpdGhlci1nZ3Bsb3Qtb3ItYmFzZS1ncmFwaGljcw0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWQpICMgbmVlZCBmb3IgYXJyb3coKQ0KbTEgPC0gMCAgIyBtdSBIMA0Kc2QxIDwtIDEgIyBzaWdtYSBIMA0KbTIgPC0gLjIgIyBtdSBIQQ0Kc2QyIDwtIDEgIyBzaWdtYSBIQQ0KDQp6X2NyaXQgPC0gcW5vcm0oMS0oMC4wNS8yKSwgbTEsIHNkMSkNCg0KIyBzZXQgbGVuZ3RoIG9mIHRhaWxzDQptaW4xIDwtIG0xLXNkMSo0DQptYXgxIDwtIG0xK3NkMSo0DQptaW4yIDwtIG0yLXNkMio0DQptYXgyIDwtIG0yK3NkMio0ICAgICAgICAgIA0KIyBjcmVhdGUgeCBzZXF1ZW5jZQ0KeCA8LSBzZXEobWluKG1pbjEsbWluMiksIG1heChtYXgxLCBtYXgyKSwgLjAxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMQ0KeTEgPC0gZG5vcm0oeCwgbTEsIHNkMSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMikNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMiA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkyKQ0KDQojIGNvbWJpbmUgcG9seWdvbnMuIA0KZGYxJGlkIDwtIDIgDQpkZjIkaWQgPC0gMSANCnBvbHkgPC0gcmJpbmQoZGYxLCBkZjIpDQpwb2x5JGlkIDwtIGZhY3Rvcihwb2x5JGlkLCAgbGFiZWxzPWMoImgwIiwiaDEiKSkNCg0KZ2dwbG90KHBvbHksIGFlcyh4LHksICBncm91cD1pZCkpICsNCiAgZ2VvbV9wb2x5Z29uKHNob3dfZ3VpZGU9RiwgYWxwaGE9SSg4LzEwKSkgKw0KICBnZW9tX2xpbmUoZGF0YT1kZjEsIGFlcyh4LHksIGNvbG9yPSJIMCIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksIHNpemU9MS41LCBzaG93X2d1aWRlPUYpICsgDQogIGdlb21fbGluZShkYXRhPWRmMiwgYWVzKGNvbG9yPSJIQSIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIkdyb3VwIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIkhBIiA9ICIjOTgxZTBiIiwiSDAiID0gImJsYWNrIikpICsNCiAgZ2d0aXRsZSgiU21hbGwgRWZmZWN0IikgKw0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2ZmZmZmZiIpLA0KICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMikpDQpgYGANCg0KIyMjIE1lZGl1bSBWaXN1YWxpemVkDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTQuMjUsZmlnLmhlaWdodD0yLjB9DQojIG1vZGlmaWVkIGZyb20gaHR0cDovL3Jwc3ljaG9sb2dpc3QuY29tL2NyZWF0aW5nLWEtdHlwaWNhbC10ZXh0Ym9vay1pbGx1c3RyYXRpb24tb2Ytc3RhdGlzdGljYWwtcG93ZXItdXNpbmctZWl0aGVyLWdncGxvdC1vci1iYXNlLWdyYXBoaWNzDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZCkgIyBuZWVkIGZvciBhcnJvdygpDQptMSA8LSAwICAjIG11IEgwDQpzZDEgPC0gMSAjIHNpZ21hIEgwDQptMiA8LSAuNSAjIG11IEhBDQpzZDIgPC0gMSAjIHNpZ21hIEhBDQoNCnpfY3JpdCA8LSBxbm9ybSgxLSgwLjA1LzIpLCBtMSwgc2QxKQ0KDQojIHNldCBsZW5ndGggb2YgdGFpbHMNCm1pbjEgPC0gbTEtc2QxKjQNCm1heDEgPC0gbTErc2QxKjQNCm1pbjIgPC0gbTItc2QyKjQNCm1heDIgPC0gbTIrc2QyKjQgICAgICAgICAgDQojIGNyZWF0ZSB4IHNlcXVlbmNlDQp4IDwtIHNlcShtaW4obWluMSxtaW4yKSwgbWF4KG1heDEsIG1heDIpLCAuMDEpDQojIGdlbmVyYXRlIG5vcm1hbCBkaXN0ICMxDQp5MSA8LSBkbm9ybSh4LCBtMSwgc2QxKQ0KIyBwdXQgaW4gZGF0YSBmcmFtZQ0KZGYxIDwtIGRhdGEuZnJhbWUoIngiID0geCwgInkiID0geTEpDQojIGdlbmVyYXRlIG5vcm1hbCBkaXN0ICMyDQp5MiA8LSBkbm9ybSh4LCBtMiwgc2QyKQ0KIyBwdXQgaW4gZGF0YSBmcmFtZQ0KZGYyIDwtIGRhdGEuZnJhbWUoIngiID0geCwgInkiID0geTIpDQoNCiMgY29tYmluZSBwb2x5Z29ucy4gDQpkZjEkaWQgPC0gMiANCmRmMiRpZCA8LSAxIA0KcG9seSA8LSByYmluZChkZjEsIGRmMikNCnBvbHkkaWQgPC0gZmFjdG9yKHBvbHkkaWQsICBsYWJlbHM9YygiaDAiLCJoMSIpKQ0KDQpnZ3Bsb3QocG9seSwgYWVzKHgseSwgIGdyb3VwPWlkKSkgKw0KICBnZW9tX3BvbHlnb24oc2hvd19ndWlkZT1GLCBhbHBoYT1JKDgvMTApKSArDQogIGdlb21fbGluZShkYXRhPWRmMSwgYWVzKHgseSwgY29sb3I9IkgwIiwgZ3JvdXA9TlVMTCwgZmlsbD1OVUxMKSwgc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKyANCiAgZ2VvbV9saW5lKGRhdGE9ZGYyLCBhZXMoY29sb3I9IkhBIiwgZ3JvdXA9TlVMTCwgZmlsbD1OVUxMKSxzaXplPTEuNSwgc2hvd19ndWlkZT1GKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCgiR3JvdXAiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz0gYygiSEEiID0gIiM5ODFlMGIiLCJIMCIgPSAiYmxhY2siKSkgKw0KICBnZ3RpdGxlKCJNZWRpdW0gRWZmZWN0IikgKw0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2ZmZmZmZiIpLA0KICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMikpDQpgYGANCg0KIyMjIExhcmdlIFZpc3VhbGl6ZWQNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NC4yNSxmaWcuaGVpZ2h0PTIuMH0NCiMgbW9kaWZlZCBmcm9tIGh0dHA6Ly9ycHN5Y2hvbG9naXN0LmNvbS9jcmVhdGluZy1hLXR5cGljYWwtdGV4dGJvb2staWxsdXN0cmF0aW9uLW9mLXN0YXRpc3RpY2FsLXBvd2VyLXVzaW5nLWVpdGhlci1nZ3Bsb3Qtb3ItYmFzZS1ncmFwaGljcw0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWQpICMgbmVlZCBmb3IgYXJyb3coKQ0KbTEgPC0gMCAgIyBtdSBIMA0Kc2QxIDwtIDEgIyBzaWdtYSBIMA0KbTIgPC0gLjggIyBtdSBIQQ0Kc2QyIDwtIDEgIyBzaWdtYSBIQQ0KDQp6X2NyaXQgPC0gcW5vcm0oMS0oMC4wNS8yKSwgbTEsIHNkMSkNCg0KIyBzZXQgbGVuZ3RoIG9mIHRhaWxzDQptaW4xIDwtIG0xLXNkMSo0DQptYXgxIDwtIG0xK3NkMSo0DQptaW4yIDwtIG0yLXNkMio0DQptYXgyIDwtIG0yK3NkMio0ICAgICAgICAgIA0KIyBjcmVhdGUgeCBzZXF1ZW5jZQ0KeCA8LSBzZXEobWluKG1pbjEsbWluMiksIG1heChtYXgxLCBtYXgyKSwgLjAxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMQ0KeTEgPC0gZG5vcm0oeCwgbTEsIHNkMSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMikNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMiA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkyKQ0KDQojIGNvbWJpbmUgcG9seWdvbnMuIA0KZGYxJGlkIDwtIDIgDQpkZjIkaWQgPC0gMSANCnBvbHkgPC0gcmJpbmQoZGYxLCBkZjIpDQpwb2x5JGlkIDwtIGZhY3Rvcihwb2x5JGlkLCAgbGFiZWxzPWMoImgwIiwiaDEiKSkNCg0KZ2dwbG90KHBvbHksIGFlcyh4LHksICBncm91cD1pZCkpICsNCiAgZ2VvbV9wb2x5Z29uKHNob3dfZ3VpZGU9RiwgYWxwaGE9SSg4LzEwKSkgKw0KICBnZW9tX2xpbmUoZGF0YT1kZjEsIGFlcyh4LHksIGNvbG9yPSJIMCIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksIHNpemU9MS41LCBzaG93X2d1aWRlPUYpICsgDQogIGdlb21fbGluZShkYXRhPWRmMiwgYWVzKGNvbG9yPSJIQSIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIkdyb3VwIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIkhBIiA9ICIjOTgxZTBiIiwiSDAiID0gImJsYWNrIikpICsNCiAgZ2d0aXRsZSgiTGFyZ2UgRWZmZWN0IikgKw0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2ZmZmZmZiIpLA0KICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMikpDQpgYGANCg0KWW91IG5vdGljZSB0aGF0IGV2ZW4gaW4gYSBsYXJnZSBlZmZlY3QgdGhlcmUgaXMgYSBsb3Qgb2Ygb3ZlcmxhcCBiZXR3ZWVuIHRoZSBjdXJ2ZXMuIA0KDQojIFBvd2VyDQpQb3dlciBpcyB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgc3R1ZHkgd2lsbCBkZXRlY3QgYW4gZWZmZWN0IHdoZW4gdGhlcmUgaXMgYW4gZWZmZWN0LiBQb3dlciA9ICQxIC0gXGJldGEkLCB3aGVyZSAkXGJldGEkID0gVHlwZSBJSSBlcnJvciAoQ29oZW4sIDE5NjIsIDE5ODgsIDE5OTIpLiBCZWxvdyBpcyBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBwb3dlci4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9Ni4yNSxmaWcuaGVpZ2h0PTMuMH0NCm0xIDwtIDAgICMgbXUgSDANCnNkMSA8LSAxLjUgIyBzaWdtYSBIMA0KbTIgPC0gMy41ICMgbXUgSEENCnNkMiA8LSAxLjUgIyBzaWdtYSBIQQ0KDQp6X2NyaXQgPC0gcW5vcm0oMS0oMC4wNS8yKSwgbTEsIHNkMSkNCg0KIyBzZXQgbGVuZ3RoIG9mIHRhaWxzDQptaW4xIDwtIG0xLXNkMSo0DQptYXgxIDwtIG0xK3NkMSo0DQptaW4yIDwtIG0yLXNkMio0DQptYXgyIDwtIG0yK3NkMio0ICAgICAgICAgIA0KIyBjcmVhdGUgeCBzZXF1ZW5jZQ0KeCA8LSBzZXEobWluKG1pbjEsbWluMiksIG1heChtYXgxLCBtYXgyKSwgLjAxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMQ0KeTEgPC0gZG5vcm0oeCwgbTEsIHNkMSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMikNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMiA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkyKQ0KDQojIEFscGhhIHBvbHlnb24NCnkucG9seSA8LSBwbWluKHkxLHkyKQ0KcG9seTEgPC0gZGF0YS5mcmFtZSh4PXgsIHk9eS5wb2x5KQ0KcG9seTEgPC0gcG9seTFbcG9seTEkeCA+PSB6X2NyaXQsIF0gDQpwb2x5MTwtcmJpbmQocG9seTEsIGMoel9jcml0LCAwKSkgICMgYWRkIGxvd2VyLWxlZnQgY29ybmVyDQoNCiMgQmV0YSBwb2x5Z29uDQpwb2x5MiA8LSBkZjINCnBvbHkyIDwtIHBvbHkyW3BvbHkyJHggPD0gel9jcml0LF0gDQpwb2x5MjwtcmJpbmQocG9seTIsIGMoel9jcml0LCAwKSkgICMgYWRkIGxvd2VyLWxlZnQgY29ybmVyDQoNCiMgcG93ZXIgcG9seWdvbjsgMS1iZXRhDQpwb2x5MyA8LSBkZjINCnBvbHkzIDwtIHBvbHkzW3BvbHkzJHggPj0gel9jcml0LF0gDQpwb2x5MyA8LXJiaW5kKHBvbHkzLCBjKHpfY3JpdCwgMCkpICAjIGFkZCBsb3dlci1sZWZ0IGNvcm5lcg0KDQojIGNvbWJpbmUgcG9seWdvbnMuIA0KcG9seTEkaWQgPC0gMyAjIGFscGhhLCBnaXZlIGl0IHRoZSBoaWdoZXN0IG51bWJlciB0byBtYWtlIGl0IHRoZSB0b3AgbGF5ZXINCnBvbHkyJGlkIDwtIDIgIyBiZXRhDQpwb2x5MyRpZCA8LSAxICMgcG93ZXI7IDEgLSBiZXRhDQpwb2x5IDwtIHJiaW5kKHBvbHkxLCBwb2x5MiwgcG9seTMpDQpwb2x5JGlkIDwtIGZhY3Rvcihwb2x5JGlkLCAgbGFiZWxzPWMoInBvd2VyIiwiYmV0YSIsImFscGhhIikpDQoNCmdncGxvdChwb2x5LCBhZXMoeCx5LCBmaWxsPWlkLCBncm91cD1pZCkpICsNCiAgZ2VvbV9wb2x5Z29uKHNob3dfZ3VpZGU9RiwgYWxwaGE9SSg4LzEwKSkgKw0KICAjIGFkZCBsaW5lIGZvciB0cmVhdG1lbnQgZ3JvdXANCiAgZ2VvbV9saW5lKGRhdGE9ZGYxLCBhZXMoeCx5LCBjb2xvcj0iSDAiLCBncm91cD1OVUxMLCBmaWxsPU5VTEwpLCBzaXplPTEuNSwgc2hvd19ndWlkZT1GKSArIA0KICAjIGFkZCBsaW5lIGZvciB0cmVhdG1lbnQgZ3JvdXAuIFRoZXNlIGxpbmVzIGNvdWxkIGJlIGNvbWJpbmVkIGludG8gb25lIGRhdGFmcmFtZS4NCiAgZ2VvbV9saW5lKGRhdGE9ZGYyLCBhZXMoY29sb3I9IkhBIiwgZ3JvdXA9TlVMTCwgZmlsbD1OVUxMKSxzaXplPTEuNSwgc2hvd19ndWlkZT1GKSArDQogICMgYWRkIHZsaW5lcyBmb3Igel9jcml0DQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHpfY3JpdCwgc2l6ZT0xLCBsaW5ldHlwZT0iZGFzaGVkIikgKw0KICAjIGNoYW5nZSBjb2xvcnMgDQogIHNjYWxlX2NvbG9yX21hbnVhbCgiR3JvdXAiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz0gYygiSEEiID0gIiM5ODFlMGIiLCJIMCIgPSAiYmxhY2siKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgidGVzdCIsIHZhbHVlcz0gYygiYWxwaGEiID0gIiMwZDYzNzQiLCJiZXRhIiA9ICIjYmU4MDVlIiwicG93ZXIiPSIjN2NlY2VlIikpICsNCiAgIyBiZXRhIGFycm93DQogIGFubm90YXRlKCJzZWdtZW50IiwgeD0wLjEsIHk9MC4wNDUsIHhlbmQ9MS4zLCB5ZW5kPTAuMDEsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjMsICJjbSIpKSwgc2l6ZT0xKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWw9ImJldGEiLCB4PTAsIHk9MC4wNSwgcGFyc2U9VCwgc2l6ZT04KSArDQogICMgYWxwaGEgYXJyb3cNCiAgYW5ub3RhdGUoInNlZ21lbnQiLCB4PTQsIHk9MC4wNDMsIHhlbmQ9My40LCB5ZW5kPTAuMDEsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjMsICJjbSIpKSwgc2l6ZT0xKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWw9ImZyYWMoYWxwaGEsMikiLCB4PTQuMiwgeT0wLjA1LCBwYXJzZT1ULCBzaXplPTgpICsNCiAgIyBwb3dlciBhcnJvdw0KICBhbm5vdGF0ZSgic2VnbWVudCIsIHg9NiwgeT0wLjIsIHhlbmQ9NC41LCB5ZW5kPTAuMTUsIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjMsICJjbSIpKSwgc2l6ZT0xKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWw9IjEtYmV0YSIsIHg9Ni4xLCB5PTAuMjEsIHBhcnNlPVQsIHNpemU9OCkgKw0KICAjIEhfMCB0aXRsZQ0KICBhbm5vdGF0ZSgidGV4dCIsIGxhYmVsPSJIWzBdIiwgeD1tMSwgeT0wLjI4LCBwYXJzZT1ULCBzaXplPTgpICsNCiAgIyBIX2EgdGl0bGUNCiAgYW5ub3RhdGUoInRleHQiLCBsYWJlbD0iSFsxXSIsIHg9bTIsIHk9MC4yOCwgcGFyc2U9VCwgc2l6ZT04KSArDQogIGdndGl0bGUoIlBvd2VyIEV4YW1wbGUiKSArDQogICMgcmVtb3ZlIHNvbWUgZWxlbWVudHMNCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNmZmZmZmYiKSwNCiAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpKQ0KYGBgDQoNCg0KIyMgVXNlcyBvZiBQb3dlcg0KKipBIHByaW9yaSBQb3dlcjoqKiBTZXR0aW5nIGEgc3BlY2lmaWMgbGlrZWxpaG9vZCAocG93ZXIgPSAuODApIGF0IGdpdmVuICRcYWxwaGEkIGxldmVsICguMDUpLCBrbm93aW5nIHRoZSAqdHJ1ZSogZWZmZWN0IHNpemUuIFRoaXMgaXMgdXNlZCB0byBlc3RpbWF0ZSB0aGUgc2FtcGxlIHNpemUgbmVlZGVkIHRvIGFjaGlldmUgdGhhdCBwb3dlciAoQ29oZW4sIDE5NjIsIDE5ODgsIDE5OTIpLiBUaGUgcHJvYmxlbSBoZXJlIGlzIHdoYXQgaXMgdGhlICp0cnVlKiBlZmZlY3Qgc2l6ZT8gV2UgdXNlZCB0byBzYXkgZ28gZmluZCBhIG1ldGEtYW5hbHlzaXMgdG8gZXN0aW1hdGUgaXQsIGJ1dCB0aG9zZSBlZmZlY3Qgc2l6ZXMgYXJlIG92ZXJlc3RpbWF0ZWQgYmVjYXVzZSBvZiBwdWJsaWNhdGlvbiBiaWFzIChLaWNpbnNraSBldCBhbC4sIDIwMTUpLiBTb21lIG90aGVyIHJ1bGVzIG9mIHRodW1iLCBhc3N1bWUgeW91ciBlZmZlY3QgaXMgc21hbGwtdG8tbWVkaXVtIChkID0gLjMgb3IgLjQpLiANCg0KKipQb3N0LWhvYyBQb3dlcjoqKiBFc3RpbWF0aW5nIHRoZSBwb3dlciB5b3UgYWNoaWV2ZWQgZ2l2ZW4gdGhlICpvYnNlcnZlZCogZWZmZWN0IHNpemUgeW91IGZvdW5kIGZyb20geW91ciBzdHVkeSwgdGhlIHNhbXBsZSBzaXplIGFuZCAkXGFscGhhJCB5b3Ugc2V0LiAgUG9zdC1ob2MgcG93ZXIgaGFzIG5vIG1lYW5pbmcsIGFuZCB0aGUgcmVhc29uIGhhcyB0byBkbyBwcm9iYWJpbGl0eSBiZWluZyBmaWNrbGUgKEhvZW5pZyAmIEhlaXNleSwgMjAwMSkuIEluIHNob3J0LCB0aGUgcHJvYmxlbSBpcyB0aGF0IHlvdXIgZXN0aW1hdGUgb2YgJFxzaWdtYSQgaW4gc21hbGwgc2FtcGxlcywgJFMkIGlzIGdvaW5nIHRvIGJlIHVuZGVyZXN0aW1hdGVkIG1ha2luZyB5b3VyIGNhbGN1bGF0aW9uIG9mICRkJCB0b28gbGFyZ2UuICBJIHdpbGwgc2hvdyB5b3UgaW4gZ3JhcGhzIGhvdyBub24tdHJpdmlhbCB0aGlzIGlzc3VlIGlzLiAgDQoNCg0KIyMgUG93ZXIgYW5kIFNpZ25pZmljYW5jZSB0ZXN0aW5nDQpXaGlsZSBJIGhhdmUgc2hvd24geW91IHBvd2VyIGFzIGl0IHJlbGF0ZWQgdG8gcG9wdWxhdGlvbiAkXG11JCAmICRcc2lnbWEkIGRpc3RyaWJ1dGlvbnMsIHdlIGNhbGN1bGF0ZSBzaWduaWZpY2FuY2UgdGVzdGluZyBiYXNlZCBvbiAnc3RhbmRhcmQgZXJyb3InIHVuaXRzIG5vdCAnc3RhbmRhcmQgZGV2aWF0aW9uJyB1bml0cy4gIEEgcmVtaW5kZXIgaXMgdGhhdCB0aGlzIG1lYW5zIHdoZW4gd2Ugc2F5IHNvbWV0aGluZyBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGl0IGRvZXMgTk9UIG1lYW4gaXQgaXMgY2xpbmljYWxseSBzaWduaWZpY2FudC4gRXhhbXBsZSwgaW4gIlNpbXBzb24gYW5kIERlbGlsYWgiIGZyb20gdGhlIFNpbXBzb25zIChTNzpFMiksIEhvbWVyIHRha2VzIERpbW94aW5pbCwgYW5kIHRoZSBuZXh0IG1vcm5pbmcgaGUgaGFzIGEgZnVsbCBsdXNjaW91cyBoZWFkIG9mIGhhaXIuIFRoZSBlZmZlY3Qgb2YgRGltb3hpbmlsIGlzIGh1Z2UhIEluIHJlYWxpdHksIE1pbm94aWRpbCAodGhlIHJlYWwgZHJ1ZykgZ3Jvd3MgYmFjayB2ZXJ5IGxpdHRsZSBoYWlyIChhZnRlciBtb250aHMgYW5kIG1vbnRocyBvZiAyeCBhIGRheSBhcHBsaWNhdGlvbnMpLiBUaGUgZWZmZWN0IGlzIHNtYWxsLCBidXQgaXQgaXMgc2lnbmlmaWNhbnQgYmVjYXVzZSAibW9zdCIgbWVuIGV4cGVyaWVuY2UgaGFpciBncm93dGggYmV5b25kIG5vaXNlIHdoaWNoIGlzIGRlZmluZWQgaW4gU0VNIG5vdCBTRC4gIA0KDQpBcyBOIGluY3JlYXNlcywgdGhlIHN0YW5kYXJkIGVycm9yIGdvZXMgZG93biAoJFxmcmFje1N9e1xzcXJ0e259fSQpLCBtZWFuaW5nIHRoZSB3aWR0aCB0aGUgbm9pc2UgZGVjcmVhc2VzLg0KDQojIyMgTWVkaXVtIEVmZmVjdCBTaXplDQpDdXJ2ZXMgPSBzdGFuZGFyZCBkZXZpYXRpb24NCg0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD00LjI1LGZpZy5oZWlnaHQ9Mi4wfQ0KIyBtb2RpZmllZCBmcm9tIGh0dHA6Ly9ycHN5Y2hvbG9naXN0LmNvbS9jcmVhdGluZy1hLXR5cGljYWwtdGV4dGJvb2staWxsdXN0cmF0aW9uLW9mLXN0YXRpc3RpY2FsLXBvd2VyLXVzaW5nLWVpdGhlci1nZ3Bsb3Qtb3ItYmFzZS1ncmFwaGljcw0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWQpICMgbmVlZCBmb3IgYXJyb3coKQ0KbTEgPC0gMCAgIyBtdSBIMA0Kc2QxIDwtIDEgIyBzaWdtYSBIMA0KbTIgPC0gLjUgIyBtdSBIQQ0Kc2QyIDwtIDEgIyBzaWdtYSBIQQ0KDQp6X2NyaXQgPC0gcW5vcm0oMS0oMC4wNS8yKSwgbTEsIHNkMSkNCg0KIyBzZXQgbGVuZ3RoIG9mIHRhaWxzDQptaW4xIDwtIG0xLXNkMSo0DQptYXgxIDwtIG0xK3NkMSo0DQptaW4yIDwtIG0yLXNkMio0DQptYXgyIDwtIG0yK3NkMio0ICAgICAgICAgIA0KIyBjcmVhdGUgeCBzZXF1ZW5jZQ0KeCA8LSBzZXEobWluKG1pbjEsbWluMiksIG1heChtYXgxLCBtYXgyKSwgLjAxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMQ0KeTEgPC0gZG5vcm0oeCwgbTEsIHNkMSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMikNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMiA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkyKQ0KDQojIGNvbWJpbmUgcG9seWdvbnMuIA0KZGYxJGlkIDwtIDIgDQpkZjIkaWQgPC0gMSANCnBvbHkgPC0gcmJpbmQoZGYxLCBkZjIpDQpwb2x5JGlkIDwtIGZhY3Rvcihwb2x5JGlkLCAgbGFiZWxzPWMoImgwIiwiaDEiKSkNCg0KZ2dwbG90KHBvbHksIGFlcyh4LHksICBncm91cD1pZCkpICsNCiAgZ2VvbV9wb2x5Z29uKHNob3dfZ3VpZGU9RiwgYWxwaGE9SSg4LzEwKSkgKw0KICBnZW9tX2xpbmUoZGF0YT1kZjEsIGFlcyh4LHksIGNvbG9yPSJIMCIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksIHNpemU9MS41LCBzaG93X2d1aWRlPUYpICsgDQogIGdlb21fbGluZShkYXRhPWRmMiwgYWVzKGNvbG9yPSJIQSIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIkdyb3VwIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIkhBIiA9ICIjOTgxZTBiIiwiSDAiID0gImJsYWNrIikpICsNCiAgZ2d0aXRsZSgiTWVkaXVtIEVmZmVjdCIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNmZmZmZmYiKSwNCiAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpKQ0KYGBgDQoNCiMjIyBTaWduaWZpY2FuY2UgVGVzdCBvbiBNZWRpdW0gRWZmZWN0IHNpemUNClRoZSBEaXN0YW5jZSBvZiB0aGUgcGVha3Mgb2YgdGhlIGN1cnZlcyB3aWxsIG5vdCBjaGFuZ2UgKGVmZmVjdCBzaXplIGJhc2VkIG9uIHRoZSBncmFwaCBhYm92ZSksIGJ1dCB3ZSB3aWxsIGNoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGN1cnZlIHRvIHJlZmxlY3QgU3RhbmRhcmQgRXJyb3IgDQoNCiMjIyMgU2lnbmlmaWNhbmNlIFRlc3Qgd2hlbiBOID0gMTINCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NC4yNSxmaWcuaGVpZ2h0PTIuMH0NCiMgbW9kaWZpZWQgZnJvbSBodHRwOi8vcnBzeWNob2xvZ2lzdC5jb20vY3JlYXRpbmctYS10eXBpY2FsLXRleHRib29rLWlsbHVzdHJhdGlvbi1vZi1zdGF0aXN0aWNhbC1wb3dlci11c2luZy1laXRoZXItZ2dwbG90LW9yLWJhc2UtZ3JhcGhpY3MNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkKSAjIG5lZWQgZm9yIGFycm93KCkNCm0xIDwtIDAgICMgbXUgSDANCnNkMSA8LSAxICMgc2lnbWEgSDANCm0yIDwtIC41ICMgbXUgSEENCnNkMiA8LSAxICMgc2lnbWEgSEENCg0Kel9jcml0IDwtIHFub3JtKDEtKDAuMDUvMiksIG0xLCBzZDEpDQoNCiMgc2V0IGxlbmd0aCBvZiB0YWlscw0KbWluMSA8LSBtMS1zZDEqNA0KbWF4MSA8LSBtMStzZDEqNA0KbWluMiA8LSBtMi1zZDIqNA0KbWF4MiA8LSBtMitzZDIqNCAgICAgICAgICANCiMgY3JlYXRlIHggc2VxdWVuY2UNCnggPC0gc2VxKG1pbihtaW4xLG1pbjIpLCBtYXgobWF4MSwgbWF4MiksIC4wMSkNCiMgZ2VuZXJhdGUgbm9ybWFsIGRpc3QgIzENCnkxIDwtIGRub3JtKHgsIG0xLCBzZDEvNl4uNSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMi82Xi41KQ0KIyBwdXQgaW4gZGF0YSBmcmFtZQ0KZGYyIDwtIGRhdGEuZnJhbWUoIngiID0geCwgInkiID0geTIpDQoNCiMgY29tYmluZSBwb2x5Z29ucy4gDQpkZjEkaWQgPC0gMiANCmRmMiRpZCA8LSAxIA0KcG9seSA8LSByYmluZChkZjEsIGRmMikNCnBvbHkkaWQgPC0gZmFjdG9yKHBvbHkkaWQsICBsYWJlbHM9YygiaDAiLCJoMSIpKQ0KDQpnZ3Bsb3QocG9seSwgYWVzKHgseSwgIGdyb3VwPWlkKSkgKw0KICBnZW9tX3BvbHlnb24oc2hvd19ndWlkZT1GLCBhbHBoYT1JKDgvMTApKSArDQogIGdlb21fbGluZShkYXRhPWRmMSwgYWVzKHgseSwgY29sb3I9IkgwIiwgZ3JvdXA9TlVMTCwgZmlsbD1OVUxMKSwgc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKyANCiAgZ2VvbV9saW5lKGRhdGE9ZGYyLCBhZXMoY29sb3I9IkhBIiwgZ3JvdXA9TlVMTCwgZmlsbD1OVUxMKSxzaXplPTEuNSwgc2hvd19ndWlkZT1GKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCgiR3JvdXAiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz0gYygiSEEiID0gIiM5ODFlMGIiLCJIMCIgPSAiYmxhY2siKSkgKw0KICBnZ3RpdGxlKCJOID0gMTIiKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjZmZmZmZmIiksDQogICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTIyKSkNCmBgYA0KDQojIyMjIFNpZ25pZmljYW5jZSBUZXN0IHdoZW4gTiA9IDI0DQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTQuMjUsZmlnLmhlaWdodD0yLjB9DQojIG1vZGlmZWQgZnJvbSBodHRwOi8vcnBzeWNob2xvZ2lzdC5jb20vY3JlYXRpbmctYS10eXBpY2FsLXRleHRib29rLWlsbHVzdHJhdGlvbi1vZi1zdGF0aXN0aWNhbC1wb3dlci11c2luZy1laXRoZXItZ2dwbG90LW9yLWJhc2UtZ3JhcGhpY3MNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkKSAjIG5lZWQgZm9yIGFycm93KCkNCm0xIDwtIDAgICMgbXUgSDANCnNkMSA8LSAxICMgc2lnbWEgSDANCm0yIDwtIC41ICMgbXUgSEENCnNkMiA8LSAxICMgc2lnbWEgSEENCg0Kel9jcml0IDwtIHFub3JtKDEtKDAuMDUvMiksIG0xLCBzZDEpDQoNCiMgc2V0IGxlbmd0aCBvZiB0YWlscw0KbWluMSA8LSBtMS1zZDEqNA0KbWF4MSA8LSBtMStzZDEqNA0KbWluMiA8LSBtMi1zZDIqNA0KbWF4MiA8LSBtMitzZDIqNCAgICAgICAgICANCiMgY3JlYXRlIHggc2VxdWVuY2UNCnggPC0gc2VxKG1pbihtaW4xLG1pbjIpLCBtYXgobWF4MSwgbWF4MiksIC4wMSkNCiMgZ2VuZXJhdGUgbm9ybWFsIGRpc3QgIzENCnkxIDwtIGRub3JtKHgsIG0xLCBzZDEvMTJeLjUpDQojIHB1dCBpbiBkYXRhIGZyYW1lDQpkZjEgPC0gZGF0YS5mcmFtZSgieCIgPSB4LCAieSIgPSB5MSkNCiMgZ2VuZXJhdGUgbm9ybWFsIGRpc3QgIzINCnkyIDwtIGRub3JtKHgsIG0yLCBzZDIvMTJeLjUpDQojIHB1dCBpbiBkYXRhIGZyYW1lDQpkZjIgPC0gZGF0YS5mcmFtZSgieCIgPSB4LCAieSIgPSB5MikNCg0KIyBjb21iaW5lIHBvbHlnb25zLiANCmRmMSRpZCA8LSAyIA0KZGYyJGlkIDwtIDEgDQpwb2x5IDwtIHJiaW5kKGRmMSwgZGYyKQ0KcG9seSRpZCA8LSBmYWN0b3IocG9seSRpZCwgIGxhYmVscz1jKCJoMCIsImgxIikpDQoNCmdncGxvdChwb2x5LCBhZXMoeCx5LCAgZ3JvdXA9aWQpKSArDQogIGdlb21fcG9seWdvbihzaG93X2d1aWRlPUYsIGFscGhhPUkoOC8xMCkpICsNCiAgZ2VvbV9saW5lKGRhdGE9ZGYxLCBhZXMoeCx5LCBjb2xvcj0iSDAiLCBncm91cD1OVUxMLCBmaWxsPU5VTEwpLCBzaXplPTEuNSwgc2hvd19ndWlkZT1GKSArIA0KICBnZW9tX2xpbmUoZGF0YT1kZjIsIGFlcyhjb2xvcj0iSEEiLCBncm91cD1OVUxMLCBmaWxsPU5VTEwpLHNpemU9MS41LCBzaG93X2d1aWRlPUYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKCJHcm91cCIsIA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPSBjKCJIQSIgPSAiIzk4MWUwYiIsIkgwIiA9ICJibGFjayIpKSArDQogIGdndGl0bGUoIk4gPSAyNCIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9IiNmZmZmZmYiKSwNCiAgICAgICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MjIpKQ0KYGBgDQoNCg0KIyMjIyBTaWduaWZpY2FuY2UgVGVzdCB3aGVuIE4gPSA0OA0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy53aWR0aD00LjI1LGZpZy5oZWlnaHQ9Mi4wfQ0KIyBtb2RpZmllZCBmcm9tIGh0dHA6Ly9ycHN5Y2hvbG9naXN0LmNvbS9jcmVhdGluZy1hLXR5cGljYWwtdGV4dGJvb2staWxsdXN0cmF0aW9uLW9mLXN0YXRpc3RpY2FsLXBvd2VyLXVzaW5nLWVpdGhlci1nZ3Bsb3Qtb3ItYmFzZS1ncmFwaGljcw0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWQpICMgbmVlZCBmb3IgYXJyb3coKQ0KbTEgPC0gMCAgIyBtdSBIMA0Kc2QxIDwtIDEgIyBzaWdtYSBIMA0KbTIgPC0gLjUgIyBtdSBIQQ0Kc2QyIDwtIDEgIyBzaWdtYSBIQQ0KDQp6X2NyaXQgPC0gcW5vcm0oMS0oMC4wNS8yKSwgbTEsIHNkMSkNCg0KIyBzZXQgbGVuZ3RoIG9mIHRhaWxzDQptaW4xIDwtIG0xLXNkMSo0DQptYXgxIDwtIG0xK3NkMSo0DQptaW4yIDwtIG0yLXNkMio0DQptYXgyIDwtIG0yK3NkMio0ICAgICAgICAgIA0KIyBjcmVhdGUgeCBzZXF1ZW5jZQ0KeCA8LSBzZXEobWluKG1pbjEsbWluMiksIG1heChtYXgxLCBtYXgyKSwgLjAxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMQ0KeTEgPC0gZG5vcm0oeCwgbTEsIHNkMS8yNF4uNSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMSA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkxKQ0KIyBnZW5lcmF0ZSBub3JtYWwgZGlzdCAjMg0KeTIgPC0gZG5vcm0oeCwgbTIsIHNkMi8yNF4uNSkNCiMgcHV0IGluIGRhdGEgZnJhbWUNCmRmMiA8LSBkYXRhLmZyYW1lKCJ4IiA9IHgsICJ5IiA9IHkyKQ0KDQojIGNvbWJpbmUgcG9seWdvbnMuIA0KZGYxJGlkIDwtIDIgDQpkZjIkaWQgPC0gMSANCnBvbHkgPC0gcmJpbmQoZGYxLCBkZjIpDQpwb2x5JGlkIDwtIGZhY3Rvcihwb2x5JGlkLCAgbGFiZWxzPWMoImgwIiwiaDEiKSkNCg0KZ2dwbG90KHBvbHksIGFlcyh4LHksICBncm91cD1pZCkpICsNCiAgZ2VvbV9wb2x5Z29uKHNob3dfZ3VpZGU9RiwgYWxwaGE9SSg4LzEwKSkgKw0KICBnZW9tX2xpbmUoZGF0YT1kZjEsIGFlcyh4LHksIGNvbG9yPSJIMCIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksIHNpemU9MS41LCBzaG93X2d1aWRlPUYpICsgDQogIGdlb21fbGluZShkYXRhPWRmMiwgYWVzKGNvbG9yPSJIQSIsIGdyb3VwPU5VTEwsIGZpbGw9TlVMTCksc2l6ZT0xLjUsIHNob3dfZ3VpZGU9RikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIkdyb3VwIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIkhBIiA9ICIjOTgxZTBiIiwiSDAiID0gImJsYWNrIikpICsNCiAgZ2d0aXRsZSgiTiA9IDQ4IikgKw0KICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbD0iI2ZmZmZmZiIpLA0KICAgICAgICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0yMikpDQpgYGANCg0KWW91IHdpbGwgbm90aWNlIHRoZSBhcmVhIG9mICQxLVxiZXRhJCBpbmNyZWFzZXMgYmVjYXVzZSBhcyB3ZSBhZGQgc2FtcGxlLCB0aGUgY3VydmUgZ2V0cyB0aGlubmVyIChTRU0pLCBidXQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlbSBkb2VzIG5vdCBjaGFuZ2UhIFRoaXMgZWZmZWN0IHNpemUgaXMgdGhlb3JldGljYWxseSBpbmRlcGVuZGVudCBvZiBzaWduaWZpY2FuY2UgdGVzdGluZyBhcyBpdHMgc2ltcGx5IGJhc2VkIG9uIHRoZSBtZWFuIGRpZmZlcmVuY2UgLyBzdGFuZGFyZCBkZXZpYXRpb24uIElmIHlvdSBrbm93IHRoZSB0cnVlIHN0YW5kYXJkIGRldmlhdGlvbiAoJFxzaWdtYSQpIHRoYW4gdGhpcyBpcyBhIHRydWUgc3RhdGVtZW50LiBIb3dldmVyLCB3ZSBuZXZlciBrbm93IHRoZSB0cnVlIHN0YW5kYXJkIGRldmlhdGlvbiBzbyB3ZSBhcHByb3hpbWF0ZSBpdCBiYXNlZCBvbiBzYW1wbGUgKCRTJCkuIFNvIG91ciBvYnNlcnZlZCBlc3RpbWF0ZSBvZiBlZmZlY3Qgc2l6ZSBmcm9tIGV4cGVyaW1lbnRhbCBkYXRhIGlzIGFub3RoZXIgZ3Vlc3MgYmFzZWQgb24gdGhlIGZpY2tsZW5lc3Mgb2YgcHJvYmFibHkgKHdoaWNoIGlzIHdoeSB3ZSBob3BlIG1ldGEtYW5hbHlzaXMgd2hpY2ggYXZlcmFnZXMgb3ZlciBsb3RzIG9mIHN0dWRpZXMgaXMgYSBiZXR0ZXIgZXN0aW1hdGUpLg0KDQojIyBFc3RpbWF0aW5nIEEgcHJpb3JpIFBvd2VyDQpUbyBlbnN1cmUgYSBzcGVjaWZpYyBsaWtlbGlob29kLCB5b3Ugd2lsbCBmaW5kIGEgc2lnbmlmaWNhbnQgZWZmZWN0ICgkMS1cYmV0YSQpIHdlIG5lZWRlZCB0byBzZXQgdGhhdCB2YWx1ZS4gVGhlcmUgYXJlIHR3byB2YWx1ZXMgdGhhdCBhcmUgb2Z0ZW4gY2hvc2VuIC44IGFuZCAuOTUuIDgwJSBwb3dlciBpcyB0aGUgdmFsdWUgc3VnZ2VzdGVkIGJ5IENvaGVuIGJlY2F1c2UgaXQncyBlY29ub21pY2FsLiA5NSUgaXMgY2FsbGVkIGhpZ2ggcG93ZXIsIGFuZCBpdCBoYXMgYmVlbiBmYXZvcmVkIG9mIGxhdGUgKGJ1dCBpdHMgdmVyeSBleHBlbnNpdmUgYW5kIHlvdSB3aWxsIHNlZSB3aHkpLiBBbHNvLCB5b3UgbmVlZCAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4gMSkgRWZmZWN0IHNpemUgKGluIENvaGVuJ3MgJGQkKSwgMikgWW91ICRcYWxwaGEkIGxldmVsLCBhbmQgIDMpIGEgbnVtYmVyIG9mIHRhaWxzIHlvdSB3YW50IHRvIHNldCAodXN1YWxseSAyLXRhaWxlZCkuICANCg0KQmFjayB0byBvdXIgcmh5dGhtaWMgZGlzY3JpbWluYWJpbGl0eSBMZXRzIGFzc3VtZSB5b3UgY3JlYXRlIGEgdHJhaW5pbmcgcHJvZ3JhbSB0byBpbmNyZWFzZSBzdHVkZW50cyByaHl0aG1pYyBkaXNjcmltaW5hYmlsaXR5IGFuZCBhc3N1bWUgdGhlICRkJCA9IC40IChzbWFsbC10by1tZWRpdW0gZWZmZWN0KS4gV2UgY2FuIHNldCBvdXIgJFxhbHBoYSA9IC4wNSQgYW5kIG51bWJlciBvZiB0YWlscyAoMikuIGFuZCBsZXQgQ29oZW4ncyAoMTk4OCkgZm9ybXVsYXMgZXN0aW1hdGUgdGhlIHNhbWUgbmVlZGVkLiANCg0KIyMjIyBQb3dlciAuODANCmBwd3IudC50ZXN0YCBmdW5jdGlvbiBpbiB0aGUgcHdyIHBhY2thZ2UgaXMgYnVpbHQgaW50byBSIGFscmVhZHkgKG5vIG5lZWQgdG8gaW5zdGFsbCBpdCkuIEl0IGlzIGxpbWl0ZWQgdG8gd2hhdCBpdCBjYW4gZG8sIGJ1dCBpdCBjYW4gZG8gdGhlIGJhc2ljIHBvd2VyIGFuYWx5c2lzLiBGb3IgbW9yZSBjb21wbGV4IHBvd2VyIGNhbGN1bGF0aW9ucyB5b3Ugd2lsbCBuZWVkIHRvIGRvd25sb2FkICoqZ3Bvd2VyKiogYSBmcmVlIHN0YW5kLWFsb25lIHBvd2VyIHNvZnR3YXJlIG9yIHlvdSBoYXZlIHRvIGZpbmQgb3RoZXIgcGFja2FnZXMgaW4gUiBvciBidWlsZCBhIE1vbnRlLUNhcmxvIHNpbXVsYXRpb24gKHdoaWNoIEkgbWlnaHQgaGF2ZSBmb3IgeW91IGxhdGVyIGluIHRoZSBzZW1lc3RlciApLg0KDQpgcHdyLnQudGVzdGAgd29ya3MgYnkgc29sdmluZyB3aGF0IHlvdSBsZWF2ZSBhcyBgTlVMTGAuIA0KDQpgYGB7cn0NCmxpYnJhcnkocHdyKQ0KQXQuUG93ZXIuODA8LXB3ci50LnRlc3QobiA9IE5VTEwsIGQgPSAuNCwgcG93ZXIgPSAuODAsIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICB0eXBlID0gYygib25lLnNhbXBsZSIpLCBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpKQ0KQXQuUG93ZXIuODANCmBgYA0KDQpXZSByb3VuZCB0aGUgdmFsdWUgdXAgYHIgY2VpbGluZyhBdC5Qb3dlci44MCRuKWANCg0KDQojIyMjIFBvd2VyIC45NQ0KYGBge3J9DQpBdC5Qb3dlci45NTwtcHdyLnQudGVzdChuID0gTlVMTCwgZCA9IC40LCBwb3dlciA9IC45NSwgc2lnLmxldmVsID0gMC4wNSwNCiAgICAgICAgICAgICAgIHR5cGUgPSBjKCJvbmUuc2FtcGxlIiksIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIikpDQpBdC5Qb3dlci45NQ0KYGBgDQoNCldlIHJvdW5kIHRoZSB2YWx1ZSB1cCBgciBjZWlsaW5nKEF0LlBvd2VyLjk1JG4pYA0KDQoNCiMjIFNhbXBsZSBzaXplIGFuZCBQb3dlciANClNhbXBsZSBzaXplIGFuZCBwb3dlciBhdCBhIGdpdmVuIGVmZmVjdCBzaXplIGhhdmUgYSBub24tbGluZWFyIHJlbGF0aW9uc2hpcA0KDQojIyMgUG93ZXIgY3VydmUgZCA9IC40DQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkocHdyKQ0KT25lU2FtcGxlLlQuTjwtZnVuY3Rpb24oTnJhbmdlLEQpDQogIHtOPC1wd3IudC50ZXN0KG4gPSBOcmFuZ2UsIGQgPSBELCBwb3dlciA9IE5VTEwsIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICB0eXBlID0gYygib25lLnNhbXBsZSIpLCBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpKSRwb3dlcg0KICByZXR1cm4oTikNCiAgfQ0KDQpOcmFuZ2U9c2VxKDIsNDAwLC41KQ0KDQpTU3RvUDwtbWFwcGx5KE9uZVNhbXBsZS5ULk4sTnJhbmdlLEQ9LjQpDQoNCnBsb3QoTnJhbmdlLFNTdG9QLCdsJyxsd2Q9NCwNCiAgICAgICBtYWluPSJQb3dlciBDdXJ2ZSwgZCA9IC40LCBhID0gLjA1LzIiLCANCiAgeGxhYj0iU2FtcGxlIFNpemUiLCB5bGFiPSJBcHJpb3JpIFBvd2VyIiwgeWxpbT1jKDAsMSkpDQphYmxpbmUoaD0uODAsY29sPSJibHVlIixsd2Q9MSkNCmFibGluZShoPS45NSxjb2w9InJlZCIsbHdkPTEpDQpgYGANCg0KIyMjIFBvd2VyIGN1cnZlIGQgPSAuMg0KYGBge3IsIGVjaG89RkFMU0V9DQpOcmFuZ2U9c2VxKDIsNDAwLC41KQ0KDQpTU3RvUDwtbWFwcGx5KE9uZVNhbXBsZS5ULk4sTnJhbmdlLEQ9LjIpDQoNCnBsb3QoTnJhbmdlLFNTdG9QLCdsJyxsd2Q9NCwNCiAgICAgICBtYWluPSJQb3dlciBDdXJ2ZSwgZCA9IC4yLCBhID0gLjA1LzIiLCANCiAgeGxhYj0iU2FtcGxlIFNpemUiLCB5bGFiPSJBcHJpb3JpIFBvd2VyIiwgeWxpbT1jKDAsMSkpDQphYmxpbmUoaD0uODAsY29sPSJibHVlIixsd2Q9MSkNCmFibGluZShoPS45NSxjb2w9InJlZCIsbHdkPTEpDQpgYGANCg0KIyMjIFBvd2VyIGN1cnZlIGQgPSAuOA0KYGBge3IsIGVjaG89RkFMU0V9DQpOcmFuZ2U9c2VxKDIsNDAwLC41KQ0KDQpTU3RvUDwtbWFwcGx5KE9uZVNhbXBsZS5ULk4sTnJhbmdlLEQ9LjgpDQoNCnBsb3QoTnJhbmdlLFNTdG9QLCdsJyxsd2Q9NCwNCiAgICAgICBtYWluPSJQb3dlciBDdXJ2ZSwgZCA9IC44LCBhID0gLjA1LzIiLCANCiAgeGxhYj0iU2FtcGxlIFNpemUiLCB5bGFiPSJBcHJpb3JpIFBvd2VyIiwgeWxpbT1jKDAsMSkpDQphYmxpbmUoaD0uODAsY29sPSJibHVlIixsd2Q9MSkNCmFibGluZShoPS45NSxjb2w9InJlZCIsbHdkPTEpDQpgYGANCg0KQXMgeW91IGNhbiBzZWUsIHRoZSBsYXJnZSB0aGUgZWZmZWN0IHRoZSBmZXdlciBzdWJqZWN0cyB5b3UgbmVlZC4gIA0KDQojIyMgU29sdmUgQSBQcmlvcmkgUG93ZXINCg0KWW91IGNhbiBzb2x2ZSBBIFByaW9yaSBwb3dlciBpZiB5b3Uga25vdyB5b3VyIE4sICoqVHJ1ZSoqIGQsICRcYWxwaGEkIGxldmVsDQpOID0gMTMNCmQgPSAuNA0KYSA9IC4wNSwgdHdvLXRhaWxlZA0KDQpgYGB7cn0NCmxpYnJhcnkocHdyKQ0KQVAuUG93ZXIuTjEzPC1wd3IudC50ZXN0KG4gPSAxMywgZCA9IC40LCBwb3dlciA9IE5VTEwsIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICB0eXBlID0gYygib25lLnNhbXBsZSIpLCBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpKQ0KQVAuUG93ZXIuTjEzDQpgYGANCg0KQSBQcmlvcmkgcG93ZXIgPSBgciByb3VuZChBUC5Qb3dlci5OMTMkcG93ZXIsMylgDQoNCg0KIyMgUG93ZXIgYW5kIEVmZmVjdCBzaXplDQpFZmZlY3Qgc2l6ZSBhbmQgcG93ZXIgYXQgYSBnaXZlbiBzYW1wbGUgc2l6ZSBhbHNvIGhhcyBhIG5vbi1saW5lYXIgcmVsYXRpb25zaGlwDQoNCiMjIyBQb3dlciBDdXJ2ZSBuID0gMjUNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShwd3IpDQpPbmVTYW1wbGUuVC5EPC1mdW5jdGlvbihEcmFuZ2UsTikNCiAge3Bvd2VyPC1wd3IudC50ZXN0KG4gPSBOLCBkID0gRHJhbmdlLCBwb3dlciA9IE5VTEwsIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICB0eXBlID0gYygib25lLnNhbXBsZSIpLCBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpKSRwb3dlcg0KICByZXR1cm4ocG93ZXIpDQogIH0NCg0KRHJhbmdlPXNlcSguMSwxLjIsLjA1KQ0KDQpEdG9QPC1tYXBwbHkoT25lU2FtcGxlLlQuRCxEcmFuZ2UsTj0yNSkNCg0KcGxvdChEcmFuZ2UsRHRvUCwnbCcsbHdkPTQsDQogICAgICAgbWFpbj0iUG93ZXIgQ3VydmUsIE4gPSAyNSwgYSA9IC4wNS8yIiwgDQogIHhsYWI9IkVmZmVjdCBTaXplIChkKSIsIHlsYWI9IkFwcmlvcmkgUG93ZXIiLCB5bGltPWMoMCwxKSkNCmFibGluZShoPS44MCxjb2w9ImJsdWUiLGx3ZD0xKQ0KYWJsaW5lKGg9Ljk1LGNvbD0icmVkIixsd2Q9MSkNCmBgYA0KDQojIyMgUG93ZXIgQ3VydmUgbiA9IDUwDQpgYGB7ciwgZWNobz1GQUxTRX0NCkR0b1A8LW1hcHBseShPbmVTYW1wbGUuVC5ELERyYW5nZSxOPTUwKQ0KDQpwbG90KERyYW5nZSxEdG9QLCdsJyxsd2Q9NCwNCiAgICAgICBtYWluPSJQb3dlciBDdXJ2ZSwgTiA9IDUwLCBhID0gLjA1LzIiLCANCiAgeGxhYj0iRWZmZWN0IFNpemUgKGQpIiwgeWxhYj0iQXByaW9yaSBQb3dlciIsIHlsaW09YygwLDEpKQ0KYWJsaW5lKGg9LjgwLGNvbD0iYmx1ZSIsbHdkPTEpDQphYmxpbmUoaD0uOTUsY29sPSJyZWQiLGx3ZD0xKQ0KYGBgDQoNCg0KIyMjIFBvd2VyIEN1cnZlIG4gPSAxMDANCmBgYHtyLCBlY2hvPUZBTFNFfQ0KRHRvUDwtbWFwcGx5KE9uZVNhbXBsZS5ULkQsRHJhbmdlLE49MTAwKQ0KDQpwbG90KERyYW5nZSxEdG9QLCdsJyxsd2Q9NCwNCiAgICAgICBtYWluPSJQb3dlciBDdXJ2ZSwgTiA9IDEwMCwgYSA9IC4wNS8yIiwgDQogIHhsYWI9IkVmZmVjdCBTaXplIChkKSIsIHlsYWI9IkFwcmlvcmkgUG93ZXIiLCB5bGltPWMoMCwxKSkNCmFibGluZShoPS44MCxjb2w9ImJsdWUiLGx3ZD0xKQ0KYWJsaW5lKGg9Ljk1LGNvbD0icmVkIixsd2Q9MSkNCmBgYA0KDQojIyMgU29sdmUgZm9yIE1heCBFZmZlY3QgU2l6ZSBEZXRlY3RhYmxlDQoNCllvdSBjYW4gc29sdmUgdGhlIGxhcmdlc3QgZWZmZWN0IHlvdSBjYW4gZGV0ZWN0IHdpdGggeW91ciBOIGF0IGEgc3BlY2lmaWMgYSBwcmlvcmkgcG93ZXIgaWYgeW91IGtub3cgeW91ciBOLCBQb3dlciBsZXZlbCwgJFxhbHBoYSQgbGV2ZWwNCk4gPSAxMw0KcG93ZXIgPSAuODANCmEgPSAuMDUsIHR3by10YWlsZWQNCg0KYGBge3J9DQpsaWJyYXJ5KHB3cikNCkVmZi5Qb3dlci5OMTM8LXB3ci50LnRlc3QobiA9IDEzLCBkID0gTlVMTCwgcG93ZXIgPSAuODAsIHNpZy5sZXZlbCA9IDAuMDUsDQogICAgICAgICAgICAgICB0eXBlID0gYygib25lLnNhbXBsZSIpLCBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpKQ0KRWZmLlBvd2VyLk4xMw0KYGBgDQoNCk1heCBFZmZlY3QgU2l6ZSBEZXRlY3RhYmxlIGF0IC44IHBvd2VyIHdpdGggTiA9IDEzIGlzICBgciByb3VuZChFZmYuUG93ZXIuTjEzJGQsMylgLiBBIHZlcnkgaGlnaCB2YWx1ZSAod2hpY2ggaXMgYmFkKQ0KDQoNCg0KIyMgUG93ZXIgaW4gaW5kZXBlbmRlbnQgdC10ZXN0cw0KVGhlIGZ1bmN0aW9uIGluIFIgdG8gc2ltaWxhciB0byB0aGUgZnVuY3Rpb25zIHdlIGhhdmUgYmVlbiB1c2luZywgYnV0IG5vdyBpdCB0ZWxscyB5b3UgTiBwZXIgZ3JvdXAuIEFsc28gaXQgYXNzdW1lcyBIT1YNCg0KTGV0J3MgZ28gYmFjayB0byBvdXIgTW96YXJ0IGVmZmVjdDogY29tcGFyZSBJUSAoc3BhdGlhbCByZWFzb25pbmcpIG9mIHBlb3BsZSByaWdodCBhZnRlciB0aGV5IGxpc3RlbiB0byBNb3phcnQncyBTb25hdGEgZm9yIFR3byBQaWFub3MgaW4gRCBNYWpvciBLLiA0NDggdG8gYSBjb250cm9sIGdyb3VwIHdobyBsaXN0ZW5lZCB0byBbQmFjaCdzIEJyYW5kZW5idXJnIENvbmNlcnRvIE5vLiA2IGluIEIgZmxhdCBtYWpvciwgQldWIDEwNTEgQ29uY2VydG9dKGh0dHBzOi8veW91dHUuYmUvQ2V4SlE4VldKZlk/dD0xNXMpLiAgSWYgdGhlIGVmZmVjdCBpcyBmb3IgTW96YXJ0IG9ubHksIHdlIHNob3VsZCBub3Qgc2VlIGl0IHdvcmsgd2hlbiBsaXN0ZW5pbmcgdG8gQmFjaCAobWF0Y2hlZCBvbiBtb2RhbGl0eSAmIHRlbXBvLCBhbmQgY29tcGxleGl0eSBvZiBkdWFsaW5nIHZvaWNlcykgDQoNClNpbXVsYXRpb246ICRcbXVfe01vemFydH0gPSAxMDkkLCAkXHNpZ21hX3tNb3phcnR9ID0gMTUkLCAkXG11X3tCYWNofSA9IDExMCQsICRcc2lnbWFfe0JhY2h9ID0gMTUkLCB3ZSBleHRyYWN0IGEgc2FtcGxlIG9mICROID0gMzAkLiBPdXIgdC10ZXN0IChub3QgY29ycmVjdGluZyBmb3IgSE9WKQ0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0Kc2V0LnNlZWQoNjY2KQ0KIyBleHRhY3QgYSBzYW1wbGUgb2YgMzAgcGVvcGxlLCB0aGF0IGhhcyArOSBlZmZlY3Qgb24gSVENCm4gPSAzMA0KTW96YXJ0SVEuZWZmZWN0ID0gMTA5DQpTRElRID0gMTUNCk1vemFydC5TYW1wbGUuMiA8LSBybm9ybShuLE1vemFydElRLmVmZmVjdCxTRElRKQ0KDQpCYWNoSVEuZWZmZWN0ID0gMTEwDQpTRElRID0gMTUNCkJhY2guU2FtcGxlIDwtIHJub3JtKG4sQmFjaElRLmVmZmVjdCxTRElRKQ0KYGBgIA0KIA0KYGBge3J9DQojIHQtdGVzdA0KTXZzQi50LnRlc3Q8LXQudGVzdCh4PSBNb3phcnQuU2FtcGxlLjIsIHk9IEJhY2guU2FtcGxlLA0KICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksDQogICAgICAgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IFRSVUUsDQogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpDQpNdnNCLnQudGVzdCAjY2FsbCB0aGUgcmVzdWx0cw0KDQpgYGANCiANCiMgRWZmZWN0IFNpemUgaW4gSW5kZXBlbmRlbnQgRGVzaWduDQoNCldlIGhhdmUgdHdvIHNvdXJjZXMgb2YgdmFyaWFuY2UgZ3JvdXAgMSBhbmQgZ3JvdXAgMi4gQ29oZW4gb3JpZ2luYWxseSBzdWdnZXN0ZWQgd2UgY2FuIHNpbXBseSB1c2UgJGQgPSBcZnJhY3sgTV97ZXhwfSAtIE1fe2NvbnRyb2x9IH17U197Y29udHJvbH19JCwgYmVjYXVzZSAkU197Y29udHJvbH0gPSBTX3tleHB9JCwgaG93ZXZlciBsYXRlciBpdCB3YXMgc3VnZ2VzdGVkIHRvIGluc3RlYWQgdXNlIGEgY29ycmVjdGVkICRkJA0KDQokJGQgPSBcZnJhY3tNX3tleHB9IC0gTV97Y29udHJvbH19e1Nfe3Bvb2xlZH19JCQgDQoNCldoeSBkbyB5b3UgdGhpbmsgdGhlIGNvcnJlY3RlZCBmb3JtdWxhIGlzIGJldHRlcj8gDQoNCiMjIEVmZmVjdCBzaXplIHBhY2thZ2UNCnRoZSBgZWZmc2l6ZSBwYWNrYWdlYCBpcyB1c2VmdWwgYXMgaXQgY2FuIGNhbGN1bGF0ZSAkZCQgaW4gdGhlIHNhbWUgd2F5IHdlIG1pZ2h0IGFwcGx5IGEgdC10ZXN0IGluIFIuDQoNCmBgYHtyfQ0KbGlicmFyeShlZmZzaXplKQ0KDQpPYnMuZDwtY29oZW4uZChNb3phcnQuU2FtcGxlLjIsIEJhY2guU2FtcGxlLCBwb29sZWQ9VFJVRSxwYWlyZWQ9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgbmEucm09RkFMU0UsIGhlZGdlcy5jb3JyZWN0aW9uPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbmYubGV2ZWw9MC45NSkNCk9icy5kDQpgYGANCg0KTm90ZSBpdCBjYW4gYXBwbHkgaGVkZ2VzIGNvcnJlY3Rpb24gKGcpDQoNCiQkZyA9IC42MzJcZnJhY3tNX3tleHB9IC0gTV97Y29udHJvbH19e1Nfe3Bvb2xlZH19JCQNCk5vdGUgdGhhdCBpcyBhbSBhcHByb3hpbWF0aW9uIHRvIGNvcnJlY3QgZm9yIHNtYWxsIHNhbXBsZXMgKG5vdGUgdGhlIHJlYWwgZm9ybXVsYSBpcyBtb3JlIGNvbXBsZXgsIHRoaXMgaXMganVzdCBzaW1wbGlmaWVkIHZlcnNpb24pDQoNCmBgYHtyfQ0KSGVkZ2VHPC1jb2hlbi5kKE1vemFydC5TYW1wbGUuMiwgQmFjaC5TYW1wbGUsIHBvb2xlZD1UUlVFLHBhaXJlZD1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICBuYS5ybT1GQUxTRSwgaGVkZ2VzLmNvcnJlY3Rpb249VFJVRSwNCiAgICAgICAgICAgICAgICAgICBjb25mLmxldmVsPTAuOTUpDQpIZWRnZUcNCmBgYA0KDQoNCiMjIyMgRXN0aWFtdGUgc2FtcGxlIHNpemUgYXQgUG93ZXIgLjgwDQpMZXRzIHNheSBvdXIgZCA9IGByIHJvdW5kKGFicyhIZWRnZUckZXN0aW1hdGUpLDMpYA0KDQpgYGB7cn0NCklELkF0LlBvd2VyLjgwPC1wd3IudC50ZXN0KG4gPSBOVUxMLCBkID0gYWJzKEhlZGdlRyRlc3RpbWF0ZSksIHBvd2VyID0gLjgwLCBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICAgICAgdHlwZSA9IGMoInR3by5zYW1wbGUiKSwgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSkNCklELkF0LlBvd2VyLjgwDQpgYGANCg0KV2Ugcm91bmQgdGhlIHZhbHVlIHVwIGByIGNlaWxpbmcoSUQuQXQuUG93ZXIuODAkbilgIGFuZCB0aGF0IGlzIHRoZSBudW1iZXIgd2UgbmVlZCBQRVIgR1JPVVAgYXNzdW1pbmcgdGhpcyBlZmZlY3Qgc2l6ZSBlc3RpbWF0ZWQgZnJvbSBvdXIgZmFpbGVkIGV4cGVyaW1lbnQuIA0KDQoNCiMjIyMgRXN0aW1hdGUgc2FtcGxlIHNpemUgYXQgUG93ZXIgLjk1DQpgYGB7cn0NCklELkF0LlBvd2VyLjk1PC1wd3IudC50ZXN0KG4gPSBOVUxMLCBkID0gYWJzKEhlZGdlRyRlc3RpbWF0ZSksIHBvd2VyID0gLjk1LCBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICAgICAgdHlwZSA9IGMoInR3by5zYW1wbGUiKSwgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSkNCklELkF0LlBvd2VyLjk1DQpgYGANCg0KV2Ugcm91bmQgdGhlIHZhbHVlIHVwIGByIGNlaWxpbmcoSUQuQXQuUG93ZXIuOTUkbilgIGFuZCB0aGF0IGlzIHRoZSBudW1iZXIgd2UgbmVlZCBQRVIgR1JPVVAgYXNzdW1pbmcgdGhpcyBlZmZlY3Qgc2l6ZSBlc3RpbWF0ZWQgZnJvbSBvdXIgZmFpbGVkIGV4cGVyaW1lbnQuIA0KDQojIyBQcm9ibGVtIHdpdGggT2JzZXJ2ZWQgZA0KUnVubmluZyBhIHNpbmdsZSBwaWxvdCB3aXRoIGEgc21hbGwgc2FtcGxlIHRvIGVzdGltYXRlIHRoZSBlZmZlY3Qgc2l6ZSB3YXMgYSBzdGFuZGFyZCBwcmFjdGljZS4gSG93ZXZlciwgaXQgY2FuIHJlc3VsdCBpbiBwcm9ibGVtcy4gV2UgZ290IGEgc21hbGwgZWZmZWN0IHNpemUgYnkgY2hhbmNlLiBXaGF0IGlmIHdlIHJlLXJ1biBvdXIgc3R1ZHkgKE4gPSAzMCkgNTAwMCB0aW1lcz8gDQoNCkluIHRoZW9yeSBteSB0cnVlIGQgPSAkMTEwIC0gMTA5IC8gMTUkID0gKi4wNjcqLiBCYXNpY2FsbHkgYSB6ZXJvIGVmZmVjdC4gV2hlbiBwZW9wbGUgbG9vayBhdCAkZCQgdGhleSB0ZW5kIHRvIHRha2UgdGhlIGFic29sdXRlIHZhbHVlICh3ZSB3aWxsIGRvIHRoZSBzYW1lKQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldC5zZWVkKDY2NikNCiMgZXh0YWN0IGEgc2FtcGxlIG9mIDMwIHBlb3BsZSwgdGhhdCBoYXMgKzkgZWZmZWN0IG9uIElRDQpuID0gMzANCg0KDQpTaW1EPC1mdW5jdGlvbihuKXsNCiAgTW96YXJ0SVEuZWZmZWN0ID0gMTA5OyBTRElRID0gMTU7DQogIEJhY2hJUS5lZmZlY3QgPSAxMTA7IFNESVEgPSAxNTsNCiAgTW96YXJ0LlNhbXBsZS4yIDwtIHJub3JtKG4sTW96YXJ0SVEuZWZmZWN0LFNESVEpDQogIEJhY2guU2FtcGxlIDwtIHJub3JtKG4sQmFjaElRLmVmZmVjdCxTRElRKQ0KICBlc3QuZDwtY29oZW4uZChNb3phcnQuU2FtcGxlLjIsIEJhY2guU2FtcGxlLCBwb29sZWQ9VFJVRSxwYWlyZWQ9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgbmEucm09RkFMU0UsIGhlZGdlcy5jb3JyZWN0aW9uPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgIGNvbmYubGV2ZWw9MC45NSkkZXN0aW1hdGUNCiAgZXN0LmQ8LWFzLnZlY3Rvcihlc3QuZCkNCn0NCg0KRC5kaXN0cm88LW1hcHBseShTaW1ELHJlcCgzMCw1MDAwKSkNCg0KaGlzdChhYnMoRC5kaXN0cm8pLA0KICBtYWluPSJIaXN0b2dyYW0iLCANCiAgeGxhYj0iT2JzZXJ2ZWQgY29oZW4ncyBkOiBcbjUwMDAgcmVwbGljYXRpb25zOyBOPTMwLCB0cnVlIGQgPSAuMDY3IiwgeWxhYj0iRnJlcXVlbmN5IiwNCiAgeGxpbT1jKDAsMS4yKSkNCmFibGluZSh2PS4wNjcsY29sPSJyZWQiLGx3ZD00KQ0KYGBgIA0KDQpTbyBpbiBmYWN0IG91ciBlc3RpbWF0ZWQgZCBmcm9tIHRoYXQgb25lIGV4cGVyaW1lbnQgKG9ic2VydmVkIGQgPSBgciByb3VuZChhYnMoYXMudmVjdG9yKE9icy5kJGVzdGltYXRlKSksMylgIGhhZCBhIGByIHJvdW5kKG1lYW4oaWZlbHNlKGFicyhELmRpc3RybykgPiBhYnMoYXMudmVjdG9yKE9icy5kJGVzdGltYXRlKSksMSwwKSksNCkqMTAwYCUgY2hhbmNlIG9mIG9jY3VycmluZyEgV29yc2UgeWV0LCB0aGVyZSB3YXMgYSBgciByb3VuZChtZWFuKGlmZWxzZShhYnMoRC5kaXN0cm8pID4gLjIsMSwwKSksNCkqMTAwYCUgY2hhbmNlIG9mIGdldHRpbmcgYSB2YWx1ZSBhYm92ZSBhIHNtYWxsIGVmZmVjdCAkZCA9IC4yJA0KDQoNCiMgUmVmZXJlbmNlcw0KQ29oZW4sIEouICgxOTYyKS4gVGhlIHN0YXRpc3RpY2FsIHBvd2VyIG9mIGFibm9ybWFsLXNvY2lhbCBwc3ljaG9sb2dpY2FsIHJlc2VhcmNoOiBBIHJldmlldy4gVGhlDQoqSm91cm5hbCBvZiBBYm5vcm1hbCBhbmQgU29jaWFsIFBzeWNob2xvZ3kqLCA2NSwgMTQ1LTE1My4NCg0KDQpDb2hlbiwgSi4gKDE5ODgpLiAqU3RhdGlzdGljYWwgcG93ZXIgYW5hbHlzaXMgZm9yIHRoZSBiZWhhdmlvcmFsIHNjaWVuY2VzICgybmQgZWRpdGlvbikqLiBIaWxsc2RhbGUsDQpOSjogTGF3cmVuY2UgRXJsYmF1bSBBc3NvY2lhdGVzLg0KDQpDb2hlbiwgSi4gKDE5OTIpLiBBIHBvd2VyIHByaW1lci4gKlBzeWNob2xvZ2ljYWwgQnVsbGV0aW4qLCAxMTIsIDE1NS0xNTkuDQoNCkhvZW5pZywgSi4gTS4sICYgSGVpc2V5LCBELiBNLiAoMjAwMSkuIFRoZSBhYnVzZSBvZiBwb3dlcjogdGhlIHBlcnZhc2l2ZSBmYWxsYWN5IG9mIHBvd2VyDQpjYWxjdWxhdGlvbnMgZm9yIGRhdGEgYW5hbHlzaXMuICpUaGUgQW1lcmljYW4gU3RhdGlzdGljaWFuKiwgNTUsIDE5LTI0LiANCg0KS2ljaW5za2ksIE0uLCBTcHJpbmdhdGUsIEQuIEEuLCAmIEtvbnRvcGFudGVsaXMsIEUuICgyMDE1KS4gUHVibGljYXRpb24gYmlhcyBpbiBtZXRhLWFuYWx5c2VzIGZyb20gdGhlIENvY2hyYW5lIERhdGFiYXNlIG9mIFN5c3RlbWF0aWMgUmV2aWV3cy4gU3RhdGlzdGljcyBpbiBtZWRpY2luZSwgMzQoMjApLCAyNzgxLTI3OTMuDQoNCk5vdGU6IFBvd2VyIGdyYXBocyBhZGFwdGVkIGZyb206IA0KaHR0cDovL3Jwc3ljaG9sb2dpc3QuY29tL2NyZWF0aW5nLWEtdHlwaWNhbC10ZXh0Ym9vay1pbGx1c3RyYXRpb24tb2Ytc3RhdGlzdGljYWwtcG93ZXItdXNpbmctZWl0aGVyLWdncGxvdC1vci1iYXNlLWdyYXBoaWNzDQo=
How To Calculate Effect Size For A Priori,
Source: http://www.alexanderdemos.org/ANOVA4.html
Posted by: wrightdemusbace.blogspot.com
0 Response to "How To Calculate Effect Size For A Priori"
Post a Comment