Question (a):
Hypothesis Test for LDL Reduction
Step 1: Problem
Setup
We are given the following information:
- Sample size: \(n = 5\)
- Sample mean: \(\bar{x} = 29\)
- Population mean under standard drug: \(\mu_0 = 25\)
- Population standard deviation: \(\sigma =
15\)
- Significance level: \(\alpha =
0.05\)
The researchers believe that the new drug is more
effective, meaning it leads to a greater LDL reduction.
Step 2:
Hypotheses
We formulate a one-sided hypothesis test:
\[
H_0: \mu = 25
\] \[
H_a: \mu > 25
\]
Step 3: Test
Statistic
Since the population standard deviation \(\sigma\) is known, we use a
one-sample z-test:
\[
Z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}
\]
Substituting the values:
\[
Z = \frac{29 - 25}{15 / \sqrt{5}} = \frac{4}{15 / \sqrt{5}} =
\frac{4\sqrt{5}}{15}
\]
\[
Z \approx 0.596
\]
Step 4: Critical
Value
For a right-tailed test at \(\alpha =
0.05\):
\[
z_{0.05} = 1.645
\]
Step 5: Decision
Since:
\[
Z = 0.596 < 1.645
\]
we fail to reject \(H_0\).
Step 6:
Interpretation
There is insufficient statistical evidence at the \(\alpha = 0.05\) level to conclude that the
new drug results in a greater mean LDL reduction compared to the
standard treatment.
Verification Using
R
# Given values
x_bar <- 29 # sample mean
mu_0 <- 25 # null mean
sigma <- 15 # known population standard deviation
n <- 5 # sample size
# Compute z-statistic
z_stat <- (x_bar - mu_0) / (sigma / sqrt(n))
# Compute p-value for right-tailed test
p_value <- 1 - pnorm(z_stat)
# Critical value at alpha = 0.05
z_crit <- qnorm(0.95)
# Output results
cat("Z-statistic:", round(z_stat, 3), "\n")
Z-statistic: 0.596
cat("Critical value:", round(z_crit, 3), "\n")
Critical value: 1.645
cat("P-value:", round(p_value, 4), "\n")
P-value: 0.2755
Summary
The observed sample mean LDL reduction (\(\bar{x} = 29\)) is higher than the standard
treatment mean of \(\mu_0 = 25\).
However, when standardized using the standard error \(\sigma/\sqrt{n} = 15/\sqrt{5} \approx
6.71\), the resulting test statistic is \(Z \approx 0.596\), which is relatively
small.
This analysis is valid because the population standard deviation is
assumed known and the test follows a normal model, allowing the use of a
one-sample z-test. The hypothesis test is correctly specified as a
right-tailed test based on the research claim that the new drug is more
effective.
The results indicate that the observed difference of 4 mg/dL is small
relative to the variability in the data. Under the null hypothesis, such
a sample mean is not unlikely (p-value ≈ 0.28), meaning it could
reasonably occur due to random sampling variation. Therefore, there is
insufficient evidence to conclude that the new drug provides a greater
mean LDL reduction.
Question (b): Power
Calculation
Step 1: Problem
Setup
We are given:
- Sample size: \(n = 50\)
- Standard deviation: \(\sigma =
15\)
- Significance level: \(\alpha =
0.05\)
- Effect size to detect: \(\delta =
4\)
We are testing:
\[
H_0: \mu = 25 \quad \text{vs.} \quad H_a: \mu > 25
\]
Step 2: Test
Framework
We use a one-sided z-test, since \(\sigma\) is known.
The rejection rule is:
\[
Z > z_{1-\alpha}
\]
where:
\[
z_{1-\alpha} = z_{0.95} = 1.645
\]
Step 3:
Non-Centrality Parameter
The non-centrality parameter is:
\[
\lambda = \frac{\mu - \mu_0}{\sigma / \sqrt{n}} = \frac{\delta}{\sigma /
\sqrt{n}}
\]
Substituting values:
\[
\lambda = \frac{4}{15/\sqrt{50}} = \frac{4\sqrt{50}}{15} \approx 1.886
\]
Step 4: Power
Calculation
Power is:
\[
\text{Power} = P\left(Z > z_{1-\alpha} \mid \mu = 29\right)
\]
This can be rewritten using the shift:
\[
\text{Power} = P\left(Z > 1.645 - \lambda\right)
\]
\[
= 1 - \Phi(1.645 - 1.886)
\]
\[
= 1 - \Phi(-0.241)
\]
\[
\approx 1 - 0.405 = 0.595
\]
Step 5: Result
\[
\text{Power} \approx 0.595
\]
Verification Using
R
# Given values
n <- 50
sigma <- 15
delta <- 4
alpha <- 0.05
# Standard error
se <- sigma / sqrt(n)
# Non-centrality parameter
lambda <- delta / se
# Critical value
z_crit <- qnorm(1 - alpha)
# Power calculation
power <- 1 - pnorm(z_crit - lambda)
# Output
cat("Non-centrality parameter:", round(lambda, 3), "\n")
Non-centrality parameter: 1.886
cat("Critical value:", round(z_crit, 3), "\n")
Critical value: 1.645
cat("Power:", round(power, 4), "\n")
Power: 0.5951
Summary
The calculated power is approximately 0.595, indicating about a 59.5%
chance of correctly rejecting the null hypothesis when the true mean
improvement is 4 mg/dL.
This analysis is valid because it follows the theoretical framework
for power calculation using the normal distribution, as outlined in the
lecture notes. The known population standard deviation justifies the use
of a z-test, and the non-centrality parameter correctly captures the
distance between H 0 and H a
The result shows that even with a larger sample size (n=50), the
probability of detecting a true improvement of 4 mg/dL is still
moderate. This reflects that the effect size is relatively small
compared to the variability (σ=15). Consequently, there remains a
substantial probability (about 40%) of failing to detect a real
improvement, highlighting the importance of either increasing sample
size or targeting larger effect sizes in study design.
Question (c): Minimum
Sample Size Determination
Step 1: Problem
Setup
We are given:
- Desired power: \(1 - \beta =
0.80\)
- Significance level: \(\alpha =
0.05\)
- Standard deviation: \(\sigma =
15\)
- Effect size: \(\delta = 4\)
We are testing:
\[
H_0: \mu = 25 \quad \text{vs.} \quad H_a: \mu > 25
\]
Step 3: Manual
Calculation
\[
n \approx \left( \frac{(1.645 + 0.842)\cdot 15}{4} \right)^2
\]
\[
= \left( \frac{2.487 \cdot 15}{4} \right)^2
= \left( \frac{37.305}{4} \right)^2
= (9.326)^2
\approx 86.98
\]
\[
n \approx 87
\]
Step 4: Result
\[
\boxed{n = 87}
\]
Verification Using
R
# Use built-in function to compute required sample size
sample_size <- power.t.test(power = 0.80,
delta = 4, # effect size
sd = 15, # standard deviation
sig.level = 0.05,
type = "one.sample",
alternative = "one.sided")
# Round up since sample size must be an integer
ceiling(sample_size$n)
[1] 89
Summary
The required sample size to achieve 80% power for detecting a 4 mg/dL
improvement is approximately n=87.This analysis is valid because it
follows the standard sample size determination framework based on normal
approximations, as outlined in the lecture notes. The formula
incorporates both the significance level (α) and desired power (1−β),
ensuring that the test has a controlled Type I error rate and a
sufficiently high probability of detecting a true effect.
The result highlights that a substantially larger sample size is
needed compared to part (b). This reflects the relatively small effect
size (δ=4) compared to the variability (σ=15). Detecting such a modest
improvement with high reliability requires more observations,
reinforcing the tradeoff between effect size, variability, and sample
size in hypothesis testing.
Question (d): Power
Curve as a Function of Sample Size
Step 1:
Objective
We examine how statistical power changes as the sample size \(n\) varies, while holding all other
parameters fixed.
Given:
- Effect size: \(\delta = 4\)
- Standard deviation: \(\sigma =
15\)
- Significance level: \(\alpha =
0.05\)
- One-sided test
Step 2: Power
Function
power is given by:
\[
\text{Power}(n) = 1 - \Phi\left(z_{1-\alpha} -
\frac{\delta}{\sigma/\sqrt{n}}\right)
\]
where:
\[
\lambda(n) = \frac{\delta}{\sigma/\sqrt{n}} = \frac{\delta
\sqrt{n}}{\sigma}
\]
Step 3: Compute Power
Across Sample Sizes
We evaluate power for a sequence of sample sizes to observe how it
increases with \(n\).
# Parameters
sigma <- 15
delta <- 4
alpha <- 0.05
# Critical value
z_crit <- qnorm(1 - alpha)
# Sequence of sample sizes
n_values <- seq(5, 150, by = 1)
# Compute power for each n
power_values <- sapply(n_values, function(n) {
lambda <- delta / (sigma / sqrt(n)) # non-centrality parameter
1 - pnorm(z_crit - lambda)
})
# Plot power curve
plot(n_values, power_values, type = "l",
xlab = "Sample Size (n)",
ylab = "Power",
main = "Power Curve for Detecting δ = 4",
lwd = 2)
# Add reference line at 80% power
abline(h = 0.80, lty = 2)

