1 Question A MLE of Weibull Parameters

The Weibull probability density function is:

\[ f(t;\lambda,\beta) = \frac{\beta}{\lambda} \left(\frac{t}{\lambda}\right)^{\beta-1} \exp\left[-\left(\frac{t}{\lambda}\right)^\beta\right] \]

For an independent sample \(t_1, \dots, t_n\), the log-likelihood function is:

\[ \ell(\lambda,\beta) = n \ln \beta - n \beta \ln \lambda + (\beta - 1)\sum_{i=1}^n \ln t_i - \sum_{i=1}^n \left(\frac{t_i}{\lambda}\right)^\beta \]

The gradient components are:

\[ \frac{\partial \ell}{\partial \lambda} = -\frac{n\beta}{\lambda} + \frac{\beta}{\lambda} \sum_{i=1}^n \left(\frac{t_i}{\lambda}\right)^\beta \]

\[ \frac{\partial \ell}{\partial \beta} = \frac{n}{\beta} - n \ln \lambda + \sum_{i=1}^n \ln t_i - \sum_{i=1}^n \left(\frac{t_i}{\lambda}\right)^\beta \ln\left(\frac{t_i}{\lambda}\right) \]

Since no closed-form solution exists, numerical optimization is used.

t <- c(12.4, 18.7, 25.3, 30.1, 33.5, 35.2, 38.9, 40.3, 42.7, 45.1,
       47.6, 49.8, 52.4, 55.0, 57.3, 60.2, 62.8, 65.1, 67.9, 70.5,
       72.3, 75.6, 78.2, 80.9, 83.4, 85.7, 88.1, 90.6, 93.2, 95.8,
       98.4, 101.0, 104.5, 107.3, 110.6, 113.2, 116.8, 120.1, 123.7,
       127.4, 130.9, 134.5, 138.2, 142.0, 146.3, 150.7, 155.2, 160.8,
       168.4, 175.9)

n <- length(t)

# Log-likelihood function (negative for minimization)
loglik_weibull <- function(par) {
  lambda <- par[1]
  beta <- par[2]
  
  if(lambda <= 0 || beta <= 0) return(Inf)
  
  val <- n*log(beta) - n*beta*log(lambda) +
         (beta - 1)*sum(log(t)) -
         sum((t/lambda)^beta)
  
  return(-val)  # negative for minimization
}

# Gradient
grad_weibull <- function(par) {
  lambda <- par[1]
  beta <- par[2]
  
  d_lambda <- (-n*beta/lambda) +
              (beta/lambda)*sum((t/lambda)^beta)
  
  d_beta <- n/beta - n*log(lambda) +
            sum(log(t)) -
            sum((t/lambda)^beta * log(t/lambda))
  
  return(-c(d_lambda, d_beta))  # negative for minimization
}

# Initial guesses
init <- c(mean(t), 1)

# Optimization
fit <- optim(init, loglik_weibull, grad_weibull, method = "BFGS", hessian = TRUE)

lambda_hat <- fit$par[1]
beta_hat <- fit$par[2]

lambda_hat
[1] 98.95336
beta_hat
[1] 2.205325

2 Question B MLE of Exponential Parameter \(\lambda\)

When \(\beta = 1\), the Weibull distribution reduces to the exponential distribution:

\[ f(t;\lambda) = \frac{1}{\lambda} \exp\left(-\frac{t}{\lambda}\right) \]

For an independent sample \(t_1, \dots, t_n\), the log-likelihood function is:

\[ \ell(\lambda) = -n \ln \lambda - \frac{1}{\lambda}\sum_{i=1}^n t_i \]

Taking the derivative with respect to \(\lambda\) and setting it equal to zero:

\[ \frac{d\ell}{d\lambda} = -\frac{n}{\lambda} + \frac{1}{\lambda^2}\sum_{i=1}^n t_i = 0 \]

Solving for \(\lambda\), we obtain:

\[ \hat{\lambda} = \bar{t} \]

# Data (reuse)
t <- c(12.4, 18.7, 25.3, 30.1, 33.5, 35.2, 38.9, 40.3, 42.7, 45.1,
       47.6, 49.8, 52.4, 55.0, 57.3, 60.2, 62.8, 65.1, 67.9, 70.5,
       72.3, 75.6, 78.2, 80.9, 83.4, 85.7, 88.1, 90.6, 93.2, 95.8,
       98.4, 101.0, 104.5, 107.3, 110.6, 113.2, 116.8, 120.1, 123.7,
       127.4, 130.9, 134.5, 138.2, 142.0, 146.3, 150.7, 155.2, 160.8,
       168.4, 175.9)

# MLE of lambda for exponential distribution
lambda_hat_exp <- mean(t)

