banner



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

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel