Introduction
For this assignment, we will be using various statistical methods to
compare two drugs and their effects on Low-Density Lipoprotein (LDL):
the current standard drug, which lowers LDL by 25 mg/dL with a standard
deviation of 15 mg/dL, and a drug a pharmeceutical company develops
called “CholestFix,” which a 3 month clinical trial of 5 participants
determined that this drug lowers LDL by 29 mg/dL on average. We will
assume that this drug also has a standard deviation of 15 mg/dL, and
that both LDL changes follow a normal distribution.
Part A
Based on the results of the clinical trial, researchers believe that
CholestFix is the more effective drug. For this part, we will formally
test that hypothesis with a z-test. The reason we use a z-test is
because our data follows a normal distribution and our “population” (the
standard drug effect) standard deviation is known. The z-test will be
conducted at significance level \(\alpha\) = 0.05.
The null hypothesis, \(H_0\), is
that the mean LDL decrease from the two drugs is equal. In other words,
there is no difference in the two drugs’ effects. the alternative
hypothesis, \(H_a\), is that there is a
difference in the two drugs effects, and that CholestFix is the more
effective drug. In other words, the average LDL decrease from CholestFix
is greater than the LDL decrease from the standard drug. To put into
symbols, we have:
\[H_0:\mu_C = \mu_S\] \[H_a: \mu_C \gt \mu_S\]
Another way we can write the hypotheses:
\[H_0: \mu_C - \mu_S = 0\] \[H_a: \mu_C - \mu_S \gt 0\]
Since we have a directional hypothesis and our test uses the normal
distribution, our test will be a one-tailed test using the right tail.
The test statistic formula will be:
\[z = \frac{\bar{x} - \mu_0}{\sigma /
\sqrt{n}}\]
Our test is as follows:
## Perform Z-Test
mu_c <- 29 # mean of CholestFix
mu_s <- 25 # mean of standard drug
sd <- 15 # standard deviation of both drugs
n <- 5 # number of participants in clinical trial
z <- (mu_c - mu_s)/(sd/sqrt(n))
pval <- 1 - pnorm(z) # Probability in right tail
test <- c(z, pval) # Z score and p-value
test
[1] 0.5962848 0.2754925
The z score for the test is 0.5962 and our p-value is 0.2755. Since
our p-value is greater than 0.05, we will fail to reject our null
hypothesis, and we can conclude that there is not enough evidence to
suggest that there is a difference between the effectiveness of the
standard drug and the effectiveness of CholestFix, and we can attribute
our results to randomness.
Part B
For this part, we are interested in calculating the probability of a
true improvement given some new numbers. We are now interested in seeing
if we can get a true improvement given a new sample size of 50 and an
effect size of \(\delta\) = 4 mg/dL. We
are assuming no changes to either drug for this part.
It looks like we’re interested in calculating the post-hoc power of
the test. To do so, we will need several things: first is the
noncentrality parameter, \(\lambda\).
The non-centrality parameter is: \[\lambda =
\frac{\mu - \mu_0}{\sigma / \sqrt{n}}\] which equals: \[\lambda = \frac{\delta}{\sigma /
\sqrt{n}}\]
Pluggin in what we want, we get:
\[\lambda = \frac{4}{15 /
\sqrt{50}}\] which gives us \[\lambda
= 1.8856 \ldots\].
delta <- 4 # Effect Size
sd <- 15 # Standard Deviation
n <- 50 # New Sample Size
lambda <- delta/(sd/sqrt(n))
lambda
[1] 1.885618
Then we need our critical value corresponding to the significance
level:
crit.alpha <- qnorm(0.95, 0, 1) # Crit Value of 95% of Normal Distribution
crit.alpha
[1] 1.644854
Now we can use the formula to find the power of the test:
## Calculating Power for Effect Size of 4 mg/dL
# Power calculation
power <- 1 - pnorm(crit.alpha - lambda)
power
[1] 0.5951312
The probability that we detect a true improvement, or the power of
our test, is 0.5951. This means that we can correctly reject the null
hypothesis when the mean is 29 mg/dL about 59.51% of the time.
Part C
For this part, we are interested in calculating the a-priori minimum
sample size to detect an effect size of \(\delta\) = 4 mg/dL, with power of 0.8 and
significance level of 0.05.
The formula for estimating minimal sample size is \[n \approx \left( \frac{(z_{1-\alpha} +
z_{1-\beta}) \cdot \sigma}{\delta} \right)^2\]
We already have our z score for 1 - \(\alpha\), which is 1.645. Now we must get
our z score corresponding to 1-\(\beta\):
beta <- 0.2 # 1 - 0.8
crit.beta <- qnorm(1 - beta) # crit z value for 1 - Beta
crit.beta
[1] 0.8416212
Plugging in what we have now, we can estimate our necessary sample
size:
## Estimating Sample Size for Certain Conditions
# Sample Size Estimate Formula
sample.size <- (((crit.alpha + crit.beta)*sd)/delta)^2
sample.size
[1] 86.94221
Our estimated a-priori minimum sample size to achieve an effect size
of 4 mg/dL with power of 0.8 and significance level 0.05 is 87.
What’s interesting is how small the original sample size and the new
theoretical sample size is compared to the minimum sample size needed
for to get the power we desire. If we use the original sample size of 5,
the power is only 0.1472. It seems that increasing sample size increases
the power.
Part D
For this part, we will examine how power changes as our sample size
changes. To do this, we will create a function that uses different
values of the sample size and calculates the corresponding power. We
will then plot those values and see what happens. We will use the same
standard deviation, significance level, and effect size from before.
## Check Various Sample Sizes and Power
sd <- 15
delta <- 4
alpha = 0.05
# Crit Value: Same as Before
crit.alpha <- qnorm(1- alpha)
# Sequence of Sample Sizes
samp.sizes <- seq(5, 200, by = 5)
# Function to Compute Power
val.power <- sapply(samp.sizes, function(n) {
lambda <- delta/(sd / sqrt(n)) # non-centrality parameter
1 - pnorm(crit.alpha - lambda) # calculating power
})
# Plot Power vs Sample Size
plot(samp.sizes, val.power, type = "l", ylim = c(0,1), main = "Plot of Power vs Sample Size for Effect Size of 4 mg/dL", xlab = "Sample Size", ylab = "Power")
# Plot Reference Line for Power = 0.8
abline(h = 0.8, lty = 2)

We can see that we have a somewhat steady increase in power until
about 150 or so, when the increase starts to level off. We can also see
that our sample size calculation from part C holds up, as the graph
crosses the 0.8 mark when the sample size is around at around 85-87.
LS0tDQp0aXRsZTogIlNUQSA1MDYgQXNzaWdubWVudCA5OiBGdW5kYW1lbnRhbHMgb2YgSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3dlciBBbmFseXNpcyINCmF1dGhvcjogIklhbiBWYW5XcmlnaHQiDQpkYXRlOiAiMDQvMDcvMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkge2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiAgbGlicmFyeShwc3ljaCkNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikNCiAgbGlicmFyeShSQ29sb3JCcmV3ZXIpDQp9DQoNCmlmICghcmVxdWlyZSgiYm9vdCIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImJvb3QiKQ0KICBsaWJyYXJ5KGJvb3QpDQp9DQppZiAoIXJlcXVpcmUoImVmZnNpemUiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJlZmZzaXplIikNCiAgbGlicmFyeShlZmZzaXplKQ0KfQ0KaWYgKCFyZXF1aXJlKCJhc2JpbyIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImFzYmlvIikNCiAgbGlicmFyeShhc2JpbykNCn0NCmlmICghcmVxdWlyZSgicHdyc3MiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwd3JzcyIpDQogIGxpYnJhcnkocHdyc3MpDQp9DQogIA0KIyMgbGlicmFyeShlZmZzaXplKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCg0KDQojIEludHJvZHVjdGlvbg0KRm9yIHRoaXMgYXNzaWdubWVudCwgd2Ugd2lsbCBiZSB1c2luZyB2YXJpb3VzIHN0YXRpc3RpY2FsIG1ldGhvZHMgdG8gY29tcGFyZSB0d28gZHJ1Z3MgYW5kIHRoZWlyIGVmZmVjdHMgb24gTG93LURlbnNpdHkgTGlwb3Byb3RlaW4gKExETCk6IHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcsIHdoaWNoIGxvd2VycyBMREwgYnkgMjUgbWcvZEwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxNSBtZy9kTCwgYW5kIGEgZHJ1ZyBhIHBoYXJtZWNldXRpY2FsIGNvbXBhbnkgZGV2ZWxvcHMgY2FsbGVkICJDaG9sZXN0Rml4LCIgd2hpY2ggYSAzIG1vbnRoIGNsaW5pY2FsIHRyaWFsIG9mIDUgcGFydGljaXBhbnRzIGRldGVybWluZWQgdGhhdCB0aGlzIGRydWcgbG93ZXJzIExETCBieSAyOSBtZy9kTCBvbiBhdmVyYWdlLiBXZSB3aWxsIGFzc3VtZSB0aGF0IHRoaXMgZHJ1ZyBhbHNvIGhhcyBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxNSBtZy9kTCwgYW5kIHRoYXQgYm90aCBMREwgY2hhbmdlcyBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiANCg0KIyBQYXJ0IEENCkJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBjbGluaWNhbCB0cmlhbCwgcmVzZWFyY2hlcnMgYmVsaWV2ZSB0aGF0IENob2xlc3RGaXggaXMgdGhlIG1vcmUgZWZmZWN0aXZlIGRydWcuIEZvciB0aGlzIHBhcnQsIHdlIHdpbGwgZm9ybWFsbHkgdGVzdCB0aGF0IGh5cG90aGVzaXMgd2l0aCBhIHotdGVzdC4gVGhlIHJlYXNvbiB3ZSB1c2UgYSB6LXRlc3QgaXMgYmVjYXVzZSBvdXIgZGF0YSBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhbmQgb3VyICJwb3B1bGF0aW9uIiAodGhlIHN0YW5kYXJkIGRydWcgZWZmZWN0KSBzdGFuZGFyZCBkZXZpYXRpb24gaXMga25vd24uIFRoZSB6LXRlc3Qgd2lsbCBiZSBjb25kdWN0ZWQgYXQgc2lnbmlmaWNhbmNlIGxldmVsICRcYWxwaGEkID0gMC4wNS4NCg0KVGhlIG51bGwgaHlwb3RoZXNpcywgJEhfMCQsIGlzIHRoYXQgdGhlIG1lYW4gTERMIGRlY3JlYXNlIGZyb20gdGhlIHR3byBkcnVncyBpcyBlcXVhbC4gSW4gb3RoZXIgd29yZHMsIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIHR3byBkcnVncycgZWZmZWN0cy4gdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMsICRIX2EkLCBpcyB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiB0aGUgdHdvIGRydWdzIGVmZmVjdHMsIGFuZCB0aGF0IENob2xlc3RGaXggaXMgdGhlIG1vcmUgZWZmZWN0aXZlIGRydWcuIEluIG90aGVyIHdvcmRzLCB0aGUgYXZlcmFnZSBMREwgZGVjcmVhc2UgZnJvbSBDaG9sZXN0Rml4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgTERMIGRlY3JlYXNlIGZyb20gdGhlIHN0YW5kYXJkIGRydWcuIFRvIHB1dCBpbnRvIHN5bWJvbHMsIHdlIGhhdmU6DQoNCiQkSF8wOlxtdV9DID0gXG11X1MkJCAkJEhfYTogXG11X0MgXGd0IFxtdV9TJCQgDQoNCkFub3RoZXIgd2F5IHdlIGNhbiB3cml0ZSB0aGUgaHlwb3RoZXNlczoNCg0KJCRIXzA6IFxtdV9DIC0gXG11X1MgPSAwJCQgJCRIX2E6IFxtdV9DIC0gXG11X1MgXGd0IDAkJA0KDQpTaW5jZSB3ZSBoYXZlIGEgZGlyZWN0aW9uYWwgaHlwb3RoZXNpcyBhbmQgb3VyIHRlc3QgdXNlcyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgb3VyIHRlc3Qgd2lsbCBiZSBhIG9uZS10YWlsZWQgdGVzdCB1c2luZyB0aGUgcmlnaHQgdGFpbC4gVGhlIHRlc3Qgc3RhdGlzdGljIGZvcm11bGEgd2lsbCBiZToNCg0KJCR6ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtcc2lnbWEgLyBcc3FydHtufX0kJA0KDQpPdXIgdGVzdCBpcyBhcyBmb2xsb3dzOg0KYGBge3J9DQojIyBQZXJmb3JtIFotVGVzdA0KbXVfYyA8LSAyOSAjIG1lYW4gb2YgQ2hvbGVzdEZpeA0KbXVfcyA8LSAyNSAjIG1lYW4gb2Ygc3RhbmRhcmQgZHJ1ZyANCnNkIDwtIDE1ICMgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGJvdGggZHJ1Z3MNCm4gPC0gNSAjIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgaW4gY2xpbmljYWwgdHJpYWwNCg0KDQp6IDwtIChtdV9jIC0gbXVfcykvKHNkL3NxcnQobikpDQoNCnB2YWwgPC0gMSAtIHBub3JtKHopICMgUHJvYmFiaWxpdHkgaW4gcmlnaHQgdGFpbA0KDQp0ZXN0IDwtIGMoeiwgcHZhbCkgIyBaIHNjb3JlIGFuZCBwLXZhbHVlDQp0ZXN0DQpgYGANClRoZSB6IHNjb3JlIGZvciB0aGUgdGVzdCBpcyAwLjU5NjIgYW5kIG91ciBwLXZhbHVlIGlzIDAuMjc1NS4gU2luY2Ugb3VyIHAtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAuMDUsIHdlIHdpbGwgZmFpbCB0byByZWplY3Qgb3VyIG51bGwgaHlwb3RoZXNpcywgYW5kIHdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIG5vdCBlbm91Z2ggZXZpZGVuY2UgdG8gc3VnZ2VzdCB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSBzdGFuZGFyZCBkcnVnIGFuZCB0aGUgZWZmZWN0aXZlbmVzcyBvZiBDaG9sZXN0Rml4LCBhbmQgd2UgY2FuIGF0dHJpYnV0ZSBvdXIgcmVzdWx0cyB0byByYW5kb21uZXNzLg0KDQojIFBhcnQgQg0KRm9yIHRoaXMgcGFydCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2FsY3VsYXRpbmcgdGhlIHByb2JhYmlsaXR5IG9mIGEgdHJ1ZSBpbXByb3ZlbWVudCBnaXZlbiBzb21lIG5ldyBudW1iZXJzLiBXZSBhcmUgbm93IGludGVyZXN0ZWQgaW4gc2VlaW5nIGlmIHdlIGNhbiBnZXQgYSB0cnVlIGltcHJvdmVtZW50IGdpdmVuIGEgbmV3IHNhbXBsZSBzaXplIG9mIDUwIGFuZCBhbiBlZmZlY3Qgc2l6ZSBvZiAkXGRlbHRhJCA9IDQgbWcvZEwuIFdlIGFyZSBhc3N1bWluZyBubyBjaGFuZ2VzIHRvIGVpdGhlciBkcnVnIGZvciB0aGlzIHBhcnQuDQoNCkl0IGxvb2tzIGxpa2Ugd2UncmUgaW50ZXJlc3RlZCBpbiBjYWxjdWxhdGluZyB0aGUgcG9zdC1ob2MgcG93ZXIgb2YgdGhlIHRlc3QuIFRvIGRvIHNvLCB3ZSB3aWxsIG5lZWQgc2V2ZXJhbCB0aGluZ3M6IGZpcnN0IGlzIHRoZSBub25jZW50cmFsaXR5IHBhcmFtZXRlciwgJFxsYW1iZGEkLiBUaGUgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGlzOiAkJFxsYW1iZGEgPSBcZnJhY3tcbXUgLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19JCQgd2hpY2ggZXF1YWxzOiAkJFxsYW1iZGEgPSBcZnJhY3tcZGVsdGF9e1xzaWdtYSAvIFxzcXJ0e259fSQkDQoNClBsdWdnaW4gaW4gd2hhdCB3ZSB3YW50LCB3ZSBnZXQ6DQoNCiQkXGxhbWJkYSA9IFxmcmFjezR9ezE1IC8gXHNxcnR7NTB9fSQkIHdoaWNoIGdpdmVzIHVzICQkXGxhbWJkYSA9IDEuODg1NiBcbGRvdHMkJC4NCmBgYHtyfQ0KZGVsdGEgPC0gNCAjIEVmZmVjdCBTaXplDQpzZCA8LSAxNSAjIFN0YW5kYXJkIERldmlhdGlvbg0KbiA8LSA1MCAjIE5ldyBTYW1wbGUgU2l6ZQ0KDQpsYW1iZGEgPC0gZGVsdGEvKHNkL3NxcnQobikpDQpsYW1iZGENCmBgYA0KDQpUaGVuIHdlIG5lZWQgb3VyIGNyaXRpY2FsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpZ25pZmljYW5jZSBsZXZlbDoNCg0KYGBge3J9DQpjcml0LmFscGhhIDwtIHFub3JtKDAuOTUsIDAsIDEpICMgQ3JpdCBWYWx1ZSBvZiA5NSUgb2YgTm9ybWFsIERpc3RyaWJ1dGlvbg0KY3JpdC5hbHBoYQ0KYGBgDQpOb3cgd2UgY2FuIHVzZSB0aGUgZm9ybXVsYSB0byBmaW5kIHRoZSBwb3dlciBvZiB0aGUgdGVzdDoNCmBgYHtyfQ0KIyMgQ2FsY3VsYXRpbmcgUG93ZXIgZm9yIEVmZmVjdCBTaXplIG9mIDQgbWcvZEwNCg0KIyBQb3dlciBjYWxjdWxhdGlvbg0KcG93ZXIgPC0gMSAtIHBub3JtKGNyaXQuYWxwaGEgLSBsYW1iZGEpDQpwb3dlcg0KYGBgDQpUaGUgcHJvYmFiaWxpdHkgdGhhdCB3ZSBkZXRlY3QgYSB0cnVlIGltcHJvdmVtZW50LCBvciB0aGUgcG93ZXIgb2Ygb3VyIHRlc3QsIGlzIDAuNTk1MS4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBjb3JyZWN0bHkgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgd2hlbiB0aGUgbWVhbiBpcyAyOSBtZy9kTCBhYm91dCA1OS41MSUgb2YgdGhlIHRpbWUuDQoNCiMgUGFydCBDDQpGb3IgdGhpcyBwYXJ0LCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjYWxjdWxhdGluZyB0aGUgYS1wcmlvcmkgbWluaW11bSBzYW1wbGUgc2l6ZSB0byBkZXRlY3QgYW4gZWZmZWN0IHNpemUgb2YgJFxkZWx0YSQgPSA0IG1nL2RMLCB3aXRoIHBvd2VyIG9mIDAuOCBhbmQgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUuIA0KDQpUaGUgZm9ybXVsYSBmb3IgZXN0aW1hdGluZyBtaW5pbWFsIHNhbXBsZSBzaXplIGlzDQokJG4gXGFwcHJveCBcbGVmdCggXGZyYWN7KHpfezEtXGFscGhhfSArIHpfezEtXGJldGF9KSBcY2RvdCBcc2lnbWF9e1xkZWx0YX0gXHJpZ2h0KV4yJCQNCg0KV2UgYWxyZWFkeSBoYXZlIG91ciB6IHNjb3JlIGZvciAxIC0gJFxhbHBoYSQsIHdoaWNoIGlzIDEuNjQ1LiBOb3cgd2UgbXVzdCBnZXQgb3VyIHogc2NvcmUgY29ycmVzcG9uZGluZyB0byAxLSRcYmV0YSQ6DQpgYGB7cn0NCmJldGEgPC0gMC4yICMgMSAtIDAuOA0KDQpjcml0LmJldGEgPC0gcW5vcm0oMSAtIGJldGEpICMgY3JpdCB6IHZhbHVlIGZvciAxIC0gQmV0YQ0KY3JpdC5iZXRhDQpgYGANCg0KUGx1Z2dpbmcgaW4gd2hhdCB3ZSBoYXZlIG5vdywgd2UgY2FuIGVzdGltYXRlIG91ciBuZWNlc3Nhcnkgc2FtcGxlIHNpemU6DQpgYGB7cn0NCiMjIEVzdGltYXRpbmcgU2FtcGxlIFNpemUgZm9yIENlcnRhaW4gQ29uZGl0aW9ucw0KDQojIFNhbXBsZSBTaXplIEVzdGltYXRlIEZvcm11bGENCnNhbXBsZS5zaXplIDwtICgoKGNyaXQuYWxwaGEgKyBjcml0LmJldGEpKnNkKS9kZWx0YSleMiANCnNhbXBsZS5zaXplDQpgYGANCg0KT3VyIGVzdGltYXRlZCBhLXByaW9yaSBtaW5pbXVtIHNhbXBsZSBzaXplIHRvIGFjaGlldmUgYW4gZWZmZWN0IHNpemUgb2YgNCBtZy9kTCB3aXRoIHBvd2VyIG9mIDAuOCBhbmQgc2lnbmlmaWNhbmNlIGxldmVsIDAuMDUgaXMgODcuDQoNCldoYXQncyBpbnRlcmVzdGluZyBpcyBob3cgc21hbGwgdGhlIG9yaWdpbmFsIHNhbXBsZSBzaXplIGFuZCB0aGUgbmV3IHRoZW9yZXRpY2FsIHNhbXBsZSBzaXplIGlzIGNvbXBhcmVkIHRvIHRoZSBtaW5pbXVtIHNhbXBsZSBzaXplIG5lZWRlZCBmb3IgdG8gZ2V0IHRoZSBwb3dlciB3ZSBkZXNpcmUuIElmIHdlIHVzZSB0aGUgb3JpZ2luYWwgc2FtcGxlIHNpemUgb2YgNSwgdGhlIHBvd2VyIGlzIG9ubHkgMC4xNDcyLiBJdCBzZWVtcyB0aGF0IGluY3JlYXNpbmcgc2FtcGxlIHNpemUgaW5jcmVhc2VzIHRoZSBwb3dlci4NCg0KDQojIyBQYXJ0IEQNCkZvciB0aGlzIHBhcnQsIHdlIHdpbGwgZXhhbWluZSBob3cgcG93ZXIgY2hhbmdlcyBhcyBvdXIgc2FtcGxlIHNpemUgY2hhbmdlcy4gVG8gZG8gdGhpcywgd2Ugd2lsbCBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHVzZXMgZGlmZmVyZW50IHZhbHVlcyBvZiB0aGUgc2FtcGxlIHNpemUgYW5kIGNhbGN1bGF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgcG93ZXIuIFdlIHdpbGwgdGhlbiBwbG90IHRob3NlIHZhbHVlcyBhbmQgc2VlIHdoYXQgaGFwcGVucy4gV2Ugd2lsbCB1c2UgdGhlIHNhbWUgc3RhbmRhcmQgZGV2aWF0aW9uLCBzaWduaWZpY2FuY2UgbGV2ZWwsIGFuZCBlZmZlY3Qgc2l6ZSBmcm9tIGJlZm9yZS4NCg0KYGBge3J9IA0KIyMgQ2hlY2sgVmFyaW91cyBTYW1wbGUgU2l6ZXMgYW5kIFBvd2VyDQoNCnNkIDwtIDE1DQpkZWx0YSA8LSA0DQphbHBoYSA9IDAuMDUNCg0KIyBDcml0IFZhbHVlOiBTYW1lIGFzIEJlZm9yZQ0KY3JpdC5hbHBoYSA8LSBxbm9ybSgxLSBhbHBoYSkNCg0KIyBTZXF1ZW5jZSBvZiBTYW1wbGUgU2l6ZXMNCnNhbXAuc2l6ZXMgPC0gc2VxKDUsIDIwMCwgYnkgPSA1KQ0KDQojIEZ1bmN0aW9uIHRvIENvbXB1dGUgUG93ZXINCnZhbC5wb3dlciA8LSBzYXBwbHkoc2FtcC5zaXplcywgZnVuY3Rpb24obikgew0KICBsYW1iZGEgPC0gZGVsdGEvKHNkIC8gc3FydChuKSkgICMgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyDQogIDEgLSBwbm9ybShjcml0LmFscGhhIC0gbGFtYmRhKSAjIGNhbGN1bGF0aW5nIHBvd2VyDQp9KQ0KDQojIFBsb3QgUG93ZXIgdnMgU2FtcGxlIFNpemUNCnBsb3Qoc2FtcC5zaXplcywgdmFsLnBvd2VyLCB0eXBlID0gImwiLCB5bGltID0gYygwLDEpLCBtYWluID0gIlBsb3Qgb2YgUG93ZXIgdnMgU2FtcGxlIFNpemUgZm9yIEVmZmVjdCBTaXplIG9mIDQgbWcvZEwiLCB4bGFiID0gIlNhbXBsZSBTaXplIiwgeWxhYiA9ICJQb3dlciIpDQoNCiMgUGxvdCBSZWZlcmVuY2UgTGluZSBmb3IgUG93ZXIgPSAwLjgNCmFibGluZShoID0gMC44LCBsdHkgPSAyKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCB3ZSBoYXZlIGEgc29tZXdoYXQgc3RlYWR5IGluY3JlYXNlIGluIHBvd2VyIHVudGlsIGFib3V0IDE1MCBvciBzbywgd2hlbiB0aGUgaW5jcmVhc2Ugc3RhcnRzIHRvIGxldmVsIG9mZi4gV2UgY2FuIGFsc28gc2VlIHRoYXQgb3VyIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uIGZyb20gcGFydCBDIGhvbGRzIHVwLCBhcyB0aGUgZ3JhcGggY3Jvc3NlcyB0aGUgMC44IG1hcmsgd2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgYXJvdW5kIGF0IGFyb3VuZCA4NS04Ny4NCg==