lambda_hat_exp
[1] 87.61

3 Question C Likelihood Ratio \(\chi^2\) Test for \(H_0: \beta = 1\)

We test:

\[ H_0: \beta = 1 \quad \text{vs} \quad H_1: \beta \ne 1 \]

The likelihood ratio statistic is defined as:

\[ LR = 2\big[\ell(\hat{\lambda}, \hat{\beta}) - \ell(\hat{\lambda}_{H_0}, 1)\big] \]

where: - \(\ell(\hat{\lambda}, \hat{\beta})\) is the log-likelihood under the full Weibull model - \(\ell(\hat{\lambda}_{H_0}, 1)\) is the log-likelihood under the exponential model

By Wilks’ Theorem:

\[ LR \xrightarrow{d} \chi^2_1 \]

The p-value is computed as:

\[ p\text{-value} = P(\chi^2_1 \ge LR) \]

# Reuse results from (a) and (b)
# theta_hat values already computed:
lambda_hat_weibull <- lambda_hat
beta_hat <- beta_hat

lambda_hat_exp <- mean(t)

n <- length(t)

# Log-likelihood for Weibull (full model)
loglik_weibull_full <- function(lambda, beta) {
  n*log(beta) - n*beta*log(lambda) +
  (beta - 1)*sum(log(t)) -
  sum((t/lambda)^beta)
}

# Log-likelihood for exponential (beta = 1)
loglik_exp <- function(lambda) {
  -n*log(lambda) - sum(t)/lambda
}

# Compute log-likelihoods
l_full <- loglik_weibull_full(lambda_hat_weibull, beta_hat)
l_restricted <- loglik_exp(lambda_hat_exp)

# Likelihood ratio statistic
LR <- 2 * (l_full - l_restricted)

# p-value
p_value <- 1 - pchisq(LR, df = 1)

p_value
[1] 4.373757e-09

4 Question D Wald \(\chi^2\) Test for \(H_0: \beta = 1\)

We test:

\[ H_0: \beta = 1 \quad \text{vs} \quad H_1: \beta \ne 1 \]

The Wald test statistic is given by:

\[ W = \frac{(\hat{\beta} - 1)^2}{\text{Var}(\hat{\beta})} \]

Under \(H_0\), the statistic follows:

\[ W \xrightarrow{d} \chi^2_1 \]

The variance of \(\hat{\beta}\) is obtained from the covariance matrix:

\[ \text{Cov}(\hat{\lambda}, \hat{\beta}) = H^{-1} \]

where \(H\) is the Hessian matrix obtained from the optimization procedure.

# Extract Hessian from optimization
H <- fit$hessian

# Covariance matrix (inverse of Hessian)
cov_matrix <- solve(H)

# Variance of beta_hat (second diagonal element)
var_beta <- cov_matrix[2,2]

# Wald statistic
W <- (beta_hat - 1)^2 / var_beta

# p-value
p_value_wald <- 1 - pchisq(W, df = 1)

p_value_wald
[1] 1.54359e-06

5 Question E Summary, Model Recommendation, and Density Visualization

5.1 Comparison of Tests

Two hypothesis tests were conducted to evaluate:

\[ H_0: \beta = 1 \quad \text{vs} \quad H_1: \beta \ne 1 \]

The results are:

  • Likelihood Ratio Test p-value: \(4.37 \times 10^{-9}\)
  • Wald Test p-value: \(1.54 \times 10^{-6}\)

Both p-values are significantly smaller than 0.05, leading to rejection of \(H_0\) in both cases.

Although both tests lead to the same decision, the likelihood ratio test produces a smaller p-value, indicating stronger evidence against the null hypothesis. This is consistent with theoretical expectations, as the likelihood ratio test is based directly on the likelihood function, whereas the Wald test relies on an asymptotic normal approximation.


5.2 Model Recommendation

The null hypothesis \(H_0: \beta = 1\) corresponds to the exponential model, which assumes a constant hazard rate. Rejecting this hypothesis indicates that this assumption is not supported by the data.

Since the exponential distribution is a special case of the Weibull distribution obtained by fixing \(\beta = 1\), rejecting \(H_0\) implies that this restriction is invalid. Therefore, the more general Weibull model, which allows \(\beta \ne 1\), provides a better fit to the data.

Based on the estimated value of \(\hat{\beta}\), the failure rate is not constant over time, further supporting the use of the Weibull model.


5.3 Density Plot

To visualize the fitted distribution, we plot the Weibull density using the maximum likelihood estimates \(\hat{\lambda}\) and \(\hat{\beta}\).

# Create sequence
t_seq <- seq(min(t), max(t), length.out = 200)

