Final Exam Guidelines
Coverage: The major concepts and inference
procedures—such as sampling distributions, confidence intervals, and
hypothesis testing—are covered and implemented using both classical
parametric likelihood-based methods and modern non-parametric
approaches, including the bootstrap and kernel density
estimation.
Part A requires derivation of selected
likelihood-based functions for performing various types of inference,
with sufficient detail to enable translation of these derivations into
code for numerical analysis.
Your code for the problems in Part B must align
with your derivations in Part A and be well commented
where necessary.
In Part B, all numerical results must be
interpreted from a practical perspective.
Working Model for the Final Exam
Caution: Please follow
the suggested expressions and guided steps to complete the exam. Other
approaches such as transformation for trivialize the problems that will
not meet the exam objectives.
The Kumaraswamy distribution is a two-parameter
continuous probability distribution defined on the interval (0, 1). It
is often used as an alternative to the Beta distribution due to its
simple closed-form expressions for the cumulative distribution function
(CDF) and quantile function. It is commonly used in
Hydrology: Modeling rainfall, streamflow, or
other bounded natural phenomena
Economics: Income shares, proportions, or
bounded indices
Monte Carlo simulation: Efficient random variate
generation (via inverse transform)
Machine learning: Output layer for bounded
targets, prior distributions in Bayesian models
Reliability engineering: Modeling failure rates
of systems with bounded lifetimes
Let \(X\) be the Kumaraswamy random
variable with Cumulative Distribution Function (CDF)
\[
F(x; a, b) = 1 - (1 - x^a)^b
\]
where \(a > 0\) and \(b > 0\) unknown parameters and \(0 < x < 1\).
The following are two special case of the Kumaraswamy
distribution:
Uniform Distribution: When \(a = 1\) and \(b =
1\), the Kumaraswamy distribution becomes a uniform distribution
over \([0, 1]\) with CDF \(F(x) = x\).
Power Distribution: when \(b = 1\) and \(a
> 0\), the Kumaraswamy distribution becomes a power
distribution over \([0, 1]\) with CDF
\(F(x) = x^a\).
This final exam focuses on inferences of Kumaraswamy distribution and
related data analysis.
Part A: Methodological Derivations
Problem A1:
Show that the density function of the Kumaraswamy distribution is
\[
f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}.
\]
Answer to Problem A1:
We can determine the derivative of the CDF function of the
Kumaraswany distribution to find the density function. We know that the
CDF is \(F(x; a, b) = 1 - (1 -
x^a)^b\), therefore \(f(x;a,b)\)
is:
\[
\begin{aligned}
f(x;a,b) &=\frac{d}{dx}F(x;a,b) \\
&=\frac{d}{dx}[1 - (1 - x^a)^b] \\
&= b(1-x^a)^{b-1}(ax^{a-1})
\end{aligned}
\]
Therefore the density function of the Kumaraswamy distribution
is:
\[
f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}
\]
Problem A2:
Let \(\{x_1, x_2, \cdots, x_n \}\)
be an i.i.d. random sample taken from a population that follows the aove
2-parameter Kumaraswamy distribution. Write out the loglikelihood
function of \(a\) and \(b\), denoted by \(\ell(a,b)\), based on the above random
sample and derive the gradient vector \([\ell_a^\prime(a,b), \ell_b^\prime(a,b)]\),
the first order partial derivative of the log-likelihood with respect to
parameters \(a\) and \(b\).
Answer to Problem A2:
To find the loglikelihood function of the Kumaraswamy distribution we
can start by finding the likelihood function:
\[
L(a,b)=\prod_{i=1}^nf(x_i;a, b)=\prod_{i=1}^n ab \, x_i^{a-1} (1 -
x_i^a)^{b-1}
\]
Then we can find the loglikelihood function:
\[
\begin{aligned}
\ell(a,b)&=\ln(L(a,b))=\ln \left[\prod_{i=1}^n ab \,x_i^{a-1} (1 -
x_i^a)^{b-1}\right] \\
&= \sum_{i=1}^n \left[ \ln(a)+\ln(b)+(a-1)\ln(x_i)+(b-1)\ln(1-x_i^a)
\right] \\
&= n\ln (a)+n\ln (b)+(a-1)\sum_{i=1}^n \ln(x_i) +(b-1)\sum_{i=1}^n
\ln(1-x_i^a)
\end{aligned}
\]
We can then derive the gradient vector \([\ell_a^\prime(a,b), \ell_b^\prime(a,b)]\),
the first order partial derivatives of the log-likelihood with respect
to parameters \(a\) and \(b\):
\[
\begin{aligned}
\ell_a^\prime(a,b) &= \frac{\partial\ell}{\partial a}\left[n\ln
(a)+n\ln (b)+(a-1)\sum_{i=1}^n \ln(x_i) +(b-1)\sum_{i=1}^n \ln(1-x_i^a)
\right] \\
&=
\frac{n}{a}+\sum_{i=1}^n\ln(x_i)-(b-1)\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a}
\end{aligned}
\]
\[
\begin{aligned}
\ell_b^\prime(a,b) &= \frac{\partial\ell}{\partial b}\left[n\ln
(a)+n\ln (b)+(a-1)\sum_{i=1}^n \ln(x_i) +(b-1)\sum_{i=1}^n \ln(1-x_i^a)
\right] \\
&= \frac{n}{b}+\sum_{i=1}^n\ln(1-x_i^a)
\end{aligned}
\]
Therefore the gradient vector is:
\[
[\ell_a^\prime(a,b),
\ell_b^\prime(a,b)]=\left[\frac{n}{a}+\sum_{i=1}^n\ln(x_i)-(b-1)\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a}
\, , \, \frac{n}{b}+\sum_{i=1}^n\ln(1-x_i^a) \right]
\]
Problem A3:
Based on the gradients functions obtained in the above problem A2,
derive the observed Fisher Information matrix (i.e, the
negative Hessian Matrix).
Answer to Problem A3:
We can derive the Fisher Information matrix by first finding the
Hessian Matrix and taking the negative of it.
First we will find \(\frac{\partial^2
\ell}{\partial a^2}\), \(\frac{\partial^2 \ell}{\partial b^2}\), and
\(\frac{\partial^2 \ell}{\partial a \partial
b}\):
\[
\begin{aligned}
\frac{\partial^2 \ell}{\partial a^2} &= \frac{\partial
\ell}{\partial a} \left[
\frac{n}{a}+\sum_{i=1}^n\ln(x_i)-(b-1)\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a}
\right] \\
&=-\frac{n}{a^2}-(b-1)\sum_{i=1}^n \frac{x_i^a(\ln
x_i)^2(1-x_i^a)-(x_i^a\ln x_i)(-x_i^a \ln x_i)}{(1-x_i^a)^2} \\
&= -\frac{n}{a^2}-(b-1)\sum_{i=1}^n \frac{x_i^a (\ln
x_i)^2}{(1-x_i^a)^2}
\end{aligned}
\]
\[
\begin{aligned}
\frac{\partial^2\ell}{\partial b^2} &= \frac{\partial \ell}{\partial
b} \left[ \frac{n}{b}+\sum_{i=1}^n\ln(1-x_i^a) \right] \\
&= -\frac{n}{b^2}
\end{aligned}
\]
\[
\begin{aligned}
\frac{\partial^2 \ell}{\partial a \partial b} &= \frac{\partial
\ell}{\partial b} \left[
\frac{n}{a}+\sum_{i=1}^n\ln(x_i)-(b-1)\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a}\right]
\\
&= \sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a}
\end{aligned}
\]
Therefore, the Hessian matrix is:
\[
\begin{aligned}
\mathcal{H}(a, b) &=
\begin{bmatrix}
\frac{\partial^2 \ell}{\partial a^2} & \frac{\partial^2
\ell}{\partial a \partial b} \\
\frac{\partial^2 \ell}{\partial b \partial a} &
\frac{\partial^2\ell}{\partial b^2}
\end{bmatrix} \\
&= \begin{bmatrix}
-\frac{n}{a^2}-(b-1)\sum_{i=1}^n \frac{x_i^a (\ln x_i)^2}{(1-x_i^a)^2}
& \sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a} \\
\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a} & -\frac{n}{b^2}
\end{bmatrix}
\end{aligned}
\]
Therefore, the Fisher Information matrix is:
\[
\begin{aligned}
\mathcal{J}_n(a, b) &= -\mathcal{H}(a,b) \\
&= -
\begin{bmatrix}
-\frac{n}{a^2}-(b-1)\sum_{i=1}^n \frac{x_i^a (\ln x_i)^2}{(1-x_i^a)^2}
& \sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a} \\
\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a} & -\frac{n}{b^2}
\end{bmatrix}
\end{aligned}
\]
Problem A4:
Consider power distribution \(F(x) = x^a,
(a >0 \quad \text{ and }\quad x \in (0,1))\), a special case
of the Kumaraswamy distribution with \(b =
1\), and a random sample from this distribution \(\{ x_1, x_2, \cdots, x_n\}\).
Derive the MLE and MME of \(a\) respectively. [Hint: To find the
MME, you need to compute the moment of the power distribution; that is,
\(E[X^k] = \int_0^1 x^k F'(x) dx\).
Note that both the MLE and the MME have closed-form
expressions.]
Answer to Problem A4:
In order to find the MLE of the power distribution we must first find
the density function using the CDF:
\[
f(x;a)=F'(x;a)=\frac{d}{dx}\left[ x^a\right]=ax^{a-1}
\]
We can then determine the likelihood function:
\[
L(a)=\prod_{i=1}^nf(x_i;a)=\prod_{i=1}^nax_i^{a-1}
\]
Next we can determine the loglikelihood function:
\[
\ell(a)=\ln[L(a)]=n\ln a+(a-1)\sum_{i=1}^n\ln x_i
\]
Next we can find the partial derivative with respect to \(a\):
\[
\frac{\partial\ell}{\partial a}=\frac{n}{a}+\sum_{i=1}^n\ln x_i
\]
Finally, we can set the partial derivative equal to 0 and solve for
\(a\) in order to determine an MLE
function that can be used to estimate \(\hat{a}\)
\[
\begin{aligned}
&\quad \; \: \frac{\partial\ell}{\partial a}=0 \\
&\Rightarrow \frac{n}{a}+\sum_{i=1}^n\ln x_i =0 \\
&\Rightarrow \frac{n}{a}=-\sum_{i=1}^n\ln x_i \\
&\Rightarrow a=-\frac{n}{\sum_{i=1}^n\ln x_i}
\end{aligned}
\]
Therefore our MLE function is:
\[
\hat{a}_{MLE}=\frac{n}{-\sum_{i=1}^n\ln x_i}
\]
Next we will determine the MME function for the power distribution.
We will start by finding the first population moment of the power
distribution:
\[
\begin{aligned}
\mu_1 &= \mathbb{E}[X] \\
&=\int_0^1x F'(x) dx \\
&= \int_0^1 x (ax^{a-1})dx \\
&= a\int_0^1x^adx \\
&= \frac{a}{a+1}
\end{aligned}
\]
We can then determine the corresponding sample moment:
\[
m_1 = \frac{1}{n}\sum_{i=1}^{n}{X_i}
\]
Finally, we can set these equal to each other and solve for \(a\) to determine the MME function that can
be used to estimate \(\hat{a}\):
\[
\begin{aligned}
m_1=\frac{a}{a+1} \Rightarrow a=\frac{m_1}{1-m_1}
\end{aligned}
\]
Therefore our MME function is:
\[
\hat{a}_{MME}=\frac{\frac{1}{n}\sum_{i=1}^{n}{x_i}}{1-\frac{1}{n}\sum_{i=1}^{n}{x_i}}
\]
Problem A5:
Using the same setting as in Problem A4, find the
asymptotic (Wald) confidence interval for \(a\). [Hint: Compute the Fisher
information for \(a\), then take its
reciprocal to obtain the variance.]
Answer to Problem A5:
To find the asymptotic (Wald) confidence interval for this setting we
will start by computing the Fisher information for \(a\). As we determined above, the first
partial derivative of the loglikelihood function with respect to \(a\) for this setting is:
\[
\frac{\partial\ell}{\partial a}=\frac{n}{a}+\sum_{i=1}^n\ln x_i
\]
We can take the second partial derivative with respect to \(a\) in order to determine with Fisher
information:
\[
\frac{\partial^2\ell}{\partial a^2}=\frac{\partial \ell}{\partial a}
\left[\frac{n}{a}+\sum_{i=1}^n\ln x_i \right] = -\frac{n}{a^2}
\]
Therefore the Fisher information is:
\[
\mathcal{J}_n(a)=-\frac{\partial^2\ell}{\partial a^2}=\frac{n}{a^2}
\]
This can be used to find the estimated asymptotic variance and
standard deviation:
\[
\begin{aligned}
\widehat{\text{Var}}(\hat{a}) &\approx
\mathcal{J}_n(\hat{a})^{-1}=\frac{\hat{a}^2}{n} \\
\widehat{SE}(\hat{a}) &=\sqrt{\widehat{\text{Var}}(\hat{a})} \approx
\frac{\hat{a}}{\sqrt{n}}
\end{aligned}
\]
This can be used to determine the asymptotic (Wald) confidence
interval:
\[
\hat{a} \pm z_{1-\alpha/2} \frac{\hat{a}}{\sqrt{n}}
\]
Where the \(z\) is from the standard
normal distribution and the \(\alpha\)
is the predetermined confidence level.
Problem A6:
Using the same setting as in Problem A4, perform a
likelihood ratio test for the hypothesis \(H_0
:a=1\) (i.e., the power distribution reduces to a uniform
distribution). [Hint: Evaluate the log-likelihood function at the
maximum likelihood estimate \(\hat{a}\)
and at \(a=1\), then use these values
to construct the LRT test statistic.]
Answer to Problem A6:
In order to perform a likelihood ratio test for the hypothesis \(H_0: a=1\) we will start by evaluating our
previously determined loglikelihood function at \(\hat{a}\) and \(a=1\). Our loglikelihood function is
below:
\[
\ell(a)=n\ln a+(a-1)\sum_{i=1}^n\ln x_i
\]
Plugging in \(\hat{a}\):
\[
\ell(\hat{a})=n\ln \hat{a}+(\hat{a}-1)\sum_{i=1}^n\ln x_i
\]
Plugging in \(a=1\):
\[
\ell(1)=n\ln 1+(1-1)\sum_{i=1}^n\ln x_i=0
\]
Therefore the test statistic for this setting is:
\[
\begin{aligned}
Λ &=-2[\ell(1)-\ell(\hat{a})] \\
&=-2\left[0-n\ln \hat{a}-(\hat{a}-1)\sum_{i=1}^n\ln x_i\right] \\
&=2n\ln \hat{a}+2(\hat{a}-1)\sum_{i=1}^n\ln x_i
\end{aligned}
\]
From here we can set up a formal hypotheses test. Our null and
alternative hypotheses are:
\[
H_0: b=1 \\
H_a: b \ne 1
\]
Then we can determine our critical value. That is, we will reject
\(H_0\) if:
\[
Λ=2n\ln \hat{a}+2(\hat{a}-1)\sum_{i=1}^n\ln x_i > \chi_{1,1-\alpha}^2
\]
Where \(\alpha\) is a predetermined
confidence level.
If our test statistic \(Λ\) is
greater than our critical value of \(\chi_{1,1-\alpha}^2\) then we will have
enough evidence to reject our null hypothesis \(H_0: a=1\). If our test statistic is not
greater than our critical value then we will fail to reject the null
hypothesis.
Part B: Numerical Analysis
All code must be well commented and adhere to best coding
practices
Working Dataset: A small reservoir supplies water to
a town. During the dry season (50 days), engineers record the fraction
of usable storage filled each morning. Values near 0 mean the reservoir
is nearly empty; values near 1 mean it’s full. The distribution tends to
be right‑skewed (mostly low levels due to drought) but with occasional
replenishment.
The following 50 data points (ordered for clarity) represent the
daily proportion of usable storage:
0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78
Problem B1:
Fit the Kumaraswamy distribution to the above data. Use the
derivations in Problem A2 to find the MLE of \(a\) and \(b\). Please copy the key formulas before
coding.
Answer to Problem B1:
From above we know the loglikelihood function for the Kumaraswamy
distribution is:
\[
\ell(a,b)=n\ln (a)+n\ln (b)+(a-1)\sum_{i=1}^n \ln(x_i)
+(b-1)\sum_{i=1}^n \ln(1-x_i^a)
\]
We also know that the gradient vector is:
\[
[\ell_a^\prime(a,b),
\ell_b^\prime(a,b)]=\left[\frac{n}{a}+\sum_{i=1}^n\ln(x_i)-(b-1)\sum_{i=1}^n\frac{x_i^a\ln(x_i)}{1-x_i^a}
\, , \, \frac{n}{b}+\sum_{i=1}^n\ln(1-x_i^a) \right]
\]
We can using these functions to find the MLE of \(a\) and \(b\):
water <- c(0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78) #Entering dataset
loglik <- function(par,x){ # Entering in loglikelihood function for Kumaraswamy distribution
a <- par[1]
b <- par[2]
if(a<=0 || b<=0) return(Inf)
n <- length(x)
ll <- n*log(a)+n*log(b)+(a-1)*sum(log(x))+(b-1)*sum(log(1-x^a))
return(-ll)
}
grad <- function(par,x){ #Entering in gradient vector for Kumaraswamy distribution
a <- par[1]
b <- par[2]
if (a<=0 || b<=0) return(c(1e6, 1e6))
n <- length(x)
d_a <- n/a+sum(log(x))-(b-1)*sum((x^a*log(x))/(1-x^a))
d_b <- n/b+sum(log(1-x^a))
return(-c(d_a, d_b))
}
fit <- optim( #Using optim function to find a_hat and b_hat (minimizes negative loglikelihood)
par=c(1,1),
fn=loglik,
gr=grad,
x=water,
method="L-BFGS-B",
lower=c(1e-6,1e-6),
hessian=TRUE
)
a_hat <- fit$par[1] #Gets a_hat and b_hat
b_hat <- fit$par[2]
a_hat
[1] 2.529601
[1] 7.883389
Therefore, \(\hat{a}_{MLE}=2.529601\) and \(\hat{b}_{MLE}=7.883389\).
Problem B2:
Fit the power distribution to the above data using
the derived of \(a\) obtained in
Problem A4 to test the following hypothesis using
likelihood ratio procedure ar significance level \(\alpha = 0.05\):
\[
H_0: b = 1 \quad \text{ versus } \quad H_a: b \ne 1.
\]
State the statistical decision clearly. What is the practical
implication of the testing result?
Answer to Problem B2:
From above, we know that that loglikelihood function for the power
distribution setting is:
\[
\ell(a)=\ln[L(a)]=n\ln a+(a-1)\sum_{i=1}^n\ln x_i
\]
We also know that the MLE of \(\hat{a}\) for this setting can be found
using:
\[
\hat{a}_{MLE}=\frac{n}{-\sum_{i=1}^n\ln x_i}
\]
We can use these functions to perform a hypotheses test using the
likelihood ratio procedure at the \(\alpha=0.05\) significance level to test
the hypotheses:
\[
H_0: b = 1 \\ H_a: b \ne 1
\]
loglik_full <- -fit$value #Gets loglikelihood function (maximized log-likelihood)
n <- length(water)
a_hat_p <- -n/sum(log(water))
loglik_p <- n*log(a_hat_p)+(a_hat_p-1)*sum(log(water)) #Imputes loglikelihood for power function
LR <- -2*(loglik_p-loglik_full) #Computes test statistic
p_value <- 1-pchisq(LR, df=1) #Computes p-value
LR
[1] 48.92533
[1] 2.658984e-12
Given that the \(\text{p-value}=2.658984
\times10^{-12}\) which is less than \(\alpha=0.05\) we have enough evidence, at
the 0.05 significance level to reject the null hypotheses that \(b=1\).
Problem B3:
Use the procedure and code from Problem B1 to
estimate the MLEs of \(a\) and \(b\), and then complete the following
analyses:
(1). Obtain the bootstrap sampling distributions of \(\hat{a}\) and \(\hat{b}\) and plot each distribution using
Gaussian kernel density curves.
Answer to Problem B3-1:
set.seed(123)
B <- 1000 #Number of samples
n <- length(water)
a_boot <- numeric(B) #Creates empty vectors
b_boot <- numeric(B)
for(b in 1:B){
u <- runif(n) #Generates uniform random numbers
x_boot <- (1-(1-u)^(1/b_hat))^(1/a_hat) #Inverse of Kumaraswamy CDF
fit_boot <- optim( #Re-estimates a_hat b_hat using bootstrap sample
par = c(a_hat, b_hat),
fn=loglik,
x=x_boot,
method="L-BFGS-B",
lower=c(1e-6, 1e-6)
)
a_boot[b] <- fit_boot$par[1] #Stores a_hat and b_hat estimartes
b_boot[b] <- fit_boot$par[2]
}
plot(density(a_boot), main = "Bootstrap Distribution of a_hat", xlab = "a_hat", ylab="Density") #Plots Guassian kde's

plot(density(b_boot), main="Bootstrap Distribution of b_hat", xlab="b_hat", ylab="Density")

(2). Construct both the \(95\%\)
bootstrap confidence interval and the Wald
confidence interval for \(b\).
Do these intervals agree with the results obtained in Problem
B2? [Compute the standard error of \(\hat{b}\) using the observed Fisher
information matrix, i.e., the inverse of the negative Hessian obtained
from optim()]
Answer to Problem B3-2:
boot_ci <- quantile(b_boot, c(0.025, 0.975)) #Used to get bootstrap confidence interval
se_b_fisher <- sqrt(solve(fit$hessian)[2,2]) #Gets Hessian and solves for covariance matrix to find SE
z <- qnorm(0.975) #Gets z-value for alpha=0.05 (two-tailed)
wald_ci <- c(b_hat-z*se_b_fisher, b_hat+z*se_b_fisher) #Finds Wald confidence interval
boot_ci
2.5% 97.5%
4.863522 17.173223
[1] 3.484028 12.282750
The 95% bootstrap confidence interval for \(b\) is \((4.863522, 17.173223)\) and the 95% Wald
confidence interval for \(b\) is \((3.484028,12.282750)\). These intervals
agree with the results obtained in Problem B2. In Problem B2 our null
hypothesis was that \(b=1\) and this
test was performed at a 0.05 significance level. Given that neither the
bootstrap or Wald 95% confidence intervals contained the value 1, this
provides further evidence that we were correct to reject the null
hypothesis in Problem B2.
(3). Based on the bootstrap sampling distributions from part (1) of
this problem, assess whether the validity of the Wald confidence
interval is supported.
Answer to Problem B3-3:
In order to use the Wald confidence interval for \(b\) we want \(\hat{b} \approx N(b,
\text{Var}(\hat{b}))\). Considering the bootstrap sampling
distribution for \(b\) from part 1, we
would want it to be centered around our estimation of \(b\), \(\hat{b}=7.883389\)} and appear to be
normally distributed. While the distribution does appear to be centered
around \(7.883389\) it also appears to
be a slightly skewed distribution, indicating that the Wald confidence
interval may not be the best in this case.
Problem B4:
In the introduction to the working model for this exam, the
Kumaraswamy distribution reduces to the uniform distribution on (0,1).
In this problem, we perform a likelihood ratio test for
the following hypothesis to assess whether the data come from the
uniform distribution on (0,1):
\[
H_0: a = 1\quad \& \quad b = 1\quad \text{ versus } \quad H_a: a \ne
1 \quad \text{or} \quad b \ne 1 \quad \text{or}\quad (a \ne 1 \quad
\& \quad b \ne 1).
\]
Provide a practical interpretation of the above test result.
[Hint: \(H_a\) basically says that
there is no constraints for \(a\) and
\(b\). Please review the lecture note
for module 11 on the likelihood ratio test before coding.]
Answer to Problem B4:
In order to perform a likelihood ratio test at the 0.05 significance
level, we will start by evaluating our loglikelihood function for the
Kumaraswamy at \(a=1, b=1\). As we
determined above:
\[
\ell(a,b)=n\ln (a)+n\ln (b)+(a-1)\sum_{i=1}^n \ln(x_i)
+(b-1)\sum_{i=1}^n \ln(1-x_i^a)
\]
We can plug \(a=1, \, b=1\) to find
\(\ell(1, 1)\):
\[
\ell(1,1)=n\ln (1)+n\ln (1)+(1-1)\sum_{i=1}^n \ln(x_i)
+(1-1)\sum_{i=1}^n \ln(1-x_i^a) =0
\]
We can use this to perform our likelihood ratio test for:
\[
\begin{aligned}
H_0&: a = 1\quad \& \quad b = 1\quad \\ \quad H_a&: a \ne 1
\quad \text{or} \quad b \ne 1 \quad \text{or}\quad (a \ne 1 \quad \&
\quad b \ne 1).
\end{aligned}
\]
loglik_u <- 0 #Entering in loglikelihood for a=1, b=1
LR_2 <- -2*(loglik_u-loglik_full) #Computes test statistic
p_value2 <- 1-pchisq(LR_2,df=2) #Gets p-value
LR_2
[1] 49.12542
[1] 2.150558e-11
Given that the \(\text{p-value}=2.150558
\times10^{-11}\) which is less than \(\alpha=0.05\) we have enough evidence, at
the 0.05 significance level to reject the null hypotheses that \(H_0:a=1 \quad \& \quad b=1\).
LS0tDQp0aXRsZTogIlNUQSA1MDYgRmluYWwgRXhhbWluYXRpb24iDQphdXRob3I6ICJHcmFjZSBMaXBwZXJ0Ig0KZGF0ZTogIiBEdWU6IE1heSA1LCAyMDI2ICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IG5hdnk7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCg0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMTVweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBuYXZ5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQp9DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogIGxpYnJhcnkocGxvdGx5KQ0KfQ0KIyMjIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkZpbmFsIEV4YW0gR3VpZGVsaW5lcyoqIA0KDQoqICoqQ292ZXJhZ2UqKjogVGhlIG1ham9yIGNvbmNlcHRzIGFuZCBpbmZlcmVuY2UgcHJvY2VkdXJlc+KAlHN1Y2ggYXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucywgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmfigJRhcmUgY292ZXJlZCBhbmQgaW1wbGVtZW50ZWQgdXNpbmcgYm90aCBjbGFzc2ljYWwgcGFyYW1ldHJpYyBsaWtlbGlob29kLWJhc2VkIG1ldGhvZHMgYW5kIG1vZGVybiBub24tcGFyYW1ldHJpYyBhcHByb2FjaGVzLCBpbmNsdWRpbmcgdGhlIGJvb3RzdHJhcCBhbmQga2VybmVsIGRlbnNpdHkgZXN0aW1hdGlvbi4NCg0KKiAqKlBhcnQgQSoqIHJlcXVpcmVzIGRlcml2YXRpb24gb2Ygc2VsZWN0ZWQgbGlrZWxpaG9vZC1iYXNlZCBmdW5jdGlvbnMgZm9yIHBlcmZvcm1pbmcgdmFyaW91cyB0eXBlcyBvZiBpbmZlcmVuY2UsIHdpdGggc3VmZmljaWVudCBkZXRhaWwgdG8gZW5hYmxlIHRyYW5zbGF0aW9uIG9mIHRoZXNlIGRlcml2YXRpb25zIGludG8gY29kZSBmb3IgbnVtZXJpY2FsIGFuYWx5c2lzLg0KDQoqIFlvdXIgY29kZSBmb3IgdGhlIHByb2JsZW1zIGluICoqUGFydCBCKiogbXVzdCBhbGlnbiB3aXRoIHlvdXIgZGVyaXZhdGlvbnMgaW4gKipQYXJ0IEEqKiBhbmQgYmUgd2VsbCBjb21tZW50ZWQgd2hlcmUgbmVjZXNzYXJ5Lg0KDQoqIEluICoqUGFydCBCKiosIGFsbCBudW1lcmljYWwgcmVzdWx0cyBtdXN0IGJlIGludGVycHJldGVkIGZyb20gYSBwcmFjdGljYWwgcGVyc3BlY3RpdmUuDQoNCg0KXA0KDQojIyAqKlBvbGljaWVzIG9mIFVzaW5nIEFJIFRvb2xzKioNCg0KKiAqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBTdHVkZW50cyBtdXN0IGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQoNCiogKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQoNClwNCg0KIyMgKipXb3JraW5nIE1vZGVsIGZvciB0aGUgRmluYWwgRXhhbSoqDQoNCjxmb250IGNvbG9yID0gIm9yYW5nZSI+KipDYXV0aW9uKio6ICpQbGVhc2UgZm9sbG93IHRoZSBzdWdnZXN0ZWQgZXhwcmVzc2lvbnMgYW5kIGd1aWRlZCBzdGVwcyB0byBjb21wbGV0ZSB0aGUgZXhhbS4gT3RoZXIgYXBwcm9hY2hlcyBzdWNoIGFzIHRyYW5zZm9ybWF0aW9uIGZvciB0cml2aWFsaXplIHRoZSBwcm9ibGVtcyB0aGF0IHdpbGwgbm90IG1lZXQgdGhlIGV4YW0gb2JqZWN0aXZlcy4qPC9mb250Pg0KDQoNClRoZSAqKkt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbioqIGlzIGEgdHdvLXBhcmFtZXRlciBjb250aW51b3VzIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBkZWZpbmVkIG9uIHRoZSBpbnRlcnZhbCAoMCwgMSkuIEl0IGlzIG9mdGVuIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIEJldGEgZGlzdHJpYnV0aW9uIGR1ZSB0byBpdHMgc2ltcGxlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zIGZvciB0aGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKENERikgYW5kIHF1YW50aWxlIGZ1bmN0aW9uLiBJdCBpcyBjb21tb25seSB1c2VkIGluIA0KDQoqICoqSHlkcm9sb2d5Kio6IE1vZGVsaW5nIHJhaW5mYWxsLCBzdHJlYW1mbG93LCBvciBvdGhlciBib3VuZGVkIG5hdHVyYWwgcGhlbm9tZW5hDQoNCiogKipFY29ub21pY3MqKjogSW5jb21lIHNoYXJlcywgcHJvcG9ydGlvbnMsIG9yIGJvdW5kZWQgaW5kaWNlcw0KDQoqICoqTW9udGUgQ2FybG8gc2ltdWxhdGlvbioqOiBFZmZpY2llbnQgcmFuZG9tIHZhcmlhdGUgZ2VuZXJhdGlvbiAodmlhIGludmVyc2UgdHJhbnNmb3JtKQ0KDQoqICoqTWFjaGluZSBsZWFybmluZyoqOiBPdXRwdXQgbGF5ZXIgZm9yIGJvdW5kZWQgdGFyZ2V0cywgcHJpb3IgZGlzdHJpYnV0aW9ucyBpbiBCYXllc2lhbiBtb2RlbHMNCg0KKiAqKlJlbGlhYmlsaXR5IGVuZ2luZWVyaW5nKio6IE1vZGVsaW5nIGZhaWx1cmUgcmF0ZXMgb2Ygc3lzdGVtcyB3aXRoIGJvdW5kZWQgbGlmZXRpbWVzDQoNClwNCg0KTGV0ICRYJCBiZSB0aGUgS3VtYXJhc3dhbXkgcmFuZG9tIHZhcmlhYmxlIHdpdGggQ3VtdWxhdGl2ZSBEaXN0cmlidXRpb24gRnVuY3Rpb24gKENERikgIA0KDQokJA0KRih4OyBhLCBiKSA9IDEgLSAoMSAtIHheYSleYg0KJCQNCg0Kd2hlcmUgJGEgPiAwJCBhbmQgJGIgPiAwJCB1bmtub3duIHBhcmFtZXRlcnMgYW5kICQwIDwgeCA8IDEkLiANCg0KVGhlIGZvbGxvd2luZyBhcmUgdHdvIHNwZWNpYWwgY2FzZSBvZiB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uOg0KDQoxLiAqKlVuaWZvcm0gRGlzdHJpYnV0aW9uKio6IFdoZW4gJGEgPSAxJCBhbmQgJGIgPSAxJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gb3ZlciAkWzAsIDFdJCB3aXRoIENERiAkRih4KSA9IHgkLg0KDQoNCjIuICoqUG93ZXIgRGlzdHJpYnV0aW9uKio6IHdoZW4gJGIgPSAxJCBhbmQgJGEgPiAwJCwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBiZWNvbWVzIGEgcG93ZXIgZGlzdHJpYnV0aW9uIG92ZXIgJFswLCAxXSQgd2l0aCBDREYgJEYoeCkgPSB4XmEkLiANCg0KVGhpcyBmaW5hbCBleGFtIGZvY3VzZXMgb24gaW5mZXJlbmNlcyBvZiBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gYW5kIHJlbGF0ZWQgZGF0YSBhbmFseXNpcy4NCg0KDQojIyBQYXJ0IEE6IE1ldGhvZG9sb2dpY2FsIERlcml2YXRpb25zDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBMSoqOiANClNob3cgdGhhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiBvZiB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIGlzDQoNCiQkDQpmKHg7IGEsIGIpID0gYWIgXCwgeF57YS0xfSAoMSAtIHheYSlee2ItMX0uDQokJA0KDQojIEFuc3dlciB0byBQcm9ibGVtIEExOg0KDQpXZSBjYW4gZGV0ZXJtaW5lIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBDREYgZnVuY3Rpb24gb2YgdGhlIEt1bWFyYXN3YW55IGRpc3RyaWJ1dGlvbiB0byBmaW5kIHRoZSBkZW5zaXR5IGZ1bmN0aW9uLiAgV2Uga25vdyB0aGF0IHRoZSBDREYgaXMgJEYoeDsgYSwgYikgPSAxIC0gKDEgLSB4XmEpXmIkLCB0aGVyZWZvcmUgJGYoeDthLGIpJCBpczoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KZih4O2EsYikgJj1cZnJhY3tkfXtkeH1GKHg7YSxiKSBcXA0KJj1cZnJhY3tkfXtkeH1bMSAtICgxIC0geF5hKV5iXSBcXA0KJj0gYigxLXheYSlee2ItMX0oYXhee2EtMX0pDQpcZW5ke2FsaWduZWR9DQokJA0KDQpUaGVyZWZvcmUgdGhlIGRlbnNpdHkgZnVuY3Rpb24gb2YgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBpczoNCg0KJCQNCmYoeDsgYSwgYikgPSBhYiBcLCB4XnthLTF9ICgxIC0geF5hKV57Yi0xfQ0KJCQNCg0KXA0KDQojIyMgKipQcm9ibGVtIEEyKio6IA0KTGV0ICRce3hfMSwgeF8yLCBcY2RvdHMsIHhfbiBcfSQgYmUgYW4gaS5pLmQuIHJhbmRvbSBzYW1wbGUgdGFrZW4gZnJvbSBhIHBvcHVsYXRpb24gdGhhdCBmb2xsb3dzIHRoZSBhb3ZlIDItcGFyYW1ldGVyIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbi4gV3JpdGUgb3V0IHRoZSBsb2dsaWtlbGlob29kIGZ1bmN0aW9uIG9mICRhJCBhbmQgJGIkLCBkZW5vdGVkIGJ5ICRcZWxsKGEsYikkLCBiYXNlZCBvbiB0aGUgYWJvdmUgcmFuZG9tIHNhbXBsZSBhbmQgKipkZXJpdmUqKiB0aGUgZ3JhZGllbnQgdmVjdG9yICRbXGVsbF9hXlxwcmltZShhLGIpLCBcZWxsX2JeXHByaW1lKGEsYildJCwgdGhlIGZpcnN0IG9yZGVyIHBhcnRpYWwgZGVyaXZhdGl2ZSBvZiB0aGUgbG9nLWxpa2VsaWhvb2Qgd2l0aCByZXNwZWN0IHRvIHBhcmFtZXRlcnMgJGEkIGFuZCAkYiQuDQoNCiMgQW5zd2VyIHRvIFByb2JsZW0gQTI6DQoNClRvIGZpbmQgdGhlIGxvZ2xpa2VsaWhvb2QgZnVuY3Rpb24gb2YgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB3ZSBjYW4gc3RhcnQgYnkgZmluZGluZyB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbjoNCg0KJCQNCkwoYSxiKT1ccHJvZF97aT0xfV5uZih4X2k7YSwgYik9XHByb2Rfe2k9MX1ebiBhYiBcLCB4X2lee2EtMX0gKDEgLSB4X2leYSlee2ItMX0NCiQkDQoNClRoZW4gd2UgY2FuIGZpbmQgdGhlIGxvZ2xpa2VsaWhvb2QgZnVuY3Rpb246DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxlbGwoYSxiKSY9XGxuKEwoYSxiKSk9XGxuIFxsZWZ0W1xwcm9kX3tpPTF9Xm4gYWIgXCx4X2lee2EtMX0gKDEgLSB4X2leYSlee2ItMX1ccmlnaHRdIFxcDQomPSBcc3VtX3tpPTF9Xm4gXGxlZnRbIFxsbihhKStcbG4oYikrKGEtMSlcbG4oeF9pKSsoYi0xKVxsbigxLXhfaV5hKSBccmlnaHRdIFxcDQomPSBuXGxuIChhKStuXGxuIChiKSsoYS0xKVxzdW1fe2k9MX1ebiBcbG4oeF9pKSArKGItMSlcc3VtX3tpPTF9Xm4gXGxuKDEteF9pXmEpDQpcZW5ke2FsaWduZWR9DQokJA0KDQpXZSBjYW4gdGhlbiBkZXJpdmUgdGhlIGdyYWRpZW50IHZlY3RvciAkW1xlbGxfYV5ccHJpbWUoYSxiKSwgXGVsbF9iXlxwcmltZShhLGIpXSQsIHRoZSBmaXJzdCBvcmRlciBwYXJ0aWFsIGRlcml2YXRpdmVzIG9mIHRoZSBsb2ctbGlrZWxpaG9vZCB3aXRoIHJlc3BlY3QgdG8gcGFyYW1ldGVycyAkYSQgYW5kICRiJDoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGVsbF9hXlxwcmltZShhLGIpICY9IFxmcmFje1xwYXJ0aWFsXGVsbH17XHBhcnRpYWwgYX1cbGVmdFtuXGxuIChhKStuXGxuIChiKSsoYS0xKVxzdW1fe2k9MX1ebiBcbG4oeF9pKSArKGItMSlcc3VtX3tpPTF9Xm4gXGxuKDEteF9pXmEpIFxyaWdodF0gXFwNCiY9IFxmcmFje259e2F9K1xzdW1fe2k9MX1eblxsbih4X2kpLShiLTEpXHN1bV97aT0xfV5uXGZyYWN7eF9pXmFcbG4oeF9pKX17MS14X2leYX0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxlbGxfYl5ccHJpbWUoYSxiKSAmPSBcZnJhY3tccGFydGlhbFxlbGx9e1xwYXJ0aWFsIGJ9XGxlZnRbblxsbiAoYSkrblxsbiAoYikrKGEtMSlcc3VtX3tpPTF9Xm4gXGxuKHhfaSkgKyhiLTEpXHN1bV97aT0xfV5uIFxsbigxLXhfaV5hKSBccmlnaHRdIFxcDQomPSBcZnJhY3tufXtifStcc3VtX3tpPTF9Xm5cbG4oMS14X2leYSkNClxlbmR7YWxpZ25lZH0NCiQkDQoNClRoZXJlZm9yZSB0aGUgZ3JhZGllbnQgdmVjdG9yIGlzOg0KDQokJA0KW1xlbGxfYV5ccHJpbWUoYSxiKSwgXGVsbF9iXlxwcmltZShhLGIpXT1cbGVmdFtcZnJhY3tufXthfStcc3VtX3tpPTF9Xm5cbG4oeF9pKS0oYi0xKVxzdW1fe2k9MX1eblxmcmFje3hfaV5hXGxuKHhfaSl9ezEteF9pXmF9IFwsICwgXCwgXGZyYWN7bn17Yn0rXHN1bV97aT0xfV5uXGxuKDEteF9pXmEpIFxyaWdodF0NCiQkDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBMyoqOiANCkJhc2VkIG9uIHRoZSBncmFkaWVudHMgZnVuY3Rpb25zIG9idGFpbmVkIGluIHRoZSBhYm92ZSBwcm9ibGVtIEEyLCAqKmRlcml2ZSoqIHRoZSBvYnNlcnZlZCBGaXNoZXIgSW5mb3JtYXRpb24gbWF0cml4IChpLmUsIHRoZSBuZWdhdGl2ZSBIZXNzaWFuIE1hdHJpeCkuDQoNCiMgQW5zd2VyIHRvIFByb2JsZW0gQTM6DQoNCldlIGNhbiBkZXJpdmUgdGhlIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggYnkgZmlyc3QgZmluZGluZyB0aGUgSGVzc2lhbiBNYXRyaXggYW5kIHRha2luZyB0aGUgbmVnYXRpdmUgb2YgaXQuDQoNCkZpcnN0IHdlIHdpbGwgZmluZCAkXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhXjJ9JCwgJFxmcmFje1xwYXJ0aWFsXjIgXGVsbH17XHBhcnRpYWwgYl4yfSQsIGFuZCAkXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhIFxwYXJ0aWFsIGJ9JDoNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhXjJ9ICY9IFxmcmFje1xwYXJ0aWFsIFxlbGx9e1xwYXJ0aWFsIGF9IFxsZWZ0WyBcZnJhY3tufXthfStcc3VtX3tpPTF9Xm5cbG4oeF9pKS0oYi0xKVxzdW1fe2k9MX1eblxmcmFje3hfaV5hXGxuKHhfaSl9ezEteF9pXmF9IFxyaWdodF0gXFwNCiY9LVxmcmFje259e2FeMn0tKGItMSlcc3VtX3tpPTF9Xm4gXGZyYWN7eF9pXmEoXGxuIHhfaSleMigxLXhfaV5hKS0oeF9pXmFcbG4geF9pKSgteF9pXmEgXGxuIHhfaSl9eygxLXhfaV5hKV4yfSBcXA0KJj0gLVxmcmFje259e2FeMn0tKGItMSlcc3VtX3tpPTF9Xm4gXGZyYWN7eF9pXmEgKFxsbiB4X2kpXjJ9eygxLXhfaV5hKV4yfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGZyYWN7XHBhcnRpYWxeMlxlbGx9e1xwYXJ0aWFsIGJeMn0gJj0gXGZyYWN7XHBhcnRpYWwgXGVsbH17XHBhcnRpYWwgYn0gXGxlZnRbIFxmcmFje259e2J9K1xzdW1fe2k9MX1eblxsbigxLXhfaV5hKSBccmlnaHRdIFxcDQomPSAtXGZyYWN7bn17Yl4yfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhIFxwYXJ0aWFsIGJ9ICY9IFxmcmFje1xwYXJ0aWFsIFxlbGx9e1xwYXJ0aWFsIGJ9IFxsZWZ0WyBcZnJhY3tufXthfStcc3VtX3tpPTF9Xm5cbG4oeF9pKS0oYi0xKVxzdW1fe2k9MX1eblxmcmFje3hfaV5hXGxuKHhfaSl9ezEteF9pXmF9XHJpZ2h0XSBcXA0KJj0gXHN1bV97aT0xfV5uXGZyYWN7eF9pXmFcbG4oeF9pKX17MS14X2leYX0NClxlbmR7YWxpZ25lZH0NCiQkDQoNClRoZXJlZm9yZSwgdGhlIEhlc3NpYW4gbWF0cml4IGlzOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcbWF0aGNhbHtIfShhLCBiKSAmPSANClxiZWdpbntibWF0cml4fQ0KXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhXjJ9ICYgXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhIFxwYXJ0aWFsIGJ9IFxcDQpcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGIgXHBhcnRpYWwgYX0gJiBcZnJhY3tccGFydGlhbF4yXGVsbH17XHBhcnRpYWwgYl4yfQ0KXGVuZHtibWF0cml4fSBcXA0KJj0gXGJlZ2lue2JtYXRyaXh9DQotXGZyYWN7bn17YV4yfS0oYi0xKVxzdW1fe2k9MX1ebiBcZnJhY3t4X2leYSAoXGxuIHhfaSleMn17KDEteF9pXmEpXjJ9ICYgXHN1bV97aT0xfV5uXGZyYWN7eF9pXmFcbG4oeF9pKX17MS14X2leYX0gXFwNClxzdW1fe2k9MX1eblxmcmFje3hfaV5hXGxuKHhfaSl9ezEteF9pXmF9ICYgLVxmcmFje259e2JeMn0NClxlbmR7Ym1hdHJpeH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNClRoZXJlZm9yZSwgdGhlIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggaXM6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClxtYXRoY2Fse0p9X24oYSwgYikgJj0gLVxtYXRoY2Fse0h9KGEsYikgXFwNCiY9IC0gDQpcYmVnaW57Ym1hdHJpeH0NCi1cZnJhY3tufXthXjJ9LShiLTEpXHN1bV97aT0xfV5uIFxmcmFje3hfaV5hIChcbG4geF9pKV4yfXsoMS14X2leYSleMn0gJiBcc3VtX3tpPTF9Xm5cZnJhY3t4X2leYVxsbih4X2kpfXsxLXhfaV5hfSBcXA0KXHN1bV97aT0xfV5uXGZyYWN7eF9pXmFcbG4oeF9pKX17MS14X2leYX0gJiAtXGZyYWN7bn17Yl4yfQ0KXGVuZHtibWF0cml4fQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KXA0KDQoNCiMjIyAqKlByb2JsZW0gQTQqKjogDQoNCkNvbnNpZGVyIHBvd2VyIGRpc3RyaWJ1dGlvbiAkRih4KSA9IHheYSwgKGEgPjAgXHF1YWQgXHRleHR7IGFuZCB9XHF1YWQgeCBcaW4gKDAsMSkpJCwgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB3aXRoICRiID0gMSQsIGFuZCBhIHJhbmRvbSBzYW1wbGUgZnJvbSB0aGlzIGRpc3RyaWJ1dGlvbiAkXHsgeF8xLCB4XzIsIFxjZG90cywgeF9uXH0kLiAqKkRlcml2ZSoqIHRoZSBNTEUgYW5kIE1NRSBvZiAkYSQgcmVzcGVjdGl2ZWx5LiBbKkhpbnQ6IFRvIGZpbmQgdGhlIE1NRSwgeW91IG5lZWQgdG8gY29tcHV0ZSB0aGUgbW9tZW50IG9mIHRoZSBwb3dlciBkaXN0cmlidXRpb247IHRoYXQgaXMsICRFW1hea10gPSBcaW50XzBeMSB4XmsgRicoeCkgZHgkLiBOb3RlIHRoYXQgYm90aCB0aGUgTUxFIGFuZCB0aGUgTU1FIGhhdmUgY2xvc2VkLWZvcm0gZXhwcmVzc2lvbnMuKl0NCg0KIyBBbnN3ZXIgdG8gUHJvYmxlbSBBNDoNCg0KSW4gb3JkZXIgdG8gZmluZCB0aGUgTUxFIG9mIHRoZSBwb3dlciBkaXN0cmlidXRpb24gd2UgbXVzdCBmaXJzdCBmaW5kIHRoZSBkZW5zaXR5IGZ1bmN0aW9uIHVzaW5nIHRoZSBDREY6DQoNCiQkDQpmKHg7YSk9RicoeDthKT1cZnJhY3tkfXtkeH1cbGVmdFsgeF5hXHJpZ2h0XT1heF57YS0xfQ0KJCQNCg0KV2UgY2FuIHRoZW4gZGV0ZXJtaW5lIHRoZSBsaWtlbGlob29kIGZ1bmN0aW9uOg0KDQokJA0KTChhKT1ccHJvZF97aT0xfV5uZih4X2k7YSk9XHByb2Rfe2k9MX1ebmF4X2lee2EtMX0NCiQkDQoNCk5leHQgd2UgY2FuIGRldGVybWluZSB0aGUgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbjoNCg0KJCQNClxlbGwoYSk9XGxuW0woYSldPW5cbG4gYSsoYS0xKVxzdW1fe2k9MX1eblxsbiB4X2kNCiQkDQoNCk5leHQgd2UgY2FuIGZpbmQgdGhlIHBhcnRpYWwgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gJGEkOg0KDQokJA0KXGZyYWN7XHBhcnRpYWxcZWxsfXtccGFydGlhbCBhfT1cZnJhY3tufXthfStcc3VtX3tpPTF9Xm5cbG4geF9pDQokJA0KDQpGaW5hbGx5LCB3ZSBjYW4gc2V0IHRoZSBwYXJ0aWFsIGRlcml2YXRpdmUgZXF1YWwgdG8gMCBhbmQgc29sdmUgZm9yICRhJCBpbiBvcmRlciB0byBkZXRlcm1pbmUgYW4gTUxFIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgJFxoYXR7YX0kDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCiZccXVhZCBcOyBcOiBcZnJhY3tccGFydGlhbFxlbGx9e1xwYXJ0aWFsIGF9PTAgXFwNCiZcUmlnaHRhcnJvdyBcZnJhY3tufXthfStcc3VtX3tpPTF9Xm5cbG4geF9pID0wIFxcDQomXFJpZ2h0YXJyb3cgXGZyYWN7bn17YX09LVxzdW1fe2k9MX1eblxsbiB4X2kgXFwNCiZcUmlnaHRhcnJvdyBhPS1cZnJhY3tufXtcc3VtX3tpPTF9Xm5cbG4geF9pfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KVGhlcmVmb3JlIG91ciBNTEUgZnVuY3Rpb24gaXM6DQoNCiQkDQpcaGF0e2F9X3tNTEV9PVxmcmFje259ey1cc3VtX3tpPTF9Xm5cbG4geF9pfQ0KJCQNCg0KTmV4dCB3ZSB3aWxsIGRldGVybWluZSB0aGUgTU1FIGZ1bmN0aW9uIGZvciB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uLiAgV2Ugd2lsbCBzdGFydCBieSBmaW5kaW5nIHRoZSBmaXJzdCBwb3B1bGF0aW9uIG1vbWVudCBvZiB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpcbXVfMSAmPSBcbWF0aGJie0V9W1hdIFxcDQomPVxpbnRfMF4xeCBGJyh4KSBkeCBcXA0KJj0gXGludF8wXjEgeCAoYXhee2EtMX0pZHggXFwNCiY9IGFcaW50XzBeMXheYWR4IFxcDQomPSBcZnJhY3thfXthKzF9DQpcZW5ke2FsaWduZWR9DQokJA0KDQpXZSBjYW4gdGhlbiBkZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcgc2FtcGxlIG1vbWVudDoNCg0KJCQNCm1fMSA9IFxmcmFjezF9e259XHN1bV97aT0xfV57bn17WF9pfQ0KJCQNCg0KRmluYWxseSwgd2UgY2FuIHNldCB0aGVzZSBlcXVhbCB0byBlYWNoIG90aGVyIGFuZCBzb2x2ZSBmb3IgJGEkIHRvIGRldGVybWluZSB0aGUgTU1FIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgJFxoYXR7YX0kOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQptXzE9XGZyYWN7YX17YSsxfSBcUmlnaHRhcnJvdyBhPVxmcmFje21fMX17MS1tXzF9DQpcZW5ke2FsaWduZWR9DQokJA0KDQpUaGVyZWZvcmUgb3VyIE1NRSBmdW5jdGlvbiBpczoNCg0KJCQNClxoYXR7YX1fe01NRX09XGZyYWN7XGZyYWN7MX17bn1cc3VtX3tpPTF9XntufXt4X2l9fXsxLVxmcmFjezF9e259XHN1bV97aT0xfV57bn17eF9pfX0NCiQkDQoNClwNCg0KIyMjICoqUHJvYmxlbSBBNSoqOg0KDQpVc2luZyB0aGUgc2FtZSBzZXR0aW5nIGFzIGluICoqUHJvYmxlbSBBNCoqLCBmaW5kIHRoZSBhc3ltcHRvdGljIChXYWxkKSBjb25maWRlbmNlIGludGVydmFsIGZvciAkYSQuIFsqSGludDogQ29tcHV0ZSB0aGUgRmlzaGVyIGluZm9ybWF0aW9uIGZvciAkYSQsIHRoZW4gdGFrZSBpdHMgcmVjaXByb2NhbCB0byBvYnRhaW4gdGhlIHZhcmlhbmNlKi5dDQoNCiMgQW5zd2VyIHRvIFByb2JsZW0gQTU6DQoNClRvIGZpbmQgdGhlIGFzeW1wdG90aWMgKFdhbGQpIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoaXMgc2V0dGluZyB3ZSB3aWxsIHN0YXJ0IGJ5IGNvbXB1dGluZyB0aGUgRmlzaGVyIGluZm9ybWF0aW9uIGZvciAkYSQuICBBcyB3ZSBkZXRlcm1pbmVkIGFib3ZlLCB0aGUgZmlyc3QgcGFydGlhbCBkZXJpdmF0aXZlIG9mIHRoZSBsb2dsaWtlbGlob29kIGZ1bmN0aW9uIHdpdGggcmVzcGVjdCB0byAkYSQgZm9yIHRoaXMgc2V0dGluZyBpczoNCg0KJCQNClxmcmFje1xwYXJ0aWFsXGVsbH17XHBhcnRpYWwgYX09XGZyYWN7bn17YX0rXHN1bV97aT0xfV5uXGxuIHhfaQ0KJCQNCg0KV2UgY2FuIHRha2UgdGhlIHNlY29uZCBwYXJ0aWFsIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvICRhJCBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2l0aCBGaXNoZXIgaW5mb3JtYXRpb246DQoNCiQkDQpcZnJhY3tccGFydGlhbF4yXGVsbH17XHBhcnRpYWwgYV4yfT1cZnJhY3tccGFydGlhbCBcZWxsfXtccGFydGlhbCBhfSBcbGVmdFtcZnJhY3tufXthfStcc3VtX3tpPTF9Xm5cbG4geF9pIFxyaWdodF0gPSAtXGZyYWN7bn17YV4yfQ0KJCQNCg0KVGhlcmVmb3JlIHRoZSBGaXNoZXIgaW5mb3JtYXRpb24gaXM6DQoNCiQkDQpcbWF0aGNhbHtKfV9uKGEpPS1cZnJhY3tccGFydGlhbF4yXGVsbH17XHBhcnRpYWwgYV4yfT1cZnJhY3tufXthXjJ9DQokJA0KDQpUaGlzIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIGVzdGltYXRlZCBhc3ltcHRvdGljIHZhcmlhbmNlIGFuZCBzdGFuZGFyZCBkZXZpYXRpb246DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NClx3aWRlaGF0e1x0ZXh0e1Zhcn19KFxoYXR7YX0pICZcYXBwcm94IFxtYXRoY2Fse0p9X24oXGhhdHthfSleey0xfT1cZnJhY3tcaGF0e2F9XjJ9e259IFxcDQpcd2lkZWhhdHtTRX0oXGhhdHthfSkgJj1cc3FydHtcd2lkZWhhdHtcdGV4dHtWYXJ9fShcaGF0e2F9KX0gXGFwcHJveCBcZnJhY3tcaGF0e2F9fXtcc3FydHtufX0NClxlbmR7YWxpZ25lZH0NCiQkDQoNClRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhc3ltcHRvdGljIChXYWxkKSBjb25maWRlbmNlIGludGVydmFsOg0KDQokJA0KXGhhdHthfSBccG0gel97MS1cYWxwaGEvMn0gXGZyYWN7XGhhdHthfX17XHNxcnR7bn19DQokJA0KDQpXaGVyZSB0aGUgJHokIGlzIGZyb20gdGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24gYW5kIHRoZSAkXGFscGhhJCBpcyB0aGUgcHJlZGV0ZXJtaW5lZCBjb25maWRlbmNlIGxldmVsLg0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQTYqKjoNCg0KVXNpbmcgdGhlIHNhbWUgc2V0dGluZyBhcyBpbiAqKlByb2JsZW0gQTQqKiwgcGVyZm9ybSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBmb3IgdGhlIGh5cG90aGVzaXMgJEhfMCA6YT0xJCAoaS5lLiwgdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbiByZWR1Y2VzIHRvIGEgdW5pZm9ybSBkaXN0cmlidXRpb24pLiBbKkhpbnQ6IEV2YWx1YXRlIHRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiBhdCB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlICRcaGF0e2F9JCBhbmQgYXQgJGE9MSQsIHRoZW4gdXNlIHRoZXNlIHZhbHVlcyB0byBjb25zdHJ1Y3QgdGhlIExSVCB0ZXN0IHN0YXRpc3RpYy4qXQ0KDQojIEFuc3dlciB0byBQcm9ibGVtIEE2Og0KDQpJbiBvcmRlciB0byBwZXJmb3JtIGEgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IGZvciB0aGUgaHlwb3RoZXNpcyAkSF8wOiBhPTEkIHdlIHdpbGwgc3RhcnQgYnkgZXZhbHVhdGluZyBvdXIgcHJldmlvdXNseSBkZXRlcm1pbmVkIGxvZ2xpa2VsaWhvb2QgZnVuY3Rpb24gYXQgJFxoYXR7YX0kIGFuZCAkYT0xJC4gIE91ciBsb2dsaWtlbGlob29kIGZ1bmN0aW9uIGlzIGJlbG93Og0KDQokJA0KXGVsbChhKT1uXGxuIGErKGEtMSlcc3VtX3tpPTF9Xm5cbG4geF9pDQokJA0KDQpQbHVnZ2luZyBpbiAkXGhhdHthfSQ6DQoNCiQkDQpcZWxsKFxoYXR7YX0pPW5cbG4gXGhhdHthfSsoXGhhdHthfS0xKVxzdW1fe2k9MX1eblxsbiB4X2kNCiQkDQoNClBsdWdnaW5nIGluICRhPTEkOg0KDQokJA0KXGVsbCgxKT1uXGxuIDErKDEtMSlcc3VtX3tpPTF9Xm5cbG4geF9pPTANCiQkDQoNClRoZXJlZm9yZSB0aGUgdGVzdCBzdGF0aXN0aWMgZm9yIHRoaXMgc2V0dGluZyBpczogDQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCs6bICY9LTJbXGVsbCgxKS1cZWxsKFxoYXR7YX0pXSBcXA0KJj0tMlxsZWZ0WzAtblxsbiBcaGF0e2F9LShcaGF0e2F9LTEpXHN1bV97aT0xfV5uXGxuIHhfaVxyaWdodF0gXFwNCiY9Mm5cbG4gXGhhdHthfSsyKFxoYXR7YX0tMSlcc3VtX3tpPTF9Xm5cbG4geF9pDQpcZW5ke2FsaWduZWR9DQokJA0KDQpGcm9tIGhlcmUgd2UgY2FuIHNldCB1cCBhIGZvcm1hbCBoeXBvdGhlc2VzIHRlc3QuICBPdXIgbnVsbCBhbmQgYWx0ZXJuYXRpdmUgaHlwb3RoZXNlcyBhcmU6DQoNCiQkDQpIXzA6IGI9MSBcXA0KSF9hOiBiIFxuZSAxDQokJA0KDQpUaGVuIHdlIGNhbiBkZXRlcm1pbmUgb3VyIGNyaXRpY2FsIHZhbHVlLiAgVGhhdCBpcywgd2Ugd2lsbCByZWplY3QgJEhfMCQgaWY6DQoNCiQkDQrOmz0yblxsbiBcaGF0e2F9KzIoXGhhdHthfS0xKVxzdW1fe2k9MX1eblxsbiB4X2kgPiBcY2hpX3sxLDEtXGFscGhhfV4yDQokJA0KDQpXaGVyZSAkXGFscGhhJCBpcyBhIHByZWRldGVybWluZWQgY29uZmlkZW5jZSBsZXZlbC4NCg0KSWYgb3VyIHRlc3Qgc3RhdGlzdGljICTOmyQgaXMgZ3JlYXRlciB0aGFuIG91ciBjcml0aWNhbCB2YWx1ZSBvZiAkXGNoaV97MSwxLVxhbHBoYX1eMiQgdGhlbiB3ZSB3aWxsIGhhdmUgZW5vdWdoIGV2aWRlbmNlIHRvIHJlamVjdCBvdXIgbnVsbCBoeXBvdGhlc2lzICRIXzA6IGE9MSQuICBJZiBvdXIgdGVzdCBzdGF0aXN0aWMgaXMgbm90IGdyZWF0ZXIgdGhhbiBvdXIgY3JpdGljYWwgdmFsdWUgdGhlbiB3ZSB3aWxsIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuDQoNCg0KXA0KDQojIyBQYXJ0IEI6IE51bWVyaWNhbCBBbmFseXNpcw0KDQoqKkFsbCBjb2RlIG11c3QgYmUgd2VsbCBjb21tZW50ZWQgYW5kIGFkaGVyZSB0byBiZXN0IGNvZGluZyBwcmFjdGljZXMqKg0KDQoqKldvcmtpbmcgRGF0YXNldCoqOiBBIHNtYWxsIHJlc2Vydm9pciBzdXBwbGllcyB3YXRlciB0byBhIHRvd24uIER1cmluZyB0aGUgZHJ5IHNlYXNvbiAoNTAgZGF5cyksIGVuZ2luZWVycyByZWNvcmQgdGhlIGZyYWN0aW9uIG9mIHVzYWJsZSBzdG9yYWdlIGZpbGxlZCBlYWNoIG1vcm5pbmcuIFZhbHVlcyBuZWFyIDAgbWVhbiB0aGUgcmVzZXJ2b2lyIGlzIG5lYXJseSBlbXB0eTsgdmFsdWVzIG5lYXIgMSBtZWFuIGl0J3MgZnVsbC4gVGhlIGRpc3RyaWJ1dGlvbiB0ZW5kcyB0byBiZSByaWdodOKAkXNrZXdlZCAobW9zdGx5IGxvdyBsZXZlbHMgZHVlIHRvIGRyb3VnaHQpIGJ1dCB3aXRoIG9jY2FzaW9uYWwgcmVwbGVuaXNobWVudC4NCg0KVGhlIGZvbGxvd2luZyA1MCBkYXRhIHBvaW50cyAob3JkZXJlZCBmb3IgY2xhcml0eSkgcmVwcmVzZW50IHRoZSBkYWlseSBwcm9wb3J0aW9uIG9mIHVzYWJsZSBzdG9yYWdlOg0KDQpgYGANCjAuMTIsIDAuMTQsIDAuMTUsIDAuMTYsIDAuMTcsIDAuMTgsIDAuMTksIDAuMjAsIDAuMjEsIDAuMjIsDQowLjIzLCAwLjI0LCAwLjI1LCAwLjI2LCAwLjI3LCAwLjI4LCAwLjI5LCAwLjMwLCAwLjMxLCAwLjMyLA0KMC4zMywgMC4zNCwgMC4zNSwgMC4zNiwgMC4zNywgMC4zOCwgMC4zOSwgMC40MCwgMC40MSwgMC40MiwNCjAuNDMsIDAuNDQsIDAuNDUsIDAuNDYsIDAuNDcsIDAuNDgsIDAuNDksIDAuNTAsIDAuNTEsIDAuNTIsDQowLjUzLCAwLjU0LCAwLjU1LCAwLjU2LCAwLjU3LCAwLjU4LCAwLjU5LCAwLjYwLCAwLjYxLCAwLjc4DQpgYGANCg0KXA0KDQojIyMgKipQcm9ibGVtIEIxKio6DQoNCkZpdCB0aGUgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIHRvIHRoZSBhYm92ZSBkYXRhLiBVc2UgdGhlIGRlcml2YXRpb25zIGluICoqUHJvYmxlbSBBMioqIHRvIGZpbmQgdGhlIE1MRSBvZiAkYSQgYW5kICRiJC4gUGxlYXNlIGNvcHkgdGhlIGtleSBmb3JtdWxhcyBiZWZvcmUgY29kaW5nLg0KDQojIEFuc3dlciB0byBQcm9ibGVtIEIxOg0KDQpGcm9tIGFib3ZlIHdlIGtub3cgdGhlIGxvZ2xpa2VsaWhvb2QgZnVuY3Rpb24gZm9yIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gaXM6DQoNCiQkDQpcZWxsKGEsYik9blxsbiAoYSkrblxsbiAoYikrKGEtMSlcc3VtX3tpPTF9Xm4gXGxuKHhfaSkgKyhiLTEpXHN1bV97aT0xfV5uIFxsbigxLXhfaV5hKQ0KJCQNCg0KV2UgYWxzbyBrbm93IHRoYXQgdGhlIGdyYWRpZW50IHZlY3RvciBpczoNCg0KJCQNCltcZWxsX2FeXHByaW1lKGEsYiksIFxlbGxfYl5ccHJpbWUoYSxiKV09XGxlZnRbXGZyYWN7bn17YX0rXHN1bV97aT0xfV5uXGxuKHhfaSktKGItMSlcc3VtX3tpPTF9Xm5cZnJhY3t4X2leYVxsbih4X2kpfXsxLXhfaV5hfSBcLCAsIFwsIFxmcmFje259e2J9K1xzdW1fe2k9MX1eblxsbigxLXhfaV5hKSBccmlnaHRdDQokJA0KDQpXZSBjYW4gdXNpbmcgdGhlc2UgZnVuY3Rpb25zIHRvIGZpbmQgdGhlIE1MRSBvZiAkYSQgYW5kICRiJDoNCg0KYGBge3J9DQp3YXRlciA8LSBjKDAuMTIsIDAuMTQsIDAuMTUsIDAuMTYsIDAuMTcsIDAuMTgsIDAuMTksIDAuMjAsIDAuMjEsIDAuMjIsDQowLjIzLCAwLjI0LCAwLjI1LCAwLjI2LCAwLjI3LCAwLjI4LCAwLjI5LCAwLjMwLCAwLjMxLCAwLjMyLA0KMC4zMywgMC4zNCwgMC4zNSwgMC4zNiwgMC4zNywgMC4zOCwgMC4zOSwgMC40MCwgMC40MSwgMC40MiwNCjAuNDMsIDAuNDQsIDAuNDUsIDAuNDYsIDAuNDcsIDAuNDgsIDAuNDksIDAuNTAsIDAuNTEsIDAuNTIsDQowLjUzLCAwLjU0LCAwLjU1LCAwLjU2LCAwLjU3LCAwLjU4LCAwLjU5LCAwLjYwLCAwLjYxLCAwLjc4KSAjRW50ZXJpbmcgZGF0YXNldA0KDQpsb2dsaWsgPC0gZnVuY3Rpb24ocGFyLHgpeyAjIEVudGVyaW5nIGluIGxvZ2xpa2VsaWhvb2QgZnVuY3Rpb24gZm9yIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbg0KICBhIDwtIHBhclsxXQ0KICBiIDwtIHBhclsyXQ0KICBpZihhPD0wIHx8IGI8PTApIHJldHVybihJbmYpDQogIG4gPC0gbGVuZ3RoKHgpDQogIGxsIDwtIG4qbG9nKGEpK24qbG9nKGIpKyhhLTEpKnN1bShsb2coeCkpKyhiLTEpKnN1bShsb2coMS14XmEpKQ0KICByZXR1cm4oLWxsKQ0KfQ0KDQpncmFkIDwtIGZ1bmN0aW9uKHBhcix4KXsgI0VudGVyaW5nIGluIGdyYWRpZW50IHZlY3RvciBmb3IgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uDQogIGEgPC0gcGFyWzFdDQogIGIgPC0gcGFyWzJdDQogIGlmIChhPD0wIHx8IGI8PTApIHJldHVybihjKDFlNiwgMWU2KSkNCiAgbiA8LSBsZW5ndGgoeCkNCiAgZF9hIDwtIG4vYStzdW0obG9nKHgpKS0oYi0xKSpzdW0oKHheYSpsb2coeCkpLygxLXheYSkpDQogIGRfYiA8LSBuL2Irc3VtKGxvZygxLXheYSkpDQogIHJldHVybigtYyhkX2EsIGRfYikpDQp9DQoNCmZpdCA8LSBvcHRpbSggI1VzaW5nIG9wdGltIGZ1bmN0aW9uIHRvIGZpbmQgYV9oYXQgYW5kIGJfaGF0IChtaW5pbWl6ZXMgbmVnYXRpdmUgbG9nbGlrZWxpaG9vZCkNCiAgcGFyPWMoMSwxKSwNCiAgZm49bG9nbGlrLA0KICBncj1ncmFkLA0KICB4PXdhdGVyLA0KICBtZXRob2Q9IkwtQkZHUy1CIiwNCiAgbG93ZXI9YygxZS02LDFlLTYpLA0KICBoZXNzaWFuPVRSVUUNCikNCg0KYV9oYXQgPC0gZml0JHBhclsxXSAjR2V0cyBhX2hhdCBhbmQgYl9oYXQNCmJfaGF0IDwtIGZpdCRwYXJbMl0NCg0KYV9oYXQNCmJfaGF0DQpgYGANCg0KVGhlcmVmb3JlLCAkXGhhdHthfV97TUxFfT0yLjUyOTYwMSQgYW5kICRcaGF0e2J9X3tNTEV9PTcuODgzMzg5JC4NCg0KXA0KDQojIyMgKipQcm9ibGVtIEIyKio6DQoNCkZpdCB0aGUgKipwb3dlciBkaXN0cmlidXRpb24qKiB0byB0aGUgYWJvdmUgZGF0YSB1c2luZyB0aGUgZGVyaXZlZCAgb2YgJGEkIG9idGFpbmVkIGluICoqUHJvYmxlbSBBNCoqIHRvIHRlc3QgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2lzIHVzaW5nIGxpa2VsaWhvb2QgcmF0aW8gcHJvY2VkdXJlIGFyIHNpZ25pZmljYW5jZSBsZXZlbCAkXGFscGhhID0gMC4wNSQ6DQoNCiQkDQpIXzA6IGIgPSAxIFxxdWFkIFx0ZXh0eyB2ZXJzdXMgfSBccXVhZCBIX2E6IGIgXG5lIDEuDQokJA0KDQpTdGF0ZSB0aGUgc3RhdGlzdGljYWwgZGVjaXNpb24gY2xlYXJseS4gV2hhdCBpcyB0aGUgcHJhY3RpY2FsIGltcGxpY2F0aW9uIG9mIHRoZSB0ZXN0aW5nIHJlc3VsdD8NCg0KIyBBbnN3ZXIgdG8gUHJvYmxlbSBCMjoNCg0KRnJvbSBhYm92ZSwgd2Uga25vdyB0aGF0IHRoYXQgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiBmb3IgdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIGlzOg0KDQokJA0KXGVsbChhKT1cbG5bTChhKV09blxsbiBhKyhhLTEpXHN1bV97aT0xfV5uXGxuIHhfaQ0KJCQNCg0KV2UgYWxzbyBrbm93IHRoYXQgdGhlIE1MRSBvZiAkXGhhdHthfSQgZm9yIHRoaXMgc2V0dGluZyBjYW4gYmUgZm91bmQgdXNpbmc6DQoNCiQkDQpcaGF0e2F9X3tNTEV9PVxmcmFje259ey1cc3VtX3tpPTF9Xm5cbG4geF9pfQ0KJCQNCg0KV2UgY2FuIHVzZSB0aGVzZSBmdW5jdGlvbnMgdG8gcGVyZm9ybSBhIGh5cG90aGVzZXMgdGVzdCB1c2luZyB0aGUgbGlrZWxpaG9vZCByYXRpbyBwcm9jZWR1cmUgYXQgdGhlICRcYWxwaGE9MC4wNSQgc2lnbmlmaWNhbmNlIGxldmVsIHRvIHRlc3QgdGhlIGh5cG90aGVzZXM6DQoNCiQkDQpIXzA6IGIgPSAxICBcXCAgSF9hOiBiIFxuZSAxDQokJA0KDQpgYGB7cn0NCmxvZ2xpa19mdWxsIDwtIC1maXQkdmFsdWUgI0dldHMgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiAobWF4aW1pemVkIGxvZy1saWtlbGlob29kKQ0KbiA8LSBsZW5ndGgod2F0ZXIpDQphX2hhdF9wIDwtIC1uL3N1bShsb2cod2F0ZXIpKQ0KbG9nbGlrX3AgPC0gbipsb2coYV9oYXRfcCkrKGFfaGF0X3AtMSkqc3VtKGxvZyh3YXRlcikpICNJbXB1dGVzIGxvZ2xpa2VsaWhvb2QgZm9yIHBvd2VyIGZ1bmN0aW9uDQpMUiA8LSAtMioobG9nbGlrX3AtbG9nbGlrX2Z1bGwpICNDb21wdXRlcyB0ZXN0IHN0YXRpc3RpYw0KcF92YWx1ZSA8LSAxLXBjaGlzcShMUiwgZGY9MSkgI0NvbXB1dGVzIHAtdmFsdWUNCg0KTFINCnBfdmFsdWUNCmBgYA0KDQpHaXZlbiB0aGF0IHRoZSAkXHRleHR7cC12YWx1ZX09Mi42NTg5ODQgXHRpbWVzMTBeey0xMn0kIHdoaWNoIGlzIGxlc3MgdGhhbiAkXGFscGhhPTAuMDUkIHdlIGhhdmUgZW5vdWdoIGV2aWRlbmNlLCBhdCB0aGUgMC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzZXMgdGhhdCAkYj0xJC4gIA0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQjMqKjoNCg0KVXNlIHRoZSBwcm9jZWR1cmUgYW5kIGNvZGUgZnJvbSAqKlByb2JsZW0gQjEqKiB0byBlc3RpbWF0ZSB0aGUgTUxFcyBvZiAkYSQgYW5kICRiJCwgYW5kIHRoZW4gY29tcGxldGUgdGhlIGZvbGxvd2luZyBhbmFseXNlczoNCg0KKDEpLiBPYnRhaW4gdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mICRcaGF0e2F9JCBhbmQgJFxoYXR7Yn0kIGFuZCBwbG90IGVhY2ggZGlzdHJpYnV0aW9uIHVzaW5nICoqR2F1c3NpYW4ga2VybmVsIGRlbnNpdHkgY3VydmVzKiouDQoNCiMgQW5zd2VyIHRvIFByb2JsZW0gQjMtMToNCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpDQpCIDwtIDEwMDAgI051bWJlciBvZiBzYW1wbGVzDQpuIDwtIGxlbmd0aCh3YXRlcikNCg0KYV9ib290IDwtIG51bWVyaWMoQikgI0NyZWF0ZXMgZW1wdHkgdmVjdG9ycw0KYl9ib290IDwtIG51bWVyaWMoQikNCg0KZm9yKGIgaW4gMTpCKXsNCiAgdSA8LSBydW5pZihuKSAjR2VuZXJhdGVzIHVuaWZvcm0gcmFuZG9tIG51bWJlcnMNCiAgeF9ib290IDwtICgxLSgxLXUpXigxL2JfaGF0KSleKDEvYV9oYXQpICNJbnZlcnNlIG9mIEt1bWFyYXN3YW15IENERg0KICBmaXRfYm9vdCA8LSBvcHRpbSggI1JlLWVzdGltYXRlcyBhX2hhdCBiX2hhdCB1c2luZyBib290c3RyYXAgc2FtcGxlDQogICAgcGFyID0gYyhhX2hhdCwgYl9oYXQpLA0KICAgIGZuPWxvZ2xpaywNCiAgICB4PXhfYm9vdCwNCiAgICBtZXRob2Q9IkwtQkZHUy1CIiwNCiAgICBsb3dlcj1jKDFlLTYsIDFlLTYpDQogICkNCiAgYV9ib290W2JdIDwtIGZpdF9ib290JHBhclsxXSAjU3RvcmVzIGFfaGF0IGFuZCBiX2hhdCBlc3RpbWFydGVzDQogIGJfYm9vdFtiXSA8LSBmaXRfYm9vdCRwYXJbMl0NCn0NCg0KcGxvdChkZW5zaXR5KGFfYm9vdCksIG1haW4gPSAiQm9vdHN0cmFwIERpc3RyaWJ1dGlvbiBvZiBhX2hhdCIsIHhsYWIgPSAiYV9oYXQiLCB5bGFiPSJEZW5zaXR5IikgI1Bsb3RzIEd1YXNzaWFuIGtkZSdzDQoNCnBsb3QoZGVuc2l0eShiX2Jvb3QpLCBtYWluPSJCb290c3RyYXAgRGlzdHJpYnV0aW9uIG9mIGJfaGF0IiwgeGxhYj0iYl9oYXQiLCB5bGFiPSJEZW5zaXR5IikNCmBgYA0KDQooMikuICBDb25zdHJ1Y3QgYm90aCB0aGUgJDk1XCUkICoqYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBhbmQgdGhlICoqV2FsZCBjb25maWRlbmNlIGludGVydmFsKiogZm9yICRiJC4gRG8gdGhlc2UgaW50ZXJ2YWxzIGFncmVlIHdpdGggdGhlIHJlc3VsdHMgb2J0YWluZWQgaW4gKipQcm9ibGVtIEIyKio/IFsqQ29tcHV0ZSB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgJFxoYXR7Yn0kIHVzaW5nIHRoZSBvYnNlcnZlZCBGaXNoZXIgaW5mb3JtYXRpb24gbWF0cml4LCBpLmUuLCB0aGUgaW52ZXJzZSBvZiB0aGUgbmVnYXRpdmUgSGVzc2lhbiBvYnRhaW5lZCBmcm9tIG9wdGltKCkqXQ0KDQojIEFuc3dlciB0byBQcm9ibGVtIEIzLTI6DQoNCmBgYHtyfQ0KYm9vdF9jaSA8LSBxdWFudGlsZShiX2Jvb3QsIGMoMC4wMjUsIDAuOTc1KSkgI1VzZWQgdG8gZ2V0IGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsDQoNCnNlX2JfZmlzaGVyIDwtIHNxcnQoc29sdmUoZml0JGhlc3NpYW4pWzIsMl0pICNHZXRzIEhlc3NpYW4gYW5kIHNvbHZlcyBmb3IgY292YXJpYW5jZSBtYXRyaXggdG8gZmluZCBTRQ0KeiA8LSBxbm9ybSgwLjk3NSkgI0dldHMgei12YWx1ZSBmb3IgYWxwaGE9MC4wNSAodHdvLXRhaWxlZCkNCndhbGRfY2kgPC0gYyhiX2hhdC16KnNlX2JfZmlzaGVyLCBiX2hhdCt6KnNlX2JfZmlzaGVyKSAjRmluZHMgV2FsZCBjb25maWRlbmNlIGludGVydmFsDQoNCmJvb3RfY2kNCndhbGRfY2kNCmBgYA0KVGhlIDk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJGIkIGlzICQoNC44NjM1MjIsIDE3LjE3MzIyMykkIGFuZCB0aGUgOTUlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJGIkIGlzICQoMy40ODQwMjgsMTIuMjgyNzUwKSQuICBUaGVzZSBpbnRlcnZhbHMgYWdyZWUgd2l0aCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiBQcm9ibGVtIEIyLiAgSW4gUHJvYmxlbSBCMiBvdXIgbnVsbCBoeXBvdGhlc2lzIHdhcyB0aGF0ICRiPTEkIGFuZCB0aGlzIHRlc3Qgd2FzIHBlcmZvcm1lZCBhdCBhIDAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLiAgR2l2ZW4gdGhhdCBuZWl0aGVyIHRoZSBib290c3RyYXAgb3IgV2FsZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgY29udGFpbmVkIHRoZSB2YWx1ZSAxLCB0aGlzIHByb3ZpZGVzIGZ1cnRoZXIgZXZpZGVuY2UgdGhhdCB3ZSB3ZXJlIGNvcnJlY3QgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgaW4gUHJvYmxlbSBCMi4NCg0KKDMpLiBCYXNlZCBvbiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgZnJvbSBwYXJ0ICgxKSBvZiB0aGlzIHByb2JsZW0sIGFzc2VzcyB3aGV0aGVyIHRoZSB2YWxpZGl0eSBvZiB0aGUgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIHN1cHBvcnRlZC4NCg0KIyBBbnN3ZXIgdG8gUHJvYmxlbSBCMy0zOg0KDQpJbiBvcmRlciB0byB1c2UgdGhlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJGIkIHdlIHdhbnQgJFxoYXR7Yn0gXGFwcHJveCBOKGIsIFx0ZXh0e1Zhcn0oXGhhdHtifSkpJC4gIENvbnNpZGVyaW5nIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZvciAkYiQgZnJvbSBwYXJ0IDEsIHdlIHdvdWxkIHdhbnQgaXQgdG8gYmUgY2VudGVyZWQgYXJvdW5kIG91ciBlc3RpbWF0aW9uIG9mICRiJCwgJFxoYXR7Yn09Ny44ODMzODkkfSBhbmQgYXBwZWFyIHRvIGJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiAgV2hpbGUgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIGFwcGVhciB0byBiZSBjZW50ZXJlZCBhcm91bmQgJDcuODgzMzg5JCBpdCBhbHNvIGFwcGVhcnMgdG8gYmUgYSBzbGlnaHRseSBza2V3ZWQgZGlzdHJpYnV0aW9uLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBtYXkgbm90IGJlIHRoZSBiZXN0IGluIHRoaXMgY2FzZS4NCg0KXA0KDQojIyMgKipQcm9ibGVtIEI0Kio6DQoNCkluIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIHdvcmtpbmcgbW9kZWwgZm9yIHRoaXMgZXhhbSwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiByZWR1Y2VzIHRvIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvbiAoMCwxKS4gSW4gdGhpcyBwcm9ibGVtLCB3ZSBwZXJmb3JtIGEgKipsaWtlbGlob29kIHJhdGlvIHRlc3QqKiBmb3IgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2lzIHRvIGFzc2VzcyB3aGV0aGVyIHRoZSBkYXRhIGNvbWUgZnJvbSB0aGUgdW5pZm9ybSBkaXN0cmlidXRpb24gb24gKDAsMSk6DQoNCiQkDQpIXzA6IGEgPSAxXHF1YWQgXCYgXHF1YWQgYiA9IDFccXVhZCBcdGV4dHsgdmVyc3VzIH0gXHF1YWQgSF9hOiBhIFxuZSAxIFxxdWFkIFx0ZXh0e29yfSBccXVhZCBiIFxuZSAxIFxxdWFkIFx0ZXh0e29yfVxxdWFkIChhIFxuZSAxIFxxdWFkIFwmIFxxdWFkIGIgXG5lIDEpLg0KJCQNCg0KUHJvdmlkZSBhIHByYWN0aWNhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYWJvdmUgdGVzdCByZXN1bHQuIFsqSGludDogJEhfYSQgYmFzaWNhbGx5IHNheXMgdGhhdCB0aGVyZSBpcyBubyBjb25zdHJhaW50cyBmb3IgJGEkIGFuZCAkYiQuIFBsZWFzZSByZXZpZXcgdGhlIGxlY3R1cmUgbm90ZSBmb3IgbW9kdWxlIDExICBvbiB0aGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IGJlZm9yZSBjb2RpbmcuKl0NCg0KIyBBbnN3ZXIgdG8gUHJvYmxlbSBCNDoNCg0KSW4gb3JkZXIgdG8gcGVyZm9ybSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBhdCB0aGUgMC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIHdpbGwgc3RhcnQgYnkgZXZhbHVhdGluZyBvdXIgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiBmb3IgdGhlIEt1bWFyYXN3YW15IGF0ICRhPTEsIGI9MSQuICBBcyB3ZSBkZXRlcm1pbmVkIGFib3ZlOg0KDQokJA0KXGVsbChhLGIpPW5cbG4gKGEpK25cbG4gKGIpKyhhLTEpXHN1bV97aT0xfV5uIFxsbih4X2kpICsoYi0xKVxzdW1fe2k9MX1ebiBcbG4oMS14X2leYSkNCiQkDQoNCldlIGNhbiBwbHVnICRhPTEsIFwsIGI9MSQgdG8gZmluZCAkXGVsbCgxLCAxKSQ6DQoNCiQkDQpcZWxsKDEsMSk9blxsbiAoMSkrblxsbiAoMSkrKDEtMSlcc3VtX3tpPTF9Xm4gXGxuKHhfaSkgKygxLTEpXHN1bV97aT0xfV5uIFxsbigxLXhfaV5hKSA9MA0KJCQNCg0KV2UgY2FuIHVzZSB0aGlzIHRvIHBlcmZvcm0gb3VyIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBmb3I6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCkhfMCY6IGEgPSAxXHF1YWQgXCYgXHF1YWQgYiA9IDFccXVhZCBcXCBccXVhZCBIX2EmOiBhIFxuZSAxIFxxdWFkIFx0ZXh0e29yfSBccXVhZCBiIFxuZSAxIFxxdWFkIFx0ZXh0e29yfVxxdWFkIChhIFxuZSAxIFxxdWFkIFwmIFxxdWFkIGIgXG5lIDEpLg0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KYGBge3J9DQpsb2dsaWtfdSA8LSAwICNFbnRlcmluZyBpbiBsb2dsaWtlbGlob29kIGZvciBhPTEsIGI9MQ0KTFJfMiA8LSAtMioobG9nbGlrX3UtbG9nbGlrX2Z1bGwpICNDb21wdXRlcyB0ZXN0IHN0YXRpc3RpYw0KcF92YWx1ZTIgPC0gMS1wY2hpc3EoTFJfMixkZj0yKSAjR2V0cyBwLXZhbHVlDQoNCkxSXzINCnBfdmFsdWUyDQpgYGANCg0KR2l2ZW4gdGhhdCB0aGUgJFx0ZXh0e3AtdmFsdWV9PTIuMTUwNTU4IFx0aW1lczEwXnstMTF9JCB3aGljaCBpcyBsZXNzIHRoYW4gJFxhbHBoYT0wLjA1JCB3ZSBoYXZlIGVub3VnaCBldmlkZW5jZSwgYXQgdGhlIDAuMDUgc2lnbmlmaWNhbmNlIGxldmVsIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2VzIHRoYXQgJEhfMDphPTEgXHF1YWQgXCYgXHF1YWQgYj0xJC4gIA0KDQoNCg0K