Interpretation
The plot shows that power increases monotonically as the sample size
increases. For small \(n\), power is
low due to high variability in the sample mean. As \(n\) grows, the standard error \(\sigma/\sqrt{n}\) decreases, making it
easier to detect the effect.
The curve crosses the 0.80 threshold at approximately \(n \approx 87\), which is consistent with
the result obtained in part (c).
Summary
The power curve demonstrates the relationship between sample size and
the ability to detect a true effect. As sample size increases, the
variability of the sample mean decreases, leading to higher power.
This analysis is valid because it directly applies the theoretical
power function derived from the normal distribution and uses consistent
parameter values from previous parts. The use of a continuous range of n
values allows for a clear visualization of how power evolves.
The results confirm that small sample sizes provide insufficient
power to detect modest effects, while larger samples substantially
improve the probability of correctly rejecting the null hypothesis. This
reinforces the conclusion from part (c) that a sample size of
approximately 87 is required to achieve 80% power for detecting a 4
mg/dL improvement.
LS0tDQp0aXRsZTogJ1NUQSA1MDYgSE9NRVdPUksgOScNCmF1dGhvcjogJ0dlcmFyZCBJa2UnDQpkYXRlOiAiMjAyNi0wNC0wNyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQoNCmlmICghcmVxdWlyZSgia25pdHIiKSkgeyAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdG8gZGV0ZWN0DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGEgcGFja2FnZSB3YXMgaW5zdGFsbGVkIGluDQogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQNCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgaXQgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Lg0KIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAgICAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgICAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAgICAgICAjIHN1cHByZXNzIG1lc3NhZ2VzIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBkZWZhdWx0IGxlYWRpbmcgaGFzaCB0YWdzIGluIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBRdWVzdGlvbiAoYSk6IEh5cG90aGVzaXMgVGVzdCBmb3IgTERMIFJlZHVjdGlvbg0KDQojIyBTdGVwIDE6IFByb2JsZW0gU2V0dXANCg0KV2UgYXJlIGdpdmVuIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246DQoNCi0gU2FtcGxlIHNpemU6IFwoIG4gPSA1IFwpDQotIFNhbXBsZSBtZWFuOiBcKCBcYmFye3h9ID0gMjkgXCkNCi0gUG9wdWxhdGlvbiBtZWFuIHVuZGVyIHN0YW5kYXJkIGRydWc6IFwoIFxtdV8wID0gMjUgXCkNCi0gUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb246IFwoIFxzaWdtYSA9IDE1IFwpDQotIFNpZ25pZmljYW5jZSBsZXZlbDogXCggXGFscGhhID0gMC4wNSBcKQ0KDQpUaGUgcmVzZWFyY2hlcnMgYmVsaWV2ZSB0aGF0IHRoZSBuZXcgZHJ1ZyBpcyAqKm1vcmUgZWZmZWN0aXZlKiosIG1lYW5pbmcgaXQgbGVhZHMgdG8gYSBncmVhdGVyIExETCByZWR1Y3Rpb24uDQoNCi0tLQ0KDQojIyBTdGVwIDI6IEh5cG90aGVzZXMNCg0KV2UgZm9ybXVsYXRlIGEgb25lLXNpZGVkIGh5cG90aGVzaXMgdGVzdDoNCg0KXFsNCkhfMDogXG11ID0gMjUNClxdDQpcWw0KSF9hOiBcbXUgPiAyNQ0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgMzogVGVzdCBTdGF0aXN0aWMNCg0KU2luY2UgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIFwoIFxzaWdtYSBcKSBpcyBrbm93biwgd2UgdXNlIGEgKipvbmUtc2FtcGxlIHotdGVzdCoqOg0KDQpcWw0KWiA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19DQpcXQ0KDQpTdWJzdGl0dXRpbmcgdGhlIHZhbHVlczoNCg0KXFsNClogPSBcZnJhY3syOSAtIDI1fXsxNSAvIFxzcXJ0ezV9fSA9IFxmcmFjezR9ezE1IC8gXHNxcnR7NX19ID0gXGZyYWN7NFxzcXJ0ezV9fXsxNX0NClxdDQoNClxbDQpaIFxhcHByb3ggMC41OTYNClxdDQoNCi0tLQ0KDQojIyBTdGVwIDQ6IENyaXRpY2FsIFZhbHVlDQoNCkZvciBhIHJpZ2h0LXRhaWxlZCB0ZXN0IGF0IFwoIFxhbHBoYSA9IDAuMDUgXCk6DQoNClxbDQp6X3swLjA1fSA9IDEuNjQ1DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCA1OiBEZWNpc2lvbg0KDQpTaW5jZToNCg0KXFsNClogPSAwLjU5NiA8IDEuNjQ1DQpcXQ0KDQp3ZSAqKmZhaWwgdG8gcmVqZWN0KiogXCggSF8wIFwpLg0KDQotLS0NCg0KIyMgU3RlcCA2OiBJbnRlcnByZXRhdGlvbg0KDQpUaGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RhdGlzdGljYWwgZXZpZGVuY2UgYXQgdGhlIFwoIFxhbHBoYSA9IDAuMDUgXCkgbGV2ZWwgdG8gY29uY2x1ZGUgdGhhdCB0aGUgbmV3IGRydWcgcmVzdWx0cyBpbiBhIGdyZWF0ZXIgbWVhbiBMREwgcmVkdWN0aW9uIGNvbXBhcmVkIHRvIHRoZSBzdGFuZGFyZCB0cmVhdG1lbnQuDQoNCi0tLQ0KDQojIyBWZXJpZmljYXRpb24gVXNpbmcgUg0KDQpgYGB7cn0NCiMgR2l2ZW4gdmFsdWVzDQp4X2JhciA8LSAyOSAgICAgICAjIHNhbXBsZSBtZWFuDQptdV8wIDwtIDI1ICAgICAgICAjIG51bGwgbWVhbg0Kc2lnbWEgPC0gMTUgICAgICAgIyBrbm93biBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbg0KbiA8LSA1ICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZQ0KDQojIENvbXB1dGUgei1zdGF0aXN0aWMNCnpfc3RhdCA8LSAoeF9iYXIgLSBtdV8wKSAvIChzaWdtYSAvIHNxcnQobikpDQoNCiMgQ29tcHV0ZSBwLXZhbHVlIGZvciByaWdodC10YWlsZWQgdGVzdA0KcF92YWx1ZSA8LSAxIC0gcG5vcm0oel9zdGF0KQ0KDQojIENyaXRpY2FsIHZhbHVlIGF0IGFscGhhID0gMC4wNQ0Kel9jcml0IDwtIHFub3JtKDAuOTUpDQoNCiMgT3V0cHV0IHJlc3VsdHMNCmNhdCgiWi1zdGF0aXN0aWM6Iiwgcm91bmQoel9zdGF0LCAzKSwgIlxuIikNCmNhdCgiQ3JpdGljYWwgdmFsdWU6Iiwgcm91bmQoel9jcml0LCAzKSwgIlxuIikNCmNhdCgiUC12YWx1ZToiLCByb3VuZChwX3ZhbHVlLCA0KSwgIlxuIikNCmBgYA0KDQoNCiMjIFN1bW1hcnkNCg0KVGhlIG9ic2VydmVkIHNhbXBsZSBtZWFuIExETCByZWR1Y3Rpb24gKFwoIFxiYXJ7eH0gPSAyOSBcKSkgaXMgaGlnaGVyIHRoYW4gdGhlIHN0YW5kYXJkIHRyZWF0bWVudCBtZWFuIG9mIFwoIFxtdV8wID0gMjUgXCkuIEhvd2V2ZXIsIHdoZW4gc3RhbmRhcmRpemVkIHVzaW5nIHRoZSBzdGFuZGFyZCBlcnJvciBcKCBcc2lnbWEvXHNxcnR7bn0gPSAxNS9cc3FydHs1fSBcYXBwcm94IDYuNzEgXCksIHRoZSByZXN1bHRpbmcgdGVzdCBzdGF0aXN0aWMgaXMgXCggWiBcYXBwcm94IDAuNTk2IFwpLCB3aGljaCBpcyByZWxhdGl2ZWx5IHNtYWxsLg0KDQpUaGlzIGFuYWx5c2lzIGlzIHZhbGlkIGJlY2F1c2UgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGFzc3VtZWQga25vd24gYW5kIHRoZSB0ZXN0IGZvbGxvd3MgYSBub3JtYWwgbW9kZWwsIGFsbG93aW5nIHRoZSB1c2Ugb2YgYSBvbmUtc2FtcGxlIHotdGVzdC4gVGhlIGh5cG90aGVzaXMgdGVzdCBpcyBjb3JyZWN0bHkgc3BlY2lmaWVkIGFzIGEgcmlnaHQtdGFpbGVkIHRlc3QgYmFzZWQgb24gdGhlIHJlc2VhcmNoIGNsYWltIHRoYXQgdGhlIG5ldyBkcnVnIGlzIG1vcmUgZWZmZWN0aXZlLg0KDQpUaGUgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IHRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlIG9mIDQgbWcvZEwgaXMgc21hbGwgcmVsYXRpdmUgdG8gdGhlIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLiBVbmRlciB0aGUgbnVsbCBoeXBvdGhlc2lzLCBzdWNoIGEgc2FtcGxlIG1lYW4gaXMgbm90IHVubGlrZWx5IChwLXZhbHVlIOKJiCAwLjI4KSwgbWVhbmluZyBpdCBjb3VsZCByZWFzb25hYmx5IG9jY3VyIGR1ZSB0byByYW5kb20gc2FtcGxpbmcgdmFyaWF0aW9uLiBUaGVyZWZvcmUsIHRoZXJlIGlzIGluc3VmZmljaWVudCBldmlkZW5jZSB0byBjb25jbHVkZSB0aGF0IHRoZSBuZXcgZHJ1ZyBwcm92aWRlcyBhIGdyZWF0ZXIgbWVhbiBMREwgcmVkdWN0aW9uLg0KDQoNCg0KIyBRdWVzdGlvbiAoYik6IFBvd2VyIENhbGN1bGF0aW9uDQoNCiMjIFN0ZXAgMTogUHJvYmxlbSBTZXR1cA0KDQpXZSBhcmUgZ2l2ZW46DQoNCi0gU2FtcGxlIHNpemU6IFwoIG4gPSA1MCBcKQ0KLSBTdGFuZGFyZCBkZXZpYXRpb246IFwoIFxzaWdtYSA9IDE1IFwpDQotIFNpZ25pZmljYW5jZSBsZXZlbDogXCggXGFscGhhID0gMC4wNSBcKQ0KLSBFZmZlY3Qgc2l6ZSB0byBkZXRlY3Q6IFwoIFxkZWx0YSA9IDQgXCkNCg0KV2UgYXJlIHRlc3Rpbmc6DQoNClxbDQpIXzA6IFxtdSA9IDI1IFxxdWFkIFx0ZXh0e3ZzLn0gXHF1YWQgSF9hOiBcbXUgPiAyNQ0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgMjogVGVzdCBGcmFtZXdvcmsNCg0KV2UgdXNlIGEgKipvbmUtc2lkZWQgei10ZXN0KiosIHNpbmNlIFwoIFxzaWdtYSBcKSBpcyBrbm93bi4NCg0KVGhlIHJlamVjdGlvbiBydWxlIGlzOg0KDQpcWw0KWiA+IHpfezEtXGFscGhhfQ0KXF0NCg0Kd2hlcmU6DQoNClxbDQp6X3sxLVxhbHBoYX0gPSB6X3swLjk1fSA9IDEuNjQ1DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCAzOiBOb24tQ2VudHJhbGl0eSBQYXJhbWV0ZXINCg0KVGhlIG5vbi1jZW50cmFsaXR5IHBhcmFtZXRlciBpczoNCg0KXFsNClxsYW1iZGEgPSBcZnJhY3tcbXUgLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19ID0gXGZyYWN7XGRlbHRhfXtcc2lnbWEgLyBcc3FydHtufX0NClxdDQoNClN1YnN0aXR1dGluZyB2YWx1ZXM6DQoNClxbDQpcbGFtYmRhID0gXGZyYWN7NH17MTUvXHNxcnR7NTB9fSA9IFxmcmFjezRcc3FydHs1MH19ezE1fSBcYXBwcm94IDEuODg2DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCA0OiBQb3dlciBDYWxjdWxhdGlvbg0KDQpQb3dlciBpczoNCg0KXFsNClx0ZXh0e1Bvd2VyfSA9IFBcbGVmdChaID4gel97MS1cYWxwaGF9IFxtaWQgXG11ID0gMjlccmlnaHQpDQpcXQ0KDQpUaGlzIGNhbiBiZSByZXdyaXR0ZW4gdXNpbmcgdGhlIHNoaWZ0Og0KDQpcWw0KXHRleHR7UG93ZXJ9ID0gUFxsZWZ0KFogPiAxLjY0NSAtIFxsYW1iZGFccmlnaHQpDQpcXQ0KDQpcWw0KPSAxIC0gXFBoaSgxLjY0NSAtIDEuODg2KQ0KXF0NCg0KXFsNCj0gMSAtIFxQaGkoLTAuMjQxKQ0KXF0NCg0KXFsNClxhcHByb3ggMSAtIDAuNDA1ID0gMC41OTUNClxdDQoNCi0tLQ0KDQojIyBTdGVwIDU6IFJlc3VsdA0KDQpcWw0KXHRleHR7UG93ZXJ9IFxhcHByb3ggMC41OTUNClxdDQoNCi0tLQ0KDQojIyBWZXJpZmljYXRpb24gVXNpbmcgUg0KDQpgYGB7cn0NCiMgR2l2ZW4gdmFsdWVzDQpuIDwtIDUwDQpzaWdtYSA8LSAxNQ0KZGVsdGEgPC0gNA0KYWxwaGEgPC0gMC4wNQ0KDQojIFN0YW5kYXJkIGVycm9yDQpzZSA8LSBzaWdtYSAvIHNxcnQobikNCg0KIyBOb24tY2VudHJhbGl0eSBwYXJhbWV0ZXINCmxhbWJkYSA8LSBkZWx0YSAvIHNlDQoNCiMgQ3JpdGljYWwgdmFsdWUNCnpfY3JpdCA8LSBxbm9ybSgxIC0gYWxwaGEpDQoNCiMgUG93ZXIgY2FsY3VsYXRpb24NCnBvd2VyIDwtIDEgLSBwbm9ybSh6X2NyaXQgLSBsYW1iZGEpDQoNCiMgT3V0cHV0DQpjYXQoIk5vbi1jZW50cmFsaXR5IHBhcmFtZXRlcjoiLCByb3VuZChsYW1iZGEsIDMpLCAiXG4iKQ0KY2F0KCJDcml0aWNhbCB2YWx1ZToiLCByb3VuZCh6X2NyaXQsIDMpLCAiXG4iKQ0KY2F0KCJQb3dlcjoiLCByb3VuZChwb3dlciwgNCksICJcbiIpDQpgYGANCg0KIyMgU3VtbWFyeQ0KVGhlIGNhbGN1bGF0ZWQgcG93ZXIgaXMgYXBwcm94aW1hdGVseSANCjAuNTk1LCBpbmRpY2F0aW5nIGFib3V0IGEgNTkuNSUgY2hhbmNlIG9mIGNvcnJlY3RseSByZWplY3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyB3aGVuIHRoZSB0cnVlIG1lYW4gaW1wcm92ZW1lbnQgaXMgNCBtZy9kTC4NCg0KVGhpcyBhbmFseXNpcyBpcyB2YWxpZCBiZWNhdXNlIGl0IGZvbGxvd3MgdGhlIHRoZW9yZXRpY2FsIGZyYW1ld29yayBmb3IgcG93ZXIgY2FsY3VsYXRpb24gdXNpbmcgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24sIGFzIG91dGxpbmVkIGluIHRoZSBsZWN0dXJlIG5vdGVzLiBUaGUga25vd24gcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24ganVzdGlmaWVzIHRoZSB1c2Ugb2YgYSB6LXRlc3QsIGFuZCB0aGUgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGNvcnJlY3RseSBjYXB0dXJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiANCkgNCjANCiBhbmQgDQpIDQphDQoJDQpUaGUgcmVzdWx0IHNob3dzIHRoYXQgZXZlbiB3aXRoIGEgbGFyZ2VyIHNhbXBsZSBzaXplIChuPTUwKSwgdGhlIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhIHRydWUgaW1wcm92ZW1lbnQgb2YgNCBtZy9kTCBpcyBzdGlsbCBtb2RlcmF0ZS4gVGhpcyByZWZsZWN0cyB0aGF0IHRoZSBlZmZlY3Qgc2l6ZSBpcyByZWxhdGl2ZWx5IHNtYWxsIGNvbXBhcmVkIHRvIHRoZSB2YXJpYWJpbGl0eSAoz4M9MTUpLiBDb25zZXF1ZW50bHksIHRoZXJlIHJlbWFpbnMgYSBzdWJzdGFudGlhbCBwcm9iYWJpbGl0eSAoYWJvdXQgNDAlKSBvZiBmYWlsaW5nIHRvIGRldGVjdCBhIHJlYWwgaW1wcm92ZW1lbnQsIGhpZ2hsaWdodGluZyB0aGUgaW1wb3J0YW5jZSBvZiBlaXRoZXIgaW5jcmVhc2luZyBzYW1wbGUgc2l6ZSBvciB0YXJnZXRpbmcgbGFyZ2VyIGVmZmVjdCBzaXplcyBpbiBzdHVkeSBkZXNpZ24uDQoNCg0KIyBRdWVzdGlvbiAoYyk6IE1pbmltdW0gU2FtcGxlIFNpemUgRGV0ZXJtaW5hdGlvbg0KDQojIyBTdGVwIDE6IFByb2JsZW0gU2V0dXANCg0KV2UgYXJlIGdpdmVuOg0KDQotIERlc2lyZWQgcG93ZXI6IFwoIDEgLSBcYmV0YSA9IDAuODAgXCkNCi0gU2lnbmlmaWNhbmNlIGxldmVsOiBcKCBcYWxwaGEgPSAwLjA1IFwpDQotIFN0YW5kYXJkIGRldmlhdGlvbjogXCggXHNpZ21hID0gMTUgXCkNCi0gRWZmZWN0IHNpemU6IFwoIFxkZWx0YSA9IDQgXCkNCg0KV2UgYXJlIHRlc3Rpbmc6DQoNClxbDQpIXzA6IFxtdSA9IDI1IFxxdWFkIFx0ZXh0e3ZzLn0gXHF1YWQgSF9hOiBcbXUgPiAyNQ0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgMjogQXBwcm94aW1hdGUgU2FtcGxlIFNpemUgRm9ybXVsYQ0KDQpUaGUgcmVxdWlyZWQgc2FtcGxlIHNpemUgY2FuIGJlIGFwcHJveGltYXRlZCB1c2luZzoNCg0KXFsNCm4gXGFwcHJveCBcbGVmdCggXGZyYWN7KHpfezEtXGFscGhhfSArIHpfezEtXGJldGF9KSBcY2RvdCBcc2lnbWF9e1xkZWx0YX0gXHJpZ2h0KV4yDQpcXQ0KDQpGb3IgYSBvbmUtc2lkZWQgdGVzdDoNCg0KLSBcKCB6X3sxLVxhbHBoYX0gPSB6X3swLjk1fSA9IDEuNjQ1IFwpDQotIFwoIHpfezEtXGJldGF9ID0gel97MC44MH0gPSAwLjg0MiBcKQ0KDQotLS0NCg0KIyMgU3RlcCAzOiBNYW51YWwgQ2FsY3VsYXRpb24NCg0KXFsNCm4gXGFwcHJveCBcbGVmdCggXGZyYWN7KDEuNjQ1ICsgMC44NDIpXGNkb3QgMTV9ezR9IFxyaWdodCleMg0KXF0NCg0KXFsNCj0gXGxlZnQoIFxmcmFjezIuNDg3IFxjZG90IDE1fXs0fSBccmlnaHQpXjINCj0gXGxlZnQoIFxmcmFjezM3LjMwNX17NH0gXHJpZ2h0KV4yDQo9ICg5LjMyNileMg0KXGFwcHJveCA4Ni45OA0KXF0NCg0KXFsNCm4gXGFwcHJveCA4Nw0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgNDogUmVzdWx0DQoNClxbDQpcYm94ZWR7biA9IDg3fQ0KXF0NCg0KLS0tDQoNCiMjIFZlcmlmaWNhdGlvbiBVc2luZyBSDQoNCmBgYHtyfQ0KIyBVc2UgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSByZXF1aXJlZCBzYW1wbGUgc2l6ZQ0KDQpzYW1wbGVfc2l6ZSA8LSBwb3dlci50LnRlc3QocG93ZXIgPSAwLjgwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSA0LCAgICAgICAjIGVmZmVjdCBzaXplDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IDE1LCAgICAgICAgICMgc3RhbmRhcmQgZGV2aWF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJvbmUuc2FtcGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gIm9uZS5zaWRlZCIpDQoNCiMgUm91bmQgdXAgc2luY2Ugc2FtcGxlIHNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyDQpjZWlsaW5nKHNhbXBsZV9zaXplJG4pDQpgYGANCg0KDQojIyBTdW1tYXJ5DQoNClRoZSByZXF1aXJlZCBzYW1wbGUgc2l6ZSB0byBhY2hpZXZlIDgwJSBwb3dlciBmb3IgZGV0ZWN0aW5nIGEgNCBtZy9kTCBpbXByb3ZlbWVudCBpcyBhcHByb3hpbWF0ZWx5IG49ODcuVGhpcyBhbmFseXNpcyBpcyB2YWxpZCBiZWNhdXNlIGl0IGZvbGxvd3MgdGhlIHN0YW5kYXJkIHNhbXBsZSBzaXplIGRldGVybWluYXRpb24gZnJhbWV3b3JrIGJhc2VkIG9uIG5vcm1hbCBhcHByb3hpbWF0aW9ucywgYXMgb3V0bGluZWQgaW4gdGhlIGxlY3R1cmUgbm90ZXMuIFRoZSBmb3JtdWxhIGluY29ycG9yYXRlcyBib3RoIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgKM6xKSBhbmQgZGVzaXJlZCBwb3dlciAoMeKIks6yKSwgZW5zdXJpbmcgdGhhdCB0aGUgdGVzdCBoYXMgYSBjb250cm9sbGVkIFR5cGUgSSBlcnJvciByYXRlIGFuZCBhIHN1ZmZpY2llbnRseSBoaWdoIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhIHRydWUgZWZmZWN0Lg0KDQpUaGUgcmVzdWx0IGhpZ2hsaWdodHMgdGhhdCBhIHN1YnN0YW50aWFsbHkgbGFyZ2VyIHNhbXBsZSBzaXplIGlzIG5lZWRlZCBjb21wYXJlZCB0byBwYXJ0IChiKS4gVGhpcyByZWZsZWN0cyB0aGUgcmVsYXRpdmVseSBzbWFsbCBlZmZlY3Qgc2l6ZSAozrQ9NCkgY29tcGFyZWQgdG8gdGhlIHZhcmlhYmlsaXR5ICjPgz0xNSkuIERldGVjdGluZyBzdWNoIGEgbW9kZXN0IGltcHJvdmVtZW50IHdpdGggaGlnaCByZWxpYWJpbGl0eSByZXF1aXJlcyBtb3JlIG9ic2VydmF0aW9ucywgcmVpbmZvcmNpbmcgdGhlIHRyYWRlb2ZmIGJldHdlZW4gZWZmZWN0IHNpemUsIHZhcmlhYmlsaXR5LCBhbmQgc2FtcGxlIHNpemUgaW4gaHlwb3RoZXNpcyB0ZXN0aW5nLg0KDQoNCiMgUXVlc3Rpb24gKGQpOiBQb3dlciBDdXJ2ZSBhcyBhIEZ1bmN0aW9uIG9mIFNhbXBsZSBTaXplDQoNCiMjIFN0ZXAgMTogT2JqZWN0aXZlDQoNCldlIGV4YW1pbmUgaG93IHN0YXRpc3RpY2FsIHBvd2VyIGNoYW5nZXMgYXMgdGhlIHNhbXBsZSBzaXplIFwoIG4gXCkgdmFyaWVzLCB3aGlsZSBob2xkaW5nIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGZpeGVkLg0KDQpHaXZlbjoNCg0KLSBFZmZlY3Qgc2l6ZTogXCggXGRlbHRhID0gNCBcKQ0KLSBTdGFuZGFyZCBkZXZpYXRpb246IFwoIFxzaWdtYSA9IDE1IFwpDQotIFNpZ25pZmljYW5jZSBsZXZlbDogXCggXGFscGhhID0gMC4wNSBcKQ0KLSBPbmUtc2lkZWQgdGVzdA0KDQotLS0NCg0KIyMgU3RlcCAyOiBQb3dlciBGdW5jdGlvbg0KDQpwb3dlciBpcyBnaXZlbiBieToNCg0KXFsNClx0ZXh0e1Bvd2VyfShuKSA9IDEgLSBcUGhpXGxlZnQoel97MS1cYWxwaGF9IC0gXGZyYWN7XGRlbHRhfXtcc2lnbWEvXHNxcnR7bn19XHJpZ2h0KQ0KXF0NCg0Kd2hlcmU6DQoNClxbDQpcbGFtYmRhKG4pID0gXGZyYWN7XGRlbHRhfXtcc2lnbWEvXHNxcnR7bn19ID0gXGZyYWN7XGRlbHRhIFxzcXJ0e259fXtcc2lnbWF9DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCAzOiBDb21wdXRlIFBvd2VyIEFjcm9zcyBTYW1wbGUgU2l6ZXMNCg0KV2UgZXZhbHVhdGUgcG93ZXIgZm9yIGEgc2VxdWVuY2Ugb2Ygc2FtcGxlIHNpemVzIHRvIG9ic2VydmUgaG93IGl0IGluY3JlYXNlcyB3aXRoIFwoIG4gXCkuDQoNCmBgYHtyfQ0KIyBQYXJhbWV0ZXJzDQpzaWdtYSA8LSAxNQ0KZGVsdGEgPC0gNA0KYWxwaGEgPC0gMC4wNQ0KDQojIENyaXRpY2FsIHZhbHVlDQp6X2NyaXQgPC0gcW5vcm0oMSAtIGFscGhhKQ0KDQojIFNlcXVlbmNlIG9mIHNhbXBsZSBzaXplcw0Kbl92YWx1ZXMgPC0gc2VxKDUsIDE1MCwgYnkgPSAxKQ0KDQojIENvbXB1dGUgcG93ZXIgZm9yIGVhY2ggbg0KcG93ZXJfdmFsdWVzIDwtIHNhcHBseShuX3ZhbHVlcywgZnVuY3Rpb24obikgew0KICBsYW1iZGEgPC0gZGVsdGEgLyAoc2lnbWEgLyBzcXJ0KG4pKSAgIyBub24tY2VudHJhbGl0eSBwYXJhbWV0ZXINCiAgMSAtIHBub3JtKHpfY3JpdCAtIGxhbWJkYSkNCn0pDQoNCiMgUGxvdCBwb3dlciBjdXJ2ZQ0KcGxvdChuX3ZhbHVlcywgcG93ZXJfdmFsdWVzLCB0eXBlID0gImwiLA0KICAgICB4bGFiID0gIlNhbXBsZSBTaXplIChuKSIsDQogICAgIHlsYWIgPSAiUG93ZXIiLA0KICAgICBtYWluID0gIlBvd2VyIEN1cnZlIGZvciBEZXRlY3RpbmcgzrQgPSA0IiwNCiAgICAgbHdkID0gMikNCg0KIyBBZGQgcmVmZXJlbmNlIGxpbmUgYXQgODAlIHBvd2VyDQphYmxpbmUoaCA9IDAuODAsIGx0eSA9IDIpDQpgYGANCg0KIyMgSW50ZXJwcmV0YXRpb24NCg0KVGhlIHBsb3Qgc2hvd3MgdGhhdCBwb3dlciBpbmNyZWFzZXMgbW9ub3RvbmljYWxseSBhcyB0aGUgc2FtcGxlIHNpemUgaW5jcmVhc2VzLiBGb3Igc21hbGwgXCggbiBcKSwgcG93ZXIgaXMgbG93IGR1ZSB0byBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBzYW1wbGUgbWVhbi4gQXMgXCggbiBcKSBncm93cywgdGhlIHN0YW5kYXJkIGVycm9yIFwoIFxzaWdtYS9cc3FydHtufSBcKSBkZWNyZWFzZXMsIG1ha2luZyBpdCBlYXNpZXIgdG8gZGV0ZWN0IHRoZSBlZmZlY3QuDQoNClRoZSBjdXJ2ZSBjcm9zc2VzIHRoZSAwLjgwIHRocmVzaG9sZCBhdCBhcHByb3hpbWF0ZWx5IFwoIG4gXGFwcHJveCA4NyBcKSwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZXN1bHQgb2J0YWluZWQgaW4gcGFydCAoYykuDQoNCg0KIyMgU3VtbWFyeQ0KDQpUaGUgcG93ZXIgY3VydmUgZGVtb25zdHJhdGVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzYW1wbGUgc2l6ZSBhbmQgdGhlIGFiaWxpdHkgdG8gZGV0ZWN0IGEgdHJ1ZSBlZmZlY3QuIEFzIHNhbXBsZSBzaXplIGluY3JlYXNlcywgdGhlIHZhcmlhYmlsaXR5IG9mIHRoZSBzYW1wbGUgbWVhbiBkZWNyZWFzZXMsIGxlYWRpbmcgdG8gaGlnaGVyIHBvd2VyLg0KDQpUaGlzIGFuYWx5c2lzIGlzIHZhbGlkIGJlY2F1c2UgaXQgZGlyZWN0bHkgYXBwbGllcyB0aGUgdGhlb3JldGljYWwgcG93ZXIgZnVuY3Rpb24gZGVyaXZlZCBmcm9tIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIGFuZCB1c2VzIGNvbnNpc3RlbnQgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIHByZXZpb3VzIHBhcnRzLiBUaGUgdXNlIG9mIGEgY29udGludW91cyByYW5nZSBvZiBuIHZhbHVlcyBhbGxvd3MgZm9yIGEgY2xlYXIgdmlzdWFsaXphdGlvbiBvZiBob3cgcG93ZXIgZXZvbHZlcy4NCg0KVGhlIHJlc3VsdHMgY29uZmlybSB0aGF0IHNtYWxsIHNhbXBsZSBzaXplcyBwcm92aWRlIGluc3VmZmljaWVudCBwb3dlciB0byBkZXRlY3QgbW9kZXN0IGVmZmVjdHMsIHdoaWxlIGxhcmdlciBzYW1wbGVzIHN1YnN0YW50aWFsbHkgaW1wcm92ZSB0aGUgcHJvYmFiaWxpdHkgb2YgY29ycmVjdGx5IHJlamVjdGluZyB0aGUgbnVsbCBoeXBvdGhlc2lzLiBUaGlzIHJlaW5mb3JjZXMgdGhlIGNvbmNsdXNpb24gZnJvbSBwYXJ0IChjKSB0aGF0IGEgc2FtcGxlIHNpemUgb2YgYXBwcm94aW1hdGVseSA4NyBpcyByZXF1aXJlZCB0byBhY2hpZXZlIDgwJSBwb3dlciBmb3IgZGV0ZWN0aW5nIGEgNCBtZy9kTCBpbXByb3ZlbWVudC4NCg==