# Weibull density
weibull_density <- (beta_hat / lambda_hat_weibull) *
                   (t_seq / lambda_hat_weibull)^(beta_hat - 1) *
                   exp(-(t_seq / lambda_hat_weibull)^beta_hat)

# Set proper y-limit
y_max <- max(weibull_density)

# Plot histogram with adjusted ylim
hist(t, probability = TRUE, breaks = 10,
     ylim = c(0, y_max * 1.1),   # add buffer so curve fits
     main = "Weibull Fit to Time-to-Failure Data",
     xlab = "Time")

# Add curve
lines(t_seq, weibull_density, lwd = 2)

5.4 Interpretation of the Distribution

The fitted Weibull density curve aligns with the observed data and deviates from the shape expected under an exponential distribution. Specifically, the distribution does not exhibit the constant hazard rate implied by \(\beta = 1\).

Instead, the estimated shape parameter \(\hat{\beta}\) indicates that the failure rate changes over time. This behavior is consistent with the rejection of the exponential model and supports the conclusion that the Weibull distribution provides a more appropriate model for the time-to-failure data.

LS0tDQp0aXRsZTogJ1NUQSA1MDYgSE9NRVdPUksgMTAnDQphdXRob3I6ICdHZXJhcmQgSWtlJw0KZGF0ZTogIjIwMjYtMDQtMTQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAgICAjIG91dHB1dCBkb2N1bWVudCBmb3JtYXQNCiAgICB0b2M6IHllcyAgICAgICAgICAgICAgICAgICMgYWRkIHRhYmxlIGNvbnRlbnRzDQogICAgdG9jX2Zsb2F0OiB5ZXMgICAgICAgICAgICAjIHRvY19wcm9wZXJ0eTogZmxvYXRpbmcNCiAgICB0b2NfZGVwdGg6IDQgICAgICAgICAgICAgICMgZGVwdGggb2YgVE9DIGhlYWRpbmdzDQogICAgZmlnX3dpZHRoOiA2ICAgICAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgd2lkdGgNCiAgICBmaWdfaGVpZ2h0OiA0ICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSBoZWlnaHQNCiAgICBmaWdfY2FwdGlvbjogeWVzICAgICAgICAgICMgYWRkIGZpZ3VyZSBjYXB0aW9uDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMgICAgICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAgICAjIFRPQyBzdWJoZWFkaW5nIGNsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCiMgUXVlc3Rpb24gQSBNTEUgb2YgV2VpYnVsbCBQYXJhbWV0ZXJzDQoNCg0KVGhlIFdlaWJ1bGwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBpczoNCg0KXFsNCmYodDtcbGFtYmRhLFxiZXRhKSA9IFxmcmFje1xiZXRhfXtcbGFtYmRhfSBcbGVmdChcZnJhY3t0fXtcbGFtYmRhfVxyaWdodClee1xiZXRhLTF9DQpcZXhwXGxlZnRbLVxsZWZ0KFxmcmFje3R9e1xsYW1iZGF9XHJpZ2h0KV5cYmV0YVxyaWdodF0NClxdDQoNCkZvciBhbiBpbmRlcGVuZGVudCBzYW1wbGUgXCh0XzEsIFxkb3RzLCB0X25cKSwgdGhlIGxvZy1saWtlbGlob29kIGZ1bmN0aW9uIGlzOg0KDQpcWw0KXGVsbChcbGFtYmRhLFxiZXRhKSA9DQpuIFxsbiBcYmV0YSAtIG4gXGJldGEgXGxuIFxsYW1iZGENCisgKFxiZXRhIC0gMSlcc3VtX3tpPTF9Xm4gXGxuIHRfaQ0KLSBcc3VtX3tpPTF9Xm4gXGxlZnQoXGZyYWN7dF9pfXtcbGFtYmRhfVxyaWdodCleXGJldGENClxdDQoNClRoZSBncmFkaWVudCBjb21wb25lbnRzIGFyZToNCg0KXFsNClxmcmFje1xwYXJ0aWFsIFxlbGx9e1xwYXJ0aWFsIFxsYW1iZGF9DQo9DQotXGZyYWN7blxiZXRhfXtcbGFtYmRhfQ0KKw0KXGZyYWN7XGJldGF9e1xsYW1iZGF9IFxzdW1fe2k9MX1ebiBcbGVmdChcZnJhY3t0X2l9e1xsYW1iZGF9XHJpZ2h0KV5cYmV0YQ0KXF0NCg0KXFsNClxmcmFje1xwYXJ0aWFsIFxlbGx9e1xwYXJ0aWFsIFxiZXRhfQ0KPQ0KXGZyYWN7bn17XGJldGF9DQotIG4gXGxuIFxsYW1iZGENCisgXHN1bV97aT0xfV5uIFxsbiB0X2kNCi0gXHN1bV97aT0xfV5uIFxsZWZ0KFxmcmFje3RfaX17XGxhbWJkYX1ccmlnaHQpXlxiZXRhDQpcbG5cbGVmdChcZnJhY3t0X2l9e1xsYW1iZGF9XHJpZ2h0KQ0KXF0NCg0KU2luY2Ugbm8gY2xvc2VkLWZvcm0gc29sdXRpb24gZXhpc3RzLCBudW1lcmljYWwgb3B0aW1pemF0aW9uIGlzIHVzZWQuDQoNCmBgYHtyfQ0KdCA8LSBjKDEyLjQsIDE4LjcsIDI1LjMsIDMwLjEsIDMzLjUsIDM1LjIsIDM4LjksIDQwLjMsIDQyLjcsIDQ1LjEsDQogICAgICAgNDcuNiwgNDkuOCwgNTIuNCwgNTUuMCwgNTcuMywgNjAuMiwgNjIuOCwgNjUuMSwgNjcuOSwgNzAuNSwNCiAgICAgICA3Mi4zLCA3NS42LCA3OC4yLCA4MC45LCA4My40LCA4NS43LCA4OC4xLCA5MC42LCA5My4yLCA5NS44LA0KICAgICAgIDk4LjQsIDEwMS4wLCAxMDQuNSwgMTA3LjMsIDExMC42LCAxMTMuMiwgMTE2LjgsIDEyMC4xLCAxMjMuNywNCiAgICAgICAxMjcuNCwgMTMwLjksIDEzNC41LCAxMzguMiwgMTQyLjAsIDE0Ni4zLCAxNTAuNywgMTU1LjIsIDE2MC44LA0KICAgICAgIDE2OC40LCAxNzUuOSkNCg0KbiA8LSBsZW5ndGgodCkNCg0KIyBMb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiAobmVnYXRpdmUgZm9yIG1pbmltaXphdGlvbikNCmxvZ2xpa193ZWlidWxsIDwtIGZ1bmN0aW9uKHBhcikgew0KICBsYW1iZGEgPC0gcGFyWzFdDQogIGJldGEgPC0gcGFyWzJdDQogIA0KICBpZihsYW1iZGEgPD0gMCB8fCBiZXRhIDw9IDApIHJldHVybihJbmYpDQogIA0KICB2YWwgPC0gbipsb2coYmV0YSkgLSBuKmJldGEqbG9nKGxhbWJkYSkgKw0KICAgICAgICAgKGJldGEgLSAxKSpzdW0obG9nKHQpKSAtDQogICAgICAgICBzdW0oKHQvbGFtYmRhKV5iZXRhKQ0KICANCiAgcmV0dXJuKC12YWwpICAjIG5lZ2F0aXZlIGZvciBtaW5pbWl6YXRpb24NCn0NCg0KIyBHcmFkaWVudA0KZ3JhZF93ZWlidWxsIDwtIGZ1bmN0aW9uKHBhcikgew0KICBsYW1iZGEgPC0gcGFyWzFdDQogIGJldGEgPC0gcGFyWzJdDQogIA0KICBkX2xhbWJkYSA8LSAoLW4qYmV0YS9sYW1iZGEpICsNCiAgICAgICAgICAgICAgKGJldGEvbGFtYmRhKSpzdW0oKHQvbGFtYmRhKV5iZXRhKQ0KICANCiAgZF9iZXRhIDwtIG4vYmV0YSAtIG4qbG9nKGxhbWJkYSkgKw0KICAgICAgICAgICAgc3VtKGxvZyh0KSkgLQ0KICAgICAgICAgICAgc3VtKCh0L2xhbWJkYSleYmV0YSAqIGxvZyh0L2xhbWJkYSkpDQogIA0KICByZXR1cm4oLWMoZF9sYW1iZGEsIGRfYmV0YSkpICAjIG5lZ2F0aXZlIGZvciBtaW5pbWl6YXRpb24NCn0NCg0KIyBJbml0aWFsIGd1ZXNzZXMNCmluaXQgPC0gYyhtZWFuKHQpLCAxKQ0KDQojIE9wdGltaXphdGlvbg0KZml0IDwtIG9wdGltKGluaXQsIGxvZ2xpa193ZWlidWxsLCBncmFkX3dlaWJ1bGwsIG1ldGhvZCA9ICJCRkdTIiwgaGVzc2lhbiA9IFRSVUUpDQoNCmxhbWJkYV9oYXQgPC0gZml0JHBhclsxXQ0KYmV0YV9oYXQgPC0gZml0JHBhclsyXQ0KDQpsYW1iZGFfaGF0DQpiZXRhX2hhdA0KYGBgDQoNCiMgUXVlc3Rpb24gQiBNTEUgb2YgRXhwb25lbnRpYWwgUGFyYW1ldGVyIFwoXGxhbWJkYVwpDQoNCldoZW4gXChcYmV0YSA9IDFcKSwgdGhlIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIHJlZHVjZXMgdG8gdGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbjoNCg0KXFsNCmYodDtcbGFtYmRhKSA9IFxmcmFjezF9e1xsYW1iZGF9IFxleHBcbGVmdCgtXGZyYWN7dH17XGxhbWJkYX1ccmlnaHQpDQpcXQ0KDQpGb3IgYW4gaW5kZXBlbmRlbnQgc2FtcGxlIFwodF8xLCBcZG90cywgdF9uXCksIHRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiBpczoNCg0KXFsNClxlbGwoXGxhbWJkYSkgPSAtbiBcbG4gXGxhbWJkYSAtIFxmcmFjezF9e1xsYW1iZGF9XHN1bV97aT0xfV5uIHRfaQ0KXF0NCg0KVGFraW5nIHRoZSBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byBcKFxsYW1iZGFcKSBhbmQgc2V0dGluZyBpdCBlcXVhbCB0byB6ZXJvOg0KDQpcWw0KXGZyYWN7ZFxlbGx9e2RcbGFtYmRhfQ0KPQ0KLVxmcmFje259e1xsYW1iZGF9DQorDQpcZnJhY3sxfXtcbGFtYmRhXjJ9XHN1bV97aT0xfV5uIHRfaSA9IDANClxdDQoNClNvbHZpbmcgZm9yIFwoXGxhbWJkYVwpLCB3ZSBvYnRhaW46DQoNClxbDQpcaGF0e1xsYW1iZGF9ID0gXGJhcnt0fQ0KXF0NCg0KYGBge3J9DQojIERhdGEgKHJldXNlKQ0KdCA8LSBjKDEyLjQsIDE4LjcsIDI1LjMsIDMwLjEsIDMzLjUsIDM1LjIsIDM4LjksIDQwLjMsIDQyLjcsIDQ1LjEsDQogICAgICAgNDcuNiwgNDkuOCwgNTIuNCwgNTUuMCwgNTcuMywgNjAuMiwgNjIuOCwgNjUuMSwgNjcuOSwgNzAuNSwNCiAgICAgICA3Mi4zLCA3NS42LCA3OC4yLCA4MC45LCA4My40LCA4NS43LCA4OC4xLCA5MC42LCA5My4yLCA5NS44LA0KICAgICAgIDk4LjQsIDEwMS4wLCAxMDQuNSwgMTA3LjMsIDExMC42LCAxMTMuMiwgMTE2LjgsIDEyMC4xLCAxMjMuNywNCiAgICAgICAxMjcuNCwgMTMwLjksIDEzNC41LCAxMzguMiwgMTQyLjAsIDE0Ni4zLCAxNTAuNywgMTU1LjIsIDE2MC44LA0KICAgICAgIDE2OC40LCAxNzUuOSkNCg0KIyBNTEUgb2YgbGFtYmRhIGZvciBleHBvbmVudGlhbCBkaXN0cmlidXRpb24NCmxhbWJkYV9oYXRfZXhwIDwtIG1lYW4odCkNCg0KbGFtYmRhX2hhdF9leHANCmBgYA0KDQojIFF1ZXN0aW9uIEMgTGlrZWxpaG9vZCBSYXRpbyBcKFxjaGleMlwpIFRlc3QgZm9yIFwoSF8wOiBcYmV0YSA9IDFcKQ0KDQpXZSB0ZXN0Og0KDQpcWw0KSF8wOiBcYmV0YSA9IDEgXHF1YWQgXHRleHR7dnN9IFxxdWFkIEhfMTogXGJldGEgXG5lIDENClxdDQoNClRoZSBsaWtlbGlob29kIHJhdGlvIHN0YXRpc3RpYyBpcyBkZWZpbmVkIGFzOg0KDQpcWw0KTFIgPSAyXGJpZ1tcZWxsKFxoYXR7XGxhbWJkYX0sIFxoYXR7XGJldGF9KSAtIFxlbGwoXGhhdHtcbGFtYmRhfV97SF8wfSwgMSlcYmlnXQ0KXF0NCg0Kd2hlcmU6DQotIFwoXGVsbChcaGF0e1xsYW1iZGF9LCBcaGF0e1xiZXRhfSlcKSBpcyB0aGUgbG9nLWxpa2VsaWhvb2QgdW5kZXIgdGhlIGZ1bGwgV2VpYnVsbCBtb2RlbA0KLSBcKFxlbGwoXGhhdHtcbGFtYmRhfV97SF8wfSwgMSlcKSBpcyB0aGUgbG9nLWxpa2VsaWhvb2QgdW5kZXIgdGhlIGV4cG9uZW50aWFsIG1vZGVsDQoNCkJ5IFdpbGtz4oCZIFRoZW9yZW06DQoNClxbDQpMUiBceHJpZ2h0YXJyb3d7ZH0gXGNoaV4yXzENClxdDQoNClRoZSBwLXZhbHVlIGlzIGNvbXB1dGVkIGFzOg0KDQpcWw0KcFx0ZXh0ey12YWx1ZX0gPSBQKFxjaGleMl8xIFxnZSBMUikNClxdDQoNCmBgYHtyfQ0KIyBSZXVzZSByZXN1bHRzIGZyb20gKGEpIGFuZCAoYikNCiMgdGhldGFfaGF0IHZhbHVlcyBhbHJlYWR5IGNvbXB1dGVkOg0KbGFtYmRhX2hhdF93ZWlidWxsIDwtIGxhbWJkYV9oYXQNCmJldGFfaGF0IDwtIGJldGFfaGF0DQoNCmxhbWJkYV9oYXRfZXhwIDwtIG1lYW4odCkNCg0KbiA8LSBsZW5ndGgodCkNCg0KIyBMb2ctbGlrZWxpaG9vZCBmb3IgV2VpYnVsbCAoZnVsbCBtb2RlbCkNCmxvZ2xpa193ZWlidWxsX2Z1bGwgPC0gZnVuY3Rpb24obGFtYmRhLCBiZXRhKSB7DQogIG4qbG9nKGJldGEpIC0gbipiZXRhKmxvZyhsYW1iZGEpICsNCiAgKGJldGEgLSAxKSpzdW0obG9nKHQpKSAtDQogIHN1bSgodC9sYW1iZGEpXmJldGEpDQp9DQoNCiMgTG9nLWxpa2VsaWhvb2QgZm9yIGV4cG9uZW50aWFsIChiZXRhID0gMSkNCmxvZ2xpa19leHAgPC0gZnVuY3Rpb24obGFtYmRhKSB7DQogIC1uKmxvZyhsYW1iZGEpIC0gc3VtKHQpL2xhbWJkYQ0KfQ0KDQojIENvbXB1dGUgbG9nLWxpa2VsaWhvb2RzDQpsX2Z1bGwgPC0gbG9nbGlrX3dlaWJ1bGxfZnVsbChsYW1iZGFfaGF0X3dlaWJ1bGwsIGJldGFfaGF0KQ0KbF9yZXN0cmljdGVkIDwtIGxvZ2xpa19leHAobGFtYmRhX2hhdF9leHApDQoNCiMgTGlrZWxpaG9vZCByYXRpbyBzdGF0aXN0aWMNCkxSIDwtIDIgKiAobF9mdWxsIC0gbF9yZXN0cmljdGVkKQ0KDQojIHAtdmFsdWUNCnBfdmFsdWUgPC0gMSAtIHBjaGlzcShMUiwgZGYgPSAxKQ0KDQpwX3ZhbHVlDQpgYGANCg0KIyBRdWVzdGlvbiBEIFdhbGQgXChcY2hpXjJcKSBUZXN0IGZvciBcKEhfMDogXGJldGEgPSAxXCkNCg0KDQpXZSB0ZXN0Og0KDQpcWw0KSF8wOiBcYmV0YSA9IDEgXHF1YWQgXHRleHR7dnN9IFxxdWFkIEhfMTogXGJldGEgXG5lIDENClxdDQoNClRoZSBXYWxkIHRlc3Qgc3RhdGlzdGljIGlzIGdpdmVuIGJ5Og0KDQpcWw0KVyA9IFxmcmFjeyhcaGF0e1xiZXRhfSAtIDEpXjJ9e1x0ZXh0e1Zhcn0oXGhhdHtcYmV0YX0pfQ0KXF0NCg0KVW5kZXIgXChIXzBcKSwgdGhlIHN0YXRpc3RpYyBmb2xsb3dzOg0KDQpcWw0KVyBceHJpZ2h0YXJyb3d7ZH0gXGNoaV4yXzENClxdDQoNClRoZSB2YXJpYW5jZSBvZiBcKFxoYXR7XGJldGF9XCkgaXMgb2J0YWluZWQgZnJvbSB0aGUgY292YXJpYW5jZSBtYXRyaXg6DQoNClxbDQpcdGV4dHtDb3Z9KFxoYXR7XGxhbWJkYX0sIFxoYXR7XGJldGF9KSA9IEheey0xfQ0KXF0NCg0Kd2hlcmUgXChIXCkgaXMgdGhlIEhlc3NpYW4gbWF0cml4IG9idGFpbmVkIGZyb20gdGhlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUuDQoNCmBgYHtyfQ0KIyBFeHRyYWN0IEhlc3NpYW4gZnJvbSBvcHRpbWl6YXRpb24NCkggPC0gZml0JGhlc3NpYW4NCg0KIyBDb3ZhcmlhbmNlIG1hdHJpeCAoaW52ZXJzZSBvZiBIZXNzaWFuKQ0KY292X21hdHJpeCA8LSBzb2x2ZShIKQ0KDQojIFZhcmlhbmNlIG9mIGJldGFfaGF0IChzZWNvbmQgZGlhZ29uYWwgZWxlbWVudCkNCnZhcl9iZXRhIDwtIGNvdl9tYXRyaXhbMiwyXQ0KDQojIFdhbGQgc3RhdGlzdGljDQpXIDwtIChiZXRhX2hhdCAtIDEpXjIgLyB2YXJfYmV0YQ0KDQojIHAtdmFsdWUNCnBfdmFsdWVfd2FsZCA8LSAxIC0gcGNoaXNxKFcsIGRmID0gMSkNCg0KcF92YWx1ZV93YWxkDQpgYGANCg0KDQojIFF1ZXN0aW9uIEUgU3VtbWFyeSwgTW9kZWwgUmVjb21tZW5kYXRpb24sIGFuZCBEZW5zaXR5IFZpc3VhbGl6YXRpb24NCg0KIyMgQ29tcGFyaXNvbiBvZiBUZXN0cw0KDQpUd28gaHlwb3RoZXNpcyB0ZXN0cyB3ZXJlIGNvbmR1Y3RlZCB0byBldmFsdWF0ZToNCg0KXFsNCkhfMDogXGJldGEgPSAxIFxxdWFkIFx0ZXh0e3ZzfSBccXVhZCBIXzE6IFxiZXRhIFxuZSAxDQpcXQ0KDQpUaGUgcmVzdWx0cyBhcmU6DQoNCi0gTGlrZWxpaG9vZCBSYXRpbyBUZXN0IHAtdmFsdWU6IFwoNC4zNyBcdGltZXMgMTBeey05fVwpDQotIFdhbGQgVGVzdCBwLXZhbHVlOiBcKDEuNTQgXHRpbWVzIDEwXnstNn1cKQ0KDQpCb3RoIHAtdmFsdWVzIGFyZSBzaWduaWZpY2FudGx5IHNtYWxsZXIgdGhhbiAwLjA1LCBsZWFkaW5nIHRvIHJlamVjdGlvbiBvZiBcKEhfMFwpIGluIGJvdGggY2FzZXMuDQoNCkFsdGhvdWdoIGJvdGggdGVzdHMgbGVhZCB0byB0aGUgc2FtZSBkZWNpc2lvbiwgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBwcm9kdWNlcyBhIHNtYWxsZXIgcC12YWx1ZSwgaW5kaWNhdGluZyBzdHJvbmdlciBldmlkZW5jZSBhZ2FpbnN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZW9yZXRpY2FsIGV4cGVjdGF0aW9ucywgYXMgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBpcyBiYXNlZCBkaXJlY3RseSBvbiB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbiwgd2hlcmVhcyB0aGUgV2FsZCB0ZXN0IHJlbGllcyBvbiBhbiBhc3ltcHRvdGljIG5vcm1hbCBhcHByb3hpbWF0aW9uLg0KDQotLS0NCg0KIyMgTW9kZWwgUmVjb21tZW5kYXRpb24NCg0KVGhlIG51bGwgaHlwb3RoZXNpcyBcKEhfMDogXGJldGEgPSAxXCkgY29ycmVzcG9uZHMgdG8gdGhlIGV4cG9uZW50aWFsIG1vZGVsLCB3aGljaCBhc3N1bWVzIGEgY29uc3RhbnQgaGF6YXJkIHJhdGUuIFJlamVjdGluZyB0aGlzIGh5cG90aGVzaXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBhc3N1bXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRhdGEuDQoNClNpbmNlIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIG9idGFpbmVkIGJ5IGZpeGluZyBcKFxiZXRhID0gMVwpLCByZWplY3RpbmcgXChIXzBcKSBpbXBsaWVzIHRoYXQgdGhpcyByZXN0cmljdGlvbiBpcyBpbnZhbGlkLiBUaGVyZWZvcmUsIHRoZSBtb3JlIGdlbmVyYWwgV2VpYnVsbCBtb2RlbCwgd2hpY2ggYWxsb3dzIFwoXGJldGEgXG5lIDFcKSwgcHJvdmlkZXMgYSBiZXR0ZXIgZml0IHRvIHRoZSBkYXRhLg0KDQpCYXNlZCBvbiB0aGUgZXN0aW1hdGVkIHZhbHVlIG9mIFwoXGhhdHtcYmV0YX1cKSwgdGhlIGZhaWx1cmUgcmF0ZSBpcyBub3QgY29uc3RhbnQgb3ZlciB0aW1lLCBmdXJ0aGVyIHN1cHBvcnRpbmcgdGhlIHVzZSBvZiB0aGUgV2VpYnVsbCBtb2RlbC4NCg0KLS0tDQoNCiMjIERlbnNpdHkgUGxvdA0KDQpUbyB2aXN1YWxpemUgdGhlIGZpdHRlZCBkaXN0cmlidXRpb24sIHdlIHBsb3QgdGhlIFdlaWJ1bGwgZGVuc2l0eSB1c2luZyB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlcyBcKFxoYXR7XGxhbWJkYX1cKSBhbmQgXChcaGF0e1xiZXRhfVwpLg0KDQpgYGB7ciwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Nn0NCiMgQ3JlYXRlIHNlcXVlbmNlDQp0X3NlcSA8LSBzZXEobWluKHQpLCBtYXgodCksIGxlbmd0aC5vdXQgPSAyMDApDQoNCiMgV2VpYnVsbCBkZW5zaXR5DQp3ZWlidWxsX2RlbnNpdHkgPC0gKGJldGFfaGF0IC8gbGFtYmRhX2hhdF93ZWlidWxsKSAqDQogICAgICAgICAgICAgICAgICAgKHRfc2VxIC8gbGFtYmRhX2hhdF93ZWlidWxsKV4oYmV0YV9oYXQgLSAxKSAqDQogICAgICAgICAgICAgICAgICAgZXhwKC0odF9zZXEgLyBsYW1iZGFfaGF0X3dlaWJ1bGwpXmJldGFfaGF0KQ0KDQojIFNldCBwcm9wZXIgeS1saW1pdA0KeV9tYXggPC0gbWF4KHdlaWJ1bGxfZGVuc2l0eSkNCg0KIyBQbG90IGhpc3RvZ3JhbSB3aXRoIGFkanVzdGVkIHlsaW0NCmhpc3QodCwgcHJvYmFiaWxpdHkgPSBUUlVFLCBicmVha3MgPSAxMCwNCiAgICAgeWxpbSA9IGMoMCwgeV9tYXggKiAxLjEpLCAgICMgYWRkIGJ1ZmZlciBzbyBjdXJ2ZSBmaXRzDQogICAgIG1haW4gPSAiV2VpYnVsbCBGaXQgdG8gVGltZS10by1GYWlsdXJlIERhdGEiLA0KICAgICB4bGFiID0gIlRpbWUiKQ0KDQojIEFkZCBjdXJ2ZQ0KbGluZXModF9zZXEsIHdlaWJ1bGxfZGVuc2l0eSwgbHdkID0gMikNCmBgYA0KDQojIyBJbnRlcnByZXRhdGlvbiBvZiB0aGUgRGlzdHJpYnV0aW9uDQoNClRoZSBmaXR0ZWQgV2VpYnVsbCBkZW5zaXR5IGN1cnZlIGFsaWducyB3aXRoIHRoZSBvYnNlcnZlZCBkYXRhIGFuZCBkZXZpYXRlcyBmcm9tIHRoZSBzaGFwZSBleHBlY3RlZCB1bmRlciBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24uIFNwZWNpZmljYWxseSwgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCBleGhpYml0IHRoZSBjb25zdGFudCBoYXphcmQgcmF0ZSBpbXBsaWVkIGJ5IFwoXGJldGEgPSAxXCkuDQoNCkluc3RlYWQsIHRoZSBlc3RpbWF0ZWQgc2hhcGUgcGFyYW1ldGVyIFwoXGhhdHtcYmV0YX1cKSBpbmRpY2F0ZXMgdGhhdCB0aGUgZmFpbHVyZSByYXRlIGNoYW5nZXMgb3ZlciB0aW1lLiBUaGlzIGJlaGF2aW9yIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVqZWN0aW9uIG9mIHRoZSBleHBvbmVudGlhbCBtb2RlbCBhbmQgc3VwcG9ydHMgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24gcHJvdmlkZXMgYSBtb3JlIGFwcHJvcHJpYXRlIG1vZGVsIGZvciB0aGUgdGltZS10by1mYWlsdXJlIGRhdGEu